ZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9DYWNoZUZpbGUuaCBiL2ZpbGVzL1NvdXJjZS9DYWNoZUZpbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWU1ZTc4Ci0tLSAvZGV2L251bGwKKysrIGIvZmlsZXMvU291cmNlL0NhY2hlRmlsZS5oCkBAIC0wLDAgKzEsOTIgQEAKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIE11bHRpLVBhZ2UgZnVuY3Rpb25zCisvLworLy8gRGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBieQorLy8gLSBGbG9yaXMgdmFuIGRlbiBCZXJnIChmbHZkYmVyZ0B3eHMubmwpCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRnJlZUltYWdlIDMKKy8vCisvLyBDT1ZFUkVEIENPREUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkKKy8vIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTCisvLyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy8vIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVECisvLyBDT0RFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UCisvLyBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWQorLy8gU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTAorLy8gUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUgorLy8gVEhJUyBESVNDTEFJTUVSLgorLy8KKy8vIFVzZSBhdCB5b3VyIG93biByaXNrIQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaWZuZGVmIENBQ0hFRklMRV9ICisjZGVmaW5lIENBQ0hFRklMRV9ICisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2luY2x1ZGUgIkZyZWVJbWFnZS5oIgorI2luY2x1ZGUgIlV0aWxpdGllcy5oIgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBjb25zdCBpbnQgQ0FDSEVfU0laRSA9IDMyOworc3RhdGljIGNvbnN0IGludCBCTE9DS19TSVpFID0gKDY0ICogMTAyNCkgLSA4OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZmRlZiBfV0lOMzIKKyNwcmFnbWEgcGFjayhwdXNoLCAxKQorI2Vsc2UKKyNwcmFnbWEgcGFjaygxKQorI2VuZGlmIC8vIF9XSU4zMgorCitzdHJ1Y3QgQmxvY2sgeworICAgICB1bnNpZ25lZCBucjsKKyAgICAgdW5zaWduZWQgbmV4dDsKKyAgICAgQllURSAqZGF0YTsKK307CisKKyNpZmRlZiBfV0lOMzIKKyNwcmFnbWEgcGFjayhwb3ApCisjZWxzZQorI3ByYWdtYSBwYWNrKCkKKyNlbmRpZiAvLyBfV0lOMzIKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBDYWNoZUZpbGUgeworCXR5cGVkZWYgc3RkOjpsaXN0PEJsb2NrICo+IFBhZ2VDYWNoZTsKKwl0eXBlZGVmIHN0ZDo6bGlzdDxCbG9jayAqPjo6aXRlcmF0b3IgUGFnZUNhY2hlSXQ7CisJdHlwZWRlZiBzdGQ6Om1hcDxpbnQsIFBhZ2VDYWNoZUl0PiBQYWdlTWFwOworCXR5cGVkZWYgc3RkOjptYXA8aW50LCBQYWdlQ2FjaGVJdD46Oml0ZXJhdG9yIFBhZ2VNYXBJdDsKKworcHVibGljIDoKKwlDYWNoZUZpbGUoY29uc3Qgc3RkOjpzdHJpbmcgZmlsZW5hbWUsIEJPT0wga2VlcF9pbl9tZW1vcnkpOworCX5DYWNoZUZpbGUoKTsKKworCUJPT0wgb3BlbigpOworCXZvaWQgY2xvc2UoKTsKKwlCT09MIHJlYWRGaWxlKEJZVEUgKmRhdGEsIGludCBuciwgaW50IHNpemUpOworCWludCB3cml0ZUZpbGUoQllURSAqZGF0YSwgaW50IHNpemUpOworCXZvaWQgZGVsZXRlRmlsZShpbnQgbnIpOworCitwcml2YXRlIDoKKwl2b2lkIGNsZWFudXBNZW1DYWNoZSgpOworCWludCBhbGxvY2F0ZUJsb2NrKCk7CisJQmxvY2sgKmxvY2tCbG9jayhpbnQgbnIpOworCUJPT0wgdW5sb2NrQmxvY2soaW50IG5yKTsKKwlCT09MIGRlbGV0ZUJsb2NrKGludCBucik7CisKK3ByaXZhdGUgOgorCUZJTEUgKm1fZmlsZTsKKwlzdGQ6OnN0cmluZyBtX2ZpbGVuYW1lOworCXN0ZDo6bGlzdDxpbnQ+IG1fZnJlZV9wYWdlczsKKwlQYWdlQ2FjaGUgbV9wYWdlX2NhY2hlX21lbTsKKwlQYWdlQ2FjaGUgbV9wYWdlX2NhY2hlX2Rpc2s7CisJUGFnZU1hcCBtX3BhZ2VfbWFwOworCWludCBtX3BhZ2VfY291bnQ7CisJQmxvY2sgKm1fY3VycmVudF9ibG9jazsKKwlCT09MIG1fa2VlcF9pbl9tZW1vcnk7Cit9OworCisjZW5kaWYgLy8gQ0FDSEVGSUxFX0gKZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9EZXByZWNhdGlvbk1hbmFnZXIvRGVwcmVjYXRlZC5jcHAgYi9maWxlcy9Tb3VyY2UvRGVwcmVjYXRpb25NYW5hZ2VyL0RlcHJlY2F0ZWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYTVlNzEKLS0tIC9kZXYvbnVsbAorKysgYi9maWxlcy9Tb3VyY2UvRGVwcmVjYXRpb25NYW5hZ2VyL0RlcHJlY2F0ZWQuY3BwCkBAIC0wLDAgKzEsMzYgQEAKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIERlcHJlY2F0ZWQgZnVuY3Rpb25zCisvLworLy8gRGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBieQorLy8gLSBGbG9yaXMgdmFuIGRlbiBCZXJnIChmbHZkYmVyZ0B3eHMubmwpCisvLyAtIEhlcnbpIERyb2xvbiAoZHJvbG9uQGluZm9uaWUuZnIpCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRnJlZUltYWdlIDMKKy8vCisvLyBDT1ZFUkVEIENPREUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkKKy8vIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTCisvLyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy8vIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVECisvLyBDT0RFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UCisvLyBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWQorLy8gU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTAorLy8gUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUgorLy8gVEhJUyBESVNDTEFJTUVSLgorLy8KKy8vIFVzZSBhdCB5b3VyIG93biByaXNrIQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaW5jbHVkZSAiRnJlZUltYWdlLmgiCisKKyNpbmNsdWRlICIuLi9EZXByZWNhdGlvbk1hbmFnZXIvRGVwcmVjYXRpb25NZ3IuaCIKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitGSUJJVE1BUCAqRExMX0NBTExDT05WIAorRnJlZUltYWdlX1JvdGF0ZUNsYXNzaWMoRklCSVRNQVAgKmRpYiwgZG91YmxlIGFuZ2xlKSB7CisjaWZkZWYgX1dJTjMyCisJREVQUkVDQVRFKCJGcmVlSW1hZ2VfUm90YXRlQ2xhc3NpYygpIiwgIkZyZWVJbWFnZV9Sb3RhdGUoKSIpCisjZW5kaWYgLy8gX1dJTjMyCisJcmV0dXJuIEZyZWVJbWFnZV9Sb3RhdGUoZGliLCBhbmdsZSwgTlVMTCk7Cit9CisKZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9EZXByZWNhdGlvbk1hbmFnZXIvRGVwcmVjYXRpb25NZ3IuY3BwIGIvZmlsZXMvU291cmNlL0RlcHJlY2F0aW9uTWFuYWdlci9EZXByZWNhdGlvbk1nci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY4MmRmYQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9EZXByZWNhdGlvbk1hbmFnZXIvRGVwcmVjYXRpb25NZ3IuY3BwCkBAIC0wLDAgKzEsMTAzIEBACisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBEZXByZWNhdGlvbiBNYW5hZ2VyCisvLworLy8gRGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBieQorLy8gLSBOb2VsIExsb3BpcyAoR2FtZSBQcm9ncmFtbWluZyBHZW1zIElJKQorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZyZWVJbWFnZSAzCisvLworLy8gQ09WRVJFRCBDT0RFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZCisvLyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUworLy8gVEhBVCBUSEUgQ09WRVJFRCBDT0RFIElTIEZSRUUgT0YgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisvLyBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRAorLy8gQ09ERSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVAorLy8gVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GIEFOWSBORUNFU1NBUlkKKy8vIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwKKy8vIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIKKy8vIFRISVMgRElTQ0xBSU1FUi4KKy8vCisvLyBVc2UgYXQgeW91ciBvd24gcmlzayEKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2lmZGVmIF9NU0NfVkVSIAorI3ByYWdtYSB3YXJuaW5nIChkaXNhYmxlIDogNDc4NikgLy8gaWRlbnRpZmllciB3YXMgdHJ1bmNhdGVkIHRvICdudW1iZXInIGNoYXJhY3RlcnMKKyNlbmRpZiAKKworI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbmRpZiAvLyBfV0lOMzIKKyNpbmNsdWRlICJGcmVlSW1hZ2UuaCIKKyNpbmNsdWRlICJVdGlsaXRpZXMuaCIKKyNpbmNsdWRlICJEZXByZWNhdGlvbk1nci5oIgorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0RlcHJlY2F0aW9uTWdyOjpEZXByZWNhdGlvbk1ncigpIHsKK30KKworRGVwcmVjYXRpb25NZ3I6On5EZXByZWNhdGlvbk1ncigpIHsKKyNpZmRlZiBfV0lOMzIKKwlpZiAoIW1fZnVuY3Rpb25zLmVtcHR5KCkpIHsKKwkJT3V0cHV0RGVidWdTdHJpbmcoICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iICk7CisJCU91dHB1dERlYnVnU3RyaW5nKCAiVGhpcyBpcyBhIHdhcm5pbmcsIGJlY2F1c2UgeW91IHVzZSBvbmUgb3IgbW9yZSBkZXByZWNhdGVkIGZ1bmN0aW9ucy5cbkNvbnRpbnVpbmcgdG8gdXNlIHRoZXNlIGZ1bmN0aW9ucyBtaWdodCBldmVudHVhbGx5IHJlbmRlciB5b3VyIHByb2dyYW0gdW5jb21waWxhYmxlLlxuVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIGRlcHJlY2F0ZWQ6XG5cbiIgKTsKKworCQlmb3IgKHN0ZDo6bWFwPGNvbnN0IGNoYXIgKiwgRGVwcmVjYXRlZEZ1bmN0aW9uPjo6aXRlcmF0b3IgaSA9IG1fZnVuY3Rpb25zLmJlZ2luKCk7IGkgIT0gbV9mdW5jdGlvbnMuZW5kKCk7ICsraSkgeworCQkJRGVwcmVjYXRlZEZ1bmN0aW9uICpmdW5jdGlvbiA9ICYoKCppKS5zZWNvbmQpOworCisJCQljaGFyIHR4dFsyNTVdOworCisJCQlzcHJpbnRmKHR4dCwgIiAqICVzIGNhbGxlZCBmcm9tICVpIGRpZmZlcmVudCBwbGFjZXMuIEluc3RlYWQgdXNlICVzLlxuIiwgZnVuY3Rpb24tPm9sZF9mdW5jdGlvbl9uYW1lLCAgZnVuY3Rpb24tPmNhbGxlZF9mcm9tLnNpemUoKSwgZnVuY3Rpb24tPm5ld19mdW5jdGlvbl9uYW1lKTsKKworCQkJT3V0cHV0RGVidWdTdHJpbmcodHh0KTsKKwkJfQorCisJCU91dHB1dERlYnVnU3RyaW5nKCAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIiApOworCisJCW1fZnVuY3Rpb25zLmNsZWFyKCk7CisJfQorI2VuZGlmIC8vIF9XSU4zMgorfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0RlcHJlY2F0aW9uTWdyICoKK0RlcHJlY2F0aW9uTWdyOjpHZXRJbnN0YW5jZSgpIHsKKwlzdGF0aWMgRGVwcmVjYXRpb25NZ3IgSW5zdGFuY2U7CisJcmV0dXJuICZJbnN0YW5jZTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit2b2lkCitEZXByZWNhdGlvbk1ncjo6QWRkRGVwcmVjYXRlZEZ1bmN0aW9uKGNvbnN0IGNoYXIgKm9sZF9mdW5jdGlvbl9uYW1lLCBjb25zdCBjaGFyICpuZXdfZnVuY3Rpb25fbmFtZSwgY29uc3Qgdm9pZCAqZnJhbWVfcHRyKSB7CisjaWZkZWYgX1dJTjMyCisJaW50ICpwcmV0dXJuID0gKGludCAqKWZyYW1lX3B0ciArIDE7IC8vIHVzdWFsIHJldHVybiBhZGRyZXNzIEAgW2VicCs0XQorCWludCBjYWxsZWRfZnJvbSA9IElzQmFkUmVhZFB0cihwcmV0dXJuLCA0KSA/IDAgOiAqcHJldHVybjsKKworCS8vIGNoZWNrIGlmIHRoaXMgZnVuY3Rpb24gd2FzIGFscmVhZHkgbGlzdGVkIGFzIGRlcHJlY2F0ZWQKKwkvLyBpZiBpdCB3YXNuJ3QsIG1ha2UgYSBuZXcgZW50cnkgZm9yIGl0CisJLy8gaWYgaXQgd2FzLCBrZWVwIHRyYWNrIG9mIHdoZXJlIGl0J3MgY2FsbGVkIGZyb20uCisKKwlzdGQ6Om1hcDxjb25zdCBjaGFyICosIERlcHJlY2F0ZWRGdW5jdGlvbj46Oml0ZXJhdG9yIGV4aXN0aW5nX2Z1bmN0aW9uID0gbV9mdW5jdGlvbnMuZmluZChvbGRfZnVuY3Rpb25fbmFtZSk7CisKKwlpZiAoZXhpc3RpbmdfZnVuY3Rpb24gPT0gbV9mdW5jdGlvbnMuZW5kKCkpIHsKKwkJRGVwcmVjYXRlZEZ1bmN0aW9uIGZ1bmN0aW9uOworCisJCWZ1bmN0aW9uLm9sZF9mdW5jdGlvbl9uYW1lID0gb2xkX2Z1bmN0aW9uX25hbWU7CisJCWZ1bmN0aW9uLm5ld19mdW5jdGlvbl9uYW1lID0gbmV3X2Z1bmN0aW9uX25hbWU7CisJCWZ1bmN0aW9uLmNhbGxlZF9mcm9tLmluc2VydChjYWxsZWRfZnJvbSk7CisKKwkJbV9mdW5jdGlvbnNbb2xkX2Z1bmN0aW9uX25hbWVdID0gZnVuY3Rpb247CisJfSBlbHNlIHsKKwkJLy8gc2luY2Ugd2UncmUga2VlcGluZyB0cmFjayBvZiB0aGUgYWRkcmVzc2VzIHRoaXMgZnVuY3Rpb24KKwkJLy8gd2FzIGNhbGxlZCBmcm9tIGluIGEgc2V0LCB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgd2UndmUKKwkJLy8gYWxyZWFkeSBhZGRlZCB0aGUgYWRkcmVzcy4KKworCQlEZXByZWNhdGVkRnVuY3Rpb24gKmZ1bmN0aW9uID0gJigoKmV4aXN0aW5nX2Z1bmN0aW9uKS5zZWNvbmQpOworCisJCWZ1bmN0aW9uLT5jYWxsZWRfZnJvbS5pbnNlcnQoY2FsbGVkX2Zyb20pOworCX0KKyNlbmRpZiAvLyBfV0lOMzIKK30KKworCmRpZmYgLS1naXQgYS9maWxlcy9Tb3VyY2UvRGVwcmVjYXRpb25NYW5hZ2VyL0RlcHJlY2F0aW9uTWdyLmggYi9maWxlcy9Tb3VyY2UvRGVwcmVjYXRpb25NYW5hZ2VyL0RlcHJlY2F0aW9uTWdyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE0MWYyMwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9EZXByZWNhdGlvbk1hbmFnZXIvRGVwcmVjYXRpb25NZ3IuaApAQCAtMCwwICsxLDgzIEBACisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBEZXByZWNhdGlvbiBNYW5hZ2VyCisvLworLy8gRGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBieQorLy8gLSBOb2VsIExsb3BpcyAoR2FtZSBQcm9ncmFtbWluZyBHZW1zIElJKQorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZyZWVJbWFnZSAzCisvLworLy8gQ09WRVJFRCBDT0RFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZCisvLyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUworLy8gVEhBVCBUSEUgQ09WRVJFRCBDT0RFIElTIEZSRUUgT0YgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisvLyBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRAorLy8gQ09ERSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVAorLy8gVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GIEFOWSBORUNFU1NBUlkKKy8vIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwKKy8vIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIKKy8vIFRISVMgRElTQ0xBSU1FUi4KKy8vCisvLyBVc2UgYXQgeW91ciBvd24gcmlzayEKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2lmbmRlZiBERVBSRUNBVElPTk1HUl9ICisjZGVmaW5lIERFUFJFQ0FUSU9OTUdSX0gKKworI2lmZGVmIF9NU0NfVkVSIAorI3ByYWdtYSB3YXJuaW5nKGRpc2FibGUgOiA0Nzg2ICkgIC8vIGlkZW50aWZpZXIgd2FzIHRydW5jYXRlZCB0byAnbnVtYmVyJyBjaGFyYWN0ZXJzCisjZW5kaWYgCisKKyNpbmNsdWRlICJVdGlsaXRpZXMuaCIKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaWYgIWRlZmluZWQoX01fWDY0KSAmJiBkZWZpbmVkKF9NU0NfVkVSKQorCSNkZWZpbmUgREVQUkVDQVRFKGEsYikgXAorCXsgXAorCQl2b2lkICpmcHRyOwlcCisJCV9hc20geyBtb3YgZnB0ciwgZWJwIH0JXAorCQlEZXByZWNhdGlvbk1ncjo6R2V0SW5zdGFuY2UoKS0+QWRkRGVwcmVjYXRlZEZ1bmN0aW9uKGEsIGIsIGZwdHIpOyBcCisJfQorCisjZWxpZiBkZWZpbmVkKF9faTM4Nl9fKSAmJiBkZWZpbmVkKF9fR05VQ19fKQorCSNkZWZpbmUgREVQUkVDQVRFKGEsYikgXAorCXsgXAorCQl2b2lkICpmcHRyOwlcCisJCV9fYXNtX18oIm1vdmwgJSVlYnAsICUwIiA6ICI9bSIgKGZwdHIpKTsJXAorCQlEZXByZWNhdGlvbk1ncjo6R2V0SW5zdGFuY2UoKS0+QWRkRGVwcmVjYXRlZEZ1bmN0aW9uKGEsIGIsIGZwdHIpOyBcCisJfQorCisjZWxzZQorCS8vIGRlZmF1bHQgZmFsbGJhY2sgY2FzZSwgd2hpY2ggZG9lcyBub3QgdXNlIHRoZSBlYnAgcmVnaXN0ZXIncyBjb250ZW50CisJI2RlZmluZSBERVBSRUNBVEUoYSxiKSBcCisJeyBcCisJCXZvaWQgKmZwdHIgPSBOVUxMOwlcCisJCURlcHJlY2F0aW9uTWdyOjpHZXRJbnN0YW5jZSgpLT5BZGREZXByZWNhdGVkRnVuY3Rpb24oYSwgYiwgZnB0cik7IFwKKwl9CisjZW5kaWYKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBEZXByZWNhdGlvbk1nciB7CisjaWYgKF9NU0NfVkVSID09IDExMDApIC8vIFZDIDUuMCBuZWVkIHRvIGxvb2sgaW50byB0aGUgZG9jcyBmb3IgdGhlIGNvbXBpbGVyIGZvciB0aGUgdmFsdWUgb2YgZWFjaCB2ZXJzaW9uCitwdWJsaWM6CisjZWxzZQorcHJpdmF0ZToKKyNlbmRpZgorCisJc3RydWN0IERlcHJlY2F0ZWRGdW5jdGlvbiB7CisJCWNvbnN0IGNoYXIgKm9sZF9mdW5jdGlvbl9uYW1lOworCQljb25zdCBjaGFyICpuZXdfZnVuY3Rpb25fbmFtZTsKKwkJc3RkOjpzZXQ8aW50PiBjYWxsZWRfZnJvbTsKKwl9OworCisJc3RkOjptYXA8Y29uc3QgY2hhciAqLCBEZXByZWNhdGVkRnVuY3Rpb24+IG1fZnVuY3Rpb25zOworCitwdWJsaWM6CisJRGVwcmVjYXRpb25NZ3IoKTsKKwl+RGVwcmVjYXRpb25NZ3IoKTsKKworCXN0YXRpYyBEZXByZWNhdGlvbk1nciAqIEdldEluc3RhbmNlICggdm9pZCApOworCXZvaWQgQWRkRGVwcmVjYXRlZEZ1bmN0aW9uKGNvbnN0IGNoYXIgKm9sZF9mdW5jdGlvbl9uYW1lLCBjb25zdCBjaGFyICpuZXdfZnVuY3Rpb25fbmFtZSwgY29uc3Qgdm9pZCAqZnJhbWVfcHRyKTsKK307CisKKyNlbmRpZiAvL0RFUFJFQ0FUSU9OTUdSX0gKZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UuaCBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGViNWRlCi0tLSAvZGV2L251bGwKKysrIGIvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS5oCkBAIC0wLDAgKzEsMTE1MiBAQAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRnJlZUltYWdlIDMKKy8vCisvLyBEZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIGJ5CisvLyAtIEZsb3JpcyB2YW4gZGVuIEJlcmcgKGZsdmRiZXJnQHd4cy5ubCkKKy8vIC0gSGVydsOpIERyb2xvbiAoZHJvbG9uQGluZm9uaWUuZnIpCisvLworLy8gQ29udHJpYnV0b3JzOgorLy8gLSBzZWUgY2hhbmdlcyBsb2cgbmFtZWQgJ1doYXRzbmV3LnR4dCcsIHNlZSBoZWFkZXIgb2YgZWFjaCAuaCBhbmQgLmNwcCBmaWxlCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRnJlZUltYWdlIDMKKy8vCisvLyBDT1ZFUkVEIENPREUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkKKy8vIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTCisvLyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy8vIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVECisvLyBDT0RFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UCisvLyBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWQorLy8gU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTAorLy8gUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUgorLy8gVEhJUyBESVNDTEFJTUVSLgorLy8KKy8vIFVzZSBhdCB5b3VyIG93biByaXNrIQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaWZuZGVmIEZSRUVJTUFHRV9ICisjZGVmaW5lIEZSRUVJTUFHRV9ICisKKy8vIFZlcnNpb24gaW5mb3JtYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgRlJFRUlNQUdFX01BSk9SX1ZFUlNJT04gICAzCisjZGVmaW5lIEZSRUVJTUFHRV9NSU5PUl9WRVJTSU9OICAgMTcKKyNkZWZpbmUgRlJFRUlNQUdFX1JFTEVBU0VfU0VSSUFMICAwCisKKy8vIENvbXBpbGVyIG9wdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpbmNsdWRlIDx3Y2hhci5oPgkvLyBuZWVkZWQgZm9yIFVOSUNPREUgZnVuY3Rpb25zCisKKyNpZiBkZWZpbmVkKEZSRUVJTUFHRV9MSUIpCisJI2RlZmluZSBETExfQVBJCisJI2RlZmluZSBETExfQ0FMTENPTlYKKyNlbHNlCisJI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9fV0lOMzJfXykKKwkJI2RlZmluZSBETExfQ0FMTENPTlYgX19zdGRjYWxsCisJCS8vIFRoZSBmb2xsb3dpbmcgaWZkZWYgYmxvY2sgaXMgdGhlIHN0YW5kYXJkIHdheSBvZiBjcmVhdGluZyBtYWNyb3Mgd2hpY2ggbWFrZSBleHBvcnRpbmcgCisJCS8vIGZyb20gYSBETEwgc2ltcGxlci4gQWxsIGZpbGVzIHdpdGhpbiB0aGlzIERMTCBhcmUgY29tcGlsZWQgd2l0aCB0aGUgRlJFRUlNQUdFX0VYUE9SVFMKKwkJLy8gc3ltYm9sIGRlZmluZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gdGhpcyBzeW1ib2wgc2hvdWxkIG5vdCBiZSBkZWZpbmVkIG9uIGFueSBwcm9qZWN0CisJCS8vIHRoYXQgdXNlcyB0aGlzIERMTC4gVGhpcyB3YXkgYW55IG90aGVyIHByb2plY3Qgd2hvc2Ugc291cmNlIGZpbGVzIGluY2x1ZGUgdGhpcyBmaWxlIHNlZSAKKwkJLy8gRExMX0FQSSBmdW5jdGlvbnMgYXMgYmVpbmcgaW1wb3J0ZWQgZnJvbSBhIERMTCwgd2hlcmFzIHRoaXMgRExMIHNlZXMgc3ltYm9scworCQkvLyBkZWZpbmVkIHdpdGggdGhpcyBtYWNybyBhcyBiZWluZyBleHBvcnRlZC4KKwkJI2lmZGVmIEZSRUVJTUFHRV9FWFBPUlRTCisJCQkjZGVmaW5lIERMTF9BUEkgX19kZWNsc3BlYyhkbGxleHBvcnQpCisJCSNlbHNlCisJCQkjZGVmaW5lIERMTF9BUEkgX19kZWNsc3BlYyhkbGxpbXBvcnQpCisJCSNlbmRpZiAvLyBGUkVFSU1BR0VfRVhQT1JUUworCSNlbHNlIAorCQkvLyB0cnkgdGhlIGdjYyB2aXNpYmlsaXR5IHN1cHBvcnQgKHNlZSBodHRwOi8vZ2NjLmdudS5vcmcvd2lraS9WaXNpYmlsaXR5KQorCQkjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKChfX0dOVUNfXyA+PSA0KSB8fCAoX19HTlVDX18gPT0gMyAmJiBfX0dOVUNfTUlOT1JfXyA+PSA0KSkKKwkJCSNpZm5kZWYgR0NDX0hBU0NMQVNTVklTSUJJTElUWQorCQkJCSNkZWZpbmUgR0NDX0hBU0NMQVNTVklTSUJJTElUWQorCQkJI2VuZGlmCisJCSNlbmRpZiAvLyBfX0dOVUNfXworCQkjZGVmaW5lIERMTF9DQUxMQ09OVgorCQkjaWYgZGVmaW5lZChHQ0NfSEFTQ0xBU1NWSVNJQklMSVRZKQorCQkJI2RlZmluZSBETExfQVBJIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKQorCQkjZWxzZQorCQkJI2RlZmluZSBETExfQVBJCisJCSNlbmRpZgkJCisJI2VuZGlmIC8vIFdJTjMyIC8gIVdJTjMyCisjZW5kaWYgLy8gRlJFRUlNQUdFX0xJQgorCisvLyBFbmRpYW5uZXNzOgorLy8gU29tZSB2ZXJzaW9ucyBvZiBnY2MgbWF5IGhhdmUgQllURV9PUkRFUiBvciBfX0JZVEVfT1JERVIgZGVmaW5lZC4KKy8vIElmIHlvdXIgYmlnIGVuZGlhbiBzeXN0ZW0gaXNuJ3QgYmVpbmcgZGV0ZWN0ZWQsIGFkZCBhbiBPUyBzcGVjaWZpYyBjaGVjaworLy8gb3IgZGVmaW5lIGFueSBvZiBGUkVFSU1BR0VfQklHRU5ESUFOIGFuZCBGUkVFSU1BR0VfTElUVExFRU5ESUFOIGRpcmVjdGx5CisvLyB0byBzcGVjaWZ5IHRoZSBkZXNpcmVkIGVuZGlhbm5lc3MuCisjaWYgKCFkZWZpbmVkKEZSRUVJTUFHRV9CSUdFTkRJQU4pICYmICFkZWZpbmVkKEZSRUVJTUFHRV9MSVRUTEVFTkRJQU4pKQorCSNpZiAoZGVmaW5lZChCWVRFX09SREVSKSAmJiBCWVRFX09SREVSPT1CSUdfRU5ESUFOKSB8fCAoZGVmaW5lZChfX0JZVEVfT1JERVIpICYmIF9fQllURV9PUkRFUj09X19CSUdfRU5ESUFOKSB8fCBkZWZpbmVkKF9fQklHX0VORElBTl9fKQorCQkjZGVmaW5lIEZSRUVJTUFHRV9CSUdFTkRJQU4KKwkjZW5kaWYgLy8gQllURV9PUkRFUgorI2VuZGlmIC8vICFGUkVFSU1BR0VfW0JJR3xMSVRUTEVdRU5ESUFOCisKKy8vIENvbG9yLU9yZGVyOgorLy8gVGhlIHNwZWNpZmllZCBvcmRlciBvZiBjb2xvciBjb21wb25lbnRzIHJlZCwgZ3JlZW4gYW5kIGJsdWUgYWZmZWN0cyAyNC0KKy8vIGFuZCAzMi1iaXQgaW1hZ2VzIG9mIHR5cGUgRklUX0JJVE1BUCBhcyB3ZWxsIGFzIHRoZSBjb2xvcnMgdGhhdCBhcmUgcGFydAorLy8gb2YgYSBjb2xvciBwYWxldHRlLiBBbGwgb3RoZXIgaW1hZ2VzIGFsd2F5cyB1c2UgUkdCIG9yZGVyLiBCeSBkZWZhdWx0LAorLy8gY29sb3Igb3JkZXIgaXMgY291cGxlZCB0byBlbmRpYW5uZXNzOgorLy8gbGl0dGxlLWVuZGlhbiAtPiBCR1IKKy8vIGJpZy1lbmRpYW4gICAgLT4gUkdCCisvLyBIb3dldmVyLCB5b3UgY2FuIGFsd2F5cyBkZWZpbmUgRlJFRUlNQUdFX0NPTE9ST1JERVIgdG8gYW55IG9mIHRoZSBrbm93bgorLy8gb3JkZXJzIEZSRUVJTUFHRV9DT0xPUk9SREVSX0JHUiAoMCkgYW5kIEZSRUVJTUFHRV9DT0xPUk9SREVSX1JHQiAoMSkgdG8KKy8vIHNwZWNpZnkgeW91ciBwcmVmZXJyZWQgY29sb3Igb3JkZXIuCisjZGVmaW5lIEZSRUVJTUFHRV9DT0xPUk9SREVSX0JHUiAgICAwCisjZGVmaW5lIEZSRUVJTUFHRV9DT0xPUk9SREVSX1JHQiAgICAxCisjaWYgKCFkZWZpbmVkKEZSRUVJTUFHRV9DT0xPUk9SREVSKSkgfHwgKChGUkVFSU1BR0VfQ09MT1JPUkRFUiAhPSBGUkVFSU1BR0VfQ09MT1JPUkRFUl9CR1IpICYmIChGUkVFSU1BR0VfQ09MT1JPUkRFUiAhPSBGUkVFSU1BR0VfQ09MT1JPUkRFUl9SR0IpKQorCSNpZiBkZWZpbmVkKEZSRUVJTUFHRV9CSUdFTkRJQU4pCisJCSNkZWZpbmUgRlJFRUlNQUdFX0NPTE9ST1JERVIgRlJFRUlNQUdFX0NPTE9ST1JERVJfUkdCCisJI2Vsc2UKKwkJI2RlZmluZSBGUkVFSU1BR0VfQ09MT1JPUkRFUiBGUkVFSU1BR0VfQ09MT1JPUkRFUl9CR1IKKwkjZW5kaWYgLy8gRlJFRUlNQUdFX0JJR0VORElBTgorI2VuZGlmIC8vIEZSRUVJTUFHRV9DT0xPUk9SREVSCisKKy8vIEVuc3VyZSA0LWJ5dGUgZW51bXMgaWYgd2UncmUgdXNpbmcgQm9ybGFuZCBDKysgY29tcGlsZXJzCisjaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pCisjcHJhZ21hIG9wdGlvbiBwdXNoIC1iCisjZW5kaWYKKworLy8gRm9yIEMgY29tcGF0aWJpbGl0eSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgX19jcGx1c3BsdXMKKyNkZWZpbmUgRklfREVGQVVMVCh4KQk9IHgKKyNkZWZpbmUgRklfRU5VTSh4KSAgICAgIGVudW0geAorI2RlZmluZSBGSV9TVFJVQ1QoeCkJc3RydWN0IHgKKyNlbHNlCisjZGVmaW5lIEZJX0RFRkFVTFQoeCkKKyNkZWZpbmUgRklfRU5VTSh4KSAgICAgIHR5cGVkZWYgaW50IHg7IGVudW0geAorI2RlZmluZSBGSV9TVFJVQ1QoeCkJdHlwZWRlZiBzdHJ1Y3QgeCB4OyBzdHJ1Y3QgeAorI2VuZGlmCisKKy8vIEJpdG1hcCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0ZJX1NUUlVDVCAoRklCSVRNQVApIHsgdm9pZCAqZGF0YTsgfTsKK0ZJX1NUUlVDVCAoRklNVUxUSUJJVE1BUCkgeyB2b2lkICpkYXRhOyB9OworCisvLyBUeXBlcyB1c2VkIGluIHRoZSBsaWJyYXJ5IChkaXJlY3RseSBjb3BpZWQgZnJvbSBXaW5kb3dzKSAtLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgZGVmaW5lZChfX01JTkdXMzJfXykgJiYgZGVmaW5lZChfV0lORE9XU19IKQorI2RlZmluZSBfV0lORE9XU18JLy8gcHJldmVudCBhIGJ1ZyBpbiBNaW5HVzMyCisjZW5kaWYgLy8gX19NSU5HVzMyX18KKworI2lmbmRlZiBfV0lORE9XU18KKyNkZWZpbmUgX1dJTkRPV1NfCisKKyNpZm5kZWYgRkFMU0UKKyNkZWZpbmUgRkFMU0UgMAorI2VuZGlmCisjaWZuZGVmIFRSVUUKKyNkZWZpbmUgVFJVRSAxCisjZW5kaWYKKyNpZm5kZWYgTlVMTAorI2RlZmluZSBOVUxMIDAKKyNlbmRpZgorCisjaWZuZGVmIFNFRUtfU0VUCisjZGVmaW5lIFNFRUtfU0VUICAwCisjZGVmaW5lIFNFRUtfQ1VSICAxCisjZGVmaW5lIFNFRUtfRU5EICAyCisjZW5kaWYKKworI2lmbmRlZiBfTVNDX1ZFUgorLy8gZGVmaW5lIHBvcnRhYmxlIHR5cGVzIGZvciAzMi1iaXQgLyA2NC1iaXQgT1MKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgordHlwZWRlZiBpbnQzMl90IEJPT0w7Cit0eXBlZGVmIHVpbnQ4X3QgQllURTsKK3R5cGVkZWYgdWludDE2X3QgV09SRDsKK3R5cGVkZWYgdWludDMyX3QgRFdPUkQ7Cit0eXBlZGVmIGludDMyX3QgTE9ORzsKK3R5cGVkZWYgaW50NjRfdCBJTlQ2NDsKK3R5cGVkZWYgdWludDY0X3QgVUlOVDY0OworI2Vsc2UKKy8vIE1TIGlzIG5vdCBDOTkgSVNPIGNvbXBsaWFudAordHlwZWRlZiBsb25nIEJPT0w7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgQllURTsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgV09SRDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBEV09SRDsKK3R5cGVkZWYgbG9uZyBMT05HOwordHlwZWRlZiBzaWduZWQgX19pbnQ2NCBJTlQ2NDsKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCBVSU5UNjQ7CisjZW5kaWYgLy8gX01TQ19WRVIKKworI2lmIChkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfX1dJTjMyX18pKQorI3ByYWdtYSBwYWNrKHB1c2gsIDEpCisjZWxzZQorI3ByYWdtYSBwYWNrKDEpCisjZW5kaWYgLy8gV0lOMzIKKwordHlwZWRlZiBzdHJ1Y3QgdGFnUkdCUVVBRCB7CisjaWYgRlJFRUlNQUdFX0NPTE9ST1JERVIgPT0gRlJFRUlNQUdFX0NPTE9ST1JERVJfQkdSCisgIEJZVEUgcmdiQmx1ZTsKKyAgQllURSByZ2JHcmVlbjsKKyAgQllURSByZ2JSZWQ7CisjZWxzZQorICBCWVRFIHJnYlJlZDsKKyAgQllURSByZ2JHcmVlbjsKKyAgQllURSByZ2JCbHVlOworI2VuZGlmIC8vIEZSRUVJTUFHRV9DT0xPUk9SREVSCisgIEJZVEUgcmdiUmVzZXJ2ZWQ7Cit9IFJHQlFVQUQ7CisKK3R5cGVkZWYgc3RydWN0IHRhZ1JHQlRSSVBMRSB7CisjaWYgRlJFRUlNQUdFX0NPTE9ST1JERVIgPT0gRlJFRUlNQUdFX0NPTE9ST1JERVJfQkdSCisgIEJZVEUgcmdidEJsdWU7CisgIEJZVEUgcmdidEdyZWVuOworICBCWVRFIHJnYnRSZWQ7CisjZWxzZQorICBCWVRFIHJnYnRSZWQ7CisgIEJZVEUgcmdidEdyZWVuOworICBCWVRFIHJnYnRCbHVlOworI2VuZGlmIC8vIEZSRUVJTUFHRV9DT0xPUk9SREVSCit9IFJHQlRSSVBMRTsKKworI2lmIChkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfX1dJTjMyX18pKQorI3ByYWdtYSBwYWNrKHBvcCkKKyNlbHNlCisjcHJhZ21hIHBhY2soKQorI2VuZGlmIC8vIFdJTjMyCisKK3R5cGVkZWYgc3RydWN0IHRhZ0JJVE1BUElORk9IRUFERVJ7CisgIERXT1JEIGJpU2l6ZTsKKyAgTE9ORyAgYmlXaWR0aDsgCisgIExPTkcgIGJpSGVpZ2h0OyAKKyAgV09SRCAgYmlQbGFuZXM7IAorICBXT1JEICBiaUJpdENvdW50OworICBEV09SRCBiaUNvbXByZXNzaW9uOyAKKyAgRFdPUkQgYmlTaXplSW1hZ2U7IAorICBMT05HICBiaVhQZWxzUGVyTWV0ZXI7IAorICBMT05HICBiaVlQZWxzUGVyTWV0ZXI7IAorICBEV09SRCBiaUNsclVzZWQ7IAorICBEV09SRCBiaUNsckltcG9ydGFudDsKK30gQklUTUFQSU5GT0hFQURFUiwgKlBCSVRNQVBJTkZPSEVBREVSOyAKKwordHlwZWRlZiBzdHJ1Y3QgdGFnQklUTUFQSU5GTyB7IAorICBCSVRNQVBJTkZPSEVBREVSIGJtaUhlYWRlcjsgCisgIFJHQlFVQUQgICAgICAgICAgYm1pQ29sb3JzWzFdOworfSBCSVRNQVBJTkZPLCAqUEJJVE1BUElORk87CisKKyNlbmRpZiAvLyBfV0lORE9XU18KKworLy8gVHlwZXMgdXNlZCBpbiB0aGUgbGlicmFyeSAoc3BlY2lmaWMgdG8gRnJlZUltYWdlKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmIChkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfX1dJTjMyX18pKQorI3ByYWdtYSBwYWNrKHB1c2gsIDEpCisjZWxzZQorI3ByYWdtYSBwYWNrKDEpCisjZW5kaWYgLy8gV0lOMzIKKworLyoqIDQ4LWJpdCBSR0IgCisqLwordHlwZWRlZiBzdHJ1Y3QgdGFnRklSR0IxNiB7CisJV09SRCByZWQ7CisJV09SRCBncmVlbjsKKwlXT1JEIGJsdWU7Cit9IEZJUkdCMTY7CisKKy8qKiA2NC1iaXQgUkdCQQorKi8KK3R5cGVkZWYgc3RydWN0IHRhZ0ZJUkdCQTE2IHsKKwlXT1JEIHJlZDsKKwlXT1JEIGdyZWVuOworCVdPUkQgYmx1ZTsKKwlXT1JEIGFscGhhOworfSBGSVJHQkExNjsKKworLyoqIDk2LWJpdCBSR0IgRmxvYXQKKyovCit0eXBlZGVmIHN0cnVjdCB0YWdGSVJHQkYgeworCWZsb2F0IHJlZDsKKwlmbG9hdCBncmVlbjsKKwlmbG9hdCBibHVlOworfSBGSVJHQkY7CisKKy8qKiAxMjgtYml0IFJHQkEgRmxvYXQKKyovCit0eXBlZGVmIHN0cnVjdCB0YWdGSVJHQkFGIHsKKwlmbG9hdCByZWQ7CisJZmxvYXQgZ3JlZW47CisJZmxvYXQgYmx1ZTsKKwlmbG9hdCBhbHBoYTsKK30gRklSR0JBRjsKKworLyoqIERhdGEgc3RydWN0dXJlIGZvciBDT01QTEVYIHR5cGUgKGNvbXBsZXggbnVtYmVyKQorKi8KK3R5cGVkZWYgc3RydWN0IHRhZ0ZJQ09NUExFWCB7CisgICAgLy8vIHJlYWwgcGFydAorCWRvdWJsZSByOworCS8vLyBpbWFnaW5hcnkgcGFydAorICAgIGRvdWJsZSBpOworfSBGSUNPTVBMRVg7CisKKyNpZiAoZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX19XSU4zMl9fKSkKKyNwcmFnbWEgcGFjayhwb3ApCisjZWxzZQorI3ByYWdtYSBwYWNrKCkKKyNlbmRpZiAvLyBXSU4zMgorCisvLyBJbmRleGVzIGZvciBieXRlIGFycmF5cywgbWFza3MgYW5kIHNoaWZ0cyBmb3IgdHJlYXRpbmcgcGl4ZWxzIGFzIHdvcmRzIC0tLQorLy8gVGhlc2UgY29pbmNpZGUgd2l0aCB0aGUgb3JkZXIgb2YgUkdCUVVBRCBhbmQgUkdCVFJJUExFIC0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmbmRlZiBGUkVFSU1BR0VfQklHRU5ESUFOCisjaWYgRlJFRUlNQUdFX0NPTE9ST1JERVIgPT0gRlJFRUlNQUdFX0NPTE9ST1JERVJfQkdSCisvLyBMaXR0bGUgRW5kaWFuICh4ODYgLyBNUyBXaW5kb3dzLCBMaW51eCkgOiBCR1IoQSkgb3JkZXIKKyNkZWZpbmUgRklfUkdCQV9SRUQJCQkJMgorI2RlZmluZSBGSV9SR0JBX0dSRUVOCQkJMQorI2RlZmluZSBGSV9SR0JBX0JMVUUJCQkwCisjZGVmaW5lIEZJX1JHQkFfQUxQSEEJCQkzCisjZGVmaW5lIEZJX1JHQkFfUkVEX01BU0sJCTB4MDBGRjAwMDAKKyNkZWZpbmUgRklfUkdCQV9HUkVFTl9NQVNLCQkweDAwMDBGRjAwCisjZGVmaW5lIEZJX1JHQkFfQkxVRV9NQVNLCQkweDAwMDAwMEZGCisjZGVmaW5lIEZJX1JHQkFfQUxQSEFfTUFTSwkJMHhGRjAwMDAwMAorI2RlZmluZSBGSV9SR0JBX1JFRF9TSElGVAkJMTYKKyNkZWZpbmUgRklfUkdCQV9HUkVFTl9TSElGVAkJOAorI2RlZmluZSBGSV9SR0JBX0JMVUVfU0hJRlQJCTAKKyNkZWZpbmUgRklfUkdCQV9BTFBIQV9TSElGVAkJMjQKKyNlbHNlCisvLyBMaXR0bGUgRW5kaWFuICh4ODYgLyBNYXhPU1gpIDogUkdCKEEpIG9yZGVyCisjZGVmaW5lIEZJX1JHQkFfUkVECQkJCTAKKyNkZWZpbmUgRklfUkdCQV9HUkVFTgkJCTEKKyNkZWZpbmUgRklfUkdCQV9CTFVFCQkJMgorI2RlZmluZSBGSV9SR0JBX0FMUEhBCQkJMworI2RlZmluZSBGSV9SR0JBX1JFRF9NQVNLCQkweDAwMDAwMEZGCisjZGVmaW5lIEZJX1JHQkFfR1JFRU5fTUFTSwkJMHgwMDAwRkYwMAorI2RlZmluZSBGSV9SR0JBX0JMVUVfTUFTSwkJMHgwMEZGMDAwMAorI2RlZmluZSBGSV9SR0JBX0FMUEhBX01BU0sJCTB4RkYwMDAwMDAKKyNkZWZpbmUgRklfUkdCQV9SRURfU0hJRlQJCTAKKyNkZWZpbmUgRklfUkdCQV9HUkVFTl9TSElGVAkJOAorI2RlZmluZSBGSV9SR0JBX0JMVUVfU0hJRlQJCTE2CisjZGVmaW5lIEZJX1JHQkFfQUxQSEFfU0hJRlQJCTI0CisjZW5kaWYgLy8gRlJFRUlNQUdFX0NPTE9ST1JERVIKKyNlbHNlCisjaWYgRlJFRUlNQUdFX0NPTE9ST1JERVIgPT0gRlJFRUlNQUdFX0NPTE9ST1JERVJfQkdSCisvLyBCaWcgRW5kaWFuIChQUEMgLyBub25lKSA6IEJHUihBKSBvcmRlcgorI2RlZmluZSBGSV9SR0JBX1JFRAkJCQkyCisjZGVmaW5lIEZJX1JHQkFfR1JFRU4JCQkxCisjZGVmaW5lIEZJX1JHQkFfQkxVRQkJCTAKKyNkZWZpbmUgRklfUkdCQV9BTFBIQQkJCTMKKyNkZWZpbmUgRklfUkdCQV9SRURfTUFTSwkJMHgwMDAwRkYwMAorI2RlZmluZSBGSV9SR0JBX0dSRUVOX01BU0sJCTB4MDBGRjAwMDAKKyNkZWZpbmUgRklfUkdCQV9CTFVFX01BU0sJCTB4RkYwMDAwMDAKKyNkZWZpbmUgRklfUkdCQV9BTFBIQV9NQVNLCQkweDAwMDAwMEZGCisjZGVmaW5lIEZJX1JHQkFfUkVEX1NISUZUCQk4CisjZGVmaW5lIEZJX1JHQkFfR1JFRU5fU0hJRlQJCTE2CisjZGVmaW5lIEZJX1JHQkFfQkxVRV9TSElGVAkJMjQKKyNkZWZpbmUgRklfUkdCQV9BTFBIQV9TSElGVAkJMAorI2Vsc2UKKy8vIEJpZyBFbmRpYW4gKFBQQyAvIExpbnV4LCBNYXhPU1gpIDogUkdCKEEpIG9yZGVyCisjZGVmaW5lIEZJX1JHQkFfUkVECQkJCTAKKyNkZWZpbmUgRklfUkdCQV9HUkVFTgkJCTEKKyNkZWZpbmUgRklfUkdCQV9CTFVFCQkJMgorI2RlZmluZSBGSV9SR0JBX0FMUEhBCQkJMworI2RlZmluZSBGSV9SR0JBX1JFRF9NQVNLCQkweEZGMDAwMDAwCisjZGVmaW5lIEZJX1JHQkFfR1JFRU5fTUFTSwkJMHgwMEZGMDAwMAorI2RlZmluZSBGSV9SR0JBX0JMVUVfTUFTSwkJMHgwMDAwRkYwMAorI2RlZmluZSBGSV9SR0JBX0FMUEhBX01BU0sJCTB4MDAwMDAwRkYKKyNkZWZpbmUgRklfUkdCQV9SRURfU0hJRlQJCTI0CisjZGVmaW5lIEZJX1JHQkFfR1JFRU5fU0hJRlQJCTE2CisjZGVmaW5lIEZJX1JHQkFfQkxVRV9TSElGVAkJOAorI2RlZmluZSBGSV9SR0JBX0FMUEhBX1NISUZUCQkwCisjZW5kaWYgLy8gRlJFRUlNQUdFX0NPTE9ST1JERVIKKyNlbmRpZiAvLyBGUkVFSU1BR0VfQklHRU5ESUFOCisKKyNkZWZpbmUgRklfUkdCQV9SR0JfTUFTSwkJKEZJX1JHQkFfUkVEX01BU0t8RklfUkdCQV9HUkVFTl9NQVNLfEZJX1JHQkFfQkxVRV9NQVNLKQorCisvLyBUaGUgMTZiaXQgbWFjcm9zIG9ubHkgaW5jbHVkZSBtYXNrcyBhbmQgc2hpZnRzLCBzaW5jZSBlYWNoIGNvbG9yIGVsZW1lbnQgaXMgbm90IGJ5dGUgYWxpZ25lZAorCisjZGVmaW5lIEZJMTZfNTU1X1JFRF9NQVNLCQkweDdDMDAKKyNkZWZpbmUgRkkxNl81NTVfR1JFRU5fTUFTSwkJMHgwM0UwCisjZGVmaW5lIEZJMTZfNTU1X0JMVUVfTUFTSwkJMHgwMDFGCisjZGVmaW5lIEZJMTZfNTU1X1JFRF9TSElGVAkJMTAKKyNkZWZpbmUgRkkxNl81NTVfR1JFRU5fU0hJRlQJNQorI2RlZmluZSBGSTE2XzU1NV9CTFVFX1NISUZUCQkwCisjZGVmaW5lIEZJMTZfNTY1X1JFRF9NQVNLCQkweEY4MDAKKyNkZWZpbmUgRkkxNl81NjVfR1JFRU5fTUFTSwkJMHgwN0UwCisjZGVmaW5lIEZJMTZfNTY1X0JMVUVfTUFTSwkJMHgwMDFGCisjZGVmaW5lIEZJMTZfNTY1X1JFRF9TSElGVAkJMTEKKyNkZWZpbmUgRkkxNl81NjVfR1JFRU5fU0hJRlQJNQorI2RlZmluZSBGSTE2XzU2NV9CTFVFX1NISUZUCQkwCisKKy8vIElDQyBwcm9maWxlIHN1cHBvcnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgRklJQ0NfREVGQVVMVAkJCTB4MDAKKyNkZWZpbmUgRklJQ0NfQ09MT1JfSVNfQ01ZSwkJMHgwMQorCitGSV9TVFJVQ1QgKEZJSUNDUFJPRklMRSkgeyAKKwlXT1JEICAgIGZsYWdzOwkvLyEgaW5mbyBmbGFnCisJRFdPUkQJc2l6ZTsJLy8hIHByb2ZpbGUncyBzaXplIG1lYXN1cmVkIGluIGJ5dGVzCisJdm9pZCAgICpkYXRhOwkvLyEgcG9pbnRzIHRvIGEgYmxvY2sgb2YgY29udGlndW91cyBtZW1vcnkgY29udGFpbmluZyB0aGUgcHJvZmlsZQorfTsKKworLy8gSW1wb3J0YW50IGVudW1zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoqIEkvTyBpbWFnZSBmb3JtYXQgaWRlbnRpZmllcnMuCisqLworRklfRU5VTShGUkVFX0lNQUdFX0ZPUk1BVCkgeworCUZJRl9VTktOT1dOID0gLTEsCisJRklGX0JNUAkJPSAwLAorCUZJRl9JQ08JCT0gMSwKKwlGSUZfSlBFRwk9IDIsCisJRklGX0pORwkJPSAzLAorCUZJRl9LT0FMQQk9IDQsCisJRklGX0xCTQkJPSA1LAorCUZJRl9JRkYgPSBGSUZfTEJNLAorCUZJRl9NTkcJCT0gNiwKKwlGSUZfUEJNCQk9IDcsCisJRklGX1BCTVJBVwk9IDgsCisJRklGX1BDRAkJPSA5LAorCUZJRl9QQ1gJCT0gMTAsCisJRklGX1BHTQkJPSAxMSwKKwlGSUZfUEdNUkFXCT0gMTIsCisJRklGX1BORwkJPSAxMywKKwlGSUZfUFBNCQk9IDE0LAorCUZJRl9QUE1SQVcJPSAxNSwKKwlGSUZfUkFTCQk9IDE2LAorCUZJRl9UQVJHQQk9IDE3LAorCUZJRl9USUZGCT0gMTgsCisJRklGX1dCTVAJPSAxOSwKKwlGSUZfUFNECQk9IDIwLAorCUZJRl9DVVQJCT0gMjEsCisJRklGX1hCTQkJPSAyMiwKKwlGSUZfWFBNCQk9IDIzLAorCUZJRl9ERFMJCT0gMjQsCisJRklGX0dJRiAgICAgPSAyNSwKKwlGSUZfSERSCQk9IDI2LAorCUZJRl9GQVhHMwk9IDI3LAorCUZJRl9TR0kJCT0gMjgsCisJRklGX0VYUgkJPSAyOSwKKwlGSUZfSjJLCQk9IDMwLAorCUZJRl9KUDIJCT0gMzEsCisJRklGX1BGTQkJPSAzMiwKKwlGSUZfUElDVAk9IDMzLAorCUZJRl9SQVcJCT0gMzQsCisJRklGX1dFQlAJPSAzNSwKK307CisKKy8qKiBJbWFnZSB0eXBlIHVzZWQgaW4gRnJlZUltYWdlLgorKi8KK0ZJX0VOVU0oRlJFRV9JTUFHRV9UWVBFKSB7CisJRklUX1VOS05PV04gPSAwLAkvLyEgdW5rbm93biB0eXBlCisJRklUX0JJVE1BUCAgPSAxLAkvLyEgc3RhbmRhcmQgaW1hZ2UJCQk6IDEtLCA0LSwgOC0sIDE2LSwgMjQtLCAzMi1iaXQKKwlGSVRfVUlOVDE2CT0gMiwJLy8hIGFycmF5IG9mIHVuc2lnbmVkIHNob3J0CTogdW5zaWduZWQgMTYtYml0CisJRklUX0lOVDE2CT0gMywJLy8hIGFycmF5IG9mIHNob3J0CQkJOiBzaWduZWQgMTYtYml0CisJRklUX1VJTlQzMgk9IDQsCS8vISBhcnJheSBvZiB1bnNpZ25lZCBsb25nCTogdW5zaWduZWQgMzItYml0CisJRklUX0lOVDMyCT0gNSwJLy8hIGFycmF5IG9mIGxvbmcJCQk6IHNpZ25lZCAzMi1iaXQKKwlGSVRfRkxPQVQJPSA2LAkvLyEgYXJyYXkgb2YgZmxvYXQJCQk6IDMyLWJpdCBJRUVFIGZsb2F0aW5nIHBvaW50CisJRklUX0RPVUJMRQk9IDcsCS8vISBhcnJheSBvZiBkb3VibGUJCQk6IDY0LWJpdCBJRUVFIGZsb2F0aW5nIHBvaW50CisJRklUX0NPTVBMRVgJPSA4LAkvLyEgYXJyYXkgb2YgRklDT01QTEVYCQk6IDIgeCA2NC1iaXQgSUVFRSBmbG9hdGluZyBwb2ludAorCUZJVF9SR0IxNgk9IDksCS8vISA0OC1iaXQgUkdCIGltYWdlCQkJOiAzIHggMTYtYml0CisJRklUX1JHQkExNgk9IDEwLAkvLyEgNjQtYml0IFJHQkEgaW1hZ2UJCTogNCB4IDE2LWJpdAorCUZJVF9SR0JGCT0gMTEsCS8vISA5Ni1iaXQgUkdCIGZsb2F0IGltYWdlCTogMyB4IDMyLWJpdCBJRUVFIGZsb2F0aW5nIHBvaW50CisJRklUX1JHQkFGCT0gMTIJLy8hIDEyOC1iaXQgUkdCQSBmbG9hdCBpbWFnZQk6IDQgeCAzMi1iaXQgSUVFRSBmbG9hdGluZyBwb2ludAorfTsKKworLyoqIEltYWdlIGNvbG9yIHR5cGUgdXNlZCBpbiBGcmVlSW1hZ2UuCisqLworRklfRU5VTShGUkVFX0lNQUdFX0NPTE9SX1RZUEUpIHsKKwlGSUNfTUlOSVNXSElURSA9IDAsCQkvLyEgbWluIHZhbHVlIGlzIHdoaXRlCisgICAgRklDX01JTklTQkxBQ0sgPSAxLAkJLy8hIG1pbiB2YWx1ZSBpcyBibGFjaworICAgIEZJQ19SR0IgICAgICAgID0gMiwJCS8vISBSR0IgY29sb3IgbW9kZWwKKyAgICBGSUNfUEFMRVRURSAgICA9IDMsCQkvLyEgY29sb3IgbWFwIGluZGV4ZWQKKwlGSUNfUkdCQUxQSEEgICA9IDQsCQkvLyEgUkdCIGNvbG9yIG1vZGVsIHdpdGggYWxwaGEgY2hhbm5lbAorCUZJQ19DTVlLICAgICAgID0gNQkJLy8hIENNWUsgY29sb3IgbW9kZWwKK307CisKKy8qKiBDb2xvciBxdWFudGl6YXRpb24gYWxnb3JpdGhtcy4KK0NvbnN0YW50cyB1c2VkIGluIEZyZWVJbWFnZV9Db2xvclF1YW50aXplLgorKi8KK0ZJX0VOVU0oRlJFRV9JTUFHRV9RVUFOVElaRSkgeworICAgIEZJUV9XVVFVQU5UID0gMCwJCS8vISBYaWFvbGluIFd1IGNvbG9yIHF1YW50aXphdGlvbiBhbGdvcml0aG0KKyAgICBGSVFfTk5RVUFOVCA9IDEsCQkvLyEgTmV1UXVhbnQgbmV1cmFsLW5ldCBxdWFudGl6YXRpb24gYWxnb3JpdGhtIGJ5IEFudGhvbnkgRGVra2VyCisJRklRX0xGUFFVQU5UID0gMgkJLy8hIExvc3NsZXNzIEZhc3QgUHNldWRvLVF1YW50aXphdGlvbiBBbGdvcml0aG0gYnkgQ2Fyc3RlbiBLbGVpbgorfTsKKworLyoqIERpdGhlcmluZyBhbGdvcml0aG1zLgorQ29uc3RhbnRzIHVzZWQgaW4gRnJlZUltYWdlX0RpdGhlci4KKyovCitGSV9FTlVNKEZSRUVfSU1BR0VfRElUSEVSKSB7CisgICAgRklEX0ZTCQkJPSAwLAkvLyEgRmxveWQgJiBTdGVpbmJlcmcgZXJyb3IgZGlmZnVzaW9uCisJRklEX0JBWUVSNHg0CT0gMSwJLy8hIEJheWVyIG9yZGVyZWQgZGlzcGVyc2VkIGRvdCBkaXRoZXJpbmcgKG9yZGVyIDIgZGl0aGVyaW5nIG1hdHJpeCkKKwlGSURfQkFZRVI4eDgJPSAyLAkvLyEgQmF5ZXIgb3JkZXJlZCBkaXNwZXJzZWQgZG90IGRpdGhlcmluZyAob3JkZXIgMyBkaXRoZXJpbmcgbWF0cml4KQorCUZJRF9DTFVTVEVSNng2CT0gMywJLy8hIE9yZGVyZWQgY2x1c3RlcmVkIGRvdCBkaXRoZXJpbmcgKG9yZGVyIDMgLSA2eDYgbWF0cml4KQorCUZJRF9DTFVTVEVSOHg4CT0gNCwJLy8hIE9yZGVyZWQgY2x1c3RlcmVkIGRvdCBkaXRoZXJpbmcgKG9yZGVyIDQgLSA4eDggbWF0cml4KQorCUZJRF9DTFVTVEVSMTZ4MTY9IDUsCS8vISBPcmRlcmVkIGNsdXN0ZXJlZCBkb3QgZGl0aGVyaW5nIChvcmRlciA4IC0gMTZ4MTYgbWF0cml4KQorCUZJRF9CQVlFUjE2eDE2CT0gNgkJLy8hIEJheWVyIG9yZGVyZWQgZGlzcGVyc2VkIGRvdCBkaXRoZXJpbmcgKG9yZGVyIDQgZGl0aGVyaW5nIG1hdHJpeCkKK307CisKKy8qKiBMb3NzbGVzcyBKUEVHIHRyYW5zZm9ybWF0aW9ucworQ29uc3RhbnRzIHVzZWQgaW4gRnJlZUltYWdlX0pQRUdUcmFuc2Zvcm0KKyovCitGSV9FTlVNKEZSRUVfSU1BR0VfSlBFR19PUEVSQVRJT04pIHsKKwlGSUpQRUdfT1BfTk9ORQkJCT0gMCwJLy8hIG5vIHRyYW5zZm9ybWF0aW9uCisJRklKUEVHX09QX0ZMSVBfSAkJPSAxLAkvLyEgaG9yaXpvbnRhbCBmbGlwCisJRklKUEVHX09QX0ZMSVBfVgkJPSAyLAkvLyEgdmVydGljYWwgZmxpcAorCUZJSlBFR19PUF9UUkFOU1BPU0UJCT0gMywJLy8hIHRyYW5zcG9zZSBhY3Jvc3MgVUwtdG8tTFIgYXhpcworCUZJSlBFR19PUF9UUkFOU1ZFUlNFCT0gNCwJLy8hIHRyYW5zcG9zZSBhY3Jvc3MgVVItdG8tTEwgYXhpcworCUZJSlBFR19PUF9ST1RBVEVfOTAJCT0gNSwJLy8hIDkwLWRlZ3JlZSBjbG9ja3dpc2Ugcm90YXRpb24KKwlGSUpQRUdfT1BfUk9UQVRFXzE4MAk9IDYsCS8vISAxODAtZGVncmVlIHJvdGF0aW9uCisJRklKUEVHX09QX1JPVEFURV8yNzAJPSA3CQkvLyEgMjcwLWRlZ3JlZSBjbG9ja3dpc2UgKG9yIDkwIGNjdykKK307CisKKy8qKiBUb25lIG1hcHBpbmcgb3BlcmF0b3JzLgorQ29uc3RhbnRzIHVzZWQgaW4gRnJlZUltYWdlX1RvbmVNYXBwaW5nLgorKi8KK0ZJX0VOVU0oRlJFRV9JTUFHRV9UTU8pIHsKKyAgICBGSVRNT19EUkFHTzAzCSA9IDAsCS8vISBBZGFwdGl2ZSBsb2dhcml0aG1pYyBtYXBwaW5nIChGLiBEcmFnbywgMjAwMykKKwlGSVRNT19SRUlOSEFSRDA1ID0gMSwJLy8hIER5bmFtaWMgcmFuZ2UgcmVkdWN0aW9uIGluc3BpcmVkIGJ5IHBob3RvcmVjZXB0b3IgcGh5c2lvbG9neSAoRS4gUmVpbmhhcmQsIDIwMDUpCisJRklUTU9fRkFUVEFMMDIJID0gMgkvLyEgR3JhZGllbnQgZG9tYWluIGhpZ2ggZHluYW1pYyByYW5nZSBjb21wcmVzc2lvbiAoUi4gRmF0dGFsLCAyMDAyKQorfTsKKworLyoqIFVwc2FtcGxpbmcgLyBkb3duc2FtcGxpbmcgZmlsdGVycy4gCitDb25zdGFudHMgdXNlZCBpbiBGcmVlSW1hZ2VfUmVzY2FsZS4KKyovCitGSV9FTlVNKEZSRUVfSU1BR0VfRklMVEVSKSB7CisJRklMVEVSX0JPWAkJICA9IDAsCS8vISBCb3gsIHB1bHNlLCBGb3VyaWVyIHdpbmRvdywgMXN0IG9yZGVyIChjb25zdGFudCkgYi1zcGxpbmUKKwlGSUxURVJfQklDVUJJQwkgID0gMSwJLy8hIE1pdGNoZWxsICYgTmV0cmF2YWxpJ3MgdHdvLXBhcmFtIGN1YmljIGZpbHRlcgorCUZJTFRFUl9CSUxJTkVBUiAgID0gMiwJLy8hIEJpbGluZWFyIGZpbHRlcgorCUZJTFRFUl9CU1BMSU5FCSAgPSAzLAkvLyEgNHRoIG9yZGVyIChjdWJpYykgYi1zcGxpbmUKKwlGSUxURVJfQ0FUTVVMTFJPTSA9IDQsCS8vISBDYXRtdWxsLVJvbSBzcGxpbmUsIE92ZXJoYXVzZXIgc3BsaW5lCisJRklMVEVSX0xBTkNaT1MzCSAgPSA1CS8vISBMYW5jem9zMyBmaWx0ZXIKK307CisKKy8qKiBDb2xvciBjaGFubmVscy4KK0NvbnN0YW50cyB1c2VkIGluIGNvbG9yIG1hbmlwdWxhdGlvbiByb3V0aW5lcy4KKyovCitGSV9FTlVNKEZSRUVfSU1BR0VfQ09MT1JfQ0hBTk5FTCkgeworCUZJQ0NfUkdCCT0gMCwJLy8hIFVzZSByZWQsIGdyZWVuIGFuZCBibHVlIGNoYW5uZWxzCisJRklDQ19SRUQJPSAxLAkvLyEgVXNlIHJlZCBjaGFubmVsCisJRklDQ19HUkVFTgk9IDIsCS8vISBVc2UgZ3JlZW4gY2hhbm5lbAorCUZJQ0NfQkxVRQk9IDMsCS8vISBVc2UgYmx1ZSBjaGFubmVsCisJRklDQ19BTFBIQQk9IDQsCS8vISBVc2UgYWxwaGEgY2hhbm5lbAorCUZJQ0NfQkxBQ0sJPSA1LAkvLyEgVXNlIGJsYWNrIGNoYW5uZWwKKwlGSUNDX1JFQUwJPSA2LAkvLyEgQ29tcGxleCBpbWFnZXM6IHVzZSByZWFsIHBhcnQKKwlGSUNDX0lNQUcJPSA3LAkvLyEgQ29tcGxleCBpbWFnZXM6IHVzZSBpbWFnaW5hcnkgcGFydAorCUZJQ0NfTUFHCT0gOCwJLy8hIENvbXBsZXggaW1hZ2VzOiB1c2UgbWFnbml0dWRlCisJRklDQ19QSEFTRQk9IDkJCS8vISBDb21wbGV4IGltYWdlczogdXNlIHBoYXNlCit9OworCisvLyBNZXRhZGF0YSBzdXBwb3J0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKioKKyAgVGFnIGRhdGEgdHlwZSBpbmZvcm1hdGlvbiAoYmFzZWQgb24gVElGRiBzcGVjaWZpY2F0aW9ucykKKworICBOb3RlOiBSQVRJT05BTHMgYXJlIHRoZSByYXRpbyBvZiB0d28gMzItYml0IGludGVnZXIgdmFsdWVzLgorKi8KK0ZJX0VOVU0oRlJFRV9JTUFHRV9NRFRZUEUpIHsKKwlGSURUX05PVFlQRQkJPSAwLAkvLyEgcGxhY2Vob2xkZXIgCisJRklEVF9CWVRFCQk9IDEsCS8vISA4LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIAorCUZJRFRfQVNDSUkJCT0gMiwJLy8hIDgtYml0IGJ5dGVzIHcvIGxhc3QgYnl0ZSBudWxsIAorCUZJRFRfU0hPUlQJCT0gMywJLy8hIDE2LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIAorCUZJRFRfTE9ORwkJPSA0LAkvLyEgMzItYml0IHVuc2lnbmVkIGludGVnZXIgCisJRklEVF9SQVRJT05BTAk9IDUsCS8vISA2NC1iaXQgdW5zaWduZWQgZnJhY3Rpb24gCisJRklEVF9TQllURQkJPSA2LAkvLyEgOC1iaXQgc2lnbmVkIGludGVnZXIgCisJRklEVF9VTkRFRklORUQJPSA3LAkvLyEgOC1iaXQgdW50eXBlZCBkYXRhIAorCUZJRFRfU1NIT1JUCQk9IDgsCS8vISAxNi1iaXQgc2lnbmVkIGludGVnZXIgCisJRklEVF9TTE9ORwkJPSA5LAkvLyEgMzItYml0IHNpZ25lZCBpbnRlZ2VyIAorCUZJRFRfU1JBVElPTkFMCT0gMTAsCS8vISA2NC1iaXQgc2lnbmVkIGZyYWN0aW9uIAorCUZJRFRfRkxPQVQJCT0gMTEsCS8vISAzMi1iaXQgSUVFRSBmbG9hdGluZyBwb2ludCAKKwlGSURUX0RPVUJMRQkJPSAxMiwJLy8hIDY0LWJpdCBJRUVFIGZsb2F0aW5nIHBvaW50IAorCUZJRFRfSUZECQk9IDEzLAkvLyEgMzItYml0IHVuc2lnbmVkIGludGVnZXIgKG9mZnNldCkgCisJRklEVF9QQUxFVFRFCT0gMTQsCS8vISAzMi1iaXQgUkdCUVVBRCAKKwlGSURUX0xPTkc4CQk9IDE2LAkvLyEgNjQtYml0IHVuc2lnbmVkIGludGVnZXIgCisJRklEVF9TTE9ORzgJCT0gMTcsCS8vISA2NC1iaXQgc2lnbmVkIGludGVnZXIKKwlGSURUX0lGRDgJCT0gMTgJLy8hIDY0LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIChvZmZzZXQpCit9OworCisvKioKKyAgTWV0YWRhdGEgbW9kZWxzIHN1cHBvcnRlZCBieSBGcmVlSW1hZ2UKKyovCitGSV9FTlVNKEZSRUVfSU1BR0VfTURNT0RFTCkgeworCUZJTURfTk9EQVRBCQkJPSAtMSwKKwlGSU1EX0NPTU1FTlRTCQk9IDAsCS8vISBzaW5nbGUgY29tbWVudCBvciBrZXl3b3JkcworCUZJTURfRVhJRl9NQUlOCQk9IDEsCS8vISBFeGlmLVRJRkYgbWV0YWRhdGEKKwlGSU1EX0VYSUZfRVhJRgkJPSAyLAkvLyEgRXhpZi1zcGVjaWZpYyBtZXRhZGF0YQorCUZJTURfRVhJRl9HUFMJCT0gMywJLy8hIEV4aWYgR1BTIG1ldGFkYXRhCisJRklNRF9FWElGX01BS0VSTk9URSA9IDQsCS8vISBFeGlmIG1ha2VyIG5vdGUgbWV0YWRhdGEKKwlGSU1EX0VYSUZfSU5URVJPUAk9IDUsCS8vISBFeGlmIGludGVyb3BlcmFiaWxpdHkgbWV0YWRhdGEKKwlGSU1EX0lQVEMJCQk9IDYsCS8vISBJUFRDL05BQSBtZXRhZGF0YQorCUZJTURfWE1QCQkJPSA3LAkvLyEgQWJvYmUgWE1QIG1ldGFkYXRhCisJRklNRF9HRU9USUZGCQk9IDgsCS8vISBHZW9USUZGIG1ldGFkYXRhCisJRklNRF9BTklNQVRJT04JCT0gOSwJLy8hIEFuaW1hdGlvbiBtZXRhZGF0YQorCUZJTURfQ1VTVE9NCQkJPSAxMCwJLy8hIFVzZWQgdG8gYXR0YWNoIG90aGVyIG1ldGFkYXRhIHR5cGVzIHRvIGEgZGliCisJRklNRF9FWElGX1JBVwkJPSAxMQkvLyEgRXhpZiBtZXRhZGF0YSBhcyBhIHJhdyBidWZmZXIKK307CisKKy8qKgorICBIYW5kbGUgdG8gYSBtZXRhZGF0YSBtb2RlbAorKi8KK0ZJX1NUUlVDVCAoRklNRVRBREFUQSkgeyB2b2lkICpkYXRhOyB9OworCisvKioKKyAgSGFuZGxlIHRvIGEgRnJlZUltYWdlIHRhZworKi8KK0ZJX1NUUlVDVCAoRklUQUcpIHsgdm9pZCAqZGF0YTsgfTsKKworLy8gRmlsZSBJTyByb3V0aW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmbmRlZiBGUkVFSU1BR0VfSU8KKyNkZWZpbmUgRlJFRUlNQUdFX0lPCisKK3R5cGVkZWYgdm9pZCogZmlfaGFuZGxlOwordHlwZWRlZiB1bnNpZ25lZCAoRExMX0NBTExDT05WICpGSV9SZWFkUHJvYykgKHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgc2l6ZSwgdW5zaWduZWQgY291bnQsIGZpX2hhbmRsZSBoYW5kbGUpOwordHlwZWRlZiB1bnNpZ25lZCAoRExMX0NBTExDT05WICpGSV9Xcml0ZVByb2MpICh2b2lkICpidWZmZXIsIHVuc2lnbmVkIHNpemUsIHVuc2lnbmVkIGNvdW50LCBmaV9oYW5kbGUgaGFuZGxlKTsKK3R5cGVkZWYgaW50IChETExfQ0FMTENPTlYgKkZJX1NlZWtQcm9jKSAoZmlfaGFuZGxlIGhhbmRsZSwgbG9uZyBvZmZzZXQsIGludCBvcmlnaW4pOwordHlwZWRlZiBsb25nIChETExfQ0FMTENPTlYgKkZJX1RlbGxQcm9jKSAoZmlfaGFuZGxlIGhhbmRsZSk7CisKKyNpZiAoZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX19XSU4zMl9fKSkKKyNwcmFnbWEgcGFjayhwdXNoLCAxKQorI2Vsc2UKKyNwcmFnbWEgcGFjaygxKQorI2VuZGlmIC8vIFdJTjMyCisKK0ZJX1NUUlVDVChGcmVlSW1hZ2VJTykgeworCUZJX1JlYWRQcm9jICByZWFkX3Byb2M7ICAgICAvLyEgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdXNlZCB0byByZWFkIGRhdGEKKyAgICBGSV9Xcml0ZVByb2Mgd3JpdGVfcHJvYzsgICAgLy8hIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHVzZWQgdG8gd3JpdGUgZGF0YQorICAgIEZJX1NlZWtQcm9jICBzZWVrX3Byb2M7ICAgICAvLyEgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdXNlZCB0byBzZWVrCisgICAgRklfVGVsbFByb2MgIHRlbGxfcHJvYzsgICAgIC8vISBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB1c2VkIHRvIGFxdWlyZSB0aGUgY3VycmVudCBwb3NpdGlvbgorfTsKKworI2lmIChkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfX1dJTjMyX18pKQorI3ByYWdtYSBwYWNrKHBvcCkKKyNlbHNlCisjcHJhZ21hIHBhY2soKQorI2VuZGlmIC8vIFdJTjMyCisKKy8qKgorSGFuZGxlIHRvIGEgbWVtb3J5IEkvTyBzdHJlYW0KKyovCitGSV9TVFJVQ1QgKEZJTUVNT1JZKSB7IHZvaWQgKmRhdGE7IH07CisKKyNlbmRpZiAvLyBGUkVFSU1BR0VfSU8KKworLy8gUGx1Z2luIHJvdXRpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmbmRlZiBQTFVHSU5TCisjZGVmaW5lIFBMVUdJTlMKKwordHlwZWRlZiBjb25zdCBjaGFyICooRExMX0NBTExDT05WICpGSV9Gb3JtYXRQcm9jKSh2b2lkKTsKK3R5cGVkZWYgY29uc3QgY2hhciAqKERMTF9DQUxMQ09OViAqRklfRGVzY3JpcHRpb25Qcm9jKSh2b2lkKTsKK3R5cGVkZWYgY29uc3QgY2hhciAqKERMTF9DQUxMQ09OViAqRklfRXh0ZW5zaW9uTGlzdFByb2MpKHZvaWQpOwordHlwZWRlZiBjb25zdCBjaGFyICooRExMX0NBTExDT05WICpGSV9SZWdFeHByUHJvYykodm9pZCk7Cit0eXBlZGVmIHZvaWQgKihETExfQ0FMTENPTlYgKkZJX09wZW5Qcm9jKShGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIEJPT0wgcmVhZCk7Cit0eXBlZGVmIHZvaWQgKERMTF9DQUxMQ09OViAqRklfQ2xvc2VQcm9jKShGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIHZvaWQgKmRhdGEpOwordHlwZWRlZiBpbnQgKERMTF9DQUxMQ09OViAqRklfUGFnZUNvdW50UHJvYykoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCB2b2lkICpkYXRhKTsKK3R5cGVkZWYgaW50IChETExfQ0FMTENPTlYgKkZJX1BhZ2VDYXBhYmlsaXR5UHJvYykoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCB2b2lkICpkYXRhKTsKK3R5cGVkZWYgRklCSVRNQVAgKihETExfQ0FMTENPTlYgKkZJX0xvYWRQcm9jKShGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIGludCBwYWdlLCBpbnQgZmxhZ3MsIHZvaWQgKmRhdGEpOwordHlwZWRlZiBCT09MIChETExfQ0FMTENPTlYgKkZJX1NhdmVQcm9jKShGcmVlSW1hZ2VJTyAqaW8sIEZJQklUTUFQICpkaWIsIGZpX2hhbmRsZSBoYW5kbGUsIGludCBwYWdlLCBpbnQgZmxhZ3MsIHZvaWQgKmRhdGEpOwordHlwZWRlZiBCT09MIChETExfQ0FMTENPTlYgKkZJX1ZhbGlkYXRlUHJvYykoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlKTsKK3R5cGVkZWYgY29uc3QgY2hhciAqKERMTF9DQUxMQ09OViAqRklfTWltZVByb2MpKHZvaWQpOwordHlwZWRlZiBCT09MIChETExfQ0FMTENPTlYgKkZJX1N1cHBvcnRzRXhwb3J0QlBQUHJvYykoaW50IGJwcCk7Cit0eXBlZGVmIEJPT0wgKERMTF9DQUxMQ09OViAqRklfU3VwcG9ydHNFeHBvcnRUeXBlUHJvYykoRlJFRV9JTUFHRV9UWVBFIHR5cGUpOwordHlwZWRlZiBCT09MIChETExfQ0FMTENPTlYgKkZJX1N1cHBvcnRzSUNDUHJvZmlsZXNQcm9jKSh2b2lkKTsKK3R5cGVkZWYgQk9PTCAoRExMX0NBTExDT05WICpGSV9TdXBwb3J0c05vUGl4ZWxzUHJvYykodm9pZCk7CisKK0ZJX1NUUlVDVCAoUGx1Z2luKSB7CisJRklfRm9ybWF0UHJvYyBmb3JtYXRfcHJvYzsKKwlGSV9EZXNjcmlwdGlvblByb2MgZGVzY3JpcHRpb25fcHJvYzsKKwlGSV9FeHRlbnNpb25MaXN0UHJvYyBleHRlbnNpb25fcHJvYzsKKwlGSV9SZWdFeHByUHJvYyByZWdleHByX3Byb2M7CisJRklfT3BlblByb2Mgb3Blbl9wcm9jOworCUZJX0Nsb3NlUHJvYyBjbG9zZV9wcm9jOworCUZJX1BhZ2VDb3VudFByb2MgcGFnZWNvdW50X3Byb2M7CisJRklfUGFnZUNhcGFiaWxpdHlQcm9jIHBhZ2VjYXBhYmlsaXR5X3Byb2M7CisJRklfTG9hZFByb2MgbG9hZF9wcm9jOworCUZJX1NhdmVQcm9jIHNhdmVfcHJvYzsKKwlGSV9WYWxpZGF0ZVByb2MgdmFsaWRhdGVfcHJvYzsKKwlGSV9NaW1lUHJvYyBtaW1lX3Byb2M7CisJRklfU3VwcG9ydHNFeHBvcnRCUFBQcm9jIHN1cHBvcnRzX2V4cG9ydF9icHBfcHJvYzsKKwlGSV9TdXBwb3J0c0V4cG9ydFR5cGVQcm9jIHN1cHBvcnRzX2V4cG9ydF90eXBlX3Byb2M7CisJRklfU3VwcG9ydHNJQ0NQcm9maWxlc1Byb2Mgc3VwcG9ydHNfaWNjX3Byb2ZpbGVzX3Byb2M7CisJRklfU3VwcG9ydHNOb1BpeGVsc1Byb2Mgc3VwcG9ydHNfbm9fcGl4ZWxzX3Byb2M7Cit9OworCit0eXBlZGVmIHZvaWQgKERMTF9DQUxMQ09OViAqRklfSW5pdFByb2MpKFBsdWdpbiAqcGx1Z2luLCBpbnQgZm9ybWF0X2lkKTsKKworI2VuZGlmIC8vIFBMVUdJTlMKKworCisvLyBMb2FkIC8gU2F2ZSBmbGFnIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIEZJRl9MT0FEX05PUElYRUxTIDB4ODAwMAkvLyEgbG9hZGluZzogbG9hZCB0aGUgaW1hZ2UgaGVhZGVyIG9ubHkgKG5vdCBzdXBwb3J0ZWQgYnkgYWxsIHBsdWdpbnMsIGRlZmF1bHQgdG8gZnVsbCBsb2FkaW5nKQorCisjZGVmaW5lIEJNUF9ERUZBVUxUICAgICAgICAgMAorI2RlZmluZSBCTVBfU0FWRV9STEUgICAgICAgIDEKKyNkZWZpbmUgQ1VUX0RFRkFVTFQgICAgICAgICAwCisjZGVmaW5lIEREU19ERUZBVUxUCQkJMAorI2RlZmluZSBFWFJfREVGQVVMVAkJCTAJCS8vISBzYXZlIGRhdGEgYXMgaGFsZiB3aXRoIHBpei1iYXNlZCB3YXZlbGV0IGNvbXByZXNzaW9uCisjZGVmaW5lIEVYUl9GTE9BVAkJCTB4MDAwMQkvLyEgc2F2ZSBkYXRhIGFzIGZsb2F0IGluc3RlYWQgb2YgYXMgaGFsZiAobm90IHJlY29tbWVuZGVkKQorI2RlZmluZSBFWFJfTk9ORQkJCTB4MDAwMgkvLyEgc2F2ZSB3aXRoIG5vIGNvbXByZXNzaW9uCisjZGVmaW5lIEVYUl9aSVAJCQkJMHgwMDA0CS8vISBzYXZlIHdpdGggemxpYiBjb21wcmVzc2lvbiwgaW4gYmxvY2tzIG9mIDE2IHNjYW4gbGluZXMKKyNkZWZpbmUgRVhSX1BJWgkJCQkweDAwMDgJLy8hIHNhdmUgd2l0aCBwaXotYmFzZWQgd2F2ZWxldCBjb21wcmVzc2lvbgorI2RlZmluZSBFWFJfUFhSMjQJCQkweDAwMTAJLy8hIHNhdmUgd2l0aCBsb3NzeSAyNC1iaXQgZmxvYXQgY29tcHJlc3Npb24KKyNkZWZpbmUgRVhSX0I0NAkJCQkweDAwMjAJLy8hIHNhdmUgd2l0aCBsb3NzeSA0NCUgZmxvYXQgY29tcHJlc3Npb24gLSBnb2VzIHRvIDIyJSB3aGVuIGNvbWJpbmVkIHdpdGggRVhSX0xDCisjZGVmaW5lIEVYUl9MQwkJCQkweDAwNDAJLy8hIHNhdmUgaW1hZ2VzIHdpdGggb25lIGx1bWluYW5jZSBhbmQgdHdvIGNocm9tYSBjaGFubmVscywgcmF0aGVyIHRoYW4gYXMgUkdCIChsb3NzeSBjb21wcmVzc2lvbikKKyNkZWZpbmUgRkFYRzNfREVGQVVMVAkJMAorI2RlZmluZSBHSUZfREVGQVVMVAkJCTAKKyNkZWZpbmUgR0lGX0xPQUQyNTYJCQkxCQkvLyEgbG9hZCB0aGUgaW1hZ2UgYXMgYSAyNTYgY29sb3IgaW1hZ2Ugd2l0aCB1bnVuc2VkIHBhbGV0dGUgZW50cmllcywgaWYgaXQncyAxNiBvciAyIGNvbG9yCisjZGVmaW5lIEdJRl9QTEFZQkFDSwkJMgkJLy8hICdQbGF5JyB0aGUgR0lGIHRvIGdlbmVyYXRlIGVhY2ggZnJhbWUgKGFzIDMyYnBwKSBpbnN0ZWFkIG9mIHJldHVybmluZyByYXcgZnJhbWUgZGF0YSB3aGVuIGxvYWRpbmcKKyNkZWZpbmUgSERSX0RFRkFVTFQJCQkwCisjZGVmaW5lIElDT19ERUZBVUxUICAgICAgICAgMAorI2RlZmluZSBJQ09fTUFLRUFMUEhBCQkxCQkvLyEgY29udmVydCB0byAzMmJwcCBhbmQgY3JlYXRlIGFuIGFscGhhIGNoYW5uZWwgZnJvbSB0aGUgQU5ELW1hc2sgd2hlbiBsb2FkaW5nCisjZGVmaW5lIElGRl9ERUZBVUxUICAgICAgICAgMAorI2RlZmluZSBKMktfREVGQVVMVAkJCTAJCS8vISBzYXZlIHdpdGggYSAxNjoxIHJhdGUKKyNkZWZpbmUgSlAyX0RFRkFVTFQJCQkwCQkvLyEgc2F2ZSB3aXRoIGEgMTY6MSByYXRlCisjZGVmaW5lIEpQRUdfREVGQVVMVCAgICAgICAgMAkJLy8hIGxvYWRpbmcgKHNlZSBKUEVHX0ZBU1QpOyBzYXZpbmcgKHNlZSBKUEVHX1FVQUxJVFlHT09EfEpQRUdfU1VCU0FNUExJTkdfNDIwKQorI2RlZmluZSBKUEVHX0ZBU1QgICAgICAgICAgIDB4MDAwMQkvLyEgbG9hZCB0aGUgZmlsZSBhcyBmYXN0IGFzIHBvc3NpYmxlLCBzYWNyaWZpY2luZyBzb21lIHF1YWxpdHkKKyNkZWZpbmUgSlBFR19BQ0NVUkFURSAgICAgICAweDAwMDIJLy8hIGxvYWQgdGhlIGZpbGUgd2l0aCB0aGUgYmVzdCBxdWFsaXR5LCBzYWNyaWZpY2luZyBzb21lIHNwZWVkCisjZGVmaW5lIEpQRUdfQ01ZSwkJCTB4MDAwNAkvLyEgbG9hZCBzZXBhcmF0ZWQgQ01ZSyAiYXMgaXMiICh1c2UgfCB0byBjb21iaW5lIHdpdGggb3RoZXIgbG9hZCBmbGFncykKKyNkZWZpbmUgSlBFR19FWElGUk9UQVRFCQkweDAwMDgJLy8hIGxvYWQgYW5kIHJvdGF0ZSBhY2NvcmRpbmcgdG8gRXhpZiAnT3JpZW50YXRpb24nIHRhZyBpZiBhdmFpbGFibGUKKyNkZWZpbmUgSlBFR19HUkVZU0NBTEUJCTB4MDAxMAkvLyEgbG9hZCBhbmQgY29udmVydCB0byBhIDgtYml0IGdyZXlzY2FsZSBpbWFnZQorI2RlZmluZSBKUEVHX1FVQUxJVFlTVVBFUkIgIDB4ODAJLy8hIHNhdmUgd2l0aCBzdXBlcmIgcXVhbGl0eSAoMTAwOjEpCisjZGVmaW5lIEpQRUdfUVVBTElUWUdPT0QgICAgMHgwMTAwCS8vISBzYXZlIHdpdGggZ29vZCBxdWFsaXR5ICg3NToxKQorI2RlZmluZSBKUEVHX1FVQUxJVFlOT1JNQUwgIDB4MDIwMAkvLyEgc2F2ZSB3aXRoIG5vcm1hbCBxdWFsaXR5ICg1MDoxKQorI2RlZmluZSBKUEVHX1FVQUxJVFlBVkVSQUdFIDB4MDQwMAkvLyEgc2F2ZSB3aXRoIGF2ZXJhZ2UgcXVhbGl0eSAoMjU6MSkKKyNkZWZpbmUgSlBFR19RVUFMSVRZQkFEICAgICAweDA4MDAJLy8hIHNhdmUgd2l0aCBiYWQgcXVhbGl0eSAoMTA6MSkKKyNkZWZpbmUgSlBFR19QUk9HUkVTU0lWRQkweDIwMDAJLy8hIHNhdmUgYXMgYSBwcm9ncmVzc2l2ZS1KUEVHICh1c2UgfCB0byBjb21iaW5lIHdpdGggb3RoZXIgc2F2ZSBmbGFncykKKyNkZWZpbmUgSlBFR19TVUJTQU1QTElOR180MTEgMHgxMDAwCQkvLyEgc2F2ZSB3aXRoIGhpZ2ggNHgxIGNocm9tYSBzdWJzYW1wbGluZyAoNDoxOjEpIAorI2RlZmluZSBKUEVHX1NVQlNBTVBMSU5HXzQyMCAweDQwMDAJCS8vISBzYXZlIHdpdGggbWVkaXVtIDJ4MiBtZWRpdW0gY2hyb21hIHN1YnNhbXBsaW5nICg0OjI6MCkgLSBkZWZhdWx0IHZhbHVlCisjZGVmaW5lIEpQRUdfU1VCU0FNUExJTkdfNDIyIDB4ODAwMAkJLy8hIHNhdmUgd2l0aCBsb3cgMngxIGNocm9tYSBzdWJzYW1wbGluZyAoNDoyOjIpIAorI2RlZmluZSBKUEVHX1NVQlNBTVBMSU5HXzQ0NCAweDEwMDAwCS8vISBzYXZlIHdpdGggbm8gY2hyb21hIHN1YnNhbXBsaW5nICg0OjQ6NCkKKyNkZWZpbmUgSlBFR19PUFRJTUlaRQkJMHgyMDAwMAkJLy8hIG9uIHNhdmluZywgY29tcHV0ZSBvcHRpbWFsIEh1ZmZtYW4gY29kaW5nIHRhYmxlcyAoY2FuIHJlZHVjZSBhIGZldyBwZXJjZW50IG9mIGZpbGUgc2l6ZSkKKyNkZWZpbmUgSlBFR19CQVNFTElORQkJMHg0MDAwMAkJLy8hIHNhdmUgYmFzaWMgSlBFRywgd2l0aG91dCBtZXRhZGF0YSBvciBhbnkgbWFya2VycworI2RlZmluZSBLT0FMQV9ERUZBVUxUICAgICAgIDAKKyNkZWZpbmUgTEJNX0RFRkFVTFQgICAgICAgICAwCisjZGVmaW5lIE1OR19ERUZBVUxUICAgICAgICAgMAorI2RlZmluZSBQQ0RfREVGQVVMVCAgICAgICAgIDAKKyNkZWZpbmUgUENEX0JBU0UgICAgICAgICAgICAxCQkvLyEgbG9hZCB0aGUgYml0bWFwIHNpemVkIDc2OCB4IDUxMgorI2RlZmluZSBQQ0RfQkFTRURJVjQgICAgICAgIDIJCS8vISBsb2FkIHRoZSBiaXRtYXAgc2l6ZWQgMzg0IHggMjU2CisjZGVmaW5lIFBDRF9CQVNFRElWMTYgICAgICAgMwkJLy8hIGxvYWQgdGhlIGJpdG1hcCBzaXplZCAxOTIgeCAxMjgKKyNkZWZpbmUgUENYX0RFRkFVTFQgICAgICAgICAwCisjZGVmaW5lIFBGTV9ERUZBVUxUICAgICAgICAgMAorI2RlZmluZSBQSUNUX0RFRkFVTFQgICAgICAgIDAKKyNkZWZpbmUgUE5HX0RFRkFVTFQgICAgICAgICAwCisjZGVmaW5lIFBOR19JR05PUkVHQU1NQQkJMQkJLy8hIGxvYWRpbmc6IGF2b2lkIGdhbW1hIGNvcnJlY3Rpb24KKyNkZWZpbmUgUE5HX1pfQkVTVF9TUEVFRAkJCTB4MDAwMQkvLyEgc2F2ZSB1c2luZyBaTGliIGxldmVsIDEgY29tcHJlc3Npb24gZmxhZyAoZGVmYXVsdCB2YWx1ZSBpcyA2KQorI2RlZmluZSBQTkdfWl9ERUZBVUxUX0NPTVBSRVNTSU9OCTB4MDAwNgkvLyEgc2F2ZSB1c2luZyBaTGliIGxldmVsIDYgY29tcHJlc3Npb24gZmxhZyAoZGVmYXVsdCByZWNvbW1lbmRlZCB2YWx1ZSkKKyNkZWZpbmUgUE5HX1pfQkVTVF9DT01QUkVTU0lPTgkJMHgwMDA5CS8vISBzYXZlIHVzaW5nIFpMaWIgbGV2ZWwgOSBjb21wcmVzc2lvbiBmbGFnIChkZWZhdWx0IHZhbHVlIGlzIDYpCisjZGVmaW5lIFBOR19aX05PX0NPTVBSRVNTSU9OCQkweDAxMDAJLy8hIHNhdmUgd2l0aG91dCBaTGliIGNvbXByZXNzaW9uCisjZGVmaW5lIFBOR19JTlRFUkxBQ0VECQkJCTB4MDIwMAkvLyEgc2F2ZSB1c2luZyBBZGFtNyBpbnRlcmxhY2luZyAodXNlIHwgdG8gY29tYmluZSB3aXRoIG90aGVyIHNhdmUgZmxhZ3MpCisjZGVmaW5lIFBOTV9ERUZBVUxUICAgICAgICAgMAorI2RlZmluZSBQTk1fU0FWRV9SQVcgICAgICAgIDAgICAgICAgLy8hIGlmIHNldCB0aGUgd3JpdGVyIHNhdmVzIGluIFJBVyBmb3JtYXQgKGkuZS4gUDQsIFA1IG9yIFA2KQorI2RlZmluZSBQTk1fU0FWRV9BU0NJSSAgICAgIDEgICAgICAgLy8hIGlmIHNldCB0aGUgd3JpdGVyIHNhdmVzIGluIEFTQ0lJIGZvcm1hdCAoaS5lLiBQMSwgUDIgb3IgUDMpCisjZGVmaW5lIFBTRF9ERUZBVUxUICAgICAgICAgMAorI2RlZmluZSBQU0RfQ01ZSwkJCTEJCS8vISByZWFkcyB0YWdzIGZvciBzZXBhcmF0ZWQgQ01ZSyAoZGVmYXVsdCBpcyBjb252ZXJzaW9uIHRvIFJHQikKKyNkZWZpbmUgUFNEX0xBQgkJCQkyCQkvLyEgcmVhZHMgdGFncyBmb3IgQ0lFTGFiIChkZWZhdWx0IGlzIGNvbnZlcnNpb24gdG8gUkdCKQorI2RlZmluZSBSQVNfREVGQVVMVCAgICAgICAgIDAKKyNkZWZpbmUgUkFXX0RFRkFVTFQgICAgICAgICAwCQkvLyEgbG9hZCB0aGUgZmlsZSBhcyBsaW5lYXIgUkdCIDQ4LWJpdAorI2RlZmluZSBSQVdfUFJFVklFVwkJCTEJCS8vISB0cnkgdG8gbG9hZCB0aGUgZW1iZWRkZWQgSlBFRyBwcmV2aWV3IHdpdGggaW5jbHVkZWQgRXhpZiBEYXRhIG9yIGRlZmF1bHQgdG8gUkdCIDI0LWJpdAorI2RlZmluZSBSQVdfRElTUExBWQkJCTIJCS8vISBsb2FkIHRoZSBmaWxlIGFzIFJHQiAyNC1iaXQKKyNkZWZpbmUgUkFXX0hBTEZTSVpFCQk0CQkvLyEgb3V0cHV0IGEgaGFsZi1zaXplIGNvbG9yIGltYWdlCisjZGVmaW5lIFJBV19VTlBST0NFU1NFRAkJOAkJLy8hIG91dHB1dCBhIEZJVF9VSU5UMTYgcmF3IEJheWVyIGltYWdlCisjZGVmaW5lIFNHSV9ERUZBVUxUCQkJMAorI2RlZmluZSBUQVJHQV9ERUZBVUxUICAgICAgIDAKKyNkZWZpbmUgVEFSR0FfTE9BRF9SR0I4ODggICAxICAgICAgIC8vISBpZiBzZXQgdGhlIGxvYWRlciBjb252ZXJ0cyBSR0I1NTUgYW5kIEFSR0I4ODg4IC0+IFJHQjg4OC4KKyNkZWZpbmUgVEFSR0FfU0FWRV9STEUJCTIJCS8vISBpZiBzZXQsIHRoZSB3cml0ZXIgc2F2ZXMgd2l0aCBSTEUgY29tcHJlc3Npb24KKyNkZWZpbmUgVElGRl9ERUZBVUxUICAgICAgICAwCisjZGVmaW5lIFRJRkZfQ01ZSwkJCTB4MDAwMQkvLyEgcmVhZHMvc3RvcmVzIHRhZ3MgZm9yIHNlcGFyYXRlZCBDTVlLICh1c2UgfCB0byBjb21iaW5lIHdpdGggY29tcHJlc3Npb24gZmxhZ3MpCisjZGVmaW5lIFRJRkZfUEFDS0JJVFMgICAgICAgMHgwMTAwICAvLyEgc2F2ZSB1c2luZyBQQUNLQklUUyBjb21wcmVzc2lvbgorI2RlZmluZSBUSUZGX0RFRkxBVEUgICAgICAgIDB4MDIwMCAgLy8hIHNhdmUgdXNpbmcgREVGTEFURSBjb21wcmVzc2lvbiAoYS5rLmEuIFpMSUIgY29tcHJlc3Npb24pCisjZGVmaW5lIFRJRkZfQURPQkVfREVGTEFURSAgMHgwNDAwICAvLyEgc2F2ZSB1c2luZyBBRE9CRSBERUZMQVRFIGNvbXByZXNzaW9uCisjZGVmaW5lIFRJRkZfTk9ORSAgICAgICAgICAgMHgwODAwICAvLyEgc2F2ZSB3aXRob3V0IGFueSBjb21wcmVzc2lvbgorI2RlZmluZSBUSUZGX0NDSVRURkFYMwkJMHgxMDAwICAvLyEgc2F2ZSB1c2luZyBDQ0lUVCBHcm91cCAzIGZheCBlbmNvZGluZworI2RlZmluZSBUSUZGX0NDSVRURkFYNAkJMHgyMDAwICAvLyEgc2F2ZSB1c2luZyBDQ0lUVCBHcm91cCA0IGZheCBlbmNvZGluZworI2RlZmluZSBUSUZGX0xaVwkJCTB4NDAwMAkvLyEgc2F2ZSB1c2luZyBMWlcgY29tcHJlc3Npb24KKyNkZWZpbmUgVElGRl9KUEVHCQkJMHg4MDAwCS8vISBzYXZlIHVzaW5nIEpQRUcgY29tcHJlc3Npb24KKyNkZWZpbmUgVElGRl9MT0dMVVYJCQkweDEwMDAwCS8vISBzYXZlIHVzaW5nIExvZ0x1diBjb21wcmVzc2lvbgorI2RlZmluZSBXQk1QX0RFRkFVTFQgICAgICAgIDAKKyNkZWZpbmUgWEJNX0RFRkFVTFQJCQkwCisjZGVmaW5lIFhQTV9ERUZBVUxUCQkJMAorI2RlZmluZSBXRUJQX0RFRkFVTFQJCTAJCS8vISBzYXZlIHdpdGggZ29vZCBxdWFsaXR5ICg3NToxKQorI2RlZmluZSBXRUJQX0xPU1NMRVNTCQkweDEwMAkvLyEgc2F2ZSBpbiBsb3NzbGVzcyBtb2RlCisjZGVmaW5lIEpYUl9ERUZBVUxUCQkJMAkJLy8hIHNhdmUgd2l0aCBxdWFsaXR5IDgwIGFuZCBubyBjaHJvbWEgc3Vic2FtcGxpbmcgKDQ6NDo0KQorI2RlZmluZSBKWFJfTE9TU0xFU1MJCTB4MDA2NAkvLyEgc2F2ZSBsb3NzbGVzcworI2RlZmluZSBKWFJfUFJPR1JFU1NJVkUJCTB4MjAwMAkvLyEgc2F2ZSBhcyBhIHByb2dyZXNzaXZlLUpYUiAodXNlIHwgdG8gY29tYmluZSB3aXRoIG90aGVyIHNhdmUgZmxhZ3MpCisKKy8vIEJhY2tncm91bmQgZmlsbGluZyBvcHRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29uc3RhbnRzIHVzZWQgaW4gRnJlZUltYWdlX0ZpbGxCYWNrZ3JvdW5kIGFuZCBGcmVlSW1hZ2VfRW5sYXJnZUNhbnZhcworCisjZGVmaW5lIEZJX0NPTE9SX0lTX1JHQl9DT0xPUgkJCTB4MDAJLy8hIFJHQlFVQUQgY29sb3IgaXMgYSBSR0IgY29sb3IgKGNvbnRhaW5zIG5vIHZhbGlkIGFscGhhIGNoYW5uZWwpCisjZGVmaW5lIEZJX0NPTE9SX0lTX1JHQkFfQ09MT1IJCQkweDAxCS8vISBSR0JRVUFEIGNvbG9yIGlzIGEgUkdCQSBjb2xvciAoY29udGFpbnMgYSB2YWxpZCBhbHBoYSBjaGFubmVsKQorI2RlZmluZSBGSV9DT0xPUl9GSU5EX0VRVUFMX0NPTE9SCQkweDAyCS8vISBGb3IgcGFsZXR0aXplZCBpbWFnZXM6IGxvb2t1cCBlcXVhbCBSR0IgY29sb3IgZnJvbSBwYWxldHRlCisjZGVmaW5lIEZJX0NPTE9SX0FMUEhBX0lTX0lOREVYCQkJMHgwNAkvLyEgVGhlIGNvbG9yJ3MgcmdiUmVzZXJ2ZWQgbWVtYmVyIChhbHBoYSkgY29udGFpbnMgdGhlIHBhbGV0dGUgaW5kZXggdG8gYmUgdXNlZAorI2RlZmluZSBGSV9DT0xPUl9QQUxFVFRFX1NFQVJDSF9NQVNLCShGSV9DT0xPUl9GSU5EX0VRVUFMX0NPTE9SIHwgRklfQ09MT1JfQUxQSEFfSVNfSU5ERVgpCS8vIE5vIGNvbG9yIGxvb2t1cCBpcyBwZXJmb3JtZWQKKworLy8gUmVzY2FsZUV4IG9wdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb25zdGFudHMgdXNlZCBpbiBGcmVlSW1hZ2VfUmVzY2FsZUV4CisKKyNkZWZpbmUgRklfUkVTQ0FMRV9ERUZBVUxUCQkJMHgwMCAgICAvLyEgZGVmYXVsdCBvcHRpb25zOyBub25lIG9mIHRoZSBmb2xsb3dpbmcgb3RoZXIgb3B0aW9ucyBhcHBseQorI2RlZmluZSBGSV9SRVNDQUxFX1RSVUVfQ09MT1IJCTB4MDEJLy8hIGZvciBub24tdHJhbnNwYXJlbnQgZ3JleXNjYWxlIGltYWdlcywgY29udmVydCB0byAyNC1iaXQgaWYgc3JjIGJpdGRlcHRoIDw9IDggKGRlZmF1bHQgaXMgYSA4LWJpdCBncmV5c2NhbGUgaW1hZ2UpLiAKKyNkZWZpbmUgRklfUkVTQ0FMRV9PTUlUX01FVEFEQVRBCTB4MDIJLy8hIGRvIG5vdCBjb3B5IG1ldGFkYXRhIHRvIHRoZSByZXNjYWxlZCBpbWFnZQorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLy8gSW5pdCAvIEVycm9yIHJvdXRpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRExMX0FQSSB2b2lkIERMTF9DQUxMQ09OViBGcmVlSW1hZ2VfSW5pdGlhbGlzZShCT09MIGxvYWRfbG9jYWxfcGx1Z2luc19vbmx5IEZJX0RFRkFVTFQoRkFMU0UpKTsKK0RMTF9BUEkgdm9pZCBETExfQ0FMTENPTlYgRnJlZUltYWdlX0RlSW5pdGlhbGlzZSh2b2lkKTsKKworLy8gVmVyc2lvbiByb3V0aW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRExMX0FQSSBjb25zdCBjaGFyICpETExfQ0FMTENPTlYgRnJlZUltYWdlX0dldFZlcnNpb24odm9pZCk7CitETExfQVBJIGNvbnN0IGNoYXIgKkRMTF9DQUxMQ09OViBGcmVlSW1hZ2VfR2V0Q29weXJpZ2h0TWVzc2FnZSh2b2lkKTsKKworLy8gTWVzc2FnZSBvdXRwdXQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiB2b2lkICgqRnJlZUltYWdlX091dHB1dE1lc3NhZ2VGdW5jdGlvbikoRlJFRV9JTUFHRV9GT1JNQVQgZmlmLCBjb25zdCBjaGFyICptc2cpOwordHlwZWRlZiB2b2lkIChETExfQ0FMTENPTlYgKkZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlRnVuY3Rpb25TdGRDYWxsKShGUkVFX0lNQUdFX0ZPUk1BVCBmaWYsIGNvbnN0IGNoYXIgKm1zZyk7IAorCitETExfQVBJIHZvaWQgRExMX0NBTExDT05WIEZyZWVJbWFnZV9TZXRPdXRwdXRNZXNzYWdlU3RkQ2FsbChGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZUZ1bmN0aW9uU3RkQ2FsbCBvbWYpOyAKK0RMTF9BUEkgdm9pZCBETExfQ0FMTENPTlYgRnJlZUltYWdlX1NldE91dHB1dE1lc3NhZ2UoRnJlZUltYWdlX091dHB1dE1lc3NhZ2VGdW5jdGlvbiBvbWYpOworRExMX0FQSSB2b2lkIERMTF9DQUxMQ09OViBGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2MoaW50IGZpZiwgY29uc3QgY2hhciAqZm10LCAuLi4pOworCisvLyBBbGxvY2F0ZSAvIENsb25lIC8gVW5sb2FkIHJvdXRpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitETExfQVBJIEZJQklUTUFQICpETExfQ0FMTENPTlYgRnJlZUltYWdlX0FsbG9jYXRlKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgdW5zaWduZWQgcmVkX21hc2sgRklfREVGQVVMVCgwKSwgdW5zaWduZWQgZ3JlZW5fbWFzayBGSV9ERUZBVUxUKDApLCB1bnNpZ25lZCBibHVlX21hc2sgRklfREVGQVVMVCgwKSk7CitETExfQVBJIEZJQklUTUFQICpETExfQ0FMTENPTlYgRnJlZUltYWdlX0FsbG9jYXRlVChGUkVFX0lNQUdFX1RZUEUgdHlwZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwIEZJX0RFRkFVTFQoOCksIHVuc2lnbmVkIHJlZF9tYXNrIEZJX0RFRkFVTFQoMCksIHVuc2lnbmVkIGdyZWVuX21hc2sgRklfREVGQVVMVCgwKSwgdW5zaWduZWQgYmx1ZV9tYXNrIEZJX0RFRkFVTFQoMCkpOworRExMX0FQSSBGSUJJVE1BUCAqIERMTF9DQUxMQ09OViBGcmVlSW1hZ2VfQ2xvbmUoRklCSVRNQVAgKmRpYik7CitETExfQVBJIHZvaWQgRExMX0NBTExDT05WIEZyZWVJbWFnZV9VbmxvYWQoRklCSVRNQVAgKmRpYik7CisKKy8vIEhlYWRlciBsb2FkaW5nIHJvdXRpbmVzCitETExfQVBJIEJPT0wgRExMX0NBTExDT05WIEZyZWVJbWFnZV9IYXNQaXhlbHMoRklCSVRNQVAgKmRpYik7CisKKy8vIExvYWQgLyBTYXZlIHJvdXRpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0RMTF9BUEkgRklCSVRNQVAgKkRMTF9DQUxMQ09OViBGcmVlSW1hZ2VfTG9hZChGUkVFX0lNQUdFX0ZPUk1BVCBmaWYsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgZmxhZ3MgRklfREVGQVVMVCgwKSk7CitETExfQVBJIEZJQklUTUFQICpETExfQ0FMTENPTlYgRnJlZUltYWdlX0xvYWRVKEZSRUVfSU1BR0VfRk9STUFUIGZpZiwgY29uc3Qgd2NoYXJfdCAqZmlsZW5hbWUsIGludCBmbGFncyBGSV9ERUZBVUxUKDApKTsKK0RMTF9BUEkgRklCSVRNQVAgKkRMTF9DQUxMQ09OViBGcmVlSW1hZ2VfTG9hZEZyb21IYW5kbGUoRlJFRV9JTUFHRV9GT1JNQVQgZmlmLCBGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIGludCBmbGFncyBGSV9ERUZBVUxUKDApKTsKK0RMTF9BUEkgQk9PTCBETExfQ0FMTENPTlYgRnJlZUltYWdlX1NhdmUoRlJFRV9JTUFHRV9GT1JNQVQgZmlmLCBGSUJJVE1BUCAqZGliLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGZsYWdzIEZJX0RFRkFVTFQoMCkpOworRExMX0FQSSBCT09MIERMTF9DQUxMQ09OViBGcmVlSW1hZ2VfU2F2ZVUoRlJFRV9JTUFHRV9GT1JNQVQgZmlmLCBGSUJJVE1BUCAqZGliLCBjb25zdCB3Y2hhcl90ICpmaWxlbmFtZSwgaW50IGZsYWdzIEZJX0RFRkFVTFQoMCkpOworRExMX0FQSSBCT09MIERMTF9DQUxMQ09OViBGcmVlSW1hZ2VfU2F2ZVRvSGFuZGxlKEZSRUVfSU1BR0VfRk9STUFUIGZpZiwgRklCSVRNQVAgKmRpYiwgRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBpbnQgZmxhZ3MgRklfREVGQVVMVCgwKSk7CisKKy8vIE1lbW9yeSBJL08gc3RyZWFtIHJvdXRpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0RMTF9BUEkgRklNRU1PUlkgKkRMTF9DQUxMQ09OViBGcmVlSW1hZ2VfT3Blbk1lbW9yeShCWVRFICpkYXRhIEZJX0RFRkFVTFQoMCksIERXT1JEIHNpemVfaW5fYnl0ZXMgRklfREVGQVVMVCgwKSk7CitETExfQVBJIHZvaWQgRExMX0NBTExDT05WIEZyZWVJbWFnZV9DbG9zZU1lbW9yeShGSU1FTU9SWSAqc3RyZWFtKTsKK0RMTF9BUEkgRklCSVRNQVAgKkRMTF9DQUxMQ09OViBGcmVlSW1hZ2VfTG9hZEZyb21NZW1vcnkoRlJFRV9JTUFHRV9GT1JNQVQgZmlmLCBGSU1FTU9SWSAqc3RyZWFtLCBpbnQgZmxhZ3MgRklfREVGQVVMVCgwKSk7CitETExfQVBJIEJPT0wgRExMX0NBTExDT05WIEZyZWVJbWFnZV9TYXZlVG9NZW1vcnkoRlJFRV9JTUFHRV9GT1JNQVQgZmlmLCBGSUJJVE1BUCAqZGliLCBGSU1FTU9SWSAqc3RyZWFtLCBpbnQgZmxhZ3MgRklfREVGQVVMVCgwKSk7CitETExfQVBJIGxvbmcgRExMX0NBTExDT05WIEZyZWVJbWFnZV9UZWxsTWVtb3J5KEZJTUVNT1JZICpzdHJlYW0pOworRExMX0FQSSBCT09MIERMTF9DQUxMQ09OViBGcmVlSW1hZ2VfU2Vla01lbW9yeShGSU1FTU9SWSAqc3RyZWFtLCBsb25nIG9mZnNldCwgaW50IG9yaWdpbik7CitETExfQVBJIEJPT0wgRExMX0NBTExDT05WIEZyZWVJbWFnZV9BY3F1aXJlTWVtb3J5KEZJTUVNT1JZICpzdHJlYW0sIEJZVEUgKipkYXRhLCBEV09SRCAqc2l6ZV9pbl9ieXRlcyk7CitETExfQVBJIHVuc2lnbmVkIERMTF9DQUxMQ09OViBGcmVlSW1hZ2VfUmVhZE1lbW9yeSh2b2lkICpidWZmZXIsIHVuc2lnbmVkIHNpemUsIHVuc2lnbmVkIGNvdW50LCBGSU1FTU9SWSAqc3RyZWFtKTsKK0RMTF9BUEkgdW5zaWduZWQgRExMX0NBTExDT05WIEZyZWVJbWFnZV9Xcml0ZU1lbW9yeShjb25zdCB2b2lkICpidWZmZXIsIHVuc2lnbmVkIHNpemUsIHVuc2lnbmVkIGNvdW50LCBGSU1FTU9SWSAqc3RyZWFtKTsKKworRExMX0FQSSBGSU1VTFRJQklUTUFQICpETExfQ0FMTENPTlYgRnJlZUltYWdlX0xvYWRNdWx0aUJpdG1hcEZyb21NZW1vcnkoRlJFRV9JTUFHRV9GT1JNQVQgZmlmLCBGSU1FTU9SWSAqc3RyZWFtLCBpbnQgZmxhZ3MgRklfREVGQVVMVCgwKSk7CitETExfQVBJIEJPT0wgRExMX0NBTExDT05WIEZyZWVJbWFnZV9TYXZlTXVsdGlCaXRtYXBUb01lbW9yeShGUkVFX0lNQUdFX0ZPUk1BVCBmaWYsIEZJTVVMVElCSVRNQVAgKmJpdG1hcCwgRklNRU1PUlkgKnN0cmVhbSwgaW50IGZsYWdzKTsKKworLy8gUGx1Z2luIEludGVyZmFjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRExMX0FQSSBGUkVFX0lNQUdFX0ZPUk1BVCBETExfQ0FMTENPTlYgRnJlZUltYWdlX1JlZ2lzdGVyTG9jYWxQbHVnaW4oRklfSW5pdFByb2MgcHJvY19hZGRyZXNzLCBjb25zdCBjaGFyICpmb3JtYXQgRklfREVGQVVMVCgwKSwgY29uc3QgY2hhciAqZGVzY3JpcHRpb24gRklfREVGQVVMVCgwKSwgY29uc3QgY2hhciAqZXh0ZW5zaW9uIEZJX0RFRkFVTFQoMCksIGNvbnN0IGNoYXIgKnJlZ2V4cHIgRklfREVGQVVMVCgwKSk7CitETExfQVBJIEZSRUVfSU1BR0VfRk9STUFUIERMTF9DQUxMQ09OViBGcmVlSW1hZ2VfUmVnaXN0ZXJFeHRlcm5hbFBsdWdpbihjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICpmb3JtYXQgRklfREVGQVVMVCgwKSwgY29uc3QgY2hhciAqZGVzY3JpcHRpb24gRklfREVGQVVMVCgwKSwgY29uc3QgY2hhciAqZXh0ZW5zaW9uIEZJX0RFRkFVTFQoMCksIGNvbnN0IGNoYXIgKnJlZ2V4cHIgRklfREVGQVVMVCgwKSk7CitETExfQVBJIGludCBETExfQ0FMTENPTlYgRnJlZUltYWdlX0dldEZJRkNvdW50KHZvaWQpOworRExMX0FQSSBpbnQgRExMX0NBTExDT05WIEZyZWVJbWFnZV9TZXRQbHVnaW5FbmFibGVkKEZSRUVfSU1BR0VfRk9STUFUIGZpZiwgQk9PTCBlbmFibGUpOworRExMX0FQSSBpbnQgRExMX0NBTExDT05WIEZyZWVJbWFnZV9Jc1BsdWdpbkVuYWJsZWQoRlJFRV9JTUFHRV9GT1JNQVQgZmlmKTsKK0RMTF9BUEkgRlJFRV9JTUFHRV9GT1JNQVQgRExMX0NBTExDT05WIEZyZWVJbWFnZV9HZXRGSUZGcm9tRm9ybWF0KGNvbnN0IGNoYXIgKmZvcm1hdCk7CitETExfQVBJIEZSRUVfSU1BR0VfRk9STUFUIERMTF9DQUxMQ09OViBGcmVlSW1hZ2VfR2V0RklGRnJvbU1pbWUoY29uc3QgY2hhciAqbWltZSk7CitETExfQVBJIGNvbnN0IGNoYXIgKkRMTF9DQUxMQ09OViBGcmVlSW1hZ2VfR2V0Rm9ybWF0RnJvbUZJRihGUkVFX0lNQUdFX0ZPUk1BVCBmaWYpOworRExMX0FQSSBjb25zdCBjaGFyICpETExfQ0FMTENPTlYgRnJlZUltYWdlX0dldEZJRkV4dGVuc2lvbkxpc3QoRlJFRV9JTUFHRV9GT1JNQVQgZmlmKTsKK0RMTF9BUEkgY29uc3QgY2hhciAqRExMX0NBTExDT05WIEZyZWVJbWFnZV9HZXRGSUZEZXNjcmlwdGlvbihGUkVFX0lNQUdFX0ZPUk1BVCBmaWYpOworRExMX0FQSSBjb25zdCBjaGFyICpETExfQ0FMTENPTlYgRnJlZUltYWdlX0dldEZJRlJlZ0V4cHIoRlJFRV9JTUFHRV9GT1JNQVQgZmlmKTsKK0RMTF9BUEkgY29uc3QgY2hhciAqRExMX0NBTExDT05WIEZyZWVJbWFnZV9HZXRGSUZNaW1lVHlwZShGUkVFX0lNQUdFX0ZPUk1BVCBmaWYpOworRExMX0FQSSBGUkVFX0lNQUdFX0ZPUk1BVCBETExfQ0FMTENPTlYgRnJlZUltYWdlX0dldEZJRkZyb21GaWxlbmFtZShjb25zdCBjaGFyICpmaWxlbmFtZSk7CitETExfQVBJIEZSRUVfSU1BR0VfRk9STUFUIERMTF9DQUxMQ09OViBGcmVlSW1hZ2VfR2V0RklGRnJvbUZpbGVuYW1lVShjb25zdCB3Y2hhcl90ICpmaWxlbmFtZSk7CitETExfQVBJIEJPT0wgRExMX0NBTExDT05WIEZyZWVJbWFnZV9GSUZTdXBwb3J0c1JlYWRpbmcoRlJFRV9JTUFHRV9GT1JNQVQgZmlmKTsKK0RMTF9BUEkgQk9PTCBETExfQ0FMTENPTlYgRnJlZUltYWdlX0ZJRlN1cHBvcnRzV3JpdGluZyhGUkVFX0lNQUdFX0ZPUk1BVCBmaWYpOworRExMX0FQSSBCT09MIERMTF9DQUxMQ09OViBGcmVlSW1hZ2VfRklGU3VwcG9ydHNFeHBvcnRCUFAoRlJFRV9JTUFHRV9GT1JNQVQgZmlmLCBpbnQgYnBwKTsKK0RMTF9BUEkgQk9PTCBETExfQ0FMTENPTlYgRnJlZUltYWdlX0ZJRlN1cHBvcnRzRXhwb3J0VHlwZShGUkVFX0lNQUdFX0ZPUk1BVCBmaWYsIEZSRUVfSU1BR0VfVFlQRSB0eXBlKTsKK0RMTF9BUEkgQk9PTCBETExfQ0FMTENPTlYgRnJlZUltYWdlX0ZJRlN1cHBvcnRzSUNDUHJvZmlsZXMoRlJFRV9JTUFHRV9GT1JNQVQgZmlmKTsKK0RMTF9BUEkgQk9PTCBETExfQ0FMTENPTlYgRnJlZUltYWdlX0ZJRlN1cHBvcnRzTm9QaXhlbHMoRlJFRV9JTUFHRV9GT1JNQVQgZmlmKTsKKworLy8gTXVsdGlwYWdpbmcgaW50ZXJmYWNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRExMX0FQSSBGSU1VTFRJQklUTUFQICogRExMX0NBTExDT05WIEZyZWVJbWFnZV9PcGVuTXVsdGlCaXRtYXAoRlJFRV9JTUFHRV9GT1JNQVQgZmlmLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgQk9PTCBjcmVhdGVfbmV3LCBCT09MIHJlYWRfb25seSwgQk9PTCBrZWVwX2NhY2hlX2luX21lbW9yeSBGSV9ERUZBVUxUKEZBTFNFKSwgaW50IGZsYWdzIEZJX0RFRkFVTFQoMCkpOworRExMX0FQSSBGSU1VTFRJQklUTUFQICogRExMX0NBTExDT05WIEZyZWVJbWFnZV9PcGVuTXVsdGlCaXRtYXBGcm9tSGFuZGxlKEZSRUVfSU1BR0VfRk9STUFUIGZpZiwgRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBpbnQgZmxhZ3MgRklfREVGQVVMVCgwKSk7CitETExfQVBJIEJPT0wgRExMX0NBTExDT05WIEZyZWVJbWFnZV9TYXZlTXVsdGlCaXRtYXBUb0hhbmRsZShGUkVFX0lNQUdFX0ZPUk1BVCBmaWYsIEZJTVVMVElCSVRNQVAgKmJpdG1hcCwgRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBpbnQgZmxhZ3MgRklfREVGQVVMVCgwKSk7CitETExfQVBJIEJPT0wgRExMX0NBTExDT05WIEZyZWVJbWFnZV9DbG9zZU11bHRpQml0bWFwKEZJTVVMVElCSVRNQVAgKmJpdG1hcCwgaW50IGZsYWdzIEZJX0RFRkFVTFQoMCkpOworRExMX0FQSSBpbnQgRExMX0NBTExDT05WIEZyZWVJbWFnZV9HZXRQYWdlQ291bnQoRklNVUxUSUJJVE1BUCAqYml0bWFwKTsKK0RMTF9BUEkgdm9pZCBETExfQ0FMTENPTlYgRnJlZUltYWdlX0FwcGVuZFBhZ2UoRklNVUxUSUJJVE1BUCAqYml0bWFwLCBGSUJJVE1BUCAqZGF0YSk7CitETExfQVBJIHZvaWQgRExMX0NBTExDT05WIEZyZWVJbWFnZV9JbnNlcnRQYWdlKEZJTVVMVElCSVRNQVAgKmJpdG1hcCwgaW50IHBhZ2UsIEZJQklUTUFQICpkYXRhKTsKK0RMTF9BUEkgdm9pZCBETExfQ0FMTENPTlYgRnJlZUltYWdlX0RlbGV0ZVBhZ2UoRklNVUxUSUJJVE1BUCAqYml0bWFwLCBpbnQgcGFnZSk7CitETExfQVBJIEZJQklUTUFQICogRExMX0NBTExDT05WIEZyZWVJbWFnZV9Mb2NrUGFnZShGSU1VTFRJQklUTUFQICpiaXRtYXAsIGludCBwYWdlKTsKK0RMTF9BUEkgdm9pZCBETExfQ0FMTENPTlYgRnJlZUltYWdlX1VubG9ja1BhZ2UoRklNVUxUSUJJVE1BUCAqYml0bWFwLCBGSUJJVE1BUCAqZGF0YSwgQk9PTCBjaGFuZ2VkKTsKK0RMTF9BUEkgQk9PTCBETExfQ0FMTENPTlYgRnJlZUltYWdlX01vdmVQYWdlKEZJTVVMVElCSVRNQVAgKmJpdG1hcCwgaW50IHRhcmdldCwgaW50IHNvdXJjZSk7CitETExfQVBJIEJPT0wgRExMX0NBTExDT05WIEZyZWVJbWFnZV9HZXRMb2NrZWRQYWdlTnVtYmVycyhGSU1VTFRJQklUTUFQICpiaXRtYXAsIGludCAqcGFnZXMsIGludCAqY291bnQpOworCisvLyBGaWxldHlwZSByZXF1ZXN0IHJvdXRpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitETExfQVBJIEZSRUVfSU1BR0VfRk9STUFUIERMTF9DQUxMQ09OViBGcmVlSW1hZ2VfR2V0RmlsZVR5cGUoY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBzaXplIEZJX0RFRkFVTFQoMCkpOworRExMX0FQSSBGUkVFX0lNQUdFX0ZPUk1BVCBETExfQ0FMTENPTlYgRnJlZUltYWdlX0dldEZpbGVUeXBlVShjb25zdCB3Y2hhcl90ICpmaWxlbmFtZSwgaW50IHNpemUgRklfREVGQVVMVCgwKSk7CitETExfQVBJIEZSRUVfSU1BR0VfRk9STUFUIERMTF9DQUxMQ09OViBGcmVlSW1hZ2VfR2V0RmlsZVR5cGVGcm9tSGFuZGxlKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSwgaW50IHNpemUgRklfREVGQVVMVCgwKSk7CitETExfQVBJIEZSRUVfSU1BR0VfRk9STUFUIERMTF9DQUxMQ09OViBGcmVlSW1hZ2VfR2V0RmlsZVR5cGVGcm9tTWVtb3J5KEZJTUVNT1JZICpzdHJlYW0sIGludCBzaXplIEZJX0RFRkFVTFQoMCkpOworCisvLyBJbWFnZSB0eXBlIHJlcXVlc3Qgcm91dGluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitETExfQVBJIEZSRUVfSU1BR0VfVFlQRSBETExfQ0FMTENPTlYgRnJlZUltYWdlX0dldEltYWdlVHlwZShGSUJJVE1BUCAqZGliKTsKKworLy8gRnJlZUltYWdlIGhlbHBlciByb3V0aW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRExMX0FQSSBCT09MIERMTF9DQUxMQ09OViBGcmVlSW1hZ2VfSXNMaXR0bGVFbmRpYW4odm9pZCk7CitETExfQVBJIEJPT0wgRExMX0NBTExDT05WIEZyZWVJbWFnZV9Mb29rdXBYMTFDb2xvcihjb25zdCBjaGFyICpzekNvbG9yLCBCWVRFICpuUmVkLCBCWVRFICpuR3JlZW4sIEJZVEUgKm5CbHVlKTsKK0RMTF9BUEkgQk9PTCBETExfQ0FMTENPTlYgRnJlZUltYWdlX0xvb2t1cFNWR0NvbG9yKGNvbnN0IGNoYXIgKnN6Q29sb3IsIEJZVEUgKm5SZWQsIEJZVEUgKm5HcmVlbiwgQllURSAqbkJsdWUpOworCisvLyBQaXhlbCBhY2Nlc3Mgcm91dGluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitETExfQVBJIEJZVEUgKkRMTF9DQUxMQ09OViBGcmVlSW1hZ2VfR2V0Qml0cyhGSUJJVE1BUCAqZGliKTsKK0RMTF9BUEkgQllURSAqRExMX0NBTExDT05WIEZyZWVJbWFnZV9HZXRTY2FuTGluZShGSUJJVE1BUCAqZGliLCBpbnQgc2NhbmxpbmUpOworCitETExfQVBJIEJPT0wgRExMX0NBTExDT05WIEZyZWVJbWFnZV9HZXRQaXhlbEluZGV4KEZJQklUTUFQICpkaWIsIHVuc2lnbmVkIHgsIHVuc2lnbmVkIHksIEJZVEUgKnZhbHVlKTsKK0RMTF9BUEkgQk9PTCBETExfQ0FMTENPTlYgRnJlZUltYWdlX0dldFBpeGVsQ29sb3IoRklCSVRNQVAgKmRpYiwgdW5zaWduZWQgeCwgdW5zaWduZWQgeSwgUkdCUVVBRCAqdmFsdWUpOworRExMX0FQSSBCT09MIERMTF9DQUxMQ09OViBGcmVlSW1hZ2VfU2V0UGl4ZWxJbmRleChGSUJJVE1BUCAqZGliLCB1bnNpZ25lZCB4LCB1bnNpZ25lZCB5LCBCWVRFICp2YWx1ZSk7CitETExfQVBJIEJPT0wgRExMX0NBTExDT05WIEZyZWVJbWFnZV9TZXRQaXhlbENvbG9yKEZJQklUTUFQICpkaWIsIHVuc2lnbmVkIHgsIHVuc2lnbmVkIHksIFJHQlFVQUQgKnZhbHVlKTsKKworLy8gRElCIGluZm8gcm91dGluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRExMX0FQSSB1bnNpZ25lZCBETExfQ0FMTENPTlYgRnJlZUltYWdlX0dldENvbG9yc1VzZWQoRklCSVRNQVAgKmRpYik7CitETExfQVBJIHVuc2lnbmVkIERMTF9DQUxMQ09OViBGcmVlSW1hZ2VfR2V0QlBQKEZJQklUTUFQICpkaWIpOworRExMX0FQSSB1bnNpZ25lZCBETExfQ0FMTENPTlYgRnJlZUltYWdlX0dldFdpZHRoKEZJQklUTUFQICpkaWIpOworRExMX0FQSSB1bnNpZ25lZCBETExfQ0FMTENPTlYgRnJlZUltYWdlX0dldEhlaWdodChGSUJJVE1BUCAqZGliKTsKK0RMTF9BUEkgdW5zaWduZWQgRExMX0NBTExDT05WIEZyZWVJbWFnZV9HZXRMaW5lKEZJQklUTUFQICpkaWIpOworRExMX0FQSSB1bnNpZ25lZCBETExfQ0FMTENPTlYgRnJlZUltYWdlX0dldFBpdGNoKEZJQklUTUFQICpkaWIpOworRExMX0FQSSB1bnNpZ25lZCBETExfQ0FMTENPTlYgRnJlZUltYWdlX0dldERJQlNpemUoRklCSVRNQVAgKmRpYik7CitETExfQVBJIHVuc2lnbmVkIERMTF9DQUxMQ09OViBGcmVlSW1hZ2VfR2V0TWVtb3J5U2l6ZShGSUJJVE1BUCAqZGliKTsKK0RMTF9BUEkgUkdCUVVBRCAqRExMX0NBTExDT05WIEZyZWVJbWFnZV9HZXRQYWxldHRlKEZJQklUTUFQICpkaWIpOworCitETExfQVBJIHVuc2lnbmVkIERMTF9DQUxMQ09OViBGcmVlSW1hZ2VfR2V0RG90c1Blck1ldGVyWChGSUJJVE1BUCAqZGliKTsKK0RMTF9BUEkgdW5zaWduZWQgRExMX0NBTExDT05WIEZyZWVJbWFnZV9HZXREb3RzUGVyTWV0ZXJZKEZJQklUTUFQICpkaWIpOworRExMX0FQSSB2b2lkIERMTF9DQUxMQ09OViBGcmVlSW1hZ2VfU2V0RG90c1Blck1ldGVyWChGSUJJVE1BUCAqZGliLCB1bnNpZ25lZCByZXMpOworRExMX0FQSSB2b2lkIERMTF9DQUxMQ09OViBGcmVlSW1hZ2VfU2V0RG90c1Blck1ldGVyWShGSUJJVE1BUCAqZGliLCB1bnNpZ25lZCByZXMpOworCitETExfQVBJIEJJVE1BUElORk9IRUFERVIgKkRMTF9DQUxMQ09OViBGcmVlSW1hZ2VfR2V0SW5mb0hlYWRlcihGSUJJVE1BUCAqZGliKTsKK0RMTF9BUEkgQklUTUFQSU5GTyAqRExMX0NBTExDT05WIEZyZWVJbWFnZV9HZXRJbmZvKEZJQklUTUFQICpkaWIpOworRExMX0FQSSBGUkVFX0lNQUdFX0NPTE9SX1RZUEUgRExMX0NBTExDT05WIEZyZWVJbWFnZV9HZXRDb2xvclR5cGUoRklCSVRNQVAgKmRpYik7CisKK0RMTF9BUEkgdW5zaWduZWQgRExMX0NBTExDT05WIEZyZWVJbWFnZV9HZXRSZWRNYXNrKEZJQklUTUFQICpkaWIpOworRExMX0FQSSB1bnNpZ25lZCBETExfQ0FMTENPTlYgRnJlZUltYWdlX0dldEdyZWVuTWFzayhGSUJJVE1BUCAqZGliKTsKK0RMTF9BUEkgdW5zaWduZWQgRExMX0NBTExDT05WIEZyZWVJbWFnZV9HZXRCbHVlTWFzayhGSUJJVE1BUCAqZGliKTsKKworRExMX0FQSSB1bnNpZ25lZCBETExfQ0FMTENPTlYgRnJlZUltYWdlX0dldFRyYW5zcGFyZW5jeUNvdW50KEZJQklUTUFQICpkaWIpOworRExMX0FQSSBCWVRFICogRExMX0NBTExDT05WIEZyZWVJbWFnZV9HZXRUcmFuc3BhcmVuY3lUYWJsZShGSUJJVE1BUCAqZGliKTsKK0RMTF9BUEkgdm9pZCBETExfQ0FMTENPTlYgRnJlZUltYWdlX1NldFRyYW5zcGFyZW50KEZJQklUTUFQICpkaWIsIEJPT0wgZW5hYmxlZCk7CitETExfQVBJIHZvaWQgRExMX0NBTExDT05WIEZyZWVJbWFnZV9TZXRUcmFuc3BhcmVuY3lUYWJsZShGSUJJVE1BUCAqZGliLCBCWVRFICp0YWJsZSwgaW50IGNvdW50KTsKK0RMTF9BUEkgQk9PTCBETExfQ0FMTENPTlYgRnJlZUltYWdlX0lzVHJhbnNwYXJlbnQoRklCSVRNQVAgKmRpYik7CitETExfQVBJIHZvaWQgRExMX0NBTExDT05WIEZyZWVJbWFnZV9TZXRUcmFuc3BhcmVudEluZGV4KEZJQklUTUFQICpkaWIsIGludCBpbmRleCk7CitETExfQVBJIGludCBETExfQ0FMTENPTlYgRnJlZUltYWdlX0dldFRyYW5zcGFyZW50SW5kZXgoRklCSVRNQVAgKmRpYik7CisKK0RMTF9BUEkgQk9PTCBETExfQ0FMTENPTlYgRnJlZUltYWdlX0hhc0JhY2tncm91bmRDb2xvcihGSUJJVE1BUCAqZGliKTsKK0RMTF9BUEkgQk9PTCBETExfQ0FMTENPTlYgRnJlZUltYWdlX0dldEJhY2tncm91bmRDb2xvcihGSUJJVE1BUCAqZGliLCBSR0JRVUFEICpia2NvbG9yKTsKK0RMTF9BUEkgQk9PTCBETExfQ0FMTENPTlYgRnJlZUltYWdlX1NldEJhY2tncm91bmRDb2xvcihGSUJJVE1BUCAqZGliLCBSR0JRVUFEICpia2NvbG9yKTsKKworRExMX0FQSSBGSUJJVE1BUCAqRExMX0NBTExDT05WIEZyZWVJbWFnZV9HZXRUaHVtYm5haWwoRklCSVRNQVAgKmRpYik7CitETExfQVBJIEJPT0wgRExMX0NBTExDT05WIEZyZWVJbWFnZV9TZXRUaHVtYm5haWwoRklCSVRNQVAgKmRpYiwgRklCSVRNQVAgKnRodW1ibmFpbCk7CisKKy8vIElDQyBwcm9maWxlIHJvdXRpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0RMTF9BUEkgRklJQ0NQUk9GSUxFICpETExfQ0FMTENPTlYgRnJlZUltYWdlX0dldElDQ1Byb2ZpbGUoRklCSVRNQVAgKmRpYik7CitETExfQVBJIEZJSUNDUFJPRklMRSAqRExMX0NBTExDT05WIEZyZWVJbWFnZV9DcmVhdGVJQ0NQcm9maWxlKEZJQklUTUFQICpkaWIsIHZvaWQgKmRhdGEsIGxvbmcgc2l6ZSk7CitETExfQVBJIHZvaWQgRExMX0NBTExDT05WIEZyZWVJbWFnZV9EZXN0cm95SUNDUHJvZmlsZShGSUJJVE1BUCAqZGliKTsKKworLy8gTGluZSBjb252ZXJzaW9uIHJvdXRpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRExMX0FQSSB2b2lkIERMTF9DQUxMQ09OViBGcmVlSW1hZ2VfQ29udmVydExpbmUxVG80KEJZVEUgKnRhcmdldCwgQllURSAqc291cmNlLCBpbnQgd2lkdGhfaW5fcGl4ZWxzKTsKK0RMTF9BUEkgdm9pZCBETExfQ0FMTENPTlYgRnJlZUltYWdlX0NvbnZlcnRMaW5lOFRvNChCWVRFICp0YXJnZXQsIEJZVEUgKnNvdXJjZSwgaW50IHdpZHRoX2luX3BpeGVscywgUkdCUVVBRCAqcGFsZXR0ZSk7CitETExfQVBJIHZvaWQgRExMX0NBTExDT05WIEZyZWVJbWFnZV9Db252ZXJ0TGluZTE2VG80XzU1NShCWVRFICp0YXJnZXQsIEJZVEUgKnNvdXJjZSwgaW50IHdpZHRoX2luX3BpeGVscyk7CitETExfQVBJIHZvaWQgRExMX0NBTExDT05WIEZyZWVJbWFnZV9Db252ZXJ0TGluZTE2VG80XzU2NShCWVRFICp0YXJnZXQsIEJZVEUgKnNvdXJjZSwgaW50IHdpZHRoX2luX3BpeGVscyk7CitETExfQVBJIHZvaWQgRExMX0NBTExDT05WIEZyZWVJbWFnZV9Db252ZXJ0TGluZTI0VG80KEJZVEUgKnRhcmdldCwgQllURSAqc291cmNlLCBpbnQgd2lkdGhfaW5fcGl4ZWxzKTsKK0RMTF9BUEkgdm9pZCBETExfQ0FMTENPTlYgRnJlZUltYWdlX0NvbnZlcnRMaW5lMzJUbzQoQllURSAqdGFyZ2V0LCBCWVRFICpzb3VyY2UsIGludCB3aWR0aF9pbl9waXhlbHMpOworRExMX0FQSSB2b2lkIERMTF9DQUxMQ09OViBGcmVlSW1hZ2VfQ29udmVydExpbmUxVG84KEJZVEUgKnRhcmdldCwgQllURSAqc291cmNlLCBpbnQgd2lkdGhfaW5fcGl4ZWxzKTsKK0RMTF9BUEkgdm9pZCBETExfQ0FMTENPTlYgRnJlZUltYWdlX0NvbnZlcnRMaW5lNFRvOChCWVRFICp0YXJnZXQsIEJZVEUgKnNvdXJjZSwgaW50IHdpZHRoX2luX3BpeGVscyk7CitETExfQVBJIHZvaWQgRExMX0NBTExDT05WIEZyZWVJbWFnZV9Db252ZXJ0TGluZTE2VG84XzU1NShCWVRFICp0YXJnZXQsIEJZVEUgKnNvdXJjZSwgaW50IHdpZHRoX2luX3BpeGVscyk7CitETExfQVBJIHZvaWQgRExMX0NBTExDT05WIEZyZWVJbWFnZV9Db252ZXJ0TGluZTE2VG84XzU2NShCWVRFICp0YXJnZXQsIEJZVEUgKnNvdXJjZSwgaW50IHdpZHRoX2luX3BpeGVscyk7CitETExfQVBJIHZvaWQgRExMX0NBTExDT05WIEZyZWVJbWFnZV9Db252ZXJ0TGluZTI0VG84KEJZVEUgKnRhcmdldCwgQllURSAqc291cmNlLCBpbnQgd2lkdGhfaW5fcGl4ZWxzKTsKK0RMTF9BUEkgdm9pZCBETExfQ0FMTENPTlYgRnJlZUltYWdlX0NvbnZlcnRMaW5lMzJUbzgoQllURSAqdGFyZ2V0LCBCWVRFICpzb3VyY2UsIGludCB3aWR0aF9pbl9waXhlbHMpOworRExMX0FQSSB2b2lkIERMTF9DQUxMQ09OViBGcmVlSW1hZ2VfQ29udmVydExpbmUxVG8xNl81NTUoQllURSAqdGFyZ2V0LCBCWVRFICpzb3VyY2UsIGludCB3aWR0aF9pbl9waXhlbHMsIFJHQlFVQUQgKnBhbGV0dGUpOworRExMX0FQSSB2b2lkIERMTF9DQUxMQ09OViBGcmVlSW1hZ2VfQ29udmVydExpbmU0VG8xNl81NTUoQllURSAqdGFyZ2V0LCBCWVRFICpzb3VyY2UsIGludCB3aWR0aF9pbl9waXhlbHMsIFJHQlFVQUQgKnBhbGV0dGUpOworRExMX0FQSSB2b2lkIERMTF9DQUxMQ09OViBGcmVlSW1hZ2VfQ29udmVydExpbmU4VG8xNl81NTUoQllURSAqdGFyZ2V0LCBCWVRFICpzb3VyY2UsIGludCB3aWR0aF9pbl9waXhlbHMsIFJHQlFVQUQgKnBhbGV0dGUpOworRExMX0FQSSB2b2lkIERMTF9DQUxMQ09OViBGcmVlSW1hZ2VfQ29udmVydExpbmUxNl81NjVfVG8xNl81NTUoQllURSAqdGFyZ2V0LCBCWVRFICpzb3VyY2UsIGludCB3aWR0aF9pbl9waXhlbHMpOworRExMX0FQSSB2b2lkIERMTF9DQUxMQ09OViBGcmVlSW1hZ2VfQ29udmVydExpbmUyNFRvMTZfNTU1KEJZVEUgKnRhcmdldCwgQllURSAqc291cmNlLCBpbnQgd2lkdGhfaW5fcGl4ZWxzKTsKK0RMTF9BUEkgdm9pZCBETExfQ0FMTENPTlYgRnJlZUltYWdlX0NvbnZlcnRMaW5lMzJUbzE2XzU1NShCWVRFICp0YXJnZXQsIEJZVEUgKnNvdXJjZSwgaW50IHdpZHRoX2luX3BpeGVscyk7CitETExfQVBJIHZvaWQgRExMX0NBTExDT05WIEZyZWVJbWFnZV9Db252ZXJ0TGluZTFUbzE2XzU2NShCWVRFICp0YXJnZXQsIEJZVEUgKnNvdXJjZSwgaW50IHdpZHRoX2luX3BpeGVscywgUkdCUVVBRCAqcGFsZXR0ZSk7CitETExfQVBJIHZvaWQgRExMX0NBTExDT05WIEZyZWVJbWFnZV9Db252ZXJ0TGluZTRUbzE2XzU2NShCWVRFICp0YXJnZXQsIEJZVEUgKnNvdXJjZSwgaW50IHdpZHRoX2luX3BpeGVscywgUkdCUVVBRCAqcGFsZXR0ZSk7CitETExfQVBJIHZvaWQgRExMX0NBTExDT05WIEZyZWVJbWFnZV9Db252ZXJ0TGluZThUbzE2XzU2NShCWVRFICp0YXJnZXQsIEJZVEUgKnNvdXJjZSwgaW50IHdpZHRoX2luX3BpeGVscywgUkdCUVVBRCAqcGFsZXR0ZSk7CitETExfQVBJIHZvaWQgRExMX0NBTExDT05WIEZyZWVJbWFnZV9Db252ZXJ0TGluZTE2XzU1NV9UbzE2XzU2NShCWVRFICp0YXJnZXQsIEJZVEUgKnNvdXJjZSwgaW50IHdpZHRoX2luX3BpeGVscyk7CitETExfQVBJIHZvaWQgRExMX0NBTExDT05WIEZyZWVJbWFnZV9Db252ZXJ0TGluZTI0VG8xNl81NjUoQllURSAqdGFyZ2V0LCBCWVRFICpzb3VyY2UsIGludCB3aWR0aF9pbl9waXhlbHMpOworRExMX0FQSSB2b2lkIERMTF9DQUxMQ09OViBGcmVlSW1hZ2VfQ29udmVydExpbmUzMlRvMTZfNTY1KEJZVEUgKnRhcmdldCwgQllURSAqc291cmNlLCBpbnQgd2lkdGhfaW5fcGl4ZWxzKTsKK0RMTF9BUEkgdm9pZCBETExfQ0FMTENPTlYgRnJlZUltYWdlX0NvbnZlcnRMaW5lMVRvMjQoQllURSAqdGFyZ2V0LCBCWVRFICpzb3VyY2UsIGludCB3aWR0aF9pbl9waXhlbHMsIFJHQlFVQUQgKnBhbGV0dGUpOworRExMX0FQSSB2b2lkIERMTF9DQUxMQ09OViBGcmVlSW1hZ2VfQ29udmVydExpbmU0VG8yNChCWVRFICp0YXJnZXQsIEJZVEUgKnNvdXJjZSwgaW50IHdpZHRoX2luX3BpeGVscywgUkdCUVVBRCAqcGFsZXR0ZSk7CitETExfQVBJIHZvaWQgRExMX0NBTExDT05WIEZyZWVJbWFnZV9Db252ZXJ0TGluZThUbzI0KEJZVEUgKnRhcmdldCwgQllURSAqc291cmNlLCBpbnQgd2lkdGhfaW5fcGl4ZWxzLCBSR0JRVUFEICpwYWxldHRlKTsKK0RMTF9BUEkgdm9pZCBETExfQ0FMTENPTlYgRnJlZUltYWdlX0NvbnZlcnRMaW5lMTZUbzI0XzU1NShCWVRFICp0YXJnZXQsIEJZVEUgKnNvdXJjZSwgaW50IHdpZHRoX2luX3BpeGVscyk7CitETExfQVBJIHZvaWQgRExMX0NBTExDT05WIEZyZWVJbWFnZV9Db252ZXJ0TGluZTE2VG8yNF81NjUoQllURSAqdGFyZ2V0LCBCWVRFICpzb3VyY2UsIGludCB3aWR0aF9pbl9waXhlbHMpOworRExMX0FQSSB2b2lkIERMTF9DQUxMQ09OViBGcmVlSW1hZ2VfQ29udmVydExpbmUzMlRvMjQoQllURSAqdGFyZ2V0LCBCWVRFICpzb3VyY2UsIGludCB3aWR0aF9pbl9waXhlbHMpOworRExMX0FQSSB2b2lkIERMTF9DQUxMQ09OViBGcmVlSW1hZ2VfQ29udmVydExpbmUxVG8zMihCWVRFICp0YXJnZXQsIEJZVEUgKnNvdXJjZSwgaW50IHdpZHRoX2luX3BpeGVscywgUkdCUVVBRCAqcGFsZXR0ZSk7CitETExfQVBJIHZvaWQgRExMX0NBTExDT05WIEZyZWVJbWFnZV9Db252ZXJ0TGluZTRUbzMyKEJZVEUgKnRhcmdldCwgQllURSAqc291cmNlLCBpbnQgd2lkdGhfaW5fcGl4ZWxzLCBSR0JRVUFEICpwYWxldHRlKTsKK0RMTF9BUEkgdm9pZCBETExfQ0FMTENPTlYgRnJlZUltYWdlX0NvbnZlcnRMaW5lOFRvMzIoQllURSAqdGFyZ2V0LCBCWVRFICpzb3VyY2UsIGludCB3aWR0aF9pbl9waXhlbHMsIFJHQlFVQUQgKnBhbGV0dGUpOworRExMX0FQSSB2b2lkIERMTF9DQUxMQ09OViBGcmVlSW1hZ2VfQ29udmVydExpbmUxNlRvMzJfNTU1KEJZVEUgKnRhcmdldCwgQllURSAqc291cmNlLCBpbnQgd2lkdGhfaW5fcGl4ZWxzKTsKK0RMTF9BUEkgdm9pZCBETExfQ0FMTENPTlYgRnJlZUltYWdlX0NvbnZlcnRMaW5lMTZUbzMyXzU2NShCWVRFICp0YXJnZXQsIEJZVEUgKnNvdXJjZSwgaW50IHdpZHRoX2luX3BpeGVscyk7CitETExfQVBJIHZvaWQgRExMX0NBTExDT05WIEZyZWVJbWFnZV9Db252ZXJ0TGluZTI0VG8zMihCWVRFICp0YXJnZXQsIEJZVEUgKnNvdXJjZSwgaW50IHdpZHRoX2luX3BpeGVscyk7CisKKy8vIFNtYXJ0IGNvbnZlcnNpb24gcm91dGluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0RMTF9BUEkgRklCSVRNQVAgKkRMTF9DQUxMQ09OViBGcmVlSW1hZ2VfQ29udmVydFRvNEJpdHMoRklCSVRNQVAgKmRpYik7CitETExfQVBJIEZJQklUTUFQICpETExfQ0FMTENPTlYgRnJlZUltYWdlX0NvbnZlcnRUbzhCaXRzKEZJQklUTUFQICpkaWIpOworRExMX0FQSSBGSUJJVE1BUCAqRExMX0NBTExDT05WIEZyZWVJbWFnZV9Db252ZXJ0VG9HcmV5c2NhbGUoRklCSVRNQVAgKmRpYik7CitETExfQVBJIEZJQklUTUFQICpETExfQ0FMTENPTlYgRnJlZUltYWdlX0NvbnZlcnRUbzE2Qml0czU1NShGSUJJVE1BUCAqZGliKTsKK0RMTF9BUEkgRklCSVRNQVAgKkRMTF9DQUxMQ09OViBGcmVlSW1hZ2VfQ29udmVydFRvMTZCaXRzNTY1KEZJQklUTUFQICpkaWIpOworRExMX0FQSSBGSUJJVE1BUCAqRExMX0NBTExDT05WIEZyZWVJbWFnZV9Db252ZXJ0VG8yNEJpdHMoRklCSVRNQVAgKmRpYik7CitETExfQVBJIEZJQklUTUFQICpETExfQ0FMTENPTlYgRnJlZUltYWdlX0NvbnZlcnRUbzMyQml0cyhGSUJJVE1BUCAqZGliKTsKK0RMTF9BUEkgRklCSVRNQVAgKkRMTF9DQUxMQ09OViBGcmVlSW1hZ2VfQ29sb3JRdWFudGl6ZShGSUJJVE1BUCAqZGliLCBGUkVFX0lNQUdFX1FVQU5USVpFIHF1YW50aXplKTsKK0RMTF9BUEkgRklCSVRNQVAgKkRMTF9DQUxMQ09OViBGcmVlSW1hZ2VfQ29sb3JRdWFudGl6ZUV4KEZJQklUTUFQICpkaWIsIEZSRUVfSU1BR0VfUVVBTlRJWkUgcXVhbnRpemUgRklfREVGQVVMVChGSVFfV1VRVUFOVCksIGludCBQYWxldHRlU2l6ZSBGSV9ERUZBVUxUKDI1NiksIGludCBSZXNlcnZlU2l6ZSBGSV9ERUZBVUxUKDApLCBSR0JRVUFEICpSZXNlcnZlUGFsZXR0ZSBGSV9ERUZBVUxUKE5VTEwpKTsKK0RMTF9BUEkgRklCSVRNQVAgKkRMTF9DQUxMQ09OViBGcmVlSW1hZ2VfVGhyZXNob2xkKEZJQklUTUFQICpkaWIsIEJZVEUgVCk7CitETExfQVBJIEZJQklUTUFQICpETExfQ0FMTENPTlYgRnJlZUltYWdlX0RpdGhlcihGSUJJVE1BUCAqZGliLCBGUkVFX0lNQUdFX0RJVEhFUiBhbGdvcml0aG0pOworCitETExfQVBJIEZJQklUTUFQICpETExfQ0FMTENPTlYgRnJlZUltYWdlX0NvbnZlcnRGcm9tUmF3Qml0cyhCWVRFICpiaXRzLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBwaXRjaCwgdW5zaWduZWQgYnBwLCB1bnNpZ25lZCByZWRfbWFzaywgdW5zaWduZWQgZ3JlZW5fbWFzaywgdW5zaWduZWQgYmx1ZV9tYXNrLCBCT09MIHRvcGRvd24gRklfREVGQVVMVChGQUxTRSkpOworRExMX0FQSSBGSUJJVE1BUCAqRExMX0NBTExDT05WIEZyZWVJbWFnZV9Db252ZXJ0RnJvbVJhd0JpdHNFeChCT09MIGNvcHlTb3VyY2UsIEJZVEUgKmJpdHMsIEZSRUVfSU1BR0VfVFlQRSB0eXBlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBwaXRjaCwgdW5zaWduZWQgYnBwLCB1bnNpZ25lZCByZWRfbWFzaywgdW5zaWduZWQgZ3JlZW5fbWFzaywgdW5zaWduZWQgYmx1ZV9tYXNrLCBCT09MIHRvcGRvd24gRklfREVGQVVMVChGQUxTRSkpOworRExMX0FQSSB2b2lkIERMTF9DQUxMQ09OViBGcmVlSW1hZ2VfQ29udmVydFRvUmF3Qml0cyhCWVRFICpiaXRzLCBGSUJJVE1BUCAqZGliLCBpbnQgcGl0Y2gsIHVuc2lnbmVkIGJwcCwgdW5zaWduZWQgcmVkX21hc2ssIHVuc2lnbmVkIGdyZWVuX21hc2ssIHVuc2lnbmVkIGJsdWVfbWFzaywgQk9PTCB0b3Bkb3duIEZJX0RFRkFVTFQoRkFMU0UpKTsKKworRExMX0FQSSBGSUJJVE1BUCAqRExMX0NBTExDT05WIEZyZWVJbWFnZV9Db252ZXJ0VG9GbG9hdChGSUJJVE1BUCAqZGliKTsKK0RMTF9BUEkgRklCSVRNQVAgKkRMTF9DQUxMQ09OViBGcmVlSW1hZ2VfQ29udmVydFRvUkdCRihGSUJJVE1BUCAqZGliKTsKK0RMTF9BUEkgRklCSVRNQVAgKkRMTF9DQUxMQ09OViBGcmVlSW1hZ2VfQ29udmVydFRvUkdCQUYoRklCSVRNQVAgKmRpYik7CitETExfQVBJIEZJQklUTUFQICpETExfQ0FMTENPTlYgRnJlZUltYWdlX0NvbnZlcnRUb1VJTlQxNihGSUJJVE1BUCAqZGliKTsKK0RMTF9BUEkgRklCSVRNQVAgKkRMTF9DQUxMQ09OViBGcmVlSW1hZ2VfQ29udmVydFRvUkdCMTYoRklCSVRNQVAgKmRpYik7CitETExfQVBJIEZJQklUTUFQICpETExfQ0FMTENPTlYgRnJlZUltYWdlX0NvbnZlcnRUb1JHQkExNihGSUJJVE1BUCAqZGliKTsKKworRExMX0FQSSBGSUJJVE1BUCAqRExMX0NBTExDT05WIEZyZWVJbWFnZV9Db252ZXJ0VG9TdGFuZGFyZFR5cGUoRklCSVRNQVAgKnNyYywgQk9PTCBzY2FsZV9saW5lYXIgRklfREVGQVVMVChUUlVFKSk7CitETExfQVBJIEZJQklUTUFQICpETExfQ0FMTENPTlYgRnJlZUltYWdlX0NvbnZlcnRUb1R5cGUoRklCSVRNQVAgKnNyYywgRlJFRV9JTUFHRV9UWVBFIGRzdF90eXBlLCBCT09MIHNjYWxlX2xpbmVhciBGSV9ERUZBVUxUKFRSVUUpKTsKKworLy8gVG9uZSBtYXBwaW5nIG9wZXJhdG9ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRExMX0FQSSBGSUJJVE1BUCAqRExMX0NBTExDT05WIEZyZWVJbWFnZV9Ub25lTWFwcGluZyhGSUJJVE1BUCAqZGliLCBGUkVFX0lNQUdFX1RNTyB0bW8sIGRvdWJsZSBmaXJzdF9wYXJhbSBGSV9ERUZBVUxUKDApLCBkb3VibGUgc2Vjb25kX3BhcmFtIEZJX0RFRkFVTFQoMCkpOworRExMX0FQSSBGSUJJVE1BUCAqRExMX0NBTExDT05WIEZyZWVJbWFnZV9UbW9EcmFnbzAzKEZJQklUTUFQICpzcmMsIGRvdWJsZSBnYW1tYSBGSV9ERUZBVUxUKDIuMiksIGRvdWJsZSBleHBvc3VyZSBGSV9ERUZBVUxUKDApKTsKK0RMTF9BUEkgRklCSVRNQVAgKkRMTF9DQUxMQ09OViBGcmVlSW1hZ2VfVG1vUmVpbmhhcmQwNShGSUJJVE1BUCAqc3JjLCBkb3VibGUgaW50ZW5zaXR5IEZJX0RFRkFVTFQoMCksIGRvdWJsZSBjb250cmFzdCBGSV9ERUZBVUxUKDApKTsKK0RMTF9BUEkgRklCSVRNQVAgKkRMTF9DQUxMQ09OViBGcmVlSW1hZ2VfVG1vUmVpbmhhcmQwNUV4KEZJQklUTUFQICpzcmMsIGRvdWJsZSBpbnRlbnNpdHkgRklfREVGQVVMVCgwKSwgZG91YmxlIGNvbnRyYXN0IEZJX0RFRkFVTFQoMCksIGRvdWJsZSBhZGFwdGF0aW9uIEZJX0RFRkFVTFQoMSksIGRvdWJsZSBjb2xvcl9jb3JyZWN0aW9uIEZJX0RFRkFVTFQoMCkpOworCitETExfQVBJIEZJQklUTUFQICpETExfQ0FMTENPTlYgRnJlZUltYWdlX1Rtb0ZhdHRhbDAyKEZJQklUTUFQICpzcmMsIGRvdWJsZSBjb2xvcl9zYXR1cmF0aW9uIEZJX0RFRkFVTFQoMC41KSwgZG91YmxlIGF0dGVudWF0aW9uIEZJX0RFRkFVTFQoMC44NSkpOworCisvLyBaTGliIGludGVyZmFjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitETExfQVBJIERXT1JEIERMTF9DQUxMQ09OViBGcmVlSW1hZ2VfWkxpYkNvbXByZXNzKEJZVEUgKnRhcmdldCwgRFdPUkQgdGFyZ2V0X3NpemUsIEJZVEUgKnNvdXJjZSwgRFdPUkQgc291cmNlX3NpemUpOworRExMX0FQSSBEV09SRCBETExfQ0FMTENPTlYgRnJlZUltYWdlX1pMaWJVbmNvbXByZXNzKEJZVEUgKnRhcmdldCwgRFdPUkQgdGFyZ2V0X3NpemUsIEJZVEUgKnNvdXJjZSwgRFdPUkQgc291cmNlX3NpemUpOworRExMX0FQSSBEV09SRCBETExfQ0FMTENPTlYgRnJlZUltYWdlX1pMaWJHWmlwKEJZVEUgKnRhcmdldCwgRFdPUkQgdGFyZ2V0X3NpemUsIEJZVEUgKnNvdXJjZSwgRFdPUkQgc291cmNlX3NpemUpOworRExMX0FQSSBEV09SRCBETExfQ0FMTENPTlYgRnJlZUltYWdlX1pMaWJHVW56aXAoQllURSAqdGFyZ2V0LCBEV09SRCB0YXJnZXRfc2l6ZSwgQllURSAqc291cmNlLCBEV09SRCBzb3VyY2Vfc2l6ZSk7CitETExfQVBJIERXT1JEIERMTF9DQUxMQ09OViBGcmVlSW1hZ2VfWkxpYkNSQzMyKERXT1JEIGNyYywgQllURSAqc291cmNlLCBEV09SRCBzb3VyY2Vfc2l6ZSk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNZXRhZGF0YSByb3V0aW5lcworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gdGFnIGNyZWF0aW9uIC8gZGVzdHJ1Y3Rpb24KK0RMTF9BUEkgRklUQUcgKkRMTF9DQUxMQ09OViBGcmVlSW1hZ2VfQ3JlYXRlVGFnKHZvaWQpOworRExMX0FQSSB2b2lkIERMTF9DQUxMQ09OViBGcmVlSW1hZ2VfRGVsZXRlVGFnKEZJVEFHICp0YWcpOworRExMX0FQSSBGSVRBRyAqRExMX0NBTExDT05WIEZyZWVJbWFnZV9DbG9uZVRhZyhGSVRBRyAqdGFnKTsKKworLy8gdGFnIGdldHRlcnMgYW5kIHNldHRlcnMKK0RMTF9BUEkgY29uc3QgY2hhciAqRExMX0NBTExDT05WIEZyZWVJbWFnZV9HZXRUYWdLZXkoRklUQUcgKnRhZyk7CitETExfQVBJIGNvbnN0IGNoYXIgKkRMTF9DQUxMQ09OViBGcmVlSW1hZ2VfR2V0VGFnRGVzY3JpcHRpb24oRklUQUcgKnRhZyk7CitETExfQVBJIFdPUkQgRExMX0NBTExDT05WIEZyZWVJbWFnZV9HZXRUYWdJRChGSVRBRyAqdGFnKTsKK0RMTF9BUEkgRlJFRV9JTUFHRV9NRFRZUEUgRExMX0NBTExDT05WIEZyZWVJbWFnZV9HZXRUYWdUeXBlKEZJVEFHICp0YWcpOworRExMX0FQSSBEV09SRCBETExfQ0FMTENPTlYgRnJlZUltYWdlX0dldFRhZ0NvdW50KEZJVEFHICp0YWcpOworRExMX0FQSSBEV09SRCBETExfQ0FMTENPTlYgRnJlZUltYWdlX0dldFRhZ0xlbmd0aChGSVRBRyAqdGFnKTsKK0RMTF9BUEkgY29uc3Qgdm9pZCAqRExMX0NBTExDT05WIEZyZWVJbWFnZV9HZXRUYWdWYWx1ZShGSVRBRyAqdGFnKTsKKworRExMX0FQSSBCT09MIERMTF9DQUxMQ09OViBGcmVlSW1hZ2VfU2V0VGFnS2V5KEZJVEFHICp0YWcsIGNvbnN0IGNoYXIgKmtleSk7CitETExfQVBJIEJPT0wgRExMX0NBTExDT05WIEZyZWVJbWFnZV9TZXRUYWdEZXNjcmlwdGlvbihGSVRBRyAqdGFnLCBjb25zdCBjaGFyICpkZXNjcmlwdGlvbik7CitETExfQVBJIEJPT0wgRExMX0NBTExDT05WIEZyZWVJbWFnZV9TZXRUYWdJRChGSVRBRyAqdGFnLCBXT1JEIGlkKTsKK0RMTF9BUEkgQk9PTCBETExfQ0FMTENPTlYgRnJlZUltYWdlX1NldFRhZ1R5cGUoRklUQUcgKnRhZywgRlJFRV9JTUFHRV9NRFRZUEUgdHlwZSk7CitETExfQVBJIEJPT0wgRExMX0NBTExDT05WIEZyZWVJbWFnZV9TZXRUYWdDb3VudChGSVRBRyAqdGFnLCBEV09SRCBjb3VudCk7CitETExfQVBJIEJPT0wgRExMX0NBTExDT05WIEZyZWVJbWFnZV9TZXRUYWdMZW5ndGgoRklUQUcgKnRhZywgRFdPUkQgbGVuZ3RoKTsKK0RMTF9BUEkgQk9PTCBETExfQ0FMTENPTlYgRnJlZUltYWdlX1NldFRhZ1ZhbHVlKEZJVEFHICp0YWcsIGNvbnN0IHZvaWQgKnZhbHVlKTsKKworLy8gaXRlcmF0b3IKK0RMTF9BUEkgRklNRVRBREFUQSAqRExMX0NBTExDT05WIEZyZWVJbWFnZV9GaW5kRmlyc3RNZXRhZGF0YShGUkVFX0lNQUdFX01ETU9ERUwgbW9kZWwsIEZJQklUTUFQICpkaWIsIEZJVEFHICoqdGFnKTsKK0RMTF9BUEkgQk9PTCBETExfQ0FMTENPTlYgRnJlZUltYWdlX0ZpbmROZXh0TWV0YWRhdGEoRklNRVRBREFUQSAqbWRoYW5kbGUsIEZJVEFHICoqdGFnKTsKK0RMTF9BUEkgdm9pZCBETExfQ0FMTENPTlYgRnJlZUltYWdlX0ZpbmRDbG9zZU1ldGFkYXRhKEZJTUVUQURBVEEgKm1kaGFuZGxlKTsKKworLy8gbWV0YWRhdGEgc2V0dGVyIGFuZCBnZXR0ZXIKK0RMTF9BUEkgQk9PTCBETExfQ0FMTENPTlYgRnJlZUltYWdlX1NldE1ldGFkYXRhKEZSRUVfSU1BR0VfTURNT0RFTCBtb2RlbCwgRklCSVRNQVAgKmRpYiwgY29uc3QgY2hhciAqa2V5LCBGSVRBRyAqdGFnKTsKK0RMTF9BUEkgQk9PTCBETExfQ0FMTENPTlYgRnJlZUltYWdlX0dldE1ldGFkYXRhKEZSRUVfSU1BR0VfTURNT0RFTCBtb2RlbCwgRklCSVRNQVAgKmRpYiwgY29uc3QgY2hhciAqa2V5LCBGSVRBRyAqKnRhZyk7CitETExfQVBJIEJPT0wgRExMX0NBTExDT05WIEZyZWVJbWFnZV9TZXRNZXRhZGF0YUtleVZhbHVlKEZSRUVfSU1BR0VfTURNT0RFTCBtb2RlbCwgRklCSVRNQVAgKmRpYiwgY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICp2YWx1ZSk7CisKKy8vIGhlbHBlcnMKK0RMTF9BUEkgdW5zaWduZWQgRExMX0NBTExDT05WIEZyZWVJbWFnZV9HZXRNZXRhZGF0YUNvdW50KEZSRUVfSU1BR0VfTURNT0RFTCBtb2RlbCwgRklCSVRNQVAgKmRpYik7CitETExfQVBJIEJPT0wgRExMX0NBTExDT05WIEZyZWVJbWFnZV9DbG9uZU1ldGFkYXRhKEZJQklUTUFQICpkc3QsIEZJQklUTUFQICpzcmMpOworCisvLyB0YWcgdG8gQyBzdHJpbmcgY29udmVyc2lvbgorRExMX0FQSSBjb25zdCBjaGFyKiBETExfQ0FMTENPTlYgRnJlZUltYWdlX1RhZ1RvU3RyaW5nKEZSRUVfSU1BR0VfTURNT0RFTCBtb2RlbCwgRklUQUcgKnRhZywgY2hhciAqTWFrZSBGSV9ERUZBVUxUKE5VTEwpKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEpQRUcgbG9zc2xlc3MgdHJhbnNmb3JtYXRpb24gcm91dGluZXMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0RMTF9BUEkgQk9PTCBETExfQ0FMTENPTlYgRnJlZUltYWdlX0pQRUdUcmFuc2Zvcm0oY29uc3QgY2hhciAqc3JjX2ZpbGUsIGNvbnN0IGNoYXIgKmRzdF9maWxlLCBGUkVFX0lNQUdFX0pQRUdfT1BFUkFUSU9OIG9wZXJhdGlvbiwgQk9PTCBwZXJmZWN0IEZJX0RFRkFVTFQoVFJVRSkpOworRExMX0FQSSBCT09MIERMTF9DQUxMQ09OViBGcmVlSW1hZ2VfSlBFR1RyYW5zZm9ybVUoY29uc3Qgd2NoYXJfdCAqc3JjX2ZpbGUsIGNvbnN0IHdjaGFyX3QgKmRzdF9maWxlLCBGUkVFX0lNQUdFX0pQRUdfT1BFUkFUSU9OIG9wZXJhdGlvbiwgQk9PTCBwZXJmZWN0IEZJX0RFRkFVTFQoVFJVRSkpOworRExMX0FQSSBCT09MIERMTF9DQUxMQ09OViBGcmVlSW1hZ2VfSlBFR0Nyb3AoY29uc3QgY2hhciAqc3JjX2ZpbGUsIGNvbnN0IGNoYXIgKmRzdF9maWxlLCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHJpZ2h0LCBpbnQgYm90dG9tKTsKK0RMTF9BUEkgQk9PTCBETExfQ0FMTENPTlYgRnJlZUltYWdlX0pQRUdDcm9wVShjb25zdCB3Y2hhcl90ICpzcmNfZmlsZSwgY29uc3Qgd2NoYXJfdCAqZHN0X2ZpbGUsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgcmlnaHQsIGludCBib3R0b20pOworRExMX0FQSSBCT09MIERMTF9DQUxMQ09OViBGcmVlSW1hZ2VfSlBFR1RyYW5zZm9ybUZyb21IYW5kbGUoRnJlZUltYWdlSU8qIHNyY19pbywgZmlfaGFuZGxlIHNyY19oYW5kbGUsIEZyZWVJbWFnZUlPKiBkc3RfaW8sIGZpX2hhbmRsZSBkc3RfaGFuZGxlLCBGUkVFX0lNQUdFX0pQRUdfT1BFUkFUSU9OIG9wZXJhdGlvbiwgaW50KiBsZWZ0LCBpbnQqIHRvcCwgaW50KiByaWdodCwgaW50KiBib3R0b20sIEJPT0wgcGVyZmVjdCBGSV9ERUZBVUxUKFRSVUUpKTsKK0RMTF9BUEkgQk9PTCBETExfQ0FMTENPTlYgRnJlZUltYWdlX0pQRUdUcmFuc2Zvcm1Db21iaW5lZChjb25zdCBjaGFyICpzcmNfZmlsZSwgY29uc3QgY2hhciAqZHN0X2ZpbGUsIEZSRUVfSU1BR0VfSlBFR19PUEVSQVRJT04gb3BlcmF0aW9uLCBpbnQqIGxlZnQsIGludCogdG9wLCBpbnQqIHJpZ2h0LCBpbnQqIGJvdHRvbSwgQk9PTCBwZXJmZWN0IEZJX0RFRkFVTFQoVFJVRSkpOworRExMX0FQSSBCT09MIERMTF9DQUxMQ09OViBGcmVlSW1hZ2VfSlBFR1RyYW5zZm9ybUNvbWJpbmVkVShjb25zdCB3Y2hhcl90ICpzcmNfZmlsZSwgY29uc3Qgd2NoYXJfdCAqZHN0X2ZpbGUsIEZSRUVfSU1BR0VfSlBFR19PUEVSQVRJT04gb3BlcmF0aW9uLCBpbnQqIGxlZnQsIGludCogdG9wLCBpbnQqIHJpZ2h0LCBpbnQqIGJvdHRvbSwgQk9PTCBwZXJmZWN0IEZJX0RFRkFVTFQoVFJVRSkpOworRExMX0FQSSBCT09MIERMTF9DQUxMQ09OViBGcmVlSW1hZ2VfSlBFR1RyYW5zZm9ybUNvbWJpbmVkRnJvbU1lbW9yeShGSU1FTU9SWSogc3JjX3N0cmVhbSwgRklNRU1PUlkqIGRzdF9zdHJlYW0sIEZSRUVfSU1BR0VfSlBFR19PUEVSQVRJT04gb3BlcmF0aW9uLCBpbnQqIGxlZnQsIGludCogdG9wLCBpbnQqIHJpZ2h0LCBpbnQqIGJvdHRvbSwgQk9PTCBwZXJmZWN0IEZJX0RFRkFVTFQoVFJVRSkpOworCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbWFnZSBtYW5pcHVsYXRpb24gdG9vbGtpdAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gcm90YXRpb24gYW5kIGZsaXBwaW5nCisvLy8gQGRlcHJlY2F0ZWQgc2VlIEZyZWVJbWFnZV9Sb3RhdGUKK0RMTF9BUEkgRklCSVRNQVAgKkRMTF9DQUxMQ09OViBGcmVlSW1hZ2VfUm90YXRlQ2xhc3NpYyhGSUJJVE1BUCAqZGliLCBkb3VibGUgYW5nbGUpOworRExMX0FQSSBGSUJJVE1BUCAqRExMX0NBTExDT05WIEZyZWVJbWFnZV9Sb3RhdGUoRklCSVRNQVAgKmRpYiwgZG91YmxlIGFuZ2xlLCBjb25zdCB2b2lkICpia2NvbG9yIEZJX0RFRkFVTFQoTlVMTCkpOworRExMX0FQSSBGSUJJVE1BUCAqRExMX0NBTExDT05WIEZyZWVJbWFnZV9Sb3RhdGVFeChGSUJJVE1BUCAqZGliLCBkb3VibGUgYW5nbGUsIGRvdWJsZSB4X3NoaWZ0LCBkb3VibGUgeV9zaGlmdCwgZG91YmxlIHhfb3JpZ2luLCBkb3VibGUgeV9vcmlnaW4sIEJPT0wgdXNlX21hc2spOworRExMX0FQSSBCT09MIERMTF9DQUxMQ09OViBGcmVlSW1hZ2VfRmxpcEhvcml6b250YWwoRklCSVRNQVAgKmRpYik7CitETExfQVBJIEJPT0wgRExMX0NBTExDT05WIEZyZWVJbWFnZV9GbGlwVmVydGljYWwoRklCSVRNQVAgKmRpYik7CisKKy8vIHVwc2FtcGxpbmcgLyBkb3duc2FtcGxpbmcKK0RMTF9BUEkgRklCSVRNQVAgKkRMTF9DQUxMQ09OViBGcmVlSW1hZ2VfUmVzY2FsZShGSUJJVE1BUCAqZGliLCBpbnQgZHN0X3dpZHRoLCBpbnQgZHN0X2hlaWdodCwgRlJFRV9JTUFHRV9GSUxURVIgZmlsdGVyIEZJX0RFRkFVTFQoRklMVEVSX0NBVE1VTExST00pKTsKK0RMTF9BUEkgRklCSVRNQVAgKkRMTF9DQUxMQ09OViBGcmVlSW1hZ2VfTWFrZVRodW1ibmFpbChGSUJJVE1BUCAqZGliLCBpbnQgbWF4X3BpeGVsX3NpemUsIEJPT0wgY29udmVydCBGSV9ERUZBVUxUKFRSVUUpKTsKK0RMTF9BUEkgRklCSVRNQVAgKkRMTF9DQUxMQ09OViBGcmVlSW1hZ2VfUmVzY2FsZVJlY3QoRklCSVRNQVAgKmRpYiwgaW50IGRzdF93aWR0aCwgaW50IGRzdF9oZWlnaHQsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgcmlnaHQsIGludCBib3R0b20sIEZSRUVfSU1BR0VfRklMVEVSIGZpbHRlciBGSV9ERUZBVUxUKEZJTFRFUl9DQVRNVUxMUk9NKSwgdW5zaWduZWQgZmxhZ3MgRklfREVGQVVMVCgwKSk7CisKKy8vIGNvbG9yIG1hbmlwdWxhdGlvbiByb3V0aW5lcyAocG9pbnQgb3BlcmF0aW9ucykKK0RMTF9BUEkgQk9PTCBETExfQ0FMTENPTlYgRnJlZUltYWdlX0FkanVzdEN1cnZlKEZJQklUTUFQICpkaWIsIEJZVEUgKkxVVCwgRlJFRV9JTUFHRV9DT0xPUl9DSEFOTkVMIGNoYW5uZWwpOworRExMX0FQSSBCT09MIERMTF9DQUxMQ09OViBGcmVlSW1hZ2VfQWRqdXN0R2FtbWEoRklCSVRNQVAgKmRpYiwgZG91YmxlIGdhbW1hKTsKK0RMTF9BUEkgQk9PTCBETExfQ0FMTENPTlYgRnJlZUltYWdlX0FkanVzdEJyaWdodG5lc3MoRklCSVRNQVAgKmRpYiwgZG91YmxlIHBlcmNlbnRhZ2UpOworRExMX0FQSSBCT09MIERMTF9DQUxMQ09OViBGcmVlSW1hZ2VfQWRqdXN0Q29udHJhc3QoRklCSVRNQVAgKmRpYiwgZG91YmxlIHBlcmNlbnRhZ2UpOworRExMX0FQSSBCT09MIERMTF9DQUxMQ09OViBGcmVlSW1hZ2VfSW52ZXJ0KEZJQklUTUFQICpkaWIpOworRExMX0FQSSBCT09MIERMTF9DQUxMQ09OViBGcmVlSW1hZ2VfR2V0SGlzdG9ncmFtKEZJQklUTUFQICpkaWIsIERXT1JEICpoaXN0bywgRlJFRV9JTUFHRV9DT0xPUl9DSEFOTkVMIGNoYW5uZWwgRklfREVGQVVMVChGSUNDX0JMQUNLKSk7CitETExfQVBJIGludCBETExfQ0FMTENPTlYgRnJlZUltYWdlX0dldEFkanVzdENvbG9yc0xvb2t1cFRhYmxlKEJZVEUgKkxVVCwgZG91YmxlIGJyaWdodG5lc3MsIGRvdWJsZSBjb250cmFzdCwgZG91YmxlIGdhbW1hLCBCT09MIGludmVydCk7CitETExfQVBJIEJPT0wgRExMX0NBTExDT05WIEZyZWVJbWFnZV9BZGp1c3RDb2xvcnMoRklCSVRNQVAgKmRpYiwgZG91YmxlIGJyaWdodG5lc3MsIGRvdWJsZSBjb250cmFzdCwgZG91YmxlIGdhbW1hLCBCT09MIGludmVydCBGSV9ERUZBVUxUKEZBTFNFKSk7CitETExfQVBJIHVuc2lnbmVkIERMTF9DQUxMQ09OViBGcmVlSW1hZ2VfQXBwbHlDb2xvck1hcHBpbmcoRklCSVRNQVAgKmRpYiwgUkdCUVVBRCAqc3JjY29sb3JzLCBSR0JRVUFEICpkc3Rjb2xvcnMsIHVuc2lnbmVkIGNvdW50LCBCT09MIGlnbm9yZV9hbHBoYSwgQk9PTCBzd2FwKTsKK0RMTF9BUEkgdW5zaWduZWQgRExMX0NBTExDT05WIEZyZWVJbWFnZV9Td2FwQ29sb3JzKEZJQklUTUFQICpkaWIsIFJHQlFVQUQgKmNvbG9yX2EsIFJHQlFVQUQgKmNvbG9yX2IsIEJPT0wgaWdub3JlX2FscGhhKTsKK0RMTF9BUEkgdW5zaWduZWQgRExMX0NBTExDT05WIEZyZWVJbWFnZV9BcHBseVBhbGV0dGVJbmRleE1hcHBpbmcoRklCSVRNQVAgKmRpYiwgQllURSAqc3JjaW5kaWNlcywJQllURSAqZHN0aW5kaWNlcywgdW5zaWduZWQgY291bnQsIEJPT0wgc3dhcCk7CitETExfQVBJIHVuc2lnbmVkIERMTF9DQUxMQ09OViBGcmVlSW1hZ2VfU3dhcFBhbGV0dGVJbmRpY2VzKEZJQklUTUFQICpkaWIsIEJZVEUgKmluZGV4X2EsIEJZVEUgKmluZGV4X2IpOworCisvLyBjaGFubmVsIHByb2Nlc3Npbmcgcm91dGluZXMKK0RMTF9BUEkgRklCSVRNQVAgKkRMTF9DQUxMQ09OViBGcmVlSW1hZ2VfR2V0Q2hhbm5lbChGSUJJVE1BUCAqZGliLCBGUkVFX0lNQUdFX0NPTE9SX0NIQU5ORUwgY2hhbm5lbCk7CitETExfQVBJIEJPT0wgRExMX0NBTExDT05WIEZyZWVJbWFnZV9TZXRDaGFubmVsKEZJQklUTUFQICpkc3QsIEZJQklUTUFQICpzcmMsIEZSRUVfSU1BR0VfQ09MT1JfQ0hBTk5FTCBjaGFubmVsKTsKK0RMTF9BUEkgRklCSVRNQVAgKkRMTF9DQUxMQ09OViBGcmVlSW1hZ2VfR2V0Q29tcGxleENoYW5uZWwoRklCSVRNQVAgKnNyYywgRlJFRV9JTUFHRV9DT0xPUl9DSEFOTkVMIGNoYW5uZWwpOworRExMX0FQSSBCT09MIERMTF9DQUxMQ09OViBGcmVlSW1hZ2VfU2V0Q29tcGxleENoYW5uZWwoRklCSVRNQVAgKmRzdCwgRklCSVRNQVAgKnNyYywgRlJFRV9JTUFHRV9DT0xPUl9DSEFOTkVMIGNoYW5uZWwpOworCisvLyBjb3B5IC8gcGFzdGUgLyBjb21wb3NpdGUgcm91dGluZXMKK0RMTF9BUEkgRklCSVRNQVAgKkRMTF9DQUxMQ09OViBGcmVlSW1hZ2VfQ29weShGSUJJVE1BUCAqZGliLCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHJpZ2h0LCBpbnQgYm90dG9tKTsKK0RMTF9BUEkgQk9PTCBETExfQ0FMTENPTlYgRnJlZUltYWdlX1Bhc3RlKEZJQklUTUFQICpkc3QsIEZJQklUTUFQICpzcmMsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgYWxwaGEpOworRExMX0FQSSBGSUJJVE1BUCAqRExMX0NBTExDT05WIEZyZWVJbWFnZV9DcmVhdGVWaWV3KEZJQklUTUFQICpkaWIsIHVuc2lnbmVkIGxlZnQsIHVuc2lnbmVkIHRvcCwgdW5zaWduZWQgcmlnaHQsIHVuc2lnbmVkIGJvdHRvbSk7CisKK0RMTF9BUEkgRklCSVRNQVAgKkRMTF9DQUxMQ09OViBGcmVlSW1hZ2VfQ29tcG9zaXRlKEZJQklUTUFQICpmZywgQk9PTCB1c2VGaWxlQmtnIEZJX0RFRkFVTFQoRkFMU0UpLCBSR0JRVUFEICphcHBCa0NvbG9yIEZJX0RFRkFVTFQoTlVMTCksIEZJQklUTUFQICpiZyBGSV9ERUZBVUxUKE5VTEwpKTsKK0RMTF9BUEkgQk9PTCBETExfQ0FMTENPTlYgRnJlZUltYWdlX1ByZU11bHRpcGx5V2l0aEFscGhhKEZJQklUTUFQICpkaWIpOworCisvLyBiYWNrZ3JvdW5kIGZpbGxpbmcgcm91dGluZXMKK0RMTF9BUEkgQk9PTCBETExfQ0FMTENPTlYgRnJlZUltYWdlX0ZpbGxCYWNrZ3JvdW5kKEZJQklUTUFQICpkaWIsIGNvbnN0IHZvaWQgKmNvbG9yLCBpbnQgb3B0aW9ucyBGSV9ERUZBVUxUKDApKTsKK0RMTF9BUEkgRklCSVRNQVAgKkRMTF9DQUxMQ09OViBGcmVlSW1hZ2VfRW5sYXJnZUNhbnZhcyhGSUJJVE1BUCAqc3JjLCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHJpZ2h0LCBpbnQgYm90dG9tLCBjb25zdCB2b2lkICpjb2xvciwgaW50IG9wdGlvbnMgRklfREVGQVVMVCgwKSk7CitETExfQVBJIEZJQklUTUFQICpETExfQ0FMTENPTlYgRnJlZUltYWdlX0FsbG9jYXRlRXgoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLCBjb25zdCBSR0JRVUFEICpjb2xvciwgaW50IG9wdGlvbnMgRklfREVGQVVMVCgwKSwgY29uc3QgUkdCUVVBRCAqcGFsZXR0ZSBGSV9ERUZBVUxUKE5VTEwpLCB1bnNpZ25lZCByZWRfbWFzayBGSV9ERUZBVUxUKDApLCB1bnNpZ25lZCBncmVlbl9tYXNrIEZJX0RFRkFVTFQoMCksIHVuc2lnbmVkIGJsdWVfbWFzayBGSV9ERUZBVUxUKDApKTsKK0RMTF9BUEkgRklCSVRNQVAgKkRMTF9DQUxMQ09OViBGcmVlSW1hZ2VfQWxsb2NhdGVFeFQoRlJFRV9JTUFHRV9UWVBFIHR5cGUsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgY29uc3Qgdm9pZCAqY29sb3IsIGludCBvcHRpb25zIEZJX0RFRkFVTFQoMCksIGNvbnN0IFJHQlFVQUQgKnBhbGV0dGUgRklfREVGQVVMVChOVUxMKSwgdW5zaWduZWQgcmVkX21hc2sgRklfREVGQVVMVCgwKSwgdW5zaWduZWQgZ3JlZW5fbWFzayBGSV9ERUZBVUxUKDApLCB1bnNpZ25lZCBibHVlX21hc2sgRklfREVGQVVMVCgwKSk7CisKKy8vIG1pc2NlbGxhbmVvdXMgYWxnb3JpdGhtcworRExMX0FQSSBGSUJJVE1BUCAqRExMX0NBTExDT05WIEZyZWVJbWFnZV9NdWx0aWdyaWRQb2lzc29uU29sdmVyKEZJQklUTUFQICpMYXBsYWNpYW4sIGludCBuY3ljbGUgRklfREVGQVVMVCgzKSk7CisKKy8vIHJlc3RvcmUgdGhlIGJvcmxhbmQtc3BlY2lmaWMgZW51bSBzaXplIG9wdGlvbgorI2lmIGRlZmluZWQoX19CT1JMQU5EQ19fKQorI3ByYWdtYSBvcHRpb24gcG9wCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8vIEZSRUVJTUFHRV9ICmRpZmYgLS1naXQgYS9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL0JpdG1hcEFjY2Vzcy5jcHAgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL0JpdG1hcEFjY2Vzcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ3YWQxZgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvQml0bWFwQWNjZXNzLmNwcApAQCAtMCwwICsxLDE1NzMgQEAKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEZyZWVJbWFnZSBpbXBsZW1lbnRhdGlvbgorLy8KKy8vIERlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gYnkKKy8vIC0gRmxvcmlzIHZhbiBkZW4gQmVyZyAoZmx2ZGJlcmdAd3hzLm5sKQorLy8gLSBIZXJ26SBEcm9sb24gKGRyb2xvbkBpbmZvbmllLmZyKQorLy8gLSBEZXRsZXYgVmVuZHQgKGRldGxldi52ZW5kdEBicmlsbGl0LmRlKQorLy8gLSBQZXRyIFN1cGluYSAocHN1cEBjZW50cnVtLmN6KQorLy8gLSBDYXJzdGVuIEtsZWluIChjLmtsZWluQGRhdGFnaXMuY29tKQorLy8gLSBNaWhhaWwgTmF5ZGVub3YgKG1uYXlkZW5vdkB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQpCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRnJlZUltYWdlIDMKKy8vCisvLyBDT1ZFUkVEIENPREUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkKKy8vIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTCisvLyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy8vIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVECisvLyBDT0RFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UCisvLyBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWQorLy8gU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTAorLy8gUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUgorLy8gVEhJUyBESVNDTEFJTUVSLgorLy8KKy8vIFVzZSBhdCB5b3VyIG93biByaXNrIQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaWZkZWYgX01TQ19WRVIgCisjcHJhZ21hIHdhcm5pbmcgKGRpc2FibGUgOiA0Nzg2KSAvLyBpZGVudGlmaWVyIHdhcyB0cnVuY2F0ZWQgdG8gJ251bWJlcicgY2hhcmFjdGVycworI2VuZGlmIAorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX1dJTjY0KSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKQorI2luY2x1ZGUgPG1hbGxvYy5oPgorI2VuZGlmIC8vIF9XSU4zMiB8fCBfV0lONjQgfHwgX19NSU5HVzMyX18KKworI2luY2x1ZGUgIkZyZWVJbWFnZS5oIgorI2luY2x1ZGUgIkZyZWVJbWFnZUlPLmgiCisjaW5jbHVkZSAiVXRpbGl0aWVzLmgiCisjaW5jbHVkZSAiTWFwSW50cm9zcGVjdG9yLmgiCisKKyNpbmNsdWRlICIuLi9NZXRhZGF0YS9GcmVlSW1hZ2VUYWcuaCIKKworLyoqCitDb25zdGFudHMgZm9yIHRoZSBCSVRNQVBJTkZPSEVBREVSOjpiaUNvbXByZXNzaW9uIGZpZWxkCitCSV9SR0I6CitUaGUgYml0bWFwIGlzIGluIHVuY29tcHJlc3NlZCByZWQgZ3JlZW4gYmx1ZSAoUkdCKSBmb3JtYXQgdGhhdCBpcyBub3QgY29tcHJlc3NlZCBhbmQgZG9lcyBub3QgdXNlIGNvbG9yIG1hc2tzLgorQklfQklURklFTERTOgorVGhlIGJpdG1hcCBpcyBub3QgY29tcHJlc3NlZCBhbmQgdGhlIGNvbG9yIHRhYmxlIGNvbnNpc3RzIG9mIHRocmVlIERXT1JEIGNvbG9yIG1hc2tzIHRoYXQgc3BlY2lmeSB0aGUgcmVkLCBncmVlbiwgYW5kIGJsdWUgY29tcG9uZW50cywgCityZXNwZWN0aXZlbHksIG9mIGVhY2ggcGl4ZWwuIFRoaXMgaXMgdmFsaWQgd2hlbiB1c2VkIHdpdGggMTYgYW5kIDMyLWJpdHMgcGVyIHBpeGVsIGJpdG1hcHMuCisqLworI2lmbmRlZiBfV0lOR0RJXworI2RlZmluZSBCSV9SR0IgICAgICAgMEwKKyNkZWZpbmUgQklfQklURklFTERTIDNMCisjZW5kaWYgLy8gX1dJTkdESV8KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIE1ldGFkYXRhIGRlZmluaXRpb25zCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qKiBoZWxwZXIgZm9yIG1hcDxrZXksIHZhbHVlPiB3aGVyZSB2YWx1ZSBpcyBhIHBvaW50ZXIgdG8gYSBGcmVlSW1hZ2UgdGFnICovCit0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBGSVRBRyo+IFRBR01BUDsKKworLyoqIGhlbHBlciBmb3IgbWFwPEZSRUVfSU1BR0VfTURNT0RFTCwgVEFHTUFQKj4gKi8KK3R5cGVkZWYgc3RkOjptYXA8aW50LCBUQUdNQVAqPiBNRVRBREFUQU1BUDsKKworLyoqIGhlbHBlciBmb3IgbWV0YWRhdGEgaXRlcmF0b3IgKi8KK0ZJX1NUUlVDVCAoTUVUQURBVEFIRUFERVIpIHsgCisJbG9uZyBwb3M7CQkvLyEgY3VycmVudCBwb3NpdGlvbiB3aGVuIGl0ZXJhdGluZyB0aGUgbWFwCisJVEFHTUFQICp0YWdtYXA7CS8vISBwb2ludGVyIHRvIHRoZSB0YWcgbWFwCit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgRklCSVRNQVAgZGVmaW5pdGlvbgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKioKK0ZyZWVJbWFnZSBoZWFkZXIgc3RydWN0dXJlCisqLworRklfU1RSVUNUIChGUkVFSU1BR0VIRUFERVIpIHsKKwkvKiogZGF0YSB0eXBlIC0gYml0bWFwLCBhcnJheSBvZiBsb25nLCBkb3VibGUsIGNvbXBsZXgsIGV0YyAqLworCUZSRUVfSU1BR0VfVFlQRSB0eXBlOworCisJLyoqIGJhY2tncm91bmQgY29sb3IgdXNlZCBmb3IgUkdCIHRyYW5zcGFyZW5jeSAqLworCVJHQlFVQUQgYmtnbmRfY29sb3I7CisKKwkvKipAbmFtZSB0cmFuc3BhcmVuY3kgbWFuYWdlbWVudCAqLworCS8vQHsKKwkvKioKKwl3aHkgYW5vdGhlciB0YWJsZSA/IGZvciBlYXN5IHRyYW5zcGFyZW5jeSB0YWJsZSByZXRyaWV2YWwgIQorCXRyYW5zcGFyZW5jeSBjb3VsZCBiZSBzdG9yZWQgaW4gdGhlIHBhbGV0dGUsIHdoaWNoIGlzIGJldHRlcgorCW92ZXJhbGwsIGJ1dCBpdCByZXF1aXJlcyBxdWl0ZSBzb21lIGNoYW5nZXMgYW5kIGl0IHdpbGwgcmVuZGVyCisJRnJlZUltYWdlX0dldFRyYW5zcGFyZW5jeVRhYmxlIG9ic29sZXRlIGluIGl0cyBjdXJyZW50IGZvcm07CisJKi8KKwlCWVRFIHRyYW5zcGFyZW50X3RhYmxlWzI1Nl07CisJLyoqIG51bWJlciBvZiB0cmFuc3BhcmVudCBjb2xvcnMgKi8KKwlpbnQgIHRyYW5zcGFyZW5jeV9jb3VudDsKKwkvKiogVFJVRSBpZiB0aGUgaW1hZ2UgaXMgdHJhbnNwYXJlbnQgKi8KKwlCT09MIHRyYW5zcGFyZW50OworCS8vQH0KKworCS8qKiBzcGFjZSB0byBob2xkIElDQyBwcm9maWxlICovCisJRklJQ0NQUk9GSUxFIGljY1Byb2ZpbGU7CisKKwkvKiogY29udGFpbnMgYSBsaXN0IG9mIG1ldGFkYXRhIG1vZGVscyBhdHRhY2hlZCB0byB0aGUgYml0bWFwICovCisJTUVUQURBVEFNQVAgKm1ldGFkYXRhOworCisJLyoqIEZBTFNFIGlmIHRoZSBGSUJJVE1BUCBvbmx5IGNvbnRhaW5zIHRoZSBoZWFkZXIgYW5kIG5vIHBpeGVsIGRhdGEgKi8KKwlCT09MIGhhc19waXhlbHM7CisKKwkvKiogb3B0aW9uYWxseSBjb250YWlucyBhIHRodW1ibmFpbCBhdHRhY2hlZCB0byB0aGUgYml0bWFwICovCisJRklCSVRNQVAgKnRodW1ibmFpbDsKKworCS8qKkBuYW1lIGV4dGVybmFsIHBpeGVsIGJ1ZmZlciBtYW5hZ2VtZW50ICovCisJLy9AeworCS8qKiBwb2ludGVyIHRvIHVzZXIgcHJvdmlkZWQgcGl4ZWxzLCBOVUxMIG90aGVyd2lzZSAqLworCUJZVEUgKmV4dGVybmFsX2JpdHM7CisJLyoqIHVzZXIgcHJvdmlkZWQgcGl0Y2gsIDAgb3RoZXJ3aXNlICovCisJdW5zaWduZWQgZXh0ZXJuYWxfcGl0Y2g7CisJLy9AfQorCisJLy9CWVRFIGZpbGxlclsxXTsJCQkgLy8gZmlsbCB0byAzMi1iaXQgYWxpZ25tZW50Cit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgRlJFRUlNQUdFUkdCTUFTS1MgZGVmaW5pdGlvbgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKioKK1JHQiBtYXNrIHN0cnVjdHVyZSAtIG1haW5seSB1c2VkIGZvciAxNi1iaXQgUkdCNTU1IC8gUkdCIDU2NSBGSUJJVE1BUAorKi8KK0ZJX1NUUlVDVCAoRlJFRUlNQUdFUkdCTUFTS1MpIHsKKwl1bnNpZ25lZCByZWRfbWFzazsJCS8vISBiaXQgbGF5b3V0IG9mIHRoZSByZWQgY29tcG9uZW50cworCXVuc2lnbmVkIGdyZWVuX21hc2s7CS8vISBiaXQgbGF5b3V0IG9mIHRoZSBncmVlbiBjb21wb25lbnRzCisJdW5zaWduZWQgYmx1ZV9tYXNrOwkJLy8hIGJpdCBsYXlvdXQgb2YgdGhlIGJsdWUgY29tcG9uZW50cworfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIE1lbW9yeSBhbGxvY2F0aW9uIG9uIGEgc3BlY2lmaWVkIGFsaWdubWVudCBib3VuZGFyeQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgKGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9XSU42NCkpICYmICFkZWZpbmVkKF9fTUlOR1czMl9fKQorCit2b2lkKiBGcmVlSW1hZ2VfQWxpZ25lZF9NYWxsb2Moc2l6ZV90IGFtb3VudCwgc2l6ZV90IGFsaWdubWVudCkgeworCWFzc2VydChhbGlnbm1lbnQgPT0gRklCSVRNQVBfQUxJR05NRU5UKTsKKwlyZXR1cm4gX2FsaWduZWRfbWFsbG9jKGFtb3VudCwgYWxpZ25tZW50KTsKK30KKwordm9pZCBGcmVlSW1hZ2VfQWxpZ25lZF9GcmVlKHZvaWQqIG1lbSkgeworCV9hbGlnbmVkX2ZyZWUobWVtKTsKK30KKworI2VsaWYgZGVmaW5lZCAoX19NSU5HVzMyX18pCisKK3ZvaWQqIEZyZWVJbWFnZV9BbGlnbmVkX01hbGxvYyhzaXplX3QgYW1vdW50LCBzaXplX3QgYWxpZ25tZW50KSB7CisJYXNzZXJ0KGFsaWdubWVudCA9PSBGSUJJVE1BUF9BTElHTk1FTlQpOworCXJldHVybiBfX21pbmd3X2FsaWduZWRfbWFsbG9jIChhbW91bnQsIGFsaWdubWVudCk7Cit9CisKK3ZvaWQgRnJlZUltYWdlX0FsaWduZWRfRnJlZSh2b2lkKiBtZW0pIHsKKwlfX21pbmd3X2FsaWduZWRfZnJlZSAobWVtKTsKK30KKworI2Vsc2UKKwordm9pZCogRnJlZUltYWdlX0FsaWduZWRfTWFsbG9jKHNpemVfdCBhbW91bnQsIHNpemVfdCBhbGlnbm1lbnQpIHsKKwlhc3NlcnQoYWxpZ25tZW50ID09IEZJQklUTUFQX0FMSUdOTUVOVCk7CisJLyoKKwlJbiBzb21lIHJhcmUgc2l0dWF0aW9ucywgdGhlIG1hbGxvYyByb3V0aW5lcyBjYW4gcmV0dXJuIG1pc2FsaWduZWQgbWVtb3J5LiAKKwlUaGUgcm91dGluZSBGcmVlSW1hZ2VfQWxpZ25lZF9NYWxsb2MgYWxsb2NhdGVzIGEgYml0IG1vcmUgbWVtb3J5IHRvIGRvCisJYWxpZ25lZCB3cml0ZXMuICBOb3JtYWxseSwgaXQgKnNob3VsZCogYWxsb2NhdGUgImFsaWdubWVudCIgZXh0cmEgbWVtb3J5IGFuZCB0aGVuIHdyaXRlcworCW9uZSBkd29yZCBiYWNrIHRoZSB0cnVlIHBvaW50ZXIuICBCdXQgaWYgdGhlIG1lbW9yeSBtYW5hZ2VyIHJldHVybnMgYQorCW1pc2FsaWduZWQgYmxvY2sgdGhhdCBpcyBsZXNzIHRoYW4gYSBkd29yZCBmcm9tIHRoZSBuZXh0IGFsaWdubWVudCwgCisJdGhlbiB0aGUgd3JpdGluZyBiYWNrIG9uZSBkd29yZCB3aWxsIGNvcnJ1cHQgbWVtb3J5LgorCisJRm9yIGV4YW1wbGUsIHN1cHBvc2UgdGhhdCBhbGlnbm1lbnQgaXMgMTYgYW5kIG1hbGxvYyByZXR1cm5zIHRoZSBhZGRyZXNzIDB4RkZGRi4KKworCTE2IC0gMHhGRkZGICUgMTYgKyAweEZGRkYgPSAxNiAtIDE1ICsgMHhGRkZGID0gMHgxMDAwMC4KKworCU5vdywgeW91IHN1YnRyYWN0IG9uZSBkd29yZCBmcm9tIHRoYXQgYW5kIHdyaXRlIGFuZCB0aGF0IHdpbGwgY29ycnVwdCBtZW1vcnkuCisKKwlUaGF0J3Mgd2h5IHRoZSBjb2RlIGJlbG93IGFsbG9jYXRlcyAqdHdvKiBhbGlnbm1lbnRzIGluc3RlYWQgb2Ygb25lLiAKKwkqLworCXZvaWQqIG1lbV9yZWFsID0gbWFsbG9jKGFtb3VudCArIDIgKiBhbGlnbm1lbnQpOworCWlmKCFtZW1fcmVhbCkgcmV0dXJuIE5VTEw7CisJY2hhciogbWVtX2FsaWduID0gKGNoYXIqKSgodW5zaWduZWQgbG9uZykoMiAqIGFsaWdubWVudCAtICh1bnNpZ25lZCBsb25nKW1lbV9yZWFsICUgKHVuc2lnbmVkIGxvbmcpYWxpZ25tZW50KSArICh1bnNpZ25lZCBsb25nKW1lbV9yZWFsKTsKKwkqKChsb25nKiltZW1fYWxpZ24gLSAxKSA9IChsb25nKW1lbV9yZWFsOworCXJldHVybiBtZW1fYWxpZ247Cit9CisKK3ZvaWQgRnJlZUltYWdlX0FsaWduZWRfRnJlZSh2b2lkKiBtZW0pIHsKKwlmcmVlKCh2b2lkKikqKChsb25nKiltZW0gLSAxKSk7Cit9CisKKyNlbmRpZiAvLyBfV0lOMzIgfHwgX1dJTjY0CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBGSUJJVE1BUCBtZW1vcnkgbWFuYWdlbWVudAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKioKK0NhbGN1bGF0ZSB0aGUgc2l6ZSBvZiBhIEZyZWVJbWFnZSBpbWFnZS4gCitBbGlnbiB0aGUgcGFsZXR0ZSBhbmQgdGhlIHBpeGVscyBvbiBhIEZJQklUTUFQX0FMSUdOTUVOVCBieXRlcyBhbGlnbm1lbnQgYm91bmRhcnkuCitUaGlzIGZ1bmN0aW9uIGluY2x1ZGVzIGEgcHJvdGVjdGlvbiBhZ2FpbnN0IG1hbGljaW91cyBpbWFnZXMsIGJhc2VkIG9uIGEgS0lTUyBpbnRlZ2VyIG92ZXJmbG93IGRldGVjdGlvbiBtZWNoYW5pc20uIAorCitAcGFyYW0gaGVhZGVyX29ubHkgSWYgVFJVRSwgY2FsY3VsYXRlIGEgJ2hlYWRlciBvbmx5JyBGSUJJVE1BUCBzaXplLCBvdGhlcndpc2UgY2FsY3VsYXRlIGEgZnVsbCBGSUJJVE1BUCBzaXplCitAcGFyYW0gd2lkdGggSW1hZ2Ugd2lkdGgKK0BwYXJhbSBoZWlnaHQgSW1hZ2UgaGVpZ2h0CitAcGFyYW0gYnBwIE51bWJlciBvZiBiaXRzLXBlci1waXhlbAorQHBhcmFtIG5lZWRfbWFza3MgV2Ugb25seSBzdG9yZSB0aGUgbWFza3MgKGFuZCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZW0pIGZvciAxNi1iaXQgaW1hZ2VzIG9mIHR5cGUgRklUX0JJVE1BUAorQHJldHVybiBSZXR1cm5zIGEgc2l6ZSBpbiBCWVRFIHVuaXRzCitAc2VlIEZyZWVJbWFnZV9BbGxvY2F0ZUJpdG1hcAorKi8KK3N0YXRpYyBzaXplX3QgCitGcmVlSW1hZ2VfR2V0SW50ZXJuYWxJbWFnZVNpemUoQk9PTCBoZWFkZXJfb25seSwgdW5zaWduZWQgd2lkdGgsIHVuc2lnbmVkIGhlaWdodCwgdW5zaWduZWQgYnBwLCBCT09MIG5lZWRfbWFza3MpIHsKKwlzaXplX3QgZGliX3NpemUgPSBzaXplb2YoRlJFRUlNQUdFSEVBREVSKTsKKwlkaWJfc2l6ZSArPSAoZGliX3NpemUgJSBGSUJJVE1BUF9BTElHTk1FTlQgPyBGSUJJVE1BUF9BTElHTk1FTlQgLSBkaWJfc2l6ZSAlIEZJQklUTUFQX0FMSUdOTUVOVCA6IDApOworCWRpYl9zaXplICs9IEZJQklUTUFQX0FMSUdOTUVOVCAtIHNpemVvZihCSVRNQVBJTkZPSEVBREVSKSAlIEZJQklUTUFQX0FMSUdOTUVOVDsKKwlkaWJfc2l6ZSArPSBzaXplb2YoQklUTUFQSU5GT0hFQURFUik7CisJLy8gcGFsZXR0ZSBpcyBhbGlnbmVkIG9uIGEgMTYgYnl0ZXMgYm91bmRhcnkKKwlkaWJfc2l6ZSArPSBzaXplb2YoUkdCUVVBRCkgKiBDYWxjdWxhdGVVc2VkUGFsZXR0ZUVudHJpZXMoYnBwKTsKKwkvLyB3ZSBib3RoIGFkZCBwYWxldHRlIHNpemUgYW5kIG1hc2tzIHNpemUgaWYgbmVlZF9tYXNrcyBpcyB0cnVlLCBzaW5jZSBDYWxjdWxhdGVVc2VkUGFsZXR0ZUVudHJpZXMKKwkvLyBhbHdheXMgcmV0dXJucyAwIGlmIG5lZWRfbWFza3MgaXMgdHJ1ZSAod2hpY2ggaXMgb25seSB0cnVlIGZvciAxNiBiaXQgaW1hZ2VzKS4KKwlkaWJfc2l6ZSArPSBuZWVkX21hc2tzID8gc2l6ZW9mKERXT1JEKSAqIDMgOiAwOworCWRpYl9zaXplICs9IChkaWJfc2l6ZSAlIEZJQklUTUFQX0FMSUdOTUVOVCA/IEZJQklUTUFQX0FMSUdOTUVOVCAtIGRpYl9zaXplICUgRklCSVRNQVBfQUxJR05NRU5UIDogMCk7CisKKwlpZighaGVhZGVyX29ubHkpIHsKKwkJY29uc3Qgc2l6ZV90IGhlYWRlcl9zaXplID0gZGliX3NpemU7CisKKwkJLy8gcGl4ZWxzIGFyZSBhbGlnbmVkIG9uIGEgMTYgYnl0ZXMgYm91bmRhcnkKKwkJZGliX3NpemUgKz0gKHNpemVfdClDYWxjdWxhdGVQaXRjaChDYWxjdWxhdGVMaW5lKHdpZHRoLCBicHApKSAqIChzaXplX3QpaGVpZ2h0OworCisJCS8vIGNoZWNrIGZvciBwb3NzaWJsZSBtYWxsb2Mgb3ZlcmZsb3cgdXNpbmcgYSBLSVNTIGludGVnZXIgb3ZlcmZsb3cgZGV0ZWN0aW9uIG1lY2hhbmlzbQorCQl7CisJCQljb25zdCBkb3VibGUgZFBpdGNoID0gZmxvb3IoICgoZG91YmxlKWJwcCAqIHdpZHRoICsgMzEuMCkgLyAzMi4wICkgKiA0LjA7CisJCQljb25zdCBkb3VibGUgZEltYWdlU2l6ZSA9IChkb3VibGUpaGVhZGVyX3NpemUgKyBkUGl0Y2ggKiBoZWlnaHQ7CisJCQlpZihkSW1hZ2VTaXplICE9IChkb3VibGUpZGliX3NpemUpIHsKKwkJCQkvLyBoZXJlLCB3ZSBhcmUgc3VyZSB0byBlbmNvdW50ZXIgYSBtYWxsb2Mgb3ZlcmZsb3c6IHRyeSB0byBhdm9pZCBpdCAuLi4KKwkJCQlyZXR1cm4gMDsKKwkJCX0KKworCQkJLyoKKwkJCVRoZSBmb2xsb3dpbmcgY29uc3RhbnQgdGFrZSBpbnRvIGFjY291bnQgdGhlIGFkZGl0aW9ubmFsIG1lbW9yeSB1c2VkIGJ5IAorCQkJYWxpZ25lZCBtYWxsb2MgZnVuY3Rpb25zIGFzIHdlbGwgYXMgZGVidWcgbWFsbG9jIGZ1bmN0aW9ucy4gCisJCQlJdCBpcyBzdXBwb3NlZCBoZXJlIHRoYXQgdXNpbmcgYSAoOCAqIEZJQklUTUFQX0FMSUdOTUVOVCkgcmlzayBtYXJnaW4gd2lsbCBiZSBlbm91Z2gKKwkJCWZvciB0aGUgdGFyZ2V0IGNvbXBpbGVyLiAKKwkJCSovCisJCQljb25zdCBkb3VibGUgRklCSVRNQVBfTUFYX01FTU9SWSA9IChkb3VibGUpKChzaXplX3QpLTEpIC0gOCAqIEZJQklUTUFQX0FMSUdOTUVOVDsKKworCQkJaWYoZEltYWdlU2l6ZSA+IEZJQklUTUFQX01BWF9NRU1PUlkpIHsKKwkJCQkvLyBhdm9pZCBwb3NzaWJsZSBvdmVyZmxvdyBpbnNpZGUgQyBhbGxvY2F0aW9uIGZ1bmN0aW9ucworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIGRpYl9zaXplOworfQorCisvKioKK0hlbHBlciBmb3IgMTYtYml0IEZJVF9CSVRNQVAKK1JldHVybnMgYSBwb2ludGVyIHRvIHRoZSBiaXRtYXAncyByZWQtLCBncmVlbi0gYW5kIGJsdWUgbWFza3MuCitAcGFyYW0gZGliIFRoZSBiaXRtYXAgdG8gb2J0YWluIG1hc2tzIGZyb20uCitAcmV0dXJuIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBiaXRtYXAncyByZWQtLCBncmVlbi0gYW5kIGJsdWUgbWFza3MKK29yIE5VTEwsIGlmIG5vIG1hc2tzIGFyZSBwcmVzZW50IChlLmcuIGZvciAyNCBiaXQgaW1hZ2VzKS4KKyovCitzdGF0aWMgRlJFRUlNQUdFUkdCTUFTS1MgKgorRnJlZUltYWdlX0dldFJHQk1hc2tzKEZJQklUTUFQICpkaWIpIHsKKwlyZXR1cm4gRnJlZUltYWdlX0hhc1JHQk1hc2tzKGRpYikgPyAoRlJFRUlNQUdFUkdCTUFTS1MgKikoKChCWVRFICopRnJlZUltYWdlX0dldEluZm9IZWFkZXIoZGliKSkgKyBzaXplb2YoQklUTUFQSU5GT0hFQURFUikpIDogTlVMTDsKK30KKworLyoqCitJbnRlcm5hbCBGSUJJVE1BUCBhbGxvY2F0aW9uLgorCitUaGlzIGZ1bmN0aW9uIGFjY2VwdHMgKGV4dF9iaXRzLCBleHRfcGl0Y2gpIGFyZ3VtZW50cy4gSWYgdGhlc2UgYXJlIHByb3ZpZGVkIHRoZSBGSUJJVE1BUCAKK3dpbGwgYmUgYWxsb2NhdGVkIGFzICJoZWFkZXIgb25seSIsIGJ1dCBiaXRzIGFuZCBwaXRjaCB3aWxsIGJlIHN0b3JlZCB3aXRoaW4gdGhlIEZSRUVJTUFHRUhFQURFUiAKK2FuZCB0aGUgcmVzdWx0aW5nIEZJQklUTUFQIHdpbGwgaGF2ZSBwaXhlbHMsIGkuZS4gSGFzUGl4ZWxzKCkgd2lsbCByZXR1cm4gVFJVRS4KKy0gR2V0Qml0cygpIGFuZCBHZXRQaXRjaCByZXR1cm4gdGhlIGNvcnJlY3QgdmFsdWVzIC0gZWl0aGVyIG9mZnNldHMgb3IgdGhlIHN0b3JlZCB2YWx1ZXMgKHVzZXItcHJvdmlkZWQgYml0cyBhbmQgcGl0Y2gpLgorLSBDbG9uZSgpIGNyZWF0ZXMgYSBuZXcgRklCSVRNQVAgd2l0aCBjb3B5IG9mIHRoZSB1c2VyIHBpeGVsIGRhdGEuCistIFVubG9hZCdzIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IG5lZWQgdG8gY2hhbmdlIC0gaXQganVzdCByZWxlYXNlIGEgImhlYWRlciBvbmx5IiBkaWIuCitOb3RlIHRoYXQgd2hlbiB1c2luZyBleHRlcm5hbCBkYXRhLCB0aGUgZGF0YSBkb2VzIG5vdCBuZWVkIHRvIGhhdmUgdGhlIHNhbWUgYWxpZ25tZW50IGFzIHRoZSBkZWZhdWx0IDQtYnl0ZSBhbGlnbm1lbnQuIAorVGhpcyBlbmFibGVzIHRoZSBwb3NzaWJpbGl0eSB0byBhY2Nlc3MgYnVmZmVycyB3aXRoLCBmb3IgaW5zdGFuY2UsIHN0cmljdGVyIGFsaWdubWVudCwKK2xpa2UgdGhlIG9uZXMgdXNlZCBpbiBsb3ctbGV2ZWwgQVBJcyBsaWtlIE9wZW5DTCBvciBpbnRyaW5zaWNzLgorCitAcGFyYW0gaGVhZGVyX29ubHkgSWYgVFJVRSwgYWxsb2NhdGUgYSAnaGVhZGVyIG9ubHknIEZJQklUTUFQLCBvdGhlcndpc2UgYWxsb2NhdGUgYSBmdWxsIEZJQklUTUFQCitAcGFyYW0gZXh0X2JpdHMgUG9pbnRlciB0byBleHRlcm5hbCB1c2VyJ3MgcGl4ZWwgYnVmZmVyIGlmIHVzaW5nIHdyYXBwZWQgYnVmZmVyLCBOVUxMIG90aGVyd2lzZQorQHBhcmFtIGV4dF9waXRjaCBQb2ludGVyIHRvIGV4dGVybmFsIHVzZXIncyBwaXhlbCBidWZmZXIgcGl0Y2ggaWYgdXNpbmcgd3JhcHBlZCBidWZmZXIsIDAgb3RoZXJ3aXNlCitAcGFyYW0gdHlwZSBJbWFnZSB0eXBlCitAcGFyYW0gd2lkdGggSW1hZ2Ugd2lkdGgKK0BwYXJhbSBoZWlnaHQgSW1hZ2UgaGVpZ2h0CitAcGFyYW0gYnBwIE51bWJlciBvZiBiaXRzIHBlciBwaXhlbAorQHBhcmFtIHJlZF9tYXNrIEltYWdlIHJlZCBtYXNrIAorQHBhcmFtIGdyZWVuX21hc2sgSW1hZ2UgZ3JlZW4gbWFzaworQHBhcmFtIGJsdWVfbWFzayBJbWFnZSBibHVlIG1hc2sKK0ByZXR1cm4gUmV0dXJucyB0aGUgYWxsb2NhdGVkIEZJQklUTUFQIGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgTlVMTCBvdGhlcndpc2UKKyovCitzdGF0aWMgRklCSVRNQVAgKiAKK0ZyZWVJbWFnZV9BbGxvY2F0ZUJpdG1hcChCT09MIGhlYWRlcl9vbmx5LCBCWVRFICpleHRfYml0cywgdW5zaWduZWQgZXh0X3BpdGNoLCBGUkVFX0lNQUdFX1RZUEUgdHlwZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLCB1bnNpZ25lZCByZWRfbWFzaywgdW5zaWduZWQgZ3JlZW5fbWFzaywgdW5zaWduZWQgYmx1ZV9tYXNrKSB7CisKKwkvLyBjaGVjayBpbnB1dCB2YXJpYWJsZXMKKwl3aWR0aCA9IGFicyh3aWR0aCk7CisJaGVpZ2h0ID0gYWJzKGhlaWdodCk7CisJaWYoISgod2lkdGggPiAwKSAmJiAoaGVpZ2h0ID4gMCkpKSB7CisJCXJldHVybiBOVUxMOworCX0KKwlpZihleHRfYml0cykgeworCQlpZihleHRfcGl0Y2ggPT0gMCkgeworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJYXNzZXJ0KGhlYWRlcl9vbmx5ID09IEZBTFNFKTsKKwl9CisKKwkvLyB3ZSBvbmx5IHN0b3JlIHRoZSBtYXNrcyAoYW5kIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlbSkgZm9yIDE2LWJpdCBpbWFnZXMgb2YgdHlwZSBGSVRfQklUTUFQCisJQk9PTCBuZWVkX21hc2tzID0gRkFMU0U7CisKKwkvLyBjaGVjayBwaXhlbCBiaXQgZGVwdGgKKwlzd2l0Y2godHlwZSkgeworCQljYXNlIEZJVF9CSVRNQVA6CisJCQlzd2l0Y2goYnBwKSB7CisJCQkJY2FzZSAxOgorCQkJCWNhc2UgNDoKKwkJCQljYXNlIDg6CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMTY6CisJCQkJCW5lZWRfbWFza3MgPSBUUlVFOworCQkJCQlicmVhazsKKwkJCQljYXNlIDI0OgorCQkJCWNhc2UgMzI6CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCWJwcCA9IDg7CisJCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgRklUX1VJTlQxNjoKKwkJCWJwcCA9IDggKiBzaXplb2YodW5zaWduZWQgc2hvcnQpOworCQkJYnJlYWs7CisJCWNhc2UgRklUX0lOVDE2OgorCQkJYnBwID0gOCAqIHNpemVvZihzaG9ydCk7CisJCQlicmVhazsKKwkJY2FzZSBGSVRfVUlOVDMyOgorCQkJYnBwID0gOCAqIHNpemVvZihEV09SRCk7CisJCQlicmVhazsKKwkJY2FzZSBGSVRfSU5UMzI6CisJCQlicHAgPSA4ICogc2l6ZW9mKExPTkcpOworCQkJYnJlYWs7CisJCWNhc2UgRklUX0ZMT0FUOgorCQkJYnBwID0gOCAqIHNpemVvZihmbG9hdCk7CisJCQlicmVhazsKKwkJY2FzZSBGSVRfRE9VQkxFOgorCQkJYnBwID0gOCAqIHNpemVvZihkb3VibGUpOworCQkJYnJlYWs7CisJCWNhc2UgRklUX0NPTVBMRVg6CisJCQlicHAgPSA4ICogc2l6ZW9mKEZJQ09NUExFWCk7CisJCQlicmVhazsKKwkJY2FzZSBGSVRfUkdCMTY6CisJCQlicHAgPSA4ICogc2l6ZW9mKEZJUkdCMTYpOworCQkJYnJlYWs7CisJCWNhc2UgRklUX1JHQkExNjoKKwkJCWJwcCA9IDggKiBzaXplb2YoRklSR0JBMTYpOworCQkJYnJlYWs7CisJCWNhc2UgRklUX1JHQkY6CisJCQlicHAgPSA4ICogc2l6ZW9mKEZJUkdCRik7CisJCQlicmVhazsKKwkJY2FzZSBGSVRfUkdCQUY6CisJCQlicHAgPSA4ICogc2l6ZW9mKEZJUkdCQUYpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlGSUJJVE1BUCAqYml0bWFwID0gKEZJQklUTUFQICopbWFsbG9jKHNpemVvZihGSUJJVE1BUCkpOworCisJaWYgKGJpdG1hcCAhPSBOVUxMKSB7CisKKwkJLy8gY2FsY3VsYXRlIHRoZSBzaXplIG9mIGEgRnJlZUltYWdlIGltYWdlCisJCS8vIGFsaWduIHRoZSBwYWxldHRlIGFuZCB0aGUgcGl4ZWxzIG9uIGEgRklCSVRNQVBfQUxJR05NRU5UIGJ5dGVzIGFsaWdubWVudCBib3VuZGFyeQorCQkvLyBwYWxldHRlIGlzIGFsaWduZWQgb24gYSAxNiBieXRlcyBib3VuZGFyeQorCQkvLyBwaXhlbHMgYXJlIGFsaWduZWQgb24gYSAxNiBieXRlcyBib3VuZGFyeQorCisJCS8vIHdoZW4gdXNpbmcgYSB1c2VyIHByb3ZpZGVkIHBpeGVsIGJ1ZmZlciwgZm9yY2UgYSAnaGVhZGVyIG9ubHknIGFsbG9jYXRpb24KKworCQlzaXplX3QgZGliX3NpemUgPSBGcmVlSW1hZ2VfR2V0SW50ZXJuYWxJbWFnZVNpemUoaGVhZGVyX29ubHkgfHwgZXh0X2JpdHMsIHdpZHRoLCBoZWlnaHQsIGJwcCwgbmVlZF9tYXNrcyk7CisKKwkJaWYoZGliX3NpemUgPT0gMCkgeworCQkJLy8gbWVtb3J5IGFsbG9jYXRpb24gd2lsbCBmYWlsIChwcm9iYWJseSBhIG1hbGxvYyBvdmVyZmxvdykKKwkJCWZyZWUoYml0bWFwKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJYml0bWFwLT5kYXRhID0gKEJZVEUgKilGcmVlSW1hZ2VfQWxpZ25lZF9NYWxsb2MoZGliX3NpemUgKiBzaXplb2YoQllURSksIEZJQklUTUFQX0FMSUdOTUVOVCk7CisKKwkJaWYgKGJpdG1hcC0+ZGF0YSAhPSBOVUxMKSB7CisJCQltZW1zZXQoYml0bWFwLT5kYXRhLCAwLCBkaWJfc2l6ZSk7CisKKwkJCS8vIHdyaXRlIG91dCB0aGUgRlJFRUlNQUdFSEVBREVSCisKKwkJCUZSRUVJTUFHRUhFQURFUiAqZmloID0gKEZSRUVJTUFHRUhFQURFUiAqKWJpdG1hcC0+ZGF0YTsKKworCQkJZmloLT50eXBlID0gdHlwZTsKKworCQkJbWVtc2V0KCZmaWgtPmJrZ25kX2NvbG9yLCAwLCBzaXplb2YoUkdCUVVBRCkpOworCisJCQlmaWgtPnRyYW5zcGFyZW50ID0gRkFMU0U7CisJCQlmaWgtPnRyYW5zcGFyZW5jeV9jb3VudCA9IDA7CisJCQltZW1zZXQoZmloLT50cmFuc3BhcmVudF90YWJsZSwgMHhmZiwgMjU2KTsKKworCQkJZmloLT5oYXNfcGl4ZWxzID0gaGVhZGVyX29ubHkgPyBGQUxTRSA6IFRSVUU7CisKKwkJCS8vIGluaXRpYWxpemUgRklJQ0NQUk9GSUxFIGxpbmsKKworCQkJRklJQ0NQUk9GSUxFICppY2NQcm9maWxlID0gRnJlZUltYWdlX0dldElDQ1Byb2ZpbGUoYml0bWFwKTsKKwkJCWljY1Byb2ZpbGUtPnNpemUgPSAwOworCQkJaWNjUHJvZmlsZS0+ZGF0YSA9IDA7CisJCQlpY2NQcm9maWxlLT5mbGFncyA9IDA7CisKKwkJCS8vIGluaXRpYWxpemUgbWV0YWRhdGEgbW9kZWxzIGxpc3QKKworCQkJZmloLT5tZXRhZGF0YSA9IG5ldyhzdGQ6Om5vdGhyb3cpIE1FVEFEQVRBTUFQOworCisJCQkvLyBpbml0aWFsaXplIGF0dGFjaGVkIHRodW1ibmFpbAorCisJCQlmaWgtPnRodW1ibmFpbCA9IE5VTEw7CisKKwkJCS8vIHN0b3JlIGEgcG9pbnRlciB0byB1c2VyIHByb3ZpZGVkIHBpeGVsIGJ1ZmZlciAoaWYgYW55KQorCisJCQlmaWgtPmV4dGVybmFsX2JpdHMgPSBleHRfYml0czsKKwkJCWZpaC0+ZXh0ZXJuYWxfcGl0Y2ggPSBleHRfcGl0Y2g7CisKKwkJCS8vIHdyaXRlIG91dCB0aGUgQklUTUFQSU5GT0hFQURFUgorCisJCQlCSVRNQVBJTkZPSEVBREVSICpiaWggICA9IEZyZWVJbWFnZV9HZXRJbmZvSGVhZGVyKGJpdG1hcCk7CisJCQliaWgtPmJpU2l6ZSAgICAgICAgICAgICA9IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKTsKKwkJCWJpaC0+YmlXaWR0aCAgICAgICAgICAgID0gd2lkdGg7CisJCQliaWgtPmJpSGVpZ2h0ICAgICAgICAgICA9IGhlaWdodDsKKwkJCWJpaC0+YmlQbGFuZXMgICAgICAgICAgID0gMTsKKwkJCWJpaC0+YmlDb21wcmVzc2lvbiAgICAgID0gbmVlZF9tYXNrcyA/IEJJX0JJVEZJRUxEUyA6IEJJX1JHQjsKKwkJCWJpaC0+YmlCaXRDb3VudCAgICAgICAgID0gKFdPUkQpYnBwOworCQkJYmloLT5iaUNsclVzZWQgICAgICAgICAgPSBDYWxjdWxhdGVVc2VkUGFsZXR0ZUVudHJpZXMoYnBwKTsKKwkJCWJpaC0+YmlDbHJJbXBvcnRhbnQgICAgID0gYmloLT5iaUNsclVzZWQ7CisJCQliaWgtPmJpWFBlbHNQZXJNZXRlcgk9IDI4MzU7CS8vIDcyIGRwaQorCQkJYmloLT5iaVlQZWxzUGVyTWV0ZXIJPSAyODM1OwkvLyA3MiBkcGkKKworCQkJaWYoYnBwID09IDgpIHsKKwkJCQkvLyBidWlsZCBhIGRlZmF1bHQgZ3JleXNjYWxlIHBhbGV0dGUgKHZlcnkgdXNlZnVsIGZvciBpbWFnZSBwcm9jZXNzaW5nKQorCQkJCVJHQlFVQUQgKnBhbCA9IEZyZWVJbWFnZV9HZXRQYWxldHRlKGJpdG1hcCk7CisJCQkJZm9yKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCQkJCXBhbFtpXS5yZ2JSZWQJPSAoQllURSlpOworCQkJCQlwYWxbaV0ucmdiR3JlZW4gPSAoQllURSlpOworCQkJCQlwYWxbaV0ucmdiQmx1ZQk9IChCWVRFKWk7CisJCQkJfQorCQkJfQorCisJCQkvLyBqdXN0IHNldHRpbmcgdGhlIG1hc2tzIChvbmx5IGlmIG5lZWRlZCkganVzdCBsaWtlIHRoZSBwYWxldHRlLgorCQkJaWYgKG5lZWRfbWFza3MpIHsKKwkJCQlGUkVFSU1BR0VSR0JNQVNLUyAqbWFza3MgPSBGcmVlSW1hZ2VfR2V0UkdCTWFza3MoYml0bWFwKTsKKwkJCQltYXNrcy0+cmVkX21hc2sgPSByZWRfbWFzazsKKwkJCQltYXNrcy0+Z3JlZW5fbWFzayA9IGdyZWVuX21hc2s7CisJCQkJbWFza3MtPmJsdWVfbWFzayA9IGJsdWVfbWFzazsKKwkJCX0KKworCQkJcmV0dXJuIGJpdG1hcDsKKwkJfQorCisJCWZyZWUoYml0bWFwKTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworRklCSVRNQVAgKiBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9BbGxvY2F0ZUhlYWRlckZvckJpdHMoQllURSAqZXh0X2JpdHMsIHVuc2lnbmVkIGV4dF9waXRjaCwgRlJFRV9JTUFHRV9UWVBFIHR5cGUsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgdW5zaWduZWQgcmVkX21hc2ssIHVuc2lnbmVkIGdyZWVuX21hc2ssIHVuc2lnbmVkIGJsdWVfbWFzaykgeworCXJldHVybiBGcmVlSW1hZ2VfQWxsb2NhdGVCaXRtYXAoRkFMU0UsIGV4dF9iaXRzLCBleHRfcGl0Y2gsIHR5cGUsIHdpZHRoLCBoZWlnaHQsIGJwcCwgcmVkX21hc2ssIGdyZWVuX21hc2ssIGJsdWVfbWFzayk7Cit9CisKK0ZJQklUTUFQICogRExMX0NBTExDT05WCitGcmVlSW1hZ2VfQWxsb2NhdGVIZWFkZXJUKEJPT0wgaGVhZGVyX29ubHksIEZSRUVfSU1BR0VfVFlQRSB0eXBlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIHVuc2lnbmVkIHJlZF9tYXNrLCB1bnNpZ25lZCBncmVlbl9tYXNrLCB1bnNpZ25lZCBibHVlX21hc2spIHsKKwlyZXR1cm4gRnJlZUltYWdlX0FsbG9jYXRlQml0bWFwKGhlYWRlcl9vbmx5LCBOVUxMLCAwLCB0eXBlLCB3aWR0aCwgaGVpZ2h0LCBicHAsIHJlZF9tYXNrLCBncmVlbl9tYXNrLCBibHVlX21hc2spOworfQorCitGSUJJVE1BUCAqIERMTF9DQUxMQ09OVgorRnJlZUltYWdlX0FsbG9jYXRlSGVhZGVyKEJPT0wgaGVhZGVyX29ubHksIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgdW5zaWduZWQgcmVkX21hc2ssIHVuc2lnbmVkIGdyZWVuX21hc2ssIHVuc2lnbmVkIGJsdWVfbWFzaykgeworCXJldHVybiBGcmVlSW1hZ2VfQWxsb2NhdGVCaXRtYXAoaGVhZGVyX29ubHksIE5VTEwsIDAsIEZJVF9CSVRNQVAsIHdpZHRoLCBoZWlnaHQsIGJwcCwgcmVkX21hc2ssIGdyZWVuX21hc2ssIGJsdWVfbWFzayk7Cit9CisKK0ZJQklUTUFQICogRExMX0NBTExDT05WCitGcmVlSW1hZ2VfQWxsb2NhdGUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLCB1bnNpZ25lZCByZWRfbWFzaywgdW5zaWduZWQgZ3JlZW5fbWFzaywgdW5zaWduZWQgYmx1ZV9tYXNrKSB7CisJcmV0dXJuIEZyZWVJbWFnZV9BbGxvY2F0ZUJpdG1hcChGQUxTRSwgTlVMTCwgMCwgRklUX0JJVE1BUCwgd2lkdGgsIGhlaWdodCwgYnBwLCByZWRfbWFzaywgZ3JlZW5fbWFzaywgYmx1ZV9tYXNrKTsKK30KKworRklCSVRNQVAgKiBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9BbGxvY2F0ZVQoRlJFRV9JTUFHRV9UWVBFIHR5cGUsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgdW5zaWduZWQgcmVkX21hc2ssIHVuc2lnbmVkIGdyZWVuX21hc2ssIHVuc2lnbmVkIGJsdWVfbWFzaykgeworCXJldHVybiBGcmVlSW1hZ2VfQWxsb2NhdGVCaXRtYXAoRkFMU0UsIE5VTEwsIDAsIHR5cGUsIHdpZHRoLCBoZWlnaHQsIGJwcCwgcmVkX21hc2ssIGdyZWVuX21hc2ssIGJsdWVfbWFzayk7Cit9CisKK3ZvaWQgRExMX0NBTExDT05WCitGcmVlSW1hZ2VfVW5sb2FkKEZJQklUTUFQICpkaWIpIHsKKwlpZiAoTlVMTCAhPSBkaWIpIHsJCisJCWlmIChOVUxMICE9IGRpYi0+ZGF0YSkgeworCQkJLy8gZGVsZXRlIHBvc3NpYmxlIGljYyBwcm9maWxlIC4uLgorCQkJaWYgKEZyZWVJbWFnZV9HZXRJQ0NQcm9maWxlKGRpYiktPmRhdGEpIHsKKwkJCQlmcmVlKEZyZWVJbWFnZV9HZXRJQ0NQcm9maWxlKGRpYiktPmRhdGEpOworCQkJfQorCisJCQkvLyBkZWxldGUgbWV0YWRhdGEgbW9kZWxzCisJCQlNRVRBREFUQU1BUCAqbWV0YWRhdGEgPSAoKEZSRUVJTUFHRUhFQURFUiAqKWRpYi0+ZGF0YSktPm1ldGFkYXRhOworCisJCQlmb3IoTUVUQURBVEFNQVA6Oml0ZXJhdG9yIGkgPSAoKm1ldGFkYXRhKS5iZWdpbigpOyBpICE9ICgqbWV0YWRhdGEpLmVuZCgpOyBpKyspIHsKKwkJCQlUQUdNQVAgKnRhZ21hcCA9ICgqaSkuc2Vjb25kOworCisJCQkJaWYodGFnbWFwKSB7CisJCQkJCWZvcihUQUdNQVA6Oml0ZXJhdG9yIGogPSB0YWdtYXAtPmJlZ2luKCk7IGogIT0gdGFnbWFwLT5lbmQoKTsgaisrKSB7CisJCQkJCQlGSVRBRyAqdGFnID0gKCpqKS5zZWNvbmQ7CisJCQkJCQlGcmVlSW1hZ2VfRGVsZXRlVGFnKHRhZyk7CisJCQkJCX0KKworCQkJCQlkZWxldGUgdGFnbWFwOworCQkJCX0KKwkJCX0KKworCQkJZGVsZXRlIG1ldGFkYXRhOworCisJCQkvLyBkZWxldGUgZW1iZWRkZWQgdGh1bWJuYWlsCisJCQlGcmVlSW1hZ2VfVW5sb2FkKEZyZWVJbWFnZV9HZXRUaHVtYm5haWwoZGliKSk7CisKKwkJCS8vIGRlbGV0ZSBiaXRtYXAgLi4uCisJCQlGcmVlSW1hZ2VfQWxpZ25lZF9GcmVlKGRpYi0+ZGF0YSk7CisJCX0KKworCQlmcmVlKGRpYik7CQkvLyAuLi4gYW5kIHRoZSB3cmFwcGVyCisJfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0ZJQklUTUFQICogRExMX0NBTExDT05WCitGcmVlSW1hZ2VfQ2xvbmUoRklCSVRNQVAgKmRpYikgeworCWlmKCFkaWIpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJRlJFRV9JTUFHRV9UWVBFIHR5cGUgPSBGcmVlSW1hZ2VfR2V0SW1hZ2VUeXBlKGRpYik7CisJdW5zaWduZWQgd2lkdGgJPSBGcmVlSW1hZ2VfR2V0V2lkdGgoZGliKTsKKwl1bnNpZ25lZCBoZWlnaHQJPSBGcmVlSW1hZ2VfR2V0SGVpZ2h0KGRpYik7CisJdW5zaWduZWQgYnBwCT0gRnJlZUltYWdlX0dldEJQUChkaWIpOworCisJY29uc3QgQllURSAqZXh0X2JpdHMgPSAoKEZSRUVJTUFHRUhFQURFUiAqKWRpYi0+ZGF0YSktPmV4dGVybmFsX2JpdHM7CisJCisJLy8gY2hlY2sgZm9yIHBpeGVsIGF2YWlsYWJpbGl0eSAuLi4KKwlCT09MIGhlYWRlcl9vbmx5ID0gRnJlZUltYWdlX0hhc1BpeGVscyhkaWIpID8gRkFMU0UgOiBUUlVFOworCisJLy8gY2hlY2sgd2hldGhlciB0aGlzIGltYWdlIGhhcyBtYXNrcyBkZWZpbmVkIC4uLgorCUJPT0wgbmVlZF9tYXNrcyA9IChicHAgPT0gMTYgJiYgdHlwZSA9PSBGSVRfQklUTUFQKSA/IFRSVUUgOiBGQUxTRTsKKworCS8vIGFsbG9jYXRlIGEgbmV3IGRpYgorCUZJQklUTUFQICpuZXdfZGliID0gRnJlZUltYWdlX0FsbG9jYXRlSGVhZGVyVChoZWFkZXJfb25seSwgdHlwZSwgd2lkdGgsIGhlaWdodCwgYnBwLAorCQkJRnJlZUltYWdlX0dldFJlZE1hc2soZGliKSwgRnJlZUltYWdlX0dldEdyZWVuTWFzayhkaWIpLCBGcmVlSW1hZ2VfR2V0Qmx1ZU1hc2soZGliKSk7CisKKwlpZiAobmV3X2RpYikgeworCQkvLyBzYXZlIElDQyBwcm9maWxlIGxpbmtzCisJCUZJSUNDUFJPRklMRSAqc3JjX2ljY1Byb2ZpbGUgPSBGcmVlSW1hZ2VfR2V0SUNDUHJvZmlsZShkaWIpOworCQlGSUlDQ1BST0ZJTEUgKmRzdF9pY2NQcm9maWxlID0gRnJlZUltYWdlX0dldElDQ1Byb2ZpbGUobmV3X2RpYik7CisKKwkJLy8gc2F2ZSBtZXRhZGF0YSBsaW5rcworCQlNRVRBREFUQU1BUCAqc3JjX21ldGFkYXRhID0gKChGUkVFSU1BR0VIRUFERVIgKilkaWItPmRhdGEpLT5tZXRhZGF0YTsKKwkJTUVUQURBVEFNQVAgKmRzdF9tZXRhZGF0YSA9ICgoRlJFRUlNQUdFSEVBREVSICopbmV3X2RpYi0+ZGF0YSktPm1ldGFkYXRhOworCisJCS8vIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgc3JjIGltYWdlCisJCS8vIGFsaWduIHRoZSBwYWxldHRlIGFuZCB0aGUgcGl4ZWxzIG9uIGEgRklCSVRNQVBfQUxJR05NRU5UIGJ5dGVzIGFsaWdubWVudCBib3VuZGFyeQorCQkvLyBwYWxldHRlIGlzIGFsaWduZWQgb24gYSAxNiBieXRlcyBib3VuZGFyeQorCQkvLyBwaXhlbHMgYXJlIGFsaWduZWQgb24gYSAxNiBieXRlcyBib3VuZGFyeQorCQkKKwkJLy8gd2hlbiB1c2luZyBhIHVzZXIgcHJvdmlkZWQgcGl4ZWwgYnVmZmVyLCBmb3JjZSBhICdoZWFkZXIgb25seScgY2FsY3VsYXRpb24JCQorCisJCXNpemVfdCBkaWJfc2l6ZSA9IEZyZWVJbWFnZV9HZXRJbnRlcm5hbEltYWdlU2l6ZShoZWFkZXJfb25seSB8fCBleHRfYml0cywgd2lkdGgsIGhlaWdodCwgYnBwLCBuZWVkX21hc2tzKTsKKworCQkvLyBjb3B5IHRoZSBiaXRtYXAgKyBpbnRlcm5hbCBwb2ludGVycyAocmVtZW1iZXIgdG8gcmVzdG9yZSBuZXdfZGliIGludGVybmFsIHBvaW50ZXJzIGxhdGVyKQorCQltZW1jcHkobmV3X2RpYi0+ZGF0YSwgZGliLT5kYXRhLCBkaWJfc2l6ZSk7CisKKwkJLy8gcmVzZXQgSUNDIHByb2ZpbGUgbGluayBmb3IgbmV3X2RpYgorCQltZW1zZXQoZHN0X2ljY1Byb2ZpbGUsIDAsIHNpemVvZihGSUlDQ1BST0ZJTEUpKTsKKworCQkvLyByZXN0b3JlIG1ldGFkYXRhIGxpbmsgZm9yIG5ld19kaWIKKwkJKChGUkVFSU1BR0VIRUFERVIgKiluZXdfZGliLT5kYXRhKS0+bWV0YWRhdGEgPSBkc3RfbWV0YWRhdGE7CisKKwkJLy8gcmVzZXQgdGh1bWJuYWlsIGxpbmsgZm9yIG5ld19kaWIKKwkJKChGUkVFSU1BR0VIRUFERVIgKiluZXdfZGliLT5kYXRhKS0+dGh1bWJuYWlsID0gTlVMTDsKKworCQkvLyBjb3B5IHBvc3NpYmxlIElDQyBwcm9maWxlCisJCUZyZWVJbWFnZV9DcmVhdGVJQ0NQcm9maWxlKG5ld19kaWIsIHNyY19pY2NQcm9maWxlLT5kYXRhLCBzcmNfaWNjUHJvZmlsZS0+c2l6ZSk7CisJCWRzdF9pY2NQcm9maWxlLT5mbGFncyA9IHNyY19pY2NQcm9maWxlLT5mbGFnczsKKworCQkvLyBjb3B5IG1ldGFkYXRhIG1vZGVscworCQlmb3IoTUVUQURBVEFNQVA6Oml0ZXJhdG9yIGkgPSAoKnNyY19tZXRhZGF0YSkuYmVnaW4oKTsgaSAhPSAoKnNyY19tZXRhZGF0YSkuZW5kKCk7IGkrKykgeworCQkJaW50IG1vZGVsID0gKCppKS5maXJzdDsKKwkJCVRBR01BUCAqc3JjX3RhZ21hcCA9ICgqaSkuc2Vjb25kOworCisJCQlpZihzcmNfdGFnbWFwKSB7CisJCQkJLy8gY3JlYXRlIGEgbWV0YWRhdGEgbW9kZWwKKwkJCQlUQUdNQVAgKmRzdF90YWdtYXAgPSBuZXcoc3RkOjpub3Rocm93KSBUQUdNQVAoKTsKKworCQkJCWlmKGRzdF90YWdtYXApIHsKKwkJCQkJLy8gZmlsbCB0aGUgbW9kZWwKKwkJCQkJZm9yKFRBR01BUDo6aXRlcmF0b3IgaiA9IHNyY190YWdtYXAtPmJlZ2luKCk7IGogIT0gc3JjX3RhZ21hcC0+ZW5kKCk7IGorKykgeworCQkJCQkJc3RkOjpzdHJpbmcgZHN0X2tleSA9ICgqaikuZmlyc3Q7CisJCQkJCQlGSVRBRyAqZHN0X3RhZyA9IEZyZWVJbWFnZV9DbG9uZVRhZyggKCpqKS5zZWNvbmQgKTsKKworCQkJCQkJLy8gYXNzaWduIGtleSBhbmQgdGFnIHZhbHVlCisJCQkJCQkoKmRzdF90YWdtYXApW2RzdF9rZXldID0gZHN0X3RhZzsKKwkJCQkJfQorCisJCQkJCS8vIGFzc2lnbiBtb2RlbCBhbmQgdGFnbWFwCisJCQkJCSgqZHN0X21ldGFkYXRhKVttb2RlbF0gPSBkc3RfdGFnbWFwOworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8vIGNvcHkgdGhlIHRodW1ibmFpbAorCQlGcmVlSW1hZ2VfU2V0VGh1bWJuYWlsKG5ld19kaWIsIEZyZWVJbWFnZV9HZXRUaHVtYm5haWwoZGliKSk7CisKKwkJLy8gY29weSB1c2VyIHByb3ZpZGVkIHBpeGVsIGJ1ZmZlciAoaWYgYW55KQorCQlpZihleHRfYml0cykgeworCQkJY29uc3QgdW5zaWduZWQgcGl0Y2ggPSBGcmVlSW1hZ2VfR2V0UGl0Y2goZGliKTsKKwkJCWNvbnN0IHVuc2lnbmVkIGxpbmVzaXplID0gRnJlZUltYWdlX0dldExpbmUoZGliKTsKKwkJCWZvcih1bnNpZ25lZCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisJCQkJbWVtY3B5KEZyZWVJbWFnZV9HZXRTY2FuTGluZShuZXdfZGliLCB5KSwgZXh0X2JpdHMsIGxpbmVzaXplKTsKKwkJCQlleHRfYml0cyArPSBwaXRjaDsKKwkJCX0KKwkJfQorCisJCXJldHVybiBuZXdfZGliOworCX0KKworCXJldHVybiBOVUxMOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0JZVEUgKiBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9HZXRCaXRzKEZJQklUTUFQICpkaWIpIHsKKwlpZighRnJlZUltYWdlX0hhc1BpeGVscyhkaWIpKSB7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmKCgoRlJFRUlNQUdFSEVBREVSICopZGliLT5kYXRhKS0+ZXh0ZXJuYWxfYml0cykgeworCQlyZXR1cm4gKChGUkVFSU1BR0VIRUFERVIgKilkaWItPmRhdGEpLT5leHRlcm5hbF9iaXRzOworCX0KKworCS8vIHJldHVybnMgdGhlIHBpeGVscyBhbGlnbmVkIG9uIGEgRklCSVRNQVBfQUxJR05NRU5UIGJ5dGVzIGFsaWdubWVudCBib3VuZGFyeQorCXNpemVfdCBscCA9IChzaXplX3QpRnJlZUltYWdlX0dldEluZm9IZWFkZXIoZGliKTsKKwlscCArPSBzaXplb2YoQklUTUFQSU5GT0hFQURFUikgKyBzaXplb2YoUkdCUVVBRCkgKiBGcmVlSW1hZ2VfR2V0Q29sb3JzVXNlZChkaWIpOworCWxwICs9IEZyZWVJbWFnZV9IYXNSR0JNYXNrcyhkaWIpID8gc2l6ZW9mKERXT1JEKSAqIDMgOiAwOworCWxwICs9IChscCAlIEZJQklUTUFQX0FMSUdOTUVOVCA/IEZJQklUTUFQX0FMSUdOTUVOVCAtIGxwICUgRklCSVRNQVBfQUxJR05NRU5UIDogMCk7CisJcmV0dXJuIChCWVRFICopbHA7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBESUIgaW5mb3JtYXRpb24gZnVuY3Rpb25zCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0ZJQklUTUFQKiBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9HZXRUaHVtYm5haWwoRklCSVRNQVAgKmRpYikgeworCXJldHVybiAoZGliICE9IE5VTEwpID8gKChGUkVFSU1BR0VIRUFERVIgKilkaWItPmRhdGEpLT50aHVtYm5haWwgOiBOVUxMOworfQorCitCT09MIERMTF9DQUxMQ09OVgorRnJlZUltYWdlX1NldFRodW1ibmFpbChGSUJJVE1BUCAqZGliLCBGSUJJVE1BUCAqdGh1bWJuYWlsKSB7CisJaWYoZGliID09IE5VTEwpIHsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwlGSUJJVE1BUCAqY3VycmVudFRodW1ibmFpbCA9ICgoRlJFRUlNQUdFSEVBREVSICopZGliLT5kYXRhKS0+dGh1bWJuYWlsOworCWlmKGN1cnJlbnRUaHVtYm5haWwgPT0gdGh1bWJuYWlsKSB7CisJCXJldHVybiBUUlVFOworCX0KKwlGcmVlSW1hZ2VfVW5sb2FkKGN1cnJlbnRUaHVtYm5haWwpOworCisJKChGUkVFSU1BR0VIRUFERVIgKilkaWItPmRhdGEpLT50aHVtYm5haWwgPSBGcmVlSW1hZ2VfSGFzUGl4ZWxzKHRodW1ibmFpbCkgPyBGcmVlSW1hZ2VfQ2xvbmUodGh1bWJuYWlsKSA6IE5VTEw7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitGUkVFX0lNQUdFX0NPTE9SX1RZUEUgRExMX0NBTExDT05WCitGcmVlSW1hZ2VfR2V0Q29sb3JUeXBlKEZJQklUTUFQICpkaWIpIHsKKwlSR0JRVUFEICpyZ2I7CisKKwljb25zdCBGUkVFX0lNQUdFX1RZUEUgaW1hZ2VfdHlwZSA9IEZyZWVJbWFnZV9HZXRJbWFnZVR5cGUoZGliKTsKKworCS8vIHNwZWNpYWwgYml0bWFwIHR5cGUKKwlpZihpbWFnZV90eXBlICE9IEZJVF9CSVRNQVApIHsKKwkJc3dpdGNoKGltYWdlX3R5cGUpIHsKKwkJCWNhc2UgRklUX1VJTlQxNjoKKwkJCXsKKwkJCQkvLyAxNi1iaXQgZ3JleXNjYWxlIFRJRiBjYW4gYmUgZWl0aGVyIEZJQ19NSU5JU0JMQUNLICh0aGUgbW9zdCBjb21tb24gY2FzZSkgb3IgRklDX01JTklTV0hJVEUKKwkJCQkvLyB5b3UgY2FuIGNoZWNrIHRoaXMgdXNpbmcgRVhJRl9NQUlOIG1ldGFkYXRhCisJCQkJRklUQUcgKnBob3RvbWV0cmljVGFnID0gTlVMTDsKKwkJCQlpZihGcmVlSW1hZ2VfR2V0TWV0YWRhdGEoRklNRF9FWElGX01BSU4sIGRpYiwgIlBob3RvbWV0cmljSW50ZXJwcmV0YXRpb24iLCAmcGhvdG9tZXRyaWNUYWcpKSB7CisJCQkJCWNvbnN0IHNob3J0ICp2YWx1ZSA9IChzaG9ydCopRnJlZUltYWdlX0dldFRhZ1ZhbHVlKHBob3RvbWV0cmljVGFnKTsKKwkJCQkJLy8gUEhPVE9NRVRSSUNfTUlOSVNXSElURSA9IDAgPT4gbWluIHZhbHVlIGlzIHdoaXRlCisJCQkJCS8vIFBIT1RPTUVUUklDX01JTklTQkxBQ0sgPSAxID0+IG1pbiB2YWx1ZSBpcyBibGFjaworCQkJCQlyZXR1cm4gKCp2YWx1ZSA9PSAwKSA/IEZJQ19NSU5JU1dISVRFIDogRklDX01JTklTQkxBQ0s7CisJCQkJfQorCQkJCXJldHVybiBGSUNfTUlOSVNCTEFDSzsKKwkJCX0KKwkJCWJyZWFrOworCQkJY2FzZSBGSVRfUkdCMTY6CisJCQljYXNlIEZJVF9SR0JGOgorCQkJCXJldHVybiBGSUNfUkdCOworCQkJY2FzZSBGSVRfUkdCQTE2OgorCQkJY2FzZSBGSVRfUkdCQUY6CisJCQkJcmV0dXJuIEZJQ19SR0JBTFBIQTsKKwkJfQorCisJCXJldHVybiBGSUNfTUlOSVNCTEFDSzsKKwl9CisKKwkvLyBzdGFuZGFyZCBpbWFnZSB0eXBlCisJc3dpdGNoIChGcmVlSW1hZ2VfR2V0QlBQKGRpYikpIHsKKwkJY2FzZSAxOgorCQl7CisJCQlyZ2IgPSBGcmVlSW1hZ2VfR2V0UGFsZXR0ZShkaWIpOworCisJCQlpZiAoKHJnYi0+cmdiUmVkID09IDApICYmIChyZ2ItPnJnYkdyZWVuID09IDApICYmIChyZ2ItPnJnYkJsdWUgPT0gMCkpIHsKKwkJCQlyZ2IrKzsKKworCQkJCWlmICgocmdiLT5yZ2JSZWQgPT0gMjU1KSAmJiAocmdiLT5yZ2JHcmVlbiA9PSAyNTUpICYmIChyZ2ItPnJnYkJsdWUgPT0gMjU1KSkgeworCQkJCQlyZXR1cm4gRklDX01JTklTQkxBQ0s7CisJCQkJfQorCQkJfQorCisJCQlpZiAoKHJnYi0+cmdiUmVkID09IDI1NSkgJiYgKHJnYi0+cmdiR3JlZW4gPT0gMjU1KSAmJiAocmdiLT5yZ2JCbHVlID09IDI1NSkpIHsKKwkJCQlyZ2IrKzsKKworCQkJCWlmICgocmdiLT5yZ2JSZWQgPT0gMCkgJiYgKHJnYi0+cmdiR3JlZW4gPT0gMCkgJiYgKHJnYi0+cmdiQmx1ZSA9PSAwKSkgeworCQkJCQlyZXR1cm4gRklDX01JTklTV0hJVEU7CisJCQkJfQorCQkJfQorCisJCQlyZXR1cm4gRklDX1BBTEVUVEU7CisJCX0KKworCQljYXNlIDQ6CisJCWNhc2UgODoJLy8gQ2hlY2sgaWYgdGhlIERJQiBoYXMgYSBjb2xvciBvciBhIGdyZXlzY2FsZSBwYWxldHRlCisJCXsKKwkJCWludCBuY29sb3JzID0gRnJlZUltYWdlX0dldENvbG9yc1VzZWQoZGliKTsKKwkJICAgIGludCBtaW5pc2JsYWNrID0gMTsKKwkJCXJnYiA9IEZyZWVJbWFnZV9HZXRQYWxldHRlKGRpYik7CisKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmNvbG9yczsgaSsrKSB7CisJCQkJaWYgKChyZ2ItPnJnYlJlZCAhPSByZ2ItPnJnYkdyZWVuKSB8fCAocmdiLT5yZ2JSZWQgIT0gcmdiLT5yZ2JCbHVlKSkgeworCQkJCQlyZXR1cm4gRklDX1BBTEVUVEU7CisJCQkJfQorCisJCQkJLy8gVGhlIERJQiBoYXMgYSBjb2xvciBwYWxldHRlIGlmIHRoZSBncmV5c2NhbGUgaXNuJ3QgYSBsaW5lYXIgcmFtcAorCQkJCS8vIFRha2UgY2FyZSBvZiByZXZlcnNlZCBncmV5IGltYWdlcworCQkJCWlmIChyZ2ItPnJnYlJlZCAhPSBpKSB7CisJCQkJCWlmICgobmNvbG9ycy1pLTEpICE9IHJnYi0+cmdiUmVkKSB7CisJCQkJCQlyZXR1cm4gRklDX1BBTEVUVEU7CisJCQkJCX0gZWxzZSB7CisJCQkJCQltaW5pc2JsYWNrID0gMDsKKwkJCQkJfQorCQkJCX0KKworCQkJCXJnYisrOworCQkJfQorCisJCQlyZXR1cm4gbWluaXNibGFjayA/IEZJQ19NSU5JU0JMQUNLIDogRklDX01JTklTV0hJVEU7CisJCX0KKworCQljYXNlIDE2OgorCQljYXNlIDI0OgorCQkJcmV0dXJuIEZJQ19SR0I7CisKKwkJY2FzZSAzMjoKKwkJeworCQkJaWYgKEZyZWVJbWFnZV9HZXRJQ0NQcm9maWxlKGRpYiktPmZsYWdzICYgRklJQ0NfQ09MT1JfSVNfQ01ZSykgeworCQkJCXJldHVybiBGSUNfQ01ZSzsKKwkJCX0KKworCQkJaWYoIEZyZWVJbWFnZV9IYXNQaXhlbHMoZGliKSApIHsKKwkJCQkvLyBjaGVjayBmb3IgZnVsbHkgb3BhcXVlIGFscGhhIGxheWVyCisJCQkJZm9yICh1bnNpZ25lZCB5ID0gMDsgeSA8IEZyZWVJbWFnZV9HZXRIZWlnaHQoZGliKTsgeSsrKSB7CisJCQkJCXJnYiA9IChSR0JRVUFEICopRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgeSk7CisKKwkJCQkJZm9yICh1bnNpZ25lZCB4ID0gMDsgeCA8IEZyZWVJbWFnZV9HZXRXaWR0aChkaWIpOyB4KyspIHsKKwkJCQkJCWlmIChyZ2JbeF0ucmdiUmVzZXJ2ZWQgIT0gMHhGRikgeworCQkJCQkJCXJldHVybiBGSUNfUkdCQUxQSEE7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJcmV0dXJuIEZJQ19SR0I7CisJCQl9CisKKwkJCXJldHVybiBGSUNfUkdCQUxQSEE7CisJCX0KKwkJCQkKKwkJZGVmYXVsdCA6CisJCQlyZXR1cm4gRklDX01JTklTQkxBQ0s7CisJfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0ZSRUVfSU1BR0VfVFlQRSBETExfQ0FMTENPTlYgCitGcmVlSW1hZ2VfR2V0SW1hZ2VUeXBlKEZJQklUTUFQICpkaWIpIHsKKwlyZXR1cm4gKGRpYiAhPSBOVUxMKSA/ICgoRlJFRUlNQUdFSEVBREVSICopZGliLT5kYXRhKS0+dHlwZSA6IEZJVF9VTktOT1dOOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0JPT0wgRExMX0NBTExDT05WIAorRnJlZUltYWdlX0hhc1BpeGVscyhGSUJJVE1BUCAqZGliKSB7CisJcmV0dXJuIChkaWIgIT0gTlVMTCkgPyAoKEZSRUVJTUFHRUhFQURFUiAqKWRpYi0+ZGF0YSktPmhhc19waXhlbHMgOiBGQUxTRTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitCT09MIERMTF9DQUxMQ09OVgorRnJlZUltYWdlX0hhc1JHQk1hc2tzKEZJQklUTUFQICpkaWIpIHsKKwlyZXR1cm4gZGliICYmIEZyZWVJbWFnZV9HZXRJbmZvSGVhZGVyKGRpYiktPmJpQ29tcHJlc3Npb24gPT0gQklfQklURklFTERTOworfQorCit1bnNpZ25lZCBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9HZXRSZWRNYXNrKEZJQklUTUFQICpkaWIpIHsKKwlGUkVFSU1BR0VSR0JNQVNLUyAqbWFza3MgPSBOVUxMOworCUZSRUVfSU1BR0VfVFlQRSBpbWFnZV90eXBlID0gRnJlZUltYWdlX0dldEltYWdlVHlwZShkaWIpOworCXN3aXRjaChpbWFnZV90eXBlKSB7CisJCWNhc2UgRklUX0JJVE1BUDoKKwkJCS8vIGNoZWNrIGZvciAxNi1iaXQgUkdCICg1NjUgb3IgNTU1KQorCQkJbWFza3MgPSBGcmVlSW1hZ2VfR2V0UkdCTWFza3MoZGliKTsKKwkJCWlmIChtYXNrcykgeworCQkJCXJldHVybiBtYXNrcy0+cmVkX21hc2s7CisJCQl9CisJCQlyZXR1cm4gRnJlZUltYWdlX0dldEJQUChkaWIpID49IDI0ID8gRklfUkdCQV9SRURfTUFTSyA6IDA7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMDsKKwl9Cit9CisKK3Vuc2lnbmVkIERMTF9DQUxMQ09OVgorRnJlZUltYWdlX0dldEdyZWVuTWFzayhGSUJJVE1BUCAqZGliKSB7CisJRlJFRUlNQUdFUkdCTUFTS1MgKm1hc2tzID0gTlVMTDsKKwlGUkVFX0lNQUdFX1RZUEUgaW1hZ2VfdHlwZSA9IEZyZWVJbWFnZV9HZXRJbWFnZVR5cGUoZGliKTsKKwlzd2l0Y2goaW1hZ2VfdHlwZSkgeworCQljYXNlIEZJVF9CSVRNQVA6CisJCQkvLyBjaGVjayBmb3IgMTYtYml0IFJHQiAoNTY1IG9yIDU1NSkKKwkJCW1hc2tzID0gRnJlZUltYWdlX0dldFJHQk1hc2tzKGRpYik7CisJCQlpZiAobWFza3MpIHsKKwkJCQlyZXR1cm4gbWFza3MtPmdyZWVuX21hc2s7CisJCQl9CisJCQlyZXR1cm4gRnJlZUltYWdlX0dldEJQUChkaWIpID49IDI0ID8gRklfUkdCQV9HUkVFTl9NQVNLIDogMDsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAwOworCX0KK30KKwordW5zaWduZWQgRExMX0NBTExDT05WCitGcmVlSW1hZ2VfR2V0Qmx1ZU1hc2soRklCSVRNQVAgKmRpYikgeworCUZSRUVJTUFHRVJHQk1BU0tTICptYXNrcyA9IE5VTEw7CisJRlJFRV9JTUFHRV9UWVBFIGltYWdlX3R5cGUgPSBGcmVlSW1hZ2VfR2V0SW1hZ2VUeXBlKGRpYik7CisJc3dpdGNoKGltYWdlX3R5cGUpIHsKKwkJY2FzZSBGSVRfQklUTUFQOgorCQkJLy8gY2hlY2sgZm9yIDE2LWJpdCBSR0IgKDU2NSBvciA1NTUpCisJCQltYXNrcyA9IEZyZWVJbWFnZV9HZXRSR0JNYXNrcyhkaWIpOworCQkJaWYgKG1hc2tzKSB7CisJCQkJcmV0dXJuIG1hc2tzLT5ibHVlX21hc2s7CisJCQl9CisJCQlyZXR1cm4gRnJlZUltYWdlX0dldEJQUChkaWIpID49IDI0ID8gRklfUkdCQV9CTFVFX01BU0sgOiAwOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0JPT0wgRExMX0NBTExDT05WCitGcmVlSW1hZ2VfSGFzQmFja2dyb3VuZENvbG9yKEZJQklUTUFQICpkaWIpIHsKKwlpZihkaWIpIHsKKwkJUkdCUVVBRCAqYmtnbmRfY29sb3IgPSAmKChGUkVFSU1BR0VIRUFERVIgKilkaWItPmRhdGEpLT5ia2duZF9jb2xvcjsKKwkJcmV0dXJuIChia2duZF9jb2xvci0+cmdiUmVzZXJ2ZWQgIT0gMCkgPyBUUlVFIDogRkFMU0U7CisJfQorCXJldHVybiBGQUxTRTsKK30KKworQk9PTCBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9HZXRCYWNrZ3JvdW5kQ29sb3IoRklCSVRNQVAgKmRpYiwgUkdCUVVBRCAqYmtjb2xvcikgeworCWlmKGRpYiAmJiBia2NvbG9yKSB7CisJCWlmKEZyZWVJbWFnZV9IYXNCYWNrZ3JvdW5kQ29sb3IoZGliKSkgeworCQkJLy8gZ2V0IHRoZSBiYWNrZ3JvdW5kIGNvbG9yCisJCQlSR0JRVUFEICpia2duZF9jb2xvciA9ICYoKEZSRUVJTUFHRUhFQURFUiAqKWRpYi0+ZGF0YSktPmJrZ25kX2NvbG9yOworCQkJbWVtY3B5KGJrY29sb3IsIGJrZ25kX2NvbG9yLCBzaXplb2YoUkdCUVVBRCkpOworCQkJLy8gZ2V0IHRoZSBiYWNrZ3JvdW5kIGluZGV4CisJCQlpZihGcmVlSW1hZ2VfR2V0QlBQKGRpYikgPT0gOCkgeworCQkJCVJHQlFVQUQgKnBhbCA9IEZyZWVJbWFnZV9HZXRQYWxldHRlKGRpYik7CisJCQkJZm9yKHVuc2lnbmVkIGkgPSAwOyBpIDwgRnJlZUltYWdlX0dldENvbG9yc1VzZWQoZGliKTsgaSsrKSB7CisJCQkJCWlmKGJrZ25kX2NvbG9yLT5yZ2JSZWQgPT0gcGFsW2ldLnJnYlJlZCkgeworCQkJCQkJaWYoYmtnbmRfY29sb3ItPnJnYkdyZWVuID09IHBhbFtpXS5yZ2JHcmVlbikgeworCQkJCQkJCWlmKGJrZ25kX2NvbG9yLT5yZ2JCbHVlID09IHBhbFtpXS5yZ2JCbHVlKSB7CisJCQkJCQkJCWJrY29sb3ItPnJnYlJlc2VydmVkID0gKEJZVEUpaTsKKwkJCQkJCQkJcmV0dXJuIFRSVUU7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlia2NvbG9yLT5yZ2JSZXNlcnZlZCA9IDA7CisKKwkJCXJldHVybiBUUlVFOworCQl9CisJfQorCisJcmV0dXJuIEZBTFNFOworfQorCitCT09MIERMTF9DQUxMQ09OViAKK0ZyZWVJbWFnZV9TZXRCYWNrZ3JvdW5kQ29sb3IoRklCSVRNQVAgKmRpYiwgUkdCUVVBRCAqYmtjb2xvcikgeworCWlmKGRpYikgeworCQlSR0JRVUFEICpia2duZF9jb2xvciA9ICYoKEZSRUVJTUFHRUhFQURFUiAqKWRpYi0+ZGF0YSktPmJrZ25kX2NvbG9yOworCQlpZihia2NvbG9yKSB7CisJCQkvLyBzZXQgdGhlIGJhY2tncm91bmQgY29sb3IKKwkJCW1lbWNweShia2duZF9jb2xvciwgYmtjb2xvciwgc2l6ZW9mKFJHQlFVQUQpKTsKKwkJCS8vIGVuYWJsZSB0aGUgZmlsZSBiYWNrZ3JvdW5kIGNvbG9yCisJCQlia2duZF9jb2xvci0+cmdiUmVzZXJ2ZWQgPSAxOworCQl9IGVsc2UgeworCQkJLy8gY2xlYXIgYW5kIGRpc2FibGUgdGhlIGZpbGUgYmFja2dyb3VuZCBjb2xvcgorCQkJbWVtc2V0KGJrZ25kX2NvbG9yLCAwLCBzaXplb2YoUkdCUVVBRCkpOworCQl9CisJCXJldHVybiBUUlVFOworCX0KKworCXJldHVybiBGQUxTRTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitCT09MIERMTF9DQUxMQ09OVgorRnJlZUltYWdlX0lzVHJhbnNwYXJlbnQoRklCSVRNQVAgKmRpYikgeworCWlmKGRpYikgeworCQlGUkVFX0lNQUdFX1RZUEUgaW1hZ2VfdHlwZSA9IEZyZWVJbWFnZV9HZXRJbWFnZVR5cGUoZGliKTsKKwkJc3dpdGNoKGltYWdlX3R5cGUpIHsKKwkJCWNhc2UgRklUX0JJVE1BUDoKKwkJCQlpZihGcmVlSW1hZ2VfR2V0QlBQKGRpYikgPT0gMzIpIHsKKwkJCQkJaWYoRnJlZUltYWdlX0dldENvbG9yVHlwZShkaWIpID09IEZJQ19SR0JBTFBIQSkgeworCQkJCQkJcmV0dXJuIFRSVUU7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlyZXR1cm4gKChGUkVFSU1BR0VIRUFERVIgKilkaWItPmRhdGEpLT50cmFuc3BhcmVudCA/IFRSVUUgOiBGQUxTRTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIEZJVF9SR0JBMTY6CisJCQljYXNlIEZJVF9SR0JBRjoKKwkJCQlyZXR1cm4gVFJVRTsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIEZBTFNFOworfQorCitCWVRFICogRExMX0NBTExDT05WCitGcmVlSW1hZ2VfR2V0VHJhbnNwYXJlbmN5VGFibGUoRklCSVRNQVAgKmRpYikgeworCXJldHVybiBkaWIgPyAoKEZSRUVJTUFHRUhFQURFUiAqKWRpYi0+ZGF0YSktPnRyYW5zcGFyZW50X3RhYmxlIDogTlVMTDsKK30KKwordm9pZCBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9TZXRUcmFuc3BhcmVudChGSUJJVE1BUCAqZGliLCBCT09MIGVuYWJsZWQpIHsKKwlpZiAoZGliKSB7CisJCWlmICgoRnJlZUltYWdlX0dldEJQUChkaWIpIDw9IDgpIHx8IChGcmVlSW1hZ2VfR2V0QlBQKGRpYikgPT0gMzIpKSB7CisJCQkoKEZSRUVJTUFHRUhFQURFUiAqKWRpYi0+ZGF0YSktPnRyYW5zcGFyZW50ID0gZW5hYmxlZDsKKwkJfSBlbHNlIHsKKwkJCSgoRlJFRUlNQUdFSEVBREVSICopZGliLT5kYXRhKS0+dHJhbnNwYXJlbnQgPSBGQUxTRTsKKwkJfQorCX0KK30KKwordW5zaWduZWQgRExMX0NBTExDT05WCitGcmVlSW1hZ2VfR2V0VHJhbnNwYXJlbmN5Q291bnQoRklCSVRNQVAgKmRpYikgeworCXJldHVybiBkaWIgPyAoKEZSRUVJTUFHRUhFQURFUiAqKWRpYi0+ZGF0YSktPnRyYW5zcGFyZW5jeV9jb3VudCA6IDA7Cit9CisKK3ZvaWQgRExMX0NBTExDT05WCitGcmVlSW1hZ2VfU2V0VHJhbnNwYXJlbmN5VGFibGUoRklCSVRNQVAgKmRpYiwgQllURSAqdGFibGUsIGludCBjb3VudCkgeworCWlmIChkaWIpIHsKKwkJY291bnQgPSBNQVgoMCwgTUlOKGNvdW50LCAyNTYpKTsKKwkJaWYgKEZyZWVJbWFnZV9HZXRCUFAoZGliKSA8PSA4KSB7CisJCQkoKEZSRUVJTUFHRUhFQURFUiAqKWRpYi0+ZGF0YSktPnRyYW5zcGFyZW50ID0gKGNvdW50ID4gMCkgPyBUUlVFIDogRkFMU0U7CisJCQkoKEZSRUVJTUFHRUhFQURFUiAqKWRpYi0+ZGF0YSktPnRyYW5zcGFyZW5jeV9jb3VudCA9IGNvdW50OworCisJCQlpZiAodGFibGUpIHsKKwkJCQltZW1jcHkoKChGUkVFSU1BR0VIRUFERVIgKilkaWItPmRhdGEpLT50cmFuc3BhcmVudF90YWJsZSwgdGFibGUsIGNvdW50KTsKKwkJCX0gZWxzZSB7CisJCQkJbWVtc2V0KCgoRlJFRUlNQUdFSEVBREVSICopZGliLT5kYXRhKS0+dHJhbnNwYXJlbnRfdGFibGUsIDB4ZmYsIGNvdW50KTsKKwkJCX0KKwkJfSAKKwl9Cit9CisKKy8qKiBAYnJpZWYgU2V0cyB0aGUgaW5kZXggb2YgdGhlIHBhbGV0dGUgZW50cnkgdG8gYmUgdXNlZCBhcyB0cmFuc3BhcmVudCBjb2xvcgorIGZvciB0aGUgaW1hZ2Ugc3BlY2lmaWVkLiBEb2VzIG5vdGhpbmcgb24gaGlnaCBjb2xvciBpbWFnZXMuIAorIAorIFRoaXMgbWV0aG9kIHNldHMgdGhlIGluZGV4IG9mIHRoZSBwYWxldHRlIGVudHJ5IHRvIGJlIHVzZWQgYXMgc2luZ2xlIHRyYW5zcGFyZW50CisgY29sb3IgZm9yIHRoZSBpbWFnZSBzcGVjaWZpZWQuIFRoaXMgd29ya3Mgb24gcGFsbGV0aXNlZCBpbWFnZXMgb25seSBhbmQgZG9lcworIG5vdGhpbmcgZm9yIGhpZ2ggY29sb3IgaW1hZ2VzLgorIAorIEFsdGhvdWdoIGl0IGlzIHBvc3NpYmxlIGZvciBwYWxsZXRpc2VkIGltYWdlcyB0byBoYXZlIG1vcmUgdGhhbiBvbmUgdHJhbnNwYXJlbnQKKyBjb2xvciwgdGhpcyBtZXRob2Qgc2V0cyB0aGUgcGFsZXR0ZSBlbnRyeSBzcGVjaWZpZWQgYXMgdGhlIHNpbmdsZSB0cmFuc3BhcmVudAorIGNvbG9yIGZvciB0aGUgaW1hZ2UuIEFsbCBvdGhlciBjb2xvcnMgd2lsbCBiZSBzZXQgdG8gYmUgbm9uLXRyYW5zcGFyZW50IGJ5IHRoaXMKKyBtZXRob2QuCisgCisgQXMgd2l0aCBGcmVlSW1hZ2VfU2V0VHJhbnNwYXJlbmN5VGFibGUoKSwgdGhpcyBtZXRob2QgYWxzbyBzZXRzIHRoZSBpbWFnZSdzCisgdHJhbnNwYXJlbmN5IHByb3BlcnR5IHRvIFRSVUUgKGFzIGl0IGlzIHNldCBhbmQgb2J0YWluZWQgYnkKKyBGcmVlSW1hZ2VfU2V0VHJhbnNwYXJlbnQoKSBhbmQgRnJlZUltYWdlX0lzVHJhbnNwYXJlbnQoKSByZXNwZWN0aXZlbHkpIGZvcgorIHBhbGxldGlzZWQgaW1hZ2VzLgorIAorIEBwYXJhbSBkaWIgSW5wdXQgaW1hZ2UsIHdob3NlIHRyYW5zcGFyZW50IGNvbG9yIGlzIHRvIGJlIHNldC4KKyBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBwYWxldHRlIGVudHJ5IHRvIGJlIHNldCBhcyB0cmFuc3BhcmVudCBjb2xvci4KKyAqLwordm9pZCBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9TZXRUcmFuc3BhcmVudEluZGV4KEZJQklUTUFQICpkaWIsIGludCBpbmRleCkgeworCWlmIChkaWIpIHsKKwkJaW50IGNvdW50ID0gRnJlZUltYWdlX0dldENvbG9yc1VzZWQoZGliKTsKKwkJaWYgKGNvdW50KSB7CisJCQlCWVRFICpuZXdfdHQgPSAoQllURSAqKW1hbGxvYyhjb3VudCAqIHNpemVvZihCWVRFKSk7CisJCQltZW1zZXQobmV3X3R0LCAweEZGLCBjb3VudCk7CisJCQlpZiAoKGluZGV4ID49IDApICYmIChpbmRleCA8IGNvdW50KSkgeworCQkJCW5ld190dFtpbmRleF0gPSAweDAwOworCQkJfQorCQkJRnJlZUltYWdlX1NldFRyYW5zcGFyZW5jeVRhYmxlKGRpYiwgbmV3X3R0LCBjb3VudCk7CisJCQlmcmVlKG5ld190dCk7CisJCX0KKwl9Cit9CisKKy8qKiBAYnJpZWYgUmV0dXJucyB0aGUgcGFsZXR0ZSBlbnRyeSB1c2VkIGFzIHRyYW5zcGFyZW50IGNvbG9yIGZvciB0aGUgaW1hZ2UKKyBzcGVjaWZpZWQuIFdvcmtzIGZvciBwYWxsZXRpc2VkIGltYWdlcyBvbmx5IGFuZCByZXR1cm5zIC0xIGZvciBoaWdoIGNvbG9yCisgaW1hZ2VzIG9yIGlmIHRoZSBpbWFnZSBoYXMgbm8gY29sb3Igc2V0IHRvIGJlIHRyYW5zcGFyZW50LiAKKyAKKyBBbHRob3VnaCBpdCBpcyBwb3NzaWJsZSBmb3IgcGFsbGV0aXNlZCBpbWFnZXMgdG8gaGF2ZSBtb3JlIHRoYW4gb25lIHRyYW5zcGFyZW50CisgY29sb3IsIHRoaXMgZnVuY3Rpb24gYWx3YXlzIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBwYWxldHRlIGVudHJ5LCBzZXQKKyB0byBiZSB0cmFuc3BhcmVudC4gCisgCisgQHBhcmFtIGRpYiBJbnB1dCBpbWFnZSwgd2hvc2UgdHJhbnNwYXJlbnQgY29sb3IgaXMgdG8gYmUgcmV0dXJuZWQuCisgQHJldHVybiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgcGFsZXR0ZSBlbnRyeSB1c2VkIGFzIHRyYW5zcGFyZW50IGNvbG9yIGZvcgorIHRoZSBpbWFnZSBzcGVjaWZpZWQgb3IgLTEgaWYgdGhlcmUgaXMgbm8gdHJhbnNwYXJlbnQgY29sb3IgZm91bmQgKGUuZy4gdGhlIGltYWdlCisgaXMgYSBoaWdoIGNvbG9yIGltYWdlKS4KKyAqLworaW50IERMTF9DQUxMQ09OVgorRnJlZUltYWdlX0dldFRyYW5zcGFyZW50SW5kZXgoRklCSVRNQVAgKmRpYikgeworCWludCBjb3VudCA9IEZyZWVJbWFnZV9HZXRUcmFuc3BhcmVuY3lDb3VudChkaWIpOworCUJZVEUgKnR0ID0gRnJlZUltYWdlX0dldFRyYW5zcGFyZW5jeVRhYmxlKGRpYik7CisJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCWlmICh0dFtpXSA9PSAwKSB7CisJCQlyZXR1cm4gaTsKKwkJfQorCX0KKwlyZXR1cm4gLTE7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRklJQ0NQUk9GSUxFICogRExMX0NBTExDT05WCitGcmVlSW1hZ2VfR2V0SUNDUHJvZmlsZShGSUJJVE1BUCAqZGliKSB7CisJRklJQ0NQUk9GSUxFICpwcm9maWxlID0gKGRpYikgPyAoRklJQ0NQUk9GSUxFICopJigoRlJFRUlNQUdFSEVBREVSICopZGliLT5kYXRhKS0+aWNjUHJvZmlsZSA6IE5VTEw7CisJcmV0dXJuIHByb2ZpbGU7Cit9CisKK0ZJSUNDUFJPRklMRSAqIERMTF9DQUxMQ09OVgorRnJlZUltYWdlX0NyZWF0ZUlDQ1Byb2ZpbGUoRklCSVRNQVAgKmRpYiwgdm9pZCAqZGF0YSwgbG9uZyBzaXplKSB7CisJLy8gY2xlYXIgdGhlIHByb2ZpbGUgYnV0IHByZXNlcnZlIHByb2ZpbGUtPmZsYWdzCisJRnJlZUltYWdlX0Rlc3Ryb3lJQ0NQcm9maWxlKGRpYik7CisJLy8gY3JlYXRlIHRoZSBuZXcgcHJvZmlsZQorCUZJSUNDUFJPRklMRSAqcHJvZmlsZSA9IEZyZWVJbWFnZV9HZXRJQ0NQcm9maWxlKGRpYik7CisJaWYoc2l6ZSAmJiBwcm9maWxlKSB7CisJCXByb2ZpbGUtPmRhdGEgPSBtYWxsb2Moc2l6ZSk7CisJCWlmKHByb2ZpbGUtPmRhdGEpIHsKKwkJCW1lbWNweShwcm9maWxlLT5kYXRhLCBkYXRhLCBwcm9maWxlLT5zaXplID0gc2l6ZSk7CisJCX0KKwl9CisJcmV0dXJuIHByb2ZpbGU7Cit9CisKK3ZvaWQgRExMX0NBTExDT05WCitGcmVlSW1hZ2VfRGVzdHJveUlDQ1Byb2ZpbGUoRklCSVRNQVAgKmRpYikgeworCUZJSUNDUFJPRklMRSAqcHJvZmlsZSA9IEZyZWVJbWFnZV9HZXRJQ0NQcm9maWxlKGRpYik7CisJaWYocHJvZmlsZSkgeworCQlpZiAocHJvZmlsZS0+ZGF0YSkgeworCQkJZnJlZSAocHJvZmlsZS0+ZGF0YSk7CisJCX0KKwkJLy8gY2xlYXIgdGhlIHByb2ZpbGUgYnV0IHByZXNlcnZlIHByb2ZpbGUtPmZsYWdzCisJCXByb2ZpbGUtPmRhdGEgPSBOVUxMOworCQlwcm9maWxlLT5zaXplID0gMDsKKwl9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordW5zaWduZWQgRExMX0NBTExDT05WCitGcmVlSW1hZ2VfR2V0V2lkdGgoRklCSVRNQVAgKmRpYikgeworCXJldHVybiBkaWIgPyBGcmVlSW1hZ2VfR2V0SW5mb0hlYWRlcihkaWIpLT5iaVdpZHRoIDogMDsKK30KKwordW5zaWduZWQgRExMX0NBTExDT05WCitGcmVlSW1hZ2VfR2V0SGVpZ2h0KEZJQklUTUFQICpkaWIpIHsKKwlyZXR1cm4gKGRpYikgPyBGcmVlSW1hZ2VfR2V0SW5mb0hlYWRlcihkaWIpLT5iaUhlaWdodCA6IDA7Cit9CisKK3Vuc2lnbmVkIERMTF9DQUxMQ09OVgorRnJlZUltYWdlX0dldEJQUChGSUJJVE1BUCAqZGliKSB7CisJcmV0dXJuIGRpYiA/IEZyZWVJbWFnZV9HZXRJbmZvSGVhZGVyKGRpYiktPmJpQml0Q291bnQgOiAwOworfQorCit1bnNpZ25lZCBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9HZXRMaW5lKEZJQklUTUFQICpkaWIpIHsKKwlyZXR1cm4gZGliID8gKChGcmVlSW1hZ2VfR2V0V2lkdGgoZGliKSAqIEZyZWVJbWFnZV9HZXRCUFAoZGliKSkgKyA3KSAvIDggOiAwOworfQorCit1bnNpZ25lZCBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9HZXRQaXRjaChGSUJJVE1BUCAqZGliKSB7CisJaWYoZGliKSB7CisJCUZSRUVJTUFHRUhFQURFUiAqZmloID0gKEZSRUVJTUFHRUhFQURFUiAqKWRpYi0+ZGF0YTsKKwkJcmV0dXJuIGZpaC0+ZXh0ZXJuYWxfYml0cyA/IGZpaC0+ZXh0ZXJuYWxfcGl0Y2ggOiAoRnJlZUltYWdlX0dldExpbmUoZGliKSArIDMgJiB+Myk7CisJfQorCXJldHVybiAwOworfQorCit1bnNpZ25lZCBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9HZXRDb2xvcnNVc2VkKEZJQklUTUFQICpkaWIpIHsKKwlyZXR1cm4gZGliID8gRnJlZUltYWdlX0dldEluZm9IZWFkZXIoZGliKS0+YmlDbHJVc2VkIDogMDsKK30KKwordW5zaWduZWQgRExMX0NBTExDT05WCitGcmVlSW1hZ2VfR2V0RElCU2l6ZShGSUJJVE1BUCAqZGliKSB7CisJcmV0dXJuIChkaWIpID8gc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpICsgKEZyZWVJbWFnZV9HZXRDb2xvcnNVc2VkKGRpYikgKiBzaXplb2YoUkdCUVVBRCkpICsgKEZyZWVJbWFnZV9HZXRQaXRjaChkaWIpICogRnJlZUltYWdlX0dldEhlaWdodChkaWIpKSA6IDA7Cit9CisKK1JHQlFVQUQgKiBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9HZXRQYWxldHRlKEZJQklUTUFQICpkaWIpIHsKKwlyZXR1cm4gKGRpYiAmJiBGcmVlSW1hZ2VfR2V0QlBQKGRpYikgPCAxNikgPyAoUkdCUVVBRCAqKSgoKEJZVEUgKilGcmVlSW1hZ2VfR2V0SW5mb0hlYWRlcihkaWIpKSArIHNpemVvZihCSVRNQVBJTkZPSEVBREVSKSkgOiBOVUxMOworfQorCit1bnNpZ25lZCBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9HZXREb3RzUGVyTWV0ZXJYKEZJQklUTUFQICpkaWIpIHsKKwlyZXR1cm4gKGRpYikgPyBGcmVlSW1hZ2VfR2V0SW5mb0hlYWRlcihkaWIpLT5iaVhQZWxzUGVyTWV0ZXIgOiAwOworfQorCit1bnNpZ25lZCBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9HZXREb3RzUGVyTWV0ZXJZKEZJQklUTUFQICpkaWIpIHsKKwlyZXR1cm4gKGRpYikgPyBGcmVlSW1hZ2VfR2V0SW5mb0hlYWRlcihkaWIpLT5iaVlQZWxzUGVyTWV0ZXIgOiAwOworfQorCit2b2lkIERMTF9DQUxMQ09OVgorRnJlZUltYWdlX1NldERvdHNQZXJNZXRlclgoRklCSVRNQVAgKmRpYiwgdW5zaWduZWQgcmVzKSB7CisJaWYoZGliKSB7CisJCUZyZWVJbWFnZV9HZXRJbmZvSGVhZGVyKGRpYiktPmJpWFBlbHNQZXJNZXRlciA9IHJlczsKKwl9Cit9CisKK3ZvaWQgRExMX0NBTExDT05WCitGcmVlSW1hZ2VfU2V0RG90c1Blck1ldGVyWShGSUJJVE1BUCAqZGliLCB1bnNpZ25lZCByZXMpIHsKKwlpZihkaWIpIHsKKwkJRnJlZUltYWdlX0dldEluZm9IZWFkZXIoZGliKS0+YmlZUGVsc1Blck1ldGVyID0gcmVzOworCX0KK30KKworQklUTUFQSU5GT0hFQURFUiAqIERMTF9DQUxMQ09OVgorRnJlZUltYWdlX0dldEluZm9IZWFkZXIoRklCSVRNQVAgKmRpYikgeworCWlmKCFkaWIpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXNpemVfdCBscCA9IChzaXplX3QpZGliLT5kYXRhICsgc2l6ZW9mKEZSRUVJTUFHRUhFQURFUik7CisJbHAgKz0gKGxwICUgRklCSVRNQVBfQUxJR05NRU5UID8gRklCSVRNQVBfQUxJR05NRU5UIC0gbHAgJSBGSUJJVE1BUF9BTElHTk1FTlQgOiAwKTsKKwlscCArPSBGSUJJVE1BUF9BTElHTk1FTlQgLSBzaXplb2YoQklUTUFQSU5GT0hFQURFUikgJSBGSUJJVE1BUF9BTElHTk1FTlQ7CisJcmV0dXJuIChCSVRNQVBJTkZPSEVBREVSICopbHA7Cit9CisKK0JJVE1BUElORk8gKiBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9HZXRJbmZvKEZJQklUTUFQICpkaWIpIHsKKwlyZXR1cm4gKEJJVE1BUElORk8gKilGcmVlSW1hZ2VfR2V0SW5mb0hlYWRlcihkaWIpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgTWV0YWRhdGEgcm91dGluZXMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRklNRVRBREFUQSAqIERMTF9DQUxMQ09OViAKK0ZyZWVJbWFnZV9GaW5kRmlyc3RNZXRhZGF0YShGUkVFX0lNQUdFX01ETU9ERUwgbW9kZWwsIEZJQklUTUFQICpkaWIsIEZJVEFHICoqdGFnKSB7CisJaWYoIWRpYikgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvLyBnZXQgdGhlIG1ldGFkYXRhIG1vZGVsCisJTUVUQURBVEFNQVAgKm1ldGFkYXRhID0gKChGUkVFSU1BR0VIRUFERVIgKilkaWItPmRhdGEpLT5tZXRhZGF0YTsKKwlUQUdNQVAgKnRhZ21hcCA9IE5VTEw7CisJaWYoICgqbWV0YWRhdGEpLmZpbmQobW9kZWwpICE9ICgqbWV0YWRhdGEpLmVuZCgpICkgeworCQl0YWdtYXAgPSAoKm1ldGFkYXRhKVttb2RlbF07CisJfQorCWlmKHRhZ21hcCkgeworCQkvLyBhbGxvY2F0ZSBhIGhhbmRsZQorCQlGSU1FVEFEQVRBIAkqaGFuZGxlID0gKEZJTUVUQURBVEEgKiltYWxsb2Moc2l6ZW9mKEZJTUVUQURBVEEpKTsKKwkJaWYoaGFuZGxlKSB7CisJCQkvLyBjYWxjdWxhdGUgdGhlIHNpemUgb2YgYSBNRVRBREFUQUhFQURFUgorCQkJaW50IGhlYWRlcl9zaXplID0gc2l6ZW9mKE1FVEFEQVRBSEVBREVSKTsKKworCQkJaGFuZGxlLT5kYXRhID0gKEJZVEUgKiltYWxsb2MoaGVhZGVyX3NpemUgKiBzaXplb2YoQllURSkpOworCQkJCisJCQlpZihoYW5kbGUtPmRhdGEpIHsKKwkJCQltZW1zZXQoaGFuZGxlLT5kYXRhLCAwLCBoZWFkZXJfc2l6ZSAqIHNpemVvZihCWVRFKSk7CisKKwkJCQkvLyB3cml0ZSBvdXQgdGhlIE1FVEFEQVRBSEVBREVSCisJCQkJTUVUQURBVEFIRUFERVIgKm1kaCA9IChNRVRBREFUQUhFQURFUiAqKWhhbmRsZS0+ZGF0YTsKKworCQkJCW1kaC0+cG9zID0gMTsKKwkJCQltZGgtPnRhZ21hcCA9IHRhZ21hcDsKKworCQkJCS8vIGdldCB0aGUgZmlyc3QgZWxlbWVudAorCQkJCVRBR01BUDo6aXRlcmF0b3IgaSA9IHRhZ21hcC0+YmVnaW4oKTsKKwkJCQkqdGFnID0gKCppKS5zZWNvbmQ7CisKKwkJCQlyZXR1cm4gaGFuZGxlOworCQkJfQorCisJCQlmcmVlKGhhbmRsZSk7CisJCX0KKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworQk9PTCBETExfQ0FMTENPTlYgCitGcmVlSW1hZ2VfRmluZE5leHRNZXRhZGF0YShGSU1FVEFEQVRBICptZGhhbmRsZSwgRklUQUcgKip0YWcpIHsKKwlpZighbWRoYW5kbGUpIHsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCU1FVEFEQVRBSEVBREVSICptZGggPSAoTUVUQURBVEFIRUFERVIgKiltZGhhbmRsZS0+ZGF0YTsKKwlUQUdNQVAgKnRhZ21hcCA9IG1kaC0+dGFnbWFwOworCisJaW50IGN1cnJlbnRfcG9zID0gbWRoLT5wb3M7CisJaW50IG1hcHNpemUgICAgID0gKGludCl0YWdtYXAtPnNpemUoKTsKKworCWlmKGN1cnJlbnRfcG9zIDwgbWFwc2l6ZSkgeworCQkvLyBnZXQgdGhlIHRhZyBlbGVtZW50IGF0IHBvc2l0aW9uIHBvcworCQlpbnQgY291bnQgPSAwOworCisJCWZvcihUQUdNQVA6Oml0ZXJhdG9yIGkgPSB0YWdtYXAtPmJlZ2luKCk7IGkgIT0gdGFnbWFwLT5lbmQoKTsgaSsrKSB7CisJCQlpZihjb3VudCA9PSBjdXJyZW50X3BvcykgeworCQkJCSp0YWcgPSAoKmkpLnNlY29uZDsKKwkJCQltZGgtPnBvcysrOworCQkJCWJyZWFrOworCQkJfQorCQkJY291bnQrKzsKKwkJfQorCQkKKwkJcmV0dXJuIFRSVUU7CisJfQorCisJcmV0dXJuIEZBTFNFOworfQorCit2b2lkIERMTF9DQUxMQ09OViAKK0ZyZWVJbWFnZV9GaW5kQ2xvc2VNZXRhZGF0YShGSU1FVEFEQVRBICptZGhhbmRsZSkgeworCWlmIChOVUxMICE9IG1kaGFuZGxlKSB7CS8vIGRlbGV0ZSB0aGUgaGFuZGxlCisJCWlmIChOVUxMICE9IG1kaGFuZGxlLT5kYXRhKSB7CisJCQlmcmVlKG1kaGFuZGxlLT5kYXRhKTsKKwkJfQorCQlmcmVlKG1kaGFuZGxlKTsJCS8vIC4uLiBhbmQgdGhlIHdyYXBwZXIKKwl9Cit9CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitCT09MIERMTF9DQUxMQ09OVgorRnJlZUltYWdlX0Nsb25lTWV0YWRhdGEoRklCSVRNQVAgKmRzdCwgRklCSVRNQVAgKnNyYykgeworCWlmKCFzcmMgfHwgIWRzdCkgeworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJLy8gZ2V0IG1ldGFkYXRhIGxpbmtzCisJTUVUQURBVEFNQVAgKnNyY19tZXRhZGF0YSA9ICgoRlJFRUlNQUdFSEVBREVSICopc3JjLT5kYXRhKS0+bWV0YWRhdGE7CisJTUVUQURBVEFNQVAgKmRzdF9tZXRhZGF0YSA9ICgoRlJFRUlNQUdFSEVBREVSICopZHN0LT5kYXRhKS0+bWV0YWRhdGE7CisKKwkvLyBjb3B5IG1ldGFkYXRhIG1vZGVscywgKmV4Y2VwdCogdGhlIEZJTURfQU5JTUFUSU9OIG1vZGVsCisJZm9yKE1FVEFEQVRBTUFQOjppdGVyYXRvciBpID0gKCpzcmNfbWV0YWRhdGEpLmJlZ2luKCk7IGkgIT0gKCpzcmNfbWV0YWRhdGEpLmVuZCgpOyBpKyspIHsKKwkJaW50IG1vZGVsID0gKCppKS5maXJzdDsKKwkJaWYobW9kZWwgPT0gKGludClGSU1EX0FOSU1BVElPTikgeworCQkJY29udGludWU7CisJCX0KKwkJVEFHTUFQICpzcmNfdGFnbWFwID0gKCppKS5zZWNvbmQ7CisKKwkJaWYoc3JjX3RhZ21hcCkgeworCQkJaWYoIGRzdF9tZXRhZGF0YS0+ZmluZChtb2RlbCkgIT0gZHN0X21ldGFkYXRhLT5lbmQoKSApIHsKKwkJCQkvLyBkZXN0cm95IGRzdCBtb2RlbAorCQkJCUZyZWVJbWFnZV9TZXRNZXRhZGF0YSgoRlJFRV9JTUFHRV9NRE1PREVMKW1vZGVsLCBkc3QsIE5VTEwsIE5VTEwpOworCQkJfQorCisJCQkvLyBjcmVhdGUgYSBtZXRhZGF0YSBtb2RlbAorCQkJVEFHTUFQICpkc3RfdGFnbWFwID0gbmV3KHN0ZDo6bm90aHJvdykgVEFHTUFQKCk7CisKKwkJCWlmKGRzdF90YWdtYXApIHsKKwkJCQkvLyBmaWxsIHRoZSBtb2RlbAorCQkJCWZvcihUQUdNQVA6Oml0ZXJhdG9yIGogPSBzcmNfdGFnbWFwLT5iZWdpbigpOyBqICE9IHNyY190YWdtYXAtPmVuZCgpOyBqKyspIHsKKwkJCQkJc3RkOjpzdHJpbmcgZHN0X2tleSA9ICgqaikuZmlyc3Q7CisJCQkJCUZJVEFHICpkc3RfdGFnID0gRnJlZUltYWdlX0Nsb25lVGFnKCAoKmopLnNlY29uZCApOworCisJCQkJCS8vIGFzc2lnbiBrZXkgYW5kIHRhZyB2YWx1ZQorCQkJCQkoKmRzdF90YWdtYXApW2RzdF9rZXldID0gZHN0X3RhZzsKKwkJCQl9CisKKwkJCQkvLyBhc3NpZ24gbW9kZWwgYW5kIHRhZ21hcAorCQkJCSgqZHN0X21ldGFkYXRhKVttb2RlbF0gPSBkc3RfdGFnbWFwOworCQkJfQorCQl9CisJfQorCisJLy8gY2xvbmUgcmVzb2x1dGlvbiAKKwlGcmVlSW1hZ2VfU2V0RG90c1Blck1ldGVyWChkc3QsIEZyZWVJbWFnZV9HZXREb3RzUGVyTWV0ZXJYKHNyYykpOyAKKwlGcmVlSW1hZ2VfU2V0RG90c1Blck1ldGVyWShkc3QsIEZyZWVJbWFnZV9HZXREb3RzUGVyTWV0ZXJZKHNyYykpOyAKKworCXJldHVybiBUUlVFOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0JPT0wgRExMX0NBTExDT05WIAorRnJlZUltYWdlX1NldE1ldGFkYXRhKEZSRUVfSU1BR0VfTURNT0RFTCBtb2RlbCwgRklCSVRNQVAgKmRpYiwgY29uc3QgY2hhciAqa2V5LCBGSVRBRyAqdGFnKSB7CisJaWYoIWRpYikgeworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJVEFHTUFQICp0YWdtYXAgPSBOVUxMOworCisJLy8gZ2V0IHRoZSBtZXRhZGF0YSBtb2RlbAorCU1FVEFEQVRBTUFQICptZXRhZGF0YSA9ICgoRlJFRUlNQUdFSEVBREVSICopZGliLT5kYXRhKS0+bWV0YWRhdGE7CisJTUVUQURBVEFNQVA6Oml0ZXJhdG9yIG1vZGVsX2l0ZXJhdG9yID0gbWV0YWRhdGEtPmZpbmQobW9kZWwpOworCWlmIChtb2RlbF9pdGVyYXRvciAhPSBtZXRhZGF0YS0+ZW5kKCkpIHsKKwkJdGFnbWFwID0gbW9kZWxfaXRlcmF0b3ItPnNlY29uZDsKKwl9CisKKwlpZihrZXkgIT0gTlVMTCkgeworCisJCWlmKCF0YWdtYXApIHsKKwkJCS8vIHRoaXMgbW9kZWwsIGRvZXNuJ3QgZXhpc3Q6IGNyZWF0ZSBpdCAKKwkJCXRhZ21hcCA9IG5ldyhzdGQ6Om5vdGhyb3cpIFRBR01BUCgpOworCQkJKCptZXRhZGF0YSlbbW9kZWxdID0gdGFnbWFwOworCQl9CisJCQorCQlpZih0YWcpIHsKKwkJCS8vIGZpcnN0IGNoZWNrIHRoZSB0YWcKKwkJCWlmKEZyZWVJbWFnZV9HZXRUYWdLZXkodGFnKSA9PSBOVUxMKSB7CisJCQkJRnJlZUltYWdlX1NldFRhZ0tleSh0YWcsIGtleSk7CisJCQl9IGVsc2UgaWYoc3RyY21wKGtleSwgRnJlZUltYWdlX0dldFRhZ0tleSh0YWcpKSAhPSAwKSB7CisJCQkJLy8gc2V0IHRoZSB0YWcga2V5CisJCQkJRnJlZUltYWdlX1NldFRhZ0tleSh0YWcsIGtleSk7CisJCQl9CisJCQlpZihGcmVlSW1hZ2VfR2V0VGFnQ291bnQodGFnKSAqIEZyZWVJbWFnZV9UYWdEYXRhV2lkdGgoRnJlZUltYWdlX0dldFRhZ1R5cGUodGFnKSkgIT0gRnJlZUltYWdlX0dldFRhZ0xlbmd0aCh0YWcpKSB7CisJCQkJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKEZJRl9VTktOT1dOLCAiSW52YWxpZCBkYXRhIGNvdW50IGZvciB0YWcgJyVzJyIsIGtleSk7CisJCQkJcmV0dXJuIEZBTFNFOworCQkJfQorCisJCQkvLyBmaWxsIHRoZSB0YWcgSUQgaWYgcG9zc2libGUgYW5kIGlmIGl0J3MgbmVlZGVkCisJCQlUYWdMaWImIHRhZ19saWIgPSBUYWdMaWI6Omluc3RhbmNlKCk7CisJCQlzd2l0Y2gobW9kZWwpIHsKKwkJCQljYXNlIEZJTURfSVBUQzoKKwkJCQl7CisJCQkJCWludCBpZCA9IHRhZ19saWIuZ2V0VGFnSUQoVGFnTGliOjpJUFRDLCBrZXkpOworCQkJCQkvKgorCQkJCQlpZihpZCA9PSAtMSkgeworCQkJCQkJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKEZJRl9VTktOT1dOLCAiSVBUQzogSW52YWxpZCBrZXkgJyVzJyIsIGtleSk7CisJCQkJCX0KKwkJCQkJKi8KKwkJCQkJRnJlZUltYWdlX1NldFRhZ0lEKHRhZywgKFdPUkQpaWQpOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJCWRlZmF1bHQ6CisJCQkJCWJyZWFrOworCQkJfQorCisJCQkvLyBkZWxldGUgZXhpc3RpbmcgdGFnCisJCQlGSVRBRyAqb2xkX3RhZyA9ICgqdGFnbWFwKVtrZXldOworCQkJaWYob2xkX3RhZykgeworCQkJCUZyZWVJbWFnZV9EZWxldGVUYWcob2xkX3RhZyk7CisJCQl9CisKKwkJCS8vIGNyZWF0ZSBhIG5ldyB0YWcKKwkJCSgqdGFnbWFwKVtrZXldID0gRnJlZUltYWdlX0Nsb25lVGFnKHRhZyk7CisJCX0KKwkJZWxzZSB7CisJCQkvLyBkZWxldGUgZXhpc3RpbmcgdGFnCisJCQlUQUdNQVA6Oml0ZXJhdG9yIGkgPSB0YWdtYXAtPmZpbmQoa2V5KTsKKwkJCWlmKGkgIT0gdGFnbWFwLT5lbmQoKSkgeworCQkJCUZJVEFHICpvbGRfdGFnID0gKCppKS5zZWNvbmQ7CisJCQkJRnJlZUltYWdlX0RlbGV0ZVRhZyhvbGRfdGFnKTsKKwkJCQl0YWdtYXAtPmVyYXNlKGtleSk7CisJCQl9CisJCX0KKwl9CisJZWxzZSB7CisJCS8vIGRlc3Ryb3kgdGhlIG1ldGFkYXRhIG1vZGVsCisJCWlmKHRhZ21hcCkgeworCQkJZm9yKFRBR01BUDo6aXRlcmF0b3IgaSA9IHRhZ21hcC0+YmVnaW4oKTsgaSAhPSB0YWdtYXAtPmVuZCgpOyBpKyspIHsKKwkJCQlGSVRBRyAqdGFnID0gKCppKS5zZWNvbmQ7CisJCQkJRnJlZUltYWdlX0RlbGV0ZVRhZyh0YWcpOworCQkJfQorCisJCQlkZWxldGUgdGFnbWFwOworCQkJbWV0YWRhdGEtPmVyYXNlKG1vZGVsX2l0ZXJhdG9yKTsKKwkJfQorCX0KKworCXJldHVybiBUUlVFOworfQorCitCT09MIERMTF9DQUxMQ09OViAKK0ZyZWVJbWFnZV9HZXRNZXRhZGF0YShGUkVFX0lNQUdFX01ETU9ERUwgbW9kZWwsIEZJQklUTUFQICpkaWIsIGNvbnN0IGNoYXIgKmtleSwgRklUQUcgKip0YWcpIHsKKwlpZighZGliIHx8ICFrZXkgfHwgIXRhZykgeworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJVEFHTUFQICp0YWdtYXAgPSBOVUxMOworCSp0YWcgPSBOVUxMOworCisJLy8gZ2V0IHRoZSBtZXRhZGF0YSBtb2RlbAorCU1FVEFEQVRBTUFQICptZXRhZGF0YSA9ICgoRlJFRUlNQUdFSEVBREVSICopZGliLT5kYXRhKS0+bWV0YWRhdGE7CisJaWYoISgqbWV0YWRhdGEpLmVtcHR5KCkpIHsKKwkJTUVUQURBVEFNQVA6Oml0ZXJhdG9yIG1vZGVsX2l0ZXJhdG9yID0gbWV0YWRhdGEtPmZpbmQobW9kZWwpOworCQlpZiAobW9kZWxfaXRlcmF0b3IgIT0gbWV0YWRhdGEtPmVuZCgpICkgeworCQkJLy8gdGhpcyBtb2RlbCBleGlzdHMgOiB0cnkgdG8gZ2V0IHRoZSByZXF1ZXN0ZWQgdGFnCisJCQl0YWdtYXAgPSBtb2RlbF9pdGVyYXRvci0+c2Vjb25kOworCQkJVEFHTUFQOjppdGVyYXRvciB0YWdfaXRlcmF0b3IgPSB0YWdtYXAtPmZpbmQoa2V5KTsKKwkJCWlmICh0YWdfaXRlcmF0b3IgIT0gdGFnbWFwLT5lbmQoKSApIHsKKwkJCQkvLyBnZXQgdGhlIHJlcXVlc3RlZCB0YWcKKwkJCQkqdGFnID0gdGFnX2l0ZXJhdG9yLT5zZWNvbmQ7CisJCQl9IAorCQl9CisJfQorCisJcmV0dXJuICgqdGFnICE9IE5VTEwpID8gVFJVRSA6IEZBTFNFOworfQorCisvKioKK0J1aWxkIGFuZCBzZXQgYSBGSVRBRyB3aG9zZSB0eXBlIGlzIEZJRFRfQVNDSUkuIAorQHBhcmFtIG1vZGVsIE1ldGFkYXRhIG1vZGVsIHRvIGJlIGZpbGxlZAorQHBhcmFtIGRpYiBJbWFnZSB0byBiZSBmaWxsZWQKK0BwYXJhbSBrZXkgVGFnIGtleQorQHBhcmFtIHZhbHVlIFRhZyB2YWx1ZSBhcyBhIEFTQ0lJIHN0cmluZworQHJldHVybiBSZXR1cm5zIFRSVUUgaWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyBGQUxTRSBvdGhlcndpc2UKKyovCitCT09MIERMTF9DQUxMQ09OViAKK0ZyZWVJbWFnZV9TZXRNZXRhZGF0YUtleVZhbHVlKEZSRUVfSU1BR0VfTURNT0RFTCBtb2RlbCwgRklCSVRNQVAgKmRpYiwgY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICp2YWx1ZSkgeworCWlmKCFkaWIgfHwgIWtleSB8fCAhdmFsdWUpIHsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwkvLyBjcmVhdGUgYSB0YWcKKwlGSVRBRyAqdGFnID0gRnJlZUltYWdlX0NyZWF0ZVRhZygpOworCWlmKHRhZykgeworCQlCT09MIGJTdWNjZXNzID0gVFJVRTsKKwkJLy8gZmlsbCB0aGUgdGFnCisJCURXT1JEIHRhZ19sZW5ndGggPSAoRFdPUkQpKHN0cmxlbih2YWx1ZSkgKyAxKTsKKwkJYlN1Y2Nlc3MgJj0gRnJlZUltYWdlX1NldFRhZ0tleSh0YWcsIGtleSk7CisJCWJTdWNjZXNzICY9IEZyZWVJbWFnZV9TZXRUYWdMZW5ndGgodGFnLCB0YWdfbGVuZ3RoKTsKKwkJYlN1Y2Nlc3MgJj0gRnJlZUltYWdlX1NldFRhZ0NvdW50KHRhZywgdGFnX2xlbmd0aCk7CisJCWJTdWNjZXNzICY9IEZyZWVJbWFnZV9TZXRUYWdUeXBlKHRhZywgRklEVF9BU0NJSSk7CisJCWJTdWNjZXNzICY9IEZyZWVJbWFnZV9TZXRUYWdWYWx1ZSh0YWcsIHZhbHVlKTsKKwkJaWYoYlN1Y2Nlc3MpIHsKKwkJCS8vIHNldCB0aGUgdGFnCisJCQliU3VjY2VzcyAmPSBGcmVlSW1hZ2VfU2V0TWV0YWRhdGEobW9kZWwsIGRpYiwgRnJlZUltYWdlX0dldFRhZ0tleSh0YWcpLCB0YWcpOworCQl9CisJCS8vIGRlbGV0ZSB0aGUgdGFnCisJCUZyZWVJbWFnZV9EZWxldGVUYWcodGFnKTsKKworCQlyZXR1cm4gYlN1Y2Nlc3M7CisJfQorCisJcmV0dXJuIEZBTFNFOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3Vuc2lnbmVkIERMTF9DQUxMQ09OViAKK0ZyZWVJbWFnZV9HZXRNZXRhZGF0YUNvdW50KEZSRUVfSU1BR0VfTURNT0RFTCBtb2RlbCwgRklCSVRNQVAgKmRpYikgeworCWlmKCFkaWIpIHsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCVRBR01BUCAqdGFnbWFwID0gTlVMTDsKKworCS8vIGdldCB0aGUgbWV0YWRhdGEgbW9kZWwKKwlNRVRBREFUQU1BUCAqbWV0YWRhdGEgPSAoKEZSRUVJTUFHRUhFQURFUiAqKWRpYi0+ZGF0YSktPm1ldGFkYXRhOworCWlmKCAoKm1ldGFkYXRhKS5maW5kKG1vZGVsKSAhPSAoKm1ldGFkYXRhKS5lbmQoKSApIHsKKwkJdGFnbWFwID0gKCptZXRhZGF0YSlbbW9kZWxdOworCX0KKwlpZighdGFnbWFwKSB7CisJCS8vIHRoaXMgbW9kZWwsIGRvZXNuJ3QgZXhpc3Q6IHJldHVybgorCQlyZXR1cm4gMDsKKwl9CisKKwkvLyBnZXQgdGhlIHRhZyBjb3VudAorCXJldHVybiAodW5zaWduZWQpdGFnbWFwLT5zaXplKCk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordW5zaWduZWQgRExMX0NBTExDT05WCitGcmVlSW1hZ2VfR2V0TWVtb3J5U2l6ZShGSUJJVE1BUCAqZGliKSB7CisJaWYgKCFkaWIpIHsKKwkJcmV0dXJuIDA7CisJfQorCUZSRUVJTUFHRUhFQURFUiAqaGVhZGVyID0gKEZSRUVJTUFHRUhFQURFUiAqKWRpYi0+ZGF0YTsKKwlCSVRNQVBJTkZPSEVBREVSICpiaWggPSBGcmVlSW1hZ2VfR2V0SW5mb0hlYWRlcihkaWIpOworCisJQk9PTCBoZWFkZXJfb25seSA9ICFoZWFkZXItPmhhc19waXhlbHMgfHwgaGVhZGVyLT5leHRlcm5hbF9iaXRzICE9IE5VTEw7CisJQk9PTCBuZWVkX21hc2tzID0gYmloLT5iaUNvbXByZXNzaW9uID09IEJJX0JJVEZJRUxEUzsKKwl1bnNpZ25lZCB3aWR0aCA9IGJpaC0+YmlXaWR0aDsKKwl1bnNpZ25lZCBoZWlnaHQgPSBiaWgtPmJpSGVpZ2h0OworCXVuc2lnbmVkIGJwcCA9IGJpaC0+YmlCaXRDb3VudDsKKwkKKwkvLyBzdGFydCBvZmYgd2l0aCB0aGUgc2l6ZSBvZiB0aGUgRklCSVRNQVAgc3RydWN0dXJlCisJc2l6ZV90IHNpemUgPSBzaXplb2YoRklCSVRNQVApOworCQorCS8vIGFkZCBzaXplcyBvZiBGUkVFSU1BR0VIRUFERVIsIEJJVE1BUElORk9IRUFERVIsIHBhbGV0dGUgYW5kIERJQiBkYXRhCisJc2l6ZSArPSBGcmVlSW1hZ2VfR2V0SW50ZXJuYWxJbWFnZVNpemUoaGVhZGVyX29ubHksIHdpZHRoLCBoZWlnaHQsIGJwcCwgbmVlZF9tYXNrcyk7CisKKwkvLyBhZGQgSUNDIHByb2ZpbGUgc2l6ZQorCXNpemUgKz0gaGVhZGVyLT5pY2NQcm9maWxlLnNpemU7CisKKwkvLyBhZGQgdGh1bWJuYWlsIGltYWdlIHNpemUKKwlpZiAoaGVhZGVyLT50aHVtYm5haWwpIHsKKwkJLy8gd2UgYXNzdW1lIGEgdGh1bWJuYWlsIG5vdCBoYXZpbmcgYSB0aHVtYm5haWwgYXMgd2VsbCwgCisJCS8vIHNvIHRoaXMgcmVjdXJzaXZlIGNhbGwgc2hvdWxkIG5vdCBjcmVhdGUgYW4gaW5maW5pdGUgbG9vcAorCQlzaXplICs9IEZyZWVJbWFnZV9HZXRNZW1vcnlTaXplKGhlYWRlci0+dGh1bWJuYWlsKTsKKwl9CisKKwkvLyBhZGQgbWV0YWRhdGEgc2l6ZQorCU1FVEFEQVRBTUFQICptZCA9IGhlYWRlci0+bWV0YWRhdGE7CisJaWYgKCFtZCkgeworCQlyZXR1cm4gKHVuc2lnbmVkKXNpemU7CisJfQorCisJLy8gYWRkIHNpemUgb2YgTUVUQURBVEFNQVAKKwlzaXplICs9IHNpemVvZihNRVRBREFUQU1BUCk7CisKKwljb25zdCBzaXplX3QgbW9kZWxzID0gbWQtPnNpemUoKTsKKwlpZiAobW9kZWxzID09IDApIHsKKwkJcmV0dXJuICh1bnNpZ25lZClzaXplOworCX0KKworCXVuc2lnbmVkIHRhZ3MgPSAwOworCisJZm9yIChNRVRBREFUQU1BUDo6aXRlcmF0b3IgaSA9IG1kLT5iZWdpbigpOyBpICE9IG1kLT5lbmQoKTsgaSsrKSB7CisJCVRBR01BUCAqdG0gPSBpLT5zZWNvbmQ7CisJCWlmICh0bSkgeworCQkJZm9yIChUQUdNQVA6Oml0ZXJhdG9yIGogPSB0bS0+YmVnaW4oKTsgaiAhPSB0bS0+ZW5kKCk7IGorKykgeworCQkJCSsrdGFnczsKKwkJCQljb25zdCBzdGQ6OnN0cmluZyAmIGtleSA9IGotPmZpcnN0OworCQkJCXNpemUgKz0ga2V5LmNhcGFjaXR5KCk7CisJCQkJc2l6ZSArPSBGcmVlSW1hZ2VfR2V0VGFnTWVtb3J5U2l6ZShqLT5zZWNvbmQpOworCQkJfQorCQl9CisJfQorCisJLy8gYWRkIHNpemUgb2YgYWxsIFRBR01BUCBpbnN0YW5jZXMKKwlzaXplICs9IG1vZGVscyAqIHNpemVvZihUQUdNQVApOworCS8vIGFkZCBzaXplIG9mIHRyZWUgbm9kZXMgaW4gTUVUQURBVEFNQVAKKwlzaXplICs9IE1hcEludHJvc3BlY3RvcjxNRVRBREFUQU1BUD46OkdldE5vZGVzTWVtb3J5U2l6ZShtb2RlbHMpOworCS8vIGFkZCBzaXplIG9mIHRyZWUgbm9kZXMgaW4gVEFHTUFQCisJc2l6ZSArPSBNYXBJbnRyb3NwZWN0b3I8VEFHTUFQPjo6R2V0Tm9kZXNNZW1vcnlTaXplKHRhZ3MpOworCisJcmV0dXJuICh1bnNpZ25lZClzaXplOworfQorCmRpZmYgLS1naXQgYS9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL0NhY2hlRmlsZS5jcHAgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL0NhY2hlRmlsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA5ZmFmOAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvQ2FjaGVGaWxlLmNwcApAQCAtMCwwICsxLDI3MSBAQAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gTXVsdGktUGFnZSBmdW5jdGlvbnMKKy8vCisvLyBEZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIGJ5CisvLyAtIEZsb3JpcyB2YW4gZGVuIEJlcmcgKGZsdmRiZXJnQHd4cy5ubCkKKy8vIC0gY2hlY2tlcmVkIChjaGVja2VyZWRAdXNlcnMuc291cmNlZm9yZ2UubmV0KQorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZyZWVJbWFnZSAzCisvLworLy8gQ09WRVJFRCBDT0RFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZCisvLyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUworLy8gVEhBVCBUSEUgQ09WRVJFRCBDT0RFIElTIEZSRUUgT0YgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisvLyBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRAorLy8gQ09ERSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVAorLy8gVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GIEFOWSBORUNFU1NBUlkKKy8vIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwKKy8vIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIKKy8vIFRISVMgRElTQ0xBSU1FUi4KKy8vCisvLyBVc2UgYXQgeW91ciBvd24gcmlzayEKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2lmZGVmIF9NU0NfVkVSIAorI3ByYWdtYSB3YXJuaW5nIChkaXNhYmxlIDogNDc4NikgLy8gaWRlbnRpZmllciB3YXMgdHJ1bmNhdGVkIHRvICdudW1iZXInIGNoYXJhY3RlcnMKKyNlbmRpZiAKKworI2luY2x1ZGUgIkNhY2hlRmlsZS5oIgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0NhY2hlRmlsZTo6Q2FjaGVGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nIGZpbGVuYW1lLCBCT09MIGtlZXBfaW5fbWVtb3J5KSA6CittX2ZpbGUoTlVMTCksCittX2ZpbGVuYW1lKGZpbGVuYW1lKSwKK21fZnJlZV9wYWdlcygpLAorbV9wYWdlX2NhY2hlX21lbSgpLAorbV9wYWdlX2NhY2hlX2Rpc2soKSwKK21fcGFnZV9tYXAoKSwKK21fcGFnZV9jb3VudCgwKSwKK21fY3VycmVudF9ibG9jayhOVUxMKSwKK21fa2VlcF9pbl9tZW1vcnkoa2VlcF9pbl9tZW1vcnkpIHsKK30KKworQ2FjaGVGaWxlOjp+Q2FjaGVGaWxlKCkgeworfQorCitCT09MCitDYWNoZUZpbGU6Om9wZW4oKSB7CisJaWYgKCghbV9maWxlbmFtZS5lbXB0eSgpKSAmJiAoIW1fa2VlcF9pbl9tZW1vcnkpKSB7CisJCW1fZmlsZSA9IGZvcGVuKG1fZmlsZW5hbWUuY19zdHIoKSwgIncrYiIpOworCQlyZXR1cm4gKG1fZmlsZSAhPSBOVUxMKTsKKwl9CisKKwlyZXR1cm4gKG1fa2VlcF9pbl9tZW1vcnkgPT0gVFJVRSk7Cit9CisKK3ZvaWQKK0NhY2hlRmlsZTo6Y2xvc2UoKSB7CisJLy8gZGlzcG9zZSB0aGUgY2FjaGUgZW50cmllcworCisJd2hpbGUgKCFtX3BhZ2VfY2FjaGVfZGlzay5lbXB0eSgpKSB7CisJCUJsb2NrICpibG9jayA9ICptX3BhZ2VfY2FjaGVfZGlzay5iZWdpbigpOworCQltX3BhZ2VfY2FjaGVfZGlzay5wb3BfZnJvbnQoKTsKKwkJZGVsZXRlIFtdIGJsb2NrLT5kYXRhOworCQlkZWxldGUgYmxvY2s7CisJfQorCXdoaWxlICghbV9wYWdlX2NhY2hlX21lbS5lbXB0eSgpKSB7IAorCQlCbG9jayAqYmxvY2sgPSAqbV9wYWdlX2NhY2hlX21lbS5iZWdpbigpOyAKKwkJbV9wYWdlX2NhY2hlX21lbS5wb3BfZnJvbnQoKTsgCisJCWRlbGV0ZSBbXSBibG9jay0+ZGF0YTsgCisJCWRlbGV0ZSBibG9jazsgCisJfSAKKworCWlmIChtX2ZpbGUpIHsKKwkJLy8gY2xvc2UgdGhlIGZpbGUKKworCQlmY2xvc2UobV9maWxlKTsKKworCQkvLyBkZWxldGUgdGhlIGZpbGUKKworCQlyZW1vdmUobV9maWxlbmFtZS5jX3N0cigpKTsKKwl9Cit9CisKK3ZvaWQKK0NhY2hlRmlsZTo6Y2xlYW51cE1lbUNhY2hlKCkgeworCWlmICghbV9rZWVwX2luX21lbW9yeSkgeworCQlpZiAobV9wYWdlX2NhY2hlX21lbS5zaXplKCkgPiBDQUNIRV9TSVpFKSB7CisJCQkvLyBmbHVzaCB0aGUgbGVhc3QgdXNlZCBibG9jayB0byBmaWxlCisKKwkJCUJsb2NrICpvbGRfYmxvY2sgPSBtX3BhZ2VfY2FjaGVfbWVtLmJhY2soKTsKKwkJCWZzZWVrKG1fZmlsZSwgb2xkX2Jsb2NrLT5uciAqIEJMT0NLX1NJWkUsIFNFRUtfU0VUKTsKKwkJCWZ3cml0ZShvbGRfYmxvY2stPmRhdGEsIEJMT0NLX1NJWkUsIDEsIG1fZmlsZSk7CisKKwkJCS8vIHJlbW92ZSB0aGUgZGF0YQorCisJCQlkZWxldGUgW10gb2xkX2Jsb2NrLT5kYXRhOworCQkJb2xkX2Jsb2NrLT5kYXRhID0gTlVMTDsKKworCQkJLy8gbW92ZSB0aGUgYmxvY2sgdG8gYW5vdGhlciBsaXN0CisKKwkJCW1fcGFnZV9jYWNoZV9kaXNrLnNwbGljZShtX3BhZ2VfY2FjaGVfZGlzay5iZWdpbigpLCBtX3BhZ2VfY2FjaGVfbWVtLCAtLW1fcGFnZV9jYWNoZV9tZW0uZW5kKCkpOworCQkJbV9wYWdlX21hcFtvbGRfYmxvY2stPm5yXSA9IG1fcGFnZV9jYWNoZV9kaXNrLmJlZ2luKCk7CisJCX0KKwl9Cit9CisKK2ludAorQ2FjaGVGaWxlOjphbGxvY2F0ZUJsb2NrKCkgeworCUJsb2NrICpibG9jayA9IG5ldyBCbG9jazsKKwlibG9jay0+ZGF0YSA9IG5ldyBCWVRFW0JMT0NLX1NJWkVdOworCWJsb2NrLT5uZXh0ID0gMDsKKworCWlmICghbV9mcmVlX3BhZ2VzLmVtcHR5KCkpIHsKKwkJYmxvY2stPm5yID0gKm1fZnJlZV9wYWdlcy5iZWdpbigpOworCQltX2ZyZWVfcGFnZXMucG9wX2Zyb250KCk7CisJfSBlbHNlIHsKKwkJYmxvY2stPm5yID0gbV9wYWdlX2NvdW50Kys7CisJfQorCisJbV9wYWdlX2NhY2hlX21lbS5wdXNoX2Zyb250KGJsb2NrKTsKKwltX3BhZ2VfbWFwW2Jsb2NrLT5ucl0gPSBtX3BhZ2VfY2FjaGVfbWVtLmJlZ2luKCk7CisKKwljbGVhbnVwTWVtQ2FjaGUoKTsKKworCXJldHVybiBibG9jay0+bnI7Cit9CisKK0Jsb2NrICoKK0NhY2hlRmlsZTo6bG9ja0Jsb2NrKGludCBucikgeworCWlmIChtX2N1cnJlbnRfYmxvY2sgPT0gTlVMTCkgeworCQlQYWdlTWFwSXQgaXQgPSBtX3BhZ2VfbWFwLmZpbmQobnIpOworCisJCWlmIChpdCAhPSBtX3BhZ2VfbWFwLmVuZCgpKSB7CisJCQltX2N1cnJlbnRfYmxvY2sgPSAqKGl0LT5zZWNvbmQpOworCisJCQkvLyB0aGUgYmxvY2sgaXMgc3dhcHBlZCBvdXQgdG8gZGlzYy4gbG9hZCBpdCBiYWNrCisJCQkvLyBhbmQgcmVtb3ZlIHRoZSBibG9jayBmcm9tIHRoZSBjYWNoZS4gaXQgbWlnaHQgZ2V0IGNhY2hlZAorCQkJLy8gYWdhaW4gYXMgc29vbiBhcyB0aGUgbWVtb3J5IGJ1ZmZlciBmaWxscyB1cAorCisJCQlpZiAobV9jdXJyZW50X2Jsb2NrLT5kYXRhID09IE5VTEwpIHsKKwkJCQltX2N1cnJlbnRfYmxvY2stPmRhdGEgPSBuZXcgQllURVtCTE9DS19TSVpFXTsKKworCQkJCWZzZWVrKG1fZmlsZSwgbV9jdXJyZW50X2Jsb2NrLT5uciAqIEJMT0NLX1NJWkUsIFNFRUtfU0VUKTsKKwkJCQlmcmVhZChtX2N1cnJlbnRfYmxvY2stPmRhdGEsIEJMT0NLX1NJWkUsIDEsIG1fZmlsZSk7CisKKwkJCQltX3BhZ2VfY2FjaGVfbWVtLnNwbGljZShtX3BhZ2VfY2FjaGVfbWVtLmJlZ2luKCksIG1fcGFnZV9jYWNoZV9kaXNrLCBpdC0+c2Vjb25kKTsKKwkJCQltX3BhZ2VfbWFwW25yXSA9IG1fcGFnZV9jYWNoZV9tZW0uYmVnaW4oKTsKKwkJCX0KKworCQkJLy8gaWYgdGhlIG1lbW9yeSBjYWNoZSBzaXplIGlzIHRvbyBsYXJnZSwgc3dhcCBhbiBpdGVtIHRvIGRpc2MKKworCQkJY2xlYW51cE1lbUNhY2hlKCk7CisKKwkJCS8vIHJldHVybiB0aGUgY3VycmVudCBibG9jaworCisJCQlyZXR1cm4gbV9jdXJyZW50X2Jsb2NrOworCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK0JPT0wKK0NhY2hlRmlsZTo6dW5sb2NrQmxvY2soaW50IG5yKSB7CisJaWYgKG1fY3VycmVudF9ibG9jaykgeworCQltX2N1cnJlbnRfYmxvY2sgPSBOVUxMOworCisJCXJldHVybiBUUlVFOworCX0KKworCXJldHVybiBGQUxTRTsKK30KKworQk9PTAorQ2FjaGVGaWxlOjpkZWxldGVCbG9jayhpbnQgbnIpIHsKKwlpZiAoIW1fY3VycmVudF9ibG9jaykgeworCQlQYWdlTWFwSXQgaXQgPSBtX3BhZ2VfbWFwLmZpbmQobnIpOworCisJCS8vIHJlbW92ZSBibG9jayBmcm9tIGNhY2hlCisKKwkJaWYgKGl0ICE9IG1fcGFnZV9tYXAuZW5kKCkpCisJCQltX3BhZ2VfbWFwLmVyYXNlKG5yKTsKKworCQkvLyBhZGQgYmxvY2sgdG8gZnJlZSBwYWdlIGxpc3QKKworCQltX2ZyZWVfcGFnZXMucHVzaF9iYWNrKG5yKTsKKworCQlyZXR1cm4gVFJVRTsKKwl9CisKKwlyZXR1cm4gRkFMU0U7Cit9CisKK0JPT0wKK0NhY2hlRmlsZTo6cmVhZEZpbGUoQllURSAqZGF0YSwgaW50IG5yLCBpbnQgc2l6ZSkgeworCWlmICgoZGF0YSkgJiYgKHNpemUgPiAwKSkgeworCQlpbnQgcyA9IDA7CisJCWludCBibG9ja19uciA9IG5yOworCisJCWRvIHsKKwkJCWludCBjb3B5X25yID0gYmxvY2tfbnI7CisKKwkJCUJsb2NrICpibG9jayA9IGxvY2tCbG9jayhjb3B5X25yKTsKKworCQkJYmxvY2tfbnIgPSBibG9jay0+bmV4dDsKKworCQkJbWVtY3B5KGRhdGEgKyBzLCBibG9jay0+ZGF0YSwgKHMgKyBCTE9DS19TSVpFID4gc2l6ZSkgPyBzaXplIC0gcyA6IEJMT0NLX1NJWkUpOworCisJCQl1bmxvY2tCbG9jayhjb3B5X25yKTsKKworCQkJcyArPSBCTE9DS19TSVpFOworCQl9IHdoaWxlIChibG9ja19uciAhPSAwKTsKKworCQlyZXR1cm4gVFJVRTsKKwl9CisKKwlyZXR1cm4gRkFMU0U7Cit9CisKK2ludAorQ2FjaGVGaWxlOjp3cml0ZUZpbGUoQllURSAqZGF0YSwgaW50IHNpemUpIHsKKwlpZiAoKGRhdGEpICYmIChzaXplID4gMCkpIHsKKwkJaW50IG5yX2Jsb2Nrc19yZXF1aXJlZCA9IDEgKyAoc2l6ZSAvIEJMT0NLX1NJWkUpOworCQlpbnQgY291bnQgPSAwOworCQlpbnQgcyA9IDA7CisJCWludCBzdG9yZWRfYWxsb2M7CisJCWludCBhbGxvYzsKKwkJCisJCXN0b3JlZF9hbGxvYyA9IGFsbG9jID0gYWxsb2NhdGVCbG9jaygpOworCisJCWRvIHsKKwkJCWludCBjb3B5X2FsbG9jID0gYWxsb2M7CisKKwkJCUJsb2NrICpibG9jayA9IGxvY2tCbG9jayhjb3B5X2FsbG9jKTsKKworCQkJYmxvY2stPm5leHQgPSAwOworCisJCQltZW1jcHkoYmxvY2stPmRhdGEsIGRhdGEgKyBzLCAocyArIEJMT0NLX1NJWkUgPiBzaXplKSA/IHNpemUgLSBzIDogQkxPQ0tfU0laRSk7CisKKwkJCWlmIChjb3VudCArIDEgPCBucl9ibG9ja3NfcmVxdWlyZWQpCisJCQkJYWxsb2MgPSBibG9jay0+bmV4dCA9IGFsbG9jYXRlQmxvY2soKTsKKworCQkJdW5sb2NrQmxvY2soY29weV9hbGxvYyk7CisKKwkJCXMgKz0gQkxPQ0tfU0laRTsJCQkKKwkJfSB3aGlsZSAoKytjb3VudCA8IG5yX2Jsb2Nrc19yZXF1aXJlZCk7CisKKwkJcmV0dXJuIHN0b3JlZF9hbGxvYzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZAorQ2FjaGVGaWxlOjpkZWxldGVGaWxlKGludCBucikgeworCWRvIHsKKwkJQmxvY2sgKmJsb2NrID0gbG9ja0Jsb2NrKG5yKTsKKworCQlpZiAoYmxvY2sgPT0gTlVMTCkKKwkJCWJyZWFrOworCisJCWludCBuZXh0ID0gYmxvY2stPm5leHQ7CisKKwkJdW5sb2NrQmxvY2sobnIpOworCisJCWRlbGV0ZUJsb2NrKG5yKTsKKworCQluciA9IG5leHQ7CisJfSB3aGlsZSAobnIgIT0gMCk7Cit9CisKZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvQ29sb3JMb29rdXAuY3BwIGIvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9Db2xvckxvb2t1cC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY0NDM1YQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvQ29sb3JMb29rdXAuY3BwCkBAIC0wLDAgKzEsNzg1IEBACisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBYMTEgYW5kIFNWRyBDb2xvciBuYW1lIGxvb2t1cAorLy8KKy8vIERlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gYnkKKy8vIC0gS2FybC1IZWlueiBCdXNzaWFuIChraGJ1c3NpYW5AbW9zcy5kZSkKKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBGcmVlSW1hZ2UgMworLy8KKy8vIENPVkVSRUQgQ09ERSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWQorLy8gT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMKKy8vIFRIQVQgVEhFIENPVkVSRUQgQ09ERSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLy8gT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQKKy8vIENPREUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkgQ09WRVJFRCBDT0RFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QKKy8vIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZCisvLyBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMCisvLyBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GIEFOWSBDT1ZFUkVEIENPREUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSCisvLyBUSElTIERJU0NMQUlNRVIuCisvLworLy8gVXNlIGF0IHlvdXIgb3duIHJpc2shCisvLworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaW5jbHVkZSAiRnJlZUltYWdlLmgiCisjaW5jbHVkZSAiVXRpbGl0aWVzLmgiCisKKy8vIFJHQiBjb2xvciBuYW1lcyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgc3RydWN0IHRhZ05hbWVkQ29sb3IgeworCWNvbnN0IGNoYXIgKm5hbWU7CS8vISBjb2xvciBuYW1lCisJQllURSAgcjsJCQkvLyEgcmVkIHZhbHVlCisJQllURSAgZzsJCQkvLyEgZ3JlZW4gdmFsdWUKKwlCWVRFICBiOwkJCS8vISBibHVlIHZhbHVlCit9IE5hbWVkQ29sb3I7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qKgorSGVscGVyIGZ1bmN0aW9uIDogcGVyZm9ybSBhIGJpbmFyeSBzZWFyY2ggb24gYSBjb2xvciBhcnJheQorQHBhcmFtIG5hbWUgQ29sb3IgbmFtZQorQHBhcmFtIGNvbG9yX2FycmF5IENvbG9yIGFycmF5CitAcGFyYW0gbiBMZW5ndGggb2YgdGhlIGNvbG9yIGFycmF5CitAcmV0dXJuIFJldHVybnMgdGhlIGNvbG9yIGluZGV4IGluIHRoZSBhcnJheSBpZiBzdWNjZXNzZnVsLCByZXR1cm5zIC0xIG90aGVyd2lzZQorKi8KK3N0YXRpYyBpbnQKK2JpbnNlYXJjaChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBOYW1lZENvbG9yICpjb2xvcl9hcnJheSwgaW50IG4pIHsKKwlpbnQgY29uZCwgbG93LCBtaWQsIGhpZ2g7CisKKyAgICBsb3cgPSAwOworICAgIGhpZ2ggPSBuIC0gMTsKKyAgICB3aGlsZSAobG93IDw9IGhpZ2gpIHsKKwkJbWlkID0gKGxvdyArIGhpZ2gpIC8gMjsKKwkJaWYgKChjb25kID0gc3RyY21wKG5hbWUsIGNvbG9yX2FycmF5W21pZF0ubmFtZSkpIDwgMCkgeworCQkJaGlnaCA9IG1pZCAtIDE7CisJCX0gZWxzZSBpZiAoY29uZCA+IDApIHsKKwkJCWxvdyA9IG1pZCArIDE7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gbWlkOworCQl9CisJfQorCXJldHVybiAtMTsKK30KKworLyoqCitQZXJmb3JtIGEgYmluYXJ5IHNlYXJjaCBvbiBhIGNvbG9yIGFycmF5CitAcGFyYW0gc3pDb2xvciBDb2xvciBuYW1lCitAcGFyYW0gY29sb3JfYXJyYXkgQ29sb3IgYXJyYXkKK0BwYXJhbSBuY29sb3JzIExlbmd0aCBvZiB0aGUgY29sb3IgYXJyYXkKK0ByZXR1cm4gUmV0dXJucyB0aGUgY29sb3IgaW5kZXggaW4gdGhlIGFycmF5IGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgLTEgb3RoZXJ3aXNlCisqLworc3RhdGljIGludAorRnJlZUltYWdlX0xvb2t1cE5hbWVkQ29sb3IoY29uc3QgY2hhciAqc3pDb2xvciwgY29uc3QgTmFtZWRDb2xvciAqY29sb3JfYXJyYXksIGludCBuY29sb3JzKSB7CisJaW50IGk7CisgICAgY2hhciBjb2xvcls2NF07CisKKyAgICAvLyBtYWtlIGxvd2VyIGNhc2UgbmFtZSwgc3F1ZXp6ZSB3aGl0ZSBzcGFjZQorCisgICAgZm9yIChpID0gMDsgc3pDb2xvcltpXSAmJiBpIDwgc2l6ZW9mKGNvbG9yKSAtIDE7IGkrKykgeworCQlpZiAoaXNzcGFjZShzekNvbG9yW2ldKSkgeworICAgICAgICAgICAgY29udGludWU7CisJCX0KKwkJaWYgKGlzdXBwZXIoc3pDb2xvcltpXSkpIHsKKwkJCWNvbG9yW2ldID0gKGNoYXIpdG9sb3dlcihzekNvbG9yW2ldKTsKKwkJfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbG9yW2ldID0gc3pDb2xvcltpXTsKKwkJfQorICAgIH0KKyAgICBjb2xvcltpXSA9IDA7CisKKyAgICByZXR1cm4gYmluc2VhcmNoKGNvbG9yLCBjb2xvcl9hcnJheSwgbmNvbG9ycyk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFgxMSBDb2xvciBuYW1lIGxvb2t1cAorCisvKioKKyBUaGlzIGJpZyBsaXN0IG9mIGNvbG9yIG5hbWVzIHdhcyBmb3JtZWQgZnJvbSB0aGUgZmlsZTogL3Vzci9YMTFSNi9saWIvWDExL3JnYi50eHQKKyBmb3VuZCBvbiBhIHN0YW5kYXJkIExpbnV4IGluc3RhbGxhdGlvbi4KKyovCisKK3N0YXRpYyBOYW1lZENvbG9yIFgxMUNvbG9yTWFwW10gPSB7CisgICAgeyAiYWxpY2VibHVlIiwgICAgICAgICAgICAyNDAsIDI0OCwgMjU1IH0sCisgICAgeyAiYW50aXF1ZXdoaXRlIiwgICAgICAgICAyNTAsIDIzNSwgMjE1IH0sCisgICAgeyAiYW50aXF1ZXdoaXRlMSIsICAgICAgICAyNTUsIDIzOSwgMjE5IH0sCisgICAgeyAiYW50aXF1ZXdoaXRlMiIsICAgICAgICAyMzgsIDIyMywgMjA0IH0sCisgICAgeyAiYW50aXF1ZXdoaXRlMyIsICAgICAgICAyMDUsIDE5MiwgMTc2IH0sCisgICAgeyAiYW50aXF1ZXdoaXRlNCIsICAgICAgICAxMzksIDEzMSwgMTIwIH0sCisgICAgeyAiYXF1YW1hcmluZSIsICAgICAgICAgICAxMjcsIDI1NSwgMjEyIH0sCisgICAgeyAiYXF1YW1hcmluZTEiLCAgICAgICAgICAxMjcsIDI1NSwgMjEyIH0sCisgICAgeyAiYXF1YW1hcmluZTIiLCAgICAgICAgICAxMTgsIDIzOCwgMTk4IH0sCisgICAgeyAiYXF1YW1hcmluZTMiLCAgICAgICAgICAxMDIsIDIwNSwgMTcwIH0sCisgICAgeyAiYXF1YW1hcmluZTQiLCAgICAgICAgICAgNjksIDEzOSwgMTE2IH0sCisgICAgeyAiYXp1cmUiLCAgICAgICAgICAgICAgICAyNDAsIDI1NSwgMjU1IH0sCisgICAgeyAiYXp1cmUxIiwgICAgICAgICAgICAgICAyNDAsIDI1NSwgMjU1IH0sCisgICAgeyAiYXp1cmUyIiwgICAgICAgICAgICAgICAyMjQsIDIzOCwgMjM4IH0sCisgICAgeyAiYXp1cmUzIiwgICAgICAgICAgICAgICAxOTMsIDIwNSwgMjA1IH0sCisgICAgeyAiYXp1cmU0IiwgICAgICAgICAgICAgICAxMzEsIDEzOSwgMTM5IH0sCisgICAgeyAiYmVpZ2UiLCAgICAgICAgICAgICAgICAyNDUsIDI0NSwgMjIwIH0sCisgICAgeyAiYmlzcXVlIiwgICAgICAgICAgICAgICAyNTUsIDIyOCwgMTk2IH0sCisgICAgeyAiYmlzcXVlMSIsICAgICAgICAgICAgICAyNTUsIDIyOCwgMTk2IH0sCisgICAgeyAiYmlzcXVlMiIsICAgICAgICAgICAgICAyMzgsIDIxMywgMTgzIH0sCisgICAgeyAiYmlzcXVlMyIsICAgICAgICAgICAgICAyMDUsIDE4MywgMTU4IH0sCisgICAgeyAiYmlzcXVlNCIsICAgICAgICAgICAgICAxMzksIDEyNSwgMTA3IH0sCisgICAgeyAiYmxhY2siLCAgICAgICAgICAgICAgICAgIDAsICAgMCwgICAwIH0sCisgICAgeyAiYmxhbmNoZWRhbG1vbmQiLCAgICAgICAyNTUsIDIzNSwgMjA1IH0sCisgICAgeyAiYmx1ZSIsICAgICAgICAgICAgICAgICAgIDAsICAgMCwgMjU1IH0sCisgICAgeyAiYmx1ZTEiLCAgICAgICAgICAgICAgICAgIDAsICAgMCwgMjU1IH0sCisgICAgeyAiYmx1ZTIiLCAgICAgICAgICAgICAgICAgIDAsICAgMCwgMjM4IH0sCisgICAgeyAiYmx1ZTMiLCAgICAgICAgICAgICAgICAgIDAsICAgMCwgMjA1IH0sCisgICAgeyAiYmx1ZTQiLCAgICAgICAgICAgICAgICAgIDAsICAgMCwgMTM5IH0sCisgICAgeyAiYmx1ZXZpb2xldCIsICAgICAgICAgICAxMzgsICA0MywgMjI2IH0sCisgICAgeyAiYnJvd24iLCAgICAgICAgICAgICAgICAxNjUsICA0MiwgIDQyIH0sCisgICAgeyAiYnJvd24xIiwgICAgICAgICAgICAgICAyNTUsICA2NCwgIDY0IH0sCisgICAgeyAiYnJvd24yIiwgICAgICAgICAgICAgICAyMzgsICA1OSwgIDU5IH0sCisgICAgeyAiYnJvd24zIiwgICAgICAgICAgICAgICAyMDUsICA1MSwgIDUxIH0sCisgICAgeyAiYnJvd240IiwgICAgICAgICAgICAgICAxMzksICAzNSwgIDM1IH0sCisgICAgeyAiYnVybHl3b29kIiwgICAgICAgICAgICAyMjIsIDE4NCwgMTM1IH0sCisgICAgeyAiYnVybHl3b29kMSIsICAgICAgICAgICAyNTUsIDIxMSwgMTU1IH0sCisgICAgeyAiYnVybHl3b29kMiIsICAgICAgICAgICAyMzgsIDE5NywgMTQ1IH0sCisgICAgeyAiYnVybHl3b29kMyIsICAgICAgICAgICAyMDUsIDE3MCwgMTI1IH0sCisgICAgeyAiYnVybHl3b29kNCIsICAgICAgICAgICAxMzksIDExNSwgIDg1IH0sCisgICAgeyAiY2FkZXRibHVlIiwgICAgICAgICAgICAgOTUsIDE1OCwgMTYwIH0sCisgICAgeyAiY2FkZXRibHVlMSIsICAgICAgICAgICAxNTIsIDI0NSwgMjU1IH0sCisgICAgeyAiY2FkZXRibHVlMiIsICAgICAgICAgICAxNDIsIDIyOSwgMjM4IH0sCisgICAgeyAiY2FkZXRibHVlMyIsICAgICAgICAgICAxMjIsIDE5NywgMjA1IH0sCisgICAgeyAiY2FkZXRibHVlNCIsICAgICAgICAgICAgODMsIDEzNCwgMTM5IH0sCisgICAgeyAiY2hhcnRyZXVzZSIsICAgICAgICAgICAxMjcsIDI1NSwgICAwIH0sCisgICAgeyAiY2hhcnRyZXVzZTEiLCAgICAgICAgICAxMjcsIDI1NSwgICAwIH0sCisgICAgeyAiY2hhcnRyZXVzZTIiLCAgICAgICAgICAxMTgsIDIzOCwgICAwIH0sCisgICAgeyAiY2hhcnRyZXVzZTMiLCAgICAgICAgICAxMDIsIDIwNSwgICAwIH0sCisgICAgeyAiY2hhcnRyZXVzZTQiLCAgICAgICAgICAgNjksIDEzOSwgICAwIH0sCisgICAgeyAiY2hvY29sYXRlIiwgICAgICAgICAgICAyMTAsIDEwNSwgIDMwIH0sCisgICAgeyAiY2hvY29sYXRlMSIsICAgICAgICAgICAyNTUsIDEyNywgIDM2IH0sCisgICAgeyAiY2hvY29sYXRlMiIsICAgICAgICAgICAyMzgsIDExOCwgIDMzIH0sCisgICAgeyAiY2hvY29sYXRlMyIsICAgICAgICAgICAyMDUsIDEwMiwgIDI5IH0sCisgICAgeyAiY2hvY29sYXRlNCIsICAgICAgICAgICAxMzksICA2OSwgIDE5IH0sCisgICAgeyAiY29yYWwiLCAgICAgICAgICAgICAgICAyNTUsIDEyNywgIDgwIH0sCisgICAgeyAiY29yYWwxIiwgICAgICAgICAgICAgICAyNTUsIDExNCwgIDg2IH0sCisgICAgeyAiY29yYWwyIiwgICAgICAgICAgICAgICAyMzgsIDEwNiwgIDgwIH0sCisgICAgeyAiY29yYWwzIiwgICAgICAgICAgICAgICAyMDUsICA5MSwgIDY5IH0sCisgICAgeyAiY29yYWw0IiwgICAgICAgICAgICAgICAxMzksICA2MiwgIDQ3IH0sCisgICAgeyAiY29ybmZsb3dlcmJsdWUiLCAgICAgICAxMDAsIDE0OSwgMjM3IH0sCisgICAgeyAiY29ybnNpbGsiLCAgICAgICAgICAgICAyNTUsIDI0OCwgMjIwIH0sCisgICAgeyAiY29ybnNpbGsxIiwgICAgICAgICAgICAyNTUsIDI0OCwgMjIwIH0sCisgICAgeyAiY29ybnNpbGsyIiwgICAgICAgICAgICAyMzgsIDIzMiwgMjA1IH0sCisgICAgeyAiY29ybnNpbGszIiwgICAgICAgICAgICAyMDUsIDIwMCwgMTc3IH0sCisgICAgeyAiY29ybnNpbGs0IiwgICAgICAgICAgICAxMzksIDEzNiwgMTIwIH0sCisgICAgeyAiY3lhbiIsICAgICAgICAgICAgICAgICAgIDAsIDI1NSwgMjU1IH0sCisgICAgeyAiY3lhbjEiLCAgICAgICAgICAgICAgICAgIDAsIDI1NSwgMjU1IH0sCisgICAgeyAiY3lhbjIiLCAgICAgICAgICAgICAgICAgIDAsIDIzOCwgMjM4IH0sCisgICAgeyAiY3lhbjMiLCAgICAgICAgICAgICAgICAgIDAsIDIwNSwgMjA1IH0sCisgICAgeyAiY3lhbjQiLCAgICAgICAgICAgICAgICAgIDAsIDEzOSwgMTM5IH0sCisgICAgeyAiZGFya2JsdWUiLCAgICAgICAgICAgICAgIDAsICAgMCwgMTM5IH0sCisgICAgeyAiZGFya2N5YW4iLCAgICAgICAgICAgICAgIDAsIDEzOSwgMTM5IH0sCisgICAgeyAiZGFya2dvbGRlbnJvZCIsICAgICAgICAxODQsIDEzNCwgIDExIH0sCisgICAgeyAiZGFya2dvbGRlbnJvZDEiLCAgICAgICAyNTUsIDE4NSwgIDE1IH0sCisgICAgeyAiZGFya2dvbGRlbnJvZDIiLCAgICAgICAyMzgsIDE3MywgIDE0IH0sCisgICAgeyAiZGFya2dvbGRlbnJvZDMiLCAgICAgICAyMDUsIDE0OSwgIDEyIH0sCisgICAgeyAiZGFya2dvbGRlbnJvZDQiLCAgICAgICAxMzksIDEwMSwgICA4IH0sCisgICAgeyAiZGFya2dyZWVuIiwgICAgICAgICAgICAgIDAsIDEwMCwgICAwIH0sCisgICAgeyAiZGFya2toYWtpIiwgICAgICAgICAgICAxODksIDE4MywgMTA3IH0sCisgICAgeyAiZGFya21hZ2VudGEiLCAgICAgICAgICAxMzksICAgMCwgMTM5IH0sCisgICAgeyAiZGFya29saXZlZ3JlZW4iLCAgICAgICAgODUsIDEwNywgIDQ3IH0sCisgICAgeyAiZGFya29saXZlZ3JlZW4xIiwgICAgICAyMDIsIDI1NSwgMTEyIH0sCisgICAgeyAiZGFya29saXZlZ3JlZW4yIiwgICAgICAxODgsIDIzOCwgMTA0IH0sCisgICAgeyAiZGFya29saXZlZ3JlZW4zIiwgICAgICAxNjIsIDIwNSwgIDkwIH0sCisgICAgeyAiZGFya29saXZlZ3JlZW40IiwgICAgICAxMTAsIDEzOSwgIDYxIH0sCisgICAgeyAiZGFya29yYW5nZSIsICAgICAgICAgICAyNTUsIDE0MCwgICAwIH0sCisgICAgeyAiZGFya29yYW5nZTEiLCAgICAgICAgICAyNTUsIDEyNywgICAwIH0sCisgICAgeyAiZGFya29yYW5nZTIiLCAgICAgICAgICAyMzgsIDExOCwgICAwIH0sCisgICAgeyAiZGFya29yYW5nZTMiLCAgICAgICAgICAyMDUsIDEwMiwgICAwIH0sCisgICAgeyAiZGFya29yYW5nZTQiLCAgICAgICAgICAxMzksICA2OSwgICAwIH0sCisgICAgeyAiZGFya29yY2hpZCIsICAgICAgICAgICAxNTMsICA1MCwgMjA0IH0sCisgICAgeyAiZGFya29yY2hpZDEiLCAgICAgICAgICAxOTEsICA2MiwgMjU1IH0sCisgICAgeyAiZGFya29yY2hpZDIiLCAgICAgICAgICAxNzgsICA1OCwgMjM4IH0sCisgICAgeyAiZGFya29yY2hpZDMiLCAgICAgICAgICAxNTQsICA1MCwgMjA1IH0sCisgICAgeyAiZGFya29yY2hpZDQiLCAgICAgICAgICAxMDQsICAzNCwgMTM5IH0sCisgICAgeyAiZGFya3JlZCIsICAgICAgICAgICAgICAxMzksICAgMCwgICAwIH0sCisgICAgeyAiZGFya3NhbG1vbiIsICAgICAgICAgICAyMzMsIDE1MCwgMTIyIH0sCisgICAgeyAiZGFya3NlYWdyZWVuIiwgICAgICAgICAxNDMsIDE4OCwgMTQzIH0sCisgICAgeyAiZGFya3NlYWdyZWVuMSIsICAgICAgICAxOTMsIDI1NSwgMTkzIH0sCisgICAgeyAiZGFya3NlYWdyZWVuMiIsICAgICAgICAxODAsIDIzOCwgMTgwIH0sCisgICAgeyAiZGFya3NlYWdyZWVuMyIsICAgICAgICAxNTUsIDIwNSwgMTU1IH0sCisgICAgeyAiZGFya3NlYWdyZWVuNCIsICAgICAgICAxMDUsIDEzOSwgMTA1IH0sCisgICAgeyAiZGFya3NsYXRlYmx1ZSIsICAgICAgICAgNzIsICA2MSwgMTM5IH0sCisgICAgeyAiZGFya3NsYXRlZ3JheSIsICAgICAgICAgNDcsICA3OSwgIDc5IH0sCisgICAgeyAiZGFya3NsYXRlZ3JheTEiLCAgICAgICAxNTEsIDI1NSwgMjU1IH0sCisgICAgeyAiZGFya3NsYXRlZ3JheTIiLCAgICAgICAxNDEsIDIzOCwgMjM4IH0sCisgICAgeyAiZGFya3NsYXRlZ3JheTMiLCAgICAgICAxMjEsIDIwNSwgMjA1IH0sCisgICAgeyAiZGFya3NsYXRlZ3JheTQiLCAgICAgICAgODIsIDEzOSwgMTM5IH0sCisgICAgeyAiZGFya3NsYXRlZ3JleSIsICAgICAgICAgNDcsICA3OSwgIDc5IH0sCisgICAgeyAiZGFya3R1cnF1b2lzZSIsICAgICAgICAgIDAsIDIwNiwgMjA5IH0sCisgICAgeyAiZGFya3Zpb2xldCIsICAgICAgICAgICAxNDgsICAgMCwgMjExIH0sCisgICAgeyAiZGVlcHBpbmsiLCAgICAgICAgICAgICAyNTUsICAyMCwgMTQ3IH0sCisgICAgeyAiZGVlcHBpbmsxIiwgICAgICAgICAgICAyNTUsICAyMCwgMTQ3IH0sCisgICAgeyAiZGVlcHBpbmsyIiwgICAgICAgICAgICAyMzgsICAxOCwgMTM3IH0sCisgICAgeyAiZGVlcHBpbmszIiwgICAgICAgICAgICAyMDUsICAxNiwgMTE4IH0sCisgICAgeyAiZGVlcHBpbms0IiwgICAgICAgICAgICAxMzksICAxMCwgIDgwIH0sCisgICAgeyAiZGVlcHNreWJsdWUiLCAgICAgICAgICAgIDAsIDE5MSwgMjU1IH0sCisgICAgeyAiZGVlcHNreWJsdWUxIiwgICAgICAgICAgIDAsIDE5MSwgMjU1IH0sCisgICAgeyAiZGVlcHNreWJsdWUyIiwgICAgICAgICAgIDAsIDE3OCwgMjM4IH0sCisgICAgeyAiZGVlcHNreWJsdWUzIiwgICAgICAgICAgIDAsIDE1NCwgMjA1IH0sCisgICAgeyAiZGVlcHNreWJsdWU0IiwgICAgICAgICAgIDAsIDEwNCwgMTM5IH0sCisgICAgeyAiZGltZ3JheSIsICAgICAgICAgICAgICAxMDUsIDEwNSwgMTA1IH0sCisgICAgeyAiZGltZ3JleSIsICAgICAgICAgICAgICAxMDUsIDEwNSwgMTA1IH0sCisgICAgeyAiZG9kZ2VyYmx1ZSIsICAgICAgICAgICAgMzAsIDE0NCwgMjU1IH0sCisgICAgeyAiZG9kZ2VyYmx1ZTEiLCAgICAgICAgICAgMzAsIDE0NCwgMjU1IH0sCisgICAgeyAiZG9kZ2VyYmx1ZTIiLCAgICAgICAgICAgMjgsIDEzNCwgMjM4IH0sCisgICAgeyAiZG9kZ2VyYmx1ZTMiLCAgICAgICAgICAgMjQsIDExNiwgMjA1IH0sCisgICAgeyAiZG9kZ2VyYmx1ZTQiLCAgICAgICAgICAgMTYsICA3OCwgMTM5IH0sCisgICAgeyAiZmlyZWJyaWNrIiwgICAgICAgICAgICAxNzgsICAzNCwgIDM0IH0sCisgICAgeyAiZmlyZWJyaWNrMSIsICAgICAgICAgICAyNTUsICA0OCwgIDQ4IH0sCisgICAgeyAiZmlyZWJyaWNrMiIsICAgICAgICAgICAyMzgsICA0NCwgIDQ0IH0sCisgICAgeyAiZmlyZWJyaWNrMyIsICAgICAgICAgICAyMDUsICAzOCwgIDM4IH0sCisgICAgeyAiZmlyZWJyaWNrNCIsICAgICAgICAgICAxMzksICAyNiwgIDI2IH0sCisgICAgeyAiZmxvcmFsd2hpdGUiLCAgICAgICAgICAyNTUsIDI1MCwgMjQwIH0sCisgICAgeyAiZm9yZXN0Z3JlZW4iLCAgICAgICAgICAxNzYsICA0OCwgIDk2IH0sCisgICAgeyAiZ2FpbnNib3JvIiwgICAgICAgICAgICAyMjAsIDIyMCwgMjIwIH0sCisgICAgeyAiZ2hvc3R3aGl0ZSIsICAgICAgICAgICAyNDgsIDI0OCwgMjU1IH0sCisgICAgeyAiZ29sZCIsICAgICAgICAgICAgICAgICAyNTUsIDIxNSwgICAwIH0sCisgICAgeyAiZ29sZDEiLCAgICAgICAgICAgICAgICAyNTUsIDIxNSwgICAwIH0sCisgICAgeyAiZ29sZDIiLCAgICAgICAgICAgICAgICAyMzgsIDIwMSwgICAwIH0sCisgICAgeyAiZ29sZDMiLCAgICAgICAgICAgICAgICAyMDUsIDE3MywgICAwIH0sCisgICAgeyAiZ29sZDQiLCAgICAgICAgICAgICAgICAxMzksIDExNywgICAwIH0sCisgICAgeyAiZ29sZGVucm9kIiwgICAgICAgICAgICAyMTgsIDE2NSwgIDMyIH0sCisgICAgeyAiZ29sZGVucm9kMSIsICAgICAgICAgICAyNTUsIDE5MywgIDM3IH0sCisgICAgeyAiZ29sZGVucm9kMiIsICAgICAgICAgICAyMzgsIDE4MCwgIDM0IH0sCisgICAgeyAiZ29sZGVucm9kMyIsICAgICAgICAgICAyMDUsIDE1NSwgIDI5IH0sCisgICAgeyAiZ29sZGVucm9kNCIsICAgICAgICAgICAxMzksIDEwNSwgIDIwIH0sCisgICAgeyAiZ3JheSIsICAgICAgICAgICAgICAgICAxOTAsIDE5MCwgMTkwIH0sCisgICAgeyAiZ3JlZW4iLCAgICAgICAgICAgICAgICAgIDAsIDI1NSwgICAwIH0sCisgICAgeyAiZ3JlZW4xIiwgICAgICAgICAgICAgICAgIDAsIDI1NSwgICAwIH0sCisgICAgeyAiZ3JlZW4yIiwgICAgICAgICAgICAgICAgIDAsIDIzOCwgICAwIH0sCisgICAgeyAiZ3JlZW4zIiwgICAgICAgICAgICAgICAgIDAsIDIwNSwgICAwIH0sCisgICAgeyAiZ3JlZW40IiwgICAgICAgICAgICAgICAgIDAsIDEzOSwgICAwIH0sCisgICAgeyAiZ3JlZW55ZWxsb3ciLCAgICAgICAgICAxNzMsIDI1NSwgIDQ3IH0sCisgICAgeyAiZ3JleSIsICAgICAgICAgICAgICAgICAxOTAsIDE5MCwgMTkwIH0sCisgICAgeyAiaG9uZXlkZXciLCAgICAgICAgICAgICAyNDAsIDI1NSwgMjQwIH0sCisgICAgeyAiaG9uZXlkZXcxIiwgICAgICAgICAgICAyNDAsIDI1NSwgMjQwIH0sCisgICAgeyAiaG9uZXlkZXcyIiwgICAgICAgICAgICAyMjQsIDIzOCwgMjI0IH0sCisgICAgeyAiaG9uZXlkZXczIiwgICAgICAgICAgICAxOTMsIDIwNSwgMTkzIH0sCisgICAgeyAiaG9uZXlkZXc0IiwgICAgICAgICAgICAxMzEsIDEzOSwgMTMxIH0sCisgICAgeyAiaG90cGluayIsICAgICAgICAgICAgICAyNTUsIDEwNSwgMTgwIH0sCisgICAgeyAiaG90cGluazEiLCAgICAgICAgICAgICAyNTUsIDExMCwgMTgwIH0sCisgICAgeyAiaG90cGluazIiLCAgICAgICAgICAgICAyMzgsIDEwNiwgMTY3IH0sCisgICAgeyAiaG90cGluazMiLCAgICAgICAgICAgICAyMDUsICA5NiwgMTQ0IH0sCisgICAgeyAiaG90cGluazQiLCAgICAgICAgICAgICAxMzksICA1OCwgIDk4IH0sCisgICAgeyAiaW5kaWFucmVkIiwgICAgICAgICAgICAyMDUsICA5MiwgIDkyIH0sCisgICAgeyAiaW5kaWFucmVkMSIsICAgICAgICAgICAyNTUsIDEwNiwgMTA2IH0sCisgICAgeyAiaW5kaWFucmVkMiIsICAgICAgICAgICAyMzgsICA5OSwgIDk5IH0sCisgICAgeyAiaW5kaWFucmVkMyIsICAgICAgICAgICAyMDUsICA4NSwgIDg1IH0sCisgICAgeyAiaW5kaWFucmVkNCIsICAgICAgICAgICAxMzksICA1OCwgIDU4IH0sCisgICAgeyAiaXZvcnkiLCAgICAgICAgICAgICAgICAyNTUsIDI1NSwgMjQwIH0sCisgICAgeyAiaXZvcnkxIiwgICAgICAgICAgICAgICAyNTUsIDI1NSwgMjQwIH0sCisgICAgeyAiaXZvcnkyIiwgICAgICAgICAgICAgICAyMzgsIDIzOCwgMjI0IH0sCisgICAgeyAiaXZvcnkzIiwgICAgICAgICAgICAgICAyMDUsIDIwNSwgMTkzIH0sCisgICAgeyAiaXZvcnk0IiwgICAgICAgICAgICAgICAxMzksIDEzOSwgMTMxIH0sCisgICAgeyAia2hha2kiLCAgICAgICAgICAgICAgICAyNDAsIDIzMCwgMTQwIH0sCisgICAgeyAia2hha2kxIiwgICAgICAgICAgICAgICAyNTUsIDI0NiwgMTQzIH0sCisgICAgeyAia2hha2kyIiwgICAgICAgICAgICAgICAyMzgsIDIzMCwgMTMzIH0sCisgICAgeyAia2hha2kzIiwgICAgICAgICAgICAgICAyMDUsIDE5OCwgMTE1IH0sCisgICAgeyAia2hha2k0IiwgICAgICAgICAgICAgICAxMzksIDEzNCwgIDc4IH0sCisgICAgeyAibGF2ZW5kZXIiLCAgICAgICAgICAgICAyMzAsIDIzMCwgMjUwIH0sCisgICAgeyAibGF2ZW5kZXJibHVzaCIsICAgICAgICAyNTUsIDI0MCwgMjQ1IH0sCisgICAgeyAibGF2ZW5kZXJibHVzaDEiLCAgICAgICAyNTUsIDI0MCwgMjQ1IH0sCisgICAgeyAibGF2ZW5kZXJibHVzaDIiLCAgICAgICAyMzgsIDIyNCwgMjI5IH0sCisgICAgeyAibGF2ZW5kZXJibHVzaDMiLCAgICAgICAyMDUsIDE5MywgMTk3IH0sCisgICAgeyAibGF2ZW5kZXJibHVzaDQiLCAgICAgICAxMzksIDEzMSwgMTM0IH0sCisgICAgeyAibGF3bmdyZWVuIiwgICAgICAgICAgICAxMjQsIDI1MiwgICAwIH0sCisgICAgeyAibGVtb25jaGlmZm9uIiwgICAgICAgICAyNTUsIDI1MCwgMjA1IH0sCisgICAgeyAibGVtb25jaGlmZm9uMSIsICAgICAgICAyNTUsIDI1MCwgMjA1IH0sCisgICAgeyAibGVtb25jaGlmZm9uMiIsICAgICAgICAyMzgsIDIzMywgMTkxIH0sCisgICAgeyAibGVtb25jaGlmZm9uMyIsICAgICAgICAyMDUsIDIwMSwgMTY1IH0sCisgICAgeyAibGVtb25jaGlmZm9uNCIsICAgICAgICAxMzksIDEzNywgMTEyIH0sCisgICAgeyAibGlnaHRibHVlIiwgICAgICAgICAgICAxNzMsIDIxNiwgMjMwIH0sCisgICAgeyAibGlnaHRibHVlMSIsICAgICAgICAgICAxOTEsIDIzOSwgMjU1IH0sCisgICAgeyAibGlnaHRibHVlMiIsICAgICAgICAgICAxNzgsIDIyMywgMjM4IH0sCisgICAgeyAibGlnaHRibHVlMyIsICAgICAgICAgICAxNTQsIDE5MiwgMjA1IH0sCisgICAgeyAibGlnaHRibHVlNCIsICAgICAgICAgICAxMDQsIDEzMSwgMTM5IH0sCisgICAgeyAibGlnaHRjb3JhbCIsICAgICAgICAgICAyNDAsIDEyOCwgMTI4IH0sCisgICAgeyAibGlnaHRjeWFuIiwgICAgICAgICAgICAyMjQsIDI1NSwgMjU1IH0sCisgICAgeyAibGlnaHRjeWFuMSIsICAgICAgICAgICAyMjQsIDI1NSwgMjU1IH0sCisgICAgeyAibGlnaHRjeWFuMiIsICAgICAgICAgICAyMDksIDIzOCwgMjM4IH0sCisgICAgeyAibGlnaHRjeWFuMyIsICAgICAgICAgICAxODAsIDIwNSwgMjA1IH0sCisgICAgeyAibGlnaHRjeWFuNCIsICAgICAgICAgICAxMjIsIDEzOSwgMTM5IH0sCisgICAgeyAibGlnaHRnb2xkZW5yb2QiLCAgICAgICAyMzgsIDIyMSwgMTMwIH0sCisgICAgeyAibGlnaHRnb2xkZW5yb2QxIiwgICAgICAyNTUsIDIzNiwgMTM5IH0sCisgICAgeyAibGlnaHRnb2xkZW5yb2QyIiwgICAgICAyMzgsIDIyMCwgMTMwIH0sCisgICAgeyAibGlnaHRnb2xkZW5yb2QzIiwgICAgICAyMDUsIDE5MCwgMTEyIH0sCisgICAgeyAibGlnaHRnb2xkZW5yb2Q0IiwgICAgICAxMzksIDEyOSwgIDc2IH0sCisgICAgeyAibGlnaHRnb2xkZW5yb2R5ZWxsb3ciLCAyNTAsIDI1MCwgMjEwIH0sCisgICAgeyAibGlnaHRncmF5IiwgICAgICAgICAgICAyMTEsIDIxMSwgMjExIH0sCisgICAgeyAibGlnaHRncmVlbiIsICAgICAgICAgICAxNDQsIDIzOCwgMTQ0IH0sCisgICAgeyAibGlnaHRncmV5IiwgICAgICAgICAgICAyMTEsIDIxMSwgMjExIH0sCisgICAgeyAibGlnaHRwaW5rIiwgICAgICAgICAgICAyNTUsIDE4MiwgMTkzIH0sCisgICAgeyAibGlnaHRwaW5rMSIsICAgICAgICAgICAyNTUsIDE3NCwgMTg1IH0sCisgICAgeyAibGlnaHRwaW5rMiIsICAgICAgICAgICAyMzgsIDE2MiwgMTczIH0sCisgICAgeyAibGlnaHRwaW5rMyIsICAgICAgICAgICAyMDUsIDE0MCwgMTQ5IH0sCisgICAgeyAibGlnaHRwaW5rNCIsICAgICAgICAgICAxMzksICA5NSwgMTAxIH0sCisgICAgeyAibGlnaHRzYWxtb24iLCAgICAgICAgICAyNTUsIDE2MCwgMTIyIH0sCisgICAgeyAibGlnaHRzYWxtb24xIiwgICAgICAgICAyNTUsIDE2MCwgMTIyIH0sCisgICAgeyAibGlnaHRzYWxtb24yIiwgICAgICAgICAyMzgsIDE0OSwgMTE0IH0sCisgICAgeyAibGlnaHRzYWxtb24zIiwgICAgICAgICAyMDUsIDEyOSwgIDk4IH0sCisgICAgeyAibGlnaHRzYWxtb240IiwgICAgICAgICAxMzksICA4NywgIDY2IH0sCisgICAgeyAibGlnaHRzZWFncmVlbiIsICAgICAgICAgMzIsIDE3OCwgMTcwIH0sCisgICAgeyAibGlnaHRza3libHVlIiwgICAgICAgICAxMzUsIDIwNiwgMjUwIH0sCisgICAgeyAibGlnaHRza3libHVlMSIsICAgICAgICAxNzYsIDIyNiwgMjU1IH0sCisgICAgeyAibGlnaHRza3libHVlMiIsICAgICAgICAxNjQsIDIxMSwgMjM4IH0sCisgICAgeyAibGlnaHRza3libHVlMyIsICAgICAgICAxNDEsIDE4MiwgMjA1IH0sCisgICAgeyAibGlnaHRza3libHVlNCIsICAgICAgICAgOTYsIDEyMywgMTM5IH0sCisgICAgeyAibGlnaHRzbGF0ZWJsdWUiLCAgICAgICAxMzIsIDExMiwgMjU1IH0sCisgICAgeyAibGlnaHRzbGF0ZWdyYXkiLCAgICAgICAxMTksIDEzNiwgMTUzIH0sCisgICAgeyAibGlnaHRzbGF0ZWdyZXkiLCAgICAgICAxMTksIDEzNiwgMTUzIH0sCisgICAgeyAibGlnaHRzdGVlbGJsdWUiLCAgICAgICAxNzYsIDE5NiwgMjIyIH0sCisgICAgeyAibGlnaHRzdGVlbGJsdWUxIiwgICAgICAyMDIsIDIyNSwgMjU1IH0sCisgICAgeyAibGlnaHRzdGVlbGJsdWUyIiwgICAgICAxODgsIDIxMCwgMjM4IH0sCisgICAgeyAibGlnaHRzdGVlbGJsdWUzIiwgICAgICAxNjIsIDE4MSwgMjA1IH0sCisgICAgeyAibGlnaHRzdGVlbGJsdWU0IiwgICAgICAxMTAsIDEyMywgMTM5IH0sCisgICAgeyAibGlnaHR5ZWxsb3ciLCAgICAgICAgICAyNTUsIDI1NSwgMjI0IH0sCisgICAgeyAibGlnaHR5ZWxsb3cxIiwgICAgICAgICAyNTUsIDI1NSwgMjI0IH0sCisgICAgeyAibGlnaHR5ZWxsb3cyIiwgICAgICAgICAyMzgsIDIzOCwgMjA5IH0sCisgICAgeyAibGlnaHR5ZWxsb3czIiwgICAgICAgICAyMDUsIDIwNSwgMTgwIH0sCisgICAgeyAibGlnaHR5ZWxsb3c0IiwgICAgICAgICAxMzksIDEzOSwgMTIyIH0sCisgICAgeyAibGltZWdyZWVuIiwgICAgICAgICAgICAgNTAsIDIwNSwgIDUwIH0sCisgICAgeyAibGluZW4iLCAgICAgICAgICAgICAgICAyNTAsIDI0MCwgMjMwIH0sCisgICAgeyAibWFnZW50YSIsICAgICAgICAgICAgICAyNTUsICAgMCwgMjU1IH0sCisgICAgeyAibWFnZW50YTEiLCAgICAgICAgICAgICAyNTUsICAgMCwgMjU1IH0sCisgICAgeyAibWFnZW50YTIiLCAgICAgICAgICAgICAyMzgsICAgMCwgMjM4IH0sCisgICAgeyAibWFnZW50YTMiLCAgICAgICAgICAgICAyMDUsICAgMCwgMjA1IH0sCisgICAgeyAibWFnZW50YTQiLCAgICAgICAgICAgICAxMzksICAgMCwgMTM5IH0sCisgICAgeyAibWFyb29uIiwgICAgICAgICAgICAgICAgIDAsIDI1NSwgMjU1IH0sCisgICAgeyAibWFyb29uMSIsICAgICAgICAgICAgICAyNTUsICA1MiwgMTc5IH0sCisgICAgeyAibWFyb29uMiIsICAgICAgICAgICAgICAyMzgsICA0OCwgMTY3IH0sCisgICAgeyAibWFyb29uMyIsICAgICAgICAgICAgICAyMDUsICA0MSwgMTQ0IH0sCisgICAgeyAibWFyb29uNCIsICAgICAgICAgICAgICAxMzksICAyOCwgIDk4IH0sCisgICAgeyAibWVkaXVtYXF1YW1hcmluZSIsICAgICAxMDIsIDIwNSwgMTcwIH0sCisgICAgeyAibWVkaXVtYmx1ZSIsICAgICAgICAgICAgIDAsICAgMCwgMjA1IH0sCisgICAgeyAibWVkaXVtb3JjaGlkIiwgICAgICAgICAxODYsICA4NSwgMjExIH0sCisgICAgeyAibWVkaXVtb3JjaGlkMSIsICAgICAgICAyMjQsIDEwMiwgMjU1IH0sCisgICAgeyAibWVkaXVtb3JjaGlkMiIsICAgICAgICAyMDksICA5NSwgMjM4IH0sCisgICAgeyAibWVkaXVtb3JjaGlkMyIsICAgICAgICAxODAsICA4MiwgMjA1IH0sCisgICAgeyAibWVkaXVtb3JjaGlkNCIsICAgICAgICAxMjIsICA1NSwgMTM5IH0sCisgICAgeyAibWVkaXVtcHVycGxlIiwgICAgICAgICAxNDcsIDExMiwgMjE5IH0sCisgICAgeyAibWVkaXVtcHVycGxlMSIsICAgICAgICAxNzEsIDEzMCwgMjU1IH0sCisgICAgeyAibWVkaXVtcHVycGxlMiIsICAgICAgICAxNTksIDEyMSwgMjM4IH0sCisgICAgeyAibWVkaXVtcHVycGxlMyIsICAgICAgICAxMzcsIDEwNCwgMjA1IH0sCisgICAgeyAibWVkaXVtcHVycGxlNCIsICAgICAgICAgOTMsICA3MSwgMTM5IH0sCisgICAgeyAibWVkaXVtc2VhZ3JlZW4iLCAgICAgICAgNjAsIDE3OSwgMTEzIH0sCisgICAgeyAibWVkaXVtc2xhdGVibHVlIiwgICAgICAxMjMsIDEwNCwgMjM4IH0sCisgICAgeyAibWVkaXVtc3ByaW5nZ3JlZW4iLCAgICAgIDAsIDI1MCwgMTU0IH0sCisgICAgeyAibWVkaXVtdHVycXVvaXNlIiwgICAgICAgNzIsIDIwOSwgMjA0IH0sCisgICAgeyAibWVkaXVtdmlvbGV0cmVkIiwgICAgICAxOTksICAyMSwgMTMzIH0sCisgICAgeyAibWlkbmlnaHRibHVlIiwgICAgICAgICAgMjUsICAyNSwgMTEyIH0sCisgICAgeyAibWludGNyZWFtIiwgICAgICAgICAgICAyNDUsIDI1NSwgMjUwIH0sCisgICAgeyAibWlzdHlyb3NlIiwgICAgICAgICAgICAyNTUsIDIyOCwgMjI1IH0sCisgICAgeyAibWlzdHlyb3NlMSIsICAgICAgICAgICAyNTUsIDIyOCwgMjI1IH0sCisgICAgeyAibWlzdHlyb3NlMiIsICAgICAgICAgICAyMzgsIDIxMywgMjEwIH0sCisgICAgeyAibWlzdHlyb3NlMyIsICAgICAgICAgICAyMDUsIDE4MywgMTgxIH0sCisgICAgeyAibWlzdHlyb3NlNCIsICAgICAgICAgICAxMzksIDEyNSwgMTIzIH0sCisgICAgeyAibW9jY2FzaW4iLCAgICAgICAgICAgICAyNTUsIDIyOCwgMTgxIH0sCisgICAgeyAibmF2YWpvd2hpdGUiLCAgICAgICAgICAyNTUsIDIyMiwgMTczIH0sCisgICAgeyAibmF2YWpvd2hpdGUxIiwgICAgICAgICAyNTUsIDIyMiwgMTczIH0sCisgICAgeyAibmF2YWpvd2hpdGUyIiwgICAgICAgICAyMzgsIDIwNywgMTYxIH0sCisgICAgeyAibmF2YWpvd2hpdGUzIiwgICAgICAgICAyMDUsIDE3OSwgMTM5IH0sCisgICAgeyAibmF2YWpvd2hpdGU0IiwgICAgICAgICAxMzksIDEyMSwgIDk0IH0sCisgICAgeyAibmF2eSIsICAgICAgICAgICAgICAgICAgIDAsICAgMCwgMTI4IH0sCisgICAgeyAibmF2eWJsdWUiLCAgICAgICAgICAgICAgIDAsICAgMCwgMTI4IH0sCisgICAgeyAib2xkbGFjZSIsICAgICAgICAgICAgICAyNTMsIDI0NSwgMjMwIH0sCisgICAgeyAib2xpdmVkcmFiIiwgICAgICAgICAgICAxMDcsIDE0MiwgIDM1IH0sCisgICAgeyAib2xpdmVkcmFiMSIsICAgICAgICAgICAxOTIsIDI1NSwgIDYyIH0sCisgICAgeyAib2xpdmVkcmFiMiIsICAgICAgICAgICAxNzksIDIzOCwgIDU4IH0sCisgICAgeyAib2xpdmVkcmFiMyIsICAgICAgICAgICAxNTQsIDIwNSwgIDUwIH0sCisgICAgeyAib2xpdmVkcmFiNCIsICAgICAgICAgICAxMDUsIDEzOSwgIDM0IH0sCisgICAgeyAib3JhbmdlIiwgICAgICAgICAgICAgICAyNTUsIDE2NSwgICAwIH0sCisgICAgeyAib3JhbmdlMSIsICAgICAgICAgICAgICAyNTUsIDE2NSwgICAwIH0sCisgICAgeyAib3JhbmdlMiIsICAgICAgICAgICAgICAyMzgsIDE1NCwgICAwIH0sCisgICAgeyAib3JhbmdlMyIsICAgICAgICAgICAgICAyMDUsIDEzMywgICAwIH0sCisgICAgeyAib3JhbmdlNCIsICAgICAgICAgICAgICAxMzksICA5MCwgICAwIH0sCisgICAgeyAib3JhbmdlcmVkIiwgICAgICAgICAgICAyNTUsICA2OSwgICAwIH0sCisgICAgeyAib3JhbmdlcmVkMSIsICAgICAgICAgICAyNTUsICA2OSwgICAwIH0sCisgICAgeyAib3JhbmdlcmVkMiIsICAgICAgICAgICAyMzgsICA2NCwgICAwIH0sCisgICAgeyAib3JhbmdlcmVkMyIsICAgICAgICAgICAyMDUsICA1NSwgICAwIH0sCisgICAgeyAib3JhbmdlcmVkNCIsICAgICAgICAgICAxMzksICAzNywgICAwIH0sCisgICAgeyAib3JjaGlkIiwgICAgICAgICAgICAgICAyMTgsIDExMiwgMjE0IH0sCisgICAgeyAib3JjaGlkMSIsICAgICAgICAgICAgICAyNTUsIDEzMSwgMjUwIH0sCisgICAgeyAib3JjaGlkMiIsICAgICAgICAgICAgICAyMzgsIDEyMiwgMjMzIH0sCisgICAgeyAib3JjaGlkMyIsICAgICAgICAgICAgICAyMDUsIDEwNSwgMjAxIH0sCisgICAgeyAib3JjaGlkNCIsICAgICAgICAgICAgICAxMzksICA3MSwgMTM3IH0sCisgICAgeyAicGFsZWdvbGRlbnJvZCIsICAgICAgICAyMzgsIDIzMiwgMTcwIH0sCisgICAgeyAicGFsZWdyZWVuIiwgICAgICAgICAgICAxNTIsIDI1MSwgMTUyIH0sCisgICAgeyAicGFsZWdyZWVuMSIsICAgICAgICAgICAxNTQsIDI1NSwgMTU0IH0sCisgICAgeyAicGFsZWdyZWVuMiIsICAgICAgICAgICAxNDQsIDIzOCwgMTQ0IH0sCisgICAgeyAicGFsZWdyZWVuMyIsICAgICAgICAgICAxMjQsIDIwNSwgMTI0IH0sCisgICAgeyAicGFsZWdyZWVuNCIsICAgICAgICAgICAgODQsIDEzOSwgIDg0IH0sCisgICAgeyAicGFsZXR1cnF1b2lzZSIsICAgICAgICAxNzUsIDIzOCwgMjM4IH0sCisgICAgeyAicGFsZXR1cnF1b2lzZTEiLCAgICAgICAxODcsIDI1NSwgMjU1IH0sCisgICAgeyAicGFsZXR1cnF1b2lzZTIiLCAgICAgICAxNzQsIDIzOCwgMjM4IH0sCisgICAgeyAicGFsZXR1cnF1b2lzZTMiLCAgICAgICAxNTAsIDIwNSwgMjA1IH0sCisgICAgeyAicGFsZXR1cnF1b2lzZTQiLCAgICAgICAxMDIsIDEzOSwgMTM5IH0sCisgICAgeyAicGFsZXZpb2xldHJlZCIsICAgICAgICAyMTksIDExMiwgMTQ3IH0sCisgICAgeyAicGFsZXZpb2xldHJlZDEiLCAgICAgICAyNTUsIDEzMCwgMTcxIH0sCisgICAgeyAicGFsZXZpb2xldHJlZDIiLCAgICAgICAyMzgsIDEyMSwgMTU5IH0sCisgICAgeyAicGFsZXZpb2xldHJlZDMiLCAgICAgICAyMDUsIDEwNCwgMTM3IH0sCisgICAgeyAicGFsZXZpb2xldHJlZDQiLCAgICAgICAxMzksICA3MSwgIDkzIH0sCisgICAgeyAicGFwYXlhd2hpcCIsICAgICAgICAgICAyNTUsIDIzOSwgMjEzIH0sCisgICAgeyAicGVhY2hwdWZmIiwgICAgICAgICAgICAyNTUsIDIxOCwgMTg1IH0sCisgICAgeyAicGVhY2hwdWZmMSIsICAgICAgICAgICAyNTUsIDIxOCwgMTg1IH0sCisgICAgeyAicGVhY2hwdWZmMiIsICAgICAgICAgICAyMzgsIDIwMywgMTczIH0sCisgICAgeyAicGVhY2hwdWZmMyIsICAgICAgICAgICAyMDUsIDE3NSwgMTQ5IH0sCisgICAgeyAicGVhY2hwdWZmNCIsICAgICAgICAgICAxMzksIDExOSwgMTAxIH0sCisgICAgeyAicGVydSIsICAgICAgICAgICAgICAgICAyMDUsIDEzMywgIDYzIH0sCisgICAgeyAicGluayIsICAgICAgICAgICAgICAgICAyNTUsIDE5MiwgMjAzIH0sCisgICAgeyAicGluazEiLCAgICAgICAgICAgICAgICAyNTUsIDE4MSwgMTk3IH0sCisgICAgeyAicGluazIiLCAgICAgICAgICAgICAgICAyMzgsIDE2OSwgMTg0IH0sCisgICAgeyAicGluazMiLCAgICAgICAgICAgICAgICAyMDUsIDE0NSwgMTU4IH0sCisgICAgeyAicGluazQiLCAgICAgICAgICAgICAgICAxMzksICA5OSwgMTA4IH0sCisgICAgeyAicGx1bSIsICAgICAgICAgICAgICAgICAyMjEsIDE2MCwgMjIxIH0sCisgICAgeyAicGx1bTEiLCAgICAgICAgICAgICAgICAyNTUsIDE4NywgMjU1IH0sCisgICAgeyAicGx1bTIiLCAgICAgICAgICAgICAgICAyMzgsIDE3NCwgMjM4IH0sCisgICAgeyAicGx1bTMiLCAgICAgICAgICAgICAgICAyMDUsIDE1MCwgMjA1IH0sCisgICAgeyAicGx1bTQiLCAgICAgICAgICAgICAgICAxMzksIDEwMiwgMTM5IH0sCisgICAgeyAicG93ZGVyYmx1ZSIsICAgICAgICAgICAxNzYsIDIyNCwgMjMwIH0sCisgICAgeyAicHVycGxlIiwgICAgICAgICAgICAgICAxNjAsICAzMiwgMjQwIH0sCisgICAgeyAicHVycGxlMSIsICAgICAgICAgICAgICAxNTUsICA0OCwgMjU1IH0sCisgICAgeyAicHVycGxlMiIsICAgICAgICAgICAgICAxNDUsICA0NCwgMjM4IH0sCisgICAgeyAicHVycGxlMyIsICAgICAgICAgICAgICAxMjUsICAzOCwgMjA1IH0sCisgICAgeyAicHVycGxlNCIsICAgICAgICAgICAgICAgODUsICAyNiwgMTM5IH0sCisgICAgeyAicmVkIiwgICAgICAgICAgICAgICAgICAyNTUsICAgMCwgICAwIH0sCisgICAgeyAicmVkMSIsICAgICAgICAgICAgICAgICAyNTUsICAgMCwgICAwIH0sCisgICAgeyAicmVkMiIsICAgICAgICAgICAgICAgICAyMzgsICAgMCwgICAwIH0sCisgICAgeyAicmVkMyIsICAgICAgICAgICAgICAgICAyMDUsICAgMCwgICAwIH0sCisgICAgeyAicmVkNCIsICAgICAgICAgICAgICAgICAxMzksICAgMCwgICAwIH0sCisgICAgeyAicm9zeWJyb3duIiwgICAgICAgICAgICAxODgsIDE0MywgMTQzIH0sCisgICAgeyAicm9zeWJyb3duMSIsICAgICAgICAgICAyNTUsIDE5MywgMTkzIH0sCisgICAgeyAicm9zeWJyb3duMiIsICAgICAgICAgICAyMzgsIDE4MCwgMTgwIH0sCisgICAgeyAicm9zeWJyb3duMyIsICAgICAgICAgICAyMDUsIDE1NSwgMTU1IH0sCisgICAgeyAicm9zeWJyb3duNCIsICAgICAgICAgICAxMzksIDEwNSwgMTA1IH0sCisgICAgeyAicm95YWxibHVlIiwgICAgICAgICAgICAgNjUsIDEwNSwgMjI1IH0sCisgICAgeyAicm95YWxibHVlMSIsICAgICAgICAgICAgNzIsIDExOCwgMjU1IH0sCisgICAgeyAicm95YWxibHVlMiIsICAgICAgICAgICAgNjcsIDExMCwgMjM4IH0sCisgICAgeyAicm95YWxibHVlMyIsICAgICAgICAgICAgNTgsICA5NSwgMjA1IH0sCisgICAgeyAicm95YWxibHVlNCIsICAgICAgICAgICAgMzksICA2NCwgMTM5IH0sCisgICAgeyAic2FkZGxlYnJvd24iLCAgICAgICAgICAxMzksICA2OSwgIDE5IH0sCisgICAgeyAic2FsbW9uIiwgICAgICAgICAgICAgICAyNTAsIDEyOCwgMTE0IH0sCisgICAgeyAic2FsbW9uMSIsICAgICAgICAgICAgICAyNTUsIDE0MCwgMTA1IH0sCisgICAgeyAic2FsbW9uMiIsICAgICAgICAgICAgICAyMzgsIDEzMCwgIDk4IH0sCisgICAgeyAic2FsbW9uMyIsICAgICAgICAgICAgICAyMDUsIDExMiwgIDg0IH0sCisgICAgeyAic2FsbW9uNCIsICAgICAgICAgICAgICAxMzksICA3NiwgIDU3IH0sCisgICAgeyAic2FuZHlicm93biIsICAgICAgICAgICAyNDQsIDE2NCwgIDk2IH0sCisgICAgeyAic2VhZ3JlZW4iLCAgICAgICAgICAgICAgNDYsIDEzOSwgIDg3IH0sCisgICAgeyAic2VhZ3JlZW4xIiwgICAgICAgICAgICAgODQsIDI1NSwgMTU5IH0sCisgICAgeyAic2VhZ3JlZW4yIiwgICAgICAgICAgICAgNzgsIDIzOCwgMTQ4IH0sCisgICAgeyAic2VhZ3JlZW4zIiwgICAgICAgICAgICAgNjcsIDIwNSwgMTI4IH0sCisgICAgeyAic2VhZ3JlZW40IiwgICAgICAgICAgICAgNDYsIDEzOSwgIDg3IH0sCisgICAgeyAic2Vhc2hlbGwiLCAgICAgICAgICAgICAyNTUsIDI0NSwgMjM4IH0sCisgICAgeyAic2Vhc2hlbGwxIiwgICAgICAgICAgICAyNTUsIDI0NSwgMjM4IH0sCisgICAgeyAic2Vhc2hlbGwyIiwgICAgICAgICAgICAyMzgsIDIyOSwgMjIyIH0sCisgICAgeyAic2Vhc2hlbGwzIiwgICAgICAgICAgICAyMDUsIDE5NywgMTkxIH0sCisgICAgeyAic2Vhc2hlbGw0IiwgICAgICAgICAgICAxMzksIDEzNCwgMTMwIH0sCisgICAgeyAic2llbm5hIiwgICAgICAgICAgICAgICAxNjAsICA4MiwgIDQ1IH0sCisgICAgeyAic2llbm5hMSIsICAgICAgICAgICAgICAyNTUsIDEzMCwgIDcxIH0sCisgICAgeyAic2llbm5hMiIsICAgICAgICAgICAgICAyMzgsIDEyMSwgIDY2IH0sCisgICAgeyAic2llbm5hMyIsICAgICAgICAgICAgICAyMDUsIDEwNCwgIDU3IH0sCisgICAgeyAic2llbm5hNCIsICAgICAgICAgICAgICAxMzksICA3MSwgIDM4IH0sCisgICAgeyAic2t5Ymx1ZSIsICAgICAgICAgICAgICAxMzUsIDIwNiwgMjM1IH0sCisgICAgeyAic2t5Ymx1ZTEiLCAgICAgICAgICAgICAxMzUsIDIwNiwgMjU1IH0sCisgICAgeyAic2t5Ymx1ZTIiLCAgICAgICAgICAgICAxMjYsIDE5MiwgMjM4IH0sCisgICAgeyAic2t5Ymx1ZTMiLCAgICAgICAgICAgICAxMDgsIDE2NiwgMjA1IH0sCisgICAgeyAic2t5Ymx1ZTQiLCAgICAgICAgICAgICAgNzQsIDExMiwgMTM5IH0sCisgICAgeyAic2xhdGVibHVlIiwgICAgICAgICAgICAxMDYsICA5MCwgMjA1IH0sCisgICAgeyAic2xhdGVibHVlMSIsICAgICAgICAgICAxMzEsIDExMSwgMjU1IH0sCisgICAgeyAic2xhdGVibHVlMiIsICAgICAgICAgICAxMjIsIDEwMywgMjM4IH0sCisgICAgeyAic2xhdGVibHVlMyIsICAgICAgICAgICAxMDUsICA4OSwgMjA1IH0sCisgICAgeyAic2xhdGVibHVlNCIsICAgICAgICAgICAgNzEsICA2MCwgMTM5IH0sCisgICAgeyAic2xhdGVncmF5IiwgICAgICAgICAgICAxMTIsIDEyOCwgMTQ0IH0sCisgICAgeyAic2xhdGVncmF5MSIsICAgICAgICAgICAxOTgsIDIyNiwgMjU1IH0sCisgICAgeyAic2xhdGVncmF5MiIsICAgICAgICAgICAxODUsIDIxMSwgMjM4IH0sCisgICAgeyAic2xhdGVncmF5MyIsICAgICAgICAgICAxNTksIDE4MiwgMjA1IH0sCisgICAgeyAic2xhdGVncmF5NCIsICAgICAgICAgICAxMDgsIDEyMywgMTM5IH0sCisgICAgeyAic2xhdGVncmV5IiwgICAgICAgICAgICAxMTIsIDEyOCwgMTQ0IH0sCisgICAgeyAic25vdyIsICAgICAgICAgICAgICAgICAyNTUsIDI1MCwgMjUwIH0sCisgICAgeyAic25vdzEiLCAgICAgICAgICAgICAgICAyNTUsIDI1MCwgMjUwIH0sCisgICAgeyAic25vdzIiLCAgICAgICAgICAgICAgICAyMzgsIDIzMywgMjMzIH0sCisgICAgeyAic25vdzMiLCAgICAgICAgICAgICAgICAyMDUsIDIwMSwgMjAxIH0sCisgICAgeyAic25vdzQiLCAgICAgICAgICAgICAgICAxMzksIDEzNywgMTM3IH0sCisgICAgeyAic3ByaW5nZ3JlZW4iLCAgICAgICAgICAgIDAsIDI1NSwgMTI3IH0sCisgICAgeyAic3ByaW5nZ3JlZW4xIiwgICAgICAgICAgIDAsIDI1NSwgMTI3IH0sCisgICAgeyAic3ByaW5nZ3JlZW4yIiwgICAgICAgICAgIDAsIDIzOCwgMTE4IH0sCisgICAgeyAic3ByaW5nZ3JlZW4zIiwgICAgICAgICAgIDAsIDIwNSwgMTAyIH0sCisgICAgeyAic3ByaW5nZ3JlZW40IiwgICAgICAgICAgIDAsIDEzOSwgIDY5IH0sCisgICAgeyAic3RlZWxibHVlIiwgICAgICAgICAgICAgNzAsIDEzMCwgMTgwIH0sCisgICAgeyAic3RlZWxibHVlMSIsICAgICAgICAgICAgOTksIDE4NCwgMjU1IH0sCisgICAgeyAic3RlZWxibHVlMiIsICAgICAgICAgICAgOTIsIDE3MiwgMjM4IH0sCisgICAgeyAic3RlZWxibHVlMyIsICAgICAgICAgICAgNzksIDE0OCwgMjA1IH0sCisgICAgeyAic3RlZWxibHVlNCIsICAgICAgICAgICAgNTQsIDEwMCwgMTM5IH0sCisgICAgeyAidGFuIiwgICAgICAgICAgICAgICAgICAyMTAsIDE4MCwgMTQwIH0sCisgICAgeyAidGFuMSIsICAgICAgICAgICAgICAgICAyNTUsIDE2NSwgIDc5IH0sCisgICAgeyAidGFuMiIsICAgICAgICAgICAgICAgICAyMzgsIDE1NCwgIDczIH0sCisgICAgeyAidGFuMyIsICAgICAgICAgICAgICAgICAyMDUsIDEzMywgIDYzIH0sCisgICAgeyAidGFuNCIsICAgICAgICAgICAgICAgICAxMzksICA5MCwgIDQzIH0sCisgICAgeyAidGhpc3RsZSIsICAgICAgICAgICAgICAyMTYsIDE5MSwgMjE2IH0sCisgICAgeyAidGhpc3RsZTEiLCAgICAgICAgICAgICAyNTUsIDIyNSwgMjU1IH0sCisgICAgeyAidGhpc3RsZTIiLCAgICAgICAgICAgICAyMzgsIDIxMCwgMjM4IH0sCisgICAgeyAidGhpc3RsZTMiLCAgICAgICAgICAgICAyMDUsIDE4MSwgMjA1IH0sCisgICAgeyAidGhpc3RsZTQiLCAgICAgICAgICAgICAxMzksIDEyMywgMTM5IH0sCisgICAgeyAidG9tYXRvIiwgICAgICAgICAgICAgICAyNTUsICA5OSwgIDcxIH0sCisgICAgeyAidG9tYXRvMSIsICAgICAgICAgICAgICAyNTUsICA5OSwgIDcxIH0sCisgICAgeyAidG9tYXRvMiIsICAgICAgICAgICAgICAyMzgsICA5MiwgIDY2IH0sCisgICAgeyAidG9tYXRvMyIsICAgICAgICAgICAgICAyMDUsICA3OSwgIDU3IH0sCisgICAgeyAidG9tYXRvNCIsICAgICAgICAgICAgICAxMzksICA1NCwgIDM4IH0sCisgICAgeyAidHVycXVvaXNlIiwgICAgICAgICAgICAgNjQsIDIyNCwgMjA4IH0sCisgICAgeyAidHVycXVvaXNlMSIsICAgICAgICAgICAgIDAsIDI0NSwgMjU1IH0sCisgICAgeyAidHVycXVvaXNlMiIsICAgICAgICAgICAgIDAsIDIyOSwgMjM4IH0sCisgICAgeyAidHVycXVvaXNlMyIsICAgICAgICAgICAgIDAsIDE5NywgMjA1IH0sCisgICAgeyAidHVycXVvaXNlNCIsICAgICAgICAgICAgIDAsIDEzNCwgMTM5IH0sCisgICAgeyAidmlvbGV0IiwgICAgICAgICAgICAgICAyMzgsIDEzMCwgMjM4IH0sCisgICAgeyAidmlvbGV0cmVkIiwgICAgICAgICAgICAyMDgsICAzMiwgMTQ0IH0sCisgICAgeyAidmlvbGV0cmVkMSIsICAgICAgICAgICAyNTUsICA2MiwgMTUwIH0sCisgICAgeyAidmlvbGV0cmVkMiIsICAgICAgICAgICAyMzgsICA1OCwgMTQwIH0sCisgICAgeyAidmlvbGV0cmVkMyIsICAgICAgICAgICAyMDUsICA1MCwgMTIwIH0sCisgICAgeyAidmlvbGV0cmVkNCIsICAgICAgICAgICAxMzksICAzNCwgIDgyIH0sCisgICAgeyAid2hlYXQiLCAgICAgICAgICAgICAgICAyNDUsIDIyMiwgMTc5IH0sCisgICAgeyAid2hlYXQxIiwgICAgICAgICAgICAgICAyNTUsIDIzMSwgMTg2IH0sCisgICAgeyAid2hlYXQyIiwgICAgICAgICAgICAgICAyMzgsIDIxNiwgMTc0IH0sCisgICAgeyAid2hlYXQzIiwgICAgICAgICAgICAgICAyMDUsIDE4NiwgMTUwIH0sCisgICAgeyAid2hlYXQ0IiwgICAgICAgICAgICAgICAxMzksIDEyNiwgMTAyIH0sCisgICAgeyAid2hpdGUiLCAgICAgICAgICAgICAgICAyNTUsIDI1NSwgMjU1IH0sCisgICAgeyAid2hpdGVzbW9rZSIsICAgICAgICAgICAyNDUsIDI0NSwgMjQ1IH0sCisgICAgeyAieWVsbG93IiwgICAgICAgICAgICAgICAyNTUsIDI1NSwgICAwIH0sCisgICAgeyAieWVsbG93MSIsICAgICAgICAgICAgICAyNTUsIDI1NSwgICAwIH0sCisgICAgeyAieWVsbG93MiIsICAgICAgICAgICAgICAyMzgsIDIzOCwgICAwIH0sCisgICAgeyAieWVsbG93MyIsICAgICAgICAgICAgICAyMDUsIDIwNSwgICAwIH0sCisgICAgeyAieWVsbG93NCIsICAgICAgICAgICAgICAxMzksIDEzOSwgICAwIH0sCisgICAgeyAieWVsbG93Z3JlZW4iLCAgICAgICAgICAxNTQsIDIwNSwgIDUwIH0KK307CisKKworQk9PTCBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9Mb29rdXBYMTFDb2xvcihjb25zdCBjaGFyICpzekNvbG9yLCBCWVRFICpuUmVkLCBCWVRFICpuR3JlZW4sIEJZVEUgKm5CbHVlKSB7CisgICAgaW50IGk7CisKKyAgICAvLyBsb29rdXAgY29sb3IKKyAgICBpID0gRnJlZUltYWdlX0xvb2t1cE5hbWVkQ29sb3Ioc3pDb2xvciwgWDExQ29sb3JNYXAsIHNpemVvZihYMTFDb2xvck1hcCkvc2l6ZW9mKFgxMUNvbG9yTWFwWzBdKSk7CisgICAgaWYgKGkgPj0gMCkgeworICAgICAgICAqblJlZCAgID0gWDExQ29sb3JNYXBbaV0ucjsKKyAgICAgICAgKm5HcmVlbiA9IFgxMUNvbG9yTWFwW2ldLmc7CisgICAgICAgICpuQmx1ZSAgPSBYMTFDb2xvck1hcFtpXS5iOworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgICAvLyBub3QgZm91bmQsIHRyeSBmb3IgZ3JleSBjb2xvciB3aXRoIGF0dGFjaGVkIHBlcmNlbnQgdmFsdWUKKyAgICBpZiAoIChzekNvbG9yWzBdID09ICdnJyB8fCBzekNvbG9yWzBdID09ICdHJykgJiYKKyAgICAgICAgIChzekNvbG9yWzFdID09ICdyJyB8fCBzekNvbG9yWzFdID09ICdSJykgJiYKKyAgICAgICAgIChzekNvbG9yWzJdID09ICdlJyB8fCBzekNvbG9yWzJdID09ICdFJyB8fCBzekNvbG9yWzJdID09ICdhJyB8fCBzekNvbG9yWzJdID09ICdBJyApICYmCisgICAgICAgICAoc3pDb2xvclszXSA9PSAneScgfHwgc3pDb2xvclszXSA9PSAnWScgKSApICB7CisKKyAgICAgICAgLy8gZ3JleTxudW0+LCBvciBncmF5PG51bT4sIG51bSAxLi4uMTAwCisgICAgICAgIGkgPSBzdHJ0b2woc3pDb2xvcis0LCBOVUxMLCAxMCk7CisgICAgICAgICpuUmVkICAgPSAoQllURSkoMjU1LjAvMTAwLjAgKiBpKTsKKyAgICAgICAgKm5HcmVlbiA9ICpuUmVkOworICAgICAgICAqbkJsdWUgID0gKm5SZWQ7CisKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgICAgLy8gbm90IGZvdW5kIGF0IGFsbAorICAgICpuUmVkICAgPSAwOworICAgICpuR3JlZW4gPSAwOworICAgICpuQmx1ZSAgPSAwOworCisgICAgcmV0dXJuIEZBTFNFOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBTVkcgQ29sb3IgbmFtZSBsb29rdXAKKworLyoqCisgVGhlc2UgYXJlIHRoZSBjb2xvcnMgZGVmaW5lZCBpbiB0aGUgU1ZHIHN0YW5kYXJkIChJIGhhdmVuJ3QgY2hlY2tlZAorIHRoZSBmaW5hbCByZWNvbW1lbmRhdGlvbiBmb3IgY2hhbmdlcykKKyovCitzdGF0aWMgTmFtZWRDb2xvciBTVkdDb2xvck1hcFtdID0geworCXsgImFsaWNlYmx1ZSIsICAgICAgICAgICAgICAgICAgMjQwLCAyNDgsIDI1NSB9LAorCXsgImFudGlxdWV3aGl0ZSIsICAgICAgICAgICAgICAgMjUwLCAyMzUsIDIxNSB9LAorCXsgImFxdWEiLCAgICAgICAgICAgICAgICAgICAgICAgICAwLCAyNTUsIDI1NSB9LAorCXsgImFxdWFtYXJpbmUiLCAgICAgICAgICAgICAgICAgMTI3LCAyNTUsIDIxMiB9LAorCXsgImF6dXJlIiwgICAgICAgICAgICAgICAgICAgICAgMjQwLCAyNTUsIDI1NSB9LAorCXsgImJlaWdlIiwgICAgICAgICAgICAgICAgICAgICAgMjQ1LCAyNDUsIDIyMCB9LAorCXsgImJpc3F1ZSIsICAgICAgICAgICAgICAgICAgICAgMjU1LCAyMjgsIDE5NiB9LAorCXsgImJsYWNrIiwgICAgICAgICAgICAgICAgICAgICAgICAwLCAgIDAsICAgMCB9LAorCXsgImJsYW5jaGVkYWxtb25kIiwgICAgICAgICAgICAgMjU1LCAyMzUsIDIwNSB9LAorCXsgImJsdWUiLCAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgIDAsIDI1NSB9LAorCXsgImJsdWV2aW9sZXQiLCAgICAgICAgICAgICAgICAgMTM4LCAgNDMsIDIyNiB9LAorCXsgImJyb3duIiwgICAgICAgICAgICAgICAgICAgICAgMTY1LCAgNDIsICA0MiB9LAorCXsgImJ1cmx5d29vZCIsICAgICAgICAgICAgICAgICAgMjIyLCAxODQsIDEzNSB9LAorCXsgImNhZGV0Ymx1ZSIsICAgICAgICAgICAgICAgICAgIDk1LCAxNTgsIDE2MCB9LAorCXsgImNoYXJ0cmV1c2UiLCAgICAgICAgICAgICAgICAgMTI3LCAyNTUsICAgMCB9LAorCXsgImNob2NvbGF0ZSIsICAgICAgICAgICAgICAgICAgMjEwLCAxMDUsICAzMCB9LAorCXsgImNvcmFsIiwgICAgICAgICAgICAgICAgICAgICAgMjU1LCAxMjcsICA4MCB9LAorCXsgImNvcm5mbG93ZXJibHVlIiwgICAgICAgICAgICAgMTAwLCAxNDksIDIzNyB9LAorCXsgImNvcm5zaWxrIiwgICAgICAgICAgICAgICAgICAgMjU1LCAyNDgsIDIyMCB9LAorCXsgImNyaW1zb24iLCAgICAgICAgICAgICAgICAgICAgMjIwLCAgMjAsICA2MCB9LAorCXsgImN5YW4iLCAgICAgICAgICAgICAgICAgICAgICAgICAwLCAyNTUsIDI1NSB9LAorCXsgImRhcmtibHVlIiwgICAgICAgICAgICAgICAgICAgICAwLCAgIDAsIDEzOSB9LAorCXsgImRhcmtjeWFuIiwgICAgICAgICAgICAgICAgICAgICAwLCAxMzksIDEzOSB9LAorCXsgImRhcmtnb2xkZW5yb2QiLCAgICAgICAgICAgICAgMTg0LCAxMzQsICAxMSB9LAorCXsgImRhcmtncmF5IiwgICAgICAgICAgICAgICAgICAgMTY5LCAxNjksIDE2OSB9LAorCXsgImRhcmtncmVlbiIsICAgICAgICAgICAgICAgICAgICAwLCAxMDAsICAgMCB9LAorCXsgImRhcmtncmV5IiwgICAgICAgICAgICAgICAgICAgMTY5LCAxNjksIDE2OSB9LAorCXsgImRhcmtraGFraSIsICAgICAgICAgICAgICAgICAgMTg5LCAxODMsIDEwNyB9LAorCXsgImRhcmttYWdlbnRhIiwgICAgICAgICAgICAgICAgMTM5LCAgIDAsIDEzOSB9LAorCXsgImRhcmtvbGl2ZWdyZWVuIiwgICAgICAgICAgICAgIDg1LCAxMDcsICA0NyB9LAorCXsgImRhcmtvcmFuZ2UiLCAgICAgICAgICAgICAgICAgMjU1LCAxNDAsICAgMCB9LAorCXsgImRhcmtvcmNoaWQiLCAgICAgICAgICAgICAgICAgMTUzLCAgNTAsIDIwNCB9LAorCXsgImRhcmtyZWQiLCAgICAgICAgICAgICAgICAgICAgMTM5LCAgIDAsICAgMCB9LAorCXsgImRhcmtzYWxtb24iLCAgICAgICAgICAgICAgICAgMjMzLCAxNTAsIDEyMiB9LAorCXsgImRhcmtzZWFncmVlbiIsICAgICAgICAgICAgICAgMTQzLCAxODgsIDE0MyB9LAorCXsgImRhcmtzbGF0ZWJsdWUiLCAgICAgICAgICAgICAgIDcyLCAgNjEsIDEzOSB9LAorCXsgImRhcmtzbGF0ZWdyYXkiLCAgICAgICAgICAgICAgIDQ3LCAgNzksICA3OSB9LAorCXsgImRhcmtzbGF0ZWdyZXkiLCAgICAgICAgICAgICAgIDQ3LCAgNzksICA3OSB9LAorCXsgImRhcmt0dXJxdW9pc2UiLCAgICAgICAgICAgICAgICAwLCAyMDYsIDIwOSB9LAorCXsgImRhcmt2aW9sZXQiLCAgICAgICAgICAgICAgICAgMTQ4LCAgIDAsIDIxMSB9LAorCXsgImRlZXBwaW5rIiwgICAgICAgICAgICAgICAgICAgMjU1LCAgMjAsIDE0NyB9LAorCXsgImRlZXBza3libHVlIiwgICAgICAgICAgICAgICAgICAwLCAxOTEsIDI1NSB9LAorCXsgImRpbWdyYXkiLCAgICAgICAgICAgICAgICAgICAgMTA1LCAxMDUsIDEwNSB9LAorCXsgImRpbWdyZXkiLCAgICAgICAgICAgICAgICAgICAgMTA1LCAxMDUsIDEwNSB9LAorCXsgImRvZGdlcmJsdWUiLCAgICAgICAgICAgICAgICAgIDMwLCAxNDQsIDI1NSB9LAorCXsgImZpcmVicmljayIsICAgICAgICAgICAgICAgICAgMTc4LCAgMzQsICAzNCB9LAorCXsgImZsb3JhbHdoaXRlIiwgICAgICAgICAgICAgICAgMjU1LCAyNTAsIDI0MCB9LAorCXsgImZvcmVzdGdyZWVuIiwgICAgICAgICAgICAgICAgIDM0LCAxMzksICAzNCB9LAorCXsgImZ1Y2hzaWEiLCAgICAgICAgICAgICAgICAgICAgMjU1LCAgIDAsIDI1NSB9LAorCXsgImdhaW5zYm9ybyIsICAgICAgICAgICAgICAgICAgMjIwLCAyMjAsIDIyMCB9LAorCXsgImdob3N0d2hpdGUiLCAgICAgICAgICAgICAgICAgMjQ4LCAyNDgsIDI1NSB9LAorCXsgImdvbGQiLCAgICAgICAgICAgICAgICAgICAgICAgMjU1LCAyMTUsICAgMCB9LAorCXsgImdvbGRlbnJvZCIsICAgICAgICAgICAgICAgICAgMjE4LCAxNjUsICAzMiB9LAorCXsgImdyYXkiLCAgICAgICAgICAgICAgICAgICAgICAgMTI4LCAxMjgsIDEyOCB9LAorCXsgImdyZWVuIiwgICAgICAgICAgICAgICAgICAgICAgICAwLCAxMjgsICAgMCB9LAorCXsgImdyZWVueWVsbG93IiwgICAgICAgICAgICAgICAgMTczLCAyNTUsICA0NyB9LAorCXsgImdyZXkiLCAgICAgICAgICAgICAgICAgICAgICAgMTI4LCAxMjgsIDEyOCB9LAorCXsgImhvbmV5ZGV3IiwgICAgICAgICAgICAgICAgICAgMjQwLCAyNTUsIDI0MCB9LAorCXsgImhvdHBpbmsiLCAgICAgICAgICAgICAgICAgICAgMjU1LCAxMDUsIDE4MCB9LAorCXsgImluZGlhbnJlZCIsICAgICAgICAgICAgICAgICAgMjA1LCAgOTIsICA5MiB9LAorCXsgImluZGlnbyIsICAgICAgICAgICAgICAgICAgICAgIDc1LCAgIDAsIDEzMCB9LAorCXsgIml2b3J5IiwgICAgICAgICAgICAgICAgICAgICAgMjU1LCAyNTUsIDI0MCB9LAorCXsgImtoYWtpIiwgICAgICAgICAgICAgICAgICAgICAgMjQwLCAyMzAsIDE0MCB9LAorCXsgImxhdmVuZGVyIiwgICAgICAgICAgICAgICAgICAgMjMwLCAyMzAsIDI1MCB9LAorCXsgImxhdmVuZGVyYmx1c2giLCAgICAgICAgICAgICAgMjU1LCAyNDAsIDI0NSB9LAorCXsgImxhd25ncmVlbiIsICAgICAgICAgICAgICAgICAgMTI0LCAyNTIsICAgMCB9LAorCXsgImxlbW9uY2hpZmZvbiIsICAgICAgICAgICAgICAgMjU1LCAyNTAsIDIwNSB9LAorCXsgImxpZ2h0Ymx1ZSIsICAgICAgICAgICAgICAgICAgMTczLCAyMTYsIDIzMCB9LAorCXsgImxpZ2h0Y29yYWwiLCAgICAgICAgICAgICAgICAgMjQwLCAxMjgsIDEyOCB9LAorCXsgImxpZ2h0Y3lhbiIsICAgICAgICAgICAgICAgICAgMjI0LCAyNTUsIDI1NSB9LAorCXsgImxpZ2h0Z29sZGVucm9keWVsbG93IiwgICAgICAgMjUwLCAyNTAsIDIxMCB9LAorCXsgImxpZ2h0Z3JheSIsICAgICAgICAgICAgICAgICAgMjExLCAyMTEsIDIxMSB9LAorCXsgImxpZ2h0Z3JlZW4iLCAgICAgICAgICAgICAgICAgMTQ0LCAyMzgsIDE0NCB9LAorCXsgImxpZ2h0Z3JleSIsICAgICAgICAgICAgICAgICAgMjExLCAyMTEsIDIxMSB9LAorCXsgImxpZ2h0cGluayIsICAgICAgICAgICAgICAgICAgMjU1LCAxODIsIDE5MyB9LAorCXsgImxpZ2h0c2FsbW9uIiwgICAgICAgICAgICAgICAgMjU1LCAxNjAsIDEyMiB9LAorCXsgImxpZ2h0c2VhZ3JlZW4iLCAgICAgICAgICAgICAgIDMyLCAxNzgsIDE3MCB9LAorCXsgImxpZ2h0c2t5Ymx1ZSIsICAgICAgICAgICAgICAgMTM1LCAyMDYsIDI1MCB9LAorCXsgImxpZ2h0c2xhdGVncmF5IiwgICAgICAgICAgICAgMTE5LCAxMzYsIDE1MyB9LAorCXsgImxpZ2h0c2xhdGVncmV5IiwgICAgICAgICAgICAgMTE5LCAxMzYsIDE1MyB9LAorCXsgImxpZ2h0c3RlZWxibHVlIiwgICAgICAgICAgICAgMTc2LCAxOTYsIDIyMiB9LAorCXsgImxpZ2h0eWVsbG93IiwgICAgICAgICAgICAgICAgMjU1LCAyNTUsIDIyNCB9LAorCXsgImxpbWUiLCAgICAgICAgICAgICAgICAgICAgICAgICAwLCAyNTUsICAgMCB9LAorCXsgImxpbWVncmVlbiIsICAgICAgICAgICAgICAgICAgIDUwLCAyMDUsICA1MCB9LAorCXsgImxpbmVuIiwgICAgICAgICAgICAgICAgICAgICAgMjUwLCAyNDAsIDIzMCB9LAorCXsgIm1hZ2VudGEiLCAgICAgICAgICAgICAgICAgICAgMjU1LCAgIDAsIDI1NSB9LAorCXsgIm1hcm9vbiIsICAgICAgICAgICAgICAgICAgICAgMTI4LCAgIDAsICAgMCB9LAorCXsgIm1lZGl1bWFxdWFtYXJpbmUiLCAgICAgICAgICAgMTAyLCAyMDUsIDE3MCB9LAorCXsgIm1lZGl1bWJsdWUiLCAgICAgICAgICAgICAgICAgICAwLCAgIDAsIDIwNSB9LAorCXsgIm1lZGl1bW9yY2hpZCIsICAgICAgICAgICAgICAgMTg2LCAgODUsIDIxMSB9LAorCXsgIm1lZGl1bXB1cnBsZSIsICAgICAgICAgICAgICAgMTQ3LCAxMTIsIDIxOSB9LAorCXsgIm1lZGl1bXNlYWdyZWVuIiwgICAgICAgICAgICAgIDYwLCAxNzksIDExMyB9LAorCXsgIm1lZGl1bXNsYXRlYmx1ZSIsICAgICAgICAgICAgMTIzLCAxMDQsIDIzOCB9LAorCXsgIm1lZGl1bXNwcmluZ2dyZWVuIiwgICAgICAgICAgICAwLCAyNTAsIDE1NCB9LAorCXsgIm1lZGl1bXR1cnF1b2lzZSIsICAgICAgICAgICAgIDcyLCAyMDksIDIwNCB9LAorCXsgIm1lZGl1bXZpb2xldHJlZCIsICAgICAgICAgICAgMTk5LCAgMjEsIDEzMyB9LAorCXsgIm1pZG5pZ2h0Ymx1ZSIsICAgICAgICAgICAgICAgIDI1LCAgMjUsIDExMiB9LAorCXsgIm1pbnRjcmVhbSIsICAgICAgICAgICAgICAgICAgMjQ1LCAyNTUsIDI1MCB9LAorCXsgIm1pc3R5cm9zZSIsICAgICAgICAgICAgICAgICAgMjU1LCAyMjgsIDIyNSB9LAorCXsgIm1vY2Nhc2luIiwgICAgICAgICAgICAgICAgICAgMjU1LCAyMjgsIDE4MSB9LAorCXsgIm5hdmFqb3doaXRlIiwgICAgICAgICAgICAgICAgMjU1LCAyMjIsIDE3MyB9LAorCXsgIm5hdnkiLCAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgIDAsIDEyOCB9LAorCXsgIm9sZGxhY2UiLCAgICAgICAgICAgICAgICAgICAgMjUzLCAyNDUsIDIzMCB9LAorCXsgIm9saXZlIiwgICAgICAgICAgICAgICAgICAgICAgMTI4LCAxMjgsICAgMCB9LAorCXsgIm9saXZlZHJhYiIsICAgICAgICAgICAgICAgICAgMTA3LCAxNDIsICAzNSB9LAorCXsgIm9yYW5nZSIsICAgICAgICAgICAgICAgICAgICAgMjU1LCAxNjUsICAgMCB9LAorCXsgIm9yYW5nZXJlZCIsICAgICAgICAgICAgICAgICAgMjU1LCAgNjksICAgMCB9LAorCXsgIm9yY2hpZCIsICAgICAgICAgICAgICAgICAgICAgMjE4LCAxMTIsIDIxNCB9LAorCXsgInBhbGVnb2xkZW5yb2QiLCAgICAgICAgICAgICAgMjM4LCAyMzIsIDE3MCB9LAorCXsgInBhbGVncmVlbiIsICAgICAgICAgICAgICAgICAgMTUyLCAyNTEsIDE1MiB9LAorCXsgInBhbGV0dXJxdW9pc2UiLCAgICAgICAgICAgICAgMTc1LCAyMzgsIDIzOCB9LAorCXsgInBhbGV2aW9sZXRyZWQiLCAgICAgICAgICAgICAgMjE5LCAxMTIsIDE0NyB9LAorCXsgInBhcGF5YXdoaXAiLCAgICAgICAgICAgICAgICAgMjU1LCAyMzksIDIxMyB9LAorCXsgInBlYWNocHVmZiIsICAgICAgICAgICAgICAgICAgMjU1LCAyMTgsIDE4NSB9LAorCXsgInBlcnUiLCAgICAgICAgICAgICAgICAgICAgICAgMjA1LCAxMzMsICA2MyB9LAorCXsgInBpbmsiLCAgICAgICAgICAgICAgICAgICAgICAgMjU1LCAxOTIsIDIwMyB9LAorCXsgInBsdW0iLCAgICAgICAgICAgICAgICAgICAgICAgMjIxLCAxNjAsIDIyMSB9LAorCXsgInBvd2RlcmJsdWUiLCAgICAgICAgICAgICAgICAgMTc2LCAyMjQsIDIzMCB9LAorCXsgInB1cnBsZSIsICAgICAgICAgICAgICAgICAgICAgMTI4LCAgIDAsIDEyOCB9LAorCXsgInJlZCIsICAgICAgICAgICAgICAgICAgICAgICAgMjU1LCAgIDAsICAgMCB9LAorCXsgInJvc3licm93biIsICAgICAgICAgICAgICAgICAgMTg4LCAxNDMsIDE0MyB9LAorCXsgInJveWFsYmx1ZSIsICAgICAgICAgICAgICAgICAgIDY1LCAxMDUsIDIyNSB9LAorCXsgInNhZGRsZWJyb3duIiwgICAgICAgICAgICAgICAgMTM5LCAgNjksICAxOSB9LAorCXsgInNhbG1vbiIsICAgICAgICAgICAgICAgICAgICAgMjUwLCAxMjgsIDExNCB9LAorCXsgInNhbmR5YnJvd24iLCAgICAgICAgICAgICAgICAgMjQ0LCAxNjQsICA5NiB9LAorCXsgInNlYWdyZWVuIiwgICAgICAgICAgICAgICAgICAgIDQ2LCAxMzksICA4NyB9LAorCXsgInNlYXNoZWxsIiwgICAgICAgICAgICAgICAgICAgMjU1LCAyNDUsIDIzOCB9LAorCXsgInNpZW5uYSIsICAgICAgICAgICAgICAgICAgICAgMTYwLCAgODIsICA0NSB9LAorCXsgInNpbHZlciIsICAgICAgICAgICAgICAgICAgICAgMTkyLCAxOTIsIDE5MiB9LAorCXsgInNreWJsdWUiLCAgICAgICAgICAgICAgICAgICAgMTM1LCAyMDYsIDIzNSB9LAorCXsgInNsYXRlYmx1ZSIsICAgICAgICAgICAgICAgICAgMTA2LCAgOTAsIDIwNSB9LAorCXsgInNsYXRlZ3JheSIsICAgICAgICAgICAgICAgICAgMTEyLCAxMjgsIDE0NCB9LAorCXsgInNsYXRlZ3JleSIsICAgICAgICAgICAgICAgICAgMTEyLCAxMjgsIDE0NCB9LAorCXsgInNub3ciLCAgICAgICAgICAgICAgICAgICAgICAgMjU1LCAyNTAsIDI1MCB9LAorCXsgInNwcmluZ2dyZWVuIiwgICAgICAgICAgICAgICAgICAwLCAyNTUsIDEyNyB9LAorCXsgInN0ZWVsYmx1ZSIsICAgICAgICAgICAgICAgICAgIDcwLCAxMzAsIDE4MCB9LAorCXsgInRhbiIsICAgICAgICAgICAgICAgICAgICAgICAgMjEwLCAxODAsIDE0MCB9LAorCXsgInRlYWwiLCAgICAgICAgICAgICAgICAgICAgICAgICAwLCAxMjgsIDEyOCB9LAorCXsgInRoaXN0bGUiLCAgICAgICAgICAgICAgICAgICAgMjE2LCAxOTEsIDIxNiB9LAorCXsgInRvbWF0byIsICAgICAgICAgICAgICAgICAgICAgMjU1LCAgOTksICA3MSB9LAorCXsgInR1cnF1b2lzZSIsICAgICAgICAgICAgICAgICAgIDY0LCAyMjQsIDIwOCB9LAorCXsgInZpb2xldCIsICAgICAgICAgICAgICAgICAgICAgMjM4LCAxMzAsIDIzOCB9LAorCXsgIndoZWF0IiwgICAgICAgICAgICAgICAgICAgICAgMjQ1LCAyMjIsIDE3OSB9LAorCXsgIndoaXRlIiwgICAgICAgICAgICAgICAgICAgICAgMjU1LCAyNTUsIDI1NSB9LAorCXsgIndoaXRlc21va2UiLCAgICAgICAgICAgICAgICAgMjQ1LCAyNDUsIDI0NSB9LAorCXsgInllbGxvdyIsICAgICAgICAgICAgICAgICAgICAgMjU1LCAyNTUsICAgMCB9LAorCXsgInllbGxvd2dyZWVuIiwgICAgICAgICAgICAgICAgMTU0LCAyMDUsICA1MCB9Cit9OworCisKK0JPT0wgRExMX0NBTExDT05WCitGcmVlSW1hZ2VfTG9va3VwU1ZHQ29sb3IoY29uc3QgY2hhciAqc3pDb2xvciwgQllURSAqblJlZCwgQllURSAqbkdyZWVuLCBCWVRFICpuQmx1ZSkgeworICAgIGludCBpOworCisgICAgLy8gbG9va3VwIGNvbG9yCisgICAgaSA9IEZyZWVJbWFnZV9Mb29rdXBOYW1lZENvbG9yKHN6Q29sb3IsIFNWR0NvbG9yTWFwLCBzaXplb2YoU1ZHQ29sb3JNYXApL3NpemVvZihTVkdDb2xvck1hcFswXSkpOworICAgIGlmIChpID49IDApIHsKKyAgICAgICAgKm5SZWQgICA9IFNWR0NvbG9yTWFwW2ldLnI7CisgICAgICAgICpuR3JlZW4gPSBTVkdDb2xvck1hcFtpXS5nOworICAgICAgICAqbkJsdWUgID0gU1ZHQ29sb3JNYXBbaV0uYjsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgICAgLy8gbm90IGZvdW5kLCB0cnkgZm9yIGdyZXkgY29sb3Igd2l0aCBhdHRhY2hlZCBwZXJjZW50IHZhbHVlCisgICAgaWYgKCAoc3pDb2xvclswXSA9PSAnZycgfHwgc3pDb2xvclswXSA9PSAnRycpICYmCisgICAgICAgICAoc3pDb2xvclsxXSA9PSAncicgfHwgc3pDb2xvclsxXSA9PSAnUicpICYmCisgICAgICAgICAoc3pDb2xvclsyXSA9PSAnZScgfHwgc3pDb2xvclsyXSA9PSAnRScgfHwgc3pDb2xvclsyXSA9PSAnYScgfHwgc3pDb2xvclsyXSA9PSAnQScgKSAmJgorICAgICAgICAgKHN6Q29sb3JbM10gPT0gJ3knIHx8IHN6Q29sb3JbM10gPT0gJ1knICkgKSAgeworCisgICAgICAgIC8vIGdyZXk8bnVtPiwgb3IgZ3JheTxudW0+LCBudW0gMS4uLjEwMAorICAgICAgICBpID0gc3RydG9sKHN6Q29sb3IrNCwgTlVMTCwgMTApOworICAgICAgICAqblJlZCAgID0gKEJZVEUpKDI1NS4wLzEwMC4wICogaSk7CisgICAgICAgICpuR3JlZW4gPSAqblJlZDsKKyAgICAgICAgKm5CbHVlICA9ICpuUmVkOworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgICAvLyBub3QgZm91bmQgYXQgYWxsCisgICAgKm5SZWQgICA9IDA7CisgICAgKm5HcmVlbiA9IDA7CisgICAgKm5CbHVlICA9IDA7CisKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvQ29udmVyc2lvbi5jcHAgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL0NvbnZlcnNpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNTA1N2EKLS0tIC9kZXYvbnVsbAorKysgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL0NvbnZlcnNpb24uY3BwCkBAIC0wLDAgKzEsNTUxIEBACisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBCaXRtYXAgY29udmVyc2lvbiByb3V0aW5lcworLy8KKy8vIERlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gYnkKKy8vIC0gRmxvcmlzIHZhbiBkZW4gQmVyZyAoZmx2ZGJlcmdAd3hzLm5sKQorLy8gLSBIZXJ2w6kgRHJvbG9uIChkcm9sb25AaW5mb25pZS5mcikKKy8vIC0gSmFuaSBLYWphbGEgKGphbmlrQHJlbWVkeS5maSkKKy8vIC0gTWloYWlsIE5heWRlbm92IChtbmF5ZGVub3ZAdXNlcnMuc291cmNlZm9yZ2UubmV0KQorLy8gLSBDYXJzdGVuIEtsZWluIChja2xlaW4wNUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQpCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRnJlZUltYWdlIDMKKy8vCisvLyBDT1ZFUkVEIENPREUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkKKy8vIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTCisvLyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy8vIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVECisvLyBDT0RFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UCisvLyBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWQorLy8gU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTAorLy8gUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUgorLy8gVEhJUyBESVNDTEFJTUVSLgorLy8KKy8vIFVzZSBhdCB5b3VyIG93biByaXNrIQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaW5jbHVkZSAiRnJlZUltYWdlLmgiCisjaW5jbHVkZSAiVXRpbGl0aWVzLmgiCisjaW5jbHVkZSAiUXVhbnRpemVycy5oIgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgQ09OVkVSVChmcm9tLCB0bykgY2FzZSB0byA6IEZyZWVJbWFnZV9Db252ZXJ0TGluZSMjZnJvbSMjVG8jI3RvKGJpdHMsIHNjYW5saW5lLCBGcmVlSW1hZ2VfR2V0V2lkdGgoZGliKSk7IGJyZWFrOworI2RlZmluZSBDT05WRVJUV0lUSFBBTEVUVEUoZnJvbSwgdG8pIGNhc2UgdG8gOiBGcmVlSW1hZ2VfQ29udmVydExpbmUjI2Zyb20jI1RvIyN0byhiaXRzLCBzY2FubGluZSwgRnJlZUltYWdlX0dldFdpZHRoKGRpYiksIEZyZWVJbWFnZV9HZXRQYWxldHRlKGRpYikpOyBicmVhazsKKworI2RlZmluZSBDT05WRVJUVE8xNihmcm9tKSBcCisJY2FzZSAxNiA6IFwKKwkJaWYgKChyZWRfbWFzayA9PSBGSTE2XzU1NV9SRURfTUFTSykgJiYgKGdyZWVuX21hc2sgPT0gRkkxNl81NTVfR1JFRU5fTUFTSykgJiYgKGJsdWVfbWFzayA9PSBGSTE2XzU1NV9CTFVFX01BU0spKSB7IFwKKwkJCUZyZWVJbWFnZV9Db252ZXJ0TGluZSMjZnJvbSMjVG8xNl81NTUoYml0cywgc2NhbmxpbmUsIEZyZWVJbWFnZV9HZXRXaWR0aChkaWIpKTsgXAorCQl9IGVsc2UgeyBcCisJCQlGcmVlSW1hZ2VfQ29udmVydExpbmUjI2Zyb20jI1RvMTZfNTY1KGJpdHMsIHNjYW5saW5lLCBGcmVlSW1hZ2VfR2V0V2lkdGgoZGliKSk7IFwKKwkJfSBcCisJCWJyZWFrOworCisjZGVmaW5lIENPTlZFUlRUTzE2V0lUSFBBTEVUVEUoZnJvbSkgXAorCWNhc2UgMTYgOiBcCisJCWlmICgocmVkX21hc2sgPT0gRkkxNl81NTVfUkVEX01BU0spICYmIChncmVlbl9tYXNrID09IEZJMTZfNTU1X0dSRUVOX01BU0spICYmIChibHVlX21hc2sgPT0gRkkxNl81NTVfQkxVRV9NQVNLKSkgeyBcCisJCQlGcmVlSW1hZ2VfQ29udmVydExpbmUjI2Zyb20jI1RvMTZfNTU1KGJpdHMsIHNjYW5saW5lLCBGcmVlSW1hZ2VfR2V0V2lkdGgoZGliKSwgRnJlZUltYWdlX0dldFBhbGV0dGUoZGliKSk7IFwKKwkJfSBlbHNlIHsgXAorCQkJRnJlZUltYWdlX0NvbnZlcnRMaW5lIyNmcm9tIyNUbzE2XzU2NShiaXRzLCBzY2FubGluZSwgRnJlZUltYWdlX0dldFdpZHRoKGRpYiksIEZyZWVJbWFnZV9HZXRQYWxldHRlKGRpYikpOyBcCisJCX0gXAorCQlicmVhazsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gVXRpbGl0eSBmdW5jdGlvbnMgZGVjbGFyZWQgaW4gVXRpbGl0aWVzLmgKKworQk9PTCBTd2FwUmVkQmx1ZTMyKEZJQklUTUFQKiBkaWIpIHsKKwlpZihGcmVlSW1hZ2VfR2V0SW1hZ2VUeXBlKGRpYikgIT0gRklUX0JJVE1BUCkgeworCQlyZXR1cm4gRkFMU0U7CisJfQorCQkKKwljb25zdCB1bnNpZ25lZCBieXRlc3BlcnBpeGVsID0gRnJlZUltYWdlX0dldEJQUChkaWIpIC8gODsKKwlpZihieXRlc3BlcnBpeGVsID4gNCB8fCBieXRlc3BlcnBpeGVsIDwgMykgeworCQlyZXR1cm4gRkFMU0U7CisJfQorCQkKKwljb25zdCB1bnNpZ25lZCBoZWlnaHQgPSBGcmVlSW1hZ2VfR2V0SGVpZ2h0KGRpYik7CisJY29uc3QgdW5zaWduZWQgcGl0Y2ggPSBGcmVlSW1hZ2VfR2V0UGl0Y2goZGliKTsKKwljb25zdCB1bnNpZ25lZCBsaW5lU2l6ZSA9IEZyZWVJbWFnZV9HZXRMaW5lKGRpYik7CisJCisJQllURSogbGluZSA9IEZyZWVJbWFnZV9HZXRCaXRzKGRpYik7CisJZm9yKHVuc2lnbmVkIHkgPSAwOyB5IDwgaGVpZ2h0OyArK3ksIGxpbmUgKz0gcGl0Y2gpIHsKKwkJZm9yKEJZVEUqIHBpeGVsID0gbGluZTsgcGl4ZWwgPCBsaW5lICsgbGluZVNpemUgOyBwaXhlbCArPSBieXRlc3BlcnBpeGVsKSB7CisJCQlJTlBMQUNFU1dBUChwaXhlbFswXSwgcGl4ZWxbMl0pOworCQl9CisJfQorCQorCXJldHVybiBUUlVFOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBpbmxpbmUgdm9pZCAKK2Fzc2lnblJHQihXT1JEIHIsIFdPUkQgZywgV09SRCBiLCBXT1JEKiBvdXQpIHsKKwlvdXRbMF0gPSByOworCW91dFsxXSA9IGc7CisJb3V0WzJdID0gYjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIAorYXNzaWduUkdCKEJZVEUgciwgQllURSBnLCBCWVRFIGIsIEJZVEUqIG91dCkgeworCW91dFtGSV9SR0JBX1JFRF0JPSByOworCW91dFtGSV9SR0JBX0dSRUVOXQk9IGc7CisJb3V0W0ZJX1JHQkFfQkxVRV0JPSBiOworfQorCisvKioKK0NNWUsgLT4gQ01ZIC0+IFJHQiBjb252ZXJzaW9uIGZyb20gaHR0cDovL3d3dy5lYXN5cmdiLmNvbS8KKworQ01ZSyB0byBDTVkgWzAtMV06IEMsTSxZICogKDEgLSBLKSArIEsKK0NNWSB0byBSR0IgWzAtMV06ICgxIC0gQyxNLFkpCisKKz0+IFIsRyxCID0gKDEgLSBDLE0sWSkgKiAoMSAtIEspCittYXBwZWQgdG8gWzAtTUFYX1ZBTF06IAorKE1BWF9WQUwgLSBDLE0sWSkgKiAoTUFYX1ZBTCAtIEspIC8gTUFYX1ZBTAorKi8KK3RlbXBsYXRlIDxjbGFzcyBUPgorc3RhdGljIGlubGluZSB2b2lkIAorQ01ZS1RvUkdCKFQgQywgVCBNLCBUIFksIFQgSywgVCogb3V0KSB7CisJdW5zaWduZWQgbWF4X3ZhbCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8VD46Om1heCgpOworCQorCXVuc2lnbmVkIHIgPSAobWF4X3ZhbCAtIEMpICogKG1heF92YWwgLSBLKSAvIG1heF92YWw7CisJdW5zaWduZWQgZyA9IChtYXhfdmFsIC0gTSkgKiAobWF4X3ZhbCAtIEspIC8gbWF4X3ZhbDsKKwl1bnNpZ25lZCBiID0gKG1heF92YWwgLSBZKSAqIChtYXhfdmFsIC0gSykgLyBtYXhfdmFsOworCisJLy8gY2xhbXAgdmFsdWVzIHRvIFswLi5tYXhfdmFsXQorCVQgcmVkCT0gKFQpQ0xBTVAociwgKHVuc2lnbmVkKTAsIG1heF92YWwpOworCVQgZ3JlZW4JPSAoVClDTEFNUChnLCAodW5zaWduZWQpMCwgbWF4X3ZhbCk7CisJVCBibHVlCT0gKFQpQ0xBTVAoYiwgKHVuc2lnbmVkKTAsIG1heF92YWwpOworCisJYXNzaWduUkdCKHJlZCwgZ3JlZW4sIGJsdWUsIG91dCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorc3RhdGljIHZvaWQgCitfY29udmVydENNWUt0b1JHQkEodW5zaWduZWQgd2lkdGgsIHVuc2lnbmVkIGhlaWdodCwgQllURSogbGluZV9zdGFydCwgdW5zaWduZWQgcGl0Y2gsIHVuc2lnbmVkIHNhbXBsZXNwZXJwaXhlbCkgeworCWNvbnN0IEJPT0wgaGFzQmxhY2sgPSAoc2FtcGxlc3BlcnBpeGVsID4gMykgPyBUUlVFIDogRkFMU0U7CisJY29uc3QgVCBNQVhfVkFMID0gc3RkOjpudW1lcmljX2xpbWl0czxUPjo6bWF4KCk7CisJCQorCVQgSyA9IDA7CisJZm9yKHVuc2lnbmVkIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJVCAqbGluZSA9IChUKilsaW5lX3N0YXJ0OworCisJCWZvcih1bnNpZ25lZCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCWlmKGhhc0JsYWNrKSB7CisJCQkJSyA9IGxpbmVbRklfUkdCQV9BTFBIQV07CQkJCisJCQkJbGluZVtGSV9SR0JBX0FMUEhBXSA9IE1BWF9WQUw7IC8vIFRPRE8gd3JpdGUgdGhlIGZpcnN0IGV4dHJhIGNoYW5uZWwgYXMgYWxwaGEhCisJCQl9CQkJCisJCQkKKwkJCUNNWUtUb1JHQjxUPihsaW5lWzBdLCBsaW5lWzFdLCBsaW5lWzJdLCBLLCBsaW5lKTsKKwkJCQorCQkJbGluZSArPSBzYW1wbGVzcGVycGl4ZWw7CisJCX0KKwkJbGluZV9zdGFydCArPSBwaXRjaDsKKwl9Cit9CisKK0JPT0wgCitDb252ZXJ0Q01ZS3RvUkdCQShGSUJJVE1BUCogZGliKSB7CisJaWYoIUZyZWVJbWFnZV9IYXNQaXhlbHMoZGliKSkgeworCQlyZXR1cm4gRkFMU0U7CisJfQorCQkKKwljb25zdCBGUkVFX0lNQUdFX1RZUEUgaW1hZ2VfdHlwZSA9IEZyZWVJbWFnZV9HZXRJbWFnZVR5cGUoZGliKTsKKwljb25zdCB1bnNpZ25lZCBieXRlc3BlcnBpeGVsID0gRnJlZUltYWdlX0dldEJQUChkaWIpLzg7CisJCisJdW5zaWduZWQgY2hhbm5lbFNpemUgPSAxOworCWlmIChpbWFnZV90eXBlID09IEZJVF9SR0JBMTYgfHwgaW1hZ2VfdHlwZSA9PSBGSVRfUkdCMTYpIHsKKwkJY2hhbm5lbFNpemUgPSBzaXplb2YoV09SRCk7CisJfSBlbHNlIGlmICghKGltYWdlX3R5cGUgPT0gRklUX0JJVE1BUCAmJiAoYnl0ZXNwZXJwaXhlbCA+IDIpKSkgeworCQlyZXR1cm4gRkFMU0U7CisJfQorCQkJCQorCWNvbnN0IHVuc2lnbmVkIHdpZHRoID0gRnJlZUltYWdlX0dldFdpZHRoKGRpYik7CisJY29uc3QgdW5zaWduZWQgaGVpZ2h0ID0gRnJlZUltYWdlX0dldEhlaWdodChkaWIpOworCUJZVEUgKmxpbmVfc3RhcnQgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCAwKTsKKwljb25zdCB1bnNpZ25lZCBwaXRjaCA9IEZyZWVJbWFnZV9HZXRQaXRjaChkaWIpOworCQorCXVuc2lnbmVkIHNhbXBsZXNwZXJwaXhlbCA9IEZyZWVJbWFnZV9HZXRMaW5lKGRpYikgLyB3aWR0aCAvIGNoYW5uZWxTaXplOworCisJaWYoY2hhbm5lbFNpemUgPT0gc2l6ZW9mKFdPUkQpKSB7CisJCV9jb252ZXJ0Q01ZS3RvUkdCQTxXT1JEPih3aWR0aCwgaGVpZ2h0LCBsaW5lX3N0YXJ0LCBwaXRjaCwgc2FtcGxlc3BlcnBpeGVsKTsKKwl9IGVsc2UgeworCQlfY29udmVydENNWUt0b1JHQkE8QllURT4od2lkdGgsIGhlaWdodCwgbGluZV9zdGFydCwgcGl0Y2gsIHNhbXBsZXNwZXJwaXhlbCk7CisJfQorCisJcmV0dXJuIFRSVUU7CQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qKgorQ0lFTGFiIC0+IFhZWiBjb252ZXJzaW9uIGZyb20gaHR0cDovL3d3dy5lYXN5cmdiLmNvbS8KKyovCitzdGF0aWMgdm9pZCAKK0NJRUxhYlRvWFlaKGZsb2F0IEwsIGZsb2F0IGEsIGZsb2F0IGIsIGZsb2F0ICpYLCBmbG9hdCAqWSwgZmxvYXQgKlopIHsKKwlmbG9hdCBwb3dfMzsKKwkKKwkvLyBDSUVMYWIgLT4gWFlaIGNvbnZlcnNpb24gCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJZmxvYXQgdmFyX1kgPSAoTCArIDE2LkYgKSAvIDExNi5GOworCWZsb2F0IHZhcl9YID0gYSAvIDUwMC5GICsgdmFyX1k7CisJZmxvYXQgdmFyX1ogPSB2YXJfWSAtIGIgLyAyMDAuRjsKKworCXBvd18zID0gcG93Zih2YXJfWSwgMyk7CisJaWYocG93XzMgPiAwLjAwODg1NkYpIHsKKwkJdmFyX1kgPSBwb3dfMzsKKwl9IGVsc2UgeworCQl2YXJfWSA9ICggdmFyX1kgLSAxNi5GIC8gMTE2LkYgKSAvIDcuNzg3RjsKKwl9CisJcG93XzMgPSBwb3dmKHZhcl9YLCAzKTsKKwlpZihwb3dfMyA+IDAuMDA4ODU2RikgeworCQl2YXJfWCA9IHBvd18zOworCX0gZWxzZSB7CisJCXZhcl9YID0gKCB2YXJfWCAtIDE2LkYgLyAxMTYuRiApIC8gNy43ODdGOworCX0KKwlwb3dfMyA9IHBvd2YodmFyX1osIDMpOworCWlmKHBvd18zID4gMC4wMDg4NTZGKSB7CisJCXZhcl9aID0gcG93XzM7CisJfSBlbHNlIHsKKwkJdmFyX1ogPSAoIHZhcl9aIC0gMTYuRiAvIDExNi5GICkgLyA3Ljc4N0Y7CisJfQorCisJc3RhdGljIGNvbnN0IGZsb2F0IHJlZl9YID0gIDk1LjA0N0Y7CisJc3RhdGljIGNvbnN0IGZsb2F0IHJlZl9ZID0gMTAwLjAwMEY7CisJc3RhdGljIGNvbnN0IGZsb2F0IHJlZl9aID0gMTA4Ljg4M0Y7CisKKwkqWCA9IHJlZl9YICogdmFyX1g7CS8vIHJlZl9YID0gOTUuMDQ3IChPYnNlcnZlcj0gMsKwLCBJbGx1bWluYW50PSBENjUpCisJKlkgPSByZWZfWSAqIHZhcl9ZOwkvLyByZWZfWSA9IDEwMC4wMDAKKwkqWiA9IHJlZl9aICogdmFyX1o7CS8vIHJlZl9aID0gMTA4Ljg4MworfQorCisvKioKK1hZWiAtPiBSR0IgY29udmVyc2lvbiBmcm9tIGh0dHA6Ly93d3cuZWFzeXJnYi5jb20vCisqLworc3RhdGljIHZvaWQgCitYWVpUb1JHQihmbG9hdCBYLCBmbG9hdCBZLCBmbG9hdCBaLCBmbG9hdCAqUiwgZmxvYXQgKkcsIGZsb2F0ICpCKSB7CisJZmxvYXQgdmFyX1ggPSBYIC8gMTAwOyAvLyBYIGZyb20gMCB0byAgOTUuMDQ3IChPYnNlcnZlciA9IDLCsCwgSWxsdW1pbmFudCA9IEQ2NSkKKwlmbG9hdCB2YXJfWSA9IFkgLyAxMDA7IC8vIFkgZnJvbSAwIHRvIDEwMC4wMDAKKwlmbG9hdCB2YXJfWiA9IFogLyAxMDA7IC8vIFogZnJvbSAwIHRvIDEwOC44ODMKKworCWZsb2F0IHZhcl9SID0gdmFyX1ggKiAgMy4yNDA2RiArIHZhcl9ZICogLTEuNTM3MkYgKyB2YXJfWiAqIC0wLjQ5ODZGOworCWZsb2F0IHZhcl9HID0gdmFyX1ggKiAtMC45Njg5RiArIHZhcl9ZICogIDEuODc1OEYgKyB2YXJfWiAqICAwLjA0MTVGOworCWZsb2F0IHZhcl9CID0gdmFyX1ggKiAgMC4wNTU3RiArIHZhcl9ZICogLTAuMjA0MEYgKyB2YXJfWiAqICAxLjA1NzBGOworCisJZmxvYXQgZXhwb25lbnQgPSAxLkYgLyAyLjRGOworCisJaWYodmFyX1IgPiAwLjAwMzEzMDhGKSB7CisJCXZhcl9SID0gMS4wNTVGICogcG93Zih2YXJfUiwgZXhwb25lbnQpIC0gMC4wNTVGOworCX0gZWxzZSB7CisJCXZhcl9SID0gMTIuOTJGICogdmFyX1I7CisJfQorCWlmKHZhcl9HID4gMC4wMDMxMzA4RikgeworCQl2YXJfRyA9IDEuMDU1RiAqIHBvd2YodmFyX0csIGV4cG9uZW50KSAtIDAuMDU1RjsKKwl9IGVsc2UgeworCQl2YXJfRyA9IDEyLjkyRiAqIHZhcl9HOworCX0KKwlpZih2YXJfQiA+IDAuMDAzMTMwOEYpIHsKKwkJdmFyX0IgPSAxLjA1NUYgKiBwb3dmKHZhcl9CLCBleHBvbmVudCkgLSAwLjA1NUY7CisJfSBlbHNlIHsKKwkJdmFyX0IgPSAxMi45MkYgKiB2YXJfQjsKKwl9CisKKwkqUiA9IHZhcl9SOworCSpHID0gdmFyX0c7CisJKkIgPSB2YXJfQjsKK30KKwordGVtcGxhdGU8Y2xhc3MgVD4KK3N0YXRpYyB2b2lkIAorQ0lFTGFiVG9SR0IoZmxvYXQgTCwgZmxvYXQgYSwgZmxvYXQgYiwgVCAqcmdiKSB7CisJZmxvYXQgWCwgWSwgWjsKKwlmbG9hdCBSLCBHLCBCOworCWNvbnN0IGZsb2F0IG1heF92YWwgPSBzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjptYXgoKTsKKworCUNJRUxhYlRvWFlaKEwsIGEsIGIsICZYLCAmWSwgJlopOworCVhZWlRvUkdCKFgsIFksIFosICZSLCAmRywgJkIpOworCQorCS8vIGNsYW1wIHZhbHVlcyB0byBbMC4ubWF4X3ZhbF0KKwlUIHJlZAk9IChUKUNMQU1QKFIgKiBtYXhfdmFsLCAwLjBGLCBtYXhfdmFsKTsKKwlUIGdyZWVuCT0gKFQpQ0xBTVAoRyAqIG1heF92YWwsIDAuMEYsIG1heF92YWwpOworCVQgYmx1ZQk9IChUKUNMQU1QKEIgKiBtYXhfdmFsLCAwLjBGLCBtYXhfdmFsKTsKKworCWFzc2lnblJHQihyZWQsIGdyZWVuLCBibHVlLCByZ2IpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBUPgorc3RhdGljIHZvaWQgCitfY29udmVydExBQnRvUkdCKHVuc2lnbmVkIHdpZHRoLCB1bnNpZ25lZCBoZWlnaHQsIEJZVEUqIGxpbmVfc3RhcnQsIHVuc2lnbmVkIHBpdGNoLCB1bnNpZ25lZCBzYW1wbGVzcGVycGl4ZWwpIHsKKwljb25zdCB1bnNpZ25lZCBtYXhfdmFsID0gc3RkOjpudW1lcmljX2xpbWl0czxUPjo6bWF4KCk7CisJY29uc3QgZmxvYXQgc0wgPSAxMDAuRiAvIG1heF92YWw7CisJY29uc3QgZmxvYXQgc2EgPSAyNTYuRiAvIG1heF92YWw7CisJY29uc3QgZmxvYXQgc2IgPSAyNTYuRiAvIG1heF92YWw7CisJCisJZm9yKHVuc2lnbmVkIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJVCAqbGluZSA9IChUKilsaW5lX3N0YXJ0OworCisJCWZvcih1bnNpZ25lZCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCUNJRUxhYlRvUkdCKGxpbmVbMF0qIHNMLCBsaW5lWzFdKiBzYSAtIDEyOC5GLCBsaW5lWzJdKiBzYiAtIDEyOC5GLCBsaW5lKTsKKwkJCQorCQkJbGluZSArPSBzYW1wbGVzcGVycGl4ZWw7CisJCX0KKwkJbGluZV9zdGFydCArPSBwaXRjaDsKKwl9Cit9CisKK0JPT0wKK0NvbnZlcnRMQUJ0b1JHQihGSUJJVE1BUCogZGliKSB7CisJaWYoIUZyZWVJbWFnZV9IYXNQaXhlbHMoZGliKSkgeworCQlyZXR1cm4gRkFMU0U7CisJfQorCQkKKwljb25zdCBGUkVFX0lNQUdFX1RZUEUgaW1hZ2VfdHlwZSA9IEZyZWVJbWFnZV9HZXRJbWFnZVR5cGUoZGliKTsKKwljb25zdCB1bnNpZ25lZCBieXRlc3BlcnBpeGVsID0gRnJlZUltYWdlX0dldEJQUChkaWIpIC8gODsKKwkKKwl1bnNpZ25lZCBjaGFubmVsU2l6ZSA9IDE7CisJaWYgKGltYWdlX3R5cGUgPT0gRklUX1JHQkExNiB8fCBpbWFnZV90eXBlID09IEZJVF9SR0IxNikgeworCQljaGFubmVsU2l6ZSA9IHNpemVvZihXT1JEKTsKKwl9IGVsc2UgaWYgKCEoaW1hZ2VfdHlwZSA9PSBGSVRfQklUTUFQICYmIChieXRlc3BlcnBpeGVsID4gMikpKSB7CisJCXJldHVybiBGQUxTRTsKKwl9CisJCQkJCisJY29uc3QgdW5zaWduZWQgd2lkdGggPSBGcmVlSW1hZ2VfR2V0V2lkdGgoZGliKTsKKwljb25zdCB1bnNpZ25lZCBoZWlnaHQgPSBGcmVlSW1hZ2VfR2V0SGVpZ2h0KGRpYik7CisJQllURSAqbGluZV9zdGFydCA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIDApOworCWNvbnN0IHVuc2lnbmVkIHBpdGNoID0gRnJlZUltYWdlX0dldFBpdGNoKGRpYik7CisJCisJdW5zaWduZWQgc2FtcGxlc3BlcnBpeGVsID0gRnJlZUltYWdlX0dldExpbmUoZGliKSAvIHdpZHRoIC8gY2hhbm5lbFNpemU7CisJCQkKKwlpZihjaGFubmVsU2l6ZSA9PSAxKSB7CisJCV9jb252ZXJ0TEFCdG9SR0I8QllURT4od2lkdGgsIGhlaWdodCwgbGluZV9zdGFydCwgcGl0Y2gsIHNhbXBsZXNwZXJwaXhlbCk7CisJfQorCWVsc2UgeworCQlfY29udmVydExBQnRvUkdCPFdPUkQ+KHdpZHRoLCBoZWlnaHQsIGxpbmVfc3RhcnQsIHBpdGNoLCBzYW1wbGVzcGVycGl4ZWwpOworCX0KKworCXJldHVybiBUUlVFOwkKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitGSUJJVE1BUCogCitSZW1vdmVBbHBoYUNoYW5uZWwoRklCSVRNQVAqIHNyYykgeyAKKworCWlmKCFGcmVlSW1hZ2VfSGFzUGl4ZWxzKHNyYykpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJY29uc3QgRlJFRV9JTUFHRV9UWVBFIGltYWdlX3R5cGUgPSBGcmVlSW1hZ2VfR2V0SW1hZ2VUeXBlKHNyYyk7CisJCQorCXN3aXRjaChpbWFnZV90eXBlKSB7CisJCWNhc2UgRklUX0JJVE1BUDoKKwkJCWlmKEZyZWVJbWFnZV9HZXRCUFAoc3JjKSA9PSAzMikgeworCQkJCS8vIGNvbnZlcnQgdG8gMjQtYml0CisJCQkJcmV0dXJuIEZyZWVJbWFnZV9Db252ZXJ0VG8yNEJpdHMoc3JjKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEZJVF9SR0JBMTY6CisJCQkvLyBjb252ZXJ0IHRvIFJHQjE2CisJCQlyZXR1cm4gRnJlZUltYWdlX0NvbnZlcnRUb1JHQjE2KHNyYyk7CisJCWNhc2UgRklUX1JHQkFGOgorCQkJLy8gY29udmVydCB0byBSR0JGCisJCQlyZXR1cm4gRnJlZUltYWdlX0NvbnZlcnRUb1JHQkYoc3JjKTsKKwkJZGVmYXVsdDoKKwkJCS8vIHVuc3VwcG9ydGVkIGltYWdlIHR5cGUKKwkJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiBOVUxMOworfQorCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworRklCSVRNQVAgKiBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9Db2xvclF1YW50aXplKEZJQklUTUFQICpkaWIsIEZSRUVfSU1BR0VfUVVBTlRJWkUgcXVhbnRpemUpIHsKKwlyZXR1cm4gRnJlZUltYWdlX0NvbG9yUXVhbnRpemVFeChkaWIsIHF1YW50aXplKTsKK30KKworRklCSVRNQVAgKiBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9Db2xvclF1YW50aXplRXgoRklCSVRNQVAgKmRpYiwgRlJFRV9JTUFHRV9RVUFOVElaRSBxdWFudGl6ZSwgaW50IFBhbGV0dGVTaXplLCBpbnQgUmVzZXJ2ZVNpemUsIFJHQlFVQUQgKlJlc2VydmVQYWxldHRlKSB7CisJaWYoIFBhbGV0dGVTaXplIDwgMiApIFBhbGV0dGVTaXplID0gMjsKKwlpZiggUGFsZXR0ZVNpemUgPiAyNTYgKSBQYWxldHRlU2l6ZSA9IDI1NjsKKwlpZiggUmVzZXJ2ZVNpemUgPCAwICkgUmVzZXJ2ZVNpemUgPSAwOworCWlmKCBSZXNlcnZlU2l6ZSA+IFBhbGV0dGVTaXplICkgUmVzZXJ2ZVNpemUgPSBQYWxldHRlU2l6ZTsKKwlpZiAoRnJlZUltYWdlX0hhc1BpeGVscyhkaWIpKSB7CisJCWNvbnN0IHVuc2lnbmVkIGJwcCA9IEZyZWVJbWFnZV9HZXRCUFAoZGliKTsKKwkJaWYoKEZyZWVJbWFnZV9HZXRJbWFnZVR5cGUoZGliKSA9PSBGSVRfQklUTUFQKSAmJiAoYnBwID09IDI0IHx8IGJwcCA9PSAzMikpIHsKKwkJCXN3aXRjaChxdWFudGl6ZSkgeworCQkJCWNhc2UgRklRX1dVUVVBTlQgOgorCQkJCXsKKwkJCQkJdHJ5IHsKKwkJCQkJCVd1UXVhbnRpemVyIFEgKGRpYik7CisJCQkJCQlGSUJJVE1BUCAqZHN0ID0gUS5RdWFudGl6ZShQYWxldHRlU2l6ZSwgUmVzZXJ2ZVNpemUsIFJlc2VydmVQYWxldHRlKTsKKwkJCQkJCWlmKGRzdCkgeworCQkJCQkJCS8vIGNvcHkgbWV0YWRhdGEgZnJvbSBzcmMgdG8gZHN0CisJCQkJCQkJRnJlZUltYWdlX0Nsb25lTWV0YWRhdGEoZHN0LCBkaWIpOworCQkJCQkJfQorCQkJCQkJcmV0dXJuIGRzdDsKKwkJCQkJfSBjYXRjaCAoY29uc3QgY2hhciAqKSB7CisJCQkJCQlyZXR1cm4gTlVMTDsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisJCQkJY2FzZSBGSVFfTk5RVUFOVCA6CisJCQkJeworCQkJCQlpZiAoYnBwID09IDMyKSB7CisJCQkJCQkvLyAzMi1iaXQgaW1hZ2VzIG5vdCBzdXBwb3J0ZWQgYnkgTk5RVUFOVAorCQkJCQkJcmV0dXJuIE5VTEw7CisJCQkJCX0KKwkJCQkJLy8gc2FtcGxpbmcgZmFjdG9yIGluIHJhbmdlIDEuLjMwLiAKKwkJCQkJLy8gMSA9PiBzbG93ZXIgKGJ1dCBiZXR0ZXIpLCAzMCA9PiBmYXN0ZXIuIERlZmF1bHQgdmFsdWUgaXMgMQorCQkJCQljb25zdCBpbnQgc2FtcGxpbmcgPSAxOworCisJCQkJCU5OUXVhbnRpemVyIFEoUGFsZXR0ZVNpemUpOworCQkJCQlGSUJJVE1BUCAqZHN0ID0gUS5RdWFudGl6ZShkaWIsIFJlc2VydmVTaXplLCBSZXNlcnZlUGFsZXR0ZSwgc2FtcGxpbmcpOworCQkJCQlpZihkc3QpIHsKKwkJCQkJCS8vIGNvcHkgbWV0YWRhdGEgZnJvbSBzcmMgdG8gZHN0CisJCQkJCQlGcmVlSW1hZ2VfQ2xvbmVNZXRhZGF0YShkc3QsIGRpYik7CisJCQkJCX0KKwkJCQkJcmV0dXJuIGRzdDsKKwkJCQl9CisJCQkJY2FzZSBGSVFfTEZQUVVBTlQgOgorCQkJCXsKKwkJCQkJTEZQUXVhbnRpemVyIFEoUGFsZXR0ZVNpemUpOworCQkJCQlGSUJJVE1BUCAqZHN0ID0gUS5RdWFudGl6ZShkaWIsIFJlc2VydmVTaXplLCBSZXNlcnZlUGFsZXR0ZSk7CisJCQkJCWlmKGRzdCkgeworCQkJCQkJLy8gY29weSBtZXRhZGF0YSBmcm9tIHNyYyB0byBkc3QKKwkJCQkJCUZyZWVJbWFnZV9DbG9uZU1ldGFkYXRhKGRzdCwgZGliKTsKKwkJCQkJfQorCQkJCQlyZXR1cm4gZHN0OworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBOVUxMOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0ZJQklUTUFQICogRExMX0NBTExDT05WCitGcmVlSW1hZ2VfQ29udmVydEZyb21SYXdCaXRzRXgoQk9PTCBjb3B5U291cmNlLCBCWVRFICpiaXRzLCBGUkVFX0lNQUdFX1RZUEUgdHlwZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgcGl0Y2gsIHVuc2lnbmVkIGJwcCwgdW5zaWduZWQgcmVkX21hc2ssIHVuc2lnbmVkIGdyZWVuX21hc2ssIHVuc2lnbmVkIGJsdWVfbWFzaywgQk9PTCB0b3Bkb3duKSB7CisJRklCSVRNQVAgKmRpYiA9IE5VTEw7CisKKwlpZihjb3B5U291cmNlKSB7CisJCS8vIGFsbG9jYXRlIGEgRklCSVRNQVAgd2l0aCBpbnRlcm5hbGx5IG1hbmFnZWQgcGl4ZWwgYnVmZmVyCisJCWRpYiA9IEZyZWVJbWFnZV9BbGxvY2F0ZVQodHlwZSwgd2lkdGgsIGhlaWdodCwgYnBwLCByZWRfbWFzaywgZ3JlZW5fbWFzaywgYmx1ZV9tYXNrKTsKKwkJaWYoIWRpYikgeworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJLy8gY29weSB1c2VyIHByb3ZpZGVkIHBpeGVsIGJ1ZmZlciBpbnRvIHRoZSBkaWIKKwkJY29uc3QgdW5zaWduZWQgbGluZXNpemUgPSBGcmVlSW1hZ2VfR2V0TGluZShkaWIpOworCQlmb3IoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJCW1lbWNweShGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCB5KSwgYml0cywgbGluZXNpemUpOworCQkJLy8gbmV4dCBsaW5lIGluIHVzZXIncyBidWZmZXIKKwkJCWJpdHMgKz0gcGl0Y2g7CisJCX0KKwkJLy8gZmxpcCBwaXhlbHMgdmVydGljYWxseSBpZiBuZWVkZWQKKwkJaWYodG9wZG93bikgeworCQkJRnJlZUltYWdlX0ZsaXBWZXJ0aWNhbChkaWIpOworCQl9CisJfQorCWVsc2UgeworCQkvLyBhbGxvY2F0ZSBhIEZJQklUTUFQIHVzaW5nIGEgd3JhcHBlciB0byB1c2VyIHByb3ZpZGVkIHBpeGVsIGJ1ZmZlcgorCQlkaWIgPSBGcmVlSW1hZ2VfQWxsb2NhdGVIZWFkZXJGb3JCaXRzKGJpdHMsIHBpdGNoLCB0eXBlLCB3aWR0aCwgaGVpZ2h0LCBicHAsIHJlZF9tYXNrLCBncmVlbl9tYXNrLCBibHVlX21hc2spOworCQlpZighZGliKSB7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQkvLyBmbGlwIHBpeGVscyB2ZXJ0aWNhbGx5IGlmIG5lZWRlZAorCQlpZih0b3Bkb3duKSB7CisJCQlGcmVlSW1hZ2VfRmxpcFZlcnRpY2FsKGRpYik7CisJCX0KKwl9CisKKwlyZXR1cm4gZGliOworfQorCitGSUJJVE1BUCAqIERMTF9DQUxMQ09OVgorRnJlZUltYWdlX0NvbnZlcnRGcm9tUmF3Qml0cyhCWVRFICpiaXRzLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBwaXRjaCwgdW5zaWduZWQgYnBwLCB1bnNpZ25lZCByZWRfbWFzaywgdW5zaWduZWQgZ3JlZW5fbWFzaywgdW5zaWduZWQgYmx1ZV9tYXNrLCBCT09MIHRvcGRvd24pIHsKKwlyZXR1cm4gRnJlZUltYWdlX0NvbnZlcnRGcm9tUmF3Qml0c0V4KFRSVUUgLyogY29weVNvdXJjZSAqLywgYml0cywgRklUX0JJVE1BUCwgd2lkdGgsIGhlaWdodCwgcGl0Y2gsIGJwcCwgcmVkX21hc2ssIGdyZWVuX21hc2ssIGJsdWVfbWFzaywgdG9wZG93bik7Cit9CisKK3ZvaWQgRExMX0NBTExDT05WCitGcmVlSW1hZ2VfQ29udmVydFRvUmF3Qml0cyhCWVRFICpiaXRzLCBGSUJJVE1BUCAqZGliLCBpbnQgcGl0Y2gsIHVuc2lnbmVkIGJwcCwgdW5zaWduZWQgcmVkX21hc2ssIHVuc2lnbmVkIGdyZWVuX21hc2ssIHVuc2lnbmVkIGJsdWVfbWFzaywgQk9PTCB0b3Bkb3duKSB7CisJaWYgKEZyZWVJbWFnZV9IYXNQaXhlbHMoZGliKSAmJiAoYml0cyAhPSBOVUxMKSkgeworCQlmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgRnJlZUltYWdlX0dldEhlaWdodChkaWIpOyArK2kpIHsKKwkJCUJZVEUgKnNjYW5saW5lID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgdG9wZG93biA/IChGcmVlSW1hZ2VfR2V0SGVpZ2h0KGRpYikgLSBpIC0gMSkgOiBpKTsKKworCQkJaWYgKChicHAgPT0gMTYpICYmIChGcmVlSW1hZ2VfR2V0QlBQKGRpYikgPT0gMTYpKSB7CisJCQkJLy8gY29udmVydCA1NTUgdG8gNTY1IG9yIHZpY2UgdmVyc2EKKworCQkJCWlmICgocmVkX21hc2sgPT0gRkkxNl81NTVfUkVEX01BU0spICYmIChncmVlbl9tYXNrID09IEZJMTZfNTU1X0dSRUVOX01BU0spICYmIChibHVlX21hc2sgPT0gRkkxNl81NTVfQkxVRV9NQVNLKSkgeworCQkJCQlpZiAoKEZyZWVJbWFnZV9HZXRSZWRNYXNrKGRpYikgPT0gRkkxNl81NjVfUkVEX01BU0spICYmIChGcmVlSW1hZ2VfR2V0R3JlZW5NYXNrKGRpYikgPT0gRkkxNl81NjVfR1JFRU5fTUFTSykgJiYgKEZyZWVJbWFnZV9HZXRCbHVlTWFzayhkaWIpID09IEZJMTZfNTY1X0JMVUVfTUFTSykpIHsKKwkJCQkJCUZyZWVJbWFnZV9Db252ZXJ0TGluZTE2XzU2NV9UbzE2XzU1NShiaXRzLCBzY2FubGluZSwgRnJlZUltYWdlX0dldFdpZHRoKGRpYikpOworCQkJCQl9IGVsc2UgeworCQkJCQkJbWVtY3B5KGJpdHMsIHNjYW5saW5lLCBGcmVlSW1hZ2VfR2V0TGluZShkaWIpKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWlmICgoRnJlZUltYWdlX0dldFJlZE1hc2soZGliKSA9PSBGSTE2XzU1NV9SRURfTUFTSykgJiYgKEZyZWVJbWFnZV9HZXRHcmVlbk1hc2soZGliKSA9PSBGSTE2XzU1NV9HUkVFTl9NQVNLKSAmJiAoRnJlZUltYWdlX0dldEJsdWVNYXNrKGRpYikgPT0gRkkxNl81NTVfQkxVRV9NQVNLKSkgeworCQkJCQkJRnJlZUltYWdlX0NvbnZlcnRMaW5lMTZfNTU1X1RvMTZfNTY1KGJpdHMsIHNjYW5saW5lLCBGcmVlSW1hZ2VfR2V0V2lkdGgoZGliKSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQltZW1jcHkoYml0cywgc2NhbmxpbmUsIEZyZWVJbWFnZV9HZXRMaW5lKGRpYikpOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIGlmIChGcmVlSW1hZ2VfR2V0QlBQKGRpYikgIT0gYnBwKSB7CisJCQkJc3dpdGNoKEZyZWVJbWFnZV9HZXRCUFAoZGliKSkgeworCQkJCQljYXNlIDEgOgorCQkJCQkJc3dpdGNoKGJwcCkgeworCQkJCQkJCUNPTlZFUlQoMSwgOCkKKwkJCQkJCQlDT05WRVJUVE8xNldJVEhQQUxFVFRFKDEpCisJCQkJCQkJQ09OVkVSVFdJVEhQQUxFVFRFKDEsIDI0KQorCQkJCQkJCUNPTlZFUlRXSVRIUEFMRVRURSgxLCAzMikKKwkJCQkJCX0KKworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSA0IDoKKwkJCQkJCXN3aXRjaChicHApIHsKKwkJCQkJCQlDT05WRVJUKDQsIDgpCisJCQkJCQkJQ09OVkVSVFRPMTZXSVRIUEFMRVRURSg0KQorCQkJCQkJCUNPTlZFUlRXSVRIUEFMRVRURSg0LCAyNCkKKwkJCQkJCQlDT05WRVJUV0lUSFBBTEVUVEUoNCwgMzIpCisJCQkJCQl9CisKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgOCA6CisJCQkJCQlzd2l0Y2goYnBwKSB7CisJCQkJCQkJQ09OVkVSVFRPMTZXSVRIUEFMRVRURSg4KQorCQkJCQkJCUNPTlZFUlRXSVRIUEFMRVRURSg4LCAyNCkKKwkJCQkJCQlDT05WRVJUV0lUSFBBTEVUVEUoOCwgMzIpCisJCQkJCQl9CisKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgMjQgOgorCQkJCQkJc3dpdGNoKGJwcCkgeworCQkJCQkJCUNPTlZFUlQoMjQsIDgpCisJCQkJCQkJQ09OVkVSVFRPMTYoMjQpCisJCQkJCQkJQ09OVkVSVCgyNCwgMzIpCisJCQkJCQl9CisKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgMzIgOgorCQkJCQkJc3dpdGNoKGJwcCkgeworCQkJCQkJCUNPTlZFUlQoMzIsIDgpCisJCQkJCQkJQ09OVkVSVFRPMTYoMzIpCisJCQkJCQkJQ09OVkVSVCgzMiwgMjQpCisJCQkJCQl9CisKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJbWVtY3B5KGJpdHMsIHNjYW5saW5lLCBGcmVlSW1hZ2VfR2V0TGluZShkaWIpKTsKKwkJCX0KKworCQkJYml0cyArPSBwaXRjaDsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvQ29udmVyc2lvbjE2XzU1NS5jcHAgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL0NvbnZlcnNpb24xNl81NTUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiYWYyZjEKLS0tIC9kZXYvbnVsbAorKysgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL0NvbnZlcnNpb24xNl81NTUuY3BwCkBAIC0wLDAgKzEsMjA5IEBACisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBCaXRtYXAgY29udmVyc2lvbiByb3V0aW5lcworLy8KKy8vIERlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gYnkKKy8vIC0gRmxvcmlzIHZhbiBkZW4gQmVyZyAoZmx2ZGJlcmdAd3hzLm5sKQorLy8gLSBIZXJ26SBEcm9sb24gKGRyb2xvbkBpbmZvbmllLmZyKQorLy8gLSBKYW5pIEthamFsYSAoamFuaWtAcmVtZWR5LmZpKQorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZyZWVJbWFnZSAzCisvLworLy8gQ09WRVJFRCBDT0RFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZCisvLyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUworLy8gVEhBVCBUSEUgQ09WRVJFRCBDT0RFIElTIEZSRUUgT0YgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisvLyBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRAorLy8gQ09ERSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVAorLy8gVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GIEFOWSBORUNFU1NBUlkKKy8vIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwKKy8vIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIKKy8vIFRISVMgRElTQ0xBSU1FUi4KKy8vCisvLyBVc2UgYXQgeW91ciBvd24gcmlzayEKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2luY2x1ZGUgIkZyZWVJbWFnZS5oIgorI2luY2x1ZGUgIlV0aWxpdGllcy5oIgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgUkdCNTU1KGIsIGcsIHIpICgoKChiKSA+PiAzKSA8PCBGSTE2XzU1NV9CTFVFX1NISUZUKSB8ICgoKGcpID4+IDMpIDw8IEZJMTZfNTU1X0dSRUVOX1NISUZUKSB8ICgoKHIpID4+IDMpIDw8IEZJMTZfNTU1X1JFRF9TSElGVCkpCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBpbnRlcm5hbCBjb252ZXJzaW9ucyBYIHRvIDE2IGJpdHMgKDU1NSkKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9Db252ZXJ0TGluZTFUbzE2XzU1NShCWVRFICp0YXJnZXQsIEJZVEUgKnNvdXJjZSwgaW50IHdpZHRoX2luX3BpeGVscywgUkdCUVVBRCAqcGFsZXR0ZSkgeworCVdPUkQgKm5ld19iaXRzID0gKFdPUkQgKil0YXJnZXQ7CisKKwlmb3IgKGludCBjb2xzID0gMDsgY29scyA8IHdpZHRoX2luX3BpeGVsczsgY29scysrKSB7CisJCWludCBpbmRleCA9IChzb3VyY2VbY29scyA+PiAzXSAmICgweDgwID4+IChjb2xzICYgMHgwNykpKSAhPSAwID8gMSA6IDA7CisKKwkJbmV3X2JpdHNbY29sc10gPSBSR0I1NTUocGFsZXR0ZVtpbmRleF0ucmdiQmx1ZSwgcGFsZXR0ZVtpbmRleF0ucmdiR3JlZW4sIHBhbGV0dGVbaW5kZXhdLnJnYlJlZCk7CisJfQorfQorCit2b2lkIERMTF9DQUxMQ09OVgorRnJlZUltYWdlX0NvbnZlcnRMaW5lNFRvMTZfNTU1KEJZVEUgKnRhcmdldCwgQllURSAqc291cmNlLCBpbnQgd2lkdGhfaW5fcGl4ZWxzLCBSR0JRVUFEICpwYWxldHRlKSB7CisJV09SRCAqbmV3X2JpdHMgPSAoV09SRCAqKXRhcmdldDsKKwlCT09MIGxvbmliYmxlID0gRkFMU0U7CisJaW50IHggPSAwOworCisJZm9yIChpbnQgY29scyA9IDA7IGNvbHMgPCB3aWR0aF9pbl9waXhlbHM7IGNvbHMrKykgeworCQlSR0JRVUFEICpncmFiX3BhbGV0dGU7CisKKwkJaWYgKGxvbmliYmxlKSB7CisJCQlncmFiX3BhbGV0dGUgPSBwYWxldHRlICsgTE9XTklCQkxFKHNvdXJjZVt4KytdKTsKKwkJfSBlbHNlIHsKKwkJCWdyYWJfcGFsZXR0ZSA9IHBhbGV0dGUgKyAoSElOSUJCTEUoc291cmNlW3hdKSA+PiA0KTsJCQkJCQkJCQorCQl9CisKKwkJbmV3X2JpdHNbY29sc10gPSBSR0I1NTUoZ3JhYl9wYWxldHRlLT5yZ2JCbHVlLCBncmFiX3BhbGV0dGUtPnJnYkdyZWVuLCBncmFiX3BhbGV0dGUtPnJnYlJlZCk7CisKKwkJbG9uaWJibGUgPSAhbG9uaWJibGU7CisJfQorfQorCit2b2lkIERMTF9DQUxMQ09OVgorRnJlZUltYWdlX0NvbnZlcnRMaW5lOFRvMTZfNTU1KEJZVEUgKnRhcmdldCwgQllURSAqc291cmNlLCBpbnQgd2lkdGhfaW5fcGl4ZWxzLCBSR0JRVUFEICpwYWxldHRlKSB7CisJV09SRCAqbmV3X2JpdHMgPSAoV09SRCAqKXRhcmdldDsKKworCWZvciAoaW50IGNvbHMgPSAwOyBjb2xzIDwgd2lkdGhfaW5fcGl4ZWxzOyBjb2xzKyspIHsKKwkJUkdCUVVBRCAqZ3JhYl9wYWxldHRlID0gcGFsZXR0ZSArIHNvdXJjZVtjb2xzXTsKKworCQluZXdfYml0c1tjb2xzXSA9IFJHQjU1NShncmFiX3BhbGV0dGUtPnJnYkJsdWUsIGdyYWJfcGFsZXR0ZS0+cmdiR3JlZW4sIGdyYWJfcGFsZXR0ZS0+cmdiUmVkKTsKKwl9Cit9CisKK3ZvaWQgRExMX0NBTExDT05WCitGcmVlSW1hZ2VfQ29udmVydExpbmUxNl81NjVfVG8xNl81NTUoQllURSAqdGFyZ2V0LCBCWVRFICpzb3VyY2UsIGludCB3aWR0aF9pbl9waXhlbHMpIHsKKwlXT1JEICpzcmNfYml0cyA9IChXT1JEICopc291cmNlOworCVdPUkQgKm5ld19iaXRzID0gKFdPUkQgKil0YXJnZXQ7CisKKwlmb3IgKGludCBjb2xzID0gMDsgY29scyA8IHdpZHRoX2luX3BpeGVsczsgY29scysrKSB7CisJCW5ld19iaXRzW2NvbHNdID0gUkdCNTU1KCgoKHNyY19iaXRzW2NvbHNdICYgRkkxNl81NjVfQkxVRV9NQVNLKSA+PiBGSTE2XzU2NV9CTFVFX1NISUZUKSAqIDB4RkYpIC8gMHgxRiwKKwkJCSAgICAgICAgICAgICAgICAgICAgKCgoc3JjX2JpdHNbY29sc10gJiBGSTE2XzU2NV9HUkVFTl9NQVNLKSA+PiBGSTE2XzU2NV9HUkVFTl9TSElGVCkgKiAweEZGKSAvIDB4M0YsCisJCQkJCQkJCSgoKHNyY19iaXRzW2NvbHNdICYgRkkxNl81NjVfUkVEX01BU0spID4+IEZJMTZfNTY1X1JFRF9TSElGVCkgKiAweEZGKSAvIDB4MUYpOworCX0KK30KKwordm9pZCBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9Db252ZXJ0TGluZTI0VG8xNl81NTUoQllURSAqdGFyZ2V0LCBCWVRFICpzb3VyY2UsIGludCB3aWR0aF9pbl9waXhlbHMpIHsKKwlXT1JEICpuZXdfYml0cyA9IChXT1JEICopdGFyZ2V0OworCisJZm9yIChpbnQgY29scyA9IDA7IGNvbHMgPCB3aWR0aF9pbl9waXhlbHM7IGNvbHMrKykgeworCQluZXdfYml0c1tjb2xzXSA9IFJHQjU1NShzb3VyY2VbRklfUkdCQV9CTFVFXSwgc291cmNlW0ZJX1JHQkFfR1JFRU5dLCBzb3VyY2VbRklfUkdCQV9SRURdKTsKKworCQlzb3VyY2UgKz0gMzsKKwl9Cit9CisKK3ZvaWQgRExMX0NBTExDT05WCitGcmVlSW1hZ2VfQ29udmVydExpbmUzMlRvMTZfNTU1KEJZVEUgKnRhcmdldCwgQllURSAqc291cmNlLCBpbnQgd2lkdGhfaW5fcGl4ZWxzKSB7CisJV09SRCAqbmV3X2JpdHMgPSAoV09SRCAqKXRhcmdldDsKKworCWZvciAoaW50IGNvbHMgPSAwOyBjb2xzIDwgd2lkdGhfaW5fcGl4ZWxzOyBjb2xzKyspIHsKKwkJbmV3X2JpdHNbY29sc10gPSBSR0I1NTUoc291cmNlW0ZJX1JHQkFfQkxVRV0sIHNvdXJjZVtGSV9SR0JBX0dSRUVOXSwgc291cmNlW0ZJX1JHQkFfUkVEXSk7CisKKwkJc291cmNlICs9IDQ7CisJfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgIHNtYXJ0IGNvbnZlcnQgWCB0byAxNiBiaXRzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0ZJQklUTUFQICogRExMX0NBTExDT05WCitGcmVlSW1hZ2VfQ29udmVydFRvMTZCaXRzNTU1KEZJQklUTUFQICpkaWIpIHsKKwlpZighRnJlZUltYWdlX0hhc1BpeGVscyhkaWIpIHx8IChGcmVlSW1hZ2VfR2V0SW1hZ2VUeXBlKGRpYikgIT0gRklUX0JJVE1BUCkpIHJldHVybiBOVUxMOworCisJY29uc3QgaW50IHdpZHRoID0gRnJlZUltYWdlX0dldFdpZHRoKGRpYik7CisJY29uc3QgaW50IGhlaWdodCA9IEZyZWVJbWFnZV9HZXRIZWlnaHQoZGliKTsKKwljb25zdCBpbnQgYnBwID0gRnJlZUltYWdlX0dldEJQUChkaWIpOworCisJaWYoYnBwID09IDE2KSB7CisJCWlmICgoRnJlZUltYWdlX0dldFJlZE1hc2soZGliKSA9PSBGSTE2XzU2NV9SRURfTUFTSykgJiYgKEZyZWVJbWFnZV9HZXRHcmVlbk1hc2soZGliKSA9PSBGSTE2XzU2NV9HUkVFTl9NQVNLKSAmJiAoRnJlZUltYWdlX0dldEJsdWVNYXNrKGRpYikgPT0gRkkxNl81NjVfQkxVRV9NQVNLKSkgeworCQkJLy8gUkdCIDU2NQorCQkJRklCSVRNQVAgKm5ld19kaWIgPSBGcmVlSW1hZ2VfQWxsb2NhdGUod2lkdGgsIGhlaWdodCwgMTYsIEZJMTZfNTU1X1JFRF9NQVNLLCBGSTE2XzU1NV9HUkVFTl9NQVNLLCBGSTE2XzU1NV9CTFVFX01BU0spOworCQkJaWYobmV3X2RpYiA9PSBOVUxMKSB7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCQlmb3IgKGludCByb3dzID0gMDsgcm93cyA8IGhlaWdodDsgcm93cysrKSB7CisJCQkJRnJlZUltYWdlX0NvbnZlcnRMaW5lMTZfNTY1X1RvMTZfNTU1KEZyZWVJbWFnZV9HZXRTY2FuTGluZShuZXdfZGliLCByb3dzKSwgRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgcm93cyksIHdpZHRoKTsKKwkJCX0KKworCQkJLy8gY29weSBtZXRhZGF0YSBmcm9tIHNyYyB0byBkc3QKKwkJCUZyZWVJbWFnZV9DbG9uZU1ldGFkYXRhKG5ld19kaWIsIGRpYik7CisKKwkJCXJldHVybiBuZXdfZGliOworCQl9IGVsc2UgeworCQkJLy8gUkdCIDU1NQorCQkJcmV0dXJuIEZyZWVJbWFnZV9DbG9uZShkaWIpOworCQl9CisJfQorCWVsc2UgeworCQkvLyBvdGhlciBicHAgY2FzZXMgPT4gY29udmVydCB0byBSR0IgNTU1CisJCUZJQklUTUFQICpuZXdfZGliID0gRnJlZUltYWdlX0FsbG9jYXRlKHdpZHRoLCBoZWlnaHQsIDE2LCBGSTE2XzU1NV9SRURfTUFTSywgRkkxNl81NTVfR1JFRU5fTUFTSywgRkkxNl81NTVfQkxVRV9NQVNLKTsKKwkJaWYobmV3X2RpYiA9PSBOVUxMKSB7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCS8vIGNvcHkgbWV0YWRhdGEgZnJvbSBzcmMgdG8gZHN0CisJCUZyZWVJbWFnZV9DbG9uZU1ldGFkYXRhKG5ld19kaWIsIGRpYik7CisKKwkJc3dpdGNoIChicHApIHsKKwkJCWNhc2UgMSA6CisJCQl7CisJCQkJZm9yIChpbnQgcm93cyA9IDA7IHJvd3MgPCBoZWlnaHQ7IHJvd3MrKykgeworCQkJCQlGcmVlSW1hZ2VfQ29udmVydExpbmUxVG8xNl81NTUoRnJlZUltYWdlX0dldFNjYW5MaW5lKG5ld19kaWIsIHJvd3MpLCBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCByb3dzKSwgd2lkdGgsIEZyZWVJbWFnZV9HZXRQYWxldHRlKGRpYikpOworCQkJCX0KKworCQkJCXJldHVybiBuZXdfZGliOworCQkJfQorCisJCQljYXNlIDQgOgorCQkJeworCQkJCWZvciAoaW50IHJvd3MgPSAwOyByb3dzIDwgaGVpZ2h0OyByb3dzKyspIHsKKwkJCQkJRnJlZUltYWdlX0NvbnZlcnRMaW5lNFRvMTZfNTU1KEZyZWVJbWFnZV9HZXRTY2FuTGluZShuZXdfZGliLCByb3dzKSwgRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgcm93cyksIHdpZHRoLCBGcmVlSW1hZ2VfR2V0UGFsZXR0ZShkaWIpKTsKKwkJCQl9CisKKwkJCQlyZXR1cm4gbmV3X2RpYjsKKwkJCX0KKworCQkJY2FzZSA4IDoKKwkJCXsKKwkJCQlmb3IgKGludCByb3dzID0gMDsgcm93cyA8IGhlaWdodDsgcm93cysrKSB7CisJCQkJCUZyZWVJbWFnZV9Db252ZXJ0TGluZThUbzE2XzU1NShGcmVlSW1hZ2VfR2V0U2NhbkxpbmUobmV3X2RpYiwgcm93cyksIEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIHJvd3MpLCB3aWR0aCwgRnJlZUltYWdlX0dldFBhbGV0dGUoZGliKSk7CisJCQkJfQorCisJCQkJcmV0dXJuIG5ld19kaWI7CisJCQl9CisKKwkJCWNhc2UgMjQgOgorCQkJeworCQkJCWZvciAoaW50IHJvd3MgPSAwOyByb3dzIDwgaGVpZ2h0OyByb3dzKyspIHsKKwkJCQkJRnJlZUltYWdlX0NvbnZlcnRMaW5lMjRUbzE2XzU1NShGcmVlSW1hZ2VfR2V0U2NhbkxpbmUobmV3X2RpYiwgcm93cyksIEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIHJvd3MpLCB3aWR0aCk7CisJCQkJfQorCisJCQkJcmV0dXJuIG5ld19kaWI7CisJCQl9CisKKwkJCWNhc2UgMzIgOgorCQkJeworCQkJCWZvciAoaW50IHJvd3MgPSAwOyByb3dzIDwgaGVpZ2h0OyByb3dzKyspIHsKKwkJCQkJRnJlZUltYWdlX0NvbnZlcnRMaW5lMzJUbzE2XzU1NShGcmVlSW1hZ2VfR2V0U2NhbkxpbmUobmV3X2RpYiwgcm93cyksIEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIHJvd3MpLCB3aWR0aCk7CisJCQkJfQorCisJCQkJcmV0dXJuIG5ld19kaWI7CisJCQl9CisKKwkJCWRlZmF1bHQgOgorCQkJCS8vIHVucmVhY2hhYmxlIGNvZGUgLi4uCisJCQkJRnJlZUltYWdlX1VubG9hZChuZXdfZGliKTsKKwkJCQlicmVhazsKKworCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL0NvbnZlcnNpb24xNl81NjUuY3BwIGIvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9Db252ZXJzaW9uMTZfNTY1LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjNkZDlkCi0tLSAvZGV2L251bGwKKysrIGIvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9Db252ZXJzaW9uMTZfNTY1LmNwcApAQCAtMCwwICsxLDIwNCBAQAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gQml0bWFwIGNvbnZlcnNpb24gcm91dGluZXMKKy8vCisvLyBEZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIGJ5CisvLyAtIEZsb3JpcyB2YW4gZGVuIEJlcmcgKGZsdmRiZXJnQHd4cy5ubCkKKy8vIC0gSGVydukgRHJvbG9uIChkcm9sb25AaW5mb25pZS5mcikKKy8vIC0gSmFuaSBLYWphbGEgKGphbmlrQHJlbWVkeS5maSkKKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBGcmVlSW1hZ2UgMworLy8KKy8vIENPVkVSRUQgQ09ERSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWQorLy8gT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMKKy8vIFRIQVQgVEhFIENPVkVSRUQgQ09ERSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLy8gT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQKKy8vIENPREUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkgQ09WRVJFRCBDT0RFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QKKy8vIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZCisvLyBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMCisvLyBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GIEFOWSBDT1ZFUkVEIENPREUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSCisvLyBUSElTIERJU0NMQUlNRVIuCisvLworLy8gVXNlIGF0IHlvdXIgb3duIHJpc2shCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpbmNsdWRlICJGcmVlSW1hZ2UuaCIKKyNpbmNsdWRlICJVdGlsaXRpZXMuaCIKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIGludGVybmFsIGNvbnZlcnNpb25zIFggdG8gMTYgYml0cyAoNTY1KQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIERMTF9DQUxMQ09OVgorRnJlZUltYWdlX0NvbnZlcnRMaW5lMVRvMTZfNTY1KEJZVEUgKnRhcmdldCwgQllURSAqc291cmNlLCBpbnQgd2lkdGhfaW5fcGl4ZWxzLCBSR0JRVUFEICpwYWxldHRlKSB7CisJV09SRCAqbmV3X2JpdHMgPSAoV09SRCAqKXRhcmdldDsKKworCWZvciAoaW50IGNvbHMgPSAwOyBjb2xzIDwgd2lkdGhfaW5fcGl4ZWxzOyBjb2xzKyspIHsKKwkJaW50IGluZGV4ID0gKHNvdXJjZVtjb2xzID4+IDNdICYgKDB4ODAgPj4gKGNvbHMgJiAweDA3KSkpICE9IDAgPyAxIDogMDsKKworCQluZXdfYml0c1tjb2xzXSA9IFJHQjU2NShwYWxldHRlW2luZGV4XS5yZ2JCbHVlLCBwYWxldHRlW2luZGV4XS5yZ2JHcmVlbiwgcGFsZXR0ZVtpbmRleF0ucmdiUmVkKTsKKwl9Cit9CisKK3ZvaWQgRExMX0NBTExDT05WCitGcmVlSW1hZ2VfQ29udmVydExpbmU0VG8xNl81NjUoQllURSAqdGFyZ2V0LCBCWVRFICpzb3VyY2UsIGludCB3aWR0aF9pbl9waXhlbHMsIFJHQlFVQUQgKnBhbGV0dGUpIHsKKwlXT1JEICpuZXdfYml0cyA9IChXT1JEICopdGFyZ2V0OworCUJPT0wgbG9uaWJibGUgPSBGQUxTRTsKKwlpbnQgeCA9IDA7CisKKwlmb3IgKGludCBjb2xzID0gMDsgY29scyA8IHdpZHRoX2luX3BpeGVsczsgY29scysrKSB7CisJCVJHQlFVQUQgKmdyYWJfcGFsZXR0ZTsKKworCQlpZiAobG9uaWJibGUpIHsKKwkJCWdyYWJfcGFsZXR0ZSA9IHBhbGV0dGUgKyBMT1dOSUJCTEUoc291cmNlW3grK10pOworCQl9IGVsc2UgeworCQkJZ3JhYl9wYWxldHRlID0gcGFsZXR0ZSArIChISU5JQkJMRShzb3VyY2VbeF0pID4+IDQpOwkJCQkJCQkJCisJCX0KKworCQluZXdfYml0c1tjb2xzXSA9IFJHQjU2NShncmFiX3BhbGV0dGUtPnJnYkJsdWUsIGdyYWJfcGFsZXR0ZS0+cmdiR3JlZW4sIGdyYWJfcGFsZXR0ZS0+cmdiUmVkKTsKKworCQlsb25pYmJsZSA9ICFsb25pYmJsZTsKKwl9Cit9CisKK3ZvaWQgRExMX0NBTExDT05WCitGcmVlSW1hZ2VfQ29udmVydExpbmU4VG8xNl81NjUoQllURSAqdGFyZ2V0LCBCWVRFICpzb3VyY2UsIGludCB3aWR0aF9pbl9waXhlbHMsIFJHQlFVQUQgKnBhbGV0dGUpIHsKKwlXT1JEICpuZXdfYml0cyA9IChXT1JEICopdGFyZ2V0OworCisJZm9yIChpbnQgY29scyA9IDA7IGNvbHMgPCB3aWR0aF9pbl9waXhlbHM7IGNvbHMrKykgeworCQlSR0JRVUFEICpncmFiX3BhbGV0dGUgPSBwYWxldHRlICsgc291cmNlW2NvbHNdOworCisJCW5ld19iaXRzW2NvbHNdID0gUkdCNTY1KGdyYWJfcGFsZXR0ZS0+cmdiQmx1ZSwgZ3JhYl9wYWxldHRlLT5yZ2JHcmVlbiwgZ3JhYl9wYWxldHRlLT5yZ2JSZWQpOworCX0KK30KKwordm9pZCBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9Db252ZXJ0TGluZTE2XzU1NV9UbzE2XzU2NShCWVRFICp0YXJnZXQsIEJZVEUgKnNvdXJjZSwgaW50IHdpZHRoX2luX3BpeGVscykgeworCVdPUkQgKnNyY19iaXRzID0gKFdPUkQgKilzb3VyY2U7CisJV09SRCAqbmV3X2JpdHMgPSAoV09SRCAqKXRhcmdldDsKKworCWZvciAoaW50IGNvbHMgPSAwOyBjb2xzIDwgd2lkdGhfaW5fcGl4ZWxzOyBjb2xzKyspIHsKKwkJbmV3X2JpdHNbY29sc10gPSBSR0I1NjUoKCgoc3JjX2JpdHNbY29sc10gJiBGSTE2XzU1NV9CTFVFX01BU0spID4+IEZJMTZfNTU1X0JMVUVfU0hJRlQpICogMHhGRikgLyAweDFGLAorCQkJICAgICAgICAgICAgICAgICAgICAoKChzcmNfYml0c1tjb2xzXSAmIEZJMTZfNTU1X0dSRUVOX01BU0spID4+IEZJMTZfNTU1X0dSRUVOX1NISUZUKSAqIDB4RkYpIC8gMHgxRiwKKwkJCQkJCQkJKCgoc3JjX2JpdHNbY29sc10gJiBGSTE2XzU1NV9SRURfTUFTSykgPj4gRkkxNl81NTVfUkVEX1NISUZUKSAqIDB4RkYpIC8gMHgxRik7CisJfQorfQorCit2b2lkIERMTF9DQUxMQ09OVgorRnJlZUltYWdlX0NvbnZlcnRMaW5lMjRUbzE2XzU2NShCWVRFICp0YXJnZXQsIEJZVEUgKnNvdXJjZSwgaW50IHdpZHRoX2luX3BpeGVscykgeworCVdPUkQgKm5ld19iaXRzID0gKFdPUkQgKil0YXJnZXQ7CisKKwlmb3IgKGludCBjb2xzID0gMDsgY29scyA8IHdpZHRoX2luX3BpeGVsczsgY29scysrKSB7CisJCW5ld19iaXRzW2NvbHNdID0gUkdCNTY1KHNvdXJjZVtGSV9SR0JBX0JMVUVdLCBzb3VyY2VbRklfUkdCQV9HUkVFTl0sIHNvdXJjZVtGSV9SR0JBX1JFRF0pOworCisJCXNvdXJjZSArPSAzOworCX0KK30KKwordm9pZCBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9Db252ZXJ0TGluZTMyVG8xNl81NjUoQllURSAqdGFyZ2V0LCBCWVRFICpzb3VyY2UsIGludCB3aWR0aF9pbl9waXhlbHMpIHsKKwlXT1JEICpuZXdfYml0cyA9IChXT1JEICopdGFyZ2V0OworCisJZm9yIChpbnQgY29scyA9IDA7IGNvbHMgPCB3aWR0aF9pbl9waXhlbHM7IGNvbHMrKykgeworCQluZXdfYml0c1tjb2xzXSA9IFJHQjU2NShzb3VyY2VbRklfUkdCQV9CTFVFXSwgc291cmNlW0ZJX1JHQkFfR1JFRU5dLCBzb3VyY2VbRklfUkdCQV9SRURdKTsKKworCQlzb3VyY2UgKz0gNDsKKwl9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgc21hcnQgY29udmVydCBYIHRvIDE2IGJpdHMgKDU2NSkKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRklCSVRNQVAgKiBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9Db252ZXJ0VG8xNkJpdHM1NjUoRklCSVRNQVAgKmRpYikgeworCWlmKCFGcmVlSW1hZ2VfSGFzUGl4ZWxzKGRpYikgfHwgKEZyZWVJbWFnZV9HZXRJbWFnZVR5cGUoZGliKSAhPSBGSVRfQklUTUFQKSkgcmV0dXJuIE5VTEw7CisKKwljb25zdCBpbnQgd2lkdGggPSBGcmVlSW1hZ2VfR2V0V2lkdGgoZGliKTsKKwljb25zdCBpbnQgaGVpZ2h0ID0gRnJlZUltYWdlX0dldEhlaWdodChkaWIpOworCWNvbnN0IGludCBicHAgPSBGcmVlSW1hZ2VfR2V0QlBQKGRpYik7CisKKwlpZihicHAgPT0gMTYpIHsKKwkJaWYgKChGcmVlSW1hZ2VfR2V0UmVkTWFzayhkaWIpID09IEZJMTZfNTU1X1JFRF9NQVNLKSAmJiAoRnJlZUltYWdlX0dldEdyZWVuTWFzayhkaWIpID09IEZJMTZfNTU1X0dSRUVOX01BU0spICYmIChGcmVlSW1hZ2VfR2V0Qmx1ZU1hc2soZGliKSA9PSBGSTE2XzU1NV9CTFVFX01BU0spKSB7CisJCQkvLyBSR0IgNTU1CisJCQlGSUJJVE1BUCAqbmV3X2RpYiA9IEZyZWVJbWFnZV9BbGxvY2F0ZSh3aWR0aCwgaGVpZ2h0LCAxNiwgRkkxNl81NjVfUkVEX01BU0ssIEZJMTZfNTY1X0dSRUVOX01BU0ssIEZJMTZfNTY1X0JMVUVfTUFTSyk7CisJCQlpZihuZXdfZGliID09IE5VTEwpIHsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJCWZvciAoaW50IHJvd3MgPSAwOyByb3dzIDwgaGVpZ2h0OyByb3dzKyspIHsKKwkJCQlGcmVlSW1hZ2VfQ29udmVydExpbmUxNl81NTVfVG8xNl81NjUoRnJlZUltYWdlX0dldFNjYW5MaW5lKG5ld19kaWIsIHJvd3MpLCBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCByb3dzKSwgd2lkdGgpOworCQkJfQorCisJCQkvLyBjb3B5IG1ldGFkYXRhIGZyb20gc3JjIHRvIGRzdAorCQkJRnJlZUltYWdlX0Nsb25lTWV0YWRhdGEobmV3X2RpYiwgZGliKTsKKworCQkJcmV0dXJuIG5ld19kaWI7CisJCX0gZWxzZSB7CisJCQkvLyBSR0IgNTY1CisJCQlyZXR1cm4gRnJlZUltYWdlX0Nsb25lKGRpYik7CisJCX0KKwl9CisJZWxzZSB7CisJCS8vIG90aGVyIGJwcCBjYXNlcyA9PiBjb252ZXJ0IHRvIFJHQiA1NjUKKwkJRklCSVRNQVAgKm5ld19kaWIgPSBGcmVlSW1hZ2VfQWxsb2NhdGUod2lkdGgsIGhlaWdodCwgMTYsIEZJMTZfNTY1X1JFRF9NQVNLLCBGSTE2XzU2NV9HUkVFTl9NQVNLLCBGSTE2XzU2NV9CTFVFX01BU0spOworCQlpZihuZXdfZGliID09IE5VTEwpIHsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJLy8gY29weSBtZXRhZGF0YSBmcm9tIHNyYyB0byBkc3QKKwkJRnJlZUltYWdlX0Nsb25lTWV0YWRhdGEobmV3X2RpYiwgZGliKTsKKworCQlzd2l0Y2ggKGJwcCkgeworCQkJY2FzZSAxIDoKKwkJCXsKKwkJCQlmb3IgKGludCByb3dzID0gMDsgcm93cyA8IGhlaWdodDsgcm93cysrKSB7CisJCQkJCUZyZWVJbWFnZV9Db252ZXJ0TGluZTFUbzE2XzU2NShGcmVlSW1hZ2VfR2V0U2NhbkxpbmUobmV3X2RpYiwgcm93cyksIEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIHJvd3MpLCB3aWR0aCwgRnJlZUltYWdlX0dldFBhbGV0dGUoZGliKSk7CisJCQkJfQorCisJCQkJcmV0dXJuIG5ld19kaWI7CisJCQl9CisKKwkJCWNhc2UgNCA6CisJCQl7CisJCQkJZm9yIChpbnQgcm93cyA9IDA7IHJvd3MgPCBoZWlnaHQ7IHJvd3MrKykgeworCQkJCQlGcmVlSW1hZ2VfQ29udmVydExpbmU0VG8xNl81NjUoRnJlZUltYWdlX0dldFNjYW5MaW5lKG5ld19kaWIsIHJvd3MpLCBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCByb3dzKSwgd2lkdGgsIEZyZWVJbWFnZV9HZXRQYWxldHRlKGRpYikpOworCQkJCX0KKworCQkJCXJldHVybiBuZXdfZGliOworCQkJfQorCisJCQljYXNlIDggOgorCQkJeworCQkJCWZvciAoaW50IHJvd3MgPSAwOyByb3dzIDwgaGVpZ2h0OyByb3dzKyspIHsKKwkJCQkJRnJlZUltYWdlX0NvbnZlcnRMaW5lOFRvMTZfNTY1KEZyZWVJbWFnZV9HZXRTY2FuTGluZShuZXdfZGliLCByb3dzKSwgRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgcm93cyksIHdpZHRoLCBGcmVlSW1hZ2VfR2V0UGFsZXR0ZShkaWIpKTsKKwkJCQl9CisKKwkJCQlyZXR1cm4gbmV3X2RpYjsKKwkJCX0KKworCQkJY2FzZSAyNCA6CisJCQl7CisJCQkJZm9yIChpbnQgcm93cyA9IDA7IHJvd3MgPCBoZWlnaHQ7IHJvd3MrKykgeworCQkJCQlGcmVlSW1hZ2VfQ29udmVydExpbmUyNFRvMTZfNTY1KEZyZWVJbWFnZV9HZXRTY2FuTGluZShuZXdfZGliLCByb3dzKSwgRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgcm93cyksIHdpZHRoKTsKKwkJCQl9CisKKwkJCQlyZXR1cm4gbmV3X2RpYjsKKwkJCX0KKworCQkJY2FzZSAzMiA6CisJCQl7CisJCQkJZm9yIChpbnQgcm93cyA9IDA7IHJvd3MgPCBoZWlnaHQ7IHJvd3MrKykgeworCQkJCQlGcmVlSW1hZ2VfQ29udmVydExpbmUzMlRvMTZfNTY1KEZyZWVJbWFnZV9HZXRTY2FuTGluZShuZXdfZGliLCByb3dzKSwgRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgcm93cyksIHdpZHRoKTsKKwkJCQl9CisKKwkJCQlyZXR1cm4gbmV3X2RpYjsKKwkJCX0KKworCQkJZGVmYXVsdCA6CisJCQkJLy8gdW5yZWFjaGFibGUgY29kZSAuLi4KKwkJCQlGcmVlSW1hZ2VfVW5sb2FkKG5ld19kaWIpOworCQkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL0NvbnZlcnNpb24yNC5jcHAgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL0NvbnZlcnNpb24yNC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I3YTgwMAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvQ29udmVyc2lvbjI0LmNwcApAQCAtMCwwICsxLDI1MiBAQAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gQml0bWFwIGNvbnZlcnNpb24gcm91dGluZXMKKy8vCisvLyBEZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIGJ5CisvLyAtIEZsb3JpcyB2YW4gZGVuIEJlcmcgKGZsdmRiZXJnQHd4cy5ubCkKKy8vIC0gRGFsZSBMYXJzb24gKGRsYXJzb25Abm9yc2Vzb2Z0LmNvbSkKKy8vIC0gSGVydukgRHJvbG9uIChkcm9sb25AaW5mb25pZS5mcikKKy8vIC0gSmFuaSBLYWphbGEgKGphbmlrQHJlbWVkeS5maSkKKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBGcmVlSW1hZ2UgMworLy8KKy8vIENPVkVSRUQgQ09ERSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWQorLy8gT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMKKy8vIFRIQVQgVEhFIENPVkVSRUQgQ09ERSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLy8gT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQKKy8vIENPREUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkgQ09WRVJFRCBDT0RFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QKKy8vIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZCisvLyBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMCisvLyBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GIEFOWSBDT1ZFUkVEIENPREUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSCisvLyBUSElTIERJU0NMQUlNRVIuCisvLworLy8gVXNlIGF0IHlvdXIgb3duIHJpc2shCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpbmNsdWRlICJGcmVlSW1hZ2UuaCIKKyNpbmNsdWRlICJVdGlsaXRpZXMuaCIKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIGludGVybmFsIGNvbnZlcnNpb25zIFggdG8gMjQgYml0cworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIERMTF9DQUxMQ09OVgorRnJlZUltYWdlX0NvbnZlcnRMaW5lMVRvMjQoQllURSAqdGFyZ2V0LCBCWVRFICpzb3VyY2UsIGludCB3aWR0aF9pbl9waXhlbHMsIFJHQlFVQUQgKnBhbGV0dGUpIHsKKwlmb3IgKGludCBjb2xzID0gMDsgY29scyA8IHdpZHRoX2luX3BpeGVsczsgY29scysrKSB7CisJCUJZVEUgaW5kZXggPSAoc291cmNlW2NvbHMgPj4gM10gJiAoMHg4MCA+PiAoY29scyAmIDB4MDcpKSkgIT0gMCA/IDEgOiAwOworCisJCXRhcmdldFtGSV9SR0JBX0JMVUVdID0gcGFsZXR0ZVtpbmRleF0ucmdiQmx1ZTsKKwkJdGFyZ2V0W0ZJX1JHQkFfR1JFRU5dID0gcGFsZXR0ZVtpbmRleF0ucmdiR3JlZW47CisJCXRhcmdldFtGSV9SR0JBX1JFRF0gPSBwYWxldHRlW2luZGV4XS5yZ2JSZWQ7CisKKwkJdGFyZ2V0ICs9IDM7CisJfQorfQorCit2b2lkIERMTF9DQUxMQ09OVgorRnJlZUltYWdlX0NvbnZlcnRMaW5lNFRvMjQoQllURSAqdGFyZ2V0LCBCWVRFICpzb3VyY2UsIGludCB3aWR0aF9pbl9waXhlbHMsIFJHQlFVQUQgKnBhbGV0dGUpIHsKKwlCT09MIGxvd19uaWJibGUgPSBGQUxTRTsKKwlpbnQgeCA9IDA7CisKKwlmb3IgKGludCBjb2xzID0gMDsgY29scyA8IHdpZHRoX2luX3BpeGVsczsgKytjb2xzICkgeworCQlpZiAobG93X25pYmJsZSkgeworCQkJdGFyZ2V0W0ZJX1JHQkFfQkxVRV0gPSBwYWxldHRlW0xPV05JQkJMRShzb3VyY2VbeF0pXS5yZ2JCbHVlOworCQkJdGFyZ2V0W0ZJX1JHQkFfR1JFRU5dID0gcGFsZXR0ZVtMT1dOSUJCTEUoc291cmNlW3hdKV0ucmdiR3JlZW47CisJCQl0YXJnZXRbRklfUkdCQV9SRURdID0gcGFsZXR0ZVtMT1dOSUJCTEUoc291cmNlW3hdKV0ucmdiUmVkOworCisJCQl4Kys7CisJCX0gZWxzZSB7CisJCQl0YXJnZXRbRklfUkdCQV9CTFVFXSA9IHBhbGV0dGVbSElOSUJCTEUoc291cmNlW3hdKSA+PiA0XS5yZ2JCbHVlOworCQkJdGFyZ2V0W0ZJX1JHQkFfR1JFRU5dID0gcGFsZXR0ZVtISU5JQkJMRShzb3VyY2VbeF0pID4+IDRdLnJnYkdyZWVuOworCQkJdGFyZ2V0W0ZJX1JHQkFfUkVEXSA9IHBhbGV0dGVbSElOSUJCTEUoc291cmNlW3hdKSA+PiA0XS5yZ2JSZWQ7CisJCX0KKworCQlsb3dfbmliYmxlID0gIWxvd19uaWJibGU7CisKKwkJdGFyZ2V0ICs9IDM7CisJfQorfQorCit2b2lkIERMTF9DQUxMQ09OVgorRnJlZUltYWdlX0NvbnZlcnRMaW5lOFRvMjQoQllURSAqdGFyZ2V0LCBCWVRFICpzb3VyY2UsIGludCB3aWR0aF9pbl9waXhlbHMsIFJHQlFVQUQgKnBhbGV0dGUpIHsKKwlmb3IgKGludCBjb2xzID0gMDsgY29scyA8IHdpZHRoX2luX3BpeGVsczsgY29scysrKSB7CisJCXRhcmdldFtGSV9SR0JBX0JMVUVdID0gcGFsZXR0ZVtzb3VyY2VbY29sc11dLnJnYkJsdWU7CisJCXRhcmdldFtGSV9SR0JBX0dSRUVOXSA9IHBhbGV0dGVbc291cmNlW2NvbHNdXS5yZ2JHcmVlbjsKKwkJdGFyZ2V0W0ZJX1JHQkFfUkVEXSA9IHBhbGV0dGVbc291cmNlW2NvbHNdXS5yZ2JSZWQ7CisKKwkJdGFyZ2V0ICs9IDM7CisJfQorfQorCit2b2lkIERMTF9DQUxMQ09OVgorRnJlZUltYWdlX0NvbnZlcnRMaW5lMTZUbzI0XzU1NShCWVRFICp0YXJnZXQsIEJZVEUgKnNvdXJjZSwgaW50IHdpZHRoX2luX3BpeGVscykgeworCVdPUkQgKmJpdHMgPSAoV09SRCAqKXNvdXJjZTsKKworCWZvciAoaW50IGNvbHMgPSAwOyBjb2xzIDwgd2lkdGhfaW5fcGl4ZWxzOyBjb2xzKyspIHsKKwkJdGFyZ2V0W0ZJX1JHQkFfUkVEXSAgID0gKEJZVEUpKCgoKGJpdHNbY29sc10gJiBGSTE2XzU1NV9SRURfTUFTSykgPj4gRkkxNl81NTVfUkVEX1NISUZUKSAqIDB4RkYpIC8gMHgxRik7CisJCXRhcmdldFtGSV9SR0JBX0dSRUVOXSA9IChCWVRFKSgoKChiaXRzW2NvbHNdICYgRkkxNl81NTVfR1JFRU5fTUFTSykgPj4gRkkxNl81NTVfR1JFRU5fU0hJRlQpICogMHhGRikgLyAweDFGKTsKKwkJdGFyZ2V0W0ZJX1JHQkFfQkxVRV0gID0gKEJZVEUpKCgoKGJpdHNbY29sc10gJiBGSTE2XzU1NV9CTFVFX01BU0spID4+IEZJMTZfNTU1X0JMVUVfU0hJRlQpICogMHhGRikgLyAweDFGKTsKKworCQl0YXJnZXQgKz0gMzsKKwl9Cit9CisKK3ZvaWQgRExMX0NBTExDT05WCitGcmVlSW1hZ2VfQ29udmVydExpbmUxNlRvMjRfNTY1KEJZVEUgKnRhcmdldCwgQllURSAqc291cmNlLCBpbnQgd2lkdGhfaW5fcGl4ZWxzKSB7CisJV09SRCAqYml0cyA9IChXT1JEICopc291cmNlOworCisJZm9yIChpbnQgY29scyA9IDA7IGNvbHMgPCB3aWR0aF9pbl9waXhlbHM7IGNvbHMrKykgeworCQl0YXJnZXRbRklfUkdCQV9SRURdICAgPSAoQllURSkoKCgoYml0c1tjb2xzXSAmIEZJMTZfNTY1X1JFRF9NQVNLKSA+PiBGSTE2XzU2NV9SRURfU0hJRlQpICogMHhGRikgLyAweDFGKTsKKwkJdGFyZ2V0W0ZJX1JHQkFfR1JFRU5dID0gKEJZVEUpKCgoKGJpdHNbY29sc10gJiBGSTE2XzU2NV9HUkVFTl9NQVNLKSA+PiBGSTE2XzU2NV9HUkVFTl9TSElGVCkgKiAweEZGKSAvIDB4M0YpOworCQl0YXJnZXRbRklfUkdCQV9CTFVFXSAgPSAoQllURSkoKCgoYml0c1tjb2xzXSAmIEZJMTZfNTY1X0JMVUVfTUFTSykgPj4gRkkxNl81NjVfQkxVRV9TSElGVCkgKiAweEZGKSAvIDB4MUYpOworCisJCXRhcmdldCArPSAzOworCX0KK30KKwordm9pZCBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9Db252ZXJ0TGluZTMyVG8yNChCWVRFICp0YXJnZXQsIEJZVEUgKnNvdXJjZSwgaW50IHdpZHRoX2luX3BpeGVscykgeworCWZvciAoaW50IGNvbHMgPSAwOyBjb2xzIDwgd2lkdGhfaW5fcGl4ZWxzOyBjb2xzKyspIHsKKwkJdGFyZ2V0W0ZJX1JHQkFfQkxVRV0gPSBzb3VyY2VbRklfUkdCQV9CTFVFXTsKKwkJdGFyZ2V0W0ZJX1JHQkFfR1JFRU5dID0gc291cmNlW0ZJX1JHQkFfR1JFRU5dOworCQl0YXJnZXRbRklfUkdCQV9SRURdID0gc291cmNlW0ZJX1JHQkFfUkVEXTsKKworCQl0YXJnZXQgKz0gMzsKKwkJc291cmNlICs9IDQ7CisJfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgIHNtYXJ0IGNvbnZlcnQgWCB0byAyNCBiaXRzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0ZJQklUTUFQICogRExMX0NBTExDT05WCitGcmVlSW1hZ2VfQ29udmVydFRvMjRCaXRzKEZJQklUTUFQICpkaWIpIHsKKwlpZighRnJlZUltYWdlX0hhc1BpeGVscyhkaWIpKSByZXR1cm4gTlVMTDsKKworCWNvbnN0IHVuc2lnbmVkIGJwcCA9IEZyZWVJbWFnZV9HZXRCUFAoZGliKTsKKwljb25zdCBGUkVFX0lNQUdFX1RZUEUgaW1hZ2VfdHlwZSA9IEZyZWVJbWFnZV9HZXRJbWFnZVR5cGUoZGliKTsKKworCWlmKChpbWFnZV90eXBlICE9IEZJVF9CSVRNQVApICYmIChpbWFnZV90eXBlICE9IEZJVF9SR0IxNikgJiYgKGltYWdlX3R5cGUgIT0gRklUX1JHQkExNikpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCQorCWNvbnN0IGludCB3aWR0aCA9IEZyZWVJbWFnZV9HZXRXaWR0aChkaWIpOworCWNvbnN0IGludCBoZWlnaHQgPSBGcmVlSW1hZ2VfR2V0SGVpZ2h0KGRpYik7CisKKwlpZihpbWFnZV90eXBlID09IEZJVF9CSVRNQVApIHsKKwkJaWYoYnBwID09IDI0KSB7CisJCQlyZXR1cm4gRnJlZUltYWdlX0Nsb25lKGRpYik7CisJCX0KKworCQlGSUJJVE1BUCAqbmV3X2RpYiA9IEZyZWVJbWFnZV9BbGxvY2F0ZSh3aWR0aCwgaGVpZ2h0LCAyNCwgRklfUkdCQV9SRURfTUFTSywgRklfUkdCQV9HUkVFTl9NQVNLLCBGSV9SR0JBX0JMVUVfTUFTSyk7CisJCWlmKG5ld19kaWIgPT0gTlVMTCkgeworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQkvLyBjb3B5IG1ldGFkYXRhIGZyb20gc3JjIHRvIGRzdAorCQlGcmVlSW1hZ2VfQ2xvbmVNZXRhZGF0YShuZXdfZGliLCBkaWIpOworCisJCXN3aXRjaChicHApIHsKKwkJCWNhc2UgMSA6CisJCQl7CisJCQkJZm9yIChpbnQgcm93cyA9IDA7IHJvd3MgPCBoZWlnaHQ7IHJvd3MrKykgeworCQkJCQlGcmVlSW1hZ2VfQ29udmVydExpbmUxVG8yNChGcmVlSW1hZ2VfR2V0U2NhbkxpbmUobmV3X2RpYiwgcm93cyksIEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIHJvd3MpLCB3aWR0aCwgRnJlZUltYWdlX0dldFBhbGV0dGUoZGliKSk7CQkJCQkKKwkJCQl9CisJCQkJcmV0dXJuIG5ld19kaWI7CisJCQl9CisKKwkJCWNhc2UgNCA6CisJCQl7CisJCQkJZm9yIChpbnQgcm93cyA9IDA7IHJvd3MgPCBoZWlnaHQ7IHJvd3MrKykgeworCQkJCQlGcmVlSW1hZ2VfQ29udmVydExpbmU0VG8yNChGcmVlSW1hZ2VfR2V0U2NhbkxpbmUobmV3X2RpYiwgcm93cyksIEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIHJvd3MpLCB3aWR0aCwgRnJlZUltYWdlX0dldFBhbGV0dGUoZGliKSk7CisJCQkJfQorCQkJCXJldHVybiBuZXdfZGliOworCQkJfQorCQkJCQorCQkJY2FzZSA4IDoKKwkJCXsKKwkJCQlmb3IgKGludCByb3dzID0gMDsgcm93cyA8IGhlaWdodDsgcm93cysrKSB7CisJCQkJCUZyZWVJbWFnZV9Db252ZXJ0TGluZThUbzI0KEZyZWVJbWFnZV9HZXRTY2FuTGluZShuZXdfZGliLCByb3dzKSwgRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgcm93cyksIHdpZHRoLCBGcmVlSW1hZ2VfR2V0UGFsZXR0ZShkaWIpKTsKKwkJCQl9CisJCQkJcmV0dXJuIG5ld19kaWI7CisJCQl9CisKKwkJCWNhc2UgMTYgOgorCQkJeworCQkJCWZvciAoaW50IHJvd3MgPSAwOyByb3dzIDwgaGVpZ2h0OyByb3dzKyspIHsKKwkJCQkJaWYgKChGcmVlSW1hZ2VfR2V0UmVkTWFzayhkaWIpID09IEZJMTZfNTY1X1JFRF9NQVNLKSAmJiAoRnJlZUltYWdlX0dldEdyZWVuTWFzayhkaWIpID09IEZJMTZfNTY1X0dSRUVOX01BU0spICYmIChGcmVlSW1hZ2VfR2V0Qmx1ZU1hc2soZGliKSA9PSBGSTE2XzU2NV9CTFVFX01BU0spKSB7CisJCQkJCQlGcmVlSW1hZ2VfQ29udmVydExpbmUxNlRvMjRfNTY1KEZyZWVJbWFnZV9HZXRTY2FuTGluZShuZXdfZGliLCByb3dzKSwgRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgcm93cyksIHdpZHRoKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8vIGluY2x1ZGVzIGNhc2Ugd2hlcmUgYWxsIHRoZSBtYXNrcyBhcmUgMAorCQkJCQkJRnJlZUltYWdlX0NvbnZlcnRMaW5lMTZUbzI0XzU1NShGcmVlSW1hZ2VfR2V0U2NhbkxpbmUobmV3X2RpYiwgcm93cyksIEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIHJvd3MpLCB3aWR0aCk7CisJCQkJCX0KKwkJCQl9CisJCQkJcmV0dXJuIG5ld19kaWI7CisJCQl9CisKKwkJCWNhc2UgMzIgOgorCQkJeworCQkJCWZvciAoaW50IHJvd3MgPSAwOyByb3dzIDwgaGVpZ2h0OyByb3dzKyspIHsKKwkJCQkJRnJlZUltYWdlX0NvbnZlcnRMaW5lMzJUbzI0KEZyZWVJbWFnZV9HZXRTY2FuTGluZShuZXdfZGliLCByb3dzKSwgRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgcm93cyksIHdpZHRoKTsKKwkJCQl9CisJCQkJcmV0dXJuIG5ld19kaWI7CisJCQl9CisJCX0KKwkKKwl9IGVsc2UgaWYoaW1hZ2VfdHlwZSA9PSBGSVRfUkdCMTYpIHsKKwkJRklCSVRNQVAgKm5ld19kaWIgPSBGcmVlSW1hZ2VfQWxsb2NhdGUod2lkdGgsIGhlaWdodCwgMjQsIEZJX1JHQkFfUkVEX01BU0ssIEZJX1JHQkFfR1JFRU5fTUFTSywgRklfUkdCQV9CTFVFX01BU0spOworCQlpZihuZXdfZGliID09IE5VTEwpIHsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJLy8gY29weSBtZXRhZGF0YSBmcm9tIHNyYyB0byBkc3QKKwkJRnJlZUltYWdlX0Nsb25lTWV0YWRhdGEobmV3X2RpYiwgZGliKTsKKworCQljb25zdCB1bnNpZ25lZCBzcmNfcGl0Y2ggPSBGcmVlSW1hZ2VfR2V0UGl0Y2goZGliKTsKKwkJY29uc3QgdW5zaWduZWQgZHN0X3BpdGNoID0gRnJlZUltYWdlX0dldFBpdGNoKG5ld19kaWIpOworCQljb25zdCBCWVRFICpzcmNfYml0cyA9IEZyZWVJbWFnZV9HZXRCaXRzKGRpYik7CisJCUJZVEUgKmRzdF9iaXRzID0gRnJlZUltYWdlX0dldEJpdHMobmV3X2RpYik7CisJCWZvciAoaW50IHJvd3MgPSAwOyByb3dzIDwgaGVpZ2h0OyByb3dzKyspIHsKKwkJCWNvbnN0IEZJUkdCMTYgKnNyY19waXhlbCA9IChGSVJHQjE2KilzcmNfYml0czsKKwkJCVJHQlRSSVBMRSAqZHN0X3BpeGVsID0gKFJHQlRSSVBMRSopZHN0X2JpdHM7CisJCQlmb3IoaW50IGNvbHMgPSAwOyBjb2xzIDwgd2lkdGg7IGNvbHMrKykgeworCQkJCWRzdF9waXhlbFtjb2xzXS5yZ2J0UmVkICAgPSAoQllURSkoc3JjX3BpeGVsW2NvbHNdLnJlZCAgID4+IDgpOworCQkJCWRzdF9waXhlbFtjb2xzXS5yZ2J0R3JlZW4gPSAoQllURSkoc3JjX3BpeGVsW2NvbHNdLmdyZWVuID4+IDgpOworCQkJCWRzdF9waXhlbFtjb2xzXS5yZ2J0Qmx1ZSAgPSAoQllURSkoc3JjX3BpeGVsW2NvbHNdLmJsdWUgID4+IDgpOworCQkJfQorCQkJc3JjX2JpdHMgKz0gc3JjX3BpdGNoOworCQkJZHN0X2JpdHMgKz0gZHN0X3BpdGNoOworCQl9CisKKwkJcmV0dXJuIG5ld19kaWI7CisKKwl9IGVsc2UgaWYoaW1hZ2VfdHlwZSA9PSBGSVRfUkdCQTE2KSB7CisJCUZJQklUTUFQICpuZXdfZGliID0gRnJlZUltYWdlX0FsbG9jYXRlKHdpZHRoLCBoZWlnaHQsIDI0LCBGSV9SR0JBX1JFRF9NQVNLLCBGSV9SR0JBX0dSRUVOX01BU0ssIEZJX1JHQkFfQkxVRV9NQVNLKTsKKwkJaWYobmV3X2RpYiA9PSBOVUxMKSB7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCS8vIGNvcHkgbWV0YWRhdGEgZnJvbSBzcmMgdG8gZHN0CisJCUZyZWVJbWFnZV9DbG9uZU1ldGFkYXRhKG5ld19kaWIsIGRpYik7CisKKwkJY29uc3QgdW5zaWduZWQgc3JjX3BpdGNoID0gRnJlZUltYWdlX0dldFBpdGNoKGRpYik7CisJCWNvbnN0IHVuc2lnbmVkIGRzdF9waXRjaCA9IEZyZWVJbWFnZV9HZXRQaXRjaChuZXdfZGliKTsKKwkJY29uc3QgQllURSAqc3JjX2JpdHMgPSBGcmVlSW1hZ2VfR2V0Qml0cyhkaWIpOworCQlCWVRFICpkc3RfYml0cyA9IEZyZWVJbWFnZV9HZXRCaXRzKG5ld19kaWIpOworCQlmb3IgKGludCByb3dzID0gMDsgcm93cyA8IGhlaWdodDsgcm93cysrKSB7CisJCQljb25zdCBGSVJHQkExNiAqc3JjX3BpeGVsID0gKEZJUkdCQTE2KilzcmNfYml0czsKKwkJCVJHQlRSSVBMRSAqZHN0X3BpeGVsID0gKFJHQlRSSVBMRSopZHN0X2JpdHM7CisJCQlmb3IoaW50IGNvbHMgPSAwOyBjb2xzIDwgd2lkdGg7IGNvbHMrKykgeworCQkJCWRzdF9waXhlbFtjb2xzXS5yZ2J0UmVkICAgPSAoQllURSkoc3JjX3BpeGVsW2NvbHNdLnJlZCAgID4+IDgpOworCQkJCWRzdF9waXhlbFtjb2xzXS5yZ2J0R3JlZW4gPSAoQllURSkoc3JjX3BpeGVsW2NvbHNdLmdyZWVuID4+IDgpOworCQkJCWRzdF9waXhlbFtjb2xzXS5yZ2J0Qmx1ZSAgPSAoQllURSkoc3JjX3BpeGVsW2NvbHNdLmJsdWUgID4+IDgpOworCQkJfQorCQkJc3JjX2JpdHMgKz0gc3JjX3BpdGNoOworCQkJZHN0X2JpdHMgKz0gZHN0X3BpdGNoOworCQl9CQkKKworCQlyZXR1cm4gbmV3X2RpYjsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvQ29udmVyc2lvbjMyLmNwcCBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvQ29udmVyc2lvbjMyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODc0ZGNmCi0tLSAvZGV2L251bGwKKysrIGIvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9Db252ZXJzaW9uMzIuY3BwCkBAIC0wLDAgKzEsMzQ1IEBACisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBCaXRtYXAgY29udmVyc2lvbiByb3V0aW5lcworLy8KKy8vIERlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gYnkKKy8vIC0gRmxvcmlzIHZhbiBkZW4gQmVyZyAoZmx2ZGJlcmdAd3hzLm5sKQorLy8gLSBIZXJ26SBEcm9sb24gKGRyb2xvbkBpbmZvbmllLmZyKQorLy8gLSBKYW5pIEthamFsYSAoamFuaWtAcmVtZWR5LmZpKQorLy8gLSBEZXRsZXYgVmVuZHQgKGRldGxldi52ZW5kdEBicmlsbGl0LmRlKQorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZyZWVJbWFnZSAzCisvLworLy8gQ09WRVJFRCBDT0RFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZCisvLyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUworLy8gVEhBVCBUSEUgQ09WRVJFRCBDT0RFIElTIEZSRUUgT0YgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisvLyBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRAorLy8gQ09ERSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVAorLy8gVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GIEFOWSBORUNFU1NBUlkKKy8vIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwKKy8vIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIKKy8vIFRISVMgRElTQ0xBSU1FUi4KKy8vCisvLyBVc2UgYXQgeW91ciBvd24gcmlzayEKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2luY2x1ZGUgIkZyZWVJbWFnZS5oIgorI2luY2x1ZGUgIlV0aWxpdGllcy5oIgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgaW50ZXJuYWwgY29udmVyc2lvbnMgWCB0byAzMiBiaXRzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgRExMX0NBTExDT05WCitGcmVlSW1hZ2VfQ29udmVydExpbmUxVG8zMihCWVRFICp0YXJnZXQsIEJZVEUgKnNvdXJjZSwgaW50IHdpZHRoX2luX3BpeGVscywgUkdCUVVBRCAqcGFsZXR0ZSkgeworCWZvciAoaW50IGNvbHMgPSAwOyBjb2xzIDwgd2lkdGhfaW5fcGl4ZWxzOyBjb2xzKyspIHsKKwkJaW50IGluZGV4ID0gKHNvdXJjZVtjb2xzPj4zXSAmICgweDgwID4+IChjb2xzICYgMHgwNykpKSAhPSAwID8gMSA6IDA7CisKKwkJdGFyZ2V0W0ZJX1JHQkFfQkxVRV0JPSBwYWxldHRlW2luZGV4XS5yZ2JCbHVlOworCQl0YXJnZXRbRklfUkdCQV9HUkVFTl0JPSBwYWxldHRlW2luZGV4XS5yZ2JHcmVlbjsKKwkJdGFyZ2V0W0ZJX1JHQkFfUkVEXQkJPSBwYWxldHRlW2luZGV4XS5yZ2JSZWQ7CisJCXRhcmdldFtGSV9SR0JBX0FMUEhBXQk9IDB4RkY7CisJCXRhcmdldCArPSA0OworCX0JCit9CisKK3ZvaWQgRExMX0NBTExDT05WCitGcmVlSW1hZ2VfQ29udmVydExpbmU0VG8zMihCWVRFICp0YXJnZXQsIEJZVEUgKnNvdXJjZSwgaW50IHdpZHRoX2luX3BpeGVscywgUkdCUVVBRCAqcGFsZXR0ZSkgeworCUJPT0wgbG93X25pYmJsZSA9IEZBTFNFOworCWludCB4ID0gMDsKKworCWZvciAoaW50IGNvbHMgPSAwIDsgY29scyA8IHdpZHRoX2luX3BpeGVscyA7ICsrY29scykgeworCQlpZiAobG93X25pYmJsZSkgeworCQkJdGFyZ2V0W0ZJX1JHQkFfQkxVRV0JPSBwYWxldHRlW0xPV05JQkJMRShzb3VyY2VbeF0pXS5yZ2JCbHVlOworCQkJdGFyZ2V0W0ZJX1JHQkFfR1JFRU5dCT0gcGFsZXR0ZVtMT1dOSUJCTEUoc291cmNlW3hdKV0ucmdiR3JlZW47CisJCQl0YXJnZXRbRklfUkdCQV9SRURdCQk9IHBhbGV0dGVbTE9XTklCQkxFKHNvdXJjZVt4XSldLnJnYlJlZDsKKworCQkJeCsrOworCQl9IGVsc2UgeworCQkJdGFyZ2V0W0ZJX1JHQkFfQkxVRV0JPSBwYWxldHRlW0hJTklCQkxFKHNvdXJjZVt4XSkgPj4gNF0ucmdiQmx1ZTsKKwkJCXRhcmdldFtGSV9SR0JBX0dSRUVOXQk9IHBhbGV0dGVbSElOSUJCTEUoc291cmNlW3hdKSA+PiA0XS5yZ2JHcmVlbjsKKwkJCXRhcmdldFtGSV9SR0JBX1JFRF0JCT0gcGFsZXR0ZVtISU5JQkJMRShzb3VyY2VbeF0pID4+IDRdLnJnYlJlZDsKKwkJfQorCisJCWxvd19uaWJibGUgPSAhbG93X25pYmJsZTsKKworCQl0YXJnZXRbRklfUkdCQV9BTFBIQV0gPSAweEZGOworCQl0YXJnZXQgKz0gNDsKKwl9Cit9CisKK3ZvaWQgRExMX0NBTExDT05WCitGcmVlSW1hZ2VfQ29udmVydExpbmU4VG8zMihCWVRFICp0YXJnZXQsIEJZVEUgKnNvdXJjZSwgaW50IHdpZHRoX2luX3BpeGVscywgUkdCUVVBRCAqcGFsZXR0ZSkgeworCWZvciAoaW50IGNvbHMgPSAwOyBjb2xzIDwgd2lkdGhfaW5fcGl4ZWxzOyBjb2xzKyspIHsKKwkJdGFyZ2V0W0ZJX1JHQkFfQkxVRV0JPSBwYWxldHRlW3NvdXJjZVtjb2xzXV0ucmdiQmx1ZTsKKwkJdGFyZ2V0W0ZJX1JHQkFfR1JFRU5dCT0gcGFsZXR0ZVtzb3VyY2VbY29sc11dLnJnYkdyZWVuOworCQl0YXJnZXRbRklfUkdCQV9SRURdCQk9IHBhbGV0dGVbc291cmNlW2NvbHNdXS5yZ2JSZWQ7CisJCXRhcmdldFtGSV9SR0JBX0FMUEhBXQk9IDB4RkY7CisJCXRhcmdldCArPSA0OworCX0KK30KKwordm9pZCBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9Db252ZXJ0TGluZTE2VG8zMl81NTUoQllURSAqdGFyZ2V0LCBCWVRFICpzb3VyY2UsIGludCB3aWR0aF9pbl9waXhlbHMpIHsKKwlXT1JEICpiaXRzID0gKFdPUkQgKilzb3VyY2U7CisKKwlmb3IgKGludCBjb2xzID0gMDsgY29scyA8IHdpZHRoX2luX3BpeGVsczsgY29scysrKSB7CisJCXRhcmdldFtGSV9SR0JBX1JFRF0gICA9IChCWVRFKSgoKChiaXRzW2NvbHNdICYgRkkxNl81NTVfUkVEX01BU0spID4+IEZJMTZfNTU1X1JFRF9TSElGVCkgKiAweEZGKSAvIDB4MUYpOworCQl0YXJnZXRbRklfUkdCQV9HUkVFTl0gPSAoQllURSkoKCgoYml0c1tjb2xzXSAmIEZJMTZfNTU1X0dSRUVOX01BU0spID4+IEZJMTZfNTU1X0dSRUVOX1NISUZUKSAqIDB4RkYpIC8gMHgxRik7CisJCXRhcmdldFtGSV9SR0JBX0JMVUVdICA9IChCWVRFKSgoKChiaXRzW2NvbHNdICYgRkkxNl81NTVfQkxVRV9NQVNLKSA+PiBGSTE2XzU1NV9CTFVFX1NISUZUKSAqIDB4RkYpIC8gMHgxRik7CisJCXRhcmdldFtGSV9SR0JBX0FMUEhBXSA9IDB4RkY7CisJCXRhcmdldCArPSA0OworCX0KK30KKwordm9pZCBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9Db252ZXJ0TGluZTE2VG8zMl81NjUoQllURSAqdGFyZ2V0LCBCWVRFICpzb3VyY2UsIGludCB3aWR0aF9pbl9waXhlbHMpIHsKKwlXT1JEICpiaXRzID0gKFdPUkQgKilzb3VyY2U7CisKKwlmb3IgKGludCBjb2xzID0gMDsgY29scyA8IHdpZHRoX2luX3BpeGVsczsgY29scysrKSB7CisJCXRhcmdldFtGSV9SR0JBX1JFRF0gICA9IChCWVRFKSgoKChiaXRzW2NvbHNdICYgRkkxNl81NjVfUkVEX01BU0spID4+IEZJMTZfNTY1X1JFRF9TSElGVCkgKiAweEZGKSAvIDB4MUYpOworCQl0YXJnZXRbRklfUkdCQV9HUkVFTl0gPSAoQllURSkoKCgoYml0c1tjb2xzXSAmIEZJMTZfNTY1X0dSRUVOX01BU0spID4+IEZJMTZfNTY1X0dSRUVOX1NISUZUKSAqIDB4RkYpIC8gMHgzRik7CisJCXRhcmdldFtGSV9SR0JBX0JMVUVdICA9IChCWVRFKSgoKChiaXRzW2NvbHNdICYgRkkxNl81NjVfQkxVRV9NQVNLKSA+PiBGSTE2XzU2NV9CTFVFX1NISUZUKSAqIDB4RkYpIC8gMHgxRik7CisJCXRhcmdldFtGSV9SR0JBX0FMUEhBXSA9IDB4RkY7CisJCXRhcmdldCArPSA0OworCX0KK30KKy8qCit2b2lkIERMTF9DQUxMQ09OVgorRnJlZUltYWdlX0NvbnZlcnRMaW5lMjRUbzMyKEJZVEUgKnRhcmdldCwgQllURSAqc291cmNlLCBpbnQgd2lkdGhfaW5fcGl4ZWxzKSB7CisJZm9yIChpbnQgY29scyA9IDA7IGNvbHMgPCB3aWR0aF9pbl9waXhlbHM7IGNvbHMrKykgeworCQkqKERXT1JEICopdGFyZ2V0ID0gKCooRFdPUkQgKikgc291cmNlICYgRklfUkdCQV9SR0JfTUFTSykgfCBGSV9SR0JBX0FMUEhBX01BU0s7CisJCXRhcmdldCArPSA0OworCQlzb3VyY2UgKz0gMzsKKwl9Cit9CisqLworLyoqCitUaGlzIHVub3B0aW1pemVkIHZlcnNpb24gb2YgdGhlIGNvbnZlcnNpb24gZnVuY3Rpb24gYXZvaWQgYW4gdW5kZXRlcm1pbmVkIGJ1ZyB3aXRoIFZDKysgU1A2LiAKK1RoZSBidWcgb2NjdXJzIGluIHJlbGVhc2UgbW9kZSBvbmx5LCB3aGVuIHRoZSBpbWFnZSBoZWlnaHQgaXMgZXF1YWwgdG8gNTM3IAorKHRyeSBlLmcuIGEgc2l6ZSBvZiA0MzJ4NTM3IHRvIHJlcHJvZHVjZSB0aGUgYnVnIHdpdGggdGhlIG9wdGltaXplZCBmdW5jdGlvbikuCisqLwordm9pZCBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9Db252ZXJ0TGluZTI0VG8zMihCWVRFICp0YXJnZXQsIEJZVEUgKnNvdXJjZSwgaW50IHdpZHRoX2luX3BpeGVscykgeworCWZvciAoaW50IGNvbHMgPSAwOyBjb2xzIDwgd2lkdGhfaW5fcGl4ZWxzOyBjb2xzKyspIHsKKwkJdGFyZ2V0W0ZJX1JHQkFfUkVEXSAgID0gc291cmNlW0ZJX1JHQkFfUkVEXTsKKwkJdGFyZ2V0W0ZJX1JHQkFfR1JFRU5dID0gc291cmNlW0ZJX1JHQkFfR1JFRU5dOworCQl0YXJnZXRbRklfUkdCQV9CTFVFXSAgPSBzb3VyY2VbRklfUkdCQV9CTFVFXTsKKwkJdGFyZ2V0W0ZJX1JHQkFfQUxQSEFdID0gMHhGRjsKKwkJdGFyZ2V0ICs9IDQ7CisJCXNvdXJjZSArPSAzOworCX0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbmxpbmUgdm9pZCAKK0ZyZWVJbWFnZV9Db252ZXJ0TGluZTFUbzMyTWFwVHJhbnNwYXJlbmN5KEJZVEUgKnRhcmdldCwgQllURSAqc291cmNlLCBpbnQgd2lkdGhfaW5fcGl4ZWxzLCBSR0JRVUFEICpwYWxldHRlLCBCWVRFICp0YWJsZSwgaW50IHRyYW5zcGFyZW50X3BpeGVscykgeworCWZvciAoaW50IGNvbHMgPSAwOyBjb2xzIDwgd2lkdGhfaW5fcGl4ZWxzOyBjb2xzKyspIHsKKwkJaW50IGluZGV4ID0gKHNvdXJjZVtjb2xzPj4zXSAmICgweDgwID4+IChjb2xzICYgMHgwNykpKSAhPSAwID8gMSA6IDA7CisKKwkJdGFyZ2V0W0ZJX1JHQkFfQkxVRV0JPSBwYWxldHRlW2luZGV4XS5yZ2JCbHVlOworCQl0YXJnZXRbRklfUkdCQV9HUkVFTl0JPSBwYWxldHRlW2luZGV4XS5yZ2JHcmVlbjsKKwkJdGFyZ2V0W0ZJX1JHQkFfUkVEXQkJPSBwYWxldHRlW2luZGV4XS5yZ2JSZWQ7CisJCXRhcmdldFtGSV9SR0JBX0FMUEhBXSA9IChpbmRleCA8IHRyYW5zcGFyZW50X3BpeGVscykgPyB0YWJsZVtpbmRleF0gOiAyNTU7CQkKKwkJdGFyZ2V0ICs9IDQ7CisJfQkKK30KKworaW5saW5lIHZvaWQgCitGcmVlSW1hZ2VfQ29udmVydExpbmU0VG8zMk1hcFRyYW5zcGFyZW5jeShCWVRFICp0YXJnZXQsIEJZVEUgKnNvdXJjZSwgaW50IHdpZHRoX2luX3BpeGVscywgUkdCUVVBRCAqcGFsZXR0ZSwgQllURSAqdGFibGUsIGludCB0cmFuc3BhcmVudF9waXhlbHMpIHsKKwlCT09MIGxvd19uaWJibGUgPSBGQUxTRTsKKwlpbnQgeCA9IDA7CisKKwlmb3IgKGludCBjb2xzID0gMCA7IGNvbHMgPCB3aWR0aF9pbl9waXhlbHMgOyArK2NvbHMpIHsKKwkJaWYgKGxvd19uaWJibGUpIHsKKwkJCXRhcmdldFtGSV9SR0JBX0JMVUVdCT0gcGFsZXR0ZVtMT1dOSUJCTEUoc291cmNlW3hdKV0ucmdiQmx1ZTsKKwkJCXRhcmdldFtGSV9SR0JBX0dSRUVOXQk9IHBhbGV0dGVbTE9XTklCQkxFKHNvdXJjZVt4XSldLnJnYkdyZWVuOworCQkJdGFyZ2V0W0ZJX1JHQkFfUkVEXQkJPSBwYWxldHRlW0xPV05JQkJMRShzb3VyY2VbeF0pXS5yZ2JSZWQ7CisJCQl0YXJnZXRbRklfUkdCQV9BTFBIQV0JPSAoTE9XTklCQkxFKHNvdXJjZVt4XSkgPCB0cmFuc3BhcmVudF9waXhlbHMpID8gdGFibGVbTE9XTklCQkxFKHNvdXJjZVt4XSldIDogMjU1OworCisJCQl4Kys7CisJCX0gZWxzZSB7CisJCQl0YXJnZXRbRklfUkdCQV9CTFVFXQk9IHBhbGV0dGVbSElOSUJCTEUoc291cmNlW3hdKSA+PiA0XS5yZ2JCbHVlOworCQkJdGFyZ2V0W0ZJX1JHQkFfR1JFRU5dCT0gcGFsZXR0ZVtISU5JQkJMRShzb3VyY2VbeF0pID4+IDRdLnJnYkdyZWVuOworCQkJdGFyZ2V0W0ZJX1JHQkFfUkVEXQkJPSBwYWxldHRlW0hJTklCQkxFKHNvdXJjZVt4XSkgPj4gNF0ucmdiUmVkOworCQkJdGFyZ2V0W0ZJX1JHQkFfQUxQSEFdCT0gKEhJTklCQkxFKHNvdXJjZVt4XSA+PiA0KSA8IHRyYW5zcGFyZW50X3BpeGVscykgPyB0YWJsZVtISU5JQkJMRShzb3VyY2VbeF0pID4+IDRdIDogMjU1OworCQl9CisKKwkJbG93X25pYmJsZSA9ICFsb3dfbmliYmxlOworCQkJCQorCQl0YXJnZXQgKz0gNDsKKwl9Cit9CisKK2lubGluZSB2b2lkIAorRnJlZUltYWdlX0NvbnZlcnRMaW5lOFRvMzJNYXBUcmFuc3BhcmVuY3koQllURSAqdGFyZ2V0LCBCWVRFICpzb3VyY2UsIGludCB3aWR0aF9pbl9waXhlbHMsIFJHQlFVQUQgKnBhbGV0dGUsIEJZVEUgKnRhYmxlLCBpbnQgdHJhbnNwYXJlbnRfcGl4ZWxzKSB7CisJZm9yIChpbnQgY29scyA9IDA7IGNvbHMgPCB3aWR0aF9pbl9waXhlbHM7IGNvbHMrKykgeworCQl0YXJnZXRbRklfUkdCQV9CTFVFXQk9IHBhbGV0dGVbc291cmNlW2NvbHNdXS5yZ2JCbHVlOworCQl0YXJnZXRbRklfUkdCQV9HUkVFTl0JPSBwYWxldHRlW3NvdXJjZVtjb2xzXV0ucmdiR3JlZW47CisJCXRhcmdldFtGSV9SR0JBX1JFRF0JCT0gcGFsZXR0ZVtzb3VyY2VbY29sc11dLnJnYlJlZDsKKwkJdGFyZ2V0W0ZJX1JHQkFfQUxQSEFdID0gKHNvdXJjZVtjb2xzXSA8IHRyYW5zcGFyZW50X3BpeGVscykgPyB0YWJsZVtzb3VyY2VbY29sc11dIDogMjU1OworCQl0YXJnZXQgKz0gNDsJCQorCX0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitGSUJJVE1BUCAqIERMTF9DQUxMQ09OVgorRnJlZUltYWdlX0NvbnZlcnRUbzMyQml0cyhGSUJJVE1BUCAqZGliKSB7CisJaWYoIUZyZWVJbWFnZV9IYXNQaXhlbHMoZGliKSkgcmV0dXJuIE5VTEw7CisKKwljb25zdCBpbnQgYnBwID0gRnJlZUltYWdlX0dldEJQUChkaWIpOworCWNvbnN0IEZSRUVfSU1BR0VfVFlQRSBpbWFnZV90eXBlID0gRnJlZUltYWdlX0dldEltYWdlVHlwZShkaWIpOworCQorCWlmKChpbWFnZV90eXBlICE9IEZJVF9CSVRNQVApICYmIChpbWFnZV90eXBlICE9IEZJVF9SR0IxNikgJiYgKGltYWdlX3R5cGUgIT0gRklUX1JHQkExNikpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCQorCWNvbnN0IGludCB3aWR0aCA9IEZyZWVJbWFnZV9HZXRXaWR0aChkaWIpOworCWNvbnN0IGludCBoZWlnaHQgPSBGcmVlSW1hZ2VfR2V0SGVpZ2h0KGRpYik7CisKKwlpZihpbWFnZV90eXBlID09IEZJVF9CSVRNQVApIHsKKworCQlpZihicHAgPT0gMzIpIHsKKwkJCXJldHVybiBGcmVlSW1hZ2VfQ2xvbmUoZGliKTsKKwkJfQorCisJCUZJQklUTUFQICpuZXdfZGliID0gRnJlZUltYWdlX0FsbG9jYXRlKHdpZHRoLCBoZWlnaHQsIDMyLCBGSV9SR0JBX1JFRF9NQVNLLCBGSV9SR0JBX0dSRUVOX01BU0ssIEZJX1JHQkFfQkxVRV9NQVNLKTsKKwkJaWYobmV3X2RpYiA9PSBOVUxMKSB7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCS8vIGNvcHkgbWV0YWRhdGEgZnJvbSBzcmMgdG8gZHN0CisJCUZyZWVJbWFnZV9DbG9uZU1ldGFkYXRhKG5ld19kaWIsIGRpYik7CisKKwkJQk9PTCBiSXNUcmFuc3BhcmVudCA9IEZyZWVJbWFnZV9Jc1RyYW5zcGFyZW50KGRpYik7CisKKwkJc3dpdGNoKGJwcCkgeworCQkJY2FzZSAxOgorCQkJeworCQkJCWlmKGJJc1RyYW5zcGFyZW50KSB7CisJCQkJCWZvciAoaW50IHJvd3MgPSAwOyByb3dzIDwgaGVpZ2h0OyByb3dzKyspIHsKKwkJCQkJCUZyZWVJbWFnZV9Db252ZXJ0TGluZTFUbzMyTWFwVHJhbnNwYXJlbmN5KEZyZWVJbWFnZV9HZXRTY2FuTGluZShuZXdfZGliLCByb3dzKSwgRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgcm93cyksIHdpZHRoLCBGcmVlSW1hZ2VfR2V0UGFsZXR0ZShkaWIpLCBGcmVlSW1hZ2VfR2V0VHJhbnNwYXJlbmN5VGFibGUoZGliKSwgRnJlZUltYWdlX0dldFRyYW5zcGFyZW5jeUNvdW50KGRpYikpOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJZm9yIChpbnQgcm93cyA9IDA7IHJvd3MgPCBoZWlnaHQ7IHJvd3MrKykgeworCQkJCQkJRnJlZUltYWdlX0NvbnZlcnRMaW5lMVRvMzIoRnJlZUltYWdlX0dldFNjYW5MaW5lKG5ld19kaWIsIHJvd3MpLCBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCByb3dzKSwgd2lkdGgsIEZyZWVJbWFnZV9HZXRQYWxldHRlKGRpYikpOworCQkJCQl9CQkJCQkKKwkJCQl9CisKKwkJCQlyZXR1cm4gbmV3X2RpYjsKKwkJCX0KKworCQkJY2FzZSA0OgorCQkJeworCQkJCWlmKGJJc1RyYW5zcGFyZW50KSB7CisJCQkJCWZvciAoaW50IHJvd3MgPSAwOyByb3dzIDwgaGVpZ2h0OyByb3dzKyspIHsKKwkJCQkJCUZyZWVJbWFnZV9Db252ZXJ0TGluZTRUbzMyTWFwVHJhbnNwYXJlbmN5KEZyZWVJbWFnZV9HZXRTY2FuTGluZShuZXdfZGliLCByb3dzKSwgRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgcm93cyksIHdpZHRoLCBGcmVlSW1hZ2VfR2V0UGFsZXR0ZShkaWIpLCBGcmVlSW1hZ2VfR2V0VHJhbnNwYXJlbmN5VGFibGUoZGliKSwgRnJlZUltYWdlX0dldFRyYW5zcGFyZW5jeUNvdW50KGRpYikpOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJZm9yIChpbnQgcm93cyA9IDA7IHJvd3MgPCBoZWlnaHQ7IHJvd3MrKykgeworCQkJCQkJRnJlZUltYWdlX0NvbnZlcnRMaW5lNFRvMzIoRnJlZUltYWdlX0dldFNjYW5MaW5lKG5ld19kaWIsIHJvd3MpLCBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCByb3dzKSwgd2lkdGgsIEZyZWVJbWFnZV9HZXRQYWxldHRlKGRpYikpOworCQkJCQl9CQkJCQkKKwkJCQl9CisKKwkJCQlyZXR1cm4gbmV3X2RpYjsKKwkJCX0KKwkJCQkKKwkJCWNhc2UgODoKKwkJCXsKKwkJCQlpZihiSXNUcmFuc3BhcmVudCkgeworCQkJCQlmb3IgKGludCByb3dzID0gMDsgcm93cyA8IGhlaWdodDsgcm93cysrKSB7CisJCQkJCQlGcmVlSW1hZ2VfQ29udmVydExpbmU4VG8zMk1hcFRyYW5zcGFyZW5jeShGcmVlSW1hZ2VfR2V0U2NhbkxpbmUobmV3X2RpYiwgcm93cyksIEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIHJvd3MpLCB3aWR0aCwgRnJlZUltYWdlX0dldFBhbGV0dGUoZGliKSwgRnJlZUltYWdlX0dldFRyYW5zcGFyZW5jeVRhYmxlKGRpYiksIEZyZWVJbWFnZV9HZXRUcmFuc3BhcmVuY3lDb3VudChkaWIpKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWZvciAoaW50IHJvd3MgPSAwOyByb3dzIDwgaGVpZ2h0OyByb3dzKyspIHsKKwkJCQkJCUZyZWVJbWFnZV9Db252ZXJ0TGluZThUbzMyKEZyZWVJbWFnZV9HZXRTY2FuTGluZShuZXdfZGliLCByb3dzKSwgRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgcm93cyksIHdpZHRoLCBGcmVlSW1hZ2VfR2V0UGFsZXR0ZShkaWIpKTsKKwkJCQkJfQkJCQkJCisJCQkJfQorCisJCQkJcmV0dXJuIG5ld19kaWI7CisJCQl9CisKKwkJCWNhc2UgMTY6CisJCQl7CisJCQkJZm9yIChpbnQgcm93cyA9IDA7IHJvd3MgPCBoZWlnaHQ7IHJvd3MrKykgeworCQkJCQlpZiAoKEZyZWVJbWFnZV9HZXRSZWRNYXNrKGRpYikgPT0gRkkxNl81NjVfUkVEX01BU0spICYmIChGcmVlSW1hZ2VfR2V0R3JlZW5NYXNrKGRpYikgPT0gRkkxNl81NjVfR1JFRU5fTUFTSykgJiYgKEZyZWVJbWFnZV9HZXRCbHVlTWFzayhkaWIpID09IEZJMTZfNTY1X0JMVUVfTUFTSykpIHsKKwkJCQkJCUZyZWVJbWFnZV9Db252ZXJ0TGluZTE2VG8zMl81NjUoRnJlZUltYWdlX0dldFNjYW5MaW5lKG5ld19kaWIsIHJvd3MpLCBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCByb3dzKSwgd2lkdGgpOworCQkJCQl9IGVsc2UgeworCQkJCQkJLy8gaW5jbHVkZXMgY2FzZSB3aGVyZSBhbGwgdGhlIG1hc2tzIGFyZSAwCisJCQkJCQlGcmVlSW1hZ2VfQ29udmVydExpbmUxNlRvMzJfNTU1KEZyZWVJbWFnZV9HZXRTY2FuTGluZShuZXdfZGliLCByb3dzKSwgRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgcm93cyksIHdpZHRoKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCXJldHVybiBuZXdfZGliOworCQkJfQorCisJCQljYXNlIDI0OgorCQkJeworCQkJCWZvciAoaW50IHJvd3MgPSAwOyByb3dzIDwgaGVpZ2h0OyByb3dzKyspIHsKKwkJCQkJRnJlZUltYWdlX0NvbnZlcnRMaW5lMjRUbzMyKEZyZWVJbWFnZV9HZXRTY2FuTGluZShuZXdfZGliLCByb3dzKSwgRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgcm93cyksIHdpZHRoKTsKKwkJCQl9CisKKwkJCQlyZXR1cm4gbmV3X2RpYjsKKwkJCX0KKwkJfQorCisJfSBlbHNlIGlmKGltYWdlX3R5cGUgPT0gRklUX1JHQjE2KSB7CisJCUZJQklUTUFQICpuZXdfZGliID0gRnJlZUltYWdlX0FsbG9jYXRlKHdpZHRoLCBoZWlnaHQsIDMyLCBGSV9SR0JBX1JFRF9NQVNLLCBGSV9SR0JBX0dSRUVOX01BU0ssIEZJX1JHQkFfQkxVRV9NQVNLKTsKKwkJaWYobmV3X2RpYiA9PSBOVUxMKSB7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCS8vIGNvcHkgbWV0YWRhdGEgZnJvbSBzcmMgdG8gZHN0CisJCUZyZWVJbWFnZV9DbG9uZU1ldGFkYXRhKG5ld19kaWIsIGRpYik7CisKKwkJY29uc3QgdW5zaWduZWQgc3JjX3BpdGNoID0gRnJlZUltYWdlX0dldFBpdGNoKGRpYik7CisJCWNvbnN0IHVuc2lnbmVkIGRzdF9waXRjaCA9IEZyZWVJbWFnZV9HZXRQaXRjaChuZXdfZGliKTsKKwkJY29uc3QgQllURSAqc3JjX2JpdHMgPSBGcmVlSW1hZ2VfR2V0Qml0cyhkaWIpOworCQlCWVRFICpkc3RfYml0cyA9IEZyZWVJbWFnZV9HZXRCaXRzKG5ld19kaWIpOworCQlmb3IgKGludCByb3dzID0gMDsgcm93cyA8IGhlaWdodDsgcm93cysrKSB7CisJCQljb25zdCBGSVJHQjE2ICpzcmNfcGl4ZWwgPSAoRklSR0IxNiopc3JjX2JpdHM7CisJCQlSR0JRVUFEICpkc3RfcGl4ZWwgPSAoUkdCUVVBRCopZHN0X2JpdHM7CisJCQlmb3IoaW50IGNvbHMgPSAwOyBjb2xzIDwgd2lkdGg7IGNvbHMrKykgeworCQkJCWRzdF9waXhlbFtjb2xzXS5yZ2JSZWQJCT0gKEJZVEUpKHNyY19waXhlbFtjb2xzXS5yZWQgICA+PiA4KTsKKwkJCQlkc3RfcGl4ZWxbY29sc10ucmdiR3JlZW4JPSAoQllURSkoc3JjX3BpeGVsW2NvbHNdLmdyZWVuID4+IDgpOworCQkJCWRzdF9waXhlbFtjb2xzXS5yZ2JCbHVlCQk9IChCWVRFKShzcmNfcGl4ZWxbY29sc10uYmx1ZSAgPj4gOCk7CisJCQkJZHN0X3BpeGVsW2NvbHNdLnJnYlJlc2VydmVkID0gKEJZVEUpMHhGRjsKKwkJCX0KKwkJCXNyY19iaXRzICs9IHNyY19waXRjaDsKKwkJCWRzdF9iaXRzICs9IGRzdF9waXRjaDsKKwkJfQorCisJCXJldHVybiBuZXdfZGliOworCisJfSBlbHNlIGlmKGltYWdlX3R5cGUgPT0gRklUX1JHQkExNikgeworCQlGSUJJVE1BUCAqbmV3X2RpYiA9IEZyZWVJbWFnZV9BbGxvY2F0ZSh3aWR0aCwgaGVpZ2h0LCAzMiwgRklfUkdCQV9SRURfTUFTSywgRklfUkdCQV9HUkVFTl9NQVNLLCBGSV9SR0JBX0JMVUVfTUFTSyk7CisJCWlmKG5ld19kaWIgPT0gTlVMTCkgeworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQkvLyBjb3B5IG1ldGFkYXRhIGZyb20gc3JjIHRvIGRzdAorCQlGcmVlSW1hZ2VfQ2xvbmVNZXRhZGF0YShuZXdfZGliLCBkaWIpOworCisJCWNvbnN0IHVuc2lnbmVkIHNyY19waXRjaCA9IEZyZWVJbWFnZV9HZXRQaXRjaChkaWIpOworCQljb25zdCB1bnNpZ25lZCBkc3RfcGl0Y2ggPSBGcmVlSW1hZ2VfR2V0UGl0Y2gobmV3X2RpYik7CisJCWNvbnN0IEJZVEUgKnNyY19iaXRzID0gRnJlZUltYWdlX0dldEJpdHMoZGliKTsKKwkJQllURSAqZHN0X2JpdHMgPSBGcmVlSW1hZ2VfR2V0Qml0cyhuZXdfZGliKTsKKwkJZm9yIChpbnQgcm93cyA9IDA7IHJvd3MgPCBoZWlnaHQ7IHJvd3MrKykgeworCQkJY29uc3QgRklSR0JBMTYgKnNyY19waXhlbCA9IChGSVJHQkExNiopc3JjX2JpdHM7CisJCQlSR0JRVUFEICpkc3RfcGl4ZWwgPSAoUkdCUVVBRCopZHN0X2JpdHM7CisJCQlmb3IoaW50IGNvbHMgPSAwOyBjb2xzIDwgd2lkdGg7IGNvbHMrKykgeworCQkJCWRzdF9waXhlbFtjb2xzXS5yZ2JSZWQJCT0gKEJZVEUpKHNyY19waXhlbFtjb2xzXS5yZWQgICA+PiA4KTsKKwkJCQlkc3RfcGl4ZWxbY29sc10ucmdiR3JlZW4JPSAoQllURSkoc3JjX3BpeGVsW2NvbHNdLmdyZWVuID4+IDgpOworCQkJCWRzdF9waXhlbFtjb2xzXS5yZ2JCbHVlCQk9IChCWVRFKShzcmNfcGl4ZWxbY29sc10uYmx1ZSAgPj4gOCk7CisJCQkJZHN0X3BpeGVsW2NvbHNdLnJnYlJlc2VydmVkID0gKEJZVEUpKHNyY19waXhlbFtjb2xzXS5hbHBoYSA+PiA4KTsKKwkJCX0KKwkJCXNyY19iaXRzICs9IHNyY19waXRjaDsKKwkJCWRzdF9iaXRzICs9IGRzdF9waXRjaDsKKwkJfQkJCisKKwkJcmV0dXJuIG5ld19kaWI7CisJfQorCQorCXJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9Db252ZXJzaW9uNC5jcHAgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL0NvbnZlcnNpb240LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzA0OGI2Ci0tLSAvZGV2L251bGwKKysrIGIvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9Db252ZXJzaW9uNC5jcHAKQEAgLTAsMCArMSwyNDYgQEAKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEJpdG1hcCBjb252ZXJzaW9uIHJvdXRpbmVzCisvLworLy8gRGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBieQorLy8gLSBSaWxleSBNY05pZmYgKHJtY25pZmZAbWFyZXhncm91cC5jb20pCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRnJlZUltYWdlIDMKKy8vCisvLyBDT1ZFUkVEIENPREUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkKKy8vIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTCisvLyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy8vIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVECisvLyBDT0RFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UCisvLyBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWQorLy8gU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTAorLy8gUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUgorLy8gVEhJUyBESVNDTEFJTUVSLgorLy8KKy8vIFVzZSBhdCB5b3VyIG93biByaXNrIQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaW5jbHVkZSAiRnJlZUltYWdlLmgiCisjaW5jbHVkZSAiVXRpbGl0aWVzLmgiCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBpbnRlcm5hbCBjb252ZXJzaW9ucyBYIHRvIDQgYml0cworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIERMTF9DQUxMQ09OVgorRnJlZUltYWdlX0NvbnZlcnRMaW5lMVRvNChCWVRFICp0YXJnZXQsIEJZVEUgKnNvdXJjZSwgaW50IHdpZHRoX2luX3BpeGVscykgeworCUJPT0wgaGluaWJibGUgPSBUUlVFOworCWZvciAoaW50IGNvbHMgPSAwOyBjb2xzIDwgd2lkdGhfaW5fcGl4ZWxzOyBjb2xzKyspeworCQlpZiAoaGluaWJibGUgPT0gVFJVRSl7CisJCQl0YXJnZXRbY29scyA+PiAxXSA9ICgoc291cmNlW2NvbHMgPj4gM10gJiAoMHg4MCA+PiAoY29scyAmIDB4MDcpKSkgIT0gMCA/IDE1IDogMCkgPDwgNDsKKwkJfSAKKwkJZWxzZSB7CisJCQl0YXJnZXRbY29scyA+PiAxXSB8PSAoKHNvdXJjZVtjb2xzID4+IDNdICYgKDB4ODAgPj4gKGNvbHMgJiAweDA3KSkpICE9IDAgPyAxNSA6IDApOworCQl9CisKKwkJaGluaWJibGUgPSAhaGluaWJibGU7CisJfQorfQorCit2b2lkIERMTF9DQUxMQ09OVgorRnJlZUltYWdlX0NvbnZlcnRMaW5lOFRvNChCWVRFICp0YXJnZXQsIEJZVEUgKnNvdXJjZSwgaW50IHdpZHRoX2luX3BpeGVscywgUkdCUVVBRCAqcGFsZXR0ZSkgeworCUJPT0wgaGluaWJibGUgPSBUUlVFOworCUJZVEUgaW5kZXg7CisKKwlmb3IgKGludCBjb2xzID0gMDsgY29scyA8IHdpZHRoX2luX3BpeGVsczsgY29scysrKXsKKwkJaW5kZXggPSBHUkVZKHBhbGV0dGVbc291cmNlW2NvbHNdXS5yZ2JSZWQsIHBhbGV0dGVbc291cmNlW2NvbHNdXS5yZ2JHcmVlbiwgcGFsZXR0ZVtzb3VyY2VbY29sc11dLnJnYkJsdWUpOworCQlpZiAoaGluaWJibGUpIHsKKwkJCXRhcmdldFtjb2xzID4+IDFdID0gKGluZGV4ICYgMHhGMCk7CisJCX0gZWxzZSB7CisJCQl0YXJnZXRbY29scyA+PiAxXSB8PSAoaW5kZXggPj4gNCk7CisJCX0KKworCQloaW5pYmJsZSA9ICFoaW5pYmJsZTsKKwl9Cit9CisKK3ZvaWQgRExMX0NBTExDT05WCitGcmVlSW1hZ2VfQ29udmVydExpbmUxNlRvNF81NTUoQllURSAqdGFyZ2V0LCBCWVRFICpzb3VyY2UsIGludCB3aWR0aF9pbl9waXhlbHMpIHsKKwlXT1JEICpiaXRzID0gKFdPUkQgKilzb3VyY2U7CisJQk9PTCBoaW5pYmJsZSA9IFRSVUU7CisKKwlmb3IgKGludCBjb2xzID0gMDsgY29scyA8IHdpZHRoX2luX3BpeGVsczsgY29scysrKSB7CisJCWlmIChoaW5pYmJsZSkgeworCQkJdGFyZ2V0W2NvbHMgPj4gMV0gPSBHUkVZKCgoKGJpdHNbY29sc10gJiBGSTE2XzU1NV9SRURfTUFTSykgPj4gRkkxNl81NTVfUkVEX1NISUZUKSAqIDB4RkYpIC8gMHgxRiwKKwkJCQkJCQkJKCgoYml0c1tjb2xzXSAmIEZJMTZfNTU1X0dSRUVOX01BU0spID4+IEZJMTZfNTU1X0dSRUVOX1NISUZUKSAqIDB4RkYpIC8gMHgxRiwKKwkJCQkJCQkJKCgoYml0c1tjb2xzXSAmIEZJMTZfNTU1X0JMVUVfTUFTSykgPj4gRkkxNl81NTVfQkxVRV9TSElGVCkgKiAweEZGKSAvIDB4MUYpCisJCQkJCQkJCSYgMHhGMDsKKwkJfSBlbHNlIHsKKwkJCXRhcmdldFtjb2xzID4+IDFdIHw9IEdSRVkoKCgoYml0c1tjb2xzXSAmIEZJMTZfNTU1X1JFRF9NQVNLKSA+PiBGSTE2XzU1NV9SRURfU0hJRlQpICogMHhGRikgLyAweDFGLAorCQkJCQkJCQkoKChiaXRzW2NvbHNdICYgRkkxNl81NTVfR1JFRU5fTUFTSykgPj4gRkkxNl81NTVfR1JFRU5fU0hJRlQpICogMHhGRikgLyAweDFGLAorCQkJCQkJCQkoKChiaXRzW2NvbHNdICYgRkkxNl81NTVfQkxVRV9NQVNLKSA+PiBGSTE2XzU1NV9CTFVFX1NISUZUKSAqIDB4RkYpIC8gMHgxRikKKwkJCQkJCQkJPj4gNDsKKwkJfQorCQkKKwkJaGluaWJibGUgPSAhaGluaWJibGU7CisJfQorfQorCit2b2lkIERMTF9DQUxMQ09OVgorRnJlZUltYWdlX0NvbnZlcnRMaW5lMTZUbzRfNTY1KEJZVEUgKnRhcmdldCwgQllURSAqc291cmNlLCBpbnQgd2lkdGhfaW5fcGl4ZWxzKSB7CisJV09SRCAqYml0cyA9IChXT1JEICopc291cmNlOworCUJPT0wgaGluaWJibGUgPSBUUlVFOworCisJZm9yIChpbnQgY29scyA9IDA7IGNvbHMgPCB3aWR0aF9pbl9waXhlbHM7IGNvbHMrKykgeworCQlpZiAoaGluaWJibGUpIHsKKwkJCXRhcmdldFtjb2xzID4+IDFdID0gR1JFWSgoKChiaXRzW2NvbHNdICYgRkkxNl81NjVfUkVEX01BU0spID4+IEZJMTZfNTY1X1JFRF9TSElGVCkgKiAweEZGKSAvIDB4MUYsCisJCQkJICAgICAgICAoKChiaXRzW2NvbHNdICYgRkkxNl81NjVfR1JFRU5fTUFTSykgPj4gRkkxNl81NjVfR1JFRU5fU0hJRlQpICogMHhGRikgLyAweDNGLAorCQkJCQkJKCgoYml0c1tjb2xzXSAmIEZJMTZfNTY1X0JMVUVfTUFTSykgPj4gRkkxNl81NjVfQkxVRV9TSElGVCkgKiAweEZGKSAvIDB4MUYpCisJCQkJCQkmIDB4RjA7CisJCX0gZWxzZSB7CisJCQl0YXJnZXRbY29scyA+PiAxXSB8PSBHUkVZKCgoKGJpdHNbY29sc10gJiBGSTE2XzU2NV9SRURfTUFTSykgPj4gRkkxNl81NjVfUkVEX1NISUZUKSAqIDB4RkYpIC8gMHgxRiwKKwkJCQkgICAgICAgICgoKGJpdHNbY29sc10gJiBGSTE2XzU2NV9HUkVFTl9NQVNLKSA+PiBGSTE2XzU2NV9HUkVFTl9TSElGVCkgKiAweEZGKSAvIDB4M0YsCisJCQkJCQkoKChiaXRzW2NvbHNdICYgRkkxNl81NjVfQkxVRV9NQVNLKSA+PiBGSTE2XzU2NV9CTFVFX1NISUZUKSAqIDB4RkYpIC8gMHgxRikKKwkJCQkJCT4+IDQ7CisJCX0KKworCQloaW5pYmJsZSA9ICFoaW5pYmJsZTsKKwl9Cit9CisKK3ZvaWQgRExMX0NBTExDT05WCitGcmVlSW1hZ2VfQ29udmVydExpbmUyNFRvNChCWVRFICp0YXJnZXQsIEJZVEUgKnNvdXJjZSwgaW50IHdpZHRoX2luX3BpeGVscykgeworCUJPT0wgaGluaWJibGUgPSBUUlVFOworCisJZm9yIChpbnQgY29scyA9IDA7IGNvbHMgPCB3aWR0aF9pbl9waXhlbHM7IGNvbHMrKykgeworCQlpZiAoaGluaWJibGUpIHsKKwkJCXRhcmdldFtjb2xzID4+IDFdID0gR1JFWShzb3VyY2VbRklfUkdCQV9SRURdLCBzb3VyY2VbRklfUkdCQV9HUkVFTl0sIHNvdXJjZVtGSV9SR0JBX0JMVUVdKSAmIDB4RjA7CisJCX0gZWxzZSB7CisJCQl0YXJnZXRbY29scyA+PiAxXSB8PSBHUkVZKHNvdXJjZVtGSV9SR0JBX1JFRF0sIHNvdXJjZVtGSV9SR0JBX0dSRUVOXSwgc291cmNlW0ZJX1JHQkFfQkxVRV0pID4+IDQ7CisJCX0KKworCQlzb3VyY2UgKz0gMzsKKwkJaGluaWJibGUgPSAhaGluaWJibGU7CisJfQorfQorCit2b2lkIERMTF9DQUxMQ09OVgorRnJlZUltYWdlX0NvbnZlcnRMaW5lMzJUbzQoQllURSAqdGFyZ2V0LCBCWVRFICpzb3VyY2UsIGludCB3aWR0aF9pbl9waXhlbHMpIHsKKwlCT09MIGhpbmliYmxlID0gVFJVRTsKKworCWZvciAoaW50IGNvbHMgPSAwOyBjb2xzIDwgd2lkdGhfaW5fcGl4ZWxzOyBjb2xzKyspIHsKKwkJaWYgKGhpbmliYmxlKSB7CisJCQl0YXJnZXRbY29scyA+PiAxXSA9IEdSRVkoc291cmNlW0ZJX1JHQkFfUkVEXSwgc291cmNlW0ZJX1JHQkFfR1JFRU5dLCBzb3VyY2VbRklfUkdCQV9CTFVFXSkgJiAweEYwOworCQl9IGVsc2UgeworCQkJdGFyZ2V0W2NvbHMgPj4gMV0gfD0gR1JFWShzb3VyY2VbRklfUkdCQV9SRURdLCBzb3VyY2VbRklfUkdCQV9HUkVFTl0sIHNvdXJjZVtGSV9SR0JBX0JMVUVdKSA+PiA0OworCQl9CisKKwkJc291cmNlICs9IDQ7CisJCWhpbmliYmxlID0gIWhpbmliYmxlOworCX0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICBzbWFydCBjb252ZXJ0IFggdG8gNCBiaXRzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0ZJQklUTUFQICogRExMX0NBTExDT05WCitGcmVlSW1hZ2VfQ29udmVydFRvNEJpdHMoRklCSVRNQVAgKmRpYikgeworCWlmKCFGcmVlSW1hZ2VfSGFzUGl4ZWxzKGRpYikpIHJldHVybiBOVUxMOworCisJY29uc3QgaW50IGJwcCA9IEZyZWVJbWFnZV9HZXRCUFAoZGliKTsKKworCWlmKGJwcCAhPSA0KSB7CisJCWNvbnN0IGludCB3aWR0aCAgPSBGcmVlSW1hZ2VfR2V0V2lkdGgoZGliKTsKKwkJY29uc3QgaW50IGhlaWdodCA9IEZyZWVJbWFnZV9HZXRIZWlnaHQoZGliKTsKKwkJRklCSVRNQVAgKm5ld19kaWIgPSBGcmVlSW1hZ2VfQWxsb2NhdGUod2lkdGgsIGhlaWdodCwgNCk7CisKKwkJaWYobmV3X2RpYiA9PSBOVUxMKSB7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCS8vIGNvcHkgbWV0YWRhdGEgZnJvbSBzcmMgdG8gZHN0CisJCUZyZWVJbWFnZV9DbG9uZU1ldGFkYXRhKG5ld19kaWIsIGRpYik7CisKKwkJLy8gQnVpbGQgYSBncmV5c2NhbGUgcGFsZXR0ZSAoKmFsd2F5cyogbmVlZGVkIGZvciBpbWFnZSBwcm9jZXNzaW5nKQorCisJCVJHQlFVQUQgKm5ld19wYWwgPSBGcmVlSW1hZ2VfR2V0UGFsZXR0ZShuZXdfZGliKTsKKworCQlmb3IoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQkJbmV3X3BhbFtpXS5yZ2JSZWQJPSAoQllURSkoKGkgPDwgNCkgKyBpKTsKKwkJCW5ld19wYWxbaV0ucmdiR3JlZW4gPSAoQllURSkoKGkgPDwgNCkgKyBpKTsKKwkJCW5ld19wYWxbaV0ucmdiQmx1ZQk9IChCWVRFKSgoaSA8PCA0KSArIGkpOworCQl9CisKKwkJc3dpdGNoKGJwcCkgeworCQkJY2FzZSAxOgorCQkJeworCQkJCWlmKEZyZWVJbWFnZV9HZXRDb2xvclR5cGUoZGliKSA9PSBGSUNfUEFMRVRURSkgeworCisJCQkJCS8vIENvcHkgdGhlIHBhbGV0dGUKKworCQkJCQlSR0JRVUFEICpvbGRfcGFsID0gRnJlZUltYWdlX0dldFBhbGV0dGUoZGliKTsKKwkJCQkJbWVtY3B5KCZuZXdfcGFsWzBdLCAmb2xkX3BhbFswXSwgc2l6ZW9mKFJHQlFVQUQpKTsKKwkJCQkJbWVtY3B5KCZuZXdfcGFsWzE1XSwgJm9sZF9wYWxbMV0sIHNpemVvZihSR0JRVUFEKSk7CisKKwkJCQl9CisJCQkJZWxzZSBpZihGcmVlSW1hZ2VfR2V0Q29sb3JUeXBlKGRpYikgPT0gRklDX01JTklTV0hJVEUpIHsKKwkJCQkJCisJCQkJCS8vIFJldmVyc2UgdGhlIGdyYXlzY2FsZSBwYWxldHRlCisKKwkJCQkJZm9yKGludCBpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJCQkJCW5ld19wYWxbaV0ucmdiUmVkID0gbmV3X3BhbFtpXS5yZ2JHcmVlbiA9IG5ld19wYWxbaV0ucmdiQmx1ZSA9IChCWVRFKSgyNTUgLSAoKGkgPDwgNCkgKyBpKSk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQkvLyBFeHBhbmQgYW5kIGNvcHkgdGhlIGJpdG1hcCBkYXRhCisKKwkJCQlmb3IgKGludCByb3dzID0gMDsgcm93cyA8IGhlaWdodDsgcm93cysrKSB7CisJCQkJCUZyZWVJbWFnZV9Db252ZXJ0TGluZTFUbzQoRnJlZUltYWdlX0dldFNjYW5MaW5lKG5ld19kaWIsIHJvd3MpLCBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCByb3dzKSwgd2lkdGgpOworCQkJCX0KKwkJCQlyZXR1cm4gbmV3X2RpYjsKKwkJCX0KKworCQkJY2FzZSA4IDoKKwkJCXsKKwkJCQkvLyBFeHBhbmQgYW5kIGNvcHkgdGhlIGJpdG1hcCBkYXRhCisKKwkJCQlmb3IgKGludCByb3dzID0gMDsgcm93cyA8IGhlaWdodDsgcm93cysrKSB7CisJCQkJCUZyZWVJbWFnZV9Db252ZXJ0TGluZThUbzQoRnJlZUltYWdlX0dldFNjYW5MaW5lKG5ld19kaWIsIHJvd3MpLCBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCByb3dzKSwgd2lkdGgsIEZyZWVJbWFnZV9HZXRQYWxldHRlKGRpYikpOworCQkJCX0KKwkJCQlyZXR1cm4gbmV3X2RpYjsKKwkJCX0KKworCQkJY2FzZSAxNiA6CisJCQl7CisJCQkJLy8gRXhwYW5kIGFuZCBjb3B5IHRoZSBiaXRtYXAgZGF0YQorCisJCQkJZm9yIChpbnQgcm93cyA9IDA7IHJvd3MgPCBoZWlnaHQ7IHJvd3MrKykgeworCQkJCQlpZiAoKEZyZWVJbWFnZV9HZXRSZWRNYXNrKGRpYikgPT0gRkkxNl81NjVfUkVEX01BU0spICYmIChGcmVlSW1hZ2VfR2V0R3JlZW5NYXNrKGRpYikgPT0gRkkxNl81NjVfR1JFRU5fTUFTSykgJiYgKEZyZWVJbWFnZV9HZXRCbHVlTWFzayhkaWIpID09IEZJMTZfNTY1X0JMVUVfTUFTSykpIHsKKwkJCQkJCUZyZWVJbWFnZV9Db252ZXJ0TGluZTE2VG80XzU2NShGcmVlSW1hZ2VfR2V0U2NhbkxpbmUobmV3X2RpYiwgcm93cyksIEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIHJvd3MpLCB3aWR0aCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlGcmVlSW1hZ2VfQ29udmVydExpbmUxNlRvNF81NTUoRnJlZUltYWdlX0dldFNjYW5MaW5lKG5ld19kaWIsIHJvd3MpLCBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCByb3dzKSwgd2lkdGgpOworCQkJCQl9CisJCQkJfQorCQkJCQorCQkJCXJldHVybiBuZXdfZGliOworCQkJfQorCisJCQljYXNlIDI0IDoKKwkJCXsKKwkJCQkvLyBFeHBhbmQgYW5kIGNvcHkgdGhlIGJpdG1hcCBkYXRhCisKKwkJCQlmb3IgKGludCByb3dzID0gMDsgcm93cyA8IGhlaWdodDsgcm93cysrKSB7CisJCQkJCUZyZWVJbWFnZV9Db252ZXJ0TGluZTI0VG80KEZyZWVJbWFnZV9HZXRTY2FuTGluZShuZXdfZGliLCByb3dzKSwgRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgcm93cyksIHdpZHRoKTsJCQkJCQorCQkJCX0KKwkJCQlyZXR1cm4gbmV3X2RpYjsKKwkJCX0KKworCQkJY2FzZSAzMiA6CisJCQl7CisJCQkJLy8gRXhwYW5kIGFuZCBjb3B5IHRoZSBiaXRtYXAgZGF0YQorCisJCQkJZm9yIChpbnQgcm93cyA9IDA7IHJvd3MgPCBoZWlnaHQ7IHJvd3MrKykgeworCQkJCQlGcmVlSW1hZ2VfQ29udmVydExpbmUzMlRvNChGcmVlSW1hZ2VfR2V0U2NhbkxpbmUobmV3X2RpYiwgcm93cyksIEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIHJvd3MpLCB3aWR0aCk7CisJCQkJfQorCQkJCXJldHVybiBuZXdfZGliOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIEZyZWVJbWFnZV9DbG9uZShkaWIpOworfQpkaWZmIC0tZ2l0IGEvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9Db252ZXJzaW9uOC5jcHAgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL0NvbnZlcnNpb244LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGY5YjIyCi0tLSAvZGV2L251bGwKKysrIGIvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9Db252ZXJzaW9uOC5jcHAKQEAgLTAsMCArMSwzMDUgQEAKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEJpdG1hcCBjb252ZXJzaW9uIHJvdXRpbmVzCisvLworLy8gRGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBieQorLy8gLSBGbG9yaXMgdmFuIGRlbiBCZXJnIChmbHZkYmVyZ0B3eHMubmwpCisvLyAtIEhlcnbpIERyb2xvbiAoZHJvbG9uQGluZm9uaWUuZnIpCisvLyAtIEphbmkgS2FqYWxhIChqYW5pa0ByZW1lZHkuZmkpCisvLyAtIEthcmwtSGVpbnogQnVzc2lhbiAoa2hidXNzaWFuQG1vc3MuZGUpCisvLyAtIENhcnN0ZW4gS2xlaW4gKGNrbGVpbjA1QHVzZXJzLnNvdXJjZWZvcmdlLm5ldCkKKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBGcmVlSW1hZ2UgMworLy8KKy8vIENPVkVSRUQgQ09ERSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWQorLy8gT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMKKy8vIFRIQVQgVEhFIENPVkVSRUQgQ09ERSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLy8gT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQKKy8vIENPREUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkgQ09WRVJFRCBDT0RFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QKKy8vIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZCisvLyBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMCisvLyBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GIEFOWSBDT1ZFUkVEIENPREUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSCisvLyBUSElTIERJU0NMQUlNRVIuCisvLworLy8gVXNlIGF0IHlvdXIgb3duIHJpc2shCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpbmNsdWRlICJGcmVlSW1hZ2UuaCIKKyNpbmNsdWRlICJVdGlsaXRpZXMuaCIKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIGludGVybmFsIGNvbnZlcnNpb25zIFggdG8gOCBiaXRzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgRExMX0NBTExDT05WCitGcmVlSW1hZ2VfQ29udmVydExpbmUxVG84KEJZVEUgKnRhcmdldCwgQllURSAqc291cmNlLCBpbnQgd2lkdGhfaW5fcGl4ZWxzKSB7CisJZm9yICh1bnNpZ25lZCBjb2xzID0gMDsgY29scyA8ICh1bnNpZ25lZCl3aWR0aF9pbl9waXhlbHM7IGNvbHMrKykKKwkJdGFyZ2V0W2NvbHNdID0gKHNvdXJjZVtjb2xzID4+IDNdICYgKDB4ODAgPj4gKGNvbHMgJiAweDA3KSkpICE9IDAgPyAyNTUgOiAwOwkKK30KKwordm9pZCBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9Db252ZXJ0TGluZTRUbzgoQllURSAqdGFyZ2V0LCBCWVRFICpzb3VyY2UsIGludCB3aWR0aF9pbl9waXhlbHMpIHsKKwl1bnNpZ25lZCBjb3VudF9uZXcgPSAwOworCXVuc2lnbmVkIGNvdW50X29yZyA9IDA7CisJQk9PTCBoaW5pYmJsZSA9IFRSVUU7CisKKwl3aGlsZSAoY291bnRfbmV3IDwgKHVuc2lnbmVkKXdpZHRoX2luX3BpeGVscykgeworCQlpZiAoaGluaWJibGUpIHsKKwkJCXRhcmdldFtjb3VudF9uZXddID0gKHNvdXJjZVtjb3VudF9vcmddID4+IDQpOworCQl9IGVsc2UgeworCQkJdGFyZ2V0W2NvdW50X25ld10gPSAoc291cmNlW2NvdW50X29yZ10gJiAweDBGKTsKKwkJCWNvdW50X29yZysrOworCQl9CisJCWhpbmliYmxlID0gIWhpbmliYmxlOworCQljb3VudF9uZXcrKzsKKwl9Cit9CisKK3ZvaWQgRExMX0NBTExDT05WCitGcmVlSW1hZ2VfQ29udmVydExpbmUxNlRvOF81NTUoQllURSAqdGFyZ2V0LCBCWVRFICpzb3VyY2UsIGludCB3aWR0aF9pbl9waXhlbHMpIHsKKwljb25zdCBXT1JEICpjb25zdCBiaXRzID0gKFdPUkQgKilzb3VyY2U7CisJZm9yICh1bnNpZ25lZCBjb2xzID0gMDsgY29scyA8ICh1bnNpZ25lZCl3aWR0aF9pbl9waXhlbHM7IGNvbHMrKykgeworCQl0YXJnZXRbY29sc10gPSBHUkVZKCgoKGJpdHNbY29sc10gJiBGSTE2XzU1NV9SRURfTUFTSykgPj4gRkkxNl81NTVfUkVEX1NISUZUKSAqIDB4RkYpIC8gMHgxRiwKKwkJCSAgICAgICAgICAgICAgICAoKChiaXRzW2NvbHNdICYgRkkxNl81NTVfR1JFRU5fTUFTSykgPj4gRkkxNl81NTVfR1JFRU5fU0hJRlQpICogMHhGRikgLyAweDFGLAorCQkJCQkJCSgoKGJpdHNbY29sc10gJiBGSTE2XzU1NV9CTFVFX01BU0spID4+IEZJMTZfNTU1X0JMVUVfU0hJRlQpICogMHhGRikgLyAweDFGKTsKKwl9Cit9CisKK3ZvaWQgRExMX0NBTExDT05WCitGcmVlSW1hZ2VfQ29udmVydExpbmUxNlRvOF81NjUoQllURSAqdGFyZ2V0LCBCWVRFICpzb3VyY2UsIGludCB3aWR0aF9pbl9waXhlbHMpIHsKKwljb25zdCBXT1JEICpjb25zdCBiaXRzID0gKFdPUkQgKilzb3VyY2U7CisJZm9yICh1bnNpZ25lZCBjb2xzID0gMDsgY29scyA8ICh1bnNpZ25lZCl3aWR0aF9pbl9waXhlbHM7IGNvbHMrKykgeworCQl0YXJnZXRbY29sc10gPSBHUkVZKCgoKGJpdHNbY29sc10gJiBGSTE2XzU2NV9SRURfTUFTSykgPj4gRkkxNl81NjVfUkVEX1NISUZUKSAqIDB4RkYpIC8gMHgxRiwKKwkJCSAgICAgICAgKCgoYml0c1tjb2xzXSAmIEZJMTZfNTY1X0dSRUVOX01BU0spID4+IEZJMTZfNTY1X0dSRUVOX1NISUZUKSAqIDB4RkYpIC8gMHgzRiwKKwkJCQkJKCgoYml0c1tjb2xzXSAmIEZJMTZfNTY1X0JMVUVfTUFTSykgPj4gRkkxNl81NjVfQkxVRV9TSElGVCkgKiAweEZGKSAvIDB4MUYpOworCX0KK30KKwordm9pZCBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9Db252ZXJ0TGluZTI0VG84KEJZVEUgKnRhcmdldCwgQllURSAqc291cmNlLCBpbnQgd2lkdGhfaW5fcGl4ZWxzKSB7CisJZm9yICh1bnNpZ25lZCBjb2xzID0gMDsgY29scyA8ICh1bnNpZ25lZCl3aWR0aF9pbl9waXhlbHM7IGNvbHMrKykgeworCQl0YXJnZXRbY29sc10gPSBHUkVZKHNvdXJjZVtGSV9SR0JBX1JFRF0sIHNvdXJjZVtGSV9SR0JBX0dSRUVOXSwgc291cmNlW0ZJX1JHQkFfQkxVRV0pOworCQlzb3VyY2UgKz0gMzsKKwl9Cit9CisKK3ZvaWQgRExMX0NBTExDT05WCitGcmVlSW1hZ2VfQ29udmVydExpbmUzMlRvOChCWVRFICp0YXJnZXQsIEJZVEUgKnNvdXJjZSwgaW50IHdpZHRoX2luX3BpeGVscykgeworCWZvciAodW5zaWduZWQgY29scyA9IDA7IGNvbHMgPCAodW5zaWduZWQpd2lkdGhfaW5fcGl4ZWxzOyBjb2xzKyspIHsKKwkJdGFyZ2V0W2NvbHNdID0gR1JFWShzb3VyY2VbRklfUkdCQV9SRURdLCBzb3VyY2VbRklfUkdCQV9HUkVFTl0sIHNvdXJjZVtGSV9SR0JBX0JMVUVdKTsKKwkJc291cmNlICs9IDQ7CisJfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgIHNtYXJ0IGNvbnZlcnQgWCB0byA4IGJpdHMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRklCSVRNQVAgKiBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9Db252ZXJ0VG84Qml0cyhGSUJJVE1BUCAqZGliKSB7CisJaWYgKCFGcmVlSW1hZ2VfSGFzUGl4ZWxzKGRpYikpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJY29uc3QgRlJFRV9JTUFHRV9UWVBFIGltYWdlX3R5cGUgPSBGcmVlSW1hZ2VfR2V0SW1hZ2VUeXBlKGRpYik7CisJaWYgKGltYWdlX3R5cGUgIT0gRklUX0JJVE1BUCAmJiBpbWFnZV90eXBlICE9IEZJVF9VSU5UMTYpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJY29uc3QgdW5zaWduZWQgYnBwID0gRnJlZUltYWdlX0dldEJQUChkaWIpOworCisJaWYgKGJwcCAhPSA4KSB7CisKKwkJY29uc3QgdW5zaWduZWQgd2lkdGggPSBGcmVlSW1hZ2VfR2V0V2lkdGgoZGliKTsKKwkJY29uc3QgdW5zaWduZWQgaGVpZ2h0ID0gRnJlZUltYWdlX0dldEhlaWdodChkaWIpOworCisJCS8vIEFsbG9jYXRlIGEgZGVzdGluYXRpb24gaW1hZ2UKKwkJRklCSVRNQVAgKm5ld19kaWIgPSBGcmVlSW1hZ2VfQWxsb2NhdGUod2lkdGgsIGhlaWdodCwgOCk7CisJCWlmIChuZXdfZGliID09IE5VTEwpIHsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJLy8gQ29weSBtZXRhZGF0YSBmcm9tIHNyYyB0byBkc3QKKwkJRnJlZUltYWdlX0Nsb25lTWV0YWRhdGEobmV3X2RpYiwgZGliKTsKKworCQkvLyBQYWxldHRlIG9mIGRlc3RpbmF0aW9uIGltYWdlIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQKKwkJUkdCUVVBRCAqbmV3X3BhbCA9IEZyZWVJbWFnZV9HZXRQYWxldHRlKG5ld19kaWIpOworCisJCWNvbnN0IEZSRUVfSU1BR0VfQ09MT1JfVFlQRSBjb2xvcl90eXBlID0gRnJlZUltYWdlX0dldENvbG9yVHlwZShkaWIpOworCisJCWlmIChpbWFnZV90eXBlID09IEZJVF9CSVRNQVApIHsKKworCQkJc3dpdGNoKGJwcCkgeworCQkJCWNhc2UgMToKKwkJCQl7CisJCQkJCWlmIChjb2xvcl90eXBlID09IEZJQ19QQUxFVFRFKSB7CisJCQkJCQkvLyBDb3B5IHRoZSBwYWxldHRlCisJCQkJCQlSR0JRVUFEICpvbGRfcGFsID0gRnJlZUltYWdlX0dldFBhbGV0dGUoZGliKTsKKwkJCQkJCW5ld19wYWxbMF0gPSBvbGRfcGFsWzBdOworCQkJCQkJbmV3X3BhbFsyNTVdID0gb2xkX3BhbFsxXTsKKworCQkJCQl9IGVsc2UgaWYgKGNvbG9yX3R5cGUgPT0gRklDX01JTklTV0hJVEUpIHsKKwkJCQkJCS8vIENyZWF0ZSBhIHJldmVyc2UgZ3JheXNjYWxlIHBhbGV0dGUKKwkJCQkJCUNSRUFURV9HUkVZU0NBTEVfUEFMRVRURV9SRVZFUlNFKG5ld19wYWwsIDI1Nik7CisJCQkJCX0KKworCQkJCQkvLyBFeHBhbmQgYW5kIGNvcHkgdGhlIGJpdG1hcCBkYXRhCisJCQkJCWZvciAodW5zaWduZWQgcm93cyA9IDA7IHJvd3MgPCBoZWlnaHQ7IHJvd3MrKykgeworCQkJCQkJRnJlZUltYWdlX0NvbnZlcnRMaW5lMVRvOChGcmVlSW1hZ2VfR2V0U2NhbkxpbmUobmV3X2RpYiwgcm93cyksIEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIHJvd3MpLCB3aWR0aCk7CisJCQkJCX0KKwkJCQkJcmV0dXJuIG5ld19kaWI7CisJCQkJfQorCisJCQkJY2FzZSA0IDoKKwkJCQl7CisJCQkJCWlmIChjb2xvcl90eXBlID09IEZJQ19QQUxFVFRFKSB7CisJCQkJCQkvLyBDb3B5IHRoZSBwYWxldHRlCisJCQkJCQltZW1jcHkobmV3X3BhbCwgRnJlZUltYWdlX0dldFBhbGV0dGUoZGliKSwgMTYgKiBzaXplb2YoUkdCUVVBRCkpOworCQkJCQl9CisKKwkJCQkJLy8gRXhwYW5kIGFuZCBjb3B5IHRoZSBiaXRtYXAgZGF0YQorCQkJCQlmb3IgKHVuc2lnbmVkIHJvd3MgPSAwOyByb3dzIDwgaGVpZ2h0OyByb3dzKyspIHsKKwkJCQkJCUZyZWVJbWFnZV9Db252ZXJ0TGluZTRUbzgoRnJlZUltYWdlX0dldFNjYW5MaW5lKG5ld19kaWIsIHJvd3MpLCBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCByb3dzKSwgd2lkdGgpOwkJCQkJCisJCQkJCX0KKwkJCQkJcmV0dXJuIG5ld19kaWI7CisJCQkJfQorCisJCQkJY2FzZSAxNiA6CisJCQkJeworCQkJCQkvLyBFeHBhbmQgYW5kIGNvcHkgdGhlIGJpdG1hcCBkYXRhCisJCQkJCWlmIChJU19GT1JNQVRfUkdCNTY1KGRpYikpIHsKKwkJCQkJCWZvciAodW5zaWduZWQgcm93cyA9IDA7IHJvd3MgPCBoZWlnaHQ7IHJvd3MrKykgeworCQkJCQkJCUZyZWVJbWFnZV9Db252ZXJ0TGluZTE2VG84XzU2NShGcmVlSW1hZ2VfR2V0U2NhbkxpbmUobmV3X2RpYiwgcm93cyksIEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIHJvd3MpLCB3aWR0aCk7CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQlmb3IgKHVuc2lnbmVkIHJvd3MgPSAwOyByb3dzIDwgaGVpZ2h0OyByb3dzKyspIHsKKwkJCQkJCQlGcmVlSW1hZ2VfQ29udmVydExpbmUxNlRvOF81NTUoRnJlZUltYWdlX0dldFNjYW5MaW5lKG5ld19kaWIsIHJvd3MpLCBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCByb3dzKSwgd2lkdGgpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCXJldHVybiBuZXdfZGliOworCQkJCX0KKworCQkJCWNhc2UgMjQgOgorCQkJCXsKKwkJCQkJLy8gRXhwYW5kIGFuZCBjb3B5IHRoZSBiaXRtYXAgZGF0YQorCQkJCQlmb3IgKHVuc2lnbmVkIHJvd3MgPSAwOyByb3dzIDwgaGVpZ2h0OyByb3dzKyspIHsKKwkJCQkJCUZyZWVJbWFnZV9Db252ZXJ0TGluZTI0VG84KEZyZWVJbWFnZV9HZXRTY2FuTGluZShuZXdfZGliLCByb3dzKSwgRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgcm93cyksIHdpZHRoKTsJCQkJCQorCQkJCQl9CisJCQkJCXJldHVybiBuZXdfZGliOworCQkJCX0KKworCQkJCWNhc2UgMzIgOgorCQkJCXsKKwkJCQkJLy8gRXhwYW5kIGFuZCBjb3B5IHRoZSBiaXRtYXAgZGF0YQorCQkJCQlmb3IgKHVuc2lnbmVkIHJvd3MgPSAwOyByb3dzIDwgaGVpZ2h0OyByb3dzKyspIHsKKwkJCQkJCUZyZWVJbWFnZV9Db252ZXJ0TGluZTMyVG84KEZyZWVJbWFnZV9HZXRTY2FuTGluZShuZXdfZGliLCByb3dzKSwgRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgcm93cyksIHdpZHRoKTsKKwkJCQkJfQorCQkJCQlyZXR1cm4gbmV3X2RpYjsKKwkJCQl9CisJCQl9CisKKwkJfSBlbHNlIGlmIChpbWFnZV90eXBlID09IEZJVF9VSU5UMTYpIHsKKworCQkJY29uc3QgdW5zaWduZWQgc3JjX3BpdGNoID0gRnJlZUltYWdlX0dldFBpdGNoKGRpYik7CisJCQljb25zdCB1bnNpZ25lZCBkc3RfcGl0Y2ggPSBGcmVlSW1hZ2VfR2V0UGl0Y2gobmV3X2RpYik7CisJCQljb25zdCBCWVRFICpzcmNfYml0cyA9IEZyZWVJbWFnZV9HZXRCaXRzKGRpYik7CisJCQlCWVRFICpkc3RfYml0cyA9IEZyZWVJbWFnZV9HZXRCaXRzKG5ld19kaWIpOworCisJCQlmb3IgKHVuc2lnbmVkIHJvd3MgPSAwOyByb3dzIDwgaGVpZ2h0OyByb3dzKyspIHsKKwkJCQljb25zdCBXT1JEICpjb25zdCBzcmNfcGl4ZWwgPSAoV09SRCopc3JjX2JpdHM7CisJCQkJQllURSAqZHN0X3BpeGVsID0gKEJZVEUqKWRzdF9iaXRzOworCQkJCWZvcih1bnNpZ25lZCBjb2xzID0gMDsgY29scyA8IHdpZHRoOyBjb2xzKyspIHsKKwkJCQkJZHN0X3BpeGVsW2NvbHNdID0gKEJZVEUpKHNyY19waXhlbFtjb2xzXSA+PiA4KTsKKwkJCQl9CisJCQkJc3JjX2JpdHMgKz0gc3JjX3BpdGNoOworCQkJCWRzdF9iaXRzICs9IGRzdF9waXRjaDsKKwkJCX0KKwkJCXJldHVybiBuZXdfZGliOworCQl9IAorCisJfSAvLyBicHAgIT0gOAorCisJcmV0dXJuIEZyZWVJbWFnZV9DbG9uZShkaWIpOworfQorCitGSUJJVE1BUCAqIERMTF9DQUxMQ09OVgorRnJlZUltYWdlX0NvbnZlcnRUb0dyZXlzY2FsZShGSUJJVE1BUCAqZGliKSB7CisJaWYgKCFGcmVlSW1hZ2VfSGFzUGl4ZWxzKGRpYikpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJY29uc3QgRlJFRV9JTUFHRV9DT0xPUl9UWVBFIGNvbG9yX3R5cGUgPSBGcmVlSW1hZ2VfR2V0Q29sb3JUeXBlKGRpYik7CisKKwlpZiAoY29sb3JfdHlwZSA9PSBGSUNfUEFMRVRURSB8fCBjb2xvcl90eXBlID09IEZJQ19NSU5JU1dISVRFKSB7CisKKwkJY29uc3QgdW5zaWduZWQgYnBwID0gRnJlZUltYWdlX0dldEJQUChkaWIpOworCQljb25zdCB1bnNpZ25lZCB3aWR0aCAgPSBGcmVlSW1hZ2VfR2V0V2lkdGgoZGliKTsKKwkJY29uc3QgdW5zaWduZWQgaGVpZ2h0ID0gRnJlZUltYWdlX0dldEhlaWdodChkaWIpOworCisJCUZJQklUTUFQICpuZXdfZGliID0gRnJlZUltYWdlX0FsbG9jYXRlKHdpZHRoLCBoZWlnaHQsIDgpOworCQlpZiAobmV3X2RpYiA9PSBOVUxMKSB7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCS8vIENvcHkgbWV0YWRhdGEgZnJvbSBzcmMgdG8gZHN0CisJCUZyZWVJbWFnZV9DbG9uZU1ldGFkYXRhKG5ld19kaWIsIGRpYik7CisKKwkJLy8gQ3JlYXRlIGEgZ3JleXNjYWxlIHBhbGV0dGUKKwkJQllURSBncmV5X3BhbFsyNTZdOworCQljb25zdCBSR0JRVUFEICpwYWwgPSBGcmVlSW1hZ2VfR2V0UGFsZXR0ZShkaWIpOworCQljb25zdCB1bnNpZ25lZCBzaXplID0gQ2FsY3VsYXRlVXNlZFBhbGV0dGVFbnRyaWVzKGJwcCk7CisJCWZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCWdyZXlfcGFsW2ldID0gR1JFWShwYWwtPnJnYlJlZCwgcGFsLT5yZ2JHcmVlbiwgcGFsLT5yZ2JCbHVlKTsKKwkJCXBhbCsrOworCQl9CisKKwkJY29uc3QgQllURSAqc3JjX2JpdHMgPSBGcmVlSW1hZ2VfR2V0Qml0cyhkaWIpOworCQlCWVRFICpkc3RfYml0cyA9IEZyZWVJbWFnZV9HZXRCaXRzKG5ld19kaWIpOworCisJCWNvbnN0IHVuc2lnbmVkIHNyY19waXRjaCA9IEZyZWVJbWFnZV9HZXRQaXRjaChkaWIpOworCQljb25zdCB1bnNpZ25lZCBkc3RfcGl0Y2ggPSBGcmVlSW1hZ2VfR2V0UGl0Y2gobmV3X2RpYik7CisKKwkJc3dpdGNoKGJwcCkgeworCQkJY2FzZSAxOgorCQkJeworCQkJCWZvciAodW5zaWduZWQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworCQkJCQlmb3IgKHVuc2lnbmVkIHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworCQkJCQkJY29uc3QgdW5zaWduZWQgcGl4ZWwgPSAoc3JjX2JpdHNbeCA+PiAzXSAmICgweDgwID4+ICh4ICYgMHgwNykpKSAhPSAwOworCQkJCQkJZHN0X2JpdHNbeF0gPSBncmV5X3BhbFtwaXhlbF07CisJCQkJCX0KKwkJCQkJc3JjX2JpdHMgKz0gc3JjX3BpdGNoOworCQkJCQlkc3RfYml0cyArPSBkc3RfcGl0Y2g7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJCWNhc2UgNDoKKwkJCXsKKwkJCQlmb3IgKHVuc2lnbmVkIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJCQkJZm9yICh1bnNpZ25lZCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQkJCWNvbnN0IHVuc2lnbmVkIHBpeGVsID0geCAmIDB4MDEgPyBzcmNfYml0c1t4ID4+IDFdICYgMHgwRiA6IHNyY19iaXRzW3ggPj4gMV0gPj4gNDsKKwkJCQkJCWRzdF9iaXRzW3hdID0gZ3JleV9wYWxbcGl4ZWxdOworCQkJCQl9CisJCQkJCXNyY19iaXRzICs9IHNyY19waXRjaDsKKwkJCQkJZHN0X2JpdHMgKz0gZHN0X3BpdGNoOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCQljYXNlIDg6CisJCQl7CisJCQkJZm9yICh1bnNpZ25lZCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisJCQkJCWZvciAodW5zaWduZWQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisJCQkJCQlkc3RfYml0c1t4XSA9IGdyZXlfcGFsW3NyY19iaXRzW3hdXTsKKwkJCQkJfQorCQkJCQlzcmNfYml0cyArPSBzcmNfcGl0Y2g7CisJCQkJCWRzdF9iaXRzICs9IGRzdF9waXRjaDsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJfQorCQlyZXR1cm4gbmV3X2RpYjsKKwl9IAorCQorCS8vIENvbnZlcnQgdGhlIGJpdG1hcCB0byA4LWJpdCBncmV5c2NhbGUKKwlyZXR1cm4gRnJlZUltYWdlX0NvbnZlcnRUbzhCaXRzKGRpYik7Cit9CmRpZmYgLS1naXQgYS9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL0NvbnZlcnNpb25GbG9hdC5jcHAgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL0NvbnZlcnNpb25GbG9hdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM2YTZkNAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvQ29udmVyc2lvbkZsb2F0LmNwcApAQCAtMCwwICsxLDE5NCBAQAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gQml0bWFwIGNvbnZlcnNpb24gcm91dGluZXMKKy8vCisvLyBEZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIGJ5CisvLyAtIEhlcnbpIERyb2xvbiAoZHJvbG9uQGluZm9uaWUuZnIpCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRnJlZUltYWdlIDMKKy8vCisvLyBDT1ZFUkVEIENPREUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkKKy8vIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTCisvLyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy8vIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVECisvLyBDT0RFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UCisvLyBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWQorLy8gU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTAorLy8gUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUgorLy8gVEhJUyBESVNDTEFJTUVSLgorLy8KKy8vIFVzZSBhdCB5b3VyIG93biByaXNrIQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaW5jbHVkZSAiRnJlZUltYWdlLmgiCisjaW5jbHVkZSAiVXRpbGl0aWVzLmgiCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgc21hcnQgY29udmVydCBYIHRvIEZsb2F0CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0ZJQklUTUFQICogRExMX0NBTExDT05WCitGcmVlSW1hZ2VfQ29udmVydFRvRmxvYXQoRklCSVRNQVAgKmRpYikgeworCUZJQklUTUFQICpzcmMgPSBOVUxMOworCUZJQklUTUFQICpkc3QgPSBOVUxMOworCisJaWYoIUZyZWVJbWFnZV9IYXNQaXhlbHMoZGliKSkgcmV0dXJuIE5VTEw7CisKKwlGUkVFX0lNQUdFX1RZUEUgc3JjX3R5cGUgPSBGcmVlSW1hZ2VfR2V0SW1hZ2VUeXBlKGRpYik7CisKKwkvLyBjaGVjayBmb3IgYWxsb3dlZCBjb252ZXJzaW9ucyAKKwlzd2l0Y2goc3JjX3R5cGUpIHsKKwkJY2FzZSBGSVRfQklUTUFQOgorCQl7CisJCQkvLyBhbGxvdyBjb252ZXJzaW9uIGZyb20gOC1iaXQKKwkJCWlmKChGcmVlSW1hZ2VfR2V0QlBQKGRpYikgPT0gOCkgJiYgKEZyZWVJbWFnZV9HZXRDb2xvclR5cGUoZGliKSA9PSBGSUNfTUlOSVNCTEFDSykpIHsKKwkJCQlzcmMgPSBkaWI7CisJCQl9IGVsc2UgeworCQkJCXNyYyA9IEZyZWVJbWFnZV9Db252ZXJ0VG9HcmV5c2NhbGUoZGliKTsKKwkJCQlpZighc3JjKSByZXR1cm4gTlVMTDsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWNhc2UgRklUX1VJTlQxNjoKKwkJY2FzZSBGSVRfUkdCMTY6CisJCWNhc2UgRklUX1JHQkExNjoKKwkJY2FzZSBGSVRfUkdCRjoKKwkJY2FzZSBGSVRfUkdCQUY6CisJCQlzcmMgPSBkaWI7CisJCQlicmVhazsKKwkJY2FzZSBGSVRfRkxPQVQ6CisJCQkvLyBmbG9hdCB0eXBlIDogY2xvbmUgdGhlIHNyYworCQkJcmV0dXJuIEZyZWVJbWFnZV9DbG9uZShkaWIpOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIE5VTEw7CisJfQorCisJLy8gYWxsb2NhdGUgZHN0IGltYWdlCisKKwljb25zdCB1bnNpZ25lZCB3aWR0aCA9IEZyZWVJbWFnZV9HZXRXaWR0aChzcmMpOworCWNvbnN0IHVuc2lnbmVkIGhlaWdodCA9IEZyZWVJbWFnZV9HZXRIZWlnaHQoc3JjKTsKKworCWRzdCA9IEZyZWVJbWFnZV9BbGxvY2F0ZVQoRklUX0ZMT0FULCB3aWR0aCwgaGVpZ2h0KTsKKwlpZighZHN0KSB7CisJCWlmKHNyYyAhPSBkaWIpIHsKKwkJCUZyZWVJbWFnZV9VbmxvYWQoc3JjKTsKKwkJfQorCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvLyBjb3B5IG1ldGFkYXRhIGZyb20gc3JjIHRvIGRzdAorCUZyZWVJbWFnZV9DbG9uZU1ldGFkYXRhKGRzdCwgc3JjKTsKKworCS8vIGNvbnZlcnQgZnJvbSBzcmMgdHlwZSB0byBmbG9hdAorCisJY29uc3QgdW5zaWduZWQgc3JjX3BpdGNoID0gRnJlZUltYWdlX0dldFBpdGNoKHNyYyk7CisJY29uc3QgdW5zaWduZWQgZHN0X3BpdGNoID0gRnJlZUltYWdlX0dldFBpdGNoKGRzdCk7CisKKwljb25zdCBCWVRFICpzcmNfYml0cyA9IChCWVRFKilGcmVlSW1hZ2VfR2V0Qml0cyhzcmMpOworCUJZVEUgKmRzdF9iaXRzID0gKEJZVEUqKUZyZWVJbWFnZV9HZXRCaXRzKGRzdCk7CisKKwlzd2l0Y2goc3JjX3R5cGUpIHsKKwkJY2FzZSBGSVRfQklUTUFQOgorCQl7CisJCQlmb3IodW5zaWduZWQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworCQkJCWNvbnN0IEJZVEUgKnNyY19waXhlbCA9IChCWVRFKilzcmNfYml0czsKKwkJCQlmbG9hdCAqZHN0X3BpeGVsID0gKGZsb2F0Kilkc3RfYml0czsKKwkJCQlmb3IodW5zaWduZWQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisJCQkJCS8vIGNvbnZlcnQgYW5kIHNjYWxlIHRvIHRoZSByYW5nZSBbMC4uMV0KKwkJCQkJZHN0X3BpeGVsW3hdID0gKGZsb2F0KShzcmNfcGl4ZWxbeF0pIC8gMjU1OworCQkJCX0KKwkJCQlzcmNfYml0cyArPSBzcmNfcGl0Y2g7CisJCQkJZHN0X2JpdHMgKz0gZHN0X3BpdGNoOworCQkJfQorCQl9CisJCWJyZWFrOworCisJCWNhc2UgRklUX1VJTlQxNjoKKwkJeworCQkJZm9yKHVuc2lnbmVkIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJCQljb25zdCBXT1JEICpzcmNfcGl4ZWwgPSAoV09SRCopc3JjX2JpdHM7CisJCQkJZmxvYXQgKmRzdF9waXhlbCA9IChmbG9hdCopZHN0X2JpdHM7CisKKwkJCQlmb3IodW5zaWduZWQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisJCQkJCS8vIGNvbnZlcnQgYW5kIHNjYWxlIHRvIHRoZSByYW5nZSBbMC4uMV0KKwkJCQkJZHN0X3BpeGVsW3hdID0gKGZsb2F0KShzcmNfcGl4ZWxbeF0pIC8gNjU1MzU7CisJCQkJfQorCQkJCXNyY19iaXRzICs9IHNyY19waXRjaDsKKwkJCQlkc3RfYml0cyArPSBkc3RfcGl0Y2g7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSBGSVRfUkdCMTY6CisJCXsKKwkJCWZvcih1bnNpZ25lZCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisJCQkJY29uc3QgRklSR0IxNiAqc3JjX3BpeGVsID0gKEZJUkdCMTYqKXNyY19iaXRzOworCQkJCWZsb2F0ICpkc3RfcGl4ZWwgPSAoZmxvYXQqKWRzdF9iaXRzOworCisJCQkJZm9yKHVuc2lnbmVkIHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworCQkJCQkvLyBjb252ZXJ0IGFuZCBzY2FsZSB0byB0aGUgcmFuZ2UgWzAuLjFdCisJCQkJCWRzdF9waXhlbFt4XSA9IExVTUFfUkVDNzA5KHNyY19waXhlbFt4XS5yZWQsIHNyY19waXhlbFt4XS5ncmVlbiwgc3JjX3BpeGVsW3hdLmJsdWUpIC8gNjU1MzUuMEY7CisJCQkJfQorCQkJCXNyY19iaXRzICs9IHNyY19waXRjaDsKKwkJCQlkc3RfYml0cyArPSBkc3RfcGl0Y2g7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSBGSVRfUkdCQTE2OgorCQl7CisJCQlmb3IodW5zaWduZWQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworCQkJCWNvbnN0IEZJUkdCQTE2ICpzcmNfcGl4ZWwgPSAoRklSR0JBMTYqKXNyY19iaXRzOworCQkJCWZsb2F0ICpkc3RfcGl4ZWwgPSAoZmxvYXQqKWRzdF9iaXRzOworCisJCQkJZm9yKHVuc2lnbmVkIHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworCQkJCQkvLyBjb252ZXJ0IGFuZCBzY2FsZSB0byB0aGUgcmFuZ2UgWzAuLjFdCisJCQkJCWRzdF9waXhlbFt4XSA9IExVTUFfUkVDNzA5KHNyY19waXhlbFt4XS5yZWQsIHNyY19waXhlbFt4XS5ncmVlbiwgc3JjX3BpeGVsW3hdLmJsdWUpIC8gNjU1MzUuMEY7CisJCQkJfQorCQkJCXNyY19iaXRzICs9IHNyY19waXRjaDsKKwkJCQlkc3RfYml0cyArPSBkc3RfcGl0Y2g7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSBGSVRfUkdCRjoKKwkJeworCQkJZm9yKHVuc2lnbmVkIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJCQljb25zdCBGSVJHQkYgKnNyY19waXhlbCA9IChGSVJHQkYqKXNyY19iaXRzOworCQkJCWZsb2F0ICpkc3RfcGl4ZWwgPSAoZmxvYXQqKWRzdF9iaXRzOworCisJCQkJZm9yKHVuc2lnbmVkIHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworCQkJCQkvLyBjb252ZXJ0IChhc3N1bWUgcGl4ZWwgdmFsdWVzIGFyZSBpbiB0aGUgcmFuZ2UgWzAuLjFdKQorCQkJCQlkc3RfcGl4ZWxbeF0gPSBMVU1BX1JFQzcwOShzcmNfcGl4ZWxbeF0ucmVkLCBzcmNfcGl4ZWxbeF0uZ3JlZW4sIHNyY19waXhlbFt4XS5ibHVlKTsKKwkJCQkJZHN0X3BpeGVsW3hdID0gQ0xBTVAoZHN0X3BpeGVsW3hdLCAwLjBGLCAxLjBGKTsKKwkJCQl9CisJCQkJc3JjX2JpdHMgKz0gc3JjX3BpdGNoOworCQkJCWRzdF9iaXRzICs9IGRzdF9waXRjaDsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCQljYXNlIEZJVF9SR0JBRjoKKwkJeworCQkJZm9yKHVuc2lnbmVkIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJCQljb25zdCBGSVJHQkFGICpzcmNfcGl4ZWwgPSAoRklSR0JBRiopc3JjX2JpdHM7CisJCQkJZmxvYXQgKmRzdF9waXhlbCA9IChmbG9hdCopZHN0X2JpdHM7CisKKwkJCQlmb3IodW5zaWduZWQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisJCQkJCS8vIGNvbnZlcnQgKGFzc3VtZSBwaXhlbCB2YWx1ZXMgYXJlIGluIHRoZSByYW5nZSBbMC4uMV0pCisJCQkJCWRzdF9waXhlbFt4XSA9IExVTUFfUkVDNzA5KHNyY19waXhlbFt4XS5yZWQsIHNyY19waXhlbFt4XS5ncmVlbiwgc3JjX3BpeGVsW3hdLmJsdWUpOworCQkJCQlkc3RfcGl4ZWxbeF0gPSBDTEFNUChkc3RfcGl4ZWxbeF0sIDAuMEYsIDEuMEYpOworCQkJCX0KKwkJCQlzcmNfYml0cyArPSBzcmNfcGl0Y2g7CisJCQkJZHN0X2JpdHMgKz0gZHN0X3BpdGNoOworCQkJfQorCQl9CisJCWJyZWFrOworCX0KKworCWlmKHNyYyAhPSBkaWIpIHsKKwkJRnJlZUltYWdlX1VubG9hZChzcmMpOworCX0KKworCXJldHVybiBkc3Q7Cit9CisKZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvQ29udmVyc2lvblJHQjE2LmNwcCBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvQ29udmVyc2lvblJHQjE2LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTI4MjA1Ci0tLSAvZGV2L251bGwKKysrIGIvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9Db252ZXJzaW9uUkdCMTYuY3BwCkBAIC0wLDAgKzEsMTQ0IEBACisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBCaXRtYXAgY29udmVyc2lvbiByb3V0aW5lcworLy8KKy8vIERlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gYnkKKy8vIC0gSGVydukgRHJvbG9uIChkcm9sb25AaW5mb25pZS5mcikKKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBGcmVlSW1hZ2UgMworLy8KKy8vIENPVkVSRUQgQ09ERSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWQorLy8gT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMKKy8vIFRIQVQgVEhFIENPVkVSRUQgQ09ERSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLy8gT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQKKy8vIENPREUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkgQ09WRVJFRCBDT0RFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QKKy8vIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZCisvLyBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMCisvLyBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GIEFOWSBDT1ZFUkVEIENPREUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSCisvLyBUSElTIERJU0NMQUlNRVIuCisvLworLy8gVXNlIGF0IHlvdXIgb3duIHJpc2shCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpbmNsdWRlICJGcmVlSW1hZ2UuaCIKKyNpbmNsdWRlICJVdGlsaXRpZXMuaCIKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICBzbWFydCBjb252ZXJ0IFggdG8gUkdCMTYKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRklCSVRNQVAgKiBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9Db252ZXJ0VG9SR0IxNihGSUJJVE1BUCAqZGliKSB7CisJRklCSVRNQVAgKnNyYyA9IE5VTEw7CisJRklCSVRNQVAgKmRzdCA9IE5VTEw7CisKKwlpZighRnJlZUltYWdlX0hhc1BpeGVscyhkaWIpKSByZXR1cm4gTlVMTDsKKworCWNvbnN0IEZSRUVfSU1BR0VfVFlQRSBzcmNfdHlwZSA9IEZyZWVJbWFnZV9HZXRJbWFnZVR5cGUoZGliKTsKKworCS8vIGNoZWNrIGZvciBhbGxvd2VkIGNvbnZlcnNpb25zIAorCXN3aXRjaChzcmNfdHlwZSkgeworCQljYXNlIEZJVF9CSVRNQVA6CisJCXsKKwkJCS8vIGNvbnZlcnQgdG8gMjQtYml0IGlmIG5lZWRlZAorCQkJaWYoKEZyZWVJbWFnZV9HZXRCUFAoZGliKSA9PSAyNCkgfHwgKEZyZWVJbWFnZV9HZXRCUFAoZGliKSA9PSAzMikpIHsKKwkJCQlzcmMgPSBkaWI7CisJCQl9IGVsc2UgeworCQkJCXNyYyA9IEZyZWVJbWFnZV9Db252ZXJ0VG8yNEJpdHMoZGliKTsKKwkJCQlpZighc3JjKSByZXR1cm4gTlVMTDsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWNhc2UgRklUX1VJTlQxNjoKKwkJCS8vIGFsbG93IGNvbnZlcnNpb24gZnJvbSB1bnNpZ25lZCAxNi1iaXQKKwkJCXNyYyA9IGRpYjsKKwkJCWJyZWFrOworCQljYXNlIEZJVF9SR0IxNjoKKwkJCS8vIFJHQjE2IHR5cGUgOiBjbG9uZSB0aGUgc3JjCisJCQlyZXR1cm4gRnJlZUltYWdlX0Nsb25lKGRpYik7CisJCQlicmVhazsKKwkJY2FzZSBGSVRfUkdCQTE2OgorCQkJLy8gYWxsb3cgY29udmVyc2lvbiBmcm9tIDY0LWJpdCBSR0JBIChpZ25vcmUgdGhlIGFscGhhIGNoYW5uZWwpCisJCQlzcmMgPSBkaWI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBOVUxMOworCX0KKworCS8vIGFsbG9jYXRlIGRzdCBpbWFnZQorCisJY29uc3QgdW5zaWduZWQgd2lkdGggPSBGcmVlSW1hZ2VfR2V0V2lkdGgoc3JjKTsKKwljb25zdCB1bnNpZ25lZCBoZWlnaHQgPSBGcmVlSW1hZ2VfR2V0SGVpZ2h0KHNyYyk7CisKKwlkc3QgPSBGcmVlSW1hZ2VfQWxsb2NhdGVUKEZJVF9SR0IxNiwgd2lkdGgsIGhlaWdodCk7CisJaWYoIWRzdCkgeworCQlpZihzcmMgIT0gZGliKSB7CisJCQlGcmVlSW1hZ2VfVW5sb2FkKHNyYyk7CisJCX0KKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLy8gY29weSBtZXRhZGF0YSBmcm9tIHNyYyB0byBkc3QKKwlGcmVlSW1hZ2VfQ2xvbmVNZXRhZGF0YShkc3QsIHNyYyk7CisKKwkvLyBjb252ZXJ0IGZyb20gc3JjIHR5cGUgdG8gUkdCMTYKKworCXN3aXRjaChzcmNfdHlwZSkgeworCQljYXNlIEZJVF9CSVRNQVA6CisJCXsKKwkJCS8vIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHBlciBwaXhlbCAoMSBmb3IgOC1iaXQsIDMgZm9yIDI0LWJpdCBvciA0IGZvciAzMi1iaXQpCisJCQljb25zdCB1bnNpZ25lZCBieXRlc3BwID0gRnJlZUltYWdlX0dldExpbmUoc3JjKSAvIEZyZWVJbWFnZV9HZXRXaWR0aChzcmMpOworCisJCQlmb3IodW5zaWduZWQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworCQkJCWNvbnN0IEJZVEUgKnNyY19iaXRzID0gKEJZVEUqKUZyZWVJbWFnZV9HZXRTY2FuTGluZShzcmMsIHkpOworCQkJCUZJUkdCMTYgKmRzdF9iaXRzID0gKEZJUkdCMTYqKUZyZWVJbWFnZV9HZXRTY2FuTGluZShkc3QsIHkpOworCQkJCWZvcih1bnNpZ25lZCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQkJZHN0X2JpdHNbeF0ucmVkICAgPSBzcmNfYml0c1tGSV9SR0JBX1JFRF0gPDwgODsKKwkJCQkJZHN0X2JpdHNbeF0uZ3JlZW4gPSBzcmNfYml0c1tGSV9SR0JBX0dSRUVOXSA8PCA4OworCQkJCQlkc3RfYml0c1t4XS5ibHVlICA9IHNyY19iaXRzW0ZJX1JHQkFfQkxVRV0gPDwgODsKKwkJCQkJc3JjX2JpdHMgKz0gYnl0ZXNwcDsKKwkJCQl9CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSBGSVRfVUlOVDE2OgorCQl7CisJCQlmb3IodW5zaWduZWQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworCQkJCWNvbnN0IFdPUkQgKnNyY19iaXRzID0gKFdPUkQqKUZyZWVJbWFnZV9HZXRTY2FuTGluZShzcmMsIHkpOworCQkJCUZJUkdCMTYgKmRzdF9iaXRzID0gKEZJUkdCMTYqKUZyZWVJbWFnZV9HZXRTY2FuTGluZShkc3QsIHkpOworCQkJCWZvcih1bnNpZ25lZCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQkJLy8gY29udmVydCBieSBjb3B5aW5nIGdyZXlzY2FsZSBjaGFubmVsIHRvIGVhY2ggUiwgRywgQiBjaGFubmVscworCQkJCQlkc3RfYml0c1t4XS5yZWQgICA9IHNyY19iaXRzW3hdOworCQkJCQlkc3RfYml0c1t4XS5ncmVlbiA9IHNyY19iaXRzW3hdOworCQkJCQlkc3RfYml0c1t4XS5ibHVlICA9IHNyY19iaXRzW3hdOworCQkJCX0KKwkJCX0KKwkJfQorCQlicmVhazsKKworCQljYXNlIEZJVF9SR0JBMTY6CisJCXsKKwkJCWZvcih1bnNpZ25lZCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisJCQkJY29uc3QgRklSR0JBMTYgKnNyY19iaXRzID0gKEZJUkdCQTE2KilGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoc3JjLCB5KTsKKwkJCQlGSVJHQjE2ICpkc3RfYml0cyA9IChGSVJHQjE2KilGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZHN0LCB5KTsKKwkJCQlmb3IodW5zaWduZWQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisJCQkJCS8vIGNvbnZlcnQgYW5kIHNraXAgYWxwaGEgY2hhbm5lbAorCQkJCQlkc3RfYml0c1t4XS5yZWQgICA9IHNyY19iaXRzW3hdLnJlZDsKKwkJCQkJZHN0X2JpdHNbeF0uZ3JlZW4gPSBzcmNfYml0c1t4XS5ncmVlbjsKKwkJCQkJZHN0X2JpdHNbeF0uYmx1ZSAgPSBzcmNfYml0c1t4XS5ibHVlOworCQkJCX0KKwkJCX0KKwkJfQorCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCisJaWYoc3JjICE9IGRpYikgeworCQlGcmVlSW1hZ2VfVW5sb2FkKHNyYyk7CisJfQorCisJcmV0dXJuIGRzdDsKK30KKwpkaWZmIC0tZ2l0IGEvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9Db252ZXJzaW9uUkdCQTE2LmNwcCBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvQ29udmVyc2lvblJHQkExNi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkyNGJkOQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvQ29udmVyc2lvblJHQkExNi5jcHAKQEAgLTAsMCArMSwxNDcgQEAKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEJpdG1hcCBjb252ZXJzaW9uIHJvdXRpbmVzCisvLworLy8gRGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBieQorLy8gLSBIZXJ26SBEcm9sb24gKGRyb2xvbkBpbmZvbmllLmZyKQorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZyZWVJbWFnZSAzCisvLworLy8gQ09WRVJFRCBDT0RFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZCisvLyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUworLy8gVEhBVCBUSEUgQ09WRVJFRCBDT0RFIElTIEZSRUUgT0YgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisvLyBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRAorLy8gQ09ERSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVAorLy8gVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GIEFOWSBORUNFU1NBUlkKKy8vIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwKKy8vIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIKKy8vIFRISVMgRElTQ0xBSU1FUi4KKy8vCisvLyBVc2UgYXQgeW91ciBvd24gcmlzayEKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2luY2x1ZGUgIkZyZWVJbWFnZS5oIgorI2luY2x1ZGUgIlV0aWxpdGllcy5oIgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgIHNtYXJ0IGNvbnZlcnQgWCB0byBSR0JBMTYKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRklCSVRNQVAgKiBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9Db252ZXJ0VG9SR0JBMTYoRklCSVRNQVAgKmRpYikgeworCUZJQklUTUFQICpzcmMgPSBOVUxMOworCUZJQklUTUFQICpkc3QgPSBOVUxMOworCisJaWYoIUZyZWVJbWFnZV9IYXNQaXhlbHMoZGliKSkgcmV0dXJuIE5VTEw7CisKKwljb25zdCBGUkVFX0lNQUdFX1RZUEUgc3JjX3R5cGUgPSBGcmVlSW1hZ2VfR2V0SW1hZ2VUeXBlKGRpYik7CisKKwkvLyBjaGVjayBmb3IgYWxsb3dlZCBjb252ZXJzaW9ucyAKKwlzd2l0Y2goc3JjX3R5cGUpIHsKKwkJY2FzZSBGSVRfQklUTUFQOgorCQl7CisJCQkvLyBjb252ZXJ0IHRvIDMyLWJpdCBpZiBuZWVkZWQKKwkJCWlmKEZyZWVJbWFnZV9HZXRCUFAoZGliKSA9PSAzMikgeworCQkJCXNyYyA9IGRpYjsKKwkJCX0gZWxzZSB7CisJCQkJc3JjID0gRnJlZUltYWdlX0NvbnZlcnRUbzMyQml0cyhkaWIpOworCQkJCWlmKCFzcmMpIHJldHVybiBOVUxMOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBGSVRfVUlOVDE2OgorCQkJLy8gYWxsb3cgY29udmVyc2lvbiBmcm9tIHVuc2lnbmVkIDE2LWJpdAorCQkJc3JjID0gZGliOworCQkJYnJlYWs7CisJCWNhc2UgRklUX1JHQjE2OgorCQkJLy8gYWxsb3cgY29udmVyc2lvbiBmcm9tIDQ4LWJpdCBSR0IKKwkJCXNyYyA9IGRpYjsKKwkJCWJyZWFrOworCQljYXNlIEZJVF9SR0JBMTY6CisJCQkvLyBSR0JBMTYgdHlwZSA6IGNsb25lIHRoZSBzcmMKKwkJCXJldHVybiBGcmVlSW1hZ2VfQ2xvbmUoZGliKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIE5VTEw7CisJfQorCisJLy8gYWxsb2NhdGUgZHN0IGltYWdlCisKKwljb25zdCB1bnNpZ25lZCB3aWR0aCA9IEZyZWVJbWFnZV9HZXRXaWR0aChzcmMpOworCWNvbnN0IHVuc2lnbmVkIGhlaWdodCA9IEZyZWVJbWFnZV9HZXRIZWlnaHQoc3JjKTsKKworCWRzdCA9IEZyZWVJbWFnZV9BbGxvY2F0ZVQoRklUX1JHQkExNiwgd2lkdGgsIGhlaWdodCk7CisJaWYoIWRzdCkgeworCQlpZihzcmMgIT0gZGliKSB7CisJCQlGcmVlSW1hZ2VfVW5sb2FkKHNyYyk7CisJCX0KKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLy8gY29weSBtZXRhZGF0YSBmcm9tIHNyYyB0byBkc3QKKwlGcmVlSW1hZ2VfQ2xvbmVNZXRhZGF0YShkc3QsIHNyYyk7CisKKwkvLyBjb252ZXJ0IGZyb20gc3JjIHR5cGUgdG8gUkdCQTE2CisKKwlzd2l0Y2goc3JjX3R5cGUpIHsKKwkJY2FzZSBGSVRfQklUTUFQOgorCQl7CisJCQkvLyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBieXRlcyBwZXIgcGl4ZWwgKDQgZm9yIDMyLWJpdCkKKwkJCWNvbnN0IHVuc2lnbmVkIGJ5dGVzcHAgPSBGcmVlSW1hZ2VfR2V0TGluZShzcmMpIC8gRnJlZUltYWdlX0dldFdpZHRoKHNyYyk7CisKKwkJCWZvcih1bnNpZ25lZCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisJCQkJY29uc3QgQllURSAqc3JjX2JpdHMgPSAoQllURSopRnJlZUltYWdlX0dldFNjYW5MaW5lKHNyYywgeSk7CisJCQkJRklSR0JBMTYgKmRzdF9iaXRzID0gKEZJUkdCQTE2KilGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZHN0LCB5KTsKKwkJCQlmb3IodW5zaWduZWQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisJCQkJCWRzdF9iaXRzW3hdLnJlZAkJPSBzcmNfYml0c1tGSV9SR0JBX1JFRF0gPDwgODsKKwkJCQkJZHN0X2JpdHNbeF0uZ3JlZW4JPSBzcmNfYml0c1tGSV9SR0JBX0dSRUVOXSA8PCA4OworCQkJCQlkc3RfYml0c1t4XS5ibHVlCT0gc3JjX2JpdHNbRklfUkdCQV9CTFVFXSA8PCA4OworCQkJCQlkc3RfYml0c1t4XS5hbHBoYQk9IHNyY19iaXRzW0ZJX1JHQkFfQUxQSEFdIDw8IDg7CisJCQkJCXNyY19iaXRzICs9IGJ5dGVzcHA7CisJCQkJfQorCQkJfQorCQl9CisJCWJyZWFrOworCisJCWNhc2UgRklUX1VJTlQxNjoKKwkJeworCQkJZm9yKHVuc2lnbmVkIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJCQljb25zdCBXT1JEICpzcmNfYml0cyA9IChXT1JEKilGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoc3JjLCB5KTsKKwkJCQlGSVJHQkExNiAqZHN0X2JpdHMgPSAoRklSR0JBMTYqKUZyZWVJbWFnZV9HZXRTY2FuTGluZShkc3QsIHkpOworCQkJCWZvcih1bnNpZ25lZCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQkJLy8gY29udmVydCBieSBjb3B5aW5nIGdyZXlzY2FsZSBjaGFubmVsIHRvIGVhY2ggUiwgRywgQiBjaGFubmVscworCQkJCQlkc3RfYml0c1t4XS5yZWQgICA9IHNyY19iaXRzW3hdOworCQkJCQlkc3RfYml0c1t4XS5ncmVlbiA9IHNyY19iaXRzW3hdOworCQkJCQlkc3RfYml0c1t4XS5ibHVlICA9IHNyY19iaXRzW3hdOworCQkJCQlkc3RfYml0c1t4XS5hbHBoYSA9IDB4RkZGRjsKKwkJCQl9CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSBGSVRfUkdCMTY6CisJCXsKKwkJCWZvcih1bnNpZ25lZCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisJCQkJY29uc3QgRklSR0IxNiAqc3JjX2JpdHMgPSAoRklSR0IxNiopRnJlZUltYWdlX0dldFNjYW5MaW5lKHNyYywgeSk7CisJCQkJRklSR0JBMTYgKmRzdF9iaXRzID0gKEZJUkdCQTE2KilGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZHN0LCB5KTsKKwkJCQlmb3IodW5zaWduZWQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisJCQkJCS8vIGNvbnZlcnQgcGl4ZWxzIGRpcmVjdGx5LCB3aGlsZSBhZGRpbmcgYSAiZHVtbXkiIGFscGhhIG9mIDEuMAorCQkJCQlkc3RfYml0c1t4XS5yZWQgICA9IHNyY19iaXRzW3hdLnJlZDsKKwkJCQkJZHN0X2JpdHNbeF0uZ3JlZW4gPSBzcmNfYml0c1t4XS5ncmVlbjsKKwkJCQkJZHN0X2JpdHNbeF0uYmx1ZSAgPSBzcmNfYml0c1t4XS5ibHVlOworCQkJCQlkc3RfYml0c1t4XS5hbHBoYSA9IDB4RkZGRjsKKwkJCQl9CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KKworCWlmKHNyYyAhPSBkaWIpIHsKKwkJRnJlZUltYWdlX1VubG9hZChzcmMpOworCX0KKworCXJldHVybiBkc3Q7Cit9CisKZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvQ29udmVyc2lvblJHQkFGLmNwcCBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvQ29udmVyc2lvblJHQkFGLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTIzYWFhCi0tLSAvZGV2L251bGwKKysrIGIvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9Db252ZXJzaW9uUkdCQUYuY3BwCkBAIC0wLDAgKzEsMjUwIEBACisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBCaXRtYXAgY29udmVyc2lvbiByb3V0aW5lcworLy8KKy8vIERlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gYnkKKy8vIC0gVGFubmVyIEhlbGxhbmQgKHRhbm5lcmhlbGxhbmRAdXNlcnMuc2YubmV0KQorLy8gLSBIZXJ26SBEcm9sb24gKGRyb2xvbkBpbmZvbmllLmZyKQorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZyZWVJbWFnZSAzCisvLworLy8gQ09WRVJFRCBDT0RFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZCisvLyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUworLy8gVEhBVCBUSEUgQ09WRVJFRCBDT0RFIElTIEZSRUUgT0YgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisvLyBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRAorLy8gQ09ERSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVAorLy8gVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GIEFOWSBORUNFU1NBUlkKKy8vIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwKKy8vIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIKKy8vIFRISVMgRElTQ0xBSU1FUi4KKy8vCisvLyBVc2UgYXQgeW91ciBvd24gcmlzayEKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2luY2x1ZGUgIkZyZWVJbWFnZS5oIgorI2luY2x1ZGUgIlV0aWxpdGllcy5oIgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgIHNtYXJ0IGNvbnZlcnQgWCB0byBSR0JBRgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitGSUJJVE1BUCAqIERMTF9DQUxMQ09OVgorRnJlZUltYWdlX0NvbnZlcnRUb1JHQkFGKEZJQklUTUFQICpkaWIpIHsKKwlGSUJJVE1BUCAqc3JjID0gTlVMTDsKKwlGSUJJVE1BUCAqZHN0ID0gTlVMTDsKKworCWlmKCFGcmVlSW1hZ2VfSGFzUGl4ZWxzKGRpYikpIHJldHVybiBOVUxMOworCisJY29uc3QgRlJFRV9JTUFHRV9UWVBFIHNyY190eXBlID0gRnJlZUltYWdlX0dldEltYWdlVHlwZShkaWIpOworCisJLy8gY2hlY2sgZm9yIGFsbG93ZWQgY29udmVyc2lvbnMgCisJc3dpdGNoKHNyY190eXBlKSB7CisJCWNhc2UgRklUX0JJVE1BUDoKKwkJeworCQkJLy8gYWxsb3cgY29udmVyc2lvbiBmcm9tIDMyLWJpdAorCQkJY29uc3QgRlJFRV9JTUFHRV9DT0xPUl9UWVBFIGNvbG9yX3R5cGUgPSBGcmVlSW1hZ2VfR2V0Q29sb3JUeXBlKGRpYik7CisJCQlpZihjb2xvcl90eXBlICE9IEZJQ19SR0JBTFBIQSkgeworCQkJCXNyYyA9IEZyZWVJbWFnZV9Db252ZXJ0VG8zMkJpdHMoZGliKTsKKwkJCQlpZighc3JjKSByZXR1cm4gTlVMTDsKKwkJCX0gZWxzZSB7CisJCQkJc3JjID0gZGliOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBGSVRfVUlOVDE2OgorCQkJLy8gYWxsb3cgY29udmVyc2lvbiBmcm9tIDE2LWJpdAorCQkJc3JjID0gZGliOworCQkJYnJlYWs7CisJCWNhc2UgRklUX1JHQjE2OgorCQkJLy8gYWxsb3cgY29udmVyc2lvbiBmcm9tIDQ4LWJpdCBSR0IKKwkJCXNyYyA9IGRpYjsKKwkJCWJyZWFrOworCQljYXNlIEZJVF9SR0JBMTY6CisJCQkvLyBhbGxvdyBjb252ZXJzaW9uIGZyb20gNjQtYml0IFJHQkEKKwkJCXNyYyA9IGRpYjsKKwkJCWJyZWFrOworCQljYXNlIEZJVF9GTE9BVDoKKwkJCS8vIGFsbG93IGNvbnZlcnNpb24gZnJvbSAzMi1iaXQgZmxvYXQKKwkJCXNyYyA9IGRpYjsKKwkJCWJyZWFrOworCQljYXNlIEZJVF9SR0JGOgorCQkJLy8gYWxsb3cgY29udmVyc2lvbiBmcm9tIDk2LWJpdCBSR0JGCisJCQlzcmMgPSBkaWI7CisJCQlicmVhazsKKwkJY2FzZSBGSVRfUkdCQUY6CisJCQkvLyBSR0JBRiB0eXBlIDogY2xvbmUgdGhlIHNyYworCQkJcmV0dXJuIEZyZWVJbWFnZV9DbG9uZShkaWIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvLyBhbGxvY2F0ZSBkc3QgaW1hZ2UKKworCWNvbnN0IHVuc2lnbmVkIHdpZHRoID0gRnJlZUltYWdlX0dldFdpZHRoKHNyYyk7CisJY29uc3QgdW5zaWduZWQgaGVpZ2h0ID0gRnJlZUltYWdlX0dldEhlaWdodChzcmMpOworCisJZHN0ID0gRnJlZUltYWdlX0FsbG9jYXRlVChGSVRfUkdCQUYsIHdpZHRoLCBoZWlnaHQpOworCWlmKCFkc3QpIHsKKwkJaWYoc3JjICE9IGRpYikgeworCQkJRnJlZUltYWdlX1VubG9hZChzcmMpOworCQl9CisJCXJldHVybiBOVUxMOworCX0KKworCS8vIGNvcHkgbWV0YWRhdGEgZnJvbSBzcmMgdG8gZHN0CisJRnJlZUltYWdlX0Nsb25lTWV0YWRhdGEoZHN0LCBzcmMpOworCisJLy8gY29udmVydCBmcm9tIHNyYyB0eXBlIHRvIFJHQkFGCisKKwljb25zdCB1bnNpZ25lZCBzcmNfcGl0Y2ggPSBGcmVlSW1hZ2VfR2V0UGl0Y2goc3JjKTsKKwljb25zdCB1bnNpZ25lZCBkc3RfcGl0Y2ggPSBGcmVlSW1hZ2VfR2V0UGl0Y2goZHN0KTsKKworCXN3aXRjaChzcmNfdHlwZSkgeworCQljYXNlIEZJVF9CSVRNQVA6CisJCXsKKwkJCS8vIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHBlciBwaXhlbCAoNCBmb3IgMzItYml0KQorCQkJY29uc3QgdW5zaWduZWQgYnl0ZXNwcCA9IEZyZWVJbWFnZV9HZXRMaW5lKHNyYykgLyBGcmVlSW1hZ2VfR2V0V2lkdGgoc3JjKTsKKworCQkJY29uc3QgQllURSAqc3JjX2JpdHMgPSAoQllURSopRnJlZUltYWdlX0dldEJpdHMoc3JjKTsKKwkJCUJZVEUgKmRzdF9iaXRzID0gKEJZVEUqKUZyZWVJbWFnZV9HZXRCaXRzKGRzdCk7CisKKwkJCWZvcih1bnNpZ25lZCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisJCQkJY29uc3QgQllURSAqc3JjX3BpeGVsID0gKEJZVEUqKXNyY19iaXRzOworCQkJCUZJUkdCQUYgKmRzdF9waXhlbCA9IChGSVJHQkFGKilkc3RfYml0czsKKwkJCQlmb3IodW5zaWduZWQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisJCQkJCS8vIGNvbnZlcnQgYW5kIHNjYWxlIHRvIHRoZSByYW5nZSBbMC4uMV0KKwkJCQkJZHN0X3BpeGVsLT5yZWQgICA9IChmbG9hdCkoc3JjX3BpeGVsW0ZJX1JHQkFfUkVEXSkgICAvIDI1NS4wRjsKKwkJCQkJZHN0X3BpeGVsLT5ncmVlbiA9IChmbG9hdCkoc3JjX3BpeGVsW0ZJX1JHQkFfR1JFRU5dKSAvIDI1NS4wRjsKKwkJCQkJZHN0X3BpeGVsLT5ibHVlICA9IChmbG9hdCkoc3JjX3BpeGVsW0ZJX1JHQkFfQkxVRV0pICAvIDI1NS4wRjsKKwkJCQkJZHN0X3BpeGVsLT5hbHBoYSA9IChmbG9hdCkoc3JjX3BpeGVsW0ZJX1JHQkFfQUxQSEFdKSAvIDI1NS4wRjsKKworCQkJCQlzcmNfcGl4ZWwgKz0gYnl0ZXNwcDsKKwkJCQkJZHN0X3BpeGVsKys7CisJCQkJfQorCQkJCXNyY19iaXRzICs9IHNyY19waXRjaDsKKwkJCQlkc3RfYml0cyArPSBkc3RfcGl0Y2g7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSBGSVRfVUlOVDE2OgorCQl7CisJCQljb25zdCBCWVRFICpzcmNfYml0cyA9IChCWVRFKilGcmVlSW1hZ2VfR2V0Qml0cyhzcmMpOworCQkJQllURSAqZHN0X2JpdHMgPSAoQllURSopRnJlZUltYWdlX0dldEJpdHMoZHN0KTsKKworCQkJZm9yKHVuc2lnbmVkIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJCQljb25zdCBXT1JEICpzcmNfcGl4ZWwgPSAoV09SRCopc3JjX2JpdHM7CisJCQkJRklSR0JBRiAqZHN0X3BpeGVsID0gKEZJUkdCQUYqKWRzdF9iaXRzOworCisJCQkJZm9yKHVuc2lnbmVkIHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworCQkJCQkvLyBjb252ZXJ0IGFuZCBzY2FsZSB0byB0aGUgcmFuZ2UgWzAuLjFdCisJCQkJCWNvbnN0IGZsb2F0IGRzdF92YWx1ZSA9IChmbG9hdClzcmNfcGl4ZWxbeF0gLyA2NTUzNS4wRjsKKwkJCQkJZHN0X3BpeGVsW3hdLnJlZCAgID0gZHN0X3ZhbHVlOworCQkJCQlkc3RfcGl4ZWxbeF0uZ3JlZW4gPSBkc3RfdmFsdWU7CisJCQkJCWRzdF9waXhlbFt4XS5ibHVlICA9IGRzdF92YWx1ZTsKKwkJCQkJZHN0X3BpeGVsW3hdLmFscGhhID0gMS4wRjsKKwkJCQl9CisJCQkJc3JjX2JpdHMgKz0gc3JjX3BpdGNoOworCQkJCWRzdF9iaXRzICs9IGRzdF9waXRjaDsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCQljYXNlIEZJVF9SR0IxNjoKKwkJeworCQkJY29uc3QgQllURSAqc3JjX2JpdHMgPSAoQllURSopRnJlZUltYWdlX0dldEJpdHMoc3JjKTsKKwkJCUJZVEUgKmRzdF9iaXRzID0gKEJZVEUqKUZyZWVJbWFnZV9HZXRCaXRzKGRzdCk7CisKKwkJCWZvcih1bnNpZ25lZCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisJCQkJY29uc3QgRklSR0IxNiAqc3JjX3BpeGVsID0gKEZJUkdCMTYqKXNyY19iaXRzOworCQkJCUZJUkdCQUYgKmRzdF9waXhlbCA9IChGSVJHQkFGKilkc3RfYml0czsKKworCQkJCWZvcih1bnNpZ25lZCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQkJLy8gY29udmVydCBhbmQgc2NhbGUgdG8gdGhlIHJhbmdlIFswLi4xXQorCQkJCQlkc3RfcGl4ZWxbeF0ucmVkICAgPSAoZmxvYXQpKHNyY19waXhlbFt4XS5yZWQpICAgLyA2NTUzNS4wRjsKKwkJCQkJZHN0X3BpeGVsW3hdLmdyZWVuID0gKGZsb2F0KShzcmNfcGl4ZWxbeF0uZ3JlZW4pIC8gNjU1MzUuMEY7CisJCQkJCWRzdF9waXhlbFt4XS5ibHVlICA9IChmbG9hdCkoc3JjX3BpeGVsW3hdLmJsdWUpICAvIDY1NTM1LjBGOworCQkJCQlkc3RfcGl4ZWxbeF0uYWxwaGEgPSAxLjBGOworCQkJCX0KKwkJCQlzcmNfYml0cyArPSBzcmNfcGl0Y2g7CisJCQkJZHN0X2JpdHMgKz0gZHN0X3BpdGNoOworCQkJfQorCQl9CisJCWJyZWFrOworCisJCWNhc2UgRklUX1JHQkExNjoKKwkJeworCQkJY29uc3QgQllURSAqc3JjX2JpdHMgPSAoQllURSopRnJlZUltYWdlX0dldEJpdHMoc3JjKTsKKwkJCUJZVEUgKmRzdF9iaXRzID0gKEJZVEUqKUZyZWVJbWFnZV9HZXRCaXRzKGRzdCk7CisKKwkJCWZvcih1bnNpZ25lZCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisJCQkJY29uc3QgRklSR0JBMTYgKnNyY19waXhlbCA9IChGSVJHQkExNiopc3JjX2JpdHM7CisJCQkJRklSR0JBRiAqZHN0X3BpeGVsID0gKEZJUkdCQUYqKWRzdF9iaXRzOworCisJCQkJZm9yKHVuc2lnbmVkIHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworCQkJCQkvLyBjb252ZXJ0IGFuZCBzY2FsZSB0byB0aGUgcmFuZ2UgWzAuLjFdCisJCQkJCWRzdF9waXhlbFt4XS5yZWQgICA9IChmbG9hdCkoc3JjX3BpeGVsW3hdLnJlZCkgICAvIDY1NTM1LjBGOworCQkJCQlkc3RfcGl4ZWxbeF0uZ3JlZW4gPSAoZmxvYXQpKHNyY19waXhlbFt4XS5ncmVlbikgLyA2NTUzNS4wRjsKKwkJCQkJZHN0X3BpeGVsW3hdLmJsdWUgID0gKGZsb2F0KShzcmNfcGl4ZWxbeF0uYmx1ZSkgIC8gNjU1MzUuMEY7CisJCQkJCWRzdF9waXhlbFt4XS5hbHBoYSA9IChmbG9hdCkoc3JjX3BpeGVsW3hdLmFscGhhKSAvIDY1NTM1LjBGOworCQkJCX0KKwkJCQlzcmNfYml0cyArPSBzcmNfcGl0Y2g7CisJCQkJZHN0X2JpdHMgKz0gZHN0X3BpdGNoOworCQkJfQorCQl9CisJCWJyZWFrOworCisJCWNhc2UgRklUX0ZMT0FUOgorCQl7CisJCQljb25zdCBCWVRFICpzcmNfYml0cyA9IChCWVRFKilGcmVlSW1hZ2VfR2V0Qml0cyhzcmMpOworCQkJQllURSAqZHN0X2JpdHMgPSAoQllURSopRnJlZUltYWdlX0dldEJpdHMoZHN0KTsKKworCQkJZm9yKHVuc2lnbmVkIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJCQljb25zdCBmbG9hdCAqc3JjX3BpeGVsID0gKGZsb2F0KilzcmNfYml0czsKKwkJCQlGSVJHQkFGICpkc3RfcGl4ZWwgPSAoRklSR0JBRiopZHN0X2JpdHM7CisKKwkJCQlmb3IodW5zaWduZWQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisJCQkJCS8vIGNvbnZlcnQgYnkgY29weWluZyBncmV5c2NhbGUgY2hhbm5lbCB0byBlYWNoIFIsIEcsIEIgY2hhbm5lbHMKKwkJCQkJLy8gYXNzdW1lIGZsb2F0IHZhbHVlcyBhcmUgaW4gWzAuLjFdCisJCQkJCWNvbnN0IGZsb2F0IHZhbHVlID0gQ0xBTVAoc3JjX3BpeGVsW3hdLCAwLjBGLCAxLjBGKTsKKwkJCQkJZHN0X3BpeGVsW3hdLnJlZCAgID0gdmFsdWU7CisJCQkJCWRzdF9waXhlbFt4XS5ncmVlbiA9IHZhbHVlOworCQkJCQlkc3RfcGl4ZWxbeF0uYmx1ZSAgPSB2YWx1ZTsKKwkJCQkJZHN0X3BpeGVsW3hdLmFscGhhID0gMS4wRjsKKwkJCQl9CisJCQkJc3JjX2JpdHMgKz0gc3JjX3BpdGNoOworCQkJCWRzdF9iaXRzICs9IGRzdF9waXRjaDsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCQljYXNlIEZJVF9SR0JGOgorCQl7CisJCQljb25zdCBCWVRFICpzcmNfYml0cyA9IChCWVRFKilGcmVlSW1hZ2VfR2V0Qml0cyhzcmMpOworCQkJQllURSAqZHN0X2JpdHMgPSAoQllURSopRnJlZUltYWdlX0dldEJpdHMoZHN0KTsKKworCQkJZm9yKHVuc2lnbmVkIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJCQljb25zdCBGSVJHQkYgKnNyY19waXhlbCA9IChGSVJHQkYqKXNyY19iaXRzOworCQkJCUZJUkdCQUYgKmRzdF9waXhlbCA9IChGSVJHQkFGKilkc3RfYml0czsKKworCQkJCWZvcih1bnNpZ25lZCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQkJLy8gY29udmVydCBwaXhlbHMgZGlyZWN0bHksIHdoaWxlIGFkZGluZyBhICJkdW1teSIgYWxwaGEgb2YgMS4wCisJCQkJCWRzdF9waXhlbFt4XS5yZWQgICA9IENMQU1QKHNyY19waXhlbFt4XS5yZWQsIDAuMEYsIDEuMEYpOworCQkJCQlkc3RfcGl4ZWxbeF0uZ3JlZW4gPSBDTEFNUChzcmNfcGl4ZWxbeF0uZ3JlZW4sIDAuMEYsIDEuMEYpOworCQkJCQlkc3RfcGl4ZWxbeF0uYmx1ZSAgPSBDTEFNUChzcmNfcGl4ZWxbeF0uYmx1ZSwgMC4wRiwgMS4wRik7CisJCQkJCWRzdF9waXhlbFt4XS5hbHBoYSA9IDEuMEY7CisJCQkJfQorCQkJCXNyY19iaXRzICs9IHNyY19waXRjaDsKKwkJCQlkc3RfYml0cyArPSBkc3RfcGl0Y2g7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJfQorCisJaWYoc3JjICE9IGRpYikgeworCQlGcmVlSW1hZ2VfVW5sb2FkKHNyYyk7CisJfQorCisJcmV0dXJuIGRzdDsKK30KKwpkaWZmIC0tZ2l0IGEvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9Db252ZXJzaW9uUkdCRi5jcHAgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL0NvbnZlcnNpb25SR0JGLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzBkZDdiCi0tLSAvZGV2L251bGwKKysrIGIvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9Db252ZXJzaW9uUkdCRi5jcHAKQEAgLTAsMCArMSwyNDMgQEAKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEJpdG1hcCBjb252ZXJzaW9uIHJvdXRpbmVzCisvLworLy8gRGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBieQorLy8gLSBIZXJ26SBEcm9sb24gKGRyb2xvbkBpbmZvbmllLmZyKQorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZyZWVJbWFnZSAzCisvLworLy8gQ09WRVJFRCBDT0RFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZCisvLyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUworLy8gVEhBVCBUSEUgQ09WRVJFRCBDT0RFIElTIEZSRUUgT0YgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisvLyBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRAorLy8gQ09ERSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVAorLy8gVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GIEFOWSBORUNFU1NBUlkKKy8vIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwKKy8vIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIKKy8vIFRISVMgRElTQ0xBSU1FUi4KKy8vCisvLyBVc2UgYXQgeW91ciBvd24gcmlzayEKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2luY2x1ZGUgIkZyZWVJbWFnZS5oIgorI2luY2x1ZGUgIlV0aWxpdGllcy5oIgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgIHNtYXJ0IGNvbnZlcnQgWCB0byBSR0JGCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0ZJQklUTUFQICogRExMX0NBTExDT05WCitGcmVlSW1hZ2VfQ29udmVydFRvUkdCRihGSUJJVE1BUCAqZGliKSB7CisJRklCSVRNQVAgKnNyYyA9IE5VTEw7CisJRklCSVRNQVAgKmRzdCA9IE5VTEw7CisKKwlpZighRnJlZUltYWdlX0hhc1BpeGVscyhkaWIpKSByZXR1cm4gTlVMTDsKKworCWNvbnN0IEZSRUVfSU1BR0VfVFlQRSBzcmNfdHlwZSA9IEZyZWVJbWFnZV9HZXRJbWFnZVR5cGUoZGliKTsKKworCS8vIGNoZWNrIGZvciBhbGxvd2VkIGNvbnZlcnNpb25zIAorCXN3aXRjaChzcmNfdHlwZSkgeworCQljYXNlIEZJVF9CSVRNQVA6CisJCXsKKwkJCS8vIGFsbG93IGNvbnZlcnNpb24gZnJvbSAyNC0gYW5kIDMyLWJpdAorCQkJY29uc3QgRlJFRV9JTUFHRV9DT0xPUl9UWVBFIGNvbG9yX3R5cGUgPSBGcmVlSW1hZ2VfR2V0Q29sb3JUeXBlKGRpYik7CisJCQlpZigoY29sb3JfdHlwZSAhPSBGSUNfUkdCKSAmJiAoY29sb3JfdHlwZSAhPSBGSUNfUkdCQUxQSEEpKSB7CisJCQkJc3JjID0gRnJlZUltYWdlX0NvbnZlcnRUbzI0Qml0cyhkaWIpOworCQkJCWlmKCFzcmMpIHJldHVybiBOVUxMOworCQkJfSBlbHNlIHsKKwkJCQlzcmMgPSBkaWI7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQljYXNlIEZJVF9VSU5UMTY6CisJCQkvLyBhbGxvdyBjb252ZXJzaW9uIGZyb20gMTYtYml0CisJCQlzcmMgPSBkaWI7CisJCQlicmVhazsKKwkJY2FzZSBGSVRfUkdCMTY6CisJCQkvLyBhbGxvdyBjb252ZXJzaW9uIGZyb20gNDgtYml0IFJHQgorCQkJc3JjID0gZGliOworCQkJYnJlYWs7CisJCWNhc2UgRklUX1JHQkExNjoKKwkJCS8vIGFsbG93IGNvbnZlcnNpb24gZnJvbSA2NC1iaXQgUkdCQSAoaWdub3JlIHRoZSBhbHBoYSBjaGFubmVsKQorCQkJc3JjID0gZGliOworCQkJYnJlYWs7CisJCWNhc2UgRklUX0ZMT0FUOgorCQkJLy8gYWxsb3cgY29udmVyc2lvbiBmcm9tIDMyLWJpdCBmbG9hdAorCQkJc3JjID0gZGliOworCQkJYnJlYWs7CisJCWNhc2UgRklUX1JHQkFGOgorCQkJLy8gYWxsb3cgY29udmVyc2lvbiBmcm9tIDEyOC1iaXQgUkdCQUYKKwkJCXNyYyA9IGRpYjsKKwkJCWJyZWFrOworCQljYXNlIEZJVF9SR0JGOgorCQkJLy8gUkdCRiB0eXBlIDogY2xvbmUgdGhlIHNyYworCQkJcmV0dXJuIEZyZWVJbWFnZV9DbG9uZShkaWIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvLyBhbGxvY2F0ZSBkc3QgaW1hZ2UKKworCWNvbnN0IHVuc2lnbmVkIHdpZHRoID0gRnJlZUltYWdlX0dldFdpZHRoKHNyYyk7CisJY29uc3QgdW5zaWduZWQgaGVpZ2h0ID0gRnJlZUltYWdlX0dldEhlaWdodChzcmMpOworCisJZHN0ID0gRnJlZUltYWdlX0FsbG9jYXRlVChGSVRfUkdCRiwgd2lkdGgsIGhlaWdodCk7CisJaWYoIWRzdCkgeworCQlpZihzcmMgIT0gZGliKSB7CisJCQlGcmVlSW1hZ2VfVW5sb2FkKHNyYyk7CisJCX0KKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLy8gY29weSBtZXRhZGF0YSBmcm9tIHNyYyB0byBkc3QKKwlGcmVlSW1hZ2VfQ2xvbmVNZXRhZGF0YShkc3QsIHNyYyk7CisKKwkvLyBjb252ZXJ0IGZyb20gc3JjIHR5cGUgdG8gUkdCRgorCisJY29uc3QgdW5zaWduZWQgc3JjX3BpdGNoID0gRnJlZUltYWdlX0dldFBpdGNoKHNyYyk7CisJY29uc3QgdW5zaWduZWQgZHN0X3BpdGNoID0gRnJlZUltYWdlX0dldFBpdGNoKGRzdCk7CisKKwlzd2l0Y2goc3JjX3R5cGUpIHsKKwkJY2FzZSBGSVRfQklUTUFQOgorCQl7CisJCQkvLyBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiBieXRlcyBwZXIgcGl4ZWwgKDMgZm9yIDI0LWJpdCBvciA0IGZvciAzMi1iaXQpCisJCQljb25zdCB1bnNpZ25lZCBieXRlc3BwID0gRnJlZUltYWdlX0dldExpbmUoc3JjKSAvIEZyZWVJbWFnZV9HZXRXaWR0aChzcmMpOworCisJCQljb25zdCBCWVRFICpzcmNfYml0cyA9IChCWVRFKilGcmVlSW1hZ2VfR2V0Qml0cyhzcmMpOworCQkJQllURSAqZHN0X2JpdHMgPSAoQllURSopRnJlZUltYWdlX0dldEJpdHMoZHN0KTsKKworCQkJZm9yKHVuc2lnbmVkIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJCQljb25zdCBCWVRFICAgKnNyY19waXhlbCA9IChCWVRFKilzcmNfYml0czsKKwkJCQlGSVJHQkYgKmRzdF9waXhlbCA9IChGSVJHQkYqKWRzdF9iaXRzOworCQkJCWZvcih1bnNpZ25lZCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQkJLy8gY29udmVydCBhbmQgc2NhbGUgdG8gdGhlIHJhbmdlIFswLi4xXQorCQkJCQlkc3RfcGl4ZWwtPnJlZCAgID0gKGZsb2F0KShzcmNfcGl4ZWxbRklfUkdCQV9SRURdKSAgIC8gMjU1LjBGOworCQkJCQlkc3RfcGl4ZWwtPmdyZWVuID0gKGZsb2F0KShzcmNfcGl4ZWxbRklfUkdCQV9HUkVFTl0pIC8gMjU1LjBGOworCQkJCQlkc3RfcGl4ZWwtPmJsdWUgID0gKGZsb2F0KShzcmNfcGl4ZWxbRklfUkdCQV9CTFVFXSkgIC8gMjU1LjBGOworCisJCQkJCXNyY19waXhlbCArPSBieXRlc3BwOworCQkJCQlkc3RfcGl4ZWwgKys7CisJCQkJfQorCQkJCXNyY19iaXRzICs9IHNyY19waXRjaDsKKwkJCQlkc3RfYml0cyArPSBkc3RfcGl0Y2g7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSBGSVRfVUlOVDE2OgorCQl7CisJCQljb25zdCBCWVRFICpzcmNfYml0cyA9IChCWVRFKilGcmVlSW1hZ2VfR2V0Qml0cyhzcmMpOworCQkJQllURSAqZHN0X2JpdHMgPSAoQllURSopRnJlZUltYWdlX0dldEJpdHMoZHN0KTsKKworCQkJZm9yKHVuc2lnbmVkIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJCQljb25zdCBXT1JEICpzcmNfcGl4ZWwgPSAoV09SRCopc3JjX2JpdHM7CisJCQkJRklSR0JGICpkc3RfcGl4ZWwgPSAoRklSR0JGKilkc3RfYml0czsKKworCQkJCWZvcih1bnNpZ25lZCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQkJLy8gY29udmVydCBhbmQgc2NhbGUgdG8gdGhlIHJhbmdlIFswLi4xXQorCQkJCQljb25zdCBmbG9hdCBkc3RfdmFsdWUgPSAoZmxvYXQpc3JjX3BpeGVsW3hdIC8gNjU1MzUuMEY7CisJCQkJCWRzdF9waXhlbFt4XS5yZWQgICA9IGRzdF92YWx1ZTsKKwkJCQkJZHN0X3BpeGVsW3hdLmdyZWVuID0gZHN0X3ZhbHVlOworCQkJCQlkc3RfcGl4ZWxbeF0uYmx1ZSAgPSBkc3RfdmFsdWU7CisJCQkJfQorCQkJCXNyY19iaXRzICs9IHNyY19waXRjaDsKKwkJCQlkc3RfYml0cyArPSBkc3RfcGl0Y2g7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSBGSVRfUkdCMTY6CisJCXsKKwkJCWNvbnN0IEJZVEUgKnNyY19iaXRzID0gKEJZVEUqKUZyZWVJbWFnZV9HZXRCaXRzKHNyYyk7CisJCQlCWVRFICpkc3RfYml0cyA9IChCWVRFKilGcmVlSW1hZ2VfR2V0Qml0cyhkc3QpOworCisJCQlmb3IodW5zaWduZWQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworCQkJCWNvbnN0IEZJUkdCMTYgKnNyY19waXhlbCA9IChGSVJHQjE2Kikgc3JjX2JpdHM7CisJCQkJRklSR0JGICAqZHN0X3BpeGVsID0gKEZJUkdCRiopICBkc3RfYml0czsKKworCQkJCWZvcih1bnNpZ25lZCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQkJLy8gY29udmVydCBhbmQgc2NhbGUgdG8gdGhlIHJhbmdlIFswLi4xXQorCQkJCQlkc3RfcGl4ZWxbeF0ucmVkICAgPSAoZmxvYXQpKHNyY19waXhlbFt4XS5yZWQpICAgLyA2NTUzNS4wRjsKKwkJCQkJZHN0X3BpeGVsW3hdLmdyZWVuID0gKGZsb2F0KShzcmNfcGl4ZWxbeF0uZ3JlZW4pIC8gNjU1MzUuMEY7CisJCQkJCWRzdF9waXhlbFt4XS5ibHVlICA9IChmbG9hdCkoc3JjX3BpeGVsW3hdLmJsdWUpICAvIDY1NTM1LjBGOworCQkJCX0KKwkJCQlzcmNfYml0cyArPSBzcmNfcGl0Y2g7CisJCQkJZHN0X2JpdHMgKz0gZHN0X3BpdGNoOworCQkJfQorCQl9CisJCWJyZWFrOworCisJCWNhc2UgRklUX1JHQkExNjoKKwkJeworCQkJY29uc3QgQllURSAqc3JjX2JpdHMgPSAoQllURSopRnJlZUltYWdlX0dldEJpdHMoc3JjKTsKKwkJCUJZVEUgKmRzdF9iaXRzID0gKEJZVEUqKUZyZWVJbWFnZV9HZXRCaXRzKGRzdCk7CisKKwkJCWZvcih1bnNpZ25lZCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisJCQkJY29uc3QgRklSR0JBMTYgKnNyY19waXhlbCA9IChGSVJHQkExNiopIHNyY19iaXRzOworCQkJCUZJUkdCRiAgKmRzdF9waXhlbCA9IChGSVJHQkYqKSAgZHN0X2JpdHM7CisKKwkJCQlmb3IodW5zaWduZWQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisJCQkJCS8vIGNvbnZlcnQgYW5kIHNjYWxlIHRvIHRoZSByYW5nZSBbMC4uMV0KKwkJCQkJZHN0X3BpeGVsW3hdLnJlZCAgID0gKGZsb2F0KShzcmNfcGl4ZWxbeF0ucmVkKSAgIC8gNjU1MzUuMEY7CisJCQkJCWRzdF9waXhlbFt4XS5ncmVlbiA9IChmbG9hdCkoc3JjX3BpeGVsW3hdLmdyZWVuKSAvIDY1NTM1LjBGOworCQkJCQlkc3RfcGl4ZWxbeF0uYmx1ZSAgPSAoZmxvYXQpKHNyY19waXhlbFt4XS5ibHVlKSAgLyA2NTUzNS4wRjsKKwkJCQl9CisJCQkJc3JjX2JpdHMgKz0gc3JjX3BpdGNoOworCQkJCWRzdF9iaXRzICs9IGRzdF9waXRjaDsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCQljYXNlIEZJVF9GTE9BVDoKKwkJeworCQkJY29uc3QgQllURSAqc3JjX2JpdHMgPSAoQllURSopRnJlZUltYWdlX0dldEJpdHMoc3JjKTsKKwkJCUJZVEUgKmRzdF9iaXRzID0gKEJZVEUqKUZyZWVJbWFnZV9HZXRCaXRzKGRzdCk7CisKKwkJCWZvcih1bnNpZ25lZCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisJCQkJY29uc3QgZmxvYXQgKnNyY19waXhlbCA9IChmbG9hdCopIHNyY19iaXRzOworCQkJCUZJUkdCRiAgKmRzdF9waXhlbCA9IChGSVJHQkYqKSAgZHN0X2JpdHM7CisKKwkJCQlmb3IodW5zaWduZWQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisJCQkJCS8vIGNvbnZlcnQgYnkgY29weWluZyBncmV5c2NhbGUgY2hhbm5lbCB0byBlYWNoIFIsIEcsIEIgY2hhbm5lbHMKKwkJCQkJLy8gYXNzdW1lIGZsb2F0IHZhbHVlcyBhcmUgaW4gWzAuLjFdCisJCQkJCWNvbnN0IGZsb2F0IHZhbHVlID0gQ0xBTVAoc3JjX3BpeGVsW3hdLCAwLjBGLCAxLjBGKTsKKwkJCQkJZHN0X3BpeGVsW3hdLnJlZCAgID0gdmFsdWU7CisJCQkJCWRzdF9waXhlbFt4XS5ncmVlbiA9IHZhbHVlOworCQkJCQlkc3RfcGl4ZWxbeF0uYmx1ZSAgPSB2YWx1ZTsKKwkJCQl9CisJCQkJc3JjX2JpdHMgKz0gc3JjX3BpdGNoOworCQkJCWRzdF9iaXRzICs9IGRzdF9waXRjaDsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCQljYXNlIEZJVF9SR0JBRjoKKwkJeworCQkJY29uc3QgQllURSAqc3JjX2JpdHMgPSAoQllURSopRnJlZUltYWdlX0dldEJpdHMoc3JjKTsKKwkJCUJZVEUgKmRzdF9iaXRzID0gKEJZVEUqKUZyZWVJbWFnZV9HZXRCaXRzKGRzdCk7CisKKwkJCWZvcih1bnNpZ25lZCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisJCQkJY29uc3QgRklSR0JBRiAqc3JjX3BpeGVsID0gKEZJUkdCQUYqKSBzcmNfYml0czsKKwkJCQlGSVJHQkYgICpkc3RfcGl4ZWwgPSAoRklSR0JGKikgIGRzdF9iaXRzOworCisJCQkJZm9yKHVuc2lnbmVkIHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworCQkJCQkvLyBjb252ZXJ0IGFuZCBza2lwIGFscGhhIGNoYW5uZWwKKwkJCQkJZHN0X3BpeGVsW3hdLnJlZCAgID0gQ0xBTVAoc3JjX3BpeGVsW3hdLnJlZCwgMC4wRiwgMS4wRik7CisJCQkJCWRzdF9waXhlbFt4XS5ncmVlbiA9IENMQU1QKHNyY19waXhlbFt4XS5ncmVlbiwgMC4wRiwgMS4wRik7CisJCQkJCWRzdF9waXhlbFt4XS5ibHVlICA9IENMQU1QKHNyY19waXhlbFt4XS5ibHVlLCAwLjBGLCAxLjBGKTsKKwkJCQl9CisJCQkJc3JjX2JpdHMgKz0gc3JjX3BpdGNoOworCQkJCWRzdF9iaXRzICs9IGRzdF9waXRjaDsKKwkJCX0KKwkJfQorCQlicmVhazsKKwl9CisKKwlpZihzcmMgIT0gZGliKSB7CisJCUZyZWVJbWFnZV9VbmxvYWQoc3JjKTsKKwl9CisKKwlyZXR1cm4gZHN0OworfQorCmRpZmYgLS1naXQgYS9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL0NvbnZlcnNpb25UeXBlLmNwcCBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvQ29udmVyc2lvblR5cGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyY2E5MGYKLS0tIC9kZXYvbnVsbAorKysgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL0NvbnZlcnNpb25UeXBlLmNwcApAQCAtMCwwICsxLDY5OSBAQAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gQml0bWFwIGNvbnZlcnNpb24gcm91dGluZXMKKy8vCisvLyBEZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIGJ5CisvLyAtIEhlcnbpIERyb2xvbiAoZHJvbG9uQGluZm9uaWUuZnIpCisvLyAtIFRhbm5lciBIZWxsYW5kICh0YW5uZXJoZWxsYW5kQHVzZXJzLnNmLm5ldCkKKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBGcmVlSW1hZ2UgMworLy8KKy8vIENPVkVSRUQgQ09ERSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWQorLy8gT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMKKy8vIFRIQVQgVEhFIENPVkVSRUQgQ09ERSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLy8gT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQKKy8vIENPREUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkgQ09WRVJFRCBDT0RFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QKKy8vIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZCisvLyBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMCisvLyBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GIEFOWSBDT1ZFUkVEIENPREUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSCisvLyBUSElTIERJU0NMQUlNRVIuCisvLworLy8gVXNlIGF0IHlvdXIgb3duIHJpc2shCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpbmNsdWRlICJGcmVlSW1hZ2UuaCIKKyNpbmNsdWRlICJVdGlsaXRpZXMuaCIKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKiogQ29udmVydCBhIGdyZXlzY2FsZSBpbWFnZSBvZiB0eXBlIFRzcmMgdG8gdHlwZSBUZHN0LgorCUNvbnZlcnNpb24gaXMgZG9uZSB1c2luZyBzdGFuZGFyZCBDIGxhbmd1YWdlIGNhc3RpbmcgY29udmVudGlvbi4KKyovCit0ZW1wbGF0ZTxjbGFzcyBUZHN0LCBjbGFzcyBUc3JjPgorY2xhc3MgQ09OVkVSVF9UWVBFCit7CitwdWJsaWM6CisJRklCSVRNQVAqIGNvbnZlcnQoRklCSVRNQVAgKnNyYywgRlJFRV9JTUFHRV9UWVBFIGRzdF90eXBlKTsKK307CisKK3RlbXBsYXRlPGNsYXNzIFRkc3QsIGNsYXNzIFRzcmM+IEZJQklUTUFQKiAKK0NPTlZFUlRfVFlQRTxUZHN0LCBUc3JjPjo6Y29udmVydChGSUJJVE1BUCAqc3JjLCBGUkVFX0lNQUdFX1RZUEUgZHN0X3R5cGUpIHsKKworCUZJQklUTUFQICpkc3QgPSBOVUxMOworCisJdW5zaWduZWQgd2lkdGgJPSBGcmVlSW1hZ2VfR2V0V2lkdGgoc3JjKTsKKwl1bnNpZ25lZCBoZWlnaHQgPSBGcmVlSW1hZ2VfR2V0SGVpZ2h0KHNyYyk7CisJdW5zaWduZWQgYnBwCT0gRnJlZUltYWdlX0dldEJQUChzcmMpOworCisJLy8gYWxsb2NhdGUgZHN0IGltYWdlCisKKwlkc3QgPSBGcmVlSW1hZ2VfQWxsb2NhdGVUKGRzdF90eXBlLCB3aWR0aCwgaGVpZ2h0LCBicHAsIAorCQkJRnJlZUltYWdlX0dldFJlZE1hc2soc3JjKSwgRnJlZUltYWdlX0dldEdyZWVuTWFzayhzcmMpLCBGcmVlSW1hZ2VfR2V0Qmx1ZU1hc2soc3JjKSk7CisJaWYoIWRzdCkgcmV0dXJuIE5VTEw7CisKKwkvLyBjb252ZXJ0IGZyb20gc3JjX3R5cGUgdG8gZHN0X3R5cGUKKwkKKwlmb3IodW5zaWduZWQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworCQljb25zdCBUc3JjICpzcmNfYml0cyA9IHJlaW50ZXJwcmV0X2Nhc3Q8VHNyYyo+KEZyZWVJbWFnZV9HZXRTY2FuTGluZShzcmMsIHkpKTsKKwkJVGRzdCAqZHN0X2JpdHMgPSByZWludGVycHJldF9jYXN0PFRkc3QqPihGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZHN0LCB5KSk7CisKKwkJZm9yKHVuc2lnbmVkIHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworCQkJKmRzdF9iaXRzKysgPSBzdGF0aWNfY2FzdDxUZHN0Pigqc3JjX2JpdHMrKyk7CisJCX0KKwl9CisKKwlyZXR1cm4gZHN0OworfQorCisKKy8qKiBDb252ZXJ0IGEgZ3JleXNjYWxlIGltYWdlIG9mIHR5cGUgVHNyYyB0byBhIDgtYml0IGdyYXlzY2FsZSBkaWIuCisJQ29udmVyc2lvbiBpcyBkb25lIHVzaW5nIGVpdGhlciBhIGxpbmVhciBzY2FsaW5nIGZyb20gW21pbiwgbWF4XSB0byBbMCwgMjU1XQorCW9yIGEgcm91bmRpbmcgZnJvbSBzcmNfcGl4ZWwgdG8gKEJZVEUpIE1JTigyNTUsIE1BWCgwLCBxKSkgd2hlcmUgaW50IHEgPSBpbnQoc3JjX3BpeGVsICsgMC41KTsgCisqLwordGVtcGxhdGU8Y2xhc3MgVHNyYz4KK2NsYXNzIENPTlZFUlRfVE9fQllURQoreworcHVibGljOgorCUZJQklUTUFQKiBjb252ZXJ0KEZJQklUTUFQICpzcmMsIEJPT0wgc2NhbGVfbGluZWFyKTsKK307CisKK3RlbXBsYXRlPGNsYXNzIFRzcmM+IEZJQklUTUFQKiAKK0NPTlZFUlRfVE9fQllURTxUc3JjPjo6Y29udmVydChGSUJJVE1BUCAqc3JjLCBCT09MIHNjYWxlX2xpbmVhcikgeworCUZJQklUTUFQICpkc3QgPSBOVUxMOworCXVuc2lnbmVkIHgsIHk7CisKKwl1bnNpZ25lZCB3aWR0aAk9IEZyZWVJbWFnZV9HZXRXaWR0aChzcmMpOworCXVuc2lnbmVkIGhlaWdodCA9IEZyZWVJbWFnZV9HZXRIZWlnaHQoc3JjKTsKKworCS8vIGFsbG9jYXRlIGEgOC1iaXQgZGliCisKKwlkc3QgPSBGcmVlSW1hZ2VfQWxsb2NhdGVUKEZJVF9CSVRNQVAsIHdpZHRoLCBoZWlnaHQsIDgsIDAsIDAsIDApOworCWlmKCFkc3QpIHJldHVybiBOVUxMOworCisJLy8gYnVpbGQgYSBncmV5c2NhbGUgcGFsZXR0ZQorCVJHQlFVQUQgKnBhbCA9IEZyZWVJbWFnZV9HZXRQYWxldHRlKGRzdCk7CisJZm9yKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCXBhbFtpXS5yZ2JSZWQgPSAoQllURSlpOworCQlwYWxbaV0ucmdiR3JlZW4gPSAoQllURSlpOworCQlwYWxbaV0ucmdiQmx1ZSA9IChCWVRFKWk7CisJfQorCisJLy8gY29udmVydCB0aGUgc3JjIGltYWdlIHRvIGRzdAorCS8vIChGSUJJVE1BUCBhcmUgc3RvcmVkIHVwc2lkZSBkb3duKQorCWlmKHNjYWxlX2xpbmVhcikgeworCQlUc3JjIG1heCwgbWluOworCQlkb3VibGUgc2NhbGU7CisKKwkJLy8gZmluZCB0aGUgbWluIGFuZCBtYXggdmFsdWUgb2YgdGhlIGltYWdlCisJCVRzcmMgbF9taW4sIGxfbWF4OworCQltaW4gPSAyNTUsIG1heCA9IDA7CisJCWZvcih5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisJCQlUc3JjICpiaXRzID0gcmVpbnRlcnByZXRfY2FzdDxUc3JjKj4oRnJlZUltYWdlX0dldFNjYW5MaW5lKHNyYywgeSkpOworCQkJTUFYTUlOKGJpdHMsIHdpZHRoLCBsX21heCwgbF9taW4pOworCQkJaWYobF9tYXggPiBtYXgpIG1heCA9IGxfbWF4OworCQkJaWYobF9taW4gPCBtaW4pIG1pbiA9IGxfbWluOworCQl9CisJCWlmKG1heCA9PSBtaW4pIHsKKwkJCW1heCA9IDI1NTsgbWluID0gMDsKKwkJfQorCisJCS8vIGNvbXB1dGUgdGhlIHNjYWxpbmcgZmFjdG9yCisJCXNjYWxlID0gMjU1IC8gKGRvdWJsZSkobWF4IC0gbWluKTsKKworCQkvLyBzY2FsZSB0byA4LWJpdAorCQlmb3IoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworCQkJVHNyYyAqc3JjX2JpdHMgPSByZWludGVycHJldF9jYXN0PFRzcmMqPihGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoc3JjLCB5KSk7CisJCQlCWVRFICpkc3RfYml0cyA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShkc3QsIHkpOworCQkJZm9yKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworCQkJCWRzdF9iaXRzW3hdID0gKEJZVEUpKCBzY2FsZSAqIChzcmNfYml0c1t4XSAtIG1pbikgKyAwLjUpOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJZm9yKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJCVRzcmMgKnNyY19iaXRzID0gcmVpbnRlcnByZXRfY2FzdDxUc3JjKj4oRnJlZUltYWdlX0dldFNjYW5MaW5lKHNyYywgeSkpOworCQkJQllURSAqZHN0X2JpdHMgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZHN0LCB5KTsKKwkJCWZvcih4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQkvLyByb3VuZGluZworCQkJCWludCBxID0gaW50KHNyY19iaXRzW3hdICsgMC41KTsKKwkJCQlkc3RfYml0c1t4XSA9IChCWVRFKSBNSU4oMjU1LCBNQVgoMCwgcSkpOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIGRzdDsKK30KKworLyoqIENvbnZlcnQgYSBncmV5c2NhbGUgaW1hZ2Ugb2YgdHlwZSBUc3JjIHRvIGEgRklDT01QTEVYIGRpYi4KKyovCit0ZW1wbGF0ZTxjbGFzcyBUc3JjPgorY2xhc3MgQ09OVkVSVF9UT19DT01QTEVYCit7CitwdWJsaWM6CisJRklCSVRNQVAqIGNvbnZlcnQoRklCSVRNQVAgKnNyYyk7Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBUc3JjPiBGSUJJVE1BUCogCitDT05WRVJUX1RPX0NPTVBMRVg8VHNyYz46OmNvbnZlcnQoRklCSVRNQVAgKnNyYykgeworCUZJQklUTUFQICpkc3QgPSBOVUxMOworCisJdW5zaWduZWQgd2lkdGgJPSBGcmVlSW1hZ2VfR2V0V2lkdGgoc3JjKTsKKwl1bnNpZ25lZCBoZWlnaHQgPSBGcmVlSW1hZ2VfR2V0SGVpZ2h0KHNyYyk7CisKKwkvLyBhbGxvY2F0ZSBkc3QgaW1hZ2UKKworCWRzdCA9IEZyZWVJbWFnZV9BbGxvY2F0ZVQoRklUX0NPTVBMRVgsIHdpZHRoLCBoZWlnaHQpOworCWlmKCFkc3QpIHJldHVybiBOVUxMOworCisJLy8gY29udmVydCBmcm9tIHNyY190eXBlIHRvIEZJVF9DT01QTEVYCisJCisJZm9yKHVuc2lnbmVkIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJY29uc3QgVHNyYyAqc3JjX2JpdHMgPSByZWludGVycHJldF9jYXN0PFRzcmMqPihGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoc3JjLCB5KSk7CisJCUZJQ09NUExFWCAqZHN0X2JpdHMgPSAoRklDT01QTEVYICopRnJlZUltYWdlX0dldFNjYW5MaW5lKGRzdCwgeSk7CisKKwkJZm9yKHVuc2lnbmVkIHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworCQkJZHN0X2JpdHNbeF0uciA9IChkb3VibGUpc3JjX2JpdHNbeF07CisJCQlkc3RfYml0c1t4XS5pID0gMDsKKwkJfQorCX0KKworCXJldHVybiBkc3Q7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gQ29udmVydCBmcm9tIHR5cGUgQllURSB0byB0eXBlIFgKK0NPTlZFUlRfVFlQRTx1bnNpZ25lZCBzaG9ydCwgQllURT4JY29udmVydEJ5dGVUb1VTaG9ydDsKK0NPTlZFUlRfVFlQRTxzaG9ydCwgQllURT4JCQljb252ZXJ0Qnl0ZVRvU2hvcnQ7CitDT05WRVJUX1RZUEU8RFdPUkQsIEJZVEU+CQkJY29udmVydEJ5dGVUb1VMb25nOworQ09OVkVSVF9UWVBFPExPTkcsIEJZVEU+CQkJY29udmVydEJ5dGVUb0xvbmc7CitDT05WRVJUX1RZUEU8ZmxvYXQsIEJZVEU+CQkJY29udmVydEJ5dGVUb0Zsb2F0OworQ09OVkVSVF9UWVBFPGRvdWJsZSwgQllURT4JCQljb252ZXJ0Qnl0ZVRvRG91YmxlOworCisvLyBDb252ZXJ0IGZyb20gdHlwZSBYIHRvIHR5cGUgQllURQorQ09OVkVSVF9UT19CWVRFPHVuc2lnbmVkIHNob3J0Pgljb252ZXJ0VVNob3J0VG9CeXRlOworQ09OVkVSVF9UT19CWVRFPHNob3J0PgkJCWNvbnZlcnRTaG9ydFRvQnl0ZTsKK0NPTlZFUlRfVE9fQllURTxEV09SRD4JCQljb252ZXJ0VUxvbmdUb0J5dGU7CitDT05WRVJUX1RPX0JZVEU8TE9ORz4JCQljb252ZXJ0TG9uZ1RvQnl0ZTsKK0NPTlZFUlRfVE9fQllURTxmbG9hdD4JCQljb252ZXJ0RmxvYXRUb0J5dGU7CitDT05WRVJUX1RPX0JZVEU8ZG91YmxlPgkJCWNvbnZlcnREb3VibGVUb0J5dGU7CisKKy8vIENvbnZlcnQgZnJvbSB0eXBlIFggdG8gdHlwZSBmbG9hdAorQ09OVkVSVF9UWVBFPGZsb2F0LCB1bnNpZ25lZCBzaG9ydD4JY29udmVydFVTaG9ydFRvRmxvYXQ7CitDT05WRVJUX1RZUEU8ZmxvYXQsIHNob3J0PgkJCWNvbnZlcnRTaG9ydFRvRmxvYXQ7CitDT05WRVJUX1RZUEU8ZmxvYXQsIERXT1JEPgkJCWNvbnZlcnRVTG9uZ1RvRmxvYXQ7CitDT05WRVJUX1RZUEU8ZmxvYXQsIExPTkc+CQkJY29udmVydExvbmdUb0Zsb2F0OworCisvLyBDb252ZXJ0IGZyb20gdHlwZSBYIHRvIHR5cGUgZG91YmxlCitDT05WRVJUX1RZUEU8ZG91YmxlLCB1bnNpZ25lZCBzaG9ydD4JY29udmVydFVTaG9ydFRvRG91YmxlOworQ09OVkVSVF9UWVBFPGRvdWJsZSwgc2hvcnQ+CQkJCWNvbnZlcnRTaG9ydFRvRG91YmxlOworQ09OVkVSVF9UWVBFPGRvdWJsZSwgRFdPUkQ+CQkJCWNvbnZlcnRVTG9uZ1RvRG91YmxlOworQ09OVkVSVF9UWVBFPGRvdWJsZSwgTE9ORz4JCQkJY29udmVydExvbmdUb0RvdWJsZTsKK0NPTlZFUlRfVFlQRTxkb3VibGUsIGZsb2F0PgkJCQljb252ZXJ0RmxvYXRUb0RvdWJsZTsKKworLy8gQ29udmVydCBmcm9tIHR5cGUgWCB0byB0eXBlIEZJQ09NUExFWAorQ09OVkVSVF9UT19DT01QTEVYPEJZVEU+CQkJY29udmVydEJ5dGVUb0NvbXBsZXg7CitDT05WRVJUX1RPX0NPTVBMRVg8dW5zaWduZWQgc2hvcnQ+CWNvbnZlcnRVU2hvcnRUb0NvbXBsZXg7CitDT05WRVJUX1RPX0NPTVBMRVg8c2hvcnQ+CQkJY29udmVydFNob3J0VG9Db21wbGV4OworQ09OVkVSVF9UT19DT01QTEVYPERXT1JEPgkJCWNvbnZlcnRVTG9uZ1RvQ29tcGxleDsKK0NPTlZFUlRfVE9fQ09NUExFWDxMT05HPgkJCWNvbnZlcnRMb25nVG9Db21wbGV4OworQ09OVkVSVF9UT19DT01QTEVYPGZsb2F0PgkJCWNvbnZlcnRGbG9hdFRvQ29tcGxleDsKK0NPTlZFUlRfVE9fQ09NUExFWDxkb3VibGU+CQkJY29udmVydERvdWJsZVRvQ29tcGxleDsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgIHNtYXJ0IGNvbnZlcnQgWCB0byBzdGFuZGFyZCBGSUJJVE1BUAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKiogQ29udmVydCBpbWFnZSBvZiBhbnkgdHlwZSB0byBhIHN0YW5kYXJkIDgtYml0IGdyZXlzY2FsZSBpbWFnZS4KK0ZvciBzdGFuZGFyZCBpbWFnZXMsIGEgY2xvbmUgb2YgdGhlIGlucHV0IGltYWdlIGlzIHJldHVybmVkLgorV2hlbiB0aGUgc2NhbGVfbGluZWFyIHBhcmFtZXRlciBpcyBUUlVFLCBjb252ZXJzaW9uIGlzIGRvbmUgYnkgc2NhbGluZyBsaW5lYXJseSAKK2VhY2ggcGl4ZWwgdG8gYW4gaW50ZWdlciB2YWx1ZSBiZXR3ZWVuIFswLi4yNTVdLiBXaGVuIGl0IGlzIEZBTFNFLCBjb252ZXJzaW9uIGlzIGRvbmUgCitieSByb3VuZGluZyBlYWNoIGZsb2F0IHBpeGVsIHRvIGFuIGludGVnZXIgYmV0d2VlbiBbMC4uMjU1XS4gCitGb3IgY29tcGxleCBpbWFnZXMsIHRoZSBtYWduaXR1ZGUgaXMgZXh0cmFjdGVkIGFzIGEgZG91YmxlIGltYWdlLCB0aGVuIGNvbnZlcnRlZCBhY2NvcmRpbmcgdG8gdGhlIHNjYWxlIHBhcmFtZXRlci4gCitAcGFyYW0gaW1hZ2UgSW1hZ2UgdG8gY29udmVydAorQHBhcmFtIHNjYWxlX2xpbmVhciBMaW5lYXIgc2NhbGluZyAvIHJvdW5kaW5nIHN3aXRjaAorKi8KK0ZJQklUTUFQKiBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9Db252ZXJ0VG9TdGFuZGFyZFR5cGUoRklCSVRNQVAgKnNyYywgQk9PTCBzY2FsZV9saW5lYXIpIHsKKwlGSUJJVE1BUCAqZHN0ID0gTlVMTDsKKworCWlmKCFzcmMpIHJldHVybiBOVUxMOworCisJLy8gY29udmVydCBmcm9tIHNyY190eXBlIHRvIEZJVF9CSVRNQVAKKworCWNvbnN0IEZSRUVfSU1BR0VfVFlQRSBzcmNfdHlwZSA9IEZyZWVJbWFnZV9HZXRJbWFnZVR5cGUoc3JjKTsKKworCXN3aXRjaChzcmNfdHlwZSkgeworCQljYXNlIEZJVF9CSVRNQVA6CS8vIHN0YW5kYXJkIGltYWdlOiAxLSwgNC0sIDgtLCAxNi0sIDI0LSwgMzItYml0CisJCQlkc3QgPSBGcmVlSW1hZ2VfQ2xvbmUoc3JjKTsKKwkJCWJyZWFrOworCQljYXNlIEZJVF9VSU5UMTY6CS8vIGFycmF5IG9mIHVuc2lnbmVkIHNob3J0OiB1bnNpZ25lZCAxNi1iaXQKKwkJCWRzdCA9IGNvbnZlcnRVU2hvcnRUb0J5dGUuY29udmVydChzcmMsIHNjYWxlX2xpbmVhcik7CisJCQlicmVhazsKKwkJY2FzZSBGSVRfSU5UMTY6CQkvLyBhcnJheSBvZiBzaG9ydDogc2lnbmVkIDE2LWJpdAorCQkJZHN0ID0gY29udmVydFNob3J0VG9CeXRlLmNvbnZlcnQoc3JjLCBzY2FsZV9saW5lYXIpOworCQkJYnJlYWs7CisJCWNhc2UgRklUX1VJTlQzMjoJLy8gYXJyYXkgb2YgdW5zaWduZWQgbG9uZzogdW5zaWduZWQgMzItYml0CisJCQlkc3QgPSBjb252ZXJ0VUxvbmdUb0J5dGUuY29udmVydChzcmMsIHNjYWxlX2xpbmVhcik7CisJCQlicmVhazsKKwkJY2FzZSBGSVRfSU5UMzI6CQkvLyBhcnJheSBvZiBsb25nOiBzaWduZWQgMzItYml0CisJCQlkc3QgPSBjb252ZXJ0TG9uZ1RvQnl0ZS5jb252ZXJ0KHNyYywgc2NhbGVfbGluZWFyKTsKKwkJCWJyZWFrOworCQljYXNlIEZJVF9GTE9BVDoJCS8vIGFycmF5IG9mIGZsb2F0OiAzMi1iaXQKKwkJCWRzdCA9IGNvbnZlcnRGbG9hdFRvQnl0ZS5jb252ZXJ0KHNyYywgc2NhbGVfbGluZWFyKTsKKwkJCWJyZWFrOworCQljYXNlIEZJVF9ET1VCTEU6CS8vIGFycmF5IG9mIGRvdWJsZTogNjQtYml0CisJCQlkc3QgPSBjb252ZXJ0RG91YmxlVG9CeXRlLmNvbnZlcnQoc3JjLCBzY2FsZV9saW5lYXIpOworCQkJYnJlYWs7CisJCWNhc2UgRklUX0NPTVBMRVg6CS8vIGFycmF5IG9mIEZJQ09NUExFWDogMiB4IDY0LWJpdAorCQkJeworCQkJCS8vIENvbnZlcnQgdG8gdHlwZSBGSVRfRE9VQkxFCisJCQkJRklCSVRNQVAgKmRpYl9kb3VibGUgPSBGcmVlSW1hZ2VfR2V0Q29tcGxleENoYW5uZWwoc3JjLCBGSUNDX01BRyk7CisJCQkJaWYoZGliX2RvdWJsZSkgeworCQkJCQkvLyBDb252ZXJ0IHRvIGEgc3RhbmRhcmQgYml0bWFwIChsaW5lYXIgc2NhbGluZykKKwkJCQkJZHN0ID0gY29udmVydERvdWJsZVRvQnl0ZS5jb252ZXJ0KGRpYl9kb3VibGUsIHNjYWxlX2xpbmVhcik7CisJCQkJCS8vIEZyZWUgaW1hZ2Ugb2YgdHlwZSBGSVRfRE9VQkxFCisJCQkJCUZyZWVJbWFnZV9VbmxvYWQoZGliX2RvdWJsZSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgRklUX1JHQjE2OgkJLy8gNDgtYml0IFJHQiBpbWFnZTogMyB4IDE2LWJpdAorCQkJYnJlYWs7CisJCWNhc2UgRklUX1JHQkExNjoJLy8gNjQtYml0IFJHQkEgaW1hZ2U6IDQgeCAxNi1iaXQKKwkJCWJyZWFrOworCQljYXNlIEZJVF9SR0JGOgkJLy8gOTYtYml0IFJHQiBmbG9hdCBpbWFnZTogMyB4IDMyLWJpdCBJRUVFIGZsb2F0aW5nIHBvaW50CisJCQlicmVhazsKKwkJY2FzZSBGSVRfUkdCQUY6CQkvLyAxMjgtYml0IFJHQkEgZmxvYXQgaW1hZ2U6IDQgeCAzMi1iaXQgSUVFRSBmbG9hdGluZyBwb2ludAorCQkJYnJlYWs7CisJfQorCisJaWYoTlVMTCA9PSBkc3QpIHsKKwkJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKEZJRl9VTktOT1dOLCAiRlJFRV9JTUFHRV9UWVBFOiBVbmFibGUgdG8gY29udmVydCBmcm9tIHR5cGUgJWQgdG8gdHlwZSAlZC5cbiBObyBzdWNoIGNvbnZlcnNpb24gZXhpc3RzLiIsIHNyY190eXBlLCBGSVRfQklUTUFQKTsKKwl9IGVsc2UgeworCQkvLyBjb3B5IG1ldGFkYXRhIGZyb20gc3JjIHRvIGRzdAorCQlGcmVlSW1hZ2VfQ2xvbmVNZXRhZGF0YShkc3QsIHNyYyk7CisJfQorCQorCXJldHVybiBkc3Q7Cit9CisKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgIHNtYXJ0IGNvbnZlcnQgWCB0byBZCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0ZJQklUTUFQKiBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9Db252ZXJ0VG9UeXBlKEZJQklUTUFQICpzcmMsIEZSRUVfSU1BR0VfVFlQRSBkc3RfdHlwZSwgQk9PTCBzY2FsZV9saW5lYXIpIHsKKwlGSUJJVE1BUCAqZHN0ID0gTlVMTDsKKworCWlmKCFGcmVlSW1hZ2VfSGFzUGl4ZWxzKHNyYykpIHJldHVybiBOVUxMOworCisJLy8gY29udmVydCBmcm9tIHNyY190eXBlIHRvIGRzdF90eXBlCisKKwljb25zdCBGUkVFX0lNQUdFX1RZUEUgc3JjX3R5cGUgPSBGcmVlSW1hZ2VfR2V0SW1hZ2VUeXBlKHNyYyk7CisKKwlpZihzcmNfdHlwZSA9PSBkc3RfdHlwZSkgeworCQlyZXR1cm4gRnJlZUltYWdlX0Nsb25lKHNyYyk7CisJfQorCisJY29uc3QgdW5zaWduZWQgc3JjX2JwcCA9IEZyZWVJbWFnZV9HZXRCUFAoc3JjKTsKKworCXN3aXRjaChzcmNfdHlwZSkgeworCQljYXNlIEZJVF9CSVRNQVA6CisJCQlzd2l0Y2goZHN0X3R5cGUpIHsKKwkJCQljYXNlIEZJVF9VSU5UMTY6CisJCQkJCWRzdCA9IEZyZWVJbWFnZV9Db252ZXJ0VG9VSU5UMTYoc3JjKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBGSVRfSU5UMTY6CisJCQkJCWRzdCA9IChzcmNfYnBwID09IDgpID8gY29udmVydEJ5dGVUb1Nob3J0LmNvbnZlcnQoc3JjLCBkc3RfdHlwZSkgOiBOVUxMOworCQkJCQlicmVhazsKKwkJCQljYXNlIEZJVF9VSU5UMzI6CisJCQkJCWRzdCA9IChzcmNfYnBwID09IDgpID8gY29udmVydEJ5dGVUb1VMb25nLmNvbnZlcnQoc3JjLCBkc3RfdHlwZSkgOiBOVUxMOworCQkJCQlicmVhazsKKwkJCQljYXNlIEZJVF9JTlQzMjoKKwkJCQkJZHN0ID0gKHNyY19icHAgPT0gOCkgPyBjb252ZXJ0Qnl0ZVRvTG9uZy5jb252ZXJ0KHNyYywgZHN0X3R5cGUpIDogTlVMTDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBGSVRfRkxPQVQ6CisJCQkJCWRzdCA9IEZyZWVJbWFnZV9Db252ZXJ0VG9GbG9hdChzcmMpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEZJVF9ET1VCTEU6CisJCQkJCWRzdCA9IChzcmNfYnBwID09IDgpID8gY29udmVydEJ5dGVUb0RvdWJsZS5jb252ZXJ0KHNyYywgZHN0X3R5cGUpIDogTlVMTDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBGSVRfQ09NUExFWDoKKwkJCQkJZHN0ID0gKHNyY19icHAgPT0gOCkgPyBjb252ZXJ0Qnl0ZVRvQ29tcGxleC5jb252ZXJ0KHNyYykgOiBOVUxMOworCQkJCQlicmVhazsKKwkJCQljYXNlIEZJVF9SR0IxNjoKKwkJCQkJZHN0ID0gRnJlZUltYWdlX0NvbnZlcnRUb1JHQjE2KHNyYyk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRklUX1JHQkExNjoKKwkJCQkJZHN0ID0gRnJlZUltYWdlX0NvbnZlcnRUb1JHQkExNihzcmMpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEZJVF9SR0JGOgorCQkJCQlkc3QgPSBGcmVlSW1hZ2VfQ29udmVydFRvUkdCRihzcmMpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEZJVF9SR0JBRjoKKwkJCQkJZHN0ID0gRnJlZUltYWdlX0NvbnZlcnRUb1JHQkFGKHNyYyk7CisJCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgRklUX1VJTlQxNjoKKwkJCXN3aXRjaChkc3RfdHlwZSkgeworCQkJCWNhc2UgRklUX0JJVE1BUDoKKwkJCQkJZHN0ID0gRnJlZUltYWdlX0NvbnZlcnRUb1N0YW5kYXJkVHlwZShzcmMsIHNjYWxlX2xpbmVhcik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRklUX0lOVDE2OgorCQkJCQlicmVhazsKKwkJCQljYXNlIEZJVF9VSU5UMzI6CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRklUX0lOVDMyOgorCQkJCQlicmVhazsKKwkJCQljYXNlIEZJVF9GTE9BVDoKKwkJCQkJZHN0ID0gRnJlZUltYWdlX0NvbnZlcnRUb0Zsb2F0KHNyYyk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRklUX0RPVUJMRToKKwkJCQkJZHN0ID0gY29udmVydFVTaG9ydFRvRG91YmxlLmNvbnZlcnQoc3JjLCBkc3RfdHlwZSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRklUX0NPTVBMRVg6CisJCQkJCWRzdCA9IGNvbnZlcnRVU2hvcnRUb0NvbXBsZXguY29udmVydChzcmMpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEZJVF9SR0IxNjoKKwkJCQkJZHN0ID0gRnJlZUltYWdlX0NvbnZlcnRUb1JHQjE2KHNyYyk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRklUX1JHQkExNjoKKwkJCQkJZHN0ID0gRnJlZUltYWdlX0NvbnZlcnRUb1JHQkExNihzcmMpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEZJVF9SR0JGOgorCQkJCQlkc3QgPSBGcmVlSW1hZ2VfQ29udmVydFRvUkdCRihzcmMpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEZJVF9SR0JBRjoKKwkJCQkJZHN0ID0gRnJlZUltYWdlX0NvbnZlcnRUb1JHQkFGKHNyYyk7CisJCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgRklUX0lOVDE2OgorCQkJc3dpdGNoKGRzdF90eXBlKSB7CisJCQkJY2FzZSBGSVRfQklUTUFQOgorCQkJCQlkc3QgPSBGcmVlSW1hZ2VfQ29udmVydFRvU3RhbmRhcmRUeXBlKHNyYywgc2NhbGVfbGluZWFyKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBGSVRfVUlOVDE2OgorCQkJCQlicmVhazsKKwkJCQljYXNlIEZJVF9VSU5UMzI6CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRklUX0lOVDMyOgorCQkJCQlicmVhazsKKwkJCQljYXNlIEZJVF9GTE9BVDoKKwkJCQkJZHN0ID0gY29udmVydFNob3J0VG9GbG9hdC5jb252ZXJ0KHNyYywgZHN0X3R5cGUpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEZJVF9ET1VCTEU6CisJCQkJCWRzdCA9IGNvbnZlcnRTaG9ydFRvRG91YmxlLmNvbnZlcnQoc3JjLCBkc3RfdHlwZSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRklUX0NPTVBMRVg6CisJCQkJCWRzdCA9IGNvbnZlcnRTaG9ydFRvQ29tcGxleC5jb252ZXJ0KHNyYyk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRklUX1JHQjE2OgorCQkJCQlicmVhazsKKwkJCQljYXNlIEZJVF9SR0JBMTY6CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRklUX1JHQkY6CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRklUX1JHQkFGOgorCQkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEZJVF9VSU5UMzI6CisJCQlzd2l0Y2goZHN0X3R5cGUpIHsKKwkJCQljYXNlIEZJVF9CSVRNQVA6CisJCQkJCWRzdCA9IEZyZWVJbWFnZV9Db252ZXJ0VG9TdGFuZGFyZFR5cGUoc3JjLCBzY2FsZV9saW5lYXIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEZJVF9VSU5UMTY6CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRklUX0lOVDE2OgorCQkJCQlicmVhazsKKwkJCQljYXNlIEZJVF9JTlQzMjoKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBGSVRfRkxPQVQ6CisJCQkJCWRzdCA9IGNvbnZlcnRVTG9uZ1RvRmxvYXQuY29udmVydChzcmMsIGRzdF90eXBlKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBGSVRfRE9VQkxFOgorCQkJCQlkc3QgPSBjb252ZXJ0VUxvbmdUb0RvdWJsZS5jb252ZXJ0KHNyYywgZHN0X3R5cGUpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEZJVF9DT01QTEVYOgorCQkJCQlkc3QgPSBjb252ZXJ0VUxvbmdUb0NvbXBsZXguY29udmVydChzcmMpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEZJVF9SR0IxNjoKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBGSVRfUkdCQTE2OgorCQkJCQlicmVhazsKKwkJCQljYXNlIEZJVF9SR0JGOgorCQkJCQlicmVhazsKKwkJCQljYXNlIEZJVF9SR0JBRjoKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBGSVRfSU5UMzI6CisJCQlzd2l0Y2goZHN0X3R5cGUpIHsKKwkJCQljYXNlIEZJVF9CSVRNQVA6CisJCQkJCWRzdCA9IEZyZWVJbWFnZV9Db252ZXJ0VG9TdGFuZGFyZFR5cGUoc3JjLCBzY2FsZV9saW5lYXIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEZJVF9VSU5UMTY6CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRklUX0lOVDE2OgorCQkJCQlicmVhazsKKwkJCQljYXNlIEZJVF9VSU5UMzI6CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRklUX0ZMT0FUOgorCQkJCQlkc3QgPSBjb252ZXJ0TG9uZ1RvRmxvYXQuY29udmVydChzcmMsIGRzdF90eXBlKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBGSVRfRE9VQkxFOgorCQkJCQlkc3QgPSBjb252ZXJ0TG9uZ1RvRG91YmxlLmNvbnZlcnQoc3JjLCBkc3RfdHlwZSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRklUX0NPTVBMRVg6CisJCQkJCWRzdCA9IGNvbnZlcnRMb25nVG9Db21wbGV4LmNvbnZlcnQoc3JjKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBGSVRfUkdCMTY6CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRklUX1JHQkExNjoKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBGSVRfUkdCRjoKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBGSVRfUkdCQUY6CisJCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgRklUX0ZMT0FUOgorCQkJc3dpdGNoKGRzdF90eXBlKSB7CisJCQkJY2FzZSBGSVRfQklUTUFQOgorCQkJCQlkc3QgPSBGcmVlSW1hZ2VfQ29udmVydFRvU3RhbmRhcmRUeXBlKHNyYywgc2NhbGVfbGluZWFyKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBGSVRfVUlOVDE2OgorCQkJCQlicmVhazsKKwkJCQljYXNlIEZJVF9JTlQxNjoKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBGSVRfVUlOVDMyOgorCQkJCQlicmVhazsKKwkJCQljYXNlIEZJVF9JTlQzMjoKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBGSVRfRE9VQkxFOgorCQkJCQlkc3QgPSBjb252ZXJ0RmxvYXRUb0RvdWJsZS5jb252ZXJ0KHNyYywgZHN0X3R5cGUpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEZJVF9DT01QTEVYOgorCQkJCQlkc3QgPSBjb252ZXJ0RmxvYXRUb0NvbXBsZXguY29udmVydChzcmMpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEZJVF9SR0IxNjoKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBGSVRfUkdCQTE2OgorCQkJCQlicmVhazsKKwkJCQljYXNlIEZJVF9SR0JGOgorCQkJCQlkc3QgPSBGcmVlSW1hZ2VfQ29udmVydFRvUkdCRihzcmMpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEZJVF9SR0JBRjoKKwkJCQkJZHN0ID0gRnJlZUltYWdlX0NvbnZlcnRUb1JHQkFGKHNyYyk7CisJCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgRklUX0RPVUJMRToKKwkJCXN3aXRjaChkc3RfdHlwZSkgeworCQkJCWNhc2UgRklUX0JJVE1BUDoKKwkJCQkJZHN0ID0gRnJlZUltYWdlX0NvbnZlcnRUb1N0YW5kYXJkVHlwZShzcmMsIHNjYWxlX2xpbmVhcik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRklUX1VJTlQxNjoKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBGSVRfSU5UMTY6CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRklUX1VJTlQzMjoKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBGSVRfSU5UMzI6CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRklUX0ZMT0FUOgorCQkJCQlicmVhazsKKwkJCQljYXNlIEZJVF9DT01QTEVYOgorCQkJCQlkc3QgPSBjb252ZXJ0RG91YmxlVG9Db21wbGV4LmNvbnZlcnQoc3JjKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBGSVRfUkdCMTY6CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRklUX1JHQkExNjoKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBGSVRfUkdCRjoKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBGSVRfUkdCQUY6CisJCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgRklUX0NPTVBMRVg6CisJCQlzd2l0Y2goZHN0X3R5cGUpIHsKKwkJCQljYXNlIEZJVF9CSVRNQVA6CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRklUX1VJTlQxNjoKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBGSVRfSU5UMTY6CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRklUX1VJTlQzMjoKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBGSVRfSU5UMzI6CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRklUX0ZMT0FUOgorCQkJCQlicmVhazsKKwkJCQljYXNlIEZJVF9ET1VCTEU6CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRklUX1JHQjE2OgorCQkJCQlicmVhazsKKwkJCQljYXNlIEZJVF9SR0JBMTY6CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRklUX1JHQkY6CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRklUX1JHQkFGOgorCQkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEZJVF9SR0IxNjoKKwkJCXN3aXRjaChkc3RfdHlwZSkgeworCQkJCWNhc2UgRklUX0JJVE1BUDoKKwkJCQkJZHN0ID0gRnJlZUltYWdlX0NvbnZlcnRUbzI0Qml0cyhzcmMpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEZJVF9VSU5UMTY6CisJCQkJCWRzdCA9IEZyZWVJbWFnZV9Db252ZXJ0VG9VSU5UMTYoc3JjKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBGSVRfSU5UMTY6CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRklUX1VJTlQzMjoKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBGSVRfSU5UMzI6CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRklUX0ZMT0FUOgorCQkJCQlkc3QgPSBGcmVlSW1hZ2VfQ29udmVydFRvRmxvYXQoc3JjKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBGSVRfRE9VQkxFOgorCQkJCQlicmVhazsKKwkJCQljYXNlIEZJVF9DT01QTEVYOgorCQkJCQlicmVhazsKKwkJCQljYXNlIEZJVF9SR0JBMTY6CisJCQkJCWRzdCA9IEZyZWVJbWFnZV9Db252ZXJ0VG9SR0JBMTYoc3JjKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBGSVRfUkdCRjoKKwkJCQkJZHN0ID0gRnJlZUltYWdlX0NvbnZlcnRUb1JHQkYoc3JjKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBGSVRfUkdCQUY6CisJCQkJCWRzdCA9IEZyZWVJbWFnZV9Db252ZXJ0VG9SR0JBRihzcmMpOworCQkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEZJVF9SR0JBMTY6CisJCQlzd2l0Y2goZHN0X3R5cGUpIHsKKwkJCQljYXNlIEZJVF9CSVRNQVA6CisJCQkJCWRzdCA9IEZyZWVJbWFnZV9Db252ZXJ0VG8zMkJpdHMoc3JjKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBGSVRfVUlOVDE2OgorCQkJCQlkc3QgPSBGcmVlSW1hZ2VfQ29udmVydFRvVUlOVDE2KHNyYyk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRklUX0lOVDE2OgorCQkJCQlicmVhazsKKwkJCQljYXNlIEZJVF9VSU5UMzI6CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRklUX0lOVDMyOgorCQkJCQlicmVhazsKKwkJCQljYXNlIEZJVF9GTE9BVDoKKwkJCQkJZHN0ID0gRnJlZUltYWdlX0NvbnZlcnRUb0Zsb2F0KHNyYyk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRklUX0RPVUJMRToKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBGSVRfQ09NUExFWDoKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBGSVRfUkdCMTY6CisJCQkJCWRzdCA9IEZyZWVJbWFnZV9Db252ZXJ0VG9SR0IxNihzcmMpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEZJVF9SR0JGOgorCQkJCQlkc3QgPSBGcmVlSW1hZ2VfQ29udmVydFRvUkdCRihzcmMpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEZJVF9SR0JBRjoKKwkJCQkJZHN0ID0gRnJlZUltYWdlX0NvbnZlcnRUb1JHQkFGKHNyYyk7CisJCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgRklUX1JHQkY6CisJCQlzd2l0Y2goZHN0X3R5cGUpIHsKKwkJCQljYXNlIEZJVF9CSVRNQVA6CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRklUX1VJTlQxNjoKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBGSVRfSU5UMTY6CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRklUX1VJTlQzMjoKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBGSVRfSU5UMzI6CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRklUX0ZMT0FUOgorCQkJCQlkc3QgPSBGcmVlSW1hZ2VfQ29udmVydFRvRmxvYXQoc3JjKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBGSVRfRE9VQkxFOgorCQkJCQlicmVhazsKKwkJCQljYXNlIEZJVF9DT01QTEVYOgorCQkJCQlicmVhazsKKwkJCQljYXNlIEZJVF9SR0IxNjoKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBGSVRfUkdCQTE2OgorCQkJCQlicmVhazsKKwkJCQljYXNlIEZJVF9SR0JBRjoKKwkJCQkJZHN0ID0gRnJlZUltYWdlX0NvbnZlcnRUb1JHQkFGKHNyYyk7CisJCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgRklUX1JHQkFGOgorCQkJc3dpdGNoKGRzdF90eXBlKSB7CisJCQkJY2FzZSBGSVRfQklUTUFQOgorCQkJCQlicmVhazsKKwkJCQljYXNlIEZJVF9VSU5UMTY6CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRklUX0lOVDE2OgorCQkJCQlicmVhazsKKwkJCQljYXNlIEZJVF9VSU5UMzI6CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRklUX0lOVDMyOgorCQkJCQlicmVhazsKKwkJCQljYXNlIEZJVF9GTE9BVDoKKwkJCQkJZHN0ID0gRnJlZUltYWdlX0NvbnZlcnRUb0Zsb2F0KHNyYyk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRklUX0RPVUJMRToKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBGSVRfQ09NUExFWDoKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBGSVRfUkdCMTY6CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRklUX1JHQkExNjoKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBGSVRfUkdCRjoKKwkJCQkJZHN0ID0gRnJlZUltYWdlX0NvbnZlcnRUb1JHQkYoc3JjKTsKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKwl9CisKKwlpZihOVUxMID09IGRzdCkgeworCQlGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2MoRklGX1VOS05PV04sICJGUkVFX0lNQUdFX1RZUEU6IFVuYWJsZSB0byBjb252ZXJ0IGZyb20gdHlwZSAlZCB0byB0eXBlICVkLlxuIE5vIHN1Y2ggY29udmVyc2lvbiBleGlzdHMuIiwgc3JjX3R5cGUsIGRzdF90eXBlKTsKKwl9IGVsc2UgeworCQkvLyBjb3B5IG1ldGFkYXRhIGZyb20gc3JjIHRvIGRzdAorCQlGcmVlSW1hZ2VfQ2xvbmVNZXRhZGF0YShkc3QsIHNyYyk7CisJfQorCisJcmV0dXJuIGRzdDsKK30KZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvQ29udmVyc2lvblVJTlQxNi5jcHAgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL0NvbnZlcnNpb25VSU5UMTYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NDkyYWEKLS0tIC9kZXYvbnVsbAorKysgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL0NvbnZlcnNpb25VSU5UMTYuY3BwCkBAIC0wLDAgKzEsMTM0IEBACisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBCaXRtYXAgY29udmVyc2lvbiByb3V0aW5lcworLy8KKy8vIERlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gYnkKKy8vIC0gSGVydukgRHJvbG9uIChkcm9sb25AaW5mb25pZS5mcikKKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBGcmVlSW1hZ2UgMworLy8KKy8vIENPVkVSRUQgQ09ERSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWQorLy8gT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMKKy8vIFRIQVQgVEhFIENPVkVSRUQgQ09ERSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLy8gT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQKKy8vIENPREUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkgQ09WRVJFRCBDT0RFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QKKy8vIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZCisvLyBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMCisvLyBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GIEFOWSBDT1ZFUkVEIENPREUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSCisvLyBUSElTIERJU0NMQUlNRVIuCisvLworLy8gVXNlIGF0IHlvdXIgb3duIHJpc2shCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpbmNsdWRlICJGcmVlSW1hZ2UuaCIKKyNpbmNsdWRlICJVdGlsaXRpZXMuaCIKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICBzbWFydCBjb252ZXJ0IFggdG8gVUlOVDE2CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0ZJQklUTUFQICogRExMX0NBTExDT05WCitGcmVlSW1hZ2VfQ29udmVydFRvVUlOVDE2KEZJQklUTUFQICpkaWIpIHsKKwlGSUJJVE1BUCAqc3JjID0gTlVMTDsKKwlGSUJJVE1BUCAqZHN0ID0gTlVMTDsKKworCWlmKCFGcmVlSW1hZ2VfSGFzUGl4ZWxzKGRpYikpIHJldHVybiBOVUxMOworCisJY29uc3QgRlJFRV9JTUFHRV9UWVBFIHNyY190eXBlID0gRnJlZUltYWdlX0dldEltYWdlVHlwZShkaWIpOworCisJLy8gY2hlY2sgZm9yIGFsbG93ZWQgY29udmVyc2lvbnMgCisJc3dpdGNoKHNyY190eXBlKSB7CisJCWNhc2UgRklUX0JJVE1BUDoKKwkJeworCQkJLy8gY29udmVydCB0byBncmV5c2NhbGUgaWYgbmVlZGVkCisJCQlpZigoRnJlZUltYWdlX0dldEJQUChkaWIpID09IDgpICYmIChGcmVlSW1hZ2VfR2V0Q29sb3JUeXBlKGRpYikgPT0gRklDX01JTklTQkxBQ0spKSB7CisJCQkJc3JjID0gZGliOworCQkJfSBlbHNlIHsKKwkJCQlzcmMgPSBGcmVlSW1hZ2VfQ29udmVydFRvR3JleXNjYWxlKGRpYik7CisJCQkJaWYoIXNyYykgcmV0dXJuIE5VTEw7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQljYXNlIEZJVF9VSU5UMTY6CisJCQkvLyBVSU5UMTYgdHlwZSA6IGNsb25lIHRoZSBzcmMKKwkJCXJldHVybiBGcmVlSW1hZ2VfQ2xvbmUoZGliKTsKKwkJCWJyZWFrOworCQljYXNlIEZJVF9SR0IxNjoKKwkJCS8vIGFsbG93IGNvbnZlcnNpb24gZnJvbSA0OC1iaXQgUkdCCisJCQlzcmMgPSBkaWI7CisJCQlicmVhazsKKwkJY2FzZSBGSVRfUkdCQTE2OgorCQkJLy8gYWxsb3cgY29udmVyc2lvbiBmcm9tIDY0LWJpdCBSR0JBIChpZ25vcmUgdGhlIGFscGhhIGNoYW5uZWwpCisJCQlzcmMgPSBkaWI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBOVUxMOworCX0KKworCS8vIGFsbG9jYXRlIGRzdCBpbWFnZQorCisJY29uc3QgdW5zaWduZWQgd2lkdGggPSBGcmVlSW1hZ2VfR2V0V2lkdGgoc3JjKTsKKwljb25zdCB1bnNpZ25lZCBoZWlnaHQgPSBGcmVlSW1hZ2VfR2V0SGVpZ2h0KHNyYyk7CisKKwlkc3QgPSBGcmVlSW1hZ2VfQWxsb2NhdGVUKEZJVF9VSU5UMTYsIHdpZHRoLCBoZWlnaHQpOworCWlmKCFkc3QpIHsKKwkJaWYoc3JjICE9IGRpYikgeworCQkJRnJlZUltYWdlX1VubG9hZChzcmMpOworCQl9CisJCXJldHVybiBOVUxMOworCX0KKworCS8vIGNvcHkgbWV0YWRhdGEgZnJvbSBzcmMgdG8gZHN0CisJRnJlZUltYWdlX0Nsb25lTWV0YWRhdGEoZHN0LCBzcmMpOworCisJLy8gY29udmVydCBmcm9tIHNyYyB0eXBlIHRvIFVJTlQxNgorCisJc3dpdGNoKHNyY190eXBlKSB7CisJCWNhc2UgRklUX0JJVE1BUDoKKwkJeworCQkJZm9yKHVuc2lnbmVkIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJCQljb25zdCBCWVRFICpzcmNfYml0cyA9IChCWVRFKilGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoc3JjLCB5KTsKKwkJCQlXT1JEICpkc3RfYml0cyA9IChXT1JEKilGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZHN0LCB5KTsKKwkJCQlmb3IodW5zaWduZWQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisJCQkJCWRzdF9iaXRzW3hdID0gc3JjX2JpdHNbeF0gPDwgODsKKwkJCQl9CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSBGSVRfUkdCMTY6CisJCXsKKwkJCWZvcih1bnNpZ25lZCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisJCQkJY29uc3QgRklSR0IxNiAqc3JjX2JpdHMgPSAoRklSR0IxNiopRnJlZUltYWdlX0dldFNjYW5MaW5lKHNyYywgeSk7CisJCQkJV09SRCAqZHN0X2JpdHMgPSAoV09SRCopRnJlZUltYWdlX0dldFNjYW5MaW5lKGRzdCwgeSk7CisJCQkJZm9yKHVuc2lnbmVkIHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworCQkJCQkvLyBjb252ZXJ0IHRvIGdyZXkKKwkJCQkJZHN0X2JpdHNbeF0gPSAoV09SRClMVU1BX1JFQzcwOShzcmNfYml0c1t4XS5yZWQsIHNyY19iaXRzW3hdLmdyZWVuLCBzcmNfYml0c1t4XS5ibHVlKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSBGSVRfUkdCQTE2OgorCQl7CisJCQlmb3IodW5zaWduZWQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworCQkJCWNvbnN0IEZJUkdCQTE2ICpzcmNfYml0cyA9IChGSVJHQkExNiopRnJlZUltYWdlX0dldFNjYW5MaW5lKHNyYywgeSk7CisJCQkJV09SRCAqZHN0X2JpdHMgPSAoV09SRCopRnJlZUltYWdlX0dldFNjYW5MaW5lKGRzdCwgeSk7CisJCQkJZm9yKHVuc2lnbmVkIHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworCQkJCQkvLyBjb252ZXJ0IHRvIGdyZXkKKwkJCQkJZHN0X2JpdHNbeF0gPSAoV09SRClMVU1BX1JFQzcwOShzcmNfYml0c1t4XS5yZWQsIHNyY19iaXRzW3hdLmdyZWVuLCBzcmNfYml0c1t4XS5ibHVlKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KKworCWlmKHNyYyAhPSBkaWIpIHsKKwkJRnJlZUltYWdlX1VubG9hZChzcmMpOworCX0KKworCXJldHVybiBkc3Q7Cit9CisKZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvRnJlZUltYWdlLmNwcCBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvRnJlZUltYWdlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGU2MDc3Ci0tLSAvZGV2L251bGwKKysrIGIvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9GcmVlSW1hZ2UuY3BwCkBAIC0wLDAgKzEsMjI2IEBACisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBGcmVlSW1hZ2UgaW1wbGVtZW50YXRpb24KKy8vCisvLyBEZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIGJ5CisvLyAtIEZsb3JpcyB2YW4gZGVuIEJlcmcgKGZsdmRiZXJnQHd4cy5ubCkKKy8vIC0gSGVydukgRHJvbG9uIChkcm9sb25AaW5mb25pZS5mcikKKy8vIC0gS2FybC1IZWlueiBCdXNzaWFuIChraGJ1c3NpYW5AbW9zcy5kZSkKKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBGcmVlSW1hZ2UgMworLy8KKy8vIENPVkVSRUQgQ09ERSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWQorLy8gT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMKKy8vIFRIQVQgVEhFIENPVkVSRUQgQ09ERSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLy8gT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQKKy8vIENPREUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkgQ09WRVJFRCBDT0RFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QKKy8vIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZCisvLyBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMCisvLyBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GIEFOWSBDT1ZFUkVEIENPREUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSCisvLyBUSElTIERJU0NMQUlNRVIuCisvLworLy8gVXNlIGF0IHlvdXIgb3duIHJpc2shCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiRnJlZUltYWdlLmgiCisjaW5jbHVkZSAiVXRpbGl0aWVzLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgY29uc3QgY2hhciAqc19jb3B5cmlnaHQgPSAiVGhpcyBwcm9ncmFtIHVzZXMgRnJlZUltYWdlLCBhIGZyZWUsIG9wZW4gc291cmNlIGltYWdlIGxpYnJhcnkgc3VwcG9ydGluZyBhbGwgY29tbW9uIGJpdG1hcCBmb3JtYXRzLiBTZWUgaHR0cDovL2ZyZWVpbWFnZS5zb3VyY2Vmb3JnZS5uZXQgZm9yIGRldGFpbHMiOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChfX01JTkdXMzJfXykKKyNpZm5kZWYgRlJFRUlNQUdFX0xJQgorCitCT09MIEFQSUVOVFJZCitEbGxNYWluKEhBTkRMRSBoTW9kdWxlLCBEV09SRCB1bF9yZWFzb25fZm9yX2NhbGwsIExQVk9JRCBscFJlc2VydmVkKSB7CisJc3dpdGNoICh1bF9yZWFzb25fZm9yX2NhbGwpIHsKKwkJY2FzZSBETExfUFJPQ0VTU19BVFRBQ0ggOgorCQkJRnJlZUltYWdlX0luaXRpYWxpc2UoRkFMU0UpOworCQkJYnJlYWs7CisKKwkJY2FzZSBETExfUFJPQ0VTU19ERVRBQ0ggOgorCQkJRnJlZUltYWdlX0RlSW5pdGlhbGlzZSgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBETExfVEhSRUFEX0FUVEFDSCA6CisJCWNhc2UgRExMX1RIUkVBRF9ERVRBQ0ggOgorCQkJYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKyNlbmRpZiAvLyBGUkVFSU1BR0VfTElCCisKKyNlbHNlIC8vICFfV0lOMzIgCisjaWZuZGVmIEZSRUVJTUFHRV9MSUIKKwordm9pZCBGcmVlSW1hZ2VfU09fSW5pdGlhbGlzZSgpIF9fYXR0cmlidXRlX18oKGNvbnN0cnVjdG9yKSk7Cit2b2lkIEZyZWVJbWFnZV9TT19EZUluaXRpYWxpc2UoKSBfX2F0dHJpYnV0ZV9fKChkZXN0cnVjdG9yKSk7CisKK3ZvaWQgRnJlZUltYWdlX1NPX0luaXRpYWxpc2UoKSB7CisgIEZyZWVJbWFnZV9Jbml0aWFsaXNlKEZBTFNFKTsKK30KKwordm9pZCBGcmVlSW1hZ2VfU09fRGVJbml0aWFsaXNlKCkgeworICBGcmVlSW1hZ2VfRGVJbml0aWFsaXNlKCk7Cit9CisjZW5kaWYgLy8gRlJFRUlNQUdFX0xJQgorCisjZW5kaWYgLy8gX1dJTjMyCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjb25zdCBjaGFyICogRExMX0NBTExDT05WCitGcmVlSW1hZ2VfR2V0VmVyc2lvbigpIHsKKwlzdGF0aWMgY2hhciBzX3ZlcnNpb25bMTZdOworCXNwcmludGYoc192ZXJzaW9uLCAiJWQuJWQuJWQiLCBGUkVFSU1BR0VfTUFKT1JfVkVSU0lPTiwgRlJFRUlNQUdFX01JTk9SX1ZFUlNJT04sIEZSRUVJTUFHRV9SRUxFQVNFX1NFUklBTCk7CisJcmV0dXJuIHNfdmVyc2lvbjsKK30KKworY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgorRnJlZUltYWdlX0dldENvcHlyaWdodE1lc3NhZ2UoKSB7CisJcmV0dXJuIHNfY29weXJpZ2h0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQk9PTCBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9Jc0xpdHRsZUVuZGlhbigpIHsKKwl1bmlvbiB7CisJCURXT1JEIGk7CisJCUJZVEUgY1s0XTsKKwl9IHU7CisJdS5pID0gMTsKKwlyZXR1cm4gKHUuY1swXSAhPSAwKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZUZ1bmN0aW9uIGZyZWVpbWFnZV9vdXRwdXRtZXNzYWdlX3Byb2MgPSBOVUxMOworc3RhdGljIEZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlRnVuY3Rpb25TdGRDYWxsIGZyZWVpbWFnZV9vdXRwdXRtZXNzYWdlc3RkY2FsbF9wcm9jID0gTlVMTDsgCisKK3ZvaWQgRExMX0NBTExDT05WCitGcmVlSW1hZ2VfU2V0T3V0cHV0TWVzc2FnZShGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZUZ1bmN0aW9uIG9tZikgeworCWZyZWVpbWFnZV9vdXRwdXRtZXNzYWdlX3Byb2MgPSBvbWY7Cit9CisKK3ZvaWQgRExMX0NBTExDT05WCitGcmVlSW1hZ2VfU2V0T3V0cHV0TWVzc2FnZVN0ZENhbGwoRnJlZUltYWdlX091dHB1dE1lc3NhZ2VGdW5jdGlvblN0ZENhbGwgb21mKSB7CisJZnJlZWltYWdlX291dHB1dG1lc3NhZ2VzdGRjYWxsX3Byb2MgPSBvbWY7Cit9CisKK3ZvaWQgRExMX0NBTExDT05WCitGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2MoaW50IGZpZiwgY29uc3QgY2hhciAqZm10LCAuLi4pIHsKKwljb25zdCBpbnQgTVNHX1NJWkUgPSA1MTI7IC8vIDUxMiBieXRlcyBzaG91bGQgYmUgbW9yZSB0aGFuIGVub3VnaCBmb3IgYSBzaG9ydCBtZXNzYWdlCisKKwlpZiAoKGZtdCAhPSBOVUxMKSAmJiAoKGZyZWVpbWFnZV9vdXRwdXRtZXNzYWdlX3Byb2MgIT0gTlVMTCkgfHwgKGZyZWVpbWFnZV9vdXRwdXRtZXNzYWdlc3RkY2FsbF9wcm9jICE9IE5VTEwpKSkgeworCQljaGFyIG1lc3NhZ2VbTVNHX1NJWkVdOworCQltZW1zZXQobWVzc2FnZSwgMCwgTVNHX1NJWkUpOworCisJCS8vIGluaXRpYWxpemUgdGhlIG9wdGlvbmFsIHBhcmFtZXRlciBsaXN0CisKKwkJdmFfbGlzdCBhcmc7CisJCXZhX3N0YXJ0KGFyZywgZm10KTsKKworCQkvLyBjaGVjayB0aGUgbGVuZ3RoIG9mIHRoZSBmb3JtYXQgc3RyaW5nCisKKwkJaW50IHN0cl9sZW5ndGggPSAoaW50KSggKHN0cmxlbihmbXQpID4gTVNHX1NJWkUpID8gTVNHX1NJWkUgOiBzdHJsZW4oZm10KSApOworCisJCS8vIHBhcnNlIHRoZSBmb3JtYXQgc3RyaW5nIGFuZCBwdXQgdGhlIHJlc3VsdCBpbiAnbWVzc2FnZScKKworCQlmb3IgKGludCBpID0gMCwgaiA9IDA7IGkgPCBzdHJfbGVuZ3RoOyArK2kpIHsKKwkJCWlmIChmbXRbaV0gPT0gJyUnKSB7CisJCQkJaWYgKGkgKyAxIDwgc3RyX2xlbmd0aCkgeworCQkJCQlzd2l0Y2godG9sb3dlcihmbXRbaSArIDFdKSkgeworCQkJCQkJY2FzZSAnJScgOgorCQkJCQkJCW1lc3NhZ2VbaisrXSA9ICclJzsKKwkJCQkJCQlicmVhazsKKworCQkJCQkJY2FzZSAnbycgOiAvLyBvY3RhbCBudW1iZXJzCisJCQkJCQl7CisJCQkJCQkJY2hhciB0bXBbMTZdOworCisJCQkJCQkJX2l0b2EodmFfYXJnKGFyZywgaW50KSwgdG1wLCA4KTsKKworCQkJCQkJCXN0cmNhdChtZXNzYWdlLCB0bXApOworCisJCQkJCQkJaiArPSAoaW50KXN0cmxlbih0bXApOworCisJCQkJCQkJKytpOworCisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisKKwkJCQkJCWNhc2UgJ2knIDogLy8gZGVjaW1hbCBudW1iZXJzCisJCQkJCQljYXNlICdkJyA6CisJCQkJCQl7CisJCQkJCQkJY2hhciB0bXBbMTZdOworCisJCQkJCQkJX2l0b2EodmFfYXJnKGFyZywgaW50KSwgdG1wLCAxMCk7CisKKwkJCQkJCQlzdHJjYXQobWVzc2FnZSwgdG1wKTsKKworCQkJCQkJCWogKz0gKGludClzdHJsZW4odG1wKTsKKworCQkJCQkJCSsraTsKKworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCisJCQkJCQljYXNlICd4JyA6IC8vIGhleGFkZWNpbWFsIG51bWJlcnMKKwkJCQkJCXsKKwkJCQkJCQljaGFyIHRtcFsxNl07CisKKwkJCQkJCQlfaXRvYSh2YV9hcmcoYXJnLCBpbnQpLCB0bXAsIDE2KTsKKworCQkJCQkJCXN0cmNhdChtZXNzYWdlLCB0bXApOworCisJCQkJCQkJaiArPSAoaW50KXN0cmxlbih0bXApOworCisJCQkJCQkJKytpOworCisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisKKwkJCQkJCWNhc2UgJ3MnIDogLy8gc3RyaW5ncworCQkJCQkJeworCQkJCQkJCWNoYXIgKnRtcCA9IHZhX2FyZyhhcmcsIGNoYXIqKTsKKworCQkJCQkJCXN0cmNhdChtZXNzYWdlLCB0bXApOworCisJCQkJCQkJaiArPSAoaW50KXN0cmxlbih0bXApOworCisJCQkJCQkJKytpOworCisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX07CisJCQkJfSBlbHNlIHsKKwkJCQkJbWVzc2FnZVtqKytdID0gZm10W2ldOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJbWVzc2FnZVtqKytdID0gZm10W2ldOworCQkJfTsKKwkJfQorCisJCS8vIGRlaW5pdGlhbGl6ZSB0aGUgb3B0aW9uYWwgcGFyYW1ldGVyIGxpc3QKKworCQl2YV9lbmQoYXJnKTsKKworCQkvLyBvdXRwdXQgdGhlIG1lc3NhZ2UgdG8gdGhlIHVzZXIgcHJvZ3JhbQorCisJCWlmIChmcmVlaW1hZ2Vfb3V0cHV0bWVzc2FnZV9wcm9jICE9IE5VTEwpCisJCQlmcmVlaW1hZ2Vfb3V0cHV0bWVzc2FnZV9wcm9jKChGUkVFX0lNQUdFX0ZPUk1BVClmaWYsIG1lc3NhZ2UpOworCisJCWlmIChmcmVlaW1hZ2Vfb3V0cHV0bWVzc2FnZXN0ZGNhbGxfcHJvYyAhPSBOVUxMKQorCQkJZnJlZWltYWdlX291dHB1dG1lc3NhZ2VzdGRjYWxsX3Byb2MoKEZSRUVfSU1BR0VfRk9STUFUKWZpZiwgbWVzc2FnZSk7IAorCX0KK30KZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvRnJlZUltYWdlQy5jIGIvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9GcmVlSW1hZ2VDLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU4MTI1OQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvRnJlZUltYWdlQy5jCkBAIC0wLDAgKzEsMjIgQEAKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFVzZSBmcm9tIGMgY29tcGlsZXIgdGVzdCBmaWxlCisvLworLy8gRGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBieQorLy8gLSBGbG9yaXMgdmFuIGRlbiBCZXJnIChmbHZkYmVyZ0B3eHMubmwpCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRnJlZUltYWdlIDMKKy8vCisvLyBDT1ZFUkVEIENPREUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkKKy8vIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTCisvLyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy8vIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVECisvLyBDT0RFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UCisvLyBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWQorLy8gU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTAorLy8gUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUgorLy8gVEhJUyBESVNDTEFJTUVSLgorLy8KKy8vIFVzZSBhdCB5b3VyIG93biByaXNrIQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaW5jbHVkZSAiRnJlZUltYWdlLmgiCmRpZmYgLS1naXQgYS9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL0ZyZWVJbWFnZUlPLmNwcCBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvRnJlZUltYWdlSU8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMzk0ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL0ZyZWVJbWFnZUlPLmNwcApAQCAtMCwwICsxLDE3NSBAQAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gSW5wdXQvT3V0cHV0IGZ1bmN0aW9ucworLy8KKy8vIERlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gYnkKKy8vIC0gRmxvcmlzIHZhbiBkZW4gQmVyZyAoZmx2ZGJlcmdAd3hzLm5sKQorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZyZWVJbWFnZSAzCisvLworLy8gQ09WRVJFRCBDT0RFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZCisvLyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUworLy8gVEhBVCBUSEUgQ09WRVJFRCBDT0RFIElTIEZSRUUgT0YgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisvLyBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRAorLy8gQ09ERSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVAorLy8gVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GIEFOWSBORUNFU1NBUlkKKy8vIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwKKy8vIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIKKy8vIFRISVMgRElTQ0xBSU1FUi4KKy8vCisvLyBVc2UgYXQgeW91ciBvd24gcmlzayEKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2luY2x1ZGUgIkZyZWVJbWFnZS5oIgorI2luY2x1ZGUgIlV0aWxpdGllcy5oIgorI2luY2x1ZGUgIkZyZWVJbWFnZUlPLmgiCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRmlsZSBJTyBmdW5jdGlvbnMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit1bnNpZ25lZCBETExfQ0FMTENPTlYgCitfUmVhZFByb2Modm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBzaXplLCB1bnNpZ25lZCBjb3VudCwgZmlfaGFuZGxlIGhhbmRsZSkgeworCXJldHVybiAodW5zaWduZWQpZnJlYWQoYnVmZmVyLCBzaXplLCBjb3VudCwgKEZJTEUgKiloYW5kbGUpOworfQorCit1bnNpZ25lZCBETExfQ0FMTENPTlYgCitfV3JpdGVQcm9jKHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgc2l6ZSwgdW5zaWduZWQgY291bnQsIGZpX2hhbmRsZSBoYW5kbGUpIHsKKwlyZXR1cm4gKHVuc2lnbmVkKWZ3cml0ZShidWZmZXIsIHNpemUsIGNvdW50LCAoRklMRSAqKWhhbmRsZSk7Cit9CisKK2ludCBETExfQ0FMTENPTlYKK19TZWVrUHJvYyhmaV9oYW5kbGUgaGFuZGxlLCBsb25nIG9mZnNldCwgaW50IG9yaWdpbikgeworCXJldHVybiBmc2VlaygoRklMRSAqKWhhbmRsZSwgb2Zmc2V0LCBvcmlnaW4pOworfQorCitsb25nIERMTF9DQUxMQ09OVgorX1RlbGxQcm9jKGZpX2hhbmRsZSBoYW5kbGUpIHsKKwlyZXR1cm4gZnRlbGwoKEZJTEUgKiloYW5kbGUpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQKK1NldERlZmF1bHRJTyhGcmVlSW1hZ2VJTyAqaW8pIHsKKwlpby0+cmVhZF9wcm9jICA9IF9SZWFkUHJvYzsKKwlpby0+c2Vla19wcm9jICA9IF9TZWVrUHJvYzsKKwlpby0+dGVsbF9wcm9jICA9IF9UZWxsUHJvYzsKKwlpby0+d3JpdGVfcHJvYyA9IF9Xcml0ZVByb2M7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gTWVtb3J5IElPIGZ1bmN0aW9ucworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3Vuc2lnbmVkIERMTF9DQUxMQ09OViAKK19NZW1vcnlSZWFkUHJvYyh2b2lkICpidWZmZXIsIHVuc2lnbmVkIHNpemUsIHVuc2lnbmVkIGNvdW50LCBmaV9oYW5kbGUgaGFuZGxlKSB7CisJdW5zaWduZWQgeDsKKworCUZJTUVNT1JZSEVBREVSICptZW1faGVhZGVyID0gKEZJTUVNT1JZSEVBREVSKikoKChGSU1FTU9SWSopaGFuZGxlKS0+ZGF0YSk7CisKKwlmb3IoeCA9IDA7IHggPCBjb3VudDsgeCsrKSB7CisJCWxvbmcgcmVtYWluaW5nX2J5dGVzID0gbWVtX2hlYWRlci0+ZmlsZV9sZW5ndGggLSBtZW1faGVhZGVyLT5jdXJyZW50X3Bvc2l0aW9uOworCQkvL2lmIHRoZXJlIGlzbid0IHNpemUgYnl0ZXMgbGVmdCB0byByZWFkLCBzZXQgcG9zIHRvIGVvZiBhbmQgcmV0dXJuIGEgc2hvcnQgY291bnQKKwkJaWYoIHJlbWFpbmluZ19ieXRlcyA8IChsb25nKXNpemUgKSB7CisJCQlpZihyZW1haW5pbmdfYnl0ZXMgPiAwKSB7CisJCQkJbWVtY3B5KCBidWZmZXIsIChjaGFyICopbWVtX2hlYWRlci0+ZGF0YSArIG1lbV9oZWFkZXItPmN1cnJlbnRfcG9zaXRpb24sIHJlbWFpbmluZ19ieXRlcyApOworCQkJfQorCQkJbWVtX2hlYWRlci0+Y3VycmVudF9wb3NpdGlvbiA9IG1lbV9oZWFkZXItPmZpbGVfbGVuZ3RoOworCQkJYnJlYWs7CisJCX0KKwkJLy9jb3B5IHNpemUgYnl0ZXMgY291bnQgdGltZXMKKwkJbWVtY3B5KCBidWZmZXIsIChjaGFyICopbWVtX2hlYWRlci0+ZGF0YSArIG1lbV9oZWFkZXItPmN1cnJlbnRfcG9zaXRpb24sIHNpemUgKTsKKwkJbWVtX2hlYWRlci0+Y3VycmVudF9wb3NpdGlvbiArPSBzaXplOworCQlidWZmZXIgPSAoY2hhciAqKWJ1ZmZlciArIHNpemU7CisJfQorCXJldHVybiB4OworfQorCit1bnNpZ25lZCBETExfQ0FMTENPTlYgCitfTWVtb3J5V3JpdGVQcm9jKHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgc2l6ZSwgdW5zaWduZWQgY291bnQsIGZpX2hhbmRsZSBoYW5kbGUpIHsKKwl2b2lkICpuZXdkYXRhOworCWxvbmcgbmV3ZGF0YWxlbjsKKworCUZJTUVNT1JZSEVBREVSICptZW1faGVhZGVyID0gKEZJTUVNT1JZSEVBREVSKikoKChGSU1FTU9SWSopaGFuZGxlKS0+ZGF0YSk7CisKKwkvL2RvdWJsZSB0aGUgZGF0YSBibG9jayBzaXplIGlmIHdlIG5lZWQgdG8KKwl3aGlsZSggKG1lbV9oZWFkZXItPmN1cnJlbnRfcG9zaXRpb24gKyAobG9uZykoc2l6ZSAqIGNvdW50KSkgPj0gbWVtX2hlYWRlci0+ZGF0YV9sZW5ndGggKSB7CisJCS8vaWYgd2UgYXJlIGF0IG9yIGFib3ZlIDFHLCB3ZSBjYW50IGRvdWJsZSB3aXRob3V0IGdvaW5nIG5lZ2F0aXZlCisJCWlmKCBtZW1faGVhZGVyLT5kYXRhX2xlbmd0aCAmIDB4NDAwMDAwMDAgKSB7CisJCQkvL21heCAyRworCQkJaWYoIG1lbV9oZWFkZXItPmRhdGFfbGVuZ3RoID09IDB4N0ZGRkZGRkYgKSB7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQluZXdkYXRhbGVuID0gMHg3RkZGRkZGRjsKKwkJfSBlbHNlIGlmKCBtZW1faGVhZGVyLT5kYXRhX2xlbmd0aCA9PSAwICkgeworCQkJLy9kZWZhdWx0IHRvIDRLIGlmIG5vdGhpbmcgeWV0CisJCQluZXdkYXRhbGVuID0gNDA5NjsKKwkJfSBlbHNlIHsKKwkJCS8vZG91YmxlIHNpemUKKwkJCW5ld2RhdGFsZW4gPSBtZW1faGVhZGVyLT5kYXRhX2xlbmd0aCA8PCAxOworCQl9CisJCW5ld2RhdGEgPSByZWFsbG9jKCBtZW1faGVhZGVyLT5kYXRhLCBuZXdkYXRhbGVuICk7CisJCWlmKCAhbmV3ZGF0YSApIHsKKwkJCXJldHVybiAwOworCQl9CisJCW1lbV9oZWFkZXItPmRhdGEgPSBuZXdkYXRhOworCQltZW1faGVhZGVyLT5kYXRhX2xlbmd0aCA9IG5ld2RhdGFsZW47CisJfQorCW1lbWNweSggKGNoYXIgKiltZW1faGVhZGVyLT5kYXRhICsgbWVtX2hlYWRlci0+Y3VycmVudF9wb3NpdGlvbiwgYnVmZmVyLCBzaXplICogY291bnQgKTsKKwltZW1faGVhZGVyLT5jdXJyZW50X3Bvc2l0aW9uICs9IHNpemUgKiBjb3VudDsKKwlpZiggbWVtX2hlYWRlci0+Y3VycmVudF9wb3NpdGlvbiA+IG1lbV9oZWFkZXItPmZpbGVfbGVuZ3RoICkgeworCQltZW1faGVhZGVyLT5maWxlX2xlbmd0aCA9IG1lbV9oZWFkZXItPmN1cnJlbnRfcG9zaXRpb247CisJfQorCXJldHVybiBjb3VudDsKK30KKworaW50IERMTF9DQUxMQ09OViAKK19NZW1vcnlTZWVrUHJvYyhmaV9oYW5kbGUgaGFuZGxlLCBsb25nIG9mZnNldCwgaW50IG9yaWdpbikgeworCUZJTUVNT1JZSEVBREVSICptZW1faGVhZGVyID0gKEZJTUVNT1JZSEVBREVSKikoKChGSU1FTU9SWSopaGFuZGxlKS0+ZGF0YSk7CisKKwkvLyB5b3UgY2FuIHVzZSBfTWVtb3J5U2Vla1Byb2MgdG8gcmVwb3NpdGlvbiB0aGUgcG9pbnRlciBhbnl3aGVyZSBpbiBhIGZpbGUKKwkvLyB0aGUgcG9pbnRlciBjYW4gYWxzbyBiZSBwb3NpdGlvbmVkIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBmaWxlCisKKwlzd2l0Y2gob3JpZ2luKSB7IC8vMCB0byBmaWxlbGVuLTEgYXJlICdpbnNpZGUnIHRoZSBmaWxlCisJCWRlZmF1bHQ6CisJCWNhc2UgU0VFS19TRVQ6IC8vY2FuIGZzZWVrKCkgdG8gMC03RkZGRkZGRiBhbHdheXMKKwkJCWlmKCBvZmZzZXQgPj0gMCApIHsKKwkJCQltZW1faGVhZGVyLT5jdXJyZW50X3Bvc2l0aW9uID0gb2Zmc2V0OworCQkJCXJldHVybiAwOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBTRUVLX0NVUjoKKwkJCWlmKCBtZW1faGVhZGVyLT5jdXJyZW50X3Bvc2l0aW9uICsgb2Zmc2V0ID49IDAgKSB7CisJCQkJbWVtX2hlYWRlci0+Y3VycmVudF9wb3NpdGlvbiArPSBvZmZzZXQ7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFNFRUtfRU5EOgorCQkJaWYoIG1lbV9oZWFkZXItPmZpbGVfbGVuZ3RoICsgb2Zmc2V0ID49IDAgKSB7CisJCQkJbWVtX2hlYWRlci0+Y3VycmVudF9wb3NpdGlvbiA9IG1lbV9oZWFkZXItPmZpbGVfbGVuZ3RoICsgb2Zmc2V0OworCQkJCXJldHVybiAwOworCQkJfQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIC0xOworfQorCitsb25nIERMTF9DQUxMQ09OViAKK19NZW1vcnlUZWxsUHJvYyhmaV9oYW5kbGUgaGFuZGxlKSB7CisJRklNRU1PUllIRUFERVIgKm1lbV9oZWFkZXIgPSAoRklNRU1PUllIRUFERVIqKSgoKEZJTUVNT1JZKiloYW5kbGUpLT5kYXRhKTsKKworCXJldHVybiBtZW1faGVhZGVyLT5jdXJyZW50X3Bvc2l0aW9uOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQKK1NldE1lbW9yeUlPKEZyZWVJbWFnZUlPICppbykgeworCWlvLT5yZWFkX3Byb2MgID0gX01lbW9yeVJlYWRQcm9jOworCWlvLT5zZWVrX3Byb2MgID0gX01lbW9yeVNlZWtQcm9jOworCWlvLT50ZWxsX3Byb2MgID0gX01lbW9yeVRlbGxQcm9jOworCWlvLT53cml0ZV9wcm9jID0gX01lbW9yeVdyaXRlUHJvYzsKK30KZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvR2V0VHlwZS5jcHAgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL0dldFR5cGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmZmJlYzcKLS0tIC9kZXYvbnVsbAorKysgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL0dldFR5cGUuY3BwCkBAIC0wLDAgKzEsOTQgQEAKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEdldFR5cGUKKy8vCisvLyBEZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIGJ5CisvLyAtIEZsb3JpcyB2YW4gZGVuIEJlcmcgKGZsdmRiZXJnQHd4cy5ubCkKKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBGcmVlSW1hZ2UgMworLy8KKy8vIENPVkVSRUQgQ09ERSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWQorLy8gT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMKKy8vIFRIQVQgVEhFIENPVkVSRUQgQ09ERSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLy8gT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQKKy8vIENPREUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkgQ09WRVJFRCBDT0RFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QKKy8vIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZCisvLyBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMCisvLyBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GIEFOWSBDT1ZFUkVEIENPREUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSCisvLyBUSElTIERJU0NMQUlNRVIuCisvLworLy8gVXNlIGF0IHlvdXIgb3duIHJpc2shCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpZmRlZiBfTVNDX1ZFUiAKKyNwcmFnbWEgd2FybmluZyAoZGlzYWJsZSA6IDQ3ODYpIC8vIGlkZW50aWZpZXIgd2FzIHRydW5jYXRlZCB0byAnbnVtYmVyJyBjaGFyYWN0ZXJzCisjZW5kaWYgCisKKyNpbmNsdWRlICJGcmVlSW1hZ2UuaCIKKyNpbmNsdWRlICJVdGlsaXRpZXMuaCIKKyNpbmNsdWRlICJGcmVlSW1hZ2VJTy5oIgorI2luY2x1ZGUgIlBsdWdpbi5oIgorI2luY2x1ZGUgIi4uL0RlcHJlY2F0aW9uTWFuYWdlci9EZXByZWNhdGlvbk1nci5oIgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0ZSRUVfSU1BR0VfRk9STUFUIERMTF9DQUxMQ09OVgorRnJlZUltYWdlX0dldEZpbGVUeXBlRnJvbUhhbmRsZShGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIGludCBzaXplKSB7CisJaWYgKGhhbmRsZSAhPSBOVUxMKSB7CisJCWludCBmaWZfY291bnQgPSBGcmVlSW1hZ2VfR2V0RklGQ291bnQoKTsKKworCQlmb3IgKGludCBpID0gMDsgaSA8IGZpZl9jb3VudDsgKytpKSB7CisJCQlGUkVFX0lNQUdFX0ZPUk1BVCBmaWYgPSAoRlJFRV9JTUFHRV9GT1JNQVQpaTsKKwkJCWlmIChGcmVlSW1hZ2VfVmFsaWRhdGUoZmlmLCBpbywgaGFuZGxlKSkgeworI2lmbmRlZiBJR19UQVJHRVRfRU1CRURERUQKKwkJCQlpZihmaWYgPT0gRklGX1RJRkYpIHsKKwkJCQkJLy8gbWFueSBjYW1lcmEgcmF3IGZpbGVzIHVzZSBhIFRJRkYgc2lnbmF0dXJlIC4uLgorCQkJCQkvLyAuLi4gdHJ5IHRvIHJldmFsaWRhdGUgYWdhaW5zdCBGSUZfUkFXIChldmVuIGlmIGl0IGJyZWFrcyB0aGUgY29kZSBnZW5lcmljaXR5KQorCQkJCQlpZiAoRnJlZUltYWdlX1ZhbGlkYXRlKEZJRl9SQVcsIGlvLCBoYW5kbGUpKSB7CisJCQkJCQlyZXR1cm4gRklGX1JBVzsKKwkJCQkJfQorCQkJCX0KKyNlbmRpZiAvLyBJR19UQVJHRVRfRU1CRURERUQKKwkJCQlyZXR1cm4gZmlmOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIEZJRl9VTktOT1dOOworfQorCitGUkVFX0lNQUdFX0ZPUk1BVCBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9HZXRGaWxlVHlwZShjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IHNpemUpIHsKKwlGcmVlSW1hZ2VJTyBpbzsKKwlTZXREZWZhdWx0SU8oJmlvKTsKKwkKKwlGSUxFICpoYW5kbGUgPSBmb3BlbihmaWxlbmFtZSwgInJiIik7CisKKwlpZiAoaGFuZGxlICE9IE5VTEwpIHsKKwkJRlJFRV9JTUFHRV9GT1JNQVQgZm9ybWF0ID0gRnJlZUltYWdlX0dldEZpbGVUeXBlRnJvbUhhbmRsZSgmaW8sIChmaV9oYW5kbGUpaGFuZGxlLCBzaXplKTsKKworCQlmY2xvc2UoaGFuZGxlKTsKKworCQlyZXR1cm4gZm9ybWF0OworCX0KKworCXJldHVybiBGSUZfVU5LTk9XTjsKK30KKworRlJFRV9JTUFHRV9GT1JNQVQgRExMX0NBTExDT05WIAorRnJlZUltYWdlX0dldEZpbGVUeXBlVShjb25zdCB3Y2hhcl90ICpmaWxlbmFtZSwgaW50IHNpemUpIHsKKyNpZmRlZiBfV0lOMzIJCisJRnJlZUltYWdlSU8gaW87CisJU2V0RGVmYXVsdElPKCZpbyk7CisJRklMRSAqaGFuZGxlID0gX3dmb3BlbihmaWxlbmFtZSwgTCJyYiIpOworCisJaWYgKGhhbmRsZSAhPSBOVUxMKSB7CisJCUZSRUVfSU1BR0VfRk9STUFUIGZvcm1hdCA9IEZyZWVJbWFnZV9HZXRGaWxlVHlwZUZyb21IYW5kbGUoJmlvLCAoZmlfaGFuZGxlKWhhbmRsZSwgc2l6ZSk7CisKKwkJZmNsb3NlKGhhbmRsZSk7CisKKwkJcmV0dXJuIGZvcm1hdDsKKwl9CisjZW5kaWYKKwlyZXR1cm4gRklGX1VOS05PV047Cit9CisKZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvSGFsZnRvbmluZy5jcHAgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL0hhbGZ0b25pbmcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxM2NjMjYKLS0tIC9kZXYvbnVsbAorKysgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL0hhbGZ0b25pbmcuY3BwCkBAIC0wLDAgKzEsNDc0IEBACisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBCaXRtYXAgY29udmVyc2lvbiByb3V0aW5lcworLy8gVGhyZXNob2xkaW5nIGFuZCBoYWxmdG9uaW5nIGZ1bmN0aW9ucworLy8gRGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBieQorLy8gLSBIZXJ26SBEcm9sb24gKGRyb2xvbkBpbmZvbmllLmZyKQorLy8gLSBEZW5uaXMgTGltIChkbGtqQHVzZXJzLnNvdXJjZWZvcmdlLm5ldCkKKy8vIC0gVGhvbWFzIENobWllbGV3c2tpIChDaG1pZWxld3NraS5UaG9tYXNAb2NlLmRlKQorLy8KKy8vIE1haW4gcmVmZXJlbmNlIDogVWxpY2huZXksIFIuLCBEaWdpdGFsIEhhbGZ0b25pbmcsIFRoZSBNSVQgUHJlc3MsIENhbWJyaWRnZSwgTUEsIDE5ODcKKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBGcmVlSW1hZ2UgMworLy8KKy8vIENPVkVSRUQgQ09ERSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWQorLy8gT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMKKy8vIFRIQVQgVEhFIENPVkVSRUQgQ09ERSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLy8gT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQKKy8vIENPREUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkgQ09WRVJFRCBDT0RFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QKKy8vIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZCisvLyBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMCisvLyBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GIEFOWSBDT1ZFUkVEIENPREUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSCisvLyBUSElTIERJU0NMQUlNRVIuCisvLworLy8gVXNlIGF0IHlvdXIgb3duIHJpc2shCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpbmNsdWRlICJGcmVlSW1hZ2UuaCIKKyNpbmNsdWRlICJVdGlsaXRpZXMuaCIKKworc3RhdGljIGNvbnN0IGludCBXSElURSA9IDI1NTsKK3N0YXRpYyBjb25zdCBpbnQgQkxBQ0sgPSAwOworCisvLyBGbG95ZCAmIFN0ZWluYmVyZyBlcnJvciBkaWZmdXNpb24gZGl0aGVyaW5nCisvLyBUaGlzIGFsZ29yaXRobSB1c2UgdGhlIGZvbGxvd2luZyBmaWx0ZXIKKy8vICAgICAgICAgICogICA3CisvLyAgICAgIDMgICA1ICAgMSAgICAgKDEvMTYpCitzdGF0aWMgRklCSVRNQVAqIEZsb3lkU3RlaW5iZXJnKEZJQklUTUFQICpkaWIpIHsKKworI2RlZmluZSBSQU5EKFJOKSAoKChzZWVkID0gMTEwMzUxNTI0NSAqIHNlZWQgKyAxMjM0NSkgPj4gMTIpICUgKFJOKSkKKyNkZWZpbmUgSU5JVEVSUihYLCBZKSAoKChpbnQpIFgpIC0gKCgoaW50KSBZKSA/IFdISVRFIDogQkxBQ0spICsgKChXSElURS8yKS0oKGludClYKSkgLyAyKQorCisJaW50IHNlZWQgPSAwOworCWludCB4LCB5LCBwLCBwaXhlbCwgdGhyZXNob2xkLCBlcnJvcjsKKwlpbnQgd2lkdGgsIGhlaWdodCwgcGl0Y2g7CisJQllURSAqYml0cywgKm5ld19iaXRzOworCUZJQklUTUFQICpuZXdfZGliID0gTlVMTDsKKworCS8vIGFsbG9jYXRlIGEgOC1iaXQgRElCCisJd2lkdGggPSBGcmVlSW1hZ2VfR2V0V2lkdGgoZGliKTsKKwloZWlnaHQgPSBGcmVlSW1hZ2VfR2V0SGVpZ2h0KGRpYik7CisJcGl0Y2ggPSBGcmVlSW1hZ2VfR2V0UGl0Y2goZGliKTsKKwluZXdfZGliID0gRnJlZUltYWdlX0FsbG9jYXRlKHdpZHRoLCBoZWlnaHQsIDgpOworCWlmKE5VTEwgPT0gbmV3X2RpYikgcmV0dXJuIE5VTEw7CisKKwkvLyBhbGxvY2F0ZSBzcGFjZSBmb3IgZXJyb3IgYXJyYXlzCisJaW50ICpsZXJyID0gKGludCopbWFsbG9jICh3aWR0aCAqIHNpemVvZihpbnQpKTsKKwlpbnQgKmNlcnIgPSAoaW50KiltYWxsb2MgKHdpZHRoICogc2l6ZW9mKGludCkpOworCW1lbXNldChsZXJyLCAwLCB3aWR0aCAqIHNpemVvZihpbnQpKTsKKwltZW1zZXQoY2VyciwgMCwgd2lkdGggKiBzaXplb2YoaW50KSk7CisKKwkvLyBsZWZ0IGJvcmRlcgorCWVycm9yID0gMDsKKwlmb3IoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworCQliaXRzID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgeSk7CisJCW5ld19iaXRzID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKG5ld19kaWIsIHkpOworCisJCXRocmVzaG9sZCA9IChXSElURSAvIDIgKyBSQU5EKDEyOSkgLSA2NCk7CisJCXBpeGVsID0gYml0c1swXSArIGVycm9yOworCQlwID0gKHBpeGVsID4gdGhyZXNob2xkKSA/IFdISVRFIDogQkxBQ0s7CisJCWVycm9yID0gcGl4ZWwgLSBwOworCQluZXdfYml0c1swXSA9IChCWVRFKXA7CisJfQorCS8vIHJpZ2h0IGJvcmRlcgorCWVycm9yID0gMDsKKwlmb3IoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworCQliaXRzID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgeSk7CisJCW5ld19iaXRzID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKG5ld19kaWIsIHkpOworCisJCXRocmVzaG9sZCA9IChXSElURSAvIDIgKyBSQU5EKDEyOSkgLSA2NCk7CisJCXBpeGVsID0gYml0c1t3aWR0aC0xXSArIGVycm9yOworCQlwID0gKHBpeGVsID4gdGhyZXNob2xkKSA/IFdISVRFIDogQkxBQ0s7CisJCWVycm9yID0gcGl4ZWwgLSBwOworCQluZXdfYml0c1t3aWR0aC0xXSA9IChCWVRFKXA7CisJfQorCS8vIHRvcCBib3JkZXIKKwliaXRzID0gRnJlZUltYWdlX0dldEJpdHMoZGliKTsKKwluZXdfYml0cyA9IEZyZWVJbWFnZV9HZXRCaXRzKG5ld19kaWIpOworCWVycm9yID0gMDsKKwlmb3IoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisJCXRocmVzaG9sZCA9IChXSElURSAvIDIgKyBSQU5EKDEyOSkgLSA2NCk7CisJCXBpeGVsID0gYml0c1t4XSArIGVycm9yOworCQlwID0gKHBpeGVsID4gdGhyZXNob2xkKSA/IFdISVRFIDogQkxBQ0s7CisJCWVycm9yID0gcGl4ZWwgLSBwOworCQluZXdfYml0c1t4XSA9IChCWVRFKXA7CisJCWxlcnJbeF0gPSBJTklURVJSKGJpdHNbeF0sIHApOworCX0KKworCS8vIGludGVyaW9yIGJpdHMKKwlmb3IoeSA9IDE7IHkgPCBoZWlnaHQ7IHkrKykgeworCQkvLyBzY2FuIGxlZnQgdG8gcmlnaHQKKwkJYml0cyA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIHkpOworCQluZXdfYml0cyA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShuZXdfZGliLCB5KTsKKworCSAgICBjZXJyWzBdID0gSU5JVEVSUihiaXRzWzBdLCBuZXdfYml0c1swXSk7CisJCWZvcih4ID0gMTsgeCA8IHdpZHRoIC0gMTsgeCsrKSB7CisJCQllcnJvciA9IChsZXJyW3gtMV0gKyA1ICogbGVyclt4XSArIDMgKiBsZXJyW3grMV0gKyA3ICogY2Vyclt4LTFdKSAvIDE2OworCQkJcGl4ZWwgPSBiaXRzW3hdICsgZXJyb3I7CisJCQlpZihwaXhlbCA+IChXSElURSAvIDIpKSB7CQkKKwkJCQluZXdfYml0c1t4XSA9IFdISVRFOworCQkJCWNlcnJbeF0gPSBwaXhlbCAtIFdISVRFOyAKKwkJCX0gZWxzZSB7CisJCQkJbmV3X2JpdHNbeF0gPSBCTEFDSzsKKwkJCQljZXJyW3hdID0gcGl4ZWwgLSBCTEFDSzsgCisJCQl9CisJCX0KKwkJLy8gc2V0IGVycm9ycyBmb3IgZW5kcyBvZiB0aGUgcm93CisJCWNlcnJbMF0gPSBJTklURVJSIChiaXRzWzBdLCBuZXdfYml0c1swXSk7CisJCWNlcnJbd2lkdGggLSAxXSA9IElOSVRFUlIgKGJpdHNbd2lkdGggLSAxXSwgbmV3X2JpdHNbd2lkdGggLSAxXSk7CisKKwkJLy8gc3dhcCBlcnJvciBidWZmZXJzCisJCWludCAqdGVyciA9IGxlcnI7IGxlcnIgPSBjZXJyOyBjZXJyID0gdGVycjsKKwl9CisKKwlmcmVlKGxlcnIpOworCWZyZWUoY2Vycik7CisKKwlyZXR1cm4gbmV3X2RpYjsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gQmF5ZXIgb3JkZXJlZCBkaXNwZXJzZWQgZG90IGRpdGhlcmluZworLy8KKworLy8gRnVuY3Rpb24gdGFrZW4gZnJvbSAiT3JkZXJlZCBEaXRoZXJpbmcsIFN0ZXBoZW4gSGF3bGV5LCBHcmFwaGljcyBHZW1zLCBBY2FkZW1pYyBQcmVzcywgMTk5MCIKKy8vIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBnZW5lcmF0ZSBhIEJheWVyIGRpdGhlcmluZyBtYXRyaWNlIHdob3NlIGRpbWVuc2lvbiBhcmUgMl5zaXplIGJ5IDJec2l6ZQorLy8KK3N0YXRpYyBpbnQgZGl0aGVydmFsdWUoaW50IHgsIGludCB5LCBpbnQgc2l6ZSkgeworCWludCBkID0gMDsKKwkvKgorCSAqIGNhbGN1bGF0ZSB0aGUgZGl0aGVyIHZhbHVlIGF0IGEgcGFydGljdWxhcgorCSAqICh4LCB5KSBvdmVyIHRoZSBzaXplIG9mIHRoZSBtYXRyaXguCisJICovCisJd2hpbGUgKHNpemUtLT4wKQl7CisJCS8qIFRoaW5rIG9mIGQgYXMgdGhlIGRlbnNpdHkuIEF0IGV2ZXJ5IGl0ZXJhdGlvbiwKKwkJICogZCBpcyBzaGlmdGVkIGxlZnQgb25lIGFuZCBhIG5ldyBiaXQgaXMgcHV0IGluIHRoZQorCQkgKiBsb3cgYml0IGJhc2VkIG9uIHggYW5kIHkuIElmIHggaXMgb2RkIGFuZCB5IGlzIGV2ZW4sCisJCSAqIG9yIHggaXMgZXZlbiBhbmQgeSBpcyBvZGQsIGEgYml0IGlzIHB1dCBpbi4gVGhpcworCQkgKiBnZW5lcmF0ZXMgdGhlIGNoZWNrZXJib2FyZCBzZWVuIGluIGRpdGhlcmluZy4KKwkJICogVGhpcyBxdWFudGl0eSBpcyBzaGlmdGVkIGxlZnQgYWdhaW4gYW5kIHRoZSBsb3cgYml0IG9mCisJCSAqIHkgaXMgYWRkZWQgaW4uCisJCSAqIFRoaXMgd2hvbGUgdGhpbmcgaW50ZXJsZWF2ZXMgYSBjaGVja2VyYm9hcmQgYml0IHBhdHRlcm4KKwkJICogYW5kIHkncyBiaXRzLCB3aGljaCBpcyB0aGUgdmFsdWUgeW91IHdhbnQuCisJCSAqLworCQlkID0gKGQgPDwxIHwgKHgmMSBeIHkmMSkpPDwxIHwgeSYxOworCQl4ID4+PSAxOworCQl5ID4+PSAxOworCX0KKwlyZXR1cm4gZDsKK30KKworLy8gT3JkZXJlZCBkaXRoZXJpbmcgd2l0aCBhIEJheWVyIG1hdHJpeCBvZiBzaXplIDJeb3JkZXIgYnkgMl5vcmRlcgorLy8KK3N0YXRpYyBGSUJJVE1BUCogT3JkZXJlZERpc3BlcnNlZERvdChGSUJJVE1BUCAqZGliLCBpbnQgb3JkZXIpIHsKKwlpbnQgeCwgeTsKKwlpbnQgd2lkdGgsIGhlaWdodDsKKwlCWVRFICpiaXRzLCAqbmV3X2JpdHM7CisJRklCSVRNQVAgKm5ld19kaWIgPSBOVUxMOworCisJLy8gYWxsb2NhdGUgYSA4LWJpdCBESUIKKwl3aWR0aCA9IEZyZWVJbWFnZV9HZXRXaWR0aChkaWIpOworCWhlaWdodCA9IEZyZWVJbWFnZV9HZXRIZWlnaHQoZGliKTsKKwluZXdfZGliID0gRnJlZUltYWdlX0FsbG9jYXRlKHdpZHRoLCBoZWlnaHQsIDgpOworCWlmKE5VTEwgPT0gbmV3X2RpYikgcmV0dXJuIE5VTEw7CisKKwkvLyBidWlsZCB0aGUgZGl0aGVyaW5nIG1hdHJpeAorCWludCBsID0gKDEgPDwgb3JkZXIpOwkvLyBzcXVhcmUgb2YgZGl0aGVyIG1hdHJpeCBvcmRlcjsgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIG1hdHJpeAorCUJZVEUgKm1hdHJpeCA9IChCWVRFKiltYWxsb2MobCpsICogc2l6ZW9mKEJZVEUpKTsKKwlmb3IoaW50IGkgPSAwOyBpIDwgbCpsOyBpKyspIHsKKwkJLy8gYWNjb3JkaW5nIHRvICJQdXJkdWUgVW5pdmVyc2l0eTogRGlnaXRhbCBJbWFnZSBQcm9jZXNzaW5nIExhYm9yYXRvcnk6IEltYWdlIEhhbGZ0b25pbmcsIEFwcmlsIDMwdGgsIDIwMDYKKwkJbWF0cml4W2ldID0gKEJZVEUpKCAyNTUgKiAoKChkb3VibGUpZGl0aGVydmFsdWUoaSAvIGwsIGkgJSBsLCBvcmRlcikgKyAwLjUpIC8gKGwqbCkpICk7CisJfQorCisJLy8gcGVyZm9ybSB0aGUgZGl0aGVyaW5nCisJZm9yKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJLy8gc2NhbiBsZWZ0IHRvIHJpZ2h0CisJCWJpdHMgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCB5KTsKKwkJbmV3X2JpdHMgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUobmV3X2RpYiwgeSk7CisJCWZvcih4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCWlmKGJpdHNbeF0gPiBtYXRyaXhbKHggJSBsKSArIGwgKiAoeSAlIGwpXSkgeworCQkJCW5ld19iaXRzW3hdID0gV0hJVEU7CisJCQl9IGVsc2UgeworCQkJCW5ld19iaXRzW3hdID0gQkxBQ0s7CisJCQl9CisJCX0KKwl9CisKKwlmcmVlKG1hdHJpeCk7CisKKwlyZXR1cm4gbmV3X2RpYjsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gT3JkZXJlZCBjbHVzdGVyZWQgZG90IGRpdGhlcmluZworLy8KKworLy8gTkIgOiBUaGUgcHJlZGVmaW5lZCBkaXRoZXIgbWF0cmljZXMgYXJlIHRoZSBzYW1lIGFzIG1hdHJpY2VzIHVzZWQgaW4gCisvLyB0aGUgTmV0cGJtIHBhY2thZ2UgKGh0dHA6Ly9uZXRwYm0uc291cmNlZm9yZ2UubmV0KSBhbmQgYXJlIGRlZmluZWQgaW4gVWxpY2huZXkncyBib29rLgorLy8gU2VlIGFsc28gOiBUaGUgbmV3c3ByaW50IHdlYiBzaXRlIGF0IGh0dHA6Ly93d3cuY2wuY2FtLmFjLnVrL35hbmQxMDAwL25ld3NwcmludC8KKy8vIGZvciBtb3JlIHRlY2huaWNhbCBpbmZvIG9uIHRoaXMgZGl0aGVyaW5nIHRlY2huaXF1ZQorLy8KK3N0YXRpYyBGSUJJVE1BUCogT3JkZXJlZENsdXN0ZXJlZERvdChGSUJJVE1BUCAqZGliLCBpbnQgb3JkZXIpIHsKKwkvLyBPcmRlci0zIGNsdXN0ZXJlZCBkaXRoZXJpbmcgbWF0cml4LgorCWludCBjbHVzdGVyM1tdID0geworCSAgOSwxMSwxMCwgOCwgNiwgNywKKwkgIDEyLDE3LDE2LCA1LCAwLCAxLAorCSAgMTMsMTQsMTUsIDQsIDMsIDIsCisJICA4LCA2LCA3LCA5LDExLDEwLAorCSAgNSwgMCwgMSwxMiwxNywxNiwKKwkgIDQsIDMsIDIsMTMsMTQsMTUKKwl9OworCisJLy8gT3JkZXItNCBjbHVzdGVyZWQgZGl0aGVyaW5nIG1hdHJpeC4gCisJaW50IGNsdXN0ZXI0W10gPSB7CisJICAxOCwyMCwxOSwxNiwxMywxMSwxMiwxNSwKKwkgIDI3LDI4LDI5LDIyLCA0LCAzLCAyLCA5LAorCSAgMjYsMzEsMzAsMjEsIDUsIDAsIDEsMTAsCisJICAyMywyNSwyNCwxNywgOCwgNiwgNywxNCwKKwkgIDEzLDExLDEyLDE1LDE4LDIwLDE5LDE2LAorCSAgNCwgMywgMiwgOSwyNywyOCwyOSwyMiwKKwkgIDUsIDAsIDEsMTAsMjYsMzEsMzAsMjEsCisJICA4LCA2LCA3LDE0LDIzLDI1LDI0LDE3CisJfTsKKworCS8vIE9yZGVyLTggY2x1c3RlcmVkIGRpdGhlcmluZyBtYXRyaXguIAorCWludCBjbHVzdGVyOFtdID0geworCSAgIDY0LCA2OSwgNzcsIDg3LCA4NiwgNzYsIDY4LCA2NywgNjMsIDU4LCA1MCwgNDAsIDQxLCA1MSwgNTksIDYwLAorCSAgIDcwLCA5NCwxMDAsMTA5LDEwOCwgOTksIDkzLCA3NSwgNTcsIDMzLCAyNywgMTgsIDE5LCAyOCwgMzQsIDUyLAorCSAgIDc4LDEwMSwxMTQsMTE2LDExNSwxMTIsIDk4LCA4MywgNDksIDI2LCAxMywgMTEsIDEyLCAxNSwgMjksIDQ0LAorCSAgIDg4LDExMCwxMjMsMTI0LDEyNSwxMTgsMTA3LCA4NSwgMzksIDE3LCAgNCwgIDMsICAyLCAgOSwgMjAsIDQyLAorCSAgIDg5LDExMSwxMjIsMTI3LDEyNiwxMTcsMTA2LCA4NCwgMzgsIDE2LCAgNSwgIDAsICAxLCAxMCwgMjEsIDQzLAorCSAgIDc5LDEwMiwxMTksMTIxLDEyMCwxMTMsIDk3LCA4MiwgNDgsIDI1LCAgOCwgIDYsICA3LCAxNCwgMzAsIDQ1LAorCSAgIDcxLCA5NSwxMDMsMTA0LDEwNSwgOTYsIDkyLCA3NCwgNTYsIDMyLCAyNCwgMjMsIDIyLCAzMSwgMzUsIDUzLAorCSAgIDY1LCA3MiwgODAsIDkwLCA5MSwgODEsIDczLCA2NiwgNjIsIDU1LCA0NywgMzcsIDM2LCA0NiwgNTQsIDYxLAorCSAgIDYzLCA1OCwgNTAsIDQwLCA0MSwgNTEsIDU5LCA2MCwgNjQsIDY5LCA3NywgODcsIDg2LCA3NiwgNjgsIDY3LAorCSAgIDU3LCAzMywgMjcsIDE4LCAxOSwgMjgsIDM0LCA1MiwgNzAsIDk0LDEwMCwxMDksMTA4LCA5OSwgOTMsIDc1LAorCSAgIDQ5LCAyNiwgMTMsIDExLCAxMiwgMTUsIDI5LCA0NCwgNzgsMTAxLDExNCwxMTYsMTE1LDExMiwgOTgsIDgzLAorCSAgIDM5LCAxNywgIDQsICAzLCAgMiwgIDksIDIwLCA0MiwgODgsMTEwLDEyMywxMjQsMTI1LDExOCwxMDcsIDg1LAorCSAgIDM4LCAxNiwgIDUsICAwLCAgMSwgMTAsIDIxLCA0MywgODksMTExLDEyMiwxMjcsMTI2LDExNywxMDYsIDg0LAorCSAgIDQ4LCAyNSwgIDgsICA2LCAgNywgMTQsIDMwLCA0NSwgNzksMTAyLDExOSwxMjEsMTIwLDExMywgOTcsIDgyLAorCSAgIDU2LCAzMiwgMjQsIDIzLCAyMiwgMzEsIDM1LCA1MywgNzEsIDk1LDEwMywxMDQsMTA1LCA5NiwgOTIsIDc0LAorCSAgIDYyLCA1NSwgNDcsIDM3LCAzNiwgNDYsIDU0LCA2MSwgNjUsIDcyLCA4MCwgOTAsIDkxLCA4MSwgNzMsIDY2CisJfTsKKworCWludCB4LCB5LCBwaXhlbDsKKwlpbnQgd2lkdGgsIGhlaWdodDsKKwlCWVRFICpiaXRzLCAqbmV3X2JpdHM7CisJRklCSVRNQVAgKm5ld19kaWIgPSBOVUxMOworCisJLy8gYWxsb2NhdGUgYSA4LWJpdCBESUIKKwl3aWR0aCA9IEZyZWVJbWFnZV9HZXRXaWR0aChkaWIpOworCWhlaWdodCA9IEZyZWVJbWFnZV9HZXRIZWlnaHQoZGliKTsKKwluZXdfZGliID0gRnJlZUltYWdlX0FsbG9jYXRlKHdpZHRoLCBoZWlnaHQsIDgpOworCWlmKE5VTEwgPT0gbmV3X2RpYikgcmV0dXJuIE5VTEw7CisKKwkvLyBzZWxlY3QgdGhlIGRpdGhlcmluZyBtYXRyaXgKKwlpbnQgKm1hdHJpeCA9IE5VTEw7CisJc3dpdGNoKG9yZGVyKSB7CisJCWNhc2UgMzoKKwkJCW1hdHJpeCA9ICZjbHVzdGVyM1swXTsKKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQltYXRyaXggPSAmY2x1c3RlcjRbMF07CisJCQlicmVhazsKKwkJY2FzZSA4OgorCQkJbWF0cml4ID0gJmNsdXN0ZXI4WzBdOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvLyBzY2FsZSB0aGUgZGl0aGVyaW5nIG1hdHJpeAorCWludCBsID0gMiAqIG9yZGVyOworCWludCBzY2FsZSA9IDI1NiAvIChsICogb3JkZXIpOworCWZvcih5ID0gMDsgeSA8IGw7IHkrKykgeworCQlmb3IoeCA9IDA7IHggPCBsOyB4KyspIHsKKwkJCW1hdHJpeFt5KmwgKyB4XSAqPSBzY2FsZTsKKwkJfQorCX0KKworCS8vIHBlcmZvcm0gdGhlIGRpdGhlcmluZworCWZvcih5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisJCS8vIHNjYW4gbGVmdCB0byByaWdodAorCQliaXRzID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgeSk7CisJCW5ld19iaXRzID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKG5ld19kaWIsIHkpOworCQlmb3IoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisJCQlwaXhlbCA9IGJpdHNbeF07CisJCQlpZihwaXhlbCA+PSBtYXRyaXhbKHkgJSBsKSArIGwgKiAoeCAlIGwpXSkgeworCQkJCW5ld19iaXRzW3hdID0gV0hJVEU7CisJCQl9IGVsc2UgeworCQkJCW5ld19iaXRzW3hdID0gQkxBQ0s7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gbmV3X2RpYjsKK30KKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBIYWxmdG9uaW5nIGZ1bmN0aW9uCisvLworRklCSVRNQVAgKiBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9EaXRoZXIoRklCSVRNQVAgKmRpYiwgRlJFRV9JTUFHRV9ESVRIRVIgYWxnb3JpdGhtKSB7CisJRklCSVRNQVAgKmlucHV0ID0gTlVMTCwgKmRpYjggPSBOVUxMOworCisJaWYoIUZyZWVJbWFnZV9IYXNQaXhlbHMoZGliKSkgcmV0dXJuIE5VTEw7CisKKwljb25zdCB1bnNpZ25lZCBicHAgPSBGcmVlSW1hZ2VfR2V0QlBQKGRpYik7CisKKwlpZihicHAgPT0gMSkgeworCQkvLyBKdXN0IGNsb25lIHRoZSBkaWIgYW5kIGFkanVzdCB0aGUgcGFsZXR0ZSBpZiBuZWVkZWQKKwkJRklCSVRNQVAgKm5ld19kaWIgPSBGcmVlSW1hZ2VfQ2xvbmUoZGliKTsKKwkJaWYoTlVMTCA9PSBuZXdfZGliKSByZXR1cm4gTlVMTDsKKwkJaWYoRnJlZUltYWdlX0dldENvbG9yVHlwZShuZXdfZGliKSA9PSBGSUNfUEFMRVRURSkgeworCQkJLy8gQnVpbGQgYSBtb25vY2hyb21lIHBhbGV0dGUKKwkJCVJHQlFVQUQgKnBhbCA9IEZyZWVJbWFnZV9HZXRQYWxldHRlKG5ld19kaWIpOworCQkJcGFsWzBdLnJnYlJlZCA9IHBhbFswXS5yZ2JHcmVlbiA9IHBhbFswXS5yZ2JCbHVlID0gMDsKKwkJCXBhbFsxXS5yZ2JSZWQgPSBwYWxbMV0ucmdiR3JlZW4gPSBwYWxbMV0ucmdiQmx1ZSA9IDI1NTsKKwkJfQorCQlyZXR1cm4gbmV3X2RpYjsKKwl9CisKKwkvLyBDb252ZXJ0IHRoZSBpbnB1dCBkaWIgdG8gYSA4LWJpdCBncmV5c2NhbGUgZGliCisJLy8KKwlzd2l0Y2goYnBwKSB7CisJCWNhc2UgODoKKwkJCWlmKEZyZWVJbWFnZV9HZXRDb2xvclR5cGUoZGliKSA9PSBGSUNfTUlOSVNCTEFDSykgeworCQkJCWlucHV0ID0gZGliOworCQkJfSBlbHNlIHsKKwkJCQlpbnB1dCA9IEZyZWVJbWFnZV9Db252ZXJ0VG9HcmV5c2NhbGUoZGliKTsKKwkJCX0gCisJCQlicmVhazsKKwkJY2FzZSA0OgorCQljYXNlIDE2OgorCQljYXNlIDI0OgorCQljYXNlIDMyOgorCQkJaW5wdXQgPSBGcmVlSW1hZ2VfQ29udmVydFRvR3JleXNjYWxlKGRpYik7CisJCQlicmVhazsJCQkKKwl9CisJaWYoTlVMTCA9PSBpbnB1dCkgcmV0dXJuIE5VTEw7CisKKwkvLyBBcHBseSB0aGUgZGl0aGVyaW5nIGFsZ29yaXRobQorCXN3aXRjaChhbGdvcml0aG0pIHsKKwkJY2FzZSBGSURfRlM6CisJCQlkaWI4ID0gRmxveWRTdGVpbmJlcmcoaW5wdXQpOworCQkJYnJlYWs7CisJCWNhc2UgRklEX0JBWUVSNHg0OgorCQkJZGliOCA9IE9yZGVyZWREaXNwZXJzZWREb3QoaW5wdXQsIDIpOworCQkJYnJlYWs7CisJCWNhc2UgRklEX0JBWUVSOHg4OgorCQkJZGliOCA9IE9yZGVyZWREaXNwZXJzZWREb3QoaW5wdXQsIDMpOworCQkJYnJlYWs7CisJCWNhc2UgRklEX0JBWUVSMTZ4MTY6CisJCQlkaWI4ID0gT3JkZXJlZERpc3BlcnNlZERvdChpbnB1dCwgNCk7CisJCQlicmVhazsKKwkJY2FzZSBGSURfQ0xVU1RFUjZ4NjoKKwkJCWRpYjggPSBPcmRlcmVkQ2x1c3RlcmVkRG90KGlucHV0LCAzKTsKKwkJCWJyZWFrOworCQljYXNlIEZJRF9DTFVTVEVSOHg4OgorCQkJZGliOCA9IE9yZGVyZWRDbHVzdGVyZWREb3QoaW5wdXQsIDQpOworCQkJYnJlYWs7CisJCWNhc2UgRklEX0NMVVNURVIxNngxNjoKKwkJCWRpYjggPSBPcmRlcmVkQ2x1c3RlcmVkRG90KGlucHV0LCA4KTsKKwkJCWJyZWFrOworCX0KKwlpZihpbnB1dCAhPSBkaWIpIHsKKwkJRnJlZUltYWdlX1VubG9hZChpbnB1dCk7CisJfQorCisJLy8gQnVpbGQgYSBncmV5c2NhbGUgcGFsZXR0ZSAobmVlZGVkIGJ5IHRocmVzaG9sZCkKKwlSR0JRVUFEICpncmV5X3BhbCA9IEZyZWVJbWFnZV9HZXRQYWxldHRlKGRpYjgpOworCWZvcihpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQlncmV5X3BhbFtpXS5yZ2JSZWQJPSAoQllURSlpOworCQlncmV5X3BhbFtpXS5yZ2JHcmVlbiA9IChCWVRFKWk7CisJCWdyZXlfcGFsW2ldLnJnYkJsdWUJPSAoQllURSlpOworCX0KKworCS8vIENvbnZlcnQgdG8gMS1iaXQKKwlGSUJJVE1BUCAqbmV3X2RpYiA9IEZyZWVJbWFnZV9UaHJlc2hvbGQoZGliOCwgMTI4KTsKKwlGcmVlSW1hZ2VfVW5sb2FkKGRpYjgpOworCisJLy8gY29weSBtZXRhZGF0YSBmcm9tIHNyYyB0byBkc3QKKwlGcmVlSW1hZ2VfQ2xvbmVNZXRhZGF0YShuZXdfZGliLCBkaWIpOworCisJcmV0dXJuIG5ld19kaWI7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFRocmVzaG9sZGluZyBmdW5jdGlvbgorLy8KK0ZJQklUTUFQICogRExMX0NBTExDT05WCitGcmVlSW1hZ2VfVGhyZXNob2xkKEZJQklUTUFQICpkaWIsIEJZVEUgVCkgeworCUZJQklUTUFQICpkaWI4ID0gTlVMTDsKKworCWlmKCFGcmVlSW1hZ2VfSGFzUGl4ZWxzKGRpYikpIHJldHVybiBOVUxMOworCisJY29uc3QgdW5zaWduZWQgYnBwID0gRnJlZUltYWdlX0dldEJQUChkaWIpOworCisJaWYoYnBwID09IDEpIHsKKwkJLy8gSnVzdCBjbG9uZSB0aGUgZGliIGFuZCBhZGp1c3QgdGhlIHBhbGV0dGUgaWYgbmVlZGVkCisJCUZJQklUTUFQICpuZXdfZGliID0gRnJlZUltYWdlX0Nsb25lKGRpYik7CisJCWlmKE5VTEwgPT0gbmV3X2RpYikgcmV0dXJuIE5VTEw7CisJCWlmKEZyZWVJbWFnZV9HZXRDb2xvclR5cGUobmV3X2RpYikgPT0gRklDX1BBTEVUVEUpIHsKKwkJCS8vIEJ1aWxkIGEgbW9ub2Nocm9tZSBwYWxldHRlCisJCQlSR0JRVUFEICpwYWwgPSBGcmVlSW1hZ2VfR2V0UGFsZXR0ZShuZXdfZGliKTsKKwkJCXBhbFswXS5yZ2JSZWQgPSBwYWxbMF0ucmdiR3JlZW4gPSBwYWxbMF0ucmdiQmx1ZSA9IDA7CisJCQlwYWxbMV0ucmdiUmVkID0gcGFsWzFdLnJnYkdyZWVuID0gcGFsWzFdLnJnYkJsdWUgPSAyNTU7CisJCX0KKwkJcmV0dXJuIG5ld19kaWI7CisJfQorCisJLy8gQ29udmVydCB0aGUgaW5wdXQgZGliIHRvIGEgOC1iaXQgZ3JleXNjYWxlIGRpYgorCS8vCisJc3dpdGNoKGJwcCkgeworCQljYXNlIDg6CisJCQlpZihGcmVlSW1hZ2VfR2V0Q29sb3JUeXBlKGRpYikgPT0gRklDX01JTklTQkxBQ0spIHsKKwkJCQlkaWI4ID0gZGliOworCQkJfSBlbHNlIHsKKwkJCQlkaWI4ID0gRnJlZUltYWdlX0NvbnZlcnRUb0dyZXlzY2FsZShkaWIpOworCQkJfSAKKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCWNhc2UgMTY6CisJCWNhc2UgMjQ6CisJCWNhc2UgMzI6CisJCQlkaWI4ID0gRnJlZUltYWdlX0NvbnZlcnRUb0dyZXlzY2FsZShkaWIpOworCQkJYnJlYWs7CQkJCisJfQorCWlmKE5VTEwgPT0gZGliOCkgcmV0dXJuIE5VTEw7CisKKwkvLyBBbGxvY2F0ZSBhIG5ldyAxLWJpdCBESUIKKwlpbnQgd2lkdGggPSBGcmVlSW1hZ2VfR2V0V2lkdGgoZGliKTsKKwlpbnQgaGVpZ2h0ID0gRnJlZUltYWdlX0dldEhlaWdodChkaWIpOworCUZJQklUTUFQICpuZXdfZGliID0gRnJlZUltYWdlX0FsbG9jYXRlKHdpZHRoLCBoZWlnaHQsIDEpOworCWlmKE5VTEwgPT0gbmV3X2RpYikgcmV0dXJuIE5VTEw7CisJLy8gQnVpbGQgYSBtb25vY2hyb21lIHBhbGV0dGUKKwlSR0JRVUFEICpwYWwgPSBGcmVlSW1hZ2VfR2V0UGFsZXR0ZShuZXdfZGliKTsKKwlwYWxbMF0ucmdiUmVkID0gcGFsWzBdLnJnYkdyZWVuID0gcGFsWzBdLnJnYkJsdWUgPSAwOworCXBhbFsxXS5yZ2JSZWQgPSBwYWxbMV0ucmdiR3JlZW4gPSBwYWxbMV0ucmdiQmx1ZSA9IDI1NTsKKworCS8vIFBlcmZvcm0gdGhlIHRocmVzaG9sZGluZworCS8vCisJZm9yKGludCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisJCUJZVEUgKmJpdHM4ID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYjgsIHkpOworCQlCWVRFICpiaXRzMSA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShuZXdfZGliLCB5KTsKKwkJZm9yKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCWlmKGJpdHM4W3hdIDwgVCkgeworCQkJCS8vIFNldCBiaXQoeCwgeSkgdG8gMAorCQkJCWJpdHMxW3ggPj4gM10gJj0gKDB4RkY3RiA+PiAoeCAmIDB4NykpOworCQkJfSBlbHNlIHsKKwkJCQkvLyBTZXQgYml0KHgsIHkpIHRvIDEKKwkJCQliaXRzMVt4ID4+IDNdIHw9ICgweDgwID4+ICh4ICYgMHg3KSk7CisJCQl9CisJCX0KKwl9CisJaWYoZGliOCAhPSBkaWIpIHsKKwkJRnJlZUltYWdlX1VubG9hZChkaWI4KTsKKwl9CisKKwkvLyBjb3B5IG1ldGFkYXRhIGZyb20gc3JjIHRvIGRzdAorCUZyZWVJbWFnZV9DbG9uZU1ldGFkYXRhKG5ld19kaWIsIGRpYik7CisKKwlyZXR1cm4gbmV3X2RpYjsKK30KKwpkaWZmIC0tZ2l0IGEvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9KMktIZWxwZXIuY3BwIGIvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9KMktIZWxwZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMDk3OWEKLS0tIC9kZXYvbnVsbAorKysgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL0oyS0hlbHBlci5jcHAKQEAgLTAsMCArMSw1OTEgQEAKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEpQRUcyMDAwIGhlbHBlcnMKKy8vCisvLyBEZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIGJ5CisvLyAtIEhlcnbDqSBEcm9sb24gKGRyb2xvbkBpbmZvbmllLmZyKQorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZyZWVJbWFnZSAzCisvLworLy8gQ09WRVJFRCBDT0RFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZCisvLyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUworLy8gVEhBVCBUSEUgQ09WRVJFRCBDT0RFIElTIEZSRUUgT0YgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisvLyBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRAorLy8gQ09ERSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVAorLy8gVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GIEFOWSBORUNFU1NBUlkKKy8vIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwKKy8vIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIKKy8vIFRISVMgRElTQ0xBSU1FUi4KKy8vCisvLyBVc2UgYXQgeW91ciBvd24gcmlzayEKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2luY2x1ZGUgIkZyZWVJbWFnZS5oIgorI2luY2x1ZGUgIlV0aWxpdGllcy5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L29wZW5qcGVnMi9zcmMvbGliL29wZW5qcDIvb3BlbmpwZWcuaCIKKyNpbmNsdWRlICJKMktIZWxwZXIuaCIKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIE9QSl9VSU5UNjQgCitfTGVuZ3RoUHJvYyhKMktGSU9fdCAqZmlvKSB7CisJbG9uZyBzdGFydF9wb3MgPSBmaW8tPmlvLT50ZWxsX3Byb2MoZmlvLT5oYW5kbGUpOworCWZpby0+aW8tPnNlZWtfcHJvYyhmaW8tPmhhbmRsZSwgMCwgU0VFS19FTkQpOworCXVuc2lnbmVkIGZpbGVfbGVuZ3RoID0gZmlvLT5pby0+dGVsbF9wcm9jKGZpby0+aGFuZGxlKSAtIHN0YXJ0X3BvczsKKwlmaW8tPmlvLT5zZWVrX3Byb2MoZmlvLT5oYW5kbGUsIHN0YXJ0X3BvcywgU0VFS19TRVQpOworCXJldHVybiAoT1BKX1VJTlQ2NClmaWxlX2xlbmd0aDsKK30KKworc3RhdGljIE9QSl9TSVpFX1QgCitfUmVhZFByb2Modm9pZCAqcF9idWZmZXIsIE9QSl9TSVpFX1QgcF9uYl9ieXRlcywgdm9pZCAqcF91c2VyX2RhdGEpIHsKKwlKMktGSU9fdCAqZmlvID0gKEoyS0ZJT190KilwX3VzZXJfZGF0YTsKKwlPUEpfU0laRV9UIGxfbmJfcmVhZCA9IGZpby0+aW8tPnJlYWRfcHJvYyhwX2J1ZmZlciwgMSwgKHVuc2lnbmVkKXBfbmJfYnl0ZXMsIGZpby0+aGFuZGxlKTsKKwlyZXR1cm4gbF9uYl9yZWFkID8gbF9uYl9yZWFkIDogKE9QSl9TSVpFX1QpLTE7Cit9CisKK3N0YXRpYyBPUEpfU0laRV9UIAorX1dyaXRlUHJvYyh2b2lkICpwX2J1ZmZlciwgT1BKX1NJWkVfVCBwX25iX2J5dGVzLCB2b2lkICpwX3VzZXJfZGF0YSkgeworCUoyS0ZJT190ICpmaW8gPSAoSjJLRklPX3QqKXBfdXNlcl9kYXRhOyAgCisJcmV0dXJuIGZpby0+aW8tPndyaXRlX3Byb2MocF9idWZmZXIsIDEsICh1bnNpZ25lZClwX25iX2J5dGVzLCBmaW8tPmhhbmRsZSk7Cit9CisKK3N0YXRpYyBPUEpfT0ZGX1QgCitfU2tpcFByb2MoT1BKX09GRl9UIHBfbmJfYnl0ZXMsIHZvaWQgKnBfdXNlcl9kYXRhKSB7CisJSjJLRklPX3QgKmZpbyA9IChKMktGSU9fdCopcF91c2VyX2RhdGE7CisJaWYoIGZpby0+aW8tPnNlZWtfcHJvYyhmaW8tPmhhbmRsZSwgKGxvbmcpcF9uYl9ieXRlcywgU0VFS19DVVIpICkgeworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiBwX25iX2J5dGVzOworfQorCitzdGF0aWMgT1BKX0JPT0wgCitfU2Vla1Byb2MoT1BKX09GRl9UIHBfbmJfYnl0ZXMsIEZJTEUgKiBwX3VzZXJfZGF0YSkgeworCUoyS0ZJT190ICpmaW8gPSAoSjJLRklPX3QqKXBfdXNlcl9kYXRhOworCWlmKCBmaW8tPmlvLT5zZWVrX3Byb2MoZmlvLT5oYW5kbGUsIChsb25nKXBfbmJfYnl0ZXMsIFNFRUtfU0VUKSApIHsKKwkJcmV0dXJuIE9QSl9GQUxTRTsKKwl9CisJcmV0dXJuIE9QSl9UUlVFOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitKMktGSU9fdCogCitvcGpfZnJlZWltYWdlX3N0cmVhbV9jcmVhdGUoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBCT09MIGJSZWFkKSB7CisJaWYoIWhhbmRsZSkgeworCQlyZXR1cm4gTlVMTDsKKwl9CisJSjJLRklPX3QgKmZpbyA9IChKMktGSU9fdCopbWFsbG9jKHNpemVvZihKMktGSU9fdCkpOworCWlmKGZpbykgeworCQlmaW8tPmlvID0gaW87CisJCWZpby0+aGFuZGxlID0gaGFuZGxlOworCisJCW9wal9zdHJlYW1fdCAqbF9zdHJlYW0gPSBvcGpfc3RyZWFtX2NyZWF0ZShPUEpfSjJLX1NUUkVBTV9DSFVOS19TSVpFLCBiUmVhZCA/IE9QSl9UUlVFIDogT1BKX0ZBTFNFKTsKKwkJaWYgKGxfc3RyZWFtKSB7CisJCQlvcGpfc3RyZWFtX3NldF91c2VyX2RhdGEobF9zdHJlYW0sIGZpbywgTlVMTCk7CisJCQlvcGpfc3RyZWFtX3NldF91c2VyX2RhdGFfbGVuZ3RoKGxfc3RyZWFtLCBfTGVuZ3RoUHJvYyhmaW8pKTsKKwkJCW9wal9zdHJlYW1fc2V0X3JlYWRfZnVuY3Rpb24obF9zdHJlYW0sIChvcGpfc3RyZWFtX3JlYWRfZm4pX1JlYWRQcm9jKTsKKwkJCW9wal9zdHJlYW1fc2V0X3dyaXRlX2Z1bmN0aW9uKGxfc3RyZWFtLCAob3BqX3N0cmVhbV93cml0ZV9mbilfV3JpdGVQcm9jKTsKKwkJCW9wal9zdHJlYW1fc2V0X3NraXBfZnVuY3Rpb24obF9zdHJlYW0sIChvcGpfc3RyZWFtX3NraXBfZm4pX1NraXBQcm9jKTsKKwkJCW9wal9zdHJlYW1fc2V0X3NlZWtfZnVuY3Rpb24obF9zdHJlYW0sIChvcGpfc3RyZWFtX3NlZWtfZm4pX1NlZWtQcm9jKTsKKwkJCWZpby0+c3RyZWFtID0gbF9zdHJlYW07CisJCQlyZXR1cm4gZmlvOworCQl9IGVsc2UgeworCQkJZnJlZShmaW8pOworCQl9CisJfQorCisJcmV0dXJuIE5VTEw7CQkKK30KKwordm9pZCAKK29wal9mcmVlaW1hZ2Vfc3RyZWFtX2Rlc3Ryb3koSjJLRklPX3QqIGZpbykgeworCWlmKGZpbykgeworCQlpZihmaW8tPnN0cmVhbSkgeworCQkJb3BqX3N0cmVhbV9kZXN0cm95KGZpby0+c3RyZWFtKTsKKwkJfQorCQlmcmVlKGZpbyk7CisJfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKioKK0RpdmlkZSBhbiBpbnRlZ2VyIGJ5IGEgcG93ZXIgb2YgMiBhbmQgcm91bmQgdXB3YXJkcworQHJldHVybiBSZXR1cm5zIGEgZGl2aWRlZCBieSAyXmIKKyovCitzdGF0aWMgaW50IGludF9jZWlsZGl2cG93MihpbnQgYSwgaW50IGIpIHsKKwlyZXR1cm4gKGEgKyAoMSA8PCBiKSAtIDEpID4+IGI7Cit9CisKKy8qKgorQ29udmVydCBhIE9wZW5KUEVHIGltYWdlIHRvIGEgRklCSVRNQVAKK0BwYXJhbSBmb3JtYXRfaWQgUGx1Z2luIElECitAcGFyYW0gaW1hZ2UgT3BlbkpQRUcgaW1hZ2UKK0BwYXJhbSBoZWFkZXJfb25seSBJZiBUUlVFLCBhbGxvY2F0ZSBhICdoZWFkZXIgb25seScgRklCSVRNQVAsIG90aGVyd2lzZSBhbGxvY2F0ZSBhIGZ1bGwgRklCSVRNQVAKK0ByZXR1cm4gUmV0dXJucyB0aGUgY29udmVydGVkIGltYWdlIGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgTlVMTCBvdGhlcndpc2UKKyovCitGSUJJVE1BUCogSjJLSW1hZ2VUb0ZJQklUTUFQKGludCBmb3JtYXRfaWQsIGNvbnN0IG9wal9pbWFnZV90ICppbWFnZSwgQk9PTCBoZWFkZXJfb25seSkgeworCUZJQklUTUFQICpkaWIgPSBOVUxMOworCisJdHJ5IHsKKwkJLy8gY29tcHV0ZSBpbWFnZSB3aWR0aCBhbmQgaGVpZ2h0CisKKwkJLy9pbnQgdyA9IGludF9jZWlsZGl2KGltYWdlLT54MSAtIGltYWdlLT54MCwgaW1hZ2UtPmNvbXBzWzBdLmR4KTsKKwkJaW50IHdyID0gaW1hZ2UtPmNvbXBzWzBdLnc7CisJCWludCB3cnIgPSBpbnRfY2VpbGRpdnBvdzIoaW1hZ2UtPmNvbXBzWzBdLncsIGltYWdlLT5jb21wc1swXS5mYWN0b3IpOworCQkKKwkJLy9pbnQgaCA9IGludF9jZWlsZGl2KGltYWdlLT55MSAtIGltYWdlLT55MCwgaW1hZ2UtPmNvbXBzWzBdLmR5KTsKKwkJLy9pbnQgaHIgPSBpbWFnZS0+Y29tcHNbMF0uaDsKKwkJaW50IGhyciA9IGludF9jZWlsZGl2cG93MihpbWFnZS0+Y29tcHNbMF0uaCwgaW1hZ2UtPmNvbXBzWzBdLmZhY3Rvcik7CisKKwkJLy8gY2hlY2sgdGhlIG51bWJlciBvZiBjb21wb25lbnRzCisKKwkJaW50IG51bWNvbXBzID0gaW1hZ2UtPm51bWNvbXBzOworCisJCUJPT0wgYklzVmFsaWQgPSBUUlVFOworCQlmb3IoaW50IGMgPSAwOyBjIDwgbnVtY29tcHMgLSAxOyBjKyspIHsKKwkJCWlmKAkoaW1hZ2UtPmNvbXBzW2NdLmR4ID09IGltYWdlLT5jb21wc1tjKzFdLmR4KSAmJiAKKwkJCQkoaW1hZ2UtPmNvbXBzW2NdLmR5ID09IGltYWdlLT5jb21wc1tjKzFdLmR5KSAmJgorCQkJCShpbWFnZS0+Y29tcHNbY10ucHJlYyA9PSBpbWFnZS0+Y29tcHNbYysxXS5wcmVjKSApIHsKKwkJCQljb250aW51ZTsKKwkJCX0gZWxzZSB7CisJCQkJYklzVmFsaWQgPSBGQUxTRTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQliSXNWYWxpZCAmPSAoKG51bWNvbXBzID09IDEpIHx8IChudW1jb21wcyA9PSAzKSB8fCAobnVtY29tcHMgPT0gNCkpOworCQlpZighYklzVmFsaWQpIHsKKwkJCWlmKG51bWNvbXBzKSB7CisJCQkJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKGZvcm1hdF9pZCwgIldhcm5pbmc6IGltYWdlIGNvbnRhaW5zICVkIGdyZXlzY2FsZSBjb21wb25lbnRzLiBPbmx5IHRoZSBmaXJzdCB3aWxsIGJlIGxvYWRlZC5cbiIsIG51bWNvbXBzKTsKKwkJCQludW1jb21wcyA9IDE7CisJCQl9IGVsc2UgeworCQkJCS8vIHVua25vd24gdHlwZQorCQkJCXRocm93IEZJX01TR19FUlJPUl9VTlNVUFBPUlRFRF9GT1JNQVQ7CisJCQl9CisJCX0KKworCQkvLyBjcmVhdGUgYSBuZXcgRElCCisKKwkJaWYoaW1hZ2UtPmNvbXBzWzBdLnByZWMgPD0gOCkgeworCQkJc3dpdGNoKG51bWNvbXBzKSB7CisJCQkJY2FzZSAxOgorCQkJCQlkaWIgPSBGcmVlSW1hZ2VfQWxsb2NhdGVIZWFkZXIoaGVhZGVyX29ubHksIHdyciwgaHJyLCA4KTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAzOgorCQkJCQlkaWIgPSBGcmVlSW1hZ2VfQWxsb2NhdGVIZWFkZXIoaGVhZGVyX29ubHksIHdyciwgaHJyLCAyNCwgRklfUkdCQV9SRURfTUFTSywgRklfUkdCQV9HUkVFTl9NQVNLLCBGSV9SR0JBX0JMVUVfTUFTSyk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgNDoKKwkJCQkJZGliID0gRnJlZUltYWdlX0FsbG9jYXRlSGVhZGVyKGhlYWRlcl9vbmx5LCB3cnIsIGhyciwgMzIsIEZJX1JHQkFfUkVEX01BU0ssIEZJX1JHQkFfR1JFRU5fTUFTSywgRklfUkdCQV9CTFVFX01BU0spOworCQkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIGlmKGltYWdlLT5jb21wc1swXS5wcmVjIDw9IDE2KSB7CisJCQlzd2l0Y2gobnVtY29tcHMpIHsKKwkJCQljYXNlIDE6CisJCQkJCWRpYiA9IEZyZWVJbWFnZV9BbGxvY2F0ZUhlYWRlclQoaGVhZGVyX29ubHksIEZJVF9VSU5UMTYsIHdyciwgaHJyKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAzOgorCQkJCQlkaWIgPSBGcmVlSW1hZ2VfQWxsb2NhdGVIZWFkZXJUKGhlYWRlcl9vbmx5LCBGSVRfUkdCMTYsIHdyciwgaHJyKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSA0OgorCQkJCQlkaWIgPSBGcmVlSW1hZ2VfQWxsb2NhdGVIZWFkZXJUKGhlYWRlcl9vbmx5LCBGSVRfUkdCQTE2LCB3cnIsIGhycik7CisJCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJdGhyb3cgRklfTVNHX0VSUk9SX1VOU1VQUE9SVEVEX0ZPUk1BVDsKKwkJfQorCQlpZighZGliKSB7CisJCQl0aHJvdyBGSV9NU0dfRVJST1JfRElCX01FTU9SWTsKKwkJfQorCisJCS8vICJoZWFkZXIgb25seSIgRklCSVRNQVAgPworCQlpZihoZWFkZXJfb25seSkgeworCQkJcmV0dXJuIGRpYjsKKwkJfQorCQkKKwkJaWYoaW1hZ2UtPmNvbXBzWzBdLnByZWMgPD0gOCkgeworCQkJaWYobnVtY29tcHMgPT0gMSkgeworCQkJCS8vIDgtYml0IGdyZXlzY2FsZQorCQkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCQkJCS8vIGJ1aWxkIGEgZ3JleXNjYWxlIHBhbGV0dGUKKwkJCQkKKwkJCQlSR0JRVUFEICpwYWwgPSBGcmVlSW1hZ2VfR2V0UGFsZXR0ZShkaWIpOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkJCQkJcGFsW2ldLnJnYlJlZAk9IChCWVRFKWk7CisJCQkJCXBhbFtpXS5yZ2JHcmVlbiA9IChCWVRFKWk7CisJCQkJCXBhbFtpXS5yZ2JCbHVlCT0gKEJZVEUpaTsKKwkJCQl9CisKKwkJCQkvLyBsb2FkIHBpeGVsIGRhdGEKKworCQkJCXVuc2lnbmVkIHBpeGVsX2NvdW50ID0gMDsKKworCQkJCWZvcihpbnQgeSA9IDA7IHkgPCBocnI7IHkrKykgewkJCisJCQkJCUJZVEUgKmJpdHMgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCBocnIgLSAxIC0geSk7CisKKwkJCQkJZm9yKGludCB4ID0gMDsgeCA8IHdycjsgeCsrKSB7CisJCQkJCQljb25zdCB1bnNpZ25lZCBwaXhlbF9wb3MgPSBwaXhlbF9jb3VudCAvIHdyciAqIHdyICsgcGl4ZWxfY291bnQgJSB3cnI7CisKKwkJCQkJCWludCBpbmRleCA9IGltYWdlLT5jb21wc1swXS5kYXRhW3BpeGVsX3Bvc107CisJCQkJCQlpbmRleCArPSAoaW1hZ2UtPmNvbXBzWzBdLnNnbmQgPyAxIDw8IChpbWFnZS0+Y29tcHNbMF0ucHJlYyAtIDEpIDogMCk7CisKKwkJCQkJCWJpdHNbeF0gPSAoQllURSlpbmRleDsKKworCQkJCQkJcGl4ZWxfY291bnQrKzsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWVsc2UgaWYobnVtY29tcHMgPT0gMykgeworCisJCQkJLy8gMjQtYml0IFJHQgorCQkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0JCisJCQkJCisJCQkJLy8gbG9hZCBwaXhlbCBkYXRhCisKKwkJCQl1bnNpZ25lZCBwaXhlbF9jb3VudCA9IDA7CisKKwkJCQlmb3IoaW50IHkgPSAwOyB5IDwgaHJyOyB5KyspIHsJCQorCQkJCQlCWVRFICpiaXRzID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgaHJyIC0gMSAtIHkpOworCisJCQkJCWZvcihpbnQgeCA9IDA7IHggPCB3cnI7IHgrKykgeworCQkJCQkJY29uc3QgdW5zaWduZWQgcGl4ZWxfcG9zID0gcGl4ZWxfY291bnQgLyB3cnIgKiB3ciArIHBpeGVsX2NvdW50ICUgd3JyOworCisJCQkJCQlpbnQgciA9IGltYWdlLT5jb21wc1swXS5kYXRhW3BpeGVsX3Bvc107CisJCQkJCQlyICs9IChpbWFnZS0+Y29tcHNbMF0uc2duZCA/IDEgPDwgKGltYWdlLT5jb21wc1swXS5wcmVjIC0gMSkgOiAwKTsKKwkJCQkJCQorCQkJCQkJaW50IGcgPSBpbWFnZS0+Y29tcHNbMV0uZGF0YVtwaXhlbF9wb3NdOworCQkJCQkJZyArPSAoaW1hZ2UtPmNvbXBzWzFdLnNnbmQgPyAxIDw8IChpbWFnZS0+Y29tcHNbMV0ucHJlYyAtIDEpIDogMCk7CisJCQkJCQkKKwkJCQkJCWludCBiID0gaW1hZ2UtPmNvbXBzWzJdLmRhdGFbcGl4ZWxfcG9zXTsKKwkJCQkJCWIgKz0gKGltYWdlLT5jb21wc1syXS5zZ25kID8gMSA8PCAoaW1hZ2UtPmNvbXBzWzJdLnByZWMgLSAxKSA6IDApOworCisJCQkJCQliaXRzW0ZJX1JHQkFfUkVEXSAgID0gKEJZVEUpcjsKKwkJCQkJCWJpdHNbRklfUkdCQV9HUkVFTl0gPSAoQllURSlnOworCQkJCQkJYml0c1tGSV9SR0JBX0JMVUVdICA9IChCWVRFKWI7CisJCQkJCQliaXRzICs9IDM7CisKKwkJCQkJCXBpeGVsX2NvdW50Kys7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQllbHNlIGlmKG51bWNvbXBzID09IDQpIHsKKworCQkJCS8vIDMyLWJpdCBSR0JBCisJCQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQkKKwkJCQkKKwkJCQkvLyBsb2FkIHBpeGVsIGRhdGEKKworCQkJCXVuc2lnbmVkIHBpeGVsX2NvdW50ID0gMDsKKworCQkJCWZvcihpbnQgeSA9IDA7IHkgPCBocnI7IHkrKykgewkJCisJCQkJCUJZVEUgKmJpdHMgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCBocnIgLSAxIC0geSk7CisKKwkJCQkJZm9yKGludCB4ID0gMDsgeCA8IHdycjsgeCsrKSB7CisJCQkJCQljb25zdCB1bnNpZ25lZCBwaXhlbF9wb3MgPSBwaXhlbF9jb3VudCAvIHdyciAqIHdyICsgcGl4ZWxfY291bnQgJSB3cnI7CisKKwkJCQkJCWludCByID0gaW1hZ2UtPmNvbXBzWzBdLmRhdGFbcGl4ZWxfcG9zXTsKKwkJCQkJCXIgKz0gKGltYWdlLT5jb21wc1swXS5zZ25kID8gMSA8PCAoaW1hZ2UtPmNvbXBzWzBdLnByZWMgLSAxKSA6IDApOworCQkJCQkJCisJCQkJCQlpbnQgZyA9IGltYWdlLT5jb21wc1sxXS5kYXRhW3BpeGVsX3Bvc107CisJCQkJCQlnICs9IChpbWFnZS0+Y29tcHNbMV0uc2duZCA/IDEgPDwgKGltYWdlLT5jb21wc1sxXS5wcmVjIC0gMSkgOiAwKTsKKwkJCQkJCQorCQkJCQkJaW50IGIgPSBpbWFnZS0+Y29tcHNbMl0uZGF0YVtwaXhlbF9wb3NdOworCQkJCQkJYiArPSAoaW1hZ2UtPmNvbXBzWzJdLnNnbmQgPyAxIDw8IChpbWFnZS0+Y29tcHNbMl0ucHJlYyAtIDEpIDogMCk7CisKKwkJCQkJCWludCBhID0gaW1hZ2UtPmNvbXBzWzNdLmRhdGFbcGl4ZWxfcG9zXTsKKwkJCQkJCWEgKz0gKGltYWdlLT5jb21wc1szXS5zZ25kID8gMSA8PCAoaW1hZ2UtPmNvbXBzWzNdLnByZWMgLSAxKSA6IDApOworCisJCQkJCQliaXRzW0ZJX1JHQkFfUkVEXSAgID0gKEJZVEUpcjsKKwkJCQkJCWJpdHNbRklfUkdCQV9HUkVFTl0gPSAoQllURSlnOworCQkJCQkJYml0c1tGSV9SR0JBX0JMVUVdICA9IChCWVRFKWI7CisJCQkJCQliaXRzW0ZJX1JHQkFfQUxQSEFdID0gKEJZVEUpYTsKKwkJCQkJCWJpdHMgKz0gNDsKKworCQkJCQkJcGl4ZWxfY291bnQrKzsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlIGlmKGltYWdlLT5jb21wc1swXS5wcmVjIDw9IDE2KSB7CisJCQlpZihudW1jb21wcyA9PSAxKSB7CisJCQkJLy8gMTYtYml0IGdyZXlzY2FsZQorCQkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCQkJCS8vIGxvYWQgcGl4ZWwgZGF0YQorCisJCQkJdW5zaWduZWQgcGl4ZWxfY291bnQgPSAwOworCisJCQkJZm9yKGludCB5ID0gMDsgeSA8IGhycjsgeSsrKSB7CQkKKwkJCQkJV09SRCAqYml0cyA9IChXT1JEKilGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCBocnIgLSAxIC0geSk7CisKKwkJCQkJZm9yKGludCB4ID0gMDsgeCA8IHdycjsgeCsrKSB7CisJCQkJCQljb25zdCB1bnNpZ25lZCBwaXhlbF9wb3MgPSBwaXhlbF9jb3VudCAvIHdyciAqIHdyICsgcGl4ZWxfY291bnQgJSB3cnI7CisKKwkJCQkJCWludCBpbmRleCA9IGltYWdlLT5jb21wc1swXS5kYXRhW3BpeGVsX3Bvc107CisJCQkJCQlpbmRleCArPSAoaW1hZ2UtPmNvbXBzWzBdLnNnbmQgPyAxIDw8IChpbWFnZS0+Y29tcHNbMF0ucHJlYyAtIDEpIDogMCk7CisKKwkJCQkJCWJpdHNbeF0gPSAoV09SRClpbmRleDsKKworCQkJCQkJcGl4ZWxfY291bnQrKzsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWVsc2UgaWYobnVtY29tcHMgPT0gMykgeworCisJCQkJLy8gNDgtYml0IFJHQgorCQkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0JCisJCQkJCisJCQkJLy8gbG9hZCBwaXhlbCBkYXRhCisKKwkJCQl1bnNpZ25lZCBwaXhlbF9jb3VudCA9IDA7CisKKwkJCQlmb3IoaW50IHkgPSAwOyB5IDwgaHJyOyB5KyspIHsJCQorCQkJCQlGSVJHQjE2ICpiaXRzID0gKEZJUkdCMTYqKUZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIGhyciAtIDEgLSB5KTsKKworCQkJCQlmb3IoaW50IHggPSAwOyB4IDwgd3JyOyB4KyspIHsKKwkJCQkJCWNvbnN0IHVuc2lnbmVkIHBpeGVsX3BvcyA9IHBpeGVsX2NvdW50IC8gd3JyICogd3IgKyBwaXhlbF9jb3VudCAlIHdycjsKKworCQkJCQkJaW50IHIgPSBpbWFnZS0+Y29tcHNbMF0uZGF0YVtwaXhlbF9wb3NdOworCQkJCQkJciArPSAoaW1hZ2UtPmNvbXBzWzBdLnNnbmQgPyAxIDw8IChpbWFnZS0+Y29tcHNbMF0ucHJlYyAtIDEpIDogMCk7CisJCQkJCQkKKwkJCQkJCWludCBnID0gaW1hZ2UtPmNvbXBzWzFdLmRhdGFbcGl4ZWxfcG9zXTsKKwkJCQkJCWcgKz0gKGltYWdlLT5jb21wc1sxXS5zZ25kID8gMSA8PCAoaW1hZ2UtPmNvbXBzWzFdLnByZWMgLSAxKSA6IDApOworCQkJCQkJCisJCQkJCQlpbnQgYiA9IGltYWdlLT5jb21wc1syXS5kYXRhW3BpeGVsX3Bvc107CisJCQkJCQliICs9IChpbWFnZS0+Y29tcHNbMl0uc2duZCA/IDEgPDwgKGltYWdlLT5jb21wc1syXS5wcmVjIC0gMSkgOiAwKTsKKworCQkJCQkJYml0c1t4XS5yZWQgICA9IChXT1JEKXI7CisJCQkJCQliaXRzW3hdLmdyZWVuID0gKFdPUkQpZzsKKwkJCQkJCWJpdHNbeF0uYmx1ZSAgPSAoV09SRCliOworCisJCQkJCQlwaXhlbF9jb3VudCsrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZihudW1jb21wcyA9PSA0KSB7CisKKwkJCQkvLyA2NC1iaXQgUkdCQQorCQkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0JCisJCQkJCisJCQkJLy8gbG9hZCBwaXhlbCBkYXRhCisKKwkJCQl1bnNpZ25lZCBwaXhlbF9jb3VudCA9IDA7CisKKwkJCQlmb3IoaW50IHkgPSAwOyB5IDwgaHJyOyB5KyspIHsJCQorCQkJCQlGSVJHQkExNiAqYml0cyA9IChGSVJHQkExNiopRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgaHJyIC0gMSAtIHkpOworCisJCQkJCWZvcihpbnQgeCA9IDA7IHggPCB3cnI7IHgrKykgeworCQkJCQkJY29uc3QgdW5zaWduZWQgcGl4ZWxfcG9zID0gcGl4ZWxfY291bnQgLyB3cnIgKiB3ciArIHBpeGVsX2NvdW50ICUgd3JyOworCisJCQkJCQlpbnQgciA9IGltYWdlLT5jb21wc1swXS5kYXRhW3BpeGVsX3Bvc107CisJCQkJCQlyICs9IChpbWFnZS0+Y29tcHNbMF0uc2duZCA/IDEgPDwgKGltYWdlLT5jb21wc1swXS5wcmVjIC0gMSkgOiAwKTsKKwkJCQkJCQorCQkJCQkJaW50IGcgPSBpbWFnZS0+Y29tcHNbMV0uZGF0YVtwaXhlbF9wb3NdOworCQkJCQkJZyArPSAoaW1hZ2UtPmNvbXBzWzFdLnNnbmQgPyAxIDw8IChpbWFnZS0+Y29tcHNbMV0ucHJlYyAtIDEpIDogMCk7CisJCQkJCQkKKwkJCQkJCWludCBiID0gaW1hZ2UtPmNvbXBzWzJdLmRhdGFbcGl4ZWxfcG9zXTsKKwkJCQkJCWIgKz0gKGltYWdlLT5jb21wc1syXS5zZ25kID8gMSA8PCAoaW1hZ2UtPmNvbXBzWzJdLnByZWMgLSAxKSA6IDApOworCisJCQkJCQlpbnQgYSA9IGltYWdlLT5jb21wc1szXS5kYXRhW3BpeGVsX3Bvc107CisJCQkJCQlhICs9IChpbWFnZS0+Y29tcHNbM10uc2duZCA/IDEgPDwgKGltYWdlLT5jb21wc1szXS5wcmVjIC0gMSkgOiAwKTsKKworCQkJCQkJYml0c1t4XS5yZWQgICA9IChXT1JEKXI7CisJCQkJCQliaXRzW3hdLmdyZWVuID0gKFdPUkQpZzsKKwkJCQkJCWJpdHNbeF0uYmx1ZSAgPSAoV09SRCliOworCQkJCQkJYml0c1t4XS5hbHBoYSA9IChXT1JEKWE7CisKKwkJCQkJCXBpeGVsX2NvdW50Kys7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQlyZXR1cm4gZGliOworCisJfSBjYXRjaChjb25zdCBjaGFyICp0ZXh0KSB7CisJCWlmKGRpYikgRnJlZUltYWdlX1VubG9hZChkaWIpOworCQlGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2MoZm9ybWF0X2lkLCB0ZXh0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCit9CisKKy8qKgorQ29udmVydCBhIEZJQklUTUFQIHRvIGEgT3BlbkpQRUcgaW1hZ2UKK0BwYXJhbSBmb3JtYXRfaWQgUGx1Z2luIElECitAcGFyYW0gZGliIEZyZWVJbWFnZSBpbWFnZQorQHBhcmFtIHBhcmFtZXRlcnMgQ29tcHJlc3Npb24gcGFyYW1ldGVycworQHJldHVybiBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgaW1hZ2UgaWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyBOVUxMIG90aGVyd2lzZQorKi8KK29wal9pbWFnZV90KiBGSUJJVE1BUFRvSjJLSW1hZ2UoaW50IGZvcm1hdF9pZCwgRklCSVRNQVAgKmRpYiwgY29uc3Qgb3BqX2NwYXJhbWV0ZXJzX3QgKnBhcmFtZXRlcnMpIHsKKwlpbnQgcHJlYywgbnVtY29tcHMsIHgsIHksIGluZGV4OworCU9QSl9DT0xPUl9TUEFDRSBjb2xvcl9zcGFjZTsKKwlvcGpfaW1hZ2VfY21wdHBhcm1fdCBjbXB0cGFybVs0XTsJLy8gbWF4aW11bSBvZiA0IGNvbXBvbmVudHMgCisJb3BqX2ltYWdlX3QgKmltYWdlID0gTlVMTDsJCQkvLyBpbWFnZSB0byBlbmNvZGUKKworCXRyeSB7CisJCWludCB3ID0gRnJlZUltYWdlX0dldFdpZHRoKGRpYik7CisJCWludCBoID0gRnJlZUltYWdlX0dldEhlaWdodChkaWIpOworCisJCS8vIGdldCBpbWFnZSBjaGFyYWN0ZXJpc3RpY3MKKwkJRlJFRV9JTUFHRV9UWVBFIGltYWdlX3R5cGUgPSBGcmVlSW1hZ2VfR2V0SW1hZ2VUeXBlKGRpYik7CisKKwkJaWYoaW1hZ2VfdHlwZSA9PSBGSVRfQklUTUFQKSB7CisJCQkvLyBzdGFuZGFyZCBpbWFnZSAuLi4KKwkJCXByZWMgPSA4OworCQkJc3dpdGNoKEZyZWVJbWFnZV9HZXRDb2xvclR5cGUoZGliKSkgeworCQkJCWNhc2UgRklDX01JTklTQkxBQ0s6CisJCQkJCW51bWNvbXBzID0gMTsKKwkJCQkJY29sb3Jfc3BhY2UgPSBPUEpfQ0xSU1BDX0dSQVk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRklDX1JHQjoKKwkJCQkJaWYoRnJlZUltYWdlX0dldEJQUChkaWIpID09IDMyKSB7CisJCQkJCQkvLyAzMi1iaXQgaW1hZ2Ugd2l0aCBhIGZ1bGx5IG9wYXF1ZSBsYXllcgorCQkJCQkJbnVtY29tcHMgPSA0OworCQkJCQkJY29sb3Jfc3BhY2UgPSBPUEpfQ0xSU1BDX1NSR0I7CisJCQkJCX0gZWxzZSB7CisJCQkJCQkvLyAyNC1iaXQgaW1hZ2UKKwkJCQkJCW51bWNvbXBzID0gMzsKKwkJCQkJCWNvbG9yX3NwYWNlID0gT1BKX0NMUlNQQ19TUkdCOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRklDX1JHQkFMUEhBOgorCQkJCQludW1jb21wcyA9IDQ7CisJCQkJCWNvbG9yX3NwYWNlID0gT1BKX0NMUlNQQ19TUkdCOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8vIEhEUiBpbWFnZSAuLi4KKwkJCXByZWMgPSAxNjsKKwkJCXN3aXRjaChpbWFnZV90eXBlKSB7CisJCQkJY2FzZSBGSVRfVUlOVDE2OgorCQkJCQludW1jb21wcyA9IDE7CisJCQkJCWNvbG9yX3NwYWNlID0gT1BKX0NMUlNQQ19HUkFZOworCQkJCQlicmVhazsKKwkJCQljYXNlIEZJVF9SR0IxNjoKKwkJCQkJbnVtY29tcHMgPSAzOworCQkJCQljb2xvcl9zcGFjZSA9IE9QSl9DTFJTUENfU1JHQjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBGSVRfUkdCQTE2OgorCQkJCQludW1jb21wcyA9IDQ7CisJCQkJCWNvbG9yX3NwYWNlID0gT1BKX0NMUlNQQ19TUkdCOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJfQorCisJCS8vIGluaXRpYWxpemUgaW1hZ2UgY29tcG9uZW50cyAKKwkJbWVtc2V0KCZjbXB0cGFybVswXSwgMCwgNCAqIHNpemVvZihvcGpfaW1hZ2VfY21wdHBhcm1fdCkpOworCQlmb3IoaW50IGkgPSAwOyBpIDwgbnVtY29tcHM7IGkrKykgeworCQkJY21wdHBhcm1baV0uZHggPSBwYXJhbWV0ZXJzLT5zdWJzYW1wbGluZ19keDsKKwkJCWNtcHRwYXJtW2ldLmR5ID0gcGFyYW1ldGVycy0+c3Vic2FtcGxpbmdfZHk7CisJCQljbXB0cGFybVtpXS53ID0gdzsKKwkJCWNtcHRwYXJtW2ldLmggPSBoOworCQkJY21wdHBhcm1baV0ucHJlYyA9IHByZWM7CisJCQljbXB0cGFybVtpXS5icHAgPSBwcmVjOworCQkJY21wdHBhcm1baV0uc2duZCA9IDA7CisJCX0KKwkJLy8gY3JlYXRlIHRoZSBpbWFnZSAKKwkJaW1hZ2UgPSBvcGpfaW1hZ2VfY3JlYXRlKG51bWNvbXBzLCAmY21wdHBhcm1bMF0sIGNvbG9yX3NwYWNlKTsKKwkJaWYoIWltYWdlKSB7CisJCQl0aHJvdyBGSV9NU0dfRVJST1JfRElCX01FTU9SWTsKKwkJfQorCisJCS8vIHNldCBpbWFnZSBvZmZzZXQgYW5kIHJlZmVyZW5jZSBncmlkIAorCQlpbWFnZS0+eDAgPSBwYXJhbWV0ZXJzLT5pbWFnZV9vZmZzZXRfeDA7CisJCWltYWdlLT55MCA9IHBhcmFtZXRlcnMtPmltYWdlX29mZnNldF95MDsKKwkJaW1hZ2UtPngxID0gcGFyYW1ldGVycy0+aW1hZ2Vfb2Zmc2V0X3gwICsgKHcgLSAxKSAqCXBhcmFtZXRlcnMtPnN1YnNhbXBsaW5nX2R4ICsgMTsKKwkJaW1hZ2UtPnkxID0gcGFyYW1ldGVycy0+aW1hZ2Vfb2Zmc2V0X3kwICsgKGggLSAxKSAqCXBhcmFtZXRlcnMtPnN1YnNhbXBsaW5nX2R5ICsgMTsKKworCQkvLyBzZXQgaW1hZ2UgZGF0YSAKKwkJaWYocHJlYyA9PSA4KSB7CisJCQlzd2l0Y2gobnVtY29tcHMpIHsKKwkJCQljYXNlIDE6CisJCQkJCWluZGV4ID0gMDsKKwkJCQkJZm9yKHkgPSAwOyB5IDwgaDsgeSsrKSB7CisJCQkJCQlCWVRFICpiaXRzID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgaCAtIDEgLSB5KTsKKwkJCQkJCWZvcih4ID0gMDsgeCA8IHc7IHgrKykgeworCQkJCQkJCWltYWdlLT5jb21wc1swXS5kYXRhW2luZGV4XSA9IGJpdHNbeF07CisJCQkJCQkJaW5kZXgrKzsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIDM6CisJCQkJCWluZGV4ID0gMDsKKwkJCQkJZm9yKHkgPSAwOyB5IDwgaDsgeSsrKSB7CisJCQkJCQlCWVRFICpiaXRzID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgaCAtIDEgLSB5KTsKKwkJCQkJCWZvcih4ID0gMDsgeCA8IHc7IHgrKykgeworCQkJCQkJCWltYWdlLT5jb21wc1swXS5kYXRhW2luZGV4XSA9IGJpdHNbRklfUkdCQV9SRURdOworCQkJCQkJCWltYWdlLT5jb21wc1sxXS5kYXRhW2luZGV4XSA9IGJpdHNbRklfUkdCQV9HUkVFTl07CisJCQkJCQkJaW1hZ2UtPmNvbXBzWzJdLmRhdGFbaW5kZXhdID0gYml0c1tGSV9SR0JBX0JMVUVdOworCQkJCQkJCWJpdHMgKz0gMzsKKwkJCQkJCQlpbmRleCsrOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2UgNDoKKwkJCQkJaW5kZXggPSAwOworCQkJCQlmb3IoeSA9IDA7IHkgPCBoOyB5KyspIHsKKwkJCQkJCUJZVEUgKmJpdHMgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCBoIC0gMSAtIHkpOworCQkJCQkJZm9yKHggPSAwOyB4IDwgdzsgeCsrKSB7CisJCQkJCQkJaW1hZ2UtPmNvbXBzWzBdLmRhdGFbaW5kZXhdID0gYml0c1tGSV9SR0JBX1JFRF07CisJCQkJCQkJaW1hZ2UtPmNvbXBzWzFdLmRhdGFbaW5kZXhdID0gYml0c1tGSV9SR0JBX0dSRUVOXTsKKwkJCQkJCQlpbWFnZS0+Y29tcHNbMl0uZGF0YVtpbmRleF0gPSBiaXRzW0ZJX1JHQkFfQkxVRV07CisJCQkJCQkJaW1hZ2UtPmNvbXBzWzNdLmRhdGFbaW5kZXhdID0gYml0c1tGSV9SR0JBX0FMUEhBXTsKKwkJCQkJCQliaXRzICs9IDQ7CisJCQkJCQkJaW5kZXgrKzsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCQllbHNlIGlmKHByZWMgPT0gMTYpIHsKKwkJCXN3aXRjaChudW1jb21wcykgeworCQkJCWNhc2UgMToKKwkJCQkJaW5kZXggPSAwOworCQkJCQlmb3IoeSA9IDA7IHkgPCBoOyB5KyspIHsKKwkJCQkJCVdPUkQgKmJpdHMgPSAoV09SRCopRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgaCAtIDEgLSB5KTsKKwkJCQkJCWZvcih4ID0gMDsgeCA8IHc7IHgrKykgeworCQkJCQkJCWltYWdlLT5jb21wc1swXS5kYXRhW2luZGV4XSA9IGJpdHNbeF07CisJCQkJCQkJaW5kZXgrKzsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIDM6CisJCQkJCWluZGV4ID0gMDsKKwkJCQkJZm9yKHkgPSAwOyB5IDwgaDsgeSsrKSB7CisJCQkJCQlGSVJHQjE2ICpiaXRzID0gKEZJUkdCMTYqKUZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIGggLSAxIC0geSk7CisJCQkJCQlmb3IoeCA9IDA7IHggPCB3OyB4KyspIHsKKwkJCQkJCQlpbWFnZS0+Y29tcHNbMF0uZGF0YVtpbmRleF0gPSBiaXRzW3hdLnJlZDsKKwkJCQkJCQlpbWFnZS0+Y29tcHNbMV0uZGF0YVtpbmRleF0gPSBiaXRzW3hdLmdyZWVuOworCQkJCQkJCWltYWdlLT5jb21wc1syXS5kYXRhW2luZGV4XSA9IGJpdHNbeF0uYmx1ZTsKKwkJCQkJCQlpbmRleCsrOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2UgNDoKKwkJCQkJaW5kZXggPSAwOworCQkJCQlmb3IoeSA9IDA7IHkgPCBoOyB5KyspIHsKKwkJCQkJCUZJUkdCQTE2ICpiaXRzID0gKEZJUkdCQTE2KilGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCBoIC0gMSAtIHkpOworCQkJCQkJZm9yKHggPSAwOyB4IDwgdzsgeCsrKSB7CisJCQkJCQkJaW1hZ2UtPmNvbXBzWzBdLmRhdGFbaW5kZXhdID0gYml0c1t4XS5yZWQ7CisJCQkJCQkJaW1hZ2UtPmNvbXBzWzFdLmRhdGFbaW5kZXhdID0gYml0c1t4XS5ncmVlbjsKKwkJCQkJCQlpbWFnZS0+Y29tcHNbMl0uZGF0YVtpbmRleF0gPSBiaXRzW3hdLmJsdWU7CisJCQkJCQkJaW1hZ2UtPmNvbXBzWzNdLmRhdGFbaW5kZXhdID0gYml0c1t4XS5hbHBoYTsKKwkJCQkJCQlpbmRleCsrOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJcmV0dXJuIGltYWdlOworCisJfSBjYXRjaCAoY29uc3QgY2hhciAqdGV4dCkgeworCQlpZihpbWFnZSkgb3BqX2ltYWdlX2Rlc3Ryb3koaW1hZ2UpOworCQlGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2MoZm9ybWF0X2lkLCB0ZXh0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorfQpkaWZmIC0tZ2l0IGEvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9KMktIZWxwZXIuaCBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvSjJLSGVscGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgxMjFmMQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvSjJLSGVscGVyLmgKQEAgLTAsMCArMSwzNiBAQAorI2lmbmRlZiBKMktfSEVMUEVSX0gKKyNkZWZpbmUgSjJLX0hFTFBFUl9ICisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEhlbHBlciBmdW5jdGlvbnMgKHNlZSBKMktIZWxwZXIuY3BwKQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvKiogCitGcmVlSW1hZ2VJTyB3cmFwcGVyCisqLwordHlwZWRlZiBzdHJ1Y3QgdGFnSjJLRklPX3QgeworCUZyZWVJbWFnZUlPICppbzsJCS8vISBGcmVlSW1hZ2UgSU8KKyAgICBmaV9oYW5kbGUgaGFuZGxlOwkJLy8hIEZyZWVJbWFnZSBoYW5kbGUKKwlvcGpfc3RyZWFtX3QgKnN0cmVhbTsJLy8hIE9wZW5KUEVHIHN0cmVhbQorfSBKMktGSU9fdDsKKworLyoqCitTdHJlYW0gY29uc3RydWN0b3IKKyovCitKMktGSU9fdCogb3BqX2ZyZWVpbWFnZV9zdHJlYW1fY3JlYXRlKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSwgQk9PTCBiUmVhZCk7CisKKy8qKgorU3RyZWFtIGRlc3RydWN0b3IKKyovCit2b2lkIG9wal9mcmVlaW1hZ2Vfc3RyZWFtX2Rlc3Ryb3koSjJLRklPX3QqIGZpbyk7CisKKy8qKgorQ29udmVyc2lvbiBvcGpfaW1hZ2VfdCA9PiBGSUJJVE1BUAorKi8KK0ZJQklUTUFQKiBKMktJbWFnZVRvRklCSVRNQVAoaW50IGZvcm1hdF9pZCwgY29uc3Qgb3BqX2ltYWdlX3QgKmltYWdlLCBCT09MIGhlYWRlcl9vbmx5KTsKKy8qKgorQ29udmVyc2lvbiBGSUJJVE1BUCA9PiBvcGpfaW1hZ2VfdAorKi8KK29wal9pbWFnZV90KiBGSUJJVE1BUFRvSjJLSW1hZ2UoaW50IGZvcm1hdF9pZCwgRklCSVRNQVAgKmRpYiwgY29uc3Qgb3BqX2NwYXJhbWV0ZXJzX3QgKnBhcmFtZXRlcnMpOworCisjZW5kaWYgLy8gSjJLX0hFTFBFUl9IClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9MRlBRdWFudGl6ZXIuY3BwIGIvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9MRlBRdWFudGl6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNTkyYzMKLS0tIC9kZXYvbnVsbAorKysgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL0xGUFF1YW50aXplci5jcHAKQEAgLTAsMCArMSwyMDggQEAKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIExGUFF1YW50aXplciBjbGFzcyBpbXBsZW1lbnRhdGlvbgorLy8KKy8vIERlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gYnkKKy8vIC0gQ2Fyc3RlbiBLbGVpbiAoY2tsZWluMDVAdXNlcnMuc291cmNlZm9yZ2UubmV0KQorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZyZWVJbWFnZSAzCisvLworLy8gQ09WRVJFRCBDT0RFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZCisvLyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUworLy8gVEhBVCBUSEUgQ09WRVJFRCBDT0RFIElTIEZSRUUgT0YgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisvLyBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRAorLy8gQ09ERSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVAorLy8gVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GIEFOWSBORUNFU1NBUlkKKy8vIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwKKy8vIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIKKy8vIFRISVMgRElTQ0xBSU1FUi4KKy8vCisvLyBVc2UgYXQgeW91ciBvd24gcmlzayEKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2luY2x1ZGUgIlF1YW50aXplcnMuaCIKKyNpbmNsdWRlICJGcmVlSW1hZ2UuaCIKKyNpbmNsdWRlICJVdGlsaXRpZXMuaCIKKworTEZQUXVhbnRpemVyOjpMRlBRdWFudGl6ZXIodW5zaWduZWQgUGFsZXR0ZVNpemUpIDoKKwkJbV9zaXplKDApLCBtX2xpbWl0KFBhbGV0dGVTaXplKSwgbV9pbmRleCgwKSB7CisJbV9tYXAgPSBuZXcgTWFwRW50cnlbTUFQX1NJWkVdOworCW1lbXNldChtX21hcCwgMHhGRiwgTUFQX1NJWkUgKiBzaXplb2YoTWFwRW50cnkpKTsKK30KKworTEZQUXVhbnRpemVyOjp+TEZQUXVhbnRpemVyKCkgeworICAgIGRlbGV0ZVtdIG1fbWFwOworfQorCitGSUJJVE1BUCogTEZQUXVhbnRpemVyOjpRdWFudGl6ZShGSUJJVE1BUCAqZGliLCBpbnQgUmVzZXJ2ZVNpemUsIFJHQlFVQUQgKlJlc2VydmVQYWxldHRlKSB7CisKKwlpZiAoUmVzZXJ2ZVNpemUgPiAwICYmIFJlc2VydmVQYWxldHRlICE9IE5VTEwpIHsKKwkJQWRkUmVzZXJ2ZVBhbGV0dGUoUmVzZXJ2ZVBhbGV0dGUsIFJlc2VydmVTaXplKTsKKwl9CisKKwljb25zdCB1bnNpZ25lZCB3aWR0aCA9IEZyZWVJbWFnZV9HZXRXaWR0aChkaWIpOworCWNvbnN0IHVuc2lnbmVkIGhlaWdodCA9IEZyZWVJbWFnZV9HZXRIZWlnaHQoZGliKTsKKworCUZJQklUTUFQICpkaWI4ID0gRnJlZUltYWdlX0FsbG9jYXRlKHdpZHRoLCBoZWlnaHQsIDgpOworCWlmIChkaWI4ID09IE5VTEwpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJY29uc3QgdW5zaWduZWQgc3JjX3BpdGNoID0gRnJlZUltYWdlX0dldFBpdGNoKGRpYik7CisJY29uc3QgdW5zaWduZWQgZHN0X3BpdGNoID0gRnJlZUltYWdlX0dldFBpdGNoKGRpYjgpOworCisJY29uc3QgQllURSAqIGNvbnN0IHNyY19iaXRzID0gRnJlZUltYWdlX0dldEJpdHMoZGliKTsKKwlCWVRFICogY29uc3QgZHN0X2JpdHMgPSBGcmVlSW1hZ2VfR2V0Qml0cyhkaWI4KTsKKworCXVuc2lnbmVkIGxhc3RfY29sb3IgPSAtMTsKKwlpbnQgbGFzdF9pbmRleCA9IDA7CisKKwlpZiAoRnJlZUltYWdlX0dldEJQUChkaWIpID09IDI0KSB7CisKKwkJLy8gR2V0dGluZyB0aGUgc291cmNlIHBpeGVsIGFzIGFuIHVuc2lnbmVkIGludCBpcyBtdWNoIGZhc3RlciB0aGFuCisJCS8vIHdvcmtpbmcgd2l0aCBGSV9SR0JBX3h4eCBhbmQgc2hpZnRpbmcuIEhvd2V2ZXIsIHRoaXMgbWF5IGZhaWwKKwkJLy8gZm9yIHRoZSB2ZXJ5IGxhc3QgcGl4ZWwsIHNpbmNlIGl0cyByZ2JSZXNlcnZlZCBtZW1iZXIgKGFscGhhKQorCQkvLyBtYXkgYWN0dWFsbHkgcG9pbnQgdG8gYW4gYWRkcmVzcyBiZXlvbmQgdGhlIGJpdG1hcCdzIG1lbW9yeS4gU28sCisJCS8vIHdlIGRvIG5vdCBwcm9jZXNzIHRoZSBsYXN0IHNjYW5saW5lIGluIHRoZSBmaXJzdCBsb29wLgorCisJCS8vIFByb2Nlc3MgYWxsIGJ1dCB0aGUgbGFzdCBzY2FubGluZS4KKwkJZm9yICh1bnNpZ25lZCB5ID0gMDsgeSA8IGhlaWdodCAtIDE7ICsreSkgeworCQkJQllURSAqZHN0X2xpbmUgPSBkc3RfYml0cyArIHkgKiBkc3RfcGl0Y2g7CisJCQljb25zdCBCWVRFICpzcmNfbGluZSA9IHNyY19iaXRzICsgeSAqIHNyY19waXRjaDsKKwkJCWZvciAodW5zaWduZWQgeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7CisJCQkJY29uc3QgdW5zaWduZWQgY29sb3IgPSAqKCh1bnNpZ25lZCAqKSBzcmNfbGluZSkgJiAweDAwRkZGRkZGOworCQkJCWlmIChjb2xvciAhPSBsYXN0X2NvbG9yKSB7CisJCQkJCWxhc3RfY29sb3IgPSBjb2xvcjsKKwkJCQkJbGFzdF9pbmRleCA9IEdldEluZGV4Rm9yQ29sb3IoY29sb3IpOworCQkJCQlpZiAobGFzdF9pbmRleCA9PSAtMSkgeworCQkJCQkJRnJlZUltYWdlX1VubG9hZChkaWI4KTsKKwkJCQkJCXJldHVybiBOVUxMOworCQkJCQl9CisJCQkJfQorCQkJCWRzdF9saW5lW3hdID0gbGFzdF9pbmRleDsKKwkJCQlzcmNfbGluZSArPSAzOworCQkJfQorCQl9CisKKwkJLy8gUHJvY2VzcyBhbGwgYnV0IHRoZSBsYXN0IHBpeGVsIG9mIHRoZSBsYXN0IHNjYW5saW5lLgorCQlCWVRFICpkc3RfbGluZSA9IGRzdF9iaXRzICsgKGhlaWdodCAtIDEpICogZHN0X3BpdGNoOworCQljb25zdCBCWVRFICpzcmNfbGluZSA9IHNyY19iaXRzICsgKGhlaWdodCAtIDEpICogc3JjX3BpdGNoOworCQlmb3IgKHVuc2lnbmVkIHggPSAwOyB4IDwgd2lkdGggLSAxOyArK3gpIHsKKwkJCWNvbnN0IHVuc2lnbmVkIGNvbG9yID0gKigodW5zaWduZWQgKikgc3JjX2xpbmUpICYgMHgwMEZGRkZGRjsKKwkJCWlmIChjb2xvciAhPSBsYXN0X2NvbG9yKSB7CisJCQkJbGFzdF9jb2xvciA9IGNvbG9yOworCQkJCWxhc3RfaW5kZXggPSBHZXRJbmRleEZvckNvbG9yKGNvbG9yKTsKKwkJCQlpZiAobGFzdF9pbmRleCA9PSAtMSkgeworCQkJCQlGcmVlSW1hZ2VfVW5sb2FkKGRpYjgpOworCQkJCQlyZXR1cm4gTlVMTDsKKwkJCQl9CisJCQl9CisJCQlkc3RfbGluZVt4XSA9IGxhc3RfaW5kZXg7CisJCQlzcmNfbGluZSArPSAzOworCQl9CisKKwkJLy8gUHJvY2VzcyB0aGUgbGFzdCBwaXhlbCAoc3JjX2xpbmUgc2hvdWxkIGFscmVhZHkgcG9pbnQgdG8gaXQpLgorCQljb25zdCB1bnNpZ25lZCBjb2xvciA9IDAgfCBzcmNfbGluZVtGSV9SR0JBX0JMVUVdIDw8IEZJX1JHQkFfQkxVRV9TSElGVAorCQkJCXwgc3JjX2xpbmVbRklfUkdCQV9HUkVFTl0gPDwgRklfUkdCQV9HUkVFTl9TSElGVAorCQkJCXwgc3JjX2xpbmVbRklfUkdCQV9SRURdIDw8IEZJX1JHQkFfUkVEX1NISUZUOworCQlpZiAoY29sb3IgIT0gbGFzdF9jb2xvcikgeworCQkJbGFzdF9jb2xvciA9IGNvbG9yOworCQkJbGFzdF9pbmRleCA9IEdldEluZGV4Rm9yQ29sb3IoY29sb3IpOworCQkJaWYgKGxhc3RfaW5kZXggPT0gLTEpIHsKKwkJCQlGcmVlSW1hZ2VfVW5sb2FkKGRpYjgpOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQl9CisJCWRzdF9saW5lW3dpZHRoIC0gMV0gPSBsYXN0X2luZGV4OworCisJfSBlbHNlIHsKKwkJZm9yICh1bnNpZ25lZCB5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CisJCQlCWVRFICpkc3RfbGluZSA9IGRzdF9iaXRzICsgeSAqIGRzdF9waXRjaDsKKwkJCWNvbnN0IEJZVEUgKnNyY19saW5lID0gc3JjX2JpdHMgKyB5ICogc3JjX3BpdGNoOworCQkJZm9yICh1bnNpZ25lZCB4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKKwkJCQljb25zdCB1bnNpZ25lZCBjb2xvciA9ICooKHVuc2lnbmVkICopIHNyY19saW5lKSAmIDB4MDBGRkZGRkY7CisJCQkJaWYgKGNvbG9yICE9IGxhc3RfY29sb3IpIHsKKwkJCQkJbGFzdF9jb2xvciA9IGNvbG9yOworCQkJCQlsYXN0X2luZGV4ID0gR2V0SW5kZXhGb3JDb2xvcihjb2xvcik7CisJCQkJCWlmIChsYXN0X2luZGV4ID09IC0xKSB7CisJCQkJCQlGcmVlSW1hZ2VfVW5sb2FkKGRpYjgpOworCQkJCQkJcmV0dXJuIE5VTEw7CisJCQkJCX0KKwkJCQl9CisJCQkJZHN0X2xpbmVbeF0gPSBsYXN0X2luZGV4OworCQkJCXNyY19saW5lICs9IDQ7CisJCQl9CisJCX0KKwl9CisKKwlXcml0ZVBhbGV0dGUoRnJlZUltYWdlX0dldFBhbGV0dGUoZGliOCkpOworCXJldHVybiBkaWI4OworfQorCisvKioKKyAqIFJldHVybnMgdGhlIHBhbGV0dGUgaW5kZXggb2YgdGhlIHNwZWNpZmllZCBjb2xvci4gVHJpZXMgdG8gcHV0IHRoZQorICogY29sb3IgaW50byB0aGUgbWFwLCBpZiBpdCdzIG5vdCBhbHJlYWR5IHByZXNlbnQgaW4gdGhlIG1hcC4gSW4gdGhhdAorICogY2FzZSwgYSBuZXcgaW5kZXggaXMgdXNlZCBmb3IgdGhlIGNvbG9yLiBSZXR1cm5zIC0xLCBpZiBhZGRpbmcgdGhlCisgKiBjb2xvciB3b3VsZCBleGNlZWQgdGhlIGRlc2lyZWQgbWF4aW11bSBudW1iZXIgb2YgY29sb3JzIGluIHRoZQorICogcGFsZXR0ZS4KKyAqIEBwYXJhbSBjb2xvciB0aGUgY29sb3IgdG8gZ2V0IHRoZSBpbmRleCBmcm9tCisgKiBAcmV0dXJuIHRoZSBwYWxldHRlIGluZGV4IG9mIHRoZSBzcGVjaWZpZWQgY29sb3Igb3IgLTEsIGlmIHRoZXJlCisgKiBpcyBubyBzcGFjZSBsZWZ0IGluIHRoZSBwYWxldHRlCisgKi8KK2lubGluZSBpbnQgTEZQUXVhbnRpemVyOjpHZXRJbmRleEZvckNvbG9yKHVuc2lnbmVkIGNvbG9yKSB7CisJdW5zaWduZWQgYnVja2V0ID0gaGFzaChjb2xvcikgJiAoTUFQX1NJWkUgLSAxKTsKKwl3aGlsZSAobV9tYXBbYnVja2V0XS5jb2xvciAhPSBjb2xvcikgeworCQlpZiAobV9tYXBbYnVja2V0XS5jb2xvciA9PSBFTVBUWV9CVUNLRVQpIHsKKwkJCWlmIChtX3NpemUgPT0gbV9saW1pdCkgeworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCW1fbWFwW2J1Y2tldF0uY29sb3IgPSBjb2xvcjsKKwkJCW1fbWFwW2J1Y2tldF0uaW5kZXggPSBtX2luZGV4Kys7CisJCQkrK21fc2l6ZTsKKwkJCWJyZWFrOworCQl9CisJCWJ1Y2tldCA9IChidWNrZXQgKyAxKSAlIE1BUF9TSVpFOworCX0KKwlyZXR1cm4gbV9tYXBbYnVja2V0XS5pbmRleDsKK30KKworLyoqCisgKiBBZGRzIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGVudHJpZXMgb2YgdGhlIHNwZWNpZmllZCByZXNlcnZlCisgKiBwYWxldHRlIHRvIHRoZSBuZXdseSBjcmVhdGVkIHBhbGV0dGUuCisgKiBAcGFyYW0gKnBhbGV0dGUgYSBwb2ludGVyIHRvIHRoZSByZXNlcnZlIHBhbGV0dGUgdG8gY29weSBmcm9tCisgKiBAcGFyYW0gc2l6ZSB0aGUgbnVtYmVyIG9mIGVudHJpZXMgdG8gY29weQorICovCit2b2lkIExGUFF1YW50aXplcjo6QWRkUmVzZXJ2ZVBhbGV0dGUoY29uc3Qgdm9pZCAqcGFsZXR0ZSwgdW5zaWduZWQgc2l6ZSkgeworCWlmIChzaXplID4gTUFYX1NJWkUpIHsKKwkJc2l6ZSA9IE1BWF9TSVpFOworCX0KKwl1bnNpZ25lZCAqcHBhbCA9ICh1bnNpZ25lZCAqKSBwYWxldHRlOworCWNvbnN0IHVuc2lnbmVkIG9mZnNldCA9IG1fbGltaXQgLSBzaXplOworCWZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKwkJY29uc3QgdW5zaWduZWQgY29sb3IgPSAqcHBhbCsrOworCQljb25zdCB1bnNpZ25lZCBpbmRleCA9IGkgKyBvZmZzZXQ7CisJCXVuc2lnbmVkIGJ1Y2tldCA9IGhhc2goY29sb3IpICYgKE1BUF9TSVpFIC0gMSk7CisJCXdoaWxlKChtX21hcFtidWNrZXRdLmNvbG9yICE9IEVNUFRZX0JVQ0tFVCkgJiYgKG1fbWFwW2J1Y2tldF0uY29sb3IgIT0gY29sb3IpKSB7CisJCQlidWNrZXQgPSAoYnVja2V0ICsgMSkgJSBNQVBfU0laRTsKKwkJfQorCQlpZihtX21hcFtidWNrZXRdLmNvbG9yICE9IGNvbG9yKSB7CisJCQltX21hcFtidWNrZXRdLmNvbG9yID0gY29sb3I7CisJCQltX21hcFtidWNrZXRdLmluZGV4ID0gaW5kZXg7CisJCX0KKwl9CisJbV9zaXplICs9IHNpemU7Cit9CisKKy8qKgorICogQ29waWVzIHRoZSBuZXdseSBjcmVhdGVkIHBhbGV0dGUgaW50byB0aGUgc3BlY2lmaWVkIGRlc3RpbmF0aW9uCisgKiBwYWxldHRlLiBBbHRob3VnaCB1bnVzZWQgcGFsZXR0ZSBlbnRyaWVzIGFyZSBub3Qgb3ZlcndyaXR0ZW4gaW4KKyAqIHRoZSBkZXN0aW5hdGlvbiBwYWxldHRlLCBpdCBpcyBhc3N1bWVkIHRvIGhhdmUgc3BhY2UgZm9yIGF0CisgKiBsZWFzdCAyNTYgZW50cmllcy4KKyAqIEBwYXJhbSBwYWxldHRlIGEgcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gcGFsZXR0ZQorICovCit2b2lkIExGUFF1YW50aXplcjo6V3JpdGVQYWxldHRlKHZvaWQgKnBhbGV0dGUpIHsKKwlmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgTUFQX1NJWkU7ICsraSkgeworCQlpZiAobV9tYXBbaV0uY29sb3IgIT0gRU1QVFlfQlVDS0VUKSB7CisJCQkoKHVuc2lnbmVkICopIHBhbGV0dGUpW21fbWFwW2ldLmluZGV4XSA9IG1fbWFwW2ldLmNvbG9yOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9NTkdIZWxwZXIuY3BwIGIvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9NTkdIZWxwZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMzY2NGMKLS0tIC9kZXYvbnVsbAorKysgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL01OR0hlbHBlci5jcHAKQEAgLTAsMCArMSwxMzIwIEBACisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBNTkcgLyBKTkcgaGVscGVycworLy8KKy8vIERlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gYnkKKy8vIC0gSGVydukgRHJvbG9uIChkcm9sb25AaW5mb25pZS5mcikKKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBGcmVlSW1hZ2UgMworLy8KKy8vIENPVkVSRUQgQ09ERSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWQorLy8gT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMKKy8vIFRIQVQgVEhFIENPVkVSRUQgQ09ERSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLy8gT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQKKy8vIENPREUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkgQ09WRVJFRCBDT0RFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QKKy8vIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZCisvLyBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMCisvLyBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GIEFOWSBDT1ZFUkVEIENPREUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSCisvLyBUSElTIERJU0NMQUlNRVIuCisvLworLy8gVXNlIGF0IHlvdXIgb3duIHJpc2shCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpbmNsdWRlICJGcmVlSW1hZ2UuaCIKKyNpbmNsdWRlICJVdGlsaXRpZXMuaCIKKworLyoqCitSZWZlcmVuY2VzCitodHRwOi8vd3d3LmxpYnBuZy5vcmcvcHViL21uZy9zcGVjL2puZy5odG1sCitodHRwOi8vd3d3LnczLm9yZy9UUi9QTkcvCitodHRwOi8vbGlicG5nLm9yZy9wdWIvbW5nL3NwZWMvCisqLworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIE1OR19JTkNMVURFX0pORworCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisjZGVmaW5lIE1OR19DT0xPUlRZUEVfSlBFR0dSQVkgICAgICAgICAgIDggICAgICAgLyogSkhEUiAqLworI2RlZmluZSBNTkdfQ09MT1JUWVBFX0pQRUdDT0xPUiAgICAgICAgIDEwCisjZGVmaW5lIE1OR19DT0xPUlRZUEVfSlBFR0dSQVlBICAgICAgICAgMTIKKyNkZWZpbmUgTU5HX0NPTE9SVFlQRV9KUEVHQ09MT1JBICAgICAgICAxNAorCisjZGVmaW5lIE1OR19CSVRERVBUSF9KUEVHOCAgICAgICAgICAgICAgIDggICAgICAgLyogSkhEUiAqLworI2RlZmluZSBNTkdfQklUREVQVEhfSlBFRzEyICAgICAgICAgICAgIDEyCisjZGVmaW5lIE1OR19CSVRERVBUSF9KUEVHOEFORDEyICAgICAgICAgMjAKKworI2RlZmluZSBNTkdfQ09NUFJFU1NJT05fQkFTRUxJTkVKUEVHICAgICA4ICAgICAgIC8qIEpIRFIgKi8KKworI2RlZmluZSBNTkdfSU5URVJMQUNFX1NFUVVFTlRJQUwgICAgICAgICAwICAgICAgIC8qIEpIRFIgKi8KKyNkZWZpbmUgTU5HX0lOVEVSTEFDRV9QUk9HUkVTU0lWRSAgICAgICAgOAorI2VuZGlmIC8qIE1OR19JTkNMVURFX0pORyAqLworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIEpOR19TVVBQT1JURUQKKworLyoqIFNpemUgb2YgYSBKREFUIGNodW5rIG9uIHdyaXRpbmcgKi8KK2NvbnN0IERXT1JEIEpQRUdfQ0hVTktfU0laRQk9IDgxOTI7CisKKy8qKiBQTkcgc2lnbmF0dXJlICovCitzdGF0aWMgY29uc3QgQllURSBnX3BuZ19zaWduYXR1cmVbOF0gPSB7IDEzNywgODAsIDc4LCA3MSwgMTMsIDEwLCAyNiwgMTAgfTsKKy8qKiBKTkcgc2lnbmF0dXJlICovCitzdGF0aWMgY29uc3QgQllURSBnX2puZ19zaWduYXR1cmVbOF0gPSB7IDEzOSwgNzQsIDc4LCA3MSwgMTMsIDEwLCAyNiwgMTAgfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoqIENodW5rIHR5cGUgY29udmVydGVkIHRvIGVudW0gKi8KK2VudW0gZUNodW5ja1R5cGUgeworCVVOS05PV05fQ0hVTkNLLAorCU1IRFIsCisJQkFDSywKKwlCQVNJLAorCUNMSVAsCisJQ0xPTiwKKwlERUZJLAorCURIRFIsCisJRElTQywKKwlFTkRMLAorCUZSQU0sCisJSUVORCwKKwlJSERSLAorCUpIRFIsCisJTE9PUCwKKwlNQUdOLAorCU1FTkQsCisJTU9WRSwKKwlQQVNULAorCVBMVEUsCisJU0FWRSwKKwlTRUVLLAorCVNIT1csCisJVEVSTSwKKwliS0dELAorCWNIUk0sCisJZ0FNQSwKKwlpQ0NQLAorCW5FRUQsCisJcEhZZywKKwl2cEFnLAorCXBIWXMsCisJc0JJVCwKKwlzUkdCLAorCXRSTlMsCisJSURBVCwKKwlKREFULAorCUpEQUEsCisJSmRBQSwKKwlKU0VQLAorCW9GRnMsCisJaElTVCwKKwlpVFh0LAorCXNQTFQsCisJc1RFUiwKKwl0RVh0LAorCXRJTUUsCisJelRYdAorfTsKKworLyoqCitIZWxwZXIgZm9yIG1hcDxrZXksIHZhbHVlPiB3aGVyZSB2YWx1ZSBpcyBhIHBvaW50ZXIgdG8gYSBzdHJpbmcuIAorVXNlZCB0byBzdG9yZSB0RVh0IG1ldGFkYXRhLiAKKyovCit0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gdEVYdE1BUDsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoKKyAgQ29uc3RhbnQgc3RyaW5ncyBmb3Iga25vd24gY2h1bmsgdHlwZXMuICBJZiB5b3UgbmVlZCB0byBhZGQgYSBjaHVuaywKKyAgYWRkIGEgc3RyaW5nIGhvbGRpbmcgdGhlIG5hbWUgaGVyZS4gICBUbyBtYWtlIHRoZSBjb2RlIG1vcmUKKyAgcG9ydGFibGUsIHdlIHVzZSBBU0NJSSBudW1iZXJzIGxpa2UgdGhpcywgbm90IGNoYXJhY3RlcnMuCisqLworCitzdGF0aWMgQllURSBtbmdfTUhEUls1XT17IDc3LCAgNzIsICA2OCwgIDgyLCAoQllURSkgJ1wwJ307CitzdGF0aWMgQllURSBtbmdfQkFDS1s1XT17IDY2LCAgNjUsICA2NywgIDc1LCAoQllURSkgJ1wwJ307CitzdGF0aWMgQllURSBtbmdfQkFTSVs1XT17IDY2LCAgNjUsICA4MywgIDczLCAoQllURSkgJ1wwJ307CitzdGF0aWMgQllURSBtbmdfQ0xJUFs1XT17IDY3LCAgNzYsICA3MywgIDgwLCAoQllURSkgJ1wwJ307CitzdGF0aWMgQllURSBtbmdfQ0xPTls1XT17IDY3LCAgNzYsICA3OSwgIDc4LCAoQllURSkgJ1wwJ307CitzdGF0aWMgQllURSBtbmdfREVGSVs1XT17IDY4LCAgNjksICA3MCwgIDczLCAoQllURSkgJ1wwJ307CitzdGF0aWMgQllURSBtbmdfREhEUls1XT17IDY4LCAgNzIsICA2OCwgIDgyLCAoQllURSkgJ1wwJ307CitzdGF0aWMgQllURSBtbmdfRElTQ1s1XT17IDY4LCAgNzMsICA4MywgIDY3LCAoQllURSkgJ1wwJ307CitzdGF0aWMgQllURSBtbmdfRU5ETFs1XT17IDY5LCAgNzgsICA2OCwgIDc2LCAoQllURSkgJ1wwJ307CitzdGF0aWMgQllURSBtbmdfRlJBTVs1XT17IDcwLCAgODIsICA2NSwgIDc3LCAoQllURSkgJ1wwJ307CitzdGF0aWMgQllURSBtbmdfSUVORFs1XT17IDczLCAgNjksICA3OCwgIDY4LCAoQllURSkgJ1wwJ307CitzdGF0aWMgQllURSBtbmdfSUhEUls1XT17IDczLCAgNzIsICA2OCwgIDgyLCAoQllURSkgJ1wwJ307CitzdGF0aWMgQllURSBtbmdfSkhEUls1XT17IDc0LCAgNzIsICA2OCwgIDgyLCAoQllURSkgJ1wwJ307CitzdGF0aWMgQllURSBtbmdfTE9PUFs1XT17IDc2LCAgNzksICA3OSwgIDgwLCAoQllURSkgJ1wwJ307CitzdGF0aWMgQllURSBtbmdfTUFHTls1XT17IDc3LCAgNjUsICA3MSwgIDc4LCAoQllURSkgJ1wwJ307CitzdGF0aWMgQllURSBtbmdfTUVORFs1XT17IDc3LCAgNjksICA3OCwgIDY4LCAoQllURSkgJ1wwJ307CitzdGF0aWMgQllURSBtbmdfTU9WRVs1XT17IDc3LCAgNzksICA4NiwgIDY5LCAoQllURSkgJ1wwJ307CitzdGF0aWMgQllURSBtbmdfUEFTVFs1XT17IDgwLCAgNjUsICA4MywgIDg0LCAoQllURSkgJ1wwJ307CitzdGF0aWMgQllURSBtbmdfUExURVs1XT17IDgwLCAgNzYsICA4NCwgIDY5LCAoQllURSkgJ1wwJ307CitzdGF0aWMgQllURSBtbmdfU0FWRVs1XT17IDgzLCAgNjUsICA4NiwgIDY5LCAoQllURSkgJ1wwJ307CitzdGF0aWMgQllURSBtbmdfU0VFS1s1XT17IDgzLCAgNjksICA2OSwgIDc1LCAoQllURSkgJ1wwJ307CitzdGF0aWMgQllURSBtbmdfU0hPV1s1XT17IDgzLCAgNzIsICA3OSwgIDg3LCAoQllURSkgJ1wwJ307CitzdGF0aWMgQllURSBtbmdfVEVSTVs1XT17IDg0LCAgNjksICA4MiwgIDc3LCAoQllURSkgJ1wwJ307CitzdGF0aWMgQllURSBtbmdfYktHRFs1XT17IDk4LCAgNzUsICA3MSwgIDY4LCAoQllURSkgJ1wwJ307CitzdGF0aWMgQllURSBtbmdfY0hSTVs1XT17IDk5LCAgNzIsICA4MiwgIDc3LCAoQllURSkgJ1wwJ307CitzdGF0aWMgQllURSBtbmdfZ0FNQVs1XT17MTAzLCAgNjUsICA3NywgIDY1LCAoQllURSkgJ1wwJ307CitzdGF0aWMgQllURSBtbmdfaUNDUFs1XT17MTA1LCAgNjcsICA2NywgIDgwLCAoQllURSkgJ1wwJ307CitzdGF0aWMgQllURSBtbmdfbkVFRFs1XT17MTEwLCAgNjksICA2OSwgIDY4LCAoQllURSkgJ1wwJ307CitzdGF0aWMgQllURSBtbmdfcEhZZ1s1XT17MTEyLCAgNzIsICA4OSwgMTAzLCAoQllURSkgJ1wwJ307CitzdGF0aWMgQllURSBtbmdfdnBBZ1s1XT17MTE4LCAxMTIsICA2NSwgMTAzLCAoQllURSkgJ1wwJ307CitzdGF0aWMgQllURSBtbmdfcEhZc1s1XT17MTEyLCAgNzIsICA4OSwgMTE1LCAoQllURSkgJ1wwJ307CitzdGF0aWMgQllURSBtbmdfc0JJVFs1XT17MTE1LCAgNjYsICA3MywgIDg0LCAoQllURSkgJ1wwJ307CitzdGF0aWMgQllURSBtbmdfc1JHQls1XT17MTE1LCAgODIsICA3MSwgIDY2LCAoQllURSkgJ1wwJ307CitzdGF0aWMgQllURSBtbmdfdFJOU1s1XT17MTE2LCAgODIsICA3OCwgIDgzLCAoQllURSkgJ1wwJ307CisKKyNpZiBkZWZpbmVkKEpOR19TVVBQT1JURUQpCitzdGF0aWMgQllURSBtbmdfSURBVFs1XT17IDczLCAgNjgsICA2NSwgIDg0LCAoQllURSkgJ1wwJ307CitzdGF0aWMgQllURSBtbmdfSkRBVFs1XT17IDc0LCAgNjgsICA2NSwgIDg0LCAoQllURSkgJ1wwJ307CitzdGF0aWMgQllURSBtbmdfSkRBQVs1XT17IDc0LCAgNjgsICA2NSwgIDY1LCAoQllURSkgJ1wwJ307CitzdGF0aWMgQllURSBtbmdfSmRBQVs1XT17IDc0LCAxMDAsICA2NSwgIDY1LCAoQllURSkgJ1wwJ307CitzdGF0aWMgQllURSBtbmdfSlNFUFs1XT17IDc0LCAgODMsICA2OSwgIDgwLCAoQllURSkgJ1wwJ307CitzdGF0aWMgQllURSBtbmdfb0ZGc1s1XT17MTExLCAgNzAsICA3MCwgMTE1LCAoQllURSkgJ1wwJ307CisjZW5kaWYKKworc3RhdGljIEJZVEUgbW5nX2hJU1RbNV09ezEwNCwgIDczLCAgODMsICA4NCwgKEJZVEUpICdcMCd9Oworc3RhdGljIEJZVEUgbW5nX2lUWHRbNV09ezEwNSwgIDg0LCAgODgsIDExNiwgKEJZVEUpICdcMCd9Oworc3RhdGljIEJZVEUgbW5nX3NQTFRbNV09ezExNSwgIDgwLCAgNzYsICA4NCwgKEJZVEUpICdcMCd9Oworc3RhdGljIEJZVEUgbW5nX3NURVJbNV09ezExNSwgIDg0LCAgNjksICA4MiwgKEJZVEUpICdcMCd9Oworc3RhdGljIEJZVEUgbW5nX3RFWHRbNV09ezExNiwgIDY5LCAgODgsIDExNiwgKEJZVEUpICdcMCd9Oworc3RhdGljIEJZVEUgbW5nX3RJTUVbNV09ezExNiwgIDczLCAgNzcsICA2OSwgKEJZVEUpICdcMCd9Oworc3RhdGljIEJZVEUgbW5nX3pUWHRbNV09ezEyMiwgIDg0LCAgODgsIDExNiwgKEJZVEUpICdcMCd9OworCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qKgorQ29udmVydCBhIGNodW5rIG5hbWUgdG8gYSB1bmlxdWUgSUQKKyovCitzdGF0aWMgZUNodW5ja1R5cGUgCittbmdfR2V0Q2h1bmNrVHlwZShjb25zdCBCWVRFICptQ2h1bmtOYW1lKSB7CisJaWYobWVtY21wKG1DaHVua05hbWUsIG1uZ19NSERSLCA0KSA9PSAwKSB7CisJCXJldHVybiBNSERSOworCX0KKwlpZihtZW1jbXAobUNodW5rTmFtZSwgbW5nX0xPT1AsIDQpID09IDApIHsKKwkJcmV0dXJuIExPT1A7CisJfQorCWlmKG1lbWNtcChtQ2h1bmtOYW1lLCBtbmdfREVGSSwgNCkgPT0gMCkgeworCQlyZXR1cm4gREVGSTsKKwl9CisJaWYobWVtY21wKG1DaHVua05hbWUsIG1uZ19QTFRFLCA0KSA9PSAwKSB7CisJCXJldHVybiBQTFRFOworCX0KKwlpZihtZW1jbXAobUNodW5rTmFtZSwgbW5nX3RSTlMsIDQpID09IDApIHsKKwkJcmV0dXJuIHRSTlM7CisJfQorCWlmKG1lbWNtcChtQ2h1bmtOYW1lLCBtbmdfSUhEUiwgNCkgPT0gMCkgeworCQlyZXR1cm4gSUhEUjsKKwl9CisJaWYobWVtY21wKG1DaHVua05hbWUsIG1uZ19KSERSLCA0KSA9PSAwKSB7CisJCXJldHVybiBKSERSOworCX0KKwlpZihtZW1jbXAobUNodW5rTmFtZSwgbW5nX01FTkQsIDQpID09IDApIHsKKwkJcmV0dXJuIE1FTkQ7CisJfQorCWlmKG1lbWNtcChtQ2h1bmtOYW1lLCBtbmdfSUVORCwgNCkgPT0gMCkgeworCQlyZXR1cm4gSUVORDsKKwl9CisJaWYobWVtY21wKG1DaHVua05hbWUsIG1uZ19KREFULCA0KSA9PSAwKSB7CisJCXJldHVybiBKREFUOworCX0KKwlpZihtZW1jbXAobUNodW5rTmFtZSwgbW5nX0lEQVQsIDQpID09IDApIHsKKwkJcmV0dXJuIElEQVQ7CisJfQorCWlmKG1lbWNtcChtQ2h1bmtOYW1lLCBtbmdfSkRBQSwgNCkgPT0gMCkgeworCQlyZXR1cm4gSkRBQTsKKwl9CisJaWYobWVtY21wKG1DaHVua05hbWUsIG1uZ19nQU1BLCA0KSA9PSAwKSB7CisJCXJldHVybiBnQU1BOworCX0KKwlpZihtZW1jbXAobUNodW5rTmFtZSwgbW5nX3BIWXMsIDQpID09IDApIHsKKwkJcmV0dXJuIHBIWXM7CisJfQorCWlmKG1lbWNtcChtQ2h1bmtOYW1lLCBtbmdfYktHRCwgNCkgPT0gMCkgeworCQlyZXR1cm4gYktHRDsKKwl9CisJaWYobWVtY21wKG1DaHVua05hbWUsIG1uZ190RVh0LCA0KSA9PSAwKSB7CisJCXJldHVybiB0RVh0OworCX0KKworCXJldHVybiBVTktOT1dOX0NIVU5DSzsKK30KKworaW5saW5lIHZvaWQKK21uZ19Td2FwU2hvcnQoV09SRCAqc3ApIHsKKyNpZm5kZWYgRlJFRUlNQUdFX0JJR0VORElBTgorCVN3YXBTaG9ydChzcCk7CisjZW5kaWYKK30KKworaW5saW5lIHZvaWQKK21uZ19Td2FwTG9uZyhEV09SRCAqbHApIHsKKyNpZm5kZWYgRlJFRUlNQUdFX0JJR0VORElBTgorCVN3YXBMb25nKGxwKTsKKyNlbmRpZgorfQorCisvKioKK1JldHVybnMgdGhlIHNpemUsIGluIGJ5dGVzLCBvZiBhIEZyZWVJbWFnZUlPIHN0cmVhbSwgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbi4gCisqLworc3RhdGljIGxvbmcKK21uZ19MT0YoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlKSB7CisJbG9uZyBzdGFydF9wb3MgPSBpby0+dGVsbF9wcm9jKGhhbmRsZSk7CisJaW8tPnNlZWtfcHJvYyhoYW5kbGUsIDAsIFNFRUtfRU5EKTsKKwlsb25nIGZpbGVfbGVuZ3RoID0gaW8tPnRlbGxfcHJvYyhoYW5kbGUpOworCWlvLT5zZWVrX3Byb2MoaGFuZGxlLCBzdGFydF9wb3MsIFNFRUtfU0VUKTsKKwlyZXR1cm4gZmlsZV9sZW5ndGg7Cit9CisKKy8qKgorQ291bnQgdGhlIG51bWJlciBvZiBieXRlcyBpbiBhIFBORyBzdHJlYW0sIGZyb20gSUhEUiB0byBJRU5ELiAKK0lmIHN1Y2Nlc3NmdWwsIHRoZSBzdHJlYW0gcG9zaXRpb24sIGFzIGdpdmVuIGJ5IGlvLT50ZWxsX3Byb2MoaGFuZGxlKSwgCitzaG91bGQgYmUgdGhlIGVuZCBvZiB0aGUgUE5HIHN0cmVhbSBhdCB0aGUgcmV0dXJuIG9mIHRoZSBmdW5jdGlvbi4gCitAcGFyYW0gaW8KK0BwYXJhbSBoYW5kbGUKK0BwYXJhbSBpblBvcworQHBhcmFtIG1fVG90YWxCeXRlc09mQ2h1bmtzCitAcmV0dXJuIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsLCByZXR1cm5zIEZBTFNFIG90aGVyd2lzZQorKi8KK3N0YXRpYyBCT09MIAorbW5nX0NvdW50UE5HQ2h1bmtzKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSwgbG9uZyBpblBvcywgdW5zaWduZWQgKm1fVG90YWxCeXRlc09mQ2h1bmtzKSB7CisJbG9uZyBtTE9GOworCWxvbmcgbVBvczsKKwlCT09MIG1FbmQgPSBGQUxTRTsKKwlEV09SRCBtTGVuZ3RoID0gMDsKKwlCWVRFIG1DaHVua05hbWVbNV07CisKKwkqbV9Ub3RhbEJ5dGVzT2ZDaHVua3MgPSAwOworCisJLy8gZ2V0IHRoZSBsZW5ndGggb2YgdGhlIGZpbGUKKwltTE9GID0gbW5nX0xPRihpbywgaGFuZGxlKTsKKworCS8vIGdvIHRvIHRoZSBzdGFydCBvZiB0aGUgZmlsZQorCWlvLT5zZWVrX3Byb2MoaGFuZGxlLCBpblBvcywgU0VFS19TRVQpOworCisJdHJ5IHsKKwkJLy8gcGFyc2UgY2h1bmtzCisJCXdoaWxlKG1FbmQgPT0gRkFMU0UpIHsKKwkJCS8vIGNodW5rIGxlbmd0aAorCQkJbVBvcyA9IGlvLT50ZWxsX3Byb2MoaGFuZGxlKTsKKwkJCWlmKG1Qb3MgKyA0ID4gbUxPRikgeworCQkJCXRocm93KDEpOworCQkJfQorCQkJaW8tPnJlYWRfcHJvYygmbUxlbmd0aCwgMSwgNCwgaGFuZGxlKTsKKwkJCW1uZ19Td2FwTG9uZygmbUxlbmd0aCk7CisJCQkvLyBjaHVuayBuYW1lCisJCQltUG9zID0gaW8tPnRlbGxfcHJvYyhoYW5kbGUpOworCQkJaWYobVBvcyArIDQgPiBtTE9GKSB7CisJCQkJdGhyb3coMSk7CisJCQl9CisJCQlpby0+cmVhZF9wcm9jKCZtQ2h1bmtOYW1lWzBdLCAxLCA0LCBoYW5kbGUpOworCQkJbUNodW5rTmFtZVs0XSA9ICdcMCc7CisKKwkJCS8vIGdvIHRvIG5leHQgY2h1bmsKKwkJCW1Qb3MgPSBpby0+dGVsbF9wcm9jKGhhbmRsZSk7CisJCQkvLyA0ID0gc2l6ZSBvZiB0aGUgQ1JDCisJCQlpZihtUG9zICsgKGxvbmcpbUxlbmd0aCArIDQgPiBtTE9GKSB7CisJCQkJdGhyb3coMSk7CisJCQl9CisJCQlpby0+c2Vla19wcm9jKGhhbmRsZSwgbUxlbmd0aCArIDQsIFNFRUtfQ1VSKTsKKworCQkJc3dpdGNoKCBtbmdfR2V0Q2h1bmNrVHlwZShtQ2h1bmtOYW1lKSApIHsKKwkJCQljYXNlIElIRFI6CisJCQkJCWlmKG1MZW5ndGggIT0gMTMpIHsKKwkJCQkJCXRocm93KDEpOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCQorCQkJCWNhc2UgSUVORDoKKwkJCQkJbUVuZCA9IFRSVUU7CQkKKwkJCQkJLy8gdGhlIGxlbmd0aCBiZWxvdyBpbmNsdWRlcyA0IGJ5dGVzIENSQywgYnV0IG5vIGJ5dGVzIGZvciBMZW5ndGgKKwkJCQkJKm1fVG90YWxCeXRlc09mQ2h1bmtzID0gaW8tPnRlbGxfcHJvYyhoYW5kbGUpIC0gaW5Qb3M7CisJCQkJCWJyZWFrOwkJCisJCQkJCisJCQkJY2FzZSBVTktOT1dOX0NIVU5DSzoKKwkJCQlkZWZhdWx0OgorCQkJCQlicmVhazsKKwkJCX0KKworCQl9IC8vIHdoaWxlKCFtRW5kKQorCisJCXJldHVybiBUUlVFOworCQkKKwl9IGNhdGNoKGludCkgeworCQlyZXR1cm4gRkFMU0U7CisJfQorfQorCisvKioKK1JldHJpZXZlIHRoZSBwb3NpdGlvbiBvZiBhIGNodW5rIGluIGEgUE5HIHN0cmVhbQorQHBhcmFtIGhQbmdNZW1vcnkgUE5HIHN0cmVhbSBoYW5kbGUKK0BwYXJhbSBjaHVua19uYW1lIE5hbWUgb2YgdGhlIGNodW5rIHRvIGJlIGZvdW5kCitAcGFyYW0gb2Zmc2V0IFN0YXJ0IG9mIHRoZSBzZWFyY2ggaW4gdGhlIHN0cmVhbQorQHBhcmFtIHN0YXJ0X3BvcyBbcmV0dXJuZWQgdmFsdWVdIFN0YXJ0IHBvc2l0aW9uIG9mIHRoZSBjaHVuaworQHBhcmFtIG5leHRfcG9zIFtyZXR1cm5lZCB2YWx1ZV0gU3RhcnQgcG9zaXRpb24gb2YgdGhlIG5leHQgY2h1bmsKK0ByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgRkFMU0Ugb3RoZXJ3aXNlCisqLworc3RhdGljIEJPT0wgCittbmdfRmluZENodW5rKEZJTUVNT1JZICpoUG5nTWVtb3J5LCBCWVRFICpjaHVua19uYW1lLCBsb25nIG9mZnNldCwgRFdPUkQgKnN0YXJ0X3BvcywgRFdPUkQgKm5leHRfcG9zKSB7CisJRFdPUkQgbUxlbmd0aCA9IDA7CisKKwlCWVRFICpkYXRhID0gTlVMTDsKKwlEV09SRCBzaXplX2luX2J5dGVzID0gMDsKKworCSpzdGFydF9wb3MgPSAwOworCSpuZXh0X3BvcyA9IDA7CisKKwkvLyBnZXQgYSBwb2ludGVyIHRvIHRoZSBzdHJlYW0gYnVmZmVyCisJRnJlZUltYWdlX0FjcXVpcmVNZW1vcnkoaFBuZ01lbW9yeSwgJmRhdGEsICZzaXplX2luX2J5dGVzKTsKKwlpZighKGRhdGEgJiYgc2l6ZV9pbl9ieXRlcykgfHwgKHNpemVfaW5fYnl0ZXMgPCAyMCkgfHwgKHNpemVfaW5fYnl0ZXMgLSBvZmZzZXQgPCAyMCkpIHsKKwkJLy8gbm90IGVub3VnaCBzcGFjZSB0byByZWFkIGEgc2lnbmF0dXJlKDggYnl0ZXMpICsgYSBjaHVuayhhdCBsZWFzdCAxMiBieXRlcykKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCXRyeSB7CisJCisJCS8vIHNraXAgdGhlIHNpZ25hdHVyZSBhbmQvb3IgYW55IGZvbGxvd2luZyBjaHVuayhzKQorCQlEV09SRCBjaHVua19wb3MgPSBvZmZzZXQ7CisKKwkJd2hpbGUoMSkgeworCQkJLy8gZ2V0IGNodW5rIGxlbmd0aAorCQkJaWYoY2h1bmtfcG9zICsgNCA+IHNpemVfaW5fYnl0ZXMpIHsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJbWVtY3B5KCZtTGVuZ3RoLCAmZGF0YVtjaHVua19wb3NdLCA0KTsKKwkJCW1uZ19Td2FwTG9uZygmbUxlbmd0aCk7CisJCQljaHVua19wb3MgKz0gNDsKKworCQkJY29uc3QgRFdPUkQgbmV4dF9jaHVua19wb3MgPSBjaHVua19wb3MgKyA0ICsgbUxlbmd0aCArIDQ7CisJCQlpZihuZXh0X2NodW5rX3BvcyA+IHNpemVfaW5fYnl0ZXMpIHsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLy8gZ2V0IGNodW5rIG5hbWUKKwkJCWlmKG1lbWNtcCgmZGF0YVtjaHVua19wb3NdLCBjaHVua19uYW1lLCA0KSA9PSAwKSB7CisJCQkJY2h1bmtfcG9zIC09IDQ7CS8vIGZvdW5kIGNodW5rCisJCQkJKnN0YXJ0X3BvcyA9IGNodW5rX3BvczsKKwkJCQkqbmV4dF9wb3MgPSBuZXh0X2NodW5rX3BvczsKKwkJCQlyZXR1cm4gVFJVRTsKKwkJCX0KKwkJCQorCQkJY2h1bmtfcG9zID0gbmV4dF9jaHVua19wb3M7CisJCX0KKworCQlyZXR1cm4gRkFMU0U7CisKKwl9IGNhdGNoKGludCkgeworCQlyZXR1cm4gRkFMU0U7CisJfQorfQorCisvKioKK1JlbW92ZSBhIGNodW5rIGxvY2F0ZWQgYXQgKHN0YXJ0X3BvcywgbmV4dF9wb3MpIGluIHRoZSBQTkcgc3RyZWFtCitAcGFyYW0gaFBuZ01lbW9yeSBQTkcgc3RyZWFtIGhhbmRsZQorQHBhcmFtIHN0YXJ0X3BvcyBTdGFydCBwb3NpdGlvbiBvZiB0aGUgY2h1bmsKK0BwYXJhbSBuZXh0X3BvcyBTdGFydCBwb3NpdGlvbiBvZiB0aGUgbmV4dCBjaHVuaworQHJldHVybiBSZXR1cm5zIFRSVUUgaWYgc3VjY2Vzc2Z1bGwsIHJldHVybnMgRkFMU0Ugb3RoZXJ3aXNlCisqLworc3RhdGljIEJPT0wgCittbmdfQ29weVJlbW92ZUNodW5rcyhGSU1FTU9SWSAqaFBuZ01lbW9yeSwgRFdPUkQgc3RhcnRfcG9zLCBEV09SRCBuZXh0X3BvcykgeworCUJZVEUgKmRhdGEgPSBOVUxMOworCURXT1JEIHNpemVfaW5fYnl0ZXMgPSAwOworCisJLy8gbGVuZ3RoIG9mIHRoZSBjaHVuayB0byByZW1vdmUKKwlEV09SRCBjaHVua19sZW5ndGggPSBuZXh0X3BvcyAtIHN0YXJ0X3BvczsKKwlpZihjaHVua19sZW5ndGggPT0gMCkgeworCQlyZXR1cm4gVFJVRTsKKwl9CisKKwkvLyBnZXQgYSBwb2ludGVyIHRvIHRoZSBzdHJlYW0gYnVmZmVyCisJRnJlZUltYWdlX0FjcXVpcmVNZW1vcnkoaFBuZ01lbW9yeSwgJmRhdGEsICZzaXplX2luX2J5dGVzKTsKKwlpZighKGRhdGEgJiYgc2l6ZV9pbl9ieXRlcykgfHwgKHNpemVfaW5fYnl0ZXMgPCAyMCkgfHwgKGNodW5rX2xlbmd0aCA+PSBzaXplX2luX2J5dGVzKSkgeworCQkvLyBub3QgZW5vdWdoIHNwYWNlIHRvIHJlYWQgYSBzaWduYXR1cmUoOCBieXRlcykgKyBhIGNodW5rKGF0IGxlYXN0IDEyIGJ5dGVzKQorCQlyZXR1cm4gRkFMU0U7CisJfQorCQorCS8vIG5ldyBmaWxlIGxlbmd0aAorCXVuc2lnbmVkIGJ1ZmZlcl9zaXplID0gc2l6ZV9pbl9ieXRlcyArIGNodW5rX2xlbmd0aDsKKworCUJZVEUgKmJ1ZmZlciA9IChCWVRFKiltYWxsb2MoYnVmZmVyX3NpemUgKiBzaXplb2YoQllURSkpOworCWlmKCFidWZmZXIpIHsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwltZW1jcHkoJmJ1ZmZlclswXSwgJmRhdGFbMF0sIHN0YXJ0X3Bvcyk7CisJbWVtY3B5KCZidWZmZXJbc3RhcnRfcG9zXSwgJmRhdGFbbmV4dF9wb3NdLCBzaXplX2luX2J5dGVzIC0gbmV4dF9wb3MpOworCisJLy8gc2VlayB0byB0aGUgc3RhcnQgb2YgdGhlIHN0cmVhbQorCUZyZWVJbWFnZV9TZWVrTWVtb3J5KGhQbmdNZW1vcnksIDAsIFNFRUtfU0VUKTsKKwkvLyByZS13cml0ZSB0aGUgc3RyZWFtCisJRnJlZUltYWdlX1dyaXRlTWVtb3J5KGJ1ZmZlciwgMSwgYnVmZmVyX3NpemUsIGhQbmdNZW1vcnkpOworCisJZnJlZShidWZmZXIpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorSW5zZXJ0IGEgY2h1bmsganVzdCBiZWZvcmUgdGhlIGluTmV4dENodW5rTmFtZSBjaHVuaworQHBhcmFtIGhQbmdNZW1vcnkgUE5HIHN0cmVhbSBoYW5kbGUKK0BwYXJhbSBzdGFydF9wb3MgU3RhcnQgcG9zaXRpb24gb2YgdGhlIGluTmV4dENodW5rTmFtZSBjaHVuaworQHBhcmFtIG5leHRfcG9zIFN0YXJ0IHBvc2l0aW9uIG9mIHRoZSBuZXh0IGNodW5rCitAcmV0dXJuIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsbCwgcmV0dXJucyBGQUxTRSBvdGhlcndpc2UKKyovCitzdGF0aWMgQk9PTCAKK21uZ19Db3B5SW5zZXJ0Q2h1bmtzKEZJTUVNT1JZICpoUG5nTWVtb3J5LCBCWVRFICppbk5leHRDaHVua05hbWUsIEJZVEUgKmluSW5zZXJ0Q2h1bmssIERXT1JEIGluQ2h1bmtMZW5ndGgsIERXT1JEIHN0YXJ0X3BvcywgRFdPUkQgbmV4dF9wb3MpIHsKKwlCWVRFICpkYXRhID0gTlVMTDsKKwlEV09SRCBzaXplX2luX2J5dGVzID0gMDsKKworCS8vIGxlbmd0aCBvZiB0aGUgY2h1bmsgdG8gY2hlY2sKKwlEV09SRCBjaHVua19sZW5ndGggPSBuZXh0X3BvcyAtIHN0YXJ0X3BvczsKKwlpZihjaHVua19sZW5ndGggPT0gMCkgeworCQlyZXR1cm4gVFJVRTsKKwl9CisKKwkvLyBnZXQgYSBwb2ludGVyIHRvIHRoZSBzdHJlYW0gYnVmZmVyCisJRnJlZUltYWdlX0FjcXVpcmVNZW1vcnkoaFBuZ01lbW9yeSwgJmRhdGEsICZzaXplX2luX2J5dGVzKTsKKwlpZighKGRhdGEgJiYgc2l6ZV9pbl9ieXRlcykgfHwgKHNpemVfaW5fYnl0ZXMgPCAyMCkgfHwgKGNodW5rX2xlbmd0aCA+PSBzaXplX2luX2J5dGVzKSkgeworCQkvLyBub3QgZW5vdWdoIHNwYWNlIHRvIHJlYWQgYSBzaWduYXR1cmUoOCBieXRlcykgKyBhIGNodW5rKGF0IGxlYXN0IDEyIGJ5dGVzKQorCQlyZXR1cm4gRkFMU0U7CisJfQorCQorCS8vIG5ldyBmaWxlIGxlbmd0aAorCXVuc2lnbmVkIGJ1ZmZlcl9zaXplID0gaW5DaHVua0xlbmd0aCArIHNpemVfaW5fYnl0ZXM7CisKKwlCWVRFICpidWZmZXIgPSAoQllURSopbWFsbG9jKGJ1ZmZlcl9zaXplICogc2l6ZW9mKEJZVEUpKTsKKwlpZighYnVmZmVyKSB7CisJCXJldHVybiBGQUxTRTsKKwl9CisJdW5zaWduZWQgcCA9IDA7CisJbWVtY3B5KCZidWZmZXJbcF0sICZkYXRhWzBdLCBzdGFydF9wb3MpOworCXAgKz0gc3RhcnRfcG9zOworCW1lbWNweSgmYnVmZmVyW3BdLCBpbkluc2VydENodW5rLCBpbkNodW5rTGVuZ3RoKTsKKwlwICs9IGluQ2h1bmtMZW5ndGg7CisJbWVtY3B5KCZidWZmZXJbcF0sICZkYXRhW3N0YXJ0X3Bvc10sIHNpemVfaW5fYnl0ZXMgLSBzdGFydF9wb3MpOworCisJLy8gc2VlayB0byB0aGUgc3RhcnQgb2YgdGhlIHN0cmVhbQorCUZyZWVJbWFnZV9TZWVrTWVtb3J5KGhQbmdNZW1vcnksIDAsIFNFRUtfU0VUKTsKKwkvLyByZS13cml0ZSB0aGUgc3RyZWFtCisJRnJlZUltYWdlX1dyaXRlTWVtb3J5KGJ1ZmZlciwgMSwgYnVmZmVyX3NpemUsIGhQbmdNZW1vcnkpOworCisJZnJlZShidWZmZXIpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBCT09MIAorbW5nX1JlbW92ZUNodW5rKEZJTUVNT1JZICpoUG5nTWVtb3J5LCBCWVRFICpjaHVua19uYW1lKSB7CisJQk9PTCBiUmVzdWx0ID0gRkFMU0U7CisKKwlEV09SRCBzdGFydF9wb3MgPSAwOworCURXT1JEIG5leHRfcG9zID0gMDsKKwkKKwliUmVzdWx0ID0gbW5nX0ZpbmRDaHVuayhoUG5nTWVtb3J5LCBjaHVua19uYW1lLCA4LCAmc3RhcnRfcG9zLCAmbmV4dF9wb3MpOworCWlmKCFiUmVzdWx0KSB7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwliUmVzdWx0ID0gbW5nX0NvcHlSZW1vdmVDaHVua3MoaFBuZ01lbW9yeSwgc3RhcnRfcG9zLCBuZXh0X3Bvcyk7CisJaWYoIWJSZXN1bHQpIHsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgQk9PTCAKK21uZ19JbnNlcnRDaHVuayhGSU1FTU9SWSAqaFBuZ01lbW9yeSwgQllURSAqaW5OZXh0Q2h1bmtOYW1lLCBCWVRFICppbkluc2VydENodW5rLCB1bnNpZ25lZCBjaHVua19sZW5ndGgpIHsKKwlCT09MIGJSZXN1bHQgPSBGQUxTRTsKKworCURXT1JEIHN0YXJ0X3BvcyA9IDA7CisJRFdPUkQgbmV4dF9wb3MgPSAwOworCQorCWJSZXN1bHQgPSBtbmdfRmluZENodW5rKGhQbmdNZW1vcnksIGluTmV4dENodW5rTmFtZSwgOCwgJnN0YXJ0X3BvcywgJm5leHRfcG9zKTsKKwlpZighYlJlc3VsdCkgeworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJYlJlc3VsdCA9IG1uZ19Db3B5SW5zZXJ0Q2h1bmtzKGhQbmdNZW1vcnksIGluTmV4dENodW5rTmFtZSwgaW5JbnNlcnRDaHVuaywgY2h1bmtfbGVuZ3RoLCBzdGFydF9wb3MsIG5leHRfcG9zKTsKKwlpZighYlJlc3VsdCkgeworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBGSUJJVE1BUCogCittbmdfTG9hZEZyb21NZW1vcnlIYW5kbGUoRklNRU1PUlkgKmhtZW0sIGludCBmbGFncyA9IDApIHsKKwlsb25nIG9mZnNldCA9IDA7CisJRklCSVRNQVAgKmRpYiA9IE5VTEw7CisKKwlpZihobWVtKSB7CisJCS8vIHNlZWsgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzdHJlYW0KKwkJRnJlZUltYWdlX1NlZWtNZW1vcnkoaG1lbSwgb2Zmc2V0LCBTRUVLX1NFVCk7CisKKwkJLy8gY2hlY2sgdGhlIGZpbGUgc2lnbmF0dXJlIGFuZCBkZWR1Y2UgaXRzIGZvcm1hdAorCQkvLyAodGhlIHNlY29uZCBhcmd1bWVudCBpcyBjdXJyZW50bHkgbm90IHVzZWQgYnkgRnJlZUltYWdlKQorCQlGUkVFX0lNQUdFX0ZPUk1BVCBmaWYgPSBGcmVlSW1hZ2VfR2V0RmlsZVR5cGVGcm9tTWVtb3J5KGhtZW0sIDApOworCQlpZihmaWYgIT0gRklGX1VOS05PV04pIHsKKwkJCWRpYiA9IEZyZWVJbWFnZV9Mb2FkRnJvbU1lbW9yeShmaWYsIGhtZW0sIGZsYWdzKTsKKwkJfQorCX0KKwkKKwlyZXR1cm4gZGliOworfQorCisvKioKK1dyaXRlIGEgY2h1bmsgaW4gYSBQTkcgc3RyZWFtIGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24uIAorQHBhcmFtIGNodW5rX25hbWUgTmFtZSBvZiB0aGUgY2h1bmsKK0BwYXJhbSBjaHVua19kYXRhIENodW5rIGFycmF5CitAcGFyYW0gbGVuZ3RoIENodW5rIGxlbmd0aAorQHBhcmFtIGhQbmdNZW1vcnkgUE5HIHN0cmVhbSBoYW5kbGUKKyovCitzdGF0aWMgdm9pZAorbW5nX1dyaXRlQ2h1bmsoQllURSAqY2h1bmtfbmFtZSwgQllURSAqY2h1bmtfZGF0YSwgRFdPUkQgbGVuZ3RoLCBGSU1FTU9SWSAqaFBuZ01lbW9yeSkgeworCURXT1JEIGNyY19maWxlID0gMDsKKwkvLyB3cml0ZSBhIFBORyBjaHVuayAuLi4KKwkvLyAtIGxlbmd0aAorCW1uZ19Td2FwTG9uZygmbGVuZ3RoKTsKKwlGcmVlSW1hZ2VfV3JpdGVNZW1vcnkoJmxlbmd0aCwgMSwgNCwgaFBuZ01lbW9yeSk7CisJbW5nX1N3YXBMb25nKCZsZW5ndGgpOworCS8vIC0gY2h1bmsgbmFtZQorCUZyZWVJbWFnZV9Xcml0ZU1lbW9yeShjaHVua19uYW1lLCAxLCA0LCBoUG5nTWVtb3J5KTsKKwlpZihjaHVua19kYXRhICYmIGxlbmd0aCkgeworCQkvLyAtIGNodW5rIGRhdGEKKwkJRnJlZUltYWdlX1dyaXRlTWVtb3J5KGNodW5rX2RhdGEsIDEsIGxlbmd0aCwgaFBuZ01lbW9yeSk7CisJCS8vIC0gY3JjCisJCWNyY19maWxlID0gRnJlZUltYWdlX1pMaWJDUkMzMigwLCBjaHVua19uYW1lLCA0KTsKKwkJY3JjX2ZpbGUgPSBGcmVlSW1hZ2VfWkxpYkNSQzMyKGNyY19maWxlLCBjaHVua19kYXRhLCBsZW5ndGgpOworCQltbmdfU3dhcExvbmcoJmNyY19maWxlKTsKKwkJRnJlZUltYWdlX1dyaXRlTWVtb3J5KCZjcmNfZmlsZSwgMSwgNCwgaFBuZ01lbW9yeSk7CisJfSBlbHNlIHsKKwkJLy8gLSBjcmMKKwkJY3JjX2ZpbGUgPSBGcmVlSW1hZ2VfWkxpYkNSQzMyKDAsIGNodW5rX25hbWUsIDQpOworCQltbmdfU3dhcExvbmcoJmNyY19maWxlKTsKKwkJRnJlZUltYWdlX1dyaXRlTWVtb3J5KCZjcmNfZmlsZSwgMSwgNCwgaFBuZ01lbW9yeSk7CisJfQorCit9CisKKy8qKgorV3JhcCBhIElEQVQgY2h1bmsgYXMgYSBQTkcgc3RyZWFtLiAKK1RoZSBzdHJlYW0gaGFzIHRoZSBzdHJ1Y3R1cmUgeyBnX3BuZ19zaWduYXR1cmUsIElIRFIsIElEQVQsIElFTkQgfQorVGhlIGltYWdlIGlzIGFzc3VtZWQgdG8gYmUgYSBncmV5c2NhbGUgaW1hZ2UuIAorCitAcGFyYW0gam5nX3dpZHRoIEltYWdlIHdpZHRoCitAcGFyYW0gam5nX2hlaWdodCBJbWFnZSBoZWlnaHQKK0BwYXJhbSBqbmdfYWxwaGFfc2FtcGxlX2RlcHRoIEJpdHMgcGVyIHBpeGVsCitAcGFyYW0gbUNodW5rIFBORyBncmF5c2NhbGUgSURBVCBmb3JtYXQKK0BwYXJhbSBtTGVuZ3RoIElEQVQgY2h1bmsgbGVuZ3RoCitAcGFyYW0gaFBuZ01lbW9yeSBPdXRwdXQgbWVtb3J5IHN0cmVhbQorKi8KK3N0YXRpYyB2b2lkIAorbW5nX1dyaXRlUE5HU3RyZWFtKERXT1JEIGpuZ193aWR0aCwgRFdPUkQgam5nX2hlaWdodCwgQllURSBqbmdfYWxwaGFfc2FtcGxlX2RlcHRoLCBCWVRFICptQ2h1bmssIERXT1JEIG1MZW5ndGgsIEZJTUVNT1JZICpoUG5nTWVtb3J5KSB7CisJLy8gUE5HIGdyYXlzY2FsZSBJREFUIGZvcm1hdAorCisJQllURSBkYXRhWzE0XTsKKworCS8vIHdyYXAgdGhlIElEQVQgY2h1bmsgYXMgYSBQTkcgc3RyZWFtCisKKwkvLyB3cml0ZSBQTkcgZmlsZSBzaWduYXR1cmUKKwlGcmVlSW1hZ2VfV3JpdGVNZW1vcnkoZ19wbmdfc2lnbmF0dXJlLCAxLCA4LCBoUG5nTWVtb3J5KTsKKworCS8vIHdyaXRlIGEgSUhEUiBjaHVuayAuLi4KKwkvKgorCVRoZSBJSERSIGNodW5rIG11c3QgYXBwZWFyIEZJUlNULiBJdCBjb250YWluczoKKwlXaWR0aDogICAgICAgICAgICAgIDQgYnl0ZXMKKwlIZWlnaHQ6ICAgICAgICAgICAgIDQgYnl0ZXMKKwlCaXQgZGVwdGg6ICAgICAgICAgIDEgYnl0ZQorCUNvbG9yIHR5cGU6ICAgICAgICAgMSBieXRlCisJQ29tcHJlc3Npb24gbWV0aG9kOiAxIGJ5dGUKKwlGaWx0ZXIgbWV0aG9kOiAgICAgIDEgYnl0ZQorCUludGVybGFjZSBtZXRob2Q6ICAgMSBieXRlCisJKi8KKwkvLyAtIGNodW5rIGRhdGEKKwltbmdfU3dhcExvbmcoJmpuZ193aWR0aCk7CisJbW5nX1N3YXBMb25nKCZqbmdfaGVpZ2h0KTsKKwltZW1jcHkoJmRhdGFbMF0sICZqbmdfd2lkdGgsIDQpOworCW1lbWNweSgmZGF0YVs0XSwgJmpuZ19oZWlnaHQsIDQpOworCW1uZ19Td2FwTG9uZygmam5nX3dpZHRoKTsKKwltbmdfU3dhcExvbmcoJmpuZ19oZWlnaHQpOworCWRhdGFbOF0gPSBqbmdfYWxwaGFfc2FtcGxlX2RlcHRoOworCWRhdGFbOV0gPSAwOwkvLyBjb2xvcl90eXBlIGdyYXkgKGpuZ19jb2xvcl90eXBlKQorCWRhdGFbMTBdID0gMDsJLy8gY29tcHJlc3Npb24gbWV0aG9kIDAgKGpuZ19hbHBoYV9jb21wcmVzc2lvbl9tZXRob2QpCisJZGF0YVsxMV0gPSAwOwkvLyBmaWx0ZXJfbWV0aG9kIDAgKGpuZ19hbHBoYV9maWx0ZXJfbWV0aG9kKQorCWRhdGFbMTJdID0gMDsJLy8gaW50ZXJsYWNlX21ldGhvZCAwIChqbmdfYWxwaGFfaW50ZXJsYWNlX21ldGhvZCkKKworCW1uZ19Xcml0ZUNodW5rKG1uZ19JSERSLCAmZGF0YVswXSwgMTMsIGhQbmdNZW1vcnkpOworCisJLy8gd3JpdGUgYSBJREFUIGNodW5rIC4uLgorCW1uZ19Xcml0ZUNodW5rKG1uZ19JREFULCBtQ2h1bmssIG1MZW5ndGgsIGhQbmdNZW1vcnkpOworCisJLy8gd3JpdGUgYSBJRU5EIGNodW5rIC4uLgorCW1uZ19Xcml0ZUNodW5rKG1uZ19JRU5ELCBOVUxMLCAwLCBoUG5nTWVtb3J5KTsKKworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKioKK0J1aWxkIGFuZCBzZXQgYSBGSVRBRyB3aG9zZSB0eXBlIGlzIEZJRFRfQVNDSUkuIAorVGhlIHRhZyBtdXN0IGJlIGRlc3Ryb3llZCBieSB0aGUgY2FsbGVyIHVzaW5nIEZyZWVJbWFnZV9EZWxldGVUYWcuCitAcGFyYW0gbW9kZWwgTWV0YWRhdGEgbW9kZWwgdG8gYmUgZmlsbGVkCitAcGFyYW0gZGliIEltYWdlIHRvIGJlIGZpbGxlZAorQHBhcmFtIGtleSBUYWcga2V5CitAcGFyYW0gdmFsdWUgVGFnIHZhbHVlCitAcmV0dXJuIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsLCByZXR1cm5zIEZBTFNFIG90aGVyd2lzZQorKi8KK3N0YXRpYyBCT09MIAorbW5nX1NldEtleVZhbHVlKEZSRUVfSU1BR0VfTURNT0RFTCBtb2RlbCwgRklCSVRNQVAgKmRpYiwgY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICp2YWx1ZSkgeworCWlmKCFkaWIgfHwgIWtleSB8fCAhdmFsdWUpIHsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwkvLyBjcmVhdGUgYSB0YWcKKwlGSVRBRyAqdGFnID0gRnJlZUltYWdlX0NyZWF0ZVRhZygpOworCWlmKHRhZykgeworCQlCT09MIGJTdWNjZXNzID0gVFJVRTsKKwkJLy8gZmlsbCB0aGUgdGFnCisJCURXT1JEIHRhZ19sZW5ndGggPSAoRFdPUkQpKHN0cmxlbih2YWx1ZSkgKyAxKTsKKwkJYlN1Y2Nlc3MgJj0gRnJlZUltYWdlX1NldFRhZ0tleSh0YWcsIGtleSk7CisJCWJTdWNjZXNzICY9IEZyZWVJbWFnZV9TZXRUYWdMZW5ndGgodGFnLCB0YWdfbGVuZ3RoKTsKKwkJYlN1Y2Nlc3MgJj0gRnJlZUltYWdlX1NldFRhZ0NvdW50KHRhZywgdGFnX2xlbmd0aCk7CisJCWJTdWNjZXNzICY9IEZyZWVJbWFnZV9TZXRUYWdUeXBlKHRhZywgRklEVF9BU0NJSSk7CisJCWJTdWNjZXNzICY9IEZyZWVJbWFnZV9TZXRUYWdWYWx1ZSh0YWcsIHZhbHVlKTsKKwkJaWYoYlN1Y2Nlc3MpIHsKKwkJCS8vIHNldCB0aGUgdGFnCisJCQlGcmVlSW1hZ2VfU2V0TWV0YWRhdGEobW9kZWwsIGRpYiwgRnJlZUltYWdlX0dldFRhZ0tleSh0YWcpLCB0YWcpOworCQl9CisJCUZyZWVJbWFnZV9EZWxldGVUYWcodGFnKTsKKwkJcmV0dXJuIGJTdWNjZXNzOworCX0KKworCXJldHVybiBGQUxTRTsKK30KKworLyoqCitSZWFkIGEgdEVYdCBjaHVuayBhbmQgZXh0cmFjdCB0aGUga2V5L3ZhbHVlIHBhaXIuIAorQHBhcmFtIGtleV92YWx1ZV9wYWlyIFtyZXR1cm5lZCB2YWx1ZV0gQXJyYXkgb2Yga2V5L3ZhbHVlIHBhaXJzCitAcGFyYW0gbUNodW5rIENodW5rIGRhdGEKK0BwYXJhbSBtTGVuZ3RoIENodW5rIGxlbmd0aAorQHJldHVybiBSZXR1cm5zIFRSVUUgaWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyBGQUxTRSBvdGhlcndpc2UKKyovCitzdGF0aWMgQk9PTCAKK21uZ19TZXRNZXRhZGF0YV90RVh0KHRFWHRNQVAgJmtleV92YWx1ZV9wYWlyLCBjb25zdCBCWVRFICptQ2h1bmssIERXT1JEIG1MZW5ndGgpIHsKKwlzdGQ6OnN0cmluZyBrZXk7CisJc3RkOjpzdHJpbmcgdmFsdWU7CisJQllURSAqYnVmZmVyID0gKEJZVEUqKW1hbGxvYyhtTGVuZ3RoICogc2l6ZW9mKEJZVEUpKTsKKwlpZighYnVmZmVyKSB7CisJCXJldHVybiBGQUxTRTsKKwl9CisJRFdPUkQgcG9zID0gMDsKKworCW1lbXNldChidWZmZXIsIDAsIG1MZW5ndGggKiBzaXplb2YoQllURSkpOworCisJZm9yKERXT1JEIGkgPSAwOyBpIDwgbUxlbmd0aDsgaSsrKSB7CisJCWJ1ZmZlcltwb3MrK10gPSBtQ2h1bmtbaV07CisJCWlmKG1DaHVua1tpXSA9PSAnXDAnKSB7CisJCQlpZihrZXkuc2l6ZSgpID09IDApIHsKKwkJCQlrZXkgPSAoY2hhciopYnVmZmVyOworCQkJCXBvcyA9IDA7CisJCQkJbWVtc2V0KGJ1ZmZlciwgMCwgbUxlbmd0aCAqIHNpemVvZihCWVRFKSk7CisJCQl9IGVsc2UgeworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCXZhbHVlID0gKGNoYXIqKWJ1ZmZlcjsKKwlmcmVlKGJ1ZmZlcik7CisKKwlrZXlfdmFsdWVfcGFpcltrZXldID0gdmFsdWU7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoqCitMb2FkIGEgRklCSVRNQVAgZnJvbSBhIE1ORyBvciBhIEpORyBzdHJlYW0KK0BwYXJhbSBmb3JtYXRfaWQgSUQgb2YgdGhlIGNhbGxlcgorQHBhcmFtIGlvIFN0cmVhbSBpL28gZnVuY3Rpb25zCitAcGFyYW0gaGFuZGxlIFN0cmVhbSBoYW5kbGUKK0BwYXJhbSBPZmZzZXQgU3RhcnQgb2YgdGhlIGZpcnN0IGNodW5rCitAcGFyYW0gZmxhZ3MgTG9hZGluZyBmbGFncworQHJldHVybiBSZXR1cm5zIGEgZGliIGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgTlVMTCBvdGhlcndpc2UKKyovCitGSUJJVE1BUCogCittbmdfUmVhZENodW5rcyhpbnQgZm9ybWF0X2lkLCBGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIGxvbmcgT2Zmc2V0LCBpbnQgZmxhZ3MgPSAwKSB7CisJRFdPUkQgbUxlbmd0aCA9IDA7CisJQllURSBtQ2h1bmtOYW1lWzVdOworCUJZVEUgKm1DaHVuayA9IE5VTEw7CisJRFdPUkQgY3JjX2ZpbGU7CisJbG9uZyBMYXN0T2Zmc2V0OworCWxvbmcgbU9yaWdQb3M7CisJQllURSAqUExURV9maWxlX2NodW5rID0gTlVMTDsJLy8gd2hvbGUgUExURSBjaHVuayAobGVudGdoLCBuYW1lLCBhcnJheSwgY3JjKQorCURXT1JEIFBMVEVfZmlsZV9zaXplID0gMDsJCS8vIHNpemUgb2YgUExURSBjaHVuaworCisJQk9PTCBtX0hhc0dsb2JhbFBhbGV0dGUgPSBGQUxTRTsgLy8gbWF5IHR1cm4gdG8gVFJVRSBpbiBQTFRFIGNodW5rCisJdW5zaWduZWQgbV9Ub3RhbEJ5dGVzT2ZDaHVua3MgPSAwOworCUZJQklUTUFQICpkaWIgPSBOVUxMOworCUZJQklUTUFQICpkaWJfYWxwaGEgPSBOVUxMOworCisJRklNRU1PUlkgKmhKcGVnTWVtb3J5ID0gTlVMTDsKKwlGSU1FTU9SWSAqaFBuZ01lbW9yeSA9IE5VTEw7CisJRklNRU1PUlkgKmhJREFUTWVtb3J5ID0gTlVMTDsKKworCS8vIC0tLQorCURXT1JEIGpuZ193aWR0aCA9IDA7CisJRFdPUkQgam5nX2hlaWdodCA9IDA7CisJQllURSBqbmdfY29sb3JfdHlwZSA9IDA7CisJQllURSBqbmdfaW1hZ2Vfc2FtcGxlX2RlcHRoID0gMDsKKwlCWVRFIGpuZ19pbWFnZV9jb21wcmVzc2lvbl9tZXRob2QgPSAwOworCisJQllURSBqbmdfYWxwaGFfc2FtcGxlX2RlcHRoID0gMDsKKwlCWVRFIGpuZ19hbHBoYV9jb21wcmVzc2lvbl9tZXRob2QgPSAwOworCUJZVEUgam5nX2FscGhhX2ZpbHRlcl9tZXRob2QgPSAwOworCUJZVEUgam5nX2FscGhhX2ludGVybGFjZV9tZXRob2QgPSAwOworCisJRFdPUkQgbW5nX2ZyYW1lX3dpZHRoID0gMDsKKwlEV09SRCBtbmdfZnJhbWVfaGVpZ2h0ID0gMDsKKwlEV09SRCBtbmdfdGlja3NfcGVyX3NlY29uZCA9IDA7CisJRFdPUkQgbW5nX25vbWluYWxfbGF5ZXJfY291bnQgPSAwOworCURXT1JEIG1uZ19ub21pbmFsX2ZyYW1lX2NvdW50ID0gMDsKKwlEV09SRCBtbmdfbm9taW5hbF9wbGF5X3RpbWUgPSAwOworCURXT1JEIG1uZ19zaW1wbGljaXR5X3Byb2ZpbGUgPSAwOworCisKKwlEV09SRCByZXNfeCA9IDI4MzU7CS8vIDcyIGRwaQorCURXT1JEIHJlc195ID0gMjgzNTsJLy8gNzIgZHBpCisJUkdCUVVBRCByZ2JCa0NvbG9yID0gezAsIDAsIDAsIDB9OworCVdPUkQgYmtfcmVkLCBia19ncmVlbiwgYmtfYmx1ZTsKKwlCT09MIGhhc0JrQ29sb3IgPSBGQUxTRTsKKwlCT09MIG1IYXNJREFUID0gRkFMU0U7CisKKwl0RVh0TUFQIGtleV92YWx1ZV9wYWlyOworCisJLy8gLS0tCisKKwlCT09MIGhlYWRlcl9vbmx5ID0gKGZsYWdzICYgRklGX0xPQURfTk9QSVhFTFMpID09IEZJRl9MT0FEX05PUElYRUxTOworCQorCS8vIGdldCB0aGUgZmlsZSBzaXplCisJY29uc3QgbG9uZyBtTE9GID0gbW5nX0xPRihpbywgaGFuZGxlKTsKKwkvLyBnbyB0byB0aGUgZmlyc3QgY2h1bmsKKwlpby0+c2Vla19wcm9jKGhhbmRsZSwgT2Zmc2V0LCBTRUVLX1NFVCk7CisKKwl0cnkgeworCQlCT09MIG1FbmQgPSBGQUxTRTsKKworCQl3aGlsZShtRW5kID09IEZBTFNFKSB7CisJCQkvLyBzdGFydCBvZiB0aGUgY2h1bmsKKwkJCUxhc3RPZmZzZXQgPSBpby0+dGVsbF9wcm9jKGhhbmRsZSk7CisJCQkvLyByZWFkIGxlbmd0aAorCQkJbUxlbmd0aCA9IDA7CQkJCisJCQlpby0+cmVhZF9wcm9jKCZtTGVuZ3RoLCAxLCBzaXplb2YobUxlbmd0aCksIGhhbmRsZSk7CisJCQltbmdfU3dhcExvbmcoJm1MZW5ndGgpOworCQkJLy8gcmVhZCBuYW1lCQkJCisJCQlpby0+cmVhZF9wcm9jKCZtQ2h1bmtOYW1lWzBdLCAxLCA0LCBoYW5kbGUpOworCQkJbUNodW5rTmFtZVs0XSA9ICdcMCc7CisKKwkJCWlmKG1MZW5ndGggPiAwKSB7CisJCQkJbUNodW5rID0gKEJZVEUqKXJlYWxsb2MobUNodW5rLCBtTGVuZ3RoKTsKKwkJCQlpZighbUNodW5rKSB7CisJCQkJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhmb3JtYXRfaWQsICJFcnJvciB3aGlsZSBwYXJzaW5nICVzIGNodW5rOiBvdXQgb2YgbWVtb3J5IiwgbUNodW5rTmFtZSk7CisJCQkJCXRocm93IChjb25zdCBjaGFyKilOVUxMOworCQkJCX0JCQkJCisJCQkJT2Zmc2V0ID0gaW8tPnRlbGxfcHJvYyhoYW5kbGUpOworCQkJCWlmKE9mZnNldCArIChsb25nKW1MZW5ndGggPiBtTE9GKSB7CisJCQkJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhmb3JtYXRfaWQsICJFcnJvciB3aGlsZSBwYXJzaW5nICVzIGNodW5rOiB1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIiwgbUNodW5rTmFtZSk7CisJCQkJCXRocm93IChjb25zdCBjaGFyKilOVUxMOworCQkJCX0KKwkJCQkvLyByZWFkIGNodW5rCisJCQkJaW8tPnJlYWRfcHJvYyhtQ2h1bmssIDEsIG1MZW5ndGgsIGhhbmRsZSk7CisJCQl9CisJCQkvLyByZWFkIGNyYworCQkJaW8tPnJlYWRfcHJvYygmY3JjX2ZpbGUsIDEsIHNpemVvZihjcmNfZmlsZSksIGhhbmRsZSk7CisJCQltbmdfU3dhcExvbmcoJmNyY19maWxlKTsKKwkJCS8vIGNoZWNrIGNyYworCQkJRFdPUkQgY3JjX2NoZWNrID0gRnJlZUltYWdlX1pMaWJDUkMzMigwLCAmbUNodW5rTmFtZVswXSwgNCk7CisJCQljcmNfY2hlY2sgPSBGcmVlSW1hZ2VfWkxpYkNSQzMyKGNyY19jaGVjaywgbUNodW5rLCBtTGVuZ3RoKTsKKwkJCWlmKGNyY19jaGVjayAhPSBjcmNfZmlsZSkgeworCQkJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhmb3JtYXRfaWQsICJFcnJvciB3aGlsZSBwYXJzaW5nICVzIGNodW5rOiBiYWQgQ1JDIiwgbUNodW5rTmFtZSk7CisJCQkJdGhyb3cgKGNvbnN0IGNoYXIqKU5VTEw7CisJCQl9CQkKKworCQkJc3dpdGNoKCBtbmdfR2V0Q2h1bmNrVHlwZShtQ2h1bmtOYW1lKSApIHsKKwkJCQljYXNlIE1IRFI6CisJCQkJCS8vIFRoZSBNSERSIGNodW5rIGlzIGFsd2F5cyBmaXJzdCBpbiBhbGwgTU5HIGRhdGFzdHJlYW1zIGV4Y2VwdCBmb3IgdGhvc2UgCisJCQkJCS8vIHRoYXQgY29uc2lzdCBvZiBhIHNpbmdsZSBQTkcgb3IgSk5HIGRhdGFzdHJlYW0gd2l0aCBhIFBORyBvciBKTkcgc2lnbmF0dXJlLiAKKwkJCQkJaWYobUxlbmd0aCA9PSAyOCkgeworCQkJCQkJbWVtY3B5KCZtbmdfZnJhbWVfd2lkdGgsICZtQ2h1bmtbMF0sIDQpOworCQkJCQkJbWVtY3B5KCZtbmdfZnJhbWVfaGVpZ2h0LCAmbUNodW5rWzRdLCA0KTsKKwkJCQkJCW1lbWNweSgmbW5nX3RpY2tzX3Blcl9zZWNvbmQsICZtQ2h1bmtbOF0sIDQpOworCQkJCQkJbWVtY3B5KCZtbmdfbm9taW5hbF9sYXllcl9jb3VudCwgJm1DaHVua1sxMl0sIDQpOworCQkJCQkJbWVtY3B5KCZtbmdfbm9taW5hbF9mcmFtZV9jb3VudCwgJm1DaHVua1sxNl0sIDQpOworCQkJCQkJbWVtY3B5KCZtbmdfbm9taW5hbF9wbGF5X3RpbWUsICZtQ2h1bmtbMjBdLCA0KTsKKwkJCQkJCW1lbWNweSgmbW5nX3NpbXBsaWNpdHlfcHJvZmlsZSwgJm1DaHVua1syNF0sIDQpOworCisJCQkJCQltbmdfU3dhcExvbmcoJm1uZ19mcmFtZV93aWR0aCk7CisJCQkJCQltbmdfU3dhcExvbmcoJm1uZ19mcmFtZV9oZWlnaHQpOworCQkJCQkJbW5nX1N3YXBMb25nKCZtbmdfdGlja3NfcGVyX3NlY29uZCk7CisJCQkJCQltbmdfU3dhcExvbmcoJm1uZ19ub21pbmFsX2xheWVyX2NvdW50KTsKKwkJCQkJCW1uZ19Td2FwTG9uZygmbW5nX25vbWluYWxfZnJhbWVfY291bnQpOworCQkJCQkJbW5nX1N3YXBMb25nKCZtbmdfbm9taW5hbF9wbGF5X3RpbWUpOworCQkJCQkJbW5nX1N3YXBMb25nKCZtbmdfc2ltcGxpY2l0eV9wcm9maWxlKTsKKworCQkJCQl9IGVsc2UgeworCQkJCQkJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKGZvcm1hdF9pZCwgIkVycm9yIHdoaWxlIHBhcnNpbmcgJXMgY2h1bms6IHNpemUgaXMgJWQgaW5zdGVhZCBvZiAyOCIsIG1DaHVua05hbWUsIG1MZW5ndGgpOworCQkJCQl9CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBNRU5EOgorCQkJCQltRW5kID0gVFJVRTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIExPT1A6CisJCQkJY2FzZSBFTkRMOgorCQkJCQlicmVhazsKKwkJCQljYXNlIERFRkk6CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU0FWRToKKwkJCQljYXNlIFNFRUs6CisJCQkJY2FzZSBURVJNOgorCQkJCQlicmVhazsKKwkJCQljYXNlIEJBQ0s6CisJCQkJCWJyZWFrOworCisJCQkJCS8vIEdsb2JhbCAiUExURSIgYW5kICJ0Uk5TIiAoaWYgYW55KS4gIFBORyAiUExURSIgd2lsbCBiZSBvZiAwIGJ5dGUsIGFzIGl0IHVzZXMgZ2xvYmFsIGRhdGEuCisJCQkJY2FzZSBQTFRFOgkvLyBHbG9iYWwKKwkJCQkJbV9IYXNHbG9iYWxQYWxldHRlID0gVFJVRTsKKwkJCQkJUExURV9maWxlX3NpemUgPSBtTGVuZ3RoICsgMTI7IC8vIChsZW50Z2gsIG5hbWUsIGFycmF5LCBjcmMpID0gKDQsIDQsIG1MZW5ndGgsIDQpCisJCQkJCVBMVEVfZmlsZV9jaHVuayA9IChCWVRFKilyZWFsbG9jKFBMVEVfZmlsZV9jaHVuaywgUExURV9maWxlX3NpemUpOworCQkJCQlpZighUExURV9maWxlX2NodW5rKSB7CisJCQkJCQlGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2MoZm9ybWF0X2lkLCAiRXJyb3Igd2hpbGUgcGFyc2luZyAlcyBjaHVuazogb3V0IG9mIG1lbW9yeSIsIG1DaHVua05hbWUpOworCQkJCQkJdGhyb3cgKGNvbnN0IGNoYXIqKU5VTEw7CisJCQkJCX0gZWxzZSB7CisJCQkJCQltT3JpZ1BvcyA9IGlvLT50ZWxsX3Byb2MoaGFuZGxlKTsKKwkJCQkJCS8vIHNlZWsgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjaHVuaworCQkJCQkJaW8tPnNlZWtfcHJvYyhoYW5kbGUsIExhc3RPZmZzZXQsIFNFRUtfU0VUKTsKKwkJCQkJCS8vIGxvYWQgdGhlIHdob2xlIGNodW5rCisJCQkJCQlpby0+cmVhZF9wcm9jKFBMVEVfZmlsZV9jaHVuaywgMSwgUExURV9maWxlX3NpemUsIGhhbmRsZSk7CisJCQkJCQkvLyBnbyB0byB0aGUgc3RhcnQgb2YgdGhlIG5leHQgY2h1bmsKKwkJCQkJCWlvLT5zZWVrX3Byb2MoaGFuZGxlLCBtT3JpZ1BvcywgU0VFS19TRVQpOworCQkJCQl9CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSB0Uk5TOgkvLyBHbG9iYWwKKwkJCQkJYnJlYWs7CisJCQkJCQorCQkJCWNhc2UgSUhEUjoKKwkJCQkJT2Zmc2V0ID0gTGFzdE9mZnNldDsKKwkJCQkJLy8gcGFyc2UgdGhlIFBORyBmaWxlIGFuZCBnZXQgaXRzIGZpbGUgc2l6ZQorCQkJCQlpZihtbmdfQ291bnRQTkdDaHVua3MoaW8sIGhhbmRsZSwgT2Zmc2V0LCAmbV9Ub3RhbEJ5dGVzT2ZDaHVua3MpID09IEZBTFNFKSB7CisJCQkJCQkvLyByZWFjaCBhbiB1bmV4cGVjdGVkIGVuZCBvZiBmaWxlCisJCQkJCQltRW5kID0gVFJVRTsKKwkJCQkJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhmb3JtYXRfaWQsICJFcnJvciB3aGlsZSBwYXJzaW5nICVzIGNodW5rOiB1bmV4cGVjdGVkIGVuZCBvZiBQTkcgZmlsZSIsIG1DaHVua05hbWUpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJCisJCQkJCS8vIHdyYXAgdGhlIHsgSUhEUiwgLi4uLCBJRU5EIH0gY2h1bmtzIGFzIGEgUE5HIHN0cmVhbQorCQkJCQlpZihoUG5nTWVtb3J5ID09IE5VTEwpIHsKKwkJCQkJCWhQbmdNZW1vcnkgPSBGcmVlSW1hZ2VfT3Blbk1lbW9yeSgpOworCQkJCQl9CisKKwkJCQkJbU9yaWdQb3MgPSBpby0+dGVsbF9wcm9jKGhhbmRsZSk7CisKKwkJCQkJLy8gd3JpdGUgUE5HIGZpbGUgc2lnbmF0dXJlCisJCQkJCUZyZWVJbWFnZV9TZWVrTWVtb3J5KGhQbmdNZW1vcnksIDAsIFNFRUtfU0VUKTsKKwkJCQkJRnJlZUltYWdlX1dyaXRlTWVtb3J5KGdfcG5nX3NpZ25hdHVyZSwgMSwgOCwgaFBuZ01lbW9yeSk7CisKKwkJCQkJbUNodW5rID0gKEJZVEUqKXJlYWxsb2MobUNodW5rLCBtX1RvdGFsQnl0ZXNPZkNodW5rcyk7CisJCQkJCWlmKCFtQ2h1bmspIHsKKwkJCQkJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhmb3JtYXRfaWQsICJFcnJvciB3aGlsZSBwYXJzaW5nICVzIGNodW5rOiBvdXQgb2YgbWVtb3J5IiwgbUNodW5rTmFtZSk7CisJCQkJCQl0aHJvdyAoY29uc3QgY2hhciopTlVMTDsKKwkJCQkJfQorCQkJCQkKKwkJCQkJLy8gb24gY2FsbGluZyBDb3VudFBOR0NodW5rcyBlYXJsaWVyLCB3ZSB3ZXJlIGluIE9mZnNldCBwb3MsCisJCQkJCS8vIGdvIGJhY2sgdGhlcmUKKwkJCQkJaW8tPnNlZWtfcHJvYyhoYW5kbGUsIE9mZnNldCwgU0VFS19TRVQpOworCQkJCQlpby0+cmVhZF9wcm9jKG1DaHVuaywgMSwgbV9Ub3RhbEJ5dGVzT2ZDaHVua3MsIGhhbmRsZSk7CisJCQkJCS8vIFB1dCBiYWNrIHRvIG9yaWdpbmFsIHBvcworCQkJCQlpby0+c2Vla19wcm9jKGhhbmRsZSwgbU9yaWdQb3MsIFNFRUtfU0VUKTsKKwkJCQkJLy8gd3JpdGUgdGhlIFBORyBjaHVua3MKKwkJCQkJRnJlZUltYWdlX1dyaXRlTWVtb3J5KG1DaHVuaywgMSwgbV9Ub3RhbEJ5dGVzT2ZDaHVua3MsIGhQbmdNZW1vcnkpOworCisJCQkJCS8vIHBsdWcgaW4gZ2xvYmFsIFBMVEUgaWYgbG9jYWwgUExURSBleGlzdHMKKwkJCQkJaWYobV9IYXNHbG9iYWxQYWxldHRlKSB7CisJCQkJCQkvLyBlbnN1cmUgd2UgcmVtb3ZlIHNvbWUgbG9jYWwgY2h1bmtzLCBzbyB0aGF0IGdsb2JhbAorCQkJCQkJLy8gIlBMVEUiIGNhbiBiZSBpbnNlcnRlZCByaWdodCBiZWZvcmUgIklEQVQiLgorCQkJCQkJbW5nX1JlbW92ZUNodW5rKGhQbmdNZW1vcnksIG1uZ19QTFRFKTsKKwkJCQkJCW1uZ19SZW1vdmVDaHVuayhoUG5nTWVtb3J5LCBtbmdfdFJOUyk7CisJCQkJCQltbmdfUmVtb3ZlQ2h1bmsoaFBuZ01lbW9yeSwgbW5nX2JLR0QpOworCQkJCQkJLy8gaW5zZXJ0IGdsb2JhbCAiUExURSIgY2h1bmsgaW4gaXRzIGVudGlyZXR5IGJlZm9yZSAiSURBVCIKKwkJCQkJCW1uZ19JbnNlcnRDaHVuayhoUG5nTWVtb3J5LCBtbmdfSURBVCwgUExURV9maWxlX2NodW5rLCBQTFRFX2ZpbGVfc2l6ZSk7CisJCQkJCX0KKworCQkJCQlpZihkaWIpIEZyZWVJbWFnZV9VbmxvYWQoZGliKTsKKwkJCQkJZGliID0gbW5nX0xvYWRGcm9tTWVtb3J5SGFuZGxlKGhQbmdNZW1vcnksIGZsYWdzKTsKKworCQkJCQkvLyBzdG9wIGFmdGVyIHRoZSBmaXJzdCBpbWFnZQorCQkJCQltRW5kID0gVFJVRTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIEpIRFI6CisJCQkJCWlmKG1MZW5ndGggPT0gMTYpIHsKKwkJCQkJCW1lbWNweSgmam5nX3dpZHRoLCAmbUNodW5rWzBdLCA0KTsKKwkJCQkJCW1lbWNweSgmam5nX2hlaWdodCwgJm1DaHVua1s0XSwgNCk7CisJCQkJCQltbmdfU3dhcExvbmcoJmpuZ193aWR0aCk7CisJCQkJCQltbmdfU3dhcExvbmcoJmpuZ19oZWlnaHQpOworCisJCQkJCQlqbmdfY29sb3JfdHlwZSA9IG1DaHVua1s4XTsKKwkJCQkJCWpuZ19pbWFnZV9zYW1wbGVfZGVwdGggPSBtQ2h1bmtbOV07CisJCQkJCQlqbmdfaW1hZ2VfY29tcHJlc3Npb25fbWV0aG9kID0gbUNodW5rWzEwXTsKKwkJCQkJCS8vQllURSBqbmdfaW1hZ2VfaW50ZXJsYWNlX21ldGhvZCA9IG1DaHVua1sxMV07CS8vIGZvciBkZWJ1ZyBvbmx5CisKKwkJCQkJCWpuZ19hbHBoYV9zYW1wbGVfZGVwdGggPSBtQ2h1bmtbMTJdOworCQkJCQkJam5nX2FscGhhX2NvbXByZXNzaW9uX21ldGhvZCA9IG1DaHVua1sxM107CisJCQkJCQlqbmdfYWxwaGFfZmlsdGVyX21ldGhvZCA9IG1DaHVua1sxNF07CisJCQkJCQlqbmdfYWxwaGFfaW50ZXJsYWNlX21ldGhvZCA9IG1DaHVua1sxNV07CisJCQkJCX0gZWxzZSB7CisJCQkJCQlGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2MoZm9ybWF0X2lkLCAiRXJyb3Igd2hpbGUgcGFyc2luZyAlcyBjaHVuazogaW52YWxpZCBjaHVuayBsZW5ndGgiLCBtQ2h1bmtOYW1lKTsKKwkJCQkJCXRocm93IChjb25zdCBjaGFyKilOVUxMOworCQkJCQl9CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBKREFUOgorCQkJCQlpZihoSnBlZ01lbW9yeSA9PSBOVUxMKSB7CisJCQkJCQloSnBlZ01lbW9yeSA9IEZyZWVJbWFnZV9PcGVuTWVtb3J5KCk7CisJCQkJCX0KKwkJCQkJLy8gYXMgdGhlcmUgbWF5IGJlIHNldmVyYWwgSkRBVCBjaHVua3MsIGNvbmNhdGVuYXRlIHRoZW0KKwkJCQkJRnJlZUltYWdlX1dyaXRlTWVtb3J5KG1DaHVuaywgMSwgbUxlbmd0aCwgaEpwZWdNZW1vcnkpOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgSURBVDoKKwkJCQkJaWYoIWhlYWRlcl9vbmx5ICYmIChqbmdfYWxwaGFfY29tcHJlc3Npb25fbWV0aG9kID09IDApKSB7CisJCQkJCQkvLyBQTkcgZ3JheXNjYWxlIElEQVQgZm9ybWF0CisJCQkJCQlpZihoSURBVE1lbW9yeSA9PSBOVUxMKSB7CisJCQkJCQkJaElEQVRNZW1vcnkgPSBGcmVlSW1hZ2VfT3Blbk1lbW9yeSgpOworCQkJCQkJCW1IYXNJREFUID0gVFJVRTsKKwkJCQkJCX0KKwkJCQkJCS8vIGFzIHRoZXJlIG1heSBiZSBzZXZlcmFsIElEQVQgY2h1bmtzLCBjb25jYXRlbmF0ZSB0aGVtCisJCQkJCQlGcmVlSW1hZ2VfV3JpdGVNZW1vcnkobUNodW5rLCAxLCBtTGVuZ3RoLCBoSURBVE1lbW9yeSk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIElFTkQ6CisJCQkJCWlmKCFoSnBlZ01lbW9yeSkgeworCQkJCQkJbUVuZCA9IFRSVUU7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQkvLyBsb2FkIHRoZSBKUEVHCisJCQkJCWlmKGRpYikgeworCQkJCQkJRnJlZUltYWdlX1VubG9hZChkaWIpOworCQkJCQl9CisJCQkJCWRpYiA9IG1uZ19Mb2FkRnJvbU1lbW9yeUhhbmRsZShoSnBlZ01lbW9yeSwgZmxhZ3MpOworCisJCQkJCS8vIGxvYWQgdGhlIFBORyBhbHBoYSBsYXllcgorCQkJCQlpZihtSGFzSURBVCkgeworCQkJCQkJQllURSAqZGF0YSA9IE5VTEw7CisJCQkJCQlEV09SRCBzaXplX2luX2J5dGVzID0gMDsKKworCQkJCQkJLy8gZ2V0IGEgcG9pbnRlciB0byB0aGUgSURBVCBidWZmZXIKKwkJCQkJCUZyZWVJbWFnZV9BY3F1aXJlTWVtb3J5KGhJREFUTWVtb3J5LCAmZGF0YSwgJnNpemVfaW5fYnl0ZXMpOworCQkJCQkJaWYoZGF0YSAmJiBzaXplX2luX2J5dGVzKSB7CisJCQkJCQkJLy8gd3JhcCB0aGUgSURBVCBjaHVuayBhcyBhIFBORyBzdHJlYW0KKwkJCQkJCQlpZihoUG5nTWVtb3J5ID09IE5VTEwpIHsKKwkJCQkJCQkJaFBuZ01lbW9yeSA9IEZyZWVJbWFnZV9PcGVuTWVtb3J5KCk7CisJCQkJCQkJfQorCQkJCQkJCW1uZ19Xcml0ZVBOR1N0cmVhbShqbmdfd2lkdGgsIGpuZ19oZWlnaHQsIGpuZ19hbHBoYV9zYW1wbGVfZGVwdGgsIGRhdGEsIHNpemVfaW5fYnl0ZXMsIGhQbmdNZW1vcnkpOworCQkJCQkJCS8vIGxvYWQgdGhlIFBORworCQkJCQkJCWlmKGRpYl9hbHBoYSkgeworCQkJCQkJCQlGcmVlSW1hZ2VfVW5sb2FkKGRpYl9hbHBoYSk7CisJCQkJCQkJfQorCQkJCQkJCWRpYl9hbHBoYSA9IG1uZ19Mb2FkRnJvbU1lbW9yeUhhbmRsZShoUG5nTWVtb3J5LCBmbGFncyk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJLy8gc3RvcCB0aGUgcGFyc2luZworCQkJCQltRW5kID0gVFJVRTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIEpEQUE6CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBnQU1BOgorCQkJCQlicmVhazsKKworCQkJCWNhc2UgcEhZczoKKwkJCQkJLy8gdW5pdCBpcyBwaXhlbHMgcGVyIG1ldGVyCisJCQkJCW1lbWNweSgmcmVzX3gsICZtQ2h1bmtbMF0sIDQpOworCQkJCQltbmdfU3dhcExvbmcoJnJlc194KTsKKwkJCQkJbWVtY3B5KCZyZXNfeSwgJm1DaHVua1s0XSwgNCk7CisJCQkJCW1uZ19Td2FwTG9uZygmcmVzX3kpOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgYktHRDoKKwkJCQkJbWVtY3B5KCZia19yZWQsICZtQ2h1bmtbMF0sIDIpOworCQkJCQltbmdfU3dhcFNob3J0KCZia19yZWQpOworCQkJCQlyZ2JCa0NvbG9yLnJnYlJlZCA9IChCWVRFKWJrX3JlZDsKKwkJCQkJbWVtY3B5KCZia19ncmVlbiwgJm1DaHVua1syXSwgMik7CisJCQkJCW1uZ19Td2FwU2hvcnQoJmJrX2dyZWVuKTsKKwkJCQkJcmdiQmtDb2xvci5yZ2JHcmVlbiA9IChCWVRFKWJrX2dyZWVuOworCQkJCQltZW1jcHkoJmJrX2JsdWUsICZtQ2h1bmtbNF0sIDIpOworCQkJCQltbmdfU3dhcFNob3J0KCZia19ibHVlKTsKKwkJCQkJcmdiQmtDb2xvci5yZ2JCbHVlID0gKEJZVEUpYmtfYmx1ZTsKKwkJCQkJaGFzQmtDb2xvciA9IFRSVUU7CisJCQkJCWJyZWFrOworCQkJCQorCQkJCWNhc2UgdEVYdDoKKwkJCQkJbW5nX1NldE1ldGFkYXRhX3RFWHQoa2V5X3ZhbHVlX3BhaXIsIG1DaHVuaywgbUxlbmd0aCk7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBVTktOT1dOX0NIVU5DSzoKKwkJCQlkZWZhdWx0OgorCQkJCQlicmVhazsKKworCisJCQl9IC8vIHN3aXRjaCggR2V0Q2h1bmNrVHlwZSApCisJCX0gLy8gd2hpbGUoIW1FbmQpCisKKwkJRnJlZUltYWdlX0Nsb3NlTWVtb3J5KGhKcGVnTWVtb3J5KTsKKwkJRnJlZUltYWdlX0Nsb3NlTWVtb3J5KGhQbmdNZW1vcnkpOworCQlGcmVlSW1hZ2VfQ2xvc2VNZW1vcnkoaElEQVRNZW1vcnkpOworCQlmcmVlKG1DaHVuayk7CisJCWZyZWUoUExURV9maWxlX2NodW5rKTsKKworCQkvLyBjb252ZXJ0IHRvIDMyLWJpdCBpZiBhIHRyYW5zcGFyZW50IGxheWVyIGlzIGF2YWlsYWJsZQorCQlpZighaGVhZGVyX29ubHkgJiYgZGliX2FscGhhKSB7CisJCQlGSUJJVE1BUCAqZHN0ID0gRnJlZUltYWdlX0NvbnZlcnRUbzMyQml0cyhkaWIpOworCQkJaWYoKEZyZWVJbWFnZV9HZXRCUFAoZGliX2FscGhhKSA9PSA4KSAmJiAoRnJlZUltYWdlX0dldEltYWdlVHlwZShkaWJfYWxwaGEpID09IEZJVF9CSVRNQVApKSB7CisJCQkJRnJlZUltYWdlX1NldENoYW5uZWwoZHN0LCBkaWJfYWxwaGEsIEZJQ0NfQUxQSEEpOworCQkJfSBlbHNlIHsKKwkJCQlGSUJJVE1BUCAqZHN0X2FscGhhID0gRnJlZUltYWdlX0NvbnZlcnRUbzhCaXRzKGRpYl9hbHBoYSk7CisJCQkJRnJlZUltYWdlX1NldENoYW5uZWwoZHN0LCBkc3RfYWxwaGEsIEZJQ0NfQUxQSEEpOworCQkJCUZyZWVJbWFnZV9VbmxvYWQoZHN0X2FscGhhKTsKKwkJCX0JCQkKKwkJCUZyZWVJbWFnZV9VbmxvYWQoZGliKTsKKwkJCWRpYiA9IGRzdDsKKwkJfQorCQlGcmVlSW1hZ2VfVW5sb2FkKGRpYl9hbHBoYSk7CisKKwkJaWYoZGliKSB7CisJCQkvLyBzZXQgbWV0YWRhdGEKKwkJCUZyZWVJbWFnZV9TZXREb3RzUGVyTWV0ZXJYKGRpYiwgcmVzX3gpOworCQkJRnJlZUltYWdlX1NldERvdHNQZXJNZXRlclkoZGliLCByZXNfeSk7CisJCQlpZihoYXNCa0NvbG9yKSB7CisJCQkJRnJlZUltYWdlX1NldEJhY2tncm91bmRDb2xvcihkaWIsICZyZ2JCa0NvbG9yKTsKKwkJCX0KKwkJCWlmKGtleV92YWx1ZV9wYWlyLnNpemUoKSkgeworCQkJCWZvcih0RVh0TUFQOjppdGVyYXRvciBqID0ga2V5X3ZhbHVlX3BhaXIuYmVnaW4oKTsgaiAhPSBrZXlfdmFsdWVfcGFpci5lbmQoKTsgaisrKSB7CisJCQkJCXN0ZDo6c3RyaW5nIGtleSA9ICgqaikuZmlyc3Q7CisJCQkJCXN0ZDo6c3RyaW5nIHZhbHVlID0gKCpqKS5zZWNvbmQ7CisJCQkJCW1uZ19TZXRLZXlWYWx1ZShGSU1EX0NPTU1FTlRTLCBkaWIsIGtleS5jX3N0cigpLCB2YWx1ZS5jX3N0cigpKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJCQorCQlyZXR1cm4gZGliOworCisJfSBjYXRjaChjb25zdCBjaGFyICp0ZXh0KSB7CisJCUZyZWVJbWFnZV9DbG9zZU1lbW9yeShoSnBlZ01lbW9yeSk7CisJCUZyZWVJbWFnZV9DbG9zZU1lbW9yeShoUG5nTWVtb3J5KTsKKwkJRnJlZUltYWdlX0Nsb3NlTWVtb3J5KGhJREFUTWVtb3J5KTsKKwkJZnJlZShtQ2h1bmspOworCQlmcmVlKFBMVEVfZmlsZV9jaHVuayk7CisJCUZyZWVJbWFnZV9VbmxvYWQoZGliKTsKKwkJRnJlZUltYWdlX1VubG9hZChkaWJfYWxwaGEpOworCQlpZih0ZXh0KSB7CisJCQlGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2MoZm9ybWF0X2lkLCB0ZXh0KTsKKwkJfQorCQlyZXR1cm4gTlVMTDsKKwl9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qKgorV3JpdGUgYSBGSUJJVE1BUCB0byBhIEpORyBzdHJlYW0KK0BwYXJhbSBmb3JtYXRfaWQgSUQgb2YgdGhlIGNhbGxlcgorQHBhcmFtIGlvIFN0cmVhbSBpL28gZnVuY3Rpb25zCitAcGFyYW0gZGliIEltYWdlIHRvIGJlIHNhdmVkCitAcGFyYW0gaGFuZGxlIFN0cmVhbSBoYW5kbGUKK0BwYXJhbSBmbGFncyBTYXZpbmcgZmxhZ3MKK0ByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgRkFMU0Ugb3RoZXJ3aXNlCisqLworQk9PTCAKK21uZ19Xcml0ZUpORyhpbnQgZm9ybWF0X2lkLCBGcmVlSW1hZ2VJTyAqaW8sIEZJQklUTUFQICpkaWIsIGZpX2hhbmRsZSBoYW5kbGUsIGludCBmbGFncykgeworCURXT1JEIGpuZ193aWR0aCA9IDA7CisJRFdPUkQgam5nX2hlaWdodCA9IDA7CisJQllURSBqbmdfY29sb3JfdHlwZSA9IDA7CisJQllURSBqbmdfaW1hZ2Vfc2FtcGxlX2RlcHRoID0gODsKKwlCWVRFIGpuZ19pbWFnZV9jb21wcmVzc2lvbl9tZXRob2QgPSA4OwkvLyAgODogSVNPLTEwOTE4LTEgSHVmZm1hbi1jb2RlZCBiYXNlbGluZSBKUEVHLgorCUJZVEUgam5nX2ltYWdlX2ludGVybGFjZV9tZXRob2QgPSAwOworCisJQllURSBqbmdfYWxwaGFfc2FtcGxlX2RlcHRoID0gMDsKKwlCWVRFIGpuZ19hbHBoYV9jb21wcmVzc2lvbl9tZXRob2QgPSAwOworCUJZVEUgam5nX2FscGhhX2ZpbHRlcl9tZXRob2QgPSAwOworCUJZVEUgam5nX2FscGhhX2ludGVybGFjZV9tZXRob2QgPSAwOworCisJQllURSBidWZmZXJbMTZdOworCisJRklNRU1PUlkgKmhKbmdNZW1vcnkgPSBOVUxMOworCUZJTUVNT1JZICpoSnBlZ01lbW9yeSA9IE5VTEw7CisJRklNRU1PUlkgKmhQbmdNZW1vcnkgPSBOVUxMOworCisJRklCSVRNQVAgKmRpYl9yZ2IgPSBOVUxMOworCUZJQklUTUFQICpkaWJfYWxwaGEgPSBOVUxMOworCisJaWYoIWRpYiB8fCAoRnJlZUltYWdlX0dldEltYWdlVHlwZShkaWIpICE9IEZJVF9CSVRNQVApKSB7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwl1bnNpZ25lZCBicHAgPSBGcmVlSW1hZ2VfR2V0QlBQKGRpYik7CisKKwlzd2l0Y2goYnBwKSB7CisJCWNhc2UgODoKKwkJCWlmKEZyZWVJbWFnZV9HZXRDb2xvclR5cGUoZGliKSA9PSBGSUNfTUlOSVNCTEFDSykgeworCQkJCWRpYl9yZ2IgPSBkaWI7CisJCQkJam5nX2NvbG9yX3R5cGUgPSBNTkdfQ09MT1JUWVBFX0pQRUdHUkFZOworCQkJfSBlbHNlIHsKKwkJCQkvLyBKUEVHIHBsdWdpbiB3aWxsIGNvbnZlcnQgb3RoZXIgdHlwZXMgKEZJQ19NSU5JU1dISVRFLCBGSUNfUEFMRVRURSkgdG8gMjQtYml0IG9uIHRoZSBmbHkKKwkJCQkvL2RpYl9yZ2IgPSBGcmVlSW1hZ2VfQ29udmVydFRvMjRCaXRzKGRpYik7CisJCQkJZGliX3JnYiA9IGRpYjsKKwkJCQlqbmdfY29sb3JfdHlwZSA9IE1OR19DT0xPUlRZUEVfSlBFR0NPTE9SOworCisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAyNDoKKwkJCWRpYl9yZ2IgPSBkaWI7CisJCQlqbmdfY29sb3JfdHlwZSA9IE1OR19DT0xPUlRZUEVfSlBFR0NPTE9SOworCQkJYnJlYWs7CisJCWNhc2UgMzI6CisJCQlkaWJfcmdiID0gRnJlZUltYWdlX0NvbnZlcnRUbzI0Qml0cyhkaWIpOworCQkJam5nX2NvbG9yX3R5cGUgPSBNTkdfQ09MT1JUWVBFX0pQRUdDT0xPUkE7CisJCQlqbmdfYWxwaGFfc2FtcGxlX2RlcHRoID0gODsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIEZBTFNFOworCX0KKworCWpuZ193aWR0aCA9IChEV09SRClGcmVlSW1hZ2VfR2V0V2lkdGgoZGliKTsKKwlqbmdfaGVpZ2h0ID0gKERXT1JEKUZyZWVJbWFnZV9HZXRIZWlnaHQoZGliKTsKKworCXRyeSB7CisJCWhKbmdNZW1vcnkgPSBGcmVlSW1hZ2VfT3Blbk1lbW9yeSgpOworCisJCS8vIC0tLSB3cml0ZSBKTkcgZmlsZSBzaWduYXR1cmUgLS0tCisJCUZyZWVJbWFnZV9Xcml0ZU1lbW9yeShnX2puZ19zaWduYXR1cmUsIDEsIDgsIGhKbmdNZW1vcnkpOworCisJCS8vIC0tLSB3cml0ZSBhIEpIRFIgY2h1bmsgLS0tCisJCVN3YXBMb25nKCZqbmdfd2lkdGgpOworCQlTd2FwTG9uZygmam5nX2hlaWdodCk7CisJCW1lbWNweSgmYnVmZmVyWzBdLCAmam5nX3dpZHRoLCA0KTsKKwkJbWVtY3B5KCZidWZmZXJbNF0sICZqbmdfaGVpZ2h0LCA0KTsKKwkJU3dhcExvbmcoJmpuZ193aWR0aCk7CisJCVN3YXBMb25nKCZqbmdfaGVpZ2h0KTsKKwkJYnVmZmVyWzhdID0gam5nX2NvbG9yX3R5cGU7CisJCWJ1ZmZlcls5XSA9IGpuZ19pbWFnZV9zYW1wbGVfZGVwdGg7CisJCWJ1ZmZlclsxMF0gPSBqbmdfaW1hZ2VfY29tcHJlc3Npb25fbWV0aG9kOworCQlidWZmZXJbMTFdID0gam5nX2ltYWdlX2ludGVybGFjZV9tZXRob2Q7CisJCWJ1ZmZlclsxMl0gPSBqbmdfYWxwaGFfc2FtcGxlX2RlcHRoOworCQlidWZmZXJbMTNdID0gam5nX2FscGhhX2NvbXByZXNzaW9uX21ldGhvZDsKKwkJYnVmZmVyWzE0XSA9IGpuZ19hbHBoYV9maWx0ZXJfbWV0aG9kOworCQlidWZmZXJbMTVdID0gam5nX2FscGhhX2ludGVybGFjZV9tZXRob2Q7CisJCW1uZ19Xcml0ZUNodW5rKG1uZ19KSERSLCAmYnVmZmVyWzBdLCAxNiwgaEpuZ01lbW9yeSk7CisKKwkJLy8gLS0tIHdyaXRlIGEgc2VxdWVuY2Ugb2YgSkRBVCBjaHVua3MgLS0tCisJCWhKcGVnTWVtb3J5ID0gRnJlZUltYWdlX09wZW5NZW1vcnkoKTsKKwkJZmxhZ3MgfD0gSlBFR19CQVNFTElORTsKKwkJaWYoIUZyZWVJbWFnZV9TYXZlVG9NZW1vcnkoRklGX0pQRUcsIGRpYl9yZ2IsIGhKcGVnTWVtb3J5LCBmbGFncykpIHsKKwkJCXRocm93IChjb25zdCBjaGFyKilOVUxMOworCQl9CisJCWlmKGRpYl9yZ2IgIT0gZGliKSB7CisJCQlGcmVlSW1hZ2VfVW5sb2FkKGRpYl9yZ2IpOworCQkJZGliX3JnYiA9IE5VTEw7CisJCX0KKwkJeworCQkJQllURSAqanBlZ19kYXRhID0gTlVMTDsKKwkJCURXT1JEIHNpemVfaW5fYnl0ZXMgPSAwOworCQkJCisJCQkvLyBnZXQgYSBwb2ludGVyIHRvIHRoZSBzdHJlYW0gYnVmZmVyCisJCQlGcmVlSW1hZ2VfQWNxdWlyZU1lbW9yeShoSnBlZ01lbW9yeSwgJmpwZWdfZGF0YSwgJnNpemVfaW5fYnl0ZXMpOworCQkJLy8gd3JpdGUgY2h1bmtzCisJCQlmb3IoRFdPUkQgayA9IDA7IGsgPCBzaXplX2luX2J5dGVzOykgeworCQkJCURXT1JEIGJ5dGVzX2xlZnQgPSBzaXplX2luX2J5dGVzIC0gazsKKwkJCQlEV09SRCBjaHVua19zaXplID0gTUlOKEpQRUdfQ0hVTktfU0laRSwgYnl0ZXNfbGVmdCk7CisJCQkJbW5nX1dyaXRlQ2h1bmsobW5nX0pEQVQsICZqcGVnX2RhdGFba10sIGNodW5rX3NpemUsIGhKbmdNZW1vcnkpOworCQkJCWsgKz0gY2h1bmtfc2l6ZTsKKwkJCX0KKwkJfQorCQlGcmVlSW1hZ2VfQ2xvc2VNZW1vcnkoaEpwZWdNZW1vcnkpOworCQloSnBlZ01lbW9yeSA9IE5VTEw7CisKKwkJLy8gLS0tIHdyaXRlIGFscGhhIGxheWVyIGFzIGEgc2VxdWVuY2Ugb2YgSURBVCBjaHVuayAtLS0KKwkJaWYoKGJwcCA9PSAzMikgJiYgKGpuZ19jb2xvcl90eXBlID09IE1OR19DT0xPUlRZUEVfSlBFR0NPTE9SQSkpIHsKKwkJCWRpYl9hbHBoYSA9IEZyZWVJbWFnZV9HZXRDaGFubmVsKGRpYiwgRklDQ19BTFBIQSk7CisKKwkJCWhQbmdNZW1vcnkgPSBGcmVlSW1hZ2VfT3Blbk1lbW9yeSgpOworCQkJaWYoIUZyZWVJbWFnZV9TYXZlVG9NZW1vcnkoRklGX1BORywgZGliX2FscGhhLCBoUG5nTWVtb3J5LCBQTkdfREVGQVVMVCkpIHsKKwkJCQl0aHJvdyAoY29uc3QgY2hhciopTlVMTDsKKwkJCX0KKwkJCUZyZWVJbWFnZV9VbmxvYWQoZGliX2FscGhhKTsKKwkJCWRpYl9hbHBoYSA9IE5VTEw7CisJCQkvLyBnZXQgdGhlIElEQVQgY2h1bmsKKwkJCXsJCQorCQkJCUJPT0wgYlJlc3VsdCA9IEZBTFNFOworCQkJCURXT1JEIHN0YXJ0X3BvcyA9IDA7CisJCQkJRFdPUkQgbmV4dF9wb3MgPSAwOworCQkJCWxvbmcgb2Zmc2V0ID0gODsKKwkJCQkKKwkJCQlkbyB7CisJCQkJCS8vIGZpbmQgdGhlIG5leHQgSURBVCBjaHVuayBmcm9tICdvZmZzZXQnIHBvc2l0aW9uCisJCQkJCWJSZXN1bHQgPSBtbmdfRmluZENodW5rKGhQbmdNZW1vcnksIG1uZ19JREFULCBvZmZzZXQsICZzdGFydF9wb3MsICZuZXh0X3Bvcyk7CisJCQkJCWlmKCFiUmVzdWx0KSBicmVhazsKKwkJCQkJCisJCQkJCUJZVEUgKnBuZ19kYXRhID0gTlVMTDsKKwkJCQkJRFdPUkQgc2l6ZV9pbl9ieXRlcyA9IDA7CisJCQkJCQorCQkJCQkvLyBnZXQgYSBwb2ludGVyIHRvIHRoZSBzdHJlYW0gYnVmZmVyCisJCQkJCUZyZWVJbWFnZV9BY3F1aXJlTWVtb3J5KGhQbmdNZW1vcnksICZwbmdfZGF0YSwgJnNpemVfaW5fYnl0ZXMpOworCQkJCQkvLyB3cml0ZSB0aGUgSURBVCBjaHVuaworCQkJCQltbmdfV3JpdGVDaHVuayhtbmdfSURBVCwgJnBuZ19kYXRhW3N0YXJ0X3Bvcys4XSwgbmV4dF9wb3MgLSBzdGFydF9wb3MgLSAxMiwgaEpuZ01lbW9yeSk7CisKKwkJCQkJb2Zmc2V0ID0gbmV4dF9wb3M7CisKKwkJCQl9IHdoaWxlKGJSZXN1bHQpOworCQkJfQorCisJCQlGcmVlSW1hZ2VfQ2xvc2VNZW1vcnkoaFBuZ01lbW9yeSk7CisJCQloUG5nTWVtb3J5ID0gTlVMTDsKKwkJfQorCisJCS8vIC0tLSB3cml0ZSBhIElFTkQgY2h1bmsgLS0tCisJCW1uZ19Xcml0ZUNodW5rKG1uZ19JRU5ELCBOVUxMLCAwLCBoSm5nTWVtb3J5KTsKKworCQkvLyB3cml0ZSB0aGUgSk5HIG9uIG91dHB1dCBzdHJlYW0KKwkJeworCQkJQllURSAqam5nX2RhdGEgPSBOVUxMOworCQkJRFdPUkQgc2l6ZV9pbl9ieXRlcyA9IDA7CisJCQlGcmVlSW1hZ2VfQWNxdWlyZU1lbW9yeShoSm5nTWVtb3J5LCAmam5nX2RhdGEsICZzaXplX2luX2J5dGVzKTsKKwkJCWlvLT53cml0ZV9wcm9jKGpuZ19kYXRhLCAxLCBzaXplX2luX2J5dGVzLCBoYW5kbGUpOwkJCQorCQl9CisKKwkJRnJlZUltYWdlX0Nsb3NlTWVtb3J5KGhKbmdNZW1vcnkpOworCQlGcmVlSW1hZ2VfQ2xvc2VNZW1vcnkoaEpwZWdNZW1vcnkpOworCQlGcmVlSW1hZ2VfQ2xvc2VNZW1vcnkoaFBuZ01lbW9yeSk7CisKKwkJcmV0dXJuIFRSVUU7CisKKwl9IGNhdGNoKGNvbnN0IGNoYXIgKnRleHQpIHsKKwkJRnJlZUltYWdlX0Nsb3NlTWVtb3J5KGhKbmdNZW1vcnkpOworCQlGcmVlSW1hZ2VfQ2xvc2VNZW1vcnkoaEpwZWdNZW1vcnkpOworCQlGcmVlSW1hZ2VfQ2xvc2VNZW1vcnkoaFBuZ01lbW9yeSk7CisJCWlmKGRpYl9yZ2IgJiYgKGRpYl9yZ2IgIT0gZGliKSkgeworCQkJRnJlZUltYWdlX1VubG9hZChkaWJfcmdiKTsKKwkJfQorCQlGcmVlSW1hZ2VfVW5sb2FkKGRpYl9hbHBoYSk7CisJCWlmKHRleHQpIHsKKwkJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhmb3JtYXRfaWQsIHRleHQpOworCQl9CisJCXJldHVybiBGQUxTRTsKKwl9Cit9CmRpZmYgLS1naXQgYS9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL01lbW9yeUlPLmNwcCBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvTWVtb3J5SU8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwOTk3ODUKLS0tIC9kZXYvbnVsbAorKysgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL01lbW9yeUlPLmNwcApAQCAtMCwwICsxLDIzNyBAQAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gTWVtb3J5IElucHV0L091dHB1dCBmdW5jdGlvbnMKKy8vCisvLyBEZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIGJ5CisvLyAtIFJ5YW4gUnVibGV5IDxyeWFuQGxvc3RyZWFsaXR5Lm9yZz4gCisvLyAtIEhlcnbpIERyb2xvbiAoZHJvbG9uQGluZm9uaWUuZnIpCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRnJlZUltYWdlIDMKKy8vCisvLyBDT1ZFUkVEIENPREUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkKKy8vIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTCisvLyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy8vIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVECisvLyBDT0RFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UCisvLyBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWQorLy8gU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTAorLy8gUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUgorLy8gVEhJUyBESVNDTEFJTUVSLgorLy8KKy8vIFVzZSBhdCB5b3VyIG93biByaXNrIQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaW5jbHVkZSAiRnJlZUltYWdlLmgiCisjaW5jbHVkZSAiVXRpbGl0aWVzLmgiCisjaW5jbHVkZSAiRnJlZUltYWdlSU8uaCIKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBPcGVuIGFuZCBjbG9zZSBhIG1lbW9yeSBoYW5kbGUKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitGSU1FTU9SWSAqIERMTF9DQUxMQ09OViAKK0ZyZWVJbWFnZV9PcGVuTWVtb3J5KEJZVEUgKmRhdGEsIERXT1JEIHNpemVfaW5fYnl0ZXMpIHsKKwkvLyBhbGxvY2F0ZSBhIG1lbW9yeSBoYW5kbGUKKwlGSU1FTU9SWSAqc3RyZWFtID0gKEZJTUVNT1JZKiltYWxsb2Moc2l6ZW9mKEZJTUVNT1JZKSk7CisJaWYoc3RyZWFtKSB7CisJCXN0cmVhbS0+ZGF0YSA9IChCWVRFKiltYWxsb2Moc2l6ZW9mKEZJTUVNT1JZSEVBREVSKSk7CisKKwkJaWYoc3RyZWFtLT5kYXRhKSB7CisJCQlGSU1FTU9SWUhFQURFUiAqbWVtX2hlYWRlciA9IChGSU1FTU9SWUhFQURFUiopKHN0cmVhbS0+ZGF0YSk7CisKKwkJCS8vIGluaXRpYWxpemUgdGhlIG1lbW9yeSBoZWFkZXIKKwkJCW1lbXNldChtZW1faGVhZGVyLCAwLCBzaXplb2YoRklNRU1PUllIRUFERVIpKTsKKwkJCQorCQkJaWYoZGF0YSAmJiBzaXplX2luX2J5dGVzKSB7CisJCQkJLy8gd3JhcCBhIHVzZXIgYnVmZmVyCisJCQkJbWVtX2hlYWRlci0+ZGVsZXRlX21lID0gRkFMU0U7CisJCQkJbWVtX2hlYWRlci0+ZGF0YSA9IChCWVRFKilkYXRhOworCQkJCW1lbV9oZWFkZXItPmRhdGFfbGVuZ3RoID0gbWVtX2hlYWRlci0+ZmlsZV9sZW5ndGggPSBzaXplX2luX2J5dGVzOworCQkJfSBlbHNlIHsKKwkJCQltZW1faGVhZGVyLT5kZWxldGVfbWUgPSBUUlVFOworCQkJfQorCisJCQlyZXR1cm4gc3RyZWFtOworCQl9CisJCWZyZWUoc3RyZWFtKTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworCit2b2lkIERMTF9DQUxMQ09OVgorRnJlZUltYWdlX0Nsb3NlTWVtb3J5KEZJTUVNT1JZICpzdHJlYW0pIHsKKwlpZihzdHJlYW0gJiYgc3RyZWFtLT5kYXRhKSB7CisJCUZJTUVNT1JZSEVBREVSICptZW1faGVhZGVyID0gKEZJTUVNT1JZSEVBREVSKikoc3RyZWFtLT5kYXRhKTsKKwkJaWYobWVtX2hlYWRlci0+ZGVsZXRlX21lKSB7CisJCQlmcmVlKG1lbV9oZWFkZXItPmRhdGEpOworCQl9CisJCWZyZWUobWVtX2hlYWRlcik7CisJCWZyZWUoc3RyZWFtKTsKKwl9Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gTWVtb3J5IHN0cmVhbSBsb2FkL3NhdmUgZnVuY3Rpb25zCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworRklCSVRNQVAgKiBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9Mb2FkRnJvbU1lbW9yeShGUkVFX0lNQUdFX0ZPUk1BVCBmaWYsIEZJTUVNT1JZICpzdHJlYW0sIGludCBmbGFncykgeworCWlmIChzdHJlYW0gJiYgc3RyZWFtLT5kYXRhKSB7CisJCUZyZWVJbWFnZUlPIGlvOworCQlTZXRNZW1vcnlJTygmaW8pOworCisJCXJldHVybiBGcmVlSW1hZ2VfTG9hZEZyb21IYW5kbGUoZmlmLCAmaW8sIChmaV9oYW5kbGUpc3RyZWFtLCBmbGFncyk7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKworQk9PTCBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9TYXZlVG9NZW1vcnkoRlJFRV9JTUFHRV9GT1JNQVQgZmlmLCBGSUJJVE1BUCAqZGliLCBGSU1FTU9SWSAqc3RyZWFtLCBpbnQgZmxhZ3MpIHsKKwlpZiAoc3RyZWFtKSB7CisJCUZyZWVJbWFnZUlPIGlvOworCQlTZXRNZW1vcnlJTygmaW8pOworCisJCUZJTUVNT1JZSEVBREVSICptZW1faGVhZGVyID0gKEZJTUVNT1JZSEVBREVSKikoc3RyZWFtLT5kYXRhKTsKKworCQlpZihtZW1faGVhZGVyLT5kZWxldGVfbWUgPT0gVFJVRSkgeworCQkJcmV0dXJuIEZyZWVJbWFnZV9TYXZlVG9IYW5kbGUoZmlmLCBkaWIsICZpbywgKGZpX2hhbmRsZSlzdHJlYW0sIGZsYWdzKTsKKwkJfSBlbHNlIHsKKwkJCS8vIGRvIG5vdCBzYXZlIGluIGEgdXNlciBidWZmZXIKKwkJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhmaWYsICJNZW1vcnkgYnVmZmVyIGlzIHJlYWQgb25seSIpOworCQl9CisJfQorCisJcmV0dXJuIEZBTFNFOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIE1lbW9yeSBzdHJlYW0gYnVmZmVyIGFjY2VzcworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0JPT0wgRExMX0NBTExDT05WCitGcmVlSW1hZ2VfQWNxdWlyZU1lbW9yeShGSU1FTU9SWSAqc3RyZWFtLCBCWVRFICoqZGF0YSwgRFdPUkQgKnNpemVfaW5fYnl0ZXMpIHsKKwlpZiAoc3RyZWFtKSB7CisJCUZJTUVNT1JZSEVBREVSICptZW1faGVhZGVyID0gKEZJTUVNT1JZSEVBREVSKikoc3RyZWFtLT5kYXRhKTsKKworCQkqZGF0YSA9IChCWVRFKiltZW1faGVhZGVyLT5kYXRhOworCQkqc2l6ZV9pbl9ieXRlcyA9IG1lbV9oZWFkZXItPmZpbGVfbGVuZ3RoOworCQlyZXR1cm4gVFJVRTsKKwl9CisKKwlyZXR1cm4gRkFMU0U7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gTWVtb3J5IHN0cmVhbSBmaWxlIHR5cGUgYWNjZXNzCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworRlJFRV9JTUFHRV9GT1JNQVQgRExMX0NBTExDT05WCitGcmVlSW1hZ2VfR2V0RmlsZVR5cGVGcm9tTWVtb3J5KEZJTUVNT1JZICpzdHJlYW0sIGludCBzaXplKSB7CisJRnJlZUltYWdlSU8gaW87CisJU2V0TWVtb3J5SU8oJmlvKTsKKworCWlmIChzdHJlYW0gIT0gTlVMTCkgeworCQlyZXR1cm4gRnJlZUltYWdlX0dldEZpbGVUeXBlRnJvbUhhbmRsZSgmaW8sIChmaV9oYW5kbGUpc3RyZWFtLCBzaXplKTsKKwl9CisKKwlyZXR1cm4gRklGX1VOS05PV047Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gU2Vla2luZyBpbiBNZW1vcnkgc3RyZWFtCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLyoqCitNb3ZlcyB0aGUgbWVtb3J5IHBvaW50ZXIgdG8gYSBzcGVjaWZpZWQgbG9jYXRpb24KK0BwYXJhbSBzdHJlYW0gUG9pbnRlciB0byBGSU1FTU9SWSBzdHJ1Y3R1cmUKK0BwYXJhbSBvZmZzZXQgTnVtYmVyIG9mIGJ5dGVzIGZyb20gb3JpZ2luCitAcGFyYW0gb3JpZ2luIEluaXRpYWwgcG9zaXRpb24KK0ByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgRkFMU0Ugb3RoZXJ3aXNlCisqLworQk9PTCBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9TZWVrTWVtb3J5KEZJTUVNT1JZICpzdHJlYW0sIGxvbmcgb2Zmc2V0LCBpbnQgb3JpZ2luKSB7CisJRnJlZUltYWdlSU8gaW87CisJU2V0TWVtb3J5SU8oJmlvKTsKKworCWlmIChzdHJlYW0gIT0gTlVMTCkgeworCQlpbnQgc3VjY2VzcyA9IGlvLnNlZWtfcHJvYygoZmlfaGFuZGxlKXN0cmVhbSwgb2Zmc2V0LCBvcmlnaW4pOworCQlyZXR1cm4gKHN1Y2Nlc3MgPT0gMCkgPyBUUlVFIDogRkFMU0U7CisJfQorCisJcmV0dXJuIEZBTFNFOworfQorCisvKioKK0dldHMgdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgYSBtZW1vcnkgcG9pbnRlcgorQHBhcmFtIHN0cmVhbSBUYXJnZXQgRklNRU1PUlkgc3RydWN0dXJlCitAcmV0dXJuIFJldHVybnMgdGhlIGN1cnJlbnQgZmlsZSBwb3NpdGlvbiBpZiBzdWNjZXNzZnVsLCAtMSBvdGhlcndpc2UKKyovCitsb25nIERMTF9DQUxMQ09OVgorRnJlZUltYWdlX1RlbGxNZW1vcnkoRklNRU1PUlkgKnN0cmVhbSkgeworCUZyZWVJbWFnZUlPIGlvOworCVNldE1lbW9yeUlPKCZpbyk7CisKKwlpZiAoc3RyZWFtICE9IE5VTEwpIHsKKwkJcmV0dXJuIGlvLnRlbGxfcHJvYygoZmlfaGFuZGxlKXN0cmVhbSk7CisJfQorCisJcmV0dXJuIC0xTDsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBSZWFkaW5nIG9yIFdyaXRpbmcgaW4gTWVtb3J5IHN0cmVhbQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8qKgorUmVhZHMgZGF0YSBmcm9tIGEgbWVtb3J5IHN0cmVhbQorQHBhcmFtIGJ1ZmZlciBTdG9yYWdlIGxvY2F0aW9uIGZvciBkYXRhCitAcGFyYW0gc2l6ZSBJdGVtIHNpemUgaW4gYnl0ZXMKK0BwYXJhbSBjb3VudCBNYXhpbXVtIG51bWJlciBvZiBpdGVtcyB0byBiZSByZWFkCitAcGFyYW0gc3RyZWFtIFBvaW50ZXIgdG8gRklNRU1PUlkgc3RydWN0dXJlCitAcmV0dXJuIFJldHVybnMgdGhlIG51bWJlciBvZiBmdWxsIGl0ZW1zIGFjdHVhbGx5IHJlYWQsIHdoaWNoIG1heSBiZSBsZXNzIHRoYW4gY291bnQgaWYgYW4gZXJyb3Igb2NjdXJzCisqLwordW5zaWduZWQgRExMX0NBTExDT05WIAorRnJlZUltYWdlX1JlYWRNZW1vcnkodm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBzaXplLCB1bnNpZ25lZCBjb3VudCwgRklNRU1PUlkgKnN0cmVhbSkgeworCUZyZWVJbWFnZUlPIGlvOworCVNldE1lbW9yeUlPKCZpbyk7CisKKwlpZiAoc3RyZWFtICE9IE5VTEwpIHsKKwkJcmV0dXJuIGlvLnJlYWRfcHJvYyhidWZmZXIsIHNpemUsIGNvdW50LCBzdHJlYW0pOworCX0KKworCXJldHVybiAwOworfQorCisvKioKK1dyaXRlcyBkYXRhIHRvIGEgbWVtb3J5IHN0cmVhbS4KK0BwYXJhbSBidWZmZXIgUG9pbnRlciB0byBkYXRhIHRvIGJlIHdyaXR0ZW4KK0BwYXJhbSBzaXplIEl0ZW0gc2l6ZSBpbiBieXRlcworQHBhcmFtIGNvdW50IE1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIHRvIGJlIHdyaXR0ZW4KK0BwYXJhbSBzdHJlYW0gUG9pbnRlciB0byBGSU1FTU9SWSBzdHJ1Y3R1cmUKK0ByZXR1cm4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGZ1bGwgaXRlbXMgYWN0dWFsbHkgd3JpdHRlbiwgd2hpY2ggbWF5IGJlIGxlc3MgdGhhbiBjb3VudCBpZiBhbiBlcnJvciBvY2N1cnMKKyovCit1bnNpZ25lZCBETExfQ0FMTENPTlYgCitGcmVlSW1hZ2VfV3JpdGVNZW1vcnkoY29uc3Qgdm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBzaXplLCB1bnNpZ25lZCBjb3VudCwgRklNRU1PUlkgKnN0cmVhbSkgeworCWlmIChzdHJlYW0gIT0gTlVMTCkgeworCQlGcmVlSW1hZ2VJTyBpbzsKKwkJU2V0TWVtb3J5SU8oJmlvKTsKKworCQlGSU1FTU9SWUhFQURFUiAqbWVtX2hlYWRlciA9IChGSU1FTU9SWUhFQURFUiopKCgoRklNRU1PUlkqKXN0cmVhbSktPmRhdGEpOworCisJCWlmKG1lbV9oZWFkZXItPmRlbGV0ZV9tZSA9PSBUUlVFKSB7CisJCQlyZXR1cm4gaW8ud3JpdGVfcHJvYygodm9pZCAqKWJ1ZmZlciwgc2l6ZSwgY291bnQsIHN0cmVhbSk7CisJCX0gZWxzZSB7CisJCQkvLyBkbyBub3Qgd3JpdGUgaW4gYSB1c2VyIGJ1ZmZlcgorCQkJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKEZJRl9VTktOT1dOLCAiTWVtb3J5IGJ1ZmZlciBpcyByZWFkIG9ubHkiKTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL011bHRpUGFnZS5jcHAgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL011bHRpUGFnZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU1N2UwMgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvTXVsdGlQYWdlLmNwcApAQCAtMCwwICsxLDk3NyBAQAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gTXVsdGktUGFnZSBmdW5jdGlvbnMKKy8vCisvLyBEZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIGJ5CisvLyAtIEZsb3JpcyB2YW4gZGVuIEJlcmcgKGZsdmRiZXJnQHd4cy5ubCkKKy8vIC0gTGF1cmVudCBSb2NoZXIgKHJvY2hlcmxAY2x1Yi1pbnRlcm5ldC5mcikKKy8vIC0gU3RldmUgSm9obnNvbiAoc3RldmVAcGFyaXNncm91cC5uZXQpCisvLyAtIFBldHIgUHl0ZWxrYSAocHl0YUBsaWdodGNvbXAuY29tKQorLy8gLSBIZXJ26SBEcm9sb24gKGRyb2xvbkBpbmZvbmllLmZyKQorLy8gLSBWYWRpbSBBbGV4YW5kcm92ICh2YWRpbWFsZXhhbmRyb3ZAdXNlcnMuc291cmNlZm9yZ2UubmV0CisvLyAtIE1hcnRpbiBEeXJpbmctQW5kZXJzZW4gKG1kYUBzcGFtZmlnaHRlci5jb20pCisvLyAtIFZvbG9keW15ciBHb25jaGFyb3YgKHZvbG9keW15ci5nb25jaGFyb3ZAZ21haWwuY29tKQorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZyZWVJbWFnZSAzCisvLworLy8gQ09WRVJFRCBDT0RFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZCisvLyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUworLy8gVEhBVCBUSEUgQ09WRVJFRCBDT0RFIElTIEZSRUUgT0YgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisvLyBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRAorLy8gQ09ERSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVAorLy8gVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GIEFOWSBORUNFU1NBUlkKKy8vIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwKKy8vIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIKKy8vIFRISVMgRElTQ0xBSU1FUi4KKy8vCisvLyBVc2UgYXQgeW91ciBvd24gcmlzayEKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2lmZGVmIF9NU0NfVkVSIAorI3ByYWdtYSB3YXJuaW5nIChkaXNhYmxlIDogNDc4NikgLy8gaWRlbnRpZmllciB3YXMgdHJ1bmNhdGVkIHRvICdudW1iZXInIGNoYXJhY3RlcnMKKyNlbmRpZgorCisjaW5jbHVkZSAiQ2FjaGVGaWxlLmgiCisjaW5jbHVkZSAiRnJlZUltYWdlSU8uaCIKKyNpbmNsdWRlICJQbHVnaW4uaCIKKyNpbmNsdWRlICJVdGlsaXRpZXMuaCIKKyNpbmNsdWRlICJGcmVlSW1hZ2UuaCIKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitlbnVtIEJsb2NrVHlwZSB7IEJMT0NLX0NPTlRJTlVFVVMsIEJMT0NLX1JFRkVSRU5DRSB9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0cnVjdCBCbG9ja1R5cGVTIHsKKwlCbG9ja1R5cGUgbV90eXBlOworCisJQmxvY2tUeXBlUyhCbG9ja1R5cGUgdHlwZSkgOiBtX3R5cGUodHlwZSkgeworCX0KKwl2aXJ0dWFsIH5CbG9ja1R5cGVTKCkge30KK307CisKK3N0cnVjdCBCbG9ja0NvbnRpbnVldXMgOiBwdWJsaWMgQmxvY2tUeXBlUyB7CisJaW50ICAgICAgIG1fc3RhcnQ7CisJaW50ICAgICAgIG1fZW5kOworCisJQmxvY2tDb250aW51ZXVzKGludCBzLCBpbnQgZSkgOiBCbG9ja1R5cGVTKEJMT0NLX0NPTlRJTlVFVVMpLAorCW1fc3RhcnQocyksCisJbV9lbmQoZSkgeworCX0JCit9OworCitzdHJ1Y3QgQmxvY2tSZWZlcmVuY2UgOiBwdWJsaWMgQmxvY2tUeXBlUyB7CisJaW50ICAgICAgIG1fcmVmZXJlbmNlOworCWludCAgICAgICBtX3NpemU7CisKKwlCbG9ja1JlZmVyZW5jZShpbnQgciwgaW50IHNpemUpIDogQmxvY2tUeXBlUyhCTE9DS19SRUZFUkVOQ0UpLAorCW1fcmVmZXJlbmNlKHIpLAorCW1fc2l6ZShzaXplKSB7CisJfQorfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIHN0ZDo6bGlzdDxCbG9ja1R5cGVTICo+IEJsb2NrTGlzdDsKK3R5cGVkZWYgc3RkOjpsaXN0PEJsb2NrVHlwZVMgKj46Oml0ZXJhdG9yIEJsb2NrTGlzdEl0ZXJhdG9yOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0ZJX1NUUlVDVCAoTVVMVElCSVRNQVBIRUFERVIpIHsKKwlQbHVnaW5Ob2RlICpub2RlOworCUZSRUVfSU1BR0VfRk9STUFUIGZpZjsKKwlGcmVlSW1hZ2VJTyAqaW87CisJZmlfaGFuZGxlIGhhbmRsZTsKKwlDYWNoZUZpbGUgKm1fY2FjaGVmaWxlOworCXN0ZDo6bWFwPEZJQklUTUFQICosIGludD4gbG9ja2VkX3BhZ2VzOworCUJPT0wgY2hhbmdlZDsKKwlpbnQgcGFnZV9jb3VudDsKKwlCbG9ja0xpc3QgbV9ibG9ja3M7CisJY2hhciAqbV9maWxlbmFtZTsKKwlCT09MIHJlYWRfb25seTsKKwlGUkVFX0lNQUdFX0ZPUk1BVCBjYWNoZV9maWY7CisJaW50IGxvYWRfZmxhZ3M7Cit9OworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEhlbHBlciBmdW5jdGlvbnMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitpbmxpbmUgdm9pZAorUmVwbGFjZUV4dGVuc2lvbihzdGQ6OnN0cmluZyYgZHN0X2ZpbGVuYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgc3JjX2ZpbGVuYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgZHN0X2V4dGVuc2lvbikgeworCXNpemVfdCBsYXN0RG90ID0gc3JjX2ZpbGVuYW1lLmZpbmRfbGFzdF9vZignLicpOworCWlmIChsYXN0RG90ID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisJCWRzdF9maWxlbmFtZSA9IHNyY19maWxlbmFtZTsKKwkJZHN0X2ZpbGVuYW1lICs9ICIuIjsKKwkJZHN0X2ZpbGVuYW1lICs9IGRzdF9leHRlbnNpb247CisJfQorCWVsc2UgeworCQlkc3RfZmlsZW5hbWUgPSBzcmNfZmlsZW5hbWUuc3Vic3RyKDAsIGxhc3REb3QgKyAxKTsKKwkJZHN0X2ZpbGVuYW1lICs9IGRzdF9leHRlbnNpb247CisJfQorfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEludGVybmFsIE11bHRpcGFnZSBmdW5jdGlvbnMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitpbmxpbmUgTVVMVElCSVRNQVBIRUFERVIgKgorRnJlZUltYWdlX0dldE11bHRpQml0bWFwSGVhZGVyKEZJTVVMVElCSVRNQVAgKmJpdG1hcCkgeworCXJldHVybiAoTVVMVElCSVRNQVBIRUFERVIgKiliaXRtYXAtPmRhdGE7Cit9CisKK3N0YXRpYyBCbG9ja0xpc3RJdGVyYXRvciBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9GaW5kQmxvY2soRklNVUxUSUJJVE1BUCAqYml0bWFwLCBpbnQgcG9zaXRpb24pIHsKKwlhc3NlcnQoTlVMTCAhPSBiaXRtYXApOworCisJTVVMVElCSVRNQVBIRUFERVIgKmhlYWRlciA9IEZyZWVJbWFnZV9HZXRNdWx0aUJpdG1hcEhlYWRlcihiaXRtYXApOworCisJLy8gc3RlcCAxOiBmaW5kIHRoZSBibG9jayB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIHBvc2l0aW9uCisKKwlpbnQgcHJldl9jb3VudCA9IDA7CisJaW50IGNvdW50ID0gMDsKKwlCbG9ja0xpc3RJdGVyYXRvciBpOworCUJsb2NrVHlwZVMgKmN1cnJlbnRfYmxvY2sgPSBOVUxMOworCisJZm9yIChpID0gaGVhZGVyLT5tX2Jsb2Nrcy5iZWdpbigpOyBpICE9IGhlYWRlci0+bV9ibG9ja3MuZW5kKCk7ICsraSkgeworCQlwcmV2X2NvdW50ID0gY291bnQ7CisKKwkJc3dpdGNoKCgqaSktPm1fdHlwZSkgeworCQkJY2FzZSBCTE9DS19DT05USU5VRVVTIDoKKwkJCQljb3VudCArPSAoKEJsb2NrQ29udGludWV1cyAqKSgqaSkpLT5tX2VuZCAtICgoQmxvY2tDb250aW51ZXVzICopKCppKSktPm1fc3RhcnQgKyAxOworCQkJCWJyZWFrOworCisJCQljYXNlIEJMT0NLX1JFRkVSRU5DRSA6CisJCQkJY291bnQrKzsKKwkJCQlicmVhazsKKwkJfQorCisJCWN1cnJlbnRfYmxvY2sgPSAqaTsKKworCQlpZiAoY291bnQgPiBwb3NpdGlvbikKKwkJCWJyZWFrOworCX0KKworCS8vIHN0ZXAgMjogbWFrZSBzdXJlIHdlIGZvdW5kIHRoZSBub2RlLiBmcm9tIGhlcmUgaXQgZ2V0cyBhIGxpdHRsZSBjb21wbGljYXRlZDoKKwkvLyAqIGlmIHRoZSBibG9jayBpcyB0aGVyZSwganVzdCByZXR1cm4gaXQKKwkvLyAqIGlmIHRoZSBibG9jayBpcyBhIHNlcmllcyBvZiBibG9ja3MsIHNwbGl0IGl0IGluIG1heCAzIG5ldyBibG9ja3MKKwkvLyAgIGFuZCByZXR1cm4gdGhlIHNwbGl0dGVkIGJsb2NrCisKKwlpZiAoKGN1cnJlbnRfYmxvY2spICYmIChjb3VudCA+IHBvc2l0aW9uKSkgeworCQlzd2l0Y2goY3VycmVudF9ibG9jay0+bV90eXBlKSB7CisJCQljYXNlIEJMT0NLX1JFRkVSRU5DRSA6CisJCQkJcmV0dXJuIGk7CisKKwkJCWNhc2UgQkxPQ0tfQ09OVElOVUVVUyA6CisJCQl7CisJCQkJQmxvY2tDb250aW51ZXVzICpibG9jayA9IChCbG9ja0NvbnRpbnVldXMgKiljdXJyZW50X2Jsb2NrOworCisJCQkJaWYgKGJsb2NrLT5tX3N0YXJ0ICE9IGJsb2NrLT5tX2VuZCkgeworCQkJCQlpbnQgaXRlbSA9IGJsb2NrLT5tX3N0YXJ0ICsgKHBvc2l0aW9uIC0gcHJldl9jb3VudCk7CisKKwkJCQkJLy8gbGVmdCBwYXJ0CisKKwkJCQkJaWYgKGl0ZW0gIT0gYmxvY2stPm1fc3RhcnQpIHsKKwkJCQkJCUJsb2NrQ29udGludWV1cyAqYmxvY2tfYSA9IG5ldyBCbG9ja0NvbnRpbnVldXMoYmxvY2stPm1fc3RhcnQsIGl0ZW0gLSAxKTsKKwkJCQkJCWhlYWRlci0+bV9ibG9ja3MuaW5zZXJ0KGksIChCbG9ja1R5cGVTICopYmxvY2tfYSk7CisJCQkJCX0KKworCQkJCQkvLyBtaWRkbGUgcGFydAorCisJCQkJCUJsb2NrQ29udGludWV1cyAqYmxvY2tfYiA9IG5ldyBCbG9ja0NvbnRpbnVldXMoaXRlbSwgaXRlbSk7CisJCQkJCUJsb2NrTGlzdEl0ZXJhdG9yIGJsb2NrX3RhcmdldCA9IGhlYWRlci0+bV9ibG9ja3MuaW5zZXJ0KGksIChCbG9ja1R5cGVTICopYmxvY2tfYik7CisKKwkJCQkJLy8gcmlnaHQgcGFydAorCisJCQkJCWlmIChpdGVtICE9IGJsb2NrLT5tX2VuZCkgeworCQkJCQkJQmxvY2tDb250aW51ZXVzICpibG9ja19jID0gbmV3IEJsb2NrQ29udGludWV1cyhpdGVtICsgMSwgYmxvY2stPm1fZW5kKTsKKwkJCQkJCWhlYWRlci0+bV9ibG9ja3MuaW5zZXJ0KGksIChCbG9ja1R5cGVTICopYmxvY2tfYyk7CisJCQkJCX0KKworCQkJCQkvLyByZW1vdmUgdGhlIG9sZCBibG9jayB0aGF0IHdhcyBqdXN0IHNwbGl0dGVkCisKKwkJCQkJaGVhZGVyLT5tX2Jsb2Nrcy5yZW1vdmUoKEJsb2NrVHlwZVMgKilibG9jayk7CisJCQkJCWRlbGV0ZSBibG9jazsKKworCQkJCQkvLyByZXR1cm4gdGhlIHNwbGl0dGVkIGJsb2NrCisJCQkJCQorCQkJCQlyZXR1cm4gYmxvY2tfdGFyZ2V0OworCQkJCX0KKworCQkJCXJldHVybiBpOworCQkJfQorCQl9CisJfQorCS8vIHdlIHNob3VsZCBuZXZlciBnbyBoZXJlIC4uLgorCWFzc2VydChmYWxzZSk7CisJcmV0dXJuIGhlYWRlci0+bV9ibG9ja3MuZW5kKCk7Cit9CisKK2ludCBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9JbnRlcm5hbEdldFBhZ2VDb3VudChGSU1VTFRJQklUTUFQICpiaXRtYXApIHsJCisJaWYgKGJpdG1hcCkgeworCQlpZiAoKChNVUxUSUJJVE1BUEhFQURFUiAqKWJpdG1hcC0+ZGF0YSktPmhhbmRsZSkgeworCQkJTVVMVElCSVRNQVBIRUFERVIgKmhlYWRlciA9IEZyZWVJbWFnZV9HZXRNdWx0aUJpdG1hcEhlYWRlcihiaXRtYXApOworCisJCQloZWFkZXItPmlvLT5zZWVrX3Byb2MoaGVhZGVyLT5oYW5kbGUsIDAsIFNFRUtfU0VUKTsKKworICAgCQkJdm9pZCAqZGF0YSA9IEZyZWVJbWFnZV9PcGVuKGhlYWRlci0+bm9kZSwgaGVhZGVyLT5pbywgaGVhZGVyLT5oYW5kbGUsIFRSVUUpOworCisJCQlpbnQgcGFnZV9jb3VudCA9IChoZWFkZXItPm5vZGUtPm1fcGx1Z2luLT5wYWdlY291bnRfcHJvYyAhPSBOVUxMKSA/IGhlYWRlci0+bm9kZS0+bV9wbHVnaW4tPnBhZ2Vjb3VudF9wcm9jKGhlYWRlci0+aW8sIGhlYWRlci0+aGFuZGxlLCBkYXRhKSA6IDE7CisKKwkJCUZyZWVJbWFnZV9DbG9zZShoZWFkZXItPm5vZGUsIGhlYWRlci0+aW8sIGhlYWRlci0+aGFuZGxlLCBkYXRhKTsKKworCQkJcmV0dXJuIHBhZ2VfY291bnQ7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBNdWx0aXBhZ2UgZnVuY3Rpb25zCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworRklNVUxUSUJJVE1BUCAqIERMTF9DQUxMQ09OVgorRnJlZUltYWdlX09wZW5NdWx0aUJpdG1hcChGUkVFX0lNQUdFX0ZPUk1BVCBmaWYsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBCT09MIGNyZWF0ZV9uZXcsIEJPT0wgcmVhZF9vbmx5LCBCT09MIGtlZXBfY2FjaGVfaW5fbWVtb3J5LCBpbnQgZmxhZ3MpIHsKKworCUZJTEUgKmhhbmRsZSA9IE5VTEw7CisJdHJ5IHsKKwkJLy8gc2FuaXR5IGNoZWNrIG9uIHRoZSBwYXJhbWV0ZXJzCisKKwkJaWYgKGNyZWF0ZV9uZXcpIHsKKwkJCXJlYWRfb25seSA9IEZBTFNFOworCQl9CisKKwkJLy8gcmV0cmlldmUgdGhlIHBsdWdpbiBsaXN0IHRvIGZpbmQgdGhlIG5vZGUgYmVsb25naW5nIHRvIHRoaXMgcGx1Z2luCisKKwkJUGx1Z2luTGlzdCAqbGlzdCA9IEZyZWVJbWFnZV9HZXRQbHVnaW5MaXN0KCk7CisKKwkJaWYgKGxpc3QpIHsKKwkJCVBsdWdpbk5vZGUgKm5vZGUgPSBsaXN0LT5GaW5kTm9kZUZyb21GSUYoZmlmKTsKKworCQkJaWYgKG5vZGUpIHsKKwkJCQlzdGQ6OnVuaXF1ZV9wdHI8RnJlZUltYWdlSU8+IGlvIChuZXcgRnJlZUltYWdlSU8pOworCisJCQkJU2V0RGVmYXVsdElPKGlvLmdldCgpKTsKKworCQkJCWlmICghY3JlYXRlX25ldykgeworCQkJCQloYW5kbGUgPSBmb3BlbihmaWxlbmFtZSwgInJiIik7CisJCQkJCWlmIChoYW5kbGUgPT0gTlVMTCkgeworCQkJCQkJcmV0dXJuIE5VTEw7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlzdGQ6OnVuaXF1ZV9wdHI8RklNVUxUSUJJVE1BUD4gYml0bWFwIChuZXcgRklNVUxUSUJJVE1BUCk7CisJCQkJc3RkOjp1bmlxdWVfcHRyPE1VTFRJQklUTUFQSEVBREVSPiBoZWFkZXIgKG5ldyBNVUxUSUJJVE1BUEhFQURFUik7CisJCQkJaGVhZGVyLT5tX2ZpbGVuYW1lID0gbmV3IGNoYXJbc3RybGVuKGZpbGVuYW1lKSArIDFdOworCQkJCXN0cmNweShoZWFkZXItPm1fZmlsZW5hbWUsIGZpbGVuYW1lKTsKKwkJCQloZWFkZXItPm5vZGUgPSBub2RlOworCQkJCWhlYWRlci0+ZmlmID0gZmlmOworCQkJCWhlYWRlci0+aW8gPSBpby5nZXQgKCk7CisJCQkJaGVhZGVyLT5oYW5kbGUgPSBoYW5kbGU7CQkJCQkJCisJCQkJaGVhZGVyLT5jaGFuZ2VkID0gRkFMU0U7CQkJCQkJCisJCQkJaGVhZGVyLT5yZWFkX29ubHkgPSByZWFkX29ubHk7CisJCQkJaGVhZGVyLT5tX2NhY2hlZmlsZSA9IE5VTEw7CisJCQkJaGVhZGVyLT5jYWNoZV9maWYgPSBmaWY7CisJCQkJaGVhZGVyLT5sb2FkX2ZsYWdzID0gZmxhZ3M7CisKKwkJCQkvLyBzdG9yZSB0aGUgTVVMVElCSVRNQVBIRUFERVIgaW4gdGhlIHN1cnJvdW5kaW5nIEZJTVVMVElCSVRNQVAgc3RydWN0dXJlCisKKwkJCQliaXRtYXAtPmRhdGEgPSBoZWFkZXIuZ2V0KCk7CisKKwkJCQkvLyBjYWNoZSB0aGUgcGFnZSBjb3VudAorCisJCQkJaGVhZGVyLT5wYWdlX2NvdW50ID0gRnJlZUltYWdlX0ludGVybmFsR2V0UGFnZUNvdW50KGJpdG1hcC5nZXQoKSk7CisKKwkJCQkvLyBhbGxvY2F0ZSBhIGNvbnRpbnVldXMgYmxvY2sgdG8gZGVzY3JpYmUgdGhlIGJpdG1hcAorCisJCQkJaWYgKCFjcmVhdGVfbmV3KSB7CisJCQkJCWhlYWRlci0+bV9ibG9ja3MucHVzaF9iYWNrKChCbG9ja1R5cGVTICopbmV3IEJsb2NrQ29udGludWV1cygwLCBoZWFkZXItPnBhZ2VfY291bnQgLSAxKSk7CisJCQkJfQorCisJCQkJLy8gc2V0IHVwIHRoZSBjYWNoZQorCisJCQkJaWYgKCFyZWFkX29ubHkpIHsKKwkJCQkJc3RkOjpzdHJpbmcgY2FjaGVfbmFtZTsKKwkJCQkJUmVwbGFjZUV4dGVuc2lvbihjYWNoZV9uYW1lLCBmaWxlbmFtZSwgImZpY2FjaGUiKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDYWNoZUZpbGU+IGNhY2hlX2ZpbGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDYWNoZUZpbGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2VlcF9jYWNoZV9pbl9tZW1vcnkpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYWNoZV9maWxlLT5vcGVuKCkpIHsKKwkJCQkJCS8vIHdlIGNhbiB1c2UgcmVsZWFzZSgpIGFzIHN0ZDo6YmFkX2FsbG9jIHdvbid0IGJlIHRocm93biBmcm9tIGhlcmUgb24KKwkJCQkJCWhlYWRlci0+bV9jYWNoZWZpbGUgPSBjYWNoZV9maWxlLnJlbGVhc2UoKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8vIGFuIGVycm9yIG9jY3VyZWQgLi4uCisJCQkJCQlmY2xvc2UoaGFuZGxlKTsKKwkJCQkJCXJldHVybiBOVUxMOworCQkJCQl9CisJCQkJfQorCQkJCS8vIHJldHVybiB0aGUgbXVsdGliaXRtYXAKKwkJCQkvLyBzdGQ6OmJhZF9hbGxvYyB3b24ndCBiZSB0aHJvd24gZnJvbSBoZXJlIG9uCisJCQkJaGVhZGVyLnJlbGVhc2UoKTsgLy8gbm93IG93bmVkIGJ5IGJpdG1hcAorCQkJCWlvLnJlbGVhc2UoKTsJICAvLyBub3cgb3duZWQgYnkgYml0bWFwCisJCQkJcmV0dXJuIGJpdG1hcC5yZWxlYXNlKCk7IC8vIG5vdyBvd25lZCBieSBjYWxsZXIKKwkJCX0KKwkJfQorCX0gY2F0Y2ggKHN0ZDo6YmFkX2FsbG9jICYpIHsKKwkJLyoqIEB0b2RvIHJlcG9ydCBlcnJvciAqLworCX0KKwlpZiAoaGFuZGxlKQorCQlmY2xvc2UoaGFuZGxlKTsKKwlyZXR1cm4gTlVMTDsKK30KKworRklNVUxUSUJJVE1BUCAqIERMTF9DQUxMQ09OVgorRnJlZUltYWdlX09wZW5NdWx0aUJpdG1hcEZyb21IYW5kbGUoRlJFRV9JTUFHRV9GT1JNQVQgZmlmLCBGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIGludCBmbGFncykgeworCXRyeSB7CisJCUJPT0wgcmVhZF9vbmx5ID0gRkFMU0U7CS8vIG1vZGlmaWNhdGlvbnMgKGlmIGFueSkgd2lsbCBiZSBzdG9yZWQgaW50byB0aGUgbWVtb3J5IGNhY2hlCisKKwkJaWYgKGlvICYmIGhhbmRsZSkgeworCQkKKwkJCS8vIHJldHJpZXZlIHRoZSBwbHVnaW4gbGlzdCB0byBmaW5kIHRoZSBub2RlIGJlbG9uZ2luZyB0byB0aGlzIHBsdWdpbgorCQkJUGx1Z2luTGlzdCAqbGlzdCA9IEZyZWVJbWFnZV9HZXRQbHVnaW5MaXN0KCk7CisJCQorCQkJaWYgKGxpc3QpIHsKKwkJCQlQbHVnaW5Ob2RlICpub2RlID0gbGlzdC0+RmluZE5vZGVGcm9tRklGKGZpZik7CisJCQkKKwkJCQlpZiAobm9kZSkgeworCQkJCQlzdGQ6OnVuaXF1ZV9wdHI8RklNVUxUSUJJVE1BUD4gYml0bWFwIChuZXcgRklNVUxUSUJJVE1BUCk7CisJCQkJCXN0ZDo6dW5pcXVlX3B0cjxNVUxUSUJJVE1BUEhFQURFUj4gaGVhZGVyIChuZXcgTVVMVElCSVRNQVBIRUFERVIpOworCQkJCQlzdGQ6OnVuaXF1ZV9wdHI8RnJlZUltYWdlSU8+IHRtcF9pbyAobmV3IEZyZWVJbWFnZUlPICgqaW8pKTsKKwkJCQkJaGVhZGVyLT5pbyA9IHRtcF9pby5nZXQoKTsKKwkJCQkJaGVhZGVyLT5tX2ZpbGVuYW1lID0gTlVMTDsKKwkJCQkJaGVhZGVyLT5ub2RlID0gbm9kZTsKKwkJCQkJaGVhZGVyLT5maWYgPSBmaWY7CisJCQkJCWhlYWRlci0+aGFuZGxlID0gaGFuZGxlOwkJCQkJCQorCQkJCQloZWFkZXItPmNoYW5nZWQgPSBGQUxTRTsJCQkJCQkKKwkJCQkJaGVhZGVyLT5yZWFkX29ubHkgPSByZWFkX29ubHk7CQorCQkJCQloZWFkZXItPm1fY2FjaGVmaWxlID0gTlVMTDsKKwkJCQkJaGVhZGVyLT5jYWNoZV9maWYgPSBmaWY7CisJCQkJCWhlYWRlci0+bG9hZF9mbGFncyA9IGZsYWdzOworCQkJCQkJCQorCQkJCQkvLyBzdG9yZSB0aGUgTVVMVElCSVRNQVBIRUFERVIgaW4gdGhlIHN1cnJvdW5kaW5nIEZJTVVMVElCSVRNQVAgc3RydWN0dXJlCisKKwkJCQkJYml0bWFwLT5kYXRhID0gaGVhZGVyLmdldCgpOworCisJCQkJCS8vIGNhY2hlIHRoZSBwYWdlIGNvdW50CisKKwkJCQkJaGVhZGVyLT5wYWdlX2NvdW50ID0gRnJlZUltYWdlX0ludGVybmFsR2V0UGFnZUNvdW50KGJpdG1hcC5nZXQoKSk7CisKKwkJCQkJLy8gYWxsb2NhdGUgYSBjb250aW51ZXVzIGJsb2NrIHRvIGRlc2NyaWJlIHRoZSBiaXRtYXAKKworCQkJCQloZWFkZXItPm1fYmxvY2tzLnB1c2hfYmFjaygoQmxvY2tUeXBlUyAqKW5ldyBCbG9ja0NvbnRpbnVldXMoMCwgaGVhZGVyLT5wYWdlX2NvdW50IC0gMSkpOworCisJCQkJCWlmICghcmVhZF9vbmx5KSB7CisJCQkJCQkvLyBzZXQgdXAgdGhlIGNhY2hlCisJCQkJCQlzdGQ6OnVuaXF1ZV9wdHI8Q2FjaGVGaWxlPiBjYWNoZV9maWxlIChuZXcgQ2FjaGVGaWxlKCIiLCBUUlVFKSk7CisJCQkJCQkKKwkJCQkJCWlmIChjYWNoZV9maWxlLT5vcGVuKCkpIHsKKwkJCQkJCQloZWFkZXItPm1fY2FjaGVmaWxlID0gY2FjaGVfZmlsZS5yZWxlYXNlKCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJdG1wX2lvLnJlbGVhc2UoKTsKKwkJCQkJaGVhZGVyLnJlbGVhc2UoKTsKKwkJCQkJcmV0dXJuIGJpdG1hcC5yZWxlYXNlKCk7CisJCQkJfQorCQkJfQorCQl9CisJfSBjYXRjaCAoc3RkOjpiYWRfYWxsb2MgJikgeworCQkvKiogQHRvZG8gcmVwb3J0IGVycm9yICovCisJfQorCXJldHVybiBOVUxMOworfQorCitCT09MIERMTF9DQUxMQ09OVgorRnJlZUltYWdlX1NhdmVNdWx0aUJpdG1hcFRvSGFuZGxlKEZSRUVfSU1BR0VfRk9STUFUIGZpZiwgRklNVUxUSUJJVE1BUCAqYml0bWFwLCBGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIGludCBmbGFncykgeworCWlmKCFiaXRtYXAgfHwgIWJpdG1hcC0+ZGF0YSB8fCAhaW8gfHwgIWhhbmRsZSkgeworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJQk9PTCBzdWNjZXNzID0gVFJVRTsKKworCS8vIHJldHJpZXZlIHRoZSBwbHVnaW4gbGlzdCB0byBmaW5kIHRoZSBub2RlIGJlbG9uZ2luZyB0byB0aGlzIHBsdWdpbgorCVBsdWdpbkxpc3QgKmxpc3QgPSBGcmVlSW1hZ2VfR2V0UGx1Z2luTGlzdCgpOworCQorCWlmIChsaXN0KSB7CisJCVBsdWdpbk5vZGUgKm5vZGUgPSBsaXN0LT5GaW5kTm9kZUZyb21GSUYoZmlmKTsKKworCQlpZihub2RlKSB7CisJCQlNVUxUSUJJVE1BUEhFQURFUiAqaGVhZGVyID0gRnJlZUltYWdlX0dldE11bHRpQml0bWFwSGVhZGVyKGJpdG1hcCk7CisJCQkKKwkJCS8vIGRzdCBkYXRhCisJCQl2b2lkICpkYXRhID0gRnJlZUltYWdlX09wZW4obm9kZSwgaW8sIGhhbmRsZSwgRkFMU0UpOworCQkJLy8gc3JjIGRhdGEKKwkJCXZvaWQgKmRhdGFfcmVhZCA9IE5VTEw7CisJCQkKKwkJCWlmKGhlYWRlci0+aGFuZGxlKSB7CisJCQkJLy8gb3BlbiBzcmMKKwkJCQloZWFkZXItPmlvLT5zZWVrX3Byb2MoaGVhZGVyLT5oYW5kbGUsIDAsIFNFRUtfU0VUKTsKKwkJCQlkYXRhX3JlYWQgPSBGcmVlSW1hZ2VfT3BlbihoZWFkZXItPm5vZGUsIGhlYWRlci0+aW8sIGhlYWRlci0+aGFuZGxlLCBUUlVFKTsKKwkJCX0KKwkJCQorCQkJLy8gd3JpdGUgYWxsIHRoZSBwYWdlcyB0byB0aGUgZmlsZSB1c2luZyBoYW5kbGUgYW5kIGlvCisJCQkKKwkJCWludCBjb3VudCA9IDA7CisJCQkKKwkJCWZvciAoQmxvY2tMaXN0SXRlcmF0b3IgaSA9IGhlYWRlci0+bV9ibG9ja3MuYmVnaW4oKTsgaSAhPSBoZWFkZXItPm1fYmxvY2tzLmVuZCgpOyBpKyspIHsKKwkJCQlpZiAoc3VjY2VzcykgeworCQkJCQlzd2l0Y2goKCppKS0+bV90eXBlKSB7CisJCQkJCQljYXNlIEJMT0NLX0NPTlRJTlVFVVM6CisJCQkJCQl7CisJCQkJCQkJQmxvY2tDb250aW51ZXVzICpibG9jayA9IChCbG9ja0NvbnRpbnVldXMgKikoKmkpOworCQkJCQkJCQorCQkJCQkJCWZvciAoaW50IGogPSBibG9jay0+bV9zdGFydDsgaiA8PSBibG9jay0+bV9lbmQ7IGorKykgeworCisJCQkJCQkJCS8vIGxvYWQgdGhlIG9yaWdpbmFsIHNvdXJjZSBkYXRhCisJCQkJCQkJCUZJQklUTUFQICpkaWIgPSBoZWFkZXItPm5vZGUtPm1fcGx1Z2luLT5sb2FkX3Byb2MoaGVhZGVyLT5pbywgaGVhZGVyLT5oYW5kbGUsIGosIGhlYWRlci0+bG9hZF9mbGFncywgZGF0YV9yZWFkKTsKKwkJCQkJCQkJCisJCQkJCQkJCS8vIHNhdmUgdGhlIGRhdGEKKwkJCQkJCQkJc3VjY2VzcyA9IG5vZGUtPm1fcGx1Z2luLT5zYXZlX3Byb2MoaW8sIGRpYiwgaGFuZGxlLCBjb3VudCwgZmxhZ3MsIGRhdGEpOworCQkJCQkJCQljb3VudCsrOworCQkJCQkJCQkKKwkJCQkJCQkJRnJlZUltYWdlX1VubG9hZChkaWIpOworCQkJCQkJCX0KKwkJCQkJCQkKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCQorCQkJCQkJY2FzZSBCTE9DS19SRUZFUkVOQ0U6CisJCQkJCQl7CisJCQkJCQkJQmxvY2tSZWZlcmVuY2UgKnJlZiA9IChCbG9ja1JlZmVyZW5jZSAqKSgqaSk7CisJCQkJCQkJCisJCQkJCQkJLy8gcmVhZCB0aGUgY29tcHJlc3NlZCBkYXRhCisJCQkJCQkJCisJCQkJCQkJQllURSAqY29tcHJlc3NlZF9kYXRhID0gKEJZVEUqKW1hbGxvYyhyZWYtPm1fc2l6ZSAqIHNpemVvZihCWVRFKSk7CisJCQkJCQkJCisJCQkJCQkJaGVhZGVyLT5tX2NhY2hlZmlsZS0+cmVhZEZpbGUoKEJZVEUgKiljb21wcmVzc2VkX2RhdGEsIHJlZi0+bV9yZWZlcmVuY2UsIHJlZi0+bV9zaXplKTsKKwkJCQkJCQkKKwkJCQkJCQkvLyB1bmNvbXByZXNzIHRoZSBkYXRhCisJCQkJCQkJCisJCQkJCQkJRklNRU1PUlkgKmhtZW0gPSBGcmVlSW1hZ2VfT3Blbk1lbW9yeShjb21wcmVzc2VkX2RhdGEsIHJlZi0+bV9zaXplKTsKKwkJCQkJCQlGSUJJVE1BUCAqZGliID0gRnJlZUltYWdlX0xvYWRGcm9tTWVtb3J5KGhlYWRlci0+Y2FjaGVfZmlmLCBobWVtLCAwKTsKKwkJCQkJCQlGcmVlSW1hZ2VfQ2xvc2VNZW1vcnkoaG1lbSk7CisJCQkJCQkJCisJCQkJCQkJLy8gZ2V0IHJpZCBvZiB0aGUgYnVmZmVyCisJCQkJCQkJZnJlZShjb21wcmVzc2VkX2RhdGEpOworCQkJCQkJCQorCQkJCQkJCS8vIHNhdmUgdGhlIGRhdGEKKwkJCQkJCQkKKwkJCQkJCQlzdWNjZXNzID0gbm9kZS0+bV9wbHVnaW4tPnNhdmVfcHJvYyhpbywgZGliLCBoYW5kbGUsIGNvdW50LCBmbGFncywgZGF0YSk7CisJCQkJCQkJY291bnQrKzsKKwkJCQkJCQkKKwkJCQkJCQkvLyB1bmxvYWQgdGhlIGRpYgorCisJCQkJCQkJRnJlZUltYWdlX1VubG9hZChkaWIpOworCisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQkKKwkJCS8vIGNsb3NlIHRoZSBmaWxlcworCQkJCisJCQlGcmVlSW1hZ2VfQ2xvc2UoaGVhZGVyLT5ub2RlLCBoZWFkZXItPmlvLCBoZWFkZXItPmhhbmRsZSwgZGF0YV9yZWFkKTsKKworCQkJRnJlZUltYWdlX0Nsb3NlKG5vZGUsIGlvLCBoYW5kbGUsIGRhdGEpOyAKKwkJCQorCQkJcmV0dXJuIHN1Y2Nlc3M7CisJCX0KKwl9CisKKwlyZXR1cm4gRkFMU0U7Cit9CisKKworQk9PTCBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9DbG9zZU11bHRpQml0bWFwKEZJTVVMVElCSVRNQVAgKmJpdG1hcCwgaW50IGZsYWdzKSB7CisJaWYgKGJpdG1hcCkgeworCQlCT09MIHN1Y2Nlc3MgPSBUUlVFOworCQkKKwkJaWYgKGJpdG1hcC0+ZGF0YSkgeworCQkJTVVMVElCSVRNQVBIRUFERVIgKmhlYWRlciA9IEZyZWVJbWFnZV9HZXRNdWx0aUJpdG1hcEhlYWRlcihiaXRtYXApOwkJCQorCQkJCisJCQkvLyBzYXZlcyBjaGFuZ2VzIG9ubHkgb2YgaW1hZ2VzIGxvYWRlZCBkaXJlY3RseSBmcm9tIGEgZmlsZQorCQkJaWYgKGhlYWRlci0+Y2hhbmdlZCAmJiBoZWFkZXItPm1fZmlsZW5hbWUpIHsKKwkJCQl0cnkgeworCQkJCQkvLyBvcGVuIGEgdGVtcCBmaWxlCisKKwkJCQkJc3RkOjpzdHJpbmcgc3Bvb2xfbmFtZTsKKworCQkJCQlSZXBsYWNlRXh0ZW5zaW9uKHNwb29sX25hbWUsIGhlYWRlci0+bV9maWxlbmFtZSwgImZpc3Bvb2wiKTsKKworCQkJCQkvLyBvcGVuIHRoZSBzcG9vbCBmaWxlIGFuZCB0aGUgc291cmNlIGZpbGUKKyAgICAgICAgCisJCQkJCUZJTEUgKmYgPSBmb3BlbihzcG9vbF9uYW1lLmNfc3RyKCksICJ3K2IiKTsKKwkJCQkKKwkJCQkJLy8gc2F2ZXMgY2hhbmdlcworCQkJCQlpZiAoZiA9PSBOVUxMKSB7CisJCQkJCQlGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2MoaGVhZGVyLT5maWYsICJGYWlsZWQgdG8gb3BlbiAlcywgJXMiLCBzcG9vbF9uYW1lLmNfc3RyKCksIHN0cmVycm9yKGVycm5vKSk7CisJCQkJCQlzdWNjZXNzID0gRkFMU0U7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlzdWNjZXNzID0gRnJlZUltYWdlX1NhdmVNdWx0aUJpdG1hcFRvSGFuZGxlKGhlYWRlci0+ZmlmLCBiaXRtYXAsIGhlYWRlci0+aW8sIChmaV9oYW5kbGUpZiwgZmxhZ3MpOworCisJCQkJCQkvLyBjbG9zZSB0aGUgZmlsZXMKKworCQkJCQkJaWYgKGZjbG9zZShmKSAhPSAwKSB7CisJCQkJCQkJc3VjY2VzcyA9IEZBTFNFOworCQkJCQkJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhoZWFkZXItPmZpZiwgIkZhaWxlZCB0byBjbG9zZSAlcywgJXMiLCBzcG9vbF9uYW1lLmNfc3RyKCksIHN0cmVycm9yKGVycm5vKSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJaWYgKGhlYWRlci0+aGFuZGxlKSB7CisJCQkJCQlmY2xvc2UoKEZJTEUgKiloZWFkZXItPmhhbmRsZSk7CisJCQkJCX0KKwkJCQkKKwkJCQkJLy8gYXBwbGllcyBjaGFuZ2VzIHRvIHRoZSBkZXN0aW5hdGlvbiBmaWxlCisKKwkJCQkJaWYgKHN1Y2Nlc3MpIHsKKwkJCQkJCXJlbW92ZShoZWFkZXItPm1fZmlsZW5hbWUpOworCQkJCQkJc3VjY2VzcyA9IChyZW5hbWUoc3Bvb2xfbmFtZS5jX3N0cigpLCBoZWFkZXItPm1fZmlsZW5hbWUpID09IDApID8gVFJVRTpGQUxTRTsKKwkJCQkJCWlmKCFzdWNjZXNzKSB7CisJCQkJCQkJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKGhlYWRlci0+ZmlmLCAiRmFpbGVkIHRvIHJlbmFtZSAlcyB0byAlcyIsIHNwb29sX25hbWUuY19zdHIoKSwgaGVhZGVyLT5tX2ZpbGVuYW1lKTsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXJlbW92ZShzcG9vbF9uYW1lLmNfc3RyKCkpOworCQkJCQl9CisJCQkJfSBjYXRjaCAoc3RkOjpiYWRfYWxsb2MgJikgeworCQkJCQlzdWNjZXNzID0gRkFMU0U7CisJCQkJfQorCisJCQl9IGVsc2UgeworCQkJCWlmIChoZWFkZXItPmhhbmRsZSAmJiBoZWFkZXItPm1fZmlsZW5hbWUpIHsKKwkJCQkJZmNsb3NlKChGSUxFICopaGVhZGVyLT5oYW5kbGUpOworCQkJCX0KKwkJCX0KKworCQkJLy8gY2xlYXIgdGhlIGJsb2NrcyBsaXN0CisKKwkJCWZvciAoQmxvY2tMaXN0SXRlcmF0b3IgaSA9IGhlYWRlci0+bV9ibG9ja3MuYmVnaW4oKTsgaSAhPSBoZWFkZXItPm1fYmxvY2tzLmVuZCgpOyArK2kpIHsKKwkJCQlkZWxldGUgKmk7CisJCQl9CisKKwkJCS8vIGZsdXNoIGFuZCBkaXNwb3NlIHRoZSBjYWNoZQorCisJCQlpZiAoaGVhZGVyLT5tX2NhY2hlZmlsZSkgeworCQkJCWhlYWRlci0+bV9jYWNoZWZpbGUtPmNsb3NlKCk7CisJCQkJZGVsZXRlIGhlYWRlci0+bV9jYWNoZWZpbGU7CisJCQl9CisKKwkJCS8vIGRlbGV0ZSB0aGUgbGFzdCBvcGVuIGJpdG1hcHMKKworCQkJd2hpbGUgKCFoZWFkZXItPmxvY2tlZF9wYWdlcy5lbXB0eSgpKSB7CisJCQkJRnJlZUltYWdlX1VubG9hZChoZWFkZXItPmxvY2tlZF9wYWdlcy5iZWdpbigpLT5maXJzdCk7CisKKwkJCQloZWFkZXItPmxvY2tlZF9wYWdlcy5lcmFzZShoZWFkZXItPmxvY2tlZF9wYWdlcy5iZWdpbigpLT5maXJzdCk7CisJCQl9CisKKwkJCS8vIGdldCByaWQgb2YgdGhlIElPIHN0cnVjdHVyZQorCisJCQlkZWxldGUgaGVhZGVyLT5pbzsKKworCQkJLy8gZGVsZXRlIHRoZSBmaWxlbmFtZQorCisJCQlpZihoZWFkZXItPm1fZmlsZW5hbWUpIHsKKwkJCQlkZWxldGVbXSBoZWFkZXItPm1fZmlsZW5hbWU7CisJCQl9CisKKwkJCS8vIGRlbGV0ZSB0aGUgRklNVUxUSUJJVE1BUEhFQURFUgorCisJCQlkZWxldGUgaGVhZGVyOworCQl9CisKKwkJZGVsZXRlIGJpdG1hcDsKKworCQlyZXR1cm4gc3VjY2VzczsKKwl9CisKKwlyZXR1cm4gRkFMU0U7Cit9CisKK2ludCBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9HZXRQYWdlQ291bnQoRklNVUxUSUJJVE1BUCAqYml0bWFwKSB7CisJaWYgKGJpdG1hcCkgeworCQlNVUxUSUJJVE1BUEhFQURFUiAqaGVhZGVyID0gRnJlZUltYWdlX0dldE11bHRpQml0bWFwSGVhZGVyKGJpdG1hcCk7CisKKwkJaWYgKGhlYWRlci0+cGFnZV9jb3VudCA9PSAtMSkgeworCQkJaGVhZGVyLT5wYWdlX2NvdW50ID0gMDsKKworCQkJZm9yIChCbG9ja0xpc3RJdGVyYXRvciBpID0gaGVhZGVyLT5tX2Jsb2Nrcy5iZWdpbigpOyBpICE9IGhlYWRlci0+bV9ibG9ja3MuZW5kKCk7ICsraSkgeworCQkJCXN3aXRjaCgoKmkpLT5tX3R5cGUpIHsKKwkJCQkJY2FzZSBCTE9DS19DT05USU5VRVVTIDoKKwkJCQkJCWhlYWRlci0+cGFnZV9jb3VudCArPSAoKEJsb2NrQ29udGludWV1cyAqKSgqaSkpLT5tX2VuZCAtICgoQmxvY2tDb250aW51ZXVzICopKCppKSktPm1fc3RhcnQgKyAxOworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBCTE9DS19SRUZFUkVOQ0UgOgorCQkJCQkJaGVhZGVyLT5wYWdlX2NvdW50Kys7CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKworCQlyZXR1cm4gaGVhZGVyLT5wYWdlX2NvdW50OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgQmxvY2tSZWZlcmVuY2UqIAorRnJlZUltYWdlX1NhdmVQYWdlVG9CbG9jayhNVUxUSUJJVE1BUEhFQURFUiAqaGVhZGVyLCBGSUJJVE1BUCAqZGF0YSkgeworCWlmIChoZWFkZXItPnJlYWRfb25seSB8fCAhaGVhZGVyLT5sb2NrZWRfcGFnZXMuZW1wdHkoKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlEV09SRCBjb21wcmVzc2VkX3NpemUgPSAwOworCUJZVEUgKmNvbXByZXNzZWRfZGF0YSA9IE5VTEw7CisKKwkvLyBjb21wcmVzcyB0aGUgYml0bWFwIGRhdGEKKworCS8vIG9wZW4gYSBtZW1vcnkgaGFuZGxlCisJRklNRU1PUlkgKmhtZW0gPSBGcmVlSW1hZ2VfT3Blbk1lbW9yeSgpOworCWlmKGhtZW09PU5VTEwpIHJldHVybiBOVUxMOworCS8vIHNhdmUgdGhlIGZpbGUgdG8gbWVtb3J5CisJaWYoIUZyZWVJbWFnZV9TYXZlVG9NZW1vcnkoaGVhZGVyLT5jYWNoZV9maWYsIGRhdGEsIGhtZW0sIDApKSB7CisJCUZyZWVJbWFnZV9DbG9zZU1lbW9yeShobWVtKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8vIGdldCB0aGUgYnVmZmVyIGZyb20gdGhlIG1lbW9yeSBzdHJlYW0KKwlpZighRnJlZUltYWdlX0FjcXVpcmVNZW1vcnkoaG1lbSwgJmNvbXByZXNzZWRfZGF0YSwgJmNvbXByZXNzZWRfc2l6ZSkpIHsKKwkJRnJlZUltYWdlX0Nsb3NlTWVtb3J5KGhtZW0pOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvLyB3cml0ZSB0aGUgY29tcHJlc3NlZCBkYXRhIHRvIHRoZSBjYWNoZQorCWludCByZWYgPSBoZWFkZXItPm1fY2FjaGVmaWxlLT53cml0ZUZpbGUoY29tcHJlc3NlZF9kYXRhLCBjb21wcmVzc2VkX3NpemUpOworCS8vIGdldCByaWQgb2YgdGhlIGNvbXByZXNzZWQgZGF0YQorCUZyZWVJbWFnZV9DbG9zZU1lbW9yeShobWVtKTsKKworCXJldHVybiBuZXcoc3RkOjpub3Rocm93KSBCbG9ja1JlZmVyZW5jZShyZWYsIGNvbXByZXNzZWRfc2l6ZSk7Cit9CisKK3ZvaWQgRExMX0NBTExDT05WCitGcmVlSW1hZ2VfQXBwZW5kUGFnZShGSU1VTFRJQklUTUFQICpiaXRtYXAsIEZJQklUTUFQICpkYXRhKSB7CisJaWYgKCFiaXRtYXAgfHwgIWRhdGEpIAorCQlyZXR1cm47CisKKwlNVUxUSUJJVE1BUEhFQURFUiAqaGVhZGVyID0gRnJlZUltYWdlX0dldE11bHRpQml0bWFwSGVhZGVyKGJpdG1hcCk7CisKKwlCbG9ja1JlZmVyZW5jZSAqYmxvY2sgPSBGcmVlSW1hZ2VfU2F2ZVBhZ2VUb0Jsb2NrKGhlYWRlciwgZGF0YSk7CisJaWYoYmxvY2s9PU5VTEwpIHJldHVybjsKKworCS8vIGFkZCB0aGUgYmxvY2sKKwloZWFkZXItPm1fYmxvY2tzLnB1c2hfYmFjaygoQmxvY2tUeXBlUyAqKWJsb2NrKTsKKwloZWFkZXItPmNoYW5nZWQgPSBUUlVFOworCWhlYWRlci0+cGFnZV9jb3VudCA9IC0xOworfQorCit2b2lkIERMTF9DQUxMQ09OVgorRnJlZUltYWdlX0luc2VydFBhZ2UoRklNVUxUSUJJVE1BUCAqYml0bWFwLCBpbnQgcGFnZSwgRklCSVRNQVAgKmRhdGEpIHsKKwlpZiAoIWJpdG1hcCB8fCAhZGF0YSkgCisJCXJldHVybjsKKworCWlmIChwYWdlID49IEZyZWVJbWFnZV9HZXRQYWdlQ291bnQoYml0bWFwKSkgCisJCXJldHVybjsKKwkJCQorCU1VTFRJQklUTUFQSEVBREVSICpoZWFkZXIgPSBGcmVlSW1hZ2VfR2V0TXVsdGlCaXRtYXBIZWFkZXIoYml0bWFwKTsKKworCUJsb2NrUmVmZXJlbmNlICpibG9jayA9IEZyZWVJbWFnZV9TYXZlUGFnZVRvQmxvY2soaGVhZGVyLCBkYXRhKTsKKwlpZihibG9jaz09TlVMTCkgcmV0dXJuOworCisJLy8gYWRkIGEgYmxvY2sKKwlpZiAocGFnZSA+IDApIHsKKwkJQmxvY2tMaXN0SXRlcmF0b3IgYmxvY2tfc291cmNlID0gRnJlZUltYWdlX0ZpbmRCbG9jayhiaXRtYXAsIHBhZ2UpOwkJCisKKwkJaGVhZGVyLT5tX2Jsb2Nrcy5pbnNlcnQoYmxvY2tfc291cmNlLCAoQmxvY2tUeXBlUyAqKWJsb2NrKTsKKwl9IGVsc2UgeworCQloZWFkZXItPm1fYmxvY2tzLnB1c2hfZnJvbnQoKEJsb2NrVHlwZVMgKilibG9jayk7CisJfQorCisJaGVhZGVyLT5jaGFuZ2VkID0gVFJVRTsKKwloZWFkZXItPnBhZ2VfY291bnQgPSAtMTsKK30KKwordm9pZCBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9EZWxldGVQYWdlKEZJTVVMVElCSVRNQVAgKmJpdG1hcCwgaW50IHBhZ2UpIHsKKwlpZiAoYml0bWFwKSB7CisJCU1VTFRJQklUTUFQSEVBREVSICpoZWFkZXIgPSBGcmVlSW1hZ2VfR2V0TXVsdGlCaXRtYXBIZWFkZXIoYml0bWFwKTsKKworCQlpZiAoKCFoZWFkZXItPnJlYWRfb25seSkgJiYgKGhlYWRlci0+bG9ja2VkX3BhZ2VzLmVtcHR5KCkpKSB7CisJCQlpZiAoRnJlZUltYWdlX0dldFBhZ2VDb3VudChiaXRtYXApID4gMSkgeworCQkJCUJsb2NrTGlzdEl0ZXJhdG9yIGkgPSBGcmVlSW1hZ2VfRmluZEJsb2NrKGJpdG1hcCwgcGFnZSk7CisKKwkJCQlpZiAoaSAhPSBoZWFkZXItPm1fYmxvY2tzLmVuZCgpKSB7CisJCQkJCXN3aXRjaCgoKmkpLT5tX3R5cGUpIHsKKwkJCQkJCWNhc2UgQkxPQ0tfQ09OVElOVUVVUyA6CisJCQkJCQkJZGVsZXRlICppOworCQkJCQkJCWhlYWRlci0+bV9ibG9ja3MuZXJhc2UoaSk7CisJCQkJCQkJYnJlYWs7CisKKwkJCQkJCWNhc2UgQkxPQ0tfUkVGRVJFTkNFIDoKKwkJCQkJCQloZWFkZXItPm1fY2FjaGVmaWxlLT5kZWxldGVGaWxlKCgoQmxvY2tSZWZlcmVuY2UgKikoKmkpKS0+bV9yZWZlcmVuY2UpOworCQkJCQkJCWRlbGV0ZSAqaTsKKwkJCQkJCQloZWFkZXItPm1fYmxvY2tzLmVyYXNlKGkpOworCQkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJaGVhZGVyLT5jaGFuZ2VkID0gVFJVRTsKKwkJCQkJaGVhZGVyLT5wYWdlX2NvdW50ID0gLTE7CisJCQkJfQorCQkJfQorCQl9CisJfQorfQorCisKK0ZJQklUTUFQICogRExMX0NBTExDT05WCitGcmVlSW1hZ2VfTG9ja1BhZ2UoRklNVUxUSUJJVE1BUCAqYml0bWFwLCBpbnQgcGFnZSkgeworCWlmIChiaXRtYXApIHsKKwkJTVVMVElCSVRNQVBIRUFERVIgKmhlYWRlciA9IEZyZWVJbWFnZV9HZXRNdWx0aUJpdG1hcEhlYWRlcihiaXRtYXApOworCisJCS8vIG9ubHkgbG9jayBpZiB0aGUgcGFnZSB3YXNuJ3QgbG9ja2VkIGJlZm9yZS4uLgorCisJCWZvciAoc3RkOjptYXA8RklCSVRNQVAgKiwgaW50Pjo6aXRlcmF0b3IgaSA9IGhlYWRlci0+bG9ja2VkX3BhZ2VzLmJlZ2luKCk7IGkgIT0gaGVhZGVyLT5sb2NrZWRfcGFnZXMuZW5kKCk7ICsraSkgeworCQkJaWYgKGktPnNlY29uZCA9PSBwYWdlKSB7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCX0KKworCQkvLyBvcGVuIHRoZSBiaXRtYXAKKworCQloZWFkZXItPmlvLT5zZWVrX3Byb2MoaGVhZGVyLT5oYW5kbGUsIDAsIFNFRUtfU0VUKTsKKworICAgCQl2b2lkICpkYXRhID0gRnJlZUltYWdlX09wZW4oaGVhZGVyLT5ub2RlLCBoZWFkZXItPmlvLCBoZWFkZXItPmhhbmRsZSwgVFJVRSk7CisKKwkJLy8gbG9hZCB0aGUgYml0bWFwIGRhdGEKKworCQlpZiAoZGF0YSAhPSBOVUxMKSB7CisJCQlGSUJJVE1BUCAqZGliID0gKGhlYWRlci0+bm9kZS0+bV9wbHVnaW4tPmxvYWRfcHJvYyAhPSBOVUxMKSA/IGhlYWRlci0+bm9kZS0+bV9wbHVnaW4tPmxvYWRfcHJvYyhoZWFkZXItPmlvLCBoZWFkZXItPmhhbmRsZSwgcGFnZSwgaGVhZGVyLT5sb2FkX2ZsYWdzLCBkYXRhKSA6IE5VTEw7CisKKwkJCS8vIGNsb3NlIHRoZSBmaWxlCisKKwkJCUZyZWVJbWFnZV9DbG9zZShoZWFkZXItPm5vZGUsIGhlYWRlci0+aW8sIGhlYWRlci0+aGFuZGxlLCBkYXRhKTsKKworCQkJLy8gaWYgdGhlcmUgd2FzIHN0aWxsIGFub3RoZXIgYml0bWFwIG9wZW4sIGdldCByaWQgb2YgaXQKKworCQkJaWYgKGRpYikgeworCQkJCWhlYWRlci0+bG9ja2VkX3BhZ2VzW2RpYl0gPSBwYWdlOworCisJCQkJcmV0dXJuIGRpYjsKKwkJCX0JCisKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgRExMX0NBTExDT05WCitGcmVlSW1hZ2VfVW5sb2NrUGFnZShGSU1VTFRJQklUTUFQICpiaXRtYXAsIEZJQklUTUFQICpwYWdlLCBCT09MIGNoYW5nZWQpIHsKKwlpZiAoKGJpdG1hcCkgJiYgKHBhZ2UpKSB7CisJCU1VTFRJQklUTUFQSEVBREVSICpoZWFkZXIgPSBGcmVlSW1hZ2VfR2V0TXVsdGlCaXRtYXBIZWFkZXIoYml0bWFwKTsKKworCQkvLyBmaW5kIG91dCBpZiB0aGUgcGFnZSB3ZSB0cnkgdG8gdW5sb2NrIGlzIGFjdHVhbGx5IGxvY2tlZC4uLgorCisJCWlmIChoZWFkZXItPmxvY2tlZF9wYWdlcy5maW5kKHBhZ2UpICE9IGhlYWRlci0+bG9ja2VkX3BhZ2VzLmVuZCgpKSB7CisJCQkvLyBzdG9yZSB0aGUgYml0bWFwIGNvbXByZXNzZWQgaW4gdGhlIGNhY2hlIGZvciBsYXRlciB3cml0aW5nCisKKwkJCWlmIChjaGFuZ2VkICYmICFoZWFkZXItPnJlYWRfb25seSkgeworCQkJCWhlYWRlci0+Y2hhbmdlZCA9IFRSVUU7CisKKwkJCQkvLyBjdXQgbG9vc2UgdGhlIGJsb2NrIGZyb20gdGhlIHJlc3QKKworCQkJCUJsb2NrTGlzdEl0ZXJhdG9yIGkgPSBGcmVlSW1hZ2VfRmluZEJsb2NrKGJpdG1hcCwgaGVhZGVyLT5sb2NrZWRfcGFnZXNbcGFnZV0pOworCisJCQkJLy8gY29tcHJlc3MgdGhlIGRhdGEKKworCQkJCURXT1JEIGNvbXByZXNzZWRfc2l6ZSA9IDA7CisJCQkJQllURSAqY29tcHJlc3NlZF9kYXRhID0gTlVMTDsKKworCQkJCS8vIG9wZW4gYSBtZW1vcnkgaGFuZGxlCisJCQkJRklNRU1PUlkgKmhtZW0gPSBGcmVlSW1hZ2VfT3Blbk1lbW9yeSgpOworCQkJCS8vIHNhdmUgdGhlIHBhZ2UgdG8gbWVtb3J5CisJCQkJRnJlZUltYWdlX1NhdmVUb01lbW9yeShoZWFkZXItPmNhY2hlX2ZpZiwgcGFnZSwgaG1lbSwgMCk7CisJCQkJLy8gZ2V0IHRoZSBidWZmZXIgZnJvbSB0aGUgbWVtb3J5IHN0cmVhbQorCQkJCUZyZWVJbWFnZV9BY3F1aXJlTWVtb3J5KGhtZW0sICZjb21wcmVzc2VkX2RhdGEsICZjb21wcmVzc2VkX3NpemUpOworCisJCQkJLy8gd3JpdGUgdGhlIGRhdGEgdG8gdGhlIGNhY2hlCisKKwkJCQlzd2l0Y2ggKCgqaSktPm1fdHlwZSkgeworCQkJCQljYXNlIEJMT0NLX0NPTlRJTlVFVVMgOgorCQkJCQl7CisJCQkJCQlpbnQgaVBhZ2UgPSBoZWFkZXItPm1fY2FjaGVmaWxlLT53cml0ZUZpbGUoY29tcHJlc3NlZF9kYXRhLCBjb21wcmVzc2VkX3NpemUpOworCisJCQkJCQlkZWxldGUgKCppKTsKKworCQkJCQkJKmkgPSAoQmxvY2tUeXBlUyAqKW5ldyBCbG9ja1JlZmVyZW5jZShpUGFnZSwgY29tcHJlc3NlZF9zaXplKTsKKworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQljYXNlIEJMT0NLX1JFRkVSRU5DRSA6CisJCQkJCXsKKwkJCQkJCUJsb2NrUmVmZXJlbmNlICpyZWZlcmVuY2UgPSAoQmxvY2tSZWZlcmVuY2UgKikoKmkpOworCisJCQkJCQloZWFkZXItPm1fY2FjaGVmaWxlLT5kZWxldGVGaWxlKHJlZmVyZW5jZS0+bV9yZWZlcmVuY2UpOworCisJCQkJCQlkZWxldGUgKCppKTsKKworCQkJCQkJaW50IGlQYWdlID0gaGVhZGVyLT5tX2NhY2hlZmlsZS0+d3JpdGVGaWxlKGNvbXByZXNzZWRfZGF0YSwgY29tcHJlc3NlZF9zaXplKTsKKworCQkJCQkJKmkgPSAoQmxvY2tUeXBlUyAqKW5ldyBCbG9ja1JlZmVyZW5jZShpUGFnZSwgY29tcHJlc3NlZF9zaXplKTsKKworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisKKwkJCQkvLyBnZXQgcmlkIG9mIHRoZSBjb21wcmVzc2VkIGRhdGEKKworCQkJCUZyZWVJbWFnZV9DbG9zZU1lbW9yeShobWVtKTsKKwkJCX0KKworCQkJLy8gcmVzZXQgdGhlIGxvY2tlZCBwYWdlIHNvIHRoYXQgYW5vdGhlciBwYWdlIGNhbiBiZSBsb2NrZWQKKworCQkJRnJlZUltYWdlX1VubG9hZChwYWdlKTsKKworCQkJaGVhZGVyLT5sb2NrZWRfcGFnZXMuZXJhc2UocGFnZSk7CisJCX0KKwl9Cit9CisKK0JPT0wgRExMX0NBTExDT05WCitGcmVlSW1hZ2VfTW92ZVBhZ2UoRklNVUxUSUJJVE1BUCAqYml0bWFwLCBpbnQgdGFyZ2V0LCBpbnQgc291cmNlKSB7CisJaWYgKGJpdG1hcCkgeworCQlNVUxUSUJJVE1BUEhFQURFUiAqaGVhZGVyID0gRnJlZUltYWdlX0dldE11bHRpQml0bWFwSGVhZGVyKGJpdG1hcCk7CisKKwkJaWYgKCghaGVhZGVyLT5yZWFkX29ubHkpICYmIChoZWFkZXItPmxvY2tlZF9wYWdlcy5lbXB0eSgpKSkgeworCQkJaWYgKCh0YXJnZXQgIT0gc291cmNlKSAmJiAoKHRhcmdldCA+PSAwKSAmJiAodGFyZ2V0IDwgRnJlZUltYWdlX0dldFBhZ2VDb3VudChiaXRtYXApKSkgJiYgKChzb3VyY2UgPj0gMCkgJiYgKHNvdXJjZSA8IEZyZWVJbWFnZV9HZXRQYWdlQ291bnQoYml0bWFwKSkpKSB7CisJCQkJQmxvY2tMaXN0SXRlcmF0b3IgYmxvY2tfc291cmNlID0gRnJlZUltYWdlX0ZpbmRCbG9jayhiaXRtYXAsIHRhcmdldCk7CisJCQkJQmxvY2tMaXN0SXRlcmF0b3IgYmxvY2tfdGFyZ2V0ID0gRnJlZUltYWdlX0ZpbmRCbG9jayhiaXRtYXAsIHNvdXJjZSk7CisKKwkJCQloZWFkZXItPm1fYmxvY2tzLmluc2VydChibG9ja190YXJnZXQsICpibG9ja19zb3VyY2UpOwkJCQorCQkJCWhlYWRlci0+bV9ibG9ja3MuZXJhc2UoYmxvY2tfc291cmNlKTsKKworCQkJCWhlYWRlci0+Y2hhbmdlZCA9IFRSVUU7CisKKwkJCQlyZXR1cm4gVFJVRTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBGQUxTRTsKK30KKworQk9PTCBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9HZXRMb2NrZWRQYWdlTnVtYmVycyhGSU1VTFRJQklUTUFQICpiaXRtYXAsIGludCAqcGFnZXMsIGludCAqY291bnQpIHsKKwlpZiAoKGJpdG1hcCkgJiYgKGNvdW50KSkgeworCQlNVUxUSUJJVE1BUEhFQURFUiAqaGVhZGVyID0gRnJlZUltYWdlX0dldE11bHRpQml0bWFwSGVhZGVyKGJpdG1hcCk7CisKKwkJaWYgKChwYWdlcyA9PSBOVUxMKSB8fCAoKmNvdW50ID09IDApKSB7CisJCQkqY291bnQgPSAoaW50KWhlYWRlci0+bG9ja2VkX3BhZ2VzLnNpemUoKTsKKwkJfSBlbHNlIHsKKwkJCWludCBjID0gMDsKKworCQkJZm9yIChzdGQ6Om1hcDxGSUJJVE1BUCAqLCBpbnQ+OjppdGVyYXRvciBpID0gaGVhZGVyLT5sb2NrZWRfcGFnZXMuYmVnaW4oKTsgaSAhPSBoZWFkZXItPmxvY2tlZF9wYWdlcy5lbmQoKTsgKytpKSB7CisJCQkJcGFnZXNbY10gPSBpLT5zZWNvbmQ7CisKKwkJCQljKys7CisKKwkJCQlpZiAoYyA9PSAqY291bnQpCisJCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJcmV0dXJuIFRSVUU7CisJfQorCisJcmV0dXJuIEZBTFNFOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIE1lbW9yeSBJTyBNdWx0aXBhZ2UgZnVuY3Rpb25zCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworRklNVUxUSUJJVE1BUCAqIERMTF9DQUxMQ09OVgorRnJlZUltYWdlX0xvYWRNdWx0aUJpdG1hcEZyb21NZW1vcnkoRlJFRV9JTUFHRV9GT1JNQVQgZmlmLCBGSU1FTU9SWSAqc3RyZWFtLCBpbnQgZmxhZ3MpIHsKKwlCT09MIHJlYWRfb25seSA9IEZBTFNFOwkvLyBtb2RpZmljYXRpb25zIChpZiBhbnkpIHdpbGwgYmUgc3RvcmVkIGludG8gdGhlIG1lbW9yeSBjYWNoZQorCisJLy8gcmV0cmlldmUgdGhlIHBsdWdpbiBsaXN0IHRvIGZpbmQgdGhlIG5vZGUgYmVsb25naW5nIHRvIHRoaXMgcGx1Z2luCisKKwlQbHVnaW5MaXN0ICpsaXN0ID0gRnJlZUltYWdlX0dldFBsdWdpbkxpc3QoKTsKKworCWlmIChsaXN0KSB7CisJCVBsdWdpbk5vZGUgKm5vZGUgPSBsaXN0LT5GaW5kTm9kZUZyb21GSUYoZmlmKTsKKworCQlpZiAobm9kZSkgeworCQkJRnJlZUltYWdlSU8gKmlvID0gbmV3KHN0ZDo6bm90aHJvdykgRnJlZUltYWdlSU87CisKKwkJCWlmIChpbykgeworCQkJCVNldE1lbW9yeUlPKGlvKTsKKworCQkJCUZJTVVMVElCSVRNQVAgKmJpdG1hcCA9IG5ldyhzdGQ6Om5vdGhyb3cpIEZJTVVMVElCSVRNQVA7CisKKwkJCQlpZiAoYml0bWFwKSB7CisJCQkJCU1VTFRJQklUTUFQSEVBREVSICpoZWFkZXIgPSBuZXcoc3RkOjpub3Rocm93KSBNVUxUSUJJVE1BUEhFQURFUjsKKworCQkJCQlpZiAoaGVhZGVyKSB7CisJCQkJCQloZWFkZXItPm1fZmlsZW5hbWUgPSBOVUxMOworCQkJCQkJaGVhZGVyLT5ub2RlID0gbm9kZTsKKwkJCQkJCWhlYWRlci0+ZmlmID0gZmlmOworCQkJCQkJaGVhZGVyLT5pbyA9IGlvOworCQkJCQkJaGVhZGVyLT5oYW5kbGUgPSAoZmlfaGFuZGxlKXN0cmVhbTsJCQkJCQkKKwkJCQkJCWhlYWRlci0+Y2hhbmdlZCA9IEZBTFNFOwkJCQkJCQorCQkJCQkJaGVhZGVyLT5yZWFkX29ubHkgPSByZWFkX29ubHk7CisJCQkJCQloZWFkZXItPm1fY2FjaGVmaWxlID0gTlVMTDsKKwkJCQkJCWhlYWRlci0+Y2FjaGVfZmlmID0gZmlmOworCQkJCQkJaGVhZGVyLT5sb2FkX2ZsYWdzID0gZmxhZ3M7CisKKwkJCQkJCS8vIHN0b3JlIHRoZSBNVUxUSUJJVE1BUEhFQURFUiBpbiB0aGUgc3Vycm91bmRpbmcgRklNVUxUSUJJVE1BUCBzdHJ1Y3R1cmUKKworCQkJCQkJYml0bWFwLT5kYXRhID0gaGVhZGVyOworCisJCQkJCQkvLyBjYWNoZSB0aGUgcGFnZSBjb3VudAorCisJCQkJCQloZWFkZXItPnBhZ2VfY291bnQgPSBGcmVlSW1hZ2VfSW50ZXJuYWxHZXRQYWdlQ291bnQoYml0bWFwKTsKKworCQkJCQkJLy8gYWxsb2NhdGUgYSBjb250aW51ZXVzIGJsb2NrIHRvIGRlc2NyaWJlIHRoZSBiaXRtYXAKKworCQkJCQkJaGVhZGVyLT5tX2Jsb2Nrcy5wdXNoX2JhY2soKEJsb2NrVHlwZVMgKiluZXcgQmxvY2tDb250aW51ZXVzKDAsIGhlYWRlci0+cGFnZV9jb3VudCAtIDEpKTsKKwkJCQkJCQorCQkJCQkJaWYgKCFyZWFkX29ubHkpIHsKKwkJCQkJCQkvLyBzZXQgdXAgdGhlIGNhY2hlCisJCQkJCQkJQ2FjaGVGaWxlICpjYWNoZV9maWxlID0gbmV3KHN0ZDo6bm90aHJvdykgQ2FjaGVGaWxlKCIiLCBUUlVFKTsKKwkJCQkJCQkKKwkJCQkJCQlpZiAoY2FjaGVfZmlsZSAmJiBjYWNoZV9maWxlLT5vcGVuKCkpIHsKKwkJCQkJCQkJaGVhZGVyLT5tX2NhY2hlZmlsZSA9IGNhY2hlX2ZpbGU7CisJCQkJCQkJfQorCQkJCQkJfQorCisJCQkJCQlyZXR1cm4gYml0bWFwOworCQkJCQl9CisJCQkJCQorCQkJCQlkZWxldGUgYml0bWFwOworCQkJCX0KKwkJCQkKKwkJCQlkZWxldGUgaW87CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworQk9PTCBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9TYXZlTXVsdGlCaXRtYXBUb01lbW9yeShGUkVFX0lNQUdFX0ZPUk1BVCBmaWYsIEZJTVVMVElCSVRNQVAgKmJpdG1hcCwgRklNRU1PUlkgKnN0cmVhbSwgaW50IGZsYWdzKSB7CisJaWYgKHN0cmVhbSAmJiBzdHJlYW0tPmRhdGEpIHsKKwkJRnJlZUltYWdlSU8gaW87CisJCVNldE1lbW9yeUlPKCZpbyk7CisKKwkJcmV0dXJuIEZyZWVJbWFnZV9TYXZlTXVsdGlCaXRtYXBUb0hhbmRsZShmaWYsIGJpdG1hcCwgJmlvLCAoZmlfaGFuZGxlKXN0cmVhbSwgZmxhZ3MpOworCX0KKworCXJldHVybiBGQUxTRTsKK30KZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvTk5RdWFudGl6ZXIuY3BwIGIvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9OTlF1YW50aXplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkwN2M0MQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvTk5RdWFudGl6ZXIuY3BwCkBAIC0wLDAgKzEsNTA3IEBACisvLyBOZXVRdWFudCBOZXVyYWwtTmV0IFF1YW50aXphdGlvbiBBbGdvcml0aG0KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIENvcHlyaWdodCAoYykgMTk5NCBBbnRob255IERla2tlcgorLy8KKy8vIE5FVVFVQU5UIE5ldXJhbC1OZXQgcXVhbnRpemF0aW9uIGFsZ29yaXRobSBieSBBbnRob255IERla2tlciwgMTk5NC4KKy8vIFNlZSAiS29ob25lbiBuZXVyYWwgbmV0d29ya3MgZm9yIG9wdGltYWwgY29sb3VyIHF1YW50aXphdGlvbiIKKy8vIGluICJOZXR3b3JrOiBDb21wdXRhdGlvbiBpbiBOZXVyYWwgU3lzdGVtcyIgVm9sLiA1ICgxOTk0KSBwcCAzNTEtMzY3LgorLy8gZm9yIGEgZGlzY3Vzc2lvbiBvZiB0aGUgYWxnb3JpdGhtLgorLy8KKy8vIEFueSBwYXJ0eSBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoZXNlIGZpbGVzIGZyb20gdGhlIGF1dGhvciwgZGlyZWN0bHkgb3IKKy8vIGluZGlyZWN0bHksIGlzIGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCBhIGZ1bGwgYW5kIHVucmVzdHJpY3RlZCBpcnJldm9jYWJsZSwKKy8vIHdvcmxkLXdpZGUsIHBhaWQgdXAsIHJveWFsdHktZnJlZSwgbm9uZXhjbHVzaXZlIHJpZ2h0IGFuZCBsaWNlbnNlIHRvIGRlYWwKKy8vIGluIHRoaXMgc29mdHdhcmUgYW5kIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgaW5jbHVkaW5nIHdpdGhvdXQKKy8vIGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisvLyBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgd2hvIHJlY2VpdmUKKy8vIGNvcGllcyBmcm9tIGFueSBzdWNoIHBhcnR5IHRvIGRvIHNvLCB3aXRoIHRoZSBvbmx5IHJlcXVpcmVtZW50IGJlaW5nCisvLyB0aGF0IHRoaXMgY29weXJpZ2h0IG5vdGljZSByZW1haW4gaW50YWN0LgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gSGlzdG9yeQorLy8gLS0tLS0tLQorLy8gSmFudWFyeSAyMDAxOiBBZGFwdGF0aW9uIG9mIHRoZSBOZXVyYWwtTmV0IFF1YW50aXphdGlvbiBBbGdvcml0aG0KKy8vICAgICAgICAgICAgICAgZm9yIHRoZSBGcmVlSW1hZ2UgMiBsaWJyYXJ5CisvLyAgICAgICAgICAgICAgIEF1dGhvcjogSGVydukgRHJvbG9uIChkcm9sb25AaW5mb25pZS5mcikKKy8vIE1hcmNoIDIwMDQ6ICAgQWRhcHRhdGlvbiBmb3IgdGhlIEZyZWVJbWFnZSAzIGxpYnJhcnkgKHBvcnQgdG8gYmlnIGVuZGlhbiBwcm9jZXNzb3JzKQorLy8gICAgICAgICAgICAgICBBdXRob3I6IEhlcnbpIERyb2xvbiAoZHJvbG9uQGluZm9uaWUuZnIpCisvLyBBcHJpbCAyMDA0OiAgIEFsZ29yaXRobSByZXdyaXR0ZW4gYXMgYSBDKysgY2xhc3MuIAorLy8gICAgICAgICAgICAgICBGaXhlZCBhIGJ1ZyBpbiB0aGUgYWxnb3JpdGhtIHdpdGggaGFuZGxpbmcgb2YgNC1ieXRlIGJvdW5kYXJ5IGFsaWdubWVudC4KKy8vICAgICAgICAgICAgICAgQXV0aG9yOiBIZXJ26SBEcm9sb24gKGRyb2xvbkBpbmZvbmllLmZyKQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2luY2x1ZGUgIlF1YW50aXplcnMuaCIKKyNpbmNsdWRlICJGcmVlSW1hZ2UuaCIKKyNpbmNsdWRlICJVdGlsaXRpZXMuaCIKKworCisvLyBGb3VyIHByaW1lcyBuZWFyIDUwMCAtIGFzc3VtZSBubyBpbWFnZSBoYXMgYSBsZW5ndGggc28gbGFyZ2UKKy8vIHRoYXQgaXQgaXMgZGl2aXNpYmxlIGJ5IGFsbCBmb3VyIHByaW1lcworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjZGVmaW5lIHByaW1lMQkJNDk5CisjZGVmaW5lIHByaW1lMgkJNDkxCisjZGVmaW5lIHByaW1lMwkJNDg3CisjZGVmaW5lIHByaW1lNAkJNTAzCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTk5RdWFudGl6ZXI6Ok5OUXVhbnRpemVyKGludCBQYWxldHRlU2l6ZSkKK3sKKwluZXRzaXplID0gUGFsZXR0ZVNpemU7CisJbWF4bmV0cG9zID0gbmV0c2l6ZSAtIDE7CisJaW5pdHJhZCA9IG5ldHNpemUgPCA4ID8gMSA6IChuZXRzaXplID4+IDMpOworCWluaXRyYWRpdXMgPSAoaW5pdHJhZCAqIHJhZGl1c2JpYXMpOworCisJbmV0d29yayA9IE5VTEw7CisKKwluZXR3b3JrID0gKHBpeGVsICopbWFsbG9jKG5ldHNpemUgKiBzaXplb2YocGl4ZWwpKTsKKwliaWFzID0gKGludCAqKW1hbGxvYyhuZXRzaXplICogc2l6ZW9mKGludCkpOworCWZyZXEgPSAoaW50ICopbWFsbG9jKG5ldHNpemUgKiBzaXplb2YoaW50KSk7CisJcmFkcG93ZXIgPSAoaW50ICopbWFsbG9jKGluaXRyYWQgKiBzaXplb2YoaW50KSk7CisKKwlpZiggIW5ldHdvcmsgfHwgIWJpYXMgfHwgIWZyZXEgfHwgIXJhZHBvd2VyICkgeworCQlpZihuZXR3b3JrKSBmcmVlKG5ldHdvcmspOworCQlpZihiaWFzKSBmcmVlKGJpYXMpOworCQlpZihmcmVxKSBmcmVlKGZyZXEpOworCQlpZihyYWRwb3dlcikgZnJlZShyYWRwb3dlcik7CisJCXRocm93IEZJX01TR19FUlJPUl9NRU1PUlk7CisJfQorfQorCitOTlF1YW50aXplcjo6fk5OUXVhbnRpemVyKCkKK3sKKwlpZihuZXR3b3JrKSBmcmVlKG5ldHdvcmspOworCWlmKGJpYXMpIGZyZWUoYmlhcyk7CisJaWYoZnJlcSkgZnJlZShmcmVxKTsKKwlpZihyYWRwb3dlcikgZnJlZShyYWRwb3dlcik7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gSW5pdGlhbGlzZSBuZXR3b3JrIGluIHJhbmdlICgwLDAsMCkgdG8gKDI1NSwyNTUsMjU1KSBhbmQgc2V0IHBhcmFtZXRlcnMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgTk5RdWFudGl6ZXI6OmluaXRuZXQoKSB7CisJaW50IGksICpwOworCisJZm9yIChpID0gMDsgaSA8IG5ldHNpemU7IGkrKykgeworCQlwID0gbmV0d29ya1tpXTsKKwkJcFtGSV9SR0JBX0JMVUVdID0gcFtGSV9SR0JBX0dSRUVOXSA9IHBbRklfUkdCQV9SRURdID0gKGkgPDwgKG5ldGJpYXNzaGlmdCs4KSkvbmV0c2l6ZTsKKwkJZnJlcVtpXSA9IGludGJpYXMvbmV0c2l6ZTsJLyogMS9uZXRzaXplICovCisJCWJpYXNbaV0gPSAwOworCX0KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCQorLy8gVW5iaWFzIG5ldHdvcmsgdG8gZ2l2ZSBieXRlIHZhbHVlcyAwLi4yNTUgYW5kIHJlY29yZCBwb3NpdGlvbiBpIHRvIHByZXBhcmUgZm9yIHNvcnQKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIE5OUXVhbnRpemVyOjp1bmJpYXNuZXQoKSB7CisJaW50IGksIGosIHRlbXA7CisKKwlmb3IgKGkgPSAwOyBpIDwgbmV0c2l6ZTsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCAzOyBqKyspIHsKKwkJCS8vIE9MRCBDT0RFOiBuZXR3b3JrW2ldW2pdID4+PSBuZXRiaWFzc2hpZnQ7IAorCQkJLy8gRml4IGJhc2VkIG9uIGJ1ZyByZXBvcnQgYnkgSnVlcmdlbiBXZWlnZXJ0IGp3QHN1c2UuZGUKKwkJCXRlbXAgPSAobmV0d29ya1tpXVtqXSArICgxIDw8IChuZXRiaWFzc2hpZnQgLSAxKSkpID4+IG5ldGJpYXNzaGlmdDsKKwkJCWlmICh0ZW1wID4gMjU1KSB0ZW1wID0gMjU1OworCQkJbmV0d29ya1tpXVtqXSA9IHRlbXA7CisJCX0KKwkJbmV0d29ya1tpXVszXSA9IGk7CQkJLy8gcmVjb3JkIGNvbG91ciBubyAKKwl9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEluc2VydGlvbiBzb3J0IG9mIG5ldHdvcmsgYW5kIGJ1aWxkaW5nIG9mIG5ldGluZGV4WzAuLjI1NV0gKHRvIGRvIGFmdGVyIHVuYmlhcykKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBOTlF1YW50aXplcjo6aW54YnVpbGQoKSB7CisJaW50IGksaixzbWFsbHBvcyxzbWFsbHZhbDsKKwlpbnQgKnAsKnE7CisJaW50IHByZXZpb3VzY29sLHN0YXJ0cG9zOworCisJcHJldmlvdXNjb2wgPSAwOworCXN0YXJ0cG9zID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgbmV0c2l6ZTsgaSsrKSB7CisJCXAgPSBuZXR3b3JrW2ldOworCQlzbWFsbHBvcyA9IGk7CisJCXNtYWxsdmFsID0gcFtGSV9SR0JBX0dSRUVOXTsJCQkvLyBpbmRleCBvbiBnCisJCS8vIGZpbmQgc21hbGxlc3QgaW4gaS4ubmV0c2l6ZS0xCisJCWZvciAoaiA9IGkrMTsgaiA8IG5ldHNpemU7IGorKykgeworCQkJcSA9IG5ldHdvcmtbal07CisJCQlpZiAocVtGSV9SR0JBX0dSRUVOXSA8IHNtYWxsdmFsKSB7CS8vIGluZGV4IG9uIGcKKwkJCQlzbWFsbHBvcyA9IGo7CisJCQkJc21hbGx2YWwgPSBxW0ZJX1JHQkFfR1JFRU5dOwkvLyBpbmRleCBvbiBnCisJCQl9CisJCX0KKwkJcSA9IG5ldHdvcmtbc21hbGxwb3NdOworCQkvLyBzd2FwIHAgKGkpIGFuZCBxIChzbWFsbHBvcykgZW50cmllcworCQlpZiAoaSAhPSBzbWFsbHBvcykgeworCQkJaiA9IHFbRklfUkdCQV9CTFVFXTsgIHFbRklfUkdCQV9CTFVFXSAgPSBwW0ZJX1JHQkFfQkxVRV07ICBwW0ZJX1JHQkFfQkxVRV0gID0gajsKKwkJCWogPSBxW0ZJX1JHQkFfR1JFRU5dOyBxW0ZJX1JHQkFfR1JFRU5dID0gcFtGSV9SR0JBX0dSRUVOXTsgcFtGSV9SR0JBX0dSRUVOXSA9IGo7CisJCQlqID0gcVtGSV9SR0JBX1JFRF07ICAgcVtGSV9SR0JBX1JFRF0gICA9IHBbRklfUkdCQV9SRURdOyAgIHBbRklfUkdCQV9SRURdICAgPSBqOworCQkJaiA9IHFbM107ICAgcVszXSA9IHBbM107ICAgcFszXSA9IGo7CisJCX0KKwkJLy8gc21hbGx2YWwgZW50cnkgaXMgbm93IGluIHBvc2l0aW9uIGkKKwkJaWYgKHNtYWxsdmFsICE9IHByZXZpb3VzY29sKSB7CisJCQluZXRpbmRleFtwcmV2aW91c2NvbF0gPSAoc3RhcnRwb3MraSk+PjE7CisJCQlmb3IgKGogPSBwcmV2aW91c2NvbCsxOyBqIDwgc21hbGx2YWw7IGorKykKKwkJCQluZXRpbmRleFtqXSA9IGk7CisJCQlwcmV2aW91c2NvbCA9IHNtYWxsdmFsOworCQkJc3RhcnRwb3MgPSBpOworCQl9CisJfQorCW5ldGluZGV4W3ByZXZpb3VzY29sXSA9IChzdGFydHBvcyttYXhuZXRwb3MpPj4xOworCWZvciAoaiA9IHByZXZpb3VzY29sKzE7IGogPCAyNTY7IGorKykKKwkJbmV0aW5kZXhbal0gPSBtYXhuZXRwb3M7IC8vIHJlYWxseSAyNTYKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gU2VhcmNoIGZvciBCR1IgdmFsdWVzIDAuLjI1NSAoYWZ0ZXIgbmV0IGlzIHVuYmlhc2VkKSBhbmQgcmV0dXJuIGNvbG91ciBpbmRleAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgTk5RdWFudGl6ZXI6OmlueHNlYXJjaChpbnQgYiwgaW50IGcsIGludCByKSB7CisJaW50IGksIGosIGRpc3QsIGEsIGJlc3RkOworCWludCAqcDsKKwlpbnQgYmVzdDsKKworCWJlc3RkID0gMTAwMDsJCS8vIGJpZ2dlc3QgcG9zc2libGUgZGlzdCBpcyAyNTYqMworCWJlc3QgPSAtMTsKKwlpID0gbmV0aW5kZXhbZ107CS8vIGluZGV4IG9uIGcKKwlqID0gaS0xOwkJCS8vIHN0YXJ0IGF0IG5ldGluZGV4W2ddIGFuZCB3b3JrIG91dHdhcmRzCisKKwl3aGlsZSAoKGkgPCBuZXRzaXplKSB8fCAoaiA+PSAwKSkgeworCQlpZiAoaSA8IG5ldHNpemUpIHsKKwkJCXAgPSBuZXR3b3JrW2ldOworCQkJZGlzdCA9IHBbRklfUkdCQV9HUkVFTl0gLSBnOwkJCQkvLyBpbngga2V5CisJCQlpZiAoZGlzdCA+PSBiZXN0ZCkKKwkJCQlpID0gbmV0c2l6ZTsJLy8gc3RvcCBpdGVyCisJCQllbHNlIHsKKwkJCQlpKys7CisJCQkJaWYgKGRpc3QgPCAwKQorCQkJCQlkaXN0ID0gLWRpc3Q7CisJCQkJYSA9IHBbRklfUkdCQV9CTFVFXSAtIGI7CisJCQkJaWYgKGEgPCAwKQorCQkJCQlhID0gLWE7CisJCQkJZGlzdCArPSBhOworCQkJCWlmIChkaXN0IDwgYmVzdGQpIHsKKwkJCQkJYSA9IHBbRklfUkdCQV9SRURdIC0gcjsKKwkJCQkJaWYgKGE8MCkKKwkJCQkJCWEgPSAtYTsKKwkJCQkJZGlzdCArPSBhOworCQkJCQlpZiAoZGlzdCA8IGJlc3RkKSB7CisJCQkJCQliZXN0ZCA9IGRpc3Q7CisJCQkJCQliZXN0ID0gcFszXTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoaiA+PSAwKSB7CisJCQlwID0gbmV0d29ya1tqXTsKKwkJCWRpc3QgPSBnIC0gcFtGSV9SR0JBX0dSRUVOXTsJCQkvLyBpbngga2V5IC0gcmV2ZXJzZSBkaWYKKwkJCWlmIChkaXN0ID49IGJlc3RkKQorCQkJCWogPSAtMTsJLy8gc3RvcCBpdGVyCisJCQllbHNlIHsKKwkJCQlqLS07CisJCQkJaWYgKGRpc3QgPCAwKQorCQkJCQlkaXN0ID0gLWRpc3Q7CisJCQkJYSA9IHBbRklfUkdCQV9CTFVFXSAtIGI7CisJCQkJaWYgKGE8MCkKKwkJCQkJYSA9IC1hOworCQkJCWRpc3QgKz0gYTsKKwkJCQlpZiAoZGlzdCA8IGJlc3RkKSB7CisJCQkJCWEgPSBwW0ZJX1JHQkFfUkVEXSAtIHI7CisJCQkJCWlmIChhPDApCisJCQkJCQlhID0gLWE7CisJCQkJCWRpc3QgKz0gYTsKKwkJCQkJaWYgKGRpc3QgPCBiZXN0ZCkgeworCQkJCQkJYmVzdGQgPSBkaXN0OworCQkJCQkJYmVzdCA9IHBbM107CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIGJlc3Q7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFNlYXJjaCBmb3IgYmlhc2VkIEJHUiB2YWx1ZXMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50IE5OUXVhbnRpemVyOjpjb250ZXN0KGludCBiLCBpbnQgZywgaW50IHIpIHsKKwkvLyBmaW5kcyBjbG9zZXN0IG5ldXJvbiAobWluIGRpc3QpIGFuZCB1cGRhdGVzIGZyZXEKKwkvLyBmaW5kcyBiZXN0IG5ldXJvbiAobWluIGRpc3QtYmlhcykgYW5kIHJldHVybnMgcG9zaXRpb24KKwkvLyBmb3IgZnJlcXVlbnRseSBjaG9zZW4gbmV1cm9ucywgZnJlcVtpXSBpcyBoaWdoIGFuZCBiaWFzW2ldIGlzIG5lZ2F0aXZlCisJLy8gYmlhc1tpXSA9IGdhbW1hKigoMS9uZXRzaXplKS1mcmVxW2ldKQorCisJaW50IGksZGlzdCxhLGJpYXNkaXN0LGJldGFmcmVxOworCWludCBiZXN0cG9zLGJlc3RiaWFzcG9zLGJlc3RkLGJlc3RiaWFzZDsKKwlpbnQgKnAsKmYsICpuOworCisJYmVzdGQgPSB+KCgoaW50KSAxKTw8MzEpOworCWJlc3RiaWFzZCA9IGJlc3RkOworCWJlc3Rwb3MgPSAtMTsKKwliZXN0Ymlhc3BvcyA9IGJlc3Rwb3M7CisJcCA9IGJpYXM7CisJZiA9IGZyZXE7CisKKwlmb3IgKGkgPSAwOyBpIDwgbmV0c2l6ZTsgaSsrKSB7CisJCW4gPSBuZXR3b3JrW2ldOworCQlkaXN0ID0gbltGSV9SR0JBX0JMVUVdIC0gYjsKKwkJaWYgKGRpc3QgPCAwKQorCQkJZGlzdCA9IC1kaXN0OworCQlhID0gbltGSV9SR0JBX0dSRUVOXSAtIGc7CisJCWlmIChhIDwgMCkKKwkJCWEgPSAtYTsKKwkJZGlzdCArPSBhOworCQlhID0gbltGSV9SR0JBX1JFRF0gLSByOworCQlpZiAoYSA8IDApCisJCQlhID0gLWE7CisJCWRpc3QgKz0gYTsKKwkJaWYgKGRpc3QgPCBiZXN0ZCkgeworCQkJYmVzdGQgPSBkaXN0OworCQkJYmVzdHBvcyA9IGk7CisJCX0KKwkJYmlhc2Rpc3QgPSBkaXN0IC0gKCgqcCk+PihpbnRiaWFzc2hpZnQtbmV0Ymlhc3NoaWZ0KSk7CisJCWlmIChiaWFzZGlzdCA8IGJlc3RiaWFzZCkgeworCQkJYmVzdGJpYXNkID0gYmlhc2Rpc3Q7CisJCQliZXN0Ymlhc3BvcyA9IGk7CisJCX0KKwkJYmV0YWZyZXEgPSAoKmYgPj4gYmV0YXNoaWZ0KTsKKwkJKmYrKyAtPSBiZXRhZnJlcTsKKwkJKnArKyArPSAoYmV0YWZyZXEgPDwgZ2FtbWFzaGlmdCk7CisJfQorCWZyZXFbYmVzdHBvc10gKz0gYmV0YTsKKwliaWFzW2Jlc3Rwb3NdIC09IGJldGFnYW1tYTsKKwlyZXR1cm4gYmVzdGJpYXNwb3M7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIE1vdmUgbmV1cm9uIGkgdG93YXJkcyBiaWFzZWQgKGIsZyxyKSBieSBmYWN0b3IgYWxwaGEKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisKK3ZvaWQgTk5RdWFudGl6ZXI6OmFsdGVyc2luZ2xlKGludCBhbHBoYSwgaW50IGksIGludCBiLCBpbnQgZywgaW50IHIpIHsKKwlpbnQgKm47CisKKwluID0gbmV0d29ya1tpXTsJCQkJLy8gYWx0ZXIgaGl0IG5ldXJvbgorCW5bRklfUkdCQV9CTFVFXQkgLT0gKGFscGhhICogKG5bRklfUkdCQV9CTFVFXSAgLSBiKSkgLyBpbml0YWxwaGE7CisJbltGSV9SR0JBX0dSRUVOXSAtPSAoYWxwaGEgKiAobltGSV9SR0JBX0dSRUVOXSAtIGcpKSAvIGluaXRhbHBoYTsKKwluW0ZJX1JHQkFfUkVEXSAgIC09IChhbHBoYSAqIChuW0ZJX1JHQkFfUkVEXSAgIC0gcikpIC8gaW5pdGFscGhhOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIE1vdmUgYWRqYWNlbnQgbmV1cm9ucyBieSBwcmVjb21wdXRlZCBhbHBoYSooMS0oKGktaileMi9bcl1eMikpIGluIHJhZHBvd2VyW3xpLWp8XQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgTk5RdWFudGl6ZXI6OmFsdGVybmVpZ2goaW50IHJhZCwgaW50IGksIGludCBiLCBpbnQgZywgaW50IHIpIHsKKwlpbnQgaiwgaywgbG8sIGhpLCBhOworCWludCAqcCwgKnE7CisKKwlsbyA9IGkgLSByYWQ7ICAgaWYgKGxvIDwgLTEpIGxvID0gLTE7CisJaGkgPSBpICsgcmFkOyAgIGlmIChoaSA+IG5ldHNpemUpIGhpID0gbmV0c2l6ZTsKKworCWogPSBpKzE7CisJayA9IGktMTsKKwlxID0gcmFkcG93ZXI7CisJd2hpbGUgKChqIDwgaGkpIHx8IChrID4gbG8pKSB7CisJCWEgPSAoKigrK3EpKTsKKwkJaWYgKGogPCBoaSkgeworCQkJcCA9IG5ldHdvcmtbal07CisJCQlwW0ZJX1JHQkFfQkxVRV0gIC09IChhICogKHBbRklfUkdCQV9CTFVFXSAtIGIpKSAvIGFscGhhcmFkYmlhczsKKwkJCXBbRklfUkdCQV9HUkVFTl0gLT0gKGEgKiAocFtGSV9SR0JBX0dSRUVOXSAtIGcpKSAvIGFscGhhcmFkYmlhczsKKwkJCXBbRklfUkdCQV9SRURdICAgLT0gKGEgKiAocFtGSV9SR0JBX1JFRF0gLSByKSkgLyBhbHBoYXJhZGJpYXM7CisJCQlqKys7CisJCX0KKwkJaWYgKGsgPiBsbykgeworCQkJcCA9IG5ldHdvcmtba107CisJCQlwW0ZJX1JHQkFfQkxVRV0gIC09IChhICogKHBbRklfUkdCQV9CTFVFXSAtIGIpKSAvIGFscGhhcmFkYmlhczsKKwkJCXBbRklfUkdCQV9HUkVFTl0gLT0gKGEgKiAocFtGSV9SR0JBX0dSRUVOXSAtIGcpKSAvIGFscGhhcmFkYmlhczsKKwkJCXBbRklfUkdCQV9SRURdICAgLT0gKGEgKiAocFtGSV9SR0JBX1JFRF0gLSByKSkgLyBhbHBoYXJhZGJpYXM7CisJCQlrLS07CisJCX0KKwl9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gTWFpbiBMZWFybmluZyBMb29wCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0KKworLyoqCisgR2V0IGEgcGl4ZWwgc2FtcGxlIGF0IHBvc2l0aW9uIHBvcy4gSGFuZGxlIDQtYnl0ZSBib3VuZGFyeSBhbGlnbm1lbnQuCisgQHBhcmFtIHBvcyBwaXhlbCBwb3NpdGlvbiBpbiBhIFd4SHgzIHBpeGVsIGJ1ZmZlcgorIEBwYXJhbSBiIGJsdWUgcGl4ZWwgY29tcG9uZW50CisgQHBhcmFtIGcgZ3JlZW4gcGl4ZWwgY29tcG9uZW50CisgQHBhcmFtIHIgcmVkIHBpeGVsIGNvbXBvbmVudAorKi8KK3ZvaWQgTk5RdWFudGl6ZXI6OmdldFNhbXBsZShsb25nIHBvcywgaW50ICpiLCBpbnQgKmcsIGludCAqcikgeworCS8vIGdldCBlcXVpdmFsZW50IHBpeGVsIGNvb3JkaW5hdGVzIAorCS8vIC0gYXNzdW1lIGl0J3MgYSAyNC1iaXQgaW1hZ2UgLQorCWludCB4ID0gcG9zICUgaW1nX2xpbmU7CisJaW50IHkgPSBwb3MgLyBpbWdfbGluZTsKKworCUJZVEUgKmJpdHMgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliX3B0ciwgeSkgKyB4OworCisJKmIgPSBiaXRzW0ZJX1JHQkFfQkxVRV0gPDwgbmV0Ymlhc3NoaWZ0OworCSpnID0gYml0c1tGSV9SR0JBX0dSRUVOXSA8PCBuZXRiaWFzc2hpZnQ7CisJKnIgPSBiaXRzW0ZJX1JHQkFfUkVEXSA8PCBuZXRiaWFzc2hpZnQ7Cit9CisKK3ZvaWQgTk5RdWFudGl6ZXI6OmxlYXJuKGludCBzYW1wbGluZ19mYWN0b3IpIHsKKwlpbnQgaSwgaiwgYiwgZywgcjsKKwlpbnQgcmFkaXVzLCByYWQsIGFscGhhLCBzdGVwLCBkZWx0YSwgc2FtcGxlcGl4ZWxzOworCWludCBhbHBoYWRlYzsgLy8gYmlhc2VkIGJ5IDEwIGJpdHMKKwlsb25nIHBvcywgbGVuZ3RoY291bnQ7CisKKwkvLyBpbWFnZSBzaXplIGFzIHZpZXdlZCBieSB0aGUgc2NhbiBhbGdvcml0aG0KKwlsZW5ndGhjb3VudCA9IGltZ193aWR0aCAqIGltZ19oZWlnaHQgKiAzOworCisJLy8gbnVtYmVyIG9mIHNhbXBsZXMgdXNlZCBmb3IgdGhlIGxlYXJuaW5nIHBoYXNlCisJc2FtcGxlcGl4ZWxzID0gbGVuZ3RoY291bnQgLyAoMyAqIHNhbXBsaW5nX2ZhY3Rvcik7CisKKwkvLyBkZWNyZWFzZSBsZWFybmluZyByYXRlIGFmdGVyIGRlbHRhIHBpeGVsIHByZXNlbnRhdGlvbnMKKwlkZWx0YSA9IHNhbXBsZXBpeGVscyAvIG5jeWNsZXM7CisJaWYoZGVsdGEgPT0gMCkgeworCQkvLyBhdm9pZCBhICdkaXZpZGUgYnkgemVybycgZXJyb3Igd2l0aCB2ZXJ5IHNtYWxsIGltYWdlcworCQlkZWx0YSA9IDE7CisJfQorCisJLy8gaW5pdGlhbGl6ZSBsZWFybmluZyBwYXJhbWV0ZXJzCisJYWxwaGFkZWMgPSAzMCArICgoc2FtcGxpbmdfZmFjdG9yIC0gMSkgLyAzKTsKKwlhbHBoYSA9IGluaXRhbHBoYTsKKwlyYWRpdXMgPSBpbml0cmFkaXVzOworCQorCXJhZCA9IHJhZGl1cyA+PiByYWRpdXNiaWFzc2hpZnQ7CisJaWYgKHJhZCA8PSAxKSByYWQgPSAwOworCWZvciAoaSA9IDA7IGkgPCByYWQ7IGkrKykgCisJCXJhZHBvd2VyW2ldID0gYWxwaGEqKCgocmFkKnJhZCAtIGkqaSkqcmFkYmlhcykvKHJhZCpyYWQpKTsKKwkKKwkvLyBpbml0aWFsaXplIHBzZXVkby1yYW5kb20gc2NhbgorCWlmICgobGVuZ3RoY291bnQgJSBwcmltZTEpICE9IDApCisJCXN0ZXAgPSAzKnByaW1lMTsKKwllbHNlIHsKKwkJaWYgKChsZW5ndGhjb3VudCAlIHByaW1lMikgIT0gMCkKKwkJCXN0ZXAgPSAzKnByaW1lMjsKKwkJZWxzZSB7CisJCQlpZiAoKGxlbmd0aGNvdW50ICUgcHJpbWUzKSAhPSAwKSAKKwkJCQlzdGVwID0gMypwcmltZTM7CisJCQllbHNlCisJCQkJc3RlcCA9IDMqcHJpbWU0OworCQl9CisJfQorCQorCWkgPSAwOwkJLy8gaXRlcmF0aW9uCisJcG9zID0gMDsJLy8gcGl4ZWwgcG9zaXRpb24KKworCXdoaWxlIChpIDwgc2FtcGxlcGl4ZWxzKSB7CisJCS8vIGdldCBuZXh0IGxlYXJuaW5nIHNhbXBsZQorCQlnZXRTYW1wbGUocG9zLCAmYiwgJmcsICZyKTsKKworCQkvLyBmaW5kIHdpbm5pbmcgbmV1cm9uCisJCWogPSBjb250ZXN0KGIsIGcsIHIpOworCisJCS8vIGFsdGVyIHdpbm5lcgorCQlhbHRlcnNpbmdsZShhbHBoYSwgaiwgYiwgZywgcik7CisKKwkJLy8gYWx0ZXIgbmVpZ2hib3VycyAKKwkJaWYgKHJhZCkgYWx0ZXJuZWlnaChyYWQsIGosIGIsIGcsIHIpOworCisJCS8vIG5leHQgc2FtcGxlCisJCXBvcyArPSBzdGVwOworCQl3aGlsZSAocG9zID49IGxlbmd0aGNvdW50KSBwb3MgLT0gbGVuZ3RoY291bnQ7CisJCisJCWkrKzsKKwkJaWYgKGkgJSBkZWx0YSA9PSAwKSB7CQorCQkJLy8gZGVjcmVhc2UgbGVhcm5pbmcgcmF0ZSBhbmQgYWxzbyB0aGUgbmVpZ2hib3Job29kCisJCQlhbHBoYSAtPSBhbHBoYSAvIGFscGhhZGVjOworCQkJcmFkaXVzIC09IHJhZGl1cyAvIHJhZGl1c2RlYzsKKwkJCXJhZCA9IHJhZGl1cyA+PiByYWRpdXNiaWFzc2hpZnQ7CisJCQlpZiAocmFkIDw9IDEpIHJhZCA9IDA7CisJCQlmb3IgKGogPSAwOyBqIDwgcmFkOyBqKyspIAorCQkJCXJhZHBvd2VyW2pdID0gYWxwaGEgKiAoKChyYWQqcmFkIC0gaipqKSAqIHJhZGJpYXMpIC8gKHJhZCpyYWQpKTsKKwkJfQorCX0KKwkKK30KKworLy8vLy8vLy8vLy8vLy8KKy8vIFF1YW50aXplcgorLy8gLS0tLS0tLS0tLS0KKworRklCSVRNQVAqIE5OUXVhbnRpemVyOjpRdWFudGl6ZShGSUJJVE1BUCAqZGliLCBpbnQgUmVzZXJ2ZVNpemUsIFJHQlFVQUQgKlJlc2VydmVQYWxldHRlLCBpbnQgc2FtcGxpbmcpIHsKKworCWlmICgoIWRpYikgfHwgKEZyZWVJbWFnZV9HZXRCUFAoZGliKSAhPSAyNCkpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLy8gMSkgU2VsZWN0IGEgc2FtcGxpbmcgZmFjdG9yIGluIHJhbmdlIDEuLjMwIChpbnB1dCBwYXJhbWV0ZXIgJ3NhbXBsaW5nJykKKwkvLyAgICAxID0+IHNsb3dlciwgMzAgPT4gZmFzdGVyLiBEZWZhdWx0IHZhbHVlIGlzIDEKKworCisJLy8gMikgR2V0IERJQiBwYXJhbWV0ZXJzCisKKwlkaWJfcHRyID0gZGliOworCQorCWltZ193aWR0aCAgPSBGcmVlSW1hZ2VfR2V0V2lkdGgoZGliKTsJLy8gRElCIHdpZHRoCisJaW1nX2hlaWdodCA9IEZyZWVJbWFnZV9HZXRIZWlnaHQoZGliKTsJLy8gRElCIGhlaWdodAorCWltZ19saW5lICAgPSBGcmVlSW1hZ2VfR2V0TGluZShkaWIpOwkvLyBESUIgbGluZSBsZW5ndGggaW4gYnl0ZXMgKHNob3VsZCBiZSBlcXVhbCB0byAzIHggVykKKworCS8vIEZvciBzbWFsbCBpbWFnZXMsIGFkanVzdCB0aGUgc2FtcGxpbmcgZmFjdG9yIHRvIGF2b2lkIGEgJ2RpdmlkZSBieSB6ZXJvJyBlcnJvciBsYXRlciAKKwkvLyAoc2VlIGRlbHRhIGluIGxlYXJuKCkgcm91dGluZSkKKwlpbnQgYWRqdXN0ID0gKGltZ193aWR0aCAqIGltZ19oZWlnaHQpIC8gbmN5Y2xlczsKKwlpZihzYW1wbGluZyA+PSBhZGp1c3QpCisJCXNhbXBsaW5nID0gMTsKKworCisJLy8gMykgSW5pdGlhbGl6ZSB0aGUgbmV0d29yayBhbmQgYXBwbHkgdGhlIGxlYXJuaW5nIGFsZ29yaXRobQorCisJaWYoIG5ldHNpemUgPiBSZXNlcnZlU2l6ZSApIHsKKwkJbmV0c2l6ZSAtPSBSZXNlcnZlU2l6ZTsKKwkJaW5pdG5ldCgpOworCQlsZWFybihzYW1wbGluZyk7CisJCXVuYmlhc25ldCgpOworCQluZXRzaXplICs9IFJlc2VydmVTaXplOworCX0KKworCS8vIDMuNSkgT3ZlcndyaXRlIHRoZSBsYXN0IGZldyBwYWxldHRlIGVudHJpZXMgd2l0aCB0aGUgcmVzZXJ2ZWQgb25lcworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUmVzZXJ2ZVNpemU7IGkrKykgeworCQluZXR3b3JrW25ldHNpemUgLSBSZXNlcnZlU2l6ZSArIGldW0ZJX1JHQkFfQkxVRV0gPSBSZXNlcnZlUGFsZXR0ZVtpXS5yZ2JCbHVlOworCQluZXR3b3JrW25ldHNpemUgLSBSZXNlcnZlU2l6ZSArIGldW0ZJX1JHQkFfR1JFRU5dID0gUmVzZXJ2ZVBhbGV0dGVbaV0ucmdiR3JlZW47CisJCW5ldHdvcmtbbmV0c2l6ZSAtIFJlc2VydmVTaXplICsgaV1bRklfUkdCQV9SRURdID0gUmVzZXJ2ZVBhbGV0dGVbaV0ucmdiUmVkOworCQluZXR3b3JrW25ldHNpemUgLSBSZXNlcnZlU2l6ZSArIGldWzNdID0gbmV0c2l6ZSAtIFJlc2VydmVTaXplICsgaTsKKwl9CisKKwkvLyA0KSBBbGxvY2F0ZSBhIG5ldyA4LWJpdCBESUIKKworCUZJQklUTUFQICpuZXdfZGliID0gRnJlZUltYWdlX0FsbG9jYXRlKGltZ193aWR0aCwgaW1nX2hlaWdodCwgOCk7CisKKwlpZiAobmV3X2RpYiA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCS8vIDUpIFdyaXRlIHRoZSBxdWFudGl6ZWQgcGFsZXR0ZQorCisJUkdCUVVBRCAqbmV3X3BhbCA9IEZyZWVJbWFnZV9HZXRQYWxldHRlKG5ld19kaWIpOworCisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuZXRzaXplOyBqKyspIHsKKwkJbmV3X3BhbFtqXS5yZ2JCbHVlICA9IChCWVRFKW5ldHdvcmtbal1bRklfUkdCQV9CTFVFXTsKKwkJbmV3X3BhbFtqXS5yZ2JHcmVlbiA9IChCWVRFKW5ldHdvcmtbal1bRklfUkdCQV9HUkVFTl07CisJCW5ld19wYWxbal0ucmdiUmVkCT0gKEJZVEUpbmV0d29ya1tqXVtGSV9SR0JBX1JFRF07CisJfQorCisJaW54YnVpbGQoKTsKKworCS8vIDYpIFdyaXRlIG91dHB1dCBpbWFnZSB1c2luZyBpbnhzZWFyY2goYixnLHIpCisKKwlmb3IgKFdPUkQgcm93cyA9IDA7IHJvd3MgPCBpbWdfaGVpZ2h0OyByb3dzKyspIHsKKwkJQllURSAqbmV3X2JpdHMgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUobmV3X2RpYiwgcm93cyk7CQkJCisJCUJZVEUgKmJpdHMgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliX3B0ciwgcm93cyk7CisKKwkJZm9yIChXT1JEIGNvbHMgPSAwOyBjb2xzIDwgaW1nX3dpZHRoOyBjb2xzKyspIHsKKwkJCW5ld19iaXRzW2NvbHNdID0gKEJZVEUpaW54c2VhcmNoKGJpdHNbRklfUkdCQV9CTFVFXSwgYml0c1tGSV9SR0JBX0dSRUVOXSwgYml0c1tGSV9SR0JBX1JFRF0pOworCisJCQliaXRzICs9IDM7CisJCX0KKwl9CisKKwlyZXR1cm4gKEZJQklUTUFQKikgbmV3X2RpYjsKK30KZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvUFNEUGFyc2VyLmNwcCBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvUFNEUGFyc2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmE1NGMyCi0tLSAvZGV2L251bGwKKysrIGIvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9QU0RQYXJzZXIuY3BwCkBAIC0wLDAgKzEsMTA1NyBAQAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gUGhvdG9zaG9wIExvYWRlcgorLy8KKy8vIERlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gYnkKKy8vIC0gSGVydsOpIERyb2xvbiAoZHJvbG9uQGluZm9uaWUuZnIpCisvLyAtIE1paGFpbCBOYXlkZW5vdiAobW5heWRlbm92QHVzZXJzLnNvdXJjZWZvcmdlLm5ldCkKKy8vCisvLyBCYXNlZCBvbiBMR1BMIGNvZGUgY3JlYXRlZCBhbmQgcHVibGlzaGVkIGJ5IGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvZWx5bngvCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRnJlZUltYWdlIDMKKy8vCisvLyBDT1ZFUkVEIENPREUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkKKy8vIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTCisvLyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy8vIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVECisvLyBDT0RFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UCisvLyBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWQorLy8gU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTAorLy8gUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUgorLy8gVEhJUyBESVNDTEFJTUVSLgorLy8KKy8vIFVzZSBhdCB5b3VyIG93biByaXNrIQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaW5jbHVkZSAiRnJlZUltYWdlLmgiCisjaW5jbHVkZSAiVXRpbGl0aWVzLmgiCisjaW5jbHVkZSAiUFNEUGFyc2VyLmgiCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFBTRCBzaWduYXR1cmUgKD0gJzhCUFMnKQorI2RlZmluZSBQU0RfU0lHTkFUVVJFCTB4Mzg0MjUwNTMKKy8vIEltYWdlIHJlc291cmNlIGJsb2NrIHNpZ25hdHVyZSAoPSAnOEJJTScpCisjZGVmaW5lIFBTRF9SRVNPVVJDRQkweDM4NDI0OTREIAorCisvLyBQU0QgY29sb3IgbW9kZXMKKyNkZWZpbmUgUFNEUF9CSVRNQVAJCQkwCisjZGVmaW5lIFBTRFBfR1JBWVNDQUxFCQkxCisjZGVmaW5lIFBTRFBfSU5ERVhFRAkJMgorI2RlZmluZSBQU0RQX1JHQgkJCTMKKyNkZWZpbmUgUFNEUF9DTVlLCQkJNAorI2RlZmluZSBQU0RQX01VTFRJQ0hBTk5FTAk3CisjZGVmaW5lIFBTRFBfRFVPVE9ORQkJOAorI2RlZmluZSBQU0RQX0xBQgkJCTkKKworLy8gUFNEIGNvbXByZXNzaW9uIHNjaGVtZXMKKyNkZWZpbmUgUFNEUF9DT01QUkVTU0lPTl9OT05FCTAJLy8gUmF3IGRhdGEKKyNkZWZpbmUgUFNEUF9DT01QUkVTU0lPTl9STEUJMQkvLyBSTEUgY29tcHJlc3Npb24gKHNhbWUgYXMgVElGRiBwYWNrZWQgYml0cykKKworI2RlZmluZSBTQUZFX0RFTEVURV9BUlJBWShfcF8pIHsgaWYgKE5VTEwgIT0gKF9wXykpIHsgZGVsZXRlIFtdIChfcF8pOyAoX3BfKSA9IE5VTEw7IH0gfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW5saW5lIGludCAKK3BzZEdldFZhbHVlKGNvbnN0IEJZVEUgKiBpcHJCdWZmZXIsIGNvbnN0IGludCBpQnl0ZXMpIHsKKwlpbnQgdiA9IGlwckJ1ZmZlclswXTsKKwlmb3IgKGludCBpPTE7IGk8aUJ5dGVzOyArK2kpIHsKKwkJdiA9ICh2IDw8IDgpIHwgaXByQnVmZmVyW2ldOworCX0KKwlyZXR1cm4gdjsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworcHNkSGVhZGVySW5mbzo6cHNkSGVhZGVySW5mbygpIDogX0NoYW5uZWxzKC0xKSwgX0hlaWdodCgtMSksIF9XaWR0aCgtMSksIF9CaXRzUGVyQ2hhbm5lbCgtMSksIF9Db2xvdXJNb2RlKC0xKSB7Cit9CisKK3BzZEhlYWRlckluZm86On5wc2RIZWFkZXJJbmZvKCkgeworfQorCQorYm9vbCBwc2RIZWFkZXJJbmZvOjpSZWFkKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSkgeworCXBzZEhlYWRlciBoZWFkZXI7CisKKwljb25zdCBpbnQgbiA9IChpbnQpaW8tPnJlYWRfcHJvYygmaGVhZGVyLCBzaXplb2YoaGVhZGVyKSwgMSwgaGFuZGxlKTsKKwlpZighbikgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLy8gY2hlY2sgdGhlIHNpZ25hdHVyZQorCWludCBuU2lnbmF0dXJlID0gcHNkR2V0VmFsdWUoaGVhZGVyLlNpZ25hdHVyZSwgc2l6ZW9mKGhlYWRlci5TaWduYXR1cmUpKTsKKwlpZiAoUFNEX1NJR05BVFVSRSA9PSBuU2lnbmF0dXJlKSB7CisJCS8vIGNoZWNrIHRoZSB2ZXJzaW9uCisJCWludCBuVmVyc2lvbiA9IHBzZEdldFZhbHVlKCBoZWFkZXIuVmVyc2lvbiwgc2l6ZW9mKGhlYWRlci5WZXJzaW9uKSApOworCQlpZiAoMSA9PSBuVmVyc2lvbikgeworCQkJLy8gaGVhZGVyLlJlc2VydmVkIG11c3QgYmUgemVybworCQkJQllURSBwc2RfcmVzZXJ2ZWRbXSA9IHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9OworCQkJaWYobWVtY21wKGhlYWRlci5SZXNlcnZlZCwgcHNkX3Jlc2VydmVkLCA2KSAhPSAwKSB7CisJCQkJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKEZJRl9QU0QsICJXYXJuaW5nOiBmaWxlIGhlYWRlciByZXNlcnZlZCBtZW1iZXIgaXMgbm90IGVxdWFsIHRvIHplcm8iKTsKKwkJCX0KKwkJCS8vIHJlYWQgdGhlIGhlYWRlcgorCQkJX0NoYW5uZWxzID0gKHNob3J0KXBzZEdldFZhbHVlKCBoZWFkZXIuQ2hhbm5lbHMsIHNpemVvZihoZWFkZXIuQ2hhbm5lbHMpICk7CisJCQlfSGVpZ2h0ID0gcHNkR2V0VmFsdWUoIGhlYWRlci5Sb3dzLCBzaXplb2YoaGVhZGVyLlJvd3MpICk7CisJCQlfV2lkdGggPSBwc2RHZXRWYWx1ZSggaGVhZGVyLkNvbHVtbnMsIHNpemVvZihoZWFkZXIuQ29sdW1ucykgKTsKKwkJCV9CaXRzUGVyQ2hhbm5lbCA9IChzaG9ydClwc2RHZXRWYWx1ZSggaGVhZGVyLkRlcHRoLCBzaXplb2YoaGVhZGVyLkRlcHRoKSApOworCQkJX0NvbG91ck1vZGUgPSAoc2hvcnQpcHNkR2V0VmFsdWUoIGhlYWRlci5Nb2RlLCBzaXplb2YoaGVhZGVyLk1vZGUpICk7CisKKwkJCXJldHVybiB0cnVlOworCQl9CisJfQorCisJcmV0dXJuIGZhbHNlOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitwc2RDb2xvdXJNb2RlRGF0YTo6cHNkQ29sb3VyTW9kZURhdGEoKSA6IF9MZW5ndGgoLTEpLCBfcGxDb2xvdXJEYXRhKE5VTEwpIHsKK30KKworcHNkQ29sb3VyTW9kZURhdGE6On5wc2RDb2xvdXJNb2RlRGF0YSgpIHsgCisJU0FGRV9ERUxFVEVfQVJSQVkoX3BsQ29sb3VyRGF0YSk7IAorfQorCQorYm9vbCBwc2RDb2xvdXJNb2RlRGF0YTo6UmVhZChGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUpIHsKKwlpZiAoMCA8IF9MZW5ndGgpIHsgCisJCVNBRkVfREVMRVRFX0FSUkFZKF9wbENvbG91ckRhdGEpOworCX0KKwkKKwlCWVRFIExlbmd0aFs0XTsKKwlpby0+cmVhZF9wcm9jKCZMZW5ndGgsIHNpemVvZihMZW5ndGgpLCAxLCBoYW5kbGUpOworCQorCV9MZW5ndGggPSBwc2RHZXRWYWx1ZSggTGVuZ3RoLCBzaXplb2YoX0xlbmd0aCkgKTsKKwlpZiAoMCA8IF9MZW5ndGgpIHsKKwkJX3BsQ29sb3VyRGF0YSA9IG5ldyBCWVRFW19MZW5ndGhdOworCQlpby0+cmVhZF9wcm9jKF9wbENvbG91ckRhdGEsIF9MZW5ndGgsIDEsIGhhbmRsZSk7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisJCitib29sIHBzZENvbG91ck1vZGVEYXRhOjpGaWxsUGFsZXR0ZShGSUJJVE1BUCAqZGliKSB7CisJUkdCUVVBRCAqcGFsID0gRnJlZUltYWdlX0dldFBhbGV0dGUoZGliKTsKKwlpZihwYWwpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQkJcGFsW2ldLnJnYlJlZAk9IF9wbENvbG91ckRhdGFbaSArIDAqMjU2XTsKKwkJCXBhbFtpXS5yZ2JHcmVlbiA9IF9wbENvbG91ckRhdGFbaSArIDEqMjU2XTsKKwkJCXBhbFtpXS5yZ2JCbHVlCT0gX3BsQ29sb3VyRGF0YVtpICsgMioyNTZdOworCQl9CisJCXJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3BzZEltYWdlUmVzb3VyY2U6OnBzZEltYWdlUmVzb3VyY2UoKSA6IF9wbE5hbWUgKDApIHsgCisJUmVzZXQoKTsgCit9CisKK3BzZEltYWdlUmVzb3VyY2U6On5wc2RJbWFnZVJlc291cmNlKCkgeyAKKwlTQUZFX0RFTEVURV9BUlJBWShfcGxOYW1lKTsKK30KKwordm9pZCBwc2RJbWFnZVJlc291cmNlOjpSZXNldCgpIHsKKwlfTGVuZ3RoID0gLTE7CisJbWVtc2V0KCBfT1NUeXBlLCAnXDAnLCBzaXplb2YoX09TVHlwZSkgKTsKKwlfSUQgPSAtMTsKKwlTQUZFX0RFTEVURV9BUlJBWShfcGxOYW1lKTsKKwlfU2l6ZSA9IC0xOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitwc2RSZXNvbHV0aW9uSW5mbzo6cHNkUmVzb2x1dGlvbkluZm8oKSA6IF93aWR0aFVuaXQoLTEpLCBfaGVpZ2h0VW5pdCgtMSksIF9oUmVzKC0xKSwgX3ZSZXMoLTEpLCBfaFJlc1VuaXQoLTEpLCBfdlJlc1VuaXQoLTEpIHsKK30KKworcHNkUmVzb2x1dGlvbkluZm86On5wc2RSZXNvbHV0aW9uSW5mbygpIHsKK30KKwkKK2ludCBwc2RSZXNvbHV0aW9uSW5mbzo6UmVhZChGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUpIHsKKwlCWVRFIEludFZhbHVlWzRdLCBTaG9ydFZhbHVlWzJdOworCWludCBuQnl0ZXM9MCwgbjsKKwkKKwkvLyBIb3Jpem9udGFsIHJlc29sdXRpb24gaW4gcGl4ZWxzIHBlciBpbmNoLgorCW4gPSAoaW50KWlvLT5yZWFkX3Byb2MoJlNob3J0VmFsdWUsIHNpemVvZihTaG9ydFZhbHVlKSwgMSwgaGFuZGxlKTsKKwluQnl0ZXMgKz0gbiAqIHNpemVvZihTaG9ydFZhbHVlKTsKKwlfaFJlcyA9IChzaG9ydClwc2RHZXRWYWx1ZShTaG9ydFZhbHVlLCBzaXplb2YoX2hSZXMpICk7CisJLy8gMT1kaXNwbGF5IGhvcml6b250YWwgcmVzb2x1dGlvbiBpbiBwaXhlbHMgcGVyIGluY2g7IDI9ZGlzcGxheSBob3Jpem9udGFsIHJlc29sdXRpb24gaW4gcGl4ZWxzIHBlciBjbS4KKwluID0gKGludClpby0+cmVhZF9wcm9jKCZJbnRWYWx1ZSwgc2l6ZW9mKEludFZhbHVlKSwgMSwgaGFuZGxlKTsKKwluQnl0ZXMgKz0gbiAqIHNpemVvZihJbnRWYWx1ZSk7CisJX2hSZXNVbml0ID0gcHNkR2V0VmFsdWUoSW50VmFsdWUsIHNpemVvZihfaFJlc1VuaXQpICk7CisJLy8gRGlzcGxheSB3aWR0aCBhcyAxPWluY2hlczsgMj1jbTsgMz1wb2ludHM7IDQ9cGljYXM7IDU9Y29sdW1ucy4KKwluID0gKGludClpby0+cmVhZF9wcm9jKCZTaG9ydFZhbHVlLCBzaXplb2YoU2hvcnRWYWx1ZSksIDEsIGhhbmRsZSk7CisJbkJ5dGVzICs9IG4gKiBzaXplb2YoU2hvcnRWYWx1ZSk7CisJX3dpZHRoVW5pdCA9IChzaG9ydClwc2RHZXRWYWx1ZShTaG9ydFZhbHVlLCBzaXplb2YoX3dpZHRoVW5pdCkgKTsKKwkvLyBWZXJ0aWNhbCByZXNvbHV0aW9uIGluIHBpeGVscyBwZXIgaW5jaC4KKwluID0gKGludClpby0+cmVhZF9wcm9jKCZTaG9ydFZhbHVlLCBzaXplb2YoU2hvcnRWYWx1ZSksIDEsIGhhbmRsZSk7CisJbkJ5dGVzICs9IG4gKiBzaXplb2YoU2hvcnRWYWx1ZSk7CisJX3ZSZXMgPSAoc2hvcnQpcHNkR2V0VmFsdWUoU2hvcnRWYWx1ZSwgc2l6ZW9mKF92UmVzKSApOworCS8vIDE9ZGlzcGxheSB2ZXJ0aWNhbCByZXNvbHV0aW9uIGluIHBpeGVscyBwZXIgaW5jaDsgMj1kaXNwbGF5IHZlcnRpY2FsIHJlc29sdXRpb24gaW4gcGl4ZWxzIHBlciBjbS4KKwluID0gKGludClpby0+cmVhZF9wcm9jKCZJbnRWYWx1ZSwgc2l6ZW9mKEludFZhbHVlKSwgMSwgaGFuZGxlKTsKKwluQnl0ZXMgKz0gbiAqIHNpemVvZihJbnRWYWx1ZSk7CisJX3ZSZXNVbml0ID0gcHNkR2V0VmFsdWUoSW50VmFsdWUsIHNpemVvZihfdlJlc1VuaXQpICk7CisJLy8gRGlzcGxheSBoZWlnaHQgYXMgMT1pbmNoZXM7IDI9Y207IDM9cG9pbnRzOyA0PXBpY2FzOyA1PWNvbHVtbnMuCisJbiA9IChpbnQpaW8tPnJlYWRfcHJvYygmU2hvcnRWYWx1ZSwgc2l6ZW9mKFNob3J0VmFsdWUpLCAxLCBoYW5kbGUpOworCW5CeXRlcyArPSBuICogc2l6ZW9mKFNob3J0VmFsdWUpOworCV9oZWlnaHRVbml0ID0gKHNob3J0KXBzZEdldFZhbHVlKFNob3J0VmFsdWUsIHNpemVvZihfaGVpZ2h0VW5pdCkgKTsKKwkKKwlyZXR1cm4gbkJ5dGVzOworfQorCit2b2lkIHBzZFJlc29sdXRpb25JbmZvOjpHZXRSZXNvbHV0aW9uSW5mbyh1bnNpZ25lZCAmcmVzX3gsIHVuc2lnbmVkICZyZXNfeSkgeworCWlmKF9oUmVzVW5pdCA9PSAxKSB7CisJCS8vIGNvbnZlcnQgcGl4ZWxzIC8gaW5jaCB0byBwaXhlbCAvIG0KKwkJcmVzX3ggPSAodW5zaWduZWQpIChfaFJlcyAvIDAuMDI1NDAwMCArIDAuNSk7CisJfSBlbHNlIGlmKF9oUmVzVW5pdCA9PSAyKSB7CisJCS8vIGNvbnZlcnQgcGl4ZWxzIC8gY20gdG8gcGl4ZWwgLyBtCisJCXJlc194ID0gKHVuc2lnbmVkKSAoX2hSZXMgKiAxMDAuMCArIDAuNSk7CisJfQorCWlmKF92UmVzVW5pdCA9PSAxKSB7CisJCS8vIGNvbnZlcnQgcGl4ZWxzIC8gaW5jaCB0byBwaXhlbCAvIG0KKwkJcmVzX3kgPSAodW5zaWduZWQpIChfdlJlcyAvIDAuMDI1NDAwMCArIDAuNSk7CisJfSBlbHNlIGlmKF92UmVzVW5pdCA9PSAyKSB7CisJCS8vIGNvbnZlcnQgcGl4ZWxzIC8gY20gdG8gcGl4ZWwgLyBtCisJCXJlc195ID0gKHVuc2lnbmVkKSAoX3ZSZXMgKiAxMDAuMCArIDAuNSk7CisJfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitwc2RSZXNvbHV0aW9uSW5mb192Mjo6cHNkUmVzb2x1dGlvbkluZm9fdjIoKSB7IAorCV9DaGFubmVscyA9IF9Sb3dzID0gX0NvbHVtbnMgPSBfRGVwdGggPSBfTW9kZSA9IC0xOyAKK30KKworcHNkUmVzb2x1dGlvbkluZm9fdjI6On5wc2RSZXNvbHV0aW9uSW5mb192MigpIHsKK30KKworaW50IHBzZFJlc29sdXRpb25JbmZvX3YyOjpSZWFkKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSkgeworCUJZVEUgU2hvcnRWYWx1ZVsyXTsKKwlpbnQgbkJ5dGVzPTAsIG47CisJCisJbiA9IChpbnQpaW8tPnJlYWRfcHJvYygmU2hvcnRWYWx1ZSwgc2l6ZW9mKFNob3J0VmFsdWUpLCAxLCBoYW5kbGUpOworCW5CeXRlcyArPSBuICogc2l6ZW9mKFNob3J0VmFsdWUpOworCV9DaGFubmVscyA9IChzaG9ydClwc2RHZXRWYWx1ZShTaG9ydFZhbHVlLCBzaXplb2YoX0NoYW5uZWxzKSApOworCisJbiA9IChpbnQpaW8tPnJlYWRfcHJvYygmU2hvcnRWYWx1ZSwgc2l6ZW9mKFNob3J0VmFsdWUpLCAxLCBoYW5kbGUpOworCW5CeXRlcyArPSBuICogc2l6ZW9mKFNob3J0VmFsdWUpOworCV9Sb3dzID0gKHNob3J0KXBzZEdldFZhbHVlKFNob3J0VmFsdWUsIHNpemVvZihfUm93cykgKTsKKwkKKwluID0gKGludClpby0+cmVhZF9wcm9jKCZTaG9ydFZhbHVlLCBzaXplb2YoU2hvcnRWYWx1ZSksIDEsIGhhbmRsZSk7CisJbkJ5dGVzICs9IG4gKiBzaXplb2YoU2hvcnRWYWx1ZSk7CisJX0NvbHVtbnMgPSAoc2hvcnQpcHNkR2V0VmFsdWUoU2hvcnRWYWx1ZSwgc2l6ZW9mKF9Db2x1bW5zKSApOworCisJbiA9IChpbnQpaW8tPnJlYWRfcHJvYygmU2hvcnRWYWx1ZSwgc2l6ZW9mKFNob3J0VmFsdWUpLCAxLCBoYW5kbGUpOworCW5CeXRlcyArPSBuICogc2l6ZW9mKFNob3J0VmFsdWUpOworCV9EZXB0aCA9IChzaG9ydClwc2RHZXRWYWx1ZShTaG9ydFZhbHVlLCBzaXplb2YoX0RlcHRoKSApOworCisJbiA9IChpbnQpaW8tPnJlYWRfcHJvYygmU2hvcnRWYWx1ZSwgc2l6ZW9mKFNob3J0VmFsdWUpLCAxLCBoYW5kbGUpOworCW5CeXRlcyArPSBuICogc2l6ZW9mKFNob3J0VmFsdWUpOworCV9Nb2RlID0gKHNob3J0KXBzZEdldFZhbHVlKFNob3J0VmFsdWUsIHNpemVvZihfTW9kZSkgKTsKKwkKKwlyZXR1cm4gbkJ5dGVzOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitwc2REaXNwbGF5SW5mbzo6cHNkRGlzcGxheUluZm8oKSB7CisJX09wYWNpdHkgPSBfQ29sb3VyU3BhY2UgPSAtMTsKKwlmb3IgKHVuc2lnbmVkIG4gPSAwOyBuIDwgNDsgKytuKSB7CisJCV9Db2xvdXJbbl0gPSAwOworCX0KKwlfS2luZCA9IDA7CisJX3BhZGRpbmcgPSAnMCc7Cit9CisKK3BzZERpc3BsYXlJbmZvOjp+cHNkRGlzcGxheUluZm8oKSB7Cit9CisJCitpbnQgcHNkRGlzcGxheUluZm86OlJlYWQoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlKSB7CisJQllURSBTaG9ydFZhbHVlWzJdOworCWludCBuQnl0ZXM9MCwgbjsKKwkKKwluID0gKGludClpby0+cmVhZF9wcm9jKCZTaG9ydFZhbHVlLCBzaXplb2YoU2hvcnRWYWx1ZSksIDEsIGhhbmRsZSk7CisJbkJ5dGVzICs9IG4gKiBzaXplb2YoU2hvcnRWYWx1ZSk7CisJX0NvbG91clNwYWNlID0gKHNob3J0KXBzZEdldFZhbHVlKFNob3J0VmFsdWUsIHNpemVvZihfQ29sb3VyU3BhY2UpICk7CisJCisJZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IDQ7ICsraSkgeworCQluID0gKGludClpby0+cmVhZF9wcm9jKCZTaG9ydFZhbHVlLCBzaXplb2YoU2hvcnRWYWx1ZSksIDEsIGhhbmRsZSk7CisJCW5CeXRlcyArPSBuICogc2l6ZW9mKFNob3J0VmFsdWUpOworCQlfQ29sb3VyW2ldID0gKHNob3J0KXBzZEdldFZhbHVlKFNob3J0VmFsdWUsIHNpemVvZihfQ29sb3VyW2ldKSApOworCX0KKwkKKwluID0gKGludClpby0+cmVhZF9wcm9jKCZTaG9ydFZhbHVlLCBzaXplb2YoU2hvcnRWYWx1ZSksIDEsIGhhbmRsZSk7CisJbkJ5dGVzICs9IG4gKiBzaXplb2YoU2hvcnRWYWx1ZSk7CisJX09wYWNpdHkgPSAoc2hvcnQpcHNkR2V0VmFsdWUoU2hvcnRWYWx1ZSwgc2l6ZW9mKF9PcGFjaXR5KSApOworCWlmKChfT3BhY2l0eSA8IDApIHx8IChfT3BhY2l0eSA+IDEwMCkpIHsKKwkJdGhyb3cgIkludmFsaWQgRGlzcGxheUluZm86Ok9wYWNpdHkgdmFsdWUiOworCX0KKwkKKwlCWVRFIGNbMV07CisJbiA9IChpbnQpaW8tPnJlYWRfcHJvYygmYywgc2l6ZW9mKGMpLCAxLCBoYW5kbGUpOworCW5CeXRlcyArPSBuICogc2l6ZW9mKGMpOworCV9LaW5kID0gKEJZVEUpcHNkR2V0VmFsdWUoYywgc2l6ZW9mKGMpKTsKKwkKKwluID0gKGludClpby0+cmVhZF9wcm9jKCZjLCBzaXplb2YoYyksIDEsIGhhbmRsZSk7CisJbkJ5dGVzICs9IG4gKiBzaXplb2YoYyk7CisJX3BhZGRpbmcgPSAoQllURSlwc2RHZXRWYWx1ZShjLCBzaXplb2YoYykpOworCWlmKF9wYWRkaW5nICE9IDApIHsKKwkJdGhyb3cgIkludmFsaWQgRGlzcGxheUluZm86OlBhZGRpbmcgdmFsdWUiOworCX0KKwkKKwlyZXR1cm4gbkJ5dGVzOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitwc2RUaHVtYm5haWw6OnBzZFRodW1ibmFpbCgpIDogCitfRm9ybWF0KC0xKSwgX1dpZHRoKC0xKSwgX0hlaWdodCgtMSksIF9XaWR0aEJ5dGVzKC0xKSwgX1NpemUoLTEpLCBfQ29tcHJlc3NlZFNpemUoLTEpLCBfQml0UGVyUGl4ZWwoLTEpLCBfUGxhbmVzKC0xKSwgX2RpYihOVUxMKSB7Cit9CisKK3BzZFRodW1ibmFpbDo6fnBzZFRodW1ibmFpbCgpIHsgCisJRnJlZUltYWdlX1VubG9hZChfZGliKTsKK30KKworaW50IHBzZFRodW1ibmFpbDo6UmVhZChGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIGludCBpUmVzb3VyY2VTaXplLCBib29sIGlzQkdSKSB7CisJQllURSBTaG9ydFZhbHVlWzJdLCBJbnRWYWx1ZVs0XTsKKwlpbnQgbkJ5dGVzPTAsIG47CisKKwkvLyByZW1vdmUgdGhlIGhlYWRlciBzaXplICgyOCBieXRlcykgZnJvbSB0aGUgdG90YWwgZGF0YSBzaXplCisJaW50IGlUb3RhbERhdGEgPSBpUmVzb3VyY2VTaXplIC0gMjg7CisKKwljb25zdCBsb25nIGJsb2NrX2VuZCA9IGlvLT50ZWxsX3Byb2MoaGFuZGxlKSArIGlUb3RhbERhdGE7CQorCQorCW4gPSAoaW50KWlvLT5yZWFkX3Byb2MoJkludFZhbHVlLCBzaXplb2YoSW50VmFsdWUpLCAxLCBoYW5kbGUpOworCW5CeXRlcyArPSBuICogc2l6ZW9mKEludFZhbHVlKTsKKwlfRm9ybWF0ID0gcHNkR2V0VmFsdWUoSW50VmFsdWUsIHNpemVvZihfRm9ybWF0KSApOworCQorCW4gPSAoaW50KWlvLT5yZWFkX3Byb2MoJkludFZhbHVlLCBzaXplb2YoSW50VmFsdWUpLCAxLCBoYW5kbGUpOworCW5CeXRlcyArPSBuICogc2l6ZW9mKEludFZhbHVlKTsKKwlfV2lkdGggPSBwc2RHZXRWYWx1ZShJbnRWYWx1ZSwgc2l6ZW9mKF9XaWR0aCkgKTsKKwkKKwluID0gKGludClpby0+cmVhZF9wcm9jKCZJbnRWYWx1ZSwgc2l6ZW9mKEludFZhbHVlKSwgMSwgaGFuZGxlKTsKKwluQnl0ZXMgKz0gbiAqIHNpemVvZihJbnRWYWx1ZSk7CisJX0hlaWdodCA9IHBzZEdldFZhbHVlKEludFZhbHVlLCBzaXplb2YoX0hlaWdodCkgKTsKKwkKKwluID0gKGludClpby0+cmVhZF9wcm9jKCZJbnRWYWx1ZSwgc2l6ZW9mKEludFZhbHVlKSwgMSwgaGFuZGxlKTsKKwluQnl0ZXMgKz0gbiAqIHNpemVvZihJbnRWYWx1ZSk7CisJX1dpZHRoQnl0ZXMgPSBwc2RHZXRWYWx1ZShJbnRWYWx1ZSwgc2l6ZW9mKF9XaWR0aEJ5dGVzKSApOworCisJbiA9IChpbnQpaW8tPnJlYWRfcHJvYygmSW50VmFsdWUsIHNpemVvZihJbnRWYWx1ZSksIDEsIGhhbmRsZSk7CisJbkJ5dGVzICs9IG4gKiBzaXplb2YoSW50VmFsdWUpOworCV9TaXplID0gcHNkR2V0VmFsdWUoSW50VmFsdWUsIHNpemVvZihfU2l6ZSkgKTsKKworCW4gPSAoaW50KWlvLT5yZWFkX3Byb2MoJkludFZhbHVlLCBzaXplb2YoSW50VmFsdWUpLCAxLCBoYW5kbGUpOworCW5CeXRlcyArPSBuICogc2l6ZW9mKEludFZhbHVlKTsKKwlfQ29tcHJlc3NlZFNpemUgPSBwc2RHZXRWYWx1ZShJbnRWYWx1ZSwgc2l6ZW9mKF9Db21wcmVzc2VkU2l6ZSkgKTsKKworCW4gPSAoaW50KWlvLT5yZWFkX3Byb2MoJlNob3J0VmFsdWUsIHNpemVvZihTaG9ydFZhbHVlKSwgMSwgaGFuZGxlKTsKKwluQnl0ZXMgKz0gbiAqIHNpemVvZihTaG9ydFZhbHVlKTsKKwlfQml0UGVyUGl4ZWwgPSAoc2hvcnQpcHNkR2V0VmFsdWUoU2hvcnRWYWx1ZSwgc2l6ZW9mKF9CaXRQZXJQaXhlbCkgKTsKKworCW4gPSAoaW50KWlvLT5yZWFkX3Byb2MoJlNob3J0VmFsdWUsIHNpemVvZihTaG9ydFZhbHVlKSwgMSwgaGFuZGxlKTsKKwluQnl0ZXMgKz0gbiAqIHNpemVvZihTaG9ydFZhbHVlKTsKKwlfUGxhbmVzID0gKHNob3J0KXBzZEdldFZhbHVlKFNob3J0VmFsdWUsIHNpemVvZihfUGxhbmVzKSApOworCisJY29uc3QgbG9uZyBKRklGX3N0YXJ0cG9zID0gaW8tPnRlbGxfcHJvYyhoYW5kbGUpOworCisJaWYoX2RpYikgeworCQlGcmVlSW1hZ2VfVW5sb2FkKF9kaWIpOworCX0KKworCWlmKF9Gb3JtYXQgPT0gMSkgeworCQkvLyBrSnBlZ1JHQiB0aHVtYm5haWwgaW1hZ2UKKwkJX2RpYiA9IEZyZWVJbWFnZV9Mb2FkRnJvbUhhbmRsZShGSUZfSlBFRywgaW8sIGhhbmRsZSk7CisJCWlmKGlzQkdSKSB7CisJCQlTd2FwUmVkQmx1ZTMyKF9kaWIpOworCQl9CQkJCisJCS8vIEhBQ0s6IG1hbnVhbGx5IGdvIHRvIGVuZCBvZiB0aHVtYm5haWwsIGJlY2F1c2UgKGZvciBzb21lIHJlYXNvbikgTG9hZEZyb21IYW5kbGUgY29uc3VtZXMgbW9yZSBieXRlcyB0aGVuIGF2YWlsYWJsZSEgCisJCWlvLT5zZWVrX3Byb2MoaGFuZGxlLCBibG9ja19lbmQsIFNFRUtfU0VUKTsKKwl9CisJZWxzZSB7CisJCS8vIGtSYXdSR0IgdGh1bWJuYWlsIGltYWdlCQkKKwkJLy8gIyMjIFVuaW1wbGVtZW50ZWQgKHNob3VsZCBiZSB0cml2aWFsKQorCisJCS8vIHNraXAgdGhlIHRodW1ibmFpbCBwYXJ0CisJCWlvLT5zZWVrX3Byb2MoaGFuZGxlLCBpVG90YWxEYXRhLCBTRUVLX0NVUik7CisJCXJldHVybiBpUmVzb3VyY2VTaXplOworCX0KKwkKKwluQnl0ZXMgKz0gKGJsb2NrX2VuZCAtIEpGSUZfc3RhcnRwb3MpOyAKKworCXJldHVybiBuQnl0ZXM7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3BzZElDQ1Byb2ZpbGU6OnBzZElDQ1Byb2ZpbGUoKSA6IF9Qcm9maWxlU2l6ZSgwKSwgX1Byb2ZpbGVEYXRhKE5VTEwpIHsKK30KKworcHNkSUNDUHJvZmlsZTo6fnBzZElDQ1Byb2ZpbGUoKSB7CisJY2xlYXIoKTsKK30KKwordm9pZCBwc2RJQ0NQcm9maWxlOjpjbGVhcigpIHsgU0FGRV9ERUxFVEVfQVJSQVkoX1Byb2ZpbGVEYXRhKTsgX1Byb2ZpbGVTaXplID0gMDt9CisKK2ludCBwc2RJQ0NQcm9maWxlOjpSZWFkKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSwgaW50IHNpemUpIHsKKwlpbnQgbkJ5dGVzID0gMCwgbjsKKwkKKwljbGVhcigpOworCQorCV9Qcm9maWxlRGF0YSA9IG5ldyAoc3RkOjpub3Rocm93KSBCWVRFW3NpemVdOworCWlmKE5VTEwgIT0gX1Byb2ZpbGVEYXRhKSB7CisJCW4gPSAoaW50KWlvLT5yZWFkX3Byb2MoX1Byb2ZpbGVEYXRhLCAxLCBzaXplLCBoYW5kbGUpOworCQlfUHJvZmlsZVNpemUgPSBzaXplOworCQluQnl0ZXMgKz0gbiAqIHNpemVvZihCWVRFKTsKKwl9CisKKwlyZXR1cm4gbkJ5dGVzOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKioKK0ludmVydCBvbmx5IGNvbG9yIGNvbXBvbmVudHMsIHNraXBwaW5nIEFscGhhL0JsYWNrCisoQ2FuIGJlIHVzZWZ1bCBhcyBwdWJsaWMvdXRpbGl0eSBmdW5jdGlvbikKKyovCitzdGF0aWMKK0JPT0wgaW52ZXJ0Q29sb3IoRklCSVRNQVAqIGRpYikgeworCUZSRUVfSU1BR0VfVFlQRSB0eXBlID0gRnJlZUltYWdlX0dldEltYWdlVHlwZShkaWIpOworCWNvbnN0IHVuc2lnbmVkIEJwcCA9IEZyZWVJbWFnZV9HZXRCUFAoZGliKS84OworCQorCWlmKCh0eXBlID09IEZJVF9CSVRNQVAgJiYgQnBwID09IDQpIHx8IHR5cGUgPT0gRklUX1JHQkExNikgeworCQljb25zdCB1bnNpZ25lZCB3aWR0aCA9IEZyZWVJbWFnZV9HZXRXaWR0aChkaWIpOworCQljb25zdCB1bnNpZ25lZCBoZWlnaHQgPSBGcmVlSW1hZ2VfR2V0SGVpZ2h0KGRpYik7CisJCUJZVEUgKmxpbmVfc3RhcnQgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCAwKTsKKwkJY29uc3QgdW5zaWduZWQgcGl0Y2ggPSBGcmVlSW1hZ2VfR2V0UGl0Y2goZGliKTsKKwkJY29uc3QgdW5zaWduZWQgdHJpQnBwID0gQnBwIC0gKEJwcCA9PSA0ID8gMSA6IDIpOworCQkJCQorCQlmb3IodW5zaWduZWQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworCQkJQllURSAqbGluZSA9IGxpbmVfc3RhcnQ7CisKKwkJCWZvcih1bnNpZ25lZCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQlmb3IodW5zaWduZWQgYj0wOyBiIDwgdHJpQnBwOyArK2IpIHsKKwkJCQkJbGluZVtiXSA9IH5saW5lW2JdOworCQkJCX0KKwkJCQkJCisJCQkJbGluZSArPSBCcHA7CisJCQl9CisJCQlsaW5lX3N0YXJ0ICs9IHBpdGNoOworCQl9CisJCQorCQlyZXR1cm4gVFJVRTsKKwl9CisJZWxzZSB7CisJCXJldHVybiBGcmVlSW1hZ2VfSW52ZXJ0KGRpYik7CisJfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitwc2RQYXJzZXI6OnBzZFBhcnNlcigpIHsKKwlfYlRodW1ibmFpbEZpbGxlZCA9IGZhbHNlOworCV9iRGlzcGxheUluZm9GaWxsZWQgPSBmYWxzZTsKKwlfYlJlc29sdXRpb25JbmZvRmlsbGVkID0gZmFsc2U7CisJX2JSZXNvbHV0aW9uSW5mb0ZpbGxlZF92MiA9IGZhbHNlOworCV9iQ29weXJpZ2h0ID0gZmFsc2U7CisJX0dsb2JhbEFuZ2xlID0gMzA7CisJX0NvbG91ckNvdW50ID0gLTE7CisJX1RyYW5zcGFyZW50SW5kZXggPSAtMTsKKwlfZmlfZmxhZ3MgPSAwOworCV9maV9mb3JtYXRfaWQgPSBGSUZfVU5LTk9XTjsKK30KKworcHNkUGFyc2VyOjp+cHNkUGFyc2VyKCkgeworfQorCitib29sIHBzZFBhcnNlcjo6UmVhZExheWVyQW5kTWFza0luZm9TZWN0aW9uKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSkJeworCWJvb2wgYlN1Y2Nlc3MgPSBmYWxzZTsKKwkKKwlCWVRFIERhdGFMZW5ndGhbNF07CisJaW50IG5CeXRlcyA9IDA7CisJaW50IG4gPSAoaW50KWlvLT5yZWFkX3Byb2MoJkRhdGFMZW5ndGgsIHNpemVvZihEYXRhTGVuZ3RoKSwgMSwgaGFuZGxlKTsKKwlpbnQgblRvdGFsQnl0ZXMgPSBwc2RHZXRWYWx1ZSggRGF0YUxlbmd0aCwgc2l6ZW9mKERhdGFMZW5ndGgpICk7CisJCisJQllURSBkYXRhWzFdOworCXdoaWxlKCBuICYmICggbkJ5dGVzIDwgblRvdGFsQnl0ZXMgKSApIHsKKwkJZGF0YVswXSA9ICdcMCc7CisJCW4gPSAoaW50KWlvLT5yZWFkX3Byb2MoJmRhdGEsIHNpemVvZihkYXRhKSwgMSwgaGFuZGxlKTsKKwkJbkJ5dGVzICs9IG4gKiBzaXplb2YoZGF0YSk7CisJfQorCQorCWlmICggbkJ5dGVzID09IG5Ub3RhbEJ5dGVzICkgeworCQliU3VjY2VzcyA9IHRydWU7CisJfQorCQorCXJldHVybiBiU3VjY2VzczsKK30KKworYm9vbCBwc2RQYXJzZXI6OlJlYWRJbWFnZVJlc291cmNlcyhGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIExPTkcgbGVuZ3RoKSB7CisJcHNkSW1hZ2VSZXNvdXJjZSBvUmVzb3VyY2U7CisJYm9vbCBiU3VjY2VzcyA9IGZhbHNlOworCQorCWlmKGxlbmd0aCA+IDApIHsKKwkJb1Jlc291cmNlLl9MZW5ndGggPSBsZW5ndGg7CisJfSBlbHNlIHsKKwkJQllURSBMZW5ndGhbNF07CisJCWludCBuID0gKGludClpby0+cmVhZF9wcm9jKCZMZW5ndGgsIHNpemVvZihMZW5ndGgpLCAxLCBoYW5kbGUpOworCQkKKwkJb1Jlc291cmNlLl9MZW5ndGggPSBwc2RHZXRWYWx1ZSggTGVuZ3RoLCBzaXplb2Yob1Jlc291cmNlLl9MZW5ndGgpICk7CisJfQorCQorCWludCBuQnl0ZXMgPSAwOworCWludCBuVG90YWxCeXRlcyA9IG9SZXNvdXJjZS5fTGVuZ3RoOworCQorCXdoaWxlKG5CeXRlcyA8IG5Ub3RhbEJ5dGVzKSB7CisJCWludCBuID0gMDsKKwkJb1Jlc291cmNlLlJlc2V0KCk7CisJCQorCQluID0gKGludClpby0+cmVhZF9wcm9jKCZvUmVzb3VyY2UuX09TVHlwZSwgc2l6ZW9mKG9SZXNvdXJjZS5fT1NUeXBlKSwgMSwgaGFuZGxlKTsKKwkJaWYobiAhPSAxKSB7CisJCQlGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2MoX2ZpX2Zvcm1hdF9pZCwgIlRoaXMgZmlsZSBjb250YWlucyBkYW1hZ2VkIGRhdGEgY2F1c2luZyBhbiB1bmV4cGVjdGVkIGVuZC1vZi1maWxlIC0gc3RvcCByZWFkaW5nIHJlc291cmNlcyIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCW5CeXRlcyArPSBuICogc2l6ZW9mKG9SZXNvdXJjZS5fT1NUeXBlKTsKKworCQlpZiggKG5CeXRlcyAlIDIpICE9IDAgKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJCisJCWludCBuT1NUeXBlID0gcHNkR2V0VmFsdWUoKEJZVEUqKSZvUmVzb3VyY2UuX09TVHlwZSwgc2l6ZW9mKG9SZXNvdXJjZS5fT1NUeXBlKSk7CisKKwkJaWYgKCBQU0RfUkVTT1VSQ0UgPT0gbk9TVHlwZSApIHsKKwkJCUJZVEUgSURbMl07CisJCQluID0gKGludClpby0+cmVhZF9wcm9jKCZJRCwgc2l6ZW9mKElEKSwgMSwgaGFuZGxlKTsKKwkJCW5CeXRlcyArPSBuICogc2l6ZW9mKElEKTsKKwkJCQorCQkJb1Jlc291cmNlLl9JRCA9IChzaG9ydClwc2RHZXRWYWx1ZSggSUQsIHNpemVvZihJRCkgKTsKKwkJCQorCQkJQllURSBTaXplT2ZOYW1lOworCQkJbiA9IChpbnQpaW8tPnJlYWRfcHJvYygmU2l6ZU9mTmFtZSwgc2l6ZW9mKFNpemVPZk5hbWUpLCAxLCBoYW5kbGUpOworCQkJbkJ5dGVzICs9IG4gKiBzaXplb2YoU2l6ZU9mTmFtZSk7CisJCQkKKwkJCWludCBuU2l6ZU9mTmFtZSA9IHBzZEdldFZhbHVlKCAmU2l6ZU9mTmFtZSwgc2l6ZW9mKFNpemVPZk5hbWUpICk7CisJCQlpZiAoIDAgPCBuU2l6ZU9mTmFtZSApIHsKKwkJCQlvUmVzb3VyY2UuX3BsTmFtZSA9IG5ldyBCWVRFW25TaXplT2ZOYW1lXTsKKwkJCQluID0gKGludClpby0+cmVhZF9wcm9jKG9SZXNvdXJjZS5fcGxOYW1lLCBuU2l6ZU9mTmFtZSwgMSwgaGFuZGxlKTsKKwkJCQluQnl0ZXMgKz0gbiAqIG5TaXplT2ZOYW1lOworCQkJfQorCQkJCisJCQlpZiAoIDAgPT0gKG5TaXplT2ZOYW1lICUgMikgKSB7CisJCQkJbiA9IChpbnQpaW8tPnJlYWRfcHJvYygmU2l6ZU9mTmFtZSwgc2l6ZW9mKFNpemVPZk5hbWUpLCAxLCBoYW5kbGUpOworCQkJCW5CeXRlcyArPSBuICogc2l6ZW9mKFNpemVPZk5hbWUpOworCQkJfQorCQkJCisJCQlCWVRFIFNpemVbNF07CisJCQluID0gKGludClpby0+cmVhZF9wcm9jKCZTaXplLCBzaXplb2YoU2l6ZSksIDEsIGhhbmRsZSk7CisJCQluQnl0ZXMgKz0gbiAqIHNpemVvZihTaXplKTsKKwkJCQorCQkJb1Jlc291cmNlLl9TaXplID0gcHNkR2V0VmFsdWUoIFNpemUsIHNpemVvZihvUmVzb3VyY2UuX1NpemUpICk7CisJCQkKKwkJCWlmICggMCAhPSAob1Jlc291cmNlLl9TaXplICUgMikgKSB7CisJCQkJLy8gcmVzb3VyY2UgZGF0YSBtdXN0IGJlIGV2ZW4KKwkJCQlvUmVzb3VyY2UuX1NpemUrKzsKKwkJCX0KKwkJCWlmICggMCA8IG9SZXNvdXJjZS5fU2l6ZSApIHsKKwkJCQlCWVRFIEludFZhbHVlWzRdOworCQkJCUJZVEUgU2hvcnRWYWx1ZVsyXTsKKwkJCQkKKwkJCQlzd2l0Y2goIG9SZXNvdXJjZS5fSUQgKSB7CisJCQkJCWNhc2UgMTAwMDoKKwkJCQkJCS8vIE9ic29sZXRlIC0gUGhvdG9zaG9wIDIuMAorCQkJCQkJX2JSZXNvbHV0aW9uSW5mb0ZpbGxlZF92MiA9IHRydWU7CisJCQkJCQluQnl0ZXMgKz0gX3Jlc29sdXRpb25JbmZvX3YyLlJlYWQoaW8sIGhhbmRsZSk7CisJCQkJCQlicmVhazsKKwkJCQkJCisJCQkJCS8vIFJlc29sdXRpb25JbmZvIHN0cnVjdHVyZQorCQkJCQljYXNlIDEwMDU6CisJCQkJCQlfYlJlc29sdXRpb25JbmZvRmlsbGVkID0gdHJ1ZTsKKwkJCQkJCW5CeXRlcyArPSBfcmVzb2x1dGlvbkluZm8uUmVhZChpbywgaGFuZGxlKTsKKwkJCQkJCWJyZWFrOworCQkJCQkJCisJCQkJCS8vIERpc3BsYXlJbmZvIHN0cnVjdHVyZQorCQkJCQljYXNlIDEwMDc6CisJCQkJCQlfYkRpc3BsYXlJbmZvRmlsbGVkID0gdHJ1ZTsKKwkJCQkJCW5CeXRlcyArPSBfZGlzcGxheUluZm8uUmVhZChpbywgaGFuZGxlKTsKKwkJCQkJCWJyZWFrOworCQkJCQkJCisJCQkJCS8vIChQaG90b3Nob3AgNC4wKSBDb3B5cmlnaHQgZmxhZworCQkJCQkvLyBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciBpbWFnZSBpcyBjb3B5cmlnaHRlZC4gQ2FuIGJlIHNldCB2aWEgUHJvcGVydHkgc3VpdGUgb3IgYnkgdXNlciBpbiBGaWxlIEluZm8uLi4KKwkJCQkJY2FzZSAxMDM0OgorCQkJCQkJbiA9IChpbnQpaW8tPnJlYWRfcHJvYygmU2hvcnRWYWx1ZSwgc2l6ZW9mKFNob3J0VmFsdWUpLCAxLCBoYW5kbGUpOworCQkJCQkJbkJ5dGVzICs9IG4gKiBzaXplb2YoU2hvcnRWYWx1ZSk7CisJCQkJCQlfYkNvcHlyaWdodCA9ICgxID09IHBzZEdldFZhbHVlKFNob3J0VmFsdWUsIHNpemVvZihTaG9ydFZhbHVlKSkpOworCQkJCQkJYnJlYWs7CisJCQkJCQkKKwkJCQkJLy8gKFBob3Rvc2hvcCA0LjApIFRodW1ibmFpbCByZXNvdXJjZSBmb3IgUGhvdG9zaG9wIDQuMCBvbmx5CisJCQkJCWNhc2UgMTAzMzoKKwkJCQkJLy8gKFBob3Rvc2hvcCA1LjApIFRodW1ibmFpbCByZXNvdXJjZSAoc3VwZXJzZWRlcyByZXNvdXJjZSAxMDMzKQorCQkJCQljYXNlIDEwMzY6CisJCQkJCXsKKwkJCQkJCV9iVGh1bWJuYWlsRmlsbGVkID0gdHJ1ZTsKKwkJCQkJCWJvb2wgYkJHUiA9ICgxMDMzPT1vUmVzb3VyY2UuX0lEKTsKKwkJCQkJCW5CeXRlcyArPSBfdGh1bWJuYWlsLlJlYWQoaW8sIGhhbmRsZSwgb1Jlc291cmNlLl9TaXplLCBiQkdSKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCQorCQkJCQkvLyAoUGhvdG9zaG9wIDUuMCkgR2xvYmFsIEFuZ2xlCisJCQkJCS8vIDQgYnl0ZXMgdGhhdCBjb250YWluIGFuIGludGVnZXIgYmV0d2VlbiAwIGFuZCAzNTksIHdoaWNoIGlzIHRoZSBnbG9iYWwKKwkJCQkJLy8gbGlnaHRpbmcgYW5nbGUgZm9yIGVmZmVjdHMgbGF5ZXIuIElmIG5vdCBwcmVzZW50LCBhc3N1bWVkIHRvIGJlIDMwLgorCQkJCQljYXNlIDEwMzc6CisJCQkJCQluID0gKGludClpby0+cmVhZF9wcm9jKCZJbnRWYWx1ZSwgc2l6ZW9mKEludFZhbHVlKSwgMSwgaGFuZGxlKTsKKwkJCQkJCW5CeXRlcyArPSBuICogc2l6ZW9mKEludFZhbHVlKTsKKwkJCQkJCV9HbG9iYWxBbmdsZSA9IHBzZEdldFZhbHVlKEludFZhbHVlLCBzaXplb2YoX0dsb2JhbEFuZ2xlKSApOworCQkJCQkJYnJlYWs7CisKKwkJCQkJLy8gSUNDIHByb2ZpbGUKKwkJCQkJY2FzZSAxMDM5OgorCQkJCQkJbkJ5dGVzICs9IF9pY2NQcm9maWxlLlJlYWQoaW8sIGhhbmRsZSwgb1Jlc291cmNlLl9TaXplKTsKKwkJCQkJCWJyZWFrOworCisJCQkJCS8vIChQaG90b3Nob3AgNi4wKSBJbmRleGVkIENvbG9yIFRhYmxlIENvdW50CisJCQkJCS8vIDIgYnl0ZXMgZm9yIHRoZSBudW1iZXIgb2YgY29sb3JzIGluIHRhYmxlIHRoYXQgYXJlIGFjdHVhbGx5IGRlZmluZWQKKwkJCQkJY2FzZSAxMDQ2OgorCQkJCQkJbiA9IChpbnQpaW8tPnJlYWRfcHJvYygmU2hvcnRWYWx1ZSwgc2l6ZW9mKFNob3J0VmFsdWUpLCAxLCBoYW5kbGUpOworCQkJCQkJbkJ5dGVzICs9IG4gKiBzaXplb2YoU2hvcnRWYWx1ZSk7CisJCQkJCQlfQ29sb3VyQ291bnQgPSAoc2hvcnQpcHNkR2V0VmFsdWUoU2hvcnRWYWx1ZSwgc2l6ZW9mKFNob3J0VmFsdWUpICk7CisJCQkJCQlicmVhazsKKwkJCQkJCQorCQkJCQkvLyAoUGhvdG9zaG9wIDYuMCkgVHJhbnNwYXJlbmN5IEluZGV4LgorCQkJCQkvLyAyIGJ5dGVzIGZvciB0aGUgaW5kZXggb2YgdHJhbnNwYXJlbnQgY29sb3IsIGlmIGFueS4KKwkJCQkJY2FzZSAxMDQ3OgorCQkJCQkJbiA9IChpbnQpaW8tPnJlYWRfcHJvYygmU2hvcnRWYWx1ZSwgc2l6ZW9mKFNob3J0VmFsdWUpLCAxLCBoYW5kbGUpOworCQkJCQkJbkJ5dGVzICs9IG4gKiBzaXplb2YoU2hvcnRWYWx1ZSk7CisJCQkJCQlfVHJhbnNwYXJlbnRJbmRleCA9IChzaG9ydClwc2RHZXRWYWx1ZShTaG9ydFZhbHVlLCBzaXplb2YoU2hvcnRWYWx1ZSkgKTsKKwkJCQkJCWJyZWFrOworCQkJCQkJCisJCQkJCWRlZmF1bHQ6CisJCQkJCXsKKwkJCQkJCS8vIHNraXAgcmVzb3VyY2UKKwkJCQkJCXVuc2lnbmVkIHNraXBfbGVuZ3RoID0gTUlOKG9SZXNvdXJjZS5fU2l6ZSwgblRvdGFsQnl0ZXMgLSBuQnl0ZXMpOworCQkJCQkJaW8tPnNlZWtfcHJvYyhoYW5kbGUsIHNraXBfbGVuZ3RoLCBTRUVLX0NVUik7CisJCQkJCQluQnl0ZXMgKz0gc2tpcF9sZW5ndGg7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisgIH0KKyAgCisgIGlmIChuQnl0ZXMgPT0gblRvdGFsQnl0ZXMpIHsKKwkgIGJTdWNjZXNzID0gdHJ1ZTsKKyAgfQorICAKKyAgcmV0dXJuIGJTdWNjZXNzOworICAKK30gCisKK0ZJQklUTUFQKiBwc2RQYXJzZXI6OlJlYWRJbWFnZURhdGEoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlKSB7CisJaWYoaGFuZGxlID09IE5VTEwpIAorCQlyZXR1cm4gTlVMTDsKKwkKKwlib29sIGhlYWRlcl9vbmx5ID0gKF9maV9mbGFncyAmIEZJRl9MT0FEX05PUElYRUxTKSA9PSBGSUZfTE9BRF9OT1BJWEVMUzsKKwkKKwlXT1JEIG5Db21wcmVzc2lvbiA9IDA7CisJaW8tPnJlYWRfcHJvYygmbkNvbXByZXNzaW9uLCBzaXplb2YobkNvbXByZXNzaW9uKSwgMSwgaGFuZGxlKTsKKwkKKyNpZm5kZWYgRlJFRUlNQUdFX0JJR0VORElBTgorCVN3YXBTaG9ydCgmbkNvbXByZXNzaW9uKTsKKyNlbmRpZgorCQorCWlmKChuQ29tcHJlc3Npb24gIT0gUFNEUF9DT01QUkVTU0lPTl9OT05FICYmIG5Db21wcmVzc2lvbiAhPSBQU0RQX0NPTVBSRVNTSU9OX1JMRSkpCXsKKwkJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKF9maV9mb3JtYXRfaWQsICJVbnN1cHBvcnRlZCBjb21wcmVzc2lvbiAlZCIsIG5Db21wcmVzc2lvbik7CisJCXJldHVybiBOVUxMOworCX0KKwkKKwljb25zdCB1bnNpZ25lZCBuV2lkdGggPSBfaGVhZGVySW5mby5fV2lkdGg7CisJY29uc3QgdW5zaWduZWQgbkhlaWdodCA9IF9oZWFkZXJJbmZvLl9IZWlnaHQ7CisJY29uc3QgdW5zaWduZWQgbkNoYW5uZWxzID0gX2hlYWRlckluZm8uX0NoYW5uZWxzOworCWNvbnN0IHVuc2lnbmVkIGRlcHRoID0gX2hlYWRlckluZm8uX0JpdHNQZXJDaGFubmVsOworCWNvbnN0IHVuc2lnbmVkIGJ5dGVzID0gKGRlcHRoID09IDEpID8gMSA6IGRlcHRoIC8gODsKKwkJCisJLy8gY2hhbm5lbChwbGFuZSkgbGluZSAoQllURSBhbGlnbmVkKQorCWNvbnN0IHVuc2lnbmVkIGxpbmVTaXplID0gKF9oZWFkZXJJbmZvLl9CaXRzUGVyQ2hhbm5lbCA9PSAxKSA/IChuV2lkdGggKyA3KSAvIDggOiBuV2lkdGggKiBieXRlczsKKwkKKwlpZihuQ29tcHJlc3Npb24gPT0gUFNEUF9DT01QUkVTU0lPTl9STEUgJiYgZGVwdGggPiAxNikgeworCQlGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2MoX2ZpX2Zvcm1hdF9pZCwgIlVuc3VwcG9ydGVkIFJMRSB3aXRoIGRlcHRoICVkIiwgZGVwdGgpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJCisJLy8gYnVpbGQgb3V0cHV0IGJ1ZmZlcgorCQorCUZJQklUTUFQKiBiaXRtYXAgPSBOVUxMOworCXVuc2lnbmVkIGRzdENoID0gMDsKKwkKKwlzaG9ydCBtb2RlID0gX2hlYWRlckluZm8uX0NvbG91ck1vZGU7CisJCisJaWYobW9kZSA9PSBQU0RQX01VTFRJQ0hBTk5FTCAmJiBuQ2hhbm5lbHMgPCAzKSB7CisJCS8vIENNIAorCQltb2RlID0gUFNEUF9HUkFZU0NBTEU7IC8vIEMgYXMgZ3JheSwgTSBhcyBleHRyYSBjaGFubmVsCisJfQorCQkKKwlib29sIG5lZWRQYWxldHRlID0gZmFsc2U7CisJc3dpdGNoIChtb2RlKSB7CisJCWNhc2UgUFNEUF9CSVRNQVA6CisJCWNhc2UgUFNEUF9EVU9UT05FOgkKKwkJY2FzZSBQU0RQX0lOREVYRUQ6CisJCWNhc2UgUFNEUF9HUkFZU0NBTEU6CisJCQlkc3RDaCA9IDE7CisJCQlzd2l0Y2goZGVwdGgpIHsKKwkJCQljYXNlIDE2OgorCQkJCWJpdG1hcCA9IEZyZWVJbWFnZV9BbGxvY2F0ZUhlYWRlclQoaGVhZGVyX29ubHksIEZJVF9VSU5UMTYsIG5XaWR0aCwgbkhlaWdodCwgZGVwdGgqZHN0Q2gpOworCQkJCWJyZWFrOworCQkJCWNhc2UgMzI6CisJCQkJYml0bWFwID0gRnJlZUltYWdlX0FsbG9jYXRlSGVhZGVyVChoZWFkZXJfb25seSwgRklUX0ZMT0FULCBuV2lkdGgsIG5IZWlnaHQsIGRlcHRoKmRzdENoKTsKKwkJCQlicmVhazsKKwkJCQlkZWZhdWx0OiAvLyAxLSwgOC0KKwkJCQluZWVkUGFsZXR0ZSA9IHRydWU7CisJCQkJYml0bWFwID0gRnJlZUltYWdlX0FsbG9jYXRlSGVhZGVyKGhlYWRlcl9vbmx5LCBuV2lkdGgsIG5IZWlnaHQsIGRlcHRoKmRzdENoKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFBTRFBfUkdCOgkKKwkJY2FzZSBQU0RQX0xBQjoJCQorCQljYXNlIFBTRFBfQ01ZSwk6CisJCWNhc2UgUFNEUF9NVUxUSUNIQU5ORUwJOgorCQkJLy8gZm9yY2UgUFNEUF9NVUxUSUNIQU5ORUwgQ01ZIGFzIENNWUsKKwkJCWRzdENoID0gKG1vZGUgPT0gUFNEUF9NVUxUSUNIQU5ORUwgJiYgIWhlYWRlcl9vbmx5KSA/IDQgOiBNSU48dW5zaWduZWQ+KG5DaGFubmVscywgNCk7CisJCQlpZihkc3RDaCA8IDMpIHsKKwkJCQl0aHJvdyAiSW52YWxpZCBudW1iZXIgb2YgY2hhbm5lbHMiOworCQkJfQorCisJCQlzd2l0Y2goZGVwdGgpIHsKKwkJCQljYXNlIDE2OgorCQkJCWJpdG1hcCA9IEZyZWVJbWFnZV9BbGxvY2F0ZUhlYWRlclQoaGVhZGVyX29ubHksIGRzdENoIDwgNCA/IEZJVF9SR0IxNiA6IEZJVF9SR0JBMTYsIG5XaWR0aCwgbkhlaWdodCwgZGVwdGgqZHN0Q2gpOworCQkJCWJyZWFrOworCQkJCWNhc2UgMzI6CisJCQkJYml0bWFwID0gRnJlZUltYWdlX0FsbG9jYXRlSGVhZGVyVChoZWFkZXJfb25seSwgZHN0Q2ggPCA0ID8gRklUX1JHQkYgOiBGSVRfUkdCQUYsIG5XaWR0aCwgbkhlaWdodCwgZGVwdGgqZHN0Q2gpOworCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJYml0bWFwID0gRnJlZUltYWdlX0FsbG9jYXRlSGVhZGVyKGhlYWRlcl9vbmx5LCBuV2lkdGgsIG5IZWlnaHQsIGRlcHRoKmRzdENoKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdGhyb3cgIlVuc3VwcG9ydGVkIGNvbG9yIG1vZGUiOworCQkJYnJlYWs7CisJfQorCWlmKCFiaXRtYXApIHsKKwkJdGhyb3cgRklfTVNHX0VSUk9SX0RJQl9NRU1PUlk7CisJfQorCisJLy8gd3JpdGUgdGh1bWJuYWlsCisJRnJlZUltYWdlX1NldFRodW1ibmFpbChiaXRtYXAsIF90aHVtYm5haWwuZ2V0RGliKCkpOworCQkKKwkvLyBAdG9kbyBBZGQgc29tZSBtZXRhZGF0YSBtb2RlbAorCQkKKwlpZihoZWFkZXJfb25seSkgeworCQlyZXR1cm4gYml0bWFwOworCX0KKwkKKwkvLyBMb2FkIHBpeGVscyBkYXRhCisKKwljb25zdCB1bnNpZ25lZCBkc3RDaGFubmVscyA9IGRzdENoOworCQorCWNvbnN0IHVuc2lnbmVkIGRzdEJwcCA9ICAoZGVwdGggPT0gMSkgPyAxIDogRnJlZUltYWdlX0dldEJQUChiaXRtYXApLzg7CisJY29uc3QgdW5zaWduZWQgZHN0TGluZVNpemUgPSBGcmVlSW1hZ2VfR2V0UGl0Y2goYml0bWFwKTsJCisJQllURSogY29uc3QgZHN0X2ZpcnN0X2xpbmUgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoYml0bWFwLCBuSGVpZ2h0IC0gMSk7Ly88KioqIGZsaXBwZWQKKwkKKwlCWVRFKiBsaW5lX3N0YXJ0ID0gbmV3IEJZVEVbbGluZVNpemVdOyAvLzwgZmlsZWxpbmUgY2FjaGUKKworCXN3aXRjaCAoIG5Db21wcmVzc2lvbiApIHsKKwkJY2FzZSBQU0RQX0NPTVBSRVNTSU9OX05PTkU6IC8vIHJhdyBkYXRhCQorCQl7CQkJCisJCQlmb3IodW5zaWduZWQgYyA9IDA7IGMgPCBuQ2hhbm5lbHM7IGMrKykgeworCQkJCWlmKGMgPj0gZHN0Q2hhbm5lbHMpIHsKKwkJCQkJLy8gQHRvZG8gd3JpdGUgZXh0cmEgY2hhbm5lbHMKKwkJCQkJYnJlYWs7IAorCQkJCX0KKwkJCQkJCisJCQkJY29uc3QgdW5zaWduZWQgY2hhbm5lbE9mZnNldCA9IGMgKiBieXRlczsKKwkJCQkKKwkJCQlCWVRFKiBkc3RfbGluZV9zdGFydCA9IGRzdF9maXJzdF9saW5lOworCQkJCWZvcih1bnNpZ25lZCBoID0gMDsgaCA8IG5IZWlnaHQ7ICsraCwgZHN0X2xpbmVfc3RhcnQgLT0gZHN0TGluZVNpemUpIHsvLzwqKiogZmxpcHBlZAorCisJCQkJCWlvLT5yZWFkX3Byb2MobGluZV9zdGFydCwgbGluZVNpemUsIDEsIGhhbmRsZSk7CisJCQkJCQorCQkJCQlmb3IgKEJZVEUgKmxpbmUgPSBsaW5lX3N0YXJ0LCAqZHN0X2xpbmUgPSBkc3RfbGluZV9zdGFydDsgbGluZSA8IGxpbmVfc3RhcnQgKyBsaW5lU2l6ZTsgCisJCQkJCQlsaW5lICs9IGJ5dGVzLCBkc3RfbGluZSArPSBkc3RCcHApIHsKKyNpZmRlZiBGUkVFSU1BR0VfQklHRU5ESUFOCisJCQkJCQkJbWVtY3B5KGRzdF9saW5lICsgY2hhbm5lbE9mZnNldCwgbGluZSwgYnl0ZXMpOworI2Vsc2UKKwkJCQkJCS8vIHJldmVyc2UgY29weSBieXRlcworCQkJCQkJZm9yICh1bnNpZ25lZCBiID0gMDsgYiA8IGJ5dGVzOyArK2IpIHsKKwkJCQkJCQlkc3RfbGluZVtjaGFubmVsT2Zmc2V0ICsgYl0gPSBsaW5lWyhieXRlcy0xKSAtIGJdOworCQkJCQkJfQorI2VuZGlmIC8vIEZSRUVJTUFHRV9CSUdFTkRJQU4KKwkJCQkJfQorCQkJCX0gLy88IGgKKwkJCX0vLzwgY2gKKwkJCQorCQkJU0FGRV9ERUxFVEVfQVJSQVkobGluZV9zdGFydCk7CisJCQkJCQorCQl9CisJCWJyZWFrOworCQkKKwkJY2FzZSBQU0RQX0NPTVBSRVNTSU9OX1JMRTogLy8gUkxFIGNvbXByZXNzaW9uCQorCQl7CQkJCisJCQkJCQkJCQkKKwkJCS8vIFRoZSBSTEUtY29tcHJlc3NlZCBkYXRhIGlzIHByZWNlZWRlZCBieSBhIDItYnl0ZSBsaW5lIHNpemUgZm9yIGVhY2ggcm93IGluIHRoZSBkYXRhLAorCQkJLy8gc3RvcmUgYW4gYXJyYXkgb2YgdGhlc2UKKworCQkJLy8gbGF0ZXIgdXNlIHRoaXMgYXJyYXkgYXMgV09SRCBybGVMaW5lU2l6ZUxpc3RbbkNoYW5uZWxzXVtuSGVpZ2h0XTsKKwkJCVdPUkQgKnJsZUxpbmVTaXplTGlzdCA9IG5ldyAoc3RkOjpub3Rocm93KSBXT1JEW25DaGFubmVscypuSGVpZ2h0XTsKKworCQkJaWYoIXJsZUxpbmVTaXplTGlzdCkgeworCQkJCUZyZWVJbWFnZV9VbmxvYWQoYml0bWFwKTsKKwkJCQlTQUZFX0RFTEVURV9BUlJBWShsaW5lX3N0YXJ0KTsKKwkJCQl0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOworCQkJfQkKKwkJCQorCQkJaW8tPnJlYWRfcHJvYyhybGVMaW5lU2l6ZUxpc3QsIDIsIG5DaGFubmVscyAqIG5IZWlnaHQsIGhhbmRsZSk7CisJCQkKKwkJCVdPUkQgbGFyZ2VzdFJMRUxpbmUgPSAwOworCQkJZm9yKHVuc2lnbmVkIGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7ICsrY2gpIHsKKwkJCQlmb3IodW5zaWduZWQgaCA9IDA7IGggPCBuSGVpZ2h0OyArK2gpIHsKKwkJCQkJY29uc3QgdW5zaWduZWQgaW5kZXggPSBjaCAqIG5IZWlnaHQgKyBoOworCisjaWZuZGVmIEZSRUVJTUFHRV9CSUdFTkRJQU4gCisJCQkJCVN3YXBTaG9ydCgmcmxlTGluZVNpemVMaXN0W2luZGV4XSk7CisjZW5kaWYKKwkJCQkJaWYobGFyZ2VzdFJMRUxpbmUgPCBybGVMaW5lU2l6ZUxpc3RbaW5kZXhdKSB7CisJCQkJCQlsYXJnZXN0UkxFTGluZSA9IHJsZUxpbmVTaXplTGlzdFtpbmRleF07CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCUJZVEUqIHJsZV9saW5lX3N0YXJ0ID0gbmV3IChzdGQ6Om5vdGhyb3cpIEJZVEVbbGFyZ2VzdFJMRUxpbmVdOworCQkJaWYoIXJsZV9saW5lX3N0YXJ0KSB7CisJCQkJRnJlZUltYWdlX1VubG9hZChiaXRtYXApOworCQkJCVNBRkVfREVMRVRFX0FSUkFZKGxpbmVfc3RhcnQpOworCQkJCVNBRkVfREVMRVRFX0FSUkFZKHJsZUxpbmVTaXplTGlzdCk7CisJCQkJdGhyb3cgc3RkOjpiYWRfYWxsb2MoKTsKKwkJCX0KKwkJCQorCQkJLy8gUmVhZCB0aGUgUkxFIGRhdGEgKGFzc3VtZSA4LWJpdCkKKwkJCQorCQkJY29uc3QgQllURSogY29uc3QgbGluZV9lbmQgPSBsaW5lX3N0YXJ0ICsgbGluZVNpemU7CisKKwkJCWZvciAodW5zaWduZWQgY2ggPSAwOyBjaCA8IG5DaGFubmVsczsgY2grKykgeworCQkJCWNvbnN0IHVuc2lnbmVkIGNoYW5uZWxPZmZzZXQgPSBjaCAqIGJ5dGVzOworCQkJCQorCQkJCUJZVEUqIGRzdF9saW5lX3N0YXJ0ID0gZHN0X2ZpcnN0X2xpbmU7CisJCQkJZm9yKHVuc2lnbmVkIGggPSAwOyBoIDwgbkhlaWdodDsgKytoLCBkc3RfbGluZV9zdGFydCAtPSBkc3RMaW5lU2l6ZSkgey8vPCoqKiBmbGlwcGVkCisJCQkJCWNvbnN0IHVuc2lnbmVkIGluZGV4ID0gY2ggKiBuSGVpZ2h0ICsgaDsKKwkJCQkJCisJCQkJCS8vIC0gcmVhZCBhbmQgdW5jb21wcmVzcyBsaW5lIC0KKwkJCQkJCisJCQkJCWNvbnN0IFdPUkQgcmxlTGluZVNpemUgPSBybGVMaW5lU2l6ZUxpc3RbaW5kZXhdOworCQkJCQkKKwkJCQkJaW8tPnJlYWRfcHJvYyhybGVfbGluZV9zdGFydCwgcmxlTGluZVNpemUsIDEsIGhhbmRsZSk7CisJCQkJCQorCQkJCQlmb3IgKEJZVEUqIHJsZV9saW5lID0gcmxlX2xpbmVfc3RhcnQsICpsaW5lID0gbGluZV9zdGFydDsgCisJCQkJCQlybGVfbGluZSA8IHJsZV9saW5lX3N0YXJ0ICsgcmxlTGluZVNpemUsIGxpbmUgPCBsaW5lX2VuZDspIHsKKworCQkJCQkJaW50IGxlbiA9ICpybGVfbGluZSsrOworCQkJCQkJCisJCQkJCQkvLyBOT1RFIGxlbiBpcyBzaWduZWQgYnl0ZSBpbiBQYWNrQml0cyBSTEUKKwkJCQkJCQorCQkJCQkJaWYgKCBsZW4gPCAxMjggKSB7IC8vPC0gTVNCIGlzIG5vdCBzZXQKKwkJCQkJCQkvLyB1bmNvbXByZXNzZWQgcGFja2V0CisJCQkJCQkJCisJCQkJCQkJLy8gKGxlbiArIDEpIGJ5dGVzIG9mIGRhdGEgYXJlIGNvcGllZAorCQkJCQkJCQorCQkJCQkJCSsrbGVuOworCQkJCQkJCQorCQkJCQkJCS8vIGFzc2VydCB3ZSBkb24ndCB3cml0ZSBiZXlvdW5kIGVvbAorCQkJCQkJCW1lbWNweShsaW5lLCBybGVfbGluZSwgbGluZSArIGxlbiA+IGxpbmVfZW5kID8gbGluZV9lbmQgLSBsaW5lIDogbGVuKTsKKwkJCQkJCQlsaW5lICs9IGxlbjsKKwkJCQkJCQlybGVfbGluZSArPSBsZW47CisJCQkJCQl9CisJCQkJCQllbHNlIGlmICggbGVuID4gMTI4ICkgeyAvLzwgTVNCIGlzIHNldAorCQkJCQkJCisJCQkJCQkJLy8gUkxFIGNvbXByZXNzZWQgcGFja2V0CisJCQkJCQkJCisJCQkJCQkJLy8gT25lIGJ5dGUgb2YgZGF0YSBpcyByZXBlYXRlZCAo4oCTbGVuICsgMSkgdGltZXMKKwkJCQkJCQkKKwkJCQkJCQlsZW4gXj0gMHhGRjsgLy8gc2FtZSBhcyAoLWxlbiArIDEpICYgMHhGRiAKKwkJCQkJCQlsZW4gKz0gMjsgICAgLy8KKworCQkJCQkJCS8vIGFzc2VydCB3ZSBkb24ndCB3cml0ZSBiZXlvdW5kIGVvbAorCQkJCQkJCW1lbXNldChsaW5lLCAqcmxlX2xpbmUrKywgbGluZSArIGxlbiA+IGxpbmVfZW5kID8gbGluZV9lbmQgLSBsaW5lIDogbGVuKTsJCQkJCQkJCisJCQkJCQkJbGluZSArPSBsZW47CisKKwkJCQkJCX0KKwkJCQkJCWVsc2UgaWYgKCAxMjggPT0gbGVuICkgeworCQkJCQkJCS8vIERvIG5vdGhpbmcKKwkJCQkJCX0KKwkJCQkJfS8vPCBybGVfbGluZQorCQkJCQkKKwkJCQkJLy8gLSB3cml0ZSBsaW5lIHRvIGRlc3RpbmF0aW9uIC0KKwkJCQkJCisJCQkJCWlmKGNoID49IGRzdENoYW5uZWxzKSB7CisJCQkJCQkvLyBAdG9kbyB3cml0ZSB0byBleHRyYSBjaGFubmVscworCQkJCQkJYnJlYWs7IAorCQkJCQl9CisJCQkJCQkKKwkJCQkJLy8gYnl0ZSBieSBieXRlIGNvcHkgYSBzaW5nbGUgY2hhbm5lbCB0byBwaXhlbAorCQkJCQlmb3IgKEJZVEUgKmxpbmUgPSBsaW5lX3N0YXJ0LCAqZHN0X2xpbmUgPSBkc3RfbGluZV9zdGFydDsgbGluZSA8IGxpbmVfc3RhcnQgKyBsaW5lU2l6ZTsgCisJCQkJCQlsaW5lICs9IGJ5dGVzLCBkc3RfbGluZSArPSBkc3RCcHApIHsKKworI2lmZGVmIEZSRUVJTUFHRV9CSUdFTkRJQU4KKwkJCQkJCQltZW1jcHkoZHN0X2xpbmUgKyBjaGFubmVsT2Zmc2V0LCBsaW5lLCBieXRlcyk7CisjZWxzZQorCQkJCQkJCS8vIHJldmVyc2UgY29weSBieXRlcworCQkJCQkJCWZvciAodW5zaWduZWQgYiA9IDA7IGIgPCBieXRlczsgKytiKSB7CisJCQkJCQkJCWRzdF9saW5lW2NoYW5uZWxPZmZzZXQgKyBiXSA9IGxpbmVbKGJ5dGVzLTEpIC0gYl07CQkJCQkJCQorCQkJCQkJCX0KKyNlbmRpZiAvLyBGUkVFSU1BR0VfQklHRU5ESUFOCisJCQkJCX0JCisJCQkJfS8vPCBoCisJCQl9Ly88IGNoCisJCQkKKwkJCVNBRkVfREVMRVRFX0FSUkFZKGxpbmVfc3RhcnQpOworCQkJU0FGRV9ERUxFVEVfQVJSQVkocmxlTGluZVNpemVMaXN0KTsKKwkJCVNBRkVfREVMRVRFX0FSUkFZKHJsZV9saW5lX3N0YXJ0KTsKKwkJfQorCQlicmVhazsKKwkJCisJCWNhc2UgMjogLy8gWklQIHdpdGhvdXQgcHJlZGljdGlvbiwgbm8gc3BlY2lmaWNhdGlvbgorCQkJYnJlYWs7CisJCQkKKwkJY2FzZSAzOiAvLyBaSVAgd2l0aCBwcmVkaWN0aW9uLCBubyBzcGVjaWZpY2F0aW9uCisJCQlicmVhazsKKwkJCQorCQlkZWZhdWx0OiAvLyBVbmtub3duIGZvcm1hdAorCQkJYnJlYWs7CisJCQorCX0KKwkKKwkvLyAtLS0gRnVydGhlciBwcm9jZXNzIHRoZSBiaXRtYXAgLS0tCisJCisJaWYoKG1vZGUgPT0gUFNEUF9DTVlLIHx8IG1vZGUgPT0gUFNEUF9NVUxUSUNIQU5ORUwpKSB7CQorCQkvLyBDTVlLIHZhbHVlcyBhcmUgImludmVydGVkIiwgaW52ZXJ0IHRoZW0gYmFjawkJCisKKwkJaWYobW9kZSA9PSBQU0RQX01VTFRJQ0hBTk5FTCkgeworCQkJaW52ZXJ0Q29sb3IoYml0bWFwKTsKKwkJfSBlbHNlIHsKKwkJCUZyZWVJbWFnZV9JbnZlcnQoYml0bWFwKTsKKwkJfQorCisJCWlmKChfZmlfZmxhZ3MgJiBQU0RfQ01ZSykgPT0gUFNEX0NNWUspIHsKKwkJCS8vIGtlZXAgYXMgQ01ZSworCisJCQlpZihtb2RlID09IFBTRFBfTVVMVElDSEFOTkVMKSB7CisJCQkJLy8jIyMgd2UgZm9yY2UgQ01ZIHRvIGJlIENNWUssIGJ1dCBDTVkgaGFzIG5vIElDQy4gCisJCQkJLy8gQ3JlYXRlIGVtcHR5IHByb2ZpbGUgYW5kIGFkZCB0aGUgZmxhZy4KKwkJCQlGcmVlSW1hZ2VfQ3JlYXRlSUNDUHJvZmlsZShiaXRtYXAsIE5VTEwsIDApOworCQkJCUZyZWVJbWFnZV9HZXRJQ0NQcm9maWxlKGJpdG1hcCktPmZsYWdzIHw9IEZJSUNDX0NPTE9SX0lTX0NNWUs7CisJCQl9CisJCX0KKwkJZWxzZSB7IAorCQkJLy8gY29udmVydCB0byBSR0IKKwkJCQorCQkJQ29udmVydENNWUt0b1JHQkEoYml0bWFwKTsKKwkJCQorCQkJLy8gVGhlIElDQyBQcm9maWxlIGlzIG5vIGxvbmdlciB2YWxpZAorCQkJX2ljY1Byb2ZpbGUuY2xlYXIoKTsKKwkJCQorCQkJLy8gcmVtb3ZlIHRoZSBwZW5kaW5nIEEgaWYgbm90IHByZXNlbnQgaW4gc291cmNlIAorCQkJaWYobkNoYW5uZWxzID09IDQgfHwgbkNoYW5uZWxzID09IDMgKSB7CisJCQkJRklCSVRNQVAqIHQgPSBSZW1vdmVBbHBoYUNoYW5uZWwoYml0bWFwKTsKKwkJCQlpZih0KSB7CisJCQkJCUZyZWVJbWFnZV9VbmxvYWQoYml0bWFwKTsKKwkJCQkJYml0bWFwID0gdDsKKwkJCQl9IC8vIGVsc2U6IHNpbGVudGx5IGZhaWwKKwkJCX0KKwkJfQorCX0KKwllbHNlIGlmICggbW9kZSA9PSBQU0RQX0xBQiAmJiAhKChfZmlfZmxhZ3MgJiBQU0RfTEFCKSA9PSBQU0RfTEFCKSkgeworCQlDb252ZXJ0TEFCdG9SR0IoYml0bWFwKTsKKwl9CisJZWxzZSB7CisJCWlmIChuZWVkUGFsZXR0ZSAmJiBGcmVlSW1hZ2VfR2V0UGFsZXR0ZShiaXRtYXApKSB7CisJCQkKKwkJCWlmKG1vZGUgPT0gUFNEUF9CSVRNQVApIHsKKwkJCQlDUkVBVEVfR1JFWVNDQUxFX1BBTEVUVEVfUkVWRVJTRShGcmVlSW1hZ2VfR2V0UGFsZXR0ZShiaXRtYXApLCAyKTsKKwkJCX0KKwkJCWVsc2UgaWYobW9kZSA9PSBQU0RQX0lOREVYRUQpIHsKKwkJCQlpZighX2NvbG91ck1vZGVEYXRhLl9wbENvbG91ckRhdGEgfHwgX2NvbG91ck1vZGVEYXRhLl9MZW5ndGggIT0gNzY4IHx8IF9Db2xvdXJDb3VudCA8IDApIHsKKwkJCQkJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKF9maV9mb3JtYXRfaWQsICJJbmRleGVkIGltYWdlIGhhcyBubyBwYWxldHRlLiBVc2luZyB0aGUgZGVmYXVsdCBncmF5c2NhbGUgb25lLiIpOworCQkJCX0gZWxzZSB7CisJCQkJCV9jb2xvdXJNb2RlRGF0YS5GaWxsUGFsZXR0ZShiaXRtYXApOworCQkJCX0KKwkJCX0KKwkJCS8vIEdSQVlTQ0FMRSwgRFVPVE9ORSAtIHVzZSBkZWZhdWx0IGdyYXlzY2FsZSBwYWxldHRlCisJCX0KKwkJCisjaWYgRlJFRUlNQUdFX0NPTE9ST1JERVIgPT0gRlJFRUlNQUdFX0NPTE9ST1JERVJfQkdSCisJCWlmKEZyZWVJbWFnZV9HZXRJbWFnZVR5cGUoYml0bWFwKSA9PSBGSVRfQklUTUFQKSB7CisJCQlTd2FwUmVkQmx1ZTMyKGJpdG1hcCk7CisJCX0KKyNlbmRpZgorCX0KKwkKKwlyZXR1cm4gYml0bWFwOworfSAKKworRklCSVRNQVAqIHBzZFBhcnNlcjo6TG9hZChGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIGludCBzX2Zvcm1hdF9pZCwgaW50IGZsYWdzKSB7CisJRklCSVRNQVAgKkJpdG1hcCA9IE5VTEw7CisJCisJX2ZpX2ZsYWdzID0gZmxhZ3M7CisJX2ZpX2Zvcm1hdF9pZCA9IHNfZm9ybWF0X2lkOworCQorCXRyeSB7CisJCWlmIChOVUxMID09IGhhbmRsZSkgeworCQkJdGhyb3coIkNhbm5vdCBvcGVuIGZpbGUiKTsKKwkJfQorCQkKKwkJaWYgKCFfaGVhZGVySW5mby5SZWFkKGlvLCBoYW5kbGUpKSB7CisJCQl0aHJvdygiRXJyb3IgaW4gaGVhZGVyIik7CisJCX0KKworCQlpZiAoIV9jb2xvdXJNb2RlRGF0YS5SZWFkKGlvLCBoYW5kbGUpKSB7CisJCQl0aHJvdygiRXJyb3IgaW4gQ29sb3VyTW9kZSBEYXRhIik7CisJCX0KKwkJCisJCWlmICghUmVhZEltYWdlUmVzb3VyY2VzKGlvLCBoYW5kbGUpKSB7CisJCQl0aHJvdygiRXJyb3IgaW4gSW1hZ2UgUmVzb3VyY2UiKTsKKwkJfQorCQkKKwkJaWYgKCFSZWFkTGF5ZXJBbmRNYXNrSW5mb1NlY3Rpb24oaW8sIGhhbmRsZSkpIHsKKwkJCXRocm93KCJFcnJvciBpbiBNYXNrIEluZm8iKTsKKwkJfQorCQkKKwkJQml0bWFwID0gUmVhZEltYWdlRGF0YShpbywgaGFuZGxlKTsKKwkJaWYgKE5VTEwgPT0gQml0bWFwKSB7CisJCQl0aHJvdygiRXJyb3IgaW4gSW1hZ2UgRGF0YSIpOworCQl9CisKKwkJLy8gc2V0IHJlc29sdXRpb24gaW5mbworCQlpZihOVUxMICE9IEJpdG1hcCkgeworCQkJdW5zaWduZWQgcmVzX3ggPSAyODM1OwkvLyA3MiBkcGkKKwkJCXVuc2lnbmVkIHJlc195ID0gMjgzNTsJLy8gNzIgZHBpCisJCQlpZiAoX2JSZXNvbHV0aW9uSW5mb0ZpbGxlZCkgeworCQkJCV9yZXNvbHV0aW9uSW5mby5HZXRSZXNvbHV0aW9uSW5mbyhyZXNfeCwgcmVzX3kpOworCQkJfQorCQkJRnJlZUltYWdlX1NldERvdHNQZXJNZXRlclgoQml0bWFwLCByZXNfeCk7CisJCQlGcmVlSW1hZ2VfU2V0RG90c1Blck1ldGVyWShCaXRtYXAsIHJlc195KTsJCisJCX0KKworCQkvLyBzZXQgSUNDIHByb2ZpbGUKKwkJRnJlZUltYWdlX0NyZWF0ZUlDQ1Byb2ZpbGUoQml0bWFwLCBfaWNjUHJvZmlsZS5fUHJvZmlsZURhdGEsIF9pY2NQcm9maWxlLl9Qcm9maWxlU2l6ZSk7CisJCWlmICgoZmxhZ3MgJiBQU0RfQ01ZSykgPT0gUFNEX0NNWUspIHsKKwkJCXNob3J0IG1vZGUgPSBfaGVhZGVySW5mby5fQ29sb3VyTW9kZTsKKwkJCWlmKChtb2RlID09IFBTRFBfQ01ZSykgfHwgKG1vZGUgPT0gUFNEUF9NVUxUSUNIQU5ORUwpKSB7CisJCQkJRnJlZUltYWdlX0dldElDQ1Byb2ZpbGUoQml0bWFwKS0+ZmxhZ3MgfD0gRklJQ0NfQ09MT1JfSVNfQ01ZSzsKKwkJCX0KKwkJfQorCQkKKwl9IGNhdGNoKGNvbnN0IGNoYXIgKnRleHQpIHsKKwkJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKHNfZm9ybWF0X2lkLCB0ZXh0KTsKKwl9CisJY2F0Y2goY29uc3Qgc3RkOjpleGNlcHRpb24mIGUpIHsKKwkJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKHNfZm9ybWF0X2lkLCAiJXMiLCBlLndoYXQoKSk7CisJfQorCisJcmV0dXJuIEJpdG1hcDsKK30gCmRpZmYgLS1naXQgYS9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL1BTRFBhcnNlci5oIGIvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9QU0RQYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWFiNTQyCi0tLSAvZGV2L251bGwKKysrIGIvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9QU0RQYXJzZXIuaApAQCAtMCwwICsxLDI3MSBAQAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gUGhvdG9zaG9wIExvYWRlcgorLy8KKy8vIERlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gYnkKKy8vIC0gSGVydsOpIERyb2xvbiAoZHJvbG9uQGluZm9uaWUuZnIpCisvLyAtIE1paGFpbCBOYXlkZW5vdiAobW5heWRlbm92QHVzZXJzLnNvdXJjZWZvcmdlLm5ldCkKKy8vCisvLyBCYXNlZCBvbiBMR1BMIGNvZGUgY3JlYXRlZCBhbmQgcHVibGlzaGVkIGJ5IGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvZWx5bngvCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRnJlZUltYWdlIDMKKy8vCisvLyBDT1ZFUkVEIENPREUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkKKy8vIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTCisvLyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy8vIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVECisvLyBDT0RFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UCisvLyBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWQorLy8gU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTAorLy8gUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUgorLy8gVEhJUyBESVNDTEFJTUVSLgorLy8KKy8vIFVzZSBhdCB5b3VyIG93biByaXNrIQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaWZuZGVmIFBTRFBBUlNFUl9ICisjZGVmaW5lIFBTRFBBUlNFUl9ICisKKy8qKgorVGFibGUgMi0xMjogRmlsZSBoZWFkZXIgc2VjdGlvbi4gCitUaGUgZmlsZSBoZWFkZXIgY29udGFpbnMgdGhlIGJhc2ljIHByb3BlcnRpZXMgb2YgdGhlIGltYWdlLiAKKyovCit0eXBlZGVmIHN0cnVjdCBwc2RIZWFkZXIgeworCUJZVEUgU2lnbmF0dXJlWzRdOwkvLyEgQWx3YXlzIGVxdWFsIDhCUFMsIGRvIG5vdCB0cnkgdG8gcmVhZCB0aGUgZmlsZSBpZiB0aGUgc2lnbmF0dXJlIGRvZXMgbm90IG1hdGNoIHRoaXMgdmFsdWUuCisJQllURSBWZXJzaW9uWzJdOwkvLyEgQWx3YXlzIGVxdWFsIDEsIGRvIG5vdCByZWFkIGZpbGUgaWYgdGhlIHZlcnNpb24gZG9lcyBub3QgbWF0Y2ggdGhpcyB2YWx1ZS4KKwljaGFyIFJlc2VydmVkWzZdOwkvLyEgTXVzdCBiZSB6ZXJvLgorCUJZVEUgQ2hhbm5lbHNbMl07CS8vISBOdW1iZXIgb2YgY2hhbm5lbHMgaW5jbHVkaW5nIGFueSBhbHBoYSBjaGFubmVscywgc3VwcG9ydGVkIHJhbmdlIGlzIDEgdG8gMjQuCisJQllURSBSb3dzWzRdOwkJLy8hIFRoZSBoZWlnaHQgb2YgdGhlIGltYWdlIGluIHBpeGVscy4gU3VwcG9ydGVkIHJhbmdlIGlzIDEgdG8gMzAsMDAwLgorCUJZVEUgQ29sdW1uc1s0XTsJLy8hIFRoZSB3aWR0aCBvZiB0aGUgaW1hZ2UgaW4gcGl4ZWxzLiBTdXBwb3J0ZWQgcmFuZ2UgaXMgMSB0byAzMCwwMDAuCisJQllURSBEZXB0aFsyXTsJCS8vISBUaGUgbnVtYmVyIG9mIGJpdHMgcGVyIGNoYW5uZWwuIFN1cHBvcnRlZCB2YWx1ZXMgYXJlIDEsIDgsIGFuZCAxNi4KKwlCWVRFIE1vZGVbMl07CQkvLyEgQ29sb3VyIG1vZGUgb2YgdGhlIGZpbGUsIEJpdG1hcD0wLCBHcmF5c2NhbGU9MSwgSW5kZXhlZD0yLCBSR0I9MywgQ01ZSz00LCBNdWx0aWNoYW5uZWw9NywgRHVvdG9uZT04LCBMYWI9OS4gCit9IHBzZEhlYWRlcjsKKworLyoqCitUYWJsZSAyLTEyOiBIZWFkZXJJbmZvIENvbG9yIHNwYWNlcworQHNlZSBwc2RIZWFkZXIKKyovCitjbGFzcyBwc2RIZWFkZXJJbmZvIHsKK3B1YmxpYzoKKwlzaG9ydCBfQ2hhbm5lbHM7CS8vISBOdW1lciBvZiBjaGFubmVscyBpbmNsdWRpbmcgYW55IGFscGhhIGNoYW5uZWxzLCBzdXBwb3J0ZWQgcmFuZ2UgaXMgMSB0byAyNC4KKwlpbnQgICBfSGVpZ2h0OwkJLy8hIFRoZSBoZWlnaHQgb2YgdGhlIGltYWdlIGluIHBpeGVscy4gU3VwcG9ydGVkIHJhbmdlIGlzIDEgdG8gMzAsMDAwLgorCWludCAgIF9XaWR0aDsJCS8vISBUaGUgd2lkdGggb2YgdGhlIGltYWdlIGluIHBpeGVscy4gU3VwcG9ydGVkIHJhbmdlIGlzIDEgdG8gMzAsMDAwLgorCXNob3J0IF9CaXRzUGVyQ2hhbm5lbDsvLyEgVGhlIG51bWJlciBvZiBiaXRzIHBlciBjaGFubmVsLiBTdXBwb3J0ZWQgdmFsdWVzIGFyZSAxLCA4LCBhbmQgMTYuCisJc2hvcnQgX0NvbG91ck1vZGU7CS8vISBDb2xvdXIgbW9kZSBvZiB0aGUgZmlsZSwgQml0bWFwPTAsIEdyYXlzY2FsZT0xLCBJbmRleGVkPTIsIFJHQj0zLCBDTVlLPTQsIE11bHRpY2hhbm5lbD03LCBEdW90b25lPTgsIExhYj05LiAKKworcHVibGljOgorCXBzZEhlYWRlckluZm8oKTsKKwl+cHNkSGVhZGVySW5mbygpOworCS8qKgorCUByZXR1cm4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQKKwkqLworCWJvb2wgUmVhZChGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUpOworfTsKKworLyoqCitUYWJsZSAyLTEzIENvbG9yIG1vZGUgZGF0YSBzZWN0aW9uCisKK09ubHkgaW5kZXhlZCBjb2xvciBhbmQgZHVvdG9uZSBoYXZlIGNvbG9yIG1vZGUgZGF0YS4gRm9yIGFsbCBvdGhlciBtb2RlcywKK3RoaXMgc2VjdGlvbiBpcyBqdXN0IDQgYnl0ZXM6IHRoZSBsZW5ndGggZmllbGQsIHdoaWNoIGlzIHNldCB0byB6ZXJvLgorRm9yIGluZGV4ZWQgY29sb3IgaW1hZ2VzLCB0aGUgbGVuZ3RoIHdpbGwgYmUgZXF1YWwgdG8gNzY4LCBhbmQgdGhlIGNvbG9yIGRhdGEKK3dpbGwgY29udGFpbiB0aGUgY29sb3IgdGFibGUgZm9yIHRoZSBpbWFnZSwgaW4gbm9uLWludGVybGVhdmVkIG9yZGVyLgorRm9yIGR1b3RvbmUgaW1hZ2VzLCB0aGUgY29sb3IgZGF0YSB3aWxsIGNvbnRhaW4gdGhlIGR1b3RvbmUgc3BlY2lmaWNhdGlvbiwKK3RoZSBmb3JtYXQgb2Ygd2hpY2ggaXMgbm90IGRvY3VtZW50ZWQuIE90aGVyIGFwcGxpY2F0aW9ucyB0aGF0IHJlYWQKK1Bob3Rvc2hvcCBmaWxlcyBjYW4gdHJlYXQgYSBkdW90b25lIGltYWdlIGFzIGEgZ3JheXNjYWxlIGltYWdlLCBhbmQganVzdAorcHJlc2VydmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBkdW90b25lIGluZm9ybWF0aW9uIHdoZW4gcmVhZGluZyBhbmQgd3JpdGluZwordGhlIGZpbGUuCisqLworY2xhc3MgcHNkQ29sb3VyTW9kZURhdGEgeworcHVibGljOgorCWludCBfTGVuZ3RoOwkJCS8vISBUaGUgbGVuZ3RoIG9mIHRoZSBmb2xsb3dpbmcgY29sb3IgZGF0YQorCUJZVEUgKiBfcGxDb2xvdXJEYXRhOwkvLyEgVGhlIGNvbG9yIGRhdGEKKworcHVibGljOgorCXBzZENvbG91ck1vZGVEYXRhKCk7CisJfnBzZENvbG91ck1vZGVEYXRhKCk7CisJLyoqCisJQHJldHVybiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZAorCSovCisJYm9vbCBSZWFkKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSk7CisJYm9vbCBGaWxsUGFsZXR0ZShGSUJJVE1BUCAqZGliKTsKK307CisKKy8qKgorVGFibGUgMi0xOiBJbWFnZSByZXNvdXJjZSBibG9jaworTkI6IFJlc291cmNlIGRhdGEgaXMgcGFkZGVkIHRvIG1ha2Ugc2l6ZSBldmVuCisqLworY2xhc3MgcHNkSW1hZ2VSZXNvdXJjZSB7CitwdWJsaWM6CisJaW50ICAgICBfTGVuZ3RoOworCWNoYXIgICAgX09TVHlwZVs0XTsJLy8hIFBob3Rvc2hvcCBhbHdheXMgdXNlcyBpdHMgc2lnbmF0dXJlLCA4QklNCisJc2hvcnQgICBfSUQ7CQkvLyEgVW5pcXVlIGlkZW50aWZpZXIuIEltYWdlIHJlc291cmNlIElEcyBvbiBwYWdlIDgKKwlCWVRFICogX3BsTmFtZTsJCS8vISBBIHBhc2NhbCBzdHJpbmcsIHBhZGRlZCB0byBtYWtlIHNpemUgZXZlbiAoYSBudWxsIG5hbWUgY29uc2lzdHMgb2YgdHdvIGJ5dGVzIG9mIDApCisJaW50ICAgICBfU2l6ZTsJCS8vISBBY3R1YWwgc2l6ZSBvZiByZXNvdXJjZSBkYXRhLiBUaGlzIGRvZXMgbm90IGluY2x1ZGUgdGhlIFR5cGUsIElELCBOYW1lIG9yIFNpemUgZmllbGRzLgorCitwdWJsaWM6CisJcHNkSW1hZ2VSZXNvdXJjZSgpOworCX5wc2RJbWFnZVJlc291cmNlKCk7CisJdm9pZCBSZXNldCgpOworfTsKKworLyoqCitUYWJsZSBBLTY6IFJlc29sdXRpb25JbmZvIHN0cnVjdHVyZQorVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlc29sdXRpb24gb2YgYW4gaW1hZ2UuIEl0IGlzCit3cml0dGVuIGFzIGFuIGltYWdlIHJlc291cmNlLiBTZWUgdGhlIERvY3VtZW50IGZpbGUgZm9ybWF0cyBjaGFwdGVyIGZvciBtb3JlCitkZXRhaWxzLgorKi8KK2NsYXNzIHBzZFJlc29sdXRpb25JbmZvIHsKK3B1YmxpYzoKKwlzaG9ydCBfd2lkdGhVbml0OwkvLyEgRGlzcGxheSB3aWR0aCBhcyAxPWluY2hlczsgMj1jbTsgMz1wb2ludHM7IDQ9cGljYXM7IDU9Y29sdW1ucy4KKwlzaG9ydCBfaGVpZ2h0VW5pdDsJLy8hIERpc3BsYXkgaGVpZ2h0IGFzIDE9aW5jaGVzOyAyPWNtOyAzPXBvaW50czsgND1waWNhczsgNT1jb2x1bW5zLgorCXNob3J0IF9oUmVzOwkJLy8hIEhvcml6b250YWwgcmVzb2x1dGlvbiBpbiBwaXhlbHMgcGVyIGluY2guCisJc2hvcnQgX3ZSZXM7CQkvLyEgVmVydGljYWwgcmVzb2x1dGlvbiBpbiBwaXhlbHMgcGVyIGluY2guCisJaW50IF9oUmVzVW5pdDsJCS8vISAxPWRpc3BsYXkgaG9yaXpvbnRhbCByZXNvbHV0aW9uIGluIHBpeGVscyBwZXIgaW5jaDsgMj1kaXNwbGF5IGhvcml6b250YWwgcmVzb2x1dGlvbiBpbiBwaXhlbHMgcGVyIGNtLgorCWludCBfdlJlc1VuaXQ7CQkvLyEgMT1kaXNwbGF5IHZlcnRpY2FsIHJlc29sdXRpb24gaW4gcGl4ZWxzIHBlciBpbmNoOyAyPWRpc3BsYXkgdmVydGljYWwgcmVzb2x1dGlvbiBpbiBwaXhlbHMgcGVyIGNtLgorCitwdWJsaWM6CisJcHNkUmVzb2x1dGlvbkluZm8oKTsKKwl+cHNkUmVzb2x1dGlvbkluZm8oKTsJCisJLyoqCisJQHJldHVybiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZAorCSovCisJaW50IFJlYWQoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlKTsKKwkvKioKKwlAcGFyYW0gcmVzX3ggW291dF0gWCByZXNvbHV0aW9uIGluIHBpeGVscy9tZXRlcgorCUBwYXJhbSByZXNfeSBbb3V0XSBZIHJlc29sdXRpb24gaW4gcGl4ZWxzL21ldGVyCisJKi8KKwl2b2lkIEdldFJlc29sdXRpb25JbmZvKHVuc2lnbmVkICZyZXNfeCwgdW5zaWduZWQgJnJlc195KTsKK307CisKKy8vIE9ic29sZXRlIC0gUGhvdG9zaG9wIDIuMAorY2xhc3MgcHNkUmVzb2x1dGlvbkluZm9fdjIgeworcHVibGljOgorCXNob3J0IF9DaGFubmVsczsKKwlzaG9ydCBfUm93czsKKwlzaG9ydCBfQ29sdW1uczsKKwlzaG9ydCBfRGVwdGg7CisJc2hvcnQgX01vZGU7CisJCitwdWJsaWM6CisJcHNkUmVzb2x1dGlvbkluZm9fdjIoKTsKKwl+cHNkUmVzb2x1dGlvbkluZm9fdjIoKTsKKwkvKioKKwlAcmV0dXJuIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkCisJKi8KKwlpbnQgUmVhZChGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUpOworfTsKKworLyoqCitUYWJsZSBBLTc6IERpc3BsYXlJbmZvIENvbG9yIHNwYWNlcworVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgZGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dCBlYWNoIGNoYW5uZWwuIEl0IGlzIHdyaXR0ZW4gYXMgYW4gaW1hZ2UgcmVzb3VyY2UuCisqLworY2xhc3MgcHNkRGlzcGxheUluZm8geworcHVibGljOgorCXNob3J0IF9Db2xvdXJTcGFjZTsKKwlzaG9ydCBfQ29sb3VyWzRdOworCXNob3J0IF9PcGFjaXR5OyAgLy8hIDAuLjEwMAorCUJZVEUgX0tpbmQ7ICAgICAvLyEgc2VsZWN0ZWQgPSAwLCBwcm90ZWN0ZWQgPSAxCisJQllURSBfcGFkZGluZzsgIC8vISBzaG91bGQgYmUgemVybworCQorcHVibGljOgorCXBzZERpc3BsYXlJbmZvKCk7CisJfnBzZERpc3BsYXlJbmZvKCk7CisJLyoqCisJQHJldHVybiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZAorCSovCisJaW50IFJlYWQoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlKTsKK307CisKKy8qKgorVGFibGUgMi01OiBUaHVtYm5haWwgcmVzb3VyY2UgaGVhZGVyCitBZG9iZSBQaG90b3Nob3AgNS4wIGFuZCBsYXRlciBzdG9yZXMgdGh1bWJuYWlsIGluZm9ybWF0aW9uIGZvciBwcmV2aWV3CitkaXNwbGF5IGluIGFuIGltYWdlIHJlc291cmNlIGJsb2NrLiBUaGVzZSByZXNvdXJjZSBibG9ja3MgY29uc2lzdCBvZiBhbiBpbml0aWFsCisyOCBieXRlIGhlYWRlciwgZm9sbG93ZWQgYnkgYSBKRklGIHRodW1ibmFpbCBpbiBSR0IgKHJlZCwgZ3JlZW4sIGJsdWUpIG9yZGVyCitmb3IgYm90aCBNYWNpbnRvc2ggYW5kIFdpbmRvd3MuIEFkb2JlIFBob3Rvc2hvcCA0LjAgc3RvcmVkIHRoZQordGh1bWJuYWlsIGluZm9ybWF0aW9uIGluIHRoZSBzYW1lIGZvcm1hdCBleGNlcHQgdGhlIGRhdGEgc2VjdGlvbiBpcyBCR1IKKyhibHVlLCBncmVlbiwgcmVkKS4gVGhlIEFkb2JlIFBob3Rvc2hvcCA0LjAgZm9ybWF0IGlzIGF0IHJlc291cmNlIElEIDEwMzMKK2FuZCB0aGUgQWRvYmUgUGhvdG9zaG9wIDUuMCBmb3JtYXQgaXMgYXQgcmVzb3VyY2UgSUQgMTAzNi4KKyovCitjbGFzcyBwc2RUaHVtYm5haWwgeworcHVibGljOgorCWludCBfRm9ybWF0OwkJCS8vISA9IDEgKGtKcGVnUkdCKS4gQWxzbyBzdXBwb3J0cyBrUmF3UkdCICgwKS4KKwlpbnQgX1dpZHRoOwkJCQkvLyEgV2lkdGggb2YgdGh1bWJuYWlsIGluIHBpeGVscy4KKwlpbnQgX0hlaWdodDsJCQkvLyEgSGVpZ2h0IG9mIHRodW1ibmFpbCBpbiBwaXhlbHMuCisJaW50IF9XaWR0aEJ5dGVzOwkJLy8hIFBhZGRlZCByb3cgYnl0ZXMgYXMgKHdpZHRoICogYml0c3BpeGVsICsgMzEpIC8gMzIgKiA0LgorCWludCBfU2l6ZTsJCQkJLy8hIFRvdGFsIHNpemUgYXMgd2lkdGhieXRlcyAqIGhlaWdodCAqIHBsYW5lcworCWludCBfQ29tcHJlc3NlZFNpemU7CS8vISBTaXplIGFmdGVyIGNvbXByZXNzaW9uLiBVc2VkIGZvciBjb25zaXN0ZW50Y3kgY2hlY2suIAorCXNob3J0IF9CaXRQZXJQaXhlbDsJCS8vISA9IDI0LiBCaXRzIHBlciBwaXhlbC4KKwlzaG9ydCBfUGxhbmVzOwkJCS8vISA9IDEuIE51bWJlciBvZiBwbGFuZXMuCisJRklCSVRNQVAgKiBfZGliOwkJLy8hIEpGSUYgZGF0YSBhcyB1bmNvbXByZXNzZWQgZGliLiBOb3RlOiBGb3IgcmVzb3VyY2UgSUQgMTAzMyB0aGUgZGF0YSBpcyBpbiBCR1IgZm9ybWF0LgorCQorcHVibGljOgorCXBzZFRodW1ibmFpbCgpOworCX5wc2RUaHVtYm5haWwoKTsKKwlGSUJJVE1BUCogZ2V0RGliKCkgeyByZXR1cm4gX2RpYjsgfQorCS8qKgorCUByZXR1cm4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQKKwkqLworCWludCBSZWFkKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSwgaW50IGlSZXNvdXJjZVNpemUsIGJvb2wgaXNCR1IpOworCitwcml2YXRlOgorCXBzZFRodW1ibmFpbChjb25zdCBwc2RUaHVtYm5haWwmKTsKKwlwc2RUaHVtYm5haWwmIG9wZXJhdG9yPShjb25zdCBwc2RUaHVtYm5haWwmKTsKK307CisKK2NsYXNzIHBzZElDQ1Byb2ZpbGUgeworcHVibGljOgorCWludCBfUHJvZmlsZVNpemU7CisJQllURSAqIF9Qcm9maWxlRGF0YTsKK3B1YmxpYzoKKwlwc2RJQ0NQcm9maWxlKCk7CisJfnBzZElDQ1Byb2ZpbGUoKTsKKwl2b2lkIGNsZWFyKCk7CisJLyoqCisJQHJldHVybiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZAorCSovCisJaW50IFJlYWQoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBpbnQgc2l6ZSk7Cit9OworCisvKioKK1BTRCBsb2FkZXIKKyovCitjbGFzcyBwc2RQYXJzZXIgeworcHJpdmF0ZToKKwlwc2RIZWFkZXJJbmZvCQkJX2hlYWRlckluZm87CisJcHNkQ29sb3VyTW9kZURhdGEJCV9jb2xvdXJNb2RlRGF0YTsKKwlwc2RSZXNvbHV0aW9uSW5mbwkJX3Jlc29sdXRpb25JbmZvOworCXBzZFJlc29sdXRpb25JbmZvX3YyCV9yZXNvbHV0aW9uSW5mb192MjsKKwlwc2REaXNwbGF5SW5mbwkJCV9kaXNwbGF5SW5mbzsKKwlwc2RUaHVtYm5haWwJCQlfdGh1bWJuYWlsOworCXBzZElDQ1Byb2ZpbGUJCQlfaWNjUHJvZmlsZTsKKworCXNob3J0IF9Db2xvdXJDb3VudDsKKwlzaG9ydCBfVHJhbnNwYXJlbnRJbmRleDsKKwlpbnQgX0dsb2JhbEFuZ2xlOworCWJvb2wgX2JSZXNvbHV0aW9uSW5mb0ZpbGxlZDsKKwlib29sIF9iUmVzb2x1dGlvbkluZm9GaWxsZWRfdjI7CisJYm9vbCBfYkRpc3BsYXlJbmZvRmlsbGVkOworCWJvb2wgX2JUaHVtYm5haWxGaWxsZWQ7CisJYm9vbCBfYkNvcHlyaWdodDsKKworCWludCBfZmlfZmxhZ3M7CisJaW50IF9maV9mb3JtYXRfaWQ7CisJCitwcml2YXRlOgorCS8qKglBY3R1YWxseSBpZ25vcmUgaXQgKi8KKwlib29sIFJlYWRMYXllckFuZE1hc2tJbmZvU2VjdGlvbihGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUpOworCUZJQklUTUFQKiBSZWFkSW1hZ2VEYXRhKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSk7CisKK3B1YmxpYzoKKwlwc2RQYXJzZXIoKTsKKwl+cHNkUGFyc2VyKCk7CisJRklCSVRNQVAqIExvYWQoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBpbnQgc19mb3JtYXRfaWQsIGludCBmbGFncz0wKTsKKwkvKiogQWxzbyB1c2VkIGJ5IHRoZSBUSUZGIHBsdWdpbiAqLworCWJvb2wgUmVhZEltYWdlUmVzb3VyY2VzKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSwgTE9ORyBsZW5ndGg9MCk7CisJLyoqIFVzZWQgYnkgdGhlIFRJRkYgcGx1Z2luICovCisJRklCSVRNQVAqIEdldFRodW1ibmFpbCgpIHsKKwkJcmV0dXJuIF90aHVtYm5haWwuZ2V0RGliKCk7CisJfQorfTsKKworI2VuZGlmIC8vIFBTRFBBUlNFUl9ICisKZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvUGl4ZWxBY2Nlc3MuY3BwIGIvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9QaXhlbEFjY2Vzcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU3MTRiMgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvUGl4ZWxBY2Nlc3MuY3BwCkBAIC0wLDAgKzEsMTk3IEBACisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBQaXhlbCBhY2Nlc3MgZnVuY3Rpb25zCisvLworLy8gRGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBieQorLy8gLSBGbG9yaXMgdmFuIGRlbiBCZXJnIChmbHZkYmVyZ0B3eHMubmwpCisvLyAtIEhlcnbpIERyb2xvbiAoZHJvbG9uQGluZm9uaWUuZnIpCisvLyAtIFJ5YW4gUnVibGV5IChyeWFuQGxvc3RyZWFsaXR5Lm9yZykKKy8vIC0gUmlsZXkgTWNOaWZmIChybWNuaWZmQG1hcmV4Z3JvdXAuY29tKQorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZyZWVJbWFnZSAzCisvLworLy8gQ09WRVJFRCBDT0RFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZCisvLyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUworLy8gVEhBVCBUSEUgQ09WRVJFRCBDT0RFIElTIEZSRUUgT0YgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisvLyBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRAorLy8gQ09ERSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVAorLy8gVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GIEFOWSBORUNFU1NBUlkKKy8vIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwKKy8vIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIKKy8vIFRISVMgRElTQ0xBSU1FUi4KKy8vCisvLyBVc2UgYXQgeW91ciBvd24gcmlzayEKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2luY2x1ZGUgIkZyZWVJbWFnZS5oIgorI2luY2x1ZGUgIlV0aWxpdGllcy5oIgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0JZVEUgKiBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9HZXRTY2FuTGluZShGSUJJVE1BUCAqZGliLCBpbnQgc2NhbmxpbmUpIHsKKwlpZighRnJlZUltYWdlX0hhc1BpeGVscyhkaWIpKSB7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gQ2FsY3VsYXRlU2NhbkxpbmUoRnJlZUltYWdlX0dldEJpdHMoZGliKSwgRnJlZUltYWdlX0dldFBpdGNoKGRpYiksIHNjYW5saW5lKTsKK30KKworQk9PTCBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9HZXRQaXhlbEluZGV4KEZJQklUTUFQICpkaWIsIHVuc2lnbmVkIHgsIHVuc2lnbmVkIHksIEJZVEUgKnZhbHVlKSB7CisJQllURSBzaGlmdDsKKworCWlmKCFGcmVlSW1hZ2VfSGFzUGl4ZWxzKGRpYikgfHwgKEZyZWVJbWFnZV9HZXRJbWFnZVR5cGUoZGliKSAhPSBGSVRfQklUTUFQKSkKKwkJcmV0dXJuIEZBTFNFOworCisJaWYoKHggPCBGcmVlSW1hZ2VfR2V0V2lkdGgoZGliKSkgJiYgKHkgPCBGcmVlSW1hZ2VfR2V0SGVpZ2h0KGRpYikpKSB7CisJCUJZVEUgKmJpdHMgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCB5KTsKKworCQlzd2l0Y2goRnJlZUltYWdlX0dldEJQUChkaWIpKSB7CisJCQljYXNlIDE6CisJCQkJKnZhbHVlID0gKGJpdHNbeCA+PiAzXSAmICgweDgwID4+ICh4ICYgMHgwNykpKSAhPSAwOworCQkJCWJyZWFrOworCQkJY2FzZSA0OgorCQkJCXNoaWZ0ID0gKEJZVEUpKCgxIC0geCAlIDIpIDw8IDIpOworCQkJCSp2YWx1ZSA9IChiaXRzW3ggPj4gMV0gJiAoMHgwRiA8PCBzaGlmdCkpID4+IHNoaWZ0OworCQkJCWJyZWFrOworCQkJY2FzZSA4OgorCQkJCSp2YWx1ZSA9IGJpdHNbeF07CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXJldHVybiBGQUxTRTsKKwkJfQorCisJCXJldHVybiBUUlVFOworCX0KKworCXJldHVybiBGQUxTRTsKK30KKworQk9PTCBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9HZXRQaXhlbENvbG9yKEZJQklUTUFQICpkaWIsIHVuc2lnbmVkIHgsIHVuc2lnbmVkIHksIFJHQlFVQUQgKnZhbHVlKSB7CisJaWYoIUZyZWVJbWFnZV9IYXNQaXhlbHMoZGliKSB8fCAoRnJlZUltYWdlX0dldEltYWdlVHlwZShkaWIpICE9IEZJVF9CSVRNQVApKQorCQlyZXR1cm4gRkFMU0U7CisKKwlpZigoeCA8IEZyZWVJbWFnZV9HZXRXaWR0aChkaWIpKSAmJiAoeSA8IEZyZWVJbWFnZV9HZXRIZWlnaHQoZGliKSkpIHsKKwkJQllURSAqYml0cyA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIHkpOworCisJCXN3aXRjaChGcmVlSW1hZ2VfR2V0QlBQKGRpYikpIHsKKwkJCWNhc2UgMTY6CisJCQl7CisJCQkJYml0cyArPSAyKng7CisJCQkJV09SRCAqcGl4ZWwgPSAoV09SRCAqKWJpdHM7CisJCQkJaWYoKEZyZWVJbWFnZV9HZXRSZWRNYXNrKGRpYikgPT0gRkkxNl81NjVfUkVEX01BU0spICYmIChGcmVlSW1hZ2VfR2V0R3JlZW5NYXNrKGRpYikgPT0gRkkxNl81NjVfR1JFRU5fTUFTSykgJiYgKEZyZWVJbWFnZV9HZXRCbHVlTWFzayhkaWIpID09IEZJMTZfNTY1X0JMVUVfTUFTSykpIHsKKwkJCQkJdmFsdWUtPnJnYkJsdWUJCT0gKEJZVEUpKCgoKCpwaXhlbCAmIEZJMTZfNTY1X0JMVUVfTUFTSykgPj4gRkkxNl81NjVfQkxVRV9TSElGVCkgKiAweEZGKSAvIDB4MUYpOworCQkJCQl2YWx1ZS0+cmdiR3JlZW4JCT0gKEJZVEUpKCgoKCpwaXhlbCAmIEZJMTZfNTY1X0dSRUVOX01BU0spID4+IEZJMTZfNTY1X0dSRUVOX1NISUZUKSAqIDB4RkYpIC8gMHgzRik7CisJCQkJCXZhbHVlLT5yZ2JSZWQJCT0gKEJZVEUpKCgoKCpwaXhlbCAmIEZJMTZfNTY1X1JFRF9NQVNLKSA+PiBGSTE2XzU2NV9SRURfU0hJRlQpICogMHhGRikgLyAweDFGKTsKKwkJCQkJdmFsdWUtPnJnYlJlc2VydmVkCT0gMDsKKwkJCQl9IGVsc2UgeworCQkJCQl2YWx1ZS0+cmdiQmx1ZQkJPSAoQllURSkoKCgoKnBpeGVsICYgRkkxNl81NTVfQkxVRV9NQVNLKSA+PiBGSTE2XzU1NV9CTFVFX1NISUZUKSAqIDB4RkYpIC8gMHgxRik7CisJCQkJCXZhbHVlLT5yZ2JHcmVlbgkJPSAoQllURSkoKCgoKnBpeGVsICYgRkkxNl81NTVfR1JFRU5fTUFTSykgPj4gRkkxNl81NTVfR1JFRU5fU0hJRlQpICogMHhGRikgLyAweDFGKTsKKwkJCQkJdmFsdWUtPnJnYlJlZAkJPSAoQllURSkoKCgoKnBpeGVsICYgRkkxNl81NTVfUkVEX01BU0spID4+IEZJMTZfNTU1X1JFRF9TSElGVCkgKiAweEZGKSAvIDB4MUYpOworCQkJCQl2YWx1ZS0+cmdiUmVzZXJ2ZWQJPSAwOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgMjQ6CisJCQkJYml0cyArPSAzKng7CisJCQkJdmFsdWUtPnJnYkJsdWUJCT0gYml0c1tGSV9SR0JBX0JMVUVdOwkvLyBCCisJCQkJdmFsdWUtPnJnYkdyZWVuCQk9IGJpdHNbRklfUkdCQV9HUkVFTl07CS8vIEcKKwkJCQl2YWx1ZS0+cmdiUmVkCQk9IGJpdHNbRklfUkdCQV9SRURdOwkvLyBSCisJCQkJdmFsdWUtPnJnYlJlc2VydmVkCT0gMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzI6CisJCQkJYml0cyArPSA0Kng7CisJCQkJdmFsdWUtPnJnYkJsdWUJCT0gYml0c1tGSV9SR0JBX0JMVUVdOwkvLyBCCisJCQkJdmFsdWUtPnJnYkdyZWVuCQk9IGJpdHNbRklfUkdCQV9HUkVFTl07CS8vIEcKKwkJCQl2YWx1ZS0+cmdiUmVkCQk9IGJpdHNbRklfUkdCQV9SRURdOwkvLyBSCisJCQkJdmFsdWUtPnJnYlJlc2VydmVkCT0gYml0c1tGSV9SR0JBX0FMUEhBXTsJLy8gQQorCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gRkFMU0U7CisJCX0KKworCQlyZXR1cm4gVFJVRTsKKwl9CisKKwlyZXR1cm4gRkFMU0U7Cit9CisKK0JPT0wgRExMX0NBTExDT05WCitGcmVlSW1hZ2VfU2V0UGl4ZWxJbmRleChGSUJJVE1BUCAqZGliLCB1bnNpZ25lZCB4LCB1bnNpZ25lZCB5LCBCWVRFICp2YWx1ZSkgeworCUJZVEUgc2hpZnQ7CisKKwlpZighRnJlZUltYWdlX0hhc1BpeGVscyhkaWIpIHx8IChGcmVlSW1hZ2VfR2V0SW1hZ2VUeXBlKGRpYikgIT0gRklUX0JJVE1BUCkpCisJCXJldHVybiBGQUxTRTsKKworCWlmKCh4IDwgRnJlZUltYWdlX0dldFdpZHRoKGRpYikpICYmICh5IDwgRnJlZUltYWdlX0dldEhlaWdodChkaWIpKSkgeworCQlCWVRFICpiaXRzID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgeSk7CisKKwkJc3dpdGNoKEZyZWVJbWFnZV9HZXRCUFAoZGliKSkgeworCQkJY2FzZSAxOgorCQkJCSp2YWx1ZSA/IGJpdHNbeCA+PiAzXSB8PSAoMHg4MCA+PiAoeCAmIDB4NykpIDogYml0c1t4ID4+IDNdICY9ICgweEZGN0YgPj4gKHggJiAweDcpKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgNDoKKwkJCQlzaGlmdCA9IChCWVRFKSgoMSAtIHggJSAyKSA8PCAyKTsKKwkJCQliaXRzW3ggPj4gMV0gJj0gfigweDBGIDw8IHNoaWZ0KTsKKwkJCQliaXRzW3ggPj4gMV0gfD0gKCgqdmFsdWUgJiAweDBGKSA8PCBzaGlmdCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDg6CisJCQkJYml0c1t4XSA9ICp2YWx1ZTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIEZBTFNFOworCQl9CisKKwkJcmV0dXJuIFRSVUU7CisJfQorCisJcmV0dXJuIEZBTFNFOworfQorCitCT09MIERMTF9DQUxMQ09OVgorRnJlZUltYWdlX1NldFBpeGVsQ29sb3IoRklCSVRNQVAgKmRpYiwgdW5zaWduZWQgeCwgdW5zaWduZWQgeSwgUkdCUVVBRCAqdmFsdWUpIHsKKwlpZighRnJlZUltYWdlX0hhc1BpeGVscyhkaWIpIHx8IChGcmVlSW1hZ2VfR2V0SW1hZ2VUeXBlKGRpYikgIT0gRklUX0JJVE1BUCkpCisJCXJldHVybiBGQUxTRTsKKworCWlmKCh4IDwgRnJlZUltYWdlX0dldFdpZHRoKGRpYikpICYmICh5IDwgRnJlZUltYWdlX0dldEhlaWdodChkaWIpKSkgeworCQlCWVRFICpiaXRzID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgeSk7CisKKwkJc3dpdGNoKEZyZWVJbWFnZV9HZXRCUFAoZGliKSkgeworCQkJY2FzZSAxNjoKKwkJCXsKKwkJCQliaXRzICs9IDIqeDsKKwkJCQlXT1JEICpwaXhlbCA9IChXT1JEICopYml0czsKKwkJCQlpZigoRnJlZUltYWdlX0dldFJlZE1hc2soZGliKSA9PSBGSTE2XzU2NV9SRURfTUFTSykgJiYgKEZyZWVJbWFnZV9HZXRHcmVlbk1hc2soZGliKSA9PSBGSTE2XzU2NV9HUkVFTl9NQVNLKSAmJiAoRnJlZUltYWdlX0dldEJsdWVNYXNrKGRpYikgPT0gRkkxNl81NjVfQkxVRV9NQVNLKSkgeworCQkJCQkqcGl4ZWwgPSAoKHZhbHVlLT5yZ2JCbHVlID4+IDMpIDw8IEZJMTZfNTY1X0JMVUVfU0hJRlQpIHwKKwkJCQkJCSgodmFsdWUtPnJnYkdyZWVuID4+IDIpIDw8IEZJMTZfNTY1X0dSRUVOX1NISUZUKSB8CisJCQkJCQkoKHZhbHVlLT5yZ2JSZWQgPj4gMykgPDwgRkkxNl81NjVfUkVEX1NISUZUKTsKKwkJCQl9IGVsc2UgeworCQkJCQkqcGl4ZWwgPSAoKHZhbHVlLT5yZ2JCbHVlID4+IDMpIDw8IEZJMTZfNTU1X0JMVUVfU0hJRlQpIHwKKwkJCQkJCSgodmFsdWUtPnJnYkdyZWVuID4+IDMpIDw8IEZJMTZfNTU1X0dSRUVOX1NISUZUKSB8CisJCQkJCQkoKHZhbHVlLT5yZ2JSZWQgPj4gMykgPDwgRkkxNl81NTVfUkVEX1NISUZUKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlIDI0OgorCQkJCWJpdHMgKz0gMyp4OworCQkJCWJpdHNbRklfUkdCQV9CTFVFXQk9IHZhbHVlLT5yZ2JCbHVlOwkvLyBCCisJCQkJYml0c1tGSV9SR0JBX0dSRUVOXSA9IHZhbHVlLT5yZ2JHcmVlbjsJLy8gRworCQkJCWJpdHNbRklfUkdCQV9SRURdCT0gdmFsdWUtPnJnYlJlZDsJLy8gUgorCQkJCWJyZWFrOworCQkJY2FzZSAzMjoKKwkJCQliaXRzICs9IDQqeDsKKwkJCQliaXRzW0ZJX1JHQkFfQkxVRV0JPSB2YWx1ZS0+cmdiQmx1ZTsJCS8vIEIKKwkJCQliaXRzW0ZJX1JHQkFfR1JFRU5dID0gdmFsdWUtPnJnYkdyZWVuOwkJLy8gRworCQkJCWJpdHNbRklfUkdCQV9SRURdCT0gdmFsdWUtPnJnYlJlZDsJCS8vIFIKKwkJCQliaXRzW0ZJX1JHQkFfQUxQSEFdID0gdmFsdWUtPnJnYlJlc2VydmVkOwkvLyBBCisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXJldHVybiBGQUxTRTsKKwkJfQorCisJCXJldHVybiBUUlVFOworCX0KKworCXJldHVybiBGQUxTRTsKK30KKwpkaWZmIC0tZ2l0IGEvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9QbHVnaW4uY3BwIGIvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9QbHVnaW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMmQwNzIKLS0tIC9kZXYvbnVsbAorKysgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL1BsdWdpbi5jcHAKQEAgLTAsMCArMSw4MTggQEAKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRnJlZUltYWdlIFBsdWdpbiBJbnRlcmZhY2UKKy8vCisvLyBEZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIGJ5CisvLyAtIEZsb3JpcyB2YW4gZGVuIEJlcmcgKGZsb3Jpc0BnZWVraHEubmwpCisvLyAtIFJ1aSBMb3BlcyAocnVpZ2xvcGVzQHlhaG9vLmNvbSkKKy8vIC0gRGV0bGV2IFZlbmR0IChkZXRsZXYudmVuZHRAYnJpbGxpdC5kZSkKKy8vIC0gUGV0ciBQeXRlbGthIChweXRhQGxpZ2h0Y29tcC5jb20pCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRnJlZUltYWdlIDMKKy8vCisvLyBDT1ZFUkVEIENPREUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkKKy8vIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTCisvLyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy8vIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVECisvLyBDT0RFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UCisvLyBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWQorLy8gU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTAorLy8gUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUgorLy8gVEhJUyBESVNDTEFJTUVSLgorLy8KKy8vIFVzZSBhdCB5b3VyIG93biByaXNrIQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpZmRlZiBfTVNDX1ZFUiAKKyNwcmFnbWEgd2FybmluZyAoZGlzYWJsZSA6IDQ3ODYpIC8vIGlkZW50aWZpZXIgd2FzIHRydW5jYXRlZCB0byAnbnVtYmVyJyBjaGFyYWN0ZXJzCisjZW5kaWYKKworI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDxpby5oPgorI2Vsc2UKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2VuZGlmIC8vIF9XSU4zMgorCisjaW5jbHVkZSAiRnJlZUltYWdlLmgiCisjaW5jbHVkZSAiVXRpbGl0aWVzLmgiCisjaW5jbHVkZSAiRnJlZUltYWdlSU8uaCIKKyNpbmNsdWRlICJQbHVnaW4uaCIKKworI2luY2x1ZGUgIi4uL01ldGFkYXRhL0ZyZWVJbWFnZVRhZy5oIgorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBQbHVnaW4gc2VhcmNoIGxpc3QKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjb25zdCBjaGFyICoKK3Nfc2VhcmNoX2xpc3RbXSA9IHsKKwkiIiwKKwkicGx1Z2luc1xcIiwKK307CisKK3N0YXRpYyBpbnQgc19zZWFyY2hfbGlzdF9zaXplID0gc2l6ZW9mKHNfc2VhcmNoX2xpc3QpIC8gc2l6ZW9mKGNoYXIgKik7CitzdGF0aWMgUGx1Z2luTGlzdCAqc19wbHVnaW5zID0gTlVMTDsKK3N0YXRpYyBpbnQgc19wbHVnaW5fcmVmZXJlbmNlX2NvdW50ID0gMDsKKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFJlaW1wbGVtZW50YXRpb24gb2Ygc3RyaWNtcCAoaXQgaXMgbm90IHN1cHBvcnRlZCBvbiBzb21lIHN5c3RlbXMpCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworaW50CitGcmVlSW1hZ2Vfc3RyaWNtcChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIpIHsKKwlpbnQgYzEsIGMyOworCisJZG8geworCQljMSA9IHRvbG93ZXIoKnMxKyspOworCQljMiA9IHRvbG93ZXIoKnMyKyspOworCX0gd2hpbGUgKGMxICYmIGMxID09IGMyKTsKKworCXJldHVybiBjMSAtIGMyOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBJbXBsZW1lbnRhdGlvbiBvZiBQbHVnaW5MaXN0CisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUGx1Z2luTGlzdDo6UGx1Z2luTGlzdCgpIDoKK21fcGx1Z2luX21hcCgpLAorbV9ub2RlX2NvdW50KDApIHsKK30KKworRlJFRV9JTUFHRV9GT1JNQVQKK1BsdWdpbkxpc3Q6OkFkZE5vZGUoRklfSW5pdFByb2MgaW5pdF9wcm9jLCB2b2lkICppbnN0YW5jZSwgY29uc3QgY2hhciAqZm9ybWF0LCBjb25zdCBjaGFyICpkZXNjcmlwdGlvbiwgY29uc3QgY2hhciAqZXh0ZW5zaW9uLCBjb25zdCBjaGFyICpyZWdleHByKSB7CisJaWYgKGluaXRfcHJvYyAhPSBOVUxMKSB7CisJCVBsdWdpbk5vZGUgKm5vZGUgPSBuZXcoc3RkOjpub3Rocm93KSBQbHVnaW5Ob2RlOworCQlQbHVnaW4gKnBsdWdpbiA9IG5ldyhzdGQ6Om5vdGhyb3cpIFBsdWdpbjsKKwkJaWYoIW5vZGUgfHwgIXBsdWdpbikgeworCQkJaWYobm9kZSkgZGVsZXRlIG5vZGU7CisJCQlpZihwbHVnaW4pIGRlbGV0ZSBwbHVnaW47CisJCQlGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2MoRklGX1VOS05PV04sIEZJX01TR19FUlJPUl9NRU1PUlkpOworCQkJcmV0dXJuIEZJRl9VTktOT1dOOworCQl9CisKKwkJbWVtc2V0KHBsdWdpbiwgMCwgc2l6ZW9mKFBsdWdpbikpOworCisJCS8vIGZpbGwtaW4gdGhlIHBsdWdpbiBzdHJ1Y3R1cmUKKwkJLy8gbm90ZSB3ZSBoYXZlIG1lbXNldCB0byAwLCBzbyBhbGwgdW5zZXQgcG9pbnRlcnMgc2hvdWxkIGJlIE5VTEwpCisKKwkJaW5pdF9wcm9jKHBsdWdpbiwgKGludCltX3BsdWdpbl9tYXAuc2l6ZSgpKTsKKworCQkvLyBnZXQgdGhlIGZvcm1hdCBzdHJpbmcgKHR3byBwb3NzaWJsZSB3YXlzKQorCisJCWNvbnN0IGNoYXIgKnRoZV9mb3JtYXQgPSBOVUxMOworCisJCWlmIChmb3JtYXQgIT0gTlVMTCkgeworCQkJdGhlX2Zvcm1hdCA9IGZvcm1hdDsKKwkJfSBlbHNlIGlmIChwbHVnaW4tPmZvcm1hdF9wcm9jICE9IE5VTEwpIHsKKwkJCXRoZV9mb3JtYXQgPSBwbHVnaW4tPmZvcm1hdF9wcm9jKCk7CisJCX0KKworCQkvLyBhZGQgdGhlIG5vZGUgaWYgaXQgd2Fzbid0IHRoZXJlIGFscmVhZHkKKworCQlpZiAodGhlX2Zvcm1hdCAhPSBOVUxMKSB7CisJCQlub2RlLT5tX2lkID0gKGludCltX3BsdWdpbl9tYXAuc2l6ZSgpOworCQkJbm9kZS0+bV9pbnN0YW5jZSA9IGluc3RhbmNlOworCQkJbm9kZS0+bV9wbHVnaW4gPSBwbHVnaW47CisJCQlub2RlLT5tX2Zvcm1hdCA9IGZvcm1hdDsKKwkJCW5vZGUtPm1fZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKwkJCW5vZGUtPm1fZXh0ZW5zaW9uID0gZXh0ZW5zaW9uOworCQkJbm9kZS0+bV9yZWdleHByID0gcmVnZXhwcjsKKwkJCW5vZGUtPm1fZW5hYmxlZCA9IFRSVUU7CisKKwkJCW1fcGx1Z2luX21hcFsoY29uc3QgaW50KW1fcGx1Z2luX21hcC5zaXplKCldID0gbm9kZTsKKworCQkJcmV0dXJuIChGUkVFX0lNQUdFX0ZPUk1BVClub2RlLT5tX2lkOworCQl9CisKKwkJLy8gc29tZXRoaW5nIHdlbnQgd3Jvbmcgd2hpbGUgYWxsb2NhdGluZyB0aGUgcGx1Z2luLi4uIGNsZWFudXAKKworCQlkZWxldGUgcGx1Z2luOworCQlkZWxldGUgbm9kZTsKKwl9CisKKwlyZXR1cm4gRklGX1VOS05PV047Cit9CisKK1BsdWdpbk5vZGUgKgorUGx1Z2luTGlzdDo6RmluZE5vZGVGcm9tRm9ybWF0KGNvbnN0IGNoYXIgKmZvcm1hdCkgeworCWZvciAobWFwPGludCwgUGx1Z2luTm9kZSAqPjo6aXRlcmF0b3IgaSA9IG1fcGx1Z2luX21hcC5iZWdpbigpOyBpICE9IG1fcGx1Z2luX21hcC5lbmQoKTsgKytpKSB7CisJCWNvbnN0IGNoYXIgKnRoZV9mb3JtYXQgPSAoKCppKS5zZWNvbmQtPm1fZm9ybWF0ICE9IE5VTEwpID8gKCppKS5zZWNvbmQtPm1fZm9ybWF0IDogKCppKS5zZWNvbmQtPm1fcGx1Z2luLT5mb3JtYXRfcHJvYygpOworCisJCWlmICgoKmkpLnNlY29uZC0+bV9lbmFibGVkKSB7CisJCQlpZiAoRnJlZUltYWdlX3N0cmljbXAodGhlX2Zvcm1hdCwgZm9ybWF0KSA9PSAwKSB7CisJCQkJcmV0dXJuICgqaSkuc2Vjb25kOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK1BsdWdpbk5vZGUgKgorUGx1Z2luTGlzdDo6RmluZE5vZGVGcm9tTWltZShjb25zdCBjaGFyICptaW1lKSB7CisJZm9yIChtYXA8aW50LCBQbHVnaW5Ob2RlICo+OjppdGVyYXRvciBpID0gbV9wbHVnaW5fbWFwLmJlZ2luKCk7IGkgIT0gbV9wbHVnaW5fbWFwLmVuZCgpOyArK2kpIHsKKwkJY29uc3QgY2hhciAqdGhlX21pbWUgPSAoKCppKS5zZWNvbmQtPm1fcGx1Z2luLT5taW1lX3Byb2MgIT0gTlVMTCkgPyAoKmkpLnNlY29uZC0+bV9wbHVnaW4tPm1pbWVfcHJvYygpIDogIiI7CisKKwkJaWYgKCgqaSkuc2Vjb25kLT5tX2VuYWJsZWQpIHsKKwkJCWlmICgodGhlX21pbWUgIT0gTlVMTCkgJiYgKHN0cmNtcCh0aGVfbWltZSwgbWltZSkgPT0gMCkpIHsKKwkJCQlyZXR1cm4gKCppKS5zZWNvbmQ7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworUGx1Z2luTm9kZSAqCitQbHVnaW5MaXN0OjpGaW5kTm9kZUZyb21GSUYoaW50IG5vZGVfaWQpIHsKKwltYXA8aW50LCBQbHVnaW5Ob2RlICo+OjppdGVyYXRvciBpID0gbV9wbHVnaW5fbWFwLmZpbmQobm9kZV9pZCk7CisKKwlpZiAoaSAhPSBtX3BsdWdpbl9tYXAuZW5kKCkpIHsKKwkJcmV0dXJuICgqaSkuc2Vjb25kOworCX0KKworCXJldHVybiBOVUxMOworfQorCitpbnQKK1BsdWdpbkxpc3Q6OlNpemUoKSBjb25zdCB7CisJcmV0dXJuIChpbnQpbV9wbHVnaW5fbWFwLnNpemUoKTsKK30KKworQk9PTAorUGx1Z2luTGlzdDo6SXNFbXB0eSgpIGNvbnN0IHsKKwlyZXR1cm4gbV9wbHVnaW5fbWFwLmVtcHR5KCk7Cit9CisKK1BsdWdpbkxpc3Q6On5QbHVnaW5MaXN0KCkgeworCWZvciAobWFwPGludCwgUGx1Z2luTm9kZSAqPjo6aXRlcmF0b3IgaSA9IG1fcGx1Z2luX21hcC5iZWdpbigpOyBpICE9IG1fcGx1Z2luX21hcC5lbmQoKTsgKytpKSB7CisjaWZkZWYgX1dJTjMyCisJCWlmICgoKmkpLnNlY29uZC0+bV9pbnN0YW5jZSAhPSBOVUxMKSB7CisJCQlGcmVlTGlicmFyeSgoSElOU1RBTkNFKSgqaSkuc2Vjb25kLT5tX2luc3RhbmNlKTsKKwkJfQorI2VuZGlmCisJCWRlbGV0ZSAoKmkpLnNlY29uZC0+bV9wbHVnaW47CisJCWRlbGV0ZSAoKCppKS5zZWNvbmQpOworCX0KK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBSZXRyaWV2ZSBhIHBvaW50ZXIgdG8gdGhlIHBsdWdpbiBsaXN0IGNvbnRhaW5lcgorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1BsdWdpbkxpc3QgKiBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9HZXRQbHVnaW5MaXN0KCkgeworCXJldHVybiBzX3BsdWdpbnM7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gUGx1Z2luIFN5c3RlbSBJbml0aWFsaXphdGlvbgorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3ZvaWQgRExMX0NBTExDT05WCitGcmVlSW1hZ2VfSW5pdGlhbGlzZShCT09MIGxvYWRfbG9jYWxfcGx1Z2luc19vbmx5KSB7CisJaWYgKHNfcGx1Z2luX3JlZmVyZW5jZV9jb3VudCsrID09IDApIHsKKwkJCisJCS8qCisJCU5vdGU6IGluaXRpYWxpemUgYWxsIHNpbmdsZXRvbnMgaGVyZSAKKwkJaW4gb3JkZXIgdG8gYXZvaWQgcmFjZSBjb25kaXRpb25zIHdpdGggbXVsdGktdGhyZWFkaW5nCisJCSovCisKKwkJLy8gaW5pdGlhbGlzZSB0aGUgVGFnTGliIHNpbmdsZXRvbgorCQlUYWdMaWImIHMgPSBUYWdMaWI6Omluc3RhbmNlKCk7CisKKwkJLy8gaW50ZXJuYWwgcGx1Z2luIGluaXRpYWxpemF0aW9uCisKKwkJc19wbHVnaW5zID0gbmV3KHN0ZDo6bm90aHJvdykgUGx1Z2luTGlzdDsKKworCQlpZiAoc19wbHVnaW5zKSB7CisJCQkvKiBOT1RFIDogCisJCQlUaGUgb3JkZXIgdXNlZCB0byBpbml0aWFsaXplIGludGVybmFsIHBsdWdpbnMgYmVsb3cgTVVTVCBCRSB0aGUgc2FtZSBvcmRlciAKKwkJCWFzIHRoZSBvbmUgdXNlZCB0byBkZWZpbmUgdGhlIEZSRUVfSU1BR0VfRk9STUFUIGVudW0uIAorCQkJKi8KKwkJCXNfcGx1Z2lucy0+QWRkTm9kZShJbml0Qk1QKTsKKwkJCXNfcGx1Z2lucy0+QWRkTm9kZShJbml0SUNPKTsKKwkJCXNfcGx1Z2lucy0+QWRkTm9kZShJbml0SlBFRyk7CisJCQlzX3BsdWdpbnMtPkFkZE5vZGUoSW5pdEpORyk7CisJCQlzX3BsdWdpbnMtPkFkZE5vZGUoSW5pdEtPQUxBKTsKKwkJCXNfcGx1Z2lucy0+QWRkTm9kZShJbml0SUZGKTsKKwkJCXNfcGx1Z2lucy0+QWRkTm9kZShJbml0TU5HKTsKKwkJCXNfcGx1Z2lucy0+QWRkTm9kZShJbml0UE5NLCBOVUxMLCAiUEJNIiwgIlBvcnRhYmxlIEJpdG1hcCAoQVNDSUkpIiwgInBibSIsICJeUDEiKTsKKwkJCXNfcGx1Z2lucy0+QWRkTm9kZShJbml0UE5NLCBOVUxMLCAiUEJNUkFXIiwgIlBvcnRhYmxlIEJpdG1hcCAoUkFXKSIsICJwYm0iLCAiXlA0Iik7CisJCQlzX3BsdWdpbnMtPkFkZE5vZGUoSW5pdFBDRCk7CisJCQlzX3BsdWdpbnMtPkFkZE5vZGUoSW5pdFBDWCk7CisJCQlzX3BsdWdpbnMtPkFkZE5vZGUoSW5pdFBOTSwgTlVMTCwgIlBHTSIsICJQb3J0YWJsZSBHcmV5bWFwIChBU0NJSSkiLCAicGdtIiwgIl5QMiIpOworCQkJc19wbHVnaW5zLT5BZGROb2RlKEluaXRQTk0sIE5VTEwsICJQR01SQVciLCAiUG9ydGFibGUgR3JleW1hcCAoUkFXKSIsICJwZ20iLCAiXlA1Iik7CisJCQlzX3BsdWdpbnMtPkFkZE5vZGUoSW5pdFBORyk7CisJCQlzX3BsdWdpbnMtPkFkZE5vZGUoSW5pdFBOTSwgTlVMTCwgIlBQTSIsICJQb3J0YWJsZSBQaXhlbG1hcCAoQVNDSUkpIiwgInBwbSIsICJeUDMiKTsKKwkJCXNfcGx1Z2lucy0+QWRkTm9kZShJbml0UE5NLCBOVUxMLCAiUFBNUkFXIiwgIlBvcnRhYmxlIFBpeGVsbWFwIChSQVcpIiwgInBwbSIsICJeUDYiKTsKKwkJCXNfcGx1Z2lucy0+QWRkTm9kZShJbml0UkFTKTsKKwkJCXNfcGx1Z2lucy0+QWRkTm9kZShJbml0VEFSR0EpOworCQkJc19wbHVnaW5zLT5BZGROb2RlKEluaXRUSUZGKTsKKwkJCXNfcGx1Z2lucy0+QWRkTm9kZShJbml0V0JNUCk7CisJCQlzX3BsdWdpbnMtPkFkZE5vZGUoSW5pdFBTRCk7CisJCQlzX3BsdWdpbnMtPkFkZE5vZGUoSW5pdENVVCk7CisJCQlzX3BsdWdpbnMtPkFkZE5vZGUoSW5pdFhCTSk7CisJCQlzX3BsdWdpbnMtPkFkZE5vZGUoSW5pdFhQTSk7CisJCQlzX3BsdWdpbnMtPkFkZE5vZGUoSW5pdEREUyk7CisJICAgICAgICBzX3BsdWdpbnMtPkFkZE5vZGUoSW5pdEdJRik7CisJICAgICAgICBzX3BsdWdpbnMtPkFkZE5vZGUoSW5pdEhEUik7CisJCQlzX3BsdWdpbnMtPkFkZE5vZGUoSW5pdEczKTsKKwkJCXNfcGx1Z2lucy0+QWRkTm9kZShJbml0U0dJKTsKKwkJCXNfcGx1Z2lucy0+QWRkTm9kZShJbml0RVhSKTsKKwkJCXNfcGx1Z2lucy0+QWRkTm9kZShJbml0SjJLKTsKKwkJCXNfcGx1Z2lucy0+QWRkTm9kZShJbml0SlAyKTsKKwkJCXNfcGx1Z2lucy0+QWRkTm9kZShJbml0UEZNKTsKKwkJCXNfcGx1Z2lucy0+QWRkTm9kZShJbml0UElDVCk7CisgICAgICAgICAgc19wbHVnaW5zLT5BZGROb2RlKEluaXRXRUJQKTsKKwkJCQorCQkJLy8gZXh0ZXJuYWwgcGx1Z2luIGluaXRpYWxpemF0aW9uCisKKyNpZmRlZiBfV0lOMzIKKwkJCWlmICghbG9hZF9sb2NhbF9wbHVnaW5zX29ubHkpIHsKKwkJCQlpbnQgY291bnQgPSAwOworCQkJCWNoYXIgYnVmZmVyW01BWF9QQVRIICsgMjAwXTsKKwkJCQl3Y2hhcl90IGN1cnJlbnRfZGlyWzIgKiBfTUFYX1BBVEhdLCBtb2R1bGVbMiAqIF9NQVhfUEFUSF07CisJCQkJQk9PTCBiT2sgPSBGQUxTRTsKKworCQkJCS8vIHN0b3JlIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4gdGhlbiBzZXQgdGhlIGRpcmVjdG9yeSB0byB0aGUgYXBwbGljYXRpb24gbG9jYXRpb24KKworCQkJCWlmIChHZXRDdXJyZW50RGlyZWN0b3J5VygyICogX01BWF9QQVRILCBjdXJyZW50X2RpcikgIT0gMCkgeworCQkJCQlpZiAoR2V0TW9kdWxlRmlsZU5hbWVXKE5VTEwsIG1vZHVsZSwgMiAqIF9NQVhfUEFUSCkgIT0gMCkgeworCQkJCQkJd2NoYXJfdCAqbGFzdF9wb2ludCA9IHdjc3JjaHIobW9kdWxlLCBMJ1xcJyk7CisKKwkJCQkJCWlmIChsYXN0X3BvaW50KSB7CisJCQkJCQkJKmxhc3RfcG9pbnQgPSBMJ1wwJzsKKworCQkJCQkJCWJPayA9IFNldEN1cnJlbnREaXJlY3RvcnlXKG1vZHVsZSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisKKwkJCQkvLyBzZWFyY2ggZm9yIHBsdWdpbnMKKworCQkJCXdoaWxlIChjb3VudCA8IHNfc2VhcmNoX2xpc3Rfc2l6ZSkgeworCQkJCQlfZmluZGRhdGFfdCBmaW5kX2RhdGE7CisJCQkJCWxvbmcgZmluZF9oYW5kbGU7CisKKwkJCQkJc3RyY3B5KGJ1ZmZlciwgc19zZWFyY2hfbGlzdFtjb3VudF0pOworCQkJCQlzdHJjYXQoYnVmZmVyLCAiKi5maXAiKTsKKworCQkJCQlpZiAoKGZpbmRfaGFuZGxlID0gKGxvbmcpX2ZpbmRmaXJzdChidWZmZXIsICZmaW5kX2RhdGEpKSAhPSAtMUwpIHsKKwkJCQkJCWRvIHsKKwkJCQkJCQlzdHJjcHkoYnVmZmVyLCBzX3NlYXJjaF9saXN0W2NvdW50XSk7CisJCQkJCQkJc3RybmNhdChidWZmZXIsIGZpbmRfZGF0YS5uYW1lLCBNQVhfUEFUSCArIDIwMCk7CisKKwkJCQkJCQlISU5TVEFOQ0UgaW5zdGFuY2UgPSBMb2FkTGlicmFyeShidWZmZXIpOworCisJCQkJCQkJaWYgKGluc3RhbmNlICE9IE5VTEwpIHsKKwkJCQkJCQkJRkFSUFJPQyBwcm9jX2FkZHJlc3MgPSBHZXRQcm9jQWRkcmVzcyhpbnN0YW5jZSwgIl9Jbml0QDgiKTsKKworCQkJCQkJCQlpZiAocHJvY19hZGRyZXNzICE9IE5VTEwpIHsKKwkJCQkJCQkJCXNfcGx1Z2lucy0+QWRkTm9kZSgoRklfSW5pdFByb2MpcHJvY19hZGRyZXNzLCAodm9pZCAqKWluc3RhbmNlKTsKKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCUZyZWVMaWJyYXJ5KGluc3RhbmNlKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0gd2hpbGUgKF9maW5kbmV4dChmaW5kX2hhbmRsZSwgJmZpbmRfZGF0YSkgIT0gLTFMKTsKKworCQkJCQkJX2ZpbmRjbG9zZShmaW5kX2hhbmRsZSk7CisJCQkJCX0KKworCQkJCQljb3VudCsrOworCQkJCX0KKworCQkJCS8vIHJlc3RvcmUgdGhlIGN1cnJlbnQgZGlyZWN0b3J5CisKKwkJCQlpZiAoYk9rKSB7CisJCQkJCVNldEN1cnJlbnREaXJlY3RvcnlXKGN1cnJlbnRfZGlyKTsKKwkJCQl9CisJCQl9CisjZW5kaWYgLy8gX1dJTjMyCisJCX0KKwl9Cit9CisKK3ZvaWQgRExMX0NBTExDT05WCitGcmVlSW1hZ2VfRGVJbml0aWFsaXNlKCkgeworCS0tc19wbHVnaW5fcmVmZXJlbmNlX2NvdW50OworCisJaWYgKHNfcGx1Z2luX3JlZmVyZW5jZV9jb3VudCA9PSAwKSB7CisJCWRlbGV0ZSBzX3BsdWdpbnM7CisJfQorfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIE9wZW4gYW5kIGNsb3NlIGEgYml0bWFwCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwordm9pZCAqIERMTF9DQUxMQ09OVgorRnJlZUltYWdlX09wZW4oUGx1Z2luTm9kZSAqbm9kZSwgRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBCT09MIG9wZW5fZm9yX3JlYWRpbmcpIHsKKwlpZiAobm9kZS0+bV9wbHVnaW4tPm9wZW5fcHJvYyAhPSBOVUxMKSB7CisgICAgICAgcmV0dXJuIG5vZGUtPm1fcGx1Z2luLT5vcGVuX3Byb2MoaW8sIGhhbmRsZSwgb3Blbl9mb3JfcmVhZGluZyk7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgRExMX0NBTExDT05WCitGcmVlSW1hZ2VfQ2xvc2UoUGx1Z2luTm9kZSAqbm9kZSwgRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCB2b2lkICpkYXRhKSB7CisJaWYgKG5vZGUtPm1fcGx1Z2luLT5jbG9zZV9wcm9jICE9IE5VTEwpIHsKKwkJbm9kZS0+bV9wbHVnaW4tPmNsb3NlX3Byb2MoaW8sIGhhbmRsZSwgZGF0YSk7CisJfQorfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFBsdWdpbiBTeXN0ZW0gTG9hZC9TYXZlIEZ1bmN0aW9ucworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0ZJQklUTUFQICogRExMX0NBTExDT05WCitGcmVlSW1hZ2VfTG9hZEZyb21IYW5kbGUoRlJFRV9JTUFHRV9GT1JNQVQgZmlmLCBGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIGludCBmbGFncykgeworCWlmICgoZmlmID49IDApICYmIChmaWYgPCBGcmVlSW1hZ2VfR2V0RklGQ291bnQoKSkpIHsKKwkJUGx1Z2luTm9kZSAqbm9kZSA9IHNfcGx1Z2lucy0+RmluZE5vZGVGcm9tRklGKGZpZik7CisJCQorCQlpZiAobm9kZSAhPSBOVUxMKSB7CisJCQlpZihub2RlLT5tX3BsdWdpbi0+bG9hZF9wcm9jICE9IE5VTEwpIHsKKwkJCQl2b2lkICpkYXRhID0gRnJlZUltYWdlX09wZW4obm9kZSwgaW8sIGhhbmRsZSwgVFJVRSk7CisJCQkJCQorCQkJCUZJQklUTUFQICpiaXRtYXAgPSBub2RlLT5tX3BsdWdpbi0+bG9hZF9wcm9jKGlvLCBoYW5kbGUsIC0xLCBmbGFncywgZGF0YSk7CisJCQkJCQorCQkJCUZyZWVJbWFnZV9DbG9zZShub2RlLCBpbywgaGFuZGxlLCBkYXRhKTsKKwkJCQkJCisJCQkJcmV0dXJuIGJpdG1hcDsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBOVUxMOworfQorCitGSUJJVE1BUCAqIERMTF9DQUxMQ09OVgorRnJlZUltYWdlX0xvYWQoRlJFRV9JTUFHRV9GT1JNQVQgZmlmLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGZsYWdzKSB7CisJRnJlZUltYWdlSU8gaW87CisJU2V0RGVmYXVsdElPKCZpbyk7CisJCisJRklMRSAqaGFuZGxlID0gZm9wZW4oZmlsZW5hbWUsICJyYiIpOworCisJaWYgKGhhbmRsZSkgeworCQlGSUJJVE1BUCAqYml0bWFwID0gRnJlZUltYWdlX0xvYWRGcm9tSGFuZGxlKGZpZiwgJmlvLCAoZmlfaGFuZGxlKWhhbmRsZSwgZmxhZ3MpOworCisJCWZjbG9zZShoYW5kbGUpOworCisJCXJldHVybiBiaXRtYXA7CisJfSBlbHNlIHsKKwkJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKChpbnQpZmlmLCAiRnJlZUltYWdlX0xvYWQ6IGZhaWxlZCB0byBvcGVuIGZpbGUgJXMiLCBmaWxlbmFtZSk7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK0ZJQklUTUFQICogRExMX0NBTExDT05WCitGcmVlSW1hZ2VfTG9hZFUoRlJFRV9JTUFHRV9GT1JNQVQgZmlmLCBjb25zdCB3Y2hhcl90ICpmaWxlbmFtZSwgaW50IGZsYWdzKSB7CisJRnJlZUltYWdlSU8gaW87CisJU2V0RGVmYXVsdElPKCZpbyk7CisjaWZkZWYgX1dJTjMyCQorCUZJTEUgKmhhbmRsZSA9IF93Zm9wZW4oZmlsZW5hbWUsIEwicmIiKTsKKworCWlmIChoYW5kbGUpIHsKKwkJRklCSVRNQVAgKmJpdG1hcCA9IEZyZWVJbWFnZV9Mb2FkRnJvbUhhbmRsZShmaWYsICZpbywgKGZpX2hhbmRsZSloYW5kbGUsIGZsYWdzKTsKKworCQlmY2xvc2UoaGFuZGxlKTsKKworCQlyZXR1cm4gYml0bWFwOworCX0gZWxzZSB7CisJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYygoaW50KWZpZiwgIkZyZWVJbWFnZV9Mb2FkVTogZmFpbGVkIHRvIG9wZW4gaW5wdXQgZmlsZSIpOworCX0KKyNlbmRpZgorCXJldHVybiBOVUxMOworfQorCitCT09MIERMTF9DQUxMQ09OVgorRnJlZUltYWdlX1NhdmVUb0hhbmRsZShGUkVFX0lNQUdFX0ZPUk1BVCBmaWYsIEZJQklUTUFQICpkaWIsIEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSwgaW50IGZsYWdzKSB7CisJLy8gY2Fubm90IHNhdmUgImhlYWRlciBvbmx5IiBmb3JtYXRzCisJaWYoRnJlZUltYWdlX0hhc1BpeGVscyhkaWIpID09IEZBTFNFKSB7CisJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYygoaW50KWZpZiwgIkZyZWVJbWFnZV9TYXZlVG9IYW5kbGU6IGNhbm5vdCBzYXZlIFwiaGVhZGVyIG9ubHlcIiBmb3JtYXRzIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlpZiAoKGZpZiA+PSAwKSAmJiAoZmlmIDwgRnJlZUltYWdlX0dldEZJRkNvdW50KCkpKSB7CisJCVBsdWdpbk5vZGUgKm5vZGUgPSBzX3BsdWdpbnMtPkZpbmROb2RlRnJvbUZJRihmaWYpOworCQkKKwkJaWYgKG5vZGUpIHsKKwkJCWlmKG5vZGUtPm1fcGx1Z2luLT5zYXZlX3Byb2MgIT0gTlVMTCkgeworCQkJCXZvaWQgKmRhdGEgPSBGcmVlSW1hZ2VfT3Blbihub2RlLCBpbywgaGFuZGxlLCBGQUxTRSk7CisJCQkJCQorCQkJCUJPT0wgcmVzdWx0ID0gbm9kZS0+bV9wbHVnaW4tPnNhdmVfcHJvYyhpbywgZGliLCBoYW5kbGUsIC0xLCBmbGFncywgZGF0YSk7CisJCQkJCQorCQkJCUZyZWVJbWFnZV9DbG9zZShub2RlLCBpbywgaGFuZGxlLCBkYXRhKTsKKwkJCQkJCisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBGQUxTRTsKK30KKworCitCT09MIERMTF9DQUxMQ09OVgorRnJlZUltYWdlX1NhdmUoRlJFRV9JTUFHRV9GT1JNQVQgZmlmLCBGSUJJVE1BUCAqZGliLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGZsYWdzKSB7CisJRnJlZUltYWdlSU8gaW87CisJU2V0RGVmYXVsdElPKCZpbyk7CisJCisJRklMRSAqaGFuZGxlID0gZm9wZW4oZmlsZW5hbWUsICJ3K2IiKTsKKwkKKwlpZiAoaGFuZGxlKSB7CisJCUJPT0wgc3VjY2VzcyA9IEZyZWVJbWFnZV9TYXZlVG9IYW5kbGUoZmlmLCBkaWIsICZpbywgKGZpX2hhbmRsZSloYW5kbGUsIGZsYWdzKTsKKworCQlmY2xvc2UoaGFuZGxlKTsKKworCQlyZXR1cm4gc3VjY2VzczsKKwl9IGVsc2UgeworCQlGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2MoKGludClmaWYsICJGcmVlSW1hZ2VfU2F2ZTogZmFpbGVkIHRvIG9wZW4gZmlsZSAlcyIsIGZpbGVuYW1lKTsKKwl9CisKKwlyZXR1cm4gRkFMU0U7Cit9CisKK0JPT0wgRExMX0NBTExDT05WCitGcmVlSW1hZ2VfU2F2ZVUoRlJFRV9JTUFHRV9GT1JNQVQgZmlmLCBGSUJJVE1BUCAqZGliLCBjb25zdCB3Y2hhcl90ICpmaWxlbmFtZSwgaW50IGZsYWdzKSB7CisJRnJlZUltYWdlSU8gaW87CisJU2V0RGVmYXVsdElPKCZpbyk7CisjaWZkZWYgX1dJTjMyCQorCUZJTEUgKmhhbmRsZSA9IF93Zm9wZW4oZmlsZW5hbWUsIEwidytiIik7CisJCisJaWYgKGhhbmRsZSkgeworCQlCT09MIHN1Y2Nlc3MgPSBGcmVlSW1hZ2VfU2F2ZVRvSGFuZGxlKGZpZiwgZGliLCAmaW8sIChmaV9oYW5kbGUpaGFuZGxlLCBmbGFncyk7CisKKwkJZmNsb3NlKGhhbmRsZSk7CisKKwkJcmV0dXJuIHN1Y2Nlc3M7CisJfSBlbHNlIHsKKwkJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKChpbnQpZmlmLCAiRnJlZUltYWdlX1NhdmVVOiBmYWlsZWQgdG8gb3BlbiBvdXRwdXQgZmlsZSIpOworCX0KKyNlbmRpZgorCXJldHVybiBGQUxTRTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBQbHVnaW4gY29uc3RydWN0aW9uICsgZW5hYmxlL2Rpc2FibGUgZnVuY3Rpb25zCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworRlJFRV9JTUFHRV9GT1JNQVQgRExMX0NBTExDT05WCitGcmVlSW1hZ2VfUmVnaXN0ZXJMb2NhbFBsdWdpbihGSV9Jbml0UHJvYyBwcm9jX2FkZHJlc3MsIGNvbnN0IGNoYXIgKmZvcm1hdCwgY29uc3QgY2hhciAqZGVzY3JpcHRpb24sIGNvbnN0IGNoYXIgKmV4dGVuc2lvbiwgY29uc3QgY2hhciAqcmVnZXhwcikgeworCXJldHVybiBzX3BsdWdpbnMtPkFkZE5vZGUocHJvY19hZGRyZXNzLCBOVUxMLCBmb3JtYXQsIGRlc2NyaXB0aW9uLCBleHRlbnNpb24sIHJlZ2V4cHIpOworfQorCisjaWZkZWYgX1dJTjMyCitGUkVFX0lNQUdFX0ZPUk1BVCBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9SZWdpc3RlckV4dGVybmFsUGx1Z2luKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKmZvcm1hdCwgY29uc3QgY2hhciAqZGVzY3JpcHRpb24sIGNvbnN0IGNoYXIgKmV4dGVuc2lvbiwgY29uc3QgY2hhciAqcmVnZXhwcikgeworCWlmIChwYXRoICE9IE5VTEwpIHsKKwkJSElOU1RBTkNFIGluc3RhbmNlID0gTG9hZExpYnJhcnkocGF0aCk7CisKKwkJaWYgKGluc3RhbmNlICE9IE5VTEwpIHsKKwkJCUZBUlBST0MgcHJvY19hZGRyZXNzID0gR2V0UHJvY0FkZHJlc3MoaW5zdGFuY2UsICJfSW5pdEA4Iik7CisKKwkJCUZSRUVfSU1BR0VfRk9STUFUIHJlc3VsdCA9IHNfcGx1Z2lucy0+QWRkTm9kZSgoRklfSW5pdFByb2MpcHJvY19hZGRyZXNzLCAodm9pZCAqKWluc3RhbmNlLCBmb3JtYXQsIGRlc2NyaXB0aW9uLCBleHRlbnNpb24sIHJlZ2V4cHIpOworCisJCQlpZiAocmVzdWx0ID09IEZJRl9VTktOT1dOKQorCQkJCUZyZWVMaWJyYXJ5KGluc3RhbmNlKTsKKworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCX0KKworCXJldHVybiBGSUZfVU5LTk9XTjsKK30KKyNlbmRpZiAvLyBfV0lOMzIKKworaW50IERMTF9DQUxMQ09OVgorRnJlZUltYWdlX1NldFBsdWdpbkVuYWJsZWQoRlJFRV9JTUFHRV9GT1JNQVQgZmlmLCBCT09MIGVuYWJsZSkgeworCWlmIChzX3BsdWdpbnMgIT0gTlVMTCkgeworCQlQbHVnaW5Ob2RlICpub2RlID0gc19wbHVnaW5zLT5GaW5kTm9kZUZyb21GSUYoZmlmKTsKKworCQlpZiAobm9kZSAhPSBOVUxMKSB7CisJCQlCT09MIHByZXZpb3VzX3N0YXRlID0gbm9kZS0+bV9lbmFibGVkOworCisJCQlub2RlLT5tX2VuYWJsZWQgPSBlbmFibGU7CisKKwkJCXJldHVybiBwcmV2aW91c19zdGF0ZTsKKwkJfQorCX0KKworCXJldHVybiAtMTsKK30KKworaW50IERMTF9DQUxMQ09OVgorRnJlZUltYWdlX0lzUGx1Z2luRW5hYmxlZChGUkVFX0lNQUdFX0ZPUk1BVCBmaWYpIHsKKwlpZiAoc19wbHVnaW5zICE9IE5VTEwpIHsKKwkJUGx1Z2luTm9kZSAqbm9kZSA9IHNfcGx1Z2lucy0+RmluZE5vZGVGcm9tRklGKGZpZik7CisKKwkJcmV0dXJuIChub2RlICE9IE5VTEwpID8gbm9kZS0+bV9lbmFibGVkIDogRkFMU0U7CisJfQorCQorCXJldHVybiAtMTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBQbHVnaW4gQWNjZXNzIEZ1bmN0aW9ucworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2ludCBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9HZXRGSUZDb3VudCgpIHsKKwlyZXR1cm4gKHNfcGx1Z2lucyAhPSBOVUxMKSA/IHNfcGx1Z2lucy0+U2l6ZSgpIDogMDsKK30KKworRlJFRV9JTUFHRV9GT1JNQVQgRExMX0NBTExDT05WCitGcmVlSW1hZ2VfR2V0RklGRnJvbUZvcm1hdChjb25zdCBjaGFyICpmb3JtYXQpIHsKKwlpZiAoc19wbHVnaW5zICE9IE5VTEwpIHsKKwkJUGx1Z2luTm9kZSAqbm9kZSA9IHNfcGx1Z2lucy0+RmluZE5vZGVGcm9tRm9ybWF0KGZvcm1hdCk7CisKKwkJcmV0dXJuIChub2RlICE9IE5VTEwpID8gKEZSRUVfSU1BR0VfRk9STUFUKW5vZGUtPm1faWQgOiBGSUZfVU5LTk9XTjsKKwl9CisKKwlyZXR1cm4gRklGX1VOS05PV047Cit9CisKK0ZSRUVfSU1BR0VfRk9STUFUIERMTF9DQUxMQ09OVgorRnJlZUltYWdlX0dldEZJRkZyb21NaW1lKGNvbnN0IGNoYXIgKm1pbWUpIHsKKwlpZiAoc19wbHVnaW5zICE9IE5VTEwpIHsKKwkJUGx1Z2luTm9kZSAqbm9kZSA9IHNfcGx1Z2lucy0+RmluZE5vZGVGcm9tTWltZShtaW1lKTsKKworCQlyZXR1cm4gKG5vZGUgIT0gTlVMTCkgPyAoRlJFRV9JTUFHRV9GT1JNQVQpbm9kZS0+bV9pZCA6IEZJRl9VTktOT1dOOworCX0KKworCXJldHVybiBGSUZfVU5LTk9XTjsKK30KKworY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgorRnJlZUltYWdlX0dldEZvcm1hdEZyb21GSUYoRlJFRV9JTUFHRV9GT1JNQVQgZmlmKSB7CisJaWYgKHNfcGx1Z2lucyAhPSBOVUxMKSB7CisJCVBsdWdpbk5vZGUgKm5vZGUgPSBzX3BsdWdpbnMtPkZpbmROb2RlRnJvbUZJRihmaWYpOworCisJCXJldHVybiAobm9kZSAhPSBOVUxMKSA/IChub2RlLT5tX2Zvcm1hdCAhPSBOVUxMKSA/IG5vZGUtPm1fZm9ybWF0IDogbm9kZS0+bV9wbHVnaW4tPmZvcm1hdF9wcm9jKCkgOiBOVUxMOworCX0KKworCXJldHVybiBOVUxMOworfQorCitjb25zdCBjaGFyICogRExMX0NBTExDT05WIAorRnJlZUltYWdlX0dldEZJRk1pbWVUeXBlKEZSRUVfSU1BR0VfRk9STUFUIGZpZikgeworCWlmIChzX3BsdWdpbnMgIT0gTlVMTCkgeworCQlQbHVnaW5Ob2RlICpub2RlID0gc19wbHVnaW5zLT5GaW5kTm9kZUZyb21GSUYoZmlmKTsKKworCQlyZXR1cm4gKG5vZGUgIT0gTlVMTCkgPyAobm9kZS0+bV9wbHVnaW4gIT0gTlVMTCkgPyAoIG5vZGUtPm1fcGx1Z2luLT5taW1lX3Byb2MgIT0gTlVMTCApPyBub2RlLT5tX3BsdWdpbi0+bWltZV9wcm9jKCkgOiBOVUxMIDogTlVMTCA6IE5VTEw7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK2NvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9HZXRGSUZFeHRlbnNpb25MaXN0KEZSRUVfSU1BR0VfRk9STUFUIGZpZikgeworCWlmIChzX3BsdWdpbnMgIT0gTlVMTCkgeworCQlQbHVnaW5Ob2RlICpub2RlID0gc19wbHVnaW5zLT5GaW5kTm9kZUZyb21GSUYoZmlmKTsKKworCQlyZXR1cm4gKG5vZGUgIT0gTlVMTCkgPyAobm9kZS0+bV9leHRlbnNpb24gIT0gTlVMTCkgPyBub2RlLT5tX2V4dGVuc2lvbiA6IChub2RlLT5tX3BsdWdpbi0+ZXh0ZW5zaW9uX3Byb2MgIT0gTlVMTCkgPyBub2RlLT5tX3BsdWdpbi0+ZXh0ZW5zaW9uX3Byb2MoKSA6IE5VTEwgOiBOVUxMOworCX0KKworCXJldHVybiBOVUxMOworfQorCitjb25zdCBjaGFyICogRExMX0NBTExDT05WCitGcmVlSW1hZ2VfR2V0RklGRGVzY3JpcHRpb24oRlJFRV9JTUFHRV9GT1JNQVQgZmlmKSB7CisJaWYgKHNfcGx1Z2lucyAhPSBOVUxMKSB7CisJCVBsdWdpbk5vZGUgKm5vZGUgPSBzX3BsdWdpbnMtPkZpbmROb2RlRnJvbUZJRihmaWYpOworCisJCXJldHVybiAobm9kZSAhPSBOVUxMKSA/IChub2RlLT5tX2Rlc2NyaXB0aW9uICE9IE5VTEwpID8gbm9kZS0+bV9kZXNjcmlwdGlvbiA6IChub2RlLT5tX3BsdWdpbi0+ZGVzY3JpcHRpb25fcHJvYyAhPSBOVUxMKSA/IG5vZGUtPm1fcGx1Z2luLT5kZXNjcmlwdGlvbl9wcm9jKCkgOiBOVUxMIDogTlVMTDsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgorRnJlZUltYWdlX0dldEZJRlJlZ0V4cHIoRlJFRV9JTUFHRV9GT1JNQVQgZmlmKSB7CisJaWYgKHNfcGx1Z2lucyAhPSBOVUxMKSB7CisJCVBsdWdpbk5vZGUgKm5vZGUgPSBzX3BsdWdpbnMtPkZpbmROb2RlRnJvbUZJRihmaWYpOworCisJCXJldHVybiAobm9kZSAhPSBOVUxMKSA/IChub2RlLT5tX3JlZ2V4cHIgIT0gTlVMTCkgPyBub2RlLT5tX3JlZ2V4cHIgOiAobm9kZS0+bV9wbHVnaW4tPnJlZ2V4cHJfcHJvYyAhPSBOVUxMKSA/IG5vZGUtPm1fcGx1Z2luLT5yZWdleHByX3Byb2MoKSA6IE5VTEwgOiBOVUxMOworCX0KKworCXJldHVybiBOVUxMOworfQorCitCT09MIERMTF9DQUxMQ09OVgorRnJlZUltYWdlX0ZJRlN1cHBvcnRzUmVhZGluZyhGUkVFX0lNQUdFX0ZPUk1BVCBmaWYpIHsKKwlpZiAoc19wbHVnaW5zICE9IE5VTEwpIHsKKwkJUGx1Z2luTm9kZSAqbm9kZSA9IHNfcGx1Z2lucy0+RmluZE5vZGVGcm9tRklGKGZpZik7CisKKwkJcmV0dXJuIChub2RlICE9IE5VTEwpID8gbm9kZS0+bV9wbHVnaW4tPmxvYWRfcHJvYyAhPSBOVUxMIDogRkFMU0U7CisJfQorCisJcmV0dXJuIEZBTFNFOworfQorCitCT09MIERMTF9DQUxMQ09OVgorRnJlZUltYWdlX0ZJRlN1cHBvcnRzV3JpdGluZyhGUkVFX0lNQUdFX0ZPUk1BVCBmaWYpIHsKKwlpZiAoc19wbHVnaW5zICE9IE5VTEwpIHsKKwkJUGx1Z2luTm9kZSAqbm9kZSA9IHNfcGx1Z2lucy0+RmluZE5vZGVGcm9tRklGKGZpZik7CisKKwkJcmV0dXJuIChub2RlICE9IE5VTEwpID8gbm9kZS0+bV9wbHVnaW4tPnNhdmVfcHJvYyAhPSBOVUxMIDogRkFMU0UgOworCX0KKworCXJldHVybiBGQUxTRTsKK30KKworQk9PTCBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9GSUZTdXBwb3J0c0V4cG9ydEJQUChGUkVFX0lNQUdFX0ZPUk1BVCBmaWYsIGludCBkZXB0aCkgeworCWlmIChzX3BsdWdpbnMgIT0gTlVMTCkgeworCQlQbHVnaW5Ob2RlICpub2RlID0gc19wbHVnaW5zLT5GaW5kTm9kZUZyb21GSUYoZmlmKTsKKworCQlyZXR1cm4gKG5vZGUgIT0gTlVMTCkgPyAKKwkJCShub2RlLT5tX3BsdWdpbi0+c3VwcG9ydHNfZXhwb3J0X2JwcF9wcm9jICE9IE5VTEwpID8gCisJCQkJbm9kZS0+bV9wbHVnaW4tPnN1cHBvcnRzX2V4cG9ydF9icHBfcHJvYyhkZXB0aCkgOiBGQUxTRSA6IEZBTFNFOworCX0KKworCXJldHVybiBGQUxTRTsKK30KKworQk9PTCBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9GSUZTdXBwb3J0c0V4cG9ydFR5cGUoRlJFRV9JTUFHRV9GT1JNQVQgZmlmLCBGUkVFX0lNQUdFX1RZUEUgdHlwZSkgeworCWlmIChzX3BsdWdpbnMgIT0gTlVMTCkgeworCQlQbHVnaW5Ob2RlICpub2RlID0gc19wbHVnaW5zLT5GaW5kTm9kZUZyb21GSUYoZmlmKTsKKworCQlyZXR1cm4gKG5vZGUgIT0gTlVMTCkgPyAKKwkJCShub2RlLT5tX3BsdWdpbi0+c3VwcG9ydHNfZXhwb3J0X3R5cGVfcHJvYyAhPSBOVUxMKSA/IAorCQkJCW5vZGUtPm1fcGx1Z2luLT5zdXBwb3J0c19leHBvcnRfdHlwZV9wcm9jKHR5cGUpIDogRkFMU0UgOiBGQUxTRTsKKwl9CisKKwlyZXR1cm4gRkFMU0U7Cit9CisKK0JPT0wgRExMX0NBTExDT05WCitGcmVlSW1hZ2VfRklGU3VwcG9ydHNJQ0NQcm9maWxlcyhGUkVFX0lNQUdFX0ZPUk1BVCBmaWYpIHsKKwlpZiAoc19wbHVnaW5zICE9IE5VTEwpIHsKKwkJUGx1Z2luTm9kZSAqbm9kZSA9IHNfcGx1Z2lucy0+RmluZE5vZGVGcm9tRklGKGZpZik7CisKKwkJcmV0dXJuIChub2RlICE9IE5VTEwpID8gCisJCQkobm9kZS0+bV9wbHVnaW4tPnN1cHBvcnRzX2ljY19wcm9maWxlc19wcm9jICE9IE5VTEwpID8gCisJCQkJbm9kZS0+bV9wbHVnaW4tPnN1cHBvcnRzX2ljY19wcm9maWxlc19wcm9jKCkgOiBGQUxTRSA6IEZBTFNFOworCX0KKworCXJldHVybiBGQUxTRTsKK30KKworQk9PTCBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9GSUZTdXBwb3J0c05vUGl4ZWxzKEZSRUVfSU1BR0VfRk9STUFUIGZpZikgeworCWlmIChzX3BsdWdpbnMgIT0gTlVMTCkgeworCQlQbHVnaW5Ob2RlICpub2RlID0gc19wbHVnaW5zLT5GaW5kTm9kZUZyb21GSUYoZmlmKTsKKworCQlyZXR1cm4gKG5vZGUgIT0gTlVMTCkgPyAKKwkJCShub2RlLT5tX3BsdWdpbi0+c3VwcG9ydHNfbm9fcGl4ZWxzX3Byb2MgIT0gTlVMTCkgPyAKKwkJCQlub2RlLT5tX3BsdWdpbi0+c3VwcG9ydHNfbm9fcGl4ZWxzX3Byb2MoKSA6IEZBTFNFIDogRkFMU0U7CisJfQorCisJcmV0dXJuIEZBTFNFOworfQorCitGUkVFX0lNQUdFX0ZPUk1BVCBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9HZXRGSUZGcm9tRmlsZW5hbWUoY29uc3QgY2hhciAqZmlsZW5hbWUpIHsKKwlpZiAoZmlsZW5hbWUgIT0gTlVMTCkgeworCQljb25zdCBjaGFyICpleHRlbnNpb247CisKKwkJLy8gZ2V0IHRoZSBwcm9wZXIgZXh0ZW5zaW9uIGlmIHdlIHJlY2VpdmVkIGEgZmlsZW5hbWUKKworCQljaGFyICpwbGFjZSA9IHN0cnJjaHIoKGNoYXIgKilmaWxlbmFtZSwgJy4nKTsJCisJCWV4dGVuc2lvbiA9IChwbGFjZSAhPSBOVUxMKSA/ICsrcGxhY2UgOiBmaWxlbmFtZTsKKworCQkvLyBsb29rIGZvciB0aGUgZXh0ZW5zaW9uIGluIHRoZSBwbHVnaW4gdGFibGUKKworCQlmb3IgKGludCBpID0gMDsgaSA8IEZyZWVJbWFnZV9HZXRGSUZDb3VudCgpOyArK2kpIHsKKworCQkJaWYgKHNfcGx1Z2lucy0+RmluZE5vZGVGcm9tRklGKGkpLT5tX2VuYWJsZWQpIHsKKworCQkJCS8vIGNvbXBhcmUgdGhlIGZvcm1hdCBpZCB3aXRoIHRoZSBleHRlbnNpb24KKworCQkJCWlmIChGcmVlSW1hZ2Vfc3RyaWNtcChGcmVlSW1hZ2VfR2V0Rm9ybWF0RnJvbUZJRigoRlJFRV9JTUFHRV9GT1JNQVQpaSksIGV4dGVuc2lvbikgPT0gMCkgeworCQkJCQlyZXR1cm4gKEZSRUVfSU1BR0VfRk9STUFUKWk7CisJCQkJfSBlbHNlIHsKKwkJCQkJLy8gbWFrZSBhIGNvcHkgb2YgdGhlIGV4dGVuc2lvbiBsaXN0IGFuZCBzcGxpdCBpdAorCisJCQkJCWNoYXIgKmNvcHkgPSAoY2hhciAqKW1hbGxvYyhzdHJsZW4oRnJlZUltYWdlX0dldEZJRkV4dGVuc2lvbkxpc3QoKEZSRUVfSU1BR0VfRk9STUFUKWkpKSArIDEpOworCQkJCQltZW1zZXQoY29weSwgMCwgc3RybGVuKEZyZWVJbWFnZV9HZXRGSUZFeHRlbnNpb25MaXN0KChGUkVFX0lNQUdFX0ZPUk1BVClpKSkgKyAxKTsKKwkJCQkJbWVtY3B5KGNvcHksIEZyZWVJbWFnZV9HZXRGSUZFeHRlbnNpb25MaXN0KChGUkVFX0lNQUdFX0ZPUk1BVClpKSwgc3RybGVuKEZyZWVJbWFnZV9HZXRGSUZFeHRlbnNpb25MaXN0KChGUkVFX0lNQUdFX0ZPUk1BVClpKSkpOworCisJCQkJCS8vIGdldCB0aGUgZmlyc3QgdG9rZW4KKworCQkJCQljaGFyICp0b2tlbiA9IHN0cnRvayhjb3B5LCAiLCIpOworCisJCQkJCXdoaWxlICh0b2tlbiAhPSBOVUxMKSB7CisJCQkJCQlpZiAoRnJlZUltYWdlX3N0cmljbXAodG9rZW4sIGV4dGVuc2lvbikgPT0gMCkgeworCQkJCQkJCWZyZWUoY29weSk7CisKKwkJCQkJCQkJcmV0dXJuIChGUkVFX0lNQUdFX0ZPUk1BVClpOworCQkJCQkJfQorCisJCQkJCQl0b2tlbiA9IHN0cnRvayhOVUxMLCAiLCIpOworCQkJCQl9CisKKwkJCQkJLy8gZnJlZSB0aGUgY29weSBvZiB0aGUgZXh0ZW5zaW9uIGxpc3QKKworCQkJCQlmcmVlKGNvcHkpOworCQkJCX0JCisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gRklGX1VOS05PV047Cit9CisKK0ZSRUVfSU1BR0VfRk9STUFUIERMTF9DQUxMQ09OViAKK0ZyZWVJbWFnZV9HZXRGSUZGcm9tRmlsZW5hbWVVKGNvbnN0IHdjaGFyX3QgKmZpbGVuYW1lKSB7CisjaWZkZWYgX1dJTjMyCQorCWlmIChmaWxlbmFtZSA9PSBOVUxMKSByZXR1cm4gRklGX1VOS05PV047CisgICAgCQorCS8vIGdldCB0aGUgcHJvcGVyIGV4dGVuc2lvbiBpZiB3ZSByZWNlaXZlZCBhIGZpbGVuYW1lCisJd2NoYXJfdCAqcGxhY2UgPSB3Y3NyY2hyKCh3Y2hhcl90ICopZmlsZW5hbWUsICcuJyk7CQorCWlmIChwbGFjZSA9PSBOVUxMKSByZXR1cm4gRklGX1VOS05PV047CisJLy8gY29udmVydCB0byBzaW5nbGUgY2hhcmFjdGVyIC0gbm8gbmF0aW9uYWwgY2hhcnMgaW4gZXh0ZW5zaW9ucworCWNoYXIgKmV4dGVuc2lvbiA9IChjaGFyICopbWFsbG9jKHdjc2xlbihwbGFjZSkrMSk7CisJdW5zaWduZWQgaW50IGk9MDsKKwlmb3IoOyBpIDwgd2NzbGVuKHBsYWNlKTsgaSsrKSAvLyBjb252ZXJ0IDE2LWJpdCB0byA4LWJpdAorCQlleHRlbnNpb25baV0gPSAoY2hhcikocGxhY2VbaV0gJiAweDAwRkYpOworCS8vIHNldCB0ZXJtaW5hdGluZyAwCisJZXh0ZW5zaW9uW2ldPTA7CisJRlJFRV9JTUFHRV9GT1JNQVQgZlJldCA9IEZyZWVJbWFnZV9HZXRGSUZGcm9tRmlsZW5hbWUoZXh0ZW5zaW9uKTsKKwlmcmVlKGV4dGVuc2lvbik7CisKKwlyZXR1cm4gZlJldDsKKyNlbHNlCisJcmV0dXJuIEZJRl9VTktOT1dOOworI2VuZGlmIC8vIF9XSU4zMgorfQorCitCT09MIERMTF9DQUxMQ09OVgorRnJlZUltYWdlX1ZhbGlkYXRlKEZSRUVfSU1BR0VfRk9STUFUIGZpZiwgRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlKSB7CisJaWYgKHNfcGx1Z2lucyAhPSBOVUxMKSB7CisJCUJPT0wgdmFsaWRhdGVkID0gRkFMU0U7CisKKwkJUGx1Z2luTm9kZSAqbm9kZSA9IHNfcGx1Z2lucy0+RmluZE5vZGVGcm9tRklGKGZpZik7CisKKwkJaWYgKG5vZGUpIHsKKwkJCWxvbmcgdGVsbCA9IGlvLT50ZWxsX3Byb2MoaGFuZGxlKTsKKworCQkJdmFsaWRhdGVkID0gKG5vZGUgIT0gTlVMTCkgPyAobm9kZS0+bV9lbmFibGVkKSA/IChub2RlLT5tX3BsdWdpbi0+dmFsaWRhdGVfcHJvYyAhPSBOVUxMKSA/IG5vZGUtPm1fcGx1Z2luLT52YWxpZGF0ZV9wcm9jKGlvLCBoYW5kbGUpIDogRkFMU0UgOiBGQUxTRSA6IEZBTFNFOworCisJCQlpby0+c2Vla19wcm9jKGhhbmRsZSwgdGVsbCwgU0VFS19TRVQpOworCQl9CisKKwkJcmV0dXJuIHZhbGlkYXRlZDsKKwl9CisKKwlyZXR1cm4gRkFMU0U7Cit9CmRpZmYgLS1naXQgYS9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL1BsdWdpbkJNUC5jcHAgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL1BsdWdpbkJNUC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVlMWM1ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvUGx1Z2luQk1QLmNwcApAQCAtMCwwICsxLDE0OTQgQEAKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEJNUCBMb2FkZXIgYW5kIFdyaXRlcgorLy8KKy8vIERlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gYnkKKy8vIC0gRmxvcmlzIHZhbiBkZW4gQmVyZyAoZmx2ZGJlcmdAd3hzLm5sKQorLy8gLSBNYXJrdXMgTG9pYmwgKG1hcmt1cy5sb2libEBlcG9zdC5kZSkKKy8vIC0gTWFydGluIFdlYmVyIChtYXJ0d2ViQGdteC5uZXQpCisvLyAtIEhlcnbpIERyb2xvbiAoZHJvbG9uQGluZm9uaWUuZnIpCisvLyAtIE1pY2hhbCBOb3ZvdG55IChtaWNoYWxAZXRjLmN6KQorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZyZWVJbWFnZSAzCisvLworLy8gQ09WRVJFRCBDT0RFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZCisvLyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUworLy8gVEhBVCBUSEUgQ09WRVJFRCBDT0RFIElTIEZSRUUgT0YgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisvLyBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRAorLy8gQ09ERSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVAorLy8gVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GIEFOWSBORUNFU1NBUlkKKy8vIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwKKy8vIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIKKy8vIFRISVMgRElTQ0xBSU1FUi4KKy8vCisvLyBVc2UgYXQgeW91ciBvd24gcmlzayEKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2luY2x1ZGUgIkZyZWVJbWFnZS5oIgorI2luY2x1ZGUgIlV0aWxpdGllcy5oIgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgIENvbnN0YW50cyArIGhlYWRlcnMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGNvbnN0IEJZVEUgUkxFX0NPTU1BTkQgICAgID0gMDsKK3N0YXRpYyBjb25zdCBCWVRFIFJMRV9FTkRPRkxJTkUgICA9IDA7CitzdGF0aWMgY29uc3QgQllURSBSTEVfRU5ET0ZCSVRNQVAgPSAxOworc3RhdGljIGNvbnN0IEJZVEUgUkxFX0RFTFRBICAgICAgID0gMjsKKworc3RhdGljIGNvbnN0IEJZVEUgQklfUkdCICAgICAgICAgICAgPSAwOwkvLyBjb21wcmVzc2lvbjogbm9uZQorc3RhdGljIGNvbnN0IEJZVEUgQklfUkxFOCAgICAgICAgICAgPSAxOwkvLyBjb21wcmVzc2lvbjogUkxFIDgtYml0L3BpeGVsCitzdGF0aWMgY29uc3QgQllURSBCSV9STEU0ICAgICAgICAgICA9IDI7CS8vIGNvbXByZXNzaW9uOiBSTEUgNC1iaXQvcGl4ZWwKK3N0YXRpYyBjb25zdCBCWVRFIEJJX0JJVEZJRUxEUyAgICAgID0gMzsJLy8gY29tcHJlc3Npb246IEJpdCBmaWVsZCBvciBIdWZmbWFuIDFEIGNvbXByZXNzaW9uIGZvciBCSVRNQVBDT1JFSEVBREVSMgorc3RhdGljIGNvbnN0IEJZVEUgQklfSlBFRyAgICAgICAgICAgPSA0OwkvLyBjb21wcmVzc2lvbjogSlBFRyBvciBSTEUtMjQgY29tcHJlc3Npb24gZm9yIEJJVE1BUENPUkVIRUFERVIyCitzdGF0aWMgY29uc3QgQllURSBCSV9QTkcgICAgICAgICAgICA9IDU7CS8vIGNvbXByZXNzaW9uOiBQTkcKK3N0YXRpYyBjb25zdCBCWVRFIEJJX0FMUEhBQklURklFTERTID0gNjsJLy8gY29tcHJlc3Npb246IEJpdCBmaWVsZCAodGhpcyB2YWx1ZSBpcyB2YWxpZCBpbiBXaW5kb3dzIENFIC5ORVQgNC4wIGFuZCBsYXRlcikKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgX1dJTjMyCisjcHJhZ21hIHBhY2socHVzaCwgMSkKKyNlbHNlCisjcHJhZ21hIHBhY2soMSkKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB0YWdCSVRNQVBDT1JFSEVBREVSIHsKKyAgRFdPUkQgICBiY1NpemU7CisgIFdPUkQgICAgYmNXaWR0aDsKKyAgV09SRCAgICBiY0hlaWdodDsKKyAgV09SRCAgICBiY1BsYW5lczsKKyAgV09SRCAgICBiY0JpdENudDsKK30gQklUTUFQQ09SRUhFQURFUiwgKlBCSVRNQVBDT1JFSEVBREVSOyAKKwordHlwZWRlZiBzdHJ1Y3QgdGFnQklUTUFQSU5GT09TMl8xWF9IRUFERVIgeworICBEV09SRCAgYmlTaXplOworICBXT1JEICAgYmlXaWR0aDsKKyAgV09SRCAgIGJpSGVpZ2h0OyAKKyAgV09SRCAgIGJpUGxhbmVzOyAKKyAgV09SRCAgIGJpQml0Q291bnQ7Cit9IEJJVE1BUElORk9PUzJfMVhfSEVBREVSLCAqUEJJVE1BUElORk9PUzJfMVhfSEVBREVSOyAKKwordHlwZWRlZiBzdHJ1Y3QgdGFnQklUTUFQRklMRUhFQURFUiB7CisgIFdPUkQgICAgYmZUeXBlOwkJLy8hIFRoZSBmaWxlIHR5cGUKKyAgRFdPUkQgICBiZlNpemU7CQkvLyEgVGhlIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgYml0bWFwIGZpbGUKKyAgV09SRCAgICBiZlJlc2VydmVkMTsJLy8hIFJlc2VydmVkOyBtdXN0IGJlIHplcm8KKyAgV09SRCAgICBiZlJlc2VydmVkMjsJLy8hIFJlc2VydmVkOyBtdXN0IGJlIHplcm8KKyAgRFdPUkQgICBiZk9mZkJpdHM7CS8vISBUaGUgb2Zmc2V0LCBpbiBieXRlcywgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBCSVRNQVBGSUxFSEVBREVSIHN0cnVjdHVyZSB0byB0aGUgYml0bWFwIGJpdHMKK30gQklUTUFQRklMRUhFQURFUiwgKlBCSVRNQVBGSUxFSEVBREVSOworCisjaWZkZWYgX1dJTjMyCisjcHJhZ21hIHBhY2socG9wKQorI2Vsc2UKKyNwcmFnbWEgcGFjaygpCisjZW5kaWYKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gUGx1Z2luIEludGVyZmFjZQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitzdGF0aWMgaW50IHNfZm9ybWF0X2lkOworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBJbnRlcm5hbCBmdW5jdGlvbnMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2lmZGVmIEZSRUVJTUFHRV9CSUdFTkRJQU4KK3N0YXRpYyB2b2lkCitTd2FwSW5mb0hlYWRlcihCSVRNQVBJTkZPSEVBREVSICpoZWFkZXIpIHsKKwlTd2FwTG9uZygmaGVhZGVyLT5iaVNpemUpOworCVN3YXBMb25nKChEV09SRCAqKSZoZWFkZXItPmJpV2lkdGgpOworCVN3YXBMb25nKChEV09SRCAqKSZoZWFkZXItPmJpSGVpZ2h0KTsKKwlTd2FwU2hvcnQoJmhlYWRlci0+YmlQbGFuZXMpOworCVN3YXBTaG9ydCgmaGVhZGVyLT5iaUJpdENvdW50KTsKKwlTd2FwTG9uZygmaGVhZGVyLT5iaUNvbXByZXNzaW9uKTsKKwlTd2FwTG9uZygmaGVhZGVyLT5iaVNpemVJbWFnZSk7CisJU3dhcExvbmcoKERXT1JEICopJmhlYWRlci0+YmlYUGVsc1Blck1ldGVyKTsKKwlTd2FwTG9uZygoRFdPUkQgKikmaGVhZGVyLT5iaVlQZWxzUGVyTWV0ZXIpOworCVN3YXBMb25nKCZoZWFkZXItPmJpQ2xyVXNlZCk7CisJU3dhcExvbmcoJmhlYWRlci0+YmlDbHJJbXBvcnRhbnQpOworfQorCitzdGF0aWMgdm9pZAorU3dhcENvcmVIZWFkZXIoQklUTUFQQ09SRUhFQURFUiAqaGVhZGVyKSB7CisJU3dhcExvbmcoJmhlYWRlci0+YmNTaXplKTsKKwlTd2FwU2hvcnQoJmhlYWRlci0+YmNXaWR0aCk7CisJU3dhcFNob3J0KCZoZWFkZXItPmJjSGVpZ2h0KTsKKwlTd2FwU2hvcnQoJmhlYWRlci0+YmNQbGFuZXMpOworCVN3YXBTaG9ydCgmaGVhZGVyLT5iY0JpdENudCk7Cit9CisKK3N0YXRpYyB2b2lkCitTd2FwT1MyMVhIZWFkZXIoQklUTUFQSU5GT09TMl8xWF9IRUFERVIgKmhlYWRlcikgeworCVN3YXBMb25nKCZoZWFkZXItPmJpU2l6ZSk7CisJU3dhcFNob3J0KCZoZWFkZXItPmJpV2lkdGgpOworCVN3YXBTaG9ydCgmaGVhZGVyLT5iaUhlaWdodCk7CisJU3dhcFNob3J0KCZoZWFkZXItPmJpUGxhbmVzKTsKKwlTd2FwU2hvcnQoJmhlYWRlci0+YmlCaXRDb3VudCk7Cit9CisKK3N0YXRpYyB2b2lkCitTd2FwRmlsZUhlYWRlcihCSVRNQVBGSUxFSEVBREVSICpoZWFkZXIpIHsKKwlTd2FwU2hvcnQoJmhlYWRlci0+YmZUeXBlKTsKKyAgCVN3YXBMb25nKCZoZWFkZXItPmJmU2l6ZSk7CisgIAlTd2FwU2hvcnQoJmhlYWRlci0+YmZSZXNlcnZlZDEpOworICAJU3dhcFNob3J0KCZoZWFkZXItPmJmUmVzZXJ2ZWQyKTsKKwlTd2FwTG9uZygmaGVhZGVyLT5iZk9mZkJpdHMpOworfQorI2VuZGlmCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qKgorTG9hZCB1bmNvbXByZXNzZWQgaW1hZ2UgcGl4ZWxzIGZvciAxLSwgNC0sIDgtLCAxNi0sIDI0LSBhbmQgMzItYml0IGRpYgorQHBhcmFtIGlvIEZyZWVJbWFnZSBJTworQHBhcmFtIGhhbmRsZSBGcmVlSW1hZ2UgSU8gaGFuZGxlCitAcGFyYW0gZGliIEltYWdlIHRvIGJlIGxvYWRlZCAKK0BwYXJhbSBoZWlnaHQgSW1hZ2UgaGVpZ2h0CitAcGFyYW0gcGl0Y2ggSW1hZ2UgcGl0Y2gKK0BwYXJhbSBiaXRfY291bnQgSW1hZ2UgYml0LWRlcHRoICgxLSwgNC0sIDgtLCAxNi0sIDI0LSBvciAzMi1iaXQpCitAcmV0dXJuIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsLCByZXR1cm5zIEZBTFNFIG90aGVyd2lzZQorKi8KK3N0YXRpYyBCT09MIAorTG9hZFBpeGVsRGF0YShGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIEZJQklUTUFQICpkaWIsIGludCBoZWlnaHQsIHVuc2lnbmVkIHBpdGNoLCB1bnNpZ25lZCBiaXRfY291bnQpIHsKKwl1bnNpZ25lZCBjb3VudCA9IDA7CisKKwkvLyBMb2FkIHBpeGVsIGRhdGEKKwkvLyBOQjogaGVpZ2h0IGNhbiBiZSA8IDAgZm9yIEJNUCBkYXRhCisJaWYgKGhlaWdodCA+IDApIHsKKwkJY291bnQgPSBpby0+cmVhZF9wcm9jKCh2b2lkICopRnJlZUltYWdlX0dldEJpdHMoZGliKSwgaGVpZ2h0ICogcGl0Y2gsIDEsIGhhbmRsZSk7CisJCWlmKGNvdW50ICE9IDEpIHsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCX0gZWxzZSB7CisJCWludCBwb3NpdGl2ZUhlaWdodCA9IGFicyhoZWlnaHQpOworCQlmb3IgKGludCBjID0gMDsgYyA8IHBvc2l0aXZlSGVpZ2h0OyArK2MpIHsKKwkJCWNvdW50ID0gaW8tPnJlYWRfcHJvYygodm9pZCAqKUZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIHBvc2l0aXZlSGVpZ2h0IC0gYyAtIDEpLCBwaXRjaCwgMSwgaGFuZGxlKTsKKwkJCWlmKGNvdW50ICE9IDEpIHsKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQl9CisJCX0KKwl9CisKKwkvLyBzd2FwIGFzIG5lZWRlZAorI2lmZGVmIEZSRUVJTUFHRV9CSUdFTkRJQU4KKwlpZiAoYml0X2NvdW50ID09IDE2KSB7CisJCWZvcih1bnNpZ25lZCB5ID0gMDsgeSA8IEZyZWVJbWFnZV9HZXRIZWlnaHQoZGliKTsgeSsrKSB7CisJCQlXT1JEICpwaXhlbCA9IChXT1JEICopRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgeSk7CisJCQlmb3IodW5zaWduZWQgeCA9IDA7IHggPCBGcmVlSW1hZ2VfR2V0V2lkdGgoZGliKTsgeCsrKSB7CisJCQkJU3dhcFNob3J0KHBpeGVsKTsKKwkJCQlwaXhlbCsrOworCQkJfQorCQl9CisJfQorI2VuZGlmCisjaWYgRlJFRUlNQUdFX0NPTE9ST1JERVIgPT0gRlJFRUlNQUdFX0NPTE9ST1JERVJfUkdCCisJaWYgKGJpdF9jb3VudCA9PSAyNCB8fCBiaXRfY291bnQgPT0gMzIpIHsKKwkJZm9yKHVuc2lnbmVkIHkgPSAwOyB5IDwgRnJlZUltYWdlX0dldEhlaWdodChkaWIpOyB5KyspIHsKKwkJCUJZVEUgKnBpeGVsID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgeSk7CisJCQlmb3IodW5zaWduZWQgeCA9IDA7IHggPCBGcmVlSW1hZ2VfR2V0V2lkdGgoZGliKTsgeCsrKSB7CisJCQkJSU5QTEFDRVNXQVAocGl4ZWxbMF0sIHBpeGVsWzJdKTsKKwkJCQlwaXhlbCArPSAoYml0X2NvdW50ID4+IDMpOworCQkJfQorCQl9CisJfQorI2VuZGlmCisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoqCitMb2FkIGltYWdlIHBpeGVscyBmb3IgNC1iaXQgUkxFIGNvbXByZXNzZWQgZGliCitAcGFyYW0gaW8gRnJlZUltYWdlIElPCitAcGFyYW0gaGFuZGxlIEZyZWVJbWFnZSBJTyBoYW5kbGUKK0BwYXJhbSB3aWR0aCBJbWFnZSB3aWR0aAorQHBhcmFtIGhlaWdodCBJbWFnZSBoZWlnaHQKK0BwYXJhbSBkaWIgSW1hZ2UgdG8gYmUgbG9hZGVkIAorQHJldHVybiBSZXR1cm5zIFRSVUUgaWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyBGQUxTRSBvdGhlcndpc2UKKyovCitzdGF0aWMgQk9PTCAKK0xvYWRQaXhlbERhdGFSTEU0KEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGSUJJVE1BUCAqZGliKSB7CisJaW50IHN0YXR1c19ieXRlID0gMDsKKwlCWVRFIHNlY29uZF9ieXRlID0gMDsKKwlpbnQgYml0cyA9IDA7CisKKwlCWVRFICpwaXhlbHMgPSBOVUxMOwkvLyB0ZW1wb3JhcnkgOC1iaXQgYnVmZmVyCisKKwl0cnkgeworCQloZWlnaHQgPSBhYnMoaGVpZ2h0KTsKKworCQlwaXhlbHMgPSAoQllURSopbWFsbG9jKHdpZHRoICogaGVpZ2h0ICogc2l6ZW9mKEJZVEUpKTsKKwkJaWYoIXBpeGVscykgdGhyb3coMSk7CisJCW1lbXNldChwaXhlbHMsIDAsIHdpZHRoICogaGVpZ2h0ICogc2l6ZW9mKEJZVEUpKTsKKworCQlCWVRFICpxID0gcGl4ZWxzOworCQlCWVRFICplbmQgPSBwaXhlbHMgKyBoZWlnaHQgKiB3aWR0aDsKKworCQlmb3IgKGludCBzY2FubGluZSA9IDA7IHNjYW5saW5lIDwgaGVpZ2h0OyApIHsKKwkJCWlmIChxIDwgcGl4ZWxzIHx8IHEgID49IGVuZCkgeworCQkJCWJyZWFrOworCQkJfQorCQkJaWYoaW8tPnJlYWRfcHJvYygmc3RhdHVzX2J5dGUsIHNpemVvZihCWVRFKSwgMSwgaGFuZGxlKSAhPSAxKSB7CisJCQkJdGhyb3coMSk7CisJCQl9CisJCQlpZiAoc3RhdHVzX2J5dGUgIT0gMCkJeworCQkJCXN0YXR1c19ieXRlID0gKGludClNSU4oKHNpemVfdClzdGF0dXNfYnl0ZSwgKHNpemVfdCkoZW5kIC0gcSkpOworCQkJCS8vIEVuY29kZWQgbW9kZQorCQkJCWlmKGlvLT5yZWFkX3Byb2MoJnNlY29uZF9ieXRlLCBzaXplb2YoQllURSksIDEsIGhhbmRsZSkgIT0gMSkgeworCQkJCQl0aHJvdygxKTsKKwkJCQl9CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdGF0dXNfYnl0ZTsgaSsrKQl7CisJCQkJCSpxKys9KEJZVEUpKChpICYgMHgwMSkgPyAoc2Vjb25kX2J5dGUgJiAweDBmKSA6ICgoc2Vjb25kX2J5dGUgPj4gNCkgJiAweDBmKSk7CisJCQkJfQorCQkJCWJpdHMgKz0gc3RhdHVzX2J5dGU7CisJCQl9CisJCQllbHNlIHsKKwkJCQkvLyBFc2NhcGUgbW9kZQorCQkJCWlmKGlvLT5yZWFkX3Byb2MoJnN0YXR1c19ieXRlLCBzaXplb2YoQllURSksIDEsIGhhbmRsZSkgIT0gMSkgeworCQkJCQl0aHJvdygxKTsKKwkJCQl9CisJCQkJc3dpdGNoIChzdGF0dXNfYnl0ZSkgeworCQkJCQljYXNlIFJMRV9FTkRPRkxJTkU6CisJCQkJCXsKKwkJCQkJCS8vIEVuZCBvZiBsaW5lCisJCQkJCQliaXRzID0gMDsKKwkJCQkJCXNjYW5saW5lKys7CisJCQkJCQlxID0gcGl4ZWxzICsgc2NhbmxpbmUqd2lkdGg7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBSTEVfRU5ET0ZCSVRNQVA6CisJCQkJCQkvLyBFbmQgb2YgYml0bWFwCisJCQkJCQlxID0gZW5kOworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBSTEVfREVMVEE6CisJCQkJCXsKKwkJCQkJCS8vIHJlYWQgdGhlIGRlbHRhIHZhbHVlcworCisJCQkJCQlCWVRFIGRlbHRhX3ggPSAwOworCQkJCQkJQllURSBkZWx0YV95ID0gMDsKKworCQkJCQkJaWYoaW8tPnJlYWRfcHJvYygmZGVsdGFfeCwgc2l6ZW9mKEJZVEUpLCAxLCBoYW5kbGUpICE9IDEpIHsKKwkJCQkJCQl0aHJvdygxKTsKKwkJCQkJCX0KKwkJCQkJCWlmKGlvLT5yZWFkX3Byb2MoJmRlbHRhX3ksIHNpemVvZihCWVRFKSwgMSwgaGFuZGxlKSAhPSAxKSB7CisJCQkJCQkJdGhyb3coMSk7CisJCQkJCQl9CisKKwkJCQkJCS8vIGFwcGx5IHRoZW0KKworCQkJCQkJYml0cyArPSBkZWx0YV94OworCQkJCQkJc2NhbmxpbmUgKz0gZGVsdGFfeTsKKwkJCQkJCXEgPSBwaXhlbHMgKyBzY2FubGluZSp3aWR0aCtiaXRzOworCQkJCQl9CisJCQkJCWJyZWFrOworCisJCQkJCWRlZmF1bHQ6CisJCQkJCXsKKwkJCQkJCS8vIEFic29sdXRlIG1vZGUKKwkJCQkJCXN0YXR1c19ieXRlID0gKGludClNSU4oKHNpemVfdClzdGF0dXNfYnl0ZSwgKHNpemVfdCkoZW5kIC0gcSkpOworCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdGF0dXNfYnl0ZTsgaSsrKSB7CisJCQkJCQkJaWYgKChpICYgMHgwMSkgPT0gMCkgeworCQkJCQkJCQlpZihpby0+cmVhZF9wcm9jKCZzZWNvbmRfYnl0ZSwgc2l6ZW9mKEJZVEUpLCAxLCBoYW5kbGUpICE9IDEpIHsKKwkJCQkJCQkJCXRocm93KDEpOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJCSpxKys9KEJZVEUpKChpICYgMHgwMSkgPyAoc2Vjb25kX2J5dGUgJiAweDBmKSA6ICgoc2Vjb25kX2J5dGUgPj4gNCkgJiAweDBmKSk7CisJCQkJCQl9CisJCQkJCQliaXRzICs9IHN0YXR1c19ieXRlOworCQkJCQkJLy8gUmVhZCBwYWQgYnl0ZQorCQkJCQkJaWYgKCgoc3RhdHVzX2J5dGUgJiAweDAzKSA9PSAxKSB8fCAoKHN0YXR1c19ieXRlICYgMHgwMykgPT0gMikpIHsKKwkJCQkJCQlCWVRFIHBhZGRpbmcgPSAwOworCQkJCQkJCWlmKGlvLT5yZWFkX3Byb2MoJnBhZGRpbmcsIHNpemVvZihCWVRFKSwgMSwgaGFuZGxlKSAhPSAxKSB7CisJCQkJCQkJCXRocm93KDEpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwkJCisJCXsKKwkJCS8vIENvbnZlcnQgdG8gNC1iaXQKKwkJCWZvcihpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworCQkJCWNvbnN0IEJZVEUgKnNyYyA9IChCWVRFKilwaXhlbHMgKyB5ICogd2lkdGg7CisJCQkJQllURSAqZHN0ID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgeSk7CisKKwkJCQlCT09MIGhpbmliYmxlID0gVFJVRTsKKworCQkJCWZvciAoaW50IGNvbHMgPSAwOyBjb2xzIDwgd2lkdGg7IGNvbHMrKyl7CisJCQkJCWlmIChoaW5pYmJsZSkgeworCQkJCQkJZHN0W2NvbHMgPj4gMV0gPSAoc3JjW2NvbHNdIDw8IDQpOworCQkJCQl9IGVsc2UgeworCQkJCQkJZHN0W2NvbHMgPj4gMV0gfD0gc3JjW2NvbHNdOworCQkJCQl9CisKKwkJCQkJaGluaWJibGUgPSAhaGluaWJibGU7CisJCQkJfQorCQkJfQorCQl9CisKKwkJZnJlZShwaXhlbHMpOworCisJCXJldHVybiBUUlVFOworCisJfSBjYXRjaChpbnQpIHsKKwkJaWYocGl4ZWxzKSBmcmVlKHBpeGVscyk7CisJCXJldHVybiBGQUxTRTsKKwl9Cit9CisKKy8qKgorTG9hZCBpbWFnZSBwaXhlbHMgZm9yIDgtYml0IFJMRSBjb21wcmVzc2VkIGRpYgorQHBhcmFtIGlvIEZyZWVJbWFnZSBJTworQHBhcmFtIGhhbmRsZSBGcmVlSW1hZ2UgSU8gaGFuZGxlCitAcGFyYW0gd2lkdGggSW1hZ2Ugd2lkdGgKK0BwYXJhbSBoZWlnaHQgSW1hZ2UgaGVpZ2h0CitAcGFyYW0gZGliIEltYWdlIHRvIGJlIGxvYWRlZCAKK0ByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgRkFMU0Ugb3RoZXJ3aXNlCisqLworc3RhdGljIEJPT0wgCitMb2FkUGl4ZWxEYXRhUkxFOChGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIGludCB3aWR0aCwgaW50IGhlaWdodCwgRklCSVRNQVAgKmRpYikgeworCUJZVEUgc3RhdHVzX2J5dGUgPSAwOworCUJZVEUgc2Vjb25kX2J5dGUgPSAwOworCWludCBzY2FubGluZSA9IDA7CisJaW50IGJpdHMgPSAwOworCisJZm9yICg7OykgeworCQlpZiggaW8tPnJlYWRfcHJvYygmc3RhdHVzX2J5dGUsIHNpemVvZihCWVRFKSwgMSwgaGFuZGxlKSAhPSAxKSB7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKworCQlzd2l0Y2ggKHN0YXR1c19ieXRlKSB7CisJCQljYXNlIFJMRV9DT01NQU5EIDoKKwkJCQlpZihpby0+cmVhZF9wcm9jKCZzdGF0dXNfYnl0ZSwgc2l6ZW9mKEJZVEUpLCAxLCBoYW5kbGUpICE9IDEpIHsKKwkJCQkJcmV0dXJuIEZBTFNFOworCQkJCX0KKworCQkJCXN3aXRjaCAoc3RhdHVzX2J5dGUpIHsKKwkJCQkJY2FzZSBSTEVfRU5ET0ZMSU5FIDoKKwkJCQkJCWJpdHMgPSAwOworCQkJCQkJc2NhbmxpbmUrKzsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgUkxFX0VORE9GQklUTUFQIDoKKwkJCQkJCXJldHVybiBUUlVFOworCisJCQkJCWNhc2UgUkxFX0RFTFRBIDoKKwkJCQkJeworCQkJCQkJLy8gcmVhZCB0aGUgZGVsdGEgdmFsdWVzCisKKwkJCQkJCUJZVEUgZGVsdGFfeCA9IDA7CisJCQkJCQlCWVRFIGRlbHRhX3kgPSAwOworCisJCQkJCQlpZihpby0+cmVhZF9wcm9jKCZkZWx0YV94LCBzaXplb2YoQllURSksIDEsIGhhbmRsZSkgIT0gMSkgeworCQkJCQkJCXJldHVybiBGQUxTRTsKKwkJCQkJCX0KKwkJCQkJCWlmKGlvLT5yZWFkX3Byb2MoJmRlbHRhX3ksIHNpemVvZihCWVRFKSwgMSwgaGFuZGxlKSAhPSAxKSB7CisJCQkJCQkJcmV0dXJuIEZBTFNFOworCQkJCQkJfQorCisJCQkJCQkvLyBhcHBseSB0aGVtCisKKwkJCQkJCWJpdHMgICAgICs9IGRlbHRhX3g7CisJCQkJCQlzY2FubGluZSArPSBkZWx0YV95OworCisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCWRlZmF1bHQgOgorCQkJCQl7CisJCQkJCQlpZihzY2FubGluZSA+PSBhYnMoaGVpZ2h0KSkgeworCQkJCQkJCXJldHVybiBUUlVFOworCQkJCQkJfQorCisJCQkJCQlpbnQgY291bnQgPSBNSU4oKGludClzdGF0dXNfYnl0ZSwgd2lkdGggLSBiaXRzKTsKKworCQkJCQkJQllURSAqc2xpbmUgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCBzY2FubGluZSk7CisKKwkJCQkJCWlmKGlvLT5yZWFkX3Byb2MoKHZvaWQgKikoc2xpbmUgKyBiaXRzKSwgc2l6ZW9mKEJZVEUpICogY291bnQsIDEsIGhhbmRsZSkgIT0gMSkgeworCQkJCQkJCXJldHVybiBGQUxTRTsKKwkJCQkJCX0KKwkJCQkJCQorCQkJCQkJLy8gYWxpZ24gcnVuIGxlbmd0aCB0byBldmVuIG51bWJlciBvZiBieXRlcyAKKworCQkJCQkJaWYgKChzdGF0dXNfYnl0ZSAmIDEpID09IDEpIHsKKwkJCQkJCQlpZihpby0+cmVhZF9wcm9jKCZzZWNvbmRfYnl0ZSwgc2l6ZW9mKEJZVEUpLCAxLCBoYW5kbGUpICE9IDEpIHsKKwkJCQkJCQkJcmV0dXJuIEZBTFNFOworCQkJCQkJCX0KKwkJCQkJCX0KKworCQkJCQkJYml0cyArPSBzdGF0dXNfYnl0ZTsJCQkJCQkJCQkJCQkJCisKKwkJCQkJCWJyZWFrOwkKKwkJCQkJfQorCQkJCX0KKworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0IDoKKwkJCXsKKwkJCQlpZihzY2FubGluZSA+PSBhYnMoaGVpZ2h0KSkgeworCQkJCQlyZXR1cm4gVFJVRTsKKwkJCQl9CisKKwkJCQlpbnQgY291bnQgPSBNSU4oKGludClzdGF0dXNfYnl0ZSwgd2lkdGggLSBiaXRzKTsKKworCQkJCUJZVEUgKnNsaW5lID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgc2NhbmxpbmUpOworCisJCQkJaWYoaW8tPnJlYWRfcHJvYygmc2Vjb25kX2J5dGUsIHNpemVvZihCWVRFKSwgMSwgaGFuZGxlKSAhPSAxKSB7CisJCQkJCXJldHVybiBGQUxTRTsKKwkJCQl9CisKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJCQkJKihzbGluZSArIGJpdHMpID0gc2Vjb25kX2J5dGU7CisKKwkJCQkJYml0cysrOwkJCQkJCisJCQkJfQorCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBGSUJJVE1BUCAqCitMb2FkV2luZG93c0JNUChGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIGludCBmbGFncywgdW5zaWduZWQgYml0bWFwX2JpdHNfb2Zmc2V0LCBpbnQgdHlwZSkgeworCUZJQklUTUFQICpkaWIgPSBOVUxMOworCisJdHJ5IHsKKwkJQk9PTCBoZWFkZXJfb25seSA9IChmbGFncyAmIEZJRl9MT0FEX05PUElYRUxTKSA9PSBGSUZfTE9BRF9OT1BJWEVMUzsKKworCQkvLyBsb2FkIHRoZSBpbmZvIGhlYWRlcgorCisJCUJJVE1BUElORk9IRUFERVIgYmloOworCisJCWlvLT5yZWFkX3Byb2MoJmJpaCwgc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpLCAxLCBoYW5kbGUpOworI2lmZGVmIEZSRUVJTUFHRV9CSUdFTkRJQU4KKwkJU3dhcEluZm9IZWFkZXIoJmJpaCk7CisjZW5kaWYKKworCQkvLyBrZWVwIHNvbWUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYml0bWFwCisKKwkJdW5zaWduZWQgdXNlZF9jb2xvcnMJPSBiaWguYmlDbHJVc2VkOworCQlpbnQgd2lkdGgJCQkJPSBiaWguYmlXaWR0aDsKKwkJaW50IGhlaWdodAkJCQk9IGJpaC5iaUhlaWdodDsJCS8vIFdBUk5JTkc6IGhlaWdodCBjYW4gYmUgPCAwID0+IGNoZWNrIGVhY2ggY2FsbCB1c2luZyAnaGVpZ2h0JyBhcyBhIHBhcmFtZXRlcgorCQl1bnNpZ25lZCBiaXRfY291bnQJCT0gYmloLmJpQml0Q291bnQ7CisJCXVuc2lnbmVkIGNvbXByZXNzaW9uCT0gYmloLmJpQ29tcHJlc3Npb247CisJCXVuc2lnbmVkIHBpdGNoCQkJPSBDYWxjdWxhdGVQaXRjaChDYWxjdWxhdGVMaW5lKHdpZHRoLCBiaXRfY291bnQpKTsKKworCQlzd2l0Y2ggKGJpdF9jb3VudCkgeworCQkJY2FzZSAxIDoKKwkJCWNhc2UgNCA6CisJCQljYXNlIDggOgorCQkJeworCQkJCWlmICgodXNlZF9jb2xvcnMgPT0gMCkgfHwgKHVzZWRfY29sb3JzID4gQ2FsY3VsYXRlVXNlZFBhbGV0dGVFbnRyaWVzKGJpdF9jb3VudCkpKSB7CisJCQkJCXVzZWRfY29sb3JzID0gQ2FsY3VsYXRlVXNlZFBhbGV0dGVFbnRyaWVzKGJpdF9jb3VudCk7CisJCQkJfQorCQkJCQorCQkJCS8vIGFsbG9jYXRlIGVub3VnaCBtZW1vcnkgdG8gaG9sZCB0aGUgYml0bWFwIChoZWFkZXIsIHBhbGV0dGUsIHBpeGVscykgYW5kIHJlYWQgdGhlIHBhbGV0dGUKKworCQkJCWRpYiA9IEZyZWVJbWFnZV9BbGxvY2F0ZUhlYWRlcihoZWFkZXJfb25seSwgd2lkdGgsIGhlaWdodCwgYml0X2NvdW50KTsKKwkJCQlpZiAoZGliID09IE5VTEwpIHsKKwkJCQkJdGhyb3cgRklfTVNHX0VSUk9SX0RJQl9NRU1PUlk7CisJCQkJfQorCisJCQkJLy8gc2V0IHJlc29sdXRpb24gaW5mb3JtYXRpb24KKwkJCQlGcmVlSW1hZ2VfU2V0RG90c1Blck1ldGVyWChkaWIsIGJpaC5iaVhQZWxzUGVyTWV0ZXIpOworCQkJCUZyZWVJbWFnZV9TZXREb3RzUGVyTWV0ZXJZKGRpYiwgYmloLmJpWVBlbHNQZXJNZXRlcik7CisKKwkJCQkvLyBzZWVrIHRvIHRoZSBlbmQgb2YgdGhlIGhlYWRlciAoZGVwZW5kaW5nIG9uIHRoZSBCTVAgaGVhZGVyIHZlcnNpb24pCisJCQkJLy8gdHlwZSA9PSBzaXplb2YoQklUTUFQVnhJTkZPSEVBREVSKQorCQkJCXN3aXRjaCh0eXBlKSB7CisJCQkJCWNhc2UgNDA6CS8vIHNpemVvZihCSVRNQVBJTkZPSEVBREVSKSAtIGFsbCBXaW5kb3dzIHZlcnNpb25zIHNpbmNlIFdpbmRvd3MgMy4wCisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSA1MjoJLy8gc2l6ZW9mKEJJVE1BUFYySU5GT0hFQURFUikgKHVuZG9jdW1lbnRlZCkKKwkJCQkJY2FzZSA1NjoJLy8gc2l6ZW9mKEJJVE1BUFYzSU5GT0hFQURFUikgKHVuZG9jdW1lbnRlZCkKKwkJCQkJY2FzZSAxMDg6CS8vIHNpemVvZihCSVRNQVBWNEhFQURFUikgLSBhbGwgV2luZG93cyB2ZXJzaW9ucyBzaW5jZSBXaW5kb3dzIDk1L05UNCAobm90IHN1cHBvcnRlZCkKKwkJCQkJY2FzZSAxMjQ6CS8vIHNpemVvZihCSVRNQVBWNUhFQURFUikgLSBXaW5kb3dzIDk4LzIwMDAgYW5kIG5ld2VyIChub3Qgc3VwcG9ydGVkKQorCQkJCQkJaW8tPnNlZWtfcHJvYyhoYW5kbGUsIChsb25nKSh0eXBlIC0gc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpKSwgU0VFS19DVVIpOworCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJCQorCQkJCS8vIGxvYWQgdGhlIHBhbGV0dGUKKworCQkJCWlvLT5yZWFkX3Byb2MoRnJlZUltYWdlX0dldFBhbGV0dGUoZGliKSwgdXNlZF9jb2xvcnMgKiBzaXplb2YoUkdCUVVBRCksIDEsIGhhbmRsZSk7CisjaWYgRlJFRUlNQUdFX0NPTE9ST1JERVIgPT0gRlJFRUlNQUdFX0NPTE9ST1JERVJfUkdCCisJCQkJUkdCUVVBRCAqcGFsID0gRnJlZUltYWdlX0dldFBhbGV0dGUoZGliKTsKKwkJCQlmb3IoaW50IGkgPSAwOyBpIDwgdXNlZF9jb2xvcnM7IGkrKykgeworCQkJCQlJTlBMQUNFU1dBUChwYWxbaV0ucmdiUmVkLCBwYWxbaV0ucmdiQmx1ZSk7CisJCQkJfQorI2VuZGlmCisKKwkJCQlpZihoZWFkZXJfb25seSkgeworCQkJCQkvLyBoZWFkZXIgb25seSBtb2RlCisJCQkJCXJldHVybiBkaWI7CisJCQkJfQorCisJCQkJLy8gc2VlayB0byB0aGUgYWN0dWFsIHBpeGVsIGRhdGEuCisJCQkJLy8gdGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBzb21ldGltZXMgdGhlIHBhbGV0dGUgaXMgbGFyZ2VyIHRoYW4gdGhlIGVudHJpZXMgaXQgY29udGFpbnMgcHJlZGljdHMKKwkJCQlpby0+c2Vla19wcm9jKGhhbmRsZSwgYml0bWFwX2JpdHNfb2Zmc2V0LCBTRUVLX1NFVCk7CisKKwkJCQkvLyByZWFkIHRoZSBwaXhlbCBkYXRhCisKKwkJCQlzd2l0Y2ggKGNvbXByZXNzaW9uKSB7CisJCQkJCWNhc2UgQklfUkdCIDoKKwkJCQkJCWlmKCBMb2FkUGl4ZWxEYXRhKGlvLCBoYW5kbGUsIGRpYiwgaGVpZ2h0LCBwaXRjaCwgYml0X2NvdW50KSApIHsKKwkJCQkJCQlyZXR1cm4gZGliOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQl0aHJvdyAiRXJyb3IgZW5jb3VudGVyZWQgd2hpbGUgZGVjb2RpbmcgQk1QIGRhdGEiOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBCSV9STEU0IDoKKwkJCQkJCWlmKCBMb2FkUGl4ZWxEYXRhUkxFNChpbywgaGFuZGxlLCB3aWR0aCwgaGVpZ2h0LCBkaWIpICkgeworCQkJCQkJCXJldHVybiBkaWI7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXRocm93ICJFcnJvciBlbmNvdW50ZXJlZCB3aGlsZSBkZWNvZGluZyBSTEU0IEJNUCBkYXRhIjsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgQklfUkxFOCA6CisJCQkJCQlpZiggTG9hZFBpeGVsRGF0YVJMRTgoaW8sIGhhbmRsZSwgd2lkdGgsIGhlaWdodCwgZGliKSApIHsKKwkJCQkJCQlyZXR1cm4gZGliOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQl0aHJvdyAiRXJyb3IgZW5jb3VudGVyZWQgd2hpbGUgZGVjb2RpbmcgUkxFOCBCTVAgZGF0YSI7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKworCQkJCQlkZWZhdWx0IDoKKwkJCQkJCXRocm93IEZJX01TR19FUlJPUl9VTlNVUFBPUlRFRF9DT01QUkVTU0lPTjsKKwkJCQl9CisJCQl9CisJCQlicmVhazsgLy8gMS0sIDQtLCA4LWJpdAorCisJCQljYXNlIDE2IDoKKwkJCXsKKwkJCQlpbnQgdXNlX2JpdGZpZWxkcyA9IDA7CisJCQkJaWYgKGJpaC5iaUNvbXByZXNzaW9uID09IEJJX0JJVEZJRUxEUykgdXNlX2JpdGZpZWxkcyA9IDM7CisJCQkJZWxzZSBpZiAoYmloLmJpQ29tcHJlc3Npb24gPT0gQklfQUxQSEFCSVRGSUVMRFMpIHVzZV9iaXRmaWVsZHMgPSA0OworCQkJCWVsc2UgaWYgKHR5cGUgPT0gNTIpIHVzZV9iaXRmaWVsZHMgPSAzOworCQkJCWVsc2UgaWYgKHR5cGUgPj0gNTYpIHVzZV9iaXRmaWVsZHMgPSA0OworCQkJCQorCQkJCWlmICh1c2VfYml0ZmllbGRzID4gMCkgeworIAkJCQkJRFdPUkQgYml0ZmllbGRzWzRdOworCQkJCQlpby0+cmVhZF9wcm9jKGJpdGZpZWxkcywgdXNlX2JpdGZpZWxkcyAqIHNpemVvZihEV09SRCksIDEsIGhhbmRsZSk7CisJCQkJCWRpYiA9IEZyZWVJbWFnZV9BbGxvY2F0ZUhlYWRlcihoZWFkZXJfb25seSwgd2lkdGgsIGhlaWdodCwgYml0X2NvdW50LCBiaXRmaWVsZHNbMF0sIGJpdGZpZWxkc1sxXSwgYml0ZmllbGRzWzJdKTsKKwkJCQl9IGVsc2UgeworCQkJCQlkaWIgPSBGcmVlSW1hZ2VfQWxsb2NhdGVIZWFkZXIoaGVhZGVyX29ubHksIHdpZHRoLCBoZWlnaHQsIGJpdF9jb3VudCwgRkkxNl81NTVfUkVEX01BU0ssIEZJMTZfNTU1X0dSRUVOX01BU0ssIEZJMTZfNTU1X0JMVUVfTUFTSyk7CisJCQkJfQorCisJCQkJaWYgKGRpYiA9PSBOVUxMKSB7CisJCQkJCXRocm93IEZJX01TR19FUlJPUl9ESUJfTUVNT1JZOwkJCQkJCQorCQkJCX0KKworCQkJCS8vIHNldCByZXNvbHV0aW9uIGluZm9ybWF0aW9uCisJCQkJRnJlZUltYWdlX1NldERvdHNQZXJNZXRlclgoZGliLCBiaWguYmlYUGVsc1Blck1ldGVyKTsKKwkJCQlGcmVlSW1hZ2VfU2V0RG90c1Blck1ldGVyWShkaWIsIGJpaC5iaVlQZWxzUGVyTWV0ZXIpOworCisJCQkJaWYoaGVhZGVyX29ubHkpIHsKKwkJCQkJLy8gaGVhZGVyIG9ubHkgbW9kZQorCQkJCQlyZXR1cm4gZGliOworCQkJCX0KKwkJCQkKKwkJCQkvLyBzZWVrIHRvIHRoZSBhY3R1YWwgcGl4ZWwgZGF0YQorCQkJCWlvLT5zZWVrX3Byb2MoaGFuZGxlLCBiaXRtYXBfYml0c19vZmZzZXQsIFNFRUtfU0VUKTsKKworCQkJCS8vIGxvYWQgcGl4ZWwgZGF0YSBhbmQgc3dhcCBhcyBuZWVkZWQgaWYgT1MgaXMgQmlnIEVuZGlhbgorCQkJCUxvYWRQaXhlbERhdGEoaW8sIGhhbmRsZSwgZGliLCBoZWlnaHQsIHBpdGNoLCBiaXRfY291bnQpOworCisJCQkJcmV0dXJuIGRpYjsKKwkJCX0KKwkJCWJyZWFrOyAvLyAxNi1iaXQKKworCQkJY2FzZSAyNCA6CisJCQljYXNlIDMyIDoKKwkJCXsKKwkJCQlpbnQgdXNlX2JpdGZpZWxkcyA9IDA7CisJCQkJaWYgKGJpaC5iaUNvbXByZXNzaW9uID09IEJJX0JJVEZJRUxEUykgdXNlX2JpdGZpZWxkcyA9IDM7CisJCQkJZWxzZSBpZiAoYmloLmJpQ29tcHJlc3Npb24gPT0gQklfQUxQSEFCSVRGSUVMRFMpIHVzZV9iaXRmaWVsZHMgPSA0OworCQkJCWVsc2UgaWYgKHR5cGUgPT0gNTIpIHVzZV9iaXRmaWVsZHMgPSAzOworCQkJCWVsc2UgaWYgKHR5cGUgPj0gNTYpIHVzZV9iaXRmaWVsZHMgPSA0OworCisgCQkJCWlmICh1c2VfYml0ZmllbGRzID4gMCkgeworCQkJCQlEV09SRCBiaXRmaWVsZHNbNF07CisJCQkJCWlvLT5yZWFkX3Byb2MoYml0ZmllbGRzLCB1c2VfYml0ZmllbGRzICogc2l6ZW9mKERXT1JEKSwgMSwgaGFuZGxlKTsKKwkJCQkJZGliID0gRnJlZUltYWdlX0FsbG9jYXRlSGVhZGVyKGhlYWRlcl9vbmx5LCB3aWR0aCwgaGVpZ2h0LCBiaXRfY291bnQsIGJpdGZpZWxkc1swXSwgYml0ZmllbGRzWzFdLCBiaXRmaWVsZHNbMl0pOworCQkJCX0gZWxzZSB7CisJCQkJCWlmKCBiaXRfY291bnQgPT0gMzIgKSB7CisJCQkJCQlkaWIgPSBGcmVlSW1hZ2VfQWxsb2NhdGVIZWFkZXIoaGVhZGVyX29ubHksIHdpZHRoLCBoZWlnaHQsIGJpdF9jb3VudCwgRklfUkdCQV9SRURfTUFTSywgRklfUkdCQV9HUkVFTl9NQVNLLCBGSV9SR0JBX0JMVUVfTUFTSyk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlkaWIgPSBGcmVlSW1hZ2VfQWxsb2NhdGVIZWFkZXIoaGVhZGVyX29ubHksIHdpZHRoLCBoZWlnaHQsIGJpdF9jb3VudCwgRklfUkdCQV9SRURfTUFTSywgRklfUkdCQV9HUkVFTl9NQVNLLCBGSV9SR0JBX0JMVUVfTUFTSyk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiAoZGliID09IE5VTEwpIHsKKwkJCQkJdGhyb3cgRklfTVNHX0VSUk9SX0RJQl9NRU1PUlk7CisJCQkJfQorCisJCQkJLy8gc2V0IHJlc29sdXRpb24gaW5mb3JtYXRpb24KKwkJCQlGcmVlSW1hZ2VfU2V0RG90c1Blck1ldGVyWChkaWIsIGJpaC5iaVhQZWxzUGVyTWV0ZXIpOworCQkJCUZyZWVJbWFnZV9TZXREb3RzUGVyTWV0ZXJZKGRpYiwgYmloLmJpWVBlbHNQZXJNZXRlcik7CisKKwkJCQlpZihoZWFkZXJfb25seSkgeworCQkJCQkvLyBoZWFkZXIgb25seSBtb2RlCisJCQkJCXJldHVybiBkaWI7CisJCQkJfQorCisJCQkJLy8gU2tpcCBvdmVyIHRoZSBvcHRpb25hbCBwYWxldHRlIAorCQkJCS8vIEEgMjQgb3IgMzIgYml0IERJQiBtYXkgY29udGFpbiBhIHBhbGV0dGUgZm9yIGZhc3RlciBjb2xvciByZWR1Y3Rpb24KKwkJCQkvLyBpLmUuIHlvdSBjYW4gaGF2ZSAoRnJlZUltYWdlX0dldENvbG9yc1VzZWQoZGliKSA+IDApCisKKwkJCQkvLyBzZWVrIHRvIHRoZSBhY3R1YWwgcGl4ZWwgZGF0YQorCQkJCWlvLT5zZWVrX3Byb2MoaGFuZGxlLCBiaXRtYXBfYml0c19vZmZzZXQsIFNFRUtfU0VUKTsKKworCQkJCS8vIHJlYWQgaW4gdGhlIGJpdG1hcCBiaXRzCisJCQkJLy8gbG9hZCBwaXhlbCBkYXRhIGFuZCBzd2FwIGFzIG5lZWRlZCBpZiBPUyBpcyBCaWcgRW5kaWFuCisJCQkJTG9hZFBpeGVsRGF0YShpbywgaGFuZGxlLCBkaWIsIGhlaWdodCwgcGl0Y2gsIGJpdF9jb3VudCk7CisKKwkJCQkvLyBjaGVjayBpZiB0aGUgYml0bWFwIGNvbnRhaW5zIHRyYW5zcGFyZW5jeSwgaWYgc28gZW5hYmxlIGl0IGluIHRoZSBoZWFkZXIKKworCQkJCUZyZWVJbWFnZV9TZXRUcmFuc3BhcmVudChkaWIsIChGcmVlSW1hZ2VfR2V0Q29sb3JUeXBlKGRpYikgPT0gRklDX1JHQkFMUEhBKSk7CisKKwkJCQlyZXR1cm4gZGliOworCQkJfQorCQkJYnJlYWs7IC8vIDI0LSwgMzItYml0CisJCX0KKwl9IGNhdGNoKGNvbnN0IGNoYXIgKm1lc3NhZ2UpIHsKKwkJaWYoZGliKSB7CisJCQlGcmVlSW1hZ2VfVW5sb2FkKGRpYik7CisJCX0KKwkJaWYobWVzc2FnZSkgeworCQkJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKHNfZm9ybWF0X2lkLCBtZXNzYWdlKTsKKwkJfQorCX0KKworCXJldHVybiBOVUxMOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgRklCSVRNQVAgKgorTG9hZE9TMjJYQk1QKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSwgaW50IGZsYWdzLCB1bnNpZ25lZCBiaXRtYXBfYml0c19vZmZzZXQpIHsKKwlGSUJJVE1BUCAqZGliID0gTlVMTDsKKworCXRyeSB7CisJCUJPT0wgaGVhZGVyX29ubHkgPSAoZmxhZ3MgJiBGSUZfTE9BRF9OT1BJWEVMUykgPT0gRklGX0xPQURfTk9QSVhFTFM7CisKKwkJLy8gbG9hZCB0aGUgaW5mbyBoZWFkZXIKKworCQlCSVRNQVBJTkZPSEVBREVSIGJpaDsKKworCQlpby0+cmVhZF9wcm9jKCZiaWgsIHNpemVvZihCSVRNQVBJTkZPSEVBREVSKSwgMSwgaGFuZGxlKTsKKyNpZmRlZiBGUkVFSU1BR0VfQklHRU5ESUFOCisJCVN3YXBJbmZvSGVhZGVyKCZiaWgpOworI2VuZGlmCisKKwkJLy8ga2VlcCBzb21lIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGJpdG1hcAorCisJCXVuc2lnbmVkIHVzZWRfY29sb3JzCT0gYmloLmJpQ2xyVXNlZDsKKwkJaW50IHdpZHRoCQkJCT0gYmloLmJpV2lkdGg7CisJCWludCBoZWlnaHQJCQkJPSBiaWguYmlIZWlnaHQ7CQkvLyBXQVJOSU5HOiBoZWlnaHQgY2FuIGJlIDwgMCA9PiBjaGVjayBlYWNoIHJlYWRfcHJvYyB1c2luZyAnaGVpZ2h0JyBhcyBhIHBhcmFtZXRlcgorCQl1bnNpZ25lZCBiaXRfY291bnQJCT0gYmloLmJpQml0Q291bnQ7CisJCXVuc2lnbmVkIGNvbXByZXNzaW9uCT0gYmloLmJpQ29tcHJlc3Npb247CisJCXVuc2lnbmVkIHBpdGNoCQkJPSBDYWxjdWxhdGVQaXRjaChDYWxjdWxhdGVMaW5lKHdpZHRoLCBiaXRfY291bnQpKTsKKwkJCisJCXN3aXRjaCAoYml0X2NvdW50KSB7CisJCQljYXNlIDEgOgorCQkJY2FzZSA0IDoKKwkJCWNhc2UgOCA6CisJCQl7CisJCQkJaWYgKCh1c2VkX2NvbG9ycyA9PSAwKSB8fCAodXNlZF9jb2xvcnMgPiBDYWxjdWxhdGVVc2VkUGFsZXR0ZUVudHJpZXMoYml0X2NvdW50KSkpCisJCQkJCXVzZWRfY29sb3JzID0gQ2FsY3VsYXRlVXNlZFBhbGV0dGVFbnRyaWVzKGJpdF9jb3VudCk7CisJCQkJCQorCQkJCS8vIGFsbG9jYXRlIGVub3VnaCBtZW1vcnkgdG8gaG9sZCB0aGUgYml0bWFwIChoZWFkZXIsIHBhbGV0dGUsIHBpeGVscykgYW5kIHJlYWQgdGhlIHBhbGV0dGUKKworCQkJCWRpYiA9IEZyZWVJbWFnZV9BbGxvY2F0ZUhlYWRlcihoZWFkZXJfb25seSwgd2lkdGgsIGhlaWdodCwgYml0X2NvdW50KTsKKworCQkJCWlmIChkaWIgPT0gTlVMTCkgeworCQkJCQl0aHJvdyBGSV9NU0dfRVJST1JfRElCX01FTU9SWTsKKwkJCQl9CisKKwkJCQkvLyBzZXQgcmVzb2x1dGlvbiBpbmZvcm1hdGlvbgorCQkJCUZyZWVJbWFnZV9TZXREb3RzUGVyTWV0ZXJYKGRpYiwgYmloLmJpWFBlbHNQZXJNZXRlcik7CisJCQkJRnJlZUltYWdlX1NldERvdHNQZXJNZXRlclkoZGliLCBiaWguYmlZUGVsc1Blck1ldGVyKTsKKwkJCQkKKwkJCQkvLyBsb2FkIHRoZSBwYWxldHRlCisJCQkJLy8gbm90ZSB0aGF0IGl0IG1heSBjb250YWluIFJHQiBvciBSR0JBIHZhbHVlcyA6IHdlIHdpbGwgY2FsY3VsYXRlIHRoaXMKKwkJCQl1bnNpZ25lZCBwYWxfc2l6ZSA9IChiaXRtYXBfYml0c19vZmZzZXQgLSBzaXplb2YoQklUTUFQRklMRUhFQURFUikgLSBiaWguYmlTaXplKSAvIHVzZWRfY29sb3JzOyAKKworCQkJCWlvLT5zZWVrX3Byb2MoaGFuZGxlLCBzaXplb2YoQklUTUFQRklMRUhFQURFUikgKyBiaWguYmlTaXplLCBTRUVLX1NFVCk7CisKKwkJCQlSR0JRVUFEICpwYWwgPSBGcmVlSW1hZ2VfR2V0UGFsZXR0ZShkaWIpOworCisJCQkJaWYocGFsX3NpemUgPT0gNCkgeworCQkJCQlmb3IgKHVuc2lnbmVkIGNvdW50ID0gMDsgY291bnQgPCB1c2VkX2NvbG9yczsgY291bnQrKykgeworCQkJCQkJRklMRV9CR1JBIGJncmE7CisKKwkJCQkJCWlvLT5yZWFkX3Byb2MoJmJncmEsIHNpemVvZihGSUxFX0JHUkEpLCAxLCBoYW5kbGUpOworCQkJCQkJCisJCQkJCQlwYWxbY291bnRdLnJnYlJlZAk9IGJncmEucjsKKwkJCQkJCXBhbFtjb3VudF0ucmdiR3JlZW4gPSBiZ3JhLmc7CisJCQkJCQlwYWxbY291bnRdLnJnYkJsdWUJPSBiZ3JhLmI7CisJCQkJCX0gCisJCQkJfSBlbHNlIGlmKHBhbF9zaXplID09IDMpIHsKKwkJCQkJZm9yICh1bnNpZ25lZCBjb3VudCA9IDA7IGNvdW50IDwgdXNlZF9jb2xvcnM7IGNvdW50KyspIHsKKwkJCQkJCUZJTEVfQkdSIGJncjsKKworCQkJCQkJaW8tPnJlYWRfcHJvYygmYmdyLCBzaXplb2YoRklMRV9CR1IpLCAxLCBoYW5kbGUpOworCQkJCQkJCisJCQkJCQlwYWxbY291bnRdLnJnYlJlZAk9IGJnci5yOworCQkJCQkJcGFsW2NvdW50XS5yZ2JHcmVlbiA9IGJnci5nOworCQkJCQkJcGFsW2NvdW50XS5yZ2JCbHVlCT0gYmdyLmI7CisJCQkJCX0gCisJCQkJfQorCQkJCQorCQkJCWlmKGhlYWRlcl9vbmx5KSB7CisJCQkJCS8vIGhlYWRlciBvbmx5IG1vZGUKKwkJCQkJcmV0dXJuIGRpYjsKKwkJCQl9CisKKwkJCQkvLyBzZWVrIHRvIHRoZSBhY3R1YWwgcGl4ZWwgZGF0YS4KKwkJCQkvLyB0aGlzIGlzIG5lZWRlZCBiZWNhdXNlIHNvbWV0aW1lcyB0aGUgcGFsZXR0ZSBpcyBsYXJnZXIgdGhhbiB0aGUgZW50cmllcyBpdCBjb250YWlucyBwcmVkaWN0cworCisJCQkJaWYgKGJpdG1hcF9iaXRzX29mZnNldCA+IChzaXplb2YoQklUTUFQRklMRUhFQURFUikgKyBzaXplb2YoQklUTUFQSU5GT0hFQURFUikgKyAodXNlZF9jb2xvcnMgKiAzKSkpIHsKKwkJCQkJaW8tPnNlZWtfcHJvYyhoYW5kbGUsIGJpdG1hcF9iaXRzX29mZnNldCwgU0VFS19TRVQpOworCQkJCX0KKworCQkJCS8vIHJlYWQgdGhlIHBpeGVsIGRhdGEKKworCQkJCXN3aXRjaCAoY29tcHJlc3Npb24pIHsKKwkJCQkJY2FzZSBCSV9SR0IgOgorCQkJCQkJLy8gbG9hZCBwaXhlbCBkYXRhIAorCQkJCQkJTG9hZFBpeGVsRGF0YShpbywgaGFuZGxlLCBkaWIsIGhlaWdodCwgcGl0Y2gsIGJpdF9jb3VudCk7CQkJCQkJCisJCQkJCQlyZXR1cm4gZGliOworCisJCQkJCWNhc2UgQklfUkxFNCA6CisJCQkJCQlpZiggTG9hZFBpeGVsRGF0YVJMRTQoaW8sIGhhbmRsZSwgd2lkdGgsIGhlaWdodCwgZGliKSApIHsKKwkJCQkJCQlyZXR1cm4gZGliOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQl0aHJvdyAiRXJyb3IgZW5jb3VudGVyZWQgd2hpbGUgZGVjb2RpbmcgUkxFNCBCTVAgZGF0YSI7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIEJJX1JMRTggOgorCQkJCQkJaWYoIExvYWRQaXhlbERhdGFSTEU4KGlvLCBoYW5kbGUsIHdpZHRoLCBoZWlnaHQsIGRpYikgKSB7CisJCQkJCQkJcmV0dXJuIGRpYjsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJdGhyb3cgIkVycm9yIGVuY291bnRlcmVkIHdoaWxlIGRlY29kaW5nIFJMRTggQk1QIGRhdGEiOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisKKwkJCQkJZGVmYXVsdCA6CQkKKwkJCQkJCXRocm93IEZJX01TR19FUlJPUl9VTlNVUFBPUlRFRF9DT01QUkVTU0lPTjsKKwkJCQl9CQorCQkJfQorCisJCQljYXNlIDE2IDoKKwkJCXsKKwkJCQlpZiAoYmloLmJpQ29tcHJlc3Npb24gPT0gMykgeworCQkJCQlEV09SRCBiaXRmaWVsZHNbM107CisKKwkJCQkJaW8tPnJlYWRfcHJvYyhiaXRmaWVsZHMsIDMgKiBzaXplb2YoRFdPUkQpLCAxLCBoYW5kbGUpOworCisJCQkJCWRpYiA9IEZyZWVJbWFnZV9BbGxvY2F0ZUhlYWRlcihoZWFkZXJfb25seSwgd2lkdGgsIGhlaWdodCwgYml0X2NvdW50LCBiaXRmaWVsZHNbMF0sIGJpdGZpZWxkc1sxXSwgYml0ZmllbGRzWzJdKTsKKwkJCQl9IGVsc2UgeworCQkJCQlkaWIgPSBGcmVlSW1hZ2VfQWxsb2NhdGVIZWFkZXIoaGVhZGVyX29ubHksIHdpZHRoLCBoZWlnaHQsIGJpdF9jb3VudCwgRkkxNl81NTVfUkVEX01BU0ssIEZJMTZfNTU1X0dSRUVOX01BU0ssIEZJMTZfNTU1X0JMVUVfTUFTSyk7CisJCQkJfQorCisJCQkJaWYgKGRpYiA9PSBOVUxMKSB7CisJCQkJCXRocm93IEZJX01TR19FUlJPUl9ESUJfTUVNT1JZOworCQkJCX0KKworCQkJCS8vIHNldCByZXNvbHV0aW9uIGluZm9ybWF0aW9uCisJCQkJRnJlZUltYWdlX1NldERvdHNQZXJNZXRlclgoZGliLCBiaWguYmlYUGVsc1Blck1ldGVyKTsKKwkJCQlGcmVlSW1hZ2VfU2V0RG90c1Blck1ldGVyWShkaWIsIGJpaC5iaVlQZWxzUGVyTWV0ZXIpOworCisJCQkJaWYoaGVhZGVyX29ubHkpIHsKKwkJCQkJLy8gaGVhZGVyIG9ubHkgbW9kZQorCQkJCQlyZXR1cm4gZGliOworCQkJCX0KKworCQkJCWlmIChiaXRtYXBfYml0c19vZmZzZXQgPiAoc2l6ZW9mKEJJVE1BUEZJTEVIRUFERVIpICsgc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpICsgKHVzZWRfY29sb3JzICogMykpKSB7CisJCQkJCWlvLT5zZWVrX3Byb2MoaGFuZGxlLCBiaXRtYXBfYml0c19vZmZzZXQsIFNFRUtfU0VUKTsKKwkJCQl9CisKKwkJCQkvLyBsb2FkIHBpeGVsIGRhdGEgYW5kIHN3YXAgYXMgbmVlZGVkIGlmIE9TIGlzIEJpZyBFbmRpYW4KKwkJCQlMb2FkUGl4ZWxEYXRhKGlvLCBoYW5kbGUsIGRpYiwgaGVpZ2h0LCBwaXRjaCwgYml0X2NvdW50KTsKKworCQkJCXJldHVybiBkaWI7CisJCQl9CisKKwkJCWNhc2UgMjQgOgorCQkJY2FzZSAzMiA6CisJCQl7CisJCQkJaWYoIGJpdF9jb3VudCA9PSAzMiApIHsKKwkJCQkJZGliID0gRnJlZUltYWdlX0FsbG9jYXRlSGVhZGVyKGhlYWRlcl9vbmx5LCB3aWR0aCwgaGVpZ2h0LCBiaXRfY291bnQsIEZJX1JHQkFfUkVEX01BU0ssIEZJX1JHQkFfR1JFRU5fTUFTSywgRklfUkdCQV9CTFVFX01BU0spOworCQkJCX0gZWxzZSB7CisJCQkJCWRpYiA9IEZyZWVJbWFnZV9BbGxvY2F0ZUhlYWRlcihoZWFkZXJfb25seSwgd2lkdGgsIGhlaWdodCwgYml0X2NvdW50LCBGSV9SR0JBX1JFRF9NQVNLLCBGSV9SR0JBX0dSRUVOX01BU0ssIEZJX1JHQkFfQkxVRV9NQVNLKTsKKwkJCQl9CisKKwkJCQlpZiAoZGliID09IE5VTEwpIHsKKwkJCQkJdGhyb3cgRklfTVNHX0VSUk9SX0RJQl9NRU1PUlk7CisJCQkJfQorCQkJCQorCQkJCS8vIHNldCByZXNvbHV0aW9uIGluZm9ybWF0aW9uCisJCQkJRnJlZUltYWdlX1NldERvdHNQZXJNZXRlclgoZGliLCBiaWguYmlYUGVsc1Blck1ldGVyKTsKKwkJCQlGcmVlSW1hZ2VfU2V0RG90c1Blck1ldGVyWShkaWIsIGJpaC5iaVlQZWxzUGVyTWV0ZXIpOworCisJCQkJaWYoaGVhZGVyX29ubHkpIHsKKwkJCQkJLy8gaGVhZGVyIG9ubHkgbW9kZQorCQkJCQlyZXR1cm4gZGliOworCQkJCX0KKworCQkJCS8vIFNraXAgb3ZlciB0aGUgb3B0aW9uYWwgcGFsZXR0ZSAKKwkJCQkvLyBBIDI0IG9yIDMyIGJpdCBESUIgbWF5IGNvbnRhaW4gYSBwYWxldHRlIGZvciBmYXN0ZXIgY29sb3IgcmVkdWN0aW9uCisKKwkJCQlpZiAoYml0bWFwX2JpdHNfb2Zmc2V0ID4gKHNpemVvZihCSVRNQVBGSUxFSEVBREVSKSArIHNpemVvZihCSVRNQVBJTkZPSEVBREVSKSArICh1c2VkX2NvbG9ycyAqIDMpKSkgeworCQkJCQlpby0+c2Vla19wcm9jKGhhbmRsZSwgYml0bWFwX2JpdHNfb2Zmc2V0LCBTRUVLX1NFVCk7CisJCQkJfQorCQkJCQorCQkJCS8vIHJlYWQgaW4gdGhlIGJpdG1hcCBiaXRzCisJCQkJLy8gbG9hZCBwaXhlbCBkYXRhIGFuZCBzd2FwIGFzIG5lZWRlZCBpZiBPUyBpcyBCaWcgRW5kaWFuCisJCQkJTG9hZFBpeGVsRGF0YShpbywgaGFuZGxlLCBkaWIsIGhlaWdodCwgcGl0Y2gsIGJpdF9jb3VudCk7CisKKwkJCQkvLyBjaGVjayBpZiB0aGUgYml0bWFwIGNvbnRhaW5zIHRyYW5zcGFyZW5jeSwgaWYgc28gZW5hYmxlIGl0IGluIHRoZSBoZWFkZXIKKworCQkJCUZyZWVJbWFnZV9TZXRUcmFuc3BhcmVudChkaWIsIChGcmVlSW1hZ2VfR2V0Q29sb3JUeXBlKGRpYikgPT0gRklDX1JHQkFMUEhBKSk7CisKKwkJCQlyZXR1cm4gZGliOworCQkJfQorCQl9CisJfSBjYXRjaChjb25zdCBjaGFyICptZXNzYWdlKSB7CisJCWlmKGRpYikKKwkJCUZyZWVJbWFnZV9VbmxvYWQoZGliKTsKKworCQlGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2Moc19mb3JtYXRfaWQsIG1lc3NhZ2UpOworCX0KKworCXJldHVybiBOVUxMOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgRklCSVRNQVAgKgorTG9hZE9TMjFYQk1QKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSwgaW50IGZsYWdzLCB1bnNpZ25lZCBiaXRtYXBfYml0c19vZmZzZXQpIHsKKwlGSUJJVE1BUCAqZGliID0gTlVMTDsKKworCXRyeSB7CisJCUJPT0wgaGVhZGVyX29ubHkgPSAoZmxhZ3MgJiBGSUZfTE9BRF9OT1BJWEVMUykgPT0gRklGX0xPQURfTk9QSVhFTFM7CisKKwkJQklUTUFQSU5GT09TMl8xWF9IRUFERVIgYmlvczJfMXg7CisKKwkJaW8tPnJlYWRfcHJvYygmYmlvczJfMXgsIHNpemVvZihCSVRNQVBJTkZPT1MyXzFYX0hFQURFUiksIDEsIGhhbmRsZSk7CisjaWZkZWYgRlJFRUlNQUdFX0JJR0VORElBTgorCQlTd2FwT1MyMVhIZWFkZXIoJmJpb3MyXzF4KTsKKyNlbmRpZgorCQkvLyBrZWVwIHNvbWUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYml0bWFwCisKKwkJdW5zaWduZWQgdXNlZF9jb2xvcnMgPSAwOworCQl1bnNpZ25lZCB3aWR0aAkJPSBiaW9zMl8xeC5iaVdpZHRoOworCQl1bnNpZ25lZCBoZWlnaHQJCT0gYmlvczJfMXguYmlIZWlnaHQ7CS8vIFdBUk5JTkc6IGhlaWdodCBjYW4gYmUgPCAwID0+IGNoZWNrIGVhY2ggcmVhZF9wcm9jIHVzaW5nICdoZWlnaHQnIGFzIGEgcGFyYW1ldGVyCisJCXVuc2lnbmVkIGJpdF9jb3VudAk9IGJpb3MyXzF4LmJpQml0Q291bnQ7CisJCXVuc2lnbmVkIHBpdGNoCQk9IENhbGN1bGF0ZVBpdGNoKENhbGN1bGF0ZUxpbmUod2lkdGgsIGJpdF9jb3VudCkpOworCQkKKwkJc3dpdGNoIChiaXRfY291bnQpIHsKKwkJCWNhc2UgMSA6CisJCQljYXNlIDQgOgorCQkJY2FzZSA4IDoKKwkJCXsKKwkJCQl1c2VkX2NvbG9ycyA9IENhbGN1bGF0ZVVzZWRQYWxldHRlRW50cmllcyhiaXRfY291bnQpOworCQkJCQorCQkJCS8vIGFsbG9jYXRlIGVub3VnaCBtZW1vcnkgdG8gaG9sZCB0aGUgYml0bWFwIChoZWFkZXIsIHBhbGV0dGUsIHBpeGVscykgYW5kIHJlYWQgdGhlIHBhbGV0dGUKKworCQkJCWRpYiA9IEZyZWVJbWFnZV9BbGxvY2F0ZUhlYWRlcihoZWFkZXJfb25seSwgd2lkdGgsIGhlaWdodCwgYml0X2NvdW50KTsKKworCQkJCWlmIChkaWIgPT0gTlVMTCkgeworCQkJCQl0aHJvdyBGSV9NU0dfRVJST1JfRElCX01FTU9SWTsKKwkJCQl9CisKKwkJCQkvLyBzZXQgcmVzb2x1dGlvbiBpbmZvcm1hdGlvbiB0byBkZWZhdWx0IHZhbHVlcyAoNzIgZHBpIGluIGVuZ2xpc2ggdW5pdHMpCisJCQkJRnJlZUltYWdlX1NldERvdHNQZXJNZXRlclgoZGliLCAyODM1KTsKKwkJCQlGcmVlSW1hZ2VfU2V0RG90c1Blck1ldGVyWShkaWIsIDI4MzUpOworCQkJCQorCQkJCS8vIGxvYWQgdGhlIHBhbGV0dGUKKworCQkJCVJHQlFVQUQgKnBhbCA9IEZyZWVJbWFnZV9HZXRQYWxldHRlKGRpYik7CisKKwkJCQlmb3IgKHVuc2lnbmVkIGNvdW50ID0gMDsgY291bnQgPCB1c2VkX2NvbG9yczsgY291bnQrKykgeworCQkJCQlGSUxFX0JHUiBiZ3I7CisKKwkJCQkJaW8tPnJlYWRfcHJvYygmYmdyLCBzaXplb2YoRklMRV9CR1IpLCAxLCBoYW5kbGUpOworCQkJCQkKKwkJCQkJcGFsW2NvdW50XS5yZ2JSZWQJPSBiZ3IucjsKKwkJCQkJcGFsW2NvdW50XS5yZ2JHcmVlbiA9IGJnci5nOworCQkJCQlwYWxbY291bnRdLnJnYkJsdWUJPSBiZ3IuYjsKKwkJCQl9CisJCQkJCisJCQkJaWYoaGVhZGVyX29ubHkpIHsKKwkJCQkJLy8gaGVhZGVyIG9ubHkgbW9kZQorCQkJCQlyZXR1cm4gZGliOworCQkJCX0KKworCQkJCS8vIFNraXAgb3ZlciB0aGUgb3B0aW9uYWwgcGFsZXR0ZSAKKwkJCQkvLyBBIDI0IG9yIDMyIGJpdCBESUIgbWF5IGNvbnRhaW4gYSBwYWxldHRlIGZvciBmYXN0ZXIgY29sb3IgcmVkdWN0aW9uCisKKwkJCQlpby0+c2Vla19wcm9jKGhhbmRsZSwgYml0bWFwX2JpdHNfb2Zmc2V0LCBTRUVLX1NFVCk7CisJCQkJCisJCQkJLy8gcmVhZCB0aGUgcGl4ZWwgZGF0YQorCisJCQkJLy8gbG9hZCBwaXhlbCBkYXRhIAorCQkJCUxvYWRQaXhlbERhdGEoaW8sIGhhbmRsZSwgZGliLCBoZWlnaHQsIHBpdGNoLCBiaXRfY291bnQpOworCQkJCQkJCisJCQkJcmV0dXJuIGRpYjsKKwkJCX0KKworCQkJY2FzZSAxNiA6CisJCQl7CisJCQkJZGliID0gRnJlZUltYWdlX0FsbG9jYXRlSGVhZGVyKGhlYWRlcl9vbmx5LCB3aWR0aCwgaGVpZ2h0LCBiaXRfY291bnQsIEZJMTZfNTU1X1JFRF9NQVNLLCBGSTE2XzU1NV9HUkVFTl9NQVNLLCBGSTE2XzU1NV9CTFVFX01BU0spOworCisJCQkJaWYgKGRpYiA9PSBOVUxMKSB7CisJCQkJCXRocm93IEZJX01TR19FUlJPUl9ESUJfTUVNT1JZOwkJCQkJCQorCQkJCX0KKworCQkJCS8vIHNldCByZXNvbHV0aW9uIGluZm9ybWF0aW9uIHRvIGRlZmF1bHQgdmFsdWVzICg3MiBkcGkgaW4gZW5nbGlzaCB1bml0cykKKwkJCQlGcmVlSW1hZ2VfU2V0RG90c1Blck1ldGVyWChkaWIsIDI4MzUpOworCQkJCUZyZWVJbWFnZV9TZXREb3RzUGVyTWV0ZXJZKGRpYiwgMjgzNSk7CisKKwkJCQlpZihoZWFkZXJfb25seSkgeworCQkJCQkvLyBoZWFkZXIgb25seSBtb2RlCisJCQkJCXJldHVybiBkaWI7CisJCQkJfQorCisJCQkJLy8gbG9hZCBwaXhlbCBkYXRhIGFuZCBzd2FwIGFzIG5lZWRlZCBpZiBPUyBpcyBCaWcgRW5kaWFuCisJCQkJTG9hZFBpeGVsRGF0YShpbywgaGFuZGxlLCBkaWIsIGhlaWdodCwgcGl0Y2gsIGJpdF9jb3VudCk7CisKKwkJCQlyZXR1cm4gZGliOworCQkJfQorCisJCQljYXNlIDI0IDoKKwkJCWNhc2UgMzIgOgorCQkJeworCQkJCWlmKCBiaXRfY291bnQgPT0gMzIgKSB7CisJCQkJCWRpYiA9IEZyZWVJbWFnZV9BbGxvY2F0ZUhlYWRlcihoZWFkZXJfb25seSwgd2lkdGgsIGhlaWdodCwgYml0X2NvdW50LCBGSV9SR0JBX1JFRF9NQVNLLCBGSV9SR0JBX0dSRUVOX01BU0ssIEZJX1JHQkFfQkxVRV9NQVNLKTsKKwkJCQl9IGVsc2UgeworCQkJCQlkaWIgPSBGcmVlSW1hZ2VfQWxsb2NhdGVIZWFkZXIoaGVhZGVyX29ubHksIHdpZHRoLCBoZWlnaHQsIGJpdF9jb3VudCwgRklfUkdCQV9SRURfTUFTSywgRklfUkdCQV9HUkVFTl9NQVNLLCBGSV9SR0JBX0JMVUVfTUFTSyk7CisJCQkJfQorCisJCQkJaWYgKGRpYiA9PSBOVUxMKSB7CisJCQkJCXRocm93IEZJX01TR19FUlJPUl9ESUJfTUVNT1JZOwkJCQkJCQorCQkJCX0KKworCQkJCS8vIHNldCByZXNvbHV0aW9uIGluZm9ybWF0aW9uIHRvIGRlZmF1bHQgdmFsdWVzICg3MiBkcGkgaW4gZW5nbGlzaCB1bml0cykKKwkJCQlGcmVlSW1hZ2VfU2V0RG90c1Blck1ldGVyWChkaWIsIDI4MzUpOworCQkJCUZyZWVJbWFnZV9TZXREb3RzUGVyTWV0ZXJZKGRpYiwgMjgzNSk7CisKKwkJCQlpZihoZWFkZXJfb25seSkgeworCQkJCQkvLyBoZWFkZXIgb25seSBtb2RlCisJCQkJCXJldHVybiBkaWI7CisJCQkJfQorCisJCQkJLy8gU2tpcCBvdmVyIHRoZSBvcHRpb25hbCBwYWxldHRlIAorCQkJCS8vIEEgMjQgb3IgMzIgYml0IERJQiBtYXkgY29udGFpbiBhIHBhbGV0dGUgZm9yIGZhc3RlciBjb2xvciByZWR1Y3Rpb24KKworCQkJCS8vIGxvYWQgcGl4ZWwgZGF0YSBhbmQgc3dhcCBhcyBuZWVkZWQgaWYgT1MgaXMgQmlnIEVuZGlhbgorCQkJCUxvYWRQaXhlbERhdGEoaW8sIGhhbmRsZSwgZGliLCBoZWlnaHQsIHBpdGNoLCBiaXRfY291bnQpOworCisJCQkJLy8gY2hlY2sgaWYgdGhlIGJpdG1hcCBjb250YWlucyB0cmFuc3BhcmVuY3ksIGlmIHNvIGVuYWJsZSBpdCBpbiB0aGUgaGVhZGVyCisKKwkJCQlGcmVlSW1hZ2VfU2V0VHJhbnNwYXJlbnQoZGliLCAoRnJlZUltYWdlX0dldENvbG9yVHlwZShkaWIpID09IEZJQ19SR0JBTFBIQSkpOworCisJCQkJcmV0dXJuIGRpYjsKKwkJCX0KKwkJfQorCX0gY2F0Y2goY29uc3QgY2hhciAqbWVzc2FnZSkgewkKKwkJaWYoZGliKQorCQkJRnJlZUltYWdlX1VubG9hZChkaWIpOworCisJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhzX2Zvcm1hdF9pZCwgbWVzc2FnZSk7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFBsdWdpbiBJbXBsZW1lbnRhdGlvbgorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgorRm9ybWF0KCkgeworCXJldHVybiAiQk1QIjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKK0Rlc2NyaXB0aW9uKCkgeworCXJldHVybiAiV2luZG93cyBvciBPUy8yIEJpdG1hcCI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCitFeHRlbnNpb24oKSB7CisJcmV0dXJuICJibXAiOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgorUmVnRXhwcigpIHsKKwlyZXR1cm4gIl5CTSI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCitNaW1lVHlwZSgpIHsKKwlyZXR1cm4gImltYWdlL2JtcCI7Cit9CisKK3N0YXRpYyBCT09MIERMTF9DQUxMQ09OVgorVmFsaWRhdGUoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlKSB7CisJQllURSBibXBfc2lnbmF0dXJlMVtdID0geyAweDQyLCAweDREIH07CisJQllURSBibXBfc2lnbmF0dXJlMltdID0geyAweDQyLCAweDQxIH07CisJQllURSBzaWduYXR1cmVbMl0gPSB7IDAsIDAgfTsKKworCWlvLT5yZWFkX3Byb2Moc2lnbmF0dXJlLCAxLCBzaXplb2YoYm1wX3NpZ25hdHVyZTEpLCBoYW5kbGUpOworCisJaWYgKG1lbWNtcChibXBfc2lnbmF0dXJlMSwgc2lnbmF0dXJlLCBzaXplb2YoYm1wX3NpZ25hdHVyZTEpKSA9PSAwKQorCQlyZXR1cm4gVFJVRTsKKworCWlmIChtZW1jbXAoYm1wX3NpZ25hdHVyZTIsIHNpZ25hdHVyZSwgc2l6ZW9mKGJtcF9zaWduYXR1cmUyKSkgPT0gMCkKKwkJcmV0dXJuIFRSVUU7CisKKwlyZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBCT09MIERMTF9DQUxMQ09OVgorU3VwcG9ydHNFeHBvcnREZXB0aChpbnQgZGVwdGgpIHsKKwlyZXR1cm4gKAorCQkJKGRlcHRoID09IDEpIHx8CisJCQkoZGVwdGggPT0gNCkgfHwKKwkJCShkZXB0aCA9PSA4KSB8fAorCQkJKGRlcHRoID09IDE2KSB8fAorCQkJKGRlcHRoID09IDI0KSB8fAorCQkJKGRlcHRoID09IDMyKQorCQkpOworfQorCitzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYgCitTdXBwb3J0c0V4cG9ydFR5cGUoRlJFRV9JTUFHRV9UWVBFIHR5cGUpIHsKKwlyZXR1cm4gKHR5cGUgPT0gRklUX0JJVE1BUCkgPyBUUlVFIDogRkFMU0U7Cit9CisKK3N0YXRpYyBCT09MIERMTF9DQUxMQ09OVgorU3VwcG9ydHNOb1BpeGVscygpIHsKKwlyZXR1cm4gVFJVRTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgRklCSVRNQVAgKiBETExfQ0FMTENPTlYKK0xvYWQoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBpbnQgcGFnZSwgaW50IGZsYWdzLCB2b2lkICpkYXRhKSB7CisJaWYgKGhhbmRsZSAhPSBOVUxMKSB7CisJCUJJVE1BUEZJTEVIRUFERVIgYml0bWFwZmlsZWhlYWRlcjsKKwkJRFdPUkQgdHlwZSA9IDA7CisKKwkJLy8gd2UgdXNlIHRoaXMgb2Zmc2V0IHZhbHVlIHRvIG1ha2Ugc2VlbWluZ2x5IGFic29sdXRlIHNlZWtzIHJlbGF0aXZlIGluIHRoZSBmaWxlCisJCQorCQlsb25nIG9mZnNldF9pbl9maWxlID0gaW8tPnRlbGxfcHJvYyhoYW5kbGUpOworCisJCS8vIHJlYWQgdGhlIGZpbGVoZWFkZXIKKworCQlpby0+cmVhZF9wcm9jKCZiaXRtYXBmaWxlaGVhZGVyLCBzaXplb2YoQklUTUFQRklMRUhFQURFUiksIDEsIGhhbmRsZSk7CisjaWZkZWYgRlJFRUlNQUdFX0JJR0VORElBTgorCQlTd2FwRmlsZUhlYWRlcigmYml0bWFwZmlsZWhlYWRlcik7CisjZW5kaWYKKworCQkvLyBjaGVjayB0aGUgc2lnbmF0dXJlCisKKwkJaWYoKGJpdG1hcGZpbGVoZWFkZXIuYmZUeXBlICE9IDB4NEQ0MikgJiYgKGJpdG1hcGZpbGVoZWFkZXIuYmZUeXBlICE9IDB4NDE0MikpIHsKKwkJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhzX2Zvcm1hdF9pZCwgRklfTVNHX0VSUk9SX01BR0lDX05VTUJFUik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCS8vIHJlYWQgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIGluZm9oZWFkZXIKKworCQlpby0+cmVhZF9wcm9jKCZ0eXBlLCBzaXplb2YoRFdPUkQpLCAxLCBoYW5kbGUpOworCQlpby0+c2Vla19wcm9jKGhhbmRsZSwgMCAtIChsb25nKXNpemVvZihEV09SRCksIFNFRUtfQ1VSKTsKKyNpZmRlZiBGUkVFSU1BR0VfQklHRU5ESUFOCisJCVN3YXBMb25nKCZ0eXBlKTsKKyNlbmRpZgorCisJCS8vIGNhbGwgdGhlIGFwcHJvcHJpYXRlIGxvYWQgZnVuY3Rpb24gZm9yIHRoZSBmb3VuZCBiaXRtYXAgdHlwZQorCisJCXN3aXRjaCh0eXBlKSB7CisJCQljYXNlIDEyOgorCQkJCS8vIE9TLzIgYW5kIGFsc28gYWxsIFdpbmRvd3MgdmVyc2lvbnMgc2luY2UgV2luZG93cyAzLjAKKwkJCQlyZXR1cm4gTG9hZE9TMjFYQk1QKGlvLCBoYW5kbGUsIGZsYWdzLCBvZmZzZXRfaW5fZmlsZSArIGJpdG1hcGZpbGVoZWFkZXIuYmZPZmZCaXRzKTsKKworCQkJY2FzZSA2NDoKKwkJCQkvLyBPUy8yCisJCQkJcmV0dXJuIExvYWRPUzIyWEJNUChpbywgaGFuZGxlLCBmbGFncywgb2Zmc2V0X2luX2ZpbGUgKyBiaXRtYXBmaWxlaGVhZGVyLmJmT2ZmQml0cyk7CisKKwkJCWNhc2UgNDA6CS8vIEJJVE1BUElORk9IRUFERVIgLSBhbGwgV2luZG93cyB2ZXJzaW9ucyBzaW5jZSBXaW5kb3dzIDMuMAorCQkJY2FzZSA1MjoJLy8gQklUTUFQVjJJTkZPSEVBREVSICh1bmRvY3VtZW50ZWQsIHBhcnRpYWxseSBzdXBwb3J0ZWQpCisJCQljYXNlIDU2OgkvLyBCSVRNQVBWM0lORk9IRUFERVIgKHVuZG9jdW1lbnRlZCwgcGFydGlhbGx5IHN1cHBvcnRlZCkKKwkJCWNhc2UgMTA4OgkvLyBCSVRNQVBWNEhFQURFUiAtIGFsbCBXaW5kb3dzIHZlcnNpb25zIHNpbmNlIFdpbmRvd3MgOTUvTlQ0IChwYXJ0aWFsbHkgc3VwcG9ydGVkKQorCQkJY2FzZSAxMjQ6CS8vIEJJVE1BUFY1SEVBREVSIC0gV2luZG93cyA5OC8yMDAwIGFuZCBuZXdlciAocGFydGlhbGx5IHN1cHBvcnRlZCkKKwkJCQlyZXR1cm4gTG9hZFdpbmRvd3NCTVAoaW8sIGhhbmRsZSwgZmxhZ3MsIG9mZnNldF9pbl9maWxlICsgYml0bWFwZmlsZWhlYWRlci5iZk9mZkJpdHMsIHR5cGUpOworCisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQl9CisKKwkJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKHNfZm9ybWF0X2lkLCAidW5rbm93biBibXAgc3VidHlwZSB3aXRoIGlkICVkIiwgdHlwZSk7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoqCitFbmNvZGUgYSA4LWJpdCBzb3VyY2UgYnVmZmVyIGludG8gYSA4LWJpdCB0YXJnZXQgYnVmZmVyIHVzaW5nIGEgUkxFIGNvbXByZXNzaW9uIGFsZ29yaXRobS4gCitUaGUgc2l6ZSBvZiB0aGUgdGFyZ2V0IGJ1ZmZlciBtdXN0IGJlIGVxdWFsIHRvIHRoZSBzaXplIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiAKK09uIHJldHVybiwgdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRoZSByZWFsIHNpemUgb2YgdGhlIHRhcmdldCBidWZmZXIsIHdoaWNoIHNob3VsZCBiZSBsZXNzIHRoYXQgb3IgZXF1YWwgdG8gdGhlIHNvdXJjZSBidWZmZXIgc2l6ZS4gCitAcGFyYW0gdGFyZ2V0IDgtYml0IFRhcmdldCBidWZmZXIKK0BwYXJhbSBzb3VyY2UgOC1iaXQgU291cmNlIGJ1ZmZlcgorQHBhcmFtIHNpemUgU291cmNlL1RhcmdldCBpbnB1dCBidWZmZXIgc2l6ZQorQHJldHVybiBSZXR1cm5zIHRoZSB0YXJnZXQgYnVmZmVyIHNpemUKKyovCitzdGF0aWMgaW50CitSTEVFbmNvZGVMaW5lKEJZVEUgKnRhcmdldCwgQllURSAqc291cmNlLCBpbnQgc2l6ZSkgeworCUJZVEUgYnVmZmVyWzI1Nl07CisJaW50IGJ1ZmZlcl9zaXplID0gMDsKKwlpbnQgdGFyZ2V0X3BvcyA9IDA7CisKKwlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworCQlpZiAoKGkgPCBzaXplIC0gMSkgJiYgKHNvdXJjZVtpXSA9PSBzb3VyY2VbaSArIDFdKSkgeworCQkJLy8gZmluZCBhIHNvbGlkIGJsb2NrIG9mIHNhbWUgYnl0ZXMKKworCQkJaW50IGogPSBpICsgMTsKKwkJCWludCBqbWF4ID0gMjU0ICsgaTsKKworCQkJd2hpbGUgKChqIDwgc2l6ZSAtIDEpICYmIChqIDwgam1heCkgJiYgKHNvdXJjZVtqXSA9PSBzb3VyY2VbaiArIDFdKSkKKwkJCQkrK2o7CisKKwkJCS8vIGlmIHRoZSBibG9jayBpcyBsYXJnZXIgdGhhbiAzIGJ5dGVzLCB1c2UgaXQKKwkJCS8vIGVsc2UgcHV0IHRoZSBkYXRhIGludG8gdGhlIGxhcmdlciBwb29sCisKKwkJCWlmICgoKGogLSBpKSArIDEpID4gMykgeworCQkJCS8vIGRvbid0IGZvcmdldCB0byB3cml0ZSB3aGF0IHdlIGFscmVhZHkgaGF2ZSBpbiB0aGUgYnVmZmVyCisKKwkJCQlzd2l0Y2goYnVmZmVyX3NpemUpIHsKKwkJCQkJY2FzZSAwIDoKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgUkxFX0RFTFRBIDoKKwkJCQkJCXRhcmdldFt0YXJnZXRfcG9zKytdID0gMTsKKwkJCQkJCXRhcmdldFt0YXJnZXRfcG9zKytdID0gYnVmZmVyWzBdOworCQkJCQkJdGFyZ2V0W3RhcmdldF9wb3MrK10gPSAxOworCQkJCQkJdGFyZ2V0W3RhcmdldF9wb3MrK10gPSBidWZmZXJbMV07CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIFJMRV9FTkRPRkJJVE1BUCA6CisJCQkJCQl0YXJnZXRbdGFyZ2V0X3BvcysrXSA9IChCWVRFKWJ1ZmZlcl9zaXplOworCQkJCQkJdGFyZ2V0W3RhcmdldF9wb3MrK10gPSBidWZmZXJbMF07CisJCQkJCQlicmVhazsKKworCQkJCQlkZWZhdWx0IDoKKwkJCQkJCXRhcmdldFt0YXJnZXRfcG9zKytdID0gUkxFX0NPTU1BTkQ7CisJCQkJCQl0YXJnZXRbdGFyZ2V0X3BvcysrXSA9IChCWVRFKWJ1ZmZlcl9zaXplOworCQkJCQkJbWVtY3B5KHRhcmdldCArIHRhcmdldF9wb3MsIGJ1ZmZlciwgYnVmZmVyX3NpemUpOworCisJCQkJCQkvLyBwcmVwYXJlIGZvciBuZXh0IHJ1bgorCQkJCQkJCisJCQkJCQl0YXJnZXRfcG9zICs9IGJ1ZmZlcl9zaXplOworCisJCQkJCQlpZiAoKGJ1ZmZlcl9zaXplICYgMSkgPT0gMSkKKwkJCQkJCQl0YXJnZXRfcG9zKys7CisKKwkJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIHdyaXRlIHRoZSBjb250aW51b3VzIGRhdGEKKworCQkJCXRhcmdldFt0YXJnZXRfcG9zKytdID0gKEJZVEUpKChqIC0gaSkgKyAxKTsKKwkJCQl0YXJnZXRbdGFyZ2V0X3BvcysrXSA9IHNvdXJjZVtpXTsKKworCQkJCWJ1ZmZlcl9zaXplID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJZm9yIChpbnQgayA9IDA7IGsgPCAoaiAtIGkpICsgMTsgKytrKSB7CisJCQkJCWJ1ZmZlcltidWZmZXJfc2l6ZSsrXSA9IHNvdXJjZVtpICsga107CisKKwkJCQkJaWYgKGJ1ZmZlcl9zaXplID09IDI1NCkgeworCQkJCQkJLy8gd3JpdGUgd2hhdCB3ZSBoYXZlCisKKwkJCQkJCXRhcmdldFt0YXJnZXRfcG9zKytdID0gUkxFX0NPTU1BTkQ7CisJCQkJCQl0YXJnZXRbdGFyZ2V0X3BvcysrXSA9IChCWVRFKWJ1ZmZlcl9zaXplOworCQkJCQkJbWVtY3B5KHRhcmdldCArIHRhcmdldF9wb3MsIGJ1ZmZlciwgYnVmZmVyX3NpemUpOworCisJCQkJCQkvLyBwcmVwYXJlIGZvciBuZXh0IHJ1bgorCisJCQkJCQl0YXJnZXRfcG9zICs9IGJ1ZmZlcl9zaXplOworCQkJCQkJYnVmZmVyX3NpemUgPSAwOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlpID0gajsKKwkJfSBlbHNlIHsKKwkJCWJ1ZmZlcltidWZmZXJfc2l6ZSsrXSA9IHNvdXJjZVtpXTsKKwkJfQorCisJCS8vIHdyaXRlIHRoZSBidWZmZXIgaWYgaXQncyBmdWxsCisKKwkJaWYgKGJ1ZmZlcl9zaXplID09IDI1NCkgeworCQkJdGFyZ2V0W3RhcmdldF9wb3MrK10gPSBSTEVfQ09NTUFORDsKKwkJCXRhcmdldFt0YXJnZXRfcG9zKytdID0gKEJZVEUpYnVmZmVyX3NpemU7CisJCQltZW1jcHkodGFyZ2V0ICsgdGFyZ2V0X3BvcywgYnVmZmVyLCBidWZmZXJfc2l6ZSk7CisKKwkJCS8vIHByZXBhcmUgZm9yIG5leHQgcnVuCisKKwkJCXRhcmdldF9wb3MgKz0gYnVmZmVyX3NpemU7CisJCQlidWZmZXJfc2l6ZSA9IDA7CisJCX0KKwl9CisKKwkvLyB3cml0ZSB0aGUgbGFzdCBieXRlcworCisJc3dpdGNoKGJ1ZmZlcl9zaXplKSB7CisJCWNhc2UgMCA6CisJCQlicmVhazsKKworCQljYXNlIFJMRV9ERUxUQSA6CisJCQl0YXJnZXRbdGFyZ2V0X3BvcysrXSA9IDE7CisJCQl0YXJnZXRbdGFyZ2V0X3BvcysrXSA9IGJ1ZmZlclswXTsKKwkJCXRhcmdldFt0YXJnZXRfcG9zKytdID0gMTsKKwkJCXRhcmdldFt0YXJnZXRfcG9zKytdID0gYnVmZmVyWzFdOworCQkJYnJlYWs7CisKKwkJY2FzZSBSTEVfRU5ET0ZCSVRNQVAgOgorCQkJdGFyZ2V0W3RhcmdldF9wb3MrK10gPSAoQllURSlidWZmZXJfc2l6ZTsKKwkJCXRhcmdldFt0YXJnZXRfcG9zKytdID0gYnVmZmVyWzBdOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdCA6CisJCQl0YXJnZXRbdGFyZ2V0X3BvcysrXSA9IFJMRV9DT01NQU5EOworCQkJdGFyZ2V0W3RhcmdldF9wb3MrK10gPSAoQllURSlidWZmZXJfc2l6ZTsKKwkJCW1lbWNweSh0YXJnZXQgKyB0YXJnZXRfcG9zLCBidWZmZXIsIGJ1ZmZlcl9zaXplKTsKKworCQkJLy8gcHJlcGFyZSBmb3IgbmV4dCBydW4KKwkJCQorCQkJdGFyZ2V0X3BvcyArPSBidWZmZXJfc2l6ZTsKKworCQkJaWYgKChidWZmZXJfc2l6ZSAmIDEpID09IDEpCisJCQkJdGFyZ2V0X3BvcysrOworCisJCQlicmVhazsJCQkKKwl9CisKKwkvLyB3cml0ZSB0aGUgRU5EX09GX0xJTkUgbWFya2VyCisKKwl0YXJnZXRbdGFyZ2V0X3BvcysrXSA9IFJMRV9DT01NQU5EOworCXRhcmdldFt0YXJnZXRfcG9zKytdID0gUkxFX0VORE9GTElORTsKKworCS8vIHJldHVybiB0aGUgd3JpdHRlbiBzaXplCisKKwlyZXR1cm4gdGFyZ2V0X3BvczsKK30KKworc3RhdGljIEJPT0wgRExMX0NBTExDT05WCitTYXZlKEZyZWVJbWFnZUlPICppbywgRklCSVRNQVAgKmRpYiwgZmlfaGFuZGxlIGhhbmRsZSwgaW50IHBhZ2UsIGludCBmbGFncywgdm9pZCAqZGF0YSkgeworCWlmICgoZGliICE9IE5VTEwpICYmIChoYW5kbGUgIT0gTlVMTCkpIHsKKwkJLy8gd3JpdGUgdGhlIGZpbGUgaGVhZGVyCisKKwkJQklUTUFQRklMRUhFQURFUiBiaXRtYXBmaWxlaGVhZGVyOworCQliaXRtYXBmaWxlaGVhZGVyLmJmVHlwZSA9IDB4NEQ0MjsKKwkJYml0bWFwZmlsZWhlYWRlci5iZk9mZkJpdHMgPSBzaXplb2YoQklUTUFQRklMRUhFQURFUikgKyBzaXplb2YoQklUTUFQSU5GT0hFQURFUikgKyBGcmVlSW1hZ2VfR2V0Q29sb3JzVXNlZChkaWIpICogc2l6ZW9mKFJHQlFVQUQpOworCQliaXRtYXBmaWxlaGVhZGVyLmJmU2l6ZSA9IGJpdG1hcGZpbGVoZWFkZXIuYmZPZmZCaXRzICsgRnJlZUltYWdlX0dldEhlaWdodChkaWIpICogRnJlZUltYWdlX0dldFBpdGNoKGRpYik7CisJCWJpdG1hcGZpbGVoZWFkZXIuYmZSZXNlcnZlZDEgPSAwOworCQliaXRtYXBmaWxlaGVhZGVyLmJmUmVzZXJ2ZWQyID0gMDsKKworCQkvLyB0YWtlIGNhcmUgb2YgdGhlIGJpdCBmaWVsZHMgZGF0YSBvZiBhbnkKKworCQlib29sIGJpdF9maWVsZHMgPSAoRnJlZUltYWdlX0dldEJQUChkaWIpID09IDE2KTsKKworCQlpZiAoYml0X2ZpZWxkcykgeworCQkJYml0bWFwZmlsZWhlYWRlci5iZlNpemUgKz0gMyAqIHNpemVvZihEV09SRCk7CisJCQliaXRtYXBmaWxlaGVhZGVyLmJmT2ZmQml0cyArPSAzICogc2l6ZW9mKERXT1JEKTsKKwkJfQorCisjaWZkZWYgRlJFRUlNQUdFX0JJR0VORElBTgorCQlTd2FwRmlsZUhlYWRlcigmYml0bWFwZmlsZWhlYWRlcik7CisjZW5kaWYKKwkJaWYgKGlvLT53cml0ZV9wcm9jKCZiaXRtYXBmaWxlaGVhZGVyLCBzaXplb2YoQklUTUFQRklMRUhFQURFUiksIDEsIGhhbmRsZSkgIT0gMSkKKwkJCXJldHVybiBGQUxTRTsJCQorCisJCS8vIHVwZGF0ZSB0aGUgYml0bWFwIGluZm8gaGVhZGVyCisKKwkJQklUTUFQSU5GT0hFQURFUiBiaWg7CisJCW1lbWNweSgmYmloLCBGcmVlSW1hZ2VfR2V0SW5mb0hlYWRlcihkaWIpLCBzaXplb2YoQklUTUFQSU5GT0hFQURFUikpOworCisJCWlmIChiaXRfZmllbGRzKQorCQkJYmloLmJpQ29tcHJlc3Npb24gPSBCSV9CSVRGSUVMRFM7CisJCWVsc2UgaWYgKChiaWguYmlCaXRDb3VudCA9PSA4KSAmJiAoZmxhZ3MgJiBCTVBfU0FWRV9STEUpKQorCQkJYmloLmJpQ29tcHJlc3Npb24gPSBCSV9STEU4OworCQllbHNlCisJCQliaWguYmlDb21wcmVzc2lvbiA9IEJJX1JHQjsKKworCQkvLyB3cml0ZSB0aGUgYml0bWFwIGluZm8gaGVhZGVyCisKKyNpZmRlZiBGUkVFSU1BR0VfQklHRU5ESUFOCisJCVN3YXBJbmZvSGVhZGVyKCZiaWgpOworI2VuZGlmCisJCWlmIChpby0+d3JpdGVfcHJvYygmYmloLCBzaXplb2YoQklUTUFQSU5GT0hFQURFUiksIDEsIGhhbmRsZSkgIT0gMSkKKwkJCXJldHVybiBGQUxTRTsKKworCQkvLyB3cml0ZSB0aGUgYml0IGZpZWxkcyB3aGVuIHdlIGFyZSBkZWFsaW5nIHdpdGggYSAxNiBiaXQgQk1QCisKKwkJaWYgKGJpdF9maWVsZHMpIHsKKwkJCURXT1JEIGQ7CisKKwkJCWQgPSBGcmVlSW1hZ2VfR2V0UmVkTWFzayhkaWIpOworCisJCQlpZiAoaW8tPndyaXRlX3Byb2MoJmQsIHNpemVvZihEV09SRCksIDEsIGhhbmRsZSkgIT0gMSkKKwkJCQlyZXR1cm4gRkFMU0U7CisKKwkJCWQgPSBGcmVlSW1hZ2VfR2V0R3JlZW5NYXNrKGRpYik7CisKKwkJCWlmIChpby0+d3JpdGVfcHJvYygmZCwgc2l6ZW9mKERXT1JEKSwgMSwgaGFuZGxlKSAhPSAxKQorCQkJCXJldHVybiBGQUxTRTsKKworCQkJZCA9IEZyZWVJbWFnZV9HZXRCbHVlTWFzayhkaWIpOworCisJCQlpZiAoaW8tPndyaXRlX3Byb2MoJmQsIHNpemVvZihEV09SRCksIDEsIGhhbmRsZSkgIT0gMSkKKwkJCQlyZXR1cm4gRkFMU0U7CisJCX0KKworCQkvLyB3cml0ZSB0aGUgcGFsZXR0ZQorCisJCWlmIChGcmVlSW1hZ2VfR2V0UGFsZXR0ZShkaWIpICE9IE5VTEwpIHsKKwkJCVJHQlFVQUQgKnBhbCA9IEZyZWVJbWFnZV9HZXRQYWxldHRlKGRpYik7CisJCQlGSUxFX0JHUkEgYmdyYTsKKwkJCWZvcih1bnNpZ25lZCBpID0gMDsgaSA8IEZyZWVJbWFnZV9HZXRDb2xvcnNVc2VkKGRpYik7IGkrKyApIHsKKwkJCQliZ3JhLmIgPSBwYWxbaV0ucmdiQmx1ZTsKKwkJCQliZ3JhLmcgPSBwYWxbaV0ucmdiR3JlZW47CisJCQkJYmdyYS5yID0gcGFsW2ldLnJnYlJlZDsKKwkJCQliZ3JhLmEgPSBwYWxbaV0ucmdiUmVzZXJ2ZWQ7CisJCQkJaWYgKGlvLT53cml0ZV9wcm9jKCZiZ3JhLCBzaXplb2YoRklMRV9CR1JBKSwgMSwgaGFuZGxlKSAhPSAxKQorCQkJCQlyZXR1cm4gRkFMU0U7CisJCQl9CisJCX0KKworCQkvLyB3cml0ZSB0aGUgYml0bWFwIGRhdGEuLi4gaWYgUkxFIGNvbXByZXNzaW9uIGlzIGVuYWJsZSwgdXNlIGl0CisKKwkJdW5zaWduZWQgYnBwID0gRnJlZUltYWdlX0dldEJQUChkaWIpOworCQlpZiAoKGJwcCA9PSA4KSAmJiAoZmxhZ3MgJiBCTVBfU0FWRV9STEUpKSB7CisJCQlCWVRFICpidWZmZXIgPSAoQllURSopbWFsbG9jKEZyZWVJbWFnZV9HZXRQaXRjaChkaWIpICogMiAqIHNpemVvZihCWVRFKSk7CisKKwkJCWZvciAoRFdPUkQgaSA9IDA7IGkgPCBGcmVlSW1hZ2VfR2V0SGVpZ2h0KGRpYik7ICsraSkgeworCQkJCWludCBzaXplID0gUkxFRW5jb2RlTGluZShidWZmZXIsIEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIGkpLCBGcmVlSW1hZ2VfR2V0TGluZShkaWIpKTsKKworCQkJCWlmIChpby0+d3JpdGVfcHJvYyhidWZmZXIsIHNpemUsIDEsIGhhbmRsZSkgIT0gMSkgeworCQkJCQlmcmVlKGJ1ZmZlcik7CisJCQkJCXJldHVybiBGQUxTRTsKKwkJCQl9CisJCQl9CisKKwkJCWJ1ZmZlclswXSA9IFJMRV9DT01NQU5EOworCQkJYnVmZmVyWzFdID0gUkxFX0VORE9GQklUTUFQOworCisJCQlpZiAoaW8tPndyaXRlX3Byb2MoYnVmZmVyLCAyLCAxLCBoYW5kbGUpICE9IDEpIHsKKwkJCQlmcmVlKGJ1ZmZlcik7CisJCQkJcmV0dXJuIEZBTFNFOworCQkJfQorCisJCQlmcmVlKGJ1ZmZlcik7CisjaWZkZWYgRlJFRUlNQUdFX0JJR0VORElBTgorCQl9IGVsc2UgaWYgKGJwcCA9PSAxNikgeworCQkJaW50IHBhZGRpbmcgPSBGcmVlSW1hZ2VfR2V0UGl0Y2goZGliKSAtIEZyZWVJbWFnZV9HZXRXaWR0aChkaWIpICogc2l6ZW9mKFdPUkQpOworCQkJV09SRCBwYWQgPSAwOworCQkJV09SRCBwaXhlbDsKKwkJCWZvcih1bnNpZ25lZCB5ID0gMDsgeSA8IEZyZWVJbWFnZV9HZXRIZWlnaHQoZGliKTsgeSsrKSB7CisJCQkJQllURSAqbGluZSA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIHkpOworCQkJCWZvcih1bnNpZ25lZCB4ID0gMDsgeCA8IEZyZWVJbWFnZV9HZXRXaWR0aChkaWIpOyB4KyspIHsKKwkJCQkJcGl4ZWwgPSAoKFdPUkQgKilsaW5lKVt4XTsKKwkJCQkJU3dhcFNob3J0KCZwaXhlbCk7CisJCQkJCWlmIChpby0+d3JpdGVfcHJvYygmcGl4ZWwsIHNpemVvZihXT1JEKSwgMSwgaGFuZGxlKSAhPSAxKQorCQkJCQkJcmV0dXJuIEZBTFNFOworCQkJCX0KKwkJCQlpZihwYWRkaW5nICE9IDApIHsKKwkJCQkJaWYoaW8tPndyaXRlX3Byb2MoJnBhZCwgcGFkZGluZywgMSwgaGFuZGxlKSAhPSAxKSB7CisJCQkJCQlyZXR1cm4gRkFMU0U7CQkJCQorCQkJCQl9CisJCQkJfQorCQkJfQorI2VuZGlmCisjaWYgRlJFRUlNQUdFX0NPTE9ST1JERVIgPT0gRlJFRUlNQUdFX0NPTE9ST1JERVJfUkdCCisJCX0gZWxzZSBpZiAoYnBwID09IDI0KSB7CisJCQlpbnQgcGFkZGluZyA9IEZyZWVJbWFnZV9HZXRQaXRjaChkaWIpIC0gRnJlZUltYWdlX0dldFdpZHRoKGRpYikgKiBzaXplb2YoRklMRV9CR1IpOworCQkJRFdPUkQgcGFkID0gMDsKKwkJCUZJTEVfQkdSIGJncjsKKwkJCWZvcih1bnNpZ25lZCB5ID0gMDsgeSA8IEZyZWVJbWFnZV9HZXRIZWlnaHQoZGliKTsgeSsrKSB7CisJCQkJQllURSAqbGluZSA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIHkpOworCQkJCWZvcih1bnNpZ25lZCB4ID0gMDsgeCA8IEZyZWVJbWFnZV9HZXRXaWR0aChkaWIpOyB4KyspIHsKKwkJCQkJUkdCVFJJUExFICp0cmlwbGUgPSAoKFJHQlRSSVBMRSAqKWxpbmUpK3g7CisJCQkJCWJnci5iID0gdHJpcGxlLT5yZ2J0Qmx1ZTsKKwkJCQkJYmdyLmcgPSB0cmlwbGUtPnJnYnRHcmVlbjsKKwkJCQkJYmdyLnIgPSB0cmlwbGUtPnJnYnRSZWQ7CisJCQkJCWlmIChpby0+d3JpdGVfcHJvYygmYmdyLCBzaXplb2YoRklMRV9CR1IpLCAxLCBoYW5kbGUpICE9IDEpCisJCQkJCQlyZXR1cm4gRkFMU0U7CisJCQkJfQorCQkJCWlmKHBhZGRpbmcgIT0gMCkgeworCQkJCQlpZihpby0+d3JpdGVfcHJvYygmcGFkLCBwYWRkaW5nLCAxLCBoYW5kbGUpICE9IDEpIHsKKwkJCQkJCXJldHVybiBGQUxTRTsJCQkJCQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9IGVsc2UgaWYgKGJwcCA9PSAzMikgeworCQkJRklMRV9CR1JBIGJncmE7CisJCQlmb3IodW5zaWduZWQgeSA9IDA7IHkgPCBGcmVlSW1hZ2VfR2V0SGVpZ2h0KGRpYik7IHkrKykgeworCQkJCUJZVEUgKmxpbmUgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCB5KTsKKwkJCQlmb3IodW5zaWduZWQgeCA9IDA7IHggPCBGcmVlSW1hZ2VfR2V0V2lkdGgoZGliKTsgeCsrKSB7CisJCQkJCVJHQlFVQUQgKnF1YWQgPSAoKFJHQlFVQUQgKilsaW5lKSt4OworCQkJCQliZ3JhLmIgPSBxdWFkLT5yZ2JCbHVlOworCQkJCQliZ3JhLmcgPSBxdWFkLT5yZ2JHcmVlbjsKKwkJCQkJYmdyYS5yID0gcXVhZC0+cmdiUmVkOworCQkJCQliZ3JhLmEgPSBxdWFkLT5yZ2JSZXNlcnZlZDsKKwkJCQkJaWYgKGlvLT53cml0ZV9wcm9jKCZiZ3JhLCBzaXplb2YoRklMRV9CR1JBKSwgMSwgaGFuZGxlKSAhPSAxKQorCQkJCQkJcmV0dXJuIEZBTFNFOworCQkJCX0KKwkJCX0KKyNlbmRpZgorCQl9IGVsc2UgaWYgKGlvLT53cml0ZV9wcm9jKEZyZWVJbWFnZV9HZXRCaXRzKGRpYiksIEZyZWVJbWFnZV9HZXRIZWlnaHQoZGliKSAqIEZyZWVJbWFnZV9HZXRQaXRjaChkaWIpLCAxLCBoYW5kbGUpICE9IDEpIHsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCisJCXJldHVybiBUUlVFOworCX0gZWxzZSB7CisJCXJldHVybiBGQUxTRTsKKwl9Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICAgSW5pdAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit2b2lkIERMTF9DQUxMQ09OVgorSW5pdEJNUChQbHVnaW4gKnBsdWdpbiwgaW50IGZvcm1hdF9pZCkgeworCXNfZm9ybWF0X2lkID0gZm9ybWF0X2lkOworCisJcGx1Z2luLT5mb3JtYXRfcHJvYyA9IEZvcm1hdDsKKwlwbHVnaW4tPmRlc2NyaXB0aW9uX3Byb2MgPSBEZXNjcmlwdGlvbjsKKwlwbHVnaW4tPmV4dGVuc2lvbl9wcm9jID0gRXh0ZW5zaW9uOworCXBsdWdpbi0+cmVnZXhwcl9wcm9jID0gUmVnRXhwcjsKKwlwbHVnaW4tPm9wZW5fcHJvYyA9IE5VTEw7CisJcGx1Z2luLT5jbG9zZV9wcm9jID0gTlVMTDsKKwlwbHVnaW4tPnBhZ2Vjb3VudF9wcm9jID0gTlVMTDsKKwlwbHVnaW4tPnBhZ2VjYXBhYmlsaXR5X3Byb2MgPSBOVUxMOworCXBsdWdpbi0+bG9hZF9wcm9jID0gTG9hZDsKKwlwbHVnaW4tPnNhdmVfcHJvYyA9IFNhdmU7CisJcGx1Z2luLT52YWxpZGF0ZV9wcm9jID0gVmFsaWRhdGU7CisJcGx1Z2luLT5taW1lX3Byb2MgPSBNaW1lVHlwZTsKKwlwbHVnaW4tPnN1cHBvcnRzX2V4cG9ydF9icHBfcHJvYyA9IFN1cHBvcnRzRXhwb3J0RGVwdGg7CisJcGx1Z2luLT5zdXBwb3J0c19leHBvcnRfdHlwZV9wcm9jID0gU3VwcG9ydHNFeHBvcnRUeXBlOworCXBsdWdpbi0+c3VwcG9ydHNfaWNjX3Byb2ZpbGVzX3Byb2MgPSBOVUxMOwkvLyBub3QgaW1wbGVtZW50ZWQgeWV0OworCXBsdWdpbi0+c3VwcG9ydHNfbm9fcGl4ZWxzX3Byb2MgPSBTdXBwb3J0c05vUGl4ZWxzOworfQpkaWZmIC0tZ2l0IGEvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9QbHVnaW5DVVQuY3BwIGIvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9QbHVnaW5DVVQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkY2QxNmIKLS0tIC9kZXYvbnVsbAorKysgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL1BsdWdpbkNVVC5jcHAKQEAgLTAsMCArMSwyNDAgQEAKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIENVVCBMb2FkZXIKKy8vCisvLyBEZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIGJ5CisvLyAtIEZsb3JpcyB2YW4gZGVuIEJlcmcgKGZsdmRiZXJnQHd4cy5ubCkKKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBGcmVlSW1hZ2UgMworLy8KKy8vIENPVkVSRUQgQ09ERSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWQorLy8gT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMKKy8vIFRIQVQgVEhFIENPVkVSRUQgQ09ERSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLy8gT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQKKy8vIENPREUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkgQ09WRVJFRCBDT0RFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QKKy8vIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZCisvLyBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMCisvLyBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GIEFOWSBDT1ZFUkVEIENPREUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSCisvLyBUSElTIERJU0NMQUlNRVIuCisvLworLy8gVXNlIGF0IHlvdXIgb3duIHJpc2shCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpbmNsdWRlICJGcmVlSW1hZ2UuaCIKKyNpbmNsdWRlICJVdGlsaXRpZXMuaCIKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICBDb25zdGFudHMgKyBoZWFkZXJzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZmRlZiBfV0lOMzIKKyNwcmFnbWEgcGFjayhwdXNoLCAxKQorI2Vsc2UKKyNwcmFnbWEgcGFjaygxKQorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHRhZ0NVVEhFQURFUiB7CisJV09SRCB3aWR0aDsKKwlXT1JEIGhlaWdodDsKKwlMT05HIGR1bW15OworfSBDVVRIRUFERVI7CisKKyNpZmRlZiBfV0lOMzIKKyNwcmFnbWEgcGFjayhwb3ApCisjZWxzZQorI3ByYWdtYSBwYWNrKCkKKyNlbmRpZgorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBQbHVnaW4gSW50ZXJmYWNlCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3N0YXRpYyBpbnQgc19mb3JtYXRfaWQ7CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFBsdWdpbiBJbXBsZW1lbnRhdGlvbgorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgorRm9ybWF0KCkgeworCXJldHVybiAiQ1VUIjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKK0Rlc2NyaXB0aW9uKCkgeworCXJldHVybiAiRHIuIEhhbG8iOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgorRXh0ZW5zaW9uKCkgeworCXJldHVybiAiY3V0IjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKK1JlZ0V4cHIoKSB7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCitNaW1lVHlwZSgpIHsKKwlyZXR1cm4gImltYWdlL3gtY3V0IjsKK30KKworc3RhdGljIEJPT0wgRExMX0NBTExDT05WCitWYWxpZGF0ZShGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUpIHsKKwlyZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBCT09MIERMTF9DQUxMQ09OVgorU3VwcG9ydHNFeHBvcnREZXB0aChpbnQgZGVwdGgpIHsKKwlyZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBCT09MIERMTF9DQUxMQ09OViAKK1N1cHBvcnRzRXhwb3J0VHlwZShGUkVFX0lNQUdFX1RZUEUgdHlwZSkgeworCXJldHVybiBGQUxTRTsKK30KKworc3RhdGljIEJPT0wgRExMX0NBTExDT05WCitTdXBwb3J0c05vUGl4ZWxzKCkgeworCXJldHVybiBUUlVFOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBGSUJJVE1BUCAqIERMTF9DQUxMQ09OVgorTG9hZChGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIGludCBwYWdlLCBpbnQgZmxhZ3MsIHZvaWQgKmRhdGEpIHsKKwlGSUJJVE1BUCAqZGliID0gTlVMTDsKKworCWlmKCFoYW5kbGUpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJdHJ5IHsKKwkJQ1VUSEVBREVSIGhlYWRlcjsJCQorCisJCUJPT0wgaGVhZGVyX29ubHkgPSAoZmxhZ3MgJiBGSUZfTE9BRF9OT1BJWEVMUykgPT0gRklGX0xPQURfTk9QSVhFTFM7CisKKwkJLy8gcmVhZCB0aGUgY3V0IGhlYWRlcgorCisJCWlmKGlvLT5yZWFkX3Byb2MoJmhlYWRlciwgMSwgc2l6ZW9mKENVVEhFQURFUiksIGhhbmRsZSkgIT0gc2l6ZW9mKENVVEhFQURFUikpIHsKKwkJCXRocm93IEZJX01TR19FUlJPUl9QQVJTSU5HOworCQl9CisKKyNpZmRlZiBGUkVFSU1BR0VfQklHRU5ESUFOCisJCVN3YXBTaG9ydCgoV09SRCAqKSZoZWFkZXIud2lkdGgpOworCQlTd2FwU2hvcnQoKFdPUkQgKikmaGVhZGVyLmhlaWdodCk7CisjZW5kaWYKKworCQlpZiAoKGhlYWRlci53aWR0aCA9PSAwKSB8fCAoaGVhZGVyLmhlaWdodCA9PSAwKSkgeworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQkvLyBhbGxvY2F0ZSBhIG5ldyBiaXRtYXAKKworCQlkaWIgPSBGcmVlSW1hZ2VfQWxsb2NhdGVIZWFkZXIoaGVhZGVyX29ubHksIGhlYWRlci53aWR0aCwgaGVhZGVyLmhlaWdodCwgOCk7CisKKwkJaWYgKGRpYiA9PSBOVUxMKSB7CisJCQl0aHJvdyBGSV9NU0dfRVJST1JfRElCX01FTU9SWTsKKwkJfQorCisJCS8vIHN0dWZmIGl0IHdpdGggYSBwYWxldHRlCisKKwkJUkdCUVVBRCAqcGFsZXR0ZSA9IEZyZWVJbWFnZV9HZXRQYWxldHRlKGRpYik7CisKKwkJZm9yIChpbnQgaiA9IDA7IGogPCAyNTY7ICsraikgeworCQkJcGFsZXR0ZVtqXS5yZ2JCbHVlID0gcGFsZXR0ZVtqXS5yZ2JHcmVlbiA9IHBhbGV0dGVbal0ucmdiUmVkID0gKEJZVEUpajsKKwkJfQorCQkKKwkJaWYoaGVhZGVyX29ubHkpIHsKKwkJCS8vIGhlYWRlciBvbmx5IG1vZGUKKwkJCXJldHVybiBkaWI7CisJCX0KKworCQkvLyB1bnBhY2sgdGhlIFJMRSBiaXRtYXAgYml0cworCisJCUJZVEUgKmJpdHMgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCBoZWFkZXIuaGVpZ2h0IC0gMSk7CisKKwkJdW5zaWduZWQgaSA9IDAsIGsgPSAwOworCQl1bnNpZ25lZCBwaXRjaCA9IEZyZWVJbWFnZV9HZXRQaXRjaChkaWIpOworCQl1bnNpZ25lZCBzaXplID0gaGVhZGVyLndpZHRoICogaGVhZGVyLmhlaWdodDsKKwkJQllURSBjb3VudCA9IDAsIHJ1biA9IDA7CisKKwkJd2hpbGUgKGkgPCBzaXplKSB7CisJCQlpZihpby0+cmVhZF9wcm9jKCZjb3VudCwgMSwgc2l6ZW9mKEJZVEUpLCBoYW5kbGUpICE9IDEpIHsKKwkJCQl0aHJvdyBGSV9NU0dfRVJST1JfUEFSU0lORzsKKwkJCX0KKworCQkJaWYgKGNvdW50ID09IDApIHsKKwkJCQlrID0gMDsKKwkJCQliaXRzIC09IHBpdGNoOworCisJCQkJLy8gcGFpbnQgc2hvcCBwcm8gYWRkcyB0d28gdXNlbGVzcyBieXRlcyBoZXJlLi4uCisKKwkJCQlpby0+cmVhZF9wcm9jKCZjb3VudCwgMSwgc2l6ZW9mKEJZVEUpLCBoYW5kbGUpOworCQkJCWlvLT5yZWFkX3Byb2MoJmNvdW50LCAxLCBzaXplb2YoQllURSksIGhhbmRsZSk7CisKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKGNvdW50ICYgMHg4MCkgeworCQkJCWNvdW50ICY9IH4oMHg4MCk7CisKKwkJCQlpZihpby0+cmVhZF9wcm9jKCZydW4sIDEsIHNpemVvZihCWVRFKSwgaGFuZGxlKSAhPSAxKSB7CisJCQkJCXRocm93IEZJX01TR19FUlJPUl9QQVJTSU5HOworCQkJCX0KKworCQkJCWlmKGsgKyBjb3VudCA8PSBoZWFkZXIud2lkdGgpIHsKKwkJCQkJbWVtc2V0KGJpdHMgKyBrLCBydW4sIGNvdW50KTsKKwkJCQl9IGVsc2UgeworCQkJCQl0aHJvdyBGSV9NU0dfRVJST1JfUEFSU0lORzsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmKGsgKyBjb3VudCA8PSBoZWFkZXIud2lkdGgpIHsKKwkJCQkJaWYoaW8tPnJlYWRfcHJvYygmYml0c1trXSwgY291bnQsIHNpemVvZihCWVRFKSwgaGFuZGxlKSAhPSAxKSB7CisJCQkJCQl0aHJvdyBGSV9NU0dfRVJST1JfUEFSU0lORzsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCXRocm93IEZJX01TR19FUlJPUl9QQVJTSU5HOworCQkJCX0KKwkJCX0KKworCQkJayArPSBjb3VudDsKKwkJCWkgKz0gY291bnQ7CisJCX0KKworCQlyZXR1cm4gZGliOworCisJfSBjYXRjaChjb25zdCBjaGFyKiB0ZXh0KSB7CisJCWlmKGRpYikgeworCQkJRnJlZUltYWdlX1VubG9hZChkaWIpOworCQl9CisJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhzX2Zvcm1hdF9pZCwgdGV4dCk7CisJCXJldHVybiBOVUxMOworCX0KK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gICBJbml0CisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3ZvaWQgRExMX0NBTExDT05WCitJbml0Q1VUKFBsdWdpbiAqcGx1Z2luLCBpbnQgZm9ybWF0X2lkKSB7CisJc19mb3JtYXRfaWQgPSBmb3JtYXRfaWQ7CisKKwlwbHVnaW4tPmZvcm1hdF9wcm9jID0gRm9ybWF0OworCXBsdWdpbi0+ZGVzY3JpcHRpb25fcHJvYyA9IERlc2NyaXB0aW9uOworCXBsdWdpbi0+ZXh0ZW5zaW9uX3Byb2MgPSBFeHRlbnNpb247CisJcGx1Z2luLT5yZWdleHByX3Byb2MgPSBSZWdFeHByOworCXBsdWdpbi0+b3Blbl9wcm9jID0gTlVMTDsKKwlwbHVnaW4tPmNsb3NlX3Byb2MgPSBOVUxMOworCXBsdWdpbi0+cGFnZWNvdW50X3Byb2MgPSBOVUxMOworCXBsdWdpbi0+cGFnZWNhcGFiaWxpdHlfcHJvYyA9IE5VTEw7CisJcGx1Z2luLT5sb2FkX3Byb2MgPSBMb2FkOworCXBsdWdpbi0+c2F2ZV9wcm9jID0gTlVMTDsKKwlwbHVnaW4tPnZhbGlkYXRlX3Byb2MgPSBWYWxpZGF0ZTsKKwlwbHVnaW4tPm1pbWVfcHJvYyA9IE1pbWVUeXBlOworCXBsdWdpbi0+c3VwcG9ydHNfZXhwb3J0X2JwcF9wcm9jID0gU3VwcG9ydHNFeHBvcnREZXB0aDsKKwlwbHVnaW4tPnN1cHBvcnRzX2V4cG9ydF90eXBlX3Byb2MgPSBTdXBwb3J0c0V4cG9ydFR5cGU7CisJcGx1Z2luLT5zdXBwb3J0c19pY2NfcHJvZmlsZXNfcHJvYyA9IE5VTEw7CisJcGx1Z2luLT5zdXBwb3J0c19ub19waXhlbHNfcHJvYyA9IFN1cHBvcnRzTm9QaXhlbHM7Cit9CmRpZmYgLS1naXQgYS9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL1BsdWdpbkREUy5jcHAgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL1BsdWdpbkREUy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM5OTQyMwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvUGx1Z2luRERTLmNwcApAQCAtMCwwICsxLDY1NSBAQAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRERTIExvYWRlcgorLy8KKy8vIERlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gYnkKKy8vIC0gVm9sa2VyIEfkcnRuZXIgKHZvbGtlcmdAZ214LmF0KQorLy8gLSBTaGVybWFuIFdpbGNveAorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZyZWVJbWFnZSAzCisvLworLy8gQ09WRVJFRCBDT0RFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZCisvLyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUworLy8gVEhBVCBUSEUgQ09WRVJFRCBDT0RFIElTIEZSRUUgT0YgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisvLyBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRAorLy8gQ09ERSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVAorLy8gVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GIEFOWSBORUNFU1NBUlkKKy8vIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwKKy8vIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIKKy8vIFRISVMgRElTQ0xBSU1FUi4KKy8vCisvLyBVc2UgYXQgeW91ciBvd24gcmlzayEKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2luY2x1ZGUgIkZyZWVJbWFnZS5oIgorI2luY2x1ZGUgIlV0aWxpdGllcy5oIgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgIERlZmluaXRpb25zIGZvciB0aGUgRERTIGZvcm1hdAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgX1dJTjMyCisjcHJhZ21hIHBhY2socHVzaCwgMSkKKyNlbHNlCisjcHJhZ21hIHBhY2soMSkKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB0YWdERFBJWEVMRk9STUFUIHsKKwlEV09SRCBkd1NpemU7CS8vIHNpemUgb2YgdGhpcyBzdHJ1Y3R1cmUgKG11c3QgYmUgMzIpCisJRFdPUkQgZHdGbGFnczsJLy8gc2VlIEREUEZfKgorCURXT1JEIGR3Rm91ckNDOworCURXT1JEIGR3UkdCQml0Q291bnQ7CS8vIFRvdGFsIG51bWJlciBvZiBiaXRzIGZvciBSR0IgZm9ybWF0cworCURXT1JEIGR3UkJpdE1hc2s7CisJRFdPUkQgZHdHQml0TWFzazsKKwlEV09SRCBkd0JCaXRNYXNrOworCURXT1JEIGR3UkdCQWxwaGFCaXRNYXNrOworfSBERFBJWEVMRk9STUFUOworCisvLyBESVJFQ1REUkFXIFBJWEVMRk9STUFUIEZMQUdTCitlbnVtIHsKKwlERFBGX0FMUEhBUElYRUxTID0gMHgwMDAwMDAwMWwsCS8vIHN1cmZhY2UgaGFzIGFscGhhIGNoYW5uZWwKKwlERFBGX0FMUEhBCQkgPSAweDAwMDAwMDAybCwJLy8gYWxwaGEgb25seQorCUREUEZfRk9VUkNDCQkgPSAweDAwMDAwMDA0bCwJLy8gRk9VUkNDIGF2YWlsYWJsZQorCUREUEZfUkdCCQkgPSAweDAwMDAwMDQwbAkvLyBSR0IoQSkgYml0bWFwCit9OworCit0eXBlZGVmIHN0cnVjdCB0YWdERENBUFMyIHsKKwlEV09SRCBkd0NhcHMxOwkvLyBaZXJvIG9yIG1vcmUgb2YgdGhlIEREU0NBUFNfKiBtZW1iZXJzCisJRFdPUkQgZHdDYXBzMjsJLy8gWmVybyBvciBtb3JlIG9mIHRoZSBERFNDQVBTMl8qIG1lbWJlcnMKKwlEV09SRCBkd1Jlc2VydmVkWzJdOworfSBERENBUFMyOworCisvLyBESVJFQ1REUkFXU1VSRkFDRSBDQVBBQklMSVRZIEZMQUdTCitlbnVtIHsKKwlERFNDQVBTX0FMUEhBCT0gMHgwMDAwMDAwMmwsIC8vIGFscGhhIG9ubHkgc3VyZmFjZQorCUREU0NBUFNfQ09NUExFWAk9IDB4MDAwMDAwMDhsLCAvLyBjb21wbGV4IHN1cmZhY2Ugc3RydWN0dXJlCisJRERTQ0FQU19URVhUVVJFCT0gMHgwMDAwMTAwMGwsIC8vIHVzZWQgYXMgdGV4dHVyZSAoc2hvdWxkIGFsd2F5cyBiZSBzZXQpCisJRERTQ0FQU19NSVBNQVAJPSAweDAwNDAwMDAwbCAgLy8gTWlwbWFwIHByZXNlbnQKK307CisKK2VudW0geworCUREU0NBUFMyX0NVQkVNQVAJCQk9IDB4MDAwMDAyMDBMLAorCUREU0NBUFMyX0NVQkVNQVBfUE9TSVRJVkVYCT0gMHgwMDAwMDQwMEwsCisJRERTQ0FQUzJfQ1VCRU1BUF9ORUdBVElWRVgJPSAweDAwMDAwODAwTCwKKwlERFNDQVBTMl9DVUJFTUFQX1BPU0lUSVZFWQk9IDB4MDAwMDEwMDBMLAorCUREU0NBUFMyX0NVQkVNQVBfTkVHQVRJVkVZCT0gMHgwMDAwMjAwMEwsCisJRERTQ0FQUzJfQ1VCRU1BUF9QT1NJVElWRVoJPSAweDAwMDA0MDAwTCwKKwlERFNDQVBTMl9DVUJFTUFQX05FR0FUSVZFWgk9IDB4MDAwMDgwMDBMLAorCUREU0NBUFMyX1ZPTFVNRQkJCQk9IDB4MDAyMDAwMDBMCit9OworCit0eXBlZGVmIHN0cnVjdCB0YWdERFNVUkZBQ0VERVNDMiB7CisJRFdPUkQgZHdTaXplOwkvLyBzaXplIG9mIHRoaXMgc3RydWN0dXJlIChtdXN0IGJlIDEyNCkKKwlEV09SRCBkd0ZsYWdzOwkvLyBjb21iaW5hdGlvbiBvZiB0aGUgRERTU18qIGZsYWdzCisJRFdPUkQgZHdIZWlnaHQ7CisJRFdPUkQgZHdXaWR0aDsKKwlEV09SRCBkd1BpdGNoT3JMaW5lYXJTaXplOworCURXT1JEIGR3RGVwdGg7CS8vIERlcHRoIG9mIGEgdm9sdW1lIHRleHR1cmUKKwlEV09SRCBkd01pcE1hcENvdW50OworCURXT1JEIGR3UmVzZXJ2ZWQxWzExXTsKKwlERFBJWEVMRk9STUFUIGRkcGZQaXhlbEZvcm1hdDsKKwlERENBUFMyIGRkc0NhcHM7CisJRFdPUkQgZHdSZXNlcnZlZDI7Cit9IEREU1VSRkFDRURFU0MyOworCitlbnVtIHsKKwlERFNEX0NBUFMJCQk9IDB4MDAwMDAwMDFsLAorCUREU0RfSEVJR0hUCQkJPSAweDAwMDAwMDAybCwKKwlERFNEX1dJVEgJCQk9IDB4MDAwMDAwMDRsLAorCUREU0RfUElUQ0gJCQk9IDB4MDAwMDAwMDhsLAorCUREU0RfQUxQSEFCSVRERVBUSCAgPSAweDAwMDAwMDgwbCwKKwlERFNEX1BJWEVMRk9STUFUCT0gMHgwMDAwMTAwMGwsCisJRERTRF9NSVBNQVBDT1VOVAk9IDB4MDAwMjAwMDBsLAorCUREU0RfTElORUFSU0laRQkJPSAweDAwMDgwMDAwbCwKKwlERFNEX0RFUFRICQkJPSAweDAwODAwMDAwbAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnRERTSEVBREVSIHsKKwlEV09SRCBkd01hZ2ljOwkJCS8vIEZPVVJDQzogIkREUyAiCisJRERTVVJGQUNFREVTQzIgc3VyZmFjZURlc2M7Cit9IEREU0hFQURFUjsKKworI2RlZmluZSBNQUtFRk9VUkNDKGNoMCwgY2gxLCBjaDIsIGNoMykgXAorCSgoRFdPUkQpKEJZVEUpKGNoMCkgfCAoKERXT1JEKShCWVRFKShjaDEpIDw8IDgpIHwgICBcCisgICAgKChEV09SRCkoQllURSkoY2gyKSA8PCAxNikgfCAoKERXT1JEKShCWVRFKShjaDMpIDw8IDI0ICkpCisKKyNkZWZpbmUgRk9VUkNDX0RYVDEJTUFLRUZPVVJDQygnRCcsJ1gnLCdUJywnMScpCisjZGVmaW5lIEZPVVJDQ19EWFQyCU1BS0VGT1VSQ0MoJ0QnLCdYJywnVCcsJzInKQorI2RlZmluZSBGT1VSQ0NfRFhUMwlNQUtFRk9VUkNDKCdEJywnWCcsJ1QnLCczJykKKyNkZWZpbmUgRk9VUkNDX0RYVDQJTUFLRUZPVVJDQygnRCcsJ1gnLCdUJywnNCcpCisjZGVmaW5lIEZPVVJDQ19EWFQ1CU1BS0VGT1VSQ0MoJ0QnLCdYJywnVCcsJzUnKQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgIFN0cnVjdHVyZXMgdXNlZCBieSBEWFQgdGV4dHVyZXMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBzdHJ1Y3QgdGFnQ29sb3I4ODg4IHsKKwlCWVRFIGI7CisJQllURSBnOworCUJZVEUgcjsKKwlCWVRFIGE7Cit9IENvbG9yODg4ODsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnQ29sb3I1NjUgeworCVdPUkQgYiA6IDU7CisJV09SRCBnIDogNjsKKwlXT1JEIHIgOiA1OworfSBDb2xvcjU2NTsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnRFhUQ29sQmxvY2sgeworCUNvbG9yNTY1IGNvbG9yc1syXTsKKwlCWVRFIHJvd1s0XTsKK30gRFhUQ29sQmxvY2s7CisKK3R5cGVkZWYgc3RydWN0IHRhZ0RYVEFscGhhQmxvY2tFeHBsaWNpdCB7CisJV09SRCByb3dbNF07Cit9IERYVEFscGhhQmxvY2tFeHBsaWNpdDsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnRFhUQWxwaGFCbG9jazNCaXRMaW5lYXIgeworCUJZVEUgYWxwaGFbMl07CisJQllURSBkYXRhWzZdOworfSBEWFRBbHBoYUJsb2NrM0JpdExpbmVhcjsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnRFhUMUJsb2NrCit7CisJRFhUQ29sQmxvY2sgY29sb3I7Cit9IERYVDFCbG9jazsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnRFhUM0Jsb2NrIHsJCS8vIGFsc28gdXNlZCBieSBkeHQyCisJRFhUQWxwaGFCbG9ja0V4cGxpY2l0IGFscGhhOworCURYVENvbEJsb2NrIGNvbG9yOworfSBEWFQzQmxvY2s7CisKK3R5cGVkZWYgc3RydWN0IHRhZ0RYVDVCbG9jayB7CQkvLyBhbHNvIHVzZWQgYnkgZHh0NAorCURYVEFscGhhQmxvY2szQml0TGluZWFyIGFscGhhOworCURYVENvbEJsb2NrIGNvbG9yOworfSBEWFQ1QmxvY2s7CisKKyNpZmRlZiBfV0lOMzIKKyMJcHJhZ21hIHBhY2socG9wKQorI2Vsc2UKKyMJcHJhZ21hIHBhY2soKQorI2VuZGlmCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgSW50ZXJuYWwgZnVuY3Rpb25zCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWZkZWYgRlJFRUlNQUdFX0JJR0VORElBTgorc3RhdGljIHZvaWQKK1N3YXBIZWFkZXIoRERTSEVBREVSICpoZWFkZXIpIHsKKwlTd2FwTG9uZygmaGVhZGVyLT5kd01hZ2ljKTsKKwlTd2FwTG9uZygmaGVhZGVyLT5zdXJmYWNlRGVzYy5kd1NpemUpOworCVN3YXBMb25nKCZoZWFkZXItPnN1cmZhY2VEZXNjLmR3RmxhZ3MpOworCVN3YXBMb25nKCZoZWFkZXItPnN1cmZhY2VEZXNjLmR3SGVpZ2h0KTsKKwlTd2FwTG9uZygmaGVhZGVyLT5zdXJmYWNlRGVzYy5kd1dpZHRoKTsKKwlTd2FwTG9uZygmaGVhZGVyLT5zdXJmYWNlRGVzYy5kd1BpdGNoT3JMaW5lYXJTaXplKTsKKwlTd2FwTG9uZygmaGVhZGVyLT5zdXJmYWNlRGVzYy5kd0RlcHRoKTsKKwlTd2FwTG9uZygmaGVhZGVyLT5zdXJmYWNlRGVzYy5kd01pcE1hcENvdW50KTsKKwlmb3IoaW50IGk9MDsgaTwxMTsgaSsrKSB7CisJCVN3YXBMb25nKCZoZWFkZXItPnN1cmZhY2VEZXNjLmR3UmVzZXJ2ZWQxW2ldKTsKKwl9CisJU3dhcExvbmcoJmhlYWRlci0+c3VyZmFjZURlc2MuZGRwZlBpeGVsRm9ybWF0LmR3U2l6ZSk7CisJU3dhcExvbmcoJmhlYWRlci0+c3VyZmFjZURlc2MuZGRwZlBpeGVsRm9ybWF0LmR3RmxhZ3MpOworCVN3YXBMb25nKCZoZWFkZXItPnN1cmZhY2VEZXNjLmRkcGZQaXhlbEZvcm1hdC5kd0ZvdXJDQyk7CisJU3dhcExvbmcoJmhlYWRlci0+c3VyZmFjZURlc2MuZGRwZlBpeGVsRm9ybWF0LmR3UkdCQml0Q291bnQpOworCVN3YXBMb25nKCZoZWFkZXItPnN1cmZhY2VEZXNjLmRkcGZQaXhlbEZvcm1hdC5kd1JCaXRNYXNrKTsKKwlTd2FwTG9uZygmaGVhZGVyLT5zdXJmYWNlRGVzYy5kZHBmUGl4ZWxGb3JtYXQuZHdHQml0TWFzayk7CisJU3dhcExvbmcoJmhlYWRlci0+c3VyZmFjZURlc2MuZGRwZlBpeGVsRm9ybWF0LmR3QkJpdE1hc2spOworCVN3YXBMb25nKCZoZWFkZXItPnN1cmZhY2VEZXNjLmRkcGZQaXhlbEZvcm1hdC5kd1JHQkFscGhhQml0TWFzayk7CisJU3dhcExvbmcoJmhlYWRlci0+c3VyZmFjZURlc2MuZGRzQ2Fwcy5kd0NhcHMxKTsKKwlTd2FwTG9uZygmaGVhZGVyLT5zdXJmYWNlRGVzYy5kZHNDYXBzLmR3Q2FwczIpOworCVN3YXBMb25nKCZoZWFkZXItPnN1cmZhY2VEZXNjLmRkc0NhcHMuZHdSZXNlcnZlZFswXSk7CisJU3dhcExvbmcoJmhlYWRlci0+c3VyZmFjZURlc2MuZGRzQ2Fwcy5kd1Jlc2VydmVkWzFdKTsKKwlTd2FwTG9uZygmaGVhZGVyLT5zdXJmYWNlRGVzYy5kd1Jlc2VydmVkMik7Cit9CisjZW5kaWYKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyBHZXQgdGhlIDQgcG9zc2libGUgY29sb3JzIGZvciBhIGJsb2NrCisvLworc3RhdGljIHZvaWQgCitHZXRCbG9ja0NvbG9ycyAoY29uc3QgRFhUQ29sQmxvY2sgJmJsb2NrLCBDb2xvcjg4ODggY29sb3JzWzRdLCBib29sIGlzRFhUMSkgeworCWludCBpOworCS8vIGV4cGFuZCBmcm9tIDU2NSB0byA4ODgKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQl7CisJCWNvbG9yc1tpXS5hID0gMHhmZjsKKwkJLyoKKwkJY29sb3JzW2ldLnIgPSAoQllURSkoYmxvY2suY29sb3JzW2ldLnIgKiAweGZmIC8gMHgxZik7CisJCWNvbG9yc1tpXS5nID0gKEJZVEUpKGJsb2NrLmNvbG9yc1tpXS5nICogMHhmZiAvIDB4M2YpOworCQljb2xvcnNbaV0uYiA9IChCWVRFKShibG9jay5jb2xvcnNbaV0uYiAqIDB4ZmYgLyAweDFmKTsKKwkJKi8KKwkJY29sb3JzW2ldLnIgPSAoQllURSkoKGJsb2NrLmNvbG9yc1tpXS5yIDw8IDNVKSB8IChibG9jay5jb2xvcnNbaV0uciA+PiAyVSkpOworCQljb2xvcnNbaV0uZyA9IChCWVRFKSgoYmxvY2suY29sb3JzW2ldLmcgPDwgMlUpIHwgKGJsb2NrLmNvbG9yc1tpXS5nID4+IDRVKSk7CisJCWNvbG9yc1tpXS5iID0gKEJZVEUpKChibG9jay5jb2xvcnNbaV0uYiA8PCAzVSkgfCAoYmxvY2suY29sb3JzW2ldLmIgPj4gMlUpKTsKKwl9CisKKwlXT1JEICp3Q29sID0gKFdPUkQgKilibG9jay5jb2xvcnM7CisJaWYgKHdDb2xbMF0gPiB3Q29sWzFdIHx8ICFpc0RYVDEpIHsKKwkJLy8gNCBjb2xvciBibG9jaworCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQl7CisJCQljb2xvcnNbaSArIDJdLmEgPSAweGZmOworCQkJY29sb3JzW2kgKyAyXS5yID0gKEJZVEUpKChXT1JEIChjb2xvcnNbMF0ucikgKiAoMiAtIGkpICsgV09SRCAoY29sb3JzWzFdLnIpICogKDEgKyBpKSkgLyAzKTsKKwkJCWNvbG9yc1tpICsgMl0uZyA9IChCWVRFKSgoV09SRCAoY29sb3JzWzBdLmcpICogKDIgLSBpKSArIFdPUkQgKGNvbG9yc1sxXS5nKSAqICgxICsgaSkpIC8gMyk7CisJCQljb2xvcnNbaSArIDJdLmIgPSAoQllURSkoKFdPUkQgKGNvbG9yc1swXS5iKSAqICgyIC0gaSkgKyBXT1JEIChjb2xvcnNbMV0uYikgKiAoMSArIGkpKSAvIDMpOworCQl9CisJfQorCWVsc2UgeworCQkvLyAzIGNvbG9yIGJsb2NrLCBudW1iZXIgNCBpcyB0cmFuc3BhcmVudAorCQljb2xvcnNbMl0uYSA9IDB4ZmY7CisJCWNvbG9yc1syXS5yID0gKEJZVEUpKChXT1JEIChjb2xvcnNbMF0ucikgKyBXT1JEIChjb2xvcnNbMV0ucikpIC8gMik7CisJCWNvbG9yc1syXS5nID0gKEJZVEUpKChXT1JEIChjb2xvcnNbMF0uZykgKyBXT1JEIChjb2xvcnNbMV0uZykpIC8gMik7CisJCWNvbG9yc1syXS5iID0gKEJZVEUpKChXT1JEIChjb2xvcnNbMF0uYikgKyBXT1JEIChjb2xvcnNbMV0uYikpIC8gMik7CisKKwkJY29sb3JzWzNdLmEgPSAweDAwOworCQljb2xvcnNbM10uZyA9IDB4MDA7CisJCWNvbG9yc1szXS5iID0gMHgwMDsKKwkJY29sb3JzWzNdLnIgPSAweDAwOworCX0KK30KKworc3RydWN0IERYVF9JTkZPXzEgeworCXR5cGVkZWYgRFhUMUJsb2NrIEJsb2NrOworCWVudW0geworCQlpc0RYVDEgPSAxLAorCQlieXRlc1BlckJsb2NrID0gOAorCX07Cit9OworCitzdHJ1Y3QgRFhUX0lORk9fMyB7CisJdHlwZWRlZiBEWFQzQmxvY2sgQmxvY2s7CisJZW51bSB7CisJCWlzRFhUMSA9IDEsCisJCWJ5dGVzUGVyQmxvY2sgPSAxNgorCX07Cit9OworCitzdHJ1Y3QgRFhUX0lORk9fNSB7CisJdHlwZWRlZiBEWFQ1QmxvY2sgQmxvY2s7CisJZW51bQorCXsKKwkJaXNEWFQxID0gMSwKKwkJYnl0ZXNQZXJCbG9jayA9IDE2CisJfTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBJTkZPPiBjbGFzcyBEWFRfQkxPQ0tERUNPREVSX0JBU0UgeworcHJvdGVjdGVkOgorCUNvbG9yODg4OCBtX2NvbG9yc1s0XTsKKwljb25zdCB0eXBlbmFtZSBJTkZPOjpCbG9jayAqbV9wQmxvY2s7CisJdW5zaWduZWQgbV9jb2xvclJvdzsKKworcHVibGljOgorCXZvaWQgU2V0dXAgKGNvbnN0IEJZVEUgKnBCbG9jaykgeworCQltX3BCbG9jayA9IChjb25zdCB0eXBlbmFtZSBJTkZPOjpCbG9jayAqKXBCbG9jazsKKwkJR2V0QmxvY2tDb2xvcnMgKG1fcEJsb2NrLT5jb2xvciwgbV9jb2xvcnMsIElORk86OmlzRFhUMSk7CisJfQorCisJdm9pZCBTZXRZIChpbnQgeSkgeworCQltX2NvbG9yUm93ID0gbV9wQmxvY2stPmNvbG9yLnJvd1t5XTsKKwl9CisKKwl2b2lkIEdldENvbG9yIChpbnQgeCwgaW50IHksIENvbG9yODg4OCAmY29sb3IpIHsKKwkJdW5zaWduZWQgYml0cyA9IChtX2NvbG9yUm93ID4+ICh4ICogMikpICYgMzsKKwkJY29sb3IgPSBtX2NvbG9yc1tiaXRzXTsKKwl9Cit9OworCitjbGFzcyBEWFRfQkxPQ0tERUNPREVSXzEgOiBwdWJsaWMgRFhUX0JMT0NLREVDT0RFUl9CQVNFIDxEWFRfSU5GT18xPiB7CitwdWJsaWM6CisJdHlwZWRlZiBEWFRfSU5GT18xIElORk87Cit9OworCitjbGFzcyBEWFRfQkxPQ0tERUNPREVSXzMgOiBwdWJsaWMgRFhUX0JMT0NLREVDT0RFUl9CQVNFIDxEWFRfSU5GT18zPiB7CitwdWJsaWM6CisJdHlwZWRlZiBEWFRfQkxPQ0tERUNPREVSX0JBU0UgPERYVF9JTkZPXzM+IGJhc2U7CisJdHlwZWRlZiBEWFRfSU5GT18zIElORk87CisKK3Byb3RlY3RlZDoKKwl1bnNpZ25lZCBtX2FscGhhUm93OworCitwdWJsaWM6CisJdm9pZCBTZXRZIChpbnQgeSkgeworCQliYXNlOjpTZXRZICh5KTsKKwkJbV9hbHBoYVJvdyA9IG1fcEJsb2NrLT5hbHBoYS5yb3dbeV07CisJfQorCisJdm9pZCBHZXRDb2xvciAoaW50IHgsIGludCB5LCBDb2xvcjg4ODggJmNvbG9yKSB7CisJCWJhc2U6OkdldENvbG9yICh4LCB5LCBjb2xvcik7CisJCWNvbnN0IHVuc2lnbmVkIGJpdHMgPSAobV9hbHBoYVJvdyA+PiAoeCAqIDQpKSAmIDB4RjsKKwkJY29sb3IuYSA9IChCWVRFKSgoYml0cyAqIDB4RkYpIC8gMHhGKTsKKwl9Cit9OworCitjbGFzcyBEWFRfQkxPQ0tERUNPREVSXzUgOiBwdWJsaWMgRFhUX0JMT0NLREVDT0RFUl9CQVNFIDxEWFRfSU5GT181PiB7CitwdWJsaWM6CisJdHlwZWRlZiBEWFRfQkxPQ0tERUNPREVSX0JBU0UgPERYVF9JTkZPXzU+IGJhc2U7CisJdHlwZWRlZiBEWFRfSU5GT181IElORk87CisKK3Byb3RlY3RlZDoKKwl1bnNpZ25lZCBtX2FscGhhc1s4XTsKKwl1bnNpZ25lZCBtX2FscGhhQml0czsKKwlpbnQgbV9vZmZzZXQ7CisKK3B1YmxpYzoKKwl2b2lkIFNldHVwIChjb25zdCBCWVRFICpwQmxvY2spIHsKKwkJYmFzZTo6U2V0dXAgKHBCbG9jayk7CisKKwkJY29uc3QgRFhUQWxwaGFCbG9jazNCaXRMaW5lYXIgJmJsb2NrID0gbV9wQmxvY2stPmFscGhhOworCQltX2FscGhhc1swXSA9IGJsb2NrLmFscGhhWzBdOworCQltX2FscGhhc1sxXSA9IGJsb2NrLmFscGhhWzFdOworCQlpZiAobV9hbHBoYXNbMF0gPiBtX2FscGhhc1sxXSkgeworCQkJLy8gOCBhbHBoYSBibG9jaworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJCQltX2FscGhhc1tpICsgMl0gPSAoKDYgLSBpKSAqIG1fYWxwaGFzWzBdICsgKDEgKyBpKSAqIG1fYWxwaGFzWzFdICsgMykgLyA3OworCQkJfQorCQl9CisJCWVsc2UgeworCQkJLy8gNiBhbHBoYSBibG9jaworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJCQltX2FscGhhc1tpICsgMl0gPSAoKDQgLSBpKSAqIG1fYWxwaGFzWzBdICsgKDEgKyBpKSAqIG1fYWxwaGFzWzFdICsgMikgLyA1OworCQkJfQorCQkJbV9hbHBoYXNbNl0gPSAwOworCQkJbV9hbHBoYXNbN10gPSAweEZGOworCQl9CisKKwl9CisKKwl2b2lkIFNldFkgKGludCB5KSB7CisJCWJhc2U6OlNldFkgKHkpOworCQlpbnQgaSA9IHkgLyAyOworCQljb25zdCBEWFRBbHBoYUJsb2NrM0JpdExpbmVhciAmYmxvY2sgPSBtX3BCbG9jay0+YWxwaGE7CisJCW1fYWxwaGFCaXRzID0gdW5zaWduZWQoYmxvY2suZGF0YVswICsgaSAqIDNdKSB8ICh1bnNpZ25lZChibG9jay5kYXRhWzEgKyBpICogM10pIDw8IDgpCisJCQl8ICh1bnNpZ25lZChibG9jay5kYXRhWzIgKyBpICogM10pIDw8IDE2KTsKKwkJbV9vZmZzZXQgPSAoeSAmIDEpICogMTI7CisJfQorCisJdm9pZCBHZXRDb2xvciAoaW50IHgsIGludCB5LCBDb2xvcjg4ODggJmNvbG9yKSB7CisJCWJhc2U6OkdldENvbG9yICh4LCB5LCBjb2xvcik7CisJCXVuc2lnbmVkIGJpdHMgPSAobV9hbHBoYUJpdHMgPj4gKHggKiAzICsgbV9vZmZzZXQpKSAmIDc7CisJCWNvbG9yLmEgPSAoQllURSltX2FscGhhc1tiaXRzXTsKKwl9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgREVDT0RFUj4gdm9pZCBEZWNvZGVEWFRCbG9jayAoQllURSAqZHN0RGF0YSwgY29uc3QgQllURSAqc3JjQmxvY2ssIGxvbmcgZHN0UGl0Y2gsIGludCBidywgaW50IGJoKSB7CisJREVDT0RFUiBkZWNvZGVyOworCWRlY29kZXIuU2V0dXAgKHNyY0Jsb2NrKTsKKwlmb3IgKGludCB5ID0gMDsgeSA8IGJoOyB5KyspIHsKKwkJQllURSAqZHN0ID0gZHN0RGF0YSAtIHkgKiBkc3RQaXRjaDsKKwkJZGVjb2Rlci5TZXRZICh5KTsKKwkJZm9yIChpbnQgeCA9IDA7IHggPCBidzsgeCsrKSB7CisJCQlkZWNvZGVyLkdldENvbG9yICh4LCB5LCAoQ29sb3I4ODg4ICYpKmRzdCk7CisKKyNpZiBGUkVFSU1BR0VfQ09MT1JPUkRFUiA9PSBGUkVFSU1BR0VfQ09MT1JPUkRFUl9SR0IgCisJCQlJTlBMQUNFU1dBUChkc3RbRklfUkdCQV9SRURdLCBkc3RbRklfUkdCQV9CTFVFXSk7CisjZW5kaWYgCisJCQlkc3QgKz0gNDsKKwkJfQorCX0KK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gUGx1Z2luIEludGVyZmFjZQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitzdGF0aWMgaW50IHNfZm9ybWF0X2lkOworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBJbnRlcm5hbCBmdW5jdGlvbnMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3RhdGljIEZJQklUTUFQICoKK0xvYWRSR0IgKEREU1VSRkFDRURFU0MyICZkZXNjLCBGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIGludCBwYWdlLCBpbnQgZmxhZ3MsIHZvaWQgKmRhdGEpIHsKKwlpbnQgd2lkdGggPSAoaW50KWRlc2MuZHdXaWR0aCAmIH4zOworCWludCBoZWlnaHQgPSAoaW50KWRlc2MuZHdIZWlnaHQgJiB+MzsKKwlpbnQgYnBwID0gKGludClkZXNjLmRkcGZQaXhlbEZvcm1hdC5kd1JHQkJpdENvdW50OworCQorCS8vIGFsbG9jYXRlIGEgbmV3IGRpYgorCUZJQklUTUFQICpkaWIgPSBGcmVlSW1hZ2VfQWxsb2NhdGUgKHdpZHRoLCBoZWlnaHQsIGJwcCwgZGVzYy5kZHBmUGl4ZWxGb3JtYXQuZHdSQml0TWFzaywKKwkJZGVzYy5kZHBmUGl4ZWxGb3JtYXQuZHdHQml0TWFzaywgZGVzYy5kZHBmUGl4ZWxGb3JtYXQuZHdCQml0TWFzayk7CisJaWYgKGRpYiA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworI2lmIEZSRUVJTUFHRV9DT0xPUk9SREVSID09IEZSRUVJTUFHRV9DT0xPUk9SREVSX1JHQgorCQkvLyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBieXRlcyBwZXIgcGl4ZWwgKDMgZm9yIDI0LWJpdCBvciA0IGZvciAzMi1iaXQpCisJCWludCBieXRlc3BwID0gRnJlZUltYWdlX0dldExpbmUoZGliKSAvIEZyZWVJbWFnZV9HZXRXaWR0aChkaWIpOworI2VuZGlmCisJCisJLy8gcmVhZCB0aGUgZmlsZQorCWludCBsaW5lICAgPSBDYWxjdWxhdGVMaW5lKHdpZHRoLCBicHApOworCWludCBmaWxlUGl0Y2ggPSAoZGVzYy5kd0ZsYWdzICYgRERTRF9QSVRDSCkgPyAoaW50KWRlc2MuZHdQaXRjaE9yTGluZWFyU2l6ZSA6IGxpbmU7CisJbG9uZyBkZWx0YSA9IChsb25nKWZpbGVQaXRjaCAtIChsb25nKWxpbmU7CisJZm9yIChpbnQgaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworCQlCWVRFICpwaXhlbHMgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCBoZWlnaHQgLSBpIC0gMSk7CisJCWlvLT5yZWFkX3Byb2MgKHBpeGVscywgMSwgbGluZSwgaGFuZGxlKTsKKwkJaW8tPnNlZWtfcHJvYyAoaGFuZGxlLCBkZWx0YSwgU0VFS19DVVIpOworI2lmIEZSRUVJTUFHRV9DT0xPUk9SREVSID09IEZSRUVJTUFHRV9DT0xPUk9SREVSX1JHQgorIAkJZm9yKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCUlOUExBQ0VTV0FQKHBpeGVsc1tGSV9SR0JBX1JFRF0scGl4ZWxzW0ZJX1JHQkFfQkxVRV0pOworCQkJcGl4ZWxzICs9IGJ5dGVzcHA7CisJCX0KKyNlbmRpZgorCX0KKwkKKwkvLyBlbmFibGUgdHJhbnNwYXJlbmN5CisJRnJlZUltYWdlX1NldFRyYW5zcGFyZW50IChkaWIsIChkZXNjLmRkcGZQaXhlbEZvcm1hdC5kd0ZsYWdzICYgRERQRl9BTFBIQVBJWEVMUykgPyBUUlVFIDogRkFMU0UpOworCisJaWYgKCEoZGVzYy5kZHBmUGl4ZWxGb3JtYXQuZHdGbGFncyAmIEREUEZfQUxQSEFQSVhFTFMpICYmIGJwcCA9PSAzMikgeworCQkvLyBubyB0cmFuc3BhcmVuY3k6IGNvbnZlcnQgdG8gMjQtYml0CisJCUZJQklUTUFQICpvbGQgPSBkaWI7CisJCWRpYiA9IEZyZWVJbWFnZV9Db252ZXJ0VG8yNEJpdHMgKG9sZCk7CisJCUZyZWVJbWFnZV9VbmxvYWQgKG9sZCk7CisJfQorCXJldHVybiBkaWI7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBERUNPREVSPiBzdGF0aWMgdm9pZCAKK0xvYWREWFRfSGVscGVyIChGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIGludCBwYWdlLCBpbnQgZmxhZ3MsIHZvaWQgKmRhdGEsIEZJQklUTUFQICpkaWIsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGxpbmUpIHsKKwl0eXBlZGVmIHR5cGVuYW1lIERFQ09ERVI6OklORk8gSU5GTzsKKwl0eXBlZGVmIHR5cGVuYW1lIElORk86OkJsb2NrIEJsb2NrOworCisJQmxvY2sgKmlucHV0X2J1ZmZlciA9IG5ldyhzdGQ6Om5vdGhyb3cpIEJsb2NrWyh3aWR0aCArIDMpIC8gNF07CisJaWYoIWlucHV0X2J1ZmZlcikgcmV0dXJuOworCisJaW50IHdpZHRoUmVzdCA9IChpbnQpIHdpZHRoICYgMzsKKwlpbnQgaGVpZ2h0UmVzdCA9IChpbnQpIGhlaWdodCAmIDM7CisJaW50IGlucHV0TGluZSA9ICh3aWR0aCArIDMpIC8gNDsKKwlpbnQgeSA9IDA7CisKKwlpZiAoaGVpZ2h0ID49IDQpIHsKKwkJZm9yICg7IHkgPCBoZWlnaHQ7IHkgKz0gNCkgeworCQkJaW8tPnJlYWRfcHJvYyAoaW5wdXRfYnVmZmVyLCBzaXplb2YgKHR5cGVuYW1lIElORk86OkJsb2NrKSwgaW5wdXRMaW5lLCBoYW5kbGUpOworCQkJLy8gVE9ETzogcHJvYmFibHkgbmVlZCBzb21lIGVuZGlhbiB3b3JrIGhlcmUKKwkJCUJZVEUgKnBiU3JjID0gKEJZVEUgKilpbnB1dF9idWZmZXI7CisJCQlCWVRFICpwYkRzdCA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZSAoZGliLCBoZWlnaHQgLSB5IC0gMSk7CisKKwkJCWlmICh3aWR0aCA+PSA0KSB7CisJCQkJZm9yIChpbnQgeCA9IDA7IHggPCB3aWR0aDsgeCArPSA0KSB7CisJCQkJCURlY29kZURYVEJsb2NrIDxERUNPREVSPiAocGJEc3QsIHBiU3JjLAlsaW5lLCA0LCA0KTsKKwkJCQkJcGJTcmMgKz0gSU5GTzo6Ynl0ZXNQZXJCbG9jazsKKwkJCQkJcGJEc3QgKz0gNCAqIDQ7CisJCQkJfQorCQkJfQorCQkJaWYgKHdpZHRoUmVzdCkgeworCQkJCURlY29kZURYVEJsb2NrIDxERUNPREVSPiAocGJEc3QsIHBiU3JjLCBsaW5lLCB3aWR0aFJlc3QsIDQpOworCQkJfQorCQl9CisJfQorCWlmIChoZWlnaHRSZXN0KQl7CisJCWlvLT5yZWFkX3Byb2MgKGlucHV0X2J1ZmZlciwgc2l6ZW9mICh0eXBlbmFtZSBJTkZPOjpCbG9jayksIGlucHV0TGluZSwgaGFuZGxlKTsKKwkJLy8gVE9ETzogcHJvYmFibHkgbmVlZCBzb21lIGVuZGlhbiB3b3JrIGhlcmUKKwkJQllURSAqcGJTcmMgPSAoQllURSAqKWlucHV0X2J1ZmZlcjsKKwkJQllURSAqcGJEc3QgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUgKGRpYiwgaGVpZ2h0IC0geSAtIDEpOworCisJCWlmICh3aWR0aCA+PSA0KSB7CisJCQlmb3IgKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4ICs9IDQpIHsKKwkJCQlEZWNvZGVEWFRCbG9jayA8REVDT0RFUj4gKHBiRHN0LCBwYlNyYywJbGluZSwgNCwgaGVpZ2h0UmVzdCk7CisJCQkJcGJTcmMgKz0gSU5GTzo6Ynl0ZXNQZXJCbG9jazsKKwkJCQlwYkRzdCArPSA0ICogNDsKKwkJCX0KKwkJfQorCQlpZiAod2lkdGhSZXN0KSB7CisJCQlEZWNvZGVEWFRCbG9jayA8REVDT0RFUj4gKHBiRHN0LCBwYlNyYywJbGluZSwgd2lkdGhSZXN0LCBoZWlnaHRSZXN0KTsKKwkJfQorCisJfQorCisJZGVsZXRlIFtdIGlucHV0X2J1ZmZlcjsKK30KKworc3RhdGljIEZJQklUTUFQICoKK0xvYWREWFQgKGludCB0eXBlLCBERFNVUkZBQ0VERVNDMiAmZGVzYywgRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBpbnQgcGFnZSwgaW50IGZsYWdzLCB2b2lkICpkYXRhKSB7CisJaW50IHdpZHRoID0gKGludClkZXNjLmR3V2lkdGggJiB+MzsKKwlpbnQgaGVpZ2h0ID0gKGludClkZXNjLmR3SGVpZ2h0ICYgfjM7CisKKwkvLyBhbGxvY2F0ZSBhIDMyLWJpdCBkaWIKKwlGSUJJVE1BUCAqZGliID0gRnJlZUltYWdlX0FsbG9jYXRlICh3aWR0aCwgaGVpZ2h0LCAzMiwgRklfUkdCQV9SRURfTUFTSywgRklfUkdCQV9HUkVFTl9NQVNLLCBGSV9SR0JBX0JMVUVfTUFTSyk7CisJaWYgKGRpYiA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWludCBicHAgPSBGcmVlSW1hZ2VfR2V0QlBQIChkaWIpOworCWludCBsaW5lID0gQ2FsY3VsYXRlTGluZSAod2lkdGgsIGJwcCk7CisJQllURSAqYml0cyA9IEZyZWVJbWFnZV9HZXRCaXRzIChkaWIpOworCisJLy8gc2VsZWN0IHRoZSByaWdodCBkZWNvZGVyCisJc3dpdGNoICh0eXBlKSB7CisJCWNhc2UgMToKKwkJCUxvYWREWFRfSGVscGVyIDxEWFRfQkxPQ0tERUNPREVSXzE+IChpbywgaGFuZGxlLCBwYWdlLCBmbGFncywgZGF0YSwgZGliLCB3aWR0aCwgaGVpZ2h0LCBsaW5lKTsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlMb2FkRFhUX0hlbHBlciA8RFhUX0JMT0NLREVDT0RFUl8zPiAoaW8sIGhhbmRsZSwgcGFnZSwgZmxhZ3MsIGRhdGEsIGRpYiwgd2lkdGgsIGhlaWdodCwgbGluZSk7CisJCQlicmVhazsKKwkJY2FzZSA1OgorCQkJTG9hZERYVF9IZWxwZXIgPERYVF9CTE9DS0RFQ09ERVJfNT4gKGlvLCBoYW5kbGUsIHBhZ2UsIGZsYWdzLCBkYXRhLCBkaWIsIHdpZHRoLCBoZWlnaHQsIGxpbmUpOworCQkJYnJlYWs7CisJfQorCQorCXJldHVybiBkaWI7Cit9CisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBQbHVnaW4gSW1wbGVtZW50YXRpb24KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKK0Zvcm1hdCgpIHsKKwlyZXR1cm4gIkREUyI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCitEZXNjcmlwdGlvbigpIHsKKwlyZXR1cm4gIkRpcmVjdFggU3VyZmFjZSI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCitFeHRlbnNpb24oKSB7CisJcmV0dXJuICJkZHMiOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgorUmVnRXhwcigpIHsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKK01pbWVUeXBlKCkgeworCXJldHVybiAiaW1hZ2UveC1kZHMiOworfQorCitzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYKK1ZhbGlkYXRlKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSkgeworCUREU0hFQURFUiBoZWFkZXI7CisJbWVtc2V0KCZoZWFkZXIsIDAsIHNpemVvZihoZWFkZXIpKTsKKwlpby0+cmVhZF9wcm9jKCZoZWFkZXIsIDEsIHNpemVvZihoZWFkZXIpLCBoYW5kbGUpOworI2lmZGVmIEZSRUVJTUFHRV9CSUdFTkRJQU4KKwlTd2FwSGVhZGVyKCZoZWFkZXIpOworI2VuZGlmCisJaWYgKGhlYWRlci5kd01hZ2ljICE9IE1BS0VGT1VSQ0MgKCdEJywnRCcsJ1MnLCcgJykpCisJCXJldHVybiBGQUxTRTsKKwlpZiAoaGVhZGVyLnN1cmZhY2VEZXNjLmR3U2l6ZSAhPSBzaXplb2YgKGhlYWRlci5zdXJmYWNlRGVzYykgfHwKKwkJaGVhZGVyLnN1cmZhY2VEZXNjLmRkcGZQaXhlbEZvcm1hdC5kd1NpemUgIT0gc2l6ZW9mIChoZWFkZXIuc3VyZmFjZURlc2MuZGRwZlBpeGVsRm9ybWF0KSkKKwkJcmV0dXJuIEZBTFNFOworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYKK1N1cHBvcnRzRXhwb3J0RGVwdGgoaW50IGRlcHRoKSB7CisJcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYgCitTdXBwb3J0c0V4cG9ydFR5cGUoRlJFRV9JTUFHRV9UWVBFIHR5cGUpIHsKKwlyZXR1cm4gRkFMU0U7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgKiBETExfQ0FMTENPTlYKK09wZW4oRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBCT09MIHJlYWQpIHsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgRExMX0NBTExDT05WCitDbG9zZShGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIHZvaWQgKmRhdGEpIHsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgRklCSVRNQVAgKiBETExfQ0FMTENPTlYKK0xvYWQoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBpbnQgcGFnZSwgaW50IGZsYWdzLCB2b2lkICpkYXRhKSB7CisJRERTSEVBREVSIGhlYWRlcjsKKwlGSUJJVE1BUCAqZGliID0gTlVMTDsKKworCW1lbXNldCgmaGVhZGVyLCAwLCBzaXplb2YoaGVhZGVyKSk7CisJaW8tPnJlYWRfcHJvYygmaGVhZGVyLCAxLCBzaXplb2YoaGVhZGVyKSwgaGFuZGxlKTsKKyNpZmRlZiBGUkVFSU1BR0VfQklHRU5ESUFOCisJU3dhcEhlYWRlcigmaGVhZGVyKTsKKyNlbmRpZgorCWlmIChoZWFkZXIuc3VyZmFjZURlc2MuZGRwZlBpeGVsRm9ybWF0LmR3RmxhZ3MgJiBERFBGX1JHQikgeworCQlkaWIgPSBMb2FkUkdCIChoZWFkZXIuc3VyZmFjZURlc2MsIGlvLCBoYW5kbGUsIHBhZ2UsIGZsYWdzLCBkYXRhKTsKKwl9CisJZWxzZSBpZiAoaGVhZGVyLnN1cmZhY2VEZXNjLmRkcGZQaXhlbEZvcm1hdC5kd0ZsYWdzICYgRERQRl9GT1VSQ0MpIHsKKwkJc3dpdGNoIChoZWFkZXIuc3VyZmFjZURlc2MuZGRwZlBpeGVsRm9ybWF0LmR3Rm91ckNDKSB7CisJCQljYXNlIEZPVVJDQ19EWFQxOgorCQkJCWRpYiA9IExvYWREWFQgKDEsIGhlYWRlci5zdXJmYWNlRGVzYywgaW8sIGhhbmRsZSwgcGFnZSwgZmxhZ3MsIGRhdGEpOworCQkJCWJyZWFrOworCQkJY2FzZSBGT1VSQ0NfRFhUMzoKKwkJCQlkaWIgPSBMb2FkRFhUICgzLCBoZWFkZXIuc3VyZmFjZURlc2MsIGlvLCBoYW5kbGUsIHBhZ2UsIGZsYWdzLCBkYXRhKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRk9VUkNDX0RYVDU6CisJCQkJZGliID0gTG9hZERYVCAoNSwgaGVhZGVyLnN1cmZhY2VEZXNjLCBpbywgaGFuZGxlLCBwYWdlLCBmbGFncywgZGF0YSk7CisJCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIGRpYjsKK30KKworLyoKK3N0YXRpYyBCT09MIERMTF9DQUxMQ09OVgorU2F2ZShGcmVlSW1hZ2VJTyAqaW8sIEZJQklUTUFQICpkaWIsIGZpX2hhbmRsZSBoYW5kbGUsIGludCBwYWdlLCBpbnQgZmxhZ3MsIHZvaWQgKmRhdGEpIHsKKwlyZXR1cm4gRkFMU0U7Cit9CisqLworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgIEluaXQKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwordm9pZCBETExfQ0FMTENPTlYKK0luaXRERFMoUGx1Z2luICpwbHVnaW4sIGludCBmb3JtYXRfaWQpIHsKKwlzX2Zvcm1hdF9pZCA9IGZvcm1hdF9pZDsKKworCXBsdWdpbi0+Zm9ybWF0X3Byb2MgPSBGb3JtYXQ7CisJcGx1Z2luLT5kZXNjcmlwdGlvbl9wcm9jID0gRGVzY3JpcHRpb247CisJcGx1Z2luLT5leHRlbnNpb25fcHJvYyA9IEV4dGVuc2lvbjsKKwlwbHVnaW4tPnJlZ2V4cHJfcHJvYyA9IFJlZ0V4cHI7CisJcGx1Z2luLT5vcGVuX3Byb2MgPSBPcGVuOworCXBsdWdpbi0+Y2xvc2VfcHJvYyA9IENsb3NlOworCXBsdWdpbi0+cGFnZWNvdW50X3Byb2MgPSBOVUxMOworCXBsdWdpbi0+cGFnZWNhcGFiaWxpdHlfcHJvYyA9IE5VTEw7CisJcGx1Z2luLT5sb2FkX3Byb2MgPSBMb2FkOworCXBsdWdpbi0+c2F2ZV9wcm9jID0gTlVMTDsJLy9TYXZlOwkvLyBub3QgaW1wbGVtZW50ZWQgKHlldD8pCisJcGx1Z2luLT52YWxpZGF0ZV9wcm9jID0gVmFsaWRhdGU7CisJcGx1Z2luLT5taW1lX3Byb2MgPSBNaW1lVHlwZTsKKwlwbHVnaW4tPnN1cHBvcnRzX2V4cG9ydF9icHBfcHJvYyA9IFN1cHBvcnRzRXhwb3J0RGVwdGg7CisJcGx1Z2luLT5zdXBwb3J0c19leHBvcnRfdHlwZV9wcm9jID0gU3VwcG9ydHNFeHBvcnRUeXBlOworCXBsdWdpbi0+c3VwcG9ydHNfaWNjX3Byb2ZpbGVzX3Byb2MgPSBOVUxMOworfQpkaWZmIC0tZ2l0IGEvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9QbHVnaW5FWFIuY3BwIGIvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9QbHVnaW5FWFIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMjVlZmIKLS0tIC9kZXYvbnVsbAorKysgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL1BsdWdpbkVYUi5jcHAKQEAgLTAsMCArMSw3NzIgQEAKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEVYUiBMb2FkZXIgYW5kIHdyaXRlcgorLy8KKy8vIERlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gYnkgCisvLyAtIEhlcnbDqSBEcm9sb24gKGRyb2xvbkBpbmZvbmllLmZyKQorLy8gLSBNaWhhaWwgTmF5ZGVub3YgKG1uYXlkZW5vdkB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQpCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRnJlZUltYWdlIDMKKy8vCisvLyBDT1ZFUkVEIENPREUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkKKy8vIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTCisvLyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy8vIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVECisvLyBDT0RFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UCisvLyBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWQorLy8gU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTAorLy8gUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUgorLy8gVEhJUyBESVNDTEFJTUVSLgorLy8KKy8vIFVzZSBhdCB5b3VyIG93biByaXNrIQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaW5jbHVkZSAiRnJlZUltYWdlLmgiCisjaW5jbHVkZSAiVXRpbGl0aWVzLmgiCisKKyNpZmRlZiBfTVNDX1ZFUgorLy8gT3BlbkVYUiBoYXMgbWFueSBwcm9ibGVtcyB3aXRoIE1TVkMgd2FybmluZ3MgKHdoeSBub3QganVzdCBjb3JyZWN0IHRoZW0gPyksIGp1c3QgaWdub3JlIG9uZSBvZiB0aGVtCisjcHJhZ21hIHdhcm5pbmcgKGRpc2FibGUgOiA0ODAwKSAvLyBJbWZWZXJzaW9uLmggLSAnY29uc3QgaW50JyA6IGZvcmNpbmcgdmFsdWUgdG8gYm9vbCAndHJ1ZScgb3IgJ2ZhbHNlJyAocGVyZm9ybWFuY2Ugd2FybmluZykKKyNlbmRpZiAKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9vcGVuZXhyL0lsbUltZi9JbWZJTy5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2lsbWJhc2UvSWV4L0lleC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L29wZW5leHIvSWxtSW1mL0ltZk91dHB1dEZpbGUuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9vcGVuZXhyL0lsbUltZi9JbWZJbnB1dEZpbGUuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9vcGVuZXhyL0lsbUltZi9JbWZSZ2JhRmlsZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L29wZW5leHIvSWxtSW1mL0ltZkNoYW5uZWxMaXN0LmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvb3BlbmV4ci9JbG1JbWYvSW1mUmdiYS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L29wZW5leHIvSWxtSW1mL0ltZkFycmF5LmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvb3BlbmV4ci9JbG1JbWYvSW1mUHJldmlld0ltYWdlLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvaWxtYmFzZS9IYWxmL2hhbGYuaCIKKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBQbHVnaW4gSW50ZXJmYWNlCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3N0YXRpYyBpbnQgc19mb3JtYXRfaWQ7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoqCitGcmVlSW1hZ2UgaW5wdXQgc3RyZWFtIHdyYXBwZXIKK0BzZWUgSW1mXzJfMjo6SVN0cmVhbQorKi8KK2NsYXNzIENfSVN0cmVhbSA6IHB1YmxpYyBJbWY6OklTdHJlYW0geworcHJpdmF0ZToKKyAgICBGcmVlSW1hZ2VJTyAqX2lvOworCWZpX2hhbmRsZSBfaGFuZGxlOworCitwdWJsaWM6CisJQ19JU3RyZWFtIChGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUpIDogCisJICBJbWY6OklTdHJlYW0oIiIpLCBfaW8gKGlvKSwgX2hhbmRsZShoYW5kbGUpIHsKKwl9CisKKwl2aXJ0dWFsIGJvb2wgcmVhZCAoY2hhciBjWy8qbiovXSwgaW50IG4pIHsKKwkJcmV0dXJuICgodW5zaWduZWQpbiAhPSBfaW8tPnJlYWRfcHJvYyhjLCAxLCBuLCBfaGFuZGxlKSk7CisJfQorCisJdmlydHVhbCBJbWF0aDo6SW50NjQgdGVsbGcoKSB7CisJCXJldHVybiBfaW8tPnRlbGxfcHJvYyhfaGFuZGxlKTsKKwl9CisKKwl2aXJ0dWFsIHZvaWQgc2Vla2coSW1hdGg6OkludDY0IHBvcykgeworCQlfaW8tPnNlZWtfcHJvYyhfaGFuZGxlLCAodW5zaWduZWQpcG9zLCBTRUVLX1NFVCk7CisJfQorCisJdmlydHVhbCB2b2lkIGNsZWFyKCkgeworCX0KK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoqCitGcmVlSW1hZ2Ugb3V0cHV0IHN0cmVhbSB3cmFwcGVyCitAc2VlIEltZl8yXzI6Ok9TdHJlYW0KKyovCitjbGFzcyBDX09TdHJlYW0gOiBwdWJsaWMgSW1mOjpPU3RyZWFtIHsKK3ByaXZhdGU6CisgICAgRnJlZUltYWdlSU8gKl9pbzsKKwlmaV9oYW5kbGUgX2hhbmRsZTsKKworcHVibGljOgorCUNfT1N0cmVhbSAoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlKSA6IAorCSAgSW1mOjpPU3RyZWFtKCIiKSwgX2lvIChpbyksIF9oYW5kbGUoaGFuZGxlKSB7CisJfQorCisJdmlydHVhbCB2b2lkIHdyaXRlKGNvbnN0IGNoYXIgY1svKm4qL10sIGludCBuKSB7CisJCWlmKCh1bnNpZ25lZCluICE9IF9pby0+d3JpdGVfcHJvYygodm9pZCopJmNbMF0sIDEsIG4sIF9oYW5kbGUpKSB7CisJCQlJZXg6OnRocm93RXJybm9FeGMoKTsKKwkJfQorCX0KKworCXZpcnR1YWwgSW1hdGg6OkludDY0IHRlbGxwKCkgeworCQlyZXR1cm4gX2lvLT50ZWxsX3Byb2MoX2hhbmRsZSk7CisJfQorCisJdmlydHVhbCB2b2lkIHNlZWtwKEltYXRoOjpJbnQ2NCBwb3MpIHsKKwkJX2lvLT5zZWVrX3Byb2MoX2hhbmRsZSwgKHVuc2lnbmVkKXBvcywgU0VFS19TRVQpOworCX0KK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBQbHVnaW4gSW1wbGVtZW50YXRpb24KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKK0Zvcm1hdCgpIHsKKwlyZXR1cm4gIkVYUiI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCitEZXNjcmlwdGlvbigpIHsKKwlyZXR1cm4gIklMTSBPcGVuRVhSIjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKK0V4dGVuc2lvbigpIHsKKwlyZXR1cm4gImV4ciI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCitSZWdFeHByKCkgeworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgorTWltZVR5cGUoKSB7CisJcmV0dXJuICJpbWFnZS94LWV4ciI7Cit9CisKK3N0YXRpYyBCT09MIERMTF9DQUxMQ09OVgorVmFsaWRhdGUoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlKSB7CisJQllURSBleHJfc2lnbmF0dXJlW10gPSB7IDB4NzYsIDB4MkYsIDB4MzEsIDB4MDEgfTsKKwlCWVRFIHNpZ25hdHVyZVtdID0geyAwLCAwLCAwLCAwIH07CisKKwlpby0+cmVhZF9wcm9jKHNpZ25hdHVyZSwgMSwgNCwgaGFuZGxlKTsKKwlyZXR1cm4gKG1lbWNtcChleHJfc2lnbmF0dXJlLCBzaWduYXR1cmUsIDQpID09IDApOworfQorCitzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYKK1N1cHBvcnRzRXhwb3J0RGVwdGgoaW50IGRlcHRoKSB7CisJcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYgCitTdXBwb3J0c0V4cG9ydFR5cGUoRlJFRV9JTUFHRV9UWVBFIHR5cGUpIHsKKwlyZXR1cm4gKAorCQkodHlwZSA9PSBGSVRfRkxPQVQpIHx8CisJCSh0eXBlID09IEZJVF9SR0JGKSAgfHwKKwkJKHR5cGUgPT0gRklUX1JHQkFGKQorCSk7Cit9CisKK3N0YXRpYyBCT09MIERMTF9DQUxMQ09OVgorU3VwcG9ydHNOb1BpeGVscygpIHsKKwlyZXR1cm4gVFJVRTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIEZJQklUTUFQICogRExMX0NBTExDT05WCitMb2FkKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSwgaW50IHBhZ2UsIGludCBmbGFncywgdm9pZCAqZGF0YSkgeworCWJvb2wgYlVzZVJnYmFJbnRlcmZhY2UgPSBmYWxzZTsKKwlGSUJJVE1BUCAqZGliID0gTlVMTDsJCisKKwlpZighaGFuZGxlKSB7CisJCXJldHVybiBOVUxMOworCX0KKworCXRyeSB7CisJCUJPT0wgaGVhZGVyX29ubHkgPSAoZmxhZ3MgJiBGSUZfTE9BRF9OT1BJWEVMUykgPT0gRklGX0xPQURfTk9QSVhFTFM7CisKKwkJLy8gc2F2ZSB0aGUgc3RyZWFtIHN0YXJ0aW5nIHBvaW50CisJCWNvbnN0IGxvbmcgc3RyZWFtX3N0YXJ0ID0gaW8tPnRlbGxfcHJvYyhoYW5kbGUpOworCisJCS8vIHdyYXAgdGhlIEZyZWVJbWFnZSBJTyBzdHJlYW0KKwkJQ19JU3RyZWFtIGlzdHJlYW0oaW8sIGhhbmRsZSk7CisKKwkJLy8gb3BlbiB0aGUgZmlsZQorCQlJbWY6OklucHV0RmlsZSBmaWxlKGlzdHJlYW0pOworCisJCS8vIGdldCBmaWxlIGluZm8JCQkKKwkJY29uc3QgSW1hdGg6OkJveDJpICZkYXRhV2luZG93ID0gZmlsZS5oZWFkZXIoKS5kYXRhV2luZG93KCk7CisJCWludCB3aWR0aCAgPSBkYXRhV2luZG93Lm1heC54IC0gZGF0YVdpbmRvdy5taW4ueCArIDE7CisJCWludCBoZWlnaHQgPSBkYXRhV2luZG93Lm1heC55IC0gZGF0YVdpbmRvdy5taW4ueSArIDE7CisKKwkJLy9jb25zdCBJbWY6OkNvbXByZXNzaW9uICZjb21wcmVzc2lvbiA9IGZpbGUuaGVhZGVyKCkuY29tcHJlc3Npb24oKTsKKworCQljb25zdCBJbWY6OkNoYW5uZWxMaXN0ICZjaGFubmVscyA9IGZpbGUuaGVhZGVyKCkuY2hhbm5lbHMoKTsKKworCQkvLyBjaGVjayB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMgYW5kIGNoZWNrIGZvciBhIGNvaGVyZW50IGZvcm1hdAorCisJCXN0ZDo6c3RyaW5nIGV4cl9jb2xvcl9tb2RlbDsKKwkJSW1mOjpQaXhlbFR5cGUgcGl4ZWxfdHlwZSA9IEltZjo6SEFMRjsKKwkJRlJFRV9JTUFHRV9UWVBFIGltYWdlX3R5cGUgPSBGSVRfVU5LTk9XTjsKKwkJaW50IGNvbXBvbmVudHMgPSAwOworCQlib29sIGJNaXhlZENvbXBvbmVudHMgPSBmYWxzZTsKKworCQlmb3IgKEltZjo6Q2hhbm5lbExpc3Q6OkNvbnN0SXRlcmF0b3IgaSA9IGNoYW5uZWxzLmJlZ2luKCk7IGkgIT0gY2hhbm5lbHMuZW5kKCk7ICsraSkgeworCQkJY29tcG9uZW50cysrOworCQkJaWYoY29tcG9uZW50cyA9PSAxKSB7CisJCQkJZXhyX2NvbG9yX21vZGVsICs9IGkubmFtZSgpOworCQkJCXBpeGVsX3R5cGUgPSBpLmNoYW5uZWwoKS50eXBlOworCQkJfSBlbHNlIHsKKwkJCQlleHJfY29sb3JfbW9kZWwgKz0gIi8iOworCQkJCWV4cl9jb2xvcl9tb2RlbCArPSBpLm5hbWUoKTsKKwkJCQlpZiAoaS5jaGFubmVsKCkudHlwZSAhPSBwaXhlbF90eXBlKSB7CisJCQkJCWJNaXhlZENvbXBvbmVudHMgPSB0cnVlOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmKGJNaXhlZENvbXBvbmVudHMpIHsKKwkJCWJvb2wgYkhhbmRsZWQgPSBmYWxzZTsKKwkJCS8vIHdlIG1heSBoYXZlIGEgUkdCWiBvciBSR0JBWiBpbWFnZSAuLi4gCisJCQlpZihjb21wb25lbnRzID4gNCkgeworCQkJCWlmKGNoYW5uZWxzLmZpbmRDaGFubmVsKCJSIikgJiYgY2hhbm5lbHMuZmluZENoYW5uZWwoIkciKSAmJiBjaGFubmVscy5maW5kQ2hhbm5lbCgiQiIpICYmIGNoYW5uZWxzLmZpbmRDaGFubmVsKCJBIikpIHsKKwkJCQkJc3RkOjpzdHJpbmcgbXNnID0gIldhcm5pbmc6IGNvbnZlcnRpbmcgY29sb3IgbW9kZWwgIiArIGV4cl9jb2xvcl9tb2RlbCArICIgdG8gUkdCQSBjb2xvciBtb2RlbCI7CisJCQkJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhzX2Zvcm1hdF9pZCwgbXNnLmNfc3RyKCkpOworCQkJCQliSGFuZGxlZCA9IHRydWU7CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZihjb21wb25lbnRzID4gMykgeworCQkJCWlmKGNoYW5uZWxzLmZpbmRDaGFubmVsKCJSIikgJiYgY2hhbm5lbHMuZmluZENoYW5uZWwoIkciKSAmJiBjaGFubmVscy5maW5kQ2hhbm5lbCgiQiIpKSB7CisJCQkJCXN0ZDo6c3RyaW5nIG1zZyA9ICJXYXJuaW5nOiBjb252ZXJ0aW5nIGNvbG9yIG1vZGVsICIgKyBleHJfY29sb3JfbW9kZWwgKyAiIHRvIFJHQiBjb2xvciBtb2RlbCI7CisJCQkJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhzX2Zvcm1hdF9pZCwgbXNnLmNfc3RyKCkpOworCQkJCQliSGFuZGxlZCA9IHRydWU7CisJCQkJfQorCQkJfQorCQkJaWYoIWJIYW5kbGVkKSB7CisJCQkJVEhST1cgKElleDo6SW5wdXRFeGMsICJVbmFibGUgdG8gaGFuZGxlIG1peGVkIGNvbXBvbmVudCB0eXBlcyAoY29sb3IgbW9kZWwgPSAiIDw8IGV4cl9jb2xvcl9tb2RlbCA8PCAiKSIpOworCQkJfSAKKwkJfQorCisJCXN3aXRjaChwaXhlbF90eXBlKSB7CisJCQljYXNlIEltZjo6VUlOVDoKKwkJCQlUSFJPVyAoSWV4OjpJbnB1dEV4YywgIlVuc3VwcG9ydGVkIGZvcm1hdDogVUlOVCIpOworCQkJCWJyZWFrOworCQkJY2FzZSBJbWY6OkhBTEY6CisJCQljYXNlIEltZjo6RkxPQVQ6CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQl9CisKKwkJLy8gY2hlY2sgZm9yIHN1cHBvcnRlZCBpbWFnZSBjb2xvciBtb2RlbHMKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCQlpZigoY29tcG9uZW50cyA9PSAxKSB8fCAoY29tcG9uZW50cyA9PSAyKSkgewkJCQkKKwkJCS8vIGlmIHRoZSBpbWFnZSBpcyBncmF5LWFscGhhIChZQSksIGlnbm9yZSB0aGUgYWxwaGEgY2hhbm5lbAorCQkJaWYoKGNvbXBvbmVudHMgPT0gMSkgJiYgY2hhbm5lbHMuZmluZENoYW5uZWwoIlkiKSkgeworCQkJCWltYWdlX3R5cGUgPSBGSVRfRkxPQVQ7CisJCQkJY29tcG9uZW50cyA9IDE7CisJCQl9IGVsc2UgeworCQkJCXN0ZDo6c3RyaW5nIG1zZyA9ICJXYXJuaW5nOiBsb2FkaW5nIGNvbG9yIG1vZGVsICIgKyBleHJfY29sb3JfbW9kZWwgKyAiIGFzIFkgY29sb3IgbW9kZWwiOworCQkJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhzX2Zvcm1hdF9pZCwgbXNnLmNfc3RyKCkpOworCQkJCWltYWdlX3R5cGUgPSBGSVRfRkxPQVQ7CisJCQkJLy8gaWdub3JlIHRoZSBvdGhlciBjaGFubmVsCisJCQkJY29tcG9uZW50cyA9IDE7CisJCQl9CisJCX0gZWxzZSBpZihjb21wb25lbnRzID09IDMpIHsKKwkJCWlmKGNoYW5uZWxzLmZpbmRDaGFubmVsKCJSIikgJiYgY2hhbm5lbHMuZmluZENoYW5uZWwoIkciKSAmJiBjaGFubmVscy5maW5kQ2hhbm5lbCgiQiIpKSB7CisJCQkJaW1hZ2VfdHlwZSA9IEZJVF9SR0JGOworCQkJfQorCQkJZWxzZSBpZihjaGFubmVscy5maW5kQ2hhbm5lbCgiQlkiKSAmJiBjaGFubmVscy5maW5kQ2hhbm5lbCgiUlkiKSAmJiBjaGFubmVscy5maW5kQ2hhbm5lbCgiWSIpKSB7CisJCQkJaW1hZ2VfdHlwZSA9IEZJVF9SR0JGOworCQkJCWJVc2VSZ2JhSW50ZXJmYWNlID0gdHJ1ZTsKKwkJCX0KKwkJfSBlbHNlIGlmKGNvbXBvbmVudHMgPj0gNCkgeworCQkJaWYoY2hhbm5lbHMuZmluZENoYW5uZWwoIlIiKSAmJiBjaGFubmVscy5maW5kQ2hhbm5lbCgiRyIpICYmIGNoYW5uZWxzLmZpbmRDaGFubmVsKCJCIikpIHsKKwkJCQlpZihjaGFubmVscy5maW5kQ2hhbm5lbCgiQSIpKSB7CisJCQkJCWlmKGNvbXBvbmVudHMgPiA0KSB7CisJCQkJCQlzdGQ6OnN0cmluZyBtc2cgPSAiV2FybmluZzogY29udmVydGluZyBjb2xvciBtb2RlbCAiICsgZXhyX2NvbG9yX21vZGVsICsgIiB0byBSR0JBIGNvbG9yIG1vZGVsIjsKKwkJCQkJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhzX2Zvcm1hdF9pZCwgbXNnLmNfc3RyKCkpOworCQkJCQl9CisJCQkJCWltYWdlX3R5cGUgPSBGSVRfUkdCQUY7CisJCQkJCS8vIGlnbm9yZSBvdGhlciBsYXllcnMgaWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBhbHBoYSBsYXllcgorCQkJCQljb21wb25lbnRzID0gNDsKKwkJCQl9IGVsc2UgeworCQkJCQlzdGQ6OnN0cmluZyBtc2cgPSAiV2FybmluZzogY29udmVydGluZyBjb2xvciBtb2RlbCAiICsgZXhyX2NvbG9yX21vZGVsICsgIiB0byBSR0IgY29sb3IgbW9kZWwiOworCQkJCQlGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2Moc19mb3JtYXRfaWQsIG1zZy5jX3N0cigpKTsKKworCQkJCQlpbWFnZV90eXBlID0gRklUX1JHQkY7CisJCQkJCS8vIGlnbm9yZSBvdGhlciBjaGFubmVscworCQkJCQljb21wb25lbnRzID0gMzsJCQkJCQorCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmKGltYWdlX3R5cGUgPT0gRklUX1VOS05PV04pIHsKKwkJCVRIUk9XIChJZXg6OklucHV0RXhjLCAiVW5zdXBwb3J0ZWQgY29sb3IgbW9kZWw6ICIgPDwgZXhyX2NvbG9yX21vZGVsKTsKKwkJfQorCisJCS8vIGFsbG9jYXRlIGEgbmV3IGRpYgorCQlkaWIgPSBGcmVlSW1hZ2VfQWxsb2NhdGVIZWFkZXJUKGhlYWRlcl9vbmx5LCBpbWFnZV90eXBlLCB3aWR0aCwgaGVpZ2h0LCAwKTsKKwkJaWYoIWRpYikgVEhST1cgKElleDo6TnVsbEV4YywgRklfTVNHX0VSUk9SX01FTU9SWSk7CisKKwkJLy8gdHJ5IHRvIGxvYWQgdGhlIHByZXZpZXcgaW1hZ2UKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCQlpZihmaWxlLmhlYWRlcigpLmhhc1ByZXZpZXdJbWFnZSgpKSB7CisJCQljb25zdCBJbWY6OlByZXZpZXdJbWFnZSYgcHJldmlldyA9IGZpbGUuaGVhZGVyKCkucHJldmlld0ltYWdlKCk7CisJCQljb25zdCB1bnNpZ25lZCB0aFdpZHRoID0gcHJldmlldy53aWR0aCgpOworCQkJY29uc3QgdW5zaWduZWQgdGhIZWlnaHQgPSBwcmV2aWV3LmhlaWdodCgpOworCQkJCisJCQlGSUJJVE1BUCogdGh1bWJuYWlsID0gRnJlZUltYWdlX0FsbG9jYXRlKHRoV2lkdGgsIHRoSGVpZ2h0LCAzMik7CisJCQlpZih0aHVtYm5haWwpIHsKKwkJCQljb25zdCBJbWY6OlByZXZpZXdSZ2JhICpzcmNfbGluZSA9IHByZXZpZXcucGl4ZWxzKCk7CisJCQkJQllURSAqZHN0X2xpbmUgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUodGh1bWJuYWlsLCB0aEhlaWdodCAtIDEpOworCQkJCWNvbnN0IHVuc2lnbmVkIGRzdFBpdGNoID0gRnJlZUltYWdlX0dldFBpdGNoKHRodW1ibmFpbCk7CisJCQkJCisJCQkJZm9yICh1bnNpZ25lZCB5ID0gMDsgeSA8IHRoSGVpZ2h0OyArK3kpIHsKKwkJCQkJY29uc3QgSW1mOjpQcmV2aWV3UmdiYSAqc3JjX3BpeGVsID0gc3JjX2xpbmU7CisJCQkJCVJHQlFVQUQqIGRzdF9waXhlbCA9IChSR0JRVUFEKilkc3RfbGluZTsKKwkJCQkJCisJCQkJCWZvcih1bnNpZ25lZCB4ID0gMDsgeCA8IHRoV2lkdGg7ICsreCkgeworCQkJCQkJZHN0X3BpeGVsLT5yZ2JSZWQgPSBzcmNfcGl4ZWwtPnI7CisJCQkJCQlkc3RfcGl4ZWwtPnJnYkdyZWVuID0gc3JjX3BpeGVsLT5nOworCQkJCQkJZHN0X3BpeGVsLT5yZ2JCbHVlID0gc3JjX3BpeGVsLT5iOworCQkJCQkJZHN0X3BpeGVsLT5yZ2JSZXNlcnZlZCA9IHNyY19waXhlbC0+YTsJCQkJCisJCQkJCQlzcmNfcGl4ZWwrKzsKKwkJCQkJCWRzdF9waXhlbCsrOworCQkJCQl9CisJCQkJCXNyY19saW5lICs9IHRoV2lkdGg7CisJCQkJCWRzdF9saW5lIC09IGRzdFBpdGNoOworCQkJCX0KKwkJCQlGcmVlSW1hZ2VfU2V0VGh1bWJuYWlsKGRpYiwgdGh1bWJuYWlsKTsKKwkJCQlGcmVlSW1hZ2VfVW5sb2FkKHRodW1ibmFpbCk7CisJCQl9CisJCX0KKworCQlpZihoZWFkZXJfb25seSkgeworCQkJLy8gaGVhZGVyIG9ubHkgbW9kZQorCQkJcmV0dXJuIGRpYjsKKwkJfQorCisJCS8vIGxvYWQgcGl4ZWxzCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwkJY29uc3QgQllURSAqYml0cyA9IEZyZWVJbWFnZV9HZXRCaXRzKGRpYik7CQkJLy8gcG9pbnRlciB0byBvdXIgcGl4ZWwgYnVmZmVyCisJCWNvbnN0IHNpemVfdCBieXRlc3BwID0gc2l6ZW9mKGZsb2F0KSAqIGNvbXBvbmVudHM7CS8vIHNpemUgb2Ygb3VyIHBpeGVsIGluIGJ5dGVzCisJCWNvbnN0IHVuc2lnbmVkIHBpdGNoID0gRnJlZUltYWdlX0dldFBpdGNoKGRpYik7CQkvLyBzaXplIG9mIG91ciB5U3RyaWRlIGluIGJ5dGVzCisKKwkJSW1mOjpQaXhlbFR5cGUgcGl4ZWxUeXBlID0gSW1mOjpGTE9BVDsJLy8gbG9hZCBhcyBmbG9hdCBkYXRhIHR5cGU7CisJCQorCQlpZihiVXNlUmdiYUludGVyZmFjZSkgeworCQkJLy8gdXNlIHRoZSBSR0JBIGludGVyZmFjZSAodXNlZCB3aGVuIGxvYWRpbmcgUlkgQlkgWSBpbWFnZXMgKQorCisJCQljb25zdCBpbnQgY2h1bmtfc2l6ZSA9IDE2OworCisJCQlCWVRFICpzY2FubGluZSA9IChCWVRFKiliaXRzOworCisJCQkvLyByZS1vcGVuIHVzaW5nIHRoZSBSR0JBIGludGVyZmFjZQorCQkJaW8tPnNlZWtfcHJvYyhoYW5kbGUsIHN0cmVhbV9zdGFydCwgU0VFS19TRVQpOworCQkJSW1mOjpSZ2JhSW5wdXRGaWxlIHJnYmFGaWxlKGlzdHJlYW0pOworCisJCQkvLyByZWFkIHRoZSBmaWxlIGluIGNodW5rcworCQkJSW1hdGg6OkJveDJpIGR3ID0gZGF0YVdpbmRvdzsKKwkJCUltZjo6QXJyYXkyRDxJbWY6OlJnYmE+IGNodW5rKGNodW5rX3NpemUsIHdpZHRoKTsKKwkJCXdoaWxlIChkdy5taW4ueSA8PSBkdy5tYXgueSkgeworCQkJCS8vIHJlYWQgYSBjaHVuaworCQkJCXJnYmFGaWxlLnNldEZyYW1lQnVmZmVyICgmY2h1bmtbMF1bMF0gLSBkdy5taW4ueCAtIGR3Lm1pbi55ICogd2lkdGgsIDEsIHdpZHRoKTsKKwkJCQlyZ2JhRmlsZS5yZWFkUGl4ZWxzIChkdy5taW4ueSwgTUlOKGR3Lm1pbi55ICsgY2h1bmtfc2l6ZSAtIDEsIGR3Lm1heC55KSk7CisJCQkJLy8gZmlsbCB0aGUgZGliCisJCQkJY29uc3QgaW50IHlfbWF4ID0gKChkdy5tYXgueSAtIGR3Lm1pbi55KSA8PSBjaHVua19zaXplKSA/IChkdy5tYXgueSAtIGR3Lm1pbi55KSA6IGNodW5rX3NpemU7CisJCQkJZm9yKGludCB5ID0gMDsgeSA8IHlfbWF4OyB5KyspIHsKKwkJCQkJRklSR0JGICpwaXhlbCA9IChGSVJHQkYqKXNjYW5saW5lOworCQkJCQljb25zdCBJbWY6OlJnYmEgKmhhbGZfcmdiYSA9IGNodW5rW3ldOworCQkJCQlmb3IoaW50IHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworCQkJCQkJLy8gY29udmVydCBmcm9tIGhhbGYgdG8gZmxvYXQKKwkJCQkJCXBpeGVsW3hdLnJlZCA9IGhhbGZfcmdiYVt4XS5yOworCQkJCQkJcGl4ZWxbeF0uZ3JlZW4gPSBoYWxmX3JnYmFbeF0uZzsKKwkJCQkJCXBpeGVsW3hdLmJsdWUgPSBoYWxmX3JnYmFbeF0uYjsKKwkJCQkJfQorCQkJCQkvLyBuZXh0IGxpbmUKKwkJCQkJc2NhbmxpbmUgKz0gcGl0Y2g7CisJCQkJfQorCQkJCS8vIG5leHQgY2h1bmsKKwkJCQlkdy5taW4ueSArPSBjaHVua19zaXplOworCQkJfQorCisJCX0gZWxzZSB7CisJCQkvLyB1c2UgdGhlIGxvdyBsZXZlbCBpbnRlcmZhY2UKKworCQkJLy8gYnVpbGQgYSBmcmFtZSBidWZmZXIgKGkuZS4gd2hhdCB3ZSB3YW50IG9uIG91dHB1dCkKKwkJCUltZjo6RnJhbWVCdWZmZXIgZnJhbWVCdWZmZXI7CisKKwkJCS8vIGFsbG93IGRhdGFXaW5kb3cgd2l0aCBtaW5pbWFsIGJvdW5kcyBkaWZmZXJlbnQgZm9ybSB6ZXJvCisJCQlzaXplX3Qgb2Zmc2V0ID0gLSBkYXRhV2luZG93Lm1pbi54ICogYnl0ZXNwcCAtIGRhdGFXaW5kb3cubWluLnkgKiBwaXRjaDsKKworCQkJaWYoY29tcG9uZW50cyA9PSAxKSB7CisJCQkJZnJhbWVCdWZmZXIuaW5zZXJ0ICgiWSIsCS8vIG5hbWUKKwkJCQkJSW1mOjpTbGljZSAocGl4ZWxUeXBlLAkvLyB0eXBlCisJCQkJCShjaGFyKikoYml0cyArIG9mZnNldCksIC8vIGJhc2UKKwkJCQkJYnl0ZXNwcCwJCQkJLy8geFN0cmlkZQorCQkJCQlwaXRjaCwJCQkJCS8vIHlTdHJpZGUKKwkJCQkJMSwgMSwJCQkJCS8vIHgveSBzYW1wbGluZworCQkJCQkwLjApKTsJCQkJCS8vIGZpbGxWYWx1ZQorCQkJfSBlbHNlIGlmKChjb21wb25lbnRzID09IDMpIHx8IChjb21wb25lbnRzID09IDQpKSB7CisJCQkJY29uc3QgY2hhciAqY2hhbm5lbF9uYW1lWzRdID0geyAiUiIsICJHIiwgIkIiLCAiQSIgfTsKKworCQkJCWZvcihpbnQgYyA9IDA7IGMgPCBjb21wb25lbnRzOyBjKyspIHsKKwkJCQkJZnJhbWVCdWZmZXIuaW5zZXJ0ICgKKwkJCQkJCWNoYW5uZWxfbmFtZVtjXSwJCQkJCS8vIG5hbWUKKwkJCQkJCUltZjo6U2xpY2UgKHBpeGVsVHlwZSwJCQkJLy8gdHlwZQorCQkJCQkJKGNoYXIqKShiaXRzICsgYyAqIHNpemVvZihmbG9hdCkgKyBvZmZzZXQpLCAvLyBiYXNlCisJCQkJCQlieXRlc3BwLAkJCQkJCQkvLyB4U3RyaWRlCisJCQkJCQlwaXRjaCwJCQkJCQkJCS8vIHlTdHJpZGUKKwkJCQkJCTEsIDEsCQkJCQkJCQkvLyB4L3kgc2FtcGxpbmcKKwkJCQkJCTAuMCkpOwkJCQkJCQkJLy8gZmlsbFZhbHVlCisJCQkJfQorCQkJfQorCisJCQkvLyByZWFkIHRoZSBmaWxlCisJCQlmaWxlLnNldEZyYW1lQnVmZmVyKGZyYW1lQnVmZmVyKTsKKwkJCWZpbGUucmVhZFBpeGVscyhkYXRhV2luZG93Lm1pbi55LCBkYXRhV2luZG93Lm1heC55KTsKKwkJfQorCisJCS8vIGxhc3RseSwgZmxpcCBkaWIgbGluZXMKKwkJRnJlZUltYWdlX0ZsaXBWZXJ0aWNhbChkaWIpOworCisJfQorCWNhdGNoKElleDo6QmFzZUV4YyAmIGUpIHsKKwkJaWYoZGliICE9IE5VTEwpIHsKKwkJCUZyZWVJbWFnZV9VbmxvYWQoZGliKTsKKwkJfQorCQlGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2Moc19mb3JtYXRfaWQsIGUud2hhdCgpKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIGRpYjsKK30KKworLyoqCitTZXQgdGhlIHByZXZpZXcgaW1hZ2UgdXNpbmcgdGhlIGRpYiBlbWJlZGRlZCB0aHVtYm5haWwKKyovCitzdGF0aWMgQk9PTAorU2V0UHJldmlld0ltYWdlKEZJQklUTUFQICpkaWIsIEltZjo6SGVhZGVyJiBoZWFkZXIpIHsKKwlpZighRnJlZUltYWdlX0dldFRodW1ibmFpbChkaWIpKSB7CisJCXJldHVybiBGQUxTRTsKKwl9CisJRklCSVRNQVAqIHRodW1ibmFpbCA9IEZyZWVJbWFnZV9HZXRUaHVtYm5haWwoZGliKTsKKworCWlmKChGcmVlSW1hZ2VfR2V0SW1hZ2VUeXBlKHRodW1ibmFpbCkgIT0gRklUX0JJVE1BUCkgfHwgKEZyZWVJbWFnZV9HZXRCUFAodGh1bWJuYWlsKSAhPSAzMikpIHsKKwkJLy8gaW52YWxpZCB0aHVtYm5haWwgLSBpZ25vcmUgaXQKKwkJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKHNfZm9ybWF0X2lkLCBGSV9NU0dfV0FSTklOR19JTlZBTElEX1RIVU1CTkFJTCk7CisJfSBlbHNlIHsKKwkJY29uc3QgdW5zaWduZWQgdGhXaWR0aCA9IEZyZWVJbWFnZV9HZXRXaWR0aCh0aHVtYm5haWwpOworCQljb25zdCB1bnNpZ25lZCB0aEhlaWdodCA9IEZyZWVJbWFnZV9HZXRIZWlnaHQodGh1bWJuYWlsKTsKKwkJCisJCUltZjo6UHJldmlld0ltYWdlIHByZXZpZXcodGhXaWR0aCwgdGhIZWlnaHQpOworCisJCS8vIGNvcHkgdGh1bWJuYWlsIHRvIDMyLWJpdCBSR0JBIHByZXZpZXcgaW1hZ2UKKwkJCisJCWNvbnN0IEJZVEUqIHNyY19saW5lID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKHRodW1ibmFpbCwgdGhIZWlnaHQgLSAxKTsKKwkJSW1mOjpQcmV2aWV3UmdiYSogZHN0X2xpbmUgPSBwcmV2aWV3LnBpeGVscygpOworCQljb25zdCB1bnNpZ25lZCBzcmNQaXRjaCA9IEZyZWVJbWFnZV9HZXRQaXRjaCh0aHVtYm5haWwpOworCQkKKwkJZm9yICh1bnNpZ25lZCB5ID0gMDsgeSA8IHRoSGVpZ2h0OyB5KyspIHsKKwkJCWNvbnN0IFJHQlFVQUQqIHNyY19waXhlbCA9IChSR0JRVUFEKilzcmNfbGluZTsKKwkJCUltZjo6UHJldmlld1JnYmEqIGRzdF9waXhlbCA9IGRzdF9saW5lOworCQkJCisJCQlmb3IodW5zaWduZWQgeCA9IDA7IHggPCB0aFdpZHRoOyB4KyspIHsKKwkJCQlkc3RfcGl4ZWwtPnIgPSBzcmNfcGl4ZWwtPnJnYlJlZDsKKwkJCQlkc3RfcGl4ZWwtPmcgPSBzcmNfcGl4ZWwtPnJnYkdyZWVuOworCQkJCWRzdF9waXhlbC0+YiA9IHNyY19waXhlbC0+cmdiQmx1ZTsKKwkJCQlkc3RfcGl4ZWwtPmEgPSBzcmNfcGl4ZWwtPnJnYlJlc2VydmVkOworCQkJCQorCQkJCXNyY19waXhlbCsrOworCQkJCWRzdF9waXhlbCsrOworCQkJfQorCQkJCisJCQlzcmNfbGluZSAtPSBzcmNQaXRjaDsKKwkJCWRzdF9saW5lICs9IHRoV2lkdGg7CisJCX0KKwkJCisJCWhlYWRlci5zZXRQcmV2aWV3SW1hZ2UocHJldmlldyk7CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorU2F2ZSB1c2luZyBFWFJfTEMgY29tcHJlc3Npb24gKHdvcmtzIG9ubHkgd2l0aCBSR0JbQV1GIGltYWdlcykKKyovCitzdGF0aWMgQk9PTCAKK1NhdmVBc0VYUl9MQyhDX09TdHJlYW0mIG9zdHJlYW0sIEZJQklUTUFQICpkaWIsIEltZjo6SGVhZGVyJiBoZWFkZXIsIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworCWludCB4LCB5OworCUltZjo6UmdiYUNoYW5uZWxzIHJnYmFDaGFubmVsczsKKworCXRyeSB7CisKKwkJRlJFRV9JTUFHRV9UWVBFIGltYWdlX3R5cGUgPSBGcmVlSW1hZ2VfR2V0SW1hZ2VUeXBlKGRpYik7CisKKwkJLy8gY29udmVydCBmcm9tIGZsb2F0IHRvIGhhbGYKKwkJSW1mOjpBcnJheTJEPEltZjo6UmdiYT4gcGl4ZWxzKGhlaWdodCwgd2lkdGgpOworCQlzd2l0Y2goaW1hZ2VfdHlwZSkgeworCQkJY2FzZSBGSVRfUkdCRjoKKwkJCQlyZ2JhQ2hhbm5lbHMgPSBJbWY6OldSSVRFX1lDOworCQkJCWZvcih5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisJCQkJCUZJUkdCRiAqc3JjX2JpdHMgPSAoRklSR0JGKilGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCBoZWlnaHQgLSAxIC0geSk7CisJCQkJCWZvcih4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQkJCUltZjo6UmdiYSAmZHN0X2JpdHMgPSBwaXhlbHNbeV1beF07CisJCQkJCQlkc3RfYml0cy5yID0gc3JjX2JpdHNbeF0ucmVkOworCQkJCQkJZHN0X2JpdHMuZyA9IHNyY19iaXRzW3hdLmdyZWVuOworCQkJCQkJZHN0X2JpdHMuYiA9IHNyY19iaXRzW3hdLmJsdWU7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIEZJVF9SR0JBRjoKKwkJCQlyZ2JhQ2hhbm5lbHMgPSBJbWY6OldSSVRFX1lDQTsKKwkJCQlmb3IoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworCQkJCQlGSVJHQkFGICpzcmNfYml0cyA9IChGSVJHQkFGKilGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCBoZWlnaHQgLSAxIC0geSk7CisJCQkJCWZvcih4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQkJCUltZjo6UmdiYSAmZHN0X2JpdHMgPSBwaXhlbHNbeV1beF07CisJCQkJCQlkc3RfYml0cy5yID0gc3JjX2JpdHNbeF0ucmVkOworCQkJCQkJZHN0X2JpdHMuZyA9IHNyY19iaXRzW3hdLmdyZWVuOworCQkJCQkJZHN0X2JpdHMuYiA9IHNyY19iaXRzW3hdLmJsdWU7CisJCQkJCQlkc3RfYml0cy5hID0gc3JjX2JpdHNbeF0uYWxwaGE7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCVRIUk9XIChJZXg6OklvRXhjLCAiQmFkIGltYWdlIHR5cGUiKTsKKwkJCQlicmVhazsKKwkJfQorCisJCS8vIHdyaXRlIHRoZSBkYXRhCisJCUltZjo6UmdiYU91dHB1dEZpbGUgZmlsZShvc3RyZWFtLCBoZWFkZXIsIHJnYmFDaGFubmVscyk7CisJCWZpbGUuc2V0RnJhbWVCdWZmZXIgKCZwaXhlbHNbMF1bMF0sIDEsIHdpZHRoKTsKKwkJZmlsZS53cml0ZVBpeGVscyAoaGVpZ2h0KTsKKworCQlyZXR1cm4gVFJVRTsKKworCX0gY2F0Y2goSWV4OjpCYXNlRXhjICYgZSkgeworCQlGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2Moc19mb3JtYXRfaWQsIGUud2hhdCgpKTsKKworCQlyZXR1cm4gRkFMU0U7CisJfQorCit9CisKK3N0YXRpYyBCT09MIERMTF9DQUxMQ09OVgorU2F2ZShGcmVlSW1hZ2VJTyAqaW8sIEZJQklUTUFQICpkaWIsIGZpX2hhbmRsZSBoYW5kbGUsIGludCBwYWdlLCBpbnQgZmxhZ3MsIHZvaWQgKmRhdGEpIHsKKwljb25zdCBjaGFyICpjaGFubmVsX25hbWVbNF0gPSB7ICJSIiwgIkciLCAiQiIsICJBIiB9OworCUJPT0wgYklzRmxpcHBlZCA9IEZBTFNFOworCWhhbGYgKmhhbGZEYXRhID0gTlVMTDsKKworCWlmKCFkaWIgfHwgIWhhbmRsZSkgcmV0dXJuIEZBTFNFOworCisJdHJ5IHsKKwkJLy8gY2hlY2sgZm9yIEVYUl9MQyBjb21wcmVzc2lvbiBhbmQgdmVyaWZ5IHRoYXQgdGhlIGZvcm1hdCBpcyBSR0IKKwkJaWYoKGZsYWdzICYgRVhSX0xDKSA9PSBFWFJfTEMpIHsKKwkJCUZSRUVfSU1BR0VfVFlQRSBpbWFnZV90eXBlID0gRnJlZUltYWdlX0dldEltYWdlVHlwZShkaWIpOworCQkJaWYoKChpbWFnZV90eXBlICE9IEZJVF9SR0JGKSAmJiAoaW1hZ2VfdHlwZSAhPSBGSVRfUkdCQUYpKSB8fCAoKGZsYWdzICYgRVhSX0ZMT0FUKSA9PSBFWFJfRkxPQVQpKSB7CisJCQkJVEhST1cgKElleDo6SW9FeGMsICJFWFJfTEMgY29tcHJlc3Npb24gaXMgb25seSBhdmFpbGFibGUgd2l0aCBSR0JbQV1GIGltYWdlcyIpOworCQkJfQorCQkJaWYoKEZyZWVJbWFnZV9HZXRXaWR0aChkaWIpICUgMikgfHwgKEZyZWVJbWFnZV9HZXRIZWlnaHQoZGliKSAlIDIpKSB7CisJCQkJVEhST1cgKElleDo6SW9FeGMsICJFWFJfTEMgY29tcHJlc3Npb24gb25seSB3b3JrcyB3aGVuIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBhIG11bHRpcGxlIG9mIDIiKTsKKwkJCX0KKwkJfQorCisJCS8vIHdyYXAgdGhlIEZyZWVJbWFnZSBJTyBzdHJlYW0KKwkJQ19PU3RyZWFtIG9zdHJlYW0oaW8sIGhhbmRsZSk7CisKKwkJLy8gY29tcHJlc3Npb24KKwkJSW1mOjpDb21wcmVzc2lvbiBjb21wcmVzczsKKwkJaWYoKGZsYWdzICYgRVhSX05PTkUpID09IEVYUl9OT05FKSB7CisJCQkvLyBubyBjb21wcmVzc2lvbgorCQkJY29tcHJlc3MgPSBJbWY6Ok5PX0NPTVBSRVNTSU9OOworCQl9IGVsc2UgaWYoKGZsYWdzICYgRVhSX1pJUCkgPT0gRVhSX1pJUCkgeworCQkJLy8gemxpYiBjb21wcmVzc2lvbiwgaW4gYmxvY2tzIG9mIDE2IHNjYW4gbGluZXMKKwkJCWNvbXByZXNzID0gSW1mOjpaSVBfQ09NUFJFU1NJT047CisJCX0gZWxzZSBpZigoZmxhZ3MgJiBFWFJfUElaKSA9PSBFWFJfUElaKSB7CisJCQkvLyBwaXotYmFzZWQgd2F2ZWxldCBjb21wcmVzc2lvbgorCQkJY29tcHJlc3MgPSBJbWY6OlBJWl9DT01QUkVTU0lPTjsKKwkJfSBlbHNlIGlmKChmbGFncyAmIEVYUl9QWFIyNCkgPT0gRVhSX1BYUjI0KSB7CisJCQkvLyBsb3NzeSAyNC1iaXQgZmxvYXQgY29tcHJlc3Npb24KKwkJCWNvbXByZXNzID0gSW1mOjpQWFIyNF9DT01QUkVTU0lPTjsKKwkJfSBlbHNlIGlmKChmbGFncyAmIEVYUl9CNDQpID09IEVYUl9CNDQpIHsKKwkJCS8vIGxvc3N5IDQ0JSBmbG9hdCBjb21wcmVzc2lvbgorCQkJY29tcHJlc3MgPSBJbWY6OkI0NF9DT01QUkVTU0lPTjsKKwkJfSBlbHNlIHsKKwkJCS8vIGRlZmF1bHQgdmFsdWUKKwkJCWNvbXByZXNzID0gSW1mOjpQSVpfQ09NUFJFU1NJT047CisJCX0KKworCQkvLyBjcmVhdGUgdGhlIGhlYWRlcgorCQlpbnQgd2lkdGggID0gRnJlZUltYWdlX0dldFdpZHRoKGRpYik7CisJCWludCBoZWlnaHQgPSBGcmVlSW1hZ2VfR2V0SGVpZ2h0KGRpYik7CisJCWludCBkeCA9IDAsIGR5ID0gMDsKKworCQlJbWF0aDo6Qm94MmkgZGF0YVdpbmRvdyAoSW1hdGg6OlYyaSAoMCwgMCksIEltYXRoOjpWMmkgKHdpZHRoIC0gMSwgaGVpZ2h0IC0gMSkpOworCQlJbWF0aDo6Qm94MmkgZGlzcGxheVdpbmRvdyAoSW1hdGg6OlYyaSAoLWR4LCAtZHkpLCBJbWF0aDo6VjJpICh3aWR0aCAtIGR4IC0gMSwgaGVpZ2h0IC0gZHkgLSAxKSk7CisKKwkJSW1mOjpIZWFkZXIgaGVhZGVyID0gSW1mOjpIZWFkZXIoZGlzcGxheVdpbmRvdywgZGF0YVdpbmRvdywgMSwgCisJCQlJbWF0aDo6VjJmKDAsMCksIDEsIAorCQkJSW1mOjpJTkNSRUFTSU5HX1ksIGNvbXByZXNzKTsgICAgICAgIAkJCisKKwkJLy8gaGFuZGxlIHRodW1ibmFpbAorCQlTZXRQcmV2aWV3SW1hZ2UoZGliLCBoZWFkZXIpOworCQkKKwkJLy8gY2hlY2sgZm9yIEVYUl9MQyBjb21wcmVzc2lvbgorCQlpZigoZmxhZ3MgJiBFWFJfTEMpID09IEVYUl9MQykgeworCQkJcmV0dXJuIFNhdmVBc0VYUl9MQyhvc3RyZWFtLCBkaWIsIGhlYWRlciwgd2lkdGgsIGhlaWdodCk7CisJCX0KKworCQkvLyBvdXRwdXQgcGl4ZWwgdHlwZQorCQlJbWY6OlBpeGVsVHlwZSBwaXhlbFR5cGU7CisJCWlmKChmbGFncyAmIEVYUl9GTE9BVCkgPT0gRVhSX0ZMT0FUKSB7CisJCQlwaXhlbFR5cGUgPSBJbWY6OkZMT0FUOwkvLyBzYXZlIGFzIGZsb2F0IGRhdGEgdHlwZQorCQl9IGVsc2UgeworCQkJLy8gZGVmYXVsdCB2YWx1ZQorCQkJcGl4ZWxUeXBlID0gSW1mOjpIQUxGOwkvLyBzYXZlIGFzIGhhbGYgZGF0YSB0eXBlCisJCX0KKworCQkvLyBjaGVjayB0aGUgZGF0YSB0eXBlIGFuZCBudW1iZXIgb2YgY2hhbm5lbHMKKwkJaW50IGNvbXBvbmVudHMgPSAwOworCQlGUkVFX0lNQUdFX1RZUEUgaW1hZ2VfdHlwZSA9IEZyZWVJbWFnZV9HZXRJbWFnZVR5cGUoZGliKTsKKwkJc3dpdGNoKGltYWdlX3R5cGUpIHsKKwkJCWNhc2UgRklUX0ZMT0FUOgorCQkJCWNvbXBvbmVudHMgPSAxOworCQkJCS8vIGluc2VydCBsdW1pbmFuY2UgY2hhbm5lbAorCQkJCWhlYWRlci5jaGFubmVscygpLmluc2VydCAoIlkiLCBJbWY6OkNoYW5uZWwocGl4ZWxUeXBlKSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEZJVF9SR0JGOgorCQkJCWNvbXBvbmVudHMgPSAzOworCQkJCWZvcihpbnQgYyA9IDA7IGMgPCBjb21wb25lbnRzOyBjKyspIHsKKwkJCQkJLy8gaW5zZXJ0IFIsIEcgYW5kIEIgY2hhbm5lbHMKKwkJCQkJaGVhZGVyLmNoYW5uZWxzKCkuaW5zZXJ0IChjaGFubmVsX25hbWVbY10sIEltZjo6Q2hhbm5lbChwaXhlbFR5cGUpKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIEZJVF9SR0JBRjoKKwkJCQljb21wb25lbnRzID0gNDsKKwkJCQlmb3IoaW50IGMgPSAwOyBjIDwgY29tcG9uZW50czsgYysrKSB7CisJCQkJCS8vIGluc2VydCBSLCBHLCBCIGFuZCBBIGNoYW5uZWxzCisJCQkJCWhlYWRlci5jaGFubmVscygpLmluc2VydCAoY2hhbm5lbF9uYW1lW2NdLCBJbWY6OkNoYW5uZWwocGl4ZWxUeXBlKSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlUSFJPVyAoSWV4OjpBcmdFeGMsICJDYW5ub3Qgc2F2ZTogaW52YWxpZCBkYXRhIHR5cGUuXG5Db252ZXJ0IHRoZSBpbWFnZSB0byBmbG9hdCBiZWZvcmUgc2F2aW5nIGFzIE9wZW5FWFIuIik7CisJCX0KKworCQkvLyBidWlsZCBhIGZyYW1lIGJ1ZmZlciAoaS5lLiB3aGF0IHdlIGhhdmUgb24gaW5wdXQpCisJCUltZjo6RnJhbWVCdWZmZXIgZnJhbWVCdWZmZXI7CisKKwkJQllURSAqYml0cyA9IE5VTEw7CS8vIHBvaW50ZXIgdG8gb3VyIHBpeGVsIGJ1ZmZlcgorCQlzaXplX3QgYnl0ZXNwcCA9IDA7CS8vIHNpemUgb2Ygb3VyIHBpeGVsIGluIGJ5dGVzCisJCXNpemVfdCBieXRlc3BjID0gMDsJLy8gc2l6ZSBvZiBvdXIgcGl4ZWwgY29tcG9uZW50IGluIGJ5dGVzCisJCXVuc2lnbmVkIHBpdGNoID0gMDsJLy8gc2l6ZSBvZiBvdXIgeVN0cmlkZSBpbiBieXRlcworCisKKwkJaWYocGl4ZWxUeXBlID09IEltZjo6SEFMRikgeworCQkJLy8gY29udmVydCBmcm9tIGZsb2F0IHRvIGhhbGYKKwkJCWhhbGZEYXRhID0gbmV3KHN0ZDo6bm90aHJvdykgaGFsZlt3aWR0aCAqIGhlaWdodCAqIGNvbXBvbmVudHNdOworCQkJaWYoIWhhbGZEYXRhKSB7CisJCQkJVEhST1cgKElleDo6TnVsbEV4YywgRklfTVNHX0VSUk9SX01FTU9SWSk7CisJCQl9CisKKwkJCWZvcihpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworCQkJCWZsb2F0ICpzcmNfYml0cyA9IChmbG9hdCopRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgaGVpZ2h0IC0gMSAtIHkpOworCQkJCWhhbGYgKmRzdF9iaXRzID0gaGFsZkRhdGEgKyB5ICogd2lkdGggKiBjb21wb25lbnRzOworCQkJCWZvcihpbnQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisJCQkJCWZvcihpbnQgYyA9IDA7IGMgPCBjb21wb25lbnRzOyBjKyspIHsKKwkJCQkJCWRzdF9iaXRzW2NdID0gc3JjX2JpdHNbY107CisJCQkJCX0KKwkJCQkJc3JjX2JpdHMgKz0gY29tcG9uZW50czsKKwkJCQkJZHN0X2JpdHMgKz0gY29tcG9uZW50czsKKwkJCQl9CisJCQl9CisJCQliaXRzID0gKEJZVEUqKWhhbGZEYXRhOworCQkJYnl0ZXNwYyA9IHNpemVvZihoYWxmKTsKKwkJCWJ5dGVzcHAgPSBzaXplb2YoaGFsZikgKiBjb21wb25lbnRzOworCQkJcGl0Y2ggPSBzaXplb2YoaGFsZikgKiB3aWR0aCAqIGNvbXBvbmVudHM7CisJCX0gZWxzZSBpZihwaXhlbFR5cGUgPT0gSW1mOjpGTE9BVCkgeworCQkJLy8gaW52ZXJ0IGRpYiBzY2FubGluZXMKKwkJCWJJc0ZsaXBwZWQgPSBGcmVlSW1hZ2VfRmxpcFZlcnRpY2FsKGRpYik7CisJCQorCQkJYml0cyA9IEZyZWVJbWFnZV9HZXRCaXRzKGRpYik7CisJCQlieXRlc3BjID0gc2l6ZW9mKGZsb2F0KTsKKwkJCWJ5dGVzcHAgPSBzaXplb2YoZmxvYXQpICogY29tcG9uZW50czsKKwkJCXBpdGNoID0gRnJlZUltYWdlX0dldFBpdGNoKGRpYik7CisJCX0KKworCQlpZihpbWFnZV90eXBlID09IEZJVF9GTE9BVCkgeworCQkJZnJhbWVCdWZmZXIuaW5zZXJ0ICgiWSIsCS8vIG5hbWUKKwkJCQlJbWY6OlNsaWNlIChwaXhlbFR5cGUsCS8vIHR5cGUKKwkJCQkoY2hhciopKGJpdHMpLAkJCS8vIGJhc2UKKwkJCQlieXRlc3BwLAkJCQkvLyB4U3RyaWRlCisJCQkJcGl0Y2gpKTsJCQkJLy8geVN0cmlkZQorCQl9IGVsc2UgaWYoKGltYWdlX3R5cGUgPT0gRklUX1JHQkYpIHx8IChpbWFnZV90eXBlID09IEZJVF9SR0JBRikpIHsJCQkKKwkJCWZvcihpbnQgYyA9IDA7IGMgPCBjb21wb25lbnRzOyBjKyspIHsKKwkJCQljaGFyICpjaGFubmVsX2Jhc2UgPSAoY2hhciopKGJpdHMpICsgYypieXRlc3BjOworCQkJCWZyYW1lQnVmZmVyLmluc2VydCAoY2hhbm5lbF9uYW1lW2NdLC8vIG5hbWUKKwkJCQkJSW1mOjpTbGljZSAocGl4ZWxUeXBlLAkJCS8vIHR5cGUKKwkJCQkJY2hhbm5lbF9iYXNlLAkJCQkJLy8gYmFzZQorCQkJCQlieXRlc3BwLAkvLyB4U3RyaWRlCisJCQkJCXBpdGNoKSk7CS8vIHlTdHJpZGUKKwkJCX0KKwkJfQorCisJCS8vIHdyaXRlIHRoZSBkYXRhCisJCUltZjo6T3V0cHV0RmlsZSBmaWxlIChvc3RyZWFtLCBoZWFkZXIpOworCQlmaWxlLnNldEZyYW1lQnVmZmVyIChmcmFtZUJ1ZmZlcik7CisJCWZpbGUud3JpdGVQaXhlbHMgKGhlaWdodCk7CisKKwkJaWYoaGFsZkRhdGEgIT0gTlVMTCkgeworCQkJZGVsZXRlW10gaGFsZkRhdGE7CisJCX0KKwkJaWYoYklzRmxpcHBlZCkgeworCQkJLy8gaW52ZXJ0IGRpYiBzY2FubGluZXMKKwkJCUZyZWVJbWFnZV9GbGlwVmVydGljYWwoZGliKTsKKwkJfQorCisJCXJldHVybiBUUlVFOworCisJfSBjYXRjaChJZXg6OkJhc2VFeGMgJiBlKSB7CisJCWlmKGhhbGZEYXRhICE9IE5VTEwpIHsKKwkJCWRlbGV0ZVtdIGhhbGZEYXRhOworCQl9CisJCWlmKGJJc0ZsaXBwZWQpIHsKKwkJCS8vIGludmVydCBkaWIgc2NhbmxpbmVzCisJCQlGcmVlSW1hZ2VfRmxpcFZlcnRpY2FsKGRpYik7CisJCX0KKworCQlGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2Moc19mb3JtYXRfaWQsIGUud2hhdCgpKTsKKworCQlyZXR1cm4gRkFMU0U7CisJfQkKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gICBJbml0CisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3ZvaWQgRExMX0NBTExDT05WCitJbml0RVhSKFBsdWdpbiAqcGx1Z2luLCBpbnQgZm9ybWF0X2lkKSB7CisJc19mb3JtYXRfaWQgPSBmb3JtYXRfaWQ7CisKKwkvLyBpbml0aWFsaXplIHRoZSBPcGVuRVhSIGxpYnJhcnkKKwkvLyBub3RlIHRoYXQgdGhpcyBPcGVuRVhSIGZ1bmN0aW9uIHByb2R1Y2Ugc28gY2FsbGVkICJmYWxzZSBtZW1vcnkgbGVha3MiCisJLy8gc2VlIGh0dHA6Ly9saXN0cy5ub25nbnUub3JnL2FyY2hpdmUvaHRtbC9vcGVuZXhyLWRldmVsLzIwMTMtMTEvbXNnMDAwMDAuaHRtbAorCUltZjo6c3RhdGljSW5pdGlhbGl6ZSgpOworCisJcGx1Z2luLT5mb3JtYXRfcHJvYyA9IEZvcm1hdDsKKwlwbHVnaW4tPmRlc2NyaXB0aW9uX3Byb2MgPSBEZXNjcmlwdGlvbjsKKwlwbHVnaW4tPmV4dGVuc2lvbl9wcm9jID0gRXh0ZW5zaW9uOworCXBsdWdpbi0+cmVnZXhwcl9wcm9jID0gUmVnRXhwcjsKKwlwbHVnaW4tPm9wZW5fcHJvYyA9IE5VTEw7CisJcGx1Z2luLT5jbG9zZV9wcm9jID0gTlVMTDsKKwlwbHVnaW4tPnBhZ2Vjb3VudF9wcm9jID0gTlVMTDsKKwlwbHVnaW4tPnBhZ2VjYXBhYmlsaXR5X3Byb2MgPSBOVUxMOworCXBsdWdpbi0+bG9hZF9wcm9jID0gTG9hZDsKKwlwbHVnaW4tPnNhdmVfcHJvYyA9IFNhdmU7CisJcGx1Z2luLT52YWxpZGF0ZV9wcm9jID0gVmFsaWRhdGU7CisJcGx1Z2luLT5taW1lX3Byb2MgPSBNaW1lVHlwZTsKKwlwbHVnaW4tPnN1cHBvcnRzX2V4cG9ydF9icHBfcHJvYyA9IFN1cHBvcnRzRXhwb3J0RGVwdGg7CisJcGx1Z2luLT5zdXBwb3J0c19leHBvcnRfdHlwZV9wcm9jID0gU3VwcG9ydHNFeHBvcnRUeXBlOworCXBsdWdpbi0+c3VwcG9ydHNfaWNjX3Byb2ZpbGVzX3Byb2MgPSBOVUxMOworCXBsdWdpbi0+c3VwcG9ydHNfbm9fcGl4ZWxzX3Byb2MgPSBTdXBwb3J0c05vUGl4ZWxzOworfQpkaWZmIC0tZ2l0IGEvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9QbHVnaW5HMy5jcHAgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL1BsdWdpbkczLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGYxZmFkCi0tLSAvZGV2L251bGwKKysrIGIvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9QbHVnaW5HMy5jcHAKQEAgLTAsMCArMSw0MzIgQEAKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEczIEZheCBMb2FkZXIKKy8vCisvLyBEZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIGJ5CisvLyAtIEhlcnbDqSBEcm9sb24gKGRyb2xvbkBpbmZvbmllLmZyKQorLy8gLSBQZXRyIFB5dGVsa2EgKHB5dGFAbGlnaHRjb21wLmNvbSkKKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBGcmVlSW1hZ2UgMworLy8KKy8vIENPVkVSRUQgQ09ERSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWQorLy8gT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMKKy8vIFRIQVQgVEhFIENPVkVSRUQgQ09ERSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLy8gT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQKKy8vIENPREUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkgQ09WRVJFRCBDT0RFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QKKy8vIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZCisvLyBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMCisvLyBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GIEFOWSBDT1ZFUkVEIENPREUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSCisvLyBUSElTIERJU0NMQUlNRVIuCisvLworLy8gVXNlIGF0IHlvdXIgb3duIHJpc2shCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS90aWZmL2xpYnRpZmYvdGlmZmlvcC5oIgorI2luY2x1ZGUgIkZyZWVJbWFnZS5oIgorI2luY2x1ZGUgIlV0aWxpdGllcy5oIgorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBQbHVnaW4gSW50ZXJmYWNlCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3N0YXRpYyBpbnQgc19mb3JtYXRfaWQ7CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICAgQ29uc3RhbnQvTWFjcm8gZGVjbGFyYXRpb25zCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNkZWZpbmUgRzNfREVGQVVMVF9XSURUSAkxNzI4CisKKyNkZWZpbmUgVElGRmhvd21hbnk4KHgpICgoKHgpJjB4MDcpPygodWludDMyKSh4KT4+MykrMToodWludDMyKSh4KT4+MykKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gICBsaWJ0aWZmIGludGVyZmFjZSAKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3RhdGljIHRtc2l6ZV90IAorX2czUmVhZFByb2ModGhhbmRsZV90IGhhbmRsZSwgdm9pZCAqYnVmLCB0bXNpemVfdCBzaXplKSB7CisJLy8gcmV0dXJucyBhbiBlcnJvciB3aGVuIHJlYWRpbmcgdGhlIFRJRkYgaGVhZGVyCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB0bXNpemVfdAorX2czV3JpdGVQcm9jKHRoYW5kbGVfdCBoYW5kbGUsIHZvaWQgKmJ1ZiwgdG1zaXplX3Qgc2l6ZSkgeworCS8vIHJldHVybnMgb2sgd2hlbiB3cml0aW5nIHRoZSBUSUZGIGhlYWRlcgorCXJldHVybiBzaXplOworfQorCitzdGF0aWMgdG9mZl90CitfZzNTZWVrUHJvYyh0aGFuZGxlX3QgaGFuZGxlLCB0b2ZmX3Qgb2ZmLCBpbnQgd2hlbmNlKSB7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK19nM0Nsb3NlUHJvYyh0aGFuZGxlX3QgaGFuZGxlKSB7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB0b2ZmX3QKK19nM1NpemVQcm9jKHRoYW5kbGVfdCBoYW5kbGUpIHsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorX2czTWFwUHJvYyh0aGFuZGxlX3QsIHZvaWQqKiBiYXNlLCB0b2ZmX3QqIHNpemUpIHsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK19nM1VubWFwUHJvYyh0aGFuZGxlX3QsIHZvaWQqIGJhc2UsIHRvZmZfdCBzaXplKSB7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0bXNpemVfdAorRzNHZXRGaWxlU2l6ZShGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUpIHsKKyAgICBsb25nIGN1cnJlbnRQb3MgPSBpby0+dGVsbF9wcm9jKGhhbmRsZSk7CisgICAgaW8tPnNlZWtfcHJvYyhoYW5kbGUsIDAsIFNFRUtfRU5EKTsKKyAgICBsb25nIGZpbGVTaXplID0gaW8tPnRlbGxfcHJvYyhoYW5kbGUpOworICAgIGlvLT5zZWVrX3Byb2MoaGFuZGxlLCBjdXJyZW50UG9zLCBTRUVLX1NFVCk7CisgICAgcmV0dXJuIGZpbGVTaXplOworfQorCitzdGF0aWMgQk9PTCAKK0czUmVhZEZpbGUoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCB1aW50OCAqdGlmX3Jhd2RhdGEsIHRtc2l6ZV90IHRpZl9yYXdkYXRhc2l6ZSkgeworCXJldHVybiAoKHRtc2l6ZV90KShpby0+cmVhZF9wcm9jKHRpZl9yYXdkYXRhLCAodW5zaWduZWQpdGlmX3Jhd2RhdGFzaXplLCAxLCBoYW5kbGUpICogdGlmX3Jhd2RhdGFzaXplKSA9PSB0aWZfcmF3ZGF0YXNpemUpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBJbnRlcm5hbCBmdW5jdGlvbnMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3RhdGljIGludCAKK2NvcHlGYXhGaWxlKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSwgVElGRiogdGlmaW4sIHVpbnQzMiB4c2l6ZSwgaW50IHN0cmV0Y2gsIEZJTUVNT1JZICptZW1vcnkpIHsKKwlCWVRFICpyb3didWYgPSBOVUxMOworCUJZVEUgKnJlZmJ1ZiA9IE5VTEw7CisJdWludDMyIHJvdzsKKwl1aW50MTYgYmFkcnVuOworCXVpbnQxNgliYWRmYXhydW47CisJdWludDMyCWJhZGZheGxpbmVzOworCWludCBvazsKKworCXRyeSB7CisKKwkJdWludDMyIGxpbmVzaXplID0gVElGRmhvd21hbnk4KHhzaXplKTsKKwkJcm93YnVmID0gKEJZVEUqKSBfVElGRm1hbGxvYyhsaW5lc2l6ZSk7CisJCXJlZmJ1ZiA9IChCWVRFKikgX1RJRkZtYWxsb2MobGluZXNpemUpOworCQlpZiAocm93YnVmID09IE5VTEwgfHwgcmVmYnVmID09IE5VTEwpIHsKKwkJCXRocm93IEZJX01TR19FUlJPUl9NRU1PUlk7CisJCX0KKworCQl0aWZpbi0+dGlmX3Jhd2RhdGFzaXplID0gRzNHZXRGaWxlU2l6ZShpbywgaGFuZGxlKTsKKwkJdGlmaW4tPnRpZl9yYXdkYXRhID0gKHRpZGF0YV90KSBfVElGRm1hbGxvYyh0aWZpbi0+dGlmX3Jhd2RhdGFzaXplKTsKKwkJaWYgKHRpZmluLT50aWZfcmF3ZGF0YSA9PSBOVUxMKSB7CisJCQl0aHJvdyBGSV9NU0dfRVJST1JfTUVNT1JZOworCQl9CisJCQkKKwkJaWYoIUczUmVhZEZpbGUoaW8sIGhhbmRsZSwgdGlmaW4tPnRpZl9yYXdkYXRhLCB0aWZpbi0+dGlmX3Jhd2RhdGFzaXplKSkgeworCQkJdGhyb3cgIlJlYWQgZXJyb3IgYXQgc2NhbmxpbmUgMCI7CisJCX0KKwkJdGlmaW4tPnRpZl9yYXdjcCA9IHRpZmluLT50aWZfcmF3ZGF0YTsKKwkJdGlmaW4tPnRpZl9yYXdjYyA9IHRpZmluLT50aWZfcmF3ZGF0YXNpemU7CisKKwkJKCp0aWZpbi0+dGlmX3NldHVwZGVjb2RlKSh0aWZpbik7CisJCSgqdGlmaW4tPnRpZl9wcmVkZWNvZGUpKHRpZmluLCAodWludDE2KSAwKTsKKwkJdGlmaW4tPnRpZl9yb3cgPSAwOworCQliYWRmYXhsaW5lcyA9IDA7CisJCWJhZGZheHJ1biA9IDA7CisKKwkJX1RJRkZtZW1zZXQocmVmYnVmLCAwLCBsaW5lc2l6ZSk7CisJCXJvdyA9IDA7CisJCWJhZHJ1biA9IDA7CQkvLyBjdXJyZW50IHJ1biBvZiBiYWQgbGluZXMgCisJCXdoaWxlICh0aWZpbi0+dGlmX3Jhd2NjID4gMCkgeworCQkJb2sgPSAoKnRpZmluLT50aWZfZGVjb2Rlcm93KSh0aWZpbiwgcm93YnVmLCBsaW5lc2l6ZSwgMCk7CisJCQlpZiAoIW9rKSB7CisJCQkJYmFkZmF4bGluZXMrKzsKKwkJCQliYWRydW4rKzsKKwkJCQkvLyByZWdlbmVyYXRlIGxpbmUgZnJvbSBwcmV2aW91cyBnb29kIGxpbmUgCisJCQkJX1RJRkZtZW1jcHkocm93YnVmLCByZWZidWYsIGxpbmVzaXplKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGJhZHJ1biA+IGJhZGZheHJ1bikKKwkJCQkJYmFkZmF4cnVuID0gYmFkcnVuOworCQkJCWJhZHJ1biA9IDA7CisJCQkJX1RJRkZtZW1jcHkocmVmYnVmLCByb3didWYsIGxpbmVzaXplKTsKKwkJCX0KKwkJCXRpZmluLT50aWZfcm93Kys7CisKKwkJCUZyZWVJbWFnZV9Xcml0ZU1lbW9yeShyb3didWYsIGxpbmVzaXplLCAxLCBtZW1vcnkpOworCQkJcm93Kys7CisJCQlpZiAoc3RyZXRjaCkgeworCQkJCUZyZWVJbWFnZV9Xcml0ZU1lbW9yeShyb3didWYsIGxpbmVzaXplLCAxLCBtZW1vcnkpOworCQkJCXJvdysrOworCQkJfQorCQl9CisJCWlmIChiYWRydW4gPiBiYWRmYXhydW4pCisJCQliYWRmYXhydW4gPSBiYWRydW47CisKKwkJX1RJRkZmcmVlKHRpZmluLT50aWZfcmF3ZGF0YSk7CisJCXRpZmluLT50aWZfcmF3ZGF0YSA9IE5VTEw7CisKKwkJX1RJRkZmcmVlKHJvd2J1Zik7CisJCV9USUZGZnJlZShyZWZidWYpOworCisJCS8qCisJCWlmICh2ZXJib3NlKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiVkIHJvd3MgaW4gaW5wdXRcbiIsIHJvd3MpOworCQkJZnByaW50ZihzdGRlcnIsICIlbGQgdG90YWwgYmFkIHJvd3NcbiIsIChsb25nKSBiYWRmYXhsaW5lcyk7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiVkIG1heCBjb25zZWN1dGl2ZSBiYWQgcm93c1xuIiwgYmFkZmF4cnVuKTsKKwkJfQorCQkqLworCisJfSBjYXRjaChjb25zdCBjaGFyICptZXNzYWdlKSB7CisJCWlmKHJvd2J1ZikgX1RJRkZmcmVlKHJvd2J1Zik7CisJCWlmKHJlZmJ1ZikgX1RJRkZmcmVlKHJlZmJ1Zik7CisJCWlmKHRpZmluLT50aWZfcmF3ZGF0YSkgeworCQkJX1RJRkZmcmVlKHRpZmluLT50aWZfcmF3ZGF0YSk7CisJCQl0aWZpbi0+dGlmX3Jhd2RhdGEgPSBOVUxMOworCQl9CisJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhzX2Zvcm1hdF9pZCwgbWVzc2FnZSk7CisKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAocm93KTsKK30KKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBQbHVnaW4gSW1wbGVtZW50YXRpb24KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKK0Zvcm1hdCgpIHsKKwlyZXR1cm4gIkczIjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYgCitEZXNjcmlwdGlvbigpIHsKKwlyZXR1cm4gIlJhdyBmYXggZm9ybWF0IENDSVRUIEcuMyI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WIAorRXh0ZW5zaW9uKCkgeworCXJldHVybiAiZzMiOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OViAKK1JlZ0V4cHIoKSB7CisJcmV0dXJuIE5VTEw7IC8vIHRoZXJlIGlzIG5vdyByZWFzb25hYmxlIHJlZ2V4cCBmb3IgcmF3IEczCit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WIAorTWltZVR5cGUoKSB7CisJcmV0dXJuICJpbWFnZS9mYXgtZzMiOworfQorCitzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYgCitTdXBwb3J0c0V4cG9ydERlcHRoKGludCBkZXB0aCkgeworCXJldHVybglGQUxTRTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgRklCSVRNQVAgKiBETExfQ0FMTENPTlYKK0xvYWQoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBpbnQgcGFnZSwgaW50IGZsYWdzLCB2b2lkICpkYXRhKSB7CisJVElGRiAqZmF4VElGRiA9IE5VTEw7CisJRklCSVRNQVAgKmRpYiA9IE5VTEw7CisJRklNRU1PUlkgKm1lbW9yeSA9IE5VTEw7CisKKwkvL2ludCB2ZXJib3NlID0gMDsKKwlpbnQJc3RyZXRjaCA9IDA7CisJaW50IHJvd3M7CisJZmxvYXQgcmVzWCA9IDIwNC4wOworCWZsb2F0IHJlc1kgPSAxOTYuMDsKKworCXVpbnQzMiB4c2l6ZSA9IEczX0RFRkFVTFRfV0lEVEg7CisJaW50IGNvbXByZXNzaW9uX2luID0gQ09NUFJFU1NJT05fQ0NJVFRGQVgzOworCWludCBmaWxsb3JkZXJfaW4gPSBGSUxMT1JERVJfTFNCMk1TQjsKKwl1aW50MzIgZ3JvdXAzb3B0aW9uc19pbiA9IDA7CS8vIDFkLWVuY29kZWQgCisJdWludDMyIGdyb3VwNG9wdGlvbnNfaW4gPSAwOwkvLyBjb21wcmVzc2VkIAorCWludCBwaG90b21ldHJpY19pbiA9IFBIT1RPTUVUUklDX01JTklTV0hJVEU7CisKKwlpZihoYW5kbGU9PU5VTEwpIHJldHVybiBOVUxMOworCisJdHJ5IHsKKwkJLy8gc2V0IGRlZmF1bHQgbG9hZCBvcHRpb25zCisKKwkJY29tcHJlc3Npb25faW4gPSBDT01QUkVTU0lPTl9DQ0lUVEZBWDM7CQkJLy8gaW5wdXQgaXMgZzMtZW5jb2RlZCAKKwkJZ3JvdXAzb3B0aW9uc19pbiAmPSB+R1JPVVAzT1BUXzJERU5DT0RJTkc7CQkvLyBpbnB1dCBpcyAxZC1lbmNvZGVkIChnMyBvbmx5KSAKKwkJZmlsbG9yZGVyX2luID0gRklMTE9SREVSX01TQjJMU0I7CQkJCS8vIGlucHV0IGhhcyBtc2ItdG8tbHNiIGZpbGxvcmRlciAKKworCQkvKgorCQlPcmlnaW5hbCBpbnB1dC1yZWxhdGVkIGZheDJ0aWZmIG9wdGlvbnMKKworCQl3aGlsZSAoKGMgPSBnZXRvcHQoYXJnYywgYXJndiwgIlI6WDpvOjEyMzRBQkxNUFVXNTY3OGFiY2ZsbXByc3V2d3o/IikpICE9IC0xKSB7CisJCQlzd2l0Y2ggKGMpIHsKKwkJCQkJLy8gaW5wdXQtcmVsYXRlZCBvcHRpb25zIAorCQkJCWNhc2UgJzMnOgkJLy8gaW5wdXQgaXMgZzMtZW5jb2RlZCAKKwkJCQkJY29tcHJlc3Npb25faW4gPSBDT01QUkVTU0lPTl9DQ0lUVEZBWDM7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJzQnOgkJLy8gaW5wdXQgaXMgZzQtZW5jb2RlZCAKKwkJCQkJY29tcHJlc3Npb25faW4gPSBDT01QUkVTU0lPTl9DQ0lUVEZBWDQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ1UnOgkJLy8gaW5wdXQgaXMgdW5jb21wcmVzc2VkIChnMyBhbmQgZzQpIAorCQkJCQlncm91cDNvcHRpb25zX2luIHw9IEdST1VQM09QVF9VTkNPTVBSRVNTRUQ7CisJCQkJCWdyb3VwNG9wdGlvbnNfaW4gfD0gR1JPVVA0T1BUX1VOQ09NUFJFU1NFRDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnMSc6CQkvLyBpbnB1dCBpcyAxZC1lbmNvZGVkIChnMyBvbmx5KSAKKwkJCQkJZ3JvdXAzb3B0aW9uc19pbiAmPSB+R1JPVVAzT1BUXzJERU5DT0RJTkc7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJzInOgkJLy8gaW5wdXQgaXMgMmQtZW5jb2RlZCAoZzMgb25seSkgCisJCQkJCWdyb3VwM29wdGlvbnNfaW4gfD0gR1JPVVAzT1BUXzJERU5DT0RJTkc7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ1AnOgkvLyBpbnB1dCBoYXMgbm90LWFsaWduZWQgRU9MIChnMyBvbmx5KSAKKwkJCQkJZ3JvdXAzb3B0aW9uc19pbiAmPSB+R1JPVVAzT1BUX0ZJTExCSVRTOworCQkJCQlicmVhazsKKwkJCQljYXNlICdBJzoJCS8vIGlucHV0IGhhcyBhbGlnbmVkIEVPTCAoZzMgb25seSkgCisJCQkJCWdyb3VwM29wdGlvbnNfaW4gfD0gR1JPVVAzT1BUX0ZJTExCSVRTOworCQkJCQlicmVhazsKKwkJCQljYXNlICdXJzoJCS8vIGlucHV0IGhhcyAwIG1lYW4gd2hpdGUgCisJCQkJCXBob3RvbWV0cmljX2luID0gUEhPVE9NRVRSSUNfTUlOSVNXSElURTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnQic6CQkvLyBpbnB1dCBoYXMgMCBtZWFuIGJsYWNrIAorCQkJCQlwaG90b21ldHJpY19pbiA9IFBIT1RPTUVUUklDX01JTklTQkxBQ0s7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ0wnOgkJLy8gaW5wdXQgaGFzIGxzYi10by1tc2IgZmlsbG9yZGVyIAorCQkJCQlmaWxsb3JkZXJfaW4gPSBGSUxMT1JERVJfTFNCMk1TQjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnTSc6CQkvLyBpbnB1dCBoYXMgbXNiLXRvLWxzYiBmaWxsb3JkZXIgCisJCQkJCWZpbGxvcmRlcl9pbiA9IEZJTExPUkRFUl9NU0IyTFNCOworCQkJCQlicmVhazsKKwkJCQljYXNlICdSJzoJCS8vIGlucHV0IHJlc29sdXRpb24gCisJCQkJCXJlc1kgPSAoZmxvYXQpIGF0b2Yob3B0YXJnKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnWCc6CQkvLyBpbnB1dCB3aWR0aCAKKwkJCQkJeHNpemUgPSAodWludDMyKSBhdG9pKG9wdGFyZyk7CisJCQkJCWJyZWFrOworCisJCQkJCS8vIG91dHB1dC1yZWxhdGVkIG9wdGlvbnMgCisJCQkJY2FzZSAncyc6CQkvLyBzdHJldGNoIGltYWdlIGJ5IGR1cCduZyBzY2FubGluZXMgCisJCQkJCXN0cmV0Y2ggPSAxOworCQkJCQlicmVhazsKKwkJCQljYXNlICd2JzoJCS8vIC12IGZvciBpbmZvIAorCQkJCQl2ZXJib3NlKys7CisJCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJKi8KKworCQkvLyBvcGVuIGEgdGVtcG9yYXJ5IG1lbW9yeSBidWZmZXIgdG8gc2F2ZSBkZWNvZGVkIHNjYW5saW5lcworCQltZW1vcnkgPSBGcmVlSW1hZ2VfT3Blbk1lbW9yeSgpOworCQlpZighbWVtb3J5KSB0aHJvdyBGSV9NU0dfRVJST1JfTUVNT1JZOworCQkKKwkJLy8gd3JhcCB0aGUgcmF3IGZheCBmaWxlCisJCWZheFRJRkYgPSBUSUZGQ2xpZW50T3BlbigiKEZha2VJbnB1dCkiLCAidyIsCisJCQkvLyBUSUZGQ2xpZW50T3BlbigpIGZhaWxzIGlmIHdlIGRvbid0IHNldCBleGlzdGluZyB2YWx1ZSBoZXJlIAorCQkJTlVMTCwKKwkJCV9nM1JlYWRQcm9jLCBfZzNXcml0ZVByb2MsCisJCQlfZzNTZWVrUHJvYywgX2czQ2xvc2VQcm9jLAorCQkJX2czU2l6ZVByb2MsIF9nM01hcFByb2MsCisJCQlfZzNVbm1hcFByb2MpOworCisJCWlmIChmYXhUSUZGID09IE5VTEwpIHsKKwkJCXRocm93ICJDYW4gbm90IGNyZWF0ZSBmYWtlIGlucHV0IGZpbGUiOworCQl9CisJCVRJRkZTZXRNb2RlKGZheFRJRkYsIE9fUkRPTkxZKTsKKwkJVElGRlNldEZpZWxkKGZheFRJRkYsIFRJRkZUQUdfSU1BR0VXSURUSCwgeHNpemUpOworCQlUSUZGU2V0RmllbGQoZmF4VElGRiwgVElGRlRBR19TQU1QTEVTUEVSUElYRUwsIDEpOworCQlUSUZGU2V0RmllbGQoZmF4VElGRiwgVElGRlRBR19CSVRTUEVSU0FNUExFLCAxKTsKKwkJVElGRlNldEZpZWxkKGZheFRJRkYsIFRJRkZUQUdfRklMTE9SREVSLCBmaWxsb3JkZXJfaW4pOworCQlUSUZGU2V0RmllbGQoZmF4VElGRiwgVElGRlRBR19QTEFOQVJDT05GSUcsIFBMQU5BUkNPTkZJR19DT05USUcpOworCQlUSUZGU2V0RmllbGQoZmF4VElGRiwgVElGRlRBR19QSE9UT01FVFJJQywgcGhvdG9tZXRyaWNfaW4pOworCQlUSUZGU2V0RmllbGQoZmF4VElGRiwgVElGRlRBR19ZUkVTT0xVVElPTiwgcmVzWSk7CisJCVRJRkZTZXRGaWVsZChmYXhUSUZGLCBUSUZGVEFHX1JFU09MVVRJT05VTklULCBSRVNVTklUX0lOQ0gpOworCisJCS8vIE5COiB0aGlzIG11c3QgYmUgZG9uZSBhZnRlciBkaXJlY3RvcnkgaW5mbyBpcyBzZXR1cCAKKwkJVElGRlNldEZpZWxkKGZheFRJRkYsIFRJRkZUQUdfQ09NUFJFU1NJT04sIGNvbXByZXNzaW9uX2luKTsKKwkJaWYgKGNvbXByZXNzaW9uX2luID09IENPTVBSRVNTSU9OX0NDSVRURkFYMykKKwkJCVRJRkZTZXRGaWVsZChmYXhUSUZGLCBUSUZGVEFHX0dST1VQM09QVElPTlMsIGdyb3VwM29wdGlvbnNfaW4pOworCQllbHNlIGlmIChjb21wcmVzc2lvbl9pbiA9PSBDT01QUkVTU0lPTl9DQ0lUVEZBWDQpCisJCQlUSUZGU2V0RmllbGQoZmF4VElGRiwgVElGRlRBR19HUk9VUDRPUFRJT05TLCBncm91cDRvcHRpb25zX2luKTsKKwkJCisJCXJlc1ggPSAyMDQ7CisJCWlmICghc3RyZXRjaCkgeworCQkJVElGRkdldEZpZWxkKGZheFRJRkYsIFRJRkZUQUdfWVJFU09MVVRJT04sICZyZXNZKTsKKwkJfSBlbHNlIHsKKwkJCXJlc1kgPSAxOTY7CisJCX0KKworCQkvLyBkZWNvZGUgdGhlIHJhdyBmYXggZGF0YQorCQlyb3dzID0gY29weUZheEZpbGUoaW8sIGhhbmRsZSwgZmF4VElGRiwgeHNpemUsIHN0cmV0Y2gsIG1lbW9yeSk7CisJCWlmKHJvd3MgPD0gMCkgdGhyb3cgIkVycm9yIHdoZW4gZGVjb2RpbmcgcmF3IGZheCBmaWxlIDogY2hlY2sgdGhlIGRlY29kZXIgb3B0aW9ucyI7CisKKworCQkvLyBhbGxvY2F0ZSB0aGUgb3V0cHV0IGRpYgorCQlkaWIgPSBGcmVlSW1hZ2VfQWxsb2NhdGUoeHNpemUsIHJvd3MsIDEpOworCQl1bnNpZ25lZCBwaXRjaCA9IEZyZWVJbWFnZV9HZXRQaXRjaChkaWIpOworCQl1aW50MzIgbGluZXNpemUgPSBUSUZGaG93bWFueTgoeHNpemUpOworCisJCS8vIGZpbGwgdGhlIGJpdG1hcCBzdHJ1Y3R1cmUgLi4uCisJCS8vIC4uLiBwYWxldHRlCisJCVJHQlFVQUQgKnBhbCA9IEZyZWVJbWFnZV9HZXRQYWxldHRlKGRpYik7CisJCWlmKHBob3RvbWV0cmljX2luID09IFBIT1RPTUVUUklDX01JTklTV0hJVEUpIHsKKwkJCXBhbFswXS5yZ2JSZWQgPSBwYWxbMF0ucmdiR3JlZW4gPSBwYWxbMF0ucmdiQmx1ZSA9IDI1NTsKKwkJCXBhbFsxXS5yZ2JSZWQgPSBwYWxbMV0ucmdiR3JlZW4gPSBwYWxbMV0ucmdiQmx1ZSA9IDA7CisJCX0gZWxzZSB7CisJCQlwYWxbMF0ucmdiUmVkID0gcGFsWzBdLnJnYkdyZWVuID0gcGFsWzBdLnJnYkJsdWUgPSAwOworCQkJcGFsWzFdLnJnYlJlZCA9IHBhbFsxXS5yZ2JHcmVlbiA9IHBhbFsxXS5yZ2JCbHVlID0gMjU1OworCQl9CisJCS8vIC4uLiByZXNvbHV0aW9uCisJCUZyZWVJbWFnZV9TZXREb3RzUGVyTWV0ZXJYKGRpYiwgKHVuc2lnbmVkKShyZXNYLzAuMDI1NDAwMCArIDAuNSkpOworCQlGcmVlSW1hZ2VfU2V0RG90c1Blck1ldGVyWShkaWIsICh1bnNpZ25lZCkocmVzWS8wLjAyNTQwMDAgKyAwLjUpKTsKKworCQkvLyByZWFkIHRoZSBkZWNvZGVkIHNjYW5saW5lIGFuZCBmaWxsIHRoZSBiaXRtYXAgZGF0YQorCQlGcmVlSW1hZ2VfU2Vla01lbW9yeShtZW1vcnksIDAsIFNFRUtfU0VUKTsKKwkJQllURSAqYml0cyA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIHJvd3MgLSAxKTsKKwkJZm9yKGludCBrID0gMDsgayA8IHJvd3M7IGsrKykgeworCQkJRnJlZUltYWdlX1JlYWRNZW1vcnkoYml0cywgbGluZXNpemUsIDEsIG1lbW9yeSk7CisJCQliaXRzIC09IHBpdGNoOworCQl9CisKKwkJLy8gZnJlZSB0aGUgVElGRiB3cmFwcGVyCisJCVRJRkZDbG9zZShmYXhUSUZGKTsKKworCQkvLyBmcmVlIHRoZSBtZW1vcnkgYnVmZmVyCisJCUZyZWVJbWFnZV9DbG9zZU1lbW9yeShtZW1vcnkpOworCisJfSBjYXRjaChjb25zdCBjaGFyICptZXNzYWdlKSB7CisJCWlmKG1lbW9yeSkgRnJlZUltYWdlX0Nsb3NlTWVtb3J5KG1lbW9yeSk7CisJCWlmKGZheFRJRkYpIFRJRkZDbG9zZShmYXhUSUZGKTsKKwkJaWYoZGliKSBGcmVlSW1hZ2VfVW5sb2FkKGRpYik7CisJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhzX2Zvcm1hdF9pZCwgbWVzc2FnZSk7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiBkaWI7CisKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gICBJbml0CisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3ZvaWQgRExMX0NBTExDT05WCitJbml0RzMoUGx1Z2luICpwbHVnaW4sIGludCBmb3JtYXRfaWQpIHsKKwlzX2Zvcm1hdF9pZCA9IGZvcm1hdF9pZDsKKworCXBsdWdpbi0+Zm9ybWF0X3Byb2MgPSBGb3JtYXQ7CisJcGx1Z2luLT5kZXNjcmlwdGlvbl9wcm9jID0gRGVzY3JpcHRpb247CisJcGx1Z2luLT5leHRlbnNpb25fcHJvYyA9IEV4dGVuc2lvbjsKKwlwbHVnaW4tPnJlZ2V4cHJfcHJvYyA9IFJlZ0V4cHI7CisJcGx1Z2luLT5vcGVuX3Byb2MgPSBOVUxMOworCXBsdWdpbi0+Y2xvc2VfcHJvYyA9IE5VTEw7CisJcGx1Z2luLT5wYWdlY291bnRfcHJvYyA9IE5VTEw7CisJcGx1Z2luLT5wYWdlY2FwYWJpbGl0eV9wcm9jID0gTlVMTDsKKwlwbHVnaW4tPmxvYWRfcHJvYyA9IExvYWQ7CisJcGx1Z2luLT5zYXZlX3Byb2MgPSBOVUxMOworCXBsdWdpbi0+dmFsaWRhdGVfcHJvYyA9IE5VTEw7CisJcGx1Z2luLT5taW1lX3Byb2MgPSBNaW1lVHlwZTsKKwlwbHVnaW4tPnN1cHBvcnRzX2V4cG9ydF9icHBfcHJvYyA9IFN1cHBvcnRzRXhwb3J0RGVwdGg7CisJcGx1Z2luLT5zdXBwb3J0c19leHBvcnRfdHlwZV9wcm9jID0gTlVMTDsKKwlwbHVnaW4tPnN1cHBvcnRzX2ljY19wcm9maWxlc19wcm9jID0gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvUGx1Z2luR0lGLmNwcCBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvUGx1Z2luR0lGLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmEwNDc2Ci0tLSAvZGV2L251bGwKKysrIGIvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9QbHVnaW5HSUYuY3BwCkBAIC0wLDAgKzEsMTQxNCBAQAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gR0lGIExvYWRlciBhbmQgV3JpdGVyCisvLworLy8gRGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBieQorLy8gLSBSeWFuIFJ1YmxleSA8cnlhbkBsb3N0cmVhbGl0eS5vcmc+CisvLyAtIFJhcGhhw6tsIEdhcXVlciA8cmFwaGFlbC5nYXF1ZXJAYWxjZXIuY29tPgorLy8gLSBBYXJvbiBTaHVtYXRlIDxhYXJvbkBzaHVtYXRlLnVzPgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZyZWVJbWFnZSAzCisvLworLy8gQ09WRVJFRCBDT0RFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZCisvLyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUworLy8gVEhBVCBUSEUgQ09WRVJFRCBDT0RFIElTIEZSRUUgT0YgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisvLyBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRAorLy8gQ09ERSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVAorLy8gVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GIEFOWSBORUNFU1NBUlkKKy8vIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwKKy8vIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIKKy8vIFRISVMgRElTQ0xBSU1FUi4KKy8vCisvLyBVc2UgYXQgeW91ciBvd24gcmlzayEKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2lmZGVmIF9NU0NfVkVSIAorI3ByYWdtYSB3YXJuaW5nIChkaXNhYmxlIDogNDc4NikgLy8gaWRlbnRpZmllciB3YXMgdHJ1bmNhdGVkIHRvICdudW1iZXInIGNoYXJhY3RlcnMKKyNlbmRpZgorCisjaW5jbHVkZSAiRnJlZUltYWdlLmgiCisjaW5jbHVkZSAiVXRpbGl0aWVzLmgiCisjaW5jbHVkZSAiLi4vTWV0YWRhdGEvRnJlZUltYWdlVGFnLmgiCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICAgTWV0YWRhdGEgZGVjbGFyYXRpb25zCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNkZWZpbmUgR0lGX0RJU1BPU0FMX1VOU1BFQ0lGSUVECTAKKyNkZWZpbmUgR0lGX0RJU1BPU0FMX0xFQVZFCQkJMQorI2RlZmluZSBHSUZfRElTUE9TQUxfQkFDS0dST1VORAkJMgorI2RlZmluZSBHSUZfRElTUE9TQUxfUFJFVklPVVMJCTMKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gICBDb25zdGFudC9UeXBlZGVmIGRlY2xhcmF0aW9ucworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKK3N0cnVjdCBHSUZpbmZvIHsKKwlCT09MIHJlYWQ7CisJLy9vbmx5IHJlYWxseSB1c2VkIHdoZW4gcmVhZGluZworCXNpemVfdCBnbG9iYWxfY29sb3JfdGFibGVfb2Zmc2V0OworCWludCBnbG9iYWxfY29sb3JfdGFibGVfc2l6ZTsKKwlCWVRFIGJhY2tncm91bmRfY29sb3I7CisJc3RkOjp2ZWN0b3I8c2l6ZV90PiBhcHBsaWNhdGlvbl9leHRlbnNpb25fb2Zmc2V0czsKKwlzdGQ6OnZlY3RvcjxzaXplX3Q+IGNvbW1lbnRfZXh0ZW5zaW9uX29mZnNldHM7CisJc3RkOjp2ZWN0b3I8c2l6ZV90PiBncmFwaGljX2NvbnRyb2xfZXh0ZW5zaW9uX29mZnNldHM7CisJc3RkOjp2ZWN0b3I8c2l6ZV90PiBpbWFnZV9kZXNjcmlwdG9yX29mZnNldHM7CisKKwlHSUZpbmZvKCkgOiByZWFkKDApLCBnbG9iYWxfY29sb3JfdGFibGVfb2Zmc2V0KDApLCBnbG9iYWxfY29sb3JfdGFibGVfc2l6ZSgwKSwgYmFja2dyb3VuZF9jb2xvcigwKQorCXsKKwl9Cit9OworCitzdHJ1Y3QgUGFnZUluZm8geworCVBhZ2VJbmZvKGludCBkLCBpbnQgbCwgaW50IHQsIGludCB3LCBpbnQgaCkgeyAKKwkJZGlzcG9zYWxfbWV0aG9kID0gZDsgbGVmdCA9IChXT1JEKWw7IHRvcCA9IChXT1JEKXQ7IHdpZHRoID0gKFdPUkQpdzsgaGVpZ2h0ID0gKFdPUkQpaDsgCisJfQorCWludCBkaXNwb3NhbF9tZXRob2Q7CisJV09SRCBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQ7Cit9OworCisvL0dJRiBkZWZpbmVzIGEgbWF4IG9mIDEyIGJpdHMgcGVyIGNvZGUKKyNkZWZpbmUgTUFYX0xaV19DT0RFCQkJNDA5NgorCisvLyBUaGlzIGNoYW5nZSBpcyBmb3IgYnVpbGRpbmcgZm9yIFNrZXRjaFVwIG9uIExpbnV4LiAgV2UgZG9uJ3Qgd2FudCB0byB1c2UKKy8vIFN0cmluZ1RhYmxlIGJlY2F1c2UgaXQgY29uZmxpY3RzIHdpdGggYSBTdHJpbmdUYWJsZSBlbHNld2hlcmUsIHNvIEkgdHlwZWRlZgorLy8gVG8gRnJlZUltYWdlX1N0cmluZ1RhYmxlLgorI2lmZGVmIFVTRV9USElSRF9QQVJUWV9USUZGCisjZGVmaW5lIFN0cmluZ1RhYmxlIEZyZWVJbWFnZV9TdHJpbmdUYWJsZQorI2VuZGlmCisKK2NsYXNzIFN0cmluZ1RhYmxlCit7CitwdWJsaWM6CisJU3RyaW5nVGFibGUoKTsKKwl+U3RyaW5nVGFibGUoKTsKKwl2b2lkIEluaXRpYWxpemUoaW50IG1pbkNvZGVTaXplKTsKKwlCWVRFICpGaWxsSW5wdXRCdWZmZXIoaW50IGxlbik7CisJdm9pZCBDb21wcmVzc1N0YXJ0KGludCBicHAsIGludCB3aWR0aCk7CisJaW50IENvbXByZXNzRW5kKEJZVEUgKmJ1Zik7IC8vMC00IGJ5dGVzCisJYm9vbCBDb21wcmVzcyhCWVRFICpidWYsIGludCAqbGVuKTsKKwlib29sIERlY29tcHJlc3MoQllURSAqYnVmLCBpbnQgKmxlbik7CisJdm9pZCBEb25lKHZvaWQpOworCitwcm90ZWN0ZWQ6CisJYm9vbCBtX2RvbmU7CisKKwlpbnQgbV9taW5Db2RlU2l6ZSwgbV9jbGVhckNvZGUsIG1fZW5kQ29kZSwgbV9uZXh0Q29kZTsKKworCWludCBtX2JwcCwgbV9zbGFjazsgLy9Db21wcmVzc29yIGluZm9ybWF0aW9uCisKKwlpbnQgbV9wcmVmaXg7IC8vQ29tcHJlc3NvciBzdGF0ZSB2YXJpYWJsZQorCWludCBtX2NvZGVTaXplLCBtX2NvZGVNYXNrOyAvL0NvbXByZXNzb3IvRGVjb21wcmVzc29yIHN0YXRlIHZhcmlhYmxlcworCWludCBtX29sZENvZGU7IC8vRGVjb21wcmVzc29yIHN0YXRlIHZhcmlhYmxlCisJaW50IG1fcGFydGlhbCwgbV9wYXJ0aWFsU2l6ZTsgLy9Db21wcmVzc29yL0RlY29tcHJlc3NvciBiaXQgYnVmZmVyCisKKwlpbnQgZmlyc3RQaXhlbFBhc3NlZDsgLy8gQSBzcGVjaWZpYyBmbGFnIHRoYXQgaW5kaWNhdGVzIGlmIHRoZSBmaXJzdCBwaXhlbAorCSAgICAgICAgICAgICAgICAgICAgICAvLyBvZiB0aGUgd2hvbGUgaW1hZ2UgaGFkIGFscmVhZHkgYmVlbiByZWFkCisKKwlzdGQ6OnN0cmluZyBtX3N0cmluZ3NbTUFYX0xaV19DT0RFXTsgLy9UaGlzIGlzIHdoYXQgaXMgcmVhbGx5IHRoZSAic3RyaW5nIHRhYmxlIiBkYXRhIGZvciB0aGUgRGVjb21wcmVzc29yCisJaW50KiBtX3N0cm1hcDsKKworCS8vaW5wdXQgYnVmZmVyCisJQllURSAqbV9idWZmZXI7CisJaW50IG1fYnVmZmVyU2l6ZSwgbV9idWZmZXJSZWFsU2l6ZSwgbV9idWZmZXJQb3MsIG1fYnVmZmVyU2hpZnQ7CisKKwl2b2lkIENsZWFyQ29tcHJlc3NvclRhYmxlKHZvaWQpOworCXZvaWQgQ2xlYXJEZWNvbXByZXNzb3JUYWJsZSh2b2lkKTsKK307CisKKyNkZWZpbmUgR0lGX1BBQ0tFRF9MU0RfSEFWRUdDVAkJMHg4MAorI2RlZmluZSBHSUZfUEFDS0VEX0xTRF9DT0xPUlJFUwkJMHg3MAorI2RlZmluZSBHSUZfUEFDS0VEX0xTRF9HQ1RTT1JURUQJMHgwOAorI2RlZmluZSBHSUZfUEFDS0VEX0xTRF9HQ1RTSVpFCQkweDA3CisjZGVmaW5lIEdJRl9QQUNLRURfSURfSEFWRUxDVAkJMHg4MAorI2RlZmluZSBHSUZfUEFDS0VEX0lEX0lOVEVSTEFDRUQJMHg0MAorI2RlZmluZSBHSUZfUEFDS0VEX0lEX0xDVFNPUlRFRAkJMHgyMAorI2RlZmluZSBHSUZfUEFDS0VEX0lEX1JFU0VSVkVECQkweDE4CisjZGVmaW5lIEdJRl9QQUNLRURfSURfTENUU0laRQkJMHgwNworI2RlZmluZSBHSUZfUEFDS0VEX0dDRV9SRVNFUlZFRAkJMHhFMAorI2RlZmluZSBHSUZfUEFDS0VEX0dDRV9ESVNQT1NBTAkJMHgxQworI2RlZmluZSBHSUZfUEFDS0VEX0dDRV9XQUlUSU5QVVQJMHgwMgorI2RlZmluZSBHSUZfUEFDS0VEX0dDRV9IQVZFVFJBTlMJMHgwMQorCisjZGVmaW5lIEdJRl9CTE9DS19JTUFHRV9ERVNDUklQVE9SCTB4MkMKKyNkZWZpbmUgR0lGX0JMT0NLX0VYVEVOU0lPTgkJCTB4MjEKKyNkZWZpbmUgR0lGX0JMT0NLX1RSQUlMRVIJCQkweDNCCisKKyNkZWZpbmUgR0lGX0VYVF9QTEFJTlRFWFQJCQkweDAxCisjZGVmaW5lIEdJRl9FWFRfR1JBUEhJQ19DT05UUk9MCQkweEY5CisjZGVmaW5lIEdJRl9FWFRfQ09NTUVOVAkJCQkweEZFCisjZGVmaW5lIEdJRl9FWFRfQVBQTElDQVRJT04JCQkweEZGCisKKyNkZWZpbmUgR0lGX0lOVEVSTEFDRV9QQVNTRVMJCTQKK3N0YXRpYyBpbnQgZ19HaWZJbnRlcmxhY2VPZmZzZXRbR0lGX0lOVEVSTEFDRV9QQVNTRVNdID0gezAsIDQsIDIsIDF9Oworc3RhdGljIGludCBnX0dpZkludGVybGFjZUluY3JlbWVudFtHSUZfSU5URVJMQUNFX1BBU1NFU10gPSB7OCwgOCwgNCwgMn07CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEhlbHBlcnMgRnVuY3Rpb25zCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3N0YXRpYyBCT09MIAorRnJlZUltYWdlX1NldE1ldGFkYXRhRXgoRlJFRV9JTUFHRV9NRE1PREVMIG1vZGVsLCBGSUJJVE1BUCAqZGliLCBjb25zdCBjaGFyICprZXksIFdPUkQgaWQsIEZSRUVfSU1BR0VfTURUWVBFIHR5cGUsIERXT1JEIGNvdW50LCBEV09SRCBsZW5ndGgsIGNvbnN0IHZvaWQgKnZhbHVlKQoreworCUJPT0wgYlJlc3VsdCA9IEZBTFNFOworCUZJVEFHICp0YWcgPSBGcmVlSW1hZ2VfQ3JlYXRlVGFnKCk7CisJaWYodGFnKSB7CisJCUZyZWVJbWFnZV9TZXRUYWdLZXkodGFnLCBrZXkpOworCQlGcmVlSW1hZ2VfU2V0VGFnSUQodGFnLCBpZCk7CisJCUZyZWVJbWFnZV9TZXRUYWdUeXBlKHRhZywgdHlwZSk7CisJCUZyZWVJbWFnZV9TZXRUYWdDb3VudCh0YWcsIGNvdW50KTsKKwkJRnJlZUltYWdlX1NldFRhZ0xlbmd0aCh0YWcsIGxlbmd0aCk7CisJCUZyZWVJbWFnZV9TZXRUYWdWYWx1ZSh0YWcsIHZhbHVlKTsKKwkJaWYobW9kZWwgPT0gRklNRF9BTklNQVRJT04pIHsKKwkJCVRhZ0xpYiYgcyA9IFRhZ0xpYjo6aW5zdGFuY2UoKTsKKwkJCS8vIGdldCB0aGUgdGFnIGRlc2NyaXB0aW9uCisJCQljb25zdCBjaGFyICpkZXNjcmlwdGlvbiA9IHMuZ2V0VGFnRGVzY3JpcHRpb24oVGFnTGliOjpBTklNQVRJT04sIGlkKTsKKwkJCUZyZWVJbWFnZV9TZXRUYWdEZXNjcmlwdGlvbih0YWcsIGRlc2NyaXB0aW9uKTsKKwkJfQorCQkvLyBzdG9yZSB0aGUgdGFnCisJCWJSZXN1bHQgPSBGcmVlSW1hZ2VfU2V0TWV0YWRhdGEobW9kZWwsIGRpYiwga2V5LCB0YWcpOworCQlGcmVlSW1hZ2VfRGVsZXRlVGFnKHRhZyk7CisJfQorCXJldHVybiBiUmVzdWx0OworfQorCitzdGF0aWMgQk9PTCAKK0ZyZWVJbWFnZV9HZXRNZXRhZGF0YUV4KEZSRUVfSU1BR0VfTURNT0RFTCBtb2RlbCwgRklCSVRNQVAgKmRpYiwgY29uc3QgY2hhciAqa2V5LCBGUkVFX0lNQUdFX01EVFlQRSB0eXBlLCBGSVRBRyAqKnRhZykKK3sKKwlpZiggRnJlZUltYWdlX0dldE1ldGFkYXRhKG1vZGVsLCBkaWIsIGtleSwgdGFnKSApIHsKKwkJaWYoIEZyZWVJbWFnZV9HZXRUYWdUeXBlKCp0YWcpID09IHR5cGUgKSB7CisJCQlyZXR1cm4gVFJVRTsKKwkJfQorCX0KKwlyZXR1cm4gRkFMU0U7Cit9CisKK1N0cmluZ1RhYmxlOjpTdHJpbmdUYWJsZSgpCit7CisJbV9idWZmZXIgPSBOVUxMOworCWZpcnN0UGl4ZWxQYXNzZWQgPSAwOyAvLyBTdGlsbCBubyBwaXhlbCByZWFkCisJLy8gTWF4aW11bSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgbWFwIGlzIE1BWF9MWldfQ09ERSAqIDI1NiAKKwkvLyAoYWthIDIqKjEyICogMioqOCA9PiBhIDIwIGJpdHMga2V5KQorCS8vIFRoaXMgTWFwIGNvdWxkIGJlIG9wdG1pemVkIHRvIG9ubHkgaGFuZGxlIE1BWF9MWldfQ09ERSAqIDIqKihtX2JwcCkKKwltX3N0cm1hcCA9IG5ldyhzdGQ6Om5vdGhyb3cpIGludFsxPDwyMF07Cit9CisKK1N0cmluZ1RhYmxlOjp+U3RyaW5nVGFibGUoKQoreworCWlmKCBtX2J1ZmZlciAhPSBOVUxMICkgeworCQlkZWxldGUgW10gbV9idWZmZXI7CisJfQorCWlmKCBtX3N0cm1hcCAhPSBOVUxMICkgeworCQlkZWxldGUgW10gbV9zdHJtYXA7CisJCW1fc3RybWFwID0gTlVMTDsKKwl9Cit9CisKK3ZvaWQgU3RyaW5nVGFibGU6OkluaXRpYWxpemUoaW50IG1pbkNvZGVTaXplKQoreworCW1fZG9uZSA9IGZhbHNlOworCisJbV9icHAgPSA4OworCW1fbWluQ29kZVNpemUgPSBtaW5Db2RlU2l6ZTsKKwltX2NsZWFyQ29kZSA9IDEgPDwgbV9taW5Db2RlU2l6ZTsKKwlpZihtX2NsZWFyQ29kZSA+IE1BWF9MWldfQ09ERSkgeworCQltX2NsZWFyQ29kZSA9IE1BWF9MWldfQ09ERTsKKwl9CisJbV9lbmRDb2RlID0gbV9jbGVhckNvZGUgKyAxOworCisJbV9wYXJ0aWFsID0gMDsKKwltX3BhcnRpYWxTaXplID0gMDsKKworCW1fYnVmZmVyU2l6ZSA9IDA7CisJQ2xlYXJDb21wcmVzc29yVGFibGUoKTsKKwlDbGVhckRlY29tcHJlc3NvclRhYmxlKCk7Cit9CisKK0JZVEUgKlN0cmluZ1RhYmxlOjpGaWxsSW5wdXRCdWZmZXIoaW50IGxlbikKK3sKKwlpZiggbV9idWZmZXIgPT0gTlVMTCApIHsKKwkJbV9idWZmZXIgPSBuZXcoc3RkOjpub3Rocm93KSBCWVRFW2xlbl07CisJCW1fYnVmZmVyUmVhbFNpemUgPSBsZW47CisJfSBlbHNlIGlmKCBsZW4gPiBtX2J1ZmZlclJlYWxTaXplICkgeworCQlkZWxldGUgW10gbV9idWZmZXI7CisJCW1fYnVmZmVyID0gbmV3KHN0ZDo6bm90aHJvdykgQllURVtsZW5dOworCQltX2J1ZmZlclJlYWxTaXplID0gbGVuOworCX0KKwltX2J1ZmZlclNpemUgPSBsZW47CisJbV9idWZmZXJQb3MgPSAwOworCW1fYnVmZmVyU2hpZnQgPSA4IC0gbV9icHA7CisJcmV0dXJuIG1fYnVmZmVyOworfQorCit2b2lkIFN0cmluZ1RhYmxlOjpDb21wcmVzc1N0YXJ0KGludCBicHAsIGludCB3aWR0aCkKK3sKKwltX2JwcCA9IGJwcDsKKwltX3NsYWNrID0gKDggLSAoKHdpZHRoICogYnBwKSAlIDgpKSAlIDg7CisKKwltX3BhcnRpYWwgfD0gbV9jbGVhckNvZGUgPDwgbV9wYXJ0aWFsU2l6ZTsKKwltX3BhcnRpYWxTaXplICs9IG1fY29kZVNpemU7CisJQ2xlYXJDb21wcmVzc29yVGFibGUoKTsKK30KKworaW50IFN0cmluZ1RhYmxlOjpDb21wcmVzc0VuZChCWVRFICpidWYpCit7CisJaW50IGxlbiA9IDA7CisKKwkvL291dHB1dCBjb2RlIGZvciByZW1haW5pbmcgcHJlZml4CisJbV9wYXJ0aWFsIHw9IG1fcHJlZml4IDw8IG1fcGFydGlhbFNpemU7CisJbV9wYXJ0aWFsU2l6ZSArPSBtX2NvZGVTaXplOworCXdoaWxlKCBtX3BhcnRpYWxTaXplID49IDggKSB7CisJCSpidWYrKyA9IChCWVRFKW1fcGFydGlhbDsKKwkJbV9wYXJ0aWFsID4+PSA4OworCQltX3BhcnRpYWxTaXplIC09IDg7CisJCWxlbisrOworCX0KKworCS8vYWRkIHRoZSBlbmQgb2YgaW5mb3JtYXRpb24gY29kZSBhbmQgZmx1c2ggdGhlIGVudGlyZSBidWZmZXIgb3V0CisJbV9wYXJ0aWFsIHw9IG1fZW5kQ29kZSA8PCBtX3BhcnRpYWxTaXplOworCW1fcGFydGlhbFNpemUgKz0gbV9jb2RlU2l6ZTsKKwl3aGlsZSggbV9wYXJ0aWFsU2l6ZSA+IDAgKSB7CisJCSpidWYrKyA9IChCWVRFKW1fcGFydGlhbDsKKwkJbV9wYXJ0aWFsID4+PSA4OworCQltX3BhcnRpYWxTaXplIC09IDg7CisJCWxlbisrOworCX0KKworCS8vbW9zdCB0aGlzIGNhbiBiZSBpcyA0IGJ5dGVzLiAgNyBiaXRzIGluIG1fcGFydGlhbCB0byBzdGFydCArIDEyIGZvciB0aGUKKwkvL2xhc3QgY29kZSArIDEyIGZvciB0aGUgZW5kIGNvZGUgPSAzMSBiaXRzIHRvdGFsLgorCXJldHVybiBsZW47Cit9CisKK2Jvb2wgU3RyaW5nVGFibGU6OkNvbXByZXNzKEJZVEUgKmJ1ZiwgaW50ICpsZW4pCit7CisJaWYoIG1fYnVmZmVyU2l6ZSA9PSAwIHx8IG1fZG9uZSApIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWludCBtYXNrID0gKDEgPDwgbV9icHApIC0gMTsKKwlCWVRFICpidWZwb3MgPSBidWY7CisJd2hpbGUoIG1fYnVmZmVyUG9zIDwgbV9idWZmZXJTaXplICkgeworCQkvL2dldCB0aGUgY3VycmVudCBwaXhlbCB2YWx1ZQorCQljaGFyIGNoID0gKGNoYXIpKChtX2J1ZmZlclttX2J1ZmZlclBvc10gPj4gbV9idWZmZXJTaGlmdCkgJiBtYXNrKTsKKworCQkvLyBUaGUgbmV4dCBwcmVmaXggaXMgOiAKKwkJLy8gPHRoZSBwcmV2aW91cyBMWlcgY29kZSAob24gMTIgYml0cyA8PCA4KT4gfCA8dGhlIGNvZGUgb2YgdGhlIGN1cnJlbnQgcGl4ZWwgKG9uIDggYml0cyk+CisJCWludCBuZXh0cHJlZml4ID0gKCgobV9wcmVmaXgpPDw4KSYweEZGRjAwKSArIChjaCAmIDB4MDAwRkYpOworCQlpZihmaXJzdFBpeGVsUGFzc2VkKSB7CisJCQkKKwkJCWlmKCBtX3N0cm1hcFtuZXh0cHJlZml4XSA+IDApIHsKKwkJCQltX3ByZWZpeCA9IG1fc3RybWFwW25leHRwcmVmaXhdOworCQkJfSBlbHNlIHsKKwkJCQltX3BhcnRpYWwgfD0gbV9wcmVmaXggPDwgbV9wYXJ0aWFsU2l6ZTsKKwkJCQltX3BhcnRpYWxTaXplICs9IG1fY29kZVNpemU7CisJCQkJLy9ncmFiIGZ1bGwgYnl0ZXMgZm9yIHRoZSBvdXRwdXQgYnVmZmVyCisJCQkJd2hpbGUoIG1fcGFydGlhbFNpemUgPj0gOCAmJiBidWZwb3MgLSBidWYgPCAqbGVuICkgeworCQkJCQkqYnVmcG9zKysgPSAoQllURSltX3BhcnRpYWw7CisJCQkJCW1fcGFydGlhbCA+Pj0gODsKKwkJCQkJbV9wYXJ0aWFsU2l6ZSAtPSA4OworCQkJCX0KKworCQkJCS8vYWRkIHRoZSBjb2RlIHRvIHRoZSAidGFibGUgbWFwIgorCQkJCW1fc3RybWFwW25leHRwcmVmaXhdID0gbV9uZXh0Q29kZTsKKworCQkJCS8vaW5jcmVtZW50IHRoZSBuZXh0IGhpZ2hlc3QgdmFsaWQgY29kZSwgaW5jcmVhc2UgdGhlIGNvZGUgc2l6ZQorCQkJCWlmKCBtX25leHRDb2RlID09ICgxIDw8IG1fY29kZVNpemUpICkgeworCQkJCQltX2NvZGVTaXplKys7CisJCQkJfQorCQkJCW1fbmV4dENvZGUrKzsKKworCQkJCS8vaWYgd2UncmUgb3V0IG9mIGNvZGVzLCByZXN0YXJ0IHRoZSBzdHJpbmcgdGFibGUKKwkJCQlpZiggbV9uZXh0Q29kZSA9PSBNQVhfTFpXX0NPREUgKSB7CisJCQkJCW1fcGFydGlhbCB8PSBtX2NsZWFyQ29kZSA8PCBtX3BhcnRpYWxTaXplOworCQkJCQltX3BhcnRpYWxTaXplICs9IG1fY29kZVNpemU7CisJCQkJCUNsZWFyQ29tcHJlc3NvclRhYmxlKCk7CisJCQkJfQorCisJCQkJLy8gT25seSBrZWVwIHRoZSA4IGxvd2VzdCBiaXRzIChwcmV2ZW50IHByb2JsZW1zIHdpdGggIm5lZ2F0aXZlIGNoYXJzIikKKwkJCQltX3ByZWZpeCA9IGNoICYgMHgwMDBGRjsKKwkJCX0KKworCQkJLy9pbmNyZW1lbnQgdG8gdGhlIG5leHQgcGl4ZWwKKwkJCWlmKCBtX2J1ZmZlclNoaWZ0ID4gMCAmJiAhKG1fYnVmZmVyUG9zICsgMSA9PSBtX2J1ZmZlclNpemUgJiYgbV9idWZmZXJTaGlmdCA8PSBtX3NsYWNrKSApIHsKKwkJCQltX2J1ZmZlclNoaWZ0IC09IG1fYnBwOworCQkJfSBlbHNlIHsKKwkJCQltX2J1ZmZlclBvcysrOworCQkJCW1fYnVmZmVyU2hpZnQgPSA4IC0gbV9icHA7CisJCQl9CisKKwkJCS8vanVtcCBvdXQgaGVyZSBpZiB0aGUgb3V0cHV0IGJ1ZmZlciBpcyBmdWxsCisJCQlpZiggYnVmcG9zIC0gYnVmID09ICpsZW4gKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCQorCQl9IGVsc2UgeworCQkJLy8gU3BlY2lmaWMgYmVoYXZpb3IgZm9yIHRoZSBmaXJzdCBwaXhlbCBvZiB0aGUgd2hvbGUgaW1hZ2UKKworCQkJZmlyc3RQaXhlbFBhc3NlZD0xOworCQkJLy8gT25seSBrZWVwIHRoZSA4IGxvd2VzdCBiaXRzIChwcmV2ZW50IHByb2JsZW1zIHdpdGggIm5lZ2F0aXZlIGNoYXJzIikKKwkJCW1fcHJlZml4ID0gY2ggJiAweDAwMEZGOworCisJCQkvL2luY3JlbWVudCB0byB0aGUgbmV4dCBwaXhlbAorCQkJaWYoIG1fYnVmZmVyU2hpZnQgPiAwICYmICEobV9idWZmZXJQb3MgKyAxID09IG1fYnVmZmVyU2l6ZSAmJiBtX2J1ZmZlclNoaWZ0IDw9IG1fc2xhY2spICkgeworCQkJCW1fYnVmZmVyU2hpZnQgLT0gbV9icHA7CisJCQl9IGVsc2UgeworCQkJCW1fYnVmZmVyUG9zKys7CisJCQkJbV9idWZmZXJTaGlmdCA9IDggLSBtX2JwcDsKKwkJCX0KKworCQkJLy9qdW1wIG91dCBoZXJlIGlmIHRoZSBvdXRwdXQgYnVmZmVyIGlzIGZ1bGwKKwkJCWlmKCBidWZwb3MgLSBidWYgPT0gKmxlbiApIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCX0KKworCW1fYnVmZmVyU2l6ZSA9IDA7CisJKmxlbiA9IChpbnQpKGJ1ZnBvcyAtIGJ1Zik7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBTdHJpbmdUYWJsZTo6RGVjb21wcmVzcyhCWVRFICpidWYsIGludCAqbGVuKQoreworCWlmKCBtX2J1ZmZlclNpemUgPT0gMCB8fCBtX2RvbmUgKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlCWVRFICpidWZwb3MgPSBidWY7CisJZm9yKCA7IG1fYnVmZmVyUG9zIDwgbV9idWZmZXJTaXplOyBtX2J1ZmZlclBvcysrICkgeworCQltX3BhcnRpYWwgfD0gKGludCltX2J1ZmZlclttX2J1ZmZlclBvc10gPDwgbV9wYXJ0aWFsU2l6ZTsKKwkJbV9wYXJ0aWFsU2l6ZSArPSA4OworCQl3aGlsZSggbV9wYXJ0aWFsU2l6ZSA+PSBtX2NvZGVTaXplICkgeworCQkJaW50IGNvZGUgPSBtX3BhcnRpYWwgJiBtX2NvZGVNYXNrOworCQkJbV9wYXJ0aWFsID4+PSBtX2NvZGVTaXplOworCQkJbV9wYXJ0aWFsU2l6ZSAtPSBtX2NvZGVTaXplOworCisJCQlpZiggY29kZSA+IG1fbmV4dENvZGUgfHwgLyoobV9uZXh0Q29kZSA9PSBNQVhfTFpXX0NPREUgJiYgY29kZSAhPSBtX2NsZWFyQ29kZSkgfHwgKi9jb2RlID09IG1fZW5kQ29kZSApIHsKKwkJCQltX2RvbmUgPSB0cnVlOworCQkJCSpsZW4gPSAoaW50KShidWZwb3MgLSBidWYpOworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQkJaWYoIGNvZGUgPT0gbV9jbGVhckNvZGUgKSB7CisJCQkJQ2xlYXJEZWNvbXByZXNzb3JUYWJsZSgpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvL2FkZCBuZXcgc3RyaW5nIHRvIHN0cmluZyB0YWJsZSwgaWYgbm90IHRoZSBmaXJzdCBwYXNzIHNpbmNlIGEgY2xlYXIgY29kZQorCQkJaWYoIG1fb2xkQ29kZSAhPSBNQVhfTFpXX0NPREUgJiYgbV9uZXh0Q29kZSA8IE1BWF9MWldfQ09ERSkgeworCQkJCW1fc3RyaW5nc1ttX25leHRDb2RlXSA9IG1fc3RyaW5nc1ttX29sZENvZGVdICsgbV9zdHJpbmdzW2NvZGUgPT0gbV9uZXh0Q29kZSA/IG1fb2xkQ29kZSA6IGNvZGVdWzBdOworCQkJfQorCisJCQlpZiggKGludCltX3N0cmluZ3NbY29kZV0uc2l6ZSgpID4gKmxlbiAtIChidWZwb3MgLSBidWYpICkgeworCQkJCS8vb3V0IG9mIHNwYWNlLCBzdHVmZiB0aGUgY29kZSBiYWNrIGluIGZvciBuZXh0IHRpbWUKKwkJCQltX3BhcnRpYWwgPDw9IG1fY29kZVNpemU7CisJCQkJbV9wYXJ0aWFsU2l6ZSArPSBtX2NvZGVTaXplOworCQkJCW1fcGFydGlhbCB8PSBjb2RlOworCQkJCW1fYnVmZmVyUG9zKys7CisJCQkJKmxlbiA9IChpbnQpKGJ1ZnBvcyAtIGJ1Zik7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisKKwkJCS8vb3V0cHV0IHRoZSBzdHJpbmcgaW50byB0aGUgYnVmZmVyCisJCQltZW1jcHkoYnVmcG9zLCBtX3N0cmluZ3NbY29kZV0uZGF0YSgpLCBtX3N0cmluZ3NbY29kZV0uc2l6ZSgpKTsKKwkJCWJ1ZnBvcyArPSBtX3N0cmluZ3NbY29kZV0uc2l6ZSgpOworCisJCQkvL2luY3JlbWVudCB0aGUgbmV4dCBoaWdoZXN0IHZhbGlkIGNvZGUsIGFkZCBhIGJpdCB0byB0aGUgbWFzayBpZiB3ZSBuZWVkIHRvIGluY3JlYXNlIHRoZSBjb2RlIHNpemUKKwkJCWlmKCBtX29sZENvZGUgIT0gTUFYX0xaV19DT0RFICYmIG1fbmV4dENvZGUgPCBNQVhfTFpXX0NPREUgKSB7CisJCQkJaWYoICsrbV9uZXh0Q29kZSA8IE1BWF9MWldfQ09ERSApIHsKKwkJCQkJaWYoIChtX25leHRDb2RlICYgbV9jb2RlTWFzaykgPT0gMCApIHsKKwkJCQkJCW1fY29kZVNpemUrKzsKKwkJCQkJCW1fY29kZU1hc2sgfD0gbV9uZXh0Q29kZTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJbV9vbGRDb2RlID0gY29kZTsKKwkJfQorCX0KKworCW1fYnVmZmVyU2l6ZSA9IDA7CisJKmxlbiA9IChpbnQpKGJ1ZnBvcyAtIGJ1Zik7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBTdHJpbmdUYWJsZTo6RG9uZSh2b2lkKQoreworCW1fZG9uZSA9IHRydWU7Cit9CisKK3ZvaWQgU3RyaW5nVGFibGU6OkNsZWFyQ29tcHJlc3NvclRhYmxlKHZvaWQpCit7CisJaWYobV9zdHJtYXApIHsKKwkJbWVtc2V0KG1fc3RybWFwLCAweEZGLCBzaXplb2YodW5zaWduZWQgaW50KSooMTw8MjApKTsKKwl9CisJbV9uZXh0Q29kZSA9IG1fZW5kQ29kZSArIDE7CisKKwltX3ByZWZpeCA9IDA7CisJbV9jb2RlU2l6ZSA9IG1fbWluQ29kZVNpemUgKyAxOworfQorCit2b2lkIFN0cmluZ1RhYmxlOjpDbGVhckRlY29tcHJlc3NvclRhYmxlKHZvaWQpCit7CisJZm9yKCBpbnQgaSA9IDA7IGkgPCBtX2NsZWFyQ29kZTsgaSsrICkgeworCQltX3N0cmluZ3NbaV0ucmVzaXplKDEpOworCQltX3N0cmluZ3NbaV1bMF0gPSAoY2hhcilpOworCX0KKwltX25leHRDb2RlID0gbV9lbmRDb2RlICsgMTsKKworCW1fY29kZVNpemUgPSBtX21pbkNvZGVTaXplICsgMTsKKwltX2NvZGVNYXNrID0gKDEgPDwgbV9jb2RlU2l6ZSkgLSAxOworCW1fb2xkQ29kZSA9IE1BWF9MWldfQ09ERTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gUGx1Z2luIEludGVyZmFjZQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitzdGF0aWMgaW50IHNfZm9ybWF0X2lkOworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBQbHVnaW4gSW1wbGVtZW50YXRpb24KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYgCitGb3JtYXQoKSB7CisJcmV0dXJuICJHSUYiOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OViAKK0Rlc2NyaXB0aW9uKCkgeworCXJldHVybiAiR3JhcGhpY3MgSW50ZXJjaGFuZ2UgRm9ybWF0IjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYgCitFeHRlbnNpb24oKSB7CisJcmV0dXJuICJnaWYiOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OViAKK1JlZ0V4cHIoKSB7CisJcmV0dXJuICJeR0lGIjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYgCitNaW1lVHlwZSgpIHsKKwlyZXR1cm4gImltYWdlL2dpZiI7Cit9CisKK3N0YXRpYyBCT09MIERMTF9DQUxMQ09OViAKK1ZhbGlkYXRlKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSkgeworCWNoYXIgYnVmWzZdOworCWlmKCBpby0+cmVhZF9wcm9jKGJ1ZiwgNiwgMSwgaGFuZGxlKSA8IDEgKSB7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlCT09MIGJSZXN1bHQgPSBGQUxTRTsKKwlpZiggIXN0cm5jbXAoYnVmLCAiR0lGIiwgMykgKSB7CisJCWlmKCBidWZbM10gPj0gJzAnICYmIGJ1ZlszXSA8PSAnOScgJiYgYnVmWzRdID49ICcwJyAmJiBidWZbNF0gPD0gJzknICYmIGJ1Zls1XSA+PSAnYScgJiYgYnVmWzVdIDw9ICd6JyApIHsKKwkJCWJSZXN1bHQgPSBUUlVFOworCQl9CisJfQorCisJaW8tPnNlZWtfcHJvYyhoYW5kbGUsIC02LCBTRUVLX0NVUik7CisKKwlyZXR1cm4gYlJlc3VsdDsKK30KKworc3RhdGljIEJPT0wgRExMX0NBTExDT05WIAorU3VwcG9ydHNFeHBvcnREZXB0aChpbnQgZGVwdGgpIHsKKwlyZXR1cm4JKGRlcHRoID09IDEpIHx8CisJCQkoZGVwdGggPT0gNCkgfHwKKwkJCShkZXB0aCA9PSA4KTsKK30KKworc3RhdGljIEJPT0wgRExMX0NBTExDT05WIAorU3VwcG9ydHNFeHBvcnRUeXBlKEZSRUVfSU1BR0VfVFlQRSB0eXBlKSB7CisJcmV0dXJuICh0eXBlID09IEZJVF9CSVRNQVApID8gVFJVRSA6IEZBTFNFOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkICpETExfQ0FMTENPTlYgCitPcGVuKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSwgQk9PTCByZWFkKSB7CisJR0lGaW5mbyAqaW5mbyA9IG5ldyhzdGQ6Om5vdGhyb3cpIEdJRmluZm87CisJaWYoIGluZm8gPT0gTlVMTCApIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLy8gMjUvMDIvMjAwOCBNREE6CU5vdCBzYWZlIHRvIG1lbXNldCBHSUZpbmZvIHN0cnVjdHVyZSB3aXRoIFZTIDIwMDggKHNhZmUgaXRlcmF0b3JzKSwKKwkvLwkJCQkJcGVyZm9ybSBpbml0aWFsaXphdGlvbiBpbiBjb25zdHJ1Y3RvciBpbnN0ZWFkLgorCS8vIG1lbXNldChpbmZvLCAwLCBzaXplb2YoR0lGaW5mbykpOworCisJaW5mby0+cmVhZCA9IHJlYWQ7CisJaWYoIHJlYWQgKSB7CisJCXRyeSB7CisJCQkvL0hlYWRlcgorCQkJaWYoICFWYWxpZGF0ZShpbywgaGFuZGxlKSApIHsKKwkJCQl0aHJvdyBGSV9NU0dfRVJST1JfTUFHSUNfTlVNQkVSOworCQkJfQorCQkJaW8tPnNlZWtfcHJvYyhoYW5kbGUsIDYsIFNFRUtfQ1VSKTsKKworCQkJLy9Mb2dpY2FsIFNjcmVlbiBEZXNjcmlwdG9yCisJCQlpby0+c2Vla19wcm9jKGhhbmRsZSwgNCwgU0VFS19DVVIpOworCQkJQllURSBwYWNrZWQ7CisJCQlpZiggaW8tPnJlYWRfcHJvYygmcGFja2VkLCAxLCAxLCBoYW5kbGUpIDwgMSApIHsKKwkJCQl0aHJvdyAiRU9GIHJlYWRpbmcgTG9naWNhbCBTY3JlZW4gRGVzY3JpcHRvciI7CisJCQl9CisJCQlpZiggaW8tPnJlYWRfcHJvYygmaW5mby0+YmFja2dyb3VuZF9jb2xvciwgMSwgMSwgaGFuZGxlKSA8IDEgKSB7CisJCQkJdGhyb3cgIkVPRiByZWFkaW5nIExvZ2ljYWwgU2NyZWVuIERlc2NyaXB0b3IiOworCQkJfQorCQkJaW8tPnNlZWtfcHJvYyhoYW5kbGUsIDEsIFNFRUtfQ1VSKTsKKworCQkJLy9HbG9iYWwgQ29sb3IgVGFibGUKKwkJCWlmKCBwYWNrZWQgJiBHSUZfUEFDS0VEX0xTRF9IQVZFR0NUICkgeworCQkJCWluZm8tPmdsb2JhbF9jb2xvcl90YWJsZV9vZmZzZXQgPSBpby0+dGVsbF9wcm9jKGhhbmRsZSk7CisJCQkJaW5mby0+Z2xvYmFsX2NvbG9yX3RhYmxlX3NpemUgPSAyIDw8IChwYWNrZWQgJiBHSUZfUEFDS0VEX0xTRF9HQ1RTSVpFKTsKKwkJCQlpby0+c2Vla19wcm9jKGhhbmRsZSwgMyAqIGluZm8tPmdsb2JhbF9jb2xvcl90YWJsZV9zaXplLCBTRUVLX0NVUik7CisJCQl9CisKKwkJCS8vU2NhbiB0aHJvdWdoIGFsbCB0aGUgcmVzdCBvZiB0aGUgYmxvY2tzLCBzYXZpbmcgb2Zmc2V0cworCQkJc2l6ZV90IGdjZV9vZmZzZXQgPSAwOworCQkJQllURSBibG9jayA9IDA7CisJCQl3aGlsZSggYmxvY2sgIT0gR0lGX0JMT0NLX1RSQUlMRVIgKSB7CisJCQkJaWYoIGlvLT5yZWFkX3Byb2MoJmJsb2NrLCAxLCAxLCBoYW5kbGUpIDwgMSApIHsKKwkJCQkJdGhyb3cgIkVPRiByZWFkaW5nIGJsb2NrcyI7CisJCQkJfQorCQkJCWlmKCBibG9jayA9PSBHSUZfQkxPQ0tfSU1BR0VfREVTQ1JJUFRPUiApIHsKKwkJCQkJaW5mby0+aW1hZ2VfZGVzY3JpcHRvcl9vZmZzZXRzLnB1c2hfYmFjayhpby0+dGVsbF9wcm9jKGhhbmRsZSkpOworCQkJCQkvL0dDRSBtYXkgYmUgMCwgbWVhbmluZyBubyBHQ0UgcHJlY2VkZWQgdGhpcyBJRAorCQkJCQlpbmZvLT5ncmFwaGljX2NvbnRyb2xfZXh0ZW5zaW9uX29mZnNldHMucHVzaF9iYWNrKGdjZV9vZmZzZXQpOworCQkJCQlnY2Vfb2Zmc2V0ID0gMDsKKworCQkJCQlpby0+c2Vla19wcm9jKGhhbmRsZSwgOCwgU0VFS19DVVIpOworCQkJCQlpZiggaW8tPnJlYWRfcHJvYygmcGFja2VkLCAxLCAxLCBoYW5kbGUpIDwgMSApIHsKKwkJCQkJCXRocm93ICJFT0YgcmVhZGluZyBJbWFnZSBEZXNjcmlwdG9yIjsKKwkJCQkJfQorCisJCQkJCS8vTG9jYWwgQ29sb3IgVGFibGUKKwkJCQkJaWYoIHBhY2tlZCAmIEdJRl9QQUNLRURfSURfSEFWRUxDVCApIHsKKwkJCQkJCWlvLT5zZWVrX3Byb2MoaGFuZGxlLCAzICogKDIgPDwgKHBhY2tlZCAmIEdJRl9QQUNLRURfSURfTENUU0laRSkpLCBTRUVLX0NVUik7CisJCQkJCX0KKworCQkJCQkvL0xaVyBNaW5pbXVtIENvZGUgU2l6ZQorCQkJCQlpby0+c2Vla19wcm9jKGhhbmRsZSwgMSwgU0VFS19DVVIpOworCQkJCX0gZWxzZSBpZiggYmxvY2sgPT0gR0lGX0JMT0NLX0VYVEVOU0lPTiApIHsKKwkJCQkJQllURSBleHQ7CisJCQkJCWlmKCBpby0+cmVhZF9wcm9jKCZleHQsIDEsIDEsIGhhbmRsZSkgPCAxICkgeworCQkJCQkJdGhyb3cgIkVPRiByZWFkaW5nIGV4dGVuc2lvbiI7CisJCQkJCX0KKworCQkJCQlpZiggZXh0ID09IEdJRl9FWFRfR1JBUEhJQ19DT05UUk9MICkgeworCQkJCQkJLy9vdmVyd3JpdGUgcHJldmlvdXMgb2Zmc2V0IGlmIG1vcmUgdGhhbiBvbmUgR0NFIGZvdW5kIGJlZm9yZSBhbiBJRAorCQkJCQkJZ2NlX29mZnNldCA9IGlvLT50ZWxsX3Byb2MoaGFuZGxlKTsKKwkJCQkJfSBlbHNlIGlmKCBleHQgPT0gR0lGX0VYVF9DT01NRU5UICkgeworCQkJCQkJaW5mby0+Y29tbWVudF9leHRlbnNpb25fb2Zmc2V0cy5wdXNoX2JhY2soaW8tPnRlbGxfcHJvYyhoYW5kbGUpKTsKKwkJCQkJfSBlbHNlIGlmKCBleHQgPT0gR0lGX0VYVF9BUFBMSUNBVElPTiApIHsKKwkJCQkJCWluZm8tPmFwcGxpY2F0aW9uX2V4dGVuc2lvbl9vZmZzZXRzLnB1c2hfYmFjayhpby0+dGVsbF9wcm9jKGhhbmRsZSkpOworCQkJCQl9CisJCQkJfSBlbHNlIGlmKCBibG9jayA9PSBHSUZfQkxPQ0tfVFJBSUxFUiApIHsKKwkJCQkJY29udGludWU7CisJCQkJfSBlbHNlIHsKKwkJCQkJdGhyb3cgIkludmFsaWQgR0lGIGJsb2NrIGZvdW5kIjsKKwkJCQl9CisKKwkJCQkvL0RhdGEgU3ViLWJsb2NrcworCQkJCUJZVEUgbGVuOworCQkJCWlmKCBpby0+cmVhZF9wcm9jKCZsZW4sIDEsIDEsIGhhbmRsZSkgPCAxICkgeworCQkJCQl0aHJvdyAiRU9GIHJlYWRpbmcgc3ViLWJsb2NrIjsKKwkJCQl9CisJCQkJd2hpbGUoIGxlbiAhPSAwICkgeworCQkJCQlpby0+c2Vla19wcm9jKGhhbmRsZSwgbGVuLCBTRUVLX0NVUik7CisJCQkJCWlmKCBpby0+cmVhZF9wcm9jKCZsZW4sIDEsIDEsIGhhbmRsZSkgPCAxICkgeworCQkJCQkJdGhyb3cgIkVPRiByZWFkaW5nIHN1Yi1ibG9jayI7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0gY2F0Y2ggKGNvbnN0IGNoYXIgKm1zZykgeworCQkJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKHNfZm9ybWF0X2lkLCBtc2cpOworCQkJZGVsZXRlIGluZm87CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0gZWxzZSB7CisJCS8vSGVhZGVyCisJCWlvLT53cml0ZV9wcm9jKCh2b2lkICopIkdJRjg5YSIsIDYsIDEsIGhhbmRsZSk7CisJfQorCisJcmV0dXJuIGluZm87Cit9CisKK3N0YXRpYyB2b2lkIERMTF9DQUxMQ09OViAKK0Nsb3NlKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSwgdm9pZCAqZGF0YSkgeworCWlmKCBkYXRhID09IE5VTEwgKSB7CisJCXJldHVybjsKKwl9CisJR0lGaW5mbyAqaW5mbyA9IChHSUZpbmZvICopZGF0YTsKKworCWlmKCAhaW5mby0+cmVhZCApIHsKKwkJLy9UcmFpbGVyCisJCUJZVEUgYiA9IEdJRl9CTE9DS19UUkFJTEVSOworCQlpby0+d3JpdGVfcHJvYygmYiwgMSwgMSwgaGFuZGxlKTsKKwl9CisKKwlkZWxldGUgaW5mbzsKK30KKworc3RhdGljIGludCBETExfQ0FMTENPTlYKK1BhZ2VDb3VudChGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIHZvaWQgKmRhdGEpIHsKKwlpZiggZGF0YSA9PSBOVUxMICkgeworCQlyZXR1cm4gMDsKKwl9CisJR0lGaW5mbyAqaW5mbyA9IChHSUZpbmZvICopZGF0YTsKKworCXJldHVybiAoaW50KSBpbmZvLT5pbWFnZV9kZXNjcmlwdG9yX29mZnNldHMuc2l6ZSgpOworfQorCitzdGF0aWMgRklCSVRNQVAgKiBETExfQ0FMTENPTlYgCitMb2FkKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSwgaW50IHBhZ2UsIGludCBmbGFncywgdm9pZCAqZGF0YSkgeworCWlmKCBkYXRhID09IE5VTEwgKSB7CisJCXJldHVybiBOVUxMOworCX0KKwlHSUZpbmZvICppbmZvID0gKEdJRmluZm8gKilkYXRhOworCisJaWYoIHBhZ2UgPT0gLTEgKSB7CisJCXBhZ2UgPSAwOworCX0KKwlpZiggcGFnZSA8IDAgfHwgcGFnZSA+PSAoaW50KWluZm8tPmltYWdlX2Rlc2NyaXB0b3Jfb2Zmc2V0cy5zaXplKCkgKSB7CisJCXJldHVybiBOVUxMOworCX0KKworCUZJQklUTUFQICpkaWIgPSBOVUxMOworCXRyeSB7CisJCWJvb2wgaGF2ZV90cmFuc3BhcmVudCA9IGZhbHNlLCBub19sb2NhbF9wYWxldHRlID0gZmFsc2UsIGludGVybGFjZWQgPSBmYWxzZTsKKwkJaW50IGRpc3Bvc2FsX21ldGhvZCA9IEdJRl9ESVNQT1NBTF9MRUFWRSwgZGVsYXlfdGltZSA9IDAsIHRyYW5zcGFyZW50X2NvbG9yID0gMDsKKwkJV09SRCBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQ7CisJCUJZVEUgcGFja2VkLCBiOworCQlXT1JEIHc7CisKKwkJLy9wbGF5YmFjayBwYWdlcyB0byBnZW5lcmF0ZSB3aGF0IHRoZSB1c2VyIHdvdWxkIHNlZSBmb3IgdGhpcyBmcmFtZQorCQlpZiggKGZsYWdzICYgR0lGX1BMQVlCQUNLKSA9PSBHSUZfUExBWUJBQ0sgKSB7CisJCQkvL0xvZ2ljYWwgU2NyZWVuIERlc2NyaXB0b3IKKwkJCWlvLT5zZWVrX3Byb2MoaGFuZGxlLCA2LCBTRUVLX1NFVCk7CisJCQlXT1JEIGxvZ2ljYWx3aWR0aCwgbG9naWNhbGhlaWdodDsKKwkJCWlvLT5yZWFkX3Byb2MoJmxvZ2ljYWx3aWR0aCwgMiwgMSwgaGFuZGxlKTsKKwkJCWlvLT5yZWFkX3Byb2MoJmxvZ2ljYWxoZWlnaHQsIDIsIDEsIGhhbmRsZSk7CisjaWZkZWYgRlJFRUlNQUdFX0JJR0VORElBTgorCQkJU3dhcFNob3J0KCZsb2dpY2Fsd2lkdGgpOworCQkJU3dhcFNob3J0KCZsb2dpY2FsaGVpZ2h0KTsKKyNlbmRpZgorCQkJLy9zZXQgdGhlIGJhY2tncm91bmQgY29sb3Igd2l0aCAwIGFscGhhCisJCQlSR0JRVUFEIGJhY2tncm91bmQ7CisJCQlpZiggaW5mby0+Z2xvYmFsX2NvbG9yX3RhYmxlX29mZnNldCAhPSAwICYmIGluZm8tPmJhY2tncm91bmRfY29sb3IgPCBpbmZvLT5nbG9iYWxfY29sb3JfdGFibGVfc2l6ZSApIHsKKwkJCQlpby0+c2Vla19wcm9jKGhhbmRsZSwgKGxvbmcpKGluZm8tPmdsb2JhbF9jb2xvcl90YWJsZV9vZmZzZXQgKyAoaW5mby0+YmFja2dyb3VuZF9jb2xvciAqIDMpKSwgU0VFS19TRVQpOworCQkJCWlvLT5yZWFkX3Byb2MoJmJhY2tncm91bmQucmdiUmVkLCAxLCAxLCBoYW5kbGUpOworCQkJCWlvLT5yZWFkX3Byb2MoJmJhY2tncm91bmQucmdiR3JlZW4sIDEsIDEsIGhhbmRsZSk7CisJCQkJaW8tPnJlYWRfcHJvYygmYmFja2dyb3VuZC5yZ2JCbHVlLCAxLCAxLCBoYW5kbGUpOworCQkJfSBlbHNlIHsKKwkJCQliYWNrZ3JvdW5kLnJnYlJlZCA9IDA7CisJCQkJYmFja2dyb3VuZC5yZ2JHcmVlbiA9IDA7CisJCQkJYmFja2dyb3VuZC5yZ2JCbHVlID0gMDsKKwkJCX0KKwkJCWJhY2tncm91bmQucmdiUmVzZXJ2ZWQgPSAwOworCisJCQkvL2FsbG9jYXRlIGVudGlyZSBsb2dpY2FsIGFyZWEKKwkJCWRpYiA9IEZyZWVJbWFnZV9BbGxvY2F0ZShsb2dpY2Fsd2lkdGgsIGxvZ2ljYWxoZWlnaHQsIDMyKTsKKwkJCWlmKCBkaWIgPT0gTlVMTCApIHsKKwkJCQl0aHJvdyBGSV9NU0dfRVJST1JfRElCX01FTU9SWTsKKwkJCX0KKworCQkJLy9maWxsIHdpdGggYmFja2dyb3VuZCBjb2xvciB0byBzdGFydAorCQkJaW50IHgsIHk7CisJCQlSR0JRVUFEICpzY2FubGluZTsKKwkJCWZvciggeSA9IDA7IHkgPCBsb2dpY2FsaGVpZ2h0OyB5KysgKSB7CisJCQkJc2NhbmxpbmUgPSAoUkdCUVVBRCAqKUZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIHkpOworCQkJCWZvciggeCA9IDA7IHggPCBsb2dpY2Fsd2lkdGg7IHgrKyApIHsKKwkJCQkJKnNjYW5saW5lKysgPSBiYWNrZ3JvdW5kOworCQkJCX0KKwkJCX0KKworCQkJLy9jYWNoZSBzb21lIGluZm8gYWJvdXQgZWFjaCBvZiB0aGUgcGFnZXMgc28gd2UgY2FuIGF2b2lkIGRlY29kaW5nIGFzIG1hbnkgb2YgdGhlbSBhcyBwb3NzaWJsZQorCQkJc3RkOjp2ZWN0b3I8UGFnZUluZm8+IHBhZ2VpbmZvOworCQkJaW50IHN0YXJ0ID0gcGFnZSwgZW5kID0gcGFnZTsKKwkJCXdoaWxlKCBzdGFydCA+PSAwICkgeworCQkJCS8vR3JhcGhpYyBDb250cm9sIEV4dGVuc2lvbgorCQkJCWlvLT5zZWVrX3Byb2MoaGFuZGxlLCAobG9uZykoaW5mby0+Z3JhcGhpY19jb250cm9sX2V4dGVuc2lvbl9vZmZzZXRzW3N0YXJ0XSArIDEpLCBTRUVLX1NFVCk7CisJCQkJaW8tPnJlYWRfcHJvYygmcGFja2VkLCAxLCAxLCBoYW5kbGUpOworCQkJCWhhdmVfdHJhbnNwYXJlbnQgPSAocGFja2VkICYgR0lGX1BBQ0tFRF9HQ0VfSEFWRVRSQU5TKSA/IHRydWUgOiBmYWxzZTsKKwkJCQlkaXNwb3NhbF9tZXRob2QgPSAocGFja2VkICYgR0lGX1BBQ0tFRF9HQ0VfRElTUE9TQUwpID4+IDI7CisJCQkJLy9JbWFnZSBEZXNjcmlwdG9yCisJCQkJaW8tPnNlZWtfcHJvYyhoYW5kbGUsIChsb25nKShpbmZvLT5pbWFnZV9kZXNjcmlwdG9yX29mZnNldHNbc3RhcnRdKSwgU0VFS19TRVQpOworCQkJCWlvLT5yZWFkX3Byb2MoJmxlZnQsIDIsIDEsIGhhbmRsZSk7CisJCQkJaW8tPnJlYWRfcHJvYygmdG9wLCAyLCAxLCBoYW5kbGUpOworCQkJCWlvLT5yZWFkX3Byb2MoJndpZHRoLCAyLCAxLCBoYW5kbGUpOworCQkJCWlvLT5yZWFkX3Byb2MoJmhlaWdodCwgMiwgMSwgaGFuZGxlKTsKKyNpZmRlZiBGUkVFSU1BR0VfQklHRU5ESUFOCisJCQkJU3dhcFNob3J0KCZsZWZ0KTsKKwkJCQlTd2FwU2hvcnQoJnRvcCk7CisJCQkJU3dhcFNob3J0KCZ3aWR0aCk7CisJCQkJU3dhcFNob3J0KCZoZWlnaHQpOworI2VuZGlmCisKKwkJCQlwYWdlaW5mby5wdXNoX2JhY2soUGFnZUluZm8oZGlzcG9zYWxfbWV0aG9kLCBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQpKTsKKworCQkJCWlmKCBzdGFydCAhPSBlbmQgKSB7CisJCQkJCWlmKCBsZWZ0ID09IDAgJiYgdG9wID09IDAgJiYgd2lkdGggPT0gbG9naWNhbHdpZHRoICYmIGhlaWdodCA9PSBsb2dpY2FsaGVpZ2h0ICkgeworCQkJCQkJaWYoIGRpc3Bvc2FsX21ldGhvZCA9PSBHSUZfRElTUE9TQUxfQkFDS0dST1VORCApIHsKKwkJCQkJCQlwYWdlaW5mby5wb3BfYmFjaygpOworCQkJCQkJCXN0YXJ0Kys7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9IGVsc2UgaWYoIGRpc3Bvc2FsX21ldGhvZCAhPSBHSUZfRElTUE9TQUxfUFJFVklPVVMgKSB7CisJCQkJCQkJaWYoICFoYXZlX3RyYW5zcGFyZW50ICkgeworCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJc3RhcnQtLTsKKwkJCX0KKwkJCWlmKCBzdGFydCA8IDAgKSB7CisJCQkJc3RhcnQgPSAwOworCQkJfQorCisJCQkvL2RyYXcgZWFjaCBwYWdlIGludG8gdGhlIGxvZ2ljYWwgYXJlYQorCQkJZGVsYXlfdGltZSA9IDA7CisJCQlmb3IoIHBhZ2UgPSBzdGFydDsgcGFnZSA8PSBlbmQ7IHBhZ2UrKyApIHsKKwkJCQlQYWdlSW5mbyAmaW5mbyA9IHBhZ2VpbmZvW2VuZCAtIHBhZ2VdOworCQkJCS8vdGhpbmdzIHdlIGNhbiBza2lwIGhhdmluZyB0byBkZWNvZGUKKwkJCQlpZiggcGFnZSAhPSBlbmQgKSB7CisJCQkJCWlmKCBpbmZvLmRpc3Bvc2FsX21ldGhvZCA9PSBHSUZfRElTUE9TQUxfUFJFVklPVVMgKSB7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCQlpZiggaW5mby5kaXNwb3NhbF9tZXRob2QgPT0gR0lGX0RJU1BPU0FMX0JBQ0tHUk9VTkQgKSB7CisJCQkJCQlmb3IoIHkgPSAwOyB5IDwgaW5mby5oZWlnaHQ7IHkrKyApIHsKKwkJCQkJCQljb25zdCBpbnQgc2NhbmlkeCA9IGxvZ2ljYWxoZWlnaHQgLSAoeSArIGluZm8udG9wKSAtIDE7CisJCQkJCQkJaWYgKCBzY2FuaWR4IDwgMCApIHsKKwkJCQkJCQkJYnJlYWs7ICAvLyBJZiBkYXRhIGlzIGNvcnJ1cHQsIGRvbid0IGNhbGN1bGF0ZSBpbiBpbnZhbGlkIHNjYW5saW5lCisJCQkJCQkJfQorCQkJCQkJCXNjYW5saW5lID0gKFJHQlFVQUQgKilGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCBzY2FuaWR4KSArIGluZm8ubGVmdDsKKwkJCQkJCQlmb3IoIHggPSAwOyB4IDwgaW5mby53aWR0aDsgeCsrICkgeworCQkJCQkJCQkqc2NhbmxpbmUrKyA9IGJhY2tncm91bmQ7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQl9CisKKwkJCQkvL2RlY29kZSBwYWdlCisJCQkJRklCSVRNQVAgKnBhZ2VkaWIgPSBMb2FkKGlvLCBoYW5kbGUsIHBhZ2UsIEdJRl9MT0FEMjU2LCBkYXRhKTsKKwkJCQlpZiggcGFnZWRpYiAhPSBOVUxMICkgeworCQkJCQlSR0JRVUFEICpwYWwgPSBGcmVlSW1hZ2VfR2V0UGFsZXR0ZShwYWdlZGliKTsKKwkJCQkJaGF2ZV90cmFuc3BhcmVudCA9IGZhbHNlOworCQkJCQlpZiggRnJlZUltYWdlX0lzVHJhbnNwYXJlbnQocGFnZWRpYikgKSB7CisJCQkJCQlpbnQgY291bnQgPSBGcmVlSW1hZ2VfR2V0VHJhbnNwYXJlbmN5Q291bnQocGFnZWRpYik7CisJCQkJCQlCWVRFICp0YWJsZSA9IEZyZWVJbWFnZV9HZXRUcmFuc3BhcmVuY3lUYWJsZShwYWdlZGliKTsKKwkJCQkJCWZvciggaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKyApIHsKKwkJCQkJCQlpZiggdGFibGVbaV0gPT0gMCApIHsKKwkJCQkJCQkJaGF2ZV90cmFuc3BhcmVudCA9IHRydWU7CisJCQkJCQkJCXRyYW5zcGFyZW50X2NvbG9yID0gaTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJCS8vY29weSBwYWdlIGRhdGEgaW50byBsb2dpY2FsIGJ1ZmZlciwgd2l0aCBmdWxsIGFscGhhIG9wYXF1ZW5lc3MKKwkJCQkJZm9yKCB5ID0gMDsgeSA8IGluZm8uaGVpZ2h0OyB5KysgKSB7CisJCQkJCQljb25zdCBpbnQgc2NhbmlkeCA9IGxvZ2ljYWxoZWlnaHQgLSAoeSArIGluZm8udG9wKSAtIDE7CisJCQkJCQlpZiAoIHNjYW5pZHggPCAwICkgeworCQkJCQkJCWJyZWFrOyAgLy8gSWYgZGF0YSBpcyBjb3JydXB0LCBkb24ndCBjYWxjdWxhdGUgaW4gaW52YWxpZCBzY2FubGluZQorCQkJCQkJfQorCQkJCQkJc2NhbmxpbmUgPSAoUkdCUVVBRCAqKUZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIHNjYW5pZHgpICsgaW5mby5sZWZ0OworCQkJCQkJQllURSAqcGFnZWxpbmUgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUocGFnZWRpYiwgaW5mby5oZWlnaHQgLSB5IC0gMSk7CisJCQkJCQlmb3IoIHggPSAwOyB4IDwgaW5mby53aWR0aDsgeCsrICkgeworCQkJCQkJCWlmKCAhaGF2ZV90cmFuc3BhcmVudCB8fCAqcGFnZWxpbmUgIT0gdHJhbnNwYXJlbnRfY29sb3IgKSB7CisJCQkJCQkJCSpzY2FubGluZSA9IHBhbFsqcGFnZWxpbmVdOworCQkJCQkJCQlzY2FubGluZS0+cmdiUmVzZXJ2ZWQgPSAyNTU7CisJCQkJCQkJfQorCQkJCQkJCXNjYW5saW5lKys7CisJCQkJCQkJcGFnZWxpbmUrKzsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQkvL2NvcHkgZnJhbWUgdGltZQorCQkJCQlpZiggcGFnZSA9PSBlbmQgKSB7CisJCQkJCQlGSVRBRyAqdGFnOworCQkJCQkJaWYoIEZyZWVJbWFnZV9HZXRNZXRhZGF0YUV4KEZJTURfQU5JTUFUSU9OLCBwYWdlZGliLCAiRnJhbWVUaW1lIiwgRklEVF9MT05HLCAmdGFnKSApIHsKKwkJCQkJCQlkZWxheV90aW1lID0gKihMT05HICopRnJlZUltYWdlX0dldFRhZ1ZhbHVlKHRhZyk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJRnJlZUltYWdlX1VubG9hZChwYWdlZGliKTsKKwkJCQl9CisJCQl9CisKKwkJCS8vc2V0dXAgZnJhbWUgdGltZQorCQkJRnJlZUltYWdlX1NldE1ldGFkYXRhRXgoRklNRF9BTklNQVRJT04sIGRpYiwgIkZyYW1lVGltZSIsIEFOSU1UQUdfRlJBTUVUSU1FLCBGSURUX0xPTkcsIDEsIDQsICZkZWxheV90aW1lKTsKKwkJCXJldHVybiBkaWI7CisJCX0KKworCQkvL2dldCB0aGUgYWN0dWFsIGZyYW1lIGltYWdlIGRhdGEgZm9yIGEgc2luZ2xlIGZyYW1lCisKKwkJLy9JbWFnZSBEZXNjcmlwdG9yCisJCWlvLT5zZWVrX3Byb2MoaGFuZGxlLCAobG9uZylpbmZvLT5pbWFnZV9kZXNjcmlwdG9yX29mZnNldHNbcGFnZV0sIFNFRUtfU0VUKTsKKwkJaW8tPnJlYWRfcHJvYygmbGVmdCwgMiwgMSwgaGFuZGxlKTsKKwkJaW8tPnJlYWRfcHJvYygmdG9wLCAyLCAxLCBoYW5kbGUpOworCQlpby0+cmVhZF9wcm9jKCZ3aWR0aCwgMiwgMSwgaGFuZGxlKTsKKwkJaW8tPnJlYWRfcHJvYygmaGVpZ2h0LCAyLCAxLCBoYW5kbGUpOworI2lmZGVmIEZSRUVJTUFHRV9CSUdFTkRJQU4KKwkJU3dhcFNob3J0KCZsZWZ0KTsKKwkJU3dhcFNob3J0KCZ0b3ApOworCQlTd2FwU2hvcnQoJndpZHRoKTsKKwkJU3dhcFNob3J0KCZoZWlnaHQpOworI2VuZGlmCisJCWlvLT5yZWFkX3Byb2MoJnBhY2tlZCwgMSwgMSwgaGFuZGxlKTsKKwkJaW50ZXJsYWNlZCA9IChwYWNrZWQgJiBHSUZfUEFDS0VEX0lEX0lOVEVSTEFDRUQpID8gdHJ1ZSA6IGZhbHNlOworCQlub19sb2NhbF9wYWxldHRlID0gKHBhY2tlZCAmIEdJRl9QQUNLRURfSURfSEFWRUxDVCkgPyBmYWxzZSA6IHRydWU7CisKKwkJaW50IGJwcCA9IDg7CisJCWlmKCAoZmxhZ3MgJiBHSUZfTE9BRDI1NikgPT0gMCApIHsKKwkJCWlmKCAhbm9fbG9jYWxfcGFsZXR0ZSApIHsKKwkJCQlpbnQgc2l6ZSA9IDIgPDwgKHBhY2tlZCAmIEdJRl9QQUNLRURfSURfTENUU0laRSk7CisJCQkJaWYoIHNpemUgPD0gMiApIGJwcCA9IDE7CisJCQkJZWxzZSBpZiggc2l6ZSA8PSAxNiApIGJwcCA9IDQ7CisJCQl9IGVsc2UgaWYoIGluZm8tPmdsb2JhbF9jb2xvcl90YWJsZV9vZmZzZXQgIT0gMCApIHsKKwkJCQlpZiggaW5mby0+Z2xvYmFsX2NvbG9yX3RhYmxlX3NpemUgPD0gMiApIGJwcCA9IDE7CisJCQkJZWxzZSBpZiggaW5mby0+Z2xvYmFsX2NvbG9yX3RhYmxlX3NpemUgPD0gMTYgKSBicHAgPSA0OworCQkJfQorCQl9CisJCWRpYiA9IEZyZWVJbWFnZV9BbGxvY2F0ZSh3aWR0aCwgaGVpZ2h0LCBicHApOworCQlpZiggZGliID09IE5VTEwgKSB7CisJCQl0aHJvdyBGSV9NU0dfRVJST1JfRElCX01FTU9SWTsKKwkJfQorCisJCUZyZWVJbWFnZV9TZXRNZXRhZGF0YUV4KEZJTURfQU5JTUFUSU9OLCBkaWIsICJGcmFtZUxlZnQiLCBBTklNVEFHX0ZSQU1FTEVGVCwgRklEVF9TSE9SVCwgMSwgMiwgJmxlZnQpOworCQlGcmVlSW1hZ2VfU2V0TWV0YWRhdGFFeChGSU1EX0FOSU1BVElPTiwgZGliLCAiRnJhbWVUb3AiLCBBTklNVEFHX0ZSQU1FVE9QLCBGSURUX1NIT1JULCAxLCAyLCAmdG9wKTsKKwkJYiA9IG5vX2xvY2FsX3BhbGV0dGUgPyAxIDogMDsKKwkJRnJlZUltYWdlX1NldE1ldGFkYXRhRXgoRklNRF9BTklNQVRJT04sIGRpYiwgIk5vTG9jYWxQYWxldHRlIiwgQU5JTVRBR19OT0xPQ0FMUEFMRVRURSwgRklEVF9CWVRFLCAxLCAxLCAmYik7CisJCWIgPSBpbnRlcmxhY2VkID8gMSA6IDA7CisJCUZyZWVJbWFnZV9TZXRNZXRhZGF0YUV4KEZJTURfQU5JTUFUSU9OLCBkaWIsICJJbnRlcmxhY2VkIiwgQU5JTVRBR19JTlRFUkxBQ0VELCBGSURUX0JZVEUsIDEsIDEsICZiKTsKKworCQkvL1BhbGV0dGUKKwkJUkdCUVVBRCAqcGFsID0gRnJlZUltYWdlX0dldFBhbGV0dGUoZGliKTsKKwkJaWYoICFub19sb2NhbF9wYWxldHRlICkgeworCQkJaW50IHNpemUgPSAyIDw8IChwYWNrZWQgJiBHSUZfUEFDS0VEX0lEX0xDVFNJWkUpOworCisJCQlpbnQgaSA9IDA7CisJCQl3aGlsZSggaSA8IHNpemUgKSB7CisJCQkJaW8tPnJlYWRfcHJvYygmcGFsW2ldLnJnYlJlZCwgMSwgMSwgaGFuZGxlKTsKKwkJCQlpby0+cmVhZF9wcm9jKCZwYWxbaV0ucmdiR3JlZW4sIDEsIDEsIGhhbmRsZSk7CisJCQkJaW8tPnJlYWRfcHJvYygmcGFsW2ldLnJnYkJsdWUsIDEsIDEsIGhhbmRsZSk7CisJCQkJaSsrOworCQkJfQorCQl9IGVsc2UgaWYoIGluZm8tPmdsb2JhbF9jb2xvcl90YWJsZV9vZmZzZXQgIT0gMCApIHsKKwkJCWxvbmcgcG9zID0gaW8tPnRlbGxfcHJvYyhoYW5kbGUpOworCQkJaW8tPnNlZWtfcHJvYyhoYW5kbGUsIChsb25nKWluZm8tPmdsb2JhbF9jb2xvcl90YWJsZV9vZmZzZXQsIFNFRUtfU0VUKTsKKworCQkJaW50IGkgPSAwOworCQkJd2hpbGUoIGkgPCBpbmZvLT5nbG9iYWxfY29sb3JfdGFibGVfc2l6ZSApIHsKKwkJCQlpby0+cmVhZF9wcm9jKCZwYWxbaV0ucmdiUmVkLCAxLCAxLCBoYW5kbGUpOworCQkJCWlvLT5yZWFkX3Byb2MoJnBhbFtpXS5yZ2JHcmVlbiwgMSwgMSwgaGFuZGxlKTsKKwkJCQlpby0+cmVhZF9wcm9jKCZwYWxbaV0ucmdiQmx1ZSwgMSwgMSwgaGFuZGxlKTsKKwkJCQlpKys7CisJCQl9CisKKwkJCWlvLT5zZWVrX3Byb2MoaGFuZGxlLCBwb3MsIFNFRUtfU0VUKTsKKwkJfSBlbHNlIHsKKwkJCS8vaXRzIGxlZ2FsIHRvIGhhdmUgbm8gcGFsZXR0ZSwgYnV0IHdlJ3JlIGdvaW5nIHRvIGdlbmVyYXRlICpzb21ldGhpbmcqCisJCQlmb3IoIGludCBpID0gMDsgaSA8IDI1NjsgaSsrICkgeworCQkJCXBhbFtpXS5yZ2JSZWQgICA9IChCWVRFKWk7CisJCQkJcGFsW2ldLnJnYkdyZWVuID0gKEJZVEUpaTsKKwkJCQlwYWxbaV0ucmdiQmx1ZSAgPSAoQllURSlpOworCQkJfQorCQl9CisKKwkJLy9MWlcgTWluaW11bSBDb2RlIFNpemUKKwkJaW8tPnJlYWRfcHJvYygmYiwgMSwgMSwgaGFuZGxlKTsKKwkJU3RyaW5nVGFibGUgKnN0cmluZ3RhYmxlID0gbmV3KHN0ZDo6bm90aHJvdykgU3RyaW5nVGFibGU7CisJCXN0cmluZ3RhYmxlLT5Jbml0aWFsaXplKGIpOworCisJCS8vSW1hZ2UgRGF0YSBTdWItYmxvY2tzCisJCWludCB4ID0gMCwgeHBvcyA9IDAsIHkgPSAwLCBzaGlmdCA9IDggLSBicHAsIG1hc2sgPSAoMSA8PCBicHApIC0gMSwgaW50ZXJsYWNlcGFzcyA9IDA7CisJCUJZVEUgKnNjYW5saW5lID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgaGVpZ2h0IC0gMSk7CisJCUJZVEUgYnVmWzQwOTZdOworCQlpby0+cmVhZF9wcm9jKCZiLCAxLCAxLCBoYW5kbGUpOworCQl3aGlsZSggYiApIHsKKwkJCWlvLT5yZWFkX3Byb2Moc3RyaW5ndGFibGUtPkZpbGxJbnB1dEJ1ZmZlcihiKSwgYiwgMSwgaGFuZGxlKTsKKwkJCWludCBzaXplID0gc2l6ZW9mKGJ1Zik7CisJCQl3aGlsZSggc3RyaW5ndGFibGUtPkRlY29tcHJlc3MoYnVmLCAmc2l6ZSkgKSB7CisJCQkJZm9yKCBpbnQgaSA9IDA7IGkgPCBzaXplOyBpKysgKSB7CisJCQkJCXNjYW5saW5lW3hwb3NdIHw9IChidWZbaV0gJiBtYXNrKSA8PCBzaGlmdDsKKwkJCQkJaWYoIHNoaWZ0ID4gMCApIHsKKwkJCQkJCXNoaWZ0IC09IGJwcDsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXhwb3MrKzsKKwkJCQkJCXNoaWZ0ID0gOCAtIGJwcDsKKwkJCQkJfQorCQkJCQlpZiggKyt4ID49IHdpZHRoICkgeworCQkJCQkJaWYoIGludGVybGFjZWQgKSB7CisJCQkJCQkJeSArPSBnX0dpZkludGVybGFjZUluY3JlbWVudFtpbnRlcmxhY2VwYXNzXTsKKwkJCQkJCQlpZiggeSA+PSBoZWlnaHQgJiYgKytpbnRlcmxhY2VwYXNzIDwgR0lGX0lOVEVSTEFDRV9QQVNTRVMgKSB7CisJCQkJCQkJCXkgPSBnX0dpZkludGVybGFjZU9mZnNldFtpbnRlcmxhY2VwYXNzXTsKKwkJCQkJCQl9IAkJCQkJCQorCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQl5Kys7CisJCQkJCQl9CisJCQkJCQlpZiggeSA+PSBoZWlnaHQgKSB7CisJCQkJCQkJc3RyaW5ndGFibGUtPkRvbmUoKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCXggPSB4cG9zID0gMDsKKwkJCQkJCXNoaWZ0ID0gOCAtIGJwcDsKKwkJCQkJCXNjYW5saW5lID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgaGVpZ2h0IC0geSAtIDEpOworCQkJCQl9CisJCQkJfQorCQkJCXNpemUgPSBzaXplb2YoYnVmKTsKKwkJCX0KKwkJCWlvLT5yZWFkX3Byb2MoJmIsIDEsIDEsIGhhbmRsZSk7CisJCX0KKworCQlpZiggcGFnZSA9PSAwICkgeworCQkJc2l6ZV90IGlkeDsKKworCQkJLy9Mb2dpY2FsIFNjcmVlbiBEZXNjcmlwdG9yCisJCQlpby0+c2Vla19wcm9jKGhhbmRsZSwgNiwgU0VFS19TRVQpOworCQkJV09SRCBsb2dpY2Fsd2lkdGgsIGxvZ2ljYWxoZWlnaHQ7CisJCQlpby0+cmVhZF9wcm9jKCZsb2dpY2Fsd2lkdGgsIDIsIDEsIGhhbmRsZSk7CisJCQlpby0+cmVhZF9wcm9jKCZsb2dpY2FsaGVpZ2h0LCAyLCAxLCBoYW5kbGUpOworI2lmZGVmIEZSRUVJTUFHRV9CSUdFTkRJQU4KKwkJCVN3YXBTaG9ydCgmbG9naWNhbHdpZHRoKTsKKwkJCVN3YXBTaG9ydCgmbG9naWNhbGhlaWdodCk7CisjZW5kaWYKKwkJCUZyZWVJbWFnZV9TZXRNZXRhZGF0YUV4KEZJTURfQU5JTUFUSU9OLCBkaWIsICJMb2dpY2FsV2lkdGgiLCBBTklNVEFHX0xPR0lDQUxXSURUSCwgRklEVF9TSE9SVCwgMSwgMiwgJmxvZ2ljYWx3aWR0aCk7CisJCQlGcmVlSW1hZ2VfU2V0TWV0YWRhdGFFeChGSU1EX0FOSU1BVElPTiwgZGliLCAiTG9naWNhbEhlaWdodCIsIEFOSU1UQUdfTE9HSUNBTEhFSUdIVCwgRklEVF9TSE9SVCwgMSwgMiwgJmxvZ2ljYWxoZWlnaHQpOworCisJCQkvL0dsb2JhbCBDb2xvciBUYWJsZQorCQkJaWYoIGluZm8tPmdsb2JhbF9jb2xvcl90YWJsZV9vZmZzZXQgIT0gMCApIHsKKwkJCQlSR0JRVUFEIGdsb2JhbHBhbGV0dGVbMjU2XTsKKwkJCQlpby0+c2Vla19wcm9jKGhhbmRsZSwgKGxvbmcpaW5mby0+Z2xvYmFsX2NvbG9yX3RhYmxlX29mZnNldCwgU0VFS19TRVQpOworCQkJCWludCBpID0gMDsKKwkJCQl3aGlsZSggaSA8IGluZm8tPmdsb2JhbF9jb2xvcl90YWJsZV9zaXplICkgeworCQkJCQlpby0+cmVhZF9wcm9jKCZnbG9iYWxwYWxldHRlW2ldLnJnYlJlZCwgMSwgMSwgaGFuZGxlKTsKKwkJCQkJaW8tPnJlYWRfcHJvYygmZ2xvYmFscGFsZXR0ZVtpXS5yZ2JHcmVlbiwgMSwgMSwgaGFuZGxlKTsKKwkJCQkJaW8tPnJlYWRfcHJvYygmZ2xvYmFscGFsZXR0ZVtpXS5yZ2JCbHVlLCAxLCAxLCBoYW5kbGUpOworCQkJCQlnbG9iYWxwYWxldHRlW2ldLnJnYlJlc2VydmVkID0gMDsKKwkJCQkJaSsrOworCQkJCX0KKwkJCQlGcmVlSW1hZ2VfU2V0TWV0YWRhdGFFeChGSU1EX0FOSU1BVElPTiwgZGliLCAiR2xvYmFsUGFsZXR0ZSIsIEFOSU1UQUdfR0xPQkFMUEFMRVRURSwgRklEVF9QQUxFVFRFLCBpbmZvLT5nbG9iYWxfY29sb3JfdGFibGVfc2l6ZSwgaW5mby0+Z2xvYmFsX2NvbG9yX3RhYmxlX3NpemUgKiA0LCBnbG9iYWxwYWxldHRlKTsKKwkJCQkvL2JhY2tncm91bmQgY29sb3IKKwkJCQlpZiggaW5mby0+YmFja2dyb3VuZF9jb2xvciA8IGluZm8tPmdsb2JhbF9jb2xvcl90YWJsZV9zaXplICkgeworCQkJCQlGcmVlSW1hZ2VfU2V0QmFja2dyb3VuZENvbG9yKGRpYiwgJmdsb2JhbHBhbGV0dGVbaW5mby0+YmFja2dyb3VuZF9jb2xvcl0pOworCQkJCX0KKwkJCX0KKworCQkJLy9BcHBsaWNhdGlvbiBFeHRlbnNpb24KKwkJCUxPTkcgbG9vcCA9IDE7IC8vSWYgbm8gQUUgd2l0aCBhIGxvb3AgY291bnQgaXMgZm91bmQsIHRoZSBkZWZhdWx0IG11c3QgYmUgMQorCQkJZm9yKCBpZHggPSAwOyBpZHggPCBpbmZvLT5hcHBsaWNhdGlvbl9leHRlbnNpb25fb2Zmc2V0cy5zaXplKCk7IGlkeCsrICkgeworCQkJCWlvLT5zZWVrX3Byb2MoaGFuZGxlLCAobG9uZylpbmZvLT5hcHBsaWNhdGlvbl9leHRlbnNpb25fb2Zmc2V0c1tpZHhdLCBTRUVLX1NFVCk7CisJCQkJaW8tPnJlYWRfcHJvYygmYiwgMSwgMSwgaGFuZGxlKTsKKwkJCQlpZiggYiA9PSAxMSApIHsgLy9BbGwgQUVzIHN0YXJ0IHdpdGggYW4gMTEgYnl0ZSBzdWItYmxvY2sgdG8gZGV0ZXJtaW5lIHdoYXQgdHlwZSBvZiBBRSBpdCBpcworCQkJCQljaGFyIGJ1ZlsxMV07CisJCQkJCWlvLT5yZWFkX3Byb2MoYnVmLCAxMSwgMSwgaGFuZGxlKTsKKwkJCQkJaWYoICFtZW1jbXAoYnVmLCAiTkVUU0NBUEUyLjAiLCAxMSkgfHwgIW1lbWNtcChidWYsICJBTklNRVhUUzEuMCIsIDExKSApIHsgLy9Ob3QgZXZlcnlib2R5IHJlY29nbml6ZXMgQU5JTUVYVFMxLjAgYnV0IGl0IGlzIHZhbGlkCisJCQkJCQlpby0+cmVhZF9wcm9jKCZiLCAxLCAxLCBoYW5kbGUpOworCQkJCQkJaWYoIGIgPT0gMyApIHsgLy93ZSdyZSBzdXBwb3NlZCB0byBoYXZlIGEgMyBieXRlIHN1Yi1ibG9jayBub3cKKwkJCQkJCQlpby0+cmVhZF9wcm9jKCZiLCAxLCAxLCBoYW5kbGUpOyAvL3RoaXMgc2hvdWxkIGJlIDB4MDEgYnV0IGlzbid0IHJlYWxseSBpbXBvcnRhbnQKKwkJCQkJCQlpby0+cmVhZF9wcm9jKCZ3LCAyLCAxLCBoYW5kbGUpOworI2lmZGVmIEZSRUVJTUFHRV9CSUdFTkRJQU4KKwkJCQkJCQlTd2FwU2hvcnQoJncpOworI2VuZGlmCisJCQkJCQkJbG9vcCA9IHc7CisJCQkJCQkJaWYoIGxvb3AgPiAwICkgbG9vcCsrOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQkJRnJlZUltYWdlX1NldE1ldGFkYXRhRXgoRklNRF9BTklNQVRJT04sIGRpYiwgIkxvb3AiLCBBTklNVEFHX0xPT1AsIEZJRFRfTE9ORywgMSwgNCwgJmxvb3ApOworCisJCQkvL0NvbW1lbnQgRXh0ZW5zaW9uCisJCQlmb3IoIGlkeCA9IDA7IGlkeCA8IGluZm8tPmNvbW1lbnRfZXh0ZW5zaW9uX29mZnNldHMuc2l6ZSgpOyBpZHgrKyApIHsKKwkJCQlpby0+c2Vla19wcm9jKGhhbmRsZSwgKGxvbmcpaW5mby0+Y29tbWVudF9leHRlbnNpb25fb2Zmc2V0c1tpZHhdLCBTRUVLX1NFVCk7CisJCQkJc3RkOjpzdHJpbmcgY29tbWVudDsKKwkJCQljaGFyIGJ1ZlsyNTVdOworCQkJCWlvLT5yZWFkX3Byb2MoJmIsIDEsIDEsIGhhbmRsZSk7CisJCQkJd2hpbGUoIGIgKSB7CisJCQkJCWlvLT5yZWFkX3Byb2MoYnVmLCBiLCAxLCBoYW5kbGUpOworCQkJCQljb21tZW50LmFwcGVuZChidWYsIGIpOworCQkJCQlpby0+cmVhZF9wcm9jKCZiLCAxLCAxLCBoYW5kbGUpOworCQkJCX0KKwkJCQljb21tZW50LmFwcGVuZCgxLCAnXDAnKTsKKwkJCQlzcHJpbnRmKGJ1ZiwgIkNvbW1lbnQlZCIsIGlkeCk7CisJCQkJRFdPUkQgY29tbWVudF9zaXplID0gKERXT1JEKWNvbW1lbnQuc2l6ZSgpOworCQkJCUZyZWVJbWFnZV9TZXRNZXRhZGF0YUV4KEZJTURfQ09NTUVOVFMsIGRpYiwgYnVmLCAxLCBGSURUX0FTQ0lJLCBjb21tZW50X3NpemUsIGNvbW1lbnRfc2l6ZSwgY29tbWVudC5jX3N0cigpKTsKKwkJCX0KKwkJfQorCisJCS8vR3JhcGhpYyBDb250cm9sIEV4dGVuc2lvbgorCQlpZiggaW5mby0+Z3JhcGhpY19jb250cm9sX2V4dGVuc2lvbl9vZmZzZXRzW3BhZ2VdICE9IDAgKSB7CisJCQlpby0+c2Vla19wcm9jKGhhbmRsZSwgKGxvbmcpKGluZm8tPmdyYXBoaWNfY29udHJvbF9leHRlbnNpb25fb2Zmc2V0c1twYWdlXSArIDEpLCBTRUVLX1NFVCk7CisJCQlpby0+cmVhZF9wcm9jKCZwYWNrZWQsIDEsIDEsIGhhbmRsZSk7CisJCQlpby0+cmVhZF9wcm9jKCZ3LCAyLCAxLCBoYW5kbGUpOworI2lmZGVmIEZSRUVJTUFHRV9CSUdFTkRJQU4KKwkJCVN3YXBTaG9ydCgmdyk7CisjZW5kaWYKKwkJCWlvLT5yZWFkX3Byb2MoJmIsIDEsIDEsIGhhbmRsZSk7CisJCQloYXZlX3RyYW5zcGFyZW50ID0gKHBhY2tlZCAmIEdJRl9QQUNLRURfR0NFX0hBVkVUUkFOUykgPyB0cnVlIDogZmFsc2U7CisJCQlkaXNwb3NhbF9tZXRob2QgPSAocGFja2VkICYgR0lGX1BBQ0tFRF9HQ0VfRElTUE9TQUwpID4+IDI7CisJCQlkZWxheV90aW1lID0gdyAqIDEwOyAvL2NvbnZlcnQgY3MgdG8gbXMKKwkJCXRyYW5zcGFyZW50X2NvbG9yID0gYjsKKwkJCWlmKCBoYXZlX3RyYW5zcGFyZW50ICkgeworCQkJCWludCBzaXplID0gMSA8PCBicHA7CisJCQkJaWYoIHRyYW5zcGFyZW50X2NvbG9yIDw9IHNpemUgKSB7CisJCQkJCUJZVEUgdGFibGVbMjU2XTsKKwkJCQkJbWVtc2V0KHRhYmxlLCAweEZGLCBzaXplKTsKKwkJCQkJdGFibGVbdHJhbnNwYXJlbnRfY29sb3JdID0gMDsKKwkJCQkJRnJlZUltYWdlX1NldFRyYW5zcGFyZW5jeVRhYmxlKGRpYiwgdGFibGUsIHNpemUpOworCQkJCX0KKwkJCX0KKwkJfQorCQlGcmVlSW1hZ2VfU2V0TWV0YWRhdGFFeChGSU1EX0FOSU1BVElPTiwgZGliLCAiRnJhbWVUaW1lIiwgQU5JTVRBR19GUkFNRVRJTUUsIEZJRFRfTE9ORywgMSwgNCwgJmRlbGF5X3RpbWUpOworCQliID0gKEJZVEUpZGlzcG9zYWxfbWV0aG9kOworCQlGcmVlSW1hZ2VfU2V0TWV0YWRhdGFFeChGSU1EX0FOSU1BVElPTiwgZGliLCAiRGlzcG9zYWxNZXRob2QiLCBBTklNVEFHX0RJU1BPU0FMTUVUSE9ELCBGSURUX0JZVEUsIDEsIDEsICZiKTsKKworCQlkZWxldGUgc3RyaW5ndGFibGU7CisKKwl9IGNhdGNoIChjb25zdCBjaGFyICptc2cpIHsKKwkJaWYoIGRpYiAhPSBOVUxMICkgeworCQkJRnJlZUltYWdlX1VubG9hZChkaWIpOworCQl9CisJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhzX2Zvcm1hdF9pZCwgbXNnKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIGRpYjsKK30KKworc3RhdGljIEJPT0wgRExMX0NBTExDT05WIAorU2F2ZShGcmVlSW1hZ2VJTyAqaW8sIEZJQklUTUFQICpkaWIsIGZpX2hhbmRsZSBoYW5kbGUsIGludCBwYWdlLCBpbnQgZmxhZ3MsIHZvaWQgKmRhdGEpIHsKKwlpZiggZGF0YSA9PSBOVUxMICkgeworCQlyZXR1cm4gRkFMU0U7CisJfQorCS8vR0lGaW5mbyAqaW5mbyA9IChHSUZpbmZvICopZGF0YTsKKworCWlmKCBwYWdlID09IC0xICkgeworCQlwYWdlID0gMDsKKwl9CisKKwl0cnkgeworCQlCWVRFIHBhY2tlZCwgYjsKKwkJV09SRCB3OworCQlGSVRBRyAqdGFnOworCisJCWludCBicHAgPSBGcmVlSW1hZ2VfR2V0QlBQKGRpYik7CisJCWlmKCBicHAgIT0gMSAmJiBicHAgIT0gNCAmJiBicHAgIT0gOCApIHsKKwkJCXRocm93ICJPbmx5IDEsIDQsIG9yIDggYnBwIGltYWdlcyBzdXBwb3J0ZWQiOworCQl9CisKKwkJYm9vbCBoYXZlX3RyYW5zcGFyZW50ID0gZmFsc2UsIG5vX2xvY2FsX3BhbGV0dGUgPSBmYWxzZSwgaW50ZXJsYWNlZCA9IGZhbHNlOworCQlpbnQgZGlzcG9zYWxfbWV0aG9kID0gR0lGX0RJU1BPU0FMX0JBQ0tHUk9VTkQsIGRlbGF5X3RpbWUgPSAxMDAsIHRyYW5zcGFyZW50X2NvbG9yID0gMDsKKwkJV09SRCBsZWZ0ID0gMCwgdG9wID0gMCwgd2lkdGggPSAoV09SRClGcmVlSW1hZ2VfR2V0V2lkdGgoZGliKSwgaGVpZ2h0ID0gKFdPUkQpRnJlZUltYWdlX0dldEhlaWdodChkaWIpOworCQlXT1JEIG91dHB1dF9oZWlnaHQgPSBoZWlnaHQ7CisJCWlmKCBGcmVlSW1hZ2VfR2V0TWV0YWRhdGFFeChGSU1EX0FOSU1BVElPTiwgZGliLCAiRnJhbWVMZWZ0IiwgRklEVF9TSE9SVCwgJnRhZykgKSB7CisJCQlsZWZ0ID0gKihXT1JEICopRnJlZUltYWdlX0dldFRhZ1ZhbHVlKHRhZyk7CisJCX0KKwkJaWYoIEZyZWVJbWFnZV9HZXRNZXRhZGF0YUV4KEZJTURfQU5JTUFUSU9OLCBkaWIsICJGcmFtZVRvcCIsIEZJRFRfU0hPUlQsICZ0YWcpICkgeworCQkJdG9wID0gKihXT1JEICopRnJlZUltYWdlX0dldFRhZ1ZhbHVlKHRhZyk7CisJCX0KKwkJaWYoIEZyZWVJbWFnZV9HZXRNZXRhZGF0YUV4KEZJTURfQU5JTUFUSU9OLCBkaWIsICJOb0xvY2FsUGFsZXR0ZSIsIEZJRFRfQllURSwgJnRhZykgKSB7CisJCQlub19sb2NhbF9wYWxldHRlID0gKihCWVRFICopRnJlZUltYWdlX0dldFRhZ1ZhbHVlKHRhZykgPyB0cnVlIDogZmFsc2U7CisJCX0KKwkJaWYoIEZyZWVJbWFnZV9HZXRNZXRhZGF0YUV4KEZJTURfQU5JTUFUSU9OLCBkaWIsICJJbnRlcmxhY2VkIiwgRklEVF9CWVRFLCAmdGFnKSApIHsKKwkJCWludGVybGFjZWQgPSAqKEJZVEUgKilGcmVlSW1hZ2VfR2V0VGFnVmFsdWUodGFnKSA/IHRydWUgOiBmYWxzZTsKKwkJfQorCQlpZiggRnJlZUltYWdlX0dldE1ldGFkYXRhRXgoRklNRF9BTklNQVRJT04sIGRpYiwgIkZyYW1lVGltZSIsIEZJRFRfTE9ORywgJnRhZykgKSB7CisJCQlkZWxheV90aW1lID0gKihMT05HICopRnJlZUltYWdlX0dldFRhZ1ZhbHVlKHRhZyk7CisJCX0KKwkJaWYoIEZyZWVJbWFnZV9HZXRNZXRhZGF0YUV4KEZJTURfQU5JTUFUSU9OLCBkaWIsICJEaXNwb3NhbE1ldGhvZCIsIEZJRFRfQllURSwgJnRhZykgKSB7CisJCQlkaXNwb3NhbF9tZXRob2QgPSAqKEJZVEUgKilGcmVlSW1hZ2VfR2V0VGFnVmFsdWUodGFnKTsKKwkJfQorCisJCVJHQlFVQUQgKnBhbCA9IEZyZWVJbWFnZV9HZXRQYWxldHRlKGRpYik7CisjaWZkZWYgRlJFRUlNQUdFX0JJR0VORElBTgorCQlTd2FwU2hvcnQoJmxlZnQpOworCQlTd2FwU2hvcnQoJnRvcCk7CisJCVN3YXBTaG9ydCgmd2lkdGgpOworCQlTd2FwU2hvcnQoJmhlaWdodCk7CisjZW5kaWYKKworCQlpZiggcGFnZSA9PSAwICkgeworCQkJLy9nYXRoZXIgc29tZSBpbmZvCisJCQlXT1JEIGxvZ2ljYWx3aWR0aCA9IHdpZHRoOyAvLyB3aWR0aCBoYXMgYWxyZWFkeSBiZWVuIHN3YXBwZWQuLi4KKwkJCWlmKCBGcmVlSW1hZ2VfR2V0TWV0YWRhdGFFeChGSU1EX0FOSU1BVElPTiwgZGliLCAiTG9naWNhbFdpZHRoIiwgRklEVF9TSE9SVCwgJnRhZykgKSB7CisJCQkJbG9naWNhbHdpZHRoID0gKihXT1JEICopRnJlZUltYWdlX0dldFRhZ1ZhbHVlKHRhZyk7CisjaWZkZWYgRlJFRUlNQUdFX0JJR0VORElBTgorCQkJCVN3YXBTaG9ydCgmbG9naWNhbHdpZHRoKTsKKyNlbmRpZgorCQkJfQorCQkJV09SRCBsb2dpY2FsaGVpZ2h0ID0gaGVpZ2h0OyAvLyBoZWlnaHQgaGFzIGFscmVhZHkgYmVlbiBzd2FwcGVkLi4uCisJCQlpZiggRnJlZUltYWdlX0dldE1ldGFkYXRhRXgoRklNRF9BTklNQVRJT04sIGRpYiwgIkxvZ2ljYWxIZWlnaHQiLCBGSURUX1NIT1JULCAmdGFnKSApIHsKKwkJCQlsb2dpY2FsaGVpZ2h0ID0gKihXT1JEICopRnJlZUltYWdlX0dldFRhZ1ZhbHVlKHRhZyk7CisjaWZkZWYgRlJFRUlNQUdFX0JJR0VORElBTgorCQkJCVN3YXBTaG9ydCgmbG9naWNhbGhlaWdodCk7CisjZW5kaWYKKwkJCX0KKwkJCVJHQlFVQUQgKmdsb2JhbHBhbGV0dGUgPSBOVUxMOworCQkJaW50IGdsb2JhbHBhbGV0dGVfc2l6ZSA9IDA7CisJCQlpZiggRnJlZUltYWdlX0dldE1ldGFkYXRhRXgoRklNRF9BTklNQVRJT04sIGRpYiwgIkdsb2JhbFBhbGV0dGUiLCBGSURUX1BBTEVUVEUsICZ0YWcpICkgeworCQkJCWdsb2JhbHBhbGV0dGVfc2l6ZSA9IEZyZWVJbWFnZV9HZXRUYWdDb3VudCh0YWcpOworCQkJCWlmKCBnbG9iYWxwYWxldHRlX3NpemUgPj0gMiApIHsKKwkJCQkJZ2xvYmFscGFsZXR0ZSA9IChSR0JRVUFEICopRnJlZUltYWdlX0dldFRhZ1ZhbHVlKHRhZyk7CisJCQkJfQorCQkJfQorCisJCQkvL0xvZ2ljYWwgU2NyZWVuIERlc2NyaXB0b3IKKwkJCWlvLT53cml0ZV9wcm9jKCZsb2dpY2Fsd2lkdGgsIDIsIDEsIGhhbmRsZSk7CisJCQlpby0+d3JpdGVfcHJvYygmbG9naWNhbGhlaWdodCwgMiwgMSwgaGFuZGxlKTsKKwkJCXBhY2tlZCA9IEdJRl9QQUNLRURfTFNEX0NPTE9SUkVTOworCQkJYiA9IDA7CisJCQlSR0JRVUFEIGJhY2tncm91bmRfY29sb3I7CisJCQlpZiggZ2xvYmFscGFsZXR0ZSAhPSBOVUxMICkgeworCQkJCXBhY2tlZCB8PSBHSUZfUEFDS0VEX0xTRF9IQVZFR0NUOworCQkJCWlmKCBnbG9iYWxwYWxldHRlX3NpemUgPCA0ICkgeworCQkJCQlnbG9iYWxwYWxldHRlX3NpemUgPSAyOworCQkJCQlwYWNrZWQgfD0gMCAmIEdJRl9QQUNLRURfTFNEX0dDVFNJWkU7CisJCQkJfSBlbHNlIGlmKCBnbG9iYWxwYWxldHRlX3NpemUgPCA4ICkgeworCQkJCQlnbG9iYWxwYWxldHRlX3NpemUgPSA0OworCQkJCQlwYWNrZWQgfD0gMSAmIEdJRl9QQUNLRURfTFNEX0dDVFNJWkU7CisJCQkJfSBlbHNlIGlmKCBnbG9iYWxwYWxldHRlX3NpemUgPCAxNiApIHsKKwkJCQkJZ2xvYmFscGFsZXR0ZV9zaXplID0gODsKKwkJCQkJcGFja2VkIHw9IDIgJiBHSUZfUEFDS0VEX0xTRF9HQ1RTSVpFOworCQkJCX0gZWxzZSBpZiggZ2xvYmFscGFsZXR0ZV9zaXplIDwgMzIgKSB7CisJCQkJCWdsb2JhbHBhbGV0dGVfc2l6ZSA9IDE2OworCQkJCQlwYWNrZWQgfD0gMyAmIEdJRl9QQUNLRURfTFNEX0dDVFNJWkU7CisJCQkJfSBlbHNlIGlmKCBnbG9iYWxwYWxldHRlX3NpemUgPCA2NCApIHsKKwkJCQkJZ2xvYmFscGFsZXR0ZV9zaXplID0gMzI7CisJCQkJCXBhY2tlZCB8PSA0ICYgR0lGX1BBQ0tFRF9MU0RfR0NUU0laRTsKKwkJCQl9IGVsc2UgaWYoIGdsb2JhbHBhbGV0dGVfc2l6ZSA8IDEyOCApIHsKKwkJCQkJZ2xvYmFscGFsZXR0ZV9zaXplID0gNjQ7CisJCQkJCXBhY2tlZCB8PSA1ICYgR0lGX1BBQ0tFRF9MU0RfR0NUU0laRTsKKwkJCQl9IGVsc2UgaWYoIGdsb2JhbHBhbGV0dGVfc2l6ZSA8IDI1NiApIHsKKwkJCQkJZ2xvYmFscGFsZXR0ZV9zaXplID0gMTI4OworCQkJCQlwYWNrZWQgfD0gNiAmIEdJRl9QQUNLRURfTFNEX0dDVFNJWkU7CisJCQkJfSBlbHNlIHsKKwkJCQkJZ2xvYmFscGFsZXR0ZV9zaXplID0gMjU2OworCQkJCQlwYWNrZWQgfD0gNyAmIEdJRl9QQUNLRURfTFNEX0dDVFNJWkU7CisJCQkJfQorCQkJCWlmKCBGcmVlSW1hZ2VfR2V0QmFja2dyb3VuZENvbG9yKGRpYiwgJmJhY2tncm91bmRfY29sb3IpICkgeworCQkJCQlmb3IoIGludCBpID0gMDsgaSA8IGdsb2JhbHBhbGV0dGVfc2l6ZTsgaSsrICkgeworCQkJCQkJaWYoIGJhY2tncm91bmRfY29sb3IucmdiUmVkID09IGdsb2JhbHBhbGV0dGVbaV0ucmdiUmVkICYmCisJCQkJCQkJYmFja2dyb3VuZF9jb2xvci5yZ2JHcmVlbiA9PSBnbG9iYWxwYWxldHRlW2ldLnJnYkdyZWVuICYmCisJCQkJCQkJYmFja2dyb3VuZF9jb2xvci5yZ2JCbHVlID09IGdsb2JhbHBhbGV0dGVbaV0ucmdiQmx1ZSApIHsKKworCQkJCQkJCWIgPSAoQllURSlpOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlwYWNrZWQgfD0gKGJwcCAtIDEpICYgR0lGX1BBQ0tFRF9MU0RfR0NUU0laRTsKKwkJCX0KKwkJCWlvLT53cml0ZV9wcm9jKCZwYWNrZWQsIDEsIDEsIGhhbmRsZSk7CisJCQlpby0+d3JpdGVfcHJvYygmYiwgMSwgMSwgaGFuZGxlKTsKKwkJCWIgPSAwOworCQkJaW8tPndyaXRlX3Byb2MoJmIsIDEsIDEsIGhhbmRsZSk7CisKKwkJCS8vR2xvYmFsIENvbG9yIFRhYmxlCisJCQlpZiggZ2xvYmFscGFsZXR0ZSAhPSBOVUxMICkgeworCQkJCWludCBpID0gMDsKKwkJCQl3aGlsZSggaSA8IGdsb2JhbHBhbGV0dGVfc2l6ZSApIHsKKwkJCQkJaW8tPndyaXRlX3Byb2MoJmdsb2JhbHBhbGV0dGVbaV0ucmdiUmVkLCAxLCAxLCBoYW5kbGUpOworCQkJCQlpby0+d3JpdGVfcHJvYygmZ2xvYmFscGFsZXR0ZVtpXS5yZ2JHcmVlbiwgMSwgMSwgaGFuZGxlKTsKKwkJCQkJaW8tPndyaXRlX3Byb2MoJmdsb2JhbHBhbGV0dGVbaV0ucmdiQmx1ZSwgMSwgMSwgaGFuZGxlKTsKKwkJCQkJaSsrOworCQkJCX0KKwkJCX0KKworCQkJLy9BcHBsaWNhdGlvbiBFeHRlbnNpb24KKwkJCUxPTkcgbG9vcCA9IDA7CisJCQlpZiggRnJlZUltYWdlX0dldE1ldGFkYXRhRXgoRklNRF9BTklNQVRJT04sIGRpYiwgIkxvb3AiLCBGSURUX0xPTkcsICZ0YWcpICkgeworCQkJCWxvb3AgPSAqKExPTkcgKilGcmVlSW1hZ2VfR2V0VGFnVmFsdWUodGFnKTsKKwkJCX0KKwkJCWlmKCBsb29wICE9IDEgKSB7CisJCQkJLy90aGUgTmV0c2NhcGUgZXh0ZW5zaW9uIGlzIHJlYWxseSAicmVwZWF0cyIgbm90ICJsb29wcyIKKwkJCQlpZiggbG9vcCA+IDEgKSBsb29wLS07CisJCQkJaWYoIGxvb3AgPiAweEZGRkYgKSBsb29wID0gMHhGRkZGOworCQkJCXcgPSAoV09SRClsb29wOworI2lmZGVmIEZSRUVJTUFHRV9CSUdFTkRJQU4KKwkJCQlTd2FwU2hvcnQoJncpOworI2VuZGlmCisJCQkJaW8tPndyaXRlX3Byb2MoKHZvaWQgKikiXHgyMVx4RkZceDBCTkVUU0NBUEUyLjBceDAzXHgwMSIsIDE2LCAxLCBoYW5kbGUpOworCQkJCWlvLT53cml0ZV9wcm9jKCZ3LCAyLCAxLCBoYW5kbGUpOworCQkJCWIgPSAwOworCQkJCWlvLT53cml0ZV9wcm9jKCZiLCAxLCAxLCBoYW5kbGUpOworCQkJfQorCisJCQkvL0NvbW1lbnQgRXh0ZW5zaW9uCisJCQlGSU1FVEFEQVRBICptZGhhbmRsZSA9IE5VTEw7CisJCQlGSVRBRyAqdGFnID0gTlVMTDsKKwkJCW1kaGFuZGxlID0gRnJlZUltYWdlX0ZpbmRGaXJzdE1ldGFkYXRhKEZJTURfQ09NTUVOVFMsIGRpYiwgJnRhZyk7CisJCQlpZiggbWRoYW5kbGUgKSB7CisJCQkJZG8geworCQkJCQlpZiggRnJlZUltYWdlX0dldFRhZ1R5cGUodGFnKSA9PSBGSURUX0FTQ0lJICkgeworCQkJCQkJaW50IGxlbmd0aCA9IEZyZWVJbWFnZV9HZXRUYWdMZW5ndGgodGFnKSAtIDE7CisJCQkJCQljaGFyICp2YWx1ZSA9IChjaGFyICopRnJlZUltYWdlX0dldFRhZ1ZhbHVlKHRhZyk7CisJCQkJCQlpby0+d3JpdGVfcHJvYygodm9pZCAqKSJceDIxXHhGRSIsIDIsIDEsIGhhbmRsZSk7CisJCQkJCQl3aGlsZSggbGVuZ3RoID4gMCApIHsKKwkJCQkJCQliID0gKEJZVEUpKGxlbmd0aCA+PSAyNTUgPyAyNTUgOiBsZW5ndGgpOworCQkJCQkJCWlvLT53cml0ZV9wcm9jKCZiLCAxLCAxLCBoYW5kbGUpOworCQkJCQkJCWlvLT53cml0ZV9wcm9jKHZhbHVlLCBiLCAxLCBoYW5kbGUpOworCQkJCQkJCXZhbHVlICs9IGI7CisJCQkJCQkJbGVuZ3RoIC09IGI7CisJCQkJCQl9CisJCQkJCQliID0gMDsKKwkJCQkJCWlvLT53cml0ZV9wcm9jKCZiLCAxLCAxLCBoYW5kbGUpOworCQkJCQl9CisJCQkJfSB3aGlsZShGcmVlSW1hZ2VfRmluZE5leHRNZXRhZGF0YShtZGhhbmRsZSwgJnRhZykpOworCisJCQkJRnJlZUltYWdlX0ZpbmRDbG9zZU1ldGFkYXRhKG1kaGFuZGxlKTsKKwkJCX0KKwkJfQorCisJCS8vR3JhcGhpYyBDb250cm9sIEV4dGVuc2lvbgorCQlpZiggRnJlZUltYWdlX0lzVHJhbnNwYXJlbnQoZGliKSApIHsKKwkJCWludCBjb3VudCA9IEZyZWVJbWFnZV9HZXRUcmFuc3BhcmVuY3lDb3VudChkaWIpOworCQkJQllURSAqdGFibGUgPSBGcmVlSW1hZ2VfR2V0VHJhbnNwYXJlbmN5VGFibGUoZGliKTsKKwkJCWZvciggaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKyApIHsKKwkJCQlpZiggdGFibGVbaV0gPT0gMCApIHsKKwkJCQkJaGF2ZV90cmFuc3BhcmVudCA9IHRydWU7CisJCQkJCXRyYW5zcGFyZW50X2NvbG9yID0gaTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJCWlvLT53cml0ZV9wcm9jKCh2b2lkICopIlx4MjFceEY5XHgwNCIsIDMsIDEsIGhhbmRsZSk7CisJCWIgPSAoQllURSkoKGRpc3Bvc2FsX21ldGhvZCA8PCAyKSAmIEdJRl9QQUNLRURfR0NFX0RJU1BPU0FMKTsKKwkJaWYoIGhhdmVfdHJhbnNwYXJlbnQgKSBiIHw9IEdJRl9QQUNLRURfR0NFX0hBVkVUUkFOUzsKKwkJaW8tPndyaXRlX3Byb2MoJmIsIDEsIDEsIGhhbmRsZSk7CisJCS8vTm90ZXMgYWJvdXQgZGVsYXkgdGltZSBmb3IgR0lGczoKKwkJLy9JRTUvSUU2IGhhdmUgYSBtaW5pbXVtIGFuZCBkZWZhdWx0IG9mIDEwMG1zCisJCS8vTW96aWxsYS9GaXJlZm94L05ldHNjYXBlIDYrL09wZXJhIGhhdmUgYSBtaW5pbXVtIG9mIDIwbXMgYW5kIGEgZGVmYXVsdCBvZiAxMDBtcyBpZiA8MjBtcyBpcyBzcGVjaWZpZWQgb3IgdGhlIEdDRSBpcyBhYnNlbnQKKwkJLy9OZXRzY2FwZSA0IGhhcyBhIG1pbmltdW0gb2YgMTBtcyBpZiAwbXMgaXMgc3BlY2lmaWVkLCBidXQgd2lsbCB1c2UgMG1zIGlmIHRoZSBHQ0UgaXMgYWJzZW50CisJCXcgPSAoV09SRCkoZGVsYXlfdGltZSAvIDEwKTsgLy9jb252ZXJ0IG1zIHRvIGNzCisjaWZkZWYgRlJFRUlNQUdFX0JJR0VORElBTgorCQlTd2FwU2hvcnQoJncpOworI2VuZGlmCisJCWlvLT53cml0ZV9wcm9jKCZ3LCAyLCAxLCBoYW5kbGUpOworCQliID0gKEJZVEUpdHJhbnNwYXJlbnRfY29sb3I7CisJCWlvLT53cml0ZV9wcm9jKCZiLCAxLCAxLCBoYW5kbGUpOworCQliID0gMDsKKwkJaW8tPndyaXRlX3Byb2MoJmIsIDEsIDEsIGhhbmRsZSk7CisKKwkJLy9JbWFnZSBEZXNjcmlwdG9yCisJCWIgPSBHSUZfQkxPQ0tfSU1BR0VfREVTQ1JJUFRPUjsKKwkJaW8tPndyaXRlX3Byb2MoJmIsIDEsIDEsIGhhbmRsZSk7CisJCWlvLT53cml0ZV9wcm9jKCZsZWZ0LCAyLCAxLCBoYW5kbGUpOworCQlpby0+d3JpdGVfcHJvYygmdG9wLCAyLCAxLCBoYW5kbGUpOworCQlpby0+d3JpdGVfcHJvYygmd2lkdGgsIDIsIDEsIGhhbmRsZSk7CisJCWlvLT53cml0ZV9wcm9jKCZoZWlnaHQsIDIsIDEsIGhhbmRsZSk7CisJCXBhY2tlZCA9IDA7CisJCWlmKCAhbm9fbG9jYWxfcGFsZXR0ZSApIHBhY2tlZCB8PSBHSUZfUEFDS0VEX0lEX0hBVkVMQ1QgfCAoKGJwcCAtIDEpICYgR0lGX1BBQ0tFRF9JRF9MQ1RTSVpFKTsKKwkJaWYoIGludGVybGFjZWQgKSBwYWNrZWQgfD0gR0lGX1BBQ0tFRF9JRF9JTlRFUkxBQ0VEOworCQlpby0+d3JpdGVfcHJvYygmcGFja2VkLCAxLCAxLCBoYW5kbGUpOworCisJCS8vTG9jYWwgQ29sb3IgVGFibGUKKwkJaWYoICFub19sb2NhbF9wYWxldHRlICkgeworCQkJaW50IHBhbHNpemUgPSAxIDw8IGJwcDsKKwkJCWZvciggaW50IGkgPSAwOyBpIDwgcGFsc2l6ZTsgaSsrICkgeworCQkJCWlvLT53cml0ZV9wcm9jKCZwYWxbaV0ucmdiUmVkLCAxLCAxLCBoYW5kbGUpOworCQkJCWlvLT53cml0ZV9wcm9jKCZwYWxbaV0ucmdiR3JlZW4sIDEsIDEsIGhhbmRsZSk7CisJCQkJaW8tPndyaXRlX3Byb2MoJnBhbFtpXS5yZ2JCbHVlLCAxLCAxLCBoYW5kbGUpOworCQkJfQorCQl9CisKKworCQkvL0xaVyBNaW5pbXVtIENvZGUgU2l6ZQorCQliID0gKEJZVEUpKGJwcCA9PSAxID8gMiA6IGJwcCk7CisJCWlvLT53cml0ZV9wcm9jKCZiLCAxLCAxLCBoYW5kbGUpOworCQlTdHJpbmdUYWJsZSAqc3RyaW5ndGFibGUgPSBuZXcoc3RkOjpub3Rocm93KSBTdHJpbmdUYWJsZTsKKwkJc3RyaW5ndGFibGUtPkluaXRpYWxpemUoYik7CisJCXN0cmluZ3RhYmxlLT5Db21wcmVzc1N0YXJ0KGJwcCwgd2lkdGgpOworCisJCS8vSW1hZ2UgRGF0YSBTdWItYmxvY2tzCisJCWludCB5ID0gMCwgaW50ZXJsYWNlcGFzcyA9IDAsIGxpbmUgPSBGcmVlSW1hZ2VfR2V0TGluZShkaWIpOworCQlCWVRFIGJ1ZlsyNTVdLCAqYnVmcHRyID0gYnVmOyAvLzI1NSBpcyB0aGUgbWF4IHN1Yi1ibG9jayBsZW5ndGgKKwkJaW50IHNpemUgPSBzaXplb2YoYnVmKTsKKwkJYiA9IHNpemVvZihidWYpOworCQl3aGlsZSggeSA8IG91dHB1dF9oZWlnaHQgKSB7CisJCQltZW1jcHkoc3RyaW5ndGFibGUtPkZpbGxJbnB1dEJ1ZmZlcihsaW5lKSwgRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgb3V0cHV0X2hlaWdodCAtIHkgLSAxKSwgbGluZSk7CisJCQl3aGlsZSggc3RyaW5ndGFibGUtPkNvbXByZXNzKGJ1ZnB0ciwgJnNpemUpICkgeworCQkJCWJ1ZnB0ciArPSBzaXplOworCQkJCWlmKCBidWZwdHIgLSBidWYgPT0gc2l6ZW9mKGJ1ZikgKSB7CisJCQkJCWlvLT53cml0ZV9wcm9jKCZiLCAxLCAxLCBoYW5kbGUpOworCQkJCQlpby0+d3JpdGVfcHJvYyhidWYsIHNpemVvZihidWYpLCAxLCBoYW5kbGUpOworCQkJCQlzaXplID0gc2l6ZW9mKGJ1Zik7CisJCQkJCWJ1ZnB0ciA9IGJ1ZjsKKwkJCQl9IGVsc2UgeworCQkJCQlzaXplID0gKGludCkoc2l6ZW9mKGJ1ZikgLSAoYnVmcHRyIC0gYnVmKSk7CisJCQkJfQorCQkJfQorCQkJaWYoIGludGVybGFjZWQgKSB7CisJCQkJeSArPSBnX0dpZkludGVybGFjZUluY3JlbWVudFtpbnRlcmxhY2VwYXNzXTsKKwkJCQlpZiggeSA+PSBvdXRwdXRfaGVpZ2h0ICYmICsraW50ZXJsYWNlcGFzcyA8IEdJRl9JTlRFUkxBQ0VfUEFTU0VTICkgeworCQkJCQl5ID0gZ19HaWZJbnRlcmxhY2VPZmZzZXRbaW50ZXJsYWNlcGFzc107CisJCQkJfQkJCisJCQl9IGVsc2UgeworCQkJCXkrKzsKKwkJCX0KKwkJfQorCQlzaXplID0gKGludCkoYnVmcHRyIC0gYnVmKTsKKwkJQllURSBsYXN0WzRdOworCQl3ID0gKFdPUkQpc3RyaW5ndGFibGUtPkNvbXByZXNzRW5kKGxhc3QpOworCQlpZiggc2l6ZSArIHcgPj0gc2l6ZW9mKGJ1ZikgKSB7CisJCQkvL29uZSBsYXN0IGZ1bGwgc2l6ZSBzdWItYmxvY2sKKwkJCWlvLT53cml0ZV9wcm9jKCZiLCAxLCAxLCBoYW5kbGUpOworCQkJaW8tPndyaXRlX3Byb2MoYnVmLCBzaXplLCAxLCBoYW5kbGUpOworCQkJaW8tPndyaXRlX3Byb2MobGFzdCwgc2l6ZW9mKGJ1ZikgLSBzaXplLCAxLCBoYW5kbGUpOworCQkJLy9hbmQgcG9zc2libHkgYSB0aW55IGFkZGl0aW9uYWwgc3ViLWJsb2NrCisJCQliID0gKEJZVEUpKHcgLSAoc2l6ZW9mKGJ1ZikgLSBzaXplKSk7CisJCQlpZiggYiA+IDAgKSB7CisJCQkJaW8tPndyaXRlX3Byb2MoJmIsIDEsIDEsIGhhbmRsZSk7CisJCQkJaW8tPndyaXRlX3Byb2MobGFzdCArIHcgLSBiLCBiLCAxLCBoYW5kbGUpOworCQkJfQorCQl9IGVsc2UgeworCQkJLy9sYXN0IHN1Yi1ibG9jayBsZXNzIHRoYW4gZnVsbCBzaXplCisJCQliID0gKEJZVEUpKHNpemUgKyB3KTsKKwkJCWlvLT53cml0ZV9wcm9jKCZiLCAxLCAxLCBoYW5kbGUpOworCQkJaW8tPndyaXRlX3Byb2MoYnVmLCBzaXplLCAxLCBoYW5kbGUpOworCQkJaW8tPndyaXRlX3Byb2MobGFzdCwgdywgMSwgaGFuZGxlKTsKKwkJfQorCisJCS8vQmxvY2sgVGVybWluYXRvcgorCQliID0gMDsKKwkJaW8tPndyaXRlX3Byb2MoJmIsIDEsIDEsIGhhbmRsZSk7CisKKwkJZGVsZXRlIHN0cmluZ3RhYmxlOworCisJfSBjYXRjaCAoY29uc3QgY2hhciAqbXNnKSB7CisJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhzX2Zvcm1hdF9pZCwgbXNnKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCXJldHVybiBUUlVFOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgIEluaXQKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwordm9pZCBETExfQ0FMTENPTlYgCitJbml0R0lGKFBsdWdpbiAqcGx1Z2luLCBpbnQgZm9ybWF0X2lkKSB7CisJc19mb3JtYXRfaWQgPSBmb3JtYXRfaWQ7CisKKwlwbHVnaW4tPmZvcm1hdF9wcm9jID0gRm9ybWF0OworCXBsdWdpbi0+ZGVzY3JpcHRpb25fcHJvYyA9IERlc2NyaXB0aW9uOworCXBsdWdpbi0+ZXh0ZW5zaW9uX3Byb2MgPSBFeHRlbnNpb247CisJcGx1Z2luLT5yZWdleHByX3Byb2MgPSBSZWdFeHByOworCXBsdWdpbi0+b3Blbl9wcm9jID0gT3BlbjsKKwlwbHVnaW4tPmNsb3NlX3Byb2MgPSBDbG9zZTsKKwlwbHVnaW4tPnBhZ2Vjb3VudF9wcm9jID0gUGFnZUNvdW50OworCXBsdWdpbi0+cGFnZWNhcGFiaWxpdHlfcHJvYyA9IE5VTEw7CisJcGx1Z2luLT5sb2FkX3Byb2MgPSBMb2FkOworCXBsdWdpbi0+c2F2ZV9wcm9jID0gU2F2ZTsKKwlwbHVnaW4tPnZhbGlkYXRlX3Byb2MgPSBWYWxpZGF0ZTsKKwlwbHVnaW4tPm1pbWVfcHJvYyA9IE1pbWVUeXBlOworCXBsdWdpbi0+c3VwcG9ydHNfZXhwb3J0X2JwcF9wcm9jID0gU3VwcG9ydHNFeHBvcnREZXB0aDsKKwlwbHVnaW4tPnN1cHBvcnRzX2V4cG9ydF90eXBlX3Byb2MgPSBTdXBwb3J0c0V4cG9ydFR5cGU7CisJcGx1Z2luLT5zdXBwb3J0c19pY2NfcHJvZmlsZXNfcHJvYyA9IE5VTEw7Cit9CmRpZmYgLS1naXQgYS9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL1BsdWdpbkhEUi5jcHAgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL1BsdWdpbkhEUi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc4ZjRmZgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvUGx1Z2luSERSLmNwcApAQCAtMCwwICsxLDcyMyBAQAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gSERSIExvYWRlciBhbmQgd3JpdGVyCisvLworLy8gRGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBieSAKKy8vIC0gSGVydukgRHJvbG9uIChkcm9sb25AaW5mb25pZS5mcikKKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBGcmVlSW1hZ2UgMworLy8KKy8vIENPVkVSRUQgQ09ERSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWQorLy8gT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMKKy8vIFRIQVQgVEhFIENPVkVSRUQgQ09ERSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLy8gT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQKKy8vIENPREUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkgQ09WRVJFRCBDT0RFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QKKy8vIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZCisvLyBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMCisvLyBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GIEFOWSBDT1ZFUkVEIENPREUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSCisvLyBUSElTIERJU0NMQUlNRVIuCisvLworLy8gVXNlIGF0IHlvdXIgb3duIHJpc2shCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpbmNsdWRlIDxjbWF0aD4KKyNpbmNsdWRlICJGcmVlSW1hZ2UuaCIKKyNpbmNsdWRlICJVdGlsaXRpZXMuaCIKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gUGx1Z2luIEludGVyZmFjZQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitzdGF0aWMgaW50IHNfZm9ybWF0X2lkOworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBSR0JFIGxpYnJhcnkKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBtYXhpbXVtIHNpemUgb2YgYSBsaW5lIGluIHRoZSBoZWFkZXIKKyNkZWZpbmUgSERSX01BWExJTkUJMjU2CisKKy8vIGZsYWdzIGluZGljYXRpbmcgd2hpY2ggZmllbGRzIGluIGFuIHJnYmVIZWFkZXJJbmZvIGFyZSB2YWxpZAorI2RlZmluZSBSR0JFX1ZBTElEX1BST0dSQU1UWVBFCTB4MDEKKyNkZWZpbmUgUkdCRV9WQUxJRF9DT01NRU5UCQkweDAyCisjZGVmaW5lIFJHQkVfVkFMSURfR0FNTUEJCTB4MDQKKyNkZWZpbmUgUkdCRV9WQUxJRF9FWFBPU1VSRQkJMHgwOAorCisvLyBvZmZzZXRzIHRvIHJlZCwgZ3JlZW4sIGFuZCBibHVlIGNvbXBvbmVudHMgaW4gYSBkYXRhIChmbG9hdCkgcGl4ZWwKKyNkZWZpbmUgUkdCRV9EQVRBX1JFRCAgICAwCisjZGVmaW5lIFJHQkVfREFUQV9HUkVFTiAgMQorI2RlZmluZSBSR0JFX0RBVEFfQkxVRSAgIDIKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmZGVmIF9XSU4zMgorI3ByYWdtYSBwYWNrKHB1c2gsIDEpCisjZWxzZQorI3ByYWdtYSBwYWNrKDEpCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgdGFnSGVhZGVySW5mbyB7CisJaW50IHZhbGlkOwkJCQkJLy8gaW5kaWNhdGUgd2hpY2ggZmllbGRzIGFyZSB2YWxpZAorCWNoYXIgcHJvZ3JhbXR5cGVbMTZdOwkJLy8gbGlzdGVkIGF0IGJlZ2lubmluZyBvZiBmaWxlIHRvIGlkZW50aWZ5IGl0IGFmdGVyICIjPyIuIGRlZmF1bHRzIHRvICJSR0JFIgorCWNoYXIgY29tbWVudFtIRFJfTUFYTElORV07CS8vIGNvbW1lbnQgYmVnaW5uaW5nIHdpdGggIiMgIiAKKwlmbG9hdCBnYW1tYTsJCQkJLy8gaW1hZ2UgaGFzIGFscmVhZHkgYmVlbiBnYW1tYSBjb3JyZWN0ZWQgd2l0aCBnaXZlbiBnYW1tYS4gZGVmYXVsdHMgdG8gMS4wIChubyBjb3JyZWN0aW9uKQorCWZsb2F0IGV4cG9zdXJlOwkJCQkvLyBhIHZhbHVlIG9mIDEuMCBpbiBhbiBpbWFnZSBjb3JyZXNwb25kcyB0byA8ZXhwb3N1cmU+IHdhdHRzL3N0ZXJhZGlhbi9tXjIuIGRlZmF1bHRzIHRvIDEuMAorfSByZ2JlSGVhZGVySW5mbzsKKworI2lmZGVmIF9XSU4zMgorI3ByYWdtYSBwYWNrKHBvcCkKKyNlbHNlCisjcHJhZ21hIHBhY2soKQorI2VuZGlmCisKK3R5cGVkZWYgZW51bSB7CisJcmdiZV9yZWFkX2Vycm9yLAorCXJnYmVfd3JpdGVfZXJyb3IsCisJcmdiZV9mb3JtYXRfZXJyb3IsCisJcmdiZV9tZW1vcnlfZXJyb3IKK30gcmdiZV9lcnJvcl9jb2RlOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQcm90b3R5cGVzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBCT09MIHJnYmVfRXJyb3IocmdiZV9lcnJvcl9jb2RlIGVycm9yX2NvZGUsIGNvbnN0IGNoYXIgKm1zZyk7CitzdGF0aWMgQk9PTCByZ2JlX0dldExpbmUoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBjaGFyICpidWZmZXIsIGludCBsZW5ndGgpOworc3RhdGljIGlubGluZSB2b2lkIHJnYmVfRmxvYXRUb1JHQkUoQllURSByZ2JlWzRdLCBGSVJHQkYgKnJnYmYpOworc3RhdGljIGlubGluZSB2b2lkIHJnYmVfUkdCRVRvRmxvYXQoRklSR0JGICpyZ2JmLCBCWVRFIHJnYmVbNF0pOworc3RhdGljIEJPT0wgcmdiZV9SZWFkSGVhZGVyKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSwgdW5zaWduZWQgKndpZHRoLCB1bnNpZ25lZCAqaGVpZ2h0LCByZ2JlSGVhZGVySW5mbyAqaGVhZGVyX2luZm8pOworc3RhdGljIEJPT0wgcmdiZV9Xcml0ZUhlYWRlcihGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIHVuc2lnbmVkIHdpZHRoLCB1bnNpZ25lZCBoZWlnaHQsIHJnYmVIZWFkZXJJbmZvICppbmZvKTsKK3N0YXRpYyBCT09MIHJnYmVfUmVhZFBpeGVscyhGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIEZJUkdCRiAqZGF0YSwgdW5zaWduZWQgbnVtcGl4ZWxzKTsKK3N0YXRpYyBCT09MIHJnYmVfV3JpdGVQaXhlbHMoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBGSVJHQkYgKmRhdGEsIHVuc2lnbmVkIG51bXBpeGVscyk7CitzdGF0aWMgQk9PTCByZ2JlX1JlYWRQaXhlbHNfUkxFKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSwgRklSR0JGICpkYXRhLCBpbnQgc2NhbmxpbmVfd2lkdGgsIHVuc2lnbmVkIG51bV9zY2FubGluZXMpOworc3RhdGljIEJPT0wgcmdiZV9Xcml0ZUJ5dGVzX1JMRShGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIEJZVEUgKmRhdGEsIGludCBudW1ieXRlcyk7CitzdGF0aWMgQk9PTCByZ2JlX1dyaXRlUGl4ZWxzX1JMRShGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIEZJUkdCRiAqZGF0YSwgdW5zaWduZWQgc2NhbmxpbmVfd2lkdGgsIHVuc2lnbmVkIG51bV9zY2FubGluZXMpOworc3RhdGljIEJPT0wgcmdiZV9SZWFkTWV0YWRhdGEoRklCSVRNQVAgKmRpYiwgcmdiZUhlYWRlckluZm8gKmhlYWRlcl9pbmZvKTsKK3N0YXRpYyBCT09MIHJnYmVfV3JpdGVNZXRhZGF0YShGSUJJVE1BUCAqZGliLCByZ2JlSGVhZGVySW5mbyAqaGVhZGVyX2luZm8pOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qKgorRGVmYXVsdCBlcnJvciByb3V0aW5lLiAgY2hhbmdlIHRoaXMgdG8gY2hhbmdlIGVycm9yIGhhbmRsaW5nIAorKi8KK3N0YXRpYyBCT09MICAKK3JnYmVfRXJyb3IocmdiZV9lcnJvcl9jb2RlIGVycm9yX2NvZGUsIGNvbnN0IGNoYXIgKm1zZykgeworCXN3aXRjaCAoZXJyb3JfY29kZSkgeworCQljYXNlIHJnYmVfcmVhZF9lcnJvcjoKKwkJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhzX2Zvcm1hdF9pZCwgIlJHQkUgcmVhZCBlcnJvciIpOworCQkJYnJlYWs7CisJCWNhc2UgcmdiZV93cml0ZV9lcnJvcjoKKwkJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhzX2Zvcm1hdF9pZCwgIlJHQkUgd3JpdGUgZXJyb3IiKTsKKwkJCWJyZWFrOworCQljYXNlIHJnYmVfZm9ybWF0X2Vycm9yOgorCQkJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKHNfZm9ybWF0X2lkLCAiUkdCRSBiYWQgZmlsZSBmb3JtYXQ6ICVzXG4iLCBtc2cpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCWNhc2UgcmdiZV9tZW1vcnlfZXJyb3I6CisJCQlGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2Moc19mb3JtYXRfaWQsICJSR0JFIGVycm9yOiAlc1xuIixtc2cpOworCX0KKworCXJldHVybiBGQUxTRTsKK30KKworLyoqCitHZXQgYSBsaW5lIGZyb20gYSBBU0NJSSBpbyBzdHJlYW0KKyovCitzdGF0aWMgQk9PTCAKK3JnYmVfR2V0TGluZShGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIGNoYXIgKmJ1ZmZlciwgaW50IGxlbmd0aCkgeworCWludCBpOworCW1lbXNldChidWZmZXIsIDAsIGxlbmd0aCk7CisJZm9yKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJaWYoIWlvLT5yZWFkX3Byb2MoJmJ1ZmZlcltpXSwgMSwgMSwgaGFuZGxlKSkKKwkJCXJldHVybiBGQUxTRTsKKwkJaWYoYnVmZmVyW2ldID09IDB4MEEpCisJCQlicmVhazsKKwl9CisJCisJcmV0dXJuIChpIDwgbGVuZ3RoKSA/IFRSVUUgOiBGQUxTRTsKK30KKworLyoqCitTdGFuZGFyZCBjb252ZXJzaW9uIGZyb20gZmxvYXQgcGl4ZWxzIHRvIHJnYmUgcGl4ZWxzLiAKK05vdGU6IHlvdSBjYW4gcmVtb3ZlIHRoZSAiaW5saW5lInMgaWYgeW91ciBjb21waWxlciBjb21wbGFpbnMgYWJvdXQgaXQgCisqLworc3RhdGljIGlubGluZSB2b2lkIAorcmdiZV9GbG9hdFRvUkdCRShCWVRFIHJnYmVbNF0sIEZJUkdCRiAqcmdiZikgeworCWZsb2F0IHY7CisJaW50IGU7CisKKwl2ID0gcmdiZi0+cmVkOworCWlmIChyZ2JmLT5ncmVlbiA+IHYpIHYgPSByZ2JmLT5ncmVlbjsKKwlpZiAocmdiZi0+Ymx1ZSA+IHYpIHYgPSByZ2JmLT5ibHVlOworCWlmICh2IDwgMWUtMzIpIHsKKwkJcmdiZVswXSA9IHJnYmVbMV0gPSByZ2JlWzJdID0gcmdiZVszXSA9IDA7CisJfQorCWVsc2UgeworICAgICAgICAgIHYgPSAoZmxvYXQpKHN0ZDo6ZnJleHAodiwgJmUpICogMjU2LjAgLyB2KTsKKyAgICAgICAgICByZ2JlWzBdID0gKEJZVEUpKHJnYmYtPnJlZCAqIHYpOworICAgICAgICAgIHJnYmVbMV0gPSAoQllURSkocmdiZi0+Z3JlZW4gKiB2KTsKKyAgICAgICAgICByZ2JlWzJdID0gKEJZVEUpKHJnYmYtPmJsdWUgKiB2KTsKKyAgICAgICAgICByZ2JlWzNdID0gKEJZVEUpKGUgKyAxMjgpOworICAgICAgICB9Cit9CisKKy8qKgorU3RhbmRhcmQgY29udmVyc2lvbiBmcm9tIHJnYmUgdG8gZmxvYXQgcGl4ZWxzLiAKK05vdGU6IFdhcmQgdXNlcyBsZGV4cChjb2wrMC41LGV4cC0oMTI4KzgpKS4gCitIb3dldmVyIHdlIHdhbnRlZCBwaXhlbHMgaW4gdGhlIHJhbmdlIFswLDFdIHRvIG1hcCBiYWNrIGludG8gdGhlIHJhbmdlIFswLDFdLgorKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAKK3JnYmVfUkdCRVRvRmxvYXQoRklSR0JGICpyZ2JmLCBCWVRFIHJnYmVbNF0pIHsKKwlpZiAocmdiZVszXSkgeyAgIC8vIG5vbnplcm8gcGl4ZWwKKwkJZmxvYXQgZiA9IChmbG9hdCkobGRleHAoMS4wLCByZ2JlWzNdIC0gKGludCkoMTI4KzgpKSk7CisJCXJnYmYtPnJlZCAgID0gcmdiZVswXSAqIGY7CisJCXJnYmYtPmdyZWVuID0gcmdiZVsxXSAqIGY7CisJCXJnYmYtPmJsdWUgID0gcmdiZVsyXSAqIGY7CisKKwl9CisJZWxzZSB7CisJCXJnYmYtPnJlZCA9IHJnYmYtPmdyZWVuID0gcmdiZi0+Ymx1ZSA9IDA7CisJfQorfQorCisvKioKK01pbmltYWwgaGVhZGVyIHJlYWRpbmcuIE1vZGlmeSBpZiB5b3Ugd2FudCB0byBwYXJzZSBtb3JlIGluZm9ybWF0aW9uIAorKi8KK3N0YXRpYyBCT09MIAorcmdiZV9SZWFkSGVhZGVyKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSwgdW5zaWduZWQgKndpZHRoLCB1bnNpZ25lZCAqaGVpZ2h0LCByZ2JlSGVhZGVySW5mbyAqaGVhZGVyX2luZm8pIHsKKwljaGFyIGJ1ZltIRFJfTUFYTElORV07CisJZmxvYXQgdGVtcGY7CisJaW50IGk7CisJQk9PTCBiRm9ybWF0Rm91bmQgPSBGQUxTRTsKKwlCT09MIGJIZWFkZXJGb3VuZCA9IEZBTFNFOworCisJaGVhZGVyX2luZm8tPnZhbGlkID0gMDsKKwloZWFkZXJfaW5mby0+cHJvZ3JhbXR5cGVbMF0gPSAwOworCWhlYWRlcl9pbmZvLT5nYW1tYSA9IDEuMDsKKwloZWFkZXJfaW5mby0+ZXhwb3N1cmUgPSAxLjA7CisKKwkvLyBnZXQgdGhlIGZpcnN0IGxpbmUKKwlpZighcmdiZV9HZXRMaW5lKGlvLCBoYW5kbGUsIGJ1ZiwgSERSX01BWExJTkUpKQorCQlyZXR1cm4gcmdiZV9FcnJvcihyZ2JlX3JlYWRfZXJyb3IsIE5VTEwpOworCisJLy8gY2hlY2sgdGhlIHNpZ25hdHVyZQorCisJaWYgKChidWZbMF0gIT0gJyMnKXx8KGJ1ZlsxXSAhPSAnPycpKSB7CisJCS8vIGlmIHlvdSBkb24ndCB3YW50IHRvIHJlcXVpcmUgdGhlIG1hZ2ljIHRva2VuIHRoZW4gY29tbWVudCB0aGUgbmV4dCBsaW5lCisJCXJldHVybiByZ2JlX0Vycm9yKHJnYmVfZm9ybWF0X2Vycm9yLCJiYWQgaW5pdGlhbCB0b2tlbiIpOworCX0KKwllbHNlIHsKKwkJaGVhZGVyX2luZm8tPnZhbGlkIHw9IFJHQkVfVkFMSURfUFJPR1JBTVRZUEU7CisJCWZvcihpID0gMDsgaSA8IHNpemVvZihoZWFkZXJfaW5mby0+cHJvZ3JhbXR5cGUpIC0gMTsgaSsrKSB7CisJCQlpZigoYnVmW2krMl0gPT0gMCkgfHwgaXNzcGFjZShidWZbaSsyXSkpCisJCQkJYnJlYWs7CisJCQloZWFkZXJfaW5mby0+cHJvZ3JhbXR5cGVbaV0gPSBidWZbaSsyXTsKKwkJfQorCQloZWFkZXJfaW5mby0+cHJvZ3JhbXR5cGVbaV0gPSAwOworCX0KKworCWZvcig7OykgeworCQkvLyBnZXQgbmV4dCBsaW5lCisJCWlmKCFyZ2JlX0dldExpbmUoaW8sIGhhbmRsZSwgYnVmLCBIRFJfTUFYTElORSkpCisJCQlyZXR1cm4gcmdiZV9FcnJvcihyZ2JlX3JlYWRfZXJyb3IsIE5VTEwpOworCisJCWlmKChidWZbMF0gPT0gMCkgfHwgKGJ1ZlswXSA9PSAnXG4nKSkgeworCQkJLy8gZW5kIG9mIGhlYWRlciBzbyBicmVhayBvdXQgb2YgbG9vcAorCQkJYkhlYWRlckZvdW5kID0gVFJVRTsKKwkJCWJyZWFrOworCQl9CisJCWVsc2UgaWYoc3RyY21wKGJ1ZiwiRk9STUFUPTMyLWJpdF9ybGVfcmdiZVxuIikgPT0gMCkgeworCQkJYkZvcm1hdEZvdW5kID0gVFJVRTsKKwkJfQorCQllbHNlIGlmKHNzY2FuZihidWYsICJHQU1NQT0lZyIsICZ0ZW1wZikgPT0gMSkgeworCQkJaGVhZGVyX2luZm8tPmdhbW1hID0gdGVtcGY7CisJCQloZWFkZXJfaW5mby0+dmFsaWQgfD0gUkdCRV9WQUxJRF9HQU1NQTsKKwkJfQorCQllbHNlIGlmKHNzY2FuZihidWYsIkVYUE9TVVJFPSVnIiwmdGVtcGYpID09IDEpIHsKKwkJCWhlYWRlcl9pbmZvLT5leHBvc3VyZSA9IHRlbXBmOworCQkJaGVhZGVyX2luZm8tPnZhbGlkIHw9IFJHQkVfVkFMSURfRVhQT1NVUkU7CisJCX0KKwkJZWxzZSBpZigoYnVmWzBdID09ICcjJykgJiYgKGJ1ZlsxXSA9PSAweDIwKSkgeworCQkJaGVhZGVyX2luZm8tPnZhbGlkIHw9IFJHQkVfVkFMSURfQ09NTUVOVDsKKwkJCXN0cmNweShoZWFkZXJfaW5mby0+Y29tbWVudCwgYnVmKTsKKwkJfQorCX0KKwlpZighYkhlYWRlckZvdW5kIHx8ICFiRm9ybWF0Rm91bmQpIHsKKwkJcmV0dXJuIHJnYmVfRXJyb3IocmdiZV9mb3JtYXRfZXJyb3IsICJpbnZhbGlkIGhlYWRlciIpOworCX0KKworCS8vIGdldCBuZXh0IGxpbmUKKwlpZighcmdiZV9HZXRMaW5lKGlvLCBoYW5kbGUsIGJ1ZiwgSERSX01BWExJTkUpKQorCQlyZXR1cm4gcmdiZV9FcnJvcihyZ2JlX3JlYWRfZXJyb3IsIE5VTEwpOworCisJLy8gZ2V0IHRoZSBpbWFnZSB3aWR0aCAmIGhlaWdodAorCWlmKHNzY2FuZihidWYsIi1ZICVkICtYICVkIiwgaGVpZ2h0LCB3aWR0aCkgPCAyKSB7CisJCWlmKHNzY2FuZihidWYsIitYICVkICtZICVkIiwgaGVpZ2h0LCB3aWR0aCkgPCAyKSB7CisJCQlyZXR1cm4gcmdiZV9FcnJvcihyZ2JlX2Zvcm1hdF9lcnJvciwgIm1pc3NpbmcgaW1hZ2Ugc2l6ZSBzcGVjaWZpZXIiKTsKKwkJfQorCX0KKworCXJldHVybiBUUlVFOworfQorCisvKioKKyBkZWZhdWx0IG1pbmltYWwgaGVhZGVyLiBtb2RpZnkgaWYgeW91IHdhbnQgbW9yZSBpbmZvcm1hdGlvbiBpbiBoZWFkZXIgCisqLworc3RhdGljIEJPT0wgCityZ2JlX1dyaXRlSGVhZGVyKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSwgdW5zaWduZWQgd2lkdGgsIHVuc2lnbmVkIGhlaWdodCwgcmdiZUhlYWRlckluZm8gKmluZm8pIHsKKwljaGFyIGJ1ZmZlcltIRFJfTUFYTElORV07CisKKwljb25zdCBjaGFyICpwcm9ncmFtdHlwZSA9ICJSQURJQU5DRSI7CisKKwlpZihpbmZvICYmIChpbmZvLT52YWxpZCAmIFJHQkVfVkFMSURfUFJPR1JBTVRZUEUpKSB7CisJCXByb2dyYW10eXBlID0gaW5mby0+cHJvZ3JhbXR5cGU7CisJfQorCS8vIFRoZSAjPyBpcyB0byBpZGVudGlmeSBmaWxlIHR5cGUsIHRoZSBwcm9ncmFtdHlwZSBpcyBvcHRpb25hbAorCXNwcmludGYoYnVmZmVyLCAiIz8lc1xuIiwgcHJvZ3JhbXR5cGUpOworCWlmKGlvLT53cml0ZV9wcm9jKGJ1ZmZlciwgMSwgKHVuc2lnbmVkIGludClzdHJsZW4oYnVmZmVyKSwgaGFuZGxlKSA8IDEpCisJCXJldHVybiByZ2JlX0Vycm9yKHJnYmVfd3JpdGVfZXJyb3IsIE5VTEwpOworCXNwcmludGYoYnVmZmVyLCAiJXNcbiIsIGluZm8tPmNvbW1lbnQpOworCWlmKGlvLT53cml0ZV9wcm9jKGJ1ZmZlciwgMSwgKHVuc2lnbmVkIGludClzdHJsZW4oYnVmZmVyKSwgaGFuZGxlKSA8IDEpCisJCXJldHVybiByZ2JlX0Vycm9yKHJnYmVfd3JpdGVfZXJyb3IsIE5VTEwpOworCXNwcmludGYoYnVmZmVyLCAiRk9STUFUPTMyLWJpdF9ybGVfcmdiZVxuIik7CisJaWYoaW8tPndyaXRlX3Byb2MoYnVmZmVyLCAxLCAodW5zaWduZWQgaW50KXN0cmxlbihidWZmZXIpLCBoYW5kbGUpIDwgMSkKKwkJcmV0dXJuIHJnYmVfRXJyb3IocmdiZV93cml0ZV9lcnJvciwgTlVMTCk7CisJaWYoaW5mbyAmJiAoaW5mby0+dmFsaWQgJiBSR0JFX1ZBTElEX0dBTU1BKSkgeworCQlzcHJpbnRmKGJ1ZmZlciwgIkdBTU1BPSVnXG4iLCBpbmZvLT5nYW1tYSk7CisJCWlmKGlvLT53cml0ZV9wcm9jKGJ1ZmZlciwgMSwgKHVuc2lnbmVkIGludClzdHJsZW4oYnVmZmVyKSwgaGFuZGxlKSA8IDEpCisJCQlyZXR1cm4gcmdiZV9FcnJvcihyZ2JlX3dyaXRlX2Vycm9yLCBOVUxMKTsKKwl9CisJaWYoaW5mbyAmJiAoaW5mby0+dmFsaWQgJiBSR0JFX1ZBTElEX0VYUE9TVVJFKSkgeworCQlzcHJpbnRmKGJ1ZmZlciwiRVhQT1NVUkU9JWdcbiIsIGluZm8tPmV4cG9zdXJlKTsKKwkJaWYoaW8tPndyaXRlX3Byb2MoYnVmZmVyLCAxLCAodW5zaWduZWQgaW50KXN0cmxlbihidWZmZXIpLCBoYW5kbGUpIDwgMSkKKwkJCXJldHVybiByZ2JlX0Vycm9yKHJnYmVfd3JpdGVfZXJyb3IsIE5VTEwpOworCX0KKwlzcHJpbnRmKGJ1ZmZlciwgIlxuLVkgJWQgK1ggJWRcbiIsIGhlaWdodCwgd2lkdGgpOworCWlmKGlvLT53cml0ZV9wcm9jKGJ1ZmZlciwgMSwgKHVuc2lnbmVkIGludClzdHJsZW4oYnVmZmVyKSwgaGFuZGxlKSA8IDEpCisJCXJldHVybiByZ2JlX0Vycm9yKHJnYmVfd3JpdGVfZXJyb3IsIE5VTEwpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBCT09MIAorcmdiZV9SZWFkTWV0YWRhdGEoRklCSVRNQVAgKmRpYiwgcmdiZUhlYWRlckluZm8gKmhlYWRlcl9pbmZvKSB7CisJcmV0dXJuIFRSVUU7Cit9CitzdGF0aWMgQk9PTCAKK3JnYmVfV3JpdGVNZXRhZGF0YShGSUJJVE1BUCAqZGliLCByZ2JlSGVhZGVySW5mbyAqaGVhZGVyX2luZm8pIHsKKwloZWFkZXJfaW5mby0+Z2FtbWEgPSAxOworCWhlYWRlcl9pbmZvLT52YWxpZCB8PSBSR0JFX1ZBTElEX0dBTU1BOworCWhlYWRlcl9pbmZvLT5leHBvc3VyZSA9IDA7CisJaGVhZGVyX2luZm8tPnZhbGlkIHw9IFJHQkVfVkFMSURfRVhQT1NVUkU7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoqIAorU2ltcGxlIHJlYWQgcm91dGluZS4gV2lsbCBub3QgY29ycmVjdGx5IGhhbmRsZSBydW4gbGVuZ3RoIGVuY29kaW5nIAorKi8KK3N0YXRpYyBCT09MIAorcmdiZV9SZWFkUGl4ZWxzKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSwgRklSR0JGICpkYXRhLCB1bnNpZ25lZCBudW1waXhlbHMpIHsKKyAgQllURSByZ2JlWzRdOworCisgIGZvcih1bnNpZ25lZCB4ID0gMDsgeCA8IG51bXBpeGVsczsgeCsrKSB7CisJaWYoaW8tPnJlYWRfcHJvYyhyZ2JlLCAxLCBzaXplb2YocmdiZSksIGhhbmRsZSkgPCAxKSB7CisJCXJldHVybiByZ2JlX0Vycm9yKHJnYmVfcmVhZF9lcnJvciwgTlVMTCk7CisJfQorCXJnYmVfUkdCRVRvRmxvYXQoJmRhdGFbeF0sIHJnYmUpOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorIFNpbXBsZSB3cml0ZSByb3V0aW5lIHRoYXQgZG9lcyBub3QgdXNlIHJ1biBsZW5ndGggZW5jb2RpbmcuIAorIFRoZXNlIHJvdXRpbmVzIGNhbiBiZSBtYWRlIGZhc3RlciBieSBhbGxvY2F0aW5nIGEgbGFyZ2VyIGJ1ZmZlciBhbmQKKyBmcmVhZC1pbmcgYW5kIGZ3cml0ZS1pbmcgdGhlIGRhdGEgaW4gbGFyZ2VyIGNodW5rcy4KKyovCitzdGF0aWMgQk9PTCAKK3JnYmVfV3JpdGVQaXhlbHMoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBGSVJHQkYgKmRhdGEsIHVuc2lnbmVkIG51bXBpeGVscykgeworICBCWVRFIHJnYmVbNF07CisKKyAgZm9yKHVuc2lnbmVkIHggPSAwOyB4IDwgbnVtcGl4ZWxzOyB4KyspIHsKKwkgIHJnYmVfRmxvYXRUb1JHQkUocmdiZSwgJmRhdGFbeF0pOworCSAgaWYoaW8tPndyaXRlX3Byb2MocmdiZSwgc2l6ZW9mKHJnYmUpLCAxLCBoYW5kbGUpIDwgMSkKKwkJICByZXR1cm4gcmdiZV9FcnJvcihyZ2JlX3dyaXRlX2Vycm9yLCBOVUxMKTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgQk9PTCAKK3JnYmVfUmVhZFBpeGVsc19STEUoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBGSVJHQkYgKmRhdGEsIGludCBzY2FubGluZV93aWR0aCwgdW5zaWduZWQgbnVtX3NjYW5saW5lcykgeworCUJZVEUgcmdiZVs0XSwgKnNjYW5saW5lX2J1ZmZlciwgKnB0ciwgKnB0cl9lbmQ7CisJaW50IGksIGNvdW50OworCUJZVEUgYnVmWzJdOworCQorCWlmICgoc2NhbmxpbmVfd2lkdGggPCA4KXx8KHNjYW5saW5lX3dpZHRoID4gMHg3ZmZmKSkgeworCQkvLyBydW4gbGVuZ3RoIGVuY29kaW5nIGlzIG5vdCBhbGxvd2VkIHNvIHJlYWQgZmxhdAorCQlyZXR1cm4gcmdiZV9SZWFkUGl4ZWxzKGlvLCBoYW5kbGUsIGRhdGEsIHNjYW5saW5lX3dpZHRoICogbnVtX3NjYW5saW5lcyk7CisJfQorCXNjYW5saW5lX2J1ZmZlciA9IE5VTEw7CisJLy8gcmVhZCBpbiBlYWNoIHN1Y2Nlc3NpdmUgc2NhbmxpbmUgCisJd2hpbGUobnVtX3NjYW5saW5lcyA+IDApIHsKKwkJaWYoaW8tPnJlYWRfcHJvYyhyZ2JlLCAxLCBzaXplb2YocmdiZSksIGhhbmRsZSkgPCAxKSB7CisJCQlmcmVlKHNjYW5saW5lX2J1ZmZlcik7CisJCQlyZXR1cm4gcmdiZV9FcnJvcihyZ2JlX3JlYWRfZXJyb3IsTlVMTCk7CisJCX0KKwkJaWYoKHJnYmVbMF0gIT0gMikgfHwgKHJnYmVbMV0gIT0gMikgfHwgKHJnYmVbMl0gJiAweDgwKSkgeworCQkJLy8gdGhpcyBmaWxlIGlzIG5vdCBydW4gbGVuZ3RoIGVuY29kZWQKKwkJCXJnYmVfUkdCRVRvRmxvYXQoZGF0YSwgcmdiZSk7CisJCQlkYXRhICsrOworCQkJZnJlZShzY2FubGluZV9idWZmZXIpOworCQkJcmV0dXJuIHJnYmVfUmVhZFBpeGVscyhpbywgaGFuZGxlLCBkYXRhLCBzY2FubGluZV93aWR0aCAqIG51bV9zY2FubGluZXMgLSAxKTsKKwkJfQorCQlpZigoKChpbnQpcmdiZVsyXSkgPDwgOCB8IHJnYmVbM10pICE9IHNjYW5saW5lX3dpZHRoKSB7CisJCQlmcmVlKHNjYW5saW5lX2J1ZmZlcik7CisJCQlyZXR1cm4gcmdiZV9FcnJvcihyZ2JlX2Zvcm1hdF9lcnJvciwid3Jvbmcgc2NhbmxpbmUgd2lkdGgiKTsKKwkJfQorCQlpZihzY2FubGluZV9idWZmZXIgPT0gTlVMTCkgeworCQkJc2NhbmxpbmVfYnVmZmVyID0gKEJZVEUqKW1hbGxvYyhzaXplb2YoQllURSkgKiA0ICogc2NhbmxpbmVfd2lkdGgpOworCQkJaWYoc2NhbmxpbmVfYnVmZmVyID09IE5VTEwpIHsKKwkJCQlyZXR1cm4gcmdiZV9FcnJvcihyZ2JlX21lbW9yeV9lcnJvciwgInVuYWJsZSB0byBhbGxvY2F0ZSBidWZmZXIgc3BhY2UiKTsKKwkJCX0KKwkJfQorCQkKKwkJcHRyID0gJnNjYW5saW5lX2J1ZmZlclswXTsKKwkJLy8gcmVhZCBlYWNoIG9mIHRoZSBmb3VyIGNoYW5uZWxzIGZvciB0aGUgc2NhbmxpbmUgaW50byB0aGUgYnVmZmVyCisJCWZvcihpID0gMDsgaSA8IDQ7IGkrKykgeworCQkJcHRyX2VuZCA9ICZzY2FubGluZV9idWZmZXJbKGkrMSkqc2NhbmxpbmVfd2lkdGhdOworCQkJd2hpbGUocHRyIDwgcHRyX2VuZCkgeworCQkJCWlmKGlvLT5yZWFkX3Byb2MoYnVmLCAxLCAyICogc2l6ZW9mKEJZVEUpLCBoYW5kbGUpIDwgMSkgeworCQkJCQlmcmVlKHNjYW5saW5lX2J1ZmZlcik7CisJCQkJCXJldHVybiByZ2JlX0Vycm9yKHJnYmVfcmVhZF9lcnJvciwgTlVMTCk7CisJCQkJfQorCQkJCWlmKGJ1ZlswXSA+IDEyOCkgeworCQkJCQkvLyBhIHJ1biBvZiB0aGUgc2FtZSB2YWx1ZQorCQkJCQljb3VudCA9IGJ1ZlswXSAtIDEyODsKKwkJCQkJaWYoKGNvdW50ID09IDApIHx8IChjb3VudCA+IHB0cl9lbmQgLSBwdHIpKSB7CisJCQkJCQlmcmVlKHNjYW5saW5lX2J1ZmZlcik7CisJCQkJCQlyZXR1cm4gcmdiZV9FcnJvcihyZ2JlX2Zvcm1hdF9lcnJvciwgImJhZCBzY2FubGluZSBkYXRhIik7CisJCQkJCX0KKwkJCQkJd2hpbGUoY291bnQtLSA+IDApCisJCQkJCQkqcHRyKysgPSBidWZbMV07CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQkvLyBhIG5vbi1ydW4KKwkJCQkJY291bnQgPSBidWZbMF07CisJCQkJCWlmKChjb3VudCA9PSAwKSB8fCAoY291bnQgPiBwdHJfZW5kIC0gcHRyKSkgeworCQkJCQkJZnJlZShzY2FubGluZV9idWZmZXIpOworCQkJCQkJcmV0dXJuIHJnYmVfRXJyb3IocmdiZV9mb3JtYXRfZXJyb3IsICJiYWQgc2NhbmxpbmUgZGF0YSIpOworCQkJCQl9CisJCQkJCSpwdHIrKyA9IGJ1ZlsxXTsKKwkJCQkJaWYoLS1jb3VudCA+IDApIHsKKwkJCQkJCWlmKGlvLT5yZWFkX3Byb2MocHRyLCAxLCBzaXplb2YoQllURSkgKiBjb3VudCwgaGFuZGxlKSA8IDEpIHsKKwkJCQkJCQlmcmVlKHNjYW5saW5lX2J1ZmZlcik7CisJCQkJCQkJcmV0dXJuIHJnYmVfRXJyb3IocmdiZV9yZWFkX2Vycm9yLCBOVUxMKTsKKwkJCQkJCX0KKwkJCQkJCXB0ciArPSBjb3VudDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQkvLyBub3cgY29udmVydCBkYXRhIGZyb20gYnVmZmVyIGludG8gZmxvYXRzCisJCWZvcihpID0gMDsgaSA8IHNjYW5saW5lX3dpZHRoOyBpKyspIHsKKwkJCXJnYmVbMF0gPSBzY2FubGluZV9idWZmZXJbaV07CisJCQlyZ2JlWzFdID0gc2NhbmxpbmVfYnVmZmVyW2krc2NhbmxpbmVfd2lkdGhdOworCQkJcmdiZVsyXSA9IHNjYW5saW5lX2J1ZmZlcltpKzIqc2NhbmxpbmVfd2lkdGhdOworCQkJcmdiZVszXSA9IHNjYW5saW5lX2J1ZmZlcltpKzMqc2NhbmxpbmVfd2lkdGhdOworCQkJcmdiZV9SR0JFVG9GbG9hdChkYXRhLCByZ2JlKTsKKwkJCWRhdGEgKys7CisJCX0KKworCQludW1fc2NhbmxpbmVzLS07CisJfQorCisJZnJlZShzY2FubGluZV9idWZmZXIpOworCQorCXJldHVybiBUUlVFOworfQorCisvKioKKyBUaGUgY29kZSBiZWxvdyBpcyBvbmx5IG5lZWRlZCBmb3IgdGhlIHJ1bi1sZW5ndGggZW5jb2RlZCBmaWxlcy4KKyBSdW4gbGVuZ3RoIGVuY29kaW5nIGFkZHMgY29uc2lkZXJhYmxlIGNvbXBsZXhpdHkgYnV0IGRvZXMgCisgc2F2ZSBzb21lIHNwYWNlLiAgRm9yIGVhY2ggc2NhbmxpbmUsIGVhY2ggY2hhbm5lbCAocixnLGIsZSkgaXMgCisgZW5jb2RlZCBzZXBhcmF0ZWx5IGZvciBiZXR0ZXIgY29tcHJlc3Npb24uIAorIEByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgRkFMU0Ugb3RoZXJ3aXNlCisqLworc3RhdGljIEJPT0wgCityZ2JlX1dyaXRlQnl0ZXNfUkxFKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSwgQllURSAqZGF0YSwgaW50IG51bWJ5dGVzKSB7CisJc3RhdGljIGNvbnN0IGludCBNSU5SVU5MRU5HVEggPSA0OworCWludCBjdXIsIGJlZ19ydW4sIHJ1bl9jb3VudCwgb2xkX3J1bl9jb3VudCwgbm9ucnVuX2NvdW50OworCUJZVEUgYnVmWzJdOworCQorCWN1ciA9IDA7CisJd2hpbGUoY3VyIDwgbnVtYnl0ZXMpIHsKKwkJYmVnX3J1biA9IGN1cjsKKwkJLy8gZmluZCBuZXh0IHJ1biBvZiBsZW5ndGggYXQgbGVhc3QgNCBpZiBvbmUgZXhpc3RzIAorCQlydW5fY291bnQgPSBvbGRfcnVuX2NvdW50ID0gMDsKKwkJd2hpbGUoKHJ1bl9jb3VudCA8IE1JTlJVTkxFTkdUSCkgJiYgKGJlZ19ydW4gPCBudW1ieXRlcykpIHsKKwkJCWJlZ19ydW4gKz0gcnVuX2NvdW50OworCQkJb2xkX3J1bl9jb3VudCA9IHJ1bl9jb3VudDsKKwkJCXJ1bl9jb3VudCA9IDE7CisJCQl3aGlsZSgoYmVnX3J1biArIHJ1bl9jb3VudCA8IG51bWJ5dGVzKSAmJiAocnVuX2NvdW50IDwgMTI3KSAmJiAoZGF0YVtiZWdfcnVuXSA9PSBkYXRhW2JlZ19ydW4gKyBydW5fY291bnRdKSkgeworCQkJCXJ1bl9jb3VudCsrOworCQkJfQorCQl9CisJCS8vIGlmIGRhdGEgYmVmb3JlIG5leHQgYmlnIHJ1biBpcyBhIHNob3J0IHJ1biB0aGVuIHdyaXRlIGl0IGFzIHN1Y2ggCisJCWlmICgob2xkX3J1bl9jb3VudCA+IDEpJiYob2xkX3J1bl9jb3VudCA9PSBiZWdfcnVuIC0gY3VyKSkgeworCQkJYnVmWzBdID0gKEJZVEUpKDEyOCArIG9sZF9ydW5fY291bnQpOyAgIC8vIHdyaXRlIHNob3J0IHJ1bgorCQkJYnVmWzFdID0gZGF0YVtjdXJdOworCQkJaWYoaW8tPndyaXRlX3Byb2MoYnVmLCAyICogc2l6ZW9mKEJZVEUpLCAxLCBoYW5kbGUpIDwgMSkKKwkJCQlyZXR1cm4gcmdiZV9FcnJvcihyZ2JlX3dyaXRlX2Vycm9yLCBOVUxMKTsKKwkJCWN1ciA9IGJlZ19ydW47CisJCX0KKwkJLy8gd3JpdGUgb3V0IGJ5dGVzIHVudGlsIHdlIHJlYWNoIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBydW4gCisJCXdoaWxlKGN1ciA8IGJlZ19ydW4pIHsKKwkJCW5vbnJ1bl9jb3VudCA9IGJlZ19ydW4gLSBjdXI7CisJCQlpZiAobm9ucnVuX2NvdW50ID4gMTI4KSAKKwkJCQlub25ydW5fY291bnQgPSAxMjg7CisJCQlidWZbMF0gPSAoQllURSlub25ydW5fY291bnQ7CisJCQlpZihpby0+d3JpdGVfcHJvYyhidWYsIHNpemVvZihidWZbMF0pLCAxLCBoYW5kbGUpIDwgMSkKKwkJCQlyZXR1cm4gcmdiZV9FcnJvcihyZ2JlX3dyaXRlX2Vycm9yLE5VTEwpOworCQkJaWYoaW8tPndyaXRlX3Byb2MoJmRhdGFbY3VyXSwgc2l6ZW9mKGRhdGFbMF0pICogbm9ucnVuX2NvdW50LCAxLCBoYW5kbGUpIDwgMSkKKwkJCQlyZXR1cm4gcmdiZV9FcnJvcihyZ2JlX3dyaXRlX2Vycm9yLE5VTEwpOworCQkJY3VyICs9IG5vbnJ1bl9jb3VudDsKKwkJfQorCQkvLyB3cml0ZSBvdXQgbmV4dCBydW4gaWYgb25lIHdhcyBmb3VuZCAKKwkJaWYgKHJ1bl9jb3VudCA+PSBNSU5SVU5MRU5HVEgpIHsKKwkJCWJ1ZlswXSA9IChCWVRFKSgxMjggKyBydW5fY291bnQpOworCQkJYnVmWzFdID0gZGF0YVtiZWdfcnVuXTsKKwkJCWlmKGlvLT53cml0ZV9wcm9jKGJ1Ziwgc2l6ZW9mKGJ1ZlswXSkgKiAyLCAxLCBoYW5kbGUpIDwgMSkKKwkJCQlyZXR1cm4gcmdiZV9FcnJvcihyZ2JlX3dyaXRlX2Vycm9yLE5VTEwpOworCQkJY3VyICs9IHJ1bl9jb3VudDsKKwkJfQorCX0KKwkKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIEJPT0wgCityZ2JlX1dyaXRlUGl4ZWxzX1JMRShGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIEZJUkdCRiAqZGF0YSwgdW5zaWduZWQgc2NhbmxpbmVfd2lkdGgsIHVuc2lnbmVkIG51bV9zY2FubGluZXMpIHsKKwlCWVRFIHJnYmVbNF07CisJQllURSAqYnVmZmVyOworCQorCWlmICgoc2NhbmxpbmVfd2lkdGggPCA4KXx8KHNjYW5saW5lX3dpZHRoID4gMHg3ZmZmKSkgeworCQkvLyBydW4gbGVuZ3RoIGVuY29kaW5nIGlzIG5vdCBhbGxvd2VkIHNvIHdyaXRlIGZsYXQKKwkJcmV0dXJuIHJnYmVfV3JpdGVQaXhlbHMoaW8sIGhhbmRsZSwgZGF0YSwgc2NhbmxpbmVfd2lkdGggKiBudW1fc2NhbmxpbmVzKTsKKwl9CisJYnVmZmVyID0gKEJZVEUqKW1hbGxvYyhzaXplb2YoQllURSkgKiA0ICogc2NhbmxpbmVfd2lkdGgpOworCWlmIChidWZmZXIgPT0gTlVMTCkgeworCQkvLyBubyBidWZmZXIgc3BhY2Ugc28gd3JpdGUgZmxhdCAKKwkJcmV0dXJuIHJnYmVfV3JpdGVQaXhlbHMoaW8sIGhhbmRsZSwgZGF0YSwgc2NhbmxpbmVfd2lkdGggKiBudW1fc2NhbmxpbmVzKTsKKwl9CisJd2hpbGUobnVtX3NjYW5saW5lcy0tID4gMCkgeworCQlyZ2JlWzBdID0gKEJZVEUpMjsKKwkJcmdiZVsxXSA9IChCWVRFKTI7CisJCXJnYmVbMl0gPSAoQllURSkoc2NhbmxpbmVfd2lkdGggPj4gOCk7CisJCXJnYmVbM10gPSAoQllURSkoc2NhbmxpbmVfd2lkdGggJiAweEZGKTsKKwkJaWYoaW8tPndyaXRlX3Byb2MocmdiZSwgc2l6ZW9mKHJnYmUpLCAxLCBoYW5kbGUpIDwgMSkgeworCQkJZnJlZShidWZmZXIpOworCQkJcmV0dXJuIHJnYmVfRXJyb3IocmdiZV93cml0ZV9lcnJvciwgTlVMTCk7CisJCX0KKwkJZm9yKHVuc2lnbmVkIHggPSAwOyB4IDwgc2NhbmxpbmVfd2lkdGg7IHgrKykgeworCQkJcmdiZV9GbG9hdFRvUkdCRShyZ2JlLCBkYXRhKTsKKwkJCWJ1ZmZlclt4XSA9IHJnYmVbMF07CisJCQlidWZmZXJbeCtzY2FubGluZV93aWR0aF0gPSByZ2JlWzFdOworCQkJYnVmZmVyW3grMipzY2FubGluZV93aWR0aF0gPSByZ2JlWzJdOworCQkJYnVmZmVyW3grMypzY2FubGluZV93aWR0aF0gPSByZ2JlWzNdOworCQkJZGF0YSArKzsKKwkJfQorCQkvLyB3cml0ZSBvdXQgZWFjaCBvZiB0aGUgZm91ciBjaGFubmVscyBzZXBhcmF0ZWx5IHJ1biBsZW5ndGggZW5jb2RlZAorCQkvLyBmaXJzdCByZWQsIHRoZW4gZ3JlZW4sIHRoZW4gYmx1ZSwgdGhlbiBleHBvbmVudAorCQlmb3IoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCQlCT09MIGJPSyA9IHJnYmVfV3JpdGVCeXRlc19STEUoaW8sIGhhbmRsZSwgJmJ1ZmZlcltpKnNjYW5saW5lX3dpZHRoXSwgc2NhbmxpbmVfd2lkdGgpOworCQkJaWYoIWJPSykgeworCQkJCWZyZWUoYnVmZmVyKTsKKwkJCQlyZXR1cm4gYk9LOworCQkJfQorCQl9CisJfQorCWZyZWUoYnVmZmVyKTsKKwkKKwlyZXR1cm4gVFJVRTsKK30KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBQbHVnaW4gSW1wbGVtZW50YXRpb24KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKK0Zvcm1hdCgpIHsKKwlyZXR1cm4gIkhEUiI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCitEZXNjcmlwdGlvbigpIHsKKwlyZXR1cm4gIkhpZ2ggRHluYW1pYyBSYW5nZSBJbWFnZSI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCitFeHRlbnNpb24oKSB7CisJcmV0dXJuICJoZHIiOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgorUmVnRXhwcigpIHsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKK01pbWVUeXBlKCkgeworCXJldHVybiAiaW1hZ2Uvdm5kLnJhZGlhbmNlIjsKK30KKworc3RhdGljIEJPT0wgRExMX0NBTExDT05WCitWYWxpZGF0ZShGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUpIHsKKwlCWVRFIGhkcl9zaWduYXR1cmVbXSA9IHsgJyMnLCAnPycgfTsKKwlCWVRFIHNpZ25hdHVyZVtdID0geyAwLCAwIH07CisKKwlpby0+cmVhZF9wcm9jKHNpZ25hdHVyZSwgMSwgMiwgaGFuZGxlKTsKKworCXJldHVybiAobWVtY21wKGhkcl9zaWduYXR1cmUsIHNpZ25hdHVyZSwgMikgPT0gMCk7Cit9CisKK3N0YXRpYyBCT09MIERMTF9DQUxMQ09OVgorU3VwcG9ydHNFeHBvcnREZXB0aChpbnQgZGVwdGgpIHsKKwlyZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBCT09MIERMTF9DQUxMQ09OViAKK1N1cHBvcnRzRXhwb3J0VHlwZShGUkVFX0lNQUdFX1RZUEUgdHlwZSkgeworCXJldHVybiAodHlwZSA9PSBGSVRfUkdCRikgPyBUUlVFIDogRkFMU0U7Cit9CisKK3N0YXRpYyBCT09MIERMTF9DQUxMQ09OVgorU3VwcG9ydHNOb1BpeGVscygpIHsKKwlyZXR1cm4gVFJVRTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIEZJQklUTUFQICogRExMX0NBTExDT05WCitMb2FkKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSwgaW50IHBhZ2UsIGludCBmbGFncywgdm9pZCAqZGF0YSkgeworCUZJQklUTUFQICpkaWIgPSBOVUxMOworCisJaWYoIWhhbmRsZSkgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlCT09MIGhlYWRlcl9vbmx5ID0gKGZsYWdzICYgRklGX0xPQURfTk9QSVhFTFMpID09IEZJRl9MT0FEX05PUElYRUxTOworCisJdHJ5IHsKKworCQlyZ2JlSGVhZGVySW5mbyBoZWFkZXJfaW5mbzsKKwkJdW5zaWduZWQgd2lkdGgsIGhlaWdodDsKKworCQkvLyBSZWFkIHRoZSBoZWFkZXIKKwkJaWYocmdiZV9SZWFkSGVhZGVyKGlvLCBoYW5kbGUsICZ3aWR0aCwgJmhlaWdodCwgJmhlYWRlcl9pbmZvKSA9PSBGQUxTRSkgeworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQkvLyBhbGxvY2F0ZSBhIFJHQkYgaW1hZ2UKKwkJZGliID0gRnJlZUltYWdlX0FsbG9jYXRlSGVhZGVyVChoZWFkZXJfb25seSwgRklUX1JHQkYsIHdpZHRoLCBoZWlnaHQpOworCQlpZighZGliKSB7CisJCQl0aHJvdyBGSV9NU0dfRVJST1JfTUVNT1JZOworCQl9CisKKwkJLy8gc2V0IHRoZSBtZXRhZGF0YSBhcyBjb21tZW50cworCQlyZ2JlX1JlYWRNZXRhZGF0YShkaWIsICZoZWFkZXJfaW5mbyk7CisKKwkJaWYoaGVhZGVyX29ubHkpIHsKKwkJCS8vIGhlYWRlciBvbmx5IG1vZGUKKwkJCXJldHVybiBkaWI7CisJCX0KKworCQkvLyByZWFkIHRoZSBpbWFnZSBwaXhlbHMgYW5kIGZpbGwgdGhlIGRpYgorCQkKKwkJZm9yKHVuc2lnbmVkIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJCUZJUkdCRiAqc2NhbmxpbmUgPSAoRklSR0JGKilGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCBoZWlnaHQgLSAxIC0geSk7CisJCQlpZighcmdiZV9SZWFkUGl4ZWxzX1JMRShpbywgaGFuZGxlLCBzY2FubGluZSwgd2lkdGgsIDEpKSB7CisJCQkJRnJlZUltYWdlX1VubG9hZChkaWIpOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQl9CisKKwl9CisJY2F0Y2goY29uc3QgY2hhciAqdGV4dCkgeworCQlpZihkaWIgIT0gTlVMTCkgeworCQkJRnJlZUltYWdlX1VubG9hZChkaWIpOworCQl9CisJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhzX2Zvcm1hdF9pZCwgdGV4dCk7CisJfQorCisJcmV0dXJuIGRpYjsKK30KKworc3RhdGljIEJPT0wgRExMX0NBTExDT05WCitTYXZlKEZyZWVJbWFnZUlPICppbywgRklCSVRNQVAgKmRpYiwgZmlfaGFuZGxlIGhhbmRsZSwgaW50IHBhZ2UsIGludCBmbGFncywgdm9pZCAqZGF0YSkgeworCWlmKCFkaWIpIHJldHVybiBGQUxTRTsKKworCUZSRUVfSU1BR0VfVFlQRSBzcmNfdHlwZSA9IEZyZWVJbWFnZV9HZXRJbWFnZVR5cGUoZGliKTsKKwlpZihzcmNfdHlwZSAhPSBGSVRfUkdCRikgeworCQlGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2Moc19mb3JtYXRfaWQsICJGUkVFX0lNQUdFX1RZUEU6IFVuYWJsZSB0byBjb252ZXJ0IGZyb20gdHlwZSAlZCB0byB0eXBlICVkLlxuIE5vIHN1Y2ggY29udmVyc2lvbiBleGlzdHMuIiwgc3JjX3R5cGUsIEZJVF9SR0JGKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCXVuc2lnbmVkIHdpZHRoICA9IEZyZWVJbWFnZV9HZXRXaWR0aChkaWIpOworCXVuc2lnbmVkIGhlaWdodCA9IEZyZWVJbWFnZV9HZXRIZWlnaHQoZGliKTsKKworCS8vIHdyaXRlIHRoZSBoZWFkZXIKKworCXJnYmVIZWFkZXJJbmZvIGhlYWRlcl9pbmZvOworCW1lbXNldCgmaGVhZGVyX2luZm8sIDAsIHNpemVvZihyZ2JlSGVhZGVySW5mbykpOworCS8vIGZpbGwgdGhlIGhlYWRlciB3aXRoIGNvcnJlY3QgZ2FtbWEgYW5kIGV4cG9zdXJlCisJcmdiZV9Xcml0ZU1ldGFkYXRhKGRpYiwgJmhlYWRlcl9pbmZvKTsKKwkvLyBmaWxsIGEgY29tbWVudAorCXNwcmludGYoaGVhZGVyX2luZm8uY29tbWVudCwgIiMgTWFkZSB3aXRoIEZyZWVJbWFnZSAlcyIsIEZyZWVJbWFnZV9HZXRWZXJzaW9uKCkpOworCWlmKCFyZ2JlX1dyaXRlSGVhZGVyKGlvLCBoYW5kbGUsIHdpZHRoLCBoZWlnaHQsICZoZWFkZXJfaW5mbykpIHsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCS8vIHdyaXRlIGVhY2ggc2NhbmxpbmUKKworCWZvcih1bnNpZ25lZCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisJCUZJUkdCRiAqc2NhbmxpbmUgPSAoRklSR0JGKilGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCBoZWlnaHQgLSAxIC0geSk7CisJCWlmKCFyZ2JlX1dyaXRlUGl4ZWxzX1JMRShpbywgaGFuZGxlLCBzY2FubGluZSwgd2lkdGgsIDEpKSB7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gICBJbml0CisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3ZvaWQgRExMX0NBTExDT05WCitJbml0SERSKFBsdWdpbiAqcGx1Z2luLCBpbnQgZm9ybWF0X2lkKSB7CisJc19mb3JtYXRfaWQgPSBmb3JtYXRfaWQ7CisKKwlwbHVnaW4tPmZvcm1hdF9wcm9jID0gRm9ybWF0OworCXBsdWdpbi0+ZGVzY3JpcHRpb25fcHJvYyA9IERlc2NyaXB0aW9uOworCXBsdWdpbi0+ZXh0ZW5zaW9uX3Byb2MgPSBFeHRlbnNpb247CisJcGx1Z2luLT5yZWdleHByX3Byb2MgPSBSZWdFeHByOworCXBsdWdpbi0+b3Blbl9wcm9jID0gTlVMTDsKKwlwbHVnaW4tPmNsb3NlX3Byb2MgPSBOVUxMOworCXBsdWdpbi0+cGFnZWNvdW50X3Byb2MgPSBOVUxMOworCXBsdWdpbi0+cGFnZWNhcGFiaWxpdHlfcHJvYyA9IE5VTEw7CisJcGx1Z2luLT5sb2FkX3Byb2MgPSBMb2FkOworCXBsdWdpbi0+c2F2ZV9wcm9jID0gU2F2ZTsKKwlwbHVnaW4tPnZhbGlkYXRlX3Byb2MgPSBWYWxpZGF0ZTsKKwlwbHVnaW4tPm1pbWVfcHJvYyA9IE1pbWVUeXBlOworCXBsdWdpbi0+c3VwcG9ydHNfZXhwb3J0X2JwcF9wcm9jID0gU3VwcG9ydHNFeHBvcnREZXB0aDsKKwlwbHVnaW4tPnN1cHBvcnRzX2V4cG9ydF90eXBlX3Byb2MgPSBTdXBwb3J0c0V4cG9ydFR5cGU7CisJcGx1Z2luLT5zdXBwb3J0c19pY2NfcHJvZmlsZXNfcHJvYyA9IE5VTEw7CisJcGx1Z2luLT5zdXBwb3J0c19ub19waXhlbHNfcHJvYyA9IFN1cHBvcnRzTm9QaXhlbHM7Cit9CmRpZmYgLS1naXQgYS9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL1BsdWdpbklDTy5jcHAgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL1BsdWdpbklDTy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgxODM3OQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvUGx1Z2luSUNPLmNwcApAQCAtMCwwICsxLDgyNCBAQAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gSUNPIExvYWRlciBhbmQgV3JpdGVyCisvLworLy8gRGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBieQorLy8gLSBGbG9yaXMgdmFuIGRlbiBCZXJnIChmbHZkYmVyZ0B3eHMubmwpCisvLyAtIEhlcnbpIERyb2xvbiAoZHJvbG9uQGluZm9uaWUuZnIpCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRnJlZUltYWdlIDMKKy8vCisvLyBDT1ZFUkVEIENPREUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkKKy8vIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTCisvLyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy8vIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVECisvLyBDT0RFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UCisvLyBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWQorLy8gU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTAorLy8gUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUgorLy8gVEhJUyBESVNDTEFJTUVSLgorLy8KKy8vIFVzZSBhdCB5b3VyIG93biByaXNrIQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaW5jbHVkZSAiRnJlZUltYWdlLmgiCisjaW5jbHVkZSAiVXRpbGl0aWVzLmgiCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgQ29uc3RhbnRzICsgaGVhZGVycworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgX1dJTjMyCisjcHJhZ21hIHBhY2socHVzaCwgMSkKKyNlbHNlCisjcHJhZ21hIHBhY2soMSkKKyNlbmRpZgorCisvLyBUaGVzZSBuZXh0IHR3byBzdHJ1Y3RzIHJlcHJlc2VudCBob3cgdGhlIGljb24gaW5mb3JtYXRpb24gaXMgc3RvcmVkCisvLyBpbiBhbiBJQ08gZmlsZS4KKwordHlwZWRlZiBzdHJ1Y3QgdGFnSUNPTkhFQURFUiB7CisJV09SRAkJCWlkUmVzZXJ2ZWQ7ICAgLy8gcmVzZXJ2ZWQKKwlXT1JECQkJaWRUeXBlOyAgICAgICAvLyByZXNvdXJjZSB0eXBlICgxIGZvciBpY29ucykKKwlXT1JECQkJaWRDb3VudDsgICAgICAvLyBob3cgbWFueSBpbWFnZXM/Cit9IElDT05IRUFERVI7CisKK3R5cGVkZWYgc3RydWN0IHRhZ0lDT05ESVJFQ1RPUllFTlRSWSB7CisJQllURQliV2lkdGg7ICAgICAgICAgICAgICAgLy8gd2lkdGggb2YgdGhlIGltYWdlCisJQllURQliSGVpZ2h0OyAgICAgICAgICAgICAgLy8gaGVpZ2h0IG9mIHRoZSBpbWFnZSAodGltZXMgMikKKwlCWVRFCWJDb2xvckNvdW50OyAgICAgICAgICAvLyBudW1iZXIgb2YgY29sb3JzIGluIGltYWdlICgwIGlmID49OGJwcCkKKwlCWVRFCWJSZXNlcnZlZDsgICAgICAgICAgICAvLyByZXNlcnZlZAorCVdPUkQJd1BsYW5lczsgICAgICAgICAgICAgIC8vIGNvbG9yIFBsYW5lcworCVdPUkQJd0JpdENvdW50OyAgICAgICAgICAgIC8vIGJpdHMgcGVyIHBpeGVsCisJRFdPUkQJZHdCeXRlc0luUmVzOyAgICAgICAgIC8vIGhvdyBtYW55IGJ5dGVzIGluIHRoaXMgcmVzb3VyY2U/CisJRFdPUkQJZHdJbWFnZU9mZnNldDsgICAgICAgIC8vIHdoZXJlIGluIHRoZSBmaWxlIGlzIHRoaXMgaW1hZ2UKK30gSUNPTkRJUkVOVFJZOworCisjaWZkZWYgX1dJTjMyCisjcHJhZ21hIHBhY2socG9wKQorI2Vsc2UKKyNwcmFnbWEgcGFjaygpCisjZW5kaWYKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gU3RhdGljIGhlbHBlcnMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLyoqICBIb3cgd2lkZSwgaW4gYnl0ZXMsIHdvdWxkIHRoaXMgbWFueSBiaXRzIGJlLCBEV09SRCBhbGlnbmVkID8KKyovCitzdGF0aWMgaW50IAorV2lkdGhCeXRlcyhpbnQgYml0cykgeworCXJldHVybiAoKCgoYml0cykgKyAzMSk+PjUpPDwyKTsKK30KKworLyoqIENhbGN1bGF0ZXMgdGhlIHNpemUgb2YgYSBzaW5nbGUgaWNvbiBpbWFnZQorQHJldHVybiBSZXR1cm5zIHRoZSBzaXplIGZvciB0aGF0IGltYWdlCisqLworc3RhdGljIERXT1JEIAorQ2FsY3VsYXRlSW1hZ2VTaXplKEZJQklUTUFQKiBpY29uX2RpYikgeworCURXT1JEIGR3TnVtQnl0ZXMgPSAwOworCisJdW5zaWduZWQgY29sb3JzCQk9IEZyZWVJbWFnZV9HZXRDb2xvcnNVc2VkKGljb25fZGliKTsKKwl1bnNpZ25lZCB3aWR0aAkJPSBGcmVlSW1hZ2VfR2V0V2lkdGgoaWNvbl9kaWIpOworCXVuc2lnbmVkIGhlaWdodAkJPSBGcmVlSW1hZ2VfR2V0SGVpZ2h0KGljb25fZGliKTsKKwl1bnNpZ25lZCBwaXRjaAkJPSBGcmVlSW1hZ2VfR2V0UGl0Y2goaWNvbl9kaWIpOworCisJZHdOdW1CeXRlcyA9IHNpemVvZiggQklUTUFQSU5GT0hFQURFUiApOwkvLyBoZWFkZXIKKwlkd051bUJ5dGVzICs9IGNvbG9ycyAqIHNpemVvZihSR0JRVUFEKTsJCS8vIHBhbGV0dGUKKwlkd051bUJ5dGVzICs9IGhlaWdodCAqIHBpdGNoOwkJCQkvLyBYT1IgbWFzaworCWR3TnVtQnl0ZXMgKz0gaGVpZ2h0ICogV2lkdGhCeXRlcyh3aWR0aCk7CS8vIEFORCBtYXNrCisKKwlyZXR1cm4gZHdOdW1CeXRlczsKK30KKworLyoqIENhbGN1bGF0ZXMgdGhlIGZpbGUgb2Zmc2V0IGZvciBhbiBpY29uIGltYWdlCitAcmV0dXJuIFJldHVybnMgdGhlIGZpbGUgb2Zmc2V0IGZvciB0aGF0IGltYWdlCisqLworc3RhdGljIERXT1JEIAorQ2FsY3VsYXRlSW1hZ2VPZmZzZXQoc3RkOjp2ZWN0b3I8RklCSVRNQVAqPiYgdlBhZ2VzLCBpbnQgbkluZGV4ICkgeworCURXT1JECWR3U2l6ZTsKKworICAgIC8vIGNhbGN1bGF0ZSB0aGUgSUNPIGhlYWRlciBzaXplCisgICAgZHdTaXplID0gc2l6ZW9mKElDT05IRUFERVIpOyAKKyAgICAvLyBhZGQgdGhlIElDT05ESVJFTlRSWSdzCisgICAgZHdTaXplICs9IChEV09SRCkoIHZQYWdlcy5zaXplKCkgKiBzaXplb2YoSUNPTkRJUkVOVFJZKSApOworICAgIC8vIGFkZCB0aGUgc2l6ZXMgb2YgdGhlIHByZXZpb3VzIGltYWdlcworICAgIGZvcihpbnQgayA9IDA7IGsgPCBuSW5kZXg7IGsrKykgeworCQlGSUJJVE1BUCAqaWNvbl9kaWIgPSAoRklCSVRNQVAqKXZQYWdlc1trXTsKKwkJZHdTaXplICs9IENhbGN1bGF0ZUltYWdlU2l6ZShpY29uX2RpYik7CisJfQorCisgICAgcmV0dXJuIGR3U2l6ZTsKK30KKworLyoqCitWaXN0YSBpY29uIHN1cHBvcnQKK0ByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHRoZSBiaXRtYXAgZGF0YSBpcyBzdG9yZWQgaW4gUE5HIGZvcm1hdAorKi8KK3N0YXRpYyBCT09MCitJc1BORyhGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUpIHsKKwlCWVRFIHBuZ19zaWduYXR1cmVbOF0gPSB7IDEzNywgODAsIDc4LCA3MSwgMTMsIDEwLCAyNiwgMTAgfTsKKwlCWVRFIHNpZ25hdHVyZVs4XSA9IHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9OworCisJbG9uZyB0ZWxsID0gaW8tPnRlbGxfcHJvYyhoYW5kbGUpOworCWlvLT5yZWFkX3Byb2MoJnNpZ25hdHVyZSwgMSwgOCwgaGFuZGxlKTsKKwlCT09MIGJJc1BORyA9IChtZW1jbXAocG5nX3NpZ25hdHVyZSwgc2lnbmF0dXJlLCA4KSA9PSAwKTsKKwlpby0+c2Vla19wcm9jKGhhbmRsZSwgdGVsbCwgU0VFS19TRVQpOworCisJcmV0dXJuIGJJc1BORzsKK30KKworI2lmZGVmIEZSRUVJTUFHRV9CSUdFTkRJQU4KK3N0YXRpYyB2b2lkCitTd2FwSW5mb0hlYWRlcihCSVRNQVBJTkZPSEVBREVSICpoZWFkZXIpIHsKKwlTd2FwTG9uZygmaGVhZGVyLT5iaVNpemUpOworCVN3YXBMb25nKChEV09SRCAqKSZoZWFkZXItPmJpV2lkdGgpOworCVN3YXBMb25nKChEV09SRCAqKSZoZWFkZXItPmJpSGVpZ2h0KTsKKwlTd2FwU2hvcnQoJmhlYWRlci0+YmlQbGFuZXMpOworCVN3YXBTaG9ydCgmaGVhZGVyLT5iaUJpdENvdW50KTsKKwlTd2FwTG9uZygmaGVhZGVyLT5iaUNvbXByZXNzaW9uKTsKKwlTd2FwTG9uZygmaGVhZGVyLT5iaVNpemVJbWFnZSk7CisJU3dhcExvbmcoKERXT1JEICopJmhlYWRlci0+YmlYUGVsc1Blck1ldGVyKTsKKwlTd2FwTG9uZygoRFdPUkQgKikmaGVhZGVyLT5iaVlQZWxzUGVyTWV0ZXIpOworCVN3YXBMb25nKCZoZWFkZXItPmJpQ2xyVXNlZCk7CisJU3dhcExvbmcoJmhlYWRlci0+YmlDbHJJbXBvcnRhbnQpOworfQorCitzdGF0aWMgdm9pZAorU3dhcEljb25IZWFkZXIoSUNPTkhFQURFUiAqaGVhZGVyKSB7CisJU3dhcFNob3J0KCZoZWFkZXItPmlkUmVzZXJ2ZWQpOworCVN3YXBTaG9ydCgmaGVhZGVyLT5pZFR5cGUpOworCVN3YXBTaG9ydCgmaGVhZGVyLT5pZENvdW50KTsKK30KKworc3RhdGljIHZvaWQKK1N3YXBJY29uRGlyRW50cmllcyhJQ09ORElSRU5UUlkgKmVudCwgaW50IG51bSkgeworCXdoaWxlKG51bSkgeworCQlTd2FwU2hvcnQoJmVudC0+d1BsYW5lcyk7CisJCVN3YXBTaG9ydCgmZW50LT53Qml0Q291bnQpOworCQlTd2FwTG9uZygmZW50LT5kd0J5dGVzSW5SZXMpOworCQlTd2FwTG9uZygmZW50LT5kd0ltYWdlT2Zmc2V0KTsKKwkJbnVtLS07CisJCWVudCsrOworCX0KK30KKyNlbmRpZgorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBQbHVnaW4gSW50ZXJmYWNlCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3N0YXRpYyBpbnQgc19mb3JtYXRfaWQ7CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFBsdWdpbiBJbXBsZW1lbnRhdGlvbgorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgorRm9ybWF0KCkgeworCXJldHVybiAiSUNPIjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKK0Rlc2NyaXB0aW9uKCkgeworCXJldHVybiAiV2luZG93cyBJY29uIjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKK0V4dGVuc2lvbigpIHsKKwlyZXR1cm4gImljbyI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCitSZWdFeHByKCkgeworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgorTWltZVR5cGUoKSB7CisJcmV0dXJuICJpbWFnZS92bmQubWljcm9zb2Z0Lmljb24iOworfQorCitzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYKK1ZhbGlkYXRlKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSkgeworCUlDT05IRUFERVIgaWNvbl9oZWFkZXI7CisKKwlpby0+cmVhZF9wcm9jKCZpY29uX2hlYWRlciwgc2l6ZW9mKElDT05IRUFERVIpLCAxLCBoYW5kbGUpOworI2lmZGVmIEZSRUVJTUFHRV9CSUdFTkRJQU4KKwlTd2FwSWNvbkhlYWRlcigmaWNvbl9oZWFkZXIpOworI2VuZGlmCisKKwlyZXR1cm4gKChpY29uX2hlYWRlci5pZFJlc2VydmVkID09IDApICYmIChpY29uX2hlYWRlci5pZFR5cGUgPT0gMSkgJiYgKGljb25faGVhZGVyLmlkQ291bnQgPiAwKSk7Cit9CisKK3N0YXRpYyBCT09MIERMTF9DQUxMQ09OVgorU3VwcG9ydHNFeHBvcnREZXB0aChpbnQgZGVwdGgpIHsKKwlyZXR1cm4gKAorCQkJKGRlcHRoID09IDEpIHx8CisJCQkoZGVwdGggPT0gNCkgfHwKKwkJCShkZXB0aCA9PSA4KSB8fAorCQkJKGRlcHRoID09IDE2KSB8fAorCQkJKGRlcHRoID09IDI0KSB8fAorCQkJKGRlcHRoID09IDMyKQorCQkpOworfQorCitzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYgCitTdXBwb3J0c0V4cG9ydFR5cGUoRlJFRV9JTUFHRV9UWVBFIHR5cGUpIHsKKwlyZXR1cm4gKHR5cGUgPT0gRklUX0JJVE1BUCkgPyBUUlVFIDogRkFMU0U7Cit9CisKK3N0YXRpYyBCT09MIERMTF9DQUxMQ09OVgorU3VwcG9ydHNOb1BpeGVscygpIHsKKwlyZXR1cm4gVFJVRTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCAqIERMTF9DQUxMQ09OVgorT3BlbihGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIEJPT0wgcmVhZCkgeworCS8vIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGhlYWRlciBzdHJ1Y3R1cmUKKwlJQ09OSEVBREVSICpscElIID0gKElDT05IRUFERVIqKW1hbGxvYyhzaXplb2YoSUNPTkhFQURFUikpOworCWlmKGxwSUggPT0gTlVMTCkgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAocmVhZCkgeworCQkvLyBSZWFkIGluIHRoZSBoZWFkZXIKKwkJaW8tPnJlYWRfcHJvYyhscElILCAxLCBzaXplb2YoSUNPTkhFQURFUiksIGhhbmRsZSk7CisjaWZkZWYgRlJFRUlNQUdFX0JJR0VORElBTgorCQlTd2FwSWNvbkhlYWRlcihscElIKTsKKyNlbmRpZgorCisJCWlmKCEobHBJSC0+aWRSZXNlcnZlZCA9PSAwKSB8fCAhKGxwSUgtPmlkVHlwZSA9PSAxKSkgeworCQkJLy8gTm90IGFuIElDTyBmaWxlCisJCQlmcmVlKGxwSUgpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisJZWxzZSB7CisJCS8vIEZpbGwgdGhlIGhlYWRlcgorCQlscElILT5pZFJlc2VydmVkID0gMDsKKwkJbHBJSC0+aWRUeXBlID0gMTsKKwkJbHBJSC0+aWRDb3VudCA9IDA7CisJfQorCisJcmV0dXJuIGxwSUg7Cit9CisKK3N0YXRpYyB2b2lkIERMTF9DQUxMQ09OVgorQ2xvc2UoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCB2b2lkICpkYXRhKSB7CisJLy8gZnJlZSB0aGUgaGVhZGVyIHN0cnVjdHVyZQorCUlDT05IRUFERVIgKmxwSUggPSAoSUNPTkhFQURFUiopZGF0YTsKKwlmcmVlKGxwSUgpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBpbnQgRExMX0NBTExDT05WCitQYWdlQ291bnQoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCB2b2lkICpkYXRhKSB7CisJSUNPTkhFQURFUiAqbHBJSCA9IChJQ09OSEVBREVSKilkYXRhOworCisJaWYobHBJSCkgeworCQlyZXR1cm4gbHBJSC0+aWRDb3VudDsKKwl9CisJcmV0dXJuIDE7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIEZJQklUTUFQKgorTG9hZFN0YW5kYXJkSWNvbihGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIGludCBmbGFncywgQk9PTCBoZWFkZXJfb25seSkgeworCUZJQklUTUFQICpkaWIgPSBOVUxMOworCisJLy8gbG9hZCB0aGUgQklUTUFQSU5GT0hFQURFUgorCUJJVE1BUElORk9IRUFERVIgYm1paDsKKwlpby0+cmVhZF9wcm9jKCZibWloLCBzaXplb2YoQklUTUFQSU5GT0hFQURFUiksIDEsIGhhbmRsZSk7CisjaWZkZWYgRlJFRUlNQUdFX0JJR0VORElBTgorCVN3YXBJbmZvSGVhZGVyKCZibWloKTsKKyNlbmRpZgorCisJLy8gYWxsb2NhdGUgdGhlIGJpdG1hcAorCWludCB3aWR0aCAgPSBibWloLmJpV2lkdGg7CisJaW50IGhlaWdodCA9IGJtaWguYmlIZWlnaHQgLyAyOyAvLyBoZWlnaHQgPT0geG9yICsgYW5kIG1hc2sKKwl1bnNpZ25lZCBiaXRfY291bnQgPSBibWloLmJpQml0Q291bnQ7CisJdW5zaWduZWQgbGluZSAgID0gQ2FsY3VsYXRlTGluZSh3aWR0aCwgYml0X2NvdW50KTsKKwl1bnNpZ25lZCBwaXRjaCAgPSBDYWxjdWxhdGVQaXRjaChsaW5lKTsKKworCS8vIGFsbG9jYXRlIG1lbW9yeSBmb3Igb25lIGljb24KKworCWRpYiA9IEZyZWVJbWFnZV9BbGxvY2F0ZUhlYWRlcihoZWFkZXJfb25seSwgd2lkdGgsIGhlaWdodCwgYml0X2NvdW50KTsKKworCWlmIChkaWIgPT0gTlVMTCkgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiggYm1paC5iaUJpdENvdW50IDw9IDggKSB7CisJCS8vIHJlYWQgdGhlIHBhbGV0dGUgZGF0YQorCQlpby0+cmVhZF9wcm9jKEZyZWVJbWFnZV9HZXRQYWxldHRlKGRpYiksIENhbGN1bGF0ZVVzZWRQYWxldHRlRW50cmllcyhiaXRfY291bnQpICogc2l6ZW9mKFJHQlFVQUQpLCAxLCBoYW5kbGUpOworI2lmIEZSRUVJTUFHRV9DT0xPUk9SREVSID09IEZSRUVJTUFHRV9DT0xPUk9SREVSX1JHQgorCQlSR0JRVUFEICpwYWwgPSBGcmVlSW1hZ2VfR2V0UGFsZXR0ZShkaWIpOworCQlmb3IodW5zaWduZWQgaSA9IDA7IGkgPCBDYWxjdWxhdGVVc2VkUGFsZXR0ZUVudHJpZXMoYml0X2NvdW50KTsgaSsrKSB7CisJCQlJTlBMQUNFU1dBUChwYWxbaV0ucmdiUmVkLCBwYWxbaV0ucmdiQmx1ZSk7CisJCX0KKyNlbmRpZgorCX0KKwkKKwlpZihoZWFkZXJfb25seSkgeworCQkvLyBoZWFkZXIgb25seSBtb2RlCisJCXJldHVybiBkaWI7CisJfQorCisJLy8gcmVhZCB0aGUgaWNvbgorCWlvLT5yZWFkX3Byb2MoRnJlZUltYWdlX0dldEJpdHMoZGliKSwgaGVpZ2h0ICogcGl0Y2gsIDEsIGhhbmRsZSk7CisKKyNpZmRlZiBGUkVFSU1BR0VfQklHRU5ESUFOCisJaWYgKGJpdF9jb3VudCA9PSAxNikgeworCQlmb3IoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJCVdPUkQgKnBpeGVsID0gKFdPUkQgKilGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCB5KTsKKwkJCWZvcihpbnQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisJCQkJU3dhcFNob3J0KHBpeGVsKTsKKwkJCQlwaXhlbCsrOworCQkJfQorCQl9CisJfQorI2VuZGlmCisjaWYgRlJFRUlNQUdFX0NPTE9ST1JERVIgPT0gRlJFRUlNQUdFX0NPTE9ST1JERVJfUkdCCisJaWYgKGJpdF9jb3VudCA9PSAyNCB8fCBiaXRfY291bnQgPT0gMzIpIHsKKwkJZm9yKGludCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisJCQlCWVRFICpwaXhlbCA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIHkpOworCQkJZm9yKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQlJTlBMQUNFU1dBUChwaXhlbFswXSwgcGl4ZWxbMl0pOworCQkJCXBpeGVsICs9IChiaXRfY291bnQ+PjMpOworCQkJfQorCQl9CisJfQorI2VuZGlmCisJLy8gYml0bWFwIGhhcyBiZWVuIGxvYWRlZCBzdWNjZXNzZnVsbHkhCisKKwkvLyBjb252ZXJ0IHRvIDMyYnBwIGFuZCBnZW5lcmF0ZSBhbiBhbHBoYSBjaGFubmVsCisJLy8gYXBwbHkgdGhlIEFORCBtYXNrIG9ubHkgaWYgdGhlIGltYWdlIGlzIG5vdCAzMiBicHAKKwlpZigoKGZsYWdzICYgSUNPX01BS0VBTFBIQSkgPT0gSUNPX01BS0VBTFBIQSkgJiYgKGJpdF9jb3VudCA8IDMyKSkgeworCQlGSUJJVE1BUCAqZGliMzIgPSBGcmVlSW1hZ2VfQ29udmVydFRvMzJCaXRzKGRpYik7CisJCUZyZWVJbWFnZV9VbmxvYWQoZGliKTsKKworCQlpZiAoZGliMzIgPT0gTlVMTCkgeworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQlpbnQgd2lkdGhfYW5kCT0gV2lkdGhCeXRlcyh3aWR0aCk7CisJCUJZVEUgKmxpbmVfYW5kCT0gKEJZVEUgKiltYWxsb2Mod2lkdGhfYW5kKTsKKworCQlpZiggbGluZV9hbmQgPT0gTlVMTCApIHsKKwkJCUZyZWVJbWFnZV9VbmxvYWQoZGliMzIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQkvL2xvb3AgdGhyb3VnaCBlYWNoIGxpbmUgb2YgdGhlIEFORC1tYXNrIGdlbmVyYXRpbmcgdGhlIGFscGhhIGNoYW5uZWwsIGludmVydCBYT1ItbWFzaworCQlmb3IoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJCVJHQlFVQUQgKnF1YWQgPSAoUkdCUVVBRCAqKUZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIzMiwgeSk7CisJCQlpby0+cmVhZF9wcm9jKGxpbmVfYW5kLCB3aWR0aF9hbmQsIDEsIGhhbmRsZSk7CisJCQlmb3IoaW50IHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworCQkJCXF1YWQtPnJnYlJlc2VydmVkID0gKGxpbmVfYW5kW3g+PjNdICYgKDB4ODAgPj4gKHggJiAweDA3KSkpICE9IDAgPyAwIDogMHhGRjsKKwkJCQlpZiggcXVhZC0+cmdiUmVzZXJ2ZWQgPT0gMCApIHsKKwkJCQkJcXVhZC0+cmdiQmx1ZSBePSAweEZGOworCQkJCQlxdWFkLT5yZ2JHcmVlbiBePSAweEZGOworCQkJCQlxdWFkLT5yZ2JSZWQgXj0gMHhGRjsKKwkJCQl9CisJCQkJcXVhZCsrOworCQkJfQorCQl9CisJCWZyZWUobGluZV9hbmQpOworCisJCXJldHVybiBkaWIzMjsKKwl9CisKKwlyZXR1cm4gZGliOworfQorCitzdGF0aWMgRklCSVRNQVAgKiBETExfQ0FMTENPTlYKK0xvYWQoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBpbnQgcGFnZSwgaW50IGZsYWdzLCB2b2lkICpkYXRhKSB7CisJaWYgKHBhZ2UgPT0gLTEpIHsKKwkJcGFnZSA9IDA7CisJfQorCisJQk9PTCBoZWFkZXJfb25seSA9IChmbGFncyAmIEZJRl9MT0FEX05PUElYRUxTKSA9PSBGSUZfTE9BRF9OT1BJWEVMUzsKKworCWlmIChoYW5kbGUgIT0gTlVMTCkgeworCQlGSUJJVE1BUCAqZGliID0gTlVMTDsKKworCQkvLyBnZXQgdGhlIGljb24gaGVhZGVyCisJCUlDT05IRUFERVIgKmljb25faGVhZGVyID0gKElDT05IRUFERVIqKWRhdGE7CisKKwkJaWYgKGljb25faGVhZGVyKSB7CisJCQkvLyBsb2FkIHRoZSBpY29uIGRlc2NyaXB0aW9ucworCQkJSUNPTkRJUkVOVFJZICppY29uX2xpc3QgPSAoSUNPTkRJUkVOVFJZKiltYWxsb2MoaWNvbl9oZWFkZXItPmlkQ291bnQgKiBzaXplb2YoSUNPTkRJUkVOVFJZKSk7CisJCQlpZihpY29uX2xpc3QgPT0gTlVMTCkgeworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQkJaW8tPnNlZWtfcHJvYyhoYW5kbGUsIHNpemVvZihJQ09OSEVBREVSKSwgU0VFS19TRVQpOworCQkJaW8tPnJlYWRfcHJvYyhpY29uX2xpc3QsIGljb25faGVhZGVyLT5pZENvdW50ICogc2l6ZW9mKElDT05ESVJFTlRSWSksIDEsIGhhbmRsZSk7CisjaWZkZWYgRlJFRUlNQUdFX0JJR0VORElBTgorCQkJU3dhcEljb25EaXJFbnRyaWVzKGljb25fbGlzdCwgaWNvbl9oZWFkZXItPmlkQ291bnQpOworI2VuZGlmCisKKwkJCS8vIGxvYWQgdGhlIHJlcXVlc3RlZCBpY29uCisJCQlpZiAocGFnZSA8IGljb25faGVhZGVyLT5pZENvdW50KSB7CisJCQkJLy8gc2VlayB0byB0aGUgc3RhcnQgb2YgdGhlIGJpdG1hcCBkYXRhIGZvciB0aGUgaWNvbgorCQkJCWlvLT5zZWVrX3Byb2MoaGFuZGxlLCBpY29uX2xpc3RbcGFnZV0uZHdJbWFnZU9mZnNldCwgU0VFS19TRVQpOworCisJCQkJaWYoIElzUE5HKGlvLCBoYW5kbGUpICkgeworCQkJCQkvLyBWaXN0YSBpY29uIHN1cHBvcnQKKwkJCQkJLy8gc2VlIGh0dHA6Ly9ibG9ncy5tc2RuLmNvbS9iL29sZG5ld3RoaW5nL2FyY2hpdmUvMjAxMC8xMC8yMi8xMDA3OTE5Mi5hc3B4CisJCQkJCWRpYiA9IEZyZWVJbWFnZV9Mb2FkRnJvbUhhbmRsZShGSUZfUE5HLCBpbywgaGFuZGxlLCBoZWFkZXJfb25seSA/IEZJRl9MT0FEX05PUElYRUxTIDogUE5HX0RFRkFVTFQpOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJLy8gc3RhbmRhcmQgaWNvbiBzdXBwb3J0CisJCQkJCS8vIHNlZSBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXM5OTc1MzguYXNweAorCQkJCQkvLyBzZWUgaHR0cDovL2Jsb2dzLm1zZG4uY29tL2Ivb2xkbmV3dGhpbmcvYXJjaGl2ZS8yMDEwLzEwLzE4LzEwMDc3MTMzLmFzcHgKKwkJCQkJZGliID0gTG9hZFN0YW5kYXJkSWNvbihpbywgaGFuZGxlLCBmbGFncywgaGVhZGVyX29ubHkpOworCQkJCX0KKworCQkJCWZyZWUoaWNvbl9saXN0KTsKKworCQkJCXJldHVybiBkaWI7CisKKwkJCX0gZWxzZSB7CisJCQkJZnJlZShpY29uX2xpc3QpOworCQkJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhzX2Zvcm1hdF9pZCwgIlBhZ2UgZG9lc24ndCBleGlzdCIpOworCQkJfQorCQl9IGVsc2UgeworCQkJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKHNfZm9ybWF0X2lkLCAiRmlsZSBpcyBub3QgYW4gSUNPIGZpbGUiKTsKKwkJfQorCX0KKworCXJldHVybiBOVUxMOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBCT09MIAorU2F2ZVN0YW5kYXJkSWNvbihGcmVlSW1hZ2VJTyAqaW8sIEZJQklUTUFQICpkaWIsIGZpX2hhbmRsZSBoYW5kbGUpIHsKKwlCSVRNQVBJTkZPSEVBREVSICpibWloID0gTlVMTDsKKworCS8vIHdyaXRlIHRoZSBCSVRNQVBJTkZPSEVBREVSCisJYm1paCA9IEZyZWVJbWFnZV9HZXRJbmZvSGVhZGVyKGRpYik7CisJYm1paC0+YmlIZWlnaHQgKj0gMjsJLy8gaGVpZ2h0ID09IHhvciArIGFuZCBtYXNrCisjaWZkZWYgRlJFRUlNQUdFX0JJR0VORElBTgorCVN3YXBJbmZvSGVhZGVyKGJtaWgpOworI2VuZGlmCisJaW8tPndyaXRlX3Byb2MoYm1paCwgc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpLCAxLCBoYW5kbGUpOworI2lmZGVmIEZSRUVJTUFHRV9CSUdFTkRJQU4KKwlTd2FwSW5mb0hlYWRlcihibWloKTsKKyNlbmRpZgorCWJtaWgtPmJpSGVpZ2h0IC89IDI7CisKKwkvLyB3cml0ZSB0aGUgcGFsZXR0ZSBkYXRhCisJaWYgKEZyZWVJbWFnZV9HZXRQYWxldHRlKGRpYikgIT0gTlVMTCkgeworCQlSR0JRVUFEICpwYWwgPSBGcmVlSW1hZ2VfR2V0UGFsZXR0ZShkaWIpOworCQlGSUxFX0JHUkEgYmdyYTsKKwkJZm9yKHVuc2lnbmVkIGkgPSAwOyBpIDwgRnJlZUltYWdlX0dldENvbG9yc1VzZWQoZGliKTsgaSsrKSB7CisJCQliZ3JhLmIgPSBwYWxbaV0ucmdiQmx1ZTsKKwkJCWJncmEuZyA9IHBhbFtpXS5yZ2JHcmVlbjsKKwkJCWJncmEuciA9IHBhbFtpXS5yZ2JSZWQ7CisJCQliZ3JhLmEgPSBwYWxbaV0ucmdiUmVzZXJ2ZWQ7CisJCQlpby0+d3JpdGVfcHJvYygmYmdyYSwgc2l6ZW9mKEZJTEVfQkdSQSksIDEsIGhhbmRsZSk7CisJCX0KKwl9CisKKwkvLyB3cml0ZSB0aGUgYml0cworCWludCB3aWR0aAkJCT0gYm1paC0+YmlXaWR0aDsKKwlpbnQgaGVpZ2h0CQkJPSBibWloLT5iaUhlaWdodDsKKwl1bnNpZ25lZCBiaXRfY291bnQJPSBibWloLT5iaUJpdENvdW50OworCXVuc2lnbmVkIGxpbmUJCT0gQ2FsY3VsYXRlTGluZSh3aWR0aCwgYml0X2NvdW50KTsKKwl1bnNpZ25lZCBwaXRjaAkJPSBDYWxjdWxhdGVQaXRjaChsaW5lKTsKKwlpbnQgc2l6ZV94b3IJCT0gaGVpZ2h0ICogcGl0Y2g7CisJaW50IHNpemVfYW5kCQk9IGhlaWdodCAqIFdpZHRoQnl0ZXMod2lkdGgpOworCisJLy8gWE9SIG1hc2sKKyNpZmRlZiBGUkVFSU1BR0VfQklHRU5ESUFOCisJaWYgKGJpdF9jb3VudCA9PSAxNikgeworCQlXT1JEIHBpeGVsOworCQlmb3IodW5zaWduZWQgeSA9IDA7IHkgPCBGcmVlSW1hZ2VfR2V0SGVpZ2h0KGRpYik7IHkrKykgeworCQkJQllURSAqbGluZSA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIHkpOworCQkJZm9yKHVuc2lnbmVkIHggPSAwOyB4IDwgRnJlZUltYWdlX0dldFdpZHRoKGRpYik7IHgrKykgeworCQkJCXBpeGVsID0gKChXT1JEICopbGluZSlbeF07CisJCQkJU3dhcFNob3J0KCZwaXhlbCk7CisJCQkJaWYgKGlvLT53cml0ZV9wcm9jKCZwaXhlbCwgc2l6ZW9mKFdPUkQpLCAxLCBoYW5kbGUpICE9IDEpCisJCQkJCXJldHVybiBGQUxTRTsKKwkJCX0KKwkJfQorCX0gZWxzZQorI2VuZGlmCisjaWYgRlJFRUlNQUdFX0NPTE9ST1JERVIgPT0gRlJFRUlNQUdFX0NPTE9ST1JERVJfUkdCCisJaWYgKGJpdF9jb3VudCA9PSAyNCkgeworCQlGSUxFX0JHUiBiZ3I7CisJCWZvcih1bnNpZ25lZCB5ID0gMDsgeSA8IEZyZWVJbWFnZV9HZXRIZWlnaHQoZGliKTsgeSsrKSB7CisJCQlCWVRFICpsaW5lID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgeSk7CisJCQlmb3IodW5zaWduZWQgeCA9IDA7IHggPCBGcmVlSW1hZ2VfR2V0V2lkdGgoZGliKTsgeCsrKSB7CisJCQkJUkdCVFJJUExFICp0cmlwbGUgPSAoKFJHQlRSSVBMRSAqKWxpbmUpK3g7CisJCQkJYmdyLmIgPSB0cmlwbGUtPnJnYnRCbHVlOworCQkJCWJnci5nID0gdHJpcGxlLT5yZ2J0R3JlZW47CisJCQkJYmdyLnIgPSB0cmlwbGUtPnJnYnRSZWQ7CisJCQkJaWYgKGlvLT53cml0ZV9wcm9jKCZiZ3IsIHNpemVvZihGSUxFX0JHUiksIDEsIGhhbmRsZSkgIT0gMSkKKwkJCQkJcmV0dXJuIEZBTFNFOworCQkJfQorCQl9CisJfSBlbHNlIGlmIChiaXRfY291bnQgPT0gMzIpIHsKKwkJRklMRV9CR1JBIGJncmE7CisJCWZvcih1bnNpZ25lZCB5ID0gMDsgeSA8IEZyZWVJbWFnZV9HZXRIZWlnaHQoZGliKTsgeSsrKSB7CisJCQlCWVRFICpsaW5lID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgeSk7CisJCQlmb3IodW5zaWduZWQgeCA9IDA7IHggPCBGcmVlSW1hZ2VfR2V0V2lkdGgoZGliKTsgeCsrKSB7CisJCQkJUkdCUVVBRCAqcXVhZCA9ICgoUkdCUVVBRCAqKWxpbmUpK3g7CisJCQkJYmdyYS5iID0gcXVhZC0+cmdiQmx1ZTsKKwkJCQliZ3JhLmcgPSBxdWFkLT5yZ2JHcmVlbjsKKwkJCQliZ3JhLnIgPSBxdWFkLT5yZ2JSZWQ7CisJCQkJYmdyYS5hID0gcXVhZC0+cmdiUmVzZXJ2ZWQ7CisJCQkJaWYgKGlvLT53cml0ZV9wcm9jKCZiZ3JhLCBzaXplb2YoRklMRV9CR1JBKSwgMSwgaGFuZGxlKSAhPSAxKQorCQkJCQlyZXR1cm4gRkFMU0U7CisJCQl9CisJCX0KKwl9IGVsc2UKKyNlbmRpZgorI2lmIGRlZmluZWQoRlJFRUlNQUdFX0JJR0VORElBTikgfHwgRlJFRUlNQUdFX0NPTE9ST1JERVIgPT0gRlJFRUlNQUdFX0NPTE9ST1JERVJfUkdCCisJeworI2VuZGlmCisJCUJZVEUgKnhvcl9tYXNrID0gRnJlZUltYWdlX0dldEJpdHMoZGliKTsKKwkJaW8tPndyaXRlX3Byb2MoeG9yX21hc2ssIHNpemVfeG9yLCAxLCBoYW5kbGUpOworI2lmIGRlZmluZWQoRlJFRUlNQUdFX0JJR0VORElBTikgfHwgRlJFRUlNQUdFX0NPTE9ST1JERVIgPT0gRlJFRUlNQUdFX0NPTE9ST1JERVJfUkdCCisJfQorI2VuZGlmCisJLy8gQU5EIG1hc2sKKwlCWVRFICphbmRfbWFzayA9IChCWVRFKiltYWxsb2Moc2l6ZV9hbmQpOworCWlmKCFhbmRfbWFzaykgeworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJaWYoRnJlZUltYWdlX0lzVHJhbnNwYXJlbnQoZGliKSkgeworCisJCWlmKGJpdF9jb3VudCA9PSAzMikgeworCQkJLy8gY3JlYXRlIHRoZSBBTkQgbWFzayBmcm9tIHRoZSBhbHBoYSBjaGFubmVsCisKKwkJCWludCB3aWR0aF9hbmQgID0gV2lkdGhCeXRlcyh3aWR0aCk7CisJCQlCWVRFICphbmRfYml0cyA9IGFuZF9tYXNrOworCisJCQkvLyBjbGVhciB0aGUgbWFzaworCQkJbWVtc2V0KGFuZF9tYXNrLCAwLCBzaXplX2FuZCk7CisKKwkJCWZvcihpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworCQkJCVJHQlFVQUQgKmJpdHMgPSAoUkdCUVVBRCopRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgeSk7CisKKwkJCQlmb3IoaW50IHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworCQkJCQlpZihiaXRzW3hdLnJnYlJlc2VydmVkICE9IDB4RkYpIHsKKwkJCQkJCS8vIHNldCBhbnkgdHJhbnNwYXJlbnQgY29sb3IgdG8gZnVsbCB0cmFuc3BhcmVuY3kKKwkJCQkJCWFuZF9iaXRzW3ggPj4gM10gfD0gKDB4ODAgPj4gKHggJiAweDcpKTsgCisJCQkJCX0KKwkJCQl9CisKKwkJCQlhbmRfYml0cyArPSB3aWR0aF9hbmQ7CisJCQl9CisJCX0gCisJCWVsc2UgaWYoYml0X2NvdW50IDw9IDgpIHsKKwkJCS8vIGNyZWF0ZSB0aGUgQU5EIG1hc2sgZnJvbSB0aGUgdHJhbnNwYXJlbmN5IHRhYmxlCisKKwkJCUJZVEUgKnRybnMgPSBGcmVlSW1hZ2VfR2V0VHJhbnNwYXJlbmN5VGFibGUoZGliKTsKKworCQkJaW50IHdpZHRoX2FuZCAgPSBXaWR0aEJ5dGVzKHdpZHRoKTsKKwkJCUJZVEUgKmFuZF9iaXRzID0gYW5kX21hc2s7CisKKwkJCS8vIGNsZWFyIHRoZSBtYXNrCisJCQltZW1zZXQoYW5kX21hc2ssIDAsIHNpemVfYW5kKTsKKworCQkJc3dpdGNoKEZyZWVJbWFnZV9HZXRCUFAoZGliKSkgeworCQkJCWNhc2UgMToKKwkJCQl7CisJCQkJCWZvcihpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworCQkJCQkJQllURSAqYml0cyA9IChCWVRFKilGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCB5KTsKKwkJCQkJCWZvcihpbnQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisJCQkJCQkJLy8gZ2V0IHBpeGVsIGF0ICh4LCB5KQorCQkJCQkJCUJZVEUgaW5kZXggPSAoYml0c1t4ID4+IDNdICYgKDB4ODAgPj4gKHggJiAweDA3KSkpICE9IDA7CisJCQkJCQkJaWYodHJuc1tpbmRleF0gIT0gMHhGRikgeworCQkJCQkJCQkvLyBzZXQgYW55IHRyYW5zcGFyZW50IGNvbG9yIHRvIGZ1bGwgdHJhbnNwYXJlbmN5CisJCQkJCQkJCWFuZF9iaXRzW3ggPj4gM10gfD0gKDB4ODAgPj4gKHggJiAweDcpKTsgCisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJYW5kX2JpdHMgKz0gd2lkdGhfYW5kOworCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCisJCQkJY2FzZSA0OgorCQkJCXsKKwkJCQkJZm9yKGludCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisJCQkJCQlCWVRFICpiaXRzID0gKEJZVEUqKUZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIHkpOworCQkJCQkJZm9yKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQkJCQkvLyBnZXQgcGl4ZWwgYXQgKHgsIHkpCisJCQkJCQkJQllURSBzaGlmdCA9IChCWVRFKSgoMSAtIHggJSAyKSA8PCAyKTsKKwkJCQkJCQlCWVRFIGluZGV4ID0gKGJpdHNbeCA+PiAxXSAmICgweDBGIDw8IHNoaWZ0KSkgPj4gc2hpZnQ7CisJCQkJCQkJaWYodHJuc1tpbmRleF0gIT0gMHhGRikgeworCQkJCQkJCQkvLyBzZXQgYW55IHRyYW5zcGFyZW50IGNvbG9yIHRvIGZ1bGwgdHJhbnNwYXJlbmN5CisJCQkJCQkJCWFuZF9iaXRzW3ggPj4gM10gfD0gKDB4ODAgPj4gKHggJiAweDcpKTsgCisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJYW5kX2JpdHMgKz0gd2lkdGhfYW5kOworCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCisJCQkJY2FzZSA4OgorCQkJCXsKKwkJCQkJZm9yKGludCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisJCQkJCQlCWVRFICpiaXRzID0gKEJZVEUqKUZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIHkpOworCQkJCQkJZm9yKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQkJCQkvLyBnZXQgcGl4ZWwgYXQgKHgsIHkpCisJCQkJCQkJQllURSBpbmRleCA9IGJpdHNbeF07CisJCQkJCQkJaWYodHJuc1tpbmRleF0gIT0gMHhGRikgeworCQkJCQkJCQkvLyBzZXQgYW55IHRyYW5zcGFyZW50IGNvbG9yIHRvIGZ1bGwgdHJhbnNwYXJlbmN5CisJCQkJCQkJCWFuZF9iaXRzW3ggPj4gM10gfD0gKDB4ODAgPj4gKHggJiAweDcpKTsgCisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJYW5kX2JpdHMgKz0gd2lkdGhfYW5kOworCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCisJCQl9CisJCX0KKwl9CisJZWxzZSB7CisJCS8vIGVtcHR5IEFORCBtYXNrCisJCW1lbXNldChhbmRfbWFzaywgMCwgc2l6ZV9hbmQpOworCX0KKworCWlvLT53cml0ZV9wcm9jKGFuZF9tYXNrLCBzaXplX2FuZCwgMSwgaGFuZGxlKTsKKwlmcmVlKGFuZF9tYXNrKTsKKworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYKK1NhdmUoRnJlZUltYWdlSU8gKmlvLCBGSUJJVE1BUCAqZGliLCBmaV9oYW5kbGUgaGFuZGxlLCBpbnQgcGFnZSwgaW50IGZsYWdzLCB2b2lkICpkYXRhKSB7CisJSUNPTkhFQURFUiAqaWNvbl9oZWFkZXIgPSBOVUxMOworCXN0ZDo6dmVjdG9yPEZJQklUTUFQKj4gdlBhZ2VzOworCWludCBrOworCisJaWYoIWRpYiB8fCAhaGFuZGxlIHx8ICFkYXRhKSB7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwkvLyBjaGVjayBmb3JtYXQgbGltaXRzCisJdW5zaWduZWQgdyA9IEZyZWVJbWFnZV9HZXRXaWR0aChkaWIpOworCXVuc2lnbmVkIGggPSBGcmVlSW1hZ2VfR2V0SGVpZ2h0KGRpYik7CisJaWYoKHcgPCAxNikgfHwgKHcgPiAyNTYpIHx8IChoIDwgMTYpIHx8IChoID4gMjU2KSB8fCAodyAhPSBoKSkgeworCQlGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2Moc19mb3JtYXRfaWQsICJVbnN1cHBvcnRlZCBpY29uIHNpemU6IHdpZHRoIHggaGVpZ2h0ID0gJWQgeCAlZCIsIHcsIGgpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJaWYgKHBhZ2UgPT0gLTEpIHsKKwkJcGFnZSA9IDA7CisJfQorCQorCS8vIGdldCB0aGUgaWNvbiBoZWFkZXIKKwlpY29uX2hlYWRlciA9IChJQ09OSEVBREVSKilkYXRhOworCisJdHJ5IHsKKwkJRklCSVRNQVAgKmljb25fZGliID0gTlVMTDsKKworCQkvLyBsb2FkIGFsbCBpY29ucworCQlmb3IoayA9IDA7IGsgPCBpY29uX2hlYWRlci0+aWRDb3VudDsgaysrKSB7CisJCQlpY29uX2RpYiA9IExvYWQoaW8sIGhhbmRsZSwgaywgZmxhZ3MsIGRhdGEpOworCQkJaWYoIWljb25fZGliKSB7CisJCQkJdGhyb3cgRklfTVNHX0VSUk9SX0RJQl9NRU1PUlk7CisJCQl9CisJCQl2UGFnZXMucHVzaF9iYWNrKGljb25fZGliKTsKKwkJfQorCisJCS8vIGFkZCB0aGUgcGFnZQorCQlpY29uX2RpYiA9IEZyZWVJbWFnZV9DbG9uZShkaWIpOworCQl2UGFnZXMucHVzaF9iYWNrKGljb25fZGliKTsKKwkJaWNvbl9oZWFkZXItPmlkQ291bnQrKzsKKworCQkvLyB3cml0ZSB0aGUgaGVhZGVyCisJCWlvLT5zZWVrX3Byb2MoaGFuZGxlLCAwLCBTRUVLX1NFVCk7CisjaWZkZWYgRlJFRUlNQUdFX0JJR0VORElBTgorCQlTd2FwSWNvbkhlYWRlcihpY29uX2hlYWRlcik7CisjZW5kaWYKKwkJaW8tPndyaXRlX3Byb2MoaWNvbl9oZWFkZXIsIHNpemVvZihJQ09OSEVBREVSKSwgMSwgaGFuZGxlKTsKKyNpZmRlZiBGUkVFSU1BR0VfQklHRU5ESUFOCisJCVN3YXBJY29uSGVhZGVyKGljb25faGVhZGVyKTsKKyNlbmRpZgorCisJCS8vIHdyaXRlIGFsbCBpY29ucworCQkvLyAuLi4KKwkJCisJCS8vIHNhdmUgdGhlIGljb24gZGVzY3JpcHRpb25zCisKKwkJSUNPTkRJUkVOVFJZICppY29uX2xpc3QgPSAoSUNPTkRJUkVOVFJZICopbWFsbG9jKGljb25faGVhZGVyLT5pZENvdW50ICogc2l6ZW9mKElDT05ESVJFTlRSWSkpOworCQlpZighaWNvbl9saXN0KSB7CisJCQl0aHJvdyBGSV9NU0dfRVJST1JfTUVNT1JZOworCQl9CisJCW1lbXNldChpY29uX2xpc3QsIDAsIGljb25faGVhZGVyLT5pZENvdW50ICogc2l6ZW9mKElDT05ESVJFTlRSWSkpOworCisJCWZvcihrID0gMDsgayA8IGljb25faGVhZGVyLT5pZENvdW50OyBrKyspIHsKKwkJCWljb25fZGliID0gKEZJQklUTUFQKil2UGFnZXNba107CisKKwkJCS8vIGNvbnZlcnQgaW50ZXJuYWwgZm9ybWF0IHRvIElDT05ESVJFTlRSWQorCQkJLy8gdGFrZSBpbnRvIGFjY291bnQgVmlzdGEgaWNvbnMgd2hvc2Ugc2l6ZSBpcyAyNTZ4MjU2CisJCQljb25zdCBCSVRNQVBJTkZPSEVBREVSICpibWloID0gRnJlZUltYWdlX0dldEluZm9IZWFkZXIoaWNvbl9kaWIpOworCQkJaWNvbl9saXN0W2tdLmJXaWR0aAkJCT0gKGJtaWgtPmJpV2lkdGggPiAyNTUpICA/IDAgOiAoQllURSlibWloLT5iaVdpZHRoOworCQkJaWNvbl9saXN0W2tdLmJIZWlnaHQJCT0gKGJtaWgtPmJpSGVpZ2h0ID4gMjU1KSA/IDAgOiAoQllURSlibWloLT5iaUhlaWdodDsKKwkJCWljb25fbGlzdFtrXS5iUmVzZXJ2ZWQJCT0gMDsKKwkJCWljb25fbGlzdFtrXS53UGxhbmVzCQk9IGJtaWgtPmJpUGxhbmVzOworCQkJaWNvbl9saXN0W2tdLndCaXRDb3VudAkJPSBibWloLT5iaUJpdENvdW50OworCQkJaWYoIChpY29uX2xpc3Rba10ud1BsYW5lcyAqIGljb25fbGlzdFtrXS53Qml0Q291bnQpID49IDggKSB7CisJCQkJaWNvbl9saXN0W2tdLmJDb2xvckNvdW50ID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJaWNvbl9saXN0W2tdLmJDb2xvckNvdW50ID0gKEJZVEUpKDEgPDwgKGljb25fbGlzdFtrXS53UGxhbmVzICogaWNvbl9saXN0W2tdLndCaXRDb3VudCkpOworCQkJfQorCQkJLy8gaW5pdGlhbCBndWVzcyAoY29ycmVjdCBvbmx5IGZvciBzdGFuZGFyZCBpY29ucykKKwkJCWljb25fbGlzdFtrXS5kd0J5dGVzSW5SZXMJPSBDYWxjdWxhdGVJbWFnZVNpemUoaWNvbl9kaWIpOworCQkJaWNvbl9saXN0W2tdLmR3SW1hZ2VPZmZzZXQgPSBDYWxjdWxhdGVJbWFnZU9mZnNldCh2UGFnZXMsIGspOworCQl9CisKKwkJLy8gbWFrZSBhIHJvb20gZm9yIGljb24gZGlyIGVudHJpZXMsIHVudGlsIGxhdGVyIHVwZGF0ZQorCQljb25zdCBsb25nIGRpcmVjdG9yeV9zdGFydCA9IGlvLT50ZWxsX3Byb2MoaGFuZGxlKTsKKwkJaW8tPndyaXRlX3Byb2MoaWNvbl9saXN0LCBzaXplb2YoSUNPTkRJUkVOVFJZKSAqIGljb25faGVhZGVyLT5pZENvdW50LCAxLCBoYW5kbGUpOworCisJCS8vIHdyaXRlIHRoZSBpbWFnZSBiaXRzIGZvciBlYWNoIGltYWdlCisJCQorCQlEV09SRCBkd0ltYWdlT2Zmc2V0ID0gKERXT1JEKWlvLT50ZWxsX3Byb2MoaGFuZGxlKTsKKworCQlmb3IoayA9IDA7IGsgPCBpY29uX2hlYWRlci0+aWRDb3VudDsgaysrKSB7CisJCQlpY29uX2RpYiA9IChGSUJJVE1BUCopdlBhZ2VzW2tdOworCQkJCisJCQlpZigoaWNvbl9saXN0W2tdLmJXaWR0aCA9PSAwKSAmJiAoaWNvbl9saXN0W2tdLmJIZWlnaHQgPT0gMCkpIHsKKwkJCQkvLyBWaXN0YSBpY29uIHN1cHBvcnQKKwkJCQlGcmVlSW1hZ2VfU2F2ZVRvSGFuZGxlKEZJRl9QTkcsIGljb25fZGliLCBpbywgaGFuZGxlLCBQTkdfREVGQVVMVCk7CisJCQl9CisJCQllbHNlIHsKKwkJCQkvLyBzdGFuZGFyZCBpY29uIHN1cHBvcnQKKwkJCQkvLyBzZWUgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zOTk3NTM4LmFzcHgKKwkJCQlTYXZlU3RhbmRhcmRJY29uKGlvLCBpY29uX2RpYiwgaGFuZGxlKTsKKwkJCX0KKworCQkJLy8gdXBkYXRlIElDT05ESVJFTlRSWSBtZW1iZXJzCQkJCisJCQlEV09SRCBkd0J5dGVzSW5SZXMgPSAoRFdPUkQpaW8tPnRlbGxfcHJvYyhoYW5kbGUpIC0gZHdJbWFnZU9mZnNldDsKKwkJCWljb25fbGlzdFtrXS5kd0ltYWdlT2Zmc2V0ID0gZHdJbWFnZU9mZnNldDsKKwkJCWljb25fbGlzdFtrXS5kd0J5dGVzSW5SZXMgID0gZHdCeXRlc0luUmVzOworCQkJZHdJbWFnZU9mZnNldCArPSBkd0J5dGVzSW5SZXM7CisJCX0KKworCQkvLyB1cGRhdGUgdGhlIGljb24gZGVzY3JpcHRpb25zCisJCWNvbnN0IGxvbmcgY3VycmVudF9wb3MgPSBpby0+dGVsbF9wcm9jKGhhbmRsZSk7CisJCWlvLT5zZWVrX3Byb2MoaGFuZGxlLCBkaXJlY3Rvcnlfc3RhcnQsIFNFRUtfU0VUKTsKKyNpZmRlZiBGUkVFSU1BR0VfQklHRU5ESUFOCisJCVN3YXBJY29uRGlyRW50cmllcyhpY29uX2xpc3QsIGljb25faGVhZGVyLT5pZENvdW50KTsKKyNlbmRpZgorCQlpby0+d3JpdGVfcHJvYyhpY29uX2xpc3QsIHNpemVvZihJQ09ORElSRU5UUlkpICogaWNvbl9oZWFkZXItPmlkQ291bnQsIDEsIGhhbmRsZSk7CisJCWlvLT5zZWVrX3Byb2MoaGFuZGxlLCBjdXJyZW50X3BvcywgU0VFS19TRVQpOworCisJCWZyZWUoaWNvbl9saXN0KTsKKworCQkvLyBmcmVlIHRoZSB2ZWN0b3IgY2xhc3MKKwkJZm9yKGsgPSAwOyBrIDwgaWNvbl9oZWFkZXItPmlkQ291bnQ7IGsrKykgeworCQkJaWNvbl9kaWIgPSAoRklCSVRNQVAqKXZQYWdlc1trXTsKKwkJCUZyZWVJbWFnZV9VbmxvYWQoaWNvbl9kaWIpOworCQl9CisKKwkJcmV0dXJuIFRSVUU7CisKKwl9IGNhdGNoKGNvbnN0IGNoYXIgKnRleHQpIHsKKwkJLy8gZnJlZSB0aGUgdmVjdG9yIGNsYXNzCisJCWZvcihzaXplX3QgayA9IDA7IGsgPCB2UGFnZXMuc2l6ZSgpOyBrKyspIHsKKwkJCUZJQklUTUFQICppY29uX2RpYiA9IChGSUJJVE1BUCopdlBhZ2VzW2tdOworCQkJRnJlZUltYWdlX1VubG9hZChpY29uX2RpYik7CisJCX0KKwkJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKHNfZm9ybWF0X2lkLCB0ZXh0KTsKKwkJcmV0dXJuIEZBTFNFOworCX0KK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gICBJbml0CisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3ZvaWQgRExMX0NBTExDT05WCitJbml0SUNPKFBsdWdpbiAqcGx1Z2luLCBpbnQgZm9ybWF0X2lkKSB7CisJc19mb3JtYXRfaWQgPSBmb3JtYXRfaWQ7CisKKwlwbHVnaW4tPmZvcm1hdF9wcm9jID0gRm9ybWF0OworCXBsdWdpbi0+ZGVzY3JpcHRpb25fcHJvYyA9IERlc2NyaXB0aW9uOworCXBsdWdpbi0+ZXh0ZW5zaW9uX3Byb2MgPSBFeHRlbnNpb247CisJcGx1Z2luLT5yZWdleHByX3Byb2MgPSBSZWdFeHByOworCXBsdWdpbi0+b3Blbl9wcm9jID0gT3BlbjsKKwlwbHVnaW4tPmNsb3NlX3Byb2MgPSBDbG9zZTsKKwlwbHVnaW4tPnBhZ2Vjb3VudF9wcm9jID0gUGFnZUNvdW50OworCXBsdWdpbi0+cGFnZWNhcGFiaWxpdHlfcHJvYyA9IE5VTEw7CisJcGx1Z2luLT5sb2FkX3Byb2MgPSBMb2FkOworCXBsdWdpbi0+c2F2ZV9wcm9jID0gU2F2ZTsKKwlwbHVnaW4tPnZhbGlkYXRlX3Byb2MgPSBWYWxpZGF0ZTsKKwlwbHVnaW4tPm1pbWVfcHJvYyA9IE1pbWVUeXBlOworCXBsdWdpbi0+c3VwcG9ydHNfZXhwb3J0X2JwcF9wcm9jID0gU3VwcG9ydHNFeHBvcnREZXB0aDsKKwlwbHVnaW4tPnN1cHBvcnRzX2V4cG9ydF90eXBlX3Byb2MgPSBTdXBwb3J0c0V4cG9ydFR5cGU7CisJcGx1Z2luLT5zdXBwb3J0c19pY2NfcHJvZmlsZXNfcHJvYyA9IE5VTEw7CisJcGx1Z2luLT5zdXBwb3J0c19ub19waXhlbHNfcHJvYyA9IFN1cHBvcnRzTm9QaXhlbHM7Cit9CmRpZmYgLS1naXQgYS9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL1BsdWdpbklGRi5jcHAgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL1BsdWdpbklGRi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUxZjkwMwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvUGx1Z2luSUZGLmNwcApAQCAtMCwwICsxLDQ1OSBAQAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRGVsdXhlIFBhaW50IExvYWRlcgorLy8KKy8vIERlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gYnkKKy8vIC0gRmxvcmlzIHZhbiBkZW4gQmVyZyAoZmx2ZGJlcmdAd3hzLm5sKQorLy8gLSBNYXJrIFNpYmx5IChtYXJrc2libHlAYmxpdHpiYXNpYy5jb20pCisvLyAtIEFhcm9uIFNodW1hdGUgKHRyZWtAc3RhcnRyZWtlci5jb20pCisvLyAtIEhlcnbpIERyb2xvbiAoZHJvbG9uQGluZm9uaWUuZnIpCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRnJlZUltYWdlIDMKKy8vCisvLyBDT1ZFUkVEIENPREUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkKKy8vIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTCisvLyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy8vIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVECisvLyBDT0RFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UCisvLyBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWQorLy8gU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTAorLy8gUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUgorLy8gVEhJUyBESVNDTEFJTUVSLgorLy8KKy8vIFVzZSBhdCB5b3VyIG93biByaXNrIQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaW5jbHVkZSAiRnJlZUltYWdlLmgiCisjaW5jbHVkZSAiVXRpbGl0aWVzLmgiCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBJbnRlcm5hbCB0eXBlZGVmcyBhbmQgc3RydWN0dXJlcworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgX1dJTjMyCisjcHJhZ21hIHBhY2socHVzaCwgMSkKKyNlbHNlCisjcHJhZ21hIHBhY2soMSkKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgV09SRCB3LCBoOyAgICAgICAgICAgICAgICAgICAgLyogcmFzdGVyIHdpZHRoICYgaGVpZ2h0IGluIHBpeGVscyAqLworICAgIFdPUkQgeCwgeTsgICAgICAgICAgICAgICAgICAgIC8qIHBvc2l0aW9uIGZvciB0aGlzIGltYWdlICovCisgICAgQllURSBuUGxhbmVzOyAgICAgICAgICAgICAgICAgLyogIyBzb3VyY2UgYml0cGxhbmVzICovCisgICAgQllURSBtYXNraW5nOyAgICAgICAgICAgICAgICAgLyogbWFza2luZyB0ZWNobmlxdWUgKi8KKyAgICBCWVRFIGNvbXByZXNzaW9uOyAgICAgICAgICAgICAvKiBjb21wcmVzc2lvbiBhbGdvcml0aG0gKi8KKyAgICBCWVRFIHBhZDE7ICAgICAgICAgICAgICAgICAgICAvKiBVTlVTRUQuICBGb3IgY29uc2lzdGVuY3ksIHB1dCAwIGhlcmUuKi8KKyAgICBXT1JEIHRyYW5zcGFyZW50Q29sb3I7ICAgICAgICAvKiB0cmFuc3BhcmVudCAiY29sb3IgbnVtYmVyIiAqLworICAgIEJZVEUgeEFzcGVjdCwgeUFzcGVjdDsgICAgICAgIC8qIGFzcGVjdCByYXRpbywgYSByYXRpb25hbCBudW1iZXIgeC95ICovCisgICAgV09SRCBwYWdlV2lkdGgsIHBhZ2VIZWlnaHQ7ICAgLyogc291cmNlICJwYWdlIiBzaXplIGluIHBpeGVscyAqLworfSBCTUhEOworCisjaWZkZWYgX1dJTjMyCisjcHJhZ21hIHBhY2socG9wKQorI2Vsc2UKKyNwcmFnbWEgcGFjaygpCisjZW5kaWYKKworI2lmbmRlZiBGUkVFSU1BR0VfQklHRU5ESUFOCitzdGF0aWMgdm9pZAorU3dhcEhlYWRlcihCTUhEICpoZWFkZXIpIHsKKwlTd2FwU2hvcnQoJmhlYWRlci0+dyk7CisJU3dhcFNob3J0KCZoZWFkZXItPmgpOworCVN3YXBTaG9ydCgmaGVhZGVyLT54KTsKKwlTd2FwU2hvcnQoJmhlYWRlci0+eSk7CisJU3dhcFNob3J0KCZoZWFkZXItPnRyYW5zcGFyZW50Q29sb3IpOworCVN3YXBTaG9ydCgmaGVhZGVyLT5wYWdlV2lkdGgpOworCVN3YXBTaG9ydCgmaGVhZGVyLT5wYWdlSGVpZ2h0KTsKK30KKyNlbmRpZgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qIElGRiBjaHVuayBJRHMgKi8KKwordHlwZWRlZiBEV09SRCBJRkZfSUQ7CisKKyNkZWZpbmUgTUFLRV9JRChhLCBiLCBjLCBkKSAgICAgICAgICgoSUZGX0lEKShhKTw8MjQgfCAoSUZGX0lEKShiKTw8MTYgfCAoSUZGX0lEKShjKTw8OCB8IChJRkZfSUQpKGQpKQorCisjZGVmaW5lIElEX0ZPUk0gICAgIE1BS0VfSUQoJ0YnLCAnTycsICdSJywgJ00nKSAgICAgLyogRUEgSUZGIDg1IGdyb3VwIGlkZW50aWZpZXIgKi8KKyNkZWZpbmUgSURfQ0FUICAgICAgTUFLRV9JRCgnQycsICdBJywgJ1QnLCAnICcpICAgICAvKiBFQSBJRkYgODUgZ3JvdXAgaWRlbnRpZmllciAqLworI2RlZmluZSBJRF9MSVNUICAgICBNQUtFX0lEKCdMJywgJ0knLCAnUycsICdUJykgICAgIC8qIEVBIElGRiA4NSBncm91cCBpZGVudGlmaWVyICovCisjZGVmaW5lIElEX1BST1AgICAgIE1BS0VfSUQoJ1AnLCAnUicsICdPJywgJ1AnKSAgICAgLyogRUEgSUZGIDg1IGdyb3VwIGlkZW50aWZpZXIgKi8KKyNkZWZpbmUgSURfRU5EICAgICAgTUFLRV9JRCgnRScsICdOJywgJ0QnLCAnICcpICAgICAvKiB1bm9mZmljaWFsIEVORC1vZi1GT1JNIGlkZW50aWZpZXIgKHNlZSBBbWlnYSBSS00gRGV2aWNlcyBFZC4zIHBhZ2UgMzc2KSAqLworCisjZGVmaW5lIElEX0lMQk0gICAgIE1BS0VfSUQoJ0knLCAnTCcsICdCJywgJ00nKSAgICAgLyogRUEgSUZGIDg1IHJhc3RlciBiaXRtYXAgZm9ybSAqLworI2RlZmluZSBJRF9ERUVQICAgICBNQUtFX0lEKCdEJywgJ0UnLCAnRScsICdQJykgICAgIC8qIENodW5reSBwaXhlbCBpbWFnZSBmaWxlcyAoVXNlZCBpbiBUViBQYWludCkgKi8KKyNkZWZpbmUgSURfUkdCOCAgICAgTUFLRV9JRCgnUicsICdHJywgJ0InLCAnOCcpICAgICAvKiBSR0IgaW1hZ2UgZm9ybXMsIFR1cmJvIFNpbHZlciAoSW1wdWxzZSkgKi8KKyNkZWZpbmUgSURfUkdCTiAgICAgTUFLRV9JRCgnUicsICdHJywgJ0InLCAnTicpICAgICAvKiBSR0IgaW1hZ2UgZm9ybXMsIFR1cmJvIFNpbHZlciAoSW1wdWxzZSkgKi8KKyNkZWZpbmUgSURfUEJNICAgICAgTUFLRV9JRCgnUCcsICdCJywgJ00nLCAnICcpICAgICAvKiAyNTYtY29sb3IgY2h1bmt5IGZvcm1hdCAoRFBhaW50IDIgPykgKi8KKyNkZWZpbmUgSURfQUNCTSAgICAgTUFLRV9JRCgnQScsICdDJywgJ0InLCAnTScpICAgICAvKiBBbWlnYSBDb250aWd1b3VzIEJpdG1hcCAoQW1pZ2FCYXNpYykgKi8KKy8qIGdlbmVyaWMgKi8KKyNkZWZpbmUgSURfRlZFUiAgICAgTUFLRV9JRCgnRicsICdWJywgJ0UnLCAnUicpICAgICAvKiBBbWlnYU9TIHZlcnNpb24gc3RyaW5nICovCisjZGVmaW5lIElEX0pVTksgICAgIE1BS0VfSUQoJ0onLCAnVScsICdOJywgJ0snKSAgICAgLyogYWx3YXlzIGlnbm9yZSB0aGlzIGNodW5rICovCisjZGVmaW5lIElEX0FOTk8gICAgIE1BS0VfSUQoJ0EnLCAnTicsICdOJywgJ08nKSAgICAgLyogRUEgSUZGIDg1IEdlbmVyaWMgQW5ub3RhdGlvbiBjaHVuayAqLworI2RlZmluZSBJRF9BVVRIICAgICBNQUtFX0lEKCdBJywgJ1UnLCAnVCcsICdIJykgICAgIC8qIEVBIElGRiA4NSBHZW5lcmljIEF1dGhvciBjaHVuayAqLworI2RlZmluZSBJRF9DSFJTICAgICBNQUtFX0lEKCdDJywgJ0gnLCAnUicsICdTJykgICAgIC8qIEVBIElGRiA4NSBHZW5lcmljIGNoYXJhY3RlciBzdHJpbmcgY2h1bmsgKi8KKyNkZWZpbmUgSURfTkFNRSAgICAgTUFLRV9JRCgnTicsICdBJywgJ00nLCAnRScpICAgICAvKiBFQSBJRkYgODUgR2VuZXJpYyBOYW1lIG9mIGFydCwgbXVzaWMsIGV0Yy4gY2h1bmsgKi8KKyNkZWZpbmUgSURfVEVYVCAgICAgTUFLRV9JRCgnVCcsICdFJywgJ1gnLCAnVCcpICAgICAvKiBFQSBJRkYgODUgR2VuZXJpYyB1bmZvcm1hdHRlZCBBU0NJSSB0ZXh0IGNodW5rICovCisjZGVmaW5lIElEX2NvcHkgICAgIE1BS0VfSUQoJygnLCAnYycsICcpJywgJyAnKSAgICAgLyogRUEgSUZGIDg1IEdlbmVyaWMgQ29weXJpZ2h0IHRleHQgY2h1bmsgKi8KKy8qIElMQk0gY2h1bmtzICovCisjZGVmaW5lIElEX0JNSEQgICAgIE1BS0VfSUQoJ0InLCAnTScsICdIJywgJ0QnKSAgICAgLyogSUxCTSBCaXRtYXBIZWFkZXIgKi8KKyNkZWZpbmUgSURfQ01BUCAgICAgTUFLRV9JRCgnQycsICdNJywgJ0EnLCAnUCcpICAgICAvKiBJTEJNIDhiaXQgUkdCIGNvbG9ybWFwICovCisjZGVmaW5lIElEX0dSQUIgICAgIE1BS0VfSUQoJ0cnLCAnUicsICdBJywgJ0InKSAgICAgLyogSUxCTSAiaG90c3BvdCIgY29vcmRpYW50ZXMgKi8KKyNkZWZpbmUgSURfREVTVCAgICAgTUFLRV9JRCgnRCcsICdFJywgJ1MnLCAnVCcpICAgICAvKiBJTEJNIGRlc3RpbmF0aW9uIGltYWdlIGluZm8gKi8KKyNkZWZpbmUgSURfU1BSVCAgICAgTUFLRV9JRCgnUycsICdQJywgJ1InLCAnVCcpICAgICAvKiBJTEJNIHNwcml0ZSBpZGVudGlmaWVyICovCisjZGVmaW5lIElEX0NBTUcgICAgIE1BS0VfSUQoJ0MnLCAnQScsICdNJywgJ0cnKSAgICAgLyogQW1pZ2Egdmlld3BvcnRtb2RlcyAqLworI2RlZmluZSBJRF9CT0RZICAgICBNQUtFX0lEKCdCJywgJ08nLCAnRCcsICdZJykgICAgIC8qIElMQk0gaW1hZ2UgZGF0YSAqLworI2RlZmluZSBJRF9DUk5HICAgICBNQUtFX0lEKCdDJywgJ1InLCAnTicsICdHJykgICAgIC8qIGNvbG9yIGN5Y2xpbmcgKi8KKyNkZWZpbmUgSURfQ0NSVCAgICAgTUFLRV9JRCgnQycsICdDJywgJ1InLCAnVCcpICAgICAvKiBjb2xvciBjeWNsaW5nICovCisjZGVmaW5lIElEX0NMVVQgICAgIE1BS0VfSUQoJ0MnLCAnTCcsICdVJywgJ1QnKSAgICAgLyogQ29sb3IgTG9va3VwIFRhYmxlIGNodW5rICovCisjZGVmaW5lIElEX0RQSSAgICAgIE1BS0VfSUQoJ0QnLCAnUCcsICdJJywgJyAnKSAgICAgLyogRG90cyBwZXIgaW5jaCBjaHVuayAqLworI2RlZmluZSBJRF9EUFBWICAgICBNQUtFX0lEKCdEJywgJ1AnLCAnUCcsICdWJykgICAgIC8qIERQYWludCBwZXJzcGVjdGl2ZSBjaHVuayAoRUEpICovCisjZGVmaW5lIElEX0RSTkcgICAgIE1BS0VfSUQoJ0QnLCAnUicsICdOJywgJ0cnKSAgICAgLyogRFBhaW50IElWIGVuaGFuY2VkIGNvbG9yIGN5Y2xlIGNodW5rIChFQSkgKi8KKyNkZWZpbmUgSURfRVBTRiAgICAgTUFLRV9JRCgnRScsICdQJywgJ1MnLCAnRicpICAgICAvKiBFbmNhcHN1bGF0ZWQgUG9zdHNjcmlwdCBjaHVuayAqLworI2RlZmluZSBJRF9DTVlLICAgICBNQUtFX0lEKCdDJywgJ00nLCAnWScsICdLJykgICAgIC8qIEN5YW4sIE1hZ2VudGEsIFllbGxvdywgJiBCbGFjayBjb2xvciBtYXAgKFNvZnQtTG9naWspICovCisjZGVmaW5lIElEX0NOQU0gICAgIE1BS0VfSUQoJ0MnLCAnTicsICdBJywgJ00nKSAgICAgLyogQ29sb3IgbmFtaW5nIGNodW5rIChTb2Z0LUxvZ2lrKSAqLworI2RlZmluZSBJRF9QQ0hHICAgICBNQUtFX0lEKCdQJywgJ0MnLCAnSCcsICdHJykgICAgIC8qIExpbmUgYnkgbGluZSBwYWxldHRlIGNvbnRyb2wgaW5mb3JtYXRpb24gKFNlYmFzdGlhbm8gVmlnbmEpICovCisjZGVmaW5lIElEX1BSVlcgICAgIE1BS0VfSUQoJ1AnLCAnUicsICdWJywgJ1cnKSAgICAgLyogQSBtaW5pIGR1cGxpY2F0ZSBJTEJNIHVzZWQgZm9yIHByZXZpZXcgKEdhcnkgQm9uaGFtKSAqLworI2RlZmluZSBJRF9YQk1JICAgICBNQUtFX0lEKCdYJywgJ0InLCAnTScsICdJJykgICAgIC8qIGVYdGVuZGVkIEJpdE1hcCBJbmZvcm1hdGlvbiAoU29mdC1Mb2dpaykgKi8KKyNkZWZpbmUgSURfQ1RCTCAgICAgTUFLRV9JRCgnQycsICdUJywgJ0InLCAnTCcpICAgICAvKiBOZXd0ZWsgRHluYW1pYyBIYW0gY29sb3IgY2h1bmsgKi8KKyNkZWZpbmUgSURfRFlDUCAgICAgTUFLRV9JRCgnRCcsICdZJywgJ0MnLCAnUCcpICAgICAvKiBOZXd0ZWsgRHluYW1pYyBIYW0gY2h1bmsgKi8KKyNkZWZpbmUgSURfU0hBTSAgICAgTUFLRV9JRCgnUycsICdIJywgJ0EnLCAnTScpICAgICAvKiBTbGljZWQgSEFNIGNvbG9yIGNodW5rICovCisjZGVmaW5lIElEX0FCSVQgICAgIE1BS0VfSUQoJ0EnLCAnQicsICdJJywgJ1QnKSAgICAgLyogQUNCTSBib2R5IGNodW5rICovCisjZGVmaW5lIElEX0RDT0wgICAgIE1BS0VfSUQoJ0QnLCAnQycsICdPJywgJ0wnKSAgICAgLyogdW5vZmZpY2lhbCBkaXJlY3QgY29sb3IgKi8KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gUGx1Z2luIEludGVyZmFjZQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitzdGF0aWMgaW50IHNfZm9ybWF0X2lkOworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBQbHVnaW4gSW1wbGVtZW50YXRpb24KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKK0Zvcm1hdCgpIHsKKwlyZXR1cm4gIklGRiI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCitEZXNjcmlwdGlvbigpIHsKKwlyZXR1cm4gIklGRiBJbnRlcmxlYXZlZCBCaXRtYXAiOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgorRXh0ZW5zaW9uKCkgeworCXJldHVybiAiaWZmLGxibSI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCitSZWdFeHByKCkgeworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgorTWltZVR5cGUoKSB7CisJcmV0dXJuICJpbWFnZS94LWlmZiI7Cit9CisKK3N0YXRpYyBCT09MIERMTF9DQUxMQ09OVgorVmFsaWRhdGUoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlKSB7CisJRFdPUkQgdHlwZSA9IDA7CisKKwkvLyByZWFkIGNodW5rIHR5cGUKKwlpby0+cmVhZF9wcm9jKCZ0eXBlLCA0LCAxLCBoYW5kbGUpOworI2lmbmRlZiBGUkVFSU1BR0VfQklHRU5ESUFOCisJU3dhcExvbmcoJnR5cGUpOworI2VuZGlmCisKKwlpZih0eXBlICE9IElEX0ZPUk0pCisJCXJldHVybiBGQUxTRTsKKwkJCisJLy8gc2tpcCA0IGJ5dGVzCisJaW8tPnJlYWRfcHJvYygmdHlwZSwgNCwgMSwgaGFuZGxlKTsKKworCS8vIHJlYWQgY2h1bmsgdHlwZQorCWlvLT5yZWFkX3Byb2MoJnR5cGUsIDQsIDEsIGhhbmRsZSk7CisjaWZuZGVmIEZSRUVJTUFHRV9CSUdFTkRJQU4KKwlTd2FwTG9uZygmdHlwZSk7CisjZW5kaWYKKworCS8vIEZpbGUgZm9ybWF0IDogSURfUEJNID0gUGFja2VkIEJpdG1hcCwgSURfSUxCTSA9IEludGVybGVhdmVkIEJpdG1hcAorCXJldHVybiAodHlwZSA9PSBJRF9JTEJNKSB8fCAodHlwZSA9PSBJRF9QQk0pOworfQorCisKK3N0YXRpYyBCT09MIERMTF9DQUxMQ09OVgorU3VwcG9ydHNFeHBvcnREZXB0aChpbnQgZGVwdGgpIHsKKwlyZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBCT09MIERMTF9DQUxMQ09OViAKK1N1cHBvcnRzRXhwb3J0VHlwZShGUkVFX0lNQUdFX1RZUEUgdHlwZSkgeworCXJldHVybiBGQUxTRTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgRklCSVRNQVAgKiBETExfQ0FMTENPTlYKK0xvYWQoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBpbnQgcGFnZSwgaW50IGZsYWdzLCB2b2lkICpkYXRhKSB7CisJaWYgKGhhbmRsZSAhPSBOVUxMKSB7CisJCUZJQklUTUFQICpkaWIgPSBOVUxMOworCisJCURXT1JEIHR5cGUsIHNpemU7CisKKwkJaW8tPnJlYWRfcHJvYygmdHlwZSwgNCwgMSwgaGFuZGxlKTsKKyNpZm5kZWYgRlJFRUlNQUdFX0JJR0VORElBTgorCQlTd2FwTG9uZygmdHlwZSk7CisjZW5kaWYKKworCQlpZih0eXBlICE9IElEX0ZPUk0pCisJCQlyZXR1cm4gTlVMTDsKKworCQlpby0+cmVhZF9wcm9jKCZzaXplLCA0LCAxLCBoYW5kbGUpOworI2lmbmRlZiBGUkVFSU1BR0VfQklHRU5ESUFOCisJCVN3YXBMb25nKCZzaXplKTsKKyNlbmRpZgorCisJCWlvLT5yZWFkX3Byb2MoJnR5cGUsIDQsIDEsIGhhbmRsZSk7CisjaWZuZGVmIEZSRUVJTUFHRV9CSUdFTkRJQU4KKwkJU3dhcExvbmcoJnR5cGUpOworI2VuZGlmCisKKwkJaWYoKHR5cGUgIT0gSURfSUxCTSkgJiYgKHR5cGUgIT0gSURfUEJNKSkKKwkJCXJldHVybiBOVUxMOworCisJCXNpemUgLT0gNDsKKworCQl1bnNpZ25lZCB3aWR0aCA9IDAsIGhlaWdodCA9IDAsIHBsYW5lcyA9IDAsIGRlcHRoID0gMCwgY29tcCA9IDA7CisKKwkJd2hpbGUgKHNpemUpIHsKKwkJCURXT1JEIGNoX3R5cGUsY2hfc2l6ZTsKKworCQkJaW8tPnJlYWRfcHJvYygmY2hfdHlwZSwgNCwgMSwgaGFuZGxlKTsKKyNpZm5kZWYgRlJFRUlNQUdFX0JJR0VORElBTgorCQkJU3dhcExvbmcoJmNoX3R5cGUpOworI2VuZGlmCisKKwkJCWlvLT5yZWFkX3Byb2MoJmNoX3NpemUsNCwxLGhhbmRsZSApOworI2lmbmRlZiBGUkVFSU1BR0VfQklHRU5ESUFOCisJCQlTd2FwTG9uZygmY2hfc2l6ZSk7CisjZW5kaWYKKworCQkJdW5zaWduZWQgY2hfZW5kID0gaW8tPnRlbGxfcHJvYyhoYW5kbGUpICsgY2hfc2l6ZTsKKworCQkJaWYgKGNoX3R5cGUgPT0gSURfQk1IRCkgewkJCS8vIEJpdG1hcCBIZWFkZXIKKwkJCQlpZiAoZGliKQorCQkJCQlGcmVlSW1hZ2VfVW5sb2FkKGRpYik7CisKKwkJCQlCTUhEIGJtaGQ7CisKKwkJCQlpby0+cmVhZF9wcm9jKCZibWhkLCBzaXplb2YoYm1oZCksIDEsIGhhbmRsZSk7CisjaWZuZGVmIEZSRUVJTUFHRV9CSUdFTkRJQU4KKwkJCQlTd2FwSGVhZGVyKCZibWhkKTsKKyNlbmRpZgorCisJCQkJd2lkdGggPSBibWhkLnc7CisJCQkJaGVpZ2h0ID0gYm1oZC5oOworCQkJCXBsYW5lcyA9IGJtaGQublBsYW5lczsKKwkJCQljb21wID0gYm1oZC5jb21wcmVzc2lvbjsKKworCQkJCWlmKGJtaGQubWFza2luZyAmIDEpCisJCQkJCXBsYW5lcysrOwkvLyB0aGVyZSBpcyBhIG1hc2sgKCAnc3RlbmNpbCcgKQorCisJCQkJaWYgKHBsYW5lcyA+IDggJiYgcGxhbmVzICE9IDI0KQorCQkJCQlyZXR1cm4gTlVMTDsKKworCQkJCWRlcHRoID0gcGxhbmVzID4gOCA/IDI0IDogODsKKworCQkJCWlmKCBkZXB0aCA9PSAyNCApIHsKKwkJCQkJZGliID0gRnJlZUltYWdlX0FsbG9jYXRlKHdpZHRoLCBoZWlnaHQsIGRlcHRoLCBGSV9SR0JBX1JFRF9NQVNLLCBGSV9SR0JBX0dSRUVOX01BU0ssIEZJX1JHQkFfQkxVRV9NQVNLKTsKKwkJCQl9IGVsc2UgeworCQkJCQlkaWIgPSBGcmVlSW1hZ2VfQWxsb2NhdGUod2lkdGgsIGhlaWdodCwgZGVwdGgpOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoY2hfdHlwZSA9PSBJRF9DTUFQKSB7CS8vIFBhbGV0dGUgKENvbG9yIE1hcCkKKwkJCQlpZiAoIWRpYikKKwkJCQkJcmV0dXJuIE5VTEw7CisKKwkJCQlSR0JRVUFEICpwYWwgPSBGcmVlSW1hZ2VfR2V0UGFsZXR0ZShkaWIpOworCQkJCWlmKHBhbCAhPSBOVUxMKSB7CisJCQkJCXVuc2lnbmVkIHBhbGV0dGVfZW50cmllcyA9IE1JTigodW5zaWduZWQpY2hfc2l6ZSAvIDMsIEZyZWVJbWFnZV9HZXRDb2xvcnNVc2VkKGRpYikpOworCQkJCQlmb3IgKHVuc2lnbmVkIGsgPSAwOyBrIDwgcGFsZXR0ZV9lbnRyaWVzOyBrKyspIHsJCQkJCQorCQkJCQkJaW8tPnJlYWRfcHJvYygmcGFsW2tdLnJnYlJlZCwgMSwgMSwgaGFuZGxlICk7CisJCQkJCQlpby0+cmVhZF9wcm9jKCZwYWxba10ucmdiR3JlZW4sIDEsIDEsIGhhbmRsZSApOworCQkJCQkJaW8tPnJlYWRfcHJvYygmcGFsW2tdLnJnYkJsdWUsIDEsIDEsIGhhbmRsZSApOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIGlmIChjaF90eXBlID09IElEX0JPRFkpIHsKKwkJCQlpZiAoIWRpYikKKwkJCQkJcmV0dXJuIE5VTEw7CisKKwkJCQlpZiAodHlwZSA9PSBJRF9QQk0pIHsKKwkJCQkJLy8gTk9OIElOVEVSTEFDRUQgKExCTSkKKworCQkJCQl1bnNpZ25lZCBsaW5lID0gRnJlZUltYWdlX0dldExpbmUoZGliKSArIDEgJiB+MTsKKwkJCQkJCisJCQkJCWZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBGcmVlSW1hZ2VfR2V0SGVpZ2h0KGRpYik7IGkrKykgeworCQkJCQkJQllURSAqYml0cyA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIEZyZWVJbWFnZV9HZXRIZWlnaHQoZGliKSAtIGkgLSAxKTsKKworCQkJCQkJaWYgKGNvbXAgPT0gMSkgeworCQkJCQkJCS8vIHVzZSBSTEUgY29tcHJlc3Npb24KKworCQkJCQkJCURXT1JEIG51bWJlcl9vZl9ieXRlc193cml0dGVuID0gMDsKKwkJCQkJCQlCWVRFIHJsZV9jb3VudDsKKwkJCQkJCQlCWVRFIGJ5dGU7CisKKwkJCQkJCQl3aGlsZSAobnVtYmVyX29mX2J5dGVzX3dyaXR0ZW4gPCBsaW5lKSB7CisJCQkJCQkJCWlvLT5yZWFkX3Byb2MoJnJsZV9jb3VudCwgMSwgMSwgaGFuZGxlKTsKKworCQkJCQkJCQlpZiAocmxlX2NvdW50IDwgMTI4KSB7CisJCQkJCQkJCQlmb3IgKGludCBrID0gMDsgayA8IHJsZV9jb3VudCArIDE7IGsrKykgeworCQkJCQkJCQkJCWlvLT5yZWFkX3Byb2MoJmJ5dGUsIDEsIDEsIGhhbmRsZSk7CisKKwkJCQkJCQkJCQliaXRzW251bWJlcl9vZl9ieXRlc193cml0dGVuKytdICs9IGJ5dGU7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0gZWxzZSBpZiAocmxlX2NvdW50ID4gMTI4KSB7CisJCQkJCQkJCQlpby0+cmVhZF9wcm9jKCZieXRlLCAxLCAxLCBoYW5kbGUpOworCisJCQkJCQkJCQlmb3IgKGludCBrID0gMDsgayA8IDI1NyAtIHJsZV9jb3VudDsgaysrKSB7CisJCQkJCQkJCQkJYml0c1tudW1iZXJfb2ZfYnl0ZXNfd3JpdHRlbisrXSArPSBieXRlOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkvLyBkb24ndCB1c2UgY29tcHJlc3Npb24KKworCQkJCQkJCWlvLT5yZWFkX3Byb2MoYml0cywgbGluZSwgMSwgaGFuZGxlKTsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCXJldHVybiBkaWI7CisJCQkJfSBlbHNlIHsKKwkJCQkJLy8gSU5URVJMQUNFRCAoSUxCTSkKKworCQkJCQl1bnNpZ25lZCBwaXhlbF9zaXplID0gZGVwdGgvODsKKwkJCQkJdW5zaWduZWQgbl93aWR0aD0od2lkdGgrMTUpJn4xNTsKKwkJCQkJdW5zaWduZWQgcGxhbmVfc2l6ZSA9IG5fd2lkdGgvODsKKwkJCQkJdW5zaWduZWQgc3JjX3NpemUgPSBwbGFuZV9zaXplICogcGxhbmVzOworCQkJCQlCWVRFICpzcmMgPSAoQllURSopbWFsbG9jKHNyY19zaXplKTsKKwkJCQkJQllURSAqZGVzdCA9IEZyZWVJbWFnZV9HZXRCaXRzKGRpYik7CisKKwkJCQkJZGVzdCArPSBGcmVlSW1hZ2VfR2V0UGl0Y2goZGliKSAqIGhlaWdodDsKKworCQkJCQlmb3IgKHVuc2lnbmVkIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJCQkJCWRlc3QgLT0gRnJlZUltYWdlX0dldFBpdGNoKGRpYik7CisKKwkJCQkJCS8vIHJlYWQgYWxsIHBsYW5lcyBpbiBvbmUgaGl0LAorCQkJCQkJLy8gJ2NveiBQU1AgY29tcHJlc3NlcyBhY3Jvc3MgcGxhbmVzLi4uCisKKwkJCQkJCWlmIChjb21wKSB7CisJCQkJCQkJLy8gdW5wYWNrZXIgYWxnb3JpdGhtCisKKwkJCQkJCQlmb3IodW5zaWduZWQgeCA9IDA7IHggPCBzcmNfc2l6ZTspIHsKKwkJCQkJCQkJLy8gcmVhZCB0aGUgbmV4dCBzb3VyY2UgYnl0ZSBpbnRvIHQKKwkJCQkJCQkJc2lnbmVkIGNoYXIgdCA9IDA7CisJCQkJCQkJCWlvLT5yZWFkX3Byb2MoJnQsIDEsIDEsIGhhbmRsZSk7CisJCQkJCQkJCQorCQkJCQkJCQlpZiAodCA+PSAwKSB7CisJCQkJCQkJCQkvLyB0ID0gWzAuLjEyN10gPT4gY29weSB0aGUgbmV4dCB0KzEgYnl0ZXMgbGl0ZXJhbGx5CisJCQkJCQkJCQl1bnNpZ25lZCBzaXplX3RvX3JlYWQgPSB0ICsgMTsKKworCQkJCQkJCQkJaWYoKHNpemVfdG9fcmVhZCArIHgpID4gc3JjX3NpemUpIHsKKwkJCQkJCQkJCQkvLyBzYW5pdHkgY2hlY2sgZm9yIGJ1ZmZlciBvdmVycnVucyAKKwkJCQkJCQkJCQlzaXplX3RvX3JlYWQgPSBzcmNfc2l6ZSAtIHg7CisJCQkJCQkJCQkJaW8tPnJlYWRfcHJvYyhzcmMgKyB4LCBzaXplX3RvX3JlYWQsIDEsIGhhbmRsZSk7CisJCQkJCQkJCQkJeCArPSAodCArIDEpOworCQkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCQlpby0+cmVhZF9wcm9jKHNyYyArIHgsIHNpemVfdG9fcmVhZCwgMSwgaGFuZGxlKTsKKwkJCQkJCQkJCQl4ICs9IHNpemVfdG9fcmVhZDsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfSBlbHNlIGlmICh0ICE9IC0xMjgpIHsKKwkJCQkJCQkJCS8vIHQgPSBbLTEuLi0xMjddICA9PiByZXBsaWNhdGUgdGhlIG5leHQgYnl0ZSAtdCsxIHRpbWVzCisJCQkJCQkJCQlCWVRFIGIgPSAwOworCQkJCQkJCQkJaW8tPnJlYWRfcHJvYygmYiwgMSwgMSwgaGFuZGxlKTsKKwkJCQkJCQkJCXVuc2lnbmVkIHNpemVfdG9fY29weSA9ICh1bnNpZ25lZCkoLShpbnQpdCArIDEpOworCisJCQkJCQkJCQlpZigoc2l6ZV90b19jb3B5ICsgeCkgPiBzcmNfc2l6ZSkgeworCQkJCQkJCQkJCS8vIHNhbml0eSBjaGVjayBmb3IgYnVmZmVyIG92ZXJydW5zIAorCQkJCQkJCQkJCXNpemVfdG9fY29weSA9IHNyY19zaXplIC0geDsKKwkJCQkJCQkJCQltZW1zZXQoc3JjICsgeCwgYiwgc2l6ZV90b19jb3B5KTsKKwkJCQkJCQkJCQl4ICs9ICh1bnNpZ25lZCkoLShpbnQpdCArIDEpOworCQkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCQltZW1zZXQoc3JjICsgeCwgYiwgc2l6ZV90b19jb3B5KTsKKwkJCQkJCQkJCQl4ICs9IHNpemVfdG9fY29weTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCQkvLyB0ID0gLTEyOCA9PiBub29wCisJCQkJCQkJfQorCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlpby0+cmVhZF9wcm9jKHNyYywgc3JjX3NpemUsIDEsIGhhbmRsZSk7CisJCQkJCQl9CisKKwkJCQkJCS8vIGxhenkgcGxhbmFyLT5jaHVua3kuLi4KKworCQkJCQkJZm9yICh1bnNpZ25lZCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQkJCQlmb3IgKHVuc2lnbmVkIG4gPSAwOyBuIDwgcGxhbmVzOyBuKyspIHsKKwkJCQkJCQkJQllURSBiaXQgPSAoQllURSkoIHNyY1tuICogcGxhbmVfc2l6ZSArICh4IC8gOCldID4+ICgoeF43KSAmIDcpICk7CisKKwkJCQkJCQkJZGVzdFt4ICogcGl4ZWxfc2l6ZSArIChuIC8gOCldIHw9IChiaXQgJiAxKSA8PCAobiAmIDcpOworCQkJCQkJCX0KKwkJCQkJCX0KKworI2lmIEZSRUVJTUFHRV9DT0xPUk9SREVSID09IEZSRUVJTUFHRV9DT0xPUk9SREVSX0JHUgorCQkJCQkJaWYgKGRlcHRoID09IDI0KSB7CisJCQkJCQkJZm9yICh1bnNpZ25lZCB4ID0gMDsgeCA8IHdpZHRoOyArK3gpeworCQkJCQkJCQlJTlBMQUNFU1dBUChkZXN0W3ggKiAzXSwgZGVzdFt4ICogMyArIDJdKTsKKwkJCQkJCQl9CisJCQkJCQl9CisjZW5kaWYKKwkJCQkJfQorCisJCQkJCWZyZWUoc3JjKTsKKworCQkJCQlyZXR1cm4gZGliOworCQkJCX0KKwkJCX0KKworCQkJLy8gRXZlcnkgb2RkLWxlbmd0aCBjaHVuayBpcyBmb2xsb3dlZCBieSBhIDAgcGFkIGJ5dGUuICBUaGlzIHBhZAorCQkJLy8gIGJ5dGUgaXMgbm90IGNvdW50ZWQgaW4gY2hfc2l6ZS4KKwkJCWlmIChjaF9zaXplICYgMSkgeworCQkJCWNoX3NpemUrKzsKKwkJCQljaF9lbmQrKzsKKwkJCX0KKworCQkJaW8tPnNlZWtfcHJvYyhoYW5kbGUsIGNoX2VuZCAtIGlvLT50ZWxsX3Byb2MoaGFuZGxlKSwgU0VFS19DVVIpOworCisJCQlzaXplIC09IGNoX3NpemUgKyA4OworCQl9CisKKwkJaWYgKGRpYikKKwkJCUZyZWVJbWFnZV9VbmxvYWQoZGliKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gICBJbml0CisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3ZvaWQgRExMX0NBTExDT05WCitJbml0SUZGKFBsdWdpbiAqcGx1Z2luLCBpbnQgZm9ybWF0X2lkKSB7CisJc19mb3JtYXRfaWQgPSBmb3JtYXRfaWQ7CisKKwlwbHVnaW4tPmZvcm1hdF9wcm9jID0gRm9ybWF0OworCXBsdWdpbi0+ZGVzY3JpcHRpb25fcHJvYyA9IERlc2NyaXB0aW9uOworCXBsdWdpbi0+ZXh0ZW5zaW9uX3Byb2MgPSBFeHRlbnNpb247CisJcGx1Z2luLT5yZWdleHByX3Byb2MgPSBSZWdFeHByOworCXBsdWdpbi0+b3Blbl9wcm9jID0gTlVMTDsKKwlwbHVnaW4tPmNsb3NlX3Byb2MgPSBOVUxMOworCXBsdWdpbi0+cGFnZWNvdW50X3Byb2MgPSBOVUxMOworCXBsdWdpbi0+cGFnZWNhcGFiaWxpdHlfcHJvYyA9IE5VTEw7CisJcGx1Z2luLT5sb2FkX3Byb2MgPSBMb2FkOworCXBsdWdpbi0+c2F2ZV9wcm9jID0gTlVMTDsKKwlwbHVnaW4tPnZhbGlkYXRlX3Byb2MgPSBWYWxpZGF0ZTsKKwlwbHVnaW4tPm1pbWVfcHJvYyA9IE1pbWVUeXBlOworCXBsdWdpbi0+c3VwcG9ydHNfZXhwb3J0X2JwcF9wcm9jID0gU3VwcG9ydHNFeHBvcnREZXB0aDsKKwlwbHVnaW4tPnN1cHBvcnRzX2V4cG9ydF90eXBlX3Byb2MgPSBTdXBwb3J0c0V4cG9ydFR5cGU7CisJcGx1Z2luLT5zdXBwb3J0c19pY2NfcHJvZmlsZXNfcHJvYyA9IE5VTEw7Cit9CmRpZmYgLS1naXQgYS9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL1BsdWdpbkoySy5jcHAgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL1BsdWdpbkoySy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRkZGYxZAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvUGx1Z2luSjJLLmNwcApAQCAtMCwwICsxLDMyOCBAQAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gSlBFRzIwMDAgSjJLIGNvZGVzdHJlYW0gTG9hZGVyIGFuZCBXcml0ZXIKKy8vCisvLyBEZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIGJ5CisvLyAtIEhlcnbDqSBEcm9sb24gKGRyb2xvbkBpbmZvbmllLmZyKQorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZyZWVJbWFnZSAzCisvLworLy8gQ09WRVJFRCBDT0RFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZCisvLyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUworLy8gVEhBVCBUSEUgQ09WRVJFRCBDT0RFIElTIEZSRUUgT0YgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisvLyBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRAorLy8gQ09ERSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVAorLy8gVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GIEFOWSBORUNFU1NBUlkKKy8vIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwKKy8vIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIKKy8vIFRISVMgRElTQ0xBSU1FUi4KKy8vCisvLyBVc2UgYXQgeW91ciBvd24gcmlzayEKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2luY2x1ZGUgIkZyZWVJbWFnZS5oIgorI2luY2x1ZGUgIlV0aWxpdGllcy5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L29wZW5qcGVnMi9zcmMvbGliL29wZW5qcDIvb3BlbmpwZWcuaCIKKyNpbmNsdWRlICJKMktIZWxwZXIuaCIKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gUGx1Z2luIEludGVyZmFjZQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitzdGF0aWMgaW50IHNfZm9ybWF0X2lkOworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBJbnRlcm5hbCBmdW5jdGlvbnMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLyoqCitPcGVuSlBFRyBFcnJvciBjYWxsYmFjayAKKyovCitzdGF0aWMgdm9pZCBqMmtfZXJyb3JfY2FsbGJhY2soY29uc3QgY2hhciAqbXNnLCB2b2lkICpjbGllbnRfZGF0YSkgeworCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhzX2Zvcm1hdF9pZCwgIkVycm9yOiAlcyIsIG1zZyk7Cit9CisvKioKK09wZW5KUEVHIFdhcm5pbmcgY2FsbGJhY2sgCisqLworc3RhdGljIHZvaWQgajJrX3dhcm5pbmdfY2FsbGJhY2soY29uc3QgY2hhciAqbXNnLCB2b2lkICpjbGllbnRfZGF0YSkgeworCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhzX2Zvcm1hdF9pZCwgIldhcm5pbmc6ICVzIiwgbXNnKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gUGx1Z2luIEltcGxlbWVudGF0aW9uCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3N0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCitGb3JtYXQoKSB7CisJcmV0dXJuICJKMksiOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgorRGVzY3JpcHRpb24oKSB7CisJcmV0dXJuICJKUEVHLTIwMDAgY29kZXN0cmVhbSI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCitFeHRlbnNpb24oKSB7CisJcmV0dXJuICJqMmssajJjIjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKK1JlZ0V4cHIoKSB7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCitNaW1lVHlwZSgpIHsKKwlyZXR1cm4gImltYWdlL2oyayI7Cit9CisKK3N0YXRpYyBCT09MIERMTF9DQUxMQ09OVgorVmFsaWRhdGUoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlKSB7CisJQllURSBqcGNfc2lnbmF0dXJlW10gPSB7IDB4RkYsIDB4NEYgfTsKKwlCWVRFIHNpZ25hdHVyZVsyXSA9IHsgMCwgMCB9OworCisJbG9uZyB0ZWxsID0gaW8tPnRlbGxfcHJvYyhoYW5kbGUpOworCWlvLT5yZWFkX3Byb2Moc2lnbmF0dXJlLCAxLCBzaXplb2YoanBjX3NpZ25hdHVyZSksIGhhbmRsZSk7CisJaW8tPnNlZWtfcHJvYyhoYW5kbGUsIHRlbGwsIFNFRUtfU0VUKTsKKworCXJldHVybiAobWVtY21wKGpwY19zaWduYXR1cmUsIHNpZ25hdHVyZSwgc2l6ZW9mKGpwY19zaWduYXR1cmUpKSA9PSAwKTsKK30KKworc3RhdGljIEJPT0wgRExMX0NBTExDT05WCitTdXBwb3J0c0V4cG9ydERlcHRoKGludCBkZXB0aCkgeworCXJldHVybiAoCisJCShkZXB0aCA9PSA4KSB8fAorCQkoZGVwdGggPT0gMjQpIHx8IAorCQkoZGVwdGggPT0gMzIpCisJKTsKK30KKworc3RhdGljIEJPT0wgRExMX0NBTExDT05WIAorU3VwcG9ydHNFeHBvcnRUeXBlKEZSRUVfSU1BR0VfVFlQRSB0eXBlKSB7CisJcmV0dXJuICgKKwkJKHR5cGUgPT0gRklUX0JJVE1BUCkgIHx8CisJCSh0eXBlID09IEZJVF9VSU5UMTYpICB8fAorCQkodHlwZSA9PSBGSVRfUkdCMTYpIHx8IAorCQkodHlwZSA9PSBGSVRfUkdCQTE2KQorCSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgKiBETExfQ0FMTENPTlYKK09wZW4oRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBCT09MIHJlYWQpIHsKKwkvLyBjcmVhdGUgdGhlIHN0cmVhbSB3cmFwcGVyCisJSjJLRklPX3QgKmZpbyA9IG9wal9mcmVlaW1hZ2Vfc3RyZWFtX2NyZWF0ZShpbywgaGFuZGxlLCByZWFkKTsKKwlyZXR1cm4gZmlvOworfQorCitzdGF0aWMgdm9pZCBETExfQ0FMTENPTlYKK0Nsb3NlKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSwgdm9pZCAqZGF0YSkgeworCS8vIGRlc3Ryb3kgdGhlIHN0cmVhbSB3cmFwcGVyCisJSjJLRklPX3QgKmZpbyA9IChKMktGSU9fdCopZGF0YTsKKwlvcGpfZnJlZWltYWdlX3N0cmVhbV9kZXN0cm95KGZpbyk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIEZJQklUTUFQICogRExMX0NBTExDT05WCitMb2FkKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSwgaW50IHBhZ2UsIGludCBmbGFncywgdm9pZCAqZGF0YSkgeworCUoyS0ZJT190ICpmaW8gPSAoSjJLRklPX3QqKWRhdGE7CisJaWYgKGhhbmRsZSAmJiBmaW8pIHsKKwkJb3BqX2NvZGVjX3QgKmRfY29kZWMgPSBOVUxMOwkvLyBoYW5kbGUgdG8gYSBkZWNvbXByZXNzb3IKKwkJb3BqX2RwYXJhbWV0ZXJzX3QgcGFyYW1ldGVyczsJLy8gZGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzCisJCW9wal9pbWFnZV90ICppbWFnZSA9IE5VTEw7CQkvLyBkZWNvZGVkIGltYWdlIAorCisJCUZJQklUTUFQICpkaWIgPSBOVUxMOworCisJCS8vIGNoZWNrIHRoZSBmaWxlIGZvcm1hdAorCQlpZighVmFsaWRhdGUoaW8sIGhhbmRsZSkpIHsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJQk9PTCBoZWFkZXJfb25seSA9IChmbGFncyAmIEZJRl9MT0FEX05PUElYRUxTKSA9PSBGSUZfTE9BRF9OT1BJWEVMUzsKKworCQkvLyBnZXQgdGhlIE9wZW5KUEVHIHN0cmVhbQorCQlvcGpfc3RyZWFtX3QgKmRfc3RyZWFtID0gZmlvLT5zdHJlYW07CisKKwkJLy8gc2V0IGRlY29kaW5nIHBhcmFtZXRlcnMgdG8gZGVmYXVsdCB2YWx1ZXMgCisJCW9wal9zZXRfZGVmYXVsdF9kZWNvZGVyX3BhcmFtZXRlcnMoJnBhcmFtZXRlcnMpOworCisJCXRyeSB7CisJCQkvLyBkZWNvZGUgdGhlIEpQRUctMjAwMCBjb2Rlc3RyZWFtCisKKwkJCS8vIGdldCBhIGRlY29kZXIgaGFuZGxlCisJCQlkX2NvZGVjID0gb3BqX2NyZWF0ZV9kZWNvbXByZXNzKE9QSl9DT0RFQ19KMkspOworCQkJCisJCQkvLyBjb25maWd1cmUgdGhlIGV2ZW50IGNhbGxiYWNrcworCQkJLy8gY2F0Y2ggZXZlbnRzIHVzaW5nIG91ciBjYWxsYmFja3MgKG5vIGxvY2FsIGNvbnRleHQgbmVlZGVkIGhlcmUpCisJCQlvcGpfc2V0X2luZm9faGFuZGxlcihkX2NvZGVjLCBOVUxMLCBOVUxMKTsKKwkJCW9wal9zZXRfd2FybmluZ19oYW5kbGVyKGRfY29kZWMsIGoya193YXJuaW5nX2NhbGxiYWNrLCBOVUxMKTsKKwkJCW9wal9zZXRfZXJyb3JfaGFuZGxlcihkX2NvZGVjLCBqMmtfZXJyb3JfY2FsbGJhY2ssIE5VTEwpOworCisJCQkvLyBzZXR1cCB0aGUgZGVjb2RlciBkZWNvZGluZyBwYXJhbWV0ZXJzIHVzaW5nIHVzZXIgcGFyYW1ldGVycworCQkJaWYoICFvcGpfc2V0dXBfZGVjb2RlcihkX2NvZGVjLCAmcGFyYW1ldGVycykgKSB7CisJCQkJdGhyb3cgIkZhaWxlZCB0byBzZXR1cCB0aGUgZGVjb2RlclxuIjsKKwkJCX0KKwkJCQorCQkJLy8gcmVhZCB0aGUgbWFpbiBoZWFkZXIgb2YgdGhlIGNvZGVzdHJlYW0gYW5kIGlmIG5lY2Vzc2FyeSB0aGUgSlAyIGJveGVzCisJCQlpZiggIW9wal9yZWFkX2hlYWRlcihkX3N0cmVhbSwgZF9jb2RlYywgJmltYWdlKSkgeworCQkJCXRocm93ICJGYWlsZWQgdG8gcmVhZCB0aGUgaGVhZGVyXG4iOworCQkJfQorCisJCQkvLyAtLS0gaGVhZGVyIG9ubHkgbW9kZQorCisJCQlpZiAoaGVhZGVyX29ubHkpIHsKKwkJCQkvLyBjcmVhdGUgb3V0cHV0IGltYWdlIAorCQkJCWRpYiA9IEoyS0ltYWdlVG9GSUJJVE1BUChzX2Zvcm1hdF9pZCwgaW1hZ2UsIGhlYWRlcl9vbmx5KTsKKwkJCQlpZighZGliKSB7CisJCQkJCXRocm93ICJGYWlsZWQgdG8gaW1wb3J0IEpQRUcyMDAwIGltYWdlIjsKKwkJCQl9CisJCQkJLy8gY2xlYW4tdXAgYW5kIHJldHVybiBoZWFkZXIgZGF0YQorCQkJCW9wal9kZXN0cm95X2NvZGVjKGRfY29kZWMpOworCQkJCW9wal9pbWFnZV9kZXN0cm95KGltYWdlKTsKKwkJCQlyZXR1cm4gZGliOworCQkJfQorCisJCQkvLyBkZWNvZGUgdGhlIHN0cmVhbSBhbmQgZmlsbCB0aGUgaW1hZ2Ugc3RydWN0dXJlIAorCQkJaWYoICEoIG9wal9kZWNvZGUoZF9jb2RlYywgZF9zdHJlYW0sIGltYWdlKSAmJiBvcGpfZW5kX2RlY29tcHJlc3MoZF9jb2RlYywgZF9zdHJlYW0pICkgKSB7CisJCQkJdGhyb3cgIkZhaWxlZCB0byBkZWNvZGUgaW1hZ2UhXG4iOworCQkJfQorCisJCQkvLyBmcmVlIHRoZSBjb2RlYyBjb250ZXh0CisJCQlvcGpfZGVzdHJveV9jb2RlYyhkX2NvZGVjKTsKKwkJCWRfY29kZWMgPSBOVUxMOworCisJCQkvLyBjcmVhdGUgb3V0cHV0IGltYWdlIAorCQkJZGliID0gSjJLSW1hZ2VUb0ZJQklUTUFQKHNfZm9ybWF0X2lkLCBpbWFnZSwgaGVhZGVyX29ubHkpOworCQkJaWYoIWRpYikgeworCQkJCXRocm93ICJGYWlsZWQgdG8gaW1wb3J0IEpQRUcyMDAwIGltYWdlIjsKKwkJCX0KKworCQkJLy8gZnJlZSBpbWFnZSBkYXRhIHN0cnVjdHVyZQorCQkJb3BqX2ltYWdlX2Rlc3Ryb3koaW1hZ2UpOworCisJCQlyZXR1cm4gZGliOworCisJCX0gY2F0Y2ggKGNvbnN0IGNoYXIgKnRleHQpIHsKKwkJCWlmKGRpYikgeworCQkJCUZyZWVJbWFnZV9VbmxvYWQoZGliKTsKKwkJCX0KKwkJCS8vIGZyZWUgcmVtYWluaW5nIHN0cnVjdHVyZXMKKwkJCW9wal9kZXN0cm95X2NvZGVjKGRfY29kZWMpOworCQkJb3BqX2ltYWdlX2Rlc3Ryb3koaW1hZ2UpOworCisJCQlGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2Moc19mb3JtYXRfaWQsIHRleHQpOworCisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYKK1NhdmUoRnJlZUltYWdlSU8gKmlvLCBGSUJJVE1BUCAqZGliLCBmaV9oYW5kbGUgaGFuZGxlLCBpbnQgcGFnZSwgaW50IGZsYWdzLCB2b2lkICpkYXRhKSB7CisJSjJLRklPX3QgKmZpbyA9IChKMktGSU9fdCopZGF0YTsKKwlpZiAoZGliICYmIGhhbmRsZSAmJiBmaW8pIHsKKwkJQk9PTCBiU3VjY2VzczsKKwkJb3BqX2NvZGVjX3QgKmNfY29kZWMgPSBOVUxMOwkvLyBoYW5kbGUgdG8gYSBjb21wcmVzc29yCisJCW9wal9jcGFyYW1ldGVyc190IHBhcmFtZXRlcnM7CS8vIGNvbXByZXNzaW9uIHBhcmFtZXRlcnMKKwkJb3BqX2ltYWdlX3QgKmltYWdlID0gTlVMTDsJCS8vIGltYWdlIHRvIGVuY29kZQorCisJCS8vIGdldCB0aGUgT3BlbkpQRUcgc3RyZWFtCisJCW9wal9zdHJlYW1fdCAqY19zdHJlYW0gPSBmaW8tPnN0cmVhbTsKKworCQkvLyBzZXQgZW5jb2RpbmcgcGFyYW1ldGVycyB0byBkZWZhdWx0IHZhbHVlcworCQlvcGpfc2V0X2RlZmF1bHRfZW5jb2Rlcl9wYXJhbWV0ZXJzKCZwYXJhbWV0ZXJzKTsKKworCQl0cnkgeworCQkJcGFyYW1ldGVycy50Y3BfbnVtbGF5ZXJzID0gMDsKKwkJCS8vIGlmIG5vIHJhdGUgZW50ZXJlZCwgYXBwbHkgYSAxNjoxIHJhdGUgYnkgZGVmYXVsdAorCQkJaWYoZmxhZ3MgPT0gSjJLX0RFRkFVTFQpIHsKKwkJCQlwYXJhbWV0ZXJzLnRjcF9yYXRlc1swXSA9IChmbG9hdCkxNjsKKwkJCX0gZWxzZSB7CisJCQkJLy8gZm9yIG5vdywgdGhlIGZsYWdzIHBhcmFtZXRlciBpcyBvbmx5IHVzZWQgdG8gc3BlY2lmeSB0aGUgcmF0ZQorCQkJCXBhcmFtZXRlcnMudGNwX3JhdGVzWzBdID0gKGZsb2F0KShmbGFncyAmIDB4M0ZGKTsKKwkJCX0KKwkJCXBhcmFtZXRlcnMudGNwX251bWxheWVycysrOworCQkJcGFyYW1ldGVycy5jcF9kaXN0b19hbGxvYyA9IDE7CisKKwkJCS8vIGNvbnZlcnQgdGhlIGRpYiB0byBhIE9wZW5KUEVHIGltYWdlCisJCQlpbWFnZSA9IEZJQklUTUFQVG9KMktJbWFnZShzX2Zvcm1hdF9pZCwgZGliLCAmcGFyYW1ldGVycyk7CisJCQlpZighaW1hZ2UpIHsKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQl9CisKKwkJCS8vIGRlY2lkZSBpZiBNQ1Qgc2hvdWxkIGJlIHVzZWQKKwkJCXBhcmFtZXRlcnMudGNwX21jdCA9IChpbWFnZS0+bnVtY29tcHMgPT0gMykgPyAxIDogMDsKKworCQkJLy8gZW5jb2RlIHRoZSBkZXN0aW5hdGlvbiBpbWFnZQorCisJCQkvLyBnZXQgYSBKMksgY29tcHJlc3NvciBoYW5kbGUKKwkJCWNfY29kZWMgPSBvcGpfY3JlYXRlX2NvbXByZXNzKE9QSl9DT0RFQ19KMkspOworCisJCQkvLyBjb25maWd1cmUgdGhlIGV2ZW50IGNhbGxiYWNrcworCQkJLy8gY2F0Y2ggZXZlbnRzIHVzaW5nIG91ciBjYWxsYmFja3MgKG5vIGxvY2FsIGNvbnRleHQgbmVlZGVkIGhlcmUpCisJCQlvcGpfc2V0X2luZm9faGFuZGxlcihjX2NvZGVjLCBOVUxMLCBOVUxMKTsKKwkJCW9wal9zZXRfd2FybmluZ19oYW5kbGVyKGNfY29kZWMsIGoya193YXJuaW5nX2NhbGxiYWNrLCBOVUxMKTsKKwkJCW9wal9zZXRfZXJyb3JfaGFuZGxlcihjX2NvZGVjLCBqMmtfZXJyb3JfY2FsbGJhY2ssIE5VTEwpOworCisJCQkvLyBzZXR1cCB0aGUgZW5jb2RlciBwYXJhbWV0ZXJzIHVzaW5nIHRoZSBjdXJyZW50IGltYWdlIGFuZCB1c2luZyB1c2VyIHBhcmFtZXRlcnMKKwkJCW9wal9zZXR1cF9lbmNvZGVyKGNfY29kZWMsICZwYXJhbWV0ZXJzLCBpbWFnZSk7CisKKwkJCS8vIGVuY29kZSB0aGUgaW1hZ2UKKwkJCWJTdWNjZXNzID0gb3BqX3N0YXJ0X2NvbXByZXNzKGNfY29kZWMsIGltYWdlLCBjX3N0cmVhbSk7CisJCQlpZihiU3VjY2VzcykgeworCQkJCWJTdWNjZXNzID0gYlN1Y2Nlc3MgJiYgb3BqX2VuY29kZShjX2NvZGVjLCBjX3N0cmVhbSk7CisJCQkJaWYoYlN1Y2Nlc3MpIHsKKwkJCQkJYlN1Y2Nlc3MgPSBiU3VjY2VzcyAmJiBvcGpfZW5kX2NvbXByZXNzKGNfY29kZWMsIGNfc3RyZWFtKTsKKwkJCQl9CisJCQl9CisJCQlpZiAoIWJTdWNjZXNzKSB7CisJCQkJdGhyb3cgIkZhaWxlZCB0byBlbmNvZGUgaW1hZ2UiOworCQkJfQorCisJCQkvLyBmcmVlIHJlbWFpbmluZyBjb21wcmVzc2lvbiBzdHJ1Y3R1cmVzCisJCQlvcGpfZGVzdHJveV9jb2RlYyhjX2NvZGVjKTsKKwkJCQorCQkJLy8gZnJlZSBpbWFnZSBkYXRhCisJCQlvcGpfaW1hZ2VfZGVzdHJveShpbWFnZSk7CisKKwkJCXJldHVybiBUUlVFOworCisJCX0gY2F0Y2ggKGNvbnN0IGNoYXIgKnRleHQpIHsKKwkJCWlmKGNfY29kZWMpIG9wal9kZXN0cm95X2NvZGVjKGNfY29kZWMpOworCQkJaWYoaW1hZ2UpIG9wal9pbWFnZV9kZXN0cm95KGltYWdlKTsKKwkJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhzX2Zvcm1hdF9pZCwgdGV4dCk7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKwl9CisKKwlyZXR1cm4gRkFMU0U7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICAgSW5pdAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit2b2lkIERMTF9DQUxMQ09OVgorSW5pdEoySyhQbHVnaW4gKnBsdWdpbiwgaW50IGZvcm1hdF9pZCkgeworCXNfZm9ybWF0X2lkID0gZm9ybWF0X2lkOworCisJcGx1Z2luLT5mb3JtYXRfcHJvYyA9IEZvcm1hdDsKKwlwbHVnaW4tPmRlc2NyaXB0aW9uX3Byb2MgPSBEZXNjcmlwdGlvbjsKKwlwbHVnaW4tPmV4dGVuc2lvbl9wcm9jID0gRXh0ZW5zaW9uOworCXBsdWdpbi0+cmVnZXhwcl9wcm9jID0gUmVnRXhwcjsKKwlwbHVnaW4tPm9wZW5fcHJvYyA9IE9wZW47CisJcGx1Z2luLT5jbG9zZV9wcm9jID0gQ2xvc2U7CisJcGx1Z2luLT5wYWdlY291bnRfcHJvYyA9IE5VTEw7CisJcGx1Z2luLT5wYWdlY2FwYWJpbGl0eV9wcm9jID0gTlVMTDsKKwlwbHVnaW4tPmxvYWRfcHJvYyA9IExvYWQ7CisJcGx1Z2luLT5zYXZlX3Byb2MgPSBTYXZlOworCXBsdWdpbi0+dmFsaWRhdGVfcHJvYyA9IFZhbGlkYXRlOworCXBsdWdpbi0+bWltZV9wcm9jID0gTWltZVR5cGU7CisJcGx1Z2luLT5zdXBwb3J0c19leHBvcnRfYnBwX3Byb2MgPSBTdXBwb3J0c0V4cG9ydERlcHRoOworCXBsdWdpbi0+c3VwcG9ydHNfZXhwb3J0X3R5cGVfcHJvYyA9IFN1cHBvcnRzRXhwb3J0VHlwZTsKKwlwbHVnaW4tPnN1cHBvcnRzX2ljY19wcm9maWxlc19wcm9jID0gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvUGx1Z2luSk5HLmNwcCBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvUGx1Z2luSk5HLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTdlNzMxCi0tLSAvZGV2L251bGwKKysrIGIvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9QbHVnaW5KTkcuY3BwCkBAIC0wLDAgKzEsMTYyIEBACisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBKTkcgbG9hZGVyCisvLworLy8gRGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBieQorLy8gLSBIZXJ2ZSBEcm9sb24gKGRyb2xvbkBpbmZvbmllLmZyKQorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZyZWVJbWFnZSAzCisvLworLy8gQ09WRVJFRCBDT0RFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZCisvLyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUworLy8gVEhBVCBUSEUgQ09WRVJFRCBDT0RFIElTIEZSRUUgT0YgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisvLyBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRAorLy8gQ09ERSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVAorLy8gVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GIEFOWSBORUNFU1NBUlkKKy8vIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwKKy8vIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIKKy8vIFRISVMgRElTQ0xBSU1FUi4KKy8vCisvLyBVc2UgYXQgeW91ciBvd24gcmlzayEKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2luY2x1ZGUgIkZyZWVJbWFnZS5oIgorI2luY2x1ZGUgIlV0aWxpdGllcy5oIgorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBQbHVnaW4gSW50ZXJmYWNlCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3N0YXRpYyBpbnQgc19mb3JtYXRfaWQ7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBKTkdfU0lHTkFUVVJFX1NJWkUgOAkvLyBzaXplIG9mIHRoZSBzaWduYXR1cmUKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgIG1uZyBpbnRlcmZhY2UgKHNlZSBNTkdIZWxwZXIuY3BwKQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitGSUJJVE1BUCogbW5nX1JlYWRDaHVua3MoaW50IGZvcm1hdF9pZCwgRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBsb25nIE9mZnNldCwgaW50IGZsYWdzID0gMCk7CitCT09MIG1uZ19Xcml0ZUpORyhpbnQgZm9ybWF0X2lkLCBGcmVlSW1hZ2VJTyAqaW8sIEZJQklUTUFQICpkaWIsIGZpX2hhbmRsZSBoYW5kbGUsIGludCBmbGFncyk7CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFBsdWdpbiBJbXBsZW1lbnRhdGlvbgorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgorRm9ybWF0KCkgeworCXJldHVybiAiSk5HIjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKK0Rlc2NyaXB0aW9uKCkgeworCXJldHVybiAiSlBFRyBOZXR3b3JrIEdyYXBoaWNzIjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKK0V4dGVuc2lvbigpIHsKKwlyZXR1cm4gImpuZyI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCitSZWdFeHByKCkgeworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgorTWltZVR5cGUoKSB7CisJcmV0dXJuICJpbWFnZS94LW1uZyI7Cit9CisKK3N0YXRpYyBCT09MIERMTF9DQUxMQ09OVgorVmFsaWRhdGUoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlKSB7CisJQllURSBqbmdfc2lnbmF0dXJlWzhdID0geyAxMzksIDc0LCA3OCwgNzEsIDEzLCAxMCwgMjYsIDEwIH07CisJQllURSBzaWduYXR1cmVbOF0gPSB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfTsKKworCWlvLT5yZWFkX3Byb2MoJnNpZ25hdHVyZSwgMSwgSk5HX1NJR05BVFVSRV9TSVpFLCBoYW5kbGUpOworCisJcmV0dXJuIChtZW1jbXAoam5nX3NpZ25hdHVyZSwgc2lnbmF0dXJlLCBKTkdfU0lHTkFUVVJFX1NJWkUpID09IDApID8gVFJVRSA6IEZBTFNFOworfQorCitzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYKK1N1cHBvcnRzRXhwb3J0RGVwdGgoaW50IGRlcHRoKSB7CisJcmV0dXJuICgKKwkJCShkZXB0aCA9PSA4KSB8fAorCQkJKGRlcHRoID09IDI0KSB8fAorCQkJKGRlcHRoID09IDMyKQorCQkpOworfQorCitzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYgCitTdXBwb3J0c0V4cG9ydFR5cGUoRlJFRV9JTUFHRV9UWVBFIHR5cGUpIHsKKwlyZXR1cm4gKHR5cGUgPT0gRklUX0JJVE1BUCkgPyBUUlVFIDogRkFMU0U7Cit9CisKK3N0YXRpYyBCT09MIERMTF9DQUxMQ09OVgorU3VwcG9ydHNJQ0NQcm9maWxlcygpIHsKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIEJPT0wgRExMX0NBTExDT05WCitTdXBwb3J0c05vUGl4ZWxzKCkgeworCXJldHVybiBUUlVFOworfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgKiBETExfQ0FMTENPTlYKK09wZW4oRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBCT09MIHJlYWQpIHsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgRExMX0NBTExDT05WCitDbG9zZShGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIHZvaWQgKmRhdGEpIHsKK30KKworc3RhdGljIEZJQklUTUFQICogRExMX0NBTExDT05WCitMb2FkKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSwgaW50IHBhZ2UsIGludCBmbGFncywgdm9pZCAqZGF0YSkgeworCWxvbmcgb2Zmc2V0ID0gSk5HX1NJR05BVFVSRV9TSVpFOwkvLyBtb3ZlIHRvIHNraXAgZmlyc3QgOCBieXRlcyBvZiBzaWduYXR1cmUKKworCS8vIGNoZWNrIHRoZSBzaWduYXR1cmUgKDggYnl0ZXMpCisJaWYoVmFsaWRhdGUoaW8sIGhhbmRsZSkgPT0gRkFMU0UpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCQorCS8vIHBhcnNlIGNodW5rcyBhbmQgZGVjb2RlIGEgam5nIG9yIG1uZyBiaXRtYXAKKwlyZXR1cm4gbW5nX1JlYWRDaHVua3Moc19mb3JtYXRfaWQsIGlvLCBoYW5kbGUsIG9mZnNldCwgZmxhZ3MpOworfQorCitzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYKK1NhdmUoRnJlZUltYWdlSU8gKmlvLCBGSUJJVE1BUCAqZGliLCBmaV9oYW5kbGUgaGFuZGxlLCBpbnQgcGFnZSwgaW50IGZsYWdzLCB2b2lkICpkYXRhKSB7CisKKwlyZXR1cm4gbW5nX1dyaXRlSk5HKHNfZm9ybWF0X2lkLCBpbywgZGliLCBoYW5kbGUsIGZsYWdzKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gICBJbml0CisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3ZvaWQgRExMX0NBTExDT05WCitJbml0Sk5HKFBsdWdpbiAqcGx1Z2luLCBpbnQgZm9ybWF0X2lkKSB7CisJc19mb3JtYXRfaWQgPSBmb3JtYXRfaWQ7CisKKwlwbHVnaW4tPmZvcm1hdF9wcm9jID0gRm9ybWF0OworCXBsdWdpbi0+ZGVzY3JpcHRpb25fcHJvYyA9IERlc2NyaXB0aW9uOworCXBsdWdpbi0+ZXh0ZW5zaW9uX3Byb2MgPSBFeHRlbnNpb247CisJcGx1Z2luLT5yZWdleHByX3Byb2MgPSBSZWdFeHByOworCXBsdWdpbi0+b3Blbl9wcm9jID0gT3BlbjsKKwlwbHVnaW4tPmNsb3NlX3Byb2MgPSBDbG9zZTsKKwlwbHVnaW4tPnBhZ2Vjb3VudF9wcm9jID0gTlVMTDsKKwlwbHVnaW4tPnBhZ2VjYXBhYmlsaXR5X3Byb2MgPSBOVUxMOworCXBsdWdpbi0+bG9hZF9wcm9jID0gTG9hZDsKKwlwbHVnaW4tPnNhdmVfcHJvYyA9IFNhdmU7CisJcGx1Z2luLT52YWxpZGF0ZV9wcm9jID0gVmFsaWRhdGU7CisJcGx1Z2luLT5taW1lX3Byb2MgPSBNaW1lVHlwZTsKKwlwbHVnaW4tPnN1cHBvcnRzX2V4cG9ydF9icHBfcHJvYyA9IFN1cHBvcnRzRXhwb3J0RGVwdGg7CisJcGx1Z2luLT5zdXBwb3J0c19leHBvcnRfdHlwZV9wcm9jID0gU3VwcG9ydHNFeHBvcnRUeXBlOworCXBsdWdpbi0+c3VwcG9ydHNfaWNjX3Byb2ZpbGVzX3Byb2MgPSBTdXBwb3J0c0lDQ1Byb2ZpbGVzOworCXBsdWdpbi0+c3VwcG9ydHNfbm9fcGl4ZWxzX3Byb2MgPSBTdXBwb3J0c05vUGl4ZWxzOworfQpkaWZmIC0tZ2l0IGEvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9QbHVnaW5KUDIuY3BwIGIvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9QbHVnaW5KUDIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMWZlN2MKLS0tIC9kZXYvbnVsbAorKysgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL1BsdWdpbkpQMi5jcHAKQEAgLTAsMCArMSwzMjggQEAKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEpQRUcyMDAwIEpQMiBmaWxlIGZvcm1hdCBMb2FkZXIgYW5kIFdyaXRlcgorLy8KKy8vIERlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gYnkKKy8vIC0gSGVydsOpIERyb2xvbiAoZHJvbG9uQGluZm9uaWUuZnIpCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRnJlZUltYWdlIDMKKy8vCisvLyBDT1ZFUkVEIENPREUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkKKy8vIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTCisvLyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy8vIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVECisvLyBDT0RFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UCisvLyBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWQorLy8gU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTAorLy8gUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUgorLy8gVEhJUyBESVNDTEFJTUVSLgorLy8KKy8vIFVzZSBhdCB5b3VyIG93biByaXNrIQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaW5jbHVkZSAiRnJlZUltYWdlLmgiCisjaW5jbHVkZSAiVXRpbGl0aWVzLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvb3BlbmpwZWcyL3NyYy9saWIvb3BlbmpwMi9vcGVuanBlZy5oIgorI2luY2x1ZGUgIkoyS0hlbHBlci5oIgorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBQbHVnaW4gSW50ZXJmYWNlCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3N0YXRpYyBpbnQgc19mb3JtYXRfaWQ7CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEludGVybmFsIGZ1bmN0aW9ucworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvKioKK09wZW5KUEVHIEVycm9yIGNhbGxiYWNrIAorKi8KK3N0YXRpYyB2b2lkIGpwMl9lcnJvcl9jYWxsYmFjayhjb25zdCBjaGFyICptc2csIHZvaWQgKmNsaWVudF9kYXRhKSB7CisJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKHNfZm9ybWF0X2lkLCAiRXJyb3I6ICVzIiwgbXNnKTsKK30KKy8qKgorT3BlbkpQRUcgV2FybmluZyBjYWxsYmFjayAKKyovCitzdGF0aWMgdm9pZCBqcDJfd2FybmluZ19jYWxsYmFjayhjb25zdCBjaGFyICptc2csIHZvaWQgKmNsaWVudF9kYXRhKSB7CisJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKHNfZm9ybWF0X2lkLCAiV2FybmluZzogJXMiLCBtc2cpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBQbHVnaW4gSW1wbGVtZW50YXRpb24KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKK0Zvcm1hdCgpIHsKKwlyZXR1cm4gIkpQMiI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCitEZXNjcmlwdGlvbigpIHsKKwlyZXR1cm4gIkpQRUctMjAwMCBGaWxlIEZvcm1hdCI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCitFeHRlbnNpb24oKSB7CisJcmV0dXJuICJqcDIiOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgorUmVnRXhwcigpIHsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKK01pbWVUeXBlKCkgeworCXJldHVybiAiaW1hZ2UvanAyIjsKK30KKworc3RhdGljIEJPT0wgRExMX0NBTExDT05WCitWYWxpZGF0ZShGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUpIHsKKwlCWVRFIGpwMl9zaWduYXR1cmVbXSA9IHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQywgMHg2QSwgMHg1MCwgMHgyMCwgMHgyMCwgMHgwRCwgMHgwQSwgMHg4NywgMHgwQSB9OworCUJZVEUgc2lnbmF0dXJlWzEyXSA9IHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9OworCisJbG9uZyB0ZWxsID0gaW8tPnRlbGxfcHJvYyhoYW5kbGUpOworCWlvLT5yZWFkX3Byb2Moc2lnbmF0dXJlLCAxLCBzaXplb2YoanAyX3NpZ25hdHVyZSksIGhhbmRsZSk7CisJaW8tPnNlZWtfcHJvYyhoYW5kbGUsIHRlbGwsIFNFRUtfU0VUKTsKKworCXJldHVybiAobWVtY21wKGpwMl9zaWduYXR1cmUsIHNpZ25hdHVyZSwgc2l6ZW9mKGpwMl9zaWduYXR1cmUpKSA9PSAwKTsKK30KKworc3RhdGljIEJPT0wgRExMX0NBTExDT05WCitTdXBwb3J0c0V4cG9ydERlcHRoKGludCBkZXB0aCkgeworCXJldHVybiAoCisJCShkZXB0aCA9PSA4KSB8fAorCQkoZGVwdGggPT0gMjQpIHx8IAorCQkoZGVwdGggPT0gMzIpCisJKTsKK30KKworc3RhdGljIEJPT0wgRExMX0NBTExDT05WIAorU3VwcG9ydHNFeHBvcnRUeXBlKEZSRUVfSU1BR0VfVFlQRSB0eXBlKSB7CisJcmV0dXJuICgKKwkJKHR5cGUgPT0gRklUX0JJVE1BUCkgIHx8CisJCSh0eXBlID09IEZJVF9VSU5UMTYpICB8fAorCQkodHlwZSA9PSBGSVRfUkdCMTYpIHx8IAorCQkodHlwZSA9PSBGSVRfUkdCQTE2KQorCSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgKiBETExfQ0FMTENPTlYKK09wZW4oRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBCT09MIHJlYWQpIHsKKwkvLyBjcmVhdGUgdGhlIHN0cmVhbSB3cmFwcGVyCisJSjJLRklPX3QgKmZpbyA9IG9wal9mcmVlaW1hZ2Vfc3RyZWFtX2NyZWF0ZShpbywgaGFuZGxlLCByZWFkKTsKKwlyZXR1cm4gZmlvOworfQorCitzdGF0aWMgdm9pZCBETExfQ0FMTENPTlYKK0Nsb3NlKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSwgdm9pZCAqZGF0YSkgeworCS8vIGRlc3Ryb3kgdGhlIHN0cmVhbSB3cmFwcGVyCisJSjJLRklPX3QgKmZpbyA9IChKMktGSU9fdCopZGF0YTsKKwlvcGpfZnJlZWltYWdlX3N0cmVhbV9kZXN0cm95KGZpbyk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIEZJQklUTUFQICogRExMX0NBTExDT05WCitMb2FkKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSwgaW50IHBhZ2UsIGludCBmbGFncywgdm9pZCAqZGF0YSkgeworCUoyS0ZJT190ICpmaW8gPSAoSjJLRklPX3QqKWRhdGE7CisJaWYgKGhhbmRsZSAmJiBmaW8pIHsKKwkJb3BqX2NvZGVjX3QgKmRfY29kZWMgPSBOVUxMOwkvLyBoYW5kbGUgdG8gYSBkZWNvbXByZXNzb3IKKwkJb3BqX2RwYXJhbWV0ZXJzX3QgcGFyYW1ldGVyczsJLy8gZGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzCisJCW9wal9pbWFnZV90ICppbWFnZSA9IE5VTEw7CQkvLyBkZWNvZGVkIGltYWdlIAorCisJCUZJQklUTUFQICpkaWIgPSBOVUxMOworCisJCS8vIGNoZWNrIHRoZSBmaWxlIGZvcm1hdAorCQlpZighVmFsaWRhdGUoaW8sIGhhbmRsZSkpIHsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCQorCQlCT09MIGhlYWRlcl9vbmx5ID0gKGZsYWdzICYgRklGX0xPQURfTk9QSVhFTFMpID09IEZJRl9MT0FEX05PUElYRUxTOworCisJCS8vIGdldCB0aGUgT3BlbkpQRUcgc3RyZWFtCisJCW9wal9zdHJlYW1fdCAqZF9zdHJlYW0gPSBmaW8tPnN0cmVhbTsKKworCQkvLyBzZXQgZGVjb2RpbmcgcGFyYW1ldGVycyB0byBkZWZhdWx0IHZhbHVlcyAKKwkJb3BqX3NldF9kZWZhdWx0X2RlY29kZXJfcGFyYW1ldGVycygmcGFyYW1ldGVycyk7CisKKwkJdHJ5IHsKKwkJCS8vIGRlY29kZSB0aGUgSlBFRy0yMDAwIGZpbGUKKworCQkJLy8gZ2V0IGEgZGVjb2RlciBoYW5kbGUKKwkJCWRfY29kZWMgPSBvcGpfY3JlYXRlX2RlY29tcHJlc3MoT1BKX0NPREVDX0pQMik7CisJCQkKKwkJCS8vIGNvbmZpZ3VyZSB0aGUgZXZlbnQgY2FsbGJhY2tzCisJCQkvLyBjYXRjaCBldmVudHMgdXNpbmcgb3VyIGNhbGxiYWNrcyAobm8gbG9jYWwgY29udGV4dCBuZWVkZWQgaGVyZSkKKwkJCW9wal9zZXRfaW5mb19oYW5kbGVyKGRfY29kZWMsIE5VTEwsIE5VTEwpOworCQkJb3BqX3NldF93YXJuaW5nX2hhbmRsZXIoZF9jb2RlYywganAyX3dhcm5pbmdfY2FsbGJhY2ssIE5VTEwpOworCQkJb3BqX3NldF9lcnJvcl9oYW5kbGVyKGRfY29kZWMsIGpwMl9lcnJvcl9jYWxsYmFjaywgTlVMTCk7CisKKwkJCS8vIHNldHVwIHRoZSBkZWNvZGVyIGRlY29kaW5nIHBhcmFtZXRlcnMgdXNpbmcgdXNlciBwYXJhbWV0ZXJzCisJCQlpZiggIW9wal9zZXR1cF9kZWNvZGVyKGRfY29kZWMsICZwYXJhbWV0ZXJzKSApIHsKKwkJCQl0aHJvdyAiRmFpbGVkIHRvIHNldHVwIHRoZSBkZWNvZGVyXG4iOworCQkJfQorCQkJCisJCQkvLyByZWFkIHRoZSBtYWluIGhlYWRlciBvZiB0aGUgY29kZXN0cmVhbSBhbmQgaWYgbmVjZXNzYXJ5IHRoZSBKUDIgYm94ZXMKKwkJCWlmKCAhb3BqX3JlYWRfaGVhZGVyKGRfc3RyZWFtLCBkX2NvZGVjLCAmaW1hZ2UpKSB7CisJCQkJdGhyb3cgIkZhaWxlZCB0byByZWFkIHRoZSBoZWFkZXJcbiI7CisJCQl9CisKKwkJCS8vIC0tLSBoZWFkZXIgb25seSBtb2RlCisKKwkJCWlmIChoZWFkZXJfb25seSkgeworCQkJCS8vIGNyZWF0ZSBvdXRwdXQgaW1hZ2UgCisJCQkJZGliID0gSjJLSW1hZ2VUb0ZJQklUTUFQKHNfZm9ybWF0X2lkLCBpbWFnZSwgaGVhZGVyX29ubHkpOworCQkJCWlmKCFkaWIpIHsKKwkJCQkJdGhyb3cgIkZhaWxlZCB0byBpbXBvcnQgSlBFRzIwMDAgaW1hZ2UiOworCQkJCX0KKwkJCQkvLyBjbGVhbi11cCBhbmQgcmV0dXJuIGhlYWRlciBkYXRhCisJCQkJb3BqX2Rlc3Ryb3lfY29kZWMoZF9jb2RlYyk7CisJCQkJb3BqX2ltYWdlX2Rlc3Ryb3koaW1hZ2UpOworCQkJCXJldHVybiBkaWI7CisJCQl9CisKKwkJCS8vIGRlY29kZSB0aGUgc3RyZWFtIGFuZCBmaWxsIHRoZSBpbWFnZSBzdHJ1Y3R1cmUgCisJCQlpZiggISggb3BqX2RlY29kZShkX2NvZGVjLCBkX3N0cmVhbSwgaW1hZ2UpICYmIG9wal9lbmRfZGVjb21wcmVzcyhkX2NvZGVjLCBkX3N0cmVhbSkgKSApIHsKKwkJCQl0aHJvdyAiRmFpbGVkIHRvIGRlY29kZSBpbWFnZSFcbiI7CisJCQl9CisKKwkJCS8vIGZyZWUgdGhlIGNvZGVjIGNvbnRleHQKKwkJCW9wal9kZXN0cm95X2NvZGVjKGRfY29kZWMpOworCQkJZF9jb2RlYyA9IE5VTEw7CisKKwkJCS8vIGNyZWF0ZSBvdXRwdXQgaW1hZ2UgCisJCQlkaWIgPSBKMktJbWFnZVRvRklCSVRNQVAoc19mb3JtYXRfaWQsIGltYWdlLCBoZWFkZXJfb25seSk7CisJCQlpZighZGliKSB7CisJCQkJdGhyb3cgIkZhaWxlZCB0byBpbXBvcnQgSlBFRzIwMDAgaW1hZ2UiOworCQkJfQorCisJCQkvLyBmcmVlIGltYWdlIGRhdGEgc3RydWN0dXJlCisJCQlvcGpfaW1hZ2VfZGVzdHJveShpbWFnZSk7CisKKwkJCXJldHVybiBkaWI7CisKKwkJfSBjYXRjaCAoY29uc3QgY2hhciAqdGV4dCkgeworCQkJaWYoZGliKSB7CisJCQkJRnJlZUltYWdlX1VubG9hZChkaWIpOworCQkJfQorCQkJLy8gZnJlZSByZW1haW5pbmcgc3RydWN0dXJlcworCQkJb3BqX2Rlc3Ryb3lfY29kZWMoZF9jb2RlYyk7CisJCQlvcGpfaW1hZ2VfZGVzdHJveShpbWFnZSk7CisKKwkJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhzX2Zvcm1hdF9pZCwgdGV4dCk7CisKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBCT09MIERMTF9DQUxMQ09OVgorU2F2ZShGcmVlSW1hZ2VJTyAqaW8sIEZJQklUTUFQICpkaWIsIGZpX2hhbmRsZSBoYW5kbGUsIGludCBwYWdlLCBpbnQgZmxhZ3MsIHZvaWQgKmRhdGEpIHsKKwlKMktGSU9fdCAqZmlvID0gKEoyS0ZJT190KilkYXRhOworCWlmIChkaWIgJiYgaGFuZGxlICYmIGZpbykgeworCQlCT09MIGJTdWNjZXNzOworCQlvcGpfY29kZWNfdCAqY19jb2RlYyA9IE5VTEw7CS8vIGhhbmRsZSB0byBhIGNvbXByZXNzb3IKKwkJb3BqX2NwYXJhbWV0ZXJzX3QgcGFyYW1ldGVyczsJLy8gY29tcHJlc3Npb24gcGFyYW1ldGVycworCQlvcGpfaW1hZ2VfdCAqaW1hZ2UgPSBOVUxMOwkJLy8gaW1hZ2UgdG8gZW5jb2RlCisKKwkJLy8gZ2V0IHRoZSBPcGVuSlBFRyBzdHJlYW0KKwkJb3BqX3N0cmVhbV90ICpjX3N0cmVhbSA9IGZpby0+c3RyZWFtOworCisJCS8vIHNldCBlbmNvZGluZyBwYXJhbWV0ZXJzIHRvIGRlZmF1bHQgdmFsdWVzCisJCW9wal9zZXRfZGVmYXVsdF9lbmNvZGVyX3BhcmFtZXRlcnMoJnBhcmFtZXRlcnMpOworCisJCXRyeSB7CisJCQlwYXJhbWV0ZXJzLnRjcF9udW1sYXllcnMgPSAwOworCQkJLy8gaWYgbm8gcmF0ZSBlbnRlcmVkLCBhcHBseSBhIDE2OjEgcmF0ZSBieSBkZWZhdWx0CisJCQlpZihmbGFncyA9PSBKUDJfREVGQVVMVCkgeworCQkJCXBhcmFtZXRlcnMudGNwX3JhdGVzWzBdID0gKGZsb2F0KTE2OworCQkJfSBlbHNlIHsKKwkJCQkvLyBmb3Igbm93LCB0aGUgZmxhZ3MgcGFyYW1ldGVyIGlzIG9ubHkgdXNlZCB0byBzcGVjaWZ5IHRoZSByYXRlCisJCQkJcGFyYW1ldGVycy50Y3BfcmF0ZXNbMF0gPSAoZmxvYXQpKGZsYWdzICYgMHgzRkYpOworCQkJfQorCQkJcGFyYW1ldGVycy50Y3BfbnVtbGF5ZXJzKys7CisJCQlwYXJhbWV0ZXJzLmNwX2Rpc3RvX2FsbG9jID0gMTsKKworCQkJLy8gY29udmVydCB0aGUgZGliIHRvIGEgT3BlbkpQRUcgaW1hZ2UKKwkJCWltYWdlID0gRklCSVRNQVBUb0oyS0ltYWdlKHNfZm9ybWF0X2lkLCBkaWIsICZwYXJhbWV0ZXJzKTsKKwkJCWlmKCFpbWFnZSkgeworCQkJCXJldHVybiBGQUxTRTsKKwkJCX0KKworCQkJLy8gZGVjaWRlIGlmIE1DVCBzaG91bGQgYmUgdXNlZAorCQkJcGFyYW1ldGVycy50Y3BfbWN0ID0gKGltYWdlLT5udW1jb21wcyA9PSAzKSA/IDEgOiAwOworCisJCQkvLyBlbmNvZGUgdGhlIGRlc3RpbmF0aW9uIGltYWdlCisKKwkJCS8vIGdldCBhIEpQMiBjb21wcmVzc29yIGhhbmRsZQorCQkJY19jb2RlYyA9IG9wal9jcmVhdGVfY29tcHJlc3MoT1BKX0NPREVDX0pQMik7CisKKwkJCS8vIGNvbmZpZ3VyZSB0aGUgZXZlbnQgY2FsbGJhY2tzCisJCQkvLyBjYXRjaCBldmVudHMgdXNpbmcgb3VyIGNhbGxiYWNrcyAobm8gbG9jYWwgY29udGV4dCBuZWVkZWQgaGVyZSkKKwkJCW9wal9zZXRfaW5mb19oYW5kbGVyKGNfY29kZWMsIE5VTEwsIE5VTEwpOworCQkJb3BqX3NldF93YXJuaW5nX2hhbmRsZXIoY19jb2RlYywganAyX3dhcm5pbmdfY2FsbGJhY2ssIE5VTEwpOworCQkJb3BqX3NldF9lcnJvcl9oYW5kbGVyKGNfY29kZWMsIGpwMl9lcnJvcl9jYWxsYmFjaywgTlVMTCk7CisKKwkJCS8vIHNldHVwIHRoZSBlbmNvZGVyIHBhcmFtZXRlcnMgdXNpbmcgdGhlIGN1cnJlbnQgaW1hZ2UgYW5kIHVzaW5nIHVzZXIgcGFyYW1ldGVycworCQkJb3BqX3NldHVwX2VuY29kZXIoY19jb2RlYywgJnBhcmFtZXRlcnMsIGltYWdlKTsKKworCQkJLy8gZW5jb2RlIHRoZSBpbWFnZQorCQkJYlN1Y2Nlc3MgPSBvcGpfc3RhcnRfY29tcHJlc3MoY19jb2RlYywgaW1hZ2UsIGNfc3RyZWFtKTsKKwkJCWlmKGJTdWNjZXNzKSB7CisJCQkJYlN1Y2Nlc3MgPSBiU3VjY2VzcyAmJiBvcGpfZW5jb2RlKGNfY29kZWMsIGNfc3RyZWFtKTsKKwkJCQlpZihiU3VjY2VzcykgeworCQkJCQliU3VjY2VzcyA9IGJTdWNjZXNzICYmIG9wal9lbmRfY29tcHJlc3MoY19jb2RlYywgY19zdHJlYW0pOworCQkJCX0KKwkJCX0KKwkJCWlmICghYlN1Y2Nlc3MpIHsKKwkJCQl0aHJvdyAiRmFpbGVkIHRvIGVuY29kZSBpbWFnZSI7CisJCQl9CisKKwkJCS8vIGZyZWUgcmVtYWluaW5nIGNvbXByZXNzaW9uIHN0cnVjdHVyZXMKKwkJCW9wal9kZXN0cm95X2NvZGVjKGNfY29kZWMpOworCQkJCisJCQkvLyBmcmVlIGltYWdlIGRhdGEKKwkJCW9wal9pbWFnZV9kZXN0cm95KGltYWdlKTsKKworCQkJcmV0dXJuIFRSVUU7CisKKwkJfSBjYXRjaCAoY29uc3QgY2hhciAqdGV4dCkgeworCQkJaWYoY19jb2RlYykgb3BqX2Rlc3Ryb3lfY29kZWMoY19jb2RlYyk7CisJCQlpZihpbWFnZSkgb3BqX2ltYWdlX2Rlc3Ryb3koaW1hZ2UpOworCQkJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKHNfZm9ybWF0X2lkLCB0ZXh0KTsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCX0KKworCXJldHVybiBGQUxTRTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gICBJbml0CisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3ZvaWQgRExMX0NBTExDT05WCitJbml0SlAyKFBsdWdpbiAqcGx1Z2luLCBpbnQgZm9ybWF0X2lkKSB7CisJc19mb3JtYXRfaWQgPSBmb3JtYXRfaWQ7CisKKwlwbHVnaW4tPmZvcm1hdF9wcm9jID0gRm9ybWF0OworCXBsdWdpbi0+ZGVzY3JpcHRpb25fcHJvYyA9IERlc2NyaXB0aW9uOworCXBsdWdpbi0+ZXh0ZW5zaW9uX3Byb2MgPSBFeHRlbnNpb247CisJcGx1Z2luLT5yZWdleHByX3Byb2MgPSBSZWdFeHByOworCXBsdWdpbi0+b3Blbl9wcm9jID0gT3BlbjsKKwlwbHVnaW4tPmNsb3NlX3Byb2MgPSBDbG9zZTsKKwlwbHVnaW4tPnBhZ2Vjb3VudF9wcm9jID0gTlVMTDsKKwlwbHVnaW4tPnBhZ2VjYXBhYmlsaXR5X3Byb2MgPSBOVUxMOworCXBsdWdpbi0+bG9hZF9wcm9jID0gTG9hZDsKKwlwbHVnaW4tPnNhdmVfcHJvYyA9IFNhdmU7CisJcGx1Z2luLT52YWxpZGF0ZV9wcm9jID0gVmFsaWRhdGU7CisJcGx1Z2luLT5taW1lX3Byb2MgPSBNaW1lVHlwZTsKKwlwbHVnaW4tPnN1cHBvcnRzX2V4cG9ydF9icHBfcHJvYyA9IFN1cHBvcnRzRXhwb3J0RGVwdGg7CisJcGx1Z2luLT5zdXBwb3J0c19leHBvcnRfdHlwZV9wcm9jID0gU3VwcG9ydHNFeHBvcnRUeXBlOworCXBsdWdpbi0+c3VwcG9ydHNfaWNjX3Byb2ZpbGVzX3Byb2MgPSBOVUxMOworfQpkaWZmIC0tZ2l0IGEvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9QbHVnaW5KUEVHLmNwcCBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvUGx1Z2luSlBFRy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJiMmM1NwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvUGx1Z2luSlBFRy5jcHAKQEAgLTAsMCArMSwxNzE2IEBACisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBKUEVHIExvYWRlciBhbmQgd3JpdGVyCisvLyBCYXNlZCBvbiBjb2RlIGRldmVsb3BlZCBieSBUaGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cAorLy8KKy8vIERlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gYnkKKy8vIC0gRmxvcmlzIHZhbiBkZW4gQmVyZyAoZmx2ZGJlcmdAd3hzLm5sKQorLy8gLSBKYW4gTC4gTmF1dGEgKGpsbkBtYWdlbnRhbW10LmNvbSkKKy8vIC0gTWFya3VzIExvaWJsIChtYXJrdXMubG9pYmxAZXBvc3QuZGUpCisvLyAtIEthcmwtSGVpbnogQnVzc2lhbiAoa2hidXNzaWFuQG1vc3MuZGUpCisvLyAtIEhlcnbDqSBEcm9sb24gKGRyb2xvbkBpbmZvbmllLmZyKQorLy8gLSBKYXNjaGEgV2V0emVsIChqYXNjaGFAbWFpbmlhLmRlKQorLy8gLSBNaWhhaWwgTmF5ZGVub3YgKG1uYXlkZW5vdkB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQpCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRnJlZUltYWdlIDMKKy8vCisvLyBDT1ZFUkVEIENPREUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkKKy8vIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTCisvLyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy8vIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVECisvLyBDT0RFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UCisvLyBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWQorLy8gU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTAorLy8gUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUgorLy8gVEhJUyBESVNDTEFJTUVSLgorLy8KKy8vIFVzZSBhdCB5b3VyIG93biByaXNrIQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaWZkZWYgX01TQ19WRVIgCisjcHJhZ21hIHdhcm5pbmcgKGRpc2FibGUgOiA0Nzg2KSAvLyBpZGVudGlmaWVyIHdhcyB0cnVuY2F0ZWQgdG8gJ251bWJlcicgY2hhcmFjdGVycworI2VuZGlmCisKK2V4dGVybiAiQyIgeworI2RlZmluZSBYTURfSAorI3VuZGVmIEZBUgorI2luY2x1ZGUgPHNldGptcC5oPgorCisvLyBCdWlsZGluZyBTa2V0Y2hVcCBvbiBMaW51eCB3YW50cyB0byB1c2UgdGhlIHRoaXJkX3BhcnR5L2pwZWcKKy8vIGpwZWcgY29kZSBpbnN0ZWFkIG9mIHRoZSBqcGVnIGNvbnRhaW5lZCB1bmRlciBmcmVlX2ltYWdlIGJlY2F1c2UKKy8vIHRoZSBlc2NoZXIgY29kZSB0aGF0IHdlIHVzZSBpdHNlbGYgdXNlcyB0aGlyZF9wYXJ0eS9qcGVnIGFuZCB3ZQorLy8gY3Jhc2ggd2l0aCBjb25mbGljdGluZyBqcGVnIGxpYnJhcnkgY29kZS4KKyNpZmRlZiBVU0VfVEhJUkRfUEFSVFlfSlBFRworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorI2luY2x1ZGUgImplcnJvci5oIgorI2Vsc2UKKyNpbmNsdWRlICIuLi9MaWJKUEVHL2ppbmNsdWRlLmgiCisjaW5jbHVkZSAiLi4vTGliSlBFRy9qcGVnbGliLmgiCisjaW5jbHVkZSAiLi4vTGliSlBFRy9qZXJyb3IuaCIKKyNlbmRpZgorfQorCisjaW5jbHVkZSAiRnJlZUltYWdlLmgiCisjaW5jbHVkZSAiVXRpbGl0aWVzLmgiCisKKyNpbmNsdWRlICIuLi9NZXRhZGF0YS9GcmVlSW1hZ2VUYWcuaCIKKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBQbHVnaW4gSW50ZXJmYWNlCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3N0YXRpYyBpbnQgc19mb3JtYXRfaWQ7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgQ29uc3RhbnQgZGVjbGFyYXRpb25zCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgSU5QVVRfQlVGX1NJWkUgIDQwOTYJLy8gY2hvb3NlIGFuIGVmZmljaWVudGx5IGZyZWFkJ2FibGUgc2l6ZSAKKyNkZWZpbmUgT1VUUFVUX0JVRl9TSVpFIDQwOTYgICAgLy8gY2hvb3NlIGFuIGVmZmljaWVudGx5IGZ3cml0ZSdhYmxlIHNpemUKKworI2RlZmluZSBFWElGX01BUktFUgkJKEpQRUdfQVBQMCsxKQkvLyBFWElGIG1hcmtlciAvIEFkb2JlIFhNUCBtYXJrZXIKKyNkZWZpbmUgSUNDX01BUktFUgkJKEpQRUdfQVBQMCsyKQkvLyBJQ0MgcHJvZmlsZSBtYXJrZXIKKyNkZWZpbmUgSVBUQ19NQVJLRVIJCShKUEVHX0FQUDArMTMpCS8vIElQVEMgbWFya2VyIC8gQklNIG1hcmtlciAKKworI2RlZmluZSBJQ0NfSEVBREVSX1NJWkUgMTQJCQkJLy8gc2l6ZSBvZiBub24tcHJvZmlsZSBkYXRhIGluIEFQUDIKKyNkZWZpbmUgTUFYX0JZVEVTX0lOX01BUktFUiA2NTUzM0wJCS8vIG1heGltdW0gZGF0YSBsZW5ndGggb2YgYSBKUEVHIG1hcmtlcgorI2RlZmluZSBNQVhfREFUQV9CWVRFU19JTl9NQVJLRVIgNjU1MTlMCS8vIG1heGltdW0gZGF0YSBsZW5ndGggb2YgYSBKUEVHIEFQUDIgbWFya2VyCisKKyNkZWZpbmUgTUFYX0pGWFhfVEhVTUJfU0laRSAoTUFYX0JZVEVTX0lOX01BUktFUiAtIDUgLSAxKQorCisjZGVmaW5lIEpGWFhfVFlQRV9KUEVHIAkweDEwCS8vIEpGSUYgZXh0ZW5zaW9uIG1hcmtlcjogSlBFRy1jb21wcmVzc2VkIHRodW1ibmFpbCBpbWFnZQorI2RlZmluZSBKRlhYX1RZUEVfOGJpdCAJMHgxMQkvLyBKRklGIGV4dGVuc2lvbiBtYXJrZXI6IHBhbGV0dGUgdGh1bWJuYWlsIGltYWdlCisjZGVmaW5lIEpGWFhfVFlQRV8yNGJpdAkweDEzCS8vIEpGSUYgZXh0ZW5zaW9uIG1hcmtlcjogUkdCIHRodW1ibmFpbCBpbWFnZQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgIFR5cGVkZWYgZGVjbGFyYXRpb25zCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgc3RydWN0IHRhZ0Vycm9yTWFuYWdlciB7CisJLy8vICJwdWJsaWMiIGZpZWxkcworCXN0cnVjdCBqcGVnX2Vycm9yX21nciBwdWI7CisJLy8vIGZvciByZXR1cm4gdG8gY2FsbGVyCisJam1wX2J1ZiBzZXRqbXBfYnVmZmVyOworfSBFcnJvck1hbmFnZXI7CisKK3R5cGVkZWYgc3RydWN0IHRhZ1NvdXJjZU1hbmFnZXIgeworCS8vLyBwdWJsaWMgZmllbGRzCisJc3RydWN0IGpwZWdfc291cmNlX21nciBwdWI7CisJLy8vIHNvdXJjZSBzdHJlYW0KKwlmaV9oYW5kbGUgaW5maWxlOworCUZyZWVJbWFnZUlPICptX2lvOworCS8vLyBzdGFydCBvZiBidWZmZXIKKwlKT0NURVQgKiBidWZmZXI7CisJLy8vIGhhdmUgd2UgZ290dGVuIGFueSBkYXRhIHlldCA/CisJYm9vbGVhbiBzdGFydF9vZl9maWxlOworfSBTb3VyY2VNYW5hZ2VyOworCit0eXBlZGVmIHN0cnVjdCB0YWdEZXN0aW5hdGlvbk1hbmFnZXIgeworCS8vLyBwdWJsaWMgZmllbGRzCisJc3RydWN0IGpwZWdfZGVzdGluYXRpb25fbWdyIHB1YjsKKwkvLy8gZGVzdGluYXRpb24gc3RyZWFtCisJZmlfaGFuZGxlIG91dGZpbGU7CisJRnJlZUltYWdlSU8gKm1faW87CisJLy8vIHN0YXJ0IG9mIGJ1ZmZlcgorCUpPQ1RFVCAqIGJ1ZmZlcjsKK30gRGVzdGluYXRpb25NYW5hZ2VyOworCit0eXBlZGVmIFNvdXJjZU1hbmFnZXIqCQlmcmVlaW1hZ2Vfc3JjX3B0cjsKK3R5cGVkZWYgRGVzdGluYXRpb25NYW5hZ2VyKiBmcmVlaW1hZ2VfZHN0X3B0cjsKK3R5cGVkZWYgRXJyb3JNYW5hZ2VyKgkJZnJlZWltYWdlX2Vycm9yX3B0cjsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICBFcnJvciBoYW5kbGluZworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKiogRmF0YWwgZXJyb3JzIChwcmludCBtZXNzYWdlIGFuZCBleGl0KSAqLworc3RhdGljIGlubGluZSB2b2lkCitKUEVHX0VYSVQoal9jb21tb25fcHRyIGNpbmZvLCBpbnQgY29kZSkgeworCWZyZWVpbWFnZV9lcnJvcl9wdHIgZXJyb3JfcHRyID0gKGZyZWVpbWFnZV9lcnJvcl9wdHIpY2luZm8tPmVycjsKKwllcnJvcl9wdHItPnB1Yi5tc2dfY29kZSA9IGNvZGU7CisJZXJyb3JfcHRyLT5wdWIuZXJyb3JfZXhpdChjaW5mbyk7Cit9CisKKy8qKiBOb25mYXRhbCBlcnJvcnMgKHdlIGNhbiBrZWVwIGdvaW5nLCBidXQgdGhlIGRhdGEgaXMgcHJvYmFibHkgY29ycnVwdCkgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorSlBFR19XQVJOSU5HKGpfY29tbW9uX3B0ciBjaW5mbywgaW50IGNvZGUpIHsKKwlmcmVlaW1hZ2VfZXJyb3JfcHRyIGVycm9yX3B0ciA9IChmcmVlaW1hZ2VfZXJyb3JfcHRyKWNpbmZvLT5lcnI7CisJZXJyb3JfcHRyLT5wdWIubXNnX2NvZGUgPSBjb2RlOworCWVycm9yX3B0ci0+cHViLmVtaXRfbWVzc2FnZShjaW5mbywgLTEpOworfQorCisvKioKKwlSZWNlaXZlcyBjb250cm9sIGZvciBhIGZhdGFsIGVycm9yLiAgSW5mb3JtYXRpb24gc3VmZmljaWVudCB0bworCWdlbmVyYXRlIHRoZSBlcnJvciBtZXNzYWdlIGhhcyBiZWVuIHN0b3JlZCBpbiBjaW5mby0+ZXJyOyBjYWxsCisJb3V0cHV0X21lc3NhZ2UgdG8gZGlzcGxheSBpdC4gIENvbnRyb2wgbXVzdCBOT1QgcmV0dXJuIHRvIHRoZSBjYWxsZXI7CisJZ2VuZXJhbGx5IHRoaXMgcm91dGluZSB3aWxsIGV4aXQoKSBvciBsb25nam1wKCkgc29tZXdoZXJlLgorKi8KK01FVEhPRERFRih2b2lkKQoranBlZ19lcnJvcl9leGl0IChqX2NvbW1vbl9wdHIgY2luZm8pIHsKKwlmcmVlaW1hZ2VfZXJyb3JfcHRyIGVycm9yX3B0ciA9IChmcmVlaW1hZ2VfZXJyb3JfcHRyKWNpbmZvLT5lcnI7CisKKwkvLyBhbHdheXMgZGlzcGxheSB0aGUgbWVzc2FnZQorCWVycm9yX3B0ci0+cHViLm91dHB1dF9tZXNzYWdlKGNpbmZvKTsKKworCS8vIGFsbG93IEpQRUcgd2l0aCB1bmtub3duIG1hcmtlcnMKKwlpZihlcnJvcl9wdHItPnB1Yi5tc2dfY29kZSAhPSBKRVJSX1VOS05PV05fTUFSS0VSKSB7CisJCisJCS8vIGxldCB0aGUgbWVtb3J5IG1hbmFnZXIgZGVsZXRlIGFueSB0ZW1wIGZpbGVzIGJlZm9yZSB3ZSBkaWUKKwkJanBlZ19kZXN0cm95KGNpbmZvKTsKKwkJCisJCS8vIHJldHVybiBjb250cm9sIHRvIHRoZSBzZXRqbXAgcG9pbnQKKwkJbG9uZ2ptcChlcnJvcl9wdHItPnNldGptcF9idWZmZXIsIDEpOwkJCisJfQorfQorCisvKioKKwlBY3R1YWwgb3V0cHV0IG9mIGFueSBKUEVHIG1lc3NhZ2UuICBOb3RlIHRoYXQgdGhpcyBtZXRob2QgZG9lcyBub3Qga25vdworCWhvdyB0byBnZW5lcmF0ZSBhIG1lc3NhZ2UsIG9ubHkgd2hlcmUgdG8gc2VuZCBpdC4KKyovCitNRVRIT0RERUYodm9pZCkKK2pwZWdfb3V0cHV0X21lc3NhZ2UgKGpfY29tbW9uX3B0ciBjaW5mbykgeworCWNoYXIgYnVmZmVyW0pNU0dfTEVOR1RIX01BWF07CisJZnJlZWltYWdlX2Vycm9yX3B0ciBlcnJvcl9wdHIgPSAoZnJlZWltYWdlX2Vycm9yX3B0ciljaW5mby0+ZXJyOworCisJLy8gY3JlYXRlIHRoZSBtZXNzYWdlCisJZXJyb3JfcHRyLT5wdWIuZm9ybWF0X21lc3NhZ2UoY2luZm8sIGJ1ZmZlcik7CisJLy8gc2VuZCBpdCB0byB1c2VyJ3MgbWVzc2FnZSBwcm9jCisJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKHNfZm9ybWF0X2lkLCBidWZmZXIpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgIERlc3RpbmF0aW9uIG1hbmFnZXIKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoqCisJSW5pdGlhbGl6ZSBkZXN0aW5hdGlvbi4gIFRoaXMgaXMgY2FsbGVkIGJ5IGpwZWdfc3RhcnRfY29tcHJlc3MoKQorCWJlZm9yZSBhbnkgZGF0YSBpcyBhY3R1YWxseSB3cml0dGVuLiBJdCBtdXN0IGluaXRpYWxpemUKKwluZXh0X291dHB1dF9ieXRlIGFuZCBmcmVlX2luX2J1ZmZlci4gZnJlZV9pbl9idWZmZXIgbXVzdCBiZQorCWluaXRpYWxpemVkIHRvIGEgcG9zaXRpdmUgdmFsdWUuCisqLworTUVUSE9EREVGKHZvaWQpCitpbml0X2Rlc3RpbmF0aW9uIChqX2NvbXByZXNzX3B0ciBjaW5mbykgeworCWZyZWVpbWFnZV9kc3RfcHRyIGRlc3QgPSAoZnJlZWltYWdlX2RzdF9wdHIpIGNpbmZvLT5kZXN0OworCisJZGVzdC0+YnVmZmVyID0gKEpPQ1RFVCAqKQorCSAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkgIE9VVFBVVF9CVUZfU0laRSAqIHNpemVvZihKT0NURVQpKTsKKworCWRlc3QtPnB1Yi5uZXh0X291dHB1dF9ieXRlID0gZGVzdC0+YnVmZmVyOworCWRlc3QtPnB1Yi5mcmVlX2luX2J1ZmZlciA9IE9VVFBVVF9CVUZfU0laRTsKK30KKworLyoqCisJVGhpcyBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIGJ1ZmZlciBoYXMgZmlsbGVkIChmcmVlX2luX2J1ZmZlcgorCXJlYWNoZXMgemVybykuIEluIHR5cGljYWwgYXBwbGljYXRpb25zLCBpdCBzaG91bGQgd3JpdGUgb3V0IHRoZQorCSplbnRpcmUqIGJ1ZmZlciAodXNlIHRoZSBzYXZlZCBzdGFydCBhZGRyZXNzIGFuZCBidWZmZXIgbGVuZ3RoOworCWlnbm9yZSB0aGUgY3VycmVudCBzdGF0ZSBvZiBuZXh0X291dHB1dF9ieXRlIGFuZCBmcmVlX2luX2J1ZmZlcikuCisJVGhlbiByZXNldCB0aGUgcG9pbnRlciAmIGNvdW50IHRvIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyLCBhbmQKKwlyZXR1cm4gVFJVRSBpbmRpY2F0aW5nIHRoYXQgdGhlIGJ1ZmZlciBoYXMgYmVlbiBkdW1wZWQuCisJZnJlZV9pbl9idWZmZXIgbXVzdCBiZSBzZXQgdG8gYSBwb3NpdGl2ZSB2YWx1ZSB3aGVuIFRSVUUgaXMKKwlyZXR1cm5lZC4gIEEgRkFMU0UgcmV0dXJuIHNob3VsZCBvbmx5IGJlIHVzZWQgd2hlbiBJL08gc3VzcGVuc2lvbiBpcworCWRlc2lyZWQuCisqLworTUVUSE9EREVGKGJvb2xlYW4pCitlbXB0eV9vdXRwdXRfYnVmZmVyIChqX2NvbXByZXNzX3B0ciBjaW5mbykgeworCWZyZWVpbWFnZV9kc3RfcHRyIGRlc3QgPSAoZnJlZWltYWdlX2RzdF9wdHIpIGNpbmZvLT5kZXN0OworCisJaWYgKGRlc3QtPm1faW8tPndyaXRlX3Byb2MoZGVzdC0+YnVmZmVyLCAxLCBPVVRQVVRfQlVGX1NJWkUsIGRlc3QtPm91dGZpbGUpICE9IE9VVFBVVF9CVUZfU0laRSkgeworCQkvLyBsZXQgdGhlIG1lbW9yeSBtYW5hZ2VyIGRlbGV0ZSBhbnkgdGVtcCBmaWxlcyBiZWZvcmUgd2UgZGllCisJCWpwZWdfZGVzdHJveSgoal9jb21tb25fcHRyKWNpbmZvKTsKKworCQlKUEVHX0VYSVQoKGpfY29tbW9uX3B0ciljaW5mbywgSkVSUl9GSUxFX1dSSVRFKTsKKwl9CisKKwlkZXN0LT5wdWIubmV4dF9vdXRwdXRfYnl0ZSA9IGRlc3QtPmJ1ZmZlcjsKKwlkZXN0LT5wdWIuZnJlZV9pbl9idWZmZXIgPSBPVVRQVVRfQlVGX1NJWkU7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoqCisJVGVybWluYXRlIGRlc3RpbmF0aW9uIC0tLSBjYWxsZWQgYnkganBlZ19maW5pc2hfY29tcHJlc3MoKSBhZnRlciBhbGwKKwlkYXRhIGhhcyBiZWVuIHdyaXR0ZW4uICBJbiBtb3N0IGFwcGxpY2F0aW9ucywgdGhpcyBtdXN0IGZsdXNoIGFueQorCWRhdGEgcmVtYWluaW5nIGluIHRoZSBidWZmZXIuICBVc2UgZWl0aGVyIG5leHRfb3V0cHV0X2J5dGUgb3IKKwlmcmVlX2luX2J1ZmZlciB0byBkZXRlcm1pbmUgaG93IG11Y2ggZGF0YSBpcyBpbiB0aGUgYnVmZmVyLgorKi8KK01FVEhPRERFRih2b2lkKQordGVybV9kZXN0aW5hdGlvbiAoal9jb21wcmVzc19wdHIgY2luZm8pIHsKKwlmcmVlaW1hZ2VfZHN0X3B0ciBkZXN0ID0gKGZyZWVpbWFnZV9kc3RfcHRyKSBjaW5mby0+ZGVzdDsKKworCXNpemVfdCBkYXRhY291bnQgPSBPVVRQVVRfQlVGX1NJWkUgLSBkZXN0LT5wdWIuZnJlZV9pbl9idWZmZXI7CisKKwkvLyB3cml0ZSBhbnkgZGF0YSByZW1haW5pbmcgaW4gdGhlIGJ1ZmZlcgorCisJaWYgKGRhdGFjb3VudCA+IDApIHsKKwkJaWYgKGRlc3QtPm1faW8tPndyaXRlX3Byb2MoZGVzdC0+YnVmZmVyLCAxLCAodW5zaWduZWQgaW50KWRhdGFjb3VudCwgZGVzdC0+b3V0ZmlsZSkgIT0gZGF0YWNvdW50KSB7CisJCQkvLyBsZXQgdGhlIG1lbW9yeSBtYW5hZ2VyIGRlbGV0ZSBhbnkgdGVtcCBmaWxlcyBiZWZvcmUgd2UgZGllCisJCQlqcGVnX2Rlc3Ryb3koKGpfY29tbW9uX3B0ciljaW5mbyk7CisJCQkKKwkJCUpQRUdfRVhJVCgoal9jb21tb25fcHRyKWNpbmZvLCBKRVJSX0ZJTEVfV1JJVEUpOworCQl9CisJfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgIFNvdXJjZSBtYW5hZ2VyCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qKgorCUluaXRpYWxpemUgc291cmNlLiAgVGhpcyBpcyBjYWxsZWQgYnkganBlZ19yZWFkX2hlYWRlcigpIGJlZm9yZSBhbnkKKwlkYXRhIGlzIGFjdHVhbGx5IHJlYWQuIFVubGlrZSBpbml0X2Rlc3RpbmF0aW9uKCksIGl0IG1heSBsZWF2ZQorCWJ5dGVzX2luX2J1ZmZlciBzZXQgdG8gMCAoaW4gd2hpY2ggY2FzZSBhIGZpbGxfaW5wdXRfYnVmZmVyKCkgY2FsbAorCXdpbGwgb2NjdXIgaW1tZWRpYXRlbHkpLgorKi8KK01FVEhPRERFRih2b2lkKQoraW5pdF9zb3VyY2UgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pIHsKKwlmcmVlaW1hZ2Vfc3JjX3B0ciBzcmMgPSAoZnJlZWltYWdlX3NyY19wdHIpIGNpbmZvLT5zcmM7CisKKwkvKiBXZSByZXNldCB0aGUgZW1wdHktaW5wdXQtZmlsZSBmbGFnIGZvciBlYWNoIGltYWdlLAorIAkgKiBidXQgd2UgZG9uJ3QgY2xlYXIgdGhlIGlucHV0IGJ1ZmZlci4KKwkgKiBUaGlzIGlzIGNvcnJlY3QgYmVoYXZpb3IgZm9yIHJlYWRpbmcgYSBzZXJpZXMgb2YgaW1hZ2VzIGZyb20gb25lIHNvdXJjZS4KKwkqLworCisJc3JjLT5zdGFydF9vZl9maWxlID0gVFJVRTsKK30KKworLyoqCisJVGhpcyBpcyBjYWxsZWQgd2hlbmV2ZXIgYnl0ZXNfaW5fYnVmZmVyIGhhcyByZWFjaGVkIHplcm8gYW5kIG1vcmUKKwlkYXRhIGlzIHdhbnRlZC4gIEluIHR5cGljYWwgYXBwbGljYXRpb25zLCBpdCBzaG91bGQgcmVhZCBmcmVzaCBkYXRhCisJaW50byB0aGUgYnVmZmVyIChpZ25vcmluZyB0aGUgY3VycmVudCBzdGF0ZSBvZiBuZXh0X2lucHV0X2J5dGUgYW5kCisJYnl0ZXNfaW5fYnVmZmVyKSwgcmVzZXQgdGhlIHBvaW50ZXIgJiBjb3VudCB0byB0aGUgc3RhcnQgb2YgdGhlCisJYnVmZmVyLCBhbmQgcmV0dXJuIFRSVUUgaW5kaWNhdGluZyB0aGF0IHRoZSBidWZmZXIgaGFzIGJlZW4gcmVsb2FkZWQuCisJSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBmaWxsIHRoZSBidWZmZXIgZW50aXJlbHksIG9ubHkgdG8gb2J0YWluIGF0CisJbGVhc3Qgb25lIG1vcmUgYnl0ZS4gIGJ5dGVzX2luX2J1ZmZlciBNVVNUIGJlIHNldCB0byBhIHBvc2l0aXZlIHZhbHVlCisJaWYgVFJVRSBpcyByZXR1cm5lZC4gIEEgRkFMU0UgcmV0dXJuIHNob3VsZCBvbmx5IGJlIHVzZWQgd2hlbiBJL08KKwlzdXNwZW5zaW9uIGlzIGRlc2lyZWQuCisqLworTUVUSE9EREVGKGJvb2xlYW4pCitmaWxsX2lucHV0X2J1ZmZlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykgeworCWZyZWVpbWFnZV9zcmNfcHRyIHNyYyA9IChmcmVlaW1hZ2Vfc3JjX3B0cikgY2luZm8tPnNyYzsKKworCXNpemVfdCBuYnl0ZXMgPSBzcmMtPm1faW8tPnJlYWRfcHJvYyhzcmMtPmJ1ZmZlciwgMSwgSU5QVVRfQlVGX1NJWkUsIHNyYy0+aW5maWxlKTsKKworCWlmIChuYnl0ZXMgPD0gMCkgeworCQlpZiAoc3JjLT5zdGFydF9vZl9maWxlKQl7CisJCQkvLyB0cmVhdCBlbXB0eSBpbnB1dCBmaWxlIGFzIGZhdGFsIGVycm9yCisKKwkJCS8vIGxldCB0aGUgbWVtb3J5IG1hbmFnZXIgZGVsZXRlIGFueSB0ZW1wIGZpbGVzIGJlZm9yZSB3ZSBkaWUKKwkJCWpwZWdfZGVzdHJveSgoal9jb21tb25fcHRyKWNpbmZvKTsKKworCQkJSlBFR19FWElUKChqX2NvbW1vbl9wdHIpY2luZm8sIEpFUlJfSU5QVVRfRU1QVFkpOworCQl9CisKKwkJSlBFR19XQVJOSU5HKChqX2NvbW1vbl9wdHIpY2luZm8sIEpXUk5fSlBFR19FT0YpOworCisJCS8qIEluc2VydCBhIGZha2UgRU9JIG1hcmtlciAqLworCisJCXNyYy0+YnVmZmVyWzBdID0gKEpPQ1RFVCkgMHhGRjsKKwkJc3JjLT5idWZmZXJbMV0gPSAoSk9DVEVUKSBKUEVHX0VPSTsKKworCQluYnl0ZXMgPSAyOworCX0KKworCXNyYy0+cHViLm5leHRfaW5wdXRfYnl0ZSA9IHNyYy0+YnVmZmVyOworCXNyYy0+cHViLmJ5dGVzX2luX2J1ZmZlciA9IG5ieXRlczsKKwlzcmMtPnN0YXJ0X29mX2ZpbGUgPSBGQUxTRTsKKworCXJldHVybiBUUlVFOworfQorCisvKioKKwlTa2lwIG51bV9ieXRlcyB3b3J0aCBvZiBkYXRhLiAgVGhlIGJ1ZmZlciBwb2ludGVyIGFuZCBjb3VudCBzaG91bGQKKwliZSBhZHZhbmNlZCBvdmVyIG51bV9ieXRlcyBpbnB1dCBieXRlcywgcmVmaWxsaW5nIHRoZSBidWZmZXIgYXMKKwluZWVkZWQuIFRoaXMgaXMgdXNlZCB0byBza2lwIG92ZXIgYSBwb3RlbnRpYWxseSBsYXJnZSBhbW91bnQgb2YKKwl1bmludGVyZXN0aW5nIGRhdGEgKHN1Y2ggYXMgYW4gQVBQbiBtYXJrZXIpLiBJbiBzb21lIGFwcGxpY2F0aW9ucworCWl0IG1heSBiZSBwb3NzaWJsZSB0byBvcHRpbWl6ZSBhd2F5IHRoZSByZWFkaW5nIG9mIHRoZSBza2lwcGVkIGRhdGEsCisJYnV0IGl0J3Mgbm90IGNsZWFyIHRoYXQgYmVpbmcgc21hcnQgaXMgd29ydGggbXVjaCB0cm91YmxlOyBsYXJnZQorCXNraXBzIGFyZSB1bmNvbW1vbi4gIGJ5dGVzX2luX2J1ZmZlciBtYXkgYmUgemVybyBvbiByZXR1cm4uCisJQSB6ZXJvIG9yIG5lZ2F0aXZlIHNraXAgY291bnQgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYSBuby1vcC4KKyovCitNRVRIT0RERUYodm9pZCkKK3NraXBfaW5wdXRfZGF0YSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgbG9uZyBudW1fYnl0ZXMpIHsKKwlmcmVlaW1hZ2Vfc3JjX3B0ciBzcmMgPSAoZnJlZWltYWdlX3NyY19wdHIpIGNpbmZvLT5zcmM7CisKKwkvKiBKdXN0IGEgZHVtYiBpbXBsZW1lbnRhdGlvbiBmb3Igbm93LiAgQ291bGQgdXNlIGZzZWVrKCkgZXhjZXB0CisgICAgICogaXQgZG9lc24ndCB3b3JrIG9uIHBpcGVzLiAgTm90IGNsZWFyIHRoYXQgYmVpbmcgc21hcnQgaXMgd29ydGgKKwkgKiBhbnkgdHJvdWJsZSBhbnl3YXkgLS0tIGxhcmdlIHNraXBzIGFyZSBpbmZyZXF1ZW50LgorCSovCisKKwlpZiAobnVtX2J5dGVzID4gMCkgeworCQl3aGlsZSAobnVtX2J5dGVzID4gKGxvbmcpIHNyYy0+cHViLmJ5dGVzX2luX2J1ZmZlcikgeworCQkgIG51bV9ieXRlcyAtPSAobG9uZykgc3JjLT5wdWIuYnl0ZXNfaW5fYnVmZmVyOworCisJCSAgKHZvaWQpIGZpbGxfaW5wdXRfYnVmZmVyKGNpbmZvKTsKKworCQkgIC8qIG5vdGUgd2UgYXNzdW1lIHRoYXQgZmlsbF9pbnB1dF9idWZmZXIgd2lsbCBuZXZlciByZXR1cm4gRkFMU0UsCisJCSAgICogc28gc3VzcGVuc2lvbiBuZWVkIG5vdCBiZSBoYW5kbGVkLgorCQkgICAqLworCQl9CisKKwkJc3JjLT5wdWIubmV4dF9pbnB1dF9ieXRlICs9IChzaXplX3QpIG51bV9ieXRlczsKKwkJc3JjLT5wdWIuYnl0ZXNfaW5fYnVmZmVyIC09IChzaXplX3QpIG51bV9ieXRlczsKKwl9Cit9CisKKy8qKgorCVRlcm1pbmF0ZSBzb3VyY2UgLS0tIGNhbGxlZCBieSBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzCisJYWZ0ZXIgYWxsIGRhdGEgaGFzIGJlZW4gcmVhZC4gIE9mdGVuIGEgbm8tb3AuCisKKwlOQjogKm5vdCogY2FsbGVkIGJ5IGpwZWdfYWJvcnQgb3IganBlZ19kZXN0cm95OyBzdXJyb3VuZGluZworCWFwcGxpY2F0aW9uIG11c3QgZGVhbCB3aXRoIGFueSBjbGVhbnVwIHRoYXQgc2hvdWxkIGhhcHBlbiBldmVuCisJZm9yIGVycm9yIGV4aXQuCisqLworTUVUSE9EREVGKHZvaWQpCit0ZXJtX3NvdXJjZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykgeworICAvLyBubyB3b3JrIG5lY2Vzc2FyeSBoZXJlCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgU291cmNlIG1hbmFnZXIgJiBEZXN0aW5hdGlvbiBtYW5hZ2VyIHNldHVwCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qKgorCVByZXBhcmUgZm9yIGlucHV0IGZyb20gYSBzdGRpbyBzdHJlYW0uCisJVGhlIGNhbGxlciBtdXN0IGhhdmUgYWxyZWFkeSBvcGVuZWQgdGhlIHN0cmVhbSwgYW5kIGlzIHJlc3BvbnNpYmxlCisJZm9yIGNsb3NpbmcgaXQgYWZ0ZXIgZmluaXNoaW5nIGRlY29tcHJlc3Npb24uCisqLworR0xPQkFMKHZvaWQpCitqcGVnX2ZyZWVpbWFnZV9zcmMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGZpX2hhbmRsZSBpbmZpbGUsIEZyZWVJbWFnZUlPICppbykgeworCWZyZWVpbWFnZV9zcmNfcHRyIHNyYzsKKworCS8vIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGJ1ZmZlci4gaXMgcmVsZWFzZWQgYXV0b21hdGljYWxseSBpbiB0aGUgZW5kCisKKwlpZiAoY2luZm8tPnNyYyA9PSBOVUxMKSB7CisJCWNpbmZvLT5zcmMgPSAoc3RydWN0IGpwZWdfc291cmNlX21nciAqKSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKQorCQkJKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9QRVJNQU5FTlQsIHNpemVvZihTb3VyY2VNYW5hZ2VyKSk7CisKKwkJc3JjID0gKGZyZWVpbWFnZV9zcmNfcHRyKSBjaW5mby0+c3JjOworCisJCXNyYy0+YnVmZmVyID0gKEpPQ1RFVCAqKSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKQorCQkJKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9QRVJNQU5FTlQsIElOUFVUX0JVRl9TSVpFICogc2l6ZW9mKEpPQ1RFVCkpOworCX0KKworCS8vIGluaXRpYWxpemUgdGhlIGpwZWcgcG9pbnRlciBzdHJ1Y3Qgd2l0aCBwb2ludGVycyB0byBmdW5jdGlvbnMKKworCXNyYyA9IChmcmVlaW1hZ2Vfc3JjX3B0cikgY2luZm8tPnNyYzsKKwlzcmMtPnB1Yi5pbml0X3NvdXJjZSA9IGluaXRfc291cmNlOworCXNyYy0+cHViLmZpbGxfaW5wdXRfYnVmZmVyID0gZmlsbF9pbnB1dF9idWZmZXI7CisJc3JjLT5wdWIuc2tpcF9pbnB1dF9kYXRhID0gc2tpcF9pbnB1dF9kYXRhOworCXNyYy0+cHViLnJlc3luY190b19yZXN0YXJ0ID0ganBlZ19yZXN5bmNfdG9fcmVzdGFydDsgLy8gdXNlIGRlZmF1bHQgbWV0aG9kIAorCXNyYy0+cHViLnRlcm1fc291cmNlID0gdGVybV9zb3VyY2U7CisJc3JjLT5pbmZpbGUgPSBpbmZpbGU7CisJc3JjLT5tX2lvID0gaW87CisJc3JjLT5wdWIuYnl0ZXNfaW5fYnVmZmVyID0gMDsJCS8vIGZvcmNlcyBmaWxsX2lucHV0X2J1ZmZlciBvbiBmaXJzdCByZWFkIAorCXNyYy0+cHViLm5leHRfaW5wdXRfYnl0ZSA9IE5VTEw7CS8vIHVudGlsIGJ1ZmZlciBsb2FkZWQgCit9CisKKy8qKgorCVByZXBhcmUgZm9yIG91dHB1dCB0byBhIHN0ZGlvIHN0cmVhbS4KKwlUaGUgY2FsbGVyIG11c3QgaGF2ZSBhbHJlYWR5IG9wZW5lZCB0aGUgc3RyZWFtLCBhbmQgaXMgcmVzcG9uc2libGUKKwlmb3IgY2xvc2luZyBpdCBhZnRlciBmaW5pc2hpbmcgY29tcHJlc3Npb24uCisqLworR0xPQkFMKHZvaWQpCitqcGVnX2ZyZWVpbWFnZV9kc3QgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBmaV9oYW5kbGUgb3V0ZmlsZSwgRnJlZUltYWdlSU8gKmlvKSB7CisJZnJlZWltYWdlX2RzdF9wdHIgZGVzdDsKKworCWlmIChjaW5mby0+ZGVzdCA9PSBOVUxMKSB7CisJCWNpbmZvLT5kZXN0ID0gKHN0cnVjdCBqcGVnX2Rlc3RpbmF0aW9uX21nciAqKSgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpCisJCQkoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX1BFUk1BTkVOVCwgc2l6ZW9mKERlc3RpbmF0aW9uTWFuYWdlcikpOworCX0KKworCWRlc3QgPSAoZnJlZWltYWdlX2RzdF9wdHIpIGNpbmZvLT5kZXN0OworCWRlc3QtPnB1Yi5pbml0X2Rlc3RpbmF0aW9uID0gaW5pdF9kZXN0aW5hdGlvbjsKKwlkZXN0LT5wdWIuZW1wdHlfb3V0cHV0X2J1ZmZlciA9IGVtcHR5X291dHB1dF9idWZmZXI7CisJZGVzdC0+cHViLnRlcm1fZGVzdGluYXRpb24gPSB0ZXJtX2Rlc3RpbmF0aW9uOworCWRlc3QtPm91dGZpbGUgPSBvdXRmaWxlOworCWRlc3QtPm1faW8gPSBpbzsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICBTcGVjaWFsIG1hcmtlcnMgcmVhZCBmdW5jdGlvbnMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoqCisJUmVhZCBKUEVHX0NPTSBtYXJrZXIgKGNvbW1lbnQpCisqLworc3RhdGljIEJPT0wgCitqcGVnX3JlYWRfY29tbWVudChGSUJJVE1BUCAqZGliLCBjb25zdCBCWVRFICpkYXRhcHRyLCB1bnNpZ25lZCBpbnQgZGF0YWxlbikgeworCXNpemVfdCBsZW5ndGggPSBkYXRhbGVuOworCUJZVEUgKnByb2ZpbGUgPSAoQllURSopZGF0YXB0cjsKKworCS8vIHJlYWQgdGhlIGNvbW1lbnQKKwljaGFyICp2YWx1ZSA9IChjaGFyKiltYWxsb2MoKGxlbmd0aCArIDEpICogc2l6ZW9mKGNoYXIpKTsKKwlpZih2YWx1ZSA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CisJbWVtY3B5KHZhbHVlLCBwcm9maWxlLCBsZW5ndGgpOworCXZhbHVlW2xlbmd0aF0gPSAnXDAnOworCisJLy8gY3JlYXRlIGEgdGFnCisJRklUQUcgKnRhZyA9IEZyZWVJbWFnZV9DcmVhdGVUYWcoKTsKKwlpZih0YWcpIHsKKwkJdW5zaWduZWQgaW50IGNvdW50ID0gKHVuc2lnbmVkIGludClsZW5ndGggKyAxOwkvLyBpbmNsdWRlcyB0aGUgbnVsbCB2YWx1ZQorCisJCUZyZWVJbWFnZV9TZXRUYWdJRCh0YWcsIEpQRUdfQ09NKTsKKwkJRnJlZUltYWdlX1NldFRhZ0tleSh0YWcsICJDb21tZW50Iik7CisJCUZyZWVJbWFnZV9TZXRUYWdMZW5ndGgodGFnLCBjb3VudCk7CisJCUZyZWVJbWFnZV9TZXRUYWdDb3VudCh0YWcsIGNvdW50KTsKKwkJRnJlZUltYWdlX1NldFRhZ1R5cGUodGFnLCBGSURUX0FTQ0lJKTsKKwkJRnJlZUltYWdlX1NldFRhZ1ZhbHVlKHRhZywgdmFsdWUpOworCQkKKwkJLy8gc3RvcmUgdGhlIHRhZworCQlGcmVlSW1hZ2VfU2V0TWV0YWRhdGEoRklNRF9DT01NRU5UUywgZGliLCBGcmVlSW1hZ2VfR2V0VGFnS2V5KHRhZyksIHRhZyk7CisKKwkJLy8gZGVzdHJveSB0aGUgdGFnCisJCUZyZWVJbWFnZV9EZWxldGVUYWcodGFnKTsKKwl9CisKKwlmcmVlKHZhbHVlKTsKKworCXJldHVybiBUUlVFOworfQorCisvKiogCisJUmVhZCBKUEVHX0FQUDIgbWFya2VyIChJQ0MgcHJvZmlsZSkKKyovCisKKy8qKgorSGFuZHkgc3Vicm91dGluZSB0byB0ZXN0IHdoZXRoZXIgYSBzYXZlZCBtYXJrZXIgaXMgYW4gSUNDIHByb2ZpbGUgbWFya2VyLgorKi8KK3N0YXRpYyBCT09MIAorbWFya2VyX2lzX2ljYyhqcGVnX3NhdmVkX21hcmtlcl9wdHIgbWFya2VyKSB7CisgICAgLy8gbWFya2VyIGlkZW50aWZ5aW5nIHN0cmluZyAiSUNDX1BST0ZJTEUiIChudWxsLXRlcm1pbmF0ZWQpCisJY29uc3QgQllURSBpY2Nfc2lnbmF0dXJlWzEyXSA9IHsgMHg0OSwgMHg0MywgMHg0MywgMHg1RiwgMHg1MCwgMHg1MiwgMHg0RiwgMHg0NiwgMHg0OSwgMHg0QywgMHg0NSwgMHgwMCB9OworCisJaWYobWFya2VyLT5tYXJrZXIgPT0gSUNDX01BUktFUikgeworCQkvLyB2ZXJpZnkgdGhlIGlkZW50aWZ5aW5nIHN0cmluZworCQlpZihtYXJrZXItPmRhdGFfbGVuZ3RoID49IElDQ19IRUFERVJfU0laRSkgeworCQkJaWYobWVtY21wKGljY19zaWduYXR1cmUsIG1hcmtlci0+ZGF0YSwgc2l6ZW9mKGljY19zaWduYXR1cmUpKSA9PSAwKSB7CisJCQkJcmV0dXJuIFRSVUU7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICBTZWUgaWYgdGhlcmUgd2FzIGFuIElDQyBwcm9maWxlIGluIHRoZSBKUEVHIGZpbGUgYmVpbmcgcmVhZDsKKyAgaWYgc28sIHJlYXNzZW1ibGUgYW5kIHJldHVybiB0aGUgcHJvZmlsZSBkYXRhLgorCisgIFRSVUUgaXMgcmV0dXJuZWQgaWYgYW4gSUNDIHByb2ZpbGUgd2FzIGZvdW5kLCBGQUxTRSBpZiBub3QuCisgIElmIFRSVUUgaXMgcmV0dXJuZWQsICppY2NfZGF0YV9wdHIgaXMgc2V0IHRvIHBvaW50IHRvIHRoZQorICByZXR1cm5lZCBkYXRhLCBhbmQgKmljY19kYXRhX2xlbiBpcyBzZXQgdG8gaXRzIGxlbmd0aC4KKyAgCisgIElNUE9SVEFOVDogdGhlIGRhdGEgYXQgKippY2NfZGF0YV9wdHIgaGFzIGJlZW4gYWxsb2NhdGVkIHdpdGggbWFsbG9jKCkKKyAgYW5kIG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlciB3aXRoIGZyZWUoKSB3aGVuIHRoZSBjYWxsZXIgbm8gbG9uZ2VyCisgIG5lZWRzIGl0LiAgKEFsdGVybmF0aXZlbHksIHdlIGNvdWxkIHdyaXRlIHRoaXMgcm91dGluZSB0byB1c2UgdGhlCisgIElKRyBsaWJyYXJ5J3MgbWVtb3J5IGFsbG9jYXRvciwgc28gdGhhdCB0aGUgZGF0YSB3b3VsZCBiZSBmcmVlZCBpbXBsaWNpdGx5CisgIGF0IGpwZWdfZmluaXNoX2RlY29tcHJlc3MoKSB0aW1lLiAgQnV0IGl0IHNlZW1zIGxpa2VseSB0aGF0IG1hbnkgYXBwcworICB3aWxsIHByZWZlciB0byBoYXZlIHRoZSBkYXRhIHN0aWNrIGFyb3VuZCBhZnRlciBkZWNvbXByZXNzaW9uIGZpbmlzaGVzLikKKyAgCisgIE5PVEU6IGlmIHRoZSBmaWxlIGNvbnRhaW5zIGludmFsaWQgSUNDIEFQUDIgbWFya2Vycywgd2UganVzdCBzaWxlbnRseQorICByZXR1cm4gRkFMU0UuICBZb3UgbWlnaHQgd2FudCB0byBpc3N1ZSBhbiBlcnJvciBtZXNzYWdlIGluc3RlYWQuCisqLworc3RhdGljIEJPT0wgCitqcGVnX3JlYWRfaWNjX3Byb2ZpbGUoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSk9DVEVUICoqaWNjX2RhdGFfcHRyLCB1bnNpZ25lZCAqaWNjX2RhdGFfbGVuKSB7CisJanBlZ19zYXZlZF9tYXJrZXJfcHRyIG1hcmtlcjsKKwlpbnQgbnVtX21hcmtlcnMgPSAwOworCWludCBzZXFfbm87CisJSk9DVEVUICppY2NfZGF0YTsKKwl1bnNpZ25lZCB0b3RhbF9sZW5ndGg7CisKKwljb25zdCBpbnQgTUFYX1NFUV9OTyA9IDI1NTsJCQkvLyBzdWZmaWNpZW50IHNpbmNlIG1hcmtlciBudW1iZXJzIGFyZSBieXRlcworCUJZVEUgbWFya2VyX3ByZXNlbnRbTUFYX1NFUV9OTysxXTsJLy8gMSBpZiBtYXJrZXIgZm91bmQKKwl1bnNpZ25lZCBkYXRhX2xlbmd0aFtNQVhfU0VRX05PKzFdOwkvLyBzaXplIG9mIHByb2ZpbGUgZGF0YSBpbiBtYXJrZXIKKwl1bnNpZ25lZCBkYXRhX29mZnNldFtNQVhfU0VRX05PKzFdOwkvLyBvZmZzZXQgZm9yIGRhdGEgaW4gbWFya2VyCisJCisJKmljY19kYXRhX3B0ciA9IE5VTEw7CQkvLyBhdm9pZCBjb25mdXNpb24gaWYgRkFMU0UgcmV0dXJuCisJKmljY19kYXRhX2xlbiA9IDA7CisJCisJLyoqCisJdGhpcyBmaXJzdCBwYXNzIG92ZXIgdGhlIHNhdmVkIG1hcmtlcnMgZGlzY292ZXJzIHdoZXRoZXIgdGhlcmUgYXJlCisJYW55IElDQyBtYXJrZXJzIGFuZCB2ZXJpZmllcyB0aGUgY29uc2lzdGVuY3kgb2YgdGhlIG1hcmtlciBudW1iZXJpbmcuCisJKi8KKwkKKwltZW1zZXQobWFya2VyX3ByZXNlbnQsIDAsIChNQVhfU0VRX05PICsgMSkpOworCQorCWZvcihtYXJrZXIgPSBjaW5mby0+bWFya2VyX2xpc3Q7IG1hcmtlciAhPSBOVUxMOyBtYXJrZXIgPSBtYXJrZXItPm5leHQpIHsKKwkJaWYgKG1hcmtlcl9pc19pY2MobWFya2VyKSkgeworCQkJaWYgKG51bV9tYXJrZXJzID09IDApIHsKKwkJCQkvLyBudW1iZXIgb2YgbWFya2VycworCQkJCW51bV9tYXJrZXJzID0gR0VUSk9DVEVUKG1hcmtlci0+ZGF0YVsxM10pOworCQkJfQorCQkJZWxzZSBpZiAobnVtX21hcmtlcnMgIT0gR0VUSk9DVEVUKG1hcmtlci0+ZGF0YVsxM10pKSB7CisJCQkJcmV0dXJuIEZBTFNFOwkJLy8gaW5jb25zaXN0ZW50IG51bV9tYXJrZXJzIGZpZWxkcyAKKwkJCX0KKwkJCS8vIHNlcXVlbmNlIG51bWJlcgorCQkJc2VxX25vID0gR0VUSk9DVEVUKG1hcmtlci0+ZGF0YVsxMl0pOworCQkJaWYgKHNlcV9ubyA8PSAwIHx8IHNlcV9ubyA+IG51bV9tYXJrZXJzKSB7CisJCQkJcmV0dXJuIEZBTFNFOwkJLy8gYm9ndXMgc2VxdWVuY2UgbnVtYmVyIAorCQkJfQorCQkJaWYgKG1hcmtlcl9wcmVzZW50W3NlcV9ub10pIHsKKwkJCQlyZXR1cm4gRkFMU0U7CQkvLyBkdXBsaWNhdGUgc2VxdWVuY2UgbnVtYmVycyAKKwkJCX0KKwkJCW1hcmtlcl9wcmVzZW50W3NlcV9ub10gPSAxOworCQkJZGF0YV9sZW5ndGhbc2VxX25vXSA9IG1hcmtlci0+ZGF0YV9sZW5ndGggLSBJQ0NfSEVBREVSX1NJWkU7CisJCX0KKwl9CisJCisJaWYgKG51bV9tYXJrZXJzID09IDApCisJCXJldHVybiBGQUxTRTsKKwkJCisJLyoqCisJY2hlY2sgZm9yIG1pc3NpbmcgbWFya2VycywgY291bnQgdG90YWwgc3BhY2UgbmVlZGVkLAorCWNvbXB1dGUgb2Zmc2V0IG9mIGVhY2ggbWFya2VyJ3MgcGFydCBvZiB0aGUgZGF0YS4KKwkqLworCQorCXRvdGFsX2xlbmd0aCA9IDA7CisJZm9yKHNlcV9ubyA9IDE7IHNlcV9ubyA8PSBudW1fbWFya2Vyczsgc2VxX25vKyspIHsKKwkJaWYgKG1hcmtlcl9wcmVzZW50W3NlcV9ub10gPT0gMCkgeworCQkJcmV0dXJuIEZBTFNFOwkJLy8gbWlzc2luZyBzZXF1ZW5jZSBudW1iZXIKKwkJfQorCQlkYXRhX29mZnNldFtzZXFfbm9dID0gdG90YWxfbGVuZ3RoOworCQl0b3RhbF9sZW5ndGggKz0gZGF0YV9sZW5ndGhbc2VxX25vXTsKKwl9CisJCisJaWYgKHRvdGFsX2xlbmd0aCA8PSAwKQorCQlyZXR1cm4gRkFMU0U7CQkvLyBmb3VuZCBvbmx5IGVtcHR5IG1hcmtlcnMgPworCQorCS8vIGFsbG9jYXRlIHNwYWNlIGZvciBhc3NlbWJsZWQgZGF0YSAKKwlpY2NfZGF0YSA9IChKT0NURVQgKikgbWFsbG9jKHRvdGFsX2xlbmd0aCAqIHNpemVvZihKT0NURVQpKTsKKwlpZiAoaWNjX2RhdGEgPT0gTlVMTCkKKwkJcmV0dXJuIEZBTFNFOwkJLy8gb3V0IG9mIG1lbW9yeQorCQorCS8vIGFuZCBmaWxsIGl0IGluCisJZm9yIChtYXJrZXIgPSBjaW5mby0+bWFya2VyX2xpc3Q7IG1hcmtlciAhPSBOVUxMOyBtYXJrZXIgPSBtYXJrZXItPm5leHQpIHsKKwkJaWYgKG1hcmtlcl9pc19pY2MobWFya2VyKSkgeworCQkJSk9DVEVUIEZBUiAqc3JjX3B0cjsKKwkJCUpPQ1RFVCAqZHN0X3B0cjsKKwkJCXVuc2lnbmVkIGxlbmd0aDsKKwkJCXNlcV9ubyA9IEdFVEpPQ1RFVChtYXJrZXItPmRhdGFbMTJdKTsKKwkJCWRzdF9wdHIgPSBpY2NfZGF0YSArIGRhdGFfb2Zmc2V0W3NlcV9ub107CisJCQlzcmNfcHRyID0gbWFya2VyLT5kYXRhICsgSUNDX0hFQURFUl9TSVpFOworCQkJbGVuZ3RoID0gZGF0YV9sZW5ndGhbc2VxX25vXTsKKwkJCXdoaWxlIChsZW5ndGgtLSkgeworCQkJCSpkc3RfcHRyKysgPSAqc3JjX3B0cisrOworCQkJfQorCQl9CisJfQorCQorCSppY2NfZGF0YV9wdHIgPSBpY2NfZGF0YTsKKwkqaWNjX2RhdGFfbGVuID0gdG90YWxfbGVuZ3RoOworCQorCXJldHVybiBUUlVFOworfQorCisvKioKKwlSZWFkIEpQRUdfQVBQRCBtYXJrZXIgKElQVEMgb3IgQWRvYmUgUGhvdG9zaG9wIHByb2ZpbGUpCisqLworc3RhdGljIEJPT0wgCitqcGVnX3JlYWRfaXB0Y19wcm9maWxlKEZJQklUTUFQICpkaWIsIGNvbnN0IEJZVEUgKmRhdGFwdHIsIHVuc2lnbmVkIGludCBkYXRhbGVuKSB7CisJcmV0dXJuIHJlYWRfaXB0Y19wcm9maWxlKGRpYiwgZGF0YXB0ciwgZGF0YWxlbik7Cit9CisKKy8qKgorCVJlYWQgSlBFR19BUFAxIG1hcmtlciAoWE1QIHByb2ZpbGUpCisJQHBhcmFtIGRpYiBJbnB1dCBGSUJJVE1BUAorCUBwYXJhbSBkYXRhcHRyIFBvaW50ZXIgdG8gdGhlIEFQUDEgbWFya2VyCisJQHBhcmFtIGRhdGFsZW4gQVBQMSBtYXJrZXIgbGVuZ3RoCisJQHJldHVybiBSZXR1cm5zIFRSVUUgaWYgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlCisqLworc3RhdGljIEJPT0wgIAoranBlZ19yZWFkX3htcF9wcm9maWxlKEZJQklUTUFQICpkaWIsIGNvbnN0IEJZVEUgKmRhdGFwdHIsIHVuc2lnbmVkIGludCBkYXRhbGVuKSB7CisJLy8gbWFya2VyIGlkZW50aWZ5aW5nIHN0cmluZyBmb3IgWE1QIChudWxsIHRlcm1pbmF0ZWQpCisJY29uc3QgY2hhciAqeG1wX3NpZ25hdHVyZSA9ICJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIjsKKwkvLyBYTVAgc2lnbmF0dXJlIGlzIDI5IGJ5dGVzIGxvbmcKKwljb25zdCBzaXplX3QgeG1wX3NpZ25hdHVyZV9zaXplID0gc3RybGVuKHhtcF9zaWduYXR1cmUpICsgMTsKKworCXNpemVfdCBsZW5ndGggPSBkYXRhbGVuOworCUJZVEUgKnByb2ZpbGUgPSAoQllURSopZGF0YXB0cjsKKworCWlmKGxlbmd0aCA8PSB4bXBfc2lnbmF0dXJlX3NpemUpIHsKKwkJLy8gYXZvaWQgcmVhZGluZyBjb3JydXB0ZWQgb3IgZW1wdHkgZGF0YSAKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCS8vIHZlcmlmeSB0aGUgaWRlbnRpZnlpbmcgc3RyaW5nCisKKwlpZihtZW1jbXAoeG1wX3NpZ25hdHVyZSwgcHJvZmlsZSwgc3RybGVuKHhtcF9zaWduYXR1cmUpKSA9PSAwKSB7CisJCS8vIFhNUCBwcm9maWxlCisKKwkJcHJvZmlsZSArPSB4bXBfc2lnbmF0dXJlX3NpemU7CisJCWxlbmd0aCAgLT0geG1wX3NpZ25hdHVyZV9zaXplOworCisJCS8vIGNyZWF0ZSBhIHRhZworCQlGSVRBRyAqdGFnID0gRnJlZUltYWdlX0NyZWF0ZVRhZygpOworCQlpZih0YWcpIHsKKwkJCUZyZWVJbWFnZV9TZXRUYWdJRCh0YWcsIEpQRUdfQVBQMCsxKTsJLy8gMHhGRkUxCisJCQlGcmVlSW1hZ2VfU2V0VGFnS2V5KHRhZywgZ19UYWdMaWJfWE1QRmllbGROYW1lKTsKKwkJCUZyZWVJbWFnZV9TZXRUYWdMZW5ndGgodGFnLCAoRFdPUkQpbGVuZ3RoKTsKKwkJCUZyZWVJbWFnZV9TZXRUYWdDb3VudCh0YWcsIChEV09SRClsZW5ndGgpOworCQkJRnJlZUltYWdlX1NldFRhZ1R5cGUodGFnLCBGSURUX0FTQ0lJKTsKKwkJCUZyZWVJbWFnZV9TZXRUYWdWYWx1ZSh0YWcsIHByb2ZpbGUpOworCQkJCisJCQkvLyBzdG9yZSB0aGUgdGFnCisJCQlGcmVlSW1hZ2VfU2V0TWV0YWRhdGEoRklNRF9YTVAsIGRpYiwgRnJlZUltYWdlX0dldFRhZ0tleSh0YWcpLCB0YWcpOworCisJCQkvLyBkZXN0cm95IHRoZSB0YWcKKwkJCUZyZWVJbWFnZV9EZWxldGVUYWcodGFnKTsKKwkJfQorCisJCXJldHVybiBUUlVFOworCX0KKworCXJldHVybiBGQUxTRTsKK30KKworLyoqCisJUmVhZCBKRklGICJKRlhYIiBleHRlbnNpb24gQVBQMCBtYXJrZXIKKwlAcGFyYW0gZGliIElucHV0IEZJQklUTUFQCisJQHBhcmFtIGRhdGFwdHIgUG9pbnRlciB0byB0aGUgQVBQMCBtYXJrZXIKKwlAcGFyYW0gZGF0YWxlbiBBUFAwIG1hcmtlciBsZW5ndGgKKwlAcmV0dXJuIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UKKyovCitzdGF0aWMgQk9PTCAKK2pwZWdfcmVhZF9qZnh4KEZJQklUTUFQICpkaWIsIGNvbnN0IEJZVEUgKmRhdGFwdHIsIHVuc2lnbmVkIGludCBkYXRhbGVuKSB7CisJaWYoZGF0YWxlbiA8IDYpIHsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwkKKwljb25zdCBpbnQgaWRfbGVuZ3RoID0gNTsKKwljb25zdCBCWVRFICpkYXRhID0gZGF0YXB0ciArIGlkX2xlbmd0aDsKKwl1bnNpZ25lZCByZW1haW5pbmcgPSBkYXRhbGVuIC0gaWRfbGVuZ3RoOworCQkKKwljb25zdCBCWVRFIHR5cGUgPSAqZGF0YTsKKwkrK2RhdGEsIC0tcmVtYWluaW5nOworCisJc3dpdGNoKHR5cGUpIHsKKwkJY2FzZSBKRlhYX1RZUEVfSlBFRzoKKwkJeworCQkJLy8gbG9hZCB0aGUgdGh1bWJuYWlsCisJCQlGSU1FTU9SWSogaG1lbSA9IEZyZWVJbWFnZV9PcGVuTWVtb3J5KGNvbnN0X2Nhc3Q8QllURSo+KGRhdGEpLCByZW1haW5pbmcpOworCQkJRklCSVRNQVAqIHRodW1ibmFpbCA9IEZyZWVJbWFnZV9Mb2FkRnJvbU1lbW9yeShGSUZfSlBFRywgaG1lbSk7CisJCQlGcmVlSW1hZ2VfQ2xvc2VNZW1vcnkoaG1lbSk7CisJCQkvLyBzdG9yZSB0aGUgdGh1bWJuYWlsCisJCQlGcmVlSW1hZ2VfU2V0VGh1bWJuYWlsKGRpYiwgdGh1bWJuYWlsKTsKKwkJCS8vIHRoZW4gZGVsZXRlIGl0CisJCQlGcmVlSW1hZ2VfVW5sb2FkKHRodW1ibmFpbCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIEpGWFhfVFlQRV84Yml0OgorCQkJLy8gY29sb3JtYXBwZWQgdW5jb21wcmVzc2VkIHRodW1ibmFpbCAobm8gc3VwcG9ydGVkKQorCQkJYnJlYWs7CisJCWNhc2UgSkZYWF9UWVBFXzI0Yml0OgorCQkJLy8gdHJ1ZWNvbG9yIHVuY29tcHJlc3NlZCB0aHVtYm5haWwgKG5vIHN1cHBvcnRlZCkKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKKworLyoqCisJUmVhZCBKUEVHIHNwZWNpYWwgbWFya2VycworKi8KK3N0YXRpYyBCT09MIAorcmVhZF9tYXJrZXJzKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEZJQklUTUFQICpkaWIpIHsKKwlqcGVnX3NhdmVkX21hcmtlcl9wdHIgbWFya2VyOworCisJZm9yKG1hcmtlciA9IGNpbmZvLT5tYXJrZXJfbGlzdDsgbWFya2VyICE9IE5VTEw7IG1hcmtlciA9IG1hcmtlci0+bmV4dCkgeworCQlzd2l0Y2gobWFya2VyLT5tYXJrZXIpIHsKKwkJCWNhc2UgSlBFR19BUFAwOgorCQkJCS8vIEpGSUYgaXMgaGFuZGxlZCBieSBsaWJqcGVnIGFscmVhZHksIGhhbmRsZSBKRlhYCisJCQkJaWYobWVtY21wKG1hcmtlci0+ZGF0YSwgIkpGSUYiICwgNSkgPT0gMCkgeworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJaWYobWVtY21wKG1hcmtlci0+ZGF0YSwgIkpGWFgiICwgNSkgPT0gMCkgeworCQkJCQlpZighY2luZm8tPnNhd19KRklGX21hcmtlciB8fCBjaW5mby0+SkZJRl9taW5vcl92ZXJzaW9uIDwgMikgeworCQkJCQkJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKHNfZm9ybWF0X2lkLCAiV2FybmluZzogbm9uLXN0YW5kYXJkIEpGWFggc2VnbWVudCIpOworCQkJCQl9CQkJCQkKKwkJCQkJanBlZ19yZWFkX2pmeHgoZGliLCBtYXJrZXItPmRhdGEsIG1hcmtlci0+ZGF0YV9sZW5ndGgpOworCQkJCX0KKwkJCQkvLyBvdGhlciB2YWx1ZXMgc3VjaCBhcyAnUGljYXNhJyA6IGlnbm9yZSBzYWZlbHkgdW5rbm93biBBUFAwIG1hcmtlcgorCQkJCWJyZWFrOworCQkJY2FzZSBKUEVHX0NPTToKKwkJCQkvLyBKUEVHIGNvbW1lbnQKKwkJCQlqcGVnX3JlYWRfY29tbWVudChkaWIsIG1hcmtlci0+ZGF0YSwgbWFya2VyLT5kYXRhX2xlbmd0aCk7CisJCQkJYnJlYWs7CisJCQljYXNlIEVYSUZfTUFSS0VSOgorCQkJCS8vIEV4aWYgb3IgQWRvYmUgWE1QIHByb2ZpbGUKKwkJCQlqcGVnX3JlYWRfZXhpZl9wcm9maWxlKGRpYiwgbWFya2VyLT5kYXRhLCBtYXJrZXItPmRhdGFfbGVuZ3RoKTsKKwkJCQlqcGVnX3JlYWRfeG1wX3Byb2ZpbGUoZGliLCBtYXJrZXItPmRhdGEsIG1hcmtlci0+ZGF0YV9sZW5ndGgpOworCQkJCWpwZWdfcmVhZF9leGlmX3Byb2ZpbGVfcmF3KGRpYiwgbWFya2VyLT5kYXRhLCBtYXJrZXItPmRhdGFfbGVuZ3RoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSVBUQ19NQVJLRVI6CisJCQkJLy8gSVBUQy9OQUEgb3IgQWRvYmUgUGhvdG9zaG9wIHByb2ZpbGUKKwkJCQlqcGVnX3JlYWRfaXB0Y19wcm9maWxlKGRpYiwgbWFya2VyLT5kYXRhLCBtYXJrZXItPmRhdGFfbGVuZ3RoKTsKKwkJCQlicmVhazsKKwkJfQorCX0KKworCS8vIElDQyBwcm9maWxlCisJQllURSAqaWNjX3Byb2ZpbGUgPSBOVUxMOworCXVuc2lnbmVkIGljY19sZW5ndGggPSAwOworCisJaWYoIGpwZWdfcmVhZF9pY2NfcHJvZmlsZShjaW5mbywgJmljY19wcm9maWxlLCAmaWNjX2xlbmd0aCkgKSB7CisJCS8vIGNvcHkgSUNDIHByb2ZpbGUgZGF0YQorCQlGcmVlSW1hZ2VfQ3JlYXRlSUNDUHJvZmlsZShkaWIsIGljY19wcm9maWxlLCBpY2NfbGVuZ3RoKTsKKwkJLy8gY2xlYW4gdXAKKwkJZnJlZShpY2NfcHJvZmlsZSk7CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgU3BlY2lhbCBtYXJrZXJzIHdyaXRlIGZ1bmN0aW9ucworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKioKKwlXcml0ZSBKUEVHX0NPTSBtYXJrZXIgKGNvbW1lbnQpCisqLworc3RhdGljIEJPT0wgCitqcGVnX3dyaXRlX2NvbW1lbnQoal9jb21wcmVzc19wdHIgY2luZm8sIEZJQklUTUFQICpkaWIpIHsKKwlGSVRBRyAqdGFnID0gTlVMTDsKKworCS8vIHdyaXRlIHVzZXIgY29tbWVudCBhcyBhIEpQRUdfQ09NIG1hcmtlcgorCUZyZWVJbWFnZV9HZXRNZXRhZGF0YShGSU1EX0NPTU1FTlRTLCBkaWIsICJDb21tZW50IiwgJnRhZyk7CisJaWYodGFnKSB7CisJCWNvbnN0IGNoYXIgKnRhZ192YWx1ZSA9IChjaGFyKilGcmVlSW1hZ2VfR2V0VGFnVmFsdWUodGFnKTsKKworCQlpZihOVUxMICE9IHRhZ192YWx1ZSkgeworCQkJZm9yKGxvbmcgaSA9IDA7IGkgPCAobG9uZylzdHJsZW4odGFnX3ZhbHVlKTsgaSs9IE1BWF9CWVRFU19JTl9NQVJLRVIpIHsKKwkJCQlqcGVnX3dyaXRlX21hcmtlcihjaW5mbywgSlBFR19DT00sIChCWVRFKil0YWdfdmFsdWUgKyBpLCBNSU4oKGxvbmcpc3RybGVuKHRhZ192YWx1ZSArIGkpLCBNQVhfQllURVNfSU5fTUFSS0VSKSk7CisJCQl9CisJCQlyZXR1cm4gVFJVRTsKKwkJfQorCX0KKwlyZXR1cm4gRkFMU0U7Cit9CisKKy8qKiAKKwlXcml0ZSBKUEVHX0FQUDIgbWFya2VyIChJQ0MgcHJvZmlsZSkKKyovCitzdGF0aWMgQk9PTCAKK2pwZWdfd3JpdGVfaWNjX3Byb2ZpbGUoal9jb21wcmVzc19wdHIgY2luZm8sIEZJQklUTUFQICpkaWIpIHsKKyAgICAvLyBtYXJrZXIgaWRlbnRpZnlpbmcgc3RyaW5nICJJQ0NfUFJPRklMRSIgKG51bGwtdGVybWluYXRlZCkKKwlCWVRFIGljY19zaWduYXR1cmVbMTJdID0geyAweDQ5LCAweDQzLCAweDQzLCAweDVGLCAweDUwLCAweDUyLCAweDRGLCAweDQ2LCAweDQ5LCAweDRDLCAweDQ1LCAweDAwIH07CisKKwlGSUlDQ1BST0ZJTEUgKmljY1Byb2ZpbGUgPSBGcmVlSW1hZ2VfR2V0SUNDUHJvZmlsZShkaWIpOworCisJaWYgKGljY1Byb2ZpbGUtPnNpemUgJiYgaWNjUHJvZmlsZS0+ZGF0YSkgeworCQkvLyBJQ0NfSEVBREVSX1NJWkU6IElDQyBzaWduYXR1cmUgaXMgJ0lDQ19QUk9GSUxFJyArIDIgYnl0ZXMKKworCQlCWVRFICpwcm9maWxlID0gKEJZVEUqKW1hbGxvYygoaWNjUHJvZmlsZS0+c2l6ZSArIElDQ19IRUFERVJfU0laRSkgKiBzaXplb2YoQllURSkpOworCQlpZihwcm9maWxlID09IE5VTEwpIHJldHVybiBGQUxTRTsKKwkJbWVtY3B5KHByb2ZpbGUsIGljY19zaWduYXR1cmUsIDEyKTsKKworCQlmb3IobG9uZyBpID0gMDsgaSA8IChsb25nKWljY1Byb2ZpbGUtPnNpemU7IGkgKz0gTUFYX0RBVEFfQllURVNfSU5fTUFSS0VSKSB7CisJCQl1bnNpZ25lZCBsZW5ndGggPSBNSU4oKGxvbmcpKGljY1Byb2ZpbGUtPnNpemUgLSBpKSwgTUFYX0RBVEFfQllURVNfSU5fTUFSS0VSKTsKKwkJCS8vIHNlcXVlbmNlIG51bWJlcgorCQkJcHJvZmlsZVsxMl0gPSAoQllURSkgKChpIC8gTUFYX0RBVEFfQllURVNfSU5fTUFSS0VSKSArIDEpOworCQkJLy8gbnVtYmVyIG9mIG1hcmtlcnMKKwkJCXByb2ZpbGVbMTNdID0gKEJZVEUpIChpY2NQcm9maWxlLT5zaXplIC8gTUFYX0RBVEFfQllURVNfSU5fTUFSS0VSICsgMSk7CisKKwkJCW1lbWNweShwcm9maWxlICsgSUNDX0hFQURFUl9TSVpFLCAoQllURSopaWNjUHJvZmlsZS0+ZGF0YSArIGksIGxlbmd0aCk7CisJCQlqcGVnX3dyaXRlX21hcmtlcihjaW5mbywgSUNDX01BUktFUiwgcHJvZmlsZSwgKGxlbmd0aCArIElDQ19IRUFERVJfU0laRSkpOworICAgICAgICB9CisKKwkJZnJlZShwcm9maWxlKTsKKworCQlyZXR1cm4gVFJVRTsJCQorCX0KKwkKKwlyZXR1cm4gRkFMU0U7Cit9CisKKy8qKiAKKwlXcml0ZSBKUEVHX0FQUEQgbWFya2VyIChJUFRDIG9yIEFkb2JlIFBob3Rvc2hvcCBwcm9maWxlKQorCUByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZQorKi8KK3N0YXRpYyBCT09MICAKK2pwZWdfd3JpdGVfaXB0Y19wcm9maWxlKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBGSUJJVE1BUCAqZGliKSB7CisJLy9jb25zdCBjaGFyICpwc19oZWFkZXIgPSAiUGhvdG9zaG9wIDMuMFx4MDhCSU1ceDA0XHgwNFx4MFx4MFx4MFx4MCI7CisJY29uc3QgdW5zaWduZWQgdGFnX2xlbmd0aCA9IDI2OworCisJaWYoRnJlZUltYWdlX0dldE1ldGFkYXRhQ291bnQoRklNRF9JUFRDLCBkaWIpKSB7CisJCUJZVEUgKnByb2ZpbGUgPSBOVUxMOworCQl1bnNpZ25lZCBwcm9maWxlX3NpemUgPSAwOworCisJCS8vIGNyZWF0ZSBhIGJpbmFyeSBwcm9maWxlCisJCWlmKHdyaXRlX2lwdGNfcHJvZmlsZShkaWIsICZwcm9maWxlLCAmcHJvZmlsZV9zaXplKSkgeworCisJCQkvLyB3cml0ZSB0aGUgcHJvZmlsZQorCQkJZm9yKGxvbmcgaSA9IDA7IGkgPCAobG9uZylwcm9maWxlX3NpemU7IGkgKz0gNjU1MTdMKSB7CisJCQkJdW5zaWduZWQgbGVuZ3RoID0gTUlOKChsb25nKXByb2ZpbGVfc2l6ZSAtIGksIDY1NTE3TCk7CisJCQkJdW5zaWduZWQgcm91bmR1cCA9IGxlbmd0aCAmIDB4MDE7CS8vIG5lZWRlZCBmb3IgUGhvdG9zaG9wCisJCQkJQllURSAqaXB0Y19wcm9maWxlID0gKEJZVEUqKW1hbGxvYyhsZW5ndGggKyByb3VuZHVwICsgdGFnX2xlbmd0aCk7CisJCQkJaWYoaXB0Y19wcm9maWxlID09IE5VTEwpIGJyZWFrOworCQkJCS8vIFBob3Rvc2hvcCBpZGVudGlmaWNhdGlvbiBzdHJpbmcKKwkJCQltZW1jcHkoJmlwdGNfcHJvZmlsZVswXSwgIlBob3Rvc2hvcCAzLjBceDAiLCAxNCk7CisJCQkJLy8gOEJJTSBzZWdtZW50IHR5cGUKKwkJCQltZW1jcHkoJmlwdGNfcHJvZmlsZVsxNF0sICI4QklNXHgwNFx4MDRceDBceDBceDBceDAiLCAxMCk7CisJCQkJLy8gc2VnbWVudCBzaXplCisJCQkJaXB0Y19wcm9maWxlWzI0XSA9IChCWVRFKShsZW5ndGggPj4gOCk7CisJCQkJaXB0Y19wcm9maWxlWzI1XSA9IChCWVRFKShsZW5ndGggJiAweEZGKTsKKwkJCQkvLyBzZWdtZW50IGRhdGEKKwkJCQltZW1jcHkoJmlwdGNfcHJvZmlsZVt0YWdfbGVuZ3RoXSwgJnByb2ZpbGVbaV0sIGxlbmd0aCk7CisJCQkJaWYocm91bmR1cCkKKwkJCQkJaXB0Y19wcm9maWxlW2xlbmd0aCArIHRhZ19sZW5ndGhdID0gMDsKKwkJCQlqcGVnX3dyaXRlX21hcmtlcihjaW5mbywgSVBUQ19NQVJLRVIsIGlwdGNfcHJvZmlsZSwgbGVuZ3RoICsgcm91bmR1cCArIHRhZ19sZW5ndGgpOworCQkJCWZyZWUoaXB0Y19wcm9maWxlKTsKKwkJCX0KKworCQkJLy8gcmVsZWFzZSBwcm9maWxlCisJCQlmcmVlKHByb2ZpbGUpOworCisJCQlyZXR1cm4gVFJVRTsKKwkJfQorCX0KKworCXJldHVybiBGQUxTRTsKK30KKworLyoqIAorCVdyaXRlIEpQRUdfQVBQMSBtYXJrZXIgKFhNUCBwcm9maWxlKQorCUByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZQorKi8KK3N0YXRpYyBCT09MICAKK2pwZWdfd3JpdGVfeG1wX3Byb2ZpbGUoal9jb21wcmVzc19wdHIgY2luZm8sIEZJQklUTUFQICpkaWIpIHsKKwkvLyBtYXJrZXIgaWRlbnRpZnlpbmcgc3RyaW5nIGZvciBYTVAgKG51bGwgdGVybWluYXRlZCkKKwljb25zdCBjaGFyICp4bXBfc2lnbmF0dXJlID0gImh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iOworCisJRklUQUcgKnRhZ194bXAgPSBOVUxMOworCUZyZWVJbWFnZV9HZXRNZXRhZGF0YShGSU1EX1hNUCwgZGliLCBnX1RhZ0xpYl9YTVBGaWVsZE5hbWUsICZ0YWdfeG1wKTsKKworCWlmKHRhZ194bXApIHsKKwkJY29uc3QgQllURSAqdGFnX3ZhbHVlID0gKEJZVEUqKUZyZWVJbWFnZV9HZXRUYWdWYWx1ZSh0YWdfeG1wKTsKKworCQlpZihOVUxMICE9IHRhZ192YWx1ZSkgeworCQkJLy8gWE1QIHNpZ25hdHVyZSBpcyAyOSBieXRlcyBsb25nCisJCQl1bnNpZ25lZCBpbnQgeG1wX2hlYWRlcl9zaXplID0gKHVuc2lnbmVkIGludClzdHJsZW4oeG1wX3NpZ25hdHVyZSkgKyAxOworCisJCQlEV09SRCB0YWdfbGVuZ3RoID0gRnJlZUltYWdlX0dldFRhZ0xlbmd0aCh0YWdfeG1wKTsKKworCQkJQllURSAqcHJvZmlsZSA9IChCWVRFKiltYWxsb2MoKHRhZ19sZW5ndGggKyB4bXBfaGVhZGVyX3NpemUpICogc2l6ZW9mKEJZVEUpKTsKKwkJCWlmKHByb2ZpbGUgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOworCQkJbWVtY3B5KHByb2ZpbGUsIHhtcF9zaWduYXR1cmUsIHhtcF9oZWFkZXJfc2l6ZSk7CisKKwkJCWZvcihEV09SRCBpID0gMDsgaSA8IHRhZ19sZW5ndGg7IGkgKz0gNjU1MDRMKSB7CisJCQkJdW5zaWduZWQgbGVuZ3RoID0gTUlOKChsb25nKSh0YWdfbGVuZ3RoIC0gaSksIDY1NTA0TCk7CisJCQkJCisJCQkJbWVtY3B5KHByb2ZpbGUgKyB4bXBfaGVhZGVyX3NpemUsIHRhZ192YWx1ZSArIGksIGxlbmd0aCk7CisJCQkJanBlZ193cml0ZV9tYXJrZXIoY2luZm8sIEVYSUZfTUFSS0VSLCBwcm9maWxlLCAobGVuZ3RoICsgeG1wX2hlYWRlcl9zaXplKSk7CisJCQl9CisKKwkJCWZyZWUocHJvZmlsZSk7CisKKwkJCXJldHVybiBUUlVFOwkKKwkJfQorCX0KKworCXJldHVybiBGQUxTRTsKK30KKworLyoqIAorCVdyaXRlIEpQRUdfQVBQMSBtYXJrZXIgKEV4aWYgcHJvZmlsZSkKKwlAcmV0dXJuIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UKKyovCitzdGF0aWMgQk9PTCAKK2pwZWdfd3JpdGVfZXhpZl9wcm9maWxlX3JhdyhqX2NvbXByZXNzX3B0ciBjaW5mbywgRklCSVRNQVAgKmRpYikgeworICAgIC8vIG1hcmtlciBpZGVudGlmeWluZyBzdHJpbmcgZm9yIEV4aWYgPSAiRXhpZlwwXDAiCisgICAgQllURSBleGlmX3NpZ25hdHVyZVs2XSA9IHsgMHg0NSwgMHg3OCwgMHg2OSwgMHg2NiwgMHgwMCwgMHgwMCB9OworCisJRklUQUcgKnRhZ19leGlmID0gTlVMTDsKKwlGcmVlSW1hZ2VfR2V0TWV0YWRhdGEoRklNRF9FWElGX1JBVywgZGliLCBnX1RhZ0xpYl9FeGlmUmF3RmllbGROYW1lLCAmdGFnX2V4aWYpOworCisJaWYodGFnX2V4aWYpIHsKKwkJY29uc3QgQllURSAqdGFnX3ZhbHVlID0gKEJZVEUqKUZyZWVJbWFnZV9HZXRUYWdWYWx1ZSh0YWdfZXhpZik7CisJCQorCQkvLyB2ZXJpZnkgdGhlIGlkZW50aWZ5aW5nIHN0cmluZworCQlpZihtZW1jbXAoZXhpZl9zaWduYXR1cmUsIHRhZ192YWx1ZSwgc2l6ZW9mKGV4aWZfc2lnbmF0dXJlKSkgIT0gMCkgeworCQkJLy8gbm90IGFuIEV4aWYgcHJvZmlsZQorCQkJcmV0dXJuIEZBTFNFOworCQl9CisKKwkJaWYoTlVMTCAhPSB0YWdfdmFsdWUpIHsKKwkJCURXT1JEIHRhZ19sZW5ndGggPSBGcmVlSW1hZ2VfR2V0VGFnTGVuZ3RoKHRhZ19leGlmKTsKKworCQkJQllURSAqcHJvZmlsZSA9IChCWVRFKiltYWxsb2ModGFnX2xlbmd0aCAqIHNpemVvZihCWVRFKSk7CisJCQlpZihwcm9maWxlID09IE5VTEwpIHJldHVybiBGQUxTRTsKKworCQkJZm9yKERXT1JEIGkgPSAwOyBpIDwgdGFnX2xlbmd0aDsgaSArPSA2NTUwNEwpIHsKKwkJCQl1bnNpZ25lZCBsZW5ndGggPSBNSU4oKGxvbmcpKHRhZ19sZW5ndGggLSBpKSwgNjU1MDRMKTsKKwkJCQkKKwkJCQltZW1jcHkocHJvZmlsZSwgdGFnX3ZhbHVlICsgaSwgbGVuZ3RoKTsKKwkJCQlqcGVnX3dyaXRlX21hcmtlcihjaW5mbywgRVhJRl9NQVJLRVIsIHByb2ZpbGUsIGxlbmd0aCk7CisJCQl9CisKKwkJCWZyZWUocHJvZmlsZSk7CisKKwkJCXJldHVybiBUUlVFOwkKKwkJfQorCX0KKworCXJldHVybiBGQUxTRTsKK30KKworLyoqCisJV3JpdGUgdGh1bWJuYWlsIChKRlhYIHNlZ21lbnQsIEpQRUcgY29tcHJlc3NlZCkKKyovCitzdGF0aWMgQk9PTAoranBlZ193cml0ZV9qZnh4KGpfY29tcHJlc3NfcHRyIGNpbmZvLCBGSUJJVE1BUCAqZGliKSB7CisJLy8gZ2V0IHRoZSB0aHVtYm5haWwgdG8gYmUgc3RvcmVkCisJRklCSVRNQVAqIHRodW1ibmFpbCA9IEZyZWVJbWFnZV9HZXRUaHVtYm5haWwoZGliKTsKKwlpZighdGh1bWJuYWlsKSB7CisJCXJldHVybiBUUlVFOworCX0KKwkvLyBjaGVjayBmb3IgYSBjb21wYXRpYmxlIG91dHB1dCBmb3JtYXQKKwlpZigoRnJlZUltYWdlX0dldEltYWdlVHlwZSh0aHVtYm5haWwpICE9IEZJVF9CSVRNQVApIHx8IChGcmVlSW1hZ2VfR2V0QlBQKHRodW1ibmFpbCkgIT0gOCkgJiYgKEZyZWVJbWFnZV9HZXRCUFAodGh1bWJuYWlsKSAhPSAyNCkpIHsKKwkJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKHNfZm9ybWF0X2lkLCBGSV9NU0dfV0FSTklOR19JTlZBTElEX1RIVU1CTkFJTCk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJCisJLy8gc3RvcmVzIHRoZSB0aHVtYm5haWwgYXMgYSBiYXNlbGluZSBKUEVHIGludG8gYSBtZW1vcnkgYmxvY2sKKwkvLyByZXR1cm4gdGhlIG1lbW9yeSBibG9jayBvbmx5IGlmIGl0cyBzaXplIGlzIHdpdGhpbiBKRlhYIG1hcmtlciBzaXplIGxpbWl0IQorCUZJTUVNT1JZICpzdHJlYW0gPSBGcmVlSW1hZ2VfT3Blbk1lbW9yeSgpOworCQorCWlmKEZyZWVJbWFnZV9TYXZlVG9NZW1vcnkoRklGX0pQRUcsIHRodW1ibmFpbCwgc3RyZWFtLCBKUEVHX0JBU0VMSU5FKSkgeworCQkvLyBjaGVjayB0aGF0IHRoZSBtZW1vcnkgYmxvY2sgc2l6ZSBpcyB3aXRoaW4gSkZYWCBtYXJrZXIgc2l6ZSBsaW1pdAorCQlGcmVlSW1hZ2VfU2Vla01lbW9yeShzdHJlYW0sIDAsIFNFRUtfRU5EKTsKKwkJY29uc3QgbG9uZyBlb2YgPSBGcmVlSW1hZ2VfVGVsbE1lbW9yeShzdHJlYW0pOworCQlpZihlb2YgPiBNQVhfSkZYWF9USFVNQl9TSVpFKSB7CisJCQlGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2Moc19mb3JtYXRfaWQsICJXYXJuaW5nOiBhdHRhY2hlZCB0aHVtYm5haWwgaXMgJWQgYnl0ZXMgbGFyZ2VyIHRoYW4gbWF4aW11bSBzdXBwb3J0ZWQgc2l6ZSAtIFRodW1ibmFpbCBzYXZpbmcgYWJvcnRlZCIsIGVvZiAtIE1BWF9KRlhYX1RIVU1CX1NJWkUpOworCQkJRnJlZUltYWdlX0Nsb3NlTWVtb3J5KHN0cmVhbSk7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKwl9IGVsc2UgeworCQlGcmVlSW1hZ2VfQ2xvc2VNZW1vcnkoc3RyZWFtKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCUJZVEUqIHRoRGF0YSA9IE5VTEw7CisJRFdPUkQgdGhTaXplID0gMDsKKwkKKwlGcmVlSW1hZ2VfQWNxdWlyZU1lbW9yeShzdHJlYW0sICZ0aERhdGEsICZ0aFNpemUpOwkKKwkKKwlCWVRFIGlkX2xlbmd0aCA9IDU7IC8vPCAiSkZYWCIKKwlCWVRFIHR5cGUgPSBKRlhYX1RZUEVfSlBFRzsKKwkKKwlEV09SRCB0b3RhbHNpemUgPSBpZF9sZW5ndGggKyBzaXplb2YodHlwZSkgKyB0aFNpemU7CisJanBlZ193cml0ZV9tX2hlYWRlcihjaW5mbywgSlBFR19BUFAwLCB0b3RhbHNpemUpOworCQorCWpwZWdfd3JpdGVfbV9ieXRlKGNpbmZvLCAnSicpOworCWpwZWdfd3JpdGVfbV9ieXRlKGNpbmZvLCAnRicpOworCWpwZWdfd3JpdGVfbV9ieXRlKGNpbmZvLCAnWCcpOworCWpwZWdfd3JpdGVfbV9ieXRlKGNpbmZvLCAnWCcpOworCWpwZWdfd3JpdGVfbV9ieXRlKGNpbmZvLCAnXDAnKTsKKwkKKwlqcGVnX3dyaXRlX21fYnl0ZShjaW5mbywgdHlwZSk7CisJCisJLy8gd3JpdGUgdGh1bWJuYWlsIHRvIGRlc3RpbmF0aW9uLgorCS8vIFdlICJjcmFtIGl0IHN0cmFpZ2h0IGludG8gdGhlIGRhdGEgZGVzdGluYXRpb24gbW9kdWxlIiwgYmVjYXVzZSB3cml0ZV9tX2J5dGUgaXMgc2xvdworCQorCWZyZWVpbWFnZV9kc3RfcHRyIGRlc3QgPSAoZnJlZWltYWdlX2RzdF9wdHIpIGNpbmZvLT5kZXN0OworCQorCUJZVEUqICYgb3V0ID0gZGVzdC0+cHViLm5leHRfb3V0cHV0X2J5dGU7CisJc2l6ZV90ICYgYnVmUmVtYWluID0gZGVzdC0+cHViLmZyZWVfaW5fYnVmZmVyOworCQorCWNvbnN0IEJZVEUgKnRoRGF0YV9lbmQgPSB0aERhdGEgKyB0aFNpemU7CisKKwl3aGlsZSh0aERhdGEgPCB0aERhdGFfZW5kKSB7CisJCSoob3V0KSsrID0gKih0aERhdGEpKys7CisJCWlmICgtLWJ1ZlJlbWFpbiA9PSAwKSB7CQorCQkJLy8gYnVmZmVyIGZ1bGwgLSBmbHVzaAorCQkJaWYgKCFkZXN0LT5wdWIuZW1wdHlfb3V0cHV0X2J1ZmZlcihjaW5mbykpIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwkKKwlGcmVlSW1hZ2VfQ2xvc2VNZW1vcnkoc3RyZWFtKTsKKworCXJldHVybiBUUlVFOworfQorCisvKioKKwlXcml0ZSBKUEVHIHNwZWNpYWwgbWFya2VycworKi8KK3N0YXRpYyBCT09MIAord3JpdGVfbWFya2VycyhqX2NvbXByZXNzX3B0ciBjaW5mbywgRklCSVRNQVAgKmRpYikgeworCS8vIHdyaXRlIHRodW1ibmFpbCBhcyBhIEpGWFggbWFya2VyCisJanBlZ193cml0ZV9qZnh4KGNpbmZvLCBkaWIpOworCisJLy8gd3JpdGUgdXNlciBjb21tZW50IGFzIGEgSlBFR19DT00gbWFya2VyCisJanBlZ193cml0ZV9jb21tZW50KGNpbmZvLCBkaWIpOworCisJLy8gd3JpdGUgSUNDIHByb2ZpbGUKKwlqcGVnX3dyaXRlX2ljY19wcm9maWxlKGNpbmZvLCBkaWIpOworCisJLy8gd3JpdGUgSVBUQyBwcm9maWxlCisJanBlZ193cml0ZV9pcHRjX3Byb2ZpbGUoY2luZm8sIGRpYik7CisKKwkvLyB3cml0ZSBBZG9iZSBYTVAgcHJvZmlsZQorCWpwZWdfd3JpdGVfeG1wX3Byb2ZpbGUoY2luZm8sIGRpYik7CisKKwkvLyB3cml0ZSBFeGlmIHJhdyBkYXRhCisJanBlZ193cml0ZV9leGlmX3Byb2ZpbGVfcmF3KGNpbmZvLCBkaWIpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICBLZWVwIG9yaWdpbmFsIHNpemUgaW5mbyB3aGVuIHVzaW5nIHNjYWxlIG9wdGlvbiBvbiBsb2FkaW5nCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyB2b2lkIAorc3RvcmVfc2l6ZV9pbmZvKEZJQklUTUFQICpkaWIsIEpESU1FTlNJT04gd2lkdGgsIEpESU1FTlNJT04gaGVpZ2h0KSB7CisJY2hhciBidWZmZXJbMjU2XTsKKwkvLyBjcmVhdGUgYSB0YWcKKwlGSVRBRyAqdGFnID0gRnJlZUltYWdlX0NyZWF0ZVRhZygpOworCWlmKHRhZykgeworCQlzaXplX3QgbGVuZ3RoID0gMDsKKwkJLy8gc2V0IHRoZSBvcmlnaW5hbCB3aWR0aAorCQlzcHJpbnRmKGJ1ZmZlciwgIiVkIiwgKGludCl3aWR0aCk7CisJCWxlbmd0aCA9IHN0cmxlbihidWZmZXIpICsgMTsJLy8gaW5jbHVkZSB0aGUgTlVMTC8wIHZhbHVlCisJCUZyZWVJbWFnZV9TZXRUYWdLZXkodGFnLCAiT3JpZ2luYWxKUEVHV2lkdGgiKTsKKwkJRnJlZUltYWdlX1NldFRhZ0xlbmd0aCh0YWcsIChEV09SRClsZW5ndGgpOworCQlGcmVlSW1hZ2VfU2V0VGFnQ291bnQodGFnLCAoRFdPUkQpbGVuZ3RoKTsKKwkJRnJlZUltYWdlX1NldFRhZ1R5cGUodGFnLCBGSURUX0FTQ0lJKTsKKwkJRnJlZUltYWdlX1NldFRhZ1ZhbHVlKHRhZywgYnVmZmVyKTsKKwkJRnJlZUltYWdlX1NldE1ldGFkYXRhKEZJTURfQ09NTUVOVFMsIGRpYiwgRnJlZUltYWdlX0dldFRhZ0tleSh0YWcpLCB0YWcpOworCQkvLyBzZXQgdGhlIG9yaWdpbmFsIGhlaWdodAorCQlzcHJpbnRmKGJ1ZmZlciwgIiVkIiwgKGludCloZWlnaHQpOworCQlsZW5ndGggPSBzdHJsZW4oYnVmZmVyKSArIDE7CS8vIGluY2x1ZGUgdGhlIE5VTEwvMCB2YWx1ZQorCQlGcmVlSW1hZ2VfU2V0VGFnS2V5KHRhZywgIk9yaWdpbmFsSlBFR0hlaWdodCIpOworCQlGcmVlSW1hZ2VfU2V0VGFnTGVuZ3RoKHRhZywgKERXT1JEKWxlbmd0aCk7CisJCUZyZWVJbWFnZV9TZXRUYWdDb3VudCh0YWcsIChEV09SRClsZW5ndGgpOworCQlGcmVlSW1hZ2VfU2V0VGFnVHlwZSh0YWcsIEZJRFRfQVNDSUkpOworCQlGcmVlSW1hZ2VfU2V0VGFnVmFsdWUodGFnLCBidWZmZXIpOworCQlGcmVlSW1hZ2VfU2V0TWV0YWRhdGEoRklNRF9DT01NRU5UUywgZGliLCBGcmVlSW1hZ2VfR2V0VGFnS2V5KHRhZyksIHRhZyk7CisJCS8vIGRlc3Ryb3kgdGhlIHRhZworCQlGcmVlSW1hZ2VfRGVsZXRlVGFnKHRhZyk7CisJfQorfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBQbHVnaW4gSW1wbGVtZW50YXRpb24KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKK0Zvcm1hdCgpIHsKKwlyZXR1cm4gIkpQRUciOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgorRGVzY3JpcHRpb24oKSB7CisJcmV0dXJuICJKUEVHIC0gSkZJRiBDb21wbGlhbnQiOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgorRXh0ZW5zaW9uKCkgeworCXJldHVybiAianBnLGppZixqcGVnLGpwZSI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCitSZWdFeHByKCkgeworCXJldHVybiAiXlwzNzdcMzMwXDM3NyI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCitNaW1lVHlwZSgpIHsKKwlyZXR1cm4gImltYWdlL2pwZWciOworfQorCitzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYKK1ZhbGlkYXRlKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSkgeworCUJZVEUganBlZ19zaWduYXR1cmVbXSA9IHsgMHhGRiwgMHhEOCB9OworCUJZVEUgc2lnbmF0dXJlWzJdID0geyAwLCAwIH07CisKKwlpby0+cmVhZF9wcm9jKHNpZ25hdHVyZSwgMSwgc2l6ZW9mKGpwZWdfc2lnbmF0dXJlKSwgaGFuZGxlKTsKKworCXJldHVybiAobWVtY21wKGpwZWdfc2lnbmF0dXJlLCBzaWduYXR1cmUsIHNpemVvZihqcGVnX3NpZ25hdHVyZSkpID09IDApOworfQorCitzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYKK1N1cHBvcnRzRXhwb3J0RGVwdGgoaW50IGRlcHRoKSB7CisJcmV0dXJuICgKKwkJCShkZXB0aCA9PSA4KSB8fAorCQkJKGRlcHRoID09IDI0KQorCQkpOworfQorCitzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYgCitTdXBwb3J0c0V4cG9ydFR5cGUoRlJFRV9JTUFHRV9UWVBFIHR5cGUpIHsKKwlyZXR1cm4gKHR5cGUgPT0gRklUX0JJVE1BUCkgPyBUUlVFIDogRkFMU0U7Cit9CisKK3N0YXRpYyBCT09MIERMTF9DQUxMQ09OVgorU3VwcG9ydHNJQ0NQcm9maWxlcygpIHsKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIEJPT0wgRExMX0NBTExDT05WCitTdXBwb3J0c05vUGl4ZWxzKCkgeworCXJldHVybiBUUlVFOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBGSUJJVE1BUCAqIERMTF9DQUxMQ09OVgorTG9hZChGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIGludCBwYWdlLCBpbnQgZmxhZ3MsIHZvaWQgKmRhdGEpIHsKKwlpZiAoaGFuZGxlKSB7CisJCUZJQklUTUFQICpkaWIgPSBOVUxMOworCisJCUJPT0wgaGVhZGVyX29ubHkgPSAoZmxhZ3MgJiBGSUZfTE9BRF9OT1BJWEVMUykgPT0gRklGX0xPQURfTk9QSVhFTFM7CisKKwkJLy8gc2V0IHVwIHRoZSBqcGVnbGliIHN0cnVjdHVyZXMKKworCQlzdHJ1Y3QganBlZ19kZWNvbXByZXNzX3N0cnVjdCBjaW5mbzsKKwkJRXJyb3JNYW5hZ2VyIGZpX2Vycm9yX21ncjsKKworCQl0cnkgeworCisJCQkvLyBzdGVwIDE6IGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIEpQRUcgZGVjb21wcmVzc2lvbiBvYmplY3QKKworCQkJLy8gd2Ugc2V0IHVwIHRoZSBub3JtYWwgSlBFRyBlcnJvciByb3V0aW5lcywgdGhlbiBvdmVycmlkZSBlcnJvcl9leGl0ICYgb3V0cHV0X21lc3NhZ2UKKwkJCWNpbmZvLmVyciA9IGpwZWdfc3RkX2Vycm9yKCZmaV9lcnJvcl9tZ3IucHViKTsKKwkJCWZpX2Vycm9yX21nci5wdWIuZXJyb3JfZXhpdCAgICAgPSBqcGVnX2Vycm9yX2V4aXQ7CisJCQlmaV9lcnJvcl9tZ3IucHViLm91dHB1dF9tZXNzYWdlID0ganBlZ19vdXRwdXRfbWVzc2FnZTsKKwkJCQorCQkJLy8gZXN0YWJsaXNoIHRoZSBzZXRqbXAgcmV0dXJuIGNvbnRleHQgZm9yIGpwZWdfZXJyb3JfZXhpdCB0byB1c2UKKwkJCWlmIChzZXRqbXAoZmlfZXJyb3JfbWdyLnNldGptcF9idWZmZXIpKSB7CisJCQkJLy8gSWYgd2UgZ2V0IGhlcmUsIHRoZSBKUEVHIGNvZGUgaGFzIHNpZ25hbGVkIGFuIGVycm9yLgorCQkJCS8vIFdlIG5lZWQgdG8gY2xlYW4gdXAgdGhlIEpQRUcgb2JqZWN0LCBjbG9zZSB0aGUgaW5wdXQgZmlsZSwgYW5kIHJldHVybi4KKwkJCQlqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcygmY2luZm8pOworCQkJCXRocm93IChjb25zdCBjaGFyKilOVUxMOworCQkJfQorCisJCQlqcGVnX2NyZWF0ZV9kZWNvbXByZXNzKCZjaW5mbyk7CisKKwkJCS8vIHN0ZXAgMmE6IHNwZWNpZnkgZGF0YSBzb3VyY2UgKGVnLCBhIGhhbmRsZSkKKworCQkJanBlZ19mcmVlaW1hZ2Vfc3JjKCZjaW5mbywgaGFuZGxlLCBpbyk7CisKKwkJCS8vIHN0ZXAgMmI6IHNhdmUgc3BlY2lhbCBtYXJrZXJzIGZvciBsYXRlciByZWFkaW5nCisJCQkKKwkJCWpwZWdfc2F2ZV9tYXJrZXJzKCZjaW5mbywgSlBFR19DT00sIDB4RkZGRik7CisJCQlmb3IoaW50IG0gPSAwOyBtIDwgMTY7IG0rKykgeworCQkJCWpwZWdfc2F2ZV9tYXJrZXJzKCZjaW5mbywgSlBFR19BUFAwICsgbSwgMHhGRkZGKTsKKwkJCX0KKworCQkJLy8gc3RlcCAzOiByZWFkIGhhbmRsZSBwYXJhbWV0ZXJzIHdpdGgganBlZ19yZWFkX2hlYWRlcigpCisKKwkJCWpwZWdfcmVhZF9oZWFkZXIoJmNpbmZvLCBUUlVFKTsKKworCQkJLy8gc3RlcCA0OiBzZXQgcGFyYW1ldGVycyBmb3IgZGVjb21wcmVzc2lvbgorCisJCQl1bnNpZ25lZCBpbnQgc2NhbGVfZGVub20gPSAxOwkJLy8gZnJhY3Rpb24gYnkgd2hpY2ggdG8gc2NhbGUgaW1hZ2UKKwkJCWludAlyZXF1ZXN0ZWRfc2l6ZSA9IGZsYWdzID4+IDE2OwkvLyByZXF1ZXN0ZWQgdXNlciBzaXplIGluIHBpeGVscworCQkJaWYocmVxdWVzdGVkX3NpemUgPiAwKSB7CisJCQkJLy8gdGhlIEpQRUcgY29kZWMgY2FuIHBlcmZvcm0geDIsIHg0IG9yIHg4IHNjYWxpbmcgb24gbG9hZGluZworCQkJCS8vIHRyeSB0byBmaW5kIHRoZSBtb3JlIGFwcHJvcHJpYXRlIHNjYWxpbmcgYWNjb3JkaW5nIHRvIHVzZXIncyBuZWVkCisJCQkJZG91YmxlIHNjYWxlID0gTUFYKChkb3VibGUpY2luZm8uaW1hZ2Vfd2lkdGgsIChkb3VibGUpY2luZm8uaW1hZ2VfaGVpZ2h0KSAvIChkb3VibGUpcmVxdWVzdGVkX3NpemU7CisJCQkJaWYoc2NhbGUgPj0gOCkgeworCQkJCQlzY2FsZV9kZW5vbSA9IDg7CisJCQkJfSBlbHNlIGlmKHNjYWxlID49IDQpIHsKKwkJCQkJc2NhbGVfZGVub20gPSA0OworCQkJCX0gZWxzZSBpZihzY2FsZSA+PSAyKSB7CisJCQkJCXNjYWxlX2Rlbm9tID0gMjsKKwkJCQl9CisJCQl9CisJCQljaW5mby5zY2FsZV9udW0gPSAxOworCQkJY2luZm8uc2NhbGVfZGVub20gPSBzY2FsZV9kZW5vbTsKKworCQkJaWYgKChmbGFncyAmIEpQRUdfQUNDVVJBVEUpICE9IEpQRUdfQUNDVVJBVEUpIHsKKwkJCQljaW5mby5kY3RfbWV0aG9kICAgICAgICAgID0gSkRDVF9JRkFTVDsKKwkJCQljaW5mby5kb19mYW5jeV91cHNhbXBsaW5nID0gRkFMU0U7CisJCQl9CisKKwkJCWlmICgoZmxhZ3MgJiBKUEVHX0dSRVlTQ0FMRSkgPT0gSlBFR19HUkVZU0NBTEUpIHsKKwkJCQkvLyBmb3JjZSBsb2FkaW5nIGFzIGEgOC1iaXQgZ3JleXNjYWxlIGltYWdlCisJCQkJY2luZm8ub3V0X2NvbG9yX3NwYWNlID0gSkNTX0dSQVlTQ0FMRTsKKwkJCX0KKworCQkJLy8gc3RlcCA1YTogc3RhcnQgZGVjb21wcmVzc29yIGFuZCBjYWxjdWxhdGUgb3V0cHV0IHdpZHRoIGFuZCBoZWlnaHQKKworCQkJanBlZ19zdGFydF9kZWNvbXByZXNzKCZjaW5mbyk7CisKKwkJCS8vIHN0ZXAgNWI6IGFsbG9jYXRlIGRpYiBhbmQgaW5pdCBoZWFkZXIKKworCQkJaWYoKGNpbmZvLm91dHB1dF9jb21wb25lbnRzID09IDQpICYmIChjaW5mby5vdXRfY29sb3Jfc3BhY2UgPT0gSkNTX0NNWUspKSB7CisJCQkJLy8gQ01ZSyBpbWFnZQorCQkJCWlmKChmbGFncyAmIEpQRUdfQ01ZSykgPT0gSlBFR19DTVlLKSB7CisJCQkJCS8vIGxvYWQgYXMgQ01ZSworCQkJCQlkaWIgPSBGcmVlSW1hZ2VfQWxsb2NhdGVIZWFkZXIoaGVhZGVyX29ubHksIGNpbmZvLm91dHB1dF93aWR0aCwgY2luZm8ub3V0cHV0X2hlaWdodCwgMzIsIEZJX1JHQkFfUkVEX01BU0ssIEZJX1JHQkFfR1JFRU5fTUFTSywgRklfUkdCQV9CTFVFX01BU0spOworCQkJCQlpZighZGliKSB0aHJvdyBGSV9NU0dfRVJST1JfRElCX01FTU9SWTsKKwkJCQkJRnJlZUltYWdlX0dldElDQ1Byb2ZpbGUoZGliKS0+ZmxhZ3MgfD0gRklJQ0NfQ09MT1JfSVNfQ01ZSzsKKwkJCQl9IGVsc2UgeworCQkJCQkvLyBsb2FkIGFzIENNWUsgYW5kIGNvbnZlcnQgdG8gUkdCCisJCQkJCWRpYiA9IEZyZWVJbWFnZV9BbGxvY2F0ZUhlYWRlcihoZWFkZXJfb25seSwgY2luZm8ub3V0cHV0X3dpZHRoLCBjaW5mby5vdXRwdXRfaGVpZ2h0LCAyNCwgRklfUkdCQV9SRURfTUFTSywgRklfUkdCQV9HUkVFTl9NQVNLLCBGSV9SR0JBX0JMVUVfTUFTSyk7CisJCQkJCWlmKCFkaWIpIHRocm93IEZJX01TR19FUlJPUl9ESUJfTUVNT1JZOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLy8gUkdCIG9yIGdyZXlzY2FsZSBpbWFnZQorCQkJCWRpYiA9IEZyZWVJbWFnZV9BbGxvY2F0ZUhlYWRlcihoZWFkZXJfb25seSwgY2luZm8ub3V0cHV0X3dpZHRoLCBjaW5mby5vdXRwdXRfaGVpZ2h0LCA4ICogY2luZm8ub3V0cHV0X2NvbXBvbmVudHMsIEZJX1JHQkFfUkVEX01BU0ssIEZJX1JHQkFfR1JFRU5fTUFTSywgRklfUkdCQV9CTFVFX01BU0spOworCQkJCWlmKCFkaWIpIHRocm93IEZJX01TR19FUlJPUl9ESUJfTUVNT1JZOworCisJCQkJaWYgKGNpbmZvLm91dHB1dF9jb21wb25lbnRzID09IDEpIHsKKwkJCQkJLy8gYnVpbGQgYSBncmV5c2NhbGUgcGFsZXR0ZQorCQkJCQlSR0JRVUFEICpjb2xvcnMgPSBGcmVlSW1hZ2VfR2V0UGFsZXR0ZShkaWIpOworCisJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkJCQkJCWNvbG9yc1tpXS5yZ2JSZWQgICA9IChCWVRFKWk7CisJCQkJCQljb2xvcnNbaV0ucmdiR3JlZW4gPSAoQllURSlpOworCQkJCQkJY29sb3JzW2ldLnJnYkJsdWUgID0gKEJZVEUpaTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWlmKHNjYWxlX2Rlbm9tICE9IDEpIHsKKwkJCQkvLyBzdG9yZSBvcmlnaW5hbCBzaXplIGluZm8gaWYgYSBzY2FsaW5nIHdhcyByZXF1ZXN0ZWQKKwkJCQlzdG9yZV9zaXplX2luZm8oZGliLCBjaW5mby5pbWFnZV93aWR0aCwgY2luZm8uaW1hZ2VfaGVpZ2h0KTsKKwkJCX0KKworCQkJLy8gc3RlcCA1YzogaGFuZGxlIG1ldHJpY2VzCisKKwkJCWlmIChjaW5mby5kZW5zaXR5X3VuaXQgPT0gMSkgeworCQkJCS8vIGRvdHMvaW5jaAorCQkJCUZyZWVJbWFnZV9TZXREb3RzUGVyTWV0ZXJYKGRpYiwgKHVuc2lnbmVkKSAoKChmbG9hdCljaW5mby5YX2RlbnNpdHkpIC8gMC4wMjU0MDAwICsgMC41KSk7CisJCQkJRnJlZUltYWdlX1NldERvdHNQZXJNZXRlclkoZGliLCAodW5zaWduZWQpICgoKGZsb2F0KWNpbmZvLllfZGVuc2l0eSkgLyAwLjAyNTQwMDAgKyAwLjUpKTsKKwkJCX0gZWxzZSBpZiAoY2luZm8uZGVuc2l0eV91bml0ID09IDIpIHsKKwkJCQkvLyBkb3RzL2NtCisJCQkJRnJlZUltYWdlX1NldERvdHNQZXJNZXRlclgoZGliLCAodW5zaWduZWQpIChjaW5mby5YX2RlbnNpdHkgKiAxMDApKTsKKwkJCQlGcmVlSW1hZ2VfU2V0RG90c1Blck1ldGVyWShkaWIsICh1bnNpZ25lZCkgKGNpbmZvLllfZGVuc2l0eSAqIDEwMCkpOworCQkJfQorCQkJCisJCQkvLyBzdGVwIDY6IHJlYWQgc3BlY2lhbCBtYXJrZXJzCisJCQkKKwkJCXJlYWRfbWFya2VycygmY2luZm8sIGRpYik7CisKKwkJCS8vIC0tLSBoZWFkZXIgb25seSBtb2RlID0+IGNsZWFuLXVwIGFuZCByZXR1cm4KKworCQkJaWYgKGhlYWRlcl9vbmx5KSB7CisJCQkJLy8gcmVsZWFzZSBKUEVHIGRlY29tcHJlc3Npb24gb2JqZWN0CisJCQkJanBlZ19kZXN0cm95X2RlY29tcHJlc3MoJmNpbmZvKTsKKwkJCQkvLyByZXR1cm4gaGVhZGVyIGRhdGEKKwkJCQlyZXR1cm4gZGliOworCQkJfQorCisJCQkvLyBzdGVwIDdhOiB3aGlsZSAoc2NhbiBsaW5lcyByZW1haW4gdG8gYmUgcmVhZCkganBlZ19yZWFkX3NjYW5saW5lcyguLi4pOworCisJCQlpZigoY2luZm8ub3V0X2NvbG9yX3NwYWNlID09IEpDU19DTVlLKSAmJiAoKGZsYWdzICYgSlBFR19DTVlLKSAhPSBKUEVHX0NNWUspKSB7CisJCQkJLy8gY29udmVydCBmcm9tIENNWUsgdG8gUkdCCisKKwkJCQlKU0FNUEFSUkFZIGJ1ZmZlcjsJCS8vIG91dHB1dCByb3cgYnVmZmVyCisJCQkJdW5zaWduZWQgcm93X3N0cmlkZTsJLy8gcGh5c2ljYWwgcm93IHdpZHRoIGluIG91dHB1dCBidWZmZXIKKworCQkJCS8vIEpTQU1QTEVzIHBlciByb3cgaW4gb3V0cHV0IGJ1ZmZlcgorCQkJCXJvd19zdHJpZGUgPSBjaW5mby5vdXRwdXRfd2lkdGggKiBjaW5mby5vdXRwdXRfY29tcG9uZW50czsKKwkJCQkvLyBtYWtlIGEgb25lLXJvdy1oaWdoIHNhbXBsZSBhcnJheSB0aGF0IHdpbGwgZ28gYXdheSB3aGVuIGRvbmUgd2l0aCBpbWFnZQorCQkJCWJ1ZmZlciA9ICgqY2luZm8ubWVtLT5hbGxvY19zYXJyYXkpKChqX2NvbW1vbl9wdHIpICZjaW5mbywgSlBPT0xfSU1BR0UsIHJvd19zdHJpZGUsIDEpOworCisJCQkJd2hpbGUgKGNpbmZvLm91dHB1dF9zY2FubGluZSA8IGNpbmZvLm91dHB1dF9oZWlnaHQpIHsKKwkJCQkJSlNBTVBST1cgc3JjID0gYnVmZmVyWzBdOworCQkJCQlKU0FNUFJPVyBkc3QgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCBjaW5mby5vdXRwdXRfaGVpZ2h0IC0gY2luZm8ub3V0cHV0X3NjYW5saW5lIC0gMSk7CisKKwkJCQkJanBlZ19yZWFkX3NjYW5saW5lcygmY2luZm8sIGJ1ZmZlciwgMSk7CisKKwkJCQkJZm9yKHVuc2lnbmVkIHggPSAwOyB4IDwgY2luZm8ub3V0cHV0X3dpZHRoOyB4KyspIHsKKwkJCQkJCVdPUkQgSyA9IChXT1JEKXNyY1szXTsKKwkJCQkJCWRzdFtGSV9SR0JBX1JFRF0gICA9IChCWVRFKSgoSyAqIHNyY1swXSkgLyAyNTUpOwkvLyBDIC0+IFIKKwkJCQkJCWRzdFtGSV9SR0JBX0dSRUVOXSA9IChCWVRFKSgoSyAqIHNyY1sxXSkgLyAyNTUpOwkvLyBNIC0+IEcKKwkJCQkJCWRzdFtGSV9SR0JBX0JMVUVdICA9IChCWVRFKSgoSyAqIHNyY1syXSkgLyAyNTUpOwkvLyBZIC0+IEIKKwkJCQkJCXNyYyArPSA0OworCQkJCQkJZHN0ICs9IDM7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgaWYoKGNpbmZvLm91dF9jb2xvcl9zcGFjZSA9PSBKQ1NfQ01ZSykgJiYgKChmbGFncyAmIEpQRUdfQ01ZSykgPT0gSlBFR19DTVlLKSkgeworCQkJCS8vIGNvbnZlcnQgZnJvbSBMaWJKUEVHIENNWUsgdG8gc3RhbmRhcmQgQ01ZSworCisJCQkJSlNBTVBBUlJBWSBidWZmZXI7CQkvLyBvdXRwdXQgcm93IGJ1ZmZlcgorCQkJCXVuc2lnbmVkIHJvd19zdHJpZGU7CS8vIHBoeXNpY2FsIHJvdyB3aWR0aCBpbiBvdXRwdXQgYnVmZmVyCisKKwkJCQkvLyBKU0FNUExFcyBwZXIgcm93IGluIG91dHB1dCBidWZmZXIKKwkJCQlyb3dfc3RyaWRlID0gY2luZm8ub3V0cHV0X3dpZHRoICogY2luZm8ub3V0cHV0X2NvbXBvbmVudHM7CisJCQkJLy8gbWFrZSBhIG9uZS1yb3ctaGlnaCBzYW1wbGUgYXJyYXkgdGhhdCB3aWxsIGdvIGF3YXkgd2hlbiBkb25lIHdpdGggaW1hZ2UKKwkJCQlidWZmZXIgPSAoKmNpbmZvLm1lbS0+YWxsb2Nfc2FycmF5KSgoal9jb21tb25fcHRyKSAmY2luZm8sIEpQT09MX0lNQUdFLCByb3dfc3RyaWRlLCAxKTsKKworCQkJCXdoaWxlIChjaW5mby5vdXRwdXRfc2NhbmxpbmUgPCBjaW5mby5vdXRwdXRfaGVpZ2h0KSB7CisJCQkJCUpTQU1QUk9XIHNyYyA9IGJ1ZmZlclswXTsKKwkJCQkJSlNBTVBST1cgZHN0ID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgY2luZm8ub3V0cHV0X2hlaWdodCAtIGNpbmZvLm91dHB1dF9zY2FubGluZSAtIDEpOworCisJCQkJCWpwZWdfcmVhZF9zY2FubGluZXMoJmNpbmZvLCBidWZmZXIsIDEpOworCisJCQkJCWZvcih1bnNpZ25lZCB4ID0gMDsgeCA8IGNpbmZvLm91dHB1dF93aWR0aDsgeCsrKSB7CisJCQkJCQkvLyBDTVlLIHBpeGVscyBhcmUgaW52ZXJ0ZWQKKwkJCQkJCWRzdFswXSA9IH5zcmNbMF07CS8vIEMKKwkJCQkJCWRzdFsxXSA9IH5zcmNbMV07CS8vIE0KKwkJCQkJCWRzdFsyXSA9IH5zcmNbMl07CS8vIFkKKwkJCQkJCWRzdFszXSA9IH5zcmNbM107CS8vIEsKKwkJCQkJCXNyYyArPSA0OworCQkJCQkJZHN0ICs9IDQ7CisJCQkJCX0KKwkJCQl9CisKKwkJCX0gZWxzZSB7CisJCQkJLy8gbm9ybWFsIGNhc2UgKFJHQiBvciBncmV5c2NhbGUgaW1hZ2UpCisKKwkJCQl3aGlsZSAoY2luZm8ub3V0cHV0X3NjYW5saW5lIDwgY2luZm8ub3V0cHV0X2hlaWdodCkgeworCQkJCQlKU0FNUFJPVyBkc3QgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCBjaW5mby5vdXRwdXRfaGVpZ2h0IC0gY2luZm8ub3V0cHV0X3NjYW5saW5lIC0gMSk7CisKKwkJCQkJanBlZ19yZWFkX3NjYW5saW5lcygmY2luZm8sICZkc3QsIDEpOworCQkJCX0KKworCQkJCS8vIHN0ZXAgN2I6IHN3YXAgcmVkIGFuZCBibHVlIGNvbXBvbmVudHMgKHNlZSBMaWJKUEVHL2ptb3JlY2ZnLmg6ICNkZWZpbmUgUkdCX1JFRCwgLi4uKQorCQkJCS8vIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoZSBKUEVHIGxpYnJhcnkgaXMga2VwdCAiYXMgaXMiIGJlY2F1c2UgTGliVElGRiB1c2VzIAorCQkJCS8vIExpYkpQRUcgImFzIGlzIi4KKworI2lmIEZSRUVJTUFHRV9DT0xPUk9SREVSID09IEZSRUVJTUFHRV9DT0xPUk9SREVSX0JHUgorCQkJCVN3YXBSZWRCbHVlMzIoZGliKTsKKyNlbmRpZgorCQkJfQorCisJCQkvLyBzdGVwIDg6IGZpbmlzaCBkZWNvbXByZXNzaW9uCisKKwkJCWpwZWdfZmluaXNoX2RlY29tcHJlc3MoJmNpbmZvKTsKKworCQkJLy8gc3RlcCA5OiByZWxlYXNlIEpQRUcgZGVjb21wcmVzc2lvbiBvYmplY3QKKworCQkJanBlZ19kZXN0cm95X2RlY29tcHJlc3MoJmNpbmZvKTsKKworCQkJLy8gY2hlY2sgZm9yIGF1dG9tYXRpYyBFeGlmIHJvdGF0aW9uCisJCQlpZighaGVhZGVyX29ubHkgJiYgKChmbGFncyAmIEpQRUdfRVhJRlJPVEFURSkgPT0gSlBFR19FWElGUk9UQVRFKSkgeworCQkJCVJvdGF0ZUV4aWYoJmRpYik7CisJCQl9CisKKwkJCS8vIGV2ZXJ5dGhpbmcgd2VudCB3ZWxsLiByZXR1cm4gdGhlIGxvYWRlZCBkaWIKKworCQkJcmV0dXJuIGRpYjsKKworCQl9IGNhdGNoIChjb25zdCBjaGFyICp0ZXh0KSB7CisJCQlqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcygmY2luZm8pOworCQkJaWYoTlVMTCAhPSBkaWIpIHsKKwkJCQlGcmVlSW1hZ2VfVW5sb2FkKGRpYik7CisJCQl9CisJCQlpZihOVUxMICE9IHRleHQpIHsKKwkJCQlGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2Moc19mb3JtYXRfaWQsIHRleHQpOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIEJPT0wgRExMX0NBTExDT05WCitTYXZlKEZyZWVJbWFnZUlPICppbywgRklCSVRNQVAgKmRpYiwgZmlfaGFuZGxlIGhhbmRsZSwgaW50IHBhZ2UsIGludCBmbGFncywgdm9pZCAqZGF0YSkgeworCWlmICgoZGliKSAmJiAoaGFuZGxlKSkgeworCQl0cnkgeworCQkJLy8gQ2hlY2sgZGliIGZvcm1hdAorCisJCQljb25zdCBjaGFyICpzRXJyb3IgPSAib25seSAyNC1iaXQgaGlnaGNvbG9yIG9yIDgtYml0IGdyZXlzY2FsZS9wYWxldHRlIGJpdG1hcHMgY2FuIGJlIHNhdmVkIGFzIEpQRUciOworCisJCQlGUkVFX0lNQUdFX0NPTE9SX1RZUEUgY29sb3JfdHlwZSA9IEZyZWVJbWFnZV9HZXRDb2xvclR5cGUoZGliKTsKKwkJCVdPUkQgYnBwID0gKFdPUkQpRnJlZUltYWdlX0dldEJQUChkaWIpOworCisJCQlpZiAoKGJwcCAhPSAyNCkgJiYgKGJwcCAhPSA4KSkgeworCQkJCXRocm93IHNFcnJvcjsKKwkJCX0KKworCQkJaWYoYnBwID09IDgpIHsKKwkJCQkvLyBhbGxvdyBncmV5LCByZXZlcnNlIGdyZXkgYW5kIHBhbGV0dGUgCisJCQkJaWYgKChjb2xvcl90eXBlICE9IEZJQ19NSU5JU0JMQUNLKSAmJiAoY29sb3JfdHlwZSAhPSBGSUNfTUlOSVNXSElURSkgJiYgKGNvbG9yX3R5cGUgIT0gRklDX1BBTEVUVEUpKSB7CisJCQkJCXRocm93IHNFcnJvcjsKKwkJCQl9CisJCQl9CisKKworCQkJc3RydWN0IGpwZWdfY29tcHJlc3Nfc3RydWN0IGNpbmZvOworCQkJRXJyb3JNYW5hZ2VyIGZpX2Vycm9yX21ncjsKKworCQkJLy8gU3RlcCAxOiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBKUEVHIGNvbXByZXNzaW9uIG9iamVjdAorCisJCQkvLyB3ZSBzZXQgdXAgdGhlIG5vcm1hbCBKUEVHIGVycm9yIHJvdXRpbmVzLCB0aGVuIG92ZXJyaWRlIGVycm9yX2V4aXQgJiBvdXRwdXRfbWVzc2FnZQorCQkJY2luZm8uZXJyID0ganBlZ19zdGRfZXJyb3IoJmZpX2Vycm9yX21nci5wdWIpOworCQkJZmlfZXJyb3JfbWdyLnB1Yi5lcnJvcl9leGl0ICAgICA9IGpwZWdfZXJyb3JfZXhpdDsKKwkJCWZpX2Vycm9yX21nci5wdWIub3V0cHV0X21lc3NhZ2UgPSBqcGVnX291dHB1dF9tZXNzYWdlOworCQkJCisJCQkvLyBlc3RhYmxpc2ggdGhlIHNldGptcCByZXR1cm4gY29udGV4dCBmb3IganBlZ19lcnJvcl9leGl0IHRvIHVzZQorCQkJaWYgKHNldGptcChmaV9lcnJvcl9tZ3Iuc2V0am1wX2J1ZmZlcikpIHsKKwkJCQkvLyBJZiB3ZSBnZXQgaGVyZSwgdGhlIEpQRUcgY29kZSBoYXMgc2lnbmFsZWQgYW4gZXJyb3IuCisJCQkJLy8gV2UgbmVlZCB0byBjbGVhbiB1cCB0aGUgSlBFRyBvYmplY3QsIGNsb3NlIHRoZSBpbnB1dCBmaWxlLCBhbmQgcmV0dXJuLgorCQkJCWpwZWdfZGVzdHJveV9jb21wcmVzcygmY2luZm8pOworCQkJCXRocm93IChjb25zdCBjaGFyKilOVUxMOworCQkJfQorCisJCQkvLyBOb3cgd2UgY2FuIGluaXRpYWxpemUgdGhlIEpQRUcgY29tcHJlc3Npb24gb2JqZWN0CisKKwkJCWpwZWdfY3JlYXRlX2NvbXByZXNzKCZjaW5mbyk7CisKKwkJCS8vIFN0ZXAgMjogc3BlY2lmeSBkYXRhIGRlc3RpbmF0aW9uIChlZywgYSBmaWxlKQorCisJCQlqcGVnX2ZyZWVpbWFnZV9kc3QoJmNpbmZvLCBoYW5kbGUsIGlvKTsKKworCQkJLy8gU3RlcCAzOiBzZXQgcGFyYW1ldGVycyBmb3IgY29tcHJlc3Npb24gCisKKwkJCWNpbmZvLmltYWdlX3dpZHRoID0gRnJlZUltYWdlX0dldFdpZHRoKGRpYik7CisJCQljaW5mby5pbWFnZV9oZWlnaHQgPSBGcmVlSW1hZ2VfR2V0SGVpZ2h0KGRpYik7CisKKwkJCXN3aXRjaChjb2xvcl90eXBlKSB7CisJCQkJY2FzZSBGSUNfTUlOSVNCTEFDSyA6CisJCQkJY2FzZSBGSUNfTUlOSVNXSElURSA6CisJCQkJCWNpbmZvLmluX2NvbG9yX3NwYWNlID0gSkNTX0dSQVlTQ0FMRTsKKwkJCQkJY2luZm8uaW5wdXRfY29tcG9uZW50cyA9IDE7CisJCQkJCWJyZWFrOworCisJCQkJZGVmYXVsdCA6CisJCQkJCWNpbmZvLmluX2NvbG9yX3NwYWNlID0gSkNTX1JHQjsKKwkJCQkJY2luZm8uaW5wdXRfY29tcG9uZW50cyA9IDM7CisJCQkJCWJyZWFrOworCQkJfQorCisJCQlqcGVnX3NldF9kZWZhdWx0cygmY2luZm8pOworCisJCSAgICAvLyBwcm9ncmVzc2l2ZS1KUEVHIHN1cHBvcnQKKwkJCWlmKChmbGFncyAmIEpQRUdfUFJPR1JFU1NJVkUpID09IEpQRUdfUFJPR1JFU1NJVkUpIHsKKwkJCQlqcGVnX3NpbXBsZV9wcm9ncmVzc2lvbigmY2luZm8pOworCQkJfQorCQkJCisJCQkvLyBjb21wdXRlIG9wdGltYWwgSHVmZm1hbiBjb2RpbmcgdGFibGVzIGZvciB0aGUgaW1hZ2UKKwkJCWlmKChmbGFncyAmIEpQRUdfT1BUSU1JWkUpID09IEpQRUdfT1BUSU1JWkUpIHsKKwkJCQljaW5mby5vcHRpbWl6ZV9jb2RpbmcgPSBUUlVFOworCQkJfQorCisJCQkvLyBTZXQgSkZJRiBkZW5zaXR5IHBhcmFtZXRlcnMgZnJvbSB0aGUgRElCIGRhdGEKKworCQkJY2luZm8uWF9kZW5zaXR5ID0gKFVJTlQxNikgKDAuNSArIDAuMDI1NCAqIEZyZWVJbWFnZV9HZXREb3RzUGVyTWV0ZXJYKGRpYikpOworCQkJY2luZm8uWV9kZW5zaXR5ID0gKFVJTlQxNikgKDAuNSArIDAuMDI1NCAqIEZyZWVJbWFnZV9HZXREb3RzUGVyTWV0ZXJZKGRpYikpOworCQkJY2luZm8uZGVuc2l0eV91bml0ID0gMTsJLy8gZG90cyAvIGluY2gKKworCQkJLy8gdGh1bWJuYWlsIHN1cHBvcnQgKEpGSUYgMS4wMiBleHRlbnNpb24gbWFya2VycykKKwkJCWlmKEZyZWVJbWFnZV9HZXRUaHVtYm5haWwoZGliKSAhPSBOVUxMKSB7CisJCQkJY2luZm8ud3JpdGVfSkZJRl9oZWFkZXIgPSAxOyAvLzwjIyMgZm9yY2UgaXQsIHRob3VnaCB3aGVuIGNvbG9yIGlzIENNWUsgaXQgd2lsbCBiZSBpbmNvcnJlY3QKKwkJCQljaW5mby5KRklGX21pbm9yX3ZlcnNpb24gPSAyOworCQkJfQorCisJCQkvLyBiYXNlbGluZSBKUEVHIHN1cHBvcnQKKwkJCWlmICgoZmxhZ3MgJiBKUEVHX0JBU0VMSU5FKSA9PSAgSlBFR19CQVNFTElORSkgeworCQkJCWNpbmZvLndyaXRlX0pGSUZfaGVhZGVyID0gMDsJLy8gTm8gbWFya2VyIGZvciBub24tSkZJRiBjb2xvcnNwYWNlcworCQkJCWNpbmZvLndyaXRlX0Fkb2JlX21hcmtlciA9IDA7CS8vIHdyaXRlIG5vIEFkb2JlIG1hcmtlciBieSBkZWZhdWx0CQkJCQorCQkJfQorCisJCQkvLyBzZXQgc3Vic2FtcGxpbmcgb3B0aW9ucyBpZiByZXF1aXJlZAorCisJCQlpZihjaW5mby5pbl9jb2xvcl9zcGFjZSA9PSBKQ1NfUkdCKSB7CisJCQkJaWYoKGZsYWdzICYgSlBFR19TVUJTQU1QTElOR180MTEpID09IEpQRUdfU1VCU0FNUExJTkdfNDExKSB7IAorCQkJCQkvLyA0OjE6MSAoNHgxIDF4MSAxeDEpIC0gQ3JIIDI1JSAtIENiSCAyNSUgLSBDclYgMTAwJSAtIENiViAxMDAlCisJCQkJCS8vIHRoZSBob3Jpem9udGFsIGNvbG9yIHJlc29sdXRpb24gaXMgcXVhcnRlcmVkCisJCQkJCWNpbmZvLmNvbXBfaW5mb1swXS5oX3NhbXBfZmFjdG9yID0gNDsJLy8gWSAKKwkJCQkJY2luZm8uY29tcF9pbmZvWzBdLnZfc2FtcF9mYWN0b3IgPSAxOyAKKwkJCQkJY2luZm8uY29tcF9pbmZvWzFdLmhfc2FtcF9mYWN0b3IgPSAxOwkvLyBDYiAKKwkJCQkJY2luZm8uY29tcF9pbmZvWzFdLnZfc2FtcF9mYWN0b3IgPSAxOyAKKwkJCQkJY2luZm8uY29tcF9pbmZvWzJdLmhfc2FtcF9mYWN0b3IgPSAxOwkvLyBDciAKKwkJCQkJY2luZm8uY29tcF9pbmZvWzJdLnZfc2FtcF9mYWN0b3IgPSAxOyAKKwkJCQl9IGVsc2UgaWYoKGZsYWdzICYgSlBFR19TVUJTQU1QTElOR180MjApID09IEpQRUdfU1VCU0FNUExJTkdfNDIwKSB7CisJCQkJCS8vIDQ6MjowICgyeDIgMXgxIDF4MSkgLSBDckggNTAlIC0gQ2JIIDUwJSAtIENyViA1MCUgLSBDYlYgNTAlCisJCQkJCS8vIHRoZSBjaHJvbWluYW5jZSByZXNvbHV0aW9uIGluIGJvdGggdGhlIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGRpcmVjdGlvbnMgaXMgY3V0IGluIGhhbGYKKwkJCQkJY2luZm8uY29tcF9pbmZvWzBdLmhfc2FtcF9mYWN0b3IgPSAyOwkvLyBZCisJCQkJCWNpbmZvLmNvbXBfaW5mb1swXS52X3NhbXBfZmFjdG9yID0gMjsgCisJCQkJCWNpbmZvLmNvbXBfaW5mb1sxXS5oX3NhbXBfZmFjdG9yID0gMTsJLy8gQ2IKKwkJCQkJY2luZm8uY29tcF9pbmZvWzFdLnZfc2FtcF9mYWN0b3IgPSAxOyAKKwkJCQkJY2luZm8uY29tcF9pbmZvWzJdLmhfc2FtcF9mYWN0b3IgPSAxOwkvLyBDcgorCQkJCQljaW5mby5jb21wX2luZm9bMl0udl9zYW1wX2ZhY3RvciA9IDE7IAorCQkJCX0gZWxzZSBpZigoZmxhZ3MgJiBKUEVHX1NVQlNBTVBMSU5HXzQyMikgPT0gSlBFR19TVUJTQU1QTElOR180MjIpeyAvLzJ4MSAobG93KSAKKwkJCQkJLy8gNDoyOjIgKDJ4MSAxeDEgMXgxKSAtIENySCA1MCUgLSBDYkggNTAlIC0gQ3JWIDEwMCUgLSBDYlYgMTAwJQorCQkJCQkvLyBoYWxmIG9mIHRoZSBob3Jpem9udGFsIHJlc29sdXRpb24gaW4gdGhlIGNocm9taW5hbmNlIGlzIGRyb3BwZWQgKENiICYgQ3IpLCAKKwkJCQkJLy8gd2hpbGUgdGhlIGZ1bGwgcmVzb2x1dGlvbiBpcyByZXRhaW5lZCBpbiB0aGUgdmVydGljYWwgZGlyZWN0aW9uLCB3aXRoIHJlc3BlY3QgdG8gdGhlIGx1bWluYW5jZQorCQkJCQljaW5mby5jb21wX2luZm9bMF0uaF9zYW1wX2ZhY3RvciA9IDI7CS8vIFkgCisJCQkJCWNpbmZvLmNvbXBfaW5mb1swXS52X3NhbXBfZmFjdG9yID0gMTsgCisJCQkJCWNpbmZvLmNvbXBfaW5mb1sxXS5oX3NhbXBfZmFjdG9yID0gMTsJLy8gQ2IgCisJCQkJCWNpbmZvLmNvbXBfaW5mb1sxXS52X3NhbXBfZmFjdG9yID0gMTsgCisJCQkJCWNpbmZvLmNvbXBfaW5mb1syXS5oX3NhbXBfZmFjdG9yID0gMTsJLy8gQ3IgCisJCQkJCWNpbmZvLmNvbXBfaW5mb1syXS52X3NhbXBfZmFjdG9yID0gMTsgCisJCQkJfSAKKwkJCQllbHNlIGlmKChmbGFncyAmIEpQRUdfU1VCU0FNUExJTkdfNDQ0KSA9PSBKUEVHX1NVQlNBTVBMSU5HXzQ0NCl7IC8vMXgxIChubyBzdWJzYW1wbGluZykgCisJCQkJCS8vIDQ6NDo0ICgxeDEgMXgxIDF4MSkgLSBDckggMTAwJSAtIENiSCAxMDAlIC0gQ3JWIDEwMCUgLSBDYlYgMTAwJQorCQkJCQkvLyB0aGUgcmVzb2x1dGlvbiBvZiBjaHJvbWluYW5jZSBpbmZvcm1hdGlvbiAoQ2IgJiBDcikgaXMgcHJlc2VydmVkIAorCQkJCQkvLyBhdCB0aGUgc2FtZSByYXRlIGFzIHRoZSBsdW1pbmFuY2UgKFkpIGluZm9ybWF0aW9uCisJCQkJCWNpbmZvLmNvbXBfaW5mb1swXS5oX3NhbXBfZmFjdG9yID0gMTsJLy8gWSAKKwkJCQkJY2luZm8uY29tcF9pbmZvWzBdLnZfc2FtcF9mYWN0b3IgPSAxOyAKKwkJCQkJY2luZm8uY29tcF9pbmZvWzFdLmhfc2FtcF9mYWN0b3IgPSAxOwkvLyBDYiAKKwkJCQkJY2luZm8uY29tcF9pbmZvWzFdLnZfc2FtcF9mYWN0b3IgPSAxOyAKKwkJCQkJY2luZm8uY29tcF9pbmZvWzJdLmhfc2FtcF9mYWN0b3IgPSAxOwkvLyBDciAKKwkJCQkJY2luZm8uY29tcF9pbmZvWzJdLnZfc2FtcF9mYWN0b3IgPSAxOyAgCisJCQkJfSAKKwkJCX0KKworCQkJLy8gU3RlcCA0OiBzZXQgcXVhbGl0eQorCQkJLy8gdGhlIGZpcnN0IDcgYml0cyBhcmUgcmVzZXJ2ZWQgZm9yIGxvdyBsZXZlbCBxdWFsaXR5IHNldHRpbmdzCisJCQkvLyB0aGUgb3RoZXIgYml0cyBhcmUgaGlnaCBsZXZlbCAoaS5lLiBlbnVtLWlzaCkKKworCQkJaW50IHF1YWxpdHk7CisKKwkJCWlmICgoZmxhZ3MgJiBKUEVHX1FVQUxJVFlCQUQpID09IEpQRUdfUVVBTElUWUJBRCkgeworCQkJCXF1YWxpdHkgPSAxMDsKKwkJCX0gZWxzZSBpZiAoKGZsYWdzICYgSlBFR19RVUFMSVRZQVZFUkFHRSkgPT0gSlBFR19RVUFMSVRZQVZFUkFHRSkgeworCQkJCXF1YWxpdHkgPSAyNTsKKwkJCX0gZWxzZSBpZiAoKGZsYWdzICYgSlBFR19RVUFMSVRZTk9STUFMKSA9PSBKUEVHX1FVQUxJVFlOT1JNQUwpIHsKKwkJCQlxdWFsaXR5ID0gNTA7CisJCQl9IGVsc2UgaWYgKChmbGFncyAmIEpQRUdfUVVBTElUWUdPT0QpID09IEpQRUdfUVVBTElUWUdPT0QpIHsKKwkJCQlxdWFsaXR5ID0gNzU7CisJCQl9IGVsc2UgCWlmICgoZmxhZ3MgJiBKUEVHX1FVQUxJVFlTVVBFUkIpID09IEpQRUdfUVVBTElUWVNVUEVSQikgeworCQkJCXF1YWxpdHkgPSAxMDA7CisJCQl9IGVsc2UgeworCQkJCWlmICgoZmxhZ3MgJiAweDdGKSA9PSAwKSB7CisJCQkJCXF1YWxpdHkgPSA3NTsKKwkJCQl9IGVsc2UgeworCQkJCQlxdWFsaXR5ID0gZmxhZ3MgJiAweDdGOworCQkJCX0KKwkJCX0KKworCQkJanBlZ19zZXRfcXVhbGl0eSgmY2luZm8sIHF1YWxpdHksIFRSVUUpOyAvKiBsaW1pdCB0byBiYXNlbGluZS1KUEVHIHZhbHVlcyAqLworCisJCQkvLyBTdGVwIDU6IFN0YXJ0IGNvbXByZXNzb3IgCisKKwkJCWpwZWdfc3RhcnRfY29tcHJlc3MoJmNpbmZvLCBUUlVFKTsKKworCQkJLy8gU3RlcCA2OiBXcml0ZSBzcGVjaWFsIG1hcmtlcnMKKwkJCQorCQkJaWYgKChmbGFncyAmIEpQRUdfQkFTRUxJTkUpICE9ICBKUEVHX0JBU0VMSU5FKSB7CisJCQkJd3JpdGVfbWFya2VycygmY2luZm8sIGRpYik7CisJCQl9CisKKwkJCS8vIFN0ZXAgNzogd2hpbGUgKHNjYW4gbGluZXMgcmVtYWluIHRvIGJlIHdyaXR0ZW4pIAorCisJCQlpZihjb2xvcl90eXBlID09IEZJQ19SR0IpIHsKKwkJCQkvLyAyNC1iaXQgUkdCIGltYWdlIDogbmVlZCB0byBzd2FwIHJlZCBhbmQgYmx1ZSBjaGFubmVscworCQkJCXVuc2lnbmVkIHBpdGNoID0gRnJlZUltYWdlX0dldFBpdGNoKGRpYik7CisJCQkJQllURSAqdGFyZ2V0ID0gKEJZVEUqKW1hbGxvYyhwaXRjaCAqIHNpemVvZihCWVRFKSk7CisJCQkJaWYgKHRhcmdldCA9PSBOVUxMKSB7CisJCQkJCXRocm93IEZJX01TR19FUlJPUl9NRU1PUlk7CisJCQkJfQorCisJCQkJd2hpbGUgKGNpbmZvLm5leHRfc2NhbmxpbmUgPCBjaW5mby5pbWFnZV9oZWlnaHQpIHsKKwkJCQkJLy8gZ2V0IGEgY29weSBvZiB0aGUgc2NhbmxpbmUKKwkJCQkJbWVtY3B5KHRhcmdldCwgRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgRnJlZUltYWdlX0dldEhlaWdodChkaWIpIC0gY2luZm8ubmV4dF9zY2FubGluZSAtIDEpLCBwaXRjaCk7CisjaWYgRlJFRUlNQUdFX0NPTE9ST1JERVIgPT0gRlJFRUlNQUdFX0NPTE9ST1JERVJfQkdSCisJCQkJCS8vIHN3YXAgUiBhbmQgQiBjaGFubmVscworCQkJCQlCWVRFICp0YXJnZXRfcCA9IHRhcmdldDsKKwkJCQkJZm9yKHVuc2lnbmVkIHggPSAwOyB4IDwgY2luZm8uaW1hZ2Vfd2lkdGg7IHgrKykgeworCQkJCQkJSU5QTEFDRVNXQVAodGFyZ2V0X3BbMF0sIHRhcmdldF9wWzJdKTsKKwkJCQkJCXRhcmdldF9wICs9IDM7CisJCQkJCX0KKyNlbmRpZgorCQkJCQkvLyB3cml0ZSB0aGUgc2NhbmxpbmUKKwkJCQkJanBlZ193cml0ZV9zY2FubGluZXMoJmNpbmZvLCAmdGFyZ2V0LCAxKTsKKwkJCQl9CisJCQkJZnJlZSh0YXJnZXQpOworCQkJfQorCQkJZWxzZSBpZihjb2xvcl90eXBlID09IEZJQ19NSU5JU0JMQUNLKSB7CisJCQkJLy8gOC1iaXQgc3RhbmRhcmQgZ3JleXNjYWxlIGltYWdlcworCQkJCXdoaWxlIChjaW5mby5uZXh0X3NjYW5saW5lIDwgY2luZm8uaW1hZ2VfaGVpZ2h0KSB7CisJCQkJCUpTQU1QUk9XIGIgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCBGcmVlSW1hZ2VfR2V0SGVpZ2h0KGRpYikgLSBjaW5mby5uZXh0X3NjYW5saW5lIC0gMSk7CisKKwkJCQkJanBlZ193cml0ZV9zY2FubGluZXMoJmNpbmZvLCAmYiwgMSk7CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZihjb2xvcl90eXBlID09IEZJQ19QQUxFVFRFKSB7CisJCQkJLy8gOC1iaXQgcGFsZXR0aXplZCBpbWFnZXMgYXJlIGNvbnZlcnRlZCB0byAyNC1iaXQgaW1hZ2VzCisJCQkJUkdCUVVBRCAqcGFsZXR0ZSA9IEZyZWVJbWFnZV9HZXRQYWxldHRlKGRpYik7CisJCQkJQllURSAqdGFyZ2V0ID0gKEJZVEUqKW1hbGxvYyhjaW5mby5pbWFnZV93aWR0aCAqIDMpOworCQkJCWlmICh0YXJnZXQgPT0gTlVMTCkgeworCQkJCQl0aHJvdyBGSV9NU0dfRVJST1JfTUVNT1JZOworCQkJCX0KKworCQkJCXdoaWxlIChjaW5mby5uZXh0X3NjYW5saW5lIDwgY2luZm8uaW1hZ2VfaGVpZ2h0KSB7CisJCQkJCUJZVEUgKnNvdXJjZSA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIEZyZWVJbWFnZV9HZXRIZWlnaHQoZGliKSAtIGNpbmZvLm5leHRfc2NhbmxpbmUgLSAxKTsKKwkJCQkJRnJlZUltYWdlX0NvbnZlcnRMaW5lOFRvMjQodGFyZ2V0LCBzb3VyY2UsIGNpbmZvLmltYWdlX3dpZHRoLCBwYWxldHRlKTsKKworI2lmIEZSRUVJTUFHRV9DT0xPUk9SREVSID09IEZSRUVJTUFHRV9DT0xPUk9SREVSX0JHUgorCQkJCQkvLyBzd2FwIFIgYW5kIEIgY2hhbm5lbHMKKwkJCQkJQllURSAqdGFyZ2V0X3AgPSB0YXJnZXQ7CisJCQkJCWZvcih1bnNpZ25lZCB4ID0gMDsgeCA8IGNpbmZvLmltYWdlX3dpZHRoOyB4KyspIHsKKwkJCQkJCUlOUExBQ0VTV0FQKHRhcmdldF9wWzBdLCB0YXJnZXRfcFsyXSk7CisJCQkJCQl0YXJnZXRfcCArPSAzOworCQkJCQl9CisjZW5kaWYKKworCisJCQkJCWpwZWdfd3JpdGVfc2NhbmxpbmVzKCZjaW5mbywgJnRhcmdldCwgMSk7CisJCQkJfQorCisJCQkJZnJlZSh0YXJnZXQpOworCQkJfQorCQkJZWxzZSBpZihjb2xvcl90eXBlID09IEZJQ19NSU5JU1dISVRFKSB7CisJCQkJLy8gcmV2ZXJzZSA4LWJpdCBncmV5c2NhbGUgaW1hZ2UsIHNvIHJldmVyc2UgZ3JleSB2YWx1ZSBvbiB0aGUgZmx5CisJCQkJdW5zaWduZWQgaTsKKwkJCQlCWVRFIHJldmVyc2VbMjU2XTsKKwkJCQlCWVRFICp0YXJnZXQgPSAoQllURSAqKW1hbGxvYyhjaW5mby5pbWFnZV93aWR0aCk7CisJCQkJaWYgKHRhcmdldCA9PSBOVUxMKSB7CisJCQkJCXRocm93IEZJX01TR19FUlJPUl9NRU1PUlk7CisJCQkJfQorCisJCQkJZm9yKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkJCQkJcmV2ZXJzZVtpXSA9IChCWVRFKSgyNTUgLSBpKTsKKwkJCQl9CisKKwkJCQl3aGlsZShjaW5mby5uZXh0X3NjYW5saW5lIDwgY2luZm8uaW1hZ2VfaGVpZ2h0KSB7CisJCQkJCUJZVEUgKnNvdXJjZSA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIEZyZWVJbWFnZV9HZXRIZWlnaHQoZGliKSAtIGNpbmZvLm5leHRfc2NhbmxpbmUgLSAxKTsKKwkJCQkJZm9yKGkgPSAwOyBpIDwgY2luZm8uaW1hZ2Vfd2lkdGg7IGkrKykgeworCQkJCQkJdGFyZ2V0W2ldID0gcmV2ZXJzZVsgc291cmNlW2ldIF07CisJCQkJCX0KKwkJCQkJanBlZ193cml0ZV9zY2FubGluZXMoJmNpbmZvLCAmdGFyZ2V0LCAxKTsKKwkJCQl9CisKKwkJCQlmcmVlKHRhcmdldCk7CisJCQl9CisKKwkJCS8vIFN0ZXAgODogRmluaXNoIGNvbXByZXNzaW9uIAorCisJCQlqcGVnX2ZpbmlzaF9jb21wcmVzcygmY2luZm8pOworCisJCQkvLyBTdGVwIDk6IHJlbGVhc2UgSlBFRyBjb21wcmVzc2lvbiBvYmplY3QgCisKKwkJCWpwZWdfZGVzdHJveV9jb21wcmVzcygmY2luZm8pOworCisJCQlyZXR1cm4gVFJVRTsKKworCQl9IGNhdGNoIChjb25zdCBjaGFyICp0ZXh0KSB7CisJCQlpZih0ZXh0KSB7CisJCQkJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKHNfZm9ybWF0X2lkLCB0ZXh0KTsKKwkJCX0KKwkJCXJldHVybiBGQUxTRTsKKwkJfSAKKwl9CisKKwlyZXR1cm4gRkFMU0U7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICAgSW5pdAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit2b2lkIERMTF9DQUxMQ09OVgorSW5pdEpQRUcoUGx1Z2luICpwbHVnaW4sIGludCBmb3JtYXRfaWQpIHsKKwlzX2Zvcm1hdF9pZCA9IGZvcm1hdF9pZDsKKworCXBsdWdpbi0+Zm9ybWF0X3Byb2MgPSBGb3JtYXQ7CisJcGx1Z2luLT5kZXNjcmlwdGlvbl9wcm9jID0gRGVzY3JpcHRpb247CisJcGx1Z2luLT5leHRlbnNpb25fcHJvYyA9IEV4dGVuc2lvbjsKKwlwbHVnaW4tPnJlZ2V4cHJfcHJvYyA9IFJlZ0V4cHI7CisJcGx1Z2luLT5vcGVuX3Byb2MgPSBOVUxMOworCXBsdWdpbi0+Y2xvc2VfcHJvYyA9IE5VTEw7CisJcGx1Z2luLT5wYWdlY291bnRfcHJvYyA9IE5VTEw7CisJcGx1Z2luLT5wYWdlY2FwYWJpbGl0eV9wcm9jID0gTlVMTDsKKwlwbHVnaW4tPmxvYWRfcHJvYyA9IExvYWQ7CisJcGx1Z2luLT5zYXZlX3Byb2MgPSBTYXZlOworCXBsdWdpbi0+dmFsaWRhdGVfcHJvYyA9IFZhbGlkYXRlOworCXBsdWdpbi0+bWltZV9wcm9jID0gTWltZVR5cGU7CisJcGx1Z2luLT5zdXBwb3J0c19leHBvcnRfYnBwX3Byb2MgPSBTdXBwb3J0c0V4cG9ydERlcHRoOworCXBsdWdpbi0+c3VwcG9ydHNfZXhwb3J0X3R5cGVfcHJvYyA9IFN1cHBvcnRzRXhwb3J0VHlwZTsKKwlwbHVnaW4tPnN1cHBvcnRzX2ljY19wcm9maWxlc19wcm9jID0gU3VwcG9ydHNJQ0NQcm9maWxlczsKKwlwbHVnaW4tPnN1cHBvcnRzX25vX3BpeGVsc19wcm9jID0gU3VwcG9ydHNOb1BpeGVsczsKK30KZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvUGx1Z2luSlhSLmNwcCBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvUGx1Z2luSlhSLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTE0ZTA5Ci0tLSAvZGV2L251bGwKKysrIGIvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9QbHVnaW5KWFIuY3BwCkBAIC0wLDAgKzEsMTQ3NSBAQAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gSlBFRyBYUiBMb2FkZXIgJiBXcml0ZXIKKy8vCisvLyBEZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIGJ5CisvLyAtIEhlcnZlIERyb2xvbiAoZHJvbG9uQGluZm9uaWUuZnIpCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRnJlZUltYWdlIDMKKy8vCisvLyBDT1ZFUkVEIENPREUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkKKy8vIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTCisvLyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy8vIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVECisvLyBDT0RFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UCisvLyBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWQorLy8gU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTAorLy8gUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUgorLy8gVEhJUyBESVNDTEFJTUVSLgorLy8KKy8vIFVzZSBhdCB5b3VyIG93biByaXNrIQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaW5jbHVkZSAiRnJlZUltYWdlLmgiCisjaW5jbHVkZSAiVXRpbGl0aWVzLmgiCisjaW5jbHVkZSAiLi4vTWV0YWRhdGEvRnJlZUltYWdlVGFnLmgiCisKKyNpbmNsdWRlICIuLi9MaWJKWFIvanhyZ2x1ZWxpYi9KWFJHbHVlLmgiCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFBsdWdpbiBJbnRlcmZhY2UKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3RhdGljIGludCBzX2Zvcm1hdF9pZDsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRnJlZUltYWdlSU8gaW50ZXJmYWNlIChJL08gc3RyZWFtaW5nIGZ1bmN0aW9ucykKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLyoqCitKWFIgd3JhcHBlciBmb3IgRnJlZUltYWdlIEkvTyBoYW5kbGUKKyovCit0eXBlZGVmIHN0cnVjdCB0YWdGcmVlSW1hZ2VKWFJJTyB7CisgICAgRnJlZUltYWdlSU8gKmlvOworCWZpX2hhbmRsZSBoYW5kbGU7Cit9IEZyZWVJbWFnZUpYUklPOworCitzdGF0aWMgRVJSIAorX2p4cl9pb19SZWFkKFdNUFN0cmVhbSogcFdTLCB2b2lkKiBwdiwgc2l6ZV90IGNiKSB7CisJRnJlZUltYWdlSlhSSU8gKmZpbyA9IChGcmVlSW1hZ2VKWFJJTyopcFdTLT5zdGF0ZS5wdk9iajsKKwlyZXR1cm4gKGZpby0+aW8tPnJlYWRfcHJvYyhwdiwgKHVuc2lnbmVkKWNiLCAxLCBmaW8tPmhhbmRsZSkgPT0gMSkgPyBXTVBfZXJyU3VjY2VzcyA6IFdNUF9lcnJGaWxlSU87Cit9CisKK3N0YXRpYyBFUlIgCitfanhyX2lvX1dyaXRlKFdNUFN0cmVhbSogcFdTLCBjb25zdCB2b2lkKiBwdiwgc2l6ZV90IGNiKSB7CisJRnJlZUltYWdlSlhSSU8gKmZpbyA9IChGcmVlSW1hZ2VKWFJJTyopcFdTLT5zdGF0ZS5wdk9iajsKKwlpZigwICE9IGNiKSB7CisJCXJldHVybiAoZmlvLT5pby0+d3JpdGVfcHJvYygodm9pZCopcHYsICh1bnNpZ25lZCljYiwgMSwgZmlvLT5oYW5kbGUpID09IDEpID8gV01QX2VyclN1Y2Nlc3MgOiBXTVBfZXJyRmlsZUlPOworCX0KKwlyZXR1cm4gV01QX2VyckZpbGVJTzsKK30KKworc3RhdGljIEVSUiAKK19qeHJfaW9fU2V0UG9zKFdNUFN0cmVhbSogcFdTLCBzaXplX3Qgb2ZmUG9zKSB7CisJRnJlZUltYWdlSlhSSU8gKmZpbyA9IChGcmVlSW1hZ2VKWFJJTyopcFdTLT5zdGF0ZS5wdk9iajsKKyAgICByZXR1cm4gKGZpby0+aW8tPnNlZWtfcHJvYyhmaW8tPmhhbmRsZSwgKGxvbmcpb2ZmUG9zLCBTRUVLX1NFVCkgPT0gMCkgPyBXTVBfZXJyU3VjY2VzcyA6IFdNUF9lcnJGaWxlSU87Cit9CisKK3N0YXRpYyBFUlIgCitfanhyX2lvX0dldFBvcyhXTVBTdHJlYW0qIHBXUywgc2l6ZV90KiBwb2ZmUG9zKSB7CisJRnJlZUltYWdlSlhSSU8gKmZpbyA9IChGcmVlSW1hZ2VKWFJJTyopcFdTLT5zdGF0ZS5wdk9iajsKKyAgICBsb25nIGxPZmYgPSBmaW8tPmlvLT50ZWxsX3Byb2MoZmlvLT5oYW5kbGUpOworCWlmKGxPZmYgPT0gLTEpIHsKKwkJcmV0dXJuIFdNUF9lcnJGaWxlSU87CisJfQorICAgICpwb2ZmUG9zID0gKHNpemVfdClsT2ZmOworCXJldHVybiBXTVBfZXJyU3VjY2VzczsKK30KKworc3RhdGljIEJvb2wgCitfanhyX2lvX0VPUyhXTVBTdHJlYW0qIHBXUykgeworCUZyZWVJbWFnZUpYUklPICpmaW8gPSAoRnJlZUltYWdlSlhSSU8qKXBXUy0+c3RhdGUucHZPYmo7CisgICAgbG9uZyBjdXJyZW50UG9zID0gZmlvLT5pby0+dGVsbF9wcm9jKGZpby0+aGFuZGxlKTsKKyAgICBmaW8tPmlvLT5zZWVrX3Byb2MoZmlvLT5oYW5kbGUsIDAsIFNFRUtfRU5EKTsKKyAgICBsb25nIGZpbGVSZW1haW5pbmcgPSBmaW8tPmlvLT50ZWxsX3Byb2MoZmlvLT5oYW5kbGUpIC0gY3VycmVudFBvczsKKyAgICBmaW8tPmlvLT5zZWVrX3Byb2MoZmlvLT5oYW5kbGUsIGN1cnJlbnRQb3MsIFNFRUtfU0VUKTsKKyAgICByZXR1cm4gKGZpbGVSZW1haW5pbmcgPiAwKTsKK30KKworc3RhdGljIEVSUiAKK19qeHJfaW9fQ2xvc2UoV01QU3RyZWFtKiogcHBXUykgeworCVdNUFN0cmVhbSAqcFdTID0gKnBwV1M7CisJLy8gSEFDSyA6IHdlIHVzZSBmTWVtIHRvIGF2b2lkIGEgc3RyZWFtIGRlc3RydWN0aW9uIGJ5IHRoZSBsaWJyYXJ5CisJLy8gYmVjYXVzZSBGcmVlSW1hZ2UgTVVTVCBIQVZFIHRoZSBvd25lcnNoaXAgb2YgdGhlIHN0cmVhbQorCS8vIHNlZSBfanhyX2lvX0NyZWF0ZQorCWlmKHBXUyAmJiBwV1MtPmZNZW0pIHsKKwkJZnJlZShwV1MpOworCQkqcHBXUyA9IE5VTEw7CisJfQorCXJldHVybiBXTVBfZXJyU3VjY2VzczsKK30KKworc3RhdGljIEVSUiAKK19qeHJfaW9fQ3JlYXRlKFdNUFN0cmVhbSAqKnBwV1MsIEZyZWVJbWFnZUpYUklPICpqeHJfaW8pIHsKKwkqcHBXUyA9IChXTVBTdHJlYW0qKWNhbGxvYygxLCBzaXplb2YoKipwcFdTKSk7CisJaWYoKnBwV1MpIHsKKwkJV01QU3RyZWFtICpwV1MgPSAqcHBXUzsKKworCQlwV1MtPnN0YXRlLnB2T2JqID0ganhyX2lvOworCQlwV1MtPkNsb3NlID0gX2p4cl9pb19DbG9zZTsKKwkJcFdTLT5FT1MgPSBfanhyX2lvX0VPUzsKKwkJcFdTLT5SZWFkID0gX2p4cl9pb19SZWFkOworCQlwV1MtPldyaXRlID0gX2p4cl9pb19Xcml0ZTsKKwkJcFdTLT5TZXRQb3MgPSBfanhyX2lvX1NldFBvczsKKwkJcFdTLT5HZXRQb3MgPSBfanhyX2lvX0dldFBvczsKKworCQkvLyBIQUNLIDogd2UgdXNlIGZNZW0gdG8gYXZvaWQgYSBzdHJlYW0gZGVzdHJ1Y3Rpb24gYnkgdGhlIGxpYnJhcnkKKwkJLy8gYmVjYXVzZSBGcmVlSW1hZ2UgTVVTVCBIQVZFIHRoZSBvd25lcnNoaXAgb2YgdGhlIHN0cmVhbQorCQkvLyBzZWUgX2p4cl9pb19DbG9zZQorCQlwV1MtPmZNZW0gPSBGQUxTRTsKKworCQlyZXR1cm4gV01QX2VyclN1Y2Nlc3M7CisJfQorCXJldHVybiBXTVBfZXJyT3V0T2ZNZW1vcnk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEpQRUcgWFIgRXJyb3IgaGFuZGxpbmcKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3RhdGljIGNvbnN0IGNoYXIqIAorSlhSX0Vycm9yTWVzc2FnZShjb25zdCBpbnQgZXJyb3IpIHsKKwlzd2l0Y2goZXJyb3IpIHsKKwkJY2FzZSBXTVBfZXJyTm90WWV0SW1wbGVtZW50ZWQ6CisJCWNhc2UgV01QX2VyckFic3RyYWN0TWV0aG9kOgorCQkJcmV0dXJuICJOb3QgeWV0IGltcGxlbWVudGVkIjsKKwkJY2FzZSBXTVBfZXJyT3V0T2ZNZW1vcnk6CisJCQlyZXR1cm4gIk91dCBvZiBtZW1vcnkiOworCQljYXNlIFdNUF9lcnJGaWxlSU86CisJCQlyZXR1cm4gIkZpbGUgSS9PIGVycm9yIjsKKwkJY2FzZSBXTVBfZXJyQnVmZmVyT3ZlcmZsb3c6CisJCQlyZXR1cm4gIkJ1ZmZlciBvdmVyZmxvdyI7CisJCWNhc2UgV01QX2VyckludmFsaWRQYXJhbWV0ZXI6CisJCQlyZXR1cm4gIkludmFsaWQgcGFyYW1ldGVyIjsKKwkJY2FzZSBXTVBfZXJySW52YWxpZEFyZ3VtZW50OgorCQkJcmV0dXJuICJJbnZhbGlkIGFyZ3VtZW50IjsKKwkJY2FzZSBXTVBfZXJyVW5zdXBwb3J0ZWRGb3JtYXQ6CisJCQlyZXR1cm4gIlVuc3VwcG9ydGVkIGZvcm1hdCI7CisJCWNhc2UgV01QX2VyckluY29ycmVjdENvZGVjVmVyc2lvbjoKKwkJCXJldHVybiAiSW5jb3JyZWN0IGNvZGVjIHZlcnNpb24iOworCQljYXNlIFdNUF9lcnJJbmRleE5vdEZvdW5kOgorCQkJcmV0dXJuICJGb3JtYXQgY29udmVydGVyOiBJbmRleCBub3QgZm91bmQiOworCQljYXNlIFdNUF9lcnJPdXRPZlNlcXVlbmNlOgorCQkJcmV0dXJuICJNZXRhZGF0YTogT3V0IG9mIHNlcXVlbmNlIjsKKwkJY2FzZSBXTVBfZXJyTXVzdEJlTXVsdGlwbGVPZjE2TGluZXNVbnRpbExhc3RDYWxsOgorCQkJcmV0dXJuICJNdXN0IGJlIG11bHRpcGxlIG9mIDE2IGxpbmVzIHVudGlsIGxhc3QgY2FsbCI7CisJCWNhc2UgV01QX2VyclBsYW5hckFscGhhQmFuZGVkRW5jUmVxdWlyZXNUZW1wRmlsZToKKwkJCXJldHVybiAiUGxhbmFyIGFscGhhIGJhbmRlZCBlbmNvZGVyIHJlcXVpcmVzIHRlbXAgZmlsZXMiOworCQljYXNlIFdNUF9lcnJBbHBoYU1vZGVDYW5ub3RCZVRyYW5zY29kZWQ6CisJCQlyZXR1cm4gIkFscGhhIG1vZGUgY2Fubm90IGJlIHRyYW5zY29kZWQiOworCQljYXNlIFdNUF9lcnJJbmNvcnJlY3RDb2RlY1N1YlZlcnNpb246CisJCQlyZXR1cm4gIkluY29ycmVjdCBjb2RlYyBzdWJ2ZXJzaW9uIjsKKwkJY2FzZSBXTVBfZXJyRmFpbDoKKwkJY2FzZSBXTVBfZXJyTm90SW5pdGlhbGl6ZWQ6CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gIkludmFsaWQgaW5zdHJ1Y3Rpb24gLSBwbGVhc2UgY29udGFjdCB0aGUgRnJlZUltYWdlIHRlYW0iOworCX0KK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gSGVscGVyIGZ1bmN0aW9ucyAmIG1hY3JvCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNkZWZpbmUgSlhSX0NIRUNLKGVycm9yX2NvZGUpIFwKKwlpZihlcnJvcl9jb2RlIDwgMCkgeyBcCisJCWNvbnN0IGNoYXIgKmVycm9yX21lc3NhZ2UgPSBKWFJfRXJyb3JNZXNzYWdlKGVycm9yX2NvZGUpOyBcCisJCXRocm93IGVycm9yX21lc3NhZ2U7IFwKKwl9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qKgorSW5wdXQgY29udmVyc2lvbnMgbmF0aXZlbHkgdW5kZXJzdG9vZCBieSBGcmVlSW1hZ2UKK0BzZWUgR2V0TmF0aXZlUGl4ZWxGb3JtYXQKKyovCit0eXBlZGVmIHN0cnVjdCB0YWdKWFJJbnB1dENvbnZlcnNpb24geworCUJJVERFUFRIX0JJVFMgYmRCaXREZXB0aDsKKwlVMzIgY2JpdFVuaXQ7CisJRlJFRV9JTUFHRV9UWVBFIGltYWdlX3R5cGU7CisJdW5zaWduZWQgcmVkX21hc2s7CisJdW5zaWduZWQgZ3JlZW5fbWFzazsKKwl1bnNpZ25lZCBibHVlX21hc2s7Cit9IEpYUklucHV0Q29udmVyc2lvbjsKKworLyoqCitDb252ZXJzaW9uIHRhYmxlIGZvciBuYXRpdmUgRnJlZUltYWdlIGZvcm1hdHMKK0BzZWUgR2V0TmF0aXZlUGl4ZWxGb3JtYXQKKyovCitzdGF0aWMgSlhSSW5wdXRDb252ZXJzaW9uIHNfRnJlZUltYWdlUGl4ZWxJbmZvW10gPSB7CisJLy8gMS1iaXQgYml0bWFwCisJeyBCRF8xLCAxLCBGSVRfQklUTUFQLCAwLCAwLCAwIH0sCisJLy8gOC0sIDI0LSwgMzItYml0IGJpdG1hcAorCXsgQkRfOCwgOCwgRklUX0JJVE1BUCwgMCwgMCwgMCB9LAorCXsgQkRfOCwgMjQsIEZJVF9CSVRNQVAsIDAsIDAsIDAgfSwKKwl7IEJEXzgsIDMyLCBGSVRfQklUTUFQLCAwLCAwLCAwIH0sCisJLy8gMTYtYml0IFJHQiA1NjUKKwl7IEJEXzU2NSwgMTYsIEZJVF9CSVRNQVAsIEZJMTZfNTY1X1JFRF9NQVNLLCBGSTE2XzU2NV9HUkVFTl9NQVNLLCBGSTE2XzU2NV9CTFVFX01BU0sgfSwKKwkvLyAxNi1iaXQgUkdCIDU1NQorCXsgQkRfNSwgMTYsIEZJVF9CSVRNQVAsIEZJMTZfNTU1X1JFRF9NQVNLLCBGSTE2XzU1NV9HUkVFTl9NQVNLLCBGSTE2XzU1NV9CTFVFX01BU0sgfSwKKwkvLyAxNi1iaXQgZ3JleXNjYWxlLCBSR0IxNiwgUkdCQTE2IGJpdG1hcAorCXsgQkRfMTYsIDE2LCBGSVRfVUlOVDE2LCAwLCAwLCAwIH0sCisJeyBCRF8xNiwgNDgsIEZJVF9SR0IxNiwgMCwgMCwgMCB9LAorCXsgQkRfMTYsIDY0LCBGSVRfUkdCQTE2LCAwLCAwLCAwIH0sCisJLy8gMzItYml0IGZsb2F0LCBSR0JGLCBSR0JBRiBiaXRtYXAKKwl7IEJEXzMyRiwgMzIsIEZJVF9GTE9BVCwgMCwgMCwgMCB9LAorCXsgQkRfMzJGLCA5NiwgRklUX1JHQkYsIDAsIDAsIDAgfSwKKwl7IEJEXzMyRiwgMTI4LCBGSVRfUkdCQUYsIDAsIDAsIDAgfQorfTsKKworLyoqCitTY2FuIGlucHV0IHBpeGVsSW5mbyBzcGVjaWZpY2F0aW9ucyBhbmQgcmV0dXJuIHRoZSBlcXVpdmFsZW50IEZyZWVJbWFnZSBpbmZvIGZvciBsb2FkaW5nCitAcGFyYW0gcGl4ZWxJbmZvIEltYWdlIHNwZWNpZmljYXRpb25zCitAcGFyYW0gb3V0X2d1aWRfZm9ybWF0IChyZXR1cm5lZCB2YWx1ZSkgb3V0cHV0IHBpeGVsIGZvcm1hdAorQHBhcmFtIGltYWdlX3R5cGUgKHJldHVybmVkIHZhbHVlKSBJbWFnZSB0eXBlCitAcGFyYW0gYnBwIChyZXR1cm5lZCB2YWx1ZSkgSW1hZ2UgYml0IGRlcHRoCitAcGFyYW0gcmVkX21hc2sgKHJldHVybmVkIHZhbHVlKSBSR0IgbWFzaworQHBhcmFtIGdyZWVuX21hc2sgKHJldHVybmVkIHZhbHVlKSBSR0IgbWFzaworQHBhcmFtIGJsdWVfbWFzayAocmV0dXJuZWQgdmFsdWUpIFJHQiBtYXNrCitAcmV0dXJuIFJldHVybnMgV01QX2VyclN1Y2Nlc3MgaWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyBXTVBfZXJyRmFpbCBvdGhlcndpc2UKK0BzZWUgR2V0SW5wdXRQaXhlbEZvcm1hdAorKi8KK3N0YXRpYyBFUlIKK0dldE5hdGl2ZVBpeGVsRm9ybWF0KGNvbnN0IFBLUGl4ZWxJbmZvICpwaXhlbEluZm8sIFBLUGl4ZWxGb3JtYXRHVUlEICpvdXRfZ3VpZF9mb3JtYXQsIEZSRUVfSU1BR0VfVFlQRSAqaW1hZ2VfdHlwZSwgdW5zaWduZWQgKmJwcCwgdW5zaWduZWQgKnJlZF9tYXNrLCB1bnNpZ25lZCAqZ3JlZW5fbWFzaywgdW5zaWduZWQgKmJsdWVfbWFzaykgeworCWNvbnN0IHVuc2lnbmVkIHNfRnJlZUltYWdlUGl4ZWxJbmZvU2l6ZSA9ICh1bnNpZ25lZClzaXplb2Yoc19GcmVlSW1hZ2VQaXhlbEluZm8pIC8gc2l6ZW9mKCooc19GcmVlSW1hZ2VQaXhlbEluZm8pKTsKKworCWZvcih1bnNpZ25lZCBpID0gMDsgaSA8IHNfRnJlZUltYWdlUGl4ZWxJbmZvU2l6ZTsgaSsrKSB7CisJCWlmKHBpeGVsSW5mby0+YmRCaXREZXB0aCA9PSBzX0ZyZWVJbWFnZVBpeGVsSW5mb1tpXS5iZEJpdERlcHRoKSB7CisJCQlpZihwaXhlbEluZm8tPmNiaXRVbml0ID09IHNfRnJlZUltYWdlUGl4ZWxJbmZvW2ldLmNiaXRVbml0KSB7CisJCQkJLy8gZm91bmQgISBub3cgZ2V0IGRzdCBpbWFnZSBmb3JtYXQgc3BlY2lmaWNhdGlvbnMKKwkJCQltZW1jcHkob3V0X2d1aWRfZm9ybWF0LCBwaXhlbEluZm8tPnBHVUlEUGl4Rm10LCBzaXplb2YoUEtQaXhlbEZvcm1hdEdVSUQpKTsKKwkJCQkqaW1hZ2VfdHlwZSA9IHNfRnJlZUltYWdlUGl4ZWxJbmZvW2ldLmltYWdlX3R5cGU7CisJCQkJKmJwcCA9IHNfRnJlZUltYWdlUGl4ZWxJbmZvW2ldLmNiaXRVbml0OworCQkJCSpyZWRfbWFzawk9IHNfRnJlZUltYWdlUGl4ZWxJbmZvW2ldLnJlZF9tYXNrOworCQkJCSpncmVlbl9tYXNrCT0gc19GcmVlSW1hZ2VQaXhlbEluZm9baV0uZ3JlZW5fbWFzazsKKwkJCQkqYmx1ZV9tYXNrCT0gc19GcmVlSW1hZ2VQaXhlbEluZm9baV0uYmx1ZV9tYXNrOworCQkJCXJldHVybiBXTVBfZXJyU3VjY2VzczsKKwkJCX0KKwkJfQorCX0KKworCS8vIG5vdCBmb3VuZCA6IG5lZWQgcGl4ZWwgZm9ybWF0IGNvbnZlcnNpb24KKwlyZXR1cm4gV01QX2VyckZhaWw7Cit9CisKKy8qKgorU2NhbiBpbnB1dCBmaWxlIGd1aWQgZm9ybWF0IGFuZCByZXR1cm4gdGhlIGVxdWl2YWxlbnQgRnJlZUltYWdlIGluZm8gJiB0YXJnZXQgZ3VpZCBmb3JtYXQgZm9yIGxvYWRpbmcKK0BwYXJhbSBwRGVjb2RlciBEZWNvZGVyIGhhbmRsZQorQHBhcmFtIGd1aWRfZm9ybWF0IChyZXR1cm5lZCB2YWx1ZSkgT3V0cHV0IHBpeGVsIGZvcm1hdAorQHBhcmFtIGltYWdlX3R5cGUgKHJldHVybmVkIHZhbHVlKSBJbWFnZSB0eXBlCitAcGFyYW0gYnBwIChyZXR1cm5lZCB2YWx1ZSkgSW1hZ2UgYml0IGRlcHRoCitAcGFyYW0gcmVkX21hc2sgKHJldHVybmVkIHZhbHVlKSBSR0IgbWFzaworQHBhcmFtIGdyZWVuX21hc2sgKHJldHVybmVkIHZhbHVlKSBSR0IgbWFzaworQHBhcmFtIGJsdWVfbWFzayAocmV0dXJuZWQgdmFsdWUpIFJHQiBtYXNrCitAcmV0dXJuIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsLCByZXR1cm5zIEZBTFNFIG90aGVyd2lzZQorKi8KK3N0YXRpYyBFUlIKK0dldElucHV0UGl4ZWxGb3JtYXQoUEtJbWFnZURlY29kZSAqcERlY29kZXIsIFBLUGl4ZWxGb3JtYXRHVUlEICpndWlkX2Zvcm1hdCwgRlJFRV9JTUFHRV9UWVBFICppbWFnZV90eXBlLCB1bnNpZ25lZCAqYnBwLCB1bnNpZ25lZCAqcmVkX21hc2ssIHVuc2lnbmVkICpncmVlbl9tYXNrLCB1bnNpZ25lZCAqYmx1ZV9tYXNrKSB7CisJRVJSIGVycm9yX2NvZGUgPSAwOwkJLy8gZXJyb3IgY29kZSBhcyByZXR1cm5lZCBieSB0aGUgaW50ZXJmYWNlCisJUEtQaXhlbEluZm8gcGl4ZWxJbmZvOwkvLyBpbWFnZSBzcGVjaWZpY2F0aW9ucworCisJdHJ5IHsJCQorCQkvLyBnZXQgaW5wdXQgZmlsZSBwaXhlbCBmb3JtYXQgLi4uCisJCVBLUGl4ZWxGb3JtYXRHVUlEIHBndWlkU291cmNlUEY7CisJCWVycm9yX2NvZGUgPSBwRGVjb2Rlci0+R2V0UGl4ZWxGb3JtYXQocERlY29kZXIsICZwZ3VpZFNvdXJjZVBGKTsKKwkJSlhSX0NIRUNLKGVycm9yX2NvZGUpOworCQlwaXhlbEluZm8ucEdVSURQaXhGbXQgPSAmcGd1aWRTb3VyY2VQRjsKKwkJLy8gLi4uIGNoZWNrIGZvciBhIHN1cHBvcnRlZCBmb3JtYXQgYW5kIGdldCB0aGUgZm9ybWF0IHNwZWNpZmljYXRpb25zCisJCWVycm9yX2NvZGUgPSBQaXhlbEZvcm1hdExvb2t1cCgmcGl4ZWxJbmZvLCBMT09LVVBfRk9SV0FSRCk7CisJCUpYUl9DSEVDSyhlcnJvcl9jb2RlKTsKKworCQkvLyBzZWFyY2ggZm9yIGFuIGVxdWl2YWxlbnQgbmF0aXZlIEZyZWVJbWFnZSBmb3JtYXQKKwkJZXJyb3JfY29kZSA9IEdldE5hdGl2ZVBpeGVsRm9ybWF0KCZwaXhlbEluZm8sIGd1aWRfZm9ybWF0LCBpbWFnZV90eXBlLCBicHAsIHJlZF9tYXNrLCBncmVlbl9tYXNrLCBibHVlX21hc2spOworCisJCWlmKGVycm9yX2NvZGUgIT0gV01QX2VyclN1Y2Nlc3MpIHsKKwkJCS8vIHRyeSB0byBmaW5kIGEgc3VpdGFibGUgY29udmVyc2lvbiBmdW5jdGlvbiAuLi4KKwkJCWNvbnN0IFBLUGl4ZWxGb3JtYXRHVUlEICpwcGd1aWRUYXJnZXRQRiA9IE5VTEw7CS8vIHRhcmdldCBwaXhlbCBmb3JtYXQKKwkJCXVuc2lnbmVkIGlJbmRleCA9IDA7CS8vIGZpcnN0IGF2YWlsYWJsZSBjb252ZXJzaW9uIGZ1bmN0aW9uCisJCQlkbyB7CisJCQkJZXJyb3JfY29kZSA9IFBLRm9ybWF0Q29udmVydGVyX0VudW1Db252ZXJzaW9ucygmcGd1aWRTb3VyY2VQRiwgaUluZGV4LCAmcHBndWlkVGFyZ2V0UEYpOworCQkJCWlmKGVycm9yX2NvZGUgPT0gV01QX2VyclN1Y2Nlc3MpIHsKKwkJCQkJLy8gZm91bmQgYSBjb252ZXJzaW9uIGZ1bmN0aW9uLCBpcyB0aGUgY29udmVydGVkIGZvcm1hdCBhIG5hdGl2ZSBGcmVlSW1hZ2UgZm9ybWF0ID8KKwkJCQkJcGl4ZWxJbmZvLnBHVUlEUGl4Rm10ID0gcHBndWlkVGFyZ2V0UEY7CisJCQkJCWVycm9yX2NvZGUgPSBQaXhlbEZvcm1hdExvb2t1cCgmcGl4ZWxJbmZvLCBMT09LVVBfRk9SV0FSRCk7CisJCQkJCUpYUl9DSEVDSyhlcnJvcl9jb2RlKTsKKwkJCQkJZXJyb3JfY29kZSA9IEdldE5hdGl2ZVBpeGVsRm9ybWF0KCZwaXhlbEluZm8sIGd1aWRfZm9ybWF0LCBpbWFnZV90eXBlLCBicHAsIHJlZF9tYXNrLCBncmVlbl9tYXNrLCBibHVlX21hc2spOworCQkJCQlpZihlcnJvcl9jb2RlID09IFdNUF9lcnJTdWNjZXNzKSB7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCQkvLyB0cnkgbmV4dCBjb252ZXJzaW9uIGZ1bmN0aW9uCisJCQkJaUluZGV4Kys7CisJCQl9IHdoaWxlKGVycm9yX2NvZGUgIT0gV01QX2VyckluZGV4Tm90Rm91bmQpOworCisJCX0KKworCQlyZXR1cm4gKGVycm9yX2NvZGUgPT0gV01QX2VyclN1Y2Nlc3MpID8gV01QX2VyclN1Y2Nlc3MgOiBXTVBfZXJyVW5zdXBwb3J0ZWRGb3JtYXQ7CisKKwl9IGNhdGNoKC4uLikgeworCQlyZXR1cm4gZXJyb3JfY29kZTsKKwl9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qKgorU2NhbiBpbnB1dCBkaWIgZm9ybWF0IGFuZCByZXR1cm4gdGhlIGVxdWl2YWxlbnQgUEtQaXhlbEZvcm1hdEdVSUQgZm9ybWF0IGZvciBzYXZpbmcKK0BwYXJhbSBkaWIgSW1hZ2UgdG8gYmUgc2F2ZWQKK0BwYXJhbSBndWlkX2Zvcm1hdCAocmV0dXJuZWQgdmFsdWUpIEdVSUQgZm9ybWF0CitAcGFyYW0gYkhhc0FscGhhIChyZXR1cm5lZCB2YWx1ZSkgVFJVRSBpZiBhbiBhbHBoYSBsYXllciBpcyBwcmVzZW50CitAcmV0dXJuIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsLCByZXR1cm5zIEZBTFNFIG90aGVyd2lzZQorKi8KK3N0YXRpYyBFUlIKK0dldE91dHB1dFBpeGVsRm9ybWF0KEZJQklUTUFQICpkaWIsIFBLUGl4ZWxGb3JtYXRHVUlEICpndWlkX2Zvcm1hdCwgQk9PTCAqYkhhc0FscGhhKSB7CisJY29uc3QgRlJFRV9JTUFHRV9UWVBFIGltYWdlX3R5cGUgPSBGcmVlSW1hZ2VfR2V0SW1hZ2VUeXBlKGRpYik7CisJY29uc3QgdW5zaWduZWQgYnBwID0gRnJlZUltYWdlX0dldEJQUChkaWIpOworCWNvbnN0IEZSRUVfSU1BR0VfQ09MT1JfVFlQRSBjb2xvcl90eXBlID0gRnJlZUltYWdlX0dldENvbG9yVHlwZShkaWIpOworCisJKmd1aWRfZm9ybWF0ID0gR1VJRF9QS1BpeGVsRm9ybWF0RG9udENhcmU7CisJKmJIYXNBbHBoYSA9IEZBTFNFOworCisJc3dpdGNoKGltYWdlX3R5cGUpIHsKKwkJY2FzZSBGSVRfQklUTUFQOgkvLyBzdGFuZGFyZCBpbWFnZQk6IDEtLCA0LSwgOC0sIDE2LSwgMjQtLCAzMi1iaXQKKwkJCXN3aXRjaChicHApIHsKKwkJCQljYXNlIDE6CisJCQkJCS8vIGFzc3VtZSBGSUNfTUlOSVNCTEFDSworCQkJCQlpZihjb2xvcl90eXBlID09IEZJQ19NSU5JU0JMQUNLKSB7CisJCQkJCQkqZ3VpZF9mb3JtYXQgPSBHVUlEX1BLUGl4ZWxGb3JtYXRCbGFja1doaXRlOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2UgODoKKwkJCQkJLy8gYXNzdW1lIEZJQ19NSU5JU0JMQUNLCisJCQkJCWlmKGNvbG9yX3R5cGUgPT0gRklDX01JTklTQkxBQ0spIHsKKwkJCQkJCSpndWlkX2Zvcm1hdCA9IEdVSURfUEtQaXhlbEZvcm1hdDhicHBHcmF5OworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMTY6CisJCQkJCWlmICgoRnJlZUltYWdlX0dldFJlZE1hc2soZGliKSA9PSBGSTE2XzU2NV9SRURfTUFTSykgJiYgKEZyZWVJbWFnZV9HZXRHcmVlbk1hc2soZGliKSA9PSBGSTE2XzU2NV9HUkVFTl9NQVNLKSAmJiAoRnJlZUltYWdlX0dldEJsdWVNYXNrKGRpYikgPT0gRkkxNl81NjVfQkxVRV9NQVNLKSkgeworCQkJCQkJKmd1aWRfZm9ybWF0ID0gR1VJRF9QS1BpeGVsRm9ybWF0MTZicHBSR0I1NjU7CisJCQkJCX0gZWxzZSB7CisJCQkJCQkvLyBpbmNsdWRlcyBjYXNlIHdoZXJlIGFsbCB0aGUgbWFza3MgYXJlIDAKKwkJCQkJCSpndWlkX2Zvcm1hdCA9IEdVSURfUEtQaXhlbEZvcm1hdDE2YnBwUkdCNTU1OworCQkJCQl9CisJCQkJCWJyZWFrOworI2lmIEZSRUVJTUFHRV9DT0xPUk9SREVSID09IEZSRUVJTUFHRV9DT0xPUk9SREVSX0JHUgorCQkJCWNhc2UgMjQ6CisJCQkJCSpndWlkX2Zvcm1hdCA9IEdVSURfUEtQaXhlbEZvcm1hdDI0YnBwQkdSOworCQkJCQlicmVhazsKKwkJCQljYXNlIDMyOgorCQkJCQkqZ3VpZF9mb3JtYXQgPSBHVUlEX1BLUGl4ZWxGb3JtYXQzMmJwcEJHUkE7CisJCQkJCSpiSGFzQWxwaGEgPSBUUlVFOworCQkJCQlicmVhazsKKyNlbGlmIEZSRUVJTUFHRV9DT0xPUk9SREVSID09IEZSRUVJTUFHRV9DT0xPUk9SREVSX1JHQgorCQkJCWNhc2UgMjQ6CisJCQkJCSpndWlkX2Zvcm1hdCA9IEdVSURfUEtQaXhlbEZvcm1hdDI0YnBwUkdCOworCQkJCQlicmVhazsKKwkJCQljYXNlIDMyOgorCQkJCQkqZ3VpZF9mb3JtYXQgPSBHVUlEX1BLUGl4ZWxGb3JtYXQzMmJwcFJHQkE7CisJCQkJCSpiSGFzQWxwaGEgPSBUUlVFOworCQkJCQlicmVhazsKKyNlbmRpZgorCQkJCWNhc2UgNDoKKwkJCQlkZWZhdWx0OgorCQkJCQkvLyBub3Qgc3VwcG9ydGVkCisJCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgRklUX1VJTlQxNjoJLy8gYXJyYXkgb2YgdW5zaWduZWQgc2hvcnQJOiB1bnNpZ25lZCAxNi1iaXQKKwkJCSpndWlkX2Zvcm1hdCA9IEdVSURfUEtQaXhlbEZvcm1hdDE2YnBwR3JheTsKKwkJCWJyZWFrOworCQljYXNlIEZJVF9GTE9BVDoJCS8vIGFycmF5IG9mIGZsb2F0CQkJOiAzMi1iaXQgSUVFRSBmbG9hdGluZyBwb2ludAorCQkJKmd1aWRfZm9ybWF0ID0gR1VJRF9QS1BpeGVsRm9ybWF0MzJicHBHcmF5RmxvYXQ7CisJCQlicmVhazsKKwkJY2FzZSBGSVRfUkdCMTY6CQkvLyA0OC1iaXQgUkdCIGltYWdlCQkJOiAzIHggMTYtYml0CisJCQkqZ3VpZF9mb3JtYXQgPSBHVUlEX1BLUGl4ZWxGb3JtYXQ0OGJwcFJHQjsKKwkJCWJyZWFrOworCQljYXNlIEZJVF9SR0JBMTY6CS8vIDY0LWJpdCBSR0JBIGltYWdlCQk6IDQgeCAxNi1iaXQKKwkJCSpndWlkX2Zvcm1hdCA9IEdVSURfUEtQaXhlbEZvcm1hdDY0YnBwUkdCQTsKKwkJCSpiSGFzQWxwaGEgPSBUUlVFOworCQkJYnJlYWs7CisJCWNhc2UgRklUX1JHQkY6CQkvLyA5Ni1iaXQgUkdCIGZsb2F0IGltYWdlCTogMyB4IDMyLWJpdCBJRUVFIGZsb2F0aW5nIHBvaW50CisJCQkqZ3VpZF9mb3JtYXQgPSBHVUlEX1BLUGl4ZWxGb3JtYXQ5NmJwcFJHQkZsb2F0OworCQkJYnJlYWs7CisJCWNhc2UgRklUX1JHQkFGOgkJLy8gMTI4LWJpdCBSR0JBIGZsb2F0IGltYWdlCTogNCB4IDMyLWJpdCBJRUVFIGZsb2F0aW5nIHBvaW50CisJCQkqZ3VpZF9mb3JtYXQgPSBHVUlEX1BLUGl4ZWxGb3JtYXQxMjhicHBSR0JBRmxvYXQ7CisJCQkqYkhhc0FscGhhID0gVFJVRTsKKwkJCWJyZWFrOworCisJCWNhc2UgRklUX0lOVDE2OgkJLy8gYXJyYXkgb2Ygc2hvcnQJCQk6IHNpZ25lZCAxNi1iaXQKKwkJY2FzZSBGSVRfVUlOVDMyOgkvLyBhcnJheSBvZiB1bnNpZ25lZCBsb25nCTogdW5zaWduZWQgMzItYml0CisJCWNhc2UgRklUX0lOVDMyOgkJLy8gYXJyYXkgb2YgbG9uZwkJCTogc2lnbmVkIDMyLWJpdAorCQljYXNlIEZJVF9ET1VCTEU6CS8vIGFycmF5IG9mIGRvdWJsZQkJCTogNjQtYml0IElFRUUgZmxvYXRpbmcgcG9pbnQKKwkJY2FzZSBGSVRfQ09NUExFWDoJLy8gYXJyYXkgb2YgRklDT01QTEVYCQk6IDIgeCA2NC1iaXQgSUVFRSBmbG9hdGluZyBwb2ludAorCisJCWRlZmF1bHQ6CisJCQkvLyB1bnN1cHBvcnRlZCBmb3JtYXQKKwkJCWJyZWFrOworCX0KKworCXJldHVybiAoKmd1aWRfZm9ybWF0ICE9IEdVSURfUEtQaXhlbEZvcm1hdERvbnRDYXJlKSA/IFdNUF9lcnJTdWNjZXNzIDogV01QX2VyclVuc3VwcG9ydGVkRm9ybWF0OworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBNZXRhZGF0YSBsb2FkaW5nCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8qKgorUmVhZCBhIEpQRUctWFIgSUZEIGFzIGEgYnVmZmVyCitAc2VlIFJlYWRNZXRhZGF0YQorKi8KK3N0YXRpYyBFUlIKK1JlYWRQcm9maWxlKFdNUFN0cmVhbSogcFN0cmVhbSwgdW5zaWduZWQgY2JCeXRlQ291bnQsIHVuc2lnbmVkIHVPZmZzZXQsIEJZVEUgKipwcGJQcm9maWxlKSB7CisJLy8gKHJlLSlhbGxvY2F0ZSBwcm9maWxlIGJ1ZmZlcgorCUJZVEUgKnBiUHJvZmlsZSA9ICpwcGJQcm9maWxlOworCXBiUHJvZmlsZSA9IChCWVRFKilyZWFsbG9jKHBiUHJvZmlsZSwgY2JCeXRlQ291bnQpOworCWlmKCFwYlByb2ZpbGUpIHsKKwkJcmV0dXJuIFdNUF9lcnJPdXRPZk1lbW9yeTsKKwl9CisJLy8gcmVhZCB0aGUgcHJvZmlsZQorCWlmKFdNUF9lcnJTdWNjZXNzID09IHBTdHJlYW0tPlNldFBvcyhwU3RyZWFtLCB1T2Zmc2V0KSkgeworCQlpZihXTVBfZXJyU3VjY2VzcyA9PSBwU3RyZWFtLT5SZWFkKHBTdHJlYW0sIHBiUHJvZmlsZSwgY2JCeXRlQ291bnQpKSB7CisJCQkqcHBiUHJvZmlsZSA9IHBiUHJvZmlsZTsKKwkJCXJldHVybiBXTVBfZXJyU3VjY2VzczsKKwkJfQorCX0KKwlyZXR1cm4gV01QX2VyckZpbGVJTzsKK30KKworLyoqCitDb252ZXJ0IGEgRFBLUFJPUFZBUklBTlQgdG8gYSBGSVRBRywgdGhlbiBzdG9yZSB0aGUgdGFnIGFzIEZJTURfRVhJRl9NQUlOCitAc2VlIFJlYWREZXNjcmlwdGl2ZU1ldGFkYXRhCisqLworc3RhdGljIEJPT0wKK1JlYWRQcm9wVmFyaWFudChXT1JEIHRhZ19pZCwgY29uc3QgRFBLUFJPUFZBUklBTlQgJiB2YXJTcmMsIEZJQklUTUFQICpkaWIpIHsKKwlEV09SRCBkd1NpemU7CisKKwlpZih2YXJTcmMudnQgPT0gRFBLVlRfRU1QVFkpIHsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCS8vIGdldCB0aGUgdGFnIGtleQorCVRhZ0xpYiYgcyA9IFRhZ0xpYjo6aW5zdGFuY2UoKTsKKwljb25zdCBjaGFyICprZXkgPSBzLmdldFRhZ0ZpZWxkTmFtZShUYWdMaWI6OkVYSUZfTUFJTiwgdGFnX2lkLCBOVUxMKTsKKwlpZigha2V5KSB7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwkvLyBjcmVhdGUgYSB0YWcKKwlGSVRBRyAqdGFnID0gRnJlZUltYWdlX0NyZWF0ZVRhZygpOworCWlmKHRhZykgeworCQkvLyBzZXQgdGFnIElECisJCUZyZWVJbWFnZV9TZXRUYWdJRCh0YWcsIHRhZ19pZCk7CisJCS8vIHNldCB0YWcgdHlwZSwgY291bnQsIGxlbmd0aCBhbmQgdmFsdWUKKwkJc3dpdGNoICh2YXJTcmMudnQpIHsKKwkJCWNhc2UgRFBLVlRfTFBTVFI6CisJCQkJRnJlZUltYWdlX1NldFRhZ1R5cGUodGFnLCBGSURUX0FTQ0lJKTsKKwkJCQlkd1NpemUgPSAoRFdPUkQpc3RybGVuKHZhclNyYy5WVC5wc3pWYWwpICsgMTsKKwkJCQlGcmVlSW1hZ2VfU2V0VGFnQ291bnQodGFnLCBkd1NpemUpOworCQkJCUZyZWVJbWFnZV9TZXRUYWdMZW5ndGgodGFnLCBkd1NpemUpOworCQkJCUZyZWVJbWFnZV9TZXRUYWdWYWx1ZSh0YWcsIHZhclNyYy5WVC5wc3pWYWwpOworCQkJCWJyZWFrOworCQkJCisJCQljYXNlIERQS1ZUX0xQV1NUUjoKKwkJCQlGcmVlSW1hZ2VfU2V0VGFnVHlwZSh0YWcsIEZJRFRfVU5ERUZJTkVEKTsKKwkJCQlkd1NpemUgPSAoRFdPUkQpKHNpemVvZihVMTYpICogKHdjc2xlbigod2NoYXJfdCAqKSB2YXJTcmMuVlQucHdzelZhbCkgKyAxKSk7IC8vICsxIGZvciBOVUxMIHRlcm0KKwkJCQlGcmVlSW1hZ2VfU2V0VGFnQ291bnQodGFnLCBkd1NpemUpOworCQkJCUZyZWVJbWFnZV9TZXRUYWdMZW5ndGgodGFnLCBkd1NpemUpOworCQkJCUZyZWVJbWFnZV9TZXRUYWdWYWx1ZSh0YWcsIHZhclNyYy5WVC5wd3N6VmFsKTsKKwkJCQlicmVhazsKKwkgICAgICAgICAgICAKKwkJCWNhc2UgRFBLVlRfVUkyOgorCQkJCUZyZWVJbWFnZV9TZXRUYWdUeXBlKHRhZywgRklEVF9TSE9SVCk7CisJCQkJRnJlZUltYWdlX1NldFRhZ0NvdW50KHRhZywgMSk7CisJCQkJRnJlZUltYWdlX1NldFRhZ0xlbmd0aCh0YWcsIDIpOworCQkJCUZyZWVJbWFnZV9TZXRUYWdWYWx1ZSh0YWcsICZ2YXJTcmMuVlQudWlWYWwpOworCQkJCWJyZWFrOworCisJCQljYXNlIERQS1ZUX1VJNDoKKwkJCQlGcmVlSW1hZ2VfU2V0VGFnVHlwZSh0YWcsIEZJRFRfTE9ORyk7CisJCQkJRnJlZUltYWdlX1NldFRhZ0NvdW50KHRhZywgMSk7CisJCQkJRnJlZUltYWdlX1NldFRhZ0xlbmd0aCh0YWcsIDQpOworCQkJCUZyZWVJbWFnZV9TZXRUYWdWYWx1ZSh0YWcsICZ2YXJTcmMuVlQudWxWYWwpOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWFzc2VydChGQUxTRSk7IC8vIFRoaXMgY2FzZSBpcyBub3QgaGFuZGxlZAorCQkJCWJyZWFrOworCQl9CisJCS8vIGdldCB0aGUgdGFnIGRlc2N0aXB0aW9uCisJCWNvbnN0IGNoYXIgKmRlc2NyaXB0aW9uID0gcy5nZXRUYWdEZXNjcmlwdGlvbihUYWdMaWI6OkVYSUZfTUFJTiwgdGFnX2lkKTsKKwkJRnJlZUltYWdlX1NldFRhZ0Rlc2NyaXB0aW9uKHRhZywgZGVzY3JpcHRpb24pOworCisJCS8vIHN0b3JlIHRoZSB0YWcKKwkJRnJlZUltYWdlX1NldE1ldGFkYXRhKEZJTURfRVhJRl9NQUlOLCBkaWIsIGtleSwgdGFnKTsKKworCQlGcmVlSW1hZ2VfRGVsZXRlVGFnKHRhZyk7CisJfQorCXJldHVybiBUUlVFOworfQorCisvKioKK1JlYWQgSlBFRy1YUiBkZXNjcmlwdGl2ZSBtZXRhZGF0YSBhbmQgc3RvcmUgYXMgRVhJRl9NQUlOIG1ldGFkYXRhCitAc2VlIFJlYWRQcm9wVmFyaWFudAorKi8KK3N0YXRpYyBFUlIKK1JlYWREZXNjcmlwdGl2ZU1ldGFkYXRhKFBLSW1hZ2VEZWNvZGUgKnBJRCwgRklCSVRNQVAgKmRpYikgeworCS8vIGdldCBFeGlmIFRJRkYgbWV0YWRhdGEKKwljb25zdCBERVNDUklQVElWRU1FVEFEQVRBICpwRGVzY01ldGFkYXRhID0gJnBJRC0+V01QLnNEZXNjTWV0YWRhdGE7CisJLy8gY29udmVydCBtZXRhZGF0YSB0byBGSVRBRyBhbmQgc3RvcmUgaW50byB0aGUgRVhJRl9NQUlOIG1ldGFkYXRhIG1vZGVsCisJUmVhZFByb3BWYXJpYW50KFdNUF90YWdJbWFnZURlc2NyaXB0aW9uLCBwRGVzY01ldGFkYXRhLT5wdmFySW1hZ2VEZXNjcmlwdGlvbiwgZGliKTsKKwlSZWFkUHJvcFZhcmlhbnQoV01QX3RhZ0NhbWVyYU1ha2UsIHBEZXNjTWV0YWRhdGEtPnB2YXJDYW1lcmFNYWtlLCBkaWIpOworCVJlYWRQcm9wVmFyaWFudChXTVBfdGFnQ2FtZXJhTW9kZWwsIHBEZXNjTWV0YWRhdGEtPnB2YXJDYW1lcmFNb2RlbCwgZGliKTsKKwlSZWFkUHJvcFZhcmlhbnQoV01QX3RhZ1NvZnR3YXJlLCBwRGVzY01ldGFkYXRhLT5wdmFyU29mdHdhcmUsIGRpYik7CisJUmVhZFByb3BWYXJpYW50KFdNUF90YWdEYXRlVGltZSwgcERlc2NNZXRhZGF0YS0+cHZhckRhdGVUaW1lLCBkaWIpOworCVJlYWRQcm9wVmFyaWFudChXTVBfdGFnQXJ0aXN0LCBwRGVzY01ldGFkYXRhLT5wdmFyQXJ0aXN0LCBkaWIpOworCVJlYWRQcm9wVmFyaWFudChXTVBfdGFnQ29weXJpZ2h0LCBwRGVzY01ldGFkYXRhLT5wdmFyQ29weXJpZ2h0LCBkaWIpOworCVJlYWRQcm9wVmFyaWFudChXTVBfdGFnUmF0aW5nU3RhcnMsIHBEZXNjTWV0YWRhdGEtPnB2YXJSYXRpbmdTdGFycywgZGliKTsKKwlSZWFkUHJvcFZhcmlhbnQoV01QX3RhZ1JhdGluZ1ZhbHVlLCBwRGVzY01ldGFkYXRhLT5wdmFyUmF0aW5nVmFsdWUsIGRpYik7CisJUmVhZFByb3BWYXJpYW50KFdNUF90YWdDYXB0aW9uLCBwRGVzY01ldGFkYXRhLT5wdmFyQ2FwdGlvbiwgZGliKTsKKwlSZWFkUHJvcFZhcmlhbnQoV01QX3RhZ0RvY3VtZW50TmFtZSwgcERlc2NNZXRhZGF0YS0+cHZhckRvY3VtZW50TmFtZSwgZGliKTsKKwlSZWFkUHJvcFZhcmlhbnQoV01QX3RhZ1BhZ2VOYW1lLCBwRGVzY01ldGFkYXRhLT5wdmFyUGFnZU5hbWUsIGRpYik7CisJUmVhZFByb3BWYXJpYW50KFdNUF90YWdQYWdlTnVtYmVyLCBwRGVzY01ldGFkYXRhLT5wdmFyUGFnZU51bWJlciwgZGliKTsKKwlSZWFkUHJvcFZhcmlhbnQoV01QX3RhZ0hvc3RDb21wdXRlciwgcERlc2NNZXRhZGF0YS0+cHZhckhvc3RDb21wdXRlciwgZGliKTsKKwlyZXR1cm4gV01QX2VyclN1Y2Nlc3M7Cit9CisKKy8qKgorUmVhZCBJQ0MsIFhNUCwgRXhpZiwgRXhpZi1HUFMsIElQVEMsIGRlc2NyaXB0aXZlIChpLmUuIEV4aWYtVElGRikgbWV0YWRhdGEKK0BzZWUgUmVhZFByb2ZpbGUsIFJlYWREZXNjcmlwdGl2ZU1ldGFkYXRhCisqLworc3RhdGljIEVSUgorUmVhZE1ldGFkYXRhKFBLSW1hZ2VEZWNvZGUgKnBJRCwgRklCSVRNQVAgKmRpYikgeworCUVSUiBlcnJvcl9jb2RlID0gMDsJCS8vIGVycm9yIGNvZGUgYXMgcmV0dXJuZWQgYnkgdGhlIGludGVyZmFjZQorCXNpemVfdCBjdXJyZW50UG9zID0gMDsJLy8gY3VycmVudCBzdHJlYW0gcG9zaXRpb24KKwkKKwlXTVBTdHJlYW0gKnBTdHJlYW0gPSBwSUQtPnBTdHJlYW07CisJV21wREVNaXNjICp3bWlERU1pc2MgPSAmcElELT5XTVAud21pREVNaXNjOworCUJZVEUgKnBiUHJvZmlsZSA9IE5VTEw7CisKKwl0cnkgeworCQkvLyBzYXZlIGN1cnJlbnQgcG9zaXRpb24KKwkJZXJyb3JfY29kZSA9IHBTdHJlYW0tPkdldFBvcyhwU3RyZWFtLCAmY3VycmVudFBvcyk7CisJCUpYUl9DSEVDSyhlcnJvcl9jb2RlKTsKKworCQkvLyBJQ0MgcHJvZmlsZQorCQlpZigwICE9IHdtaURFTWlzYy0+dUNvbG9yUHJvZmlsZUJ5dGVDb3VudCkgeworCQkJdW5zaWduZWQgY2JCeXRlQ291bnQgPSB3bWlERU1pc2MtPnVDb2xvclByb2ZpbGVCeXRlQ291bnQ7CisJCQl1bnNpZ25lZCB1T2Zmc2V0ID0gd21pREVNaXNjLT51Q29sb3JQcm9maWxlT2Zmc2V0OworCQkJZXJyb3JfY29kZSA9IFJlYWRQcm9maWxlKHBTdHJlYW0sIGNiQnl0ZUNvdW50LCB1T2Zmc2V0LCAmcGJQcm9maWxlKTsKKwkJCUpYUl9DSEVDSyhlcnJvcl9jb2RlKTsKKwkJCUZyZWVJbWFnZV9DcmVhdGVJQ0NQcm9maWxlKGRpYiwgcGJQcm9maWxlLCBjYkJ5dGVDb3VudCk7CisJCX0KKworCQkvLyBYTVAgbWV0YWRhdGEKKwkJaWYoMCAhPSB3bWlERU1pc2MtPnVYTVBNZXRhZGF0YUJ5dGVDb3VudCkgeworCQkJdW5zaWduZWQgY2JCeXRlQ291bnQgPSB3bWlERU1pc2MtPnVYTVBNZXRhZGF0YUJ5dGVDb3VudDsKKwkJCXVuc2lnbmVkIHVPZmZzZXQgPSB3bWlERU1pc2MtPnVYTVBNZXRhZGF0YU9mZnNldDsKKwkJCWVycm9yX2NvZGUgPSBSZWFkUHJvZmlsZShwU3RyZWFtLCBjYkJ5dGVDb3VudCwgdU9mZnNldCwgJnBiUHJvZmlsZSk7CisJCQlKWFJfQ0hFQ0soZXJyb3JfY29kZSk7CisJCQkvLyBzdG9yZSB0aGUgdGFnIGFzIFhNUAorCQkJRklUQUcgKnRhZyA9IEZyZWVJbWFnZV9DcmVhdGVUYWcoKTsKKwkJCWlmKHRhZykgeworCQkJCUZyZWVJbWFnZV9TZXRUYWdMZW5ndGgodGFnLCBjYkJ5dGVDb3VudCk7CisJCQkJRnJlZUltYWdlX1NldFRhZ0NvdW50KHRhZywgY2JCeXRlQ291bnQpOworCQkJCUZyZWVJbWFnZV9TZXRUYWdUeXBlKHRhZywgRklEVF9BU0NJSSk7CisJCQkJRnJlZUltYWdlX1NldFRhZ1ZhbHVlKHRhZywgcGJQcm9maWxlKTsKKwkJCQlGcmVlSW1hZ2VfU2V0VGFnS2V5KHRhZywgZ19UYWdMaWJfWE1QRmllbGROYW1lKTsKKwkJCQlGcmVlSW1hZ2VfU2V0TWV0YWRhdGEoRklNRF9YTVAsIGRpYiwgRnJlZUltYWdlX0dldFRhZ0tleSh0YWcpLCB0YWcpOworCQkJCUZyZWVJbWFnZV9EZWxldGVUYWcodGFnKTsKKwkJCX0KKwkJfQorCisJCS8vIElQVEMgbWV0YWRhdGEKKwkJaWYoMCAhPSB3bWlERU1pc2MtPnVJUFRDTkFBTWV0YWRhdGFCeXRlQ291bnQpIHsKKwkJCXVuc2lnbmVkIGNiQnl0ZUNvdW50ID0gd21pREVNaXNjLT51SVBUQ05BQU1ldGFkYXRhQnl0ZUNvdW50OworCQkJdW5zaWduZWQgdU9mZnNldCA9IHdtaURFTWlzYy0+dUlQVENOQUFNZXRhZGF0YU9mZnNldDsKKwkJCWVycm9yX2NvZGUgPSBSZWFkUHJvZmlsZShwU3RyZWFtLCBjYkJ5dGVDb3VudCwgdU9mZnNldCwgJnBiUHJvZmlsZSk7CisJCQlKWFJfQ0hFQ0soZXJyb3JfY29kZSk7CisJCQkvLyBkZWNvZGUgdGhlIElQVEMgcHJvZmlsZQorCQkJcmVhZF9pcHRjX3Byb2ZpbGUoZGliLCBwYlByb2ZpbGUsIGNiQnl0ZUNvdW50KTsKKwkJfQorCisJCS8vIEV4aWYgbWV0YWRhdGEKKwkJaWYoMCAhPSB3bWlERU1pc2MtPnVFWElGTWV0YWRhdGFCeXRlQ291bnQpIHsKKwkJCXVuc2lnbmVkIGNiQnl0ZUNvdW50ID0gd21pREVNaXNjLT51RVhJRk1ldGFkYXRhQnl0ZUNvdW50OworCQkJdW5zaWduZWQgdU9mZnNldCA9IHdtaURFTWlzYy0+dUVYSUZNZXRhZGF0YU9mZnNldDsKKwkJCWVycm9yX2NvZGUgPSBSZWFkUHJvZmlsZShwU3RyZWFtLCBjYkJ5dGVDb3VudCwgdU9mZnNldCwgJnBiUHJvZmlsZSk7CisJCQlKWFJfQ0hFQ0soZXJyb3JfY29kZSk7CisJCQkvLyBkZWNvZGUgdGhlIEV4aWYgcHJvZmlsZQorCQkJanBlZ3hyX3JlYWRfZXhpZl9wcm9maWxlKGRpYiwgcGJQcm9maWxlLCBjYkJ5dGVDb3VudCwgdU9mZnNldCk7CisJCX0KKworCQkvLyBFeGlmLUdQUyBtZXRhZGF0YQorCQlpZigwICE9IHdtaURFTWlzYy0+dUdQU0luZm9NZXRhZGF0YUJ5dGVDb3VudCkgeworCQkJdW5zaWduZWQgY2JCeXRlQ291bnQgPSB3bWlERU1pc2MtPnVHUFNJbmZvTWV0YWRhdGFCeXRlQ291bnQ7CisJCQl1bnNpZ25lZCB1T2Zmc2V0ID0gd21pREVNaXNjLT51R1BTSW5mb01ldGFkYXRhT2Zmc2V0OworCQkJZXJyb3JfY29kZSA9IFJlYWRQcm9maWxlKHBTdHJlYW0sIGNiQnl0ZUNvdW50LCB1T2Zmc2V0LCAmcGJQcm9maWxlKTsKKwkJCUpYUl9DSEVDSyhlcnJvcl9jb2RlKTsKKwkJCS8vIGRlY29kZSB0aGUgRXhpZi1HUFMgcHJvZmlsZQorCQkJanBlZ3hyX3JlYWRfZXhpZl9ncHNfcHJvZmlsZShkaWIsIHBiUHJvZmlsZSwgY2JCeXRlQ291bnQsIHVPZmZzZXQpOworCQl9CisKKwkJLy8gZnJlZSBwcm9maWxlIGJ1ZmZlcgorCQlmcmVlKHBiUHJvZmlsZSk7CisJCS8vIHJlc3RvcmUgaW5pdGlhbCBwb3NpdGlvbgorCQllcnJvcl9jb2RlID0gcElELT5wU3RyZWFtLT5TZXRQb3MocElELT5wU3RyZWFtLCBjdXJyZW50UG9zKTsKKwkJSlhSX0NIRUNLKGVycm9yX2NvZGUpOworCisJCS8vIGFzIGEgTEFTVCBTVEVQLCByZWFkIGRlc2NyaXB0aXZlIG1ldGFkYXRhCisJCS8vIHRoZXNlIG1ldGFkYXRhIG92ZXJ3cml0ZSBwb3NzaWJsZSBpZGVudGljYWwgRXhpZi1USUZGIG1ldGFkYXRhIAorCQkvLyB0aGF0IGNvdWxkIGhhdmUgYmVlbiByZWFkIGluc2lkZSB0aGUgRXhpZiBJRkQKKwkJCisJCXJldHVybiBSZWFkRGVzY3JpcHRpdmVNZXRhZGF0YShwSUQsIGRpYik7CisKKwl9IGNhdGNoKC4uLikgeworCQkvLyBmcmVlIHByb2ZpbGUgYnVmZmVyCisJCWZyZWUocGJQcm9maWxlKTsKKwkJaWYoY3VycmVudFBvcykgeworCQkJLy8gcmVzdG9yZSBpbml0aWFsIHBvc2l0aW9uCisJCQlwU3RyZWFtLT5TZXRQb3MocFN0cmVhbSwgY3VycmVudFBvcyk7CisJCX0KKwkJcmV0dXJuIGVycm9yX2NvZGU7CisJfQorfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBNZXRhZGF0YSBzYXZpbmcKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLyoqCitDb252ZXJ0IGEgRklUQUcgKGNvbWluZyBmcm9tIEZJTURfRVhJRl9NQUlOKSB0byBhIERQS1BST1BWQVJJQU5ULgorTm8gYWxsb2NhdGlvbiBpcyBuZWVkZWQgaGVyZSwgdGhlIGZ1bmN0aW9uIGp1c3QgY29weSBwb2ludGVycyB3aGVuIG5lZWRlZC4gCitAc2VlIFdyaXRlRGVzY3JpcHRpdmVNZXRhZGF0YQorKi8KK3N0YXRpYyBCT09MCitXcml0ZVByb3BWYXJpYW50KEZJQklUTUFQICpkaWIsIFdPUkQgdGFnX2lkLCBEUEtQUk9QVkFSSUFOVCAmIHZhckRzdCkgeworCUZJVEFHICp0YWcgPSBOVUxMOworCisJVGFnTGliJiBzID0gVGFnTGliOjppbnN0YW5jZSgpOworCQorCS8vIGNsZWFyIG91dHB1dCBEUEtQUk9QVkFSSUFOVAorCXZhckRzdC52dCA9IERQS1ZUX0VNUFRZOworCisJLy8gZ2l2ZW4gdGhlIHRhZyBpZCwgZ2V0IHRoZSB0YWcga2V5CisJY29uc3QgY2hhciAqa2V5ID0gcy5nZXRUYWdGaWVsZE5hbWUoVGFnTGliOjpFWElGX01BSU4sIHRhZ19pZCwgTlVMTCk7CisJLy8gdGhlbiwgZ2V0IHRoZSB0YWcgaW5mbworCWlmKCFGcmVlSW1hZ2VfR2V0TWV0YWRhdGEoRklNRF9FWElGX01BSU4sIGRpYiwga2V5LCAmdGFnKSkgeworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJLy8gc2V0IHRoZSB0YWcgdmFsdWUKKwlzd2l0Y2goRnJlZUltYWdlX0dldFRhZ1R5cGUodGFnKSkgeworCQljYXNlIEZJRFRfQVNDSUk6CisJCQl2YXJEc3QudnQgPSBEUEtWVF9MUFNUUjsKKwkJCXZhckRzdC5WVC5wc3pWYWwgPSAoY2hhciopRnJlZUltYWdlX0dldFRhZ1ZhbHVlKHRhZyk7CisJCQlicmVhazsKKwkJY2FzZSBGSURUX0JZVEU6CisJCWNhc2UgRklEVF9VTkRFRklORUQ6CisJCQl2YXJEc3QudnQgPSBEUEtWVF9MUFdTVFI7CisJCQl2YXJEc3QuVlQucHdzelZhbCA9IChVMTYqKUZyZWVJbWFnZV9HZXRUYWdWYWx1ZSh0YWcpOworCQkJYnJlYWs7CisJCWNhc2UgRklEVF9TSE9SVDoKKwkJCXZhckRzdC52dCA9IERQS1ZUX1VJMjsKKwkJCXZhckRzdC5WVC51aVZhbCA9ICooKFUxNiopRnJlZUltYWdlX0dldFRhZ1ZhbHVlKHRhZykpOworCQkJYnJlYWs7CisJCWNhc2UgRklEVF9MT05HOgorCQkJdmFyRHN0LnZ0ID0gRFBLVlRfVUk0OworCQkJdmFyRHN0LlZULnVsVmFsID0gKigoVTMyKilGcmVlSW1hZ2VfR2V0VGFnVmFsdWUodGFnKSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KKwkKKwlyZXR1cm4gVFJVRTsKK30KKworLyoqCitXcml0ZSBFWElGX01BSU4gbWV0YWRhdGEgdG8gSlBFRy1YUiBkZXNjcmlwdGl2ZSBtZXRhZGF0YQorQHNlZSBXcml0ZVByb3BWYXJpYW50CisqLworc3RhdGljIEVSUgorV3JpdGVEZXNjcmlwdGl2ZU1ldGFkYXRhKFBLSW1hZ2VFbmNvZGUgKnBJRSwgRklCSVRNQVAgKmRpYikgeworCUVSUiBlcnJvcl9jb2RlID0gMDsJCS8vIGVycm9yIGNvZGUgYXMgcmV0dXJuZWQgYnkgdGhlIGludGVyZmFjZQorCURFU0NSSVBUSVZFTUVUQURBVEEgRGVzY01ldGFkYXRhOworCisJLy8gZmlsbCB0aGUgREVTQ1JJUFRJVkVNRVRBREFUQSBzdHJ1Y3R1cmUgKHVzZSBwb2ludGVycyB0byBhcnJheXMgd2hlbiBuZWVkZWQpCisJV3JpdGVQcm9wVmFyaWFudChkaWIsIFdNUF90YWdJbWFnZURlc2NyaXB0aW9uLCBEZXNjTWV0YWRhdGEucHZhckltYWdlRGVzY3JpcHRpb24pOworCVdyaXRlUHJvcFZhcmlhbnQoZGliLCBXTVBfdGFnQ2FtZXJhTWFrZSwgRGVzY01ldGFkYXRhLnB2YXJDYW1lcmFNYWtlKTsKKwlXcml0ZVByb3BWYXJpYW50KGRpYiwgV01QX3RhZ0NhbWVyYU1vZGVsLCBEZXNjTWV0YWRhdGEucHZhckNhbWVyYU1vZGVsKTsKKwlXcml0ZVByb3BWYXJpYW50KGRpYiwgV01QX3RhZ1NvZnR3YXJlLCBEZXNjTWV0YWRhdGEucHZhclNvZnR3YXJlKTsKKwlXcml0ZVByb3BWYXJpYW50KGRpYiwgV01QX3RhZ0RhdGVUaW1lLCBEZXNjTWV0YWRhdGEucHZhckRhdGVUaW1lKTsKKwlXcml0ZVByb3BWYXJpYW50KGRpYiwgV01QX3RhZ0FydGlzdCwgRGVzY01ldGFkYXRhLnB2YXJBcnRpc3QpOworCVdyaXRlUHJvcFZhcmlhbnQoZGliLCBXTVBfdGFnQ29weXJpZ2h0LCBEZXNjTWV0YWRhdGEucHZhckNvcHlyaWdodCk7CisJV3JpdGVQcm9wVmFyaWFudChkaWIsIFdNUF90YWdSYXRpbmdTdGFycywgRGVzY01ldGFkYXRhLnB2YXJSYXRpbmdTdGFycyk7CisJV3JpdGVQcm9wVmFyaWFudChkaWIsIFdNUF90YWdSYXRpbmdWYWx1ZSwgRGVzY01ldGFkYXRhLnB2YXJSYXRpbmdWYWx1ZSk7CisJV3JpdGVQcm9wVmFyaWFudChkaWIsIFdNUF90YWdDYXB0aW9uLCBEZXNjTWV0YWRhdGEucHZhckNhcHRpb24pOworCVdyaXRlUHJvcFZhcmlhbnQoZGliLCBXTVBfdGFnRG9jdW1lbnROYW1lLCBEZXNjTWV0YWRhdGEucHZhckRvY3VtZW50TmFtZSk7CisJV3JpdGVQcm9wVmFyaWFudChkaWIsIFdNUF90YWdQYWdlTmFtZSwgRGVzY01ldGFkYXRhLnB2YXJQYWdlTmFtZSk7CisJV3JpdGVQcm9wVmFyaWFudChkaWIsIFdNUF90YWdQYWdlTnVtYmVyLCBEZXNjTWV0YWRhdGEucHZhclBhZ2VOdW1iZXIpOworCVdyaXRlUHJvcFZhcmlhbnQoZGliLCBXTVBfdGFnSG9zdENvbXB1dGVyLCBEZXNjTWV0YWRhdGEucHZhckhvc3RDb21wdXRlcik7CisKKwkvLyBjb3B5IHRoZSBzdHJ1Y3R1cmUgdG8gdGhlIGVuY29kZXIKKwllcnJvcl9jb2RlID0gcElFLT5TZXREZXNjcmlwdGl2ZU1ldGFkYXRhKHBJRSwgJkRlc2NNZXRhZGF0YSk7CisKKwkvLyBubyBuZWVkIHRvIGZyZWUgYW55dGhpbmcgaGVyZQorCXJldHVybiBlcnJvcl9jb2RlOworfQorCisvKioKK1dyaXRlIElDQywgWE1QLCBFeGlmLCBFeGlmLUdQUywgSVBUQywgZGVzY3JpcHRpdmUgKGkuZS4gRXhpZi1USUZGKSBtZXRhZGF0YQorKi8KK3N0YXRpYyBFUlIKK1dyaXRlTWV0YWRhdGEoUEtJbWFnZUVuY29kZSAqcElFLCBGSUJJVE1BUCAqZGliKSB7CisJRVJSIGVycm9yX2NvZGUgPSAwOwkJLy8gZXJyb3IgY29kZSBhcyByZXR1cm5lZCBieSB0aGUgaW50ZXJmYWNlCisJQllURSAqcHJvZmlsZSA9IE5VTEw7CisJdW5zaWduZWQgcHJvZmlsZV9zaXplID0gMDsKKwkKKwl0cnkgeworCQkvLyB3cml0ZSBJQ0MgcHJvZmlsZQorCQl7CisJCQlGSUlDQ1BST0ZJTEUgKmljY1Byb2ZpbGUgPSBGcmVlSW1hZ2VfR2V0SUNDUHJvZmlsZShkaWIpOworCQkJaWYoaWNjUHJvZmlsZS0+ZGF0YSkgeworCQkJCWVycm9yX2NvZGUgPSBwSUUtPlNldENvbG9yQ29udGV4dChwSUUsIChVOCopaWNjUHJvZmlsZS0+ZGF0YSwgaWNjUHJvZmlsZS0+c2l6ZSk7CisJCQkJSlhSX0NIRUNLKGVycm9yX2NvZGUpOworCQkJfQorCQl9CisJCQorCQkvLyB3cml0ZSBkZXNjcmlwdGl2ZSBtZXRhZGF0YQorCQlpZihGcmVlSW1hZ2VfR2V0TWV0YWRhdGFDb3VudChGSU1EX0VYSUZfTUFJTiwgZGliKSkgeworCQkJZXJyb3JfY29kZSA9IFdyaXRlRGVzY3JpcHRpdmVNZXRhZGF0YShwSUUsIGRpYik7CisJCQlKWFJfQ0hFQ0soZXJyb3JfY29kZSk7CisJCX0KKworCQkvLyB3cml0ZSBJUFRDIG1ldGFkYXRhCisJCWlmKEZyZWVJbWFnZV9HZXRNZXRhZGF0YUNvdW50KEZJTURfSVBUQywgZGliKSkgeworCQkJLy8gY3JlYXRlIGEgYmluYXJ5IHByb2ZpbGUKKwkJCWlmKHdyaXRlX2lwdGNfcHJvZmlsZShkaWIsICZwcm9maWxlLCAmcHJvZmlsZV9zaXplKSkgeworCQkJCS8vIHdyaXRlIHRoZSBwcm9maWxlCisJCQkJZXJyb3JfY29kZSA9IFBLSW1hZ2VFbmNvZGVfU2V0SVBUQ05BQU1ldGFkYXRhX1dNUChwSUUsIHByb2ZpbGUsIHByb2ZpbGVfc2l6ZSk7CisJCQkJSlhSX0NIRUNLKGVycm9yX2NvZGUpOworCQkJCS8vIHJlbGVhc2UgcHJvZmlsZQorCQkJCWZyZWUocHJvZmlsZSk7CisJCQkJcHJvZmlsZSA9IE5VTEw7CisJCQl9CisJCX0KKworCQkvLyB3cml0ZSBYTVAgbWV0YWRhdGEKKwkJeworCQkJRklUQUcgKnRhZ194bXAgPSBOVUxMOworCQkJaWYoRnJlZUltYWdlX0dldE1ldGFkYXRhKEZJTURfWE1QLCBkaWIsIGdfVGFnTGliX1hNUEZpZWxkTmFtZSwgJnRhZ194bXApKSB7CisJCQkJZXJyb3JfY29kZSA9IFBLSW1hZ2VFbmNvZGVfU2V0WE1QTWV0YWRhdGFfV01QKHBJRSwgKEJZVEUqKUZyZWVJbWFnZV9HZXRUYWdWYWx1ZSh0YWdfeG1wKSwgRnJlZUltYWdlX0dldFRhZ0xlbmd0aCh0YWdfeG1wKSk7CisJCQkJSlhSX0NIRUNLKGVycm9yX2NvZGUpOworCQkJfQorCQl9CisKKwkJLy8gd3JpdGUgRXhpZiBtZXRhZGF0YQorCQl7CisJCQlpZih0aWZmX2dldF9pZmRfcHJvZmlsZShkaWIsIEZJTURfRVhJRl9FWElGLCAmcHJvZmlsZSwgJnByb2ZpbGVfc2l6ZSkpIHsKKwkJCQllcnJvcl9jb2RlID0gUEtJbWFnZUVuY29kZV9TZXRFWElGTWV0YWRhdGFfV01QKHBJRSwgcHJvZmlsZSwgcHJvZmlsZV9zaXplKTsKKwkJCQlKWFJfQ0hFQ0soZXJyb3JfY29kZSk7CisJCQkJLy8gcmVsZWFzZSBwcm9maWxlCisJCQkJZnJlZShwcm9maWxlKTsKKwkJCQlwcm9maWxlID0gTlVMTDsKKwkJCX0KKwkJfQorCisJCS8vIHdyaXRlIEV4aWYgR1BTIG1ldGFkYXRhCisJCXsKKwkJCWlmKHRpZmZfZ2V0X2lmZF9wcm9maWxlKGRpYiwgRklNRF9FWElGX0dQUywgJnByb2ZpbGUsICZwcm9maWxlX3NpemUpKSB7CisJCQkJZXJyb3JfY29kZSA9IFBLSW1hZ2VFbmNvZGVfU2V0R1BTSW5mb01ldGFkYXRhX1dNUChwSUUsIHByb2ZpbGUsIHByb2ZpbGVfc2l6ZSk7CisJCQkJSlhSX0NIRUNLKGVycm9yX2NvZGUpOworCQkJCS8vIHJlbGVhc2UgcHJvZmlsZQorCQkJCWZyZWUocHJvZmlsZSk7CisJCQkJcHJvZmlsZSA9IE5VTEw7CisJCQl9CisJCX0KKworCQlyZXR1cm4gV01QX2VyclN1Y2Nlc3M7CisKKwl9IGNhdGNoKC4uLikgeworCQlmcmVlKHByb2ZpbGUpOworCQlyZXR1cm4gZXJyb3JfY29kZTsKKwl9Cit9CisKKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBRdWFudGl6YXRpb24gdGFibGVzIChZLCBVLCBWLCBZSFAsIFVIUCwgVkhQKSwgCisvLyBvcHRpbWl6ZWQgZm9yIFBTTlIKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3RhdGljIGNvbnN0IGludCBEUEtfUVBTXzQyMFsxMV1bNl0gPSB7ICAgICAgLy8gZm9yIDggYml0IG9ubHkKKyAgICB7IDY2LCA2NSwgNzAsIDcyLCA3MiwgNzcgfSwKKyAgICB7IDU5LCA1OCwgNjMsIDY0LCA2MywgNjggfSwKKyAgICB7IDUyLCA1MSwgNTcsIDU2LCA1NiwgNjEgfSwKKyAgICB7IDQ4LCA0OCwgNTQsIDUxLCA1MCwgNTUgfSwKKyAgICB7IDQzLCA0NCwgNDgsIDQ2LCA0NiwgNDkgfSwKKyAgICB7IDM3LCAzNywgNDIsIDM4LCAzOCwgNDMgfSwKKyAgICB7IDI2LCAyOCwgMzEsIDI3LCAyOCwgMzEgfSwKKyAgICB7IDE2LCAxNywgMjIsIDE2LCAxNywgMjEgfSwKKyAgICB7IDEwLCAxMSwgMTMsIDEwLCAxMCwgMTMgfSwKKyAgICB7ICA1LCAgNSwgIDYsICA1LCAgNSwgIDYgfSwKKyAgICB7ICAyLCAgMiwgIDMsICAyLCAgMiwgIDIgfQorfTsKKworc3RhdGljIGNvbnN0IGludCBEUEtfUVBTXzhbMTJdWzZdID0geworICAgIHsgNjcsIDc5LCA4NiwgNzIsIDkwLCA5OCB9LAorICAgIHsgNTksIDc0LCA4MCwgNjQsIDgzLCA4OSB9LAorICAgIHsgNTMsIDY4LCA3NSwgNTcsIDc2LCA4MyB9LAorICAgIHsgNDksIDY0LCA3MSwgNTMsIDcwLCA3NyB9LAorICAgIHsgNDUsIDYwLCA2NywgNDgsIDY3LCA3NCB9LAorICAgIHsgNDAsIDU2LCA2MiwgNDIsIDU5LCA2NiB9LAorICAgIHsgMzMsIDQ5LCA1NSwgMzUsIDUxLCA1OCB9LAorICAgIHsgMjcsIDQ0LCA0OSwgMjgsIDQ1LCA1MCB9LAorICAgIHsgMjAsIDM2LCA0MiwgMjAsIDM4LCA0NCB9LAorICAgIHsgMTMsIDI3LCAzNCwgMTMsIDI4LCAzNCB9LAorICAgIHsgIDcsIDE3LCAyMSwgIDgsIDE3LCAyMSB9LCAvLyBQaG90b3Nob3AgMTAwJQorICAgIHsgIDIsICA1LCAgNiwgIDIsICA1LCAgNiB9Cit9OworCitzdGF0aWMgY29uc3QgaW50IERQS19RUFNfMTZbMTFdWzZdID0geworICAgIHsgMTk3LCAyMDMsIDIxMCwgMjAyLCAyMDcsIDIxMyB9LAorICAgIHsgMTc0LCAxODgsIDE5MywgMTgwLCAxODksIDE5NiB9LAorICAgIHsgMTUyLCAxNjcsIDE3MywgMTU2LCAxNjksIDE3NCB9LAorICAgIHsgMTM1LCAxNTIsIDE1NywgMTM3LCAxNTMsIDE1OCB9LAorICAgIHsgMTE5LCAxMzcsIDE0MSwgMTE5LCAxMzgsIDE0MiB9LAorICAgIHsgMTAyLCAxMjAsIDEyNSwgMTAwLCAxMjAsIDEyNCB9LAorICAgIHsgIDgyLCAgOTgsIDEwNCwgIDc5LCAgOTgsIDEwMyB9LAorICAgIHsgIDYwLCAgNzYsICA4MSwgIDU4LCAgNzYsICA4MSB9LAorICAgIHsgIDM5LCAgNTIsICA1OCwgIDM2LCAgNTIsICA1OCB9LAorICAgIHsgIDE2LCAgMjcsICAzMywgIDE0LCAgMjcsICAzMyB9LAorICAgIHsgICA1LCAgIDgsICAgOSwgICA0LCAgIDcsICAgOCB9Cit9OworCitzdGF0aWMgY29uc3QgaW50IERQS19RUFNfMTZmWzExXVs2XSA9IHsKKyAgICB7IDE0OCwgMTc3LCAxNzEsIDE2NSwgMTg3LCAxOTEgfSwKKyAgICB7IDEzMywgMTU1LCAxNTMsIDE0NywgMTcyLCAxODEgfSwKKyAgICB7IDExNCwgMTMzLCAxMzgsIDEzMCwgMTU3LCAxNjcgfSwKKyAgICB7ICA5NywgMTE4LCAxMjAsIDEwOSwgMTM3LCAxNDQgfSwKKyAgICB7ICA3NiwgIDk4LCAxMDMsICA4NSwgMTE1LCAxMjEgfSwKKyAgICB7ICA2MywgIDg2LCAgOTEsICA2MiwgIDk2LCAgOTkgfSwKKyAgICB7ICA0NiwgIDY4LCAgNzEsICA0MywgIDczLCAgNzUgfSwKKyAgICB7ICAyOSwgIDQ4LCAgNTIsICAyNywgIDQ4LCAgNTEgfSwKKyAgICB7ICAxNiwgIDMwLCAgMzUsICAxNCwgIDI5LCAgMzQgfSwKKyAgICB7ICAgOCwgIDE0LCAgMTcsICAgNywgIDEzLCAgMTcgfSwKKyAgICB7ICAgMywgICA1LCAgIDcsICAgMywgICA1LCAgIDYgfQorfTsKKworc3RhdGljIGNvbnN0IGludCBEUEtfUVBTXzMyZlsxMV1bNl0gPSB7CisgICAgeyAxOTQsIDIwNiwgMjA5LCAyMDQsIDIxMSwgMjE3IH0sCisgICAgeyAxNzUsIDE4NywgMTk2LCAxODYsIDE5MywgMjA1IH0sCisgICAgeyAxNTcsIDE3MCwgMTc3LCAxNjcsIDE4MCwgMTkwIH0sCisgICAgeyAxMzMsIDE1MiwgMTU2LCAxNDQsIDE2MywgMTY4IH0sCisgICAgeyAxMTYsIDEzOCwgMTQyLCAxMTcsIDE0MywgMTQ4IH0sCisgICAgeyAgOTgsIDEyMCwgMTIzLCAgOTYsIDEyMywgMTI2IH0sCisgICAgeyAgODAsICA5OSwgMTAyLCAgNzgsICA5OSwgMTAyIH0sCisgICAgeyAgNjUsICA3OSwgIDg0LCAgNjMsICA3OSwgIDg0IH0sCisgICAgeyAgNDgsICA2MSwgIDY3LCAgNDUsICA2MCwgIDY2IH0sCisgICAgeyAgMjcsICA0MSwgIDQ2LCAgMjQsICA0MCwgIDQ1IH0sCisgICAgeyAgIDMsICAyMiwgIDI0LCAgIDIsICAyMSwgIDIyIH0KK307CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFBsdWdpbiBJbXBsZW1lbnRhdGlvbgorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgorRm9ybWF0KCkgeworCXJldHVybiAiSlBFRy1YUiI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCitEZXNjcmlwdGlvbigpIHsKKwlyZXR1cm4gIkpQRUcgWFIgaW1hZ2UgZm9ybWF0IjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKK0V4dGVuc2lvbigpIHsKKwlyZXR1cm4gImp4cix3ZHAsaGRwIjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKK1JlZ0V4cHIoKSB7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCitNaW1lVHlwZSgpIHsKKwlyZXR1cm4gImltYWdlL3ZuZC5tcy1waG90byI7Cit9CisKK3N0YXRpYyBCT09MIERMTF9DQUxMQ09OVgorVmFsaWRhdGUoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlKSB7CisJQllURSBqeHJfc2lnbmF0dXJlWzNdID0geyAweDQ5LCAweDQ5LCAweEJDIH07CisJQllURSBzaWduYXR1cmVbM10gPSB7IDAsIDAsIDAgfTsKKworCWlvLT5yZWFkX3Byb2MoJnNpZ25hdHVyZSwgMSwgMywgaGFuZGxlKTsKKworCXJldHVybiAobWVtY21wKGp4cl9zaWduYXR1cmUsIHNpZ25hdHVyZSwgMykgPT0gMCk7Cit9CisKK3N0YXRpYyBCT09MIERMTF9DQUxMQ09OVgorU3VwcG9ydHNFeHBvcnREZXB0aChpbnQgZGVwdGgpIHsKKwlyZXR1cm4gKAorCQkoZGVwdGggPT0gMSkgIHx8CisJCShkZXB0aCA9PSA4KSAgfHwKKwkJKGRlcHRoID09IDE2KSB8fAorCQkoZGVwdGggPT0gMjQpIHx8IAorCQkoZGVwdGggPT0gMzIpCisJCSk7Cit9CisKK3N0YXRpYyBCT09MIERMTF9DQUxMQ09OViAKK1N1cHBvcnRzRXhwb3J0VHlwZShGUkVFX0lNQUdFX1RZUEUgdHlwZSkgeworCXJldHVybiAoCisJCSh0eXBlID09IEZJVF9CSVRNQVApIHx8CisJCSh0eXBlID09IEZJVF9VSU5UMTYpIHx8CisJCSh0eXBlID09IEZJVF9SR0IxNikgIHx8CisJCSh0eXBlID09IEZJVF9SR0JBMTYpIHx8CisJCSh0eXBlID09IEZJVF9GTE9BVCkgIHx8CisJCSh0eXBlID09IEZJVF9SR0JGKSAgIHx8CisJCSh0eXBlID09IEZJVF9SR0JBRikKKwkpOworfQorCitzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYKK1N1cHBvcnRzSUNDUHJvZmlsZXMoKSB7CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBCT09MIERMTF9DQUxMQ09OVgorU3VwcG9ydHNOb1BpeGVscygpIHsKKwlyZXR1cm4gVFJVRTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8JT3BlbiAmIENsb3NlCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3N0YXRpYyB2b2lkICogRExMX0NBTExDT05WCitPcGVuKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSwgQk9PTCByZWFkKSB7CisJV01QU3RyZWFtICpwU3RyZWFtID0gTlVMTDsJLy8gc3RyZWFtIGludGVyZmFjZQorCWlmKGlvICYmIGhhbmRsZSkgeworCQkvLyBhbGxvY2F0ZSB0aGUgRnJlZUltYWdlSU8gc3RyZWFtIHdyYXBwZXIKKwkJRnJlZUltYWdlSlhSSU8gKmp4cl9pbyA9IChGcmVlSW1hZ2VKWFJJTyopbWFsbG9jKHNpemVvZihGcmVlSW1hZ2VKWFJJTykpOworCQlpZihqeHJfaW8pIHsKKwkJCWp4cl9pby0+aW8gPSBpbzsKKwkJCWp4cl9pby0+aGFuZGxlID0gaGFuZGxlOworCQkJLy8gY3JlYXRlIGEgSlhSIHN0cmVhbSB3cmFwcGVyCisJCQlpZihfanhyX2lvX0NyZWF0ZSgmcFN0cmVhbSwganhyX2lvKSAhPSBXTVBfZXJyU3VjY2VzcykgeworCQkJCWZyZWUoanhyX2lvKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gcFN0cmVhbTsKK30KKworc3RhdGljIHZvaWQgRExMX0NBTExDT05WCitDbG9zZShGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIHZvaWQgKmRhdGEpIHsKKwlXTVBTdHJlYW0gKnBTdHJlYW0gPSAoV01QU3RyZWFtKilkYXRhOworCWlmKHBTdHJlYW0pIHsKKwkJLy8gZnJlZSB0aGUgRnJlZUltYWdlSU8gc3RyZWFtIHdyYXBwZXIKKwkJRnJlZUltYWdlSlhSSU8gKmp4cl9pbyA9IChGcmVlSW1hZ2VKWFJJTyopcFN0cmVhbS0+c3RhdGUucHZPYmo7CisJCWZyZWUoanhyX2lvKTsKKwkJLy8gZnJlZSB0aGUgSlhSIHN0cmVhbSB3cmFwcGVyCisJCXBTdHJlYW0tPmZNZW0gPSBUUlVFOworCQlfanhyX2lvX0Nsb3NlKCZwU3RyZWFtKTsKKwl9Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCUxvYWQKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLyoqCitTZXQgZGVjb2RlciBwYXJhbWV0ZXJzCitAcGFyYW0gcERlY29kZXIgRGVjb2RlciBoYW5kbGUKK0BwYXJhbSBmbGFncyBGcmVlSW1hZ2UgbG9hZCBmbGFncworKi8KK3N0YXRpYyB2b2lkIAorU2V0RGVjb2RlclBhcmFtZXRlcnMoUEtJbWFnZURlY29kZSAqcERlY29kZXIsIGludCBmbGFncykgeworCS8vIGxvYWQgaW1hZ2UgJiBhbHBoYSBmb3IgZm9ybWF0cyB3aXRoIGFscGhhCisJcERlY29kZXItPldNUC53bWlTQ1AudUFscGhhTW9kZSA9IDI7CisJLy8gbW9yZSBvcHRpb25zIHRvIGNvbWUgLi4uCit9CisKKy8qKgorQ29weSBvciBjb252ZXJ0ICYgY29weSBkZWNvZGVkIHBpeGVscyBpbnRvIHRoZSBkaWIKK0BwYXJhbSBwRGVjb2RlciBEZWNvZGVyIGhhbmRsZQorQHBhcmFtIG91dF9ndWlkX2Zvcm1hdCBUYXJnZXQgZ3VpZCBmb3JtYXQKK0BwYXJhbSBkaWIgT3V0cHV0IGRpYgorQHBhcmFtIHdpZHRoIEltYWdlIHdpZHRoCitAcGFyYW0gaGVpZ2h0IEltYWdlIGhlaWdodAorQHJldHVybiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyBFUlIgb3RoZXJ3aXNlCisqLworc3RhdGljIEVSUgorQ29weVBpeGVscyhQS0ltYWdlRGVjb2RlICpwRGVjb2RlciwgUEtQaXhlbEZvcm1hdEdVSUQgb3V0X2d1aWRfZm9ybWF0LCBGSUJJVE1BUCAqZGliLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKwlQS0Zvcm1hdENvbnZlcnRlciAqcENvbnZlcnRlciA9IE5VTEw7CS8vIHBpeGVsIGZvcm1hdCBjb252ZXJ0ZXIKKwlFUlIgZXJyb3JfY29kZSA9IDA7CS8vIGVycm9yIGNvZGUgYXMgcmV0dXJuZWQgYnkgdGhlIGludGVyZmFjZQorCUJZVEUgKnBiID0gTlVMTDsJLy8gbG9jYWwgYnVmZmVyIHVzZWQgZm9yIHBpeGVsIGZvcm1hdCBjb252ZXJzaW9uCisJCisJLy8gaW1hZ2UgZGltZW5zaW9ucworCWNvbnN0IFBLUmVjdCByZWN0ID0gezAsIDAsIHdpZHRoLCBoZWlnaHR9OworCisJdHJ5IHsKKwkJLy8gZ2V0IGlucHV0IGZpbGUgcGl4ZWwgZm9ybWF0IC4uLgorCQlQS1BpeGVsRm9ybWF0R1VJRCBpbl9ndWlkX2Zvcm1hdDsKKwkJZXJyb3JfY29kZSA9IHBEZWNvZGVyLT5HZXRQaXhlbEZvcm1hdChwRGVjb2RlciwgJmluX2d1aWRfZm9ybWF0KTsKKwkJSlhSX0NIRUNLKGVycm9yX2NvZGUpOworCQkKKwkJLy8gaXMgYSBmb3JtYXQgY29udmVyc2lvbiBuZWVkZWQgPworCisJCWlmKElzRXF1YWxHVUlEKG91dF9ndWlkX2Zvcm1hdCwgaW5fZ3VpZF9mb3JtYXQpKSB7CisJCQkvLyBubyBjb252ZXJzaW9uLCBsb2FkIGJ5dGVzICJhcyBpcyIgLi4uCisKKwkJCS8vIGdldCBhIHBvaW50ZXIgdG8gZHN0IHBpeGVsIGRhdGEKKwkJCUJZVEUgKmRpYl9iaXRzID0gRnJlZUltYWdlX0dldEJpdHMoZGliKTsKKworCQkJLy8gZ2V0IGRzdCBwaXRjaCAoY291bnQgb2YgQllURSBmb3Igc3RyaWRlKQorCQkJY29uc3QgdW5zaWduZWQgY2JTdHJpZGUgPSBGcmVlSW1hZ2VfR2V0UGl0Y2goZGliKTsJCQkKKworCQkJLy8gZGVjb2RlIGFuZCBjb3B5IGJpdHMgdG8gZHN0IGFycmF5CisJCQllcnJvcl9jb2RlID0gcERlY29kZXItPkNvcHkocERlY29kZXIsICZyZWN0LCBkaWJfYml0cywgY2JTdHJpZGUpOworCQkJSlhSX0NIRUNLKGVycm9yX2NvZGUpOwkJCisJCX0KKwkJZWxzZSB7CisJCQkvLyB3ZSBuZWVkIHRvIHVzZSB0aGUgY29udmVyc2lvbiBBUEkgLi4uCisJCQkKKwkJCS8vIGFsbG9jYXRlIHRoZSBwaXhlbCBmb3JtYXQgY29udmVydGVyCisJCQllcnJvcl9jb2RlID0gUEtDb2RlY0ZhY3RvcnlfQ3JlYXRlRm9ybWF0Q29udmVydGVyKCZwQ29udmVydGVyKTsKKwkJCUpYUl9DSEVDSyhlcnJvcl9jb2RlKTsKKwkJCQorCQkJLy8gc2V0IHRoZSBjb252ZXJzaW9uIGZ1bmN0aW9uCisJCQllcnJvcl9jb2RlID0gcENvbnZlcnRlci0+SW5pdGlhbGl6ZShwQ29udmVydGVyLCBwRGVjb2RlciwgTlVMTCwgb3V0X2d1aWRfZm9ybWF0KTsKKwkJCUpYUl9DSEVDSyhlcnJvcl9jb2RlKTsKKwkJCQorCQkJLy8gZ2V0IHRoZSBtYXhpbXVtIHN0cmlkZQorCQkJdW5zaWduZWQgY2JTdHJpZGUgPSAwOworCQkJeworCQkJCVBLUGl4ZWxJbmZvIHBQSUZyb207CisJCQkJUEtQaXhlbEluZm8gcFBJVG87CisJCQkJCisJCQkJcFBJRnJvbS5wR1VJRFBpeEZtdCA9ICZpbl9ndWlkX2Zvcm1hdDsKKwkJCQllcnJvcl9jb2RlID0gUGl4ZWxGb3JtYXRMb29rdXAoJnBQSUZyb20sIExPT0tVUF9GT1JXQVJEKTsKKwkJCQlKWFJfQ0hFQ0soZXJyb3JfY29kZSk7CisKKwkJCQlwUElUby5wR1VJRFBpeEZtdCA9ICZvdXRfZ3VpZF9mb3JtYXQ7CisJCQkJZXJyb3JfY29kZSA9IFBpeGVsRm9ybWF0TG9va3VwKCZwUElUbywgTE9PS1VQX0ZPUldBUkQpOworCQkJCUpYUl9DSEVDSyhlcnJvcl9jb2RlKTsKKworCQkJCXVuc2lnbmVkIGNiU3RyaWRlRnJvbSA9ICgocFBJRnJvbS5jYml0VW5pdCArIDcpID4+IDMpICogd2lkdGg7CisJCQkJdW5zaWduZWQgY2JTdHJpZGVUbyA9ICgocFBJVG8uY2JpdFVuaXQgKyA3KSA+PiAzKSAqIHdpZHRoOworCQkJCWNiU3RyaWRlID0gTUFYKGNiU3RyaWRlRnJvbSwgY2JTdHJpZGVUbyk7CisJCQl9CisKKwkJCS8vIGFsbG9jYXRlIGEgbG9jYWwgZGVjb2RlciAvIGVuY29kZXIgYnVmZmVyCisJCQllcnJvcl9jb2RlID0gUEtBbGxvY0FsaWduZWQoKHZvaWQgKiopICZwYiwgY2JTdHJpZGUgKiBoZWlnaHQsIDEyOCk7CisJCQlKWFJfQ0hFQ0soZXJyb3JfY29kZSk7CisKKwkJCS8vIGNvcHkgLyBjb252ZXJ0IHBpeGVscworCQkJZXJyb3JfY29kZSA9IHBDb252ZXJ0ZXItPkNvcHkocENvbnZlcnRlciwgJnJlY3QsIHBiLCBjYlN0cmlkZSk7CisJCQlKWFJfQ0hFQ0soZXJyb3JfY29kZSk7CisKKwkJCS8vIG5vdyBjb3B5IHBpeGVscyBpbnRvIHRoZSBkaWIKKwkJCWNvbnN0IHNpemVfdCBsaW5lX3NpemUgPSBGcmVlSW1hZ2VfR2V0TGluZShkaWIpOworCQkJZm9yKGludCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisJCQkJQllURSAqc3JjX2JpdHMgPSAoQllURSopKHBiICsgeSAqIGNiU3RyaWRlKTsKKwkJCQlCWVRFICpkc3RfYml0cyA9IChCWVRFKilGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCB5KTsKKwkJCQltZW1jcHkoZHN0X2JpdHMsIHNyY19iaXRzLCBsaW5lX3NpemUpOworCQkJfQorCQkJCisJCQkvLyBmcmVlIHRoZSBsb2NhbCBidWZmZXIKKwkJCVBLRnJlZUFsaWduZWQoKHZvaWQgKiopICZwYik7CisKKwkJCS8vIGZyZWUgdGhlIHBpeGVsIGZvcm1hdCBjb252ZXJ0ZXIKKwkJCVBLRm9ybWF0Q29udmVydGVyX1JlbGVhc2UoJnBDb252ZXJ0ZXIpOworCQl9CisKKwkJLy8gRnJlZUltYWdlIERJQiBhcmUgdXBzaWRlLWRvd24gcmVsYXRpdmUgdG8gdXN1YWwgZ3JhcGhpYyBjb252ZW50aW9ucworCQlGcmVlSW1hZ2VfRmxpcFZlcnRpY2FsKGRpYik7CisKKwkJLy8gcG9zdC1wcm9jZXNzaW5nIC4uLgorCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tCisKKwkJLy8gc3dhcCBSR0IgYXMgbmVlZGVkCisKKyNpZiBGUkVFSU1BR0VfQ09MT1JPUkRFUiA9PSBGUkVFSU1BR0VfQ09MT1JPUkRFUl9CR1IKKwkJaWYoSXNFcXVhbEdVSUQob3V0X2d1aWRfZm9ybWF0LCBHVUlEX1BLUGl4ZWxGb3JtYXQyNGJwcFJHQikgfHwgSXNFcXVhbEdVSUQob3V0X2d1aWRfZm9ybWF0LCBHVUlEX1BLUGl4ZWxGb3JtYXQzMmJwcFJHQikpIHsKKwkJCVN3YXBSZWRCbHVlMzIoZGliKTsKKwkJfQorI2VsaWYgRlJFRUlNQUdFX0NPTE9ST1JERVIgPT0gRlJFRUlNQUdFX0NPTE9ST1JERVJfUkdCCisJCWlmKElzRXF1YWxHVUlEKG91dF9ndWlkX2Zvcm1hdCwgR1VJRF9QS1BpeGVsRm9ybWF0MjRicHBCR1IpIHx8IElzRXF1YWxHVUlEKG91dF9ndWlkX2Zvcm1hdCwgR1VJRF9QS1BpeGVsRm9ybWF0MzJicHBCR1IpKSB7CisJCQlTd2FwUmVkQmx1ZTMyKGRpYik7CisJCX0KKyNlbmRpZgorCQkKKwkJcmV0dXJuIFdNUF9lcnJTdWNjZXNzOworCisJfSBjYXRjaCguLi4pIHsKKwkJLy8gZnJlZSB0aGUgbG9jYWwgYnVmZmVyCisJCVBLRnJlZUFsaWduZWQoKHZvaWQgKiopICZwYik7CisJCS8vIGZyZWUgdGhlIHBpeGVsIGZvcm1hdCBjb252ZXJ0ZXIKKwkJUEtGb3JtYXRDb252ZXJ0ZXJfUmVsZWFzZSgmcENvbnZlcnRlcik7CisKKwkJcmV0dXJuIGVycm9yX2NvZGU7CisJfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgRklCSVRNQVAgKiBETExfQ0FMTENPTlYKK0xvYWQoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBpbnQgcGFnZSwgaW50IGZsYWdzLCB2b2lkICpkYXRhKSB7CisJUEtJbWFnZURlY29kZSAqcERlY29kZXIgPSBOVUxMOwkvLyBkZWNvZGVyIGludGVyZmFjZQorCUVSUiBlcnJvcl9jb2RlID0gMDsJCQkJLy8gZXJyb3IgY29kZSBhcyByZXR1cm5lZCBieSB0aGUgaW50ZXJmYWNlCisJUEtQaXhlbEZvcm1hdEdVSUQgZ3VpZF9mb3JtYXQ7CS8vIGxvYWRlZCBwaXhlbCBmb3JtYXQgKD09IGlucHV0IGZpbGUgcGl4ZWwgZm9ybWF0IGlmIG5vIGNvbnZlcnNpb24gbmVlZGVkKQorCQorCUZSRUVfSU1BR0VfVFlQRSBpbWFnZV90eXBlID0gRklUX1VOS05PV047CS8vIGlucHV0IGltYWdlIHR5cGUKKwl1bnNpZ25lZCBicHAgPSAwOwkJCQkJCQkvLyBpbnB1dCBpbWFnZSBiaXQgZGVwdGgKKwlGSUJJVE1BUCAqZGliID0gTlVMTDsKKwkKKwkvLyBnZXQgdGhlIEkvTyBzdHJlYW0gd3JhcHBlcgorCVdNUFN0cmVhbSAqcERlY29kZVN0cmVhbSA9IChXTVBTdHJlYW0qKWRhdGE7CisKKwlpZighaGFuZGxlIHx8ICFwRGVjb2RlU3RyZWFtKSB7CisJCXJldHVybiBOVUxMOworCX0KKworCUJPT0wgaGVhZGVyX29ubHkgPSAoZmxhZ3MgJiBGSUZfTE9BRF9OT1BJWEVMUykgPT0gRklGX0xPQURfTk9QSVhFTFM7CisKKwl0cnkgeworCQlpbnQgd2lkdGgsIGhlaWdodDsJLy8gaW1hZ2UgZGltZW5zaW9ucyAoaW4gcGl4ZWxzKQorCisJCS8vIGNyZWF0ZSBhIEpYUiBkZWNvZGVyIGludGVyZmFjZSBhbmQgaW5pdGlhbGl6ZSBmdW5jdGlvbiBwb2ludGVycyB3aXRoICpfV01QIGZ1bmN0aW9ucworCQllcnJvcl9jb2RlID0gUEtJbWFnZURlY29kZV9DcmVhdGVfV01QKCZwRGVjb2Rlcik7CisJCUpYUl9DSEVDSyhlcnJvcl9jb2RlKTsKKworCQkvLyBhdHRhY2ggdGhlIHN0cmVhbSB0byB0aGUgZGVjb2RlciAuLi4KKwkJLy8gLi4uIHRoZW4gcmVhZCB0aGUgaW1hZ2UgY29udGFpbmVyIGFuZCB0aGUgbWV0YWRhdGEKKwkJZXJyb3JfY29kZSA9IHBEZWNvZGVyLT5Jbml0aWFsaXplKHBEZWNvZGVyLCBwRGVjb2RlU3RyZWFtKTsKKwkJSlhSX0NIRUNLKGVycm9yX2NvZGUpOworCisJCS8vIHNldCBkZWNvZGVyIHBhcmFtZXRlcnMKKwkJU2V0RGVjb2RlclBhcmFtZXRlcnMocERlY29kZXIsIGZsYWdzKTsKKworCQkvLyBnZXQgZHN0IGltYWdlIGZvcm1hdCBzcGVjaWZpY2F0aW9ucworCQl1bnNpZ25lZCByZWRfbWFzayA9IDAsIGdyZWVuX21hc2sgPSAwLCBibHVlX21hc2sgPSAwOworCQllcnJvcl9jb2RlID0gR2V0SW5wdXRQaXhlbEZvcm1hdChwRGVjb2RlciwgJmd1aWRfZm9ybWF0LCAmaW1hZ2VfdHlwZSwgJmJwcCwgJnJlZF9tYXNrLCAmZ3JlZW5fbWFzaywgJmJsdWVfbWFzayk7CisJCUpYUl9DSEVDSyhlcnJvcl9jb2RlKTsKKworCQkvLyBnZXQgaW1hZ2UgZGltZW5zaW9ucworCQlwRGVjb2Rlci0+R2V0U2l6ZShwRGVjb2RlciwgJndpZHRoLCAmaGVpZ2h0KTsKKworCQkvLyBhbGxvY2F0ZSBkc3QgaW1hZ2UKKwkJewkJCQorCQkJZGliID0gRnJlZUltYWdlX0FsbG9jYXRlSGVhZGVyVChoZWFkZXJfb25seSwgaW1hZ2VfdHlwZSwgd2lkdGgsIGhlaWdodCwgYnBwLCByZWRfbWFzaywgZ3JlZW5fbWFzaywgYmx1ZV9tYXNrKTsKKwkJCWlmKCFkaWIpIHsKKwkJCQl0aHJvdyBGSV9NU0dfRVJST1JfRElCX01FTU9SWTsKKwkJCX0KKwkJCWlmKEZyZWVJbWFnZV9HZXRCUFAoZGliKSA9PSAxKSB7CisJCQkJLy8gQkRfMSAtIGJ1aWxkIGEgRklDX01JTklTQkxBQ0sgcGFsZXR0ZQorCQkJCVJHQlFVQUQgKnBhbCA9IEZyZWVJbWFnZV9HZXRQYWxldHRlKGRpYik7CisJCQkJcGFsWzBdLnJnYlJlZCA9IHBhbFswXS5yZ2JHcmVlbiA9IHBhbFswXS5yZ2JCbHVlID0gMDsKKwkJCQlwYWxbMV0ucmdiUmVkID0gcGFsWzFdLnJnYkdyZWVuID0gcGFsWzFdLnJnYkJsdWUgPSAyNTU7CisJCQl9CisJCX0KKworCQkvLyBnZXQgaW1hZ2UgcmVzb2x1dGlvbgorCQl7CisJCQlmbG9hdCByZXNYLCByZXNZOwkvLyBpbWFnZSByZXNvbHV0aW9uIChpbiBkb3RzIHBlciBpbmNoKQorCQkJLy8gY29udmVydCBmcm9tIEVuZ2xpc2ggdW5pdHMsIGkuZS4gZG90cyBwZXIgaW5jaCB0byB1bml2ZXJzYWwgdW5pdHMsIGkuZS4gZG90cyBwZXIgbWV0ZXIKKwkJCXBEZWNvZGVyLT5HZXRSZXNvbHV0aW9uKHBEZWNvZGVyLCAmcmVzWCwgJnJlc1kpOworCQkJRnJlZUltYWdlX1NldERvdHNQZXJNZXRlclgoZGliLCAodW5zaWduZWQpKHJlc1ggLyAwLjAyNTRGICsgMC41RikpOworCQkJRnJlZUltYWdlX1NldERvdHNQZXJNZXRlclkoZGliLCAodW5zaWduZWQpKHJlc1kgLyAwLjAyNTRGICsgMC41RikpOworCQl9CisKKwkJLy8gZ2V0IG1ldGFkYXRhICYgSUNDIHByb2ZpbGUKKwkJZXJyb3JfY29kZSA9IFJlYWRNZXRhZGF0YShwRGVjb2RlciwgZGliKTsKKwkJSlhSX0NIRUNLKGVycm9yX2NvZGUpOworCisJCWlmKGhlYWRlcl9vbmx5KSB7CisJCQkvLyBoZWFkZXIgb25seSBtb2RlIC4uLgorCQkJCisJCQkvLyBmcmVlIHRoZSBkZWNvZGVyCisJCQlwRGVjb2Rlci0+UmVsZWFzZSgmcERlY29kZXIpOworCQkJYXNzZXJ0KHBEZWNvZGVyID09IE5VTEwpOworCisJCQlyZXR1cm4gZGliOworCQl9CisJCQorCQkvLyBjb3B5IHBpeGVscyBpbnRvIHRoZSBkaWIsIHBlcmZvcm0gcGl4ZWwgY29udmVyc2lvbiBpZiBuZWVkZWQKKwkJZXJyb3JfY29kZSA9IENvcHlQaXhlbHMocERlY29kZXIsIGd1aWRfZm9ybWF0LCBkaWIsIHdpZHRoLCBoZWlnaHQpOworCQlKWFJfQ0hFQ0soZXJyb3JfY29kZSk7CisKKwkJLy8gZnJlZSB0aGUgZGVjb2RlcgorCQlwRGVjb2Rlci0+UmVsZWFzZSgmcERlY29kZXIpOworCQlhc3NlcnQocERlY29kZXIgPT0gTlVMTCk7CisKKwkJcmV0dXJuIGRpYjsKKworCX0gY2F0Y2ggKGNvbnN0IGNoYXIgKm1lc3NhZ2UpIHsKKwkJLy8gdW5sb2FkIHRoZSBkaWIKKwkJRnJlZUltYWdlX1VubG9hZChkaWIpOworCQkvLyBmcmVlIHRoZSBkZWNvZGVyCisJCXBEZWNvZGVyLT5SZWxlYXNlKCZwRGVjb2Rlcik7CisKKwkJaWYoTlVMTCAhPSBtZXNzYWdlKSB7CisJCQlGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2Moc19mb3JtYXRfaWQsIG1lc3NhZ2UpOworCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCVNhdmUKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLyoqCitDb25maWd1cmUgY29tcHJlc3Npb24gcGFyYW1ldGVycworCitJbWFnZVF1YWxpdHkgIFEgKEJEPT0xKSAgUSAoQkQ9PTgpICAgUSAoQkQ9PTE2KSAgUSAoQkQ9PTMyRikgU3Vic2FtcGxlICAgT3ZlcmxhcAorWzAuMCwgMC40XSAgICA4LUlRKjUgICAgIChzZWUgdGFibGUpIChzZWUgdGFibGUpIChzZWUgdGFibGUpIDQ6NDo0ICAgICAgIDIKKygwLjQsIDAuOCkgICAgOC1JUSo1ICAgICAoc2VlIHRhYmxlKSAoc2VlIHRhYmxlKSAoc2VlIHRhYmxlKSA0OjQ6NCAgICAgICAxCitbMC44LCAxLjApICAgIDgtSVEqNSAgICAgKHNlZSB0YWJsZSkgKHNlZSB0YWJsZSkgKHNlZSB0YWJsZSkgNDo0OjQgICAgICAgMQorWzEuMCwgMS4wXSAgICAxICAgICAgICAgIDEgICAgICAgICAgIDEgICAgICAgICAgIDEgICAgICAgICAgIDQ6NDo0ICAgICAgIDAKKworQHBhcmFtIHdtaVNDUCBFbmNvZGVyIHBhcmFtZXRlcnMKK0BwYXJhbSBwaXhlbEluZm8gSW1hZ2Ugc3BlY2lmaWNhdGlvbnMKK0BwYXJhbSBmbHRJbWFnZVF1YWxpdHkgSW1hZ2Ugb3V0cHV0IHF1YWxpdHkgaW4gWzAuLjEpLCAxIG1lYW5zIGxvc3NsZXNzCisqLworc3RhdGljIHZvaWQgCitTZXRDb21wcmVzc2lvbihDV01JU3RyQ29kZWNQYXJhbSAqd21pU0NQLCBjb25zdCBQS1BpeGVsSW5mbyAqcGl4ZWxJbmZvLCBmbG9hdCBmbHRJbWFnZVF1YWxpdHkpIHsKKyAgICBpZihmbHRJbWFnZVF1YWxpdHkgPCAxLjBGKSB7CisgICAgICAgIC8vIG92ZXJsYXAKKwkJaWYoZmx0SW1hZ2VRdWFsaXR5ID49IDAuNUYpIHsKKwkJCXdtaVNDUC0+b2xPdmVybGFwID0gT0xfT05FOworCQl9IGVsc2UgeworCQkJd21pU0NQLT5vbE92ZXJsYXAgPSBPTF9UV087CisJCX0KKwkJLy8gY2hyb21hIHN1Yi1zYW1wbGluZworCQlpZihmbHRJbWFnZVF1YWxpdHkgPj0gMC41RiB8fCBwaXhlbEluZm8tPnVCaXRzUGVyU2FtcGxlID4gOCkgeworCQkJd21pU0NQLT5jZkNvbG9yRm9ybWF0ID0gWVVWXzQ0NDsKKwkJfSBlbHNlIHsKKwkJCXdtaVNDUC0+Y2ZDb2xvckZvcm1hdCA9IFlVVl80MjA7CisJCX0KKworCSAgICAvLyBiaXQgZGVwdGgKKwkJaWYocGl4ZWxJbmZvLT5iZEJpdERlcHRoID09IEJEXzEpIHsKKwkJCXdtaVNDUC0+dWlEZWZhdWx0UVBJbmRleCA9IChVOCkoOCAtIDUuMEYgKiBmbHRJbWFnZVF1YWxpdHkgKyAwLjVGKTsKKwkJfQorCQllbHNlIHsKKwkJCS8vIHJlbWFwIFswLjgsIDAuODY2LCAwLjkzMywgMS4wXSB0byBbMC44LCAwLjksIDEuMCwgMS4xXQorICAgICAgICAgICAgLy8gdG8gdXNlIDgtYml0IERQSyBRUCB0YWJsZSAoMC45MzMgPT0gUGhvdG9zaG9wIEpQRUcgMTAwKQorICAgICAgICAgICAgaWYoZmx0SW1hZ2VRdWFsaXR5ID4gMC44RiAmJiBwaXhlbEluZm8tPmJkQml0RGVwdGggPT0gQkRfOCAmJiB3bWlTQ1AtPmNmQ29sb3JGb3JtYXQgIT0gWVVWXzQyMCAmJiB3bWlTQ1AtPmNmQ29sb3JGb3JtYXQgIT0gWVVWXzQyMikgeworCQkJCWZsdEltYWdlUXVhbGl0eSA9IDAuOEYgKyAoZmx0SW1hZ2VRdWFsaXR5IC0gMC44RikgKiAxLjVGOworCQkJfQorCisgICAgICAgICAgICBjb25zdCBpbnQgcWkgPSAoaW50KSAoMTAuMEYgKiBmbHRJbWFnZVF1YWxpdHkpOworICAgICAgICAgICAgY29uc3QgZmxvYXQgcWYgPSAxMC4wRiAqIGZsdEltYWdlUXVhbGl0eSAtIChmbG9hdClxaTsKKwkJCQorCQkJY29uc3QgaW50ICpwUVBzID0gCisJCQkJKHdtaVNDUC0+Y2ZDb2xvckZvcm1hdCA9PSBZVVZfNDIwIHx8IHdtaVNDUC0+Y2ZDb2xvckZvcm1hdCA9PSBZVVZfNDIyKSA/CisJCQkJRFBLX1FQU180MjBbcWldIDoKKwkJCQkocGl4ZWxJbmZvLT5iZEJpdERlcHRoID09IEJEXzggPyBEUEtfUVBTXzhbcWldIDoKKwkJCQkocGl4ZWxJbmZvLT5iZEJpdERlcHRoID09IEJEXzE2ID8gRFBLX1FQU18xNltxaV0gOgorCQkJCShwaXhlbEluZm8tPmJkQml0RGVwdGggPT0gQkRfMTZGID8gRFBLX1FQU18xNmZbcWldIDoKKwkJCQlEUEtfUVBTXzMyZltxaV0pKSk7CisJCQkJCisJCQl3bWlTQ1AtPnVpRGVmYXVsdFFQSW5kZXggPSAoVTgpICgwLjVGICsgKGZsb2F0KSBwUVBzWzBdICogKDEuMEYgLSBxZikgKyAoZmxvYXQpIChwUVBzICsgNilbMF0gKiBxZik7CisJCQl3bWlTQ1AtPnVpRGVmYXVsdFFQSW5kZXhVID0gKFU4KSAoMC41RiArIChmbG9hdCkgcFFQc1sxXSAqICgxLjBGIC0gcWYpICsgKGZsb2F0KSAocFFQcyArIDYpWzFdICogcWYpOworCQkJd21pU0NQLT51aURlZmF1bHRRUEluZGV4ViA9IChVOCkgKDAuNUYgKyAoZmxvYXQpIHBRUHNbMl0gKiAoMS4wRiAtIHFmKSArIChmbG9hdCkgKHBRUHMgKyA2KVsyXSAqIHFmKTsKKyAgICAgICAgICAgIHdtaVNDUC0+dWlEZWZhdWx0UVBJbmRleFlIUCA9IChVOCkgKDAuNUYgKyAoZmxvYXQpIHBRUHNbM10gKiAoMS4wRiAtIHFmKSArIChmbG9hdCkgKHBRUHMgKyA2KVszXSAqIHFmKTsKKwkJCXdtaVNDUC0+dWlEZWZhdWx0UVBJbmRleFVIUCA9IChVOCkgKDAuNUYgKyAoZmxvYXQpIHBRUHNbNF0gKiAoMS4wRiAtIHFmKSArIChmbG9hdCkgKHBRUHMgKyA2KVs0XSAqIHFmKTsKKwkJCXdtaVNDUC0+dWlEZWZhdWx0UVBJbmRleFZIUCA9IChVOCkgKDAuNUYgKyAoZmxvYXQpIHBRUHNbNV0gKiAoMS4wRiAtIHFmKSArIChmbG9hdCkgKHBRUHMgKyA2KVs1XSAqIHFmKTsKKwkJfQorCX0gLy8gZmx0SW1hZ2VRdWFsaXR5IDwgMS4wRgorICAgIGVsc2UgeworCQkvLyBsb3NzbGVzcyBtb2RlCisJCXdtaVNDUC0+dWlEZWZhdWx0UVBJbmRleCA9IDE7CisJfQorfQorCisvKioKK1NldCBlbmNvZGVyIHBhcmFtZXRlcnMKK0BwYXJhbSB3bWlTQ1AgRW5jb2RlciBwYXJhbWV0ZXJzCitAcGFyYW0gcGl4ZWxJbmZvIEltYWdlIHNwZWNpZmljYXRpb25zCitAcGFyYW0gZmxhZ3MgRnJlZUltYWdlIHNhdmUgZmxhZ3MKK0BwYXJhbSBiSGFzQWxwaGEgVFJVRSBpZiBhbiBhbHBoYSBsYXllciBpcyBwcmVzZW50CisqLworc3RhdGljIHZvaWQgCitTZXRFbmNvZGVyUGFyYW1ldGVycyhDV01JU3RyQ29kZWNQYXJhbSAqd21pU0NQLCBjb25zdCBQS1BpeGVsSW5mbyAqcGl4ZWxJbmZvLCBpbnQgZmxhZ3MsIEJPT0wgYkhhc0FscGhhKSB7CisJZmxvYXQgZmx0SW1hZ2VRdWFsaXR5ID0gMS4wRjsKKworCS8vIGFsbCB2YWx1ZXMgaGF2ZSBiZWVuIHNldCB0byB6ZXJvIGJ5IHRoZSBBUEkKKwkvLyB1cGRhdGUgZGVmYXVsdCB2YWx1ZXMgZm9yIHNvbWUgYXR0cmlidXRlcworICAgIHdtaVNDUC0+Y2ZDb2xvckZvcm1hdCA9IFlVVl80NDQ7CQkvLyBjb2xvciBmb3JtYXQKKyAgICB3bWlTQ1AtPmJkQml0RGVwdGggPSBCRF9MT05HOwkJCS8vIGludGVybmFsIGJpdCBkZXB0aAorICAgIHdtaVNDUC0+YmZCaXRzdHJlYW1Gb3JtYXQgPSBTUEFUSUFMOwkvLyBjb21wcmVzc2VkIGltYWdlIGRhdGEgaW4gc3BhdGlhbCBvcmRlcgorICAgIHdtaVNDUC0+YlByb2dyZXNzaXZlTW9kZSA9IEZBTFNFOwkJLy8gc2VxdWVudGlhbCBtb2RlCisgICAgd21pU0NQLT5vbE92ZXJsYXAgPSBPTF9PTkU7CQkJCS8vIHNpbmdsZSBsZXZlbCBvdmVybGFwIHByb2Nlc3NpbmcgCisJd21pU0NQLT5jTnVtT2ZTbGljZU1pbnVzMUggPSAwOwkJCS8vICMgb2YgaG9yaXpvbnRhbCBzbGljZXMKKwl3bWlTQ1AtPmNOdW1PZlNsaWNlTWludXMxViA9IDA7CQkJLy8gIyBvZiB2ZXJ0aWNhbCBzbGljZXMKKyAgICB3bWlTQ1AtPnNiU3ViYmFuZCA9IFNCX0FMTDsJCQkJLy8ga2VlcCBhbGwgc3ViYmFuZHMKKyAgICB3bWlTQ1AtPnVBbHBoYU1vZGUgPSAwOwkJCQkJLy8gMDpubyBhbHBoYSAxOiBhbHBoYSBvbmx5IGVsc2U6IHNvbWV0aGluZyArIGFscGhhIAorICAgIHdtaVNDUC0+dWlEZWZhdWx0UVBJbmRleCA9IDE7CQkJLy8gcXVhbnRpemF0aW9uIGZvciBncmV5IG9yIHJnYiBsYXllcihzKSwgMTogbG9zc2xlc3MKKyAgICB3bWlTQ1AtPnVpRGVmYXVsdFFQSW5kZXhBbHBoYSA9IDE7CQkvLyBxdWFudGl6YXRpb24gZm9yIGFscGhhIGxheWVyLCAxOiBsb3NzbGVzcworCisJLy8gcHJvY2VzcyB0aGUgZmxhZ3MKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLQorCisJLy8gcHJvZ3Jlc3NpdmUgbW9kZQorCWlmKChmbGFncyAmIEpYUl9QUk9HUkVTU0lWRSkgPT0gSlhSX1BST0dSRVNTSVZFKSB7CisJCS8vIHR1cm4gb24gcHJvZ3Jlc3NpdmUgbW9kZSAoaW5zdGVhZCBvZiBzZXF1ZW50aWFsIG1vZGUpCisJCXdtaVNDUC0+YlByb2dyZXNzaXZlTW9kZSA9IFRSVUU7CisJfQorCisJLy8gcXVhbGl0eSBpbiBbMC4wMSAtIDEuMCksIDEuMCBtZWFucyBsb3NzbGVzcyAtIGRlZmF1bHQgaXMgMC44MAorCWludCBxdWFsaXR5ID0gZmxhZ3MgJiAweDdGOworCWlmKHF1YWxpdHkgPT0gMCkgeworCQkvLyBkZWZhdXQgdG8gMC44MAorCQlmbHRJbWFnZVF1YWxpdHkgPSAwLjhGOworCX0gZWxzZSBpZigoZmxhZ3MgJiBKWFJfTE9TU0xFU1MpID09IEpYUl9MT1NTTEVTUykgeworCQlmbHRJbWFnZVF1YWxpdHkgPSAxLjBGOworCX0gZWxzZSB7CisJCXF1YWxpdHkgPSAocXVhbGl0eSA+PSAxMDApID8gMTAwIDogcXVhbGl0eTsKKwkJZmx0SW1hZ2VRdWFsaXR5ID0gcXVhbGl0eSAvIDEwMC4wRjsKKwl9CisJU2V0Q29tcHJlc3Npb24od21pU0NQLCBwaXhlbEluZm8sIGZsdEltYWdlUXVhbGl0eSk7CisKKwkvLyBhbHBoYSBjb21wcmVzc2lvbgorCWlmKGJIYXNBbHBoYSkgeworCQl3bWlTQ1AtPnVBbHBoYU1vZGUgPSAyOwkvLyBlbmNvZGUgd2l0aCBhIHBsYW5hciBhbHBoYSBjaGFubmVsCisJfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYKK1NhdmUoRnJlZUltYWdlSU8gKmlvLCBGSUJJVE1BUCAqZGliLCBmaV9oYW5kbGUgaGFuZGxlLCBpbnQgcGFnZSwgaW50IGZsYWdzLCB2b2lkICpkYXRhKSB7CisJQk9PTCBiSXNGbGlwcGVkID0gRkFMU0U7CQkvLyBGcmVlSW1hZ2UgRElCIGFyZSB1cHNpZGUtZG93biByZWxhdGl2ZSB0byB1c3VhbCBncmFwaGljIGNvbnZlbnRpb25zCisJUEtQaXhlbEZvcm1hdEdVSUQgZ3VpZF9mb3JtYXQ7CS8vIGltYWdlIGZvcm1hdAorCVBLUGl4ZWxJbmZvIHBpeGVsSW5mbzsJCQkvLyBpbWFnZSBzcGVjaWZpY2F0aW9ucworCUJPT0wgYkhhc0FscGhhID0gRkFMU0U7CQkJLy8gaXMgYWxwaGEgbGF5ZXIgcHJlc2VudCA/CisKKwlQS0ltYWdlRW5jb2RlICpwRW5jb2RlciA9IE5VTEw7CQkvLyBlbmNvZGVyIGludGVyZmFjZQorCUVSUiBlcnJvcl9jb2RlID0gMDsJCQkJCS8vIGVycm9yIGNvZGUgYXMgcmV0dXJuZWQgYnkgdGhlIGludGVyZmFjZQorCisJLy8gZ2V0IHRoZSBJL08gc3RyZWFtIHdyYXBwZXIKKwlXTVBTdHJlYW0gKnBFbmNvZGVTdHJlYW0gPSAoV01QU3RyZWFtKilkYXRhOworCisJaWYoIWRpYiB8fCAhaGFuZGxlIHx8ICFwRW5jb2RlU3RyZWFtKSB7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwl0cnkgeworCQkvLyBnZXQgaW1hZ2UgZGltZW5zaW9ucworCQl1bnNpZ25lZCB3aWR0aCA9IEZyZWVJbWFnZV9HZXRXaWR0aChkaWIpOworCQl1bnNpZ25lZCBoZWlnaHQgPSBGcmVlSW1hZ2VfR2V0SGVpZ2h0KGRpYik7CisKKwkJLy8gY2hlY2sgSlBFRy1YUiBsaW1pdHMKKwkJaWYoKHdpZHRoIDwgTUJfV0lEVEhfUElYRUwpIHx8IChoZWlnaHQgPCBNQl9IRUlHSFRfUElYRUwpKSB7CisJCQlGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2Moc19mb3JtYXRfaWQsICJVbnN1cHBvcnRlZCBpbWFnZSBzaXplOiB3aWR0aCB4IGhlaWdodCA9ICVkIHggJWQiLCB3aWR0aCwgaGVpZ2h0KTsKKwkJCXRocm93IChjb25zdCBjaGFyKilOVUxMOworCQl9CisKKwkJLy8gZ2V0IG91dHB1dCBwaXhlbCBmb3JtYXQKKwkJZXJyb3JfY29kZSA9IEdldE91dHB1dFBpeGVsRm9ybWF0KGRpYiwgJmd1aWRfZm9ybWF0LCAmYkhhc0FscGhhKTsKKwkJSlhSX0NIRUNLKGVycm9yX2NvZGUpOworCQlwaXhlbEluZm8ucEdVSURQaXhGbXQgPSAmZ3VpZF9mb3JtYXQ7CisJCWVycm9yX2NvZGUgPSBQaXhlbEZvcm1hdExvb2t1cCgmcGl4ZWxJbmZvLCBMT09LVVBfRk9SV0FSRCk7CisJCUpYUl9DSEVDSyhlcnJvcl9jb2RlKTsKKworCQkvLyBjcmVhdGUgYSBKWFIgZW5jb2RlciBpbnRlcmZhY2UgYW5kIGluaXRpYWxpemUgZnVuY3Rpb24gcG9pbnRlcnMgd2l0aCAqX1dNUCBmdW5jdGlvbnMKKwkJZXJyb3JfY29kZSA9IFBLSW1hZ2VFbmNvZGVfQ3JlYXRlX1dNUCgmcEVuY29kZXIpOworCQlKWFJfQ0hFQ0soZXJyb3JfY29kZSk7CisKKwkJLy8gYXR0YWNoIHRoZSBzdHJlYW0gdG8gdGhlIGVuY29kZXIgYW5kIHNldCBhbGwgZW5jb2RlciBwYXJhbWV0ZXJzIHRvIHplcm8gLi4uCisJCWVycm9yX2NvZGUgPSBwRW5jb2Rlci0+SW5pdGlhbGl6ZShwRW5jb2RlciwgcEVuY29kZVN0cmVhbSwgJnBFbmNvZGVyLT5XTVAud21pU0NQLCBzaXplb2YoQ1dNSVN0ckNvZGVjUGFyYW0pKTsKKwkJSlhSX0NIRUNLKGVycm9yX2NvZGUpOworCisJCS8vIC4uLiB0aGVuIGNvbmZpZ3VyZSB0aGUgZW5jb2RlcgorCQlTZXRFbmNvZGVyUGFyYW1ldGVycygmcEVuY29kZXItPldNUC53bWlTQ1AsICZwaXhlbEluZm8sIGZsYWdzLCBiSGFzQWxwaGEpOworCisJCS8vIHNldCBwaXhlbCBmb3JtYXQKKwkJcEVuY29kZXItPlNldFBpeGVsRm9ybWF0KHBFbmNvZGVyLCBndWlkX2Zvcm1hdCk7CisKKwkJLy8gc2V0IGltYWdlIHNpemUKKwkJcEVuY29kZXItPlNldFNpemUocEVuY29kZXIsIHdpZHRoLCBoZWlnaHQpOworCQkKKwkJLy8gc2V0IHJlc29sdXRpb24gKGNvbnZlcnQgZnJvbSB1bml2ZXJzYWwgdW5pdHMgdG8gRW5nbGlzaCB1bml0cykKKwkJZmxvYXQgcmVzWCA9IChmbG9hdCkodW5zaWduZWQpKDAuNUYgKyAwLjAyNTRGICogRnJlZUltYWdlX0dldERvdHNQZXJNZXRlclgoZGliKSk7CisJCWZsb2F0IHJlc1kgPSAoZmxvYXQpKHVuc2lnbmVkKSgwLjVGICsgMC4wMjU0RiAqIEZyZWVJbWFnZV9HZXREb3RzUGVyTWV0ZXJZKGRpYikpOworCQlwRW5jb2Rlci0+U2V0UmVzb2x1dGlvbihwRW5jb2RlciwgcmVzWCwgcmVzWSk7CisKKwkJLy8gc2V0IG1ldGFkYXRhCisJCVdyaXRlTWV0YWRhdGEocEVuY29kZXIsIGRpYik7CisKKwkJLy8gd3JpdGUgbWV0YWRhdGEgJiBwaXhlbHMKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCQkvLyBkaWIgY29vcmRpbmF0ZXMgYXJlIHVwc2lkZS1kb3duIHJlbGF0aXZlIHRvIHVzdWFsIGNvbnZlbnRpb25zCisJCWJJc0ZsaXBwZWQgPSBGcmVlSW1hZ2VfRmxpcFZlcnRpY2FsKGRpYik7CisKKwkJLy8gZ2V0IGEgcG9pbnRlciB0byBkc3QgcGl4ZWwgZGF0YQorCQlCWVRFICpkaWJfYml0cyA9IEZyZWVJbWFnZV9HZXRCaXRzKGRpYik7CisKKwkJLy8gZ2V0IGRzdCBwaXRjaCAoY291bnQgb2YgQllURSBmb3Igc3RyaWRlKQorCQljb25zdCB1bnNpZ25lZCBjYlN0cmlkZSA9IEZyZWVJbWFnZV9HZXRQaXRjaChkaWIpOworCisJCS8vIHdyaXRlIG1ldGFkYXRhICsgcGl4ZWxzIG9uIG91dHB1dAorCQllcnJvcl9jb2RlID0gcEVuY29kZXItPldyaXRlUGl4ZWxzKHBFbmNvZGVyLCBoZWlnaHQsIGRpYl9iaXRzLCBjYlN0cmlkZSk7CisJCUpYUl9DSEVDSyhlcnJvcl9jb2RlKTsKKworCQkvLyByZWNvdmVyIGRpYiBjb29yZGluYXRlcworCQlGcmVlSW1hZ2VfRmxpcFZlcnRpY2FsKGRpYik7CisKKwkJLy8gZnJlZSB0aGUgZW5jb2RlcgorCQlwRW5jb2Rlci0+UmVsZWFzZSgmcEVuY29kZXIpOworCQlhc3NlcnQocEVuY29kZXIgPT0gTlVMTCk7CisJCQorCQlyZXR1cm4gVFJVRTsKKworCX0gY2F0Y2ggKGNvbnN0IGNoYXIgKm1lc3NhZ2UpIHsKKwkJaWYoYklzRmxpcHBlZCkgeworCQkJLy8gcmVjb3ZlciBkaWIgY29vcmRpbmF0ZXMKKwkJCUZyZWVJbWFnZV9GbGlwVmVydGljYWwoZGliKTsKKwkJfQorCQlpZihwRW5jb2RlcikgeworCQkJLy8gZnJlZSB0aGUgZW5jb2RlcgorCQkJcEVuY29kZXItPlJlbGVhc2UoJnBFbmNvZGVyKTsKKwkJCWFzc2VydChwRW5jb2RlciA9PSBOVUxMKTsKKwkJfQorCQlpZihOVUxMICE9IG1lc3NhZ2UpIHsKKwkJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhzX2Zvcm1hdF9pZCwgbWVzc2FnZSk7CisJCX0KKwl9CisKKwlyZXR1cm4gRkFMU0U7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCSBJbml0CisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3ZvaWQgRExMX0NBTExDT05WCitJbml0SlhSKFBsdWdpbiAqcGx1Z2luLCBpbnQgZm9ybWF0X2lkKSB7CisJc19mb3JtYXRfaWQgPSBmb3JtYXRfaWQ7CisKKwlwbHVnaW4tPmZvcm1hdF9wcm9jID0gRm9ybWF0OworCXBsdWdpbi0+ZGVzY3JpcHRpb25fcHJvYyA9IERlc2NyaXB0aW9uOworCXBsdWdpbi0+ZXh0ZW5zaW9uX3Byb2MgPSBFeHRlbnNpb247CisJcGx1Z2luLT5yZWdleHByX3Byb2MgPSBSZWdFeHByOworCXBsdWdpbi0+b3Blbl9wcm9jID0gT3BlbjsKKwlwbHVnaW4tPmNsb3NlX3Byb2MgPSBDbG9zZTsKKwlwbHVnaW4tPnBhZ2Vjb3VudF9wcm9jID0gTlVMTDsKKwlwbHVnaW4tPnBhZ2VjYXBhYmlsaXR5X3Byb2MgPSBOVUxMOworCXBsdWdpbi0+bG9hZF9wcm9jID0gTG9hZDsKKwlwbHVnaW4tPnNhdmVfcHJvYyA9IFNhdmU7CisJcGx1Z2luLT52YWxpZGF0ZV9wcm9jID0gVmFsaWRhdGU7CisJcGx1Z2luLT5taW1lX3Byb2MgPSBNaW1lVHlwZTsKKwlwbHVnaW4tPnN1cHBvcnRzX2V4cG9ydF9icHBfcHJvYyA9IFN1cHBvcnRzRXhwb3J0RGVwdGg7CisJcGx1Z2luLT5zdXBwb3J0c19leHBvcnRfdHlwZV9wcm9jID0gU3VwcG9ydHNFeHBvcnRUeXBlOworCXBsdWdpbi0+c3VwcG9ydHNfaWNjX3Byb2ZpbGVzX3Byb2MgPSBTdXBwb3J0c0lDQ1Byb2ZpbGVzOworCXBsdWdpbi0+c3VwcG9ydHNfbm9fcGl4ZWxzX3Byb2MgPSBTdXBwb3J0c05vUGl4ZWxzOworfQorCmRpZmYgLS1naXQgYS9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL1BsdWdpbktPQUxBLmNwcCBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvUGx1Z2luS09BTEEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjM2FlNTIKLS0tIC9kZXYvbnVsbAorKysgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL1BsdWdpbktPQUxBLmNwcApAQCAtMCwwICsxLDI0MyBAQAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gS09BTEEgTG9hZGVyCisvLworLy8gRGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBieQorLy8gLSBGbG9yaXMgdmFuIGRlbiBCZXJnIChmbHZkYmVyZ0B3eHMubmwpCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRnJlZUltYWdlIDMKKy8vCisvLyBDT1ZFUkVEIENPREUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkKKy8vIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTCisvLyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy8vIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVECisvLyBDT0RFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UCisvLyBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWQorLy8gU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTAorLy8gUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUgorLy8gVEhJUyBESVNDTEFJTUVSLgorLy8KKy8vIFVzZSBhdCB5b3VyIG93biByaXNrIQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaW5jbHVkZSAiRnJlZUltYWdlLmgiCisjaW5jbHVkZSAiVXRpbGl0aWVzLmgiCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgQ29uc3RhbnRzICsgaGVhZGVycworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgX1dJTjMyCisjcHJhZ21hIHBhY2socHVzaCwgMSkKKyNlbHNlCisjcHJhZ21hIHBhY2soMSkKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB0YWdLT0FMQSB7CisJQllURSBpbWFnZVs4MDAwXTsJCS8vIHBpeG1hcCBpbWFnZQorCUJZVEUgY29sb3VyMVsxMDAwXTsJCS8vIGZpcnN0IGNvbG91cm1hcCAoY29sb3VyIDEgYW5kIDIpCisJQllURSBjb2xvdXIyWzEwMDBdOwkJLy8gc2Vjb25kIGNvbG91cm1hcCAoY29sb3VyIDMpCisJQllURSBiYWNrZ3JvdW5kOwkJLy8gYmFja2dyb3VuZCBjb2xvdXIKK30ga29hbGFfdDsKKworc3RydWN0IGNvbG91cl90IHsKKwlpbnQJcjsKKwlpbnQgZzsKKwlpbnQgYjsJCit9OworCisjaWZkZWYgX1dJTjMyCisjcHJhZ21hIHBhY2socG9wKQorI2Vsc2UKKyNwcmFnbWEgcGFjaygpCisjZW5kaWYKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIENCTV9XSURUSCAgMzIwCisjZGVmaW5lIENCTV9IRUlHSFQgMjAwCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY29uc3QgY29sb3VyX3QgYzY0Y29sb3Vyc1sxNl0gPSB7CisJeyAgIDAsICAgMCwgICAwIH0sCS8vIEJsYWNrCisJeyAyNTUsIDI1NSwgMjU1IH0sCS8vIFdoaXRlCisJeyAxNzAsICAxNywgIDE3IH0sCS8vIFJlZAorCXsgIDEyLCAyMDQsIDIwNCB9LAkvLyBDeWFuCisJeyAyMjEsICA1MSwgMjIxIH0sCS8vIFB1cnBsZQorCXsgIDAsICAxODcsICAwIH0sCS8vIEdyZWVuCisJeyAgIDAsICAgMCwgMjA0IH0sCS8vIEJsdWUKKwl7IDI1NSwgMjU1LCAxNDAgfSwJLy8gWWVsbG93CisJeyAyMDQsIDExOSwgIDM0IH0sCS8vIE9yYW5nZQorCXsgMTM2LCAgNjgsICAgMCB9LAkvLyBCcm93bgorCXsgMjU1LCAxNTMsIDEzNiB9LAkvLyBMaWdodCByZWQKKwl7ICA5MiwgIDkyLCAgOTIgfSwJLy8gR3JheSAxCisJeyAxNzAsIDE3MCwgMTcwIH0sCS8vIEdyYXkgMgorCXsgMTQwLCAyNTUsIDE3OCB9LAkvLyBMaWdodCBncmVlbgorCXsgIDM5LCAxNDgsIDI1NSB9LAkvLyBMaWdodCBibHVlCisJeyAxOTYsIDE5NiwgMTk2IH0JLy8gR3JheSAzCit9OworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBQbHVnaW4gSW50ZXJmYWNlCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3N0YXRpYyBpbnQgc19mb3JtYXRfaWQ7CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFBsdWdpbiBJbXBsZW1lbnRhdGlvbgorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjb25zdCBjaGFyICogRExMX0NBTExDT05WCitGb3JtYXQoKSB7CisJcmV0dXJuICJLT0FMQSI7Cit9CisKK2NvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKK0Rlc2NyaXB0aW9uKCkgeworCXJldHVybiAiQzY0IEtvYWxhIEdyYXBoaWNzIjsKK30KKworY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgorRXh0ZW5zaW9uKCkgeworCXJldHVybiAia29hIjsKK30KKworY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgorUmVnRXhwcigpIHsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKK01pbWVUeXBlKCkgeworCXJldHVybiAiaW1hZ2UveC1rb2FsYSI7Cit9CisKK3N0YXRpYyBCT09MIERMTF9DQUxMQ09OVgorVmFsaWRhdGUoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlKSB7CisJQllURSBrb2FsYV9zaWduYXR1cmVbXSA9IHsgMHgwMCwgMHg2MCB9OworCUJZVEUgc2lnbmF0dXJlWzJdID0geyAwLCAwIH07CisKKwlpby0+cmVhZF9wcm9jKHNpZ25hdHVyZSwgMSwgc2l6ZW9mKGtvYWxhX3NpZ25hdHVyZSksIGhhbmRsZSk7CisKKwlyZXR1cm4gKG1lbWNtcChrb2FsYV9zaWduYXR1cmUsIHNpZ25hdHVyZSwgc2l6ZW9mKGtvYWxhX3NpZ25hdHVyZSkpID09IDApOworfQorCitzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYKK1N1cHBvcnRzRXhwb3J0RGVwdGgoaW50IGRlcHRoKSB7CisJcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYgCitTdXBwb3J0c0V4cG9ydFR5cGUoRlJFRV9JTUFHRV9UWVBFIHR5cGUpIHsKKwlyZXR1cm4gRkFMU0U7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRklCSVRNQVAgKiBETExfQ0FMTENPTlYKK0xvYWQoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBpbnQgcGFnZSwgaW50IGZsYWdzLCB2b2lkICpkYXRhKSB7CisJaWYgKGhhbmRsZSkgeworCQlrb2FsYV90IGltYWdlOworCisJCS8vIHJlYWQgdGhlIGxvYWQgYWRkcmVzcworCisJCXVuc2lnbmVkIGNoYXIgbG9hZF9hZGRyZXNzWzJdOyAgLy8gaGlnaGJpdCwgbG93Yml0CisKKwkJaW8tPnJlYWRfcHJvYygmbG9hZF9hZGRyZXNzLCAxLCAyLCBoYW5kbGUpOworCisJCS8vIGlmIHRoZSBsb2FkIGFkZHJlc3MgaXMgY29ycmVjdCwgc2tpcCBpdC4gb3RoZXJ3aXNlIGlnbm9yZSB0aGUgbG9hZCBhZGRyZXNzCisKKwkJaWYgKChsb2FkX2FkZHJlc3NbMF0gIT0gMHgwMCkgfHwgKGxvYWRfYWRkcmVzc1sxXSAhPSAweDYwKSkgeworCQkJKChCWVRFICopJmltYWdlKVswXSA9IGxvYWRfYWRkcmVzc1swXTsKKwkJCSgoQllURSAqKSZpbWFnZSlbMV0gPSBsb2FkX2FkZHJlc3NbMV07CisKKwkJCWlvLT5yZWFkX3Byb2MoKEJZVEUgKikmaW1hZ2UgKyAyLCAxLCAxMDAwMSAtIDIsIGhhbmRsZSk7CisJCX0gZWxzZSB7CisJCQlpby0+cmVhZF9wcm9jKCZpbWFnZSwgMSwgMTAwMDEsIGhhbmRsZSk7CisJCX0JCQorCisJCS8vIGJ1aWxkIERJQiBpbiBtZW1vcnkKKworCQlGSUJJVE1BUCAqZGliID0gRnJlZUltYWdlX0FsbG9jYXRlKENCTV9XSURUSCwgQ0JNX0hFSUdIVCwgNCk7CisKKwkJaWYgKGRpYikgeworCQkJLy8gd3JpdGUgb3V0IHRoZSBjb21tb2RvcmUgNjQgY29sb3IgcGFsZXR0ZQorCisJCQlSR0JRVUFEICpwYWxldHRlID0gRnJlZUltYWdlX0dldFBhbGV0dGUoZGliKTsKKworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCQkJcGFsZXR0ZVtpXS5yZ2JCbHVlICA9IChCWVRFKWM2NGNvbG91cnNbaV0uYjsKKwkJCQlwYWxldHRlW2ldLnJnYkdyZWVuID0gKEJZVEUpYzY0Y29sb3Vyc1tpXS5nOworCQkJCXBhbGV0dGVbaV0ucmdiUmVkICAgPSAoQllURSljNjRjb2xvdXJzW2ldLnI7CisJCQl9CisKKwkJCS8vIHdyaXRlIG91dCBiaXRtYXAgZGF0YQorCisJCQlCWVRFIHBpeGVsX21hc2tbNF0gICAgICAgICA9IHsgMHhjMCwgMHgzMCwgMHgwYywgMHgwMyB9OworCQkJQllURSBwaXhlbF9kaXNwbGFjZW1lbnRbNF0gPSB7IDYsIDQsIDIsIDAgfTsKKwkJCWludAlwaXhlbCwgaW5kZXgsIGNvbG91cmluZGV4OworCQkJdW5zaWduZWQgY2hhciBmb3VuZF9jb2xvciA9IDA7CisKKwkJCWZvciAoaW50IHkgPSAwOyB5IDwgMjAwOyB5KyspIHsKKwkJCQlmb3IgKGludCB4ID0gMDsgeCA8IDE2MDsgeCsrKSB7CisJCQkJCS8vIEdldCB2YWx1ZSBvZiBwaXhlbCBhdCAoeCx5KQorCisJCQkJCWluZGV4ID0gKHggLyA0KSAqIDggKyAoeSAlIDgpICsgKHkgLyA4KSAqIENCTV9XSURUSDsKKwkJCQkJY29sb3VyaW5kZXggPSAoeCAvIDQpICsgKHkgLyA4KSAqIDQwOworCQkJCQlwaXhlbCA9IChpbWFnZS5pbWFnZVtpbmRleF0gJiBwaXhlbF9tYXNrW3ggJSA0XSkgPj4gcGl4ZWxfZGlzcGxhY2VtZW50W3ggJSA0XTsKKworCQkJCQkvLyBSZXRyaWV2ZSBSR0IgdmFsdWVzCisKKwkJCQkJc3dpdGNoIChwaXhlbCkgeworCQkJCQkJY2FzZSAwOiAvLyBCYWNrZ3JvdW5kCisJCQkJCQkJZm91bmRfY29sb3IgPSBpbWFnZS5iYWNrZ3JvdW5kOworCQkJCQkJCWJyZWFrOworCQkJCQkJCQorCQkJCQkJY2FzZSAxOiAvLyBDb2xvdXIgMQorCQkJCQkJCWZvdW5kX2NvbG9yID0gaW1hZ2UuY29sb3VyMVtjb2xvdXJpbmRleF0gPj4gNDsKKwkJCQkJCQlicmVhazsKKwkJCQkJCQkKKwkJCQkJCWNhc2UgMjogLy8gQ29sb3VyIDIKKwkJCQkJCQlmb3VuZF9jb2xvciA9IGltYWdlLmNvbG91cjFbY29sb3VyaW5kZXhdICYgMHhmOworCQkJCQkJCWJyZWFrOworCQkJCQkJCQorCQkJCQkJY2FzZSAzOiAvLyBDb2xvdXIgMworCQkJCQkJCWZvdW5kX2NvbG9yID0gaW1hZ2UuY29sb3VyMltjb2xvdXJpbmRleF0gJiAweGY7CisJCQkJCQkJYnJlYWs7CisJCQkJCX07CisKKwkJCQkJKihGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCBDQk1fSEVJR0hUIC0geSAtIDEpICsgeCkgPSAoZm91bmRfY29sb3IgPDwgNCkgfCBmb3VuZF9jb2xvcjsKKwkJCQl9CisJCQl9CisKKwkJCXJldHVybiBkaWI7CisJCX0KKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gICBJbml0CisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3ZvaWQgRExMX0NBTExDT05WCitJbml0S09BTEEoUGx1Z2luICpwbHVnaW4sIGludCBmb3JtYXRfaWQpIHsKKwlzX2Zvcm1hdF9pZCA9IGZvcm1hdF9pZDsKKworCXBsdWdpbi0+Zm9ybWF0X3Byb2MgPSBGb3JtYXQ7CisJcGx1Z2luLT5kZXNjcmlwdGlvbl9wcm9jID0gRGVzY3JpcHRpb247CisJcGx1Z2luLT5leHRlbnNpb25fcHJvYyA9IEV4dGVuc2lvbjsKKwlwbHVnaW4tPnJlZ2V4cHJfcHJvYyA9IFJlZ0V4cHI7CisJcGx1Z2luLT5vcGVuX3Byb2MgPSBOVUxMOworCXBsdWdpbi0+Y2xvc2VfcHJvYyA9IE5VTEw7CisJcGx1Z2luLT5wYWdlY291bnRfcHJvYyA9IE5VTEw7CisJcGx1Z2luLT5wYWdlY2FwYWJpbGl0eV9wcm9jID0gTlVMTDsKKwlwbHVnaW4tPmxvYWRfcHJvYyA9IExvYWQ7CisJcGx1Z2luLT5zYXZlX3Byb2MgPSBOVUxMOworCXBsdWdpbi0+dmFsaWRhdGVfcHJvYyA9IFZhbGlkYXRlOworCXBsdWdpbi0+bWltZV9wcm9jID0gTWltZVR5cGU7CisJcGx1Z2luLT5zdXBwb3J0c19leHBvcnRfYnBwX3Byb2MgPSBTdXBwb3J0c0V4cG9ydERlcHRoOworCXBsdWdpbi0+c3VwcG9ydHNfZXhwb3J0X3R5cGVfcHJvYyA9IFN1cHBvcnRzRXhwb3J0VHlwZTsKKwlwbHVnaW4tPnN1cHBvcnRzX2ljY19wcm9maWxlc19wcm9jID0gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvUGx1Z2luTU5HLmNwcCBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvUGx1Z2luTU5HLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDJmNTBlCi0tLSAvZGV2L251bGwKKysrIGIvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9QbHVnaW5NTkcuY3BwCkBAIC0wLDAgKzEsMTUzIEBACisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBNTkcgbG9hZGVyCisvLworLy8gRGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBieQorLy8gLSBIZXJ2ZSBEcm9sb24gKGRyb2xvbkBpbmZvbmllLmZyKQorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZyZWVJbWFnZSAzCisvLworLy8gQ09WRVJFRCBDT0RFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZCisvLyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUworLy8gVEhBVCBUSEUgQ09WRVJFRCBDT0RFIElTIEZSRUUgT0YgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisvLyBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRAorLy8gQ09ERSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVAorLy8gVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GIEFOWSBORUNFU1NBUlkKKy8vIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwKKy8vIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIKKy8vIFRISVMgRElTQ0xBSU1FUi4KKy8vCisvLyBVc2UgYXQgeW91ciBvd24gcmlzayEKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2luY2x1ZGUgIkZyZWVJbWFnZS5oIgorI2luY2x1ZGUgIlV0aWxpdGllcy5oIgorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBQbHVnaW4gSW50ZXJmYWNlCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3N0YXRpYyBpbnQgc19mb3JtYXRfaWQ7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBNTkdfU0lHTkFUVVJFX1NJWkUgOAkvLyBzaXplIG9mIHRoZSBzaWduYXR1cmUKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgIG1uZyBpbnRlcmZhY2UgKHNlZSBNTkdIZWxwZXIuY3BwKQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitGSUJJVE1BUCogbW5nX1JlYWRDaHVua3MoaW50IGZvcm1hdF9pZCwgRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBsb25nIE9mZnNldCwgaW50IGZsYWdzID0gMCk7CisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gUGx1Z2luIEltcGxlbWVudGF0aW9uCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3N0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCitGb3JtYXQoKSB7CisJcmV0dXJuICJNTkciOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgorRGVzY3JpcHRpb24oKSB7CisJcmV0dXJuICJNdWx0aXBsZS1pbWFnZSBOZXR3b3JrIEdyYXBoaWNzIjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKK0V4dGVuc2lvbigpIHsKKwlyZXR1cm4gIm1uZyI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCitSZWdFeHByKCkgeworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgorTWltZVR5cGUoKSB7CisJcmV0dXJuICJ2aWRlby94LW1uZyI7Cit9CisKK3N0YXRpYyBCT09MIERMTF9DQUxMQ09OVgorVmFsaWRhdGUoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlKSB7CisJQllURSBtbmdfc2lnbmF0dXJlWzhdID0geyAxMzgsIDc3LCA3OCwgNzEsIDEzLCAxMCwgMjYsIDEwIH07CisJQllURSBzaWduYXR1cmVbOF0gPSB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfTsKKworCWlvLT5yZWFkX3Byb2MoJnNpZ25hdHVyZSwgMSwgTU5HX1NJR05BVFVSRV9TSVpFLCBoYW5kbGUpOworCisJcmV0dXJuIChtZW1jbXAobW5nX3NpZ25hdHVyZSwgc2lnbmF0dXJlLCBNTkdfU0lHTkFUVVJFX1NJWkUpID09IDApID8gVFJVRSA6IEZBTFNFOworfQorCitzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYKK1N1cHBvcnRzRXhwb3J0RGVwdGgoaW50IGRlcHRoKSB7CisJcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYgCitTdXBwb3J0c0V4cG9ydFR5cGUoRlJFRV9JTUFHRV9UWVBFIHR5cGUpIHsKKwlyZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBCT09MIERMTF9DQUxMQ09OVgorU3VwcG9ydHNJQ0NQcm9maWxlcygpIHsKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIEJPT0wgRExMX0NBTExDT05WCitTdXBwb3J0c05vUGl4ZWxzKCkgeworCXJldHVybiBGQUxTRTsKK30KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkICogRExMX0NBTExDT05WCitPcGVuKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSwgQk9PTCByZWFkKSB7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIERMTF9DQUxMQ09OVgorQ2xvc2UoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCB2b2lkICpkYXRhKSB7Cit9CisKK3N0YXRpYyBGSUJJVE1BUCAqIERMTF9DQUxMQ09OVgorTG9hZChGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIGludCBwYWdlLCBpbnQgZmxhZ3MsIHZvaWQgKmRhdGEpIHsKKwlsb25nIG9mZnNldCA9IE1OR19TSUdOQVRVUkVfU0laRTsJLy8gbW92ZSB0byBza2lwIGZpcnN0IDggYnl0ZXMgb2Ygc2lnbmF0dXJlCisKKwkvLyBjaGVjayB0aGUgc2lnbmF0dXJlICg4IGJ5dGVzKQorCWlmKFZhbGlkYXRlKGlvLCBoYW5kbGUpID09IEZBTFNFKSB7CisJCXJldHVybiBOVUxMOworCX0KKwkKKwkvLyBwYXJzZSBjaHVua3MgYW5kIGRlY29kZSBhIGpuZyBvciBtbmcgYml0bWFwCisJcmV0dXJuIG1uZ19SZWFkQ2h1bmtzKHNfZm9ybWF0X2lkLCBpbywgaGFuZGxlLCBvZmZzZXQsIGZsYWdzKTsKK30KKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgIEluaXQKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwordm9pZCBETExfQ0FMTENPTlYKK0luaXRNTkcoUGx1Z2luICpwbHVnaW4sIGludCBmb3JtYXRfaWQpIHsKKwlzX2Zvcm1hdF9pZCA9IGZvcm1hdF9pZDsKKworCXBsdWdpbi0+Zm9ybWF0X3Byb2MgPSBGb3JtYXQ7CisJcGx1Z2luLT5kZXNjcmlwdGlvbl9wcm9jID0gRGVzY3JpcHRpb247CisJcGx1Z2luLT5leHRlbnNpb25fcHJvYyA9IEV4dGVuc2lvbjsKKwlwbHVnaW4tPnJlZ2V4cHJfcHJvYyA9IFJlZ0V4cHI7CisJcGx1Z2luLT5vcGVuX3Byb2MgPSBPcGVuOworCXBsdWdpbi0+Y2xvc2VfcHJvYyA9IENsb3NlOworCXBsdWdpbi0+cGFnZWNvdW50X3Byb2MgPSBOVUxMOworCXBsdWdpbi0+cGFnZWNhcGFiaWxpdHlfcHJvYyA9IE5VTEw7CisJcGx1Z2luLT5sb2FkX3Byb2MgPSBMb2FkOworCXBsdWdpbi0+c2F2ZV9wcm9jID0gTlVMTDsKKwlwbHVnaW4tPnZhbGlkYXRlX3Byb2MgPSBWYWxpZGF0ZTsKKwlwbHVnaW4tPm1pbWVfcHJvYyA9IE1pbWVUeXBlOworCXBsdWdpbi0+c3VwcG9ydHNfZXhwb3J0X2JwcF9wcm9jID0gU3VwcG9ydHNFeHBvcnREZXB0aDsKKwlwbHVnaW4tPnN1cHBvcnRzX2V4cG9ydF90eXBlX3Byb2MgPSBTdXBwb3J0c0V4cG9ydFR5cGU7CisJcGx1Z2luLT5zdXBwb3J0c19pY2NfcHJvZmlsZXNfcHJvYyA9IFN1cHBvcnRzSUNDUHJvZmlsZXM7CisJcGx1Z2luLT5zdXBwb3J0c19ub19waXhlbHNfcHJvYyA9IFN1cHBvcnRzTm9QaXhlbHM7Cit9CmRpZmYgLS1naXQgYS9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL1BsdWdpblBDRC5jcHAgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL1BsdWdpblBDRC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYwYzViOAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvUGx1Z2luUENELmNwcApAQCAtMCwwICsxLDI1MSBAQAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gS29kYWsgUGhvdG9DRCBMb2FkZXIKKy8vCisvLyBEZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIGJ5CisvLyAtIEZsb3JpcyB2YW4gZGVuIEJlcmcgKGZsdmRiZXJnQHd4cy5ubCkKKy8vIAorLy8gQmFzZWQgb24gcGFzY2FsIGNvZGUgZGV2ZWxvcGVkIGJ5IEFsZXggS3dhaworLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZyZWVJbWFnZSAzCisvLworLy8gQ09WRVJFRCBDT0RFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZCisvLyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUworLy8gVEhBVCBUSEUgQ09WRVJFRCBDT0RFIElTIEZSRUUgT0YgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisvLyBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRAorLy8gQ09ERSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVAorLy8gVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GIEFOWSBORUNFU1NBUlkKKy8vIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwKKy8vIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIKKy8vIFRISVMgRElTQ0xBSU1FUi4KKy8vCisvLyBVc2UgYXQgeW91ciBvd24gcmlzayEKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2luY2x1ZGUgIkZyZWVJbWFnZS5oIgorI2luY2x1ZGUgIlV0aWxpdGllcy5oIgorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBJbnRlcm5hbCBmdW5jdGlvbnMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3RhdGljIGludCAKK2NsYW1wKGRvdWJsZSB4KSB7CisJaW50IGEgPSAoaW50KWZsb29yKHggKyAwLjUpOworCXJldHVybiAoYSA8IDApID8gMCA6IChhID4gMjU1KSA/IDI1NSA6IGE7Cit9CisKK3N0YXRpYyB2b2lkCitZVVYyUkdCKGludCB5LCBpbnQgY2IsIGludCBjciwgaW50ICZyLCBpbnQgJmcsIGludCAmYikgeworCWRvdWJsZSBjMTEgPSAwLjAwNTQ5ODAgICogMjU2LjA7CisJZG91YmxlIGMxMiA9IDAuMDAwMDAwMSAgKiAyNTYuMDsKKwlkb3VibGUgYzEzID0gMC4wMDUxNjgxICAqIDI1Ni4wOworCWRvdWJsZSBjMjEgPSAwLjAwNTQ5ODAgICogMjU2LjA7CisJZG91YmxlIGMyMiA9IC0wLjAwMTU0NDYgKiAyNTYuMDsKKwlkb3VibGUgYzIzID0gLTAuMDAyNjMyNSAqIDI1Ni4wOworCWRvdWJsZSBjMzEgPSAwLjAwNTQ5ODAgICogMjU2LjA7CisJZG91YmxlIGMzMiA9IDAuMDA3OTUzMyAgKiAyNTYuMDsKKwlkb3VibGUgYzMzID0gMC4wMDAwMDAxICAqIDI1Ni4wOworCisJciA9IGNsYW1wKGMxMSAqIHkgKyBjMTIgKiAoY2IgLSAxNTYpICsgYzEzICogKGNyIC0gMTM3KSk7CisJZyA9IGNsYW1wKGMyMSAqIHkgKyBjMjIgKiAoY2IgLSAxNTYpICsgYzIzICogKGNyIC0gMTM3KSk7CisJYiA9IGNsYW1wKGMzMSAqIHkgKyBjMzIgKiAoY2IgLSAxNTYpICsgYzMzICogKGNyIC0gMTM3KSk7Cit9CisKK3N0YXRpYyBCT09MCitWZXJ0aWNhbE9yaWVudGF0aW9uKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSkgeworCWNoYXIgYnVmZmVyWzEyOF07CisKKwlpby0+cmVhZF9wcm9jKGJ1ZmZlciwgMTI4LCAxLCBoYW5kbGUpOworCisJcmV0dXJuIChidWZmZXJbNzJdICYgNjMpID09IDg7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFBsdWdpbiBJbnRlcmZhY2UKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3RhdGljIGludCBzX2Zvcm1hdF9pZDsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gUGx1Z2luIEltcGxlbWVudGF0aW9uCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3N0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCitGb3JtYXQoKSB7CisJcmV0dXJuICJQQ0QiOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgorRGVzY3JpcHRpb24oKSB7CisJcmV0dXJuICJLb2RhayBQaG90b0NEIjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKK0V4dGVuc2lvbigpIHsKKwlyZXR1cm4gInBjZCI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCitSZWdFeHByKCkgeworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgorTWltZVR5cGUoKSB7CisJcmV0dXJuICJpbWFnZS94LXBob3RvLWNkIjsKK30KKworc3RhdGljIEJPT0wgRExMX0NBTExDT05WCitTdXBwb3J0c0V4cG9ydERlcHRoKGludCBkZXB0aCkgeworCXJldHVybiBGQUxTRTsKK30KKworc3RhdGljIEJPT0wgRExMX0NBTExDT05WIAorU3VwcG9ydHNFeHBvcnRUeXBlKEZSRUVfSU1BR0VfVFlQRSB0eXBlKSB7CisJcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYKK1N1cHBvcnRzTm9QaXhlbHMoKSB7CisJcmV0dXJuIFRSVUU7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIEZJQklUTUFQICogRExMX0NBTExDT05WCitMb2FkKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSwgaW50IHBhZ2UsIGludCBmbGFncywgdm9pZCAqZGF0YSkgeworCUZJQklUTUFQICpkaWIgPSBOVUxMOworCXVuc2lnbmVkIHdpZHRoOworCXVuc2lnbmVkIGhlaWdodDsKKwljb25zdCB1bnNpZ25lZCBicHAgPSAyNDsKKwlpbnQgc2Nhbl9saW5lX2FkZCAgID0gMTsKKwlpbnQgc3RhcnRfc2Nhbl9saW5lID0gMDsKKwkKKwlCWVRFICp5MSA9IE5VTEwsICp5MiA9IE5VTEwsICpjYmNyID0gTlVMTDsKKworCUJPT0wgaGVhZGVyX29ubHkgPSAoZmxhZ3MgJiBGSUZfTE9BRF9OT1BJWEVMUykgPT0gRklGX0xPQURfTk9QSVhFTFM7CisKKwkvLyB0byBtYWtlIGFic29sdXRlIHNlZWtzIHBvc3NpYmxlIHdlIHN0b3JlIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBmaWxlCisJCisJbG9uZyBvZmZzZXRfaW5fZmlsZSA9IGlvLT50ZWxsX3Byb2MoaGFuZGxlKTsKKwlsb25nIHNlZWsgPSAwOworCisJLy8gZGVjaWRlIHdoaWNoIGJpdG1hcCBpbiB0aGUgY2FiaW5ldCB0byBsb2FkCisKKwlzd2l0Y2ggKGZsYWdzKSB7CisJCWNhc2UgUENEX0JBU0VESVY0IDoKKwkJCXNlZWsgPSAweDIwMDA7CisJCQl3aWR0aCA9IDE5MjsKKwkJCWhlaWdodCA9IDEyODsKKwkJCWJyZWFrOworCisJCWNhc2UgUENEX0JBU0VESVYxNiA6CisJCQlzZWVrID0gMHhCODAwOworCQkJd2lkdGggPSAzODQ7CisJCQloZWlnaHQgPSAyNTY7CisJCQlicmVhazsKKworCQlkZWZhdWx0IDoKKwkJCXNlZWsgPSAweDMwMDAwOworCQkJd2lkdGggPSA3Njg7CisJCQloZWlnaHQgPSA1MTI7CisJCQlicmVhazsKKwl9CisKKwl0cnkgeworCQkvLyBhbGxvY2F0ZSB0aGUgZGliIGFuZCB3cml0ZSBvdXQgdGhlIGhlYWRlcgorCQlkaWIgPSBGcmVlSW1hZ2VfQWxsb2NhdGVIZWFkZXIoaGVhZGVyX29ubHksIHdpZHRoLCBoZWlnaHQsIGJwcCwgRklfUkdCQV9SRURfTUFTSywgRklfUkdCQV9HUkVFTl9NQVNLLCBGSV9SR0JBX0JMVUVfTUFTSyk7CisJCWlmKCFkaWIpIHRocm93IEZJX01TR19FUlJPUl9ESUJfTUVNT1JZOworCisJCWlmKGhlYWRlcl9vbmx5KSB7CisJCQlyZXR1cm4gZGliOworCQl9CisKKwkJLy8gY2hlY2sgaWYgdGhlIFBDRCBpcyBib3R0b20tdXAKKworCQlpZiAoVmVydGljYWxPcmllbnRhdGlvbihpbywgaGFuZGxlKSkgeworCQkJc2Nhbl9saW5lX2FkZCA9IC0xOworCQkJc3RhcnRfc2Nhbl9saW5lID0gaGVpZ2h0IC0gMTsJCQorCQl9CisKKwkJLy8gdGVtcG9yYXJ5IHN0dWZmIHRvIGxvYWQgUENECisKKwkJQllURSAqeTEgPSAoQllURSopbWFsbG9jKHdpZHRoICogc2l6ZW9mKEJZVEUpKTsKKwkJQllURSAqeTIgPSAoQllURSopbWFsbG9jKHdpZHRoICogc2l6ZW9mKEJZVEUpKTsKKwkJQllURSAqY2JjciA9IChCWVRFKiltYWxsb2Mod2lkdGggKiBzaXplb2YoQllURSkpOworCQlpZigheTEgfHwgIXkyIHx8ICFjYmNyKSB0aHJvdyBGSV9NU0dfRVJST1JfTUVNT1JZOworCisJCUJZVEUgKnlsW10gPSB7IHkxLCB5MiB9OworCisJCS8vIHNlZWsgdG8gdGhlIHBhcnQgd2hlcmUgdGhlIGJpdG1hcCBkYXRhIGJlZ2lucworCisJCWlvLT5zZWVrX3Byb2MoaGFuZGxlLCBvZmZzZXRfaW5fZmlsZSwgU0VFS19TRVQpOworCQlpby0+c2Vla19wcm9jKGhhbmRsZSwgc2VlaywgU0VFS19DVVIpOworCisJCS8vIHJlYWQgdGhlIGRhdGEKKworCQlmb3IgKHVuc2lnbmVkIHkgPSAwOyB5IDwgaGVpZ2h0IC8gMjsgeSsrKSB7CisJCQlpby0+cmVhZF9wcm9jKHkxLCB3aWR0aCwgMSwgaGFuZGxlKTsKKwkJCWlvLT5yZWFkX3Byb2MoeTIsIHdpZHRoLCAxLCBoYW5kbGUpOworCQkJaW8tPnJlYWRfcHJvYyhjYmNyLCB3aWR0aCwgMSwgaGFuZGxlKTsKKworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJCQlCWVRFICpiaXRzID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgc3RhcnRfc2Nhbl9saW5lKTsKKwkJCQlmb3IgKHVuc2lnbmVkIHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworCQkJCQlpbnQgciwgZywgYjsKKworCQkJCQlZVVYyUkdCKHlsW2ldW3hdLCBjYmNyW3ggLyAyXSwgY2Jjclsod2lkdGggLyAyKSArICh4IC8gMildLCByLCBnLCBiKTsKKworCQkJCQliaXRzW0ZJX1JHQkFfQkxVRV0gID0gKEJZVEUpYjsKKwkJCQkJYml0c1tGSV9SR0JBX0dSRUVOXSA9IChCWVRFKWc7CisJCQkJCWJpdHNbRklfUkdCQV9SRURdICAgPSAoQllURSlyOworCQkJCQliaXRzICs9IDM7CisJCQkJfQorCisJCQkJc3RhcnRfc2Nhbl9saW5lICs9IHNjYW5fbGluZV9hZGQ7CisJCQl9CisJCX0KKworCQlmcmVlKGNiY3IpOworCQlmcmVlKHkyKTsKKwkJZnJlZSh5MSk7CisKKwkJcmV0dXJuIGRpYjsKKworCX0gY2F0Y2goY29uc3QgY2hhciAqdGV4dCkgeworCQlpZihkaWIpIEZyZWVJbWFnZV9VbmxvYWQoZGliKTsKKwkJaWYoY2JjcikgZnJlZShjYmNyKTsKKwkJaWYoeTIpIGZyZWUoeTIpOworCQlpZih5MSkgZnJlZSh5MSk7CisKKwkJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKHNfZm9ybWF0X2lkLCB0ZXh0KTsKKworCQlyZXR1cm4gTlVMTDsKKwl9Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICAgSW5pdAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit2b2lkIERMTF9DQUxMQ09OVgorSW5pdFBDRChQbHVnaW4gKnBsdWdpbiwgaW50IGZvcm1hdF9pZCkgeworCXNfZm9ybWF0X2lkID0gZm9ybWF0X2lkOworCisJcGx1Z2luLT5mb3JtYXRfcHJvYyA9IEZvcm1hdDsKKwlwbHVnaW4tPmRlc2NyaXB0aW9uX3Byb2MgPSBEZXNjcmlwdGlvbjsKKwlwbHVnaW4tPmV4dGVuc2lvbl9wcm9jID0gRXh0ZW5zaW9uOworCXBsdWdpbi0+cmVnZXhwcl9wcm9jID0gUmVnRXhwcjsKKwlwbHVnaW4tPm9wZW5fcHJvYyA9IE5VTEw7CisJcGx1Z2luLT5jbG9zZV9wcm9jID0gTlVMTDsKKwlwbHVnaW4tPnBhZ2Vjb3VudF9wcm9jID0gTlVMTDsKKwlwbHVnaW4tPnBhZ2VjYXBhYmlsaXR5X3Byb2MgPSBOVUxMOworCXBsdWdpbi0+bG9hZF9wcm9jID0gTG9hZDsKKwlwbHVnaW4tPnNhdmVfcHJvYyA9IE5VTEw7CisJcGx1Z2luLT52YWxpZGF0ZV9wcm9jID0gTlVMTDsKKwlwbHVnaW4tPm1pbWVfcHJvYyA9IE1pbWVUeXBlOworCXBsdWdpbi0+c3VwcG9ydHNfZXhwb3J0X2JwcF9wcm9jID0gU3VwcG9ydHNFeHBvcnREZXB0aDsKKwlwbHVnaW4tPnN1cHBvcnRzX2V4cG9ydF90eXBlX3Byb2MgPSBTdXBwb3J0c0V4cG9ydFR5cGU7CisJcGx1Z2luLT5zdXBwb3J0c19pY2NfcHJvZmlsZXNfcHJvYyA9IE5VTEw7CisJcGx1Z2luLT5zdXBwb3J0c19ub19waXhlbHNfcHJvYyA9IFN1cHBvcnRzTm9QaXhlbHM7Cit9CmRpZmYgLS1naXQgYS9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL1BsdWdpblBDWC5jcHAgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL1BsdWdpblBDWC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q3NTYyOQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvUGx1Z2luUENYLmNwcApAQCAtMCwwICsxLDY1OSBAQAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gUENYIExvYWRlcgorLy8KKy8vIERlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gYnkKKy8vIC0gRmxvcmlzIHZhbiBkZW4gQmVyZyAoZmx2ZGJlcmdAd3hzLm5sKQorLy8gLSBKYW5pIEthamFsYSAoamFuaWtAcmVtZWR5LmZpKQorLy8gLSBNYXJrdXMgTG9pYmwgKG1hcmt1cy5sb2libEBlcG9zdC5kZSkKKy8vIC0gSGVydukgRHJvbG9uIChkcm9sb25AaW5mb25pZS5mcikKKy8vIC0gSnVlcmdlbiBSaWVja2VyIChqLnJpZWNrZXJAZ214LmRlKQorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZyZWVJbWFnZSAzCisvLworLy8gQ09WRVJFRCBDT0RFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZCisvLyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUworLy8gVEhBVCBUSEUgQ09WRVJFRCBDT0RFIElTIEZSRUUgT0YgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisvLyBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRAorLy8gQ09ERSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVAorLy8gVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GIEFOWSBORUNFU1NBUlkKKy8vIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwKKy8vIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIKKy8vIFRISVMgRElTQ0xBSU1FUi4KKy8vCisvLyBVc2UgYXQgeW91ciBvd24gcmlzayEKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2luY2x1ZGUgIkZyZWVJbWFnZS5oIgorI2luY2x1ZGUgIlV0aWxpdGllcy5oIgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgIENvbnN0YW50cyArIGhlYWRlcnMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBJT19CVUZfU0laRQkyMDQ4CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmIF9XSU4zMgorI3ByYWdtYSBwYWNrKHB1c2gsIDEpCisjZWxzZQorI3ByYWdtYSBwYWNrKDEpCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgdGFnUENYSEVBREVSIHsKKwlCWVRFICBtYW51ZmFjdHVyZXI7CQkvLyBNYWdpYyBudW1iZXIgKDB4MEEgPSBaU29mdCBaKQorCUJZVEUgIHZlcnNpb247CQkJLy8gVmVyc2lvbgkwID09IDIuNQorCQkJCQkJCS8vICAgICAgICAgIDIgPT0gMi44IHdpdGggcGFsZXR0ZSBpbmZvCisJCQkJCQkJLy8gICAgICAgICAgMyA9PSAyLjggd2l0aG91dCBwYWxldHRlIGluZm8KKwkJCQkJCQkvLyAgICAgICAgICA1ID09IDMuMCB3aXRoIHBhbGV0dGUgaW5mbworCUJZVEUgIGVuY29kaW5nOwkJCS8vIEVuY29kaW5nOiAwID0gdW5jb21wcmVzc2VkLCAxID0gUENYIHJsZSBjb21wcmVzc2VkCisJQllURSAgYnBwOwkJCQkvLyBCaXRzIHBlciBwaXhlbCBwZXIgcGxhbmUgKG9ubHkgMSBvciA4KQorCVdPUkQgIHdpbmRvd1s0XTsJCS8vIGxlZnQsIHVwcGVyLCByaWdodCxsb3dlciBwaXhlbCBjb29yZC4KKwlXT1JEICBoZHBpOwkJCQkvLyBIb3Jpem9udGFsIHJlc29sdXRpb24KKwlXT1JEICB2ZHBpOwkJCQkvLyBWZXJ0aWNhbCByZXNvbHV0aW9uCisJQllURSAgY29sb3JfbWFwWzQ4XTsJLy8gQ29sb3JtYXAgZm9yIDE2LWNvbG9yIGltYWdlcworCUJZVEUgIHJlc2VydmVkOworCUJZVEUgIHBsYW5lczsJCQkvLyBOdW1iZXIgb2YgcGxhbmVzICgxLCAzIG9yIDQpCisJV09SRCAgYnl0ZXNfcGVyX2xpbmU7CS8vIEJ5dGVzIHBlciByb3cgKGFsd2F5cyBldmVuKQorCVdPUkQgIHBhbGV0dGVfaW5mbzsJCS8vIFBhbGV0dGUgaW5mb3JtYXRpb24gKDEgPSBjb2xvciBvciBiJnc7IDIgPSBncmF5IHNjYWxlKQorCVdPUkQgIGhfc2NyZWVuX3NpemU7CisJV09SRCAgdl9zY3JlZW5fc2l6ZTsKKwlCWVRFICBmaWxsZXJbNTRdOwkJLy8gUmVzZXJ2ZWQgZmlsbGVyCit9IFBDWEhFQURFUjsKKwkJCisjaWZkZWYgX1dJTjMyCisjcHJhZ21hIHBhY2socG9wKQorI2Vsc2UKKyNwcmFnbWEgcGFjaygpCisjZW5kaWYKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gSW50ZXJuYWwgZnVuY3Rpb25zCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3N0YXRpYyBCT09MIAorcGN4X3ZhbGlkYXRlKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSkgeworCUJZVEUgcGN4X3NpZ25hdHVyZSA9IDB4MEE7CisJQllURSBzaWduYXR1cmVbNF0gPSB7IDAsIDAsIDAsIDAgfTsKKworCWlmKGlvLT5yZWFkX3Byb2MoJnNpZ25hdHVyZSwgMSwgNCwgaGFuZGxlKSAhPSA0KSB7CisJCXJldHVybiBGQUxTRTsKKwl9CisJLy8gbWFnaWMgbnVtYmVyICgweDBBID0gWlNvZnQgWikKKwlpZihzaWduYXR1cmVbMF0gPT0gcGN4X3NpZ25hdHVyZSkgeworCQkvLyB2ZXJzaW9uCisJCWlmKHNpZ25hdHVyZVsxXSA8PSA1KSB7CisJCQkvLyBlbmNvZGluZworCQkJaWYoKHNpZ25hdHVyZVsyXSA9PSAwKSB8fCAoc2lnbmF0dXJlWzJdID09IDEpKSB7CisJCQkJLy8gYml0cyBwZXIgcGl4ZWwgcGVyIHBsYW5lCisJCQkJaWYoKHNpZ25hdHVyZVszXSA9PSAxKSB8fCAoc2lnbmF0dXJlWzNdID09IDgpKSB7CisJCQkJCXJldHVybiBUUlVFOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBGQUxTRTsKK30KKworc3RhdGljIHVuc2lnbmVkCityZWFkbGluZShGcmVlSW1hZ2VJTyAmaW8sIGZpX2hhbmRsZSBoYW5kbGUsIEJZVEUgKmJ1ZmZlciwgdW5zaWduZWQgbGVuZ3RoLCBCT09MIHJsZSwgQllURSAqIFJlYWRCdWYsIGludCAqIFJlYWRQb3MpIHsKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCisJLy8gUmVhZCBlaXRoZXIgcnVuLWxlbmd0aCBlbmNvZGVkIG9yIG5vcm1hbCBpbWFnZSBkYXRhICAgICAgICAvLworCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKwkvLyAgICAgICBUSElTIElTIEhPVyBSVU5USU1FIExFTkdUSCBFTkNPRElORyBXT1JLUyBJTiBQQ1g6ICAgIC8vCisJLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworCS8vICAxKSBJZiB0aGUgdXBwZXIgMiBiaXRzIG9mIGEgYnl0ZSBhcmUgc2V0LCAgICAgICAgICAgICAgICAgLy8KKwkvLyAgICAgdGhlIGxvd2VyIDYgYml0cyBzcGVjaWZ5IHRoZSBjb3VudCBmb3IgdGhlIG5leHQgYnl0ZSAgIC8vCisJLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworCS8vICAyKSBJZiB0aGUgdXBwZXIgMiBiaXRzIG9mIHRoZSBieXRlIGFyZSBjbGVhciwgICAgICAgICAgICAgLy8KKwkvLyAgICAgdGhlIGJ5dGUgaXMgYWN0dWFsIGRhdGEgd2l0aCBhIGNvdW50IG9mIDEgICAgICAgICAgICAgIC8vCisJLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworCS8vICBOb3RlIHRoYXQgYSBzY2FubGluZSBhbHdheXMgaGFzIGFuIGV2ZW4gbnVtYmVyIG9mIGJ5dGVzICAgLy8KKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwlCWVRFIGNvdW50ID0gMCwgdmFsdWUgPSAwOworCXVuc2lnbmVkIHdyaXR0ZW4gPSAwOworCisJaWYgKHJsZSkgeworCQkvLyBydW4tbGVuZ3RoIGVuY29kZWQgcmVhZAorCisJCXdoaWxlIChsZW5ndGgtLSkgeworCQkJaWYgKGNvdW50ID09IDApIHsKKwkJCQlpZiAoKlJlYWRQb3MgPj0gSU9fQlVGX1NJWkUgLSAxICkgeworCQkJCQlpZiAoKlJlYWRQb3MgPT0gSU9fQlVGX1NJWkUgLSAxKSB7CisJCQkJCQkvLyB3ZSBzdGlsbCBoYXZlIG9uZSBCWVRFLCBjb3B5IGl0IHRvIHRoZSBzdGFydCBwb3MKKworCQkJCQkJKlJlYWRCdWYgPSBSZWFkQnVmW0lPX0JVRl9TSVpFIC0gMV07CisKKwkJCQkJCWlvLnJlYWRfcHJvYyhSZWFkQnVmICsgMSwgMSwgSU9fQlVGX1NJWkUgLSAxLCBoYW5kbGUpOworCQkJCQl9IGVsc2UgeworCQkJCQkJLy8gcmVhZCB0aGUgY29tcGxldGUgYnVmZmVyCisKKwkJCQkJCWlvLnJlYWRfcHJvYyhSZWFkQnVmLCAxLCBJT19CVUZfU0laRSwgaGFuZGxlKTsKKwkJCQkJfQorCisJCQkJCSpSZWFkUG9zID0gMDsKKwkJCQl9CisKKwkJCQl2YWx1ZSA9ICooUmVhZEJ1ZiArICgqUmVhZFBvcykrKyk7CisKKwkJCQlpZiAoKHZhbHVlICYgMHhDMCkgPT0gMHhDMCkgeworCQkJCQljb3VudCA9IHZhbHVlICYgMHgzRjsKKwkJCQkJdmFsdWUgPSAqKFJlYWRCdWYgKyAoKlJlYWRQb3MpKyspOworCQkJCX0gZWxzZSB7CisJCQkJCWNvdW50ID0gMTsKKwkJCQl9CisJCQl9CisKKwkJCWNvdW50LS07CisKKwkJCSooYnVmZmVyICsgd3JpdHRlbisrKSA9IHZhbHVlOworCQl9CisKKwl9IGVsc2UgeworCQkvLyBub3JtYWwgcmVhZAorCisJCXdyaXR0ZW4gPSBpby5yZWFkX3Byb2MoYnVmZmVyLCBsZW5ndGgsIDEsIGhhbmRsZSk7CisJfQorCisJcmV0dXJuIHdyaXR0ZW47Cit9CisKKyNpZmRlZiBGUkVFSU1BR0VfQklHRU5ESUFOCitzdGF0aWMgdm9pZAorU3dhcEhlYWRlcihQQ1hIRUFERVIgKmhlYWRlcikgeworCVN3YXBTaG9ydCgmaGVhZGVyLT53aW5kb3dbMF0pOworCVN3YXBTaG9ydCgmaGVhZGVyLT53aW5kb3dbMV0pOworCVN3YXBTaG9ydCgmaGVhZGVyLT53aW5kb3dbMl0pOworCVN3YXBTaG9ydCgmaGVhZGVyLT53aW5kb3dbM10pOworCVN3YXBTaG9ydCgmaGVhZGVyLT5oZHBpKTsKKwlTd2FwU2hvcnQoJmhlYWRlci0+dmRwaSk7CisJU3dhcFNob3J0KCZoZWFkZXItPmJ5dGVzX3Blcl9saW5lKTsKKwlTd2FwU2hvcnQoJmhlYWRlci0+cGFsZXR0ZV9pbmZvKTsKKwlTd2FwU2hvcnQoJmhlYWRlci0+aF9zY3JlZW5fc2l6ZSk7CisJU3dhcFNob3J0KCZoZWFkZXItPnZfc2NyZWVuX3NpemUpOworfQorI2VuZGlmCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFBsdWdpbiBJbnRlcmZhY2UKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3RhdGljIGludCBzX2Zvcm1hdF9pZDsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gUGx1Z2luIEltcGxlbWVudGF0aW9uCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8qIQorICAgIFJldHVybnMgdGhlIGZvcm1hdCBzdHJpbmcgZm9yIHRoZSBwbHVnaW4uIEVhY2ggcGx1Z2luLAorCWJvdGggaW50ZXJuYWwgaW4gdGhlIERMTCBhbmQgZXh0ZXJuYWwgaW4gYSAuZmlwIGZpbGUsIG11c3QgaGF2ZQorCWEgdW5pcXVlIGZvcm1hdCBzdHJpbmcgdG8gYmUgYWRkcmVzc2FibGUuCisqLworCitzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgorRm9ybWF0KCkgeworCXJldHVybiAiUENYIjsKK30KKworLyohCisgICAgUmV0dXJucyBhIGRlc2NyaXB0aW9uIHN0cmluZyBmb3IgdGhlIHBsdWdpbi4gVGhvdWdoIGEKKwlkZXNjcmlwdGlvbiBpcyBub3QgbmVjZXNzYXJ5IHBlci1zZSwKKwlpdCBpcyBhZHZpc2VkIHRvIHJldHVybiBhbiB1bmlxdWUgc3RyaW5nIGluIG9yZGVyIHRvIHRlbGwgdGhlCisJdXNlciB3aGF0IHR5cGUgb2YgYml0bWFwcyB0aGlzIHBsdWdpbiB3aWxsIHJlYWQgYW5kL29yIHdyaXRlLgorKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKK0Rlc2NyaXB0aW9uKCkgeworCXJldHVybiAiWnNvZnQgUGFpbnRicnVzaCI7Cit9CisKKy8qIQorICAgIFJldHVybnMgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBmaWxlCisJZXh0ZW5zaW9ucyBpbmRpY2F0aW5nIHdoYXQgZmlsZXMgdGhpcyBwbHVnaW4gY2FuIG9wZW4uIFRoZQorCWxpc3QsIGJlaW5nIHVzZWQgYnkgRnJlZUltYWdlX0dldEZJRkZyb21GaWxlbmFtZSwgaXMgdXN1YWxseQorCXVzZWQgYXMgYSBsYXN0IHJlc29ydCBpbiBmaW5kaW5nIHRoZSB0eXBlIG9mIHRoZSBiaXRtYXAgd2UKKwlhcmUgZGVhbGluZyB3aXRoLiBCZXN0IGlzIHRvIGNoZWNrIHRoZSBmaXJzdCBmZXcgYnl0ZXMgb24KKwl0aGUgbG93LWxldmVsIGJpdHMgbGV2ZWwgZmlyc3QgYW5kIGNvbXBhcmUgdGhlbSB3aXRoIGEga25vd24KKwlzaWduYXR1cmUgLiBJZiB0aGlzIGZhaWxzLCBGcmVlSW1hZ2VfR2V0RklGRnJvbUZpbGVuYW1lIGNhbiBiZQorCXVzZWQuCisqLworCitzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgorRXh0ZW5zaW9uKCkgeworCXJldHVybiAicGN4IjsKK30KKworLyohCisgICAgUmV0dXJucyBhbiAob3B0aW9uYWwpIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBoZWxwCisJc29mdHdhcmUgaWRlbnRpZnlpbmcgYSBiaXRtYXAgdHlwZS4gVGhlCisJZXhwcmVzc2lvbiBjYW4gYmUgYXBwbGllZCB0byB0aGUgZmlyc3QgZmV3IGJ5dGVzIChoZWFkZXIpIG9mCisJdGhlIGJpdG1hcC4gRnJlZUltYWdlIGlzIG5vdCBjYXBhYmxlIG9mIHByb2Nlc3NpbmcgcmVndWxhciBleHByZXNzaW9uIGl0c2VsZiwKKwlidXQgRnJlZUltYWdlUXQsIHRoZSBGcmVlSW1hZ2UgVHJvbGx0ZWNoIHN1cHBvcnQgbGlicmFyeSwgY2FuLiBJZiBSZWdFeHByCisJcmV0dXJucyBOVUxMLCBGcmVlSW1hZ2VRdCB3aWxsIGF1dG9tYXRpY2FsbHkgYnlwYXNzIFRyb2xsdGVjaCdzIHJlZ3VsYXIKKwlleHByZXNzaW9uIHN1cHBvcnQgYW5kIHVzZSBpdHMgaW50ZXJuYWwgZnVuY3Rpb25zIHRvIGZpbmQgdGhlIGJpdG1hcCB0eXBlLgorKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKK1JlZ0V4cHIoKSB7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCitNaW1lVHlwZSgpIHsKKwlyZXR1cm4gImltYWdlL3gtcGN4IjsKK30KKworLyohCisgICAgVmFsaWRhdGVzIGEgYml0bWFwIGJ5IHJlYWRpbmcgdGhlIGZpcnN0IGZldyBieXRlcworCWFuZCBjb21wYXJpbmcgdGhlbSB3aXRoIGEga25vd24gYml0bWFwIHNpZ25hdHVyZS4KKwlUUlVFIGlzIHJldHVybmVkIGlmIHRoZSBieXRlcyBtYXRjaCB0aGUgc2lnbmF0dXJlLCBGQUxTRSBvdGhlcndpc2UuCisJVGhlIFZhbGlkYXRlIGZ1bmN0aW9uIGlzIHVzZWQgYnkgdXNpbmcgRnJlZUltYWdlX0dldEZpbGVUeXBlLgorCQorCU5vdGU6IGEgcGx1Z2luIGNhbiBzYWZlbHkgcmVhZCBkYXRhIGFueSBkYXRhIGZyb20gdGhlIGJpdG1hcCB3aXRob3V0IHNlZWtpbmcgYmFjaworCXRvIHRoZSBvcmlnaW5hbCBlbnRyeSBwb2ludDsgdGhlIGVudHJ5IHBvaW50IGlzIHN0b3JlZCBwcmlvciB0byBjYWxsaW5nIHRoaXMKKwlmdW5jdGlvbiBhbmQgcmVzdG9yZWQgYWZ0ZXIuCisKKyAgICBOb3RlOiBiZWNhdXNlIG9mIEZyZWVJbWFnZSdzIGlvIHJlZGlyZWN0aW9uIHN1cHBvcnQsIHRoZSBoZWFkZXIgZm9yIHRoZSBiaXRtYXAKKwltdXN0IGJlIG9uIHRoZSBzdGFydCBvZiB0aGUgYml0bWFwIG9yIGF0IGxlYXN0IG9uIGEga25vd24gcGFydCBpbiB0aGUgYml0bWFwLiBJdCBpcworCWZvcmJpZGRlbiB0byBzZWVrIHRvIHRoZSBlbmQgb2YgdGhlIGJpdG1hcCBvciB0byBhIHBvaW50IHJlbGF0aXZlIHRvIHRoZSBlbmQgb2YgYSBiaXRtYXAsCisJYmVjYXVzZSB0aGUgZW5kIG9mIHRoZSBiaXRtYXAgaXMgbm90IGFsd2F5cyBrbm93bi4KKyovCisKK3N0YXRpYyBCT09MIERMTF9DQUxMQ09OVgorVmFsaWRhdGUoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlKSB7CisJcmV0dXJuIHBjeF92YWxpZGF0ZShpbywgaGFuZGxlKTsKK30KKworLyohCisgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvICdhc2snIHRoZSBwbHVnaW4gaWYgaXQgY2FuIHdyaXRlCisJYSBiaXRtYXAgaW4gYSBjZXJ0YWluIGJpdGRlcHRoLiBEaWZmZXJlbnQgYml0bWFwIHR5cGVzIGhhdmUgZGlmZmVyZW50CisJY2FwYWJpbGl0aWVzLCBmb3IgZXhhbXBsZSBub3QgYWxsIGZvcm1hdHMgYWxsb3cgd3JpdGluZyBpbiBwYWxldHRpemVkIG1vZGUuCisJVGhpcyBmdW5jdGlvbiBpcyB0aGVyZSBwcm92aWRlIGFuIHVuaWZvcm0gaW50ZXJmYWNlIHRvIHRoZSBwbHVnaW4ncworCWNhcGFiaWxpdGllcy4gU3VwcG9ydHNFeHBvcnREZXB0aCByZXR1cm5zIFRSVUUgaWYgdGhlIHBsdWdpbiBzdXBwb3J0IHdyaXRpbmcKKwlpbiB0aGUgYXNrZWQgYml0ZGVwdGgsIG9yIEZBTFNFIGlmIGl0IGRvZXNuJ3QuIFRoZSBmdW5jdGlvbiBhbHNvCisJcmV0dXJucyBGQUxTRSBpZiBiaXRtYXAgc2F2aW5nIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHBsdWdpbiBhdCBhbGwuCisqLworCitzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYKK1N1cHBvcnRzRXhwb3J0RGVwdGgoaW50IGRlcHRoKSB7CisJcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYgCitTdXBwb3J0c0V4cG9ydFR5cGUoRlJFRV9JTUFHRV9UWVBFIHR5cGUpIHsKKwlyZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBCT09MIERMTF9DQUxMQ09OVgorU3VwcG9ydHNOb1BpeGVscygpIHsKKwlyZXR1cm4gVFJVRTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKiEKKyAgICBMb2FkcyBhIGJpdG1hcCBpbnRvIG1lbW9yeS4gT24gZW50cnkgaXQgaXMgYXNzdW1lZCB0aGF0CisJdGhlIGJpdG1hcCB0byBiZSBsb2FkZWQgaXMgb2YgdGhlIGNvcnJlY3QgdHlwZS4gSWYgdGhlIGJpdG1hcAorCWlzIG9mIGFuIGluY29ycmVjdCB0eXBlLCB0aGUgcGx1Z2luIG1pZ2h0IG5vdCBncmFjZWZ1bGx5IGZhaWwgYnV0CisJY3Jhc2ggb3IgZW50ZXIgYW4gZW5kbGVzcyBsb29wLiBJdCBpcyBhbHNvIGFzc3VtZWQgdGhhdCBhbGwKKwl0aGUgYml0bWFwIGRhdGEgaXMgYXZhaWxhYmxlIGF0IG9uZSB0aW1lLiBJZiB0aGUgYml0bWFwIGlzIG5vdCBjb21wbGV0ZSwKKwlmb3IgZXhhbXBsZSBiZWNhdXNlIGl0IGlzIGJlaW5nIGRvd25sb2FkZWQgd2hpbGUgbG9hZGVkLCB0aGUgcGx1Z2luCisJbWlnaHQgYWxzbyBub3QgZ3JhY2VmdWxseSBmYWlsLgorCisJVGhlIExvYWQgZnVuY3Rpb24gaGFzIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKKworICAgIFRoZSBmaXJzdCBwYXJhbWV0ZXIgKEZyZWVJbWFnZUlPICppbykgaXMgYSBzdHJ1Y3R1cmUgcHJvdmlkaW5nCisJZnVuY3Rpb24gcG9pbnRlcnMgaW4gb3JkZXIgdG8gbWFrZSB1c2Ugb2YgRnJlZUltYWdlJ3MgSU8gcmVkaXJlY3Rpb24uIFVzaW5nCisJRnJlZUltYWdlJ3MgZmlsZSBpL28gZnVuY3Rpb25zIGluc3RlYWQgb2Ygc3RhbmRhcmQgb25lcyBpdCBpcyBnYXJhbnR1ZWVkCisJdGhhdCBhbGwgYml0bWFwIHR5cGVzLCBib3RoIGN1cnJlbnQgYW5kIGZ1dHVyZSBvbmVzLCBjYW4gYmUgbG9hZGVkIGZyb20KKwltZW1vcnksIGZpbGUgY2FiaW5ldHMsIHRoZSBpbnRlcm5ldCBhbmQgbW9yZS4gVGhlIHNlY29uZCBwYXJhbWV0ZXIgKGZpX2hhbmRsZSBoYW5kbGUpCisJaXMgYSBjb21wYW5pb24gb2YgRnJlZUltYWdlSU8gYW5kIGNhbiBiZSBiZXN0IGNvbXBhcmVkIHdpdGggdGhlIHN0YW5kYXJkIEZJTEUqIHR5cGUsCisJaW4gYSBnZW5lcmFsaXplZCBmb3JtLgorCisJVGhlIHRoaXJkIHBhcmFtZXRlciAoaW50IHBhZ2UpIGluZGljYXRlcyB3ZXRoZXIgd2Ugd2lsbCBiZSBsb2FkaW5nIGEgY2VydGFpbiBwYWdlCisJaW4gdGhlIGJpdG1hcCBvciBpZiB3ZSB3aWxsIGxvYWQgdGhlIGRlZmF1bHQgb25lLiBUaGlzIHBhcmFtZXRlciBpcyBvbmx5IHVzZWQgaWYKKwl0aGUgcGx1Z2luIHN1cHBvcnRzIG11bHRpLXBhZ2VkIGJpdG1hcHMsIGUuZy4gY2FiaW5ldCBiaXRtYXBzIHRoYXQgY29udGFpbiBhIHNlcmllcworCW9mIGltYWdlcyBvciBwYWdlcy4gSWYgdGhlIHBsdWdpbiBkb2VzIHN1cHBvcnQgbXVsdGktcGFnaW5nLCB0aGUgcGFnZSBwYXJhbWV0ZXIKKwljYW4gY29udGFpbiBlaXRoZXIgYSBudW1iZXIgaGlnaGVyIG9yIGVxdWFsIHRvIDAgdG8gbG9hZCBhIGNlcnRhaW4gcGFnZSwgb3IgLTEgdG8gCisJbG9hZCB0aGUgZGVmYXVsdCBwYWdlLiBJZiB0aGUgcGx1Z2luIGRvZXMgbm90IHN1cHBvcnQgbXVsdGktcGFnaW5nLAorCXRoZSBwYWdlIHBhcmFtZXRlciBpcyBhbHdheXMgLTEuCisJCisJVGhlIGZvdXJ0aCBwYXJhbWV0ZXIgKGludCBmbGFncykgbWFuaXB1bGF0ZXMgdGhlIGxvYWQgZnVuY3Rpb24gdG8gbG9hZCBhIGJpdG1hcAorCWluIGEgY2VydGFpbiB3YXkuIEV2ZXJ5IHBsdWdpbiBoYXMgYSBkaWZmZXJlbnQgZmxhZyBwYXJhbWV0ZXIgd2l0aCBkaWZmZXJlbnQgbWVhbmluZ3MuCisKKwlUaGUgbGFzdCBwYXJhbWV0ZXIgKHZvaWQgKmRhdGEpIGNhbiBjb250YWluIGEgc3BlY2lhbCBkYXRhIGJsb2NrIHVzZWQgd2hlbgorCXRoZSBmaWxlIGlzIHJlYWQgbXVsdGktcGFnZWQuIEJlY2F1c2Ugbm90IGV2ZXJ5IHBsdWdpbiBzdXBwb3J0cyBtdWx0aS1wYWdpbmcKKwlub3QgZXZlcnkgcGx1Z2luIHdpbGwgdXNlIHRoZSBkYXRhIHBhcmFtZXRlciBhbmQgaXQgd2lsbCBiZSBzZXQgdG8gTlVMTC5Ib3dldmVyLAorCXdoZW4gdGhlIHBsdWdpbiBkb2VzIHN1cHBvcnQgbXVsdGktcGFnaW5nIHRoZSBwYXJhbWV0ZXIgY29udGFpbnMgYSBwb2ludGVyIHRvIGEKKwlibG9jayBvZiBkYXRhIGFsbG9jYXRlZCBieSB0aGUgT3BlbiBmdW5jdGlvbi4KKyovCisKK3N0YXRpYyBGSUJJVE1BUCAqIERMTF9DQUxMQ09OVgorTG9hZChGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIGludCBwYWdlLCBpbnQgZmxhZ3MsIHZvaWQgKmRhdGEpIHsKKwlGSUJJVE1BUCAqZGliID0gTlVMTDsKKwlCWVRFICpiaXRzOwkJCSAgLy8gUG9pbnRlciB0byBkaWIgZGF0YQorCVJHQlFVQUQgKnBhbDsJCSAgLy8gUG9pbnRlciB0byBkaWIgcGFsZXR0ZQorCUJZVEUgKmxpbmUgPSBOVUxMOwkgIC8vIFBDWCByYXN0ZXIgbGluZQorCUJZVEUgKlJlYWRCdWYgPSBOVUxMOyAvLyBidWZmZXI7CisJQk9PTCBiSXNSTEU7CQkgIC8vIFRydWUgaWYgdGhlIGZpbGUgaXMgcnVuLWxlbmd0aCBlbmNvZGVkCisKKwlpZighaGFuZGxlKSB7CisJCXJldHVybiBOVUxMOworCX0KKworCUJPT0wgaGVhZGVyX29ubHkgPSAoZmxhZ3MgJiBGSUZfTE9BRF9OT1BJWEVMUykgPT0gRklGX0xPQURfTk9QSVhFTFM7CisKKwl0cnkgeworCQkvLyBjaGVjayBQQ1ggaWRlbnRpZmllcgorCisJCWxvbmcgc3RhcnRfcG9zID0gaW8tPnRlbGxfcHJvYyhoYW5kbGUpOworCQlCT09MIHZhbGlkYXRlZCA9IHBjeF92YWxpZGF0ZShpbywgaGFuZGxlKTsJCQorCQlpby0+c2Vla19wcm9jKGhhbmRsZSwgc3RhcnRfcG9zLCBTRUVLX1NFVCk7CisJCWlmKCF2YWxpZGF0ZWQpIHsKKwkJCXRocm93IEZJX01TR19FUlJPUl9NQUdJQ19OVU1CRVI7CisJCX0KKworCQkvLyBwcm9jZXNzIHRoZSBoZWFkZXIKKworCQlQQ1hIRUFERVIgaGVhZGVyOworCisJCWlmKGlvLT5yZWFkX3Byb2MoJmhlYWRlciwgc2l6ZW9mKFBDWEhFQURFUiksIDEsIGhhbmRsZSkgIT0gMSkgeworCQkJdGhyb3cgRklfTVNHX0VSUk9SX1BBUlNJTkc7CisJCX0KKyNpZmRlZiBGUkVFSU1BR0VfQklHRU5ESUFOCisJCVN3YXBIZWFkZXIoJmhlYWRlcik7CisjZW5kaWYKKworCQkvLyBhbGxvY2F0ZSBhIG5ldyBESUIKKworCQl1bnNpZ25lZCB3aWR0aCA9IGhlYWRlci53aW5kb3dbMl0gLSBoZWFkZXIud2luZG93WzBdICsgMTsKKwkJdW5zaWduZWQgaGVpZ2h0ID0gaGVhZGVyLndpbmRvd1szXSAtIGhlYWRlci53aW5kb3dbMV0gKyAxOworCQl1bnNpZ25lZCBiaXRjb3VudCA9IGhlYWRlci5icHAgKiBoZWFkZXIucGxhbmVzOworCisJCWlmIChiaXRjb3VudCA9PSAyNCkgeworCQkJZGliID0gRnJlZUltYWdlX0FsbG9jYXRlSGVhZGVyKGhlYWRlcl9vbmx5LCB3aWR0aCwgaGVpZ2h0LCBiaXRjb3VudCwgRklfUkdCQV9SRURfTUFTSywgRklfUkdCQV9HUkVFTl9NQVNLLCBGSV9SR0JBX0JMVUVfTUFTSyk7CisJCX0gZWxzZSB7CisJCQlkaWIgPSBGcmVlSW1hZ2VfQWxsb2NhdGVIZWFkZXIoaGVhZGVyX29ubHksIHdpZHRoLCBoZWlnaHQsIGJpdGNvdW50KTsJCQkKKwkJfQorCisJCS8vIGlmIHRoZSBkaWIgY291bGRuJ3QgYmUgYWxsb2NhdGVkLCB0aHJvdyBhbiBlcnJvcgorCisJCWlmICghZGliKSB7CisJCQl0aHJvdyBGSV9NU0dfRVJST1JfRElCX01FTU9SWTsKKwkJfQorCisJCS8vIG1ldHJpY3MgaGFuZGxpbmcgY29kZQorCisJCUZyZWVJbWFnZV9TZXREb3RzUGVyTWV0ZXJYKGRpYiwgKHVuc2lnbmVkKSAoKChmbG9hdCloZWFkZXIuaGRwaSkgLyAwLjAyNTQwMDAgKyAwLjUpKTsKKwkJRnJlZUltYWdlX1NldERvdHNQZXJNZXRlclkoZGliLCAodW5zaWduZWQpICgoKGZsb2F0KWhlYWRlci52ZHBpKSAvIDAuMDI1NDAwMCArIDAuNSkpOworCisJCS8vIFNldCB1cCB0aGUgcGFsZXR0ZSBpZiBuZWVkZWQKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJCXN3aXRjaChiaXRjb3VudCkgeworCQkJY2FzZSAxOgorCQkJeworCQkJCXBhbCA9IEZyZWVJbWFnZV9HZXRQYWxldHRlKGRpYik7CisJCQkJcGFsWzBdLnJnYlJlZCA9IHBhbFswXS5yZ2JHcmVlbiA9IHBhbFswXS5yZ2JCbHVlID0gMDsKKwkJCQlwYWxbMV0ucmdiUmVkID0gcGFsWzFdLnJnYkdyZWVuID0gcGFsWzFdLnJnYkJsdWUgPSAyNTU7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWNhc2UgNDoKKwkJCXsKKwkJCQlwYWwgPSBGcmVlSW1hZ2VfR2V0UGFsZXR0ZShkaWIpOworCisJCQkJQllURSAqcENvbG9ybWFwID0gJmhlYWRlci5jb2xvcl9tYXBbMF07CisKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJCQkJcGFsW2ldLnJnYlJlZCAgID0gcENvbG9ybWFwWzBdOworCQkJCQlwYWxbaV0ucmdiR3JlZW4gPSBwQ29sb3JtYXBbMV07CisJCQkJCXBhbFtpXS5yZ2JCbHVlICA9IHBDb2xvcm1hcFsyXTsKKwkJCQkJcENvbG9ybWFwICs9IDM7CisJCQkJfQorCisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWNhc2UgODoKKwkJCXsKKwkJCQlCWVRFIHBhbGV0dGVfaWQ7CisKKwkJCQlpby0+c2Vla19wcm9jKGhhbmRsZSwgLTc2OUwsIFNFRUtfRU5EKTsKKwkJCQlpby0+cmVhZF9wcm9jKCZwYWxldHRlX2lkLCAxLCAxLCBoYW5kbGUpOworCisJCQkJaWYgKHBhbGV0dGVfaWQgPT0gMHgwQykgeworCQkJCQlCWVRFICpjbWFwID0gKEJZVEUqKW1hbGxvYyg3NjggKiBzaXplb2YoQllURSkpOworCQkJCQlpby0+cmVhZF9wcm9jKGNtYXAsIDc2OCwgMSwgaGFuZGxlKTsKKworCQkJCQlwYWwgPSBGcmVlSW1hZ2VfR2V0UGFsZXR0ZShkaWIpOworCQkJCQlCWVRFICpwQ29sb3JtYXAgPSAmY21hcFswXTsKKworCQkJCQlmb3IoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkJCQkJCXBhbFtpXS5yZ2JSZWQgICA9IHBDb2xvcm1hcFswXTsKKwkJCQkJCXBhbFtpXS5yZ2JHcmVlbiA9IHBDb2xvcm1hcFsxXTsKKwkJCQkJCXBhbFtpXS5yZ2JCbHVlICA9IHBDb2xvcm1hcFsyXTsKKwkJCQkJCXBDb2xvcm1hcCArPSAzOworCQkJCQl9CisKKwkJCQkJZnJlZShjbWFwKTsKKwkJCQl9CisKKwkJCQkvLyB3cm9uZyBwYWxldHRlIElELCBwZXJoYXBzIGEgZ3JheSBzY2FsZSBpcyBuZWVkZWQgPworCisJCQkJZWxzZSBpZiAoaGVhZGVyLnBhbGV0dGVfaW5mbyA9PSAyKSB7CisJCQkJCXBhbCA9IEZyZWVJbWFnZV9HZXRQYWxldHRlKGRpYik7CisKKwkJCQkJZm9yKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCQkJCQlwYWxbaV0ucmdiUmVkICAgPSAoQllURSlpOworCQkJCQkJcGFsW2ldLnJnYkdyZWVuID0gKEJZVEUpaTsKKwkJCQkJCXBhbFtpXS5yZ2JCbHVlICA9IChCWVRFKWk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpby0+c2Vla19wcm9jKGhhbmRsZSwgKGxvbmcpc2l6ZW9mKFBDWEhFQURFUiksIFNFRUtfU0VUKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJaWYoaGVhZGVyX29ubHkpIHsKKwkJCS8vIGhlYWRlciBvbmx5IG1vZGUKKwkJCXJldHVybiBkaWI7CisJCX0KKworCQkvLyBjYWxjdWxhdGUgdGhlIGxpbmUgbGVuZ3RoIGZvciB0aGUgUENYIGFuZCB0aGUgRElCCisKKwkJLy8gbGVuZ3RoIG9mIHJhc3RlciBsaW5lIGluIGJ5dGVzCisJCXVuc2lnbmVkIGxpbmVsZW5ndGggPSBoZWFkZXIuYnl0ZXNfcGVyX2xpbmUgKiBoZWFkZXIucGxhbmVzOworCQkvLyBsZW5ndGggb2YgRElCIGxpbmUgKHJvdW5kZWQgdG8gRFdPUkQpIGluIGJ5dGVzCisJCXVuc2lnbmVkIHBpdGNoID0gRnJlZUltYWdlX0dldFBpdGNoKGRpYik7CisKKwkJLy8gcnVuLWxlbmd0aCBlbmNvZGluZyA/CisKKwkJYklzUkxFID0gKGhlYWRlci5lbmNvZGluZyA9PSAxKSA/IFRSVUUgOiBGQUxTRTsKKworCQkvLyBsb2FkIGltYWdlIGRhdGEKKwkJLy8gLS0tLS0tLS0tLS0tLS0tCisKKwkJbGluZSA9IChCWVRFKiltYWxsb2MobGluZWxlbmd0aCAqIHNpemVvZihCWVRFKSk7CisJCWlmKCFsaW5lKSB0aHJvdyBGSV9NU0dfRVJST1JfTUVNT1JZOworCQkKKwkJUmVhZEJ1ZiA9IChCWVRFKiltYWxsb2MoSU9fQlVGX1NJWkUgKiBzaXplb2YoQllURSkpOworCQlpZighUmVhZEJ1ZikgdGhyb3cgRklfTVNHX0VSUk9SX01FTU9SWTsKKwkJCisJCWJpdHMgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCBoZWlnaHQgLSAxKTsKKworCQlpbnQgUmVhZFBvcyA9IElPX0JVRl9TSVpFOworCisJCWlmICgoaGVhZGVyLnBsYW5lcyA9PSAxKSAmJiAoKGhlYWRlci5icHAgPT0gMSkgfHwgKGhlYWRlci5icHAgPT0gOCkpKSB7CisJCQlCWVRFIHNraXA7CisJCQl1bnNpZ25lZCB3cml0dGVuOworCisJCQlmb3IgKHVuc2lnbmVkIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJCQl3cml0dGVuID0gcmVhZGxpbmUoKmlvLCBoYW5kbGUsIGJpdHMsIGxpbmVsZW5ndGgsIGJJc1JMRSwgUmVhZEJ1ZiwgJlJlYWRQb3MpOworCisJCQkJLy8gc2tpcCB0cmFpbGluZyBnYXJiYWdlIGF0IHRoZSBlbmQgb2YgdGhlIHNjYW5saW5lCisKKwkJCQlmb3IgKHVuc2lnbmVkIGNvdW50ID0gd3JpdHRlbjsgY291bnQgPCBsaW5lbGVuZ3RoOyBjb3VudCsrKSB7CisJCQkJCWlmIChSZWFkUG9zIDwgSU9fQlVGX1NJWkUpIHsKKwkJCQkJCVJlYWRQb3MrKzsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlvLT5yZWFkX3Byb2MoJnNraXAsIHNpemVvZihCWVRFKSwgMSwgaGFuZGxlKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCWJpdHMgLT0gcGl0Y2g7CisJCQl9CisJCX0gZWxzZSBpZiAoKGhlYWRlci5wbGFuZXMgPT0gNCkgJiYgKGhlYWRlci5icHAgPT0gMSkpIHsKKwkJCUJZVEUgYml0LCAgbWFzaywgc2tpcDsKKwkJCXVuc2lnbmVkIGluZGV4OworCQkJQllURSAqYnVmZmVyOworCQkJdW5zaWduZWQgeCwgeSwgd3JpdHRlbjsKKworCQkJYnVmZmVyID0gKEJZVEUqKW1hbGxvYyh3aWR0aCAqIHNpemVvZihCWVRFKSk7CisJCQlpZighYnVmZmVyKSB0aHJvdyBGSV9NU0dfRVJST1JfTUVNT1JZOworCisJCQlmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJCQl3cml0dGVuID0gcmVhZGxpbmUoKmlvLCBoYW5kbGUsIGxpbmUsIGxpbmVsZW5ndGgsIGJJc1JMRSwgUmVhZEJ1ZiwgJlJlYWRQb3MpOworCisJCQkJLy8gYnVpbGQgYSBuaWJibGUgdXNpbmcgdGhlIDQgcGxhbmVzCisKKwkJCQltZW1zZXQoYnVmZmVyLCAwLCB3aWR0aCAqIHNpemVvZihCWVRFKSk7CisKKwkJCQlmb3IoaW50IHBsYW5lID0gMDsgcGxhbmUgPCA0OyBwbGFuZSsrKSB7CisJCQkJCWJpdCA9IChCWVRFKSgxIDw8IHBsYW5lKTsKKworCQkJCQlmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworCQkJCQkJaW5kZXggPSAodW5zaWduZWQpKCh4IC8gOCkgKyBwbGFuZSAqIGhlYWRlci5ieXRlc19wZXJfbGluZSk7CisJCQkJCQltYXNrID0gKEJZVEUpKDB4ODAgPj4gKHggJiAweDA3KSk7CisJCQkJCQlidWZmZXJbeF0gfD0gKGxpbmVbaW5kZXhdICYgbWFzaykgPyBiaXQgOiAwOworCQkJCQl9CisJCQkJfQorCisJCQkJLy8gdGhlbiB3cml0ZSB0aGUgRElCIHJvdworCisJCQkJZm9yICh4ID0gMDsgeCA8IHdpZHRoIC8gMjsgeCsrKSB7CisJCQkJCWJpdHNbeF0gPSAoYnVmZmVyWzIqeF0gPDwgNCkgfCBidWZmZXJbMip4KzFdOworCQkJCX0KKworCQkJCS8vIHNraXAgdHJhaWxpbmcgZ2FyYmFnZSBhdCB0aGUgZW5kIG9mIHRoZSBzY2FubGluZQorCisJCQkJZm9yICh1bnNpZ25lZCBjb3VudCA9IHdyaXR0ZW47IGNvdW50IDwgbGluZWxlbmd0aDsgY291bnQrKykgeworCQkJCQlpZiAoUmVhZFBvcyA8IElPX0JVRl9TSVpFKSB7CisJCQkJCQlSZWFkUG9zKys7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlpby0+cmVhZF9wcm9jKCZza2lwLCBzaXplb2YoQllURSksIDEsIGhhbmRsZSk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQliaXRzIC09IHBpdGNoOworCQkJfQorCisJCQlmcmVlKGJ1ZmZlcik7CisKKwkJfSBlbHNlIGlmKChoZWFkZXIucGxhbmVzID09IDMpICYmIChoZWFkZXIuYnBwID09IDgpKSB7CisJCQlCWVRFICpwbGluZTsKKworCQkJZm9yICh1bnNpZ25lZCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisJCQkJcmVhZGxpbmUoKmlvLCBoYW5kbGUsIGxpbmUsIGxpbmVsZW5ndGgsIGJJc1JMRSwgUmVhZEJ1ZiwgJlJlYWRQb3MpOworCisJCQkJLy8gY29udmVydCB0aGUgcGxhbmUgc3RyZWFtIHRvIEJHUiAoUlJSUkdHR0dCQkJCIC0+IEJHUkJHUkJHUkJHUikKKwkJCQkvLyB3ZWxsLCBub3cgd2l0aCB0aGUgRklfUkdCQV94IG1hY3Jvcywgb24gQklHRU5ESUFOIHdlIGNvbnZlcnQgdG8gUkdCCisKKwkJCQlwbGluZSA9IGxpbmU7CisJCQkJdW5zaWduZWQgeDsKKworCQkJCWZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisJCQkJCWJpdHNbeCAqIDMgKyBGSV9SR0JBX1JFRF0gPSBwbGluZVt4XTsJCQkJCQkKKwkJCQl9CisJCQkJcGxpbmUgKz0gaGVhZGVyLmJ5dGVzX3Blcl9saW5lOworCisJCQkJZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQkJYml0c1t4ICogMyArIEZJX1JHQkFfR1JFRU5dID0gcGxpbmVbeF07CisJCQkJfQorCQkJCXBsaW5lICs9IGhlYWRlci5ieXRlc19wZXJfbGluZTsKKworCQkJCWZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisJCQkJCWJpdHNbeCAqIDMgKyBGSV9SR0JBX0JMVUVdID0gcGxpbmVbeF07CisJCQkJfQorCQkJCXBsaW5lICs9IGhlYWRlci5ieXRlc19wZXJfbGluZTsKKworCQkJCWJpdHMgLT0gcGl0Y2g7CisJCQl9CisJCX0gZWxzZSB7CisJCQl0aHJvdyBGSV9NU0dfRVJST1JfVU5TVVBQT1JURURfRk9STUFUOworCQl9CisKKwkJZnJlZShsaW5lKTsKKwkJZnJlZShSZWFkQnVmKTsKKworCQlyZXR1cm4gZGliOworCisJfSBjYXRjaCAoY29uc3QgY2hhciAqdGV4dCkgeworCQkvLyBmcmVlIGFsbG9jYXRlZCBtZW1vcnkKKworCQlpZiAoZGliICE9IE5VTEwpIHsKKwkJCUZyZWVJbWFnZV9VbmxvYWQoZGliKTsKKwkJfQorCQlpZiAobGluZSAhPSBOVUxMKSB7CisJCQlmcmVlKGxpbmUpOworCQl9CisJCWlmIChSZWFkQnVmICE9IE5VTEwpIHsKKwkJCWZyZWUoUmVhZEJ1Zik7CisJCX0KKworCQlGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2Moc19mb3JtYXRfaWQsIHRleHQpOworCX0KKwkKKwlyZXR1cm4gTlVMTDsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gICBJbml0CisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8qIQorICAgIEluaXRpYWxpc2VzIHRoZSBwbHVnaW4uIFRoZSBmaXJzdCBwYXJhbWV0ZXIgKFBsdWdpbiAqcGx1Z2luKQorCWNvbnRhaW5zIGEgcG9pbnRlciB0byBhIHByZS1hbGxvY2F0ZWQgUGx1Z2luIHN0cnVjdHVyZQorCXdoZXJlaW4gcG9pbnRlcnMgdG8gdGhlIGF2YWlsYWJsZSBwbHVnaW4gZnVuY3Rpb25zCisJaGFzIHRvIGJlIHN0b3JlZC4gVGhlIHNlY29uZCBwYXJhbWV0ZXIgKGludCBmb3JtYXRfaWQpIGlzIGFuIGlkZW50aWZpY2F0aW9uCisJbnVtYmVyIHRoYXQgdGhlIHBsdWdpbiBtYXkgdXNlIHRvIHNob3cgcGx1Z2luIHNwZWNpZmljIHdhcm5pbmcgbWVzc2FnZXMKKwlvciBvdGhlciBpbmZvcm1hdGlvbiB0byB0aGUgdXNlci4gVGhlIHBsdWdpbiBudW1iZXIKKwlpcyBnZW5lcmF0ZWQgYnkgRnJlZUltYWdlIGFuZCBjYW4gZGlmZmVyIGV2ZXJ5dGltZSB0aGUgcGx1Z2luIGlzCisJaW5pdGlhbGlzZWQuCisKKyAgICBJZiB5b3Ugd2FudCB0byBjcmVhdGUgeW91ciBvd24gcGx1Z2luIHlvdSBoYXZlIHRvIHRha2Ugc29tZQorCXJ1bGVzIGludG8gYWNjb3VudC4gUGx1Z2luIGZ1bmN0aW9ucyBoYXZlIHRvIGJlIGNvbXBpbGVkCisJX19zdGRjYWxsIHVzaW5nIHRoZSBtdWx0aXRocmVhZGVkIGMgcnVudGltZSBsaWJyYXJpZXMuIFRocm93aW5nCisJZXhjZXB0aW9ucyBpbiBwbHVnaW4gZnVuY3Rpb25zIGlzIGFsbG93ZWQsIGFzIGxvbmcgYXMgdGhvc2UgZXhjZXB0aW9ucworCWFyZSBiZWluZyBjYXVnaHQgaW5zaWRlIHRoZSBzYW1lIHBsdWdpbi4gSXQgaXMgZm9yYmlkZGVuIGZvciBhIHBsdWdpbgorCWZ1bmN0aW9uIHRvIGRpcmVjdGx5IGNhbGwgRnJlZUltYWdlIGZ1bmN0aW9ucyBvciB0byBhbGxvY2F0ZSBtZW1vcnkKKwlhbmQgcGFzcyBpdCB0byB0aGUgbWFpbiBETEwuIEV4Y2VwdGlvbiB0byB0aGlzIHJ1bGUgaXMgdGhlIHNwZWNpYWwgZmlsZSBkYXRhCisJYmxvY2sgdGhhdCBtYXkgYmUgYWxsb2NhdGVkIHRoZSBPcGVuIGZ1bmN0aW9uLiBBbGxvY2F0aW5nIGEgRklCSVRNQVAgaW5zaWRlIGEKKwlwbHVnaW4gY2FuIGJlIHVzaW5nIHRoZSBmdW5jdGlvbiBhbGxvY2F0ZV9wcm9jIGluIHRoZSBGcmVlSW1hZ2Ugc3RydWN0dXJlLAorCXdoaWNoIHdpbGwgYWxsb2NhdGUgdGhlIG1lbW9yeSB1c2luZyB0aGUgRExMJ3MgYyBydW50aW1lIGxpYnJhcnkuCisqLworCit2b2lkIERMTF9DQUxMQ09OVgorSW5pdFBDWChQbHVnaW4gKnBsdWdpbiwgaW50IGZvcm1hdF9pZCkgeworCXNfZm9ybWF0X2lkID0gZm9ybWF0X2lkOworCisJcGx1Z2luLT5mb3JtYXRfcHJvYyA9IEZvcm1hdDsKKwlwbHVnaW4tPmRlc2NyaXB0aW9uX3Byb2MgPSBEZXNjcmlwdGlvbjsKKwlwbHVnaW4tPmV4dGVuc2lvbl9wcm9jID0gRXh0ZW5zaW9uOworCXBsdWdpbi0+cmVnZXhwcl9wcm9jID0gUmVnRXhwcjsKKwlwbHVnaW4tPm9wZW5fcHJvYyA9IE5VTEw7CisJcGx1Z2luLT5jbG9zZV9wcm9jID0gTlVMTDsKKwlwbHVnaW4tPnBhZ2Vjb3VudF9wcm9jID0gTlVMTDsKKwlwbHVnaW4tPnBhZ2VjYXBhYmlsaXR5X3Byb2MgPSBOVUxMOworCXBsdWdpbi0+bG9hZF9wcm9jID0gTG9hZDsKKwlwbHVnaW4tPnNhdmVfcHJvYyA9IE5VTEw7CisJcGx1Z2luLT52YWxpZGF0ZV9wcm9jID0gVmFsaWRhdGU7CisJcGx1Z2luLT5taW1lX3Byb2MgPSBNaW1lVHlwZTsKKwlwbHVnaW4tPnN1cHBvcnRzX2V4cG9ydF9icHBfcHJvYyA9IFN1cHBvcnRzRXhwb3J0RGVwdGg7CisJcGx1Z2luLT5zdXBwb3J0c19leHBvcnRfdHlwZV9wcm9jID0gU3VwcG9ydHNFeHBvcnRUeXBlOworCXBsdWdpbi0+c3VwcG9ydHNfaWNjX3Byb2ZpbGVzX3Byb2MgPSBOVUxMOworCXBsdWdpbi0+c3VwcG9ydHNfbm9fcGl4ZWxzX3Byb2MgPSBTdXBwb3J0c05vUGl4ZWxzOworfQpkaWZmIC0tZ2l0IGEvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9QbHVnaW5QRk0uY3BwIGIvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9QbHVnaW5QRk0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhM2M0NmIKLS0tIC9kZXYvbnVsbAorKysgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL1BsdWdpblBGTS5jcHAKQEAgLTAsMCArMSw0MDkgQEAKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFBGTSBMb2FkZXIgYW5kIFdyaXRlcgorLy8KKy8vIERlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gYnkKKy8vIC0gSGVydukgRHJvbG9uIChkcm9sb25AaW5mb25pZS5mcikKKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBGcmVlSW1hZ2UgMworLy8KKy8vIENPVkVSRUQgQ09ERSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWQorLy8gT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMKKy8vIFRIQVQgVEhFIENPVkVSRUQgQ09ERSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLy8gT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQKKy8vIENPREUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkgQ09WRVJFRCBDT0RFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QKKy8vIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZCisvLyBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMCisvLyBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GIEFOWSBDT1ZFUkVEIENPREUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSCisvLyBUSElTIERJU0NMQUlNRVIuCisvLworLy8gVXNlIGF0IHlvdXIgb3duIHJpc2shCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpbmNsdWRlICJGcmVlSW1hZ2UuaCIKKyNpbmNsdWRlICJVdGlsaXRpZXMuaCIKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gSW50ZXJuYWwgZnVuY3Rpb25zCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8qKiBtYXhpbXVtIHNpemUgb2YgYSBsaW5lIGluIHRoZSBoZWFkZXIgKi8KKyNkZWZpbmUgUEZNX01BWExJTkUJMjU2CisKKy8qKiBCaWcgZW5kaWFuIC8gTGl0dGxlIGVuZGlhbiBmbG9hdCBjb252ZXJzaW9uICovCisjZGVmaW5lIFJFVkVSU0VCWVRFUyhzb3VyY2UsIGRlc3QpCQlcCit7CQkJCQkJCQkJCVwKKwljaGFyICpqID0gKGNoYXIgKikgc291cmNlOwkJCVwKKwljaGFyICpkaiA9IChjaGFyICopIGRlc3Q7CQkJXAorCWRqWzBdID0galszXTsJCQkJCQlcCisJZGpbMV0gPSBqWzJdOwkJCQkJCVwKKwlkalsyXSA9IGpbMV07CQkJCQkJXAorCWRqWzNdID0galswXTsJCQkJCQlcCit9CisKKy8qKgorR2V0IGEgbGluZSBmcm9tIGEgQVNDSUkgaW8gc3RyZWFtCisqLworc3RhdGljIEJPT0wgCitwZm1fZ2V0X2xpbmUoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBjaGFyICpidWZmZXIsIGludCBsZW5ndGgpIHsKKwlpbnQgaTsKKwltZW1zZXQoYnVmZmVyLCAwLCBsZW5ndGgpOworCWZvcihpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCWlmKCFpby0+cmVhZF9wcm9jKCZidWZmZXJbaV0sIDEsIDEsIGhhbmRsZSkpCisJCQlyZXR1cm4gRkFMU0U7CisJCWlmKGJ1ZmZlcltpXSA9PSAweDBBKQorCQkJYnJlYWs7CisJfQorCQorCXJldHVybiAoaSA8IGxlbmd0aCkgPyBUUlVFIDogRkFMU0U7Cit9CisKKy8qKgorR2V0IGFuIGludGVnZXIgdmFsdWUgZnJvbSB0aGUgYWN0dWFsIHBvc2l0aW9uIHBvaW50ZWQgYnkgaGFuZGxlCisqLworc3RhdGljIGludAorcGZtX2dldF9pbnQoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlKSB7CisgICAgY2hhciBjID0gMDsKKwlCT09MIGJGaXJzdENoYXI7CisKKyAgICAvLyBza2lwIGZvcndhcmQgdG8gc3RhcnQgb2YgbmV4dCBudW1iZXIKKworCWlmKCFpby0+cmVhZF9wcm9jKCZjLCAxLCAxLCBoYW5kbGUpKSB7CisJCXRocm93IEZJX01TR19FUlJPUl9QQVJTSU5HOworCX0KKworICAgIHdoaWxlICgxKSB7CisgICAgICAgIC8vIGVhdCBjb21tZW50cworCisgICAgICAgIGlmIChjID09ICcjJykgeworCQkJLy8gaWYgd2UncmUgYXQgYSBjb21tZW50LCByZWFkIHRvIGVuZCBvZiBsaW5lCisKKyAgICAgICAgICAgIGJGaXJzdENoYXIgPSBUUlVFOworCisgICAgICAgICAgICB3aGlsZSAoMSkgeworCQkJCWlmKCFpby0+cmVhZF9wcm9jKCZjLCAxLCAxLCBoYW5kbGUpKSB7CisJCQkJCXRocm93IEZJX01TR19FUlJPUl9QQVJTSU5HOworCQkJCX0KKworCQkJCWlmIChiRmlyc3RDaGFyICYmIGMgPT0gJyAnKSB7CisJCQkJCS8vIGxvb3Agb2ZmIDEgc3AgYWZ0ZXIgIworCQkJCQliRmlyc3RDaGFyID0gRkFMU0U7CisJCQkJfSBlbHNlIGlmIChjID09ICdcbicpIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisKKyAgICAgICAgaWYgKGMgPj0gJzAnICYmIGMgPD0nOScpIHsKKwkJCS8vIHdlJ3ZlIGZvdW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcgorICAgICAgICAgICAgYnJlYWs7CisJCX0KKworCQlpZighaW8tPnJlYWRfcHJvYygmYywgMSwgMSwgaGFuZGxlKSkgeworCQkJdGhyb3cgRklfTVNHX0VSUk9SX1BBUlNJTkc7CisJCX0KKyAgICB9CisKKyAgICAvLyB3ZSdyZSBhdCB0aGUgc3RhcnQgb2YgYSBudW1iZXIsIGNvbnRpbnVlIHVudGlsIHdlIGhpdCBhIG5vbi1udW1iZXIKKworICAgIGludCBpID0gMDsKKworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGkgPSAoaSAqIDEwKSArIChjIC0gJzAnKTsKKworCQlpZighaW8tPnJlYWRfcHJvYygmYywgMSwgMSwgaGFuZGxlKSkgeworCQkJdGhyb3cgRklfTVNHX0VSUk9SX1BBUlNJTkc7CisJCX0KKworCQlpZiAoYyA8ICcwJyB8fCBjID4gJzknKSB7CisJCQlicmVhazsKKwkJfQorICAgIH0KKworICAgIHJldHVybiBpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBQbHVnaW4gSW50ZXJmYWNlCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3N0YXRpYyBpbnQgc19mb3JtYXRfaWQ7CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFBsdWdpbiBJbXBsZW1lbnRhdGlvbgorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgorRm9ybWF0KCkgeworCXJldHVybiAiUEZNIjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKK0Rlc2NyaXB0aW9uKCkgeworCXJldHVybiAiUG9ydGFibGUgZmxvYXRtYXAiOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgorRXh0ZW5zaW9uKCkgeworCXJldHVybiAicGZtIjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKK1JlZ0V4cHIoKSB7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCitNaW1lVHlwZSgpIHsKKwlyZXR1cm4gImltYWdlL3gtcG9ydGFibGUtZmxvYXRtYXAiOworfQorCitzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYKK1ZhbGlkYXRlKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSkgeworCUJZVEUgcGZtX2lkMVtdID0geyAweDUwLCAweDQ2IH07CisJQllURSBwZm1faWQyW10gPSB7IDB4NTAsIDB4NjYgfTsKKwlCWVRFIHNpZ25hdHVyZVsyXSA9IHsgMCwgMCB9OworCisJaW8tPnJlYWRfcHJvYyhzaWduYXR1cmUsIDEsIHNpemVvZihwZm1faWQxKSwgaGFuZGxlKTsKKworCWlmIChtZW1jbXAocGZtX2lkMSwgc2lnbmF0dXJlLCBzaXplb2YocGZtX2lkMSkpID09IDApCisJCXJldHVybiBUUlVFOworCisJaWYgKG1lbWNtcChwZm1faWQyLCBzaWduYXR1cmUsIHNpemVvZihwZm1faWQyKSkgPT0gMCkKKwkJcmV0dXJuIFRSVUU7CisKKwlyZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBCT09MIERMTF9DQUxMQ09OVgorU3VwcG9ydHNFeHBvcnREZXB0aChpbnQgZGVwdGgpIHsKKwlyZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBCT09MIERMTF9DQUxMQ09OViAKK1N1cHBvcnRzRXhwb3J0VHlwZShGUkVFX0lNQUdFX1RZUEUgdHlwZSkgeworCXJldHVybiAoCisJCSh0eXBlID09IEZJVF9GTE9BVCkgfHwKKwkJKHR5cGUgPT0gRklUX1JHQkYpCisJKTsKK30KKworc3RhdGljIEJPT0wgRExMX0NBTExDT05WCitTdXBwb3J0c05vUGl4ZWxzKCkgeworCXJldHVybiBUUlVFOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBGSUJJVE1BUCAqIERMTF9DQUxMQ09OVgorTG9hZChGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIGludCBwYWdlLCBpbnQgZmxhZ3MsIHZvaWQgKmRhdGEpIHsKKwljaGFyIGxpbmVfYnVmZmVyW1BGTV9NQVhMSU5FXTsKKwljaGFyIGlkX29uZSA9IDAsIGlkX3R3byA9IDA7CisJRklCSVRNQVAgKmRpYiA9IE5VTEw7CisJZmxvYXQgKmxpbmVCdWZmZXIgPSBOVUxMOworCisJaWYgKCFoYW5kbGUpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJQk9PTCBoZWFkZXJfb25seSA9IChmbGFncyAmIEZJRl9MT0FEX05PUElYRUxTKSA9PSBGSUZfTE9BRF9OT1BJWEVMUzsKKworCXRyeSB7CisJCUZSRUVfSU1BR0VfVFlQRSBpbWFnZV90eXBlID0gRklUX1VOS05PV047CisKKwkJLy8gUmVhZCB0aGUgZmlyc3QgdHdvIGJ5dGVzIG9mIHRoZSBmaWxlIHRvIGRldGVybWluZSB0aGUgZmlsZSBmb3JtYXQKKwkJLy8gIlBGIiA9IGNvbG9yIGltYWdlCisJCS8vICJQZiIgPSBncmV5c2NhbGUgaW1hZ2UKKworCQlpby0+cmVhZF9wcm9jKCZpZF9vbmUsIDEsIDEsIGhhbmRsZSk7CisJCWlvLT5yZWFkX3Byb2MoJmlkX3R3bywgMSwgMSwgaGFuZGxlKTsKKworCQlpZihpZF9vbmUgPT0gJ1AnKSB7CisJCQlpZihpZF90d28gPT0gJ0YnKSB7CisJCQkJaW1hZ2VfdHlwZSA9IEZJVF9SR0JGOworCQkJfSBlbHNlIGlmKGlkX3R3byA9PSAnZicpIHsKKwkJCQlpbWFnZV90eXBlID0gRklUX0ZMT0FUOworCQkJfQorCQl9CisJCWlmKGltYWdlX3R5cGUgPT0gRklUX1VOS05PV04pIHsKKwkJCS8vIHNpZ25hdHVyZSBlcnJvcgorCQkJdGhyb3cgRklfTVNHX0VSUk9SX01BR0lDX05VTUJFUjsKKwkJfQorCisJCS8vIFJlYWQgdGhlIGhlYWRlciBpbmZvcm1hdGlvbjogd2lkdGgsIGhlaWdodCBhbmQgdGhlIHNjYWxlIHZhbHVlCisJCXVuc2lnbmVkIHdpZHRoICA9ICh1bnNpZ25lZCkgcGZtX2dldF9pbnQoaW8sIGhhbmRsZSk7CisJCXVuc2lnbmVkIGhlaWdodCA9ICh1bnNpZ25lZCkgcGZtX2dldF9pbnQoaW8sIGhhbmRsZSk7CisJCWZsb2F0IHNjYWxlZmFjdG9yID0gMTsKKworCQlCT09MIGJSZXN1bHQgPSBwZm1fZ2V0X2xpbmUoaW8sIGhhbmRsZSwgbGluZV9idWZmZXIsIFBGTV9NQVhMSU5FKTsKKwkJaWYoYlJlc3VsdCkgeworCQkJYlJlc3VsdCA9IChzc2NhbmYobGluZV9idWZmZXIsICIlZiIsICZzY2FsZWZhY3RvcikgPT0gMSkgPyBUUlVFIDogRkFMU0U7CisJCX0KKwkJaWYoIWJSZXN1bHQpIHsKKwkJCXRocm93ICJSZWFkIGVycm9yOiBpbnZhbGlkIFBGTSBoZWFkZXIiOworCQl9CisKKwkJLy8gQ3JlYXRlIGEgbmV3IERJQgorCQlkaWIgPSBGcmVlSW1hZ2VfQWxsb2NhdGVIZWFkZXJUKGhlYWRlcl9vbmx5LCBpbWFnZV90eXBlLCB3aWR0aCwgaGVpZ2h0KTsKKwkJaWYgKGRpYiA9PSBOVUxMKSB7CisJCQl0aHJvdyBGSV9NU0dfRVJST1JfRElCX01FTU9SWTsKKwkJfQorCisJCWlmKGhlYWRlcl9vbmx5KSB7CisJCQkvLyBoZWFkZXIgb25seSBtb2RlCisJCQlyZXR1cm4gZGliOworCQl9CisKKwkJLy8gUmVhZCB0aGUgaW1hZ2UuLi4KKworCQlpZihpbWFnZV90eXBlID09IEZJVF9SR0JGKSB7CisJCQljb25zdCB1bnNpZ25lZCBsaW5lV2lkdGggPSAzICogd2lkdGg7CisJCQlsaW5lQnVmZmVyID0gKGZsb2F0KiltYWxsb2MobGluZVdpZHRoICogc2l6ZW9mKGZsb2F0KSk7CisJCQlpZighbGluZUJ1ZmZlcikgeworCQkJCXRocm93IEZJX01TR19FUlJPUl9NRU1PUlk7CisJCQl9CisKKwkJCWZvciAodW5zaWduZWQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgewkKKwkJCQlGSVJHQkYgKmJpdHMgPSAoRklSR0JGKilGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCBoZWlnaHQgLSAxIC0geSk7CisKKwkJCQlpZihpby0+cmVhZF9wcm9jKGxpbmVCdWZmZXIsIHNpemVvZihmbG9hdCksIGxpbmVXaWR0aCwgaGFuZGxlKSAhPSBsaW5lV2lkdGgpIHsKKwkJCQkJdGhyb3cgIlJlYWQgZXJyb3IiOworCQkJCX0KKwkJCQlmbG9hdCAqY2hhbm5lbCA9IGxpbmVCdWZmZXI7CisJCQkJaWYoc2NhbGVmYWN0b3IgPiAwKSB7CisJCQkJCS8vIE1TQgorCQkJCQlmb3IgKHVuc2lnbmVkIHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworCQkJCQkJUkVWRVJTRUJZVEVTKGNoYW5uZWwrKywgJmJpdHNbeF0ucmVkKTsKKwkJCQkJCVJFVkVSU0VCWVRFUyhjaGFubmVsKyssICZiaXRzW3hdLmdyZWVuKTsKKwkJCQkJCVJFVkVSU0VCWVRFUyhjaGFubmVsKyssICZiaXRzW3hdLmJsdWUpOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJLy8gTFNCCQkJCQkKKwkJCQkJZm9yICh1bnNpZ25lZCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQkJCWJpdHNbeF0ucmVkCQk9ICpjaGFubmVsKys7CisJCQkJCQliaXRzW3hdLmdyZWVuCT0gKmNoYW5uZWwrKzsKKwkJCQkJCWJpdHNbeF0uYmx1ZQk9ICpjaGFubmVsKys7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCWZyZWUobGluZUJ1ZmZlcik7CisJCQlsaW5lQnVmZmVyID0gTlVMTDsKKworCQl9IGVsc2UgaWYoaW1hZ2VfdHlwZSA9PSBGSVRfRkxPQVQpIHsKKwkJCWNvbnN0IHVuc2lnbmVkIGxpbmVXaWR0aCA9IHdpZHRoOworCQkJbGluZUJ1ZmZlciA9IChmbG9hdCopbWFsbG9jKGxpbmVXaWR0aCAqIHNpemVvZihmbG9hdCkpOworCQkJaWYoIWxpbmVCdWZmZXIpIHsKKwkJCQl0aHJvdyBGSV9NU0dfRVJST1JfTUVNT1JZOworCQkJfQorCisJCQlmb3IgKHVuc2lnbmVkIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsJCisJCQkJZmxvYXQgKmJpdHMgPSAoZmxvYXQqKUZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIGhlaWdodCAtIDEgLSB5KTsKKworCQkJCWlmKGlvLT5yZWFkX3Byb2MobGluZUJ1ZmZlciwgc2l6ZW9mKGZsb2F0KSwgbGluZVdpZHRoLCBoYW5kbGUpICE9IGxpbmVXaWR0aCkgeworCQkJCQl0aHJvdyAiUmVhZCBlcnJvciI7CisJCQkJfQorCQkJCWZsb2F0ICpjaGFubmVsID0gbGluZUJ1ZmZlcjsKKwkJCQlpZihzY2FsZWZhY3RvciA+IDApIHsKKwkJCQkJLy8gTVNCIC0gRmlsZSBpcyBCaWcgZW5kaWFuCisJCQkJCWZvciAodW5zaWduZWQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisJCQkJCQlSRVZFUlNFQllURVMoY2hhbm5lbCsrLCAmYml0c1t4XSk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQkvLyBMU0IgLSBGaWxlIGlzIExpdHRsZSBFbmRpYW4KKwkJCQkJZm9yICh1bnNpZ25lZCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQkJCWJpdHNbeF0gPSAqY2hhbm5lbCsrOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlmcmVlKGxpbmVCdWZmZXIpOworCQkJbGluZUJ1ZmZlciA9IE5VTEw7CisJCX0KKwkJCisJCXJldHVybiBkaWI7CisKKwl9IGNhdGNoIChjb25zdCBjaGFyICp0ZXh0KSAgeworCQlpZihsaW5lQnVmZmVyKSBmcmVlKGxpbmVCdWZmZXIpOworCQlpZihkaWIpIEZyZWVJbWFnZV9VbmxvYWQoZGliKTsKKworCQlpZihOVUxMICE9IHRleHQpIHsKKwkJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhzX2Zvcm1hdF9pZCwgdGV4dCk7CisJCX0KKworCQlyZXR1cm4gTlVMTDsKKwl9CisKK30KKworc3RhdGljIEJPT0wgRExMX0NBTExDT05WCitTYXZlKEZyZWVJbWFnZUlPICppbywgRklCSVRNQVAgKmRpYiwgZmlfaGFuZGxlIGhhbmRsZSwgaW50IHBhZ2UsIGludCBmbGFncywgdm9pZCAqZGF0YSkgeworCWlmKCFkaWIgfHwgIWhhbmRsZSkgcmV0dXJuIEZBTFNFOworCisJRlJFRV9JTUFHRV9UWVBFIGltYWdlX3R5cGUgPSBGcmVlSW1hZ2VfR2V0SW1hZ2VUeXBlKGRpYik7CisJaWYoKGltYWdlX3R5cGUgIT0gRklUX1JHQkYpICYmIChpbWFnZV90eXBlICE9IEZJVF9GTE9BVCkpIHsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCXVuc2lnbmVkIHdpZHRoICA9IEZyZWVJbWFnZV9HZXRXaWR0aChkaWIpOworCXVuc2lnbmVkIGhlaWdodCA9IEZyZWVJbWFnZV9HZXRIZWlnaHQoZGliKTsKKwl1bnNpZ25lZCBsaW5lV2lkdGggPSBGcmVlSW1hZ2VfR2V0TGluZShkaWIpOworCQorCS8vIHNhdmUgaW1hZ2UgYXMgTGl0dGxlIEVuZGlhbgorCWNvbnN0IGZsb2F0IHNjYWxlZmFjdG9yID0gLTEuMEY7CisKKwljaGFyIGJ1ZmZlcltQRk1fTUFYTElORV07CS8vIHRlbXBvcmFyeSBidWZmZXIgd2hvc2Ugc2l6ZSBzaG91bGQgYmUgZW5vdWdoIGZvciB3aGF0IHdlIG5lZWQKKworCS8vIEZpbmQgdGhlIGFwcHJvcHJpYXRlIG1hZ2ljIG51bWJlciBmb3IgdGhpcyBmaWxlIHR5cGUKKworCWNoYXIgbWFnaWMgPSAwOworCisJc3dpdGNoKGltYWdlX3R5cGUpIHsKKwkJY2FzZSBGSVRfUkdCRjoKKwkJCW1hZ2ljID0gJ0YnOwkvLyBSR0JGCisJCQlicmVhazsJCisJCWNhc2UgRklUX0ZMT0FUOgorCQkJbWFnaWMgPSAnZic7CS8vIGZsb2F0IGdyZXlzY2FsZQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gRkFMU0U7CisJfQorCisJLy8gV3JpdGUgdGhlIGhlYWRlciBpbmZvCisKKwlzcHJpbnRmKGJ1ZmZlciwgIlAlY1xuJWQgJWRcbiVmXG4iLCBtYWdpYywgd2lkdGgsIGhlaWdodCwgc2NhbGVmYWN0b3IpOworCWlvLT53cml0ZV9wcm9jKCZidWZmZXIsICh1bnNpZ25lZCBpbnQpc3RybGVuKGJ1ZmZlciksIDEsIGhhbmRsZSk7CisKKwkvLyBXcml0ZSB0aGUgaW1hZ2UgZGF0YQorCWZvciAodW5zaWduZWQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgewkKKwkJQllURSAqYml0cyA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIGhlaWdodCAtIDEgLSB5KTsKKwkJaW8tPndyaXRlX3Byb2MoYml0cywgMSwgbGluZVdpZHRoLCBoYW5kbGUpOworCX0KKworCXJldHVybiBUUlVFOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgIEluaXQKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwordm9pZCBETExfQ0FMTENPTlYKK0luaXRQRk0oUGx1Z2luICpwbHVnaW4sIGludCBmb3JtYXRfaWQpIHsKKwlzX2Zvcm1hdF9pZCA9IGZvcm1hdF9pZDsKKworCXBsdWdpbi0+Zm9ybWF0X3Byb2MgPSBGb3JtYXQ7CisJcGx1Z2luLT5kZXNjcmlwdGlvbl9wcm9jID0gRGVzY3JpcHRpb247CisJcGx1Z2luLT5leHRlbnNpb25fcHJvYyA9IEV4dGVuc2lvbjsKKwlwbHVnaW4tPnJlZ2V4cHJfcHJvYyA9IFJlZ0V4cHI7CisJcGx1Z2luLT5vcGVuX3Byb2MgPSBOVUxMOworCXBsdWdpbi0+Y2xvc2VfcHJvYyA9IE5VTEw7CisJcGx1Z2luLT5wYWdlY291bnRfcHJvYyA9IE5VTEw7CisJcGx1Z2luLT5wYWdlY2FwYWJpbGl0eV9wcm9jID0gTlVMTDsKKwlwbHVnaW4tPmxvYWRfcHJvYyA9IExvYWQ7CisJcGx1Z2luLT5zYXZlX3Byb2MgPSBTYXZlOworCXBsdWdpbi0+dmFsaWRhdGVfcHJvYyA9IFZhbGlkYXRlOworCXBsdWdpbi0+bWltZV9wcm9jID0gTWltZVR5cGU7CisJcGx1Z2luLT5zdXBwb3J0c19leHBvcnRfYnBwX3Byb2MgPSBTdXBwb3J0c0V4cG9ydERlcHRoOworCXBsdWdpbi0+c3VwcG9ydHNfZXhwb3J0X3R5cGVfcHJvYyA9IFN1cHBvcnRzRXhwb3J0VHlwZTsKKwlwbHVnaW4tPnN1cHBvcnRzX2ljY19wcm9maWxlc19wcm9jID0gTlVMTDsKKwlwbHVnaW4tPnN1cHBvcnRzX25vX3BpeGVsc19wcm9jID0gU3VwcG9ydHNOb1BpeGVsczsKK30KZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvUGx1Z2luUElDVC5jcHAgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL1BsdWdpblBJQ1QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MTA1NmQKLS0tIC9kZXYvbnVsbAorKysgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL1BsdWdpblBJQ1QuY3BwCkBAIC0wLDAgKzEsMTM0MyBAQAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gQXBwbGUgTWFjaW50b3NoIFF1aWNrRHJhdy9QSUNUIExvYWRlcgorLy8KKy8vIERlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gYnkKKy8vIC0gQW1pciBFYnJhaGltaSAoYW1pckB1bml0eTNkLmNvbSkKKy8vCisvLyBCYXNlZCBvbiBQSUNUIGxvYWRpbmcgY29kZSBmcm9tIHBhaW50bGliIChodHRwOi8vd3d3LnBhaW50bGliLmRlL3BhaW50bGliLykuCisvLworLy8gUGFpbnRsaWIgTGljZW5zZToKKy8vIFRoZSBwYWludGxpYiBzb3VyY2UgY29kZSBhbmQgYWxsIGRvY3VtZW50YXRpb24gYXJlIGNvcHlyaWdodCAoYykgMTk5Ni0yMDAyIAorLy8gVWxyaWNoIHZvbiBaYWRvdyBhbmQgb3RoZXIgY29udHJpYnV0b3JzLgorLy8KKy8vIFRoZSBwYWludGxpYiBzb3VyY2UgY29kZSBpcyBzdXBwbGllZCAiQVMgSVMiLiBVbHJpY2ggdm9uIFphZG93IGFuZCBvdGhlciAKKy8vIGNvbnRyaWJ1dG9ycyBkaXNjbGFpbSBhbGwgd2FycmFudGllcywgZXhwcmVzc2VkIG9yIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dAorLy8gbGltaXRhdGlvbiwgdGhlIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBvZiBmaXRuZXNzIGZvciBhbnkgcHVycG9zZS4gCisvLyBUaGUgYXV0aG9ycyBhc3N1bWUgbm8gbGlhYmlsaXR5IGZvciBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCAKKy8vIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCB3aGljaCBtYXkgcmVzdWx0IGZyb20gdGhlIHVzZSBvZiBwYWludGxpYiwgCisvLyBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQgdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc291cmNlIAorLy8gY29kZSwgb3IgcG9ydGlvbnMgaGVyZW9mLCBmb3IgYW55IHB1cnBvc2UsIHdpdGhvdXQgZmVlLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgCisvLyByZXN0cmljdGlvbnM6CisvLworLy8gMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvdXJjZSBjb2RlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkLgorLy8gMi4gQWx0ZXJlZCB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2ggYW5kIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkCisvLyAgICBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc291cmNlLgorLy8gMy4gVGhpcyBDb3B5cmlnaHQgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBvciBhbHRlcmVkIAorLy8gICAgc291cmNlIGRpc3RyaWJ1dGlvbi4KKy8vIDQuIEV4ZWN1dGFibGVzIGNvbnRhaW5pbmcgcGFpbnRsaWIgb3IgcGFydHMgb2YgaXQgbXVzdCBzdGF0ZSB0aGF0IHRoZSBzb2Z0d2FyZSAKKy8vICAgICJjb250YWlucyBwYWludGxpYiBjb2RlLiBwYWludGxpYiBpcyBjb3B5cmlnaHQgKGMpIDE5OTYtMjAwMiBVbHJpY2ggdm9uIFphZG93CisvLyAgICBhbmQgb3RoZXIgY29udHJpYnV0b3JzLiIuIFRoaXMgbm90aWNlIG11c3QgYmUgZGlzcGxheWVkIGluIGF0IGxlYXN0IG9uZSBwbGFjZQorLy8gICAgd2hlcmUgdGhlIGNvcHlyaWdodCBmb3IgdGhlIHNvZnR3YXJlIGl0c2VsZiBpcyBkaXNwbGF5ZWQuIFRoZSBkb2N1bWVudGF0aW9uIG11c3QgCisvLyAgICBhbHNvIGNvbnRhaW4gdGhpcyBub3RpY2UuCisvLworLy8gQnVnIGZpeGVzIHdlcmUgbWFkZSB0byB0aGUgb3JpZ2luYWwgY29kZSB0byBzdXBwb3J0IHZlcnNpb24gMiBQSUNUIGZpbGVzCisvLyBwcm9wZXJseS4KKy8vIAorLy8gQWRkaXRpb25hbCByZXNvdXJjZXM6CisvLyBodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9kb2N1bWVudGF0aW9uL21hYy9RdWlja0RyYXcvUXVpY2tEcmF3LTQ1OC5odG1sCisvLyBodHRwOi8vd3d3LmZpbGVmb3JtYXQuaW5mby9mb3JtYXQvbWFjcGljdC9lZ2ZmLmh0bQorLy8gCisvLyBOb3RlcyAoaHR0cDovL2xpc3RzLmFwcGxlLmNvbS9hcmNoaXZlcy9qYXZhLWRldi8yMDA2L0Fwci9tc2cwMDU4OC5odG1sKToKKy8vIFRoZXJlIGFyZSB0aHJlZSBtYWluIHR5cGVzIG9mIFBJQ1QgZmlsZXM6CisvLyAgLSBWZXJzaW9uIDEKKy8vICAtIFZlcnNpb24gMgorLy8gIC0gRXh0ZW5kZWQgVmVyc2lvbiAyCisvLworLy8gU29tZSB0aGluZ3MgdG8gbG9vayBvdXQgZm9yOgorLy8gIC0gVGhlIGJvdW5kcyBhbmQgdGFyZ2V0IERQSSBhcmUgc3RvcmVkIGluIGEgZGlmZmVyZW50IHBsYWNlIGluIGFsbCB0aHJlZS4KKy8vICAtIFNvbWUgb2YgdGhlIHZhbHVlcyBhcmUgZml4ZWQtcG9pbnQgc2hvcnRzICggc2hvcnQgLyA2NTUzNmYgKQorLy8gIC0gVmFsdWVzIGFyZSBiaWcgZW5kaWFuIAorLy8gIC0gQWxsIG9mIHRoaXMgbWF5IGJlICpwcmVjZWRlZCogYnkgYSA1MTIgYnl0ZSBoZWFkZXItLXNvbWV0aW1lcyBpdCBpcworLy8gICAgdGhlcmUsIGFuZCBzb21ldGltZXMgaXQgaXNuJ3QuIFlvdSBqdXN0IGhhdmUgdG8gY2hlY2sgZm9yIHRoZSBtYWdpYworLy8JICB2YWx1ZXMgaW4gYm90aCBwbGFjZXMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRnJlZUltYWdlIDMKKy8vCisvLyBDT1ZFUkVEIENPREUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkKKy8vIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTCisvLyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy8vIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVECisvLyBDT0RFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UCisvLyBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWQorLy8gU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTAorLy8gUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUgorLy8gVEhJUyBESVNDTEFJTUVSLgorLy8KKy8vIFVzZSBhdCB5b3VyIG93biByaXNrIQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaW5jbHVkZSAiRnJlZUltYWdlLmgiCisjaW5jbHVkZSAiVXRpbGl0aWVzLmgiCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFBsdWdpbiBJbnRlcmZhY2UKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3N0YXRpYyBpbnQgc19mb3JtYXRfaWQ7CisKK3N0YXRpYyBjb25zdCBpbnQgb3V0cHV0TWVzc2FnZVNpemUgPSAyNTY7CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEludGVybmFsIGZ1bmN0aW9ucworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitzdGF0aWMgQllURQorUmVhZDgoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlKSB7CisJQllURSBpID0gMDsKKwlpby0+cmVhZF9wcm9jKCZpLCAxLCAxLCBoYW5kbGUpOworCXJldHVybiBpOworfQorCitzdGF0aWMgV09SRAorUmVhZDE2KEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSkgeworCS8vIHJlYWRzIGEgdHdvLWJ5dGUgYmlnLWVuZGlhbiBpbnRlZ2VyIGZyb20gdGhlIGdpdmVuIGZpbGUgYW5kIHJldHVybnMgaXRzIHZhbHVlLgorCS8vIGFzc3VtZXMgdW5zaWduZWQuCisJCisJdW5zaWduZWQgaGkgPSBSZWFkOChpbywgaGFuZGxlKTsKKwl1bnNpZ25lZCBsbyA9IFJlYWQ4KGlvLCBoYW5kbGUpOworCXJldHVybiAoV09SRCkobG8gKyAoaGkgPDwgOCkpOworfQorCitzdGF0aWMgdW5zaWduZWQKK1JlYWQzMihGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUpIHsKKwkvLyByZWFkcyBhIGZvdXItYnl0ZSBiaWctZW5kaWFuIGludGVnZXIgZnJvbSB0aGUgZ2l2ZW4gZmlsZSBhbmQgcmV0dXJucyBpdHMgdmFsdWUuCisJLy8gYXNzdW1lcyB1bnNpZ25lZC4KKwkKKwl1bnNpZ25lZCBiMyA9IFJlYWQ4KGlvLCBoYW5kbGUpOworCXVuc2lnbmVkIGIyID0gUmVhZDgoaW8sIGhhbmRsZSk7CisJdW5zaWduZWQgYjEgPSBSZWFkOChpbywgaGFuZGxlKTsKKwl1bnNpZ25lZCBiMCA9IFJlYWQ4KGlvLCBoYW5kbGUpOworCXJldHVybiAoYjMgPDwgMjQpICsgKGIyIDw8IDE2KSArIChiMSA8PCA4KSArIGIwOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0cnVjdCBPcERlZgoreworCWNvbnN0IGNoYXIgKiBuYW1lOworCWludCAgICBsZW47CisJY29uc3QgY2hhciAqIGRlc2NyaXB0aW9uOworfTsKKworLy8gZm9yIHJlc2VydmVkIG9wY29kZXMKKyNkZWZpbmUgcmVzKGxlbmd0aCkgeyAicmVzZXJ2ZWQiLCAobGVuZ3RoKSwgInJlc2VydmVkIGZvciBBcHBsZSB1c2UiIH0KKyNkZWZpbmUgUkdCX0xFTiA2CisjZGVmaW5lIFdPUkRfTEVOIC0xCisjZGVmaW5lIE5BIDAKKworc3RhdGljIE9wRGVmIG9wdGFibGVbXSA9Cit7CisvKiAweDAwICovICB7ICJOT1AiLCAgICAgICAgICAgICAgIDAsICJub3AiIH0sCisvKiAweDAxICovICB7ICJDbGlwIiwgICAgICAgICAgICAgTkEsICJjbGlwIiB9LAorLyogMHgwMiAqLyAgeyAiQmtQYXQiLCAgICAgICAgICAgICA4LCAiYmFja2dyb3VuZCBwYXR0ZXJuIiB9LAorLyogMHgwMyAqLyAgeyAiVHhGb250IiwgICAgICAgICAgICAyLCAidGV4dCBmb250ICh3b3JkKSIgfSwKKy8qIDB4MDQgKi8gIHsgIlR4RmFjZSIsICAgICAgICAgICAgMSwgInRleHQgZmFjZSAoYnl0ZSkiIH0sCisvKiAweDA1ICovICB7ICJUeE1vZGUiLCAgICAgICAgICAgIDIsICJ0ZXh0IG1vZGUgKHdvcmQpIiB9LAorLyogMHgwNiAqLyAgeyAiU3BFeHRyYSIsICAgICAgICAgICA0LCAic3BhY2UgZXh0cmEgKGZpeGVkIHBvaW50KSIgfSwKKy8qIDB4MDcgKi8gIHsgIlBuU2l6ZSIsICAgICAgICAgICAgNCwgInBlbiBzaXplIChwb2ludCkiIH0sCisvKiAweDA4ICovICB7ICJQbk1vZGUiLCAgICAgICAgICAgIDIsICJwZW4gbW9kZSAod29yZCkiIH0sCisvKiAweDA5ICovICB7ICJQblBhdCIsICAgICAgICAgICAgIDgsICJwZW4gcGF0dGVybiIgfSwKKy8qIDB4MGEgKi8gIHsgIkZpbGxQYXQiLCAgICAgICAgICAgOCwgImZpbGwgcGF0dGVybiIgfSwKKy8qIDB4MGIgKi8gIHsgIk92U2l6ZSIsICAgICAgICAgICAgNCwgIm92YWwgc2l6ZSAocG9pbnQpIiB9LAorLyogMHgwYyAqLyAgeyAiT3JpZ2luIiwgICAgICAgICAgICA0LCAiZGgsIGR2ICh3b3JkKSIgfSwKKy8qIDB4MGQgKi8gIHsgIlR4U2l6ZSIsICAgICAgICAgICAgMiwgInRleHQgc2l6ZSAod29yZCkiIH0sCisvKiAweDBlICovICB7ICJGZ0NvbG9yIiwgICAgICAgICAgIDQsICJmb3JlZ3JvdW5kIGNvbG9yIChsb25nd29yZCkiIH0sCisvKiAweDBmICovICB7ICJCa0NvbG9yIiwgICAgICAgICAgIDQsICJiYWNrZ3JvdW5kIGNvbG9yIChsb25nd29yZCkiIH0sCisvKiAweDEwICovICB7ICJUeFJhdGlvIiwgICAgICAgICAgIDgsICJudW1lcmF0b3IgKHBvaW50KSwgZGVub21pbmF0b3IgKHBvaW50KSIgfSwKKy8qIDB4MTEgKi8gIHsgIlZlcnNpb24iLCAgICAgICAgICAgMSwgInZlcnNpb24gKGJ5dGUpIiB9LAorLyogMHgxMiAqLyAgeyAiQmtQaXhQYXQiLCAgICAgICAgIE5BLCAiY29sb3IgYmFja2dyb3VuZCBwYXR0ZXJuIiB9LAorLyogMHgxMyAqLyAgeyAiUG5QaXhQYXQiLCAgICAgICAgIE5BLCAiY29sb3IgcGVuIHBhdHRlcm4iIH0sCisvKiAweDE0ICovICB7ICJGaWxsUGl4UGF0IiwgICAgICAgTkEsICJjb2xvciBmaWxsIHBhdHRlcm4iIH0sCisvKiAweDE1ICovICB7ICJQbkxvY0hGcmFjIiwgICAgICAgIDIsICJmcmFjdGlvbmFsIHBlbiBwb3NpdGlvbiIgfSwKKy8qIDB4MTYgKi8gIHsgIkNoRXh0cmEiLCAgICAgICAgICAgMiwgImV4dHJhIGZvciBlYWNoIGNoYXJhY3RlciIgfSwKKy8qIDB4MTcgKi8gIHJlcygwKSwKKy8qIDB4MTggKi8gIHJlcygwKSwKKy8qIDB4MTkgKi8gIHJlcygwKSwKKy8qIDB4MWEgKi8gIHsgIlJHQkZnQ29sIiwgICAgUkdCX0xFTiwgIlJHQiBmb3JlQ29sb3IiIH0sCisvKiAweDFiICovICB7ICJSR0JCa0NvbCIsICAgIFJHQl9MRU4sICJSR0IgYmFja0NvbG9yIiB9LAorLyogMHgxYyAqLyAgeyAiSGlsaXRlTW9kZSIsICAgICAgICAwLCAiaGlsaXRlIG1vZGUgZmxhZyIgfSwKKy8qIDB4MWQgKi8gIHsgIkhpbGl0ZUNvbG9yIiwgUkdCX0xFTiwgIlJHQiBoaWxpdGUgY29sb3IiIH0sCisvKiAweDFlICovICB7ICJEZWZIaWxpdGUiLCAgICAgICAgIDAsICJVc2UgZGVmYXVsdCBoaWxpdGUgY29sb3IiIH0sCisvKiAweDFmICovICB7ICJPcENvbG9yIiwgICAgICAgICAgIDYsICJSR0IgT3BDb2xvciBmb3IgYXJpdGhtZXRpYyBtb2RlcyIgfSwKKy8qIDB4MjAgKi8gIHsgIkxpbmUiLCAgICAgICAgICAgICAgOCwgInBuTG9jIChwb2ludCksIG5ld1B0IChwb2ludCkiIH0sCisvKiAweDIxICovICB7ICJMaW5lRnJvbSIsICAgICAgICAgIDQsICJuZXdQdCAocG9pbnQpIiB9LAorLyogMHgyMiAqLyAgeyAiU2hvcnRMaW5lIiwgICAgICAgICA2LCAicG5Mb2MgKHBvaW50LCBkaCwgZHYgKC0xMjggLi4gMTI3KSkiIH0sCisvKiAweDIzICovICB7ICJTaG9ydExpbmVGcm9tIiwgICAgIDIsICJkaCwgZHYgKC0xMjggLi4gMTI3KSIgfSwKKy8qIDB4MjQgKi8gIHJlcyhXT1JEX0xFTiksCisvKiAweDI1ICovICByZXMoV09SRF9MRU4pLAorLyogMHgyNiAqLyAgcmVzKFdPUkRfTEVOKSwKKy8qIDB4MjcgKi8gIHJlcyhXT1JEX0xFTiksCisvKiAweDI4ICovICB7ICJMb25nVGV4dCIsICAgICAgICAgTkEsICJ0eExvYyAocG9pbnQpLCBjb3VudCAoMC4uMjU1KSwgdGV4dCIgfSwKKy8qIDB4MjkgKi8gIHsgIkRIVGV4dCIsICAgICAgICAgICBOQSwgImRoICgwLi4yNTUpLCBjb3VudCAoMC4uMjU1KSwgdGV4dCIgfSwKKy8qIDB4MmEgKi8gIHsgIkRWVGV4dCIsICAgICAgICAgICBOQSwgImR2ICgwLi4yNTUpLCBjb3VudCAoMC4uMjU1KSwgdGV4dCIgfSwKKy8qIDB4MmIgKi8gIHsgIkRIRFZUZXh0IiwgICAgICAgICBOQSwgImRoLCBkdiAoMC4uMjU1KSwgY291bnQgKDAuLjI1NSksIHRleHQiIH0sCisvKiAweDJjICovICByZXMoV09SRF9MRU4pLAorLyogMHgyZCAqLyAgcmVzKFdPUkRfTEVOKSwKKy8qIDB4MmUgKi8gIHJlcyhXT1JEX0xFTiksCisvKiAweDJmICovICByZXMoV09SRF9MRU4pLAorLyogMHgzMCAqLyAgeyAiZnJhbWVSZWN0IiwgICAgICAgICA4LCAicmVjdCIgfSwKKy8qIDB4MzEgKi8gIHsgInBhaW50UmVjdCIsICAgICAgICAgOCwgInJlY3QiIH0sCisvKiAweDMyICovICB7ICJlcmFzZVJlY3QiLCAgICAgICAgIDgsICJyZWN0IiB9LAorLyogMHgzMyAqLyAgeyAiaW52ZXJ0UmVjdCIsICAgICAgICA4LCAicmVjdCIgfSwKKy8qIDB4MzQgKi8gIHsgImZpbGxSZWN0IiwgICAgICAgICAgOCwgInJlY3QiIH0sCisvKiAweDM1ICovICByZXMoOCksCisvKiAweDM2ICovICByZXMoOCksCisvKiAweDM3ICovICByZXMoOCksCisvKiAweDM4ICovICB7ICJmcmFtZVNhbWVSZWN0IiwgICAgIDAsICJyZWN0IiB9LAorLyogMHgzOSAqLyAgeyAicGFpbnRTYW1lUmVjdCIsICAgICAwLCAicmVjdCIgfSwKKy8qIDB4M2EgKi8gIHsgImVyYXNlU2FtZVJlY3QiLCAgICAgMCwgInJlY3QiIH0sCisvKiAweDNiICovICB7ICJpbnZlcnRTYW1lUmVjdCIsICAgIDAsICJyZWN0IiB9LAorLyogMHgzYyAqLyAgeyAiZmlsbFNhbWVSZWN0IiwgICAgICAwLCAicmVjdCIgfSwKKy8qIDB4M2QgKi8gIHJlcygwKSwKKy8qIDB4M2UgKi8gIHJlcygwKSwKKy8qIDB4M2YgKi8gIHJlcygwKSwKKy8qIDB4NDAgKi8gIHsgImZyYW1lUlJlY3QiLCAgICAgICAgOCwgInJlY3QiIH0sCisvKiAweDQxICovICB7ICJwYWludFJSZWN0IiwgICAgICAgIDgsICJyZWN0IiB9LAorLyogMHg0MiAqLyAgeyAiZXJhc2VSUmVjdCIsICAgICAgICA4LCAicmVjdCIgfSwKKy8qIDB4NDMgKi8gIHsgImludmVydFJSZWN0IiwgICAgICAgOCwgInJlY3QiIH0sCisvKiAweDQ0ICovICB7ICJmaWxsUlJyZWN0IiwgICAgICAgIDgsICJyZWN0IiB9LAorLyogMHg0NSAqLyAgcmVzKDgpLAorLyogMHg0NiAqLyAgcmVzKDgpLAorLyogMHg0NyAqLyAgcmVzKDgpLAorLyogMHg0OCAqLyAgeyAiZnJhbWVTYW1lUlJlY3QiLCAgICAwLCAicmVjdCIgfSwKKy8qIDB4NDkgKi8gIHsgInBhaW50U2FtZVJSZWN0IiwgICAgMCwgInJlY3QiIH0sCisvKiAweDRhICovICB7ICJlcmFzZVNhbWVSUmVjdCIsICAgIDAsICJyZWN0IiB9LAorLyogMHg0YiAqLyAgeyAiaW52ZXJ0U2FtZVJSZWN0IiwgICAwLCAicmVjdCIgfSwKKy8qIDB4NGMgKi8gIHsgImZpbGxTYW1lUlJlY3QiLCAgICAgMCwgInJlY3QiIH0sCisvKiAweDRkICovICByZXMoMCksCisvKiAweDRlICovICByZXMoMCksCisvKiAweDRmICovICByZXMoMCksCisvKiAweDUwICovICB7ICJmcmFtZU92YWwiLCAgICAgICAgIDgsICJyZWN0IiB9LAorLyogMHg1MSAqLyAgeyAicGFpbnRPdmFsIiwgICAgICAgICA4LCAicmVjdCIgfSwKKy8qIDB4NTIgKi8gIHsgImVyYXNlT3ZhbCIsICAgICAgICAgOCwgInJlY3QiIH0sCisvKiAweDUzICovICB7ICJpbnZlcnRPdmFsIiwgICAgICAgIDgsICJyZWN0IiB9LAorLyogMHg1NCAqLyAgeyAiZmlsbE92YWwiLCAgICAgICAgICA4LCAicmVjdCIgfSwKKy8qIDB4NTUgKi8gIHJlcyg4KSwKKy8qIDB4NTYgKi8gIHJlcyg4KSwKKy8qIDB4NTcgKi8gIHJlcyg4KSwKKy8qIDB4NTggKi8gIHsgImZyYW1lU2FtZU92YWwiLCAgICAgMCwgInJlY3QiIH0sCisvKiAweDU5ICovICB7ICJwYWludFNhbWVPdmFsIiwgICAgIDAsICJyZWN0IiB9LAorLyogMHg1YSAqLyAgeyAiZXJhc2VTYW1lT3ZhbCIsICAgICAwLCAicmVjdCIgfSwKKy8qIDB4NWIgKi8gIHsgImludmVydFNhbWVPdmFsIiwgICAgMCwgInJlY3QiIH0sCisvKiAweDVjICovICB7ICJmaWxsU2FtZU92YWwiLCAgICAgIDAsICJyZWN0IiB9LAorLyogMHg1ZCAqLyAgcmVzKDApLAorLyogMHg1ZSAqLyAgcmVzKDApLAorLyogMHg1ZiAqLyAgcmVzKDApLAorLyogMHg2MCAqLyAgeyAiZnJhbWVBcmMiLCAgICAgICAgIDEyLCAicmVjdCwgc3RhcnRBbmdsZSwgYXJjQW5nbGUiIH0sCisvKiAweDYxICovICB7ICJwYWludEFyYyIsICAgICAgICAgMTIsICJyZWN0LCBzdGFydEFuZ2xlLCBhcmNBbmdsZSIgfSwKKy8qIDB4NjIgKi8gIHsgImVyYXNlQXJjIiwgICAgICAgICAxMiwgInJlY3QsIHN0YXJ0QW5nbGUsIGFyY0FuZ2xlIiB9LAorLyogMHg2MyAqLyAgeyAiaW52ZXJ0QXJjIiwgICAgICAgIDEyLCAicmVjdCwgc3RhcnRBbmdsZSwgYXJjQW5nbGUiIH0sCisvKiAweDY0ICovICB7ICJmaWxsQXJjIiwgICAgICAgICAgMTIsICJyZWN0LCBzdGFydEFuZ2xlLCBhcmNBbmdsZSIgfSwKKy8qIDB4NjUgKi8gIHJlcygxMiksCisvKiAweDY2ICovICByZXMoMTIpLAorLyogMHg2NyAqLyAgcmVzKDEyKSwKKy8qIDB4NjggKi8gIHsgImZyYW1lU2FtZUFyYyIsICAgICAgNCwgInJlY3QsIHN0YXJ0QW5nbGUsIGFyY0FuZ2xlIiB9LAorLyogMHg2OSAqLyAgeyAicGFpbnRTYW1lQXJjIiwgICAgICA0LCAicmVjdCwgc3RhcnRBbmdsZSwgYXJjQW5nbGUiIH0sCisvKiAweDZhICovICB7ICJlcmFzZVNhbWVBcmMiLCAgICAgIDQsICJyZWN0LCBzdGFydEFuZ2xlLCBhcmNBbmdsZSIgfSwKKy8qIDB4NmIgKi8gIHsgImludmVydFNhbWVBcmMiLCAgICAgNCwgInJlY3QsIHN0YXJ0QW5nbGUsIGFyY0FuZ2xlIiB9LAorLyogMHg2YyAqLyAgeyAiZmlsbFNhbWVBcmMiLCAgICAgICA0LCAicmVjdCwgc3RhcnRBbmdsZSwgYXJjQW5nbGUiIH0sCisvKiAweDZkICovICByZXMoNCksCisvKiAweDZlICovICByZXMoNCksCisvKiAweDZmICovICByZXMoNCksCisvKiAweDcwICovICB7ICJmcmFtZVBvbHkiLCAgICAgICAgTkEsICJwb2x5IiB9LAorLyogMHg3MSAqLyAgeyAicGFpbnRQb2x5IiwgICAgICAgIE5BLCAicG9seSIgfSwKKy8qIDB4NzIgKi8gIHsgImVyYXNlUG9seSIsICAgICAgICBOQSwgInBvbHkiIH0sCisvKiAweDczICovICB7ICJpbnZlcnRQb2x5IiwgICAgICAgTkEsICJwb2x5IiB9LAorLyogMHg3NCAqLyAgeyAiZmlsbFBvbHkiLCAgICAgICAgIE5BLCAicG9seSIgfSwKKy8qIDB4NzUgKi8gIHJlcyhOQSksCisvKiAweDc2ICovICByZXMoTkEpLAorLyogMHg3NyAqLyAgcmVzKE5BKSwKKy8qIDB4NzggKi8gIHsgImZyYW1lU2FtZVBvbHkiLCAgICAgMCwgInBvbHkgKE5ZSSkiIH0sCisvKiAweDc5ICovICB7ICJwYWludFNhbWVQb2x5IiwgICAgIDAsICJwb2x5IChOWUkpIiB9LAorLyogMHg3YSAqLyAgeyAiZXJhc2VTYW1lUG9seSIsICAgICAwLCAicG9seSAoTllJKSIgfSwKKy8qIDB4N2IgKi8gIHsgImludmVydFNhbWVQb2x5IiwgICAgMCwgInBvbHkgKE5ZSSkiIH0sCisvKiAweDdjICovICB7ICJmaWxsU2FtZVBvbHkiLCAgICAgIDAsICJwb2x5IChOWUkpIiB9LAorLyogMHg3ZCAqLyAgcmVzKDApLAorLyogMHg3ZSAqLyAgcmVzKDApLAorLyogMHg3ZiAqLyAgcmVzKDApLAorLyogMHg4MCAqLyAgeyAiZnJhbWVSZ24iLCAgICAgICAgIE5BLCAicmVnaW9uIiB9LAorLyogMHg4MSAqLyAgeyAicGFpbnRSZ24iLCAgICAgICAgIE5BLCAicmVnaW9uIiB9LAorLyogMHg4MiAqLyAgeyAiZXJhc2VSZ24iLCAgICAgICAgIE5BLCAicmVnaW9uIiB9LAorLyogMHg4MyAqLyAgeyAiaW52ZXJ0UmduIiwgICAgICAgIE5BLCAicmVnaW9uIiB9LAorLyogMHg4NCAqLyAgeyAiZmlsbFJnbiIsICAgICAgICAgIE5BLCAicmVnaW9uIiB9LAorLyogMHg4NSAqLyAgcmVzKE5BKSwKKy8qIDB4ODYgKi8gIHJlcyhOQSksCisvKiAweDg3ICovICByZXMoTkEpLAorLyogMHg4OCAqLyAgeyAiZnJhbWVTYW1lUmduIiwgICAgICAwLCAicmVnaW9uIChOWUkpIiB9LAorLyogMHg4OSAqLyAgeyAicGFpbnRTYW1lUmduIiwgICAgICAwLCAicmVnaW9uIChOWUkpIiB9LAorLyogMHg4YSAqLyAgeyAiZXJhc2VTYW1lUmduIiwgICAgICAwLCAicmVnaW9uIChOWUkpIiB9LAorLyogMHg4YiAqLyAgeyAiaW52ZXJ0U2FtZVJnbiIsICAgICAwLCAicmVnaW9uIChOWUkpIiB9LAorLyogMHg4YyAqLyAgeyAiZmlsbFNhbWVSZ24iLCAgICAgICAwLCAicmVnaW9uIChOWUkpIiB9LAorLyogMHg4ZCAqLyAgcmVzKDApLAorLyogMHg4ZSAqLyAgcmVzKDApLAorLyogMHg4ZiAqLyAgcmVzKDApLAorLyogMHg5MCAqLyAgeyAiQml0c1JlY3QiLCAgICAgICAgIE5BLCAiY29weWJpdHMsIHJlY3QgY2xpcHBlZCIgfSwKKy8qIDB4OTEgKi8gIHsgIkJpdHNSZ24iLCAgICAgICAgICBOQSwgImNvcHliaXRzLCByZ24gY2xpcHBlZCIgfSwKKy8qIDB4OTIgKi8gIHJlcyhXT1JEX0xFTiksCisvKiAweDkzICovICByZXMoV09SRF9MRU4pLAorLyogMHg5NCAqLyAgcmVzKFdPUkRfTEVOKSwKKy8qIDB4OTUgKi8gIHJlcyhXT1JEX0xFTiksCisvKiAweDk2ICovICByZXMoV09SRF9MRU4pLAorLyogMHg5NyAqLyAgcmVzKFdPUkRfTEVOKSwKKy8qIDB4OTggKi8gIHsgIlBhY2tCaXRzUmVjdCIsICAgICBOQSwgInBhY2tlZCBjb3B5Yml0cywgcmVjdCBjbGlwcGVkIiB9LAorLyogMHg5OSAqLyAgeyAiUGFja0JpdHNSZ24iLCAgICAgIE5BLCAicGFja2VkIGNvcHliaXRzLCByZ24gY2xpcHBlZCIgfSwKKy8qIDB4OWEgKi8gIHsgIk9wY29kZV85QSIsICAgICAgICBOQSwgInRoZSBteXN0ZXJpb3VzIG9wY29kZSA5QSIgfSwKKy8qIDB4OWIgKi8gIHJlcyhXT1JEX0xFTiksCisvKiAweDljICovICByZXMoV09SRF9MRU4pLAorLyogMHg5ZCAqLyAgcmVzKFdPUkRfTEVOKSwKKy8qIDB4OWUgKi8gIHJlcyhXT1JEX0xFTiksCisvKiAweDlmICovICByZXMoV09SRF9MRU4pLAorLyogMHhhMCAqLyAgeyAiU2hvcnRDb21tZW50IiwgICAgICAyLCAia2luZCAod29yZCkiIH0sCisvKiAweGExICovICB7ICJMb25nQ29tbWVudCIsICAgICAgTkEsICJraW5kICh3b3JkKSwgc2l6ZSAod29yZCksIGRhdGEiIH0KK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RydWN0IE1hY1JlY3QKK3sKKwlXT1JEIHRvcDsKKwlXT1JEIGxlZnQ7CisJV09SRCBib3R0b207CisJV09SRCByaWdodDsKK307CisKK3N0cnVjdCBNYWNwaXhNYXAKK3sKKwkvLyBQdHIgYmFzZUFkZHIgICAgICAgICAgICAgIC8vIE5vdCB1c2VkIGluIGZpbGUuCisJLy8gc2hvcnQgcm93Qnl0ZXMgICAgICAgICAgICAvLyByZWFkIGluIHNlcGVyYXRseS4KKwlzdHJ1Y3QgTWFjUmVjdCBCb3VuZHM7CisJV09SRCB2ZXJzaW9uOworCVdPUkQgcGFja1R5cGU7CisJTE9ORyBwYWNrU2l6ZTsKKwlMT05HIGhSZXM7CisJTE9ORyB2UmVzOworCVdPUkQgcGl4ZWxUeXBlOworCVdPUkQgcGl4ZWxTaXplOworCVdPUkQgY21wQ291bnQ7CisJV09SRCBjbXBTaXplOworCUxPTkcgcGxhbmVCeXRlczsKKwlMT05HIHBtVGFibGU7CisJTE9ORyBwbVJlc2VydmVkOworfTsKKworc3RydWN0IE1hY1JHQkNvbG91cgoreworCVdPUkQgcmVkOworCVdPUkQgZ3JlZW47CisJV09SRCBibHVlOworfTsKKworc3RydWN0IE1hY1BvaW50Cit7CisJV09SRCB4OworCVdPUkQgeTsKK307CisKK3N0cnVjdCBNYWNQYXR0ZXJuIC8vIEtsYXViZQoreworCUJZVEUgcGl4WzY0XTsKK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgCitSZWFkUmVjdCggRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBNYWNSZWN0KiByZWN0ICkgeworCXJlY3QtPnRvcCA9IFJlYWQxNiggaW8sIGhhbmRsZSApOworCXJlY3QtPmxlZnQgPSBSZWFkMTYoIGlvLCBoYW5kbGUgKTsKKwlyZWN0LT5ib3R0b20gPSBSZWFkMTYoIGlvLCBoYW5kbGUgKTsKKwlyZWN0LT5yaWdodCA9IFJlYWQxNiggaW8sIGhhbmRsZSApOworfQorCitzdGF0aWMgdm9pZCAKK1JlYWRQaXhtYXAoIEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSwgTWFjcGl4TWFwKiBwUGl4TWFwICkgeworCXBQaXhNYXAtPnZlcnNpb24gPSBSZWFkMTYoIGlvLCBoYW5kbGUgKTsKKwlwUGl4TWFwLT5wYWNrVHlwZSA9IFJlYWQxNiggaW8sIGhhbmRsZSApOworCXBQaXhNYXAtPnBhY2tTaXplID0gUmVhZDMyKCBpbywgaGFuZGxlICk7CisJcFBpeE1hcC0+aFJlcyA9IFJlYWQxNiggaW8sIGhhbmRsZSApOworCVJlYWQxNiggaW8sIGhhbmRsZSApOworCXBQaXhNYXAtPnZSZXMgPSBSZWFkMTYoIGlvLCBoYW5kbGUgKTsKKwlSZWFkMTYoIGlvLCBoYW5kbGUgKTsKKwlwUGl4TWFwLT5waXhlbFR5cGUgPSBSZWFkMTYoIGlvLCBoYW5kbGUgKTsKKwlwUGl4TWFwLT5waXhlbFNpemUgPSBSZWFkMTYoIGlvLCBoYW5kbGUgKTsKKwlwUGl4TWFwLT5jbXBDb3VudCA9IFJlYWQxNiggaW8sIGhhbmRsZSApOworCXBQaXhNYXAtPmNtcFNpemUgPSBSZWFkMTYoIGlvLCBoYW5kbGUgKTsKKwlwUGl4TWFwLT5wbGFuZUJ5dGVzID0gUmVhZDMyKCBpbywgaGFuZGxlICk7CisJcFBpeE1hcC0+cG1UYWJsZSA9IFJlYWQzMiggaW8sIGhhbmRsZSApOworCXBQaXhNYXAtPnBtUmVzZXJ2ZWQgPSBSZWFkMzIoIGlvLCBoYW5kbGUgKTsKK30KKworLyoqCitSZWFkcyBhIG1hYyBjb2xvciB0YWJsZSBpbnRvIGEgYml0bWFwIHBhbGV0dGUuCisqLworc3RhdGljIHZvaWQgCitSZWFkQ29sb3JUYWJsZSggRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBXT1JEKiBwTnVtQ29sb3JzLCBSR0JRVUFEKiBwUGFsICkgeworCUxPTkcgICAgICAgIGN0U2VlZDsKKwlXT1JEICAgICAgICBjdEZsYWdzOworCVdPUkQgICAgICAgIHZhbDsKKwlpbnQgICAgICAgICBpOworCQorCWN0U2VlZCA9IFJlYWQzMiggaW8sIGhhbmRsZSApOworCWN0RmxhZ3MgPSBSZWFkMTYoIGlvLCBoYW5kbGUgKTsKKwlXT1JEIG51bUNvbG9ycyA9IFJlYWQxNiggaW8sIGhhbmRsZSApKzE7CisJKnBOdW1Db2xvcnMgPSBudW1Db2xvcnM7CisJCisJZm9yIChpID0gMDsgaSA8IG51bUNvbG9yczsgaSsrKSB7CisJCXZhbCA9IFJlYWQxNiggaW8sIGhhbmRsZSApOworCQlpZiAoY3RGbGFncyAmIDB4ODAwMCkgeworCQkJLy8gVGhlIGluZGljaWVzIGluIGEgZGV2aWNlIGNvbG91ciB0YWJsZSBhcmUgYm9ndXMgYW5kCisJCQkvLyB1c3VhbGx5ID09IDAsIHNvIEkgYXNzdW1lIHdlIGFsbG9jYXRlIHVwIHRoZSBsaXN0IG9mCisJCQkvLyBjb2xvdXJzIGluIG9yZGVyLgorCQkJdmFsID0gKFdPUkQpaTsKKwkJfQorCQlpZiAodmFsID49IG51bUNvbG9ycykgeworCQkJdGhyb3cgInBpeGVsIHZhbHVlIGdyZWF0ZXIgdGhhbiBjb2xvciB0YWJsZSBzaXplLiI7CisJCX0KKwkJLy8gTWFjIGNvbG91ciB0YWJsZXMgY29udGFpbiAxNi1iaXQgdmFsdWVzIGZvciBSLCBHLCBhbmQgQi4uLgorCQlwUGFsW3ZhbF0ucmdiUmVkID0gKChCWVRFKSAoKChXT1JEKSAoUmVhZDE2KCBpbywgaGFuZGxlICkpID4+IDgpICYgMHhGRikpOworCQlwUGFsW3ZhbF0ucmdiR3JlZW4gPSAoKEJZVEUpICgoKFdPUkQpIChSZWFkMTYoIGlvLCBoYW5kbGUgKSkgPj4gOCkgJiAweEZGKSk7CisJCXBQYWxbdmFsXS5yZ2JCbHVlID0gKChCWVRFKSAoKChXT1JEKSAoUmVhZDE2KCBpbywgaGFuZGxlICkpID4+IDgpICYgMHhGRikpOworCX0KK30KKworLyoqCitza2lwcyB1bm5lZWRlZCBwYWNrYml0cy4KK3BpeGVsU2l6ZSA9PSBTb3VyY2UgYml0cyBwZXIgcGl4ZWwuCisqLworc3RhdGljIHZvaWQgCitTa2lwQml0cyggRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBNYWNSZWN0KiBib3VuZHMsIFdPUkQgcm93Qnl0ZXMsIGludCBwaXhlbFNpemUgKSB7CisJaW50ICAgIGk7CisJV09SRCAgIHBpeHdpZHRoOyAgICAgICAgICAgLy8gYnl0ZXMgcGVyIHJvdyB3aGVuIHVuY29tcHJlc3NlZC4KKwkKKwlpbnQgaGVpZ2h0ID0gYm91bmRzLT5ib3R0b20gLSBib3VuZHMtPnRvcDsKKwlpbnQgd2lkdGggPSBib3VuZHMtPnJpZ2h0IC0gYm91bmRzLT5sZWZ0OworCQorCS8vIEhpZ2ggYml0IG9mIHJvd0J5dGVzIGlzIGZsYWcuCisJaWYgKHBpeGVsU2l6ZSA8PSA4KSB7CisJCXJvd0J5dGVzICY9IDB4N2ZmZjsKKwl9CisJcGl4d2lkdGggPSAoV09SRCl3aWR0aDsKKwkKKwlpZiAocGl4ZWxTaXplID09IDE2KSB7CisJCXBpeHdpZHRoICo9IDI7CisJfQorCWlmIChyb3dCeXRlcyA9PSAwKSB7CisJCXJvd0J5dGVzID0gcGl4d2lkdGg7CisJfQorCWlmIChyb3dCeXRlcyA8IDgpIHsKKwkJaW8tPnNlZWtfcHJvYyggaGFuZGxlLCByb3dCeXRlcypoZWlnaHQsIFNFRUtfQ1VSICk7CisJfQorCWVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKwkJCWludCBsaW5lTGVuOyAgICAgICAgICAgIC8vIGxlbmd0aCBvZiBzb3VyY2UgbGluZSBpbiBieXRlcy4KKwkJCWlmIChyb3dCeXRlcyA+IDI1MCkgeworCQkJCWxpbmVMZW4gPSBSZWFkMTYoIGlvLCBoYW5kbGUgKTsKKwkJCX0gZWxzZSB7CisJCQkJbGluZUxlbiA9IFJlYWQ4KCBpbywgaGFuZGxlICk7CisJCQl9CisJCQlpby0+c2Vla19wcm9jKCBoYW5kbGUsIGxpbmVMZW4sIFNFRUtfQ1VSICk7CisJCX0KKwl9Cit9CisKKy8qKgorU2tpcCBwb2x5Z29uIG9yIHJlZ2lvbgorKi8KK3N0YXRpYyB2b2lkIAorU2tpcFBvbHlPclJlZ2lvbiggRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlICkgeworCVdPUkQgbGVuID0gUmVhZDE2KCBpbywgaGFuZGxlICkgLSAyOworCWlvLT5zZWVrX3Byb2MoaGFuZGxlLCBsZW4sIFNFRUtfQ1VSKTsJCit9CisKKy8qKgorV2lkdGggaW4gYnl0ZXMgZm9yIDggYnBwIG9yIGxlc3MuCitXaWR0aCBpbiBwaXhlbHMgZm9yIDE2IGJwcC4KK0V4cGFuZHMgV2lkdGggdW5pdHMgdG8gMzItYml0IHBpeGVsIGRhdGEuCisqLworc3RhdGljIHZvaWQgCitleHBhbmRCdWYoIEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSwgaW50IHdpZHRoLCBpbnQgYnBwLCBCWVRFKiBkc3QgKSB7IAorCXN3aXRjaCAoYnBwKSB7CisJCWNhc2UgMTY6CisJCQlmb3IgKCBpbnQgaT0wOyBpPHdpZHRoOyBpKyspIHsKKwkJCQlXT1JEIHNyYyA9IFJlYWQxNiggaW8sIGhhbmRsZSApOworCQkJCWRzdFsgRklfUkdCQV9CTFVFIF0gPSAoc3JjICYgMzEpKjg7CQkJCS8vIEJsdWUKKwkJCQlkc3RbIEZJX1JHQkFfR1JFRU4gXSA9ICgoc3JjID4+IDUpICYgMzEpKjg7CQkvLyBHcmVlbgorCQkJCWRzdFsgRklfUkdCQV9SRUQgXSA9ICgoc3JjID4+IDEwKSAmIDMxKSo4OwkJLy8gUmVkCisJCQkJZHN0WyBGSV9SR0JBX0FMUEhBIF0gPSAweEZGOwkJCQkJLy8gQWxwaGEKKwkJCQlkc3QgKz0gNDsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdGhyb3cgIkJhZCBiaXRzIHBlciBwaXhlbCBpbiBleHBhbmRCdWYuIjsKKwl9Cit9CisKKy8qKgorRXhwYW5kcyBXaWR0aCB1bml0cyB0byA4LWJpdCBwaXhlbCBkYXRhLgorTWF4LiA4IGJwcCBzb3VyY2UgZm9ybWF0LgorKi8KK3N0YXRpYyB2b2lkIAorZXhwYW5kQnVmOCggRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBpbnQgd2lkdGgsIGludCBicHAsIEJZVEUqIGRzdCApCit7CisJc3dpdGNoIChicHApIHsKKwkJY2FzZSA4OgorCQkJaW8tPnJlYWRfcHJvYyggZHN0LCB3aWR0aCwgMSwgaGFuZGxlICk7CisJCQlicmVhazsKKwkJY2FzZSA0OgorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB3aWR0aDsgaSsrKSB7CisJCQkJV09SRCBzcmMgPSBSZWFkOCggaW8sIGhhbmRsZSApOworCQkJCSpkc3QgPSAoc3JjID4+IDQpICYgMTU7CisJCQkJKihkc3QrMSkgPSAoc3JjICYgMTUpOworCQkJCWRzdCArPSAyOworCQkJfQorCQkJaWYgKHdpZHRoICYgMSkgeyAvLyBPZGQgV2lkdGg/CisJCQkJV09SRCBzcmMgPSBSZWFkOCggaW8sIGhhbmRsZSApOworCQkJCSpkc3QgPSAoc3JjID4+IDQpICYgMTU7CisJCQkJZHN0Kys7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB3aWR0aDsgaSsrKSB7CisJCQkJV09SRCBzcmMgPSBSZWFkOCggaW8sIGhhbmRsZSApOworCQkJCSpkc3QgPSAoc3JjID4+IDYpICYgMzsKKwkJCQkqKGRzdCsxKSA9IChzcmMgPj4gNCkgJiAzOworCQkJCSooZHN0KzIpID0gKHNyYyA+PiAyKSAmIDM7CisJCQkJKihkc3QrMykgPSAoc3JjICYgMyk7CisJCQkJZHN0ICs9IDQ7CisJCQl9CisJCQlpZiAod2lkdGggJiAzKSAgeyAvLyBDaGVjayBmb3IgbGVmdG92ZXIgcGl4ZWxzCisJCQkJZm9yIChpbnQgaSA9IDY7IGkgPiA4IC0gKHdpZHRoICYgMykgKiAyOyBpIC09IDIpIHsKKwkJCQkJV09SRCBzcmMgPSBSZWFkOCggaW8sIGhhbmRsZSApOworCQkJCQkqZHN0ID0gKHNyYyA+PiBpKSAmIDM7CisJCQkJCWRzdCsrOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHdpZHRoOyBpKyspIHsKKwkJCQlXT1JEIHNyYyA9IFJlYWQ4KCBpbywgaGFuZGxlICk7CisJCQkJKmRzdCA9IChzcmMgPj4gNykgJiAxOworCQkJCSooZHN0KzEpID0gKHNyYyA+PiA2KSAmIDE7CisJCQkJKihkc3QrMikgPSAoc3JjID4+IDUpICYgMTsKKwkJCQkqKGRzdCszKSA9IChzcmMgPj4gNCkgJiAxOworCQkJCSooZHN0KzQpID0gKHNyYyA+PiAzKSAmIDE7CisJCQkJKihkc3QrNSkgPSAoc3JjID4+IDIpICYgMTsKKwkJCQkqKGRzdCs2KSA9IChzcmMgPj4gMSkgJiAxOworCQkJCSooZHN0KzcpID0gKHNyYyAgJiAxKTsKKwkJCQlkc3QgKz0gODsKKwkJCX0KKwkJCWlmICh3aWR0aCAmIDcpIHsgIC8vIENoZWNrIGZvciBsZWZ0b3ZlciBwaXhlbHMKKwkJCQlmb3IgKGludCBpID0gNzsgaSA+ICg4LXdpZHRoICYgNyk7IGktLSkgeworCQkJCQlXT1JEIHNyYyA9IFJlYWQ4KCBpbywgaGFuZGxlICk7CisJCQkJCSpkc3QgPSAoc3JjID4+IGkpICYgMTsKKwkJCQkJZHN0Kys7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl0aHJvdyAiQmFkIGJpdHMgcGVyIHBpeGVsIGluIGV4cGFuZEJ1ZjguIjsKKwl9Cit9CisKK3N0YXRpYyBCWVRFKiAKK1VucGFja1BpY3RSb3coIEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSwgQllURSogcExpbmVCdWYsIGludCB3aWR0aCwgaW50IHJvd0J5dGVzLCBpbnQgc3JjQnl0ZXMgKSB7CQorCisJaWYgKHJvd0J5dGVzIDwgOCkgeyAvLyBBaC1oYSEgIFRoZSBiaXRzIGFyZW4ndCBhY3R1YWxseSBwYWNrZWQuICBUaGlzIHdpbGwgYmUgZWFzeS4KKwkJaW8tPnJlYWRfcHJvYyggcExpbmVCdWYsIHJvd0J5dGVzLCAxLCBoYW5kbGUgKTsKKwl9CisJZWxzZSB7CisJCUJZVEUqIHBDdXJQaXhlbCA9IHBMaW5lQnVmOworCQkKKwkJLy8gVW5wYWNrIFJMRS4gVGhlIGRhdGEgaXMgcGFja2VkIGJ5dGV3aXNlLgorCQlmb3IgKGludCBqID0gMDsgaiA8IHNyY0J5dGVzOyApCXsKKwkJCUJZVEUgRmxhZ0NvdW50ZXIgPSBSZWFkOCggaW8sIGhhbmRsZSApOworCQkJaWYgKEZsYWdDb3VudGVyICYgMHg4MCkgeworCQkJCWlmIChGbGFnQ291bnRlciA9PSAweDgwKSB7CisJCQkJCS8vIFNwZWNpYWwgY2FzZTogcmVwZWF0IHZhbHVlIG9mIDAuCisJCQkJCS8vIEFwcGxlIHNheXMgaWdub3JlLgorCQkJCQlqKys7CisJCQkJfSBlbHNlIHsgCisJCQkJCS8vIFBhY2tlZCBkYXRhLgorCQkJCQlpbnQgbGVuID0gKChGbGFnQ291bnRlciBeIDI1NSkgJiAyNTUpICsgMjsJCQkJCQorCQkJCQlCWVRFIHAgPSBSZWFkOCggaW8sIGhhbmRsZSApOworCQkJCQltZW1zZXQoIHBDdXJQaXhlbCwgcCwgbGVuKTsKKwkJCQkJcEN1clBpeGVsICs9IGxlbjsKKwkJCQkJaiArPSAyOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgeyAKKwkJCQkvLyBVbnBhY2tlZCBkYXRhCisJCQkJaW50IGxlbiA9IChGbGFnQ291bnRlciAmIDI1NSkgKyAxOworCQkJCWlvLT5yZWFkX3Byb2MoIHBDdXJQaXhlbCwgbGVuLCAxLCBoYW5kbGUgKTsKKwkJCQlwQ3VyUGl4ZWwgKz0gbGVuOworCQkJCWogKz0gbGVuICsgMTsKKwkJCX0KKwkJfQorCX0KKwkKKwlyZXR1cm4gcExpbmVCdWY7Cit9CisKKy8qKgorVGhpcyByb3V0aW5lIGRlY29tcHJlc3NlcyBCaXRzUmVjdHMgd2l0aCBhIHBhY2tUeXBlIG9mIDQgKGFuZCAzMiBiaXRzIHBlciBwaXhlbCkuIAorSW4gdGhpcyBmb3JtYXQsIGVhY2ggbGluZSBpcyBzZXBhcmF0ZWQgaW50byA4LWJpdC1iaXRwbGFuZXMgYW5kIHRoZW4gY29tcHJlc3NlZCB2aWEgUkxFLiAKK1RvIGRlY29kZSwgdGhlIHJvdXRpbmUgZGVjb21wcmVzc2VzIGVhY2ggbGluZSAmIHRoZW4ganVnZ2xlcyB0aGUgYnl0ZXMgYXJvdW5kIHRvIGdldCBwaXhlbC1vcmllbnRlZCBkYXRhLgorTnVtQml0UGxhbmVzID09IDMgaWYgUkdCLCA0IGlmIFJHQkEKKyovCitzdGF0aWMgdm9pZCAKK1VucGFjazMyQml0cyggRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBGSUJJVE1BUCogZGliLCBNYWNSZWN0KiBib3VuZHMsIFdPUkQgcm93Qnl0ZXMsIGludCBudW1QbGFuZXMgKSB7CisJaW50IGhlaWdodCA9IGJvdW5kcy0+Ym90dG9tIC0gYm91bmRzLT50b3A7CisJaW50IHdpZHRoID0gYm91bmRzLT5yaWdodCAtIGJvdW5kcy0+bGVmdDsKKwkKKwlpZiAocm93Qnl0ZXMgPT0gMCkgeworCQlyb3dCeXRlcyA9IChXT1JEKSggd2lkdGggKiA0ICk7CisJfQorCQorCUJZVEUqIHBMaW5lQnVmID0gKEJZVEUqKW1hbGxvYyggcm93Qnl0ZXMgKTsgLy8gTGV0J3MgYWxsb2NhdGUgZW5vdWdoIGZvciA0IGJpdCBwbGFuZXMKKwlpZiAoIHBMaW5lQnVmICkJeworCQl0cnkJeworCQkJZm9yICggaW50IGkgPSAwOyBpIDwgaGVpZ2h0OyBpKysgKSB7IAorCQkJCS8vIGZvciBlYWNoIGxpbmUgZG8uLi4KKwkJCQlpbnQgbGluZWxlbjsgICAgICAgICAgICAvLyBsZW5ndGggb2Ygc291cmNlIGxpbmUgaW4gYnl0ZXMuCisJCQkJaWYgKHJvd0J5dGVzID4gMjUwKSB7CisJCQkJCWxpbmVsZW4gPSBSZWFkMTYoIGlvLCBoYW5kbGUgKTsKKwkJCQl9IGVsc2UgeworCQkJCQlsaW5lbGVuID0gUmVhZDgoIGlvLCBoYW5kbGUpOworCQkJCX0KKwkJCQkKKwkJCQlCWVRFKiBwQnVmID0gVW5wYWNrUGljdFJvdyggaW8sIGhhbmRsZSwgcExpbmVCdWYsIHdpZHRoLCByb3dCeXRlcywgbGluZWxlbiApOworCQkJCQorCQkJCS8vIENvbnZlcnQgcGxhbmUtb3JpZW50ZWQgZGF0YSBpbnRvIHBpeGVsLW9yaWVudGVkIGRhdGEgJgorCQkJCS8vIGNvcHkgaW50byBkZXN0aW5hdGlvbiBiaXRtYXAuCisJCQkJQllURSogZHN0ID0gKEJZVEUqKUZyZWVJbWFnZV9HZXRTY2FuTGluZSggZGliLCBoZWlnaHQgLSAxIC0gaSk7CisJCQkJCisJCQkJaWYgKCBudW1QbGFuZXMgPT0gMyApIHsKKwkJCQkJZm9yICggaW50IGogPSAwOyBqIDwgd2lkdGg7IGorKyApIHsgCisJCQkJCQkvLyBGb3IgZWFjaCBwaXhlbCBpbiBsaW5lLi4uCisJCQkJCQlkc3RbIEZJX1JHQkFfQkxVRSBdID0gKCoocEJ1Zit3aWR0aCoyKSk7ICAgICAvLyBCbHVlCisJCQkJCQlkc3RbIEZJX1JHQkFfR1JFRU4gXSA9ICgqKHBCdWYrd2lkdGgpKTsgICAgICAgLy8gR3JlZW4KKwkJCQkJCWRzdFsgRklfUkdCQV9SRUQgXSA9ICgqcEJ1Zik7ICAgICAgICAgICAgIC8vIFJlZAorCQkJCQkJZHN0WyBGSV9SR0JBX0FMUEhBIF0gPSAoMHhGRik7CisJCQkJCQlkc3QgKz0gNDsKKwkJCQkJCXBCdWYrKzsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWZvciAoIGludCBqID0gMDsgaiA8IHdpZHRoOyBqKysgKSB7IAorCQkJCQkJLy8gRm9yIGVhY2ggcGl4ZWwgaW4gbGluZS4uLgorCQkJCQkJZHN0WyBGSV9SR0JBX0JMVUUgXSA9ICgqKHBCdWYrd2lkdGgqMykpOyAgICAgLy8gQmx1ZQorCQkJCQkJZHN0WyBGSV9SR0JBX0dSRUVOIF0gPSAoKihwQnVmK3dpZHRoKjIpKTsgICAgIC8vIEdyZWVuCisJCQkJCQlkc3RbIEZJX1JHQkFfUkVEIF0gPSAoKihwQnVmK3dpZHRoKSk7ICAgICAgIC8vIFJlZAorCQkJCQkJZHN0WyBGSV9SR0JBX0FMUEhBIF0gPSAoKnBCdWYpOworCQkJCQkJZHN0ICs9IDQ7CisJCQkJCQlwQnVmKys7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJY2F0Y2goIC4uLiApIHsKKwkJCWZyZWUoIHBMaW5lQnVmICk7CisJCQl0aHJvdzsKKwkJfQorCX0KKwlmcmVlKCBwTGluZUJ1ZiApOworfQorCisvKioKK0RlY29tcHJlc3Npb24gcm91dGluZSBmb3IgOCBicHAuIAorcm93Qnl0ZXMgaXMgdGhlIG51bWJlciBvZiBieXRlcyBlYWNoIHNvdXJjZSByb3cgd291bGQgdGFrZSBpZiBpdCB3ZXJlIHVuY29tcHJlc3NlZC4KK1RoaXMgX2lzbid0XyBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIHBpeGVscyBpbiB0aGUgcm93IC0gaXQgc2VlbXMgYXBwbGUgcGFkcyB0aGUgZGF0YSB0byBhIHdvcmQgYm91bmRhcnkgYW5kIHRoZW4gY29tcHJlc3NlcyBpdC4gCitPZiBjb3Vyc2UsIHdlIGhhdmUgdG8gZGVjb21wcmVzcyB0aGUgZXhjZXNzIGRhdGEgYW5kIHRoZW4gdGhyb3cgaXQgYXdheS4KKyovCitzdGF0aWMgdm9pZCAKK1VucGFjazhCaXRzKCBGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIEZJQklUTUFQKiBkaWIsIE1hY1JlY3QqIGJvdW5kcywgV09SRCByb3dCeXRlcyApIHsJCisJaW50IGhlaWdodCA9IGJvdW5kcy0+Ym90dG9tIC0gYm91bmRzLT50b3A7CisJaW50IHdpZHRoID0gYm91bmRzLT5yaWdodCAtIGJvdW5kcy0+bGVmdDsKKwkKKwkvLyBIaWdoIGJpdCBvZiByb3dCeXRlcyBpcyBmbGFnLgorCXJvd0J5dGVzICY9IDB4N2ZmZjsKKwkKKwlpZiAocm93Qnl0ZXMgPT0gMCkgeworCQlyb3dCeXRlcyA9IChXT1JEKXdpZHRoOworCX0KKwkKKwlmb3IgKCBpbnQgaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKyApIHsKKwkJaW50IGxpbmVsZW47ICAgICAgICAgICAgLy8gbGVuZ3RoIG9mIHNvdXJjZSBsaW5lIGluIGJ5dGVzLgorCQlpZiAocm93Qnl0ZXMgPiAyNTApIHsKKwkJCWxpbmVsZW4gPSBSZWFkMTYoIGlvLCBoYW5kbGUgKTsKKwkJfSBlbHNlIHsKKwkJCWxpbmVsZW4gPSBSZWFkOCggaW8sIGhhbmRsZSApOworCQl9CisJCUJZVEUqIGRzdCA9IChCWVRFKilGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoIGRpYiwgaGVpZ2h0IC0gMSAtIGkpOwkJCQkKKwkJZHN0ID0gVW5wYWNrUGljdFJvdyggaW8sIGhhbmRsZSwgZHN0LCB3aWR0aCwgcm93Qnl0ZXMsIGxpbmVsZW4gKTsKKwl9Cit9CisKKy8qKgorRGVjb21wcmVzc2lvbiByb3V0aW5lIGZvciBldmVyeXRoaW5nIGJ1dCA4ICYgMzIgYnBwLiAKK1RoaXMgcm91dGluZSBpcyBzbG93ZXIgdGhhbiB0aGUgdHdvIHJvdXRpbmVzIGFib3ZlIHNpbmNlIGl0IGhhcyB0byBkZWFsIHdpdGggYSBsb3Qgb2Ygc3BlY2lhbCBjYXNlcyA6LSguCitJdCdzIGFsc28gYSBiaXQgY2hhb3RpYyBiZWNhdXNlIG9mIHRoZXNlIHNwZWNpYWwgY2FzZXMuLi4KK3VucGFjazhiaXRzIGlzIGJhc2ljYWxseSBhIGR1bWJlciB2ZXJzaW9uIG9mIHVucGFja2JpdHMuCitwaXhlbFNpemUgPT0gU291cmNlIGJpdHMgcGVyIHBpeGVsLgorKi8KK3N0YXRpYyB2b2lkIAorVW5wYWNrQml0cyggRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBGSUJJVE1BUCogZGliLCBNYWNSZWN0KiBib3VuZHMsIFdPUkQgcm93Qnl0ZXMsIGludCBwaXhlbFNpemUgKSB7CisJV09SRCAgIHBpeHdpZHRoOyAgICAgICAgICAgLy8gYnl0ZXMgcGVyIHJvdyB3aGVuIHVuY29tcHJlc3NlZC4KKwlpbnQgICAgcGtwaXhzaXplOworCWludCAgICBQaXhlbFBlclJMRVVuaXQ7CisKKwljaGFyIG91dHB1dE1lc3NhZ2VbIG91dHB1dE1lc3NhZ2VTaXplIF0gPSAiIjsKKwkKKwlpbnQgaGVpZ2h0ID0gYm91bmRzLT5ib3R0b20gLSBib3VuZHMtPnRvcDsKKwlpbnQgd2lkdGggPSBib3VuZHMtPnJpZ2h0IC0gYm91bmRzLT5sZWZ0OworCQorCS8vIEhpZ2ggYml0IG9mIHJvd0J5dGVzIGlzIGZsYWcuCisJaWYgKHBpeGVsU2l6ZSA8PSA4KSB7CisJCXJvd0J5dGVzICY9IDB4N2ZmZjsKKwl9CisJCisJcGl4d2lkdGggPSAoV09SRCl3aWR0aDsKKwlwa3BpeHNpemUgPSAxOyAgICAgICAgICAvLyBSTEUgdW5pdDogb25lIGJ5dGUgZm9yIGV2ZXJ5dGhpbmcuLi4KKwlpZiAocGl4ZWxTaXplID09IDE2KSB7ICAgIC8vIC4uLmV4Y2VwdCAxNiBicHAuCisJCXBrcGl4c2l6ZSA9IDI7CisJCXBpeHdpZHRoICo9IDI7CisJfQorCQorCWlmIChyb3dCeXRlcyA9PSAwKSB7CisJCXJvd0J5dGVzID0gcGl4d2lkdGg7CisJfQorCQorCXsKKwkJLy8gSSBhbGxvY2F0ZSB0aGUgdGVtcG9yYXJ5IGxpbmUgYnVmZmVyIGhlcmUuIEkgYWxsb2NhdGUgdG9vCisJCS8vIG11Y2ggbWVtb3J5IHRvIGNvbXBlbnNhdGUgZm9yIHNsb3BweSAoJiBoZW5jZSBmYXN0KSBkZWNvbXByZXNzaW9uLgorCQlzd2l0Y2ggKHBpeGVsU2l6ZSkgeworCQkJY2FzZSAxOgorCQkJCVBpeGVsUGVyUkxFVW5pdCA9IDg7CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQkJUGl4ZWxQZXJSTEVVbml0ID0gNDsKKwkJCQlicmVhazsKKwkJCWNhc2UgNDoKKwkJCQlQaXhlbFBlclJMRVVuaXQgPSAyOworCQkJCWJyZWFrOworCQkJY2FzZSA4OgorCQkJCVBpeGVsUGVyUkxFVW5pdCA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlIDE2OgorCQkJCVBpeGVsUGVyUkxFVW5pdCA9IDE7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXNwcmludGYoIG91dHB1dE1lc3NhZ2UsICJJbGxlZ2FsIGJwcCB2YWx1ZSBpbiB1bnBhY2tiaXRzOiAlZFxuIiwgcGl4ZWxTaXplICk7CisJCQkJdGhyb3cgb3V0cHV0TWVzc2FnZTsKKwkJfQorCQkKKwkJaWYgKHJvd0J5dGVzIDwgOCkgeyAKKwkJCS8vIGFoLWhhISAgVGhlIGJpdHMgYXJlbid0IGFjdHVhbGx5IHBhY2tlZC4gIFRoaXMgd2lsbCBiZSBlYXN5LgorCQkJZm9yICggaW50IGkgPSAwOyBpIDwgaGVpZ2h0OyBpKysgKSB7CisJCQkJQllURSogZHN0ID0gKEJZVEUqKUZyZWVJbWFnZV9HZXRTY2FuTGluZSggZGliLCBoZWlnaHQgLSAxIC0gaSk7CisJCQkJaWYgKHBpeGVsU2l6ZSA9PSAxNikgeworCQkJCQlleHBhbmRCdWYoIGlvLCBoYW5kbGUsIHdpZHRoLCBwaXhlbFNpemUsIGRzdCApOworCQkJCX0gZWxzZSB7CisJCQkJCWV4cGFuZEJ1ZjgoIGlvLCBoYW5kbGUsIHdpZHRoLCBwaXhlbFNpemUsIGRzdCApOworCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCWZvciAoIGludCBpID0gMDsgaSA8IGhlaWdodDsgaSsrICkgeyAKKwkJCQkvLyBGb3IgZWFjaCBsaW5lIGRvLi4uCisJCQkJaW50ICAgIGxpbmVsZW47ICAgICAgICAgICAgLy8gbGVuZ3RoIG9mIHNvdXJjZSBsaW5lIGluIGJ5dGVzLgorCQkJCWlmIChyb3dCeXRlcyA+IDI1MCkgeworCQkJCQlsaW5lbGVuID0gUmVhZDE2KCBpbywgaGFuZGxlICk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbGluZWxlbiA9IFJlYWQ4KCBpbywgaGFuZGxlICk7CisJCQkJfQorCQkJCQorCQkJCUJZVEUqIGRzdCA9IChCWVRFKilGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoIGRpYiwgaGVpZ2h0IC0gMSAtIGkpOworCQkJCUJZVEUgRmxhZ0NvdW50ZXI7CisJCQkJCisJCQkJLy8gVW5wYWNrIFJMRS4gVGhlIGRhdGEgaXMgcGFja2VkIGJ5dGV3aXNlIC0gZXhjZXB0IGZvcgorCQkJCS8vIDE2IGJwcCBkYXRhLCB3aGljaCBpcyBwYWNrZWQgcGVyIHBpeGVsIDotKC4KKwkJCQlmb3IgKCBpbnQgaiA9IDA7IGogPCBsaW5lbGVuOyApIHsKKwkJCQkJRmxhZ0NvdW50ZXIgPSBSZWFkOCggaW8sIGhhbmRsZSApOworCQkJCQlpZiAoRmxhZ0NvdW50ZXIgJiAweDgwKSB7CisJCQkJCQlpZiAoRmxhZ0NvdW50ZXIgPT0gMHg4MCkgeworCQkJCQkJCS8vIFNwZWNpYWwgY2FzZTogcmVwZWF0IHZhbHVlIG9mIDAuCisJCQkJCQkJLy8gQXBwbGUgc2F5cyBpZ25vcmUuCisJCQkJCQkJaisrOworCQkJCQkJfQorCQkJCQkJZWxzZSB7IAorCQkJCQkJCS8vIFBhY2tlZCBkYXRhLgorCQkJCQkJCWludCBsZW4gPSAoKEZsYWdDb3VudGVyIF4gMjU1KSAmIDI1NSkgKyAyOworCQkJCQkJCQorCQkJCQkJCS8vIFRoaXMgaXMgc2xvdyBmb3Igc29tZSBmb3JtYXRzLi4uCisJCQkJCQkJaWYgKHBpeGVsU2l6ZSA9PSAxNikgeworCQkJCQkJCQlleHBhbmRCdWYoIGlvLCBoYW5kbGUsIDEsIHBpeGVsU2l6ZSwgZHN0ICk7CisJCQkJCQkJCWZvciAoIGludCBrID0gMTsgayA8IGxlbjsgaysrICkgeyAKKwkJCQkJCQkJCS8vIFJlcGVhdCB0aGUgcGl4ZWwgbGVuIHRpbWVzLgorCQkJCQkJCQkJbWVtY3B5KCBkc3QrKGsqNCpQaXhlbFBlclJMRVVuaXQpLCBkc3QsCTQqUGl4ZWxQZXJSTEVVbml0KTsKKwkJCQkJCQkJfQorCQkJCQkJCQlkc3QgKz0gbGVuKjQqUGl4ZWxQZXJSTEVVbml0OworCQkJCQkJCX0KKwkJCQkJCQllbHNlIHsKKwkJCQkJCQkJZXhwYW5kQnVmOCggaW8sIGhhbmRsZSwgMSwgcGl4ZWxTaXplLCBkc3QgKTsKKwkJCQkJCQkJZm9yICggaW50IGsgPSAxOyBrIDwgbGVuOyBrKysgKSB7IAorCQkJCQkJCQkJLy8gUmVwZWF0IHRoZSBleHBhbmRlZCBieXRlIGxlbiB0aW1lcy4KKwkJCQkJCQkJCW1lbWNweSggZHN0KyhrKlBpeGVsUGVyUkxFVW5pdCksIGRzdCwgUGl4ZWxQZXJSTEVVbml0KTsKKwkJCQkJCQkJfQorCQkJCQkJCQlkc3QgKz0gbGVuKlBpeGVsUGVyUkxFVW5pdDsKKwkJCQkJCQl9CisJCQkJCQkJaiArPSBwa3BpeHNpemUgKyAxOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWVsc2UgeyAKKwkJCQkJCS8vIFVucGFja2VkIGRhdGEKKwkJCQkJCWludCBsZW4gPSAoRmxhZ0NvdW50ZXIgJiAyNTUpICsgMTsKKwkJCQkJCWlmIChwaXhlbFNpemUgPT0gMTYpIHsKKwkJCQkJCQlleHBhbmRCdWYoIGlvLCBoYW5kbGUsIGxlbiwgcGl4ZWxTaXplLCBkc3QgKTsKKwkJCQkJCQlkc3QgKz0gbGVuKjQqUGl4ZWxQZXJSTEVVbml0OworCQkJCQkJfQorCQkJCQkJZWxzZSB7CisJCQkJCQkJZXhwYW5kQnVmOCggaW8sIGhhbmRsZSwgbGVuLCBwaXhlbFNpemUsIGRzdCApOworCQkJCQkJCWRzdCArPSBsZW4qUGl4ZWxQZXJSTEVVbml0OworCQkJCQkJfQorCQkJCQkJaiArPSAoIGxlbiAqIHBrcGl4c2l6ZSApICsgMTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgCitEZWNvZGVPcDlhKCBGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIEZJQklUTUFQKiBkaWIsIE1hY3BpeE1hcCogcGl4TWFwICkgeworCS8vIERvIHRoZSBhY3R1YWwgdW5wYWNraW5nLgorCXN3aXRjaCAoIHBpeE1hcC0+cGl4ZWxTaXplICkgeworCQljYXNlIDMyOgorCQkJVW5wYWNrMzJCaXRzKCBpbywgaGFuZGxlLCBkaWIsICZwaXhNYXAtPkJvdW5kcywgMCwgcGl4TWFwLT5jbXBDb3VudCApOworCQkJYnJlYWs7CisJCWNhc2UgODoKKwkJCVVucGFjazhCaXRzKCBpbywgaGFuZGxlLCBkaWIsICZwaXhNYXAtPkJvdW5kcywgMCApOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlVbnBhY2tCaXRzKCBpbywgaGFuZGxlLCBkaWIsICZwaXhNYXAtPkJvdW5kcywgMCwgcGl4TWFwLT5waXhlbFNpemUgKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIAorRGVjb2RlQml0bWFwKCBGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIEZJQklUTUFQKiBkaWIsIEJPT0wgaXNSZWdpb24sIE1hY1JlY3QqIGJvdW5kcywgV09SRCByb3dCeXRlcyApIHsKKwlXT1JEIG1vZGUgPSBSZWFkMTYoIGlvLCBoYW5kbGUgKTsKKwkKKwlpZiAoIGlzUmVnaW9uICkgeworCQlTa2lwUG9seU9yUmVnaW9uKCBpbywgaGFuZGxlICk7CisJfQorCQorCVJHQlFVQUQqIHBhbCA9IEZyZWVJbWFnZV9HZXRQYWxldHRlKCBkaWIgKTsKKwlpZiAoICFwYWwgKSB7CisJCXRocm93ICJObyBwYWxldHRlIGZvciBiaXRtYXAhIjsKKwl9CisJCisJZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJdW5zaWduZWQgY2hhciB2YWwgPSBpID8gMHhGRiA6IDB4MDsKKwkJcGFsW2ldLnJnYlJlZCA9IHZhbDsKKwkJcGFsW2ldLnJnYkdyZWVuID0gdmFsOworCQlwYWxbaV0ucmdiQmx1ZSA9IHZhbDsKKwl9CisJCisJVW5wYWNrQml0cyggaW8sIGhhbmRsZSwgZGliLCBib3VuZHMsIHJvd0J5dGVzLCAxICk7Cit9CisKK3N0YXRpYyB2b2lkIAorRGVjb2RlUGl4bWFwKCBGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIEZJQklUTUFQKiBkaWIsIEJPT0wgaXNSZWdpb24sIE1hY3BpeE1hcCogcGl4TWFwLCBXT1JEIHJvd0J5dGVzICkgeworCS8vIFJlYWQgbWFjIGNvbG91ciB0YWJsZSBpbnRvIHdpbmRvd3MgcGFsZXR0ZS4KKwlXT1JEIG51bUNvbG9yczsgICAgLy8gUGFsZXR0ZSBzaXplLgorCVJHQlFVQUQgY3RbMjU2XTsKKwkKKwlSZWFkQ29sb3JUYWJsZSggaW8sIGhhbmRsZSwgJm51bUNvbG9ycywgY3QgKTsKKwlpZiAoIEZyZWVJbWFnZV9HZXRCUFAoIGRpYiApID09IDggKSB7CisJCVJHQlFVQUQqIHBhbCA9IEZyZWVJbWFnZV9HZXRQYWxldHRlKCBkaWIgKTsKKwkJaWYgKCAhcGFsICkgeworCQkJdGhyb3cgIk5vIHBhbGV0dGUgZm9yIGJpdG1hcCEiOworCQl9CisJCQorCQlmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbG9yczsgaSsrKSB7CisJCQlwYWxbaV0ucmdiUmVkID0gY3RbIGkgXS5yZ2JSZWQ7CisJCQlwYWxbaV0ucmdiR3JlZW4gPSBjdFsgaSBdLnJnYkdyZWVuOworCQkJcGFsW2ldLnJnYkJsdWUgPSBjdFsgaSBdLnJnYkJsdWU7CisJCX0KKwl9CisJCisJLy8gSWdub3JlIHNvdXJjZSAmIGRlc3RpbmF0aW9uIHJlY3RhbmdsZSBhcyB3ZWxsIGFzIHRyYW5zZmVyIG1vZGUuCisJTWFjUmVjdCB0ZW1wUmVjdDsKKwlSZWFkUmVjdCggaW8sIGhhbmRsZSwgJnRlbXBSZWN0ICk7CisJUmVhZFJlY3QoIGlvLCBoYW5kbGUsICZ0ZW1wUmVjdCApOworCVdPUkQgbW9kZSA9IFJlYWQxNiggaW8sIGhhbmRsZSApOworCQorCWlmICggaXNSZWdpb24pIHsKKwkJU2tpcFBvbHlPclJlZ2lvbiggaW8sIGhhbmRsZSApOworCX0KKwkKKwlzd2l0Y2ggKCBwaXhNYXAtPnBpeGVsU2l6ZSApIHsKKwkJY2FzZSAzMjoKKwkJCVVucGFjazMyQml0cyggaW8sIGhhbmRsZSwgZGliLCAmcGl4TWFwLT5Cb3VuZHMsIHJvd0J5dGVzLCBwaXhNYXAtPmNtcENvdW50ICk7CisJCQlicmVhazsKKwkJY2FzZSA4OgorCQkJVW5wYWNrOEJpdHMoIGlvLCBoYW5kbGUsIGRpYiwgJnBpeE1hcC0+Qm91bmRzLCByb3dCeXRlcyApOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlVbnBhY2tCaXRzKCBpbywgaGFuZGxlLCBkaWIsICZwaXhNYXAtPkJvdW5kcywgcm93Qnl0ZXMsIHBpeE1hcC0+cGl4ZWxTaXplICk7CisJfQorfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBQbHVnaW4gSW1wbGVtZW50YXRpb24KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKK0Zvcm1hdCgpIHsKKwlyZXR1cm4gIlBJQ1QiOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgorRGVzY3JpcHRpb24oKSB7CisJcmV0dXJuICJNYWNpbnRvc2ggUElDVCI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCitFeHRlbnNpb24oKSB7CisJcmV0dXJuICJwY3QscGljdCxwaWMiOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgorTWltZVR5cGUoKSB7CisJcmV0dXJuICJpbWFnZS94LXBpY3QiOworfQorCitzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYKK1ZhbGlkYXRlKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSkgeworCWlmKGlvLT5zZWVrX3Byb2MoaGFuZGxlLCA1MjIsIFNFRUtfU0VUKSA9PSAwKSB7CisJCUJZVEUgcGljdF9zaWduYXR1cmVbXSA9IHsgMHgwMCwgMHgxMSwgMHgwMiwgMHhGRiwgMHgwQywgMFgwMCB9OworCQlCWVRFIHNpZ25hdHVyZVs2XTsKKworCQlpZihpby0+cmVhZF9wcm9jKHNpZ25hdHVyZSwgMSwgc2l6ZW9mKHBpY3Rfc2lnbmF0dXJlKSwgaGFuZGxlKSkgeworCQkJLy8gdjEuMCBmaWxlcyBoYXZlIDB4MTEgKHZlcnNpb24gb3BlcmF0b3IpIGZvbGxvd2VkIGJ5IDB4MDEgKHZlcnNpb24gbnVtYmVyKQorCQkJLy8gdjIuMCBmaWxlcyBoYXZlIDB4MDAxMSAodmVyc2lvbiBvcGVyYXRvcikgZm9sbG93ZWQgYnkgMHgwMmZmICh2ZXJzaW9uIG51bWJlcikKKwkJCS8vICAgYW5kIGFkZGl0aW9uYWxseSAweDBjMDAgYXMgYSBoZWFkZXIgb3Bjb2RlCisJCQkvLyBDdXJyZW50bHksIHdlIGFyZSBvbmx5IHN1cHBvcnRpbmcgdjIuMAorCQkJcmV0dXJuIChtZW1jbXAocGljdF9zaWduYXR1cmUsIHNpZ25hdHVyZSwgc2l6ZW9mKHBpY3Rfc2lnbmF0dXJlKSkgPT0gMCk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKwl9CisKKwlyZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBCT09MIERMTF9DQUxMQ09OVgorU3VwcG9ydHNFeHBvcnREZXB0aChpbnQgZGVwdGgpIHsKKwlyZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBCT09MIERMTF9DQUxMQ09OViAKK1N1cHBvcnRzRXhwb3J0VHlwZShGUkVFX0lNQUdFX1RZUEUgdHlwZSkgeworCXJldHVybiBGQUxTRTsKK30KKworc3RhdGljIEJPT0wgRExMX0NBTExDT05WCitTdXBwb3J0c0lDQ1Byb2ZpbGVzKCkgeworCXJldHVybiBGQUxTRTsKK30KKworLyoqCitUaGlzIHBsdWdpbiBkZWNvZGVzIG1hY2ludG9zaCBQSUNUIGZpbGVzIHdpdGggMSwyLDQsOCwxNiBhbmQgMzIgYml0cyBwZXIgcGl4ZWwgYXMgd2VsbCBhcyBQSUNUL0pQRUcuIAorSWYgYW4gYWxwaGEgY2hhbm5lbCBpcyBwcmVzZW50IGluIGEgMzItYml0LVBJQ1QsIGl0IGlzIGRlY29kZWQgYXMgd2VsbC4gCitUaGUgUElDVCBmb3JtYXQgaXMgYSBnZW5lcmFsIHBpY3R1cmUgZmlsZSBmb3JtYXQgYW5kIGNhbiBjb250YWluIGEgbG90IG9mIG90aGVyIGVsZW1lbnRzIGJlc2lkZXMgYml0bWFwcy4gCitUaGVzZSBlbGVtZW50cyBhcmUgaWdub3JlZC4JCisqLworc3RhdGljIEZJQklUTUFQICogRExMX0NBTExDT05WCitMb2FkKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSwgaW50IHBhZ2UsIGludCBmbGFncywgdm9pZCAqZGF0YSkgeworCWNoYXIgb3V0cHV0TWVzc2FnZVsgb3V0cHV0TWVzc2FnZVNpemUgXSA9ICIiOworCUZJQklUTUFQKiBkaWIgPSBOVUxMOworCXRyeSB7CQkKKwkJLy8gU2tpcCBlbXB0eSA1MTIgYnl0ZSBoZWFkZXIuCisJCWlmICggIWlvLT5zZWVrX3Byb2MoaGFuZGxlLCA1MTIsIFNFRUtfQ1VSKSA9PSAwICkKKwkJCXJldHVybiBOVUxMOworCQkKKwkJLy8gUmVhZCBQSUNUIGhlYWRlcgorCQlSZWFkMTYoIGlvLCBoYW5kbGUgKTsgLy8gU2tpcCB2ZXJzaW9uIDEgcGljdHVyZSBzaXplCisJCQorCQlNYWNSZWN0IGZyYW1lOworCQlSZWFkUmVjdCggaW8sIGhhbmRsZSwgJmZyYW1lICk7CisKKwkJQllURSBiID0gMDsKKwkJd2hpbGUgKChiID0gUmVhZDgoaW8sIGhhbmRsZSkpID09IDApOworCQlpZiAoIGIgIT0gMHgxMSApIHsKKwkJCXRocm93ICJpbnZhbGlkIGhlYWRlcjogdmVyc2lvbiBudW1iZXIgbWlzc2luZy4iOworCQl9CisJCQorCQlpbnQgdmVyc2lvbiA9IFJlYWQ4KCBpbywgaGFuZGxlICk7CisJCWlmICggdmVyc2lvbiA9PSAyICYmIFJlYWQ4KCBpbywgaGFuZGxlICkgIT0gMHhmZiApIHsKKwkJCXRocm93ICJpbnZhbGlkIGhlYWRlcjogaWxsZWdhbCB2ZXJzaW9uIG51bWJlci4iOworCQl9CisJCQorCQllbnVtIFBJQ1RUeXBlIHtub25lLCBvcDlhLCBqcGVnLCBwaXhtYXAsIGJpdG1hcH07CisJCVBJQ1RUeXBlIHBpY3RUeXBlID0gbm9uZTsKKwkJCisJCU1hY1JlY3QgYm91bmRzOworCQlNYWNwaXhNYXAgcGl4TWFwOworCQlpbnQgaFJlcyA9IDB4NDgwMDAwOyAvLyBpbiBwaXhlbHMvaW5jaCAoNzIgYnkgZGVmYXVsdCA9PSAweDQ4MDAwMCBpbiBmaXhlZCBwb2ludCkKKwkJaW50IHZSZXMgPSAweDQ4MDAwMDsgLy8gaW4gcGl4ZWxzL2luY2ggKDcyIGJ5IGRlZmF1bHQgPT0gMHg0ODAwMDAgaW4gZml4ZWQgcG9pbnQpCisJCVdPUkQgcm93Qnl0ZXMgPSAwOworCQlCT09MIGlzUmVnaW9uID0gRkFMU0U7CisJCUJPT0wgZG9uZSA9IEZBTFNFOworCQlsb25nIGN1cnJlbnRQb3MgPSAwOworCisJCXdoaWxlICggIWRvbmUgKSB7CisJCQlXT1JEIG9wY29kZSA9IDA7CisKKwkJCS8vIGdldCB0aGUgY3VycmVudCBzdHJlYW0gcG9zaXRpb24gKHVzZWQgdG8gYXZvaWQgaW5maW5pdGUgbG9vcHMpCisJCQljdXJyZW50UG9zID0gaW8tPnRlbGxfcHJvYyhoYW5kbGUpOworCQkJCisJCQlpZiAoKHZlcnNpb24gPT0gMSkgfHwgKChpby0+dGVsbF9wcm9jKCBoYW5kbGUgKSAlIDIpICE9IDApKSB7CisJCQkJLy8gYWxpZ24gdG8gd29yZCBmb3IgdmVyc2lvbiAyCisJCQkJb3Bjb2RlID0gUmVhZDgoIGlvLCBoYW5kbGUgKTsKKwkJCX0KKwkJCWlmICh2ZXJzaW9uID09IDIpIHsKKwkJCQlvcGNvZGUgPSBSZWFkMTYoIGlvLCBoYW5kbGUgKTsKKwkJCX0KKwkJCQorCQkJaWYgKG9wY29kZSA9PSAweEZGIHx8IG9wY29kZSA9PSAweEZGRkYpIHsKKwkJCQlkb25lID0gVFJVRTsKKwkJCQl0aHJvdyAiUElDVCBjb250YWluZWQgb25seSB2ZWN0b3IgZGF0YSEiOworCQkJfQorCQkJZWxzZSBpZiAob3Bjb2RlIDwgMHhhMikJewkJCQkKKwkJCQlzd2l0Y2ggKG9wY29kZSkJeworCQkJCQljYXNlIDB4MDE6CisJCQkJCXsKKwkJCQkJCS8vIHNraXAgY2xpcHBpbmcgcmVjdGFuZ2xlCisJCQkJCQlNYWNSZWN0IGNsaXBSZWN0OworCQkJCQkJV09SRCBsZW4gPSBSZWFkMTYoIGlvLCBoYW5kbGUgKTsKKworCQkJCQkJaWYgKGxlbiA9PSAweDAwMGEpIHsgCisJCQkJCQkJLyogbnVsbCByZ24gKi8KKwkJCQkJCQlSZWFkUmVjdCggaW8sIGhhbmRsZSwgJmNsaXBSZWN0ICk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWlvLT5zZWVrX3Byb2MoaGFuZGxlLCBsZW4gLSAyLCBTRUVLX0NVUik7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJfQkJCQkJCQorCQkJCQljYXNlIDB4MTI6CisJCQkJCWNhc2UgMHgxMzoKKwkJCQkJY2FzZSAweDE0OgorCQkJCQl7CisJCQkJCQkvLyBza2lwIHBhdHRlcm4gZGVmaW5pdGlvbgorCQkJCQkJV09SRCAgICAgICBwYXRUeXBlOworCQkJCQkJV09SRCAgICAgICByb3dCeXRlczsKKwkJCQkJCU1hY3BpeE1hcCAgcDsKKwkJCQkJCVdPUkQgICAgICAgbnVtQ29sb3JzOworCQkJCQkJCisJCQkJCQlwYXRUeXBlID0gUmVhZDE2KCBpbywgaGFuZGxlICk7CisJCQkJCQkKKwkJCQkJCXN3aXRjaCggcGF0VHlwZSApIHsKKwkJCQkJCQljYXNlIDI6CisJCQkJCQkJCWlvLT5zZWVrX3Byb2MoaGFuZGxlLCA4LCBTRUVLX0NVUik7CisJCQkJCQkJCWlvLT5zZWVrX3Byb2MoaGFuZGxlLCA1LCBTRUVLX0NVUik7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMToKKwkJCQkJCQl7CisJCQkJCQkJCWlvLT5zZWVrX3Byb2MoaGFuZGxlLCA4LCBTRUVLX0NVUik7CisJCQkJCQkJCXJvd0J5dGVzID0gUmVhZDE2KCBpbywgaGFuZGxlICk7CisJCQkJCQkJCVJlYWRSZWN0KCBpbywgaGFuZGxlLCAmcC5Cb3VuZHMgKTsKKwkJCQkJCQkJUmVhZFBpeG1hcCggaW8sIGhhbmRsZSwgJnApOworCQkJCQkJCQkKKwkJCQkJCQkJUkdCUVVBRCBjdFsyNTZdOworCQkJCQkJCQlSZWFkQ29sb3JUYWJsZShpbywgaGFuZGxlLCAmbnVtQ29sb3JzLCBjdCApOworCQkJCQkJCQlTa2lwQml0cyggaW8sIGhhbmRsZSwgJnAuQm91bmRzLCByb3dCeXRlcywgcC5waXhlbFNpemUgKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCQkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJCXRocm93ICJVbmtub3duIHBhdHRlcm4gdHlwZS4iOworCQkJCQkJfQorCQkJCQkJCisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQljYXNlIDB4NzA6CisJCQkJCWNhc2UgMHg3MToKKwkJCQkJY2FzZSAweDcyOgorCQkJCQljYXNlIDB4NzM6CisJCQkJCWNhc2UgMHg3NDoKKwkJCQkJY2FzZSAweDc1OgorCQkJCQljYXNlIDB4NzY6CisJCQkJCWNhc2UgMHg3NzoKKwkJCQkJeworCQkJCQkJU2tpcFBvbHlPclJlZ2lvbiggaW8sIGhhbmRsZSApOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJY2FzZSAweDkwOgorCQkJCQljYXNlIDB4OTg6CisJCQkJCXsKKwkJCQkJCS8vIEJpdG1hcC9waXhtYXAgZGF0YSBjbGlwcGVkIGJ5IGEgcmVjdGFuZ2xlLgorCQkJCQkJcm93Qnl0ZXMgPSBSZWFkMTYoIGlvLCBoYW5kbGUgKTsgICAgLy8gQnl0ZXMgcGVyIHJvdyBpbiBzb3VyY2Ugd2hlbiB1bmNvbXByZXNzZWQuCQkJCQkJCisJCQkJCQlpc1JlZ2lvbiA9IEZBTFNFOworCQkJCQkJCisJCQkJCQlpZiAoIHJvd0J5dGVzICYgMHg4MDAwKSB7CisJCQkJCQkJcGljdFR5cGUgPSBwaXhtYXA7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXBpY3RUeXBlID0gYml0bWFwOworCQkJCQkJfQorCQkJCQkJZG9uZSA9IFRSVUU7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQljYXNlIDB4OTE6CisJCQkJCWNhc2UgMHg5OToKKwkJCQkJeworCQkJCQkJLy8gQml0bWFwL3BpeG1hcCBkYXRhIGNsaXBwZWQgYnkgYSByZWdpb24uCisJCQkJCQlyb3dCeXRlcyA9IFJlYWQxNiggaW8sIGhhbmRsZSApOyAgICAvLyBCeXRlcyBwZXIgcm93IGluIHNvdXJjZSB3aGVuIHVuY29tcHJlc3NlZC4JCQkJCQkKKwkJCQkJCWlzUmVnaW9uID0gVFJVRTsKKwkJCQkJCQorCQkJCQkJaWYgKCByb3dCeXRlcyAmIDB4ODAwMCkgeworCQkJCQkJCXBpY3RUeXBlID0gcGl4bWFwOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlwaWN0VHlwZSA9IGJpdG1hcDsJCQkJCQkKKwkJCQkJCX0KKwkJCQkJCWRvbmUgPSBUUlVFOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJY2FzZSAweDlhOgorCQkJCQl7CisJCQkJCQkvLyBEaXJlY3RCaXRzUmVjdC4KKwkJCQkJCVJlYWQzMiggaW8sIGhhbmRsZSApOyAgICAgICAgICAgLy8gU2tpcCBmYWtlIGxlbiBhbmQgZmFrZSBFT0YuCisJCQkJCQlSZWFkMTYoIGlvLCBoYW5kbGUgKTsJCQkvLyBib2d1cyByb3cgYnl0ZXMuCisJCQkJCQkKKwkJCQkJCS8vIFJlYWQgaW4gdGhlIFBpeE1hcCBmaWVsZHMuCisJCQkJCQlSZWFkUmVjdCggaW8sIGhhbmRsZSwgJnBpeE1hcC5Cb3VuZHMgKTsKKwkJCQkJCVJlYWRQaXhtYXAoIGlvLCBoYW5kbGUsICZwaXhNYXAgKTsKKwkJCQkJCQorCQkJCQkJLy8gSWdub3JlIHNvdXJjZSAmIGRlc3RpbmF0aW9uIHJlY3RhbmdsZSBhcyB3ZWxsIGFzIHRyYW5zZmVyIG1vZGUuCisJCQkJCQlNYWNSZWN0IGR1bW15OworCQkJCQkJUmVhZFJlY3QoIGlvLCBoYW5kbGUsICZkdW1teSApOworCQkJCQkJUmVhZFJlY3QoIGlvLCBoYW5kbGUsICZkdW1teSApOworCQkJCQkJV09SRCBtb2RlID0gUmVhZDE2KCBpbywgaGFuZGxlICk7CisJCQkJCQkKKwkJCQkJCXBpY3RUeXBlPW9wOWE7CisJCQkJCQlkb25lID0gVFJVRTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWNhc2UgMHhhMToKKwkJCQkJeworCQkJCQkJLy8gbG9uZyBjb21tZW50CisJCQkJCQlXT1JEIHR5cGU7CisJCQkJCQlXT1JEIGxlbjsKKwkJCQkJCQorCQkJCQkJdHlwZSA9IFJlYWQxNiggaW8sIGhhbmRsZSApOworCQkJCQkJbGVuID0gUmVhZDE2KCBpbywgaGFuZGxlKTsKKwkJCQkJCWlmIChsZW4gPiAwKSB7CisJCQkJCQkJaW8tPnNlZWtfcHJvYyhoYW5kbGUsIGxlbiwgU0VFS19DVVIpOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJZGVmYXVsdDoKKwkJCQkJCS8vIE5vIGZ1bmN0aW9uID0+IHNraXAgdG8gbmV4dCBvcGNvZGUKKwkJCQkJCWlmIChvcHRhYmxlW29wY29kZV0ubGVuID09IFdPUkRfTEVOKSB7CisJCQkJCQkJV09SRCBsZW4gPSBSZWFkMTYoIGlvLCBoYW5kbGUgKTsKKwkJCQkJCQlpby0+c2Vla19wcm9jKGhhbmRsZSwgbGVuLCBTRUVLX0NVUik7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWlvLT5zZWVrX3Byb2MoaGFuZGxlLCBvcHRhYmxlW29wY29kZV0ubGVuLCBTRUVLX0NVUik7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQllbHNlIGlmIChvcGNvZGUgPT0gMHhjMDApIHsKKwkJCQkvLyB2ZXJzaW9uIDIgaGVhZGVyICgyNiBieXRlcykKKwkJCQlXT1JEIG1pbm9yVmVyc2lvbiA9IFJlYWQxNiggaW8sIGhhbmRsZSApOwkvLyBhbHdheXMgRkZGRSAoLTIpIGZvciBleHRlbmRlZCB2ZXJzaW9uIDIKKwkJCQlSZWFkMTYoIGlvLCBoYW5kbGUgKTsJCQkJCQkvLyByZXNlcnZlZAorCQkJCWhSZXMgPSBSZWFkMzIoIGlvLCBoYW5kbGUgKTsJCQkJLy8gb3JpZ2luYWwgaG9yaXpvbnRhbCByZXNvbHV0aW9uIGluIHBpeGVscy9pbmNoCisJCQkJdlJlcyA9IFJlYWQzMiggaW8sIGhhbmRsZSApOwkJCQkvLyBvcmlnaW5hbCBob3Jpem9udGFsIHJlc29sdXRpb24gaW4gcGl4ZWxzL2luY2gKKwkJCQlNYWNSZWN0IGR1bW15OworCQkJCVJlYWRSZWN0KCBpbywgaGFuZGxlLCAmZHVtbXkgKTsJCQkJLy8gZnJhbWUgYm91bmRzIGF0IG9yaWdpbmFsIHJlc29sdXRpb24KKwkJCQlSZWFkMzIoIGlvLCBoYW5kbGUgKTsJCQkJCQkvLyByZXNlcnZlZAorCQkJfQorCQkJZWxzZSBpZiAob3Bjb2RlID09IDB4ODIwMCkgeworCQkJCS8vIGpwZWcKKwkJCQlsb25nIG9wTGVuID0gUmVhZDMyKCBpbywgaGFuZGxlICk7CisJCQkJQk9PTCBmb3VuZCA9IEZBTFNFOworCQkJCWludCBpID0gMDsKKwkJCQkKKwkJCQkvLyBza2lwIHRvIEpQRUcgaGVhZGVyLgorCQkJCXdoaWxlICggIWZvdW5kICYmIGkgPCBvcExlbiApIHsKKy8vCQkJCQlpby0+c2Vla19wcm9jKCBoYW5kbGUsIDI0LCBTRUVLX0NVUiApOworLy8JCQkJCU1hY1JlY3QgZHVtbXk7CisvLwkJCQkJUmVhZFJlY3QoIGlvLCBoYW5kbGUsICZkdW1teSApOworLy8JCQkJCWlvLT5zZWVrX3Byb2MoIGhhbmRsZSwgMTIyLCBTRUVLX0NVUiApOworLy8JCQkJCWZvdW5kID0gVFJVRTsKKwkJCQkJQllURSBkYXRhWyAyIF07CisJCQkJCWlmKCBpby0+cmVhZF9wcm9jKCBkYXRhLCAyLCAxLCBoYW5kbGUgKSApIHsKKwkJCQkJCWlvLT5zZWVrX3Byb2MoIGhhbmRsZSwgLTIsIFNFRUtfQ1VSICk7CisJCQkJCQkKKwkJCQkJCWlmICggZGF0YVswXSA9PSAweEZGICYmIGRhdGFbMV0gPT0gMHhEOCApIHsKKwkJCQkJCQlmb3VuZCA9IFRSVUU7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCVJlYWQ4KCBpbywgaGFuZGxlICk7CisJCQkJCQkJaSsrOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCQorCQkJCWlmICggZm91bmQgKSB7CisJCQkJCS8vIFBhc3MgdGhlIGRhdGEgdG8gdGhlIEpQRUcgZGVjb2Rlci4KKwkJCQkJcGljdFR5cGUgPSBqcGVnOworCQkJCX0gZWxzZSB7CisJCQkJCXRocm93ICJQSUNUIGZpbGUgY29udGFpbnMgdW5yZWNvZ25pemVkIHF1aWNrdGltZSBkYXRhLiI7CisJCQkJfQorCQkJCWRvbmUgPSBUUlVFOworCQkJfQorCQkJZWxzZSBpZiAob3Bjb2RlID49IDB4YTIgJiYgb3Bjb2RlIDw9IDB4YWYpIHsKKwkJCQkvLyByZXNlcnZlZAorCQkJCVdPUkQgbGVuID0gUmVhZDE2KCBpbywgaGFuZGxlICk7CisJCQkJaW8tPnNlZWtfcHJvYyhoYW5kbGUsIGxlbiwgU0VFS19DVVIpOworCQkJfQorCQkJZWxzZSBpZiAoKG9wY29kZSA+PSAweGIwICYmIG9wY29kZSA8PSAweGNmKSB8fCAob3Bjb2RlID49IDB4ODAwMCAmJiBvcGNvZGUgPD0gMHg4MGZmKSkgeworCQkJCS8vIGp1c3QgYSByZXNlcnZlZCBvcGNvZGUsIG5vIGRhdGEKKwkJCX0KKwkJCWVsc2UgaWYgKChvcGNvZGUgPj0gMHhkMCAmJiBvcGNvZGUgPD0gMHhmZSkgfHwgb3Bjb2RlID49IDgxMDApIHsKKwkJCQkvLyByZXNlcnZlZAorCQkJCUxPTkcgbGVuID0gUmVhZDMyKCBpbywgaGFuZGxlICk7CisJCQkJaW8tPnNlZWtfcHJvYyhoYW5kbGUsIGxlbiwgU0VFS19DVVIpOworCQkJfQorCQkJZWxzZSBpZiAob3Bjb2RlID49IDB4MTAwICYmIG9wY29kZSA8PSAweDdmZmYpIHsKKwkJCQkvLyByZXNlcnZlZAorCQkJCWlvLT5zZWVrX3Byb2MoaGFuZGxlLCAoKG9wY29kZSA+PiA3KSAmIDI1NSksIFNFRUtfQ1VSKTsJCQkJCisJCQl9CisJCQllbHNlIHsKKwkJCQlzcHJpbnRmKCBvdXRwdXRNZXNzYWdlLCAiQ2FuJ3QgaGFuZGxlIG9wY29kZSAleC5cbiIsIG9wY29kZSApOworCQkJCXRocm93IG91dHB1dE1lc3NhZ2U7CisJCQl9CisKKwkJCWlmKGN1cnJlbnRQb3MgPT0gaW8tPnRlbGxfcHJvYyhoYW5kbGUpKSB7CisJCQkJLy8gd2UgcHJvYmFseSByZWFjaGVkIHRoZSBlbmQgb2YgZmlsZSBhcyB3ZSBjYW4gbm8gbG9uZ2VyIG1vdmUgZm9yd2FyZCAuLi4gCisJCQkJdGhyb3cgIkludmFsaWQgUElDVCBmaWxlIjsKKwkJCX0KKwkJfQorCQkJCQorCQlzd2l0Y2ggKCBwaWN0VHlwZSApCXsKKwkJCWNhc2Ugb3A5YToKKwkJCXsKKwkJCQlib3VuZHMgPSBwaXhNYXAuQm91bmRzOworCQkJCWludCB3aWR0aCA9IGJvdW5kcy5yaWdodCAtIGJvdW5kcy5sZWZ0OworCQkJCWludCBoZWlnaHQgPSBib3VuZHMuYm90dG9tIC0gYm91bmRzLnRvcDsKKwkJCQkKKwkJCQlpZiAoIHBpeE1hcC5waXhlbFNpemUgPiA4ICkgeworCQkJCQlkaWIgPSBGcmVlSW1hZ2VfQWxsb2NhdGUoIHdpZHRoLCBoZWlnaHQsIDMyLCBGSV9SR0JBX1JFRF9NQVNLLCBGSV9SR0JBX0dSRUVOX01BU0ssIEZJX1JHQkFfQkxVRV9NQVNLKTsKKwkJCQl9IGVsc2UgeworCQkJCQlkaWIgPSBGcmVlSW1hZ2VfQWxsb2NhdGUoIHdpZHRoLCBoZWlnaHQsIDgpOworCQkJCX0KKwkJCQloUmVzID0gcGl4TWFwLmhSZXMgPDwgMTY7CisJCQkJdlJlcyA9IHBpeE1hcC52UmVzIDw8IDE2OwkJCQkKKwkJCQlicmVhazsKKwkJCX0JCisJCQkJCisJCQljYXNlIGpwZWc6CisJCQl7CisJCQkJZGliID0gRnJlZUltYWdlX0xvYWRGcm9tSGFuZGxlKCBGSUZfSlBFRywgaW8sIGhhbmRsZSApOwkJCQkJCisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWNhc2UgcGl4bWFwOgorCQkJeworCQkJCS8vIERlY29kZSB2ZXJzaW9uIDIgcGl4bWFwCisJCQkJUmVhZFJlY3QoIGlvLCBoYW5kbGUsICZwaXhNYXAuQm91bmRzICk7CisJCQkJUmVhZFBpeG1hcCggaW8sIGhhbmRsZSwgJnBpeE1hcCApOworCQkJCQorCQkJCWJvdW5kcyA9IHBpeE1hcC5Cb3VuZHM7CisJCQkJaW50IHdpZHRoID0gYm91bmRzLnJpZ2h0IC0gYm91bmRzLmxlZnQ7CisJCQkJaW50IGhlaWdodCA9IGJvdW5kcy5ib3R0b20gLSBib3VuZHMudG9wOworCisJCQkJaWYgKCBwaXhNYXAucGl4ZWxTaXplID4gOCApIHsKKwkJCQkJZGliID0gRnJlZUltYWdlX0FsbG9jYXRlKCB3aWR0aCwgaGVpZ2h0LCAzMiwgRklfUkdCQV9SRURfTUFTSywgRklfUkdCQV9HUkVFTl9NQVNLLCBGSV9SR0JBX0JMVUVfTUFTSyk7CisJCQkJfSBlbHNlIHsKKwkJCQkJZGliID0gRnJlZUltYWdlX0FsbG9jYXRlKCB3aWR0aCwgaGVpZ2h0LCA4KTsKKwkJCQl9CisJCQkJaFJlcyA9IHBpeE1hcC5oUmVzIDw8IDE2OworCQkJCXZSZXMgPSBwaXhNYXAudlJlcyA8PCAxNjsJCQkJCisJCQkJYnJlYWs7CisJCQl9CisJCQkJCisJCQljYXNlIGJpdG1hcDoKKwkJCXsKKwkJCQkvLyBEZWNvZGUgdmVyc2lvbiAxIGJpdG1hcDogMSBicHAuCisJCQkJTWFjUmVjdCBzcmNSZWN0OworCQkJCU1hY1JlY3QgZHN0UmVjdDsKKwkJCQlXT1JEIHdpZHRoOyAgICAgICAgLy8gV2lkdGggaW4gcGl4ZWxzCisJCQkJV09SRCBoZWlnaHQ7ICAgICAgIC8vIEhlaWdodCBpbiBwaXhlbHMKKwkJCQkKKwkJCQlSZWFkUmVjdCggaW8sIGhhbmRsZSwgJmJvdW5kcyApOworCQkJCVJlYWRSZWN0KCBpbywgaGFuZGxlLCAmc3JjUmVjdCApOworCQkJCVJlYWRSZWN0KCBpbywgaGFuZGxlLCAmZHN0UmVjdCApOworCQkJCQorCQkJCXdpZHRoID0gYm91bmRzLnJpZ2h0IC0gYm91bmRzLmxlZnQ7CisJCQkJaGVpZ2h0ID0gYm91bmRzLmJvdHRvbSAtIGJvdW5kcy50b3A7CisJCQkJCisJCQkJZGliID0gRnJlZUltYWdlX0FsbG9jYXRlKHdpZHRoLCBoZWlnaHQsIDgpOworCQkJCWJyZWFrOworCQkJfQkJCQorCQl9CQkKKwkJCisJCWlmICggZGliICkgeworCQkJLy8gbmVlZCB0byBjb252ZXJ0IHJlc29sdXRpb24gZmlndXJlcyBmcm9tIGZpeGVkIHBvaW50LCBwaXhlbHMvaW5jaAorCQkJLy8gdG8gZmxvYXRpbmcgcG9pbnQsIHBpeGVscy9tZXRlci4JCQkKKwkJCWZsb2F0IGhyZXNfcHBtID0gaFJlcyAqICgoZmxvYXQpMzkuNCAvIChmbG9hdCk2NTUzNi4wKTsKKwkJCWZsb2F0IHZyZXNfcHBtID0gdlJlcyAqICgoZmxvYXQpMzkuNCAvIChmbG9hdCk2NTUzNi4wKTsJCQorCQkJCisJCQlGcmVlSW1hZ2VfU2V0RG90c1Blck1ldGVyWCggZGliLCAoTE9ORylocmVzX3BwbSApOworCQkJRnJlZUltYWdlX1NldERvdHNQZXJNZXRlclkoIGRpYiwgKExPTkcpdnJlc19wcG0gKTsJCQkKKwkJCQorCQkJc3dpdGNoKCBwaWN0VHlwZSApIHsKKwkJCQljYXNlIG9wOWE6CisJCQkJCURlY29kZU9wOWEoIGlvLCBoYW5kbGUsIGRpYiwgJnBpeE1hcCApOworCQkJCQlicmVhazsKKwkJCQljYXNlIGpwZWc6CisJCQkJCS8vIEFscmVhZHkgZGVjb2RlZCBpZiB0aGUgZW1iZWRkZWQgZm9ybWF0IHdhcyB2YWxpZC4KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBwaXhtYXA6CisJCQkJCURlY29kZVBpeG1hcCggaW8sIGhhbmRsZSwgZGliLCBpc1JlZ2lvbiwgJnBpeE1hcCwgcm93Qnl0ZXMgKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBiaXRtYXA6CisJCQkJCURlY29kZUJpdG1hcCggaW8sIGhhbmRsZSwgZGliLCBpc1JlZ2lvbiwgJmJvdW5kcywgcm93Qnl0ZXMgKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJdGhyb3cgImludmFsaWQgcGljdCB0eXBlIjsKKwkJCX0JCQkKKwkJfQorCQkKKwkJcmV0dXJuIGRpYjsKKwl9IAorCWNhdGNoKGNvbnN0IGNoYXIgKm1lc3NhZ2UpIHsKKwkJRnJlZUltYWdlX1VubG9hZCggZGliICk7CisJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhzX2Zvcm1hdF9pZCwgbWVzc2FnZSk7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICAgSW5pdAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit2b2lkIERMTF9DQUxMQ09OVgorSW5pdFBJQ1QoUGx1Z2luICpwbHVnaW4sIGludCBmb3JtYXRfaWQpIHsKKwlzX2Zvcm1hdF9pZCA9IGZvcm1hdF9pZDsKKworCXBsdWdpbi0+Zm9ybWF0X3Byb2MgPSBGb3JtYXQ7CisJcGx1Z2luLT5kZXNjcmlwdGlvbl9wcm9jID0gRGVzY3JpcHRpb247CisJcGx1Z2luLT5leHRlbnNpb25fcHJvYyA9IEV4dGVuc2lvbjsKKwlwbHVnaW4tPnJlZ2V4cHJfcHJvYyA9IE5VTEw7CisJcGx1Z2luLT5vcGVuX3Byb2MgPSBOVUxMOworCXBsdWdpbi0+Y2xvc2VfcHJvYyA9IE5VTEw7CisJcGx1Z2luLT5wYWdlY291bnRfcHJvYyA9IE5VTEw7CisJcGx1Z2luLT5wYWdlY2FwYWJpbGl0eV9wcm9jID0gTlVMTDsKKwlwbHVnaW4tPmxvYWRfcHJvYyA9IExvYWQ7CisJcGx1Z2luLT5zYXZlX3Byb2MgPSBOVUxMOworCXBsdWdpbi0+dmFsaWRhdGVfcHJvYyA9IFZhbGlkYXRlOworCXBsdWdpbi0+bWltZV9wcm9jID0gTWltZVR5cGU7CisJcGx1Z2luLT5zdXBwb3J0c19leHBvcnRfYnBwX3Byb2MgPSBTdXBwb3J0c0V4cG9ydERlcHRoOworCXBsdWdpbi0+c3VwcG9ydHNfZXhwb3J0X3R5cGVfcHJvYyA9IFN1cHBvcnRzRXhwb3J0VHlwZTsKKwlwbHVnaW4tPnN1cHBvcnRzX2ljY19wcm9maWxlc19wcm9jID0gU3VwcG9ydHNJQ0NQcm9maWxlczsKK30KZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvUGx1Z2luUE5HLmNwcCBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvUGx1Z2luUE5HLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2YzMGJkCi0tLSAvZGV2L251bGwKKysrIGIvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9QbHVnaW5QTkcuY3BwCkBAIC0wLDAgKzEsMTExNSBAQAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gUE5HIExvYWRlciBhbmQgV3JpdGVyCisvLworLy8gRGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBieQorLy8gLSBGbG9yaXMgdmFuIGRlbiBCZXJnIChmbHZkYmVyZ0B3eHMubmwpCisvLyAtIEhlcnZlIERyb2xvbiAoZHJvbG9uQGluZm9uaWUuZnIpCisvLyAtIERldGxldiBWZW5kdCAoZGV0bGV2LnZlbmR0QGJyaWxsaXQuZGUpCisvLyAtIEFhcm9uIFNodW1hdGUgKHRyZWtAc3RhcnRyZWtlci5jb20pCisvLyAtIFRhbm5lciBIZWxsYW5kICh0YW5uZXJoZWxsYW5kQHVzZXJzLnNmLm5ldCkKKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBGcmVlSW1hZ2UgMworLy8KKy8vIENPVkVSRUQgQ09ERSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWQorLy8gT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMKKy8vIFRIQVQgVEhFIENPVkVSRUQgQ09ERSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLy8gT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQKKy8vIENPREUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkgQ09WRVJFRCBDT0RFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QKKy8vIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZCisvLyBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMCisvLyBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GIEFOWSBDT1ZFUkVEIENPREUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSCisvLyBUSElTIERJU0NMQUlNRVIuCisvLworLy8gVXNlIGF0IHlvdXIgb3duIHJpc2shCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpZmRlZiBfTVNDX1ZFUiAKKyNwcmFnbWEgd2FybmluZyAoZGlzYWJsZSA6IDQ3ODYpIC8vIGlkZW50aWZpZXIgd2FzIHRydW5jYXRlZCB0byAnbnVtYmVyJyBjaGFyYWN0ZXJzCisjZW5kaWYKKworI2luY2x1ZGUgIkZyZWVJbWFnZS5oIgorI2luY2x1ZGUgIlV0aWxpdGllcy5oIgorCisjaW5jbHVkZSAiLi4vTWV0YWRhdGEvRnJlZUltYWdlVGFnLmgiCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBQTkdfQllURVNfVE9fQ0hFQ0sgOAorCisjdW5kZWYgUE5HX1pfREVGQVVMVF9DT01QUkVTU0lPTgkvLyBhbHJlYWR5IHVzZWQgaW4gLi4vTGliUE5HL3BuZ2xpYmNvbmYuaAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS96bGliL3psaWIuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9wbmcvcG5nLmgiCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEZyZWVJbWFnZUlPICpzX2lvOworICAgIGZpX2hhbmRsZSAgICBzX2hhbmRsZTsKK30gZmlfaW9TdHJ1Y3R1cmUsICpwZmlfaW9TdHJ1Y3R1cmU7CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIGxpYnBuZyBpbnRlcmZhY2UKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3RhdGljIHZvaWQKK19SZWFkUHJvYyhwbmdfc3RydWN0cCBwbmdfcHRyLCB1bnNpZ25lZCBjaGFyICpkYXRhLCBwbmdfc2l6ZV90IHNpemUpIHsKKyAgICBwZmlfaW9TdHJ1Y3R1cmUgcGZpbyA9IChwZmlfaW9TdHJ1Y3R1cmUpcG5nX2dldF9pb19wdHIocG5nX3B0cik7CisJdW5zaWduZWQgbiA9IHBmaW8tPnNfaW8tPnJlYWRfcHJvYyhkYXRhLCAodW5zaWduZWQgaW50KXNpemUsIDEsIHBmaW8tPnNfaGFuZGxlKTsKKwlpZihzaXplICYmIChuID09IDApKSB7CisJCXRocm93ICJSZWFkIGVycm9yOiBpbnZhbGlkIG9yIGNvcnJ1cHRlZCBQTkcgZmlsZSI7CisJfQorfQorCitzdGF0aWMgdm9pZAorX1dyaXRlUHJvYyhwbmdfc3RydWN0cCBwbmdfcHRyLCB1bnNpZ25lZCBjaGFyICpkYXRhLCBwbmdfc2l6ZV90IHNpemUpIHsKKyAgICBwZmlfaW9TdHJ1Y3R1cmUgcGZpbyA9IChwZmlfaW9TdHJ1Y3R1cmUpcG5nX2dldF9pb19wdHIocG5nX3B0cik7CisgICAgcGZpby0+c19pby0+d3JpdGVfcHJvYyhkYXRhLCAodW5zaWduZWQgaW50KXNpemUsIDEsIHBmaW8tPnNfaGFuZGxlKTsKK30KKworc3RhdGljIHZvaWQKK19GbHVzaFByb2MocG5nX3N0cnVjdHAgcG5nX3B0cikgeworCShwbmdfc3RydWN0cClwbmdfcHRyOworCS8vIGVtcHR5IGZsdXNoIGltcGxlbWVudGF0aW9uCit9CisKK3N0YXRpYyB2b2lkCitlcnJvcl9oYW5kbGVyKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIGNvbnN0IGNoYXIgKmVycm9yKSB7CisJKHBuZ19zdHJ1Y3RwKXBuZ19wdHI7CisJdGhyb3cgZXJyb3I7Cit9CisKKy8vIGluIEZyZWVJbWFnZSB3YXJuaW5ncyBkaXNhYmxlZAorCitzdGF0aWMgdm9pZAord2FybmluZ19oYW5kbGVyKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIGNvbnN0IGNoYXIgKndhcm5pbmcpIHsKKwkocG5nX3N0cnVjdHApcG5nX3B0cjsKKwkoY2hhciopd2FybmluZzsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gTWV0YWRhdGEgcm91dGluZXMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3RhdGljIEJPT0wgCitSZWFkTWV0YWRhdGEocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBGSUJJVE1BUCAqZGliKSB7CisJLy8gWE1QIGtleXdvcmQKKwljb25zdCBjaGFyICpnX3BuZ194bXBfa2V5d29yZCA9ICJYTUw6Y29tLmFkb2JlLnhtcCI7CisKKwlGSVRBRyAqdGFnID0gTlVMTDsKKwlwbmdfdGV4dHAgdGV4dF9wdHIgPSBOVUxMOworCXBuZ190aW1lcCBtb2RfdGltZSA9IE5VTEw7CisJaW50IG51bV90ZXh0ID0gMDsKKworCS8vIGlUWHQvdEVYdC96VFh0IGNodW5ja3MKKwlpZihwbmdfZ2V0X3RleHQocG5nX3B0ciwgaW5mb19wdHIsICZ0ZXh0X3B0ciwgJm51bV90ZXh0KSA+IDApIHsKKwkJZm9yKGludCBpID0gMDsgaSA8IG51bV90ZXh0OyBpKyspIHsKKwkJCS8vIGNyZWF0ZSBhIHRhZworCQkJdGFnID0gRnJlZUltYWdlX0NyZWF0ZVRhZygpOworCQkJaWYoIXRhZykgcmV0dXJuIEZBTFNFOworCisJCQlEV09SRCB0YWdfbGVuZ3RoID0gKERXT1JEKSBNQVgodGV4dF9wdHJbaV0udGV4dF9sZW5ndGgsIHRleHRfcHRyW2ldLml0eHRfbGVuZ3RoKTsKKworCQkJRnJlZUltYWdlX1NldFRhZ0xlbmd0aCh0YWcsIHRhZ19sZW5ndGgpOworCQkJRnJlZUltYWdlX1NldFRhZ0NvdW50KHRhZywgdGFnX2xlbmd0aCk7CisJCQlGcmVlSW1hZ2VfU2V0VGFnVHlwZSh0YWcsIEZJRFRfQVNDSUkpOworCQkJRnJlZUltYWdlX1NldFRhZ1ZhbHVlKHRhZywgdGV4dF9wdHJbaV0udGV4dCk7CisKKwkJCWlmKHN0cmNtcCh0ZXh0X3B0cltpXS5rZXksIGdfcG5nX3htcF9rZXl3b3JkKSA9PSAwKSB7CisJCQkJLy8gc3RvcmUgdGhlIHRhZyBhcyBYTVAKKwkJCQlGcmVlSW1hZ2VfU2V0VGFnS2V5KHRhZywgZ19UYWdMaWJfWE1QRmllbGROYW1lKTsKKwkJCQlGcmVlSW1hZ2VfU2V0TWV0YWRhdGEoRklNRF9YTVAsIGRpYiwgRnJlZUltYWdlX0dldFRhZ0tleSh0YWcpLCB0YWcpOworCQkJfSBlbHNlIHsKKwkJCQkvLyBzdG9yZSB0aGUgdGFnIGFzIGEgY29tbWVudAorCQkJCUZyZWVJbWFnZV9TZXRUYWdLZXkodGFnLCB0ZXh0X3B0cltpXS5rZXkpOworCQkJCUZyZWVJbWFnZV9TZXRNZXRhZGF0YShGSU1EX0NPTU1FTlRTLCBkaWIsIEZyZWVJbWFnZV9HZXRUYWdLZXkodGFnKSwgdGFnKTsKKwkJCX0KKwkJCQorCQkJLy8gZGVzdHJveSB0aGUgdGFnCisJCQlGcmVlSW1hZ2VfRGVsZXRlVGFnKHRhZyk7CisJCX0KKwl9CisKKwkvLyB0aW1lc3RhbXAgY2h1bmsKKwlpZihwbmdfZ2V0X3RJTUUocG5nX3B0ciwgaW5mb19wdHIsICZtb2RfdGltZSkpIHsKKwkJY2hhciB0aW1lc3RhbXBbMzJdOworCQkvLyBjcmVhdGUgYSB0YWcKKwkJdGFnID0gRnJlZUltYWdlX0NyZWF0ZVRhZygpOworCQlpZighdGFnKSByZXR1cm4gRkFMU0U7CisKKwkJLy8gY29udmVydCBhcyAneXl5eTpNTTpkZCBoaDptbTpzcycKKwkJc3ByaW50Zih0aW1lc3RhbXAsICIlNGQ6JTAyZDolMDJkICUyZDolMDJkOiUwMmQiLCBtb2RfdGltZS0+eWVhciwgbW9kX3RpbWUtPm1vbnRoLCBtb2RfdGltZS0+ZGF5LCBtb2RfdGltZS0+aG91ciwgbW9kX3RpbWUtPm1pbnV0ZSwgbW9kX3RpbWUtPnNlY29uZCk7CisKKwkJRFdPUkQgdGFnX2xlbmd0aCA9IChEV09SRClzdHJsZW4odGltZXN0YW1wKSArIDE7CisJCUZyZWVJbWFnZV9TZXRUYWdMZW5ndGgodGFnLCB0YWdfbGVuZ3RoKTsKKwkJRnJlZUltYWdlX1NldFRhZ0NvdW50KHRhZywgdGFnX2xlbmd0aCk7CisJCUZyZWVJbWFnZV9TZXRUYWdUeXBlKHRhZywgRklEVF9BU0NJSSk7CisJCUZyZWVJbWFnZV9TZXRUYWdJRCh0YWcsIFRBR19EQVRFVElNRSk7CisJCUZyZWVJbWFnZV9TZXRUYWdWYWx1ZSh0YWcsIHRpbWVzdGFtcCk7CisKKwkJLy8gc3RvcmUgdGhlIHRhZyBhcyBFeGlmLVRJRkYKKwkJRnJlZUltYWdlX1NldFRhZ0tleSh0YWcsICJEYXRlVGltZSIpOworCQlGcmVlSW1hZ2VfU2V0TWV0YWRhdGEoRklNRF9FWElGX01BSU4sIGRpYiwgRnJlZUltYWdlX0dldFRhZ0tleSh0YWcpLCB0YWcpOworCisJCS8vIGRlc3Ryb3kgdGhlIHRhZworCQlGcmVlSW1hZ2VfRGVsZXRlVGFnKHRhZyk7CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBCT09MIAorV3JpdGVNZXRhZGF0YShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIEZJQklUTUFQICpkaWIpIHsKKwkvLyBYTVAga2V5d29yZAorCWNvbnN0IGNoYXIgKmdfcG5nX3htcF9rZXl3b3JkID0gIlhNTDpjb20uYWRvYmUueG1wIjsKKworCUZJVEFHICp0YWcgPSBOVUxMOworCUZJTUVUQURBVEEgKm1kaGFuZGxlID0gTlVMTDsKKwlCT09MIGJSZXN1bHQgPSBUUlVFOworCisJcG5nX3RleHQgdGV4dF9tZXRhZGF0YTsKKwlwbmdfdGltZSBtb2RfdGltZTsKKworCS8vIHNldCB0aGUgJ0NvbW1lbnRzJyBtZXRhZGF0YSBhcyBpVFh0IGNodW5ja3MKKworCW1kaGFuZGxlID0gRnJlZUltYWdlX0ZpbmRGaXJzdE1ldGFkYXRhKEZJTURfQ09NTUVOVFMsIGRpYiwgJnRhZyk7CisKKwlpZihtZGhhbmRsZSkgeworCQlkbyB7CisJCQltZW1zZXQoJnRleHRfbWV0YWRhdGEsIDAsIHNpemVvZihwbmdfdGV4dCkpOworCQkJdGV4dF9tZXRhZGF0YS5jb21wcmVzc2lvbiA9IDE7CQkJCQkJCS8vIGlUWHQsIG5vbmUKKwkJCXRleHRfbWV0YWRhdGEua2V5ID0gKGNoYXIqKUZyZWVJbWFnZV9HZXRUYWdLZXkodGFnKTsJLy8ga2V5d29yZCwgMS03OSBjaGFyYWN0ZXIgZGVzY3JpcHRpb24gb2YgInRleHQiCisJCQl0ZXh0X21ldGFkYXRhLnRleHQgPSAoY2hhciopRnJlZUltYWdlX0dldFRhZ1ZhbHVlKHRhZyk7CS8vIGNvbW1lbnQsIG1heSBiZSBhbiBlbXB0eSBzdHJpbmcgKGllICIiKQorCQkJdGV4dF9tZXRhZGF0YS50ZXh0X2xlbmd0aCA9IEZyZWVJbWFnZV9HZXRUYWdMZW5ndGgodGFnKTsvLyBsZW5ndGggb2YgdGhlIHRleHQgc3RyaW5nCisJCQl0ZXh0X21ldGFkYXRhLml0eHRfbGVuZ3RoID0gRnJlZUltYWdlX0dldFRhZ0xlbmd0aCh0YWcpOy8vIGxlbmd0aCBvZiB0aGUgaXR4dCBzdHJpbmcKKwkJCXRleHRfbWV0YWRhdGEubGFuZyA9IDA7CQkgLy8gbGFuZ3VhZ2UgY29kZSwgMC03OSBjaGFyYWN0ZXJzIG9yIGEgTlVMTCBwb2ludGVyCisJCQl0ZXh0X21ldGFkYXRhLmxhbmdfa2V5ID0gMDsJIC8vIGtleXdvcmQgdHJhbnNsYXRlZCBVVEYtOCBzdHJpbmcsIDAgb3IgbW9yZSBjaGFycyBvciBhIE5VTEwgcG9pbnRlcgorCisJCQkvLyBzZXQgdGhlIHRhZyAKKwkJCXBuZ19zZXRfdGV4dChwbmdfcHRyLCBpbmZvX3B0ciwgJnRleHRfbWV0YWRhdGEsIDEpOworCisJCX0gd2hpbGUoRnJlZUltYWdlX0ZpbmROZXh0TWV0YWRhdGEobWRoYW5kbGUsICZ0YWcpKTsKKworCQlGcmVlSW1hZ2VfRmluZENsb3NlTWV0YWRhdGEobWRoYW5kbGUpOworCQliUmVzdWx0ICY9IFRSVUU7CisJfQorCisJLy8gc2V0IHRoZSAnWE1QJyBtZXRhZGF0YSBhcyBpVFh0IGNodW5ja3MKKwl0YWcgPSBOVUxMOworCUZyZWVJbWFnZV9HZXRNZXRhZGF0YShGSU1EX1hNUCwgZGliLCBnX1RhZ0xpYl9YTVBGaWVsZE5hbWUsICZ0YWcpOworCWlmKHRhZyAmJiBGcmVlSW1hZ2VfR2V0VGFnTGVuZ3RoKHRhZykpIHsKKwkJbWVtc2V0KCZ0ZXh0X21ldGFkYXRhLCAwLCBzaXplb2YocG5nX3RleHQpKTsKKwkJdGV4dF9tZXRhZGF0YS5jb21wcmVzc2lvbiA9IDE7CQkJCQkJCS8vIGlUWHQsIG5vbmUKKwkJdGV4dF9tZXRhZGF0YS5rZXkgPSAoY2hhciopZ19wbmdfeG1wX2tleXdvcmQ7CQkJLy8ga2V5d29yZCwgMS03OSBjaGFyYWN0ZXIgZGVzY3JpcHRpb24gb2YgInRleHQiCisJCXRleHRfbWV0YWRhdGEudGV4dCA9IChjaGFyKilGcmVlSW1hZ2VfR2V0VGFnVmFsdWUodGFnKTsJLy8gY29tbWVudCwgbWF5IGJlIGFuIGVtcHR5IHN0cmluZyAoaWUgIiIpCisJCXRleHRfbWV0YWRhdGEudGV4dF9sZW5ndGggPSBGcmVlSW1hZ2VfR2V0VGFnTGVuZ3RoKHRhZyk7Ly8gbGVuZ3RoIG9mIHRoZSB0ZXh0IHN0cmluZworCQl0ZXh0X21ldGFkYXRhLml0eHRfbGVuZ3RoID0gRnJlZUltYWdlX0dldFRhZ0xlbmd0aCh0YWcpOy8vIGxlbmd0aCBvZiB0aGUgaXR4dCBzdHJpbmcKKwkJdGV4dF9tZXRhZGF0YS5sYW5nID0gMDsJCSAvLyBsYW5ndWFnZSBjb2RlLCAwLTc5IGNoYXJhY3RlcnMgb3IgYSBOVUxMIHBvaW50ZXIKKwkJdGV4dF9tZXRhZGF0YS5sYW5nX2tleSA9IDA7CSAvLyBrZXl3b3JkIHRyYW5zbGF0ZWQgVVRGLTggc3RyaW5nLCAwIG9yIG1vcmUgY2hhcnMgb3IgYSBOVUxMIHBvaW50ZXIKKworCQkvLyBzZXQgdGhlIHRhZyAKKwkJcG5nX3NldF90ZXh0KHBuZ19wdHIsIGluZm9fcHRyLCAmdGV4dF9tZXRhZGF0YSwgMSk7CisJCWJSZXN1bHQgJj0gVFJVRTsKKwl9CisKKwkvLyBzZXQgdGhlIEV4aWYtVElGRiAnRGF0ZVRpbWUnIG1ldGFkYXRhIGFzIGEgdElNRSBjaHVuaworCXRhZyA9IE5VTEw7CisJRnJlZUltYWdlX0dldE1ldGFkYXRhKEZJTURfRVhJRl9NQUlOLCBkaWIsICJEYXRlVGltZSIsICZ0YWcpOworCWlmKHRhZyAmJiBGcmVlSW1hZ2VfR2V0VGFnTGVuZ3RoKHRhZykpIHsKKwkJaW50IHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kOworCQljb25zdCBjaGFyICp2YWx1ZSA9IChjaGFyKilGcmVlSW1hZ2VfR2V0VGFnVmFsdWUodGFnKTsKKwkJaWYoc3NjYW5mKHZhbHVlLCAiJTRkOiUwMmQ6JTAyZCAlMmQ6JTAyZDolMDJkIiwgJnllYXIsICZtb250aCwgJmRheSwgJmhvdXIsICZtaW51dGUsICZzZWNvbmQpID09IDYpIHsKKwkJCW1vZF90aW1lLnllYXIJPSAocG5nX3VpbnRfMTYpeWVhcjsKKwkJCW1vZF90aW1lLm1vbnRoCT0gKHBuZ19ieXRlKW1vbnRoOworCQkJbW9kX3RpbWUuZGF5CT0gKHBuZ19ieXRlKWRheTsKKwkJCW1vZF90aW1lLmhvdXIJPSAocG5nX2J5dGUpaG91cjsKKwkJCW1vZF90aW1lLm1pbnV0ZQk9IChwbmdfYnl0ZSltaW51dGU7CisJCQltb2RfdGltZS5zZWNvbmQJPSAocG5nX2J5dGUpc2Vjb25kOworCQkJcG5nX3NldF90SU1FIChwbmdfcHRyLCBpbmZvX3B0ciwgJm1vZF90aW1lKTsKKwkJfQorCX0KKworCXJldHVybiBiUmVzdWx0OworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBQbHVnaW4gSW50ZXJmYWNlCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3N0YXRpYyBpbnQgc19mb3JtYXRfaWQ7CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFBsdWdpbiBJbXBsZW1lbnRhdGlvbgorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgorRm9ybWF0KCkgeworCXJldHVybiAiUE5HIjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKK0Rlc2NyaXB0aW9uKCkgeworCXJldHVybiAiUG9ydGFibGUgTmV0d29yayBHcmFwaGljcyI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCitFeHRlbnNpb24oKSB7CisJcmV0dXJuICJwbmciOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgorUmVnRXhwcigpIHsKKwlyZXR1cm4gIl4uUE5HXHIiOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgorTWltZVR5cGUoKSB7CisJcmV0dXJuICJpbWFnZS9wbmciOworfQorCitzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYKK1ZhbGlkYXRlKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSkgeworCUJZVEUgcG5nX3NpZ25hdHVyZVs4XSA9IHsgMTM3LCA4MCwgNzgsIDcxLCAxMywgMTAsIDI2LCAxMCB9OworCUJZVEUgc2lnbmF0dXJlWzhdID0geyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH07CisKKwlpby0+cmVhZF9wcm9jKCZzaWduYXR1cmUsIDEsIDgsIGhhbmRsZSk7CisKKwlyZXR1cm4gKG1lbWNtcChwbmdfc2lnbmF0dXJlLCBzaWduYXR1cmUsIDgpID09IDApOworfQorCitzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYKK1N1cHBvcnRzRXhwb3J0RGVwdGgoaW50IGRlcHRoKSB7CisJcmV0dXJuICgKKwkJCShkZXB0aCA9PSAxKSB8fAorCQkJKGRlcHRoID09IDQpIHx8CisJCQkoZGVwdGggPT0gOCkgfHwKKwkJCShkZXB0aCA9PSAyNCkgfHwKKwkJCShkZXB0aCA9PSAzMikKKwkJKTsKK30KKworc3RhdGljIEJPT0wgRExMX0NBTExDT05WIAorU3VwcG9ydHNFeHBvcnRUeXBlKEZSRUVfSU1BR0VfVFlQRSB0eXBlKSB7CisJcmV0dXJuICgKKwkJKHR5cGUgPT0gRklUX0JJVE1BUCkgfHwKKwkJKHR5cGUgPT0gRklUX1VJTlQxNikgfHwKKwkJKHR5cGUgPT0gRklUX1JHQjE2KSB8fAorCQkodHlwZSA9PSBGSVRfUkdCQTE2KQorCSk7Cit9CisKK3N0YXRpYyBCT09MIERMTF9DQUxMQ09OVgorU3VwcG9ydHNJQ0NQcm9maWxlcygpIHsKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIEJPT0wgRExMX0NBTExDT05WCitTdXBwb3J0c05vUGl4ZWxzKCkgeworCXJldHVybiBUUlVFOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKioKK0NvbmZpZ3VyZSB0aGUgZGVjb2RlciBzbyB0aGF0IGRlY29kZWQgcGl4ZWxzIGFyZSBjb21wYXRpYmxlIHdpdGggYSBGUkVFX0lNQUdFX1RZUEUgZm9ybWF0LiAKK1NldCBjb252ZXJzaW9uIGluc3RydWN0aW9ucyBhcyBuZWVkZWQuIAorQHBhcmFtIHBuZ19wdHIgUE5HIGhhbmRsZQorQHBhcmFtIGluZm9fcHRyIFBORyBpbmZvIGhhbmRsZQorQHBhcmFtIGZsYWdzIERlY29kZXIgZmxhZ3MKK0BwYXJhbSBvdXRwdXRfaW1hZ2VfdHlwZSBSZXR1cm5lZCBGcmVlSW1hZ2UgY29udmVydGVkIGltYWdlIHR5cGUKK0ByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgRkFMU0Ugb3RoZXJ3aXNlCitAc2VlIHBuZ19yZWFkX3VwZGF0ZV9pbmZvCisqLworc3RhdGljIEJPT0wgCitDb25maWd1cmVEZWNvZGVyKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwgaW50IGZsYWdzLCBGUkVFX0lNQUdFX1RZUEUgKm91dHB1dF9pbWFnZV90eXBlKSB7CisJLy8gZ2V0IG9yaWdpbmFsIGltYWdlIGluZm8KKwljb25zdCBpbnQgY29sb3JfdHlwZSA9IHBuZ19nZXRfY29sb3JfdHlwZShwbmdfcHRyLCBpbmZvX3B0cik7CisJY29uc3QgaW50IGJpdF9kZXB0aCA9IHBuZ19nZXRfYml0X2RlcHRoKHBuZ19wdHIsIGluZm9fcHRyKTsKKwljb25zdCBpbnQgcGl4ZWxfZGVwdGggPSBiaXRfZGVwdGggKiBwbmdfZ2V0X2NoYW5uZWxzKHBuZ19wdHIsIGluZm9fcHRyKTsKKworCUZSRUVfSU1BR0VfVFlQRSBpbWFnZV90eXBlID0gRklUX0JJVE1BUDsJLy8gYXNzdW1lIHN0YW5kYXJkIGltYWdlIHR5cGUKKworCS8vIGNoZWNrIGZvciB0cmFuc3BhcmVuY3kgdGFibGUgb3Igc2luZ2xlIHRyYW5zcGFyZW50IGNvbG9yCisJQk9PTCBiSXNUcmFuc3BhcmVudCA9IHBuZ19nZXRfdmFsaWQocG5nX3B0ciwgaW5mb19wdHIsIFBOR19JTkZPX3RSTlMpID09IFBOR19JTkZPX3RSTlMgPyBUUlVFIDogRkFMU0U7CisKKwkvLyBjaGVjayBhbGxvd2VkIGNvbWJpbmF0aW9ucyBvZiBjb2xvdXIgdHlwZSBhbmQgYml0IGRlcHRoCisJLy8gdGhlbiBnZXQgY29udmVydGVkIEZyZWVJbWFnZSB0eXBlCisKKwlzd2l0Y2goY29sb3JfdHlwZSkgeworCQljYXNlIFBOR19DT0xPUl9UWVBFX0dSQVk6CQkvLyBjb2xvciB0eXBlICcwJywgYml0ZGVwdGggPSAxLCAyLCA0LCA4LCAxNgorCQkJc3dpdGNoKGJpdF9kZXB0aCkgeworCQkJCWNhc2UgMToKKwkJCQljYXNlIDI6CisJCQkJY2FzZSA0OgorCQkJCWNhc2UgODoKKwkJCQkJLy8gZXhwYW5kIGdyYXlzY2FsZSBpbWFnZXMgdG8gdGhlIGZ1bGwgOC1iaXQgZnJvbSAyLWJpdC9waXhlbAorCQkJCQlpZiAocGl4ZWxfZGVwdGggPT0gMikgeworCQkJCQkJcG5nX3NldF9leHBhbmRfZ3JheV8xXzJfNF90b184KHBuZ19wdHIpOworCQkJCQl9CisKKwkJCQkJLy8gaWYgYSB0Uk5TIGNodW5rIGlzIHByb3ZpZGVkLCB3ZSBtdXN0IGFsc28gZXhwYW5kIHRoZSBncmF5c2NhbGUgZGF0YSB0byA4LWJpdHMsCisJCQkJCS8vIHRoaXMgYWxsb3dzIHVzIHRvIG1ha2UgdXNlIG9mIHRoZSB0cmFuc3BhcmVuY3kgdGFibGUgd2l0aCBleGlzdGluZyBGcmVlSW1hZ2UgbWV0aG9kcworCQkJCQlpZiAoYklzVHJhbnNwYXJlbnQgJiYgKHBpeGVsX2RlcHRoIDwgOCkpIHsKKwkJCQkJCXBuZ19zZXRfZXhwYW5kX2dyYXlfMV8yXzRfdG9fOChwbmdfcHRyKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKworCQkJCWNhc2UgMTY6CisJCQkJCWltYWdlX3R5cGUgPSAocGl4ZWxfZGVwdGggPT0gMTYpID8gRklUX1VJTlQxNiA6IEZJVF9VTktOT1dOOworCisJCQkJCS8vIDE2LWJpdCBncmF5c2NhbGUgaW1hZ2VzIGNhbiBjb250YWluIGEgdHJhbnNwYXJlbnQgdmFsdWUgKHNoYWRlKQorCQkJCQkvLyBpZiBmb3VuZCwgZXhwYW5kIHRoZSB0cmFuc3BhcmVudCB2YWx1ZSB0byBhIGZ1bGwgYWxwaGEgY2hhbm5lbAorCQkJCQlpZiAoYklzVHJhbnNwYXJlbnQgJiYgKGltYWdlX3R5cGUgIT0gRklUX1VOS05PV04pKSB7CisJCQkJCQkvLyBleHBhbmQgdFJOUyB0byBhIGZ1bGwgYWxwaGEgY2hhbm5lbAorCQkJCQkJcG5nX3NldF90Uk5TX3RvX2FscGhhKHBuZ19wdHIpOworCQkJCQkJCisJCQkJCQkvLyBleHBhbmQgbmV3IDE2LWJpdCBncmF5ICsgMTYtYml0IGFscGhhIHRvIGZ1bGwgNjQtYml0IFJHQkEKKwkJCQkJCXBuZ19zZXRfZ3JheV90b19yZ2IocG5nX3B0cik7CisKKwkJCQkJCWltYWdlX3R5cGUgPSBGSVRfUkdCQTE2OworCQkJCQl9CisJCQkJCWJyZWFrOworCisJCQkJZGVmYXVsdDoKKwkJCQkJaW1hZ2VfdHlwZSA9IEZJVF9VTktOT1dOOworCQkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUE5HX0NPTE9SX1RZUEVfUkdCOgkJLy8gY29sb3IgdHlwZSAnMicsIGJpdGRlcHRoID0gOCwgMTYKKwkJCXN3aXRjaChiaXRfZGVwdGgpIHsKKwkJCQljYXNlIDg6CisJCQkJCWltYWdlX3R5cGUgPSAocGl4ZWxfZGVwdGggPT0gMjQpID8gRklUX0JJVE1BUCA6IEZJVF9VTktOT1dOOworCQkJCQlicmVhazsKKwkJCQljYXNlIDE2OgorCQkJCQlpbWFnZV90eXBlID0gKHBpeGVsX2RlcHRoID09IDQ4KSA/IEZJVF9SR0IxNiA6IEZJVF9VTktOT1dOOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlpbWFnZV90eXBlID0gRklUX1VOS05PV047CisJCQkJCWJyZWFrOworCQkJfQorCQkJLy8gc29tZXRpbWVzLCAyNC0gb3IgNDgtYml0IGltYWdlcyBtYXkgY29udGFpbiB0cmFuc3BhcmVuY3kgaW5mb3JtYXRpb24KKwkJCS8vIGNoZWNrIGZvciB0aGlzIHVzZSBjYXNlIGFuZCBjb252ZXJ0IHRvIGFuIGFscGhhLWNvbXBhdGlibGUgZm9ybWF0CisJCQlpZiAoYklzVHJhbnNwYXJlbnQgJiYgKGltYWdlX3R5cGUgIT0gRklUX1VOS05PV04pKSB7CisJCQkJLy8gaWYgdGhlIGltYWdlIGlzIDI0LWJpdCBSR0IsIG1hcmsgaXQgYXMgMzItYml0OyBpZiBpdCBpcyA0OC1iaXQsIG1hcmsgaXQgYXMgNjQtYml0CisJCQkJaW1hZ2VfdHlwZSA9IChwaXhlbF9kZXB0aCA9PSAyNCkgPyBGSVRfQklUTUFQIDogKHBpeGVsX2RlcHRoID09IDQ4KSA/IEZJVF9SR0JBMTYgOiBGSVRfVU5LTk9XTjsKKwkJCQkvLyBleHBhbmQgdFJOUyBjaHVuayB0byBhbHBoYSBjaGFubmVsCisJCQkJcG5nX3NldF90Uk5TX3RvX2FscGhhKHBuZ19wdHIpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFOgkvLyBjb2xvciB0eXBlICczJywgYml0ZGVwdGggPSAxLCAyLCA0LCA4CisJCQlzd2l0Y2goYml0X2RlcHRoKSB7CisJCQkJY2FzZSAxOgorCQkJCWNhc2UgMjoKKwkJCQljYXNlIDQ6CisJCQkJY2FzZSA4OgorCQkJCQkvLyBleHBhbmQgcGFsZXR0ZSBpbWFnZXMgdG8gdGhlIGZ1bGwgOCBiaXRzIGZyb20gMiBiaXRzL3BpeGVsCisJCQkJCWlmIChwaXhlbF9kZXB0aCA9PSAyKSB7CisJCQkJCQlwbmdfc2V0X3BhY2tpbmcocG5nX3B0cik7CisJCQkJCX0KKworCQkJCQkvLyBpZiBhIHRSTlMgY2h1bmsgaXMgcHJvdmlkZWQsIHdlIG11c3QgYWxzbyBleHBhbmQgdGhlIHBhbGxldGl6ZWQgZGF0YSB0byA4LWJpdHMsCisJCQkJCS8vIHRoaXMgYWxsb3dzIHVzIHRvIG1ha2UgdXNlIG9mIHRoZSB0cmFuc3BhcmVuY3kgdGFibGUgd2l0aCBleGlzdGluZyBGcmVlSW1hZ2UgbWV0aG9kcworCQkJCQlpZiAoYklzVHJhbnNwYXJlbnQgJiYgKHBpeGVsX2RlcHRoIDwgOCkpIHsKKwkJCQkJCXBuZ19zZXRfcGFja2luZyhwbmdfcHRyKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKworCQkJCWRlZmF1bHQ6CisJCQkJCWltYWdlX3R5cGUgPSBGSVRfVU5LTk9XTjsKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEE6CS8vIGNvbG9yIHR5cGUgJzQnLCBiaXRkZXB0aCA9IDgsIDE2CisJCQlzd2l0Y2goYml0X2RlcHRoKSB7CisJCQkJY2FzZSA4OgorCQkJCQkvLyA4LWJpdCBncmF5c2NhbGUgKyA4LWJpdCBhbHBoYSA9PiBjb252ZXJ0IHRvIDMyLWJpdCBSR0JBCisJCQkJCWltYWdlX3R5cGUgPSAocGl4ZWxfZGVwdGggPT0gMTYpID8gRklUX0JJVE1BUCA6IEZJVF9VTktOT1dOOworCQkJCQlicmVhazsKKwkJCQljYXNlIDE2OgorCQkJCQkvLyAxNi1iaXQgZ3JheXNjYWxlICsgMTYtYml0IGFscGhhID0+IGNvbnZlcnQgdG8gNjQtYml0IFJHQkEKKwkJCQkJaW1hZ2VfdHlwZSA9IChwaXhlbF9kZXB0aCA9PSAzMikgPyBGSVRfUkdCQTE2IDogRklUX1VOS05PV047CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCWltYWdlX3R5cGUgPSBGSVRfVU5LTk9XTjsKKwkJCQkJYnJlYWs7CisJCQl9CisJCQkvLyBleHBhbmQgOC1iaXQgZ3JleXNjYWxlICsgOC1iaXQgYWxwaGEgdG8gMzItYml0CisJCQkvLyBleHBhbmQgMTYtYml0IGdyZXlzY2FsZSArIDE2LWJpdCBhbHBoYSB0byA2NC1iaXQKKwkJCXBuZ19zZXRfZ3JheV90b19yZ2IocG5nX3B0cik7CisJCQlicmVhazsKKworCQljYXNlIFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQToJLy8gY29sb3IgdHlwZSAnNicsIGJpdGRlcHRoID0gOCwgMTYKKwkJCXN3aXRjaChiaXRfZGVwdGgpIHsKKwkJCQljYXNlIDg6CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMTY6CisJCQkJCWltYWdlX3R5cGUgPSAocGl4ZWxfZGVwdGggPT0gNjQpID8gRklUX1JHQkExNiA6IEZJVF9VTktOT1dOOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlpbWFnZV90eXBlID0gRklUX1VOS05PV047CisJCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisJfQorCisJLy8gY2hlY2sgZm9yIHVua25vd24gb3IgaW52YWxpZCBmb3JtYXRzCisJaWYoaW1hZ2VfdHlwZSA9PSBGSVRfVU5LTk9XTikgeworCQkqb3V0cHV0X2ltYWdlX3R5cGUgPSBpbWFnZV90eXBlOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisjaWZuZGVmIEZSRUVJTUFHRV9CSUdFTkRJQU4KKwlpZigoaW1hZ2VfdHlwZSA9PSBGSVRfVUlOVDE2KSB8fCAoaW1hZ2VfdHlwZSA9PSBGSVRfUkdCMTYpIHx8IChpbWFnZV90eXBlID09IEZJVF9SR0JBMTYpKSB7CisJCS8vIHR1cm4gb24gMTYtYml0IGJ5dGUgc3dhcHBpbmcKKwkJcG5nX3NldF9zd2FwKHBuZ19wdHIpOworCX0KKyNlbmRpZgkJCQkJCQorCisjaWYgRlJFRUlNQUdFX0NPTE9ST1JERVIgPT0gRlJFRUlNQUdFX0NPTE9ST1JERVJfQkdSCisJaWYoKGltYWdlX3R5cGUgPT0gRklUX0JJVE1BUCkgJiYgKChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQikgfHwgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKSkpIHsKKwkJLy8gZmxpcCB0aGUgUkdCIHBpeGVscyB0byBCR1IgKG9yIFJHQkEgdG8gQkdSQSkKKwkJcG5nX3NldF9iZ3IocG5nX3B0cik7CisJfQorI2VuZGlmCisKKwkvLyBnYW1tYSBjb3JyZWN0aW9uCisJLy8gdW5saWtlIHRoZSBleGFtcGxlIGluIHRoZSBsaWJwbmcgZG9jdW1lbnRhdGlvbiwgd2UgaGF2ZSAqbm8qIGlkZWEgd2hlcmUKKwkvLyB0aGlzIGZpbGUgbWF5IGhhdmUgY29tZSBmcm9tLS1zbyBpZiBpdCBkb2Vzbid0IGhhdmUgYSBmaWxlIGdhbW1hLCBkb24ndAorCS8vIGRvIGFueSBjb3JyZWN0aW9uICgiZG8gbm8gaGFybSIpCisKKwlpZiAocG5nX2dldF92YWxpZChwbmdfcHRyLCBpbmZvX3B0ciwgUE5HX0lORk9fZ0FNQSkpIHsKKwkJZG91YmxlIGdhbW1hID0gMDsKKwkJZG91YmxlIHNjcmVlbl9nYW1tYSA9IDIuMjsKKworCQlpZiAocG5nX2dldF9nQU1BKHBuZ19wdHIsIGluZm9fcHRyLCAmZ2FtbWEpICYmICggZmxhZ3MgJiBQTkdfSUdOT1JFR0FNTUEgKSAhPSBQTkdfSUdOT1JFR0FNTUEpIHsKKwkJCXBuZ19zZXRfZ2FtbWEocG5nX3B0ciwgc2NyZWVuX2dhbW1hLCBnYW1tYSk7CisJCX0KKwl9CisKKwkvLyBhbGwgdHJhbnNmb3JtYXRpb25zIGhhdmUgYmVlbiByZWdpc3RlcmVkOyBub3cgdXBkYXRlIGluZm9fcHRyIGRhdGEJCQorCXBuZ19yZWFkX3VwZGF0ZV9pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsKKworCS8vIHJldHVybiB0aGUgb3V0cHV0IGltYWdlIHR5cGUKKwkqb3V0cHV0X2ltYWdlX3R5cGUgPSBpbWFnZV90eXBlOworCisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBGSUJJVE1BUCAqIERMTF9DQUxMQ09OVgorTG9hZChGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIGludCBwYWdlLCBpbnQgZmxhZ3MsIHZvaWQgKmRhdGEpIHsKKwlwbmdfc3RydWN0cCBwbmdfcHRyID0gTlVMTDsKKwlwbmdfaW5mb3AgaW5mb19wdHIgPSBOVUxMOworCXBuZ191aW50XzMyIHdpZHRoLCBoZWlnaHQ7CisJaW50IGNvbG9yX3R5cGU7CisJaW50IGJpdF9kZXB0aDsKKwlpbnQgcGl4ZWxfZGVwdGggPSAwOwkvLyBwaXhlbF9kZXB0aCA9IGJpdF9kZXB0aCAqIGNoYW5uZWxzCisKKwlGSUJJVE1BUCAqZGliID0gTlVMTDsKKwlwbmdfYnl0ZXBwIHJvd19wb2ludGVycyA9IE5VTEw7CisKKyAgICBmaV9pb1N0cnVjdHVyZSBmaW87CisgICAgZmlvLnNfaGFuZGxlID0gaGFuZGxlOworCWZpby5zX2lvID0gaW87CisgICAgCisJaWYgKGhhbmRsZSkgeworCQlCT09MIGhlYWRlcl9vbmx5ID0gKGZsYWdzICYgRklGX0xPQURfTk9QSVhFTFMpID09IEZJRl9MT0FEX05PUElYRUxTOworCisJCXRyeSB7CQkKKwkJCS8vIGNoZWNrIHRvIHNlZSBpZiB0aGUgZmlsZSBpcyBpbiBmYWN0IGEgUE5HIGZpbGUKKworCQkJQllURSBwbmdfY2hlY2tbUE5HX0JZVEVTX1RPX0NIRUNLXTsKKworCQkJaW8tPnJlYWRfcHJvYyhwbmdfY2hlY2ssIFBOR19CWVRFU19UT19DSEVDSywgMSwgaGFuZGxlKTsKKworCQkJaWYgKHBuZ19zaWdfY21wKHBuZ19jaGVjaywgKHBuZ19zaXplX3QpMCwgUE5HX0JZVEVTX1RPX0NIRUNLKSAhPSAwKSB7CisJCQkJcmV0dXJuIE5VTEw7CS8vIEJhZCBzaWduYXR1cmUKKwkJCX0KKwkJCQorCQkJLy8gY3JlYXRlIHRoZSBjaHVuayBtYW5hZ2Ugc3RydWN0dXJlCisKKwkJCXBuZ19wdHIgPSBwbmdfY3JlYXRlX3JlYWRfc3RydWN0KFBOR19MSUJQTkdfVkVSX1NUUklORywgKHBuZ192b2lkcClOVUxMLCBlcnJvcl9oYW5kbGVyLCB3YXJuaW5nX2hhbmRsZXIpOworCisJCQlpZiAoIXBuZ19wdHIpIHsKKwkJCQlyZXR1cm4gTlVMTDsJCQkKKwkJCX0KKworCQkJLy8gY3JlYXRlIHRoZSBpbmZvIHN0cnVjdHVyZQorCisJCSAgICBpbmZvX3B0ciA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QocG5nX3B0cik7CisKKwkJCWlmICghaW5mb19wdHIpIHsKKwkJCQlwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcG5nX3B0ciwgKHBuZ19pbmZvcHApTlVMTCwgKHBuZ19pbmZvcHApTlVMTCk7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisKKwkJCS8vIGluaXQgdGhlIElPCisKKwkJCXBuZ19zZXRfcmVhZF9mbihwbmdfcHRyLCAmZmlvLCBfUmVhZFByb2MpOworCisgICAgICAgICAgICBpZiAoc2V0am1wKHBuZ19qbXBidWYocG5nX3B0cikpKSB7CisJCQkJcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0ciwgTlVMTCk7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisKKwkJCS8vIGJlY2F1c2Ugd2UgaGF2ZSBhbHJlYWR5IHJlYWQgdGhlIHNpZ25hdHVyZS4uLgorCisJCQlwbmdfc2V0X3NpZ19ieXRlcyhwbmdfcHRyLCBQTkdfQllURVNfVE9fQ0hFQ0spOworCisJCQkvLyByZWFkIHRoZSBJSERSIGNodW5rCisKKwkJCXBuZ19yZWFkX2luZm8ocG5nX3B0ciwgaW5mb19wdHIpOworCQkJcG5nX2dldF9JSERSKHBuZ19wdHIsIGluZm9fcHRyLCAmd2lkdGgsICZoZWlnaHQsICZiaXRfZGVwdGgsICZjb2xvcl90eXBlLCBOVUxMLCBOVUxMLCBOVUxMKTsKKworCQkJLy8gY29uZmlndXJlIHRoZSBkZWNvZGVyCisKKwkJCUZSRUVfSU1BR0VfVFlQRSBpbWFnZV90eXBlID0gRklUX0JJVE1BUDsKKworCQkJaWYoIUNvbmZpZ3VyZURlY29kZXIocG5nX3B0ciwgaW5mb19wdHIsIGZsYWdzLCAmaW1hZ2VfdHlwZSkpIHsKKwkJCQl0aHJvdyBGSV9NU0dfRVJST1JfVU5TVVBQT1JURURfRk9STUFUOworCQkJfQorCisJCQkvLyB1cGRhdGUgaW1hZ2UgaW5mbworCisJCQljb2xvcl90eXBlID0gcG5nX2dldF9jb2xvcl90eXBlKHBuZ19wdHIsIGluZm9fcHRyKTsKKwkJCWJpdF9kZXB0aCA9IHBuZ19nZXRfYml0X2RlcHRoKHBuZ19wdHIsIGluZm9fcHRyKTsKKwkJCXBpeGVsX2RlcHRoID0gYml0X2RlcHRoICogcG5nX2dldF9jaGFubmVscyhwbmdfcHRyLCBpbmZvX3B0cik7CisKKwkJCS8vIGNyZWF0ZSBhIGRpYiBhbmQgd3JpdGUgdGhlIGJpdG1hcCBoZWFkZXIKKwkJCS8vIHNldCB1cCB0aGUgZGliIHBhbGV0dGUsIGlmIG5lZWRlZAorCisJCQlzd2l0Y2ggKGNvbG9yX3R5cGUpIHsKKwkJCQljYXNlIFBOR19DT0xPUl9UWVBFX1JHQjoKKwkJCQljYXNlIFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQToKKwkJCQkJZGliID0gRnJlZUltYWdlX0FsbG9jYXRlSGVhZGVyVChoZWFkZXJfb25seSwgaW1hZ2VfdHlwZSwgd2lkdGgsIGhlaWdodCwgcGl4ZWxfZGVwdGgsIEZJX1JHQkFfUkVEX01BU0ssIEZJX1JHQkFfR1JFRU5fTUFTSywgRklfUkdCQV9CTFVFX01BU0spOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgUE5HX0NPTE9SX1RZUEVfUEFMRVRURToKKwkJCQkJZGliID0gRnJlZUltYWdlX0FsbG9jYXRlSGVhZGVyVChoZWFkZXJfb25seSwgaW1hZ2VfdHlwZSwgd2lkdGgsIGhlaWdodCwgcGl4ZWxfZGVwdGgsIEZJX1JHQkFfUkVEX01BU0ssIEZJX1JHQkFfR1JFRU5fTUFTSywgRklfUkdCQV9CTFVFX01BU0spOworCQkJCQlpZihkaWIpIHsKKwkJCQkJCXBuZ19jb2xvcnAgcG5nX3BhbGV0dGUgPSBOVUxMOworCQkJCQkJaW50IHBhbGV0dGVfZW50cmllcyA9IDA7CisKKwkJCQkJCXBuZ19nZXRfUExURShwbmdfcHRyLGluZm9fcHRyLCAmcG5nX3BhbGV0dGUsICZwYWxldHRlX2VudHJpZXMpOworCisJCQkJCQlwYWxldHRlX2VudHJpZXMgPSBNSU4oKHVuc2lnbmVkKXBhbGV0dGVfZW50cmllcywgRnJlZUltYWdlX0dldENvbG9yc1VzZWQoZGliKSk7CisKKwkJCQkJCS8vIHN0b3JlIHRoZSBwYWxldHRlCisKKwkJCQkJCVJHQlFVQUQgKnBhbGV0dGUgPSBGcmVlSW1hZ2VfR2V0UGFsZXR0ZShkaWIpOworCQkJCQkJZm9yKGludCBpID0gMDsgaSA8IHBhbGV0dGVfZW50cmllczsgaSsrKSB7CisJCQkJCQkJcGFsZXR0ZVtpXS5yZ2JSZWQgICA9IHBuZ19wYWxldHRlW2ldLnJlZDsKKwkJCQkJCQlwYWxldHRlW2ldLnJnYkdyZWVuID0gcG5nX3BhbGV0dGVbaV0uZ3JlZW47CisJCQkJCQkJcGFsZXR0ZVtpXS5yZ2JCbHVlICA9IHBuZ19wYWxldHRlW2ldLmJsdWU7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIFBOR19DT0xPUl9UWVBFX0dSQVk6CisJCQkJCWRpYiA9IEZyZWVJbWFnZV9BbGxvY2F0ZUhlYWRlclQoaGVhZGVyX29ubHksIGltYWdlX3R5cGUsIHdpZHRoLCBoZWlnaHQsIHBpeGVsX2RlcHRoLCBGSV9SR0JBX1JFRF9NQVNLLCBGSV9SR0JBX0dSRUVOX01BU0ssIEZJX1JHQkFfQkxVRV9NQVNLKTsKKworCQkJCQlpZihkaWIgJiYgKHBpeGVsX2RlcHRoIDw9IDgpKSB7CisJCQkJCQlSR0JRVUFEICpwYWxldHRlID0gRnJlZUltYWdlX0dldFBhbGV0dGUoZGliKTsKKwkJCQkJCWNvbnN0IGludCBwYWxldHRlX2VudHJpZXMgPSAxIDw8IHBpeGVsX2RlcHRoOworCisJCQkJCQlmb3IoaW50IGkgPSAwOyBpIDwgcGFsZXR0ZV9lbnRyaWVzOyBpKyspIHsKKwkJCQkJCQlwYWxldHRlW2ldLnJnYlJlZCAgID0KKwkJCQkJCQlwYWxldHRlW2ldLnJnYkdyZWVuID0KKwkJCQkJCQlwYWxldHRlW2ldLnJnYkJsdWUgID0gKEJZVEUpKChpICogMjU1KSAvIChwYWxldHRlX2VudHJpZXMgLSAxKSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJYnJlYWs7CisKKwkJCQlkZWZhdWx0OgorCQkJCQl0aHJvdyBGSV9NU0dfRVJST1JfVU5TVVBQT1JURURfRk9STUFUOworCQkJfQorCisJCQlpZighZGliKSB7CisJCQkJdGhyb3cgRklfTVNHX0VSUk9SX0RJQl9NRU1PUlk7CisJCQl9CisKKwkJCS8vIHN0b3JlIHRoZSB0cmFuc3BhcmVuY3kgdGFibGUKKworCQkJaWYgKHBuZ19nZXRfdmFsaWQocG5nX3B0ciwgaW5mb19wdHIsIFBOR19JTkZPX3RSTlMpKSB7CisJCQkJLy8gYXJyYXkgb2YgYWxwaGEgKHRyYW5zcGFyZW5jeSkgZW50cmllcyBmb3IgcGFsZXR0ZQorCQkJCXBuZ19ieXRlcCB0cmFuc19hbHBoYSA9IE5VTEw7CisJCQkJLy8gbnVtYmVyIG9mIHRyYW5zcGFyZW50IGVudHJpZXMKKwkJCQlpbnQgbnVtX3RyYW5zID0gMDsJCQkJCQkKKwkJCQkvLyBncmF5bGV2ZWwgb3IgY29sb3Igc2FtcGxlIHZhbHVlcyBvZiB0aGUgc2luZ2xlIHRyYW5zcGFyZW50IGNvbG9yIGZvciBub24tcGFsZXR0ZWQgaW1hZ2VzCisJCQkJcG5nX2NvbG9yXzE2cCB0cmFuc19jb2xvciA9IE5VTEw7CisKKwkJCQlwbmdfZ2V0X3RSTlMocG5nX3B0ciwgaW5mb19wdHIsICZ0cmFuc19hbHBoYSwgJm51bV90cmFucywgJnRyYW5zX2NvbG9yKTsKKworCQkJCWlmKChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkpICYmIHRyYW5zX2NvbG9yKSB7CisJCQkJCS8vIHNpbmdsZSB0cmFuc3BhcmVudCBjb2xvcgorCQkJCQlpZiAodHJhbnNfY29sb3ItPmdyYXkgPCAyNTYpIHsgCisJCQkJCQlCWVRFIHRhYmxlWzI1Nl07IAorCQkJCQkJbWVtc2V0KHRhYmxlLCAweEZGLCAyNTYpOyAKKwkJCQkJCXRhYmxlW3RyYW5zX2NvbG9yLT5ncmF5XSA9IDA7IAorCQkJCQkJRnJlZUltYWdlX1NldFRyYW5zcGFyZW5jeVRhYmxlKGRpYiwgdGFibGUsIDI1Nik7IAorCQkJCQl9CisJCQkJCS8vIGNoZWNrIGZvciBhIGZ1bGwgdHJhbnNwYXJlbmN5IHRhYmxlLCB0b28KKwkJCQkJZWxzZSBpZiAoKHRyYW5zX2FscGhhKSAmJiAocGl4ZWxfZGVwdGggPD0gOCkpIHsKKwkJCQkJCUZyZWVJbWFnZV9TZXRUcmFuc3BhcmVuY3lUYWJsZShkaWIsIChCWVRFICopdHJhbnNfYWxwaGEsIG51bV90cmFucyk7CisJCQkJCX0KKworCQkJCX0gZWxzZSBpZigoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKSAmJiB0cmFuc19hbHBoYSkgeworCQkJCQkvLyB0cmFuc3BhcmVuY3kgdGFibGUKKwkJCQkJRnJlZUltYWdlX1NldFRyYW5zcGFyZW5jeVRhYmxlKGRpYiwgKEJZVEUgKil0cmFuc19hbHBoYSwgbnVtX3RyYW5zKTsKKwkJCQl9CisJCQl9CisKKwkJCS8vIHN0b3JlIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIChvbmx5IHN1cHBvcnRlZCBmb3IgRklUX0JJVE1BUCB0eXBlcykKKworCQkJaWYgKChpbWFnZV90eXBlID09IEZJVF9CSVRNQVApICYmIHBuZ19nZXRfdmFsaWQocG5nX3B0ciwgaW5mb19wdHIsIFBOR19JTkZPX2JLR0QpKSB7CisJCQkJLy8gR2V0IHRoZSBiYWNrZ3JvdW5kIGNvbG9yIHRvIGRyYXcgdHJhbnNwYXJlbnQgYW5kIGFscGhhIGltYWdlcyBvdmVyLgorCQkJCS8vIE5vdGUgdGhhdCBldmVuIGlmIHRoZSBQTkcgZmlsZSBzdXBwbGllcyBhIGJhY2tncm91bmQsIHlvdSBhcmUgbm90IHJlcXVpcmVkIHRvCisJCQkJLy8gdXNlIGl0IC0geW91IHNob3VsZCB1c2UgdGhlIChzb2xpZCkgYXBwbGljYXRpb24gYmFja2dyb3VuZCBpZiBpdCBoYXMgb25lLgorCisJCQkJcG5nX2NvbG9yXzE2cCBpbWFnZV9iYWNrZ3JvdW5kID0gTlVMTDsKKwkJCQlSR0JRVUFEIHJnYkJrQ29sb3I7CisKKwkJCQlpZiAocG5nX2dldF9iS0dEKHBuZ19wdHIsIGluZm9fcHRyLCAmaW1hZ2VfYmFja2dyb3VuZCkpIHsKKwkJCQkJcmdiQmtDb2xvci5yZ2JSZWQgICAgICA9IChCWVRFKWltYWdlX2JhY2tncm91bmQtPnJlZDsKKwkJCQkJcmdiQmtDb2xvci5yZ2JHcmVlbiAgICA9IChCWVRFKWltYWdlX2JhY2tncm91bmQtPmdyZWVuOworCQkJCQlyZ2JCa0NvbG9yLnJnYkJsdWUgICAgID0gKEJZVEUpaW1hZ2VfYmFja2dyb3VuZC0+Ymx1ZTsKKwkJCQkJcmdiQmtDb2xvci5yZ2JSZXNlcnZlZCA9IDA7CisKKwkJCQkJRnJlZUltYWdlX1NldEJhY2tncm91bmRDb2xvcihkaWIsICZyZ2JCa0NvbG9yKTsKKwkJCQl9CisJCQl9CisKKwkJCS8vIGdldCBwaHlzaWNhbCByZXNvbHV0aW9uCisKKwkJCWlmIChwbmdfZ2V0X3ZhbGlkKHBuZ19wdHIsIGluZm9fcHRyLCBQTkdfSU5GT19wSFlzKSkgeworCQkJCXBuZ191aW50XzMyIHJlc194LCByZXNfeTsKKwkJCQkKKwkJCQkvLyB3ZSdsbCBvdmVybG9hZCB0aGlzIHZhciBhbmQgdXNlIDAgdG8gbWVhbiBubyBwaHlzIGRhdGEsCisJCQkJLy8gc2luY2UgaWYgaXQncyBub3QgaW4gbWV0ZXJzIHdlIGNhbid0IHVzZSBpdCBhbnl3YXkKKworCQkJCWludCByZXNfdW5pdF90eXBlID0gUE5HX1JFU09MVVRJT05fVU5LTk9XTjsKKworCQkJCXBuZ19nZXRfcEhZcyhwbmdfcHRyLGluZm9fcHRyLCAmcmVzX3gsICZyZXNfeSwgJnJlc191bml0X3R5cGUpOworCisJCQkJaWYgKHJlc191bml0X3R5cGUgPT0gUE5HX1JFU09MVVRJT05fTUVURVIpIHsKKwkJCQkJRnJlZUltYWdlX1NldERvdHNQZXJNZXRlclgoZGliLCByZXNfeCk7CisJCQkJCUZyZWVJbWFnZV9TZXREb3RzUGVyTWV0ZXJZKGRpYiwgcmVzX3kpOworCQkJCX0KKwkJCX0KKworCQkJLy8gZ2V0IHBvc3NpYmxlIElDQyBwcm9maWxlCisKKwkJCWlmIChwbmdfZ2V0X3ZhbGlkKHBuZ19wdHIsIGluZm9fcHRyLCBQTkdfSU5GT19pQ0NQKSkgeworCQkJCXBuZ19jaGFycCBwcm9maWxlX25hbWUgPSBOVUxMOworCQkJCXBuZ19ieXRlcCBwcm9maWxlX2RhdGEgPSBOVUxMOworCQkJCXBuZ191aW50XzMyIHByb2ZpbGVfbGVuZ3RoID0gMDsKKwkJCQlpbnQgIGNvbXByZXNzaW9uX3R5cGU7CisKKwkJCQlwbmdfZ2V0X2lDQ1AocG5nX3B0ciwgaW5mb19wdHIsICZwcm9maWxlX25hbWUsICZjb21wcmVzc2lvbl90eXBlLCAmcHJvZmlsZV9kYXRhLCAmcHJvZmlsZV9sZW5ndGgpOworCisJCQkJLy8gY29weSBJQ0MgcHJvZmlsZSBkYXRhIChtdXN0IGJlIGRvbmUgYWZ0ZXIgRnJlZUltYWdlX0FsbG9jYXRlSGVhZGVyKQorCisJCQkJRnJlZUltYWdlX0NyZWF0ZUlDQ1Byb2ZpbGUoZGliLCBwcm9maWxlX2RhdGEsIHByb2ZpbGVfbGVuZ3RoKTsKKwkJCX0KKworCQkJLy8gLS0tIGhlYWRlciBvbmx5IG1vZGUgPT4gY2xlYW4tdXAgYW5kIHJldHVybgorCisJCQlpZiAoaGVhZGVyX29ubHkpIHsKKwkJCQkvLyBnZXQgcG9zc2libGUgbWV0YWRhdGEgKGl0IGNhbiBiZSBsb2NhdGVkIGJvdGggYmVmb3JlIGFuZCBhZnRlciB0aGUgaW1hZ2UgZGF0YSkKKwkJCQlSZWFkTWV0YWRhdGEocG5nX3B0ciwgaW5mb19wdHIsIGRpYik7CisJCQkJaWYgKHBuZ19wdHIpIHsKKwkJCQkJLy8gY2xlYW4gdXAgYWZ0ZXIgdGhlIHJlYWQsIGFuZCBmcmVlIGFueSBtZW1vcnkgYWxsb2NhdGVkIC0gUkVRVUlSRUQKKwkJCQkJcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0ciwgKHBuZ19pbmZvcHApTlVMTCk7CisJCQkJfQorCQkJCXJldHVybiBkaWI7CisJCQl9CisKKwkJCS8vIHNldCB0aGUgaW5kaXZpZHVhbCByb3dfcG9pbnRlcnMgdG8gcG9pbnQgYXQgdGhlIGNvcnJlY3Qgb2Zmc2V0cworCisJCQlyb3dfcG9pbnRlcnMgPSAocG5nX2J5dGVwcCltYWxsb2MoaGVpZ2h0ICogc2l6ZW9mKHBuZ19ieXRlcCkpOworCisJCQlpZiAoIXJvd19wb2ludGVycykgeworCQkJCXBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIsIE5VTEwpOworCQkJCUZyZWVJbWFnZV9VbmxvYWQoZGliKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKworCQkJLy8gcmVhZCBpbiB0aGUgYml0bWFwIGJpdHMgdmlhIHRoZSBwb2ludGVyIHRhYmxlCisJCQkvLyBhbGxvdyBsb2FkaW5nIG9mIFBORyB3aXRoIG1pbm9yIGVycm9ycyAoc3VjaCBhcyBpbWFnZXMgd2l0aCBzZXZlcmFsIElEQVQgY2h1bmtzKQorCisJCQlmb3IgKHBuZ191aW50XzMyIGsgPSAwOyBrIDwgaGVpZ2h0OyBrKyspIHsKKwkJCQlyb3dfcG9pbnRlcnNbaGVpZ2h0IC0gMSAtIGtdID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgayk7CisJCQl9CisKKwkJCXBuZ19zZXRfYmVuaWduX2Vycm9ycyhwbmdfcHRyLCAxKTsKKwkJCXBuZ19yZWFkX2ltYWdlKHBuZ19wdHIsIHJvd19wb2ludGVycyk7CisKKwkJCS8vIGNoZWNrIGlmIHRoZSBiaXRtYXAgY29udGFpbnMgdHJhbnNwYXJlbmN5LCBpZiBzbyBlbmFibGUgaXQgaW4gdGhlIGhlYWRlcgorCisJCQlpZiAoRnJlZUltYWdlX0dldEJQUChkaWIpID09IDMyKSB7CisJCQkJaWYgKEZyZWVJbWFnZV9HZXRDb2xvclR5cGUoZGliKSA9PSBGSUNfUkdCQUxQSEEpIHsKKwkJCQkJRnJlZUltYWdlX1NldFRyYW5zcGFyZW50KGRpYiwgVFJVRSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJRnJlZUltYWdlX1NldFRyYW5zcGFyZW50KGRpYiwgRkFMU0UpOworCQkJCX0KKwkJCX0KKwkJCQkKKwkJCS8vIGNsZWFudXAKKworCQkJaWYgKHJvd19wb2ludGVycykgeworCQkJCWZyZWUocm93X3BvaW50ZXJzKTsKKwkJCQlyb3dfcG9pbnRlcnMgPSBOVUxMOworCQkJfQorCisJCQkvLyByZWFkIHRoZSByZXN0IG9mIHRoZSBmaWxlLCBnZXR0aW5nIGFueSBhZGRpdGlvbmFsIGNodW5rcyBpbiBpbmZvX3B0cgorCisJCQlwbmdfcmVhZF9lbmQocG5nX3B0ciwgaW5mb19wdHIpOworCisJCQkvLyBnZXQgcG9zc2libGUgbWV0YWRhdGEgKGl0IGNhbiBiZSBsb2NhdGVkIGJvdGggYmVmb3JlIGFuZCBhZnRlciB0aGUgaW1hZ2UgZGF0YSkKKworCQkJUmVhZE1ldGFkYXRhKHBuZ19wdHIsIGluZm9fcHRyLCBkaWIpOworCisJCQlpZiAocG5nX3B0cikgeworCQkJCS8vIGNsZWFuIHVwIGFmdGVyIHRoZSByZWFkLCBhbmQgZnJlZSBhbnkgbWVtb3J5IGFsbG9jYXRlZCAtIFJFUVVJUkVECisJCQkJcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0ciwgKHBuZ19pbmZvcHApTlVMTCk7CisJCQl9CisKKwkJCXJldHVybiBkaWI7CisKKwkJfSBjYXRjaCAoY29uc3QgY2hhciAqdGV4dCkgeworCQkJaWYgKHBuZ19wdHIpIHsKKwkJCQlwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyLCAocG5nX2luZm9wcClOVUxMKTsKKwkJCX0KKwkJCWlmIChyb3dfcG9pbnRlcnMpIHsKKwkJCQlmcmVlKHJvd19wb2ludGVycyk7CisJCQl9CisJCQlpZiAoZGliKSB7CisJCQkJRnJlZUltYWdlX1VubG9hZChkaWIpOworCQkJfQorCQkJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKHNfZm9ybWF0X2lkLCB0ZXh0KTsKKwkJCQorCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CQkJCisKKwlyZXR1cm4gTlVMTDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIEJPT0wgRExMX0NBTExDT05WCitTYXZlKEZyZWVJbWFnZUlPICppbywgRklCSVRNQVAgKmRpYiwgZmlfaGFuZGxlIGhhbmRsZSwgaW50IHBhZ2UsIGludCBmbGFncywgdm9pZCAqZGF0YSkgeworCXBuZ19zdHJ1Y3RwIHBuZ19wdHI7CisJcG5nX2luZm9wIGluZm9fcHRyOworCXBuZ19jb2xvcnAgcGFsZXR0ZSA9IE5VTEw7CisJcG5nX3VpbnRfMzIgd2lkdGgsIGhlaWdodDsKKwlCT09MIGhhc19hbHBoYV9jaGFubmVsID0gRkFMU0U7CisKKwlSR0JRVUFEICpwYWw7CQkJCQkvLyBwb2ludGVyIHRvIGRpYiBwYWxldHRlCisJaW50IGJpdF9kZXB0aCwgcGl4ZWxfZGVwdGg7CQkvLyBwaXhlbF9kZXB0aCA9IGJpdF9kZXB0aCAqIGNoYW5uZWxzCisJaW50IHBhbGV0dGVfZW50cmllczsKKwlpbnQJaW50ZXJsYWNlX3R5cGU7CisKKwlmaV9pb1N0cnVjdHVyZSBmaW87CisgICAgZmlvLnNfaGFuZGxlID0gaGFuZGxlOworCWZpby5zX2lvID0gaW87CisKKwlpZiAoKGRpYikgJiYgKGhhbmRsZSkpIHsKKwkJdHJ5IHsKKwkJCS8vIGNyZWF0ZSB0aGUgY2h1bmsgbWFuYWdlIHN0cnVjdHVyZQorCisJCQlwbmdfcHRyID0gcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3QoUE5HX0xJQlBOR19WRVJfU1RSSU5HLCAocG5nX3ZvaWRwKU5VTEwsIGVycm9yX2hhbmRsZXIsIHdhcm5pbmdfaGFuZGxlcik7CisKKwkJCWlmICghcG5nX3B0cikgIHsKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQl9CisKKwkJCS8vIGFsbG9jYXRlL2luaXRpYWxpemUgdGhlIGltYWdlIGluZm9ybWF0aW9uIGRhdGEuCisKKwkJCWluZm9fcHRyID0gcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdChwbmdfcHRyKTsKKworCQkJaWYgKCFpbmZvX3B0cikgIHsKKwkJCQlwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoJnBuZ19wdHIsICAocG5nX2luZm9wcClOVUxMKTsKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQl9CisKKwkJCS8vIFNldCBlcnJvciBoYW5kbGluZy4gIFJFUVVJUkVEIGlmIHlvdSBhcmVuJ3Qgc3VwcGx5aW5nIHlvdXIgb3duCisJCQkvLyBlcnJvciBoYW5kbGluZyBmdW5jdGlvbnMgaW4gdGhlIHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0KCkgY2FsbC4KKworCQkJaWYgKHNldGptcChwbmdfam1wYnVmKHBuZ19wdHIpKSkgIHsKKwkJCQkvLyBpZiB3ZSBnZXQgaGVyZSwgd2UgaGFkIGEgcHJvYmxlbSByZWFkaW5nIHRoZSBmaWxlCisKKwkJCQlwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0cik7CisKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQl9CisKKwkJCS8vIGluaXQgdGhlIElPCisgICAgICAgICAgICAKKwkJCXBuZ19zZXRfd3JpdGVfZm4ocG5nX3B0ciwgJmZpbywgX1dyaXRlUHJvYywgX0ZsdXNoUHJvYyk7CisKKwkJCS8vIHNldCBwaHlzaWNhbCByZXNvbHV0aW9uCisKKwkJCXBuZ191aW50XzMyIHJlc194ID0gKHBuZ191aW50XzMyKUZyZWVJbWFnZV9HZXREb3RzUGVyTWV0ZXJYKGRpYik7CisJCQlwbmdfdWludF8zMiByZXNfeSA9IChwbmdfdWludF8zMilGcmVlSW1hZ2VfR2V0RG90c1Blck1ldGVyWShkaWIpOworCisJCQlpZiAoKHJlc194ID4gMCkgJiYgKHJlc195ID4gMCkpICB7CisJCQkJcG5nX3NldF9wSFlzKHBuZ19wdHIsIGluZm9fcHRyLCByZXNfeCwgcmVzX3ksIFBOR19SRVNPTFVUSU9OX01FVEVSKTsKKwkJCX0KKwkKKwkJCS8vIFNldCB0aGUgaW1hZ2UgaW5mb3JtYXRpb24gaGVyZS4gIFdpZHRoIGFuZCBoZWlnaHQgYXJlIHVwIHRvIDJeMzEsCisJCQkvLyBiaXRfZGVwdGggaXMgb25lIG9mIDEsIDIsIDQsIDgsIG9yIDE2LCBidXQgdmFsaWQgdmFsdWVzIGFsc28gZGVwZW5kIG9uCisJCQkvLyB0aGUgY29sb3JfdHlwZSBzZWxlY3RlZC4gY29sb3JfdHlwZSBpcyBvbmUgb2YgUE5HX0NPTE9SX1RZUEVfR1JBWSwKKwkJCS8vIFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEEsIFBOR19DT0xPUl9UWVBFX1BBTEVUVEUsIFBOR19DT0xPUl9UWVBFX1JHQiwKKwkJCS8vIG9yIFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQS4gIGludGVybGFjZSBpcyBlaXRoZXIgUE5HX0lOVEVSTEFDRV9OT05FIG9yCisJCQkvLyBQTkdfSU5URVJMQUNFX0FEQU03LCBhbmQgdGhlIGNvbXByZXNzaW9uX3R5cGUgYW5kIGZpbHRlcl90eXBlIE1VU1QKKwkJCS8vIGN1cnJlbnRseSBiZSBQTkdfQ09NUFJFU1NJT05fVFlQRV9CQVNFIGFuZCBQTkdfRklMVEVSX1RZUEVfQkFTRS4gUkVRVUlSRUQKKworCQkJd2lkdGggPSBGcmVlSW1hZ2VfR2V0V2lkdGgoZGliKTsKKwkJCWhlaWdodCA9IEZyZWVJbWFnZV9HZXRIZWlnaHQoZGliKTsKKwkJCXBpeGVsX2RlcHRoID0gRnJlZUltYWdlX0dldEJQUChkaWIpOworCisJCQlCT09MIGJJbnRlcmxhY2VkID0gRkFMU0U7CisJCQlpZiggKGZsYWdzICYgUE5HX0lOVEVSTEFDRUQpID09IFBOR19JTlRFUkxBQ0VEKSB7CisJCQkJaW50ZXJsYWNlX3R5cGUgPSBQTkdfSU5URVJMQUNFX0FEQU03OworCQkJCWJJbnRlcmxhY2VkID0gVFJVRTsKKwkJCX0gZWxzZSB7CisJCQkJaW50ZXJsYWNlX3R5cGUgPSBQTkdfSU5URVJMQUNFX05PTkU7CisJCQl9CisKKwkJCS8vIHNldCB0aGUgWkxJQiBjb21wcmVzc2lvbiBsZXZlbCBvciBkZWZhdWx0IHRvIFBORyBkZWZhdWx0IGNvbXByZXNzaW9uIGxldmVsIChaTElCIGxldmVsID0gNikKKwkJCWludCB6bGliX2xldmVsID0gZmxhZ3MgJiAweDBGOworCQkJaWYoKHpsaWJfbGV2ZWwgPj0gMSkgJiYgKHpsaWJfbGV2ZWwgPD0gOSkpIHsKKwkJCQlwbmdfc2V0X2NvbXByZXNzaW9uX2xldmVsKHBuZ19wdHIsIHpsaWJfbGV2ZWwpOworCQkJfSBlbHNlIGlmKChmbGFncyAmIFBOR19aX05PX0NPTVBSRVNTSU9OKSA9PSBQTkdfWl9OT19DT01QUkVTU0lPTikgeworCQkJCXBuZ19zZXRfY29tcHJlc3Npb25fbGV2ZWwocG5nX3B0ciwgWl9OT19DT01QUkVTU0lPTik7CisJCQl9CisKKwkJCS8vIGZpbHRlcmVkIHN0cmF0ZWd5IHdvcmtzIGJldHRlciBmb3IgaGlnaCBjb2xvciBpbWFnZXMKKwkJCWlmKHBpeGVsX2RlcHRoID49IDE2KXsKKwkJCQlwbmdfc2V0X2NvbXByZXNzaW9uX3N0cmF0ZWd5KHBuZ19wdHIsIFpfRklMVEVSRUQpOworCQkJCXBuZ19zZXRfZmlsdGVyKHBuZ19wdHIsIDAsIFBOR19GSUxURVJfTk9ORXxQTkdfRklMVEVSX1NVQnxQTkdfRklMVEVSX1BBRVRIKTsKKwkJCX0gZWxzZSB7CisJCQkJcG5nX3NldF9jb21wcmVzc2lvbl9zdHJhdGVneShwbmdfcHRyLCBaX0RFRkFVTFRfU1RSQVRFR1kpOworCQkJfQorCisJCQlGUkVFX0lNQUdFX1RZUEUgaW1hZ2VfdHlwZSA9IEZyZWVJbWFnZV9HZXRJbWFnZVR5cGUoZGliKTsKKwkJCWlmKGltYWdlX3R5cGUgPT0gRklUX0JJVE1BUCkgeworCQkJCS8vIHN0YW5kYXJkIGltYWdlIHR5cGUKKwkJCQliaXRfZGVwdGggPSAocGl4ZWxfZGVwdGggPiA4KSA/IDggOiBwaXhlbF9kZXB0aDsKKwkJCX0gZWxzZSB7CisJCQkJLy8gMTYtYml0IGdyZXlzY2FsZSBvciAxNi1iaXQgUkdCKEEpCisJCQkJYml0X2RlcHRoID0gMTY7CisJCQl9CisKKwkJCS8vIGNoZWNrIGZvciB0cmFuc3BhcmVudCBpbWFnZXMKKwkJCUJPT0wgYklzVHJhbnNwYXJlbnQgPSAKKwkJCQkoaW1hZ2VfdHlwZSA9PSBGSVRfQklUTUFQKSAmJiBGcmVlSW1hZ2VfSXNUcmFuc3BhcmVudChkaWIpICYmIChGcmVlSW1hZ2VfR2V0VHJhbnNwYXJlbmN5Q291bnQoZGliKSA+IDApID8gVFJVRSA6IEZBTFNFOworCisJCQlzd2l0Y2ggKEZyZWVJbWFnZV9HZXRDb2xvclR5cGUoZGliKSkgeworCQkJCWNhc2UgRklDX01JTklTV0hJVEU6CisJCQkJCWlmKCFiSXNUcmFuc3BhcmVudCkgeworCQkJCQkJLy8gSW52ZXJ0IG1vbm9jaHJvbWUgZmlsZXMgdG8gaGF2ZSAwIGFzIGJsYWNrIGFuZCAxIGFzIHdoaXRlIChubyBicmVhayBoZXJlKQorCQkJCQkJcG5nX3NldF9pbnZlcnRfbW9ubyhwbmdfcHRyKTsKKwkJCQkJfQorCQkJCQkvLyAoZmFsbCB0aHJvdWdoKQorCisJCQkJY2FzZSBGSUNfTUlOSVNCTEFDSzoKKwkJCQkJaWYoIWJJc1RyYW5zcGFyZW50KSB7CisJCQkJCQlwbmdfc2V0X0lIRFIocG5nX3B0ciwgaW5mb19wdHIsIHdpZHRoLCBoZWlnaHQsIGJpdF9kZXB0aCwgCisJCQkJCQkJUE5HX0NPTE9SX1RZUEVfR1JBWSwgaW50ZXJsYWNlX3R5cGUsIAorCQkJCQkJCVBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0UsIFBOR19GSUxURVJfVFlQRV9CQVNFKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCS8vIElmIGEgbW9ub2Nocm9tZSBpbWFnZSBpcyB0cmFuc3BhcmVudCwgc2F2ZSBpdCB3aXRoIGEgcGFsZXR0ZQorCQkJCQkvLyAoZmFsbCB0aHJvdWdoKQorCisJCQkJY2FzZSBGSUNfUEFMRVRURToKKwkJCQl7CisJCQkJCXBuZ19zZXRfSUhEUihwbmdfcHRyLCBpbmZvX3B0ciwgd2lkdGgsIGhlaWdodCwgYml0X2RlcHRoLCAKKwkJCQkJCVBOR19DT0xPUl9UWVBFX1BBTEVUVEUsIGludGVybGFjZV90eXBlLCAKKwkJCQkJCVBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0UsIFBOR19GSUxURVJfVFlQRV9CQVNFKTsKKworCQkJCQkvLyBzZXQgdGhlIHBhbGV0dGUKKworCQkJCQlwYWxldHRlX2VudHJpZXMgPSAxIDw8IGJpdF9kZXB0aDsKKwkJCQkJcGFsZXR0ZSA9IChwbmdfY29sb3JwKXBuZ19tYWxsb2MocG5nX3B0ciwgcGFsZXR0ZV9lbnRyaWVzICogc2l6ZW9mIChwbmdfY29sb3IpKTsKKwkJCQkJcGFsID0gRnJlZUltYWdlX0dldFBhbGV0dGUoZGliKTsKKworCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhbGV0dGVfZW50cmllczsgaSsrKSB7CisJCQkJCQlwYWxldHRlW2ldLnJlZCAgID0gcGFsW2ldLnJnYlJlZDsKKwkJCQkJCXBhbGV0dGVbaV0uZ3JlZW4gPSBwYWxbaV0ucmdiR3JlZW47CisJCQkJCQlwYWxldHRlW2ldLmJsdWUgID0gcGFsW2ldLnJnYkJsdWU7CisJCQkJCX0KKwkJCQkJCisJCQkJCXBuZ19zZXRfUExURShwbmdfcHRyLCBpbmZvX3B0ciwgcGFsZXR0ZSwgcGFsZXR0ZV9lbnRyaWVzKTsKKworCQkJCQkvLyBZb3UgbXVzdCBub3QgZnJlZSBwYWxldHRlIGhlcmUsIGJlY2F1c2UgcG5nX3NldF9QTFRFIG9ubHkgbWFrZXMgYSBsaW5rIHRvCisJCQkJCS8vIHRoZSBwYWxldHRlIHRoYXQgeW91IG1hbGxvY2VkLiAgV2FpdCB1bnRpbCB5b3UgYXJlIGFib3V0IHRvIGRlc3Ryb3kKKwkJCQkJLy8gdGhlIHBuZyBzdHJ1Y3R1cmUuCisKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJY2FzZSBGSUNfUkdCQUxQSEEgOgorCQkJCQloYXNfYWxwaGFfY2hhbm5lbCA9IFRSVUU7CisKKwkJCQkJcG5nX3NldF9JSERSKHBuZ19wdHIsIGluZm9fcHRyLCB3aWR0aCwgaGVpZ2h0LCBiaXRfZGVwdGgsIAorCQkJCQkJUE5HX0NPTE9SX1RZUEVfUkdCQSwgaW50ZXJsYWNlX3R5cGUsIAorCQkJCQkJUE5HX0NPTVBSRVNTSU9OX1RZUEVfQkFTRSwgUE5HX0ZJTFRFUl9UWVBFX0JBU0UpOworCisjaWYgRlJFRUlNQUdFX0NPTE9ST1JERVIgPT0gRlJFRUlNQUdFX0NPTE9ST1JERVJfQkdSCisJCQkJCS8vIGZsaXAgQkdSIHBpeGVscyB0byBSR0IKKwkJCQkJaWYoaW1hZ2VfdHlwZSA9PSBGSVRfQklUTUFQKSB7CisJCQkJCQlwbmdfc2V0X2JncihwbmdfcHRyKTsKKwkJCQkJfQorI2VuZGlmCisJCQkJCWJyZWFrOworCQorCQkJCWNhc2UgRklDX1JHQjoKKwkJCQkJcG5nX3NldF9JSERSKHBuZ19wdHIsIGluZm9fcHRyLCB3aWR0aCwgaGVpZ2h0LCBiaXRfZGVwdGgsIAorCQkJCQkJUE5HX0NPTE9SX1RZUEVfUkdCLCBpbnRlcmxhY2VfdHlwZSwgCisJCQkJCQlQTkdfQ09NUFJFU1NJT05fVFlQRV9CQVNFLCBQTkdfRklMVEVSX1RZUEVfQkFTRSk7CisKKyNpZiBGUkVFSU1BR0VfQ09MT1JPUkRFUiA9PSBGUkVFSU1BR0VfQ09MT1JPUkRFUl9CR1IKKwkJCQkJLy8gZmxpcCBCR1IgcGl4ZWxzIHRvIFJHQgorCQkJCQlpZihpbWFnZV90eXBlID09IEZJVF9CSVRNQVApIHsKKwkJCQkJCXBuZ19zZXRfYmdyKHBuZ19wdHIpOworCQkJCQl9CisjZW5kaWYKKwkJCQkJYnJlYWs7CisJCQkJCQorCQkJCWNhc2UgRklDX0NNWUs6CisJCQkJCWJyZWFrOworCQkJfQorCisJCQkvLyB3cml0ZSBwb3NzaWJsZSBJQ0MgcHJvZmlsZQorCisJCQlGSUlDQ1BST0ZJTEUgKmljY1Byb2ZpbGUgPSBGcmVlSW1hZ2VfR2V0SUNDUHJvZmlsZShkaWIpOworCQkJaWYgKGljY1Byb2ZpbGUtPnNpemUgJiYgaWNjUHJvZmlsZS0+ZGF0YSkgeworCQkJCXBuZ19zZXRfaUNDUChwbmdfcHRyLCBpbmZvX3B0ciwgIkVtYmVkZGVkIFByb2ZpbGUiLCAwLCAocG5nX2NvbnN0X2J5dGVwKWljY1Byb2ZpbGUtPmRhdGEsIGljY1Byb2ZpbGUtPnNpemUpOworCQkJfQorCisJCQkvLyB3cml0ZSBtZXRhZGF0YQorCisJCQlXcml0ZU1ldGFkYXRhKHBuZ19wdHIsIGluZm9fcHRyLCBkaWIpOworCisJCQkvLyBPcHRpb25hbCBnYW1tYSBjaHVuayBpcyBzdHJvbmdseSBzdWdnZXN0ZWQgaWYgeW91IGhhdmUgYW55IGd1ZXNzCisJCQkvLyBhcyB0byB0aGUgY29ycmVjdCBnYW1tYSBvZiB0aGUgaW1hZ2UuCisJCQkvLyBwbmdfc2V0X2dBTUEocG5nX3B0ciwgaW5mb19wdHIsIGdhbW1hKTsKKworCQkJLy8gc2V0IHRoZSB0cmFuc3BhcmVuY3kgdGFibGUKKworCQkJaWYgKGJJc1RyYW5zcGFyZW50KSB7CisJCQkJcG5nX3NldF90Uk5TKHBuZ19wdHIsIGluZm9fcHRyLCBGcmVlSW1hZ2VfR2V0VHJhbnNwYXJlbmN5VGFibGUoZGliKSwgRnJlZUltYWdlX0dldFRyYW5zcGFyZW5jeUNvdW50KGRpYiksIE5VTEwpOworCQkJfQorCisJCQkvLyBzZXQgdGhlIGJhY2tncm91bmQgY29sb3IKKworCQkJaWYoRnJlZUltYWdlX0hhc0JhY2tncm91bmRDb2xvcihkaWIpKSB7CisJCQkJcG5nX2NvbG9yXzE2IGltYWdlX2JhY2tncm91bmQ7CisJCQkJUkdCUVVBRCByZ2JCa0NvbG9yOworCisJCQkJRnJlZUltYWdlX0dldEJhY2tncm91bmRDb2xvcihkaWIsICZyZ2JCa0NvbG9yKTsKKwkJCQltZW1zZXQoJmltYWdlX2JhY2tncm91bmQsIDAsIHNpemVvZihwbmdfY29sb3JfMTYpKTsKKwkJCQlpbWFnZV9iYWNrZ3JvdW5kLmJsdWUgID0gcmdiQmtDb2xvci5yZ2JCbHVlOworCQkJCWltYWdlX2JhY2tncm91bmQuZ3JlZW4gPSByZ2JCa0NvbG9yLnJnYkdyZWVuOworCQkJCWltYWdlX2JhY2tncm91bmQucmVkICAgPSByZ2JCa0NvbG9yLnJnYlJlZDsKKwkJCQlpbWFnZV9iYWNrZ3JvdW5kLmluZGV4ID0gcmdiQmtDb2xvci5yZ2JSZXNlcnZlZDsKKworCQkJCXBuZ19zZXRfYktHRChwbmdfcHRyLCBpbmZvX3B0ciwgJmltYWdlX2JhY2tncm91bmQpOworCQkJfQorCQkJCisJCQkvLyBXcml0ZSB0aGUgZmlsZSBoZWFkZXIgaW5mb3JtYXRpb24uCisKKwkJCXBuZ193cml0ZV9pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsKKworCQkJLy8gd3JpdGUgb3V0IHRoZSBpbWFnZSBkYXRhCisKKyNpZm5kZWYgRlJFRUlNQUdFX0JJR0VORElBTgorCQkJaWYgKGJpdF9kZXB0aCA9PSAxNikgeworCQkJCS8vIHR1cm4gb24gMTYgYml0IGJ5dGUgc3dhcHBpbmcKKwkJCQlwbmdfc2V0X3N3YXAocG5nX3B0cik7CisJCQl9CisjZW5kaWYKKworCQkJaW50IG51bWJlcl9wYXNzZXMgPSAxOworCQkJaWYgKGJJbnRlcmxhY2VkKSB7CisJCQkJbnVtYmVyX3Bhc3NlcyA9IHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKHBuZ19wdHIpOworCQkJfQorCisJCQlpZiAoKHBpeGVsX2RlcHRoID09IDMyKSAmJiAoIWhhc19hbHBoYV9jaGFubmVsKSkgeworCQkJCUJZVEUgKmJ1ZmZlciA9IChCWVRFICopbWFsbG9jKHdpZHRoICogMyk7CisKKwkJCQkvLyB0cmFuc3BhcmVudCBjb252ZXJzaW9uIHRvIDI0LWJpdAorCQkJCS8vIHRoZSBudW1iZXIgb2YgcGFzc2VzIGlzIGVpdGhlciAxIGZvciBub24taW50ZXJsYWNlZCBpbWFnZXMsIG9yIDcgZm9yIGludGVybGFjZWQgaW1hZ2VzCisJCQkJZm9yIChpbnQgcGFzcyA9IDA7IHBhc3MgPCBudW1iZXJfcGFzc2VzOyBwYXNzKyspIHsKKwkJCQkJZm9yIChwbmdfdWludF8zMiBrID0gMDsgayA8IGhlaWdodDsgaysrKSB7CisJCQkJCQlGcmVlSW1hZ2VfQ29udmVydExpbmUzMlRvMjQoYnVmZmVyLCBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCBoZWlnaHQgLSBrIC0gMSksIHdpZHRoKTsKKwkJCQkJCXBuZ193cml0ZV9yb3cocG5nX3B0ciwgYnVmZmVyKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlmcmVlKGJ1ZmZlcik7CisJCQl9IGVsc2UgeworCQkJCS8vIHRoZSBudW1iZXIgb2YgcGFzc2VzIGlzIGVpdGhlciAxIGZvciBub24taW50ZXJsYWNlZCBpbWFnZXMsIG9yIDcgZm9yIGludGVybGFjZWQgaW1hZ2VzCisJCQkJZm9yIChpbnQgcGFzcyA9IDA7IHBhc3MgPCBudW1iZXJfcGFzc2VzOyBwYXNzKyspIHsKKwkJCQkJZm9yIChwbmdfdWludF8zMiBrID0gMDsgayA8IGhlaWdodDsgaysrKSB7CisJCQkJCQlwbmdfd3JpdGVfcm93KHBuZ19wdHIsIEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIGhlaWdodCAtIGsgLSAxKSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCS8vIEl0IGlzIFJFUVVJUkVEIHRvIGNhbGwgdGhpcyB0byBmaW5pc2ggd3JpdGluZyB0aGUgcmVzdCBvZiB0aGUgZmlsZQorCQkJLy8gQnVnIHdpdGggcG5nX2ZsdXNoCisKKwkJCXBuZ193cml0ZV9lbmQocG5nX3B0ciwgaW5mb19wdHIpOworCisJCQkvLyBjbGVhbiB1cCBhZnRlciB0aGUgd3JpdGUsIGFuZCBmcmVlIGFueSBtZW1vcnkgYWxsb2NhdGVkCisJCQlpZiAocGFsZXR0ZSkgeworCQkJCXBuZ19mcmVlKHBuZ19wdHIsIHBhbGV0dGUpOworCQkJfQorCisJCQlwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0cik7CisKKwkJCXJldHVybiBUUlVFOworCisJCX0gY2F0Y2ggKGNvbnN0IGNoYXIgKnRleHQpIHsKKwkJCWlmKHBuZ19wdHIpIHsKKwkJCQlwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0cik7CisJCQl9CisJCQlGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2Moc19mb3JtYXRfaWQsIHRleHQpOworCQl9CisJfQorCisJcmV0dXJuIEZBTFNFOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgIEluaXQKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwordm9pZCBETExfQ0FMTENPTlYKK0luaXRQTkcoUGx1Z2luICpwbHVnaW4sIGludCBmb3JtYXRfaWQpIHsKKwlzX2Zvcm1hdF9pZCA9IGZvcm1hdF9pZDsKKworCXBsdWdpbi0+Zm9ybWF0X3Byb2MgPSBGb3JtYXQ7CisJcGx1Z2luLT5kZXNjcmlwdGlvbl9wcm9jID0gRGVzY3JpcHRpb247CisJcGx1Z2luLT5leHRlbnNpb25fcHJvYyA9IEV4dGVuc2lvbjsKKwlwbHVnaW4tPnJlZ2V4cHJfcHJvYyA9IFJlZ0V4cHI7CisJcGx1Z2luLT5vcGVuX3Byb2MgPSBOVUxMOworCXBsdWdpbi0+Y2xvc2VfcHJvYyA9IE5VTEw7CisJcGx1Z2luLT5wYWdlY291bnRfcHJvYyA9IE5VTEw7CisJcGx1Z2luLT5wYWdlY2FwYWJpbGl0eV9wcm9jID0gTlVMTDsKKwlwbHVnaW4tPmxvYWRfcHJvYyA9IExvYWQ7CisJcGx1Z2luLT5zYXZlX3Byb2MgPSBTYXZlOworCXBsdWdpbi0+dmFsaWRhdGVfcHJvYyA9IFZhbGlkYXRlOworCXBsdWdpbi0+bWltZV9wcm9jID0gTWltZVR5cGU7CisJcGx1Z2luLT5zdXBwb3J0c19leHBvcnRfYnBwX3Byb2MgPSBTdXBwb3J0c0V4cG9ydERlcHRoOworCXBsdWdpbi0+c3VwcG9ydHNfZXhwb3J0X3R5cGVfcHJvYyA9IFN1cHBvcnRzRXhwb3J0VHlwZTsKKwlwbHVnaW4tPnN1cHBvcnRzX2ljY19wcm9maWxlc19wcm9jID0gU3VwcG9ydHNJQ0NQcm9maWxlczsKKwlwbHVnaW4tPnN1cHBvcnRzX25vX3BpeGVsc19wcm9jID0gU3VwcG9ydHNOb1BpeGVsczsKK30KZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvUGx1Z2luUE5NLmNwcCBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvUGx1Z2luUE5NLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjRkMGRlCi0tLSAvZGV2L251bGwKKysrIGIvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9QbHVnaW5QTk0uY3BwCkBAIC0wLDAgKzEsODM4IEBACisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBQTk0gKFBQTSwgUEdNLCBQQk0pIExvYWRlciBhbmQgV3JpdGVyCisvLworLy8gRGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBieQorLy8gLSBGbG9yaXMgdmFuIGRlbiBCZXJnIChmbHZkYmVyZ0B3eHMubmwpCisvLyAtIEhlcnbpIERyb2xvbiAoZHJvbG9uQGluZm9uaWUuZnIpCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRnJlZUltYWdlIDMKKy8vCisvLyBDT1ZFUkVEIENPREUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkKKy8vIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTCisvLyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy8vIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVECisvLyBDT0RFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UCisvLyBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWQorLy8gU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTAorLy8gUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUgorLy8gVEhJUyBESVNDTEFJTUVSLgorLy8KKy8vIFVzZSBhdCB5b3VyIG93biByaXNrIQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaW5jbHVkZSAiRnJlZUltYWdlLmgiCisjaW5jbHVkZSAiVXRpbGl0aWVzLmgiCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEludGVybmFsIGZ1bmN0aW9ucworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvKioKK0dldCBhbiBpbnRlZ2VyIHZhbHVlIGZyb20gdGhlIGFjdHVhbCBwb3NpdGlvbiBwb2ludGVkIGJ5IGhhbmRsZQorKi8KK3N0YXRpYyBpbnQKK0dldEludChGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUpIHsKKyAgICBjaGFyIGMgPSAwOworCUJPT0wgYkZpcnN0Q2hhcjsKKworICAgIC8vIHNraXAgZm9yd2FyZCB0byBzdGFydCBvZiBuZXh0IG51bWJlcgorCisJaWYoIWlvLT5yZWFkX3Byb2MoJmMsIDEsIDEsIGhhbmRsZSkpIHsKKwkJdGhyb3cgRklfTVNHX0VSUk9SX1BBUlNJTkc7CisJfQorCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgLy8gZWF0IGNvbW1lbnRzCisKKyAgICAgICAgaWYgKGMgPT0gJyMnKSB7CisJCQkvLyBpZiB3ZSdyZSBhdCBhIGNvbW1lbnQsIHJlYWQgdG8gZW5kIG9mIGxpbmUKKworICAgICAgICAgICAgYkZpcnN0Q2hhciA9IFRSVUU7CisKKyAgICAgICAgICAgIHdoaWxlICgxKSB7CisJCQkJaWYoIWlvLT5yZWFkX3Byb2MoJmMsIDEsIDEsIGhhbmRsZSkpIHsKKwkJCQkJdGhyb3cgRklfTVNHX0VSUk9SX1BBUlNJTkc7CisJCQkJfQorCisJCQkJaWYgKGJGaXJzdENoYXIgJiYgYyA9PSAnICcpIHsKKwkJCQkJLy8gbG9vcCBvZmYgMSBzcCBhZnRlciAjCisJCQkJCWJGaXJzdENoYXIgPSBGQUxTRTsKKwkJCQl9IGVsc2UgaWYgKGMgPT0gJ1xuJykgeworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKworICAgICAgICBpZiAoYyA+PSAnMCcgJiYgYyA8PSc5JykgeworCQkJLy8gd2UndmUgZm91bmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yCisgICAgICAgICAgICBicmVhazsKKwkJfQorCisJCWlmKCFpby0+cmVhZF9wcm9jKCZjLCAxLCAxLCBoYW5kbGUpKSB7CisJCQl0aHJvdyBGSV9NU0dfRVJST1JfUEFSU0lORzsKKwkJfQorICAgIH0KKworICAgIC8vIHdlJ3JlIGF0IHRoZSBzdGFydCBvZiBhIG51bWJlciwgY29udGludWUgdW50aWwgd2UgaGl0IGEgbm9uLW51bWJlcgorCisgICAgaW50IGkgPSAwOworCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaSA9IChpICogMTApICsgKGMgLSAnMCcpOworCisJCWlmKCFpby0+cmVhZF9wcm9jKCZjLCAxLCAxLCBoYW5kbGUpKSB7CisJCQl0aHJvdyBGSV9NU0dfRVJST1JfUEFSU0lORzsKKwkJfQorCisJCWlmIChjIDwgJzAnIHx8IGMgPiAnOScpIHsKKwkJCWJyZWFrOworCQl9CisgICAgfQorCisgICAgcmV0dXJuIGk7Cit9CisKKy8qKgorUmVhZCBhIFdPUkQgdmFsdWUgdGFraW5nIGludG8gYWNjb3VudCB0aGUgZW5kaWFuZXNzIGlzc3VlCisqLworc3RhdGljIGlubGluZSBXT1JEIAorUmVhZFdvcmQoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlKSB7CisJV09SRCBsZXZlbCA9IDA7CisJaW8tPnJlYWRfcHJvYygmbGV2ZWwsIDIsIDEsIGhhbmRsZSk7IAorI2lmbmRlZiBGUkVFSU1BR0VfQklHRU5ESUFOCisJU3dhcFNob3J0KCZsZXZlbCk7CS8vIFBOTSB1c2VzIHRoZSBiaWcgZW5kaWFuIGNvbnZlbnRpb24KKyNlbmRpZgorCXJldHVybiBsZXZlbDsKK30KKworLyoqCitXcml0ZSBhIFdPUkQgdmFsdWUgdGFraW5nIGludG8gYWNjb3VudCB0aGUgZW5kaWFuZXNzIGlzc3VlCisqLworc3RhdGljIGlubGluZSB2b2lkIAorV3JpdGVXb3JkKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSwgY29uc3QgV09SRCB2YWx1ZSkgeworCVdPUkQgbGV2ZWwgPSB2YWx1ZTsKKyNpZm5kZWYgRlJFRUlNQUdFX0JJR0VORElBTgorCVN3YXBTaG9ydCgmbGV2ZWwpOwkvLyBQTk0gdXNlcyB0aGUgYmlnIGVuZGlhbiBjb252ZW50aW9uCisjZW5kaWYKKwlpby0+d3JpdGVfcHJvYygmbGV2ZWwsIDIsIDEsIGhhbmRsZSk7Cit9CisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gUGx1Z2luIEludGVyZmFjZQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitzdGF0aWMgaW50IHNfZm9ybWF0X2lkOworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBQbHVnaW4gSW1wbGVtZW50YXRpb24KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKK0Zvcm1hdCgpIHsKKwlyZXR1cm4gIlBOTSI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCitEZXNjcmlwdGlvbigpIHsKKwlyZXR1cm4gIlBvcnRhYmxlIE5ldHdvcmsgTWVkaWEiOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgorRXh0ZW5zaW9uKCkgeworCXJldHVybiAicGJtLHBnbSxwcG0iOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgorUmVnRXhwcigpIHsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKK01pbWVUeXBlKCkgeworCXJldHVybiAiaW1hZ2UvZnJlZWltYWdlLXBubSI7Cit9CisKK3N0YXRpYyBCT09MIERMTF9DQUxMQ09OVgorVmFsaWRhdGUoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlKSB7CisJQllURSBwYm1faWQxW10gPSB7IDB4NTAsIDB4MzEgfTsKKwlCWVRFIHBibV9pZDJbXSA9IHsgMHg1MCwgMHgzNCB9OworCUJZVEUgcGdtX2lkMVtdID0geyAweDUwLCAweDMyIH07CisJQllURSBwZ21faWQyW10gPSB7IDB4NTAsIDB4MzUgfTsKKwlCWVRFIHBwbV9pZDFbXSA9IHsgMHg1MCwgMHgzMyB9OworCUJZVEUgcHBtX2lkMltdID0geyAweDUwLCAweDM2IH07CisJQllURSBzaWduYXR1cmVbMl0gPSB7IDAsIDAgfTsKKworCWlvLT5yZWFkX3Byb2Moc2lnbmF0dXJlLCAxLCBzaXplb2YocGJtX2lkMSksIGhhbmRsZSk7CisKKwlpZiAobWVtY21wKHBibV9pZDEsIHNpZ25hdHVyZSwgc2l6ZW9mKHBibV9pZDEpKSA9PSAwKQorCQlyZXR1cm4gVFJVRTsKKworCWlmIChtZW1jbXAocGJtX2lkMiwgc2lnbmF0dXJlLCBzaXplb2YocGJtX2lkMikpID09IDApCisJCXJldHVybiBUUlVFOworCisJaWYgKG1lbWNtcChwZ21faWQxLCBzaWduYXR1cmUsIHNpemVvZihwZ21faWQxKSkgPT0gMCkKKwkJcmV0dXJuIFRSVUU7CisKKwlpZiAobWVtY21wKHBnbV9pZDIsIHNpZ25hdHVyZSwgc2l6ZW9mKHBnbV9pZDIpKSA9PSAwKQorCQlyZXR1cm4gVFJVRTsKKworCWlmIChtZW1jbXAocHBtX2lkMSwgc2lnbmF0dXJlLCBzaXplb2YocHBtX2lkMSkpID09IDApCisJCXJldHVybiBUUlVFOworCisJaWYgKG1lbWNtcChwcG1faWQyLCBzaWduYXR1cmUsIHNpemVvZihwcG1faWQyKSkgPT0gMCkKKwkJcmV0dXJuIFRSVUU7CisKKwlyZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBCT09MIERMTF9DQUxMQ09OVgorU3VwcG9ydHNFeHBvcnREZXB0aChpbnQgZGVwdGgpIHsKKwlyZXR1cm4gKAorCQkJKGRlcHRoID09IDEpIHx8CisJCQkoZGVwdGggPT0gOCkgfHwKKwkJCShkZXB0aCA9PSAyNCkKKwkJKTsKK30KKworc3RhdGljIEJPT0wgRExMX0NBTExDT05WIAorU3VwcG9ydHNFeHBvcnRUeXBlKEZSRUVfSU1BR0VfVFlQRSB0eXBlKSB7CisJcmV0dXJuICgKKwkJKHR5cGUgPT0gRklUX0JJVE1BUCkgIHx8CisJCSh0eXBlID09IEZJVF9VSU5UMTYpICB8fAorCQkodHlwZSA9PSBGSVRfUkdCMTYpCisJKTsKK30KKworc3RhdGljIEJPT0wgRExMX0NBTExDT05WCitTdXBwb3J0c05vUGl4ZWxzKCkgeworCXJldHVybiBUUlVFOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBGSUJJVE1BUCAqIERMTF9DQUxMQ09OVgorTG9hZChGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIGludCBwYWdlLCBpbnQgZmxhZ3MsIHZvaWQgKmRhdGEpIHsKKwljaGFyIGlkX29uZSA9IDAsIGlkX3R3byA9IDA7CisJaW50IHgsIHk7CisJRklCSVRNQVAgKmRpYiA9IE5VTEw7CisJUkdCUVVBRCAqcGFsOwkvLyBwb2ludGVyIHRvIGRpYiBwYWxldHRlCisJaW50IGk7CisKKwlpZiAoIWhhbmRsZSkgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlCT09MIGhlYWRlcl9vbmx5ID0gKGZsYWdzICYgRklGX0xPQURfTk9QSVhFTFMpID09IEZJRl9MT0FEX05PUElYRUxTOworCisJdHJ5IHsKKwkJRlJFRV9JTUFHRV9UWVBFIGltYWdlX3R5cGUgPSBGSVRfQklUTUFQOwkvLyBzdGFuZGFyZCBpbWFnZTogMS0sIDgtLCAyNC1iaXQKKworCQkvLyBSZWFkIHRoZSBmaXJzdCB0d28gYnl0ZXMgb2YgdGhlIGZpbGUgdG8gZGV0ZXJtaW5lIHRoZSBmaWxlIGZvcm1hdAorCQkvLyAiUDEiID0gYXNjaWkgYml0bWFwLCAiUDIiID0gYXNjaWkgZ3JleW1hcCwgIlAzIiA9IGFzY2lpIHBpeG1hcCwKKwkJLy8gIlA0IiA9IHJhdyBiaXRtYXAsICJQNSIgPSByYXcgZ3JleW1hcCwgIlA2IiA9IHJhdyBwaXhtYXAKKworCQlpby0+cmVhZF9wcm9jKCZpZF9vbmUsIDEsIDEsIGhhbmRsZSk7CisJCWlvLT5yZWFkX3Byb2MoJmlkX3R3bywgMSwgMSwgaGFuZGxlKTsKKworCQlpZiAoKGlkX29uZSAhPSAnUCcpIHx8IChpZF90d28gPCAnMScpIHx8IChpZF90d28gPiAnNicpKSB7CQkJCisJCQkvLyBzaWduYXR1cmUgZXJyb3IKKwkJCXRocm93IEZJX01TR19FUlJPUl9NQUdJQ19OVU1CRVI7CisJCX0KKworCQkvLyBSZWFkIHRoZSBoZWFkZXIgaW5mb3JtYXRpb246IHdpZHRoLCBoZWlnaHQgYW5kIHRoZSAnbWF4JyB2YWx1ZSBpZiBhbnkKKworCQlpbnQgd2lkdGggID0gR2V0SW50KGlvLCBoYW5kbGUpOworCQlpbnQgaGVpZ2h0ID0gR2V0SW50KGlvLCBoYW5kbGUpOworCQlpbnQgbWF4dmFsID0gMTsKKworCQlpZigoaWRfdHdvID09ICcyJykgfHwgKGlkX3R3byA9PSAnNScpIHx8IChpZF90d28gPT0gJzMnKSB8fCAoaWRfdHdvID09ICc2JykpIHsKKwkJCW1heHZhbCA9IEdldEludChpbywgaGFuZGxlKTsKKwkJCWlmKChtYXh2YWwgPD0gMCkgfHwgKG1heHZhbCA+IDY1NTM1KSkgeworCQkJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhzX2Zvcm1hdF9pZCwgIkludmFsaWQgbWF4IHZhbHVlIDogJWQiLCBtYXh2YWwpOworCQkJCXRocm93IChjb25zdCBjaGFyKilOVUxMOworCQkJfQorCQl9CisKKwkJLy8gQ3JlYXRlIGEgbmV3IERJQgorCisJCXN3aXRjaCAoaWRfdHdvKSB7CisJCQljYXNlICcxJzoKKwkJCWNhc2UgJzQnOgorCQkJCS8vIDEtYml0CisJCQkJZGliID0gRnJlZUltYWdlX0FsbG9jYXRlSGVhZGVyKGhlYWRlcl9vbmx5LCB3aWR0aCwgaGVpZ2h0LCAxKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSAnMic6CisJCQljYXNlICc1JzoKKwkJCQlpZihtYXh2YWwgPiAyNTUpIHsKKwkJCQkJLy8gMTYtYml0IGdyZXlzY2FsZQorCQkJCQlpbWFnZV90eXBlID0gRklUX1VJTlQxNjsKKwkJCQkJZGliID0gRnJlZUltYWdlX0FsbG9jYXRlSGVhZGVyVChoZWFkZXJfb25seSwgaW1hZ2VfdHlwZSwgd2lkdGgsIGhlaWdodCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJLy8gOC1iaXQgZ3JleXNjYWxlCisJCQkJCWRpYiA9IEZyZWVJbWFnZV9BbGxvY2F0ZUhlYWRlcihoZWFkZXJfb25seSwgd2lkdGgsIGhlaWdodCwgOCk7CisJCQkJfQorCQkJCWJyZWFrOworCisJCQljYXNlICczJzoKKwkJCWNhc2UgJzYnOgorCQkJCWlmKG1heHZhbCA+IDI1NSkgeworCQkJCQkvLyA0OC1iaXQgUkdCCisJCQkJCWltYWdlX3R5cGUgPSBGSVRfUkdCMTY7CisJCQkJCWRpYiA9IEZyZWVJbWFnZV9BbGxvY2F0ZUhlYWRlclQoaGVhZGVyX29ubHksIGltYWdlX3R5cGUsIHdpZHRoLCBoZWlnaHQpOworCQkJCX0gZWxzZSB7CisJCQkJCS8vIDI0LWJpdCBSR0IKKwkJCQkJZGliID0gRnJlZUltYWdlX0FsbG9jYXRlSGVhZGVyKGhlYWRlcl9vbmx5LCB3aWR0aCwgaGVpZ2h0LCAyNCwgRklfUkdCQV9SRURfTUFTSywgRklfUkdCQV9HUkVFTl9NQVNLLCBGSV9SR0JBX0JMVUVfTUFTSyk7CisJCQkJfQorCQkJCWJyZWFrOworCQl9CisKKwkJaWYgKGRpYiA9PSBOVUxMKSB7CisJCQl0aHJvdyBGSV9NU0dfRVJST1JfRElCX01FTU9SWTsKKwkJfQorCisJCS8vIEJ1aWxkIGEgZ3JleXNjYWxlIHBhbGV0dGUgaWYgbmVlZGVkCisKKwkJaWYoaW1hZ2VfdHlwZSA9PSBGSVRfQklUTUFQKSB7CisJCQlzd2l0Y2goaWRfdHdvKSAgeworCQkJCWNhc2UgJzEnOgorCQkJCWNhc2UgJzQnOgorCQkJCQlwYWwgPSBGcmVlSW1hZ2VfR2V0UGFsZXR0ZShkaWIpOworCQkJCQlwYWxbMF0ucmdiUmVkID0gcGFsWzBdLnJnYkdyZWVuID0gcGFsWzBdLnJnYkJsdWUgPSAwOworCQkJCQlwYWxbMV0ucmdiUmVkID0gcGFsWzFdLnJnYkdyZWVuID0gcGFsWzFdLnJnYkJsdWUgPSAyNTU7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSAnMic6CisJCQkJY2FzZSAnNSc6CisJCQkJCXBhbCA9IEZyZWVJbWFnZV9HZXRQYWxldHRlKGRpYik7CisJCQkJCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQkJCQkJcGFsW2ldLnJnYlJlZAk9CisJCQkJCQlwYWxbaV0ucmdiR3JlZW4gPQorCQkJCQkJcGFsW2ldLnJnYkJsdWUJPSAoQllURSlpOworCQkJCQl9CisJCQkJCWJyZWFrOworCisJCQkJZGVmYXVsdDoKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZihoZWFkZXJfb25seSkgeworCQkJLy8gaGVhZGVyIG9ubHkgbW9kZQorCQkJcmV0dXJuIGRpYjsKKwkJfQorCisJCS8vIFJlYWQgdGhlIGltYWdlLi4uCisKKwkJc3dpdGNoKGlkX3R3bykgIHsKKwkJCWNhc2UgJzEnOgorCQkJY2FzZSAnNCc6CisJCQkJLy8gd3JpdGUgdGhlIGJpdG1hcCBkYXRhCisKKwkJCQlpZiAoaWRfdHdvID09ICcxJykgewkvLyBBU0NJSSBiaXRtYXAKKwkJCQkJZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CQkKKwkJCQkJCUJZVEUgKmJpdHMgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCBoZWlnaHQgLSAxIC0geSk7CisKKwkJCQkJCWZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisJCQkJCQkJaWYgKEdldEludChpbywgaGFuZGxlKSA9PSAwKQorCQkJCQkJCQliaXRzW3ggPj4gM10gfD0gKDB4ODAgPj4gKHggJiAweDcpKTsKKwkJCQkJCQllbHNlCisJCQkJCQkJCWJpdHNbeCA+PiAzXSAmPSAoMHhGRjdGID4+ICh4ICYgMHg3KSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9ICBlbHNlIHsJCS8vIFJhdyBiaXRtYXAKKwkJCQkJaW50IGxpbmUgPSBDYWxjdWxhdGVMaW5lKHdpZHRoLCAxKTsKKworCQkJCQlmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsJCisJCQkJCQlCWVRFICpiaXRzID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgaGVpZ2h0IC0gMSAtIHkpOworCisJCQkJCQlmb3IgKHggPSAwOyB4IDwgbGluZTsgeCsrKSB7CisJCQkJCQkJaW8tPnJlYWRfcHJvYygmYml0c1t4XSwgMSwgMSwgaGFuZGxlKTsKKworCQkJCQkJCWJpdHNbeF0gPSB+Yml0c1t4XTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKworCQkJCXJldHVybiBkaWI7CisKKwkJCWNhc2UgJzInOgorCQkJY2FzZSAnNSc6CisJCQkJaWYoaW1hZ2VfdHlwZSA9PSBGSVRfQklUTUFQKSB7CisJCQkJCS8vIHdyaXRlIHRoZSBiaXRtYXAgZGF0YQorCisJCQkJCWlmKGlkX3R3byA9PSAnMicpIHsJCS8vIEFTQ0lJIGdyZXltYXAKKwkJCQkJCWludCBsZXZlbCA9IDA7CisKKwkJCQkJCWZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgewkKKwkJCQkJCQlCWVRFICpiaXRzID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgaGVpZ2h0IC0gMSAtIHkpOworCisJCQkJCQkJZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQkJCQkJbGV2ZWwgPSBHZXRJbnQoaW8sIGhhbmRsZSk7CisJCQkJCQkJCWJpdHNbeF0gPSAoQllURSkoKDI1NSAqIGxldmVsKSAvIG1heHZhbCk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9IGVsc2UgewkJLy8gUmF3IGdyZXltYXAKKwkJCQkJCUJZVEUgbGV2ZWwgPSAwOworCisJCQkJCQlmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsJCQorCQkJCQkJCUJZVEUgKmJpdHMgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCBoZWlnaHQgLSAxIC0geSk7CisKKwkJCQkJCQlmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworCQkJCQkJCQlpby0+cmVhZF9wcm9jKCZsZXZlbCwgMSwgMSwgaGFuZGxlKTsKKwkJCQkJCQkJYml0c1t4XSA9IChCWVRFKSgoMjU1ICogKGludClsZXZlbCkgLyBtYXh2YWwpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmKGltYWdlX3R5cGUgPT0gRklUX1VJTlQxNikgeworCQkJCQkvLyB3cml0ZSB0aGUgYml0bWFwIGRhdGEKKworCQkJCQlpZihpZF90d28gPT0gJzInKSB7CQkvLyBBU0NJSSBncmV5bWFwCisJCQkJCQlpbnQgbGV2ZWwgPSAwOworCisJCQkJCQlmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsJCisJCQkJCQkJV09SRCAqYml0cyA9IChXT1JEKilGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCBoZWlnaHQgLSAxIC0geSk7CisKKwkJCQkJCQlmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworCQkJCQkJCQlsZXZlbCA9IEdldEludChpbywgaGFuZGxlKTsKKwkJCQkJCQkJYml0c1t4XSA9IChXT1JEKSgoNjU1MzUgKiAoZG91YmxlKWxldmVsKSAvIG1heHZhbCk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9IGVsc2UgewkJLy8gUmF3IGdyZXltYXAKKwkJCQkJCVdPUkQgbGV2ZWwgPSAwOworCisJCQkJCQlmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsJCQorCQkJCQkJCVdPUkQgKmJpdHMgPSAoV09SRCopRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgaGVpZ2h0IC0gMSAtIHkpOworCisJCQkJCQkJZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQkJCQkJbGV2ZWwgPSBSZWFkV29yZChpbywgaGFuZGxlKTsKKwkJCQkJCQkJYml0c1t4XSA9IChXT1JEKSgoNjU1MzUgKiAoZG91YmxlKWxldmVsKSAvIG1heHZhbCk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCisJCQkJcmV0dXJuIGRpYjsKKworCQkJY2FzZSAnMyc6CisJCQljYXNlICc2JzoKKwkJCQlpZihpbWFnZV90eXBlID09IEZJVF9CSVRNQVApIHsKKwkJCQkJLy8gd3JpdGUgdGhlIGJpdG1hcCBkYXRhCisKKwkJCQkJaWYgKGlkX3R3byA9PSAnMycpIHsJCS8vIEFTQ0lJIHBpeG1hcAorCQkJCQkJaW50IGxldmVsID0gMDsKKworCQkJCQkJZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CQorCQkJCQkJCUJZVEUgKmJpdHMgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCBoZWlnaHQgLSAxIC0geSk7CisKKwkJCQkJCQlmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworCQkJCQkJCQlsZXZlbCA9IEdldEludChpbywgaGFuZGxlKTsKKwkJCQkJCQkJYml0c1tGSV9SR0JBX1JFRF0gPSAoQllURSkoKDI1NSAqIGxldmVsKSAvIG1heHZhbCk7CQkvLyBSCisJCQkJCQkJCWxldmVsID0gR2V0SW50KGlvLCBoYW5kbGUpOworCQkJCQkJCQliaXRzW0ZJX1JHQkFfR1JFRU5dID0gKEJZVEUpKCgyNTUgKiBsZXZlbCkgLyBtYXh2YWwpOwkvLyBHCisJCQkJCQkJCWxldmVsID0gR2V0SW50KGlvLCBoYW5kbGUpOworCQkJCQkJCQliaXRzW0ZJX1JHQkFfQkxVRV0gPSAoQllURSkoKDI1NSAqIGxldmVsKSAvIG1heHZhbCk7CS8vIEIKKworCQkJCQkJCQliaXRzICs9IDM7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9ICBlbHNlIHsJCQkvLyBSYXcgcGl4bWFwCisJCQkJCQlCWVRFIGxldmVsID0gMDsKKworCQkJCQkJZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CQorCQkJCQkJCUJZVEUgKmJpdHMgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCBoZWlnaHQgLSAxIC0geSk7CisKKwkJCQkJCQlmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworCQkJCQkJCQlpby0+cmVhZF9wcm9jKCZsZXZlbCwgMSwgMSwgaGFuZGxlKTsgCisJCQkJCQkJCWJpdHNbRklfUkdCQV9SRURdID0gKEJZVEUpKCgyNTUgKiAoaW50KWxldmVsKSAvIG1heHZhbCk7CS8vIFIKKworCQkJCQkJCQlpby0+cmVhZF9wcm9jKCZsZXZlbCwgMSwgMSwgaGFuZGxlKTsKKwkJCQkJCQkJYml0c1tGSV9SR0JBX0dSRUVOXSA9IChCWVRFKSgoMjU1ICogKGludClsZXZlbCkgLyBtYXh2YWwpOwkvLyBHCisKKwkJCQkJCQkJaW8tPnJlYWRfcHJvYygmbGV2ZWwsIDEsIDEsIGhhbmRsZSk7CisJCQkJCQkJCWJpdHNbRklfUkdCQV9CTFVFXSA9IChCWVRFKSgoMjU1ICogKGludClsZXZlbCkgLyBtYXh2YWwpOwkvLyBCCisKKwkJCQkJCQkJYml0cyArPSAzOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmKGltYWdlX3R5cGUgPT0gRklUX1JHQjE2KSB7CisJCQkJCS8vIHdyaXRlIHRoZSBiaXRtYXAgZGF0YQorCisJCQkJCWlmIChpZF90d28gPT0gJzMnKSB7CQkvLyBBU0NJSSBwaXhtYXAKKwkJCQkJCWludCBsZXZlbCA9IDA7CisKKwkJCQkJCWZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgewkKKwkJCQkJCQlGSVJHQjE2ICpiaXRzID0gKEZJUkdCMTYqKUZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIGhlaWdodCAtIDEgLSB5KTsKKworCQkJCQkJCWZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisJCQkJCQkJCWxldmVsID0gR2V0SW50KGlvLCBoYW5kbGUpOworCQkJCQkJCQliaXRzW3hdLnJlZCA9IChXT1JEKSgoNjU1MzUgKiAoZG91YmxlKWxldmVsKSAvIG1heHZhbCk7CQkvLyBSCisJCQkJCQkJCWxldmVsID0gR2V0SW50KGlvLCBoYW5kbGUpOworCQkJCQkJCQliaXRzW3hdLmdyZWVuID0gKFdPUkQpKCg2NTUzNSAqIChkb3VibGUpbGV2ZWwpIC8gbWF4dmFsKTsJLy8gRworCQkJCQkJCQlsZXZlbCA9IEdldEludChpbywgaGFuZGxlKTsKKwkJCQkJCQkJYml0c1t4XS5ibHVlID0gKFdPUkQpKCg2NTUzNSAqIChkb3VibGUpbGV2ZWwpIC8gbWF4dmFsKTsJLy8gQgorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfSAgZWxzZSB7CQkJLy8gUmF3IHBpeG1hcAorCQkJCQkJV09SRCBsZXZlbCA9IDA7CisKKwkJCQkJCWZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgewkKKwkJCQkJCQlGSVJHQjE2ICpiaXRzID0gKEZJUkdCMTYqKUZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIGhlaWdodCAtIDEgLSB5KTsKKworCQkJCQkJCWZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisJCQkJCQkJCWxldmVsID0gUmVhZFdvcmQoaW8sIGhhbmRsZSk7CisJCQkJCQkJCWJpdHNbeF0ucmVkID0gKFdPUkQpKCg2NTUzNSAqIChkb3VibGUpbGV2ZWwpIC8gbWF4dmFsKTsJCS8vIFIKKwkJCQkJCQkJbGV2ZWwgPSBSZWFkV29yZChpbywgaGFuZGxlKTsKKwkJCQkJCQkJYml0c1t4XS5ncmVlbiA9IChXT1JEKSgoNjU1MzUgKiAoZG91YmxlKWxldmVsKSAvIG1heHZhbCk7CS8vIEcKKwkJCQkJCQkJbGV2ZWwgPSBSZWFkV29yZChpbywgaGFuZGxlKTsKKwkJCQkJCQkJYml0c1t4XS5ibHVlID0gKFdPUkQpKCg2NTUzNSAqIChkb3VibGUpbGV2ZWwpIC8gbWF4dmFsKTsJLy8gQgorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKworCQkJCXJldHVybiBkaWI7CisJCX0KKworCX0gY2F0Y2ggKGNvbnN0IGNoYXIgKnRleHQpICB7CisJCWlmKGRpYikgRnJlZUltYWdlX1VubG9hZChkaWIpOworCisJCWlmKE5VTEwgIT0gdGV4dCkgeworCQkJc3dpdGNoKGlkX3R3bykgIHsKKwkJCQljYXNlICcxJzoKKwkJCQljYXNlICc0JzoKKwkJCQkJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKHNfZm9ybWF0X2lkLCB0ZXh0KTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlICcyJzoKKwkJCQljYXNlICc1JzoKKwkJCQkJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKHNfZm9ybWF0X2lkLCB0ZXh0KTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlICczJzoKKwkJCQljYXNlICc2JzoKKwkJCQkJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKHNfZm9ybWF0X2lkLCB0ZXh0KTsKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJCQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYKK1NhdmUoRnJlZUltYWdlSU8gKmlvLCBGSUJJVE1BUCAqZGliLCBmaV9oYW5kbGUgaGFuZGxlLCBpbnQgcGFnZSwgaW50IGZsYWdzLCB2b2lkICpkYXRhKSB7CisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vICAgUE5NIFNhdmluZworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLworCS8vIE91dHB1dCBmb3JtYXQgOgorCS8vCisJLy8gQml0IGRlcHRoCQlmbGFncwkJCWZpbGUgZm9ybWF0CisJLy8gLS0tLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0KKwkvLyAxLWJpdCAvIHBpeGVsCVBOTV9TQVZFX0FTQ0lJCVBCTSAoUDEpCisJLy8gMS1iaXQgLyBwaXhlbAlQTk1fU0FWRV9SQVcJUEJNIChQNCkKKwkvLyA4LWJpdCAvIHBpeGVsCVBOTV9TQVZFX0FTQ0lJCVBHTSAoUDIpCisJLy8gOC1iaXQgLyBwaXhlbAlQTk1fU0FWRV9SQVcJUEdNIChQNSkKKwkvLyAyNC1iaXQgLyBwaXhlbAlQTk1fU0FWRV9BU0NJSQlQUE0gKFAzKQorCS8vIDI0LWJpdCAvIHBpeGVsCVBOTV9TQVZFX1JBVwlQUE0gKFA2KQorCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCWludCB4LCB5OworCisJY2hhciBidWZmZXJbMjU2XTsJLy8gdGVtcG9yYXJ5IGJ1ZmZlciB3aG9zZSBzaXplIHNob3VsZCBiZSBlbm91Z2ggZm9yIHdoYXQgd2UgbmVlZAorCisJaWYoIWRpYiB8fCAhaGFuZGxlKSByZXR1cm4gRkFMU0U7CisJCisJRlJFRV9JTUFHRV9UWVBFIGltYWdlX3R5cGUgPSBGcmVlSW1hZ2VfR2V0SW1hZ2VUeXBlKGRpYik7CisKKwlpbnQgYnBwCQk9IEZyZWVJbWFnZV9HZXRCUFAoZGliKTsKKwlpbnQgd2lkdGgJPSBGcmVlSW1hZ2VfR2V0V2lkdGgoZGliKTsKKwlpbnQgaGVpZ2h0CT0gRnJlZUltYWdlX0dldEhlaWdodChkaWIpOworCisJLy8gRmluZCB0aGUgYXBwcm9wcmlhdGUgbWFnaWMgbnVtYmVyIGZvciB0aGlzIGZpbGUgdHlwZQorCisJaW50IG1hZ2ljID0gMDsKKwlpbnQgbWF4dmFsID0gMjU1OworCisJc3dpdGNoKGltYWdlX3R5cGUpIHsKKwkJY2FzZSBGSVRfQklUTUFQOgorCQkJc3dpdGNoIChicHApIHsKKwkJCQljYXNlIDEgOgorCQkJCQltYWdpYyA9IDE7CS8vIFBCTSBmaWxlIChCICYgVykKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSA4IDogCQkJCisJCQkJCW1hZ2ljID0gMjsJLy8gUEdNIGZpbGUJKEdyZXlzY2FsZSkKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIDI0IDoKKwkJCQkJbWFnaWMgPSAzOwkvLyBQUE0gZmlsZSAoUkdCKQorCQkJCQlicmVhazsKKworCQkJCWRlZmF1bHQ6CisJCQkJCXJldHVybiBGQUxTRTsJLy8gSW52YWxpZCBiaXQgZGVwdGgKKwkJCX0KKwkJCWJyZWFrOworCQkKKwkJY2FzZSBGSVRfVUlOVDE2OgorCQkJbWFnaWMgPSAyOwkvLyBQR00gZmlsZQkoR3JleXNjYWxlKQorCQkJbWF4dmFsID0gNjU1MzU7CisJCQlicmVhazsKKworCQljYXNlIEZJVF9SR0IxNjoKKwkJCW1hZ2ljID0gMzsJLy8gUFBNIGZpbGUgKFJHQikKKwkJCW1heHZhbCA9IDY1NTM1OworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBGQUxTRTsKKwl9CisKKworCWlmIChmbGFncyA9PSBQTk1fU0FWRV9SQVcpCisJCW1hZ2ljICs9IDM7CisKKwkvLyBXcml0ZSB0aGUgaGVhZGVyIGluZm8KKworCXNwcmludGYoYnVmZmVyLCAiUCVkXG4lZCAlZFxuIiwgbWFnaWMsIHdpZHRoLCBoZWlnaHQpOworCWlvLT53cml0ZV9wcm9jKCZidWZmZXIsICh1bnNpZ25lZCBpbnQpc3RybGVuKGJ1ZmZlciksIDEsIGhhbmRsZSk7CisKKwlpZiAoYnBwICE9IDEpIHsKKwkJc3ByaW50ZihidWZmZXIsICIlZFxuIiwgbWF4dmFsKTsKKwkJaW8tPndyaXRlX3Byb2MoJmJ1ZmZlciwgKHVuc2lnbmVkIGludClzdHJsZW4oYnVmZmVyKSwgMSwgaGFuZGxlKTsKKwl9CisKKwkvLyBXcml0ZSB0aGUgaW1hZ2UgZGF0YQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlpZihpbWFnZV90eXBlID09IEZJVF9CSVRNQVApIHsKKwkJc3dpdGNoKGJwcCkgIHsKKwkJCWNhc2UgMjQgOiAgICAgICAgICAgIC8vIDI0LWJpdCBSR0IsIDMgYnl0ZXMgcGVyIHBpeGVsCisJCQl7CisJCQkJaWYgKGZsYWdzID09IFBOTV9TQVZFX1JBVykgIHsKKwkJCQkJZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisJCQkJCQkvLyB3cml0ZSB0aGUgc2NhbmxpbmUgdG8gZGlzYworCQkJCQkJQllURSAqYml0cyA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIGhlaWdodCAtIDEgLSB5KTsKKworCQkJCQkJZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQkJCQlpby0+d3JpdGVfcHJvYygmYml0c1tGSV9SR0JBX1JFRF0sIDEsIDEsIGhhbmRsZSk7CS8vIFIKKwkJCQkJCQlpby0+d3JpdGVfcHJvYygmYml0c1tGSV9SR0JBX0dSRUVOXSwgMSwgMSwgaGFuZGxlKTsJLy8gRworCQkJCQkJCWlvLT53cml0ZV9wcm9jKCZiaXRzW0ZJX1JHQkFfQkxVRV0sIDEsIDEsIGhhbmRsZSk7CS8vIEIKKworCQkJCQkJCWJpdHMgKz0gMzsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWludCBsZW5ndGggPSAwOworCisJCQkJCWZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworCQkJCQkJLy8gd3JpdGUgdGhlIHNjYW5saW5lIHRvIGRpc2MKKwkJCQkJCUJZVEUgKmJpdHMgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCBoZWlnaHQgLSAxIC0geSk7CisJCQkJCQkKKwkJCQkJCWZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisJCQkJCQkJc3ByaW50ZihidWZmZXIsICIlM2QgJTNkICUzZCAiLCBiaXRzW0ZJX1JHQkFfUkVEXSwgYml0c1tGSV9SR0JBX0dSRUVOXSwgYml0c1tGSV9SR0JBX0JMVUVdKTsKKworCQkJCQkJCWlvLT53cml0ZV9wcm9jKCZidWZmZXIsICh1bnNpZ25lZCBpbnQpc3RybGVuKGJ1ZmZlciksIDEsIGhhbmRsZSk7CisKKwkJCQkJCQlsZW5ndGggKz0gMTI7CisKKwkJCQkJCQlpZihsZW5ndGggPiA1OCkgeworCQkJCQkJCQkvLyBObyBsaW5lIHNob3VsZCBiZSBsb25nZXIgdGhhbiA3MCBjaGFyYWN0ZXJzCisJCQkJCQkJCXNwcmludGYoYnVmZmVyLCAiXG4iKTsKKwkJCQkJCQkJaW8tPndyaXRlX3Byb2MoJmJ1ZmZlciwgKHVuc2lnbmVkIGludClzdHJsZW4oYnVmZmVyKSwgMSwgaGFuZGxlKTsKKwkJCQkJCQkJbGVuZ3RoID0gMDsKKwkJCQkJCQl9CisKKwkJCQkJCQliaXRzICs9IDM7CisJCQkJCQl9CQkJCQkKKwkJCQkJfQorCisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJCWNhc2UgODoJCS8vIDgtYml0IGdyZXlzY2FsZQorCQkJeworCQkJCWlmIChmbGFncyA9PSBQTk1fU0FWRV9SQVcpICB7CisJCQkJCWZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworCQkJCQkJLy8gd3JpdGUgdGhlIHNjYW5saW5lIHRvIGRpc2MKKwkJCQkJCUJZVEUgKmJpdHMgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCBoZWlnaHQgLSAxIC0geSk7CisKKwkJCQkJCWZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisJCQkJCQkJaW8tPndyaXRlX3Byb2MoJmJpdHNbeF0sIDEsIDEsIGhhbmRsZSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlpbnQgbGVuZ3RoID0gMDsKKworCQkJCQlmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJCQkJCS8vIHdyaXRlIHRoZSBzY2FubGluZSB0byBkaXNjCisJCQkJCQlCWVRFICpiaXRzID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgaGVpZ2h0IC0gMSAtIHkpOworCisJCQkJCQlmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworCQkJCQkJCXNwcmludGYoYnVmZmVyLCAiJTNkICIsIGJpdHNbeF0pOworCisJCQkJCQkJaW8tPndyaXRlX3Byb2MoJmJ1ZmZlciwgKHVuc2lnbmVkIGludClzdHJsZW4oYnVmZmVyKSwgMSwgaGFuZGxlKTsKKworCQkJCQkJCWxlbmd0aCArPSA0OworCisJCQkJCQkJaWYgKGxlbmd0aCA+IDY2KSB7CisJCQkJCQkJCS8vIE5vIGxpbmUgc2hvdWxkIGJlIGxvbmdlciB0aGFuIDcwIGNoYXJhY3RlcnMKKwkJCQkJCQkJc3ByaW50ZihidWZmZXIsICJcbiIpOworCQkJCQkJCQlpby0+d3JpdGVfcHJvYygmYnVmZmVyLCAodW5zaWduZWQgaW50KXN0cmxlbihidWZmZXIpLCAxLCBoYW5kbGUpOworCQkJCQkJCQlsZW5ndGggPSAwOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCQljYXNlIDE6CQkvLyAxLWJpdCBCICYgVworCQkJeworCQkJCWludCBjb2xvcjsKKworCQkJCWlmIChmbGFncyA9PSBQTk1fU0FWRV9SQVcpICB7CisJCQkJCWZvcih5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisJCQkJCQkvLyB3cml0ZSB0aGUgc2NhbmxpbmUgdG8gZGlzYworCQkJCQkJQllURSAqYml0cyA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIGhlaWdodCAtIDEgLSB5KTsKKworCQkJCQkJZm9yKHggPSAwOyB4IDwgKGludClGcmVlSW1hZ2VfR2V0TGluZShkaWIpOyB4KyspCisJCQkJCQkJaW8tPndyaXRlX3Byb2MoJmJpdHNbeF0sIDEsIDEsIGhhbmRsZSk7CisJCQkJCX0KKwkJCQl9IGVsc2UgIHsKKwkJCQkJaW50IGxlbmd0aCA9IDA7CisKKwkJCQkJZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisJCQkJCQkvLyB3cml0ZSB0aGUgc2NhbmxpbmUgdG8gZGlzYworCQkJCQkJQllURSAqYml0cyA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIGhlaWdodCAtIDEgLSB5KTsKKworCQkJCQkJZm9yICh4ID0gMDsgeCA8IChpbnQpRnJlZUltYWdlX0dldExpbmUoZGliKSAqIDg7IHgrKykJeworCQkJCQkJCWNvbG9yID0gKGJpdHNbeD4+M10gJiAoMHg4MCA+PiAoeCAmIDB4MDcpKSkgIT0gMDsKKworCQkJCQkJCXNwcmludGYoYnVmZmVyLCAiJWMgIiwgY29sb3IgPyAnMSc6JzAnKTsKKworCQkJCQkJCWlvLT53cml0ZV9wcm9jKCZidWZmZXIsICh1bnNpZ25lZCBpbnQpc3RybGVuKGJ1ZmZlciksIDEsIGhhbmRsZSk7CisKKwkJCQkJCQlsZW5ndGggKz0gMjsKKworCQkJCQkJCWlmIChsZW5ndGggPiA2OCkgeworCQkJCQkJCQkvLyBObyBsaW5lIHNob3VsZCBiZSBsb25nZXIgdGhhbiA3MCBjaGFyYWN0ZXJzCisJCQkJCQkJCXNwcmludGYoYnVmZmVyLCAiXG4iKTsKKwkJCQkJCQkJaW8tPndyaXRlX3Byb2MoJmJ1ZmZlciwgKHVuc2lnbmVkIGludClzdHJsZW4oYnVmZmVyKSwgMSwgaGFuZGxlKTsKKwkJCQkJCQkJbGVuZ3RoID0gMDsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQkKKwkJCWJyZWFrOworCQl9CisJfSAvLyBpZihGSVRfQklUTUFQKQorCisJZWxzZSBpZihpbWFnZV90eXBlID09IEZJVF9VSU5UMTYpIHsJCS8vIDE2LWJpdCBncmV5c2NhbGUKKwkJaWYgKGZsYWdzID09IFBOTV9TQVZFX1JBVykgIHsKKwkJCWZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworCQkJCS8vIHdyaXRlIHRoZSBzY2FubGluZSB0byBkaXNjCisJCQkJV09SRCAqYml0cyA9IChXT1JEKilGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCBoZWlnaHQgLSAxIC0geSk7CisKKwkJCQlmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworCQkJCQlXcml0ZVdvcmQoaW8sIGhhbmRsZSwgYml0c1t4XSk7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJaW50IGxlbmd0aCA9IDA7CisKKwkJCWZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworCQkJCS8vIHdyaXRlIHRoZSBzY2FubGluZSB0byBkaXNjCisJCQkJV09SRCAqYml0cyA9IChXT1JEKilGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCBoZWlnaHQgLSAxIC0geSk7CisKKwkJCQlmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworCQkJCQlzcHJpbnRmKGJ1ZmZlciwgIiU1ZCAiLCBiaXRzW3hdKTsKKworCQkJCQlpby0+d3JpdGVfcHJvYygmYnVmZmVyLCAodW5zaWduZWQgaW50KXN0cmxlbihidWZmZXIpLCAxLCBoYW5kbGUpOworCisJCQkJCWxlbmd0aCArPSA2OworCisJCQkJCWlmIChsZW5ndGggPiA2NCkgeworCQkJCQkJLy8gTm8gbGluZSBzaG91bGQgYmUgbG9uZ2VyIHRoYW4gNzAgY2hhcmFjdGVycworCQkJCQkJc3ByaW50ZihidWZmZXIsICJcbiIpOworCQkJCQkJaW8tPndyaXRlX3Byb2MoJmJ1ZmZlciwgKHVuc2lnbmVkIGludClzdHJsZW4oYnVmZmVyKSwgMSwgaGFuZGxlKTsKKwkJCQkJCWxlbmd0aCA9IDA7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwllbHNlIGlmKGltYWdlX3R5cGUgPT0gRklUX1JHQjE2KSB7CQkvLyA0OC1iaXQgUkdCCisJCWlmIChmbGFncyA9PSBQTk1fU0FWRV9SQVcpICB7CisJCQlmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJCQkvLyB3cml0ZSB0aGUgc2NhbmxpbmUgdG8gZGlzYworCQkJCUZJUkdCMTYgKmJpdHMgPSAoRklSR0IxNiopRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgaGVpZ2h0IC0gMSAtIHkpOworCisJCQkJZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQkJV3JpdGVXb3JkKGlvLCBoYW5kbGUsIGJpdHNbeF0ucmVkKTsJCS8vIFIKKwkJCQkJV3JpdGVXb3JkKGlvLCBoYW5kbGUsIGJpdHNbeF0uZ3JlZW4pOwkvLyBHCisJCQkJCVdyaXRlV29yZChpbywgaGFuZGxlLCBiaXRzW3hdLmJsdWUpOwkvLyBCCisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJaW50IGxlbmd0aCA9IDA7CisKKwkJCWZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworCQkJCS8vIHdyaXRlIHRoZSBzY2FubGluZSB0byBkaXNjCisJCQkJRklSR0IxNiAqYml0cyA9IChGSVJHQjE2KilGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCBoZWlnaHQgLSAxIC0geSk7CisJCQkJCisJCQkJZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQkJc3ByaW50ZihidWZmZXIsICIlNWQgJTVkICU1ZCAiLCBiaXRzW3hdLnJlZCwgYml0c1t4XS5ncmVlbiwgYml0c1t4XS5ibHVlKTsKKworCQkJCQlpby0+d3JpdGVfcHJvYygmYnVmZmVyLCAodW5zaWduZWQgaW50KXN0cmxlbihidWZmZXIpLCAxLCBoYW5kbGUpOworCisJCQkJCWxlbmd0aCArPSAxODsKKworCQkJCQlpZihsZW5ndGggPiA1MikgeworCQkJCQkJLy8gTm8gbGluZSBzaG91bGQgYmUgbG9uZ2VyIHRoYW4gNzAgY2hhcmFjdGVycworCQkJCQkJc3ByaW50ZihidWZmZXIsICJcbiIpOworCQkJCQkJaW8tPndyaXRlX3Byb2MoJmJ1ZmZlciwgKHVuc2lnbmVkIGludClzdHJsZW4oYnVmZmVyKSwgMSwgaGFuZGxlKTsKKwkJCQkJCWxlbmd0aCA9IDA7CisJCQkJCX0KKwkJCQl9CQkJCQkKKwkJCX0KKworCQl9CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICAgSW5pdAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit2b2lkIERMTF9DQUxMQ09OVgorSW5pdFBOTShQbHVnaW4gKnBsdWdpbiwgaW50IGZvcm1hdF9pZCkgeworCXNfZm9ybWF0X2lkID0gZm9ybWF0X2lkOworCisJcGx1Z2luLT5mb3JtYXRfcHJvYyA9IEZvcm1hdDsKKwlwbHVnaW4tPmRlc2NyaXB0aW9uX3Byb2MgPSBEZXNjcmlwdGlvbjsKKwlwbHVnaW4tPmV4dGVuc2lvbl9wcm9jID0gRXh0ZW5zaW9uOworCXBsdWdpbi0+cmVnZXhwcl9wcm9jID0gUmVnRXhwcjsKKwlwbHVnaW4tPm9wZW5fcHJvYyA9IE5VTEw7CisJcGx1Z2luLT5jbG9zZV9wcm9jID0gTlVMTDsKKwlwbHVnaW4tPnBhZ2Vjb3VudF9wcm9jID0gTlVMTDsKKwlwbHVnaW4tPnBhZ2VjYXBhYmlsaXR5X3Byb2MgPSBOVUxMOworCXBsdWdpbi0+bG9hZF9wcm9jID0gTG9hZDsKKwlwbHVnaW4tPnNhdmVfcHJvYyA9IFNhdmU7CisJcGx1Z2luLT52YWxpZGF0ZV9wcm9jID0gVmFsaWRhdGU7CisJcGx1Z2luLT5taW1lX3Byb2MgPSBNaW1lVHlwZTsKKwlwbHVnaW4tPnN1cHBvcnRzX2V4cG9ydF9icHBfcHJvYyA9IFN1cHBvcnRzRXhwb3J0RGVwdGg7CisJcGx1Z2luLT5zdXBwb3J0c19leHBvcnRfdHlwZV9wcm9jID0gU3VwcG9ydHNFeHBvcnRUeXBlOworCXBsdWdpbi0+c3VwcG9ydHNfaWNjX3Byb2ZpbGVzX3Byb2MgPSBOVUxMOworCXBsdWdpbi0+c3VwcG9ydHNfbm9fcGl4ZWxzX3Byb2MgPSBTdXBwb3J0c05vUGl4ZWxzOworfQpkaWZmIC0tZ2l0IGEvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9QbHVnaW5QU0QuY3BwIGIvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9QbHVnaW5QU0QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NTNhMzEKLS0tIC9kZXYvbnVsbAorKysgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL1BsdWdpblBTRC5jcHAKQEAgLTAsMCArMSwxMzEgQEAKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFBob3Rvc2hvcCBMb2FkZXIKKy8vCisvLyBEZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIGJ5CisvLyAtIEhlcnbDqSBEcm9sb24gKGRyb2xvbkBpbmZvbmllLmZyKQorLy8gLSBNaWhhaWwgTmF5ZGVub3YgKG1uYXlkZW5vdkB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQpCisvLworLy8gQmFzZWQgb24gTEdQTCBjb2RlIGNyZWF0ZWQgYW5kIHB1Ymxpc2hlZCBieSBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2VseW54LworLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZyZWVJbWFnZSAzCisvLworLy8gQ09WRVJFRCBDT0RFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZCisvLyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUworLy8gVEhBVCBUSEUgQ09WRVJFRCBDT0RFIElTIEZSRUUgT0YgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisvLyBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRAorLy8gQ09ERSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVAorLy8gVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GIEFOWSBORUNFU1NBUlkKKy8vIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwKKy8vIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIKKy8vIFRISVMgRElTQ0xBSU1FUi4KKy8vCisvLyBVc2UgYXQgeW91ciBvd24gcmlzayEKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2luY2x1ZGUgIkZyZWVJbWFnZS5oIgorI2luY2x1ZGUgIlV0aWxpdGllcy5oIgorI2luY2x1ZGUgIlBTRFBhcnNlci5oIgorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBQbHVnaW4gSW50ZXJmYWNlCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3N0YXRpYyBpbnQgc19mb3JtYXRfaWQ7CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFBsdWdpbiBJbXBsZW1lbnRhdGlvbgorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgorRm9ybWF0KCkgeworCXJldHVybiAiUFNEIjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKK0Rlc2NyaXB0aW9uKCkgeworCXJldHVybiAiQWRvYmUgUGhvdG9zaG9wIjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKK0V4dGVuc2lvbigpIHsKKwlyZXR1cm4gInBzZCI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCitNaW1lVHlwZSgpIHsKKwlyZXR1cm4gImltYWdlL3ZuZC5hZG9iZS5waG90b3Nob3AiOworfQorCitzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYKK1ZhbGlkYXRlKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSkgeworCUJZVEUgcHNkX2lkW10gPSB7IDB4MzgsIDB4NDIsIDB4NTAsIDB4NTMgfTsKKwlCWVRFIHNpZ25hdHVyZVs0XSA9IHsgMCwgMCwgMCwgMCB9OworCisJaW8tPnJlYWRfcHJvYyhzaWduYXR1cmUsIDEsIDQsIGhhbmRsZSk7CisKKwlpZihtZW1jbXAocHNkX2lkLCBzaWduYXR1cmUsIDQpID09IDApCisJCXJldHVybiBUUlVFOworCisJcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYKK1N1cHBvcnRzRXhwb3J0RGVwdGgoaW50IGRlcHRoKSB7CisJcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYgCitTdXBwb3J0c0V4cG9ydFR5cGUoRlJFRV9JTUFHRV9UWVBFIHR5cGUpIHsKKwlyZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBCT09MIERMTF9DQUxMQ09OVgorU3VwcG9ydHNJQ0NQcm9maWxlcygpIHsKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIEJPT0wgRExMX0NBTExDT05WCitTdXBwb3J0c05vUGl4ZWxzKCkgeworCXJldHVybiBUUlVFOworfSAKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgRklCSVRNQVAgKiBETExfQ0FMTENPTlYKK0xvYWQoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBpbnQgcGFnZSwgaW50IGZsYWdzLCB2b2lkICpkYXRhKSB7CisJaWYoaGFuZGxlKSB7CisJCXBzZFBhcnNlciBwYXJzZXI7CisJCQorCQlGSUJJVE1BUCAqZGliID0gcGFyc2VyLkxvYWQoaW8sIGhhbmRsZSwgc19mb3JtYXRfaWQsIGZsYWdzKTsKKworCQlyZXR1cm4gZGliOworCX0KKworCXJldHVybiBOVUxMOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgIEluaXQKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwordm9pZCBETExfQ0FMTENPTlYKK0luaXRQU0QoUGx1Z2luICpwbHVnaW4sIGludCBmb3JtYXRfaWQpIHsKKwlzX2Zvcm1hdF9pZCA9IGZvcm1hdF9pZDsKKworCXBsdWdpbi0+Zm9ybWF0X3Byb2MgPSBGb3JtYXQ7CisJcGx1Z2luLT5kZXNjcmlwdGlvbl9wcm9jID0gRGVzY3JpcHRpb247CisJcGx1Z2luLT5leHRlbnNpb25fcHJvYyA9IEV4dGVuc2lvbjsKKwlwbHVnaW4tPnJlZ2V4cHJfcHJvYyA9IE5VTEw7CisJcGx1Z2luLT5vcGVuX3Byb2MgPSBOVUxMOworCXBsdWdpbi0+Y2xvc2VfcHJvYyA9IE5VTEw7CisJcGx1Z2luLT5wYWdlY291bnRfcHJvYyA9IE5VTEw7CisJcGx1Z2luLT5wYWdlY2FwYWJpbGl0eV9wcm9jID0gTlVMTDsKKwlwbHVnaW4tPmxvYWRfcHJvYyA9IExvYWQ7CisJcGx1Z2luLT5zYXZlX3Byb2MgPSBOVUxMOworCXBsdWdpbi0+dmFsaWRhdGVfcHJvYyA9IFZhbGlkYXRlOworCXBsdWdpbi0+bWltZV9wcm9jID0gTWltZVR5cGU7CisJcGx1Z2luLT5zdXBwb3J0c19leHBvcnRfYnBwX3Byb2MgPSBTdXBwb3J0c0V4cG9ydERlcHRoOworCXBsdWdpbi0+c3VwcG9ydHNfZXhwb3J0X3R5cGVfcHJvYyA9IFN1cHBvcnRzRXhwb3J0VHlwZTsKKwlwbHVnaW4tPnN1cHBvcnRzX2ljY19wcm9maWxlc19wcm9jID0gU3VwcG9ydHNJQ0NQcm9maWxlczsKKwlwbHVnaW4tPnN1cHBvcnRzX25vX3BpeGVsc19wcm9jID0gU3VwcG9ydHNOb1BpeGVsczsgCit9CmRpZmYgLS1naXQgYS9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL1BsdWdpblJBUy5jcHAgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL1BsdWdpblJBUy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhmZDU1OAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvUGx1Z2luUkFTLmNwcApAQCAtMCwwICsxLDUxMiBAQAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gU3VuIHJhc3RlcmZpbGUgTG9hZGVyCisvLworLy8gRGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBieSAKKy8vIC0gSGVydukgRHJvbG9uIChkcm9sb25AaW5mb25pZS5mcikKKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBGcmVlSW1hZ2UgMworLy8KKy8vIENPVkVSRUQgQ09ERSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWQorLy8gT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMKKy8vIFRIQVQgVEhFIENPVkVSRUQgQ09ERSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLy8gT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQKKy8vIENPREUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkgQ09WRVJFRCBDT0RFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QKKy8vIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZCisvLyBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMCisvLyBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GIEFOWSBDT1ZFUkVEIENPREUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSCisvLyBUSElTIERJU0NMQUlNRVIuCisvLworLy8gVXNlIGF0IHlvdXIgb3duIHJpc2shCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpbmNsdWRlICJGcmVlSW1hZ2UuaCIKKyNpbmNsdWRlICJVdGlsaXRpZXMuaCIKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICBDb25zdGFudHMgKyBoZWFkZXJzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZmRlZiBfV0lOMzIKKyNwcmFnbWEgcGFjayhwdXNoLCAxKQorI2Vsc2UKKyNwcmFnbWEgcGFjaygxKQorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHRhZ1NVTkhFQURFUiB7CisJRFdPUkQgbWFnaWM7CQkvLyBNYWdpYyBudW1iZXIKKwlEV09SRCB3aWR0aDsJCS8vIEltYWdlIHdpZHRoIGluIHBpeGVscworCURXT1JEIGhlaWdodDsJCS8vIEltYWdlIGhlaWdodCBpbiBwaXhlbHMKKwlEV09SRCBkZXB0aDsJCS8vIERlcHRoICgxLCA4LCAyNCBvciAzMiBiaXRzKSBvZiBlYWNoIHBpeGVsCisJRFdPUkQgbGVuZ3RoOwkJLy8gSW1hZ2UgbGVuZ3RoIChpbiBieXRlcykKKwlEV09SRCB0eXBlOwkJCS8vIEZvcm1hdCBvZiBmaWxlIChzZWUgUlRfKiBiZWxvdykKKwlEV09SRCBtYXB0eXBlOwkJLy8gVHlwZSBvZiBjb2xvcm1hcCAoc2VlIFJNVF8qIGJlbG93KQorCURXT1JEIG1hcGxlbmd0aDsJLy8gTGVuZ3RoIG9mIGNvbG9ybWFwIChpbiBieXRlcykKK30gU1VOSEVBREVSOworCisjaWZkZWYgX1dJTjMyCisjcHJhZ21hIHBhY2socG9wKQorI2Vsc2UKKyNwcmFnbWEgcGFjaygpCisjZW5kaWYKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBGb2xsb3dpbmcgdGhlIGhlYWRlciBpcyB0aGUgY29sb3JtYXAsIGZvciBtYXBsZW5ndGggYnl0ZXMgKHVubGVzcyBtYXBsZW5ndGggaXMgemVybyksCisvLyB0aGVuIHRoZSBpbWFnZS4gRWFjaCByb3cgb2YgdGhlIGltYWdlIGlzIHJvdW5kZWQgdG8gMiBieXRlcy4KKworI2RlZmluZSBSQVNfTUFHSUMgMHg1OUE2NkE5NSAvLyBNYWdpYyBudW1iZXIgZm9yIFN1biByYXN0ZXJmaWxlcworCisvLyBTdW4gc3VwcG9ydGVkIHR5cGUncworCisjZGVmaW5lIFJUX09MRAkJCTAJLy8gT2xkIGZvcm1hdCAocmF3IGltYWdlIGluIDY4MDAwIGJ5dGUgb3JkZXIpCisjZGVmaW5lIFJUX1NUQU5EQVJECQkxCS8vIFJhdyBpbWFnZSBpbiA2ODAwMCBieXRlIG9yZGVyCisjZGVmaW5lIFJUX0JZVEVfRU5DT0RFRAkyCS8vIFJ1bi1sZW5ndGggZW5jb2Rpbmcgb2YgYnl0ZXMgCisjZGVmaW5lIFJUX0ZPUk1BVF9SR0IJMwkvLyBYUkdCIG9yIFJHQiBpbnN0ZWFkIG9mIFhCR1Igb3IgQkdSCisjZGVmaW5lIFJUX0ZPUk1BVF9USUZGCTQJLy8gVElGRiA8LT4gc3RhbmRhcmQgcmFzdGVyZmlsZQorI2RlZmluZSBSVF9GT1JNQVRfSUZGCTUJLy8gSUZGIChUQUFDIGZvcm1hdCkgPC0+IHN0YW5kYXJkIHJhc3RlcmZpbGUKKworI2RlZmluZSBSVF9FWFBFUklNRU5UQUwgMHhmZmZmCS8vIFJlc2VydmVkIGZvciB0ZXN0aW5nCisKKy8vIFRoZXNlIGFyZSB0aGUgcG9zc2libGUgY29sb3JtYXAgdHlwZXMuCisvLyBpZiBpdCdzIGluIFJHQiBmb3JtYXQsIHRoZSBtYXAgaXMgbWFkZSB1cCBvZiB0aHJlZSBieXRlIGFycmF5cworLy8gKHJlZCwgZ3JlZW4sIHRoZW4gYmx1ZSkgdGhhdCBhcmUgZWFjaCAxLzMgb2YgdGhlIGNvbG9ybWFwIGxlbmd0aC4KKworI2RlZmluZSBSTVRfTk9ORQkJMAkvLyBtYXBsZW5ndGggaXMgZXhwZWN0ZWQgdG8gYmUgMAorI2RlZmluZSBSTVRfRVFVQUxfUkdCCTEJLy8gcmVkW21hcGxlbmd0aC8zXSwgZ3JlZW5bbWFwbGVuZ3RoLzNdLCBibHVlW21hcGxlbmd0aC8zXQorI2RlZmluZSBSTVRfUkFXCQkJMgkvLyBSYXcgY29sb3JtYXAKKyNkZWZpbmUgUkVTQwkJCTEyOCAvLyBSdW4tbGVuZ3RoIGVuY29kaW5nIGVzY2FwZSBjaGFyYWN0ZXIKKworLy8gLS0tLS0gTk9URVMgLS0tLS0KKy8vIEVhY2ggbGluZSBvZiB0aGUgaW1hZ2UgaXMgcm91bmRlZCBvdXQgdG8gYSBtdWx0aXBsZSBvZiAxNiBiaXRzLgorLy8gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgcm91bmRpbmcgY29udmVudGlvbiB1c2VkIGJ5IHRoZSBtZW1vcnkgcGl4cmVjdAorLy8gcGFja2FnZSAoL3Vzci9pbmNsdWRlL3BpeHJlY3QvbWVtdmFyLmgpIG9mIHRoZSBTdW5XaW5kb3dzIHN5c3RlbS4KKy8vIFRoZSByYXNfZW5jb2RpbmcgZmllbGQgKGFsd2F5cyBzZXQgdG8gMCBieSBTdW4ncyBzdXBwb3J0ZWQgc29mdHdhcmUpCisvLyB3YXMgcmVuYW1lZCB0byByYXNfbGVuZ3RoIGluIHJlbGVhc2UgMi4wLiAgQXMgYSByZXN1bHQsIHJhc3RlcmZpbGVzCisvLyBvZiB0eXBlIDAgZ2VuZXJhdGVkIGJ5IHRoZSBvbGQgc29mdHdhcmUgY2xhaW0gdG8gaGF2ZSAwIGxlbmd0aDsgZm9yCisvLyBjb21wYXRpYmlsaXR5LCBjb2RlIHJlYWRpbmcgcmFzdGVyZmlsZXMgbXVzdCBiZSBwcmVwYXJlZCB0byBjb21wdXRlIHRoZQorLy8gVFJVRSBsZW5ndGggZnJvbSB0aGUgd2lkdGgsIGhlaWdodCwgYW5kIGRlcHRoIGZpZWxkcy4KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gSW50ZXJuYWwgZnVuY3Rpb25zCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3N0YXRpYyB2b2lkCitSZWFkRGF0YShGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIEJZVEUgKmJ1ZiwgRFdPUkQgbGVuZ3RoLCBCT09MIHJsZSkgeworCS8vIFJlYWQgZWl0aGVyIFJ1bi1MZW5ndGggRW5jb2RlZCBvciBub3JtYWwgaW1hZ2UgZGF0YQorCisJc3RhdGljIEJZVEUgcmVwY2hhciwgcmVtYWluaW5nPSAwOworCisJaWYgKHJsZSkgeworCQkvLyBSdW4tbGVuZ3RoIGVuY29kZWQgcmVhZAorCisJCXdoaWxlKGxlbmd0aC0tKSB7CisJCQlpZiAocmVtYWluaW5nKSB7CisJCQkJcmVtYWluaW5nLS07CisJCQkJKihidWYrKyk9IHJlcGNoYXI7CisJCQl9IGVsc2UgeworCQkJCWlvLT5yZWFkX3Byb2MoJnJlcGNoYXIsIDEsIDEsIGhhbmRsZSk7CisKKwkJCQlpZiAocmVwY2hhciA9PSBSRVNDKSB7CisJCQkJCWlvLT5yZWFkX3Byb2MoJnJlbWFpbmluZywgMSwgMSwgaGFuZGxlKTsKKworCQkJCQlpZiAocmVtYWluaW5nID09IDApIHsKKwkJCQkJCSooYnVmKyspPSBSRVNDOworCQkJCQl9IGVsc2UgeworCQkJCQkJaW8tPnJlYWRfcHJvYygmcmVwY2hhciwgMSwgMSwgaGFuZGxlKTsKKworCQkJCQkJKihidWYrKyk9IHJlcGNoYXI7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQkqKGJ1ZisrKT0gcmVwY2hhcjsKKwkJCQl9CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQkvLyBOb3JtYWwgcmVhZAorCQorCQlpby0+cmVhZF9wcm9jKGJ1ZiwgbGVuZ3RoLCAxLCBoYW5kbGUpOworCX0KK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gUGx1Z2luIEludGVyZmFjZQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitzdGF0aWMgaW50IHNfZm9ybWF0X2lkOworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBQbHVnaW4gSW1wbGVtZW50YXRpb24KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKK0Zvcm1hdCgpIHsKKwlyZXR1cm4gIlJBUyI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCitEZXNjcmlwdGlvbigpIHsKKwlyZXR1cm4gIlN1biBSYXN0ZXIgSW1hZ2UiOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgorRXh0ZW5zaW9uKCkgeworCXJldHVybiAicmFzIjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKK1JlZ0V4cHIoKSB7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCitNaW1lVHlwZSgpIHsKKwlyZXR1cm4gImltYWdlL3gtY211LXJhc3RlciI7Cit9CisKK3N0YXRpYyBCT09MIERMTF9DQUxMQ09OVgorVmFsaWRhdGUoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlKSB7CisJQllURSByYXNfc2lnbmF0dXJlW10gPSB7IDB4NTksIDB4QTYsIDB4NkEsIDB4OTUgfTsKKwlCWVRFIHNpZ25hdHVyZVs0XSA9IHsgMCwgMCwgMCwgMCB9OworCisJaW8tPnJlYWRfcHJvYyhzaWduYXR1cmUsIDEsIHNpemVvZihyYXNfc2lnbmF0dXJlKSwgaGFuZGxlKTsKKworCXJldHVybiAobWVtY21wKHJhc19zaWduYXR1cmUsIHNpZ25hdHVyZSwgc2l6ZW9mKHJhc19zaWduYXR1cmUpKSA9PSAwKTsKK30KKworc3RhdGljIEJPT0wgRExMX0NBTExDT05WCitTdXBwb3J0c0V4cG9ydERlcHRoKGludCBkZXB0aCkgeworCXJldHVybiBGQUxTRTsKK30KKworc3RhdGljIEJPT0wgRExMX0NBTExDT05WIAorU3VwcG9ydHNFeHBvcnRUeXBlKEZSRUVfSU1BR0VfVFlQRSB0eXBlKSB7CisJcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYKK1N1cHBvcnRzTm9QaXhlbHMoKSB7CisJcmV0dXJuIFRSVUU7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIEZJQklUTUFQICogRExMX0NBTExDT05WCitMb2FkKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSwgaW50IHBhZ2UsIGludCBmbGFncywgdm9pZCAqZGF0YSkgeworCVNVTkhFQURFUiBoZWFkZXI7CS8vIFN1biBmaWxlIGhlYWRlcgorCVdPUkQgbGluZWxlbmd0aDsJLy8gTGVuZ3RoIG9mIHJhc3RlciBsaW5lIGluIGJ5dGVzCisJV09SRCBmaWxsOwkJCS8vIE51bWJlciBvZiBmaWxsIGJ5dGVzIHBlciByYXN0ZXIgbGluZQorCUJPT0wgcmxlOwkJCS8vIFRSVUUgaWYgUkxFIGZpbGUKKwlCT09MIGlzUkdCOwkJCS8vIFRSVUUgaWYgZmlsZSB0eXBlIGlzIFJUX0ZPUk1BVF9SR0IKKwlCWVRFIGZpbGxjaGFyOworCisJRklCSVRNQVAgKmRpYiA9IE5VTEw7CisJQllURSAqYml0czsJCQkvLyBQb2ludGVyIHRvIGRpYiBkYXRhCisJV09SRCB4LCB5OworCisJaWYoIWhhbmRsZSkgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlCT09MIGhlYWRlcl9vbmx5ID0gKGZsYWdzICYgRklGX0xPQURfTk9QSVhFTFMpID09IEZJRl9MT0FEX05PUElYRUxTOworCisJdHJ5IHsKKwkJLy8gUmVhZCBTVU4gcmFzdGVyIGhlYWRlcgorCisJCWlvLT5yZWFkX3Byb2MoJmhlYWRlciwgc2l6ZW9mKFNVTkhFQURFUiksIDEsIGhhbmRsZSk7CisKKyNpZm5kZWYgRlJFRUlNQUdFX0JJR0VORElBTgorCQkvLyBTVU4gcmFzdGVyZmlsZXMgYXJlIGJpZyBlbmRpYW4gb25seQorCisJCVN3YXBMb25nKCZoZWFkZXIubWFnaWMpOworCQlTd2FwTG9uZygmaGVhZGVyLndpZHRoKTsKKwkJU3dhcExvbmcoJmhlYWRlci5oZWlnaHQpOworCQlTd2FwTG9uZygmaGVhZGVyLmRlcHRoKTsKKwkJU3dhcExvbmcoJmhlYWRlci5sZW5ndGgpOworCQlTd2FwTG9uZygmaGVhZGVyLnR5cGUpOworCQlTd2FwTG9uZygmaGVhZGVyLm1hcHR5cGUpOworCQlTd2FwTG9uZygmaGVhZGVyLm1hcGxlbmd0aCk7CisjZW5kaWYKKworCQkvLyBWZXJpZnkgU1VOIGlkZW50aWZpZXIKKworCQlpZiAoaGVhZGVyLm1hZ2ljICE9IFJBU19NQUdJQykgeworCQkJdGhyb3cgRklfTVNHX0VSUk9SX01BR0lDX05VTUJFUjsKKwkJfQorCisJCS8vIEFsbG9jYXRlIGEgbmV3IERJQgorCisJCXN3aXRjaChoZWFkZXIuZGVwdGgpIHsKKwkJCWNhc2UgMToKKwkJCWNhc2UgODoKKwkJCQlkaWIgPSBGcmVlSW1hZ2VfQWxsb2NhdGVIZWFkZXIoaGVhZGVyX29ubHksIGhlYWRlci53aWR0aCwgaGVhZGVyLmhlaWdodCwgaGVhZGVyLmRlcHRoKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSAyNDoKKwkJCQlkaWIgPSBGcmVlSW1hZ2VfQWxsb2NhdGVIZWFkZXIoaGVhZGVyX29ubHksIGhlYWRlci53aWR0aCwgaGVhZGVyLmhlaWdodCwgaGVhZGVyLmRlcHRoLCBGSV9SR0JBX1JFRF9NQVNLLCBGSV9SR0JBX0dSRUVOX01BU0ssIEZJX1JHQkFfQkxVRV9NQVNLKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSAzMjoKKwkJCQlkaWIgPSBGcmVlSW1hZ2VfQWxsb2NhdGVIZWFkZXIoaGVhZGVyX29ubHksIGhlYWRlci53aWR0aCwgaGVhZGVyLmhlaWdodCwgaGVhZGVyLmRlcHRoLCBGSV9SR0JBX1JFRF9NQVNLLCBGSV9SR0JBX0dSRUVOX01BU0ssIEZJX1JHQkFfQkxVRV9NQVNLKTsKKwkJCQlicmVhazsKKwkJfQorCisJCWlmIChkaWIgPT0gTlVMTCkgeworCQkJdGhyb3cgRklfTVNHX0VSUk9SX0RJQl9NRU1PUlk7CisJCX0KKworCQkvLyBDaGVjayB0aGUgZmlsZSBmb3JtYXQKKworCQlybGUgPSBGQUxTRTsKKwkJaXNSR0IgPSBGQUxTRTsKKworCQlzd2l0Y2goaGVhZGVyLnR5cGUpIHsKKwkJCWNhc2UgUlRfT0xEOgorCQkJY2FzZSBSVF9TVEFOREFSRDoKKwkJCWNhc2UgUlRfRk9STUFUX1RJRkY6IC8vIEkgZG9uJ3QgZXZlbiBrbm93IHdoYXQgdGhlc2UgZm9ybWF0IGFyZS4uLgorCQkJY2FzZSBSVF9GT1JNQVRfSUZGOiAvL1RoZSBUSUZGIGFuZCBJRkYgZm9ybWF0IHR5cGVzIGluZGljYXRlIHRoYXQgdGhlIHJhc3RlcgorCQkJCS8vZmlsZSB3YXMgb3JpZ2luYWxseSBjb252ZXJ0ZWQgZnJvbSBlaXRoZXIgb2YgdGhlc2UgZmlsZSBmb3JtYXRzLgorCQkJCS8vc28gbGV0cyBhdCBsZWFzdCB0cnkgdG8gcHJvY2VzcyB0aGVtIGFzIFJUX1NUQU5EQVJECisJCQkJYnJlYWs7CisKKwkJCWNhc2UgUlRfQllURV9FTkNPREVEOgorCQkJCXJsZSA9IFRSVUU7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgUlRfRk9STUFUX1JHQjoKKwkJCQlpc1JHQiA9IFRSVUU7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJdGhyb3cgRklfTVNHX0VSUk9SX1VOU1VQUE9SVEVEX0ZPUk1BVDsKKwkJfQorCisJCS8vIHNldCB1cCB0aGUgY29sb3JtYXAgaWYgbmVlZGVkCisKKwkJc3dpdGNoKGhlYWRlci5tYXB0eXBlKSB7CisJCQljYXNlIFJNVF9OT05FIDoKKwkJCXsJCQkJCisJCQkJaWYgKGhlYWRlci5kZXB0aCA8IDI0KSB7CisJCQkJCS8vIENyZWF0ZSBsaW5lYXIgY29sb3IgcmFtcAorCisJCQkJCVJHQlFVQUQgKnBhbCA9IEZyZWVJbWFnZV9HZXRQYWxldHRlKGRpYik7CisKKwkJCQkJaW50IG51bWNvbG9ycyA9IDEgPDwgaGVhZGVyLmRlcHRoOworCisJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtY29sb3JzOyBpKyspIHsKKwkJCQkJCXBhbFtpXS5yZ2JSZWQJPSAoQllURSkoKDI1NSAqIGkpIC8gKG51bWNvbG9ycyAtIDEpKTsKKwkJCQkJCXBhbFtpXS5yZ2JHcmVlbiA9IChCWVRFKSgoMjU1ICogaSkgLyAobnVtY29sb3JzIC0gMSkpOworCQkJCQkJcGFsW2ldLnJnYkJsdWUJPSAoQllURSkoKDI1NSAqIGkpIC8gKG51bWNvbG9ycyAtIDEpKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCWJyZWFrOworCQkJfQorCisJCQljYXNlIFJNVF9FUVVBTF9SR0I6CisJCQl7CisJCQkJQllURSAqciwgKmcsICpiOworCisJCQkJLy8gUmVhZCBTVU4gcmFzdGVyIGNvbG9ybWFwCisKKwkJCQlpbnQgbnVtY29sb3JzID0gMSA8PCBoZWFkZXIuZGVwdGg7CisJCQkJaWYoKERXT1JEKSgzICogbnVtY29sb3JzKSA+IGhlYWRlci5tYXBsZW5ndGgpIHsKKwkJCQkJLy8gc29tZSBSQVMgbWF5IGhhdmUgbGVzcyBjb2xvcnMgdGhhbiB0aGUgZnVsbCBwYWxldHRlCisJCQkJCW51bWNvbG9ycyA9IGhlYWRlci5tYXBsZW5ndGggLyAzOworCQkJCX0gZWxzZSB7CisJCQkJCXRocm93ICJJbnZhbGlkIHBhbGV0dGUiOworCQkJCX0KKworCQkJCXIgPSAoQllURSopbWFsbG9jKDMgKiBudW1jb2xvcnMgKiBzaXplb2YoQllURSkpOworCQkJCWcgPSByICsgbnVtY29sb3JzOworCQkJCWIgPSBnICsgbnVtY29sb3JzOworCisJCQkJUkdCUVVBRCAqcGFsID0gRnJlZUltYWdlX0dldFBhbGV0dGUoZGliKTsKKworCQkJCWlvLT5yZWFkX3Byb2MociwgMyAqIG51bWNvbG9ycywgMSwgaGFuZGxlKTsKKworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtY29sb3JzOyBpKyspIHsKKwkJCQkJcGFsW2ldLnJnYlJlZAk9IHJbaV07CisJCQkJCXBhbFtpXS5yZ2JHcmVlbiA9IGdbaV07CisJCQkJCXBhbFtpXS5yZ2JCbHVlCT0gYltpXTsKKwkJCQl9CisKKwkJCQlmcmVlKHIpOworCQkJCWJyZWFrOworCQkJfQorCisJCQljYXNlIFJNVF9SQVc6CisJCQl7CisJCQkJQllURSAqY29sb3JtYXA7CisKKwkJCQkvLyBSZWFkIChza2lwKSBTVU4gcmFzdGVyIGNvbG9ybWFwLgorCisJCQkJY29sb3JtYXAgPSAoQllURSAqKW1hbGxvYyhoZWFkZXIubWFwbGVuZ3RoICogc2l6ZW9mKEJZVEUpKTsKKworCQkJCWlvLT5yZWFkX3Byb2MoY29sb3JtYXAsIGhlYWRlci5tYXBsZW5ndGgsIDEsIGhhbmRsZSk7CisKKwkJCQlmcmVlKGNvbG9ybWFwKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmKGhlYWRlcl9vbmx5KSB7CisJCQkvLyBoZWFkZXIgb25seSBtb2RlCisJCQlyZXR1cm4gZGliOworCQl9CisKKwkJLy8gQ2FsY3VsYXRlIHRoZSBsaW5lICsgcGl0Y2gKKwkJLy8gRWFjaCByb3cgaXMgbXVsdGlwbGUgb2YgMTYgYml0cyAoMiBieXRlcykuCisKKwkJaWYgKGhlYWRlci5kZXB0aCA9PSAxKSB7CisJCQlsaW5lbGVuZ3RoID0gKFdPUkQpKChoZWFkZXIud2lkdGggLyA4KSArIChoZWFkZXIud2lkdGggJSA4ID8gMSA6IDApKTsKKwkJfSBlbHNlIHsKKwkJCWxpbmVsZW5ndGggPSAoV09SRCloZWFkZXIud2lkdGg7CisJCX0KKworCQlmaWxsID0gKGxpbmVsZW5ndGggJSAyKSA/IDEgOiAwOworCisJCXVuc2lnbmVkIHBpdGNoID0gRnJlZUltYWdlX0dldFBpdGNoKGRpYik7CisKKwkJLy8gUmVhZCB0aGUgaW1hZ2UgZGF0YQorCQkKKwkJc3dpdGNoKGhlYWRlci5kZXB0aCkgeworCQkJY2FzZSAxOgorCQkJY2FzZSA4OgorCQkJeworCQkJCWJpdHMgPSBGcmVlSW1hZ2VfR2V0Qml0cyhkaWIpICsgKGhlYWRlci5oZWlnaHQgLSAxKSAqIHBpdGNoOworCisJCQkJZm9yICh5ID0gMDsgeSA8IGhlYWRlci5oZWlnaHQ7IHkrKykgeworCQkJCQlSZWFkRGF0YShpbywgaGFuZGxlLCBiaXRzLCBsaW5lbGVuZ3RoLCBybGUpOworCisJCQkJCWJpdHMgLT0gcGl0Y2g7CisKKwkJCQkJaWYgKGZpbGwpIHsKKwkJCQkJCVJlYWREYXRhKGlvLCBoYW5kbGUsICZmaWxsY2hhciwgZmlsbCwgcmxlKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCWJyZWFrOworCQkJfQorCisJCQljYXNlIDI0OgorCQkJeworCQkJCUJZVEUgKmJ1ZiwgKmJwOworCisJCQkJYnVmID0gKEJZVEUqKW1hbGxvYyhoZWFkZXIud2lkdGggKiAzKTsKKworCQkJCWZvciAoeSA9IDA7IHkgPCBoZWFkZXIuaGVpZ2h0OyB5KyspIHsKKwkJCQkJYml0cyA9IEZyZWVJbWFnZV9HZXRCaXRzKGRpYikgKyAoaGVhZGVyLmhlaWdodCAtIDEgLSB5KSAqIHBpdGNoOworCisJCQkJCVJlYWREYXRhKGlvLCBoYW5kbGUsIGJ1ZiwgaGVhZGVyLndpZHRoICogMywgcmxlKTsKKworCQkJCQlicCA9IGJ1ZjsKKworCQkJCQlpZiAoaXNSR0IpIHsKKwkJCQkJCWZvciAoeCA9IDA7IHggPCBoZWFkZXIud2lkdGg7IHgrKykgeworCQkJCQkJCWJpdHNbRklfUkdCQV9SRURdID0gKihicCsrKTsJLy8gcmVkCisJCQkJCQkJYml0c1tGSV9SR0JBX0dSRUVOXSA9ICooYnArKyk7CS8vIGdyZWVuCisJCQkJCQkJYml0c1tGSV9SR0JBX0JMVUVdID0gKihicCsrKTsJLy8gYmx1ZQorCisJCQkJCQkJYml0cyArPSAzOworCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJZm9yICh4ID0gMDsgeCA8IGhlYWRlci53aWR0aDsgeCsrKSB7CisJCQkJCQkJYml0c1tGSV9SR0JBX1JFRF0gPSAqKGJwICsgMik7CS8vIHJlZAorCQkJCQkJCWJpdHNbRklfUkdCQV9HUkVFTl0gPSAqKGJwICsgMSk7Ly8gZ3JlZW4KKwkJCQkJCQliaXRzW0ZJX1JHQkFfQkxVRV0gPSAqYnA7ICAgICAgIC8vIGJsdWUKKworCQkJCQkJCWJpdHMgKz0gMzsgYnAgKz0gMzsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCWlmIChmaWxsKSB7CisJCQkJCQlSZWFkRGF0YShpbywgaGFuZGxlLCAmZmlsbGNoYXIsIGZpbGwsIHJsZSk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlmcmVlKGJ1Zik7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWNhc2UgMzI6CisJCQl7CisJCQkJQllURSAqYnVmLCAqYnA7CisKKwkJCQlidWYgPSAoQllURSopbWFsbG9jKGhlYWRlci53aWR0aCAqIDQpOworCisJCQkJZm9yICh5ID0gMDsgeSA8IGhlYWRlci5oZWlnaHQ7IHkrKykgeworCQkJCQliaXRzID0gRnJlZUltYWdlX0dldEJpdHMoZGliKSArIChoZWFkZXIuaGVpZ2h0IC0gMSAtIHkpICogcGl0Y2g7CisKKwkJCQkJUmVhZERhdGEoaW8sIGhhbmRsZSwgYnVmLCBoZWFkZXIud2lkdGggKiA0LCBybGUpOworCisJCQkJCWJwID0gYnVmOworCisJCQkJCWlmIChpc1JHQikgeworCQkJCQkJZm9yICh4ID0gMDsgeCA8IGhlYWRlci53aWR0aDsgeCsrKSB7CisJCQkJCQkJYml0c1tGSV9SR0JBX0FMUEhBXSA9ICooYnArKyk7CS8vIGFscGhhCisJCQkJCQkJYml0c1tGSV9SR0JBX1JFRF0gPSAqKGJwKyspOwkvLyByZWQKKwkJCQkJCQliaXRzW0ZJX1JHQkFfR1JFRU5dID0gKihicCsrKTsJLy8gZ3JlZW4KKwkJCQkJCQliaXRzW0ZJX1JHQkFfQkxVRV0gPSAqKGJwKyspOwkvLyBibHVlCisKKwkJCQkJCQliaXRzICs9IDQ7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJZWxzZSB7CisJCQkJCQlmb3IgKHggPSAwOyB4IDwgaGVhZGVyLndpZHRoOyB4KyspIHsKKwkJCQkJCQliaXRzW0ZJX1JHQkFfUkVEXSA9ICooYnAgKyAzKTsJLy8gcmVkCisJCQkJCQkJYml0c1tGSV9SR0JBX0dSRUVOXSA9ICooYnAgKyAyKTsgLy8gZ3JlZW4KKwkJCQkJCQliaXRzW0ZJX1JHQkFfQkxVRV0gPSAqKGJwICsgMSk7CS8vIGJsdWUKKwkJCQkJCQliaXRzW0ZJX1JHQkFfQUxQSEFdID0gKmJwOwkJLy8gYWxwaGEKKworCQkJCQkJCWJpdHMgKz0gNDsKKwkJCQkJCQlicCArPSA0OworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJaWYgKGZpbGwpIHsKKwkJCQkJCVJlYWREYXRhKGlvLCBoYW5kbGUsICZmaWxsY2hhciwgZmlsbCwgcmxlKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCWZyZWUoYnVmKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQkKKwkJcmV0dXJuIGRpYjsKKworCX0gY2F0Y2ggKGNvbnN0IGNoYXIgKnRleHQpIHsKKwkJaWYoZGliKSB7CisJCQlGcmVlSW1hZ2VfVW5sb2FkKGRpYik7CisJCX0KKwkJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKHNfZm9ybWF0X2lkLCB0ZXh0KTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gICBJbml0CisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3ZvaWQgRExMX0NBTExDT05WCitJbml0UkFTKFBsdWdpbiAqcGx1Z2luLCBpbnQgZm9ybWF0X2lkKSB7CisJc19mb3JtYXRfaWQgPSBmb3JtYXRfaWQ7CisKKwlwbHVnaW4tPmZvcm1hdF9wcm9jID0gRm9ybWF0OworCXBsdWdpbi0+ZGVzY3JpcHRpb25fcHJvYyA9IERlc2NyaXB0aW9uOworCXBsdWdpbi0+ZXh0ZW5zaW9uX3Byb2MgPSBFeHRlbnNpb247CisJcGx1Z2luLT5yZWdleHByX3Byb2MgPSBSZWdFeHByOworCXBsdWdpbi0+b3Blbl9wcm9jID0gTlVMTDsKKwlwbHVnaW4tPmNsb3NlX3Byb2MgPSBOVUxMOworCXBsdWdpbi0+cGFnZWNvdW50X3Byb2MgPSBOVUxMOworCXBsdWdpbi0+cGFnZWNhcGFiaWxpdHlfcHJvYyA9IE5VTEw7CisJcGx1Z2luLT5sb2FkX3Byb2MgPSBMb2FkOworCXBsdWdpbi0+c2F2ZV9wcm9jID0gTlVMTDsKKwlwbHVnaW4tPnZhbGlkYXRlX3Byb2MgPSBWYWxpZGF0ZTsKKwlwbHVnaW4tPm1pbWVfcHJvYyA9IE1pbWVUeXBlOworCXBsdWdpbi0+c3VwcG9ydHNfZXhwb3J0X2JwcF9wcm9jID0gU3VwcG9ydHNFeHBvcnREZXB0aDsKKwlwbHVnaW4tPnN1cHBvcnRzX2V4cG9ydF90eXBlX3Byb2MgPSBTdXBwb3J0c0V4cG9ydFR5cGU7CisJcGx1Z2luLT5zdXBwb3J0c19pY2NfcHJvZmlsZXNfcHJvYyA9IE5VTEw7CisJcGx1Z2luLT5zdXBwb3J0c19ub19waXhlbHNfcHJvYyA9IFN1cHBvcnRzTm9QaXhlbHM7Cit9CmRpZmYgLS1naXQgYS9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL1BsdWdpblJBVy5jcHAgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL1BsdWdpblJBVy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTliZDViZgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvUGx1Z2luUkFXLmNwcApAQCAtMCwwICsxLDc5MyBAQAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gUkFXIGNhbWVyYSBpbWFnZSBsb2FkZXIKKy8vCisvLyBEZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIGJ5IAorLy8gLSBIZXJ26SBEcm9sb24gKGRyb2xvbkBpbmZvbmllLmZyKQorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZyZWVJbWFnZSAzCisvLworLy8gQ09WRVJFRCBDT0RFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZCisvLyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUworLy8gVEhBVCBUSEUgQ09WRVJFRCBDT0RFIElTIEZSRUUgT0YgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisvLyBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRAorLy8gQ09ERSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVAorLy8gVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GIEFOWSBORUNFU1NBUlkKKy8vIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwKKy8vIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIKKy8vIFRISVMgRElTQ0xBSU1FUi4KKy8vCisvLyBVc2UgYXQgeW91ciBvd24gcmlzayEKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2luY2x1ZGUgIi4uL0xpYlJhd0xpdGUvbGlicmF3L2xpYnJhdy5oIgorCisjaW5jbHVkZSAiRnJlZUltYWdlLmgiCisjaW5jbHVkZSAiVXRpbGl0aWVzLmgiCisjaW5jbHVkZSAiLi4vTWV0YWRhdGEvRnJlZUltYWdlVGFnLmgiCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFBsdWdpbiBJbnRlcmZhY2UKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3RhdGljIGludCBzX2Zvcm1hdF9pZDsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gSW50ZXJuYWwgZnVuY3Rpb25zCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgRnJlZUltYWdlIGRhdGFzdHJlYW0gd3JhcHBlcgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBMaWJSYXdfZnJlZWltYWdlX2RhdGFzdHJlYW0gOiBwdWJsaWMgTGliUmF3X2Fic3RyYWN0X2RhdGFzdHJlYW0geworcHJpdmF0ZTogCisJRnJlZUltYWdlSU8gKl9pbzsKKwlmaV9oYW5kbGUgX2hhbmRsZTsKKwlsb25nIF9lb2Y7CisJSU5UNjQgX2ZzaXplOworCitwdWJsaWM6CisJTGliUmF3X2ZyZWVpbWFnZV9kYXRhc3RyZWFtKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSkgOiBfaW8oaW8pLCBfaGFuZGxlKGhhbmRsZSkgeworCQlsb25nIHN0YXJ0X3BvcyA9IGlvLT50ZWxsX3Byb2MoaGFuZGxlKTsKKwkJaW8tPnNlZWtfcHJvYyhoYW5kbGUsIDAsIFNFRUtfRU5EKTsKKwkJX2VvZiA9IGlvLT50ZWxsX3Byb2MoaGFuZGxlKTsKKwkJX2ZzaXplID0gX2VvZiAtIHN0YXJ0X3BvczsKKwkJaW8tPnNlZWtfcHJvYyhoYW5kbGUsIHN0YXJ0X3BvcywgU0VFS19TRVQpOworCX0KKworCX5MaWJSYXdfZnJlZWltYWdlX2RhdGFzdHJlYW0oKSB7CisJfQorCisgICAgaW50IHZhbGlkKCkgeyAKKwkJcmV0dXJuIChfaW8gJiYgX2hhbmRsZSk7CisJfQorCisgICAgaW50IHJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSwgc2l6ZV90IGNvdW50KSB7IAorCQlpZihzdWJzdHJlYW0pIHJldHVybiBzdWJzdHJlYW0tPnJlYWQoYnVmZmVyLCBzaXplLCBjb3VudCk7CisJCXJldHVybiBfaW8tPnJlYWRfcHJvYyhidWZmZXIsICh1bnNpZ25lZClzaXplLCAodW5zaWduZWQpY291bnQsIF9oYW5kbGUpOworCX0KKworICAgIGludCBzZWVrKElOVDY0IG9mZnNldCwgaW50IG9yaWdpbikgeyAKKyAgICAgICAgaWYoc3Vic3RyZWFtKSByZXR1cm4gc3Vic3RyZWFtLT5zZWVrKG9mZnNldCwgb3JpZ2luKTsKKwkJcmV0dXJuIF9pby0+c2Vla19wcm9jKF9oYW5kbGUsIChsb25nKW9mZnNldCwgb3JpZ2luKTsKKwl9CisKKyAgICBJTlQ2NCB0ZWxsKCkgeyAKKwkJaWYoc3Vic3RyZWFtKSByZXR1cm4gc3Vic3RyZWFtLT50ZWxsKCk7CisgICAgICAgIHJldHVybiBfaW8tPnRlbGxfcHJvYyhfaGFuZGxlKTsKKyAgICB9CisJCisJSU5UNjQgc2l6ZSgpIHsKKwkJcmV0dXJuIF9mc2l6ZTsKKwl9CisKKyAgICBpbnQgZ2V0X2NoYXIoKSB7IAorCQlpbnQgYyA9IDA7CisJCWlmKHN1YnN0cmVhbSkgcmV0dXJuIHN1YnN0cmVhbS0+Z2V0X2NoYXIoKTsKKwkJaWYoIV9pby0+cmVhZF9wcm9jKCZjLCAxLCAxLCBfaGFuZGxlKSkgcmV0dXJuIC0xOworCQlyZXR1cm4gYzsKKyAgIH0KKwkKKwljaGFyKiBnZXRzKGNoYXIgKmJ1ZmZlciwgaW50IGxlbmd0aCkgeyAKKwkJaWYgKHN1YnN0cmVhbSkgcmV0dXJuIHN1YnN0cmVhbS0+Z2V0cyhidWZmZXIsIGxlbmd0aCk7CisJCW1lbXNldChidWZmZXIsIDAsIGxlbmd0aCk7CisJCWZvcihpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJaWYoIV9pby0+cmVhZF9wcm9jKCZidWZmZXJbaV0sIDEsIDEsIF9oYW5kbGUpKQorCQkJCXJldHVybiBOVUxMOworCQkJaWYoYnVmZmVyW2ldID09IDB4MEEpCisJCQkJYnJlYWs7CisJCX0KKwkJcmV0dXJuIGJ1ZmZlcjsKKwl9CisKKwlpbnQgc2NhbmZfb25lKGNvbnN0IGNoYXIgKmZtdCwgdm9pZCogdmFsKSB7CisJCXN0ZDo6c3RyaW5nIGJ1ZmZlcjsKKwkJY2hhciBlbGVtZW50ID0gMDsKKwkJYm9vbCBiRG9uZSA9IGZhbHNlOworCQlpZihzdWJzdHJlYW0pIHJldHVybiBzdWJzdHJlYW0tPnNjYW5mX29uZShmbXQsdmFsKTsJCQkJCisJCWRvIHsKKwkJCWlmKF9pby0+cmVhZF9wcm9jKCZlbGVtZW50LCAxLCAxLCBfaGFuZGxlKSA9PSAxKSB7CisJCQkJc3dpdGNoKGVsZW1lbnQpIHsKKwkJCQkJY2FzZSAnMCc6CisJCQkJCWNhc2UgJ1xuJzoKKwkJCQkJY2FzZSAnICc6CisJCQkJCWNhc2UgJ1x0JzoKKwkJCQkJCWJEb25lID0gdHJ1ZTsKKwkJCQkJCWJyZWFrOworCQkJCQlkZWZhdWx0OgorCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWJ1ZmZlci5hcHBlbmQoJmVsZW1lbnQsIDEpOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfSB3aGlsZSghYkRvbmUpOworCisJCXJldHVybiBzc2NhbmYoYnVmZmVyLmNfc3RyKCksIGZtdCwgdmFsKTsKKwl9CisKKwlpbnQgZW9mKCkgeyAKKwkJaWYoc3Vic3RyZWFtKSByZXR1cm4gc3Vic3RyZWFtLT5lb2YoKTsKKyAgICAgICAgcmV0dXJuIChfaW8tPnRlbGxfcHJvYyhfaGFuZGxlKSA+PSBfZW9mKTsKKyAgICB9CisKKwl2b2lkICogbWFrZV9qYXNfc3RyZWFtKCkgeworCQlyZXR1cm4gTlVMTDsKKwl9Cit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qKgorQ29udmVydCBhIHByb2Nlc3NlZCByYXcgZGF0YSBhcnJheSB0byBhIEZJQklUTUFQCitAcGFyYW0gUmF3UHJvY2Vzc29yIExpYlJhdyBoYW5kbGUgY29udGFpbmluZyB0aGUgcHJvY2Vzc2VkIHJhdyBpbWFnZQorQHJldHVybiBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgZGliIGlmIHN1Y2Nlc3NmdWxsLCByZXR1cm5zIE5VTEwgb3RoZXJ3aXNlCisqLworc3RhdGljIEZJQklUTUFQICogCitsaWJyYXdfQ29udmVydFByb2Nlc3NlZFJhd1RvRGliKExpYlJhdyAqUmF3UHJvY2Vzc29yKSB7CisJRklCSVRNQVAgKmRpYiA9IE5VTEw7CisgICAgaW50IHdpZHRoLCBoZWlnaHQsIGNvbG9ycywgYnBwOworCisJdHJ5IHsKKwkJaW50IGJnciA9IDA7CS8vIHBpeGVsIGNvcHkgb3JkZXI6IFJHQiBpZiAoYmdyID09IDApIGFuZCBCR1Igb3RoZXJ3aXNlCisKKwkJLy8gZ2V0IGltYWdlIGluZm8KKwkJUmF3UHJvY2Vzc29yLT5nZXRfbWVtX2ltYWdlX2Zvcm1hdCgmd2lkdGgsICZoZWlnaHQsICZjb2xvcnMsICZicHApOworCisJCS8vIG9ubHkgMy1jb2xvciBpbWFnZXMgc3VwcG9ydGVkLi4uCisJCWlmKGNvbG9ycyAhPSAzKSB7CisJCQl0aHJvdyAiTGliUmF3IDogb25seSAzLWNvbG9yIGltYWdlcyBzdXBwb3J0ZWQiOworCQl9CisKKwkJaWYoYnBwID09IDE2KSB7CisJCQkvLyBhbGxvY2F0ZSBvdXRwdXQgZGliCisJCQlkaWIgPSBGcmVlSW1hZ2VfQWxsb2NhdGVUKEZJVF9SR0IxNiwgd2lkdGgsIGhlaWdodCk7CisJCQlpZighZGliKSB7CisJCQkJdGhyb3cgRklfTVNHX0VSUk9SX0RJQl9NRU1PUlk7CisJCQl9CisKKwkJfSBlbHNlIGlmKGJwcCA9PSA4KSB7CisjaWYgRlJFRUlNQUdFX0NPTE9ST1JERVIgPT0gRlJFRUlNQUdFX0NPTE9ST1JERVJfQkdSCisJCQliZ3IgPSAxOwkvLyBvbmx5IHVzZWZ1bCBmb3IgRklUX0JJVE1BUCB0eXBlcworI2VuZGlmCisKKwkJCS8vIGFsbG9jYXRlIG91dHB1dCBkaWIKKwkJCWRpYiA9IEZyZWVJbWFnZV9BbGxvY2F0ZVQoRklUX0JJVE1BUCwgd2lkdGgsIGhlaWdodCwgMjQpOworCQkJaWYoIWRpYikgeworCQkJCXRocm93IEZJX01TR19FUlJPUl9ESUJfTUVNT1JZOworCQkJfQorCQl9CisKKwkJLy8gY29weSBwb3N0LXByb2Nlc3NlZCBiaXRtYXAgZGF0YSBpbnRvIEZJQklUTUFQIGJ1ZmZlcgorCQlpZihSYXdQcm9jZXNzb3ItPmNvcHlfbWVtX2ltYWdlKEZyZWVJbWFnZV9HZXRCaXRzKGRpYiksIEZyZWVJbWFnZV9HZXRQaXRjaChkaWIpLCBiZ3IpICE9IExJQlJBV19TVUNDRVNTKSB7CisJCQl0aHJvdyAiTGliUmF3IDogZmFpbGVkIHRvIGNvcHkgZGF0YSBpbnRvIGRpYiI7CisJCX0KKworCQkvLyBmbGlwIHZlcnRpY2FsbHkKKwkJRnJlZUltYWdlX0ZsaXBWZXJ0aWNhbChkaWIpOworCisJCXJldHVybiBkaWI7CisKKwl9IGNhdGNoKGNvbnN0IGNoYXIgKnRleHQpIHsKKwkJRnJlZUltYWdlX1VubG9hZChkaWIpOworCQlGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2Moc19mb3JtYXRfaWQsIHRleHQpOworCQlyZXR1cm4gTlVMTDsKKwl9Cit9CisKKworLyoqCitDb252ZXJ0IGEgcHJvY2Vzc2VkIHJhdyBpbWFnZSB0byBhIEZJQklUTUFQCitAcGFyYW0gaW1hZ2UgUHJvY2Vzc2VkIHJhdyBpbWFnZQorQHJldHVybiBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgZGliIGlmIHN1Y2Nlc3NmdWxsLCByZXR1cm5zIE5VTEwgb3RoZXJ3aXNlCitAc2VlIGxpYnJhd19Mb2FkRW1iZWRkZWRQcmV2aWV3CisqLworc3RhdGljIEZJQklUTUFQICogCitsaWJyYXdfQ29udmVydFByb2Nlc3NlZEltYWdlVG9EaWIobGlicmF3X3Byb2Nlc3NlZF9pbWFnZV90ICppbWFnZSkgeworCUZJQklUTUFQICpkaWIgPSBOVUxMOworCisJdHJ5IHsKKwkJdW5zaWduZWQgd2lkdGggPSBpbWFnZS0+d2lkdGg7CisJCXVuc2lnbmVkIGhlaWdodCA9IGltYWdlLT5oZWlnaHQ7CisJCXVuc2lnbmVkIGJwcCA9IGltYWdlLT5iaXRzOworCQlpZihicHAgPT0gMTYpIHsKKwkJCS8vIGFsbG9jYXRlIG91dHB1dCBkaWIKKwkJCWRpYiA9IEZyZWVJbWFnZV9BbGxvY2F0ZVQoRklUX1JHQjE2LCB3aWR0aCwgaGVpZ2h0KTsKKwkJCWlmKCFkaWIpIHsKKwkJCQl0aHJvdyBGSV9NU0dfRVJST1JfRElCX01FTU9SWTsKKwkJCX0KKwkJCS8vIHdyaXRlIGRhdGEKKwkJCVdPUkQgKnJhd19kYXRhID0gKFdPUkQqKWltYWdlLT5kYXRhOworCQkJZm9yKHVuc2lnbmVkIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJCQlGSVJHQjE2ICpvdXRwdXQgPSAoRklSR0IxNiopRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgaGVpZ2h0IC0gMSAtIHkpOworCQkJCWZvcih1bnNpZ25lZCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQkJb3V0cHV0W3hdLnJlZCAgID0gcmF3X2RhdGFbMF07CisJCQkJCW91dHB1dFt4XS5ncmVlbiA9IHJhd19kYXRhWzFdOworCQkJCQlvdXRwdXRbeF0uYmx1ZSAgPSByYXdfZGF0YVsyXTsKKwkJCQkJcmF3X2RhdGEgKz0gMzsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSBpZihicHAgPT0gOCkgeworCQkJLy8gYWxsb2NhdGUgb3V0cHV0IGRpYgorCQkJZGliID0gRnJlZUltYWdlX0FsbG9jYXRlVChGSVRfQklUTUFQLCB3aWR0aCwgaGVpZ2h0LCAyNCk7CisJCQlpZighZGliKSB7CisJCQkJdGhyb3cgRklfTVNHX0VSUk9SX0RJQl9NRU1PUlk7CisJCQl9CisJCQkvLyB3cml0ZSBkYXRhCisJCQlCWVRFICpyYXdfZGF0YSA9IChCWVRFKilpbWFnZS0+ZGF0YTsKKwkJCWZvcih1bnNpZ25lZCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisJCQkJUkdCVFJJUExFICpvdXRwdXQgPSAoUkdCVFJJUExFKilGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCBoZWlnaHQgLSAxIC0geSk7CisJCQkJZm9yKHVuc2lnbmVkIHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworCQkJCQlvdXRwdXRbeF0ucmdidFJlZCAgID0gcmF3X2RhdGFbMF07CisJCQkJCW91dHB1dFt4XS5yZ2J0R3JlZW4gPSByYXdfZGF0YVsxXTsKKwkJCQkJb3V0cHV0W3hdLnJnYnRCbHVlICA9IHJhd19kYXRhWzJdOworCQkJCQlyYXdfZGF0YSArPSAzOworCQkJCX0KKwkJCX0KKwkJfQorCQkKKwkJcmV0dXJuIGRpYjsKKworCX0gY2F0Y2goY29uc3QgY2hhciAqdGV4dCkgeworCQlGcmVlSW1hZ2VfVW5sb2FkKGRpYik7CisJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhzX2Zvcm1hdF9pZCwgdGV4dCk7CisJCXJldHVybiBOVUxMOworCX0KK30KKworLyoqIAorR2V0IHRoZSBlbWJlZGRlZCBKUEVHIHByZXZpZXcgaW1hZ2UgZnJvbSBSQVcgcGljdHVyZSB3aXRoIGluY2x1ZGVkIEV4aWYgRGF0YS4gCitAcGFyYW0gUmF3UHJvY2Vzc29yIExpYnJhdyBoYW5kbGUKK0BwYXJhbSBmbGFncyBKUEVHIGxvYWQgZmxhZ3MKK0ByZXR1cm4gUmV0dXJucyB0aGUgbG9hZGVkIGRpYiBpZiBzdWNjZXNzZnVsbCwgcmV0dXJucyBOVUxMIG90aGVyd2lzZQorKi8KK3N0YXRpYyBGSUJJVE1BUCAqIAorbGlicmF3X0xvYWRFbWJlZGRlZFByZXZpZXcoTGliUmF3ICpSYXdQcm9jZXNzb3IsIGludCBmbGFncykgeworCUZJQklUTUFQICpkaWIgPSBOVUxMOworCWxpYnJhd19wcm9jZXNzZWRfaW1hZ2VfdCAqdGh1bWJfaW1hZ2UgPSBOVUxMOworCQorCXRyeSB7CisJCS8vIHVucGFjayBkYXRhCisJCWlmKFJhd1Byb2Nlc3Nvci0+dW5wYWNrX3RodW1iKCkgIT0gTElCUkFXX1NVQ0NFU1MpIHsKKwkJCS8vIHJ1biBzaWxlbnRseSAiTGliUmF3IDogZmFpbGVkIHRvIHJ1biB1bnBhY2tfdGh1bWIiCisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCS8vIHJldHJpZXZlIHRodW1iIGltYWdlCisJCWludCBlcnJvcl9jb2RlID0gMDsKKwkJdGh1bWJfaW1hZ2UgPSBSYXdQcm9jZXNzb3ItPmRjcmF3X21ha2VfbWVtX3RodW1iKCZlcnJvcl9jb2RlKTsKKwkJaWYodGh1bWJfaW1hZ2UpIHsKKwkJCWlmKHRodW1iX2ltYWdlLT50eXBlICE9IExJQlJBV19JTUFHRV9CSVRNQVApIHsKKwkJCQkvLyBhdHRhY2ggdGhlIGJpbmFyeSBkYXRhIHRvIGEgbWVtb3J5IHN0cmVhbQorCQkJCUZJTUVNT1JZICpobWVtID0gRnJlZUltYWdlX09wZW5NZW1vcnkoKEJZVEUqKXRodW1iX2ltYWdlLT5kYXRhLCAoRFdPUkQpdGh1bWJfaW1hZ2UtPmRhdGFfc2l6ZSk7CisJCQkJLy8gZ2V0IHRoZSBmaWxlIHR5cGUKKwkJCQlGUkVFX0lNQUdFX0ZPUk1BVCBmaWYgPSBGcmVlSW1hZ2VfR2V0RmlsZVR5cGVGcm9tTWVtb3J5KGhtZW0sIDApOworCQkJCWlmKGZpZiA9PSBGSUZfSlBFRykgeworCQkJCQkvLyByb3RhdGUgYWNjb3JkaW5nIHRvIEV4aWYgb3JpZW50YXRpb24KKwkJCQkJZmxhZ3MgfD0gSlBFR19FWElGUk9UQVRFOworCQkJCX0KKwkJCQkvLyBsb2FkIGFuIGltYWdlIGZyb20gdGhlIG1lbW9yeSBzdHJlYW0KKwkJCQlkaWIgPSBGcmVlSW1hZ2VfTG9hZEZyb21NZW1vcnkoZmlmLCBobWVtLCBmbGFncyk7CisJCQkJLy8gY2xvc2UgdGhlIHN0cmVhbQorCQkJCUZyZWVJbWFnZV9DbG9zZU1lbW9yeShobWVtKTsKKwkJCX0gZWxzZSBpZigoZmxhZ3MgJiBGSUZfTE9BRF9OT1BJWEVMUykgIT0gRklGX0xPQURfTk9QSVhFTFMpIHsKKwkJCQkvLyBjb252ZXJ0IHByb2Nlc3NlZCBkYXRhIHRvIG91dHB1dCBkaWIKKwkJCQlkaWIgPSBsaWJyYXdfQ29udmVydFByb2Nlc3NlZEltYWdlVG9EaWIodGh1bWJfaW1hZ2UpOworCQkJfQorCQl9IGVsc2UgeworCQkJdGhyb3cgIkxpYlJhdyA6IGZhaWxlZCB0byBydW4gZGNyYXdfbWFrZV9tZW1fdGh1bWIiOworCQl9CisKKwkJLy8gY2xlYW4tdXAgYW5kIHJldHVybgorCQlSYXdQcm9jZXNzb3ItPmRjcmF3X2NsZWFyX21lbSh0aHVtYl9pbWFnZSk7CisKKwkJcmV0dXJuIGRpYjsKKworCX0gY2F0Y2goY29uc3QgY2hhciAqdGV4dCkgeworCQkvLyBjbGVhbi11cCBhbmQgcmV0dXJuCisJCWlmKHRodW1iX2ltYWdlKSB7CisJCQlSYXdQcm9jZXNzb3ItPmRjcmF3X2NsZWFyX21lbSh0aHVtYl9pbWFnZSk7CisJCX0KKwkJaWYodGV4dCAhPSBOVUxMKSB7CisJCQlGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2Moc19mb3JtYXRfaWQsIHRleHQpOworCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisvKioKK0xvYWQgcmF3IGRhdGEgYW5kIGNvbnZlcnQgdG8gRklCSVRNQVAKK0BwYXJhbSBSYXdQcm9jZXNzb3IgTGlicmF3IGhhbmRsZQorQHBhcmFtIGJpdHNwZXJzYW1wbGUgT3V0cHV0IGJpdGRlcHRoICg4LSBvciAxNi1iaXQpCitAcmV0dXJuIFJldHVybnMgdGhlIGxvYWRlZCBkaWIgaWYgc3VjY2Vzc2Z1bGwsIHJldHVybnMgTlVMTCBvdGhlcndpc2UKKyovCitzdGF0aWMgRklCSVRNQVAgKiAKK2xpYnJhd19Mb2FkUmF3RGF0YShMaWJSYXcgKlJhd1Byb2Nlc3NvciwgaW50IGJpdHNwZXJzYW1wbGUpIHsKKwlGSUJJVE1BUCAqZGliID0gTlVMTDsKKworCXRyeSB7CisJCS8vIHNldCBkZWNvZGluZyBwYXJhbWV0ZXJzCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQorCQkvLyAoLTYpIDE2LWJpdCBvciA4LWJpdAorCQlSYXdQcm9jZXNzb3ItPmltZ2RhdGEucGFyYW1zLm91dHB1dF9icHMgPSBiaXRzcGVyc2FtcGxlOworCQkvLyAoLWcgcG93ZXIgdG9lX3Nsb3BlKQorCQlpZihiaXRzcGVyc2FtcGxlID09IDE2KSB7CisJCQkvLyBzZXQgLWcgMSAxIGZvciBsaW5lYXIgY3VydmUKKwkJCVJhd1Byb2Nlc3Nvci0+aW1nZGF0YS5wYXJhbXMuZ2FtbVswXSA9IDE7CisJCQlSYXdQcm9jZXNzb3ItPmltZ2RhdGEucGFyYW1zLmdhbW1bMV0gPSAxOworCQl9IGVsc2UgaWYoYml0c3BlcnNhbXBsZSA9PSA4KSB7CisJCQkvLyBieSBkZWZhdWx0IHNldHRpbmdzIGZvciByZWMuIEJULjcwOSBhcmUgdXNlZDogcG93ZXIgMi4yMjIgKGkuZS4gZ2FtbVswXT0xLzIuMjIyKSBhbmQgc2xvcGUgNC41CisJCQlSYXdQcm9jZXNzb3ItPmltZ2RhdGEucGFyYW1zLmdhbW1bMF0gPSAxLzIuMjIyOworCQkJUmF3UHJvY2Vzc29yLT5pbWdkYXRhLnBhcmFtcy5nYW1tWzFdID0gNC41OworCQl9CisJCS8vICgtVykgRG9uJ3QgdXNlIGF1dG9tYXRpYyBpbmNyZWFzZSBvZiBicmlnaHRuZXNzIGJ5IGhpc3RvZ3JhbQorCQlSYXdQcm9jZXNzb3ItPmltZ2RhdGEucGFyYW1zLm5vX2F1dG9fYnJpZ2h0ID0gMTsKKwkJLy8gKC1hKSBVc2UgYXV0b21hdGljIHdoaXRlIGJhbGFuY2Ugb2J0YWluZWQgYWZ0ZXIgYXZlcmFnaW5nIG92ZXIgdGhlIGVudGlyZSBpbWFnZQorCQlSYXdQcm9jZXNzb3ItPmltZ2RhdGEucGFyYW1zLnVzZV9hdXRvX3diID0gMTsKKwkJLy8gKC1xIDMpIEFkYXB0aXZlIGhvbW9nZW5laXR5LWRpcmVjdGVkIGRlbW9zYWljaW5nIGFsZ29yaXRobSAoQUhEKQorCQlSYXdQcm9jZXNzb3ItPmltZ2RhdGEucGFyYW1zLnVzZXJfcXVhbCA9IDM7CisKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCQkvLyB1bnBhY2sgZGF0YQorCQlpZihSYXdQcm9jZXNzb3ItPnVucGFjaygpICE9IExJQlJBV19TVUNDRVNTKSB7CisJCQl0aHJvdyAiTGliUmF3IDogZmFpbGVkIHRvIHVucGFjayBkYXRhIjsKKwkJfQorCisJCS8vIHByb2Nlc3MgZGF0YSAoLi4uIG1vc3QgY29uc3VtaW5nIHRhc2sgLi4uKQorCQlpZihSYXdQcm9jZXNzb3ItPmRjcmF3X3Byb2Nlc3MoKSAhPSBMSUJSQVdfU1VDQ0VTUykgeworCQkJdGhyb3cgIkxpYlJhdyA6IGZhaWxlZCB0byBwcm9jZXNzIGRhdGEiOworCQl9CisKKwkJLy8gcmV0cmlldmUgcHJvY2Vzc2VkIGltYWdlCisJCWRpYiA9IGxpYnJhd19Db252ZXJ0UHJvY2Vzc2VkUmF3VG9EaWIoUmF3UHJvY2Vzc29yKTsKKwkKKwkJcmV0dXJuIGRpYjsKKworCX0gY2F0Y2goY29uc3QgY2hhciAqdGV4dCkgeworCQlGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2Moc19mb3JtYXRfaWQsIHRleHQpOworCQlyZXR1cm4gTlVMTDsKKwl9Cit9CisKKy8qKgorTG9hZCB0aGUgQmF5ZXIgbWF0cml4ICh1bnByb2Nlc3NlZCByYXcgZGF0YSkgYXMgYSBGSVRfVUlOVDE2IGltYWdlLiAKK05vdGUgdGhhdCBzb21lIGZvcm1hdHMgZG9uJ3QgaGF2ZSBhIEJheWVyIG1hdHJpeCAoZS5nLiBGb3Zlb24sIENhbm9uIHNSQVcsIGRlbW9zYWljZWQgRE5HIGZpbGVzKS4gCitAcGFyYW0gUmF3UHJvY2Vzc29yIExpYnJhdyBoYW5kbGUKK0ByZXR1cm4gUmV0dXJucyB0aGUgbG9hZGVkIGRpYiBpZiBzdWNjZXNzZnVsbCwgcmV0dXJucyBOVUxMIG90aGVyd2lzZQorKi8KK3N0YXRpYyBGSUJJVE1BUCAqIAorbGlicmF3X0xvYWRVbnByb2Nlc3NlZERhdGEoTGliUmF3ICpSYXdQcm9jZXNzb3IpIHsKKwlGSUJJVE1BUCAqZGliID0gTlVMTDsKKworCXRyeSB7CisJCS8vIHVucGFjayBkYXRhCisJCWlmKFJhd1Byb2Nlc3Nvci0+dW5wYWNrKCkgIT0gTElCUkFXX1NVQ0NFU1MpIHsKKwkJCXRocm93ICJMaWJSYXcgOiBmYWlsZWQgdG8gdW5wYWNrIGRhdGEiOworCQl9CisKKwkJLy8gY2hlY2sgZm9yIGEgc3VwcG9ydGVkIEJheWVyIGZvcm1hdAorCQlpZighKFJhd1Byb2Nlc3Nvci0+aW1nZGF0YS5pZGF0YS5maWx0ZXJzIHx8IFJhd1Byb2Nlc3Nvci0+aW1nZGF0YS5pZGF0YS5jb2xvcnMgPT0gMSkpIHsKKwkJCXRocm93ICJMaWJSYXcgOiBvbmx5IEJheWVyLXBhdHRlcm4gUkFXIGZpbGVzIGFyZSBzdXBwb3J0ZWQiOworCQl9CisKKwkJLy8gYWxsb2NhdGUgb3V0cHV0IGRpYgorCQljb25zdCB1bnNpZ25lZCB3aWR0aCA9IFJhd1Byb2Nlc3Nvci0+aW1nZGF0YS5zaXplcy5yYXdfd2lkdGg7CisJCWNvbnN0IHVuc2lnbmVkIGhlaWdodCA9IFJhd1Byb2Nlc3Nvci0+aW1nZGF0YS5zaXplcy5yYXdfaGVpZ2h0OworCQljb25zdCBzaXplX3QgbGluZV9zaXplID0gd2lkdGggKiBzaXplb2YoV09SRCk7CisJCWNvbnN0IFdPUkQgKnNyY19iaXRzID0gKFdPUkQqKVJhd1Byb2Nlc3Nvci0+aW1nZGF0YS5yYXdkYXRhLnJhd19pbWFnZTsKKworCQlpZihzcmNfYml0cykgeworCQkJZGliID0gRnJlZUltYWdlX0FsbG9jYXRlVChGSVRfVUlOVDE2LCB3aWR0aCwgaGVpZ2h0KTsKKwkJfQorCQlpZighZGliKSB7CisJCQl0aHJvdyBGSV9NU0dfRVJST1JfRElCX01FTU9SWTsKKwkJfQorCisJCS8vIHJldHJpZXZlIHRoZSByYXcgaW1hZ2UKKwkJZm9yKHVuc2lnbmVkIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJCVdPUkQgKmRzdF9iaXRzID0gKFdPUkQqKUZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIGhlaWdodCAtIDEgLSB5KTsKKwkJCW1lbWNweShkc3RfYml0cywgc3JjX2JpdHMsIGxpbmVfc2l6ZSk7CisJCQlzcmNfYml0cyArPSB3aWR0aDsKKwkJfQorCisJCS8vIHN0b3JlIG1ldGFkYXRhIG5lZWRlZCBmb3IgcG9zdC1wcm9jZXNzaW5nCisJCXsKKwkJCWNoYXIgdmFsdWVbNTEyXTsKKworCQkJY29uc3QgbGlicmF3X2ltYWdlX3NpemVzX3QgKnNpemVzID0gJlJhd1Byb2Nlc3Nvci0+aW1nZGF0YS5zaXplczsKKworCQkJLy8gaW1hZ2Ugb3V0cHV0IHdpZHRoICYgaGVpZ2h0CisJCQl7CisJCQkJc3ByaW50Zih2YWx1ZSwgIiVkIiwgc2l6ZXMtPml3aWR0aCk7CisJCQkJRnJlZUltYWdlX1NldE1ldGFkYXRhS2V5VmFsdWUoRklNRF9DT01NRU5UUywgZGliLCAiUmF3Lk91dHB1dC5XaWR0aCIsIHZhbHVlKTsKKwkJCQkKKwkJCQlzcHJpbnRmKHZhbHVlLCAiJWQiLCBzaXplcy0+aWhlaWdodCk7CisJCQkJRnJlZUltYWdlX1NldE1ldGFkYXRhS2V5VmFsdWUoRklNRF9DT01NRU5UUywgZGliLCAiUmF3Lk91dHB1dC5IZWlnaHQiLCB2YWx1ZSk7CisJCQl9CisKKwkJCS8vIGltYWdlIG91dHB1dCBmcmFtZQorCQkJeworCQkJCWNvbnN0IHVuc2lnbmVkIGZfbGVmdCA9IHNpemVzLT5sZWZ0X21hcmdpbjsKKwkJCQljb25zdCB1bnNpZ25lZCBmX3RvcCA9IHNpemVzLT50b3BfbWFyZ2luOworCQkJCWNvbnN0IHVuc2lnbmVkIGZfd2lkdGggPSBzaXplcy0+d2lkdGg7CisJCQkJY29uc3QgdW5zaWduZWQgZl9oZWlnaHQgPSBzaXplcy0+aGVpZ2h0OworCQkJCQorCQkJCXNwcmludGYodmFsdWUsICIlZCIsIGZfbGVmdCk7CisJCQkJRnJlZUltYWdlX1NldE1ldGFkYXRhS2V5VmFsdWUoRklNRF9DT01NRU5UUywgZGliLCAiUmF3LkZyYW1lLkxlZnQiLCB2YWx1ZSk7CisKKwkJCQlzcHJpbnRmKHZhbHVlLCAiJWQiLCBmX3RvcCk7CisJCQkJRnJlZUltYWdlX1NldE1ldGFkYXRhS2V5VmFsdWUoRklNRF9DT01NRU5UUywgZGliLCAiUmF3LkZyYW1lLlRvcCIsIHZhbHVlKTsKKworCQkJCXNwcmludGYodmFsdWUsICIlZCIsIGZfd2lkdGgpOworCQkJCUZyZWVJbWFnZV9TZXRNZXRhZGF0YUtleVZhbHVlKEZJTURfQ09NTUVOVFMsIGRpYiwgIlJhdy5GcmFtZS5XaWR0aCIsIHZhbHVlKTsKKworCQkJCXNwcmludGYodmFsdWUsICIlZCIsIGZfaGVpZ2h0KTsKKwkJCQlGcmVlSW1hZ2VfU2V0TWV0YWRhdGFLZXlWYWx1ZShGSU1EX0NPTU1FTlRTLCBkaWIsICJSYXcuRnJhbWUuSGVpZ2h0IiwgdmFsdWUpOworCQkJfQorCisJCQkvLyBCYXllciBwYXR0ZXJuCisJCQkvLyBNYXNrIGRlc2NyaWJpbmcgdGhlIG9yZGVyIG9mIGNvbG9yIHBpeGVscyBpbiB0aGUgbWF0cml4LiAKKwkJCS8vIFRoaXMgZmllbGQgZGVzY3JpYmUgMTYgcGl4ZWxzICg4IHJvd3Mgd2l0aCB0d28gcGl4ZWxzIGluIGVhY2gsIGZyb20gbGVmdCB0byByaWdodCBhbmQgZnJvbSB0b3AgdG8gYm90dG9tKS4gCisKKwkJCWlmKFJhd1Byb2Nlc3Nvci0+aW1nZGF0YS5pZGF0YS5maWx0ZXJzKSB7CisJCQkJLy8gZGVzY3JpcHRpb24gb2YgY29sb3JzIG51bWJlcmVkIGZyb20gMCB0byAzIChSR0JHLFJHQkUsR01DWSwgb3IgR0JURykKKwkJCQljaGFyICpjZGVzYyA9IFJhd1Byb2Nlc3Nvci0+aW1nZGF0YS5pZGF0YS5jZGVzYzsKKwkJCQlpZighY2Rlc2NbM10pIHsKKwkJCQkJY2Rlc2NbM10gPSAnRyc7CisJCQkJfQorCQkJCWNoYXIgKnBhdHRlcm4gPSAmdmFsdWVbMF07CisJCQkJZm9yKGludCBpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJCQkJcGF0dGVybltpXSA9IGNkZXNjWyBSYXdQcm9jZXNzb3ItPmZjb2woaSA+PiAxLCBpICYgMSkgXTsKKwkJCQl9CisJCQkJcGF0dGVyblsxNl0gPSAwOworCisJCQkJRnJlZUltYWdlX1NldE1ldGFkYXRhS2V5VmFsdWUoRklNRF9DT01NRU5UUywgZGliLCAiUmF3LkJheWVyUGF0dGVybiIsIHZhbHVlKTsKKwkJCX0KKwkJfQorCQorCQlyZXR1cm4gZGliOworCisJfSBjYXRjaChjb25zdCBjaGFyICp0ZXh0KSB7CisJCUZyZWVJbWFnZV9VbmxvYWQoZGliKTsKKwkJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKHNfZm9ybWF0X2lkLCB0ZXh0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBQbHVnaW4gSW1wbGVtZW50YXRpb24KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKK0Zvcm1hdCgpIHsKKwlyZXR1cm4gIlJBVyI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCitEZXNjcmlwdGlvbigpIHsKKwlyZXR1cm4gIlJBVyBjYW1lcmEgaW1hZ2UiOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgorRXh0ZW5zaW9uKCkgeworCS8qKgorCUJlbG93IGFyZSBrbm93biBSQVcgZmlsZSBleHRlbnNpb25zIHRoYXQgeW91IGNhbiBjaGVjayB1c2luZyBGcmVlSW1hZ2VfR2V0RklGRnJvbUZvcm1hdC4gCisJSWYgYSBmaWxlIGV4dGVuc2lvbiBpcyBub3QgbGlzdGVkLCB0aGF0IGRvZXNuJ3QgbWVhbiB0aGF0IHlvdSBjYW5ub3QgbG9hZCBpdC4gCisJVXNpbmcgRnJlZUltYWdlX0dldEZpbGVUeXBlIGlzIHRoZSBiZXN0IHdheSB0byBrbm93IGlmIGEgUkFXIGZpbGUgZm9ybWF0IGlzIHN1cHBvcnRlZC4gCisJKi8KKwlzdGF0aWMgY29uc3QgY2hhciAqcmF3X2V4dGVuc2lvbnMgPSAKKwkJIjNmciwiICAgLy8gSGFzc2VsYmxhZCBEaWdpdGFsIENhbWVyYSBSYXcgSW1hZ2UgRm9ybWF0LgorCQkiYXJ3LCIgICAvLyBTb255IERpZ2l0YWwgQ2FtZXJhIFJhdyBJbWFnZSBGb3JtYXQgZm9yIEFscGhhIGRldmljZXMuCisJCSJiYXksIiAgIC8vIENhc2lvIERpZ2l0YWwgQ2FtZXJhIFJhdyBGaWxlIEZvcm1hdC4KKwkJImJtcSwiICAgLy8gTnVDb3JlIFJhdyBJbWFnZSBGaWxlLgorCQkiY2FwLCIgICAvLyBQaGFzZSBPbmUgRGlnaXRhbCBDYW1lcmEgUmF3IEltYWdlIEZvcm1hdC4KKwkJImNpbmUsIiAgLy8gUGhhbnRvbSBTb2Z0d2FyZSBSYXcgSW1hZ2UgRmlsZS4KKwkJImNyMiwiICAgLy8gQ2Fub24gRGlnaXRhbCBDYW1lcmEgUkFXIEltYWdlIEZvcm1hdCB2ZXJzaW9uIDIuMC4gVGhlc2UgaW1hZ2VzIGFyZSBiYXNlZCBvbiB0aGUgVElGRiBpbWFnZSBzdGFuZGFyZC4KKwkJImNydywiICAgLy8gQ2Fub24gRGlnaXRhbCBDYW1lcmEgUkFXIEltYWdlIEZvcm1hdCB2ZXJzaW9uIDEuMC4gCisJCSJjczEsIiAgIC8vIFNpbmFyIENhcHR1cmUgU2hvcCBSYXcgSW1hZ2UgRmlsZS4KKwkJImRjMiwiICAgLy8gS29kYWsgREMyNSBEaWdpdGFsIENhbWVyYSBGaWxlLgorCQkiZGNyLCIgICAvLyBLb2RhayBEaWdpdGFsIENhbWVyYSBSYXcgSW1hZ2UgRm9ybWF0IGZvciB0aGVzZSBtb2RlbHM6IEtvZGFrIERTQyBQcm8gU0xSL2MsIEtvZGFrIERTQyBQcm8gU0xSL24sIEtvZGFrIERTQyBQcm8gMTROLCBLb2RhayBEU0MgUFJPIDE0bnguCisJCSJkcmYsIiAgIC8vIEtvZGFrIERpZ2l0YWwgQ2FtZXJhIFJhdyBJbWFnZSBGb3JtYXQuCisJCSJkc2MsIiAgIC8vIEtvZGFrIERpZ2l0YWwgQ2FtZXJhIFJhdyBJbWFnZSBGb3JtYXQuCisJCSJkbmcsIiAgIC8vIEFkb2JlIERpZ2l0YWwgTmVnYXRpdmU6IERORyBpcyBwdWJsaWNseSBhdmFpbGFibGUgYXJjaGl2YWwgZm9ybWF0IGZvciB0aGUgcmF3IGZpbGVzIGdlbmVyYXRlZCBieSBkaWdpdGFsIGNhbWVyYXMuIEJ5IGFkZHJlc3NpbmcgdGhlIGxhY2sgb2YgYW4gb3BlbiBzdGFuZGFyZCBmb3IgdGhlIHJhdyBmaWxlcyBjcmVhdGVkIGJ5IGluZGl2aWR1YWwgY2FtZXJhIG1vZGVscywgRE5HIGhlbHBzIGVuc3VyZSB0aGF0IHBob3RvZ3JhcGhlcnMgd2lsbCBiZSBhYmxlIHRvIGFjY2VzcyB0aGVpciBmaWxlcyBpbiB0aGUgZnV0dXJlLiAKKwkJImVyZiwiICAgLy8gRXBzb24gRGlnaXRhbCBDYW1lcmEgUmF3IEltYWdlIEZvcm1hdC4KKwkJImZmZiwiICAgLy8gSW1hY29uIERpZ2l0YWwgQ2FtZXJhIFJhdyBJbWFnZSBGb3JtYXQuCisJCSJpYSwiICAgIC8vIFNpbmFyIFJhdyBJbWFnZSBGaWxlLgorCQkiaWlxLCIgICAvLyBQaGFzZSBPbmUgRGlnaXRhbCBDYW1lcmEgUmF3IEltYWdlIEZvcm1hdC4KKwkJImsyNSwiICAgLy8gS29kYWsgREMyNSBEaWdpdGFsIENhbWVyYSBSYXcgSW1hZ2UgRm9ybWF0LgorCQkia2MyLCIgICAvLyBLb2RhayBEQ1MyMDAgRGlnaXRhbCBDYW1lcmEgUmF3IEltYWdlIEZvcm1hdC4KKwkJImtkYywiICAgLy8gS29kYWsgRGlnaXRhbCBDYW1lcmEgUmF3IEltYWdlIEZvcm1hdC4KKwkJIm1kYywiICAgLy8gTWlub2x0YSBSRDE3NSBEaWdpdGFsIENhbWVyYSBSYXcgSW1hZ2UgRm9ybWF0LgorCQkibWVmLCIgICAvLyBNYW1peWEgRGlnaXRhbCBDYW1lcmEgUmF3IEltYWdlIEZvcm1hdC4KKwkJIm1vcywiICAgLy8gTGVhZiBSYXcgSW1hZ2UgRmlsZS4KKwkJIm1ydywiICAgLy8gTWlub2x0YSBEaW1hZ2UgRGlnaXRhbCBDYW1lcmEgUmF3IEltYWdlIEZvcm1hdC4KKwkJIm5lZiwiICAgLy8gTmlrb24gRGlnaXRhbCBDYW1lcmEgUmF3IEltYWdlIEZvcm1hdC4KKwkJIm5ydywiICAgLy8gTmlrb24gRGlnaXRhbCBDYW1lcmEgUmF3IEltYWdlIEZvcm1hdC4KKwkJIm9yZiwiICAgLy8gT2x5bXB1cyBEaWdpdGFsIENhbWVyYSBSYXcgSW1hZ2UgRm9ybWF0LgorCQkicGVmLCIgICAvLyBQZW50YXggRGlnaXRhbCBDYW1lcmEgUmF3IEltYWdlIEZvcm1hdC4KKwkJInB0eCwiICAgLy8gUGVudGF4IERpZ2l0YWwgQ2FtZXJhIFJhdyBJbWFnZSBGb3JtYXQuCisJCSJweG4sIiAgIC8vIExvZ2l0ZWNoIERpZ2l0YWwgQ2FtZXJhIFJhdyBJbWFnZSBGb3JtYXQuCisJCSJxdGssIiAgIC8vIEFwcGxlIFF1aWNrdGFrZSAxMDAvMTUwIERpZ2l0YWwgQ2FtZXJhIFJhdyBJbWFnZSBGb3JtYXQuCisJCSJyYWYsIiAgIC8vIEZ1amkgRGlnaXRhbCBDYW1lcmEgUmF3IEltYWdlIEZvcm1hdC4KKwkJInJhdywiICAgLy8gUGFuYXNvbmljIERpZ2l0YWwgQ2FtZXJhIEltYWdlIEZvcm1hdC4KKwkJInJkYywiICAgLy8gRGlnaXRhbCBGb3RvIE1ha2VyIFJhdyBJbWFnZSBGaWxlLgorCQkicncyLCIgICAvLyBQYW5hc29uaWMgTFgzIERpZ2l0YWwgQ2FtZXJhIFJhdyBJbWFnZSBGb3JtYXQuCisJCSJyd2wsIgkgLy8gTGVpY2EgQ2FtZXJhIFJhdyBJbWFnZSBGb3JtYXQuCisJCSJyd3osIiAgIC8vIFJhd3pvciBEaWdpdGFsIENhbWVyYSBSYXcgSW1hZ2UgRm9ybWF0LgorCQkic3IyLCIgICAvLyBTb255IERpZ2l0YWwgQ2FtZXJhIFJhdyBJbWFnZSBGb3JtYXQuCisJCSJzcmYsIiAgIC8vIFNvbnkgRGlnaXRhbCBDYW1lcmEgUmF3IEltYWdlIEZvcm1hdCBmb3IgRFNDLUY4MjggOCBtZWdhcGl4ZWwgZGlnaXRhbCBjYW1lcmEgb3IgU29ueSBEU0MtUjEuCisJCSJzcncsIiAgIC8vIFNhbXN1bmcgUmF3IEltYWdlIEZvcm1hdC4KKwkJInN0aSwiICAgLy8gU2luYXIgQ2FwdHVyZSBTaG9wIFJhdyBJbWFnZSBGaWxlLgorCQkieDNmIjsgICAvLyBTaWdtYSBEaWdpdGFsIENhbWVyYSBSYXcgSW1hZ2UgRm9ybWF0IGZvciBkZXZpY2VzIGJhc2VkIG9uIEZvdmVvbiBYMyBkaXJlY3QgaW1hZ2Ugc2Vuc29yLgorCXJldHVybiByYXdfZXh0ZW5zaW9uczsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKK1JlZ0V4cHIoKSB7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCitNaW1lVHlwZSgpIHsKKwlyZXR1cm4gImltYWdlL3gtZGNyYXciOworfQorCitzdGF0aWMgQk9PTCAKK0hhc01hZ2ljSGVhZGVyKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSkgeworCWNvbnN0IHVuc2lnbmVkIHNpZ25hdHVyZV9zaXplID0gMzI7CisJQllURSBzaWduYXR1cmVbc2lnbmF0dXJlX3NpemVdID0geyAwIH07CisJLyoKKwlub3RlOiBjbGFzc2ljIFRJRkYgc2lnbmF0dXJlIGlzCisJeyAweDQ5LCAweDQ5LCAweDJBLCAweDAwIH0gQ2xhc3NpYyBUSUZGLCBsaXR0bGUtZW5kaWFuCisJeyAweDRELCAweDRELCAweDAwLCAweDJBIH0gQ2xhc3NpYyBUSUZGLCBiaWctZW5kaWFuCisJKi8KKwkvLyBDYW5vbiAoQ1IyKSwgbGl0dGxlLWVuZGlhbiBieXRlIG9yZGVyCisJY29uc3QgQllURSBDUjJfSUlbXSA9IHsgMHg0OSwgMHg0OSwgMHgyQSwgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MywgMHg1MiwgMHgwMiwgMHgwMCB9OworCS8vIENhbm9uIChDUlcpLCBsaXR0bGUtZW5kaWFuIGJ5dGUgb3JkZXIKKwljb25zdCBCWVRFIENSV19JSVtdID0geyAweDQ5LCAweDQ5LCAweDFBLCAweDAwLCAweDAwLCAweDAwLCAweDQ4LCAweDQ1LCAweDQxLCAweDUwLCAweDQzLCAweDQzLCAweDQ0LCAweDUyLCAweDAyLCAweDAwIH07CisJLy8gTWlub2x0YSAoTVJXKQorCWNvbnN0IEJZVEUgTVJXW10gPSB7IDB4MDAsIDB4NEQsIDB4NTIsIDB4NEQsIDB4MDAgfTsKKwkvLyBPbHltcHVzIChPUkYpLCBsaXR0bGUtZW5kaWFuIGJ5dGUgb3JkZXIKKwljb25zdCBCWVRFIE9SRl9JSVJTW10gPSB7IDB4NDksIDB4NDksIDB4NTIsIDB4NTMsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAgfTsgCisJY29uc3QgQllURSBPUkZfSUlST1tdID0geyAweDQ5LCAweDQ5LCAweDUyLCAweDRGLCAweDA4LCAweDAwLCAweDAwLCAweDAwIH07IAorCS8vIE9seW1wdXMgKE9SRiksIGJpZy1lbmRpYW4gYnl0ZSBvcmRlcgorCWNvbnN0IEJZVEUgT1JGX01NT1JbXSA9IHsgMHg0RCwgMHg0RCwgMHg0RiwgMHg1MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwOCB9OyAKKwkvLyBGdWppZmlsbSAoUkFGKQorCWNvbnN0IEJZVEUgUkFGW10gPSB7IDB4NDYsIDB4NTUsIDB4NEEsIDB4NDksIDB4NDYsIDB4NDksIDB4NEMsIDB4NEQsIDB4NDMsIDB4NDMsIDB4NDQsIDB4MkQsIDB4NTIsIDB4NDEsIDB4NTcsIDB4MjAgfTsKKwkvLyBQYW5hc29uaWMgKFJXMikgb3IgTGVpY2EgKFJXTCksIGxpdHRsZS1lbmRpYW4gYnl0ZSBvcmRlcgorCWNvbnN0IEJZVEUgUld4X0lJW10gPSB7IDB4NDksIDB4NDksIDB4NTUsIDB4MDAsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODgsIDB4RTcsIDB4NzQsIDB4RDgsIDB4RjgsIDB4MjUsIDB4MUQsIDB4NEQsIDB4OTQsIDB4N0EsIDB4NkUsIDB4NzcsIDB4ODIsIDB4MkIsIDB4NUQsIDB4NkEgfTsKKwkvLyBQYW5hc29uaWMgKFJBVykgb3IgTGVpY2EgKFJBVyksIGxpdHRsZS1lbmRpYW4gYnl0ZSBvcmRlcgorCWNvbnN0IEJZVEUgUkFXX0lJW10gPSB7IDB4NDksIDB4NDksIDB4NTUsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAgfTsKKwkvLyBGb3Zlb24gKFgzRikKKwljb25zdCBCWVRFIFgzRltdID0geyAweDQ2LCAweDRGLCAweDU2LCAweDYyIH07CisKKwlpZihpby0+cmVhZF9wcm9jKHNpZ25hdHVyZSwgMSwgc2lnbmF0dXJlX3NpemUsIGhhbmRsZSkgIT0gc2lnbmF0dXJlX3NpemUpIHsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwlpZihtZW1jbXAoQ1IyX0lJLCBzaWduYXR1cmUsIDEyKSA9PSAwKQorCQlyZXR1cm4gVFJVRTsKKwlpZihtZW1jbXAoQ1JXX0lJLCBzaWduYXR1cmUsIDE2KSA9PSAwKQorCQlyZXR1cm4gVFJVRTsKKwlpZihtZW1jbXAoTVJXLCBzaWduYXR1cmUsIDUpID09IDApCisJCXJldHVybiBUUlVFOworCWlmKG1lbWNtcChPUkZfSUlSUywgc2lnbmF0dXJlLCA4KSA9PSAwKQorCQlyZXR1cm4gVFJVRTsKKwlpZihtZW1jbXAoT1JGX0lJUk8sIHNpZ25hdHVyZSwgOCkgPT0gMCkKKwkJcmV0dXJuIFRSVUU7CisJaWYobWVtY21wKE9SRl9NTU9SLCBzaWduYXR1cmUsIDgpID09IDApCisJCXJldHVybiBUUlVFOworCWlmKG1lbWNtcChSQUYsIHNpZ25hdHVyZSwgMTYpID09IDApCisJCXJldHVybiBUUlVFOworCWlmKG1lbWNtcChSV3hfSUksIHNpZ25hdHVyZSwgMjQpID09IDApCisJCXJldHVybiBUUlVFOworCWlmKG1lbWNtcChSQVdfSUksIHNpZ25hdHVyZSwgMTgpID09IDApCisJCXJldHVybiBUUlVFOworCWlmKG1lbWNtcChYM0YsIHNpZ25hdHVyZSwgNCkgPT0gMCkKKwkJcmV0dXJuIFRSVUU7CisKKwlyZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBCT09MIERMTF9DQUxMQ09OVgorVmFsaWRhdGUoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlKSB7CisJLy8gc29tZSBSQVcgZmlsZXMgaGF2ZSBhIG1hZ2ljIHNpZ25hdHVyZSAobW9zdCBvZiB0aGVtIGhhdmUgYSBUSUZGIHNpZ25hdHVyZSkKKwkvLyB0cnkgdG8gY2hlY2sgdGhpcyBpbiBvcmRlciB0byBzcGVlZCB1cCB0aGUgZmlsZSBpZGVudGlmaWNhdGlvbgorCXsKKwkJbG9uZyB0ZWxsID0gaW8tPnRlbGxfcHJvYyhoYW5kbGUpOworCQlpZiggSGFzTWFnaWNIZWFkZXIoaW8sIGhhbmRsZSkgKSB7CisJCQlyZXR1cm4gVFJVRTsKKwkJfSBlbHNlIHsKKwkJCWlvLT5zZWVrX3Byb2MoaGFuZGxlLCB0ZWxsLCBTRUVLX1NFVCk7CisJCX0KKwl9CisKKwkvLyBubyBtYWdpYyBzaWduYXR1cmUgOiB3ZSBuZWVkIHRvIG9wZW4gdGhlIGZpbGUgKGl0IHdpbGwgdGFrZSBtb3JlIHRpbWUgdG8gaWRlbnRpZnkgaXQpCisJLy8gZG8gbm90IGRlY2xhcmUgUmF3UHJvY2Vzc29yIG9uIHRoZSBzdGFjayBhcyBpdCBtYXkgYmUgaHVnZSAoMzAwIEtCKQorCXsKKwkJTGliUmF3ICpSYXdQcm9jZXNzb3IgPSBuZXcoc3RkOjpub3Rocm93KSBMaWJSYXc7CisKKwkJaWYoUmF3UHJvY2Vzc29yKSB7CisJCQlCT09MIGJTdWNjZXNzID0gVFJVRTsKKworCQkJLy8gd3JhcCB0aGUgaW5wdXQgZGF0YXN0cmVhbQorCQkJTGliUmF3X2ZyZWVpbWFnZV9kYXRhc3RyZWFtIGRhdGFzdHJlYW0oaW8sIGhhbmRsZSk7CisKKwkJCS8vIG9wZW4gdGhlIGRhdGFzdHJlYW0KKwkJCWlmKFJhd1Byb2Nlc3Nvci0+b3Blbl9kYXRhc3RyZWFtKCZkYXRhc3RyZWFtKSAhPSBMSUJSQVdfU1VDQ0VTUykgeworCQkJCWJTdWNjZXNzID0gRkFMU0U7CS8vIExpYlJhdyA6IGZhaWxlZCB0byBvcGVuIGlucHV0IHN0cmVhbSAodW5rbm93biBmb3JtYXQpCisJCQl9CisKKwkJCS8vIGNsZWFuLXVwIGludGVybmFsIG1lbW9yeSBhbGxvY2F0aW9ucworCQkJUmF3UHJvY2Vzc29yLT5yZWN5Y2xlKCk7CisJCQlkZWxldGUgUmF3UHJvY2Vzc29yOworCisJCQlyZXR1cm4gYlN1Y2Nlc3M7CisJCX0KKwl9CisKKwlyZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBCT09MIERMTF9DQUxMQ09OVgorU3VwcG9ydHNFeHBvcnREZXB0aChpbnQgZGVwdGgpIHsKKwlyZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBCT09MIERMTF9DQUxMQ09OViAKK1N1cHBvcnRzRXhwb3J0VHlwZShGUkVFX0lNQUdFX1RZUEUgdHlwZSkgeworCXJldHVybiBGQUxTRTsKK30KKworc3RhdGljIEJPT0wgRExMX0NBTExDT05WCitTdXBwb3J0c0lDQ1Byb2ZpbGVzKCkgeworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYKK1N1cHBvcnRzTm9QaXhlbHMoKSB7CisJcmV0dXJuIFRSVUU7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIEZJQklUTUFQICogRExMX0NBTExDT05WCitMb2FkKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSwgaW50IHBhZ2UsIGludCBmbGFncywgdm9pZCAqZGF0YSkgeworCUZJQklUTUFQICpkaWIgPSBOVUxMOworCUxpYlJhdyAqUmF3UHJvY2Vzc29yID0gTlVMTDsKKworCUJPT0wgaGVhZGVyX29ubHkgPSAoZmxhZ3MgJiBGSUZfTE9BRF9OT1BJWEVMUykgPT0gRklGX0xPQURfTk9QSVhFTFM7CisKKwl0cnkgeworCQkvLyBkbyBub3QgZGVjbGFyZSBSYXdQcm9jZXNzb3Igb24gdGhlIHN0YWNrIGFzIGl0IG1heSBiZSBodWdlICgzMDAgS0IpCisJCVJhd1Byb2Nlc3NvciA9IG5ldyhzdGQ6Om5vdGhyb3cpIExpYlJhdzsKKwkJaWYoIVJhd1Byb2Nlc3NvcikgeworCQkJdGhyb3cgRklfTVNHX0VSUk9SX01FTU9SWTsKKwkJfQorCisJCS8vIHdyYXAgdGhlIGlucHV0IGRhdGFzdHJlYW0KKwkJTGliUmF3X2ZyZWVpbWFnZV9kYXRhc3RyZWFtIGRhdGFzdHJlYW0oaW8sIGhhbmRsZSk7CisKKwkJLy8gc2V0IGRlY29kaW5nIHBhcmFtZXRlcnMKKwkJLy8gdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGFmZmVjdCBkYXRhIHJlYWRpbmcKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCQkvLyAoLXMgWzAuLk4tMV0pIFNlbGVjdCBvbmUgcmF3IGltYWdlIGZyb20gaW5wdXQgZmlsZQorCQlSYXdQcm9jZXNzb3ItPmltZ2RhdGEucGFyYW1zLnNob3Rfc2VsZWN0ID0gMDsKKwkJLy8gKC13KSBVc2UgY2FtZXJhIHdoaXRlIGJhbGFuY2UsIGlmIHBvc3NpYmxlIChvdGhlcndpc2UsIGZhbGxiYWNrIHRvIGF1dG9fd2IpCisJCVJhd1Byb2Nlc3Nvci0+aW1nZGF0YS5wYXJhbXMudXNlX2NhbWVyYV93YiA9IDE7CisJCS8vICgtTSkgVXNlIGFueSBjb2xvciBtYXRyaXggZnJvbSB0aGUgY2FtZXJhIG1ldGFkYXRhLiBUaGlzIG9wdGlvbiBvbmx5IGFmZmVjdHMgT2x5bXB1cywgTGVhZiwgYW5kIFBoYXNlIE9uZSBjYW1lcmFzLgorCQlSYXdQcm9jZXNzb3ItPmltZ2RhdGEucGFyYW1zLnVzZV9jYW1lcmFfbWF0cml4ID0gMTsKKwkJLy8gKC1oKSBvdXRwdXRzIHRoZSBpbWFnZSBpbiA1MCUgc2l6ZQorCQlSYXdQcm9jZXNzb3ItPmltZ2RhdGEucGFyYW1zLmhhbGZfc2l6ZSA9ICgoZmxhZ3MgJiBSQVdfSEFMRlNJWkUpID09IFJBV19IQUxGU0laRSkgPyAxIDogMDsKKworCQkvLyBvcGVuIHRoZSBkYXRhc3RyZWFtCisJCWlmKFJhd1Byb2Nlc3Nvci0+b3Blbl9kYXRhc3RyZWFtKCZkYXRhc3RyZWFtKSAhPSBMSUJSQVdfU1VDQ0VTUykgeworCQkJdGhyb3cgIkxpYlJhdyA6IGZhaWxlZCB0byBvcGVuIGlucHV0IHN0cmVhbSAodW5rbm93biBmb3JtYXQpIjsKKwkJfQorCisJCWlmKGhlYWRlcl9vbmx5KSB7CisJCQkvLyBoZWFkZXIgb25seSBtb2RlCisJCQlkaWIgPSBGcmVlSW1hZ2VfQWxsb2NhdGVIZWFkZXJUKGhlYWRlcl9vbmx5LCBGSVRfUkdCMTYsIFJhd1Byb2Nlc3Nvci0+aW1nZGF0YS5zaXplcy53aWR0aCwgUmF3UHJvY2Vzc29yLT5pbWdkYXRhLnNpemVzLmhlaWdodCk7CisJCX0KKwkJZWxzZSBpZigoZmxhZ3MgJiBSQVdfVU5QUk9DRVNTRUQpID09IFJBV19VTlBST0NFU1NFRCkgeworCQkJLy8gbG9hZCByYXcgZGF0YSB3aXRob3V0IHBvc3QtcHJvY2Vzc2luZyAoaS5lLiBhcyBhIEJheWVyIG1hdHJpeCkKKwkJCWRpYiA9IGxpYnJhd19Mb2FkVW5wcm9jZXNzZWREYXRhKFJhd1Byb2Nlc3Nvcik7CisJCX0KKwkJZWxzZSBpZigoZmxhZ3MgJiBSQVdfUFJFVklFVykgPT0gUkFXX1BSRVZJRVcpIHsKKwkJCS8vIHRyeSB0byBnZXQgdGhlIGVtYmVkZGVkIEpQRUcKKwkJCWRpYiA9IGxpYnJhd19Mb2FkRW1iZWRkZWRQcmV2aWV3KFJhd1Byb2Nlc3NvciwgMCk7CisJCQlpZighZGliKSB7CisJCQkJLy8gbm8gSlBFRyBwcmV2aWV3OiB0cnkgdG8gbG9hZCBhcyA4LWJpdC9zYW1wbGUgKGkuZS4gUkdCIDI0LWJpdCkKKwkJCQlkaWIgPSBsaWJyYXdfTG9hZFJhd0RhdGEoUmF3UHJvY2Vzc29yLCA4KTsKKwkJCX0KKwkJfSAKKwkJZWxzZSBpZigoZmxhZ3MgJiBSQVdfRElTUExBWSkgPT0gUkFXX0RJU1BMQVkpIHsKKwkJCS8vIGxvYWQgcmF3IGRhdGEgYXMgOC1iaXQvc2FtcGxlIChpLmUuIFJHQiAyNC1iaXQpCisJCQlkaWIgPSBsaWJyYXdfTG9hZFJhd0RhdGEoUmF3UHJvY2Vzc29yLCA4KTsKKwkJfSAKKwkJZWxzZSB7CisJCQkvLyBkZWZhdWx0OiBsb2FkIHJhdyBkYXRhIGFzIGxpbmVhciAxNi1iaXQvc2FtcGxlIChpLmUuIFJHQiA0OC1iaXQpCisJCQlkaWIgPSBsaWJyYXdfTG9hZFJhd0RhdGEoUmF3UHJvY2Vzc29yLCAxNik7CisJCX0KKworCQkvLyBzYXZlIElDQyBwcm9maWxlIGlmIHByZXNlbnQKKwkJaWYoZGliICYmIChOVUxMICE9IFJhd1Byb2Nlc3Nvci0+aW1nZGF0YS5jb2xvci5wcm9maWxlKSkgeworCQkJRnJlZUltYWdlX0NyZWF0ZUlDQ1Byb2ZpbGUoZGliLCBSYXdQcm9jZXNzb3ItPmltZ2RhdGEuY29sb3IucHJvZmlsZSwgUmF3UHJvY2Vzc29yLT5pbWdkYXRhLmNvbG9yLnByb2ZpbGVfbGVuZ3RoKTsKKwkJfQorCisJCS8vIHRyeSB0byBnZXQgSlBFRyBlbWJlZGRlZCBFeGlmIG1ldGFkYXRhCisJCWlmKGRpYiAmJiAhKChmbGFncyAmIFJBV19QUkVWSUVXKSA9PSBSQVdfUFJFVklFVykpIHsKKwkJCUZJQklUTUFQICptZXRhZGF0YV9kaWIgPSBsaWJyYXdfTG9hZEVtYmVkZGVkUHJldmlldyhSYXdQcm9jZXNzb3IsIEZJRl9MT0FEX05PUElYRUxTKTsKKwkJCWlmKG1ldGFkYXRhX2RpYikgeworCQkJCUZyZWVJbWFnZV9DbG9uZU1ldGFkYXRhKGRpYiwgbWV0YWRhdGFfZGliKTsKKwkJCQlGcmVlSW1hZ2VfVW5sb2FkKG1ldGFkYXRhX2RpYik7CisJCQl9CisJCX0KKworCQkvLyBjbGVhbi11cCBpbnRlcm5hbCBtZW1vcnkgYWxsb2NhdGlvbnMKKwkJUmF3UHJvY2Vzc29yLT5yZWN5Y2xlKCk7CisJCWRlbGV0ZSBSYXdQcm9jZXNzb3I7CisKKwkJcmV0dXJuIGRpYjsKKworCX0gY2F0Y2goY29uc3QgY2hhciAqdGV4dCkgeworCQlpZihSYXdQcm9jZXNzb3IpIHsKKwkJCVJhd1Byb2Nlc3Nvci0+cmVjeWNsZSgpOworCQkJZGVsZXRlIFJhd1Byb2Nlc3NvcjsKKwkJfQorCQlpZihkaWIpIHsKKwkJCUZyZWVJbWFnZV9VbmxvYWQoZGliKTsKKwkJfQorCQlGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2Moc19mb3JtYXRfaWQsIHRleHQpOworCX0KKworCXJldHVybiBOVUxMOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgIEluaXQKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwordm9pZCBETExfQ0FMTENPTlYKK0luaXRSQVcoUGx1Z2luICpwbHVnaW4sIGludCBmb3JtYXRfaWQpIHsKKwlzX2Zvcm1hdF9pZCA9IGZvcm1hdF9pZDsKKworCXBsdWdpbi0+Zm9ybWF0X3Byb2MgPSBGb3JtYXQ7CisJcGx1Z2luLT5kZXNjcmlwdGlvbl9wcm9jID0gRGVzY3JpcHRpb247CisJcGx1Z2luLT5leHRlbnNpb25fcHJvYyA9IEV4dGVuc2lvbjsKKwlwbHVnaW4tPnJlZ2V4cHJfcHJvYyA9IFJlZ0V4cHI7CisJcGx1Z2luLT5vcGVuX3Byb2MgPSBOVUxMOworCXBsdWdpbi0+Y2xvc2VfcHJvYyA9IE5VTEw7CisJcGx1Z2luLT5wYWdlY291bnRfcHJvYyA9IE5VTEw7CisJcGx1Z2luLT5wYWdlY2FwYWJpbGl0eV9wcm9jID0gTlVMTDsKKwlwbHVnaW4tPmxvYWRfcHJvYyA9IExvYWQ7CisJcGx1Z2luLT5zYXZlX3Byb2MgPSBOVUxMOworCXBsdWdpbi0+dmFsaWRhdGVfcHJvYyA9IFZhbGlkYXRlOworCXBsdWdpbi0+bWltZV9wcm9jID0gTWltZVR5cGU7CisJcGx1Z2luLT5zdXBwb3J0c19leHBvcnRfYnBwX3Byb2MgPSBTdXBwb3J0c0V4cG9ydERlcHRoOworCXBsdWdpbi0+c3VwcG9ydHNfZXhwb3J0X3R5cGVfcHJvYyA9IFN1cHBvcnRzRXhwb3J0VHlwZTsKKwlwbHVnaW4tPnN1cHBvcnRzX2ljY19wcm9maWxlc19wcm9jID0gU3VwcG9ydHNJQ0NQcm9maWxlczsKKwlwbHVnaW4tPnN1cHBvcnRzX25vX3BpeGVsc19wcm9jID0gU3VwcG9ydHNOb1BpeGVsczsKK30KZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvUGx1Z2luU0dJLmNwcCBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvUGx1Z2luU0dJLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWZkMmVjCi0tLSAvZGV2L251bGwKKysrIGIvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9QbHVnaW5TR0kuY3BwCkBAIC0wLDAgKzEsNDI1IEBACisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBTR0kgTG9hZGVyCisvLworLy8gRGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBieQorLy8gLSBTaGVybWFuIFdpbGNveAorLy8gLSBOb2FtIEdhdAorLy8KKy8vIFJlZmVyZW5jZXMgOiAKKy8vIC0tLS0tLS0tLS0tLQorLy8gLSBUaGUgU0dJIEltYWdlIEZpbGUgRm9ybWF0LCBWZXJzaW9uIDEuMAorLy8gaHR0cDovL2FzdHJvbm9teS5zd2luLmVkdS5hdS9+cGJvdXJrZS9kYXRhZm9ybWF0cy9zZ2lyZ2Ivc2dpdmVyc2lvbi5odG1sCisvLyAtIFNHSSBSR0IgSW1hZ2UgRm9ybWF0CisvLyBodHRwOi8vYXN0cm9ub215LnN3aW4uZWR1LmF1L35wYm91cmtlL2RhdGFmb3JtYXRzL3NnaXJnYi8KKy8vCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRnJlZUltYWdlIDMKKy8vCisvLyBDT1ZFUkVEIENPREUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkKKy8vIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTCisvLyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy8vIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVECisvLyBDT0RFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UCisvLyBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWQorLy8gU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTAorLy8gUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUgorLy8gVEhJUyBESVNDTEFJTUVSLgorLy8KKy8vIFVzZSBhdCB5b3VyIG93biByaXNrIQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaW5jbHVkZSAiRnJlZUltYWdlLmgiCisjaW5jbHVkZSAiVXRpbGl0aWVzLmgiCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgQ29uc3RhbnRzICsgaGVhZGVycworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgX1dJTjMyCisjcHJhZ21hIHBhY2socHVzaCwgMSkKKyNlbHNlCisjcHJhZ21hIHBhY2soMSkKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB0YWdTR0lIZWFkZXIgeworCS8qKiBJUklTIGltYWdlIGZpbGUgbWFnaWMgbnVtYmVyLiBUaGlzIHNob3VsZCBiZSBkZWNpbWFsIDQ3NC4gKi8KKwlXT1JEIG1hZ2ljOworCS8qKiBTdG9yYWdlIGZvcm1hdDogMCBmb3IgdW5jb21wcmVzc2VkLCAxIGZvciBSTEUgY29tcHJlc3Npb24uICovCisJQllURSBzdG9yYWdlOworCS8qKiBOdW1iZXIgb2YgYnl0ZXMgcGVyIHBpeGVsIGNoYW5uZWwuIExlZ2FsbHkgMSBvciAyLiAqLworCUJZVEUgYnBjOworCS8qKgorCU51bWJlciBvZiBkaW1lbnNpb25zLiBMZWdhbGx5IDEsIDIsIG9yIDMuIAorCTEgbWVhbnMgYSBzaW5nbGUgcm93LCBYU0laRSBsb25nCisJMiBtZWFucyBhIHNpbmdsZSAyRCBpbWFnZQorCTMgbWVhbnMgbXVsdGlwbGUgMkQgaW1hZ2VzCisJKi8KKwlXT1JEIGRpbWVuc2lvbjsJCisJLyoqIFggc2l6ZSBpbiBwaXhlbHMgKi8KKwlXT1JEIHhzaXplOworCS8qKiBZIHNpemUgaW4gcGl4ZWxzICovCisJV09SRCB5c2l6ZTsKKwkvKioKKwlOdW1iZXIgb2YgY2hhbm5lbHMuIAorCTEgaW5kaWNhdGVzIGdyZXlzY2FsZQorCTMgaW5kaWNhdGVzIFJHQgorCTQgaW5kaWNhdGVzIFJHQiBhbmQgQWxwaGEKKwkqLworCVdPUkQgenNpemU7CisJLyoqIE1pbmltdW0gcGl4ZWwgdmFsdWUuIFRoaXMgaXMgdGhlIGxvd2VzdCBwaXhlbCB2YWx1ZSBpbiB0aGUgaW1hZ2UuKi8KKwlMT05HIHBpeG1pbjsKKwkvKiogTWF4aW11bSBwaXhlbCB2YWx1ZS4gVGhpcyBpcyB0aGUgaGlnaGVzdCBwaXhlbCB2YWx1ZSBpbiB0aGUgaW1hZ2UuKi8KKwlMT05HIHBpeG1heDsKKwkvKiogSWdub3JlZC4gTm9ybWFsbHkgc2V0IHRvIDAuICovCisJY2hhciBkdW1teVs0XTsKKwkvKiogSW1hZ2UgbmFtZS4gTXVzdCBiZSBudWxsIHRlcm1pbmF0ZWQsIHRoZXJlZm9yZSBhdCBtb3N0IDc5IGJ5dGVzLiAqLworCWNoYXIgaW1hZ2VuYW1lWzgwXTsKKwkvKiogCisJQ29sb3JtYXAgSUQuIAorCTAgLSBub3JtYWwgbW9kZQorCTEgLSBkaXRoZXJlZCwgMyBtaXRzIGZvciByZWQgYW5kIGdyZWVuLCAyIGZvciBibHVlLCBvYnNvbGV0ZQorCTIgLSBpbmRleCBjb2xvdXIsIG9ic29sZXRlCisJMyAtIG5vdCBhbiBpbWFnZSBidXQgYSBjb2xvdXJtYXAKKwkqLworCUxPTkcgY29sb3JtYXA7CisJLyoqIElnbm9yZWQuIFNob3VsZCBiZSBzZXQgdG8gMCwgbWFrZXMgdGhlIGhlYWRlciA1MTIgYnl0ZXMuICovCisJY2hhciByZXNlcnZlZFs0MDRdOworfSBTR0lIZWFkZXI7CisKK3R5cGVkZWYgc3RydWN0IHRhZ1JMRVN0YXR1cyB7CisgIGludCBjbnQ7CisgIGludCB2YWw7Cit9IFJMRVN0YXR1czsKKworI2lmZGVmIF9XSU4zMgorI3ByYWdtYSBwYWNrKHBvcCkKKyNlbHNlCisjcHJhZ21hIHBhY2soKQorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBjaGFyICpTR0lfTEVTU19USEFOX0hFQURFUl9MRU5HVEggPSAiSW5jb3JyZWN0IGhlYWRlciBzaXplIjsKK3N0YXRpYyBjb25zdCBjaGFyICpTR0lfMTZfQklUX0NPTVBPTkVOVFNfTk9UX1NVUFBPUlRFRCA9ICJObyAxNiBiaXQgc3VwcG9ydCI7CitzdGF0aWMgY29uc3QgY2hhciAqU0dJX0NPTE9STUFQU19OT1RfU1VQUE9SVEVEID0gIk5vIGNvbG9ybWFwIHN1cHBvcnQiOworc3RhdGljIGNvbnN0IGNoYXIgKlNHSV9FT0ZfSU5fUkxFX0lOREVYID0gIkVPRiBpbiBydW4gbGVuZ3RoIGVuY29kaW5nIjsKK3N0YXRpYyBjb25zdCBjaGFyICpTR0lfRU9GX0lOX0lNQUdFX0RBVEEgPSAiRU9GIGluIGltYWdlIGRhdGEiOworc3RhdGljIGNvbnN0IGNoYXIgKlNHSV9JTlZBTElEX0NIQU5ORUxfQ09VTlQgPSAiSW52YWxpZCBjaGFubmVsIGNvdW50IjsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gUGx1Z2luIEludGVyZmFjZQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitzdGF0aWMgaW50IHNfZm9ybWF0X2lkOworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBQbHVnaW4gSW1wbGVtZW50YXRpb24KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2lmbmRlZiBGUkVFSU1BR0VfQklHRU5ESUFOCitzdGF0aWMgdm9pZCAKK1N3YXBIZWFkZXIoU0dJSGVhZGVyICpoZWFkZXIpIHsKKwlTd2FwU2hvcnQoJmhlYWRlci0+bWFnaWMpOworCVN3YXBTaG9ydCgmaGVhZGVyLT5kaW1lbnNpb24pOworCVN3YXBTaG9ydCgmaGVhZGVyLT54c2l6ZSk7CisJU3dhcFNob3J0KCZoZWFkZXItPnlzaXplKTsKKwlTd2FwU2hvcnQoJmhlYWRlci0+enNpemUpOworCVN3YXBMb25nKChEV09SRCopJmhlYWRlci0+cGl4bWluKTsKKwlTd2FwTG9uZygoRFdPUkQqKSZoZWFkZXItPnBpeG1heCk7CisJU3dhcExvbmcoKERXT1JEKikmaGVhZGVyLT5jb2xvcm1hcCk7Cit9CisjZW5kaWYKKworc3RhdGljIGludCAKK2dldF9ybGVjaGFyKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSwgUkxFU3RhdHVzICpwc3RhdHVzKSB7CisJaWYgKCFwc3RhdHVzLT5jbnQpIHsKKwkJaW50IGNudCA9IDA7CisJCXdoaWxlICgwID09IGNudCkgeworCQkJQllURSBwYWNrZWQgPSAwOworCQkJaWYoaW8tPnJlYWRfcHJvYygmcGFja2VkLCBzaXplb2YoQllURSksIDEsIGhhbmRsZSkgPCAxKSB7CisJCQkJcmV0dXJuIEVPRjsKKwkJCX0KKwkJCWNudCA9IHBhY2tlZDsKKwkJfQorCQlpZiAoY250ID09IEVPRikgeworCQkJcmV0dXJuIEVPRjsKKwkJfQorCQlwc3RhdHVzLT5jbnQgPSBjbnQgJiAweDdGOworCQlpZiAoY250ICYgMHg4MCkgeworCQkJcHN0YXR1cy0+dmFsID0gLTE7CisJCX0gZWxzZSB7CisJCQlCWVRFIHBhY2tlZCA9IDA7CisJCQlpZihpby0+cmVhZF9wcm9jKCZwYWNrZWQsIHNpemVvZihCWVRFKSwgMSwgaGFuZGxlKSA8IDEpIHsKKwkJCQlyZXR1cm4gRU9GOworCQkJfQorCQkJcHN0YXR1cy0+dmFsID0gcGFja2VkOworCQl9CisJfQorCXBzdGF0dXMtPmNudC0tOworCWlmIChwc3RhdHVzLT52YWwgPT0gLTEpIHsKKwkJQllURSBwYWNrZWQgPSAwOworCQlpZihpby0+cmVhZF9wcm9jKCZwYWNrZWQsIHNpemVvZihCWVRFKSwgMSwgaGFuZGxlKSA8IDEpIHsKKwkJCXJldHVybiBFT0Y7CisJCX0KKwkJcmV0dXJuIHBhY2tlZDsKKwl9CisJZWxzZSB7CisJCXJldHVybiBwc3RhdHVzLT52YWw7CisJfQorfQorCitzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgorRm9ybWF0KCkgeworICByZXR1cm4gIlNHSSI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCitEZXNjcmlwdGlvbigpIHsKKyAgcmV0dXJuICJTR0kgSW1hZ2UgRm9ybWF0IjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKK0V4dGVuc2lvbigpIHsKKyAgcmV0dXJuICJzZ2kscmdiLHJnYmEsYnciOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgorUmVnRXhwcigpIHsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCitNaW1lVHlwZSgpIHsKKyAgcmV0dXJuICJpbWFnZS94LXNnaSI7Cit9CisKK3N0YXRpYyBCT09MIERMTF9DQUxMQ09OVgorVmFsaWRhdGUoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlKSB7CisJQllURSBzZ2lfc2lnbmF0dXJlWzJdID0geyAweDAxLCAweERBIH07CisJQllURSBzaWduYXR1cmVbMl0gPSB7IDAsIDAgfTsKKworCWlvLT5yZWFkX3Byb2Moc2lnbmF0dXJlLCAxLCBzaXplb2Yoc2dpX3NpZ25hdHVyZSksIGhhbmRsZSk7CisKKwlyZXR1cm4gKG1lbWNtcChzZ2lfc2lnbmF0dXJlLCBzaWduYXR1cmUsIHNpemVvZihzZ2lfc2lnbmF0dXJlKSkgPT0gMCk7Cit9CisKK3N0YXRpYyBCT09MIERMTF9DQUxMQ09OVgorU3VwcG9ydHNFeHBvcnREZXB0aChpbnQgZGVwdGgpIHsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYgCitTdXBwb3J0c0V4cG9ydFR5cGUoRlJFRV9JTUFHRV9UWVBFIHR5cGUpIHsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgRklCSVRNQVAgKiBETExfQ0FMTENPTlYKK0xvYWQoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBpbnQgcGFnZSwgaW50IGZsYWdzLCB2b2lkICpkYXRhKSB7CisJaW50IHdpZHRoID0gMCwgaGVpZ2h0ID0gMCwgenNpemUgPSAwOworCWludCBpLCBkaW07CisJaW50IGJpdGNvdW50OworCVNHSUhlYWRlciBzZ2lIZWFkZXI7CisJUkxFU3RhdHVzIG15X3JsZV9zdGF0dXM7CisJRklCSVRNQVAgKmRpYiA9IE5VTEw7CisJTE9ORyAqcFJvd0luZGV4ID0gTlVMTDsKKworCXRyeSB7CisJCS8vIHJlYWQgdGhlIGhlYWRlcgorCQltZW1zZXQoJnNnaUhlYWRlciwgMCwgc2l6ZW9mKFNHSUhlYWRlcikpOworCQlpZihpby0+cmVhZF9wcm9jKCZzZ2lIZWFkZXIsIDEsIHNpemVvZihTR0lIZWFkZXIpLCBoYW5kbGUpIDwgc2l6ZW9mKFNHSUhlYWRlcikpIHsKKwkJICAgdGhyb3cgU0dJX0xFU1NfVEhBTl9IRUFERVJfTEVOR1RIOworCQl9CisjaWZuZGVmIEZSRUVJTUFHRV9CSUdFTkRJQU4KKwkJU3dhcEhlYWRlcigmc2dpSGVhZGVyKTsKKyNlbmRpZgorCQlpZihzZ2lIZWFkZXIubWFnaWMgIT0gNDc0KSB7CisJCQl0aHJvdyBGSV9NU0dfRVJST1JfTUFHSUNfTlVNQkVSOworCQl9CisJCQorCQlCT09MIGJJc1JMRSA9IChzZ2lIZWFkZXIuc3RvcmFnZSA9PSAxKSA/IFRSVUUgOiBGQUxTRTsKKwkKKwkJLy8gY2hlY2sgZm9yIHVuc3VwcG9ydGVkIGltYWdlIHR5cGVzCisJCWlmIChzZ2lIZWFkZXIuYnBjICE9IDEpIHsKKwkJCS8vIEV4cGVjdGVkIG9uZSBieXRlIHBlciBjb2xvciBjb21wb25lbnQKKwkJCXRocm93IFNHSV8xNl9CSVRfQ09NUE9ORU5UU19OT1RfU1VQUE9SVEVEOyAKKwkJfQorCQlpZiAoc2dpSGVhZGVyLmNvbG9ybWFwICE9IDApIHsKKwkJCS8vIEluZGV4ZWQgb3IgZGl0aGVyZWQgaW1hZ2VzIG5vdCBzdXBwb3J0ZWQKKwkJCXRocm93IFNHSV9DT0xPUk1BUFNfTk9UX1NVUFBPUlRFRDsgCisJCX0KKworCQkvLyBnZXQgdGhlIHdpZHRoICYgaGVpZ2h0CisJCWRpbSA9IHNnaUhlYWRlci5kaW1lbnNpb247CisJCXdpZHRoID0gc2dpSGVhZGVyLnhzaXplOworCQlpZiAoZGltIDwgMykgeworCQkJenNpemUgPSAxOworCQl9IGVsc2UgeworCQkJenNpemUgPSBzZ2lIZWFkZXIuenNpemU7CisJCX0KKworCQlpZiAoZGltIDwgMikgeworCQkJaGVpZ2h0ID0gMTsKKwkJfSBlbHNlIHsKKwkJCWhlaWdodCA9IHNnaUhlYWRlci55c2l6ZTsKKwkJfQorCQkKKwkJaWYoYklzUkxFKSB7CisJCQkvLyByZWFkIHRoZSBPZmZzZXQgVGFibGVzIAorCQkJaW50IGluZGV4X2xlbiA9IGhlaWdodCAqIHpzaXplOworCQkJcFJvd0luZGV4ID0gKExPTkcqKW1hbGxvYyhpbmRleF9sZW4gKiBzaXplb2YoTE9ORykpOworCQkJaWYoIXBSb3dJbmRleCkgeworCQkJCXRocm93IEZJX01TR19FUlJPUl9NRU1PUlk7CisJCQl9CisJCQkKKwkJCWlmICgodW5zaWduZWQpaW5kZXhfbGVuICE9IGlvLT5yZWFkX3Byb2MocFJvd0luZGV4LCBzaXplb2YoTE9ORyksIGluZGV4X2xlbiwgaGFuZGxlKSkgeworCQkJCXRocm93IFNHSV9FT0ZfSU5fUkxFX0lOREVYOworCQkJfQorCQkJCisjaWZuZGVmIEZSRUVJTUFHRV9CSUdFTkRJQU4JCQorCQkJLy8gRml4IGJ5dGUgb3JkZXIgaW4gaW5kZXgKKwkJCWZvciAoaSA9IDA7IGkgPCBpbmRleF9sZW47IGkrKykgeworCQkJCVN3YXBMb25nKChEV09SRCopJnBSb3dJbmRleFtpXSk7CisJCQl9CisjZW5kaWYKKwkJCS8vIERpc2NhcmQgcm93IHNpemUgaW5kZXgKKwkJCWZvciAoaSA9IDA7IGkgPCAoaW50KShpbmRleF9sZW4gKiBzaXplb2YoTE9ORykpOyBpKyspIHsKKwkJCQlCWVRFIHBhY2tlZCA9IDA7CisJCQkJaWYoIGlvLT5yZWFkX3Byb2MoJnBhY2tlZCwgc2l6ZW9mKEJZVEUpLCAxLCBoYW5kbGUpIDwgMSApIHsKKwkJCQkJdGhyb3cgU0dJX0VPRl9JTl9STEVfSU5ERVg7CisJCQkJfQorCQkJfQorCQl9CisJCQorCQlzd2l0Y2goenNpemUpIHsKKwkJCWNhc2UgMToKKwkJCQliaXRjb3VudCA9IDg7CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQkJLy9HcmF5c2NhbGUrQWxwaGEuIE5lZWQgdG8gZmFrZSBSR0JBCisJCQkJYml0Y291bnQgPSAzMjsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzoKKwkJCQliaXRjb3VudCA9IDI0OworCQkJCWJyZWFrOworCQkJY2FzZSA0OgorCQkJCWJpdGNvdW50ID0gMzI7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXRocm93IFNHSV9JTlZBTElEX0NIQU5ORUxfQ09VTlQ7CisJCX0KKwkJCisJCWRpYiA9IEZyZWVJbWFnZV9BbGxvY2F0ZSh3aWR0aCwgaGVpZ2h0LCBiaXRjb3VudCk7CisJCWlmKCFkaWIpIHsKKwkJCXRocm93IEZJX01TR19FUlJPUl9ESUJfTUVNT1JZOworCQl9CisJCQorCQlpZiAoYml0Y291bnQgPT0gOCkgeworCQkJLy8gOC1iaXQgU0dJIGZpbGVzIGFyZSBncmF5c2NhbGUgaW1hZ2VzLCBzbyB3ZSdsbCBnZW5lcmF0ZQorCQkJLy8gYSBncmF5c2NhbGUgcGFsZXR0ZS4KKwkJCVJHQlFVQUQgKnBjbHJzID0gRnJlZUltYWdlX0dldFBhbGV0dGUoZGliKTsKKwkJCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQkJCXBjbHJzW2ldLnJnYlJlZCA9IChCWVRFKWk7CisJCQkJcGNscnNbaV0ucmdiR3JlZW4gPSAoQllURSlpOworCQkJCXBjbHJzW2ldLnJnYkJsdWUgPSAoQllURSlpOworCQkJCXBjbHJzW2ldLnJnYlJlc2VydmVkID0gMDsKKwkJCX0KKwkJfQorCisJCS8vIGRlY29kZSB0aGUgaW1hZ2UKKworCQltZW1zZXQoJm15X3JsZV9zdGF0dXMsIDAsIHNpemVvZihSTEVTdGF0dXMpKTsKKwkJCisJCWludCBucyA9IEZyZWVJbWFnZV9HZXRQaXRjaChkaWIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJQllURSAqcFN0YXJ0Um93ID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgMCk7CisJCWludCBvZmZzZXRfdGFibGVbXSA9IHsgMiwgMSwgMCwgMyB9OworCQlpbnQgbnVtQ2hhbm5lbHMgPSB6c2l6ZTsKKwkJaWYgKHpzaXplIDwgMykgeworCQkJb2Zmc2V0X3RhYmxlWzBdID0gMDsKKwkJfQorCQlpZiAoenNpemUgPT0gMikKKwkJeworCQkJLy9UaGlzIGlzIGhvdyBmYWtlZCBncmF5c2NhbGUrYWxwaGEgd29ya3MuCisJCQkvL0ZpcnN0IGNoYW5uZWwgZ29lcyBpbnRvIGZpcnN0IAorCQkJLy9zZWNvbmQgY2hhbm5lbCBnb2VzIGludG8gYWxwaGEgKDR0aCBjaGFubmVsKQorCQkJLy9Ud28gY2hhbm5lbHMgYXJlIGxlZnQgZW1wdHkgYW5kIHdpbGwgYmUgY29waWVkIGxhdGVyCisJCQlvZmZzZXRfdGFibGVbMV0gPSAzOworCQkJbnVtQ2hhbm5lbHMgPSA0OworCQl9CisJCQorCQlMT05HICpwcmkgPSBwUm93SW5kZXg7CisJCWZvciAoaSA9IDA7IGkgPCB6c2l6ZTsgaSsrKSB7CisJCQlCWVRFICpwUm93ID0gcFN0YXJ0Um93ICsgb2Zmc2V0X3RhYmxlW2ldOworCQkJZm9yIChpbnQgaiA9IDA7IGogPCBoZWlnaHQ7IGorKywgcFJvdyArPSBucywgcHJpKyspIHsKKwkJCQlCWVRFICpwID0gcFJvdzsKKwkJCQlpZiAoYklzUkxFKSB7CisJCQkJCW15X3JsZV9zdGF0dXMuY250ID0gMDsKKwkJCQkJaW8tPnNlZWtfcHJvYyhoYW5kbGUsICpwcmksIFNFRUtfU0VUKTsKKwkJCQl9CisJCQkJZm9yIChpbnQgayA9IDA7IGsgPCB3aWR0aDsgaysrLCBwICs9IG51bUNoYW5uZWxzKSB7CisJCQkJCWludCBjaDsKKwkJCQkJQllURSBwYWNrZWQgPSAwOworCQkJCQlpZiAoYklzUkxFKSB7CisJCQkJCQljaCA9IGdldF9ybGVjaGFyKGlvLCBoYW5kbGUsICZteV9ybGVfc3RhdHVzKTsKKwkJCQkJCXBhY2tlZCA9IChCWVRFKWNoOworCQkJCQl9CisJCQkJCWVsc2UgeworCQkJCQkJY2ggPSBpby0+cmVhZF9wcm9jKCZwYWNrZWQsIHNpemVvZihCWVRFKSwgMSwgaGFuZGxlKTsKKwkJCQkJfQorCQkJCQlpZiAoY2ggPT0gRU9GKSB7CisJCQkJCQl0aHJvdyBTR0lfRU9GX0lOX0lNQUdFX0RBVEE7CisJCQkJCX0KKwkJCQkJKnAgPSBwYWNrZWQ7CisJCQkJfQorCQkJfQorCQl9CisJCQorCQlpZiAoenNpemUgPT0gMikKKwkJeworCQkJQllURSAqcFJvdyA9IHBTdGFydFJvdzsKKwkJCS8vSWYgZmFraW5nIFJHQkEgZnJvbSBncmF5c2NhbGUgKyBhbHBoYSwgY29weSBmaXJzdCBjaGFubmVsIHRvIHNlY29uZCBhbmQgdGhpcmQKKwkJCWZvciAoaW50IGk9MDsgaTxoZWlnaHQ7IGkrKywgcFJvdyArPSBucykKKwkJCXsKKwkJCQlCWVRFICpwUGl4ZWwgPSBwUm93OworCQkJCWZvciAoaW50IGo9MDsgajx3aWR0aDsgaisrKQorCQkJCXsKKwkJCQkJcFBpeGVsWzJdID0gcFBpeGVsWzFdID0gcFBpeGVsWzBdOworCQkJCQlwUGl4ZWwgKz0gNDsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYocFJvd0luZGV4KQorCQkJZnJlZShwUm93SW5kZXgpOworCisJCXJldHVybiBkaWI7CisKKwl9IGNhdGNoKGNvbnN0IGNoYXIgKnRleHQpIHsKKwkJaWYocFJvd0luZGV4KSBmcmVlKHBSb3dJbmRleCk7CisJCWlmKGRpYikgRnJlZUltYWdlX1VubG9hZChkaWIpOworCQlGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2Moc19mb3JtYXRfaWQsIHRleHQpOworCQlyZXR1cm4gTlVMTDsKKwl9Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICAgSW5pdAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit2b2lkIERMTF9DQUxMQ09OViAKK0luaXRTR0koUGx1Z2luICpwbHVnaW4sIGludCBmb3JtYXRfaWQpIHsKKwlzX2Zvcm1hdF9pZCA9IGZvcm1hdF9pZDsKKwkKKwlwbHVnaW4tPmZvcm1hdF9wcm9jID0gRm9ybWF0OworCXBsdWdpbi0+ZGVzY3JpcHRpb25fcHJvYyA9IERlc2NyaXB0aW9uOworCXBsdWdpbi0+ZXh0ZW5zaW9uX3Byb2MgPSBFeHRlbnNpb247CisJcGx1Z2luLT5yZWdleHByX3Byb2MgPSBSZWdFeHByOworCXBsdWdpbi0+b3Blbl9wcm9jID0gTlVMTDsKKwlwbHVnaW4tPmNsb3NlX3Byb2MgPSBOVUxMOworCXBsdWdpbi0+cGFnZWNvdW50X3Byb2MgPSBOVUxMOworCXBsdWdpbi0+cGFnZWNhcGFiaWxpdHlfcHJvYyA9IE5VTEw7CisJcGx1Z2luLT5sb2FkX3Byb2MgPSBMb2FkOworCXBsdWdpbi0+c2F2ZV9wcm9jID0gTlVMTDsKKwlwbHVnaW4tPnZhbGlkYXRlX3Byb2MgPSBWYWxpZGF0ZTsKKwlwbHVnaW4tPm1pbWVfcHJvYyA9IE1pbWVUeXBlOworCXBsdWdpbi0+c3VwcG9ydHNfZXhwb3J0X2JwcF9wcm9jID0gU3VwcG9ydHNFeHBvcnREZXB0aDsKKwlwbHVnaW4tPnN1cHBvcnRzX2V4cG9ydF90eXBlX3Byb2MgPSBTdXBwb3J0c0V4cG9ydFR5cGU7CisJcGx1Z2luLT5zdXBwb3J0c19pY2NfcHJvZmlsZXNfcHJvYyA9IE5VTEw7Cit9CisKZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvUGx1Z2luVEFSR0EuY3BwIGIvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9QbHVnaW5UQVJHQS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ4NjQzMAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvUGx1Z2luVEFSR0EuY3BwCkBAIC0wLDAgKzEsMTU5MSBAQAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gVEFSR0EgTG9hZGVyIGFuZCBXcml0ZXIKKy8vCisvLyBEZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIGJ5CisvLyAtIEZsb3JpcyB2YW4gZGVuIEJlcmcgKGZsdmRiZXJnQHd4cy5ubCkKKy8vIC0gSmFuaSBLYWphbGEgKGphbmlrQHJlbWVkeS5maSkKKy8vIC0gTWFydGluIFdlYmVyIChtYXJ0d2ViQGdteC5uZXQpCisvLyAtIE1hY2hpZWwgdGVuIEJyaW5rZSAoYnJpbmtlbUB1bmktb25lLm5sKQorLy8gLSBQZXRlciBMZW1tZW5zIChwZXRlci5sZW1tZW5zQHBsYW5ldGludGVybmV0LmJlKQorLy8gLSBIZXJ2w6kgRHJvbG9uIChkcm9sb25AaW5mb25pZS5mcikKKy8vIC0gTWloYWlsIE5heWRlbm92IChtbmF5ZGVub3ZAdXNlcnMuc291cmNlZm9yZ2UubmV0KQorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZyZWVJbWFnZSAzCisvLworLy8gQ09WRVJFRCBDT0RFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZCisvLyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUworLy8gVEhBVCBUSEUgQ09WRVJFRCBDT0RFIElTIEZSRUUgT0YgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisvLyBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRAorLy8gQ09ERSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVAorLy8gVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GIEFOWSBORUNFU1NBUlkKKy8vIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwKKy8vIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIKKy8vIFRISVMgRElTQ0xBSU1FUi4KKy8vCisvLyBVc2UgYXQgeW91ciBvd24gcmlzayEKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2luY2x1ZGUgIkZyZWVJbWFnZS5oIgorI2luY2x1ZGUgIlV0aWxpdGllcy5oIgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgIENvbnN0YW50cyArIGhlYWRlcnMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmIF9XSU4zMgorI3ByYWdtYSBwYWNrKHB1c2gsIDEpCisjZWxzZQorI3ByYWdtYSBwYWNrKDEpCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgdGFnVEdBSEVBREVSIHsKKwlCWVRFIGlkX2xlbmd0aDsJCQkJLy8hIGxlbmd0aCBvZiB0aGUgaW1hZ2UgSUQgZmllbGQKKwlCWVRFIGNvbG9yX21hcF90eXBlOwkJLy8hIHdoZXRoZXIgYSBjb2xvciBtYXAgaXMgaW5jbHVkZWQKKwlCWVRFIGltYWdlX3R5cGU7CQkJLy8hIGNvbXByZXNzaW9uIGFuZCBjb2xvciB0eXBlcworCisJV09SRCBjbV9maXJzdF9lbnRyeTsJCS8vISBmaXJzdCBlbnRyeSBpbmRleCAob2Zmc2V0IGludG8gdGhlIGNvbG9yIG1hcCB0YWJsZSkKKwlXT1JEIGNtX2xlbmd0aDsJCQkJLy8hIGNvbG9yIG1hcCBsZW5ndGggKG51bWJlciBvZiBlbnRyaWVzKQorCUJZVEUgY21fc2l6ZTsJCQkJLy8hIGNvbG9yIG1hcCBlbnRyeSBzaXplLCBpbiBiaXRzIChudW1iZXIgb2YgYml0cyBwZXIgcGl4ZWwpCisKKwlXT1JEIGlzX3hvcmlnaW47CQkJLy8hIFgtb3JpZ2luIG9mIGltYWdlIChhYnNvbHV0ZSBjb29yZGluYXRlIG9mIGxvd2VyLWxlZnQgY29ybmVyIGZvciBkaXNwbGF5cyB3aGVyZSBvcmlnaW4gaXMgYXQgdGhlIGxvd2VyIGxlZnQpCisJV09SRCBpc195b3JpZ2luOwkJCS8vISBZLW9yaWdpbiBvZiBpbWFnZSAoYXMgZm9yIFgtb3JpZ2luKQorCVdPUkQgaXNfd2lkdGg7CQkJCS8vISBpbWFnZSB3aWR0aAorCVdPUkQgaXNfaGVpZ2h0OwkJCQkvLyEgaW1hZ2UgaGVpZ2h0CisJQllURSBpc19waXhlbF9kZXB0aDsJCS8vISBiaXRzIHBlciBwaXhlbAorCUJZVEUgaXNfaW1hZ2VfZGVzY3JpcHRvcjsJLy8hIGltYWdlIGRlc2NyaXB0b3IsIGJpdHMgMy0wIGdpdmUgdGhlIGFscGhhIGNoYW5uZWwgZGVwdGgsIGJpdHMgNS00IGdpdmUgZGlyZWN0aW9uCit9IFRHQUhFQURFUjsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnVEdBRVhURU5TSU9OQVJFQSB7CisJV09SRCBleHRlbnNpb25fc2l6ZTsJCS8vIFNpemUgaW4gYnl0ZXMgb2YgdGhlIGV4dGVuc2lvbiBhcmVhLCBhbHdheXMgNDk1CisJY2hhciBhdXRob3JfbmFtZVs0MV07CQkvLyBOYW1lIG9mIHRoZSBhdXRob3IuIElmIG5vdCB1c2VkLCBieXRlcyBzaG91bGQgYmUgc2V0IHRvIE5VTEwgKFwwKSBvciBzcGFjZXMKKwljaGFyIGF1dGhvcl9jb21tZW50c1szMjRdOwkvLyBBIGNvbW1lbnQsIG9yZ2FuaXplZCBhcyBmb3VyIGxpbmVzLCBlYWNoIGNvbnNpc3Rpbmcgb2YgODAgY2hhcmFjdGVycyBwbHVzIGEgTlVMTAorCVdPUkQgZGF0ZXRpbWVfc3RhbXBbNl07CQkvLyBEYXRlIGFuZCB0aW1lIGF0IHdoaWNoIHRoZSBpbWFnZSB3YXMgY3JlYXRlZAorCWNoYXIgam9iX25hbWVbNDFdOwkJCS8vIEpvYiBJRAorCVdPUkQgam9iX3RpbWVbM107CQkJLy8gSG91cnMsIG1pbnV0ZXMgYW5kIHNlY29uZHMgc3BlbnQgY3JlYXRpbmcgdGhlIGZpbGUgKGZvciBiaWxsaW5nLCBldGMuKQorCWNoYXIgc29mdHdhcmVfaWRbNDFdOwkJLy8gVGhlIGFwcGxpY2F0aW9uIHRoYXQgY3JlYXRlZCB0aGUgZmlsZQorCUJZVEUgc29mdHdhcmVfdmVyc2lvblszXTsKKwlEV09SRCBrZXlfY29sb3I7CisJV09SRCBwaXhlbF9hc3BlY3RfcmF0aW9bMl07CisJV09SRCBnYW1tYV92YWx1ZVsyXTsKKwlEV09SRCBjb2xvcl9jb3JyZWN0aW9uX29mZnNldDsJLy8gTnVtYmVyIG9mIGJ5dGVzIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZSB0byB0aGUgY29sb3IgY29ycmVjdGlvbiB0YWJsZSBpZiBwcmVzZW50CisJRFdPUkQgcG9zdGFnZV9zdGFtcF9vZmZzZXQ7CQkvLyBOdW1iZXIgb2YgYnl0ZXMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlIHRvIHRoZSBwb3N0YWdlIHN0YW1wIGltYWdlIGlmIHByZXNlbnQKKwlEV09SRCBzY2FuX2xpbmVfb2Zmc2V0OwkJCS8vIE51bWJlciBvZiBieXRlcyBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUgdG8gdGhlIHNjYW4gbGluZXMgdGFibGUgaWYgcHJlc2VudAorCUJZVEUgYXR0cmlidXRlc190eXBlOwkJCS8vIFNwZWNpZmllcyB0aGUgYWxwaGEgY2hhbm5lbAorfSBUR0FFWFRFTlNJT05BUkVBOworCit0eXBlZGVmIHN0cnVjdCB0YWdUR0FGT09URVIgeworCURXT1JEIGV4dGVuc2lvbl9vZmZzZXQ7CS8vIGV4dGVuc2lvbiBhcmVhIG9mZnNldCA6IG9mZnNldCBpbiBieXRlcyBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUKKwlEV09SRCBkZXZlbG9wZXJfb2Zmc2V0OwkvLyBkZXZlbG9wZXIgZGlyZWN0b3J5IG9mZnNldCA6IG9mZnNldCBpbiBieXRlcyBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUKKwljaGFyIHNpZ25hdHVyZVsxOF07CQkvLyBzaWduYXR1cmUgc3RyaW5nIDogY29udGFpbnMgIlRSVUVWSVNJT04tWEZJTEUuXDAiCit9IFRHQUZPT1RFUjsKKworI2lmZGVmIF9XSU4zMgorI3ByYWdtYSBwYWNrKHBvcCkKKyNlbHNlCisjcHJhZ21hIHBhY2soKQorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBjaGFyICpGSV9NU0dfRVJST1JfQ09SUlVQVEVEID0gIkltYWdlIGRhdGEgY29ycnVwdGVkIjsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW1hZ2UgdHlwZQorLy8KKyNkZWZpbmUgVEdBX05VTEwJCTAJLy8gbm8gaW1hZ2UgZGF0YSBpbmNsdWRlZAorI2RlZmluZSBUR0FfQ01BUAkJMQkvLyB1bmNvbXByZXNzZWQsIGNvbG9yLW1hcHBlZCBpbWFnZQorI2RlZmluZSBUR0FfUkdCCQkJMgkvLyB1bmNvbXByZXNzZWQsIHRydWUtY29sb3IgaW1hZ2UKKyNkZWZpbmUgVEdBX01PTk8JCTMJLy8gdW5jb21wcmVzc2VkLCBibGFjay1hbmQtd2hpdGUgaW1hZ2UKKyNkZWZpbmUgVEdBX1JMRUNNQVAJCTkJLy8gcnVuLWxlbmd0aCBlbmNvZGVkLCBjb2xvci1tYXBwZWQgaW1hZ2UKKyNkZWZpbmUgVEdBX1JMRVJHQgkJMTAJLy8gcnVuLWxlbmd0aCBlbmNvZGVkLCB0cnVlLWNvbG9yIGltYWdlCisjZGVmaW5lIFRHQV9STEVNT05PCQkxMQkvLyBydW4tbGVuZ3RoIGVuY29kZWQsIGJsYWNrLWFuZC13aGl0ZSBpbWFnZQorI2RlZmluZSBUR0FfQ01QQ01BUAkJMzIJLy8gY29tcHJlc3NlZCAoSHVmZm1hbi9EZWx0YS9STEUpIGNvbG9yLW1hcHBlZCBpbWFnZSAoZS5nLiwgVkRBL0QpIC0gT2Jzb2xldGUKKyNkZWZpbmUgVEdBX0NNUENNQVA0CTMzCS8vIGNvbXByZXNzZWQgKEh1ZmZtYW4vRGVsdGEvUkxFKSBjb2xvci1tYXBwZWQgZm91ciBwYXNzIGltYWdlIChlLmcuLCBWREEvRCkgLSBPYnNvbGV0ZQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBUaHVtYm5haWwgZnVuY3Rpb25zCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIFRhcmdhVGh1bWJuYWlsCit7CitwdWJsaWM6CisJVGFyZ2FUaHVtYm5haWwoKSA6IF93KDApLCBfaCgwKSwgX2RlcHRoKDApLCBfZGF0YShOVUxMKSB7IAorCX0KKwl+VGFyZ2FUaHVtYm5haWwoKSB7IAorCQlpZihfZGF0YSkgeworCQkJZnJlZShfZGF0YSk7IAorCQl9CisJfQorCisJQk9PTCBpc051bGwoKSBjb25zdCB7IAorCQlyZXR1cm4gKF9kYXRhID09IE5VTEwpOyAKKwl9CisJCisJQk9PTCByZWFkKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSwgc2l6ZV90IHNpemUpIHsKKwkJaW8tPnJlYWRfcHJvYygmX3csIDEsIDEsIGhhbmRsZSk7CisJCWlvLT5yZWFkX3Byb2MoJl9oLCAxLCAxLCBoYW5kbGUpOworCQkKKwkJY29uc3Qgc2l6ZV90IHNpemVvZkRhdGEgPSBzaXplIC0gMjsKKwkJX2RhdGEgPSAoQllURSopbWFsbG9jKHNpemVvZkRhdGEpOworCQlpZihfZGF0YSkgeworCQkJcmV0dXJuIChpby0+cmVhZF9wcm9jKF9kYXRhLCAxLCAodW5zaWduZWQpc2l6ZW9mRGF0YSwgaGFuZGxlKSA9PSBzaXplb2ZEYXRhKTsKKwkJfQorCQlyZXR1cm4gRkFMU0U7CisJfQorCQorCXZvaWQgc2V0RGVwdGgoQllURSBkcCkgeyAKKwkJX2RlcHRoID0gZHA7CisJfQorCQorCUZJQklUTUFQKiB0b0ZJQklUTUFQKCk7CisJCitwcml2YXRlOgorCUJZVEUgX3c7CisJQllURSBfaDsKKwlCWVRFIF9kZXB0aDsKKwlCWVRFKiBfZGF0YTsKK307CisKKyNpZmRlZiBGUkVFSU1BR0VfQklHRU5ESUFOCitzdGF0aWMgdm9pZCAKK3N3YXBTaG9ydFBpeGVscyhGSUJJVE1BUCogZGliKSB7CisJaWYoRnJlZUltYWdlX0dldEltYWdlVHlwZShkaWIpICE9IEZJVF9CSVRNQVApIHsKKwkJcmV0dXJuOworCX0KKwkJCisJY29uc3QgdW5zaWduZWQgQnBwID0gRnJlZUltYWdlX0dldEJQUChkaWIpLzg7CisJaWYoQnBwICE9IDIpIHsKKwkJcmV0dXJuOworCX0KKwkJCisJQllURSogYml0cyA9IEZyZWVJbWFnZV9HZXRCaXRzKGRpYik7CisJY29uc3QgdW5zaWduZWQgaGVpZ2h0ID0gRnJlZUltYWdlX0dldEhlaWdodChkaWIpOworCWNvbnN0IHVuc2lnbmVkIHBpdGNoID0gRnJlZUltYWdlX0dldFBpdGNoKGRpYik7CisJCisJQllURSogbGluZSA9IGJpdHM7CisJZm9yKHVuc2lnbmVkIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyssIGxpbmUgKz0gcGl0Y2gpIHsKKwkJZm9yKEJZVEUqIHBpeGVsID0gbGluZTsgcGl4ZWwgPCBsaW5lICsgcGl0Y2ggOyBwaXhlbCArPSBCcHApIHsKKwkJCVN3YXBTaG9ydCgoV09SRCopcGl4ZWwpOworCQl9CisJfQorfQorI2VuZGlmIC8vIEZSRUVJTUFHRV9CSUdFTkRJQU4KKworRklCSVRNQVAqIFRhcmdhVGh1bWJuYWlsOjp0b0ZJQklUTUFQKCkgeworCWlmKGlzTnVsbCgpIHx8IF9kZXB0aCA9PSAwKSB7CisJCXJldHVybiBOVUxMOworCX0KKwkJCisJY29uc3QgdW5zaWduZWQgbGluZV9zaXplID0gX2RlcHRoICogX3cgLyA4OworCUZJQklUTUFQKiBkaWIgPSBGcmVlSW1hZ2VfQWxsb2NhdGUoX3csIF9oLCBfZGVwdGgpOworCWlmKCFkaWIpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJY29uc3QgQllURSogbGluZSA9IF9kYXRhOworCWNvbnN0IEJZVEUgaGVpZ2h0ID0gX2g7CisJZm9yIChCWVRFIGggPSAwOyBoIDwgaGVpZ2h0OyArK2gsIGxpbmUgKz0gbGluZV9zaXplKSB7CisJCUJZVEUqIGRzdF9saW5lID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgaGVpZ2h0IC0gMSAtIGgpOworCQltZW1jcHkoZHN0X2xpbmUsIGxpbmUsIGxpbmVfc2l6ZSk7CisJfQorCisjaWZkZWYgRlJFRUlNQUdFX0JJR0VORElBTgorCXN3YXBTaG9ydFBpeGVscyhkaWIpOworI2VuZGlmCisJCisjaWYgRlJFRUlNQUdFX0NPTE9ST1JERVIgPT0gRlJFRUlNQUdFX0NPTE9ST1JERVJfUkdCCisJU3dhcFJlZEJsdWUzMihkaWIpOworI2VuZGlmCisKKwlyZXR1cm4gZGliOworfQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gSW50ZXJuYWwgZnVuY3Rpb25zCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8qKiBUaGlzIGNsYXNzIGlzIHVzZWQgd2hlbiBsb2FkaW5nIFJMRSBjb21wcmVzc2VkIGltYWdlcywgaXQgaW1wbGVtZW50cyBpbyBjYWNoZSBvZiBmaXhlZCBzaXplLgorCUluIGdlbmVyYWwgUkxFIGNvbXByZXNzZWQgaW1hZ2VzICpzaG91bGQqIGJlIGNvbXByZXNzZWQgbGluZSBieSBsaW5lIHdpdGggbGluZSBzaXplcyBzdG9yZWQgaW4gU2NhbiBMaW5lIFRhYmxlIHNlY3Rpb24uCisJSW4gcmVhbGl0eSwgaG93ZXZlciB0aGVyZSBhcmUgaW1hZ2VzIG5vdCBvYmV5aW5nIHRoZSBzcGVjaWZpY2F0aW9uLCBjb21wcmVzc2luZyBpbWFnZSBkYXRhIGNvbnRpbnVvdXNseSBhY3Jvc3MgbGluZXMsCisJbWFraW5nIGl0IGltcG9zc2libGUgdG8gbG9hZCB0aGUgZmlsZSBjYWNoZWQgYXQgZXZlcnkgbGluZS4KKyovCitjbGFzcyBJT0NhY2hlCit7CitwdWJsaWM6CisJSU9DYWNoZShGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIHNpemVfdCBzaXplKSA6CisJCV9wdHIoTlVMTCksIF9iZWdpbihOVUxMKSwgX2VuZChOVUxMKSwgX3NpemUoc2l6ZSksIF9pbyhpbyksIF9oYW5kbGUoaGFuZGxlKQl7CisJCQlfYmVnaW4gPSAoQllURSopbWFsbG9jKHNpemUpOworCQkJaWYgKF9iZWdpbikgeworCQkJX2VuZCA9IF9iZWdpbiArIF9zaXplOworCQkJX3B0ciA9IF9lbmQ7CS8vIHdpbGwgZm9yY2UgcmVmaWxsIG9uIGZpcnN0IGFjY2VzcworCQl9CisJfQorCQorCX5JT0NhY2hlKCkgeworCQlpZiAoX2JlZ2luICE9IE5VTEwpIHsKKwkJCWZyZWUoX2JlZ2luKTsKKwkJfQkKKwl9CisJCQorCUJPT0wgaXNOdWxsKCkgeyByZXR1cm4gX2JlZ2luID09IE5VTEw7fQorCQorCWlubGluZQorCUJZVEUgZ2V0Qnl0ZSgpIHsKKwkJaWYgKF9wdHIgPj0gX2VuZCkgeworCQkJLy8gbmVlZCByZWZpbGwKKwkJCV9wdHIgPSBfYmVnaW47CisJCQlfaW8tPnJlYWRfcHJvYyhfcHRyLCBzaXplb2YoQllURSksICh1bnNpZ25lZClfc2l6ZSwgX2hhbmRsZSk7CS8vIyMjIEVPRiAtIG5vIHByb2JsZW0/CisJCX0KKworCQlCWVRFIHJlc3VsdCA9ICpfcHRyOworCisJCV9wdHIrKzsKKworCQlyZXR1cm4gcmVzdWx0OworCX0KKwkKKwlpbmxpbmUKKwlCWVRFKiBnZXRCeXRlcyhzaXplX3QgY291bnQgLyptdXN0IGJlIDwgX3NpemUhKi8pIHsKKwkJaWYgKF9wdHIgKyBjb3VudCA+PSBfZW5kKSB7CisJCQkKKwkJCS8vIG5lZWQgcmVmaWxsCisKKwkJCS8vICdjb3VudCcgYnl0ZXMgbWlnaHQgc3BhbiB0d28gY2FjaGUgYm91bmRzLAorCQkJLy8gU0VFSyBiYWNrIHRvIGFkZCB0aGUgcmVtYWlucyBvZiB0aGUgY3VycmVudCBjYWNoZSBhZ2FpbiBpbnRvIHRoZSBuZXcgb25lCisKKwkJCWxvbmcgcmVhZCA9IGxvbmcoX3B0ciAtIF9iZWdpbik7CisJCQlsb25nIHJlbWFpbmluZyA9IGxvbmcoX3NpemUgLSByZWFkKTsKKworCQkJX2lvLT5zZWVrX3Byb2MoX2hhbmRsZSwgLXJlbWFpbmluZywgU0VFS19DVVIpOworCisJCQlfcHRyID0gX2JlZ2luOworCQkJX2lvLT5yZWFkX3Byb2MoX3B0ciwgc2l6ZW9mKEJZVEUpLCAodW5zaWduZWQpX3NpemUsIF9oYW5kbGUpOwkvLyMjIyBFT0YgLSBubyBwcm9ibGVtPworCQl9CisKKwkJQllURSAqcmVzdWx0ID0gX3B0cjsKKworCQlfcHRyICs9IGNvdW50OworCisJCXJldHVybiByZXN1bHQ7CisJfQorCitwcml2YXRlOgorCUlPQ2FjaGUmIG9wZXJhdG9yPShjb25zdCBJT0NhY2hlJiBzcmMpOyAvLyBkZWxldGVkCisJSU9DYWNoZShjb25zdCBJT0NhY2hlJiBvdGhlcik7IC8vIGRlbGV0ZWQKKworcHJpdmF0ZToKKwlCWVRFICpfcHRyOworCUJZVEUgKl9iZWdpbjsKKwlCWVRFICpfZW5kOworCWNvbnN0IHNpemVfdCBfc2l6ZTsKKwljb25zdCBGcmVlSW1hZ2VJTyAqX2lvOwkKKwljb25zdCBmaV9oYW5kbGUgX2hhbmRsZTsJCit9OworCisjaWZkZWYgRlJFRUlNQUdFX0JJR0VORElBTgorc3RhdGljIHZvaWQKK1N3YXBIZWFkZXIoVEdBSEVBREVSICpoZWFkZXIpIHsKKwlTd2FwU2hvcnQoJmhlYWRlci0+Y21fZmlyc3RfZW50cnkpOworCVN3YXBTaG9ydCgmaGVhZGVyLT5jbV9sZW5ndGgpOworCVN3YXBTaG9ydCgmaGVhZGVyLT5pc194b3JpZ2luKTsKKwlTd2FwU2hvcnQoJmhlYWRlci0+aXNfeW9yaWdpbik7CisJU3dhcFNob3J0KCZoZWFkZXItPmlzX3dpZHRoKTsKKwlTd2FwU2hvcnQoJmhlYWRlci0+aXNfaGVpZ2h0KTsKK30KKworc3RhdGljIHZvaWQKK1N3YXBFeHRlbnNpb25BcmVhKFRHQUVYVEVOU0lPTkFSRUEgKmV4KSB7CisJU3dhcFNob3J0KCZleC0+ZXh0ZW5zaW9uX3NpemUpOworCVN3YXBTaG9ydCgmZXgtPmRhdGV0aW1lX3N0YW1wWzBdKTsKKwlTd2FwU2hvcnQoJmV4LT5kYXRldGltZV9zdGFtcFsxXSk7CisJU3dhcFNob3J0KCZleC0+ZGF0ZXRpbWVfc3RhbXBbMl0pOworCVN3YXBTaG9ydCgmZXgtPmRhdGV0aW1lX3N0YW1wWzNdKTsKKwlTd2FwU2hvcnQoJmV4LT5kYXRldGltZV9zdGFtcFs0XSk7CisJU3dhcFNob3J0KCZleC0+ZGF0ZXRpbWVfc3RhbXBbNV0pOworCVN3YXBTaG9ydCgmZXgtPmpvYl90aW1lWzBdKTsKKwlTd2FwU2hvcnQoJmV4LT5qb2JfdGltZVsxXSk7CisJU3dhcFNob3J0KCZleC0+am9iX3RpbWVbMl0pOworCVN3YXBMb25nICgmZXgtPmtleV9jb2xvcik7CisJU3dhcFNob3J0KCZleC0+cGl4ZWxfYXNwZWN0X3JhdGlvWzBdKTsKKwlTd2FwU2hvcnQoJmV4LT5waXhlbF9hc3BlY3RfcmF0aW9bMV0pOworCVN3YXBTaG9ydCgmZXgtPmdhbW1hX3ZhbHVlWzBdKTsKKwlTd2FwU2hvcnQoJmV4LT5nYW1tYV92YWx1ZVsxXSk7CisJU3dhcExvbmcgKCZleC0+Y29sb3JfY29ycmVjdGlvbl9vZmZzZXQpOworCVN3YXBMb25nICgmZXgtPnBvc3RhZ2Vfc3RhbXBfb2Zmc2V0KTsKKwlTd2FwTG9uZyAoJmV4LT5zY2FuX2xpbmVfb2Zmc2V0KTsKK30KKworc3RhdGljIHZvaWQKK1N3YXBGb290ZXIoVEdBRk9PVEVSICpmb290ZXIpIHsKKwlTd2FwTG9uZygmZm9vdGVyLT5leHRlbnNpb25fb2Zmc2V0KTsKKwlTd2FwTG9uZygmZm9vdGVyLT5kZXZlbG9wZXJfb2Zmc2V0KTsKK30KKworI2VuZGlmIC8vIEZSRUVJTUFHRV9CSUdFTkRJQU4KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gUGx1Z2luIEludGVyZmFjZQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitzdGF0aWMgaW50IHNfZm9ybWF0X2lkOworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBQbHVnaW4gSW1wbGVtZW50YXRpb24KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKK0Zvcm1hdCgpIHsKKwlyZXR1cm4gIlRBUkdBIjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKK0Rlc2NyaXB0aW9uKCkgeworCXJldHVybiAiVHJ1ZXZpc2lvbiBUYXJnYSI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCitFeHRlbnNpb24oKSB7CisJcmV0dXJuICJ0Z2EsdGFyZ2EiOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgorUmVnRXhwcigpIHsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKK01pbWVUeXBlKCkgeworCXJldHVybiAiaW1hZ2UveC10Z2EiOworfQorCitzdGF0aWMgQk9PTCAKK2lzVEFSR0EyMChGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUpIHsKKwljb25zdCB1bnNpZ25lZCBzaXplb2ZTaWcgPSAxODsKKwlCWVRFIHNpZ25hdHVyZVtzaXplb2ZTaWddOworCS8vIHRnYV9zaWduYXR1cmUgPSAiVFJVRVZJU0lPTi1YRklMRS4iIChUR0EgMi4wIG9ubHkpCisJQllURSB0Z2Ffc2lnbmF0dXJlW3NpemVvZlNpZ10gPSB7IDg0LCA4MiwgODUsIDY5LCA4NiwgNzMsIDgzLCA3MywgNzksIDc4LCA0NSwgODgsIDcwLCA3MywgNzYsIDY5LCA0NiwgMCB9OworCS8vIGdldCB0aGUgc3RhcnQgb2Zmc2V0CisJY29uc3QgbG9uZyBzdGFydF9vZmZzZXQgPSBpby0+dGVsbF9wcm9jKGhhbmRsZSk7CisJLy8gZ2V0IHRoZSBlbmQtb2YtZmlsZQorCWlvLT5zZWVrX3Byb2MoaGFuZGxlLCAwLCBTRUVLX0VORCk7CisJY29uc3QgbG9uZyBlb2YgPSBpby0+dGVsbF9wcm9jKGhhbmRsZSk7CisJLy8gcmVhZCB0aGUgc2lnbmF0dXJlCisJaW8tPnNlZWtfcHJvYyhoYW5kbGUsIHN0YXJ0X29mZnNldCArIGVvZiAtIHNpemVvZlNpZywgU0VFS19TRVQpOworCWlvLT5yZWFkX3Byb2MoJnNpZ25hdHVyZSwgMSwgc2l6ZW9mU2lnLCBoYW5kbGUpOworCS8vIHJld2luZAorCWlvLT5zZWVrX3Byb2MoaGFuZGxlLCBzdGFydF9vZmZzZXQsIFNFRUtfU0VUKTsKKwkJCisJcmV0dXJuIChtZW1jbXAodGdhX3NpZ25hdHVyZSwgc2lnbmF0dXJlLCBzaXplb2ZTaWcpID09IDApOworfQorCitzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYKK1ZhbGlkYXRlKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSkgeyAKKwlpZihpc1RBUkdBMjAoaW8sIGhhbmRsZSkpIHsKKwkJcmV0dXJuIFRSVUU7CisJfQorCQkKKwkvLyBub3QgYSAyLjAgaW1hZ2UsIHRyeSB0ZXN0aW5nIGlmIGl0J3MgYSB2YWxpZCBUR0EgYW55d2F5IChub3Qgcm9idXN0KQorCXsKKwkJY29uc3QgbG9uZyBzdGFydF9vZmZzZXQgPSBpby0+dGVsbF9wcm9jKGhhbmRsZSk7CisJCQorCQkvLyBnZXQgdGhlIGhlYWRlcgorCQlUR0FIRUFERVIgaGVhZGVyOworCQlpby0+cmVhZF9wcm9jKCZoZWFkZXIsIHNpemVvZih0YWdUR0FIRUFERVIpLCAxLCBoYW5kbGUpOworI2lmZGVmIEZSRUVJTUFHRV9CSUdFTkRJQU4KKwkJU3dhcEhlYWRlcigmaGVhZGVyKTsKKyNlbmRpZgorCQkvLyByZXdpbmQKKwkJaW8tPnNlZWtfcHJvYyhoYW5kbGUsIHN0YXJ0X29mZnNldCwgU0VFS19TRVQpOworCisJCS8vIHRoZSBjb2xvciBtYXAgdHlwZSBzaG91bGQgYmUgYSAwIG9yIGEgMS4uLgorCQlpZihoZWFkZXIuY29sb3JfbWFwX3R5cGUgIT0gMCAmJiBoZWFkZXIuY29sb3JfbWFwX3R5cGUgIT0gMSkgeworCQkJcmV0dXJuIEZBTFNFOworCQl9CisJCS8vIGlmIHRoZSBjb2xvciBtYXAgdHlwZSBpcyAxIHRoZW4gd2UgdmFsaWRhdGUgdGhlIG1hcCBlbnRyeSBpbmZvcm1hdGlvbi4uLgorCQlpZihoZWFkZXIuY29sb3JfbWFwX3R5cGUgPiAwKSB7CisJCQkvLyBpdCBkb2Vzbid0IG1ha2UgYW55IHNlbnNlIGlmIHRoZSBmaXJzdCBlbnRyeSBpcyBsYXJnZXIgdGhhbiB0aGUgY29sb3IgbWFwIHRhYmxlCisJCQlpZihoZWFkZXIuY21fZmlyc3RfZW50cnkgPj0gaGVhZGVyLmNtX2xlbmd0aCkgeworCQkJCXJldHVybiBGQUxTRTsKKwkJCX0KKwkJCS8vIGNoZWNrIGhlYWRlci5jbV9zaXplLCBkb24ndCBhbGxvdyAwIG9yIGFueXRoaW5nIGJpZ2dlciB0aGFuIDMyCisJCQlpZihoZWFkZXIuY21fc2l6ZSA9PSAwIHx8IGhlYWRlci5jbV9zaXplID4gMzIpIHsKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQl9CisJCX0KKwkJLy8gdGhlIHdpZHRoL2hlaWdodCBzaG91bGRuJ3QgYmUgMCwgcmlnaHQgPworCQlpZihoZWFkZXIuaXNfd2lkdGggPT0gMCB8fCBoZWFkZXIuaXNfaGVpZ2h0ID09IDApIHsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCQkvLyBsZXQncyBub3cgdmVyaWZ5IGFsbCB0aGUgdHlwZXMgdGhhdCBhcmUgc3VwcG9ydGVkIGJ5IEZyZWVJbWFnZSAodGhpcyBpcyBvdXIgZmluYWwgdmVyaWZpY2F0aW9uKQorCQlzd2l0Y2goaGVhZGVyLmltYWdlX3R5cGUpIHsKKwkJCWNhc2UgVEdBX0NNQVA6CisJCQljYXNlIFRHQV9SR0I6CisJCQljYXNlIFRHQV9NT05POgorCQkJY2FzZSBUR0FfUkxFQ01BUDoKKwkJCWNhc2UgVEdBX1JMRVJHQjoKKwkJCWNhc2UgVEdBX1JMRU1PTk86CisJCQkJc3dpdGNoKGhlYWRlci5pc19waXhlbF9kZXB0aCkgeworCQkJCQljYXNlIDgJOgorCQkJCQljYXNlIDE2OgorCQkJCQljYXNlIDI0OgorCQkJCQljYXNlIDMyOgorCQkJCQkJcmV0dXJuIFRSVUU7CisJCQkJCWRlZmF1bHQ6CisJCQkJCQlyZXR1cm4gRkFMU0U7CisJCQkJfQorCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gRkFMU0U7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBCT09MIERMTF9DQUxMQ09OVgorU3VwcG9ydHNFeHBvcnREZXB0aChpbnQgZGVwdGgpIHsKKwlyZXR1cm4gKAorCQkoZGVwdGggPT0gOCkgfHwKKwkJKGRlcHRoID09IDE2KSB8fAorCQkoZGVwdGggPT0gMjQpIHx8CisJCShkZXB0aCA9PSAzMikKKwkJKTsKK30KKworc3RhdGljIEJPT0wgRExMX0NBTExDT05WCitTdXBwb3J0c0V4cG9ydFR5cGUoRlJFRV9JTUFHRV9UWVBFIHR5cGUpIHsKKwlyZXR1cm4gKHR5cGUgPT0gRklUX0JJVE1BUCkgPyBUUlVFIDogRkFMU0U7Cit9CisKK3N0YXRpYyBCT09MIERMTF9DQUxMQ09OVgorU3VwcG9ydHNOb1BpeGVscygpIHsKKwlyZXR1cm4gVFJVRTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKioKK1VzZWQgZm9yIGFsbCAzMiBhbmQgMjQgYml0IGxvYWRpbmcgb2YgdW5jb21wcmVzc2VkIGltYWdlcworKi8KK3N0YXRpYyB2b2lkIAorbG9hZFRydWVDb2xvcihGSUJJVE1BUCogZGliLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBmaWxlX3BpeGVsX3NpemUsIEZyZWVJbWFnZUlPKiBpbywgZmlfaGFuZGxlIGhhbmRsZSwgQk9PTCBhczI0Yml0KSB7CisJY29uc3QgaW50IHBpeGVsX3NpemUgPSBhczI0Yml0ID8gMyA6IGZpbGVfcGl4ZWxfc2l6ZTsKKworCS8vIGlucHV0IGxpbmUgY2FjaGUKKwlCWVRFKiBmaWxlX2xpbmUgPSAoQllURSopbWFsbG9jKCB3aWR0aCAqIGZpbGVfcGl4ZWxfc2l6ZSk7CisKKwlpZiAoIWZpbGVfbGluZSkgeworCQl0aHJvdyBGSV9NU0dfRVJST1JfTUVNT1JZOworCX0KKworCWZvciAoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJQllURSAqYml0cyA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIHkpOworCQlpby0+cmVhZF9wcm9jKGZpbGVfbGluZSwgZmlsZV9waXhlbF9zaXplLCB3aWR0aCwgaGFuZGxlKTsKKwkJQllURSAqYmdyYSA9IGZpbGVfbGluZTsKKworCQlmb3IgKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKworCQkJYml0c1tGSV9SR0JBX0JMVUVdCT0gYmdyYVswXTsKKwkJCWJpdHNbRklfUkdCQV9HUkVFTl0gPSBiZ3JhWzFdOworCQkJYml0c1tGSV9SR0JBX1JFRF0JPSBiZ3JhWzJdOworCisJCQlpZiAoIWFzMjRiaXQpIHsKKwkJCQliaXRzW0ZJX1JHQkFfQUxQSEFdID0gYmdyYVszXTsKKwkJCX0KKworCQkJYmdyYSArPSBmaWxlX3BpeGVsX3NpemU7CisKKwkJCWJpdHMgKz0gcGl4ZWxfc2l6ZTsKKwkJfQorCX0KKworCWZyZWUoZmlsZV9saW5lKTsKK30KKworLyoqCitGb3IgdGhlIGdlbmVyaWMgUkxFIGxvYWRlciB3ZSBuZWVkIHRvIGFic3RyYWN0IGF3YXkgdGhlIHBpeGVsIGZvcm1hdC4KK1dlIHVzZSBhIHNwZWNpZmljIG92ZXJsb2FkIGJhc2VkIG9uIGJpdHMtcGVyLXBpeGVsIGZvciBlYWNoIHR5cGUgb2YgcGl4ZWwKKyovCisKK3RlbXBsYXRlIDxpbnQgbkJJVFM+CitpbmxpbmUgc3RhdGljIHZvaWQgCitfYXNzaWduUGl4ZWwoQllURSogYml0cywgQllURSogdmFsLCBCT09MIGFzMjRiaXQgPSBGQUxTRSkgeworCS8vIHN0YXRpYyBhc3NlcnQgc2hvdWxkIGdvIGhlcmUKKwlhc3NlcnQoRkFMU0UpOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIHZvaWQgCitfYXNzaWduUGl4ZWw8OD4oQllURSogYml0cywgQllURSogdmFsLCBCT09MIGFzMjRiaXQpIHsKKwkqYml0cyA9ICp2YWw7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgdm9pZCAKK19hc3NpZ25QaXhlbDwxNj4oQllURSogYml0cywgQllURSogdmFsLCBCT09MIGFzMjRiaXQpIHsKKwlXT1JEIHZhbHVlKCpyZWludGVycHJldF9jYXN0PFdPUkQqPih2YWwpKTsKKworI2lmZGVmIEZSRUVJTUFHRV9CSUdFTkRJQU4KKwlTd2FwU2hvcnQoJnZhbHVlKTsKKyNlbmRpZgorCisJaWYgKGFzMjRiaXQpIHsKKwkJYml0c1tGSV9SR0JBX0JMVUVdICA9IChCWVRFKSgoKCh2YWx1ZSAmIEZJMTZfNTU1X0JMVUVfTUFTSykgPj4gRkkxNl81NTVfQkxVRV9TSElGVCkgKiAweEZGKSAvIDB4MUYpOworCQliaXRzW0ZJX1JHQkFfR1JFRU5dID0gKEJZVEUpKCgoKHZhbHVlICYgRkkxNl81NTVfR1JFRU5fTUFTSykgPj4gRkkxNl81NTVfR1JFRU5fU0hJRlQpICogMHhGRikgLyAweDFGKTsKKwkJYml0c1tGSV9SR0JBX1JFRF0gICA9IChCWVRFKSgoKCh2YWx1ZSAmIEZJMTZfNTU1X1JFRF9NQVNLKSA+PiBGSTE2XzU1NV9SRURfU0hJRlQpICogMHhGRikgLyAweDFGKTsKKworCX0gZWxzZSB7CisJCSpyZWludGVycHJldF9jYXN0PFdPUkQgKj4oYml0cykgPSAweDdGRkYgJiB2YWx1ZTsKKwl9Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgdm9pZCAKK19hc3NpZ25QaXhlbDwyND4oQllURSogYml0cywgQllURSogdmFsLCBCT09MIGFzMjRiaXQpIHsKKwliaXRzW0ZJX1JHQkFfQkxVRV0JPSB2YWxbMF07CisJYml0c1tGSV9SR0JBX0dSRUVOXSA9IHZhbFsxXTsKKwliaXRzW0ZJX1JHQkFfUkVEXQk9IHZhbFsyXTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSB2b2lkIAorX2Fzc2lnblBpeGVsPDMyPihCWVRFKiBiaXRzLCBCWVRFKiB2YWwsIEJPT0wgYXMyNGJpdCkgeworCWlmIChhczI0Yml0KSB7CisJCV9hc3NpZ25QaXhlbDwyND4oYml0cywgdmFsLCBUUlVFKTsKKworCX0gZWxzZSB7CisjaWYgRlJFRUlNQUdFX0NPTE9ST1JERVIgPT0gRlJFRUlNQUdFX0NPTE9ST1JERVJfQkdSCisJCSoocmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCo+KGJpdHMpKSA9ICoocmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCo+ICh2YWwpKTsKKyNlbHNlIC8vIE5PVEUgVGhpcyBpcyBmYXN0ZXIgdGhlbiBkb2luZyByZWludGVycHJldF9jYXN0IHRvIGludCArIElOUExBQ0VTV0FQICEKKwkJYml0c1tGSV9SR0JBX0JMVUVdCT0gdmFsWzBdOworCQliaXRzW0ZJX1JHQkFfR1JFRU5dID0gdmFsWzFdOworCQliaXRzW0ZJX1JHQkFfUkVEXQk9IHZhbFsyXTsKKwkJYml0c1tGSV9SR0JBX0FMUEhBXQk9IHZhbFszXTsKKyNlbmRpZgorCX0KK30KKworLyoqCitHZW5lcmljIFJMRSBsb2FkZXIKKyovCit0ZW1wbGF0ZTxpbnQgYlBQPgorc3RhdGljIHZvaWQgCitsb2FkUkxFKEZJQklUTUFQKiBkaWIsIGludCB3aWR0aCwgaW50IGhlaWdodCwgRnJlZUltYWdlSU8qIGlvLCBmaV9oYW5kbGUgaGFuZGxlLCBsb25nIGVvZiwgQk9PTCBhczI0Yml0KSB7CisJY29uc3QgaW50IGZpbGVfcGl4ZWxfc2l6ZSA9IGJQUC84OworCWNvbnN0IGludCBwaXhlbF9zaXplID0gYXMyNGJpdCA/IDMgOiBmaWxlX3BpeGVsX3NpemU7CisKKwljb25zdCBCWVRFIGJwcCA9IGFzMjRiaXQgPyAyNCA6IGJQUDsKKwljb25zdCBpbnQgbGluZV9zaXplID0gQ2FsY3VsYXRlTGluZSh3aWR0aCwgYnBwKTsKKworCS8vIE5vdGUsIG1hbnkgb2YgdGhlIHBhcmFtcyBjYW4gYmUgY29tcHV0ZWQgaW5zaWRlIHRoZSBmdW5jdGlvbi4KKwkvLyBIb3dldmVyLCBiZWNhdXNlIHRoaXMgaXMgYSB0ZW1wbGF0ZSBmdW5jdGlvbiwgaXQgd2lsbCBsZWFkIHRvIHJlZHVuZGFudCBjb2RlIGR1cGxpY2F0aW9uLgorCisJQllURSBybGU7CisJQllURSAqbGluZV9iaXRzOworCisJLy8gdGhpcyBpcyB1c2VkIHRvIGd1YXJkIGFnYWluc3Qgd3JpdGluZyBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgaW1hZ2UgKG9uIGNvcnJ1cHRlZCBybGUgYmxvY2spCisJY29uc3QgQllURSogZGliX2VuZCA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIGhlaWdodCk7Ly88IG9uZS1wYXN0LWVuZCByb3cKKworCS8vIENvbXB1dGUgdGhlIHJvdWdoIHNpemUgb2YgYSBsaW5lLi4uCisJbG9uZyBwaXhlbHNfb2Zmc2V0ID0gaW8tPnRlbGxfcHJvYyhoYW5kbGUpOworCWxvbmcgc3ogPSAoKGVvZiAtIHBpeGVsc19vZmZzZXQpIC8gaGVpZ2h0KTsKKworCS8vIC4uLmFuZCBhbGxvY2F0ZSBjYWNoZSBvZiB0aGlzIHNpemUgKHlpZWxkcyBnb29kIHJlc3VsdHMpCisJSU9DYWNoZSBjYWNoZShpbywgaGFuZGxlLCBzeik7CisJaWYoY2FjaGUuaXNOdWxsKCkpIHsKKwkJRnJlZUltYWdlX1VubG9hZChkaWIpOworCQlkaWIgPSBOVUxMOworCQlyZXR1cm47CisJfQorCQkKKwlpbnQgeCA9IDAsIHkgPSAwOworCisJbGluZV9iaXRzID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgeSk7CisKKwl3aGlsZSAoeSA8IGhlaWdodCkgeworCisJCXJsZSA9IGNhY2hlLmdldEJ5dGUoKTsKKworCQlCT09MIGhhc19ybGUgPSBybGUgJiAweDgwOworCQlybGUgJj0gfjB4ODA7IC8vIHJlbW92ZSB0eXBlLWJpdAorCisJCUJZVEUgcGFja2V0X2NvdW50ID0gcmxlICsgMTsKKworCQkvL3BhY2tldF9jb3VudCBtaWdodCBiZSBjb3JydXB0LCB0ZXN0IGlmIHdlIGFyZSBub3QgYWJvdXQgdG8gd3JpdGUgYmV5b25kIHRoZSBsYXN0IGltYWdlIGJpdAorCisJCWlmICgobGluZV9iaXRzK3gpICsgcGFja2V0X2NvdW50KnBpeGVsX3NpemUgPiBkaWJfZW5kKSB7CisJCQlGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2Moc19mb3JtYXRfaWQsIEZJX01TR19FUlJPUl9DT1JSVVBURUQpOworCQkJLy8gcmV0dXJuIHdoYXQgaXMgbGVmdCBmcm9tIHRoZSBiaXRtYXAKKwkJCXJldHVybjsKKwkJfQorCisJCWlmIChoYXNfcmxlKSB7CisKKwkJCS8vIHJlYWQgYSBwaXhlbCB2YWx1ZSBmcm9tIGZpbGUuLi4KKwkJCUJZVEUgKnZhbCA9IGNhY2hlLmdldEJ5dGVzKGZpbGVfcGl4ZWxfc2l6ZSk7CisKKwkJCS8vLi4uYW5kIGZpbGwgcGFja2V0X2NvdW50IHBpeGVscyB3aXRoIGl0CisKKwkJCWZvciAoaW50IGl4ID0gMDsgaXggPCBwYWNrZXRfY291bnQ7IGl4KyspIHsKKwkJCQlfYXNzaWduUGl4ZWw8YlBQPigobGluZV9iaXRzK3gpLCB2YWwsIGFzMjRiaXQpOworCQkJCXggKz0gcGl4ZWxfc2l6ZTsKKworCQkJCWlmICh4ID49IGxpbmVfc2l6ZSkgeworCQkJCQl4ID0gMDsKKwkJCQkJeSsrOworCQkJCQlsaW5lX2JpdHMgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCB5KTsKKwkJCQl9CisJCQl9CisKKwkJfSBlbHNlIHsKKwkJCS8vIG5vIHJsZSBjb21tcHJlc2lvbgorCisJCQkvLyBjb3B5IHBhY2tldF9jb3VudCBwaXhlbHMgZnJvbSBmaWxlIHRvIGRpYgorCQkJZm9yIChpbnQgaXggPSAwOyBpeCA8IHBhY2tldF9jb3VudDsgaXgrKykgeworCQkJCUJZVEUgKnZhbCA9IGNhY2hlLmdldEJ5dGVzKGZpbGVfcGl4ZWxfc2l6ZSk7CisJCQkJX2Fzc2lnblBpeGVsPGJQUD4oKGxpbmVfYml0cyt4KSwgdmFsLCBhczI0Yml0KTsKKwkJCQl4ICs9IHBpeGVsX3NpemU7CisKKwkJCQlpZiAoeCA+PSBsaW5lX3NpemUpIHsKKwkJCQkJeCA9IDA7CisJCQkJCXkrKzsKKwkJCQkJbGluZV9iaXRzID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgeSk7CisJCQkJfQorCQkJfSAvLzwgcGFja2V0X2NvdW50CisJCX0gLy88IGhhc19ybGUKKworCX0gLy88IHdoaWxlIGhlaWdodAorCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBGSUJJVE1BUCAqIERMTF9DQUxMQ09OVgorTG9hZChGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIGludCBwYWdlLCBpbnQgZmxhZ3MsIHZvaWQgKmRhdGEpIHsKKwlGSUJJVE1BUCAqZGliID0gTlVMTDsKKworCWlmICghaGFuZGxlKSB7CisJCXJldHVybiBOVUxMOworCX0KKworCXRyeSB7CisJCQorCQljb25zdCBCT09MIGhlYWRlcl9vbmx5ID0gIChmbGFncyAmIEZJRl9MT0FEX05PUElYRUxTKSA9PSBGSUZfTE9BRF9OT1BJWEVMUzsKKwkJCQkKKwkJLy8gcmVtZW1iZXIgdGhlIHN0YXJ0IG9mZnNldAorCQlsb25nIHN0YXJ0X29mZnNldCA9IGlvLT50ZWxsX3Byb2MoaGFuZGxlKTsKKworCQkvLyByZW1lbWJlciBlbmQtb2YtZmlsZSAodXNlZCBmb3IgUkxFIGNhY2hlKQorCQlpby0+c2Vla19wcm9jKGhhbmRsZSwgMCwgU0VFS19FTkQpOworCQlsb25nIGVvZiA9IGlvLT50ZWxsX3Byb2MoaGFuZGxlKTsKKwkJaW8tPnNlZWtfcHJvYyhoYW5kbGUsIHN0YXJ0X29mZnNldCwgU0VFS19TRVQpOworCisJCS8vIHJlYWQgYW5kIHByb2Nlc3MgdGhlIGJpdG1hcCdzIGZvb3RlcgorCisJCVRhcmdhVGh1bWJuYWlsIHRodW1ibmFpbDsKKwkJaWYoaXNUQVJHQTIwKGlvLCBoYW5kbGUpKSB7CisJCQlUR0FGT09URVIgZm9vdGVyOworCQkJY29uc3QgbG9uZyBmb290ZXJfb2Zmc2V0ID0gc3RhcnRfb2Zmc2V0ICsgZW9mIC0gc2l6ZW9mKGZvb3Rlcik7CisJCQkKKwkJCWlvLT5zZWVrX3Byb2MoaGFuZGxlLCBmb290ZXJfb2Zmc2V0LCBTRUVLX1NFVCk7CisJCQlpby0+cmVhZF9wcm9jKCZmb290ZXIsIHNpemVvZih0YWdUR0FGT09URVIpLCAxLCBoYW5kbGUpOworCQkJCisjaWZkZWYgRlJFRUlNQUdFX0JJR0VORElBTgorCQkJU3dhcEZvb3RlcigmZm9vdGVyKTsKKyNlbmRpZgorCQkJQk9PTCBoYXNFeHRlbnNpb25BcmVhID0gZm9vdGVyLmV4dGVuc2lvbl9vZmZzZXQgPiAwOworCQkJaWYoaGFzRXh0ZW5zaW9uQXJlYSkgeyAKKwkJCQlUR0FFWFRFTlNJT05BUkVBIGV4dGVuc2lvbmFyZWE7CisJCQkJaW8tPnNlZWtfcHJvYyhoYW5kbGUsIGZvb3Rlci5leHRlbnNpb25fb2Zmc2V0LCBTRUVLX1NFVCk7CisJCQkJaW8tPnJlYWRfcHJvYygmZXh0ZW5zaW9uYXJlYSwgc2l6ZW9mKGV4dGVuc2lvbmFyZWEpLCAxLCBoYW5kbGUpOworCQkJCQorI2lmZGVmIEZSRUVJTUFHRV9CSUdFTkRJQU4KKwkJCQlTd2FwRXh0ZW5zaW9uQXJlYSgmZXh0ZW5zaW9uYXJlYSk7CisjZW5kaWYKKworCQkJCURXT1JEIHBvc3RhZ2Vfc3RhbXBfb2Zmc2V0ID0gZXh0ZW5zaW9uYXJlYS5wb3N0YWdlX3N0YW1wX29mZnNldDsKKwkJCQlCT09MIGhhc1RodW1ibmFpbCA9IChwb3N0YWdlX3N0YW1wX29mZnNldCA+IDApICYmIChwb3N0YWdlX3N0YW1wX29mZnNldCA8IChEV09SRClmb290ZXJfb2Zmc2V0KTsKKwkJCQlpZihoYXNUaHVtYm5haWwpIHsKKwkJCQkJaW8tPnNlZWtfcHJvYyhoYW5kbGUsIHBvc3RhZ2Vfc3RhbXBfb2Zmc2V0LCBTRUVLX1NFVCk7CisJCQkJCXRodW1ibmFpbC5yZWFkKGlvLCBoYW5kbGUsIGZvb3Rlcl9vZmZzZXQgLSBwb3N0YWdlX3N0YW1wX29mZnNldCk7CisJCQkJfQorCQkJfQorCQl9CisJCQorCQkvLyByZWFkIGFuZCBwcm9jZXNzIHRoZSBiaXRtYXAncyBoZWFkZXIKKworCQlUR0FIRUFERVIgaGVhZGVyOworCisJCWlvLT5zZWVrX3Byb2MoaGFuZGxlLCBzdGFydF9vZmZzZXQsIFNFRUtfU0VUKTsKKwkJaW8tPnJlYWRfcHJvYygmaGVhZGVyLCBzaXplb2YodGFnVEdBSEVBREVSKSwgMSwgaGFuZGxlKTsKKworI2lmZGVmIEZSRUVJTUFHRV9CSUdFTkRJQU4KKwkJU3dhcEhlYWRlcigmaGVhZGVyKTsKKyNlbmRpZgorCisJCXRodW1ibmFpbC5zZXREZXB0aChoZWFkZXIuaXNfcGl4ZWxfZGVwdGgpOworCQkJCisJCWNvbnN0IGludCBsaW5lID0gQ2FsY3VsYXRlTGluZShoZWFkZXIuaXNfd2lkdGgsIGhlYWRlci5pc19waXhlbF9kZXB0aCk7CisJCWNvbnN0IGludCBwaXhlbF9iaXRzID0gaGVhZGVyLmlzX3BpeGVsX2RlcHRoOworCQljb25zdCBpbnQgcGl4ZWxfc2l6ZSA9IHBpeGVsX2JpdHMvODsKKworCQlpbnQgZmxpcGhvcml6ID0gKGhlYWRlci5pc19pbWFnZV9kZXNjcmlwdG9yICYgMHgxMCkgPyAxIDogMDsKKwkJaW50IGZsaXB2ZXJ0ID0gKGhlYWRlci5pc19pbWFnZV9kZXNjcmlwdG9yICYgMHgyMCkgPyAxIDogMDsKKworCQkvLyBza2lwIGNvbW1lbnQKKwkJaW8tPnNlZWtfcHJvYyhoYW5kbGUsIGhlYWRlci5pZF9sZW5ndGgsIFNFRUtfQ1VSKTsKKworCQlzd2l0Y2ggKGhlYWRlci5pc19waXhlbF9kZXB0aCkgeworCQkJY2FzZSA4IDogeworCQkJCWRpYiA9IEZyZWVJbWFnZV9BbGxvY2F0ZUhlYWRlcihoZWFkZXJfb25seSwgaGVhZGVyLmlzX3dpZHRoLCBoZWFkZXIuaXNfaGVpZ2h0LCA4KTsKKwkJCQkKKwkJCQlpZiAoZGliID09IE5VTEwpIHsKKwkJCQkJdGhyb3cgRklfTVNHX0VSUk9SX0RJQl9NRU1PUlk7CisJCQkJfQorCQkJCQkKKwkJCQkvLyByZWFkIHRoZSBwYWxldHRlIChldmVuIGlmIGhlYWRlciBvbmx5KQorCisJCQkJUkdCUVVBRCAqcGFsZXR0ZSA9IEZyZWVJbWFnZV9HZXRQYWxldHRlKGRpYik7CisKKwkJCQlpZiAoaGVhZGVyLmNvbG9yX21hcF90eXBlID4gMCkgeworCQkJCQl1bnNpZ25lZCBjb3VudCwgY3NpemU7CisKKwkJCQkJLy8gY2FsY3VsYXRlIHRoZSBjb2xvciBtYXAgc2l6ZQorCQkJCQljc2l6ZSA9IGhlYWRlci5jbV9sZW5ndGggKiBoZWFkZXIuY21fc2l6ZSAvIDg7CisJCQkJCQorCQkJCQkvLyByZWFkIHRoZSBjb2xvciBtYXAKKwkJCQkJQllURSAqY21hcCA9IChCWVRFKiltYWxsb2MoY3NpemUgKiBzaXplb2YoQllURSkpOworCQkJCQlpZiAoY21hcCA9PSBOVUxMKSB7CisJCQkJCQl0aHJvdyBGSV9NU0dfRVJST1JfRElCX01FTU9SWTsKKwkJCQkJfQorCQkJCQlpby0+cmVhZF9wcm9jKGNtYXAsIHNpemVvZihCWVRFKSwgY3NpemUsIGhhbmRsZSk7CisKKwkJCQkJLy8gYnVpbGQgdGhlIHBhbGV0dGUKKworCQkJCQlzd2l0Y2ggKGhlYWRlci5jbV9zaXplKSB7CisJCQkJCQljYXNlIDE2OiB7CisJCQkJCQkJV09SRCAqcmdiNTU1ID0gKFdPUkQqKSZjbWFwWzBdOworCQkJCQkJCXVuc2lnbmVkIHN0YXJ0ID0gKHVuc2lnbmVkKWhlYWRlci5jbV9maXJzdF9lbnRyeTsKKwkJCQkJCQl1bnNpZ25lZCBzdG9wID0gTUlOKCh1bnNpZ25lZCkyNTYsICh1bnNpZ25lZCloZWFkZXIuY21fbGVuZ3RoKTsKKworCQkJCQkJCWZvciAoY291bnQgPSBzdGFydDsgY291bnQgPCBzdG9wOyBjb3VudCsrKSB7CisJCQkJCQkJCXBhbGV0dGVbY291bnRdLnJnYlJlZCAgID0gKEJZVEUpKCgoKCpyZ2I1NTUgJiBGSTE2XzU1NV9SRURfTUFTSykgPj4gRkkxNl81NTVfUkVEX1NISUZUKSAqIDB4RkYpIC8gMHgxRik7CisJCQkJCQkJCXBhbGV0dGVbY291bnRdLnJnYkdyZWVuID0gKEJZVEUpKCgoKCpyZ2I1NTUgJiBGSTE2XzU1NV9HUkVFTl9NQVNLKSA+PiBGSTE2XzU1NV9HUkVFTl9TSElGVCkgKiAweEZGKSAvIDB4MUYpOworCQkJCQkJCQlwYWxldHRlW2NvdW50XS5yZ2JCbHVlICA9IChCWVRFKSgoKCgqcmdiNTU1ICYgRkkxNl81NTVfQkxVRV9NQVNLKSA+PiBGSTE2XzU1NV9CTFVFX1NISUZUKSAqIDB4RkYpIC8gMHgxRik7CisJCQkJCQkJCXJnYjU1NSsrOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCisJCQkJCQljYXNlIDI0OiB7CisJCQkJCQkJRklMRV9CR1IgKmJnciA9IChGSUxFX0JHUiopJmNtYXBbMF07CisJCQkJCQkJdW5zaWduZWQgc3RhcnQgPSAodW5zaWduZWQpaGVhZGVyLmNtX2ZpcnN0X2VudHJ5OworCQkJCQkJCXVuc2lnbmVkIHN0b3AgPSBNSU4oKHVuc2lnbmVkKTI1NiwgKHVuc2lnbmVkKWhlYWRlci5jbV9sZW5ndGgpOworCisJCQkJCQkJZm9yIChjb3VudCA9IHN0YXJ0OyBjb3VudCA8IHN0b3A7IGNvdW50KyspIHsKKwkJCQkJCQkJcGFsZXR0ZVtjb3VudF0ucmdiQmx1ZSAgPSBiZ3ItPmI7CisJCQkJCQkJCXBhbGV0dGVbY291bnRdLnJnYkdyZWVuID0gYmdyLT5nOworCQkJCQkJCQlwYWxldHRlW2NvdW50XS5yZ2JSZWQgICA9IGJnci0+cjsKKwkJCQkJCQkJYmdyKys7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJYnJlYWs7CisKKwkJCQkJCWNhc2UgMzI6IHsKKwkJCQkJCQlCWVRFIHRybnNbMjU2XTsKKworCQkJCQkJCS8vIGNsZWFyIHRoZSB0cmFuc3BhcmVuY3kgdGFibGUKKwkJCQkJCQltZW1zZXQodHJucywgMHhGRiwgMjU2KTsKKworCQkJCQkJCUZJTEVfQkdSQSAqYmdyYSA9IChGSUxFX0JHUkEqKSZjbWFwWzBdOworCQkJCQkJCXVuc2lnbmVkIHN0YXJ0ID0gKHVuc2lnbmVkKWhlYWRlci5jbV9maXJzdF9lbnRyeTsKKwkJCQkJCQl1bnNpZ25lZCBzdG9wID0gTUlOKCh1bnNpZ25lZCkyNTYsICh1bnNpZ25lZCloZWFkZXIuY21fbGVuZ3RoKTsKKworCQkJCQkJCWZvciAoY291bnQgPSBzdGFydDsgY291bnQgPCBzdG9wOyBjb3VudCsrKSB7CisJCQkJCQkJCXBhbGV0dGVbY291bnRdLnJnYkJsdWUgID0gYmdyYS0+YjsKKwkJCQkJCQkJcGFsZXR0ZVtjb3VudF0ucmdiR3JlZW4gPSBiZ3JhLT5nOworCQkJCQkJCQlwYWxldHRlW2NvdW50XS5yZ2JSZWQgICA9IGJncmEtPnI7CisJCQkJCQkJCS8vIGFscGhhCisJCQkJCQkJCXRybnNbY291bnRdID0gYmdyYS0+YTsKKwkJCQkJCQkJYmdyYSsrOworCQkJCQkJCX0KKworCQkJCQkJCS8vIHNldCB0aGUgdHJhbnBhcmVuY3kgdGFibGUKKwkJCQkJCQlGcmVlSW1hZ2VfU2V0VHJhbnNwYXJlbmN5VGFibGUoZGliLCB0cm5zLCAyNTYpOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisKKwkJCQkJfSAvLyBzd2l0Y2goaGVhZGVyLmNtX3NpemUpCisKKwkJCQkJZnJlZShjbWFwKTsKKwkJCQl9CisJCQkJCisJCQkJLy8gaGFuZGxlIHRodW1ibmFpbAorCQkJCQorCQkJCUZJQklUTUFQKiB0aCA9IHRodW1ibmFpbC50b0ZJQklUTUFQKCk7CisJCQkJaWYodGgpIHsKKwkJCQkJUkdCUVVBRCogcGFsID0gRnJlZUltYWdlX0dldFBhbGV0dGUoZGliKTsKKwkJCQkJUkdCUVVBRCogZHN0X3BhbCA9IEZyZWVJbWFnZV9HZXRQYWxldHRlKHRoKTsKKwkJCQkJaWYoZHN0X3BhbCAmJiBwYWwpIHsKKwkJCQkJCWZvcih1bnNpZ25lZCBpID0gMDsgaSA8IEZyZWVJbWFnZV9HZXRDb2xvcnNVc2VkKGRpYik7IGkrKykgeworCQkJCQkJCWRzdF9wYWxbaV0gPSBwYWxbaV07CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQlGcmVlSW1hZ2VfU2V0VHJhbnNwYXJlbmN5VGFibGUodGgsIEZyZWVJbWFnZV9HZXRUcmFuc3BhcmVuY3lUYWJsZShkaWIpLCBGcmVlSW1hZ2VfR2V0VHJhbnNwYXJlbmN5Q291bnQoZGliKSk7CisJCQkJCQorCQkJCQlGcmVlSW1hZ2VfU2V0VGh1bWJuYWlsKGRpYiwgdGgpOworCQkJCQlGcmVlSW1hZ2VfVW5sb2FkKHRoKTsJCQkJCisJCQkJfQorCisJCQkJaWYoaGVhZGVyX29ubHkpIHsKKwkJCQkJcmV0dXJuIGRpYjsKKwkJCQl9CisJCQkJCQorCQkJCS8vIHJlYWQgaW4gdGhlIGJpdG1hcCBiaXRzCisKKwkJCQlzd2l0Y2ggKGhlYWRlci5pbWFnZV90eXBlKSB7CisJCQkJCWNhc2UgVEdBX0NNQVA6CisJCQkJCWNhc2UgVEdBX01PTk86IHsKKwkJCQkJCUJZVEUgKmJpdHMgPSBOVUxMOworCisJCQkJCQlmb3IgKHVuc2lnbmVkIGNvdW50ID0gMDsgY291bnQgPCBoZWFkZXIuaXNfaGVpZ2h0OyBjb3VudCsrKSB7CisJCQkJCQkJYml0cyA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIGNvdW50KTsKKwkJCQkJCQlpby0+cmVhZF9wcm9jKGJpdHMsIHNpemVvZihCWVRFKSwgbGluZSwgaGFuZGxlKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlicmVhazsKKworCQkJCQljYXNlIFRHQV9STEVDTUFQOgorCQkJCQljYXNlIFRHQV9STEVNT05POiB7IC8vKDggYml0KQorCQkJCQkJbG9hZFJMRTw4PihkaWIsIGhlYWRlci5pc193aWR0aCwgaGVhZGVyLmlzX2hlaWdodCwgaW8sIGhhbmRsZSwgZW9mLCBGQUxTRSk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisKKwkJCQkJZGVmYXVsdCA6CisJCQkJCQlGcmVlSW1hZ2VfVW5sb2FkKGRpYik7CisJCQkJCQlyZXR1cm4gTlVMTDsKKwkJCQl9CisJCQl9CisJCQlicmVhazsgLy8gaGVhZGVyLmlzX3BpeGVsX2RlcHRoID09IDgKKworCQkJY2FzZSAxNSA6CisKKwkJCWNhc2UgMTYgOiB7CisJCQkJaW50IHBpeGVsX2JpdHMgPSAxNjsKKworCQkJCS8vIGFsbG9jYXRlIHRoZSBkaWIKKworCQkJCWlmIChUQVJHQV9MT0FEX1JHQjg4OCAmIGZsYWdzKSB7CisJCQkJCXBpeGVsX2JpdHMgPSAyNDsKKwkJCQkJZGliID0gRnJlZUltYWdlX0FsbG9jYXRlSGVhZGVyKGhlYWRlcl9vbmx5LCBoZWFkZXIuaXNfd2lkdGgsIGhlYWRlci5pc19oZWlnaHQsIHBpeGVsX2JpdHMsIEZJX1JHQkFfUkVEX01BU0ssIEZJX1JHQkFfR1JFRU5fTUFTSywgRklfUkdCQV9CTFVFX01BU0spOworCisJCQkJfSBlbHNlIHsKKwkJCQkJZGliID0gRnJlZUltYWdlX0FsbG9jYXRlSGVhZGVyKGhlYWRlcl9vbmx5LCBoZWFkZXIuaXNfd2lkdGgsIGhlYWRlci5pc19oZWlnaHQsIHBpeGVsX2JpdHMsIEZJMTZfNTU1X1JFRF9NQVNLLCBGSTE2XzU1NV9HUkVFTl9NQVNLLCBGSTE2XzU1NV9CTFVFX01BU0spOworCQkJCX0KKworCQkJCWlmIChkaWIgPT0gTlVMTCkgeworCQkJCQl0aHJvdyBGSV9NU0dfRVJST1JfRElCX01FTU9SWTsKKwkJCQl9CisJCQkJCisJCQkJLy8gaGFuZGxlIHRodW1ibmFpbAorCQkJCQorCQkJCUZJQklUTUFQKiB0aCA9IHRodW1ibmFpbC50b0ZJQklUTUFQKCk7CisJCQkJaWYodGgpIHsKKwkJCQkJaWYoVEFSR0FfTE9BRF9SR0I4ODggJiBmbGFncykgeworCQkJCQkJRklCSVRNQVAqIHQgPSBGcmVlSW1hZ2VfQ29udmVydFRvMjRCaXRzKHRoKTsKKwkJCQkJCUZyZWVJbWFnZV9VbmxvYWQodGgpOworCQkJCQkJdGggPSB0OworCQkJCQl9CisKKwkJCQkJRnJlZUltYWdlX1NldFRodW1ibmFpbChkaWIsIHRoKTsKKwkJCQkJRnJlZUltYWdlX1VubG9hZCh0aCk7CisJCQkJfQorCQkJCQkJCisJCQkJaWYoaGVhZGVyX29ubHkpIHsKKwkJCQkJcmV0dXJuIGRpYjsKKwkJCQl9CisKKwkJCQlpbnQgbGluZSA9IENhbGN1bGF0ZUxpbmUoaGVhZGVyLmlzX3dpZHRoLCBwaXhlbF9iaXRzKTsKKworCQkJCWNvbnN0IHVuc2lnbmVkIHBpeGVsX3NpemUgPSB1bnNpZ25lZChwaXhlbF9iaXRzKSAvIDg7CisJCQkJY29uc3QgdW5zaWduZWQgc3JjX3BpeGVsX3NpemUgPSBzaXplb2YoV09SRCk7CisKKwkJCQkvLyBub3RlIGhlYWRlci5jbV9zaXplIGlzIGEgbWlzbGVhZGluZyBuYW1lLCBpdCBzaG91bGQgYmUgc2VlbiBhcyBoZWFkZXIuY21fYml0cworCQkJCS8vIGlnbm9yZSBjdXJyZW50IHBvc2l0aW9uIGluIGZpbGUgYW5kIHNldCBmaWxlcG9pbnRlciBleHBsaWNpdGx5IGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZQorCisJCQkJaW50IGdhcmJsZW4gPSAwOworCisJCQkJaWYgKGhlYWRlci5jb2xvcl9tYXBfdHlwZSAhPSAwKSB7CisJCQkJCWdhcmJsZW4gPSAoaW50KSgoaGVhZGVyLmNtX3NpemUgKyA3KSAvIDgpICogaGVhZGVyLmNtX2xlbmd0aDsgLyogc2hvdWxkIGJ5dGUgYWxpZ24gKi8KKworCQkJCX0gZWxzZSB7CisJCQkJCWdhcmJsZW4gPSAwOworCQkJCX0KKworCQkJCWlvLT5zZWVrX3Byb2MoaGFuZGxlLCBzdGFydF9vZmZzZXQsIFNFRUtfU0VUKTsKKwkJCQlpby0+c2Vla19wcm9jKGhhbmRsZSwgc2l6ZW9mKHRhZ1RHQUhFQURFUikgKyBoZWFkZXIuaWRfbGVuZ3RoICsgZ2FyYmxlbiwgU0VFS19TRVQpOworCisJCQkJLy8gcmVhZCBpbiB0aGUgYml0bWFwIGJpdHMKKworCQkJCXN3aXRjaCAoaGVhZGVyLmltYWdlX3R5cGUpIHsKKwkJCQkJY2FzZSBUR0FfUkdCOiB7IC8vKDE2IGJpdCkKKwkJCQkJCS8vIGlucHV0IGxpbmUgY2FjaGUKKwkJCQkJCUJZVEUgKmluX2xpbmUgPSAoQllURSopbWFsbG9jKGhlYWRlci5pc193aWR0aCAqIHNpemVvZihXT1JEKSk7CisKKwkJCQkJCWlmICghaW5fbGluZSkKKwkJCQkJCQl0aHJvdyBGSV9NU0dfRVJST1JfTUVNT1JZOworCisJCQkJCQljb25zdCBpbnQgaCA9IGhlYWRlci5pc19oZWlnaHQ7CisKKwkJCQkJCWZvciAoaW50IHkgPSAwOyB5IDwgaDsgeSsrKSB7CisJCQkJCQkJCisJCQkJCQkJQllURSAqYml0cyA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIHkpOworCQkJCQkJCWlvLT5yZWFkX3Byb2MoaW5fbGluZSwgc3JjX3BpeGVsX3NpemUsIGhlYWRlci5pc193aWR0aCwgaGFuZGxlKTsKKwkJCQkJCQkKKwkJCQkJCQlCWVRFICp2YWwgPSBpbl9saW5lOworCQkJCQkJCWZvciAoaW50IHggPSAwOyB4IDwgbGluZTsgeCArPSBwaXhlbF9zaXplKSB7CisKKwkJCQkJCQkJX2Fzc2lnblBpeGVsPDE2PihiaXRzK3gsIHZhbCwgVEFSR0FfTE9BRF9SR0I4ODggJiBmbGFncyk7CisKKwkJCQkJCQkJdmFsICs9IHNyY19waXhlbF9zaXplOworCQkJCQkJCX0KKwkJCQkJCX0KKworCQkJCQkJZnJlZShpbl9saW5lKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKworCQkJCQljYXNlIFRHQV9STEVSR0I6IHsgLy8oMTYgYml0KQorCQkJCQkJbG9hZFJMRTwxNj4oZGliLCBoZWFkZXIuaXNfd2lkdGgsIGhlYWRlci5pc19oZWlnaHQsIGlvLCBoYW5kbGUsIGVvZiwgVEFSR0FfTE9BRF9SR0I4ODggJiBmbGFncyk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisKKwkJCQkJZGVmYXVsdCA6CisJCQkJCQlGcmVlSW1hZ2VfVW5sb2FkKGRpYik7CisJCQkJCQlyZXR1cm4gTlVMTDsKKwkJCQl9CisJCQl9CisJCQlicmVhazsgLy8gaGVhZGVyLmlzX3BpeGVsX2RlcHRoID09IDE1IG9yIDE2CisKKwkJCWNhc2UgMjQgOiB7CisKKwkJCQlkaWIgPSBGcmVlSW1hZ2VfQWxsb2NhdGVIZWFkZXIoaGVhZGVyX29ubHksIGhlYWRlci5pc193aWR0aCwgaGVhZGVyLmlzX2hlaWdodCwgcGl4ZWxfYml0cywgRklfUkdCQV9SRURfTUFTSywgRklfUkdCQV9HUkVFTl9NQVNLLCBGSV9SR0JBX0JMVUVfTUFTSyk7CisKKwkJCQlpZiAoZGliID09IE5VTEwpIHsKKwkJCQkJdGhyb3cgRklfTVNHX0VSUk9SX0RJQl9NRU1PUlk7CisJCQkJfQorCQkJCQorCQkJCUZJQklUTUFQKiB0aCA9IHRodW1ibmFpbC50b0ZJQklUTUFQKCk7CisJCQkJaWYodGgpIHsKKwkJCQkJRnJlZUltYWdlX1NldFRodW1ibmFpbChkaWIsIHRoKTsKKwkJCQkJRnJlZUltYWdlX1VubG9hZCh0aCk7CisJCQkJfQorCQkJCQorCQkJCWlmKGhlYWRlcl9vbmx5KSB7CisJCQkJCXJldHVybiBkaWI7CisJCQkJfQorCQkJCQkKKwkJCQkvLyByZWFkIGluIHRoZSBiaXRtYXAgYml0cworCisJCQkJc3dpdGNoIChoZWFkZXIuaW1hZ2VfdHlwZSkgeworCQkJCQljYXNlIFRHQV9SR0I6IHsgLy8oMjQgYml0KQorCQkJCQkJLy91bmNvbXByZXNzZWQKKwkJCQkJCWxvYWRUcnVlQ29sb3IoZGliLCBoZWFkZXIuaXNfd2lkdGgsIGhlYWRlci5pc19oZWlnaHQsIHBpeGVsX3NpemUsaW8sIGhhbmRsZSwgVFJVRSk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBUR0FfUkxFUkdCOiB7IC8vKDI0IGJpdCkKKwkJCQkJCWxvYWRSTEU8MjQ+KGRpYiwgaGVhZGVyLmlzX3dpZHRoLCBoZWFkZXIuaXNfaGVpZ2h0LCBpbywgaGFuZGxlLCBlb2YsIFRSVUUpOworCQkJCQl9CisJCQkJCWJyZWFrOworCisJCQkJCWRlZmF1bHQgOgorCQkJCQkJRnJlZUltYWdlX1VubG9hZChkaWIpOworCQkJCQkJcmV0dXJuIE5VTEw7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CS8vIGhlYWRlci5pc19waXhlbF9kZXB0aCA9PSAyNAorCisJCQljYXNlIDMyIDogeworCQkJCWludCBwaXhlbF9iaXRzID0gMzI7CisKKwkJCQlpZiAoVEFSR0FfTE9BRF9SR0I4ODggJiBmbGFncykgeworCQkJCQlwaXhlbF9iaXRzID0gMjQ7CisJCQkJfQorCisJCQkJZGliID0gRnJlZUltYWdlX0FsbG9jYXRlSGVhZGVyKGhlYWRlcl9vbmx5LCBoZWFkZXIuaXNfd2lkdGgsIGhlYWRlci5pc19oZWlnaHQsIHBpeGVsX2JpdHMsIEZJX1JHQkFfUkVEX01BU0ssIEZJX1JHQkFfR1JFRU5fTUFTSywgRklfUkdCQV9CTFVFX01BU0spOworCisJCQkJaWYgKGRpYiA9PSBOVUxMKSB7CisJCQkJCXRocm93IEZJX01TR19FUlJPUl9ESUJfTUVNT1JZOworCQkJCX0KKwkJCQkKKwkJCQkvLyBoYW5kbGUgdGh1bWJuYWlsCisJCQkJCisJCQkJRklCSVRNQVAqIHRoID0gdGh1bWJuYWlsLnRvRklCSVRNQVAoKTsKKwkJCQlpZih0aCkgeworCQkJCQlpZihUQVJHQV9MT0FEX1JHQjg4OCAmIGZsYWdzKSB7CisJCQkJCQlGSUJJVE1BUCogdCA9IEZyZWVJbWFnZV9Db252ZXJ0VG8yNEJpdHModGgpOworCQkJCQkJRnJlZUltYWdlX1VubG9hZCh0aCk7CisJCQkJCQl0aCA9IHQ7CisJCQkJCX0KKwkJCQkJRnJlZUltYWdlX1NldFRodW1ibmFpbChkaWIsIHRoKTsKKwkJCQkJRnJlZUltYWdlX1VubG9hZCh0aCk7CisJCQkJfQorCisJCQkJaWYoaGVhZGVyX29ubHkpIHsKKwkJCQkJcmV0dXJuIGRpYjsKKwkJCQl9CisJCQkJCQorCQkJCS8vIHJlYWQgaW4gdGhlIGJpdG1hcCBiaXRzCisKKwkJCQlzd2l0Y2ggKGhlYWRlci5pbWFnZV90eXBlKSB7CisJCQkJCWNhc2UgVEdBX1JHQjogeyAvLygzMiBiaXQpCisJCQkJCQkvLyB1bmNvbXByZXNzZWQKKwkJCQkJCWxvYWRUcnVlQ29sb3IoZGliLCBoZWFkZXIuaXNfd2lkdGgsIGhlYWRlci5pc19oZWlnaHQsIDQgLypmaWxlX3BpeGVsX3NpemUqLywgaW8sIGhhbmRsZSwgVEFSR0FfTE9BRF9SR0I4ODggJiBmbGFncyk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBUR0FfUkxFUkdCOiB7IC8vKDMyIGJpdCkKKwkJCQkJCWxvYWRSTEU8MzI+KGRpYiwgaGVhZGVyLmlzX3dpZHRoLCBoZWFkZXIuaXNfaGVpZ2h0LCBpbywgaGFuZGxlLCBlb2YsIFRBUkdBX0xPQURfUkdCODg4ICYgZmxhZ3MpOworCQkJCQl9CisJCQkJCWJyZWFrOworCisJCQkJCWRlZmF1bHQgOgorCQkJCQkJRnJlZUltYWdlX1VubG9hZChkaWIpOworCQkJCQkJcmV0dXJuIE5VTEw7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7IC8vIGhlYWRlci5pc19waXhlbF9kZXB0aCA9PSAzMgorCisJCX0gLy8gc3dpdGNoKGhlYWRlci5pc19waXhlbF9kZXB0aCkKKworCQlpZiAoZmxpcHZlcnQpIHsKKwkJCUZyZWVJbWFnZV9GbGlwVmVydGljYWwoZGliKTsKKwkJfQorCisJCWlmIChmbGlwaG9yaXopIHsKKwkJCUZyZWVJbWFnZV9GbGlwSG9yaXpvbnRhbChkaWIpOworCQl9CisKKwkJcmV0dXJuIGRpYjsKKworCX0gY2F0Y2ggKGNvbnN0IGNoYXIgKm1lc3NhZ2UpIHsKKwkJaWYgKGRpYikgeworCQkJRnJlZUltYWdlX1VubG9hZChkaWIpOworCQl9CisKKwkJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKHNfZm9ybWF0X2lkLCBtZXNzYWdlKTsKKworCQlyZXR1cm4gTlVMTDsKKwl9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBCT09MIAoraGFzVmFsaWRUaHVtYm5haWwoRklCSVRNQVAqIGRpYikgeworCUZJQklUTUFQKiB0aHVtYm5haWwgPSBGcmVlSW1hZ2VfR2V0VGh1bWJuYWlsKGRpYik7CisJCisJcmV0dXJuIHRodW1ibmFpbCAKKwkJJiYgU3VwcG9ydHNFeHBvcnRUeXBlKEZyZWVJbWFnZV9HZXRJbWFnZVR5cGUodGh1bWJuYWlsKSkgCisJCSYmIFN1cHBvcnRzRXhwb3J0RGVwdGgoRnJlZUltYWdlX0dldEJQUCh0aHVtYm5haWwpKQorCQkvLyBSZXF1aXJlbWVudHMgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpY2F0aW9uOgorCQkmJiBGcmVlSW1hZ2VfR2V0QlBQKHRodW1ibmFpbCkgPT0gRnJlZUltYWdlX0dldEJQUChkaWIpCisJCSYmIEZyZWVJbWFnZV9HZXRJbWFnZVR5cGUodGh1bWJuYWlsKSA9PSBGcmVlSW1hZ2VfR2V0SW1hZ2VUeXBlKGRpYikKKwkJJiYgRnJlZUltYWdlX0dldFdpZHRoKHRodW1ibmFpbCkgPD0gMjU1CisJCSYmIEZyZWVJbWFnZV9HZXRIZWlnaHQodGh1bWJuYWlsKSA8PSAyNTU7Cit9CisKKy8qKgorV3JpdGVzIHRoZSByZWFkeSBSTEUgcGFja2V0IHRvIGJ1ZmZlcgorKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAKK2ZsdXNoUGFja2V0KEJZVEUqJiBkZXN0LCB1bnNpZ25lZCBwaXhlbF9zaXplLCBCWVRFKiBwYWNrZXRfYmVnaW4sIEJZVEUqJiBwYWNrZXQsIEJZVEUmIHBhY2tldF9jb3VudCwgQk9PTCYgaGFzX3JsZSkgeworCWlmIChwYWNrZXRfY291bnQpIHsKKwkJY29uc3QgQllURSB0eXBlX2JpdCA9IGhhc19ybGUgPyAweDgwIDogMHgwOworCQljb25zdCBCWVRFIHdyaXRlX2NvdW50ID0gaGFzX3JsZSA/IDEgOiBwYWNrZXRfY291bnQ7CisKKwkJLy8gYnVpbGQgcGFja2V0IGhlYWRlcjogemVyby1iYXNlZCBjb3VudCArIHR5cGUgYml0CisJCWFzc2VydChwYWNrZXRfY291bnQgPj0gMSk7CisJCUJZVEUgcmxlID0gcGFja2V0X2NvdW50IC0gMTsKKwkJcmxlIHw9IHR5cGVfYml0OworCisJCS8vIHdyaXRlIHBhY2tldCBoZWFkZXIKKwkJKmRlc3QgPSBybGU7CisJCSsrZGVzdDsKKworCQkvLyB3cml0ZSBwYWNrZXQgZGF0YQorCQltZW1jcHkoZGVzdCwgcGFja2V0X2JlZ2luLCB3cml0ZV9jb3VudCAqIHBpeGVsX3NpemUpOworCQlkZXN0ICs9IHdyaXRlX2NvdW50ICogcGl4ZWxfc2l6ZTsKKworCQkvLyByZXNldCBzdGF0ZQorCQlwYWNrZXRfY291bnQgPSAwOworCQlwYWNrZXQgPSBwYWNrZXRfYmVnaW47CisJCWhhc19ybGUgPSBGQUxTRTsKKwl9Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIAord3JpdGVUb1BhY2tldChCWVRFKiBwYWNrZXQsIEJZVEUqIHBpeGVsLCB1bnNpZ25lZCBwaXhlbF9zaXplKSB7CisJLy8gVGFrZSBjYXJlIG9mIGNoYW5uZWwgYW5kIGJ5dGUgb3JkZXIgaGVyZSwgYmVjYXVzZSBwYWNrZXQgd2lsbCBiZSBmbHVzaGVkIHN0cmFpZ2h0IHRvIHRoZSBmaWxlCisJc3dpdGNoIChwaXhlbF9zaXplKSB7CisJCWNhc2UgMToKKwkJCSpwYWNrZXQgPSAqcGl4ZWw7CisJCQlicmVhazsKKworCQljYXNlIDI6IHsKKwkJCVdPUkQgdmFsKCooV09SRCopcGl4ZWwpOworI2lmZGVmIEZSRUVJTUFHRV9CSUdFTkRJQU4KKwkJCVN3YXBTaG9ydCgmdmFsKTsKKyNlbmRpZgorCQkJKihXT1JEKilwYWNrZXQgPSB2YWw7CisJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSAzOiB7CisJCQlwYWNrZXRbMF0gPSBwaXhlbFtGSV9SR0JBX0JMVUVdOworCQkJcGFja2V0WzFdID0gcGl4ZWxbRklfUkdCQV9HUkVFTl07CisJCQlwYWNrZXRbMl0gPSBwaXhlbFtGSV9SR0JBX1JFRF07CisJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSA0OiB7CisjaWYgRlJFRUlNQUdFX0NPTE9ST1JERVIgPT0gRlJFRUlNQUdFX0NPTE9ST1JERVJfQkdSCisJCQkqKHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQqPihwYWNrZXQpKSA9ICoocmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCo+IChwaXhlbCkpOworI2Vsc2UgCisJCQlwYWNrZXRbMF0gPSBwaXhlbFtGSV9SR0JBX0JMVUVdOworCQkJcGFja2V0WzFdID0gcGl4ZWxbRklfUkdCQV9HUkVFTl07CisJCQlwYWNrZXRbMl0gPSBwaXhlbFtGSV9SR0JBX1JFRF07CisJCQlwYWNrZXRbM10gPSBwaXhlbFtGSV9SR0JBX0FMUEhBXTsKKyNlbmRpZgorCQl9CisJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlhc3NlcnQoRkFMU0UpOworCX0KK30KKworc3RhdGljIGlubGluZSBCT09MIAoraXNFcXVhbFBpeGVsKEJZVEUqIGxocywgQllURSogcmhzLCB1bnNpZ25lZCBwaXhlbF9zaXplKSB7CisJc3dpdGNoIChwaXhlbF9zaXplKSB7CisJCWNhc2UgMToKKwkJCXJldHVybiAqbGhzID09ICpyaHM7CisKKwkJY2FzZSAyOgorCQkJcmV0dXJuICooV09SRCopbGhzID09ICooV09SRCopcmhzOworCisJCWNhc2UgMzoKKwkJCXJldHVybiAqKFdPUkQqKWxocyA9PSAqKFdPUkQqKXJocyAmJiBsaHNbMl0gPT0gcmhzWzJdOworCisJCWNhc2UgNDoKKwkJCXJldHVybiAqKHVuc2lnbmVkKilsaHMgPT0gKih1bnNpZ25lZCopcmhzOworCisJCWRlZmF1bHQ6CisJCQlhc3NlcnQoRkFMU0UpOworCQkJcmV0dXJuIEZBTFNFOworCX0KK30KKworc3RhdGljIHZvaWQgCitzYXZlUkxFKEZJQklUTUFQKiBkaWIsIEZyZWVJbWFnZUlPKiBpbywgZmlfaGFuZGxlIGhhbmRsZSkgeworCS8vIEltYWdlIGlzIGNvbXByZXNzZWQgbGluZSBieSBsaW5lLCBwYWNrZXRzIGRvbid0IHNwYW4gbXVsdGlwbGUgbGluZXMgKFRHQTIuMCByZWNvbW1lbmRhdGlvbikKKwkJCisJY29uc3QgdW5zaWduZWQgd2lkdGggPSBGcmVlSW1hZ2VfR2V0V2lkdGgoZGliKTsKKwljb25zdCB1bnNpZ25lZCBoZWlnaHQgPSBGcmVlSW1hZ2VfR2V0SGVpZ2h0KGRpYik7CisJY29uc3QgdW5zaWduZWQgcGl4ZWxfc2l6ZSA9IEZyZWVJbWFnZV9HZXRCUFAoZGliKS84OworCWNvbnN0IHVuc2lnbmVkIGxpbmVfc2l6ZSA9IEZyZWVJbWFnZV9HZXRMaW5lKGRpYik7CisKKwljb25zdCBCWVRFIG1heF9wYWNrZXRfc2l6ZSA9IDEyODsKKwlCWVRFIHBhY2tldF9jb3VudCA9IDA7CisJQk9PTCBoYXNfcmxlID0gRkFMU0U7CisKKwkvLyBwYWNrZXQgKGNvbXByZXNzZWQgb3Igbm90KSB0byBiZSB3cml0dGVuIHRvIGxpbmUKKworCUJZVEUqIGNvbnN0IHBhY2tldF9iZWdpbiA9IChCWVRFKiltYWxsb2MobWF4X3BhY2tldF9zaXplICogcGl4ZWxfc2l6ZSk7CisJQllURSogcGFja2V0ID0gcGFja2V0X2JlZ2luOworCisJLy8gbGluZSB0byBiZSB3cml0dGVuIHRvIGRpc2sKKwkvLyBOb3RlOiB3ZSBuZWVkIHNvbWUgZXh0cmEgYnl0ZXMgZm9yIGFudGktY29tbXByZXNzZWQgbGluZXMuIFRoZSB3b3JzdCBjYXNlIGlzOgorCS8vIDggYml0IGltYWdlcyB3ZXJlIGV2ZXJ5IDN0aCBwaXhlbCBpcyBkaWZmZXJlbnQuCisJLy8gUmxlIHBhY2tldCBiZWNvbWVzIHR3byBwaXhlbHMsIGJ1dCBub3RoaW5nIGlzIGNvbXByZXNzZWQ6IHR3byBieXRlIHBpeGVscyBhcmUgdHJhbnNmb3JtZWQgaW50byBieXRlIGhlYWRlciBhbmQgYnl0ZSBwaXhlbCB2YWx1ZQorCS8vIEFmdGVyIGV2ZXJ5IHJsZSBwYWNrZXQgdGhlcmUgaXMgYSBub24tcmxlIHBhY2tldCBvZiBvbmUgcGl4ZWw6IGFuIGV4dHJhIGJ5dGUgZm9yIHRoZSBoZWFkZXIgd2lsbCBiZSBhZGRlZCBmb3IgaXQKKwkvLyBJbiB0aGUgZW5kIHdlIGdhaW4gbm8gYnl0ZXMgZnJvbSBjb21wcmVzc2lvbiwgYnV0IGFsc28gbXVzdCBpbnNlcnQgYSBieXRlIGF0IGV2ZXJ5IDN0aCBwaXhlbAorCisJLy8gYWRkIGV4dHJhIHNwYWNlIGZvciBhbnRpLWNvbW1wcmVzc2VkIGxpbmVzCisJc2l6ZV90IGV4dHJhX3NwYWNlID0gKHNpemVfdCljZWlsKHdpZHRoIC8gMy4wKTsKKwlCWVRFKiBjb25zdCBsaW5lX2JlZ2luID0gKEJZVEUqKW1hbGxvYyh3aWR0aCAqIHBpeGVsX3NpemUgKyBleHRyYV9zcGFjZSk7CisJQllURSogbGluZSA9IGxpbmVfYmVnaW47CisKKwlCWVRFICpjdXJyZW50ID0gKEJZVEUqKW1hbGxvYyhwaXhlbF9zaXplKTsKKwlCWVRFICpuZXh0ICAgID0gKEJZVEUqKW1hbGxvYyhwaXhlbF9zaXplKTsKKworCWZvcih1bnNpZ25lZCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisJCUJZVEUgKmJpdHMgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCB5KTsKKworCQkvLyByZXdpbmQgbGluZSBwb2ludGVyCisJCWxpbmUgPSBsaW5lX2JlZ2luOworCisJCWZvcih1bnNpZ25lZCB4ID0gMDsgeCA8IGxpbmVfc2l6ZTsgeCArPSBwaXhlbF9zaXplKSB7CisKKwkJCUFzc2lnblBpeGVsKGN1cnJlbnQsIChiaXRzICsgeCksIHBpeGVsX3NpemUpOworCisJCQkvLyByZWFkIG5leHQgcGl4ZWwgZnJvbSBkaWIKKworCQkJaWYoIHggKyAxKnBpeGVsX3NpemUgPCBsaW5lX3NpemUpIHsKKwkJCQlBc3NpZ25QaXhlbChuZXh0LCAoYml0cyArIHggKyAxKnBpeGVsX3NpemUpLCBwaXhlbF9zaXplKTsKKworCQkJfSBlbHNlIHsKKwkJCQkvLyBsYXN0IHBpeGVsIGluIGxpbmUKKworCQkJCS8vIGluY2x1ZGUgY3VycmVudCBwaXhlbCBhbmQgZmx1c2gKKwkJCQlpZighaGFzX3JsZSkgeworCisJCQkJCXdyaXRlVG9QYWNrZXQocGFja2V0LCBjdXJyZW50LCBwaXhlbF9zaXplKTsKKwkJCQkJcGFja2V0ICs9IHBpeGVsX3NpemU7CisKKwkJCQl9CisKKwkJCQlhc3NlcnQocGFja2V0X2NvdW50IDwgbWF4X3BhY2tldF9zaXplKTsKKworCQkJCSsrcGFja2V0X2NvdW50OworCisJCQkJZmx1c2hQYWNrZXQobGluZSwgcGl4ZWxfc2l6ZSwgcGFja2V0X2JlZ2luLCBwYWNrZXQsIHBhY2tldF9jb3VudCwgaGFzX3JsZSk7CisKKwkJCQkvLyBzdGFydCBhbmV3IG9uIG5leHQgbGluZQorCQkJCWJyZWFrOworCQkJfQorCisJCQlpZihpc0VxdWFsUGl4ZWwoY3VycmVudCwgbmV4dCwgcGl4ZWxfc2l6ZSkpIHsKKworCQkJCS8vIGhhcyBybGUKKworCQkJCWlmKCFoYXNfcmxlKSB7CisJCQkJCS8vIGZsdXNoIG5vbiBybGUgcGFja2V0CisKKwkJCQkJZmx1c2hQYWNrZXQobGluZSwgcGl4ZWxfc2l6ZSwgcGFja2V0X2JlZ2luLCBwYWNrZXQsIHBhY2tldF9jb3VudCwgaGFzX3JsZSk7CisKKwkJCQkJLy8gc3RhcnQgYSBybGUgcGFja2V0CisKKwkJCQkJaGFzX3JsZSA9IFRSVUU7CisKKwkJCQkJd3JpdGVUb1BhY2tldChwYWNrZXQsIGN1cnJlbnQsIHBpeGVsX3NpemUpOworCQkJCQlwYWNrZXQgKz0gcGl4ZWxfc2l6ZTsKKwkJCQl9CisKKwkJCQkvLyBvdGhlcndpc2UgZG8gbm90aGluZy4gV2Ugd2lsbCBqdXN0IGluY3JlYXNlIHRoZSBjb3VudCBhdCB0aGUgZW5kCisKKwkJCX0gZWxzZSB7CisKKwkJCQkvLyBubyBybGUKKworCQkJCWlmKGhhc19ybGUpIHsKKwkJCQkJLy8gZmx1c2ggcmxlIHBhY2tldAorCisJCQkJCS8vIGluY2x1ZGUgY3VycmVudCBwaXhlbCBmaXJzdAorCQkJCQlhc3NlcnQocGFja2V0X2NvdW50IDwgbWF4X3BhY2tldF9zaXplKTsKKwkJCQkJKytwYWNrZXRfY291bnQ7CisKKwkJCQkJZmx1c2hQYWNrZXQobGluZSwgcGl4ZWxfc2l6ZSwgcGFja2V0X2JlZ2luLCBwYWNrZXQsIHBhY2tldF9jb3VudCwgaGFzX3JsZSk7CisKKwkJCQkJLy8gc3RhcnQgYW5ldyBvbiB0aGUgbmV4dCBwaXhlbAorCQkJCQljb250aW51ZTsKKworCQkJCX0gZWxzZSB7CisKKwkJCQkJd3JpdGVUb1BhY2tldChwYWNrZXQsIGN1cnJlbnQsIHBpeGVsX3NpemUpOworCQkJCQlwYWNrZXQgKz0gcGl4ZWxfc2l6ZTsKKwkJCQl9CisKKwkJCX0KKworCQkJLy8gaW5jcmVhc2UgY291bnRlciBvbiBldmVyeSBwaXhlbAorCisJCQkrK3BhY2tldF9jb3VudDsKKworCQkJaWYocGFja2V0X2NvdW50ID09IG1heF9wYWNrZXRfc2l6ZSkgeworCQkJCWZsdXNoUGFja2V0KGxpbmUsIHBpeGVsX3NpemUsIHBhY2tldF9iZWdpbiwgcGFja2V0LCBwYWNrZXRfY291bnQsIGhhc19ybGUpOworCQkJfQorCisJCX0vL2ZvciB3aWR0aAorCisJCS8vIHdyaXRlIGxpbmUgdG8gZGlzaworCQlpby0+d3JpdGVfcHJvYyhsaW5lX2JlZ2luLCAxLCAodW5zaWduZWQpKGxpbmUgLSBsaW5lX2JlZ2luKSwgaGFuZGxlKTsKKworCX0vL2ZvciBoZWlnaHQKKworCWZyZWUobGluZV9iZWdpbik7CisJZnJlZShwYWNrZXRfYmVnaW4pOworCWZyZWUoY3VycmVudCk7CisJZnJlZShuZXh0KTsKK30KKworc3RhdGljIEJPT0wgRExMX0NBTExDT05WCitTYXZlKEZyZWVJbWFnZUlPICppbywgRklCSVRNQVAgKmRpYiwgZmlfaGFuZGxlIGhhbmRsZSwgaW50IHBhZ2UsIGludCBmbGFncywgdm9pZCAqZGF0YSkgeworCWlmICgoZGliID09IE5VTEwpIHx8IChoYW5kbGUgPT0gTlVMTCkpIHsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCVJHQlFVQUQgKnBhbGV0dGUgPSBGcmVlSW1hZ2VfR2V0UGFsZXR0ZShkaWIpOworCWNvbnN0IHVuc2lnbmVkIGJwcCA9IEZyZWVJbWFnZV9HZXRCUFAoZGliKTsKKworCS8vIHdyaXRlIHRoZSBmaWxlIGhlYWRlcgorCisJVEdBSEVBREVSIGhlYWRlcjsKKworCWhlYWRlci5pZF9sZW5ndGggPSAwOworCWhlYWRlci5jbV9maXJzdF9lbnRyeSA9IDA7CisJaGVhZGVyLmlzX3hvcmlnaW4gPSAwOworCWhlYWRlci5pc195b3JpZ2luID0gMDsKKwloZWFkZXIuaXNfd2lkdGggPSAoV09SRClGcmVlSW1hZ2VfR2V0V2lkdGgoZGliKTsKKwloZWFkZXIuaXNfaGVpZ2h0ID0gKFdPUkQpRnJlZUltYWdlX0dldEhlaWdodChkaWIpOworCWhlYWRlci5pc19waXhlbF9kZXB0aCA9IChCWVRFKWJwcDsKKwloZWFkZXIuaXNfaW1hZ2VfZGVzY3JpcHRvciA9IChicHAgPT0gMzIgPyA4IDogMCk7CisKKwlpZiAocGFsZXR0ZSkgeworCQloZWFkZXIuY29sb3JfbWFwX3R5cGUgPSAxOworCQloZWFkZXIuaW1hZ2VfdHlwZSA9IChUQVJHQV9TQVZFX1JMRSAmIGZsYWdzKSA/IFRHQV9STEVDTUFQIDogVEdBX0NNQVA7CisJCWhlYWRlci5jbV9sZW5ndGggPSAoV09SRCkoMSA8PCBicHApOworCisJCWlmIChGcmVlSW1hZ2VfSXNUcmFuc3BhcmVudChkaWIpKSB7CisJCQloZWFkZXIuY21fc2l6ZSA9IDMyOworCQl9IGVsc2UgeworCQkJaGVhZGVyLmNtX3NpemUgPSAyNDsKKwkJfQorCisJfSBlbHNlIHsKKwkJaGVhZGVyLmNvbG9yX21hcF90eXBlID0gMDsKKwkJaGVhZGVyLmltYWdlX3R5cGUgPSAoVEFSR0FfU0FWRV9STEUgJiBmbGFncykgPyBUR0FfUkxFUkdCIDogVEdBX1JHQjsKKwkJaGVhZGVyLmNtX2xlbmd0aCA9IDA7CisJCWhlYWRlci5jbV9zaXplID0gMDsKKwl9CisKKwkvLyB3cml0ZSB0aGUgaGVhZGVyCisKKyNpZmRlZiBGUkVFSU1BR0VfQklHRU5ESUFOCisJU3dhcEhlYWRlcigmaGVhZGVyKTsKKyNlbmRpZgorCisJaW8tPndyaXRlX3Byb2MoJmhlYWRlciwgc2l6ZW9mKGhlYWRlciksIDEsIGhhbmRsZSk7CisKKyNpZmRlZiBGUkVFSU1BR0VfQklHRU5ESUFOCisJU3dhcEhlYWRlcigmaGVhZGVyKTsKKyNlbmRpZgorCisJLy8gd3JpdGUgdGhlIHBhbGV0dGUKKworCWlmIChwYWxldHRlKSB7CisJCWlmIChGcmVlSW1hZ2VfSXNUcmFuc3BhcmVudChkaWIpKSB7CisJCQlGSUxFX0JHUkEgKmJncmFfcGFsID0gKEZJTEVfQkdSQSopbWFsbG9jKGhlYWRlci5jbV9sZW5ndGggKiBzaXplb2YoRklMRV9CR1JBKSk7CisKKwkJCS8vIGdldCB0aGUgdHJhbnNwYXJlbmN5IHRhYmxlCisJCQlCWVRFICp0cm5zID0gRnJlZUltYWdlX0dldFRyYW5zcGFyZW5jeVRhYmxlKGRpYik7CisKKwkJCWZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBoZWFkZXIuY21fbGVuZ3RoOyBpKyspIHsKKwkJCQliZ3JhX3BhbFtpXS5iID0gcGFsZXR0ZVtpXS5yZ2JCbHVlOworCQkJCWJncmFfcGFsW2ldLmcgPSBwYWxldHRlW2ldLnJnYkdyZWVuOworCQkJCWJncmFfcGFsW2ldLnIgPSBwYWxldHRlW2ldLnJnYlJlZDsKKwkJCQliZ3JhX3BhbFtpXS5hID0gdHJuc1tpXTsKKwkJCX0KKworCQkJaW8tPndyaXRlX3Byb2MoYmdyYV9wYWwsIHNpemVvZihGSUxFX0JHUkEpLCBoZWFkZXIuY21fbGVuZ3RoLCBoYW5kbGUpOworCisJCQlmcmVlKGJncmFfcGFsKTsKKworCQl9IGVsc2UgeworCQkJRklMRV9CR1IgKmJncl9wYWwgPSAoRklMRV9CR1IqKW1hbGxvYyhoZWFkZXIuY21fbGVuZ3RoICogc2l6ZW9mKEZJTEVfQkdSKSk7CisKKwkJCWZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBoZWFkZXIuY21fbGVuZ3RoOyBpKyspIHsKKwkJCQliZ3JfcGFsW2ldLmIgPSBwYWxldHRlW2ldLnJnYkJsdWU7CisJCQkJYmdyX3BhbFtpXS5nID0gcGFsZXR0ZVtpXS5yZ2JHcmVlbjsKKwkJCQliZ3JfcGFsW2ldLnIgPSBwYWxldHRlW2ldLnJnYlJlZDsKKwkJCX0KKworCQkJaW8tPndyaXRlX3Byb2MoYmdyX3BhbCwgc2l6ZW9mKEZJTEVfQkdSKSwgaGVhZGVyLmNtX2xlbmd0aCwgaGFuZGxlKTsKKworCQkJZnJlZShiZ3JfcGFsKTsKKwkJfQorCX0KKworCS8vIHdyaXRlIHRoZSBkYXRhIGJpdHMgCisKKworCWlmIChUQVJHQV9TQVZFX1JMRSAmIGZsYWdzKSB7CisJCQorCQlzYXZlUkxFKGRpYiwgaW8sIGhhbmRsZSk7CisKKwl9IGVsc2UgeworCQkKKwkJLy8gLS0gbm8gcmxlIGNvbXByZXNzaW9uIC0tCisJCQorCQljb25zdCB1bnNpZ25lZCB3aWR0aCA9IGhlYWRlci5pc193aWR0aDsKKwkJY29uc3QgdW5zaWduZWQgaGVpZ2h0ID0gaGVhZGVyLmlzX2hlaWdodDsKKwkJY29uc3QgdW5zaWduZWQgcGl4ZWxfc2l6ZSA9IGJwcC84OworCisJCUJZVEUgKmxpbmUsICpjb25zdCBsaW5lX2JlZ2luID0gKEJZVEUqKW1hbGxvYyh3aWR0aCAqIHBpeGVsX3NpemUpOworCQlCWVRFICpsaW5lX3NvdXJjZSA9IGxpbmVfYmVnaW47CisKKwkJZm9yICh1bnNpZ25lZCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisJCQlCWVRFICpzY2FubGluZSA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIHkpOworCisJCQkvLyByZXdpbmQgdGhlIGxpbmUgcG9pbnRlcgorCQkJbGluZSA9IGxpbmVfYmVnaW47CisKKwkJCXN3aXRjaCAoYnBwKSB7CisJCQkJY2FzZSA4OiB7CisJCQkJCS8vIGRvbid0IGNvcHkgbGluZSwgcmVhZCBzdHJhaWdodCBmcm9tIGRpYgorCQkJCQlsaW5lX3NvdXJjZSA9IHNjYW5saW5lOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJCWNhc2UgMTY6IHsKKwkJCQkJZm9yICh1bnNpZ25lZCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQkJCVdPUkQgcGl4ZWwgPSAqKCgoV09SRCAqKXNjYW5saW5lKSArIHgpOworCQkJCQkJCisjaWZkZWYgRlJFRUlNQUdFX0JJR0VORElBTgorCQkJCQkJU3dhcFNob3J0KCZwaXhlbCk7CisjZW5kaWYKKwkJCQkJCSooV09SRCopbGluZSA9IHBpeGVsOworCisJCQkJCQlsaW5lICs9IHBpeGVsX3NpemU7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCQljYXNlIDI0OiB7CisJCQkJCQorI2lmIEZSRUVJTUFHRV9DT0xPUk9SREVSID09IEZSRUVJTUFHRV9DT0xPUk9SREVSX0JHUgorCQkJCQkJbGluZV9zb3VyY2UgPSBzY2FubGluZTsKKyNlbHNlIAorCQkJCQlmb3IgKHVuc2lnbmVkIHggPSAwOyB4IDwgd2lkdGg7ICsreCkgeworCQkJCQkJUkdCVFJJUExFKiB0cmlwID0gKChSR0JUUklQTEUgKilzY2FubGluZSkgKyB4OworCQkJCQkJbGluZVswXSA9IHRyaXAtPnJnYnRCbHVlOworCQkJCQkJbGluZVsxXSA9IHRyaXAtPnJnYnRHcmVlbjsKKwkJCQkJCWxpbmVbMl0gPSB0cmlwLT5yZ2J0UmVkOworCisJCQkJCQlsaW5lICs9IHBpeGVsX3NpemU7CisJCQkJCX0KKyNlbmRpZgorCQkJCX0KKwkJCQlicmVhazsKKworCQkJCWNhc2UgMzI6IHsKKworI2lmIEZSRUVJTUFHRV9DT0xPUk9SREVSID09IEZSRUVJTUFHRV9DT0xPUk9SREVSX0JHUgorCQkJCQlsaW5lX3NvdXJjZSA9IHNjYW5saW5lOworI2Vsc2UgCisJCQkJCWZvciAodW5zaWduZWQgeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7CisJCQkJCQlSR0JRVUFEKiBxdWFkID0gKChSR0JRVUFEICopc2NhbmxpbmUpICsgeDsKKwkJCQkJCWxpbmVbMF0gPSBxdWFkLT5yZ2JCbHVlOworCQkJCQkJbGluZVsxXSA9IHF1YWQtPnJnYkdyZWVuOworCQkJCQkJbGluZVsyXSA9IHF1YWQtPnJnYlJlZDsKKwkJCQkJCWxpbmVbM10gPSBxdWFkLT5yZ2JSZXNlcnZlZDsKKwkJCQkJCQorCQkJCQkJbGluZSArPSBwaXhlbF9zaXplOworCQkJCQl9CisjZW5kaWYKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCX0vL3N3aXRjaChicHApCisKKwkJCS8vIHdyaXRlIGxpbmUgdG8gZGlzaworCisJCQlpby0+d3JpdGVfcHJvYyhsaW5lX3NvdXJjZSwgcGl4ZWxfc2l6ZSwgd2lkdGgsIGhhbmRsZSk7CisKKwkJfS8vZm9yIGhlaWdodAorCisJCWZyZWUobGluZV9iZWdpbik7CisJfQorCisJCisJbG9uZyBleHRlbnNpb25fb2Zmc2V0ID0gMCA7CisJaWYoaGFzVmFsaWRUaHVtYm5haWwoZGliKSkgeworCQkvLyB3cml0ZSBleHRlbnNpb24gYXJlYQorCQkKKwkJZXh0ZW5zaW9uX29mZnNldCA9IGlvLT50ZWxsX3Byb2MoaGFuZGxlKTsKKwkJCisJCVRHQUVYVEVOU0lPTkFSRUEgZXg7CisJCW1lbXNldCgmZXgsIDAsIHNpemVvZihleCkpOworCQkKKwkJYXNzZXJ0KHNpemVvZihleCkgPT0gNDk1KTsKKwkJZXguZXh0ZW5zaW9uX3NpemUgPSBzaXplb2YoZXgpOworCQlleC5wb3N0YWdlX3N0YW1wX29mZnNldCA9IGV4dGVuc2lvbl9vZmZzZXQgKyBleC5leHRlbnNpb25fc2l6ZSArIDAgLyo8IG5vIFNjYW4gTGluZSBUYWJsZSovOworCQlleC5hdHRyaWJ1dGVzX3R5cGUgPSBGcmVlSW1hZ2VfR2V0QlBQKGRpYikgPT0gMzIgPyAzIC8qPCB1c2VmdWwgQWxwaGEgY2hhbm5lbCBkYXRhKi8gOiAwIC8qPCBubyBBbHBoYSBkYXRhKi87CisJCQorI2lmZGVmIEZSRUVJTUFHRV9CSUdFTkRJQU4KKwkJU3dhcEV4dGVuc2lvbkFyZWEoJmV4KTsKKyNlbmRpZgorCisJCWlvLT53cml0ZV9wcm9jKCZleCwgc2l6ZW9mKGV4KSwgMSwgaGFuZGxlKTsgCisJCQorCQkvLyAobm8gU2NhbiBMaW5lIFRhYmxlKQorCQkKKwkJLy8gd3JpdGUgdGh1bWJuYWlsCisJCQorCQlpby0+c2Vla19wcm9jKGhhbmRsZSwgZXgucG9zdGFnZV9zdGFtcF9vZmZzZXQsIFNFRUtfU0VUKTsKKwkJCisJCUZJQklUTUFQKiB0aHVtYm5haWwgPSBGcmVlSW1hZ2VfR2V0VGh1bWJuYWlsKGRpYik7CisJCUJZVEUgd2lkdGggPSAoQllURSlGcmVlSW1hZ2VfR2V0V2lkdGgodGh1bWJuYWlsKTsKKwkJQllURSBoZWlnaHQgPSAoQllURSlGcmVlSW1hZ2VfR2V0SGVpZ2h0KHRodW1ibmFpbCk7CisJCQorCQlpby0+d3JpdGVfcHJvYygmd2lkdGgsIDEsIDEsIGhhbmRsZSk7IAorCQlpby0+d3JpdGVfcHJvYygmaGVpZ2h0LCAxLCAxLCBoYW5kbGUpOyAKKwkJCisjaWYgRlJFRUlNQUdFX0NPTE9ST1JERVIgPT0gRlJFRUlNQUdFX0NPTE9ST1JERVJfUkdCCisJCVN3YXBSZWRCbHVlMzIoZGliKTsgCisjZW5kaWYKKwkJCisjaWZkZWYgRlJFRUlNQUdFX0JJR0VORElBTgorCQlzd2FwU2hvcnRQaXhlbHMoZGliKTsgCisjZW5kaWYKKwkJCisJCWNvbnN0IHVuc2lnbmVkIGxpbmVfc2l6ZSA9IEZyZWVJbWFnZV9HZXRMaW5lKHRodW1ibmFpbCk7CisKKwkJZm9yIChCWVRFIGggPSAwOyBoIDwgaGVpZ2h0OyArK2gpIHsKKwkJCUJZVEUqIHNyY19saW5lID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKHRodW1ibmFpbCwgaGVpZ2h0IC0gMSAtIGgpOworCQkJaW8tPndyaXRlX3Byb2Moc3JjX2xpbmUsIDEsIGxpbmVfc2l6ZSwgaGFuZGxlKTsgCisJCX0KKwl9CisJCisJLy8gKG5vIENvbG9yIENvcnJlY3Rpb24gVGFibGUpCisJCisJLy8gd3JpdGUgdGhlIGZvb3RlcgorCQorCVRHQUZPT1RFUiBmb290ZXI7CisJZm9vdGVyLmV4dGVuc2lvbl9vZmZzZXQgPSBleHRlbnNpb25fb2Zmc2V0OworCWZvb3Rlci5kZXZlbG9wZXJfb2Zmc2V0ID0gMDsKKwlzdHJjcHkoZm9vdGVyLnNpZ25hdHVyZSwgIlRSVUVWSVNJT04tWEZJTEUuIik7CisJCisKKyNpZmRlZiBGUkVFSU1BR0VfQklHRU5ESUFOCisJU3dhcEZvb3RlcigmZm9vdGVyKTsKKyNlbmRpZgorCisJaW8tPndyaXRlX3Byb2MoJmZvb3Rlciwgc2l6ZW9mKGZvb3RlciksIDEsIGhhbmRsZSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gICBJbml0CisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3ZvaWQgRExMX0NBTExDT05WCitJbml0VEFSR0EoUGx1Z2luICpwbHVnaW4sIGludCBmb3JtYXRfaWQpIHsKKwlzX2Zvcm1hdF9pZCA9IGZvcm1hdF9pZDsKKworCXBsdWdpbi0+Zm9ybWF0X3Byb2MgPSBGb3JtYXQ7CisJcGx1Z2luLT5kZXNjcmlwdGlvbl9wcm9jID0gRGVzY3JpcHRpb247CisJcGx1Z2luLT5leHRlbnNpb25fcHJvYyA9IEV4dGVuc2lvbjsKKwlwbHVnaW4tPnJlZ2V4cHJfcHJvYyA9IFJlZ0V4cHI7CisJcGx1Z2luLT5vcGVuX3Byb2MgPSBOVUxMOworCXBsdWdpbi0+Y2xvc2VfcHJvYyA9IE5VTEw7CisJcGx1Z2luLT5wYWdlY291bnRfcHJvYyA9IE5VTEw7CisJcGx1Z2luLT5wYWdlY2FwYWJpbGl0eV9wcm9jID0gTlVMTDsKKwlwbHVnaW4tPmxvYWRfcHJvYyA9IExvYWQ7CisJcGx1Z2luLT5zYXZlX3Byb2MgPSBTYXZlOworCXBsdWdpbi0+dmFsaWRhdGVfcHJvYyA9IFZhbGlkYXRlOworCXBsdWdpbi0+bWltZV9wcm9jID0gTWltZVR5cGU7CisJcGx1Z2luLT5zdXBwb3J0c19leHBvcnRfYnBwX3Byb2MgPSBTdXBwb3J0c0V4cG9ydERlcHRoOworCXBsdWdpbi0+c3VwcG9ydHNfZXhwb3J0X3R5cGVfcHJvYyA9IFN1cHBvcnRzRXhwb3J0VHlwZTsKKwlwbHVnaW4tPnN1cHBvcnRzX2ljY19wcm9maWxlc19wcm9jID0gTlVMTDsKKwlwbHVnaW4tPnN1cHBvcnRzX25vX3BpeGVsc19wcm9jID0gU3VwcG9ydHNOb1BpeGVsczsKK30KZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvUGx1Z2luVElGRi5jcHAgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL1BsdWdpblRJRkYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNDJkM2MKLS0tIC9kZXYvbnVsbAorKysgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL1BsdWdpblRJRkYuY3BwCkBAIC0wLDAgKzEsMjY0MCBAQAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gVElGRiBMb2FkZXIgYW5kIFdyaXRlcgorLy8KKy8vIERlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gYnkgCisvLyAtIEZsb3JpcyB2YW4gZGVuIEJlcmcgKGZsdmRiZXJnQHd4cy5ubCkKKy8vIC0gSGVydsOpIERyb2xvbiAoZHJvbG9uQGluZm9uaWUuZnIpCisvLyAtIE1hcmt1cyBMb2libCAobWFya3VzLmxvaWJsQGVwb3N0LmRlKQorLy8gLSBMdWNhIFBpZXJnZW50aWxpIChsLnBpZXJnZUB0ZXJyYS5lcykKKy8vIC0gRGV0bGV2IFZlbmR0IChkZXRsZXYudmVuZHRAYnJpbGxpdC5kZSkKKy8vIC0gTWloYWlsIE5heWRlbm92IChtbmF5ZGVub3ZAdXNlcnMuc291cmNlZm9yZ2UubmV0KQorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZyZWVJbWFnZSAzCisvLworLy8gQ09WRVJFRCBDT0RFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZCisvLyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUworLy8gVEhBVCBUSEUgQ09WRVJFRCBDT0RFIElTIEZSRUUgT0YgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisvLyBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRAorLy8gQ09ERSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVAorLy8gVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GIEFOWSBORUNFU1NBUlkKKy8vIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwKKy8vIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIKKy8vIFRISVMgRElTQ0xBSU1FUi4KKy8vCisvLyBVc2UgYXQgeW91ciBvd24gcmlzayEKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2lmZGVmIF9NU0NfVkVSIAorI3ByYWdtYSB3YXJuaW5nIChkaXNhYmxlIDogNDc4NikgLy8gaWRlbnRpZmllciB3YXMgdHJ1bmNhdGVkIHRvICdudW1iZXInIGNoYXJhY3RlcnMKKyNlbmRpZgorCisjaWZkZWYgdW5peAorI3VuZGVmIHVuaXgKKyNlbmRpZgorI2lmZGVmIF9fdW5peAorI3VuZGVmIF9fdW5peAorI2VuZGlmCisKKyNpbmNsdWRlICJGcmVlSW1hZ2UuaCIKKyNpbmNsdWRlICJVdGlsaXRpZXMuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS90aWZmL2xpYnRpZmYvdGlmZmlvcC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2lsbWJhc2UvSGFsZi9oYWxmLmgiCisjaW5jbHVkZSAiLi4vTWV0YWRhdGEvRnJlZUltYWdlVGFnLmgiCisKKyNpbmNsdWRlICJGcmVlSW1hZ2VJTy5oIgorI2luY2x1ZGUgIlBTRFBhcnNlci5oIgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gR2VvVElGRiBwcm9maWxlIChzZWUgWFRJRkYuY3BwKQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZvaWQgWFRJRkZJbml0aWFsaXplKCk7CitCT09MIHRpZmZfcmVhZF9nZW90aWZmX3Byb2ZpbGUoVElGRiAqdGlmLCBGSUJJVE1BUCAqZGliKTsKK0JPT0wgdGlmZl93cml0ZV9nZW90aWZmX3Byb2ZpbGUoVElGRiAqdGlmLCBGSUJJVE1BUCAqZGliKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRJRkYgRXhpZiBwcm9maWxlIChzZWUgWFRJRkYuY3BwKQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQk9PTCB0aWZmX3JlYWRfZXhpZl90YWdzKFRJRkYgKnRpZiwgVGFnTGliOjpNRE1PREVMIG1kX21vZGVsLCBGSUJJVE1BUCAqZGliKTsKK0JPT0wgdGlmZl93cml0ZV9leGlmX3RhZ3MoVElGRiAqdGlmLCBUYWdMaWI6Ok1ETU9ERUwgbWRfbW9kZWwsIEZJQklUTUFQICpkaWIpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICBMb2dMdXYgY29udmVyc2lvbiBmdW5jdGlvbnMgaW50ZXJmYWNlIChzZWUgVElGRkxvZ0x1di5jcHApCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordm9pZCB0aWZmX0NvbnZlcnRMaW5lWFlaVG9SR0IoQllURSAqdGFyZ2V0LCBCWVRFICpzb3VyY2UsIGRvdWJsZSBzdG9uaXRzLCBpbnQgd2lkdGhfaW5fcGl4ZWxzKTsKK3ZvaWQgdGlmZl9Db252ZXJ0TGluZVJHQlRvWFlaKEJZVEUgKnRhcmdldCwgQllURSAqc291cmNlLCBpbnQgd2lkdGhfaW5fcGl4ZWxzKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKiogU3VwcG9ydGVkIGxvYWRpbmcgbWV0aG9kcyAqLwordHlwZWRlZiBlbnVtIHsKKwlMb2FkQXNSQkdBCQkJPSAwLCAKKwlMb2FkQXNDTVlLCQkJPSAxLCAKKwlMb2FkQXM4Qml0VHJucwkJPSAyLCAKKwlMb2FkQXNHZW5lcmljU3RyaXAJPSAzLCAKKwlMb2FkQXNUaWxlZAkJCT0gNCwKKwlMb2FkQXNMb2dMdXYJCT0gNSwKKwlMb2FkQXNIYWxmRmxvYXQJCT0gNgorfSBUSUZGTG9hZE1ldGhvZDsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICBsb2NhbCBwcm90b3R5cGVzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0bXNpemVfdCBfdGlmZlJlYWRQcm9jKHRoYW5kbGVfdCBoYW5kbGUsIHZvaWQqIGJ1ZiwgdG1zaXplX3Qgc2l6ZSk7CitzdGF0aWMgdG1zaXplX3QgX3RpZmZXcml0ZVByb2ModGhhbmRsZV90IGhhbmRsZSwgdm9pZCogYnVmLCB0bXNpemVfdCBzaXplKTsKK3N0YXRpYyB0b2ZmX3QgX3RpZmZTZWVrUHJvYyh0aGFuZGxlX3QgaGFuZGxlLCB0b2ZmX3Qgb2ZmLCBpbnQgd2hlbmNlKTsKK3N0YXRpYyBpbnQgX3RpZmZDbG9zZVByb2ModGhhbmRsZV90IGZkKTsKK3N0YXRpYyBpbnQgX3RpZmZNYXBQcm9jKHRoYW5kbGVfdCBmZCwgdm9pZCoqIHBiYXNlLCB0b2ZmX3QqIHBzaXplKTsKK3N0YXRpYyB2b2lkIF90aWZmVW5tYXBQcm9jKHRoYW5kbGVfdCBmZCwgdm9pZCogYmFzZSwgdG9mZl90IHNpemUpOworCitzdGF0aWMgdWludDE2IENoZWNrQ29sb3JtYXAoaW50IG4sIHVpbnQxNiogciwgdWludDE2KiBnLCB1aW50MTYqIGIpOworc3RhdGljIHVpbnQxNiBHZXRQaG90b21ldHJpYyhGSUJJVE1BUCAqZGliKTsKKworc3RhdGljIHZvaWQgUmVhZFJlc29sdXRpb24oVElGRiAqdGlmZiwgRklCSVRNQVAgKmRpYik7CitzdGF0aWMgdm9pZCBXcml0ZVJlc29sdXRpb24oVElGRiAqdGlmZiwgRklCSVRNQVAgKmRpYik7CisKK3N0YXRpYyB2b2lkIFJlYWRQYWxldHRlKFRJRkYgKnRpZmYsIHVpbnQxNiBwaG90b21ldHJpYywgdWludDE2IGJpdHNwZXJzYW1wbGUsIEZJQklUTUFQICpkaWIpOworCitzdGF0aWMgRklCSVRNQVAqIENyZWF0ZUltYWdlVHlwZShCT09MIGhlYWRlcl9vbmx5LCBGUkVFX0lNQUdFX1RZUEUgZml0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIHVpbnQxNiBiaXRzcGVyc2FtcGxlLCB1aW50MTYgc2FtcGxlc3BlcnBpeGVsKTsKK3N0YXRpYyBGUkVFX0lNQUdFX1RZUEUgUmVhZEltYWdlVHlwZShUSUZGICp0aWZmLCB1aW50MTYgYml0c3BlcnNhbXBsZSwgdWludDE2IHNhbXBsZXNwZXJwaXhlbCk7CitzdGF0aWMgdm9pZCBXcml0ZUltYWdlVHlwZShUSUZGICp0aWZmLCBGUkVFX0lNQUdFX1RZUEUgZml0KTsKKworc3RhdGljIHZvaWQgV3JpdGVDb21wcmVzc2lvbihUSUZGICp0aWZmLCB1aW50MTYgYml0c3BlcnNhbXBsZSwgdWludDE2IHNhbXBsZXNwZXJwaXhlbCwgdWludDE2IHBob3RvbWV0cmljLCBpbnQgZmxhZ3MpOworCitzdGF0aWMgQk9PTCB0aWZmX3JlYWRfaXB0Y19wcm9maWxlKFRJRkYgKnRpZmYsIEZJQklUTUFQICpkaWIpOworc3RhdGljIEJPT0wgdGlmZl9yZWFkX3htcF9wcm9maWxlKFRJRkYgKnRpZmYsIEZJQklUTUFQICpkaWIpOworc3RhdGljIEJPT0wgdGlmZl9yZWFkX2V4aWZfcHJvZmlsZShUSUZGICp0aWZmLCBGSUJJVE1BUCAqZGliKTsKK3N0YXRpYyB2b2lkIFJlYWRNZXRhZGF0YShUSUZGICp0aWZmLCBGSUJJVE1BUCAqZGliKTsKKworc3RhdGljIEJPT0wgdGlmZl93cml0ZV9pcHRjX3Byb2ZpbGUoVElGRiAqdGlmZiwgRklCSVRNQVAgKmRpYik7CitzdGF0aWMgQk9PTCB0aWZmX3dyaXRlX3htcF9wcm9maWxlKFRJRkYgKnRpZmYsIEZJQklUTUFQICpkaWIpOworc3RhdGljIHZvaWQgV3JpdGVNZXRhZGF0YShUSUZGICp0aWZmLCBGSUJJVE1BUCAqZGliKTsKKworc3RhdGljIFRJRkZMb2FkTWV0aG9kIEZpbmRMb2FkTWV0aG9kKFRJRkYgKnRpZiwgdWludDE2IHBob3RvbWV0cmljLCB1aW50MTYgYml0c3BlcnNhbXBsZSwgdWludDE2IHNhbXBsZXNwZXJwaXhlbCwgRlJFRV9JTUFHRV9UWVBFIGltYWdlX3R5cGUsIGludCBmbGFncyk7CisKK3N0YXRpYyB2b2lkIFJlYWRUaHVtYm5haWwoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCB2b2lkICpkYXRhLCBUSUZGICp0aWZmLCBGSUJJVE1BUCAqZGliKTsKKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBQbHVnaW4gSW50ZXJmYWNlCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3N0YXRpYyBpbnQgc19mb3JtYXRfaWQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBGcmVlSW1hZ2VJTyAqaW87CisJZmlfaGFuZGxlIGhhbmRsZTsKKwlUSUZGICp0aWY7Cit9IGZpX1RJRkZJTzsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICBsaWJ0aWZmIGludGVyZmFjZSAKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRtc2l6ZV90IAorX3RpZmZSZWFkUHJvYyh0aGFuZGxlX3QgaGFuZGxlLCB2b2lkICpidWYsIHRtc2l6ZV90IHNpemUpIHsKKwlmaV9USUZGSU8gKmZpbyA9IChmaV9USUZGSU8qKWhhbmRsZTsKKwlyZXR1cm4gZmlvLT5pby0+cmVhZF9wcm9jKGJ1ZiwgKHVuc2lnbmVkKXNpemUsIDEsIGZpby0+aGFuZGxlKSAqIHNpemU7Cit9CisKK3N0YXRpYyB0bXNpemVfdAorX3RpZmZXcml0ZVByb2ModGhhbmRsZV90IGhhbmRsZSwgdm9pZCAqYnVmLCB0bXNpemVfdCBzaXplKSB7CisJZmlfVElGRklPICpmaW8gPSAoZmlfVElGRklPKiloYW5kbGU7CisJcmV0dXJuIGZpby0+aW8tPndyaXRlX3Byb2MoYnVmLCAodW5zaWduZWQpc2l6ZSwgMSwgZmlvLT5oYW5kbGUpICogc2l6ZTsKK30KKworc3RhdGljIHRvZmZfdAorX3RpZmZTZWVrUHJvYyh0aGFuZGxlX3QgaGFuZGxlLCB0b2ZmX3Qgb2ZmLCBpbnQgd2hlbmNlKSB7CisJZmlfVElGRklPICpmaW8gPSAoZmlfVElGRklPKiloYW5kbGU7CisJZmlvLT5pby0+c2Vla19wcm9jKGZpby0+aGFuZGxlLCAobG9uZylvZmYsIHdoZW5jZSk7CisJcmV0dXJuIGZpby0+aW8tPnRlbGxfcHJvYyhmaW8tPmhhbmRsZSk7Cit9CisKK3N0YXRpYyBpbnQKK190aWZmQ2xvc2VQcm9jKHRoYW5kbGVfdCBmZCkgeworCXJldHVybiAwOworfQorCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworc3RhdGljIHRvZmZfdAorX3RpZmZTaXplUHJvYyh0aGFuZGxlX3QgaGFuZGxlKSB7CisgICAgZmlfVElGRklPICpmaW8gPSAoZmlfVElGRklPKiloYW5kbGU7CisgICAgbG9uZyBjdXJyUG9zID0gZmlvLT5pby0+dGVsbF9wcm9jKGZpby0+aGFuZGxlKTsKKyAgICBmaW8tPmlvLT5zZWVrX3Byb2MoZmlvLT5oYW5kbGUsIDAsIFNFRUtfRU5EKTsKKyAgICBsb25nIGZpbGVTaXplID0gZmlvLT5pby0+dGVsbF9wcm9jKGZpby0+aGFuZGxlKTsKKyAgICBmaW8tPmlvLT5zZWVrX3Byb2MoZmlvLT5oYW5kbGUsIGN1cnJQb3MsIFNFRUtfU0VUKTsKKyAgICByZXR1cm4gZmlsZVNpemU7Cit9CisKK3N0YXRpYyBpbnQKK190aWZmTWFwUHJvYyh0aGFuZGxlX3QsIHZvaWQqKiBiYXNlLCB0b2ZmX3QqIHNpemUpIHsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK190aWZmVW5tYXBQcm9jKHRoYW5kbGVfdCwgdm9pZCogYmFzZSwgdG9mZl90IHNpemUpIHsKK30KKworLyoqCitPcGVuIGEgVElGRiBmaWxlIGRlc2NyaXB0b3IgZm9yIHJlYWRpbmcgb3Igd3JpdGluZworQHBhcmFtIGhhbmRsZSBGaWxlIGhhbmRsZQorQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgZmlsZSBoYW5kbGUKK0BwYXJhbSBtb2RlIFNwZWNpZmllcyBpZiB0aGUgZmlsZSBpcyB0byBiZSBvcGVuZWQgZm9yIHJlYWRpbmcgKCJyIikgb3Igd3JpdGluZyAoInciKQorKi8KK1RJRkYgKgorVElGRkZkT3Blbih0aGFuZGxlX3QgaGFuZGxlLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICptb2RlKSB7CisJVElGRiAqdGlmOworCQorCS8vIE9wZW4gdGhlIGZpbGU7IHRoZSBjYWxsYmFjayB3aWxsIHNldCBldmVyeXRoaW5nIHVwCisJdGlmID0gVElGRkNsaWVudE9wZW4obmFtZSwgbW9kZSwgaGFuZGxlLAorCSAgICBfdGlmZlJlYWRQcm9jLCBfdGlmZldyaXRlUHJvYywgX3RpZmZTZWVrUHJvYywgX3RpZmZDbG9zZVByb2MsCisJICAgIF90aWZmU2l6ZVByb2MsIF90aWZmTWFwUHJvYywgX3RpZmZVbm1hcFByb2MpOworCisJcmV0dXJuIHRpZjsKK30KKworLy8gSWZkZWYgYXJvdW5kIHRoaXMgY29kZSBzbyB0aGF0IHdlIGNhbiBidWlsZCBmb3IgU2tldGNoVXAgb24gTGludXguCisvLyBGcmVlSW1hZ2UgZm9yIFNrZXRjaFVwIG9uIExpbnV4IHVzZXMgdGhlIHRoaXJkX3BhcnR5L3RpZmYgbGlicmFyeQorLy8gaW5zdGVhZCBvZiB0aGUgRnJlZUltYWdlIHRpZmYgbGlicmFyeSB0byBhdm9pZCBjb25mbGljdHMgd2l0aAorLy8gZXNjaGVyIGNvZGUuICBJbiB0aGlzIGNhc2UgdGhlc2UgbWV0aG9kcyBhcmUgYWxyZWFkeSBkZWZpbmVkIGFuZAorLy8gd2UgZG9uJ3Qgd2FudCB0byBkZWZpbmUgdGhlbSBhZ2Fpbi4KKyNpZm5kZWYgVVNFX1RISVJEX1BBUlRZX1RJRkYKKworLyoqCitPcGVuIGEgVElGRiBmaWxlIGZvciByZWFkaW5nIG9yIHdyaXRpbmcKK0BwYXJhbSBuYW1lCitAcGFyYW0gbW9kZQorKi8KK1RJRkYqCitUSUZGT3Blbihjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiBtb2RlKSB7CisJcmV0dXJuIDA7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgVElGRiBsaWJyYXJ5IEZyZWVJbWFnZS1zcGVjaWZpYyByb3V0aW5lcy4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCoKK19USUZGbWFsbG9jKHRtc2l6ZV90IHMpIHsKKwlyZXR1cm4gbWFsbG9jKHMpOworfQorCit2b2lkCitfVElGRmZyZWUodm9pZCAqcCkgeworCWZyZWUocCk7Cit9CisKK3ZvaWQqCitfVElGRnJlYWxsb2Modm9pZCogcCwgdG1zaXplX3QgcykgeworCXJldHVybiByZWFsbG9jKHAsIHMpOworfQorCit2b2lkCitfVElGRm1lbXNldCh2b2lkKiBwLCBpbnQgdiwgdG1zaXplX3QgYykgeworCW1lbXNldChwLCB2LCAoc2l6ZV90KSBjKTsKK30KKwordm9pZAorX1RJRkZtZW1jcHkodm9pZCogZCwgY29uc3Qgdm9pZCogcywgdG1zaXplX3QgYykgeworCW1lbWNweShkLCBzLCAoc2l6ZV90KSBjKTsKK30KKworaW50CitfVElGRm1lbWNtcChjb25zdCB2b2lkKiBwMSwgY29uc3Qgdm9pZCogcDIsIHRtc2l6ZV90IGMpIHsKKwlyZXR1cm4gKG1lbWNtcChwMSwgcDIsIChzaXplX3QpIGMpKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICBpbiBGcmVlSW1hZ2Ugd2FybmluZ3MgYW5kIGVycm9ycyBhcmUgZGlzYWJsZWQKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK21zZG9zV2FybmluZ0hhbmRsZXIoY29uc3QgY2hhciogbW9kdWxlLCBjb25zdCBjaGFyKiBmbXQsIHZhX2xpc3QgYXApIHsKK30KKworVElGRkVycm9ySGFuZGxlciBfVElGRndhcm5pbmdIYW5kbGVyID0gbXNkb3NXYXJuaW5nSGFuZGxlcjsKKworc3RhdGljIHZvaWQKK21zZG9zRXJyb3JIYW5kbGVyKGNvbnN0IGNoYXIqIG1vZHVsZSwgY29uc3QgY2hhciogZm10LCB2YV9saXN0IGFwKSB7CisJCisJLy8gdXNlIHRoaXMgZm9yIGRpYWdub3N0aWMgb25seSAoZG8gbm90IHVzZSBvdGhlcndpc2UsIGV2ZW4gaW4gREVCVUcgbW9kZSkKKwkvKgorCWlmIChtb2R1bGUgIT0gTlVMTCkgeworCQljaGFyIG1zZ1sxMDI0XTsKKwkJdnNwcmludGYobXNnLCBmbXQsIGFwKTsKKwkJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKHNfZm9ybWF0X2lkLCAiJXM6ICVzIiwgbW9kdWxlLCBtc2cpOworCX0KKwkqLworfQorCitUSUZGRXJyb3JIYW5kbGVyIF9USUZGZXJyb3JIYW5kbGVyID0gbXNkb3NFcnJvckhhbmRsZXI7CisKKyNlbmRpZgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgQ1ZUKHgpICAgICAgKCgoeCkgKiAyNTVMKSAvICgoMUw8PDE2KS0xKSkKKyNkZWZpbmUJU0NBTEUoeCkJKCgoeCkqKCgxTDw8MTYpLTEpKS8yNTUpCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEludGVybmFsIGZ1bmN0aW9ucworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitzdGF0aWMgdWludDE2CitDaGVja0NvbG9ybWFwKGludCBuLCB1aW50MTYqIHIsIHVpbnQxNiogZywgdWludDE2KiBiKSB7CisgICAgd2hpbGUgKG4tLSA+IDApIHsKKyAgICAgICAgaWYgKCpyKysgPj0gMjU2IHx8ICpnKysgPj0gMjU2IHx8ICpiKysgPj0gMjU2KSB7CisJCQlyZXR1cm4gMTY7CisJCX0KKwl9CisKKyAgICByZXR1cm4gODsKK30KKworLyoqCitHZXQgdGhlIFRJRkZUQUdfUEhPVE9NRVRSSUMgdmFsdWUgZnJvbSB0aGUgZGliCisqLworc3RhdGljIHVpbnQxNgorR2V0UGhvdG9tZXRyaWMoRklCSVRNQVAgKmRpYikgeworCUZSRUVfSU1BR0VfQ09MT1JfVFlQRSBjb2xvcl90eXBlID0gRnJlZUltYWdlX0dldENvbG9yVHlwZShkaWIpOworCXN3aXRjaChjb2xvcl90eXBlKSB7CisJCWNhc2UgRklDX01JTklTV0hJVEU6CS8vIG1pbiB2YWx1ZSBpcyB3aGl0ZQorCQkJcmV0dXJuIFBIT1RPTUVUUklDX01JTklTV0hJVEU7CisJCWNhc2UgRklDX01JTklTQkxBQ0s6CS8vIG1pbiB2YWx1ZSBpcyBibGFjaworCQkJcmV0dXJuIFBIT1RPTUVUUklDX01JTklTQkxBQ0s7CisJCWNhc2UgRklDX1BBTEVUVEU6CQkvLyBjb2xvciBtYXAgaW5kZXhlZAorCQkJcmV0dXJuIFBIT1RPTUVUUklDX1BBTEVUVEU7CisJCWNhc2UgRklDX1JHQjoJCQkvLyBSR0IgY29sb3IgbW9kZWwKKwkJY2FzZSBGSUNfUkdCQUxQSEE6CQkvLyBSR0IgY29sb3IgbW9kZWwgd2l0aCBhbHBoYSBjaGFubmVsCisJCQlyZXR1cm4gUEhPVE9NRVRSSUNfUkdCOworCQljYXNlIEZJQ19DTVlLOgkJCS8vIENNWUsgY29sb3IgbW9kZWwKKwkJCXJldHVybiBQSE9UT01FVFJJQ19SR0I7CS8vIGRlZmF1bHQgdG8gUkdCIHVubGVzcyB0aGUgc2F2ZSBmbGFnIGlzIHNldCB0byBUSUZGX0NNWUsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBQSE9UT01FVFJJQ19NSU5JU0JMQUNLOworCX0KK30KKworLyoqCitHZXQgdGhlIHJlc29sdXRpb24gZnJvbSB0aGUgVElGRiBhbmQgZmlsbCB0aGUgZGliIHdpdGggdW5pdmVyc2FsIHVuaXRzCisqLworc3RhdGljIHZvaWQgCitSZWFkUmVzb2x1dGlvbihUSUZGICp0aWZmLCBGSUJJVE1BUCAqZGliKSB7CisJZmxvYXQgZlJlc1ggPSAzMDAuMDsKKwlmbG9hdCBmUmVzWSA9IDMwMC4wOworCXVpbnQxNiByZXNVbml0ID0gUkVTVU5JVF9JTkNIOworCisJVElGRkdldEZpZWxkKHRpZmYsIFRJRkZUQUdfUkVTT0xVVElPTlVOSVQsICZyZXNVbml0KTsKKwlUSUZGR2V0RmllbGQodGlmZiwgVElGRlRBR19YUkVTT0xVVElPTiwgJmZSZXNYKTsKKwlUSUZGR2V0RmllbGQodGlmZiwgVElGRlRBR19ZUkVTT0xVVElPTiwgJmZSZXNZKTsKKwkKKwkvLyBJZiB3ZSBkb24ndCBoYXZlIGEgdmFsaWQgcmVzb2x1dGlvbiB1bml0IGFuZCB2YWxpZCByZXNvbHV0aW9uIGlzIHNwZWNpZmllZCB0aGVuIGFzc3VtZSBpbmNoCisJaWYgKHJlc1VuaXQgPT0gUkVTVU5JVF9OT05FICYmIGZSZXNYID4gMC4wICYmIGZSZXNZID4gMC4wKSB7CisJCXJlc1VuaXQgPSBSRVNVTklUX0lOQ0g7CisJfQorCWlmIChyZXNVbml0ID09IFJFU1VOSVRfSU5DSCkgeworCQlGcmVlSW1hZ2VfU2V0RG90c1Blck1ldGVyWChkaWIsICh1bnNpZ25lZCkgKGZSZXNYLzAuMDI1NDAwMCArIDAuNSkpOworCQlGcmVlSW1hZ2VfU2V0RG90c1Blck1ldGVyWShkaWIsICh1bnNpZ25lZCkgKGZSZXNZLzAuMDI1NDAwMCArIDAuNSkpOworCX0gZWxzZSBpZihyZXNVbml0ID09IFJFU1VOSVRfQ0VOVElNRVRFUikgeworCQlGcmVlSW1hZ2VfU2V0RG90c1Blck1ldGVyWChkaWIsICh1bnNpZ25lZCkgKGZSZXNYKjEwMC4wICsgMC41KSk7CisJCUZyZWVJbWFnZV9TZXREb3RzUGVyTWV0ZXJZKGRpYiwgKHVuc2lnbmVkKSAoZlJlc1kqMTAwLjAgKyAwLjUpKTsKKwl9Cit9CisKKy8qKgorU2V0IHRoZSByZXNvbHV0aW9uIHRvIHRoZSBUSUZGIHVzaW5nIGVuZ2xpc2ggdW5pdHMKKyovCitzdGF0aWMgdm9pZCAKK1dyaXRlUmVzb2x1dGlvbihUSUZGICp0aWZmLCBGSUJJVE1BUCAqZGliKSB7CisJZG91YmxlIHJlczsKKworCVRJRkZTZXRGaWVsZCh0aWZmLCBUSUZGVEFHX1JFU09MVVRJT05VTklULCBSRVNVTklUX0lOQ0gpOworCisJcmVzID0gKHVuc2lnbmVkIGxvbmcpICgwLjUgKyAwLjAyNTQgKiBGcmVlSW1hZ2VfR2V0RG90c1Blck1ldGVyWChkaWIpKTsKKwlUSUZGU2V0RmllbGQodGlmZiwgVElGRlRBR19YUkVTT0xVVElPTiwgcmVzKTsKKworCXJlcyA9ICh1bnNpZ25lZCBsb25nKSAoMC41ICsgMC4wMjU0ICogRnJlZUltYWdlX0dldERvdHNQZXJNZXRlclkoZGliKSk7CisJVElGRlNldEZpZWxkKHRpZmYsIFRJRkZUQUdfWVJFU09MVVRJT04sIHJlcyk7Cit9CisKKy8qKgorRmlsbCB0aGUgZGliIHBhbGV0dGUgYWNjb3JkaW5nIHRvIHRoZSBUSUZGIHBob3RvbWV0cmljCisqLworc3RhdGljIHZvaWQgCitSZWFkUGFsZXR0ZShUSUZGICp0aWZmLCB1aW50MTYgcGhvdG9tZXRyaWMsIHVpbnQxNiBiaXRzcGVyc2FtcGxlLCBGSUJJVE1BUCAqZGliKSB7CisJUkdCUVVBRCAqcGFsID0gRnJlZUltYWdlX0dldFBhbGV0dGUoZGliKTsKKworCXN3aXRjaChwaG90b21ldHJpYykgeworCQljYXNlIFBIT1RPTUVUUklDX01JTklTQkxBQ0s6CS8vIGJpdG1hcCBhbmQgZ3JleXNjYWxlIGltYWdlIHR5cGVzCisJCWNhc2UgUEhPVE9NRVRSSUNfTUlOSVNXSElURToKKwkJCS8vIE1vbm9jaHJvbWUgaW1hZ2UKKworCQkJaWYgKGJpdHNwZXJzYW1wbGUgPT0gMSkgeworCQkJCWlmIChwaG90b21ldHJpYyA9PSBQSE9UT01FVFJJQ19NSU5JU1dISVRFKSB7CisJCQkJCXBhbFswXS5yZ2JSZWQgPSBwYWxbMF0ucmdiR3JlZW4gPSBwYWxbMF0ucmdiQmx1ZSA9IDI1NTsKKwkJCQkJcGFsWzFdLnJnYlJlZCA9IHBhbFsxXS5yZ2JHcmVlbiA9IHBhbFsxXS5yZ2JCbHVlID0gMDsKKwkJCQl9IGVsc2UgeworCQkJCQlwYWxbMF0ucmdiUmVkID0gcGFsWzBdLnJnYkdyZWVuID0gcGFsWzBdLnJnYkJsdWUgPSAwOworCQkJCQlwYWxbMV0ucmdiUmVkID0gcGFsWzFdLnJnYkdyZWVuID0gcGFsWzFdLnJnYkJsdWUgPSAyNTU7CisJCQkJfQorCisJCQl9IGVsc2UgaWYgKChiaXRzcGVyc2FtcGxlID09IDQpIHx8KGJpdHNwZXJzYW1wbGUgPT0gOCkpIHsKKwkJCQkvLyBuZWVkIHRvIGJ1aWxkIHRoZSBzY2FsZSBmb3IgZ3JleXNjYWxlIGltYWdlcworCQkJCWludCBuY29sb3JzID0gRnJlZUltYWdlX0dldENvbG9yc1VzZWQoZGliKTsKKworCQkJCWlmIChwaG90b21ldHJpYyA9PSBQSE9UT01FVFJJQ19NSU5JU0JMQUNLKSB7CisJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmNvbG9yczsgaSsrKSB7CisJCQkJCQlwYWxbaV0ucmdiUmVkCT0KKwkJCQkJCXBhbFtpXS5yZ2JHcmVlbiA9CisJCQkJCQlwYWxbaV0ucmdiQmx1ZQk9IChCWVRFKShpKigyNTUvKG5jb2xvcnMtMSkpKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmNvbG9yczsgaSsrKSB7CisJCQkJCQlwYWxbaV0ucmdiUmVkCT0KKwkJCQkJCXBhbFtpXS5yZ2JHcmVlbiA9CisJCQkJCQlwYWxbaV0ucmdiQmx1ZQk9IChCWVRFKSgyNTUtaSooMjU1LyhuY29sb3JzLTEpKSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCWJyZWFrOworCisJCWNhc2UgUEhPVE9NRVRSSUNfUEFMRVRURToJLy8gY29sb3IgbWFwIGluZGV4ZWQKKwkJCXVpbnQxNiAqcmVkOworCQkJdWludDE2ICpncmVlbjsKKwkJCXVpbnQxNiAqYmx1ZTsKKwkJCQorCQkJVElGRkdldEZpZWxkKHRpZmYsIFRJRkZUQUdfQ09MT1JNQVAsICZyZWQsICZncmVlbiwgJmJsdWUpOyAKKworCQkJLy8gbG9hZCB0aGUgcGFsZXR0ZSBpbiB0aGUgRElCCisKKwkJCWlmIChDaGVja0NvbG9ybWFwKDE8PGJpdHNwZXJzYW1wbGUsIHJlZCwgZ3JlZW4sIGJsdWUpID09IDE2KSB7CisJCQkJZm9yIChpbnQgaSA9ICgxIDw8IGJpdHNwZXJzYW1wbGUpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJCQkJcGFsW2ldLnJnYlJlZCA9KEJZVEUpIENWVChyZWRbaV0pOworCQkJCQlwYWxbaV0ucmdiR3JlZW4gPSAoQllURSkgQ1ZUKGdyZWVuW2ldKTsKKwkJCQkJcGFsW2ldLnJnYkJsdWUgPSAoQllURSkgQ1ZUKGJsdWVbaV0pOyAgICAgICAgICAgCisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlmb3IgKGludCBpID0gKDEgPDwgYml0c3BlcnNhbXBsZSkgLSAxOyBpID49IDA7IGktLSkgeworCQkJCQlwYWxbaV0ucmdiUmVkID0gKEJZVEUpIHJlZFtpXTsKKwkJCQkJcGFsW2ldLnJnYkdyZWVuID0gKEJZVEUpIGdyZWVuW2ldOworCQkJCQlwYWxbaV0ucmdiQmx1ZSA9IChCWVRFKSBibHVlW2ldOyAgICAgICAgCisJCQkJfQorCQkJfQorCisJCQlicmVhazsKKwl9Cit9CisKKy8qKiAKK0FsbG9jYXRlIGEgRklCSVRNQVAKK0BwYXJhbSBoZWFkZXJfb25seSBJZiBUUlVFLCBhbGxvY2F0ZSBhICdoZWFkZXIgb25seScgRklCSVRNQVAsIG90aGVyd2lzZSBhbGxvY2F0ZSBhIGZ1bGwgRklCSVRNQVAKK0BwYXJhbSBmaXQgSW1hZ2UgdHlwZQorQHBhcmFtIHdpZHRoIEltYWdlIHdpZHRoIGluIHBpeGVscworQHBhcmFtIGhlaWdodCBJbWFnZSBoZWlnaHQgaW4gcGl4ZWxzCitAcGFyYW0gYml0c3BlcnNhbXBsZSAjIGJpdHMgcGVyIHNhbXBsZQorQHBhcmFtIHNhbXBsZXNwZXJwaXhlbCAjIHNhbXBsZXMgcGVyIHBpeGVsCitAcmV0dXJuIFJldHVybnMgdGhlIGFsbG9jYXRlZCBpbWFnZSBpZiBzdWNjZXNzZnVsLCByZXR1cm5zIE5VTEwgb3RoZXJ3aXNlCisqLworc3RhdGljIEZJQklUTUFQKiAKK0NyZWF0ZUltYWdlVHlwZShCT09MIGhlYWRlcl9vbmx5LCBGUkVFX0lNQUdFX1RZUEUgZml0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIHVpbnQxNiBiaXRzcGVyc2FtcGxlLCB1aW50MTYgc2FtcGxlc3BlcnBpeGVsKSB7CisJRklCSVRNQVAgKmRpYiA9IE5VTEw7CisKKwlpZigod2lkdGggPCAwKSB8fCAoaGVpZ2h0IDwgMCkpIHsKKwkJLy8gY2hlY2sgZm9yIG1hbGljaW91cyBpbWFnZXMKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaW50IGJwcCA9IGJpdHNwZXJzYW1wbGUgKiBzYW1wbGVzcGVycGl4ZWw7CisKKwlpZihmaXQgPT0gRklUX0JJVE1BUCkgeworCQkvLyBzdGFuZGFyZCBiaXRtYXAgdHlwZSAKKworCQlpZihicHAgPT0gMTYpIHsKKwkJCQorCQkJaWYoKHNhbXBsZXNwZXJwaXhlbCA9PSAyKSAmJiAoYml0c3BlcnNhbXBsZSA9PSA4KSkgeworCQkJCS8vIDgtYml0IGluZGV4ZWQgKyA4LWJpdCBhbHBoYSBjaGFubmVsIC0+IGNvbnZlcnQgdG8gOC1iaXQgdHJhbnNwYXJlbnQKKwkJCQlkaWIgPSBGcmVlSW1hZ2VfQWxsb2NhdGVIZWFkZXIoaGVhZGVyX29ubHksIHdpZHRoLCBoZWlnaHQsIDgpOworCQkJfSBlbHNlIHsKKwkJCQkvLyAxNi1iaXQgUkdCIC0+IGV4cGVjdCBpdCB0byBiZSA1NjUKKwkJCQlkaWIgPSBGcmVlSW1hZ2VfQWxsb2NhdGVIZWFkZXIoaGVhZGVyX29ubHksIHdpZHRoLCBoZWlnaHQsIGJwcCwgRkkxNl81NjVfUkVEX01BU0ssIEZJMTZfNTY1X0dSRUVOX01BU0ssIEZJMTZfNTY1X0JMVUVfTUFTSyk7CisJCQl9CisJCQkKKwkJfQorCQllbHNlIHsKKworCQkJZGliID0gRnJlZUltYWdlX0FsbG9jYXRlSGVhZGVyKGhlYWRlcl9vbmx5LCB3aWR0aCwgaGVpZ2h0LCBNSU4oYnBwLCAzMiksIEZJX1JHQkFfUkVEX01BU0ssIEZJX1JHQkFfR1JFRU5fTUFTSywgRklfUkdCQV9CTFVFX01BU0spOworCQl9CisKKworCX0gZWxzZSB7CisJCS8vIG90aGVyIGJpdG1hcCB0eXBlcworCQkKKwkJZGliID0gRnJlZUltYWdlX0FsbG9jYXRlSGVhZGVyVChoZWFkZXJfb25seSwgZml0LCB3aWR0aCwgaGVpZ2h0LCBicHApOworCX0KKworCXJldHVybiBkaWI7Cit9CisKKy8qKiAKK1JlYWQgdGhlIFRJRkZUQUdfU0FNUExFRk9STUFUIHRhZyBhbmQgY29udmVydCB0byBGUkVFX0lNQUdFX1RZUEUKK0BwYXJhbSB0aWZmIExpYlRJRkYgVElGRiBIYW5kbGUKK0BwYXJhbSBiaXRzcGVyc2FtcGxlICMgYml0IHBlciBzYW1wbGUKK0BwYXJhbSBzYW1wbGVzcGVycGl4ZWwgIyBzYW1wbGVzIHBlciBwaXhlbAorQHJldHVybiBSZXR1cm5zIHRoZSBpbWFnZSB0eXBlIGFzIGEgRlJFRV9JTUFHRV9UWVBFIHZhbHVlCisqLworc3RhdGljIEZSRUVfSU1BR0VfVFlQRSAKK1JlYWRJbWFnZVR5cGUoVElGRiAqdGlmZiwgdWludDE2IGJpdHNwZXJzYW1wbGUsIHVpbnQxNiBzYW1wbGVzcGVycGl4ZWwpIHsKKwl1aW50MTYgc2FtcGxlZm9ybWF0ID0gMDsKKwlGUkVFX0lNQUdFX1RZUEUgZml0ID0gRklUX0JJVE1BUCA7IAorCisJdWludDE2IGJwcCA9IGJpdHNwZXJzYW1wbGUgKiBzYW1wbGVzcGVycGl4ZWw7CisKKwkvLyB0cnkgdGhlIHNhbXBsZWZvcm1hdCB0YWcKKyAgICBpZihUSUZGR2V0RmllbGQodGlmZiwgVElGRlRBR19TQU1QTEVGT1JNQVQsICZzYW1wbGVmb3JtYXQpKSB7CisKKyAgICAgICAgc3dpdGNoIChzYW1wbGVmb3JtYXQpIHsKKwkJCWNhc2UgU0FNUExFRk9STUFUX1VJTlQ6CisJCQkJc3dpdGNoIChicHApIHsKKwkJCQkJY2FzZSAxOgorCQkJCQljYXNlIDQ6CisJCQkJCWNhc2UgODoKKwkJCQkJY2FzZSAyNDoKKwkJCQkJCWZpdCA9IEZJVF9CSVRNQVA7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAxNjoKKwkJCQkJCS8vIDgtYml0ICsgYWxwaGEgb3IgMTYtYml0IGdyZXlzY2FsZQorCQkJCQkJaWYoc2FtcGxlc3BlcnBpeGVsID09IDIpIHsKKwkJCQkJCQlmaXQgPSBGSVRfQklUTUFQOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlmaXQgPSBGSVRfVUlOVDE2OworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgMzI6CisJCQkJCQlpZihzYW1wbGVzcGVycGl4ZWwgPT0gNCkgeworCQkJCQkJCWZpdCA9IEZJVF9CSVRNQVA7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWZpdCA9IEZJVF9VSU5UMzI7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSA0ODoKKwkJCQkJCWlmKHNhbXBsZXNwZXJwaXhlbCA9PSAzKSB7CisJCQkJCQkJZml0ID0gRklUX1JHQjE2OworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgNjQ6CisJCQkJCQlpZihzYW1wbGVzcGVycGl4ZWwgPT0gNCkgeworCQkJCQkJCWZpdCA9IEZJVF9SR0JBMTY7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgU0FNUExFRk9STUFUX0lOVDoKKwkJCQlzd2l0Y2ggKGJwcCkgeworCQkJCQljYXNlIDE2OgorCQkJCQkJaWYoc2FtcGxlc3BlcnBpeGVsID09IDMpIHsKKwkJCQkJCQlmaXQgPSBGSVRfQklUTUFQOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlmaXQgPSBGSVRfSU5UMTY7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAzMjoKKwkJCQkJCWZpdCA9IEZJVF9JTlQzMjsKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJY2FzZSBTQU1QTEVGT1JNQVRfSUVFRUZQOgorCQkJCXN3aXRjaCAoYnBwKSB7CisJCQkJCWNhc2UgMzI6CisJCQkJCQlmaXQgPSBGSVRfRkxPQVQ7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSA0ODoKKwkJCQkJCS8vIDMgeCBoYWxmIGZsb2F0ID0+IGNvbnZlcnQgdG8gUkdCRgorCQkJCQkJaWYoKHNhbXBsZXNwZXJwaXhlbCA9PSAzKSAmJiAoYml0c3BlcnNhbXBsZSA9PSAxNikpIHsKKwkJCQkJCQlmaXQgPSBGSVRfUkdCRjsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDY0OgorCQkJCQkJaWYoc2FtcGxlc3BlcnBpeGVsID09IDIpIHsKKwkJCQkJCQlmaXQgPSBGSVRfRkxPQVQ7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWZpdCA9IEZJVF9ET1VCTEU7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSA5NjoKKwkJCQkJCWZpdCA9IEZJVF9SR0JGOworCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQ6CisJCQkJCQlpZihicHAgPj0gMTI4KSB7CisJCQkJCQkJZml0ID0gRklUX1JHQkFGOworCQkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFNBTVBMRUZPUk1BVF9DT01QTEVYSUVFRUZQOgorCQkJCXN3aXRjaCAoYnBwKSB7CisJCQkJCWNhc2UgNjQ6CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAxMjg6CisJCQkJCQlmaXQgPSBGSVRfQ09NUExFWDsKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJfQorICAgIH0KKwkvLyBubyBzYW1wbGVmb3JtYXQgdGFnIDogYXNzdW1lIFNBTVBMRUZPUk1BVF9VSU5UCisJZWxzZSB7CisJCWlmKHNhbXBsZXNwZXJwaXhlbCA9PSAxKSB7CisJCQlzd2l0Y2ggKGJwcCkgeworCQkJCWNhc2UgMTY6CisJCQkJCWZpdCA9IEZJVF9VSU5UMTY7CisJCQkJCWJyZWFrOworCQkJCQkKKwkJCQljYXNlIDMyOgorCQkJCQlmaXQgPSBGSVRfVUlOVDMyOworCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCQllbHNlIGlmKHNhbXBsZXNwZXJwaXhlbCA9PSAzKSB7CisJCQlpZihicHAgPT0gNDgpIGZpdCA9IEZJVF9SR0IxNjsKKwkJfQorCQllbHNlIGlmKHNhbXBsZXNwZXJwaXhlbCA+PSA0KSB7IAorCQkJaWYoYml0c3BlcnNhbXBsZSA9PSAxNikgeworCQkJCWZpdCA9IEZJVF9SR0JBMTY7CisJCQl9CisJCX0KKworCX0KKworICAgIHJldHVybiBmaXQ7Cit9CisKKy8qKiAKK0NvbnZlcnQgRlJFRV9JTUFHRV9UWVBFIGFuZCB3cml0ZSBUSUZGVEFHX1NBTVBMRUZPUk1BVAorQHBhcmFtIHRpZmYgTGliVElGRiBUSUZGIEhhbmRsZQorQHBhcmFtIGZpdCBJbWFnZSB0eXBlIGFzIGEgRlJFRV9JTUFHRV9UWVBFIHZhbHVlCisqLworc3RhdGljIHZvaWQgCitXcml0ZUltYWdlVHlwZShUSUZGICp0aWZmLCBGUkVFX0lNQUdFX1RZUEUgZml0KSB7CisJc3dpdGNoKGZpdCkgeworCQljYXNlIEZJVF9CSVRNQVA6CS8vIHN0YW5kYXJkIGltYWdlOiAxLSwgNC0sIDgtLCAxNi0sIDI0LSwgMzItYml0CisJCWNhc2UgRklUX1VJTlQxNjoJLy8gYXJyYXkgb2YgdW5zaWduZWQgc2hvcnQJOiB1bnNpZ25lZCAxNi1iaXQKKwkJY2FzZSBGSVRfVUlOVDMyOgkvLyBhcnJheSBvZiB1bnNpZ25lZCBsb25nCTogdW5zaWduZWQgMzItYml0CisJCWNhc2UgRklUX1JHQjE2OgkJLy8gNDgtYml0IFJHQiBpbWFnZQkJCTogMyB4IDE2LWJpdAorCQljYXNlIEZJVF9SR0JBMTY6CS8vIDY0LWJpdCBSR0JBIGltYWdlCQk6IDQgeCAxNi1iaXQKKwkJCVRJRkZTZXRGaWVsZCh0aWZmLCBUSUZGVEFHX1NBTVBMRUZPUk1BVCwgU0FNUExFRk9STUFUX1VJTlQpOworCQkJYnJlYWs7CisKKwkJY2FzZSBGSVRfSU5UMTY6CQkvLyBhcnJheSBvZiBzaG9ydAk6IHNpZ25lZCAxNi1iaXQKKwkJY2FzZSBGSVRfSU5UMzI6CQkvLyBhcnJheSBvZiBsb25nCTogc2lnbmVkIDMyLWJpdAorCQkJVElGRlNldEZpZWxkKHRpZmYsIFRJRkZUQUdfU0FNUExFRk9STUFULCBTQU1QTEVGT1JNQVRfSU5UKTsKKwkJCWJyZWFrOworCisJCWNhc2UgRklUX0ZMT0FUOgkJLy8gYXJyYXkgb2YgZmxvYXQJOiAzMi1iaXQKKwkJY2FzZSBGSVRfRE9VQkxFOgkvLyBhcnJheSBvZiBkb3VibGUJOiA2NC1iaXQKKwkJY2FzZSBGSVRfUkdCRjoJCS8vIDk2LWJpdCBSR0IgZmxvYXQgaW1hZ2UJOiAzIHggMzItYml0IElFRUUgZmxvYXRpbmcgcG9pbnQKKwkJY2FzZSBGSVRfUkdCQUY6CQkvLyAxMjgtYml0IFJHQkEgZmxvYXQgaW1hZ2UJOiA0IHggMzItYml0IElFRUUgZmxvYXRpbmcgcG9pbnQKKwkJCVRJRkZTZXRGaWVsZCh0aWZmLCBUSUZGVEFHX1NBTVBMRUZPUk1BVCwgU0FNUExFRk9STUFUX0lFRUVGUCk7CisJCQlicmVhazsKKworCQljYXNlIEZJVF9DT01QTEVYOgkvLyBhcnJheSBvZiBDT01QTEVYIDogMiB4IDY0LWJpdAorCQkJVElGRlNldEZpZWxkKHRpZmYsIFRJRkZUQUdfU0FNUExFRk9STUFULCBTQU1QTEVGT1JNQVRfQ09NUExFWElFRUVGUCk7CisJCQlicmVhazsKKwl9Cit9CisKKy8qKgorU2VsZWN0IHRoZSBjb21wcmVzc2lvbiBhbGdvcml0aG0KK0BwYXJhbSB0aWZmIExpYlRJRkYgVElGRiBIYW5kbGUKK0BwYXJhbSAKKyovCitzdGF0aWMgdm9pZCAKK1dyaXRlQ29tcHJlc3Npb24oVElGRiAqdGlmZiwgdWludDE2IGJpdHNwZXJzYW1wbGUsIHVpbnQxNiBzYW1wbGVzcGVycGl4ZWwsIHVpbnQxNiBwaG90b21ldHJpYywgaW50IGZsYWdzKSB7CisJdWludDE2IGNvbXByZXNzaW9uOworCXVpbnQxNiBiaXRzcGVycGl4ZWwgPSBiaXRzcGVyc2FtcGxlICogc2FtcGxlc3BlcnBpeGVsOworCisJaWYocGhvdG9tZXRyaWMgPT0gUEhPVE9NRVRSSUNfTE9HTFVWKSB7CisJCWNvbXByZXNzaW9uID0gQ09NUFJFU1NJT05fU0dJTE9HOworCX0gZWxzZSBpZiAoKGZsYWdzICYgVElGRl9QQUNLQklUUykgPT0gVElGRl9QQUNLQklUUykgeworCQljb21wcmVzc2lvbiA9IENPTVBSRVNTSU9OX1BBQ0tCSVRTOworCX0gZWxzZSBpZiAoKGZsYWdzICYgVElGRl9ERUZMQVRFKSA9PSBUSUZGX0RFRkxBVEUpIHsKKwkJY29tcHJlc3Npb24gPSBDT01QUkVTU0lPTl9ERUZMQVRFOworCX0gZWxzZSBpZiAoKGZsYWdzICYgVElGRl9BRE9CRV9ERUZMQVRFKSA9PSBUSUZGX0FET0JFX0RFRkxBVEUpIHsKKwkJY29tcHJlc3Npb24gPSBDT01QUkVTU0lPTl9BRE9CRV9ERUZMQVRFOworCX0gZWxzZSBpZiAoKGZsYWdzICYgVElGRl9OT05FKSA9PSBUSUZGX05PTkUpIHsKKwkJY29tcHJlc3Npb24gPSBDT01QUkVTU0lPTl9OT05FOworCX0gZWxzZSBpZiAoKGJpdHNwZXJwaXhlbCA9PSAxKSAmJiAoKGZsYWdzICYgVElGRl9DQ0lUVEZBWDMpID09IFRJRkZfQ0NJVFRGQVgzKSkgeworCQljb21wcmVzc2lvbiA9IENPTVBSRVNTSU9OX0NDSVRURkFYMzsKKwl9IGVsc2UgaWYgKChiaXRzcGVycGl4ZWwgPT0gMSkgJiYgKChmbGFncyAmIFRJRkZfQ0NJVFRGQVg0KSA9PSBUSUZGX0NDSVRURkFYNCkpIHsKKwkJY29tcHJlc3Npb24gPSBDT01QUkVTU0lPTl9DQ0lUVEZBWDQ7CisJfSBlbHNlIGlmICgoZmxhZ3MgJiBUSUZGX0xaVykgPT0gVElGRl9MWlcpIHsKKwkJY29tcHJlc3Npb24gPSBDT01QUkVTU0lPTl9MWlc7CisJfSBlbHNlIGlmICgoZmxhZ3MgJiBUSUZGX0pQRUcpID09IFRJRkZfSlBFRykgeworCQlpZigoKGJpdHNwZXJwaXhlbCA9PSA4KSAmJiAocGhvdG9tZXRyaWMgIT0gUEhPVE9NRVRSSUNfUEFMRVRURSkpIHx8IChiaXRzcGVycGl4ZWwgPT0gMjQpKSB7CisJCQljb21wcmVzc2lvbiA9IENPTVBSRVNTSU9OX0pQRUc7CisJCQkvLyBSb3dzUGVyU3RyaXAgbXVzdCBiZSBtdWx0aXBsZSBvZiA4IGZvciBKUEVHCisJCQl1aW50MzIgcm93c3BlcnN0cmlwID0gKHVpbnQzMikgLTE7CisJCQlyb3dzcGVyc3RyaXAgPSBUSUZGRGVmYXVsdFN0cmlwU2l6ZSh0aWZmLCByb3dzcGVyc3RyaXApOworICAgICAgICAgICAgcm93c3BlcnN0cmlwID0gcm93c3BlcnN0cmlwICsgKDggLSAocm93c3BlcnN0cmlwICUgOCkpOworCQkJLy8gb3ZlcndyaXRlIHByZXZpb3VzIFJvd3NQZXJTdHJpcAorCQkJVElGRlNldEZpZWxkKHRpZmYsIFRJRkZUQUdfUk9XU1BFUlNUUklQLCByb3dzcGVyc3RyaXApOworCQl9IGVsc2UgeworCQkJLy8gZGVmYXVsdCB0byBMWlcKKwkJCWNvbXByZXNzaW9uID0gQ09NUFJFU1NJT05fTFpXOworCQl9CisJfQorCWVsc2UgeworCQkvLyBkZWZhdWx0IGNvbXByZXNzaW9uIHNjaGVtZQorCisJCXN3aXRjaChiaXRzcGVycGl4ZWwpIHsKKwkJCWNhc2UgMToKKwkJCQljb21wcmVzc2lvbiA9IENPTVBSRVNTSU9OX0NDSVRURkFYNDsKKwkJCQlicmVhazsKKworCQkJY2FzZSA0OgorCQkJY2FzZSA4OgorCQkJY2FzZSAxNjoKKwkJCWNhc2UgMjQ6CisJCQljYXNlIDMyOgorCQkJCWNvbXByZXNzaW9uID0gQ09NUFJFU1NJT05fTFpXOworCQkJCWJyZWFrOworCQkJY2FzZSA0ODoKKwkJCWNhc2UgNjQ6CisJCQljYXNlIDk2OgorCQkJY2FzZSAxMjg6CisJCQkJY29tcHJlc3Npb24gPSBDT01QUkVTU0lPTl9MWlc7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQgOgorCQkJCWNvbXByZXNzaW9uID0gQ09NUFJFU1NJT05fTk9ORTsKKwkJCQlicmVhazsKKwkJfQorCX0KKworCVRJRkZTZXRGaWVsZCh0aWZmLCBUSUZGVEFHX0NPTVBSRVNTSU9OLCBjb21wcmVzc2lvbik7CisKKwlpZihjb21wcmVzc2lvbiA9PSBDT01QUkVTU0lPTl9MWlcpIHsKKwkJLy8gVGhpcyBvcHRpb24gaXMgb25seSBtZWFuaW5nZnVsIHdpdGggTFpXIGNvbXByZXNzaW9uOiBhIHByZWRpY3RvciB2YWx1ZSBvZiAyIAorCQkvLyBjYXVzZXMgZWFjaCBzY2FubGluZSBvZiB0aGUgb3V0cHV0IGltYWdlIHRvIHVuZGVyZ28gaG9yaXpvbnRhbCBkaWZmZXJlbmNpbmcgCisJCS8vIGJlZm9yZSBpdCBpcyBlbmNvZGVkOyBhIHZhbHVlIG9mIDEgZm9yY2VzIGVhY2ggc2NhbmxpbmUgdG8gYmUgZW5jb2RlZCB3aXRob3V0IGRpZmZlcmVuY2luZy4KKworCQkvLyBGb3VuZCBvbiBMaWJUSUZGIG1haWxpbmcgbGlzdCA6IAorCQkvLyBMWlcgd2l0aG91dCBkaWZmZXJlbmNpbmcgd29ya3Mgd2VsbCBmb3IgMS1iaXQgaW1hZ2VzLCA0LWJpdCBncmF5c2NhbGUgaW1hZ2VzLCAKKwkJLy8gYW5kIG1hbnkgcGFsZXR0ZS1jb2xvciBpbWFnZXMuIEJ1dCBuYXR1cmFsIDI0LWJpdCBjb2xvciBpbWFnZXMgYW5kIHNvbWUgOC1iaXQgCisJCS8vIGdyYXlzY2FsZSBpbWFnZXMgZG8gbXVjaCBiZXR0ZXIgd2l0aCBkaWZmZXJlbmNpbmcuCisKKwkJaWYoKGJpdHNwZXJzYW1wbGUgPT0gOCkgfHwgKGJpdHNwZXJzYW1wbGUgPT0gMTYpKSB7CisJCQlpZiAoKGJpdHNwZXJwaXhlbCA+PSA4KSAmJiAocGhvdG9tZXRyaWMgIT0gUEhPVE9NRVRSSUNfUEFMRVRURSkpIHsKKwkJCQlUSUZGU2V0RmllbGQodGlmZiwgVElGRlRBR19QUkVESUNUT1IsIDIpOworCQkJfSBlbHNlIHsKKwkJCQlUSUZGU2V0RmllbGQodGlmZiwgVElGRlRBR19QUkVESUNUT1IsIDEpOworCQkJfQorCQl9IGVsc2UgeworCQkJVElGRlNldEZpZWxkKHRpZmYsIFRJRkZUQUdfUFJFRElDVE9SLCAxKTsKKwkJfQorCX0KKwllbHNlIGlmKChjb21wcmVzc2lvbiA9PSBDT01QUkVTU0lPTl9DQ0lUVEZBWDMpIHx8IChjb21wcmVzc2lvbiA9PSBDT01QUkVTU0lPTl9DQ0lUVEZBWDQpKSB7CisJCXVpbnQzMiBpbWFnZUxlbmd0aCA9IDA7CisJCVRJRkZHZXRGaWVsZCh0aWZmLCBUSUZGVEFHX0lNQUdFTEVOR1RILCAmaW1hZ2VMZW5ndGgpOworCQkvLyBvdmVyd3JpdGUgcHJldmlvdXMgUm93c1BlclN0cmlwCisJCVRJRkZTZXRGaWVsZCh0aWZmLCBUSUZGVEFHX1JPV1NQRVJTVFJJUCwgaW1hZ2VMZW5ndGgpOworCisJCWlmKGNvbXByZXNzaW9uID09IENPTVBSRVNTSU9OX0NDSVRURkFYMykgeworCQkJLy8gdHJ5IHRvIGJlIGNvbXBsaWFudCB3aXRoIHRoZSBUSUZGIENsYXNzIEYgc3BlY2lmaWNhdGlvbgorCQkJLy8gdGhhdCBkb2N1bWVudHMgdGhlIFRJRkYgdGFncyBzcGVjaWZpYyB0byBGQVggYXBwbGljYXRpb25zCisJCQkvLyBzZWUgaHR0cDovL3BhbGltcHNlc3Quc3RhbmZvcmQuZWR1L2J5dG9waWMvaW1hZ2luZy9zdGQvdGlmZi1mLmh0bWwKKwkJCXVpbnQzMiBncm91cDNvcHRpb25zID0gR1JPVVAzT1BUXzJERU5DT0RJTkcgfCBHUk9VUDNPUFRfRklMTEJJVFM7CQorCQkJVElGRlNldEZpZWxkKHRpZmYsIFRJRkZUQUdfR1JPVVAzT1BUSU9OUywgZ3JvdXAzb3B0aW9ucyk7CS8vIDJkLWVuY29kZWQsIGhhcyBhbGlnbmVkIEVPTAorCQkJVElGRlNldEZpZWxkKHRpZmYsIFRJRkZUQUdfRklMTE9SREVSLCBGSUxMT1JERVJfTFNCMk1TQik7CS8vIGxzYi10by1tc2IgZmlsbG9yZGVyCisJCX0KKwl9Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFRJRkYgbWV0YWRhdGEgcm91dGluZXMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLyoqCisJUmVhZCB0aGUgVElGRlRBR19SSUNIVElGRklQVEMgdGFnIChJUFRDL05BQSBvciBBZG9iZSBQaG90b3Nob3AgcHJvZmlsZSkKKyovCitzdGF0aWMgQk9PTCAKK3RpZmZfcmVhZF9pcHRjX3Byb2ZpbGUoVElGRiAqdGlmZiwgRklCSVRNQVAgKmRpYikgeworCUJZVEUgKnByb2ZpbGUgPSBOVUxMOworCXVpbnQzMiBwcm9maWxlX3NpemUgPSAwOworCisgICAgaWYoVElGRkdldEZpZWxkKHRpZmYsVElGRlRBR19SSUNIVElGRklQVEMsICZwcm9maWxlX3NpemUsICZwcm9maWxlKSA9PSAxKSB7CisJCWlmIChUSUZGSXNCeXRlU3dhcHBlZCh0aWZmKSAhPSAwKSB7CisJCQlUSUZGU3dhYkFycmF5T2ZMb25nKCh1aW50MzIgKikgcHJvZmlsZSwgKHVuc2lnbmVkIGxvbmcpcHJvZmlsZV9zaXplKTsKKwkJfQorCisJCXJldHVybiByZWFkX2lwdGNfcHJvZmlsZShkaWIsIHByb2ZpbGUsIDQgKiBwcm9maWxlX3NpemUpOworCX0KKworCXJldHVybiBGQUxTRTsKK30KKworLyoqCisJUmVhZCB0aGUgVElGRlRBR19YTUxQQUNLRVQgdGFnIChYTVAgcHJvZmlsZSkKKwlAcGFyYW0gZGliIElucHV0IEZJQklUTUFQCisJQHBhcmFtIHRpZmYgTGliVElGRiBUSUZGIGhhbmRsZQorCUByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZQorKi8KK3N0YXRpYyBCT09MICAKK3RpZmZfcmVhZF94bXBfcHJvZmlsZShUSUZGICp0aWZmLCBGSUJJVE1BUCAqZGliKSB7CisJQllURSAqcHJvZmlsZSA9IE5VTEw7CisJdWludDMyIHByb2ZpbGVfc2l6ZSA9IDA7CisKKwlpZiAoVElGRkdldEZpZWxkKHRpZmYsIFRJRkZUQUdfWE1MUEFDS0VULCAmcHJvZmlsZV9zaXplLCAmcHJvZmlsZSkgPT0gMSkgeworCQkvLyBjcmVhdGUgYSB0YWcKKwkJRklUQUcgKnRhZyA9IEZyZWVJbWFnZV9DcmVhdGVUYWcoKTsKKwkJaWYoIXRhZykgcmV0dXJuIEZBTFNFOworCisJCUZyZWVJbWFnZV9TZXRUYWdJRCh0YWcsIFRJRkZUQUdfWE1MUEFDS0VUKTsJLy8gNzAwCisJCUZyZWVJbWFnZV9TZXRUYWdLZXkodGFnLCBnX1RhZ0xpYl9YTVBGaWVsZE5hbWUpOworCQlGcmVlSW1hZ2VfU2V0VGFnTGVuZ3RoKHRhZywgcHJvZmlsZV9zaXplKTsKKwkJRnJlZUltYWdlX1NldFRhZ0NvdW50KHRhZywgcHJvZmlsZV9zaXplKTsKKwkJRnJlZUltYWdlX1NldFRhZ1R5cGUodGFnLCBGSURUX0FTQ0lJKTsKKwkJRnJlZUltYWdlX1NldFRhZ1ZhbHVlKHRhZywgcHJvZmlsZSk7CisKKwkJLy8gc3RvcmUgdGhlIHRhZworCQlGcmVlSW1hZ2VfU2V0TWV0YWRhdGEoRklNRF9YTVAsIGRpYiwgRnJlZUltYWdlX0dldFRhZ0tleSh0YWcpLCB0YWcpOworCisJCS8vIGRlc3Ryb3kgdGhlIHRhZworCQlGcmVlSW1hZ2VfRGVsZXRlVGFnKHRhZyk7CisKKwkJcmV0dXJuIFRSVUU7CisJfQorCisJcmV0dXJuIEZBTFNFOworfQorCisvKioKKwlSZWFkIHRoZSBFeGlmIHByb2ZpbGUgZW1iZWRkZWQgaW4gYSBUSUZGCisJQHBhcmFtIGRpYiBJbnB1dCBGSUJJVE1BUAorCUBwYXJhbSB0aWZmIExpYlRJRkYgVElGRiBoYW5kbGUKKwlAcmV0dXJuIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UKKyovCitzdGF0aWMgQk9PTCAKK3RpZmZfcmVhZF9leGlmX3Byb2ZpbGUoVElGRiAqdGlmZiwgRklCSVRNQVAgKmRpYikgeworCUJPT0wgYlJlc3VsdCA9IEZBTFNFOworICAgIHRvZmZfdCBleGlmX29mZnNldCA9IDA7CisKKwkvLyByZWFkIEVYSUYtVElGRiB0YWdzCisJYlJlc3VsdCA9IHRpZmZfcmVhZF9leGlmX3RhZ3ModGlmZiwgVGFnTGliOjpFWElGX01BSU4sIGRpYik7CisKKwkvLyBnZXQgdGhlIElGRCBvZmZzZXQKKwlpZihUSUZGR2V0RmllbGQodGlmZiwgVElGRlRBR19FWElGSUZELCAmZXhpZl9vZmZzZXQpKSB7CisKKwkJLy8gcmVhZCBFWElGIHRhZ3MKKwkJaWYoIVRJRkZSZWFkRVhJRkRpcmVjdG9yeSh0aWZmLCBleGlmX29mZnNldCkpIHsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCisJCS8vIHJlYWQgYWxsIGtub3duIGV4aWYgdGFncworCQliUmVzdWx0ID0gdGlmZl9yZWFkX2V4aWZfdGFncyh0aWZmLCBUYWdMaWI6OkVYSUZfRVhJRiwgZGliKTsKKwl9CisKKwlyZXR1cm4gYlJlc3VsdDsKK30KKworLyoqCitSZWFkIFRJRkYgc3BlY2lhbCBwcm9maWxlcworKi8KK3N0YXRpYyB2b2lkIAorUmVhZE1ldGFkYXRhKFRJRkYgKnRpZmYsIEZJQklUTUFQICpkaWIpIHsKKworCS8vIElQVEMvTkFBCisJdGlmZl9yZWFkX2lwdGNfcHJvZmlsZSh0aWZmLCBkaWIpOworCisJLy8gQWRvYmUgWE1QCisJdGlmZl9yZWFkX3htcF9wcm9maWxlKHRpZmYsIGRpYik7CisKKwkvLyBHZW9USUZGCisJdGlmZl9yZWFkX2dlb3RpZmZfcHJvZmlsZSh0aWZmLCBkaWIpOworCisJLy8gRXhpZi1USUZGCisJdGlmZl9yZWFkX2V4aWZfcHJvZmlsZSh0aWZmLCBkaWIpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qKgorCVdyaXRlIHRoZSBUSUZGVEFHX1JJQ0hUSUZGSVBUQyB0YWcgKElQVEMvTkFBIG9yIEFkb2JlIFBob3Rvc2hvcCBwcm9maWxlKQorKi8KK3N0YXRpYyBCT09MIAordGlmZl93cml0ZV9pcHRjX3Byb2ZpbGUoVElGRiAqdGlmZiwgRklCSVRNQVAgKmRpYikgeworCWlmKEZyZWVJbWFnZV9HZXRNZXRhZGF0YUNvdW50KEZJTURfSVBUQywgZGliKSkgeworCQlCWVRFICpwcm9maWxlID0gTlVMTDsKKwkJdWludDMyIHByb2ZpbGVfc2l6ZSA9IDA7CisJCS8vIGNyZWF0ZSBhIGJpbmFyeSBwcm9maWxlCisJCWlmKHdyaXRlX2lwdGNfcHJvZmlsZShkaWIsICZwcm9maWxlLCAmcHJvZmlsZV9zaXplKSkgeworCQkJdWludDMyIGlwdGNfc2l6ZSA9IHByb2ZpbGVfc2l6ZTsKKwkJCWlwdGNfc2l6ZSArPSAoNC0oaXB0Y19zaXplICYgMHgwMykpOyAvLyBSb3VuZCB1cCBmb3IgbG9uZyB3b3JkIGFsaWdubWVudAorCQkJQllURSAqaXB0Y19wcm9maWxlID0gKEJZVEUqKW1hbGxvYyhpcHRjX3NpemUpOworCQkJaWYoIWlwdGNfcHJvZmlsZSkgeworCQkJCWZyZWUocHJvZmlsZSk7CisJCQkJcmV0dXJuIEZBTFNFOworCQkJfQorCQkJbWVtc2V0KGlwdGNfcHJvZmlsZSwgMCwgaXB0Y19zaXplKTsKKwkJCW1lbWNweShpcHRjX3Byb2ZpbGUsIHByb2ZpbGUsIHByb2ZpbGVfc2l6ZSk7CisJCQlpZiAoVElGRklzQnl0ZVN3YXBwZWQodGlmZikpIHsKKwkJCQlUSUZGU3dhYkFycmF5T2ZMb25nKCh1aW50MzIgKikgaXB0Y19wcm9maWxlLCAodW5zaWduZWQgbG9uZylpcHRjX3NpemUvNCk7CisJCQl9CisJCQkvLyBUYWcgaXMgdHlwZSBUSUZGX0xPTkcgc28gYnl0ZSBsZW5ndGggaXMgZGl2aWRlZCBieSBmb3VyCisJCQlUSUZGU2V0RmllbGQodGlmZiwgVElGRlRBR19SSUNIVElGRklQVEMsIGlwdGNfc2l6ZS80LCBpcHRjX3Byb2ZpbGUpOworCQkJLy8gcmVsZWFzZSB0aGUgcHJvZmlsZSBkYXRhCisJCQlmcmVlKGlwdGNfcHJvZmlsZSk7CisJCQlmcmVlKHByb2ZpbGUpOworCisJCQlyZXR1cm4gVFJVRTsKKwkJfQorCX0KKworCXJldHVybiBGQUxTRTsKK30KKworLyoqCisJV3JpdGUgdGhlIFRJRkZUQUdfWE1MUEFDS0VUIHRhZyAoWE1QIHByb2ZpbGUpCisJQHBhcmFtIGRpYiBJbnB1dCBGSUJJVE1BUAorCUBwYXJhbSB0aWZmIExpYlRJRkYgVElGRiBoYW5kbGUKKwlAcmV0dXJuIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UKKyovCitzdGF0aWMgQk9PTCAgCit0aWZmX3dyaXRlX3htcF9wcm9maWxlKFRJRkYgKnRpZmYsIEZJQklUTUFQICpkaWIpIHsKKwlGSVRBRyAqdGFnX3htcCA9IE5VTEw7CisJRnJlZUltYWdlX0dldE1ldGFkYXRhKEZJTURfWE1QLCBkaWIsIGdfVGFnTGliX1hNUEZpZWxkTmFtZSwgJnRhZ194bXApOworCisJaWYodGFnX3htcCAmJiAoTlVMTCAhPSBGcmVlSW1hZ2VfR2V0VGFnVmFsdWUodGFnX3htcCkpKSB7CisJCQorCQlUSUZGU2V0RmllbGQodGlmZiwgVElGRlRBR19YTUxQQUNLRVQsICh1aW50MzIpRnJlZUltYWdlX0dldFRhZ0xlbmd0aCh0YWdfeG1wKSwgKEJZVEUqKUZyZWVJbWFnZV9HZXRUYWdWYWx1ZSh0YWdfeG1wKSk7CisKKwkJcmV0dXJuIFRSVUU7CQkKKwl9CisKKwlyZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorCVdyaXRlIHRoZSBFeGlmIHByb2ZpbGUgdG8gVElGRgorCUBwYXJhbSBkaWIgSW5wdXQgRklCSVRNQVAKKwlAcGFyYW0gdGlmZiBMaWJUSUZGIFRJRkYgaGFuZGxlCisJQHJldHVybiBSZXR1cm5zIFRSVUUgaWYgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlCisqLworc3RhdGljIEJPT0wKK3RpZmZfd3JpdGVfZXhpZl9wcm9maWxlKFRJRkYgKnRpZmYsIEZJQklUTUFQICpkaWIpIHsKKwlCT09MIGJSZXN1bHQgPSBGQUxTRTsKKwkKKwkvLyB3cml0ZSBFWElGX01BSU4gdGFncywgRVhJRl9FWElGIG5vdCBzdXBwb3J0ZWQgeWV0CisJYlJlc3VsdCA9IHRpZmZfd3JpdGVfZXhpZl90YWdzKHRpZmYsIFRhZ0xpYjo6RVhJRl9NQUlOLCBkaWIpOworCisJcmV0dXJuIGJSZXN1bHQ7Cit9CisKKy8qKgorV3JpdGUgVElGRiBzcGVjaWFsIHByb2ZpbGVzCisqLworc3RhdGljIHZvaWQgCitXcml0ZU1ldGFkYXRhKFRJRkYgKnRpZmYsIEZJQklUTUFQICpkaWIpIHsKKwkvLyBJUFRDCisJdGlmZl93cml0ZV9pcHRjX3Byb2ZpbGUodGlmZiwgZGliKTsKKwkKKwkvLyBBZG9iZSBYTVAKKwl0aWZmX3dyaXRlX3htcF9wcm9maWxlKHRpZmYsIGRpYik7CisJCisJLy8gRVhJRl9NQUlOIHRhZ3MKKwl0aWZmX3dyaXRlX2V4aWZfcHJvZmlsZSh0aWZmLCBkaWIpOworCQorCS8vIEdlb1RJRkYgdGFncworCXRpZmZfd3JpdGVfZ2VvdGlmZl9wcm9maWxlKHRpZmYsIGRpYik7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFBsdWdpbiBJbXBsZW1lbnRhdGlvbgorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgorRm9ybWF0KCkgeworCXJldHVybiAiVElGRiI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCitEZXNjcmlwdGlvbigpIHsKKwlyZXR1cm4gIlRhZ2dlZCBJbWFnZSBGaWxlIEZvcm1hdCI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCitFeHRlbnNpb24oKSB7CisJcmV0dXJuICJ0aWYsdGlmZiI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCitSZWdFeHByKCkgeworCXJldHVybiAiXltNSV1bTUldW1xceDAxKl1bXFx4MDEqXSI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCitNaW1lVHlwZSgpIHsKKwlyZXR1cm4gImltYWdlL3RpZmYiOworfQorCitzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYKK1ZhbGlkYXRlKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSkgewkKKwlCWVRFIHRpZmZfaWQxW10gPSB7IDB4NDksIDB4NDksIDB4MkEsIDB4MDAgfTsJLy8gQ2xhc3NpYyBUSUZGLCBsaXR0bGUtZW5kaWFuCisJQllURSB0aWZmX2lkMltdID0geyAweDRELCAweDRELCAweDAwLCAweDJBIH07CS8vIENsYXNzaWMgVElGRiwgYmlnLWVuZGlhbgorCUJZVEUgdGlmZl9pZDNbXSA9IHsgMHg0OSwgMHg0OSwgMHgyQiwgMHgwMCB9OwkvLyBCaWcgVElGRiwgbGl0dGxlLWVuZGlhbgorCUJZVEUgdGlmZl9pZDRbXSA9IHsgMHg0RCwgMHg0RCwgMHgwMCwgMHgyQiB9OwkvLyBCaWcgVElGRiwgYmlnLWVuZGlhbgorCUJZVEUgc2lnbmF0dXJlWzRdID0geyAwLCAwLCAwLCAwIH07CisKKwlpby0+cmVhZF9wcm9jKHNpZ25hdHVyZSwgMSwgNCwgaGFuZGxlKTsKKworCWlmKG1lbWNtcCh0aWZmX2lkMSwgc2lnbmF0dXJlLCA0KSA9PSAwKQorCQlyZXR1cm4gVFJVRTsKKwlpZihtZW1jbXAodGlmZl9pZDIsIHNpZ25hdHVyZSwgNCkgPT0gMCkKKwkJcmV0dXJuIFRSVUU7CisJaWYobWVtY21wKHRpZmZfaWQzLCBzaWduYXR1cmUsIDQpID09IDApCisJCXJldHVybiBUUlVFOworCWlmKG1lbWNtcCh0aWZmX2lkNCwgc2lnbmF0dXJlLCA0KSA9PSAwKQorCQlyZXR1cm4gVFJVRTsKKworCXJldHVybiBGQUxTRTsKK30KKworc3RhdGljIEJPT0wgRExMX0NBTExDT05WCitTdXBwb3J0c0V4cG9ydERlcHRoKGludCBkZXB0aCkgeworCXJldHVybiAoCisJCQkoZGVwdGggPT0gMSkgIHx8CisJCQkoZGVwdGggPT0gNCkgIHx8CisJCQkoZGVwdGggPT0gOCkgIHx8CisJCQkoZGVwdGggPT0gMjQpIHx8CisJCQkoZGVwdGggPT0gMzIpCisJCSk7Cit9CisKK3N0YXRpYyBCT09MIERMTF9DQUxMQ09OViAKK1N1cHBvcnRzRXhwb3J0VHlwZShGUkVFX0lNQUdFX1RZUEUgdHlwZSkgeworCXJldHVybiAoCisJCSh0eXBlID09IEZJVF9CSVRNQVApICB8fAorCQkodHlwZSA9PSBGSVRfVUlOVDE2KSAgfHwKKwkJKHR5cGUgPT0gRklUX0lOVDE2KSAgIHx8CisJCSh0eXBlID09IEZJVF9VSU5UMzIpICB8fAorCQkodHlwZSA9PSBGSVRfSU5UMzIpICAgfHwKKwkJKHR5cGUgPT0gRklUX0ZMT0FUKSAgIHx8CisJCSh0eXBlID09IEZJVF9ET1VCTEUpICB8fAorCQkodHlwZSA9PSBGSVRfQ09NUExFWCkgfHwgCisJCSh0eXBlID09IEZJVF9SR0IxNikgICB8fCAKKwkJKHR5cGUgPT0gRklUX1JHQkExNikgIHx8IAorCQkodHlwZSA9PSBGSVRfUkdCRikgICAgfHwKKwkJKHR5cGUgPT0gRklUX1JHQkFGKQorCSk7Cit9CisKK3N0YXRpYyBCT09MIERMTF9DQUxMQ09OVgorU3VwcG9ydHNJQ0NQcm9maWxlcygpIHsKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIEJPT0wgRExMX0NBTExDT05WCitTdXBwb3J0c05vUGl4ZWxzKCkgeworCXJldHVybiBUUlVFOworfSAKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCAqIERMTF9DQUxMQ09OVgorT3BlbihGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIEJPT0wgcmVhZCkgeworCS8vIHdyYXBwZXIgZm9yIFRJRkYgSS9PCisJZmlfVElGRklPICpmaW8gPSAoZmlfVElGRklPKiltYWxsb2Moc2l6ZW9mKGZpX1RJRkZJTykpOworCWlmKCFmaW8pIHJldHVybiBOVUxMOworCWZpby0+aW8gPSBpbzsKKwlmaW8tPmhhbmRsZSA9IGhhbmRsZTsKKworCWlmIChyZWFkKSB7CisJCWZpby0+dGlmID0gVElGRkZkT3BlbigodGhhbmRsZV90KWZpbywgIiIsICJyIik7CisJfSBlbHNlIHsKKwkJLy8gbW9kZSA9ICJ3Igk6IHdyaXRlIENsYXNzaWMgVElGRgorCQkvLyBtb2RlID0gInc4Igk6IHdyaXRlIEJpZyBUSUZGCisJCWZpby0+dGlmID0gVElGRkZkT3BlbigodGhhbmRsZV90KWZpbywgIiIsICJ3Iik7CisJfQorCWlmKGZpby0+dGlmID09IE5VTEwpIHsKKwkJZnJlZShmaW8pOworCQlGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2Moc19mb3JtYXRfaWQsICJFcnJvciB3aGlsZSBvcGVuaW5nIFRJRkY6IGRhdGEgaXMgaW52YWxpZCIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIGZpbzsKK30KKworc3RhdGljIHZvaWQgRExMX0NBTExDT05WCitDbG9zZShGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIHZvaWQgKmRhdGEpIHsKKwlpZihkYXRhKSB7CisJCWZpX1RJRkZJTyAqZmlvID0gKGZpX1RJRkZJTyopZGF0YTsKKwkJVElGRkNsb3NlKGZpby0+dGlmKTsKKwkJZnJlZShmaW8pOworCX0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW50IERMTF9DQUxMQ09OVgorUGFnZUNvdW50KEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSwgdm9pZCAqZGF0YSkgeworCWlmKGRhdGEpIHsKKwkJZmlfVElGRklPICpmaW8gPSAoZmlfVElGRklPKilkYXRhOworCQlUSUZGICp0aWYgPSAoVElGRiAqKWZpby0+dGlmOworCQlpbnQgbnJfaWZkID0gMDsKKworCQlkbyB7CisJCQlucl9pZmQrKzsKKwkJfSB3aGlsZSAoVElGRlJlYWREaXJlY3RvcnkodGlmKSk7CisJCQkJCisJCXJldHVybiBucl9pZmQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoqCitjaGVjayBmb3IgdW5jb21tb24gYml0c3BlcnNhbXBsZSB2YWx1ZXMgKGUuZy4gMTAsIDEyLCAuLi4pCitAcGFyYW0gcGhvdG9tZXRyaWMgVElGRlRBR19QSE9UT01FVFJJQyB0aWZmIHRhZworQHBhcmFtIGJpdHNwZXJzYW1wbGUgVElGRlRBR19CSVRTUEVSU0FNUExFIHRpZmYgdGFnCitAcmV0dXJuIFJldHVybnMgRkFMU0UgaWYgYSB1bmNvbW1vbiBiaXQtZGVwdGggaXMgZW5jb3VudGVyZWQsIHJldHVybnMgVFJVRSBvdGhlcndpc2UKKyovCitzdGF0aWMgQk9PTCAKK0lzVmFsaWRCaXRzUGVyU2FtcGxlKHVpbnQxNiBwaG90b21ldHJpYywgdWludDE2IGJpdHNwZXJzYW1wbGUpIHsKKworCXN3aXRjaChiaXRzcGVyc2FtcGxlKSB7CisJCWNhc2UgMToKKwkJY2FzZSA0OgorCQkJaWYoKHBob3RvbWV0cmljID09IFBIT1RPTUVUUklDX01JTklTV0hJVEUpIHx8IChwaG90b21ldHJpYyA9PSBQSE9UT01FVFJJQ19NSU5JU0JMQUNLKSB8fCAocGhvdG9tZXRyaWMgPT0gUEhPVE9NRVRSSUNfUEFMRVRURSkpIHsgCisJCQkJcmV0dXJuIFRSVUU7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiBGQUxTRTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDg6CisJCQlyZXR1cm4gVFJVRTsKKwkJY2FzZSAxNjoKKwkJCWlmKHBob3RvbWV0cmljICE9IFBIT1RPTUVUUklDX1BBTEVUVEUpIHsgCisJCQkJcmV0dXJuIFRSVUU7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiBGQUxTRTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDMyOgorCQkJaWYoKHBob3RvbWV0cmljID09IFBIT1RPTUVUUklDX01JTklTV0hJVEUpIHx8IChwaG90b21ldHJpYyA9PSBQSE9UT01FVFJJQ19NSU5JU0JMQUNLKSB8fCAocGhvdG9tZXRyaWMgPT0gUEhPVE9NRVRSSUNfTE9HTFVWKSkgeyAKKwkJCQlyZXR1cm4gVFJVRTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIEZBTFNFOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgNjQ6CisJCWNhc2UgMTI4OgorCQkJaWYocGhvdG9tZXRyaWMgPT0gUEhPVE9NRVRSSUNfTUlOSVNCTEFDSykgeyAKKwkJCQlyZXR1cm4gVFJVRTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIEZBTFNFOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gRkFMU0U7CisJfQorfQorCitzdGF0aWMgVElGRkxvYWRNZXRob2QgIAorRmluZExvYWRNZXRob2QoVElGRiAqdGlmLCBGUkVFX0lNQUdFX1RZUEUgaW1hZ2VfdHlwZSwgaW50IGZsYWdzKSB7CisJdWludDE2IGJpdHNwZXJzYW1wbGUJPSAodWludDE2KS0xOworCXVpbnQxNiBzYW1wbGVzcGVycGl4ZWwJPSAodWludDE2KS0xOworCXVpbnQxNiBwaG90b21ldHJpYwkJPSAodWludDE2KS0xOworCXVpbnQxNiBwbGFuYXJfY29uZmlnCT0gKHVpbnQxNiktMTsKKworCVRJRkZMb2FkTWV0aG9kIGxvYWRNZXRob2QgPSBMb2FkQXNHZW5lcmljU3RyaXA7CisKKwlUSUZGR2V0RmllbGQodGlmLCBUSUZGVEFHX1BIT1RPTUVUUklDLCAmcGhvdG9tZXRyaWMpOworCVRJRkZHZXRGaWVsZCh0aWYsIFRJRkZUQUdfU0FNUExFU1BFUlBJWEVMLCAmc2FtcGxlc3BlcnBpeGVsKTsKKwlUSUZGR2V0RmllbGQodGlmLCBUSUZGVEFHX0JJVFNQRVJTQU1QTEUsICZiaXRzcGVyc2FtcGxlKTsKKwlUSUZGR2V0RmllbGREZWZhdWx0ZWQodGlmLCBUSUZGVEFHX1BMQU5BUkNPTkZJRywgJnBsYW5hcl9jb25maWcpOworCisJQk9PTCBiSXNUaWxlZCA9IChUSUZGSXNUaWxlZCh0aWYpID09IDApID8gRkFMU0U6VFJVRTsKKworCXN3aXRjaChwaG90b21ldHJpYykgeworCQkvLyBjb252ZXJ0IHRvIDI0IG9yIDMyIGJpdHMgUkdCIGlmIHRoZSBpbWFnZSBpcyBmdWxsIGNvbG9yCisJCWNhc2UgUEhPVE9NRVRSSUNfUkdCOgorCQkJaWYoKGltYWdlX3R5cGUgPT0gRklUX1JHQjE2KSB8fCAoaW1hZ2VfdHlwZSA9PSBGSVRfUkdCQTE2KSkgeworCQkJCS8vIGxvYWQgNDgtYml0IFJHQiBhbmQgNjQtYml0IFJHQkEgd2l0aG91dCBjb252ZXJzaW9uIAorCQkJCWxvYWRNZXRob2QgPSBMb2FkQXNHZW5lcmljU3RyaXA7CisJCQl9IAorCQkJZWxzZSBpZihpbWFnZV90eXBlID09IEZJVF9SR0JGKSB7CisJCQkJaWYoKHNhbXBsZXNwZXJwaXhlbCA9PSAzKSAmJiAoYml0c3BlcnNhbXBsZSA9PSAxNikpIHsKKwkJCQkJLy8gbG9hZCAzIHggMTYtYml0IGhhbGYgYXMgUkdCRgorCQkJCQlsb2FkTWV0aG9kID0gTG9hZEFzSGFsZkZsb2F0OworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFBIT1RPTUVUUklDX1lDQkNSOgorCQljYXNlIFBIT1RPTUVUUklDX0NJRUxBQjoKKwkJY2FzZSBQSE9UT01FVFJJQ19JQ0NMQUI6CisJCWNhc2UgUEhPVE9NRVRSSUNfSVRVTEFCOgorCQkJbG9hZE1ldGhvZCA9IExvYWRBc1JCR0E7CisJCQlicmVhazsKKwkJY2FzZSBQSE9UT01FVFJJQ19MT0dMVVY6CisJCQlsb2FkTWV0aG9kID0gTG9hZEFzTG9nTHV2OworCQkJYnJlYWs7CisJCWNhc2UgUEhPVE9NRVRSSUNfU0VQQVJBVEVEOgorCQkJLy8gaWYgaW1hZ2UgaXMgUEhPVE9NRVRSSUNfU0VQQVJBVEVEIF9hbmRfIGNvbWVzIHdpdGggYW4gSUNDIHByb2ZpbGUsIAorCQkJLy8gdGhlbiB0aGUgaW1hZ2Ugc2hvdWxkIHByZXNlcnZlIGl0cyBvcmlnaW5hbCAoQ01ZSykgY29sb3VyIG1vZGVsIGFuZCAKKwkJCS8vIHNob3VsZCBiZSByZWFkIGFzIENNWUsgKHRvIGtlZXAgdGhlIG1hdGNoIG9mIHBpeGVsIGFuZCBwcm9maWxlIGFuZCAKKwkJCS8vIHRvIGF2b2lkIG11bHRpcGxlIGNvbnZlcnNpb25zLiBDb252ZXJzaW9uIGNhbiBiZSBkb25lIGJ5IGNoYW5naW5nIAorCQkJLy8gdGhlIHByb2ZpbGUgZnJvbSBpdCdzIG9yaWdpbmFsIENNWUsgdG8gYW4gUkdCIHByb2ZpbGUgd2l0aCBhbiAKKwkJCS8vIGFwcm9wcmlhdGUgY29sb3IgbWFuYWdlbWVudCBzeXN0ZW0uIFdvcmtzIHdpdGggbm9uLXRpbGVkIFRJRkZzLgorCQkJaWYoIWJJc1RpbGVkKSB7CisJCQkJbG9hZE1ldGhvZCA9IExvYWRBc0NNWUs7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBQSE9UT01FVFJJQ19NSU5JU1dISVRFOgorCQljYXNlIFBIT1RPTUVUUklDX01JTklTQkxBQ0s6CisJCWNhc2UgUEhPVE9NRVRSSUNfUEFMRVRURToKKwkJCS8vIFdoZW4gc2FtcGxlc3BlcnBpeGVsID0gMiBhbmQgYml0c3BlcnNhbXBsZSA9IDgsIHNldCB0aGUgaW1hZ2UgYXMgYQorCQkJLy8gOC1iaXQgaW5kZXhlZCBpbWFnZSArIDgtYml0IGFscGhhIGxheWVyIGltYWdlCisJCQkvLyBhbmQgY29udmVydCB0byBhIDgtYml0IGltYWdlIHdpdGggYSB0cmFuc3BhcmVuY3kgdGFibGUKKwkJCWlmKChzYW1wbGVzcGVycGl4ZWwgPiAxKSAmJiAoYml0c3BlcnNhbXBsZSA9PSA4KSkgeworCQkJCWxvYWRNZXRob2QgPSBMb2FkQXM4Qml0VHJuczsKKwkJCX0gZWxzZSB7CisJCQkJbG9hZE1ldGhvZCA9IExvYWRBc0dlbmVyaWNTdHJpcDsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJbG9hZE1ldGhvZCA9IExvYWRBc0dlbmVyaWNTdHJpcDsKKwkJCWJyZWFrOworCX0KKworCWlmKChsb2FkTWV0aG9kID09IExvYWRBc0dlbmVyaWNTdHJpcCkgJiYgYklzVGlsZWQpIHsKKwkJbG9hZE1ldGhvZCA9IExvYWRBc1RpbGVkOworCX0KKworCXJldHVybiBsb2FkTWV0aG9kOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBUSUZGIHRodW1ibmFpbCByb3V0aW5lcworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitzdGF0aWMgRklCSVRNQVAgKiBETExfQ0FMTENPTlYKK0xvYWQoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBpbnQgcGFnZSwgaW50IGZsYWdzLCB2b2lkICpkYXRhKTsKKworLyoqCitSZWFkIGVtYmVkZGVkIHRodW1ibmFpbAorKi8KK3N0YXRpYyB2b2lkIAorUmVhZFRodW1ibmFpbChGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIHZvaWQgKmRhdGEsIFRJRkYgKnRpZmYsIEZJQklUTUFQICpkaWIpIHsKKwlGSUJJVE1BUCogdGh1bWJuYWlsID0gTlVMTDsKKworCS8vIHJlYWQgZXhpZiB0aHVtYm5haWwgKElGRCAxKSAuLi4KKworCXVpbnQzMiBleGlmX29mZnNldCA9IDA7CisJaWYoVElGRkdldEZpZWxkKHRpZmYsIFRJRkZUQUdfRVhJRklGRCwgJmV4aWZfb2Zmc2V0KSkgeworCisJCWlmKFRJRkZMYXN0RGlyZWN0b3J5KHRpZmYpICE9IDApIHsKKwkJCS8vIHNhdmUgY3VycmVudCBwb3NpdGlvbgorCQkJbG9uZyB0ZWxsX3BvcyA9IGlvLT50ZWxsX3Byb2MoaGFuZGxlKTsKKwkJCXVpbnQxNiBjdXJfZGlyID0gVElGRkN1cnJlbnREaXJlY3RvcnkodGlmZik7CisKKwkJCS8vIGxvYWQgdGhlIHRodW1ibmFpbAorCQkJaW50IHBhZ2UgPSAxOyAKKwkJCWludCBmbGFncyA9IFRJRkZfREVGQVVMVDsKKwkJCXRodW1ibmFpbCA9IExvYWQoaW8sIGhhbmRsZSwgcGFnZSwgZmxhZ3MsIGRhdGEpOworCQkJLy8gc3RvcmUgdGhlIHRodW1ibmFpbCAocmVtZW1iZXIgdG8gcmVsZWFzZSBpdCBsYXRlciAuLi4pCisJCQlGcmVlSW1hZ2VfU2V0VGh1bWJuYWlsKGRpYiwgdGh1bWJuYWlsKTsKKworCQkJLy8gcmVzdG9yZSBjdXJyZW50IHBvc2l0aW9uCisJCQlpby0+c2Vla19wcm9jKGhhbmRsZSwgdGVsbF9wb3MsIFNFRUtfU0VUKTsKKwkJCVRJRkZTZXREaXJlY3RvcnkodGlmZiwgY3VyX2Rpcik7CisJCX0KKwl9CisKKwkvLyAuLi4gb3IgcmVhZCB0aGUgZmlyc3Qgc3ViSUZECisKKwlpZighdGh1bWJuYWlsKSB7CisJCXVpbnQxNiBzdWJJRkRfY291bnQgPSAwOworCQl1aW50NjQqIHN1YklGRF9vZmZzZXRzID0gTlVMTDsKKwkJLy8gIyMjIFRoZW9yZXRpY2FsbHkgdGhpcyBzaG91bGQgYWxzbyByZWFkIHRoZSBmaXJzdCBzdWJJRkQgZnJvbSBhIFBob3Rvc2hvcC1jcmVhdGVkIGZpbGUgd2l0aCAicHlyYW1pZCIuCisJCS8vIEl0IGRvZXMgbm90IGhvd2V2ZXIgLSB0aGUgdGFnIGlzIHRoZXJlICh1c2luZyBUYWcgVmlld2VyIGFwcCkgYnV0IGxpYnRpZmYgcmVmdXNlcyB0byByZWFkIGl0CisJCWlmKFRJRkZHZXRGaWVsZCh0aWZmLCBUSUZGVEFHX1NVQklGRCwgJnN1YklGRF9jb3VudCwgJnN1YklGRF9vZmZzZXRzKSkgeworCQkJaWYoc3ViSUZEX2NvdW50ID4gMCkgeworCQkJCS8vIHNhdmUgY3VycmVudCBwb3NpdGlvbgorCQkJCWxvbmcgdGVsbF9wb3MgPSBpby0+dGVsbF9wcm9jKGhhbmRsZSk7CisJCQkJdWludDE2IGN1cl9kaXIgPSBUSUZGQ3VycmVudERpcmVjdG9yeSh0aWZmKTsKKwkJCQlpZihUSUZGU2V0U3ViRGlyZWN0b3J5KHRpZmYsIHN1YklGRF9vZmZzZXRzWzBdKSkgeworCQkJCQkvLyBsb2FkIHRoZSB0aHVtYm5haWwKKwkJCQkJaW50IHBhZ2UgPSAtMTsgCisJCQkJCWludCBmbGFncyA9IFRJRkZfREVGQVVMVDsKKwkJCQkJdGh1bWJuYWlsID0gTG9hZChpbywgaGFuZGxlLCBwYWdlLCBmbGFncywgZGF0YSk7CisJCQkJCS8vIHN0b3JlIHRoZSB0aHVtYm5haWwgKHJlbWVtYmVyIHRvIHJlbGVhc2UgaXQgbGF0ZXIgLi4uKQorCQkJCQlGcmVlSW1hZ2VfU2V0VGh1bWJuYWlsKGRpYiwgdGh1bWJuYWlsKTsKKwkJCQl9CisJCQkJLy8gcmVzdG9yZSBjdXJyZW50IHBvc2l0aW9uCisJCQkJaW8tPnNlZWtfcHJvYyhoYW5kbGUsIHRlbGxfcG9zLCBTRUVLX1NFVCk7CisJCQkJVElGRlNldERpcmVjdG9yeSh0aWZmLCBjdXJfZGlyKTsKKwkJCX0KKwkJfQorCX0KKwkKKwkvLyAuLi4gb3IgcmVhZCBQaG90b3Nob3AgdGh1bWJuYWlsCisKKwlpZighdGh1bWJuYWlsKSB7CisJCXVpbnQzMiBwc19zaXplID0gMDsKKwkJdm9pZCAqcHNfZGF0YSA9IE5VTEw7CisKKwkJaWYoVElGRkdldEZpZWxkKHRpZmYsIFRJRkZUQUdfUEhPVE9TSE9QLCAmcHNfc2l6ZSwgJnBzX2RhdGEpKSB7CisJCQlGSU1FTU9SWSAqaGFuZGxlID0gRnJlZUltYWdlX09wZW5NZW1vcnkoKEJZVEUqKXBzX2RhdGEsIHBzX3NpemUpOworCisJCQlGcmVlSW1hZ2VJTyBpbzsKKwkJCVNldE1lbW9yeUlPKCZpbyk7CisJCQorCQkJcHNkUGFyc2VyIHBhcnNlcjsKKwkJCXBhcnNlci5SZWFkSW1hZ2VSZXNvdXJjZXMoJmlvLCBoYW5kbGUsIHBzX3NpemUpOworCisJCQlGcmVlSW1hZ2VfU2V0VGh1bWJuYWlsKGRpYiwgcGFyc2VyLkdldFRodW1ibmFpbCgpKTsKKwkJCQorCQkJRnJlZUltYWdlX0Nsb3NlTWVtb3J5KGhhbmRsZSk7CisJCX0KKwkJCisJfQorCisJLy8gcmVsZWFzZSB0aHVtYm5haWwKKwlGcmVlSW1hZ2VfVW5sb2FkKHRodW1ibmFpbCk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBGSUJJVE1BUCAqIERMTF9DQUxMQ09OVgorTG9hZChGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIGludCBwYWdlLCBpbnQgZmxhZ3MsIHZvaWQgKmRhdGEpIHsKKwlpZiAoIWhhbmRsZSB8fCAhZGF0YSApIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCQorCVRJRkYgICAqdGlmID0gTlVMTDsKKwl1aW50MzIgaGVpZ2h0ID0gMDsgCisJdWludDMyIHdpZHRoID0gMDsgCisJdWludDE2IGJpdHNwZXJzYW1wbGUgPSAxOworCXVpbnQxNiBzYW1wbGVzcGVycGl4ZWwgPSAxOworCXVpbnQzMiByb3dzcGVyc3RyaXAgPSAodWludDMyKS0xOyAgCisJdWludDE2IHBob3RvbWV0cmljID0gUEhPVE9NRVRSSUNfTUlOSVNXSElURTsKKwl1aW50MTYgY29tcHJlc3Npb24gPSAodWludDE2KS0xOworCXVpbnQxNiBwbGFuYXJfY29uZmlnOworCisJRklCSVRNQVAgKmRpYiA9IE5VTEw7CisJdWludDMyIGljY1NpemUgPSAwOwkJLy8gSUNDIHByb2ZpbGUgbGVuZ3RoCisJdm9pZCAqaWNjQnVmID0gTlVMTDsJLy8gSUNDIHByb2ZpbGUgZGF0YQkJCisKKwljb25zdCBCT09MIGhlYWRlcl9vbmx5ID0gKGZsYWdzICYgRklGX0xPQURfTk9QSVhFTFMpID09IEZJRl9MT0FEX05PUElYRUxTOworCQorCXRyeSB7CQorCQlmaV9USUZGSU8gKmZpbyA9IChmaV9USUZGSU8qKWRhdGE7CisJCXRpZiA9IGZpby0+dGlmOworCisJCWlmIChwYWdlICE9IC0xKSB7CisJCQlpZiAoIXRpZiB8fCAhVElGRlNldERpcmVjdG9yeSh0aWYsICh1aW50MTYpcGFnZSkpIHsKKwkJCQl0aHJvdyAiRXJyb3IgZW5jb3VudGVyZWQgd2hpbGUgb3BlbmluZyBUSUZGIGZpbGUiOwkJCQorCQkJfQorCQl9CisJCQorCQljb25zdCBCT09MIGFzQ01ZSyA9IChmbGFncyAmIFRJRkZfQ01ZSykgPT0gVElGRl9DTVlLOworCisJCS8vIGZpcnN0LCBnZXQgdGhlIHBob3RvbWV0cmljLCB0aGUgY29tcHJlc3Npb24gYW5kIGJhc2ljIG1ldGFkYXRhCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJCVRJRkZHZXRGaWVsZCh0aWYsIFRJRkZUQUdfUEhPVE9NRVRSSUMsICZwaG90b21ldHJpYyk7CisJCVRJRkZHZXRGaWVsZCh0aWYsIFRJRkZUQUdfQ09NUFJFU1NJT04sICZjb21wcmVzc2lvbik7CisKKwkJLy8gY2hlY2sgZm9yIEhEUiBmb3JtYXRzCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJCWlmKHBob3RvbWV0cmljID09IFBIT1RPTUVUUklDX0xPR0xVVikgeworCQkJLy8gY2hlY2sgdGhlIGNvbXByZXNzaW9uCisJCQlpZihjb21wcmVzc2lvbiAhPSBDT01QUkVTU0lPTl9TR0lMT0cgJiYgY29tcHJlc3Npb24gIT0gQ09NUFJFU1NJT05fU0dJTE9HMjQpIHsKKwkJCQl0aHJvdyAiT25seSBzdXBwb3J0IFNHSUxPRyBjb21wcmVzc2VkIExvZ0x1diBkYXRhIjsKKwkJCX0KKwkJCS8vIHNldCBkZWNvZGVyIHRvIG91dHB1dCBpbiBJRUVFIDMyLWJpdCBmbG9hdCBYWVogdmFsdWVzCisJCQlUSUZGU2V0RmllbGQodGlmLCBUSUZGVEFHX1NHSUxPR0RBVEFGTVQsIFNHSUxPR0RBVEFGTVRfRkxPQVQpOworCQl9CisKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwkJVElGRkdldEZpZWxkKHRpZiwgVElGRlRBR19JTUFHRVdJRFRILCAmd2lkdGgpOworCQlUSUZGR2V0RmllbGQodGlmLCBUSUZGVEFHX0lNQUdFTEVOR1RILCAmaGVpZ2h0KTsKKwkJVElGRkdldEZpZWxkKHRpZiwgVElGRlRBR19TQU1QTEVTUEVSUElYRUwsICZzYW1wbGVzcGVycGl4ZWwpOworCQlUSUZGR2V0RmllbGQodGlmLCBUSUZGVEFHX0JJVFNQRVJTQU1QTEUsICZiaXRzcGVyc2FtcGxlKTsKKwkJVElGRkdldEZpZWxkKHRpZiwgVElGRlRBR19ST1dTUEVSU1RSSVAsICZyb3dzcGVyc3RyaXApOyAgIAkJCQorCQlUSUZGR2V0RmllbGQodGlmLCBUSUZGVEFHX0lDQ1BST0ZJTEUsICZpY2NTaXplLCAmaWNjQnVmKTsKKwkJVElGRkdldEZpZWxkRGVmYXVsdGVkKHRpZiwgVElGRlRBR19QTEFOQVJDT05GSUcsICZwbGFuYXJfY29uZmlnKTsKKworCQkvLyBjaGVjayBmb3IgdW5zdXBwb3J0ZWQgZm9ybWF0cworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCQlpZihJc1ZhbGlkQml0c1BlclNhbXBsZShwaG90b21ldHJpYywgYml0c3BlcnNhbXBsZSkgPT0gRkFMU0UpIHsKKwkJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhzX2Zvcm1hdF9pZCwgCisJCQkJIlVuYWJsZSB0byBoYW5kbGUgdGhpcyBmb3JtYXQ6IGJpdHNwZXJzYW1wbGUgPSAlZCwgc2FtcGxlc3BlcnBpeGVsID0gJWQsIHBob3RvbWV0cmljID0gJWQiLCAKKwkJCQkoaW50KWJpdHNwZXJzYW1wbGUsIChpbnQpc2FtcGxlc3BlcnBpeGVsLCAoaW50KXBob3RvbWV0cmljKTsKKwkJCXRocm93IChjaGFyKilOVUxMOworCQl9CisKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwkJLy8gZ2V0IGltYWdlIGRhdGEgdHlwZQorCisJCUZSRUVfSU1BR0VfVFlQRSBpbWFnZV90eXBlID0gUmVhZEltYWdlVHlwZSh0aWYsIGJpdHNwZXJzYW1wbGUsIHNhbXBsZXNwZXJwaXhlbCk7CisKKwkJLy8gZ2V0IHRoZSBtb3N0IGFwcHJvcHJpYXRlIGxvYWRpbmcgbWV0aG9kCisKKwkJVElGRkxvYWRNZXRob2QgbG9hZE1ldGhvZCA9IEZpbmRMb2FkTWV0aG9kKHRpZiwgaW1hZ2VfdHlwZSwgZmxhZ3MpOworCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJCWlmKGxvYWRNZXRob2QgPT0gTG9hZEFzUkJHQSkgeworCQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkvLyBSR0JbQV0gbG9hZGluZyB1c2luZyB0aGUgVElGRlJlYWRSR0JBSW1hZ2UoKSBBUEkKKwkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJCQlCT09MIGhhc19hbHBoYSA9IEZBTFNFOyAgIAorCisJCQkvLyBSZWFkIHRoZSB3aG9sZSBpbWFnZSBpbnRvIG9uZSBiaWcgUkdCQSBidWZmZXIgYW5kIHRoZW4gCisJCQkvLyBjb252ZXJ0IGl0IHRvIGEgRElCLiBUaGlzIGlzIHVzaW5nIHRoZSB0cmFkaXRpb25hbAorCQkJLy8gVElGRlJlYWRSR0JBSW1hZ2UoKSBBUEkgdGhhdCB3ZSB0cnVzdC4KKwkJCQorCQkJdWludDMyICpyYXN0ZXIgPSBOVUxMOworCisJCQlpZighaGVhZGVyX29ubHkpIHsKKworCQkJCXJhc3RlciA9ICh1aW50MzIqKV9USUZGbWFsbG9jKHdpZHRoICogaGVpZ2h0ICogc2l6ZW9mKHVpbnQzMikpOworCQkJCWlmIChyYXN0ZXIgPT0gTlVMTCkgeworCQkJCQl0aHJvdyBGSV9NU0dfRVJST1JfTUVNT1JZOworCQkJCX0KKworCQkJCS8vIHJlYWQgdGhlIGltYWdlIGluIG9uZSBjaHVuayBpbnRvIGFuIFJHQkEgYXJyYXkKKworCQkJCWlmICghVElGRlJlYWRSR0JBSW1hZ2UodGlmLCB3aWR0aCwgaGVpZ2h0LCByYXN0ZXIsIDEpKSB7CisJCQkJCV9USUZGZnJlZShyYXN0ZXIpOworCQkJCQl0aHJvdyBGSV9NU0dfRVJST1JfVU5TVVBQT1JURURfRk9STUFUOworCQkJCX0KKwkJCX0KKwkJCS8vIFRJRkZSZWFkUkdCQUltYWdlIGFsd2F5cyBkZWxpdmVyZXMgMyBvciA0IHNhbXBsZXMgcGVyIHBpeGVsIGltYWdlcworCQkJLy8gKFJHQiBvciBSR0JBLCBzZWUgYmVsb3cpLiBDdXQtb2ZmIHBvc3NpYmx5IHByZXNlbnQgY2hhbm5lbHMgKGFkZGl0aW9uYWwgCisJCQkvLyBhbHBoYSBjaGFubmVscykgZnJvbSBlLmcuIFBob3Rvc2hvcC4gQW55IENNWUsoQS4uKSBpcyBub3cgdHJlYXRlZCBhcyBSR0IsCisJCQkvLyBhbnkgYWRkaXRpb25hbCBhbHBoYSBjaGFubmVsIG9uIFJHQihBQS4uKSBpcyBsb3N0IG9uIGNvbnZlcnNpb24gdG8gUkdCKEEpCisKKwkJCWlmKHNhbXBsZXNwZXJwaXhlbCA+IDQpIHsgLy8gVE9ETyBXcml0ZSB0byBFeHRyYSBDaGFubmVscworCQkJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhzX2Zvcm1hdF9pZCwgIldhcm5pbmc6ICVkIGFkZGl0aW9uYWwgYWxwaGEgY2hhbm5lbChzKSBpZ25vcmVkIiwgc2FtcGxlc3BlcnBpeGVsLTQpOworCQkJCXNhbXBsZXNwZXJwaXhlbCA9IDQ7CisJCQl9CisKKwkJCS8vIGNyZWF0ZSBhIG5ldyBESUIgKHRha2UgY2FyZSBvZiBkaWZmZXJlbnQgc2FtcGxlcy1wZXItcGl4ZWwgaW4gY2FzZSAKKwkJCS8vIG9mIGNvbnZlcnRlZCBDTVlLIGltYWdlIChSR0IgY29udmVyc2lvbiBpcyBvbiBzYW1wbGUgcGVyIHBpeGVsIGxlc3MpCisKKwkJCWlmIChwaG90b21ldHJpYyA9PSBQSE9UT01FVFJJQ19TRVBBUkFURUQgJiYgc2FtcGxlc3BlcnBpeGVsID09IDQpIHsKKwkJCQlzYW1wbGVzcGVycGl4ZWwgPSAzOworCQkJfQorCisJCQlkaWIgPSBDcmVhdGVJbWFnZVR5cGUoaGVhZGVyX29ubHksIGltYWdlX3R5cGUsIHdpZHRoLCBoZWlnaHQsIGJpdHNwZXJzYW1wbGUsIHNhbXBsZXNwZXJwaXhlbCk7CisJCQlpZiAoZGliID09IE5VTEwpIHsKKwkJCQkvLyBmcmVlIHRoZSByYXN0ZXIgcG9pbnRlciBhbmQgb3V0cHV0IGFuIGVycm9yIGlmIGFsbG9jYXRpb24gZmFpbGVkCisJCQkJaWYocmFzdGVyKSB7CisJCQkJCV9USUZGZnJlZShyYXN0ZXIpOworCQkJCX0KKwkJCQl0aHJvdyBGSV9NU0dfRVJST1JfRElCX01FTU9SWTsKKwkJCX0KKwkJCQorCQkJLy8gZmlsbCBpbiB0aGUgcmVzb2x1dGlvbiAoZW5nbGlzaCBvciB1bml2ZXJzYWwpCisKKwkJCVJlYWRSZXNvbHV0aW9uKHRpZiwgZGliKTsKKworCQkJaWYoIWhlYWRlcl9vbmx5KSB7CisKKwkJCQkvLyByZWFkIHRoZSByYXN0ZXIgbGluZXMgYW5kIHNhdmUgdGhlbSBpbiB0aGUgRElCCisJCQkJLy8gd2l0aCBSR0IgbW9kZSwgd2UgaGF2ZSB0byBjaGFuZ2UgdGhlIG9yZGVyIG9mIHRoZSAzIHNhbXBsZXMgUkdCCisJCQkJLy8gV2UgdXNlIG1hY3JvcyBmb3IgZXh0cmFjdGluZyBjb21wb25lbnRzIGZyb20gdGhlIHBhY2tlZCBBQkdSIAorCQkJCS8vIGZvcm0gcmV0dXJuZWQgYnkgVElGRlJlYWRSR0JBSW1hZ2UuCisKKwkJCQl1aW50MzIgKnJvdyA9ICZyYXN0ZXJbMF07CisKKwkJCQlpZiAoc2FtcGxlc3BlcnBpeGVsID09IDQpIHsKKwkJCQkJLy8gMzItYml0IFJHQkEKKwkJCQkJZm9yICh1aW50MzIgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworCQkJCQkJQllURSAqYml0cyA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIHkpOworCQkJCQkJZm9yICh1aW50MzIgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisJCQkJCQkJYml0c1tGSV9SR0JBX0JMVUVdCT0gKEJZVEUpVElGRkdldEIocm93W3hdKTsKKwkJCQkJCQliaXRzW0ZJX1JHQkFfR1JFRU5dID0gKEJZVEUpVElGRkdldEcocm93W3hdKTsKKwkJCQkJCQliaXRzW0ZJX1JHQkFfUkVEXQk9IChCWVRFKVRJRkZHZXRSKHJvd1t4XSk7CisJCQkJCQkJYml0c1tGSV9SR0JBX0FMUEhBXSA9IChCWVRFKVRJRkZHZXRBKHJvd1t4XSk7CisKKwkJCQkJCQlpZiAoYml0c1tGSV9SR0JBX0FMUEhBXSAhPSAwKSB7CisJCQkJCQkJCWhhc19hbHBoYSA9IFRSVUU7CisJCQkJCQkJfQorCisJCQkJCQkJYml0cyArPSA0OworCQkJCQkJfQorCQkJCQkJcm93ICs9IHdpZHRoOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJLy8gMjQtYml0IFJHQgorCQkJCQlmb3IgKHVpbnQzMiB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisJCQkJCQlCWVRFICpiaXRzID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgeSk7CisJCQkJCQlmb3IgKHVpbnQzMiB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQkJCQliaXRzW0ZJX1JHQkFfQkxVRV0JPSAoQllURSlUSUZGR2V0Qihyb3dbeF0pOworCQkJCQkJCWJpdHNbRklfUkdCQV9HUkVFTl0gPSAoQllURSlUSUZGR2V0Ryhyb3dbeF0pOworCQkJCQkJCWJpdHNbRklfUkdCQV9SRURdCT0gKEJZVEUpVElGRkdldFIocm93W3hdKTsKKworCQkJCQkJCWJpdHMgKz0gMzsKKwkJCQkJCX0KKwkJCQkJCXJvdyArPSB3aWR0aDsKKwkJCQkJfQorCQkJCX0KKworCQkJCV9USUZGZnJlZShyYXN0ZXIpOworCQkJfQorCQkJCisJCQkvLyAjIyMgTm90IGNvcnJlY3Qgd2hlbiBoZWFkZXIgb25seQorCQkJRnJlZUltYWdlX1NldFRyYW5zcGFyZW50KGRpYiwgaGFzX2FscGhhKTsKKworCQl9IGVsc2UgaWYobG9hZE1ldGhvZCA9PSBMb2FkQXM4Qml0VHJucykgeworCQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkvLyA4LWJpdCArIDgtYml0IGFscGhhIGxheWVyIGxvYWRpbmcKKwkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJCQkvLyBjcmVhdGUgYSBuZXcgOC1iaXQgRElCCisJCQlkaWIgPSBDcmVhdGVJbWFnZVR5cGUoaGVhZGVyX29ubHksIGltYWdlX3R5cGUsIHdpZHRoLCBoZWlnaHQsIGJpdHNwZXJzYW1wbGUsIE1JTjx1aW50MTY+KDIsIHNhbXBsZXNwZXJwaXhlbCkpOworCQkJaWYgKGRpYiA9PSBOVUxMKSB7CisJCQkJdGhyb3cgRklfTVNHX0VSUk9SX01FTU9SWTsKKwkJCX0KKworCQkJLy8gZmlsbCBpbiB0aGUgcmVzb2x1dGlvbiAoZW5nbGlzaCBvciB1bml2ZXJzYWwpCisKKwkJCVJlYWRSZXNvbHV0aW9uKHRpZiwgZGliKTsKKworCQkJLy8gc2V0IHVwIHRoZSBjb2xvcm1hcCBiYXNlZCBvbiBwaG90b21ldHJpYwkKKworCQkJUmVhZFBhbGV0dGUodGlmLCBwaG90b21ldHJpYywgYml0c3BlcnNhbXBsZSwgZGliKTsKKworCQkJLy8gY2FsY3VsYXRlIHRoZSBsaW5lICsgcGl0Y2ggKHNlcGFyYXRlIGZvciBzY3IgJiBkZXN0KQorCisJCQljb25zdCB0bXNpemVfdCBzcmNfbGluZSA9IFRJRkZTY2FubGluZVNpemUodGlmKTsKKwkJCS8vIGhlcmUsIHRoZSBwaXRjaCBpcyAyeCBsZXNzIHRoYW4gdGhlIG9yaWdpbmFsIGFzIHdlIG9ubHkga2VlcCB0aGUgZmlyc3QgbGF5ZXIJCQkJCisJCQlpbnQgZHN0X3BpdGNoID0gRnJlZUltYWdlX0dldFBpdGNoKGRpYik7CisKKwkJCS8vIHRyYW5zcGFyZW5jeSB0YWJsZSBmb3IgOC1iaXQgKyA4LWJpdCBhbHBoYSBpbWFnZXMKKworCQkJQllURSB0cm5zWzI1Nl07IAorCQkJLy8gY2xlYXIgdGhlIHRyYW5zcGFyZW5jeSB0YWJsZQorCQkJbWVtc2V0KHRybnMsIDB4RkYsIDI1NiAqIHNpemVvZihCWVRFKSk7CisKKwkJCS8vIEluIHRoZSB0aWZmIGZpbGUgdGhlIGxpbmVzIGFyZSBzYXZlZCBmcm9tIHVwIHRvIGRvd24gCisJCQkvLyBJbiBhIERJQiB0aGUgbGluZXMgbXVzdCBiZSBzYXZlZCBmcm9tIGRvd24gdG8gdXAKKworCQkJQllURSAqYml0cyA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIGhlaWdodCAtIDEpOworCisJCQkvLyByZWFkIHRoZSB0aWZmIGxpbmVzIGFuZCBzYXZlIHRoZW0gaW4gdGhlIERJQgorCisJCQlpZihwbGFuYXJfY29uZmlnID09IFBMQU5BUkNPTkZJR19DT05USUcgJiYgIWhlYWRlcl9vbmx5KSB7CisKKwkJCQlCWVRFICpidWYgPSAoQllURSopbWFsbG9jKFRJRkZTdHJpcFNpemUodGlmKSAqIHNpemVvZihCWVRFKSk7CisJCQkJaWYoYnVmID09IE5VTEwpIHsKKwkJCQkJdGhyb3cgRklfTVNHX0VSUk9SX01FTU9SWTsKKwkJCQl9CisKKwkJCQlmb3IgKHVpbnQzMiB5ID0gMDsgeSA8IGhlaWdodDsgeSArPSByb3dzcGVyc3RyaXApIHsKKwkJCQkJaW50MzIgbnJvdyA9ICh5ICsgcm93c3BlcnN0cmlwID4gaGVpZ2h0ID8gaGVpZ2h0IC0geSA6IHJvd3NwZXJzdHJpcCk7CisKKwkJCQkJaWYgKFRJRkZSZWFkRW5jb2RlZFN0cmlwKHRpZiwgVElGRkNvbXB1dGVTdHJpcCh0aWYsIHksIDApLCBidWYsIG5yb3cgKiBzcmNfbGluZSkgPT0gLTEpIHsKKwkJCQkJCWZyZWUoYnVmKTsKKwkJCQkJCXRocm93IEZJX01TR19FUlJPUl9QQVJTSU5HOworCQkJCQl9CisJCQkJCWZvciAoaW50IGwgPSAwOyBsIDwgbnJvdzsgbCsrKSB7CisJCQkJCQlCWVRFICpwID0gYml0czsKKwkJCQkJCUJZVEUgKmIgPSBidWYgKyBsICogc3JjX2xpbmU7CisKKwkJCQkJCWZvcih1aW50MzIgeCA9IDA7IHggPCAodWludDMyKShzcmNfbGluZSAvIHNhbXBsZXNwZXJwaXhlbCk7IHgrKykgeworCQkJCQkJCS8vIGNvcHkgdGhlIDgtYml0IGxheWVyCisJCQkJCQkJKnAgPSBiWzBdOworCQkJCQkJCS8vIGNvbnZlcnQgdGhlIDgtYml0IGFscGhhIGxheWVyIHRvIGEgdHJucyB0YWJsZQorCQkJCQkJCXRybnNbIGJbMF0gXSA9IGJbMV07CisKKwkJCQkJCQlwKys7CisJCQkJCQkJYiArPSBzYW1wbGVzcGVycGl4ZWw7CisJCQkJCQl9CisJCQkJCQliaXRzIC09IGRzdF9waXRjaDsKKwkJCQkJfQorCQkJCX0KKworCQkJCWZyZWUoYnVmKTsKKwkJCX0KKwkJCWVsc2UgaWYocGxhbmFyX2NvbmZpZyA9PSBQTEFOQVJDT05GSUdfU0VQQVJBVEUgJiYgIWhlYWRlcl9vbmx5KSB7CisJCQkJdG1zaXplX3Qgc3RyaXBzaXplID0gVElGRlN0cmlwU2l6ZSh0aWYpICogc2l6ZW9mKEJZVEUpOworCQkJCUJZVEUgKmJ1ZiA9IChCWVRFKiltYWxsb2MoMiAqIHN0cmlwc2l6ZSk7CisJCQkJaWYoYnVmID09IE5VTEwpIHsKKwkJCQkJdGhyb3cgRklfTVNHX0VSUk9SX01FTU9SWTsKKwkJCQl9CisJCQkJQllURSAqZ3JleSA9IGJ1ZjsKKwkJCQlCWVRFICphbHBoYSA9IGJ1ZiArIHN0cmlwc2l6ZTsKKworCQkJCWZvciAodWludDMyIHkgPSAwOyB5IDwgaGVpZ2h0OyB5ICs9IHJvd3NwZXJzdHJpcCkgeworCQkJCQlpbnQzMiBucm93ID0gKHkgKyByb3dzcGVyc3RyaXAgPiBoZWlnaHQgPyBoZWlnaHQgLSB5IDogcm93c3BlcnN0cmlwKTsKKworCQkJCQlpZiAoVElGRlJlYWRFbmNvZGVkU3RyaXAodGlmLCBUSUZGQ29tcHV0ZVN0cmlwKHRpZiwgeSwgMCksIGdyZXksIG5yb3cgKiBzcmNfbGluZSkgPT0gLTEpIHsKKwkJCQkJCWZyZWUoYnVmKTsKKwkJCQkJCXRocm93IEZJX01TR19FUlJPUl9QQVJTSU5HOworCQkJCQl9IAorCQkJCQlpZiAoVElGRlJlYWRFbmNvZGVkU3RyaXAodGlmLCBUSUZGQ29tcHV0ZVN0cmlwKHRpZiwgeSwgMSksIGFscGhhLCBucm93ICogc3JjX2xpbmUpID09IC0xKSB7CisJCQkJCQlmcmVlKGJ1Zik7CisJCQkJCQl0aHJvdyBGSV9NU0dfRVJST1JfUEFSU0lORzsKKwkJCQkJfSAKKworCQkJCQlmb3IgKGludCBsID0gMDsgbCA8IG5yb3c7IGwrKykgeworCQkJCQkJQllURSAqcCA9IGJpdHM7CisJCQkJCQlCWVRFICpnID0gZ3JleSArIGwgKiBzcmNfbGluZTsKKwkJCQkJCUJZVEUgKmEgPSBhbHBoYSArIGwgKiBzcmNfbGluZTsKKworCQkJCQkJZm9yKHVpbnQzMiB4ID0gMDsgeCA8ICh1aW50MzIpKHNyY19saW5lKTsgeCsrKSB7CisJCQkJCQkJLy8gY29weSB0aGUgOC1iaXQgbGF5ZXIKKwkJCQkJCQkqcCA9IGdbMF07CisJCQkJCQkJLy8gY29udmVydCB0aGUgOC1iaXQgYWxwaGEgbGF5ZXIgdG8gYSB0cm5zIHRhYmxlCisJCQkJCQkJdHJuc1sgZ1swXSBdID0gYVswXTsKKworCQkJCQkJCXArKzsKKwkJCQkJCQlnKys7CisJCQkJCQkJYSsrOworCQkJCQkJfQorCQkJCQkJYml0cyAtPSBkc3RfcGl0Y2g7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlmcmVlKGJ1Zik7CisKKwkJCX0KKwkJCQorCQkJRnJlZUltYWdlX1NldFRyYW5zcGFyZW5jeVRhYmxlKGRpYiwgJnRybnNbMF0sIDI1Nik7CisJCQlGcmVlSW1hZ2VfU2V0VHJhbnNwYXJlbnQoZGliLCBUUlVFKTsKKworCQl9IGVsc2UgaWYobG9hZE1ldGhvZCA9PSBMb2FkQXNDTVlLKSB7CisJCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCS8vIENNWUsgbG9hZGluZworCQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwkJCS8vIEF0IHRoaXMgcGxhY2UsIHNhbXBsZXNwZXJwaXhlbCBjb3VsZCBiZSA+IDQsIGVzcC4gd2hlbiBhIENNWUsoQSkgZm9ybWF0CisJCQkvLyBpcyByZWNvZ25pemVkLiBXaGVyZSBhbGwgb3RoZXIgZm9ybWF0cyBhcmUgaGFuZGxlZCBzdHJhaWdodC1mb3J3YXJkLCB0aGlzCisJCQkvLyBmb3JtYXQgaGFzIHRvIGJlIGhhbmRsZWQgc3BlY2lhbCAKKworCQkJQk9PTCBpc0NNWUtBID0gKHBob3RvbWV0cmljID09IFBIT1RPTUVUUklDX1NFUEFSQVRFRCkgJiYgKHNhbXBsZXNwZXJwaXhlbCA+IDQpOworCisJCQkvLyBXZSB1c2UgYSB0ZW1wIGRpYiB0byBzdG9yZSB0aGUgYWxwaGEgZm9yIHRoZSBDTVlLQSB0byBSR0JBIGNvbnZlcnNpb24KKwkJCS8vIE5PVEUgdGhpcyBpcyB1bnRpbCB3ZSBoYXZlIEV4dHJhIGNoYW5uZWxzIGltcGxlbWVudGF0aW9uLgorCQkJLy8gQWxzbyB0aGVuIGl0IHdpbGwgYmUgcG9zc2libGUgdG8gbWVyZ2UgTG9hZEFzQ01ZSyB3aXRoIExvYWRBc0dlbmVyaWNTdHJpcAorCQkJCisJCQlGSUJJVE1BUCAqYWxwaGEgPSBOVUxMOworCQkJdW5zaWduZWQgYWxwaGFfcGl0Y2ggPSAwOworCQkJQllURSAqYWxwaGFfYml0cyA9IE5VTEw7CisJCQl1bnNpZ25lZCBhbHBoYV9CcHAgPSAwOworCisJCQlpZihpc0NNWUtBICYmICFhc0NNWUsgJiYgIWhlYWRlcl9vbmx5KSB7CisJCQkJaWYoYml0c3BlcnNhbXBsZSA9PSAxNikgeworCQkJCQlhbHBoYSA9IEZyZWVJbWFnZV9BbGxvY2F0ZVQoRklUX1VJTlQxNiwgd2lkdGgsIGhlaWdodCk7CisJCQkJfSBlbHNlIGlmIChiaXRzcGVyc2FtcGxlID09IDgpIHsKKwkJCQkJYWxwaGEgPSBGcmVlSW1hZ2VfQWxsb2NhdGUod2lkdGgsIGhlaWdodCwgOCk7CisJCQkJfQorCQkJCQkKKwkJCQlpZighYWxwaGEpIHsKKwkJCQkJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKHNfZm9ybWF0X2lkLCAiRmFpbGVkIHRvIGFsbG9jYXRlIHRlbXBvcmFyeSBhbHBoYSBjaGFubmVsIik7CisJCQkJfSBlbHNlIHsKKwkJCQkJYWxwaGFfYml0cyA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShhbHBoYSwgaGVpZ2h0IC0gMSk7CisJCQkJCWFscGhhX3BpdGNoID0gRnJlZUltYWdlX0dldFBpdGNoKGFscGhhKTsKKwkJCQkJYWxwaGFfQnBwID0gRnJlZUltYWdlX0dldEJQUChhbHBoYSkgLyA4OworCQkJCX0KKwkJCQkKKwkJCX0KKwkJCQorCQkJLy8gY3JlYXRlIGEgbmV3IERJQgorCQkJY29uc3QgdWludDE2IGNoQ291bnQgPSBNSU48dWludDE2PihzYW1wbGVzcGVycGl4ZWwsIDQpOworCQkJZGliID0gQ3JlYXRlSW1hZ2VUeXBlKGhlYWRlcl9vbmx5LCBpbWFnZV90eXBlLCB3aWR0aCwgaGVpZ2h0LCBiaXRzcGVyc2FtcGxlLCBjaENvdW50KTsKKwkJCWlmIChkaWIgPT0gTlVMTCkgeworCQkJCUZyZWVJbWFnZV9VbmxvYWQoYWxwaGEpOworCQkJCXRocm93IEZJX01TR19FUlJPUl9NRU1PUlk7CisJCQl9CisKKwkJCS8vIGZpbGwgaW4gdGhlIHJlc29sdXRpb24gKGVuZ2xpc2ggb3IgdW5pdmVyc2FsKQorCisJCQlSZWFkUmVzb2x1dGlvbih0aWYsIGRpYik7CisKKwkJCWlmKCFoZWFkZXJfb25seSkgeworCisJCQkJLy8gY2FsY3VsYXRlIHRoZSBsaW5lICsgcGl0Y2ggKHNlcGFyYXRlIGZvciBzY3IgJiBkZXN0KQorCisJCQkJY29uc3QgdG1zaXplX3Qgc3JjX2xpbmUgPSBUSUZGU2NhbmxpbmVTaXplKHRpZik7CisJCQkJY29uc3QgdG1zaXplX3QgZHN0X2xpbmUgPSBGcmVlSW1hZ2VfR2V0TGluZShkaWIpOworCQkJCWNvbnN0IHVuc2lnbmVkIGRpYl9waXRjaCA9IEZyZWVJbWFnZV9HZXRQaXRjaChkaWIpOworCQkJCWNvbnN0IHVuc2lnbmVkIGRpYkJwcCA9IEZyZWVJbWFnZV9HZXRCUFAoZGliKSAvIDg7CisJCQkJY29uc3QgdW5zaWduZWQgQnBjID0gZGliQnBwIC8gY2hDb3VudDsKKwkJCQljb25zdCB1bnNpZ25lZCBzcmNCcHAgPSBiaXRzcGVyc2FtcGxlICogc2FtcGxlc3BlcnBpeGVsIC8gODsKKworCQkJCWFzc2VydChCcGMgPD0gMik7IC8vPCBDTVlLIGlzIG9ubHkgQllURSBvciBTSE9SVCAKKwkJCQkKKwkJCQkvLyBJbiB0aGUgdGlmZiBmaWxlIHRoZSBsaW5lcyBhcmUgc2F2ZSBmcm9tIHVwIHRvIGRvd24gCisJCQkJLy8gSW4gYSBESUIgdGhlIGxpbmVzIG11c3QgYmUgc2F2ZWQgZnJvbSBkb3duIHRvIHVwCisKKwkJCQlCWVRFICpiaXRzID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgaGVpZ2h0IC0gMSk7CisKKwkJCQkvLyByZWFkIHRoZSB0aWZmIGxpbmVzIGFuZCBzYXZlIHRoZW0gaW4gdGhlIERJQgorCisJCQkJQllURSAqYnVmID0gKEJZVEUqKW1hbGxvYyhUSUZGU3RyaXBTaXplKHRpZikgKiBzaXplb2YoQllURSkpOworCQkJCWlmKGJ1ZiA9PSBOVUxMKSB7CisJCQkJCUZyZWVJbWFnZV9VbmxvYWQoYWxwaGEpOworCQkJCQl0aHJvdyBGSV9NU0dfRVJST1JfTUVNT1JZOworCQkJCX0KKworCQkJCWlmKHBsYW5hcl9jb25maWcgPT0gUExBTkFSQ09ORklHX0NPTlRJRykgeworCQkJCQkKKwkJCQkJLy8gLSBsb29wIGZvciBzdHJpcCBibG9ja3MgLQorCQkJCQkKKwkJCQkJZm9yICh1aW50MzIgeSA9IDA7IHkgPCBoZWlnaHQ7IHkgKz0gcm93c3BlcnN0cmlwKSB7CisJCQkJCQljb25zdCBpbnQzMiBzdHJpcHMgPSAoeSArIHJvd3NwZXJzdHJpcCA+IGhlaWdodCA/IGhlaWdodCAtIHkgOiByb3dzcGVyc3RyaXApOworCisJCQkJCQlpZiAoVElGRlJlYWRFbmNvZGVkU3RyaXAodGlmLCBUSUZGQ29tcHV0ZVN0cmlwKHRpZiwgeSwgMCksIGJ1Ziwgc3RyaXBzICogc3JjX2xpbmUpID09IC0xKSB7CisJCQkJCQkJZnJlZShidWYpOworCQkJCQkJCUZyZWVJbWFnZV9VbmxvYWQoYWxwaGEpOworCQkJCQkJCXRocm93IEZJX01TR19FUlJPUl9QQVJTSU5HOworCQkJCQkJfSAKKwkJCQkJCQorCQkJCQkJLy8gLSBsb29wIGZvciBzdHJpcHMgLQorCQkJCQkJCisJCQkJCQlpZihzcmNfbGluZSAhPSBkc3RfbGluZSkgeworCQkJCQkJCS8vIENNWUtBKworCQkJCQkJCWlmKGFscGhhKSB7CisJCQkJCQkJCWZvciAoaW50IGwgPSAwOyBsIDwgc3RyaXBzOyBsKyspIHsJCQkJCQorCQkJCQkJCQkJZm9yKEJZVEUgKnBpeGVsID0gYml0cywgKmFsX3BpeGVsID0gYWxwaGFfYml0cywgKnNyY19waXhlbCA9ICBidWYgKyBsICogc3JjX2xpbmU7IHBpeGVsIDwgYml0cyArIGRpYl9waXRjaDsgcGl4ZWwgKz0gZGliQnBwLCBhbF9waXhlbCArPSBhbHBoYV9CcHAsIHNyY19waXhlbCArPSBzcmNCcHApIHsKKwkJCQkJCQkJCQkvLyBjb3B5IHBpeGVsIGJ5dGUgYnkgYnl0ZQorCQkJCQkJCQkJCUJZVEUgYiA9IDA7CisJCQkJCQkJCQkJZm9yKCA7IGIgPCBkaWJCcHA7ICsrYikgeworCQkJCQkJCQkJCQlwaXhlbFtiXSA9ICBzcmNfcGl4ZWxbYl07CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJCS8vIFRPRE8gd3JpdGUgdGhlIHJlbWFpbmluZyBieXRlcyB0byBleHRyYSBjaGFubmVsKHMpCisJCQkJCQkJCQkJCisJCQkJCQkJCQkJLy8gSEFDSyB3cml0ZSB0aGUgZmlyc3QgYWxwaGEgdG8gYSBzZXBhcmF0ZSBkaWIgKGFzc3VtZSBCWVRFIG9yIFdPUkQpCisJCQkJCQkJCQkJYWxfcGl4ZWxbMF0gPSBzcmNfcGl4ZWxbYl07CisJCQkJCQkJCQkJaWYoQnBjID4gMSkgeworCQkJCQkJCQkJCQlhbF9waXhlbFsxXSA9IHNyY19waXhlbFtiICsgMV07CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJCQorCQkJCQkJCQkJfQorCQkJCQkJCQkJYml0cyAtPSBkaWJfcGl0Y2g7CisJCQkJCQkJCQlhbHBoYV9iaXRzIC09IGFscGhhX3BpdGNoOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJCWVsc2UgeworCQkJCQkJCQkvLyBhbHBoYS9leHRyYSBjaGFubmVscyBhbGxvYyBmYWlsZWQKKwkJCQkJCQkJZm9yIChpbnQgbCA9IDA7IGwgPCBzdHJpcHM7IGwrKykgeworCQkJCQkJCQkJZm9yKEJZVEUqIHBpeGVsID0gYml0cywgKiBzcmNfcGl4ZWwgPSAgYnVmICsgbCAqIHNyY19saW5lOyBwaXhlbCA8IGJpdHMgKyBkc3RfbGluZTsgcGl4ZWwgKz0gZGliQnBwLCBzcmNfcGl4ZWwgKz0gc3JjQnBwKSB7CisJCQkJCQkJCQkJQXNzaWduUGl4ZWwocGl4ZWwsIHNyY19waXhlbCwgZGliQnBwKTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJCWJpdHMgLT0gZGliX3BpdGNoOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJZWxzZSB7IAorCQkJCQkJCS8vIENNWUsgdG8gQ01ZSworCQkJCQkJCWZvciAoaW50IGwgPSAwOyBsIDwgc3RyaXBzOyBsKyspIHsKKwkJCQkJCQkJQllURSAqYiA9IGJ1ZiArIGwgKiBzcmNfbGluZTsKKwkJCQkJCQkJbWVtY3B5KGJpdHMsIGIsIHNyY19saW5lKTsKKwkJCQkJCQkJYml0cyAtPSBkaWJfcGl0Y2g7CisJCQkJCQkJfQorCQkJCQkJfQorCisJCQkJCX0gLy8gaGVpZ2h0CisJCQkJCisJCQkJfQorCQkJCWVsc2UgaWYocGxhbmFyX2NvbmZpZyA9PSBQTEFOQVJDT05GSUdfU0VQQVJBVEUpIHsKKworCQkJCQlCWVRFICpkaWJfc3RyaXAgPSBiaXRzOworCQkJCQlCWVRFICphbF9zdHJpcCA9IGFscGhhX2JpdHM7CisKKwkJCQkJLy8gLSBsb29wIGZvciBzdHJpcCBibG9ja3MgLQorCQkJCQkKKwkJCQkJZm9yICh1aW50MzIgeSA9IDA7IHkgPCBoZWlnaHQ7IHkgKz0gcm93c3BlcnN0cmlwKSB7CisJCQkJCQljb25zdCBpbnQzMiBzdHJpcHMgPSAoeSArIHJvd3NwZXJzdHJpcCA+IGhlaWdodCA/IGhlaWdodCAtIHkgOiByb3dzcGVyc3RyaXApOworCQkJCQkJCisJCQkJCQkvLyAtIGxvb3AgZm9yIGNoYW5uZWxzIChwbGFuZXMpIC0KKwkJCQkJCQorCQkJCQkJZm9yKHVpbnQxNiBzYW1wbGUgPSAwOyBzYW1wbGUgPCBzYW1wbGVzcGVycGl4ZWw7IHNhbXBsZSsrKSB7CisJCQkJCQkJCisJCQkJCQkJaWYgKFRJRkZSZWFkRW5jb2RlZFN0cmlwKHRpZiwgVElGRkNvbXB1dGVTdHJpcCh0aWYsIHksIHNhbXBsZSksIGJ1Ziwgc3RyaXBzICogc3JjX2xpbmUpID09IC0xKSB7CisJCQkJCQkJCWZyZWUoYnVmKTsKKwkJCQkJCQkJRnJlZUltYWdlX1VubG9hZChhbHBoYSk7CisJCQkJCQkJCXRocm93IEZJX01TR19FUlJPUl9QQVJTSU5HOworCQkJCQkJCX0gCisJCQkJCQkJCQkKKwkJCQkJCQlCWVRFICpkc3Rfc3RyaXAgPSBkaWJfc3RyaXA7CisJCQkJCQkJdW5zaWduZWQgZHN0X3BpdGNoID0gZGliX3BpdGNoOworCQkJCQkJCXVpbnQxNiBjaCA9IHNhbXBsZTsKKwkJCQkJCQl1bnNpZ25lZCBCcHAgPSBkaWJCcHA7CisKKwkJCQkJCQlpZihzYW1wbGUgPj0gY2hDb3VudCkgeworCQkJCQkJCQkvLyBUT0RPIFdyaXRlIHRvIEV4dHJhIENoYW5uZWwKKwkJCQkJCQkJCisJCQkJCQkJCS8vIEhBQ0sgcmVkaXJlY3Qgd3JpdGUgdG8gdGVtcCBhbHBoYQorCQkJCQkJCQlpZihhbHBoYSAmJiBzYW1wbGUgPT0gY2hDb3VudCkgeworCisJCQkJCQkJCQlkc3Rfc3RyaXAgPSBhbF9zdHJpcDsKKwkJCQkJCQkJCWRzdF9waXRjaCA9IGFscGhhX3BpdGNoOworCisJCQkJCQkJCQljaCA9IDA7CisJCQkJCQkJCQlCcHAgPSBhbHBoYV9CcHA7CisJCQkJCQkJCX0KKwkJCQkJCQkJZWxzZSB7CisJCQkJCQkJCQlicmVhazsgCisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQkJCisJCQkJCQkJY29uc3QgdW5zaWduZWQgY2hhbm5lbE9mZnNldCA9IGNoICogQnBjOwkJCQorCQkJCQkJCQorCQkJCQkJCS8vIC0gbG9vcCBmb3Igc3RyaXBzIGluIGJsb2NrIC0KKwkJCQkJCQkKKwkJCQkJCQlCWVRFICpzcmNfbGluZV9iZWdpbiA9IGJ1ZjsKKwkJCQkJCQlCWVRFICpkc3RfbGluZV9iZWdpbiA9IGRzdF9zdHJpcDsKKwkJCQkJCQlmb3IgKGludCBsID0gMDsgbCA8IHN0cmlwczsgbCsrLCBzcmNfbGluZV9iZWdpbiArPSBzcmNfbGluZSwgZHN0X2xpbmVfYmVnaW4gLT0gZHN0X3BpdGNoICkgeworCQkJCQkJCQkvLyAtIGxvb3AgZm9yIHBpeGVscyBpbiBzdHJpcCAtCisJCQkJCQkJCQorCQkJCQkJCQljb25zdCBCWVRFKiBjb25zdCBzcmNfbGluZV9lbmQgPSBzcmNfbGluZV9iZWdpbiArIHNyY19saW5lOworCQkJCQkJCQlmb3IgKEJZVEUgKnNyY19iaXRzID0gc3JjX2xpbmVfYmVnaW4sICogZHN0X2JpdHMgPSBkc3RfbGluZV9iZWdpbjsgc3JjX2JpdHMgPCBzcmNfbGluZV9lbmQ7IHNyY19iaXRzICs9IEJwYywgZHN0X2JpdHMgKz0gQnBwKSB7CisJCQkJCQkJCQlBc3NpZ25QaXhlbChkc3RfYml0cyArIGNoYW5uZWxPZmZzZXQsIHNyY19iaXRzLCBCcGMpOwkJCQkJCQkJCQorCQkJCQkJCQl9IC8vIGxpbmUKKwkJCQkJCQkJCisJCQkJCQkJfSAvLyBzdHJpcHMKKwkJCQkJCQkJCQkJCQkJCQorCQkJCQkJfSAvLyBjaGFubmVscworCQkJCQkJCQorCQkJCQkJLy8gZG9uZSB3aXRoIGEgc3RyaXAgYmxvY2ssIGluY3IgdG8gdGhlIG5leHQKKwkJCQkJCWRpYl9zdHJpcCAtPSBzdHJpcHMgKiBkaWJfcGl0Y2g7CisJCQkJCQlhbF9zdHJpcCAtPSBzdHJpcHMgKiBhbHBoYV9waXRjaDsKKwkJCQkJCQkKKwkJCQkJfSAvLzwgaGVpZ2h0CisJCQkJCQorCQkJCX0KKworCQkJCWZyZWUoYnVmKTsKKwkJCQorCQkJCWlmKCFhc0NNWUspIHsKKwkJCQkJQ29udmVydENNWUt0b1JHQkEoZGliKTsKKwkJCQkJCisJCQkJCS8vIFRoZSBJQ0MgUHJvZmlsZSBpcyBpbnZhbGlkLCBjbGVhciBpdAorCQkJCQlpY2NTaXplID0gMDsKKwkJCQkJaWNjQnVmID0gTlVMTDsKKwkJCQkJCisJCQkJCWlmKGlzQ01ZS0EpIHsKKwkJCQkJCS8vIEhBQ0sgdW50aWwgd2UgaGF2ZSBFeHRyYSBjaGFubmVscy4gKENvbnZlcnRDTVlLdG9SR0JBIHdpbGwgdGhlbiBkbyB0aGUgd29yaykKKwkJCQkJCQorCQkJCQkJRnJlZUltYWdlX1NldENoYW5uZWwoZGliLCBhbHBoYSwgRklDQ19BTFBIQSk7CisJCQkJCQlGcmVlSW1hZ2VfVW5sb2FkKGFscGhhKTsKKwkJCQkJCWFscGhhID0gTlVMTDsKKwkJCQkJfQorCQkJCQllbHNlIHsKKwkJCQkJCUZJQklUTUFQICp0ID0gUmVtb3ZlQWxwaGFDaGFubmVsKGRpYik7CisJCQkJCQlpZih0KSB7CisJCQkJCQkJRnJlZUltYWdlX1VubG9hZChkaWIpOworCQkJCQkJCWRpYiA9IHQ7CisJCQkJCQl9CisJCQkJCQllbHNlIHsKKwkJCQkJCQlGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2Moc19mb3JtYXRfaWQsICJDYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBidWZmZXIuIENNWUsgaW1hZ2UgY29udmVydGVkIHRvIFJHQiArIHBlbmRpbmcgQWxwaGEiKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQkKKwkJCX0gLy8gIWhlYWRlcl9vbmx5CisJCQkKKwkJfSBlbHNlIGlmKGxvYWRNZXRob2QgPT0gTG9hZEFzR2VuZXJpY1N0cmlwKSB7CisJCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCS8vIEdlbmVyaWMgbG9hZGluZworCQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwkJCS8vIGNyZWF0ZSBhIG5ldyBESUIKKwkJCWNvbnN0IHVpbnQxNiBjaENvdW50ID0gTUlOPHVpbnQxNj4oc2FtcGxlc3BlcnBpeGVsLCA0KTsKKwkJCWRpYiA9IENyZWF0ZUltYWdlVHlwZShoZWFkZXJfb25seSwgaW1hZ2VfdHlwZSwgd2lkdGgsIGhlaWdodCwgYml0c3BlcnNhbXBsZSwgY2hDb3VudCk7CisJCQlpZiAoZGliID09IE5VTEwpIHsKKwkJCQl0aHJvdyBGSV9NU0dfRVJST1JfTUVNT1JZOworCQkJfQorCisJCQkvLyBmaWxsIGluIHRoZSByZXNvbHV0aW9uIChlbmdsaXNoIG9yIHVuaXZlcnNhbCkKKworCQkJUmVhZFJlc29sdXRpb24odGlmLCBkaWIpOworCisJCQkvLyBzZXQgdXAgdGhlIGNvbG9ybWFwIGJhc2VkIG9uIHBob3RvbWV0cmljCQorCisJCQlSZWFkUGFsZXR0ZSh0aWYsIHBob3RvbWV0cmljLCBiaXRzcGVyc2FtcGxlLCBkaWIpOworCQorCQkJaWYoIWhlYWRlcl9vbmx5KSB7CisJCQkJLy8gY2FsY3VsYXRlIHRoZSBsaW5lICsgcGl0Y2ggKHNlcGFyYXRlIGZvciBzY3IgJiBkZXN0KQorCisJCQkJY29uc3QgdG1zaXplX3Qgc3JjX2xpbmUgPSBUSUZGU2NhbmxpbmVTaXplKHRpZik7CisJCQkJY29uc3QgdG1zaXplX3QgZHN0X2xpbmUgPSBGcmVlSW1hZ2VfR2V0TGluZShkaWIpOworCQkJCWNvbnN0IHVuc2lnbmVkIGRzdF9waXRjaCA9IEZyZWVJbWFnZV9HZXRQaXRjaChkaWIpOworCQkJCWNvbnN0IHVuc2lnbmVkIEJwcCA9IEZyZWVJbWFnZV9HZXRCUFAoZGliKSAvIDg7CisJCQkJY29uc3QgdW5zaWduZWQgc3JjQnBwID0gYml0c3BlcnNhbXBsZSAqIHNhbXBsZXNwZXJwaXhlbCAvIDg7CisKKwkJCQkvLyBJbiB0aGUgdGlmZiBmaWxlIHRoZSBsaW5lcyBhcmUgc2F2ZSBmcm9tIHVwIHRvIGRvd24gCisJCQkJLy8gSW4gYSBESUIgdGhlIGxpbmVzIG11c3QgYmUgc2F2ZWQgZnJvbSBkb3duIHRvIHVwCisKKwkJCQlCWVRFICpiaXRzID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgaGVpZ2h0IC0gMSk7CisKKwkJCQkvLyByZWFkIHRoZSB0aWZmIGxpbmVzIGFuZCBzYXZlIHRoZW0gaW4gdGhlIERJQgorCisJCQkJQllURSAqYnVmID0gKEJZVEUqKW1hbGxvYyhUSUZGU3RyaXBTaXplKHRpZikgKiBzaXplb2YoQllURSkpOworCQkJCWlmKGJ1ZiA9PSBOVUxMKSB7CisJCQkJCXRocm93IEZJX01TR19FUlJPUl9NRU1PUlk7CisJCQkJfQorCQkJCW1lbXNldChidWYsIDAsIFRJRkZTdHJpcFNpemUodGlmKSAqIHNpemVvZihCWVRFKSk7CisJCQkJCisJCQkJQk9PTCBiVGhyb3dNZXNzYWdlID0gRkFMU0U7CisJCQkJCisJCQkJaWYocGxhbmFyX2NvbmZpZyA9PSBQTEFOQVJDT05GSUdfQ09OVElHKSB7CisKKwkJCQkJZm9yICh1aW50MzIgeSA9IDA7IHkgPCBoZWlnaHQ7IHkgKz0gcm93c3BlcnN0cmlwKSB7CisJCQkJCQlpbnQzMiBzdHJpcHMgPSAoeSArIHJvd3NwZXJzdHJpcCA+IGhlaWdodCA/IGhlaWdodCAtIHkgOiByb3dzcGVyc3RyaXApOworCisJCQkJCQlpZiAoVElGRlJlYWRFbmNvZGVkU3RyaXAodGlmLCBUSUZGQ29tcHV0ZVN0cmlwKHRpZiwgeSwgMCksIGJ1Ziwgc3RyaXBzICogc3JjX2xpbmUpID09IC0xKSB7CisJCQkJCQkJLy8gaWdub3JlIGVycm9ycyBhcyB0aGV5IGNhbiBiZSBmcmVxdWVudCBhbmQgbm90IHJlYWxseSB2YWxpZCBlcnJvcnMsIGVzcGVjaWFsbHkgd2l0aCBmYXggaW1hZ2VzCisJCQkJCQkJYlRocm93TWVzc2FnZSA9IFRSVUU7CQkJCQkJCQorCQkJCQkJCS8qCisJCQkJCQkJZnJlZShidWYpOworCQkJCQkJCXRocm93IEZJX01TR19FUlJPUl9QQVJTSU5HOworCQkJCQkJCSovCisJCQkJCQl9IAorCQkJCQkJaWYoc3JjX2xpbmUgPT0gZHN0X2xpbmUpIHsKKwkJCQkJCQkvLyBjaGFubmVsIGNvdW50IG1hdGNoCisJCQkJCQkJZm9yIChpbnQgbCA9IDA7IGwgPCBzdHJpcHM7IGwrKykgewkJCQkJCQkKKwkJCQkJCQkJbWVtY3B5KGJpdHMsIGJ1ZiArIGwgKiBzcmNfbGluZSwgc3JjX2xpbmUpOworCQkJCQkJCQliaXRzIC09IGRzdF9waXRjaDsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQllbHNlIHsKKwkJCQkJCQlmb3IgKGludCBsID0gMDsgbCA8IHN0cmlwczsgbCsrKSB7CisJCQkJCQkJCWZvcihCWVRFICpwaXhlbCA9IGJpdHMsICpzcmNfcGl4ZWwgPSAgYnVmICsgbCAqIHNyY19saW5lOyBwaXhlbCA8IGJpdHMgKyBkc3RfcGl0Y2g7IHBpeGVsICs9IEJwcCwgc3JjX3BpeGVsICs9IHNyY0JwcCkgeworCQkJCQkJCQkJQXNzaWduUGl4ZWwocGl4ZWwsIHNyY19waXhlbCwgQnBwKTsKKwkJCQkJCQkJfQorCQkJCQkJCQliaXRzIC09IGRzdF9waXRjaDsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSBpZihwbGFuYXJfY29uZmlnID09IFBMQU5BUkNPTkZJR19TRVBBUkFURSkgeworCQkJCQkKKwkJCQkJY29uc3QgdW5zaWduZWQgQnBjID0gYml0c3BlcnNhbXBsZSAvIDg7CisJCQkJCUJZVEUqIGRpYl9zdHJpcCA9IGJpdHM7CisJCQkJCS8vIC0gbG9vcCBmb3Igc3RyaXAgYmxvY2tzIC0KKwkJCQkJCisJCQkJCWZvciAodWludDMyIHkgPSAwOyB5IDwgaGVpZ2h0OyB5ICs9IHJvd3NwZXJzdHJpcCkgeworCQkJCQkJY29uc3QgaW50MzIgc3RyaXBzID0gKHkgKyByb3dzcGVyc3RyaXAgPiBoZWlnaHQgPyBoZWlnaHQgLSB5IDogcm93c3BlcnN0cmlwKTsKKwkJCQkJCQorCQkJCQkJLy8gLSBsb29wIGZvciBjaGFubmVscyAocGxhbmVzKSAtCisJCQkJCQkKKwkJCQkJCWZvcih1aW50MTYgc2FtcGxlID0gMDsgc2FtcGxlIDwgc2FtcGxlc3BlcnBpeGVsOyBzYW1wbGUrKykgeworCQkJCQkJCQorCQkJCQkJCWlmIChUSUZGUmVhZEVuY29kZWRTdHJpcCh0aWYsIFRJRkZDb21wdXRlU3RyaXAodGlmLCB5LCBzYW1wbGUpLCBidWYsIHN0cmlwcyAqIHNyY19saW5lKSA9PSAtMSkgeworCQkJCQkJCQkvLyBpZ25vcmUgZXJyb3JzIGFzIHRoZXkgY2FuIGJlIGZyZXF1ZW50IGFuZCBub3QgcmVhbGx5IHZhbGlkIGVycm9ycywgZXNwZWNpYWxseSB3aXRoIGZheCBpbWFnZXMKKwkJCQkJCQkJYlRocm93TWVzc2FnZSA9IFRSVUU7CQorCQkJCQkJCX0gCisJCQkJCQkJCQkKKwkJCQkJCQlpZihzYW1wbGUgPj0gY2hDb3VudCkgeworCQkJCQkJCQkvLyBUT0RPIFdyaXRlIHRvIEV4dHJhIENoYW5uZWwKKwkJCQkJCQkJYnJlYWs7IAorCQkJCQkJCX0KKwkJCQkJCQkKKwkJCQkJCQljb25zdCB1bnNpZ25lZCBjaGFubmVsT2Zmc2V0ID0gc2FtcGxlICogQnBjOwkJCQorCQkJCQkJCQorCQkJCQkJCS8vIC0gbG9vcCBmb3Igc3RyaXBzIGluIGJsb2NrIC0KKwkJCQkJCQkKKwkJCQkJCQlCWVRFKiBzcmNfbGluZV9iZWdpbiA9IGJ1ZjsKKwkJCQkJCQlCWVRFKiBkc3RfbGluZV9iZWdpbiA9IGRpYl9zdHJpcDsKKwkJCQkJCQlmb3IgKGludCBsID0gMDsgbCA8IHN0cmlwczsgbCsrLCBzcmNfbGluZV9iZWdpbiArPSBzcmNfbGluZSwgZHN0X2xpbmVfYmVnaW4gLT0gZHN0X3BpdGNoICkgeworCQkJCQkJCQkJCisJCQkJCQkJCS8vIC0gbG9vcCBmb3IgcGl4ZWxzIGluIHN0cmlwIC0KKwkJCQkJCQkJCisJCQkJCQkJCWNvbnN0IEJZVEUqIGNvbnN0IHNyY19saW5lX2VuZCA9IHNyY19saW5lX2JlZ2luICsgc3JjX2xpbmU7CisKKwkJCQkJCQkJZm9yIChCWVRFKiBzcmNfYml0cyA9IHNyY19saW5lX2JlZ2luLCAqIGRzdF9iaXRzID0gZHN0X2xpbmVfYmVnaW47IHNyY19iaXRzIDwgc3JjX2xpbmVfZW5kOyBzcmNfYml0cyArPSBCcGMsIGRzdF9iaXRzICs9IEJwcCkgeworCQkJCQkJCQkJLy8gYWN0dWFsbHkgYXNzaWducyBjaGFubmVsCisJCQkJCQkJCQlBc3NpZ25QaXhlbChkc3RfYml0cyArIGNoYW5uZWxPZmZzZXQsIHNyY19iaXRzLCBCcGMpOyAKKwkJCQkJCQkJfSAvLyBsaW5lCisKKwkJCQkJCQl9IC8vIHN0cmlwcworCisJCQkJCQl9IC8vIGNoYW5uZWxzCisJCQkJCQkJCisJCQkJCQkvLyBkb25lIHdpdGggYSBzdHJpcCBibG9jaywgaW5jciB0byB0aGUgbmV4dAorCQkJCQkJZGliX3N0cmlwIC09IHN0cmlwcyAqIGRzdF9waXRjaDsKKwkJCQkJCQkKKwkJCQkJfSAvLyBoZWlnaHQKKworCQkJCX0KKwkJCQlmcmVlKGJ1Zik7CisJCQkJCisJCQkJaWYoYlRocm93TWVzc2FnZSkgeworCQkJCQlGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2Moc19mb3JtYXRfaWQsICJXYXJuaW5nOiBwYXJzaW5nIGVycm9yLiBJbWFnZSBtYXkgYmUgaW5jb21wbGV0ZSBvciBjb250YWluIGludmFsaWQgZGF0YSAhIik7CisJCQkJfQorCQkJCQorI2lmIEZSRUVJTUFHRV9DT0xPUk9SREVSID09IEZSRUVJTUFHRV9DT0xPUk9SREVSX0JHUgorCQkJCVN3YXBSZWRCbHVlMzIoZGliKTsKKyNlbmRpZgorCisJCQl9IC8vICFoZWFkZXIgb25seQorCQkJCisJCX0gZWxzZSBpZihsb2FkTWV0aG9kID09IExvYWRBc1RpbGVkKSB7CisJCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCS8vIFRpbGVkIGltYWdlIGxvYWRpbmcKKwkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJCQl1aW50MzIgdGlsZVdpZHRoLCB0aWxlSGVpZ2h0OworCQkJdWludDMyIHNyY19saW5lID0gMDsKKworCQkJLy8gY3JlYXRlIGEgbmV3IERJQgorCQkJZGliID0gQ3JlYXRlSW1hZ2VUeXBlKCBoZWFkZXJfb25seSwgaW1hZ2VfdHlwZSwgd2lkdGgsIGhlaWdodCwgYml0c3BlcnNhbXBsZSwgc2FtcGxlc3BlcnBpeGVsKTsKKwkJCWlmIChkaWIgPT0gTlVMTCkgeworCQkJCXRocm93IEZJX01TR19FUlJPUl9NRU1PUlk7CisJCQl9CisKKwkJCS8vIGZpbGwgaW4gdGhlIHJlc29sdXRpb24gKGVuZ2xpc2ggb3IgdW5pdmVyc2FsKQorCisJCQlSZWFkUmVzb2x1dGlvbih0aWYsIGRpYik7CisKKwkJCS8vIHNldCB1cCB0aGUgY29sb3JtYXAgYmFzZWQgb24gcGhvdG9tZXRyaWMJCisKKwkJCVJlYWRQYWxldHRlKHRpZiwgcGhvdG9tZXRyaWMsIGJpdHNwZXJzYW1wbGUsIGRpYik7CisKKwkJCS8vIGdldCB0aGUgdGlsZSBnZW9tZXRyeQorCQkJaWYoIVRJRkZHZXRGaWVsZCh0aWYsIFRJRkZUQUdfVElMRVdJRFRILCAmdGlsZVdpZHRoKSB8fCAhVElGRkdldEZpZWxkKHRpZiwgVElGRlRBR19USUxFTEVOR1RILCAmdGlsZUhlaWdodCkpIHsKKwkJCQl0aHJvdyAiSW52YWxpZCB0aWxlZCBUSUZGIGltYWdlIjsKKwkJCX0KKworCQkJLy8gcmVhZCB0aGUgdGlmZiBsaW5lcyBhbmQgc2F2ZSB0aGVtIGluIHRoZSBESUIKKworCQkJaWYocGxhbmFyX2NvbmZpZyA9PSBQTEFOQVJDT05GSUdfQ09OVElHICYmICFoZWFkZXJfb25seSkgeworCQkJCQorCQkJCS8vIGdldCB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gY29udGFpbiBhIHRpbGUKKwkJCQl0bXNpemVfdCB0aWxlU2l6ZSA9IFRJRkZUaWxlU2l6ZSh0aWYpOworCisJCQkJLy8gYWxsb2NhdGUgdGlsZSBidWZmZXIKKwkJCQlCWVRFICp0aWxlQnVmZmVyID0gKEJZVEUqKW1hbGxvYyh0aWxlU2l6ZSAqIHNpemVvZihCWVRFKSk7CisJCQkJaWYodGlsZUJ1ZmZlciA9PSBOVUxMKSB7CisJCQkJCXRocm93IEZJX01TR19FUlJPUl9NRU1PUlk7CisJCQkJfQorCisJCQkJLy8gY2FsY3VsYXRlIHNyYyBsaW5lIGFuZCBkc3QgcGl0Y2gKKwkJCQlpbnQgZHN0X3BpdGNoID0gRnJlZUltYWdlX0dldFBpdGNoKGRpYik7CisJCQkJdWludDMyIHRpbGVSb3dTaXplID0gKHVpbnQzMilUSUZGVGlsZVJvd1NpemUodGlmKTsKKwkJCQl1aW50MzIgaW1hZ2VSb3dTaXplID0gKHVpbnQzMilUSUZGU2NhbmxpbmVTaXplKHRpZik7CisKKworCQkJCS8vIEluIHRoZSB0aWZmIGZpbGUgdGhlIGxpbmVzIGFyZSBzYXZlZCBmcm9tIHVwIHRvIGRvd24gCisJCQkJLy8gSW4gYSBESUIgdGhlIGxpbmVzIG11c3QgYmUgc2F2ZWQgZnJvbSBkb3duIHRvIHVwCisKKwkJCQlCWVRFICpiaXRzID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgaGVpZ2h0IC0gMSk7CisJCQkJCisJCQkJZm9yICh1aW50MzIgeSA9IDA7IHkgPCBoZWlnaHQ7IHkgKz0gdGlsZUhlaWdodCkgewkJCQkJCQorCQkJCQlpbnQzMiBucm93cyA9ICh5ICsgdGlsZUhlaWdodCA+IGhlaWdodCA/IGhlaWdodCAtIHkgOiB0aWxlSGVpZ2h0KTsJCQkJCQorCisJCQkJCWZvciAodWludDMyIHggPSAwLCByb3dTaXplID0gMDsgeCA8IHdpZHRoOyB4ICs9IHRpbGVXaWR0aCwgcm93U2l6ZSArPSB0aWxlUm93U2l6ZSkgeworCQkJCQkJbWVtc2V0KHRpbGVCdWZmZXIsIDAsIHRpbGVTaXplKTsKKworCQkJCQkJLy8gcmVhZCBvbmUgdGlsZQorCQkJCQkJaWYgKFRJRkZSZWFkVGlsZSh0aWYsIHRpbGVCdWZmZXIsIHgsIHksIDAsIDApIDwgMCkgeworCQkJCQkJCWZyZWUodGlsZUJ1ZmZlcik7CisJCQkJCQkJdGhyb3cgIkNvcnJ1cHRlZCB0aWxlZCBUSUZGIGZpbGUiOworCQkJCQkJfQorCQkJCQkJLy8gY29udmVydCB0byBzdHJpcAorCQkJCQkJaWYoeCArIHRpbGVXaWR0aCA+IHdpZHRoKSB7CisJCQkJCQkJc3JjX2xpbmUgPSBpbWFnZVJvd1NpemUgLSByb3dTaXplOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlzcmNfbGluZSA9IHRpbGVSb3dTaXplOworCQkJCQkJfQorCQkJCQkJQllURSAqc3JjX2JpdHMgPSB0aWxlQnVmZmVyOworCQkJCQkJQllURSAqZHN0X2JpdHMgPSBiaXRzICsgcm93U2l6ZTsKKwkJCQkJCWZvcihpbnQgayA9IDA7IGsgPCBucm93czsgaysrKSB7CisJCQkJCQkJbWVtY3B5KGRzdF9iaXRzLCBzcmNfYml0cywgc3JjX2xpbmUpOworCQkJCQkJCXNyY19iaXRzICs9IHRpbGVSb3dTaXplOworCQkJCQkJCWRzdF9iaXRzIC09IGRzdF9waXRjaDsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCWJpdHMgLT0gbnJvd3MgKiBkc3RfcGl0Y2g7CisJCQkJfQorCisjaWYgRlJFRUlNQUdFX0NPTE9ST1JERVIgPT0gRlJFRUlNQUdFX0NPTE9ST1JERVJfQkdSCisJCQkJU3dhcFJlZEJsdWUzMihkaWIpOworI2VuZGlmCisJCQkJZnJlZSh0aWxlQnVmZmVyKTsKKwkJCX0KKwkJCWVsc2UgaWYocGxhbmFyX2NvbmZpZyA9PSBQTEFOQVJDT05GSUdfU0VQQVJBVEUpIHsKKwkJCQl0aHJvdyAiU2VwYXJhdGVkIHRpbGVkIFRJRkYgaW1hZ2VzIGFyZSBub3Qgc3VwcG9ydGVkIjsgCisJCQl9CisKKworCQl9IGVsc2UgaWYobG9hZE1ldGhvZCA9PSBMb2FkQXNMb2dMdXYpIHsKKwkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJLy8gUkdCRiBMb2dMdXYgY29tcHJlc3NlZCBsb2FkaW5nCisJCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCQkJZG91YmxlCXN0b25pdHM7CS8vIGlucHV0IGNvbnZlcnNpb24gdG8gbml0cworCQkJaWYgKCFUSUZGR2V0RmllbGQodGlmLCBUSUZGVEFHX1NUT05JVFMsICZzdG9uaXRzKSkgeworCQkJCXN0b25pdHMgPSAxOworCQkJfQorCQkJCisJCQkvLyBjcmVhdGUgYSBuZXcgRElCCisJCQlkaWIgPSBDcmVhdGVJbWFnZVR5cGUoaGVhZGVyX29ubHksIGltYWdlX3R5cGUsIHdpZHRoLCBoZWlnaHQsIGJpdHNwZXJzYW1wbGUsIHNhbXBsZXNwZXJwaXhlbCk7CisJCQlpZiAoZGliID09IE5VTEwpIHsKKwkJCQl0aHJvdyBGSV9NU0dfRVJST1JfTUVNT1JZOworCQkJfQorCisJCQkvLyBmaWxsIGluIHRoZSByZXNvbHV0aW9uIChlbmdsaXNoIG9yIHVuaXZlcnNhbCkKKworCQkJUmVhZFJlc29sdXRpb24odGlmLCBkaWIpOworCisJCQlpZihwbGFuYXJfY29uZmlnID09IFBMQU5BUkNPTkZJR19DT05USUcgJiYgIWhlYWRlcl9vbmx5KSB7CisJCQkJLy8gY2FsY3VsYXRlIHRoZSBsaW5lICsgcGl0Y2ggKHNlcGFyYXRlIGZvciBzY3IgJiBkZXN0KQorCisJCQkJdG1zaXplX3Qgc3JjX2xpbmUgPSBUSUZGU2NhbmxpbmVTaXplKHRpZik7CisJCQkJaW50IGRzdF9waXRjaCA9IEZyZWVJbWFnZV9HZXRQaXRjaChkaWIpOworCisJCQkJLy8gSW4gdGhlIHRpZmYgZmlsZSB0aGUgbGluZXMgYXJlIHNhdmUgZnJvbSB1cCB0byBkb3duIAorCQkJCS8vIEluIGEgRElCIHRoZSBsaW5lcyBtdXN0IGJlIHNhdmVkIGZyb20gZG93biB0byB1cAorCisJCQkJQllURSAqYml0cyA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIGhlaWdodCAtIDEpOworCisJCQkJLy8gcmVhZCB0aGUgdGlmZiBsaW5lcyBhbmQgc2F2ZSB0aGVtIGluIHRoZSBESUIKKworCQkJCUJZVEUgKmJ1ZiA9IChCWVRFKiltYWxsb2MoVElGRlN0cmlwU2l6ZSh0aWYpICogc2l6ZW9mKEJZVEUpKTsKKwkJCQlpZihidWYgPT0gTlVMTCkgeworCQkJCQl0aHJvdyBGSV9NU0dfRVJST1JfTUVNT1JZOworCQkJCX0KKworCQkJCWZvciAodWludDMyIHkgPSAwOyB5IDwgaGVpZ2h0OyB5ICs9IHJvd3NwZXJzdHJpcCkgeworCQkJCQlpbnQzMiBucm93ID0gKHkgKyByb3dzcGVyc3RyaXAgPiBoZWlnaHQgPyBoZWlnaHQgLSB5IDogcm93c3BlcnN0cmlwKTsKKworCQkJCQlpZiAoVElGRlJlYWRFbmNvZGVkU3RyaXAodGlmLCBUSUZGQ29tcHV0ZVN0cmlwKHRpZiwgeSwgMCksIGJ1ZiwgbnJvdyAqIHNyY19saW5lKSA9PSAtMSkgeworCQkJCQkJZnJlZShidWYpOworCQkJCQkJdGhyb3cgRklfTVNHX0VSUk9SX1BBUlNJTkc7CisJCQkJCX0gCisJCQkJCS8vIGNvbnZlcnQgZnJvbSBYWVogdG8gUkdCCisJCQkJCWZvciAoaW50IGwgPSAwOyBsIDwgbnJvdzsgbCsrKSB7CQkJCQkJCisJCQkJCQl0aWZmX0NvbnZlcnRMaW5lWFlaVG9SR0IoYml0cywgYnVmICsgbCAqIHNyY19saW5lLCBzdG9uaXRzLCB3aWR0aCk7CisJCQkJCQliaXRzIC09IGRzdF9waXRjaDsKKwkJCQkJfQorCQkJCX0KKworCQkJCWZyZWUoYnVmKTsKKwkJCX0KKwkJCWVsc2UgaWYocGxhbmFyX2NvbmZpZyA9PSBQTEFOQVJDT05GSUdfU0VQQVJBVEUpIHsKKwkJCQkvLyB0aGlzIGNhbm5vdCBoYXBwZW4gYWNjb3JkaW5nIHRvIHRoZSBMb2dMdXYgc3BlY2lmaWNhdGlvbgorCQkJCXRocm93ICJVbmFibGUgdG8gaGFuZGxlIFBMQU5BUkNPTkZJR19TRVBBUkFURSBMb2dMdXYgaW1hZ2VzIjsKKwkJCX0KKworCQl9IGVsc2UgaWYobG9hZE1ldGhvZCA9PSBMb2FkQXNIYWxmRmxvYXQpIHsKKwkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJLy8gUkdCRiBsb2FkaW5nIGZyb20gYSBoYWxmIGZvcm1hdAorCQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwkJCS8vIGNyZWF0ZSBhIG5ldyBESUIKKwkJCWRpYiA9IENyZWF0ZUltYWdlVHlwZShoZWFkZXJfb25seSwgaW1hZ2VfdHlwZSwgd2lkdGgsIGhlaWdodCwgYml0c3BlcnNhbXBsZSwgc2FtcGxlc3BlcnBpeGVsKTsKKwkJCWlmIChkaWIgPT0gTlVMTCkgeworCQkJCXRocm93IEZJX01TR19FUlJPUl9NRU1PUlk7CisJCQl9CisKKwkJCS8vIGZpbGwgaW4gdGhlIHJlc29sdXRpb24gKGVuZ2xpc2ggb3IgdW5pdmVyc2FsKQorCisJCQlSZWFkUmVzb2x1dGlvbih0aWYsIGRpYik7CisKKwkJCWlmKCFoZWFkZXJfb25seSkgeworCisJCQkJLy8gY2FsY3VsYXRlIHRoZSBsaW5lICsgcGl0Y2ggKHNlcGFyYXRlIGZvciBzY3IgJiBkZXN0KQorCisJCQkJdG1zaXplX3Qgc3JjX2xpbmUgPSBUSUZGU2NhbmxpbmVTaXplKHRpZik7CisJCQkJdW5zaWduZWQgZHN0X3BpdGNoID0gRnJlZUltYWdlX0dldFBpdGNoKGRpYik7CisKKwkJCQkvLyBJbiB0aGUgdGlmZiBmaWxlIHRoZSBsaW5lcyBhcmUgc2F2ZSBmcm9tIHVwIHRvIGRvd24gCisJCQkJLy8gSW4gYSBESUIgdGhlIGxpbmVzIG11c3QgYmUgc2F2ZWQgZnJvbSBkb3duIHRvIHVwCisKKwkJCQlCWVRFICpiaXRzID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgaGVpZ2h0IC0gMSk7CisKKwkJCQkvLyByZWFkIHRoZSB0aWZmIGxpbmVzIGFuZCBzYXZlIHRoZW0gaW4gdGhlIERJQgorCisJCQkJaWYocGxhbmFyX2NvbmZpZyA9PSBQTEFOQVJDT05GSUdfQ09OVElHKSB7CisKKwkJCQkJQllURSAqYnVmID0gKEJZVEUqKW1hbGxvYyhUSUZGU3RyaXBTaXplKHRpZikgKiBzaXplb2YoQllURSkpOworCQkJCQlpZihidWYgPT0gTlVMTCkgeworCQkJCQkJdGhyb3cgRklfTVNHX0VSUk9SX01FTU9SWTsKKwkJCQkJfQorCisJCQkJCWZvciAodWludDMyIHkgPSAwOyB5IDwgaGVpZ2h0OyB5ICs9IHJvd3NwZXJzdHJpcCkgeworCQkJCQkJdWludDMyIG5yb3cgPSAoeSArIHJvd3NwZXJzdHJpcCA+IGhlaWdodCA/IGhlaWdodCAtIHkgOiByb3dzcGVyc3RyaXApOworCisJCQkJCQlpZiAoVElGRlJlYWRFbmNvZGVkU3RyaXAodGlmLCBUSUZGQ29tcHV0ZVN0cmlwKHRpZiwgeSwgMCksIGJ1ZiwgbnJvdyAqIHNyY19saW5lKSA9PSAtMSkgeworCQkJCQkJCWZyZWUoYnVmKTsKKwkJCQkJCQl0aHJvdyBGSV9NU0dfRVJST1JfUEFSU0lORzsKKwkJCQkJCX0gCisKKwkJCQkJCS8vIGNvbnZlcnQgZnJvbSBoYWxmICgxNi1iaXQpIHRvIGZsb2F0ICgzMi1iaXQpCisJCQkJCQkvLyAhISEgdXNlIE9wZW5FWFIgaGFsZiBoZWxwZXIgY2xhc3MKKworCQkJCQkJaGFsZiBoYWxmX3ZhbHVlOworCisJCQkJCQlmb3IgKHVpbnQzMiBsID0gMDsgbCA8IG5yb3c7IGwrKykgeworCQkJCQkJCVdPUkQgKnNyY19waXhlbCA9IChXT1JEKikoYnVmICsgbCAqIHNyY19saW5lKTsKKwkJCQkJCQlmbG9hdCAqZHN0X3BpeGVsID0gKGZsb2F0KiliaXRzOworCisJCQkJCQkJZm9yKHRtc2l6ZV90IHggPSAwOyB4IDwgKHRtc2l6ZV90KShzcmNfbGluZSAvIHNpemVvZihXT1JEKSk7IHgrKykgeworCQkJCQkJCQloYWxmX3ZhbHVlLnNldEJpdHMoc3JjX3BpeGVsW3hdKTsKKwkJCQkJCQkJZHN0X3BpeGVsW3hdID0gaGFsZl92YWx1ZTsKKwkJCQkJCQl9CisKKwkJCQkJCQliaXRzIC09IGRzdF9waXRjaDsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCWZyZWUoYnVmKTsKKwkJCQl9CisJCQkJZWxzZSBpZihwbGFuYXJfY29uZmlnID09IFBMQU5BUkNPTkZJR19TRVBBUkFURSkgeworCQkJCQkvLyB0aGlzIHVzZSBjYXNlIHdhcyBuZXZlciBlbmNvdW50ZXJlZCB5ZXQKKwkJCQkJdGhyb3cgIlVuYWJsZSB0byBoYW5kbGUgUExBTkFSQ09ORklHX1NFUEFSQVRFIFJHQiBoYWxmIGZsb2F0IGltYWdlcyI7CisJCQkJfQorCQkJCQorCQkJfSAvLyAhaGVhZGVyIG9ubHkKKworCQl9IGVsc2UgeworCQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkvLyBVbmtub3duIG9yIHVuc3VwcG9ydGVkIGZvcm1hdAorCQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwkJCXRocm93IEZJX01TR19FUlJPUl9VTlNVUFBPUlRFRF9GT1JNQVQ7CisJCX0KKworCQkvLyBjb3B5IElDQyBwcm9maWxlIGRhdGEgKG11c3QgYmUgZG9uZSBhZnRlciBGcmVlSW1hZ2VfQWxsb2NhdGUpCisKKwkJRnJlZUltYWdlX0NyZWF0ZUlDQ1Byb2ZpbGUoZGliLCBpY2NCdWYsIGljY1NpemUpOwkJCisJCWlmIChwaG90b21ldHJpYyA9PSBQSE9UT01FVFJJQ19TRVBBUkFURUQgJiYgYXNDTVlLKSB7CisJCQlGcmVlSW1hZ2VfR2V0SUNDUHJvZmlsZShkaWIpLT5mbGFncyB8PSBGSUlDQ19DT0xPUl9JU19DTVlLOworCQl9CQkJCisKKwkJLy8gY29weSBUSUZGIG1ldGFkYXRhIChtdXN0IGJlIGRvbmUgYWZ0ZXIgRnJlZUltYWdlX0FsbG9jYXRlKQorCisJCVJlYWRNZXRhZGF0YSh0aWYsIGRpYik7CisKKwkJLy8gY29weSBUSUZGIHRodW1ibmFpbCAobXVzdCBiZSBkb25lIGFmdGVyIEZyZWVJbWFnZV9BbGxvY2F0ZSkKKwkJCisJCVJlYWRUaHVtYm5haWwoaW8sIGhhbmRsZSwgZGF0YSwgdGlmLCBkaWIpOworCisJCXJldHVybiAoRklCSVRNQVAgKilkaWI7CisKKwl9IGNhdGNoIChjb25zdCBjaGFyICptZXNzYWdlKSB7CQkJCisJCWlmKGRpYikJeworCQkJRnJlZUltYWdlX1VubG9hZChkaWIpOworCQl9CisJCWlmKG1lc3NhZ2UpIHsKKwkJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhzX2Zvcm1hdF9pZCwgbWVzc2FnZSk7CisJCX0KKwkJcmV0dXJuIE5VTEw7CisJfQorICAKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIEJPT0wgCitTYXZlT25lVElGRihGcmVlSW1hZ2VJTyAqaW8sIEZJQklUTUFQICpkaWIsIGZpX2hhbmRsZSBoYW5kbGUsIGludCBwYWdlLCBpbnQgZmxhZ3MsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGlmZCwgdW5zaWduZWQgaWZkQ291bnQpIHsKKwlpZiAoIWRpYiB8fCAhaGFuZGxlIHx8ICFkYXRhKSB7CisJCXJldHVybiBGQUxTRTsKKwl9IAorCQorCXRyeSB7IAorCQlmaV9USUZGSU8gKmZpbyA9IChmaV9USUZGSU8qKWRhdGE7CisJCVRJRkYgKm91dCA9IGZpby0+dGlmOworCisJCWNvbnN0IEZSRUVfSU1BR0VfVFlQRSBpbWFnZV90eXBlID0gRnJlZUltYWdlX0dldEltYWdlVHlwZShkaWIpOworCisJCWNvbnN0IHVpbnQzMiB3aWR0aCA9IEZyZWVJbWFnZV9HZXRXaWR0aChkaWIpOworCQljb25zdCB1aW50MzIgaGVpZ2h0ID0gRnJlZUltYWdlX0dldEhlaWdodChkaWIpOworCQljb25zdCB1aW50MTYgYml0c3BlcnBpeGVsID0gKHVpbnQxNilGcmVlSW1hZ2VfR2V0QlBQKGRpYik7CisKKwkJY29uc3QgRklJQ0NQUk9GSUxFKiBpY2NQcm9maWxlID0gRnJlZUltYWdlX0dldElDQ1Byb2ZpbGUoZGliKTsKKwkJCisJCS8vIHNldHVwIG91dC12YXJpYWJsZXMgYmFzZWQgb24gZGliIGFuZCBmbGFnIG9wdGlvbnMKKwkJCisJCXVpbnQxNiBiaXRzcGVyc2FtcGxlOworCQl1aW50MTYgc2FtcGxlc3BlcnBpeGVsOworCQl1aW50MTYgcGhvdG9tZXRyaWM7CisKKwkJaWYoaW1hZ2VfdHlwZSA9PSBGSVRfQklUTUFQKSB7CisJCQkvLyBzdGFuZGFyZCBpbWFnZTogMS0sIDQtLCA4LSwgMTYtLCAyNC0sIDMyLWJpdAorCisJCQlzYW1wbGVzcGVycGl4ZWwgPSAoKGJpdHNwZXJwaXhlbCA9PSAyNCkgPyAzIDogKChiaXRzcGVycGl4ZWwgPT0gMzIpID8gNCA6IDEpKTsKKwkJCWJpdHNwZXJzYW1wbGUgPSBiaXRzcGVycGl4ZWwgLyBzYW1wbGVzcGVycGl4ZWw7CisJCQlwaG90b21ldHJpYwk9IEdldFBob3RvbWV0cmljKGRpYik7CisKKwkJCWlmKChiaXRzcGVycGl4ZWwgPT0gOCkgJiYgRnJlZUltYWdlX0lzVHJhbnNwYXJlbnQoZGliKSkgeworCQkJCS8vIDgtYml0IHRyYW5zcGFyZW50IHBpY3R1cmUgOiBjb252ZXJ0IGxhdGVyIHRvIDgtYml0ICsgOC1iaXQgYWxwaGEKKwkJCQlzYW1wbGVzcGVycGl4ZWwgPSAyOworCQkJCWJpdHNwZXJzYW1wbGUgPSA4OworCQkJfQorCQkJZWxzZSBpZihiaXRzcGVycGl4ZWwgPT0gMzIpIHsKKwkJCQkvLyAzMi1iaXQgaW1hZ2VzIDogY2hlY2sgZm9yIENNWUsgb3IgYWxwaGEgdHJhbnNwYXJlbmN5CisKKwkJCQlpZigoKChpY2NQcm9maWxlLT5mbGFncyAmIEZJSUNDX0NPTE9SX0lTX0NNWUspID09IEZJSUNDX0NPTE9SX0lTX0NNWUspIHx8ICgoZmxhZ3MgJiBUSUZGX0NNWUspID09IFRJRkZfQ01ZSykpKSB7CisJCQkJCS8vIENNWUsgc3VwcG9ydAorCQkJCQlwaG90b21ldHJpYyA9IFBIT1RPTUVUUklDX1NFUEFSQVRFRDsKKwkJCQkJVElGRlNldEZpZWxkKG91dCwgVElGRlRBR19JTktTRVQsIElOS1NFVF9DTVlLKTsKKwkJCQkJVElGRlNldEZpZWxkKG91dCwgVElGRlRBR19OVU1CRVJPRklOS1MsIDQpOworCQkJCX0KKwkJCQllbHNlIGlmKHBob3RvbWV0cmljID09IFBIT1RPTUVUUklDX1JHQikgeworCQkJCQkvLyB0cmFuc3BhcmVuY3kgbWFzayBzdXBwb3J0CisJCQkJCXVpbnQxNiBzYW1wbGVpbmZvWzFdOyAKKwkJCQkJLy8gdW5hc3NvY2lhdGVkIGFscGhhIGRhdGEgaXMgdHJhbnNwYXJlbmN5IGluZm9ybWF0aW9uCisJCQkJCXNhbXBsZWluZm9bMF0gPSBFWFRSQVNBTVBMRV9VTkFTU0FMUEhBOworCQkJCQlUSUZGU2V0RmllbGQob3V0LCBUSUZGVEFHX0VYVFJBU0FNUExFUywgMSwgc2FtcGxlaW5mbyk7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgaWYoaW1hZ2VfdHlwZSA9PSBGSVRfUkdCMTYpIHsKKwkJCS8vIDQ4LWJpdCBSR0IKKworCQkJc2FtcGxlc3BlcnBpeGVsID0gMzsKKwkJCWJpdHNwZXJzYW1wbGUgPSBiaXRzcGVycGl4ZWwgLyBzYW1wbGVzcGVycGl4ZWw7CisJCQlwaG90b21ldHJpYwk9IFBIT1RPTUVUUklDX1JHQjsKKwkJfSBlbHNlIGlmKGltYWdlX3R5cGUgPT0gRklUX1JHQkExNikgeworCQkJLy8gNjQtYml0IFJHQkEKKworCQkJc2FtcGxlc3BlcnBpeGVsID0gNDsKKwkJCWJpdHNwZXJzYW1wbGUgPSBiaXRzcGVycGl4ZWwgLyBzYW1wbGVzcGVycGl4ZWw7CisJCQlpZigoKChpY2NQcm9maWxlLT5mbGFncyAmIEZJSUNDX0NPTE9SX0lTX0NNWUspID09IEZJSUNDX0NPTE9SX0lTX0NNWUspIHx8ICgoZmxhZ3MgJiBUSUZGX0NNWUspID09IFRJRkZfQ01ZSykpKSB7CisJCQkJLy8gQ01ZSyBzdXBwb3J0CisJCQkJcGhvdG9tZXRyaWMgPSBQSE9UT01FVFJJQ19TRVBBUkFURUQ7CisJCQkJVElGRlNldEZpZWxkKG91dCwgVElGRlRBR19JTktTRVQsIElOS1NFVF9DTVlLKTsKKwkJCQlUSUZGU2V0RmllbGQob3V0LCBUSUZGVEFHX05VTUJFUk9GSU5LUywgNCk7CisJCQl9CisJCQllbHNlIHsKKwkJCQlwaG90b21ldHJpYwk9IFBIT1RPTUVUUklDX1JHQjsKKwkJCQkvLyB0cmFuc3BhcmVuY3kgbWFzayBzdXBwb3J0CisJCQkJdWludDE2IHNhbXBsZWluZm9bMV07IAorCQkJCS8vIHVuYXNzb2NpYXRlZCBhbHBoYSBkYXRhIGlzIHRyYW5zcGFyZW5jeSBpbmZvcm1hdGlvbgorCQkJCXNhbXBsZWluZm9bMF0gPSBFWFRSQVNBTVBMRV9VTkFTU0FMUEhBOworCQkJCVRJRkZTZXRGaWVsZChvdXQsIFRJRkZUQUdfRVhUUkFTQU1QTEVTLCAxLCBzYW1wbGVpbmZvKTsKKwkJCX0KKwkJfSBlbHNlIGlmKGltYWdlX3R5cGUgPT0gRklUX1JHQkYpIHsKKwkJCS8vIDk2LWJpdCBSR0JGID0+IHN0b3JlIHdpdGggYSBMb2dMdXYgZW5jb2RpbmcgPworCisJCQlzYW1wbGVzcGVycGl4ZWwgPSAzOworCQkJYml0c3BlcnNhbXBsZSA9IGJpdHNwZXJwaXhlbCAvIHNhbXBsZXNwZXJwaXhlbDsKKwkJCS8vIHRoZSBsaWJyYXJ5IGNvbnZlcnRzIHRvIGFuZCBmcm9tIGZsb2F0aW5nLXBvaW50IFhZWiBDSUUgdmFsdWVzCisJCQlpZigoZmxhZ3MgJiBUSUZGX0xPR0xVVikgPT0gVElGRl9MT0dMVVYpIHsKKwkJCQlwaG90b21ldHJpYwk9IFBIT1RPTUVUUklDX0xPR0xVVjsKKwkJCQlUSUZGU2V0RmllbGQob3V0LCBUSUZGVEFHX1NHSUxPR0RBVEFGTVQsIFNHSUxPR0RBVEFGTVRfRkxPQVQpOworCQkJCS8vIFRJRkZTZXRGaWVsZChvdXQsIFRJRkZUQUdfU1RPTklUUywgMS4wKTsgICAvLyBhc3N1bWUgdW5rbm93biAKKwkJCX0KKwkJCWVsc2UgeworCQkJCS8vIHN0b3JlIHdpdGggZGVmYXVsdCBjb21wcmVzc2lvbiAoTFpXKSBvciB3aXRoIGlucHV0IGNvbXByZXNzaW9uIGZsYWcKKwkJCQlwaG90b21ldHJpYwk9IFBIT1RPTUVUUklDX1JHQjsKKwkJCX0KKwkJCQorCQl9IGVsc2UgaWYgKGltYWdlX3R5cGUgPT0gRklUX1JHQkFGKSB7CisJCQkvLyAxMjgtYml0IFJHQkFGID0+IHN0b3JlIHdpdGggZGVmYXVsdCBjb21wcmVzc2lvbiAoTFpXKSBvciB3aXRoIGlucHV0IGNvbXByZXNzaW9uIGZsYWcKKwkJCQorCQkJc2FtcGxlc3BlcnBpeGVsID0gNDsKKwkJCWJpdHNwZXJzYW1wbGUgPSBiaXRzcGVycGl4ZWwgLyBzYW1wbGVzcGVycGl4ZWw7CisJCQlwaG90b21ldHJpYwk9IFBIT1RPTUVUUklDX1JHQjsKKwkJfSBlbHNlIHsKKwkJCS8vIHNwZWNpYWwgaW1hZ2UgdHlwZSAoaW50LCBsb25nLCBkb3VibGUsIC4uLikKKwkJCQorCQkJc2FtcGxlc3BlcnBpeGVsID0gMTsKKwkJCWJpdHNwZXJzYW1wbGUgPSBiaXRzcGVycGl4ZWw7CisJCQlwaG90b21ldHJpYwk9IFBIT1RPTUVUUklDX01JTklTQkxBQ0s7CisJCX0KKworCQkvLyBzZXQgaW1hZ2UgZGF0YSB0eXBlCisKKwkJV3JpdGVJbWFnZVR5cGUob3V0LCBpbWFnZV90eXBlKTsKKwkJCisJCS8vIHdyaXRlIHBvc3NpYmxlIElDQyBwcm9maWxlCisKKwkJaWYgKGljY1Byb2ZpbGUtPnNpemUgJiYgaWNjUHJvZmlsZS0+ZGF0YSkgeworCQkJVElGRlNldEZpZWxkKG91dCwgVElGRlRBR19JQ0NQUk9GSUxFLCBpY2NQcm9maWxlLT5zaXplLCBpY2NQcm9maWxlLT5kYXRhKTsKKwkJfQorCisJCS8vIGhhbmRsZSBzdGFuZGFyZCB3aWR0aC9oZWlnaHQvYnBwIHN0dWZmCisKKwkJVElGRlNldEZpZWxkKG91dCwgVElGRlRBR19JTUFHRVdJRFRILCB3aWR0aCk7CisJCVRJRkZTZXRGaWVsZChvdXQsIFRJRkZUQUdfSU1BR0VMRU5HVEgsIGhlaWdodCk7CisJCVRJRkZTZXRGaWVsZChvdXQsIFRJRkZUQUdfU0FNUExFU1BFUlBJWEVMLCBzYW1wbGVzcGVycGl4ZWwpOworCQlUSUZGU2V0RmllbGQob3V0LCBUSUZGVEFHX0JJVFNQRVJTQU1QTEUsIGJpdHNwZXJzYW1wbGUpOworCQlUSUZGU2V0RmllbGQob3V0LCBUSUZGVEFHX1BIT1RPTUVUUklDLCBwaG90b21ldHJpYyk7CisJCVRJRkZTZXRGaWVsZChvdXQsIFRJRkZUQUdfUExBTkFSQ09ORklHLCBQTEFOQVJDT05GSUdfQ09OVElHKTsJLy8gc2luZ2xlIGltYWdlIHBsYW5lIAorCQlUSUZGU2V0RmllbGQob3V0LCBUSUZGVEFHX09SSUVOVEFUSU9OLCBPUklFTlRBVElPTl9UT1BMRUZUKTsKKwkJVElGRlNldEZpZWxkKG91dCwgVElGRlRBR19GSUxMT1JERVIsIEZJTExPUkRFUl9NU0IyTFNCKTsKKwkJVElGRlNldEZpZWxkKG91dCwgVElGRlRBR19ST1dTUEVSU1RSSVAsIFRJRkZEZWZhdWx0U3RyaXBTaXplKG91dCwgKHVpbnQzMikgLTEpKTsgCisKKwkJLy8gaGFuZGxlIG1ldHJpY3MKKworCQlXcml0ZVJlc29sdXRpb24ob3V0LCBkaWIpOworCisJCS8vIG11bHRpLXBhZ2luZworCisJCWlmIChwYWdlID49IDApIHsKKwkJCWNoYXIgcGFnZV9udW1iZXJbMjBdOworCQkJc3ByaW50ZihwYWdlX251bWJlciwgIlBhZ2UgJWQiLCBwYWdlKTsKKworCQkJVElGRlNldEZpZWxkKG91dCwgVElGRlRBR19TVUJGSUxFVFlQRSwgKHVpbnQzMilGSUxFVFlQRV9QQUdFKTsKKwkJCVRJRkZTZXRGaWVsZChvdXQsIFRJRkZUQUdfUEFHRU5VTUJFUiwgKHVpbnQxNilwYWdlLCAodWludDE2KTApOworCQkJVElGRlNldEZpZWxkKG91dCwgVElGRlRBR19QQUdFTkFNRSwgcGFnZV9udW1iZXIpOworCisJCX0gZWxzZSB7CisJCQkvLyBpcyBpdCBhIHRodW1ibmFpbCA/IAorCQkJVElGRlNldEZpZWxkKG91dCwgVElGRlRBR19TVUJGSUxFVFlQRSwgKGlmZCA9PSAwKSA/ICh1aW50MzIpMCA6ICh1aW50MzIpRklMRVRZUEVfUkVEVUNFRElNQUdFKTsKKwkJfQorCisJCS8vIHBhbGV0dGVzIChpbWFnZSBjb2xvcm1hcHMgYXJlIGF1dG9tYXRpY2FsbHkgc2NhbGVkIHRvIDE2LWJpdHMpCisKKwkJaWYgKHBob3RvbWV0cmljID09IFBIT1RPTUVUUklDX1BBTEVUVEUpIHsKKwkJCXVpbnQxNiAqciwgKmcsICpiOworCQkJdWludDE2IG5Db2xvcnMgPSAodWludDE2KUZyZWVJbWFnZV9HZXRDb2xvcnNVc2VkKGRpYik7CisJCQlSR0JRVUFEICpwYWwgPSBGcmVlSW1hZ2VfR2V0UGFsZXR0ZShkaWIpOworCisJCQlyID0gKHVpbnQxNiAqKSBfVElGRm1hbGxvYyhzaXplb2YodWludDE2KSAqIDMgKiBuQ29sb3JzKTsKKwkJCWlmKHIgPT0gTlVMTCkgeworCQkJCXRocm93IEZJX01TR19FUlJPUl9NRU1PUlk7CisJCQl9CisJCQlnID0gciArIG5Db2xvcnM7CisJCQliID0gZyArIG5Db2xvcnM7CisKKwkJCWZvciAoaW50IGkgPSBuQ29sb3JzIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJCQlyW2ldID0gU0NBTEUoKHVpbnQxNilwYWxbaV0ucmdiUmVkKTsKKwkJCQlnW2ldID0gU0NBTEUoKHVpbnQxNilwYWxbaV0ucmdiR3JlZW4pOworCQkJCWJbaV0gPSBTQ0FMRSgodWludDE2KXBhbFtpXS5yZ2JCbHVlKTsKKwkJCX0KKworCQkJVElGRlNldEZpZWxkKG91dCwgVElGRlRBR19DT0xPUk1BUCwgciwgZywgYik7CisKKwkJCV9USUZGZnJlZShyKTsKKwkJfQorCisJCS8vIGNvbXByZXNzaW9uIHRhZworCisJCVdyaXRlQ29tcHJlc3Npb24ob3V0LCBiaXRzcGVyc2FtcGxlLCBzYW1wbGVzcGVycGl4ZWwsIHBob3RvbWV0cmljLCBmbGFncyk7CisKKwkJLy8gbWV0YWRhdGEKKworCQlXcml0ZU1ldGFkYXRhKG91dCwgZGliKTsKKworCQkvLyB0aHVtYm5haWwgdGFnCisKKwkJaWYoKGlmZCA9PSAwKSAmJiAoaWZkQ291bnQgPiAxKSkgeworCQkJdWludDE2IG5zdWJpZmQgPSAxOworCQkJdWludDY0IHN1YmlmZFsxXTsKKwkJCXN1YmlmZFswXSA9IDA7CisJCQlUSUZGU2V0RmllbGQob3V0LCBUSUZGVEFHX1NVQklGRCwgbnN1YmlmZCwgc3ViaWZkKTsKKwkJfQorCisJCS8vIHJlYWQgdGhlIERJQiBsaW5lcyBmcm9tIGJvdHRvbSB0byB0b3AKKwkJLy8gYW5kIHNhdmUgdGhlbSBpbiB0aGUgVElGCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCisJCWNvbnN0IHVpbnQzMiBwaXRjaCA9IEZyZWVJbWFnZV9HZXRQaXRjaChkaWIpOworCisJCWlmKGltYWdlX3R5cGUgPT0gRklUX0JJVE1BUCkgeworCQkJLy8gc3RhbmRhcmQgYml0bWFwIHR5cGUKKwkJCisJCQlzd2l0Y2goYml0c3BlcnBpeGVsKSB7CisJCQkJY2FzZSAxIDoKKwkJCQljYXNlIDQgOgorCQkJCWNhc2UgOCA6CisJCQkJeworCQkJCQlpZigoYml0c3BlcnBpeGVsID09IDgpICYmIEZyZWVJbWFnZV9Jc1RyYW5zcGFyZW50KGRpYikpIHsKKwkJCQkJCS8vIDgtYml0IHRyYW5zcGFyZW50IHBpY3R1cmUgOiBjb252ZXJ0IHRvIDgtYml0ICsgOC1iaXQgYWxwaGEKKworCQkJCQkJLy8gZ2V0IHRoZSB0cmFuc3BhcmVuY3kgdGFibGUKKwkJCQkJCUJZVEUgKnRybnMgPSBGcmVlSW1hZ2VfR2V0VHJhbnNwYXJlbmN5VGFibGUoZGliKTsKKworCQkJCQkJQllURSAqYnVmZmVyID0gKEJZVEUgKiltYWxsb2MoMiAqIHdpZHRoICogc2l6ZW9mKEJZVEUpKTsKKwkJCQkJCWlmKGJ1ZmZlciA9PSBOVUxMKSB7CisJCQkJCQkJdGhyb3cgRklfTVNHX0VSUk9SX01FTU9SWTsKKwkJCQkJCX0KKworCQkJCQkJZm9yIChpbnQgeSA9IGhlaWdodCAtIDE7IHkgPj0gMDsgeS0tKSB7CisJCQkJCQkJQllURSAqYml0cyA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIHkpOworCisJCQkJCQkJQllURSAqcCA9IGJpdHMsICpiID0gYnVmZmVyOworCisJCQkJCQkJZm9yKHVpbnQzMiB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQkJCQkJLy8gY29weSB0aGUgOC1iaXQgbGF5ZXIKKwkJCQkJCQkJYlswXSA9ICpwOworCQkJCQkJCQkvLyBjb252ZXJ0IHRoZSB0cm5zIHRhYmxlIHRvIGEgOC1iaXQgYWxwaGEgbGF5ZXIKKwkJCQkJCQkJYlsxXSA9IHRybnNbIGJbMF0gXTsKKworCQkJCQkJCQlwKys7CisJCQkJCQkJCWIgKz0gc2FtcGxlc3BlcnBpeGVsOworCQkJCQkJCX0KKworCQkJCQkJCS8vIHdyaXRlIHRoZSBzY2FubGluZSB0byBkaXNjCisKKwkJCQkJCQlUSUZGV3JpdGVTY2FubGluZShvdXQsIGJ1ZmZlciwgaGVpZ2h0IC0geSAtIDEsIDApOworCQkJCQkJfQorCisJCQkJCQlmcmVlKGJ1ZmZlcik7CisJCQkJCX0KKwkJCQkJZWxzZSB7CisJCQkJCQkvLyBvdGhlciBjYXNlcworCQkJCQkJQllURSAqYnVmZmVyID0gKEJZVEUgKiltYWxsb2MocGl0Y2ggKiBzaXplb2YoQllURSkpOworCQkJCQkJaWYoYnVmZmVyID09IE5VTEwpIHsKKwkJCQkJCQl0aHJvdyBGSV9NU0dfRVJST1JfTUVNT1JZOworCQkJCQkJfQorCisJCQkJCQlmb3IgKHVpbnQzMiB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisJCQkJCQkJLy8gZ2V0IGEgY29weSBvZiB0aGUgc2NhbmxpbmUKKwkJCQkJCQltZW1jcHkoYnVmZmVyLCBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCBoZWlnaHQgLSB5IC0gMSksIHBpdGNoKTsKKwkJCQkJCQkvLyB3cml0ZSB0aGUgc2NhbmxpbmUgdG8gZGlzYworCQkJCQkJCVRJRkZXcml0ZVNjYW5saW5lKG91dCwgYnVmZmVyLCB5LCAwKTsKKwkJCQkJCX0KKwkJCQkJCWZyZWUoYnVmZmVyKTsKKwkJCQkJfQorCisJCQkJCWJyZWFrOworCQkJCX0JCQkJCisKKwkJCQljYXNlIDI0OgorCQkJCWNhc2UgMzI6CisJCQkJeworCQkJCQlCWVRFICpidWZmZXIgPSAoQllURSAqKW1hbGxvYyhwaXRjaCAqIHNpemVvZihCWVRFKSk7CisJCQkJCWlmKGJ1ZmZlciA9PSBOVUxMKSB7CisJCQkJCQl0aHJvdyBGSV9NU0dfRVJST1JfTUVNT1JZOworCQkJCQl9CisKKwkJCQkJZm9yICh1aW50MzIgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworCQkJCQkJLy8gZ2V0IGEgY29weSBvZiB0aGUgc2NhbmxpbmUKKworCQkJCQkJbWVtY3B5KGJ1ZmZlciwgRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgaGVpZ2h0IC0geSAtIDEpLCBwaXRjaCk7CisKKyNpZiBGUkVFSU1BR0VfQ09MT1JPUkRFUiA9PSBGUkVFSU1BR0VfQ09MT1JPUkRFUl9CR1IKKwkJCQkJCWlmIChwaG90b21ldHJpYyAhPSBQSE9UT01FVFJJQ19TRVBBUkFURUQpIHsKKwkJCQkJCQkvLyBUSUZGcyBzdG9yZSBjb2xvciBkYXRhIFJHQihBKSBpbnN0ZWFkIG9mIEJHUihBKQorCQkKKwkJCQkJCQlCWVRFICpwQnVmID0gYnVmZmVyOworCQkKKwkJCQkJCQlmb3IgKHVpbnQzMiB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQkJCQkJSU5QTEFDRVNXQVAocEJ1ZlswXSwgcEJ1ZlsyXSk7CisJCQkJCQkJCXBCdWYgKz0gc2FtcGxlc3BlcnBpeGVsOworCQkJCQkJCX0KKwkJCQkJCX0KKyNlbmRpZgorCQkJCQkJLy8gd3JpdGUgdGhlIHNjYW5saW5lIHRvIGRpc2MKKworCQkJCQkJVElGRldyaXRlU2NhbmxpbmUob3V0LCBidWZmZXIsIHksIDApOworCQkJCQl9CisKKwkJCQkJZnJlZShidWZmZXIpOworCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0vLzwgc3dpdGNoIChiaXRzcGVycGl4ZWwpCisKKwkJfSBlbHNlIGlmKGltYWdlX3R5cGUgPT0gRklUX1JHQkYgJiYgKGZsYWdzICYgVElGRl9MT0dMVVYpID09IFRJRkZfTE9HTFVWKSB7CisJCQkvLyBSR0JGIGltYWdlID0+IHN0b3JlIGFzIFhZWiB1c2luZyBhIExvZ0x1diBlbmNvZGluZworCisJCQlCWVRFICpidWZmZXIgPSAoQllURSAqKW1hbGxvYyhwaXRjaCAqIHNpemVvZihCWVRFKSk7CisJCQlpZihidWZmZXIgPT0gTlVMTCkgeworCQkJCXRocm93IEZJX01TR19FUlJPUl9NRU1PUlk7CisJCQl9CisKKwkJCWZvciAodWludDMyIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJCQkvLyBnZXQgYSBjb3B5IG9mIHRoZSBzY2FubGluZSBhbmQgY29udmVydCBmcm9tIFJHQiB0byBYWVoKKwkJCQl0aWZmX0NvbnZlcnRMaW5lUkdCVG9YWVooYnVmZmVyLCBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCBoZWlnaHQgLSB5IC0gMSksIHdpZHRoKTsKKwkJCQkvLyB3cml0ZSB0aGUgc2NhbmxpbmUgdG8gZGlzYworCQkJCVRJRkZXcml0ZVNjYW5saW5lKG91dCwgYnVmZmVyLCB5LCAwKTsKKwkJCX0KKwkJCWZyZWUoYnVmZmVyKTsKKwkJfSBlbHNlIHsKKwkJCS8vIGp1c3QgZHVtcCB0aGUgZGliICh0aWZmIHN1cHBvcnRzIGFsbCBkaWIgdHlwZXMpCisJCQkKKwkJCUJZVEUgKmJ1ZmZlciA9IChCWVRFICopbWFsbG9jKHBpdGNoICogc2l6ZW9mKEJZVEUpKTsKKwkJCWlmKGJ1ZmZlciA9PSBOVUxMKSB7CisJCQkJdGhyb3cgRklfTVNHX0VSUk9SX01FTU9SWTsKKwkJCX0KKwkJCQorCQkJZm9yICh1aW50MzIgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworCQkJCS8vIGdldCBhIGNvcHkgb2YgdGhlIHNjYW5saW5lCisJCQkJbWVtY3B5KGJ1ZmZlciwgRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgaGVpZ2h0IC0geSAtIDEpLCBwaXRjaCk7CisJCQkJLy8gd3JpdGUgdGhlIHNjYW5saW5lIHRvIGRpc2MKKwkJCQlUSUZGV3JpdGVTY2FubGluZShvdXQsIGJ1ZmZlciwgeSwgMCk7CisJCQl9CisJCQlmcmVlKGJ1ZmZlcik7CisJCX0KKworCQkvLyB3cml0ZSBvdXQgdGhlIGRpcmVjdG9yeSB0YWcgaWYgd2Ugd3JvdGUgYSBwYWdlIG90aGVyIHRoYW4gLTEgb3IgaWYgd2UgaGF2ZSBhIHRodW1ibmFpbCB0byB3cml0ZSBsYXRlcgorCisJCWlmKCAocGFnZSA+PSAwKSB8fCAoKGlmZCA9PSAwKSAmJiAoaWZkQ291bnQgPiAxKSkgKSB7CisJCQlUSUZGV3JpdGVEaXJlY3Rvcnkob3V0KTsKKwkJCS8vIGVsc2U6IFRJRkZDbG9zZSB3aWxsIFdyaXRlRGlyZWN0b3J5CisJCX0KKworCQlyZXR1cm4gVFJVRTsKKwkJCisJfSBjYXRjaChjb25zdCBjaGFyICp0ZXh0KSB7CisJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhzX2Zvcm1hdF9pZCwgdGV4dCk7CisJCXJldHVybiBGQUxTRTsKKwl9IAorfQorCitzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYKK1NhdmUoRnJlZUltYWdlSU8gKmlvLCBGSUJJVE1BUCAqZGliLCBmaV9oYW5kbGUgaGFuZGxlLCBpbnQgcGFnZSwgaW50IGZsYWdzLCB2b2lkICpkYXRhKSB7CisJQk9PTCBiUmVzdWx0ID0gRkFMU0U7CisJCisJLy8gaGFuZGxlIHRodW1ibmFpbCBhcyBTdWJJRkQKKwljb25zdCBCT09MIGJIYXNUaHVtYm5haWwgPSAoRnJlZUltYWdlX0dldFRodW1ibmFpbChkaWIpICE9IE5VTEwpOworCWNvbnN0IHVuc2lnbmVkIGlmZENvdW50ID0gYkhhc1RodW1ibmFpbCA/IDIgOiAxOworCQorCUZJQklUTUFQICpiaXRtYXAgPSBkaWI7CisKKwlmb3IodW5zaWduZWQgaWZkID0gMDsgaWZkIDwgaWZkQ291bnQ7IGlmZCsrKSB7CisJCS8vIHJlZGlyZWN0IGRpYiB0byB0aHVtYm5haWwgZm9yIHRoZSBzZWNvbmQgcGFzcworCQlpZihpZmQgPT0gMSkgeworCQkJYml0bWFwID0gRnJlZUltYWdlX0dldFRodW1ibmFpbChkaWIpOworCQl9CisKKwkJYlJlc3VsdCA9IFNhdmVPbmVUSUZGKGlvLCBiaXRtYXAsIGhhbmRsZSwgcGFnZSwgZmxhZ3MsIGRhdGEsIGlmZCwgaWZkQ291bnQpOworCQlpZighYlJlc3VsdCkgeworCQkJcmV0dXJuIEZBTFNFOworCQl9CisJfQorCisJcmV0dXJuIGJSZXN1bHQ7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICAgSW5pdAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit2b2lkIERMTF9DQUxMQ09OVgorSW5pdFRJRkYoUGx1Z2luICpwbHVnaW4sIGludCBmb3JtYXRfaWQpIHsKKwlzX2Zvcm1hdF9pZCA9IGZvcm1hdF9pZDsKKworICAgIC8vIFNldCB1cCB0aGUgY2FsbGJhY2sgZm9yIGV4dGVuZGVkIFRJRkYgZGlyZWN0b3J5IHRhZyBzdXBwb3J0IChzZWUgWFRJRkYuY3BwKQorCS8vIE11c3QgYmUgY2FsbGVkIGJlZm9yZSB1c2luZyBsaWJ0aWZmCisgICAgWFRJRkZJbml0aWFsaXplKCk7CQorCisJcGx1Z2luLT5mb3JtYXRfcHJvYyA9IEZvcm1hdDsKKwlwbHVnaW4tPmRlc2NyaXB0aW9uX3Byb2MgPSBEZXNjcmlwdGlvbjsKKwlwbHVnaW4tPmV4dGVuc2lvbl9wcm9jID0gRXh0ZW5zaW9uOworCXBsdWdpbi0+cmVnZXhwcl9wcm9jID0gUmVnRXhwcjsKKwlwbHVnaW4tPm9wZW5fcHJvYyA9IE9wZW47CisJcGx1Z2luLT5jbG9zZV9wcm9jID0gQ2xvc2U7CisJcGx1Z2luLT5wYWdlY291bnRfcHJvYyA9IFBhZ2VDb3VudDsKKwlwbHVnaW4tPnBhZ2VjYXBhYmlsaXR5X3Byb2MgPSBOVUxMOworCXBsdWdpbi0+bG9hZF9wcm9jID0gTG9hZDsKKwlwbHVnaW4tPnNhdmVfcHJvYyA9IFNhdmU7CisJcGx1Z2luLT52YWxpZGF0ZV9wcm9jID0gVmFsaWRhdGU7CisJcGx1Z2luLT5taW1lX3Byb2MgPSBNaW1lVHlwZTsKKwlwbHVnaW4tPnN1cHBvcnRzX2V4cG9ydF9icHBfcHJvYyA9IFN1cHBvcnRzRXhwb3J0RGVwdGg7CisJcGx1Z2luLT5zdXBwb3J0c19leHBvcnRfdHlwZV9wcm9jID0gU3VwcG9ydHNFeHBvcnRUeXBlOworCXBsdWdpbi0+c3VwcG9ydHNfaWNjX3Byb2ZpbGVzX3Byb2MgPSBTdXBwb3J0c0lDQ1Byb2ZpbGVzOworCXBsdWdpbi0+c3VwcG9ydHNfbm9fcGl4ZWxzX3Byb2MgPSBTdXBwb3J0c05vUGl4ZWxzOyAKK30KZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvUGx1Z2luV0JNUC5jcHAgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL1BsdWdpbldCTVAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZjhmMDIKLS0tIC9kZXYvbnVsbAorKysgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL1BsdWdpbldCTVAuY3BwCkBAIC0wLDAgKzEsMzcyIEBACisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBXaXJlbGVzcyBCaXRtYXAgRm9ybWF0IExvYWRlciBhbmQgV3JpdGVyCisvLworLy8gRGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBieQorLy8gLSBIZXJ26SBEcm9sb24gPGRyb2xvbkBpbmZvbmllLmZyPgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZyZWVJbWFnZSAzCisvLworLy8gQ09WRVJFRCBDT0RFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZCisvLyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUworLy8gVEhBVCBUSEUgQ09WRVJFRCBDT0RFIElTIEZSRUUgT0YgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisvLyBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRAorLy8gQ09ERSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVAorLy8gVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GIEFOWSBORUNFU1NBUlkKKy8vIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwKKy8vIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIKKy8vIFRISVMgRElTQ0xBSU1FUi4KKy8vCisvLyBVc2UgYXQgeW91ciBvd24gcmlzayEKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2luY2x1ZGUgIkZyZWVJbWFnZS5oIgorI2luY2x1ZGUgIlV0aWxpdGllcy5oIgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBXaXJlbGVzcyBCaXRtYXAgRm9ybWF0CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUaGUgV0JNUCBmb3JtYXQgZW5hYmxlcyBncmFwaGljYWwgaW5mb3JtYXRpb24gdG8gYmUgc2VudCB0byBhIHZhcmlldHkgb2YgaGFuZHNldHMuCisvLyBUaGUgV0JNUCBmb3JtYXQgaXMgdGVybWluYWwgaW5kZXBlbmRlbnQgYW5kIGRlc2NyaWJlcyBvbmx5IGdyYXBoaWNhbCBpbmZvcm1hdGlvbi4KKworLy8gSU1QTEVNRU5UQVRJT04gTk9URVM6CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRoZSBXQk1QIGZvcm1hdCBpcyBjb25maWd1cmVkIGFjY29yZGluZyB0byBhIHR5cGUgZmllbGQgdmFsdWUgKFR5cGVGaWVsZCBiZWxvdyksCisvLyB3aGljaCBtYXBzIHRvIGFsbCByZWxldmFudCBpbWFnZSBlbmNvZGluZyBpbmZvcm1hdGlvbiwgc3VjaCBhczoKKy8vILcgUGl4ZWwgb3JnYW5pc2F0aW9uIGFuZCBlbmNvZGluZworLy8gtyBQYWxldHRlIG9yZ2FuaXNhdGlvbiBhbmQgZW5jb2RpbmcKKy8vILcgQ29tcHJlc3Npb24gY2hhcmFjdGVyaXN0aWNzCisvLyC3IEFuaW1hdGlvbiBlbmNvZGluZworLy8gRm9yIGVhY2ggVHlwZUZpZWxkIHZhbHVlLCBhbGwgcmVsZXZhbnQgaW1hZ2UgY2hhcmFjdGVyaXN0aWNzIGFyZSAKKy8vIGZ1bGx5IHNwZWNpZmllZCBhcyBwYXJ0IG9mIHRoZSBXQVAgZG9jdW1lbnRhdGlvbi4KKy8vIEN1cnJlbnRseSwgYSBzaW1wbGUgY29tcGFjdCwgbW9ub2Nocm9tZSBpbWFnZSBmb3JtYXQgaXMgZGVmaW5lZAorLy8gd2l0aGluIHRoZSBXQk1QIHR5cGUgc3BhY2UgOgorLy8KKy8vIEltYWdlIFR5cGUgSWRlbnRpZmllciwgbXVsdGktYnl0ZSBpbnRlZ2VyCTAKKy8vIEltYWdlIEZvcm1hdCBkZXNjcmlwdGlvbgkJCQkJCTAgQi9XLCBubyBjb21wcmVzc2lvbgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBXQk1QIEhlYWRlcgorCisjaWZkZWYgX1dJTjMyCisjcHJhZ21hIHBhY2socHVzaCwgMSkKKyNlbHNlCisjcHJhZ21hIHBhY2soMSkKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB0YWdXQk1QSEVBREVSIHsKKwlXT1JEIFR5cGVGaWVsZDsJCQkvLyBJbWFnZSB0eXBlIGlkZW50aWZpZXIgb2YgbXVsdGktYnl0ZSBsZW5ndGgKKwlCWVRFIEZpeEhlYWRlckZpZWxkOwkvLyBPY3RldCBvZiBnZW5lcmFsIGhlYWRlciBpbmZvcm1hdGlvbgorCUJZVEUgRXh0SGVhZGVyRmllbGRzOwkvLyBaZXJvIG9yIG1vcmUgZXh0ZW5zaW9uIGhlYWRlciBmaWVsZHMKKwlXT1JEIFdpZHRoOwkJCQkvLyBNdWx0aS1ieXRlIHdpZHRoIGZpZWxkCisJV09SRCBIZWlnaHQ7CQkJLy8gTXVsdGktYnl0ZSBoZWlnaHQgZmllbGQKK30gV0JNUEhFQURFUjsKKworI2lmZGVmIF9XSU4zMgorI3ByYWdtYSBwYWNrKHBvcCkKKyNlbHNlCisjcHJhZ21hIHBhY2soKQorI2VuZGlmCisKKy8vIFRoZSBleHRlbnNpb24gaGVhZGVycyBtYXkgYmUgb2YgdHlwZSBiaW5hcnkgMDAgdGhyb3VnaCBiaW5hcnkgMTEsIGRlZmluZWQgYXMgZm9sbG93cy4KKworLy8gLSBUeXBlIDAwIGluZGljYXRlcyBhIG11bHRpLWJ5dGUgYml0ZmllbGQgdXNlZCB0byBzcGVjaWZ5IGFkZGl0aW9uYWwgaGVhZGVyIGluZm9ybWF0aW9uLgorLy8gVGhlIGZpcnN0IGJpdCBpcyBzZXQgaWYgYSB0eXBlIDAwLCBleHRlbnNpb24gaGVhZGVyIGlzIHNldCBpZiBtb3JlIGRhdGEgZm9sbG93cy4KKy8vICBUaGUgb3RoZXIgYml0cyBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuCisvLyAtIFR5cGUgMDEgLSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4KKy8vIC0gVHlwZSAxMCAtIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlLgorLy8gLSBUeXBlIDExIGluZGljYXRlcyBhIHNlcXVlbmNlIG9mIHBhcmFtZXRlci92YWx1ZSBwYWlycy4gVGhlc2UgY2FuIGJlIHVzZWQgZm9yIAorLy8gb3B0aW1pc2F0aW9ucyBhbmQgc3BlY2lhbCBwdXJwb3NlIGV4dGVuc2lvbnMsIGVnLCBhbmltYXRpb24gaW1hZ2UgZm9ybWF0cy4KKy8vIFRoZSBwYXJhbWV0ZXIgc2l6ZSB0ZWxscyB0aGUgbGVuZ3RoICgxLTggYnl0ZXMpIG9mIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyIG5hbWUuCisvLyBUaGUgdmFsdWUgc2l6ZSBnaXZlcyB0aGUgbGVuZ3RoICgxLTE2IGJ5dGVzKSBvZiB0aGUgZm9sbG93aW5nIHBhcmFtZXRlciB2YWx1ZS4KKy8vIFRoZSBjb25jYXRlbmF0aW9uIGZsYWcgaW5kaWNhdGVzIHdoZXRoZXIgYW5vdGhlciBwYXJhbWV0ZXIvdmFsdWUgcGFpciB3aWxsIGZvbGxvdworLy8gYWZ0ZXIgcmVhZGluZyB0aGUgc3BlY2lmaWVkIGJ5dGVzIG9mIGRhdGEuCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEludGVybmFsIGZ1bmN0aW9ucworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitzdGF0aWMgRFdPUkQKK211bHRpQnl0ZVJlYWQoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlKSB7CisJLy8gTXVsdGktYnl0ZSBlbmNvZGluZyAvIGRlY29kaW5nCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIEEgbXVsdGktYnl0ZSBpbnRlZ2VyIGNvbnNpc3RzIG9mIGEgc2VyaWVzIG9mIG9jdGV0cywgd2hlcmUgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0CisJLy8gaXMgdGhlIGNvbnRpbnVhdGlvbiBmbGFnLCBhbmQgdGhlIHJlbWFpbmluZyBzZXZlbiBiaXRzIGFyZSBhIHNjYWxhciB2YWx1ZS4KKwkvLyBUaGUgY29udGludWF0aW9uIGZsYWcgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IGFuIG9jdGV0IGlzIG5vdCB0aGUgZW5kIG9mIHRoZSBtdWx0aS1ieXRlCisJLy8gc2VxdWVuY2UuCisKKwlEV09SRCBPdXQgPSAwOworCUJZVEUgSW4gPSAwOworCisJd2hpbGUgKGlvLT5yZWFkX3Byb2MoJkluLCAxLCAxLCBoYW5kbGUpKSB7CisJCU91dCArPSAoSW4gJiAweDdGKTsKKworCQlpZiAoKEluICYgMHg4MCkgPT0gMHgwMCkKKwkJCWJyZWFrOworCisJCU91dCA8PD0gNzsKKwl9CisKKwlyZXR1cm4gT3V0OworfQorCitzdGF0aWMgdm9pZAorbXVsdGlCeXRlV3JpdGUoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBEV09SRCBJbikgeworCUJZVEUgT3V0LCBrID0gMTsKKyAgCisJd2hpbGUgKEluICYgKDB4N0YgPDwgNyprKSkKKwkJaysrOworICAKKwl3aGlsZSAoayA+IDEpIHsKKwkJay0tOworCisJCU91dCA9IChCWVRFKSgweDgwIHwgKEluID4+IDcqaykgJiAweEZGKTsKKworCQlpby0+d3JpdGVfcHJvYygmT3V0LCAxLCAxLCBoYW5kbGUpOworCX0KKworCU91dCA9IChCWVRFKShJbiAmIDB4N0YpOworCisJaW8tPndyaXRlX3Byb2MoJk91dCwgMSwgMSwgaGFuZGxlKTsKK30KKworc3RhdGljIHZvaWQKK3JlYWRFeHRIZWFkZXIoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBCWVRFIGIpIHsKKyAgICAvLyBFeHRlbnNpb24gaGVhZGVyIGZpZWxkcworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIFJlYWQgdGhlIGV4dGVuc2lvbiBoZWFkZXIgZmllbGRzCisgICAgLy8gKHNpbmNlIHdlIGRvbid0IHVzZSB0aGVtIGZvciB0aGUgbW9tZW50LCB3ZSBza2lwIHRoZW0pLgorCisJc3dpdGNoIChiICYgMHg2MCkgeworCQkvLyBUeXBlIDAwOiByZWFkIG11bHRpLWJ5dGUgYml0ZmllbGQKKworCQljYXNlIDB4MDA6CisJCXsKKwkJCURXT1JEIGluZm8gPSBtdWx0aUJ5dGVSZWFkKGlvLCBoYW5kbGUpOworCQkJYnJlYWs7CisJCX0JCQorCisJCS8vIFR5cGUgMTE6IHJlYWQgYSBzZXF1ZW5jZSBvZiBwYXJhbWV0ZXIvdmFsdWUgcGFpcnMuCisKKwkJY2FzZSAweDYwOgorCQl7CisJCQlCWVRFIHNpemVQYXJhbUlkZW50ID0gKGIgJiAweDcwKSA+PiA0OwkvLyBTaXplIG9mIFBhcmFtZXRlciBJZGVudGlmaWVyIChpbiBieXRlcykKKwkJCUJZVEUgc2l6ZVBhcmFtVmFsdWUgPSAoYiAmIDB4MEYpOwkJLy8gU2l6ZSBvZiBQYXJhbWV0ZXIgVmFsdWUgKGluIGJ5dGVzKQorCQkJCisJCQlCWVRFICpJZGVudCA9IChCWVRFKiltYWxsb2Moc2l6ZVBhcmFtSWRlbnQgKiBzaXplb2YoQllURSkpOworCQkJQllURSAqVmFsdWUgPSAoQllURSopbWFsbG9jKHNpemVQYXJhbVZhbHVlICogc2l6ZW9mKEJZVEUpKTsKKwkJCisJCQlpby0+cmVhZF9wcm9jKElkZW50LCBzaXplUGFyYW1JZGVudCwgMSwgaGFuZGxlKTsKKwkJCWlvLT5yZWFkX3Byb2MoVmFsdWUsIHNpemVQYXJhbVZhbHVlLCAxLCBoYW5kbGUpOworCQkJCisJCQlmcmVlKElkZW50KTsKKwkJCWZyZWUoVmFsdWUpOworCQkJYnJlYWs7CisJCX0JCQorCisJCS8vIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlCisKKwkJY2FzZSAweDIwOgkvLyBUeXBlIDAxCisJCWNhc2UgMHg0MDoJLy8gVHlwZSAxMAorCQkJYnJlYWs7CisJfQorfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBQbHVnaW4gSW50ZXJmYWNlCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3N0YXRpYyBpbnQgc19mb3JtYXRfaWQ7CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFBsdWdpbiBJbXBsZW1lbnRhdGlvbgorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgorRm9ybWF0KCkgeworCXJldHVybiAiV0JNUCI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCitEZXNjcmlwdGlvbigpIHsKKwlyZXR1cm4gIldpcmVsZXNzIEJpdG1hcCI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCitFeHRlbnNpb24oKSB7CisJcmV0dXJuICJ3YXAsd2JtcCx3Ym0iOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgorUmVnRXhwcigpIHsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKK01pbWVUeXBlKCkgeworCXJldHVybiAiaW1hZ2Uvdm5kLndhcC53Ym1wIjsKK30KKworc3RhdGljIEJPT0wgRExMX0NBTExDT05WCitTdXBwb3J0c0V4cG9ydERlcHRoKGludCBkZXB0aCkgeworCXJldHVybiAoCisJCShkZXB0aCA9PSAxKQorCQkpOworfQorCitzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYgCitTdXBwb3J0c0V4cG9ydFR5cGUoRlJFRV9JTUFHRV9UWVBFIHR5cGUpIHsKKwlyZXR1cm4gKHR5cGUgPT0gRklUX0JJVE1BUCkgPyBUUlVFIDogRkFMU0U7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIEZJQklUTUFQICogRExMX0NBTExDT05WCitMb2FkKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSwgaW50IHBhZ2UsIGludCBmbGFncywgdm9pZCAqZGF0YSkgeworCVdPUkQgeCwgeSwgd2lkdGgsIGhlaWdodDsKKwlGSUJJVE1BUCAqZGliOworICAgIEJZVEUgKmJpdHM7CQkvLyBwb2ludGVyIHRvIGRpYiBkYXRhCisJUkdCUVVBRCAqcGFsOwkvLyBwb2ludGVyIHRvIGRpYiBwYWxldHRlCisKKwlXQk1QSEVBREVSIGhlYWRlcjsKKworCWlmIChoYW5kbGUpIHsKKwkJdHJ5IHsKKwkJCS8vIFJlYWQgaGVhZGVyIGluZm9ybWF0aW9uCisJCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJCQkvLyBUeXBlCisKKwkJCWhlYWRlci5UeXBlRmllbGQgPSAoV09SRCltdWx0aUJ5dGVSZWFkKGlvLCBoYW5kbGUpOworCisJCQlpZiAoaGVhZGVyLlR5cGVGaWVsZCAhPSAwKSB7CisJCQkJdGhyb3cgRklfTVNHX0VSUk9SX1VOU1VQUE9SVEVEX0ZPUk1BVDsKKwkJCX0KKworCQkJLy8gRml4SGVhZGVyRmllbGQKKworCQkJaW8tPnJlYWRfcHJvYygmaGVhZGVyLkZpeEhlYWRlckZpZWxkLCAxLCAxLCBoYW5kbGUpOworCisJCQkvLyBFeHRIZWFkZXJGaWVsZHMKKwkJCS8vIDEgPSBtb3JlIHdpbGwgZm9sbG93LCAwID0gbGFzdCBvY3RldAorCisJCQlpZiAoaGVhZGVyLkZpeEhlYWRlckZpZWxkICYgMHg4MCkgeworCQkJCWhlYWRlci5FeHRIZWFkZXJGaWVsZHMgPSAweDgwOworCisJCQkJd2hpbGUoaGVhZGVyLkV4dEhlYWRlckZpZWxkcyAmIDB4ODApIHsKKwkJCQkJaW8tPnJlYWRfcHJvYygmaGVhZGVyLkV4dEhlYWRlckZpZWxkcywgMSwgMSwgaGFuZGxlKTsKKworCQkJCQlyZWFkRXh0SGVhZGVyKGlvLCBoYW5kbGUsIGhlYWRlci5FeHRIZWFkZXJGaWVsZHMpOworCQkJCX0KKwkJCX0KKworCQkJLy8gd2lkdGggJiBoZWlnaHQKKworCQkJd2lkdGggID0gKFdPUkQpbXVsdGlCeXRlUmVhZChpbywgaGFuZGxlKTsKKwkJCWhlaWdodCA9IChXT1JEKW11bHRpQnl0ZVJlYWQoaW8sIGhhbmRsZSk7CisKKwkJCS8vIEFsbG9jYXRlIGEgbmV3IGRpYgorCisJCQlkaWIgPSBGcmVlSW1hZ2VfQWxsb2NhdGUod2lkdGgsIGhlaWdodCwgMSk7CisJCQlpZiAoIWRpYikgeworCQkJCXRocm93IEZJX01TR19FUlJPUl9ESUJfTUVNT1JZOworCQkJfQorCisJCQkvLyB3cml0ZSB0aGUgcGFsZXR0ZSBkYXRhCisKKwkJCXBhbCA9IEZyZWVJbWFnZV9HZXRQYWxldHRlKGRpYik7CisJCQlwYWxbMF0ucmdiUmVkID0gcGFsWzBdLnJnYkdyZWVuID0gcGFsWzBdLnJnYkJsdWUgPSAwOworCQkJcGFsWzFdLnJnYlJlZCA9IHBhbFsxXS5yZ2JHcmVlbiA9IHBhbFsxXS5yZ2JCbHVlID0gMjU1OworCisJCQkvLyByZWFkIHRoZSBiaXRtYXAgZGF0YQorCQkJCisJCQlpbnQgbGluZSA9IEZyZWVJbWFnZV9HZXRMaW5lKGRpYik7CisKKwkJCWZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworCQkJCWJpdHMgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCBoZWlnaHQgLSAxIC0geSk7CisKKwkJCQlmb3IgKHggPSAwOyB4IDwgbGluZTsgeCsrKSB7CisJCQkJCWlvLT5yZWFkX3Byb2MoJmJpdHNbeF0sIDEsIDEsIGhhbmRsZSk7CisJCQkJfQorCQkJfQorCisJCQlyZXR1cm4gZGliOworCisJCX0gY2F0Y2goY29uc3QgY2hhciAqdGV4dCkgIHsKKwkJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhzX2Zvcm1hdF9pZCwgdGV4dCk7CisKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIEJPT0wgRExMX0NBTExDT05WCitTYXZlKEZyZWVJbWFnZUlPICppbywgRklCSVRNQVAgKmRpYiwgZmlfaGFuZGxlIGhhbmRsZSwgaW50IHBhZ2UsIGludCBmbGFncywgdm9pZCAqZGF0YSkgeworICAgIEJZVEUgKmJpdHM7CS8vIHBvaW50ZXIgdG8gZGliIGRhdGEKKworCWlmICgoZGliKSAmJiAoaGFuZGxlKSkgeworCQl0cnkgeworCQkJaWYgKEZyZWVJbWFnZV9HZXRCUFAoZGliKSAhPSAxKQorCQkJCXRocm93ICJPbmx5IDEtYml0IGRlcHRoIGJpdG1hcHMgY2FuIGJlIHNhdmVkIGFzIFdCTVAiOworCisJCQkvLyB3cml0ZSB0aGUgaGVhZGVyCisKKwkJCVdCTVBIRUFERVIgaGVhZGVyOworCQkJaGVhZGVyLlR5cGVGaWVsZCA9IDA7CQkJCQkJCQkvLyBUeXBlIDA6IEIvVywgbm8gY29tcHJlc3Npb24KKwkJCWhlYWRlci5GaXhIZWFkZXJGaWVsZCA9IDA7CQkJCQkJCS8vIE5vIEV4dEhlYWRlckZpZWxkCisJCQloZWFkZXIuV2lkdGggPSAoV09SRClGcmVlSW1hZ2VfR2V0V2lkdGgoZGliKTsJCS8vIEltYWdlIHdpZHRoCisJCQloZWFkZXIuSGVpZ2h0ID0gKFdPUkQpRnJlZUltYWdlX0dldEhlaWdodChkaWIpOwkJLy8gSW1hZ2UgaGVpZ2h0CisKKwkJCW11bHRpQnl0ZVdyaXRlKGlvLCBoYW5kbGUsIGhlYWRlci5UeXBlRmllbGQpOworCQkJCisJCQlpby0+d3JpdGVfcHJvYygmaGVhZGVyLkZpeEhlYWRlckZpZWxkLCAxLCAxLCBoYW5kbGUpOworCisJCQltdWx0aUJ5dGVXcml0ZShpbywgaGFuZGxlLCBoZWFkZXIuV2lkdGgpOworCQkJbXVsdGlCeXRlV3JpdGUoaW8sIGhhbmRsZSwgaGVhZGVyLkhlaWdodCk7CisKKwkJCS8vIHdyaXRlIHRoZSBiaXRtYXAgZGF0YQorCisJCQlXT1JEIGxpbmVsZW5ndGggPSAoV09SRClGcmVlSW1hZ2VfR2V0TGluZShkaWIpOworCisJCQlmb3IgKFdPUkQgeSA9IDA7IHkgPCBoZWFkZXIuSGVpZ2h0OyB5KyspIHsKKwkJCQliaXRzID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgaGVhZGVyLkhlaWdodCAtIDEgLSB5KTsKKworCQkJCWlvLT53cml0ZV9wcm9jKCZiaXRzWzBdLCBsaW5lbGVuZ3RoLCAxLCBoYW5kbGUpOworCQkJfQorCisJCQlyZXR1cm4gVFJVRTsKKworCQl9IGNhdGNoIChjb25zdCBjaGFyKiB0ZXh0KSB7CisJCQlGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2Moc19mb3JtYXRfaWQsIHRleHQpOworCQl9CisJfQorCisJcmV0dXJuIEZBTFNFOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgIEluaXQKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwordm9pZCBETExfQ0FMTENPTlYKK0luaXRXQk1QKFBsdWdpbiAqcGx1Z2luLCBpbnQgZm9ybWF0X2lkKSB7CisJc19mb3JtYXRfaWQgPSBmb3JtYXRfaWQ7CisKKwlwbHVnaW4tPmZvcm1hdF9wcm9jID0gRm9ybWF0OworCXBsdWdpbi0+ZGVzY3JpcHRpb25fcHJvYyA9IERlc2NyaXB0aW9uOworCXBsdWdpbi0+ZXh0ZW5zaW9uX3Byb2MgPSBFeHRlbnNpb247CisJcGx1Z2luLT5yZWdleHByX3Byb2MgPSBSZWdFeHByOworCXBsdWdpbi0+b3Blbl9wcm9jID0gTlVMTDsKKwlwbHVnaW4tPmNsb3NlX3Byb2MgPSBOVUxMOworCXBsdWdpbi0+cGFnZWNvdW50X3Byb2MgPSBOVUxMOworCXBsdWdpbi0+cGFnZWNhcGFiaWxpdHlfcHJvYyA9IE5VTEw7CisJcGx1Z2luLT5sb2FkX3Byb2MgPSBMb2FkOworCXBsdWdpbi0+c2F2ZV9wcm9jID0gU2F2ZTsKKwlwbHVnaW4tPnZhbGlkYXRlX3Byb2MgPSBOVUxMOworCXBsdWdpbi0+bWltZV9wcm9jID0gTWltZVR5cGU7CisJcGx1Z2luLT5zdXBwb3J0c19leHBvcnRfYnBwX3Byb2MgPSBTdXBwb3J0c0V4cG9ydERlcHRoOworCXBsdWdpbi0+c3VwcG9ydHNfZXhwb3J0X3R5cGVfcHJvYyA9IFN1cHBvcnRzRXhwb3J0VHlwZTsKKwlwbHVnaW4tPnN1cHBvcnRzX2ljY19wcm9maWxlc19wcm9jID0gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvUGx1Z2luV2ViUC5jcHAgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL1BsdWdpbldlYlAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZTY4NzMKLS0tIC9kZXYvbnVsbAorKysgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL1BsdWdpbldlYlAuY3BwCkBAIC0wLDAgKzEsNjk2IEBACisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBHb29nbGUgV2ViUCBMb2FkZXIgJiBXcml0ZXIKKy8vCisvLyBEZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIGJ5CisvLyAtIEhlcnZlIERyb2xvbiAoZHJvbG9uQGluZm9uaWUuZnIpCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRnJlZUltYWdlIDMKKy8vCisvLyBDT1ZFUkVEIENPREUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkKKy8vIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTCisvLyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy8vIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVECisvLyBDT0RFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UCisvLyBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWQorLy8gU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTAorLy8gUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUgorLy8gVEhJUyBESVNDTEFJTUVSLgorLy8KKy8vIFVzZSBhdCB5b3VyIG93biByaXNrIQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaW5jbHVkZSAiRnJlZUltYWdlLmgiCisjaW5jbHVkZSAiVXRpbGl0aWVzLmgiCisKKyNpbmNsdWRlICIuLi9NZXRhZGF0YS9GcmVlSW1hZ2VUYWcuaCIKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2xpYndlYnAvd2VicC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2xpYndlYnAvd2VicC9tdXguaCIKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gUGx1Z2luIEludGVyZmFjZQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitzdGF0aWMgaW50IHNfZm9ybWF0X2lkOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgIEhlbHBlcnMgZm9yIHRoZSBsb2FkIGZ1bmN0aW9uCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qKgorUmVhZCB0aGUgd2hvbGUgZmlsZSBpbnRvIG1lbW9yeQorKi8KK3N0YXRpYyBCT09MCitSZWFkRmlsZVRvV2ViUERhdGEoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBXZWJQRGF0YSAqIGNvbnN0IGJpdHN0cmVhbSkgeworICB1aW50OF90ICpyYXdfZGF0YSA9IE5VTEw7CisKKyAgdHJ5IHsKKwkgIC8vIFJlYWQgdGhlIGlucHV0IGZpbGUgYW5kIHB1dCBpdCBpbiBtZW1vcnkKKwkgIGxvbmcgc3RhcnRfcG9zID0gaW8tPnRlbGxfcHJvYyhoYW5kbGUpOworCSAgaW8tPnNlZWtfcHJvYyhoYW5kbGUsIDAsIFNFRUtfRU5EKTsKKwkgIHNpemVfdCBmaWxlX2xlbmd0aCA9IChzaXplX3QpKGlvLT50ZWxsX3Byb2MoaGFuZGxlKSAtIHN0YXJ0X3Bvcyk7CisJICBpby0+c2Vla19wcm9jKGhhbmRsZSwgc3RhcnRfcG9zLCBTRUVLX1NFVCk7CisJICByYXdfZGF0YSA9ICh1aW50OF90KiltYWxsb2MoZmlsZV9sZW5ndGggKiBzaXplb2YodWludDhfdCkpOworCSAgaWYoIXJhd19kYXRhKSB7CisJCSAgdGhyb3cgRklfTVNHX0VSUk9SX01FTU9SWTsKKwkgIH0KKwkgIGlmKGlvLT5yZWFkX3Byb2MocmF3X2RhdGEsIDEsICh1bnNpZ25lZClmaWxlX2xlbmd0aCwgaGFuZGxlKSAhPSBmaWxlX2xlbmd0aCkgeworCQkgIHRocm93ICJFcnJvciB3aGlsZSByZWFkaW5nIGlucHV0IHN0cmVhbSI7CisJICB9CisJICAKKwkgIC8vIGNvcHkgcG9pbnRlcnMgKG11c3QgYmUgcmVsZWFzZWQgbGF0ZXIgdXNpbmcgZnJlZSkKKwkgIGJpdHN0cmVhbS0+Ynl0ZXMgPSByYXdfZGF0YTsKKwkgIGJpdHN0cmVhbS0+c2l6ZSA9IGZpbGVfbGVuZ3RoOworCisJICByZXR1cm4gVFJVRTsKKworICB9IGNhdGNoKGNvbnN0IGNoYXIgKnRleHQpIHsKKwkgIGlmKHJhd19kYXRhKSB7CisJCSAgZnJlZShyYXdfZGF0YSk7CisJICB9CisJICBtZW1zZXQoYml0c3RyZWFtLCAwLCBzaXplb2YoV2ViUERhdGEpKTsKKwkgIGlmKE5VTEwgIT0gdGV4dCkgeworCQkgIEZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhzX2Zvcm1hdF9pZCwgdGV4dCk7CisJICB9CisJICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICBIZWxwZXJzIGZvciB0aGUgc2F2ZSBmdW5jdGlvbgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKioKK091dHB1dCBmdW5jdGlvbi4gU2hvdWxkIHJldHVybiAxIGlmIHdyaXRpbmcgd2FzIHN1Y2Nlc3NmdWwuCitkYXRhL2RhdGFfc2l6ZSBpcyB0aGUgc2VnbWVudCBvZiBkYXRhIHRvIHdyaXRlLCBhbmQgJ3BpY3R1cmUnIGlzIGZvcgorcmVmZXJlbmNlIChhbmQgc28gb25lIGNhbiBtYWtlIHVzZSBvZiBwaWN0dXJlLT5jdXN0b21fcHRyKS4KKyovCitzdGF0aWMgaW50IAorV2ViUF9NZW1vcnlXcml0ZXIoY29uc3QgQllURSAqZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwgY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUpIHsKKwlGSU1FTU9SWSAqaG1lbSA9IChGSU1FTU9SWSopcGljdHVyZS0+Y3VzdG9tX3B0cjsKKwlyZXR1cm4gZGF0YV9zaXplID8gKEZyZWVJbWFnZV9Xcml0ZU1lbW9yeShkYXRhLCAxLCAodW5zaWduZWQpZGF0YV9zaXplLCBobWVtKSA9PSBkYXRhX3NpemUpIDogMDsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gUGx1Z2luIEltcGxlbWVudGF0aW9uCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3N0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCitGb3JtYXQoKSB7CisJcmV0dXJuICJXZWJQIjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKK0Rlc2NyaXB0aW9uKCkgeworCXJldHVybiAiR29vZ2xlIFdlYlAgaW1hZ2UgZm9ybWF0IjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKK0V4dGVuc2lvbigpIHsKKwlyZXR1cm4gIndlYnAiOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgorUmVnRXhwcigpIHsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKK01pbWVUeXBlKCkgeworCXJldHVybiAiaW1hZ2Uvd2VicCI7Cit9CisKK3N0YXRpYyBCT09MIERMTF9DQUxMQ09OVgorVmFsaWRhdGUoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlKSB7CisJQllURSByaWZmX3NpZ25hdHVyZVs0XSA9IHsgMHg1MiwgMHg0OSwgMHg0NiwgMHg0NiB9OworCUJZVEUgd2VicF9zaWduYXR1cmVbNF0gPSB7IDB4NTcsIDB4NDUsIDB4NDIsIDB4NTAgfTsKKwlCWVRFIHNpZ25hdHVyZVsxMl0gPSB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfTsKKworCWlvLT5yZWFkX3Byb2Moc2lnbmF0dXJlLCAxLCAxMiwgaGFuZGxlKTsKKworCWlmKG1lbWNtcChyaWZmX3NpZ25hdHVyZSwgc2lnbmF0dXJlLCA0KSA9PSAwKSB7CisJCWlmKG1lbWNtcCh3ZWJwX3NpZ25hdHVyZSwgc2lnbmF0dXJlICsgOCwgNCkgPT0gMCkgeworCQkJcmV0dXJuIFRSVUU7CisJCX0KKwl9CisKKwlyZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBCT09MIERMTF9DQUxMQ09OVgorU3VwcG9ydHNFeHBvcnREZXB0aChpbnQgZGVwdGgpIHsKKwlyZXR1cm4gKAorCQkoZGVwdGggPT0gMjQpIHx8IAorCQkoZGVwdGggPT0gMzIpCisJCSk7Cit9CisKK3N0YXRpYyBCT09MIERMTF9DQUxMQ09OViAKK1N1cHBvcnRzRXhwb3J0VHlwZShGUkVFX0lNQUdFX1RZUEUgdHlwZSkgeworCXJldHVybiAodHlwZSA9PSBGSVRfQklUTUFQKSA/IFRSVUUgOiBGQUxTRTsKK30KKworc3RhdGljIEJPT0wgRExMX0NBTExDT05WCitTdXBwb3J0c0lDQ1Byb2ZpbGVzKCkgeworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYKK1N1cHBvcnRzTm9QaXhlbHMoKSB7CisJcmV0dXJuIFRSVUU7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgKiBETExfQ0FMTENPTlYKK09wZW4oRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBCT09MIHJlYWQpIHsKKwlXZWJQTXV4ICptdXggPSBOVUxMOworCWludCBjb3B5X2RhdGEgPSAxOwkvLyAxIDogY29weSBkYXRhIGludG8gdGhlIG11eCwgMCA6IGtlZXAgYSBsaW5rIHRvIGxvY2FsIGRhdGEKKworCWlmKHJlYWQpIHsKKwkJLy8gY3JlYXRlIHRoZSBNVVggb2JqZWN0IGZyb20gdGhlIGlucHV0IHN0cmVhbQorCQlXZWJQRGF0YSBiaXRzdHJlYW07CisJCS8vIHJlYWQgdGhlIGlucHV0IGZpbGUgYW5kIHB1dCBpdCBpbiBtZW1vcnkKKwkJaWYoIVJlYWRGaWxlVG9XZWJQRGF0YShpbywgaGFuZGxlLCAmYml0c3RyZWFtKSkgeworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJLy8gY3JlYXRlIHRoZSBNVVggb2JqZWN0CisJCW11eCA9IFdlYlBNdXhDcmVhdGUoJmJpdHN0cmVhbSwgY29weV9kYXRhKTsKKwkJLy8gbm8gbG9uZ2VyIG5lZWRlZCBzaW5jZSBjb3B5X2RhdGEgPT0gMQorCQlmcmVlKCh2b2lkKiliaXRzdHJlYW0uYnl0ZXMpOworCQlpZihtdXggPT0gTlVMTCkgeworCQkJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKHNfZm9ybWF0X2lkLCAiRmFpbGVkIHRvIGNyZWF0ZSBtdXggb2JqZWN0IGZyb20gZmlsZSIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9IGVsc2UgeworCQkvLyBjcmVhdGVzIGFuIGVtcHR5IG11eCBvYmplY3QKKwkJbXV4ID0gV2ViUE11eE5ldygpOworCQlpZihtdXggPT0gTlVMTCkgeworCQkJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKHNfZm9ybWF0X2lkLCAiRmFpbGVkIHRvIGNyZWF0ZSBlbXB0eSBtdXggb2JqZWN0Iik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKwkKKwlyZXR1cm4gbXV4OworfQorCitzdGF0aWMgdm9pZCBETExfQ0FMTENPTlYKK0Nsb3NlKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSwgdm9pZCAqZGF0YSkgeworCVdlYlBNdXggKm11eCA9IChXZWJQTXV4KilkYXRhOworCWlmKG11eCAhPSBOVUxMKSB7CisJCS8vIGZyZWUgdGhlIE1VWCBvYmplY3QKKwkJV2ViUE11eERlbGV0ZShtdXgpOworCX0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKioKK0RlY29kZSBhIFdlYlAgaW1hZ2UgYW5kIHJldHVybnMgYSBGSUJJVE1BUCBpbWFnZQorQHBhcmFtIHdlYnBfaW1hZ2UgUmF3IFdlYlAgaW1hZ2UKK0BwYXJhbSBmbGFncyBGcmVlSW1hZ2UgbG9hZCBmbGFncworQHJldHVybiBSZXR1cm5zIGEgZGliIGlmIHN1Y2Nlc3NmdWxsLCByZXR1cm5zIE5VTEwgb3RoZXJ3aXNlCisqLworc3RhdGljIEZJQklUTUFQICoKK0RlY29kZUltYWdlKFdlYlBEYXRhICp3ZWJwX2ltYWdlLCBpbnQgZmxhZ3MpIHsKKwlGSUJJVE1BUCAqZGliID0gTlVMTDsKKworCWNvbnN0IHVpbnQ4X3QqIGRhdGEgPSB3ZWJwX2ltYWdlLT5ieXRlczsJLy8gcmF3IGltYWdlIGRhdGEKKwljb25zdCBzaXplX3QgZGF0YV9zaXplID0gd2VicF9pbWFnZS0+c2l6ZTsJLy8gcmF3IGltYWdlIHNpemUKKworICAgIFZQOFN0YXR1c0NvZGUgd2VicF9zdGF0dXMgPSBWUDhfU1RBVFVTX09LOworCisJQk9PTCBoZWFkZXJfb25seSA9IChmbGFncyAmIEZJRl9MT0FEX05PUElYRUxTKSA9PSBGSUZfTE9BRF9OT1BJWEVMUzsKKworCS8vIE1haW4gb2JqZWN0IHN0b3JpbmcgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIGFkdmFuY2VkIGRlY29kaW5nCisJV2ViUERlY29kZXJDb25maWcgZGVjb2Rlcl9jb25maWc7CisJLy8gT3V0cHV0IGJ1ZmZlcgorCVdlYlBEZWNCdWZmZXIqIGNvbnN0IG91dHB1dF9idWZmZXIgPSAmZGVjb2Rlcl9jb25maWcub3V0cHV0OworCS8vIEZlYXR1cmVzIGdhdGhlcmVkIGZyb20gdGhlIGJpdHN0cmVhbQorCVdlYlBCaXRzdHJlYW1GZWF0dXJlcyogY29uc3QgYml0c3RyZWFtID0gJmRlY29kZXJfY29uZmlnLmlucHV0OworCisJdHJ5IHsKKwkJLy8gSW5pdGlhbGl6ZSB0aGUgY29uZmlndXJhdGlvbiBhcyBlbXB0eQorCQkvLyBUaGlzIGZ1bmN0aW9uIG11c3QgYWx3YXlzIGJlIGNhbGxlZCBmaXJzdCwgdW5sZXNzIFdlYlBHZXRGZWF0dXJlcygpIGlzIHRvIGJlIGNhbGxlZAorCQlpZighV2ViUEluaXREZWNvZGVyQ29uZmlnKCZkZWNvZGVyX2NvbmZpZykpIHsKKwkJCXRocm93ICJMaWJyYXJ5IHZlcnNpb24gbWlzbWF0Y2giOworCQl9CisKKwkJLy8gUmV0cmlldmUgZmVhdHVyZXMgZnJvbSB0aGUgYml0c3RyZWFtCisJCS8vIFRoZSBiaXRzdHJlYW0gc3RydWN0dXJlIGlzIGZpbGxlZCB3aXRoIGluZm9ybWF0aW9uIGdhdGhlcmVkIGZyb20gdGhlIGJpdHN0cmVhbQorCQl3ZWJwX3N0YXR1cyA9IFdlYlBHZXRGZWF0dXJlcyhkYXRhLCBkYXRhX3NpemUsIGJpdHN0cmVhbSk7CisJCWlmKHdlYnBfc3RhdHVzICE9IFZQOF9TVEFUVVNfT0spIHsKKwkJCXRocm93IEZJX01TR19FUlJPUl9QQVJTSU5HOworCQl9CisKKwkJLy8gQWxsb2NhdGUgb3V0cHV0IGRpYgorCisJCXVuc2lnbmVkIGJwcCA9IGJpdHN0cmVhbS0+aGFzX2FscGhhID8gMzIgOiAyNDsJCisJCXVuc2lnbmVkIHdpZHRoID0gKHVuc2lnbmVkKWJpdHN0cmVhbS0+d2lkdGg7CisJCXVuc2lnbmVkIGhlaWdodCA9ICh1bnNpZ25lZCliaXRzdHJlYW0tPmhlaWdodDsKKworCQlkaWIgPSBGcmVlSW1hZ2VfQWxsb2NhdGVIZWFkZXIoaGVhZGVyX29ubHksIHdpZHRoLCBoZWlnaHQsIGJwcCwgRklfUkdCQV9SRURfTUFTSywgRklfUkdCQV9HUkVFTl9NQVNLLCBGSV9SR0JBX0JMVUVfTUFTSyk7CisJCWlmKCFkaWIpIHsKKwkJCXRocm93IEZJX01TR19FUlJPUl9ESUJfTUVNT1JZOworCQl9CisKKwkJaWYoaGVhZGVyX29ubHkpIHsKKwkJCVdlYlBGcmVlRGVjQnVmZmVyKG91dHB1dF9idWZmZXIpOworCQkJcmV0dXJuIGRpYjsKKwkJfQorCisJCS8vIC0tLSBTZXQgZGVjb2Rpbmcgb3B0aW9ucyAtLS0KKworCQkvLyB1c2UgbXVsdGktdGhyZWFkZWQgZGVjb2RpbmcKKwkJZGVjb2Rlcl9jb25maWcub3B0aW9ucy51c2VfdGhyZWFkcyA9IDE7CisJCS8vIHNldCBvdXRwdXQgY29sb3Igc3BhY2UKKwkJb3V0cHV0X2J1ZmZlci0+Y29sb3JzcGFjZSA9IGJpdHN0cmVhbS0+aGFzX2FscGhhID8gTU9ERV9CR1JBIDogTU9ERV9CR1I7CisKKwkJLy8gLS0tCisKKwkJLy8gZGVjb2RlIHRoZSBpbnB1dCBzdHJlYW0sIHRha2luZyAnY29uZmlnJyBpbnRvIGFjY291bnQuIAorCQkKKwkJd2VicF9zdGF0dXMgPSBXZWJQRGVjb2RlKGRhdGEsIGRhdGFfc2l6ZSwgJmRlY29kZXJfY29uZmlnKTsKKwkJaWYod2VicF9zdGF0dXMgIT0gVlA4X1NUQVRVU19PSykgeworCQkJdGhyb3cgRklfTVNHX0VSUk9SX1BBUlNJTkc7CisJCX0KKworCQkvLyBmaWxsIHRoZSBkaWIgd2l0aCB0aGUgZGVjb2RlZCBkYXRhCisKKwkJY29uc3QgQllURSAqc3JjX2JpdG1hcCA9IG91dHB1dF9idWZmZXItPnUuUkdCQS5yZ2JhOworCQljb25zdCB1bnNpZ25lZCBzcmNfcGl0Y2ggPSAodW5zaWduZWQpb3V0cHV0X2J1ZmZlci0+dS5SR0JBLnN0cmlkZTsKKworCQlzd2l0Y2goYnBwKSB7CisJCQljYXNlIDI0OgorCQkJCWZvcih1bnNpZ25lZCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisJCQkJCWNvbnN0IEJZVEUgKnNyY19iaXRzID0gc3JjX2JpdG1hcCArIHkgKiBzcmNfcGl0Y2g7CQkJCQkJCisJCQkJCUJZVEUgKmRzdF9iaXRzID0gKEJZVEUqKUZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIGhlaWdodC0xLXkpOworCQkJCQlmb3IodW5zaWduZWQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisJCQkJCQlkc3RfYml0c1tGSV9SR0JBX0JMVUVdCT0gc3JjX2JpdHNbMF07CS8vIEIKKwkJCQkJCWRzdF9iaXRzW0ZJX1JHQkFfR1JFRU5dCT0gc3JjX2JpdHNbMV07CS8vIEcKKwkJCQkJCWRzdF9iaXRzW0ZJX1JHQkFfUkVEXQk9IHNyY19iaXRzWzJdOwkvLyBSCisJCQkJCQlzcmNfYml0cyArPSAzOworCQkJCQkJZHN0X2JpdHMgKz0gMzsKKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgMzI6CisJCQkJZm9yKHVuc2lnbmVkIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJCQkJY29uc3QgQllURSAqc3JjX2JpdHMgPSBzcmNfYml0bWFwICsgeSAqIHNyY19waXRjaDsJCQkJCQkKKwkJCQkJQllURSAqZHN0X2JpdHMgPSAoQllURSopRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgaGVpZ2h0LTEteSk7CisJCQkJCWZvcih1bnNpZ25lZCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQkJCWRzdF9iaXRzW0ZJX1JHQkFfQkxVRV0JPSBzcmNfYml0c1swXTsJLy8gQgorCQkJCQkJZHN0X2JpdHNbRklfUkdCQV9HUkVFTl0JPSBzcmNfYml0c1sxXTsJLy8gRworCQkJCQkJZHN0X2JpdHNbRklfUkdCQV9SRURdCT0gc3JjX2JpdHNbMl07CS8vIFIKKwkJCQkJCWRzdF9iaXRzW0ZJX1JHQkFfQUxQSEFdCT0gc3JjX2JpdHNbM107CS8vIEEKKwkJCQkJCXNyY19iaXRzICs9IDQ7CisJCQkJCQlkc3RfYml0cyArPSA0OworCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCQl9CisKKwkJLy8gRnJlZSB0aGUgZGVjb2RlcgorCQlXZWJQRnJlZURlY0J1ZmZlcihvdXRwdXRfYnVmZmVyKTsKKworCQlyZXR1cm4gZGliOworCisJfSBjYXRjaCAoY29uc3QgY2hhciAqdGV4dCkgeworCQlpZihkaWIpIHsKKwkJCUZyZWVJbWFnZV9VbmxvYWQoZGliKTsKKwkJfQorCQlXZWJQRnJlZURlY0J1ZmZlcihvdXRwdXRfYnVmZmVyKTsKKworCQlpZihOVUxMICE9IHRleHQpIHsKKwkJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhzX2Zvcm1hdF9pZCwgdGV4dCk7CisJCX0KKworCQlyZXR1cm4gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyBGSUJJVE1BUCAqIERMTF9DQUxMQ09OVgorTG9hZChGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIGludCBwYWdlLCBpbnQgZmxhZ3MsIHZvaWQgKmRhdGEpIHsKKwlXZWJQTXV4ICptdXggPSBOVUxMOworCVdlYlBNdXhGcmFtZUluZm8gd2VicF9mcmFtZSA9IHsgMCB9OwkvLyByYXcgaW1hZ2UKKwlXZWJQRGF0YSBjb2xvcl9wcm9maWxlOwkvLyBJQ0MgcmF3IGRhdGEKKwlXZWJQRGF0YSB4bXBfbWV0YWRhdGE7CS8vIFhNUCByYXcgZGF0YQorCVdlYlBEYXRhIGV4aWZfbWV0YWRhdGE7CS8vIEVYSUYgcmF3IGRhdGEKKwlGSUJJVE1BUCAqZGliID0gTlVMTDsKKwlXZWJQTXV4RXJyb3IgZXJyb3Jfc3RhdHVzOworCisJaWYoIWhhbmRsZSkgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwl0cnkgeworCQkvLyBnZXQgdGhlIE1VWCBvYmplY3QKKwkJbXV4ID0gKFdlYlBNdXgqKWRhdGE7CisJCWlmKCFtdXgpIHsKKwkJCXRocm93ICgxKTsKKwkJfQorCQkKKwkJLy8gZ2V0cyB0aGUgZmVhdHVyZSBmbGFncyBmcm9tIHRoZSBtdXggb2JqZWN0CisJCXVpbnQzMl90IHdlYnBfZmxhZ3MgPSAwOworCQllcnJvcl9zdGF0dXMgPSBXZWJQTXV4R2V0RmVhdHVyZXMobXV4LCAmd2VicF9mbGFncyk7CisJCWlmKGVycm9yX3N0YXR1cyAhPSBXRUJQX01VWF9PSykgeworCQkJdGhyb3cgKDEpOworCQl9CisKKwkJLy8gZ2V0IGltYWdlIGRhdGEKKwkJZXJyb3Jfc3RhdHVzID0gV2ViUE11eEdldEZyYW1lKG11eCwgMSwgJndlYnBfZnJhbWUpOworCisJCWlmKGVycm9yX3N0YXR1cyA9PSBXRUJQX01VWF9PSykgeworCQkJLy8gZGVjb2RlIHRoZSBkYXRhIChjYW4gYmUgbGltaXRlZCB0byB0aGUgaGVhZGVyIGlmIGZsYWdzIHVzZXMgRklGX0xPQURfTk9QSVhFTFMpCisJCQlkaWIgPSBEZWNvZGVJbWFnZSgmd2VicF9mcmFtZS5iaXRzdHJlYW0sIGZsYWdzKTsKKwkJCWlmKCFkaWIpIHsKKwkJCQl0aHJvdyAoMSk7CisJCQl9CisJCQkKKwkJCS8vIGdldCBJQ0MgcHJvZmlsZQorCQkJaWYod2VicF9mbGFncyAmIElDQ1BfRkxBRykgeworCQkJCWVycm9yX3N0YXR1cyA9IFdlYlBNdXhHZXRDaHVuayhtdXgsICJJQ0NQIiwgJmNvbG9yX3Byb2ZpbGUpOworCQkJCWlmKGVycm9yX3N0YXR1cyA9PSBXRUJQX01VWF9PSykgeworCQkJCQlGcmVlSW1hZ2VfQ3JlYXRlSUNDUHJvZmlsZShkaWIsICh2b2lkKiljb2xvcl9wcm9maWxlLmJ5dGVzLCAobG9uZyljb2xvcl9wcm9maWxlLnNpemUpOworCQkJCX0KKwkJCX0KKworCQkJLy8gZ2V0IFhNUCBtZXRhZGF0YQorCQkJaWYod2VicF9mbGFncyAmIFhNUF9GTEFHKSB7CisJCQkJZXJyb3Jfc3RhdHVzID0gV2ViUE11eEdldENodW5rKG11eCwgIlhNUCAiLCAmeG1wX21ldGFkYXRhKTsKKwkJCQlpZihlcnJvcl9zdGF0dXMgPT0gV0VCUF9NVVhfT0spIHsKKwkJCQkJLy8gY3JlYXRlIGEgdGFnCisJCQkJCUZJVEFHICp0YWcgPSBGcmVlSW1hZ2VfQ3JlYXRlVGFnKCk7CisJCQkJCWlmKHRhZykgeworCQkJCQkJRnJlZUltYWdlX1NldFRhZ0tleSh0YWcsIGdfVGFnTGliX1hNUEZpZWxkTmFtZSk7CisJCQkJCQlGcmVlSW1hZ2VfU2V0VGFnTGVuZ3RoKHRhZywgKERXT1JEKXhtcF9tZXRhZGF0YS5zaXplKTsKKwkJCQkJCUZyZWVJbWFnZV9TZXRUYWdDb3VudCh0YWcsIChEV09SRCl4bXBfbWV0YWRhdGEuc2l6ZSk7CisJCQkJCQlGcmVlSW1hZ2VfU2V0VGFnVHlwZSh0YWcsIEZJRFRfQVNDSUkpOworCQkJCQkJRnJlZUltYWdlX1NldFRhZ1ZhbHVlKHRhZywgeG1wX21ldGFkYXRhLmJ5dGVzKTsKKwkJCQkJCQorCQkJCQkJLy8gc3RvcmUgdGhlIHRhZworCQkJCQkJRnJlZUltYWdlX1NldE1ldGFkYXRhKEZJTURfWE1QLCBkaWIsIEZyZWVJbWFnZV9HZXRUYWdLZXkodGFnKSwgdGFnKTsKKworCQkJCQkJLy8gZGVzdHJveSB0aGUgdGFnCisJCQkJCQlGcmVlSW1hZ2VfRGVsZXRlVGFnKHRhZyk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCS8vIGdldCBFeGlmIG1ldGFkYXRhCisJCQlpZih3ZWJwX2ZsYWdzICYgRVhJRl9GTEFHKSB7CisJCQkJZXJyb3Jfc3RhdHVzID0gV2ViUE11eEdldENodW5rKG11eCwgIkVYSUYiLCAmZXhpZl9tZXRhZGF0YSk7CisJCQkJaWYoZXJyb3Jfc3RhdHVzID09IFdFQlBfTVVYX09LKSB7CisJCQkJCS8vIHJlYWQgdGhlIEV4aWYgcmF3IGRhdGEgYXMgYSBibG9iCisJCQkJCWpwZWdfcmVhZF9leGlmX3Byb2ZpbGVfcmF3KGRpYiwgZXhpZl9tZXRhZGF0YS5ieXRlcywgKHVuc2lnbmVkKWV4aWZfbWV0YWRhdGEuc2l6ZSk7CisJCQkJCS8vIHJlYWQgYW5kIGRlY29kZSB0aGUgRXhpZiBkYXRhCisJCQkJCWpwZWdfcmVhZF9leGlmX3Byb2ZpbGUoZGliLCBleGlmX21ldGFkYXRhLmJ5dGVzLCAodW5zaWduZWQpZXhpZl9tZXRhZGF0YS5zaXplKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlXZWJQRGF0YUNsZWFyKCZ3ZWJwX2ZyYW1lLmJpdHN0cmVhbSk7CisKKwkJcmV0dXJuIGRpYjsKKworCX0gY2F0Y2goaW50KSB7CisJCVdlYlBEYXRhQ2xlYXIoJndlYnBfZnJhbWUuYml0c3RyZWFtKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKioKK0VuY29kZSBhIEZJQklUTUFQIHRvIGEgV2ViUCBpbWFnZQorQHBhcmFtIGhtZW0gTWVtb3J5IG91dHB1dCBzdHJlYW0sIGNvbnRhaW5pbmcgb24gcmV0dXJuIHRoZSBlbmNvZGVkIGltYWdlCitAcGFyYW0gZGliIFRoZSBGSUJJVE1BUCB0byBlbmNvZGUKK0BwYXJhbSBmbGFncyBGcmVlSW1hZ2Ugc2F2ZSBmbGFncworQHJldHVybiBSZXR1cm5zIFRSVUUgaWYgc3VjY2Vzc2Z1bGwsIHJldHVybnMgRkFMU0Ugb3RoZXJ3aXNlCisqLworc3RhdGljIEJPT0wKK0VuY29kZUltYWdlKEZJTUVNT1JZICpobWVtLCBGSUJJVE1BUCAqZGliLCBpbnQgZmxhZ3MpIHsKKwlXZWJQUGljdHVyZSBwaWN0dXJlOwkvLyBJbnB1dCBidWZmZXIKKwlXZWJQQ29uZmlnIGNvbmZpZzsJCS8vIENvZGluZyBwYXJhbWV0ZXJzCisKKwlCT09MIGJJc0ZsaXBwZWQgPSBGQUxTRTsKKworCXRyeSB7CisJCWNvbnN0IHVuc2lnbmVkIHdpZHRoID0gRnJlZUltYWdlX0dldFdpZHRoKGRpYik7CisJCWNvbnN0IHVuc2lnbmVkIGhlaWdodCA9IEZyZWVJbWFnZV9HZXRIZWlnaHQoZGliKTsKKwkJY29uc3QgdW5zaWduZWQgYnBwID0gRnJlZUltYWdlX0dldEJQUChkaWIpOworCQljb25zdCB1bnNpZ25lZCBwaXRjaCA9IEZyZWVJbWFnZV9HZXRQaXRjaChkaWIpOworCisJCS8vIGNoZWNrIGltYWdlIHR5cGUKKwkJRlJFRV9JTUFHRV9UWVBFIGltYWdlX3R5cGUgPSBGcmVlSW1hZ2VfR2V0SW1hZ2VUeXBlKGRpYik7CisKKwkJaWYoICEoKGltYWdlX3R5cGUgPT0gRklUX0JJVE1BUCkgJiYgKChicHAgPT0gMjQpIHx8IChicHAgPT0gMzIpKSkgKSAgeworCQkJdGhyb3cgRklfTVNHX0VSUk9SX1VOU1VQUE9SVEVEX0ZPUk1BVDsKKwkJfQorCisJCS8vIGNoZWNrIGZvcm1hdCBsaW1pdHMKKwkJaWYoTUFYKHdpZHRoLCBoZWlnaHQpID4gV0VCUF9NQVhfRElNRU5TSU9OKSB7CisJCQlGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2Moc19mb3JtYXRfaWQsICJVbnN1cHBvcnRlZCBpbWFnZSBzaXplOiB3aWR0aCB4IGhlaWdodCA9ICVkIHggJWQiLCB3aWR0aCwgaGVpZ2h0KTsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCisJCS8vIEluaXRpYWxpemUgb3V0cHV0IEkvTworCQlpZihXZWJQUGljdHVyZUluaXQoJnBpY3R1cmUpID09IDEpIHsKKwkJCXBpY3R1cmUud3JpdGVyID0gV2ViUF9NZW1vcnlXcml0ZXI7CisJCQlwaWN0dXJlLmN1c3RvbV9wdHIgPSBobWVtOworCQkJcGljdHVyZS53aWR0aCA9IChpbnQpd2lkdGg7CisJCQlwaWN0dXJlLmhlaWdodCA9IChpbnQpaGVpZ2h0OworCQl9IGVsc2UgeworCQkJdGhyb3cgIkNvdWxkbid0IGluaXRpYWxpemUgV2ViUFBpY3R1cmUiOworCQl9CisKKwkJLy8gLS0tIFNldCBlbmNvZGluZyBwYXJhbWV0ZXJzIC0tLQorCisJCS8vIEluaXRpYWxpemUgZW5jb2RpbmcgcGFyYW1ldGVycyB0byBkZWZhdWx0IHZhbHVlcworCQlXZWJQQ29uZmlnSW5pdCgmY29uZmlnKTsKKworCQkvLyBxdWFsaXR5L3NwZWVkIHRyYWRlLW9mZiAoMD1mYXN0LCA2PXNsb3dlci1iZXR0ZXIpCisJCWNvbmZpZy5tZXRob2QgPSA2OworCisJCWlmKChmbGFncyAmIFdFQlBfTE9TU0xFU1MpID09IFdFQlBfTE9TU0xFU1MpIHsKKwkJCS8vIGxvc3NsZXNzIGVuY29kaW5nCisJCQljb25maWcubG9zc2xlc3MgPSAxOworCQkJcGljdHVyZS51c2VfYXJnYiA9IDE7CisJCX0gZWxzZSBpZigoZmxhZ3MgJiAweDdGKSA+IDApIHsKKwkJCS8vIGxvc3N5IGVuY29kaW5nCisJCQljb25maWcubG9zc2xlc3MgPSAwOworCQkJLy8gcXVhbGl0eSBpcyBiZXR3ZWVuIDEgKHNtYWxsZXN0IGZpbGUpIGFuZCAxMDAgKGJpZ2dlc3QpIC0gZGVmYXVsdCB0byA3NQorCQkJY29uZmlnLnF1YWxpdHkgPSAoZmxvYXQpKGZsYWdzICYgMHg3Rik7CisJCQlpZihjb25maWcucXVhbGl0eSA+IDEwMCkgeworCQkJCWNvbmZpZy5xdWFsaXR5ID0gMTAwOworCQkJfQorCQl9CisKKwkJLy8gdmFsaWRhdGUgZW5jb2RpbmcgcGFyYW1ldGVycworCQlpZihXZWJQVmFsaWRhdGVDb25maWcoJmNvbmZpZykgPT0gMCkgeworCQkJdGhyb3cgIkZhaWxlZCB0byBpbml0aWFsaXplIGVuY29kZXIiOworCQl9CisKKwkJLy8gLS0tIFBlcmZvcm0gZW5jb2RpbmcgLS0tCisJCQorCQkvLyBJbnZlcnQgZGliIHNjYW5saW5lcworCQliSXNGbGlwcGVkID0gRnJlZUltYWdlX0ZsaXBWZXJ0aWNhbChkaWIpOworCisKKwkJLy8gY29udmVydCBkaWIgYnVmZmVyIHRvIG91dHB1dCBzdHJlYW0KKworCQljb25zdCBCWVRFICpiaXRzID0gRnJlZUltYWdlX0dldEJpdHMoZGliKTsKKworI2lmIEZSRUVJTUFHRV9DT0xPUk9SREVSID09IEZSRUVJTUFHRV9DT0xPUk9SREVSX0JHUgorCQlzd2l0Y2goYnBwKSB7CisJCQljYXNlIDI0OgorCQkJCVdlYlBQaWN0dXJlSW1wb3J0QkdSKCZwaWN0dXJlLCBiaXRzLCBwaXRjaCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDMyOgorCQkJCVdlYlBQaWN0dXJlSW1wb3J0QkdSQSgmcGljdHVyZSwgYml0cywgcGl0Y2gpOworCQkJCWJyZWFrOworCQl9CisjZWxzZQorCQlzd2l0Y2goYnBwKSB7CisJCQljYXNlIDI0OgorCQkJCVdlYlBQaWN0dXJlSW1wb3J0UkdCKCZwaWN0dXJlLCBiaXRzLCBwaXRjaCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDMyOgorCQkJCVdlYlBQaWN0dXJlSW1wb3J0UkdCQSgmcGljdHVyZSwgYml0cywgcGl0Y2gpOworCQkJCWJyZWFrOworCQl9CisKKyNlbmRpZiAvLyBGUkVFSU1BR0VfQ09MT1JPUkRFUiA9PSBGUkVFSU1BR0VfQ09MT1JPUkRFUl9CR1IKKworCQlpZighV2ViUEVuY29kZSgmY29uZmlnLCAmcGljdHVyZSkpIHsKKwkJCXRocm93ICJGYWlsZWQgdG8gZW5jb2RlIGltYWdlIjsKKwkJfQorCisJCVdlYlBQaWN0dXJlRnJlZSgmcGljdHVyZSk7CisKKwkJaWYoYklzRmxpcHBlZCkgeworCQkJLy8gaW52ZXJ0IGRpYiBzY2FubGluZXMKKwkJCUZyZWVJbWFnZV9GbGlwVmVydGljYWwoZGliKTsKKwkJfQorCisJCXJldHVybiBUUlVFOworCisJfSBjYXRjaCAoY29uc3QgY2hhciogdGV4dCkgeworCisJCVdlYlBQaWN0dXJlRnJlZSgmcGljdHVyZSk7CisKKwkJaWYoYklzRmxpcHBlZCkgeworCQkJLy8gaW52ZXJ0IGRpYiBzY2FubGluZXMKKwkJCUZyZWVJbWFnZV9GbGlwVmVydGljYWwoZGliKTsKKwkJfQorCisJCWlmKE5VTEwgIT0gdGV4dCkgeworCQkJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKHNfZm9ybWF0X2lkLCB0ZXh0KTsKKwkJfQorCX0KKworCXJldHVybiBGQUxTRTsKK30KKworc3RhdGljIEJPT0wgRExMX0NBTExDT05WCitTYXZlKEZyZWVJbWFnZUlPICppbywgRklCSVRNQVAgKmRpYiwgZmlfaGFuZGxlIGhhbmRsZSwgaW50IHBhZ2UsIGludCBmbGFncywgdm9pZCAqZGF0YSkgeworCVdlYlBNdXggKm11eCA9IE5VTEw7CisJRklNRU1PUlkgKmhtZW0gPSBOVUxMOworCVdlYlBEYXRhIHdlYnBfaW1hZ2U7CisJV2ViUERhdGEgb3V0cHV0X2RhdGEgPSB7IDAgfTsKKwlXZWJQTXV4RXJyb3IgZXJyb3Jfc3RhdHVzOworCisJaW50IGNvcHlfZGF0YSA9IDE7CS8vIDEgOiBjb3B5IGRhdGEgaW50byB0aGUgbXV4LCAwIDoga2VlcCBhIGxpbmsgdG8gbG9jYWwgZGF0YQorCisJaWYoIWRpYiB8fCAhaGFuZGxlIHx8ICFkYXRhKSB7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwl0cnkgeworCisJCS8vIGdldCB0aGUgTVVYIG9iamVjdAorCQltdXggPSAoV2ViUE11eCopZGF0YTsKKwkJaWYoIW11eCkgeworCQkJcmV0dXJuIEZBTFNFOworCQl9CisKKwkJLy8gLS0tIHByZXBhcmUgaW1hZ2UgZGF0YSAtLS0KKworCQkvLyBlbmNvZGUgaW1hZ2UgYXMgYSBXZWJQIGJsb2IKKwkJaG1lbSA9IEZyZWVJbWFnZV9PcGVuTWVtb3J5KCk7CisJCWlmKCFobWVtIHx8ICFFbmNvZGVJbWFnZShobWVtLCBkaWIsIGZsYWdzKSkgeworCQkJdGhyb3cgKDEpOworCQl9CisJCS8vIHN0b3JlIHRoZSBibG9iIGludG8gdGhlIG11eAorCQlCWVRFICpkYXRhID0gTlVMTDsKKwkJRFdPUkQgZGF0YV9zaXplID0gMDsKKwkJRnJlZUltYWdlX0FjcXVpcmVNZW1vcnkoaG1lbSwgJmRhdGEsICZkYXRhX3NpemUpOworCQl3ZWJwX2ltYWdlLmJ5dGVzID0gZGF0YTsKKwkJd2VicF9pbWFnZS5zaXplID0gZGF0YV9zaXplOworCQllcnJvcl9zdGF0dXMgPSBXZWJQTXV4U2V0SW1hZ2UobXV4LCAmd2VicF9pbWFnZSwgY29weV9kYXRhKTsKKwkJLy8gbm8gbG9uZ2VyIG5lZWRlZCBzaW5jZSBjb3B5X2RhdGEgPT0gMQorCQlGcmVlSW1hZ2VfQ2xvc2VNZW1vcnkoaG1lbSk7CisJCWhtZW0gPSBOVUxMOworCQlpZihlcnJvcl9zdGF0dXMgIT0gV0VCUF9NVVhfT0spIHsKKwkJCXRocm93ICgxKTsKKwkJfQorCisJCS8vIC0tLSBzZXQgbWV0YWRhdGEgLS0tCisJCQorCQkvLyBzZXQgSUNDIGNvbG9yIHByb2ZpbGUKKwkJeworCQkJRklJQ0NQUk9GSUxFICppY2NQcm9maWxlID0gRnJlZUltYWdlX0dldElDQ1Byb2ZpbGUoZGliKTsKKwkJCWlmIChpY2NQcm9maWxlLT5zaXplICYmIGljY1Byb2ZpbGUtPmRhdGEpIHsKKwkJCQlXZWJQRGF0YSBpY2NfcHJvZmlsZTsKKwkJCQlpY2NfcHJvZmlsZS5ieXRlcyA9ICh1aW50OF90KilpY2NQcm9maWxlLT5kYXRhOworCQkJCWljY19wcm9maWxlLnNpemUgPSAoc2l6ZV90KWljY1Byb2ZpbGUtPnNpemU7CisJCQkJZXJyb3Jfc3RhdHVzID0gV2ViUE11eFNldENodW5rKG11eCwgIklDQ1AiLCAmaWNjX3Byb2ZpbGUsIGNvcHlfZGF0YSk7CisJCQkJaWYoZXJyb3Jfc3RhdHVzICE9IFdFQlBfTVVYX09LKSB7CisJCQkJCXRocm93ICgxKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvLyBzZXQgWE1QIG1ldGFkYXRhCisJCXsKKwkJCUZJVEFHICp0YWcgPSBOVUxMOworCQkJaWYoRnJlZUltYWdlX0dldE1ldGFkYXRhKEZJTURfWE1QLCBkaWIsIGdfVGFnTGliX1hNUEZpZWxkTmFtZSwgJnRhZykpIHsKKwkJCQlXZWJQRGF0YSB4bXBfcHJvZmlsZTsKKwkJCQl4bXBfcHJvZmlsZS5ieXRlcyA9ICh1aW50OF90KilGcmVlSW1hZ2VfR2V0VGFnVmFsdWUodGFnKTsKKwkJCQl4bXBfcHJvZmlsZS5zaXplID0gKHNpemVfdClGcmVlSW1hZ2VfR2V0VGFnTGVuZ3RoKHRhZyk7CisJCQkJZXJyb3Jfc3RhdHVzID0gV2ViUE11eFNldENodW5rKG11eCwgIlhNUCAiLCAmeG1wX3Byb2ZpbGUsIGNvcHlfZGF0YSk7CisJCQkJaWYoZXJyb3Jfc3RhdHVzICE9IFdFQlBfTVVYX09LKSB7CisJCQkJCXRocm93ICgxKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvLyBzZXQgRXhpZiBtZXRhZGF0YQorCQl7CisJCQlGSVRBRyAqdGFnID0gTlVMTDsKKwkJCWlmKEZyZWVJbWFnZV9HZXRNZXRhZGF0YShGSU1EX0VYSUZfUkFXLCBkaWIsIGdfVGFnTGliX0V4aWZSYXdGaWVsZE5hbWUsICZ0YWcpKSB7CisJCQkJV2ViUERhdGEgZXhpZl9wcm9maWxlOworCQkJCWV4aWZfcHJvZmlsZS5ieXRlcyA9ICh1aW50OF90KilGcmVlSW1hZ2VfR2V0VGFnVmFsdWUodGFnKTsKKwkJCQlleGlmX3Byb2ZpbGUuc2l6ZSA9IChzaXplX3QpRnJlZUltYWdlX0dldFRhZ0xlbmd0aCh0YWcpOworCQkJCWVycm9yX3N0YXR1cyA9IFdlYlBNdXhTZXRDaHVuayhtdXgsICJFWElGIiwgJmV4aWZfcHJvZmlsZSwgY29weV9kYXRhKTsKKwkJCQlpZihlcnJvcl9zdGF0dXMgIT0gV0VCUF9NVVhfT0spIHsKKwkJCQkJdGhyb3cgKDEpOworCQkJCX0KKwkJCX0KKwkJfQorCQkKKwkJLy8gZ2V0IGRhdGEgZnJvbSBtdXggaW4gV2ViUCBSSUZGIGZvcm1hdAorCQllcnJvcl9zdGF0dXMgPSBXZWJQTXV4QXNzZW1ibGUobXV4LCAmb3V0cHV0X2RhdGEpOworCQlpZihlcnJvcl9zdGF0dXMgIT0gV0VCUF9NVVhfT0spIHsKKwkJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhzX2Zvcm1hdF9pZCwgIkZhaWxlZCB0byBjcmVhdGUgd2VicCBvdXRwdXQgZmlsZSIpOworCQkJdGhyb3cgKDEpOworCQl9CisKKwkJLy8gd3JpdGUgdGhlIGZpbGUgdG8gdGhlIG91dHB1dCBzdHJlYW0KKwkJaWYoaW8tPndyaXRlX3Byb2MoKHZvaWQqKW91dHB1dF9kYXRhLmJ5dGVzLCAxLCAodW5zaWduZWQpb3V0cHV0X2RhdGEuc2l6ZSwgaGFuZGxlKSAhPSBvdXRwdXRfZGF0YS5zaXplKSB7CisJCQlGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2Moc19mb3JtYXRfaWQsICJGYWlsZWQgdG8gd3JpdGUgd2VicCBvdXRwdXQgZmlsZSIpOworCQkJdGhyb3cgKDEpOworCQl9CisKKwkJLy8gZnJlZSBXZWJQIG91dHB1dCBmaWxlCisJCVdlYlBEYXRhQ2xlYXIoJm91dHB1dF9kYXRhKTsKKworCQlyZXR1cm4gVFJVRTsKKworCX0gY2F0Y2goaW50KSB7CisJCWlmKGhtZW0pIHsKKwkJCUZyZWVJbWFnZV9DbG9zZU1lbW9yeShobWVtKTsKKwkJfQorCQkKKwkJV2ViUERhdGFDbGVhcigmb3V0cHV0X2RhdGEpOworCisJCXJldHVybiBGQUxTRTsKKwl9Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCSBJbml0CisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3ZvaWQgRExMX0NBTExDT05WCitJbml0V0VCUChQbHVnaW4gKnBsdWdpbiwgaW50IGZvcm1hdF9pZCkgeworCXNfZm9ybWF0X2lkID0gZm9ybWF0X2lkOworCisJcGx1Z2luLT5mb3JtYXRfcHJvYyA9IEZvcm1hdDsKKwlwbHVnaW4tPmRlc2NyaXB0aW9uX3Byb2MgPSBEZXNjcmlwdGlvbjsKKwlwbHVnaW4tPmV4dGVuc2lvbl9wcm9jID0gRXh0ZW5zaW9uOworCXBsdWdpbi0+cmVnZXhwcl9wcm9jID0gUmVnRXhwcjsKKwlwbHVnaW4tPm9wZW5fcHJvYyA9IE9wZW47CisJcGx1Z2luLT5jbG9zZV9wcm9jID0gQ2xvc2U7CisJcGx1Z2luLT5wYWdlY291bnRfcHJvYyA9IE5VTEw7CisJcGx1Z2luLT5wYWdlY2FwYWJpbGl0eV9wcm9jID0gTlVMTDsKKwlwbHVnaW4tPmxvYWRfcHJvYyA9IExvYWQ7CisJcGx1Z2luLT5zYXZlX3Byb2MgPSBTYXZlOworCXBsdWdpbi0+dmFsaWRhdGVfcHJvYyA9IFZhbGlkYXRlOworCXBsdWdpbi0+bWltZV9wcm9jID0gTWltZVR5cGU7CisJcGx1Z2luLT5zdXBwb3J0c19leHBvcnRfYnBwX3Byb2MgPSBTdXBwb3J0c0V4cG9ydERlcHRoOworCXBsdWdpbi0+c3VwcG9ydHNfZXhwb3J0X3R5cGVfcHJvYyA9IFN1cHBvcnRzRXhwb3J0VHlwZTsKKwlwbHVnaW4tPnN1cHBvcnRzX2ljY19wcm9maWxlc19wcm9jID0gU3VwcG9ydHNJQ0NQcm9maWxlczsKKwlwbHVnaW4tPnN1cHBvcnRzX25vX3BpeGVsc19wcm9jID0gU3VwcG9ydHNOb1BpeGVsczsKK30KKwpkaWZmIC0tZ2l0IGEvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9QbHVnaW5YQk0uY3BwIGIvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9QbHVnaW5YQk0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhYWM0OGMKLS0tIC9kZXYvbnVsbAorKysgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL1BsdWdpblhCTS5jcHAKQEAgLTAsMCArMSwzOTkgQEAKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFhCTSBMb2FkZXIKKy8vCisvLyBEZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIGJ5CisvLyAtIEhlcnbpIERyb2xvbiA8ZHJvbG9uQGluZm9uaWUuZnI+CisvLyBwYXJ0IG9mIHRoZSBjb2RlIGFkYXB0ZWQgZnJvbSB0aGUgbmV0UEJNIHBhY2thZ2UgKHhibXRvcGJtLmMpCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRnJlZUltYWdlIDMKKy8vCisvLyBDT1ZFUkVEIENPREUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkKKy8vIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTCisvLyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy8vIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVECisvLyBDT0RFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UCisvLyBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWQorLy8gU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTAorLy8gUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUgorLy8gVEhJUyBESVNDTEFJTUVSLgorLy8KKy8vIFVzZSBhdCB5b3VyIG93biByaXNrIQorLy8KKy8vCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpbmNsdWRlICJGcmVlSW1hZ2UuaCIKKyNpbmNsdWRlICJVdGlsaXRpZXMuaCIKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gSW50ZXJuYWwgZnVuY3Rpb25zCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNkZWZpbmUgTUFYX0xJTkUJNTEyCisKK3N0YXRpYyBjb25zdCBjaGFyICpFUlJfWEJNX1NZTlRBWAk9ICJTeW50YXggZXJyb3IiOworc3RhdGljIGNvbnN0IGNoYXIgKkVSUl9YQk1fTElORQkJPSAiTGluZSB0b28gbG9uZyI7CitzdGF0aWMgY29uc3QgY2hhciAqRVJSX1hCTV9ERUNMCQk9ICJVbmFibGUgdG8gZmluZCBhIGxpbmUgaW4gdGhlIGZpbGUgY29udGFpbmluZyB0aGUgc3RhcnQgb2YgQyBhcnJheSBkZWNsYXJhdGlvbiAoXCJzdGF0aWMgY2hhclwiIG9yIHdoYXRldmVyKSI7CitzdGF0aWMgY29uc3QgY2hhciAqRVJSX1hCTV9FT0ZSRUFECT0gIkVPRiAvIHJlYWQgZXJyb3IiOworc3RhdGljIGNvbnN0IGNoYXIgKkVSUl9YQk1fV0lEVEgJPSAiSW52YWxpZCB3aWR0aCI7CitzdGF0aWMgY29uc3QgY2hhciAqRVJSX1hCTV9IRUlHSFQJPSAiSW52YWxpZCBoZWlnaHQiOworc3RhdGljIGNvbnN0IGNoYXIgKkVSUl9YQk1fTUVNT1JZCT0gIk91dCBvZiBtZW1vcnkiOworCisvKioKK0dldCBhIHN0cmluZyBmcm9tIGEgc3RyZWFtLiAKK1JlYWQgdGhlIHN0cmluZyBmcm9tIHRoZSBjdXJyZW50IHN0cmVhbSB0byB0aGUgZmlyc3QgbmV3bGluZSBjaGFyYWN0ZXIuIAorVGhlIHJlc3VsdCBzdG9yZWQgaW4gc3RyIGlzIGFwcGVuZGVkIHdpdGggYSBudWxsIGNoYXJhY3Rlci4KK0BwYXJhbSBzdHIgU3RvcmFnZSBsb2NhdGlvbiBmb3IgZGF0YSAKK0BwYXJhbSBuIE1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcmVhZCAKK0BwYXJhbSBpbyBQb2ludGVyIHRvIHRoZSBGcmVlSW1hZ2VJTyBzdHJ1Y3R1cmUKK0BwYXJhbSBoYW5kbGUgSGFuZGxlIHRvIHRoZSBzdHJlYW0KK0ByZXR1cm4gUmV0dXJucyBzdHIuIE5VTEwgaXMgcmV0dXJuZWQgdG8gaW5kaWNhdGUgYW4gZXJyb3Igb3IgYW4gZW5kLW9mLWZpbGUgY29uZGl0aW9uLgorKi8KK3N0YXRpYyBjaGFyKiAKK3JlYWRMaW5lKGNoYXIgKnN0ciwgaW50IG4sIEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSkgeworCWNoYXIgYzsKKwlpbnQgY291bnQsIGkgPSAwOworCWRvIHsKKwkJY291bnQgPSBpby0+cmVhZF9wcm9jKCZjLCAxLCAxLCBoYW5kbGUpOworCQlzdHJbaSsrXSA9IGM7CisJfSB3aGlsZSgoYyAhPSAnXG4nKSAmJiAoaSA8IG4pKTsKKwlpZihjb3VudCA8PSAwKQorCQlyZXR1cm4gTlVMTDsKKwlzdHJbaV0gPSAnXDAnOworCXJldHVybiBzdHI7Cit9CisKKy8qKgorR2V0IGEgY2hhciBmcm9tIHRoZSBzdHJlYW0KK0BwYXJhbSBpbyBQb2ludGVyIHRvIHRoZSBGcmVlSW1hZ2VJTyBzdHJ1Y3R1cmUKK0BwYXJhbSBoYW5kbGUgSGFuZGxlIHRvIHRoZSBzdHJlYW0KK0ByZXR1cm4gUmV0dXJucyB0aGUgbmV4dCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmVhbQorKi8KK3N0YXRpYyBpbnQgCityZWFkQ2hhcihGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUpIHsKKwlCWVRFIGM7CisJaW8tPnJlYWRfcHJvYygmYywgMSwgMSwgaGFuZGxlKTsKKwlyZXR1cm4gYzsKK30KKworLyoqCitSZWFkIGFuIFhCTSBmaWxlIGludG8gYSBidWZmZXIKK0BwYXJhbSBpbyBQb2ludGVyIHRvIHRoZSBGcmVlSW1hZ2VJTyBzdHJ1Y3R1cmUKK0BwYXJhbSBoYW5kbGUgSGFuZGxlIHRvIHRoZSBzdHJlYW0KK0BwYXJhbSB3aWR0aFAgKHJldHVybiB2YWx1ZSkgUG9pbnRlciB0byB0aGUgYml0bWFwIHdpZHRoCitAcGFyYW0gaGVpZ2h0UCAocmV0dXJuIHZhbHVlKSBQb2ludGVyIHRvIHRoZSBiaXRtYXAgaGVpZ2h0CitAcGFyYW0gZGF0YVAgKHJldHVybiB2YWx1ZSkgUG9pbnRlciB0byB0aGUgYml0bWFwIGJ1ZmZlcgorQHJldHVybiBSZXR1cm5zIE5VTEwgaWYgT0ssIHJldHVybnMgYW4gZXJyb3IgbWVzc2FnZSBvdGhlcndpc2UKKyovCitzdGF0aWMgY29uc3QgY2hhciogCityZWFkWEJNRmlsZShGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIGludCAqd2lkdGhQLCBpbnQgKmhlaWdodFAsIGNoYXIgKipkYXRhUCkgeworCWNoYXIgbGluZVtNQVhfTElORV0sIG5hbWVfYW5kX3R5cGVbTUFYX0xJTkVdOworCWNoYXIqIHB0cjsKKwljaGFyKiB0OworCWludCB2ZXJzaW9uID0gMDsKKwlpbnQgcmFzdGVyX2xlbmd0aCwgdjsKKwlpbnQgYnl0ZXMsIGJ5dGVzX3Blcl9saW5lLCBwYWRkaW5nOworCWludCBjMSwgYzIsIHZhbHVlMSwgdmFsdWUyOworCWludCBoZXhfdGFibGVbMjU2XTsKKwlCT09MIGZvdW5kX2RlY2xhcmF0aW9uOworCS8qIGluIHNjYW5uaW5nIHRocm91Z2ggdGhlIGJpdG1hcCBmaWxlLCB3ZSBoYXZlIGZvdW5kIHRoZSBmaXJzdAorCSBsaW5lIG9mIHRoZSBDIGRlY2xhcmF0aW9uIG9mIHRoZSBhcnJheSAodGhlICJzdGF0aWMgY2hhciAuLi4iCisJIG9yIHdoYXRldmVyIGxpbmUpCisJICovCisJQk9PTCBlb2Y7CS8vIHdlJ3ZlIGVuY291bnRlcmVkIGVuZCBvZiBmaWxlIHdoaWxlIHNlYXJjaGluZyBmaWxlCisKKwkqd2lkdGhQID0gKmhlaWdodFAgPSAtMTsKKworCWZvdW5kX2RlY2xhcmF0aW9uID0gRkFMU0U7ICAgIC8vIGhhdmVuJ3QgZm91bmQgaXQgeWV0OyBoYXZlbid0IGV2ZW4gbG9va2VkCisJZW9mID0gRkFMU0U7ICAgICAgICAgICAgICAgICAgLy8gaGF2ZW4ndCBlbmNvdW50ZXJlZCBlbmQgb2YgZmlsZSB5ZXQgCisJCisJd2hpbGUoIWZvdW5kX2RlY2xhcmF0aW9uICYmICFlb2YpIHsKKworCQlpZiggcmVhZExpbmUobGluZSwgTUFYX0xJTkUsIGlvLCBoYW5kbGUpID09IE5VTEwpIHsKKwkJCWVvZiA9IFRSVUU7CisJCX0KKwkJZWxzZSB7CisJCQlpZiggc3RybGVuKCBsaW5lICkgPT0gTUFYX0xJTkUgLSAxICkKKwkJCQlyZXR1cm4oIEVSUl9YQk1fTElORSApOworCQkJaWYoIHNzY2FuZihsaW5lLCAiI2RlZmluZSAlcyAlZCIsIG5hbWVfYW5kX3R5cGUsICZ2KSA9PSAyICkgeworCQkJCWlmKCAoIHQgPSBzdHJyY2hyKCBuYW1lX2FuZF90eXBlLCAnXycgKSApID09IE5VTEwgKQorCQkJCQl0ID0gbmFtZV9hbmRfdHlwZTsKKwkJCQllbHNlCisJCQkJCXQrKzsKKwkJCQlpZiAoICEgc3RyY21wKCAid2lkdGgiLCB0ICkgKQorCQkJCQkqd2lkdGhQID0gdjsKKwkJCQllbHNlIGlmICggISBzdHJjbXAoICJoZWlnaHQiLCB0ICkgKQorCQkJCQkqaGVpZ2h0UCA9IHY7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlmKCBzc2NhbmYoIGxpbmUsICJzdGF0aWMgc2hvcnQgJXMgPSB7IiwgbmFtZV9hbmRfdHlwZSApID09IDEgKSB7CisJCQkJdmVyc2lvbiA9IDEwOworCQkJCWZvdW5kX2RlY2xhcmF0aW9uID0gVFJVRTsKKwkJCX0KKwkJCWVsc2UgaWYoIHNzY2FuZiggbGluZSwgInN0YXRpYyBjaGFyICVzID0geyIsIG5hbWVfYW5kX3R5cGUgKSA9PSAxICkgeworCQkJCXZlcnNpb24gPSAxMTsKKwkJCQlmb3VuZF9kZWNsYXJhdGlvbiA9IFRSVUU7CisJCQl9CisJCQllbHNlIGlmKHNzY2FuZihsaW5lLCAic3RhdGljIHVuc2lnbmVkIGNoYXIgJXMgPSB7IiwgbmFtZV9hbmRfdHlwZSApID09IDEgKSB7CisJCQkJdmVyc2lvbiA9IDExOworCQkJCWZvdW5kX2RlY2xhcmF0aW9uID0gVFJVRTsKKwkJCX0KKwkJfQorCX0KKworCWlmKCFmb3VuZF9kZWNsYXJhdGlvbikgCisJCXJldHVybiggRVJSX1hCTV9ERUNMICk7CisKKwlpZigqd2lkdGhQID09IC0xICkKKwkJcmV0dXJuKCBFUlJfWEJNX1dJRFRIICk7CisJaWYoICpoZWlnaHRQID09IC0xICkKKwkJcmV0dXJuKCBFUlJfWEJNX0hFSUdIVCApOworCisJcGFkZGluZyA9IDA7CisJaWYgKCAoKCp3aWR0aFAgJSAxNikgPj0gMSkgJiYgKCgqd2lkdGhQICUgMTYpIDw9IDgpICYmICh2ZXJzaW9uID09IDEwKSApCisJCXBhZGRpbmcgPSAxOworCisJYnl0ZXNfcGVyX2xpbmUgPSAoKndpZHRoUCArIDcpIC8gOCArIHBhZGRpbmc7CisKKwlyYXN0ZXJfbGVuZ3RoID0gIGJ5dGVzX3Blcl9saW5lICogKmhlaWdodFA7CisJKmRhdGFQID0gKGNoYXIqKSBtYWxsb2MoIHJhc3Rlcl9sZW5ndGggKTsKKwlpZiAoICpkYXRhUCA9PSAoY2hhciopIDAgKQorCQlyZXR1cm4oIEVSUl9YQk1fTUVNT1JZICk7CisKKwkvLyBpbml0aWFsaXplIGhleF90YWJsZQorCWZvciAoIGMxID0gMDsgYzEgPCAyNTY7IGMxKysgKSB7CisJCWhleF90YWJsZVtjMV0gPSAyNTY7CisJfQorCWhleF90YWJsZVsnMCddID0gMDsKKwloZXhfdGFibGVbJzEnXSA9IDE7CisJaGV4X3RhYmxlWycyJ10gPSAyOworCWhleF90YWJsZVsnMyddID0gMzsKKwloZXhfdGFibGVbJzQnXSA9IDQ7CisJaGV4X3RhYmxlWyc1J10gPSA1OworCWhleF90YWJsZVsnNiddID0gNjsKKwloZXhfdGFibGVbJzcnXSA9IDc7CisJaGV4X3RhYmxlWyc4J10gPSA4OworCWhleF90YWJsZVsnOSddID0gOTsKKwloZXhfdGFibGVbJ0EnXSA9IDEwOworCWhleF90YWJsZVsnQiddID0gMTE7CisJaGV4X3RhYmxlWydDJ10gPSAxMjsKKwloZXhfdGFibGVbJ0QnXSA9IDEzOworCWhleF90YWJsZVsnRSddID0gMTQ7CisJaGV4X3RhYmxlWydGJ10gPSAxNTsKKwloZXhfdGFibGVbJ2EnXSA9IDEwOworCWhleF90YWJsZVsnYiddID0gMTE7CisJaGV4X3RhYmxlWydjJ10gPSAxMjsKKwloZXhfdGFibGVbJ2QnXSA9IDEzOworCWhleF90YWJsZVsnZSddID0gMTQ7CisJaGV4X3RhYmxlWydmJ10gPSAxNTsKKworCWlmKHZlcnNpb24gPT0gMTApIHsKKwkJZm9yKCBieXRlcyA9IDAsIHB0ciA9ICpkYXRhUDsgYnl0ZXMgPCByYXN0ZXJfbGVuZ3RoOyBieXRlcyArPSAyICkgeworCQkJd2hpbGUoICggYzEgPSByZWFkQ2hhcihpbywgaGFuZGxlKSApICE9ICd4JyApIHsKKwkJCQlpZiAoIGMxID09IEVPRiApCisJCQkJCXJldHVybiggRVJSX1hCTV9FT0ZSRUFEICk7CisJCQl9CisKKwkJCWMxID0gcmVhZENoYXIoaW8sIGhhbmRsZSk7CisJCQljMiA9IHJlYWRDaGFyKGlvLCBoYW5kbGUpOworCQkJaWYoIGMxID09IEVPRiB8fCBjMiA9PSBFT0YgKQorCQkJCXJldHVybiggRVJSX1hCTV9FT0ZSRUFEICk7CisJCQl2YWx1ZTEgPSAoIGhleF90YWJsZVtjMV0gPDwgNCApICsgaGV4X3RhYmxlW2MyXTsKKwkJCWlmICggdmFsdWUxID49IDI1NiApCisJCQkJcmV0dXJuKCBFUlJfWEJNX1NZTlRBWCApOworCQkJYzEgPSByZWFkQ2hhcihpbywgaGFuZGxlKTsKKwkJCWMyID0gcmVhZENoYXIoaW8sIGhhbmRsZSk7CisJCQlpZiggYzEgPT0gRU9GIHx8IGMyID09IEVPRiApCisJCQkJcmV0dXJuKCBFUlJfWEJNX0VPRlJFQUQgKTsKKwkJCXZhbHVlMiA9ICggaGV4X3RhYmxlW2MxXSA8PCA0ICkgKyBoZXhfdGFibGVbYzJdOworCQkJaWYgKCB2YWx1ZTIgPj0gMjU2ICkKKwkJCQlyZXR1cm4oIEVSUl9YQk1fU1lOVEFYICk7CisJCQkqcHRyKysgPSAoY2hhcil2YWx1ZTI7CisJCQlpZiAoICggISBwYWRkaW5nICkgfHwgKCAoIGJ5dGVzICsgMiApICUgYnl0ZXNfcGVyX2xpbmUgKSApCisJCQkJKnB0cisrID0gKGNoYXIpdmFsdWUxOworCQl9CisJfQorCWVsc2UgeworCQlmb3IoYnl0ZXMgPSAwLCBwdHIgPSAqZGF0YVA7IGJ5dGVzIDwgcmFzdGVyX2xlbmd0aDsgYnl0ZXMrKyApIHsKKwkJCS8qCisJCQkqKiBza2lwIHVudGlsIGRpZ2l0IGlzIGZvdW5kCisJCQkqLworCQkJZm9yKCA7IDsgKSB7CisJCQkJYzEgPSByZWFkQ2hhcihpbywgaGFuZGxlKTsKKwkJCQlpZiAoIGMxID09IEVPRiApCisJCQkJCXJldHVybiggRVJSX1hCTV9FT0ZSRUFEICk7CisJCQkJdmFsdWUxID0gaGV4X3RhYmxlW2MxXTsKKwkJCQlpZiAoIHZhbHVlMSAhPSAyNTYgKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCS8qCisJCQkqKiBsb29wIG9uIGRpZ2l0cworCQkJKi8KKwkJCWZvciggOyA7ICkgeworCQkJCWMyID0gcmVhZENoYXIoaW8sIGhhbmRsZSk7CisJCQkJaWYgKCBjMiA9PSBFT0YgKQorCQkJCQlyZXR1cm4oIEVSUl9YQk1fRU9GUkVBRCApOworCQkJCXZhbHVlMiA9IGhleF90YWJsZVtjMl07CisJCQkJaWYgKCB2YWx1ZTIgIT0gMjU2ICkgeworCQkJCQl2YWx1ZTEgPSAodmFsdWUxIDw8IDQpIHwgdmFsdWUyOworCQkJCQlpZiAoIHZhbHVlMSA+PSAyNTYgKQorCQkJCQkJcmV0dXJuKCBFUlJfWEJNX1NZTlRBWCApOworCQkJCX0KKwkJCQllbHNlIGlmICggYzIgPT0gJ3gnIHx8IGMyID09ICdYJyApIHsKKwkJCQkJaWYgKCB2YWx1ZTEgPT0gMCApCisJCQkJCQljb250aW51ZTsKKwkJCQkJZWxzZSByZXR1cm4oIEVSUl9YQk1fU1lOVEFYICk7CisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQl9CisJCQkqcHRyKysgPSAoY2hhcil2YWx1ZTE7CisJCX0KKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gUGx1Z2luIEludGVyZmFjZQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitzdGF0aWMgaW50IHNfZm9ybWF0X2lkOworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBQbHVnaW4gSW1wbGVtZW50YXRpb24KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKK0Zvcm1hdCgpIHsKKwlyZXR1cm4gIlhCTSI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCitEZXNjcmlwdGlvbigpIHsKKwlyZXR1cm4gIlgxMSBCaXRtYXAgRm9ybWF0IjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKK0V4dGVuc2lvbigpIHsKKwlyZXR1cm4gInhibSI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCitSZWdFeHByKCkgeworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgorTWltZVR5cGUoKSB7CisJcmV0dXJuICJpbWFnZS94LXhiaXRtYXAiOworfQorCitzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYKK1ZhbGlkYXRlKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSkgeworCWNoYXIgbWFnaWNbOF07CisJaWYocmVhZExpbmUobWFnaWMsIDcsIGlvLCBoYW5kbGUpKSB7CisJCWlmKHN0cmNtcChtYWdpYywgIiNkZWZpbmUiKSA9PSAwKQorCQkJcmV0dXJuIFRSVUU7CisJfQorCXJldHVybiBGQUxTRTsKK30KKworc3RhdGljIEJPT0wgRExMX0NBTExDT05WCitTdXBwb3J0c0V4cG9ydERlcHRoKGludCBkZXB0aCkgeworCXJldHVybiBGQUxTRTsKK30KKworc3RhdGljIEJPT0wgRExMX0NBTExDT05WIAorU3VwcG9ydHNFeHBvcnRUeXBlKEZSRUVfSU1BR0VfVFlQRSB0eXBlKSB7CisJcmV0dXJuIEZBTFNFOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBGSUJJVE1BUCAqIERMTF9DQUxMQ09OVgorTG9hZChGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIGludCBwYWdlLCBpbnQgZmxhZ3MsIHZvaWQgKmRhdGEpIHsKKwljaGFyICpidWZmZXIgPSBOVUxMOworCWludCB3aWR0aCwgaGVpZ2h0OworCUZJQklUTUFQICpkaWIgPSBOVUxMOworCisJdHJ5IHsKKworCQkvLyBsb2FkIHRoZSBiaXRtYXAgZGF0YQorCQljb25zdCBjaGFyKiBlcnJvciA9IHJlYWRYQk1GaWxlKGlvLCBoYW5kbGUsICZ3aWR0aCwgJmhlaWdodCwgJmJ1ZmZlcik7CisJCS8vIE1pY3Jvc29mdCBkb2Vzbid0IGltcGxlbWVudCB0aHJvdyBiZXR3ZWVuIGZ1bmN0aW9ucyA6KAorCQlpZihlcnJvcikgdGhyb3cgKGNoYXIqKWVycm9yOworCisKKwkJLy8gYWxsb2NhdGUgYSBuZXcgZGliCisJCWRpYiA9IEZyZWVJbWFnZV9BbGxvY2F0ZSh3aWR0aCwgaGVpZ2h0LCAxKTsKKwkJaWYoIWRpYikgdGhyb3cgKGNoYXIqKUVSUl9YQk1fTUVNT1JZOworCisJCS8vIHdyaXRlIHRoZSBwYWxldHRlIGRhdGEKKwkJUkdCUVVBRCAqcGFsID0gRnJlZUltYWdlX0dldFBhbGV0dGUoZGliKTsKKwkJcGFsWzBdLnJnYlJlZCA9IHBhbFswXS5yZ2JHcmVlbiA9IHBhbFswXS5yZ2JCbHVlID0gMDsKKwkJcGFsWzFdLnJnYlJlZCA9IHBhbFsxXS5yZ2JHcmVlbiA9IHBhbFsxXS5yZ2JCbHVlID0gMjU1OworCisJCS8vIGNvcHkgdGhlIGJpdG1hcAorCQlCWVRFICpiUCA9IChCWVRFKilidWZmZXI7CisJCWZvcihpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworCQkJQllURSBjb3VudCA9IDA7CisJCQlCWVRFIG1hc2sgPSAxOworCQkJQllURSAqYml0cyA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIGhlaWdodCAtIDEgLSB5KTsKKworCQkJZm9yKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQlpZihjb3VudCA+PSA4KSB7CisJCQkJCWJQKys7CisJCQkJCWNvdW50ID0gMDsKKwkJCQkJbWFzayA9IDE7CisJCQkJfQorCQkJCWlmKCpiUCAmIG1hc2spIHsKKwkJCQkJLy8gU2V0IGJpdCh4LCB5KSB0byAwCisJCQkJCWJpdHNbeCA+PiAzXSAmPSAoMHhGRjdGID4+ICh4ICYgMHg3KSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJLy8gU2V0IGJpdCh4LCB5KSB0byAxCisJCQkJCWJpdHNbeCA+PiAzXSB8PSAoMHg4MCA+PiAoeCAmIDB4NykpOworCQkJCX0KKwkJCQljb3VudCsrOworCQkJCW1hc2sgPDw9IDE7CisJCQl9CisJCQliUCsrOworCQl9CisKKwkJZnJlZShidWZmZXIpOworCQlyZXR1cm4gZGliOworCisJfSBjYXRjaChjb25zdCBjaGFyICp0ZXh0KSB7CisJCWlmKGJ1ZmZlcikJZnJlZShidWZmZXIpOworCQlpZihkaWIpCQlGcmVlSW1hZ2VfVW5sb2FkKGRpYik7CisJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhzX2Zvcm1hdF9pZCwgdGV4dCk7CisJCXJldHVybiBOVUxMOworCX0KK30KKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgIEluaXQKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwordm9pZCBETExfQ0FMTENPTlYKK0luaXRYQk0oUGx1Z2luICpwbHVnaW4sIGludCBmb3JtYXRfaWQpIHsKKyAgICBzX2Zvcm1hdF9pZCA9IGZvcm1hdF9pZDsKKworCXBsdWdpbi0+Zm9ybWF0X3Byb2MgPSBGb3JtYXQ7CisJcGx1Z2luLT5kZXNjcmlwdGlvbl9wcm9jID0gRGVzY3JpcHRpb247CisJcGx1Z2luLT5leHRlbnNpb25fcHJvYyA9IEV4dGVuc2lvbjsKKwlwbHVnaW4tPnJlZ2V4cHJfcHJvYyA9IFJlZ0V4cHI7CisJcGx1Z2luLT5vcGVuX3Byb2MgPSBOVUxMOworCXBsdWdpbi0+Y2xvc2VfcHJvYyA9IE5VTEw7CisJcGx1Z2luLT5wYWdlY291bnRfcHJvYyA9IE5VTEw7CisJcGx1Z2luLT5wYWdlY2FwYWJpbGl0eV9wcm9jID0gTlVMTDsKKwlwbHVnaW4tPmxvYWRfcHJvYyA9IExvYWQ7CisJcGx1Z2luLT5zYXZlX3Byb2MgPSBOVUxMOworCXBsdWdpbi0+dmFsaWRhdGVfcHJvYyA9IFZhbGlkYXRlOworCXBsdWdpbi0+bWltZV9wcm9jID0gTWltZVR5cGU7CisJcGx1Z2luLT5zdXBwb3J0c19leHBvcnRfYnBwX3Byb2MgPSBTdXBwb3J0c0V4cG9ydERlcHRoOworCXBsdWdpbi0+c3VwcG9ydHNfZXhwb3J0X3R5cGVfcHJvYyA9IFN1cHBvcnRzRXhwb3J0VHlwZTsKKwlwbHVnaW4tPnN1cHBvcnRzX2ljY19wcm9maWxlc19wcm9jID0gTlVMTDsKK30KKwpkaWZmIC0tZ2l0IGEvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9QbHVnaW5YUE0uY3BwIGIvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9QbHVnaW5YUE0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxYTczM2IKLS0tIC9kZXYvbnVsbAorKysgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL1BsdWdpblhQTS5jcHAKQEAgLTAsMCArMSw0ODcgQEAKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFhQTSBMb2FkZXIgYW5kIFdyaXRlcgorLy8KKy8vIERlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gYnkKKy8vIC0gUnlhbiBSdWJsZXkgKHJ5YW5AbG9zdHJlYWxpdHkub3JnKQorLy8KKy8vIENPVkVSRUQgQ09ERSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWQorLy8gT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMKKy8vIFRIQVQgVEhFIENPVkVSRUQgQ09ERSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLy8gT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQKKy8vIENPREUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkgQ09WRVJFRCBDT0RFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QKKy8vIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZCisvLyBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMCisvLyBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GIEFOWSBDT1ZFUkVEIENPREUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSCisvLyBUSElTIERJU0NMQUlNRVIuCisvLworLy8gVXNlIGF0IHlvdXIgb3duIHJpc2shCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpZmRlZiBfTVNDX1ZFUiAKKyNwcmFnbWEgd2FybmluZyAoZGlzYWJsZSA6IDQ3ODYpIC8vIGlkZW50aWZpZXIgd2FzIHRydW5jYXRlZCB0byAnbnVtYmVyJyBjaGFyYWN0ZXJzCisjZW5kaWYKKworLy8gSU1QTEVNRU5UQVRJT04gTk9URVM6CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEluaXRpYWwgZGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBieQorLy8gLSBLYXJsLUhlaW56IEJ1c3NpYW4gKGtoYnVzc2lhbkBtb3NzLmRlKQorLy8gLSBIZXJ26SBEcm9sb24gKGRyb2xvbkBpbmZvbmllLmZyKQorLy8gQ29tcGxldGVseSByZXdyaXR0ZW4gZnJvbSBzY3JhdGNoIGJ5IFJ5YW4gUnVibGV5IChyeWFuQGxvc3RyZWFsaXR5Lm9yZykKKy8vIGluIG9yZGVyIHRvIGFkZHJlc3MgdGhlIGZvbGxvd2luZyBtYWpvciBmaXhlczoKKy8vICogU3VwcG9ydHMgYW55IG51bWJlciBvZiBjaGFycyBwZXIgcGl4ZWwgKG5vdCBqdXN0IDEgb3IgMikKKy8vICogRmlsZXMgd2l0aCAyIGNoYXJzIHBlciBwaXhlbCBidXQgPD0gMjU2Y29sb3JzIGFyZSBsb2FkZWQgYXMgMjU2IGNvbG9yIChub3QgMjRiaXQpCisvLyAqIExvYWRzIG11Y2ggZmFzdGVyLCB1c2VzIG11Y2ggbGVzcyBtZW1vcnkKKy8vICogc3VwcG9ydHMgI3JnYiAjcnJyZ2dnYmJiIGFuZCAjcnJycmdnZ2diYmJiIGNvbG9ycyAobm90IGp1c3QgI3JyZ2diYikKKy8vICogc3VwcG9ydHMgc3ltYm9saWMgY29sb3IgbmFtZXMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2luY2x1ZGUgIkZyZWVJbWFnZS5oIgorI2luY2x1ZGUgIlV0aWxpdGllcy5oIgorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBQbHVnaW4gSW50ZXJmYWNlCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitzdGF0aWMgaW50IHNfZm9ybWF0X2lkOworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBJbnRlcm5hbCBGdW5jdGlvbnMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gcmVhZCBpbiBhbmQgc2tpcCBhbGwganVuayB1bnRpbCB3ZSBmaW5kIGEgY2VydGFpbiBjaGFyCitzdGF0aWMgQk9PTAorRmluZENoYXIoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBCWVRFIGxvb2tfZm9yKSB7CisJQllURSBjID0gJ1wwJzsKKwlpby0+cmVhZF9wcm9jKCZjLCBzaXplb2YoQllURSksIDEsIGhhbmRsZSk7CisJd2hpbGUoYyAhPSBsb29rX2ZvcikgeworCQlpZiggaW8tPnJlYWRfcHJvYygmYywgc2l6ZW9mKEJZVEUpLCAxLCBoYW5kbGUpICE9IDEgKQorCQkJcmV0dXJuIEZBTFNFOworCX0KKwlyZXR1cm4gVFJVRTsKK30KKworLy8gZmluZCBzdGFydCBvZiBzdHJpbmcsIHJlYWQgZGF0YSB1bnRpbCBlbmRpbmcgcXVvdGUgZm91bmQsIGFsbG9jYXRlIG1lbW9yeSBhbmQgcmV0dXJuIGEgc3RyaW5nCitzdGF0aWMgY2hhciAqCitSZWFkU3RyaW5nKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSkgeworCWlmKCAhRmluZENoYXIoaW8sIGhhbmRsZSwnIicpICkKKwkJcmV0dXJuIE5VTEw7CisJQllURSBjOworCXN0ZDo6c3RyaW5nIHM7CisJaW8tPnJlYWRfcHJvYygmYywgc2l6ZW9mKEJZVEUpLCAxLCBoYW5kbGUpOworCXdoaWxlKGMgIT0gJyInKSB7CisJCXMgKz0gYzsKKwkJaWYoIGlvLT5yZWFkX3Byb2MoJmMsIHNpemVvZihCWVRFKSwgMSwgaGFuZGxlKSAhPSAxICkKKwkJCXJldHVybiBOVUxMOworCX0KKwljaGFyICpjc3RyID0gKGNoYXIgKiltYWxsb2Mocy5sZW5ndGgoKSsxKTsKKwlzdHJjcHkoY3N0cixzLmNfc3RyKCkpOworCXJldHVybiBjc3RyOworfQorCitzdGF0aWMgY2hhciAqCitCYXNlOTIodW5zaWduZWQgaW50IG51bSkgeworCXN0YXRpYyBjaGFyIGI5MlsxNl07IC8vZW5vdWdoIGZvciBtb3JlIHRoZW4gNjQgYml0cworCXN0YXRpYyBjaGFyIGRpZ2l0W10gPSAiIC5Yb08rQCMkJSYqPS07Oj4sPDEyMzQ1Njc4OTBxd2VydHl1aXBhc2RmZ2hqa2x6eGN2Ym5tTU5CVkNaQVNERkdISktMUElVWVRSRVdRIX5eLygpX2AnXVt7fXwiOworCWI5MlsxNV0gPSAnXDAnOworCWludCBpID0gMTQ7CisJZG8geworCQliOTJbaS0tXSA9IGRpZ2l0W251bSAlIDkyXTsKKwkJbnVtIC89IDkyOworCX0gd2hpbGUoIG51bSAmJiBpID49IDAgKTsKKwlyZXR1cm4gYjkyK2krMTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gUGx1Z2luIEltcGxlbWVudGF0aW9uCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3N0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCitGb3JtYXQoKSB7CisJcmV0dXJuICJYUE0iOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgorRGVzY3JpcHRpb24oKSB7CisJcmV0dXJuICJYMTEgUGl4bWFwIEZvcm1hdCI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCitFeHRlbnNpb24oKSB7CisJcmV0dXJuICJ4cG0iOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgorUmVnRXhwcigpIHsKKwlyZXR1cm4gIl5bIFxcdF0qL1xcKiBYUE0gXFwqL1sgXFx0XSQiOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgorTWltZVR5cGUoKSB7CisJcmV0dXJuICJpbWFnZS94LXhwaXhtYXAiOworfQorCitzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYKK1ZhbGlkYXRlKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSkgeworCWNoYXIgYnVmZmVyWzI1Nl07CisKKwkvLyBjaGVja3MgdGhlIGZpcnN0IDI1NiBjaGFyYWN0ZXJzIGZvciB0aGUgbWFnaWMgc3RyaW5nCisJaW50IGNvdW50ID0gaW8tPnJlYWRfcHJvYyhidWZmZXIsIDEsIDI1NiwgaGFuZGxlKTsKKwlpZihjb3VudCA8PSA5KSByZXR1cm4gRkFMU0U7CisJZm9yKGludCBpID0gMDsgaSA8IChjb3VudCAtIDkpOyBpKyspIHsKKwkJaWYoc3RybmNtcCgmYnVmZmVyW2ldLCAiLyogWFBNICovIiwgOSkgPT0gMCkKKwkJCXJldHVybiBUUlVFOworCX0KKwlyZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBCT09MIERMTF9DQUxMQ09OVgorU3VwcG9ydHNFeHBvcnREZXB0aChpbnQgZGVwdGgpIHsKKwlyZXR1cm4gKAorCQkJKGRlcHRoID09IDgpIHx8CisJCQkoZGVwdGggPT0gMjQpCisJCSk7Cit9CisKK3N0YXRpYyBCT09MIERMTF9DQUxMQ09OVgorU3VwcG9ydHNFeHBvcnRUeXBlKEZSRUVfSU1BR0VfVFlQRSB0eXBlKSB7CisJcmV0dXJuICh0eXBlID09IEZJVF9CSVRNQVApID8gVFJVRSA6IEZBTFNFOworfQorCitzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYKK1N1cHBvcnRzTm9QaXhlbHMoKSB7CisJcmV0dXJuIFRSVUU7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIEZJQklUTUFQICogRExMX0NBTExDT05WCitMb2FkKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSwgaW50IHBhZ2UsIGludCBmbGFncywgdm9pZCAqZGF0YSkgeworCWNoYXIgbXNnWzI1Nl07CisgICAgRklCSVRNQVAgKmRpYiA9IE5VTEw7CisKKyAgICBpZiAoIWhhbmRsZSkgcmV0dXJuIE5VTEw7CisKKyAgICB0cnkgeworCQljaGFyICpzdHI7CisJCQorCQlCT09MIGhlYWRlcl9vbmx5ID0gKGZsYWdzICYgRklGX0xPQURfTk9QSVhFTFMpID09IEZJRl9MT0FEX05PUElYRUxTOworCQkKKwkJLy9maW5kIHRoZSBzdGFydGluZyBicmFjZQorCQlpZiggIUZpbmRDaGFyKGlvLCBoYW5kbGUsJ3snKSApCisJCQl0aHJvdyAiQ291bGQgbm90IGZpbmQgc3RhcnRpbmcgYnJhY2UiOworCisJCS8vcmVhZCBpbmZvIHN0cmluZworCQlzdHIgPSBSZWFkU3RyaW5nKGlvLCBoYW5kbGUpOworCQlpZighc3RyKQorCQkJdGhyb3cgIkVycm9yIHJlYWRpbmcgaW5mbyBzdHJpbmciOworCisJCWludCB3aWR0aCwgaGVpZ2h0LCBjb2xvcnMsIGNwcDsKKwkJaWYoIHNzY2FuZihzdHIsICIlZCAlZCAlZCAlZCIsICZ3aWR0aCwgJmhlaWdodCwgJmNvbG9ycywgJmNwcCkgIT0gNCApIHsKKwkJCWZyZWUoc3RyKTsKKwkJCXRocm93ICJJbXByb3Blcmx5IGZvcm1lZCBpbmZvIHN0cmluZyI7CisJCX0KKwkJZnJlZShzdHIpOworCisgICAgICAgIGlmIChjb2xvcnMgPiAyNTYpIHsKKwkJCWRpYiA9IEZyZWVJbWFnZV9BbGxvY2F0ZUhlYWRlcihoZWFkZXJfb25seSwgd2lkdGgsIGhlaWdodCwgMjQsIEZJX1JHQkFfUkVEX01BU0ssIEZJX1JHQkFfR1JFRU5fTUFTSywgRklfUkdCQV9CTFVFX01BU0spOworCQl9IGVsc2UgeworCQkJZGliID0gRnJlZUltYWdlX0FsbG9jYXRlSGVhZGVyKGhlYWRlcl9vbmx5LCB3aWR0aCwgaGVpZ2h0LCA4KTsKKwkJfQorCisJCS8vYnVpbGQgYSBtYXAgb2YgY29sb3IgY2hhcnMgdG8gcmdiIHZhbHVlcworCQlzdGQ6Om1hcDxzdGQ6OnN0cmluZyxGSUxFX1JHQkE+IHJhd3BhbDsgLy93aWxsIHN0b3JlIGluZGV4IGluIEFscGhhIGlmIDhicHAKKwkJZm9yKGludCBpID0gMDsgaSA8IGNvbG9yczsgaSsrICkgeworCQkJRklMRV9SR0JBIHJnYmE7CisKKwkJCXN0ciA9IFJlYWRTdHJpbmcoaW8sIGhhbmRsZSk7CisJCQlpZighc3RyKQorCQkJCXRocm93ICJFcnJvciByZWFkaW5nIGNvbG9yIHN0cmluZ3MiOworCisJCQlzdGQ6OnN0cmluZyBjaHJzKHN0cixjcHApOyAvL2NyZWF0ZSBhIHN0cmluZyBmb3IgdGhlIGNvbG9yIGNoYXJzIHVzaW5nIHRoZSBmaXJzdCBjcHAgY2hhcnMKKwkJCWNoYXIgKmtleXMgPSBzdHIgKyBjcHA7IC8vdGhlIGNvbG9yIGtleXMgZm9yIHRoZXNlIGNoYXJzIHN0YXJ0IGFmdGVyIHRoZSBmaXJzdCBjcHAgY2hhcnMKKworCQkJLy90cmFuc2xhdGUgYWxsIHRoZSB0YWJzIHRvIHNwYWNlcworCQkJY2hhciAqdG1wID0ga2V5czsKKwkJCXdoaWxlKCBzdHJjaHIodG1wLCdcdCcpICkgeworCQkJCXRtcCA9IHN0cmNocih0bXAsJ1x0Jyk7CisJCQkJKnRtcCsrID0gJyAnOworCQkJfQorCisJCQkvL3ByZWZlciB0aGUgY29sb3IgdmlzdWFsCisJCQlpZiggc3Ryc3RyKGtleXMsIiBjICIpICkgeworCQkJCWNoYXIgKmNsciA9IHN0cnN0cihrZXlzLCIgYyAiKSArIDM7CisJCQkJd2hpbGUoICpjbHIgPT0gJyAnICkgY2xyKys7IC8vZmluZCB0aGUgc3RhcnQgb2YgdGhlIGhleCByZ2IgdmFsdWUKKwkJCQlpZiggKmNsciA9PSAnIycgKSB7CisJCQkJCWludCByZWQgPSAwLCBncmVlbiA9IDAsIGJsdWUgPSAwLCBuOworCQkJCQljbHIrKzsKKwkJCQkJLy9lbmQgc3RyaW5nIGF0IGZpcnN0IHNwYWNlLCBpZiBhbnkgZm91bmQKKwkJCQkJaWYoIHN0cmNocihjbHIsJyAnKSApCisJCQkJCQkqKHN0cmNocihjbHIsJyAnKSkgPSAnXDAnOworCQkJCQkvL3BhcnNlIGhleCBjb2xvciwgaXQgY2FuIGJlICNyZ2IgI3JyZ2diYiAjcnJyZ2dnYmJiIG9yICNycnJyZ2dnZ2JiYmIKKwkJCQkJc3dpdGNoKCBzdHJsZW4oY2xyKSApIHsKKwkJCQkJCWNhc2UgMzoJbiA9IHNzY2FuZihjbHIsIiUwMXglMDF4JTAxeCIsJnJlZCwmZ3JlZW4sJmJsdWUpOworCQkJCQkJCXJlZCB8PSAocmVkIDw8IDQpOworCQkJCQkJCWdyZWVuIHw9IChncmVlbiA8PCA0KTsKKwkJCQkJCQlibHVlIHw9IChibHVlIDw8IDQpOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSA2OgluID0gc3NjYW5mKGNsciwiJTAyeCUwMnglMDJ4IiwmcmVkLCZncmVlbiwmYmx1ZSk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIDk6CW4gPSBzc2NhbmYoY2xyLCIlMDN4JTAzeCUwM3giLCZyZWQsJmdyZWVuLCZibHVlKTsKKwkJCQkJCQlyZWQgPj49IDQ7CisJCQkJCQkJZ3JlZW4gPj49IDQ7CisJCQkJCQkJYmx1ZSA+Pj0gNDsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgMTI6IG4gPSBzc2NhbmYoY2xyLCIlMDR4JTA0eCUwNHgiLCZyZWQsJmdyZWVuLCZibHVlKTsKKwkJCQkJCQlyZWQgPj49IDg7CisJCQkJCQkJZ3JlZW4gPj49IDg7CisJCQkJCQkJYmx1ZSA+Pj0gODsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJbiA9IDA7CisJCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJaWYoIG4gIT0gMyApIHsKKwkJCQkJCWZyZWUoc3RyKTsKKwkJCQkJCXRocm93ICJJbXByb3Blcmx5IGZvcm1lZCBoZXggY29sb3IgdmFsdWUiOworCQkJCQl9CisJCQkJCXJnYmEuciA9IChCWVRFKXJlZDsKKwkJCQkJcmdiYS5nID0gKEJZVEUpZ3JlZW47CisJCQkJCXJnYmEuYiA9IChCWVRFKWJsdWU7CisJCQkJfSBlbHNlIGlmKCAhc3RybmNtcChjbHIsIk5vbmUiLDQpIHx8ICFzdHJuY21wKGNsciwibm9uZSIsNCkgKSB7CisJCQkJCXJnYmEuciA9IHJnYmEuZyA9IHJnYmEuYiA9IDB4RkY7CisJCQkJfSBlbHNlIHsKKwkJCQkJY2hhciAqdG1wID0gY2xyOworCisJCQkJCS8vc2NhbiBmb3J3YXJkIGZvciBlYWNoIHNwYWNlLCBpZiBpdHMgIiB4ICIgb3IgIiB4eCAiIGVuZCB0aGUgc3RyaW5nIHRoZXJlCisJCQkJCS8vdGhpcyBtZWFucyBpdHMgcHJvYmFibHkgc29tZSBvdGhlciB2aXN1YWwgZGF0YSBiZXlvbmQgdGhhdCBwb2ludCBhbmQgbm90CisJCQkJCS8vcGFydCBvZiB0aGUgY29sb3IgbmFtZS4gIEhvdyBtYW55IG5hbWVkIGNvbG9yIGVuZCB3aXRoIGEgMSBvciAyIGNoYXJhY3RlcgorCQkJCQkvL3dvcmQ/IFByb2JhYmx5IG5vbmUgaW4gb3VyIGxpc3QgYXQgbGVhc3QuCisJCQkJCXdoaWxlKCAodG1wID0gc3RyY2hyKHRtcCwnICcpKSAhPSBOVUxMICkgeworCQkJCQkJaWYoIHRtcFsxXSAhPSAnICcgKSB7CisJCQkJCQkJaWYoICh0bXBbMl0gPT0gJyAnKSB8fCAodG1wWzJdICE9ICcgJyAmJiB0bXBbM10gPT0gJyAnKSApIHsKKwkJCQkJCQkJdG1wWzBdID0gJ1wwJzsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJdG1wKys7CisJCQkJCX0KKworCQkJCQkvL3JlbW92ZSBhbnkgdHJhaWxpbmcgc3BhY2VzCisJCQkJCXRtcCA9IGNscitzdHJsZW4oY2xyKS0xOworCQkJCQl3aGlsZSggKnRtcCA9PSAnICcgKSB7CisJCQkJCQkqdG1wID0gJ1wwJzsKKwkJCQkJCXRtcC0tOworCQkJCQl9CisKKwkJCQkJaWYgKCFGcmVlSW1hZ2VfTG9va3VwWDExQ29sb3IoY2xyLCAgJnJnYmEuciwgJnJnYmEuZywgJnJnYmEuYikpIHsKKwkJCQkJCXNwcmludGYobXNnLCAiVW5rbm93biBjb2xvciBuYW1lICclcyciLCBzdHIpOworCQkJCQkJZnJlZShzdHIpOworCQkJCQkJdGhyb3cgbXNnOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlmcmVlKHN0cik7CisJCQkJdGhyb3cgIk9ubHkgY29sb3IgdmlzdWFscyBhcmUgc3VwcG9ydGVkIjsKKwkJCX0KKworCQkJLy9hZGQgY29sb3IgdG8gbWFwCisJCQlyZ2JhLmEgPSAoQllURSkoKGNvbG9ycyA+IDI1NikgPyAwIDogaSk7CisJCQlyYXdwYWxbY2hyc10gPSByZ2JhOworCisJCQkvL2J1aWxkIHBhbGV0dGUgaWYgbmVlZGVkCisJCQlpZiggY29sb3JzIDw9IDI1NiApIHsKKwkJCQlSR0JRVUFEICpwYWwgPSBGcmVlSW1hZ2VfR2V0UGFsZXR0ZShkaWIpOworCQkJCXBhbFtpXS5yZ2JCbHVlID0gcmdiYS5iOworCQkJCXBhbFtpXS5yZ2JHcmVlbiA9IHJnYmEuZzsKKwkJCQlwYWxbaV0ucmdiUmVkID0gcmdiYS5yOworCQkJfQorCisJCQlmcmVlKHN0cik7CisJCX0KKwkJLy9kb25lIHBhcnNpbmcgY29sb3IgbWFwCisKKwkJaWYoaGVhZGVyX29ubHkpIHsKKwkJCS8vIGhlYWRlciBvbmx5IG1vZGUKKwkJCXJldHVybiBkaWI7CisJCX0KKworCQkvL3JlYWQgaW4gcGl4ZWwgZGF0YQorCQlmb3IoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KysgKSB7CisJCQlCWVRFICpsaW5lID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgaGVpZ2h0IC0geSAtIDEpOworCQkJc3RyID0gUmVhZFN0cmluZyhpbywgaGFuZGxlKTsKKwkJCWlmKCFzdHIpCisJCQkJdGhyb3cgIkVycm9yIHJlYWRpbmcgcGl4ZWwgc3RyaW5ncyI7CisJCQljaGFyICpwaXhlbF9wdHIgPSBzdHI7CisKKwkJCWZvcihpbnQgeCA9IDA7IHggPCB3aWR0aDsgeCsrICkgeworCQkJCS8vbG9jYXRlIHRoZSBjaGFycyBpbiB0aGUgY29sb3IgbWFwCisJCQkJc3RkOjpzdHJpbmcgY2hycyhwaXhlbF9wdHIsY3BwKTsKKwkJCQlGSUxFX1JHQkEgcmdiYSA9IHJhd3BhbFtjaHJzXTsKKworCQkJCWlmKCBjb2xvcnMgPiAyNTYgKSB7CisJCQkJCWxpbmVbRklfUkdCQV9CTFVFXSA9IHJnYmEuYjsKKwkJCQkJbGluZVtGSV9SR0JBX0dSRUVOXSA9IHJnYmEuZzsKKwkJCQkJbGluZVtGSV9SR0JBX1JFRF0gPSByZ2JhLnI7CisJCQkJCWxpbmUgKz0gMzsKKwkJCQl9IGVsc2UgeworCQkJCQkqbGluZSA9IHJnYmEuYTsKKwkJCQkJbGluZSsrOworCQkJCX0KKworCQkJCXBpeGVsX3B0ciArPSBjcHA7CisJCQl9CisKKwkJCWZyZWUoc3RyKTsKKwkJfQorCQkvL2RvbmUgcmVhZGluZyBwaXhlbCBkYXRhCisKKwkJcmV0dXJuIGRpYjsKKwl9IGNhdGNoKGNvbnN0IGNoYXIgKnRleHQpIHsKKyAgICAgICBGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2Moc19mb3JtYXRfaWQsIHRleHQpOworCisgICAgICAgaWYoIGRpYiAhPSBOVUxMICkKKyAgICAgICAgICAgRnJlZUltYWdlX1VubG9hZChkaWIpOworCisgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorfQorCitzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYKK1NhdmUoRnJlZUltYWdlSU8gKmlvLCBGSUJJVE1BUCAqZGliLCBmaV9oYW5kbGUgaGFuZGxlLCBpbnQgcGFnZSwgaW50IGZsYWdzLCB2b2lkICpkYXRhKSB7CisJaWYgKChkaWIgIT0gTlVMTCkgJiYgKGhhbmRsZSAhPSBOVUxMKSkgeworCQljaGFyIGhlYWRlcltdID0gIi8qIFhQTSAqL1xuc3RhdGljIGNoYXIgKmZyZWVpbWFnZVtdID0ge1xuLyogd2lkdGggaGVpZ2h0IG51bV9jb2xvcnMgY2hhcnNfcGVyX3BpeGVsICovXG5cIiIsCisJCXN0YXJ0X2NvbG9yc1tdID0gIlwiLFxuLyogY29sb3JzICovXG5cIiIsCisJCXN0YXJ0X3BpeGVsc1tdID0gIlwiLFxuLyogcGl4ZWxzICovXG5cIiIsCisJCW5ld19saW5lW10gPSAiXCIsXG5cIiIsCisJCWZvb3RlcltdID0gIlwiXG59O1xuIiwKKwkJYnVmWzI1Nl07IC8vMjU2IGlzIG1vcmUgdGhlbiBlbm91Z2ggdG8gc3ByaW50ZiA0IGludHMgaW50bywgb3IgdGhlIGJhc2UtOTIgY2hhcnMgYW5kICNycmdnYmIgbGluZQorCisJCWlmKCBpby0+d3JpdGVfcHJvYyhoZWFkZXIsICh1bnNpZ25lZCBpbnQpc3RybGVuKGhlYWRlciksIDEsIGhhbmRsZSkgIT0gMSApCisJCQlyZXR1cm4gRkFMU0U7CisKKwkJaW50IHdpZHRoID0gRnJlZUltYWdlX0dldFdpZHRoKGRpYiksIGhlaWdodCA9IEZyZWVJbWFnZV9HZXRIZWlnaHQoZGliKSwgYnBwID0gRnJlZUltYWdlX0dldEJQUChkaWIpOworCQlSR0JRVUFEICpwYWwgPSBGcmVlSW1hZ2VfR2V0UGFsZXR0ZShkaWIpOworCQlpbnQgeCx5OworCisJCS8vbWFwIGJhc2U5MiBjaHJzIHRvIHRoZSByZ2IgdmFsdWUgdG8gY3JlYXRlIHRoZSBwYWxldHRlCisJCXN0ZDo6bWFwPERXT1JELEZJTEVfUkdCPiBjaHJzMmNvbG9yOworCQkvL21hcCA4YnBwIGluZGV4IG9yIDI0YnBwIHJnYiB2YWx1ZSB0byB0aGUgYmFzZTkyIGNocnMgdG8gY3JlYXRlIHBpeGVsIGRhdGEKKwkJdHlwZWRlZiB1bmlvbiB7CisJCQlEV09SRCBpbmRleDsKKwkJCUZJTEVfUkdCQSByZ2JhOworCQl9IERXT1JEUkdCQTsKKwkJc3RkOjptYXA8RFdPUkQsc3RkOjpzdHJpbmc+IGNvbG9yMmNocnM7CisKKwkJLy9sb29wIHRocnUgZW50aXJlIGRpYiwgaWYgbmV3IGNvbG9yLCBpbmMgbnVtX2NvbG9ycyBhbmQgYWRkIHRvIGJvdGggbWFwcworCQlpbnQgbnVtX2NvbG9ycyA9IDA7CisJCWZvcih5ID0gMDsgeSA8IGhlaWdodDsgeSsrICkgeworCQkJQllURSAqbGluZSA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIGhlaWdodCAtIHkgLSAxKTsKKwkJCWZvcih4ID0gMDsgeCA8IHdpZHRoOyB4KysgKSB7CisJCQkJRklMRV9SR0IgcmdiOworCQkJCURXT1JEUkdCQSB1OworCQkJCWlmKCBicHAgPiA4ICkgeworCQkJCQl1LnJnYmEuYiA9IHJnYi5iID0gbGluZVtGSV9SR0JBX0JMVUVdOworCQkJCQl1LnJnYmEuZyA9IHJnYi5nID0gbGluZVtGSV9SR0JBX0dSRUVOXTsKKwkJCQkJdS5yZ2JhLnIgPSByZ2IuciA9IGxpbmVbRklfUkdCQV9SRURdOworCQkJCQl1LnJnYmEuYSA9IDA7CisJCQkJCWxpbmUgKz0gMzsKKwkJCQl9IGVsc2UgeworCQkJCQl1LmluZGV4ID0gKmxpbmU7CisJCQkJCXJnYi5iID0gcGFsW3UuaW5kZXhdLnJnYkJsdWU7CisJCQkJCXJnYi5nID0gcGFsW3UuaW5kZXhdLnJnYkdyZWVuOworCQkJCQlyZ2IuciA9IHBhbFt1LmluZGV4XS5yZ2JSZWQ7CisJCQkJCWxpbmUrKzsKKwkJCQl9CisJCQkJaWYoIGNvbG9yMmNocnMuZmluZCh1LmluZGV4KSA9PSBjb2xvcjJjaHJzLmVuZCgpICkgeyAvL25ldyBjb2xvcgorCQkJCQlzdGQ6OnN0cmluZyBjaHJzKEJhc2U5MihudW1fY29sb3JzKSk7CisJCQkJCWNvbG9yMmNocnNbdS5pbmRleF0gPSBjaHJzOworCQkJCQljaHJzMmNvbG9yW251bV9jb2xvcnNdID0gcmdiOworCQkJCQludW1fY29sb3JzKys7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaW50IGNwcCA9IChpbnQpKGxvZygoZG91YmxlKW51bV9jb2xvcnMpL2xvZyg5Mi4wKSkgKyAxOworCisJCXNwcmludGYoYnVmLCAiJWQgJWQgJWQgJWQiLCBGcmVlSW1hZ2VfR2V0V2lkdGgoZGliKSwgRnJlZUltYWdlX0dldEhlaWdodChkaWIpLCBudW1fY29sb3JzLCBjcHAgKTsKKwkJaWYoIGlvLT53cml0ZV9wcm9jKGJ1ZiwgKHVuc2lnbmVkIGludClzdHJsZW4oYnVmKSwgMSwgaGFuZGxlKSAhPSAxICkKKwkJCXJldHVybiBGQUxTRTsKKworCQlpZiggaW8tPndyaXRlX3Byb2Moc3RhcnRfY29sb3JzLCAodW5zaWduZWQgaW50KXN0cmxlbihzdGFydF9jb2xvcnMpLCAxLCBoYW5kbGUpICE9IDEgKQorCQkJcmV0dXJuIEZBTFNFOworCisJCS8vd3JpdGUgY29sb3JzLCB1c2luZyBtYXAgb2YgY2hycy0+cmdiCisJCWZvcih4ID0gMDsgeCA8IG51bV9jb2xvcnM7IHgrKyApIHsKKwkJCXNwcmludGYoYnVmLCAiJSpzIGMgIyUwMnglMDJ4JTAyeCIsIGNwcCwgQmFzZTkyKHgpLCBjaHJzMmNvbG9yW3hdLnIsIGNocnMyY29sb3JbeF0uZywgY2hyczJjb2xvclt4XS5iICk7CisJCQlpZiggaW8tPndyaXRlX3Byb2MoYnVmLCAodW5zaWduZWQgaW50KXN0cmxlbihidWYpLCAxLCBoYW5kbGUpICE9IDEgKQorCQkJCXJldHVybiBGQUxTRTsKKwkJCWlmKCB4ID09IG51bV9jb2xvcnMgLSAxICkgeworCQkJCWlmKCBpby0+d3JpdGVfcHJvYyhzdGFydF9waXhlbHMsICh1bnNpZ25lZCBpbnQpc3RybGVuKHN0YXJ0X3BpeGVscyksIDEsIGhhbmRsZSkgIT0gMSApCisJCQkJCXJldHVybiBGQUxTRTsKKwkJCX0gZWxzZSB7CisJCQkJaWYoIGlvLT53cml0ZV9wcm9jKG5ld19saW5lLCAodW5zaWduZWQgaW50KXN0cmxlbihuZXdfbGluZSksIDEsIGhhbmRsZSkgIT0gMSApCisJCQkJCXJldHVybiBGQUxTRTsKKwkJCX0KKwkJfQorCisKKwkJLy93cml0ZSBwaXhlbHMsIHVzaW5nIG1hcCBvZiByZ2IoaWYgMjRicHApIG9yIGluZGV4KGlmIDhicHApLT5jaHJzCisJCWZvcih5ID0gMDsgeSA8IGhlaWdodDsgeSsrICkgeworCQkJQllURSAqbGluZSA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIGhlaWdodCAtIHkgLSAxKTsKKwkJCWZvcih4ID0gMDsgeCA8IHdpZHRoOyB4KysgKSB7CisJCQkJRFdPUkRSR0JBIHU7CisJCQkJaWYoIGJwcCA+IDggKSB7CisJCQkJCXUucmdiYS5iID0gbGluZVtGSV9SR0JBX0JMVUVdOworCQkJCQl1LnJnYmEuZyA9IGxpbmVbRklfUkdCQV9HUkVFTl07CisJCQkJCXUucmdiYS5yID0gbGluZVtGSV9SR0JBX1JFRF07CisJCQkJCXUucmdiYS5hID0gMDsKKwkJCQkJbGluZSArPSAzOworCQkJCX0gZWxzZSB7CisJCQkJCXUuaW5kZXggPSAqbGluZTsKKwkJCQkJbGluZSsrOworCQkJCX0KKwkJCQlzcHJpbnRmKGJ1ZiwgIiUqcyIsIGNwcCwgKGNoYXIgKiljb2xvcjJjaHJzW3UuaW5kZXhdLmNfc3RyKCkpOworCQkJCWlmKCBpby0+d3JpdGVfcHJvYyhidWYsIGNwcCwgMSwgaGFuZGxlKSAhPSAxICkKKwkJCQkJcmV0dXJuIEZBTFNFOworCQkJfQorCQkJaWYoIHkgPT0gaGVpZ2h0IC0gMSApIHsKKwkJCQlpZiggaW8tPndyaXRlX3Byb2MoZm9vdGVyLCAodW5zaWduZWQgaW50KXN0cmxlbihmb290ZXIpLCAxLCBoYW5kbGUpICE9IDEgKQorCQkJCQlyZXR1cm4gRkFMU0U7CisJCQl9IGVsc2UgeworCQkJCWlmKCBpby0+d3JpdGVfcHJvYyhuZXdfbGluZSwgKHVuc2lnbmVkIGludClzdHJsZW4obmV3X2xpbmUpLCAxLCBoYW5kbGUpICE9IDEgKQorCQkJCQlyZXR1cm4gRkFMU0U7CisJCQl9CisJCX0KKworCQlyZXR1cm4gVFJVRTsKKwl9IGVsc2UgeworCQlyZXR1cm4gRkFMU0U7CisJfQorfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgIEluaXQKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwordm9pZCBETExfQ0FMTENPTlYKK0luaXRYUE0oUGx1Z2luICpwbHVnaW4sIGludCBmb3JtYXRfaWQpCit7CisgICAgc19mb3JtYXRfaWQgPSBmb3JtYXRfaWQ7CisKKwlwbHVnaW4tPmZvcm1hdF9wcm9jID0gRm9ybWF0OworCXBsdWdpbi0+ZGVzY3JpcHRpb25fcHJvYyA9IERlc2NyaXB0aW9uOworCXBsdWdpbi0+ZXh0ZW5zaW9uX3Byb2MgPSBFeHRlbnNpb247CisJcGx1Z2luLT5yZWdleHByX3Byb2MgPSBSZWdFeHByOworCXBsdWdpbi0+b3Blbl9wcm9jID0gTlVMTDsKKwlwbHVnaW4tPmNsb3NlX3Byb2MgPSBOVUxMOworCXBsdWdpbi0+cGFnZWNvdW50X3Byb2MgPSBOVUxMOworCXBsdWdpbi0+cGFnZWNhcGFiaWxpdHlfcHJvYyA9IE5VTEw7CisJcGx1Z2luLT5sb2FkX3Byb2MgPSBMb2FkOworCXBsdWdpbi0+c2F2ZV9wcm9jID0gU2F2ZTsKKwlwbHVnaW4tPnZhbGlkYXRlX3Byb2MgPSBWYWxpZGF0ZTsKKwlwbHVnaW4tPm1pbWVfcHJvYyA9IE1pbWVUeXBlOworCXBsdWdpbi0+c3VwcG9ydHNfZXhwb3J0X2JwcF9wcm9jID0gU3VwcG9ydHNFeHBvcnREZXB0aDsKKwlwbHVnaW4tPnN1cHBvcnRzX2V4cG9ydF90eXBlX3Byb2MgPSBTdXBwb3J0c0V4cG9ydFR5cGU7CisJcGx1Z2luLT5zdXBwb3J0c19pY2NfcHJvZmlsZXNfcHJvYyA9IE5VTEw7CisJcGx1Z2luLT5zdXBwb3J0c19ub19waXhlbHNfcHJvYyA9IFN1cHBvcnRzTm9QaXhlbHM7Cit9CisKZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvVElGRkxvZ0x1di5jcHAgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL1RJRkZMb2dMdXYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyNGIyNWYKLS0tIC9kZXYvbnVsbAorKysgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL1RJRkZMb2dMdXYuY3BwCkBAIC0wLDAgKzEsNjUgQEAKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFhZWiB0byBSR0IgVElGRiBjb252ZXJzaW9uIHJvdXRpbmVzCisvLworLy8gRGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBieQorLy8gLSBIZXJ26SBEcm9sb24gKGRyb2xvbkBpbmZvbmllLmZyKQorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZyZWVJbWFnZSAzCisvLworLy8gQ09WRVJFRCBDT0RFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZCisvLyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUworLy8gVEhBVCBUSEUgQ09WRVJFRCBDT0RFIElTIEZSRUUgT0YgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisvLyBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRAorLy8gQ09ERSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVAorLy8gVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GIEFOWSBORUNFU1NBUlkKKy8vIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwKKy8vIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIKKy8vIFRISVMgRElTQ0xBSU1FUi4KKy8vCisvLyBVc2UgYXQgeW91ciBvd24gcmlzayEKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2luY2x1ZGUgIkZyZWVJbWFnZS5oIgorI2luY2x1ZGUgIlV0aWxpdGllcy5oIgorCit2b2lkIHRpZmZfQ29udmVydExpbmVYWVpUb1JHQihCWVRFICp0YXJnZXQsIEJZVEUgKnNvdXJjZSwgZG91YmxlIHN0b25pdHMsIGludCB3aWR0aF9pbl9waXhlbHMpIHsKKwlGSVJHQkYgKnJnYmYgPSAoRklSR0JGKil0YXJnZXQ7CisJZmxvYXQgKnh5eiA9IChmbG9hdCopc291cmNlOworCQorCWZvciAoaW50IGNvbHMgPSAwOyBjb2xzIDwgd2lkdGhfaW5fcGl4ZWxzOyBjb2xzKyspIHsKKwkJLy8gYXNzdW1lIENDSVItNzA5IHByaW1hcmllcyAobWF0cml4IGZyb20gdGlmX2x1di5jKQorCQkvLyBMT0cgTHV2IFhZWiAoRDY1KSAtPiBzUkdCIChDSUUgSWxsdW1pbmFudCBFKQorCQlyZ2JmLT5yZWQJPSAoZmxvYXQpKCAyLjY5MCp4eXpbMF0gKyAtMS4yNzYqeHl6WzFdICsgLTAuNDE0Knh5elsyXSk7CisJCXJnYmYtPmdyZWVuCT0gKGZsb2F0KSgtMS4wMjIqeHl6WzBdICsgIDEuOTc4Knh5elsxXSArICAwLjA0NCp4eXpbMl0pOworCQlyZ2JmLT5ibHVlCT0gKGZsb2F0KSggMC4wNjEqeHl6WzBdICsgLTAuMjI0Knh5elsxXSArICAxLjE2Myp4eXpbMl0pOworCQkKKwkJLyoKKwkJaWYgKHN0b25pdHMgIT0gMC4wKSB7CisJCQlyZ2JmLT5yZWQJPSAoZmxvYXQpKHJnYmYtPnJlZCAgICogc3Rvbml0cyk7CisJCQlyZ2JmLT5ncmVlbgk9IChmbG9hdCkocmdiZi0+Z3JlZW4gKiBzdG9uaXRzKTsKKwkJCXJnYmYtPmJsdWUJPSAoZmxvYXQpKHJnYmYtPmJsdWUgICogc3Rvbml0cyk7CisJCX0gCisJCSovCisKKwkJcmdiZisrOworCQl4eXogKz0gMzsKKwl9Cit9CisKK3ZvaWQgdGlmZl9Db252ZXJ0TGluZVJHQlRvWFlaKEJZVEUgKnRhcmdldCwgQllURSAqc291cmNlLCBpbnQgd2lkdGhfaW5fcGl4ZWxzKSB7CisJRklSR0JGICpyZ2JmID0gKEZJUkdCRiopc291cmNlOworCWZsb2F0ICp4eXogPSAoZmxvYXQqKXRhcmdldDsKKwkKKwlmb3IgKGludCBjb2xzID0gMDsgY29scyA8IHdpZHRoX2luX3BpeGVsczsgY29scysrKSB7CisJCS8vIGFzc3VtZSBDQ0lSLTcwOSBwcmltYXJpZXMsIHdoaXRlcG9pbnQgeCA9IDEvMyB5ID0gMS8zIChEX0UpCisJCS8vICJUaGUgTG9nTHV2IEVuY29kaW5nIGZvciBGdWxsIEdhbXV0LCBIaWdoIER5bmFtaWMgUmFuZ2UgSW1hZ2VzIiA8Ry5XYXJkPgorCQkvLyBzUkdCICggQ0lFIElsbHVtaW5hbnQgRSApIC0+IExPRyBMdXYgWFlaIChENjUpCisJCXh5elswXSA9ICAoZmxvYXQpKDAuNDk3KnJnYmYtPnJlZCArICAwLjMzOSpyZ2JmLT5ncmVlbiArICAwLjE2NCpyZ2JmLT5ibHVlKTsKKwkJeHl6WzFdID0gIChmbG9hdCkoMC4yNTYqcmdiZi0+cmVkICsgIDAuNjc4KnJnYmYtPmdyZWVuICsgIDAuMDY2KnJnYmYtPmJsdWUpOworCQl4eXpbMl0gPSAgKGZsb2F0KSgwLjAyMypyZ2JmLT5yZWQgKyAgMC4xMTMqcmdiZi0+Z3JlZW4gKyAgMC44NjQqcmdiZi0+Ymx1ZSk7CisKKwkJcmdiZisrOworCQl4eXogKz0gMzsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvVG9uZU1hcHBpbmcuY3BwIGIvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9Ub25lTWFwcGluZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdmOGM5NQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvVG9uZU1hcHBpbmcuY3BwCkBAIC0wLDAgKzEsNzUgQEAKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFRvbmUgbWFwcGluZyBvcGVyYXRvcnMKKy8vCisvLyBEZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIGJ5CisvLyAtIEhlcnbpIERyb2xvbiAoZHJvbG9uQGluZm9uaWUuZnIpCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRnJlZUltYWdlIDMKKy8vCisvLyBDT1ZFUkVEIENPREUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkKKy8vIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTCisvLyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy8vIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVECisvLyBDT0RFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UCisvLyBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWQorLy8gU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTAorLy8gUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUgorLy8gVEhJUyBESVNDTEFJTUVSLgorLy8KKy8vIFVzZSBhdCB5b3VyIG93biByaXNrIQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaW5jbHVkZSAiRnJlZUltYWdlLmgiCisjaW5jbHVkZSAiVXRpbGl0aWVzLmgiCisKKy8qKgorUGVyZm9ybXMgYSB0b25lIG1hcHBpbmcgb24gYSA0OC1iaXQgUkdCIG9yIGEgOTYtYml0IFJHQkYgaW1hZ2UgYW5kIHJldHVybnMgYSAyNC1iaXQgaW1hZ2UuIAorVGhlIG1lYW5pbmcgb2YgdGhlIHBhcmFtZXRlcnMgZGVwZW5kcyBvbiB0aGUgY2hvb3NlbiBhbGdvcml0aG0uIAorV2hlbiBib3RoIHBhcmFtZXRlcnMgYXJlIHNldCB0byB6ZXJvLCBhIGRlZmF1bHQgc2V0IG9mIHBhcmFtZXRlcnMgaXMgdXNlZC4gCitAcGFyYW0gZGliIElucHV0IFJHQi9SR0JGIGltYWdlCitAcGFyYW0gdG1vIFRvbmUgbWFwcGluZyBvcGVyYXRvcgorQHBhcmFtIGZpcnN0X3BhcmFtIEZpcnN0IHBhcmFtZXRlciBvZiB0aGUgYWxnb3JpdGhtCitAcGFyYW0gc2Vjb25kX3BhcmFtIFNlY29uZCBwYXJhbWV0ZXIgb2YgdGhlIGFsZ29yaXRobQorcmV0dXJuIFJldHVybnMgYSAyNC1iaXQgdG9uZSBtYXBwZWQgaW1hZ2UgaWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyBOVUxMIG90aGVyd2lzZQorKi8gCitGSUJJVE1BUCAqIERMTF9DQUxMQ09OVgorRnJlZUltYWdlX1RvbmVNYXBwaW5nKEZJQklUTUFQICpkaWIsIEZSRUVfSU1BR0VfVE1PIHRtbywgZG91YmxlIGZpcnN0X3BhcmFtLCBkb3VibGUgc2Vjb25kX3BhcmFtKSB7CisJaWYoRnJlZUltYWdlX0hhc1BpeGVscyhkaWIpKSB7CisJCXN3aXRjaCh0bW8pIHsKKwkJCS8vIEFkYXB0aXZlIGxvZ2FyaXRobWljIG1hcHBpbmcgKEYuIERyYWdvLCAyMDAzKQorCQkJY2FzZSBGSVRNT19EUkFHTzAzOgorCQkJCWlmKChmaXJzdF9wYXJhbSA9PSAwKSAmJiAoc2Vjb25kX3BhcmFtID09IDApKSB7CisJCQkJCS8vIHVzZSBkZWZhdWx0IHZhbHVlcyAoZ2FtbWEgPSAyLjIsIGV4cG9zdXJlID0gMCkKKwkJCQkJcmV0dXJuIEZyZWVJbWFnZV9UbW9EcmFnbzAzKGRpYiwgMi4yLCAwKTsKKwkJCQl9IGVsc2UgeworCQkJCQkvLyB1c2UgdXNlcidzIHZhbHVlCisJCQkJCXJldHVybiBGcmVlSW1hZ2VfVG1vRHJhZ28wMyhkaWIsIGZpcnN0X3BhcmFtLCBzZWNvbmRfcGFyYW0pOworCQkJCX0KKwkJCQlicmVhazsKKwkJCS8vIER5bmFtaWMgcmFuZ2UgcmVkdWN0aW9uIGluc3BpcmVkIGJ5IHBob3RvcmVjZXB0b3IgcGhoeXNpb2xvZ3kgKEUuIFJlaW5oYXJkLCAyMDA1KQorCQkJY2FzZSBGSVRNT19SRUlOSEFSRDA1OgorCQkJCWlmKChmaXJzdF9wYXJhbSA9PSAwKSAmJiAoc2Vjb25kX3BhcmFtID09IDApKSB7CisJCQkJCS8vIHVzZSBkZWZhdWx0IHZhbHVlcyBieSBzZXR0aW5nIGludGVuc2l0eSB0byAwIGFuZCBjb250cmFzdCB0byAwCisJCQkJCXJldHVybiBGcmVlSW1hZ2VfVG1vUmVpbmhhcmQwNShkaWIsIDAsIDApOworCQkJCX0gZWxzZSB7CisJCQkJCS8vIHVzZSB1c2VyJ3MgdmFsdWUKKwkJCQkJcmV0dXJuIEZyZWVJbWFnZV9UbW9SZWluaGFyZDA1KGRpYiwgZmlyc3RfcGFyYW0sIHNlY29uZF9wYXJhbSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJLy8gR3JhZGllbnQgRG9tYWluIEhEUiBDb21wcmVzc2lvbiAoUi4gRmF0dGFsLCAyMDAyKQorCQkJY2FzZSBGSVRNT19GQVRUQUwwMjoKKwkJCQlpZigoZmlyc3RfcGFyYW0gPT0gMCkgJiYgKHNlY29uZF9wYXJhbSA9PSAwKSkgeworCQkJCQkvLyB1c2UgZGVmYXVsdCB2YWx1ZXMgYnkgc2V0dGluZyBjb2xvciBzYXR1cmF0aW9uIHRvIDAuNSBhbmQgYXR0ZW51YXRpb24gdG8gMC44NQorCQkJCQlyZXR1cm4gRnJlZUltYWdlX1Rtb0ZhdHRhbDAyKGRpYiwgMC41LCAwLjg1KTsKKwkJCQl9IGVsc2UgeworCQkJCQkvLyB1c2UgdXNlcidzIHZhbHVlCisJCQkJCXJldHVybiBGcmVlSW1hZ2VfVG1vRmF0dGFsMDIoZGliLCBmaXJzdF9wYXJhbSwgc2Vjb25kX3BhcmFtKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworCmRpZmYgLS1naXQgYS9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL1d1UXVhbnRpemVyLmNwcCBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvV3VRdWFudGl6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZDM3MDYKLS0tIC9kZXYvbnVsbAorKysgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL1d1UXVhbnRpemVyLmNwcApAQCAtMCwwICsxLDU1OSBAQAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCSAgICBDIEltcGxlbWVudGF0aW9uIG9mIFd1J3MgQ29sb3IgUXVhbnRpemVyICh2LiAyKQorLy8JICAgIChzZWUgR3JhcGhpY3MgR2VtcyB2b2wuIElJLCBwcC4gMTI2LTEzMykKKy8vCisvLyBBdXRob3I6CVhpYW9saW4gV3UKKy8vIERlcHQuIG9mIENvbXB1dGVyIFNjaWVuY2UKKy8vIFVuaXYuIG9mIFdlc3Rlcm4gT250YXJpbworLy8gTG9uZG9uLCBPbnRhcmlvIE42QSA1QjcKKy8vIHd1QGNzZC51d28uY2EKKy8vIAorLy8gQWxnb3JpdGhtOiBHcmVlZHkgb3J0aG9nb25hbCBiaXBhcnRpdGlvbiBvZiBSR0Igc3BhY2UgZm9yIHZhcmlhbmNlCisvLyAJICAgbWluaW1pemF0aW9uIGFpZGVkIGJ5IGluY2x1c2lvbi1leGNsdXNpb24gdHJpY2tzLgorLy8gCSAgIEZvciBzcGVlZCBubyBuZWFyZXN0IG5laWdoYm9yIHNlYXJjaCBpcyBkb25lLiBTbGlnaHRseQorLy8gCSAgIGJldHRlciBwZXJmb3JtYW5jZSBjYW4gYmUgZXhwZWN0ZWQgYnkgbW9yZSBzb3BoaXN0aWNhdGVkCisvLyAJICAgYnV0IG1vcmUgZXhwZW5zaXZlIHZlcnNpb25zLgorLy8gCisvLyBUaGUgYXV0aG9yIHRoYW5rcyBUb20gTGFuZSBhdCBUb21fTGFuZUBHLkdQLkNTLkNNVS5FRFUgZm9yIG11Y2ggb2YKKy8vIGFkZGl0aW9uYWwgZG9jdW1lbnRhdGlvbiBhbmQgYSBjdXJlIHRvIGEgcHJldmlvdXMgYnVnLgorLy8gCisvLyBGcmVlIHRvIGRpc3RyaWJ1dGUsIGNvbW1lbnRzIGFuZCBzdWdnZXN0aW9ucyBhcmUgYXBwcmVjaWF0ZWQuCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gSGlzdG9yeQorLy8gLS0tLS0tLQorLy8gSnVseSAyMDAwOiAgQysrIEltcGxlbWVudGF0aW9uIG9mIFd1J3MgQ29sb3IgUXVhbnRpemVyCisvLyAgICAgICAgICAgICBhbmQgYWRhcHRhdGlvbiBmb3IgdGhlIEZyZWVJbWFnZSAyIExpYnJhcnkKKy8vICAgICAgICAgICAgIEF1dGhvcjogSGVydukgRHJvbG9uIChkcm9sb25AaW5mb25pZS5mcikKKy8vIE1hcmNoIDIwMDQ6IEFkYXB0YXRpb24gZm9yIHRoZSBGcmVlSW1hZ2UgMyBsaWJyYXJ5IChwb3J0IHRvIGJpZyBlbmRpYW4gcHJvY2Vzc29ycykKKy8vICAgICAgICAgICAgIEF1dGhvcjogSGVydukgRHJvbG9uIChkcm9sb25AaW5mb25pZS5mcikKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyNpbmNsdWRlICJRdWFudGl6ZXJzLmgiCisjaW5jbHVkZSAiRnJlZUltYWdlLmgiCisjaW5jbHVkZSAiVXRpbGl0aWVzLmgiCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIFNpemUgb2YgYSAzRCBhcnJheSA6IDMzIHggMzMgeCAzMworI2RlZmluZSBTSVpFXzNECTM1OTM3CisKKy8vIDNEIGFycmF5IGluZGV4YXRpb24KKyNkZWZpbmUgSU5ERVgociwgZywgYikJKChyIDw8IDEwKSArIChyIDw8IDYpICsgciArIChnIDw8IDUpICsgZyArIGIpCisKKyNkZWZpbmUgTUFYQ09MT1IJMjU2CisKKy8vIENvbnN0cnVjdG9yIC8gRGVzdHJ1Y3RvcgorCitXdVF1YW50aXplcjo6V3VRdWFudGl6ZXIoRklCSVRNQVAgKmRpYikgeworCXdpZHRoID0gRnJlZUltYWdlX0dldFdpZHRoKGRpYik7CisJaGVpZ2h0ID0gRnJlZUltYWdlX0dldEhlaWdodChkaWIpOworCXBpdGNoID0gRnJlZUltYWdlX0dldFBpdGNoKGRpYik7CisJbV9kaWIgPSBkaWI7CisKKwlnbTIgPSBOVUxMOworCXd0ID0gbXIgPSBtZyA9IG1iID0gTlVMTDsKKwlRYWRkID0gTlVMTDsKKworCS8vIEFsbG9jYXRlIDNEIGFycmF5cworCWdtMiA9IChmbG9hdCopbWFsbG9jKFNJWkVfM0QgKiBzaXplb2YoZmxvYXQpKTsKKwl3dCA9IChMT05HKiltYWxsb2MoU0laRV8zRCAqIHNpemVvZihMT05HKSk7CisJbXIgPSAoTE9ORyopbWFsbG9jKFNJWkVfM0QgKiBzaXplb2YoTE9ORykpOworCW1nID0gKExPTkcqKW1hbGxvYyhTSVpFXzNEICogc2l6ZW9mKExPTkcpKTsKKwltYiA9IChMT05HKiltYWxsb2MoU0laRV8zRCAqIHNpemVvZihMT05HKSk7CisKKwkvLyBBbGxvY2F0ZSBRYWRkCisJUWFkZCA9IChXT1JEICopbWFsbG9jKHNpemVvZihXT1JEKSAqIHdpZHRoICogaGVpZ2h0KTsKKworCWlmKCFnbTIgfHwgIXd0IHx8ICFtciB8fCAhbWcgfHwgIW1iIHx8ICFRYWRkKSB7CisJCWlmKGdtMikJZnJlZShnbTIpOworCQlpZih3dCkJZnJlZSh3dCk7CisJCWlmKG1yKQlmcmVlKG1yKTsKKwkJaWYobWcpCWZyZWUobWcpOworCQlpZihtYikJZnJlZShtYik7CisJCWlmKFFhZGQpICBmcmVlKFFhZGQpOworCQl0aHJvdyBGSV9NU0dfRVJST1JfTUVNT1JZOworCX0KKwltZW1zZXQoZ20yLCAwLCBTSVpFXzNEICogc2l6ZW9mKGZsb2F0KSk7CisJbWVtc2V0KHd0LCAwLCBTSVpFXzNEICogc2l6ZW9mKExPTkcpKTsKKwltZW1zZXQobXIsIDAsIFNJWkVfM0QgKiBzaXplb2YoTE9ORykpOworCW1lbXNldChtZywgMCwgU0laRV8zRCAqIHNpemVvZihMT05HKSk7CisJbWVtc2V0KG1iLCAwLCBTSVpFXzNEICogc2l6ZW9mKExPTkcpKTsKKwltZW1zZXQoUWFkZCwgMCwgc2l6ZW9mKFdPUkQpICogd2lkdGggKiBoZWlnaHQpOworfQorCitXdVF1YW50aXplcjo6fld1UXVhbnRpemVyKCkgeworCWlmKGdtMikJZnJlZShnbTIpOworCWlmKHd0KQlmcmVlKHd0KTsKKwlpZihtcikJZnJlZShtcik7CisJaWYobWcpCWZyZWUobWcpOworCWlmKG1iKQlmcmVlKG1iKTsKKwlpZihRYWRkKSAgZnJlZShRYWRkKTsKK30KKworCisvLyBIaXN0b2dyYW0gaXMgaW4gZWxlbWVudHMgMS4uSElTVFNJWkUgYWxvbmcgZWFjaCBheGlzLAorLy8gZWxlbWVudCAwIGlzIGZvciBiYXNlIG9yIG1hcmdpbmFsIHZhbHVlCisvLyBOQjogdGhlc2UgbXVzdCBzdGFydCBvdXQgMCEKKworLy8gQnVpbGQgMy1EIGNvbG9yIGhpc3RvZ3JhbSBvZiBjb3VudHMsIHIvZy9iLCBjXjIKK3ZvaWQgCitXdVF1YW50aXplcjo6SGlzdDNEKExPTkcgKnZ3dCwgTE9ORyAqdm1yLCBMT05HICp2bWcsIExPTkcgKnZtYiwgZmxvYXQgKm0yLCBpbnQgUmVzZXJ2ZVNpemUsIFJHQlFVQUQgKlJlc2VydmVQYWxldHRlKSB7CisJaW50IGluZCA9IDA7CisJaW50IGluciwgaW5nLCBpbmIsIHRhYmxlWzI1Nl07CisJaW50IGk7CisJdW5zaWduZWQgeSwgeDsKKworCWZvcihpID0gMDsgaSA8IDI1NjsgaSsrKQorCQl0YWJsZVtpXSA9IGkgKiBpOworCisJaWYgKEZyZWVJbWFnZV9HZXRCUFAobV9kaWIpID09IDI0KSB7CisJCWZvcih5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisJCQlCWVRFICpiaXRzID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKG1fZGliLCB5KTsKKworCQkJZm9yKHggPSAwOyB4IDwgd2lkdGg7IHgrKykJeworCQkJCWluciA9IChiaXRzW0ZJX1JHQkFfUkVEXSA+PiAzKSArIDE7CisJCQkJaW5nID0gKGJpdHNbRklfUkdCQV9HUkVFTl0gPj4gMykgKyAxOworCQkJCWluYiA9IChiaXRzW0ZJX1JHQkFfQkxVRV0gPj4gMykgKyAxOworCQkJCWluZCA9IElOREVYKGluciwgaW5nLCBpbmIpOworCQkJCVFhZGRbeSp3aWR0aCArIHhdID0gKFdPUkQpaW5kOworCQkJCS8vIFtpbnJdW2luZ11baW5iXQorCQkJCXZ3dFtpbmRdKys7CisJCQkJdm1yW2luZF0gKz0gYml0c1tGSV9SR0JBX1JFRF07CisJCQkJdm1nW2luZF0gKz0gYml0c1tGSV9SR0JBX0dSRUVOXTsKKwkJCQl2bWJbaW5kXSArPSBiaXRzW0ZJX1JHQkFfQkxVRV07CisJCQkJbTJbaW5kXSArPSAoZmxvYXQpKHRhYmxlW2JpdHNbRklfUkdCQV9SRURdXSArIHRhYmxlW2JpdHNbRklfUkdCQV9HUkVFTl1dICsgdGFibGVbYml0c1tGSV9SR0JBX0JMVUVdXSk7CisJCQkJYml0cyArPSAzOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJZm9yKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJCUJZVEUgKmJpdHMgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUobV9kaWIsIHkpOworCisJCQlmb3IoeCA9IDA7IHggPCB3aWR0aDsgeCsrKQl7CisJCQkJaW5yID0gKGJpdHNbRklfUkdCQV9SRURdID4+IDMpICsgMTsKKwkJCQlpbmcgPSAoYml0c1tGSV9SR0JBX0dSRUVOXSA+PiAzKSArIDE7CisJCQkJaW5iID0gKGJpdHNbRklfUkdCQV9CTFVFXSA+PiAzKSArIDE7CisJCQkJaW5kID0gSU5ERVgoaW5yLCBpbmcsIGluYik7CisJCQkJUWFkZFt5KndpZHRoICsgeF0gPSAoV09SRClpbmQ7CisJCQkJLy8gW2lucl1baW5nXVtpbmJdCisJCQkJdnd0W2luZF0rKzsKKwkJCQl2bXJbaW5kXSArPSBiaXRzW0ZJX1JHQkFfUkVEXTsKKwkJCQl2bWdbaW5kXSArPSBiaXRzW0ZJX1JHQkFfR1JFRU5dOworCQkJCXZtYltpbmRdICs9IGJpdHNbRklfUkdCQV9CTFVFXTsKKwkJCQltMltpbmRdICs9IChmbG9hdCkodGFibGVbYml0c1tGSV9SR0JBX1JFRF1dICsgdGFibGVbYml0c1tGSV9SR0JBX0dSRUVOXV0gKyB0YWJsZVtiaXRzW0ZJX1JHQkFfQkxVRV1dKTsKKwkJCQliaXRzICs9IDQ7CisJCQl9CisJCX0KKwl9CisKKwlpZiggUmVzZXJ2ZVNpemUgPiAwICkgeworCQlpbnQgbWF4ID0gMDsKKwkJZm9yKGkgPSAwOyBpIDwgU0laRV8zRDsgaSsrKSB7CisJCQlpZiggdnd0W2ldID4gbWF4ICkgbWF4ID0gdnd0W2ldOworCQl9CisJCW1heCsrOworCQlmb3IoaSA9IDA7IGkgPCBSZXNlcnZlU2l6ZTsgaSsrKSB7CisJCQlpbnIgPSAoUmVzZXJ2ZVBhbGV0dGVbaV0ucmdiUmVkID4+IDMpICsgMTsKKwkJCWluZyA9IChSZXNlcnZlUGFsZXR0ZVtpXS5yZ2JHcmVlbiA+PiAzKSArIDE7CisJCQlpbmIgPSAoUmVzZXJ2ZVBhbGV0dGVbaV0ucmdiQmx1ZSA+PiAzKSArIDE7CisJCQlpbmQgPSBJTkRFWChpbnIsIGluZywgaW5iKTsKKwkJCXd0W2luZF0gPSBtYXg7CisJCQltcltpbmRdID0gbWF4ICogUmVzZXJ2ZVBhbGV0dGVbaV0ucmdiUmVkOworCQkJbWdbaW5kXSA9IG1heCAqIFJlc2VydmVQYWxldHRlW2ldLnJnYkdyZWVuOworCQkJbWJbaW5kXSA9IG1heCAqIFJlc2VydmVQYWxldHRlW2ldLnJnYkJsdWU7CisJCQlnbTJbaW5kXSA9IChmbG9hdCltYXggKiAoZmxvYXQpKHRhYmxlW1Jlc2VydmVQYWxldHRlW2ldLnJnYlJlZF0gKyB0YWJsZVtSZXNlcnZlUGFsZXR0ZVtpXS5yZ2JHcmVlbl0gKyB0YWJsZVtSZXNlcnZlUGFsZXR0ZVtpXS5yZ2JCbHVlXSk7CisJCX0KKwl9Cit9CisKKworLy8gQXQgY29uY2x1c2lvbiBvZiB0aGUgaGlzdG9ncmFtIHN0ZXAsIHdlIGNhbiBpbnRlcnByZXQKKy8vIHd0W3JdW2ddW2JdID0gc3VtIG92ZXIgdm94ZWwgb2YgUChjKQorLy8gbXJbcl1bZ11bYl0gPSBzdW0gb3ZlciB2b3hlbCBvZiByKlAoYykgICwgIHNpbWlsYXJseSBmb3IgbWcsIG1iCisvLyBtMltyXVtnXVtiXSA9IHN1bSBvdmVyIHZveGVsIG9mIGNeMipQKGMpCisvLyBBY3R1YWxseSBlYWNoIG9mIHRoZXNlIHNob3VsZCBiZSBkaXZpZGVkIGJ5ICdJbWFnZVNpemUnIHRvIGdpdmUgdGhlIHVzdWFsCisvLyBpbnRlcnByZXRhdGlvbiBvZiBQKCkgYXMgcmFuZ2luZyBmcm9tIDAgdG8gMSwgYnV0IHdlIG5lZWRuJ3QgZG8gdGhhdCBoZXJlLgorCisKKy8vIFdlIG5vdyBjb252ZXJ0IGhpc3RvZ3JhbSBpbnRvIG1vbWVudHMgc28gdGhhdCB3ZSBjYW4gcmFwaWRseSBjYWxjdWxhdGUKKy8vIHRoZSBzdW1zIG9mIHRoZSBhYm92ZSBxdWFudGl0aWVzIG92ZXIgYW55IGRlc2lyZWQgYm94LgorCisvLyBDb21wdXRlIGN1bXVsYXRpdmUgbW9tZW50cwordm9pZCAKK1d1UXVhbnRpemVyOjpNM0QoTE9ORyAqdnd0LCBMT05HICp2bXIsIExPTkcgKnZtZywgTE9ORyAqdm1iLCBmbG9hdCAqbTIpIHsKKwl1bnNpZ25lZCBpbmQxLCBpbmQyOworCUJZVEUgaSwgciwgZywgYjsKKwlMT05HIGxpbmUsIGxpbmVfciwgbGluZV9nLCBsaW5lX2I7CisJTE9ORyBhcmVhWzMzXSwgYXJlYV9yWzMzXSwgYXJlYV9nWzMzXSwgYXJlYV9iWzMzXTsKKwlmbG9hdCBsaW5lMiwgYXJlYTJbMzNdOworCisgICAgZm9yKHIgPSAxOyByIDw9IDMyOyByKyspIHsKKwkJZm9yKGkgPSAwOyBpIDw9IDMyOyBpKyspIHsKKwkJCWFyZWEyW2ldID0gMDsKKwkJCWFyZWFbaV0gPSBhcmVhX3JbaV0gPSBhcmVhX2dbaV0gPSBhcmVhX2JbaV0gPSAwOworCQl9CisJCWZvcihnID0gMTsgZyA8PSAzMjsgZysrKSB7CisJCQlsaW5lMiA9IDA7CisJCQlsaW5lID0gbGluZV9yID0gbGluZV9nID0gbGluZV9iID0gMDsKKwkJCWZvcihiID0gMTsgYiA8PSAzMjsgYisrKSB7CQkJIAorCQkJCWluZDEgPSBJTkRFWChyLCBnLCBiKTsgLy8gW3JdW2ddW2JdCisJCQkJbGluZSArPSB2d3RbaW5kMV07CisJCQkJbGluZV9yICs9IHZtcltpbmQxXTsgCisJCQkJbGluZV9nICs9IHZtZ1tpbmQxXTsgCisJCQkJbGluZV9iICs9IHZtYltpbmQxXTsKKwkJCQlsaW5lMiArPSBtMltpbmQxXTsKKwkJCQlhcmVhW2JdICs9IGxpbmU7CisJCQkJYXJlYV9yW2JdICs9IGxpbmVfcjsKKwkJCQlhcmVhX2dbYl0gKz0gbGluZV9nOworCQkJCWFyZWFfYltiXSArPSBsaW5lX2I7CisJCQkJYXJlYTJbYl0gKz0gbGluZTI7CisJCQkJaW5kMiA9IGluZDEgLSAxMDg5OyAvLyBbci0xXVtnXVtiXQorCQkJCXZ3dFtpbmQxXSA9IHZ3dFtpbmQyXSArIGFyZWFbYl07CisJCQkJdm1yW2luZDFdID0gdm1yW2luZDJdICsgYXJlYV9yW2JdOworCQkJCXZtZ1tpbmQxXSA9IHZtZ1tpbmQyXSArIGFyZWFfZ1tiXTsKKwkJCQl2bWJbaW5kMV0gPSB2bWJbaW5kMl0gKyBhcmVhX2JbYl07CisJCQkJbTJbaW5kMV0gPSBtMltpbmQyXSArIGFyZWEyW2JdOworCQkJfQorCQl9CisJfQorfQorCisvLyBDb21wdXRlIHN1bSBvdmVyIGEgYm94IG9mIGFueSBnaXZlbiBzdGF0aXN0aWMKK0xPTkcgCitXdVF1YW50aXplcjo6Vm9sKCBCb3ggKmN1YmUsIExPTkcgKm1tdCApIHsKKyAgICByZXR1cm4oIG1tdFtJTkRFWChjdWJlLT5yMSwgY3ViZS0+ZzEsIGN1YmUtPmIxKV0gCisJCSAgLSBtbXRbSU5ERVgoY3ViZS0+cjEsIGN1YmUtPmcxLCBjdWJlLT5iMCldCisJCSAgLSBtbXRbSU5ERVgoY3ViZS0+cjEsIGN1YmUtPmcwLCBjdWJlLT5iMSldCisJCSAgKyBtbXRbSU5ERVgoY3ViZS0+cjEsIGN1YmUtPmcwLCBjdWJlLT5iMCldCisJCSAgLSBtbXRbSU5ERVgoY3ViZS0+cjAsIGN1YmUtPmcxLCBjdWJlLT5iMSldCisJCSAgKyBtbXRbSU5ERVgoY3ViZS0+cjAsIGN1YmUtPmcxLCBjdWJlLT5iMCldCisJCSAgKyBtbXRbSU5ERVgoY3ViZS0+cjAsIGN1YmUtPmcwLCBjdWJlLT5iMSldCisJCSAgLSBtbXRbSU5ERVgoY3ViZS0+cjAsIGN1YmUtPmcwLCBjdWJlLT5iMCldICk7Cit9CisKKy8vIFRoZSBuZXh0IHR3byByb3V0aW5lcyBhbGxvdyBhIHNsaWdodGx5IG1vcmUgZWZmaWNpZW50IGNhbGN1bGF0aW9uCisvLyBvZiBWb2woKSBmb3IgYSBwcm9wb3NlZCBzdWJib3ggb2YgYSBnaXZlbiBib3guICBUaGUgc3VtIG9mIFRvcCgpCisvLyBhbmQgQm90dG9tKCkgaXMgdGhlIFZvbCgpIG9mIGEgc3ViYm94IHNwbGl0IGluIHRoZSBnaXZlbiBkaXJlY3Rpb24KKy8vIGFuZCB3aXRoIHRoZSBzcGVjaWZpZWQgbmV3IHVwcGVyIGJvdW5kLgorCisKKy8vIENvbXB1dGUgcGFydCBvZiBWb2woY3ViZSwgbW10KSB0aGF0IGRvZXNuJ3QgZGVwZW5kIG9uIHIxLCBnMSwgb3IgYjEKKy8vIChkZXBlbmRpbmcgb24gZGlyKQorCitMT05HIAorV3VRdWFudGl6ZXI6OkJvdHRvbShCb3ggKmN1YmUsIEJZVEUgZGlyLCBMT05HICptbXQpIHsKKyAgICBzd2l0Y2goZGlyKQorCXsKKwkJY2FzZSBGSV9SR0JBX1JFRDoKKwkJCXJldHVybiggLSBtbXRbSU5ERVgoY3ViZS0+cjAsIGN1YmUtPmcxLCBjdWJlLT5iMSldCisJCQkJICAgICsgbW10W0lOREVYKGN1YmUtPnIwLCBjdWJlLT5nMSwgY3ViZS0+YjApXQorCQkJCQkrIG1tdFtJTkRFWChjdWJlLT5yMCwgY3ViZS0+ZzAsIGN1YmUtPmIxKV0KKwkJCQkJLSBtbXRbSU5ERVgoY3ViZS0+cjAsIGN1YmUtPmcwLCBjdWJlLT5iMCldICk7CisJCQlicmVhazsKKwkJY2FzZSBGSV9SR0JBX0dSRUVOOgorCQkJcmV0dXJuKCAtIG1tdFtJTkRFWChjdWJlLT5yMSwgY3ViZS0+ZzAsIGN1YmUtPmIxKV0KKwkJCQkgICAgKyBtbXRbSU5ERVgoY3ViZS0+cjEsIGN1YmUtPmcwLCBjdWJlLT5iMCldCisJCQkJCSsgbW10W0lOREVYKGN1YmUtPnIwLCBjdWJlLT5nMCwgY3ViZS0+YjEpXQorCQkJCQktIG1tdFtJTkRFWChjdWJlLT5yMCwgY3ViZS0+ZzAsIGN1YmUtPmIwKV0gKTsKKwkJCWJyZWFrOworCQljYXNlIEZJX1JHQkFfQkxVRToKKwkJCXJldHVybiggLSBtbXRbSU5ERVgoY3ViZS0+cjEsIGN1YmUtPmcxLCBjdWJlLT5iMCldCisJCQkJICAgICsgbW10W0lOREVYKGN1YmUtPnIxLCBjdWJlLT5nMCwgY3ViZS0+YjApXQorCQkJCQkrIG1tdFtJTkRFWChjdWJlLT5yMCwgY3ViZS0+ZzEsIGN1YmUtPmIwKV0KKwkJCQkJLSBtbXRbSU5ERVgoY3ViZS0+cjAsIGN1YmUtPmcwLCBjdWJlLT5iMCldICk7CisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvLyBDb21wdXRlIHJlbWFpbmRlciBvZiBWb2woY3ViZSwgbW10KSwgc3Vic3RpdHV0aW5nIHBvcyBmb3IKKy8vIHIxLCBnMSwgb3IgYjEgKGRlcGVuZGluZyBvbiBkaXIpCisKK0xPTkcgCitXdVF1YW50aXplcjo6VG9wKEJveCAqY3ViZSwgQllURSBkaXIsIGludCBwb3MsIExPTkcgKm1tdCkgeworICAgIHN3aXRjaChkaXIpCisJeworCQljYXNlIEZJX1JHQkFfUkVEOgorCQkJcmV0dXJuKCBtbXRbSU5ERVgocG9zLCBjdWJlLT5nMSwgY3ViZS0+YjEpXSAKKwkJCQkgICAtbW10W0lOREVYKHBvcywgY3ViZS0+ZzEsIGN1YmUtPmIwKV0KKwkJCQkgICAtbW10W0lOREVYKHBvcywgY3ViZS0+ZzAsIGN1YmUtPmIxKV0KKwkJCQkgICArbW10W0lOREVYKHBvcywgY3ViZS0+ZzAsIGN1YmUtPmIwKV0gKTsKKwkJCWJyZWFrOworCQljYXNlIEZJX1JHQkFfR1JFRU46CisJCQlyZXR1cm4oIG1tdFtJTkRFWChjdWJlLT5yMSwgcG9zLCBjdWJlLT5iMSldIAorCQkJCSAgIC1tbXRbSU5ERVgoY3ViZS0+cjEsIHBvcywgY3ViZS0+YjApXQorCQkJCSAgIC1tbXRbSU5ERVgoY3ViZS0+cjAsIHBvcywgY3ViZS0+YjEpXQorCQkJCSAgICttbXRbSU5ERVgoY3ViZS0+cjAsIHBvcywgY3ViZS0+YjApXSApOworCQkJYnJlYWs7CisJCWNhc2UgRklfUkdCQV9CTFVFOgorCQkJcmV0dXJuKCBtbXRbSU5ERVgoY3ViZS0+cjEsIGN1YmUtPmcxLCBwb3MpXQorCQkJCSAgIC1tbXRbSU5ERVgoY3ViZS0+cjEsIGN1YmUtPmcwLCBwb3MpXQorCQkJCSAgIC1tbXRbSU5ERVgoY3ViZS0+cjAsIGN1YmUtPmcxLCBwb3MpXQorCQkJCSAgICttbXRbSU5ERVgoY3ViZS0+cjAsIGN1YmUtPmcwLCBwb3MpXSApOworCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8vIENvbXB1dGUgdGhlIHdlaWdodGVkIHZhcmlhbmNlIG9mIGEgYm94IAorLy8gTkI6IGFzIHdpdGggdGhlIHJhdyBzdGF0aXN0aWNzLCB0aGlzIGlzIHJlYWxseSB0aGUgdmFyaWFuY2UgKiBJbWFnZVNpemUgCisKK2Zsb2F0CitXdVF1YW50aXplcjo6VmFyKEJveCAqY3ViZSkgeworICAgIGZsb2F0IGRyID0gKGZsb2F0KSBWb2woY3ViZSwgbXIpOyAKKyAgICBmbG9hdCBkZyA9IChmbG9hdCkgVm9sKGN1YmUsIG1nKTsgCisgICAgZmxvYXQgZGIgPSAoZmxvYXQpIFZvbChjdWJlLCBtYik7CisgICAgZmxvYXQgeHggPSAgZ20yW0lOREVYKGN1YmUtPnIxLCBjdWJlLT5nMSwgY3ViZS0+YjEpXSAKKwkJCS1nbTJbSU5ERVgoY3ViZS0+cjEsIGN1YmUtPmcxLCBjdWJlLT5iMCldCisJCQkgLWdtMltJTkRFWChjdWJlLT5yMSwgY3ViZS0+ZzAsIGN1YmUtPmIxKV0KKwkJCSArZ20yW0lOREVYKGN1YmUtPnIxLCBjdWJlLT5nMCwgY3ViZS0+YjApXQorCQkJIC1nbTJbSU5ERVgoY3ViZS0+cjAsIGN1YmUtPmcxLCBjdWJlLT5iMSldCisJCQkgK2dtMltJTkRFWChjdWJlLT5yMCwgY3ViZS0+ZzEsIGN1YmUtPmIwKV0KKwkJCSArZ20yW0lOREVYKGN1YmUtPnIwLCBjdWJlLT5nMCwgY3ViZS0+YjEpXQorCQkJIC1nbTJbSU5ERVgoY3ViZS0+cjAsIGN1YmUtPmcwLCBjdWJlLT5iMCldOworCisgICAgcmV0dXJuICh4eCAtIChkcipkcitkZypkZytkYipkYikvKGZsb2F0KVZvbChjdWJlLHd0KSk7ICAgIAorfQorCisvLyBXZSB3YW50IHRvIG1pbmltaXplIHRoZSBzdW0gb2YgdGhlIHZhcmlhbmNlcyBvZiB0d28gc3ViYm94ZXMuCisvLyBUaGUgc3VtKGNeMikgdGVybXMgY2FuIGJlIGlnbm9yZWQgc2luY2UgdGhlaXIgc3VtIG92ZXIgYm90aCBzdWJib3hlcworLy8gaXMgdGhlIHNhbWUgKHRoZSBzdW0gZm9yIHRoZSB3aG9sZSBib3gpIG5vIG1hdHRlciB3aGVyZSB3ZSBzcGxpdC4KKy8vIFRoZSByZW1haW5pbmcgdGVybXMgaGF2ZSBhIG1pbnVzIHNpZ24gaW4gdGhlIHZhcmlhbmNlIGZvcm11bGEsCisvLyBzbyB3ZSBkcm9wIHRoZSBtaW51cyBzaWduIGFuZCBNQVhJTUlaRSB0aGUgc3VtIG9mIHRoZSB0d28gdGVybXMuCisKK2Zsb2F0CitXdVF1YW50aXplcjo6TWF4aW1pemUoQm94ICpjdWJlLCBCWVRFIGRpciwgaW50IGZpcnN0LCBpbnQgbGFzdCAsIGludCAqY3V0LCBMT05HIHdob2xlX3IsIExPTkcgd2hvbGVfZywgTE9ORyB3aG9sZV9iLCBMT05HIHdob2xlX3cpIHsKKwlMT05HIGhhbGZfciwgaGFsZl9nLCBoYWxmX2IsIGhhbGZfdzsKKwlpbnQgaTsKKwlmbG9hdCB0ZW1wOworCisgICAgTE9ORyBiYXNlX3IgPSBCb3R0b20oY3ViZSwgZGlyLCBtcik7CisgICAgTE9ORyBiYXNlX2cgPSBCb3R0b20oY3ViZSwgZGlyLCBtZyk7CisgICAgTE9ORyBiYXNlX2IgPSBCb3R0b20oY3ViZSwgZGlyLCBtYik7CisgICAgTE9ORyBiYXNlX3cgPSBCb3R0b20oY3ViZSwgZGlyLCB3dCk7CisKKyAgICBmbG9hdCBtYXggPSAwLjA7CisKKyAgICAqY3V0ID0gLTE7CisKKyAgICBmb3IgKGkgPSBmaXJzdDsgaSA8IGxhc3Q7IGkrKykgeworCQloYWxmX3IgPSBiYXNlX3IgKyBUb3AoY3ViZSwgZGlyLCBpLCBtcik7CisJCWhhbGZfZyA9IGJhc2VfZyArIFRvcChjdWJlLCBkaXIsIGksIG1nKTsKKwkJaGFsZl9iID0gYmFzZV9iICsgVG9wKGN1YmUsIGRpciwgaSwgbWIpOworCQloYWxmX3cgPSBiYXNlX3cgKyBUb3AoY3ViZSwgZGlyLCBpLCB3dCk7CisKKyAgICAgICAgLy8gbm93IGhhbGZfeCBpcyBzdW0gb3ZlciBsb3dlciBoYWxmIG9mIGJveCwgaWYgc3BsaXQgYXQgaQorCisJCWlmIChoYWxmX3cgPT0gMCkgewkJLy8gc3ViYm94IGNvdWxkIGJlIGVtcHR5IG9mIHBpeGVscyEKKwkJCWNvbnRpbnVlOwkJCS8vIG5ldmVyIHNwbGl0IGludG8gYW4gZW1wdHkgYm94CisJCX0gZWxzZSB7CisJCQl0ZW1wID0gKChmbG9hdCloYWxmX3IqaGFsZl9yICsgKGZsb2F0KWhhbGZfZypoYWxmX2cgKyAoZmxvYXQpaGFsZl9iKmhhbGZfYikvaGFsZl93OworCQl9CisKKwkJaGFsZl9yID0gd2hvbGVfciAtIGhhbGZfcjsKKwkJaGFsZl9nID0gd2hvbGVfZyAtIGhhbGZfZzsKKwkJaGFsZl9iID0gd2hvbGVfYiAtIGhhbGZfYjsKKwkJaGFsZl93ID0gd2hvbGVfdyAtIGhhbGZfdzsKKworICAgICAgICBpZiAoaGFsZl93ID09IDApIHsJCS8vIHN1YmJveCBjb3VsZCBiZSBlbXB0eSBvZiBwaXhlbHMhCisJCQljb250aW51ZTsJCQkvLyBuZXZlciBzcGxpdCBpbnRvIGFuIGVtcHR5IGJveAorCQl9IGVsc2UgeworCQkJdGVtcCArPSAoKGZsb2F0KWhhbGZfcipoYWxmX3IgKyAoZmxvYXQpaGFsZl9nKmhhbGZfZyArIChmbG9hdCloYWxmX2IqaGFsZl9iKS9oYWxmX3c7CisJCX0KKworICAgIAlpZiAodGVtcCA+IG1heCkgeworCQkJbWF4PXRlbXA7CisJCQkqY3V0PWk7CisJCX0KKyAgICB9CisKKyAgICByZXR1cm4gbWF4OworfQorCitib29sCitXdVF1YW50aXplcjo6Q3V0KEJveCAqc2V0MSwgQm94ICpzZXQyKSB7CisJQllURSBkaXI7CisJaW50IGN1dHIsIGN1dGcsIGN1dGI7CisKKyAgICBMT05HIHdob2xlX3IgPSBWb2woc2V0MSwgbXIpOworICAgIExPTkcgd2hvbGVfZyA9IFZvbChzZXQxLCBtZyk7CisgICAgTE9ORyB3aG9sZV9iID0gVm9sKHNldDEsIG1iKTsKKyAgICBMT05HIHdob2xlX3cgPSBWb2woc2V0MSwgd3QpOworCisgICAgZmxvYXQgbWF4ciA9IE1heGltaXplKHNldDEsIEZJX1JHQkFfUkVELCBzZXQxLT5yMCsxLCBzZXQxLT5yMSwgJmN1dHIsIHdob2xlX3IsIHdob2xlX2csIHdob2xlX2IsIHdob2xlX3cpOyAgICAKKwlmbG9hdCBtYXhnID0gTWF4aW1pemUoc2V0MSwgRklfUkdCQV9HUkVFTiwgc2V0MS0+ZzArMSwgc2V0MS0+ZzEsICZjdXRnLCB3aG9sZV9yLCB3aG9sZV9nLCB3aG9sZV9iLCB3aG9sZV93KTsgICAgCisJZmxvYXQgbWF4YiA9IE1heGltaXplKHNldDEsIEZJX1JHQkFfQkxVRSwgc2V0MS0+YjArMSwgc2V0MS0+YjEsICZjdXRiLCB3aG9sZV9yLCB3aG9sZV9nLCB3aG9sZV9iLCB3aG9sZV93KTsKKworICAgIGlmICgobWF4ciA+PSBtYXhnKSAmJiAobWF4ciA+PSBtYXhiKSkgeworCQlkaXIgPSBGSV9SR0JBX1JFRDsKKworCQlpZiAoY3V0ciA8IDApIHsKKwkJCXJldHVybiBmYWxzZTsgLy8gY2FuJ3Qgc3BsaXQgdGhlIGJveAorCQl9CisgICAgfSBlbHNlIGlmICgobWF4ZyA+PSBtYXhyKSAmJiAobWF4Zz49bWF4YikpIHsKKwkJZGlyID0gRklfUkdCQV9HUkVFTjsKKwl9IGVsc2UgeworCQlkaXIgPSBGSV9SR0JBX0JMVUU7CisJfQorCisJc2V0Mi0+cjEgPSBzZXQxLT5yMTsKKyAgICBzZXQyLT5nMSA9IHNldDEtPmcxOworICAgIHNldDItPmIxID0gc2V0MS0+YjE7CisKKyAgICBzd2l0Y2ggKGRpcikgeworCQljYXNlIEZJX1JHQkFfUkVEOgorCQkJc2V0Mi0+cjAgPSBzZXQxLT5yMSA9IGN1dHI7CisJCQlzZXQyLT5nMCA9IHNldDEtPmcwOworCQkJc2V0Mi0+YjAgPSBzZXQxLT5iMDsKKwkJCWJyZWFrOworCisJCWNhc2UgRklfUkdCQV9HUkVFTjoKKwkJCXNldDItPmcwID0gc2V0MS0+ZzEgPSBjdXRnOworCQkJc2V0Mi0+cjAgPSBzZXQxLT5yMDsKKwkJCXNldDItPmIwID0gc2V0MS0+YjA7CisJCQlicmVhazsKKworCQljYXNlIEZJX1JHQkFfQkxVRToKKwkJCXNldDItPmIwID0gc2V0MS0+YjEgPSBjdXRiOworCQkJc2V0Mi0+cjAgPSBzZXQxLT5yMDsKKwkJCXNldDItPmcwID0gc2V0MS0+ZzA7CisJCQlicmVhazsKKyAgICB9CisKKyAgICBzZXQxLT52b2wgPSAoc2V0MS0+cjEtc2V0MS0+cjApKihzZXQxLT5nMS1zZXQxLT5nMCkqKHNldDEtPmIxLXNldDEtPmIwKTsKKyAgICBzZXQyLT52b2wgPSAoc2V0Mi0+cjEtc2V0Mi0+cjApKihzZXQyLT5nMS1zZXQyLT5nMCkqKHNldDItPmIxLXNldDItPmIwKTsKKworICAgIHJldHVybiB0cnVlOworfQorCisKK3ZvaWQKK1d1UXVhbnRpemVyOjpNYXJrKEJveCAqY3ViZSwgaW50IGxhYmVsLCBCWVRFICp0YWcpIHsKKyAgICBmb3IgKGludCByID0gY3ViZS0+cjAgKyAxOyByIDw9IGN1YmUtPnIxOyByKyspIHsKKwkJZm9yIChpbnQgZyA9IGN1YmUtPmcwICsgMTsgZyA8PSBjdWJlLT5nMTsgZysrKSB7CisJCQlmb3IgKGludCBiID0gY3ViZS0+YjAgKyAxOyBiIDw9IGN1YmUtPmIxOyBiKyspIHsKKwkJCQl0YWdbSU5ERVgociwgZywgYildID0gKEJZVEUpbGFiZWw7CisJCQl9CisJCX0KKwl9Cit9CisKKy8vIFd1IFF1YW50aXphdGlvbiBhbGdvcml0aG0KK0ZJQklUTUFQICoKK1d1UXVhbnRpemVyOjpRdWFudGl6ZShpbnQgUGFsZXR0ZVNpemUsIGludCBSZXNlcnZlU2l6ZSwgUkdCUVVBRCAqUmVzZXJ2ZVBhbGV0dGUpIHsKKwlCWVRFICp0YWcgPSBOVUxMOworCisJdHJ5IHsKKwkJQm94CWN1YmVbTUFYQ09MT1JdOworCQlpbnQJbmV4dDsKKwkJTE9ORyBpLCB3ZWlnaHQ7CisJCWludCBrOworCQlmbG9hdCB2dltNQVhDT0xPUl0sIHRlbXA7CisJCQorCQkvLyBDb21wdXRlIDNEIGhpc3RvZ3JhbQorCisJCUhpc3QzRCh3dCwgbXIsIG1nLCBtYiwgZ20yLCBSZXNlcnZlU2l6ZSwgUmVzZXJ2ZVBhbGV0dGUpOworCisJCS8vIENvbXB1dGUgbW9tZW50cworCisJCU0zRCh3dCwgbXIsIG1nLCBtYiwgZ20yKTsKKworCQljdWJlWzBdLnIwID0gY3ViZVswXS5nMCA9IGN1YmVbMF0uYjAgPSAwOworCQljdWJlWzBdLnIxID0gY3ViZVswXS5nMSA9IGN1YmVbMF0uYjEgPSAzMjsKKwkJbmV4dCA9IDA7CisKKwkJZm9yIChpID0gMTsgaSA8IFBhbGV0dGVTaXplOyBpKyspIHsKKwkJCWlmKEN1dCgmY3ViZVtuZXh0XSwgJmN1YmVbaV0pKSB7CisJCQkJLy8gdm9sdW1lIHRlc3QgZW5zdXJlcyB3ZSB3b24ndCB0cnkgdG8gY3V0IG9uZS1jZWxsIGJveAorCQkJCXZ2W25leHRdID0gKGN1YmVbbmV4dF0udm9sID4gMSkgPyBWYXIoJmN1YmVbbmV4dF0pIDogMDsKKwkJCQl2dltpXSA9IChjdWJlW2ldLnZvbCA+IDEpID8gVmFyKCZjdWJlW2ldKSA6IDA7CisJCQl9IGVsc2UgeworCQkJCSAgdnZbbmV4dF0gPSAwLjA7ICAgLy8gZG9uJ3QgdHJ5IHRvIHNwbGl0IHRoaXMgYm94IGFnYWluCisJCQkJICBpLS07ICAgICAgICAgICAgICAvLyBkaWRuJ3QgY3JlYXRlIGJveCBpCisJCQl9CisKKwkJCW5leHQgPSAwOyB0ZW1wID0gdnZbMF07CisKKwkJCWZvciAoayA9IDE7IGsgPD0gaTsgaysrKSB7CisJCQkJaWYgKHZ2W2tdID4gdGVtcCkgeworCQkJCQl0ZW1wID0gdnZba107IG5leHQgPSBrOworCQkJCX0KKwkJCX0KKworCQkJaWYgKHRlbXAgPD0gMC4wKSB7CisJCQkJICBQYWxldHRlU2l6ZSA9IGkgKyAxOworCisJCQkJICAvLyBFcnJvcjogIk9ubHkgZ290ICdQYWxldHRlU2l6ZScgYm94ZXMiCisKKwkJCQkgIGJyZWFrOworCQkJfQorCQl9CisKKwkJLy8gUGFydGl0aW9uIGRvbmUKKworCQkvLyB0aGUgc3BhY2UgZm9yIGFycmF5IGdtMiBjYW4gYmUgZnJlZWQgbm93CisKKwkJZnJlZShnbTIpOworCisJCWdtMiA9IE5VTEw7CisKKwkJLy8gQWxsb2NhdGUgYSBuZXcgZGliCisKKwkJRklCSVRNQVAgKm5ld19kaWIgPSBGcmVlSW1hZ2VfQWxsb2NhdGUod2lkdGgsIGhlaWdodCwgOCk7CisKKwkJaWYgKG5ld19kaWIgPT0gTlVMTCkgeworCQkJdGhyb3cgRklfTVNHX0VSUk9SX01FTU9SWTsKKwkJfQorCisJCS8vIGNyZWF0ZSBhbiBvcHRpbWl6ZWQgcGFsZXR0ZQorCisJCVJHQlFVQUQgKm5ld19wYWwgPSBGcmVlSW1hZ2VfR2V0UGFsZXR0ZShuZXdfZGliKTsKKworCQl0YWcgPSAoQllURSopIG1hbGxvYyhTSVpFXzNEICogc2l6ZW9mKEJZVEUpKTsKKwkJaWYgKHRhZyA9PSBOVUxMKSB7CisJCQl0aHJvdyBGSV9NU0dfRVJST1JfTUVNT1JZOworCQl9CisJCW1lbXNldCh0YWcsIDAsIFNJWkVfM0QgKiBzaXplb2YoQllURSkpOworCisJCWZvciAoayA9IDA7IGsgPCBQYWxldHRlU2l6ZSA7IGsrKykgeworCQkJTWFyaygmY3ViZVtrXSwgaywgdGFnKTsKKwkJCXdlaWdodCA9IFZvbCgmY3ViZVtrXSwgd3QpOworCisJCQlpZiAod2VpZ2h0KSB7CisJCQkJbmV3X3BhbFtrXS5yZ2JSZWQJPSAoQllURSkoKChmbG9hdClWb2woJmN1YmVba10sIG1yKSAvIChmbG9hdCl3ZWlnaHQpICsgMC41Zik7CisJCQkJbmV3X3BhbFtrXS5yZ2JHcmVlbiA9IChCWVRFKSgoKGZsb2F0KVZvbCgmY3ViZVtrXSwgbWcpIC8gKGZsb2F0KXdlaWdodCkgKyAwLjVmKTsKKwkJCQluZXdfcGFsW2tdLnJnYkJsdWUJPSAoQllURSkoKChmbG9hdClWb2woJmN1YmVba10sIG1iKSAvIChmbG9hdCl3ZWlnaHQpICsgMC41Zik7CisJCQl9IGVsc2UgeworCQkJCS8vIEVycm9yOiBib2d1cyBib3ggJ2snCisKKwkJCQluZXdfcGFsW2tdLnJnYlJlZCA9IG5ld19wYWxba10ucmdiR3JlZW4gPSBuZXdfcGFsW2tdLnJnYkJsdWUgPSAwOwkJCisJCQl9CisJCX0KKworCQlpbnQgbnBpdGNoID0gRnJlZUltYWdlX0dldFBpdGNoKG5ld19kaWIpOworCisJCWZvciAodW5zaWduZWQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworCQkJQllURSAqbmV3X2JpdHMgPSBGcmVlSW1hZ2VfR2V0Qml0cyhuZXdfZGliKSArICh5ICogbnBpdGNoKTsKKworCQkJZm9yICh1bnNpZ25lZCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQluZXdfYml0c1t4XSA9IHRhZ1tRYWRkW3kqd2lkdGggKyB4XV07CisJCQl9CisJCX0KKworCQkvLyBvdXRwdXQgJ25ld19wYWwnIGFzIGNvbG9yIGxvb2stdXAgdGFibGUgY29udGVudHMsCisJCS8vICduZXdfYml0cycgYXMgdGhlIHF1YW50aXplZCBpbWFnZSAoYXJyYXkgb2YgdGFibGUgYWRkcmVzc2VzKS4KKworCQlmcmVlKHRhZyk7CisKKwkJcmV0dXJuIChGSUJJVE1BUCopIG5ld19kaWI7CisJfSBjYXRjaCguLi4pIHsKKwkJZnJlZSh0YWcpOworCX0KKworCXJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS9aTGliSW50ZXJmYWNlLmNwcCBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvWkxpYkludGVyZmFjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUyN2QyNwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvWkxpYkludGVyZmFjZS5jcHAKQEAgLTAsMCArMSwyMjQgQEAKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFpMaWIgbGlicmFyeSBpbnRlcmZhY2UKKy8vCisvLyBEZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIGJ5CisvLyAtIEZsb3JpcyB2YW4gZGVuIEJlcmcgKGZsdmRiZXJnQHd4cy5ubCkKKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBGcmVlSW1hZ2UgMworLy8KKy8vIENPVkVSRUQgQ09ERSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWQorLy8gT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMKKy8vIFRIQVQgVEhFIENPVkVSRUQgQ09ERSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLy8gT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQKKy8vIENPREUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkgQ09WRVJFRCBDT0RFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QKKy8vIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZCisvLyBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMCisvLyBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GIEFOWSBDT1ZFUkVEIENPREUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSCisvLyBUSElTIERJU0NMQUlNRVIuCisvLworLy8gVXNlIGF0IHlvdXIgb3duIHJpc2shCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpbmNsdWRlICJ6bGliLmgiCisjaW5jbHVkZSAiRnJlZUltYWdlLmgiCisjaW5jbHVkZSAiVXRpbGl0aWVzLmgiCisjaW5jbHVkZSAienV0aWwuaCIJLyogbXVzdCBiZSB0aGUgbGFzdCBoZWFkZXIgYmVjYXVzZSBvZiBlcnJvciBDMzE2MyBpbiBWUzIwMDggKF92c25wcmludGYgZGVmaW5lZCBpbiBzdGRpby5oKSAqLworCisKKy8qKgorQ29tcHJlc3NlcyBhIHNvdXJjZSBidWZmZXIgaW50byBhIHRhcmdldCBidWZmZXIsIHVzaW5nIHRoZSBaTGliIGxpYnJhcnkuIAorVXBvbiBlbnRyeSwgdGFyZ2V0X3NpemUgaXMgdGhlIHRvdGFsIHNpemUgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciwgCit3aGljaCBtdXN0IGJlIGF0IGxlYXN0IDAuMSUgbGFyZ2VyIHRoYW4gc291cmNlX3NpemUgcGx1cyAxMiBieXRlcy4gCisKK0BwYXJhbSB0YXJnZXQgRGVzdGluYXRpb24gYnVmZmVyCitAcGFyYW0gdGFyZ2V0X3NpemUgU2l6ZSBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyLCBpbiBieXRlcworQHBhcmFtIHNvdXJjZSBTb3VyY2UgYnVmZmVyCitAcGFyYW0gc291cmNlX3NpemUgU2l6ZSBvZiB0aGUgc291cmNlIGJ1ZmZlciwgaW4gYnl0ZXMKK0ByZXR1cm4gUmV0dXJucyB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIGNvbXByZXNzZWQgYnVmZmVyLCByZXR1cm5zIDAgaWYgYW4gZXJyb3Igb2NjdXJlZAorQHNlZSBGcmVlSW1hZ2VfWkxpYlVuY29tcHJlc3MKKyovCitEV09SRCBETExfQ0FMTENPTlYgCitGcmVlSW1hZ2VfWkxpYkNvbXByZXNzKEJZVEUgKnRhcmdldCwgRFdPUkQgdGFyZ2V0X3NpemUsIEJZVEUgKnNvdXJjZSwgRFdPUkQgc291cmNlX3NpemUpIHsKKwl1TG9uZ2YgZGVzdF9sZW4gPSAodUxvbmdmKXRhcmdldF9zaXplOworCisJaW50IHplcnIgPSBjb21wcmVzcyh0YXJnZXQsICZkZXN0X2xlbiwgc291cmNlLCBzb3VyY2Vfc2l6ZSk7CisJc3dpdGNoKHplcnIpIHsKKwkJY2FzZSBaX01FTV9FUlJPUjoJLy8gbm90IGVub3VnaCBtZW1vcnkKKwkJY2FzZSBaX0JVRl9FUlJPUjoJLy8gbm90IGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyCisJCQlGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2MoRklGX1VOS05PV04sICJabGliIGVycm9yIDogJXMiLCB6RXJyb3IoemVycikpOworCQkJcmV0dXJuIDA7CisJCWNhc2UgWl9PSzoKKwkJCXJldHVybiBkZXN0X2xlbjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCitEZWNvbXByZXNzZXMgYSBzb3VyY2UgYnVmZmVyIGludG8gYSB0YXJnZXQgYnVmZmVyLCB1c2luZyB0aGUgWkxpYiBsaWJyYXJ5LiAKK1Vwb24gZW50cnksIHRhcmdldF9zaXplIGlzIHRoZSB0b3RhbCBzaXplIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIsIAord2hpY2ggbXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUgZW50aXJlIHVuY29tcHJlc3NlZCBkYXRhLiAKK1RoZSBzaXplIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBtdXN0IGhhdmUgYmVlbiBzYXZlZCBwcmV2aW91c2x5IGJ5IHRoZSBjb21wcmVzc29yIAorYW5kIHRyYW5zbWl0dGVkIHRvIHRoZSBkZWNvbXByZXNzb3IgYnkgc29tZSBtZWNoYW5pc20gb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhpcyAKK2NvbXByZXNzaW9uIGxpYnJhcnkuCisKK0BwYXJhbSB0YXJnZXQgRGVzdGluYXRpb24gYnVmZmVyCitAcGFyYW0gdGFyZ2V0X3NpemUgU2l6ZSBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyLCBpbiBieXRlcworQHBhcmFtIHNvdXJjZSBTb3VyY2UgYnVmZmVyCitAcGFyYW0gc291cmNlX3NpemUgU2l6ZSBvZiB0aGUgc291cmNlIGJ1ZmZlciwgaW4gYnl0ZXMKK0ByZXR1cm4gUmV0dXJucyB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIHVuY29tcHJlc3NlZCBidWZmZXIsIHJldHVybnMgMCBpZiBhbiBlcnJvciBvY2N1cmVkCitAc2VlIEZyZWVJbWFnZV9aTGliQ29tcHJlc3MKKyovCitEV09SRCBETExfQ0FMTENPTlYgCitGcmVlSW1hZ2VfWkxpYlVuY29tcHJlc3MoQllURSAqdGFyZ2V0LCBEV09SRCB0YXJnZXRfc2l6ZSwgQllURSAqc291cmNlLCBEV09SRCBzb3VyY2Vfc2l6ZSkgeworCXVMb25nZiBkZXN0X2xlbiA9ICh1TG9uZ2YpdGFyZ2V0X3NpemU7CisKKwlpbnQgemVyciA9IHVuY29tcHJlc3ModGFyZ2V0LCAmZGVzdF9sZW4sIHNvdXJjZSwgc291cmNlX3NpemUpOworCXN3aXRjaCh6ZXJyKSB7CisJCWNhc2UgWl9NRU1fRVJST1I6CS8vIG5vdCBlbm91Z2ggbWVtb3J5CisJCWNhc2UgWl9CVUZfRVJST1I6CS8vIG5vdCBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0IGJ1ZmZlcgorCQljYXNlIFpfREFUQV9FUlJPUjoJLy8gaW5wdXQgZGF0YSB3YXMgY29ycnVwdGVkCisJCQlGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2MoRklGX1VOS05PV04sICJabGliIGVycm9yIDogJXMiLCB6RXJyb3IoemVycikpOworCQkJcmV0dXJuIDA7CisJCWNhc2UgWl9PSzoKKwkJCXJldHVybiBkZXN0X2xlbjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCitDb21wcmVzc2VzIGEgc291cmNlIGJ1ZmZlciBpbnRvIGEgdGFyZ2V0IGJ1ZmZlciwgdXNpbmcgdGhlIFpMaWIgbGlicmFyeS4gCitPbiBzdWNjZXNzLCB0aGUgdGFyZ2V0IGJ1ZmZlciBjb250YWlucyBhIEdaSVAgY29tcGF0aWJsZSBsYXlvdXQuCitVcG9uIGVudHJ5LCB0YXJnZXRfc2l6ZSBpcyB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyLCAKK3doaWNoIG11c3QgYmUgYXQgbGVhc3QgMC4xJSBsYXJnZXIgdGhhbiBzb3VyY2Vfc2l6ZSBwbHVzIDI0IGJ5dGVzLiAKKworQHBhcmFtIHRhcmdldCBEZXN0aW5hdGlvbiBidWZmZXIKK0BwYXJhbSB0YXJnZXRfc2l6ZSBTaXplIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIsIGluIGJ5dGVzCitAcGFyYW0gc291cmNlIFNvdXJjZSBidWZmZXIKK0BwYXJhbSBzb3VyY2Vfc2l6ZSBTaXplIG9mIHRoZSBzb3VyY2UgYnVmZmVyLCBpbiBieXRlcworQHJldHVybiBSZXR1cm5zIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgY29tcHJlc3NlZCBidWZmZXIsIHJldHVybnMgMCBpZiBhbiBlcnJvciBvY2N1cmVkCitAc2VlIEZyZWVJbWFnZV9aTGliQ29tcHJlc3MKKyovCitEV09SRCBETExfQ0FMTENPTlYgCitGcmVlSW1hZ2VfWkxpYkdaaXAoQllURSAqdGFyZ2V0LCBEV09SRCB0YXJnZXRfc2l6ZSwgQllURSAqc291cmNlLCBEV09SRCBzb3VyY2Vfc2l6ZSkgeworCXVMb25nZiBkZXN0X2xlbiA9ICh1TG9uZ2YpdGFyZ2V0X3NpemUgLSAxMjsKKwlEV09SRCBjcmMgPSBjcmMzMigwTCwgTlVMTCwgMCk7CisKKyAgICAvLyBzZXQgdXAgaGVhZGVyIChzdG9sZW4gZnJvbSB6bGliL2d6aW8uYykKKyAgICBzcHJpbnRmKChjaGFyICopdGFyZ2V0LCAiJWMlYyVjJWMlYyVjJWMlYyIsIDB4MWYsIDB4OGIsCisgICAgICAgICBaX0RFRkxBVEVELCAwIC8qZmxhZ3MqLywgMCwwLDAsMCAvKnRpbWUqLyk7CisgICAgaW50IHplcnIgPSBjb21wcmVzczIodGFyZ2V0ICsgOCwgJmRlc3RfbGVuLCBzb3VyY2UsIHNvdXJjZV9zaXplLCBaX0JFU1RfQ09NUFJFU1NJT04pOworCXN3aXRjaCh6ZXJyKSB7CisJCWNhc2UgWl9NRU1fRVJST1I6CS8vIG5vdCBlbm91Z2ggbWVtb3J5CisJCWNhc2UgWl9CVUZfRVJST1I6CS8vIG5vdCBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0IGJ1ZmZlcgorCQkJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKEZJRl9VTktOT1dOLCAiWmxpYiBlcnJvciA6ICVzIiwgekVycm9yKHplcnIpKTsKKwkJCXJldHVybiAwOworICAgICAgICBjYXNlIFpfT0s6IHsKKyAgICAgICAgICAgIC8vIHBhdGNoIGhlYWRlciwgc2V0dXAgY3JjIGFuZCBsZW5ndGggKHN0b2xlbiBmcm9tIG1vZF90cmFjZV9vdXRwdXQpCisgICAgICAgICAgICBCWVRFICpwID0gdGFyZ2V0ICsgODsgKnArKyA9IDI7ICpwID0gT1NfQ09ERTsgLy8geGZsYWdzLCBvc19jb2RlCisgCSAgICAgICAgY3JjID0gY3JjMzIoY3JjLCBzb3VyY2UsIHNvdXJjZV9zaXplKTsKKwkgICAgICAgIG1lbWNweSh0YXJnZXQgKyA0ICsgZGVzdF9sZW4sICZjcmMsIDQpOworCSAgICAgICAgbWVtY3B5KHRhcmdldCArIDggKyBkZXN0X2xlbiwgJnNvdXJjZV9zaXplLCA0KTsKKyAgICAgICAgICAgIHJldHVybiBkZXN0X2xlbiArIDEyOworICAgICAgICB9CisJfQorCXJldHVybiAwOworfQorCisvKioKK0RlY29tcHJlc3NlcyBhIGd6aXBwZWQgc291cmNlIGJ1ZmZlciBpbnRvIGEgdGFyZ2V0IGJ1ZmZlciwgdXNpbmcgdGhlIFpMaWIgbGlicmFyeS4gCitVcG9uIGVudHJ5LCB0YXJnZXRfc2l6ZSBpcyB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyLCAKK3doaWNoIG11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlIGVudGlyZSB1bmNvbXByZXNzZWQgZGF0YS4gCitUaGUgc2l6ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgbXVzdCBoYXZlIGJlZW4gc2F2ZWQgcHJldmlvdXNseSBieSB0aGUgY29tcHJlc3NvciAKK2FuZCB0cmFuc21pdHRlZCB0byB0aGUgZGVjb21wcmVzc29yIGJ5IHNvbWUgbWVjaGFuaXNtIG91dHNpZGUgdGhlIHNjb3BlIG9mIHRoaXMgCitjb21wcmVzc2lvbiBsaWJyYXJ5LgorCitAcGFyYW0gdGFyZ2V0IERlc3RpbmF0aW9uIGJ1ZmZlcgorQHBhcmFtIHRhcmdldF9zaXplIFNpemUgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciwgaW4gYnl0ZXMKK0BwYXJhbSBzb3VyY2UgU291cmNlIGJ1ZmZlcgorQHBhcmFtIHNvdXJjZV9zaXplIFNpemUgb2YgdGhlIHNvdXJjZSBidWZmZXIsIGluIGJ5dGVzCitAcmV0dXJuIFJldHVybnMgdGhlIGFjdHVhbCBzaXplIG9mIHRoZSB1bmNvbXByZXNzZWQgYnVmZmVyLCByZXR1cm5zIDAgaWYgYW4gZXJyb3Igb2NjdXJlZAorQHNlZSBGcmVlSW1hZ2VfWkxpYkdaaXAKKyovCisKK3N0YXRpYyBpbnQgZ2V0X2J5dGUoel9zdHJlYW0gKnN0cmVhbSkgeworICAgIGlmIChzdHJlYW0tPmF2YWlsX2luIDw9IDApIHJldHVybiBFT0Y7CisgICAgc3RyZWFtLT5hdmFpbF9pbi0tOworICAgIHJldHVybiAqKHN0cmVhbS0+bmV4dF9pbikrKzsKK30KKworc3RhdGljIGludCBjaGVja2hlYWRlcih6X3N0cmVhbSAqc3RyZWFtKSB7CisgICAgaW50IGZsYWdzLCBjOworICAgIERXT1JEIGxlbjsKKworICAgIGlmIChnZXRfYnl0ZShzdHJlYW0pICE9IDB4MWYgfHwgZ2V0X2J5dGUoc3RyZWFtKSAhPSAweDhiKQorICAgICAgICByZXR1cm4gWl9EQVRBX0VSUk9SOworICAgIGlmIChnZXRfYnl0ZShzdHJlYW0pICE9IFpfREVGTEFURUQgfHwgKChmbGFncyA9IGdldF9ieXRlKHN0cmVhbSkpICYgMHhFMCkgIT0gMCkKKyAgICAgICAgcmV0dXJuIFpfREFUQV9FUlJPUjsKKyAgICBmb3IgKGxlbiA9IDA7IGxlbiA8IDY7IGxlbisrKSAodm9pZClnZXRfYnl0ZShzdHJlYW0pOworCisgICAgaWYgKChmbGFncyAmIDB4MDQpICE9IDApIHsgLyogc2tpcCB0aGUgZXh0cmEgZmllbGQgKi8KKyAgICAgICAgbGVuICA9ICAoRFdPUkQpZ2V0X2J5dGUoc3RyZWFtKTsKKyAgICAgICAgbGVuICs9ICgoRFdPUkQpZ2V0X2J5dGUoc3RyZWFtKSkgPDwgODsKKyAgICAgICAgLyogbGVuIGlzIGdhcmJhZ2UgaWYgRU9GIGJ1dCB0aGUgbG9vcCBiZWxvdyB3aWxsIHF1aXQgYW55d2F5ICovCisgICAgICAgIHdoaWxlIChsZW4tLSAhPSAwICYmIGdldF9ieXRlKHN0cmVhbSkgIT0gRU9GKSA7CisgICAgfQorICAgIGlmICgoZmxhZ3MgJiAweDA4KSAhPSAwKSB7IC8qIHNraXAgdGhlIG9yaWdpbmFsIGZpbGUgbmFtZSAqLworICAgICAgICB3aGlsZSAoKGMgPSBnZXRfYnl0ZShzdHJlYW0pKSAhPSAwICYmIGMgIT0gRU9GKSA7CisgICAgfQorICAgIGlmICgoZmxhZ3MgJiAweDEwKSAhPSAwKSB7ICAgLyogc2tpcCB0aGUgLmd6IGZpbGUgY29tbWVudCAqLworICAgICAgICB3aGlsZSAoKGMgPSBnZXRfYnl0ZShzdHJlYW0pKSAhPSAwICYmIGMgIT0gRU9GKSA7CisgICAgfQorICAgIGlmICgoZmxhZ3MgJiAweDAyKSAhPSAwKSB7ICAvKiBza2lwIHRoZSBoZWFkZXIgY3JjICovCisgICAgICAgIGZvciAobGVuID0gMDsgbGVuIDwgMjsgbGVuKyspICh2b2lkKWdldF9ieXRlKHN0cmVhbSk7CisgICAgfQorICAgIHJldHVybiBaX09LOworfQorCitEV09SRCBETExfQ0FMTENPTlYgCitGcmVlSW1hZ2VfWkxpYkdVbnppcChCWVRFICp0YXJnZXQsIERXT1JEIHRhcmdldF9zaXplLCBCWVRFICpzb3VyY2UsIERXT1JEIHNvdXJjZV9zaXplKSB7CisgICAgRFdPUkQgc3JjX2xlbiAgPSBzb3VyY2Vfc2l6ZTsKKyAgICBEV09SRCBkZXN0X2xlbiA9IHRhcmdldF9zaXplOworICAgIGludCAgIHplcnIgICAgID0gWl9EQVRBX0VSUk9SOworCisgICAgaWYgKHNyY19sZW4gPiAwKSB7CisgICAgICAgIHpfc3RyZWFtIHN0cmVhbTsKKyAgICAgICAgbWVtc2V0KCZzdHJlYW0sIDAsIHNpemVvZiAoc3RyZWFtKSk7CisgICAgICAgIGlmICgoemVyciA9IGluZmxhdGVJbml0Migmc3RyZWFtLCAtTUFYX1dCSVRTKSkgPT0gWl9PSykgeworICAgICAgICAgICAgc3RyZWFtLm5leHRfaW4gID0gc291cmNlOworICAgICAgICAgICAgc3RyZWFtLmF2YWlsX2luID0gc291cmNlX3NpemU7CisKKyAgICAgICAgICAgIHN0cmVhbS5uZXh0X291dCAgPSB0YXJnZXQ7CisgICAgICAgICAgICBzdHJlYW0uYXZhaWxfb3V0ID0gdGFyZ2V0X3NpemU7CisKKyAgICAgICAgICAgIGlmICgoemVyciA9IGNoZWNraGVhZGVyKCZzdHJlYW0pKSA9PSBaX09LKSB7CisgICAgICAgICAgICAgICAgemVyciA9IGluZmxhdGUgKCZzdHJlYW0sIFpfTk9fRkxVU0gpOworICAgICAgICAgICAgICAgIGRlc3RfbGVuID0gdGFyZ2V0X3NpemUgLSBzdHJlYW0uYXZhaWxfb3V0OworCisgICAgICAgICAgICAgICAgaWYgKHplcnIgPT0gWl9PSyB8fCB6ZXJyID09IFpfU1RSRUFNX0VORCkKKyAgICAgICAgICAgICAgICAgICAgaW5mbGF0ZUVuZCgmc3RyZWFtKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHplcnIgIT0gWl9PSyAmJiB6ZXJyICE9IFpfU1RSRUFNX0VORCkgeworICAgICAgICBGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2MoRklGX1VOS05PV04sICJabGliIGVycm9yIDogJXMiLCB6RXJyb3IoemVycikpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIGRlc3RfbGVuOworfQorCisvKioKK1VwZGF0ZSBhIHJ1bm5pbmcgY3JjIGZyb20gc291cmNlIGFuZCByZXR1cm4gdGhlIHVwZGF0ZWQgY3JjLCB1c2luZyB0aGUgWkxpYiBsaWJyYXJ5LgorSWYgc291cmNlIGlzIE5VTEwsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcmVxdWlyZWQgaW5pdGlhbCB2YWx1ZSBmb3IgdGhlIGNyYy4KKworQHBhcmFtIGNyYyBSdW5uaW5nIGNyYyB2YWx1ZQorQHBhcmFtIHNvdXJjZSBTb3VyY2UgYnVmZmVyCitAcGFyYW0gc291cmNlX3NpemUgU2l6ZSBvZiB0aGUgc291cmNlIGJ1ZmZlciwgaW4gYnl0ZXMKK0ByZXR1cm4gUmV0dXJucyB0aGUgbmV3IGNyYyB2YWx1ZQorKi8KK0RXT1JEIERMTF9DQUxMQ09OViAKK0ZyZWVJbWFnZV9aTGliQ1JDMzIoRFdPUkQgY3JjLCBCWVRFICpzb3VyY2UsIERXT1JEIHNvdXJjZV9zaXplKSB7CisKKyAgICByZXR1cm4gY3JjMzIoY3JjLCBzb3VyY2UsIHNvdXJjZV9zaXplKTsKK30KZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvdG1vQ29sb3JDb252ZXJ0LmNwcCBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvdG1vQ29sb3JDb252ZXJ0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGU5ZTI0Ci0tLSAvZGV2L251bGwKKysrIGIvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS90bW9Db2xvckNvbnZlcnQuY3BwCkBAIC0wLDAgKzEsNDgzIEBACisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBIaWdoIER5bmFtaWMgUmFuZ2UgYml0bWFwIGNvbnZlcnNpb24gcm91dGluZXMKKy8vCisvLyBEZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIGJ5CisvLyAtIEhlcnbpIERyb2xvbiAoZHJvbG9uQGluZm9uaWUuZnIpCisvLyAtIE1paGFpbCBOYXlkZW5vdiAobW5heWRlbm92QHVzZXJzLnNvdXJjZWZvcmdlLm5ldCkKKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBGcmVlSW1hZ2UgMworLy8KKy8vIENPVkVSRUQgQ09ERSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWQorLy8gT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMKKy8vIFRIQVQgVEhFIENPVkVSRUQgQ09ERSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLy8gT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQKKy8vIENPREUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkgQ09WRVJFRCBDT0RFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QKKy8vIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZCisvLyBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMCisvLyBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GIEFOWSBDT1ZFUkVEIENPREUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSCisvLyBUSElTIERJU0NMQUlNRVIuCisvLworLy8gVXNlIGF0IHlvdXIgb3duIHJpc2shCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpbmNsdWRlIDxjbWF0aD4KKworI2luY2x1ZGUgIkZyZWVJbWFnZS5oIgorI2luY2x1ZGUgIlV0aWxpdGllcy5oIgorI2luY2x1ZGUgIlRvbmVNYXBwaW5nLmgiCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvbnZlcnQgUkdCIHRvIGFuZCBmcm9tIFl4eSwgc2FtZSBhcyBpbiBSZWluaGFyZCBldCBhbC4gU0lHR1JBUEggMjAwMgorLy8gUmVmZXJlbmNlcyA6IAorLy8gWzFdIFJhZGlhbmNlIEhvbWUgUGFnZSBbT25saW5lXSBodHRwOi8vcmFkc2l0ZS5sYmwuZ292L3JhZGlhbmNlL0hPTUUuaHRtbAorLy8gWzJdIEUuIFJlaW5oYXJkLCBNLiBTdGFyaywgUC4gU2hpcmxleSwgYW5kIEouIEZlcndlcmRhLCAgCisvLyAgICAgUGhvdG9ncmFwaGljIFRvbmUgUmVwcm9kdWN0aW9uIGZvciBEaWdpdGFsIEltYWdlcywgQUNNIFRyYW5zYWN0aW9ucyBvbiBHcmFwaGljcywgCisvLyAgICAgMjEoMyk6MjY3LTI3NiwgMjAwMiAoUHJvY2VlZGluZ3Mgb2YgU0lHR1JBUEggMjAwMikuIAorLy8gWzNdIEouIFR1bWJsaW4gYW5kIEguRS4gUnVzaG1laWVyLCAKKy8vICAgICBUb25lIFJlcHJvZHVjdGlvbiBmb3IgUmVhbGlzdGljIEltYWdlcy4gSUVFRSBDb21wdXRlciBHcmFwaGljcyBhbmQgQXBwbGljYXRpb25zLCAKKy8vICAgICAxMyg2KTo0Mi00OCwgMTk5My4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoqCitub21pbmFsIENSVCBwcmltYXJpZXMgCisqLworLyoKK3N0YXRpYyBjb25zdCBmbG9hdCBDSUVfeF9yID0gMC42NDBGOworc3RhdGljIGNvbnN0IGZsb2F0IENJRV95X3IgPSAwLjMzMEY7CitzdGF0aWMgY29uc3QgZmxvYXQgQ0lFX3hfZyA9IDAuMjkwRjsKK3N0YXRpYyBjb25zdCBmbG9hdCBDSUVfeV9nID0gMC42MDBGOworc3RhdGljIGNvbnN0IGZsb2F0IENJRV94X2IgPSAwLjE1MEY7CitzdGF0aWMgY29uc3QgZmxvYXQgQ0lFX3lfYiA9IDAuMDYwRjsKK3N0YXRpYyBjb25zdCBmbG9hdCBDSUVfeF93ID0gMC4zMzMzRjsJLy8gdXNlIHRydWUgd2hpdGUKK3N0YXRpYyBjb25zdCBmbG9hdCBDSUVfeV93ID0gMC4zMzMzRjsKKyovCisvKioKK3NSR0IgcHJpbWFyaWVzCisqLworc3RhdGljIGNvbnN0IGZsb2F0IENJRV94X3IgPSAwLjY0MEY7CitzdGF0aWMgY29uc3QgZmxvYXQgQ0lFX3lfciA9IDAuMzMwRjsKK3N0YXRpYyBjb25zdCBmbG9hdCBDSUVfeF9nID0gMC4zMDBGOworc3RhdGljIGNvbnN0IGZsb2F0IENJRV95X2cgPSAwLjYwMEY7CitzdGF0aWMgY29uc3QgZmxvYXQgQ0lFX3hfYiA9IDAuMTUwRjsKK3N0YXRpYyBjb25zdCBmbG9hdCBDSUVfeV9iID0gMC4wNjBGOworc3RhdGljIGNvbnN0IGZsb2F0IENJRV94X3cgPSAwLjMxMjdGOwkvLyBJbGx1bWluYW50IEQ2NQorc3RhdGljIGNvbnN0IGZsb2F0IENJRV95X3cgPSAwLjMyOTBGOworCitzdGF0aWMgY29uc3QgZmxvYXQgQ0lFX0QgPSAoIENJRV94X3IqKENJRV95X2cgLSBDSUVfeV9iKSArIENJRV94X2cqKENJRV95X2IgLSBDSUVfeV9yKSArIENJRV94X2IqKENJRV95X3IgLSBDSUVfeV9nKSApOworc3RhdGljIGNvbnN0IGZsb2F0IENJRV9DX3JEID0gKCAoMS9DSUVfeV93KSAqICggQ0lFX3hfdyooQ0lFX3lfZyAtIENJRV95X2IpIC0gQ0lFX3lfdyooQ0lFX3hfZyAtIENJRV94X2IpICsgQ0lFX3hfZypDSUVfeV9iIC0gQ0lFX3hfYipDSUVfeV9nKSApOworc3RhdGljIGNvbnN0IGZsb2F0IENJRV9DX2dEID0gKCAoMS9DSUVfeV93KSAqICggQ0lFX3hfdyooQ0lFX3lfYiAtIENJRV95X3IpIC0gQ0lFX3lfdyooQ0lFX3hfYiAtIENJRV94X3IpIC0gQ0lFX3hfcipDSUVfeV9iICsgQ0lFX3hfYipDSUVfeV9yKSApOworc3RhdGljIGNvbnN0IGZsb2F0IENJRV9DX2JEID0gKCAoMS9DSUVfeV93KSAqICggQ0lFX3hfdyooQ0lFX3lfciAtIENJRV95X2cpIC0gQ0lFX3lfdyooQ0lFX3hfciAtIENJRV94X2cpICsgQ0lFX3hfcipDSUVfeV9nIC0gQ0lFX3hfZypDSUVfeV9yKSApOworCisvKioKK1JHQiB0byBYWVogKG5vIHdoaXRlIGJhbGFuY2UpCisqLworc3RhdGljIGNvbnN0IGZsb2F0ICBSR0IyWFlaWzNdWzNdID0geworCXsgQ0lFX3hfcipDSUVfQ19yRCAvIENJRV9ELCAKKwkgIENJRV94X2cqQ0lFX0NfZ0QgLyBDSUVfRCwgCisJICBDSUVfeF9iKkNJRV9DX2JEIC8gQ0lFX0QgCisJfSwKKwl7IENJRV95X3IqQ0lFX0NfckQgLyBDSUVfRCwgCisJICBDSUVfeV9nKkNJRV9DX2dEIC8gQ0lFX0QsIAorCSAgQ0lFX3lfYipDSUVfQ19iRCAvIENJRV9EIAorCX0sCisJeyAoMSAtIENJRV94X3ItQ0lFX3lfcikqQ0lFX0NfckQgLyBDSUVfRCwKKwkgICgxIC0gQ0lFX3hfZy1DSUVfeV9nKSpDSUVfQ19nRCAvIENJRV9ELAorCSAgKDEgLSBDSUVfeF9iLUNJRV95X2IpKkNJRV9DX2JEIC8gQ0lFX0QKKwl9Cit9OworCisvKioKK1hZWiB0byBSR0IgKG5vIHdoaXRlIGJhbGFuY2UpCisqLworc3RhdGljIGNvbnN0IGZsb2F0ICBYWVoyUkdCWzNdWzNdID0geworCXsoQ0lFX3lfZyAtIENJRV95X2IgLSBDSUVfeF9iKkNJRV95X2cgKyBDSUVfeV9iKkNJRV94X2cpIC8gQ0lFX0NfckQsCisJIChDSUVfeF9iIC0gQ0lFX3hfZyAtIENJRV94X2IqQ0lFX3lfZyArIENJRV94X2cqQ0lFX3lfYikgLyBDSUVfQ19yRCwKKwkgKENJRV94X2cqQ0lFX3lfYiAtIENJRV94X2IqQ0lFX3lfZykgLyBDSUVfQ19yRAorCX0sCisJeyhDSUVfeV9iIC0gQ0lFX3lfciAtIENJRV95X2IqQ0lFX3hfciArIENJRV95X3IqQ0lFX3hfYikgLyBDSUVfQ19nRCwKKwkgKENJRV94X3IgLSBDSUVfeF9iIC0gQ0lFX3hfcipDSUVfeV9iICsgQ0lFX3hfYipDSUVfeV9yKSAvIENJRV9DX2dELAorCSAoQ0lFX3hfYipDSUVfeV9yIC0gQ0lFX3hfcipDSUVfeV9iKSAvIENJRV9DX2dECisJfSwKKwl7KENJRV95X3IgLSBDSUVfeV9nIC0gQ0lFX3lfcipDSUVfeF9nICsgQ0lFX3lfZypDSUVfeF9yKSAvIENJRV9DX2JELAorCSAoQ0lFX3hfZyAtIENJRV94X3IgLSBDSUVfeF9nKkNJRV95X3IgKyBDSUVfeF9yKkNJRV95X2cpIC8gQ0lFX0NfYkQsCisJIChDSUVfeF9yKkNJRV95X2cgLSBDSUVfeF9nKkNJRV95X3IpIC8gQ0lFX0NfYkQKKwl9Cit9OworCisvKioKK1RoaXMgZ2l2ZXMgYXBwcm94aW1hdGVseSB0aGUgZm9sbG93aW5nIG1hdHJpY2VzIDogCisKK3N0YXRpYyBjb25zdCBmbG9hdCBSR0IyWFlaWzNdWzNdID0geyAKKwl7IDAuNDEyMzkwODNGLCAwLjM1NzU4NDMzRiwgMC4xODA0ODA4MUYgfSwKKwl7IDAuMjEyNjM5MDNGLCAwLjcxNTE2ODY1RiwgMC4wNzIxOTIzMTlGIH0sCisJeyAwLjAxOTMzMDgyMEYsIDAuMTE5MTk0NzNGLCAwLjk1MDUzMjIwRiB9Cit9Oworc3RhdGljIGNvbnN0IGZsb2F0IFhZWjJSR0JbM11bM10gPSB7IAorCXsgMy4yNDA5Njk5RiwgLTEuNTM3MzgzMkYsIC0wLjQ5ODYxMDc5RiB9LAorCXsgLTAuOTY5MjQzNzZGLCAxLjg3NTk2NzZGLCAwLjA0MTU1NTA4NEYgfSwKKwl7IDAuMDU1NjMwMDM2RiwgLTAuMjAzOTc2ODdGLCAxLjA1Njk3MTVGIH0KK307CisqLworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBjb25zdCBmbG9hdCBFUFNJTE9OID0gMWUtMDZGOworc3RhdGljIGNvbnN0IGZsb2F0IElORiA9IDFlKzEwRjsKKworLyoqCitDb252ZXJ0IGluLXBsYWNlIGZsb2F0aW5nIHBvaW50IFJHQiBkYXRhIHRvIFl4eS48YnI+CitPbiBvdXRwdXQsIHBpeGVsLT5yZWQgPT0gWSwgcGl4ZWwtPmdyZWVuID09IHgsIHBpeGVsLT5ibHVlID09IHkKK0BwYXJhbSBkaWIgSW5wdXQgUkdCRiAvIE91dHB1dCBZeHkgaW1hZ2UKK0ByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgRkFMU0Ugb3RoZXJ3aXNlCisqLworQk9PTCAKK0NvbnZlcnRJblBsYWNlUkdCRlRvWXh5KEZJQklUTUFQICpkaWIpIHsKKwlmbG9hdCByZXN1bHRbM107CisKKwlpZihGcmVlSW1hZ2VfR2V0SW1hZ2VUeXBlKGRpYikgIT0gRklUX1JHQkYpCisJCXJldHVybiBGQUxTRTsKKworCWNvbnN0IHVuc2lnbmVkIHdpZHRoICA9IEZyZWVJbWFnZV9HZXRXaWR0aChkaWIpOworCWNvbnN0IHVuc2lnbmVkIGhlaWdodCA9IEZyZWVJbWFnZV9HZXRIZWlnaHQoZGliKTsKKwljb25zdCB1bnNpZ25lZCBwaXRjaCAgPSBGcmVlSW1hZ2VfR2V0UGl0Y2goZGliKTsKKwkKKwlCWVRFICpiaXRzID0gKEJZVEUqKUZyZWVJbWFnZV9HZXRCaXRzKGRpYik7CisJZm9yKHVuc2lnbmVkIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJRklSR0JGICpwaXhlbCA9IChGSVJHQkYqKWJpdHM7CisJCWZvcih1bnNpZ25lZCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCXJlc3VsdFswXSA9IHJlc3VsdFsxXSA9IHJlc3VsdFsyXSA9IDA7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgeworCQkJCXJlc3VsdFtpXSArPSBSR0IyWFlaW2ldWzBdICogcGl4ZWxbeF0ucmVkOworCQkJCXJlc3VsdFtpXSArPSBSR0IyWFlaW2ldWzFdICogcGl4ZWxbeF0uZ3JlZW47CisJCQkJcmVzdWx0W2ldICs9IFJHQjJYWVpbaV1bMl0gKiBwaXhlbFt4XS5ibHVlOworCQkJfQorCQkJY29uc3QgZmxvYXQgVyA9IHJlc3VsdFswXSArIHJlc3VsdFsxXSArIHJlc3VsdFsyXTsKKwkJCWNvbnN0IGZsb2F0IFkgPSByZXN1bHRbMV07CisJCQlpZihXID4gMCkgeyAKKwkJCQlwaXhlbFt4XS5yZWQgICA9IFk7CQkJICAgIC8vIFkgCisJCQkJcGl4ZWxbeF0uZ3JlZW4gPSByZXN1bHRbMF0gLyBXOwkvLyB4IAorCQkJCXBpeGVsW3hdLmJsdWUgID0gcmVzdWx0WzFdIC8gVzsJLy8geSAJCisJCQl9IGVsc2UgeworCQkJCXBpeGVsW3hdLnJlZCA9IHBpeGVsW3hdLmdyZWVuID0gcGl4ZWxbeF0uYmx1ZSA9IDA7CisJCQl9CisJCX0KKwkJLy8gbmV4dCBsaW5lCisJCWJpdHMgKz0gcGl0Y2g7CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorQ29udmVydCBpbi1wbGFjZSBZeHkgaW1hZ2UgdG8gZmxvYXRpbmcgcG9pbnQgUkdCIGRhdGEuPGJyPgorT24gaW5wdXQsIHBpeGVsLT5yZWQgPT0gWSwgcGl4ZWwtPmdyZWVuID09IHgsIHBpeGVsLT5ibHVlID09IHkKK0BwYXJhbSBkaWIgSW5wdXQgWXh5IC8gT3V0cHV0IFJHQkYgaW1hZ2UKK0ByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgRkFMU0Ugb3RoZXJ3aXNlCisqLworQk9PTCAKK0NvbnZlcnRJblBsYWNlWXh5VG9SR0JGKEZJQklUTUFQICpkaWIpIHsKKwlmbG9hdCByZXN1bHRbM107CisJZmxvYXQgWCwgWSwgWjsKKworCWlmKEZyZWVJbWFnZV9HZXRJbWFnZVR5cGUoZGliKSAhPSBGSVRfUkdCRikKKwkJcmV0dXJuIEZBTFNFOworCisJY29uc3QgdW5zaWduZWQgd2lkdGggID0gRnJlZUltYWdlX0dldFdpZHRoKGRpYik7CisJY29uc3QgdW5zaWduZWQgaGVpZ2h0ID0gRnJlZUltYWdlX0dldEhlaWdodChkaWIpOworCWNvbnN0IHVuc2lnbmVkIHBpdGNoICA9IEZyZWVJbWFnZV9HZXRQaXRjaChkaWIpOworCisJQllURSAqYml0cyA9IChCWVRFKilGcmVlSW1hZ2VfR2V0Qml0cyhkaWIpOworCWZvcih1bnNpZ25lZCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisJCUZJUkdCRiAqcGl4ZWwgPSAoRklSR0JGKiliaXRzOworCQlmb3IodW5zaWduZWQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisJCQlZID0gcGl4ZWxbeF0ucmVkOwkgICAgICAgIC8vIFkgCisJCQlyZXN1bHRbMV0gPSBwaXhlbFt4XS5ncmVlbjsJLy8geCAKKwkJCXJlc3VsdFsyXSA9IHBpeGVsW3hdLmJsdWU7CS8vIHkgCisJCQlpZiAoKFkgPiBFUFNJTE9OKSAmJiAocmVzdWx0WzFdID4gRVBTSUxPTikgJiYgKHJlc3VsdFsyXSA+IEVQU0lMT04pKSB7CisJCQkJWCA9IChyZXN1bHRbMV0gKiBZKSAvIHJlc3VsdFsyXTsKKwkJCQlaID0gKFggLyByZXN1bHRbMV0pIC0gWCAtIFk7CisJCQl9IGVsc2UgeworCQkJCVggPSBaID0gRVBTSUxPTjsKKwkJCX0KKwkJCXBpeGVsW3hdLnJlZCAgID0gWDsKKwkJCXBpeGVsW3hdLmdyZWVuID0gWTsKKwkJCXBpeGVsW3hdLmJsdWUgID0gWjsKKwkJCXJlc3VsdFswXSA9IHJlc3VsdFsxXSA9IHJlc3VsdFsyXSA9IDA7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgeworCQkJCXJlc3VsdFtpXSArPSBYWVoyUkdCW2ldWzBdICogcGl4ZWxbeF0ucmVkOworCQkJCXJlc3VsdFtpXSArPSBYWVoyUkdCW2ldWzFdICogcGl4ZWxbeF0uZ3JlZW47CisJCQkJcmVzdWx0W2ldICs9IFhZWjJSR0JbaV1bMl0gKiBwaXhlbFt4XS5ibHVlOworCQkJfQorCQkJcGl4ZWxbeF0ucmVkICAgPSByZXN1bHRbMF07CS8vIFIKKwkJCXBpeGVsW3hdLmdyZWVuID0gcmVzdWx0WzFdOwkvLyBHCisJCQlwaXhlbFt4XS5ibHVlICA9IHJlc3VsdFsyXTsJLy8gQgorCQl9CisJCS8vIG5leHQgbGluZQorCQliaXRzICs9IHBpdGNoOworCX0KKworCXJldHVybiBUUlVFOworfQorCisvKioKK0dldCB0aGUgbWF4aW11bSwgbWluaW11bSBhbmQgYXZlcmFnZSBsdW1pbmFuY2UuPGJyPgorT24gaW5wdXQsIHBpeGVsLT5yZWQgPT0gWSwgcGl4ZWwtPmdyZWVuID09IHgsIHBpeGVsLT5ibHVlID09IHkKK0BwYXJhbSBZeHkgU291cmNlIFl4eSBpbWFnZSB0byBhbmFseXplCitAcGFyYW0gbWF4THVtIE1heGltdW0gbHVtaW5hbmNlCitAcGFyYW0gbWluTHVtIE1pbmltdW0gbHVtaW5hbmNlCitAcGFyYW0gd29ybGRMdW0gQXZlcmFnZSBsdW1pbmFuY2UgKHdvcmxkIGFkYXB0YXRpb24gbHVtaW5hbmNlKQorQHJldHVybiBSZXR1cm5zIFRSVUUgaWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyBGQUxTRSBvdGhlcndpc2UKKyovCitCT09MIAorTHVtaW5hbmNlRnJvbVl4eShGSUJJVE1BUCAqWXh5LCBmbG9hdCAqbWF4THVtLCBmbG9hdCAqbWluTHVtLCBmbG9hdCAqd29ybGRMdW0pIHsKKwlpZihGcmVlSW1hZ2VfR2V0SW1hZ2VUeXBlKFl4eSkgIT0gRklUX1JHQkYpCisJCXJldHVybiBGQUxTRTsKKworCWNvbnN0IHVuc2lnbmVkIHdpZHRoICA9IEZyZWVJbWFnZV9HZXRXaWR0aChZeHkpOworCWNvbnN0IHVuc2lnbmVkIGhlaWdodCA9IEZyZWVJbWFnZV9HZXRIZWlnaHQoWXh5KTsKKwljb25zdCB1bnNpZ25lZCBwaXRjaCAgPSBGcmVlSW1hZ2VfR2V0UGl0Y2goWXh5KTsKKworCWZsb2F0IG1heF9sdW0gPSAwLCBtaW5fbHVtID0gMDsKKwlkb3VibGUgc3VtID0gMDsKKworCUJZVEUgKmJpdHMgPSAoQllURSopRnJlZUltYWdlX0dldEJpdHMoWXh5KTsKKwlmb3IodW5zaWduZWQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworCQljb25zdCBGSVJHQkYgKnBpeGVsID0gKEZJUkdCRiopYml0czsKKwkJZm9yKHVuc2lnbmVkIHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworCQkJY29uc3QgZmxvYXQgWSA9IE1BWCgwLjBGLCBwaXhlbFt4XS5yZWQpOy8vIGF2b2lkIG5lZ2F0aXZlIHZhbHVlcworCQkJbWF4X2x1bSA9IChtYXhfbHVtIDwgWSkgPyBZIDogbWF4X2x1bTsJLy8gbWF4IEx1bWluYW5jZSBpbiB0aGUgc2NlbmUKKwkJCW1pbl9sdW0gPSAobWluX2x1bSA8IFkpID8gbWluX2x1bSA6IFk7CS8vIG1pbiBMdW1pbmFuY2UgaW4gdGhlIHNjZW5lCisgICAgICAgICAgICAgICAgICAgICAgICBzdW0gKz0gc3RkOjpsb2coCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4zZS01RiArIFkpOyAgLy8gY29udHJhc3QgY29uc3RhbnQgaW4gVHVtYmxpbiBwYXBlcgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBuZXh0IGxpbmUKKyAgICAgICAgICAgICAgICBiaXRzICs9IHBpdGNoOworCX0KKwkvLyBtYXhpbXVtIGx1bWluYW5jZQorCSptYXhMdW0gPSBtYXhfbHVtOworCS8vIG1pbmltdW0gbHVtaW5hbmNlCisJKm1pbkx1bSA9IG1pbl9sdW07CisJLy8gYXZlcmFnZSBsb2cgbHVtaW5hbmNlCisJZG91YmxlIGF2Z0xvZ0x1bSA9IChzdW0gLyAod2lkdGggKiBoZWlnaHQpKTsKKwkvLyB3b3JsZCBhZGFwdGF0aW9uIGx1bWluYW5jZQorCSp3b3JsZEx1bSA9IChmbG9hdClleHAoYXZnTG9nTHVtKTsKKworCXJldHVybiBUUlVFOworfQorCisvKioKK0NsYW1wIFJHQkYgaW1hZ2UgaGlnaGVzdCB2YWx1ZXMgdG8gZGlzcGxheSB3aGl0ZSwgCit0aGVuIGNvbnZlcnQgdG8gMjQtYml0IFJHQgorKi8KK0ZJQklUTUFQKiAKK0NsYW1wQ29udmVydFJHQkZUbzI0KEZJQklUTUFQICpzcmMpIHsKKwlpZihGcmVlSW1hZ2VfR2V0SW1hZ2VUeXBlKHNyYykgIT0gRklUX1JHQkYpCisJCXJldHVybiBGQUxTRTsKKworCWNvbnN0IHVuc2lnbmVkIHdpZHRoICA9IEZyZWVJbWFnZV9HZXRXaWR0aChzcmMpOworCWNvbnN0IHVuc2lnbmVkIGhlaWdodCA9IEZyZWVJbWFnZV9HZXRIZWlnaHQoc3JjKTsKKworCUZJQklUTUFQICpkc3QgPSBGcmVlSW1hZ2VfQWxsb2NhdGUod2lkdGgsIGhlaWdodCwgMjQsIEZJX1JHQkFfUkVEX01BU0ssIEZJX1JHQkFfR1JFRU5fTUFTSywgRklfUkdCQV9CTFVFX01BU0spOworCWlmKCFkc3QpIHJldHVybiBOVUxMOworCisJY29uc3QgdW5zaWduZWQgc3JjX3BpdGNoICA9IEZyZWVJbWFnZV9HZXRQaXRjaChzcmMpOworCWNvbnN0IHVuc2lnbmVkIGRzdF9waXRjaCAgPSBGcmVlSW1hZ2VfR2V0UGl0Y2goZHN0KTsKKworCUJZVEUgKnNyY19iaXRzID0gKEJZVEUqKUZyZWVJbWFnZV9HZXRCaXRzKHNyYyk7CisJQllURSAqZHN0X2JpdHMgPSAoQllURSopRnJlZUltYWdlX0dldEJpdHMoZHN0KTsKKworCWZvcih1bnNpZ25lZCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisJCWNvbnN0IEZJUkdCRiAqc3JjX3BpeGVsID0gKEZJUkdCRiopc3JjX2JpdHM7CisJCUJZVEUgKmRzdF9waXhlbCA9IChCWVRFKilkc3RfYml0czsKKwkJZm9yKHVuc2lnbmVkIHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworCQkJY29uc3QgZmxvYXQgcmVkICAgPSAoc3JjX3BpeGVsW3hdLnJlZCA+IDEpICAgPyAxIDogc3JjX3BpeGVsW3hdLnJlZDsKKwkJCWNvbnN0IGZsb2F0IGdyZWVuID0gKHNyY19waXhlbFt4XS5ncmVlbiA+IDEpID8gMSA6IHNyY19waXhlbFt4XS5ncmVlbjsKKwkJCWNvbnN0IGZsb2F0IGJsdWUgID0gKHNyY19waXhlbFt4XS5ibHVlID4gMSkgID8gMSA6IHNyY19waXhlbFt4XS5ibHVlOworCQkJCisJCQlkc3RfcGl4ZWxbRklfUkdCQV9SRURdICAgPSAoQllURSkoMjU1LjBGICogcmVkICAgKyAwLjVGKTsKKwkJCWRzdF9waXhlbFtGSV9SR0JBX0dSRUVOXSA9IChCWVRFKSgyNTUuMEYgKiBncmVlbiArIDAuNUYpOworCQkJZHN0X3BpeGVsW0ZJX1JHQkFfQkxVRV0gID0gKEJZVEUpKDI1NS4wRiAqIGJsdWUgICsgMC41Rik7CisJCQlkc3RfcGl4ZWwgKz0gMzsKKwkJfQorCQlzcmNfYml0cyArPSBzcmNfcGl0Y2g7CisJCWRzdF9iaXRzICs9IGRzdF9waXRjaDsKKwl9CisKKwlyZXR1cm4gZHN0OworfQorCisvKioKK0V4dHJhY3QgdGhlIGx1bWluYW5jZSBjaGFubmVsIEwgZnJvbSBhIFJHQkYgaW1hZ2UuIAorTHVtaW5hbmNlIGlzIGNhbGN1bGF0ZWQgZnJvbSB0aGUgc1JHQiBtb2RlbCAoUkdCMlhZWiBtYXRyaXgpIAordXNpbmcgYSBENjUgd2hpdGUgcG9pbnQgOiAKK0wgPSAoIDAuMjEyNiAqIHIgKSArICggMC43MTUyICogZyApICsgKCAwLjA3MjIgKiBiICkKK1JlZmVyZW5jZSA6IAorQSBTdGFuZGFyZCBEZWZhdWx0IENvbG9yIFNwYWNlIGZvciB0aGUgSW50ZXJuZXQgLSBzUkdCLiAKK1tvbmxpbmVdIGh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL0NvbG9yL3NSR0IKKyovCitGSUJJVE1BUCogIAorQ29udmVydFJHQkZUb1koRklCSVRNQVAgKnNyYykgeworCWlmKEZyZWVJbWFnZV9HZXRJbWFnZVR5cGUoc3JjKSAhPSBGSVRfUkdCRikKKwkJcmV0dXJuIEZBTFNFOworCisJY29uc3QgdW5zaWduZWQgd2lkdGggID0gRnJlZUltYWdlX0dldFdpZHRoKHNyYyk7CisJY29uc3QgdW5zaWduZWQgaGVpZ2h0ID0gRnJlZUltYWdlX0dldEhlaWdodChzcmMpOworCisJRklCSVRNQVAgKmRzdCA9IEZyZWVJbWFnZV9BbGxvY2F0ZVQoRklUX0ZMT0FULCB3aWR0aCwgaGVpZ2h0KTsKKwlpZighZHN0KSByZXR1cm4gTlVMTDsKKworCWNvbnN0IHVuc2lnbmVkIHNyY19waXRjaCAgPSBGcmVlSW1hZ2VfR2V0UGl0Y2goc3JjKTsKKwljb25zdCB1bnNpZ25lZCBkc3RfcGl0Y2ggID0gRnJlZUltYWdlX0dldFBpdGNoKGRzdCk7CisKKwkKKwlCWVRFICpzcmNfYml0cyA9IChCWVRFKilGcmVlSW1hZ2VfR2V0Qml0cyhzcmMpOworCUJZVEUgKmRzdF9iaXRzID0gKEJZVEUqKUZyZWVJbWFnZV9HZXRCaXRzKGRzdCk7CisKKwlmb3IodW5zaWduZWQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworCQljb25zdCBGSVJHQkYgKnNyY19waXhlbCA9IChGSVJHQkYqKXNyY19iaXRzOworCQlmbG9hdCAgKmRzdF9waXhlbCA9IChmbG9hdCopZHN0X2JpdHM7CisJCWZvcih1bnNpZ25lZCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCWNvbnN0IGZsb2F0IEwgPSBMVU1BX1JFQzcwOShzcmNfcGl4ZWxbeF0ucmVkLCBzcmNfcGl4ZWxbeF0uZ3JlZW4sIHNyY19waXhlbFt4XS5ibHVlKTsKKwkJCWRzdF9waXhlbFt4XSA9IChMID4gMCkgPyBMIDogMDsKKwkJfQorCQkvLyBuZXh0IGxpbmUKKwkJc3JjX2JpdHMgKz0gc3JjX3BpdGNoOworCQlkc3RfYml0cyArPSBkc3RfcGl0Y2g7CisJfQorCisJcmV0dXJuIGRzdDsKK30KKworLyoqCitHZXQgdGhlIG1heGltdW0sIG1pbmltdW0sIGF2ZXJhZ2UgbHVtaW5hbmNlIGFuZCBsb2cgYXZlcmFnZSBsdW1pbmFuY2UgZnJvbSBhIFkgaW1hZ2UKK0BwYXJhbSBkaWIgU291cmNlIFkgaW1hZ2UgdG8gYW5hbHl6ZQorQHBhcmFtIG1heEx1bSBNYXhpbXVtIGx1bWluYW5jZQorQHBhcmFtIG1pbkx1bSBNaW5pbXVtIGx1bWluYW5jZQorQHBhcmFtIExhdiBBdmVyYWdlIGx1bWluYW5jZQorQHBhcmFtIExsYXYgTG9nIGF2ZXJhZ2UgbHVtaW5hbmNlIChhbHNvIGtub3duIGFzICd3b3JsZCBhZGFwdGF0aW9uIGx1bWluYW5jZScpCitAcmV0dXJuIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsLCByZXR1cm5zIEZBTFNFIG90aGVyd2lzZQorQHNlZSBDb252ZXJ0UkdCRlRvWSwgRnJlZUltYWdlX1Rtb1JlaW5oYXJkMDVFeAorKi8KK0JPT0wgCitMdW1pbmFuY2VGcm9tWShGSUJJVE1BUCAqZGliLCBmbG9hdCAqbWF4THVtLCBmbG9hdCAqbWluTHVtLCBmbG9hdCAqTGF2LCBmbG9hdCAqTGxhdikgeworCWlmKEZyZWVJbWFnZV9HZXRJbWFnZVR5cGUoZGliKSAhPSBGSVRfRkxPQVQpCisJCXJldHVybiBGQUxTRTsKKworCXVuc2lnbmVkIHdpZHRoICA9IEZyZWVJbWFnZV9HZXRXaWR0aChkaWIpOworCXVuc2lnbmVkIGhlaWdodCA9IEZyZWVJbWFnZV9HZXRIZWlnaHQoZGliKTsKKwl1bnNpZ25lZCBwaXRjaCAgPSBGcmVlSW1hZ2VfR2V0UGl0Y2goZGliKTsKKworCWZsb2F0IG1heF9sdW0gPSAtMWUyMEYsIG1pbl9sdW0gPSAxZTIwRjsKKwlkb3VibGUgc3VtTHVtID0gMCwgc3VtTG9nTHVtID0gMDsKKworCUJZVEUgKmJpdHMgPSAoQllURSopRnJlZUltYWdlX0dldEJpdHMoZGliKTsKKwlmb3IodW5zaWduZWQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworCQljb25zdCBmbG9hdCAqcGl4ZWwgPSAoZmxvYXQqKWJpdHM7CisJCWZvcih1bnNpZ25lZCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCWNvbnN0IGZsb2F0IFkgPSBwaXhlbFt4XTsKKwkJCW1heF9sdW0gPSAobWF4X2x1bSA8IFkpID8gWSA6IG1heF9sdW07CQkJCS8vIG1heCBMdW1pbmFuY2UgaW4gdGhlIHNjZW5lCisJCQltaW5fbHVtID0gKChZID4gMCkgJiYgKG1pbl9sdW0gPCBZKSkgPyBtaW5fbHVtIDogWTsJLy8gbWluIEx1bWluYW5jZSBpbiB0aGUgc2NlbmUKKwkJCXN1bUx1bSArPSBZOwkJCQkJCQkJCQkvLyBhdmVyYWdlIGx1bWluYW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgc3VtTG9nTHVtICs9IHN0ZDo6bG9nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuM2UtNUYgKyBZKTsgIC8vIGNvbnRyYXN0IGNvbnN0YW50IGluIFR1bWJsaW4gcGFwZXIKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gbmV4dCBsaW5lCisgICAgICAgICAgICAgICAgYml0cyArPSBwaXRjaDsKKwl9CisKKwkvLyBtYXhpbXVtIGx1bWluYW5jZQorCSptYXhMdW0gPSBtYXhfbHVtOworCS8vIG1pbmltdW0gbHVtaW5hbmNlCisJKm1pbkx1bSA9IG1pbl9sdW07CisJLy8gYXZlcmFnZSBsdW1pbmFuY2UKKwkqTGF2ID0gKGZsb2F0KShzdW1MdW0gLyAod2lkdGggKiBoZWlnaHQpKTsKKwkvLyBhdmVyYWdlIGxvZyBsdW1pbmFuY2UsIGEuay5hLiB3b3JsZCBhZGFwdGF0aW9uIGx1bWluYW5jZQorCSpMbGF2ID0gKGZsb2F0KWV4cChzdW1Mb2dMdW0gLyAod2lkdGggKiBoZWlnaHQpKTsKKworCXJldHVybiBUUlVFOworfQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgZmluZE1heE1pblBlcmNlbnRpbGUoRklCSVRNQVAgKlksIGZsb2F0IG1pblByY3QsIGZsb2F0ICptaW5MdW0sIGZsb2F0IG1heFByY3QsIGZsb2F0ICptYXhMdW0pIHsKKwlpbnQgeCwgeTsKKwlpbnQgd2lkdGggPSBGcmVlSW1hZ2VfR2V0V2lkdGgoWSk7CisJaW50IGhlaWdodCA9IEZyZWVJbWFnZV9HZXRIZWlnaHQoWSk7CisJaW50IHBpdGNoID0gRnJlZUltYWdlX0dldFBpdGNoKFkpOworCisJc3RkOjp2ZWN0b3I8ZmxvYXQ+IHZZKHdpZHRoICogaGVpZ2h0KTsKKworCUJZVEUgKmJpdHMgPSAoQllURSopRnJlZUltYWdlX0dldEJpdHMoWSk7CisJZm9yKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJZmxvYXQgKnBpeGVsID0gKGZsb2F0KiliaXRzOworCQlmb3IoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisJCQlpZihwaXhlbFt4XSAhPSAwKSB7CisJCQkJdlkucHVzaF9iYWNrKHBpeGVsW3hdKTsKKwkJCX0KKwkJfQorCQliaXRzICs9IHBpdGNoOworCX0KKworCXN0ZDo6c29ydCh2WS5iZWdpbigpLCB2WS5lbmQoKSk7CisJCisJKm1pbkx1bSA9IHZZLmF0KCBpbnQobWluUHJjdCAqIHZZLnNpemUoKSkgKTsKKwkqbWF4THVtID0gdlkuYXQoIGludChtYXhQcmN0ICogdlkuc2l6ZSgpKSApOworfQorCisvKioKK0NsaXBwaW5nIGZ1bmN0aW9uPGJyPgorUmVtb3ZlIGFueSBleHRyZW1lbHkgYnJpZ2h0IGFuZC9vciBleHRyZW1lbHkgZGFyayBwaXhlbHMgCithbmQgbm9ybWFsaXplIGJldHdlZW4gMCBhbmQgMS4gCitAcGFyYW0gWSBJbnB1dC9PdXRwdXQgaW1hZ2UKK0BwYXJhbSBtaW5QcmN0IE1pbmltdW0gcGVyY2VudGlsZQorQHBhcmFtIG1heFByY3QgTWF4aW11bSBwZXJjZW50aWxlCisqLwordm9pZCAKK05vcm1hbGl6ZVkoRklCSVRNQVAgKlksIGZsb2F0IG1pblByY3QsIGZsb2F0IG1heFByY3QpIHsKKwlpbnQgeCwgeTsKKwlmbG9hdCBtYXhMdW0sIG1pbkx1bTsKKworCWlmKG1pblByY3QgPiBtYXhQcmN0KSB7CisJCS8vIHN3YXAgdmFsdWVzCisJCWZsb2F0IHQgPSBtaW5QcmN0OyBtaW5QcmN0ID0gbWF4UHJjdDsgbWF4UHJjdCA9IHQ7CisJfQorCWlmKG1pblByY3QgPCAwKSBtaW5QcmN0ID0gMDsKKwlpZihtYXhQcmN0ID4gMSkgbWF4UHJjdCA9IDE7CisKKwlpbnQgd2lkdGggPSBGcmVlSW1hZ2VfR2V0V2lkdGgoWSk7CisJaW50IGhlaWdodCA9IEZyZWVJbWFnZV9HZXRIZWlnaHQoWSk7CisJaW50IHBpdGNoID0gRnJlZUltYWdlX0dldFBpdGNoKFkpOworCisJLy8gZmluZCBtYXggJiBtaW4gbHVtaW5hbmNlIHZhbHVlcworCWlmKChtaW5QcmN0ID4gMCkgfHwgKG1heFByY3QgPCAxKSkgeworCQltYXhMdW0gPSAwLCBtaW5MdW0gPSAwOworCQlmaW5kTWF4TWluUGVyY2VudGlsZShZLCBtaW5QcmN0LCAmbWluTHVtLCBtYXhQcmN0LCAmbWF4THVtKTsKKwl9IGVsc2UgeworCQltYXhMdW0gPSAtMWUyMEYsIG1pbkx1bSA9IDFlMjBGOworCQlCWVRFICpiaXRzID0gKEJZVEUqKUZyZWVJbWFnZV9HZXRCaXRzKFkpOworCQlmb3IoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworCQkJY29uc3QgZmxvYXQgKnBpeGVsID0gKGZsb2F0KiliaXRzOworCQkJZm9yKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworCQkJCWNvbnN0IGZsb2F0IHZhbHVlID0gcGl4ZWxbeF07CisJCQkJbWF4THVtID0gKG1heEx1bSA8IHZhbHVlKSA/IHZhbHVlIDogbWF4THVtOwkvLyBtYXggTHVtaW5hbmNlIGluIHRoZSBzY2VuZQorCQkJCW1pbkx1bSA9IChtaW5MdW0gPCB2YWx1ZSkgPyBtaW5MdW0gOiB2YWx1ZTsJLy8gbWluIEx1bWluYW5jZSBpbiB0aGUgc2NlbmUKKwkJCX0KKwkJCS8vIG5leHQgbGluZQorCQkJYml0cyArPSBwaXRjaDsKKwkJfQorCX0KKwlpZihtYXhMdW0gPT0gbWluTHVtKSByZXR1cm47CisKKwkvLyBub3JtYWxpemUgdG8gcmFuZ2UgMC4uMSAKKwljb25zdCBmbG9hdCBkaXZpZGVyID0gbWF4THVtIC0gbWluTHVtOworCUJZVEUgKmJpdHMgPSAoQllURSopRnJlZUltYWdlX0dldEJpdHMoWSk7CisJZm9yKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJZmxvYXQgKnBpeGVsID0gKGZsb2F0KiliaXRzOworCQlmb3IoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisJCQlwaXhlbFt4XSA9IChwaXhlbFt4XSAtIG1pbkx1bSkgLyBkaXZpZGVyOworCQkJaWYocGl4ZWxbeF0gPD0gMCkgcGl4ZWxbeF0gPSBFUFNJTE9OOworCQkJaWYocGl4ZWxbeF0gPiAxKSBwaXhlbFt4XSA9IDE7CisJCX0KKwkJLy8gbmV4dCBsaW5lCisJCWJpdHMgKz0gcGl0Y2g7CisJfQorfQpkaWZmIC0tZ2l0IGEvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS90bW9EcmFnbzAzLmNwcCBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvdG1vRHJhZ28wMy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZkNWRiNwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvdG1vRHJhZ28wMy5jcHAKQEAgLTAsMCArMSwzMDAgQEAKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFRvbmUgbWFwcGluZyBvcGVyYXRvciAoRHJhZ28sIDIwMDMpCisvLworLy8gRGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBieQorLy8gLSBIZXJ26SBEcm9sb24gKGRyb2xvbkBpbmZvbmllLmZyKQorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZyZWVJbWFnZSAzCisvLworLy8gQ09WRVJFRCBDT0RFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZCisvLyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUworLy8gVEhBVCBUSEUgQ09WRVJFRCBDT0RFIElTIEZSRUUgT0YgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisvLyBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRAorLy8gQ09ERSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVAorLy8gVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GIEFOWSBORUNFU1NBUlkKKy8vIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwKKy8vIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIKKy8vIFRISVMgRElTQ0xBSU1FUi4KKy8vCisvLyBVc2UgYXQgeW91ciBvd24gcmlzayEKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2luY2x1ZGUgPGNtYXRoPgorCisjaW5jbHVkZSAiRnJlZUltYWdlLmgiCisjaW5jbHVkZSAiVXRpbGl0aWVzLmgiCisjaW5jbHVkZSAiVG9uZU1hcHBpbmcuaCIKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTG9nYXJpdGhtaWMgbWFwcGluZyBvcGVyYXRvcgorLy8gUmVmZXJlbmNlOiAKKy8vIFsxXSBGLiBEcmFnbywgSy4gTXlzemtvd3NraSwgVC4gQW5uZW4sIGFuZCBOLiBDaGliYSwgCisvLyBBZGFwdGl2ZSBMb2dhcml0aG1pYyBNYXBwaW5nIGZvciBEaXNwbGF5aW5nIEhpZ2ggQ29udHJhc3QgU2NlbmVzLCAKKy8vIEV1cm9ncmFwaGljcyAyMDAzLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKioKK0JpYXMgZnVuY3Rpb24KKyovCitzdGF0aWMgaW5saW5lIGRvdWJsZSAKK2JpYXNGdW5jdGlvbihjb25zdCBkb3VibGUgYiwgY29uc3QgZG91YmxlIHgpIHsKKwlyZXR1cm4gcG93ICh4LCBiKTsJCS8vIHBvdyh4LCBsb2coYmlhcykvbG9nKDAuNSkKK30KKworLyoqCitQYWTpIGFwcHJveGltYXRpb24gb2YgbG9nKHggKyAxKQoreCg2K3gpLyg2KzR4KSBnb29kIGlmIHggPCAxCit4Kig2ICsgMC43NjYyeCkvKDUuOTg5NyArIDMuNzY1OHgpIGJldHdlZW4gMSBhbmQgMgorU2VlIGh0dHA6Ly93d3cubmV6dW1pLmRlbW9uLmNvLnVrL2NvbnN1bHQvbG9neC5odG0KKyovCitzdGF0aWMgaW5saW5lIGRvdWJsZSAKK3BhZGVfbG9nKGNvbnN0IGRvdWJsZSB4KSB7CisJaWYoeCA8IDEpIHsKKwkJcmV0dXJuICh4ICogKDYgKyB4KSAvICg2ICsgNCAqIHgpKTsKKwl9IGVsc2UgaWYoeCA8IDIpIHsKKwkJcmV0dXJuICh4ICogKDYgKyAwLjc2NjIgKiB4KSAvICg1Ljk4OTcgKyAzLjc2NTggKiB4KSk7CisJfQorCXJldHVybiBsb2coeCArIDEpOworfQorCisvKioKK0xvZyBtYXBwaW5nIG9wZXJhdG9yCitAcGFyYW0gZGliIElucHV0IC8gT3V0cHV0IFl4eSBpbWFnZQorQHBhcmFtIG1heEx1bSBNYXhpbXVtIGx1bWluYW5jZQorQHBhcmFtIGF2Z0x1bSBBdmVyYWdlIGx1bWluYW5jZSAod29ybGQgYWRhcHRhdGlvbiBsdW1pbmFuY2UpCitAcGFyYW0gYmlhc1BhcmFtIEJpYXMgcGFyYW1ldGVyIChhIHplcm8gdmFsdWUgZGVmYXVsdCB0byAwLjg1KQorQHBhcmFtIGV4cG9zdXJlIEV4cG9zdXJlIHBhcmFtZXRlciAoZGVmYXVsdCB0byAwKQorQHJldHVybiBSZXR1cm5zIFRSVUUgaWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyBGQUxTRSBvdGhlcndpc2UKKyovCitzdGF0aWMgQk9PTCAKK1RvbmVNYXBwaW5nRHJhZ28wMyhGSUJJVE1BUCAqZGliLCBjb25zdCBmbG9hdCBtYXhMdW0sIGNvbnN0IGZsb2F0IGF2Z0x1bSwgZmxvYXQgYmlhc1BhcmFtLCBjb25zdCBmbG9hdCBleHBvc3VyZSkgeworCWNvbnN0IGZsb2F0IExPRzA1ID0gLTAuNjkzMTQ3RjsJLy8gbG9nKDAuNSkgCisKKwlkb3VibGUgTG1heCwgZGl2aWRlciwgaW50ZXJwb2wsIGJpYXNQOworCXVuc2lnbmVkIHgsIHk7CisJZG91YmxlIEw7CisKKwlpZihGcmVlSW1hZ2VfR2V0SW1hZ2VUeXBlKGRpYikgIT0gRklUX1JHQkYpCisJCXJldHVybiBGQUxTRTsKKworCWNvbnN0IHVuc2lnbmVkIHdpZHRoICA9IEZyZWVJbWFnZV9HZXRXaWR0aChkaWIpOworCWNvbnN0IHVuc2lnbmVkIGhlaWdodCA9IEZyZWVJbWFnZV9HZXRIZWlnaHQoZGliKTsKKwljb25zdCB1bnNpZ25lZCBwaXRjaCAgPSBGcmVlSW1hZ2VfR2V0UGl0Y2goZGliKTsKKworCisJLy8gYXJiaXRyYXJ5IEJpYXMgUGFyYW1ldGVyIAorCWlmKGJpYXNQYXJhbSA9PSAwKSAKKwkJYmlhc1BhcmFtID0gMC44NUY7CisKKwkvLyBub3JtYWxpemUgbWF4aW11bSBsdW1pbmFuY2UgYnkgYXZlcmFnZSBsdW1pbmFuY2UKKwlMbWF4ID0gbWF4THVtIC8gYXZnTHVtOworCQorCWRpdmlkZXIgPSBsb2cxMChMbWF4KzEpOworICAgICAgICBiaWFzUCA9IHN0ZDo6bG9nKGJpYXNQYXJhbSkgLyBMT0cwNTsKKworI2lmICFkZWZpbmVkKERSQUdPMDNfRkFTVCkKKworCS8qKgorCU5vcm1hbCB0b25lIG1hcHBpbmcgb2YgZXZlcnkgcGl4ZWwKKwlmdXJ0aGVyIGFjY2VsZXJhdGlvbiBpcyBvYnRhaW5lZCBieSBhIFBhZOkgYXBwcm94aW1hdGlvbiBvZiBsb2coeCArIDEpCisJKi8KKwlCWVRFICpiaXRzID0gKEJZVEUqKUZyZWVJbWFnZV9HZXRCaXRzKGRpYik7CisJZm9yKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJRklSR0JGICpwaXhlbCA9IChGSVJHQkYqKWJpdHM7CisJCWZvcih4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCWRvdWJsZSBZdyA9IHBpeGVsW3hdLnJlZCAvIGF2Z0x1bTsKKwkJCVl3ICo9IGV4cG9zdXJlOworCQkJaW50ZXJwb2wgPSBsb2coMiArIGJpYXNGdW5jdGlvbihiaWFzUCwgWXcgLyBMbWF4KSAqIDgpOworCQkJTCA9IHBhZGVfbG9nKFl3KTsvLyBsb2coWXcgKyAxKQorCQkJcGl4ZWxbeF0ucmVkID0gKGZsb2F0KSgoTCAvIGludGVycG9sKSAvIGRpdmlkZXIpOworCQl9CisJCS8vIG5leHQgbGluZQorCQliaXRzICs9IHBpdGNoOworCX0KKworI2Vsc2UKKwl1bnNpZ25lZCBpbmRleDsKKwlpbnQgaSwgajsKKworCXVuc2lnbmVkIG1heF93aWR0aCAgPSB3aWR0aCAtICh3aWR0aCAlIDMpOworCXVuc2lnbmVkIG1heF9oZWlnaHQgPSBoZWlnaHQgLSAoaGVpZ2h0ICUgMyk7IAorCXVuc2lnbmVkIGZwaXRjaCA9IHBpdGNoIC8gc2l6ZW9mKEZJUkdCRik7CisKKwkvKioKKwlmYXN0IHRvbmUgbWFwcGluZworCXNwbGl0IHRoZSBpbWFnZSBpbnRvIDN4MyBwaXhlbCB0aWxlcyBhbmQgcGVyZm9ybSB0aGUgY29tcHV0YXRpb24gZm9yIGVhY2ggZ3JvdXAgb2YgOSBwaXhlbHMKKwlmdXJ0aGVyIGFjY2VsZXJhdGlvbiBpcyBvYnRhaW5lZCBieSBhIFBhZOkgYXBwcm94aW1hdGlvbiBvZiBsb2coeCArIDEpCisJPT4gcHJvZHVjZSBhcnRpZmFjdHMgYW5kIG5vdCBzbyBmYXN0ZXIsIHNvIHRoZSBjb2RlIGhhcyBiZWVuIGRpc2FibGVkCisJKi8KKyNkZWZpbmUgUElYRUwoeCwgeSkJaW1hZ2VbeSpmcGl0Y2ggKyB4XS5yZWQKKworCUZJUkdCRiAqaW1hZ2UgPSAoRklSR0JGKilGcmVlSW1hZ2VfR2V0Qml0cyhkaWIpOworCWZvcih5ID0gMDsgeSA8IG1heF9oZWlnaHQ7IHkgKz0gMykgeworCQlmb3IoeCA9IDA7IHggPCBtYXhfd2lkdGg7IHggKz0gMykgeworCQkJZG91YmxlIGF2ZXJhZ2UgPSAwOworCQkJZm9yKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCQkJZm9yKGogPSAwOyBqIDwgMzsgaisrKSB7CisJCQkJCWluZGV4ID0gKHkgKyBpKSpmcGl0Y2ggKyAoeCArIGopOworCQkJCQlpbWFnZVtpbmRleF0ucmVkIC89IChmbG9hdClhdmdMdW07CisJCQkJCWltYWdlW2luZGV4XS5yZWQgKj0gZXhwb3N1cmU7IAorCQkJCQlhdmVyYWdlICs9IGltYWdlW2luZGV4XS5yZWQ7CisJCQkJfQorCQkJfQorCQkJYXZlcmFnZSA9IGF2ZXJhZ2UgLyA5IC0gUElYRUwoeCwgeSk7CisJCQlpZihhdmVyYWdlID4gLTEgJiYgYXZlcmFnZSA8IDEpIHsKKwkJCQlpbnRlcnBvbCA9IGxvZygyICsgcG93KFBJWEVMKHggKyAxLCB5ICsgMSkgLyBMbWF4LCBiaWFzUCkgKiA4KTsKKwkJCQlmb3IoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJCQkJZm9yKGogPSAwOyBqIDwgMzsgaisrKSB7CisJCQkJCQlpbmRleCA9ICh5ICsgaSkqZnBpdGNoICsgKHggKyBqKTsKKwkJCQkJCUwgPSBwYWRlX2xvZyhpbWFnZVtpbmRleF0ucmVkKTsvLyBsb2coaW1hZ2VbaW5kZXhdLnJlZCArIDEpCisJCQkJCQlpbWFnZVtpbmRleF0ucmVkID0gKGZsb2F0KSgoTCAvIGludGVycG9sKSAvIGRpdmlkZXIpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJZWxzZSB7CisJCQkJZm9yKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCQkJCWZvcihqID0gMDsgaiA8IDM7IGorKykgeworCQkJCQkJaW5kZXggPSAoeSArIGkpKmZwaXRjaCArICh4ICsgaik7CisJCQkJCQlpbnRlcnBvbCA9IGxvZygyICsgcG93KGltYWdlW2luZGV4XS5yZWQgLyBMbWF4LCBiaWFzUCkgKiA4KTsKKwkJCQkJCUwgPSBwYWRlX2xvZyhpbWFnZVtpbmRleF0ucmVkKTsvLyBsb2coaW1hZ2VbaW5kZXhdLnJlZCArIDEpCisJCQkJCQlpbWFnZVtpbmRleF0ucmVkID0gKGZsb2F0KSgoTCAvIGludGVycG9sKSAvIGRpdmlkZXIpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9IC8veAorCX0gLy8geQorCisJLyoqCisJTm9ybWFsIHRvbmUgbWFwcGluZyBvZiBldmVyeSBwaXhlbCBmb3IgdGhlIHJlbWFpbmluZyByaWdodCBhbmQgYm90dG9tIGJhbmRzCisJKi8KKwlCWVRFICpiaXRzOworCisJLy8gcmlnaHQgYmFuZAorCWJpdHMgPSAoQllURSopRnJlZUltYWdlX0dldEJpdHMoZGliKTsKKwlmb3IoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworCQlGSVJHQkYgKnBpeGVsID0gKEZJUkdCRiopYml0czsKKwkJZm9yKHggPSBtYXhfd2lkdGg7IHggPCB3aWR0aDsgeCsrKSB7CisJCQlkb3VibGUgWXcgPSBwaXhlbFt4XS5yZWQgLyBhdmdMdW07CisJCQlZdyAqPSBleHBvc3VyZTsKKwkJCWludGVycG9sID0gbG9nKDIgKyBiaWFzRnVuY3Rpb24oYmlhc1AsIFl3IC8gTG1heCkgKiA4KTsKKwkJCUwgPSBwYWRlX2xvZyhZdyk7Ly8gbG9nKFl3ICsgMSkKKwkJCXBpeGVsW3hdLnJlZCA9IChmbG9hdCkoKEwgLyBpbnRlcnBvbCkgLyBkaXZpZGVyKTsKKwkJfQorCQkvLyBuZXh0IGxpbmUKKwkJYml0cyArPSBwaXRjaDsKKwl9CisJLy8gYm90dG9tIGJhbmQKKwliaXRzID0gKEJZVEUqKUZyZWVJbWFnZV9HZXRCaXRzKGRpYik7CisJZm9yKHkgPSBtYXhfaGVpZ2h0OyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJRklSR0JGICpwaXhlbCA9IChGSVJHQkYqKWJpdHM7CisJCWZvcih4ID0gMDsgeCA8IG1heF93aWR0aDsgeCsrKSB7CisJCQlkb3VibGUgWXcgPSBwaXhlbFt4XS5yZWQgLyBhdmdMdW07CisJCQlZdyAqPSBleHBvc3VyZTsKKwkJCWludGVycG9sID0gbG9nKDIgKyBiaWFzRnVuY3Rpb24oYmlhc1AsIFl3IC8gTG1heCkgKiA4KTsKKwkJCUwgPSBwYWRlX2xvZyhZdyk7Ly8gbG9nKFl3ICsgMSkKKwkJCXBpeGVsW3hdLnJlZCA9IChmbG9hdCkoKEwgLyBpbnRlcnBvbCkgLyBkaXZpZGVyKTsKKwkJfQorCQkvLyBuZXh0IGxpbmUKKwkJYml0cyArPSBwaXRjaDsKKwl9CisKKyNlbmRpZgkvLyBEUkFHTzAzX0ZBU1QKKworCXJldHVybiBUUlVFOworfQorCisvKioKK0N1c3RvbSBnYW1tYSBjb3JyZWN0aW9uIGJhc2VkIG9uIHRoZSBJVFUtUiBCVC43MDkgc3RhbmRhcmQKK0BwYXJhbSBkaWIgUkdCRiBpbWFnZSB0byBiZSBjb3JyZWN0ZWQKK0BwYXJhbSBnYW1tYXZhbCBHYW1tYSB2YWx1ZSAoMi4yIGlzIGEgZ29vZCBkZWZhdWx0IHZhbHVlKQorQHJldHVybiBSZXR1cm5zIFRSVUUgaWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyBGQUxTRSBvdGhlcndpc2UKKyovCitzdGF0aWMgQk9PTCAKK1JFQzcwOUdhbW1hQ29ycmVjdGlvbihGSUJJVE1BUCAqZGliLCBjb25zdCBmbG9hdCBnYW1tYXZhbCkgeworCWlmKEZyZWVJbWFnZV9HZXRJbWFnZVR5cGUoZGliKSAhPSBGSVRfUkdCRikKKwkJcmV0dXJuIEZBTFNFOworCisJZmxvYXQgc2xvcGUgPSA0LjVGOworCWZsb2F0IHN0YXJ0ID0gMC4wMThGOworCQorCWNvbnN0IGZsb2F0IGZnYW1tYSA9IChmbG9hdCkoKDAuNDUgLyBnYW1tYXZhbCkgKiAyKTsKKwlpZihnYW1tYXZhbCA+PSAyLjFGKSB7CisJCXN0YXJ0ID0gKGZsb2F0KSgwLjAxOCAvICgoZ2FtbWF2YWwgLSAyKSAqIDcuNSkpOworCQlzbG9wZSA9IChmbG9hdCkoNC41ICogKChnYW1tYXZhbCAtIDIpICogNy41KSk7CisJfSBlbHNlIGlmIChnYW1tYXZhbCA8PSAxLjlGKSB7CisJCXN0YXJ0ID0gKGZsb2F0KSgwLjAxOCAqICgoMiAtIGdhbW1hdmFsKSAqIDcuNSkpOworCQlzbG9wZSA9IChmbG9hdCkoNC41IC8gKCgyIC0gZ2FtbWF2YWwpICogNy41KSk7CisJfQorCisJY29uc3QgdW5zaWduZWQgd2lkdGggID0gRnJlZUltYWdlX0dldFdpZHRoKGRpYik7CisJY29uc3QgdW5zaWduZWQgaGVpZ2h0ID0gRnJlZUltYWdlX0dldEhlaWdodChkaWIpOworCWNvbnN0IHVuc2lnbmVkIHBpdGNoICA9IEZyZWVJbWFnZV9HZXRQaXRjaChkaWIpOworCisJQllURSAqYml0cyA9IChCWVRFKilGcmVlSW1hZ2VfR2V0Qml0cyhkaWIpOworCWZvcih1bnNpZ25lZCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisJCWZsb2F0ICpwaXhlbCA9IChmbG9hdCopYml0czsKKwkJZm9yKHVuc2lnbmVkIHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworCQkJZm9yKGludCBpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAqcGl4ZWwgPSAoKnBpeGVsIDw9IHN0YXJ0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAqcGl4ZWwgKiBzbG9wZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoMS4wOTlGICogc3RkOjpwb3coKnBpeGVsLCBmZ2FtbWEpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDk5Rik7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisJCX0KKwkJYml0cyArPSBwaXRjaDsKKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIE1haW4gYWxnb3JpdGhtCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qKgorQXBwbHkgdGhlIEFkYXB0aXZlIExvZ2FyaXRobWljIE1hcHBpbmcgb3BlcmF0b3IgdG8gYSBIRFIgaW1hZ2UgYW5kIGNvbnZlcnQgdG8gMjQtYml0IFJHQgorQHBhcmFtIHNyYyBJbnB1dCBSR0IxNiBvciBSR0JbQV1GIGltYWdlCitAcGFyYW0gZ2FtbWEgR2FtbWEgY29ycmVjdGlvbiAoZ2FtbWEgPiAwKS4gMSBtZWFucyBubyBjb3JyZWN0aW9uLCAyLjIgaW4gdGhlIG9yaWdpbmFsIHBhcGVyLgorQHBhcmFtIGV4cG9zdXJlIEV4cG9zdXJlIHBhcmFtZXRlciAoMCBtZWFucyBubyBjb3JyZWN0aW9uLCAwIGluIHRoZSBvcmlnaW5hbCBwYXBlcikKK0ByZXR1cm4gUmV0dXJucyBhIDI0LWJpdCBSR0IgaW1hZ2UgaWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyBOVUxMIG90aGVyd2lzZQorKi8KK0ZJQklUTUFQKiBETExfQ0FMTENPTlYgCitGcmVlSW1hZ2VfVG1vRHJhZ28wMyhGSUJJVE1BUCAqc3JjLCBkb3VibGUgZ2FtbWEsIGRvdWJsZSBleHBvc3VyZSkgeworCWZsb2F0IG1heEx1bSwgbWluTHVtLCBhdmdMdW07CisKKwlpZighRnJlZUltYWdlX0hhc1BpeGVscyhzcmMpKSByZXR1cm4gTlVMTDsKKworCS8vIHdvcmtpbmcgUkdCRiB2YXJpYWJsZQorCUZJQklUTUFQICpkaWIgPSBOVUxMOworCisJZGliID0gRnJlZUltYWdlX0NvbnZlcnRUb1JHQkYoc3JjKTsKKwlpZighZGliKSByZXR1cm4gTlVMTDsKKworCS8vIGRlZmF1bHQgYWxnb3JpdGhtIHBhcmFtZXRlcnMKKwljb25zdCBmbG9hdCBiaWFzUGFyYW0gPSAwLjg1RjsKKwljb25zdCBmbG9hdCBleHBvUGFyYW0gPSAoZmxvYXQpcG93KDIuMCwgZXhwb3N1cmUpOyAvL2RlZmF1bHQgZXhwb3N1cmUgaXMgMSwgMl4wCisKKwkvLyBjb252ZXJ0IHRvIFl4eQorCUNvbnZlcnRJblBsYWNlUkdCRlRvWXh5KGRpYik7CisJLy8gZ2V0IHRoZSBsdW1pbmFuY2UKKwlMdW1pbmFuY2VGcm9tWXh5KGRpYiwgJm1heEx1bSwgJm1pbkx1bSwgJmF2Z0x1bSk7CisJLy8gcGVyZm9ybSB0aGUgdG9uZSBtYXBwaW5nCisJVG9uZU1hcHBpbmdEcmFnbzAzKGRpYiwgbWF4THVtLCBhdmdMdW0sIGJpYXNQYXJhbSwgZXhwb1BhcmFtKTsKKwkvLyBjb252ZXJ0IGJhY2sgdG8gUkdCRgorCUNvbnZlcnRJblBsYWNlWXh5VG9SR0JGKGRpYik7CisJaWYoZ2FtbWEgIT0gMSkgeworCQkvLyBwZXJmb3JtIGdhbW1hIGNvcnJlY3Rpb24KKwkJUkVDNzA5R2FtbWFDb3JyZWN0aW9uKGRpYiwgKGZsb2F0KWdhbW1hKTsKKwl9CisJLy8gY2xhbXAgaW1hZ2UgaGlnaGVzdCB2YWx1ZXMgdG8gZGlzcGxheSB3aGl0ZSwgdGhlbiBjb252ZXJ0IHRvIDI0LWJpdCBSR0IKKwlGSUJJVE1BUCAqZHN0ID0gQ2xhbXBDb252ZXJ0UkdCRlRvMjQoZGliKTsKKworCS8vIGNsZWFuLXVwIGFuZCByZXR1cm4KKwlGcmVlSW1hZ2VfVW5sb2FkKGRpYik7CisKKwkvLyBjb3B5IG1ldGFkYXRhIGZyb20gc3JjIHRvIGRzdAorCUZyZWVJbWFnZV9DbG9uZU1ldGFkYXRhKGRzdCwgc3JjKTsKKwkKKwlyZXR1cm4gZHN0OworfQpkaWZmIC0tZ2l0IGEvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS90bW9GYXR0YWwwMi5jcHAgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlL3Rtb0ZhdHRhbDAyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2E1OTE3Ci0tLSAvZGV2L251bGwKKysrIGIvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS90bW9GYXR0YWwwMi5jcHAKQEAgLTAsMCArMSw2OTUgQEAKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFRvbmUgbWFwcGluZyBvcGVyYXRvciAoRmF0dGFsLCAyMDAyKQorLy8KKy8vIERlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gYnkKKy8vIC0gSGVydukgRHJvbG9uIChkcm9sb25AaW5mb25pZS5mcikKKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBGcmVlSW1hZ2UgMworLy8KKy8vIENPVkVSRUQgQ09ERSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWQorLy8gT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMKKy8vIFRIQVQgVEhFIENPVkVSRUQgQ09ERSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLy8gT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQKKy8vIENPREUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkgQ09WRVJFRCBDT0RFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QKKy8vIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZCisvLyBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMCisvLyBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GIEFOWSBDT1ZFUkVEIENPREUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSCisvLyBUSElTIERJU0NMQUlNRVIuCisvLworLy8gVXNlIGF0IHlvdXIgb3duIHJpc2shCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpbmNsdWRlIDxjbWF0aD4KKworI2luY2x1ZGUgIkZyZWVJbWFnZS5oIgorI2luY2x1ZGUgIlV0aWxpdGllcy5oIgorI2luY2x1ZGUgIlRvbmVNYXBwaW5nLmgiCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEdyYWRpZW50IGRvbWFpbiBIRFIgY29tcHJlc3Npb24KKy8vIFJlZmVyZW5jZToKKy8vIFsxXSBSLiBGYXR0YWwsIEQuIExpc2NoaW5za2ksIGFuZCBNLldlcm1hbiwgCisvLyBHcmFkaWVudCBkb21haW4gaGlnaCBkeW5hbWljIHJhbmdlIGNvbXByZXNzaW9uLAorLy8gQUNNIFRyYW5zYWN0aW9ucyBvbiBHcmFwaGljcywgc3BlY2lhbCBpc3N1ZSBvbiBQcm9jLiBvZiBBQ00gU0lHR1JBUEggMjAwMiwgCisvLyBTYW4gQW50b25pbywgVGV4YXMsIHZvbC4gMjEoMyksIHBwLiAyNTctMjY2LCAyMDAyLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgY29uc3QgZmxvYXQgRVBTSUxPTiA9IDFlLTRGOworCisvKioKK1BlcmZvcm1zIGEgNSBieSA1IGdhdXNzaWFuIGZpbHRlcmluZyB1c2luZyB0d28gMUQgY29udm9sdXRpb25zLCAKK2ZvbGxvd2VkIGJ5IGEgc3Vic2FtcGxpbmcgYnkgMi4gCitAcGFyYW0gZGliIElucHV0IGltYWdlCitAcmV0dXJuIFJldHVybnMgYSBibHVycmVkIGltYWdlIG9mIHNpemUgU0laRShkaWIpLzIKK0BzZWUgR2F1c3NpYW5QeXJhbWlkCisqLworc3RhdGljIEZJQklUTUFQKiBHYXVzc2lhbkxldmVsNXg1KEZJQklUTUFQICpkaWIpIHsKKwlGSUJJVE1BUCAqaF9kaWIgPSBOVUxMLCAqdl9kaWIgPSBOVUxMLCAqZHN0ID0gTlVMTDsKKwlmbG9hdCAqc3JjX3BpeGVsLCAqZHN0X3BpeGVsOworCisJdHJ5IHsKKwkJY29uc3QgRlJFRV9JTUFHRV9UWVBFIGltYWdlX3R5cGUgPSBGcmVlSW1hZ2VfR2V0SW1hZ2VUeXBlKGRpYik7CisJCWlmKGltYWdlX3R5cGUgIT0gRklUX0ZMT0FUKSB0aHJvdygxKTsKKworCQljb25zdCB1bnNpZ25lZCB3aWR0aCA9IEZyZWVJbWFnZV9HZXRXaWR0aChkaWIpOworCQljb25zdCB1bnNpZ25lZCBoZWlnaHQgPSBGcmVlSW1hZ2VfR2V0SGVpZ2h0KGRpYik7CisKKwkJaF9kaWIgPSBGcmVlSW1hZ2VfQWxsb2NhdGVUKGltYWdlX3R5cGUsIHdpZHRoLCBoZWlnaHQpOworCQl2X2RpYiA9IEZyZWVJbWFnZV9BbGxvY2F0ZVQoaW1hZ2VfdHlwZSwgd2lkdGgsIGhlaWdodCk7CisJCWlmKCFoX2RpYiB8fCAhdl9kaWIpIHRocm93KDEpOworCisJCWNvbnN0IHVuc2lnbmVkIHBpdGNoID0gRnJlZUltYWdlX0dldFBpdGNoKGRpYikgLyBzaXplb2YoZmxvYXQpOworCisJCS8vIGhvcml6b250YWwgY29udm9sdXRpb24gZGliIC0+IGhfZGliCisKKwkJc3JjX3BpeGVsID0gKGZsb2F0KilGcmVlSW1hZ2VfR2V0Qml0cyhkaWIpOworCQlkc3RfcGl4ZWwgPSAoZmxvYXQqKUZyZWVJbWFnZV9HZXRCaXRzKGhfZGliKTsKKworCQlmb3IodW5zaWduZWQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworCQkJLy8gd29yayBvbiBsaW5lIHkKKwkJCWZvcih1bnNpZ25lZCB4ID0gMjsgeCA8IHdpZHRoIC0gMjsgeCsrKSB7CisJCQkJZHN0X3BpeGVsW3hdID0gc3JjX3BpeGVsW3gtMl0gKyBzcmNfcGl4ZWxbeCsyXSArIDQgKiAoc3JjX3BpeGVsW3gtMV0gKyBzcmNfcGl4ZWxbeCsxXSkgKyA2ICogc3JjX3BpeGVsW3hdOworCQkJCWRzdF9waXhlbFt4XSAvPSAxNjsKKwkJCX0KKwkJCS8vIGJvdW5kYXJ5IG1pcnJvcmluZworCQkJZHN0X3BpeGVsWzBdID0gKDIgKiBzcmNfcGl4ZWxbMl0gKyA4ICogc3JjX3BpeGVsWzFdICsgNiAqIHNyY19waXhlbFswXSkgLyAxNjsKKwkJCWRzdF9waXhlbFsxXSA9IChzcmNfcGl4ZWxbM10gKyA0ICogKHNyY19waXhlbFswXSArIHNyY19waXhlbFsyXSkgKyA3ICogc3JjX3BpeGVsWzFdKSAvIDE2OworCQkJZHN0X3BpeGVsW3dpZHRoLTJdID0gKHNyY19waXhlbFt3aWR0aC00XSArIDUgKiBzcmNfcGl4ZWxbd2lkdGgtMV0gKyA0ICogc3JjX3BpeGVsW3dpZHRoLTNdICsgNiAqIHNyY19waXhlbFt3aWR0aC0yXSkgLyAxNjsKKwkJCWRzdF9waXhlbFt3aWR0aC0xXSA9IChzcmNfcGl4ZWxbd2lkdGgtM10gKyA1ICogc3JjX3BpeGVsW3dpZHRoLTJdICsgMTAgKiBzcmNfcGl4ZWxbd2lkdGgtMV0pIC8gMTY7CisKKwkJCS8vIG5leHQgbGluZQorCQkJc3JjX3BpeGVsICs9IHBpdGNoOworCQkJZHN0X3BpeGVsICs9IHBpdGNoOworCQl9CisKKwkJLy8gdmVydGljYWwgY29udm9sdXRpb24gaF9kaWIgLT4gdl9kaWIKKworCQlzcmNfcGl4ZWwgPSAoZmxvYXQqKUZyZWVJbWFnZV9HZXRCaXRzKGhfZGliKTsKKwkJZHN0X3BpeGVsID0gKGZsb2F0KilGcmVlSW1hZ2VfR2V0Qml0cyh2X2RpYik7CisKKwkJZm9yKHVuc2lnbmVkIHggPSAwOyB4IDwgd2lkdGg7IHgrKykgewkJCisJCQkvLyB3b3JrIG9uIGNvbHVtbiB4CisJCQlmb3IodW5zaWduZWQgeSA9IDI7IHkgPCBoZWlnaHQgLSAyOyB5KyspIHsKKwkJCQljb25zdCB1bnNpZ25lZCBpbmRleCA9IHkqcGl0Y2ggKyB4OworCQkJCWRzdF9waXhlbFtpbmRleF0gPSBzcmNfcGl4ZWxbaW5kZXgtMipwaXRjaF0gKyBzcmNfcGl4ZWxbaW5kZXgrMipwaXRjaF0gKyA0ICogKHNyY19waXhlbFtpbmRleC1waXRjaF0gKyBzcmNfcGl4ZWxbaW5kZXgrcGl0Y2hdKSArIDYgKiBzcmNfcGl4ZWxbaW5kZXhdOworCQkJCWRzdF9waXhlbFtpbmRleF0gLz0gMTY7CisJCQl9CisJCQkvLyBib3VuZGFyeSBtaXJyb3JpbmcKKwkJCWRzdF9waXhlbFt4XSA9ICgyICogc3JjX3BpeGVsW3grMipwaXRjaF0gKyA4ICogc3JjX3BpeGVsW3grcGl0Y2hdICsgNiAqIHNyY19waXhlbFt4XSkgLyAxNjsKKwkJCWRzdF9waXhlbFt4K3BpdGNoXSA9IChzcmNfcGl4ZWxbeCszKnBpdGNoXSArIDQgKiAoc3JjX3BpeGVsW3hdICsgc3JjX3BpeGVsW3grMipwaXRjaF0pICsgNyAqIHNyY19waXhlbFt4K3BpdGNoXSkgLyAxNjsKKwkJCWRzdF9waXhlbFsoaGVpZ2h0LTIpKnBpdGNoK3hdID0gKHNyY19waXhlbFsoaGVpZ2h0LTQpKnBpdGNoK3hdICsgNSAqIHNyY19waXhlbFsoaGVpZ2h0LTEpKnBpdGNoK3hdICsgNCAqIHNyY19waXhlbFsoaGVpZ2h0LTMpKnBpdGNoK3hdICsgNiAqIHNyY19waXhlbFsoaGVpZ2h0LTIpKnBpdGNoK3hdKSAvIDE2OworCQkJZHN0X3BpeGVsWyhoZWlnaHQtMSkqcGl0Y2greF0gPSAoc3JjX3BpeGVsWyhoZWlnaHQtMykqcGl0Y2greF0gKyA1ICogc3JjX3BpeGVsWyhoZWlnaHQtMikqcGl0Y2greF0gKyAxMCAqIHNyY19waXhlbFsoaGVpZ2h0LTEpKnBpdGNoK3hdKSAvIDE2OworCQl9CisKKwkJRnJlZUltYWdlX1VubG9hZChoX2RpYik7IGhfZGliID0gTlVMTDsKKworCQkvLyBwZXJmb3JtIGRvd25zYW1wbGluZworCisJCWRzdCA9IEZyZWVJbWFnZV9SZXNjYWxlKHZfZGliLCB3aWR0aC8yLCBoZWlnaHQvMiwgRklMVEVSX0JJTElORUFSKTsKKworCQlGcmVlSW1hZ2VfVW5sb2FkKHZfZGliKTsKKworCQlyZXR1cm4gZHN0OworCisJfSBjYXRjaChpbnQpIHsKKwkJaWYoaF9kaWIpIEZyZWVJbWFnZV9VbmxvYWQoaF9kaWIpOworCQlpZih2X2RpYikgRnJlZUltYWdlX1VubG9hZCh2X2RpYik7CisJCWlmKGRzdCkgRnJlZUltYWdlX1VubG9hZChkc3QpOworCQlyZXR1cm4gTlVMTDsKKwl9Cit9CisKKy8qKgorQ29tcHV0ZSBhIEdhdXNzaWFuIHB5cmFtaWQgdXNpbmcgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbGV2ZWxzLiAKK0BwYXJhbSBIIE9yaWdpbmFsIGJpdG1hcAorQHBhcmFtIHB5cmFtaWQgUmVzdWx0aW5nIHB5cmFtaWQgYXJyYXkgCitAcGFyYW0gbmxldmVscyBOdW1iZXIgb2YgcmVzb2x1dGlvbiBsZXZlbHMKK0ByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgRkFMU0Ugb3RoZXJ3aXNlCisqLworc3RhdGljIEJPT0wgR2F1c3NpYW5QeXJhbWlkKEZJQklUTUFQICpILCBGSUJJVE1BUCAqKnB5cmFtaWQsIGludCBubGV2ZWxzKSB7CisJdHJ5IHsKKwkJLy8gZmlyc3QgbGV2ZWwgaXMgdGhlIG9yaWdpbmFsIGltYWdlCisJCXB5cmFtaWRbMF0gPSBGcmVlSW1hZ2VfQ2xvbmUoSCk7CisJCWlmKHB5cmFtaWRbMF0gPT0gTlVMTCkgdGhyb3coMSk7CisJCS8vIGNvbXB1dGUgbmV4dCBsZXZlbHMKKwkJZm9yKGludCBrID0gMTsgayA8IG5sZXZlbHM7IGsrKykgeworCQkJcHlyYW1pZFtrXSA9IEdhdXNzaWFuTGV2ZWw1eDUocHlyYW1pZFtrLTFdKTsKKwkJCWlmKHB5cmFtaWRba10gPT0gTlVMTCkgdGhyb3coMSk7CisJCX0KKwkJcmV0dXJuIFRSVUU7CisJfSBjYXRjaChpbnQpIHsKKwkJZm9yKGludCBrID0gMDsgayA8IG5sZXZlbHM7IGsrKykgeworCQkJaWYocHlyYW1pZFtrXSAhPSBOVUxMKSB7CisJCQkJRnJlZUltYWdlX1VubG9hZChweXJhbWlkW2tdKTsKKwkJCQlweXJhbWlkW2tdID0gTlVMTDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gRkFMU0U7CisJfQorfQorCisvKioKK0NvbXB1dGUgdGhlIGdyYWRpZW50IG1hZ25pdHVkZSBvZiBhbiBpbnB1dCBpbWFnZSBIIHVzaW5nIGNlbnRyYWwgZGlmZmVyZW5jZXMsIAorYW5kIHJldHVybnMgdGhlIGF2ZXJhZ2UgZ3JhZGllbnQuIAorQHBhcmFtIEggSW5wdXQgaW1hZ2UKK0BwYXJhbSBhdmdHcmFkIFtvdXRdIEF2ZXJhZ2UgZ3JhZGllbnQKK0BwYXJhbSBrIExldmVsIG51bWJlcgorQHJldHVybiBSZXR1cm5zIHRoZSBncmFkaWVudCBtYWduaXR1ZGUgaWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyBOVUxMIG90aGVyd2lzZQorQHNlZSBHcmFkaWVudFB5cmFtaWQKKyovCitzdGF0aWMgRklCSVRNQVAqIEdyYWRpZW50TGV2ZWwoRklCSVRNQVAgKkgsIGZsb2F0ICphdmdHcmFkLCBpbnQgaykgeworCUZJQklUTUFQICpHID0gTlVMTDsKKworCXRyeSB7CisJCWNvbnN0IEZSRUVfSU1BR0VfVFlQRSBpbWFnZV90eXBlID0gRnJlZUltYWdlX0dldEltYWdlVHlwZShIKTsKKwkJaWYoaW1hZ2VfdHlwZSAhPSBGSVRfRkxPQVQpIHRocm93KDEpOworCisJCWNvbnN0IHVuc2lnbmVkIHdpZHRoID0gRnJlZUltYWdlX0dldFdpZHRoKEgpOworCQljb25zdCB1bnNpZ25lZCBoZWlnaHQgPSBGcmVlSW1hZ2VfR2V0SGVpZ2h0KEgpOworCisJCUcgPSBGcmVlSW1hZ2VfQWxsb2NhdGVUKGltYWdlX3R5cGUsIHdpZHRoLCBoZWlnaHQpOworCQlpZighRykgdGhyb3coMSk7CisJCQorCQljb25zdCB1bnNpZ25lZCBwaXRjaCA9IEZyZWVJbWFnZV9HZXRQaXRjaChIKSAvIHNpemVvZihmbG9hdCk7CisJCQorCQljb25zdCBmbG9hdCBkaXZpZGVyID0gKGZsb2F0KSgxIDw8IChrICsgMSkpOworCQlmbG9hdCBhdmVyYWdlID0gMDsKKwkJCisJCWZsb2F0ICpzcmNfcGl4ZWwgPSAoZmxvYXQqKUZyZWVJbWFnZV9HZXRCaXRzKEgpOworCQlmbG9hdCAqZHN0X3BpeGVsID0gKGZsb2F0KilGcmVlSW1hZ2VfR2V0Qml0cyhHKTsKKworCQlmb3IodW5zaWduZWQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworCQkJY29uc3QgdW5zaWduZWQgbiA9ICh5ID09IDAgPyAwIDogeS0xKTsKKwkJCWNvbnN0IHVuc2lnbmVkIHMgPSAoeSsxID09IGhlaWdodCA/IHkgOiB5KzEpOworCQkJZm9yKHVuc2lnbmVkIHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworCQkJCWNvbnN0IHVuc2lnbmVkIHcgPSAoeCA9PSAwID8gMCA6IHgtMSk7CisJCQkJY29uc3QgdW5zaWduZWQgZSA9ICh4KzEgPT0gd2lkdGggPyB4IDogeCsxKTsJCQorCQkJCS8vIGNlbnRyYWwgZGlmZmVyZW5jZQorCQkJCWNvbnN0IGZsb2F0IGd4ID0gKHNyY19waXhlbFt5KnBpdGNoK2VdIC0gc3JjX3BpeGVsW3kqcGl0Y2grd10pIC8gZGl2aWRlcjsgLy8gW0hrKHgrMSwgeSkgLSBIayh4LTEsIHkpXSAvIDIqKihrKzEpCisJCQkJY29uc3QgZmxvYXQgZ3kgPSAoc3JjX3BpeGVsW3MqcGl0Y2greF0gLSBzcmNfcGl4ZWxbbipwaXRjaCt4XSkgLyBkaXZpZGVyOyAvLyBbSGsoeCwgeSsxKSAtIEhrKHgsIHktMSldIC8gMioqKGsrMSkKKwkJCQkvLyBncmFkaWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfcGl4ZWxbeF0gPSBzdGQ6OnNxcnQoZ3ggKiBneCArIGd5ICogZ3kpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdmVyYWdlIGdyYWRpZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZXJhZ2UgKz0gZHN0X3BpeGVsW3hdOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCQkJLy8gbmV4dCBsaW5lCisJCQlkc3RfcGl4ZWwgKz0gcGl0Y2g7CisJCX0KKwkJCisJCSphdmdHcmFkID0gYXZlcmFnZSAvICh3aWR0aCAqIGhlaWdodCk7CisKKwkJcmV0dXJuIEc7CisKKwl9IGNhdGNoKGludCkgeworCQlpZihHKSBGcmVlSW1hZ2VfVW5sb2FkKEcpOworCQlyZXR1cm4gTlVMTDsKKwl9Cit9CisKKy8qKgorQ2FsY3VsYXRlIGdyYWRpZW50IG1hZ25pdHVkZSBhbmQgaXRzIGF2ZXJhZ2UgdmFsdWUgb24gZWFjaCBweXJhbWlkIGxldmVsCitAcGFyYW0gcHlyYW1pZCBHYXVzc2lhbiBweXJhbWlkIChubGV2ZWxzIGxldmVscykKK0BwYXJhbSBubGV2ZWxzIE51bWJlciBvZiBsZXZlbHMKK0BwYXJhbSBncmFkaWVudHMgW291dF0gR3JhZGllbnQgcHlyYW1pZCAobmxldmVscyBsZXZlbHMpCitAcGFyYW0gYXZnR3JhZCBbb3V0XSBBdmVyYWdlIGdyYWRpZW50IG9uIGVhY2ggbGV2ZWwgKGFycmF5IG9mIHNpemUgbmxldmVscykKK0ByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgRkFMU0Ugb3RoZXJ3aXNlCisqLworc3RhdGljIEJPT0wgR3JhZGllbnRQeXJhbWlkKEZJQklUTUFQICoqcHlyYW1pZCwgaW50IG5sZXZlbHMsIEZJQklUTUFQICoqZ3JhZGllbnRzLCBmbG9hdCAqYXZnR3JhZCkgeworCXRyeSB7CisJCWZvcihpbnQgayA9IDA7IGsgPCBubGV2ZWxzOyBrKyspIHsKKwkJCUZJQklUTUFQICpIayA9IHB5cmFtaWRba107CisJCQlncmFkaWVudHNba10gPSBHcmFkaWVudExldmVsKEhrLCAmYXZnR3JhZFtrXSwgayk7CisJCQlpZihncmFkaWVudHNba10gPT0gTlVMTCkgdGhyb3coMSk7CisJCX0KKwkJcmV0dXJuIFRSVUU7CisJfSBjYXRjaChpbnQpIHsKKwkJZm9yKGludCBrID0gMDsgayA8IG5sZXZlbHM7IGsrKykgeworCQkJaWYoZ3JhZGllbnRzW2tdICE9IE5VTEwpIHsKKwkJCQlGcmVlSW1hZ2VfVW5sb2FkKGdyYWRpZW50c1trXSk7CisJCQkJZ3JhZGllbnRzW2tdID0gTlVMTDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gRkFMU0U7CisJfQorfQorCisvKioKK0NvbXB1dGUgdGhlIGdyYWRpZW50IGF0dGVudWF0aW9uIGZ1bmN0aW9uIFBISSh4LCB5KQorQHBhcmFtIGdyYWRpZW50cyBHcmFkaWVudCBweXJhbWlkIChubGV2ZWxzIGxldmVscykKK0BwYXJhbSBhdmdHcmFkIEF2ZXJhZ2UgZ3JhZGllbnQgb24gZWFjaCBsZXZlbCAoYXJyYXkgb2Ygc2l6ZSBubGV2ZWxzKQorQHBhcmFtIG5sZXZlbHMgTnVtYmVyIG9mIGxldmVscworQHBhcmFtIGFscGhhIFBhcmFtZXRlciBhbHBoYSBpbiB0aGUgcGFwZXIKK0BwYXJhbSBiZXRhIFBhcmFtZXRlciBiZXRhIGluIHRoZSBwYXBlcgorQHJldHVybiBSZXR1cm5zIHRoZSBhdHRlbnVhdGlvbiBtYXRyaXggUGhpIGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgTlVMTCBvdGhlcndpc2UKKyovCitzdGF0aWMgRklCSVRNQVAqIFBoaU1hdHJpeChGSUJJVE1BUCAqKmdyYWRpZW50cywgZmxvYXQgKmF2Z0dyYWQsIGludCBubGV2ZWxzLCBmbG9hdCBhbHBoYSwgZmxvYXQgYmV0YSkgeworCWZsb2F0ICpzcmNfcGl4ZWwsICpkc3RfcGl4ZWw7CisJRklCSVRNQVAgKipwaGkgPSBOVUxMOworCisJdHJ5IHsKKwkJcGhpID0gKEZJQklUTUFQKiopbWFsbG9jKG5sZXZlbHMgKiBzaXplb2YoRklCSVRNQVAqKSk7CisJCWlmKCFwaGkpIHRocm93KDEpOworCQltZW1zZXQocGhpLCAwLCBubGV2ZWxzICogc2l6ZW9mKEZJQklUTUFQKikpOworCisJCWZvcihpbnQgayA9IG5sZXZlbHMtMTsgayA+PSAwOyBrLS0pIHsKKwkJCS8vIGNvbXB1dGUgcGhpKGspCisKKwkJCUZJQklUTUFQICpHayA9IGdyYWRpZW50c1trXTsKKworCQkJY29uc3QgdW5zaWduZWQgd2lkdGggPSBGcmVlSW1hZ2VfR2V0V2lkdGgoR2spOworCQkJY29uc3QgdW5zaWduZWQgaGVpZ2h0ID0gRnJlZUltYWdlX0dldEhlaWdodChHayk7CisJCQljb25zdCB1bnNpZ25lZCBwaXRjaCA9IEZyZWVJbWFnZV9HZXRQaXRjaChHaykgLyBzaXplb2YoZmxvYXQpOworCisJCQkvLyBwYXJhbWV0ZXIgYWxwaGEgaXMgMC4xIHRpbWVzIHRoZSBhdmVyYWdlIGdyYWRpZW50IG1hZ25pdHVkZQorCQkJLy8gYWxzbywgbm90ZSB0aGUgZmFjdG9yIG9mIDIqKmsgaW4gdGhlIGRlbm9taW5hdG9yOyAKKwkJCS8vIHRoYXQgaXMgdGhlcmUgdG8gY29ycmVjdCBmb3IgdGhlIGZhY3QgdGhhdCBhbiBhdmVyYWdlIGdyYWRpZW50IGF2Z0dyYWQoSCkgb3ZlciAyKiprIHBpeGVscyAKKwkJCS8vIGluIHRoZSBvcmlnaW5hbCBpbWFnZSB3aWxsIGFwcGVhciBhcyBhIGdyYWRpZW50IGdyYWQoSGspID0gMioqayphdmdHcmFkKEgpIG92ZXIgYSBzaW5nbGUgcGl4ZWwgaW4gSGsuIAorCQkJZmxvYXQgQUxQSEEgPSAgYWxwaGEgKiBhdmdHcmFkW2tdICogKGZsb2F0KSgoaW50KTEgPDwgayk7CisJCQlpZihBTFBIQSA9PSAwKSBBTFBIQSA9IEVQU0lMT047CisKKwkJCXBoaVtrXSA9IEZyZWVJbWFnZV9BbGxvY2F0ZVQoRklUX0ZMT0FULCB3aWR0aCwgaGVpZ2h0KTsKKwkJCWlmKCFwaGlba10pIHRocm93KDEpOworCQkJCisJCQlzcmNfcGl4ZWwgPSAoZmxvYXQqKUZyZWVJbWFnZV9HZXRCaXRzKEdrKTsKKwkJCWRzdF9waXhlbCA9IChmbG9hdCopRnJlZUltYWdlX0dldEJpdHMocGhpW2tdKTsKKwkJCWZvcih1bnNpZ25lZCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisJCQkJZm9yKHVuc2lnbmVkIHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworCQkJCQkvLyBjb21wdXRlIChhbHBoYSAvIGdyYWQpICogKGdyYWQgLyBhbHBoYSkgKiogYmV0YQorCQkJCQljb25zdCBmbG9hdCB2ID0gc3JjX3BpeGVsW3hdIC8gQUxQSEE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgdmFsdWUgPSAoZmxvYXQpc3RkOjpwb3coCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCl2LCAoZmxvYXQpKGJldGEgLSAxKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3BpeGVsW3hdID0gKHZhbHVlID4gMSkgPyAxIDogdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKwkJCQkvLyBuZXh0IGxpbmUKKwkJCQlzcmNfcGl4ZWwgKz0gcGl0Y2g7CisJCQkJZHN0X3BpeGVsICs9IHBpdGNoOworCQkJfQorCisJCQlpZihrIDwgbmxldmVscy0xKSB7CisJCQkJLy8gY29tcHV0ZSBQSEkoaykgPSBMKCBQSEkoaysxKSApICogcGhpKGspCisJCQkJRklCSVRNQVAgKkwgPSBGcmVlSW1hZ2VfUmVzY2FsZShwaGlbaysxXSwgd2lkdGgsIGhlaWdodCwgRklMVEVSX0JJTElORUFSKTsKKwkJCQlpZighTCkgdGhyb3coMSk7CisKKwkJCQlzcmNfcGl4ZWwgPSAoZmxvYXQqKUZyZWVJbWFnZV9HZXRCaXRzKEwpOworCQkJCWRzdF9waXhlbCA9IChmbG9hdCopRnJlZUltYWdlX0dldEJpdHMocGhpW2tdKTsKKwkJCQlmb3IodW5zaWduZWQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworCQkJCQlmb3IodW5zaWduZWQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisJCQkJCQlkc3RfcGl4ZWxbeF0gKj0gc3JjX3BpeGVsW3hdOworCQkJCQl9CisJCQkJCS8vIG5leHQgbGluZQorCQkJCQlzcmNfcGl4ZWwgKz0gcGl0Y2g7CisJCQkJCWRzdF9waXhlbCArPSBwaXRjaDsKKwkJCQl9CisKKwkJCQlGcmVlSW1hZ2VfVW5sb2FkKEwpOworCisJCQkJLy8gUEhJKGsrMSkgaXMgbm8gbG9uZ2VyIG5lZWRlZAorCQkJCUZyZWVJbWFnZV9VbmxvYWQocGhpW2srMV0pOworCQkJCXBoaVtrKzFdID0gTlVMTDsKKwkJCX0KKworCQkJLy8gbmV4dCBsZXZlbAorCQl9CisKKwkJLy8gZ2V0IHRoZSBmaW5hbCByZXN1bHQgYW5kIHJldHVybgorCQlGSUJJVE1BUCAqZHN0ID0gcGhpWzBdOworCisJCWZyZWUocGhpKTsKKworCQlyZXR1cm4gZHN0OworCisJfSBjYXRjaChpbnQpIHsKKwkJaWYocGhpKSB7CisJCQlmb3IoaW50IGsgPSBubGV2ZWxzLTE7IGsgPj0gMDsgay0tKSB7CisJCQkJaWYocGhpW2tdKSBGcmVlSW1hZ2VfVW5sb2FkKHBoaVtrXSk7CisJCQl9CisJCQlmcmVlKHBoaSk7CisJCX0KKwkJcmV0dXJuIE5VTEw7CisJfQorfQorCisvKioKK0NvbXB1dGUgZ3JhZGllbnRzIGluIHggYW5kIHkgZGlyZWN0aW9ucywgYXR0ZW51YXRlIHRoZW0gd2l0aCB0aGUgYXR0ZW51YXRpb24gbWF0cml4LCAKK3RoZW4gY29tcHV0ZSB0aGUgZGl2ZXJnZW5jZSBkaXYgRyBmcm9tIHRoZSBhdHRlbnVhdGVkIGdyYWRpZW50LiAKK0BwYXJhbSBIIE5vcm1hbGl6ZWQgbHVtaW5hbmNlCitAcGFyYW0gUEhJIEF0dGVudWF0aW9uIG1hdHJpeAorQHJldHVybiBSZXR1cm5zIHRoZSBkaXZlcmdlbmNlIG1hdHJpeCBpZiBzdWNjZXNzZnVsLCByZXR1cm5zIE5VTEwgb3RoZXJ3aXNlCisqLworc3RhdGljIEZJQklUTUFQKiBEaXZlcmdlbmNlKEZJQklUTUFQICpILCBGSUJJVE1BUCAqUEhJKSB7CisJRklCSVRNQVAgKkd4ID0gTlVMTCwgKkd5ID0gTlVMTCwgKmRpdkcgPSBOVUxMOworCWZsb2F0ICpwaGksICpoLCAqZ3gsICpneSwgKmRpdmc7CisKKwl0cnkgeworCQljb25zdCBGUkVFX0lNQUdFX1RZUEUgaW1hZ2VfdHlwZSA9IEZyZWVJbWFnZV9HZXRJbWFnZVR5cGUoSCk7CisJCWlmKGltYWdlX3R5cGUgIT0gRklUX0ZMT0FUKSB0aHJvdygxKTsKKworCQljb25zdCB1bnNpZ25lZCB3aWR0aCA9IEZyZWVJbWFnZV9HZXRXaWR0aChIKTsKKwkJY29uc3QgdW5zaWduZWQgaGVpZ2h0ID0gRnJlZUltYWdlX0dldEhlaWdodChIKTsKKworCQlHeCA9IEZyZWVJbWFnZV9BbGxvY2F0ZVQoaW1hZ2VfdHlwZSwgd2lkdGgsIGhlaWdodCk7CisJCWlmKCFHeCkgdGhyb3coMSk7CisJCUd5ID0gRnJlZUltYWdlX0FsbG9jYXRlVChpbWFnZV90eXBlLCB3aWR0aCwgaGVpZ2h0KTsKKwkJaWYoIUd5KSB0aHJvdygxKTsKKwkJCisJCWNvbnN0IHVuc2lnbmVkIHBpdGNoID0gRnJlZUltYWdlX0dldFBpdGNoKEgpIC8gc2l6ZW9mKGZsb2F0KTsKKwkJCisJCS8vIHBlcmZvcm0gZ3JhZGllbnQgYXR0ZW51YXRpb24KKworCQlwaGkgPSAoZmxvYXQqKUZyZWVJbWFnZV9HZXRCaXRzKFBISSk7CisJCWggICA9IChmbG9hdCopRnJlZUltYWdlX0dldEJpdHMoSCk7CisJCWd4ICA9IChmbG9hdCopRnJlZUltYWdlX0dldEJpdHMoR3gpOworCQlneSAgPSAoZmxvYXQqKUZyZWVJbWFnZV9HZXRCaXRzKEd5KTsKKworCQlmb3IodW5zaWduZWQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworCQkJY29uc3QgdW5zaWduZWQgcyA9ICh5KzEgPT0gaGVpZ2h0ID8geSA6IHkrMSk7CisJCQlmb3IodW5zaWduZWQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CQkJCQorCQkJCWNvbnN0IHVuc2lnbmVkIGUgPSAoeCsxID09IHdpZHRoID8geCA6IHgrMSk7CisJCQkJLy8gZm9yd2FyZCBkaWZmZXJlbmNlCisJCQkJY29uc3QgdW5zaWduZWQgaW5kZXggPSB5KnBpdGNoICsgeDsKKwkJCQljb25zdCBmbG9hdCBwaGlfeHkgPSBwaGlbaW5kZXhdOworCQkJCWNvbnN0IGZsb2F0IGhfeHkgICA9IGhbaW5kZXhdOworCQkJCWd4W3hdID0gKGhbeSpwaXRjaCtlXSAtIGhfeHkpICogcGhpX3h5OyAvLyBbSCh4KzEsIHkpIC0gSCh4LCB5KV0gKiBQSEkoeCwgeSkKKwkJCQlneVt4XSA9IChoW3MqcGl0Y2greF0gLSBoX3h5KSAqIHBoaV94eTsgLy8gW0goeCwgeSsxKSAtIEgoeCwgeSldICogUEhJKHgsIHkpCisJCQl9CisJCQkvLyBuZXh0IGxpbmUKKwkJCWd4ICs9IHBpdGNoOworCQkJZ3kgKz0gcGl0Y2g7CisJCX0KKworCQkvLyBjYWxjdWxhdGUgdGhlIGRpdmVyZ2VuY2UKKworCQlkaXZHID0gRnJlZUltYWdlX0FsbG9jYXRlVChpbWFnZV90eXBlLCB3aWR0aCwgaGVpZ2h0KTsKKwkJaWYoIWRpdkcpIHRocm93KDEpOworCQkKKwkJZ3ggID0gKGZsb2F0KilGcmVlSW1hZ2VfR2V0Qml0cyhHeCk7CisJCWd5ICA9IChmbG9hdCopRnJlZUltYWdlX0dldEJpdHMoR3kpOworCQlkaXZnID0gKGZsb2F0KilGcmVlSW1hZ2VfR2V0Qml0cyhkaXZHKTsKKworCQlmb3IodW5zaWduZWQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworCQkJZm9yKHVuc2lnbmVkIHggPSAwOyB4IDwgd2lkdGg7IHgrKykgewkJCQkKKwkJCQkvLyBiYWNrd2FyZCBkaWZmZXJlbmNlIGFwcHJveGltYXRpb24KKwkJCQkvLyBkaXZHID0gR3goeCwgeSkgLSBHeCh4LTEsIHkpICsgR3koeCwgeSkgLSBHeSh4LCB5LTEpCisJCQkJY29uc3QgdW5zaWduZWQgaW5kZXggPSB5KnBpdGNoICsgeDsKKwkJCQlkaXZnW2luZGV4XSA9IGd4W2luZGV4XSArIGd5W2luZGV4XTsKKwkJCQlpZih4ID4gMCkgZGl2Z1tpbmRleF0gLT0gZ3hbaW5kZXgtMV07CisJCQkJaWYoeSA+IDApIGRpdmdbaW5kZXhdIC09IGd5W2luZGV4LXBpdGNoXTsKKwkJCX0KKwkJfQorCisJCS8vIG5vIGxvbmdlciBuZWVkZWQgLi4uIAorCQlGcmVlSW1hZ2VfVW5sb2FkKEd4KTsKKwkJRnJlZUltYWdlX1VubG9hZChHeSk7CisKKwkJLy8gcmV0dXJuIHRoZSBkaXZlcmdlbmNlCisJCXJldHVybiBkaXZHOworCisJfSBjYXRjaChpbnQpIHsKKwkJaWYoR3gpIEZyZWVJbWFnZV9VbmxvYWQoR3gpOworCQlpZihHeSkgRnJlZUltYWdlX1VubG9hZChHeSk7CisJCWlmKGRpdkcpIEZyZWVJbWFnZV9VbmxvYWQoZGl2Ryk7CisJCXJldHVybiBOVUxMOworCX0KK30KKworLyoqCitHaXZlbiB0aGUgbHVtaW5hbmNlIGNoYW5uZWwsIGZpbmQgbWF4ICYgbWluIGx1bWluYW5jZSB2YWx1ZXMsIAorbm9ybWFsaXplIHRvIHJhbmdlIDAuLjEwMCBhbmQgdGFrZSB0aGUgbG9nYXJpdGhtLiAKK0BwYXJhbSBZIEltYWdlIGx1bWluYW5jZQorQHJldHVybiBSZXR1cm5zIHRoZSBub3JtYWxpemVkIGx1bWluYW5jZSBIIGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgTlVMTCBvdGhlcndpc2UKKyovCitzdGF0aWMgRklCSVRNQVAqIExvZ0x1bWluYW5jZShGSUJJVE1BUCAqWSkgeworCUZJQklUTUFQICpIID0gTlVMTDsKKworCXRyeSB7CisJCS8vIGdldCB0aGUgbHVtaW5hbmNlIGNoYW5uZWwKKwkJRklCSVRNQVAgKkggPSBGcmVlSW1hZ2VfQ2xvbmUoWSk7CisJCWlmKCFIKSB0aHJvdygxKTsKKworCQljb25zdCB1bnNpZ25lZCB3aWR0aCAgPSBGcmVlSW1hZ2VfR2V0V2lkdGgoSCk7CisJCWNvbnN0IHVuc2lnbmVkIGhlaWdodCA9IEZyZWVJbWFnZV9HZXRIZWlnaHQoSCk7CisJCWNvbnN0IHVuc2lnbmVkIHBpdGNoICA9IEZyZWVJbWFnZV9HZXRQaXRjaChIKTsKKworCQkvLyBmaW5kIG1heCAmIG1pbiBsdW1pbmFuY2UgdmFsdWVzCisJCWZsb2F0IG1heEx1bSA9IC0xZTIwRiwgbWluTHVtID0gMWUyMEY7CisKKwkJQllURSAqYml0cyA9IChCWVRFKilGcmVlSW1hZ2VfR2V0Qml0cyhIKTsKKwkJZm9yKHVuc2lnbmVkIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJCWNvbnN0IGZsb2F0ICpwaXhlbCA9IChmbG9hdCopYml0czsKKwkJCWZvcih1bnNpZ25lZCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQljb25zdCBmbG9hdCB2YWx1ZSA9IHBpeGVsW3hdOworCQkJCW1heEx1bSA9IChtYXhMdW0gPCB2YWx1ZSkgPyB2YWx1ZSA6IG1heEx1bTsJLy8gbWF4IEx1bWluYW5jZSBpbiB0aGUgc2NlbmUKKwkJCQltaW5MdW0gPSAobWluTHVtIDwgdmFsdWUpID8gbWluTHVtIDogdmFsdWU7CS8vIG1pbiBMdW1pbmFuY2UgaW4gdGhlIHNjZW5lCisJCQl9CisJCQkvLyBuZXh0IGxpbmUKKwkJCWJpdHMgKz0gcGl0Y2g7CisJCX0KKwkJaWYobWF4THVtID09IG1pbkx1bSkgdGhyb3coMSk7CisKKwkJLy8gbm9ybWFsaXplIHRvIHJhbmdlIDAuLjEwMCBhbmQgdGFrZSB0aGUgbG9nYXJpdGhtCisJCWNvbnN0IGZsb2F0IHNjYWxlID0gMTAwLkYgLyAobWF4THVtIC0gbWluTHVtKTsKKwkJYml0cyA9IChCWVRFKilGcmVlSW1hZ2VfR2V0Qml0cyhIKTsKKwkJZm9yKHVuc2lnbmVkIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJCWZsb2F0ICpwaXhlbCA9IChmbG9hdCopYml0czsKKwkJCWZvcih1bnNpZ25lZCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQljb25zdCBmbG9hdCB2YWx1ZSA9IChwaXhlbFt4XSAtIG1pbkx1bSkgKiBzY2FsZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxbeF0gPSBzdGQ6OmxvZyh2YWx1ZSArIEVQU0lMT04pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBsaW5lCisgICAgICAgICAgICAgICAgICAgICAgICBiaXRzICs9IHBpdGNoOworCQl9CisKKwkJcmV0dXJuIEg7CisKKwl9IGNhdGNoKGludCkgeworCQlpZihIKSBGcmVlSW1hZ2VfVW5sb2FkKEgpOworCQlyZXR1cm4gTlVMTDsKKwl9Cit9CisKKy8qKgorR2l2ZW4gYSBub3JtYWxpemVkIGx1bWluYW5jZSwgcGVyZm9ybSBleHBvbmVudGlhdGlvbiBhbmQgcmVjb3ZlciB0aGUgbG9nIGNvbXByZXNzZWQgaW1hZ2UgCitAcGFyYW0gWSBJbnB1dC9PdXRwdXQgbHVtaW5hbmNlIGltYWdlCisqLworc3RhdGljIHZvaWQgRXhwTHVtaW5hbmNlKEZJQklUTUFQICpZKSB7CisJY29uc3QgdW5zaWduZWQgd2lkdGggPSBGcmVlSW1hZ2VfR2V0V2lkdGgoWSk7CisJY29uc3QgdW5zaWduZWQgaGVpZ2h0ID0gRnJlZUltYWdlX0dldEhlaWdodChZKTsKKwljb25zdCB1bnNpZ25lZCBwaXRjaCA9IEZyZWVJbWFnZV9HZXRQaXRjaChZKTsKKworCUJZVEUgKmJpdHMgPSAoQllURSopRnJlZUltYWdlX0dldEJpdHMoWSk7CisJZm9yKHVuc2lnbmVkIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJZmxvYXQgKnBpeGVsID0gKGZsb2F0KiliaXRzOworCQlmb3IodW5zaWduZWQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisgICAgICAgICAgICAgICAgICBwaXhlbFt4XSA9IHN0ZDo6ZXhwKHBpeGVsW3hdKSAtIEVQU0lMT047CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJpdHMgKz0gcGl0Y2g7CisgICAgICAgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoqCitHcmFkaWVudCBEb21haW4gSERSIHRvbmUgbWFwcGluZyBvcGVyYXRvcgorQHBhcmFtIFkgSW1hZ2UgbHVtaW5hbmNlIHZhbHVlcworQHBhcmFtIGFscGhhIFBhcmFtZXRlciBhbHBoYSBvZiB0aGUgcGFwZXIgKHN1Z2dlc3RlZCB2YWx1ZSBpcyAwLjEpCitAcGFyYW0gYmV0YSBQYXJhbWV0ZXIgYmV0YSBvZiB0aGUgcGFwZXIgKHN1Z2dlc3RlZCB2YWx1ZSBpcyBiZXR3ZWVuIDAuOCBhbmQgMC45KQorQHJldHVybiByZXR1cm5zIHRoZSB0b25lIG1hcHBlZCBsdW1pbmFuY2UKKyovCitzdGF0aWMgRklCSVRNQVAqIHRtb0ZhdHRhbDAyKEZJQklUTUFQICpZLCBmbG9hdCBhbHBoYSwgZmxvYXQgYmV0YSkgeworCWNvbnN0IHVuc2lnbmVkIE1JTl9QWVJBTUlEX1NJWkUgPSAzMjsJLy8gbWluaW11biBzaXplICh3aWR0aCBvciBoZWlnaHQpIG9mIHRoZSBjb2Fyc2VzdCBsZXZlbCBvZiB0aGUgcHlyYW1pZAorCisJRklCSVRNQVAgKkggPSBOVUxMOworCUZJQklUTUFQICoqcHlyYW1pZCA9IE5VTEw7CisJRklCSVRNQVAgKipncmFkaWVudHMgPSBOVUxMOworCUZJQklUTUFQICpwaHkgPSBOVUxMOworCUZJQklUTUFQICpkaXZHID0gTlVMTDsKKwlGSUJJVE1BUCAqVSA9IE5VTEw7CisJZmxvYXQgKmF2Z0dyYWQgPSBOVUxMOworCisJaW50IGs7CisJaW50IG5sZXZlbHMgPSAwOworCisJdHJ5IHsKKwkJLy8gZ2V0IHRoZSBub3JtYWxpemVkIGx1bWluYW5jZQorCQlGSUJJVE1BUCAqSCA9IExvZ0x1bWluYW5jZShZKTsKKwkJaWYoIUgpIHRocm93KDEpOworCQkKKwkJLy8gZ2V0IHRoZSBudW1iZXIgb2YgbGV2ZWxzIGZvciB0aGUgcHlyYW1pZAorCQljb25zdCB1bnNpZ25lZCB3aWR0aCA9IEZyZWVJbWFnZV9HZXRXaWR0aChIKTsKKwkJY29uc3QgdW5zaWduZWQgaGVpZ2h0ID0gRnJlZUltYWdlX0dldEhlaWdodChIKTsKKwkJdW5zaWduZWQgbWluc2l6ZSA9IE1JTih3aWR0aCwgaGVpZ2h0KTsKKwkJd2hpbGUobWluc2l6ZSA+PSBNSU5fUFlSQU1JRF9TSVpFKSB7CisJCQlubGV2ZWxzKys7CisJCQltaW5zaXplIC89IDI7CisJCX0KKworCQkvLyBjcmVhdGUgdGhlIEdhdXNzaWFuIHB5cmFtaWQKKwkJcHlyYW1pZCA9IChGSUJJVE1BUCoqKW1hbGxvYyhubGV2ZWxzICogc2l6ZW9mKEZJQklUTUFQKikpOworCQlpZighcHlyYW1pZCkgdGhyb3coMSk7CisJCW1lbXNldChweXJhbWlkLCAwLCBubGV2ZWxzICogc2l6ZW9mKEZJQklUTUFQKikpOworCisJCWlmKCFHYXVzc2lhblB5cmFtaWQoSCwgcHlyYW1pZCwgbmxldmVscykpIHRocm93KDEpOworCisJCS8vIGNhbGN1bGF0ZSBncmFkaWVudCBtYWduaXR1ZGUgYW5kIGl0cyBhdmVyYWdlIHZhbHVlIG9uIGVhY2ggcHlyYW1pZCBsZXZlbAorCQlncmFkaWVudHMgPSAoRklCSVRNQVAqKiltYWxsb2MobmxldmVscyAqIHNpemVvZihGSUJJVE1BUCopKTsKKwkJaWYoIWdyYWRpZW50cykgdGhyb3coMSk7CisJCW1lbXNldChncmFkaWVudHMsIDAsIG5sZXZlbHMgKiBzaXplb2YoRklCSVRNQVAqKSk7CisJCWF2Z0dyYWQgPSAoZmxvYXQqKW1hbGxvYyhubGV2ZWxzICogc2l6ZW9mKGZsb2F0KSk7CisJCWlmKCFhdmdHcmFkKSB0aHJvdygxKTsKKworCQlpZighR3JhZGllbnRQeXJhbWlkKHB5cmFtaWQsIG5sZXZlbHMsIGdyYWRpZW50cywgYXZnR3JhZCkpIHRocm93KDEpOworCisJCS8vIGZyZWUgdGhlIEdhdXNzaWFuIHB5cmFtaWQKKwkJZm9yKGsgPSAwOyBrIDwgbmxldmVsczsgaysrKSB7CisJCQlpZihweXJhbWlkW2tdKSBGcmVlSW1hZ2VfVW5sb2FkKHB5cmFtaWRba10pOworCQl9CisJCWZyZWUocHlyYW1pZCk7IHB5cmFtaWQgPSBOVUxMOworCisJCS8vIGNvbXB1dGUgdGhlIGdyYWRpZW50IGF0dGVudWF0aW9uIGZ1bmN0aW9uIFBISSh4LCB5KQorCQlwaHkgPSBQaGlNYXRyaXgoZ3JhZGllbnRzLCBhdmdHcmFkLCBubGV2ZWxzLCBhbHBoYSwgYmV0YSk7CisJCWlmKCFwaHkpIHRocm93KDEpOworCisJCS8vIGZyZWUgdGhlIGdyYWRpZW50IHB5cmFtaWQKKwkJZm9yKGsgPSAwOyBrIDwgbmxldmVsczsgaysrKSB7CisJCQlpZihncmFkaWVudHNba10pIEZyZWVJbWFnZV9VbmxvYWQoZ3JhZGllbnRzW2tdKTsKKwkJfQorCQlmcmVlKGdyYWRpZW50cyk7IGdyYWRpZW50cyA9IE5VTEw7CisJCWZyZWUoYXZnR3JhZCk7IGF2Z0dyYWQgPSBOVUxMOworCisJCS8vIGNvbXB1dGUgZ3JhZGllbnRzIGluIHggYW5kIHkgZGlyZWN0aW9ucywgYXR0ZW51YXRlIHRoZW0gd2l0aCB0aGUgYXR0ZW51YXRpb24gbWF0cml4LCAKKwkJLy8gdGhlbiBjb21wdXRlIHRoZSBkaXZlcmdlbmNlIGRpdiBHIGZyb20gdGhlIGF0dGVudWF0ZWQgZ3JhZGllbnQuIAorCQlkaXZHID0gRGl2ZXJnZW5jZShILCBwaHkpOworCQlpZighZGl2RykgdGhyb3coMSk7CisKKwkJLy8gSCAmIHBoeSBubyBsb25nZXIgbmVlZGVkCisJCUZyZWVJbWFnZV9VbmxvYWQoSCk7IEggPSBOVUxMOworCQlGcmVlSW1hZ2VfVW5sb2FkKHBoeSk7IHBoeSA9IE5VTEw7CisKKwkJLy8gc29sdmUgdGhlIFBERSAoUG9pc3NvbiBlcXVhdGlvbikgdXNpbmcgYSBtdWx0aWdyaWQgc29sdmVyIGFuZCAzIGN5Y2xlcworCQlGSUJJVE1BUCAqVSA9IEZyZWVJbWFnZV9NdWx0aWdyaWRQb2lzc29uU29sdmVyKGRpdkcsIDMpOworCQlpZighVSkgdGhyb3coMSk7CisKKwkJRnJlZUltYWdlX1VubG9hZChkaXZHKTsKKworCQkvLyBwZXJmb3JtIGV4cG9uZW50aWF0aW9uIGFuZCByZWNvdmVyIHRoZSBsb2cgY29tcHJlc3NlZCBpbWFnZQorCQlFeHBMdW1pbmFuY2UoVSk7CisKKwkJcmV0dXJuIFU7CisKKwl9IGNhdGNoKGludCkgeworCQlpZihIKSBGcmVlSW1hZ2VfVW5sb2FkKEgpOworCQlpZihweXJhbWlkKSB7CisJCQlmb3IoaW50IGkgPSAwOyBpIDwgbmxldmVsczsgaSsrKSB7CisJCQkJaWYocHlyYW1pZFtpXSkgRnJlZUltYWdlX1VubG9hZChweXJhbWlkW2ldKTsKKwkJCX0KKwkJCWZyZWUocHlyYW1pZCk7CisJCX0KKwkJaWYoZ3JhZGllbnRzKSB7CisJCQlmb3IoaW50IGkgPSAwOyBpIDwgbmxldmVsczsgaSsrKSB7CisJCQkJaWYoZ3JhZGllbnRzW2ldKSBGcmVlSW1hZ2VfVW5sb2FkKGdyYWRpZW50c1tpXSk7CisJCQl9CisJCQlmcmVlKGdyYWRpZW50cyk7CisJCX0KKwkJaWYoYXZnR3JhZCkgZnJlZShhdmdHcmFkKTsKKwkJaWYocGh5KSBGcmVlSW1hZ2VfVW5sb2FkKHBoeSk7CisJCWlmKGRpdkcpIEZyZWVJbWFnZV9VbmxvYWQoZGl2Ryk7CisJCWlmKFUpIEZyZWVJbWFnZV9VbmxvYWQoVSk7CisKKwkJcmV0dXJuIE5VTEw7CisJfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgTWFpbiBhbGdvcml0aG0KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoqCitBcHBseSB0aGUgR3JhZGllbnQgRG9tYWluIEhpZ2ggRHluYW1pYyBSYW5nZSBDb21wcmVzc2lvbiB0byBhIFJHQkYgaW1hZ2UgYW5kIGNvbnZlcnQgdG8gMjQtYml0IFJHQgorQHBhcmFtIGRpYiBJbnB1dCBSR0JGIC8gUkdCMTYgaW1hZ2UKK0BwYXJhbSBjb2xvcl9zYXR1cmF0aW9uIENvbG9yIHNhdHVyYXRpb24gKHMgcGFyYW1ldGVyIGluIHRoZSBwYXBlcikgaW4gWzAuNC4uMC42XQorQHBhcmFtIGF0dGVudWF0aW9uIEF0ZW51YXRpb24gZmFjdG9yIChiZXRhIHBhcmFtZXRlciBpbiB0aGUgcGFwZXIpIGluIFswLjguLjAuOV0KK0ByZXR1cm4gUmV0dXJucyBhIDI0LWJpdCBSR0IgaW1hZ2UgaWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyBOVUxMIG90aGVyd2lzZQorKi8KK0ZJQklUTUFQKiBETExfQ0FMTENPTlYgCitGcmVlSW1hZ2VfVG1vRmF0dGFsMDIoRklCSVRNQVAgKmRpYiwgZG91YmxlIGNvbG9yX3NhdHVyYXRpb24sIGRvdWJsZSBhdHRlbnVhdGlvbikgewkKKwljb25zdCBmbG9hdCBhbHBoYSA9IDAuMUY7CQkJCQkJCQkJLy8gcGFyYW1ldGVyIGFscGhhID0gMC4xCisJY29uc3QgZmxvYXQgYmV0YSA9IChmbG9hdClNQVgoMC44LCBNSU4oMC45LCBhdHRlbnVhdGlvbikpOwkvLyBwYXJhbWV0ZXIgYmV0YSA9IFswLjguLjAuOV0KKwljb25zdCBmbG9hdCBzID0gKGZsb2F0KU1BWCgwLjQsIE1JTigwLjYsIGNvbG9yX3NhdHVyYXRpb24pKTsvLyBleHBvbmVudCBzIGNvbnRyb2xzIGNvbG9yIHNhdHVyYXRpb24gPSBbMC40Li4wLjZdCisKKwlGSUJJVE1BUCAqc3JjID0gTlVMTDsKKwlGSUJJVE1BUCAqWWluID0gTlVMTDsKKwlGSUJJVE1BUCAqWW91dCA9IE5VTEw7CisJRklCSVRNQVAgKmRzdCA9IE5VTEw7CisKKwlpZighRnJlZUltYWdlX0hhc1BpeGVscyhkaWIpKSByZXR1cm4gTlVMTDsKKworCXRyeSB7CisKKwkJLy8gY29udmVydCB0byBSR0JGCisJCXNyYyA9IEZyZWVJbWFnZV9Db252ZXJ0VG9SR0JGKGRpYik7CisJCWlmKCFzcmMpIHRocm93KDEpOworCisJCS8vIGdldCB0aGUgbHVtaW5hbmNlIGNoYW5uZWwKKwkJWWluID0gQ29udmVydFJHQkZUb1koc3JjKTsKKwkJaWYoIVlpbikgdGhyb3coMSk7CisKKwkJLy8gcGVyZm9ybSB0aGUgdG9uZSBtYXBwaW5nCisJCVlvdXQgPSB0bW9GYXR0YWwwMihZaW4sIGFscGhhLCBiZXRhKTsKKwkJaWYoIVlvdXQpIHRocm93KDEpOworCisJCS8vIGNsaXAgbG93IGFuZCBoaWdoIHZhbHVlcyBhbmQgbm9ybWFsaXplIHRvIFswLi4xXQorCQkvL05vcm1hbGl6ZVkoWW91dCwgMC4wMDFGLCAwLjk5NUYpOworCQlOb3JtYWxpemVZKFlvdXQsIDAsIDEpOworCisJCS8vIGNvbXByZXNzIHRoZSBkeW5hbWljIHJhbmdlCisKKwkJY29uc3QgdW5zaWduZWQgd2lkdGggPSBGcmVlSW1hZ2VfR2V0V2lkdGgoc3JjKTsKKwkJY29uc3QgdW5zaWduZWQgaGVpZ2h0ID0gRnJlZUltYWdlX0dldEhlaWdodChzcmMpOworCisJCWNvbnN0IHVuc2lnbmVkIHJnYl9waXRjaCA9IEZyZWVJbWFnZV9HZXRQaXRjaChzcmMpOworCQljb25zdCB1bnNpZ25lZCB5X3BpdGNoID0gRnJlZUltYWdlX0dldFBpdGNoKFlpbik7CisKKwkJQllURSAqYml0cyAgICAgID0gKEJZVEUqKUZyZWVJbWFnZV9HZXRCaXRzKHNyYyk7CisJCUJZVEUgKmJpdHNfeWluICA9IChCWVRFKilGcmVlSW1hZ2VfR2V0Qml0cyhZaW4pOworCQlCWVRFICpiaXRzX3lvdXQgPSAoQllURSopRnJlZUltYWdlX0dldEJpdHMoWW91dCk7CisKKwkJZm9yKHVuc2lnbmVkIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJCWZsb2F0ICpMaW4gPSAoZmxvYXQqKWJpdHNfeWluOworCQkJZmxvYXQgKkxvdXQgPSAoZmxvYXQqKWJpdHNfeW91dDsKKwkJCWZsb2F0ICpjb2xvciA9IChmbG9hdCopYml0czsKKwkJCWZvcih1bnNpZ25lZCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQlmb3IodW5zaWduZWQgYyA9IDA7IGMgPCAzOyBjKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29sb3IgPSAoTGluW3hdID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBzdGQ6OnBvdygqY29sb3IgLyBMaW5beF0sIHMpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG91dFt4XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCQkJfQorCQkJYml0cyArPSByZ2JfcGl0Y2g7CisJCQliaXRzX3lpbiArPSB5X3BpdGNoOworCQkJYml0c195b3V0ICs9IHlfcGl0Y2g7CisJCX0KKworCQkvLyBub3QgbmVlZGVkIGFueW1vcmUKKwkJRnJlZUltYWdlX1VubG9hZChZaW4pOyAgWWluICA9IE5VTEw7CisJCUZyZWVJbWFnZV9VbmxvYWQoWW91dCk7IFlvdXQgPSBOVUxMOworCisJCS8vIGNsYW1wIGltYWdlIGhpZ2hlc3QgdmFsdWVzIHRvIGRpc3BsYXkgd2hpdGUsIHRoZW4gY29udmVydCB0byAyNC1iaXQgUkdCCisJCWRzdCA9IENsYW1wQ29udmVydFJHQkZUbzI0KHNyYyk7CisKKwkJLy8gY2xlYW4tdXAgYW5kIHJldHVybgorCQlGcmVlSW1hZ2VfVW5sb2FkKHNyYyk7IHNyYyA9IE5VTEw7CisKKwkJLy8gY29weSBtZXRhZGF0YSBmcm9tIHNyYyB0byBkc3QKKwkJRnJlZUltYWdlX0Nsb25lTWV0YWRhdGEoZHN0LCBkaWIpOworCQkKKwkJcmV0dXJuIGRzdDsKKworCX0gY2F0Y2goaW50KSB7CisJCWlmKHNyYykgRnJlZUltYWdlX1VubG9hZChzcmMpOworCQlpZihZaW4pIEZyZWVJbWFnZV9VbmxvYWQoWWluKTsKKwkJaWYoWW91dCkgRnJlZUltYWdlX1VubG9hZChZb3V0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorfQpkaWZmIC0tZ2l0IGEvZmlsZXMvU291cmNlL0ZyZWVJbWFnZS90bW9SZWluaGFyZDA1LmNwcCBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvdG1vUmVpbmhhcmQwNS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhjYmNiMgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2UvdG1vUmVpbmhhcmQwNS5jcHAKQEAgLTAsMCArMSwyNzAgQEAKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFRvbmUgbWFwcGluZyBvcGVyYXRvciAoUmVpbmhhcmQsIDIwMDUpCisvLworLy8gRGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBieQorLy8gLSBIZXJ26SBEcm9sb24gKGRyb2xvbkBpbmZvbmllLmZyKQorLy8gLSBNaWhhaWwgTmF5ZGVub3YgKG1uYXlkZW5vdkB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQpCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRnJlZUltYWdlIDMKKy8vCisvLyBDT1ZFUkVEIENPREUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkKKy8vIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTCisvLyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy8vIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVECisvLyBDT0RFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UCisvLyBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWQorLy8gU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTAorLy8gUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUgorLy8gVEhJUyBESVNDTEFJTUVSLgorLy8KKy8vIFVzZSBhdCB5b3VyIG93biByaXNrIQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaW5jbHVkZSA8Y21hdGg+CisKKyNpbmNsdWRlICJGcmVlSW1hZ2UuaCIKKyNpbmNsdWRlICJVdGlsaXRpZXMuaCIKKyNpbmNsdWRlICJUb25lTWFwcGluZy5oIgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBHbG9iYWwgYW5kL29yIGxvY2FsIHRvbmUgbWFwcGluZyBvcGVyYXRvcgorLy8gUmVmZXJlbmNlczogCisvLyBbMV0gRXJpayBSZWluaGFyZCBhbmQgS2F0ZSBEZXZsaW4sICdEeW5hbWljIFJhbmdlIFJlZHVjdGlvbiBJbnNwaXJlZCBieSBQaG90b3JlY2VwdG9yIFBoeXNpb2xvZ3knLCAKKy8vICAgICBJRUVFIFRyYW5zYWN0aW9ucyBvbiBWaXN1YWxpemF0aW9uIGFuZCBDb21wdXRlciBHcmFwaGljcywgMTEoMSksIEphbi9GZWIgMjAwNS4gCisvLyBbMl0gRXJpayBSZWluaGFyZCwgJ1BhcmFtZXRlciBlc3RpbWF0aW9uIGZvciBwaG90b2dyYXBoaWMgdG9uZSByZXByb2R1Y3Rpb24nLAorLy8gICAgIEpvdXJuYWwgb2YgR3JhcGhpY3MgVG9vbHMsIHZvbC4gNywgbm8uIDEsIHBwLiA0NZY1MSwgMjAwMy4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoqCitUb25lIG1hcHBpbmcgb3BlcmF0b3IKK0BwYXJhbSBkaWIgSW5wdXQgLyBPdXRwdXQgUkdCRiBpbWFnZQorQHBhcmFtIFkgSW5wdXQgbHVtaW5hbmNlIGltYWdlIHZlcnNpb24gb2YgZGliCitAcGFyYW0gZiBPdmVyYWxsIGludGVuc2l0eSBpbiByYW5nZSBbLTg6OF0gOiBkZWZhdWx0IHRvIDAKK0BwYXJhbSBtIENvbnRyYXN0IGluIHJhbmdlIFswLjM6MSkgOiBkZWZhdWx0IHRvIDAKK0BwYXJhbSBhIEFkYXB0YXRpb24gaW4gcmFuZ2UgWzA6MV0gOiBkZWZhdWx0IHRvIDEKK0BwYXJhbSBjIENvbG9yIGNvcnJlY3Rpb24gaW4gcmFuZ2UgWzA6MV0gOiBkZWZhdWx0IHRvIDAKK0ByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgRkFMU0Ugb3RoZXJ3aXNlCitAc2VlIEx1bWluYW5jZUZyb21ZCisqLworc3RhdGljIEJPT0wgCitUb25lTWFwcGluZ1JlaW5oYXJkMDUoRklCSVRNQVAgKmRpYiwgRklCSVRNQVAgKlksIGZsb2F0IGYsIGZsb2F0IG0sIGZsb2F0IGEsIGZsb2F0IGMpIHsKKwlmbG9hdCBDYXZbM107CQkvLyBjaGFubmVsIGF2ZXJhZ2UKKwlmbG9hdCBMYXYgPSAwOwkJLy8gYXZlcmFnZSBsdW1pbmFuY2UKKwlmbG9hdCBMbGF2ID0gMDsJCS8vIGxvZyBhdmVyYWdlIGx1bWluYW5jZQorCWZsb2F0IG1pbkx1bSA9IDE7CS8vIG1pbiBsdW1pbmFuY2UKKwlmbG9hdCBtYXhMdW0gPSAxOwkvLyBtYXggbHVtaW5hbmNlCisKKwlmbG9hdCBMOwkJLy8gcGl4ZWwgbHVtaW5hbmNlCisJZmxvYXQgSV9nLCBJX2w7IC8vIGdsb2JhbCBhbmQgbG9jYWwgbGlnaHQgYWRhcHRhdGlvbgorCWZsb2F0IElfYTsJCS8vIGludGVycG9sYXRlZCBwaXhlbCBsaWdodCBhZGFwdGF0aW9uCisJZmxvYXQgazsJCS8vIGtleSAobG93LWtleSBtZWFucyBvdmVyYWxsIGRhcmsgaW1hZ2UsIGhpZ2gta2V5IG1lYW5zIG92ZXJhbGwgbGlnaHQgaW1hZ2UpCisKKwkvLyBjaGVjayBpbnB1dCBwYXJhbWV0ZXJzIAorCisJaWYoKEZyZWVJbWFnZV9HZXRJbWFnZVR5cGUoZGliKSAhPSBGSVRfUkdCRikgfHwgKEZyZWVJbWFnZV9HZXRJbWFnZVR5cGUoWSkgIT0gRklUX0ZMT0FUKSkgeworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJaWYoZiA8IC04KSBmID0gLTg7IGlmKGYgPiA4KSBmID0gODsKKyAgICBpZihtIDwgMCkgIG0gPSAwOyAgaWYobSA+IDEpIG0gPSAxOworICAgIGlmKGEgPCAwKSAgYSA9IDA7ICBpZihhID4gMSkgYSA9IDE7CisgICAgaWYoYyA8IDApICBjID0gMDsgIGlmKGMgPiAxKSBjID0gMTsKKworCWNvbnN0IHVuc2lnbmVkIHdpZHRoICA9IEZyZWVJbWFnZV9HZXRXaWR0aChkaWIpOworCWNvbnN0IHVuc2lnbmVkIGhlaWdodCA9IEZyZWVJbWFnZV9HZXRIZWlnaHQoZGliKTsKKworCWNvbnN0IHVuc2lnbmVkIGRpYl9waXRjaCAgPSBGcmVlSW1hZ2VfR2V0UGl0Y2goZGliKTsKKwljb25zdCB1bnNpZ25lZCB5X3BpdGNoICAgID0gRnJlZUltYWdlX0dldFBpdGNoKFkpOworCisJaW50IGk7CisJdW5zaWduZWQgeCwgeTsKKwlCWVRFICpiaXRzID0gTlVMTCwgKlliaXRzID0gTlVMTDsKKworCS8vIGdldCBzdGF0aXN0aWNzIGFib3V0IHRoZSBkYXRhIChidXQgb25seSBpZiBpdHMgcmVhbGx5IG5lZWRlZCkKKworICAgICAgICBmID0gc3RkOjpleHAoLWYpOworICAgICAgICBpZiAoKG0gPT0gMCkgfHwgKGEgIT0gMSkgJiYgKGMgIT0gMSkpIHsKKyAgICAgICAgICAvLyBhdm9pZCB0aGVzZSBjYWxjdWxhdGlvbnMgaWYgaXRzIG5vdCBuZWVkZWQgYWZ0ZXIgLi4uCisgICAgICAgICAgTHVtaW5hbmNlRnJvbVkoWSwgJm1heEx1bSwgJm1pbkx1bSwgJkxhdiwgJkxsYXYpOworICAgICAgICAgIGsgPSAoc3RkOjpsb2cobWF4THVtKSAtIExsYXYpIC8gKHN0ZDo6bG9nKG1heEx1bSkgLSBzdGQ6OmxvZyhtaW5MdW0pKTsKKyAgICAgICAgICBpZiAoayA8IDApIHsKKyAgICAgICAgICAgIC8vIHBvdyhrLCAxLjRGKSBpcyB1bmRlZmluZWQgLi4uCisgICAgICAgICAgICAvLyB0aGVyZSdzIGFuIGFtYmlndWl0eSBhYm91dCB0aGUgY2FsY3VsYXRpb24gb2YgTGxhdiBiZXR3ZWVuCisgICAgICAgICAgICAvLyBSZWluaGFyZCBwYXBlcnMgYW5kIHRoZSB2YXJpb3VzIGltcGxlbWVudGF0aW9ucyAgLi4uIHRyeSBhbm90aGVyCisgICAgICAgICAgICAvLyB3b3JsZCBhZGFwdGF0aW9uIGx1bWluYW5jZSBmb3JtdWxhIHVzaW5nIGluc3RlYWQgJ3dvcmxkTHVtID0KKyAgICAgICAgICAgIC8vIGxvZyhMbGF2KScKKyAgICAgICAgICAgIGsgPSAoc3RkOjpsb2cobWF4THVtKSAtIHN0ZDo6bG9nKExsYXYpKSAvCisgICAgICAgICAgICAgICAgKHN0ZDo6bG9nKG1heEx1bSkgLSBzdGQ6OmxvZyhtaW5MdW0pKTsKKyAgICAgICAgICAgIGlmIChrIDwgMCkgbSA9IDAuM0Y7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG0gPSAobSA+IDApID8gbSA6IChmbG9hdCkoMC4zICsgMC43ICogc3RkOjpwb3coaywgMS40RikpOworCisgICAgICAgIGZsb2F0IG1heF9jb2xvciA9IC0xZTZGOworCWZsb2F0IG1pbl9jb2xvciA9ICsxZTZGOworCisJLy8gdG9uZSBtYXAgaW1hZ2UKKworCWJpdHMgID0gKEJZVEUqKUZyZWVJbWFnZV9HZXRCaXRzKGRpYik7CisJWWJpdHMgPSAoQllURSopRnJlZUltYWdlX0dldEJpdHMoWSk7CisKKwlpZigoYSA9PSAxKSAmJiAoYyA9PSAwKSkgeworCQkvLyB3aGVuIHVzaW5nIGRlZmF1bHQgdmFsdWVzLCB1c2UgYSBmYXN0ZXN0IGNvZGUKKworCQlmb3IoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworCQkJZmxvYXQgKlkgICAgID0gKGZsb2F0KilZYml0czsKKwkJCWZsb2F0ICpjb2xvciA9IChmbG9hdCopYml0czsKKworCQkJZm9yKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworCQkJCUlfYSA9IFlbeF07CS8vIGx1bWluYW5jZSh4LCB5KQorCQkJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29sb3IgLz0gKCpjb2xvciArIHN0ZDo6cG93KGYgKiBJX2EsIG0pKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9jb2xvciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqY29sb3IgPiBtYXhfY29sb3IpID8gKmNvbG9yIDogbWF4X2NvbG9yOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9jb2xvciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqY29sb3IgPCBtaW5fY29sb3IpID8gKmNvbG9yIDogbWluX2NvbG9yOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCQkJfQorCQkJLy8gbmV4dCBsaW5lCisJCQliaXRzICArPSBkaWJfcGl0Y2g7CisJCQlZYml0cyArPSB5X3BpdGNoOworCQl9CisJfSBlbHNlIHsKKwkJLy8gY29tcGxldGUgYWxnb3JpdGhtCisKKwkJLy8gY2hhbm5lbCBhdmVyYWdlcworCisJCUNhdlswXSA9IENhdlsxXSA9IENhdlsyXSA9IDA7CisJCWlmKChhICE9IDEpICYmIChjICE9IDApKSB7CisJCQkvLyBjaGFubmVsIGF2ZXJhZ2VzIGFyZSBub3QgbmVlZGVkIHdoZW4gKGEgPT0gMSkgb3IgKGMgPT0gMCkKKwkJCWJpdHMgPSAoQllURSopRnJlZUltYWdlX0dldEJpdHMoZGliKTsKKwkJCWZvcih5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisJCQkJZmxvYXQgKmNvbG9yID0gKGZsb2F0KiliaXRzOworCQkJCWZvcih4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQkJZm9yKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCQkJCQlDYXZbaV0gKz0gKmNvbG9yOworCQkJCQkJY29sb3IrKzsKKwkJCQkJfQorCQkJCX0KKwkJCQkvLyBuZXh0IGxpbmUKKwkJCQliaXRzICs9IGRpYl9waXRjaDsKKwkJCX0KKwkJCWNvbnN0IGZsb2F0IGltYWdlX3NpemUgPSAoZmxvYXQpd2lkdGggKiBoZWlnaHQ7CisJCQlmb3IoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJCQlDYXZbaV0gLz0gaW1hZ2Vfc2l6ZTsKKwkJCX0KKwkJfQorCisJCS8vIHBlcmZvcm0gdG9uZSBtYXBwaW5nCisKKwkJYml0cyA9IChCWVRFKilGcmVlSW1hZ2VfR2V0Qml0cyhkaWIpOworCQlmb3IoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworCQkJY29uc3QgZmxvYXQgKlkgICAgID0gKGZsb2F0KilZYml0czsKKwkJCWZsb2F0ICpjb2xvciA9IChmbG9hdCopYml0czsKKworCQkJZm9yKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworCQkJCUwgPSBZW3hdOwkvLyBsdW1pbmFuY2UoeCwgeSkKKwkJCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCQkJCUlfbCA9IGMgKiAqY29sb3IgKyAoMS1jKSAqIEw7CisJCQkJCUlfZyA9IGMgKiBDYXZbaV0gKyAoMS1jKSAqIExhdjsKKwkJCQkJSV9hID0gYSAqIElfbCArICgxLWEpICogSV9nOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb2xvciAvPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmNvbG9yICsgc3RkOjpwb3coZiAqIElfYSwgbSkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2NvbG9yID0gKCpjb2xvciA+IG1heF9jb2xvcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAqY29sb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtYXhfY29sb3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX2NvbG9yID0gKCpjb2xvciA8IG1pbl9jb2xvcikgPyAqY29sb3IgOiBtaW5fY29sb3I7CisKKwkJCQkJY29sb3IrKzsKKwkJCQl9CisJCQl9CisJCQkvLyBuZXh0IGxpbmUKKwkJCWJpdHMgICs9IGRpYl9waXRjaDsKKwkJCVliaXRzICs9IHlfcGl0Y2g7CisJCX0KKwl9CisKKwkvLyBub3JtYWxpemUgaW50ZW5zaXRpZXMKKworCWlmKG1heF9jb2xvciAhPSBtaW5fY29sb3IpIHsKKwkJYml0cyA9IChCWVRFKilGcmVlSW1hZ2VfR2V0Qml0cyhkaWIpOworCQljb25zdCBmbG9hdCByYW5nZSA9IG1heF9jb2xvciAtIG1pbl9jb2xvcjsKKwkJZm9yKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJCWZsb2F0ICpjb2xvciA9IChmbG9hdCopYml0czsKKwkJCWZvcih4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQlmb3IoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJCQkJKmNvbG9yID0gKCpjb2xvciAtIG1pbl9jb2xvcikgLyByYW5nZTsKKwkJCQkJY29sb3IrKzsKKwkJCQl9CisJCQl9CisJCQkvLyBuZXh0IGxpbmUKKwkJCWJpdHMgKz0gZGliX3BpdGNoOworCQl9CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBNYWluIGFsZ29yaXRobQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKioKK0FwcGx5IHRoZSBnbG9iYWwvbG9jYWwgdG9uZSBtYXBwaW5nIG9wZXJhdG9yIHRvIGEgUkdCRiBpbWFnZSBhbmQgY29udmVydCB0byAyNC1iaXQgUkdCPGJyPgorVXNlciBwYXJhbWV0ZXJzIGNvbnRyb2wgaW50ZW5zaXR5LCBjb250cmFzdCwgYW5kIGxldmVsIG9mIGFkYXB0YXRpb24KK0BwYXJhbSBzcmMgSW5wdXQgUkdCRiBpbWFnZQorQHBhcmFtIGludGVuc2l0eSBPdmVyYWxsIGludGVuc2l0eSBpbiByYW5nZSBbLTg6OF0gOiBkZWZhdWx0IHRvIDAKK0BwYXJhbSBjb250cmFzdCBDb250cmFzdCBpbiByYW5nZSBbMC4zOjEpIDogZGVmYXVsdCB0byAwCitAcGFyYW0gYWRhcHRhdGlvbiBBZGFwdGF0aW9uIGluIHJhbmdlIFswOjFdIDogZGVmYXVsdCB0byAxCitAcGFyYW0gY29sb3JfY29ycmVjdGlvbiBDb2xvciBjb3JyZWN0aW9uIGluIHJhbmdlIFswOjFdIDogZGVmYXVsdCB0byAwCitAcmV0dXJuIFJldHVybnMgYSAyNC1iaXQgUkdCIGltYWdlIGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgTlVMTCBvdGhlcndpc2UKKyovCitGSUJJVE1BUCogRExMX0NBTExDT05WIAorRnJlZUltYWdlX1Rtb1JlaW5oYXJkMDVFeChGSUJJVE1BUCAqc3JjLCBkb3VibGUgaW50ZW5zaXR5LCBkb3VibGUgY29udHJhc3QsIGRvdWJsZSBhZGFwdGF0aW9uLCBkb3VibGUgY29sb3JfY29ycmVjdGlvbikgeworCWlmKCFGcmVlSW1hZ2VfSGFzUGl4ZWxzKHNyYykpIHJldHVybiBOVUxMOworCisJLy8gd29ya2luZyBSR0JGIHZhcmlhYmxlCisJRklCSVRNQVAgKmRpYiA9IE5VTEwsICpZID0gTlVMTDsKKworCWRpYiA9IEZyZWVJbWFnZV9Db252ZXJ0VG9SR0JGKHNyYyk7CisJaWYoIWRpYikgcmV0dXJuIE5VTEw7CisKKwkvLyBnZXQgdGhlIEx1bWluYW5jZSBjaGFubmVsCisJWSA9IENvbnZlcnRSR0JGVG9ZKGRpYik7CisJaWYoIVkpIHsKKwkJRnJlZUltYWdlX1VubG9hZChkaWIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvLyBwZXJmb3JtIHRoZSB0b25lIG1hcHBpbmcKKwlUb25lTWFwcGluZ1JlaW5oYXJkMDUoZGliLCBZLCAoZmxvYXQpaW50ZW5zaXR5LCAoZmxvYXQpY29udHJhc3QsIChmbG9hdClhZGFwdGF0aW9uLCAoZmxvYXQpY29sb3JfY29ycmVjdGlvbik7CisJLy8gbm90IG5lZWRlZCBhbnltb3JlCisJRnJlZUltYWdlX1VubG9hZChZKTsKKwkvLyBjbGFtcCBpbWFnZSBoaWdoZXN0IHZhbHVlcyB0byBkaXNwbGF5IHdoaXRlLCB0aGVuIGNvbnZlcnQgdG8gMjQtYml0IFJHQgorCUZJQklUTUFQICpkc3QgPSBDbGFtcENvbnZlcnRSR0JGVG8yNChkaWIpOworCisJLy8gY2xlYW4tdXAgYW5kIHJldHVybgorCUZyZWVJbWFnZV9VbmxvYWQoZGliKTsKKworCS8vIGNvcHkgbWV0YWRhdGEgZnJvbSBzcmMgdG8gZHN0CisJRnJlZUltYWdlX0Nsb25lTWV0YWRhdGEoZHN0LCBzcmMpOworCisJcmV0dXJuIGRzdDsKK30KKworLyoqCitBcHBseSB0aGUgZ2xvYmFsIHRvbmUgbWFwcGluZyBvcGVyYXRvciB0byBhIFJHQkYgaW1hZ2UgYW5kIGNvbnZlcnQgdG8gMjQtYml0IFJHQjxicj4KK1VzZXIgcGFyYW1ldGVycyBjb250cm9sIGludGVuc2l0eSBhbmQgY29udHJhc3QKK0BwYXJhbSBzcmMgSW5wdXQgUkdCRiBpbWFnZQorQHBhcmFtIGludGVuc2l0eSBPdmVyYWxsIGludGVuc2l0eSBpbiByYW5nZSBbLTg6OF0gOiBkZWZhdWx0IHRvIDAKK0BwYXJhbSBjb250cmFzdCBDb250cmFzdCBpbiByYW5nZSBbMC4zOjEpIDogZGVmYXVsdCB0byAwCitAcmV0dXJuIFJldHVybnMgYSAyNC1iaXQgUkdCIGltYWdlIGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgTlVMTCBvdGhlcndpc2UKKyovCitGSUJJVE1BUCogRExMX0NBTExDT05WIAorRnJlZUltYWdlX1Rtb1JlaW5oYXJkMDUoRklCSVRNQVAgKnNyYywgZG91YmxlIGludGVuc2l0eSwgZG91YmxlIGNvbnRyYXN0KSB7CisJcmV0dXJuIEZyZWVJbWFnZV9UbW9SZWluaGFyZDA1RXgoc3JjLCBpbnRlbnNpdHksIGNvbnRyYXN0LCAxLCAwKTsKK30KZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2VJTy5oIGIvZmlsZXMvU291cmNlL0ZyZWVJbWFnZUlPLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg0NmI1YgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2VJTy5oCkBAIC0wLDAgKzEsNjMgQEAKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIElucHV0L091dHB1dCBmdW5jdGlvbnMKKy8vCisvLyBEZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIGJ5CisvLyAtIEZsb3JpcyB2YW4gZGVuIEJlcmcgKGZsdmRiZXJnQHd4cy5ubCkKKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBGcmVlSW1hZ2UgMworLy8KKy8vIENPVkVSRUQgQ09ERSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWQorLy8gT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMKKy8vIFRIQVQgVEhFIENPVkVSRUQgQ09ERSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLy8gT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQKKy8vIENPREUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkgQ09WRVJFRCBDT0RFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QKKy8vIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZCisvLyBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMCisvLyBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GIEFOWSBDT1ZFUkVEIENPREUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSCisvLyBUSElTIERJU0NMQUlNRVIuCisvLworLy8gVXNlIGF0IHlvdXIgb3duIHJpc2shCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpZm5kZWYgRlJFRUlNQUdFSU9fSAorI2RlZmluZSBGUkVFSU1BR0VJT19ICisKKyNpZm5kZWYgRlJFRUlNQUdFX0gKKyNpbmNsdWRlICJGcmVlSW1hZ2UuaCIKKyNlbmRpZgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0ZJX1NUUlVDVCAoRklNRU1PUllIRUFERVIpIHsKKwkvKioKKwlGbGFnIHVzZWQgdG8gcmVtZW1iZXIgdG8gZGVsZXRlIHRoZSAnZGF0YScgYnVmZmVyLgorCVdoZW4gdGhlIGJ1ZmZlciBpcyBhIHdyYXBwZWQgYnVmZmVyLCBpdCBpcyByZWFkLW9ubHksIG5vIG5lZWQgdG8gZGVsZXRlIGl0LiAKKwlXaGVuIHRoZSBidWZmZXIgaXMgYSByZWFkL3dyaXRlIGJ1ZmZlciwgaXQgaXMgYWxsb2NhdGVkIGR5bmFtaWNhbGx5IGFuZCBtdXN0IGJlIGRlbGV0ZWQgd2hlbiBubyBsb25nZXIgbmVlZGVkLgorCSovCisJQk9PTCBkZWxldGVfbWU7CisJLyoqCisJZmlsZV9sZW5ndGggaXMgZXF1YWwgdG8gdGhlIGlucHV0IGJ1ZmZlciBzaXplIHdoZW4gdGhlIGJ1ZmZlciBpcyBhIHdyYXBwZWQgYnVmZmVyLCBpLmUuIGZpbGVfbGVuZ3RoID09IGRhdGFfbGVuZ3RoLiAKKwlmaWxlX2xlbmd0aCBpcyB0aGUgYW1vdW50IG9mIHRoZSB3cml0dGVuIGJ5dGVzIHdoZW4gdGhlIGJ1ZmZlciBpcyBhIHJlYWQvd3JpdGUgYnVmZmVyLgorCSovCisJbG9uZyBmaWxlX2xlbmd0aDsKKwkvKioKKwlXaGVuIHVzaW5nIHJlYWQtb25seSBpbnB1dCBidWZmZXJzLCBkYXRhX2xlbmd0aCBpcyBlcXVhbCB0byB0aGUgaW5wdXQgYnVmZmVyIHNpemUsIGkuZS4gdGhlIGZpbGVfbGVuZ3RoLgorCVdoZW4gdXNpbmcgcmVhZC93cml0ZSBidWZmZXJzLCBkYXRhX2xlbmd0aCBpcyB0aGUgc2l6ZSBvZiB0aGUgYWxsb2NhdGVkIGJ1ZmZlciwgCisJd2hvc2Ugc2l6ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gZmlsZV9sZW5ndGguCisJKi8KKwlsb25nIGRhdGFfbGVuZ3RoOworCS8qKgorCXN0YXJ0IGJ1ZmZlciBhZGRyZXNzCisJKi8KKwl2b2lkICpkYXRhOworCS8qKgorCUN1cnJlbnQgcG9zaXRpb24gaW50byB0aGUgbWVtb3J5IHN0cmVhbQorCSovCisJbG9uZyBjdXJyZW50X3Bvc2l0aW9uOworfTsKKwordm9pZCBTZXREZWZhdWx0SU8oRnJlZUltYWdlSU8gKmlvKTsKKwordm9pZCBTZXRNZW1vcnlJTyhGcmVlSW1hZ2VJTyAqaW8pOworCisjZW5kaWYgLy8gIUZSRUVJTUFHRUlPX0gKZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2VUb29sa2l0L0JTcGxpbmVSb3RhdGUuY3BwIGIvZmlsZXMvU291cmNlL0ZyZWVJbWFnZVRvb2xraXQvQlNwbGluZVJvdGF0ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkwZGI4NwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2VUb29sa2l0L0JTcGxpbmVSb3RhdGUuY3BwCkBAIC0wLDAgKzEsNzMwIEBACisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBCaXRtYXAgcm90YXRpb24gdXNpbmcgQi1TcGxpbmVzCisvLworLy8gRGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBieQorLy8gLSBQaGlsaXBwZSBUaOl2ZW5heiAocGhpbGlwcGUudGhldmVuYXpAZXBmbC5jaCkKKy8vIEFkYXB0YXRpb24gZm9yIEZyZWVJbWFnZSBieQorLy8gLSBIZXJ26SBEcm9sb24gKGRyb2xvbkBpbmZvbmllLmZyKQorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZyZWVJbWFnZSAzCisvLworLy8gQ09WRVJFRCBDT0RFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZCisvLyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUworLy8gVEhBVCBUSEUgQ09WRVJFRCBDT0RFIElTIEZSRUUgT0YgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisvLyBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRAorLy8gQ09ERSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVAorLy8gVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GIEFOWSBORUNFU1NBUlkKKy8vIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwKKy8vIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIKKy8vIFRISVMgRElTQ0xBSU1FUi4KKy8vCisvLyBVc2UgYXQgeW91ciBvd24gcmlzayEKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLyogCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitUaGlzIGNvZGUgd2FzIHRha2VuIGFuZCBhZGFwdGVkIGZyb20gdGhlIGZvbGxvd2luZyByZWZlcmVuY2UgOiAKKworWzFdIFBoaWxpcHBlIFRo6XZlbmF6LCBTcGxpbmUgaW50ZXJwb2xhdGlvbiwgYSBDIHNvdXJjZSBjb2RlIAoraW1wbGVtZW50YXRpb24uIGh0dHA6Ly9iaWd3d3cuZXBmbC5jaC90aGV2ZW5hei8KKworSXQgaW1wbGVtZW50cyBpZGVhcyBkZXNjcmliZWQgaW4gdGhlIGZvbGxvd2luZyBwYXBlcnMgOiAKKworWzJdIFVuc2VyIE0uLCBTcGxpbmVzOiBBIFBlcmZlY3QgRml0IGZvciBTaWduYWwgYW5kIEltYWdlIFByb2Nlc3NpbmcuIAorSUVFRSBTaWduYWwgUHJvY2Vzc2luZyBNYWdhemluZSwgdm9sLiAxNiwgbm8uIDYsIHBwLiAyMi0zOCwgTm92ZW1iZXIgMTk5OS4gCisKK1szXSBVbnNlciBNLiwgQWxkcm91YmkgQS4sIEVkZW4gTS4sIEItU3BsaW5lIFNpZ25hbCBQcm9jZXNzaW5nOiBQYXJ0IEktLVRoZW9yeS4KK0lFRUUgVHJhbnNhY3Rpb25zIG9uIFNpZ25hbCBQcm9jZXNzaW5nLCB2b2wuIDQxLCBuby4gMiwgcHAuIDgyMS04MzIsIEZlYnJ1YXJ5IDE5OTMuIAorCitbNF0gVW5zZXIgTS4sIEFsZHJvdWJpIEEuLCBFZGVuIE0uLCBCLVNwbGluZSBTaWduYWwgUHJvY2Vzc2luZzogUGFydCBJSS0tRWZmaWNpZW50IERlc2lnbiBhbmQgQXBwbGljYXRpb25zLgorSUVFRSBUcmFuc2FjdGlvbnMgb24gU2lnbmFsIFByb2Nlc3NpbmcsIHZvbC4gNDEsIG5vLiAyLCBwcC4gODM0LTg0OCwgRmVicnVhcnkgMTk5My4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAKKyovCisKKworI2luY2x1ZGUgPGZsb2F0Lmg+CisjaW5jbHVkZSAiRnJlZUltYWdlLmgiCisjaW5jbHVkZSAiVXRpbGl0aWVzLmgiCisKKyNkZWZpbmUgUEkJKChkb3VibGUpMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjI2NDMzODMyNzk1MDI4ODQxOTcxNjkzOTkzNzUxMCkKKworI2RlZmluZSBST1RBVEVfUVVBRFJBVElDIDJMCS8vIFVzZSBCLXNwbGluZXMgb2YgZGVncmVlIDIgKHF1YWRyYXRpYyBpbnRlcnBvbGF0aW9uKQorI2RlZmluZSBST1RBVEVfQ1VCSUMgICAgIDNMCS8vIFVzZSBCLXNwbGluZXMgb2YgZGVncmVlIDMgKGN1YmljIGludGVycG9sYXRpb24pCisjZGVmaW5lIFJPVEFURV9RVUFSVElDICAgNEwJLy8gVXNlIEItc3BsaW5lcyBvZiBkZWdyZWUgNCAocXVhcnRpYyBpbnRlcnBvbGF0aW9uKQorI2RlZmluZSBST1RBVEVfUVVJTlRJQyAgIDVMCS8vIFVzZSBCLXNwbGluZXMgb2YgZGVncmVlIDUgKHF1aW50aWMgaW50ZXJwb2xhdGlvbikKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBQcm90b3R5cGVzIGRlZmluaXRpb24KKworc3RhdGljIHZvaWQgQ29udmVydFRvSW50ZXJwb2xhdGlvbkNvZWZmaWNpZW50cyhkb3VibGUgKmMsIGxvbmcgRGF0YUxlbmd0aCwgZG91YmxlICp6LCBsb25nIE5iUG9sZXMsCWRvdWJsZSBUb2xlcmFuY2UpOworc3RhdGljIGRvdWJsZSBJbml0aWFsQ2F1c2FsQ29lZmZpY2llbnQoZG91YmxlICpjLCBsb25nIERhdGFMZW5ndGgsIGRvdWJsZSB6LCBkb3VibGUgVG9sZXJhbmNlKTsKK3N0YXRpYyB2b2lkIEdldENvbHVtbihkb3VibGUgKkltYWdlLCBsb25nIFdpZHRoLCBsb25nIHgsIGRvdWJsZSAqTGluZSwgbG9uZyBIZWlnaHQpOworc3RhdGljIHZvaWQJR2V0Um93KGRvdWJsZSAqSW1hZ2UsIGxvbmcgeSwgZG91YmxlICpMaW5lLCBsb25nIFdpZHRoKTsKK3N0YXRpYyBkb3VibGUgSW5pdGlhbEFudGlDYXVzYWxDb2VmZmljaWVudChkb3VibGUgKmMsIGxvbmcgRGF0YUxlbmd0aCwgZG91YmxlIHopOworc3RhdGljIHZvaWQJUHV0Q29sdW1uKGRvdWJsZSAqSW1hZ2UsIGxvbmcgV2lkdGgsIGxvbmcgeCwgZG91YmxlICpMaW5lLCBsb25nIEhlaWdodCk7CitzdGF0aWMgdm9pZAlQdXRSb3coZG91YmxlICpJbWFnZSwgbG9uZyB5LCBkb3VibGUgKkxpbmUsIGxvbmcgV2lkdGgpOworc3RhdGljIGJvb2wgU2FtcGxlc1RvQ29lZmZpY2llbnRzKGRvdWJsZSAqSW1hZ2UsIGxvbmcgV2lkdGgsIGxvbmcgSGVpZ2h0LCBsb25nIHNwbGluZV9kZWdyZWUpOworc3RhdGljIGRvdWJsZSBJbnRlcnBvbGF0ZWRWYWx1ZShkb3VibGUgKkJjb2VmZiwgbG9uZyBXaWR0aCwgbG9uZyBIZWlnaHQsIGRvdWJsZSB4LCBkb3VibGUgeSwgbG9uZyBzcGxpbmVfZGVncmVlKTsKKworc3RhdGljIEZJQklUTUFQICogUm90YXRlOEJpdChGSUJJVE1BUCAqZGliLCBkb3VibGUgYW5nbGUsIGRvdWJsZSB4X3NoaWZ0LCBkb3VibGUgeV9zaGlmdCwgZG91YmxlIHhfb3JpZ2luLCBkb3VibGUgeV9vcmlnaW4sIGxvbmcgc3BsaW5lX2RlZ3JlZSwgQk9PTCB1c2VfbWFzayk7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENvZWZmaWNpZW50cyByb3V0aW5lcworCisvKioKKyBDb252ZXJ0VG9JbnRlcnBvbGF0aW9uQ29lZmZpY2llbnRzCisKKyBAcGFyYW0gYyBJbnB1dCBzYW1wbGVzIC0tPiBvdXRwdXQgY29lZmZpY2llbnRzCisgQHBhcmFtIERhdGFMZW5ndGggTnVtYmVyIG9mIHNhbXBsZXMgb3IgY29lZmZpY2llbnRzCisgQHBhcmFtIHogUG9sZXMKKyBAcGFyYW0gTmJQb2xlcyBOdW1iZXIgb2YgcG9sZXMKKyBAcGFyYW0gVG9sZXJhbmNlIEFkbWlzc2libGUgcmVsYXRpdmUgZXJyb3IKKyovCitzdGF0aWMgdm9pZCAKK0NvbnZlcnRUb0ludGVycG9sYXRpb25Db2VmZmljaWVudHMoZG91YmxlICpjLCBsb25nIERhdGFMZW5ndGgsIGRvdWJsZSAqeiwgbG9uZyBOYlBvbGVzLAlkb3VibGUgVG9sZXJhbmNlKSB7CisJZG91YmxlCUxhbWJkYSA9IDE7CisJbG9uZwluLCBrOworCisJLy8gc3BlY2lhbCBjYXNlIHJlcXVpcmVkIGJ5IG1pcnJvciBib3VuZGFyaWVzCisJaWYoRGF0YUxlbmd0aCA9PSAxTCkgeworCQlyZXR1cm47CisJfQorCS8vIGNvbXB1dGUgdGhlIG92ZXJhbGwgZ2FpbgorCWZvcihrID0gMEw7IGsgPCBOYlBvbGVzOyBrKyspIHsKKwkJTGFtYmRhID0gTGFtYmRhICogKDEuMCAtIHpba10pICogKDEuMCAtIDEuMCAvIHpba10pOworCX0KKwkvLyBhcHBseSB0aGUgZ2FpbiAKKwlmb3IgKG4gPSAwTDsgbiA8IERhdGFMZW5ndGg7IG4rKykgeworCQljW25dICo9IExhbWJkYTsKKwl9CisJLy8gbG9vcCBvdmVyIGFsbCBwb2xlcyAKKwlmb3IgKGsgPSAwTDsgayA8IE5iUG9sZXM7IGsrKykgeworCQkvLyBjYXVzYWwgaW5pdGlhbGl6YXRpb24gCisJCWNbMF0gPSBJbml0aWFsQ2F1c2FsQ29lZmZpY2llbnQoYywgRGF0YUxlbmd0aCwgeltrXSwgVG9sZXJhbmNlKTsKKwkJLy8gY2F1c2FsIHJlY3Vyc2lvbiAKKwkJZm9yIChuID0gMUw7IG4gPCBEYXRhTGVuZ3RoOyBuKyspIHsKKwkJCWNbbl0gKz0geltrXSAqIGNbbiAtIDFMXTsKKwkJfQorCQkvLyBhbnRpY2F1c2FsIGluaXRpYWxpemF0aW9uIAorCQljW0RhdGFMZW5ndGggLSAxTF0gPSBJbml0aWFsQW50aUNhdXNhbENvZWZmaWNpZW50KGMsIERhdGFMZW5ndGgsIHpba10pOworCQkvLyBhbnRpY2F1c2FsIHJlY3Vyc2lvbiAKKwkJZm9yIChuID0gRGF0YUxlbmd0aCAtIDJMOyAwIDw9IG47IG4tLSkgeworCQkJY1tuXSA9IHpba10gKiAoY1tuICsgMUxdIC0gY1tuXSk7CisJCX0KKwl9Cit9IAorCisvKioKKyBJbml0aWFsQ2F1c2FsQ29lZmZpY2llbnQKKworIEBwYXJhbSBjIENvZWZmaWNpZW50cworIEBwYXJhbSBEYXRhTGVuZ3RoIE51bWJlciBvZiBjb2VmZmljaWVudHMKKyBAcGFyYW0geiBBY3R1YWwgcG9sZQorIEBwYXJhbSBUb2xlcmFuY2UgQWRtaXNzaWJsZSByZWxhdGl2ZSBlcnJvcgorIEByZXR1cm4KKyovCitzdGF0aWMgZG91YmxlIAorSW5pdGlhbENhdXNhbENvZWZmaWNpZW50KGRvdWJsZQkqYywgbG9uZyBEYXRhTGVuZ3RoLCBkb3VibGUJeiwgZG91YmxlIFRvbGVyYW5jZSkgeworCWRvdWJsZQlTdW0sIHpuLCB6Mm4sIGl6OworCWxvbmcJbiwgSG9yaXpvbjsKKworCS8vIHRoaXMgaW5pdGlhbGl6YXRpb24gY29ycmVzcG9uZHMgdG8gbWlycm9yIGJvdW5kYXJpZXMgCisJSG9yaXpvbiA9IERhdGFMZW5ndGg7CisJaWYoVG9sZXJhbmNlID4gMCkgeworCQlIb3Jpem9uID0gKGxvbmcpY2VpbChsb2coVG9sZXJhbmNlKSAvIGxvZyhmYWJzKHopKSk7CisJfQorCWlmKEhvcml6b24gPCBEYXRhTGVuZ3RoKSB7CisJCS8vIGFjY2VsZXJhdGVkIGxvb3AKKwkJem4gPSB6OworCQlTdW0gPSBjWzBdOworCQlmb3IgKG4gPSAxTDsgbiA8IEhvcml6b247IG4rKykgeworCQkJU3VtICs9IHpuICogY1tuXTsKKwkJCXpuICo9IHo7CisJCX0KKwkJcmV0dXJuKFN1bSk7CisJfQorCWVsc2UgeworCQkvLyBmdWxsIGxvb3AgCisJCXpuID0gejsKKwkJaXogPSAxLjAgLyB6OworCQl6Mm4gPSBwb3coeiwgKGRvdWJsZSkoRGF0YUxlbmd0aCAtIDFMKSk7CisJCVN1bSA9IGNbMF0gKyB6Mm4gKiBjW0RhdGFMZW5ndGggLSAxTF07CisJCXoybiAqPSB6Mm4gKiBpejsKKwkJZm9yIChuID0gMUw7IG4gPD0gRGF0YUxlbmd0aCAtIDJMOyBuKyspIHsKKwkJCVN1bSArPSAoem4gKyB6Mm4pICogY1tuXTsKKwkJCXpuICo9IHo7CisJCQl6Mm4gKj0gaXo7CisJCX0KKwkJcmV0dXJuKFN1bSAvICgxLjAgLSB6biAqIHpuKSk7CisJfQorfQorCisvKioKKyBHZXRDb2x1bW4KKworIEBwYXJhbSBJbWFnZSBJbnB1dCBpbWFnZSBhcnJheQorIEBwYXJhbSBXaWR0aCBXaWR0aCBvZiB0aGUgaW1hZ2UKKyBAcGFyYW0geCB4IGNvb3JkaW5hdGUgb2YgdGhlIHNlbGVjdGVkIGxpbmUKKyBAcGFyYW0gTGluZSBPdXRwdXQgbGluZWFyIGFycmF5CisgQHBhcmFtIEhlaWdodCBMZW5ndGggb2YgdGhlIGxpbmUKKyovCitzdGF0aWMgdm9pZCAKK0dldENvbHVtbihkb3VibGUgKkltYWdlLCBsb25nIFdpZHRoLCBsb25nIHgsIGRvdWJsZSAqTGluZSwgbG9uZyBIZWlnaHQpIHsKKwlsb25nIHk7CisKKwlJbWFnZSA9IEltYWdlICsgeDsKKwlmb3IoeSA9IDBMOyB5IDwgSGVpZ2h0OyB5KyspIHsKKwkJTGluZVt5XSA9IChkb3VibGUpKkltYWdlOworCQlJbWFnZSArPSBXaWR0aDsKKwl9Cit9CisKKy8qKgorIEdldFJvdworCisgQHBhcmFtIEltYWdlIElucHV0IGltYWdlIGFycmF5CisgQHBhcmFtIHkgeSBjb29yZGluYXRlIG9mIHRoZSBzZWxlY3RlZCBsaW5lCisgQHBhcmFtIExpbmUgT3V0cHV0IGxpbmVhciBhcnJheQorIEBwYXJhbSBXaWR0aCBMZW5ndGggb2YgdGhlIGxpbmUKKyovCitzdGF0aWMgdm9pZAkKK0dldFJvdyhkb3VibGUgKkltYWdlLCBsb25nIHksIGRvdWJsZSAqTGluZSwgbG9uZyBXaWR0aCkgeworCWxvbmcJeDsKKworCUltYWdlID0gSW1hZ2UgKyAoeSAqIFdpZHRoKTsKKwlmb3IoeCA9IDBMOyB4IDwgV2lkdGg7IHgrKykgeworCQlMaW5lW3hdID0gKGRvdWJsZSkqSW1hZ2UrKzsKKwl9Cit9CisKKy8qKgorIEluaXRpYWxBbnRpQ2F1c2FsQ29lZmZpY2llbnQKKworIEBwYXJhbSBjIENvZWZmaWNpZW50cworIEBwYXJhbSBEYXRhTGVuZ3RoIE51bWJlciBvZiBzYW1wbGVzIG9yIGNvZWZmaWNpZW50cworIEBwYXJhbSB6IEFjdHVhbCBwb2xlCisgQHJldHVybgorKi8KK3N0YXRpYyBkb3VibGUgCitJbml0aWFsQW50aUNhdXNhbENvZWZmaWNpZW50KGRvdWJsZQkqYywgbG9uZyBEYXRhTGVuZ3RoLCBkb3VibGUJeikgeworCS8vIHRoaXMgaW5pdGlhbGl6YXRpb24gY29ycmVzcG9uZHMgdG8gbWlycm9yIGJvdW5kYXJpZXMKKwlyZXR1cm4oKHogLyAoeiAqIHogLSAxLjApKSAqICh6ICogY1tEYXRhTGVuZ3RoIC0gMkxdICsgY1tEYXRhTGVuZ3RoIC0gMUxdKSk7Cit9CisKKy8qKgorIFB1dENvbHVtbgorCisgQHBhcmFtIEltYWdlIE91dHB1dCBpbWFnZSBhcnJheQorIEBwYXJhbSBXaWR0aCBXaWR0aCBvZiB0aGUgaW1hZ2UKKyBAcGFyYW0geCB4IGNvb3JkaW5hdGUgb2YgdGhlIHNlbGVjdGVkIGxpbmUKKyBAcGFyYW0gTGluZSBJbnB1dCBsaW5lYXIgYXJyYXkKKyBAcGFyYW0gSGVpZ2h0IExlbmd0aCBvZiB0aGUgbGluZSBhbmQgaGVpZ2h0IG9mIHRoZSBpbWFnZQorKi8KK3N0YXRpYyB2b2lkCQorUHV0Q29sdW1uKGRvdWJsZSAqSW1hZ2UsIGxvbmcgV2lkdGgsIGxvbmcgeCwgZG91YmxlICpMaW5lLCBsb25nIEhlaWdodCkgeworCWxvbmcJeTsKKworCUltYWdlID0gSW1hZ2UgKyB4OworCWZvcih5ID0gMEw7IHkgPCBIZWlnaHQ7IHkrKykgeworCQkqSW1hZ2UgPSAoZG91YmxlKUxpbmVbeV07CisJCUltYWdlICs9IFdpZHRoOworCX0KK30KKworLyoqCisgUHV0Um93CisKKyBAcGFyYW0gSW1hZ2UgT3V0cHV0IGltYWdlIGFycmF5CisgQHBhcmFtIHkgeSBjb29yZGluYXRlIG9mIHRoZSBzZWxlY3RlZCBsaW5lCisgQHBhcmFtIExpbmUgSW5wdXQgbGluZWFyIGFycmF5CisgQHBhcmFtIFdpZHRoIGxlbmd0aCBvZiB0aGUgbGluZSBhbmQgd2lkdGggb2YgdGhlIGltYWdlCisqLworc3RhdGljIHZvaWQJCitQdXRSb3coZG91YmxlICpJbWFnZSwgbG9uZyB5LCBkb3VibGUgKkxpbmUsIGxvbmcgV2lkdGgpIHsKKwlsb25nCXg7CisKKwlJbWFnZSA9IEltYWdlICsgKHkgKiBXaWR0aCk7CisJZm9yKHggPSAwTDsgeCA8IFdpZHRoOyB4KyspIHsKKwkJKkltYWdlKysgPSAoZG91YmxlKUxpbmVbeF07CisJfQorfQorCisvKioKKyBTYW1wbGVzVG9Db2VmZmljaWVudHMuPGJyPgorIEltcGxlbWVudCB0aGUgYWxnb3JpdGhtIHRoYXQgY29udmVydHMgdGhlIGltYWdlIHNhbXBsZXMgaW50byBCLXNwbGluZSBjb2VmZmljaWVudHMuIAorIFRoaXMgZWZmaWNpZW50IHByb2NlZHVyZSBlc3NlbnRpYWxseSByZWxpZXMgb24gdGhlIHRocmVlIHBhcGVycyBjaXRlZCBhYm92ZTsgCisgZGF0YSBhcmUgcHJvY2Vzc2VkIGluLXBsYWNlLiAKKyBFdmVuIHRob3VnaCB0aGlzIGFsZ29yaXRobSBpcyByb2J1c3Qgd2l0aCByZXNwZWN0IHRvIHF1YW50aXphdGlvbiwgCisgd2UgYWR2b2NhdGUgdGhlIHVzZSBvZiBhIGZsb2F0aW5nLXBvaW50IGZvcm1hdCBmb3IgdGhlIGRhdGEuIAorCisgQHBhcmFtIEltYWdlIElucHV0IC8gT3V0cHV0IGltYWdlIChpbi1wbGFjZSBwcm9jZXNzaW5nKQorIEBwYXJhbSBXaWR0aCBXaWR0aCBvZiB0aGUgaW1hZ2UKKyBAcGFyYW0gSGVpZ2h0IEhlaWdodCBvZiB0aGUgaW1hZ2UKKyBAcGFyYW0gc3BsaW5lX2RlZ3JlZSBEZWdyZWUgb2YgdGhlIHNwbGluZSBtb2RlbAorIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZQorKi8KK3N0YXRpYyBib29sCQorU2FtcGxlc1RvQ29lZmZpY2llbnRzKGRvdWJsZSAqSW1hZ2UsIGxvbmcgV2lkdGgsIGxvbmcgSGVpZ2h0LCBsb25nIHNwbGluZV9kZWdyZWUpIHsKKwlkb3VibGUJKkxpbmU7CisJZG91YmxlCVBvbGVbMl07CisJbG9uZwlOYlBvbGVzOworCWxvbmcJeCwgeTsKKworCS8vIHJlY292ZXIgdGhlIHBvbGVzIGZyb20gYSBsb29rdXAgdGFibGUKKwlzd2l0Y2ggKHNwbGluZV9kZWdyZWUpIHsKKwkJY2FzZSAyTDoKKwkJCU5iUG9sZXMgPSAxTDsKKwkJCVBvbGVbMF0gPSBzcXJ0KDguMCkgLSAzLjA7CisJCQlicmVhazsKKwkJY2FzZSAzTDoKKwkJCU5iUG9sZXMgPSAxTDsKKwkJCVBvbGVbMF0gPSBzcXJ0KDMuMCkgLSAyLjA7CisJCQlicmVhazsKKwkJY2FzZSA0TDoKKwkJCU5iUG9sZXMgPSAyTDsKKwkJCVBvbGVbMF0gPSBzcXJ0KDY2NC4wIC0gc3FydCg0Mzg5NzYuMCkpICsgc3FydCgzMDQuMCkgLSAxOS4wOworCQkJUG9sZVsxXSA9IHNxcnQoNjY0LjAgKyBzcXJ0KDQzODk3Ni4wKSkgLSBzcXJ0KDMwNC4wKSAtIDE5LjA7CisJCQlicmVhazsKKwkJY2FzZSA1TDoKKwkJCU5iUG9sZXMgPSAyTDsKKwkJCVBvbGVbMF0gPSBzcXJ0KDEzNS4wIC8gMi4wIC0gc3FydCgxNzc0NS4wIC8gNC4wKSkgKyBzcXJ0KDEwNS4wIC8gNC4wKQorCQkJCS0gMTMuMCAvIDIuMDsKKwkJCVBvbGVbMV0gPSBzcXJ0KDEzNS4wIC8gMi4wICsgc3FydCgxNzc0NS4wIC8gNC4wKSkgLSBzcXJ0KDEwNS4wIC8gNC4wKQorCQkJCS0gMTMuMCAvIDIuMDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLy8gSW52YWxpZCBzcGxpbmUgZGVncmVlCisJCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLy8gY29udmVydCB0aGUgaW1hZ2Ugc2FtcGxlcyBpbnRvIGludGVycG9sYXRpb24gY29lZmZpY2llbnRzIAorCisJLy8gaW4tcGxhY2Ugc2VwYXJhYmxlIHByb2Nlc3MsIGFsb25nIHggCisJTGluZSA9IChkb3VibGUgKiltYWxsb2MoV2lkdGggKiBzaXplb2YoZG91YmxlKSk7CisJaWYgKExpbmUgPT0gTlVMTCkgeworCQkvLyBSb3cgYWxsb2NhdGlvbiBmYWlsZWQKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlmb3IgKHkgPSAwTDsgeSA8IEhlaWdodDsgeSsrKSB7CisJCUdldFJvdyhJbWFnZSwgeSwgTGluZSwgV2lkdGgpOworCQlDb252ZXJ0VG9JbnRlcnBvbGF0aW9uQ29lZmZpY2llbnRzKExpbmUsIFdpZHRoLCBQb2xlLCBOYlBvbGVzLCBEQkxfRVBTSUxPTik7CisJCVB1dFJvdyhJbWFnZSwgeSwgTGluZSwgV2lkdGgpOworCX0KKwlmcmVlKExpbmUpOworCisJLy8gaW4tcGxhY2Ugc2VwYXJhYmxlIHByb2Nlc3MsIGFsb25nIHkgCisJTGluZSA9IChkb3VibGUgKiltYWxsb2MoSGVpZ2h0ICogc2l6ZW9mKGRvdWJsZSkpOworCWlmIChMaW5lID09IE5VTEwpIHsKKwkJLy8gQ29sdW1uIGFsbG9jYXRpb24gZmFpbGVkCisJCXJldHVybiBmYWxzZTsKKwl9CisJZm9yICh4ID0gMEw7IHggPCBXaWR0aDsgeCsrKSB7CisJCUdldENvbHVtbihJbWFnZSwgV2lkdGgsIHgsIExpbmUsIEhlaWdodCk7CisJCUNvbnZlcnRUb0ludGVycG9sYXRpb25Db2VmZmljaWVudHMoTGluZSwgSGVpZ2h0LCBQb2xlLCBOYlBvbGVzLCBEQkxfRVBTSUxPTik7CisJCVB1dENvbHVtbihJbWFnZSwgV2lkdGgsIHgsIExpbmUsIEhlaWdodCk7CisJfQorCWZyZWUoTGluZSk7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gSW50ZXJwb2xhdGlvbiByb3V0aW5lcworCisvKioKK1BlcmZvcm0gdGhlIGJpZGltZW5zaW9uYWwgaW50ZXJwb2xhdGlvbiBvZiBhbiBpbWFnZS4KK0dpdmVuIGFuIGFycmF5IG9mIHNwbGluZSBjb2VmZmljaWVudHMsIHJldHVybiB0aGUgdmFsdWUgb2YgCit0aGUgdW5kZXJseWluZyBjb250aW51b3VzIHNwbGluZSBtb2RlbCwgc2FtcGxlZCBhdCB0aGUgbG9jYXRpb24gKHgsIHkpLiAKK1RoZSBtb2RlbCBkZWdyZWUgY2FuIGJlIDIgKHF1YWRyYXRpYyksIDMgKGN1YmljKSwgNCAocXVhcnRpYyksIG9yIDUgKHF1aW50aWMpLgorCitAcGFyYW0gQmNvZWZmIElucHV0IEItc3BsaW5lIGFycmF5IG9mIGNvZWZmaWNpZW50cworQHBhcmFtIFdpZHRoIFdpZHRoIG9mIHRoZSBpbWFnZQorQHBhcmFtIEhlaWdodCBIZWlnaHQgb2YgdGhlIGltYWdlCitAcGFyYW0geCB4IGNvb3JkaW5hdGUgd2hlcmUgdG8gaW50ZXJwb2xhdGUKK0BwYXJhbSB5IHkgY29vcmRpbmF0ZSB3aGVyZSB0byBpbnRlcnBvbGF0ZQorQHBhcmFtIHNwbGluZV9kZWdyZWUgRGVncmVlIG9mIHRoZSBzcGxpbmUgbW9kZWwKK0ByZXR1cm4gUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHVuZGVybHlpbmcgY29udGludW91cyBzcGxpbmUgbW9kZWwsIAorc2FtcGxlZCBhdCB0aGUgbG9jYXRpb24gKHgsIHkpCisqLworc3RhdGljIGRvdWJsZSAKK0ludGVycG9sYXRlZFZhbHVlKGRvdWJsZSAqQmNvZWZmLCBsb25nIFdpZHRoLCBsb25nIEhlaWdodCwgZG91YmxlIHgsIGRvdWJsZSB5LCBsb25nIHNwbGluZV9kZWdyZWUpIHsKKwlkb3VibGUJKnA7CisJZG91YmxlCXhXZWlnaHRbNl0sIHlXZWlnaHRbNl07CisJZG91YmxlCWludGVycG9sYXRlZDsKKwlkb3VibGUJdywgdzIsIHc0LCB0LCB0MCwgdDE7CisJbG9uZwl4SW5kZXhbNl0sIHlJbmRleFs2XTsKKwlsb25nCVdpZHRoMiA9IDJMICogV2lkdGggLSAyTCwgSGVpZ2h0MiA9IDJMICogSGVpZ2h0IC0gMkw7CisJbG9uZwlpLCBqLCBrOworCisJLy8gY29tcHV0ZSB0aGUgaW50ZXJwb2xhdGlvbiBpbmRleGVzCisJaWYgKHNwbGluZV9kZWdyZWUgJiAxTCkgeworCQlpID0gKGxvbmcpZmxvb3IoeCkgLSBzcGxpbmVfZGVncmVlIC8gMkw7CisJCWogPSAobG9uZylmbG9vcih5KSAtIHNwbGluZV9kZWdyZWUgLyAyTDsKKwkJZm9yKGsgPSAwOyBrIDw9IHNwbGluZV9kZWdyZWU7IGsrKykgeworCQkJeEluZGV4W2tdID0gaSsrOworCQkJeUluZGV4W2tdID0gaisrOworCQl9CisJfQorCWVsc2UgeworCQlpID0gKGxvbmcpZmxvb3IoeCArIDAuNSkgLSBzcGxpbmVfZGVncmVlIC8gMkw7CisJCWogPSAobG9uZylmbG9vcih5ICsgMC41KSAtIHNwbGluZV9kZWdyZWUgLyAyTDsKKwkJZm9yIChrID0gMDsgayA8PSBzcGxpbmVfZGVncmVlOyBrKyspIHsKKwkJCXhJbmRleFtrXSA9IGkrKzsKKwkJCXlJbmRleFtrXSA9IGorKzsKKwkJfQorCX0KKworCS8vIGNvbXB1dGUgdGhlIGludGVycG9sYXRpb24gd2VpZ2h0cworCXN3aXRjaCAoc3BsaW5lX2RlZ3JlZSkgeworCQljYXNlIDJMOgorCQkJLyogeCAqLworCQkJdyA9IHggLSAoZG91YmxlKXhJbmRleFsxXTsKKwkJCXhXZWlnaHRbMV0gPSAzLjAgLyA0LjAgLSB3ICogdzsKKwkJCXhXZWlnaHRbMl0gPSAoMS4wIC8gMi4wKSAqICh3IC0geFdlaWdodFsxXSArIDEuMCk7CisJCQl4V2VpZ2h0WzBdID0gMS4wIC0geFdlaWdodFsxXSAtIHhXZWlnaHRbMl07CisJCQkvKiB5ICovCisJCQl3ID0geSAtIChkb3VibGUpeUluZGV4WzFdOworCQkJeVdlaWdodFsxXSA9IDMuMCAvIDQuMCAtIHcgKiB3OworCQkJeVdlaWdodFsyXSA9ICgxLjAgLyAyLjApICogKHcgLSB5V2VpZ2h0WzFdICsgMS4wKTsKKwkJCXlXZWlnaHRbMF0gPSAxLjAgLSB5V2VpZ2h0WzFdIC0geVdlaWdodFsyXTsKKwkJCWJyZWFrOworCQljYXNlIDNMOgorCQkJLyogeCAqLworCQkJdyA9IHggLSAoZG91YmxlKXhJbmRleFsxXTsKKwkJCXhXZWlnaHRbM10gPSAoMS4wIC8gNi4wKSAqIHcgKiB3ICogdzsKKwkJCXhXZWlnaHRbMF0gPSAoMS4wIC8gNi4wKSArICgxLjAgLyAyLjApICogdyAqICh3IC0gMS4wKSAtIHhXZWlnaHRbM107CisJCQl4V2VpZ2h0WzJdID0gdyArIHhXZWlnaHRbMF0gLSAyLjAgKiB4V2VpZ2h0WzNdOworCQkJeFdlaWdodFsxXSA9IDEuMCAtIHhXZWlnaHRbMF0gLSB4V2VpZ2h0WzJdIC0geFdlaWdodFszXTsKKwkJCS8qIHkgKi8KKwkJCXcgPSB5IC0gKGRvdWJsZSl5SW5kZXhbMV07CisJCQl5V2VpZ2h0WzNdID0gKDEuMCAvIDYuMCkgKiB3ICogdyAqIHc7CisJCQl5V2VpZ2h0WzBdID0gKDEuMCAvIDYuMCkgKyAoMS4wIC8gMi4wKSAqIHcgKiAodyAtIDEuMCkgLSB5V2VpZ2h0WzNdOworCQkJeVdlaWdodFsyXSA9IHcgKyB5V2VpZ2h0WzBdIC0gMi4wICogeVdlaWdodFszXTsKKwkJCXlXZWlnaHRbMV0gPSAxLjAgLSB5V2VpZ2h0WzBdIC0geVdlaWdodFsyXSAtIHlXZWlnaHRbM107CisJCQlicmVhazsKKwkJY2FzZSA0TDoKKwkJCS8qIHggKi8KKwkJCXcgPSB4IC0gKGRvdWJsZSl4SW5kZXhbMl07CisJCQl3MiA9IHcgKiB3OworCQkJdCA9ICgxLjAgLyA2LjApICogdzI7CisJCQl4V2VpZ2h0WzBdID0gMS4wIC8gMi4wIC0gdzsKKwkJCXhXZWlnaHRbMF0gKj0geFdlaWdodFswXTsKKwkJCXhXZWlnaHRbMF0gKj0gKDEuMCAvIDI0LjApICogeFdlaWdodFswXTsKKwkJCXQwID0gdyAqICh0IC0gMTEuMCAvIDI0LjApOworCQkJdDEgPSAxOS4wIC8gOTYuMCArIHcyICogKDEuMCAvIDQuMCAtIHQpOworCQkJeFdlaWdodFsxXSA9IHQxICsgdDA7CisJCQl4V2VpZ2h0WzNdID0gdDEgLSB0MDsKKwkJCXhXZWlnaHRbNF0gPSB4V2VpZ2h0WzBdICsgdDAgKyAoMS4wIC8gMi4wKSAqIHc7CisJCQl4V2VpZ2h0WzJdID0gMS4wIC0geFdlaWdodFswXSAtIHhXZWlnaHRbMV0gLSB4V2VpZ2h0WzNdIC0geFdlaWdodFs0XTsKKwkJCS8qIHkgKi8KKwkJCXcgPSB5IC0gKGRvdWJsZSl5SW5kZXhbMl07CisJCQl3MiA9IHcgKiB3OworCQkJdCA9ICgxLjAgLyA2LjApICogdzI7CisJCQl5V2VpZ2h0WzBdID0gMS4wIC8gMi4wIC0gdzsKKwkJCXlXZWlnaHRbMF0gKj0geVdlaWdodFswXTsKKwkJCXlXZWlnaHRbMF0gKj0gKDEuMCAvIDI0LjApICogeVdlaWdodFswXTsKKwkJCXQwID0gdyAqICh0IC0gMTEuMCAvIDI0LjApOworCQkJdDEgPSAxOS4wIC8gOTYuMCArIHcyICogKDEuMCAvIDQuMCAtIHQpOworCQkJeVdlaWdodFsxXSA9IHQxICsgdDA7CisJCQl5V2VpZ2h0WzNdID0gdDEgLSB0MDsKKwkJCXlXZWlnaHRbNF0gPSB5V2VpZ2h0WzBdICsgdDAgKyAoMS4wIC8gMi4wKSAqIHc7CisJCQl5V2VpZ2h0WzJdID0gMS4wIC0geVdlaWdodFswXSAtIHlXZWlnaHRbMV0gLSB5V2VpZ2h0WzNdIC0geVdlaWdodFs0XTsKKwkJCWJyZWFrOworCQljYXNlIDVMOgorCQkJLyogeCAqLworCQkJdyA9IHggLSAoZG91YmxlKXhJbmRleFsyXTsKKwkJCXcyID0gdyAqIHc7CisJCQl4V2VpZ2h0WzVdID0gKDEuMCAvIDEyMC4wKSAqIHcgKiB3MiAqIHcyOworCQkJdzIgLT0gdzsKKwkJCXc0ID0gdzIgKiB3MjsKKwkJCXcgLT0gMS4wIC8gMi4wOworCQkJdCA9IHcyICogKHcyIC0gMy4wKTsKKwkJCXhXZWlnaHRbMF0gPSAoMS4wIC8gMjQuMCkgKiAoMS4wIC8gNS4wICsgdzIgKyB3NCkgLSB4V2VpZ2h0WzVdOworCQkJdDAgPSAoMS4wIC8gMjQuMCkgKiAodzIgKiAodzIgLSA1LjApICsgNDYuMCAvIDUuMCk7CisJCQl0MSA9ICgtMS4wIC8gMTIuMCkgKiB3ICogKHQgKyA0LjApOworCQkJeFdlaWdodFsyXSA9IHQwICsgdDE7CisJCQl4V2VpZ2h0WzNdID0gdDAgLSB0MTsKKwkJCXQwID0gKDEuMCAvIDE2LjApICogKDkuMCAvIDUuMCAtIHQpOworCQkJdDEgPSAoMS4wIC8gMjQuMCkgKiB3ICogKHc0IC0gdzIgLSA1LjApOworCQkJeFdlaWdodFsxXSA9IHQwICsgdDE7CisJCQl4V2VpZ2h0WzRdID0gdDAgLSB0MTsKKwkJCS8qIHkgKi8KKwkJCXcgPSB5IC0gKGRvdWJsZSl5SW5kZXhbMl07CisJCQl3MiA9IHcgKiB3OworCQkJeVdlaWdodFs1XSA9ICgxLjAgLyAxMjAuMCkgKiB3ICogdzIgKiB3MjsKKwkJCXcyIC09IHc7CisJCQl3NCA9IHcyICogdzI7CisJCQl3IC09IDEuMCAvIDIuMDsKKwkJCXQgPSB3MiAqICh3MiAtIDMuMCk7CisJCQl5V2VpZ2h0WzBdID0gKDEuMCAvIDI0LjApICogKDEuMCAvIDUuMCArIHcyICsgdzQpIC0geVdlaWdodFs1XTsKKwkJCXQwID0gKDEuMCAvIDI0LjApICogKHcyICogKHcyIC0gNS4wKSArIDQ2LjAgLyA1LjApOworCQkJdDEgPSAoLTEuMCAvIDEyLjApICogdyAqICh0ICsgNC4wKTsKKwkJCXlXZWlnaHRbMl0gPSB0MCArIHQxOworCQkJeVdlaWdodFszXSA9IHQwIC0gdDE7CisJCQl0MCA9ICgxLjAgLyAxNi4wKSAqICg5LjAgLyA1LjAgLSB0KTsKKwkJCXQxID0gKDEuMCAvIDI0LjApICogdyAqICh3NCAtIHcyIC0gNS4wKTsKKwkJCXlXZWlnaHRbMV0gPSB0MCArIHQxOworCQkJeVdlaWdodFs0XSA9IHQwIC0gdDE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8vIEludmFsaWQgc3BsaW5lIGRlZ3JlZQorCQkJcmV0dXJuIDA7CisJfQorCisJLy8gYXBwbHkgdGhlIG1pcnJvciBib3VuZGFyeSBjb25kaXRpb25zCisJZm9yKGsgPSAwOyBrIDw9IHNwbGluZV9kZWdyZWU7IGsrKykgeworCQl4SW5kZXhba10gPSAoV2lkdGggPT0gMUwpID8gKDBMKSA6ICgoeEluZGV4W2tdIDwgMEwpID8KKwkJCSgteEluZGV4W2tdIC0gV2lkdGgyICogKCgteEluZGV4W2tdKSAvIFdpZHRoMikpCisJCQk6ICh4SW5kZXhba10gLSBXaWR0aDIgKiAoeEluZGV4W2tdIC8gV2lkdGgyKSkpOworCQlpZiAoV2lkdGggPD0geEluZGV4W2tdKSB7CisJCQl4SW5kZXhba10gPSBXaWR0aDIgLSB4SW5kZXhba107CisJCX0KKwkJeUluZGV4W2tdID0gKEhlaWdodCA9PSAxTCkgPyAoMEwpIDogKCh5SW5kZXhba10gPCAwTCkgPworCQkJKC15SW5kZXhba10gLSBIZWlnaHQyICogKCgteUluZGV4W2tdKSAvIEhlaWdodDIpKQorCQkJOiAoeUluZGV4W2tdIC0gSGVpZ2h0MiAqICh5SW5kZXhba10gLyBIZWlnaHQyKSkpOworCQlpZiAoSGVpZ2h0IDw9IHlJbmRleFtrXSkgeworCQkJeUluZGV4W2tdID0gSGVpZ2h0MiAtIHlJbmRleFtrXTsKKwkJfQorCX0KKworCS8vIHBlcmZvcm0gaW50ZXJwb2xhdGlvbgorCWludGVycG9sYXRlZCA9IDAuMDsKKwlmb3IoaiA9IDA7IGogPD0gc3BsaW5lX2RlZ3JlZTsgaisrKSB7CisJCXAgPSBCY29lZmYgKyAoeUluZGV4W2pdICogV2lkdGgpOworCQl3ID0gMC4wOworCQlmb3IoaSA9IDA7IGkgPD0gc3BsaW5lX2RlZ3JlZTsgaSsrKSB7CisJCQl3ICs9IHhXZWlnaHRbaV0gKiBwW3hJbmRleFtpXV07CisJCX0KKwkJaW50ZXJwb2xhdGVkICs9IHlXZWlnaHRbal0gKiB3OworCX0KKworCXJldHVybiBpbnRlcnBvbGF0ZWQ7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEZyZWVJbWFnZSBpbXBsZW1lbnRhdGlvbgorCisKKy8qKiAKKyBJbWFnZSB0cmFuc2xhdGlvbiBhbmQgcm90YXRpb24gdXNpbmcgQi1TcGxpbmVzLgorCisgQHBhcmFtIGRpYiBJbnB1dCA4LWJpdCBncmV5c2NhbGUgaW1hZ2UKKyBAcGFyYW0gYW5nbGUgT3V0cHV0IGltYWdlIHJvdGF0aW9uIGluIGRlZ3JlZQorIEBwYXJhbSB4X3NoaWZ0IE91dHB1dCBpbWFnZSBob3Jpem9udGFsIHNoaWZ0CisgQHBhcmFtIHlfc2hpZnQgT3V0cHV0IGltYWdlIHZlcnRpY2FsIHNoaWZ0CisgQHBhcmFtIHhfb3JpZ2luIE91dHB1dCBvcmlnaW4gb2YgdGhlIHgtYXhpcworIEBwYXJhbSB5X29yaWdpbiBPdXRwdXQgb3JpZ2luIG9mIHRoZSB5LWF4aXMKKyBAcGFyYW0gc3BsaW5lX2RlZ3JlZSBPdXRwdXQgZGVncmVlIG9mIHRoZSBCLXNwbGluZSBtb2RlbAorIEBwYXJhbSB1c2VfbWFzayBXaGV0aGVyIG9yIG5vdCB0byBtYXNrIHRoZSBpbWFnZQorIEByZXR1cm4gUmV0dXJucyB0aGUgdHJhbnNsYXRlZCAmIHJvdGF0ZWQgZGliIGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgTlVMTCBvdGhlcndpc2UKKyovCitzdGF0aWMgRklCSVRNQVAgKiAKK1JvdGF0ZThCaXQoRklCSVRNQVAgKmRpYiwgZG91YmxlIGFuZ2xlLCBkb3VibGUgeF9zaGlmdCwgZG91YmxlIHlfc2hpZnQsIGRvdWJsZSB4X29yaWdpbiwgZG91YmxlIHlfb3JpZ2luLCBsb25nIHNwbGluZV9kZWdyZWUsIEJPT0wgdXNlX21hc2spIHsKKwlkb3VibGUJKkltYWdlUmFzdGVyQXJyYXk7CisJZG91YmxlCXA7CisJZG91YmxlCWExMSwgYTEyLCBhMjEsIGEyMjsKKwlkb3VibGUJeDAsIHkwLCB4MSwgeTE7CisJbG9uZwl4LCB5OworCWxvbmcJc3BsaW5lOworCWJvb2wJYlJlc3VsdDsKKworCWludCBicHAgPSBGcmVlSW1hZ2VfR2V0QlBQKGRpYik7CisJaWYoYnBwICE9IDgpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCQorCWludCB3aWR0aCA9IEZyZWVJbWFnZV9HZXRXaWR0aChkaWIpOworCWludCBoZWlnaHQgPSBGcmVlSW1hZ2VfR2V0SGVpZ2h0KGRpYik7CisJc3dpdGNoKHNwbGluZV9kZWdyZWUpIHsKKwkJY2FzZSBST1RBVEVfUVVBRFJBVElDOgorCQkJc3BsaW5lID0gMkw7CS8vIFVzZSBzcGxpbmVzIG9mIGRlZ3JlZSAyIChxdWFkcmF0aWMgaW50ZXJwb2xhdGlvbikKKwkJCWJyZWFrOworCQljYXNlIFJPVEFURV9DVUJJQzoKKwkJCXNwbGluZSA9IDNMOwkvLyBVc2Ugc3BsaW5lcyBvZiBkZWdyZWUgMyAoY3ViaWMgaW50ZXJwb2xhdGlvbikKKwkJCWJyZWFrOworCQljYXNlIFJPVEFURV9RVUFSVElDOgorCQkJc3BsaW5lID0gNEw7CS8vIFVzZSBzcGxpbmVzIG9mIGRlZ3JlZSA0IChxdWFydGljIGludGVycG9sYXRpb24pCisJCQlicmVhazsKKwkJY2FzZSBST1RBVEVfUVVJTlRJQzoKKwkJCXNwbGluZSA9IDVMOwkvLyBVc2Ugc3BsaW5lcyBvZiBkZWdyZWUgNSAocXVpbnRpYyBpbnRlcnBvbGF0aW9uKQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzcGxpbmUgPSAzTDsKKwl9CisKKwkvLyBhbGxvY2F0ZSBvdXRwdXQgaW1hZ2UKKwlGSUJJVE1BUCAqZHN0ID0gRnJlZUltYWdlX0FsbG9jYXRlKHdpZHRoLCBoZWlnaHQsIGJwcCk7CisJaWYoIWRzdCkKKwkJcmV0dXJuIE5VTEw7CisJLy8gYnVpZCBhIGdyZXkgc2NhbGUgcGFsZXR0ZQorCVJHQlFVQUQgKnBhbCA9IEZyZWVJbWFnZV9HZXRQYWxldHRlKGRzdCk7CisJZm9yKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCXBhbFtpXS5yZ2JSZWQgPSBwYWxbaV0ucmdiR3JlZW4gPSBwYWxbaV0ucmdiQmx1ZSA9IChCWVRFKWk7CisJfQorCisJLy8gYWxsb2NhdGUgYSB0ZW1wb3JhcnkgYXJyYXkKKwlJbWFnZVJhc3RlckFycmF5ID0gKGRvdWJsZSopbWFsbG9jKHdpZHRoICogaGVpZ2h0ICogc2l6ZW9mKGRvdWJsZSkpOworCWlmKCFJbWFnZVJhc3RlckFycmF5KSB7CisJCUZyZWVJbWFnZV9VbmxvYWQoZHN0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8vIGNvcHkgZGF0YSBzYW1wbGVzCisJZm9yKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJZG91YmxlICpwSW1hZ2UgPSAmSW1hZ2VSYXN0ZXJBcnJheVt5KndpZHRoXTsKKwkJQllURSAqc3JjX2JpdHMgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCBoZWlnaHQtMS15KTsKKworCQlmb3IoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisJCQlwSW1hZ2VbeF0gPSAoZG91YmxlKXNyY19iaXRzW3hdOworCQl9CisJfQorCisJLy8gY29udmVydCBiZXR3ZWVuIGEgcmVwcmVzZW50YXRpb24gYmFzZWQgb24gaW1hZ2Ugc2FtcGxlcworCS8vIGFuZCBhIHJlcHJlc2VudGF0aW9uIGJhc2VkIG9uIGltYWdlIEItc3BsaW5lIGNvZWZmaWNpZW50cworCWJSZXN1bHQgPSBTYW1wbGVzVG9Db2VmZmljaWVudHMoSW1hZ2VSYXN0ZXJBcnJheSwgd2lkdGgsIGhlaWdodCwgc3BsaW5lKTsKKwlpZighYlJlc3VsdCkgeworCQlGcmVlSW1hZ2VfVW5sb2FkKGRzdCk7CisJCWZyZWUoSW1hZ2VSYXN0ZXJBcnJheSk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8vIHByZXBhcmUgdGhlIGdlb21ldHJ5CisJYW5nbGUgKj0gUEkgLyAxODAuMDsKKwlhMTEgPSBjb3MoYW5nbGUpOworCWExMiA9IC1zaW4oYW5nbGUpOworCWEyMSA9IHNpbihhbmdsZSk7CisJYTIyID0gY29zKGFuZ2xlKTsKKwl4MCA9IGExMSAqICh4X3NoaWZ0ICsgeF9vcmlnaW4pICsgYTEyICogKHlfc2hpZnQgKyB5X29yaWdpbik7CisJeTAgPSBhMjEgKiAoeF9zaGlmdCArIHhfb3JpZ2luKSArIGEyMiAqICh5X3NoaWZ0ICsgeV9vcmlnaW4pOworCXhfc2hpZnQgPSB4X29yaWdpbiAtIHgwOworCXlfc2hpZnQgPSB5X29yaWdpbiAtIHkwOworCisJLy8gdmlzaXQgYWxsIHBpeGVscyBvZiB0aGUgb3V0cHV0IGltYWdlIGFuZCBhc3NpZ24gdGhlaXIgdmFsdWUKKwlmb3IoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworCQlCWVRFICpkc3RfYml0cyA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShkc3QsIGhlaWdodC0xLXkpOworCQkKKwkJeDAgPSBhMTIgKiAoZG91YmxlKXkgKyB4X3NoaWZ0OworCQl5MCA9IGEyMiAqIChkb3VibGUpeSArIHlfc2hpZnQ7CisKKwkJZm9yKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworCQkJeDEgPSB4MCArIGExMSAqIChkb3VibGUpeDsKKwkJCXkxID0geTAgKyBhMjEgKiAoZG91YmxlKXg7CisJCQlpZih1c2VfbWFzaykgeworCQkJCWlmKCh4MSA8PSAtMC41KSB8fCAoKChkb3VibGUpd2lkdGggLSAwLjUpIDw9IHgxKSB8fCAoeTEgPD0gLTAuNSkgfHwgKCgoZG91YmxlKWhlaWdodCAtIDAuNSkgPD0geTEpKSB7CisJCQkJCXAgPSAwOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJcCA9IChkb3VibGUpSW50ZXJwb2xhdGVkVmFsdWUoSW1hZ2VSYXN0ZXJBcnJheSwgd2lkdGgsIGhlaWdodCwgeDEsIHkxLCBzcGxpbmUpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgeworCQkJCXAgPSAoZG91YmxlKUludGVycG9sYXRlZFZhbHVlKEltYWdlUmFzdGVyQXJyYXksIHdpZHRoLCBoZWlnaHQsIHgxLCB5MSwgc3BsaW5lKTsKKwkJCX0KKwkJCS8vIGNsYW1wIGFuZCBjb252ZXJ0IHRvIEJZVEUKKwkJCWRzdF9iaXRzW3hdID0gKEJZVEUpTUlOKE1BWCgoaW50KTAsIChpbnQpKHAgKyAwLjUpKSwgKGludCkyNTUpOworCQl9CisJfQorCisJLy8gZnJlZSB3b3JraW5nIGFycmF5IGFuZCByZXR1cm4KKwlmcmVlKEltYWdlUmFzdGVyQXJyYXkpOworCisJcmV0dXJuIGRzdDsKK30KKworLyoqIAorIEltYWdlIHJvdGF0aW9uIHVzaW5nIGEgM3JkIG9yZGVyIChjdWJpYykgQi1TcGxpbmVzLgorCisgQHBhcmFtIGRpYiBJbnB1dCBkaWIgKDgsIDI0IG9yIDMyLWJpdCkKKyBAcGFyYW0gYW5nbGUgT3V0cHV0IGltYWdlIHJvdGF0aW9uCisgQHBhcmFtIHhfc2hpZnQgT3V0cHV0IGltYWdlIGhvcml6b250YWwgc2hpZnQKKyBAcGFyYW0geV9zaGlmdCBPdXRwdXQgaW1hZ2UgdmVydGljYWwgc2hpZnQKKyBAcGFyYW0geF9vcmlnaW4gT3V0cHV0IG9yaWdpbiBvZiB0aGUgeC1heGlzCisgQHBhcmFtIHlfb3JpZ2luIE91dHB1dCBvcmlnaW4gb2YgdGhlIHktYXhpcworIEBwYXJhbSB1c2VfbWFzayBXaGV0aGVyIG9yIG5vdCB0byBtYXNrIHRoZSBpbWFnZQorIEByZXR1cm4gUmV0dXJucyB0aGUgdHJhbnNsYXRlZCAmIHJvdGF0ZWQgZGliIGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgTlVMTCBvdGhlcndpc2UKKyovCitGSUJJVE1BUCAqIERMTF9DQUxMQ09OViAKK0ZyZWVJbWFnZV9Sb3RhdGVFeChGSUJJVE1BUCAqZGliLCBkb3VibGUgYW5nbGUsIGRvdWJsZSB4X3NoaWZ0LCBkb3VibGUgeV9zaGlmdCwgZG91YmxlIHhfb3JpZ2luLCBkb3VibGUgeV9vcmlnaW4sIEJPT0wgdXNlX21hc2spIHsKKworCWludCB4LCB5LCBicHA7CisJaW50IGNoYW5uZWwsIG5iX2NoYW5uZWxzOworCUJZVEUgKnNyY19iaXRzLCAqZHN0X2JpdHM7CisJRklCSVRNQVAgKnNyYzggPSBOVUxMLCAqZHN0OCA9IE5VTEwsICpkc3QgPSBOVUxMOworCisJaWYoIUZyZWVJbWFnZV9IYXNQaXhlbHMoZGliKSkgcmV0dXJuIE5VTEw7CisKKwl0cnkgeworCisJCWJwcCA9IEZyZWVJbWFnZV9HZXRCUFAoZGliKTsKKworCQlpZihicHAgPT0gOCkgeworCQkJRklCSVRNQVAgKmRzdF84ID0gUm90YXRlOEJpdChkaWIsIGFuZ2xlLCB4X3NoaWZ0LCB5X3NoaWZ0LCB4X29yaWdpbiwgeV9vcmlnaW4sIFJPVEFURV9DVUJJQywgdXNlX21hc2spOworCQkJaWYoZHN0XzgpIHsKKwkJCQkvLyBjb3B5IG1ldGFkYXRhIGZyb20gc3JjIHRvIGRzdAorCQkJCUZyZWVJbWFnZV9DbG9uZU1ldGFkYXRhKGRzdF84LCBkaWIpOworCQkJfQorCQkJcmV0dXJuIGRzdF84OworCQl9CisJCWlmKChicHAgPT0gMjQpIHx8IChicHAgPT0gMzIpKSB7CisJCQkvLyBhbGxvY2F0ZSBkc3QgaW1hZ2UKKwkJCWludCB3aWR0aCAgPSBGcmVlSW1hZ2VfR2V0V2lkdGgoZGliKTsKKwkJCWludCBoZWlnaHQgPSBGcmVlSW1hZ2VfR2V0SGVpZ2h0KGRpYik7CisJCQlpZiggYnBwID09IDI0ICkgeworCQkJCWRzdCA9IEZyZWVJbWFnZV9BbGxvY2F0ZSh3aWR0aCwgaGVpZ2h0LCBicHAsIEZJX1JHQkFfUkVEX01BU0ssIEZJX1JHQkFfR1JFRU5fTUFTSywgRklfUkdCQV9CTFVFX01BU0spOworCQkJfSBlbHNlIHsKKwkJCQlkc3QgPSBGcmVlSW1hZ2VfQWxsb2NhdGUod2lkdGgsIGhlaWdodCwgYnBwLCBGSV9SR0JBX1JFRF9NQVNLLCBGSV9SR0JBX0dSRUVOX01BU0ssIEZJX1JHQkFfQkxVRV9NQVNLKTsKKwkJCX0KKwkJCWlmKCFkc3QpIHRocm93KDEpOworCisJCQkvLyBhbGxvY2F0ZSBhIHRlbXBvcmFyeSA4LWJpdCBkaWIgKG5vIG5lZWQgdG8gYnVpbGQgYSBwYWxldHRlKQorCQkJc3JjOCA9IEZyZWVJbWFnZV9BbGxvY2F0ZSh3aWR0aCwgaGVpZ2h0LCA4KTsKKwkJCWlmKCFzcmM4KSB0aHJvdygxKTsKKworCQkJLy8gcHJvY2VzcyBlYWNoIGNoYW5uZWwgc2VwYXJhdGVseQorCQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJbmJfY2hhbm5lbHMgPSAoYnBwIC8gOCk7CisKKwkJCWZvcihjaGFubmVsID0gMDsgY2hhbm5lbCA8IG5iX2NoYW5uZWxzOyBjaGFubmVsKyspIHsKKwkJCQkvLyBleHRyYWN0IGNoYW5uZWwgZnJvbSBzb3VyY2UgZGliCisJCQkJZm9yKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJCQkJc3JjX2JpdHMgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCB5KTsKKwkJCQkJZHN0X2JpdHMgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoc3JjOCwgeSk7CisJCQkJCWZvcih4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQkJCWRzdF9iaXRzW3hdID0gc3JjX2JpdHNbY2hhbm5lbF07CisJCQkJCQlzcmNfYml0cyArPSBuYl9jaGFubmVsczsKKwkJCQkJfQorCQkJCX0KKworCQkJCS8vIHByb2Nlc3MgY2hhbm5lbAorCQkJCWRzdDggPSBSb3RhdGU4Qml0KHNyYzgsIGFuZ2xlLCB4X3NoaWZ0LCB5X3NoaWZ0LCB4X29yaWdpbiwgeV9vcmlnaW4sIFJPVEFURV9DVUJJQywgdXNlX21hc2spOworCQkJCWlmKCFkc3Q4KSB0aHJvdygxKTsKKworCQkJCS8vIGluc2VydCBjaGFubmVsIHRvIGRlc3RpbmF0aW9uIGRpYgorCQkJCWZvcih5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisJCQkJCXNyY19iaXRzID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKGRzdDgsIHkpOworCQkJCQlkc3RfYml0cyA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShkc3QsIHkpOworCQkJCQlmb3IoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisJCQkJCQlkc3RfYml0c1tjaGFubmVsXSA9IHNyY19iaXRzW3hdOworCQkJCQkJZHN0X2JpdHMgKz0gbmJfY2hhbm5lbHM7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlGcmVlSW1hZ2VfVW5sb2FkKGRzdDgpOworCQkJfQorCisJCQlGcmVlSW1hZ2VfVW5sb2FkKHNyYzgpOworCisJCQkvLyBjb3B5IG1ldGFkYXRhIGZyb20gc3JjIHRvIGRzdAorCQkJRnJlZUltYWdlX0Nsb25lTWV0YWRhdGEoZHN0LCBkaWIpOworCQkJCisJCQlyZXR1cm4gZHN0OworCQl9CisJfSBjYXRjaChpbnQpIHsKKwkJaWYoc3JjOCkgRnJlZUltYWdlX1VubG9hZChzcmM4KTsKKwkJaWYoZHN0OCkgRnJlZUltYWdlX1VubG9hZChkc3Q4KTsKKwkJaWYoZHN0KSAgRnJlZUltYWdlX1VubG9hZChkc3QpOworCX0KKworCXJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvZmlsZXMvU291cmNlL0ZyZWVJbWFnZVRvb2xraXQvQmFja2dyb3VuZC5jcHAgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlVG9vbGtpdC9CYWNrZ3JvdW5kLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmIzMWFhCi0tLSAvZGV2L251bGwKKysrIGIvZmlsZXMvU291cmNlL0ZyZWVJbWFnZVRvb2xraXQvQmFja2dyb3VuZC5jcHAKQEAgLTAsMCArMSw4OTUgQEAKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEJhY2tncm91bmQgZmlsbGluZyByb3V0aW5lcworLy8KKy8vIERlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gYnkKKy8vIC0gQ2Fyc3RlbiBLbGVpbiAoYy5rbGVpbkBkYXRhZ2lzLmNvbSkKKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBGcmVlSW1hZ2UgMworLy8KKy8vIENPVkVSRUQgQ09ERSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWQorLy8gT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMKKy8vIFRIQVQgVEhFIENPVkVSRUQgQ09ERSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLy8gT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQKKy8vIENPREUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkgQ09WRVJFRCBDT0RFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QKKy8vIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZCisvLyBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMCisvLyBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GIEFOWSBDT1ZFUkVEIENPREUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSCisvLyBUSElTIERJU0NMQUlNRVIuCisvLworLy8gVXNlIGF0IHlvdXIgb3duIHJpc2shCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpbmNsdWRlICJGcmVlSW1hZ2UuaCIKKyNpbmNsdWRlICJVdGlsaXRpZXMuaCIKKworLyoqIEBicmllZiBEZXRlcm1pbmVzLCB3aGV0aGVyIGEgcGFsbGV0aXplZCBpbWFnZSBpcyB2aXN1YWxseSBncmV5c2NhbGUgb3Igbm90LgorIAorIFVubGlrZSB3aXRoIEZyZWVJbWFnZV9HZXRDb2xvclR5cGUsIHdoaWNoIHJldHVybnMgZWl0aGVyIEZJQ19NSU5JU0JMQUNLIG9yCisgRklDX01JTklTV0hJVEUgZm9yIGEgZ3JleXNjYWxlIGltYWdlIHdpdGggYSBsaW5lYXIgcmFtcCBwYWxldHRlLCB0aGUgcmV0dXJuICAKKyB2YWx1ZSBvZiB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IGRlcGVuZCBvbiB0aGUgcGFsZXR0ZSdzIG9yZGVyLCBidXQgb25seSBvbiB0aGUKKyBwYWxldHRlJ3MgaW5kaXZpZHVhbCBjb2xvcnMuCisgQHBhcmFtIGRpYiBUaGUgaW1hZ2UgdG8gYmUgdGVzdGVkLgorIEByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHRoZSBwYWxldHRlIG9mIHRoZSBpbWFnZSBzcGVjaWZpZWQgY29udGFpbnMgb25seQorIGdyZXlzY2FsZXMsIEZBTFNFIG90aGVyd2lzZS4KKyAqLworc3RhdGljIEJPT0wKK0lzVmlzdWFsR3JleXNjYWxlSW1hZ2UoRklCSVRNQVAgKmRpYikgeworCisJc3dpdGNoIChGcmVlSW1hZ2VfR2V0QlBQKGRpYikpIHsKKwkJY2FzZSAxOgorCQljYXNlIDQ6CisJCWNhc2UgODogeworCQkJdW5zaWduZWQgbmNvbG9ycyA9IEZyZWVJbWFnZV9HZXRDb2xvcnNVc2VkKGRpYik7CisJCQlSR0JRVUFEICpyZ2IgPSBGcmVlSW1hZ2VfR2V0UGFsZXR0ZShkaWIpOworCQkJZm9yICh1bnNpZ25lZCBpID0gMDsgaTwgbmNvbG9yczsgaSsrKSB7CisJCQkJaWYgKChyZ2ItPnJnYlJlZCAhPSByZ2ItPnJnYkdyZWVuKSB8fCAocmdiLT5yZ2JSZWQgIT0gcmdiLT5yZ2JCbHVlKSkgeworCQkJCQlyZXR1cm4gRkFMU0U7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIFRSVUU7CisJCX0KKwkJZGVmYXVsdDogeworCQkJcmV0dXJuIChGcmVlSW1hZ2VfR2V0Q29sb3JUeXBlKGRpYikgPT0gRklDX01JTklTQkxBQ0spOworCQl9CisJfQorfQorCisvKiogQGJyaWVmIExvb2tzIHVwIGEgc3BlY2lmaWVkIGNvbG9yIGluIGEgRklCSVRNQVAncyBwYWxldHRlIGFuZCByZXR1cm5zIHRoZSBjb2xvcidzCisgcGFsZXR0ZSBpbmRleCBvciAtMSBpZiB0aGUgY29sb3Igd2FzIG5vdCBmb3VuZC4KKworIFVubGlrZSB3aXRoIEZyZWVJbWFnZV9HZXRDb2xvclR5cGUsIHdoaWNoIHJldHVybnMgZWl0aGVyIEZJQ19NSU5JU0JMQUNLIG9yCisgRklDX01JTklTV0hJVEUgZm9yIGEgZ3JleXNjYWxlIGltYWdlIHdpdGggYSBsaW5lYXIgcmFtcCBwYWxldHRlLCB0aGUgcmV0dXJuCisgdmFsdWUgb2YgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBkZXBlbmQgb24gdGhlIHBhbGV0dGUncyBvcmRlciwgYnV0IG9ubHkgb24gdGhlCisgcGFsZXR0ZSdzIGluZGl2aWR1YWwgY29sb3JzLgorIEBwYXJhbSBkaWIgVGhlIGltYWdlLCB3aG9zZSBwYWxldHRlIHNob3VsZCBiZSBzZWFyY2hlZCB0aHJvdWdoLgorIEBwYXJhbSBjb2xvciBUaGUgY29sb3IgdG8gYmUgc2VhcmNoZWQgaW4gdGhlIHBhbGV0dGUuCisgQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUgY29sb3Igc2VhcmNoIHByb2Nlc3MuCisgQHBhcmFtIGNvbG9yX3R5cGUgQSBwb2ludGVyLCB0aGF0IG9wdGlvbmFsbHkgc3BlY2lmaWVzIHRoZSBpbWFnZSdzIGNvbG9yIHR5cGUgYXMKKyByZXR1cm5lZCBieSBGcmVlSW1hZ2VfR2V0Q29sb3JUeXBlLiBJZiBpbnZhbGlkIG9yIE5VTEwsIHRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyB0aGUKKyBjb2xvciB0eXBlIHdpdGggRnJlZUltYWdlX0dldENvbG9yVHlwZS4KKyBAcmV0dXJuIFJldHVybnMgdGhlIHNwZWNpZmllZCBjb2xvcidzIHBhbGV0dGUgaW5kZXgsIHRoZSBjb2xvcidzIHJnYlJlc2VydmVkIG1lbWJlcgorIGlmIG9wdGlvbiBGSV9DT0xPUl9BTFBIQV9JU19JTkRFWCB3YXMgc3BlY2lmaWVkIG9yIC0xLCBpZiB0aGUgY29sb3Igd2FzIG5vdCBmb3VuZAorIGluIHRoZSBpbWFnZSdzIHBhbGV0dGUgb3IgaWYgdGhlIHNwZWNpZmllZCBpbWFnZSBpcyBub24tcGFsbGV0aXplZC4KKyAqLworc3RhdGljIGludAorR2V0UGFsZXR0ZUluZGV4KEZJQklUTUFQICpkaWIsIGNvbnN0IFJHQlFVQUQgKmNvbG9yLCBpbnQgb3B0aW9ucywgRlJFRV9JTUFHRV9DT0xPUl9UWVBFICpjb2xvcl90eXBlKSB7CisJCisJaW50IHJlc3VsdCA9IC0xOworCQorCWlmICgoIWRpYikgfHwgKCFjb2xvcikpIHsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJCisJaW50IGJwcCA9IEZyZWVJbWFnZV9HZXRCUFAoZGliKTsKKworCS8vIEZpcnN0IGNoZWNrIHRyaXZpYWwgY2FzZTogcmV0dXJuIGNvbG9yLT5yZ2JSZXNlcnZlZCBpZiBvbmx5CisJLy8gRklfQ09MT1JfQUxQSEFfSVNfSU5ERVggaXMgc2V0LgorCWlmICgob3B0aW9ucyAmIEZJX0NPTE9SX0FMUEhBX0lTX0lOREVYKSA9PSBGSV9DT0xPUl9BTFBIQV9JU19JTkRFWCkgeworCQlpZiAoYnBwID09IDEpIHsKKwkJCXJldHVybiBjb2xvci0+cmdiUmVzZXJ2ZWQgJiAweDAxOworCQl9IGVsc2UgaWYgKGJwcCA9PSA0KSB7CisJCQlyZXR1cm4gY29sb3ItPnJnYlJlc2VydmVkICYgMHgwRjsKKwkJfQorCQlyZXR1cm4gY29sb3ItPnJnYlJlc2VydmVkOworCX0KKwkKKwlpZiAoYnBwID09IDgpIHsKKwkJRlJFRV9JTUFHRV9DT0xPUl9UWVBFIGN0ID0KKwkJCShjb2xvcl90eXBlID09IE5VTEwgfHwgKmNvbG9yX3R5cGUgPCAwKSA/CisJCQkJRnJlZUltYWdlX0dldENvbG9yVHlwZShkaWIpIDogKmNvbG9yX3R5cGU7CisJCWlmIChjdCA9PSBGSUNfTUlOSVNCTEFDSykgeworCQkJcmV0dXJuIEdSRVkoY29sb3ItPnJnYlJlZCwgY29sb3ItPnJnYkdyZWVuLCBjb2xvci0+cmdiQmx1ZSk7CisJCX0KKwkJaWYgKGN0ID09IEZJQ19NSU5JU1dISVRFKSB7CisJCQlyZXR1cm4gMjU1IC0gR1JFWShjb2xvci0+cmdiUmVkLCBjb2xvci0+cmdiR3JlZW4sIGNvbG9yLT5yZ2JCbHVlKTsKKwkJfQorCX0gZWxzZSBpZiAoYnBwID4gOCkgeworCQkvLyBmb3IgcGFsZXR0aXplZCBpbWFnZXMgb25seQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCWlmIChvcHRpb25zICYgRklfQ09MT1JfRklORF9FUVVBTF9DT0xPUikgeworCQkKKwkJLy8gT3B0aW9uIEZJX0NPTE9SX0FMUEhBX0lTX0lOREVYIGlzIGltcGxpY2l0IGhlcmUgc28sIHNldAorCQkvLyBpbmRleCB0byBjb2xvci0+cmdiUmVzZXJ2ZWQKKwkJcmVzdWx0ID0gY29sb3ItPnJnYlJlc2VydmVkOworCQlpZiAoYnBwID09IDEpIHsKKwkJCXJlc3VsdCAmPSAweDAxOworCQl9IGVsc2UgaWYgKGJwcCA9PSA0KSB7CisJCQlyZXN1bHQgJj0gMHgwRjsKKwkJfQkJCisKKwkJdW5zaWduZWQgdWNvbG9yOworCQlpZiAoIUlzVmlzdWFsR3JleXNjYWxlSW1hZ2UoZGliKSkgeworCQkJdWNvbG9yID0gKCooKHVuc2lnbmVkICopY29sb3IpKSAmIDB4RkZGRkZGOworCQl9IGVsc2UgeworCQkJdWNvbG9yID0gR1JFWShjb2xvci0+cmdiUmVkLCBjb2xvci0+cmdiR3JlZW4sIGNvbG9yLT5yZ2JCbHVlKSAqIDB4MDEwMTAxOworCQkJLy91Y29sb3IgPSAodWNvbG9yIHwgKHVjb2xvciA8PCA4KSB8ICh1Y29sb3IgPDwgMTYpKTsKKwkJfQorCQl1bnNpZ25lZCBuY29sb3JzID0gRnJlZUltYWdlX0dldENvbG9yc1VzZWQoZGliKTsKKwkJdW5zaWduZWQgKnBhbGV0dGUgPSAodW5zaWduZWQgKilGcmVlSW1hZ2VfR2V0UGFsZXR0ZShkaWIpOworCQlmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbmNvbG9yczsgaSsrKSB7CisJCQlpZiAoKHBhbGV0dGVbaV0gJiAweEZGRkZGRikgPT0gdWNvbG9yKSB7CisJCQkJcmVzdWx0ID0gaTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCXVuc2lnbmVkIG1pbmltdW0gPSBVSU5UX01BWDsKKwkJdW5zaWduZWQgbmNvbG9ycyA9IEZyZWVJbWFnZV9HZXRDb2xvcnNVc2VkKGRpYik7CisJCUJZVEUgKnBhbGV0dGUgPSAoQllURSAqKUZyZWVJbWFnZV9HZXRQYWxldHRlKGRpYik7CisJCUJZVEUgcmVkLCBncmVlbiwgYmx1ZTsKKwkJaWYgKCFJc1Zpc3VhbEdyZXlzY2FsZUltYWdlKGRpYikpIHsKKwkJCXJlZCA9IGNvbG9yLT5yZ2JSZWQ7CisJCQlncmVlbiA9IGNvbG9yLT5yZ2JHcmVlbjsKKwkJCWJsdWUgPSBjb2xvci0+cmdiQmx1ZTsKKwkJfSBlbHNlIHsKKwkJCXJlZCA9IEdSRVkoY29sb3ItPnJnYlJlZCwgY29sb3ItPnJnYkdyZWVuLCBjb2xvci0+cmdiQmx1ZSk7CisJCQlncmVlbiA9IGJsdWUgPSByZWQ7CisJCX0KKwkJZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5jb2xvcnM7IGkrKykgeworCQkJdW5zaWduZWQgbSA9IGFicyhwYWxldHRlW0ZJX1JHQkFfQkxVRV0gLSBibHVlKQorCQkJCQkrIGFicyhwYWxldHRlW0ZJX1JHQkFfR1JFRU5dIC0gZ3JlZW4pCisJCQkJCSsgYWJzKHBhbGV0dGVbRklfUkdCQV9SRURdIC0gcmVkKTsKKwkJCWlmIChtIDwgbWluaW11bSkgeworCQkJCW1pbmltdW0gPSBtOworCQkJCXJlc3VsdCA9IGk7CisJCQkJaWYgKG0gPT0gMCkgeworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlwYWxldHRlICs9IHNpemVvZihSR0JRVUFEKTsKKwkJfQkJCisJfQorCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKiBAYnJpZWYgQmxlbmRzIGFuIGFscGhhLXRyYW5zcGFyZW50IGZvcmVncm91bmQgY29sb3Igb3ZlciBhbiBvcGFxdWUgYmFja2dyb3VuZAorIGNvbG9yLgorIAorIFRoaXMgZnVuY3Rpb24gYmxlbmRzIHRoZSBhbHBoYS10cmFuc3BhcmVudCBmb3JlZ3JvdW5kIGNvbG9yIGZnY29sb3Igb3ZlciB0aGUKKyBiYWNrZ3JvdW5kIGNvbG9yIGJnY29sb3IuIFRoZSBiYWNrZ3JvdW5kIGNvbG9yIGlzIGNvbnNpZGVyZWQgZnVsbHkgb3BhcXVlLAorIHdoYXRldmVyIGl0J3MgYWxwaGEgdmFsdWUgY29udGFpbnMsIHdoZXJlYXMgdGhlIGZvcmVncm91bmQgY29sb3IgaXMgY29uc2lkZXJlZAorIHRvIGJlIGEgcmVhbCBSR0JBIGNvbG9yIHdpdGggYW4gYWxwaGEgdmFsdWUsIHdoaWNoIGlzIHVzZWQgZm9yIHRoZSBibGVuZAorIG9wZXJhdGlvbi4gVGhlIHJlc3VsdGluZyBjb2xvciBpcyByZXR1cm5lZCB0aHJvdWdoIHRoZSBibGVuZGVkIHBhcmFtZXRlci4KKyBAcGFyYW0gYmdjb2xvciBUaGUgYmFja2dyb3VuZCBjb2xvciBmb3IgdGhlIGJsZW5kIG9wZXJhdGlvbi4KKyBAcGFyYW0gZmdjb2xvciBUaGUgZm9yZWdyb3VuZCBjb2xvciBmb3IgdGhlIGJsZW5kIG9wZXJhdGlvbi4gVGhpcyBjb2xvcidzIGFscGhhCisgdmFsdWUsIHN0b3JlZCBpbiB0aGUgcmdiUmVzZXJ2ZWQgbWVtYmVyLCBpcyB0aGUgYWxwaGEgdmFsdWUgdXNlZCBmb3IgdGhlIGJsZW5kCisgb3BlcmF0aW9uLgorIEBwYXJhbSBibGVuZGVkIFRoaXMgb3V0IHBhcmFtZXRlciB0YWtlcyB0aGUgYmxlbmRlZCBjb2xvciBhbmQgc28sIHJldHVybnMgaXQgdG8KKyB0aGUgY2FsbGVyLiBUaGlzIGNvbG9yJ3MgYWxwaGEgdmFsdWUgd2lsbCBiZSAweEZGICgyNTUpIHNvLCB0aGUgYmxlbmRlZCBjb2xvcgorIGl0c2VsZiBoYXMgbm8gdHJhbnNwYXJlbmN5LiBUaGUgdGhpcyBhcmd1bWVudCBpcyBub3QgY2hhbmdlZCwgaWYgdGhlIGZ1bmN0aW9uCisgZmFpbHMuIAorIEByZXR1cm4gUmV0dXJucyBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG90aGVyd2lzZS4gVGhpcyBmdW5jdGlvbiBmYWlscyBpZiBhbnkgb2YKKyB0aGUgY29sb3IgYXJndW1lbnRzIGlzIGEgbnVsbCBwb2ludGVyLgorICovCitzdGF0aWMgQk9PTAorR2V0QWxwaGFCbGVuZGVkQ29sb3IoY29uc3QgUkdCUVVBRCAqYmdjb2xvciwgY29uc3QgUkdCUVVBRCAqZmdjb2xvciwgUkdCUVVBRCAqYmxlbmRlZCkgeworCQorCWlmICgoIWJnY29sb3IpIHx8ICghZmdjb2xvcikgfHwgKCFibGVuZGVkKSkgeworCQlyZXR1cm4gRkFMU0U7CisJfQorCQorCUJZVEUgYWxwaGEgPSBmZ2NvbG9yLT5yZ2JSZXNlcnZlZDsKKwlCWVRFIG5vdF9hbHBoYSA9IH5hbHBoYTsKKwkKKwlibGVuZGVkLT5yZ2JSZWQgICA9IChCWVRFKSggKChXT1JEKWZnY29sb3ItPnJnYlJlZCAgICogYWxwaGEgKyBub3RfYWxwaGEgKiAoV09SRCliZ2NvbG9yLT5yZ2JSZWQpICAgPj4gOCApOworCWJsZW5kZWQtPnJnYkdyZWVuID0gKEJZVEUpKCAoKFdPUkQpZmdjb2xvci0+cmdiR3JlZW4gKiBhbHBoYSArIG5vdF9hbHBoYSAqIChXT1JEKWJnY29sb3ItPnJnYkdyZWVuKSA+PiA4KSA7CisJYmxlbmRlZC0+cmdiQmx1ZSAgPSAoQllURSkoICgoV09SRClmZ2NvbG9yLT5yZ2JSZWQgICAqIGFscGhhICsgbm90X2FscGhhICogKFdPUkQpYmdjb2xvci0+cmdiQmx1ZSkgID4+IDggKTsKKwlibGVuZGVkLT5yZ2JSZXNlcnZlZCA9IDB4RkY7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoqIEBicmllZiBGaWxscyBhIEZJVF9CSVRNQVAgaW1hZ2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGNvbG9yLgorCisgVGhpcyBmdW5jdGlvbiBkb2VzIHRoZSBkaXJ0eSB3b3JrIGZvciBGcmVlSW1hZ2VfRmlsbEJhY2tncm91bmQgZm9yIEZJVF9CSVRNQVAKKyBpbWFnZXMuCisgQHBhcmFtIGRpYiBUaGUgaW1hZ2UgdG8gYmUgZmlsbGVkLgorIEBwYXJhbSBjb2xvciBUaGUgY29sb3IsIHRoZSBzcGVjaWZpZWQgaW1hZ2Ugc2hvdWxkIGJlIGZpbGxlZCB3aXRoLgorIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgdGhhdCBhZmZlY3QgdGhlIGNvbG9yIHNlYXJjaCBwcm9jZXNzIGZvciBwYWxsZXRpemVkIGltYWdlcy4KKyBAcmV0dXJuIFJldHVybnMgVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvdGhlcndpc2UuIFRoaXMgZnVuY3Rpb24gZmFpbHMgaWYgYW55IG9mCisgdGhlIGRpYiBhbmQgY29sb3IgaXMgTlVMTCBvciB0aGUgcHJvdmlkZWQgaW1hZ2UgaXMgbm90IGEgRklUX0JJVE1BUCBpbWFnZS4KKyAqLworc3RhdGljIEJPT0wKK0ZpbGxCYWNrZ3JvdW5kQml0bWFwKEZJQklUTUFQICpkaWIsIGNvbnN0IFJHQlFVQUQgKmNvbG9yLCBpbnQgb3B0aW9ucykgeworCisJaWYgKCghZGliKSB8fCAoRnJlZUltYWdlX0dldEltYWdlVHlwZShkaWIpICE9IEZJVF9CSVRNQVApKSB7CisJCXJldHVybiBGQUxTRTs7CisJfQorCQorCWlmICghY29sb3IpIHsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwkKKwljb25zdCBSR0JRVUFEICpjb2xvcl9pbnRsID0gY29sb3I7CisJdW5zaWduZWQgYnBwID0gRnJlZUltYWdlX0dldEJQUChkaWIpOworCXVuc2lnbmVkIHdpZHRoID0gRnJlZUltYWdlX0dldFdpZHRoKGRpYik7CisJdW5zaWduZWQgaGVpZ2h0ID0gRnJlZUltYWdlX0dldEhlaWdodChkaWIpOworCQorCUZSRUVfSU1BR0VfQ09MT1JfVFlQRSBjb2xvcl90eXBlID0gRnJlZUltYWdlX0dldENvbG9yVHlwZShkaWIpOworCQorCS8vIGdldCBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IHNjYW5saW5lIChib3R0b20gbGluZSkKKwlCWVRFICpzcmNfYml0cyA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIDApOworCUJZVEUgKmRzdF9iaXRzID0gc3JjX2JpdHM7CQorCQorCUJPT0wgc3VwcG9ydHNfYWxwaGEgPSAoKGJwcCA+PSAyNCkgfHwgKChicHAgPT0gOCkgJiYgKGNvbG9yX3R5cGUgIT0gRklDX1BBTEVUVEUpKSk7CisJCisJLy8gQ2hlY2sgZm9yIFJHQkEgY2FzZSBpZiBiaXRtYXAgc3VwcG9ydHMgYWxwaGEgCisJLy8gYmxlbmRpbmcgKDgtYml0IGdyZXlzY2FsZSwgMjQtIG9yIDMyLWJpdCBpbWFnZXMpCisJaWYgKHN1cHBvcnRzX2FscGhhICYmIChvcHRpb25zICYgRklfQ09MT1JfSVNfUkdCQV9DT0xPUikpIHsKKwkJCisJCWlmIChjb2xvci0+cmdiUmVzZXJ2ZWQgPT0gMCkgeworCQkJLy8gdGhlIGZpbGwgY29sb3IgaXMgZnVsbHkgdHJhbnNwYXJlbnQ7IHdlIGFyZSBkb25lCisJCQlyZXR1cm4gVFJVRTsKKwkJfQorCQkKKwkJLy8gT25seSBpZiB0aGUgZmlsbCBjb2xvciBpcyBOT1QgZnVsbHkgb3BhcXVlLCBkcmF3IGl0IHdpdGgKKwkJLy8gdGhlIChtdWNoKSBzbG93ZXIgRnJlZUltYWdlX0RyYXdMaW5lIGZ1bmN0aW9uIGFuZCByZXR1cm4uCisJCS8vIFNpbmNlIHdlIGRvIG5vdCBoYXZlIHRoZSBGcmVlSW1hZ2VfRHJhd0xpbmUgZnVuY3Rpb24gaW4gdGhpcworCQkvLyByZWxlYXNlLCBqdXN0IGFzc3VtZSB0byBoYXZlIGFuIHVuaWNvbG9yIGJhY2tncm91bmQgYW5kIGZpbGwKKwkJLy8gYWxsIHdpdGggYW4gJ2FscGhhLWJsZW5kZWQnIGNvbG9yLgorCQlpZiAoY29sb3ItPnJnYlJlc2VydmVkIDwgMjU1KSB7CisJCQkJCQkJCisJCQkvLyBJZiB3ZSB3aWxsIGRyYXcgb24gYW4gdW5pY29sb3IgYmFja2dyb3VuZCwgaXQncworCQkJLy8gZmFzdGVyIHRvIGRyYXcgb3BhcXVlIHdpdGggYW4gYWxwaGEgYmxlbmRlZCBjb2xvci4KKwkJCS8vIFNvLCBmaXJzdCBnZXQgdGhlIGNvbG9yIGZyb20gdGhlIGZpcnN0IHBpeGVsIGluIHRoZQorCQkJLy8gaW1hZ2UgKGJvdHRvbS1sZWZ0IHBpeGVsKS4KKwkJCVJHQlFVQUQgYmdjb2xvcjsKKwkJCWlmIChicHAgPT0gOCkgeworCQkJCWJnY29sb3IgPSBGcmVlSW1hZ2VfR2V0UGFsZXR0ZShkaWIpWypzcmNfYml0c107CisJCQl9IGVsc2UgewkKKwkJCQliZ2NvbG9yLnJnYkJsdWUgPSBzcmNfYml0c1tGSV9SR0JBX0JMVUVdOworCQkJCWJnY29sb3IucmdiR3JlZW4gPSBzcmNfYml0c1tGSV9SR0JBX0dSRUVOXTsKKwkJCQliZ2NvbG9yLnJnYlJlZCA9IHNyY19iaXRzW0ZJX1JHQkFfUkVEXTsKKwkJCQliZ2NvbG9yLnJnYlJlc2VydmVkID0gMHhGRjsKKwkJCX0KKwkJCVJHQlFVQUQgYmxlbmQ7CisJCQlHZXRBbHBoYUJsZW5kZWRDb2xvcigmYmdjb2xvciwgY29sb3JfaW50bCwgJmJsZW5kKTsKKwkJCWNvbG9yX2ludGwgPSAmYmxlbmQ7CisJCX0KKwl9CisJCisJaW50IGluZGV4ID0gKGJwcCA8PSA4KSA/IEdldFBhbGV0dGVJbmRleChkaWIsIGNvbG9yX2ludGwsIG9wdGlvbnMsICZjb2xvcl90eXBlKSA6IDA7CisJaWYgKGluZGV4ID09IC0xKSB7CisJCS8vIE5vIHBhbGV0dGUgaW5kZXggZm91bmQgZm9yIGEgcGFsbGV0aXplZAorCQkvLyBpbWFnZS4gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLi4uCisJCXJldHVybiBGQUxTRTsKKwl9CisJCisJLy8gZmlyc3QsIGJ1aWxkIHRoZSBmaXJzdCBzY2FubGluZSAobGluZSAwKQorCXN3aXRjaCAoYnBwKSB7CisJCWNhc2UgMTogeworCQkJdW5zaWduZWQgYnl0ZXMgPSAod2lkdGggLyA4KTsKKwkJCW1lbXNldChkc3RfYml0cywgKChpbmRleCA9PSAxKSA/IDB4RkYgOiAweDAwKSwgYnl0ZXMpOworCQkJLy9pbnQgbiA9IHdpZHRoICUgODsKKwkJCWludCBuID0gd2lkdGggJiA3OworCQkJaWYgKG4pIHsKKwkJCQlpZiAoaW5kZXggPT0gMSkgeworCQkJCQkvLyBzZXQgbiBsZWZ0bW9zdCBiaXRzCisJCQkJCWRzdF9iaXRzW2J5dGVzXSB8PSAoMHhGRiA8PCAoOCAtIG4pKTsKKwkJCQl9IGVsc2UgeworCQkJCQkvLyBjbGVhciBuIGxlZnRtb3N0IGJpdHMKKwkJCQkJZHN0X2JpdHNbYnl0ZXNdICY9ICgweEZGID4+IG4pOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWNhc2UgNDogeworCQkJdW5zaWduZWQgYnl0ZXMgPSAod2lkdGggLyAyKTsKKwkJCW1lbXNldChkc3RfYml0cywgKGluZGV4IHwgKGluZGV4IDw8IDQpKSwgYnl0ZXMpOworCQkJLy9pZiAoYnl0ZXMgJSAyKSB7CisJCQlpZiAoYnl0ZXMgJiAxKSB7CisJCQkJZHN0X2JpdHNbYnl0ZXNdICY9IDB4MEY7CisJCQkJZHN0X2JpdHNbYnl0ZXNdIHw9IChpbmRleCA8PCA0KTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWNhc2UgODogeworCQkJbWVtc2V0KGRzdF9iaXRzLCBpbmRleCwgRnJlZUltYWdlX0dldExpbmUoZGliKSk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIDE2OiB7CisJCQlXT1JEIHdjb2xvciA9IFJHQlFVQURfVE9fV09SRChkaWIsIGNvbG9yX2ludGwpOworCQkJZm9yICh1bnNpZ25lZCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQkoKFdPUkQgKilkc3RfYml0cylbeF0gPSB3Y29sb3I7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQljYXNlIDI0OiB7CisJCQlSR0JUUklQTEUgcmdidCA9ICooKFJHQlRSSVBMRSAqKWNvbG9yX2ludGwpOworCQkJZm9yICh1bnNpZ25lZCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQkoKFJHQlRSSVBMRSAqKWRzdF9iaXRzKVt4XSA9IHJnYnQ7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQljYXNlIDMyOiB7CisJCQlSR0JRVUFEIHJnYnE7CisJCQlyZ2JxLnJnYkJsdWUgPSAoKFJHQlRSSVBMRSAqKWNvbG9yX2ludGwpLT5yZ2J0Qmx1ZTsKKwkJCXJnYnEucmdiR3JlZW4gPSAoKFJHQlRSSVBMRSAqKWNvbG9yX2ludGwpLT5yZ2J0R3JlZW47CisJCQlyZ2JxLnJnYlJlZCA9ICgoUkdCVFJJUExFICopY29sb3JfaW50bCktPnJnYnRSZWQ7CisJCQlyZ2JxLnJnYlJlc2VydmVkID0gMHhGRjsKKwkJCWZvciAodW5zaWduZWQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisJCQkJKChSR0JRVUFEICopZHN0X2JpdHMpW3hdID0gcmdicTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gRkFMU0U7CisJfQorCisJLy8gVGhlbiwgY29weSB0aGUgZmlyc3Qgc2NhbmxpbmUgaW50byBhbGwgZm9sbG93aW5nIHNjYW5saW5lcy4KKwkvLyAnc3JjX2JpdHMnIGlzIGEgcG9pbnRlciB0byB0aGUgZmlyc3Qgc2NhbmxpbmUgYW5kIGlzIGFscmVhZHkKKwkvLyBzZXQgdXAgY29ycmVjdGx5LgorCWlmIChzcmNfYml0cykgeworCQl1bnNpZ25lZCBwaXRjaCA9IEZyZWVJbWFnZV9HZXRQaXRjaChkaWIpOworCQl1bnNpZ25lZCBieXRlcyA9IEZyZWVJbWFnZV9HZXRMaW5lKGRpYik7CisJCWRzdF9iaXRzID0gc3JjX2JpdHMgKyBwaXRjaDsKKwkJZm9yICh1bnNpZ25lZCB5ID0gMTsgeSA8IGhlaWdodDsgeSsrKSB7CisJCQltZW1jcHkoZHN0X2JpdHMsIHNyY19iaXRzLCBieXRlcyk7CisJCQlkc3RfYml0cyArPSBwaXRjaDsKKwkJfQorCX0KKwlyZXR1cm4gVFJVRTsKK30KKworLyoqIEBicmllZiBGaWxscyBhbiBpbWFnZSB3aXRoIHRoZSBzcGVjaWZpZWQgY29sb3IuCisKKyBUaGlzIGZ1bmN0aW9uIHNldHMgYWxsIHBpeGVscyBvZiBhbiBpbWFnZSB0byB0aGUgY29sb3IgcHJvdmlkZWQgdGhyb3VnaCB0aGUgY29sb3IKKyBwYXJhbWV0ZXIuIFNpbmNlIHRoaXMgc2hvdWxkIHdvcmsgZm9yIGFsbCBpbWFnZSB0eXBlcyBzdXBwb3J0ZWQgYnkgRnJlZUltYWdlLCB0aGUKKyBwb2ludGVyIGNvbG9yIG11c3QgcG9pbnQgdG8gYSBtZW1vcnkgbG9jYXRpb24sIHdoaWNoIGlzIGF0IGxlYXN0IGFzIGxhcmdlIGFzIHRoZQorIGltYWdlJ3MgY29sb3IgdmFsdWUsIGlmIHRoaXMgc2l6ZSBpcyBncmVhdGVyIHRoYW4gNCBieXRlcy4gQXMgdGhlIGNvbG9yIGlzIHNwZWNpZmllZAorIGJ5IGFuIFJHQlFVQUQgc3RydWN0dXJlIGZvciBhbGwgaW1hZ2VzIG9mIHR5cGUgRklUX0JJVE1BUCAoaW5jbHVkaW5nIGFsbCBwYWxsZXRpemVkCisgaW1hZ2VzKSwgdGhlIHNtYWxsZXN0IHBvc3NpYmxlIHNpemUgb2YgdGhpcyBtZW1vcnkgaXMgdGhlIHNpemUgb2YgdGhlIFJHQlFVQUQgc3RydWN0dXJlLAorIHdoaWNoIHVzZXMgNCBieXRlcy4KKworIFNvLCBjb2xvciBtdXN0IHBvaW50IHRvIGEgZG91YmxlLCBpZiB0aGUgaW1hZ2UgdG8gYmUgZmlsbGVkIGlzIG9mIHR5cGUgRklUX0RPVUJMRSBhbmQKKyBwb2ludCB0byBhIFJHQkYgc3RydWN0dXJlIGlmIHRoZSBpbWFnZSBpcyBvZiB0eXBlIEZJVF9SR0JGIGFuZCBzbyBvbi4KKworIEhvd2V2ZXIsIHRoZSBmaWxsIGNvbG9yIGlzIGFsd2F5cyBzcGVjaWZpZWQgdGhyb3VnaCBhIFJHQlFVQUQgc3RydWN0dXJlIGZvciBhbGwgaW1hZ2VzCisgb2YgdHlwZSBGSVRfQklUTUFQLiBTbywgZm9yIDMyLSBhbmQgMjQtYml0IGltYWdlcywgdGhlIHJlZCwgZ3JlZW4gYW5kIGJsdWUgbWVtYmVycyBvZgorIHRoZSBSR0JRVUFEIHN0cnVjdHVyZSBhcmUgZGlyZWN0bHkgdXNlZCBmb3IgdGhlIGltYWdlJ3MgcmVkLCBncmVlbiBhbmQgYmx1ZSBjaGFubmVsCisgcmVzcGVjdGl2ZWx5LiBBbHRob3VnaCBhbHBoYSB0cmFuc3BhcmVudCBSR0JRVUFEIGNvbG9ycyBhcmUgc3VwcG9ydGVkLCB0aGUgYWxwaGEgY2hhbm5lbAorIG9mIGEgMzItYml0IGltYWdlIG5ldmVyIGdldHMgbW9kaWZpZWQgYnkgdGhpcyBmdW5jdGlvbi4gQSBmaWxsIGNvbG9yIHdpdGggYW4gYWxwaGEgdmFsdWUKKyBzbWFsbGVyIHRoYW4gMjU1IGdldHMgYmxlbmRlZCB3aXRoIHRoZSBpbWFnZSdzIGFjdHVhbCBiYWNrZ3JvdW5kIGNvbG9yLCB3aGljaCBpcyBkZXRlcm1pbmVkCisgZnJvbSB0aGUgaW1hZ2UncyBib3R0b20tbGVmdCBwaXhlbC4gU28sIGN1cnJlbnRseSB1c2luZyBhbHBoYSBlbmFibGVkIGNvbG9ycywgYXNzdW1lcyB0aGUKKyBpbWFnZSB0byBiZSB1bmljb2xvciBiZWZvcmUgdGhlIGZpbGwgb3BlcmF0aW9uLiBIb3dldmVyLCB0aGUgUkdCUVVBRCdzIHJnYlJlc2VydmVkIG1lbWJlciBpcworIG9ubHkgdGFrZW4gaW50byBhY2NvdW50LCBpZiBvcHRpb24gRklfQ09MT1JfSVNfUkdCQV9DT0xPUiBoYXMgYmVlbiBzcGVjaWZpZWQuCisKKyBGb3IgMTYtYml0IGltYWdlcywgdGhlIHJlZC0sIGdyZWVuLSBhbmQgYmx1ZSBjb21wb25lbnRzIG9mIHRoZSBzcGVjaWZpZWQgY29sb3IgYXJlCisgdHJhbnNwYXJlbnRseSB0cmFuc2xhdGVkIGludG8gZWl0aGVyIHRoZSAxNi1iaXQgNTU1IG9yIDU2NSByZXByZXNlbnRhdGlvbi4gVGhpcyBkZXBlbmRzCisgb24gdGhlIGltYWdlJ3MgYWN0dWFsIHJlZC0gZ3JlZW4tIGFuZCBibHVlIG1hc2tzLgorCisgU3BlY2lhbCBhdHRlbnRpb24gbXVzdCBiZSBwYXllZCBmb3IgcGFsbGV0aXplZCBpbWFnZXMuIEdlbmVyYWxseSwgdGhlIFJHQiBjb2xvciBzcGVjaWZpZWQKKyBpcyBsb29rZWQgdXAgaW4gdGhlIGltYWdlJ3MgcGFsZXR0ZS4gVGhlIGZvdW5kIHBhbGV0dGUgaW5kZXggaXMgdGhlbiB1c2VkIHRvIGZpbGwgdGhlIGltYWdlLgorIFRoZXJlIGFyZSBzb21lIG9wdGlvbiBmbGFncywgdGhhdCBhZmZlY3QgdGhpcyBsb29rdXAgcHJvY2VzczoKKworIG5vIG9wdGlvbiBzcGVjaWZpZWQgICAgICAgKDB4MDApICAgVXNlcyB0aGUgY29sb3IsIHRoYXQgaXMgbmVhcmVzdCB0byB0aGUgc3BlY2lmaWVkIGNvbG9yLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgZGVmYXVsdCBiZWhhdmlvciBhbmQgc2hvdWxkIGFsd2F5cyBmaW5kIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yIGluIHRoZSBwYWxldHRlLiBIb3dldmVyLCB0aGUgdmlzdWFsIHJlc3VsdCBtYXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhciBmcm9tIHdoYXQgd2FzIGV4cGVjdGVkIGFuZCBtYWlubHkgZGVwZW5kcyBvbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlJ3MgcGFsZXR0ZS4KKworIEZJX0NPTE9SX0ZJTkRfRVFVQUxfQ09MT1IgKDB4MDIpCVNlYXJjaGVzIHRoZSBpbWFnZSdzIHBhbGV0dGUgZm9yIHRoZSBzcGVjaWZpZWQgY29sb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dCBvbmx5IHVzZXMgdGhlIHJldHVybmVkIHBhbGV0dGUgaW5kZXgsIGlmIHRoZSBzcGVjaWZpZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yIGV4YWN0bHkgbWF0Y2hlcyB0aGUgcGFsZXR0ZSBlbnRyeS4gT2YgY291cnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kaW5nIG9uIHRoZSBpbWFnZSdzIGFjdHVhbCBwYWxldHRlIGVudHJpZXMsIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiBtYXkgZmFpbC4gSW4gdGhpcyBjYXNlLCB0aGUgZnVuY3Rpb24gZmFsbHMgYmFjaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gb3B0aW9uIEZJX0NPTE9SX0FMUEhBX0lTX0lOREVYIGFuZCB1c2VzIHRoZSBSR0JRVUFEJ3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnYlJlc2VydmVkIG1lbWJlciAob3IgaXRzIGxvdyBuaWJibGUgZm9yIDQtYml0IGltYWdlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgaXRzIGxlYXN0IHNpZ25pZmljYW50IGJpdCAoTFNCKSBmb3IgMS1iaXQgaW1hZ2VzKSBhcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHBhbGV0dGUgaW5kZXggdXNlZCBmb3IgdGhlIGZpbGwgb3BlcmF0aW9uLgorCisgRklfQ09MT1JfQUxQSEFfSVNfSU5ERVggICAoMHgwNCkgICBEb2VzIG5vdCBwZXJmb3JtIGFueSBjb2xvciBsb29rdXAgZnJvbSB0aGUgcGFsZXR0ZSwgYnV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VzIHRoZSBSR0JRVUFEJ3MgYWxwaGEgY2hhbm5lbCBtZW1iZXIgcmdiUmVzZXJ2ZWQgYXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBwYWxldHRlIGluZGV4IHRvIGJlIHVzZWQgZm9yIHRoZSBmaWxsIG9wZXJhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhvd2V2ZXIsIGZvciA0LWJpdCBpbWFnZXMsIG9ubHkgdGhlIGxvdyBuaWJibGUgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ2JSZXNlcnZlZCBtZW1iZXIgYXJlIHVzZWQgYW5kIGZvciAxLWJpdCBpbWFnZXMsIG9ubHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgKExTQikgaXMgdXNlZC4KKworIFRoaXMgZnVuY3Rpb24gZmFpbHMgaWYgYW55IG9mIGRpYiBhbmQgY29sb3IgaXMgTlVMTC4KKworIEBwYXJhbSBkaWIgVGhlIGltYWdlIHRvIGJlIGZpbGxlZC4KKyBAcGFyYW0gY29sb3IgQSBwb2ludGVyIHRvIHRoZSBjb2xvciB2YWx1ZSB0byBiZSB1c2VkIGZvciBmaWxsaW5nIHRoZSBpbWFnZS4gVGhlCisgbWVtb3J5IHBvaW50ZWQgdG8gYnkgdGhpcyBwb2ludGVyIGlzIGFsd2F5cyBhc3N1bWVkIHRvIGJlIGF0IGxlYXN0IGFzIGxhcmdlIGFzIHRoZQorIGltYWdlJ3MgY29sb3IgdmFsdWUsIGJ1dCBuZXZlciBzbWFsbGVyIHRoYW4gdGhlIHNpemUgb2YgYW4gUkdCUVVBRCBzdHJ1Y3R1cmUuCisgQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUgY29sb3Igc2VhcmNoIHByb2Nlc3MgZm9yIHBhbGxldGl6ZWQgaW1hZ2VzLgorIEByZXR1cm4gUmV0dXJucyBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG90aGVyd2lzZS4gVGhpcyBmdW5jdGlvbiBmYWlscyBpZiBhbnkgb2YKKyBkaWIgYW5kIGNvbG9yIGlzIE5VTEwuCisgKi8KK0JPT0wgRExMX0NBTExDT05WCitGcmVlSW1hZ2VfRmlsbEJhY2tncm91bmQoRklCSVRNQVAgKmRpYiwgY29uc3Qgdm9pZCAqY29sb3IsIGludCBvcHRpb25zKSB7CisKKwlpZiAoIUZyZWVJbWFnZV9IYXNQaXhlbHMoZGliKSkgeworCQlyZXR1cm4gRkFMU0U7CisJfQorCQorCWlmICghY29sb3IpIHsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCS8vIGhhbmRsZSBGSVRfQklUTUFQIGltYWdlcyB3aXRoIEZyZWVJbWFnZV9GaWxsQmFja2dyb3VuZCgpCisJaWYgKEZyZWVJbWFnZV9HZXRJbWFnZVR5cGUoZGliKSA9PSBGSVRfQklUTUFQKSB7CisJCXJldHVybiBGaWxsQmFja2dyb3VuZEJpdG1hcChkaWIsIChSR0JRVUFEICopY29sb3IsIG9wdGlvbnMpOworCX0KKwkKKwkvLyBmaXJzdCwgY29uc3RydWN0IHRoZSBmaXJzdCBzY2FubGluZSAoYm90dG9tIGxpbmUpCisJdW5zaWduZWQgYnl0ZXNwcCA9IChGcmVlSW1hZ2VfR2V0QlBQKGRpYikgLyA4KTsKKwlCWVRFICpzcmNfYml0cyA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIDApOworCUJZVEUgKmRzdF9iaXRzID0gc3JjX2JpdHM7CisJZm9yICh1bnNpZ25lZCB4ID0gMDsgeCA8IEZyZWVJbWFnZV9HZXRXaWR0aChkaWIpOyB4KyspIHsKKwkJbWVtY3B5KGRzdF9iaXRzLCBjb2xvciwgYnl0ZXNwcCk7CisJCWRzdF9iaXRzICs9IGJ5dGVzcHA7CisJfQorCisJLy8gdGhlbiwgY29weSB0aGUgZmlyc3Qgc2NhbmxpbmUgaW50byBhbGwgZm9sbG93aW5nIHNjYW5saW5lcworCXVuc2lnbmVkIGhlaWdodCA9IEZyZWVJbWFnZV9HZXRIZWlnaHQoZGliKTsKKwl1bnNpZ25lZCBwaXRjaCA9IEZyZWVJbWFnZV9HZXRQaXRjaChkaWIpOworCXVuc2lnbmVkIGJ5dGVzID0gRnJlZUltYWdlX0dldExpbmUoZGliKTsKKwlkc3RfYml0cyA9IHNyY19iaXRzICsgcGl0Y2g7CisJZm9yICh1bnNpZ25lZCB5ID0gMTsgeSA8IGhlaWdodDsgeSsrKSB7CisJCW1lbWNweShkc3RfYml0cywgc3JjX2JpdHMsIGJ5dGVzKTsKKwkJZHN0X2JpdHMgKz0gcGl0Y2g7CisJfQorCXJldHVybiBUUlVFOworfQorCisvKiogQGJyaWVmIEFsbG9jYXRlcyBhIG5ldyBpbWFnZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUsIHdpZHRoLCBoZWlnaHQgYW5kIGJpdCBkZXB0aCBhbmQKKyBvcHRpb25hbGx5IGZpbGxzIGl0IHdpdGggdGhlIHNwZWNpZmllZCBjb2xvci4KKworIFRoaXMgZnVuY3Rpb24gaXMgYW4gZXh0ZW5zaW9uIHRvIEZyZWVJbWFnZV9BbGxvY2F0ZVQsIHdoaWNoIGFkZGl0aW9uYWxseSBzdXBwb3J0cyBzcGVjaWZ5aW5nCisgYSBwYWxldHRlIHRvIGJlIHNldCBmb3IgdGhlIG5ld2x5IGNyZWF0ZSBpbWFnZSwgYXMgd2VsbCBhcyBzcGVjaWZ5aW5nIGEgYmFja2dyb3VuZCBjb2xvciwKKyB0aGUgbmV3bHkgY3JlYXRlZCBpbWFnZSBzaG91bGQgaW5pdGlhbGx5IGJlIGZpbGxlZCB3aXRoLgorCisgQmFzaWNhbGx5LCB0aGlzIGZ1bmN0aW9uIGludGVybmFsbHkgcmVsaWVzIG9uIGZ1bmN0aW9uIEZyZWVJbWFnZV9BbGxvY2F0ZVQsIGZvbGxvd2VkIGJ5IGEKKyBjYWxsIHRvIEZyZWVJbWFnZV9GaWxsQmFja2dyb3VuZC4gVGhpcyBpcyB3aHkgYm90aCBwYXJhbWV0ZXJzIGNvbG9yIGFuZCBvcHRpb25zIGJlaGF2ZSB0aGUKKyBzYW1lIGFzIGl0IGlzIGRvY3VtZW50ZWQgZm9yIGZ1bmN0aW9uIEZyZWVJbWFnZV9GaWxsQmFja2dyb3VuZC4gU28sIHBsZWFzZSByZWZlciB0byB0aGUKKyBkb2N1bWVudGF0aW9uIG9mIEZyZWVJbWFnZV9GaWxsQmFja2dyb3VuZCB0byBsZWFybiBtb3JlIGFib3V0IHBhcmFtZXRlcnMgY29sb3IgYW5kIG9wdGlvbnMuCisKKyBUaGUgcGFsZXR0ZSBzcGVjaWZpZWQgdGhyb3VnaCBwYXJhbWV0ZXIgcGFsZXR0ZSBpcyBvbmx5IGNvcGllZCB0byB0aGUgbmV3bHkgY3JlYXRlZAorIGltYWdlLCBpZiBpdHMgaW1hZ2UgdHlwZSBpcyBGSVRfQklUTUFQIGFuZCB0aGUgZGVzaXJlZCBiaXQgZGVwdGggaXMgc21hbGxlciB0aGFuIG9yIGVxdWFsCisgdG8gOCBiaXRzIHBlciBwaXhlbC4gSW4gb3RoZXIgd29yZHMsIHRoZSBwYWxldHRlIHBhcmFtZXRlciBpcyBvbmx5IHRha2VuIGludG8gYWNjb3VudCBmb3IKKyBwYWxsZXRpemVkIGltYWdlcy4gSG93ZXZlciwgaWYgdGhlIHByZWNlZGluZyBjb25kaXRpb25zIG1hdGNoIGFuZCBpZiBwYWxldHRlIGlzIG5vdCBOVUxMLAorIHRoZSBtZW1vcnkgcG9pbnRlZCB0byBieSB0aGUgcGFsZXR0ZSBwb2ludGVyIGlzIGFzc3VtZWQgdG8gYmUgYXQgbGVhc3QgYXMgbGFyZ2UgYXMgc2l6ZQorIG9mIGEgZnVsbHkgcG9wdWxhdGVkIHBhbGV0dGUgZm9yIHRoZSBkZXNpcmVkIGJpdCBkZXB0aC4gU28sIGZvciBhbiA4LWJpdCBpbWFnZSwgdGhpcyBzaXplCisgaXMgMjU2IHggc2l6ZW9mKFJHQlFVQUQpLCBmb3IgYW4gNC1iaXQgaW1hZ2UgaXQgaXMgMTYgeCBzaXplb2YoUkdCUVVBRCkgYW5kIGl0IGlzCisgMiB4IHNpemVvZihSR0JRVUFEKSBmb3IgYSAxLWJpdCBpbWFnZS4gSW4gb3RoZXIgd29yZHMsIHRoaXMgZnVuY3Rpb24gZG9lcyBub3Qgc3VwcG9ydAorIHBhcnRpYWwgcGFsZXR0ZXMuCisKKyBIb3dldmVyLCBzcGVjaWZ5aW5nIGEgcGFsZXR0ZSBpcyBub3QgbmVjZXNzYXJpbHkgbmVlZGVkLCBldmVuIGZvciBwYWxsZXRpemVkIGltYWdlcy4gVGhpcworIGZ1bmN0aW9uIGlzIGNhcGFibGUgb2YgaW1wbGljaXRseSBjcmVhdGluZyBhIHBhbGV0dGUsIGlmIHBhcmFtZXRlciBwYWxldHRlIGlzIE5VTEwuIElmIHRoZQorIHNwZWNpZmllZCBiYWNrZ3JvdW5kIGNvbG9yIGlzIGEgZ3JleXNjYWxlIHZhbHVlIChyZWQgPSBncmVlbiA9IGJsdWUpIG9yIGlmIG9wdGlvbgorIEZJX0NPTE9SX0FMUEhBX0lTX0lOREVYIGlzIHNwZWNpZmllZCwgYSBncmV5c2NhbGUgcGFsZXR0ZSBpcyBjcmVhdGVkLiBGb3IgYSAxLWJpdCBpbWFnZSwgb25seQorIGlmIHRoZSBzcGVjaWZpZWQgYmFja2dyb3VuZCBjb2xvciBpcyBlaXRoZXIgYmxhY2sgb3Igd2hpdGUsIGEgbW9ub2Nocm9tZSBwYWxldHRlLCBjb25zaXN0aW5nCisgb2YgYmxhY2sgYW5kIHdoaXRlIG9ubHkgaXMgY3JlYXRlZC4gSW4gYW55IGNhc2UsIHRoZSBkYXJrZXIgY29sb3JzIGFyZSBzdG9yZWQgYXQgdGhlIHNtYWxsZXIKKyBwYWxldHRlIGluZGljZXMuCisKKyBJZiB0aGUgc3BlY2lmaWVkIGJhY2tncm91bmQgY29sb3IgaXMgbm90IGEgZ3JleXNjYWxlIHZhbHVlLCBvciBpcyBuZWl0aGVyIGJsYWNrIG5vciB3aGl0ZQorIGZvciBhIDEtYml0IGltYWdlLCBzb2xlbHkgdGhpcyBzaW5nbGUgY29sb3IgaXMgaW5qZWN0ZWQgaW50byB0aGUgb3RoZXJ3aXNlIGJsYWNrLWluaXRpYWxpemVkCisgcGFsZXR0ZS4gRm9yIHRoaXMgb3BlcmF0aW9uLCBvcHRpb24gRklfQ09MT1JfQUxQSEFfSVNfSU5ERVggaXMgaW1wbGljaXQsIHNvIHRoZSBzcGVjaWZpZWQKKyBjb2xvciBpcyBhcHBsaWVkIHRvIHRoZSBwYWxldHRlIGVudHJ5LCBzcGVjaWZpZWQgYnkgdGhlIGJhY2tncm91bmQgY29sb3IncyByZ2JSZXNlcnZlZAorIG1lbWJlci4gVGhlIGltYWdlIGlzIHRoZW4gZmlsbGVkIHdpdGggdGhpcyBwYWxldHRlIGluZGV4LgorCisgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgbmV3bHkgY3JlYXRlZCBpbWFnZSBhcyBmdW5jdGlvbiBGcmVlSW1hZ2VfQWxsb2NhdGVUIGRvZXMsIGlmIGJvdGgKKyBwYXJhbWV0ZXJzIGNvbG9yIGFuZCBwYWxldHRlIGFyZSBOVUxMLiBJZiBvbmx5IGNvbG9yIGlzIE5VTEwsIHRoZSBwYWxldHRlIHBvaW50ZWQgdG8gYnkKKyBwYXJhbWV0ZXIgcGFsZXR0ZSBpcyBpbml0aWFsbHkgc2V0IGZvciB0aGUgbmV3IGltYWdlLCBpZiBhIHBhbGxldGl6ZWQgaW1hZ2Ugb2YgdHlwZQorIEZJVF9CSVRNQVAgaXMgY3JlYXRlZC4gSG93ZXZlciwgaW4gdGhlIGxhdHRlciBjYXNlLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gaW1hZ2UsIHdob3NlCisgcGl4ZWxzIGFyZSBhbGwgaW5pdGlhbGl6ZWQgd2l0aCB6ZXJvcyBzbywgdGhlIGltYWdlIHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIGNvbG9yIG9mIHRoZQorIGZpcnN0IHBhbGV0dGUgZW50cnkuCisKKyBAcGFyYW0gdHlwZSBTcGVjaWZpZXMgdGhlIGltYWdlIHR5cGUgb2YgdGhlIG5ldyBpbWFnZS4KKyBAcGFyYW0gd2lkdGggVGhlIGRlc2lyZWQgd2lkdGggaW4gcGl4ZWxzIG9mIHRoZSBuZXcgaW1hZ2UuCisgQHBhcmFtIGhlaWdodCBUaGUgZGVzaXJlZCBoZWlnaHQgaW4gcGl4ZWxzIG9mIHRoZSBuZXcgaW1hZ2UuCisgQHBhcmFtIGJwcCBUaGUgZGVzaXJlZCBiaXQgZGVwdGggb2YgdGhlIG5ldyBpbWFnZS4KKyBAcGFyYW0gY29sb3IgQSBwb2ludGVyIHRvIHRoZSBjb2xvciB2YWx1ZSB0byBiZSB1c2VkIGZvciBmaWxsaW5nIHRoZSBpbWFnZS4gVGhlCisgbWVtb3J5IHBvaW50ZWQgdG8gYnkgdGhpcyBwb2ludGVyIGlzIGFsd2F5cyBhc3N1bWVkIHRvIGJlIGF0IGxlYXN0IGFzIGxhcmdlIGFzIHRoZQorIGltYWdlJ3MgY29sb3IgdmFsdWUgYnV0IG5ldmVyIHNtYWxsZXIgdGhhbiB0aGUgc2l6ZSBvZiBhbiBSR0JRVUFEIHN0cnVjdHVyZS4KKyBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIHRoYXQgYWZmZWN0IHRoZSBjb2xvciBzZWFyY2ggcHJvY2VzcyBmb3IgcGFsbGV0aXplZCBpbWFnZXMuCisgQHBhcmFtIHJlZF9tYXNrIFNwZWNpZmllcyB0aGUgYml0cyB1c2VkIHRvIHN0b3JlIHRoZSByZWQgY29tcG9uZW50cyBvZiBhIHBpeGVsLgorIEBwYXJhbSBncmVlbl9tYXNrIFNwZWNpZmllcyB0aGUgYml0cyB1c2VkIHRvIHN0b3JlIHRoZSBncmVlbiBjb21wb25lbnRzIG9mIGEgcGl4ZWwuCisgQHBhcmFtIGJsdWVfbWFzayBTcGVjaWZpZXMgdGhlIGJpdHMgdXNlZCB0byBzdG9yZSB0aGUgYmx1ZSBjb21wb25lbnRzIG9mIGEgcGl4ZWwuCisgQHJldHVybiBSZXR1cm5zIGEgcG9pbnRlciB0byBhIG5ld2x5IGFsbG9jYXRlZCBpbWFnZSBvbiBzdWNjZXNzLCBOVUxMIG90aGVyd2lzZS4KKyAqLworRklCSVRNQVAgKiBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9BbGxvY2F0ZUV4VChGUkVFX0lNQUdFX1RZUEUgdHlwZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLCBjb25zdCB2b2lkICpjb2xvciwgaW50IG9wdGlvbnMsIGNvbnN0IFJHQlFVQUQgKnBhbGV0dGUsIHVuc2lnbmVkIHJlZF9tYXNrLCB1bnNpZ25lZCBncmVlbl9tYXNrLCB1bnNpZ25lZCBibHVlX21hc2spIHsKKworCUZJQklUTUFQICpiaXRtYXAgPSBGcmVlSW1hZ2VfQWxsb2NhdGVUKHR5cGUsIHdpZHRoLCBoZWlnaHQsIGJwcCwgcmVkX21hc2ssIGdyZWVuX21hc2ssIGJsdWVfbWFzayk7CisJCisJaWYgKCFjb2xvcikgeworCQlpZiAoKHBhbGV0dGUpICYmICh0eXBlID09IEZJVF9CSVRNQVApICYmIChicHAgPD0gOCkpIHsKKwkJCW1lbWNweShGcmVlSW1hZ2VfR2V0UGFsZXR0ZShiaXRtYXApLCBwYWxldHRlLCBGcmVlSW1hZ2VfR2V0Q29sb3JzVXNlZChiaXRtYXApICogc2l6ZW9mKFJHQlFVQUQpKTsKKwkJfQorCQlyZXR1cm4gYml0bWFwOworCX0KKworCWlmIChiaXRtYXAgIT0gTlVMTCkgeworCQkKKwkJLy8gT25seSBmaWxsIHRoZSBuZXcgYml0bWFwIGlmIHRoZSBzcGVjaWZpZWQgY29sb3IKKwkJLy8gZGlmZmVycyBmcm9tICJibGFjayIsIHRoYXQgaXMgbm90IGFsbCBieXRlcyBvZiB0aGUKKwkJLy8gY29sb3IgYXJlIGVxdWFsIHRvIHplcm8uCisJCXN3aXRjaCAoYnBwKSB7CisJCQljYXNlIDE6IHsKKwkJCQkvLyBhbHRob3VnaCAxLWJpdCBpbXBsaWVzIEZJVF9CSVRNQVAsIGJldHRlciBnZXQgYW4gdW5zaWduZWQgCisJCQkJLy8gY29sb3IgYW5kIHBhbGV0dGUKKwkJCQl1bnNpZ25lZCAqdXJnYiA9ICh1bnNpZ25lZCAqKWNvbG9yOworCQkJCXVuc2lnbmVkICp1cGFsID0gKHVuc2lnbmVkICopRnJlZUltYWdlX0dldFBhbGV0dGUoYml0bWFwKTsKKwkJCQlSR0JRVUFEIHJnYnEgPSBSR0JRVUFEKCk7CisKKwkJCQlpZiAocGFsZXR0ZSAhPSBOVUxMKSB7CisJCQkJCS8vIGNsb25lIHRoZSBzcGVjaWZpZWQgcGFsZXR0ZQorCQkJCQltZW1jcHkoRnJlZUltYWdlX0dldFBhbGV0dGUoYml0bWFwKSwgcGFsZXR0ZSwgMiAqIHNpemVvZihSR0JRVUFEKSk7CisJCQkJfSBlbHNlIGlmIChvcHRpb25zICYgRklfQ09MT1JfQUxQSEFfSVNfSU5ERVgpIHsKKwkJCQkJQ1JFQVRFX0dSRVlTQ0FMRV9QQUxFVFRFKHVwYWwsIDIpOworCQkJCX0gZWxzZSB7CisJCQkJCS8vIGNoZWNrLCB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY29sb3IgaXMgZWl0aGVyIGJsYWNrIG9yIHdoaXRlCisJCQkJCWlmICgoKnVyZ2IgJiAweEZGRkZGRikgPT0gMHgwMDAwMDApIHsKKwkJCQkJCS8vIGluIGFueSBjYXNlIGJ1aWxkIGEgRklDX01JTklTQkxBQ0sgcGFsZXR0ZQorCQkJCQkJQ1JFQVRFX0dSRVlTQ0FMRV9QQUxFVFRFKHVwYWwsIDIpOworCQkJCQkJY29sb3IgPSAmcmdicTsKKwkJCQkJfSBlbHNlIGlmICgoKnVyZ2IgJiAweEZGRkZGRikgPT0gMHhGRkZGRkYpIHsKKwkJCQkJCS8vIGluIGFueSBjYXNlIGJ1aWxkIGEgRklDX01JTklTQkxBQ0sgcGFsZXR0ZQorCQkJCQkJQ1JFQVRFX0dSRVlTQ0FMRV9QQUxFVFRFKHVwYWwsIDIpOworCQkJCQkJcmdicS5yZ2JSZXNlcnZlZCA9IDE7CisJCQkJCQljb2xvciA9ICZyZ2JxOworCQkJCQl9IGVsc2UgeworCQkJCQkJLy8gT3RoZXJ3aXNlIGluamVjdCB0aGUgc3BlY2lmaWVkIGNvbG9yIGludG8gdGhlIHNvIGZhcgorCQkJCQkJLy8gYmxhY2stb25seSBwYWxldHRlLiBXZSB1c2UgY29sb3ItPnJnYlJlc2VydmVkIGFzIHRoZQorCQkJCQkJLy8gZGVzaXJlZCBwYWxldHRlIGluZGV4LgorCQkJCQkJQllURSBpbmRleCA9ICgoUkdCUVVBRCAqKWNvbG9yKS0+cmdiUmVzZXJ2ZWQgJiAweDAxOworCQkJCQkJdXBhbFtpbmRleF0gPSAqdXJnYiAmIDB4MDBGRkZGRkY7ICAKKwkJCQkJfQorCQkJCQlvcHRpb25zIHw9IEZJX0NPTE9SX0FMUEhBX0lTX0lOREVYOworCQkJCX0KKwkJCQkvLyBhbmQgZGVmZXIgdG8gRnJlZUltYWdlX0ZpbGxCYWNrZ3JvdW5kCisJCQkJRnJlZUltYWdlX0ZpbGxCYWNrZ3JvdW5kKGJpdG1hcCwgY29sb3IsIG9wdGlvbnMpOworCQkJCWJyZWFrOworCQkJfQorCQkJY2FzZSA0OiB7CisJCQkJLy8gNC1iaXQgaW1wbGllcyBGSVRfQklUTUFQIHNvLCBnZXQgYSBSR0JRVUFEIGNvbG9yCisJCQkJUkdCUVVBRCAqcmdiID0gKFJHQlFVQUQgKiljb2xvcjsKKwkJCQlSR0JRVUFEICpwYWwgPSBGcmVlSW1hZ2VfR2V0UGFsZXR0ZShiaXRtYXApOworCQkJCVJHQlFVQUQgcmdicSA9IFJHQlFVQUQoKTsKKwkJCQkKKwkJCQlpZiAocGFsZXR0ZSAhPSBOVUxMKSB7CisJCQkJCS8vIGNsb25lIHRoZSBzcGVjaWZpZWQgcGFsZXR0ZQorCQkJCQltZW1jcHkocGFsLCBwYWxldHRlLCAxNiAqIHNpemVvZihSR0JRVUFEKSk7CisJCQkJfSBlbHNlIGlmIChvcHRpb25zICYgRklfQ09MT1JfQUxQSEFfSVNfSU5ERVgpIHsKKwkJCQkJQ1JFQVRFX0dSRVlTQ0FMRV9QQUxFVFRFKHBhbCwgMTYpOworCQkJCX0gZWxzZSB7CisJCQkJCS8vIGNoZWNrLCB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY29sb3IgaXMgYSBncmV5IG9uZQorCQkJCQlpZiAoKHJnYi0+cmdiUmVkID09IHJnYi0+cmdiR3JlZW4pICYmIChyZ2ItPnJnYlJlZCA9PSByZ2ItPnJnYkJsdWUpKSB7CisJCQkJCQkvLyBpZiBzbywgYnVpbGQgYSBncmV5c2NhbGUgcGFsZXR0ZQorCQkJCQkJQ1JFQVRFX0dSRVlTQ0FMRV9QQUxFVFRFKHBhbCwgMTYpOworCQkJCQkJcmdicS5yZ2JSZXNlcnZlZCA9IHJnYi0+cmdiUmVkID4+IDQ7CisJCQkJCQljb2xvciA9ICZyZ2JxOworCQkJCQl9IGVsc2UgeworCQkJCQkJLy8gT3RoZXJ3aXNlIGluamVjdCB0aGUgc3BlY2lmaWVkIGNvbG9yIGludG8gdGhlIHNvIGZhcgorCQkJCQkJLy8gYmxhY2stb25seSBwYWxldHRlLiBXZSB1c2UgY29sb3ItPnJnYlJlc2VydmVkIGFzIHRoZQorCQkJCQkJLy8gZGVzaXJlZCBwYWxldHRlIGluZGV4LgorCQkJCQkJQllURSBpbmRleCA9IChyZ2ItPnJnYlJlc2VydmVkICYgMHgwRik7CisJCQkJCQkoKHVuc2lnbmVkICopcGFsKVtpbmRleF0gPSAqKCh1bnNpZ25lZCAqKXJnYikgJiAweDAwRkZGRkZGOworCQkJCQl9CisJCQkJCW9wdGlvbnMgfD0gRklfQ09MT1JfQUxQSEFfSVNfSU5ERVg7CisJCQkJfQorCQkJCS8vIGFuZCBkZWZlciB0byBGcmVlSW1hZ2VfRmlsbEJhY2tncm91bmQKKwkJCQlGcmVlSW1hZ2VfRmlsbEJhY2tncm91bmQoYml0bWFwLCBjb2xvciwgb3B0aW9ucyk7CisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlIDg6IHsKKwkJCQkvLyA4LWJpdCBpbXBsaWVzIEZJVF9CSVRNQVAgc28sIGdldCBhIFJHQlFVQUQgY29sb3IKKwkJCQlSR0JRVUFEICpyZ2IgPSAoUkdCUVVBRCAqKWNvbG9yOworCQkJCVJHQlFVQUQgKnBhbCA9IEZyZWVJbWFnZV9HZXRQYWxldHRlKGJpdG1hcCk7CisJCQkJUkdCUVVBRCByZ2JxOworCisJCQkJaWYgKHBhbGV0dGUgIT0gTlVMTCkgeworCQkJCQkvLyBjbG9uZSB0aGUgc3BlY2lmaWVkIHBhbGV0dGUKKwkJCQkJbWVtY3B5KHBhbCwgcGFsZXR0ZSwgMjU2ICogc2l6ZW9mKFJHQlFVQUQpKTsKKwkJCQl9IGVsc2UgaWYgKG9wdGlvbnMgJiBGSV9DT0xPUl9BTFBIQV9JU19JTkRFWCkgeworCQkJCQlDUkVBVEVfR1JFWVNDQUxFX1BBTEVUVEUocGFsLCAyNTYpOworCQkJCX0gZWxzZSB7CisJCQkJCS8vIGNoZWNrLCB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY29sb3IgaXMgYSBncmV5IG9uZQorCQkJCQlpZiAoKHJnYi0+cmdiUmVkID09IHJnYi0+cmdiR3JlZW4pICYmIChyZ2ItPnJnYlJlZCA9PSByZ2ItPnJnYkJsdWUpKSB7CisJCQkJCQkvLyBpZiBzbywgYnVpbGQgYSBncmV5c2NhbGUgcGFsZXR0ZQorCQkJCQkJQ1JFQVRFX0dSRVlTQ0FMRV9QQUxFVFRFKHBhbCwgMjU2KTsKKwkJCQkJCXJnYnEucmdiUmVzZXJ2ZWQgPSByZ2ItPnJnYlJlZDsKKwkJCQkJCWNvbG9yID0gJnJnYnE7CisJCQkJCX0gZWxzZSB7CisJCQkJCQkvLyBPdGhlcndpc2UgaW5qZWN0IHRoZSBzcGVjaWZpZWQgY29sb3IgaW50byB0aGUgc28gZmFyCisJCQkJCQkvLyBibGFjay1vbmx5IHBhbGV0dGUuIFdlIHVzZSBjb2xvci0+cmdiUmVzZXJ2ZWQgYXMgdGhlCisJCQkJCQkvLyBkZXNpcmVkIHBhbGV0dGUgaW5kZXguCisJCQkJCQlCWVRFIGluZGV4ID0gcmdiLT5yZ2JSZXNlcnZlZDsKKwkJCQkJCSgodW5zaWduZWQgKilwYWwpW2luZGV4XSA9ICooKHVuc2lnbmVkICopcmdiKSAmIDB4MDBGRkZGRkY7ICAKKwkJCQkJfQorCQkJCQlvcHRpb25zIHw9IEZJX0NPTE9SX0FMUEhBX0lTX0lOREVYOworCQkJCX0KKwkJCQkvLyBhbmQgZGVmZXIgdG8gRnJlZUltYWdlX0ZpbGxCYWNrZ3JvdW5kCisJCQkJRnJlZUltYWdlX0ZpbGxCYWNrZ3JvdW5kKGJpdG1hcCwgY29sb3IsIG9wdGlvbnMpOworCQkJCWJyZWFrOworCQkJfQorCQkJY2FzZSAxNjogeworCQkJCVdPUkQgd2NvbG9yID0gKHR5cGUgPT0gRklUX0JJVE1BUCkgPworCQkJCQlSR0JRVUFEX1RPX1dPUkQoYml0bWFwLCAoKFJHQlFVQUQgKiljb2xvcikpIDogKigoV09SRCAqKWNvbG9yKTsKKwkJCQlpZiAod2NvbG9yICE9IDApIHsKKwkJCQkJRnJlZUltYWdlX0ZpbGxCYWNrZ3JvdW5kKGJpdG1hcCwgY29sb3IsIG9wdGlvbnMpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJCWRlZmF1bHQ6IHsKKwkJCQlpbnQgYnl0ZXNwcCA9IGJwcCAvIDg7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBieXRlc3BwOyBpKyspIHsKKwkJCQkJaWYgKCgoQllURSAqKWNvbG9yKVtpXSAhPSAwKSB7CisJCQkJCQlGcmVlSW1hZ2VfRmlsbEJhY2tncm91bmQoYml0bWFwLCBjb2xvciwgb3B0aW9ucyk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gYml0bWFwOworfQorCisvKiogQGJyaWVmIEFsbG9jYXRlcyBhIG5ldyBpbWFnZSBvZiB0aGUgc3BlY2lmaWVkIHdpZHRoLCBoZWlnaHQgYW5kIGJpdCBkZXB0aCBhbmQgb3B0aW9uYWxseQorIGZpbGxzIGl0IHdpdGggdGhlIHNwZWNpZmllZCBjb2xvci4KKworIFRoaXMgZnVuY3Rpb24gaXMgYW4gZXh0ZW5zaW9uIHRvIEZyZWVJbWFnZV9BbGxvY2F0ZSwgd2hpY2ggYWRkaXRpb25hbGx5IHN1cHBvcnRzIHNwZWNpZnlpbmcKKyBhIHBhbGV0dGUgdG8gYmUgc2V0IGZvciB0aGUgbmV3bHkgY3JlYXRlIGltYWdlLCBhcyB3ZWxsIGFzIHNwZWNpZnlpbmcgYSBiYWNrZ3JvdW5kIGNvbG9yLAorIHRoZSBuZXdseSBjcmVhdGVkIGltYWdlIHNob3VsZCBpbml0aWFsbHkgYmUgZmlsbGVkIHdpdGguCisKKyBCYXNpY2FsbHksIHRoaXMgZnVuY3Rpb24gaW50ZXJuYWxseSByZWxpZXMgb24gZnVuY3Rpb24gRnJlZUltYWdlX0FsbG9jYXRlLCBmb2xsb3dlZCBieSBhCisgY2FsbCB0byBGcmVlSW1hZ2VfRmlsbEJhY2tncm91bmQuIFRoaXMgaXMgd2h5IGJvdGggcGFyYW1ldGVycyBjb2xvciBhbmQgb3B0aW9ucyBiZWhhdmUgdGhlCisgc2FtZSBhcyBpdCBpcyBkb2N1bWVudGVkIGZvciBmdW5jdGlvbiBGcmVlSW1hZ2VfRmlsbEJhY2tncm91bmQuIFNvLCBwbGVhc2UgcmVmZXIgdG8gdGhlCisgZG9jdW1lbnRhdGlvbiBvZiBGcmVlSW1hZ2VfRmlsbEJhY2tncm91bmQgdG8gbGVhcm4gbW9yZSBhYm91dCBwYXJhbWV0ZXJzIGNvbG9yIGFuZCBvcHRpb25zLgorCisgVGhlIHBhbGV0dGUgc3BlY2lmaWVkIHRocm91Z2ggcGFyYW1ldGVyIHBhbGV0dGUgaXMgb25seSBjb3BpZWQgdG8gdGhlIG5ld2x5IGNyZWF0ZWQKKyBpbWFnZSwgaWYgdGhlIGRlc2lyZWQgYml0IGRlcHRoIGlzIHNtYWxsZXIgdGhhbiBvciBlcXVhbCB0byA4IGJpdHMgcGVyIHBpeGVsLiBJbiBvdGhlciB3b3JkcywKKyB0aGUgcGFsZXR0ZSBwYXJhbWV0ZXIgaXMgb25seSB0YWtlbiBpbnRvIGFjY291bnQgZm9yIHBhbGxldGl6ZWQgaW1hZ2VzLiBIb3dldmVyLCBpZiB0aGUKKyBpbWFnZSB0byBiZSBjcmVhdGVkIGlzIGEgcGFsbGV0aXplZCBpbWFnZSBhbmQgaWYgcGFsZXR0ZSBpcyBub3QgTlVMTCwgdGhlIG1lbW9yeSBwb2ludGVkIHRvCisgYnkgdGhlIHBhbGV0dGUgcG9pbnRlciBpcyBhc3N1bWVkIHRvIGJlIGF0IGxlYXN0IGFzIGxhcmdlIGFzIHNpemUgb2YgYSBmdWxseSBwb3B1bGF0ZWQKKyBwYWxldHRlIGZvciB0aGUgZGVzaXJlZCBiaXQgZGVwdGguIFNvLCBmb3IgYW4gOC1iaXQgaW1hZ2UsIHRoaXMgc2l6ZSBpcyAyNTYgeCBzaXplb2YoUkdCUVVBRCksCisgZm9yIGFuIDQtYml0IGltYWdlIGl0IGlzIDE2IHggc2l6ZW9mKFJHQlFVQUQpIGFuZCBpdCBpcyAyIHggc2l6ZW9mKFJHQlFVQUQpIGZvciBhIDEtYml0CisgaW1hZ2UuIEluIG90aGVyIHdvcmRzLCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IHN1cHBvcnQgcGFydGlhbCBwYWxldHRlcy4KKworIEhvd2V2ZXIsIHNwZWNpZnlpbmcgYSBwYWxldHRlIGlzIG5vdCBuZWNlc3NhcmlseSBuZWVkZWQsIGV2ZW4gZm9yIHBhbGxldGl6ZWQgaW1hZ2VzLiBUaGlzCisgZnVuY3Rpb24gaXMgY2FwYWJsZSBvZiBpbXBsaWNpdGx5IGNyZWF0aW5nIGEgcGFsZXR0ZSwgaWYgcGFyYW1ldGVyIHBhbGV0dGUgaXMgTlVMTC4gSWYgdGhlCisgc3BlY2lmaWVkIGJhY2tncm91bmQgY29sb3IgaXMgYSBncmV5c2NhbGUgdmFsdWUgKHJlZCA9IGdyZWVuID0gYmx1ZSkgb3IgaWYgb3B0aW9uCisgRklfQ09MT1JfQUxQSEFfSVNfSU5ERVggaXMgc3BlY2lmaWVkLCBhIGdyZXlzY2FsZSBwYWxldHRlIGlzIGNyZWF0ZWQuIEZvciBhIDEtYml0IGltYWdlLCBvbmx5CisgaWYgdGhlIHNwZWNpZmllZCBiYWNrZ3JvdW5kIGNvbG9yIGlzIGVpdGhlciBibGFjayBvciB3aGl0ZSwgYSBtb25vY2hyb21lIHBhbGV0dGUsIGNvbnNpc3RpbmcKKyBvZiBibGFjayBhbmQgd2hpdGUgb25seSBpcyBjcmVhdGVkLiBJbiBhbnkgY2FzZSwgdGhlIGRhcmtlciBjb2xvcnMgYXJlIHN0b3JlZCBhdCB0aGUgc21hbGxlcgorIHBhbGV0dGUgaW5kaWNlcy4KKworIElmIHRoZSBzcGVjaWZpZWQgYmFja2dyb3VuZCBjb2xvciBpcyBub3QgYSBncmV5c2NhbGUgdmFsdWUsIG9yIGlzIG5laXRoZXIgYmxhY2sgbm9yIHdoaXRlCisgZm9yIGEgMS1iaXQgaW1hZ2UsIHNvbGVseSB0aGlzIHNpbmdsZSBjb2xvciBpcyBpbmplY3RlZCBpbnRvIHRoZSBvdGhlcndpc2UgYmxhY2staW5pdGlhbGl6ZWQKKyBwYWxldHRlLiBGb3IgdGhpcyBvcGVyYXRpb24sIG9wdGlvbiBGSV9DT0xPUl9BTFBIQV9JU19JTkRFWCBpcyBpbXBsaWNpdCwgc28gdGhlIHNwZWNpZmllZAorIGNvbG9yIGlzIGFwcGxpZWQgdG8gdGhlIHBhbGV0dGUgZW50cnksIHNwZWNpZmllZCBieSB0aGUgYmFja2dyb3VuZCBjb2xvcidzIHJnYlJlc2VydmVkCisgbWVtYmVyLiBUaGUgaW1hZ2UgaXMgdGhlbiBmaWxsZWQgd2l0aCB0aGlzIHBhbGV0dGUgaW5kZXguCisKKyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBuZXdseSBjcmVhdGVkIGltYWdlIGFzIGZ1bmN0aW9uIEZyZWVJbWFnZV9BbGxvY2F0ZSBkb2VzLCBpZiBib3RoCisgcGFyYW1ldGVycyBjb2xvciBhbmQgcGFsZXR0ZSBhcmUgTlVMTC4gSWYgb25seSBjb2xvciBpcyBOVUxMLCB0aGUgcGFsZXR0ZSBwb2ludGVkIHRvIGJ5CisgcGFyYW1ldGVyIHBhbGV0dGUgaXMgaW5pdGlhbGx5IHNldCBmb3IgdGhlIG5ldyBpbWFnZSwgaWYgYSBwYWxsZXRpemVkIGltYWdlIG9mIHR5cGUKKyBGSVRfQklUTUFQIGlzIGNyZWF0ZWQuIEhvd2V2ZXIsIGluIHRoZSBsYXR0ZXIgY2FzZSwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGltYWdlLCB3aG9zZQorIHBpeGVscyBhcmUgYWxsIGluaXRpYWxpemVkIHdpdGggemVyb3Mgc28sIHRoZSBpbWFnZSB3aWxsIGJlIGZpbGxlZCB3aXRoIHRoZSBjb2xvciBvZiB0aGUKKyBmaXJzdCBwYWxldHRlIGVudHJ5LgorCisgQHBhcmFtIHdpZHRoIFRoZSBkZXNpcmVkIHdpZHRoIGluIHBpeGVscyBvZiB0aGUgbmV3IGltYWdlLgorIEBwYXJhbSBoZWlnaHQgVGhlIGRlc2lyZWQgaGVpZ2h0IGluIHBpeGVscyBvZiB0aGUgbmV3IGltYWdlLgorIEBwYXJhbSBicHAgVGhlIGRlc2lyZWQgYml0IGRlcHRoIG9mIHRoZSBuZXcgaW1hZ2UuCisgQHBhcmFtIGNvbG9yIEEgcG9pbnRlciB0byBhbiBSR0JRVUFEIHN0cnVjdHVyZSwgdGhhdCBwcm92aWRlcyB0aGUgY29sb3IgdG8gYmUgdXNlZCBmb3IKKyBmaWxsaW5nIHRoZSBpbWFnZS4KKyBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIHRoYXQgYWZmZWN0IHRoZSBjb2xvciBzZWFyY2ggcHJvY2VzcyBmb3IgcGFsbGV0aXplZCBpbWFnZXMuCisgQHBhcmFtIHJlZF9tYXNrIFNwZWNpZmllcyB0aGUgYml0cyB1c2VkIHRvIHN0b3JlIHRoZSByZWQgY29tcG9uZW50cyBvZiBhIHBpeGVsLgorIEBwYXJhbSBncmVlbl9tYXNrIFNwZWNpZmllcyB0aGUgYml0cyB1c2VkIHRvIHN0b3JlIHRoZSBncmVlbiBjb21wb25lbnRzIG9mIGEgcGl4ZWwuCisgQHBhcmFtIGJsdWVfbWFzayBTcGVjaWZpZXMgdGhlIGJpdHMgdXNlZCB0byBzdG9yZSB0aGUgYmx1ZSBjb21wb25lbnRzIG9mIGEgcGl4ZWwuCisgQHJldHVybiBSZXR1cm5zIGEgcG9pbnRlciB0byBhIG5ld2x5IGFsbG9jYXRlZCBpbWFnZSBvbiBzdWNjZXNzLCBOVUxMIG90aGVyd2lzZS4KKyAqLworRklCSVRNQVAgKiBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9BbGxvY2F0ZUV4KGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgY29uc3QgUkdCUVVBRCAqY29sb3IsIGludCBvcHRpb25zLCBjb25zdCBSR0JRVUFEICpwYWxldHRlLCB1bnNpZ25lZCByZWRfbWFzaywgdW5zaWduZWQgZ3JlZW5fbWFzaywgdW5zaWduZWQgYmx1ZV9tYXNrKSB7CisJcmV0dXJuIEZyZWVJbWFnZV9BbGxvY2F0ZUV4VChGSVRfQklUTUFQLCB3aWR0aCwgaGVpZ2h0LCBicHAsICgodm9pZCAqKWNvbG9yKSwgb3B0aW9ucywgcGFsZXR0ZSwgcmVkX21hc2ssIGdyZWVuX21hc2ssIGJsdWVfbWFzayk7Cit9CisKKy8qKiBAYnJpZWYgRW5sYXJnZXMgb3Igc2hyaW5rcyBhbiBpbWFnZSBzZWxlY3RpdmVseSBwZXIgc2lkZSBhbmQgZmlsbHMgbmV3bHkgYWRkZWQgYXJlYXMKKyB3aXRoIHRoZSBzcGVjaWZpZWQgYmFja2dyb3VuZCBjb2xvci4KKworIFRoaXMgZnVuY3Rpb24gZW5sYXJnZXMgb3Igc2hyaW5rcyBhbiBpbWFnZSBzZWxlY3RpdmVseSBwZXIgc2lkZS4gVGhlIG1haW4gcHVycG9zZSBvZiB0aGlzCisgZnVuY3Rpb24gaXMgdG8gYWRkIGJvcmRlcnMgdG8gYW4gaW1hZ2UuIFRvIGFkZCBhIGJvcmRlciB0byBhbnkgb2YgdGhlIGltYWdlJ3Mgc2lkZXMsIGEKKyBwb3NpdGl2ZSBpbnRlZ2VyIHZhbHVlIG11c3QgYmUgcGFzc2VkIGluIGFueSBvZiB0aGUgcGFyYW1ldGVycyBsZWZ0LCB0b3AsIHJpZ2h0IG9yIGJvdHRvbS4KKyBUaGlzIHZhbHVlIHJlcHJlc2VudHMgdGhlIGJvcmRlcidzIHdpZHRoIGluIHBpeGVscy4gTmV3bHkgY3JlYXRlZCBwYXJ0cyBvZiB0aGUgaW1hZ2UgKHRoZQorIGJvcmRlciBhcmVhcykgYXJlIGZpbGxlZCB3aXRoIHRoZSBzcGVjaWZpZWQgY29sb3IuIFNwZWNpZnlpbmcgYSBuZWdhdGl2ZSBpbnRlZ2VyIHZhbHVlIGZvcgorIGEgY2VydGFpbiBzaWRlLCB3aWxsIHNocmluayBvciBjcm9wIHRoZSBpbWFnZSBvbiB0aGlzIHNpZGUuIENvbnNlcXVlbnRseSwgc3BlY2lmeWluZyB6ZXJvCisgZm9yIGEgY2VydGFpbiBzaWRlIHdpbGwgbm90IGNoYW5nZSB0aGUgaW1hZ2UncyBleHRlbnNpb24gb24gdGhhdCBzaWRlLgorCisgU28sIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiB3aXRoIGFsbCBwYXJhbWV0ZXJzIGxlZnQsIHRvcCwgcmlnaHQgYW5kIGJvdHRvbSBzZXQgdG8gemVybywgaXMKKyBlZmZlY3RpdmVseSB0aGUgc2FtZSBhcyBjYWxsaW5nIGZ1bmN0aW9uIEZyZWVJbWFnZV9DbG9uZTsgc2V0dGluZyBhbGwgcGFyYW1ldGVycyBsZWZ0LCB0b3AsCisgcmlnaHQgYW5kIGJvdHRvbSB0byB2YWx1ZSBlcXVhbCB0byBvciBzbWFsbGVyIHRoYW4gemVybywgbXkgZWFzaWx5IGJlIHN1YnN0aXR1dGVkIGJ5IGEgY2FsbAorIHRvIGZ1bmN0aW9uIEZyZWVJbWFnZV9Db3B5LiBCb3RoIHRoZXNlIGNhc2VzIHByb2R1Y2UgYSBuZXcgaW1hZ2UsIHdoaWNoIGlzIGd1YXJhbnRlZWQgbm90IHRvCisgYmUgbGFyZ2VyIHRoYW4gdGhlIGlucHV0IGltYWdlLiBUaHVzLCBzaW5jZSB0aGUgc3BlY2lmaWVkIGNvbG9yIGlzIG5vdCBuZWVkZWQgaW4gdGhlc2UgY2FzZXMsCisgdGhlIHBvaW50ZXIgY29sb3IgbWF5IGJlIE5VTEwuCisKKyBCb3RoIHBhcmFtZXRlcnMgY29sb3IgYW5kIG9wdGlvbnMgd29yayBhY2NvcmRpbmcgdG8gZnVuY3Rpb24gRnJlZUltYWdlX0ZpbGxCYWNrZ3JvdW5kLiBTbywKKyBwbGVhc2UgcmVmZXIgdG8gdGhlIGRvY3VtZW50YXRpb24gb2YgRnJlZUltYWdlX0ZpbGxCYWNrZ3JvdW5kIHRvIGxlYXJuIG1vcmUgYWJvdXQgcGFyYW1ldGVycworIGNvbG9yIGFuZCBvcHRpb25zLiBGb3IgcGFsbGV0aXplZCBpbWFnZXMsIHRoZSBwYWxldHRlIG9mIHRoZSBpbnB1dCBpbWFnZSBzcmMgaXMKKyB0cmFuc3BhcmVudGx5IGNvcGllZCB0byB0aGUgbmV3bHkgY3JlYXRlZCBlbmxhcmdlZCBvciBzaHJ1bmtlbiBpbWFnZSwgc28gYW55IGNvbG9yCisgbG9vay11cHMgYXJlIHBlcmZvcm1lZCBvbiB0aGlzIHBhbGV0dGUuCisKKyBIZXJlIGFyZSBzb21lIGV4YW1wbGVzLCB0aGF0IGlsbHVzdHJhdGUsIGhvdyB0byB1c2UgdGhlIHBhcmFtZXRlcnMgbGVmdCwgdG9wLCByaWdodCBhbmQKKyBib3R0b206CisKKyAvLyBjcmVhdGUgYSB3aGl0ZSBjb2xvcgorIFJHQlFVQUQgYzsKKyBjLnJnYlJlZCA9IDB4RkY7CisgYy5yZ2JHcmVlbiA9IDB4RkY7CisgYy5yZ2JCbHVlID0gMHhGRjsKKyBjLnJnYlJlc2VydmVkID0gMHgwMDsKKworIC8vIGFkZCBhIHdoaXRlLCBzeW1tZXRyaWMgMTAgcGl4ZWwgd2lkZSBib3JkZXIgdG8gdGhlIGltYWdlCisgZGliMiA9IEZyZWVJbWFnZV9FbmxhcmdlQ2FudmFzKGRpYiwgMTAsIDEwLCAxMCwgMTAsICZjLCBGSV9DT0xPUl9JU19SR0JfQ09MT1IpOworCisgLy8gYWRkIHdoaXRlLCAyMCBwaXhlbCB3aWRlIHN0cmlwZXMgdG8gdGhlIHRvcCBhbmQgYm90dG9tIHNpZGUgb2YgdGhlIGltYWdlCisgZGliMyA9IEZyZWVJbWFnZV9FbmxhcmdlQ2FudmFzKGRpYiwgMCwgMjAsIDAsIDIwLCAmYywgRklfQ09MT1JfSVNfUkdCX0NPTE9SKTsKKworIC8vIGFkZCB3aGl0ZSwgMzAgcGl4ZWwgd2lkZSBzdHJpcGVzIHRvIHRoZSByaWdodCBzaWRlIG9mIHRoZSBpbWFnZSBhbmQKKyAvLyBjdXQgb2ZmIHRoZSA0MCBsZWZ0bW9zdCBwaXhlbCBjb2x1bW5zCisgZGliMyA9IEZyZWVJbWFnZV9FbmxhcmdlQ2FudmFzKGRpYiwgLTQwLCAwLCAzMCwgMCwgJmMsIEZJX0NPTE9SX0lTX1JHQl9DT0xPUik7CisKKyBUaGlzIGZ1bmN0aW9uIGZhaWxzIGlmIGVpdGhlciB0aGUgaW5wdXQgaW1hZ2UgaXMgTlVMTCBvciB0aGUgcG9pbnRlciB0byB0aGUgY29sb3IgaXMKKyBOVUxMLCB3aGlsZSBhdCBsZWFzdCBvbiBvZiBsZWZ0LCB0b3AsIHJpZ2h0IGFuZCBib3R0b20gaXMgZ3JlYXRlciB0aGFuIHplcm8uIFRoaXMKKyBmdW5jdGlvbiBhbHNvIHJldHVybnMgTlVMTCwgaWYgdGhlIG5ldyBpbWFnZSdzIHNpemUgd2lsbCBiZSBuZWdhdGl2ZSBpbiBlaXRoZXIgeC0gb3IKKyB5LWRpcmVjdGlvbi4KKworIEBwYXJhbSBkaWIgVGhlIGltYWdlIHRvIGJlIGVubGFyZ2VkIG9yIHNocnVua2VuLgorIEBwYXJhbSBsZWZ0IFRoZSBudW1iZXIgb2YgcGl4ZWxzLCB0aGUgaW1hZ2Ugc2hvdWxkIGJlIGVubGFyZ2VkIG9uIGl0cyBsZWZ0IHNpZGUuIE5lZ2F0aXZlCisgdmFsdWVzIHNocmluayB0aGUgaW1hZ2Ugb24gaXRzIGxlZnQgc2lkZS4KKyBAcGFyYW0gdG9wIFRoZSBudW1iZXIgb2YgcGl4ZWxzLCB0aGUgaW1hZ2Ugc2hvdWxkIGJlIGVubGFyZ2VkIG9uIGl0cyB0b3Agc2lkZS4gTmVnYXRpdmUKKyB2YWx1ZXMgc2hyaW5rIHRoZSBpbWFnZSBvbiBpdHMgdG9wIHNpZGUuCisgQHBhcmFtIHJpZ2h0IFRoZSBudW1iZXIgb2YgcGl4ZWxzLCB0aGUgaW1hZ2Ugc2hvdWxkIGJlIGVubGFyZ2VkIG9uIGl0cyByaWdodCBzaWRlLiBOZWdhdGl2ZQorIHZhbHVlcyBzaHJpbmsgdGhlIGltYWdlIG9uIGl0cyByaWdodCBzaWRlLgorIEBwYXJhbSBib3R0b20gVGhlIG51bWJlciBvZiBwaXhlbHMsIHRoZSBpbWFnZSBzaG91bGQgYmUgZW5sYXJnZWQgb24gaXRzIGJvdHRvbSBzaWRlLiBOZWdhdGl2ZQorIHZhbHVlcyBzaHJpbmsgdGhlIGltYWdlIG9uIGl0cyBib3R0b20gc2lkZS4KKyBAcGFyYW0gY29sb3IgVGhlIGNvbG9yLCB0aGUgZW5sYXJnZWQgc2lkZXMgb2YgdGhlIGltYWdlIHNob3VsZCBiZSBmaWxsZWQgd2l0aC4KKyBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIHRoYXQgYWZmZWN0IHRoZSBjb2xvciBzZWFyY2ggcHJvY2VzcyBmb3IgcGFsbGV0aXplZCBpbWFnZXMuCisgQHJldHVybiBSZXR1cm5zIGEgcG9pbnRlciB0byBhIG5ld2x5IGFsbG9jYXRlZCBlbmxhcmdlZCBvciBzaHJ1bmtlbiBpbWFnZSBvbiBzdWNjZXNzLAorIE5VTEwgb3RoZXJ3aXNlLiBUaGlzIGZ1bmN0aW9uIGZhaWxzIGlmIGVpdGhlciB0aGUgaW5wdXQgaW1hZ2UgaXMgTlVMTCBvciB0aGUgcG9pbnRlciB0byB0aGUKKyBjb2xvciBpcyBOVUxMLCB3aGlsZSBhdCBsZWFzdCBvbiBvZiBsZWZ0LCB0b3AsIHJpZ2h0IGFuZCBib3R0b20gaXMgZ3JlYXRlciB0aGFuIHplcm8uIFRoaXMKKyBmdW5jdGlvbiBhbHNvIHJldHVybnMgTlVMTCwgaWYgdGhlIG5ldyBpbWFnZSdzIHNpemUgd2lsbCBiZSBuZWdhdGl2ZSBpbiBlaXRoZXIgeC0gb3IKKyB5LWRpcmVjdGlvbi4KKyAqLworRklCSVRNQVAgKiBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9FbmxhcmdlQ2FudmFzKEZJQklUTUFQICpzcmMsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgcmlnaHQsIGludCBib3R0b20sIGNvbnN0IHZvaWQgKmNvbG9yLCBpbnQgb3B0aW9ucykgeworCisJaWYoIUZyZWVJbWFnZV9IYXNQaXhlbHMoc3JjKSkgcmV0dXJuIE5VTEw7CisKKwkvLyBKdXN0IHJldHVybiBhIGNsb25lIG9mIHRoZSBpbWFnZSwgaWYgbGVmdCwgdG9wLCByaWdodCBhbmQgYm90dG9tIGFyZQorCS8vIGFsbCB6ZXJvLgorCWlmICgobGVmdCA9PSAwKSAmJiAocmlnaHQgPT0gMCkgJiYgKHRvcCA9PSAwKSAmJiAoYm90dG9tID09IDApKSB7CisJCXJldHVybiBGcmVlSW1hZ2VfQ2xvbmUoc3JjKTsKKwl9CisKKwlpbnQgd2lkdGggPSBGcmVlSW1hZ2VfR2V0V2lkdGgoc3JjKTsKKwlpbnQgaGVpZ2h0ID0gRnJlZUltYWdlX0dldEhlaWdodChzcmMpOworCisJLy8gUmVsYXkgb24gRnJlZUltYWdlX0NvcHksIGlmIGFsbCBwYXJhbWV0ZXJzIGxlZnQsIHRvcCwgcmlnaHQgYW5kCisJLy8gYm90dG9tIGFyZSBzbWFsbGVyIHRoYW4gb3IgZXF1YWwgemVyby4gVGhlIGNvbG9yIHBvaW50ZXIgbWF5IGJlCisJLy8gTlVMTCBpbiB0aGlzIGNhc2UuCisJaWYgKChsZWZ0IDw9IDApICYmIChyaWdodCA8PSAwKSAmJiAodG9wIDw9IDApICYmIChib3R0b20gPD0gMCkpIHsKKwkJcmV0dXJuIEZyZWVJbWFnZV9Db3B5KHNyYywgLWxlZnQsIC10b3AsCXdpZHRoICsgcmlnaHQsIGhlaWdodCArIGJvdHRvbSk7CisJfQorCisJLy8gRnJvbSBoZXJlLCB3ZSBuZWVkIGEgdmFsaWQgY29sb3IsIHNpbmNlIHRoZSBpbWFnZSB3aWxsIGJlIGVubGFyZ2VkIG9uCisJLy8gYXQgbGVhc3Qgb25lIHNpZGUuIFNvLCBmYWlsIGlmIHdlIGRvbid0IGhhdmUgYSB2YWxpZCBjb2xvciBwb2ludGVyLgorCWlmICghY29sb3IpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKCgobGVmdCA8IDApICYmICgtbGVmdCA+PSB3aWR0aCkpIHx8ICgocmlnaHQgPCAwKSAmJiAoLXJpZ2h0ID49IHdpZHRoKSkgfHwKKwkJKCh0b3AgPCAwKSAmJiAoLXRvcCA+PSBoZWlnaHQpKSB8fCAoKGJvdHRvbSA8IDApICYmICgtYm90dG9tID49IGhlaWdodCkpKSB7CisJCXJldHVybiBOVUxMOworCX0KKworCXVuc2lnbmVkIG5ld1dpZHRoID0gd2lkdGggKyBsZWZ0ICsgcmlnaHQ7CisJdW5zaWduZWQgbmV3SGVpZ2h0ID0gaGVpZ2h0ICsgdG9wICsgYm90dG9tOworCisJRlJFRV9JTUFHRV9UWVBFIHR5cGUgPSBGcmVlSW1hZ2VfR2V0SW1hZ2VUeXBlKHNyYyk7CisJdW5zaWduZWQgYnBwID0gRnJlZUltYWdlX0dldEJQUChzcmMpOworCisJRklCSVRNQVAgKmRzdCA9IEZyZWVJbWFnZV9BbGxvY2F0ZUV4VCgKKwkJdHlwZSwgbmV3V2lkdGgsIG5ld0hlaWdodCwgYnBwLCBjb2xvciwgb3B0aW9ucywKKwkJRnJlZUltYWdlX0dldFBhbGV0dGUoc3JjKSwKKwkJRnJlZUltYWdlX0dldFJlZE1hc2soc3JjKSwKKwkJRnJlZUltYWdlX0dldEdyZWVuTWFzayhzcmMpLAorCQlGcmVlSW1hZ2VfR2V0Qmx1ZU1hc2soc3JjKSk7CisKKwlpZiAoIWRzdCkgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoKHR5cGUgPT0gRklUX0JJVE1BUCkgJiYgKGJwcCA8PSA0KSkgeworCQlGSUJJVE1BUCAqY29weSA9IEZyZWVJbWFnZV9Db3B5KHNyYywKKwkJCSgobGVmdCA+PSAwKSA/IDAgOiAtbGVmdCksCisJCQkoKHRvcCA+PSAwKSA/IDAgOiAtdG9wKSwKKwkJCSgod2lkdGgrcmlnaHQpPndpZHRoKT93aWR0aDood2lkdGgrcmlnaHQpLAorCQkJKChoZWlnaHQrYm90dG9tKT5oZWlnaHQpP2hlaWdodDooaGVpZ2h0K2JvdHRvbSkpOworCQkKKwkJaWYgKCFjb3B5KSB7CisJCQlGcmVlSW1hZ2VfVW5sb2FkKGRzdCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCWlmICghRnJlZUltYWdlX1Bhc3RlKGRzdCwgY29weSwKKwkJCQkoKGxlZnQgPD0gMCkgPyAwIDogbGVmdCksCisJCQkJKCh0b3AgPD0gMCkgPyAwIDogdG9wKSwgMjU2KSkgeworCQkJRnJlZUltYWdlX1VubG9hZChjb3B5KTsKKwkJCUZyZWVJbWFnZV9VbmxvYWQoZHN0KTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJRnJlZUltYWdlX1VubG9hZChjb3B5KTsKKworCX0gZWxzZSB7CisKKwkJaW50IGJ5dGVzcHAgPSBicHAgLyA4OworCQlCWVRFICpzcmNQdHIgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoc3JjLCBoZWlnaHQgLSAxIC0gKCh0b3AgPj0gMCkgPyAwIDogLXRvcCkpOworCQlCWVRFICpkc3RQdHIgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZHN0LCBuZXdIZWlnaHQgLSAxIC0gKCh0b3AgPD0gMCkgPyAwIDogdG9wKSk7CisKKwkJdW5zaWduZWQgc3JjUGl0Y2ggPSBGcmVlSW1hZ2VfR2V0UGl0Y2goc3JjKTsKKwkJdW5zaWduZWQgZHN0UGl0Y2ggPSBGcmVlSW1hZ2VfR2V0UGl0Y2goZHN0KTsKKworCQlpbnQgbGluZVdpZHRoID0gYnl0ZXNwcCAqICh3aWR0aCArIE1JTigwLCBsZWZ0KSArIE1JTigwLCByaWdodCkpOworCQlpbnQgbGluZXMgPSBoZWlnaHQgKyBNSU4oMCwgdG9wKSArIE1JTigwLCBib3R0b20pOworCisJCWlmIChsZWZ0IDw9IDApIHsKKwkJCXNyY1B0ciArPSAoLWxlZnQgKiBieXRlc3BwKTsKKwkJfSBlbHNlIHsKKwkJCWRzdFB0ciArPSAobGVmdCAqIGJ5dGVzcHApOworCQl9CisKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5lczsgaSsrKSB7CisJCQltZW1jcHkoZHN0UHRyLCBzcmNQdHIsIGxpbmVXaWR0aCk7CisJCQlzcmNQdHIgLT0gc3JjUGl0Y2g7CisJCQlkc3RQdHIgLT0gZHN0UGl0Y2g7CisJCX0KKwl9CisKKwkvLyBjb3B5IG1ldGFkYXRhIGZyb20gc3JjIHRvIGRzdAorCUZyZWVJbWFnZV9DbG9uZU1ldGFkYXRhKGRzdCwgc3JjKTsKKwkKKwkvLyBjb3B5IHRyYW5zcGFyZW5jeSB0YWJsZSAKKwlGcmVlSW1hZ2VfU2V0VHJhbnNwYXJlbmN5VGFibGUoZHN0LCBGcmVlSW1hZ2VfR2V0VHJhbnNwYXJlbmN5VGFibGUoc3JjKSwgRnJlZUltYWdlX0dldFRyYW5zcGFyZW5jeUNvdW50KHNyYykpOworCQorCS8vIGNvcHkgYmFja2dyb3VuZCBjb2xvciAKKwlSR0JRVUFEIGJrY29sb3I7IAorCWlmKCBGcmVlSW1hZ2VfR2V0QmFja2dyb3VuZENvbG9yKHNyYywgJmJrY29sb3IpICkgeworCQlGcmVlSW1hZ2VfU2V0QmFja2dyb3VuZENvbG9yKGRzdCwgJmJrY29sb3IpOyAKKwl9CisJCisJLy8gY2xvbmUgcmVzb2x1dGlvbiAKKwlGcmVlSW1hZ2VfU2V0RG90c1Blck1ldGVyWChkc3QsIEZyZWVJbWFnZV9HZXREb3RzUGVyTWV0ZXJYKHNyYykpOyAKKwlGcmVlSW1hZ2VfU2V0RG90c1Blck1ldGVyWShkc3QsIEZyZWVJbWFnZV9HZXREb3RzUGVyTWV0ZXJZKHNyYykpOyAKKwkKKwkvLyBjbG9uZSBJQ0MgcHJvZmlsZSAKKwlGSUlDQ1BST0ZJTEUgKnNyY19wcm9maWxlID0gRnJlZUltYWdlX0dldElDQ1Byb2ZpbGUoc3JjKTsgCisJRklJQ0NQUk9GSUxFICpkc3RfcHJvZmlsZSA9IEZyZWVJbWFnZV9DcmVhdGVJQ0NQcm9maWxlKGRzdCwgc3JjX3Byb2ZpbGUtPmRhdGEsIHNyY19wcm9maWxlLT5zaXplKTsgCisJZHN0X3Byb2ZpbGUtPmZsYWdzID0gc3JjX3Byb2ZpbGUtPmZsYWdzOyAKKworCXJldHVybiBkc3Q7Cit9CisKZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2VUb29sa2l0L0NoYW5uZWxzLmNwcCBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2VUb29sa2l0L0NoYW5uZWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjAxYWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZmlsZXMvU291cmNlL0ZyZWVJbWFnZVRvb2xraXQvQ2hhbm5lbHMuY3BwCkBAIC0wLDAgKzEsNDg4IEBACisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBDaGFubmVsIHByb2Nlc3Npbmcgc3VwcG9ydAorLy8KKy8vIERlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gYnkKKy8vIC0gSGVydukgRHJvbG9uIChkcm9sb25AaW5mb25pZS5mcikKKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBGcmVlSW1hZ2UgMworLy8KKy8vIENPVkVSRUQgQ09ERSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWQorLy8gT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMKKy8vIFRIQVQgVEhFIENPVkVSRUQgQ09ERSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLy8gT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQKKy8vIENPREUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkgQ09WRVJFRCBDT0RFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QKKy8vIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZCisvLyBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMCisvLyBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GIEFOWSBDT1ZFUkVEIENPREUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSCisvLyBUSElTIERJU0NMQUlNRVIuCisvLworLy8gVXNlIGF0IHlvdXIgb3duIHJpc2shCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpbmNsdWRlICJGcmVlSW1hZ2UuaCIKKyNpbmNsdWRlICJVdGlsaXRpZXMuaCIKKworCisvKiogQGJyaWVmIFJldHJpZXZlcyB0aGUgcmVkLCBncmVlbiwgYmx1ZSBvciBhbHBoYSBjaGFubmVsIG9mIGEgQkdSW0FdIGltYWdlLiAKK0BwYXJhbSBzcmMgSW5wdXQgaW1hZ2UgdG8gYmUgcHJvY2Vzc2VkLgorQHBhcmFtIGNoYW5uZWwgQ29sb3IgY2hhbm5lbCB0byBleHRyYWN0CitAcmV0dXJuIFJldHVybnMgdGhlIGV4dHJhY3RlZCBjaGFubmVsIGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgTlVMTCBvdGhlcndpc2UuCisqLworRklCSVRNQVAgKiBETExfQ0FMTENPTlYgCitGcmVlSW1hZ2VfR2V0Q2hhbm5lbChGSUJJVE1BUCAqc3JjLCBGUkVFX0lNQUdFX0NPTE9SX0NIQU5ORUwgY2hhbm5lbCkgeworCisJaWYoIUZyZWVJbWFnZV9IYXNQaXhlbHMoc3JjKSkgcmV0dXJuIE5VTEw7CisKKwlGUkVFX0lNQUdFX1RZUEUgaW1hZ2VfdHlwZSA9IEZyZWVJbWFnZV9HZXRJbWFnZVR5cGUoc3JjKTsKKwl1bnNpZ25lZCBicHAgPSBGcmVlSW1hZ2VfR2V0QlBQKHNyYyk7CisKKwkvLyAyNC0gb3IgMzItYml0IAorCWlmKGltYWdlX3R5cGUgPT0gRklUX0JJVE1BUCAmJiAoKGJwcCA9PSAyNCkgfHwgKGJwcCA9PSAzMikpKSB7CisJCWludCBjOworCisJCS8vIHNlbGVjdCB0aGUgY2hhbm5lbCB0byBleHRyYWN0CisJCXN3aXRjaChjaGFubmVsKSB7CisJCQljYXNlIEZJQ0NfQkxVRToKKwkJCQljID0gRklfUkdCQV9CTFVFOworCQkJCWJyZWFrOworCQkJY2FzZSBGSUNDX0dSRUVOOgorCQkJCWMgPSBGSV9SR0JBX0dSRUVOOworCQkJCWJyZWFrOworCQkJY2FzZSBGSUNDX1JFRDogCisJCQkJYyA9IEZJX1JHQkFfUkVEOworCQkJCWJyZWFrOworCQkJY2FzZSBGSUNDX0FMUEhBOgorCQkJCWlmKGJwcCAhPSAzMikgcmV0dXJuIE5VTEw7CisJCQkJYyA9IEZJX1JHQkFfQUxQSEE7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXJldHVybiBOVUxMOworCQl9CisKKwkJLy8gYWxsb2NhdGUgYSA4LWJpdCBkaWIKKwkJdW5zaWduZWQgd2lkdGggID0gRnJlZUltYWdlX0dldFdpZHRoKHNyYyk7CisJCXVuc2lnbmVkIGhlaWdodCA9IEZyZWVJbWFnZV9HZXRIZWlnaHQoc3JjKTsKKwkJRklCSVRNQVAgKmRzdCA9IEZyZWVJbWFnZV9BbGxvY2F0ZSh3aWR0aCwgaGVpZ2h0LCA4KSA7CisJCWlmKCFkc3QpIHJldHVybiBOVUxMOworCQkvLyBidWlsZCBhIGdyZXlzY2FsZSBwYWxldHRlCisJCVJHQlFVQUQgKnBhbCA9IEZyZWVJbWFnZV9HZXRQYWxldHRlKGRzdCk7CisJCWZvcihpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQkJcGFsW2ldLnJnYkJsdWUgPSBwYWxbaV0ucmdiR3JlZW4gPSBwYWxbaV0ucmdiUmVkID0gKEJZVEUpaTsKKwkJfQorCisJCS8vIHBlcmZvcm0gZXh0cmFjdGlvbgorCisJCWludCBieXRlc3BwID0gYnBwIC8gODsJLy8gYnl0ZXMgLyBwaXhlbAorCisJCWZvcih1bnNpZ25lZCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisJCQlCWVRFICpzcmNfYml0cyA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShzcmMsIHkpOworCQkJQllURSAqZHN0X2JpdHMgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZHN0LCB5KTsKKwkJCWZvcih1bnNpZ25lZCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQlkc3RfYml0c1t4XSA9IHNyY19iaXRzW2NdOworCQkJCXNyY19iaXRzICs9IGJ5dGVzcHA7CisJCQl9CisJCX0KKworCQkvLyBjb3B5IG1ldGFkYXRhIGZyb20gc3JjIHRvIGRzdAorCQlGcmVlSW1hZ2VfQ2xvbmVNZXRhZGF0YShkc3QsIHNyYyk7CisJCQorCQlyZXR1cm4gZHN0OworCX0KKworCS8vIDQ4LWJpdCBSR0Igb3IgNjQtYml0IFJHQkEgaW1hZ2VzCisJaWYoKGltYWdlX3R5cGUgPT0gRklUX1JHQjE2KSB8fCAgKGltYWdlX3R5cGUgPT0gRklUX1JHQkExNikpIHsKKwkJaW50IGM7CisKKwkJLy8gc2VsZWN0IHRoZSBjaGFubmVsIHRvIGV4dHJhY3QgKGFsd2F5cyBSR0JbQV0pCisJCXN3aXRjaChjaGFubmVsKSB7CisJCQljYXNlIEZJQ0NfQkxVRToKKwkJCQljID0gMjsKKwkJCQlicmVhazsKKwkJCWNhc2UgRklDQ19HUkVFTjoKKwkJCQljID0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRklDQ19SRUQ6IAorCQkJCWMgPSAwOworCQkJCWJyZWFrOworCQkJY2FzZSBGSUNDX0FMUEhBOgorCQkJCWlmKGJwcCAhPSA2NCkgcmV0dXJuIE5VTEw7CisJCQkJYyA9IDM7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXJldHVybiBOVUxMOworCQl9CisKKwkJLy8gYWxsb2NhdGUgYSBncmV5c2NhbGUgZGliCisJCXVuc2lnbmVkIHdpZHRoICA9IEZyZWVJbWFnZV9HZXRXaWR0aChzcmMpOworCQl1bnNpZ25lZCBoZWlnaHQgPSBGcmVlSW1hZ2VfR2V0SGVpZ2h0KHNyYyk7CisJCUZJQklUTUFQICpkc3QgPSBGcmVlSW1hZ2VfQWxsb2NhdGVUKEZJVF9VSU5UMTYsIHdpZHRoLCBoZWlnaHQpIDsKKwkJaWYoIWRzdCkgcmV0dXJuIE5VTEw7CisKKwkJLy8gcGVyZm9ybSBleHRyYWN0aW9uCisKKwkJaW50IGJ5dGVzcHAgPSBicHAgLyAxNjsJLy8gd29yZHMgLyBwaXhlbAorCisJCWZvcih1bnNpZ25lZCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisJCQl1bnNpZ25lZCBzaG9ydCAqc3JjX2JpdHMgPSAodW5zaWduZWQgc2hvcnQqKUZyZWVJbWFnZV9HZXRTY2FuTGluZShzcmMsIHkpOworCQkJdW5zaWduZWQgc2hvcnQgKmRzdF9iaXRzID0gKHVuc2lnbmVkIHNob3J0KilGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZHN0LCB5KTsKKwkJCWZvcih1bnNpZ25lZCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQlkc3RfYml0c1t4XSA9IHNyY19iaXRzW2NdOworCQkJCXNyY19iaXRzICs9IGJ5dGVzcHA7CisJCQl9CisJCX0KKworCQkvLyBjb3B5IG1ldGFkYXRhIGZyb20gc3JjIHRvIGRzdAorCQlGcmVlSW1hZ2VfQ2xvbmVNZXRhZGF0YShkc3QsIHNyYyk7CisJCQorCQlyZXR1cm4gZHN0OworCX0KKworCS8vIDk2LWJpdCBSR0JGIG9yIDEyOC1iaXQgUkdCQUYgaW1hZ2VzCisJaWYoKGltYWdlX3R5cGUgPT0gRklUX1JHQkYpIHx8ICAoaW1hZ2VfdHlwZSA9PSBGSVRfUkdCQUYpKSB7CisJCWludCBjOworCisJCS8vIHNlbGVjdCB0aGUgY2hhbm5lbCB0byBleHRyYWN0IChhbHdheXMgUkdCW0FdKQorCQlzd2l0Y2goY2hhbm5lbCkgeworCQkJY2FzZSBGSUNDX0JMVUU6CisJCQkJYyA9IDI7CisJCQkJYnJlYWs7CisJCQljYXNlIEZJQ0NfR1JFRU46CisJCQkJYyA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlIEZJQ0NfUkVEOiAKKwkJCQljID0gMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgRklDQ19BTFBIQToKKwkJCQlpZihicHAgIT0gMTI4KSByZXR1cm4gTlVMTDsKKwkJCQljID0gMzsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQkvLyBhbGxvY2F0ZSBhIGdyZXlzY2FsZSBkaWIKKwkJdW5zaWduZWQgd2lkdGggID0gRnJlZUltYWdlX0dldFdpZHRoKHNyYyk7CisJCXVuc2lnbmVkIGhlaWdodCA9IEZyZWVJbWFnZV9HZXRIZWlnaHQoc3JjKTsKKwkJRklCSVRNQVAgKmRzdCA9IEZyZWVJbWFnZV9BbGxvY2F0ZVQoRklUX0ZMT0FULCB3aWR0aCwgaGVpZ2h0KSA7CisJCWlmKCFkc3QpIHJldHVybiBOVUxMOworCisJCS8vIHBlcmZvcm0gZXh0cmFjdGlvbgorCisJCWludCBieXRlc3BwID0gYnBwIC8gMzI7CS8vIGZsb2F0cyAvIHBpeGVsCisKKwkJZm9yKHVuc2lnbmVkIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJCWZsb2F0ICpzcmNfYml0cyA9IChmbG9hdCopRnJlZUltYWdlX0dldFNjYW5MaW5lKHNyYywgeSk7CisJCQlmbG9hdCAqZHN0X2JpdHMgPSAoZmxvYXQqKUZyZWVJbWFnZV9HZXRTY2FuTGluZShkc3QsIHkpOworCQkJZm9yKHVuc2lnbmVkIHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworCQkJCWRzdF9iaXRzW3hdID0gc3JjX2JpdHNbY107CisJCQkJc3JjX2JpdHMgKz0gYnl0ZXNwcDsKKwkJCX0KKwkJfQorCisJCS8vIGNvcHkgbWV0YWRhdGEgZnJvbSBzcmMgdG8gZHN0CisJCUZyZWVJbWFnZV9DbG9uZU1ldGFkYXRhKGRzdCwgc3JjKTsKKwkJCisJCXJldHVybiBkc3Q7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKiBAYnJpZWYgSW5zZXJ0IGEgZ3JleXNjYWxlIGRpYiBpbnRvIGEgUkdCW0FdIGltYWdlLiAKK0JvdGggc3JjIGFuZCBkc3QgbXVzdCBoYXZlIHRoZSBzYW1lIHdpZHRoIGFuZCBoZWlnaHQuCitAcGFyYW0gZHN0IEltYWdlIHRvIG1vZGlmeSAoUkdCIG9yIFJHQkEpCitAcGFyYW0gc3JjIElucHV0IGdyZXlzY2FsZSBpbWFnZSB0byBpbnNlcnQKK0BwYXJhbSBjaGFubmVsIENvbG9yIGNoYW5uZWwgdG8gbW9kaWZ5CitAcmV0dXJuIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UuCisqLworQk9PTCBETExfQ0FMTENPTlYgCitGcmVlSW1hZ2VfU2V0Q2hhbm5lbChGSUJJVE1BUCAqZHN0LCBGSUJJVE1BUCAqc3JjLCBGUkVFX0lNQUdFX0NPTE9SX0NIQU5ORUwgY2hhbm5lbCkgeworCWludCBjOworCisJaWYoIUZyZWVJbWFnZV9IYXNQaXhlbHMoc3JjKSB8fCAhRnJlZUltYWdlX0hhc1BpeGVscyhkc3QpKSByZXR1cm4gRkFMU0U7CisJCisJLy8gc3JjIGFuZCBkc3QgaW1hZ2VzIHNob3VsZCBoYXZlIHRoZSBzYW1lIHdpZHRoIGFuZCBoZWlnaHQKKwl1bnNpZ25lZCBzcmNfd2lkdGggID0gRnJlZUltYWdlX0dldFdpZHRoKHNyYyk7CisJdW5zaWduZWQgc3JjX2hlaWdodCA9IEZyZWVJbWFnZV9HZXRIZWlnaHQoc3JjKTsKKwl1bnNpZ25lZCBkc3Rfd2lkdGggID0gRnJlZUltYWdlX0dldFdpZHRoKGRzdCk7CisJdW5zaWduZWQgZHN0X2hlaWdodCA9IEZyZWVJbWFnZV9HZXRIZWlnaHQoZHN0KTsKKwlpZigoc3JjX3dpZHRoICE9IGRzdF93aWR0aCkgfHwgKHNyY19oZWlnaHQgIT0gZHN0X2hlaWdodCkpCisJCXJldHVybiBGQUxTRTsKKworCS8vIHNyYyBpbWFnZSBzaG91bGQgYmUgZ3JheXNjYWxlLCBkc3QgaW1hZ2Ugc2hvdWxkIGJlIFJHQiBvciBSR0JBCisJRlJFRV9JTUFHRV9DT0xPUl9UWVBFIHNyY190eXBlID0gRnJlZUltYWdlX0dldENvbG9yVHlwZShzcmMpOworCUZSRUVfSU1BR0VfQ09MT1JfVFlQRSBkc3RfdHlwZSA9IEZyZWVJbWFnZV9HZXRDb2xvclR5cGUoZHN0KTsKKwlpZigoZHN0X3R5cGUgIT0gRklDX1JHQikgJiYgKGRzdF90eXBlICE9IEZJQ19SR0JBTFBIQSkgfHwgKHNyY190eXBlICE9IEZJQ19NSU5JU0JMQUNLKSkgeworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJRlJFRV9JTUFHRV9UWVBFIHNyY19pbWFnZV90eXBlID0gRnJlZUltYWdlX0dldEltYWdlVHlwZShzcmMpOworCUZSRUVfSU1BR0VfVFlQRSBkc3RfaW1hZ2VfdHlwZSA9IEZyZWVJbWFnZV9HZXRJbWFnZVR5cGUoZHN0KTsKKworCWlmKChkc3RfaW1hZ2VfdHlwZSA9PSBGSVRfQklUTUFQKSAmJiAoc3JjX2ltYWdlX3R5cGUgPT0gRklUX0JJVE1BUCkpIHsKKworCQkvLyBzcmMgaW1hZ2Ugc2hvdWxkIGJlIGdyYXlzY2FsZSwgZHN0IGltYWdlIHNob3VsZCBiZSAyNC0gb3IgMzItYml0CisJCXVuc2lnbmVkIHNyY19icHAgPSBGcmVlSW1hZ2VfR2V0QlBQKHNyYyk7CisJCXVuc2lnbmVkIGRzdF9icHAgPSBGcmVlSW1hZ2VfR2V0QlBQKGRzdCk7CisJCWlmKChzcmNfYnBwICE9IDgpIHx8IChkc3RfYnBwICE9IDI0KSAmJiAoZHN0X2JwcCAhPSAzMikpCisJCQlyZXR1cm4gRkFMU0U7CisKKworCQkvLyBzZWxlY3QgdGhlIGNoYW5uZWwgdG8gbW9kaWZ5CisJCXN3aXRjaChjaGFubmVsKSB7CisJCQljYXNlIEZJQ0NfQkxVRToKKwkJCQljID0gRklfUkdCQV9CTFVFOworCQkJCWJyZWFrOworCQkJY2FzZSBGSUNDX0dSRUVOOgorCQkJCWMgPSBGSV9SR0JBX0dSRUVOOworCQkJCWJyZWFrOworCQkJY2FzZSBGSUNDX1JFRDogCisJCQkJYyA9IEZJX1JHQkFfUkVEOworCQkJCWJyZWFrOworCQkJY2FzZSBGSUNDX0FMUEhBOgorCQkJCWlmKGRzdF9icHAgIT0gMzIpIHJldHVybiBGQUxTRTsKKwkJCQljID0gRklfUkdCQV9BTFBIQTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIEZBTFNFOworCQl9CisKKwkJLy8gcGVyZm9ybSBpbnNlcnRpb24KKworCQlpbnQgYnl0ZXNwcCA9IGRzdF9icHAgLyA4OwkvLyBieXRlcyAvIHBpeGVsCisKKwkJZm9yKHVuc2lnbmVkIHkgPSAwOyB5IDwgZHN0X2hlaWdodDsgeSsrKSB7CisJCQlCWVRFICpzcmNfYml0cyA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShzcmMsIHkpOworCQkJQllURSAqZHN0X2JpdHMgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZHN0LCB5KTsKKwkJCWZvcih1bnNpZ25lZCB4ID0gMDsgeCA8IGRzdF93aWR0aDsgeCsrKSB7CisJCQkJZHN0X2JpdHNbY10gPSBzcmNfYml0c1t4XTsKKwkJCQlkc3RfYml0cyArPSBieXRlc3BwOworCQkJfQorCQl9CisKKwkJcmV0dXJuIFRSVUU7CisJfQorCisJaWYoKChkc3RfaW1hZ2VfdHlwZSA9PSBGSVRfUkdCMTYpIHx8IChkc3RfaW1hZ2VfdHlwZSA9PSBGSVRfUkdCQTE2KSkgJiYgKHNyY19pbWFnZV90eXBlID09IEZJVF9VSU5UMTYpKSB7CisKKwkJLy8gc3JjIGltYWdlIHNob3VsZCBiZSBncmF5c2NhbGUsIGRzdCBpbWFnZSBzaG91bGQgYmUgNDgtIG9yIDY0LWJpdAorCQl1bnNpZ25lZCBzcmNfYnBwID0gRnJlZUltYWdlX0dldEJQUChzcmMpOworCQl1bnNpZ25lZCBkc3RfYnBwID0gRnJlZUltYWdlX0dldEJQUChkc3QpOworCQlpZigoc3JjX2JwcCAhPSAxNikgfHwgKGRzdF9icHAgIT0gNDgpICYmIChkc3RfYnBwICE9IDY0KSkKKwkJCXJldHVybiBGQUxTRTsKKworCisJCS8vIHNlbGVjdCB0aGUgY2hhbm5lbCB0byBtb2RpZnkgKGFsd2F5cyBSR0JbQV0pCisJCXN3aXRjaChjaGFubmVsKSB7CisJCQljYXNlIEZJQ0NfQkxVRToKKwkJCQljID0gMjsKKwkJCQlicmVhazsKKwkJCWNhc2UgRklDQ19HUkVFTjoKKwkJCQljID0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRklDQ19SRUQ6IAorCQkJCWMgPSAwOworCQkJCWJyZWFrOworCQkJY2FzZSBGSUNDX0FMUEhBOgorCQkJCWlmKGRzdF9icHAgIT0gNjQpIHJldHVybiBGQUxTRTsKKwkJCQljID0gMzsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIEZBTFNFOworCQl9CisKKwkJLy8gcGVyZm9ybSBpbnNlcnRpb24KKworCQlpbnQgYnl0ZXNwcCA9IGRzdF9icHAgLyAxNjsJLy8gd29yZHMgLyBwaXhlbAorCisJCWZvcih1bnNpZ25lZCB5ID0gMDsgeSA8IGRzdF9oZWlnaHQ7IHkrKykgeworCQkJdW5zaWduZWQgc2hvcnQgKnNyY19iaXRzID0gKHVuc2lnbmVkIHNob3J0KilGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoc3JjLCB5KTsKKwkJCXVuc2lnbmVkIHNob3J0ICpkc3RfYml0cyA9ICh1bnNpZ25lZCBzaG9ydCopRnJlZUltYWdlX0dldFNjYW5MaW5lKGRzdCwgeSk7CisJCQlmb3IodW5zaWduZWQgeCA9IDA7IHggPCBkc3Rfd2lkdGg7IHgrKykgeworCQkJCWRzdF9iaXRzW2NdID0gc3JjX2JpdHNbeF07CisJCQkJZHN0X2JpdHMgKz0gYnl0ZXNwcDsKKwkJCX0KKwkJfQorCisJCXJldHVybiBUUlVFOworCX0KKwkKKwlpZigoKGRzdF9pbWFnZV90eXBlID09IEZJVF9SR0JGKSB8fCAoZHN0X2ltYWdlX3R5cGUgPT0gRklUX1JHQkFGKSkgJiYgKHNyY19pbWFnZV90eXBlID09IEZJVF9GTE9BVCkpIHsKKworCQkvLyBzcmMgaW1hZ2Ugc2hvdWxkIGJlIGdyYXlzY2FsZSwgZHN0IGltYWdlIHNob3VsZCBiZSA5Ni0gb3IgMTI4LWJpdAorCQl1bnNpZ25lZCBzcmNfYnBwID0gRnJlZUltYWdlX0dldEJQUChzcmMpOworCQl1bnNpZ25lZCBkc3RfYnBwID0gRnJlZUltYWdlX0dldEJQUChkc3QpOworCQlpZigoc3JjX2JwcCAhPSAzMikgfHwgKGRzdF9icHAgIT0gOTYpICYmIChkc3RfYnBwICE9IDEyOCkpCisJCQlyZXR1cm4gRkFMU0U7CisKKworCQkvLyBzZWxlY3QgdGhlIGNoYW5uZWwgdG8gbW9kaWZ5IChhbHdheXMgUkdCW0FdKQorCQlzd2l0Y2goY2hhbm5lbCkgeworCQkJY2FzZSBGSUNDX0JMVUU6CisJCQkJYyA9IDI7CisJCQkJYnJlYWs7CisJCQljYXNlIEZJQ0NfR1JFRU46CisJCQkJYyA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlIEZJQ0NfUkVEOiAKKwkJCQljID0gMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgRklDQ19BTFBIQToKKwkJCQlpZihkc3RfYnBwICE9IDEyOCkgcmV0dXJuIEZBTFNFOworCQkJCWMgPSAzOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gRkFMU0U7CisJCX0KKworCQkvLyBwZXJmb3JtIGluc2VydGlvbgorCisJCWludCBieXRlc3BwID0gZHN0X2JwcCAvIDMyOwkvLyBmbG9hdHMgLyBwaXhlbAorCisJCWZvcih1bnNpZ25lZCB5ID0gMDsgeSA8IGRzdF9oZWlnaHQ7IHkrKykgeworCQkJZmxvYXQgKnNyY19iaXRzID0gKGZsb2F0KilGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoc3JjLCB5KTsKKwkJCWZsb2F0ICpkc3RfYml0cyA9IChmbG9hdCopRnJlZUltYWdlX0dldFNjYW5MaW5lKGRzdCwgeSk7CisJCQlmb3IodW5zaWduZWQgeCA9IDA7IHggPCBkc3Rfd2lkdGg7IHgrKykgeworCQkJCWRzdF9iaXRzW2NdID0gc3JjX2JpdHNbeF07CisJCQkJZHN0X2JpdHMgKz0gYnl0ZXNwcDsKKwkJCX0KKwkJfQorCisJCXJldHVybiBUUlVFOworCX0KKworCXJldHVybiBGQUxTRTsKK30KKworLyoqIEBicmllZiBSZXRyaWV2ZXMgdGhlIHJlYWwgcGFydCwgaW1hZ2luYXJ5IHBhcnQsIG1hZ25pdHVkZSBvciBwaGFzZSBvZiBhIGNvbXBsZXggaW1hZ2UuCitAcGFyYW0gc3JjIElucHV0IGltYWdlIHRvIGJlIHByb2Nlc3NlZC4KK0BwYXJhbSBjaGFubmVsIENoYW5uZWwgdG8gZXh0cmFjdAorQHJldHVybiBSZXR1cm5zIHRoZSBleHRyYWN0ZWQgY2hhbm5lbCBpZiBzdWNjZXNzZnVsLCByZXR1cm5zIE5VTEwgb3RoZXJ3aXNlLgorKi8KK0ZJQklUTUFQICogRExMX0NBTExDT05WIAorRnJlZUltYWdlX0dldENvbXBsZXhDaGFubmVsKEZJQklUTUFQICpzcmMsIEZSRUVfSU1BR0VfQ09MT1JfQ0hBTk5FTCBjaGFubmVsKSB7CisJdW5zaWduZWQgeCwgeTsKKwlkb3VibGUgbWFnLCBwaGFzZTsKKwlGSUNPTVBMRVggKnNyY19iaXRzID0gTlVMTDsKKwlkb3VibGUgKmRzdF9iaXRzID0gTlVMTDsKKwlGSUJJVE1BUCAqZHN0ID0gTlVMTDsKKworCWlmKCFGcmVlSW1hZ2VfSGFzUGl4ZWxzKHNyYykpIHJldHVybiBOVUxMOworCisJaWYoRnJlZUltYWdlX0dldEltYWdlVHlwZShzcmMpID09IEZJVF9DT01QTEVYKSB7CisJCS8vIGFsbG9jYXRlIGEgZGliIG9mIHR5cGUgRklUX0RPVUJMRQorCQl1bnNpZ25lZCB3aWR0aCAgPSBGcmVlSW1hZ2VfR2V0V2lkdGgoc3JjKTsKKwkJdW5zaWduZWQgaGVpZ2h0ID0gRnJlZUltYWdlX0dldEhlaWdodChzcmMpOworCQlkc3QgPSBGcmVlSW1hZ2VfQWxsb2NhdGVUKEZJVF9ET1VCTEUsIHdpZHRoLCBoZWlnaHQpIDsKKwkJaWYoIWRzdCkgcmV0dXJuIE5VTEw7CisKKwkJLy8gcGVyZm9ybSBleHRyYWN0aW9uCisKKwkJc3dpdGNoKGNoYW5uZWwpIHsKKwkJCWNhc2UgRklDQ19SRUFMOiAvLyByZWFsIHBhcnQKKwkJCQlmb3IoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworCQkJCQlzcmNfYml0cyA9IChGSUNPTVBMRVggKilGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoc3JjLCB5KTsKKwkJCQkJZHN0X2JpdHMgPSAoZG91YmxlICopRnJlZUltYWdlX0dldFNjYW5MaW5lKGRzdCwgeSk7CisJCQkJCWZvcih4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQkJCWRzdF9iaXRzW3hdID0gc3JjX2JpdHNbeF0ucjsKKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKworCQkJY2FzZSBGSUNDX0lNQUc6IC8vIGltYWdpbmFyeSBwYXJ0CisJCQkJZm9yKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJCQkJc3JjX2JpdHMgPSAoRklDT01QTEVYICopRnJlZUltYWdlX0dldFNjYW5MaW5lKHNyYywgeSk7CisJCQkJCWRzdF9iaXRzID0gKGRvdWJsZSAqKUZyZWVJbWFnZV9HZXRTY2FuTGluZShkc3QsIHkpOworCQkJCQlmb3IoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisJCQkJCQlkc3RfYml0c1t4XSA9IHNyY19iaXRzW3hdLmk7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgRklDQ19NQUc6IC8vIG1hZ25pdHVkZQorCQkJCWZvcih5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisJCQkJCXNyY19iaXRzID0gKEZJQ09NUExFWCAqKUZyZWVJbWFnZV9HZXRTY2FuTGluZShzcmMsIHkpOworCQkJCQlkc3RfYml0cyA9IChkb3VibGUgKilGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZHN0LCB5KTsKKwkJCQkJZm9yKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworCQkJCQkJbWFnID0gc3JjX2JpdHNbeF0uciAqIHNyY19iaXRzW3hdLnIgKyBzcmNfYml0c1t4XS5pICogc3JjX2JpdHNbeF0uaTsKKwkJCQkJCWRzdF9iaXRzW3hdID0gc3FydChtYWcpOworCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCisJCQljYXNlIEZJQ0NfUEhBU0U6IC8vIHBoYXNlCisJCQkJZm9yKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJCQkJc3JjX2JpdHMgPSAoRklDT01QTEVYICopRnJlZUltYWdlX0dldFNjYW5MaW5lKHNyYywgeSk7CisJCQkJCWRzdF9iaXRzID0gKGRvdWJsZSAqKUZyZWVJbWFnZV9HZXRTY2FuTGluZShkc3QsIHkpOworCQkJCQlmb3IoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisJCQkJCQlpZigoc3JjX2JpdHNbeF0uciA9PSAwKSAmJiAoc3JjX2JpdHNbeF0uaSA9PSAwKSkgeworCQkJCQkJCXBoYXNlID0gMDsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJcGhhc2UgPSBhdGFuMihzcmNfYml0c1t4XS5pLCBzcmNfYml0c1t4XS5yKTsKKwkJCQkJCX0KKwkJCQkJCWRzdF9iaXRzW3hdID0gcGhhc2U7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvLyBjb3B5IG1ldGFkYXRhIGZyb20gc3JjIHRvIGRzdAorCUZyZWVJbWFnZV9DbG9uZU1ldGFkYXRhKGRzdCwgc3JjKTsKKwkKKwlyZXR1cm4gZHN0OworfQorCisvKiogQGJyaWVmIFNldCB0aGUgcmVhbCBvciBpbWFnaW5hcnkgcGFydCBvZiBhIGNvbXBsZXggaW1hZ2UuCitCb3RoIHNyYyBhbmQgZHN0IG11c3QgaGF2ZSB0aGUgc2FtZSB3aWR0aCBhbmQgaGVpZ2h0LgorQHBhcmFtIGRzdCBJbWFnZSB0byBtb2RpZnkgKGltYWdlIG9mIHR5cGUgRklUX0NPTVBMRVgpCitAcGFyYW0gc3JjIElucHV0IGltYWdlIG9mIHR5cGUgRklUX0RPVUJMRQorQHBhcmFtIGNoYW5uZWwgQ2hhbm5lbCB0byBtb2RpZnkKK0ByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZS4KKyovCitCT09MIERMTF9DQUxMQ09OViAKK0ZyZWVJbWFnZV9TZXRDb21wbGV4Q2hhbm5lbChGSUJJVE1BUCAqZHN0LCBGSUJJVE1BUCAqc3JjLCBGUkVFX0lNQUdFX0NPTE9SX0NIQU5ORUwgY2hhbm5lbCkgeworCXVuc2lnbmVkIHgsIHk7CisJZG91YmxlICpzcmNfYml0cyA9IE5VTEw7CisJRklDT01QTEVYICpkc3RfYml0cyA9IE5VTEw7CisKKwlpZighRnJlZUltYWdlX0hhc1BpeGVscyhzcmMpIHx8ICFGcmVlSW1hZ2VfSGFzUGl4ZWxzKGRzdCkpIHJldHVybiBGQUxTRTsKKworCS8vIHNyYyBpbWFnZSBzaG91bGQgYmUgb2YgdHlwZSBGSVRfRE9VQkxFLCBkc3QgaW1hZ2Ugc2hvdWxkIGJlIG9mIHR5cGUgRklUX0NPTVBMRVgKKwljb25zdCBGUkVFX0lNQUdFX1RZUEUgc3JjX3R5cGUgPSBGcmVlSW1hZ2VfR2V0SW1hZ2VUeXBlKHNyYyk7CisJY29uc3QgRlJFRV9JTUFHRV9UWVBFIGRzdF90eXBlID0gRnJlZUltYWdlX0dldEltYWdlVHlwZShkc3QpOworCWlmKChzcmNfdHlwZSAhPSBGSVRfRE9VQkxFKSB8fCAoZHN0X3R5cGUgIT0gRklUX0NPTVBMRVgpKQorCQlyZXR1cm4gRkFMU0U7CisKKwkvLyBzcmMgYW5kIGRzdCBpbWFnZXMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgd2lkdGggYW5kIGhlaWdodAorCXVuc2lnbmVkIHNyY193aWR0aCAgPSBGcmVlSW1hZ2VfR2V0V2lkdGgoc3JjKTsKKwl1bnNpZ25lZCBzcmNfaGVpZ2h0ID0gRnJlZUltYWdlX0dldEhlaWdodChzcmMpOworCXVuc2lnbmVkIGRzdF93aWR0aCAgPSBGcmVlSW1hZ2VfR2V0V2lkdGgoZHN0KTsKKwl1bnNpZ25lZCBkc3RfaGVpZ2h0ID0gRnJlZUltYWdlX0dldEhlaWdodChkc3QpOworCWlmKChzcmNfd2lkdGggIT0gZHN0X3dpZHRoKSB8fCAoc3JjX2hlaWdodCAhPSBkc3RfaGVpZ2h0KSkKKwkJcmV0dXJuIEZBTFNFOworCisJLy8gc2VsZWN0IHRoZSBjaGFubmVsIHRvIG1vZGlmeQorCXN3aXRjaChjaGFubmVsKSB7CisJCWNhc2UgRklDQ19SRUFMOiAvLyByZWFsIHBhcnQKKwkJCWZvcih5ID0gMDsgeSA8IGRzdF9oZWlnaHQ7IHkrKykgeworCQkJCXNyY19iaXRzID0gKGRvdWJsZSAqKUZyZWVJbWFnZV9HZXRTY2FuTGluZShzcmMsIHkpOworCQkJCWRzdF9iaXRzID0gKEZJQ09NUExFWCAqKUZyZWVJbWFnZV9HZXRTY2FuTGluZShkc3QsIHkpOworCQkJCWZvcih4ID0gMDsgeCA8IGRzdF93aWR0aDsgeCsrKSB7CisJCQkJCWRzdF9iaXRzW3hdLnIgPSBzcmNfYml0c1t4XTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBGSUNDX0lNQUc6IC8vIGltYWdpbmFyeSBwYXJ0CisJCQlmb3IoeSA9IDA7IHkgPCBkc3RfaGVpZ2h0OyB5KyspIHsKKwkJCQlzcmNfYml0cyA9IChkb3VibGUgKilGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoc3JjLCB5KTsKKwkJCQlkc3RfYml0cyA9IChGSUNPTVBMRVggKilGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZHN0LCB5KTsKKwkJCQlmb3IoeCA9IDA7IHggPCBkc3Rfd2lkdGg7IHgrKykgeworCQkJCQlkc3RfYml0c1t4XS5pID0gc3JjX2JpdHNbeF07CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CmRpZmYgLS1naXQgYS9maWxlcy9Tb3VyY2UvRnJlZUltYWdlVG9vbGtpdC9DbGFzc2ljUm90YXRlLmNwcCBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2VUb29sa2l0L0NsYXNzaWNSb3RhdGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzYzJmOTIKLS0tIC9kZXYvbnVsbAorKysgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlVG9vbGtpdC9DbGFzc2ljUm90YXRlLmNwcApAQCAtMCwwICsxLDkxNyBAQAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gQml0bWFwIHJvdGF0aW9uIGJ5IG1lYW5zIG9mIDMgc2hlYXJzLgorLy8KKy8vIERlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gYnkKKy8vIC0gSGVydukgRHJvbG9uIChkcm9sb25AaW5mb25pZS5mcikKKy8vIC0gVGhvcnN0ZW4gUmFkZGUgKHN1cHBvcnRASWRlYWxTb2Z0d2FyZS5jb20pCisvLyAtIE1paGFpbCBOYXlkZW5vdiAobW5heWRlbm92QHVzZXJzLnNvdXJjZWZvcmdlLm5ldCkKKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBGcmVlSW1hZ2UgMworLy8KKy8vIENPVkVSRUQgQ09ERSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWQorLy8gT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMKKy8vIFRIQVQgVEhFIENPVkVSRUQgQ09ERSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLy8gT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQKKy8vIENPREUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkgQ09WRVJFRCBDT0RFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QKKy8vIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZCisvLyBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMCisvLyBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GIEFOWSBDT1ZFUkVEIENPREUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSCisvLyBUSElTIERJU0NMQUlNRVIuCisvLworLy8gVXNlIGF0IHlvdXIgb3duIHJpc2shCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8qIAorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIFJlZmVyZW5jZXMgOiAKKyBbMV0gUGFldGggQS4sIEEgRmFzdCBBbGdvcml0aG0gZm9yIEdlbmVyYWwgUmFzdGVyIFJvdGF0aW9uLiAKKyBHcmFwaGljcyBHZW1zLCBwLiAxNzksIEFuZHJldyBHbGFzc25lciBlZGl0b3IsIEFjYWRlbWljIFByZXNzLCAxOTkwLiAKKyBbMl0gWWFyaXYgRS4sIEhpZ2ggcXVhbGl0eSBpbWFnZSByb3RhdGlvbiAocm90YXRlIGJ5IHNoZWFyKS4gCisgW09ubGluZV0gaHR0cDovL3d3dy5jb2RlcHJvamVjdC5jb20vYml0bWFwL3JvdGF0ZWJ5c2hlYXIuYXNwCisgWzNdIFRyZXNrdW5vdiBBLiwgRmFzdCBhbmQgaGlnaCBxdWFsaXR5IHRydWUtY29sb3IgYml0bWFwIHJvdGF0aW9uIGZ1bmN0aW9uLgorIFtPbmxpbmVdIGh0dHA6Ly9hbnRvbi50cmVza3Vub3YubmV0L1NvZnR3YXJlL2RvYy9mYXN0X2FuZF9oaWdoX3F1YWxpdHlfdHJ1ZV9jb2xvcl9iaXRtYXBfcm90YXRpb25fZnVuY3Rpb24uaHRtbAorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworI2luY2x1ZGUgIkZyZWVJbWFnZS5oIgorI2luY2x1ZGUgIlV0aWxpdGllcy5oIgorCisjZGVmaW5lIFJCTE9DSwkJNjQJLy8gaW1hZ2UgYmxvY2tzIG9mIFJCTE9DSypSQkxPQ0sgcGl4ZWxzCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qKgorU2tld3MgYSByb3cgaG9yaXpvbnRhbGx5ICh3aXRoIGZpbHRlcmVkIHdlaWdodHMpLiAKK0xpbWl0ZWQgdG8gNDUgZGVncmVlIHNrZXdpbmcgb25seS4gRmlsdGVycyB0d28gYWRqYWNlbnQgcGl4ZWxzLgorUGFyYW1ldGVyIFQgY2FuIGJlIEJZVEUsIFdPUkQgb2YgZmxvYXQuIAorQHBhcmFtIHNyYyBQb2ludGVyIHRvIHNvdXJjZSBpbWFnZSB0byByb3RhdGUKK0BwYXJhbSBkc3QgUG9pbnRlciB0byBkZXN0aW5hdGlvbiBpbWFnZQorQHBhcmFtIHJvdyBSb3cgaW5kZXgKK0BwYXJhbSBpT2Zmc2V0IFNrZXcgb2Zmc2V0CitAcGFyYW0gZFdlaWdodCBSZWxhdGl2ZSB3ZWlnaHQgb2YgcmlnaHQgcGl4ZWwKK0BwYXJhbSBia2NvbG9yIEJhY2tncm91bmQgY29sb3IKKyovCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gdm9pZCAKK0hvcml6b250YWxTa2V3VChGSUJJVE1BUCAqc3JjLCBGSUJJVE1BUCAqZHN0LCBpbnQgcm93LCBpbnQgaU9mZnNldCwgZG91YmxlIHdlaWdodCwgY29uc3Qgdm9pZCAqYmtjb2xvciA9IE5VTEwpIHsKKwlpbnQgaVhQb3M7CisKKwljb25zdCB1bnNpZ25lZCBzcmNfd2lkdGggID0gRnJlZUltYWdlX0dldFdpZHRoKHNyYyk7CisJY29uc3QgdW5zaWduZWQgZHN0X3dpZHRoICA9IEZyZWVJbWFnZV9HZXRXaWR0aChkc3QpOworCisJVCBweGxTcmNbNF0sIHB4bExlZnRbNF0sIHB4bE9sZExlZnRbNF07CS8vIDQgPSA0KnNpemVvZihUKSBtYXgKKwkKKwkvLyBiYWNrZ3JvdW5kCisJY29uc3QgVCBweGxCbGFja1s0XSA9IHswLCAwLCAwLCAwIH07CisJY29uc3QgVCAqcHhsQmtnID0gc3RhdGljX2Nhc3Q8Y29uc3QgVCo+KGJrY29sb3IpOyAvLyBhc3N1bWUgYXQgbGVhc3QgYnl0ZXNwcCBhbmQgNCpzaXplb2YoVCkgbWF4CisJaWYoIXB4bEJrZykgeworCQkvLyBkZWZhdWx0IGJhY2tncm91bmQgY29sb3IgaXMgYmxhY2sKKwkJcHhsQmtnID0gcHhsQmxhY2s7CisJfQorCisJLy8gY2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgcGVyIHBpeGVsCisJY29uc3QgdW5zaWduZWQgYnl0ZXNwcCA9IEZyZWVJbWFnZV9HZXRMaW5lKHNyYykgLyBGcmVlSW1hZ2VfR2V0V2lkdGgoc3JjKTsKKwkvLyBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiBzYW1wbGVzIHBlciBwaXhlbAorCWNvbnN0IHVuc2lnbmVkIHNhbXBsZXMgPSBieXRlc3BwIC8gc2l6ZW9mKFQpOworCisJQllURSAqc3JjX2JpdHMgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoc3JjLCByb3cpOworCUJZVEUgKmRzdF9iaXRzID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKGRzdCwgcm93KTsKKworCS8vIGZpbGwgZ2FwIGxlZnQgb2Ygc2tldyB3aXRoIGJhY2tncm91bmQKKwlpZihia2NvbG9yKSB7CisJCWZvcihpbnQgayA9IDA7IGsgPCBpT2Zmc2V0OyBrKyspIHsKKwkJCW1lbWNweSgmZHN0X2JpdHNbayAqIGJ5dGVzcHBdLCBia2NvbG9yLCBieXRlc3BwKTsKKwkJfQorCQlBc3NpZ25QaXhlbCgoQllURSopJnB4bE9sZExlZnRbMF0sIChCWVRFKilia2NvbG9yLCBieXRlc3BwKTsKKwl9IGVsc2UgeworCQlpZihpT2Zmc2V0ID4gMCkgeworCQkJbWVtc2V0KGRzdF9iaXRzLCAwLCBpT2Zmc2V0ICogYnl0ZXNwcCk7CisJCX0JCQorCQltZW1zZXQoJnB4bE9sZExlZnRbMF0sIDAsIGJ5dGVzcHApOworCX0KKworCWZvcih1bnNpZ25lZCBpID0gMDsgaSA8IHNyY193aWR0aDsgaSsrKSB7CisJCS8vIGxvb3AgdGhyb3VnaCByb3cgcGl4ZWxzCisJCUFzc2lnblBpeGVsKChCWVRFKikmcHhsU3JjWzBdLCAoQllURSopc3JjX2JpdHMsIGJ5dGVzcHApOworCQkvLyBjYWxjdWxhdGUgd2VpZ2h0cworCQlmb3IodW5zaWduZWQgaiA9IDA7IGogPCBzYW1wbGVzOyBqKyspIHsKKwkJCXB4bExlZnRbal0gPSBzdGF0aWNfY2FzdDxUPihweGxCa2dbal0gKyAocHhsU3JjW2pdIC0gcHhsQmtnW2pdKSAqIHdlaWdodCArIDAuNSk7CisJCX0KKwkJLy8gY2hlY2sgYm91bmRhcmllcyAKKwkJaVhQb3MgPSBpICsgaU9mZnNldDsKKwkJaWYoKGlYUG9zID49IDApICYmIChpWFBvcyA8IChpbnQpZHN0X3dpZHRoKSkgeworCQkJLy8gdXBkYXRlIGxlZnQgb3ZlciBvbiBzb3VyY2UKKwkJCWZvcih1bnNpZ25lZCBqID0gMDsgaiA8IHNhbXBsZXM7IGorKykgeworCQkJCXB4bFNyY1tqXSA9IHB4bFNyY1tqXSAtIChweGxMZWZ0W2pdIC0gcHhsT2xkTGVmdFtqXSk7CisJCQl9CisJCQlBc3NpZ25QaXhlbCgoQllURSopJmRzdF9iaXRzW2lYUG9zKmJ5dGVzcHBdLCAoQllURSopJnB4bFNyY1swXSwgYnl0ZXNwcCk7CisJCX0KKwkJLy8gc2F2ZSBsZWZ0b3ZlciBmb3IgbmV4dCBwaXhlbCBpbiBzY2FuCisJCUFzc2lnblBpeGVsKChCWVRFKikmcHhsT2xkTGVmdFswXSwgKEJZVEUqKSZweGxMZWZ0WzBdLCBieXRlc3BwKTsKKworCQkvLyBuZXh0IHBpeGVsIGluIHNjYW4KKwkJc3JjX2JpdHMgKz0gYnl0ZXNwcDsKKwl9CQkJCisKKwkvLyBnbyB0byByaWdodG1vc3QgcG9pbnQgb2Ygc2tldworCWlYUG9zID0gc3JjX3dpZHRoICsgaU9mZnNldDsgCisKKwlpZigoaVhQb3MgPj0gMCkgJiYgKGlYUG9zIDwgKGludClkc3Rfd2lkdGgpKSB7CisJCWRzdF9iaXRzID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKGRzdCwgcm93KSArIGlYUG9zICogYnl0ZXNwcDsKKworCQkvLyBJZiBzdGlsbCBpbiBpbWFnZSBib3VuZHMsIHB1dCBsZWZ0b3ZlcnMgdGhlcmUKKwkJQXNzaWduUGl4ZWwoKEJZVEUqKWRzdF9iaXRzLCAoQllURSopJnB4bE9sZExlZnRbMF0sIGJ5dGVzcHApOworCisJCS8vIGNsZWFyIHRvIHRoZSByaWdodCBvZiB0aGUgc2tld2VkIGxpbmUgd2l0aCBiYWNrZ3JvdW5kCisJCWRzdF9iaXRzICs9IGJ5dGVzcHA7CisJCWlmKGJrY29sb3IpIHsKKwkJCWZvcih1bnNpZ25lZCBpID0gMDsgaSA8IGRzdF93aWR0aCAtIGlYUG9zIC0gMTsgaSsrKSB7CisJCQkJbWVtY3B5KCZkc3RfYml0c1tpICogYnl0ZXNwcF0sIGJrY29sb3IsIGJ5dGVzcHApOworCQkJfQorCQl9IGVsc2UgeworCQkJbWVtc2V0KGRzdF9iaXRzLCAwLCBieXRlc3BwICogKGRzdF93aWR0aCAtIGlYUG9zIC0gMSkpOworCQl9CisKKwl9Cit9CisKKy8qKgorU2tld3MgYSByb3cgaG9yaXpvbnRhbGx5ICh3aXRoIGZpbHRlcmVkIHdlaWdodHMpLiAKK0xpbWl0ZWQgdG8gNDUgZGVncmVlIHNrZXdpbmcgb25seS4gRmlsdGVycyB0d28gYWRqYWNlbnQgcGl4ZWxzLgorQHBhcmFtIHNyYyBQb2ludGVyIHRvIHNvdXJjZSBpbWFnZSB0byByb3RhdGUKK0BwYXJhbSBkc3QgUG9pbnRlciB0byBkZXN0aW5hdGlvbiBpbWFnZQorQHBhcmFtIHJvdyBSb3cgaW5kZXgKK0BwYXJhbSBpT2Zmc2V0IFNrZXcgb2Zmc2V0CitAcGFyYW0gZFdlaWdodCBSZWxhdGl2ZSB3ZWlnaHQgb2YgcmlnaHQgcGl4ZWwKK0BwYXJhbSBia2NvbG9yIEJhY2tncm91bmQgY29sb3IKKyovCitzdGF0aWMgdm9pZCAKK0hvcml6b250YWxTa2V3KEZJQklUTUFQICpzcmMsIEZJQklUTUFQICpkc3QsIGludCByb3csIGludCBpT2Zmc2V0LCBkb3VibGUgZFdlaWdodCwgY29uc3Qgdm9pZCAqYmtjb2xvcikgeworCUZSRUVfSU1BR0VfVFlQRSBpbWFnZV90eXBlID0gRnJlZUltYWdlX0dldEltYWdlVHlwZShzcmMpOworCisJc3dpdGNoKGltYWdlX3R5cGUpIHsKKwkJY2FzZSBGSVRfQklUTUFQOgorCQkJc3dpdGNoKEZyZWVJbWFnZV9HZXRCUFAoc3JjKSkgeworCQkJCWNhc2UgODoKKwkJCQljYXNlIDI0OgorCQkJCWNhc2UgMzI6CisJCQkJCUhvcml6b250YWxTa2V3VDxCWVRFPihzcmMsIGRzdCwgcm93LCBpT2Zmc2V0LCBkV2VpZ2h0LCBia2NvbG9yKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEZJVF9VSU5UMTY6CisJCWNhc2UgRklUX1JHQjE2OgorCQljYXNlIEZJVF9SR0JBMTY6CisJCQlIb3Jpem9udGFsU2tld1Q8V09SRD4oc3JjLCBkc3QsIHJvdywgaU9mZnNldCwgZFdlaWdodCwgYmtjb2xvcik7CisJCQlicmVhazsKKwkJY2FzZSBGSVRfRkxPQVQ6CisJCWNhc2UgRklUX1JHQkY6CisJCWNhc2UgRklUX1JHQkFGOgorCQkJSG9yaXpvbnRhbFNrZXdUPGZsb2F0PihzcmMsIGRzdCwgcm93LCBpT2Zmc2V0LCBkV2VpZ2h0LCBia2NvbG9yKTsKKwkJCWJyZWFrOworCX0KK30KKworLyoqCitTa2V3cyBhIGNvbHVtbiB2ZXJ0aWNhbGx5ICh3aXRoIGZpbHRlcmVkIHdlaWdodHMpLiAKK0xpbWl0ZWQgdG8gNDUgZGVncmVlIHNrZXdpbmcgb25seS4gRmlsdGVycyB0d28gYWRqYWNlbnQgcGl4ZWxzLgorUGFyYW1ldGVyIFQgY2FuIGJlIEJZVEUsIFdPUkQgb2YgZmxvYXQuIAorQHBhcmFtIHNyYyBQb2ludGVyIHRvIHNvdXJjZSBpbWFnZSB0byByb3RhdGUKK0BwYXJhbSBkc3QgUG9pbnRlciB0byBkZXN0aW5hdGlvbiBpbWFnZQorQHBhcmFtIGNvbCBDb2x1bW4gaW5kZXgKK0BwYXJhbSBpT2Zmc2V0IFNrZXcgb2Zmc2V0CitAcGFyYW0gZFdlaWdodCBSZWxhdGl2ZSB3ZWlnaHQgb2YgdXBwZXIgcGl4ZWwKK0BwYXJhbSBia2NvbG9yIEJhY2tncm91bmQgY29sb3IKKyovCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gdm9pZCAKK1ZlcnRpY2FsU2tld1QoRklCSVRNQVAgKnNyYywgRklCSVRNQVAgKmRzdCwgaW50IGNvbCwgaW50IGlPZmZzZXQsIGRvdWJsZSB3ZWlnaHQsIGNvbnN0IHZvaWQgKmJrY29sb3IgPSBOVUxMKSB7CisJaW50IGlZUG9zOworCisJdW5zaWduZWQgc3JjX2hlaWdodCA9IEZyZWVJbWFnZV9HZXRIZWlnaHQoc3JjKTsKKwl1bnNpZ25lZCBkc3RfaGVpZ2h0ID0gRnJlZUltYWdlX0dldEhlaWdodChkc3QpOworCisJVCBweGxTcmNbNF0sIHB4bExlZnRbNF0sIHB4bE9sZExlZnRbNF07CS8vIDQgPSA0KnNpemVvZihUKSBtYXgKKworCS8vIGJhY2tncm91bmQKKwljb25zdCBUIHB4bEJsYWNrWzRdID0gezAsIDAsIDAsIDAgfTsKKwljb25zdCBUICpweGxCa2cgPSBzdGF0aWNfY2FzdDxjb25zdCBUKj4oYmtjb2xvcik7IC8vIGFzc3VtZSBhdCBsZWFzdCBieXRlc3BwIGFuZCA0KnNpemVvZihUKSBtYXgKKwlpZighcHhsQmtnKSB7CisJCS8vIGRlZmF1bHQgYmFja2dyb3VuZCBjb2xvciBpcyBibGFjaworCQlweGxCa2cgPSBweGxCbGFjazsKKwl9CisKKwkvLyBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiBieXRlcyBwZXIgcGl4ZWwKKwljb25zdCB1bnNpZ25lZCBieXRlc3BwID0gRnJlZUltYWdlX0dldExpbmUoc3JjKSAvIEZyZWVJbWFnZV9HZXRXaWR0aChzcmMpOworCS8vIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgcGVyIHBpeGVsCisJY29uc3QgdW5zaWduZWQgc2FtcGxlcyA9IGJ5dGVzcHAgLyBzaXplb2YoVCk7CisKKwljb25zdCB1bnNpZ25lZCBzcmNfcGl0Y2ggPSBGcmVlSW1hZ2VfR2V0UGl0Y2goc3JjKTsKKwljb25zdCB1bnNpZ25lZCBkc3RfcGl0Y2ggPSBGcmVlSW1hZ2VfR2V0UGl0Y2goZHN0KTsKKwljb25zdCB1bnNpZ25lZCBpbmRleCA9IGNvbCAqIGJ5dGVzcHA7CisKKwlCWVRFICpzcmNfYml0cyA9IEZyZWVJbWFnZV9HZXRCaXRzKHNyYykgKyBpbmRleDsKKwlCWVRFICpkc3RfYml0cyA9IEZyZWVJbWFnZV9HZXRCaXRzKGRzdCkgKyBpbmRleDsKKworCS8vIGZpbGwgZ2FwIGFib3ZlIHNrZXcgd2l0aCBiYWNrZ3JvdW5kCisJaWYoYmtjb2xvcikgeworCQlmb3IoaW50IGsgPSAwOyBrIDwgaU9mZnNldDsgaysrKSB7CisJCQltZW1jcHkoZHN0X2JpdHMsIGJrY29sb3IsIGJ5dGVzcHApOworCQkJZHN0X2JpdHMgKz0gZHN0X3BpdGNoOworCQl9CisJCW1lbWNweSgmcHhsT2xkTGVmdFswXSwgYmtjb2xvciwgYnl0ZXNwcCk7CisJfSBlbHNlIHsKKwkJZm9yKGludCBrID0gMDsgayA8IGlPZmZzZXQ7IGsrKykgeworCQkJbWVtc2V0KGRzdF9iaXRzLCAwLCBieXRlc3BwKTsKKwkJCWRzdF9iaXRzICs9IGRzdF9waXRjaDsKKwkJfQorCQltZW1zZXQoJnB4bE9sZExlZnRbMF0sIDAsIGJ5dGVzcHApOworCX0KKworCWZvcih1bnNpZ25lZCBpID0gMDsgaSA8IHNyY19oZWlnaHQ7IGkrKykgeworCQkvLyBsb29wIHRocm91Z2ggY29sdW1uIHBpeGVscworCQlBc3NpZ25QaXhlbCgoQllURSopKCZweGxTcmNbMF0pLCBzcmNfYml0cywgYnl0ZXNwcCk7CisJCS8vIGNhbGN1bGF0ZSB3ZWlnaHRzCisJCWZvcih1bnNpZ25lZCBqID0gMDsgaiA8IHNhbXBsZXM7IGorKykgeworCQkJcHhsTGVmdFtqXSA9IHN0YXRpY19jYXN0PFQ+KHB4bEJrZ1tqXSArIChweGxTcmNbal0gLSBweGxCa2dbal0pICogd2VpZ2h0ICsgMC41KTsKKwkJfQorCQkvLyBjaGVjayBib3VuZGFyaWVzCisJCWlZUG9zID0gaSArIGlPZmZzZXQ7CisJCWlmKChpWVBvcyA+PSAwKSAmJiAoaVlQb3MgPCAoaW50KWRzdF9oZWlnaHQpKSB7CisJCQkvLyB1cGRhdGUgbGVmdCBvdmVyIG9uIHNvdXJjZQorCQkJZm9yKHVuc2lnbmVkIGogPSAwOyBqIDwgc2FtcGxlczsgaisrKSB7CisJCQkJcHhsU3JjW2pdID0gcHhsU3JjW2pdIC0gKHB4bExlZnRbal0gLSBweGxPbGRMZWZ0W2pdKTsKKwkJCX0KKwkJCWRzdF9iaXRzID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKGRzdCwgaVlQb3MpICsgaW5kZXg7CisJCQlBc3NpZ25QaXhlbChkc3RfYml0cywgKEJZVEUqKSgmcHhsU3JjWzBdKSwgYnl0ZXNwcCk7CisJCX0KKwkJLy8gc2F2ZSBsZWZ0b3ZlciBmb3IgbmV4dCBwaXhlbCBpbiBzY2FuCisJCUFzc2lnblBpeGVsKChCWVRFKikoJnB4bE9sZExlZnRbMF0pLCAoQllURSopKCZweGxMZWZ0WzBdKSwgYnl0ZXNwcCk7CisKKwkJLy8gbmV4dCBwaXhlbCBpbiBzY2FuCisJCXNyY19iaXRzICs9IHNyY19waXRjaDsKKwl9CisJLy8gZ28gdG8gYm90dG9tIHBvaW50IG9mIHNrZXcKKwlpWVBvcyA9IHNyY19oZWlnaHQgKyBpT2Zmc2V0OworCisJaWYoKGlZUG9zID49IDApICYmIChpWVBvcyA8IChpbnQpZHN0X2hlaWdodCkpIHsKKwkJZHN0X2JpdHMgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZHN0LCBpWVBvcykgKyBpbmRleDsKKworCQkvLyBpZiBzdGlsbCBpbiBpbWFnZSBib3VuZHMsIHB1dCBsZWZ0b3ZlcnMgdGhlcmUJCQkJCisJCUFzc2lnblBpeGVsKChCWVRFKikoZHN0X2JpdHMpLCAoQllURSopKCZweGxPbGRMZWZ0WzBdKSwgYnl0ZXNwcCk7CisKKwkJLy8gY2xlYXIgYmVsb3cgc2tld2VkIGxpbmUgd2l0aCBiYWNrZ3JvdW5kCisJCWlmKGJrY29sb3IpIHsKKwkJCXdoaWxlKCsraVlQb3MgPCAoaW50KWRzdF9oZWlnaHQpIHsJCQkJCQorCQkJCWRzdF9iaXRzICs9IGRzdF9waXRjaDsKKwkJCQlBc3NpZ25QaXhlbCgoQllURSopKGRzdF9iaXRzKSwgKEJZVEUqKShia2NvbG9yKSwgYnl0ZXNwcCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQl3aGlsZSgrK2lZUG9zIDwgKGludClkc3RfaGVpZ2h0KSB7CQkJCQkKKwkJCQlkc3RfYml0cyArPSBkc3RfcGl0Y2g7CisJCQkJbWVtc2V0KGRzdF9iaXRzLCAwLCBieXRlc3BwKTsKKwkJCX0KKwkJfQorCX0KK30KKworLyoqCitTa2V3cyBhIGNvbHVtbiB2ZXJ0aWNhbGx5ICh3aXRoIGZpbHRlcmVkIHdlaWdodHMpLiAKK0xpbWl0ZWQgdG8gNDUgZGVncmVlIHNrZXdpbmcgb25seS4gRmlsdGVycyB0d28gYWRqYWNlbnQgcGl4ZWxzLgorQHBhcmFtIHNyYyBQb2ludGVyIHRvIHNvdXJjZSBpbWFnZSB0byByb3RhdGUKK0BwYXJhbSBkc3QgUG9pbnRlciB0byBkZXN0aW5hdGlvbiBpbWFnZQorQHBhcmFtIGNvbCBDb2x1bW4gaW5kZXgKK0BwYXJhbSBpT2Zmc2V0IFNrZXcgb2Zmc2V0CitAcGFyYW0gZFdlaWdodCBSZWxhdGl2ZSB3ZWlnaHQgb2YgdXBwZXIgcGl4ZWwKK0BwYXJhbSBia2NvbG9yIEJhY2tncm91bmQgY29sb3IKKyovCitzdGF0aWMgdm9pZCAKK1ZlcnRpY2FsU2tldyhGSUJJVE1BUCAqc3JjLCBGSUJJVE1BUCAqZHN0LCBpbnQgY29sLCBpbnQgaU9mZnNldCwgZG91YmxlIGRXZWlnaHQsIGNvbnN0IHZvaWQgKmJrY29sb3IpIHsKKwlGUkVFX0lNQUdFX1RZUEUgaW1hZ2VfdHlwZSA9IEZyZWVJbWFnZV9HZXRJbWFnZVR5cGUoc3JjKTsKKworCXN3aXRjaChpbWFnZV90eXBlKSB7CisJCWNhc2UgRklUX0JJVE1BUDoKKwkJCXN3aXRjaChGcmVlSW1hZ2VfR2V0QlBQKHNyYykpIHsKKwkJCQljYXNlIDg6CisJCQkJY2FzZSAyNDoKKwkJCQljYXNlIDMyOgorCQkJCQlWZXJ0aWNhbFNrZXdUPEJZVEU+KHNyYywgZHN0LCBjb2wsIGlPZmZzZXQsIGRXZWlnaHQsIGJrY29sb3IpOworCQkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQkJY2FzZSBGSVRfVUlOVDE2OgorCQkJY2FzZSBGSVRfUkdCMTY6CisJCQljYXNlIEZJVF9SR0JBMTY6CisJCQkJVmVydGljYWxTa2V3VDxXT1JEPihzcmMsIGRzdCwgY29sLCBpT2Zmc2V0LCBkV2VpZ2h0LCBia2NvbG9yKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRklUX0ZMT0FUOgorCQkJY2FzZSBGSVRfUkdCRjoKKwkJCWNhc2UgRklUX1JHQkFGOgorCQkJCVZlcnRpY2FsU2tld1Q8ZmxvYXQ+KHNyYywgZHN0LCBjb2wsIGlPZmZzZXQsIGRXZWlnaHQsIGJrY29sb3IpOworCQkJCWJyZWFrOworCX0KK30gCisKKy8qKgorUm90YXRlcyBhbiBpbWFnZSBieSA5MCBkZWdyZWVzIChjb3VudGVyIGNsb2Nrd2lzZSkuIAorUHJlY2lzZSByb3RhdGlvbiwgbm8gZmlsdGVycyByZXF1aXJlZC48YnI+CitDb2RlIGFkYXB0ZWQgZnJvbSBDeEltYWdlIChodHRwOi8vd3d3LnhkcC5pdC9jeGltYWdlLmh0bSkKK0BwYXJhbSBzcmMgUG9pbnRlciB0byBzb3VyY2UgaW1hZ2UgdG8gcm90YXRlCitAcmV0dXJuIFJldHVybnMgYSBwb2ludGVyIHRvIGEgbmV3bHkgYWxsb2NhdGVkIHJvdGF0ZWQgaW1hZ2UgaWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyBOVUxMIG90aGVyd2lzZQorKi8KK3N0YXRpYyBGSUJJVE1BUCogCitSb3RhdGU5MChGSUJJVE1BUCAqc3JjKSB7CisKKwljb25zdCB1bnNpZ25lZCBicHAgPSBGcmVlSW1hZ2VfR2V0QlBQKHNyYyk7CisKKwljb25zdCB1bnNpZ25lZCBzcmNfd2lkdGggID0gRnJlZUltYWdlX0dldFdpZHRoKHNyYyk7CisJY29uc3QgdW5zaWduZWQgc3JjX2hlaWdodCA9IEZyZWVJbWFnZV9HZXRIZWlnaHQoc3JjKTsJCisJY29uc3QgdW5zaWduZWQgZHN0X3dpZHRoICA9IHNyY19oZWlnaHQ7CisJY29uc3QgdW5zaWduZWQgZHN0X2hlaWdodCA9IHNyY193aWR0aDsKKworCUZSRUVfSU1BR0VfVFlQRSBpbWFnZV90eXBlID0gRnJlZUltYWdlX0dldEltYWdlVHlwZShzcmMpOworCisJLy8gYWxsb2NhdGUgYW5kIGNsZWFyIGRzdCBpbWFnZQorCUZJQklUTUFQICpkc3QgPSBGcmVlSW1hZ2VfQWxsb2NhdGVUKGltYWdlX3R5cGUsIGRzdF93aWR0aCwgZHN0X2hlaWdodCwgYnBwKTsKKwlpZihOVUxMID09IGRzdCkgcmV0dXJuIE5VTEw7CisKKwkvLyBnZXQgc3JjIGFuZCBkc3Qgc2NhbiB3aWR0aAorCWNvbnN0IHVuc2lnbmVkIHNyY19waXRjaCAgPSBGcmVlSW1hZ2VfR2V0UGl0Y2goc3JjKTsKKwljb25zdCB1bnNpZ25lZCBkc3RfcGl0Y2ggID0gRnJlZUltYWdlX0dldFBpdGNoKGRzdCk7CisKKwlzd2l0Y2goaW1hZ2VfdHlwZSkgeworCQljYXNlIEZJVF9CSVRNQVA6CisJCQlpZihicHAgPT0gMSkgeworCQkJCS8vIHNwZWVkeSByb3RhdGUgZm9yIEJXIGltYWdlcworCisJCQkJQllURSAqYnNyYyAgPSBGcmVlSW1hZ2VfR2V0Qml0cyhzcmMpOyAKKwkJCQlCWVRFICpiZGVzdCA9IEZyZWVJbWFnZV9HZXRCaXRzKGRzdCk7CisKKwkJCQlCWVRFICpkYml0c21heCA9IGJkZXN0ICsgZHN0X2hlaWdodCAqIGRzdF9waXRjaCAtIDE7CisKKwkJCQlmb3IodW5zaWduZWQgeSA9IDA7IHkgPCBzcmNfaGVpZ2h0OyB5KyspIHsKKwkJCQkJLy8gZmlndXJlIG91dCB0aGUgY29sdW1uIHdlIGFyZSBnb2luZyB0byBiZSBjb3B5aW5nIHRvCisJCQkJCWNvbnN0IGRpdl90IGRpdl9yID0gZGl2KHksIDgpOworCQkJCQkvLyBzZXQgYml0IHBvcyBvZiBzcmMgY29sdW1uIGJ5dGUKKwkJCQkJY29uc3QgQllURSBiaXRwb3MgPSAoQllURSkoMTI4ID4+IGRpdl9yLnJlbSk7CisJCQkJCUJZVEUgKnNyY2Rpc3AgPSBic3JjICsgeSAqIHNyY19waXRjaDsKKwkJCQkJZm9yKHVuc2lnbmVkIHggPSAwOyB4IDwgc3JjX3BpdGNoOyB4KyspIHsKKwkJCQkJCS8vIGdldCBzb3VyY2UgYml0cworCQkJCQkJQllURSAqc2JpdHMgPSBzcmNkaXNwICsgeDsKKwkJCQkJCS8vIGdldCBkZXN0aW5hdGlvbiBjb2x1bW4KKwkJCQkJCUJZVEUgKm5yb3cgPSBiZGVzdCArIChkc3RfaGVpZ2h0IC0gMSAtICh4ICogOCkpICogZHN0X3BpdGNoICsgZGl2X3IucXVvdDsKKwkJCQkJCWZvciAoaW50IHogPSAwOyB6IDwgODsgeisrKSB7CisJCQkJCQkgICAvLyBnZXQgZGVzdGluYXRpb24gYnl0ZQorCQkJCQkJCUJZVEUgKmRiaXRzID0gbnJvdyAtIHogKiBkc3RfcGl0Y2g7CisJCQkJCQkJaWYgKChkYml0cyA8IGJkZXN0KSB8fCAoZGJpdHMgPiBkYml0c21heCkpIGJyZWFrOworCQkJCQkJCWlmICgqc2JpdHMgJiAoMTI4ID4+IHopKSAqZGJpdHMgfD0gYml0cG9zOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZigoYnBwID09IDgpIHx8IChicHAgPT0gMjQpIHx8IChicHAgPT0gMzIpKSB7CisJCQkJLy8gYW55dGhpbmcgb3RoZXIgdGhhbiBCVyA6CisJCQkJLy8gVGhpcyBvcHRpbWl6ZWQgdmVyc2lvbiBvZiByb3RhdGlvbiByb3RhdGVzIGltYWdlIGJ5IHNtYWxsZXIgYmxvY2tzLiBJdCBpcyBxdWl0ZQorCQkJCS8vIGEgYml0IGZhc3RlciB0aGFuIG9idmlvdXMgYWxnb3JpdGhtLCBiZWNhdXNlIGl0IHByb2R1Y2VzIG11Y2ggbGVzcyBDUFUgY2FjaGUgbWlzc2VzLgorCQkJCS8vIFRoaXMgb3B0aW1pemF0aW9uIGNhbiBiZSB0dW5lZCBieSBjaGFuZ2luZyBibG9jayBzaXplIChSQkxPQ0spLiA5NiBpcyBnb29kIHZhbHVlIGZvciBjdXJyZW50CisJCQkJLy8gQ1BVcyAodGVzdGVkIG9uIEF0aGxvbiBYUCBhbmQgQ2VsZXJvbiBEKS4gTGFyZ2VyIHZhbHVlIChpZiBDUFUgaGFzIGVub3VnaCBjYWNoZSkgd2lsbCBpbmNyZWFzZQorCQkJCS8vIHNwZWVkIHNvbWVob3csIGJ1dCBvbmNlIHlvdSBkcm9wIG91dCBvZiBDUFUncyBjYWNoZSwgdGhpbmdzIHdpbGwgc2xvdyBkb3duIGRyYXN0aWNhbGx5LgorCQkJCS8vIEZvciBvbGRlciBDUFVzIHdpdGggbGVzcyBjYWNoZSwgbG93ZXIgdmFsdWUgd291bGQgeWllbGQgYmV0dGVyIHJlc3VsdHMuCisKKwkJCQlCWVRFICpic3JjICA9IEZyZWVJbWFnZV9HZXRCaXRzKHNyYyk7ICAvLyBzb3VyY2UgcGl4ZWxzCisJCQkJQllURSAqYmRlc3QgPSBGcmVlSW1hZ2VfR2V0Qml0cyhkc3QpOyAgLy8gZGVzdGluYXRpb24gcGl4ZWxzCisKKwkJCQkvLyBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiBieXRlcyBwZXIgcGl4ZWwgKDEgZm9yIDgtYml0LCAzIGZvciAyNC1iaXQgb3IgNCBmb3IgMzItYml0KQorCQkJCWNvbnN0IHVuc2lnbmVkIGJ5dGVzcHAgPSBGcmVlSW1hZ2VfR2V0TGluZShzcmMpIC8gRnJlZUltYWdlX0dldFdpZHRoKHNyYyk7CisJCQkJCisJCQkJLy8gZm9yIGFsbCBpbWFnZSBibG9ja3Mgb2YgUkJMT0NLKlJCTE9DSyBwaXhlbHMKKwkJCQkKKwkJCQkvLyB4LXNlZ21lbnQKKwkJCQlmb3IodW5zaWduZWQgeHMgPSAwOyB4cyA8IGRzdF93aWR0aDsgeHMgKz0gUkJMT0NLKSB7CisJCQkJCS8vIHktc2VnbWVudAorCQkJCQlmb3IodW5zaWduZWQgeXMgPSAwOyB5cyA8IGRzdF9oZWlnaHQ7IHlzICs9IFJCTE9DSykgeworCQkJCQkJZm9yKHVuc2lnbmVkIHkgPSB5czsgeSA8IE1JTihkc3RfaGVpZ2h0LCB5cyArIFJCTE9DSyk7IHkrKykgeyAgICAvLyBkbyByb3RhdGlvbgorCQkJCQkJCWNvbnN0IHVuc2lnbmVkIHkyID0gZHN0X2hlaWdodCAtIHkgLSAxOworCQkJCQkJCS8vIHBvaW50IHRvIHNyYyBwaXhlbCBhdCAoeTIsIHhzKQorCQkJCQkJCUJZVEUgKnNyY19iaXRzID0gYnNyYyArICh4cyAqIHNyY19waXRjaCkgKyAoeTIgKiBieXRlc3BwKTsKKwkJCQkJCQkvLyBwb2ludCB0byBkc3QgcGl4ZWwgYXQgKHhzLCB5KQorCQkJCQkJCUJZVEUgKmRzdF9iaXRzID0gYmRlc3QgKyAoeSAqIGRzdF9waXRjaCkgKyAoeHMgKiBieXRlc3BwKTsKKwkJCQkJCQlmb3IodW5zaWduZWQgeCA9IHhzOyB4IDwgTUlOKGRzdF93aWR0aCwgeHMgKyBSQkxPQ0spOyB4KyspIHsKKwkJCQkJCQkJLy8gZHN0LlNldFBpeGVsKHgsIHksIHNyYy5HZXRQaXhlbCh5MiwgeCkpOworCQkJCQkJCQlBc3NpZ25QaXhlbChkc3RfYml0cywgc3JjX2JpdHMsIGJ5dGVzcHApOworCQkJCQkJCQlkc3RfYml0cyArPSBieXRlc3BwOworCQkJCQkJCQlzcmNfYml0cyArPSBzcmNfcGl0Y2g7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgRklUX1VJTlQxNjoKKwkJY2FzZSBGSVRfUkdCMTY6CisJCWNhc2UgRklUX1JHQkExNjoKKwkJY2FzZSBGSVRfRkxPQVQ6CisJCWNhc2UgRklUX1JHQkY6CisJCWNhc2UgRklUX1JHQkFGOgorCQl7CisJCQlCWVRFICpic3JjICA9IEZyZWVJbWFnZV9HZXRCaXRzKHNyYyk7ICAvLyBzb3VyY2UgcGl4ZWxzCisJCQlCWVRFICpiZGVzdCA9IEZyZWVJbWFnZV9HZXRCaXRzKGRzdCk7ICAvLyBkZXN0aW5hdGlvbiBwaXhlbHMKKworCQkJLy8gY2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgcGVyIHBpeGVsCisJCQljb25zdCB1bnNpZ25lZCBieXRlc3BwID0gRnJlZUltYWdlX0dldExpbmUoc3JjKSAvIEZyZWVJbWFnZV9HZXRXaWR0aChzcmMpOworCisJCQlmb3IodW5zaWduZWQgeSA9IDA7IHkgPCBkc3RfaGVpZ2h0OyB5KyspIHsKKwkJCQlCWVRFICpzcmNfYml0cyA9IGJzcmMgKyAoc3JjX3dpZHRoIC0gMSAtIHkpICogYnl0ZXNwcDsKKwkJCQlCWVRFICpkc3RfYml0cyA9IGJkZXN0ICsgKHkgKiBkc3RfcGl0Y2gpOworCQkJCWZvcih1bnNpZ25lZCB4ID0gMDsgeCA8IGRzdF93aWR0aDsgeCsrKSB7CisJCQkJCUFzc2lnblBpeGVsKGRzdF9iaXRzLCBzcmNfYml0cywgYnl0ZXNwcCk7CisJCQkJCXNyY19iaXRzICs9IHNyY19waXRjaDsKKwkJCQkJZHN0X2JpdHMgKz0gYnl0ZXNwcDsKKwkJCQl9CisJCQl9CisJCX0KKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGRzdDsKK30KKworLyoqCitSb3RhdGVzIGFuIGltYWdlIGJ5IDE4MCBkZWdyZWVzIChjb3VudGVyIGNsb2Nrd2lzZSkuIAorUHJlY2lzZSByb3RhdGlvbiwgbm8gZmlsdGVycyByZXF1aXJlZC4KK0BwYXJhbSBzcmMgUG9pbnRlciB0byBzb3VyY2UgaW1hZ2UgdG8gcm90YXRlCitAcmV0dXJuIFJldHVybnMgYSBwb2ludGVyIHRvIGEgbmV3bHkgYWxsb2NhdGVkIHJvdGF0ZWQgaW1hZ2UgaWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyBOVUxMIG90aGVyd2lzZQorKi8KK3N0YXRpYyBGSUJJVE1BUCogCitSb3RhdGUxODAoRklCSVRNQVAgKnNyYykgeworCWludCB4LCB5LCBrLCBwb3M7CisKKwljb25zdCBpbnQgYnBwID0gRnJlZUltYWdlX0dldEJQUChzcmMpOworCisJY29uc3QgaW50IHNyY193aWR0aCAgPSBGcmVlSW1hZ2VfR2V0V2lkdGgoc3JjKTsKKwljb25zdCBpbnQgc3JjX2hlaWdodCA9IEZyZWVJbWFnZV9HZXRIZWlnaHQoc3JjKTsKKwljb25zdCBpbnQgZHN0X3dpZHRoICA9IHNyY193aWR0aDsKKwljb25zdCBpbnQgZHN0X2hlaWdodCA9IHNyY19oZWlnaHQ7CisKKwlGUkVFX0lNQUdFX1RZUEUgaW1hZ2VfdHlwZSA9IEZyZWVJbWFnZV9HZXRJbWFnZVR5cGUoc3JjKTsKKworCUZJQklUTUFQICpkc3QgPSBGcmVlSW1hZ2VfQWxsb2NhdGVUKGltYWdlX3R5cGUsIGRzdF93aWR0aCwgZHN0X2hlaWdodCwgYnBwKTsKKwlpZihOVUxMID09IGRzdCkgcmV0dXJuIE5VTEw7CisKKwlzd2l0Y2goaW1hZ2VfdHlwZSkgeworCQljYXNlIEZJVF9CSVRNQVA6CisJCQlpZihicHAgPT0gMSkgeworCQkJCWZvcihpbnQgeSA9IDA7IHkgPCBzcmNfaGVpZ2h0OyB5KyspIHsKKwkJCQkJQllURSAqc3JjX2JpdHMgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoc3JjLCB5KTsKKwkJCQkJQllURSAqZHN0X2JpdHMgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZHN0LCBkc3RfaGVpZ2h0IC0geSAtIDEpOworCQkJCQlmb3IoaW50IHggPSAwOyB4IDwgc3JjX3dpZHRoOyB4KyspIHsKKwkJCQkJCS8vIGdldCBiaXQgYXQgKHgsIHkpCisJCQkJCQlrID0gKHNyY19iaXRzW3ggPj4gM10gJiAoMHg4MCA+PiAoeCAmIDB4MDcpKSkgIT0gMDsKKwkJCQkJCS8vIHNldCBiaXQgYXQgKGRzdF93aWR0aCAtIHggLSAxLCBkc3RfaGVpZ2h0IC0geSAtIDEpCisJCQkJCQlwb3MgPSBkc3Rfd2lkdGggLSB4IC0gMTsKKwkJCQkJCWsgPyBkc3RfYml0c1twb3MgPj4gM10gfD0gKDB4ODAgPj4gKHBvcyAmIDB4NykpIDogZHN0X2JpdHNbcG9zID4+IDNdICY9ICgweEZGN0YgPj4gKHBvcyAmIDB4NykpOworCQkJCQl9CQkJCisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQkJLy8gZWxzZSBpZigoYnBwID09IDgpIHx8IChicHAgPT0gMjQpIHx8IChicHAgPT0gMzIpKSBGQUxMIFRST1VHSAorCQljYXNlIEZJVF9VSU5UMTY6CisJCWNhc2UgRklUX1JHQjE2OgorCQljYXNlIEZJVF9SR0JBMTY6CisJCWNhc2UgRklUX0ZMT0FUOgorCQljYXNlIEZJVF9SR0JGOgorCQljYXNlIEZJVF9SR0JBRjoKKwkJeworCQkJIC8vIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHBlciBwaXhlbAorCQkJY29uc3QgaW50IGJ5dGVzcHAgPSBGcmVlSW1hZ2VfR2V0TGluZShzcmMpIC8gRnJlZUltYWdlX0dldFdpZHRoKHNyYyk7CisKKwkJCWZvcih5ID0gMDsgeSA8IHNyY19oZWlnaHQ7IHkrKykgeworCQkJCUJZVEUgKnNyY19iaXRzID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKHNyYywgeSk7CisJCQkJQllURSAqZHN0X2JpdHMgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZHN0LCBkc3RfaGVpZ2h0IC0geSAtIDEpICsgKGRzdF93aWR0aCAtIDEpICogYnl0ZXNwcDsKKwkJCQlmb3IoeCA9IDA7IHggPCBzcmNfd2lkdGg7IHgrKykgeworCQkJCQkvLyBnZXQgcGl4ZWwgYXQgKHgsIHkpCisJCQkJCS8vIHNldCBwaXhlbCBhdCAoZHN0X3dpZHRoIC0geCAtIDEsIGRzdF9oZWlnaHQgLSB5IC0gMSkKKwkJCQkJQXNzaWduUGl4ZWwoZHN0X2JpdHMsIHNyY19iaXRzLCBieXRlc3BwKTsKKwkJCQkJc3JjX2JpdHMgKz0gYnl0ZXNwcDsKKwkJCQkJZHN0X2JpdHMgLT0gYnl0ZXNwcDsJCQkJCQorCQkJCX0JCQkJCisJCQl9CisJCX0KKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGRzdDsKK30KKworLyoqCitSb3RhdGVzIGFuIGltYWdlIGJ5IDI3MCBkZWdyZWVzIChjb3VudGVyIGNsb2Nrd2lzZSkuIAorUHJlY2lzZSByb3RhdGlvbiwgbm8gZmlsdGVycyByZXF1aXJlZC48YnI+CitDb2RlIGFkYXB0ZWQgZnJvbSBDeEltYWdlIChodHRwOi8vd3d3LnhkcC5pdC9jeGltYWdlLmh0bSkKK0BwYXJhbSBzcmMgUG9pbnRlciB0byBzb3VyY2UgaW1hZ2UgdG8gcm90YXRlCitAcmV0dXJuIFJldHVybnMgYSBwb2ludGVyIHRvIGEgbmV3bHkgYWxsb2NhdGVkIHJvdGF0ZWQgaW1hZ2UgaWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyBOVUxMIG90aGVyd2lzZQorKi8KK3N0YXRpYyBGSUJJVE1BUCogCitSb3RhdGUyNzAoRklCSVRNQVAgKnNyYykgeworCWludCB4MiwgZGxpbmV1cDsKKworCWNvbnN0IHVuc2lnbmVkIGJwcCA9IEZyZWVJbWFnZV9HZXRCUFAoc3JjKTsKKworCWNvbnN0IHVuc2lnbmVkIHNyY193aWR0aCAgPSBGcmVlSW1hZ2VfR2V0V2lkdGgoc3JjKTsKKwljb25zdCB1bnNpZ25lZCBzcmNfaGVpZ2h0ID0gRnJlZUltYWdlX0dldEhlaWdodChzcmMpOwkKKwljb25zdCB1bnNpZ25lZCBkc3Rfd2lkdGggID0gc3JjX2hlaWdodDsKKwljb25zdCB1bnNpZ25lZCBkc3RfaGVpZ2h0ID0gc3JjX3dpZHRoOworCisJRlJFRV9JTUFHRV9UWVBFIGltYWdlX3R5cGUgPSBGcmVlSW1hZ2VfR2V0SW1hZ2VUeXBlKHNyYyk7CisKKwkvLyBhbGxvY2F0ZSBhbmQgY2xlYXIgZHN0IGltYWdlCisJRklCSVRNQVAgKmRzdCA9IEZyZWVJbWFnZV9BbGxvY2F0ZVQoaW1hZ2VfdHlwZSwgZHN0X3dpZHRoLCBkc3RfaGVpZ2h0LCBicHApOworCWlmKE5VTEwgPT0gZHN0KSByZXR1cm4gTlVMTDsKKworCS8vIGdldCBzcmMgYW5kIGRzdCBzY2FuIHdpZHRoCisJY29uc3QgdW5zaWduZWQgc3JjX3BpdGNoICA9IEZyZWVJbWFnZV9HZXRQaXRjaChzcmMpOworCWNvbnN0IHVuc2lnbmVkIGRzdF9waXRjaCAgPSBGcmVlSW1hZ2VfR2V0UGl0Y2goZHN0KTsKKwkKKwlzd2l0Y2goaW1hZ2VfdHlwZSkgeworCQljYXNlIEZJVF9CSVRNQVA6CisJCQlpZihicHAgPT0gMSkgeworCQkJCS8vIHNwZWVkeSByb3RhdGUgZm9yIEJXIGltYWdlcworCQkJCQorCQkJCUJZVEUgKmJzcmMgID0gRnJlZUltYWdlX0dldEJpdHMoc3JjKTsgCisJCQkJQllURSAqYmRlc3QgPSBGcmVlSW1hZ2VfR2V0Qml0cyhkc3QpOworCQkJCUJZVEUgKmRiaXRzbWF4ID0gYmRlc3QgKyBkc3RfaGVpZ2h0ICogZHN0X3BpdGNoIC0gMTsKKwkJCQlkbGluZXVwID0gOCAqIGRzdF9waXRjaCAtIGRzdF93aWR0aDsKKworCQkJCWZvcih1bnNpZ25lZCB5ID0gMDsgeSA8IHNyY19oZWlnaHQ7IHkrKykgeworCQkJCQkvLyBmaWd1cmUgb3V0IHRoZSBjb2x1bW4gd2UgYXJlIGdvaW5nIHRvIGJlIGNvcHlpbmcgdG8KKwkJCQkJY29uc3QgZGl2X3QgZGl2X3IgPSBkaXYoeSArIGRsaW5ldXAsIDgpOworCQkJCQkvLyBzZXQgYml0IHBvcyBvZiBzcmMgY29sdW1uIGJ5dGUKKwkJCQkJY29uc3QgQllURSBiaXRwb3MgPSAoQllURSkoMSA8PCBkaXZfci5yZW0pOworCQkJCQljb25zdCBCWVRFICpzcmNkaXNwID0gYnNyYyArIHkgKiBzcmNfcGl0Y2g7CisJCQkJCWZvcih1bnNpZ25lZCB4ID0gMDsgeCA8IHNyY19waXRjaDsgeCsrKSB7CisJCQkJCQkvLyBnZXQgc291cmNlIGJpdHMKKwkJCQkJCWNvbnN0IEJZVEUgKnNiaXRzID0gc3JjZGlzcCArIHg7CisJCQkJCQkvLyBnZXQgZGVzdGluYXRpb24gY29sdW1uCisJCQkJCQlCWVRFICpucm93ID0gYmRlc3QgKyAoeCAqIDgpICogZHN0X3BpdGNoICsgZHN0X3BpdGNoIC0gMSAtIGRpdl9yLnF1b3Q7CisJCQkJCQlmb3IodW5zaWduZWQgeiA9IDA7IHogPCA4OyB6KyspIHsKKwkJCQkJCSAgIC8vIGdldCBkZXN0aW5hdGlvbiBieXRlCisJCQkJCQkJQllURSAqZGJpdHMgPSBucm93ICsgeiAqIGRzdF9waXRjaDsKKwkJCQkJCQlpZiAoKGRiaXRzIDwgYmRlc3QpIHx8IChkYml0cyA+IGRiaXRzbWF4KSkgYnJlYWs7CisJCQkJCQkJaWYgKCpzYml0cyAmICgxMjggPj4geikpICpkYml0cyB8PSBiaXRwb3M7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9IAorCQkJZWxzZSBpZigoYnBwID09IDgpIHx8IChicHAgPT0gMjQpIHx8IChicHAgPT0gMzIpKSB7CisJCQkJLy8gYW55dGhpbmcgb3RoZXIgdGhhbiBCVyA6CisJCQkJLy8gVGhpcyBvcHRpbWl6ZWQgdmVyc2lvbiBvZiByb3RhdGlvbiByb3RhdGVzIGltYWdlIGJ5IHNtYWxsZXIgYmxvY2tzLiBJdCBpcyBxdWl0ZQorCQkJCS8vIGEgYml0IGZhc3RlciB0aGFuIG9idmlvdXMgYWxnb3JpdGhtLCBiZWNhdXNlIGl0IHByb2R1Y2VzIG11Y2ggbGVzcyBDUFUgY2FjaGUgbWlzc2VzLgorCQkJCS8vIFRoaXMgb3B0aW1pemF0aW9uIGNhbiBiZSB0dW5lZCBieSBjaGFuZ2luZyBibG9jayBzaXplIChSQkxPQ0spLiA5NiBpcyBnb29kIHZhbHVlIGZvciBjdXJyZW50CisJCQkJLy8gQ1BVcyAodGVzdGVkIG9uIEF0aGxvbiBYUCBhbmQgQ2VsZXJvbiBEKS4gTGFyZ2VyIHZhbHVlIChpZiBDUFUgaGFzIGVub3VnaCBjYWNoZSkgd2lsbCBpbmNyZWFzZQorCQkJCS8vIHNwZWVkIHNvbWVob3csIGJ1dCBvbmNlIHlvdSBkcm9wIG91dCBvZiBDUFUncyBjYWNoZSwgdGhpbmdzIHdpbGwgc2xvdyBkb3duIGRyYXN0aWNhbGx5LgorCQkJCS8vIEZvciBvbGRlciBDUFVzIHdpdGggbGVzcyBjYWNoZSwgbG93ZXIgdmFsdWUgd291bGQgeWllbGQgYmV0dGVyIHJlc3VsdHMuCisKKwkJCQlCWVRFICpic3JjICA9IEZyZWVJbWFnZV9HZXRCaXRzKHNyYyk7ICAvLyBzb3VyY2UgcGl4ZWxzCisJCQkJQllURSAqYmRlc3QgPSBGcmVlSW1hZ2VfR2V0Qml0cyhkc3QpOyAgLy8gZGVzdGluYXRpb24gcGl4ZWxzCisKKwkJCQkvLyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBieXRlcyBwZXIgcGl4ZWwgKDEgZm9yIDgtYml0LCAzIGZvciAyNC1iaXQgb3IgNCBmb3IgMzItYml0KQorCQkJCWNvbnN0IHVuc2lnbmVkIGJ5dGVzcHAgPSBGcmVlSW1hZ2VfR2V0TGluZShzcmMpIC8gRnJlZUltYWdlX0dldFdpZHRoKHNyYyk7CisKKwkJCQkvLyBmb3IgYWxsIGltYWdlIGJsb2NrcyBvZiBSQkxPQ0sqUkJMT0NLIHBpeGVscworCisJCQkJLy8geC1zZWdtZW50CisJCQkJZm9yKHVuc2lnbmVkIHhzID0gMDsgeHMgPCBkc3Rfd2lkdGg7IHhzICs9IFJCTE9DSykgeworCQkJCQkvLyB5LXNlZ21lbnQKKwkJCQkJZm9yKHVuc2lnbmVkIHlzID0gMDsgeXMgPCBkc3RfaGVpZ2h0OyB5cyArPSBSQkxPQ0spIHsKKwkJCQkJCWZvcih1bnNpZ25lZCB4ID0geHM7IHggPCBNSU4oZHN0X3dpZHRoLCB4cyArIFJCTE9DSyk7IHgrKykgeyAgICAvLyBkbyByb3RhdGlvbgorCQkJCQkJCXgyID0gZHN0X3dpZHRoIC0geCAtIDE7CisJCQkJCQkJLy8gcG9pbnQgdG8gc3JjIHBpeGVsIGF0ICh5cywgeDIpCisJCQkJCQkJQllURSAqc3JjX2JpdHMgPSBic3JjICsgKHgyICogc3JjX3BpdGNoKSArICh5cyAqIGJ5dGVzcHApOworCQkJCQkJCS8vIHBvaW50IHRvIGRzdCBwaXhlbCBhdCAoeCwgeXMpCisJCQkJCQkJQllURSAqZHN0X2JpdHMgPSBiZGVzdCArICh5cyAqIGRzdF9waXRjaCkgKyAoeCAqIGJ5dGVzcHApOworCQkJCQkJCWZvcih1bnNpZ25lZCB5ID0geXM7IHkgPCBNSU4oZHN0X2hlaWdodCwgeXMgKyBSQkxPQ0spOyB5KyspIHsKKwkJCQkJCQkJLy8gZHN0LlNldFBpeGVsKHgsIHksIHNyYy5HZXRQaXhlbCh5LCB4MikpOworCQkJCQkJCQlBc3NpZ25QaXhlbChkc3RfYml0cywgc3JjX2JpdHMsIGJ5dGVzcHApOworCQkJCQkJCQlzcmNfYml0cyArPSBieXRlc3BwOworCQkJCQkJCQlkc3RfYml0cyArPSBkc3RfcGl0Y2g7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgRklUX1VJTlQxNjoKKwkJY2FzZSBGSVRfUkdCMTY6CisJCWNhc2UgRklUX1JHQkExNjoKKwkJY2FzZSBGSVRfRkxPQVQ6CisJCWNhc2UgRklUX1JHQkY6CisJCWNhc2UgRklUX1JHQkFGOgorCQl7CisJCQlCWVRFICpic3JjICA9IEZyZWVJbWFnZV9HZXRCaXRzKHNyYyk7ICAvLyBzb3VyY2UgcGl4ZWxzCisJCQlCWVRFICpiZGVzdCA9IEZyZWVJbWFnZV9HZXRCaXRzKGRzdCk7ICAvLyBkZXN0aW5hdGlvbiBwaXhlbHMKKworCQkJLy8gY2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgcGVyIHBpeGVsCisJCQljb25zdCB1bnNpZ25lZCBieXRlc3BwID0gRnJlZUltYWdlX0dldExpbmUoc3JjKSAvIEZyZWVJbWFnZV9HZXRXaWR0aChzcmMpOworCisJCQlmb3IodW5zaWduZWQgeSA9IDA7IHkgPCBkc3RfaGVpZ2h0OyB5KyspIHsKKwkJCQlCWVRFICpzcmNfYml0cyA9IGJzcmMgKyAoc3JjX2hlaWdodCAtIDEpICogc3JjX3BpdGNoICsgeSAqIGJ5dGVzcHA7CisJCQkJQllURSAqZHN0X2JpdHMgPSBiZGVzdCArICh5ICogZHN0X3BpdGNoKTsKKwkJCQlmb3IodW5zaWduZWQgeCA9IDA7IHggPCBkc3Rfd2lkdGg7IHgrKykgeworCQkJCQlBc3NpZ25QaXhlbChkc3RfYml0cywgc3JjX2JpdHMsIGJ5dGVzcHApOworCQkJCQlzcmNfYml0cyAtPSBzcmNfcGl0Y2g7CisJCQkJCWRzdF9iaXRzICs9IGJ5dGVzcHA7CisJCQkJfQorCQkJfQorCQl9CisJCWJyZWFrOworCX0KKworCXJldHVybiBkc3Q7Cit9CisKKy8qKgorUm90YXRlcyBhbiBpbWFnZSBieSBhIGdpdmVuIGRlZ3JlZSBpbiByYW5nZSBbLTQ1IC4uICs0NV0gKGNvdW50ZXIgY2xvY2t3aXNlKSAKK3VzaW5nIHRoZSAzLXNoZWFyIHRlY2huaXF1ZS4KK0BwYXJhbSBzcmMgUG9pbnRlciB0byBzb3VyY2UgaW1hZ2UgdG8gcm90YXRlCitAcGFyYW0gZEFuZ2xlIFJvdGF0aW9uIGFuZ2xlCitAcmV0dXJuIFJldHVybnMgYSBwb2ludGVyIHRvIGEgbmV3bHkgYWxsb2NhdGVkIHJvdGF0ZWQgaW1hZ2UgaWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyBOVUxMIG90aGVyd2lzZQorKi8KK3N0YXRpYyBGSUJJVE1BUCogCitSb3RhdGU0NShGSUJJVE1BUCAqc3JjLCBkb3VibGUgZEFuZ2xlLCBjb25zdCB2b2lkICpia2NvbG9yKSB7CisJY29uc3QgZG91YmxlIFJPVEFURV9QSSA9IGRvdWJsZSgzLjE0MTU5MjY1MzU4OTc5MzIzODQ2MjY0MzM4MzI3OTUpOworCisJdW5zaWduZWQgdTsKKworCWNvbnN0IHVuc2lnbmVkIGJwcCA9IEZyZWVJbWFnZV9HZXRCUFAoc3JjKTsKKworCWNvbnN0IGRvdWJsZSBkUmFkQW5nbGUgPSBkQW5nbGUgKiBST1RBVEVfUEkgLyBkb3VibGUoMTgwKTsgLy8gQW5nbGUgaW4gcmFkaWFucworCWNvbnN0IGRvdWJsZSBkU2luRSA9IHNpbihkUmFkQW5nbGUpOworCWNvbnN0IGRvdWJsZSBkVGFuID0gdGFuKGRSYWRBbmdsZSAvIDIpOworCisJY29uc3QgdW5zaWduZWQgc3JjX3dpZHRoICA9IEZyZWVJbWFnZV9HZXRXaWR0aChzcmMpOworCWNvbnN0IHVuc2lnbmVkIHNyY19oZWlnaHQgPSBGcmVlSW1hZ2VfR2V0SGVpZ2h0KHNyYyk7CisKKwlGUkVFX0lNQUdFX1RZUEUgaW1hZ2VfdHlwZSA9IEZyZWVJbWFnZV9HZXRJbWFnZVR5cGUoc3JjKTsKKworCS8vIENhbGMgZmlyc3Qgc2hlYXIgKGhvcml6b250YWwpIGRlc3RpbmF0aW9uIGltYWdlIGRpbWVuc2lvbnMgCisJY29uc3QgdW5zaWduZWQgd2lkdGhfMSAgPSBzcmNfd2lkdGggKyB1bnNpZ25lZCgoZG91YmxlKXNyY19oZWlnaHQgKiBmYWJzKGRUYW4pICsgMC41KTsKKwljb25zdCB1bnNpZ25lZCBoZWlnaHRfMSA9IHNyY19oZWlnaHQ7IAorCisJLy8gUGVyZm9ybSAxc3Qgc2hlYXIgKGhvcml6b250YWwpCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJLy8gQWxsb2NhdGUgaW1hZ2UgZm9yIDFzdCBzaGVhcgorCUZJQklUTUFQICpkc3QxID0gRnJlZUltYWdlX0FsbG9jYXRlVChpbWFnZV90eXBlLCB3aWR0aF8xLCBoZWlnaHRfMSwgYnBwKTsKKwlpZihOVUxMID09IGRzdDEpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCQorCWZvcih1ID0gMDsgdSA8IGhlaWdodF8xOyB1KyspIHsgIAorCQlkb3VibGUgZFNoZWFyOworCisJCWlmKGRUYW4gPj0gMCkJeworCQkJLy8gUG9zaXRpdmUgYW5nbGUKKwkJCWRTaGVhciA9ICh1ICsgMC41KSAqIGRUYW47CisJCX0KKwkJZWxzZSB7CisJCQkvLyBOZWdhdGl2ZSBhbmdsZQorCQkJZFNoZWFyID0gKGRvdWJsZSh1KSAtIGhlaWdodF8xICsgMC41KSAqIGRUYW47CisJCX0KKwkJaW50IGlTaGVhciA9IGludChmbG9vcihkU2hlYXIpKTsKKwkJSG9yaXpvbnRhbFNrZXcoc3JjLCBkc3QxLCB1LCBpU2hlYXIsIGRTaGVhciAtIGRvdWJsZShpU2hlYXIpLCBia2NvbG9yKTsKKwl9CisKKwkvLyBQZXJmb3JtIDJuZCBzaGVhciAgKHZlcnRpY2FsKQorCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCS8vIENhbGMgMm5kIHNoZWFyICh2ZXJ0aWNhbCkgZGVzdGluYXRpb24gaW1hZ2UgZGltZW5zaW9ucworCWNvbnN0IHVuc2lnbmVkIHdpZHRoXzIgID0gd2lkdGhfMTsKKwl1bnNpZ25lZCBoZWlnaHRfMiA9IHVuc2lnbmVkKChkb3VibGUpc3JjX3dpZHRoICogZmFicyhkU2luRSkgKyAoZG91YmxlKXNyY19oZWlnaHQgKiBjb3MoZFJhZEFuZ2xlKSArIDAuNSkgKyAxOworCisJLy8gQWxsb2NhdGUgaW1hZ2UgZm9yIDJuZCBzaGVhcgorCUZJQklUTUFQICpkc3QyID0gRnJlZUltYWdlX0FsbG9jYXRlVChpbWFnZV90eXBlLCB3aWR0aF8yLCBoZWlnaHRfMiwgYnBwKTsKKwlpZihOVUxMID09IGRzdDIpIHsKKwkJRnJlZUltYWdlX1VubG9hZChkc3QxKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZG91YmxlIGRPZmZzZXQ7ICAgICAvLyBWYXJpYWJsZSBza2V3IG9mZnNldAorCWlmKGRTaW5FID4gMCkJeyAgIAorCQkvLyBQb3NpdGl2ZSBhbmdsZQorCQlkT2Zmc2V0ID0gKHNyY193aWR0aCAtIDEuMCkgKiBkU2luRTsKKwl9CisJZWxzZSB7CisJCS8vIE5lZ2F0aXZlIGFuZ2xlCisJCWRPZmZzZXQgPSAtZFNpbkUgKiAoZG91YmxlKHNyY193aWR0aCkgLSB3aWR0aF8yKTsKKwl9CisKKwlmb3IodSA9IDA7IHUgPCB3aWR0aF8yOyB1KyssIGRPZmZzZXQgLT0gZFNpbkUpIHsKKwkJaW50IGlTaGVhciA9IGludChmbG9vcihkT2Zmc2V0KSk7CisJCVZlcnRpY2FsU2tldyhkc3QxLCBkc3QyLCB1LCBpU2hlYXIsIGRPZmZzZXQgLSBkb3VibGUoaVNoZWFyKSwgYmtjb2xvcik7CisJfQorCisJLy8gUGVyZm9ybSAzcmQgc2hlYXIgKGhvcml6b250YWwpCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJLy8gRnJlZSByZXN1bHQgb2YgMXN0IHNoZWFyCisJRnJlZUltYWdlX1VubG9hZChkc3QxKTsKKworCS8vIENhbGMgM3JkIHNoZWFyIChob3Jpem9udGFsKSBkZXN0aW5hdGlvbiBpbWFnZSBkaW1lbnNpb25zCisJY29uc3QgdW5zaWduZWQgd2lkdGhfMyAgPSB1bnNpZ25lZChkb3VibGUoc3JjX2hlaWdodCkgKiBmYWJzKGRTaW5FKSArIGRvdWJsZShzcmNfd2lkdGgpICogY29zKGRSYWRBbmdsZSkgKyAwLjUpICsgMTsKKwljb25zdCB1bnNpZ25lZCBoZWlnaHRfMyA9IGhlaWdodF8yOworCisJLy8gQWxsb2NhdGUgaW1hZ2UgZm9yIDNyZCBzaGVhcgorCUZJQklUTUFQICpkc3QzID0gRnJlZUltYWdlX0FsbG9jYXRlVChpbWFnZV90eXBlLCB3aWR0aF8zLCBoZWlnaHRfMywgYnBwKTsKKwlpZihOVUxMID09IGRzdDMpIHsKKwkJRnJlZUltYWdlX1VubG9hZChkc3QyKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYoZFNpbkUgPj0gMCkgeworCQkvLyBQb3NpdGl2ZSBhbmdsZQorCQlkT2Zmc2V0ID0gKHNyY193aWR0aCAtIDEuMCkgKiBkU2luRSAqIC1kVGFuOworCX0KKwllbHNlIHsKKwkJLy8gTmVnYXRpdmUgYW5nbGUKKwkJZE9mZnNldCA9IGRUYW4gKiAoIChzcmNfd2lkdGggLSAxLjApICogLWRTaW5FICsgKDEuMCAtIGhlaWdodF8zKSApOworCX0KKwlmb3IodSA9IDA7IHUgPCBoZWlnaHRfMzsgdSsrLCBkT2Zmc2V0ICs9IGRUYW4pIHsKKwkJaW50IGlTaGVhciA9IGludChmbG9vcihkT2Zmc2V0KSk7CisJCUhvcml6b250YWxTa2V3KGRzdDIsIGRzdDMsIHUsIGlTaGVhciwgZE9mZnNldCAtIGRvdWJsZShpU2hlYXIpLCBia2NvbG9yKTsKKwl9CisJLy8gRnJlZSByZXN1bHQgb2YgMm5kIHNoZWFyICAgIAorCUZyZWVJbWFnZV9VbmxvYWQoZHN0Mik7CisKKwkvLyBSZXR1cm4gcmVzdWx0IG9mIDNyZCBzaGVhcgorCXJldHVybiBkc3QzOyAgICAgIAorfQorCisvKioKK1JvdGF0ZXMgYSAxLSwgOC0sIDI0LSBvciAzMi1iaXQgaW1hZ2UgYnkgYSBnaXZlbiBhbmdsZSAoZ2l2ZW4gaW4gZGVncmVlKS4gCitBbmdsZSBpcyB1bmxpbWl0ZWQsIGV4Y2VwdCBmb3IgMS1iaXQgaW1hZ2VzIChsaW1pdGVkIHRvIGludGVnZXIgbXVsdGlwbGVzIG9mIDkwIGRlZ3JlZSkuIAorMy1zaGVhcnMgdGVjaG5pcXVlIGlzIHVzZWQuCitAcGFyYW0gc3JjIFBvaW50ZXIgdG8gc291cmNlIGltYWdlIHRvIHJvdGF0ZQorQHBhcmFtIGRBbmdsZSBSb3RhdGlvbiBhbmdsZQorQHJldHVybiBSZXR1cm5zIGEgcG9pbnRlciB0byBhIG5ld2x5IGFsbG9jYXRlZCByb3RhdGVkIGltYWdlIGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgTlVMTCBvdGhlcndpc2UKKyovCitzdGF0aWMgRklCSVRNQVAqIAorUm90YXRlQW55KEZJQklUTUFQICpzcmMsIGRvdWJsZSBkQW5nbGUsIGNvbnN0IHZvaWQgKmJrY29sb3IpIHsKKwlpZihOVUxMID09IHNyYykgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlGSUJJVE1BUCAqaW1hZ2UgPSBzcmM7CisKKwl3aGlsZShkQW5nbGUgPj0gMzYwKSB7CisJCS8vIEJyaW5nIGFuZ2xlIHRvIHJhbmdlIG9mICgtSU5GIC4uIDM2MCkKKwkJZEFuZ2xlIC09IDM2MDsKKwl9CisJd2hpbGUoZEFuZ2xlIDwgMCkgeworCQkvLyBCcmluZyBhbmdsZSB0byByYW5nZSBvZiBbMCAuLiAzNjApIAorCQlkQW5nbGUgKz0gMzYwOworCX0KKwlpZigoZEFuZ2xlID4gNDUpICYmIChkQW5nbGUgPD0gMTM1KSkgeworCQkvLyBBbmdsZSBpbiAoNDUgLi4gMTM1XSAKKwkJLy8gUm90YXRlIGltYWdlIGJ5IDkwIGRlZ3JlZXMgaW50byB0ZW1wb3JhcnkgaW1hZ2UsCisJCS8vIHNvIGl0IHJlcXVpcmVzIG9ubHkgYW4gZXh0cmEgcm90YXRpb24gYW5nbGUgCisJCS8vIG9mIC00NSAuLiArNDUgdG8gY29tcGxldGUgcm90YXRpb24uCisJCWltYWdlID0gUm90YXRlOTAoc3JjKTsKKwkJZEFuZ2xlIC09IDkwOworCX0KKwllbHNlIGlmKChkQW5nbGUgPiAxMzUpICYmIChkQW5nbGUgPD0gMjI1KSkgeyAKKwkJLy8gQW5nbGUgaW4gKDEzNSAuLiAyMjVdIAorCQkvLyBSb3RhdGUgaW1hZ2UgYnkgMTgwIGRlZ3JlZXMgaW50byB0ZW1wb3JhcnkgaW1hZ2UsCisJCS8vIHNvIGl0IHJlcXVpcmVzIG9ubHkgYW4gZXh0cmEgcm90YXRpb24gYW5nbGUgCisJCS8vIG9mIC00NSAuLiArNDUgdG8gY29tcGxldGUgcm90YXRpb24uCisJCWltYWdlID0gUm90YXRlMTgwKHNyYyk7CisJCWRBbmdsZSAtPSAxODA7CisJfQorCWVsc2UgaWYoKGRBbmdsZSA+IDIyNSkgJiYgKGRBbmdsZSA8PSAzMTUpKSB7IAorCQkvLyBBbmdsZSBpbiAoMjI1IC4uIDMxNV0gCisJCS8vIFJvdGF0ZSBpbWFnZSBieSAyNzAgZGVncmVlcyBpbnRvIHRlbXBvcmFyeSBpbWFnZSwKKwkJLy8gc28gaXQgcmVxdWlyZXMgb25seSBhbiBleHRyYSByb3RhdGlvbiBhbmdsZSAKKwkJLy8gb2YgLTQ1IC4uICs0NSB0byBjb21wbGV0ZSByb3RhdGlvbi4KKwkJaW1hZ2UgPSBSb3RhdGUyNzAoc3JjKTsKKwkJZEFuZ2xlIC09IDI3MDsKKwl9CisKKwkvLyBJZiB3ZSBnb3QgaGVyZSwgYW5nbGUgaXMgaW4gKC00NSAuLiArNDVdCisKKwlpZihOVUxMID09IGltYWdlKQl7CisJCS8vIEZhaWxlZCB0byBhbGxvY2F0ZSBtaWRkbGUgaW1hZ2UKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYoMCA9PSBkQW5nbGUpIHsKKwkJaWYoaW1hZ2UgPT0gc3JjKSB7CisJCQkvLyBOb3RoaW5nIHRvIGRvIC4uLgorCQkJcmV0dXJuIEZyZWVJbWFnZV9DbG9uZShzcmMpOworCQl9IGVsc2UgeworCQkJLy8gTm8gbW9yZSByb3RhdGlvbiBuZWVkZWQKKwkJCXJldHVybiBpbWFnZTsKKwkJfQorCX0KKwllbHNlIHsKKwkJLy8gUGVyZm9ybSBsYXN0IHJvdGF0aW9uCisJCUZJQklUTUFQICpkc3QgPSBSb3RhdGU0NShpbWFnZSwgZEFuZ2xlLCBia2NvbG9yKTsKKworCQlpZihzcmMgIT0gaW1hZ2UpIHsKKwkJCS8vIE1pZGRsZSBpbWFnZSB3YXMgcmVxdWlyZWQsIGZyZWUgaXQgbm93LgorCQkJRnJlZUltYWdlX1VubG9hZChpbWFnZSk7CisJCX0KKworCQlyZXR1cm4gZHN0OworCX0KK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitGSUJJVE1BUCAqRExMX0NBTExDT05WIAorRnJlZUltYWdlX1JvdGF0ZShGSUJJVE1BUCAqZGliLCBkb3VibGUgYW5nbGUsIGNvbnN0IHZvaWQgKmJrY29sb3IpIHsKKwlpZighRnJlZUltYWdlX0hhc1BpeGVscyhkaWIpKSByZXR1cm4gTlVMTDsKKworCWlmKDAgPT0gYW5nbGUpIHsKKwkJcmV0dXJuIEZyZWVJbWFnZV9DbG9uZShkaWIpOworCX0KKwkvLyBESUIgYXJlIHN0b3JlZCB1cHNpZGUgZG93biAuLi4KKwlhbmdsZSAqPSAtMTsKKworCXRyeSB7CisJCXVuc2lnbmVkIGJwcCA9IEZyZWVJbWFnZV9HZXRCUFAoZGliKTsKKwkJRlJFRV9JTUFHRV9UWVBFIGltYWdlX3R5cGUgPSBGcmVlSW1hZ2VfR2V0SW1hZ2VUeXBlKGRpYik7CisJCQorCQlzd2l0Y2goaW1hZ2VfdHlwZSkgeworCQkJY2FzZSBGSVRfQklUTUFQOgorCQkJCWlmKGJwcCA9PSAxKSB7CisJCQkJCS8vIG9ubHkgcm90YXRlIGZvciBpbnRlZ2VyIG11bHRpcGxlcyBvZiA5MCBkZWdyZWUKKwkJCQkJaWYoZm1vZChhbmdsZSwgOTApICE9IDApCisJCQkJCQlyZXR1cm4gTlVMTDsKKworCQkJCQkvLyBwZXJmb3JtIHRoZSByb3RhdGlvbgorCQkJCQlGSUJJVE1BUCAqZHN0ID0gUm90YXRlQW55KGRpYiwgYW5nbGUsIGJrY29sb3IpOworCQkJCQlpZighZHN0KSB0aHJvdygxKTsKKworCQkJCQkvLyBidWlsZCBhIGdyZXlzY2FsZSBwYWxldHRlCisJCQkJCVJHQlFVQUQgKmRzdF9wYWwgPSBGcmVlSW1hZ2VfR2V0UGFsZXR0ZShkc3QpOworCQkJCQlpZihGcmVlSW1hZ2VfR2V0Q29sb3JUeXBlKGRpYikgPT0gRklDX01JTklTQkxBQ0spIHsKKwkJCQkJCWRzdF9wYWxbMF0ucmdiUmVkID0gZHN0X3BhbFswXS5yZ2JHcmVlbiA9IGRzdF9wYWxbMF0ucmdiQmx1ZSA9IDA7CisJCQkJCQlkc3RfcGFsWzFdLnJnYlJlZCA9IGRzdF9wYWxbMV0ucmdiR3JlZW4gPSBkc3RfcGFsWzFdLnJnYkJsdWUgPSAyNTU7CQkJCisJCQkJCX0gZWxzZSB7CisJCQkJCQlkc3RfcGFsWzBdLnJnYlJlZCA9IGRzdF9wYWxbMF0ucmdiR3JlZW4gPSBkc3RfcGFsWzBdLnJnYkJsdWUgPSAyNTU7CisJCQkJCQlkc3RfcGFsWzFdLnJnYlJlZCA9IGRzdF9wYWxbMV0ucmdiR3JlZW4gPSBkc3RfcGFsWzFdLnJnYkJsdWUgPSAwOwkJCQorCQkJCQl9CisKKwkJCQkJLy8gY29weSBtZXRhZGF0YSBmcm9tIHNyYyB0byBkc3QKKwkJCQkJRnJlZUltYWdlX0Nsb25lTWV0YWRhdGEoZHN0LCBkaWIpOworCisJCQkJCXJldHVybiBkc3Q7CisJCQkJfQorCQkJCWVsc2UgaWYoKGJwcCA9PSA4KSB8fCAoYnBwID09IDI0KSB8fCAoYnBwID09IDMyKSkgeworCQkJCQlGSUJJVE1BUCAqZHN0ID0gUm90YXRlQW55KGRpYiwgYW5nbGUsIGJrY29sb3IpOworCQkJCQlpZighZHN0KSB0aHJvdygxKTsKKwkJCQkJCisJCQkJCWlmKGJwcCA9PSA4KSB7CisJCQkJCQkvLyBjb3B5IG9yaWdpbmFsIHBhbGV0dGUgdG8gcm90YXRlZCBiaXRtYXAKKwkJCQkJCVJHQlFVQUQgKnNyY19wYWwgPSBGcmVlSW1hZ2VfR2V0UGFsZXR0ZShkaWIpOworCQkJCQkJUkdCUVVBRCAqZHN0X3BhbCA9IEZyZWVJbWFnZV9HZXRQYWxldHRlKGRzdCk7CisJCQkJCQltZW1jcHkoJmRzdF9wYWxbMF0sICZzcmNfcGFsWzBdLCAyNTYgKiBzaXplb2YoUkdCUVVBRCkpOworCisJCQkJCQkvLyBjb3B5IHRyYW5zcGFyZW5jeSB0YWJsZSAKKwkJCQkJCUZyZWVJbWFnZV9TZXRUcmFuc3BhcmVuY3lUYWJsZShkc3QsIEZyZWVJbWFnZV9HZXRUcmFuc3BhcmVuY3lUYWJsZShkaWIpLCBGcmVlSW1hZ2VfR2V0VHJhbnNwYXJlbmN5Q291bnQoZGliKSk7CisKKwkJCQkJCS8vIGNvcHkgYmFja2dyb3VuZCBjb2xvciAKKwkJCQkJCVJHQlFVQUQgYmtjb2xvcjsgCisJCQkJCQlpZiggRnJlZUltYWdlX0dldEJhY2tncm91bmRDb2xvcihkaWIsICZia2NvbG9yKSApIHsKKwkJCQkJCQlGcmVlSW1hZ2VfU2V0QmFja2dyb3VuZENvbG9yKGRzdCwgJmJrY29sb3IpOyAKKwkJCQkJCX0KKworCQkJCQl9CisKKwkJCQkJLy8gY29weSBtZXRhZGF0YSBmcm9tIHNyYyB0byBkc3QKKwkJCQkJRnJlZUltYWdlX0Nsb25lTWV0YWRhdGEoZHN0LCBkaWIpOworCisJCQkJCXJldHVybiBkc3Q7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBGSVRfVUlOVDE2OgorCQkJY2FzZSBGSVRfUkdCMTY6CisJCQljYXNlIEZJVF9SR0JBMTY6CisJCQljYXNlIEZJVF9GTE9BVDoKKwkJCWNhc2UgRklUX1JHQkY6CisJCQljYXNlIEZJVF9SR0JBRjoKKwkJCXsKKwkJCQlGSUJJVE1BUCAqZHN0ID0gUm90YXRlQW55KGRpYiwgYW5nbGUsIGJrY29sb3IpOworCQkJCWlmKCFkc3QpIHRocm93KDEpOworCisJCQkJLy8gY29weSBtZXRhZGF0YSBmcm9tIHNyYyB0byBkc3QKKwkJCQlGcmVlSW1hZ2VfQ2xvbmVNZXRhZGF0YShkc3QsIGRpYik7CisKKwkJCQlyZXR1cm4gZHN0OworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCX0gY2F0Y2goaW50KSB7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiBOVUxMOworfQorCmRpZmYgLS1naXQgYS9maWxlcy9Tb3VyY2UvRnJlZUltYWdlVG9vbGtpdC9Db2xvcnMuY3BwIGIvZmlsZXMvU291cmNlL0ZyZWVJbWFnZVRvb2xraXQvQ29sb3JzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzE5MTc2Ci0tLSAvZGV2L251bGwKKysrIGIvZmlsZXMvU291cmNlL0ZyZWVJbWFnZVRvb2xraXQvQ29sb3JzLmNwcApAQCAtMCwwICsxLDk2NyBAQAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gQ29sb3IgbWFuaXB1bGF0aW9uIHJvdXRpbmVzCisvLworLy8gRGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBieQorLy8gLSBIZXJ26SBEcm9sb24gKGRyb2xvbkBpbmZvbmllLmZyKQorLy8gLSBDYXJzdGVuIEtsZWluIChjLmtsZWluQGRhdGFnaXMuY29tKQorLy8gLSBNaWhhaWwgTmF5ZGVub3YgKG1uYXlkZW5vdkB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQpCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRnJlZUltYWdlIDMKKy8vCisvLyBDT1ZFUkVEIENPREUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkKKy8vIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTCisvLyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy8vIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVECisvLyBDT0RFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UCisvLyBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWQorLy8gU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTAorLy8gUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUgorLy8gVEhJUyBESVNDTEFJTUVSLgorLy8KKy8vIFVzZSBhdCB5b3VyIG93biByaXNrIQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaW5jbHVkZSAiRnJlZUltYWdlLmgiCisjaW5jbHVkZSAiVXRpbGl0aWVzLmgiCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgTWFjcm9zICsgc3RydWN0dXJlcworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIEdFVF9ISV9OSUJCTEUoYnl0ZSkgICAgICgoYnl0ZSkgPj4gNCkKKyNkZWZpbmUgU0VUX0hJX05JQkJMRShieXRlLCBuKSAgYnl0ZSAmPSAweDBGLCBieXRlIHw9ICgobikgPDwgNCkKKyNkZWZpbmUgR0VUX0xPX05JQkJMRShieXRlKSAgICAgKChieXRlKSAmIDB4MEYpCisjZGVmaW5lIFNFVF9MT19OSUJCTEUoYnl0ZSwgbikgIGJ5dGUgJj0gMHhGMCwgYnl0ZSB8PSAoKG4pICYgMHgwRikKKyNkZWZpbmUgR0VUX05JQkJMRShjbiwgYnl0ZSkgICAgKChjbikgPyAoR0VUX0hJX05JQkJMRShieXRlKSkgOiAoR0VUX0xPX05JQkJMRShieXRlKSkpIAorI2RlZmluZSBTRVRfTklCQkxFKGNuLCBieXRlLCBuKSBpZiAoY24pIFNFVF9ISV9OSUJCTEUoYnl0ZSwgbik7IGVsc2UgU0VUX0xPX05JQkJMRShieXRlLCBuKSAKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKy8qKiBAYnJpZWYgSW52ZXJ0cyBlYWNoIHBpeGVsIGRhdGEuCisKK0BwYXJhbSBzcmMgSW5wdXQgaW1hZ2UgdG8gYmUgcHJvY2Vzc2VkLgorQHJldHVybiBSZXR1cm5zIFRSVUUgaWYgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlLgorKi8KK0JPT0wgRExMX0NBTExDT05WIAorRnJlZUltYWdlX0ludmVydChGSUJJVE1BUCAqc3JjKSB7CisKKwlpZiAoIUZyZWVJbWFnZV9IYXNQaXhlbHMoc3JjKSkgcmV0dXJuIEZBTFNFOworCQorCXVuc2lnbmVkIGksIHgsIHksIGs7CisJCisJY29uc3QgdW5zaWduZWQgd2lkdGggPSBGcmVlSW1hZ2VfR2V0V2lkdGgoc3JjKTsKKwljb25zdCB1bnNpZ25lZCBoZWlnaHQgPSBGcmVlSW1hZ2VfR2V0SGVpZ2h0KHNyYyk7CisJY29uc3QgdW5zaWduZWQgYnBwID0gRnJlZUltYWdlX0dldEJQUChzcmMpOworCisJRlJFRV9JTUFHRV9UWVBFIGltYWdlX3R5cGUgPSBGcmVlSW1hZ2VfR2V0SW1hZ2VUeXBlKHNyYyk7CisKKwlpZihpbWFnZV90eXBlID09IEZJVF9CSVRNQVApIHsKKwkJc3dpdGNoKGJwcCkgeworCQkJY2FzZSAxIDoKKwkJCWNhc2UgNCA6CisJCQljYXNlIDggOgorCQkJeworCQkJCS8vIGlmIHRoZSBkaWIgaGFzIGEgY29sb3JtYXAsIGp1c3QgaW52ZXJ0IGl0CisJCQkJLy8gZWxzZSwga2VlcCB0aGUgbGluZWFyIGdyYXlzY2FsZQorCisJCQkJaWYgKEZyZWVJbWFnZV9HZXRDb2xvclR5cGUoc3JjKSA9PSBGSUNfUEFMRVRURSkgeworCQkJCQlSR0JRVUFEICpwYWwgPSBGcmVlSW1hZ2VfR2V0UGFsZXR0ZShzcmMpOworCisJCQkJCWZvcihpID0gMDsgaSA8IEZyZWVJbWFnZV9HZXRDb2xvcnNVc2VkKHNyYyk7IGkrKykgeworCQkJCQkJcGFsW2ldLnJnYlJlZAk9IDI1NSAtIHBhbFtpXS5yZ2JSZWQ7CisJCQkJCQlwYWxbaV0ucmdiR3JlZW4gPSAyNTUgLSBwYWxbaV0ucmdiR3JlZW47CisJCQkJCQlwYWxbaV0ucmdiQmx1ZQk9IDI1NSAtIHBhbFtpXS5yZ2JCbHVlOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJZm9yKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJCQkJCUJZVEUgKmJpdHMgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoc3JjLCB5KTsKKworCQkJCQkJZm9yICh4ID0gMDsgeCA8IEZyZWVJbWFnZV9HZXRMaW5lKHNyYyk7IHgrKykgeworCQkJCQkJCWJpdHNbeF0gPSB+Yml0c1t4XTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKworCQkJCWJyZWFrOworCQkJfQkJCisKKwkJCWNhc2UgMjQgOgorCQkJY2FzZSAzMiA6CisJCQl7CisJCQkJLy8gQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgcGVyIHBpeGVsICgzIGZvciAyNC1iaXQgb3IgNCBmb3IgMzItYml0KQorCQkJCWNvbnN0IHVuc2lnbmVkIGJ5dGVzcHAgPSBGcmVlSW1hZ2VfR2V0TGluZShzcmMpIC8gd2lkdGg7CisKKwkJCQlmb3IoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworCQkJCQlCWVRFICpiaXRzID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKHNyYywgeSk7CisJCQkJCWZvcih4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQkJCWZvcihrID0gMDsgayA8IGJ5dGVzcHA7IGsrKykgeworCQkJCQkJCWJpdHNba10gPSB+Yml0c1trXTsKKwkJCQkJCX0KKwkJCQkJCWJpdHMgKz0gYnl0ZXNwcDsKKwkJCQkJfQorCQkJCX0KKworCQkJCWJyZWFrOworCQkJfQorCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gRkFMU0U7CisJCX0KKwl9CisJZWxzZSBpZigoaW1hZ2VfdHlwZSA9PSBGSVRfVUlOVDE2KSB8fCAoaW1hZ2VfdHlwZSA9PSBGSVRfUkdCMTYpIHx8IChpbWFnZV90eXBlID09IEZJVF9SR0JBMTYpKSB7CisJCS8vIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHdvcmRzIHBlciBwaXhlbCAoMSBmb3IgMTYtYml0LCAzIGZvciA0OC1iaXQgb3IgNCBmb3IgNjQtYml0KQorCQljb25zdCB1bnNpZ25lZCB3b3Jkc3BwID0gKEZyZWVJbWFnZV9HZXRMaW5lKHNyYykgLyB3aWR0aCkgLyBzaXplb2YoV09SRCk7CisKKwkJZm9yKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJCVdPUkQgKmJpdHMgPSAoV09SRCopRnJlZUltYWdlX0dldFNjYW5MaW5lKHNyYywgeSk7CisJCQlmb3IoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisJCQkJZm9yKGsgPSAwOyBrIDwgd29yZHNwcDsgaysrKSB7CisJCQkJCWJpdHNba10gPSB+Yml0c1trXTsKKwkJCQl9CisJCQkJYml0cyArPSB3b3Jkc3BwOworCQkJfQorCQl9CisJfQorCWVsc2UgeworCQkvLyBhbnl0aGluZyBlbHNlIC4uLiAKKwkJcmV0dXJuIEZBTFNFOworCX0KKwkJCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qKiBAYnJpZWYgUGVyZm9tcyBhbiBoaXN0b2dyYW0gdHJhbnNmb3JtYXRpb24gb24gYSA4LCAyNCBvciAzMi1iaXQgaW1hZ2UgCithY2NvcmRpbmcgdG8gdGhlIHZhbHVlcyBvZiBhIGxvb2t1cCB0YWJsZSAoTFVUKS4KKworVGhlIHRyYW5zZm9ybWF0aW9uIGlzIGRvbmUgYXMgZm9sbG93cy48YnI+CitJbWFnZSA4LWJpdCA6IGlmIHRoZSBpbWFnZSBoYXMgYSBjb2xvciBwYWxldHRlLCB0aGUgTFVUIGlzIGFwcGxpZWQgdG8gdGhpcyBwYWxldHRlLCAKK290aGVyd2lzZSwgaXQgaXMgYXBwbGllZCB0byB0aGUgZ3JleSB2YWx1ZXMuPGJyPgorSW1hZ2UgMjQtYml0ICYgMzItYml0IDogaWYgY2hhbm5lbCA9PSBGSUNDX1JHQiwgdGhlIHNhbWUgTFVUIGlzIGFwcGxpZWQgdG8gZWFjaCBjb2xvcgorcGxhbmUgKFIsRywgYW5kIEIpLiBPdGhlcndpc2UsIHRoZSBMVVQgaXMgYXBwbGllZCB0byB0aGUgc3BlY2lmaWVkIGNoYW5uZWwgb25seS4KK0BwYXJhbSBzcmMgSW5wdXQgaW1hZ2UgdG8gYmUgcHJvY2Vzc2VkLgorQHBhcmFtIExVVCBMb29rdXAgdGFibGUuIDxiPlRoZSBzaXplIG9mICdMVVQnIGlzIGFzc3VtZWQgdG8gYmUgMjU2LjwvYj4KK0BwYXJhbSBjaGFubmVsIFRoZSBjb2xvciBjaGFubmVsIHRvIGJlIHByb2Nlc3NlZCAob25seSB1c2VkIHdpdGggMjQgJiAzMi1iaXQgRElCKS4KK0ByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZS4KK0BzZWUgRlJFRV9JTUFHRV9DT0xPUl9DSEFOTkVMCisqLworQk9PTCBETExfQ0FMTENPTlYgCitGcmVlSW1hZ2VfQWRqdXN0Q3VydmUoRklCSVRNQVAgKnNyYywgQllURSAqTFVULCBGUkVFX0lNQUdFX0NPTE9SX0NIQU5ORUwgY2hhbm5lbCkgeworCXVuc2lnbmVkIHgsIHk7CisJQllURSAqYml0cyA9IE5VTEw7CisKKwlpZighRnJlZUltYWdlX0hhc1BpeGVscyhzcmMpIHx8ICFMVVQgfHwgKEZyZWVJbWFnZV9HZXRJbWFnZVR5cGUoc3JjKSAhPSBGSVRfQklUTUFQKSkKKwkJcmV0dXJuIEZBTFNFOworCisJaW50IGJwcCA9IEZyZWVJbWFnZV9HZXRCUFAoc3JjKTsKKwlpZigoYnBwICE9IDgpICYmIChicHAgIT0gMjQpICYmIChicHAgIT0gMzIpKQorCQlyZXR1cm4gRkFMU0U7CisKKwkvLyBhcHBseSB0aGUgTFVUCisJc3dpdGNoKGJwcCkgeworCisJCWNhc2UgOCA6CisJCXsKKwkJCS8vIGlmIHRoZSBkaWIgaGFzIGEgY29sb3JtYXAsIGFwcGx5IHRoZSBMVVQgdG8gaXQKKwkJCS8vIGVsc2UsIGFwcGx5IHRoZSBMVVQgdG8gcGl4ZWwgdmFsdWVzCisKKwkJCWlmKEZyZWVJbWFnZV9HZXRDb2xvclR5cGUoc3JjKSA9PSBGSUNfUEFMRVRURSkgeworCQkJCVJHQlFVQUQgKnJnYiA9IEZyZWVJbWFnZV9HZXRQYWxldHRlKHNyYyk7CisJCQkJZm9yICh1bnNpZ25lZCBwYWwgPSAwOyBwYWwgPCBGcmVlSW1hZ2VfR2V0Q29sb3JzVXNlZChzcmMpOyBwYWwrKykgeworCQkJCQlyZ2ItPnJnYlJlZCAgID0gTFVUW3JnYi0+cmdiUmVkXTsKKwkJCQkJcmdiLT5yZ2JHcmVlbiA9IExVVFtyZ2ItPnJnYkdyZWVuXTsKKwkJCQkJcmdiLT5yZ2JCbHVlICA9IExVVFtyZ2ItPnJnYkJsdWVdOworCQkJCQlyZ2IrKzsKKwkJCQl9CisJCQl9CisJCQllbHNlIHsKKwkJCQlmb3IoeSA9IDA7IHkgPCBGcmVlSW1hZ2VfR2V0SGVpZ2h0KHNyYyk7IHkrKykgeworCQkJCQliaXRzID0gIEZyZWVJbWFnZV9HZXRTY2FuTGluZShzcmMsIHkpOworCQkJCQlmb3IoeCA9IDA7IHggPCBGcmVlSW1hZ2VfR2V0V2lkdGgoc3JjKTsgeCsrKSB7CisJCQkJCQliaXRzW3hdID0gTFVUWyBiaXRzW3hdIF07CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSAyNCA6CisJCWNhc2UgMzIgOgorCQl7CisJCQlpbnQgYnl0ZXNwcCA9IEZyZWVJbWFnZV9HZXRMaW5lKHNyYykgLyBGcmVlSW1hZ2VfR2V0V2lkdGgoc3JjKTsKKworCQkJc3dpdGNoKGNoYW5uZWwpIHsKKwkJCQljYXNlIEZJQ0NfUkdCIDoKKwkJCQkJZm9yKHkgPSAwOyB5IDwgRnJlZUltYWdlX0dldEhlaWdodChzcmMpOyB5KyspIHsKKwkJCQkJCWJpdHMgPSAgRnJlZUltYWdlX0dldFNjYW5MaW5lKHNyYywgeSk7CisJCQkJCQlmb3IoeCA9IDA7IHggPCBGcmVlSW1hZ2VfR2V0V2lkdGgoc3JjKTsgeCsrKSB7CisJCQkJCQkJYml0c1tGSV9SR0JBX0JMVUVdCT0gTFVUWyBiaXRzW0ZJX1JHQkFfQkxVRV0gXTsJLy8gQgorCQkJCQkJCWJpdHNbRklfUkdCQV9HUkVFTl0gPSBMVVRbIGJpdHNbRklfUkdCQV9HUkVFTl0gXTsJLy8gRworCQkJCQkJCWJpdHNbRklfUkdCQV9SRURdCT0gTFVUWyBiaXRzW0ZJX1JHQkFfUkVEXSBdOwkJLy8gUgorCQkJCQkJCQorCQkJCQkJCWJpdHMgKz0gYnl0ZXNwcDsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlicmVhazsKKworCQkJCWNhc2UgRklDQ19CTFVFIDoKKwkJCQkJZm9yKHkgPSAwOyB5IDwgRnJlZUltYWdlX0dldEhlaWdodChzcmMpOyB5KyspIHsKKwkJCQkJCWJpdHMgPSAgRnJlZUltYWdlX0dldFNjYW5MaW5lKHNyYywgeSk7CisJCQkJCQlmb3IoeCA9IDA7IHggPCBGcmVlSW1hZ2VfR2V0V2lkdGgoc3JjKTsgeCsrKSB7CisJCQkJCQkJYml0c1tGSV9SR0JBX0JMVUVdID0gTFVUWyBiaXRzW0ZJX1JHQkFfQkxVRV0gXTsJCS8vIEIKKwkJCQkJCQkKKwkJCQkJCQliaXRzICs9IGJ5dGVzcHA7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIEZJQ0NfR1JFRU4gOgorCQkJCQlmb3IoeSA9IDA7IHkgPCBGcmVlSW1hZ2VfR2V0SGVpZ2h0KHNyYyk7IHkrKykgeworCQkJCQkJYml0cyA9ICBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoc3JjLCB5KTsKKwkJCQkJCWZvcih4ID0gMDsgeCA8IEZyZWVJbWFnZV9HZXRXaWR0aChzcmMpOyB4KyspIHsKKwkJCQkJCQliaXRzW0ZJX1JHQkFfR1JFRU5dID0gTFVUWyBiaXRzW0ZJX1JHQkFfR1JFRU5dIF07CS8vIEcKKwkJCQkJCQkKKwkJCQkJCQliaXRzICs9IGJ5dGVzcHA7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIEZJQ0NfUkVEIDoKKwkJCQkJZm9yKHkgPSAwOyB5IDwgRnJlZUltYWdlX0dldEhlaWdodChzcmMpOyB5KyspIHsKKwkJCQkJCWJpdHMgPSAgRnJlZUltYWdlX0dldFNjYW5MaW5lKHNyYywgeSk7CisJCQkJCQlmb3IoeCA9IDA7IHggPCBGcmVlSW1hZ2VfR2V0V2lkdGgoc3JjKTsgeCsrKSB7CisJCQkJCQkJYml0c1tGSV9SR0JBX1JFRF0gPSBMVVRbIGJpdHNbRklfUkdCQV9SRURdIF07CQkvLyBSCisJCQkJCQkJCisJCQkJCQkJYml0cyArPSBieXRlc3BwOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCQkKKwkJCQljYXNlIEZJQ0NfQUxQSEEgOgorCQkJCQlpZigzMiA9PSBicHApIHsKKwkJCQkJCWZvcih5ID0gMDsgeSA8IEZyZWVJbWFnZV9HZXRIZWlnaHQoc3JjKTsgeSsrKSB7CisJCQkJCQkJYml0cyA9ICBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoc3JjLCB5KTsKKwkJCQkJCQlmb3IoeCA9IDA7IHggPCBGcmVlSW1hZ2VfR2V0V2lkdGgoc3JjKTsgeCsrKSB7CisJCQkJCQkJCWJpdHNbRklfUkdCQV9BTFBIQV0gPSBMVVRbIGJpdHNbRklfUkdCQV9BTFBIQV0gXTsJLy8gQQorCQkJCQkJCQkKKwkJCQkJCQkJYml0cyArPSBieXRlc3BwOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlicmVhazsKKworCQkJCWRlZmF1bHQ6CisJCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoqIEBicmllZiBQZXJmb3JtcyBnYW1tYSBjb3JyZWN0aW9uIG9uIGEgOCwgMjQgb3IgMzItYml0IGltYWdlLgorCitAcGFyYW0gc3JjIElucHV0IGltYWdlIHRvIGJlIHByb2Nlc3NlZC4KK0BwYXJhbSBnYW1tYSBHYW1tYSB2YWx1ZSB0byB1c2UuIEEgdmFsdWUgb2YgMS4wIGxlYXZlcyB0aGUgaW1hZ2UgYWxvbmUsIAorbGVzcyB0aGFuIG9uZSBkYXJrZW5zIGl0LCBhbmQgZ3JlYXRlciB0aGFuIG9uZSBsaWdodGVucyBpdC4KK0ByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZS4KKyovCitCT09MIERMTF9DQUxMQ09OViAKK0ZyZWVJbWFnZV9BZGp1c3RHYW1tYShGSUJJVE1BUCAqc3JjLCBkb3VibGUgZ2FtbWEpIHsKKwlCWVRFIExVVFsyNTZdOwkJLy8gTG9va3VwIHRhYmxlCisKKwlpZighRnJlZUltYWdlX0hhc1BpeGVscyhzcmMpIHx8IChnYW1tYSA8PSAwKSkKKwkJcmV0dXJuIEZBTFNFOworCQorCS8vIEJ1aWxkIHRoZSBsb29rdXAgdGFibGUKKworCWRvdWJsZSBleHBvbmVudCA9IDEgLyBnYW1tYTsKKwlkb3VibGUgdiA9IDI1NS4wICogKGRvdWJsZSlwb3coKGRvdWJsZSkyNTUsIC1leHBvbmVudCk7CisJZm9yKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCWRvdWJsZSBjb2xvciA9IChkb3VibGUpcG93KChkb3VibGUpaSwgZXhwb25lbnQpICogdjsKKwkJaWYoY29sb3IgPiAyNTUpCisJCQljb2xvciA9IDI1NTsKKwkJTFVUW2ldID0gKEJZVEUpZmxvb3IoY29sb3IgKyAwLjUpOworCX0KKworCS8vIEFwcGx5IHRoZSBnYW1tYSBjb3JyZWN0aW9uCisJcmV0dXJuIEZyZWVJbWFnZV9BZGp1c3RDdXJ2ZShzcmMsIExVVCwgRklDQ19SR0IpOworfQorCisvKiogQGJyaWVmIEFkanVzdHMgdGhlIGJyaWdodG5lc3Mgb2YgYSA4LCAyNCBvciAzMi1iaXQgaW1hZ2UgYnkgYSBjZXJ0YWluIGFtb3VudC4KKworQHBhcmFtIHNyYyBJbnB1dCBpbWFnZSB0byBiZSBwcm9jZXNzZWQuCitAcGFyYW0gcGVyY2VudGFnZSBXaGVyZSAtMTAwIDw9IHBlcmNlbnRhZ2UgPD0gMTAwPGJyPgorQSB2YWx1ZSAwIG1lYW5zIG5vIGNoYW5nZSwgbGVzcyB0aGFuIDAgd2lsbCBtYWtlIHRoZSBpbWFnZSBkYXJrZXIgCithbmQgZ3JlYXRlciB0aGFuIDAgd2lsbCBtYWtlIHRoZSBpbWFnZSBicmlnaHRlci4KK0ByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZS4KKyovCitCT09MIERMTF9DQUxMQ09OViAKK0ZyZWVJbWFnZV9BZGp1c3RCcmlnaHRuZXNzKEZJQklUTUFQICpzcmMsIGRvdWJsZSBwZXJjZW50YWdlKSB7CisJQllURSBMVVRbMjU2XTsJCS8vIExvb2t1cCB0YWJsZQorCWRvdWJsZSB2YWx1ZTsKKworCWlmKCFGcmVlSW1hZ2VfSGFzUGl4ZWxzKHNyYykpCisJCXJldHVybiBGQUxTRTsKKwkKKwkvLyBCdWlsZCB0aGUgbG9va3VwIHRhYmxlCisJY29uc3QgZG91YmxlIHNjYWxlID0gKDEwMCArIHBlcmNlbnRhZ2UpIC8gMTAwOworCWZvcihpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQl2YWx1ZSA9IGkgKiBzY2FsZTsKKwkJdmFsdWUgPSBNQVgoMC4wLCBNSU4odmFsdWUsIDI1NS4wKSk7CisJCUxVVFtpXSA9IChCWVRFKWZsb29yKHZhbHVlICsgMC41KTsKKwl9CisJcmV0dXJuIEZyZWVJbWFnZV9BZGp1c3RDdXJ2ZShzcmMsIExVVCwgRklDQ19SR0IpOworfQorCisvKiogQGJyaWVmIEFkanVzdHMgdGhlIGNvbnRyYXN0IG9mIGEgOCwgMjQgb3IgMzItYml0IGltYWdlIGJ5IGEgY2VydGFpbiBhbW91bnQuCisKK0BwYXJhbSBzcmMgSW5wdXQgaW1hZ2UgdG8gYmUgcHJvY2Vzc2VkLgorQHBhcmFtIHBlcmNlbnRhZ2UgV2hlcmUgLTEwMCA8PSBwZXJjZW50YWdlIDw9IDEwMDxicj4KK0EgdmFsdWUgMCBtZWFucyBubyBjaGFuZ2UsIGxlc3MgdGhhbiAwIHdpbGwgZGVjcmVhc2UgdGhlIGNvbnRyYXN0IAorYW5kIGdyZWF0ZXIgdGhhbiAwIHdpbGwgaW5jcmVhc2UgdGhlIGNvbnRyYXN0IG9mIHRoZSBpbWFnZS4KK0ByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZS4KKyovCitCT09MIERMTF9DQUxMQ09OViAKK0ZyZWVJbWFnZV9BZGp1c3RDb250cmFzdChGSUJJVE1BUCAqc3JjLCBkb3VibGUgcGVyY2VudGFnZSkgeworCUJZVEUgTFVUWzI1Nl07CQkvLyBMb29rdXAgdGFibGUKKwlkb3VibGUgdmFsdWU7CisKKwlpZighRnJlZUltYWdlX0hhc1BpeGVscyhzcmMpKQorCQlyZXR1cm4gRkFMU0U7CisJCisJLy8gQnVpbGQgdGhlIGxvb2t1cCB0YWJsZQorCWNvbnN0IGRvdWJsZSBzY2FsZSA9ICgxMDAgKyBwZXJjZW50YWdlKSAvIDEwMDsKKwlmb3IoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkJdmFsdWUgPSAxMjggKyAoaSAtIDEyOCkgKiBzY2FsZTsKKwkJdmFsdWUgPSBNQVgoMC4wLCBNSU4odmFsdWUsIDI1NS4wKSk7CisJCUxVVFtpXSA9IChCWVRFKWZsb29yKHZhbHVlICsgMC41KTsKKwl9CisJcmV0dXJuIEZyZWVJbWFnZV9BZGp1c3RDdXJ2ZShzcmMsIExVVCwgRklDQ19SR0IpOworfQorCisvKiogQGJyaWVmIENvbXB1dGVzIGltYWdlIGhpc3RvZ3JhbQorCitGb3IgMjQtYml0IGFuZCAzMi1iaXQgaW1hZ2VzLCBoaXN0b2dyYW0gY2FuIGJlIGNvbXB1dGVkIGZyb20gcmVkLCBncmVlbiwgYmx1ZSBhbmQgCitibGFjayBjaGFubmVscy4gRm9yIDgtYml0IGltYWdlcywgaGlzdG9ncmFtIGlzIGNvbXB1dGVkIGZyb20gdGhlIGJsYWNrIGNoYW5uZWwuIE90aGVyIAorYml0IGRlcHRoIGlzIG5vdCBzdXBwb3J0ZWQgKG5vdGhpbmcgaXMgZG9uZSkuCitAcGFyYW0gc3JjIElucHV0IGltYWdlIHRvIGJlIHByb2Nlc3NlZC4KK0BwYXJhbSBoaXN0byBIaXN0b2dyYW0gYXJyYXkgdG8gZmlsbC4gPGI+VGhlIHNpemUgb2YgJ2hpc3RvJyBpcyBhc3N1bWVkIHRvIGJlIDI1Ni48L2I+CitAcGFyYW0gY2hhbm5lbCBDb2xvciBjaGFubmVsIHRvIHVzZQorQHJldHVybiBSZXR1cm5zIFRSVUUgaWYgc3VjY2VzZnVsLCByZXR1cm5zIEZBTFNFIGlmIHRoZSBpbWFnZSBiaXQgZGVwdGggaXNuJ3Qgc3VwcG9ydGVkLgorKi8KK0JPT0wgRExMX0NBTExDT05WIAorRnJlZUltYWdlX0dldEhpc3RvZ3JhbShGSUJJVE1BUCAqc3JjLCBEV09SRCAqaGlzdG8sIEZSRUVfSU1BR0VfQ09MT1JfQ0hBTk5FTCBjaGFubmVsKSB7CisJQllURSBwaXhlbDsKKwlCWVRFICpiaXRzID0gTlVMTDsKKwl1bnNpZ25lZCB4LCB5OworCisJaWYoIUZyZWVJbWFnZV9IYXNQaXhlbHMoc3JjKSB8fCAhaGlzdG8pIHJldHVybiBGQUxTRTsKKworCXVuc2lnbmVkIHdpZHRoICA9IEZyZWVJbWFnZV9HZXRXaWR0aChzcmMpOworCXVuc2lnbmVkIGhlaWdodCA9IEZyZWVJbWFnZV9HZXRIZWlnaHQoc3JjKTsKKwl1bnNpZ25lZCBicHAgICAgPSBGcmVlSW1hZ2VfR2V0QlBQKHNyYyk7CisKKwlpZihicHAgPT0gOCkgeworCQkvLyBjbGVhciBoaXN0b2dyYW0gYXJyYXkKKwkJbWVtc2V0KGhpc3RvLCAwLCAyNTYgKiBzaXplb2YoRFdPUkQpKTsKKwkJLy8gY29tcHV0ZSBoaXN0b2dyYW0gZm9yIGJsYWNrIGNoYW5uZWwKKwkJZm9yKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJCWJpdHMgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoc3JjLCB5KTsKKwkJCWZvcih4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQkvLyBnZXQgcGl4ZWwgdmFsdWUKKwkJCQlwaXhlbCA9IGJpdHNbeF07CisJCQkJaGlzdG9bcGl4ZWxdKys7CisJCQl9CisJCX0KKwkJcmV0dXJuIFRSVUU7CisJfQorCWVsc2UgaWYoKGJwcCA9PSAyNCkgfHwgKGJwcCA9PSAzMikpIHsKKwkJaW50IGJ5dGVzcHAgPSBicHAgLyA4OwkvLyBieXRlcyAvIHBpeGVsCisKKwkJLy8gY2xlYXIgaGlzdG9ncmFtIGFycmF5CisJCW1lbXNldChoaXN0bywgMCwgMjU2ICogc2l6ZW9mKERXT1JEKSk7CisKKwkJc3dpdGNoKGNoYW5uZWwpIHsKKwkJCWNhc2UgRklDQ19SRUQ6CisJCQkJLy8gY29tcHV0ZSBoaXN0b2dyYW0gZm9yIHJlZCBjaGFubmVsCisJCQkJZm9yKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJCQkJYml0cyA9ICBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoc3JjLCB5KTsKKwkJCQkJZm9yKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworCQkJCQkJcGl4ZWwgPSBiaXRzW0ZJX1JHQkFfUkVEXTsJLy8gUgorCQkJCQkJaGlzdG9bcGl4ZWxdKys7CisJCQkJCQliaXRzICs9IGJ5dGVzcHA7CisJCQkJCX0KKwkJCQl9CisJCQkJcmV0dXJuIFRSVUU7CisKKwkJCWNhc2UgRklDQ19HUkVFTjoKKwkJCQkvLyBjb21wdXRlIGhpc3RvZ3JhbSBmb3IgZ3JlZW4gY2hhbm5lbAorCQkJCWZvcih5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisJCQkJCWJpdHMgPSAgRnJlZUltYWdlX0dldFNjYW5MaW5lKHNyYywgeSk7CisJCQkJCWZvcih4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQkJCXBpeGVsID0gYml0c1tGSV9SR0JBX0dSRUVOXTsJLy8gRworCQkJCQkJaGlzdG9bcGl4ZWxdKys7CisJCQkJCQliaXRzICs9IGJ5dGVzcHA7CisJCQkJCX0KKwkJCQl9CisJCQkJcmV0dXJuIFRSVUU7CisKKwkJCWNhc2UgRklDQ19CTFVFOgorCQkJCS8vIGNvbXB1dGUgaGlzdG9ncmFtIGZvciBibHVlIGNoYW5uZWwKKwkJCQlmb3IoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworCQkJCQliaXRzID0gIEZyZWVJbWFnZV9HZXRTY2FuTGluZShzcmMsIHkpOworCQkJCQlmb3IoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisJCQkJCQlwaXhlbCA9IGJpdHNbRklfUkdCQV9CTFVFXTsJLy8gQgorCQkJCQkJaGlzdG9bcGl4ZWxdKys7CisJCQkJCQliaXRzICs9IGJ5dGVzcHA7CisJCQkJCX0KKwkJCQl9CisJCQkJcmV0dXJuIFRSVUU7CisKKwkJCWNhc2UgRklDQ19CTEFDSzoKKwkJCWNhc2UgRklDQ19SR0I6CisJCQkJLy8gY29tcHV0ZSBoaXN0b2dyYW0gZm9yIGJsYWNrIGNoYW5uZWwKKwkJCQlmb3IoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworCQkJCQliaXRzID0gIEZyZWVJbWFnZV9HZXRTY2FuTGluZShzcmMsIHkpOworCQkJCQlmb3IoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisJCQkJCQkvLyBSR0IgdG8gR1JFWSBjb252ZXJzaW9uCisJCQkJCQlwaXhlbCA9IEdSRVkoYml0c1tGSV9SR0JBX1JFRF0sIGJpdHNbRklfUkdCQV9HUkVFTl0sIGJpdHNbRklfUkdCQV9CTFVFXSk7CisJCQkJCQloaXN0b1twaXhlbF0rKzsKKwkJCQkJCWJpdHMgKz0gYnl0ZXNwcDsKKwkJCQkJfQorCQkJCX0KKwkJCQlyZXR1cm4gVFJVRTsKKwkJCQkKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIEZBTFNFOworCQl9CisJfQorCisJcmV0dXJuIEZBTFNFOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworLyoqIEBicmllZiBDcmVhdGVzIGEgbG9va3VwIHRhYmxlIHRvIGJlIHVzZWQgd2l0aCBGcmVlSW1hZ2VfQWRqdXN0Q3VydmUoKSB3aGljaAorIG1heSBhZGp1c3QgYnJpZ2h0bmVzcyBhbmQgY29udHJhc3QsIGNvcnJlY3QgZ2FtbWEgYW5kIGludmVydCB0aGUgaW1hZ2Ugd2l0aCBhCisgc2luZ2xlIGNhbGwgdG8gRnJlZUltYWdlX0FkanVzdEN1cnZlKCkuCisgCisgVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgbG9va3VwIHRhYmxlIHRvIGJlIHVzZWQgd2l0aCBGcmVlSW1hZ2VfQWRqdXN0Q3VydmUoKQorIHdoaWNoIG1heSBhZGp1c3QgYnJpZ2h0bmVzcyBhbmQgY29udHJhc3QsIGNvcnJlY3QgZ2FtbWEgYW5kIGludmVydCB0aGUgaW1hZ2UKKyB3aXRoIGEgc2luZ2xlIGNhbGwgdG8gRnJlZUltYWdlX0FkanVzdEN1cnZlKCkuIElmIG1vcmUgdGhhbiBvbmUgb2YgdGhlc2UgaW1hZ2UKKyBkaXNwbGF5IHByb3BlcnRpZXMgbmVlZCB0byBiZSBhZGp1c3RlZCwgdXNpbmcgYSBjb21iaW5lZCBsb29rdXAgdGFibGUgc2hvdWxkIGJlCisgcHJlZmVycmVkIG92ZXIgY2FsbGluZyBlYWNoIGFkanVzdG1lbnQgZnVuY3Rpb24gc2VwYXJhdGVseS4gVGhhdCdzIHBhcnRpY3VsYXJseQorIHRydWUgZm9yIGh1Z2UgaW1hZ2VzIG9yIGlmIHBlcmZvcm1hbmNlIGlzIGFuIGlzc3VlLiBUaGVuLCB0aGUgZXhwZW5zaXZlIHByb2Nlc3MKKyBvZiBpdGVyYXRpbmcgb3ZlciBhbGwgcGl4ZWxzIG9mIGFuIGltYWdlIGlzIHBlcmZvcm1lZCBvbmx5IG9uY2UgYW5kIG5vdCB1cCB0bworIGZvdXIgdGltZXMuCisgCisgRnVydGhlcm1vcmUsIHRoZSBsb29rdXAgdGFibGUgY3JlYXRlZCBkb2VzIG5vdCBkZXBlbmQgb24gdGhlIG9yZGVyLCBpbiB3aGljaAorIGVhY2ggc2luZ2xlIGFkanVzdG1lbnQgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZC4gRHVlIHRvIHJvdW5kaW5nIGFuZCBieXRlIGNhc3RpbmcKKyBpc3N1ZXMsIGl0IGFjdHVhbGx5IG1hdHRlcnMgaW4gd2hpY2ggb3JkZXIgaW5kaXZpZHVhbCBhZGp1c3RtZW50IG9wZXJhdGlvbnMKKyBhcmUgcGVyZm9ybWVkLiBCb3RoIG9mIHRoZSBmb2xsb3dpbmcgc25pcHBldHMgbW9zdCBsaWtlbHkgcHJvZHVjZSBkaWZmZXJlbnQKKyByZXN1bHRzOgorIAorIC8vIHNuaXBwZXQgMTogY29udHJhc3QsIGJyaWdodG5lc3MKKyBGcmVlSW1hZ2VfQWRqdXN0Q29udHJhc3QoZGliLCAxNS4wKTsKKyBGcmVlSW1hZ2VfQWRqdXN0QnJpZ2h0bmVzcyhkaWIsIDUwLjApOyAKKyAKKyAvLyBzbmlwcGV0IDI6IGJyaWdodG5lc3MsIGNvbnRyYXN0CisgRnJlZUltYWdlX0FkanVzdEJyaWdodG5lc3MoZGliLCA1MC4wKTsKKyBGcmVlSW1hZ2VfQWRqdXN0Q29udHJhc3QoZGliLCAxNS4wKTsKKyAKKyBCZXR0ZXIgYW5kIGV2ZW4gZmFzdGVyIHdvdWxkIGJlIHNuaXBwZXQgMzoKKyAKKyAvLyBzbmlwcGV0IDM6CisgQllURSBMVVRbMjU2XTsKKyBGcmVlSW1hZ2VfR2V0QWRqdXN0Q29sb3JzTG9va3VwVGFibGUoTFVULCA1MC4wLCAxNS4wLCAxLjAsIEZBTFNFKTsgCisgRnJlZUltYWdlX0FkanVzdEN1cnZlKGRpYiwgTFVULCBGSUNDX1JHQik7CisgCisgVGhpcyBmdW5jdGlvbiBpcyBhbHNvIHVzZWQgaW50ZXJuYWxseSBieSBGcmVlSW1hZ2VfQWRqdXN0Q29sb3JzKCksIHdoaWNoIGRvZXMKKyBub3QgcmV0dXJuIHRoZSBsb29rdXAgdGFibGUsIGJ1dCB1c2VzIGl0IHRvIGNhbGwgRnJlZUltYWdlX0FkanVzdEN1cnZlKCkgb24gdGhlCisgcGFzc2VkIGltYWdlLgorIAorIEBwYXJhbSBMVVQgT3V0cHV0IGxvb2t1cCB0YWJsZSB0byBiZSB1c2VkIHdpdGggRnJlZUltYWdlX0FkanVzdEN1cnZlKCkuIDxiPlRoZQorIHNpemUgb2YgJ0xVVCcgaXMgYXNzdW1lZCB0byBiZSAyNTYuPC9iPgorIEBwYXJhbSBicmlnaHRuZXNzIFBlcmNlbnRhZ2UgYnJpZ2h0bmVzcyB2YWx1ZSB3aGVyZSAtMTAwIDw9IGJyaWdodG5lc3MgPD0gMTAwPGJyPgorIEEgdmFsdWUgb2YgMCBtZWFucyBubyBjaGFuZ2UsIGxlc3MgdGhhbiAwIHdpbGwgbWFrZSB0aGUgaW1hZ2UgZGFya2VyIGFuZCBncmVhdGVyCisgdGhhbiAwIHdpbGwgbWFrZSB0aGUgaW1hZ2UgYnJpZ2h0ZXIuCisgQHBhcmFtIGNvbnRyYXN0IFBlcmNlbnRhZ2UgY29udHJhc3QgdmFsdWUgd2hlcmUgLTEwMCA8PSBjb250cmFzdCA8PSAxMDA8YnI+CisgQSB2YWx1ZSBvZiAwIG1lYW5zIG5vIGNoYW5nZSwgbGVzcyB0aGFuIDAgd2lsbCBkZWNyZWFzZSB0aGUgY29udHJhc3QKKyBhbmQgZ3JlYXRlciB0aGFuIDAgd2lsbCBpbmNyZWFzZSB0aGUgY29udHJhc3Qgb2YgdGhlIGltYWdlLgorIEBwYXJhbSBnYW1tYSBHYW1tYSB2YWx1ZSB0byBiZSB1c2VkIGZvciBnYW1tYSBjb3JyZWN0aW9uLiBBIHZhbHVlIG9mIDEuMCBsZWF2ZXMKKyB0aGUgaW1hZ2UgYWxvbmUsIGxlc3MgdGhhbiBvbmUgZGFya2VucyBpdCwgYW5kIGdyZWF0ZXIgdGhhbiBvbmUgbGlnaHRlbnMgaXQuCisgVGhpcyBwYXJhbWV0ZXIgbXVzdCBub3QgYmUgemVybyBvciBzbWFsbGVyIHRoYW4gemVyby4gSWYgc28sIGl0IHdpbGwgYmUgaWdub3JlZAorIGFuZCBubyBnYW1tYSBjb3JyZWN0aW9uIHdpbGwgYmUgcGVyZm9ybWVkIHVzaW5nIHRoZSBsb29rdXAgdGFibGUgY3JlYXRlZC4KKyBAcGFyYW0gaW52ZXJ0IElmIHNldCB0byBUUlVFLCB0aGUgaW1hZ2Ugd2lsbCBiZSBpbnZlcnRlZC4KKyBAcmV0dXJuIFJldHVybnMgdGhlIG51bWJlciBvZiBhZGp1c3RtZW50cyBhcHBsaWVkIHRvIHRoZSByZXN1bHRpbmcgbG9va3VwIHRhYmxlCisgY29tcGFyZWQgdG8gYSBibGluZCBsb29rdXAgdGFibGUuCisgKi8KK2ludCBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9HZXRBZGp1c3RDb2xvcnNMb29rdXBUYWJsZShCWVRFICpMVVQsIGRvdWJsZSBicmlnaHRuZXNzLCBkb3VibGUgY29udHJhc3QsIGRvdWJsZSBnYW1tYSwgQk9PTCBpbnZlcnQpIHsKKwlkb3VibGUgZGJsTFVUWzI1Nl07CisJZG91YmxlIHZhbHVlOworCWludCByZXN1bHQgPSAwOworCisJaWYgKChicmlnaHRuZXNzID09IDAuMCkgJiYgKGNvbnRyYXN0ID09IDAuMCkgJiYgKGdhbW1hID09IDEuMCkgJiYgKCFpbnZlcnQpKSB7CisJCS8vIG5vdGhpbmcgdG8gZG8sIGlmIGFsbCBhcmd1bWVudHMgaGF2ZSB0aGVpciBkZWZhdWx0IHZhbHVlcworCQkvLyByZXR1cm4gYSBibGluZCBMVVQKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQkJTFVUW2ldID0gKEJZVEUpaTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwkvLyBmaXJzdCwgY3JlYXRlIGEgYmxpbmQgTFVULCB3aGljaCBkb2VzIG5vdGhpbmcgdG8gdGhlIGltYWdlCisJZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQlkYmxMVVRbaV0gPSBpOworCX0KKworCWlmIChjb250cmFzdCAhPSAwLjApIHsKKwkJLy8gbW9kaWZ5IGxvb2t1cCB0YWJsZSB3aXRoIGNvbnRyYXN0IGFkanVzdG1lbnQgZGF0YQorCQljb25zdCBkb3VibGUgdiA9ICgxMDAuMCArIGNvbnRyYXN0KSAvIDEwMC4wOworCQlmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCQl2YWx1ZSA9IDEyOCArIChkYmxMVVRbaV0gLSAxMjgpICogdjsKKwkJCWRibExVVFtpXSA9IE1BWCgwLjAsIE1JTih2YWx1ZSwgMjU1LjApKTsKKwkJfQorCQlyZXN1bHQrKzsKKwl9CisKKwlpZiAoYnJpZ2h0bmVzcyAhPSAwLjApIHsKKwkJLy8gbW9kaWZ5IGxvb2t1cCB0YWJsZSB3aXRoIGJyaWdodG5lc3MgYWRqdXN0bWVudCBkYXRhCisJCWNvbnN0IGRvdWJsZSB2ID0gKDEwMC4wICsgYnJpZ2h0bmVzcykgLyAxMDAuMDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQkJdmFsdWUgPSBkYmxMVVRbaV0gKiB2OworCQkJZGJsTFVUW2ldID0gTUFYKDAuMCwgTUlOKHZhbHVlLCAyNTUuMCkpOworCQl9CisJCXJlc3VsdCsrOworCX0KKworCWlmICgoZ2FtbWEgPiAwKSAmJiAoZ2FtbWEgIT0gMS4wKSkgeworCQkvLyBtb2RpZnkgbG9va3VwIHRhYmxlIHdpdGggZ2FtbWEgYWRqdXN0bWVudCBkYXRhCisJCWRvdWJsZSBleHBvbmVudCA9IDEgLyBnYW1tYTsKKwkJY29uc3QgZG91YmxlIHYgPSAyNTUuMCAqIChkb3VibGUpcG93KChkb3VibGUpMjU1LCAtZXhwb25lbnQpOworCQlmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCQl2YWx1ZSA9IHBvdyhkYmxMVVRbaV0sIGV4cG9uZW50KSAqIHY7CisJCQlkYmxMVVRbaV0gPSBNQVgoMC4wLCBNSU4odmFsdWUsIDI1NS4wKSk7CisJCX0KKwkJcmVzdWx0Kys7CisJfQorCisJaWYgKCFpbnZlcnQpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQkJTFVUW2ldID0gKEJZVEUpZmxvb3IoZGJsTFVUW2ldICsgMC41KTsKKwkJfQorCX0gZWxzZSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkJCUxVVFtpXSA9IDI1NSAtIChCWVRFKWZsb29yKGRibExVVFtpXSArIDAuNSk7CisJCX0KKwkJcmVzdWx0Kys7CisJfQorCS8vIHJldHVybiB0aGUgbnVtYmVyIG9mIGFkanVzdG1lbnRzIG1hZGUKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKiogQGJyaWVmIEFkanVzdHMgYW4gaW1hZ2UncyBicmlnaHRuZXNzLCBjb250cmFzdCBhbmQgZ2FtbWEgYXMgd2VsbCBhcyBpdCBtYXkKKyBvcHRpb25hbGx5IGludmVydCB0aGUgaW1hZ2Ugd2l0aGluIGEgc2luZ2xlIG9wZXJhdGlvbi4KKyAKKyBUaGlzIGZ1bmN0aW9uIGFkanVzdHMgYW4gaW1hZ2UncyBicmlnaHRuZXNzLCBjb250cmFzdCBhbmQgZ2FtbWEgYXMgd2VsbCBhcyBpdAorIG1heSBvcHRpb25hbGx5IGludmVydCB0aGUgaW1hZ2Ugd2l0aGluIGEgc2luZ2xlIG9wZXJhdGlvbi4gSWYgbW9yZSB0aGFuIG9uZSBvZgorIHRoZXNlIGltYWdlIGRpc3BsYXkgcHJvcGVydGllcyBuZWVkIHRvIGJlIGFkanVzdGVkLCB1c2luZyB0aGlzIGZ1bmN0aW9uIHNob3VsZAorIGJlIHByZWZlcnJlZCBvdmVyIGNhbGxpbmcgZWFjaCBhZGp1c3RtZW50IGZ1bmN0aW9uIHNlcGFyYXRlbHkuIFRoYXQncworIHBhcnRpY3VsYXJseSB0cnVlIGZvciBodWdlIGltYWdlcyBvciBpZiBwZXJmb3JtYW5jZSBpcyBhbiBpc3N1ZS4KKyAKKyBUaGlzIGZ1bmN0aW9uIHJlbGllcyBvbiBGcmVlSW1hZ2VfR2V0QWRqdXN0Q29sb3JzTG9va3VwVGFibGUoKSwgd2hpY2ggY3JlYXRlcyBhCisgc2luZ2xlIGxvb2t1cCB0YWJsZSwgdGhhdCBjb21iaW5lcyBhbGwgYWRqdXN0bWVudCBvcGVyYXRpb25zIHJlcXVlc3RlZC4KKyAKKyBGdXJ0aGVybW9yZSwgdGhlIGxvb2t1cCB0YWJsZSBjcmVhdGVkIGJ5IEZyZWVJbWFnZV9HZXRBZGp1c3RDb2xvcnNMb29rdXBUYWJsZSgpCisgZG9lcyBub3QgZGVwZW5kIG9uIHRoZSBvcmRlciwgaW4gd2hpY2ggZWFjaCBzaW5nbGUgYWRqdXN0bWVudCBvcGVyYXRpb24gaXMKKyBwZXJmb3JtZWQuIER1ZSB0byByb3VuZGluZyBhbmQgYnl0ZSBjYXN0aW5nIGlzc3VlcywgaXQgYWN0dWFsbHkgbWF0dGVycyBpbiB3aGljaAorIG9yZGVyIGluZGl2aWR1YWwgYWRqdXN0bWVudCBvcGVyYXRpb25zIGFyZSBwZXJmb3JtZWQuIEJvdGggb2YgdGhlIGZvbGxvd2luZworIHNuaXBwZXRzIG1vc3QgbGlrZWx5IHByb2R1Y2UgZGlmZmVyZW50IHJlc3VsdHM6CisgCisgLy8gc25pcHBldCAxOiBjb250cmFzdCwgYnJpZ2h0bmVzcworIEZyZWVJbWFnZV9BZGp1c3RDb250cmFzdChkaWIsIDE1LjApOworIEZyZWVJbWFnZV9BZGp1c3RCcmlnaHRuZXNzKGRpYiwgNTAuMCk7IAorIAorIC8vIHNuaXBwZXQgMjogYnJpZ2h0bmVzcywgY29udHJhc3QKKyBGcmVlSW1hZ2VfQWRqdXN0QnJpZ2h0bmVzcyhkaWIsIDUwLjApOworIEZyZWVJbWFnZV9BZGp1c3RDb250cmFzdChkaWIsIDE1LjApOworIAorIEJldHRlciBhbmQgZXZlbiBmYXN0ZXIgd291bGQgYmUgc25pcHBldCAzOgorIAorIC8vIHNuaXBwZXQgMzoKKyBGcmVlSW1hZ2VfQWRqdXN0Q29sb3JzKGRpYiwgNTAuMCwgMTUuMCwgMS4wLCBGQUxTRSk7CisgCisgQHBhcmFtIGRpYiBJbnB1dC9vdXRwdXQgaW1hZ2UgdG8gYmUgcHJvY2Vzc2VkLgorIEBwYXJhbSBicmlnaHRuZXNzIFBlcmNlbnRhZ2UgYnJpZ2h0bmVzcyB2YWx1ZSB3aGVyZSAtMTAwIDw9IGJyaWdodG5lc3MgPD0gMTAwPGJyPgorIEEgdmFsdWUgb2YgMCBtZWFucyBubyBjaGFuZ2UsIGxlc3MgdGhhbiAwIHdpbGwgbWFrZSB0aGUgaW1hZ2UgZGFya2VyIGFuZCBncmVhdGVyCisgdGhhbiAwIHdpbGwgbWFrZSB0aGUgaW1hZ2UgYnJpZ2h0ZXIuCisgQHBhcmFtIGNvbnRyYXN0IFBlcmNlbnRhZ2UgY29udHJhc3QgdmFsdWUgd2hlcmUgLTEwMCA8PSBjb250cmFzdCA8PSAxMDA8YnI+CisgQSB2YWx1ZSBvZiAwIG1lYW5zIG5vIGNoYW5nZSwgbGVzcyB0aGFuIDAgd2lsbCBkZWNyZWFzZSB0aGUgY29udHJhc3QKKyBhbmQgZ3JlYXRlciB0aGFuIDAgd2lsbCBpbmNyZWFzZSB0aGUgY29udHJhc3Qgb2YgdGhlIGltYWdlLgorIEBwYXJhbSBnYW1tYSBHYW1tYSB2YWx1ZSB0byBiZSB1c2VkIGZvciBnYW1tYSBjb3JyZWN0aW9uLiBBIHZhbHVlIG9mIDEuMCBsZWF2ZXMKKyB0aGUgaW1hZ2UgYWxvbmUsIGxlc3MgdGhhbiBvbmUgZGFya2VucyBpdCwgYW5kIGdyZWF0ZXIgdGhhbiBvbmUgbGlnaHRlbnMgaXQuPGJyPgorIFRoaXMgcGFyYW1ldGVyIG11c3Qgbm90IGJlIHplcm8gb3Igc21hbGxlciB0aGFuIHplcm8uIElmIHNvLCBpdCB3aWxsIGJlIGlnbm9yZWQKKyBhbmQgbm8gZ2FtbWEgY29ycmVjdGlvbiB3aWxsIGJlIHBlcmZvcm1lZCBvbiB0aGUgaW1hZ2UuCisgQHBhcmFtIGludmVydCBJZiBzZXQgdG8gVFJVRSwgdGhlIGltYWdlIHdpbGwgYmUgaW52ZXJ0ZWQuCisgQHJldHVybiBSZXR1cm5zIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb3RoZXJ3aXNlIChlLmcuIHdoZW4gdGhlIGJpdGRlcGggb2YgdGhlCisgc291cmNlIGRpYiBjYW5ub3QgYmUgaGFuZGxlZCkuCisgKi8KK0JPT0wgRExMX0NBTExDT05WCitGcmVlSW1hZ2VfQWRqdXN0Q29sb3JzKEZJQklUTUFQICpkaWIsIGRvdWJsZSBicmlnaHRuZXNzLCBkb3VibGUgY29udHJhc3QsIGRvdWJsZSBnYW1tYSwgQk9PTCBpbnZlcnQpIHsKKwlCWVRFIExVVFsyNTZdOworCisJaWYgKCFGcmVlSW1hZ2VfSGFzUGl4ZWxzKGRpYikgfHwgKEZyZWVJbWFnZV9HZXRJbWFnZVR5cGUoZGliKSAhPSBGSVRfQklUTUFQKSkgeworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJaW50IGJwcCA9IEZyZWVJbWFnZV9HZXRCUFAoZGliKTsKKwlpZiAoKGJwcCAhPSA4KSAmJiAoYnBwICE9IDI0KSAmJiAoYnBwICE9IDMyKSkgeworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJaWYgKEZyZWVJbWFnZV9HZXRBZGp1c3RDb2xvcnNMb29rdXBUYWJsZShMVVQsIGJyaWdodG5lc3MsIGNvbnRyYXN0LCBnYW1tYSwgaW52ZXJ0KSkgeworCQlyZXR1cm4gRnJlZUltYWdlX0FkanVzdEN1cnZlKGRpYiwgTFVULCBGSUNDX1JHQik7CisJfQorCXJldHVybiBGQUxTRTsKK30KKworLyoqIEBicmllZiBBcHBsaWVzIGNvbG9yIG1hcHBpbmcgZm9yIG9uZSBvciBzZXZlcmFsIGNvbG9ycyBvbiBhIDEtLCA0LSBvciA4LWJpdAorIHBhbGxldGl6ZWQgb3IgYSAxNi0sIDI0LSBvciAzMi1iaXQgaGlnaCBjb2xvciBpbWFnZS4KKworIFRoaXMgZnVuY3Rpb24gbWFwcyB1cCB0byA8aT5jb3VudDwvaT4gY29sb3JzIHNwZWNpZmllZCBpbiA8aT5zcmNjb2xvcnM8L2k+IHRvCisgdGhlc2Ugc3BlY2lmaWVkIGluIDxpPmRzdGNvbG9yczwvaT4uIFRoZXJlYnksIGNvbG9yIDxpPnNyY2NvbG9yc1tOXTwvaT4sCisgaWYgZm91bmQgaW4gdGhlIGltYWdlLCB3aWxsIGJlIHJlcGxhY2VkIGJ5IGNvbG9yIDxpPmRzdGNvbG9yc1tOXTwvaT4uIElmCisgcGFyYW1ldGVyIDxpPnN3YXA8L2k+IGlzIFRSVUUsIGFkZGl0aW9uYWxseSBhbGwgY29sb3JzIHNwZWNpZmllZCBpbgorIDxpPmRzdGNvbG9yczwvaT4gYXJlIGFsc28gbWFwcGVkIHRvIHRoZXNlIHNwZWNpZmllZCBpbiA8aT5zcmNjb2xvcnM8L2k+LiBGb3IKKyBoaWdoIGNvbG9yIGltYWdlcywgdGhlIGFjdHVhbCBpbWFnZSBkYXRhIHdpbGwgYmUgbW9kaWZpZWQgd2hlcmVhcywgZm9yCisgcGFsbGV0aXplZCBpbWFnZXMgb25seSB0aGUgcGFsZXR0ZSB3aWxsIGJlIGNoYW5nZWQuPGJyPgorCisgVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIG51bWJlciBvZiBwaXhlbHMgY2hhbmdlZCBvciB6ZXJvLCBpZiBubyBwaXhlbHMgd2VyZQorIGNoYW5nZWQuIAorCisgQm90aCBhcnJheXMgPGk+c3JjY29sb3JzPC9pPiBhbmQgPGk+ZHN0Y29sb3JzPC9pPiBhcmUgYXNzdW1lZCBub3QgdG8gaG9sZCBsZXNzCisgdGhhbiA8aT5jb3VudDwvaT4gY29sb3JzLjxicj4KKworIEZvciAxNi1iaXQgaW1hZ2VzLCBhbGwgY29sb3JzIHNwZWNpZmllZCBhcmUgdHJhbnNwYXJlbnRseSBjb252ZXJ0ZWQgdG8gdGhlaXIgCisgcHJvcGVyIDE2LWJpdCByZXByZXNlbnRhdGlvbiAoZWl0aGVyIGluIFJHQjU1NSBvciBSR0I1NjUgZm9ybWF0LCB3aGljaCBpcworIGRldGVybWluZWQgYnkgdGhlIGltYWdlJ3MgcmVkLSBncmVlbi0gYW5kIGJsdWUtbWFzaykuPGJyPgorCisgPGI+Tm90ZSwgdGhhdCB0aGlzIGJlaGF2aW91ciBpcyBkaWZmZXJlbnQgZnJvbSB3aGF0IEZyZWVJbWFnZV9BcHBseVBhbGV0dGVJbmRleE1hcHBpbmcoKQorIGRvZXMsIHdoaWNoIG1vZGlmaWVzIHRoZSBhY3R1YWwgaW1hZ2UgZGF0YSBvbiBwYWxsZXRpemVkIGltYWdlcy48L2I+CisKKyBAcGFyYW0gZGliIElucHV0L291dHB1dCBpbWFnZSB0byBiZSBwcm9jZXNzZWQuCisgQHBhcmFtIHNyY2NvbG9ycyBBcnJheSBvZiBjb2xvcnMgdG8gYmUgdXNlZCBhcyB0aGUgbWFwcGluZyBzb3VyY2UuCisgQHBhcmFtIGRzdGNvbG9ycyBBcnJheSBvZiBjb2xvcnMgdG8gYmUgdXNlZCBhcyB0aGUgbWFwcGluZyBkZXN0aW5hdGlvbi4KKyBAcGFyYW0gY291bnQgVGhlIG51bWJlciBvZiBjb2xvcnMgdG8gYmUgbWFwcGVkLiBUaGlzIGlzIHRoZSBzaXplIG9mIGJvdGgKKyA8aT5zcmNjb2xvcnM8L2k+IGFuZCA8aT5kc3Rjb2xvcnM8L2k+LiAgCisgQHBhcmFtIGlnbm9yZV9hbHBoYSBJZiBUUlVFLCAzMi1iaXQgaW1hZ2VzIGFuZCBjb2xvcnMgYXJlIHRyZWF0ZWQgYXMgMjQtYml0LgorIEBwYXJhbSBzd2FwIElmIFRSVUUsIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gY29sb3JzIGFyZSBzd2FwcGVkLCB0aGF0IGlzLAorIGVhY2ggZGVzdGluYXRpb24gY29sb3IgaXMgYWxzbyBtYXBwZWQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvbG9yLiAgCisgQHJldHVybiBSZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YgcGl4ZWxzIGNoYW5nZWQuIAorICovCit1bnNpZ25lZCBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9BcHBseUNvbG9yTWFwcGluZyhGSUJJVE1BUCAqZGliLCBSR0JRVUFEICpzcmNjb2xvcnMsIFJHQlFVQUQgKmRzdGNvbG9ycywgdW5zaWduZWQgY291bnQsIEJPT0wgaWdub3JlX2FscGhhLCBCT09MIHN3YXApIHsKKwl1bnNpZ25lZCByZXN1bHQgPSAwOworCisJaWYgKCFGcmVlSW1hZ2VfSGFzUGl4ZWxzKGRpYikgfHwgKEZyZWVJbWFnZV9HZXRJbWFnZVR5cGUoZGliKSAhPSBGSVRfQklUTUFQKSkgeworCQlyZXR1cm4gMDsKKwl9CisKKwkvLyB2YWxpZGF0ZSBwYXJhbWV0ZXJzCisJaWYgKCghc3JjY29sb3JzKSB8fCAoIWRzdGNvbG9ycyl8fCAoY291bnQgPCAxKSkgeworCQlyZXR1cm4gMDsKKwl9CisKKwlpbnQgYnBwID0gRnJlZUltYWdlX0dldEJQUChkaWIpOworCXN3aXRjaCAoYnBwKSB7CisJCWNhc2UgMToKKwkJY2FzZSA0OgorCQljYXNlIDg6IHsKKwkJCXVuc2lnbmVkIHNpemUgPSBGcmVlSW1hZ2VfR2V0Q29sb3JzVXNlZChkaWIpOworCQkJUkdCUVVBRCAqcGFsID0gRnJlZUltYWdlX0dldFBhbGV0dGUoZGliKTsKKwkJCVJHQlFVQUQgKmEsICpiOworCQkJZm9yICh1bnNpZ25lZCB4ID0gMDsgeCA8IHNpemU7IHgrKykgeworCQkJCWZvciAodW5zaWduZWQgaiA9IDA7IGogPCBjb3VudDsgaisrKSB7CisJCQkJCWEgPSBzcmNjb2xvcnM7CisJCQkJCWIgPSBkc3Rjb2xvcnM7CisJCQkJCWZvciAoaW50IGkgPSAoc3dhcCA/IDAgOiAxKTsgaSA8IDI7IGkrKykgeworCQkJCQkJaWYgKChwYWxbeF0ucmdiQmx1ZSA9PSBhW2pdLnJnYkJsdWUpJiYocGFsW3hdLnJnYkdyZWVuID09IGFbal0ucmdiR3JlZW4pICYmKHBhbFt4XS5yZ2JSZWQ9PSBhW2pdLnJnYlJlZCkpIHsKKwkJCQkJCQlwYWxbeF0ucmdiQmx1ZSA9IGJbal0ucmdiQmx1ZTsKKwkJCQkJCQlwYWxbeF0ucmdiR3JlZW4gPSBiW2pdLnJnYkdyZWVuOworCQkJCQkJCXBhbFt4XS5yZ2JSZWQgPSBiW2pdLnJnYlJlZDsKKwkJCQkJCQlyZXN1bHQrKzsKKwkJCQkJCQlqID0gY291bnQ7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQlhID0gZHN0Y29sb3JzOworCQkJCQkJYiA9IHNyY2NvbG9yczsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKwkJY2FzZSAxNjogeworCQkJV09SRCAqc3JjMTYgPSAoV09SRCAqKW1hbGxvYyhzaXplb2YoV09SRCkgKiBjb3VudCk7CisJCQlpZiAoTlVMTCA9PSBzcmMxNikgeworCQkJCXJldHVybiAwOworCQkJfQorCisJCQlXT1JEICpkc3QxNiA9IChXT1JEICopbWFsbG9jKHNpemVvZihXT1JEKSAqIGNvdW50KTsKKwkJCWlmIChOVUxMID09IGRzdDE2KSB7CisJCQkJZnJlZShzcmMxNik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJCWZvciAodW5zaWduZWQgaiA9IDA7IGogPCBjb3VudDsgaisrKSB7CisJCQkJc3JjMTZbal0gPSBSR0JRVUFEX1RPX1dPUkQoZGliLCAoc3JjY29sb3JzICsgaikpOworCQkJCWRzdDE2W2pdID0gUkdCUVVBRF9UT19XT1JEKGRpYiwgKGRzdGNvbG9ycyArIGopKTsKKwkJCX0KKworCQkJdW5zaWduZWQgaGVpZ2h0ID0gRnJlZUltYWdlX0dldEhlaWdodChkaWIpOworCQkJdW5zaWduZWQgd2lkdGggPSBGcmVlSW1hZ2VfR2V0V2lkdGgoZGliKTsKKwkJCVdPUkQgKmEsICpiOworCQkJZm9yICh1bnNpZ25lZCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisJCQkJV09SRCAqYml0cyA9IChXT1JEICopRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgeSk7CisJCQkJZm9yICh1bnNpZ25lZCB4ID0gMDsgeCA8IHdpZHRoOyB4KyssIGJpdHMrKykgeworCQkJCQlmb3IgKHVuc2lnbmVkIGogPSAwOyBqIDwgY291bnQ7IGorKykgeworCQkJCQkJYSA9IHNyYzE2OworCQkJCQkJYiA9IGRzdDE2OworCQkJCQkJZm9yIChpbnQgaSA9IChzd2FwID8gMCA6IDEpOyBpIDwgMjsgaSsrKSB7CisJCQkJCQkJaWYgKCpiaXRzID09IGFbal0pIHsKKwkJCQkJCQkJKmJpdHMgPSBiW2pdOworCQkJCQkJCQlyZXN1bHQrKzsKKwkJCQkJCQkJaiA9IGNvdW50OworCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQkJYSA9IGRzdDE2OworCQkJCQkJCWIgPSBzcmMxNjsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWZyZWUoc3JjMTYpOworCQkJZnJlZShkc3QxNik7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJCWNhc2UgMjQ6IHsKKwkJCXVuc2lnbmVkIGhlaWdodCA9IEZyZWVJbWFnZV9HZXRIZWlnaHQoZGliKTsKKwkJCXVuc2lnbmVkIHdpZHRoID0gRnJlZUltYWdlX0dldFdpZHRoKGRpYik7CisJCQlSR0JRVUFEICphLCAqYjsKKwkJCWZvciAodW5zaWduZWQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworCQkJCUJZVEUgKmJpdHMgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCB5KTsKKwkJCQlmb3IgKHVuc2lnbmVkIHggPSAwOyB4IDwgd2lkdGg7IHgrKywgYml0cyArPSAzKSB7CisJCQkJCWZvciAodW5zaWduZWQgaiA9IDA7IGogPCBjb3VudDsgaisrKSB7CisJCQkJCQlhID0gc3JjY29sb3JzOworCQkJCQkJYiA9IGRzdGNvbG9yczsKKwkJCQkJCWZvciAoaW50IGkgPSAoc3dhcCA/IDAgOiAxKTsgaSA8IDI7IGkrKykgeworCQkJCQkJCWlmICgoYml0c1tGSV9SR0JBX0JMVUVdID09IGFbal0ucmdiQmx1ZSkgJiYgKGJpdHNbRklfUkdCQV9HUkVFTl0gPT0gYVtqXS5yZ2JHcmVlbikgJiYoYml0c1tGSV9SR0JBX1JFRF0gPT0gYVtqXS5yZ2JSZWQpKSB7CisJCQkJCQkJCWJpdHNbRklfUkdCQV9CTFVFXSA9IGJbal0ucmdiQmx1ZTsKKwkJCQkJCQkJYml0c1tGSV9SR0JBX0dSRUVOXSA9IGJbal0ucmdiR3JlZW47CisJCQkJCQkJCWJpdHNbRklfUkdCQV9SRURdID0gYltqXS5yZ2JSZWQ7CisJCQkJCQkJCXJlc3VsdCsrOworCQkJCQkJCQlqID0gY291bnQ7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCQlhID0gZHN0Y29sb3JzOworCQkJCQkJCWIgPSBzcmNjb2xvcnM7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJCWNhc2UgMzI6IHsKKwkJCXVuc2lnbmVkIGhlaWdodCA9IEZyZWVJbWFnZV9HZXRIZWlnaHQoZGliKTsKKwkJCXVuc2lnbmVkIHdpZHRoID0gRnJlZUltYWdlX0dldFdpZHRoKGRpYik7CisJCQlSR0JRVUFEICphLCAqYjsKKwkJCWZvciAodW5zaWduZWQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworCQkJCUJZVEUgKmJpdHMgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCB5KTsKKwkJCQlmb3IgKHVuc2lnbmVkIHggPSAwOyB4IDwgd2lkdGg7IHgrKywgYml0cyArPSA0KSB7CisJCQkJCWZvciAodW5zaWduZWQgaiA9IDA7IGogPCBjb3VudDsgaisrKSB7CisJCQkJCQlhID0gc3JjY29sb3JzOworCQkJCQkJYiA9IGRzdGNvbG9yczsKKwkJCQkJCWZvciAoaW50IGkgPSAoc3dhcCA/IDAgOiAxKTsgaSA8IDI7IGkrKykgeworCQkJCQkJCWlmICgoYml0c1tGSV9SR0JBX0JMVUVdID09IGFbal0ucmdiQmx1ZSkgJiYoYml0c1tGSV9SR0JBX0dSRUVOXSA9PSBhW2pdLnJnYkdyZWVuKSAmJihiaXRzW0ZJX1JHQkFfUkVEXSA9PSBhW2pdLnJnYlJlZCkKKwkJCQkJCQkJJiYoKGlnbm9yZV9hbHBoYSkgfHwgKGJpdHNbRklfUkdCQV9BTFBIQV0gPT0gYVtqXS5yZ2JSZXNlcnZlZCkpKSB7CisJCQkJCQkJCWJpdHNbRklfUkdCQV9CTFVFXSA9IGJbal0ucmdiQmx1ZTsKKwkJCQkJCQkJYml0c1tGSV9SR0JBX0dSRUVOXSA9IGJbal0ucmdiR3JlZW47CisJCQkJCQkJCWJpdHNbRklfUkdCQV9SRURdID0gYltqXS5yZ2JSZWQ7CisJCQkJCQkJCWlmICghaWdub3JlX2FscGhhKSB7CisJCQkJCQkJCQliaXRzW0ZJX1JHQkFfQUxQSEFdID0gYltqXS5yZ2JSZXNlcnZlZDsKKwkJCQkJCQkJfQorCQkJCQkJCQlyZXN1bHQrKzsKKwkJCQkJCQkJaiA9IGNvdW50OworCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQkJYSA9IGRzdGNvbG9yczsKKwkJCQkJCQliID0gc3JjY29sb3JzOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCQlkZWZhdWx0OiB7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KK30KKworLyoqIEBicmllZiBTd2FwcyB0d28gc3BlY2lmaWVkIGNvbG9ycyBvbiBhIDEtLCA0LSBvciA4LWJpdCBwYWxsZXRpemVkCisgb3IgYSAxNi0sIDI0LSBvciAzMi1iaXQgaGlnaCBjb2xvciBpbWFnZS4KKworIFRoaXMgZnVuY3Rpb24gc3dhcHMgdGhlIHR3byBzcGVjaWZpZWQgY29sb3JzIDxpPmNvbG9yX2E8L2k+IGFuZCA8aT5jb2xvcl9iPC9pPgorIG9uIGEgcGFsbGV0aXplZCBvciBoaWdoIGNvbG9yIGltYWdlLiBGb3IgaGlnaCBjb2xvciBpbWFnZXMsIHRoZSBhY3R1YWwgaW1hZ2UKKyBkYXRhIHdpbGwgYmUgbW9kaWZpZWQgd2hlcmVhcywgZm9yIHBhbGxldGl6ZWQgaW1hZ2VzIG9ubHkgdGhlIHBhbGV0dGUgd2lsbCBiZQorIGNoYW5nZWQuPGJyPgorCisgPGI+Tm90ZSwgdGhhdCB0aGlzIGJlaGF2aW91ciBpcyBkaWZmZXJlbnQgZnJvbSB3aGF0IEZyZWVJbWFnZV9Td2FwUGFsZXR0ZUluZGljZXMoKQorIGRvZXMsIHdoaWNoIG1vZGlmaWVzIHRoZSBhY3R1YWwgaW1hZ2UgZGF0YSBvbiBwYWxsZXRpemVkIGltYWdlcy48L2I+PGJyPgorCisgVGhpcyBpcyBqdXN0IGEgdGhpbiB3cmFwcGVyIGZvciBGcmVlSW1hZ2VfQXBwbHlDb2xvck1hcHBpbmcoKSBhbmQgcmVzb2x2ZXMgdG86PGJyPgorIDxpPnJldHVybiBGcmVlSW1hZ2VfQXBwbHlDb2xvck1hcHBpbmcoZGliLCBjb2xvcl9hLCBjb2xvcl9iLCAxLCBpZ25vcmVfYWxwaGEsIFRSVUUpOzwvaT4KKworIEBwYXJhbSBkaWIgSW5wdXQvb3V0cHV0IGltYWdlIHRvIGJlIHByb2Nlc3NlZC4KKyBAcGFyYW0gY29sb3JfYSBPbiBvZiB0aGUgdHdvIGNvbG9ycyB0byBiZSBzd2FwcGVkLgorIEBwYXJhbSBjb2xvcl9iIFRoZSBvdGhlciBvZiB0aGUgdHdvIGNvbG9ycyB0byBiZSBzd2FwcGVkLgorIEBwYXJhbSBpZ25vcmVfYWxwaGEgSWYgVFJVRSwgMzItYml0IGltYWdlcyBhbmQgY29sb3JzIGFyZSB0cmVhdGVkIGFzIDI0LWJpdC4gCisgQHJldHVybiBSZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YgcGl4ZWxzIGNoYW5nZWQuIAorICovCit1bnNpZ25lZCBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9Td2FwQ29sb3JzKEZJQklUTUFQICpkaWIsIFJHQlFVQUQgKmNvbG9yX2EsIFJHQlFVQUQgKmNvbG9yX2IsIEJPT0wgaWdub3JlX2FscGhhKSB7CisJcmV0dXJuIEZyZWVJbWFnZV9BcHBseUNvbG9yTWFwcGluZyhkaWIsIGNvbG9yX2EsIGNvbG9yX2IsIDEsIGlnbm9yZV9hbHBoYSwgVFJVRSk7Cit9CisKKy8qKiBAYnJpZWYgQXBwbGllcyBwYWxldHRlIGluZGV4IG1hcHBpbmcgZm9yIG9uZSBvciBzZXZlcmFsIGluZGljZXMgb24gYSAxLSwgNC0gCisgb3IgOC1iaXQgcGFsbGV0aXplZCBpbWFnZS4KKworIFRoaXMgZnVuY3Rpb24gbWFwcyB1cCB0byA8aT5jb3VudDwvaT4gcGFsZXR0ZSBpbmRpY2VzIHNwZWNpZmllZCBpbgorIDxpPnNyY2luZGljZXM8L2k+IHRvIHRoZXNlIHNwZWNpZmllZCBpbiA8aT5kc3RpbmRpY2VzPC9pPi4gVGhlcmVieSwgaW5kZXggCisgPGk+c3JjaW5kaWNlc1tOXTwvaT4sIGlmIHByZXNlbnQgaW4gdGhlIGltYWdlLCB3aWxsIGJlIHJlcGxhY2VkIGJ5IGluZGV4CisgPGk+ZHN0aW5kaWNlc1tOXTwvaT4uIElmIHBhcmFtZXRlciA8aT5zd2FwPC9pPiBpcyBUUlVFLCBhZGRpdGlvbmFsbHkgYWxsIGluZGljZXMKKyBzcGVjaWZpZWQgaW4gPGk+ZHN0aW5kaWNlczwvaT4gYXJlIGFsc28gbWFwcGVkIHRvIHRoZXNlIHNwZWNpZmllZCBpbiAKKyA8aT5zcmNpbmRpY2VzPC9pPi48YnI+CisKKyBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgbnVtYmVyIG9mIHBpeGVscyBjaGFuZ2VkIG9yIHplcm8sIGlmIG5vIHBpeGVscyB3ZXJlCisgY2hhbmdlZC4gCisKKyBCb3RoIGFycmF5cyA8aT5zcmNpbmRpY2VzPC9pPiBhbmQgPGk+ZHN0aW5kaWNlczwvaT4gYXJlIGFzc3VtZWQgbm90IHRvIGhvbGQgbGVzcworIHRoYW4gPGk+Y291bnQ8L2k+IGluZGljZXMuPGJyPgorCisgPGI+Tm90ZSwgdGhhdCB0aGlzIGJlaGF2aW91ciBpcyBkaWZmZXJlbnQgZnJvbSB3aGF0IEZyZWVJbWFnZV9BcHBseUNvbG9yTWFwcGluZygpCisgZG9lcywgd2hpY2ggbW9kaWZpZXMgdGhlIGFjdHVhbCBpbWFnZSBkYXRhIG9uIHBhbGxldGl6ZWQgaW1hZ2VzLjwvYj4KKworIEBwYXJhbSBkaWIgSW5wdXQvb3V0cHV0IGltYWdlIHRvIGJlIHByb2Nlc3NlZC4KKyBAcGFyYW0gc3JjaW5kaWNlcyBBcnJheSBvZiBwYWxldHRlIGluZGljZXMgdG8gYmUgdXNlZCBhcyB0aGUgbWFwcGluZyBzb3VyY2UuCisgQHBhcmFtIGRzdGluZGljZXMgQXJyYXkgb2YgcGFsZXR0ZSBpbmRpY2VzIHRvIGJlIHVzZWQgYXMgdGhlIG1hcHBpbmcgZGVzdGluYXRpb24uCisgQHBhcmFtIGNvdW50IFRoZSBudW1iZXIgb2YgcGFsZXR0ZSBpbmRpY2VzIHRvIGJlIG1hcHBlZC4gVGhpcyBpcyB0aGUgc2l6ZSBvZiBib3RoCisgPGk+c3JjaW5kaWNlczwvaT4gYW5kIDxpPmRzdGluZGljZXM8L2k+LiAgCisgQHBhcmFtIHN3YXAgSWYgVFJVRSwgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBwYWxldHRlIGluZGljZXMgYXJlIHN3YXBwZWQsIHRoYXQgaXMsCisgZWFjaCBkZXN0aW5hdGlvbiBpbmRleCBpcyBhbHNvIG1hcHBlZCB0byB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgaW5kZXguICAKKyBAcmV0dXJuIFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBwaXhlbHMgY2hhbmdlZC4gCisgKi8KK3Vuc2lnbmVkIERMTF9DQUxMQ09OVgorRnJlZUltYWdlX0FwcGx5UGFsZXR0ZUluZGV4TWFwcGluZyhGSUJJVE1BUCAqZGliLCBCWVRFICpzcmNpbmRpY2VzLAlCWVRFICpkc3RpbmRpY2VzLCB1bnNpZ25lZCBjb3VudCwgQk9PTCBzd2FwKSB7CisJdW5zaWduZWQgcmVzdWx0ID0gMDsKKworCWlmICghRnJlZUltYWdlX0hhc1BpeGVscyhkaWIpIHx8IChGcmVlSW1hZ2VfR2V0SW1hZ2VUeXBlKGRpYikgIT0gRklUX0JJVE1BUCkpIHsKKwkJcmV0dXJuIDA7CisJfQorCisJLy8gdmFsaWRhdGUgcGFyYW1ldGVycworCWlmICgoIXNyY2luZGljZXMpIHx8ICghZHN0aW5kaWNlcyl8fCAoY291bnQgPCAxKSkgeworCQlyZXR1cm4gMDsKKwl9CisKKwl1bnNpZ25lZCBoZWlnaHQgPSBGcmVlSW1hZ2VfR2V0SGVpZ2h0KGRpYik7CisJdW5zaWduZWQgd2lkdGggPSBGcmVlSW1hZ2VfR2V0TGluZShkaWIpOworCUJZVEUgKmEsICpiOworCisJaW50IGJwcCA9IEZyZWVJbWFnZV9HZXRCUFAoZGliKTsKKwlzd2l0Y2ggKGJwcCkgeworCQljYXNlIDE6IHsKKworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCQljYXNlIDQ6IHsKKwkJCWludCBza2lwX2xhc3QgPSAoRnJlZUltYWdlX0dldFdpZHRoKGRpYikgJiAweDAxKTsKKwkJCXVuc2lnbmVkIG1heF94ID0gd2lkdGggLSAxOworCQkJZm9yICh1bnNpZ25lZCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisJCQkJQllURSAqYml0cyA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIHkpOworCQkJCWZvciAodW5zaWduZWQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisJCQkJCWludCBzdGFydCA9ICgoc2tpcF9sYXN0KSAmJiAoeCA9PSBtYXhfeCkpID8gMSA6IDA7CisJCQkJCWZvciAoaW50IGNuID0gc3RhcnQ7IGNuIDwgMjsgY24rKykgeworCQkJCQkJZm9yICh1bnNpZ25lZCBqID0gMDsgaiA8IGNvdW50OyBqKyspIHsKKwkJCQkJCQlhID0gc3JjaW5kaWNlczsKKwkJCQkJCQliID0gZHN0aW5kaWNlczsKKwkJCQkJCQlmb3IgKGludCBpID0gKChzd2FwKSA/IDAgOiAxKTsgaSA8IDI7IGkrKykgeworCQkJCQkJCQlpZiAoR0VUX05JQkJMRShjbiwgYml0c1t4XSkgPT0gKGFbal0gJiAweDBGKSkgeworCQkJCQkJCQkJU0VUX05JQkJMRShjbiwgYml0c1t4XSwgYltqXSk7CisJCQkJCQkJCQlyZXN1bHQrKzsKKwkJCQkJCQkJCWogPSBjb3VudDsKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQl9CisJCQkJCQkJCWEgPSBkc3RpbmRpY2VzOworCQkJCQkJCQliID0gc3JjaW5kaWNlczsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJCWNhc2UgODogeworCQkJZm9yICh1bnNpZ25lZCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisJCQkJQllURSAqYml0cyA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIHkpOworCQkJCWZvciAodW5zaWduZWQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisJCQkJCWZvciAodW5zaWduZWQgaiA9IDA7IGogPCBjb3VudDsgaisrKSB7CisJCQkJCQlhID0gc3JjaW5kaWNlczsKKwkJCQkJCWIgPSBkc3RpbmRpY2VzOworCQkJCQkJZm9yIChpbnQgaSA9ICgoc3dhcCkgPyAwIDogMSk7IGkgPCAyOyBpKyspIHsKKwkJCQkJCQlpZiAoYml0c1t4XSA9PSBhW2pdKSB7CisJCQkJCQkJCWJpdHNbeF0gPSBiW2pdOworCQkJCQkJCQlyZXN1bHQrKzsKKwkJCQkJCQkJaiA9IGNvdW50OworCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQkJYSA9IGRzdGluZGljZXM7CisJCQkJCQkJYiA9IHNyY2luZGljZXM7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJCWRlZmF1bHQ6IHsKKwkJCXJldHVybiAwOworCQl9CisJfQorfQorCisvKiogQGJyaWVmIFN3YXBzIHR3byBzcGVjaWZpZWQgcGFsZXR0ZSBpbmRpY2VzIG9uIGEgMS0sIDQtIG9yIDgtYml0IHBhbGxldGl6ZWQKKyBpbWFnZS4KKworIFRoaXMgZnVuY3Rpb24gc3dhcHMgdGhlIHR3byBzcGVjaWZpZWQgcGFsZXR0ZSBpbmRpY2VzIDxpPmluZGV4X2E8L2k+IGFuZAorIDxpPmluZGV4X2I8L2k+IG9uIGEgcGFsbGV0aXplZCBpbWFnZS4gVGhlcmVmb3JlLCBub3QgdGhlIHBhbGV0dGUsIGJ1dCB0aGUKKyBhY3R1YWwgaW1hZ2UgZGF0YSB3aWxsIGJlIG1vZGlmaWVkLjxicj4KKworIDxiPk5vdGUsIHRoYXQgdGhpcyBiZWhhdmlvdXIgaXMgZGlmZmVyZW50IGZyb20gd2hhdCBGcmVlSW1hZ2VfU3dhcENvbG9ycygpIGRvZXMKKyBvbiBwYWxsZXRpemVkIGltYWdlcywgd2hpY2ggb25seSBzd2FwcyB0aGUgY29sb3JzIGluIHRoZSBwYWxldHRlLjwvYj48YnI+CisKKyBUaGlzIGlzIGp1c3QgYSB0aGluIHdyYXBwZXIgZm9yIEZyZWVJbWFnZV9BcHBseUNvbG9yTWFwcGluZygpIGFuZCByZXNvbHZlcyB0bzo8YnI+CisgPGk+cmV0dXJuIEZyZWVJbWFnZV9BcHBseVBhbGV0dGVJbmRleE1hcHBpbmcoZGliLCBpbmRleF9hLCBpbmRleF9iLCAxLCBUUlVFKTs8L2k+CisKKyBAcGFyYW0gZGliIElucHV0L291dHB1dCBpbWFnZSB0byBiZSBwcm9jZXNzZWQuCisgQHBhcmFtIGluZGV4X2EgT24gb2YgdGhlIHR3byBwYWxldHRlIGluZGljZXMgdG8gYmUgc3dhcHBlZC4KKyBAcGFyYW0gaW5kZXhfYiBUaGUgb3RoZXIgb2YgdGhlIHR3byBwYWxldHRlIGluZGljZXMgdG8gYmUgc3dhcHBlZC4KKyBAcmV0dXJuIFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBwaXhlbHMgY2hhbmdlZC4gCisgKi8KK3Vuc2lnbmVkIERMTF9DQUxMQ09OViAKK0ZyZWVJbWFnZV9Td2FwUGFsZXR0ZUluZGljZXMoRklCSVRNQVAgKmRpYiwgQllURSAqaW5kZXhfYSwgQllURSAqaW5kZXhfYikgeworCXJldHVybiBGcmVlSW1hZ2VfQXBwbHlQYWxldHRlSW5kZXhNYXBwaW5nKGRpYiwgaW5kZXhfYSwgaW5kZXhfYiwgMSwgVFJVRSk7Cit9CisKZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2VUb29sa2l0L0NvcHlQYXN0ZS5jcHAgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlVG9vbGtpdC9Db3B5UGFzdGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNWE1ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlVG9vbGtpdC9Db3B5UGFzdGUuY3BwCkBAIC0wLDAgKzEsODYxIEBACisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBDb3B5IC8gcGFzdGUgcm91dGluZXMKKy8vCisvLyAtIEZsb3JpcyB2YW4gZGVuIEJlcmcgKGZsdmRiZXJnQHd4cy5ubCkKKy8vIC0gQWxleGFuZGVyIER5bWVyZXRzIChzYXNoYWRAdGUubmV0LnVhKQorLy8gLSBIZXJ26SBEcm9sb24gKGRyb2xvbkBpbmZvbmllLmZyKQorLy8gLSBNYW5mcmVkIFRhdXNjaCAobWFuZnJlZC50YXVzY2hAdC1vbmxpbmUuZGUpCisvLyAtIFJpbGV5IE1jTmlmZiAocm1jbmlmZkBtYXJleGdyb3VwLmNvbSkKKy8vIC0gQ2Fyc3RlbiBLbGVpbiAoY2tsZWluMDVAdXNlcnMuc291cmNlZm9yZ2UubmV0KQorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZyZWVJbWFnZSAzCisvLworLy8gQ09WRVJFRCBDT0RFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZCisvLyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUworLy8gVEhBVCBUSEUgQ09WRVJFRCBDT0RFIElTIEZSRUUgT0YgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisvLyBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRAorLy8gQ09ERSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVAorLy8gVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GIEFOWSBORUNFU1NBUlkKKy8vIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwKKy8vIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIKKy8vIFRISVMgRElTQ0xBSU1FUi4KKy8vCisvLyBVc2UgYXQgeW91ciBvd24gcmlzayEKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2luY2x1ZGUgIkZyZWVJbWFnZS5oIgorI2luY2x1ZGUgIlV0aWxpdGllcy5oIgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgIEhlbHBlcnMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQWxwaGEgYmxlbmRpbmcgLyBjb21iaW5lIGZ1bmN0aW9ucworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLy8gMS1iaXQKK3N0YXRpYyBCT09MIENvbWJpbmUxKEZJQklUTUFQICpkc3RfZGliLCBGSUJJVE1BUCAqc3JjX2RpYiwgdW5zaWduZWQgeCwgdW5zaWduZWQgeSwgdW5zaWduZWQgYWxwaGEpOworLy8vIDQtYml0CitzdGF0aWMgQk9PTCBDb21iaW5lNChGSUJJVE1BUCAqZHN0X2RpYiwgRklCSVRNQVAgKnNyY19kaWIsIHVuc2lnbmVkIHgsIHVuc2lnbmVkIHksIHVuc2lnbmVkIGFscGhhKTsKKy8vLyA4LWJpdAorc3RhdGljIEJPT0wgQ29tYmluZTgoRklCSVRNQVAgKmRzdF9kaWIsIEZJQklUTUFQICpzcmNfZGliLCB1bnNpZ25lZCB4LCB1bnNpZ25lZCB5LCB1bnNpZ25lZCBhbHBoYSk7CisvLy8gMTYtYml0IDU1NQorc3RhdGljIEJPT0wgQ29tYmluZTE2XzU1NShGSUJJVE1BUCAqZHN0X2RpYiwgRklCSVRNQVAgKnNyY19kaWIsIHVuc2lnbmVkIHgsIHVuc2lnbmVkIHksIHVuc2lnbmVkIGFscGhhKTsKKy8vLyAxNi1iaXQgNTY1CitzdGF0aWMgQk9PTCBDb21iaW5lMTZfNTY1KEZJQklUTUFQICpkc3RfZGliLCBGSUJJVE1BUCAqc3JjX2RpYiwgdW5zaWduZWQgeCwgdW5zaWduZWQgeSwgdW5zaWduZWQgYWxwaGEpOworLy8vIDI0LWJpdAorc3RhdGljIEJPT0wgQ29tYmluZTI0KEZJQklUTUFQICpkc3RfZGliLCBGSUJJVE1BUCAqc3JjX2RpYiwgdW5zaWduZWQgeCwgdW5zaWduZWQgeSwgdW5zaWduZWQgYWxwaGEpOworLy8vIDMyLSBiaXQKK3N0YXRpYyBCT09MIENvbWJpbmUzMihGSUJJVE1BUCAqZHN0X2RpYiwgRklCSVRNQVAgKnNyY19kaWIsIHVuc2lnbmVkIHgsIHVuc2lnbmVkIHksIHVuc2lnbmVkIGFscGhhKTsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICAxLWJpdAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgQk9PTCAKK0NvbWJpbmUxKEZJQklUTUFQICpkc3RfZGliLCBGSUJJVE1BUCAqc3JjX2RpYiwgdW5zaWduZWQgeCwgdW5zaWduZWQgeSwgdW5zaWduZWQgYWxwaGEpIHsKKwlCT09MIHZhbHVlOworCisJLy8gY2hlY2sgdGhlIGJpdCBkZXB0aCBvZiBzcmMgYW5kIGRzdCBpbWFnZXMKKwlpZigoRnJlZUltYWdlX0dldEJQUChkc3RfZGliKSAhPSAxKSB8fCAoRnJlZUltYWdlX0dldEJQUChzcmNfZGliKSAhPSAxKSkgeworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJLy8gY2hlY2sgdGhlIHNpemUgb2Ygc3JjIGltYWdlCisJaWYoKHggKyBGcmVlSW1hZ2VfR2V0V2lkdGgoc3JjX2RpYikgPiBGcmVlSW1hZ2VfR2V0V2lkdGgoZHN0X2RpYikpIHx8ICh5ICsgRnJlZUltYWdlX0dldEhlaWdodChzcmNfZGliKSA+IEZyZWVJbWFnZV9HZXRIZWlnaHQoZHN0X2RpYikpKSB7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlCWVRFICpkc3RfYml0cyA9IEZyZWVJbWFnZV9HZXRCaXRzKGRzdF9kaWIpICsgKChGcmVlSW1hZ2VfR2V0SGVpZ2h0KGRzdF9kaWIpIC0gRnJlZUltYWdlX0dldEhlaWdodChzcmNfZGliKSAtIHkpICogRnJlZUltYWdlX0dldFBpdGNoKGRzdF9kaWIpKTsKKwlCWVRFICpzcmNfYml0cyA9IEZyZWVJbWFnZV9HZXRCaXRzKHNyY19kaWIpOwkKKworCS8vIGNvbWJpbmUgaW1hZ2VzCisJZm9yKHVuc2lnbmVkIHJvd3MgPSAwOyByb3dzIDwgRnJlZUltYWdlX0dldEhlaWdodChzcmNfZGliKTsgcm93cysrKSB7CisJCWZvcih1bnNpZ25lZCBjb2xzID0gMDsgY29scyA8IEZyZWVJbWFnZV9HZXRXaWR0aChzcmNfZGliKTsgY29scysrKSB7CisJCQkvLyBnZXQgYml0IGF0IChyb3dzLCBjb2xzKSBpbiBzcmMgaW1hZ2UKKwkJCXZhbHVlID0gKHNyY19iaXRzW2NvbHMgPj4gM10gJiAoMHg4MCA+PiAoY29scyAmIDB4MDcpKSkgIT0gMDsKKwkJCS8vIHNldCBiaXQgYXQgKHJvd3MsIHgrY29scykgaW4gZHN0IGltYWdlCQorCQkJdmFsdWUgPyBkc3RfYml0c1soeCArIGNvbHMpID4+IDNdIHw9ICgweDgwID4+ICgoeCArIGNvbHMpICYgMHg3KSkgOiBkc3RfYml0c1soeCArIGNvbHMpID4+IDNdICY9ICgweEZGN0YgPj4gKCh4ICsgY29scykgJiAweDcpKTsKKwkJfQorCisJCWRzdF9iaXRzICs9IEZyZWVJbWFnZV9HZXRQaXRjaChkc3RfZGliKTsKKwkJc3JjX2JpdHMgKz0gRnJlZUltYWdlX0dldFBpdGNoKHNyY19kaWIpOworCX0KKworCXJldHVybiBUUlVFOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgIDQtYml0CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBCT09MIAorQ29tYmluZTQoRklCSVRNQVAgKmRzdF9kaWIsIEZJQklUTUFQICpzcmNfZGliLCB1bnNpZ25lZCB4LCB1bnNpZ25lZCB5LCB1bnNpZ25lZCBhbHBoYSkgeworCWludCBzd2FwVGFibGVbMTZdOworCUJPT0wgYk9kZFN0YXJ0LCBiT2RkRW5kOworCisJLy8gY2hlY2sgdGhlIGJpdCBkZXB0aCBvZiBzcmMgYW5kIGRzdCBpbWFnZXMKKwlpZigoRnJlZUltYWdlX0dldEJQUChkc3RfZGliKSAhPSA0KSB8fCAoRnJlZUltYWdlX0dldEJQUChzcmNfZGliKSAhPSA0KSkgeworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJLy8gY2hlY2sgdGhlIHNpemUgb2Ygc3JjIGltYWdlCisJaWYoKHggKyBGcmVlSW1hZ2VfR2V0V2lkdGgoc3JjX2RpYikgPiBGcmVlSW1hZ2VfR2V0V2lkdGgoZHN0X2RpYikpIHx8ICh5ICsgRnJlZUltYWdlX0dldEhlaWdodChzcmNfZGliKSA+IEZyZWVJbWFnZV9HZXRIZWlnaHQoZHN0X2RpYikpKSB7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwkvLyBnZXQgc3JjIGFuZCBkc3QgcGFsZXR0ZXMKKwlSR0JRVUFEICpzcmNfcGFsID0gRnJlZUltYWdlX0dldFBhbGV0dGUoc3JjX2RpYik7CisJUkdCUVVBRCAqZHN0X3BhbCA9IEZyZWVJbWFnZV9HZXRQYWxldHRlKGRzdF9kaWIpOworCWlmIChzcmNfcGFsID09IE5VTEwgfHwgZHN0X3BhbCA9PSBOVUxMKSB7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwkvLyBidWlsZCBhIHN3YXAgdGFibGUgZm9yIHRoZSBjbG9zZXN0IGNvbG9yIG1hdGNoIGZyb20gdGhlIHNvdXJjZSBwYWxldHRlIHRvIHRoZSBkZXN0aW5hdGlvbiBwYWxldHRlCisKKwlmb3IgKGludCBpID0gMDsgaSA8IDE2OyBpKyspCXsKKwkJV09SRCBtaW5fZGlmZiA9IChXT1JEKS0xOworCisJCWZvciAoaW50IGogPSAwOyBqIDwgMTY7IGorKykJeworCQkJLy8gY2FsY3VsYXRlcyB0aGUgY29sb3IgZGlmZmVyZW5jZSB1c2luZyBhIE1hbmhhdHRhbiBkaXN0YW5jZQorCQkJV09SRCBhYnNfZGlmZiA9IChXT1JEKSgKKwkJCQlhYnMoc3JjX3BhbFtpXS5yZ2JCbHVlIC0gZHN0X3BhbFtqXS5yZ2JCbHVlKQorCQkJCSsgYWJzKHNyY19wYWxbaV0ucmdiR3JlZW4gLSBkc3RfcGFsW2pdLnJnYkdyZWVuKQorCQkJCSsgYWJzKHNyY19wYWxbaV0ucmdiUmVkIC0gZHN0X3BhbFtqXS5yZ2JSZWQpCisJCQkJKTsKKworCQkJaWYgKGFic19kaWZmIDwgbWluX2RpZmYpCXsKKwkJCQlzd2FwVGFibGVbaV0gPSBqOworCQkJCW1pbl9kaWZmID0gYWJzX2RpZmY7CisJCQkJaWYgKGFic19kaWZmID09IDApIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJQllURSAqZHN0X2JpdHMgPSBGcmVlSW1hZ2VfR2V0Qml0cyhkc3RfZGliKSArICgoRnJlZUltYWdlX0dldEhlaWdodChkc3RfZGliKSAtIEZyZWVJbWFnZV9HZXRIZWlnaHQoc3JjX2RpYikgLSB5KSAqCUZyZWVJbWFnZV9HZXRQaXRjaChkc3RfZGliKSkgKyAoeCA+PiAxKTsKKwlCWVRFICpzcmNfYml0cyA9IEZyZWVJbWFnZV9HZXRCaXRzKHNyY19kaWIpOyAgICAKKworCS8vIGNvbWJpbmUgaW1hZ2VzCisKKwkvLyBhbGxvY2F0ZSBzcGFjZSBmb3Igb3VyIHRlbXBvcmFyeSByb3cKKwl1bnNpZ25lZCBzcmNfbGluZSAgID0gRnJlZUltYWdlX0dldExpbmUoc3JjX2RpYik7CisJdW5zaWduZWQgc3JjX3dpZHRoICA9IEZyZWVJbWFnZV9HZXRXaWR0aChzcmNfZGliKTsKKwl1bnNpZ25lZCBzcmNfaGVpZ2h0ID0gRnJlZUltYWdlX0dldEhlaWdodChzcmNfZGliKTsKKworCUJZVEUgKmJ1ZmZlciA9IChCWVRFICopbWFsbG9jKHNyY19saW5lICogc2l6ZW9mKEJZVEUpKTsKKwlpZiAoYnVmZmVyID09IE5VTEwpIHsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWJPZGRTdGFydCA9ICh4ICYgMHgwMSkgPyBUUlVFIDogRkFMU0U7CisKKwlpZiAoKGJPZGRTdGFydCAmJiAhKHNyY193aWR0aCAmIDB4MDEpKSB8fCAoIWJPZGRTdGFydCAmJiAoc3JjX3dpZHRoICYgMHgwMSkpKQl7CisJCWJPZGRFbmQgPSBUUlVFOworCX0KKwllbHNlIHsKKwkJYk9kZEVuZCA9IEZBTFNFOworCX0KKworCWZvcih1bnNpZ25lZCByb3dzID0gMDsgcm93cyA8IHNyY19oZWlnaHQ7IHJvd3MrKykgeworCQltZW1jcHkoYnVmZmVyLCBzcmNfYml0cywgc3JjX2xpbmUpOworCQkKKwkJLy8gY2hhbmdlIHRoZSB2YWx1ZXMgaW4gdGhlIHRlbXAgcm93IHRvIGJlIHRob3NlIGZyb20gdGhlIHN3YXAgdGFibGUKKwkJCisJCWZvciAodW5zaWduZWQgY29scyA9IDA7IGNvbHMgPCBzcmNfbGluZTsgY29scysrKSB7CisJCQlidWZmZXJbY29sc10gPSAoQllURSkoKHN3YXBUYWJsZVtISU5JQkJMRShidWZmZXJbY29sc10pID4+IDRdIDw8IDQpICsgc3dhcFRhYmxlW0xPV05JQkJMRShidWZmZXJbY29sc10pXSk7CisJCX0KKworCQlpZiAoYk9kZFN0YXJ0KSB7CQorCQkJYnVmZmVyWzBdID0gSElOSUJCTEUoZHN0X2JpdHNbMF0pICsgTE9XTklCQkxFKGJ1ZmZlclswXSk7CisJCX0KKwkJCisJCWlmIChiT2RkRW5kKQl7CisJCQlidWZmZXJbc3JjX2xpbmUgLSAxXSA9IEhJTklCQkxFKGJ1ZmZlcltzcmNfbGluZSAtIDFdKSArIExPV05JQkJMRShkc3RfYml0c1tzcmNfbGluZSAtIDFdKTsKKwkJfQorCisJCW1lbWNweShkc3RfYml0cywgYnVmZmVyLCBzcmNfbGluZSk7CisJCQorCQlkc3RfYml0cyArPSBGcmVlSW1hZ2VfR2V0UGl0Y2goZHN0X2RpYik7CisJCXNyY19iaXRzICs9IEZyZWVJbWFnZV9HZXRQaXRjaChzcmNfZGliKTsKKwl9CisKKwlmcmVlKGJ1ZmZlcik7CisKKwlyZXR1cm4gVFJVRTsKKworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgIDgtYml0CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBCT09MIAorQ29tYmluZTgoRklCSVRNQVAgKmRzdF9kaWIsIEZJQklUTUFQICpzcmNfZGliLCB1bnNpZ25lZCB4LCB1bnNpZ25lZCB5LCB1bnNpZ25lZCBhbHBoYSkgeworCS8vIGNoZWNrIHRoZSBiaXQgZGVwdGggb2Ygc3JjIGFuZCBkc3QgaW1hZ2VzCisJaWYoKEZyZWVJbWFnZV9HZXRCUFAoZHN0X2RpYikgIT0gOCkgfHwgKEZyZWVJbWFnZV9HZXRCUFAoc3JjX2RpYikgIT0gOCkpIHsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCS8vIGNoZWNrIHRoZSBzaXplIG9mIHNyYyBpbWFnZQorCWlmKCh4ICsgRnJlZUltYWdlX0dldFdpZHRoKHNyY19kaWIpID4gRnJlZUltYWdlX0dldFdpZHRoKGRzdF9kaWIpKSB8fCAoeSArIEZyZWVJbWFnZV9HZXRIZWlnaHQoc3JjX2RpYikgPiBGcmVlSW1hZ2VfR2V0SGVpZ2h0KGRzdF9kaWIpKSkgeworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJQllURSAqZHN0X2JpdHMgPSBGcmVlSW1hZ2VfR2V0Qml0cyhkc3RfZGliKSArICgoRnJlZUltYWdlX0dldEhlaWdodChkc3RfZGliKSAtIEZyZWVJbWFnZV9HZXRIZWlnaHQoc3JjX2RpYikgLSB5KSAqIEZyZWVJbWFnZV9HZXRQaXRjaChkc3RfZGliKSkgKyAoeCk7CisJQllURSAqc3JjX2JpdHMgPSBGcmVlSW1hZ2VfR2V0Qml0cyhzcmNfZGliKTsJCisKKwlpZihhbHBoYSA+IDI1NSkgeworCQkvLyBjb21iaW5lIGltYWdlcworCQlmb3IodW5zaWduZWQgcm93cyA9IDA7IHJvd3MgPCBGcmVlSW1hZ2VfR2V0SGVpZ2h0KHNyY19kaWIpOyByb3dzKyspIHsKKwkJCW1lbWNweShkc3RfYml0cywgc3JjX2JpdHMsIEZyZWVJbWFnZV9HZXRMaW5lKHNyY19kaWIpKTsKKworCQkJZHN0X2JpdHMgKz0gRnJlZUltYWdlX0dldFBpdGNoKGRzdF9kaWIpOworCQkJc3JjX2JpdHMgKz0gRnJlZUltYWdlX0dldFBpdGNoKHNyY19kaWIpOworCQl9CisJfSBlbHNlIHsKKwkJLy8gYWxwaGEgYmxlbmQgaW1hZ2VzCisJCWZvcih1bnNpZ25lZCByb3dzID0gMDsgcm93cyA8IEZyZWVJbWFnZV9HZXRIZWlnaHQoc3JjX2RpYik7IHJvd3MrKykgeworCQkJZm9yICh1bnNpZ25lZCBjb2xzID0gMDsgY29scyA8IEZyZWVJbWFnZV9HZXRMaW5lKHNyY19kaWIpOyBjb2xzKyspIHsJCQkJCQkJCisJCQkJZHN0X2JpdHNbY29sc10gPSAoQllURSkoKChzcmNfYml0c1tjb2xzXSAtIGRzdF9iaXRzW2NvbHNdKSAqIGFscGhhICsgKGRzdF9iaXRzW2NvbHNdIDw8IDgpKSA+PiA4KTsKKwkJCX0KKworCQkJZHN0X2JpdHMgKz0gRnJlZUltYWdlX0dldFBpdGNoKGRzdF9kaWIpOworCQkJc3JjX2JpdHMgKz0gRnJlZUltYWdlX0dldFBpdGNoKHNyY19kaWIpOworCQl9CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgMTYtYml0CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBCT09MIAorQ29tYmluZTE2XzU1NShGSUJJVE1BUCAqZHN0X2RpYiwgRklCSVRNQVAgKnNyY19kaWIsIHVuc2lnbmVkIHgsIHVuc2lnbmVkIHksIHVuc2lnbmVkIGFscGhhKSB7CisJLy8gY2hlY2sgdGhlIGJpdCBkZXB0aCBvZiBzcmMgYW5kIGRzdCBpbWFnZXMKKwlpZigoRnJlZUltYWdlX0dldEJQUChkc3RfZGliKSAhPSAxNikgfHwgKEZyZWVJbWFnZV9HZXRCUFAoc3JjX2RpYikgIT0gMTYpKSB7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwkvLyBjaGVjayB0aGUgc2l6ZSBvZiBzcmMgaW1hZ2UKKwlpZigoeCArIEZyZWVJbWFnZV9HZXRXaWR0aChzcmNfZGliKSA+IEZyZWVJbWFnZV9HZXRXaWR0aChkc3RfZGliKSkgfHwgKHkgKyBGcmVlSW1hZ2VfR2V0SGVpZ2h0KHNyY19kaWIpID4gRnJlZUltYWdlX0dldEhlaWdodChkc3RfZGliKSkpIHsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCUJZVEUgKmRzdF9iaXRzID0gRnJlZUltYWdlX0dldEJpdHMoZHN0X2RpYikgKyAoKEZyZWVJbWFnZV9HZXRIZWlnaHQoZHN0X2RpYikgLSBGcmVlSW1hZ2VfR2V0SGVpZ2h0KHNyY19kaWIpIC0geSkgKiBGcmVlSW1hZ2VfR2V0UGl0Y2goZHN0X2RpYikpICsgKHggKiAyKTsKKwlCWVRFICpzcmNfYml0cyA9IEZyZWVJbWFnZV9HZXRCaXRzKHNyY19kaWIpOwkKKworCWlmIChhbHBoYSA+IDI1NSkgeworCQlmb3IodW5zaWduZWQgcm93cyA9IDA7IHJvd3MgPCBGcmVlSW1hZ2VfR2V0SGVpZ2h0KHNyY19kaWIpOyByb3dzKyspIHsKKwkJCW1lbWNweShkc3RfYml0cywgc3JjX2JpdHMsIEZyZWVJbWFnZV9HZXRMaW5lKHNyY19kaWIpKTsKKworCQkJZHN0X2JpdHMgKz0gRnJlZUltYWdlX0dldFBpdGNoKGRzdF9kaWIpOworCQkJc3JjX2JpdHMgKz0gRnJlZUltYWdlX0dldFBpdGNoKHNyY19kaWIpOworCQl9CisJfSBlbHNlIHsKKwkJZm9yKHVuc2lnbmVkIHJvd3MgPSAwOyByb3dzIDwgRnJlZUltYWdlX0dldEhlaWdodChzcmNfZGliKTsgcm93cysrKSB7CisJCQlmb3IodW5zaWduZWQgY29scyA9IDA7IGNvbHMgPCBGcmVlSW1hZ2VfR2V0TGluZShzcmNfZGliKTsgY29scyArPSAyKSB7CisJCQkJUkdCVFJJUExFIGNvbG9yX3M7CisJCQkJUkdCVFJJUExFIGNvbG9yX3Q7CisJCQkJCisJCQkJV09SRCAqdG1wMSA9IChXT1JEICopJmRzdF9iaXRzW2NvbHNdOworCQkJCVdPUkQgKnRtcDIgPSAoV09SRCAqKSZzcmNfYml0c1tjb2xzXTsKKworCQkJCS8vIGNvbnZlcnQgMTYtYml0IGNvbG9ycyB0byAyNC1iaXQKKworCQkJCWNvbG9yX3MucmdidFJlZCA9IChCWVRFKSgoKCp0bXAxICYgRkkxNl81NTVfUkVEX01BU0spID4+IEZJMTZfNTU1X1JFRF9TSElGVCkgPDwgMyk7CisJCQkJY29sb3Jfcy5yZ2J0R3JlZW4gPSAoQllURSkoKCgqdG1wMSAmIEZJMTZfNTU1X0dSRUVOX01BU0spID4+IEZJMTZfNTU1X0dSRUVOX1NISUZUKSA8PCAzKTsKKwkJCQljb2xvcl9zLnJnYnRCbHVlID0gKEJZVEUpKCgoKnRtcDEgJiBGSTE2XzU1NV9CTFVFX01BU0spID4+IEZJMTZfNTU1X0JMVUVfU0hJRlQpIDw8IDMpOworCisJCQkJY29sb3JfdC5yZ2J0UmVkID0gKEJZVEUpKCgoKnRtcDIgJiBGSTE2XzU1NV9SRURfTUFTSykgPj4gRkkxNl81NTVfUkVEX1NISUZUKSA8PCAzKTsKKwkJCQljb2xvcl90LnJnYnRHcmVlbiA9IChCWVRFKSgoKCp0bXAyICYgRkkxNl81NTVfR1JFRU5fTUFTSykgPj4gRkkxNl81NTVfR1JFRU5fU0hJRlQpIDw8IDMpOworCQkJCWNvbG9yX3QucmdidEJsdWUgPSAoQllURSkoKCgqdG1wMiAmIEZJMTZfNTU1X0JMVUVfTUFTSykgPj4gRkkxNl81NTVfQkxVRV9TSElGVCkgPDwgMyk7CisKKwkJCQkvLyBhbHBoYSBibGVuZAorCisJCQkJY29sb3Jfcy5yZ2J0UmVkID0gKEJZVEUpKCgoY29sb3JfdC5yZ2J0UmVkIC0gY29sb3Jfcy5yZ2J0UmVkKSAqIGFscGhhICsgKGNvbG9yX3MucmdidFJlZCA8PCA4KSkgPj4gOCk7CisJCQkJY29sb3Jfcy5yZ2J0R3JlZW4gPSAoQllURSkoKChjb2xvcl90LnJnYnRHcmVlbiAtIGNvbG9yX3MucmdidEdyZWVuKSAqIGFscGhhICsgKGNvbG9yX3MucmdidEdyZWVuIDw8IDgpKSA+PiA4KTsKKwkJCQljb2xvcl9zLnJnYnRCbHVlID0gKEJZVEUpKCgoY29sb3JfdC5yZ2J0Qmx1ZSAtIGNvbG9yX3MucmdidEJsdWUpICogYWxwaGEgKyAoY29sb3Jfcy5yZ2J0Qmx1ZSA8PCA4KSkgPj4gOCk7CisKKwkJCQkvLyBjb252ZXJ0IDI0LWJpdCBjb2xvciBiYWNrIHRvIDE2LWJpdAorCisJCQkJKnRtcDEgPSBSR0I1NTUoY29sb3Jfcy5yZ2J0UmVkLCBjb2xvcl9zLnJnYnRHcmVlbiwgY29sb3Jfcy5yZ2J0Qmx1ZSk7CisJCQl9CisKKwkJCWRzdF9iaXRzICs9IEZyZWVJbWFnZV9HZXRQaXRjaChkc3RfZGliKTsKKwkJCXNyY19iaXRzICs9IEZyZWVJbWFnZV9HZXRQaXRjaChzcmNfZGliKTsKKwkJfQorCX0KKworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgQk9PTCAKK0NvbWJpbmUxNl81NjUoRklCSVRNQVAgKmRzdF9kaWIsIEZJQklUTUFQICpzcmNfZGliLCB1bnNpZ25lZCB4LCB1bnNpZ25lZCB5LCB1bnNpZ25lZCBhbHBoYSkgeworCS8vIGNoZWNrIHRoZSBiaXQgZGVwdGggb2Ygc3JjIGFuZCBkc3QgaW1hZ2VzCisJaWYoKEZyZWVJbWFnZV9HZXRCUFAoZHN0X2RpYikgIT0gMTYpIHx8IChGcmVlSW1hZ2VfR2V0QlBQKHNyY19kaWIpICE9IDE2KSkgeworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJLy8gY2hlY2sgdGhlIHNpemUgb2Ygc3JjIGltYWdlCisJaWYoKHggKyBGcmVlSW1hZ2VfR2V0V2lkdGgoc3JjX2RpYikgPiBGcmVlSW1hZ2VfR2V0V2lkdGgoZHN0X2RpYikpIHx8ICh5ICsgRnJlZUltYWdlX0dldEhlaWdodChzcmNfZGliKSA+IEZyZWVJbWFnZV9HZXRIZWlnaHQoZHN0X2RpYikpKSB7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlCWVRFICpkc3RfYml0cyA9IEZyZWVJbWFnZV9HZXRCaXRzKGRzdF9kaWIpICsgKChGcmVlSW1hZ2VfR2V0SGVpZ2h0KGRzdF9kaWIpIC0gRnJlZUltYWdlX0dldEhlaWdodChzcmNfZGliKSAtIHkpICogRnJlZUltYWdlX0dldFBpdGNoKGRzdF9kaWIpKSArICh4ICogMik7CisJQllURSAqc3JjX2JpdHMgPSBGcmVlSW1hZ2VfR2V0Qml0cyhzcmNfZGliKTsJCisKKwlpZiAoYWxwaGEgPiAyNTUpIHsKKwkJZm9yKHVuc2lnbmVkIHJvd3MgPSAwOyByb3dzIDwgRnJlZUltYWdlX0dldEhlaWdodChzcmNfZGliKTsgcm93cysrKSB7CisJCQltZW1jcHkoZHN0X2JpdHMsIHNyY19iaXRzLCBGcmVlSW1hZ2VfR2V0TGluZShzcmNfZGliKSk7CisKKwkJCWRzdF9iaXRzICs9IEZyZWVJbWFnZV9HZXRQaXRjaChkc3RfZGliKTsKKwkJCXNyY19iaXRzICs9IEZyZWVJbWFnZV9HZXRQaXRjaChzcmNfZGliKTsKKwkJfQorCX0gZWxzZSB7CisJCWZvcih1bnNpZ25lZCByb3dzID0gMDsgcm93cyA8IEZyZWVJbWFnZV9HZXRIZWlnaHQoc3JjX2RpYik7IHJvd3MrKykgeworCQkJZm9yKHVuc2lnbmVkIGNvbHMgPSAwOyBjb2xzIDwgRnJlZUltYWdlX0dldExpbmUoc3JjX2RpYik7IGNvbHMgKz0gMikgeworCQkJCVJHQlRSSVBMRSBjb2xvcl9zOworCQkJCVJHQlRSSVBMRSBjb2xvcl90OworCQkJCQorCQkJCVdPUkQgKnRtcDEgPSAoV09SRCAqKSZkc3RfYml0c1tjb2xzXTsKKwkJCQlXT1JEICp0bXAyID0gKFdPUkQgKikmc3JjX2JpdHNbY29sc107CisKKwkJCQkvLyBjb252ZXJ0IDE2LWJpdCBjb2xvcnMgdG8gMjQtYml0CisKKwkJCQljb2xvcl9zLnJnYnRSZWQgPSAoQllURSkoKCgqdG1wMSAmIEZJMTZfNTY1X1JFRF9NQVNLKSA+PiBGSTE2XzU2NV9SRURfU0hJRlQpIDw8IDMpOworCQkJCWNvbG9yX3MucmdidEdyZWVuID0gKEJZVEUpKCgoKnRtcDEgJiBGSTE2XzU2NV9HUkVFTl9NQVNLKSA+PiBGSTE2XzU2NV9HUkVFTl9TSElGVCkgPDwgMik7CisJCQkJY29sb3Jfcy5yZ2J0Qmx1ZSA9IChCWVRFKSgoKCp0bXAxICYgRkkxNl81NjVfQkxVRV9NQVNLKSA+PiBGSTE2XzU2NV9CTFVFX1NISUZUKSA8PCAzKTsKKworCQkJCWNvbG9yX3QucmdidFJlZCA9IChCWVRFKSgoKCp0bXAyICYgRkkxNl81NjVfUkVEX01BU0spID4+IEZJMTZfNTY1X1JFRF9TSElGVCkgPDwgMyk7CisJCQkJY29sb3JfdC5yZ2J0R3JlZW4gPSAoQllURSkoKCgqdG1wMiAmIEZJMTZfNTY1X0dSRUVOX01BU0spID4+IEZJMTZfNTY1X0dSRUVOX1NISUZUKSA8PCAyKTsKKwkJCQljb2xvcl90LnJnYnRCbHVlID0gKEJZVEUpKCgoKnRtcDIgJiBGSTE2XzU2NV9CTFVFX01BU0spID4+IEZJMTZfNTY1X0JMVUVfU0hJRlQpIDw8IDMpOworCisJCQkJLy8gYWxwaGEgYmxlbmQKKworCQkJCWNvbG9yX3MucmdidFJlZCA9IChCWVRFKSgoKGNvbG9yX3QucmdidFJlZCAtIGNvbG9yX3MucmdidFJlZCkgKiBhbHBoYSArIChjb2xvcl9zLnJnYnRSZWQgPDwgOCkpID4+IDgpOworCQkJCWNvbG9yX3MucmdidEdyZWVuID0gKEJZVEUpKCgoY29sb3JfdC5yZ2J0R3JlZW4gLSBjb2xvcl9zLnJnYnRHcmVlbikgKiBhbHBoYSArIChjb2xvcl9zLnJnYnRHcmVlbiA8PCA4KSkgPj4gOCk7CisJCQkJY29sb3Jfcy5yZ2J0Qmx1ZSA9IChCWVRFKSgoKGNvbG9yX3QucmdidEJsdWUgLSBjb2xvcl9zLnJnYnRCbHVlKSAqIGFscGhhICsgKGNvbG9yX3MucmdidEJsdWUgPDwgOCkpID4+IDgpOworCisJCQkJLy8gY29udmVydCAyNC1iaXQgY29sb3IgYmFjayB0byAxNi1iaXQKKworCQkJCSp0bXAxID0gUkdCNTY1KGNvbG9yX3MucmdidFJlZCwgY29sb3Jfcy5yZ2J0R3JlZW4sIGNvbG9yX3MucmdidEJsdWUpOworCQkJfQorCisJCQlkc3RfYml0cyArPSBGcmVlSW1hZ2VfR2V0UGl0Y2goZHN0X2RpYik7CisJCQlzcmNfYml0cyArPSBGcmVlSW1hZ2VfR2V0UGl0Y2goc3JjX2RpYik7CisJCX0KKwl9CisJCisJcmV0dXJuIFRSVUU7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgMjQtYml0CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBCT09MIAorQ29tYmluZTI0KEZJQklUTUFQICpkc3RfZGliLCBGSUJJVE1BUCAqc3JjX2RpYiwgdW5zaWduZWQgeCwgdW5zaWduZWQgeSwgdW5zaWduZWQgYWxwaGEpIHsKKwkvLyBjaGVjayB0aGUgYml0IGRlcHRoIG9mIHNyYyBhbmQgZHN0IGltYWdlcworCWlmKChGcmVlSW1hZ2VfR2V0QlBQKGRzdF9kaWIpICE9IDI0KSB8fCAoRnJlZUltYWdlX0dldEJQUChzcmNfZGliKSAhPSAyNCkpIHsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCS8vIGNoZWNrIHRoZSBzaXplIG9mIHNyYyBpbWFnZQorCWlmKCh4ICsgRnJlZUltYWdlX0dldFdpZHRoKHNyY19kaWIpID4gRnJlZUltYWdlX0dldFdpZHRoKGRzdF9kaWIpKSB8fCAoeSArIEZyZWVJbWFnZV9HZXRIZWlnaHQoc3JjX2RpYikgPiBGcmVlSW1hZ2VfR2V0SGVpZ2h0KGRzdF9kaWIpKSkgeworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJQllURSAqZHN0X2JpdHMgPSBGcmVlSW1hZ2VfR2V0Qml0cyhkc3RfZGliKSArICgoRnJlZUltYWdlX0dldEhlaWdodChkc3RfZGliKSAtIEZyZWVJbWFnZV9HZXRIZWlnaHQoc3JjX2RpYikgLSB5KSAqIEZyZWVJbWFnZV9HZXRQaXRjaChkc3RfZGliKSkgKyAoeCAqIDMpOworCUJZVEUgKnNyY19iaXRzID0gRnJlZUltYWdlX0dldEJpdHMoc3JjX2RpYik7CQorCisJaWYoYWxwaGEgPiAyNTUpIHsKKwkJLy8gY29tYmluZSBpbWFnZXMKKwkJZm9yKHVuc2lnbmVkIHJvd3MgPSAwOyByb3dzIDwgRnJlZUltYWdlX0dldEhlaWdodChzcmNfZGliKTsgcm93cysrKSB7CisJCQltZW1jcHkoZHN0X2JpdHMsIHNyY19iaXRzLCBGcmVlSW1hZ2VfR2V0TGluZShzcmNfZGliKSk7CisKKwkJCWRzdF9iaXRzICs9IEZyZWVJbWFnZV9HZXRQaXRjaChkc3RfZGliKTsKKwkJCXNyY19iaXRzICs9IEZyZWVJbWFnZV9HZXRQaXRjaChzcmNfZGliKTsKKwkJfQorCX0gZWxzZSB7CisJCS8vIGFscGhhIGJsZW5kIGltYWdlcworCQlmb3IodW5zaWduZWQgcm93cyA9IDA7IHJvd3MgPCBGcmVlSW1hZ2VfR2V0SGVpZ2h0KHNyY19kaWIpOyByb3dzKyspIHsKKwkJCWZvciAodW5zaWduZWQgY29scyA9IDA7IGNvbHMgPCBGcmVlSW1hZ2VfR2V0TGluZShzcmNfZGliKTsgY29scysrKSB7CQkJCQkJCQorCQkJCWRzdF9iaXRzW2NvbHNdID0gKEJZVEUpKCgoc3JjX2JpdHNbY29sc10gLSBkc3RfYml0c1tjb2xzXSkgKiBhbHBoYSArIChkc3RfYml0c1tjb2xzXSA8PCA4KSkgPj4gOCk7CisJCQl9CisKKwkJCWRzdF9iaXRzICs9IEZyZWVJbWFnZV9HZXRQaXRjaChkc3RfZGliKTsKKwkJCXNyY19iaXRzICs9IEZyZWVJbWFnZV9HZXRQaXRjaChzcmNfZGliKTsKKwkJfQorCX0KKworCXJldHVybiBUUlVFOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgIDMyLWJpdAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgQk9PTCAKK0NvbWJpbmUzMihGSUJJVE1BUCAqZHN0X2RpYiwgRklCSVRNQVAgKnNyY19kaWIsIHVuc2lnbmVkIHgsIHVuc2lnbmVkIHksIHVuc2lnbmVkIGFscGhhKSB7CisJLy8gY2hlY2sgdGhlIGJpdCBkZXB0aCBvZiBzcmMgYW5kIGRzdCBpbWFnZXMKKwlpZigoRnJlZUltYWdlX0dldEJQUChkc3RfZGliKSAhPSAzMikgfHwgKEZyZWVJbWFnZV9HZXRCUFAoc3JjX2RpYikgIT0gMzIpKSB7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwkvLyBjaGVjayB0aGUgc2l6ZSBvZiBzcmMgaW1hZ2UKKwlpZigoeCArIEZyZWVJbWFnZV9HZXRXaWR0aChzcmNfZGliKSA+IEZyZWVJbWFnZV9HZXRXaWR0aChkc3RfZGliKSkgfHwgKHkgKyBGcmVlSW1hZ2VfR2V0SGVpZ2h0KHNyY19kaWIpID4gRnJlZUltYWdlX0dldEhlaWdodChkc3RfZGliKSkpIHsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCUJZVEUgKmRzdF9iaXRzID0gRnJlZUltYWdlX0dldEJpdHMoZHN0X2RpYikgKyAoKEZyZWVJbWFnZV9HZXRIZWlnaHQoZHN0X2RpYikgLSBGcmVlSW1hZ2VfR2V0SGVpZ2h0KHNyY19kaWIpIC0geSkgKiBGcmVlSW1hZ2VfR2V0UGl0Y2goZHN0X2RpYikpICsgKHggKiA0KTsKKwlCWVRFICpzcmNfYml0cyA9IEZyZWVJbWFnZV9HZXRCaXRzKHNyY19kaWIpOwkKKworCWlmIChhbHBoYSA+IDI1NSkgeworCQkvLyBjb21iaW5lIGltYWdlcworCQlmb3IodW5zaWduZWQgcm93cyA9IDA7IHJvd3MgPCBGcmVlSW1hZ2VfR2V0SGVpZ2h0KHNyY19kaWIpOyByb3dzKyspIHsKKwkJCW1lbWNweShkc3RfYml0cywgc3JjX2JpdHMsIEZyZWVJbWFnZV9HZXRMaW5lKHNyY19kaWIpKTsKKworCQkJZHN0X2JpdHMgKz0gRnJlZUltYWdlX0dldFBpdGNoKGRzdF9kaWIpOworCQkJc3JjX2JpdHMgKz0gRnJlZUltYWdlX0dldFBpdGNoKHNyY19kaWIpOworCQl9CisJfSBlbHNlIHsKKwkJLy8gYWxwaGEgYmxlbmQgaW1hZ2VzCisJCWZvcih1bnNpZ25lZCByb3dzID0gMDsgcm93cyA8IEZyZWVJbWFnZV9HZXRIZWlnaHQoc3JjX2RpYik7IHJvd3MrKykgeworCQkJZm9yKHVuc2lnbmVkIGNvbHMgPSAwOyBjb2xzIDwgRnJlZUltYWdlX0dldExpbmUoc3JjX2RpYik7IGNvbHMrKykgeworCQkJCWRzdF9iaXRzW2NvbHNdID0gKEJZVEUpKCgoc3JjX2JpdHNbY29sc10gLSBkc3RfYml0c1tjb2xzXSkgKiBhbHBoYSArIChkc3RfYml0c1tjb2xzXSA8PCA4KSkgPj4gOCk7CisJCQl9CisKKwkJCWRzdF9iaXRzICs9IEZyZWVJbWFnZV9HZXRQaXRjaChkc3RfZGliKTsKKwkJCXNyY19iaXRzICs9IEZyZWVJbWFnZV9HZXRQaXRjaChzcmNfZGliKTsKKwkJfQorCX0KKworCXJldHVybiBUUlVFOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgIEFueSB0eXBlIG90aGVyIHRoYW4gRklCSVRNQVAKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIEJPT0wgCitDb21iaW5lU2FtZVR5cGUoRklCSVRNQVAgKmRzdF9kaWIsIEZJQklUTUFQICpzcmNfZGliLCB1bnNpZ25lZCB4LCB1bnNpZ25lZCB5KSB7CisJLy8gY2hlY2sgdGhlIGJpdCBkZXB0aCBvZiBzcmMgYW5kIGRzdCBpbWFnZXMKKwlpZihGcmVlSW1hZ2VfR2V0SW1hZ2VUeXBlKGRzdF9kaWIpICE9IEZyZWVJbWFnZV9HZXRJbWFnZVR5cGUoc3JjX2RpYikpIHsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCXVuc2lnbmVkIHNyY193aWR0aCAgPSBGcmVlSW1hZ2VfR2V0V2lkdGgoc3JjX2RpYik7CisJdW5zaWduZWQgc3JjX2hlaWdodCA9IEZyZWVJbWFnZV9HZXRIZWlnaHQoc3JjX2RpYik7CisJdW5zaWduZWQgc3JjX3BpdGNoICA9IEZyZWVJbWFnZV9HZXRQaXRjaChzcmNfZGliKTsKKwl1bnNpZ25lZCBzcmNfbGluZSAgID0gRnJlZUltYWdlX0dldExpbmUoc3JjX2RpYik7CisJdW5zaWduZWQgZHN0X3dpZHRoICA9IEZyZWVJbWFnZV9HZXRXaWR0aChkc3RfZGliKTsKKwl1bnNpZ25lZCBkc3RfaGVpZ2h0ID0gRnJlZUltYWdlX0dldEhlaWdodChkc3RfZGliKTsKKwl1bnNpZ25lZCBkc3RfcGl0Y2ggID0gRnJlZUltYWdlX0dldFBpdGNoKGRzdF9kaWIpOworCQorCS8vIGNoZWNrIHRoZSBzaXplIG9mIHNyYyBpbWFnZQorCWlmKCh4ICsgc3JjX3dpZHRoID4gZHN0X3dpZHRoKSB8fCAoeSArIHNyY19oZWlnaHQgPiBkc3RfaGVpZ2h0KSkgeworCQlyZXR1cm4gRkFMU0U7CisJfQkKKworCUJZVEUgKmRzdF9iaXRzID0gRnJlZUltYWdlX0dldEJpdHMoZHN0X2RpYikgKyAoKGRzdF9oZWlnaHQgLSBzcmNfaGVpZ2h0IC0geSkgKiBkc3RfcGl0Y2gpICsgKHggKiAoc3JjX2xpbmUgLyBzcmNfd2lkdGgpKTsKKwlCWVRFICpzcmNfYml0cyA9IEZyZWVJbWFnZV9HZXRCaXRzKHNyY19kaWIpOwkKKworCS8vIGNvbWJpbmUgaW1hZ2VzCQorCWZvcih1bnNpZ25lZCByb3dzID0gMDsgcm93cyA8IHNyY19oZWlnaHQ7IHJvd3MrKykgeworCQltZW1jcHkoZHN0X2JpdHMsIHNyY19iaXRzLCBzcmNfbGluZSk7CisKKwkJZHN0X2JpdHMgKz0gZHN0X3BpdGNoOworCQlzcmNfYml0cyArPSBzcmNfcGl0Y2g7CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgRnJlZUltYWdlIGludGVyZmFjZQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKioKK0NvcHkgYSBzdWIgcGFydCBvZiB0aGUgY3VycmVudCBpbWFnZSBhbmQgcmV0dXJucyBpdCBhcyBhIEZJQklUTUFQKi4KK1dvcmtzIHdpdGggYW55IGJpdG1hcCB0eXBlLgorQHBhcmFtIGxlZnQgU3BlY2lmaWVzIHRoZSBsZWZ0IHBvc2l0aW9uIG9mIHRoZSBjcm9wcGVkIHJlY3RhbmdsZS4gCitAcGFyYW0gdG9wIFNwZWNpZmllcyB0aGUgdG9wIHBvc2l0aW9uIG9mIHRoZSBjcm9wcGVkIHJlY3RhbmdsZS4gCitAcGFyYW0gcmlnaHQgU3BlY2lmaWVzIHRoZSByaWdodCBwb3NpdGlvbiBvZiB0aGUgY3JvcHBlZCByZWN0YW5nbGUuIAorQHBhcmFtIGJvdHRvbSBTcGVjaWZpZXMgdGhlIGJvdHRvbSBwb3NpdGlvbiBvZiB0aGUgY3JvcHBlZCByZWN0YW5nbGUuIAorQHJldHVybiBSZXR1cm5zIHRoZSBzdWJpbWFnZSBpZiBzdWNjZXNzZnVsLCBOVUxMIG90aGVyd2lzZS4KKyovCitGSUJJVE1BUCAqIERMTF9DQUxMQ09OViAKK0ZyZWVJbWFnZV9Db3B5KEZJQklUTUFQICpzcmMsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgcmlnaHQsIGludCBib3R0b20pIHsKKworCWlmKCFGcmVlSW1hZ2VfSGFzUGl4ZWxzKHNyYykpIAorCQlyZXR1cm4gTlVMTDsKKworCS8vIG5vcm1hbGl6ZSB0aGUgcmVjdGFuZ2xlCisJaWYocmlnaHQgPCBsZWZ0KSB7CisJCUlOUExBQ0VTV0FQKGxlZnQsIHJpZ2h0KTsKKwl9CisJaWYoYm90dG9tIDwgdG9wKSB7CisJCUlOUExBQ0VTV0FQKHRvcCwgYm90dG9tKTsKKwl9CisJLy8gY2hlY2sgdGhlIHNpemUgb2YgdGhlIHN1YiBpbWFnZQorCWludCBzcmNfd2lkdGggID0gRnJlZUltYWdlX0dldFdpZHRoKHNyYyk7CisJaW50IHNyY19oZWlnaHQgPSBGcmVlSW1hZ2VfR2V0SGVpZ2h0KHNyYyk7CisJaWYoKGxlZnQgPCAwKSB8fCAocmlnaHQgPiBzcmNfd2lkdGgpIHx8ICh0b3AgPCAwKSB8fCAoYm90dG9tID4gc3JjX2hlaWdodCkpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLy8gYWxsb2NhdGUgdGhlIHN1YiBpbWFnZQorCXVuc2lnbmVkIGJwcCA9IEZyZWVJbWFnZV9HZXRCUFAoc3JjKTsKKwlpbnQgZHN0X3dpZHRoID0gKHJpZ2h0IC0gbGVmdCk7CisJaW50IGRzdF9oZWlnaHQgPSAoYm90dG9tIC0gdG9wKTsKKworCUZJQklUTUFQICpkc3QgPSAKKwkJRnJlZUltYWdlX0FsbG9jYXRlVChGcmVlSW1hZ2VfR2V0SW1hZ2VUeXBlKHNyYyksIAorCQkJCQkJCWRzdF93aWR0aCwgCisJCQkJCQkJZHN0X2hlaWdodCwgCisJCQkJCQkJYnBwLCAKKwkJCQkJCQlGcmVlSW1hZ2VfR2V0UmVkTWFzayhzcmMpLCBGcmVlSW1hZ2VfR2V0R3JlZW5NYXNrKHNyYyksIEZyZWVJbWFnZV9HZXRCbHVlTWFzayhzcmMpKTsKKworCWlmKE5VTEwgPT0gZHN0KSByZXR1cm4gTlVMTDsKKworCS8vIGdldCB0aGUgZGltZW5zaW9ucworCWludCBkc3RfbGluZSA9IEZyZWVJbWFnZV9HZXRMaW5lKGRzdCk7CisJaW50IGRzdF9waXRjaCA9IEZyZWVJbWFnZV9HZXRQaXRjaChkc3QpOworCWludCBzcmNfcGl0Y2ggPSBGcmVlSW1hZ2VfR2V0UGl0Y2goc3JjKTsKKworCS8vIGdldCB0aGUgcG9pbnRlcnMgdG8gdGhlIGJpdHMgYW5kIHN1Y2gKKworCUJZVEUgKnNyY19iaXRzID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKHNyYywgc3JjX2hlaWdodCAtIHRvcCAtIGRzdF9oZWlnaHQpOworCXN3aXRjaChicHApIHsKKwkJY2FzZSAxOgorCQkJLy8gcG9pbnQgdG8geCA9IDAKKwkJCWJyZWFrOworCisJCWNhc2UgNDoKKwkJCS8vIHBvaW50IHRvIHggPSAwCisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQl7CisJCQkvLyBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiBieXRlcyBwZXIgcGl4ZWwKKwkJCXVuc2lnbmVkIGJ5dGVzcHAgPSBGcmVlSW1hZ2VfR2V0TGluZShzcmMpIC8gRnJlZUltYWdlX0dldFdpZHRoKHNyYyk7CisJCQkvLyBwb2ludCB0byB4ID0gbGVmdAorCQkJc3JjX2JpdHMgKz0gbGVmdCAqIGJ5dGVzcHA7CisJCX0KKwkJYnJlYWs7CisJfQorCisJLy8gcG9pbnQgdG8geCA9IDAKKwlCWVRFICpkc3RfYml0cyA9IEZyZWVJbWFnZV9HZXRCaXRzKGRzdCk7CisKKwkvLyBjb3B5IHRoZSBwYWxldHRlCisKKwltZW1jcHkoRnJlZUltYWdlX0dldFBhbGV0dGUoZHN0KSwgRnJlZUltYWdlX0dldFBhbGV0dGUoc3JjKSwgRnJlZUltYWdlX0dldENvbG9yc1VzZWQoc3JjKSAqIHNpemVvZihSR0JRVUFEKSk7CisKKwkvLyBjb3B5IHRoZSBiaXRzCisJaWYoYnBwID09IDEpIHsKKwkJQk9PTCB2YWx1ZTsKKwkJdW5zaWduZWQgeV9zcmMsIHlfZHN0OworCisJCWZvcihpbnQgeSA9IDA7IHkgPCBkc3RfaGVpZ2h0OyB5KyspIHsKKwkJCXlfc3JjID0geSAqIHNyY19waXRjaDsKKwkJCXlfZHN0ID0geSAqIGRzdF9waXRjaDsKKwkJCWZvcihpbnQgeCA9IDA7IHggPCBkc3Rfd2lkdGg7IHgrKykgeworCQkJCS8vIGdldCBiaXQgYXQgKHksIHgpIGluIHNyYyBpbWFnZQorCQkJCXZhbHVlID0gKHNyY19iaXRzW3lfc3JjICsgKChsZWZ0K3gpID4+IDMpXSAmICgweDgwID4+ICgobGVmdCt4KSAmIDB4MDcpKSkgIT0gMDsKKwkJCQkvLyBzZXQgYml0IGF0ICh5LCB4KSBpbiBkc3QgaW1hZ2UKKwkJCQl2YWx1ZSA/IGRzdF9iaXRzW3lfZHN0ICsgKHggPj4gMyldIHw9ICgweDgwID4+ICh4ICYgMHg3KSkgOiBkc3RfYml0c1t5X2RzdCArICh4ID4+IDMpXSAmPSAoMHhmZjdmID4+ICh4ICYgMHg3KSk7CisJCQl9CisJCX0KKwl9CisKKwllbHNlIGlmKGJwcCA9PSA0KSB7CisJCUJZVEUgc2hpZnQsIHZhbHVlOworCQl1bnNpZ25lZCB5X3NyYywgeV9kc3Q7CisKKwkJZm9yKGludCB5ID0gMDsgeSA8IGRzdF9oZWlnaHQ7IHkrKykgeworCQkJeV9zcmMgPSB5ICogc3JjX3BpdGNoOworCQkJeV9kc3QgPSB5ICogZHN0X3BpdGNoOworCQkJZm9yKGludCB4ID0gMDsgeCA8IGRzdF93aWR0aDsgeCsrKSB7CisJCQkJLy8gZ2V0IG5pYmJsZSBhdCAoeSwgeCkgaW4gc3JjIGltYWdlCisJCQkJc2hpZnQgPSAoQllURSkoKDEgLSAobGVmdCt4KSAlIDIpIDw8IDIpOworCQkJCXZhbHVlID0gKHNyY19iaXRzW3lfc3JjICsgKChsZWZ0K3gpID4+IDEpXSAmICgweDBGIDw8IHNoaWZ0KSkgPj4gc2hpZnQ7CisJCQkJLy8gc2V0IG5pYmJsZSBhdCAoeSwgeCkgaW4gZHN0IGltYWdlCisJCQkJc2hpZnQgPSAoQllURSkoKDEgLSB4ICUgMikgPDwgMik7CisJCQkJZHN0X2JpdHNbeV9kc3QgKyAoeCA+PiAxKV0gJj0gfigweDBGIDw8IHNoaWZ0KTsKKwkJCQlkc3RfYml0c1t5X2RzdCArICh4ID4+IDEpXSB8PSAoKHZhbHVlICYgMHgwRikgPDwgc2hpZnQpOworCQkJfQorCQl9CisJfQorCisJZWxzZSBpZihicHAgPj0gOCkgeworCQlmb3IoaW50IHkgPSAwOyB5IDwgZHN0X2hlaWdodDsgeSsrKSB7CisJCQltZW1jcHkoZHN0X2JpdHMgKyAoeSAqIGRzdF9waXRjaCksIHNyY19iaXRzICsgKHkgKiBzcmNfcGl0Y2gpLCBkc3RfbGluZSk7CisJCX0KKwl9CisKKwkvLyBjb3B5IG1ldGFkYXRhIGZyb20gc3JjIHRvIGRzdAorCUZyZWVJbWFnZV9DbG9uZU1ldGFkYXRhKGRzdCwgc3JjKTsKKwkKKwkvLyBjb3B5IHRyYW5zcGFyZW5jeSB0YWJsZSAKKwlGcmVlSW1hZ2VfU2V0VHJhbnNwYXJlbmN5VGFibGUoZHN0LCBGcmVlSW1hZ2VfR2V0VHJhbnNwYXJlbmN5VGFibGUoc3JjKSwgRnJlZUltYWdlX0dldFRyYW5zcGFyZW5jeUNvdW50KHNyYykpOworCQorCS8vIGNvcHkgYmFja2dyb3VuZCBjb2xvciAKKwlSR0JRVUFEIGJrY29sb3I7IAorCWlmKCBGcmVlSW1hZ2VfR2V0QmFja2dyb3VuZENvbG9yKHNyYywgJmJrY29sb3IpICkgeworCQlGcmVlSW1hZ2VfU2V0QmFja2dyb3VuZENvbG9yKGRzdCwgJmJrY29sb3IpOyAKKwl9CisJCisJLy8gY2xvbmUgcmVzb2x1dGlvbiAKKwlGcmVlSW1hZ2VfU2V0RG90c1Blck1ldGVyWChkc3QsIEZyZWVJbWFnZV9HZXREb3RzUGVyTWV0ZXJYKHNyYykpOyAKKwlGcmVlSW1hZ2VfU2V0RG90c1Blck1ldGVyWShkc3QsIEZyZWVJbWFnZV9HZXREb3RzUGVyTWV0ZXJZKHNyYykpOyAKKwkKKwkvLyBjbG9uZSBJQ0MgcHJvZmlsZSAKKwlGSUlDQ1BST0ZJTEUgKnNyY19wcm9maWxlID0gRnJlZUltYWdlX0dldElDQ1Byb2ZpbGUoc3JjKTsgCisJRklJQ0NQUk9GSUxFICpkc3RfcHJvZmlsZSA9IEZyZWVJbWFnZV9DcmVhdGVJQ0NQcm9maWxlKGRzdCwgc3JjX3Byb2ZpbGUtPmRhdGEsIHNyY19wcm9maWxlLT5zaXplKTsgCisJZHN0X3Byb2ZpbGUtPmZsYWdzID0gc3JjX3Byb2ZpbGUtPmZsYWdzOyAKKwkKKwlyZXR1cm4gZHN0OworfQorCisvKioKK0FscGhhIGJsZW5kIG9yIGNvbWJpbmUgYSBzdWIgcGFydCBpbWFnZSB3aXRoIHRoZSBjdXJyZW50IGltYWdlLgorVGhlIGJpdCBkZXB0aCBvZiBkc3QgYml0bWFwIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBiaXQgZGVwdGggb2Ygc3JjLiAKK1VwcGVyIHByb21vdGlvbiBvZiBzcmMgaXMgZG9uZSBpbnRlcm5hbGx5LiBTdXBwb3J0ZWQgYml0IGRlcHRoIGVxdWFscyB0byAxLCA0LCA4LCAxNiwgMjQgb3IgMzIuCitAcGFyYW0gc3JjIFNvdXJjZSBzdWJpbWFnZQorQHBhcmFtIGxlZnQgU3BlY2lmaWVzIHRoZSBsZWZ0IHBvc2l0aW9uIG9mIHRoZSBzdWIgaW1hZ2UuIAorQHBhcmFtIHRvcCBTcGVjaWZpZXMgdGhlIHRvcCBwb3NpdGlvbiBvZiB0aGUgc3ViIGltYWdlLiAKK0BwYXJhbSBhbHBoYSBBbHBoYSBibGVuZCBmYWN0b3IuIFRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGltYWdlcyBhcmUgYWxwaGEgYmxlbmRlZCBpZiAKK2FscGhhID0gMC4uMjU1LiBJZiBhbHBoYSA+IDI1NSwgdGhlbiB0aGUgc291cmNlIGltYWdlIGlzIGNvbWJpbmVkIHRvIHRoZSBkZXN0aW5hdGlvbiBpbWFnZS4KK0ByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZS4KKyovCitCT09MIERMTF9DQUxMQ09OViAKK0ZyZWVJbWFnZV9QYXN0ZShGSUJJVE1BUCAqZHN0LCBGSUJJVE1BUCAqc3JjLCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IGFscGhhKSB7CisJQk9PTCBiUmVzdWx0ID0gRkFMU0U7CisKKwlpZighRnJlZUltYWdlX0hhc1BpeGVscyhzcmMpIHx8ICFGcmVlSW1hZ2VfSGFzUGl4ZWxzKGRzdCkpIHJldHVybiBGQUxTRTsKKworCS8vIGNoZWNrIHRoZSBzaXplIG9mIHNyYyBpbWFnZQorCWlmKChsZWZ0IDwgMCkgfHwgKHRvcCA8IDApKSB7CisJCXJldHVybiBGQUxTRTsKKwl9CisJaWYoKGxlZnQgKyBGcmVlSW1hZ2VfR2V0V2lkdGgoc3JjKSA+IEZyZWVJbWFnZV9HZXRXaWR0aChkc3QpKSB8fCAodG9wICsgRnJlZUltYWdlX0dldEhlaWdodChzcmMpID4gRnJlZUltYWdlX0dldEhlaWdodChkc3QpKSkgeworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJLy8gY2hlY2sgZGF0YSB0eXBlCisJY29uc3QgRlJFRV9JTUFHRV9UWVBFIGltYWdlX3R5cGUgPSBGcmVlSW1hZ2VfR2V0SW1hZ2VUeXBlKGRzdCk7CisJaWYoaW1hZ2VfdHlwZSAhPSBGcmVlSW1hZ2VfR2V0SW1hZ2VUeXBlKHNyYykpIHsKKwkJLy8gbm8gY29udmVyc2lvbiBiZXR3ZWVuIGRhdGEgdHlwZSBpcyBkb25lCisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlpZihpbWFnZV90eXBlID09IEZJVF9CSVRNQVApIHsKKwkJRklCSVRNQVAgKmNsb25lID0gTlVMTDsKKworCQkvLyBjaGVjayB0aGUgYml0IGRlcHRoIG9mIHNyYyBhbmQgZHN0IGltYWdlcworCQl1bnNpZ25lZCBicHBfc3JjID0gRnJlZUltYWdlX0dldEJQUChzcmMpOworCQl1bnNpZ25lZCBicHBfZHN0ID0gRnJlZUltYWdlX0dldEJQUChkc3QpOworCQlCT09MIGlzUkdCNTY1ID0gRkFMU0U7CisKKwkJaWYgKChGcmVlSW1hZ2VfR2V0UmVkTWFzayhkc3QpID09IEZJMTZfNTY1X1JFRF9NQVNLKSAmJiAoRnJlZUltYWdlX0dldEdyZWVuTWFzayhkc3QpID09IEZJMTZfNTY1X0dSRUVOX01BU0spICYmIChGcmVlSW1hZ2VfR2V0Qmx1ZU1hc2soZHN0KSA9PSBGSTE2XzU2NV9CTFVFX01BU0spKSB7CisJCQlpc1JHQjU2NSA9IFRSVUU7CisJCX0gZWxzZSB7CisJCQkvLyBpbmNsdWRlcyBjYXNlIHdoZXJlIGFsbCB0aGUgbWFza3MgYXJlIDAKKwkJCWlzUkdCNTY1ID0gRkFMU0U7CisJCX0KKworCQkvLyBwZXJmb3JtIHByb21vdGlvbiBpZiBuZWVkZWQKKwkJaWYoYnBwX2RzdCA9PSBicHBfc3JjKSB7CisJCQljbG9uZSA9IHNyYzsKKwkJfSBlbHNlIGlmKGJwcF9kc3QgPiBicHBfc3JjKSB7CisJCQkvLyBwZXJmb3JtIHByb21vdGlvbgorCQkJc3dpdGNoKGJwcF9kc3QpIHsKKwkJCQljYXNlIDQ6CisJCQkJCWNsb25lID0gRnJlZUltYWdlX0NvbnZlcnRUbzRCaXRzKHNyYyk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgODoKKwkJCQkJY2xvbmUgPSBGcmVlSW1hZ2VfQ29udmVydFRvOEJpdHMoc3JjKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAxNjoKKwkJCQkJaWYgKGlzUkdCNTY1KSB7CisJCQkJCQljbG9uZSA9IEZyZWVJbWFnZV9Db252ZXJ0VG8xNkJpdHM1NjUoc3JjKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8vIGluY2x1ZGVzIGNhc2Ugd2hlcmUgYWxsIHRoZSBtYXNrcyBhcmUgMAorCQkJCQkJY2xvbmUgPSBGcmVlSW1hZ2VfQ29udmVydFRvMTZCaXRzNTU1KHNyYyk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAyNDoKKwkJCQkJY2xvbmUgPSBGcmVlSW1hZ2VfQ29udmVydFRvMjRCaXRzKHNyYyk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMzI6CisJCQkJCWNsb25lID0gRnJlZUltYWdlX0NvbnZlcnRUbzMyQml0cyhzcmMpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlyZXR1cm4gRkFMU0U7CisJCQl9CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKworCQlpZighY2xvbmUpIHJldHVybiBGQUxTRTsKKworCQkvLyBwYXN0ZSBzcmMgdG8gZHN0CisJCXN3aXRjaChGcmVlSW1hZ2VfR2V0QlBQKGRzdCkpIHsKKwkJCWNhc2UgMToKKwkJCQliUmVzdWx0ID0gQ29tYmluZTEoZHN0LCBjbG9uZSwgKHVuc2lnbmVkKWxlZnQsICh1bnNpZ25lZCl0b3AsICh1bnNpZ25lZClhbHBoYSk7CisJCQkJYnJlYWs7CisJCQljYXNlIDQ6CisJCQkJYlJlc3VsdCA9IENvbWJpbmU0KGRzdCwgY2xvbmUsICh1bnNpZ25lZClsZWZ0LCAodW5zaWduZWQpdG9wLCAodW5zaWduZWQpYWxwaGEpOworCQkJCWJyZWFrOworCQkJY2FzZSA4OgorCQkJCWJSZXN1bHQgPSBDb21iaW5lOChkc3QsIGNsb25lLCAodW5zaWduZWQpbGVmdCwgKHVuc2lnbmVkKXRvcCwgKHVuc2lnbmVkKWFscGhhKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMTY6CisJCQkJaWYgKGlzUkdCNTY1KSB7CisJCQkJCWJSZXN1bHQgPSBDb21iaW5lMTZfNTY1KGRzdCwgY2xvbmUsICh1bnNpZ25lZClsZWZ0LCAodW5zaWduZWQpdG9wLCAodW5zaWduZWQpYWxwaGEpOworCQkJCX0gZWxzZSB7CisJCQkJCS8vIGluY2x1ZGVzIGNhc2Ugd2hlcmUgYWxsIHRoZSBtYXNrcyBhcmUgMAorCQkJCQliUmVzdWx0ID0gQ29tYmluZTE2XzU1NShkc3QsIGNsb25lLCAodW5zaWduZWQpbGVmdCwgKHVuc2lnbmVkKXRvcCwgKHVuc2lnbmVkKWFscGhhKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIDI0OgorCQkJCWJSZXN1bHQgPSBDb21iaW5lMjQoZHN0LCBjbG9uZSwgKHVuc2lnbmVkKWxlZnQsICh1bnNpZ25lZCl0b3AsICh1bnNpZ25lZClhbHBoYSk7CisJCQkJYnJlYWs7CisJCQljYXNlIDMyOgorCQkJCWJSZXN1bHQgPSBDb21iaW5lMzIoZHN0LCBjbG9uZSwgKHVuc2lnbmVkKWxlZnQsICh1bnNpZ25lZCl0b3AsICh1bnNpZ25lZClhbHBoYSk7CisJCQkJYnJlYWs7CisJCX0KKworCQlpZihjbG9uZSAhPSBzcmMpCisJCQlGcmVlSW1hZ2VfVW5sb2FkKGNsb25lKTsKKworCQl9CisJZWxzZSB7CS8vIGFueSB0eXBlIG90aGVyIHRoYW4gRklUQklUTUFQCisJCWJSZXN1bHQgPSBDb21iaW5lU2FtZVR5cGUoZHN0LCBzcmMsICh1bnNpZ25lZClsZWZ0LCAodW5zaWduZWQpdG9wKTsKKwl9CisKKwlyZXR1cm4gYlJlc3VsdDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKiogQGJyaWVmIENyZWF0ZXMgYSBkeW5hbWljIHJlYWQvd3JpdGUgdmlldyBpbnRvIGEgRnJlZUltYWdlIGJpdG1hcC4KKworIEEgZHluYW1pYyB2aWV3IGlzIGEgRnJlZUltYWdlIGJpdG1hcCB3aXRoIGl0cyBvd24gd2lkdGggYW5kIGhlaWdodCwgdGhhdCwKKyBob3dldmVyLCBzaGFyZXMgaXRzIGJpdHMgd2l0aCBhbm90aGVyIEZyZWVJbWFnZSBiaXRtYXAuIFR5cGljYWxseSwgdmlld3MKKyBhcmUgdXNlZCB0byBkZWZpbmUgb25lIG9yIG1vcmUgcmVjdGFuZ3VsYXIgc3ViLWltYWdlcyBvZiBhbiBleGlzdGluZworIGJpdG1hcC4gQWxsIEZyZWVJbWFnZSBvcGVyYXRpb25zLCBsaWtlIHNhdmluZywgZGlzcGxheWluZyBhbmQgYWxsIHRoZQorIHRvb2xraXQgZnVuY3Rpb25zLCB3aGVuIGFwcGxpZWQgdG8gdGhlIHZpZXcsIG9ubHkgYWZmZWN0IHRoZSB2aWV3J3MKKyByZWN0YW5ndWxhciBhcmVhLgorCisgQWx0aG91Z2ggdGhlIHZpZXcncyBiYWNraW5nIGltYWdlJ3MgYml0cyBub3QgbmVlZCB0byBiZSBjb3BpZWQgYXJvdW5kLAorIHdoaWNoIG1ha2VzIHRoZSB2aWV3IG11Y2ggZmFzdGVyIHRoYW4gc2ltaWxhciBzb2x1dGlvbnMgdXNpbmcKKyBGcmVlSW1hZ2VfQ29weSwgYSB2aWV3IHVzZXMgc29tZSBwcml2YXRlIG1lbW9yeSB0aGF0IG5lZWRzIHRvIGJlIGZyZWVkIGJ5CisgY2FsbGluZyBGcmVlSW1hZ2VfVW5sb2FkIG9uIHRoZSB2aWV3J3MgaGFuZGxlIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzLgorCisgT25seSB0aGUgYmFja2luZyBpbWFnZSdzIHBpeGVscyBhcmUgc2hhcmVkIGJ5IHRoZSB2aWV3LiBGb3IgYWxsIG90aGVyIGltYWdlCisgZGF0YSwgbm90YWJseSBmb3IgdGhlIHJlc29sdXRpb24sIGJhY2tncm91bmQgY29sb3IsIGNvbG9yIHBhbGV0dGUsCisgdHJhbnNwYXJlbmN5IHRhYmxlIGFuZCBmb3IgdGhlIElDQyBwcm9maWxlLCB0aGUgdmlldyBnZXRzIGEgcHJpdmF0ZSBjb3B5Cisgb2YgdGhlIGRhdGEuIEJ5IGRlZmF1bHQsIHRoZSBiYWNraW5nIGltYWdlJ3MgbWV0YWRhdGEgaXMgTk9UIGNvcGllZCB0bworIHRoZSB2aWV3LgorCisgQXMgd2l0aCBhbGwgRnJlZUltYWdlIGZ1bmN0aW9ucyB0aGF0IHRha2UgYSByZWN0YW5nbGUgcmVnaW9uLCB0b3AgYW5kIGxlZnQKKyBwb3NpdGlvbnMgYXJlIGluY2x1ZGVkLCB3aGVyZWFzIHJpZ2h0IGFuZCBib3R0b20gcG9zaXRpb25zIGFyZSBleGNsdWRlZAorIGZyb20gdGhlIHJlY3RhbmdsZSBhcmVhLgorCisgU2luY2UgdGhlIG1lbW9yeSBibG9jayBzaGFyZWQgYnkgdGhlIGJhY2tpbmcgaW1hZ2UgYW5kIHRoZSB2aWV3IG11c3Qgc3RhcnQKKyBhdCBhIGJ5dGUgYm91bmRhcnksIHRoZSB2YWx1ZSBvZiBwYXJhbWV0ZXIgbGVmdCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOAorIGZvciAxLWJpdCBpbWFnZXMgYW5kIGEgbXVsdGlwbGUgb2YgMiBmb3IgNC1iaXQgaW1hZ2VzLgorCisgQHBhcmFtIGRpYiBUaGUgRnJlZUltYWdlIGJpdG1hcCBvbiB3aGljaCB0byBjcmVhdGUgdGhlIHZpZXcuCisgQHBhcmFtIGxlZnQgVGhlIGxlZnQgcG9zaXRpb24gb2YgdGhlIHZpZXcncyBhcmVhLgorIEBwYXJhbSB0b3AgVGhlIHRvcCBwb3NpdGlvbiBvZiB0aGUgdmlldydzIGFyZWEuCisgQHBhcmFtIHJpZ2h0IFRoZSByaWdodCBwb3NpdGlvbiBvZiB0aGUgdmlldydzIGFyZWEuCisgQHBhcmFtIGJvdHRvbSBUaGUgYm90dG9tIHBvc2l0aW9uIG9mIHRoZSB2aWV3J3MgYXJlYS4KKyBAcmV0dXJuIFJldHVybnMgYSBoYW5kbGUgdG8gdGhlIG5ld2x5IGNyZWF0ZWQgdmlldyBvciBOVUxMIGlmIHRoZSB2aWV3Cisgd2FzIG5vdCBjcmVhdGVkLgorICovCitGSUJJVE1BUCAqIERMTF9DQUxMQ09OVgorRnJlZUltYWdlX0NyZWF0ZVZpZXcoRklCSVRNQVAgKmRpYiwgdW5zaWduZWQgbGVmdCwgdW5zaWduZWQgdG9wLCB1bnNpZ25lZCByaWdodCwgdW5zaWduZWQgYm90dG9tKSB7CisJaWYgKCFGcmVlSW1hZ2VfSGFzUGl4ZWxzKGRpYikpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLy8gbm9ybWFsaXplIHRoZSByZWN0YW5nbGUKKwlpZiAocmlnaHQgPCBsZWZ0KSB7CisJCUlOUExBQ0VTV0FQKGxlZnQsIHJpZ2h0KTsKKwl9CisJaWYgKGJvdHRvbSA8IHRvcCkgeworCQlJTlBMQUNFU1dBUCh0b3AsIGJvdHRvbSk7CisJfQorCisJLy8gY2hlY2sgdGhlIHNpemUgb2YgdGhlIHN1YiBpbWFnZQorCXVuc2lnbmVkIHdpZHRoID0gRnJlZUltYWdlX0dldFdpZHRoKGRpYik7CisJdW5zaWduZWQgaGVpZ2h0ID0gRnJlZUltYWdlX0dldEhlaWdodChkaWIpOworCWlmIChsZWZ0IDwgMCB8fCByaWdodCA+IHdpZHRoIHx8IHRvcCA8IDAgfHwgYm90dG9tID4gaGVpZ2h0KSB7CisJCXJldHVybiBOVUxMOworCX0KKworCXVuc2lnbmVkIGJwcCA9IEZyZWVJbWFnZV9HZXRCUFAoZGliKTsKKwlCWVRFICpiaXRzID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgaGVpZ2h0IC0gYm90dG9tKTsKKwlzd2l0Y2ggKGJwcCkgeworCQljYXNlIDE6CisJCQlpZiAobGVmdCAlIDggIT0gMCkgeworCQkJCS8vIHZpZXcgY2FuIG9ubHkgc3RhcnQgYXQgYSBieXRlIGJvdW5kYXJ5CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCQliaXRzICs9IChsZWZ0IC8gOCk7CisJCQlicmVhazsKKwkJY2FzZSA0OgorCQkJaWYgKGxlZnQgJSAyICE9IDApIHsKKwkJCQkvLyB2aWV3IGNhbiBvbmx5IHN0YXJ0IGF0IGEgYnl0ZSBib3VuZGFyeQorCQkJCXJldHVybiBOVUxMOworCQkJCX0KKwkJCWJpdHMgKz0gKGxlZnQgLyAyKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYml0cyArPSBsZWZ0ICogKGJwcCAvIDgpOworCQkJYnJlYWs7CisJfQorCisJRklCSVRNQVAgKmRzdCA9IEZyZWVJbWFnZV9BbGxvY2F0ZUhlYWRlckZvckJpdHMoYml0cywgRnJlZUltYWdlX0dldFBpdGNoKGRpYiksIEZyZWVJbWFnZV9HZXRJbWFnZVR5cGUoZGliKSwgCisJCXJpZ2h0IC0gbGVmdCwgYm90dG9tIC0gdG9wLCAKKwkJYnBwLCAKKwkJRnJlZUltYWdlX0dldFJlZE1hc2soZGliKSwgRnJlZUltYWdlX0dldEdyZWVuTWFzayhkaWIpLCBGcmVlSW1hZ2VfR2V0Qmx1ZU1hc2soZGliKSk7CisKKwlpZiAoZHN0ID09IE5VTEwpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLy8gY29weSBzb21lIGJhc2ljIGltYWdlIHByb3BlcnRpZXMgbmVlZGVkIGZvciBkaXNwbGF5aW5nIGFuZCBzYXZpbmcKKworCS8vIHJlc29sdXRpb24KKwlGcmVlSW1hZ2VfU2V0RG90c1Blck1ldGVyWChkc3QsIEZyZWVJbWFnZV9HZXREb3RzUGVyTWV0ZXJYKGRpYikpOworCUZyZWVJbWFnZV9TZXREb3RzUGVyTWV0ZXJZKGRzdCwgRnJlZUltYWdlX0dldERvdHNQZXJNZXRlclkoZGliKSk7CisKKwkvLyBiYWNrZ3JvdW5kIGNvbG9yCisJUkdCUVVBRCBia2NvbG9yOworCWlmIChGcmVlSW1hZ2VfR2V0QmFja2dyb3VuZENvbG9yKGRpYiwgJmJrY29sb3IpKSB7CisJCUZyZWVJbWFnZV9TZXRCYWNrZ3JvdW5kQ29sb3IoZHN0LCAmYmtjb2xvcik7CisJfQorCisJLy8gcGFsZXR0ZQorCW1lbWNweShGcmVlSW1hZ2VfR2V0UGFsZXR0ZShkc3QpLCBGcmVlSW1hZ2VfR2V0UGFsZXR0ZShkaWIpLCBGcmVlSW1hZ2VfR2V0Q29sb3JzVXNlZChkaWIpICogc2l6ZW9mKFJHQlFVQUQpKTsKKworCS8vIHRyYW5zcGFyZW5jeSB0YWJsZQorCUZyZWVJbWFnZV9TZXRUcmFuc3BhcmVuY3lUYWJsZShkc3QsIEZyZWVJbWFnZV9HZXRUcmFuc3BhcmVuY3lUYWJsZShkaWIpLCBGcmVlSW1hZ2VfR2V0VHJhbnNwYXJlbmN5Q291bnQoZGliKSk7CisKKwkvLyBJQ0MgcHJvZmlsZQorCUZJSUNDUFJPRklMRSAqc3JjX3Byb2ZpbGUgPSBGcmVlSW1hZ2VfR2V0SUNDUHJvZmlsZShkaWIpOworCUZJSUNDUFJPRklMRSAqZHN0X3Byb2ZpbGUgPSBGcmVlSW1hZ2VfQ3JlYXRlSUNDUHJvZmlsZShkc3QsIHNyY19wcm9maWxlLT5kYXRhLCBzcmNfcHJvZmlsZS0+c2l6ZSk7CisJZHN0X3Byb2ZpbGUtPmZsYWdzID0gc3JjX3Byb2ZpbGUtPmZsYWdzOworCisJcmV0dXJuIGRzdDsKK30KZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2VUb29sa2l0L0Rpc3BsYXkuY3BwIGIvZmlsZXMvU291cmNlL0ZyZWVJbWFnZVRvb2xraXQvRGlzcGxheS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ1YzVjMwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2VUb29sa2l0L0Rpc3BsYXkuY3BwCkBAIC0wLDAgKzEsMjMwIEBACisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBEaXNwbGF5IHJvdXRpbmVzCisvLworLy8gRGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBieQorLy8gLSBIZXJ26SBEcm9sb24gKGRyb2xvbkBpbmZvbmllLmZyKQorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZyZWVJbWFnZSAzCisvLworLy8gQ09WRVJFRCBDT0RFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZCisvLyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUworLy8gVEhBVCBUSEUgQ09WRVJFRCBDT0RFIElTIEZSRUUgT0YgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisvLyBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRAorLy8gQ09ERSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVAorLy8gVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GIEFOWSBORUNFU1NBUlkKKy8vIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwKKy8vIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIKKy8vIFRISVMgRElTQ0xBSU1FUi4KKy8vCisvLyBVc2UgYXQgeW91ciBvd24gcmlzayEKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2luY2x1ZGUgIkZyZWVJbWFnZS5oIgorI2luY2x1ZGUgIlV0aWxpdGllcy5oIgorCisKKy8qKgorQGJyaWVmIENvbXBvc2l0ZSBhIGZvcmVncm91bmQgaW1hZ2UgYWdhaW5zdCBhIGJhY2tncm91bmQgY29sb3Igb3IgYSBiYWNrZ3JvdW5kIGltYWdlLgorCitUaGUgZXF1YXRpb24gZm9yIGNvbXB1dGluZyBhIGNvbXBvc2l0ZWQgc2FtcGxlIHZhbHVlIGlzOjxicj4KK291dHB1dCA9IGFscGhhICogZm9yZWdyb3VuZCArICgxLWFscGhhKSAqIGJhY2tncm91bmQ8YnI+Cit3aGVyZSBhbHBoYSBhbmQgdGhlIGlucHV0IGFuZCBvdXRwdXQgc2FtcGxlIHZhbHVlcyBhcmUgZXhwcmVzc2VkIGFzIGZyYWN0aW9ucyBpbiB0aGUgcmFuZ2UgMCB0byAxLiAKK0ZvciBjb2xvdXIgaW1hZ2VzLCB0aGUgY29tcHV0YXRpb24gaXMgZG9uZSBzZXBhcmF0ZWx5IGZvciBSLCBHLCBhbmQgQiBzYW1wbGVzLgorCitAcGFyYW0gZmcgRm9yZWdyb3VuZCBpbWFnZQorQHBhcmFtIHVzZUZpbGVCa2cgSWYgVFJVRSBhbmQgYSBmaWxlIGJhY2tncm91bmQgaXMgcHJlc2VudCwgdXNlIGl0IGFzIHRoZSBiYWNrZ3JvdW5kIGNvbG9yCitAcGFyYW0gYXBwQmtDb2xvciBJZiBub3QgZXF1YWwgdG8gTlVMTCwgYW5kIHVzZUZpbGVCa2cgaXMgRkFMU0UsIHVzZSB0aGlzIGNvbG9yIGFzIHRoZSBiYWNrZ3JvdW5kIGNvbG9yCitAcGFyYW0gYmcgSWYgbm90IGVxdWFsIHRvIE5VTEwgYW5kIHVzZUZpbGVCa2cgaXMgRkFMU0UgYW5kIGFwcEJrQ29sb3IgaXMgTlVMTCwgdXNlIHRoaXMgYXMgdGhlIGJhY2tncm91bmQgaW1hZ2UKK0ByZXR1cm4gUmV0dXJucyB0aGUgY29tcG9zaXRlIGltYWdlIGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgTlVMTCBvdGhlcndpc2UKK0BzZWUgRnJlZUltYWdlX0lzVHJhbnNwYXJlbnQsIEZyZWVJbWFnZV9IYXNCYWNrZ3JvdW5kQ29sb3IKKyovCitGSUJJVE1BUCAqIERMTF9DQUxMQ09OVgorRnJlZUltYWdlX0NvbXBvc2l0ZShGSUJJVE1BUCAqZmcsIEJPT0wgdXNlRmlsZUJrZywgUkdCUVVBRCAqYXBwQmtDb2xvciwgRklCSVRNQVAgKmJnKSB7CisJaWYoIUZyZWVJbWFnZV9IYXNQaXhlbHMoZmcpKSByZXR1cm4gTlVMTDsKKworCWludCB3aWR0aCAgPSBGcmVlSW1hZ2VfR2V0V2lkdGgoZmcpOworCWludCBoZWlnaHQgPSBGcmVlSW1hZ2VfR2V0SGVpZ2h0KGZnKTsKKwlpbnQgYnBwICAgID0gRnJlZUltYWdlX0dldEJQUChmZyk7CisKKwlpZigoYnBwICE9IDgpICYmIChicHAgIT0gMzIpKQorCQlyZXR1cm4gTlVMTDsKKworCWlmKGJnKSB7CisJCWludCBiZ193aWR0aCAgPSBGcmVlSW1hZ2VfR2V0V2lkdGgoYmcpOworCQlpbnQgYmdfaGVpZ2h0ID0gRnJlZUltYWdlX0dldEhlaWdodChiZyk7CisJCWludCBiZ19icHAgICAgPSBGcmVlSW1hZ2VfR2V0QlBQKGJnKTsKKwkJaWYoKGJnX3dpZHRoICE9IHdpZHRoKSB8fCAoYmdfaGVpZ2h0ICE9IGhlaWdodCkgfHwgKGJnX2JwcCAhPSAyNCkpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpbnQgYnl0ZXNwcCA9IChicHAgPT0gOCkgPyAxIDogNDsKKworCQorCWludCB4LCB5LCBjOworCUJZVEUgYWxwaGEgPSAwLCBub3RfYWxwaGE7CisJQllURSBpbmRleDsKKwlSR0JRVUFEIGZnYzsJLy8gZm9yZWdyb3VuZCBjb2xvcgorCVJHQlFVQUQgYmtjOwkvLyBiYWNrZ3JvdW5kIGNvbG9yCisKKwltZW1zZXQoJmZnYywgMCwgc2l6ZW9mKFJHQlFVQUQpKTsKKwltZW1zZXQoJmJrYywgMCwgc2l6ZW9mKFJHQlFVQUQpKTsKKworCS8vIGFsbG9jYXRlIHRoZSBjb21wb3NpdGUgaW1hZ2UKKwlGSUJJVE1BUCAqY29tcG9zaXRlID0gRnJlZUltYWdlX0FsbG9jYXRlKHdpZHRoLCBoZWlnaHQsIDI0LCBGSV9SR0JBX1JFRF9NQVNLLCBGSV9SR0JBX0dSRUVOX01BU0ssIEZJX1JHQkFfQkxVRV9NQVNLKTsKKwlpZighY29tcG9zaXRlKSByZXR1cm4gTlVMTDsKKworCS8vIGdldCB0aGUgcGFsZXR0ZQorCVJHQlFVQUQgKnBhbCA9IEZyZWVJbWFnZV9HZXRQYWxldHRlKGZnKTsKKworCS8vIHJldHJpZXZlIHRoZSBhbHBoYSB0YWJsZSBmcm9tIHRoZSBmb3JlZ3JvdW5kIGltYWdlCisJQk9PTCBiSXNUcmFuc3BhcmVudCA9IEZyZWVJbWFnZV9Jc1RyYW5zcGFyZW50KGZnKTsKKwlCWVRFICp0cm5zID0gRnJlZUltYWdlX0dldFRyYW5zcGFyZW5jeVRhYmxlKGZnKTsKKworCS8vIHJldHJpZXZlIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIGZyb20gdGhlIGZvcmVncm91bmQgaW1hZ2UKKwlCT09MIGJIYXNCa0NvbG9yID0gRkFMU0U7CisKKwlpZih1c2VGaWxlQmtnICYmIEZyZWVJbWFnZV9IYXNCYWNrZ3JvdW5kQ29sb3IoZmcpKSB7CisJCUZyZWVJbWFnZV9HZXRCYWNrZ3JvdW5kQ29sb3IoZmcsICZia2MpOworCQliSGFzQmtDb2xvciA9IFRSVUU7CisJfSBlbHNlIHsKKwkJLy8gbm8gZmlsZSBiYWNrZ3JvdW5kIGNvbG9yCisJCS8vIHVzZSBhcHBsaWNhdGlvbiBiYWNrZ3JvdW5kIGNvbG9yID8KKwkJaWYoYXBwQmtDb2xvcikgeworCQkJbWVtY3B5KCZia2MsIGFwcEJrQ29sb3IsIHNpemVvZihSR0JRVUFEKSk7CisJCQliSGFzQmtDb2xvciA9IFRSVUU7CisJCX0KKwkJLy8gdXNlIGJhY2tncm91bmQgaW1hZ2UgPworCQllbHNlIGlmKGJnKSB7CisJCQliSGFzQmtDb2xvciA9IEZBTFNFOworCQl9CisJfQorCisJZm9yKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJLy8gZm9yZWdyb3VuZAorCQlCWVRFICpmZ19iaXRzID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKGZnLCB5KTsKKwkJLy8gYmFja2dyb3VuZAorCQlCWVRFICpiZ19iaXRzID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKGJnLCB5KTsKKwkJLy8gY29tcG9zaXRlIGltYWdlCisJCUJZVEUgKmNwX2JpdHMgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoY29tcG9zaXRlLCB5KTsKKworCQlmb3IoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisKKwkJCS8vIGZvcmVncm91bmQgY29sb3IgKyBhbHBoYQorCisJCQlpZihicHAgPT0gOCkgeworCQkJCS8vIGdldCB0aGUgZm9yZWdyb3VuZCBjb2xvcgorCQkJCWluZGV4ID0gZmdfYml0c1swXTsKKwkJCQltZW1jcHkoJmZnYywgJnBhbFtpbmRleF0sIHNpemVvZihSR0JRVUFEKSk7CisJCQkJLy8gZ2V0IHRoZSBhbHBoYQorCQkJCWlmKGJJc1RyYW5zcGFyZW50KSB7CisJCQkJCWFscGhhID0gdHJuc1tpbmRleF07CisJCQkJfSBlbHNlIHsKKwkJCQkJYWxwaGEgPSAyNTU7CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZihicHAgPT0gMzIpIHsKKwkJCQkvLyBnZXQgdGhlIGZvcmVncm91bmQgY29sb3IKKwkJCQlmZ2MucmdiQmx1ZSAgPSBmZ19iaXRzW0ZJX1JHQkFfQkxVRV07CisJCQkJZmdjLnJnYkdyZWVuID0gZmdfYml0c1tGSV9SR0JBX0dSRUVOXTsKKwkJCQlmZ2MucmdiUmVkICAgPSBmZ19iaXRzW0ZJX1JHQkFfUkVEXTsKKwkJCQkvLyBnZXQgdGhlIGFscGhhCisJCQkJYWxwaGEgPSBmZ19iaXRzW0ZJX1JHQkFfQUxQSEFdOworCQkJfQorCisJCQkvLyBiYWNrZ3JvdW5kIGNvbG9yCisKKwkJCWlmKCFiSGFzQmtDb2xvcikgeworCQkJCWlmKGJnKSB7CisJCQkJCS8vIGdldCB0aGUgYmFja2dyb3VuZCBjb2xvciBmcm9tIHRoZSBiYWNrZ3JvdW5kIGltYWdlCisJCQkJCWJrYy5yZ2JCbHVlICA9IGJnX2JpdHNbRklfUkdCQV9CTFVFXTsKKwkJCQkJYmtjLnJnYkdyZWVuID0gYmdfYml0c1tGSV9SR0JBX0dSRUVOXTsKKwkJCQkJYmtjLnJnYlJlZCAgID0gYmdfYml0c1tGSV9SR0JBX1JFRF07CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQkvLyB1c2UgYSBjaGVja2VyYm9hcmQgcGF0dGVybgorCQkJCQljID0gKCgoeSAmIDB4OCkgPT0gMCkgXiAoKHggJiAweDgpID09IDApKSAqIDE5MjsKKwkJCQkJYyA9IGMgPyBjIDogMjU1OworCQkJCQlia2MucmdiQmx1ZSAgPSAoQllURSljOworCQkJCQlia2MucmdiR3JlZW4gPSAoQllURSljOworCQkJCQlia2MucmdiUmVkICAgPSAoQllURSljOworCQkJCX0KKwkJCX0KKworCQkJLy8gY29tcG9zaXRpb24KKworCQkJaWYoYWxwaGEgPT0gMCkgeworCQkJCS8vIG91dHB1dCA9IGJhY2tncm91bmQKKwkJCQljcF9iaXRzW0ZJX1JHQkFfQkxVRV0gPSBia2MucmdiQmx1ZTsKKwkJCQljcF9iaXRzW0ZJX1JHQkFfR1JFRU5dID0gYmtjLnJnYkdyZWVuOworCQkJCWNwX2JpdHNbRklfUkdCQV9SRURdID0gYmtjLnJnYlJlZDsKKwkJCX0KKwkJCWVsc2UgaWYoYWxwaGEgPT0gMjU1KSB7CisJCQkJLy8gb3V0cHV0ID0gZm9yZWdyb3VuZAorCQkJCWNwX2JpdHNbRklfUkdCQV9CTFVFXSA9IGZnYy5yZ2JCbHVlOworCQkJCWNwX2JpdHNbRklfUkdCQV9HUkVFTl0gPSBmZ2MucmdiR3JlZW47CisJCQkJY3BfYml0c1tGSV9SR0JBX1JFRF0gPSBmZ2MucmdiUmVkOworCQkJfQorCQkJZWxzZSB7CisJCQkJLy8gb3V0cHV0ID0gYWxwaGEgKiBmb3JlZ3JvdW5kICsgKDEtYWxwaGEpICogYmFja2dyb3VuZAorCQkJCW5vdF9hbHBoYSA9IChCWVRFKX5hbHBoYTsKKwkJCQljcF9iaXRzW0ZJX1JHQkFfQkxVRV0gPSAoQllURSkoKGFscGhhICogKFdPUkQpZmdjLnJnYkJsdWUgICsgbm90X2FscGhhICogKFdPUkQpYmtjLnJnYkJsdWUpID4+IDgpOworCQkJCWNwX2JpdHNbRklfUkdCQV9HUkVFTl0gPSAoQllURSkoKGFscGhhICogKFdPUkQpZmdjLnJnYkdyZWVuICsgbm90X2FscGhhICogKFdPUkQpYmtjLnJnYkdyZWVuKSA+PiA4KTsKKwkJCQljcF9iaXRzW0ZJX1JHQkFfUkVEXSA9IChCWVRFKSgoYWxwaGEgKiAoV09SRClmZ2MucmdiUmVkICAgKyBub3RfYWxwaGEgKiAoV09SRClia2MucmdiUmVkKSA+PiA4KTsKKwkJCX0KKworCQkJZmdfYml0cyArPSBieXRlc3BwOworCQkJYmdfYml0cyArPSAzOworCQkJY3BfYml0cyArPSAzOworCQl9CisJfQorCisJLy8gY29weSBtZXRhZGF0YSBmcm9tIHNyYyB0byBkc3QKKwlGcmVlSW1hZ2VfQ2xvbmVNZXRhZGF0YShjb21wb3NpdGUsIGZnKTsKKwkKKwlyZXR1cm4gY29tcG9zaXRlOwkKK30KKworLyoqCitQcmUtbXVsdGlwbGllcyBhIDMyLWJpdCBpbWFnZSdzIHJlZC0sIGdyZWVuLSBhbmQgYmx1ZSBjaGFubmVscyB3aXRoIGl0J3MgYWxwaGEgY2hhbm5lbCAKK2ZvciB0byBiZSB1c2VkIHdpdGggZS5nLiB0aGUgV2luZG93cyBHREkgZnVuY3Rpb24gQWxwaGFCbGVuZCgpLiAKK1RoZSB0cmFuc2Zvcm1hdGlvbiBjaGFuZ2VzIHRoZSByZWQtLCBncmVlbi0gYW5kIGJsdWUgY2hhbm5lbHMgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgZXF1YXRpb246ICAKK2NoYW5uZWwoeCwgeSkgPSBjaGFubmVsKHgsIHkpICogYWxwaGFfY2hhbm5lbCh4LCB5KSAvIDI1NSAgCitAcGFyYW0gZGliIElucHV0L091dHB1dCBkaWIgdG8gYmUgcHJlbXVsdGlwbGllZAorQHJldHVybiBSZXR1cm5zIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb3RoZXJ3aXNlIChlLmcuIHdoZW4gdGhlIGJpdGRlcHRoIG9mIHRoZSBzb3VyY2UgZGliIGNhbm5vdCBiZSBoYW5kbGVkKS4gCisqLworQk9PTCBETExfQ0FMTENPTlYgCitGcmVlSW1hZ2VfUHJlTXVsdGlwbHlXaXRoQWxwaGEoRklCSVRNQVAgKmRpYikgeworCWlmICghRnJlZUltYWdlX0hhc1BpeGVscyhkaWIpKSByZXR1cm4gRkFMU0U7CisJCisJaWYgKChGcmVlSW1hZ2VfR2V0QlBQKGRpYikgIT0gMzIpIHx8IChGcmVlSW1hZ2VfR2V0SW1hZ2VUeXBlKGRpYikgIT0gRklUX0JJVE1BUCkpIHsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWludCB3aWR0aCA9IEZyZWVJbWFnZV9HZXRXaWR0aChkaWIpOworCWludCBoZWlnaHQgPSBGcmVlSW1hZ2VfR2V0SGVpZ2h0KGRpYik7CisKKwlmb3IoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJQllURSAqYml0cyA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIHkpOworCQlmb3IgKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4KyssIGJpdHMgKz0gNCkgeworCQkJY29uc3QgQllURSBhbHBoYSA9IGJpdHNbRklfUkdCQV9BTFBIQV07CisJCQkvLyBzbGlnaHRseSBmYXN0ZXI6IGNhcmUgZm9yIHR3byBzcGVjaWFsIGNhc2VzCisJCQlpZihhbHBoYSA9PSAweDAwKSB7CisJCQkJLy8gc3BlY2lhbCBjYXNlIGZvciBhbHBoYSA9PSAweDAwCisJCQkJLy8gY29sb3IgKiAweDAwIC8gMHhGRiA9IDB4MDAKKwkJCQliaXRzW0ZJX1JHQkFfQkxVRV0gPSAweDAwOworCQkJCWJpdHNbRklfUkdCQV9HUkVFTl0gPSAweDAwOworCQkJCWJpdHNbRklfUkdCQV9SRURdID0gMHgwMDsKKwkJCX0gZWxzZSBpZihhbHBoYSA9PSAweEZGKSB7CisJCQkJLy8gbm90aGluZyB0byBkbyBmb3IgYWxwaGEgPT0gMHhGRgorCQkJCS8vIGNvbG9yICogMHhGRiAvIDB4RkYgPSBjb2xvcgorCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIHsKKwkJCQliaXRzW0ZJX1JHQkFfQkxVRV0gPSAoQllURSkoIChhbHBoYSAqIChXT1JEKWJpdHNbRklfUkdCQV9CTFVFXSArIDEyNykgLyAyNTUgKTsKKwkJCQliaXRzW0ZJX1JHQkFfR1JFRU5dID0gKEJZVEUpKCAoYWxwaGEgKiAoV09SRCliaXRzW0ZJX1JHQkFfR1JFRU5dICsgMTI3KSAvIDI1NSApOworCQkJCWJpdHNbRklfUkdCQV9SRURdID0gKEJZVEUpKCAoYWxwaGEgKiAoV09SRCliaXRzW0ZJX1JHQkFfUkVEXSArIDEyNykgLyAyNTUgKTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gVFJVRTsKK30KKwpkaWZmIC0tZ2l0IGEvZmlsZXMvU291cmNlL0ZyZWVJbWFnZVRvb2xraXQvRmlsdGVycy5oIGIvZmlsZXMvU291cmNlL0ZyZWVJbWFnZVRvb2xraXQvRmlsdGVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNDVjNDkKLS0tIC9kZXYvbnVsbAorKysgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlVG9vbGtpdC9GaWx0ZXJzLmgKQEAgLTAsMCArMSwyODcgQEAKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFVwc2FtcGxpbmcgLyBkb3duc2FtcGxpbmcgZmlsdGVycworLy8KKy8vIERlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gYnkKKy8vIC0gSGVydukgRHJvbG9uIChkcm9sb25AaW5mb25pZS5mcikKKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBGcmVlSW1hZ2UgMworLy8KKy8vIENPVkVSRUQgQ09ERSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWQorLy8gT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMKKy8vIFRIQVQgVEhFIENPVkVSRUQgQ09ERSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLy8gT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQKKy8vIENPREUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkgQ09WRVJFRCBDT0RFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QKKy8vIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZCisvLyBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMCisvLyBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GIEFOWSBDT1ZFUkVEIENPREUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSCisvLyBUSElTIERJU0NMQUlNRVIuCisvLworLy8gVXNlIGF0IHlvdXIgb3duIHJpc2shCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpZm5kZWYgX0ZJTFRFUlNfSF8KKyNkZWZpbmUgX0ZJTFRFUlNfSF8KKworLyoqCisgQ0dlbmVyaWNGaWx0ZXIgaXMgYSBnZW5lcmljIGFic3RyYWN0IGZpbHRlciBjbGFzcyB1c2VkIHRvIGFjY2VzcyB0byB0aGUgZmlsdGVyIGxpYnJhcnkuPGJyPgorIEZpbHRlcnMgdXNlZCBpbiB0aGlzIGxpYnJhcnkgaGF2ZSBiZWVuIG1haW5seSB0YWtlbiBmcm9tIHRoZSBmb2xsb3dpbmcgcmVmZXJlbmNlcyA6IDxicj4KKzxiPk1haW4gcmVmZXJlbmNlPC9iPiA6IDxicj4KK1BhdWwgSGVja2JlcnQsIEMgY29kZSB0byB6b29tIHJhc3RlciBpbWFnZXMgdXAgb3IgZG93biwgd2l0aCBuaWNlIGZpbHRlcmluZy4gCitVQyBCZXJrZWxleSwgQXVndXN0IDE5ODkuIFtvbmxpbmVdIGh0dHA6Ly93d3ctMi5jcy5jbXUuZWR1L2Fmcy9jcy5jbXUuZWR1L1dlYi9QZW9wbGUvcGgvaGVja2JlcnQuaHRtbAorCis8Yj5IZWNrYmVydCByZWZlcmVuY2VzPC9iPiA6IDxicj4KKzx1bD4KKzxsaT5PcHBlbmhlaW0gQS5WLiwgU2NoYWZlciBSLlcuLCBEaWdpdGFsIFNpZ25hbCBQcm9jZXNzaW5nLCBQcmVudGljZS1IYWxsLCAxOTc1Cis8bGk+SGFtbWluZyBSLlcuLCBEaWdpdGFsIEZpbHRlcnMsIFByZW50aWNlLUhhbGwsIEVuZ2xld29vZCBDbGlmZnMsIE5KLCAxOTgzCis8bGk+UHJhdHQgVy5LLiwgRGlnaXRhbCBJbWFnZSBQcm9jZXNzaW5nLCBKb2huIFdpbGV5IGFuZCBTb25zLCAxOTc4Cis8bGk+SG91IEguUy4sIEFuZHJld3MgSC5DLiwgIkN1YmljIFNwbGluZXMgZm9yIEltYWdlIEludGVycG9sYXRpb24gYW5kIERpZ2l0YWwgRmlsdGVyaW5nIiwgCitJRUVFIFRyYW5zLiBBY291c3RpY3MsIFNwZWVjaCwgYW5kIFNpZ25hbCBQcm9jLiwgdm9sLiBBU1NQLTI2LCBuby4gNiwgcHAuIDUwOC01MTcsIERlYy4gMTk3OC4KKzwvdWw+CisKKyovCitjbGFzcyBDR2VuZXJpY0ZpbHRlcgoreworcHJvdGVjdGVkOgorCisgICAgI2RlZmluZSBGSUxURVJfUEkgIGRvdWJsZSAoMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjI2NDMzODMyNzk1KQorICAgICNkZWZpbmUgRklMVEVSXzJQSSBkb3VibGUgKDIuMCAqIDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYyNjQzMzgzMjc5NSkKKyAgICAjZGVmaW5lIEZJTFRFUl80UEkgZG91YmxlICg0LjAgKiAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2MjY0MzM4MzI3OTUpCisKKyAgICAvLy8gRmlsdGVyIHN1cHBvcnQKKwlkb3VibGUgIG1fZFdpZHRoOworCitwdWJsaWM6CisgICAgCisgICAgLy8vIENvbnN0cnVjdG9yCisJQ0dlbmVyaWNGaWx0ZXIgKGRvdWJsZSBkV2lkdGgpIDogbV9kV2lkdGggKGRXaWR0aCkge30KKwkvLy8gRGVzdHJ1Y3RvcgorICAgIHZpcnR1YWwgfkNHZW5lcmljRmlsdGVyKCkge30KKworICAgIC8vLyBSZXR1cm5zIHRoZSBmaWx0ZXIgc3VwcG9ydAorCWRvdWJsZSBHZXRXaWR0aCgpICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIG1fZFdpZHRoOyB9CisJLy8vIENoYW5nZSB0aGUgZmlsdGVyIHN1cG9ydAorICAgIHZvaWQgICBTZXRXaWR0aCAoZG91YmxlIGRXaWR0aCkgICAgIHsgbV9kV2lkdGggPSBkV2lkdGg7IH0KKworICAgIC8vLyBSZXR1cm5zIEYoZFZhbCkgd2hlcmUgRiBpcyB0aGUgZmlsdGVyJ3MgaW1wdWxzZSByZXNwb25zZQorCXZpcnR1YWwgZG91YmxlIEZpbHRlciAoZG91YmxlIGRWYWwpID0gMDsKK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGaWx0ZXJzIGxpYnJhcnkKKy8vIEFsbCBmaWx0ZXJzIGFyZSBjZW50ZXJlZCBvbiAwCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKioKKyBCb3ggZmlsdGVyPGJyPgorIEJveCwgcHVsc2UsIEZvdXJpZXIgd2luZG93LCAxc3Qgb3JkZXIgKGNvbnN0YW50KSBiLXNwbGluZS48YnI+PGJyPgorCisgPGI+UmVmZXJlbmNlPC9iPiA6IDxicj4KKyBHbGFzc25lciBBLlMuLCBQcmluY2lwbGVzIG9mIGRpZ2l0YWwgaW1hZ2Ugc3ludGhlc2lzLiBNb3JnYW4gS2F1Zm1hbm4gUHVibGlzaGVycywgSW5jLCBTYW4gRnJhbmNpc2NvLCBWb2wuIDIsIDE5OTUKKyovCitjbGFzcyBDQm94RmlsdGVyIDogcHVibGljIENHZW5lcmljRmlsdGVyCit7CitwdWJsaWM6CisgICAgLyoqCisJQ29uc3RydWN0b3I8YnI+CisJRGVmYXVsdCBmaXhlZCB3aWR0aCA9IDAuNQorCSovCisgICAgQ0JveEZpbHRlcigpIDogQ0dlbmVyaWNGaWx0ZXIoMC41KSB7fQorICAgIHZpcnR1YWwgfkNCb3hGaWx0ZXIoKSB7fQorCisgICAgZG91YmxlIEZpbHRlciAoZG91YmxlIGRWYWwpIHsgcmV0dXJuIChmYWJzKGRWYWwpIDw9IG1fZFdpZHRoID8gMS4wIDogMC4wKTsgfQorfTsKKworLyoqIEJpbGluZWFyIGZpbHRlcgorKi8KK2NsYXNzIENCaWxpbmVhckZpbHRlciA6IHB1YmxpYyBDR2VuZXJpY0ZpbHRlcgoreworcHVibGljOgorCisgICAgQ0JpbGluZWFyRmlsdGVyICgpIDogQ0dlbmVyaWNGaWx0ZXIoMSkge30KKyAgICB2aXJ0dWFsIH5DQmlsaW5lYXJGaWx0ZXIoKSB7fQorCisgICAgZG91YmxlIEZpbHRlciAoZG91YmxlIGRWYWwpIHsKKwkJZFZhbCA9IGZhYnMoZFZhbCk7IAorCQlyZXR1cm4gKGRWYWwgPCBtX2RXaWR0aCA/IG1fZFdpZHRoIC0gZFZhbCA6IDAuMCk7IAorCX0KK307CisKKworLyoqCisgTWl0Y2hlbGwgJiBOZXRyYXZhbGkncyB0d28tcGFyYW0gY3ViaWMgZmlsdGVyPGJyPgorCisgVGhlIHBhcmFtZXRlcnMgYiBhbmQgYyBjYW4gYmUgdXNlZCB0byBhZGp1c3QgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGN1YmljLiAKKyBUaGV5IGFyZSBzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgImJsdXJyaW5nIiBhbmQgInJpbmdpbmciIHJlc3BlY3RpdmVseS4gCisgVGhlIGRlZmF1bHQgaXMgYiA9IDEvMyBhbmQgYyA9IDEvMywgd2hpY2ggd2VyZSB0aGUgdmFsdWVzIHJlY29tbWVuZGVkIGJ5IAorIE1pdGNoZWxsIGFuZCBOZXRyYXZhbGkgYXMgeWllbGRpbmcgdGhlIG1vc3QgdmlzdWFsbHkgcGxlYXNpbmcgcmVzdWx0cyBpbiBzdWJqZWN0aXZlIHRlc3RzIG9mIGh1bWFuIGJlaW5ncy4gCisgTGFyZ2VyIHZhbHVlcyBvZiBiIGFuZCBjIGNhbiBwcm9kdWNlIGludGVyZXN0aW5nIG9wLWFydCBlZmZlY3RzLS1mb3IgZXhhbXBsZSwgdHJ5IGIgPSAwIGFuZCBjID0gLTUuIDxicj48YnI+CisKKyA8Yj5SZWZlcmVuY2U8L2I+IDogPGJyPgorIERvbiBQLiBNaXRjaGVsbCBhbmQgQXJ1biBOLiBOZXRyYXZhbGksIFJlY29uc3RydWN0aW9uIGZpbHRlcnMgaW4gY29tcHV0ZXIgZ3JhcGhpY3MuIAorIEluIEpvaG4gRGlsbCwgZWRpdG9yLCBDb21wdXRlciBHcmFwaGljcyAoU0lHR1JBUEggJzg4IFByb2NlZWRpbmdzKSwgVm9sLiAyMiwgTm8uIDQsIEF1Z3VzdCAxOTg4LCBwcC4gMjIxLTIyOC4KKyovCitjbGFzcyBDQmljdWJpY0ZpbHRlciA6IHB1YmxpYyBDR2VuZXJpY0ZpbHRlcgoreworcHJvdGVjdGVkOgorCS8vIGRhdGEgZm9yIHBhcmFtZXRlcml6ZWQgTWl0Y2hlbGwgZmlsdGVyCisgICAgZG91YmxlIHAwLCBwMiwgcDM7CisgICAgZG91YmxlIHEwLCBxMSwgcTIsIHEzOworCitwdWJsaWM6CisgICAgLyoqCisJQ29uc3RydWN0b3I8YnI+CisJRGVmYXVsdCBmaXhlZCB3aWR0aCA9IDIKKwlAcGFyYW0gYiBGaWx0ZXIgcGFyYW1ldGVyIChkZWZhdWx0IHZhbHVlIGlzIDEvMykKKwlAcGFyYW0gYyBGaWx0ZXIgcGFyYW1ldGVyIChkZWZhdWx0IHZhbHVlIGlzIDEvMykKKwkqLworICAgIENCaWN1YmljRmlsdGVyIChkb3VibGUgYiA9ICgxLyhkb3VibGUpMyksIGRvdWJsZSBjID0gKDEvKGRvdWJsZSkzKSkgOiBDR2VuZXJpY0ZpbHRlcigyKSB7CisJCXAwID0gKDYgLSAyKmIpIC8gNjsKKwkJcDIgPSAoLTE4ICsgMTIqYiArIDYqYykgLyA2OworCQlwMyA9ICgxMiAtIDkqYiAtIDYqYykgLyA2OworCQlxMCA9ICg4KmIgKyAyNCpjKSAvIDY7CisJCXExID0gKC0xMipiIC0gNDgqYykgLyA2OworCQlxMiA9ICg2KmIgKyAzMCpjKSAvIDY7CisJCXEzID0gKC1iIC0gNipjKSAvIDY7CisJfQorICAgIHZpcnR1YWwgfkNCaWN1YmljRmlsdGVyKCkge30KKworICAgIGRvdWJsZSBGaWx0ZXIoZG91YmxlIGRWYWwpIHsgCisJCWRWYWwgPSBmYWJzKGRWYWwpOworCQlpZihkVmFsIDwgMSkKKwkJCXJldHVybiAocDAgKyBkVmFsKmRWYWwqKHAyICsgZFZhbCpwMykpOworCQlpZihkVmFsIDwgMikKKwkJCXJldHVybiAocTAgKyBkVmFsKihxMSArIGRWYWwqKHEyICsgZFZhbCpxMykpKTsKKwkJcmV0dXJuIDA7CisJfQorfTsKKworLyoqCisgQ2F0bXVsbC1Sb20gc3BsaW5lLCBPdmVyaGF1c2VyIHNwbGluZTxicj4KKworIFdoZW4gdXNpbmcgQ0JpY3ViaWNGaWx0ZXIgZmlsdGVycywgeW91IGhhdmUgdG8gc2V0IHBhcmFtZXRlcnMgYiBhbmQgYyBzdWNoIHRoYXQgPGJyPgorIGIgKyAyICogYyA9IDE8YnI+CisgaW4gb3JkZXIgdG8gdXNlIHRoZSBudW1lcmljYWxseSBtb3N0IGFjY3VyYXRlIGZpbHRlci48YnI+CisgVGhpcyBnaXZlcyBmb3IgYiA9IDAgdGhlIG1heGltdW0gdmFsdWUgZm9yIGMgPSAwLjUsIHdoaWNoIGlzIHRoZSBDYXRtdWxsLVJvbSAKKyBzcGxpbmUgYW5kIGEgZ29vZCBzdWdnZXN0aW9uIGZvciBzaGFycG5lc3MuPGJyPjxicj4KKworCisgPGI+UmVmZXJlbmNlczwvYj4gOiA8YnI+CisgPHVsPgorIDxsaT5NaXRjaGVsbCBEb24gUC4sIE5ldHJhdmFsaSBBcnVuIE4uLCBSZWNvbnN0cnVjdGlvbiBmaWx0ZXJzIGluIGNvbXB1dGVyIGdyYXBoaWNzLiAKKyBJbiBKb2huIERpbGwsIGVkaXRvciwgQ29tcHV0ZXIgR3JhcGhpY3MgKFNJR0dSQVBIICc4OCBQcm9jZWVkaW5ncyksIFZvbC4gMjIsIE5vLiA0LCBBdWd1c3QgMTk4OCwgcHAuIDIyMS0yMjguCisgPGxpPktleXMgUi5HLiwgQ3ViaWMgQ29udm9sdXRpb24gSW50ZXJwb2xhdGlvbiBmb3IgRGlnaXRhbCBJbWFnZSBQcm9jZXNzaW5nLiAKKyBJRUVFIFRyYW5zLiBBY291c3RpY3MsIFNwZWVjaCwgYW5kIFNpZ25hbCBQcm9jZXNzaW5nLCB2b2wuIDI5LCBuby4gNiwgcHAuIDExNTMtMTE2MCwgRGVjLiAxOTgxLgorIDwvdWw+CisKKyovCitjbGFzcyBDQ2F0bXVsbFJvbUZpbHRlciA6IHB1YmxpYyBDR2VuZXJpY0ZpbHRlcgoreworcHVibGljOgorCisgICAgLyoqCisJQ29uc3RydWN0b3I8YnI+CisJRGVmYXVsdCBmaXhlZCB3aWR0aCA9IDIKKwkqLworCUNDYXRtdWxsUm9tRmlsdGVyKCkgOiBDR2VuZXJpY0ZpbHRlcigyKSB7fQorICAgIHZpcnR1YWwgfkNDYXRtdWxsUm9tRmlsdGVyKCkge30KKworICAgIGRvdWJsZSBGaWx0ZXIoZG91YmxlIGRWYWwpIHsgCisJCWlmKGRWYWwgPCAtMikgcmV0dXJuIDA7CisJCWlmKGRWYWwgPCAtMSkgcmV0dXJuICgwLjUqKDQgKyBkVmFsKig4ICsgZFZhbCooNSArIGRWYWwpKSkpOworCQlpZihkVmFsIDwgMCkgIHJldHVybiAoMC41KigyICsgZFZhbCpkVmFsKigtNSAtIDMqZFZhbCkpKTsKKwkJaWYoZFZhbCA8IDEpICByZXR1cm4gKDAuNSooMiArIGRWYWwqZFZhbCooLTUgKyAzKmRWYWwpKSk7CisJCWlmKGRWYWwgPCAyKSAgcmV0dXJuICgwLjUqKDQgKyBkVmFsKigtOCArIGRWYWwqKDUgLSBkVmFsKSkpKTsKKwkJcmV0dXJuIDA7CisJfQorfTsKKworLyoqCisgTGFuY3pvcy13aW5kb3dlZCBzaW5jIGZpbHRlcjxicj4KKyAKKyBMYW5jem9zMyBmaWx0ZXIgaXMgYW4gYWx0ZXJuYXRpdmUgdG8gQ0JpY3ViaWNGaWx0ZXIgd2l0aCBoaWdoIHZhbHVlcyBvZiBjIGFib3V0IDAuNiAuLi4gMC43NSAKKyB3aGljaCBwcm9kdWNlcyBxdWl0ZSBzdHJvbmcgc2hhcnBlbmluZy4gSXQgdXN1YWxseSBvZmZlcnMgYmV0dGVyIHF1YWxpdHkgKGZld2VyIGFydGlmYWN0cykgYW5kIGEgc2hhcnAgaW1hZ2UuPGJyPjxicj4KKworKi8KK2NsYXNzIENMYW5jem9zM0ZpbHRlciA6IHB1YmxpYyBDR2VuZXJpY0ZpbHRlcgoreworcHVibGljOgorICAgIC8qKgorCUNvbnN0cnVjdG9yPGJyPgorCURlZmF1bHQgZml4ZWQgd2lkdGggPSAzCisJKi8KKwlDTGFuY3pvczNGaWx0ZXIoKSA6IENHZW5lcmljRmlsdGVyKDMpIHt9CisgICAgdmlydHVhbCB+Q0xhbmN6b3MzRmlsdGVyKCkge30KKworICAgIGRvdWJsZSBGaWx0ZXIoZG91YmxlIGRWYWwpIHsgCisJCWRWYWwgPSBmYWJzKGRWYWwpOyAKKwkJaWYoZFZhbCA8IG1fZFdpZHRoKQl7CisJCQlyZXR1cm4gKHNpbmMoZFZhbCkgKiBzaW5jKGRWYWwgLyBtX2RXaWR0aCkpOworCQl9CisJCXJldHVybiAwOworCX0KKworcHJpdmF0ZToKKwlkb3VibGUgc2luYyhkb3VibGUgdmFsdWUpIHsKKwkJaWYodmFsdWUgIT0gMCkgeworCQkJdmFsdWUgKj0gRklMVEVSX1BJOworCQkJcmV0dXJuIChzaW4odmFsdWUpIC8gdmFsdWUpOworCQl9IAorCQlyZXR1cm4gMTsKKwl9Cit9OworCisvKioKKyA0dGggb3JkZXIgKGN1YmljKSBiLXNwbGluZTxicj4KKworKi8KK2NsYXNzIENCU3BsaW5lRmlsdGVyIDogcHVibGljIENHZW5lcmljRmlsdGVyCit7CitwdWJsaWM6CisKKyAgICAvKioKKwlDb25zdHJ1Y3Rvcjxicj4KKwlEZWZhdWx0IGZpeGVkIHdpZHRoID0gMgorCSovCisJQ0JTcGxpbmVGaWx0ZXIoKSA6IENHZW5lcmljRmlsdGVyKDIpIHt9CisgICAgdmlydHVhbCB+Q0JTcGxpbmVGaWx0ZXIoKSB7fQorCisgICAgZG91YmxlIEZpbHRlcihkb3VibGUgZFZhbCkgeyAKKworCQlkVmFsID0gZmFicyhkVmFsKTsKKwkJaWYoZFZhbCA8IDEpIHJldHVybiAoNCArIGRWYWwqZFZhbCooLTYgKyAzKmRWYWwpKSAvIDY7CisJCWlmKGRWYWwgPCAyKSB7CisJCQlkb3VibGUgdCA9IDIgLSBkVmFsOworCQkJcmV0dXJuICh0KnQqdCAvIDYpOworCQl9CisJCXJldHVybiAwOworCX0KK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBXaW5kb3cgZnVuY3Rpb24gbGlicmFyeQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoqIAorIEJsYWNrbWFuIHdpbmRvdworKi8KK2NsYXNzIENCbGFja21hbkZpbHRlciA6IHB1YmxpYyBDR2VuZXJpY0ZpbHRlcgoreworcHVibGljOgorICAgIC8qKgorCUNvbnN0cnVjdG9yPGJyPgorCURlZmF1bHQgd2lkdGggPSAwLjUKKwkqLworICAgIENCbGFja21hbkZpbHRlciAoZG91YmxlIGRXaWR0aCA9IGRvdWJsZSgwLjUpKSA6IENHZW5lcmljRmlsdGVyKGRXaWR0aCkge30KKyAgICB2aXJ0dWFsIH5DQmxhY2ttYW5GaWx0ZXIoKSB7fQorCisgICAgZG91YmxlIEZpbHRlciAoZG91YmxlIGRWYWwpIHsKKwkJaWYoZmFicyAoZFZhbCkgPiBtX2RXaWR0aCkgeworCQkJcmV0dXJuIDA7IAorICAgICAgICB9CisgICAgICAgIGRvdWJsZSBkTiA9IDIgKiBtX2RXaWR0aCArIDE7IAorCQlkVmFsIC89IChkTiAtIDEpOworICAgICAgICByZXR1cm4gMC40MiArIDAuNSpjb3MoRklMVEVSXzJQSSpkVmFsKSArIDAuMDgqY29zKEZJTFRFUl80UEkqZFZhbCk7IAorICAgIH0KK307CisKKyNlbmRpZiAgLy8gX0ZJTFRFUlNfSF8KZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2VUb29sa2l0L0ZsaXAuY3BwIGIvZmlsZXMvU291cmNlL0ZyZWVJbWFnZVRvb2xraXQvRmxpcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc4OThhNwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2VUb29sa2l0L0ZsaXAuY3BwCkBAIC0wLDAgKzEsMTY2IEBACisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBGbGlwcGluZyByb3V0aW5lcworLy8KKy8vIERlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gYnkKKy8vIC0gRmxvcmlzIHZhbiBkZW4gQmVyZyAoZmx2ZGJlcmdAd3hzLm5sKQorLy8gLSBIZXJ26SBEcm9sb24gKGRyb2xvbkBpbmZvbmllLmZyKQorLy8gLSBKaW0gS2VpciAoamlta2VpckB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQpCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRnJlZUltYWdlIDMKKy8vCisvLyBDT1ZFUkVEIENPREUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkKKy8vIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTCisvLyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy8vIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVECisvLyBDT0RFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UCisvLyBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWQorLy8gU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTAorLy8gUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUgorLy8gVEhJUyBESVNDTEFJTUVSLgorLy8KKy8vIFVzZSBhdCB5b3VyIG93biByaXNrIQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaW5jbHVkZSAiRnJlZUltYWdlLmgiCisjaW5jbHVkZSAiVXRpbGl0aWVzLmgiCisKKy8qKgorRmxpcCB0aGUgaW1hZ2UgaG9yaXpvbnRhbGx5IGFsb25nIHRoZSB2ZXJ0aWNhbCBheGlzLgorQHBhcmFtIHNyYyBJbnB1dCBpbWFnZSB0byBiZSBwcm9jZXNzZWQuCitAcmV0dXJuIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UuCisqLworQk9PTCBETExfQ0FMTENPTlYgCitGcmVlSW1hZ2VfRmxpcEhvcml6b250YWwoRklCSVRNQVAgKnNyYykgeworCWlmICghRnJlZUltYWdlX0hhc1BpeGVscyhzcmMpKSByZXR1cm4gRkFMU0U7CisKKwl1bnNpZ25lZCBsaW5lICAgPSBGcmVlSW1hZ2VfR2V0TGluZShzcmMpOworCXVuc2lnbmVkIHdpZHRoCT0gRnJlZUltYWdlX0dldFdpZHRoKHNyYyk7CisJdW5zaWduZWQgaGVpZ2h0ID0gRnJlZUltYWdlX0dldEhlaWdodChzcmMpOworCisJdW5zaWduZWQgYnl0ZXNwcCA9IEZyZWVJbWFnZV9HZXRMaW5lKHNyYykgLyBGcmVlSW1hZ2VfR2V0V2lkdGgoc3JjKTsKKworCS8vIGNvcHkgYmV0d2VlbiBhbGlnbmVkIG1lbW9yaWVzCisJQllURSAqbmV3X2JpdHMgPSAoQllURSopRnJlZUltYWdlX0FsaWduZWRfTWFsbG9jKGxpbmUgKiBzaXplb2YoQllURSksIEZJQklUTUFQX0FMSUdOTUVOVCk7CisJaWYgKCFuZXdfYml0cykgcmV0dXJuIEZBTFNFOworCisJLy8gbWlycm9yIHRoZSBidWZmZXIKKworCWZvciAodW5zaWduZWQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworCQlCWVRFICpiaXRzID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKHNyYywgeSk7CisJCW1lbWNweShuZXdfYml0cywgYml0cywgbGluZSk7CisKKwkJc3dpdGNoIChGcmVlSW1hZ2VfR2V0QlBQKHNyYykpIHsKKwkJCWNhc2UgMSA6CisJCQl7CQkJCQorCQkJCWZvcih1bnNpZ25lZCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQkJLy8gZ2V0IHBpeGVsIGF0ICh4LCB5KQorCQkJCQlCT09MIHZhbHVlID0gKG5ld19iaXRzW3ggPj4gM10gJiAoMHg4MCA+PiAoeCAmIDB4MDcpKSkgIT0gMDsKKwkJCQkJLy8gc2V0IHBpeGVsIGF0IChuZXdfeCwgeSkKKwkJCQkJdW5zaWduZWQgbmV3X3ggPSB3aWR0aCAtIDEgLSB4OworCQkJCQl2YWx1ZSA/IGJpdHNbbmV3X3ggPj4gM10gfD0gKDB4ODAgPj4gKG5ld194ICYgMHg3KSkgOiBiaXRzW25ld194ID4+IDNdICY9ICgweGZmN2YgPj4gKG5ld194ICYgMHg3KSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJCWNhc2UgNCA6CisJCQl7CisJCQkJZm9yKHVuc2lnbmVkIGMgPSAwOyBjIDwgbGluZTsgYysrKSB7CisJCQkJCWJpdHNbY10gPSBuZXdfYml0c1tsaW5lIC0gYyAtIDFdOworCisJCQkJCUJZVEUgbmliYmxlID0gKGJpdHNbY10gJiAweEYwKSA+PiA0OworCisJCQkJCWJpdHNbY10gPSBiaXRzW2NdIDw8IDQ7CisJCQkJCWJpdHNbY10gfD0gbmliYmxlOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCQljYXNlIDg6CisJCQl7CQkJCQorCQkJCUJZVEUgKmRzdF9kYXRhID0gKEJZVEUqKSBiaXRzOyAJCQkJCisJCQkJQllURSAqc3JjX2RhdGEgPSAoQllURSopIChuZXdfYml0cyArIGxpbmUgLSBieXRlc3BwKTsgCQkJCQorCQkJCWZvcih1bnNpZ25lZCBjID0gMDsgYyA8IHdpZHRoOyBjKyspIHsgCQkJCisJCQkJCSpkc3RfZGF0YSsrID0gKnNyY19kYXRhLS07ICAKKwkJCQl9IAorCQkJfQorCQkJYnJlYWs7CisKKwkJCWNhc2UgMTY6CisJCQl7CQkJCQorCQkJCVdPUkQgKmRzdF9kYXRhID0gKFdPUkQqKSBiaXRzOyAJCQkJCisJCQkJV09SRCAqc3JjX2RhdGEgPSAoV09SRCopIChuZXdfYml0cyArIGxpbmUgLSBieXRlc3BwKTsgCQkJCQorCQkJCWZvcih1bnNpZ25lZCBjID0gMDsgYyA8IHdpZHRoOyBjKyspIHsgCQkJCisJCQkJCSpkc3RfZGF0YSsrID0gKnNyY19kYXRhLS07ICAKKwkJCQl9IAorCQkJfQorCQkJYnJlYWs7CisKKwkJCWNhc2UgMjQgOgorCQkJY2FzZSAzMiA6CisJCQljYXNlIDQ4OgorCQkJY2FzZSA2NDoKKwkJCWNhc2UgOTY6CisJCQljYXNlIDEyODoKKwkJCXsJCQkJCisJCQkJQllURSAqZHN0X2RhdGEgPSAoQllURSopIGJpdHM7IAkJCQkKKwkJCQlCWVRFICpzcmNfZGF0YSA9IChCWVRFKikgKG5ld19iaXRzICsgbGluZSAtIGJ5dGVzcHApOyAJCQkJCisJCQkJZm9yKHVuc2lnbmVkIGMgPSAwOyBjIDwgd2lkdGg7IGMrKykgeyAJCQorCQkJCQlmb3IodW5zaWduZWQgayA9IDA7IGsgPCBieXRlc3BwOyBrKyspIHsKKwkJCQkJCSpkc3RfZGF0YSsrID0gc3JjX2RhdGFba107ICAKKwkJCQkJfQorCQkJCQlzcmNfZGF0YSAtPSBieXRlc3BwOworCQkJCX0gCisJCQl9CisJCQlicmVhazsKKworCQl9CisJfQorCisJRnJlZUltYWdlX0FsaWduZWRfRnJlZShuZXdfYml0cyk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworCisvKioKK0ZsaXAgdGhlIGltYWdlIHZlcnRpY2FsbHkgYWxvbmcgdGhlIGhvcml6b250YWwgYXhpcy4KK0BwYXJhbSBzcmMgSW5wdXQgaW1hZ2UgdG8gYmUgcHJvY2Vzc2VkLgorQHJldHVybiBSZXR1cm5zIFRSVUUgaWYgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlLgorKi8KKworQk9PTCBETExfQ0FMTENPTlYgCitGcmVlSW1hZ2VfRmxpcFZlcnRpY2FsKEZJQklUTUFQICpzcmMpIHsKKwlCWVRFICpGcm9tLCAqTWlkOworCisJaWYgKCFGcmVlSW1hZ2VfSGFzUGl4ZWxzKHNyYykpIHJldHVybiBGQUxTRTsKKworCS8vIHN3YXAgdGhlIGJ1ZmZlcgorCisJdW5zaWduZWQgcGl0Y2ggID0gRnJlZUltYWdlX0dldFBpdGNoKHNyYyk7CisJdW5zaWduZWQgaGVpZ2h0ID0gRnJlZUltYWdlX0dldEhlaWdodChzcmMpOworCisJLy8gY29weSBiZXR3ZWVuIGFsaWduZWQgbWVtb3JpZXMKKwlNaWQgPSAoQllURSopRnJlZUltYWdlX0FsaWduZWRfTWFsbG9jKHBpdGNoICogc2l6ZW9mKEJZVEUpLCBGSUJJVE1BUF9BTElHTk1FTlQpOworCWlmICghTWlkKSByZXR1cm4gRkFMU0U7CisKKwlGcm9tID0gRnJlZUltYWdlX0dldEJpdHMoc3JjKTsKKwkKKwl1bnNpZ25lZCBsaW5lX3MgPSAwOworCXVuc2lnbmVkIGxpbmVfdCA9IChoZWlnaHQtMSkgKiBwaXRjaDsKKworCWZvcih1bnNpZ25lZCB5ID0gMDsgeSA8IGhlaWdodC8yOyB5KyspIHsKKworCQltZW1jcHkoTWlkLCBGcm9tICsgbGluZV9zLCBwaXRjaCk7CisJCW1lbWNweShGcm9tICsgbGluZV9zLCBGcm9tICsgbGluZV90LCBwaXRjaCk7CisJCW1lbWNweShGcm9tICsgbGluZV90LCBNaWQsIHBpdGNoKTsKKworCQlsaW5lX3MgKz0gcGl0Y2g7CisJCWxpbmVfdCAtPSBwaXRjaDsKKworCX0KKworCUZyZWVJbWFnZV9BbGlnbmVkX0ZyZWUoTWlkKTsKKworCXJldHVybiBUUlVFOworfQorCmRpZmYgLS1naXQgYS9maWxlcy9Tb3VyY2UvRnJlZUltYWdlVG9vbGtpdC9KUEVHVHJhbnNmb3JtLmNwcCBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2VUb29sa2l0L0pQRUdUcmFuc2Zvcm0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMDNhM2QKLS0tIC9kZXYvbnVsbAorKysgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlVG9vbGtpdC9KUEVHVHJhbnNmb3JtLmNwcApAQCAtMCwwICsxLDYyMyBAQAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gSlBFRyBsb3NzbGVzcyB0cmFuc2Zvcm1hdGlvbnMKKy8vCisvLyBEZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIGJ5CisvLyAtIFBldHIgUHl0ZWxrYSAocHl0YUBsaWdodGNvbXAuY29tKQorLy8gLSBIZXJ2w6kgRHJvbG9uIChkcm9sb25AaW5mb25pZS5mcikKKy8vIC0gTWloYWlsIE5heWRlbm92IChtbmF5ZGVub3ZAdXNlcnMuc291cmNlZm9yZ2UubmV0KQorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZyZWVJbWFnZSAzCisvLworLy8gQ09WRVJFRCBDT0RFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZCisvLyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUworLy8gVEhBVCBUSEUgQ09WRVJFRCBDT0RFIElTIEZSRUUgT0YgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisvLyBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRAorLy8gQ09ERSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVAorLy8gVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GIEFOWSBORUNFU1NBUlkKKy8vIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwKKy8vIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIKKy8vIFRISVMgRElTQ0xBSU1FUi4KKy8vCisvLyBVc2UgYXQgeW91ciBvd24gcmlzayEKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworZXh0ZXJuICJDIiB7CisjZGVmaW5lIFhNRF9ICisjdW5kZWYgRkFSCisjaW5jbHVkZSA8c2V0am1wLmg+CisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9qcGVnL2ppbmNsdWRlLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvanBlZy9qcGVnbGliLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvanBlZy9qZXJyb3IuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9qcGVnL3RyYW5zdXBwLmgiCit9CisKKyNpbmNsdWRlICJGcmVlSW1hZ2UuaCIKKyNpbmNsdWRlICJVdGlsaXRpZXMuaCIKKyNpbmNsdWRlICJGcmVlSW1hZ2VJTy5oIgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgIFNvdXJjZSBtYW5hZ2VyICYgRGVzdGluYXRpb24gbWFuYWdlciBzZXR1cAorLy8gICAoc2VlIFBsdWdpbkpQRUcuY3BwKQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIGpwZWdfZnJlZWltYWdlX3NyYyhqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBmaV9oYW5kbGUgaW5maWxlLCBGcmVlSW1hZ2VJTyAqaW8pOwordm9pZCBqcGVnX2ZyZWVpbWFnZV9kc3Qoal9jb21wcmVzc19wdHIgY2luZm8sIGZpX2hhbmRsZSBvdXRmaWxlLCBGcmVlSW1hZ2VJTyAqaW8pOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgIEVycm9yIGhhbmRsaW5nCisvLyAgIChzZWUgYWxzbyBQbHVnaW5KUEVHLmNwcCkKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoqCisJUmVjZWl2ZXMgY29udHJvbCBmb3IgYSBmYXRhbCBlcnJvci4gIEluZm9ybWF0aW9uIHN1ZmZpY2llbnQgdG8KKwlnZW5lcmF0ZSB0aGUgZXJyb3IgbWVzc2FnZSBoYXMgYmVlbiBzdG9yZWQgaW4gY2luZm8tPmVycjsgY2FsbAorCW91dHB1dF9tZXNzYWdlIHRvIGRpc3BsYXkgaXQuICBDb250cm9sIG11c3QgTk9UIHJldHVybiB0byB0aGUgY2FsbGVyOworCWdlbmVyYWxseSB0aGlzIHJvdXRpbmUgd2lsbCBleGl0KCkgb3IgbG9uZ2ptcCgpIHNvbWV3aGVyZS4KKyovCitNRVRIT0RERUYodm9pZCkKK2xzX2pwZWdfZXJyb3JfZXhpdCAoal9jb21tb25fcHRyIGNpbmZvKSB7CisJLy8gYWx3YXlzIGRpc3BsYXkgdGhlIG1lc3NhZ2UKKwkoKmNpbmZvLT5lcnItPm91dHB1dF9tZXNzYWdlKShjaW5mbyk7CisKKwkvLyBhbGxvdyBKUEVHIHdpdGggYSBwcmVtYXR1cmUgZW5kIG9mIGZpbGUKKwlpZigoY2luZm8pLT5lcnItPm1zZ19wYXJtLmlbMF0gIT0gMTMpIHsKKworCQkvLyBsZXQgdGhlIG1lbW9yeSBtYW5hZ2VyIGRlbGV0ZSBhbnkgdGVtcCBmaWxlcyBiZWZvcmUgd2UgZGllCisJCWpwZWdfZGVzdHJveShjaW5mbyk7CisKKwkJdGhyb3cgRklGX0pQRUc7CisJfQorfQorCisvKioKKwlBY3R1YWwgb3V0cHV0IG9mIGFueSBKUEVHIG1lc3NhZ2UuICBOb3RlIHRoYXQgdGhpcyBtZXRob2QgZG9lcyBub3Qga25vdworCWhvdyB0byBnZW5lcmF0ZSBhIG1lc3NhZ2UsIG9ubHkgd2hlcmUgdG8gc2VuZCBpdC4KKyovCitNRVRIT0RERUYodm9pZCkKK2xzX2pwZWdfb3V0cHV0X21lc3NhZ2UgKGpfY29tbW9uX3B0ciBjaW5mbykgeworCWNoYXIgYnVmZmVyW0pNU0dfTEVOR1RIX01BWF07CisKKwkvLyBjcmVhdGUgdGhlIG1lc3NhZ2UKKwkoKmNpbmZvLT5lcnItPmZvcm1hdF9tZXNzYWdlKShjaW5mbywgYnVmZmVyKTsKKwkvLyBzZW5kIGl0IHRvIHVzZXIncyBtZXNzYWdlIHByb2MKKwlGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2MoRklGX0pQRUcsIGJ1ZmZlcik7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgTWFpbiBwcm9ncmFtCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qKgorQnVpbGQgYSBjcm9wIHN0cmluZy4gCisKK0BwYXJhbSBjcm9wIE91dHB1dCBjcm9wIHN0cmluZworQHBhcmFtIGxlZnQgU3BlY2lmaWVzIHRoZSBsZWZ0IHBvc2l0aW9uIG9mIHRoZSBjcm9wcGVkIHJlY3RhbmdsZQorQHBhcmFtIHRvcCBTcGVjaWZpZXMgdGhlIHRvcCBwb3NpdGlvbiBvZiB0aGUgY3JvcHBlZCByZWN0YW5nbGUKK0BwYXJhbSByaWdodCBTcGVjaWZpZXMgdGhlIHJpZ2h0IHBvc2l0aW9uIG9mIHRoZSBjcm9wcGVkIHJlY3RhbmdsZQorQHBhcmFtIGJvdHRvbSBTcGVjaWZpZXMgdGhlIGJvdHRvbSBwb3NpdGlvbiBvZiB0aGUgY3JvcHBlZCByZWN0YW5nbGUKK0BwYXJhbSB3aWR0aCBJbWFnZSB3aWR0aAorQHBhcmFtIGhlaWdodCBJbWFnZSBoZWlnaHQKK0ByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgRkFMU0Ugb3RoZXJ3aXNlCisqLworc3RhdGljIEJPT0wKK2dldENyb3BTdHJpbmcoY2hhciogY3JvcCwgaW50KiBsZWZ0LCBpbnQqIHRvcCwgaW50KiByaWdodCwgaW50KiBib3R0b20sIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworCWlmKCFsZWZ0IHx8ICF0b3AgfHwgIXJpZ2h0IHx8ICFib3R0b20pIHsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCSpsZWZ0ID0gQ0xBTVAoKmxlZnQsIDAsIHdpZHRoKTsKKwkqdG9wID0gQ0xBTVAoKnRvcCwgMCwgaGVpZ2h0KTsKKworCS8vIG5lZ2F0aXZlL3plcm8gcmlnaHQgYW5kIGJvdHRvbSBjb3VudCBmcm9tIHRoZSBlZGdlcyBpbndhcmRzCisKKwlpZigqcmlnaHQgPD0gMCkgeworCQkqcmlnaHQgPSB3aWR0aCArICpyaWdodDsKKwl9CisJaWYoKmJvdHRvbSA8PSAwKSB7CisJCSpib3R0b20gPSBoZWlnaHQgKyAqYm90dG9tOworCX0KKworCSpyaWdodCA9IENMQU1QKCpyaWdodCwgMCwgd2lkdGgpOworCSpib3R0b20gPSBDTEFNUCgqYm90dG9tLCAwLCBoZWlnaHQpOworCisJLy8gdGVzdCBmb3IgZW1wdHkgcmVjdAorCisJaWYoKCgqbGVmdCAtICpyaWdodCkgPT0gMCkgfHwgKCgqdG9wIC0gKmJvdHRvbSkgPT0gMCkpIHsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCS8vIG5vcm1hbGl6ZSB0aGUgcmVjdGFuZ2xlCisKKwlpZigqcmlnaHQgPCAqbGVmdCkgeworCQlJTlBMQUNFU1dBUCgqbGVmdCwgKnJpZ2h0KTsKKwl9CisJaWYoKmJvdHRvbSA8ICp0b3ApIHsKKwkJSU5QTEFDRVNXQVAoKnRvcCwgKmJvdHRvbSk7CisJfQorCisJLy8gdGVzdCBmb3IgIm5vb3AiIHJlY3QKKworCWlmKCpsZWZ0ID09IDAgJiYgKnJpZ2h0ID09IHdpZHRoICYmICp0b3AgPT0gMCAmJiAqYm90dG9tID09IGhlaWdodCkgeworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJLy8gYnVpbGQgdGhlIGNyb3Agb3B0aW9uCisJc3ByaW50Zihjcm9wLCAiJWR4JWQrJWQrJWQiLCAqcmlnaHQgLSAqbGVmdCwgKmJvdHRvbSAtICp0b3AsICpsZWZ0LCAqdG9wKTsKKworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgQk9PTAorSlBFR1RyYW5zZm9ybUZyb21IYW5kbGUoRnJlZUltYWdlSU8qIHNyY19pbywgZmlfaGFuZGxlIHNyY19oYW5kbGUsIEZyZWVJbWFnZUlPKiBkc3RfaW8sIGZpX2hhbmRsZSBkc3RfaGFuZGxlLCBGUkVFX0lNQUdFX0pQRUdfT1BFUkFUSU9OIG9wZXJhdGlvbiwgaW50KiBsZWZ0LCBpbnQqIHRvcCwgaW50KiByaWdodCwgaW50KiBib3R0b20sIEJPT0wgcGVyZmVjdCkgeworCWNvbnN0IEJPT0wgb25seVJldHVybkNyb3BSZWN0ID0gKGRzdF9pbyA9PSBOVUxMKSB8fCAoZHN0X2hhbmRsZSA9PSBOVUxMKTsKKwljb25zdCBsb25nIHN0cmVhbV9zdGFydCA9IG9ubHlSZXR1cm5Dcm9wUmVjdCA/IDAgOiBkc3RfaW8tPnRlbGxfcHJvYyhkc3RfaGFuZGxlKTsKKwlCT09MIHN3YXBwZWREaW0gPSBGQUxTRTsKKwlCT09MIHRyaW1IID0gRkFMU0U7CisJQk9PTCB0cmltViA9IEZBTFNFOworCisJLy8gU2V0IHVwIHRoZSBqcGVnbGliIHN0cnVjdHVyZXMKKwlqcGVnX2RlY29tcHJlc3Nfc3RydWN0IHNyY2luZm87CisJanBlZ19jb21wcmVzc19zdHJ1Y3QgZHN0aW5mbzsKKwlqcGVnX2Vycm9yX21nciBqc3JjZXJyLCBqZHN0ZXJyOworCWp2aXJ0X2JhcnJheV9wdHIgKnNyY19jb2VmX2FycmF5cyA9IE5VTEw7CisJanZpcnRfYmFycmF5X3B0ciAqZHN0X2NvZWZfYXJyYXlzID0gTlVMTDsKKwkvLyBTdXBwb3J0IGZvciBjb3B5aW5nIG9wdGlvbmFsIG1hcmtlcnMgZnJvbSBzb3VyY2UgdG8gZGVzdGluYXRpb24gZmlsZQorCUpDT1BZX09QVElPTiBjb3B5b3B0aW9uOworCS8vIEltYWdlIHRyYW5zZm9ybWF0aW9uIG9wdGlvbnMKKwlqcGVnX3RyYW5zZm9ybV9pbmZvIHRyYW5zZm9wdGlvbnM7CisKKwkvLyBJbml0aWFsaXplIHN0cnVjdHVyZXMKKwltZW1zZXQoJnNyY2luZm8sIDAsIHNpemVvZihzcmNpbmZvKSk7CisJbWVtc2V0KCZqc3JjZXJyLCAwLCBzaXplb2YoanNyY2VycikpOworCW1lbXNldCgmamRzdGVyciwgMCwgc2l6ZW9mKGpkc3RlcnIpKTsKKwltZW1zZXQoJmRzdGluZm8sIDAsIHNpemVvZihkc3RpbmZvKSk7CisJbWVtc2V0KCZ0cmFuc2ZvcHRpb25zLCAwLCBzaXplb2YodHJhbnNmb3B0aW9ucykpOworCisJLy8gQ29weSBhbGwgZXh0cmEgbWFya2VycyBmcm9tIHNvdXJjZSBmaWxlCisJY29weW9wdGlvbiA9IEpDT1BZT1BUX0FMTDsKKworCS8vIFNldCB1cCBkZWZhdWx0IEpQRUcgcGFyYW1ldGVycworCXRyYW5zZm9wdGlvbnMuZm9yY2VfZ3JheXNjYWxlID0gRkFMU0U7CisJdHJhbnNmb3B0aW9ucy5jcm9wID0gRkFMU0U7CisKKwkvLyBTZWxlY3QgdGhlIHRyYW5zZm9ybSBvcHRpb24KKwlzd2l0Y2gob3BlcmF0aW9uKSB7CisJCWNhc2UgRklKUEVHX09QX0ZMSVBfSDoJCS8vIGhvcml6b250YWwgZmxpcAorCQkJdHJhbnNmb3B0aW9ucy50cmFuc2Zvcm0gPSBKWEZPUk1fRkxJUF9IOworCQkJdHJpbUggPSBUUlVFOworCQkJYnJlYWs7CisJCWNhc2UgRklKUEVHX09QX0ZMSVBfVjoJCS8vIHZlcnRpY2FsIGZsaXAKKwkJCXRyYW5zZm9wdGlvbnMudHJhbnNmb3JtID0gSlhGT1JNX0ZMSVBfVjsKKwkJCXRyaW1WID0gVFJVRTsKKwkJCWJyZWFrOworCQljYXNlIEZJSlBFR19PUF9UUkFOU1BPU0U6CS8vIHRyYW5zcG9zZSBhY3Jvc3MgVUwtdG8tTFIgYXhpcworCQkJdHJhbnNmb3B0aW9ucy50cmFuc2Zvcm0gPSBKWEZPUk1fVFJBTlNQT1NFOworCQkJc3dhcHBlZERpbSA9IFRSVUU7CisJCQlicmVhazsKKwkJY2FzZSBGSUpQRUdfT1BfVFJBTlNWRVJTRToJLy8gdHJhbnNwb3NlIGFjcm9zcyBVUi10by1MTCBheGlzCisJCQl0cmFuc2ZvcHRpb25zLnRyYW5zZm9ybSA9IEpYRk9STV9UUkFOU1ZFUlNFOworCQkJdHJpbUggPSBUUlVFOworCQkJdHJpbVYgPSBUUlVFOworCQkJc3dhcHBlZERpbSA9IFRSVUU7CisJCQlicmVhazsKKwkJY2FzZSBGSUpQRUdfT1BfUk9UQVRFXzkwOgkvLyA5MC1kZWdyZWUgY2xvY2t3aXNlIHJvdGF0aW9uCisJCQl0cmFuc2ZvcHRpb25zLnRyYW5zZm9ybSA9IEpYRk9STV9ST1RfOTA7CisJCQl0cmltSCA9IFRSVUU7CisJCQlzd2FwcGVkRGltID0gVFJVRTsKKwkJCWJyZWFrOworCQljYXNlIEZJSlBFR19PUF9ST1RBVEVfMTgwOgkvLyAxODAtZGVncmVlIHJvdGF0aW9uCisJCQl0cmltSCA9IFRSVUU7CisJCQl0cmltViA9IFRSVUU7CisJCQl0cmFuc2ZvcHRpb25zLnRyYW5zZm9ybSA9IEpYRk9STV9ST1RfMTgwOworCQkJYnJlYWs7CisJCWNhc2UgRklKUEVHX09QX1JPVEFURV8yNzA6CS8vIDI3MC1kZWdyZWUgY2xvY2t3aXNlIChvciA5MCBjY3cpCisJCQl0cmFuc2ZvcHRpb25zLnRyYW5zZm9ybSA9IEpYRk9STV9ST1RfMjcwOworCQkJdHJpbVYgPSBUUlVFOworCQkJc3dhcHBlZERpbSA9IFRSVUU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJY2FzZSBGSUpQRUdfT1BfTk9ORToJCS8vIG5vIHRyYW5zZm9ybWF0aW9uCisJCQl0cmFuc2ZvcHRpb25zLnRyYW5zZm9ybSA9IEpYRk9STV9OT05FOworCQkJYnJlYWs7CisJfQorCS8vIChwZXJmZWN0ID09IFRSVUUpID09PiBmYWlsIGlmIHRoZXJlIGlzIG5vbi10cmFuc2Zvcm1hYmxlIGVkZ2UgYmxvY2tzCisJdHJhbnNmb3B0aW9ucy5wZXJmZWN0ID0gKHBlcmZlY3QgPT0gVFJVRSkgPyBUUlVFIDogRkFMU0U7CisJLy8gRHJvcCBub24tdHJhbnNmb3JtYWJsZSBlZGdlIGJsb2NrczogdHJpbSBvZmYgYW55IHBhcnRpYWwgZWRnZSBNQ1VzIHRoYXQgdGhlIHRyYW5zZm9ybSBjYW4ndCBoYW5kbGUuCisJdHJhbnNmb3B0aW9ucy50cmltID0gVFJVRTsKKworCXRyeSB7CisKKwkJLy8gSW5pdGlhbGl6ZSB0aGUgSlBFRyBkZWNvbXByZXNzaW9uIG9iamVjdCB3aXRoIGRlZmF1bHQgZXJyb3IgaGFuZGxpbmcKKwkJc3JjaW5mby5lcnIgPSBqcGVnX3N0ZF9lcnJvcigmanNyY2Vycik7CisJCXNyY2luZm8uZXJyLT5lcnJvcl9leGl0ID0gbHNfanBlZ19lcnJvcl9leGl0OworCQlzcmNpbmZvLmVyci0+b3V0cHV0X21lc3NhZ2UgPSBsc19qcGVnX291dHB1dF9tZXNzYWdlOworCQlqcGVnX2NyZWF0ZV9kZWNvbXByZXNzKCZzcmNpbmZvKTsKKworCQkvLyBJbml0aWFsaXplIHRoZSBKUEVHIGNvbXByZXNzaW9uIG9iamVjdCB3aXRoIGRlZmF1bHQgZXJyb3IgaGFuZGxpbmcKKwkJZHN0aW5mby5lcnIgPSBqcGVnX3N0ZF9lcnJvcigmamRzdGVycik7CisJCWRzdGluZm8uZXJyLT5lcnJvcl9leGl0ID0gbHNfanBlZ19lcnJvcl9leGl0OworCQlkc3RpbmZvLmVyci0+b3V0cHV0X21lc3NhZ2UgPSBsc19qcGVnX291dHB1dF9tZXNzYWdlOworCQlqcGVnX2NyZWF0ZV9jb21wcmVzcygmZHN0aW5mbyk7CisKKwkJLy8gU3BlY2lmeSBkYXRhIHNvdXJjZSBmb3IgZGVjb21wcmVzc2lvbgorCQlqcGVnX2ZyZWVpbWFnZV9zcmMoJnNyY2luZm8sIHNyY19oYW5kbGUsIHNyY19pbyk7CisKKwkJLy8gRW5hYmxlIHNhdmluZyBvZiBleHRyYSBtYXJrZXJzIHRoYXQgd2Ugd2FudCB0byBjb3B5CisJCWpjb3B5X21hcmtlcnNfc2V0dXAoJnNyY2luZm8sIGNvcHlvcHRpb24pOworCisJCS8vIFJlYWQgdGhlIGZpbGUgaGVhZGVyCisJCWpwZWdfcmVhZF9oZWFkZXIoJnNyY2luZm8sIFRSVUUpOworCisJCS8vIGNyb3Agb3B0aW9uCisJCWNoYXIgY3JvcFs2NF07CisJCWNvbnN0IEJPT0wgaGFzQ3JvcCA9IGdldENyb3BTdHJpbmcoY3JvcCwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBzd2FwcGVkRGltID8gc3JjaW5mby5pbWFnZV9oZWlnaHQgOiBzcmNpbmZvLmltYWdlX3dpZHRoLCBzd2FwcGVkRGltID8gc3JjaW5mby5pbWFnZV93aWR0aCA6IHNyY2luZm8uaW1hZ2VfaGVpZ2h0KTsKKworCQlpZihoYXNDcm9wKSB7CisJCQlpZighanRyYW5zZm9ybV9wYXJzZV9jcm9wX3NwZWMoJnRyYW5zZm9wdGlvbnMsIGNyb3ApKSB7CisJCQkJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKEZJRl9KUEVHLCAiQm9ndXMgY3JvcCBhcmd1bWVudCAlcyIsIGNyb3ApOworCQkJCXRocm93KDEpOworCQkJfQorCQl9CisKKwkJLy8gQW55IHNwYWNlIG5lZWRlZCBieSBhIHRyYW5zZm9ybSBvcHRpb24gbXVzdCBiZSByZXF1ZXN0ZWQgYmVmb3JlCisJCS8vIGpwZWdfcmVhZF9jb2VmZmljaWVudHMgc28gdGhhdCBtZW1vcnkgYWxsb2NhdGlvbiB3aWxsIGJlIGRvbmUgcmlnaHQKKworCQkvLyBQcmVwYXJlIHRyYW5zZm9ybWF0aW9uIHdvcmtzcGFjZQorCQkvLyBGYWlscyByaWdodCBhd2F5IGlmIHBlcmZlY3QgZmxhZyBpcyBUUlVFIGFuZCB0cmFuc2Zvcm1hdGlvbiBpcyBub3QgcGVyZmVjdAorCQlpZiggIWp0cmFuc2Zvcm1fcmVxdWVzdF93b3Jrc3BhY2UoJnNyY2luZm8sICZ0cmFuc2ZvcHRpb25zKSApIHsKKwkJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhGSUZfSlBFRywgIlRyYW5zZm9ybWF0aW9uIGlzIG5vdCBwZXJmZWN0Iik7CisJCQl0aHJvdygxKTsKKwkJfQorCisJCWlmKGxlZnQgfHwgdG9wKSB7CisJCQkvLyBjb21wdXRlIGxlZnQgYW5kIHRvcCBvZmZzZXRzLCBpdCdzIGEgYml0IHRyaWNreSwgdGFraW5nIGludG8gYWNjb3VudCBib3RoCisJCQkvLyB0cmFuc2Zvcm0sIHdoaWNoIG1pZ2h0IGhhdmUgdHJpbWVkIHRoZSBpbWFnZSwKKwkJCS8vIGFuZCBjcm9wIGl0c2VsZiwgd2hpY2ggaXMgYWRqdXN0ZWQgdG8gbGllIG9uIGEgaU1DVSBib3VuZGFyeQorCisJCQljb25zdCBpbnQgZnVsbFdpZHRoID0gc3dhcHBlZERpbSA/IHNyY2luZm8uaW1hZ2VfaGVpZ2h0IDogc3JjaW5mby5pbWFnZV93aWR0aDsKKwkJCWNvbnN0IGludCBmdWxsSGVpZ2h0ID0gc3dhcHBlZERpbSA/IHNyY2luZm8uaW1hZ2Vfd2lkdGggOiBzcmNpbmZvLmltYWdlX2hlaWdodDsKKworCQkJaW50IHRyYW5zZm9ybWVkRnVsbFdpZHRoID0gZnVsbFdpZHRoOworCQkJaW50IHRyYW5zZm9ybWVkRnVsbEhlaWdodCA9IGZ1bGxIZWlnaHQ7CisKKwkJCWlmKHRyaW1IICYmIHRyYW5zZm9ybWVkRnVsbFdpZHRoL3RyYW5zZm9wdGlvbnMuaU1DVV9zYW1wbGVfd2lkdGggPiAwKSB7CisJCQkJdHJhbnNmb3JtZWRGdWxsV2lkdGggPSAodHJhbnNmb3JtZWRGdWxsV2lkdGgvdHJhbnNmb3B0aW9ucy5pTUNVX3NhbXBsZV93aWR0aCkgKiB0cmFuc2ZvcHRpb25zLmlNQ1Vfc2FtcGxlX3dpZHRoOworCQkJfQorCQkJaWYodHJpbVYgJiYgdHJhbnNmb3JtZWRGdWxsSGVpZ2h0L3RyYW5zZm9wdGlvbnMuaU1DVV9zYW1wbGVfaGVpZ2h0ID4gMCkgeworCQkJCXRyYW5zZm9ybWVkRnVsbEhlaWdodCA9ICh0cmFuc2Zvcm1lZEZ1bGxIZWlnaHQvdHJhbnNmb3B0aW9ucy5pTUNVX3NhbXBsZV9oZWlnaHQpICogdHJhbnNmb3B0aW9ucy5pTUNVX3NhbXBsZV9oZWlnaHQ7CisJCQl9CisKKwkJCWNvbnN0IGludCB0cmltbWVkV2lkdGggPSBmdWxsV2lkdGggLSB0cmFuc2Zvcm1lZEZ1bGxXaWR0aDsKKwkJCWNvbnN0IGludCB0cmltbWVkSGVpZ2h0ID0gZnVsbEhlaWdodCAtIHRyYW5zZm9ybWVkRnVsbEhlaWdodDsKKworCQkJaWYobGVmdCkgeworCQkJCSpsZWZ0ID0gdHJpbW1lZFdpZHRoICsgdHJhbnNmb3B0aW9ucy54X2Nyb3Bfb2Zmc2V0ICogdHJhbnNmb3B0aW9ucy5pTUNVX3NhbXBsZV93aWR0aDsKKwkJCX0KKwkJCWlmKHRvcCkgeworCQkJCSp0b3AgPSB0cmltbWVkSGVpZ2h0ICsgdHJhbnNmb3B0aW9ucy55X2Nyb3Bfb2Zmc2V0ICogdHJhbnNmb3B0aW9ucy5pTUNVX3NhbXBsZV9oZWlnaHQ7CisJCQl9CisJCX0KKworCQlpZihyaWdodCkgeworCQkJKnJpZ2h0ID0gKGxlZnQgPyAqbGVmdCA6IDApICsgdHJhbnNmb3B0aW9ucy5vdXRwdXRfd2lkdGg7CisJCX0KKwkJaWYoYm90dG9tKSB7CisJCQkqYm90dG9tID0gKHRvcCA/ICp0b3AgOiAwKSArIHRyYW5zZm9wdGlvbnMub3V0cHV0X2hlaWdodDsKKwkJfQorCisJCS8vIGlmIG9ubHkgdGhlIGNyb3AgcmVjdCBpcyByZXF1ZXN0ZWQsIHdlIGFyZSBkb25lCisKKwkJaWYob25seVJldHVybkNyb3BSZWN0KSB7CisJCQlqcGVnX2Rlc3Ryb3lfY29tcHJlc3MoJmRzdGluZm8pOworCQkJanBlZ19kZXN0cm95X2RlY29tcHJlc3MoJnNyY2luZm8pOworCQkJcmV0dXJuIFRSVUU7CisJCX0KKworCQkvLyBSZWFkIHNvdXJjZSBmaWxlIGFzIERDVCBjb2VmZmljaWVudHMKKwkJc3JjX2NvZWZfYXJyYXlzID0ganBlZ19yZWFkX2NvZWZmaWNpZW50cygmc3JjaW5mbyk7CisKKwkJLy8gSW5pdGlhbGl6ZSBkZXN0aW5hdGlvbiBjb21wcmVzc2lvbiBwYXJhbWV0ZXJzIGZyb20gc291cmNlIHZhbHVlcworCQlqcGVnX2NvcHlfY3JpdGljYWxfcGFyYW1ldGVycygmc3JjaW5mbywgJmRzdGluZm8pOworCisJCS8vIEFkanVzdCBkZXN0aW5hdGlvbiBwYXJhbWV0ZXJzIGlmIHJlcXVpcmVkIGJ5IHRyYW5zZm9ybSBvcHRpb25zOworCQkvLyBhbHNvIGZpbmQgb3V0IHdoaWNoIHNldCBvZiBjb2VmZmljaWVudCBhcnJheXMgd2lsbCBob2xkIHRoZSBvdXRwdXQKKwkJZHN0X2NvZWZfYXJyYXlzID0ganRyYW5zZm9ybV9hZGp1c3RfcGFyYW1ldGVycygmc3JjaW5mbywgJmRzdGluZm8sIHNyY19jb2VmX2FycmF5cywgJnRyYW5zZm9wdGlvbnMpOworCisJCS8vIE5vdGU6IHdlIGFzc3VtZSB0aGF0IGpwZWdfcmVhZF9jb2VmZmljaWVudHMgY29uc3VtZWQgYWxsIGlucHV0CisJCS8vIHVudGlsIEpQRUdfUkVBQ0hFRF9FT0ksIGFuZCB0aGF0IGpwZWdfZmluaXNoX2RlY29tcHJlc3Mgd2lsbAorCQkvLyBvbmx5IGNvbnN1bWUgbW9yZSB3aGlsZSAoISBjaW5mby0+aW5wdXRjdGwtPmVvaV9yZWFjaGVkKS4KKwkJLy8gV2UgY2Fubm90IGNhbGwganBlZ19maW5pc2hfZGVjb21wcmVzcyBoZXJlIHNpbmNlIHdlIHN0aWxsIG5lZWQgdGhlCisJCS8vIHZpcnR1YWwgYXJyYXlzIGFsbG9jYXRlZCBmcm9tIHRoZSBzb3VyY2Ugb2JqZWN0IGZvciBwcm9jZXNzaW5nLgorCisJCWlmKHNyY19oYW5kbGUgPT0gZHN0X2hhbmRsZSkgeworCQkJZHN0X2lvLT5zZWVrX3Byb2MoZHN0X2hhbmRsZSwgc3RyZWFtX3N0YXJ0LCBTRUVLX1NFVCk7CisJCX0KKworCQkvLyBTcGVjaWZ5IGRhdGEgZGVzdGluYXRpb24gZm9yIGNvbXByZXNzaW9uCisJCWpwZWdfZnJlZWltYWdlX2RzdCgmZHN0aW5mbywgZHN0X2hhbmRsZSwgZHN0X2lvKTsKKworCQkvLyBTdGFydCBjb21wcmVzc29yIChub3RlIG5vIGltYWdlIGRhdGEgaXMgYWN0dWFsbHkgd3JpdHRlbiBoZXJlKQorCQlqcGVnX3dyaXRlX2NvZWZmaWNpZW50cygmZHN0aW5mbywgZHN0X2NvZWZfYXJyYXlzKTsKKworCQkvLyBDb3B5IHRvIHRoZSBvdXRwdXQgZmlsZSBhbnkgZXh0cmEgbWFya2VycyB0aGF0IHdlIHdhbnQgdG8gcHJlc2VydmUKKwkJamNvcHlfbWFya2Vyc19leGVjdXRlKCZzcmNpbmZvLCAmZHN0aW5mbywgY29weW9wdGlvbik7CisKKwkJLy8gRXhlY3V0ZSBpbWFnZSB0cmFuc2Zvcm1hdGlvbiwgaWYgYW55CisJCWp0cmFuc2Zvcm1fZXhlY3V0ZV90cmFuc2Zvcm1hdGlvbigmc3JjaW5mbywgJmRzdGluZm8sIHNyY19jb2VmX2FycmF5cywgJnRyYW5zZm9wdGlvbnMpOworCisJCS8vIEZpbmlzaCBjb21wcmVzc2lvbiBhbmQgcmVsZWFzZSBtZW1vcnkKKwkJanBlZ19maW5pc2hfY29tcHJlc3MoJmRzdGluZm8pOworCQlqcGVnX2Rlc3Ryb3lfY29tcHJlc3MoJmRzdGluZm8pOworCQlqcGVnX2ZpbmlzaF9kZWNvbXByZXNzKCZzcmNpbmZvKTsKKwkJanBlZ19kZXN0cm95X2RlY29tcHJlc3MoJnNyY2luZm8pOworCisJfQorCWNhdGNoKC4uLikgeworCQlqcGVnX2Rlc3Ryb3lfY29tcHJlc3MoJmRzdGluZm8pOworCQlqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcygmc3JjaW5mbyk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICBGcmVlSW1hZ2UgaW50ZXJmYWNlCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0JPT0wgRExMX0NBTExDT05WCitGcmVlSW1hZ2VfSlBFR1RyYW5zZm9ybUZyb21IYW5kbGUoRnJlZUltYWdlSU8qIHNyY19pbywgZmlfaGFuZGxlIHNyY19oYW5kbGUsIEZyZWVJbWFnZUlPKiBkc3RfaW8sIGZpX2hhbmRsZSBkc3RfaGFuZGxlLCBGUkVFX0lNQUdFX0pQRUdfT1BFUkFUSU9OIG9wZXJhdGlvbiwgaW50KiBsZWZ0LCBpbnQqIHRvcCwgaW50KiByaWdodCwgaW50KiBib3R0b20sIEJPT0wgcGVyZmVjdCkgeworCXJldHVybiBKUEVHVHJhbnNmb3JtRnJvbUhhbmRsZShzcmNfaW8sIHNyY19oYW5kbGUsIGRzdF9pbywgZHN0X2hhbmRsZSwgb3BlcmF0aW9uLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIHBlcmZlY3QpOworfQorCitzdGF0aWMgdm9pZAorY2xvc2VTdGRJTyhmaV9oYW5kbGUgc3JjX2hhbmRsZSwgZmlfaGFuZGxlIGRzdF9oYW5kbGUpIHsKKwlpZihzcmNfaGFuZGxlKSB7CisJCWZjbG9zZSgoRklMRSopc3JjX2hhbmRsZSk7CisJfQorCWlmKGRzdF9oYW5kbGUgJiYgKGRzdF9oYW5kbGUgIT0gc3JjX2hhbmRsZSkpIHsKKwkJZmNsb3NlKChGSUxFKilkc3RfaGFuZGxlKTsKKwl9Cit9CisKK3N0YXRpYyBCT09MCitvcGVuU3RkSU8oY29uc3QgY2hhciogc3JjX2ZpbGUsIGNvbnN0IGNoYXIqIGRzdF9maWxlLCBGcmVlSW1hZ2VJTyogZHN0X2lvLCBmaV9oYW5kbGUqIHNyY19oYW5kbGUsIGZpX2hhbmRsZSogZHN0X2hhbmRsZSkgeworCSpzcmNfaGFuZGxlID0gTlVMTDsKKwkqZHN0X2hhbmRsZSA9IE5VTEw7CisJCisJRnJlZUltYWdlSU8gaW87CisJU2V0RGVmYXVsdElPICgmaW8pOworCQorCWNvbnN0IEJPT0wgaXNTYW1lRmlsZSA9IChkc3RfZmlsZSAmJiAoc3RyY21wKHNyY19maWxlLCBkc3RfZmlsZSkgPT0gMCkpID8gVFJVRSA6IEZBTFNFOworCQorCUZJTEUqIHNyY3AgPSBOVUxMOworCUZJTEUqIGRzdHAgPSBOVUxMOworCQorCWlmKGlzU2FtZUZpbGUpIHsKKwkJc3JjcCA9IGZvcGVuKHNyY19maWxlLCAicitiIik7CisJCWRzdHAgPSBzcmNwOworCX0KKwllbHNlIHsKKwkJc3JjcCA9IGZvcGVuKHNyY19maWxlLCAicmIiKTsKKwkJaWYoZHN0X2ZpbGUpIHsKKwkJCWRzdHAgPSBmb3Blbihkc3RfZmlsZSwgIndiIik7CisJCX0KKwl9CisJCisJaWYoIXNyY3AgfHwgKGRzdF9maWxlICYmICFkc3RwKSkgeworCQlpZighc3JjcCkgeworCQkJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKEZJRl9KUEVHLCAiQ2Fubm90IG9wZW4gXCIlc1wiIGZvciByZWFkaW5nIiwgc3JjX2ZpbGUpOworCQl9IGVsc2UgeworCQkJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKEZJRl9KUEVHLCAiQ2Fubm90IG9wZW4gXCIlc1wiIGZvciB3cml0aW5nIiwgZHN0X2ZpbGUpOworCQl9CisJCWNsb3NlU3RkSU8oc3JjcCwgZHN0cCk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlpZihGcmVlSW1hZ2VfR2V0RmlsZVR5cGVGcm9tSGFuZGxlKCZpbywgc3JjcCkgIT0gRklGX0pQRUcpIHsKKwkJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKEZJRl9KUEVHLCAiIFNvdXJjZSBmaWxlIFwiJXNcIiBpcyBub3QganBlZyIsIHNyY19maWxlKTsKKwkJY2xvc2VTdGRJTyhzcmNwLCBkc3RwKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCSpkc3RfaW8gPSBpbzsKKwkqc3JjX2hhbmRsZSA9IHNyY3A7CisJKmRzdF9oYW5kbGUgPSBkc3RwOworCisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBCT09MCitvcGVuU3RkSU9VKGNvbnN0IHdjaGFyX3QqIHNyY19maWxlLCBjb25zdCB3Y2hhcl90KiBkc3RfZmlsZSwgRnJlZUltYWdlSU8qIGRzdF9pbywgZmlfaGFuZGxlKiBzcmNfaGFuZGxlLCBmaV9oYW5kbGUqIGRzdF9oYW5kbGUpIHsKKyNpZmRlZiBfV0lOMzIKKworCSpzcmNfaGFuZGxlID0gTlVMTDsKKwkqZHN0X2hhbmRsZSA9IE5VTEw7CisKKwlGcmVlSW1hZ2VJTyBpbzsKKwlTZXREZWZhdWx0SU8gKCZpbyk7CisJCisJY29uc3QgQk9PTCBpc1NhbWVGaWxlID0gKGRzdF9maWxlICYmICh3Y3NjbXAoc3JjX2ZpbGUsIGRzdF9maWxlKSA9PSAwKSkgPyBUUlVFIDogRkFMU0U7CisKKwlGSUxFKiBzcmNwID0gTlVMTDsKKwlGSUxFKiBkc3RwID0gTlVMTDsKKworCWlmKGlzU2FtZUZpbGUpIHsKKwkJc3JjcCA9IF93Zm9wZW4oc3JjX2ZpbGUsIEwicitiIik7CisJCWRzdHAgPSBzcmNwOworCX0gZWxzZSB7CisJCXNyY3AgPSBfd2ZvcGVuKHNyY19maWxlLCBMInJiIik7CisJCWlmKGRzdF9maWxlKSB7CisJCQlkc3RwID0gX3dmb3Blbihkc3RfZmlsZSwgTCJ3YiIpOworCQl9CisJfQorCisJaWYoIXNyY3AgfHwgKGRzdF9maWxlICYmICFkc3RwKSkgeworCQlpZighc3JjcCkgeworCQkJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKEZJRl9KUEVHLCAiQ2Fubm90IG9wZW4gc291cmNlIGZpbGUgZm9yIHJlYWRpbmciKTsKKwkJfSBlbHNlIHsKKwkJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhGSUZfSlBFRywgIkNhbm5vdCBvcGVuIGRlc3RpbmF0aW9uIGZpbGUgZm9yIHdyaXRpbmciKTsKKwkJfQorCQljbG9zZVN0ZElPKHNyY3AsIGRzdHApOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJaWYoRnJlZUltYWdlX0dldEZpbGVUeXBlRnJvbUhhbmRsZSgmaW8sIHNyY3ApICE9IEZJRl9KUEVHKSB7CisJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhGSUZfSlBFRywgIiBTb3VyY2UgZmlsZSBpcyBub3QganBlZyIpOworCQljbG9zZVN0ZElPKHNyY3AsIGRzdHApOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJKmRzdF9pbyA9IGlvOworCSpzcmNfaGFuZGxlID0gc3JjcDsKKwkqZHN0X2hhbmRsZSA9IGRzdHA7CisKKwlyZXR1cm4gVFJVRTsKKworI2Vsc2UKKwlyZXR1cm4gRkFMU0U7CisjZW5kaWYgLy8gX1dJTjMyCit9CisKK0JPT0wgRExMX0NBTExDT05WCitGcmVlSW1hZ2VfSlBFR1RyYW5zZm9ybShjb25zdCBjaGFyICpzcmNfZmlsZSwgY29uc3QgY2hhciAqZHN0X2ZpbGUsIEZSRUVfSU1BR0VfSlBFR19PUEVSQVRJT04gb3BlcmF0aW9uLCBCT09MIHBlcmZlY3QpIHsKKwlGcmVlSW1hZ2VJTyBpbzsKKwlmaV9oYW5kbGUgc3JjOworCWZpX2hhbmRsZSBkc3Q7CisJCisJaWYoIW9wZW5TdGRJTyhzcmNfZmlsZSwgZHN0X2ZpbGUsICZpbywgJnNyYywgJmRzdCkpIHsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwkKKwlCT09MIHJldCA9IEpQRUdUcmFuc2Zvcm1Gcm9tSGFuZGxlKCZpbywgc3JjLCAmaW8sIGRzdCwgb3BlcmF0aW9uLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBwZXJmZWN0KTsKKworCWNsb3NlU3RkSU8oc3JjLCBkc3QpOworCisJcmV0dXJuIHJldDsKK30KKworQk9PTCBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9KUEVHQ3JvcChjb25zdCBjaGFyICpzcmNfZmlsZSwgY29uc3QgY2hhciAqZHN0X2ZpbGUsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgcmlnaHQsIGludCBib3R0b20pIHsKKwlGcmVlSW1hZ2VJTyBpbzsKKwlmaV9oYW5kbGUgc3JjOworCWZpX2hhbmRsZSBkc3Q7CisJCisJaWYoIW9wZW5TdGRJTyhzcmNfZmlsZSwgZHN0X2ZpbGUsICZpbywgJnNyYywgJmRzdCkpIHsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwkKKwlCT09MIHJldCA9IEZyZWVJbWFnZV9KUEVHVHJhbnNmb3JtRnJvbUhhbmRsZSgmaW8sIHNyYywgJmlvLCBkc3QsIEZJSlBFR19PUF9OT05FLCAmbGVmdCwgJnRvcCwgJnJpZ2h0LCAmYm90dG9tLCBGQUxTRSk7CisJCisJY2xvc2VTdGRJTyhzcmMsIGRzdCk7CisJCisJcmV0dXJuIHJldDsKK30KKworQk9PTCBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9KUEVHVHJhbnNmb3JtVShjb25zdCB3Y2hhcl90ICpzcmNfZmlsZSwgY29uc3Qgd2NoYXJfdCAqZHN0X2ZpbGUsIEZSRUVfSU1BR0VfSlBFR19PUEVSQVRJT04gb3BlcmF0aW9uLCBCT09MIHBlcmZlY3QpIHsKKwlGcmVlSW1hZ2VJTyBpbzsKKwlmaV9oYW5kbGUgc3JjOworCWZpX2hhbmRsZSBkc3Q7CisJCisJaWYoIW9wZW5TdGRJT1Uoc3JjX2ZpbGUsIGRzdF9maWxlLCAmaW8sICZzcmMsICZkc3QpKSB7CisJCXJldHVybiBGQUxTRTsKKwl9CisJCisJQk9PTCByZXQgPSBKUEVHVHJhbnNmb3JtRnJvbUhhbmRsZSgmaW8sIHNyYywgJmlvLCBkc3QsIG9wZXJhdGlvbiwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgcGVyZmVjdCk7CisJCisJY2xvc2VTdGRJTyhzcmMsIGRzdCk7CisKKwlyZXR1cm4gcmV0OworfQorCitCT09MIERMTF9DQUxMQ09OVgorRnJlZUltYWdlX0pQRUdDcm9wVShjb25zdCB3Y2hhcl90ICpzcmNfZmlsZSwgY29uc3Qgd2NoYXJfdCAqZHN0X2ZpbGUsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgcmlnaHQsIGludCBib3R0b20pIHsKKwlGcmVlSW1hZ2VJTyBpbzsKKwlmaV9oYW5kbGUgc3JjOworCWZpX2hhbmRsZSBkc3Q7CisJCisJaWYoIW9wZW5TdGRJT1Uoc3JjX2ZpbGUsIGRzdF9maWxlLCAmaW8sICZzcmMsICZkc3QpKSB7CisJCXJldHVybiBGQUxTRTsKKwl9CisJCisJQk9PTCByZXQgPSBGcmVlSW1hZ2VfSlBFR1RyYW5zZm9ybUZyb21IYW5kbGUoJmlvLCBzcmMsICZpbywgZHN0LCBGSUpQRUdfT1BfTk9ORSwgJmxlZnQsICZ0b3AsICZyaWdodCwgJmJvdHRvbSwgRkFMU0UpOworCisJY2xvc2VTdGRJTyhzcmMsIGRzdCk7CisKKwlyZXR1cm4gcmV0OworfQorCitCT09MIERMTF9DQUxMQ09OVgorRnJlZUltYWdlX0pQRUdUcmFuc2Zvcm1Db21iaW5lZChjb25zdCBjaGFyICpzcmNfZmlsZSwgY29uc3QgY2hhciAqZHN0X2ZpbGUsIEZSRUVfSU1BR0VfSlBFR19PUEVSQVRJT04gb3BlcmF0aW9uLCBpbnQqIGxlZnQsIGludCogdG9wLCBpbnQqIHJpZ2h0LCBpbnQqIGJvdHRvbSwgQk9PTCBwZXJmZWN0KSB7CisJRnJlZUltYWdlSU8gaW87CisJZmlfaGFuZGxlIHNyYzsKKwlmaV9oYW5kbGUgZHN0OworCQorCWlmKCFvcGVuU3RkSU8oc3JjX2ZpbGUsIGRzdF9maWxlLCAmaW8sICZzcmMsICZkc3QpKSB7CisJCXJldHVybiBGQUxTRTsKKwl9CisJCisJQk9PTCByZXQgPSBGcmVlSW1hZ2VfSlBFR1RyYW5zZm9ybUZyb21IYW5kbGUoJmlvLCBzcmMsICZpbywgZHN0LCBvcGVyYXRpb24sIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgcGVyZmVjdCk7CisKKwljbG9zZVN0ZElPKHNyYywgZHN0KTsKKworCXJldHVybiByZXQ7Cit9CisKK0JPT0wgRExMX0NBTExDT05WCitGcmVlSW1hZ2VfSlBFR1RyYW5zZm9ybUNvbWJpbmVkVShjb25zdCB3Y2hhcl90ICpzcmNfZmlsZSwgY29uc3Qgd2NoYXJfdCAqZHN0X2ZpbGUsIEZSRUVfSU1BR0VfSlBFR19PUEVSQVRJT04gb3BlcmF0aW9uLCBpbnQqIGxlZnQsIGludCogdG9wLCBpbnQqIHJpZ2h0LCBpbnQqIGJvdHRvbSwgQk9PTCBwZXJmZWN0KSB7CisJRnJlZUltYWdlSU8gaW87CisJZmlfaGFuZGxlIHNyYzsKKwlmaV9oYW5kbGUgZHN0OworCQorCWlmKCFvcGVuU3RkSU9VKHNyY19maWxlLCBkc3RfZmlsZSwgJmlvLCAmc3JjLCAmZHN0KSkgeworCQlyZXR1cm4gRkFMU0U7CisJfQorCQorCUJPT0wgcmV0ID0gRnJlZUltYWdlX0pQRUdUcmFuc2Zvcm1Gcm9tSGFuZGxlKCZpbywgc3JjLCAmaW8sIGRzdCwgb3BlcmF0aW9uLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIHBlcmZlY3QpOworCisJY2xvc2VTdGRJTyhzcmMsIGRzdCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgQk9PTAorZ2V0TWVtSU8oRklNRU1PUlkqIHNyY19zdHJlYW0sIEZJTUVNT1JZKiBkc3Rfc3RyZWFtLCBGcmVlSW1hZ2VJTyogZHN0X2lvLCBmaV9oYW5kbGUqIHNyY19oYW5kbGUsIGZpX2hhbmRsZSogZHN0X2hhbmRsZSkgeworCSpzcmNfaGFuZGxlID0gTlVMTDsKKwkqZHN0X2hhbmRsZSA9IE5VTEw7CisKKwlGcmVlSW1hZ2VJTyBpbzsKKwlTZXRNZW1vcnlJTyAoJmlvKTsKKworCWlmKGRzdF9zdHJlYW0pIHsKKwkJRklNRU1PUllIRUFERVIgKm1lbV9oZWFkZXIgPSAoRklNRU1PUllIRUFERVIqKShkc3Rfc3RyZWFtLT5kYXRhKTsKKwkJaWYobWVtX2hlYWRlci0+ZGVsZXRlX21lICE9IFRSVUUpIHsKKwkJCS8vIGRvIG5vdCBzYXZlIGluIGEgdXNlciBidWZmZXIKKwkJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhGSUZfSlBFRywgIkRlc3RpbmF0aW9uIG1lbW9yeSBidWZmZXIgaXMgcmVhZCBvbmx5Iik7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKwl9CisKKwkqZHN0X2lvID0gaW87CisJKnNyY19oYW5kbGUgPSBzcmNfc3RyZWFtOworCSpkc3RfaGFuZGxlID0gZHN0X3N0cmVhbTsKKworCXJldHVybiBUUlVFOworfQorCitCT09MIERMTF9DQUxMQ09OVgorRnJlZUltYWdlX0pQRUdUcmFuc2Zvcm1Db21iaW5lZEZyb21NZW1vcnkoRklNRU1PUlkqIHNyY19zdHJlYW0sIEZJTUVNT1JZKiBkc3Rfc3RyZWFtLCBGUkVFX0lNQUdFX0pQRUdfT1BFUkFUSU9OIG9wZXJhdGlvbiwgaW50KiBsZWZ0LCBpbnQqIHRvcCwgaW50KiByaWdodCwgaW50KiBib3R0b20sIEJPT0wgcGVyZmVjdCkgeworCUZyZWVJbWFnZUlPIGlvOworCWZpX2hhbmRsZSBzcmM7CisJZmlfaGFuZGxlIGRzdDsKKwkKKwlpZighZ2V0TWVtSU8oc3JjX3N0cmVhbSwgZHN0X3N0cmVhbSwgJmlvLCAmc3JjLCAmZHN0KSkgeworCQlyZXR1cm4gRkFMU0U7CisJfQorCQorCXJldHVybiBGcmVlSW1hZ2VfSlBFR1RyYW5zZm9ybUZyb21IYW5kbGUoJmlvLCBzcmMsICZpbywgZHN0LCBvcGVyYXRpb24sIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgcGVyZmVjdCk7Cit9CisKZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2VUb29sa2l0L011bHRpZ3JpZFBvaXNzb25Tb2x2ZXIuY3BwIGIvZmlsZXMvU291cmNlL0ZyZWVJbWFnZVRvb2xraXQvTXVsdGlncmlkUG9pc3NvblNvbHZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I1NzdjYgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2VUb29sa2l0L011bHRpZ3JpZFBvaXNzb25Tb2x2ZXIuY3BwCkBAIC0wLDAgKzEsNTA1IEBACisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBQb2lzc29uIHNvbHZlciBiYXNlZCBvbiBhIGZ1bGwgbXVsdGlncmlkIGFsZ29yaXRobQorLy8KKy8vIERlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gYnkKKy8vIC0gSGVydukgRHJvbG9uIChkcm9sb25AaW5mb25pZS5mcikKKy8vIFJlZmVyZW5jZToKKy8vIFBSRVNTLCBXLiBILiwgVEVVS09MU0tZLCBTLiBBLiwgVkVUVEVSTElORywgVy4gVC4sIEFORCBGTEFOTkVSWSwgQi4gUC4KKy8vIDE5OTIuIE51bWVyaWNhbCBSZWNpcGVzIGluIEM6IFRoZSBBcnQgb2YgU2NpZW50aWZpYyBDb21wdXRpbmcsIDJuZCBlZC4gQ2FtYnJpZGdlIFVuaXZlcnNpdHkgUHJlc3MuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRnJlZUltYWdlIDMKKy8vCisvLyBDT1ZFUkVEIENPREUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkKKy8vIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTCisvLyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy8vIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVECisvLyBDT0RFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UCisvLyBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWQorLy8gU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTAorLy8gUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUgorLy8gVEhJUyBESVNDTEFJTUVSLgorLy8KKy8vIFVzZSBhdCB5b3VyIG93biByaXNrIQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaW5jbHVkZSAiRnJlZUltYWdlLmgiCisjaW5jbHVkZSAiVXRpbGl0aWVzLmgiCisjaW5jbHVkZSAiVG9uZU1hcHBpbmcuaCIKKworc3RhdGljIGNvbnN0IGludCBOUFJFCT0gMTsJCS8vIE51bWJlciBvZiByZWxheGF0aW9uIHN3ZWVwcyBiZWZvcmUgLi4uCitzdGF0aWMgY29uc3QgaW50IE5QT1NUCT0gMTsJCS8vIC4uLiBhbmQgYWZ0ZXIgdGhlIGNvYXJzZS1ncmlkIGNvcnJlY3Rpb24gaXMgY29tcHV0ZWQKK3N0YXRpYyBjb25zdCBpbnQgTkdNQVgJPSAxNTsJCS8vIE1heGltdW0gbnVtYmVyIG9mIGdyaWRzCisKKy8qKgorQ29weSBzcmMgaW50byBkc3QKKyovCitzdGF0aWMgaW5saW5lIHZvaWQgZm1nX2NvcHlBcnJheShGSUJJVE1BUCAqZHN0LCBGSUJJVE1BUCAqc3JjKSB7CisJbWVtY3B5KEZyZWVJbWFnZV9HZXRCaXRzKGRzdCksIEZyZWVJbWFnZV9HZXRCaXRzKHNyYyksIEZyZWVJbWFnZV9HZXRIZWlnaHQoZHN0KSAqIEZyZWVJbWFnZV9HZXRQaXRjaChkc3QpKTsKK30KKworLyoqCitGaWxscyBzcmMgd2l0aCB6ZXJvcworKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBmbWdfZmlsbEFycmF5V2l0aFplcm9zKEZJQklUTUFQICpzcmMpIHsKKwltZW1zZXQoRnJlZUltYWdlX0dldEJpdHMoc3JjKSwgMCwgRnJlZUltYWdlX0dldEhlaWdodChzcmMpICogRnJlZUltYWdlX0dldFBpdGNoKHNyYykpOworfQorCisvKioKK0hhbGYtd2VpZ2h0aW5nIHJlc3RyaWN0aW9uLiBuYyBpcyB0aGUgY29hcnNlLWdyaWQgZGltZW5zaW9uLiBUaGUgZmluZS1ncmlkIHNvbHV0aW9uIGlzIGlucHV0IGluCit1ZlswLi4yKm5jLTJdWzAuLjIqbmMtMl0sIHRoZSBjb2Fyc2UtZ3JpZCBzb2x1dGlvbiBpcyByZXR1cm5lZCBpbiB1Y1swLi5uYy0xXVswLi5uYy0xXS4KKyovCitzdGF0aWMgdm9pZCBmbWdfcmVzdHJpY3QoRklCSVRNQVAgKlVDLCBGSUJJVE1BUCAqVUYsIGludCBuYykgeworCWludCByb3dfdWMsIHJvd191ZiwgY29sX3VjLCBjb2xfdWY7CisKKwljb25zdCBpbnQgdWNfcGl0Y2ggID0gRnJlZUltYWdlX0dldFBpdGNoKFVDKSAvIHNpemVvZihmbG9hdCk7CisJY29uc3QgaW50IHVmX3BpdGNoICA9IEZyZWVJbWFnZV9HZXRQaXRjaChVRikgLyBzaXplb2YoZmxvYXQpOworCQorCWZsb2F0ICp1Y19iaXRzID0gKGZsb2F0KilGcmVlSW1hZ2VfR2V0Qml0cyhVQyk7CisJY29uc3QgZmxvYXQgKnVmX2JpdHMgPSAoZmxvYXQqKUZyZWVJbWFnZV9HZXRCaXRzKFVGKTsKKworCS8vIGludGVyaW9yIHBvaW50cworCXsKKwkJZmxvYXQgKnVjX3NjYW4gPSB1Y19iaXRzICsgdWNfcGl0Y2g7CisJCWZvciAocm93X3VjID0gMSwgcm93X3VmID0gMjsgcm93X3VjIDwgbmMtMTsgcm93X3VjKyssIHJvd191ZiArPSAyKSB7CisJCQljb25zdCBmbG9hdCAqdWZfc2NhbiA9IHVmX2JpdHMgKyByb3dfdWYgKiB1Zl9waXRjaDsKKwkJCWZvciAoY29sX3VjID0gMSwgY29sX3VmID0gMjsgY29sX3VjIDwgbmMtMTsgY29sX3VjKyssIGNvbF91ZiArPSAyKSB7IAorCQkJCS8vIGNhbGN1bGF0ZSAKKwkJCQkvLyBVQyhyb3dfdWMsIGNvbF91YykgPSAKKwkJCQkvLyAwLjUgKiBVRihyb3dfdWYsIGNvbF91ZikgKyAwLjEyNSAqIFsgVUYocm93X3VmKzEsIGNvbF91ZikgKyBVRihyb3dfdWYtMSwgY29sX3VmKSArIFVGKHJvd191ZiwgY29sX3VmKzEpICsgVUYocm93X3VmLCBjb2xfdWYtMSkgXQorCQkJCWZsb2F0ICp1Y19waXhlbCA9IHVjX3NjYW4gKyBjb2xfdWM7CisJCQkJY29uc3QgZmxvYXQgKnVmX2NlbnRlciA9IHVmX3NjYW4gKyBjb2xfdWY7CisJCQkJKnVjX3BpeGVsID0gMC41RiAqICp1Zl9jZW50ZXIgKyAwLjEyNUYgKiAoICoodWZfY2VudGVyICsgdWZfcGl0Y2gpICsgKih1Zl9jZW50ZXIgLSB1Zl9waXRjaCkgKyAqKHVmX2NlbnRlciArIDEpICsgKih1Zl9jZW50ZXIgLSAxKSApOworCQkJfQorCQkJdWNfc2NhbiArPSB1Y19waXRjaDsKKwkJfQorCX0KKwkvLyBib3VuZGFyeSBwb2ludHMKKwljb25zdCBpbnQgbmNjID0gMipuYy0xOworCXsKKwkJLyoKKwkJY2FsY3VsYXRlIHRoZSBmb2xsb3dpbmc6IAorCQlmb3IgKHJvd191YyA9IDAsIHJvd191ZiA9IDA7IHJvd191YyA8IG5jOyByb3dfdWMrKywgcm93X3VmICs9IDIpIHsgCisJCQlVQyhyb3dfdWMsIDApID0gVUYocm93X3VmLCAwKTsJCQorCQkJVUMocm93X3VjLCBuYy0xKSA9IFVGKHJvd191ZiwgbmNjLTEpOworCQl9CisJCSovCisJCWZsb2F0ICp1Y19zY2FuID0gdWNfYml0czsKKwkJZm9yIChyb3dfdWMgPSAwLCByb3dfdWYgPSAwOyByb3dfdWMgPCBuYzsgcm93X3VjKyssIHJvd191ZiArPSAyKSB7IAorCQkJY29uc3QgZmxvYXQgKnVmX3NjYW4gPSB1Zl9iaXRzICsgcm93X3VmICogdWZfcGl0Y2g7CisJCQl1Y19zY2FuWzBdID0gdWZfc2NhblswXTsKKwkJCXVjX3NjYW5bbmMtMV0gPSB1Zl9zY2FuW25jYy0xXTsKKwkJCXVjX3NjYW4gKz0gdWNfcGl0Y2g7CisJCX0KKwl9CisJeworCQkvKgorCQljYWxjdWxhdGUgdGhlIGZvbGxvd2luZzogCisJCWZvciAoY29sX3VjID0gMCwgY29sX3VmID0gMDsgY29sX3VjIDwgbmM7IGNvbF91YysrLCBjb2xfdWYgKz0gMikgeworCQkJVUMoMCwgY29sX3VjKSA9IFVGKDAsIGNvbF91Zik7CisJCQlVQyhuYy0xLCBjb2xfdWMpID0gVUYobmNjLTEsIGNvbF91Zik7CisJCX0KKwkJKi8KKwkJZmxvYXQgKnVjX3NjYW5fdG9wID0gdWNfYml0czsKKwkJZmxvYXQgKnVjX3NjYW5fYm90dG9tID0gdWNfYml0cyArIChuYy0xKSp1Y19waXRjaDsKKwkJY29uc3QgZmxvYXQgKnVmX3NjYW5fdG9wID0gdWZfYml0cyArIChuY2MtMSkqdWZfcGl0Y2g7CisJCWNvbnN0IGZsb2F0ICp1Zl9zY2FuX2JvdHRvbSA9IHVmX2JpdHM7CisJCWZvciAoY29sX3VjID0gMCwgY29sX3VmID0gMDsgY29sX3VjIDwgbmM7IGNvbF91YysrLCBjb2xfdWYgKz0gMikgeworCQkJdWNfc2Nhbl90b3BbY29sX3VjXSA9IHVmX3NjYW5fdG9wW2NvbF91Zl07CisJCQl1Y19zY2FuX2JvdHRvbVtjb2xfdWNdID0gdWZfc2Nhbl9ib3R0b21bY29sX3VmXTsKKwkJfQorCX0KK30KKworLyoqCitTb2x1dGlvbiBvZiB0aGUgbW9kZWwgcHJvYmxlbSBvbiB0aGUgY29hcnNlc3QgZ3JpZCwgd2hlcmUgaCA9IDEvMiAuIAorVGhlIHJpZ2h0LWhhbmQgc2lkZSBpcyBpbnB1dAoraW4gcmhzWzAuLjJdWzAuLjJdIGFuZCB0aGUgc29sdXRpb24gaXMgcmV0dXJuZWQgaW4gdVswLi4yXVswLi4yXS4KKyovCitzdGF0aWMgdm9pZCBmbWdfc29sdmUoRklCSVRNQVAgKlUsIEZJQklUTUFQICpSSFMpIHsKKwkvLyBmaWxsIFUgd2l0aCB6ZXJvcworCWZtZ19maWxsQXJyYXlXaXRoWmVyb3MoVSk7CisJLy8gY2FsY3VsYXRlIFUoMSwgMSkgPSAtaCpoKlJIUygxLCAxKS80LjAgd2hlcmUgaCA9IDEvMgorCWZsb2F0ICp1X3NjYW4gPSAoZmxvYXQqKUZyZWVJbWFnZV9HZXRTY2FuTGluZShVLCAxKTsKKwljb25zdCBmbG9hdCAqcmhzX3NjYW4gPSAoZmxvYXQqKUZyZWVJbWFnZV9HZXRTY2FuTGluZShSSFMsIDEpOworCXVfc2NhblsxXSA9IC1yaHNfc2NhblsxXSAvIDE2OworfQorCisvKioKK0NvYXJzZS10by1maW5lIHByb2xvbmdhdGlvbiBieSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uLiBuZiBpcyB0aGUgZmluZS1ncmlkIGRpbWVuc2lvbi4gVGhlIGNvYXJzZWdyaWQKK3NvbHV0aW9uIGlzIGlucHV0IGFzIHVjWzAuLm5jLTFdWzAuLm5jLTFdLCB3aGVyZSBuYyA9IG5mLzIgKyAxLiBUaGUgZmluZS1ncmlkIHNvbHV0aW9uIGlzCityZXR1cm5lZCBpbiB1ZlswLi5uZi0xXVswLi5uZi0xXS4KKyovCitzdGF0aWMgdm9pZCBmbWdfcHJvbG9uZ2F0ZShGSUJJVE1BUCAqVUYsIEZJQklUTUFQICpVQywgaW50IG5mKSB7CisJaW50IHJvd191Yywgcm93X3VmLCBjb2xfdWMsIGNvbF91ZjsKKworCWNvbnN0IGludCB1Zl9waXRjaCAgPSBGcmVlSW1hZ2VfR2V0UGl0Y2goVUYpIC8gc2l6ZW9mKGZsb2F0KTsKKwljb25zdCBpbnQgdWNfcGl0Y2ggID0gRnJlZUltYWdlX0dldFBpdGNoKFVDKSAvIHNpemVvZihmbG9hdCk7CisJCisJZmxvYXQgKnVmX2JpdHMgPSAoZmxvYXQqKUZyZWVJbWFnZV9HZXRCaXRzKFVGKTsKKwljb25zdCBmbG9hdCAqdWNfYml0cyA9IChmbG9hdCopRnJlZUltYWdlX0dldEJpdHMoVUMpOworCQorCS8vIGRvIGVsZW1lbnRzIHRoYXQgYXJlIGNvcGllcworCXsKKwkJY29uc3QgaW50IG5jID0gbmYvMiArIDE7CisKKwkJZmxvYXQgKnVmX3NjYW4gPSB1Zl9iaXRzOworCQljb25zdCBmbG9hdCAqdWNfc2NhbiA9IHVjX2JpdHM7CQkKKwkJZm9yIChyb3dfdWMgPSAwOyByb3dfdWMgPCBuYzsgcm93X3VjKyspIHsKKwkJCWZvciAoY29sX3VjID0gMCwgY29sX3VmID0gMDsgY29sX3VjIDwgbmM7IGNvbF91YysrLCBjb2xfdWYgKz0gMikgeworCQkJCS8vIGNhbGN1bGF0ZSBVRigyKnJvd191YywgY29sX3VmKSA9IFVDKHJvd191YywgY29sX3VjKTsKKwkJCQl1Zl9zY2FuW2NvbF91Zl0gPSB1Y19zY2FuW2NvbF91Y107CisJCQl9CisJCQl1Y19zY2FuICs9IHVjX3BpdGNoOworCQkJdWZfc2NhbiArPSAyICogdWZfcGl0Y2g7CisJCX0KKwl9CisJLy8gZG8gb2RkLW51bWJlcmVkIGNvbHVtbnMsIGludGVycG9sYXRpbmcgdmVydGljYWxseQorCXsJCQorCQlmb3Iocm93X3VmID0gMTsgcm93X3VmIDwgbmYtMTsgcm93X3VmICs9IDIpIHsKKwkJCWZsb2F0ICp1Zl9zY2FuID0gdWZfYml0cyArIHJvd191ZiAqIHVmX3BpdGNoOworCQkJZm9yIChjb2xfdWYgPSAwOyBjb2xfdWYgPCBuZjsgY29sX3VmICs9IDIpIHsKKwkJCQkvLyBjYWxjdWxhdGUgVUYocm93X3VmLCBjb2xfdWYpID0gMC41ICogKCBVRihyb3dfdWYrMSwgY29sX3VmKSArIFVGKHJvd191Zi0xLCBjb2xfdWYpICkKKwkJCQl1Zl9zY2FuW2NvbF91Zl0gPSAwLjVGICogKCAqKHVmX3NjYW4gKyB1Zl9waXRjaCArIGNvbF91ZikgKyAqKHVmX3NjYW4gLSB1Zl9waXRjaCArIGNvbF91ZikgKTsKKwkJCX0KKwkJfQorCX0KKwkvLyBkbyBldmVuLW51bWJlcmVkIGNvbHVtbnMsIGludGVycG9sYXRpbmcgaG9yaXpvbnRhbGx5CisJeworCQlmbG9hdCAqdWZfc2NhbiA9IHVmX2JpdHM7CisJCWZvcihyb3dfdWYgPSAwOyByb3dfdWYgPCBuZjsgcm93X3VmKyspIHsKKwkJCWZvciAoY29sX3VmID0gMTsgY29sX3VmIDwgbmYtMTsgY29sX3VmICs9IDIpIHsKKwkJCQkvLyBjYWxjdWxhdGUgVUYocm93X3VmLCBjb2xfdWYpID0gMC41ICogKCBVRihyb3dfdWYsIGNvbF91ZisxKSArIFVGKHJvd191ZiwgY29sX3VmLTEpICkKKwkJCQl1Zl9zY2FuW2NvbF91Zl0gPSAwLjVGICogKCB1Zl9zY2FuW2NvbF91ZiArIDFdICsgdWZfc2Nhbltjb2xfdWYgLSAxXSApOworCQkJfQorCQkJdWZfc2NhbiArPSB1Zl9waXRjaDsKKwkJfQorCX0KK30KKworLyoqCitSZWQtYmxhY2sgR2F1c3MtU2VpZGVsIHJlbGF4YXRpb24gZm9yIG1vZGVsIHByb2JsZW0uIFVwZGF0ZXMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHNvbHV0aW9uCit1WzAuLm4tMV1bMC4ubi0xXSwgdXNpbmcgdGhlIHJpZ2h0LWhhbmQgc2lkZSBmdW5jdGlvbiByaHNbMC4ubi0xXVswLi5uLTFdLgorKi8KK3N0YXRpYyB2b2lkIGZtZ19yZWxheGF0aW9uKEZJQklUTUFQICpVLCBGSUJJVE1BUCAqUkhTLCBpbnQgbikgeworCWludCByb3csIGNvbCwgaXBhc3MsIGlzdywganN3OworCWNvbnN0IGZsb2F0IGggPSAxLjBGIC8gKG4gLSAxKTsKKwljb25zdCBmbG9hdCBoMiA9IGgqaDsKKworCWNvbnN0IGludCB1X3BpdGNoICA9IEZyZWVJbWFnZV9HZXRQaXRjaChVKSAvIHNpemVvZihmbG9hdCk7CisJY29uc3QgaW50IHJoc19waXRjaCAgPSBGcmVlSW1hZ2VfR2V0UGl0Y2goUkhTKSAvIHNpemVvZihmbG9hdCk7CisJCisJZmxvYXQgKnVfYml0cyA9IChmbG9hdCopRnJlZUltYWdlX0dldEJpdHMoVSk7CisJY29uc3QgZmxvYXQgKnJoc19iaXRzID0gKGZsb2F0KilGcmVlSW1hZ2VfR2V0Qml0cyhSSFMpOworCisJZm9yIChpcGFzcyA9IDAsIGpzdyA9IDE7IGlwYXNzIDwgMjsgaXBhc3MrKywganN3ID0gMy1qc3cpIHsgLy8gUmVkIGFuZCBibGFjayBzd2VlcHMKKwkJZmxvYXQgKnVfc2NhbiA9IHVfYml0cyArIHVfcGl0Y2g7CisJCWNvbnN0IGZsb2F0ICpyaHNfc2NhbiA9IHJoc19iaXRzICsgcmhzX3BpdGNoOworCQlmb3IgKHJvdyA9IDEsIGlzdyA9IGpzdzsgcm93IDwgbi0xOyByb3crKywgaXN3ID0gMy1pc3cpIHsKKwkJCWZvciAoY29sID0gaXN3OyBjb2wgPCBuLTE7IGNvbCArPSAyKSB7IAorCQkJCS8vIEdhdXNzLVNlaWRlbCBmb3JtdWxhCisJCQkJLy8gY2FsY3VsYXRlIFUocm93LCBjb2wpID0gCisJCQkJLy8gMC4yNSAqIFsgVShyb3crMSwgY29sKSArIFUocm93LTEsIGNvbCkgKyBVKHJvdywgY29sKzEpICsgVShyb3csIGNvbC0xKSAtIGgyICogUkhTKHJvdywgY29sKSBdCQkgCisJCQkJZmxvYXQgKnVfY2VudGVyID0gdV9zY2FuICsgY29sOworCQkJCWNvbnN0IGZsb2F0ICpyaHNfY2VudGVyID0gcmhzX3NjYW4gKyBjb2w7CisJCQkJKnVfY2VudGVyID0gKih1X2NlbnRlciArIHVfcGl0Y2gpICsgKih1X2NlbnRlciAtIHVfcGl0Y2gpICsgKih1X2NlbnRlciArIDEpICsgKih1X2NlbnRlciAtIDEpOworCQkJCSp1X2NlbnRlciAtPSBoMiAqICpyaHNfY2VudGVyOworCQkJCSp1X2NlbnRlciAqPSAwLjI1RjsKKwkJCX0KKwkJCXVfc2NhbiArPSB1X3BpdGNoOworCQkJcmhzX3NjYW4gKz0gcmhzX3BpdGNoOworCQl9CisJfQorfQorCisvKioKK1JldHVybnMgbWludXMgdGhlIHJlc2lkdWFsIGZvciB0aGUgbW9kZWwgcHJvYmxlbS4gSW5wdXQgcXVhbnRpdGllcyBhcmUgdVswLi5uLTFdWzAuLm4tMV0gYW5kCityaHNbMC4ubi0xXVswLi5uLTFdLCB3aGlsZSByZXNbMC4ubi0xXVswLi5uLTFdIGlzIHJldHVybmVkLgorKi8KK3N0YXRpYyB2b2lkIGZtZ19yZXNpZHVhbChGSUJJVE1BUCAqUkVTLCBGSUJJVE1BUCAqVSwgRklCSVRNQVAgKlJIUywgaW50IG4pIHsKKwlpbnQgcm93LCBjb2w7CisKKwljb25zdCBmbG9hdCBoID0gMS4wRiAvIChuLTEpOwkKKwljb25zdCBmbG9hdCBoMmkgPSAxLjBGIC8gKGgqaCk7CisKKwljb25zdCBpbnQgcmVzX3BpdGNoICA9IEZyZWVJbWFnZV9HZXRQaXRjaChSRVMpIC8gc2l6ZW9mKGZsb2F0KTsKKwljb25zdCBpbnQgdV9waXRjaCAgPSBGcmVlSW1hZ2VfR2V0UGl0Y2goVSkgLyBzaXplb2YoZmxvYXQpOworCWNvbnN0IGludCByaHNfcGl0Y2ggID0gRnJlZUltYWdlX0dldFBpdGNoKFJIUykgLyBzaXplb2YoZmxvYXQpOworCQorCWZsb2F0ICpyZXNfYml0cyA9IChmbG9hdCopRnJlZUltYWdlX0dldEJpdHMoUkVTKTsKKwljb25zdCBmbG9hdCAqdV9iaXRzID0gKGZsb2F0KilGcmVlSW1hZ2VfR2V0Qml0cyhVKTsKKwljb25zdCBmbG9hdCAqcmhzX2JpdHMgPSAoZmxvYXQqKUZyZWVJbWFnZV9HZXRCaXRzKFJIUyk7CisKKwkvLyBpbnRlcmlvciBwb2ludHMKKwl7CisJCWZsb2F0ICpyZXNfc2NhbiA9IHJlc19iaXRzICsgcmVzX3BpdGNoOworCQljb25zdCBmbG9hdCAqdV9zY2FuID0gdV9iaXRzICsgdV9waXRjaDsKKwkJY29uc3QgZmxvYXQgKnJoc19zY2FuID0gcmhzX2JpdHMgKyByaHNfcGl0Y2g7CisJCWZvciAocm93ID0gMTsgcm93IDwgbi0xOyByb3crKykgeworCQkJZm9yIChjb2wgPSAxOyBjb2wgPCBuLTE7IGNvbCsrKSB7CisJCQkJLy8gY2FsY3VsYXRlIFJFUyhyb3csIGNvbCkgPSAKKwkJCQkvLyAtaDJpICogWyBVKHJvdysxLCBjb2wpICsgVShyb3ctMSwgY29sKSArIFUocm93LCBjb2wrMSkgKyBVKHJvdywgY29sLTEpIC0gNCAqIFUocm93LCBjb2wpIF0gKyBSSFMocm93LCBjb2wpOworCQkJCWZsb2F0ICpyZXNfY2VudGVyID0gcmVzX3NjYW4gKyBjb2w7CisJCQkJY29uc3QgZmxvYXQgKnVfY2VudGVyID0gdV9zY2FuICsgY29sOworCQkJCWNvbnN0IGZsb2F0ICpyaHNfY2VudGVyID0gcmhzX3NjYW4gKyBjb2w7CisJCQkJKnJlc19jZW50ZXIgPSAqKHVfY2VudGVyICsgdV9waXRjaCkgKyAqKHVfY2VudGVyIC0gdV9waXRjaCkgKyAqKHVfY2VudGVyICsgMSkgKyAqKHVfY2VudGVyIC0gMSkgLSA0ICogKnVfY2VudGVyOworCQkJCSpyZXNfY2VudGVyICo9IC1oMmk7CisJCQkJKnJlc19jZW50ZXIgKz0gKnJoc19jZW50ZXI7CisJCQl9CisJCQlyZXNfc2NhbiArPSByZXNfcGl0Y2g7CisJCQl1X3NjYW4gKz0gdV9waXRjaDsKKwkJCXJoc19zY2FuICs9IHJoc19waXRjaDsKKwkJfQorCX0KKworCS8vIGJvdW5kYXJ5IHBvaW50cworCXsKKwkJbWVtc2V0KEZyZWVJbWFnZV9HZXRTY2FuTGluZShSRVMsIDApLCAwLCBGcmVlSW1hZ2VfR2V0UGl0Y2goUkVTKSk7CisJCW1lbXNldChGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoUkVTLCBuLTEpLCAwLCBGcmVlSW1hZ2VfR2V0UGl0Y2goUkVTKSk7CisJCWZsb2F0ICpsZWZ0ID0gcmVzX2JpdHM7CisJCWZsb2F0ICpyaWdodCA9IHJlc19iaXRzICsgKG4tMSk7CisJCWZvcihpbnQgayA9IDA7IGsgPCBuOyBrKyspIHsKKwkJCSpsZWZ0ID0gMDsKKwkJCSpyaWdodCA9IDA7CisJCQlsZWZ0ICs9IHJlc19waXRjaDsKKwkJCXJpZ2h0ICs9IHJlc19waXRjaDsKKwkJfQorCX0KK30KKworLyoqCitEb2VzIGNvYXJzZS10by1maW5lIGludGVycG9sYXRpb24gYW5kIGFkZHMgcmVzdWx0IHRvIHVmLiBuZiBpcyB0aGUgZmluZS1ncmlkIGRpbWVuc2lvbi4gVGhlCitjb2Fyc2UtZ3JpZCBzb2x1dGlvbiBpcyBpbnB1dCBhcyB1Y1swLi5uYy0xXVswLi5uYy0xXSwgd2hlcmUgbmMgPSBuZi8yKzEuIFRoZSBmaW5lLWdyaWQgc29sdXRpb24KK2lzIHJldHVybmVkIGluIHVmWzAuLm5mLTFdWzAuLm5mLTFdLiByZXNbMC4ubmYtMV1bMC4ubmYtMV0gaXMgdXNlZCBmb3IgdGVtcG9yYXJ5IHN0b3JhZ2UuCisqLworc3RhdGljIHZvaWQgZm1nX2FkZGludChGSUJJVE1BUCAqVUYsIEZJQklUTUFQICpVQywgRklCSVRNQVAgKlJFUywgaW50IG5mKSB7CisJZm1nX3Byb2xvbmdhdGUoUkVTLCBVQywgbmYpOworCisJY29uc3QgaW50IHVmX3BpdGNoICA9IEZyZWVJbWFnZV9HZXRQaXRjaChVRikgLyBzaXplb2YoZmxvYXQpOworCWNvbnN0IGludCByZXNfcGl0Y2ggID0gRnJlZUltYWdlX0dldFBpdGNoKFJFUykgLyBzaXplb2YoZmxvYXQpOwkKKworCWZsb2F0ICp1Zl9iaXRzID0gKGZsb2F0KilGcmVlSW1hZ2VfR2V0Qml0cyhVRik7CisJY29uc3QgZmxvYXQgKnJlc19iaXRzID0gKGZsb2F0KilGcmVlSW1hZ2VfR2V0Qml0cyhSRVMpOworCisJZm9yKGludCByb3cgPSAwOyByb3cgPCBuZjsgcm93KyspIHsKKwkJZm9yKGludCBjb2wgPSAwOyBjb2wgPCBuZjsgY29sKyspIHsKKwkJCS8vIGNhbGN1bGF0ZSBVRihyb3csIGNvbCkgPSBVRihyb3csIGNvbCkgKyBSRVMocm93LCBjb2wpOworCQkJdWZfYml0c1tjb2xdICs9IHJlc19iaXRzW2NvbF07CisJCX0KKwkJdWZfYml0cyArPSB1Zl9waXRjaDsKKwkJcmVzX2JpdHMgKz0gcmVzX3BpdGNoOworCX0KK30KKworLyoqCitGdWxsIE11bHRpZ3JpZCBBbGdvcml0aG0gZm9yIHNvbHV0aW9uIG9mIGxpbmVhciBlbGxpcHRpYyBlcXVhdGlvbiwgaGVyZSB0aGUgbW9kZWwgcHJvYmxlbSAoMTkuMC42KS4KK09uIGlucHV0IHVbMC4ubi0xXVswLi5uLTFdIGNvbnRhaW5zIHRoZSByaWdodC1oYW5kIHNpZGUg8Swgd2hpbGUgb24gb3V0cHV0IGl0IHJldHVybnMgdGhlIHNvbHV0aW9uLgorVGhlIGRpbWVuc2lvbiBuIG11c3QgYmUgb2YgdGhlIGZvcm0gMl5qICsgMSBmb3Igc29tZSBpbnRlZ2VyIGouIChqIGlzIGFjdHVhbGx5IHRoZSBudW1iZXIgb2YKK2dyaWQgbGV2ZWxzIHVzZWQgaW4gdGhlIHNvbHV0aW9uLCBjYWxsZWQgbmcgYmVsb3cuKSBuY3ljbGUgaXMgdGhlIG51bWJlciBvZiBWLWN5Y2xlcyB0byBiZQordXNlZCBhdCBlYWNoIGxldmVsLgorKi8KK3N0YXRpYyBCT09MIGZtZ19tZ2xpbihGSUJJVE1BUCAqVSwgaW50IG4sIGludCBuY3ljbGUpIHsKKwlpbnQgaiwgamN5Y2xlLCBqaiwganBvc3QsIGpwcmUsIG5mLCBuZ3JpZDsKKworCUZJQklUTUFQICoqSVJITyA9IE5VTEw7CisJRklCSVRNQVAgKipJVSAgID0gTlVMTDsKKwlGSUJJVE1BUCAqKklSSFMgPSBOVUxMOworCUZJQklUTUFQICoqSVJFUyA9IE5VTEw7CisJCisJaW50IG5nID0gMDsJCS8vIG51bWJlciBvZiBhbGxvY2F0ZWQgZ3JpZHMKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBfQ1JFQVRFX0FSUkFZX0dSSURfKGFycmF5LCBhcnJheV9zaXplKSBcCisJYXJyYXkgPSAoRklCSVRNQVAqKiltYWxsb2MoYXJyYXlfc2l6ZSAqIHNpemVvZihGSUJJVE1BUCopKTtcCisJaWYoIWFycmF5KSB0aHJvdygxKTtcCisJbWVtc2V0KGFycmF5LCAwLCBhcnJheV9zaXplICogc2l6ZW9mKEZJQklUTUFQKikpCisKKyNkZWZpbmUgX0ZSRUVfQVJSQVlfR1JJRF8oYXJyYXksIGFycmF5X3NpemUpIFwKKwlpZihOVUxMICE9IGFycmF5KSB7XAorCQlmb3IoaW50IGsgPSAwOyBrIDwgYXJyYXlfc2l6ZTsgaysrKSB7XAorCQkJaWYoTlVMTCAhPSBhcnJheVtrXSkge1wKKwkJCQlGcmVlSW1hZ2VfVW5sb2FkKGFycmF5W2tdKTsgYXJyYXlba10gPSBOVUxMO1wKKwkJCX1cCisJCX1cCisJCWZyZWUoYXJyYXkpO1wKKwl9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwl0cnkgeworCQlpbnQgbm4gPSBuOworCQkvLyBjaGVjayBncmlkIHNpemUgYW5kIGdyaWQgbGV2ZWxzCisJCXdoaWxlIChubiA+Pj0gMSkgbmcrKzsKKwkJaWYgKG4gIT0gMSArICgxTCA8PCBuZykpIHsKKwkJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhGSUZfVU5LTk9XTiwgIk11bHRpZ3JpZCBhbGdvcml0aG06IG4gPSAlZCwgd2hpbGUgbi0xIG11c3QgYmUgYSBwb3dlciBvZiAyLiIsIG4pOworCQkJdGhyb3coMSk7CisJCX0KKwkJaWYgKG5nID4gTkdNQVgpIHsKKwkJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhGSUZfVU5LTk9XTiwgIk11bHRpZ3JpZCBhbGdvcml0aG06IG5nID0gJWQgd2hpbGUgTkdNQVggPSAlZCwgaW5jcmVhc2UgTkdNQVguIiwgbmcsIE5HTUFYKTsKKwkJCXRocm93KDEpOworCQl9CisJCS8vIGFsbG9jYXRlIGdyaWQgYXJyYXlzCisJCXsKKwkJCV9DUkVBVEVfQVJSQVlfR1JJRF8oSVJITywgbmcpOworCQkJX0NSRUFURV9BUlJBWV9HUklEXyhJVSwgbmcpOworCQkJX0NSRUFURV9BUlJBWV9HUklEXyhJUkhTLCBuZyk7CisJCQlfQ1JFQVRFX0FSUkFZX0dSSURfKElSRVMsIG5nKTsKKwkJfQorCisJCW5uID0gbi8yICsgMTsKKwkJbmdyaWQgPSBuZyAtIDI7CisKKwkJLy8gYWxsb2NhdGUgc3RvcmFnZSBmb3Igci5oLnMuIG9uIGdyaWQgKG5nIC0gMikgLi4uCisJCUlSSE9bbmdyaWRdID0gRnJlZUltYWdlX0FsbG9jYXRlVChGSVRfRkxPQVQsIG5uLCBubik7CisJCWlmKCFJUkhPW25ncmlkXSkgdGhyb3coMSk7CisKKwkJLy8gLi4uIGFuZCBmaWxsIGl0IGJ5IHJlc3RyaWN0aW5nIGZyb20gdGhlIGZpbmUgZ3JpZAorCQlmbWdfcmVzdHJpY3QoSVJIT1tuZ3JpZF0sIFUsIG5uKTsJCisKKwkJLy8gc2ltaWxhcmx5IGFsbG9jYXRlIHN0b3JhZ2UgYW5kIGZpbGwgci5oLnMuIG9uIGFsbCBjb2Fyc2UgZ3JpZHMuCisJCXdoaWxlIChubiA+IDMpIHsKKwkJCW5uID0gbm4vMiArIDE7IAorCQkJbmdyaWQtLTsKKwkJCUlSSE9bbmdyaWRdID0gRnJlZUltYWdlX0FsbG9jYXRlVChGSVRfRkxPQVQsIG5uLCBubik7CisJCQlpZighSVJIT1tuZ3JpZF0pIHRocm93KDEpOworCQkJZm1nX3Jlc3RyaWN0KElSSE9bbmdyaWRdLCBJUkhPW25ncmlkKzFdLCBubik7CisJCX0KKworCQlubiA9IDM7CisKKwkJSVVbMF0gPSBGcmVlSW1hZ2VfQWxsb2NhdGVUKEZJVF9GTE9BVCwgbm4sIG5uKTsKKwkJaWYoIUlVWzBdKSB0aHJvdygxKTsKKwkJSVJIU1swXSA9IEZyZWVJbWFnZV9BbGxvY2F0ZVQoRklUX0ZMT0FULCBubiwgbm4pOworCQlpZighSVJIU1swXSkgdGhyb3coMSk7CisKKwkJLy8gaW5pdGlhbCBzb2x1dGlvbiBvbiBjb2Fyc2VzdCBncmlkCisJCWZtZ19zb2x2ZShJVVswXSwgSVJIT1swXSk7CisJCS8vIGlyaG9bMF0gbm8gbG9uZ2VyIG5lZWRlZCAuLi4KKwkJRnJlZUltYWdlX1VubG9hZChJUkhPWzBdKTsgSVJIT1swXSA9IE5VTEw7CisKKwkJbmdyaWQgPSBuZzsKKworCQkvLyBuZXN0ZWQgaXRlcmF0aW9uIGxvb3AKKwkJZm9yIChqID0gMTsgaiA8IG5ncmlkOyBqKyspIHsKKwkJCW5uID0gMipubiAtIDE7CisKKwkJCUlVW2pdID0gRnJlZUltYWdlX0FsbG9jYXRlVChGSVRfRkxPQVQsIG5uLCBubik7CisJCQlpZighSVVbal0pIHRocm93KDEpOworCQkJSVJIU1tqXSA9IEZyZWVJbWFnZV9BbGxvY2F0ZVQoRklUX0ZMT0FULCBubiwgbm4pOworCQkJaWYoIUlSSFNbal0pIHRocm93KDEpOworCQkJSVJFU1tqXSA9IEZyZWVJbWFnZV9BbGxvY2F0ZVQoRklUX0ZMT0FULCBubiwgbm4pOworCQkJaWYoIUlSRVNbal0pIHRocm93KDEpOworCisJCQlmbWdfcHJvbG9uZ2F0ZShJVVtqXSwgSVVbai0xXSwgbm4pOworCQkJCisJCQkvLyBpbnRlcnBvbGF0ZSBmcm9tIGNvYXJzZSBncmlkIHRvIG5leHQgZmluZXIgZ3JpZAorCisJCQkvLyBzZXQgdXAgci5oLnMuCisJCQlmbWdfY29weUFycmF5KElSSFNbal0sIGogIT0gKG5ncmlkIC0gMSkgPyBJUkhPW2pdIDogVSk7CisJCQkKKwkJCS8vIFYtY3ljbGUgbG9vcAorCQkJZm9yIChqY3ljbGUgPSAwOyBqY3ljbGUgPCBuY3ljbGU7IGpjeWNsZSsrKSB7CisJCQkJbmYgPSBubjsKKwkJCQkvLyBkb3dud2FyZCBzdG9rZSBvZiB0aGUgVgorCQkJCWZvciAoamogPSBqOyBqaiA+PSAxOyBqai0tKSB7CisJCQkJCS8vIHByZS1zbW9vdGhpbmcKKwkJCQkJZm9yIChqcHJlID0gMDsganByZSA8IE5QUkU7IGpwcmUrKykgeworCQkJCQkJZm1nX3JlbGF4YXRpb24oSVVbampdLCBJUkhTW2pqXSwgbmYpOworCQkJCQl9CisJCQkJCWZtZ19yZXNpZHVhbChJUkVTW2pqXSwgSVVbampdLCBJUkhTW2pqXSwgbmYpOworCQkJCQluZiA9IG5mLzIgKyAxOworCQkJCQkvLyByZXN0cmljdGlvbiBvZiB0aGUgcmVzaWR1YWwgaXMgdGhlIG5leHQgci5oLnMuCisJCQkJCWZtZ19yZXN0cmljdChJUkhTW2pqLTFdLCBJUkVTW2pqXSwgbmYpOwkJCQkKKwkJCQkJLy8gemVybyBmb3IgaW5pdGlhbCBndWVzcyBpbiBuZXh0IHJlbGF4YXRpb24KKwkJCQkJZm1nX2ZpbGxBcnJheVdpdGhaZXJvcyhJVVtqai0xXSk7CisJCQkJfQorCQkJCS8vIGJvdHRvbSBvZiBWOiBzb2x2ZSBvbiBjb2Fyc2VzdCBncmlkCisJCQkJZm1nX3NvbHZlKElVWzBdLCBJUkhTWzBdKTsgCisJCQkJbmYgPSAzOyAKKwkJCQkvLyB1cHdhcmQgc3Ryb2tlIG9mIFYuCisJCQkJZm9yIChqaiA9IDE7IGpqIDw9IGo7IGpqKyspIHsgCisJCQkJCW5mID0gMipuZiAtIDE7CisJCQkJCS8vIHVzZSByZXMgZm9yIHRlbXBvcmFyeSBzdG9yYWdlIGluc2lkZSBhZGRpbnQKKwkJCQkJZm1nX2FkZGludChJVVtqal0sIElVW2pqLTFdLCBJUkVTW2pqXSwgbmYpOwkJCQkKKwkJCQkJLy8gcG9zdC1zbW9vdGhpbmcKKwkJCQkJZm9yIChqcG9zdCA9IDA7IGpwb3N0IDwgTlBPU1Q7IGpwb3N0KyspIHsKKwkJCQkJCWZtZ19yZWxheGF0aW9uKElVW2pqXSwgSVJIU1tqal0sIG5mKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCisJCS8vIHJldHVybiBzb2x1dGlvbiBpbiBVCisJCWZtZ19jb3B5QXJyYXkoVSwgSVVbbmdyaWQtMV0pOworCisJCS8vIGRlbGV0ZSBhbGxvY2F0ZWQgYXJyYXlzCisJCV9GUkVFX0FSUkFZX0dSSURfKElSRVMsIG5nKTsKKwkJX0ZSRUVfQVJSQVlfR1JJRF8oSVJIUywgbmcpOworCQlfRlJFRV9BUlJBWV9HUklEXyhJVSwgbmcpOworCQlfRlJFRV9BUlJBWV9HUklEXyhJUkhPLCBuZyk7CisKKwkJcmV0dXJuIFRSVUU7CisKKwl9IGNhdGNoKGludCkgeworCQkvLyBkZWxldGUgYWxsb2NhdGVkIGFycmF5cworCQlfRlJFRV9BUlJBWV9HUklEXyhJUkVTLCBuZyk7CisJCV9GUkVFX0FSUkFZX0dSSURfKElSSFMsIG5nKTsKKwkJX0ZSRUVfQVJSQVlfR1JJRF8oSVUsIG5nKTsKKwkJX0ZSRUVfQVJSQVlfR1JJRF8oSVJITywgbmcpOworCisJCXJldHVybiBGQUxTRTsKKwl9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qKgorUG9pc3NvbiBzb2x2ZXIgYmFzZWQgb24gYSBtdWx0aWdyaWQgYWxnb3JpdGhtLiAKK1RoaXMgcm91dGluZSBzb2x2ZXMgYSBQb2lzc29uIGVxdWF0aW9uLCByZW1hcCByZXN1bHQgcGl4ZWxzIHRvIFswLi4xXSBhbmQgcmV0dXJucyB0aGUgc29sdXRpb24uIAorTkI6IFRoZSBpbnB1dCBpbWFnZSBpcyBmaXJzdCBzdG9yZWQgaW5zaWRlIGEgc3F1YXJlIGltYWdlIHdob3NlIHNpemUgaXMgKDJeaiArIDEpeCgyXmogKyAxKSBmb3Igc29tZSBpbnRlZ2VyIGosIAord2hlcmUgaiBpcyBzdWNoIHRoYXQgMl5qIGlzIHRoZSBuZWFyZXN0IGxhcmdlciBkaW1lbnNpb24gY29ycmVzcG9uZGluZyB0byBNQVgoaW1hZ2Ugd2lkdGgsIGltYWdlIGhlaWdodCkuIAorQHBhcmFtIExhcGxhY2lhbiBMYXBsYWNpYW4gaW1hZ2UKK0BwYXJhbSBuY3ljbGUgTnVtYmVyIG9mIGN5Y2xlcyBpbiB0aGUgbXVsdGlncmlkIGFsZ29yaXRobSAodXN1YWxseSAyIG9yIDMpCitAcmV0dXJuIFJldHVybnMgdGhlIHNvbHZlZCBQREUgZXF1YXRpb25zIGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgTlVMTCBvdGhlcndpc2UKKyovCitGSUJJVE1BUCogRExMX0NBTExDT05WIAorRnJlZUltYWdlX011bHRpZ3JpZFBvaXNzb25Tb2x2ZXIoRklCSVRNQVAgKkxhcGxhY2lhbiwgaW50IG5jeWNsZSkgeworCWlmKCFGcmVlSW1hZ2VfSGFzUGl4ZWxzKExhcGxhY2lhbikpIHJldHVybiBOVUxMOworCisJaW50IHdpZHRoID0gRnJlZUltYWdlX0dldFdpZHRoKExhcGxhY2lhbik7CisJaW50IGhlaWdodCA9IEZyZWVJbWFnZV9HZXRIZWlnaHQoTGFwbGFjaWFuKTsKKworCS8vIGdldCBuZWFyZXN0IGxhcmdlciBkaW1lbnNpb24gbGVuZ3RoIHRoYXQgaXMgYWNjZXB0YWJsZSBieSB0aGUgYWxnb3JpdGhtCisJaW50IG4gPSBNQVgod2lkdGgsIGhlaWdodCk7CisJaW50IHNpemUgPSAwOworCXdoaWxlKChuID4+PSAxKSA+IDApIHNpemUrKzsKKwlpZigoMSA8PCBzaXplKSA8IE1BWCh3aWR0aCwgaGVpZ2h0KSkgeworCQlzaXplKys7CisJfQorCS8vIHNpemUgbXVzdCBiZSBvZiB0aGUgZm9ybSAyXmogKyAxIGZvciBzb21lIGludGVnZXIgagorCXNpemUgPSAxICsgKDEgPDwgc2l6ZSk7CisKKwkvLyBhbGxvY2F0ZSBhIHRlbXBvcmFyeSBzcXVhcmUgaW1hZ2UgSQorCUZJQklUTUFQICpJID0gRnJlZUltYWdlX0FsbG9jYXRlVChGSVRfRkxPQVQsIHNpemUsIHNpemUpOworCWlmKCFJKSByZXR1cm4gTlVMTDsKKworCS8vIGNvcHkgTGFwbGFjaWFuIGludG8gSSBhbmQgc2hpZnQgcGl4ZWxzIHRvIGNyZWF0ZSBhIGJvdW5kYXJ5CisJRnJlZUltYWdlX1Bhc3RlKEksIExhcGxhY2lhbiwgMSwgMSwgMjU1KTsKKworCS8vIHNvbHZlIHRoZSBQREUgZXF1YXRpb24KKwlmbWdfbWdsaW4oSSwgc2l6ZSwgbmN5Y2xlKTsKKworCS8vIHNoaWZ0IHBpeGVscyBiYWNrCisJRklCSVRNQVAgKlUgPSBGcmVlSW1hZ2VfQ29weShJLCAxLCAxLCB3aWR0aCArIDEsIGhlaWdodCArIDEpOworCUZyZWVJbWFnZV9VbmxvYWQoSSk7CisKKwkvLyByZW1hcCBwaXhlbHMgdG8gWzAuLjFdCisJTm9ybWFsaXplWShVLCAwLCAxKTsKKworCS8vIGNvcHkgbWV0YWRhdGEgZnJvbSBzcmMgdG8gZHN0CisJRnJlZUltYWdlX0Nsb25lTWV0YWRhdGEoVSwgTGFwbGFjaWFuKTsKKworCS8vIHJldHVybiB0aGUgaW50ZWdyYXRlZCBpbWFnZQorCXJldHVybiBVOworfQorCmRpZmYgLS1naXQgYS9maWxlcy9Tb3VyY2UvRnJlZUltYWdlVG9vbGtpdC9SZXNjYWxlLmNwcCBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2VUb29sa2l0L1Jlc2NhbGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmODg1YzIKLS0tIC9kZXYvbnVsbAorKysgYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlVG9vbGtpdC9SZXNjYWxlLmNwcApAQCAtMCwwICsxLDE5MiBAQAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gVXBzYW1wbGluZyAvIGRvd25zYW1wbGluZyByb3V0aW5lCisvLworLy8gRGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBieQorLy8gLSBIZXJ26SBEcm9sb24gKGRyb2xvbkBpbmZvbmllLmZyKQorLy8gLSBDYXJzdGVuIEtsZWluIChja2xlaW4wNUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQpCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRnJlZUltYWdlIDMKKy8vCisvLyBDT1ZFUkVEIENPREUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkKKy8vIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTCisvLyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy8vIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVECisvLyBDT0RFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UCisvLyBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWQorLy8gU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTAorLy8gUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUgorLy8gVEhJUyBESVNDTEFJTUVSLgorLy8KKy8vIFVzZSBhdCB5b3VyIG93biByaXNrIQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaW5jbHVkZSAiUmVzaXplLmgiCisKK0ZJQklUTUFQICogRExMX0NBTExDT05WCitGcmVlSW1hZ2VfUmVzY2FsZVJlY3QoRklCSVRNQVAgKnNyYywgaW50IGRzdF93aWR0aCwgaW50IGRzdF9oZWlnaHQsIGludCBzcmNfbGVmdCwgaW50IHNyY190b3AsIGludCBzcmNfcmlnaHQsIGludCBzcmNfYm90dG9tLCBGUkVFX0lNQUdFX0ZJTFRFUiBmaWx0ZXIsIHVuc2lnbmVkIGZsYWdzKSB7CisJRklCSVRNQVAgKmRzdCA9IE5VTEw7CisKKwljb25zdCBpbnQgc3JjX3dpZHRoID0gRnJlZUltYWdlX0dldFdpZHRoKHNyYyk7CisJY29uc3QgaW50IHNyY19oZWlnaHQgPSBGcmVlSW1hZ2VfR2V0SGVpZ2h0KHNyYyk7CisKKwlpZiAoIUZyZWVJbWFnZV9IYXNQaXhlbHMoc3JjKSB8fCAoZHN0X3dpZHRoIDw9IDApIHx8IChkc3RfaGVpZ2h0IDw9IDApIHx8IChzcmNfd2lkdGggPD0gMCkgfHwgKHNyY19oZWlnaHQgPD0gMCkpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLy8gbm9ybWFsaXplIHRoZSByZWN0YW5nbGUKKwlpZiAoc3JjX3JpZ2h0IDwgc3JjX2xlZnQpIHsKKwkJSU5QTEFDRVNXQVAoc3JjX2xlZnQsIHNyY19yaWdodCk7CisJfQorCWlmIChzcmNfYm90dG9tIDwgc3JjX3RvcCkgeworCQlJTlBMQUNFU1dBUChzcmNfdG9wLCBzcmNfYm90dG9tKTsKKwl9CisKKwkvLyBjaGVjayB0aGUgc2l6ZSBvZiB0aGUgc3ViIGltYWdlCisJaWYoKHNyY19sZWZ0IDwgMCkgfHwgKHNyY19yaWdodCA+IHNyY193aWR0aCkgfHwgKHNyY190b3AgPCAwKSB8fCAoc3JjX2JvdHRvbSA+IHNyY19oZWlnaHQpKSB7CisJCXJldHVybiBOVUxMOworCX0KKworCS8vIHNlbGVjdCB0aGUgZmlsdGVyCisJQ0dlbmVyaWNGaWx0ZXIgKnBGaWx0ZXIgPSBOVUxMOworCXN3aXRjaCAoZmlsdGVyKSB7CisJCWNhc2UgRklMVEVSX0JPWDoKKwkJCXBGaWx0ZXIgPSBuZXcoc3RkOjpub3Rocm93KSBDQm94RmlsdGVyKCk7CisJCQlicmVhazsKKwkJY2FzZSBGSUxURVJfQklDVUJJQzoKKwkJCXBGaWx0ZXIgPSBuZXcoc3RkOjpub3Rocm93KSBDQmljdWJpY0ZpbHRlcigpOworCQkJYnJlYWs7CisJCWNhc2UgRklMVEVSX0JJTElORUFSOgorCQkJcEZpbHRlciA9IG5ldyhzdGQ6Om5vdGhyb3cpIENCaWxpbmVhckZpbHRlcigpOworCQkJYnJlYWs7CisJCWNhc2UgRklMVEVSX0JTUExJTkU6CisJCQlwRmlsdGVyID0gbmV3KHN0ZDo6bm90aHJvdykgQ0JTcGxpbmVGaWx0ZXIoKTsKKwkJCWJyZWFrOworCQljYXNlIEZJTFRFUl9DQVRNVUxMUk9NOgorCQkJcEZpbHRlciA9IG5ldyhzdGQ6Om5vdGhyb3cpIENDYXRtdWxsUm9tRmlsdGVyKCk7CisJCQlicmVhazsKKwkJY2FzZSBGSUxURVJfTEFOQ1pPUzM6CisJCQlwRmlsdGVyID0gbmV3KHN0ZDo6bm90aHJvdykgQ0xhbmN6b3MzRmlsdGVyKCk7CisJCQlicmVhazsKKwl9CisKKwlpZiAoIXBGaWx0ZXIpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJQ1Jlc2l6ZUVuZ2luZSBFbmdpbmUocEZpbHRlcik7CisKKwlkc3QgPSBFbmdpbmUuc2NhbGUoc3JjLCBkc3Rfd2lkdGgsIGRzdF9oZWlnaHQsIHNyY19sZWZ0LCBzcmNfdG9wLAorCQkJc3JjX3JpZ2h0IC0gc3JjX2xlZnQsIHNyY19ib3R0b20gLSBzcmNfdG9wLCBmbGFncyk7CisKKwlkZWxldGUgcEZpbHRlcjsKKworCWlmICgoZmxhZ3MgJiBGSV9SRVNDQUxFX09NSVRfTUVUQURBVEEpICE9IEZJX1JFU0NBTEVfT01JVF9NRVRBREFUQSkgeworCQkvLyBjb3B5IG1ldGFkYXRhIGZyb20gc3JjIHRvIGRzdAorCQlGcmVlSW1hZ2VfQ2xvbmVNZXRhZGF0YShkc3QsIHNyYyk7CisJfQorCisJcmV0dXJuIGRzdDsKK30KKworRklCSVRNQVAgKiBETExfQ0FMTENPTlYKK0ZyZWVJbWFnZV9SZXNjYWxlKEZJQklUTUFQICpzcmMsIGludCBkc3Rfd2lkdGgsIGludCBkc3RfaGVpZ2h0LCBGUkVFX0lNQUdFX0ZJTFRFUiBmaWx0ZXIpIHsKKwlyZXR1cm4gRnJlZUltYWdlX1Jlc2NhbGVSZWN0KHNyYywgZHN0X3dpZHRoLCBkc3RfaGVpZ2h0LCAwLCAwLCBGcmVlSW1hZ2VfR2V0V2lkdGgoc3JjKSwgRnJlZUltYWdlX0dldEhlaWdodChzcmMpLCBmaWx0ZXIsIEZJX1JFU0NBTEVfREVGQVVMVCk7Cit9CisKK0ZJQklUTUFQICogRExMX0NBTExDT05WCitGcmVlSW1hZ2VfTWFrZVRodW1ibmFpbChGSUJJVE1BUCAqZGliLCBpbnQgbWF4X3BpeGVsX3NpemUsIEJPT0wgY29udmVydCkgeworCUZJQklUTUFQICp0aHVtYm5haWwgPSBOVUxMOworCWludCBuZXdfd2lkdGgsIG5ld19oZWlnaHQ7CisKKwlpZighRnJlZUltYWdlX0hhc1BpeGVscyhkaWIpIHx8IChtYXhfcGl4ZWxfc2l6ZSA8PSAwKSkgcmV0dXJuIE5VTEw7CisKKwlpbnQgd2lkdGgJPSBGcmVlSW1hZ2VfR2V0V2lkdGgoZGliKTsKKwlpbnQgaGVpZ2h0ID0gRnJlZUltYWdlX0dldEhlaWdodChkaWIpOworCisJaWYobWF4X3BpeGVsX3NpemUgPT0gMCkgbWF4X3BpeGVsX3NpemUgPSAxOworCisJaWYoKHdpZHRoIDwgbWF4X3BpeGVsX3NpemUpICYmIChoZWlnaHQgPCBtYXhfcGl4ZWxfc2l6ZSkpIHsKKwkJLy8gaW1hZ2UgaXMgc21hbGxlciB0aGFuIHRoZSByZXF1ZXN0ZWQgdGh1bWJuYWlsCisJCXJldHVybiBGcmVlSW1hZ2VfQ2xvbmUoZGliKTsKKwl9CisKKwlpZih3aWR0aCA+IGhlaWdodCkgeworCQluZXdfd2lkdGggPSBtYXhfcGl4ZWxfc2l6ZTsKKwkJLy8gY2hhbmdlIGltYWdlIGhlaWdodCB3aXRoIHRoZSBzYW1lIHJhdGlvCisJCWRvdWJsZSByYXRpbyA9ICgoZG91YmxlKW5ld193aWR0aCAvIChkb3VibGUpd2lkdGgpOworCQluZXdfaGVpZ2h0ID0gKGludCkoaGVpZ2h0ICogcmF0aW8gKyAwLjUpOworCQlpZihuZXdfaGVpZ2h0ID09IDApIG5ld19oZWlnaHQgPSAxOworCX0gZWxzZSB7CisJCW5ld19oZWlnaHQgPSBtYXhfcGl4ZWxfc2l6ZTsKKwkJLy8gY2hhbmdlIGltYWdlIHdpZHRoIHdpdGggdGhlIHNhbWUgcmF0aW8KKwkJZG91YmxlIHJhdGlvID0gKChkb3VibGUpbmV3X2hlaWdodCAvIChkb3VibGUpaGVpZ2h0KTsKKwkJbmV3X3dpZHRoID0gKGludCkod2lkdGggKiByYXRpbyArIDAuNSk7CisJCWlmKG5ld193aWR0aCA9PSAwKSBuZXdfd2lkdGggPSAxOworCX0KKworCWNvbnN0IEZSRUVfSU1BR0VfVFlQRSBpbWFnZV90eXBlID0gRnJlZUltYWdlX0dldEltYWdlVHlwZShkaWIpOworCisJLy8gcGVyZm9ybSBkb3duc2FtcGxpbmcgdXNpbmcgYSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uCisKKwlzd2l0Y2goaW1hZ2VfdHlwZSkgeworCQljYXNlIEZJVF9CSVRNQVA6CisJCWNhc2UgRklUX1VJTlQxNjoKKwkJY2FzZSBGSVRfUkdCMTY6CisJCWNhc2UgRklUX1JHQkExNjoKKwkJY2FzZSBGSVRfRkxPQVQ6CisJCWNhc2UgRklUX1JHQkY6CisJCWNhc2UgRklUX1JHQkFGOgorCQl7CisJCQlGUkVFX0lNQUdFX0ZJTFRFUiBmaWx0ZXIgPSBGSUxURVJfQklMSU5FQVI7CisJCQl0aHVtYm5haWwgPSBGcmVlSW1hZ2VfUmVzY2FsZShkaWIsIG5ld193aWR0aCwgbmV3X2hlaWdodCwgZmlsdGVyKTsKKwkJfQorCQlicmVhazsKKworCQljYXNlIEZJVF9JTlQxNjoKKwkJY2FzZSBGSVRfVUlOVDMyOgorCQljYXNlIEZJVF9JTlQzMjoKKwkJY2FzZSBGSVRfRE9VQkxFOgorCQljYXNlIEZJVF9DT01QTEVYOgorCQlkZWZhdWx0OgorCQkJLy8gY2Fubm90IHJlc2NhbGUgdGhpcyBraW5kIG9mIGltYWdlCisJCQl0aHVtYm5haWwgPSBOVUxMOworCQkJYnJlYWs7CisJfQorCisJaWYoKHRodW1ibmFpbCAhPSBOVUxMKSAmJiAoaW1hZ2VfdHlwZSAhPSBGSVRfQklUTUFQKSAmJiBjb252ZXJ0KSB7CisJCS8vIGNvbnZlcnQgdG8gYSBzdGFuZGFyZCBiaXRtYXAKKwkJRklCSVRNQVAgKmJpdG1hcCA9IE5VTEw7CisJCXN3aXRjaChpbWFnZV90eXBlKSB7CisJCQljYXNlIEZJVF9VSU5UMTY6CisJCQkJYml0bWFwID0gRnJlZUltYWdlX0NvbnZlcnRUbzhCaXRzKHRodW1ibmFpbCk7CisJCQkJYnJlYWs7CisJCQljYXNlIEZJVF9SR0IxNjoKKwkJCQliaXRtYXAgPSBGcmVlSW1hZ2VfQ29udmVydFRvMjRCaXRzKHRodW1ibmFpbCk7CisJCQkJYnJlYWs7CisJCQljYXNlIEZJVF9SR0JBMTY6CisJCQkJYml0bWFwID0gRnJlZUltYWdlX0NvbnZlcnRUbzMyQml0cyh0aHVtYm5haWwpOworCQkJCWJyZWFrOworCQkJY2FzZSBGSVRfRkxPQVQ6CisJCQkJYml0bWFwID0gRnJlZUltYWdlX0NvbnZlcnRUb1N0YW5kYXJkVHlwZSh0aHVtYm5haWwsIFRSVUUpOworCQkJCWJyZWFrOworCQkJY2FzZSBGSVRfUkdCRjoKKwkJCQliaXRtYXAgPSBGcmVlSW1hZ2VfVG9uZU1hcHBpbmcodGh1bWJuYWlsLCBGSVRNT19EUkFHTzAzKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRklUX1JHQkFGOgorCQkJCS8vIG5vIHdheSB0byBrZWVwIHRoZSB0cmFuc3BhcmVuY3kgeWV0IC4uLgorCQkJCUZJQklUTUFQICpyZ2JmID0gRnJlZUltYWdlX0NvbnZlcnRUb1JHQkYodGh1bWJuYWlsKTsKKwkJCQliaXRtYXAgPSBGcmVlSW1hZ2VfVG9uZU1hcHBpbmcocmdiZiwgRklUTU9fRFJBR08wMyk7CisJCQkJRnJlZUltYWdlX1VubG9hZChyZ2JmKTsKKwkJCQlicmVhazsKKwkJfQorCQlpZihiaXRtYXAgIT0gTlVMTCkgeworCQkJRnJlZUltYWdlX1VubG9hZCh0aHVtYm5haWwpOworCQkJdGh1bWJuYWlsID0gYml0bWFwOworCQl9CisJfQorCisJLy8gY29weSBtZXRhZGF0YSBmcm9tIHNyYyB0byBkc3QKKwlGcmVlSW1hZ2VfQ2xvbmVNZXRhZGF0YSh0aHVtYm5haWwsIGRpYik7CisKKwlyZXR1cm4gdGh1bWJuYWlsOworfQpkaWZmIC0tZ2l0IGEvZmlsZXMvU291cmNlL0ZyZWVJbWFnZVRvb2xraXQvUmVzaXplLmNwcCBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2VUb29sa2l0L1Jlc2l6ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJjNzM4ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9GcmVlSW1hZ2VUb29sa2l0L1Jlc2l6ZS5jcHAKQEAgLTAsMCArMSwyMTE2IEBACisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBVcHNhbXBsaW5nIC8gZG93bnNhbXBsaW5nIGNsYXNzZXMKKy8vCisvLyBEZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIGJ5CisvLyAtIEhlcnbpIERyb2xvbiAoZHJvbG9uQGluZm9uaWUuZnIpCisvLyAtIERldGxldiBWZW5kdCAoZGV0bGV2LnZlbmR0QGJyaWxsaXQuZGUpCisvLyAtIENhcnN0ZW4gS2xlaW4gKGNrbGVpbjA1QHVzZXJzLnNvdXJjZWZvcmdlLm5ldCkKKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBGcmVlSW1hZ2UgMworLy8KKy8vIENPVkVSRUQgQ09ERSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWQorLy8gT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMKKy8vIFRIQVQgVEhFIENPVkVSRUQgQ09ERSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLy8gT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQKKy8vIENPREUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkgQ09WRVJFRCBDT0RFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QKKy8vIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZCisvLyBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMCisvLyBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GIEFOWSBDT1ZFUkVEIENPREUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSCisvLyBUSElTIERJU0NMQUlNRVIuCisvLworLy8gVXNlIGF0IHlvdXIgb3duIHJpc2shCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpbmNsdWRlICJSZXNpemUuaCIKKworLyoqCitSZXR1cm5zIHRoZSBjb2xvciB0eXBlIG9mIGEgYml0bWFwLiBJbiBjb250cmFzdCB0byBGcmVlSW1hZ2VfR2V0Q29sb3JUeXBlLAordGhpcyBmdW5jdGlvbiBvcHRpb25hbGx5IHN1cHBvcnRzIGEgYm9vbGVhbiBPVVQgcGFyYW1ldGVyLCB0aGF0IHJlY2VpdmVzIFRSVUUsCitpZiB0aGUgc3BlY2lmaWVkIGJpdG1hcCBpcyBncmV5c2NhbGUsIHRoYXQgaXMsIGl0IGNvbnNpc3RzIG9mIGdyZXkgY29sb3JzIG9ubHkuCitBbHRob3VnaCBpdCByZXR1cm5zIHRoZSBzYW1lIHZhbHVlIGFzIHJldHVybmVkIGJ5IEZyZWVJbWFnZV9HZXRDb2xvclR5cGUgZm9yIGFsbAoraW1hZ2UgdHlwZXMsIHRoaXMgZXh0ZW5kZWQgZnVuY3Rpb24gcHJpbWFyaWx5IGlzIGludGVuZGVkIGZvciBwYWxsZXRpemVkIGltYWdlcywKK3NpbmNlIHRoZSBib29sZWFuIHBvaW50ZWQgdG8gYnkgJ2JJc0dyZXlzY2FsZScgcmVtYWlucyB1bmNoYW5nZWQgZm9yIFJHQihBL0YpCitpbWFnZXMuIEhvd2V2ZXIsIHRoZSBvdXRnb2luZyBib29sZWFuIGlzIHByb3Blcmx5IG1haW50YWluZWQgZm9yIHBhbGxldGl6ZWQgaW1hZ2VzLAorYXMgd2VsbCBhcyBmb3IgYW55IG5vbi1SR0IgaW1hZ2UgdHlwZSwgbGlrZSBGSVRfVUlOVHh4IGFuZCBGSVRfRE9VQkxFLCBmb3IgZXhhbXBsZS4KK0BwYXJhbSBkaWIgQSBwb2ludGVyIHRvIGEgRnJlZUltYWdlIGJpdG1hcCB0byBjYWxjdWxhdGUgdGhlIGV4dGVuZGVkIGNvbG9yIHR5cGUgZm9yCitAcGFyYW0gYklzR3JleXNjYWxlIEEgcG9pbnRlciB0byBhIGJvb2xlYW4sIHRoYXQgcmVjZWl2ZXMgVFJVRSwgaWYgdGhlIHNwZWNpZmllZCBiaXRtYXAKK2lzIGdyZXlzY2FsZSwgdGhhdCBpcywgaXQgY29uc2lzdHMgb2YgZ3JleSBjb2xvcnMgb25seS4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIE5VTEwuCitAcmV0dXJuIHRoZSBjb2xvciB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgYml0bWFwCisqLworc3RhdGljIEZSRUVfSU1BR0VfQ09MT1JfVFlQRQorR2V0RXh0ZW5kZWRDb2xvclR5cGUoRklCSVRNQVAgKmRpYiwgQk9PTCAqYklzR3JleXNjYWxlKSB7CisJY29uc3QgdW5zaWduZWQgYnBwID0gRnJlZUltYWdlX0dldEJQUChkaWIpOworCWNvbnN0IHVuc2lnbmVkIHNpemUgPSBDYWxjdWxhdGVVc2VkUGFsZXR0ZUVudHJpZXMoYnBwKTsKKwljb25zdCBSR0JRVUFEICogY29uc3QgcGFsID0gRnJlZUltYWdlX0dldFBhbGV0dGUoZGliKTsKKwlGUkVFX0lNQUdFX0NPTE9SX1RZUEUgY29sb3JfdHlwZSA9IEZJQ19NSU5JU0JMQUNLOworCUJPT0wgYklzR3JleSA9IFRSVUU7CisKKwlzd2l0Y2ggKGJwcCkgeworCQljYXNlIDE6CisJCXsKKwkJCWZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCQlpZiAoKHBhbFtpXS5yZ2JSZWQgIT0gcGFsW2ldLnJnYkdyZWVuKSB8fCAocGFsW2ldLnJnYlJlZCAhPSBwYWxbaV0ucmdiQmx1ZSkpIHsKKwkJCQkJY29sb3JfdHlwZSA9IEZJQ19QQUxFVFRFOworCQkJCQliSXNHcmV5ID0gRkFMU0U7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWlmIChiSXNHcmV5KSB7CisJCQkJaWYgKHBhbFswXS5yZ2JCbHVlID09IDI1NSAmJiBwYWxbMV0ucmdiQmx1ZSA9PSAwKSB7CisJCQkJCWNvbG9yX3R5cGUgPSBGSUNfTUlOSVNXSElURTsKKwkJCQl9IGVsc2UgaWYgKHBhbFswXS5yZ2JCbHVlICE9IDAgfHwgcGFsWzFdLnJnYkJsdWUgIT0gMjU1KSB7CisJCQkJCWNvbG9yX3R5cGUgPSBGSUNfUEFMRVRURTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgNDoKKwkJY2FzZSA4OgorCQl7CisJCQlmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQkJaWYgKChwYWxbaV0ucmdiUmVkICE9IHBhbFtpXS5yZ2JHcmVlbikgfHwgKHBhbFtpXS5yZ2JSZWQgIT0gcGFsW2ldLnJnYkJsdWUpKSB7CisJCQkJCWNvbG9yX3R5cGUgPSBGSUNfUEFMRVRURTsKKwkJCQkJYklzR3JleSA9IEZBTFNFOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWYgKGNvbG9yX3R5cGUgIT0gRklDX1BBTEVUVEUgJiYgcGFsW2ldLnJnYkJsdWUgIT0gaSkgeworCQkJCQlpZiAoKHNpemUgLSBpIC0gMSkgIT0gcGFsW2ldLnJnYkJsdWUpIHsKKwkJCQkJCWNvbG9yX3R5cGUgPSBGSUNfUEFMRVRURTsKKwkJCQkJCWlmICghYklzR3JleXNjYWxlKSB7CisJCQkJCQkJLy8gZXhpdCBsb29wIGlmIHdlJ3JlIG5vdCBzZXR0aW5nCisJCQkJCQkJLy8gYklzR3JleXNjYWxlIHBhcmFtZXRlcgorCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJY29sb3JfdHlwZSA9IEZJQ19NSU5JU1dISVRFOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQlkZWZhdWx0OgorCQl7CisJCQljb2xvcl90eXBlID0gRnJlZUltYWdlX0dldENvbG9yVHlwZShkaWIpOworCQkJYklzR3JleSA9IChjb2xvcl90eXBlID09IEZJQ19NSU5JU0JMQUNLKSA/IFRSVUUgOiBGQUxTRTsKKwkJCWJyZWFrOworCQl9CisKKwl9CisJaWYgKGJJc0dyZXlzY2FsZSkgeworCQkqYklzR3JleXNjYWxlID0gYklzR3JleTsKKwl9CisKKwlyZXR1cm4gY29sb3JfdHlwZTsKK30KKworLyoqCitSZXR1cm5zIGEgcG9pbnRlciB0byBhbiBSR0JBIHBhbGV0dGUsIGNyZWF0ZWQgZnJvbSB0aGUgc3BlY2lmaWVkIGJpdG1hcC4KK1RoZSBSR0JBIHBhbGV0dGUgaXMgYSBjb3B5IG9mIHRoZSBzcGVjaWZpZWQgYml0bWFwJ3MgcGFsZXR0ZSwgdGhhdCwgYWRkaXRpb25hbGx5Citjb250YWlucyB0aGUgYml0bWFwJ3MgdHJhbnNwYXJlbmN5IGluZm9ybWF0aW9uIGluIHRoZSByZ2JSZXNlcnZlZCBtZW1iZXIKK29mIHRoZSBwYWxldHRlJ3MgUkdCUVVBRCBlbGVtZW50cy4KK0BwYXJhbSBkaWIgQSBwb2ludGVyIHRvIGEgRnJlZUltYWdlIGJpdG1hcCB0byBjcmVhdGUgdGhlIFJHQkEgcGFsZXR0ZSBmcm9tLgorQHBhcmFtIGJ1ZmZlciBBIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byBzdG9yZSB0aGUgUkdCQSBwYWxldHRlLgorQHJldHVybiBBIHBvaW50ZXIgdG8gdGhlIG5ld2x5IGNyZWF0ZWQgUkdCQSBwYWxldHRlIG9yIE5VTEwsIGlmIHRoZSBzcGVjaWZpZWQKK2JpdG1hcCBpcyBubyBwYWxsZXRpemVkIHN0YW5kYXJkIGJpdG1hcC4gSWYgbm9uLU5VTEwsIHRoZSByZXR1cm5lZCB2YWx1ZSBpcworYWN0dWFsbHkgdGhlIHBvaW50ZXIgcGFzc2VkIGluIHBhcmFtZXRlciAnYnVmZmVyJy4KKyovCitzdGF0aWMgaW5saW5lIFJHQlFVQUQgKgorR2V0UkdCQVBhbGV0dGUoRklCSVRNQVAgKmRpYiwgUkdCUVVBRCAqIGNvbnN0IGJ1ZmZlcikgeworCS8vIGNsb25lIHRoZSBwYWxldHRlCisJY29uc3QgdW5zaWduZWQgbmNvbG9ycyA9IEZyZWVJbWFnZV9HZXRDb2xvcnNVc2VkKGRpYik7CisJaWYgKG5jb2xvcnMgPT0gMCkgeworCQlyZXR1cm4gTlVMTDsKKwl9CisJbWVtY3B5KGJ1ZmZlciwgRnJlZUltYWdlX0dldFBhbGV0dGUoZGliKSwgbmNvbG9ycyAqIHNpemVvZihSR0JRVUFEKSk7CisJLy8gbWVyZ2UgdGhlIHRyYW5zcGFyZW5jeSB0YWJsZQorCWNvbnN0IHVuc2lnbmVkIG50cmFuc3AgPSBNSU4obmNvbG9ycywgRnJlZUltYWdlX0dldFRyYW5zcGFyZW5jeUNvdW50KGRpYikpOworCWNvbnN0IEJZVEUgKiBjb25zdCB0dCA9IEZyZWVJbWFnZV9HZXRUcmFuc3BhcmVuY3lUYWJsZShkaWIpOworCWZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBudHJhbnNwOyBpKyspIHsKKwkJYnVmZmVyW2ldLnJnYlJlc2VydmVkID0gdHRbaV07CisJfQorCWZvciAodW5zaWduZWQgaSA9IG50cmFuc3A7IGkgPCBuY29sb3JzOyBpKyspIHsKKwkJYnVmZmVyW2ldLnJnYlJlc2VydmVkID0gMjU1OworCX0KKwlyZXR1cm4gYnVmZmVyOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitDV2VpZ2h0c1RhYmxlOjpDV2VpZ2h0c1RhYmxlKENHZW5lcmljRmlsdGVyICpwRmlsdGVyLCB1bnNpZ25lZCB1RHN0U2l6ZSwgdW5zaWduZWQgdVNyY1NpemUpIHsKKwlkb3VibGUgZFdpZHRoOworCWRvdWJsZSBkRlNjYWxlOworCWNvbnN0IGRvdWJsZSBkRmlsdGVyV2lkdGggPSBwRmlsdGVyLT5HZXRXaWR0aCgpOworCisJLy8gc2NhbGUgZmFjdG9yCisJY29uc3QgZG91YmxlIGRTY2FsZSA9IGRvdWJsZSh1RHN0U2l6ZSkgLyBkb3VibGUodVNyY1NpemUpOworCisJaWYoZFNjYWxlIDwgMS4wKSB7CisJCS8vIG1pbmlmaWNhdGlvbgorCQlkV2lkdGggPSBkRmlsdGVyV2lkdGggLyBkU2NhbGU7IAorCQlkRlNjYWxlID0gZFNjYWxlOyAKKwl9IGVsc2UgeworCQkvLyBtYWduaWZpY2F0aW9uCisJCWRXaWR0aCA9IGRGaWx0ZXJXaWR0aDsgCisJCWRGU2NhbGUgPSAxLjA7IAorCX0KKworCS8vIGFsbG9jYXRlIGEgbmV3IGxpbmUgY29udHJpYnV0aW9ucyBzdHJ1Y3R1cmUKKwkvLworCS8vIHdpbmRvdyBzaXplIGlzIHRoZSBudW1iZXIgb2Ygc2FtcGxlZCBwaXhlbHMKKwltX1dpbmRvd1NpemUgPSAyICogKGludCljZWlsKGRXaWR0aCkgKyAxOyAKKwkvLyBsZW5ndGggb2YgZHN0IGxpbmUgKG5vLiBvZiByb3dzIC8gY29scykgCisJbV9MaW5lTGVuZ3RoID0gdURzdFNpemU7IAorCisJIC8vIGFsbG9jYXRlIGxpc3Qgb2YgY29udHJpYnV0aW9ucyAKKwltX1dlaWdodFRhYmxlID0gKENvbnRyaWJ1dGlvbiopbWFsbG9jKG1fTGluZUxlbmd0aCAqIHNpemVvZihDb250cmlidXRpb24pKTsKKwlmb3IodW5zaWduZWQgdSA9IDA7IHUgPCBtX0xpbmVMZW5ndGg7IHUrKykgeworCQkvLyBhbGxvY2F0ZSBjb250cmlidXRpb25zIGZvciBldmVyeSBwaXhlbAorCQltX1dlaWdodFRhYmxlW3VdLldlaWdodHMgPSAoZG91YmxlKiltYWxsb2MobV9XaW5kb3dTaXplICogc2l6ZW9mKGRvdWJsZSkpOworCX0KKworCS8vIG9mZnNldCBmb3IgZGlzY3JldGUgdG8gY29udGludW91cyBjb29yZGluYXRlIGNvbnZlcnNpb24KKwljb25zdCBkb3VibGUgZE9mZnNldCA9ICgwLjUgLyBkU2NhbGUpOworCisJZm9yKHVuc2lnbmVkIHUgPSAwOyB1IDwgbV9MaW5lTGVuZ3RoOyB1KyspIHsKKwkJLy8gc2NhbiB0aHJvdWdoIGxpbmUgb2YgY29udHJpYnV0aW9ucworCisJCS8vIGludmVyc2UgbWFwcGluZyAoZGlzY3JldGUgZHN0ICd1JyB0byBjb250aW5vdXMgc3JjICdkQ2VudGVyJykKKwkJY29uc3QgZG91YmxlIGRDZW50ZXIgPSAoZG91YmxlKXUgLyBkU2NhbGUgKyBkT2Zmc2V0OworCisJCS8vIGZpbmQgdGhlIHNpZ25pZmljYW50IGVkZ2UgcG9pbnRzIHRoYXQgYWZmZWN0IHRoZSBwaXhlbAorCQljb25zdCBpbnQgaUxlZnQgPSBNQVgoMCwgKGludCkoZENlbnRlciAtIGRXaWR0aCArIDAuNSkpOworCQljb25zdCBpbnQgaVJpZ2h0ID0gTUlOKChpbnQpKGRDZW50ZXIgKyBkV2lkdGggKyAwLjUpLCBpbnQodVNyY1NpemUpKTsKKworCQltX1dlaWdodFRhYmxlW3VdLkxlZnQgPSBpTGVmdDsgCisJCW1fV2VpZ2h0VGFibGVbdV0uUmlnaHQgPSBpUmlnaHQ7CisKKwkJZG91YmxlIGRUb3RhbFdlaWdodCA9IDA7ICAvLyBzdW0gb2Ygd2VpZ2h0cyAoaW5pdGlhbGl6ZWQgdG8gemVybykKKwkJZm9yKGludCBpU3JjID0gaUxlZnQ7IGlTcmMgPCBpUmlnaHQ7IGlTcmMrKykgeworCQkJLy8gY2FsY3VsYXRlIHdlaWdodHMKKwkJCWNvbnN0IGRvdWJsZSB3ZWlnaHQgPSBkRlNjYWxlICogcEZpbHRlci0+RmlsdGVyKGRGU2NhbGUgKiAoKGRvdWJsZSlpU3JjICsgMC41IC0gZENlbnRlcikpOworCQkJLy8gYXNzZXJ0KChpU3JjLWlMZWZ0KSA8IG1fV2luZG93U2l6ZSk7CisJCQltX1dlaWdodFRhYmxlW3VdLldlaWdodHNbaVNyYy1pTGVmdF0gPSB3ZWlnaHQ7CisJCQlkVG90YWxXZWlnaHQgKz0gd2VpZ2h0OworCQl9CisJCWlmKChkVG90YWxXZWlnaHQgPiAwKSAmJiAoZFRvdGFsV2VpZ2h0ICE9IDEpKSB7CisJCQkvLyBub3JtYWxpemUgd2VpZ2h0IG9mIG5laWdoYm91cmluZyBwb2ludHMKKwkJCWZvcihpbnQgaVNyYyA9IGlMZWZ0OyBpU3JjIDwgaVJpZ2h0OyBpU3JjKyspIHsKKwkJCQkvLyBub3JtYWxpemUgcG9pbnQKKwkJCQltX1dlaWdodFRhYmxlW3VdLldlaWdodHNbaVNyYy1pTGVmdF0gLz0gZFRvdGFsV2VpZ2h0OyAKKwkJCX0KKwkJfQorCisJCS8vIHNpbXBsaWZ5IHRoZSBmaWx0ZXIsIGRpc2NhcmRpbmcgbnVsbCB3ZWlnaHRzIGF0IHRoZSByaWdodAorCQl7CQkJCisJCQlpbnQgaVRyYWlsaW5nID0gaVJpZ2h0IC0gaUxlZnQgLSAxOworCQkJd2hpbGUobV9XZWlnaHRUYWJsZVt1XS5XZWlnaHRzW2lUcmFpbGluZ10gPT0gMCkgeworCQkJCW1fV2VpZ2h0VGFibGVbdV0uUmlnaHQtLTsKKwkJCQlpVHJhaWxpbmctLTsKKwkJCQlpZihtX1dlaWdodFRhYmxlW3VdLlJpZ2h0ID09IG1fV2VpZ2h0VGFibGVbdV0uTGVmdCkgeworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQkKKwkJfQorCisJfSAvLyBuZXh0IGRzdCBwaXhlbAorfQorCitDV2VpZ2h0c1RhYmxlOjp+Q1dlaWdodHNUYWJsZSgpIHsKKwlmb3IodW5zaWduZWQgdSA9IDA7IHUgPCBtX0xpbmVMZW5ndGg7IHUrKykgeworCQkvLyBmcmVlIGNvbnRyaWJ1dGlvbnMgZm9yIGV2ZXJ5IHBpeGVsCisJCWZyZWUobV9XZWlnaHRUYWJsZVt1XS5XZWlnaHRzKTsKKwl9CisJLy8gZnJlZSBsaXN0IG9mIHBpeGVscyBjb250cmlidXRpb25zCisJZnJlZShtX1dlaWdodFRhYmxlKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRklCSVRNQVAqIENSZXNpemVFbmdpbmU6OnNjYWxlKEZJQklUTUFQICpzcmMsIHVuc2lnbmVkIGRzdF93aWR0aCwgdW5zaWduZWQgZHN0X2hlaWdodCwgdW5zaWduZWQgc3JjX2xlZnQsIHVuc2lnbmVkIHNyY190b3AsIHVuc2lnbmVkIHNyY193aWR0aCwgdW5zaWduZWQgc3JjX2hlaWdodCwgdW5zaWduZWQgZmxhZ3MpIHsKKworCWNvbnN0IEZSRUVfSU1BR0VfVFlQRSBpbWFnZV90eXBlID0gRnJlZUltYWdlX0dldEltYWdlVHlwZShzcmMpOworCWNvbnN0IHVuc2lnbmVkIHNyY19icHAgPSBGcmVlSW1hZ2VfR2V0QlBQKHNyYyk7CisKKwkvLyBkZXRlcm1pbmUgdGhlIGltYWdlJ3MgY29sb3IgdHlwZQorCUJPT0wgYklzR3JleXNjYWxlID0gRkFMU0U7CisJRlJFRV9JTUFHRV9DT0xPUl9UWVBFIGNvbG9yX3R5cGU7CisJaWYgKHNyY19icHAgPD0gOCkgeworCQljb2xvcl90eXBlID0gR2V0RXh0ZW5kZWRDb2xvclR5cGUoc3JjLCAmYklzR3JleXNjYWxlKTsKKwl9IGVsc2UgeworCQljb2xvcl90eXBlID0gRklDX1JHQjsKKwl9CisKKwkvLyBkZXRlcm1pbmUgdGhlIHJlcXVpcmVkIGJpdCBkZXB0aCBvZiB0aGUgZGVzdGluYXRpb24gaW1hZ2UKKwl1bnNpZ25lZCBkc3RfYnBwOworCXVuc2lnbmVkIGRzdF9icHBfczEgPSAwOworCWlmIChjb2xvcl90eXBlID09IEZJQ19QQUxFVFRFICYmICFiSXNHcmV5c2NhbGUpIHsKKwkJLy8gbm9uIGdyZXlzY2FsZSBGSUNfUEFMRVRURSBpbWFnZXMgcmVxdWlyZSBhIGhpZ2gtY29sb3IgZGVzdGluYXRpb24KKwkJLy8gaW1hZ2UgKDI0LSBvciAzMi1iaXRzIGRlcGVuZGluZyBvbiB0aGUgaW1hZ2UncyB0cmFuc3BhcmVudCBzdGF0ZSkKKwkJZHN0X2JwcCA9IEZyZWVJbWFnZV9Jc1RyYW5zcGFyZW50KHNyYykgPyAzMiA6IDI0OworCX0gZWxzZSBpZiAoc3JjX2JwcCA8PSA4KSB7CisJCS8vIGdyZXlzY2FsZSBpbWFnZXMgcmVxdWlyZSBhbiA4LWJpdCBkZXN0aW5hdGlvbiBpbWFnZQorCQkvLyAob3IgYSAzMi1iaXQgaW1hZ2UgaWYgdGhlIGltYWdlIGlzIHRyYW5zcGFyZW50KTsKKwkJLy8gaG93ZXZlciwgaWYgZmxhZyBGSV9SRVNDQUxFX1RSVUVfQ09MT1IgaXMgc2V0LCB3ZSB3aWxsIHJldHVybgorCQkvLyBhIHRydWUgY29sb3IgKDI0IGJwcCkgaW1hZ2UKKwkJaWYgKEZyZWVJbWFnZV9Jc1RyYW5zcGFyZW50KHNyYykpIHsKKwkJCWRzdF9icHAgPSAzMjsKKwkJCS8vIGFkZGl0aW9uYWxseSwgZm9yIHRyYW5zcGFyZW50IGltYWdlcyB3ZSBhbHdheXMgbmVlZCBhCisJCQkvLyBwYWxldHRlIGluY2x1ZGluZyB0cmFuc3BhcmVuY3kgaW5mb3JtYXRpb24gKGFuIFJHQkEgcGFsZXR0ZSkKKwkJCS8vIHNvLCBzZXQgY29sb3JfdHlwZSBhY2NvcmRpbmdseQorCQkJY29sb3JfdHlwZSA9IEZJQ19QQUxFVFRFOworCQl9IGVsc2UgeworCQkJZHN0X2JwcCA9ICgoZmxhZ3MgJiBGSV9SRVNDQUxFX1RSVUVfQ09MT1IpID09IEZJX1JFU0NBTEVfVFJVRV9DT0xPUikgPyAyNCA6IDg7CisJCQkvLyBpbiBhbnkgY2FzZSwgd2UgdXNlIGEgZmFzdCA4LWJpdCB0ZW1wb3JhcnkgaW1hZ2UgZm9yIHRoZQorCQkJLy8gZmlyc3QgZmlsdGVyIG9wZXJhdGlvbiAoc3RhZ2UgMSwgZWl0aGVyIGhvcml6b250YWwgb3IKKwkJCS8vIHZlcnRpY2FsKSBhbmQgaW1wbGljaXRseSBjb252ZXJ0IHRvIDI0IGJwcCAoaWYgcmVxdWVzdGVkCisJCQkvLyBieSBmbGFnIEZJX1JFU0NBTEVfVFJVRV9DT0xPUikgZHVyaW5nIHRoZSBzZWNvbmQgZmlsdGVyCisJCQkvLyBvcGVyYXRpb24KKwkJCWRzdF9icHBfczEgPSA4OworCQl9CisJfSBlbHNlIGlmIChzcmNfYnBwID09IDE2ICYmIGltYWdlX3R5cGUgPT0gRklUX0JJVE1BUCkgeworCQkvLyAxNi1iaXQgNTU1IGFuZCA1NjUgUkdCIGltYWdlcyByZXF1aXJlIGEgaGlnaC1jb2xvciBkZXN0aW5hdGlvbgorCQkvLyBpbWFnZSAoZml4ZWQgdG8gMjQgYml0cywgc2luY2UgMTYtYml0IFJHQnMgZG9uJ3Qgc3VwcG9ydAorCQkvLyB0cmFuc3BhcmVuY3kgaW4gRnJlZUltYWdlKQorCQlkc3RfYnBwID0gMjQ7CisJfSBlbHNlIHsKKwkJLy8gYml0IGRlcHRoIHJlbWFpbnMgdW5jaGFuZ2VkIGZvciBhbGwgb3RoZXIgaW1hZ2VzCisJCWRzdF9icHAgPSBzcmNfYnBwOworCX0KKworCS8vIG1ha2UgJ3N0YWdlIDEnIGJwcCBhIGNvcHkgb2YgdGhlIGRlc3RpbmF0aW9uIGJwcCBpZiBpdAorCS8vIHdhcyBub3QgZXhwbGljaXRseSBzZXQKKwlpZiAoZHN0X2JwcF9zMSA9PSAwKSB7CisJCWRzdF9icHBfczEgPSBkc3RfYnBwOworCX0KKworCS8vIGVhcmx5IGV4aXQgaWYgZGVzdGluYXRpb24gc2l6ZSBpcyBlcXVhbCB0byBzb3VyY2Ugc2l6ZQorCWlmICgoc3JjX3dpZHRoID09IGRzdF93aWR0aCkgJiYgKHNyY19oZWlnaHQgPT0gZHN0X2hlaWdodCkpIHsKKwkJRklCSVRNQVAgKm91dCA9IHNyYzsKKwkJRklCSVRNQVAgKnRtcCA9IHNyYzsKKwkJaWYgKChzcmNfd2lkdGggIT0gRnJlZUltYWdlX0dldFdpZHRoKHNyYykpIHx8IChzcmNfaGVpZ2h0ICE9IEZyZWVJbWFnZV9HZXRIZWlnaHQoc3JjKSkpIHsKKwkJCW91dCA9IEZyZWVJbWFnZV9Db3B5KHRtcCwgc3JjX2xlZnQsIHNyY190b3AsIHNyY19sZWZ0ICsgc3JjX3dpZHRoLCBzcmNfdG9wICsgc3JjX2hlaWdodCk7CisJCQl0bXAgPSBvdXQ7CisJCX0KKwkJaWYgKHNyY19icHAgIT0gZHN0X2JwcCkgeworCQkJc3dpdGNoIChkc3RfYnBwKSB7CisJCQkJY2FzZSA4OgorCQkJCQlvdXQgPSBGcmVlSW1hZ2VfQ29udmVydFRvR3JleXNjYWxlKHRtcCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMjQ6CisJCQkJCW91dCA9IEZyZWVJbWFnZV9Db252ZXJ0VG8yNEJpdHModG1wKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAzMjoKKwkJCQkJb3V0ID0gRnJlZUltYWdlX0NvbnZlcnRUbzMyQml0cyh0bXApOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlicmVhazsKKwkJCX0KKwkJCWlmICh0bXAgIT0gc3JjKSB7CisJCQkJRnJlZUltYWdlX1VubG9hZCh0bXApOworCQkJCXRtcCA9IE5VTEw7CisJCQl9CisJCX0KKworCQlyZXR1cm4gKG91dCAhPSBzcmMpID8gb3V0IDogRnJlZUltYWdlX0Nsb25lKHNyYyk7CisJfQorCisJUkdCUVVBRCBwYWxfYnVmZmVyWzI1Nl07CisJUkdCUVVBRCAqc3JjX3BhbCA9IE5VTEw7CisKKwkvLyBwcm92aWRlIHRoZSBzb3VyY2UgaW1hZ2UncyBwYWxldHRlIHRvIHRoZSByZXNjYWxlciBmb3IKKwkvLyBGSUNfUEFMRVRURSB0eXBlIGltYWdlcyAodGhpcyBpbmNsdWRlcyBwYWxsZXRpemVkIGdyZXlzY2FsZQorCS8vIGltYWdlcyB3aXRoIGFuIHVub3JkZXJlZCBwYWxldHRlIGFzIHdlbGwgYXMgdHJhbnNwYXJlbnQgaW1hZ2VzKQorCWlmIChjb2xvcl90eXBlID09IEZJQ19QQUxFVFRFKSB7CisJCWlmIChkc3RfYnBwID09IDMyKSB7CisJCQkvLyBhIDMyLWJpdCBkZXN0aW5hdGlvbiBpbWFnZSBzaWduYWxzIHRyYW5zcGFyZW5jeSwgc28KKwkJCS8vIGNyZWF0ZSBhbiBSR0JBIHBhbGV0dGUgZnJvbSB0aGUgc291cmNlIHBhbGV0dGUKKwkJCXNyY19wYWwgPSBHZXRSR0JBUGFsZXR0ZShzcmMsIHBhbF9idWZmZXIpOworCQl9IGVsc2UgeworCQkJc3JjX3BhbCA9IEZyZWVJbWFnZV9HZXRQYWxldHRlKHNyYyk7CisJCX0KKwl9CisKKwkvLyBhbGxvY2F0ZSB0aGUgZHN0IGltYWdlCisJRklCSVRNQVAgKmRzdCA9IEZyZWVJbWFnZV9BbGxvY2F0ZVQoaW1hZ2VfdHlwZSwgZHN0X3dpZHRoLCBkc3RfaGVpZ2h0LCBkc3RfYnBwLCAwLCAwLCAwKTsKKwlpZiAoIWRzdCkgeworCQlyZXR1cm4gTlVMTDsKKwl9CisJCisJaWYgKGRzdF9icHAgPT0gOCkgeworCQlSR0JRVUFEICogY29uc3QgZHN0X3BhbCA9IEZyZWVJbWFnZV9HZXRQYWxldHRlKGRzdCk7CisJCWlmIChjb2xvcl90eXBlID09IEZJQ19NSU5JU1dISVRFKSB7CisJCQkvLyBidWlsZCBhbiBpbnZlcnRlZCBncmV5c2NhbGUgcGFsZXR0ZQorCQkJQ1JFQVRFX0dSRVlTQ0FMRV9QQUxFVFRFX1JFVkVSU0UoZHN0X3BhbCwgMjU2KTsKKwkJfSAKKwkJLyoKKwkJZWxzZSB7CisJCQkvLyBidWlsZCBhIGRlZmF1bHQgZ3JleXNjYWxlIHBhbGV0dGUKKwkJCS8vIEN1cnJlbnRseSwgRnJlZUltYWdlX0FsbG9jYXRlVCBhbHJlYWR5IGNyZWF0ZXMgYSBkZWZhdWx0CisJCQkvLyBncmV5c2NhbGUgcGFsZXR0ZSBmb3IgOCBicHAgaW1hZ2VzLCBzbyB3ZSBjYW4gc2tpcCB0aGlzIGhlcmUuCisJCQlDUkVBVEVfR1JFWVNDQUxFX1BBTEVUVEUoZHN0X3BhbCwgMjU2KTsKKwkJfQorCQkqLworCX0KKworCS8vIGNhbGN1bGF0ZSB4IGFuZCB5IG9mZnNldHM7IHNpbmNlIEZyZWVJbWFnZSB1c2VzIGJvdHRvbS11cCBiaXRtYXBzLCB0aGUKKwkvLyB2YWx1ZSBvZiBzcmNfb2Zmc2V0X3kgaXMgbWVhc3VyZWQgZnJvbSB0aGUgYm90dG9tIG9mIHRoZSBpbWFnZQorCXVuc2lnbmVkIHNyY19vZmZzZXRfeCA9IHNyY19sZWZ0OworCXVuc2lnbmVkIHNyY19vZmZzZXRfeSA9IEZyZWVJbWFnZV9HZXRIZWlnaHQoc3JjKSAtIHNyY19oZWlnaHQgLSBzcmNfdG9wOworCisJLyoKKwlEZWNpZGUgd2hpY2ggZmlsdGVyaW5nIG9yZGVyICh4eSBvciB5eCkgaXMgZmFzdGVyIGZvciB0aGlzIG1hcHBpbmcuIAorCS0tLSBUaGUgdGhlb3J5IC0tLQorCVRyeSB0byBtaW5pbWl6ZSBjYWxjdWxhdGlvbnMgYnkgY291bnRpbmcgdGhlIG51bWJlciBvZiBjb252b2x1dGlvbiBtdWx0aXBsaWVzCisJaWYoZHN0X3dpZHRoKnNyY19oZWlnaHQgPD0gc3JjX3dpZHRoKmRzdF9oZWlnaHQpIHsKKwkJLy8geHkgZmlsdGVyaW5nCisJfSBlbHNlIHsKKwkJLy8geXggZmlsdGVyaW5nCisJfQorCS0tLSBUaGUgcHJhY3RpY2UgLS0tCisJVHJ5IHRvIG1pbmltaXplIGNhbGN1bGF0aW9ucyBieSBjb3VudGluZyB0aGUgbnVtYmVyIG9mIHZlcnRpY2FsIGNvbnZvbHV0aW9ucyAodGhlIG1vc3QgdGltZSBjb25zdW1pbmcgdGFzaykKKwlpZihkc3Rfd2lkdGgqZHN0X2hlaWdodCA8PSBzcmNfd2lkdGgqZHN0X2hlaWdodCkgeworCQkvLyB4eSBmaWx0ZXJpbmcKKwl9IGVsc2UgeworCQkvLyB5eCBmaWx0ZXJpbmcKKwl9CisJKi8KKworCWlmIChkc3Rfd2lkdGggPD0gc3JjX3dpZHRoKSB7CisJCS8vIHh5IGZpbHRlcmluZworCQkvLyAtLS0tLS0tLS0tLS0tCisKKwkJRklCSVRNQVAgKnRtcCA9IE5VTEw7CisKKwkJaWYgKHNyY193aWR0aCAhPSBkc3Rfd2lkdGgpIHsKKwkJCS8vIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gd2lkdGhzIGFyZSBkaWZmZXJlbnQgc28sIHdlIG11c3QKKwkJCS8vIGZpbHRlciBob3Jpem9udGFsbHkKKwkJCWlmIChzcmNfaGVpZ2h0ICE9IGRzdF9oZWlnaHQpIHsKKwkJCQkvLyBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGhlaWdodHMgYXJlIGFsc28gZGlmZmVyZW50IHNvLCB3ZSBuZWVkCisJCQkJLy8gYSB0ZW1wb3JhcnkgaW1hZ2UKKwkJCQl0bXAgPSBGcmVlSW1hZ2VfQWxsb2NhdGVUKGltYWdlX3R5cGUsIGRzdF93aWR0aCwgc3JjX2hlaWdodCwgZHN0X2JwcF9zMSwgMCwgMCwgMCk7CisJCQkJaWYgKCF0bXApIHsKKwkJCQkJRnJlZUltYWdlX1VubG9hZChkc3QpOworCQkJCQlyZXR1cm4gTlVMTDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8vIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gaGVpZ2h0cyBhcmUgZXF1YWwgc28sIHdlIGNhbiBkaXJlY3RseQorCQkJCS8vIHNjYWxlIGludG8gZGVzdGluYXRpb24gaW1hZ2UgKHNlY29uZCBmaWx0ZXIgbWV0aG9kIHdpbGwgbm90CisJCQkJLy8gYmUgaW52b2tlZCkKKwkJCQl0bXAgPSBkc3Q7CisJCQl9CisKKwkJCS8vIHNjYWxlIHNvdXJjZSBpbWFnZSBob3Jpem9udGFsbHkgaW50byB0ZW1wb3JhcnkgKG9yIGRlc3RpbmF0aW9uKSBpbWFnZQorCQkJaG9yaXpvbnRhbEZpbHRlcihzcmMsIHNyY19oZWlnaHQsIHNyY193aWR0aCwgc3JjX29mZnNldF94LCBzcmNfb2Zmc2V0X3ksIHNyY19wYWwsIHRtcCwgZHN0X3dpZHRoKTsKKworCQkJLy8gc2V0IHggYW5kIHkgb2Zmc2V0cyB0byB6ZXJvIGZvciB0aGUgc2Vjb25kIGZpbHRlciBtZXRob2QKKwkJCS8vIGludm9jYXRpb24gKHRoZSB0ZW1wb3JhcnkgaW1hZ2Ugb25seSBjb250YWlucyB0aGUgcG9ydGlvbiBvZgorCQkJLy8gdGhlIGltYWdlIHRvIGJlIHJlc2NhbGVkIHdpdGggbm8gb2Zmc2V0cykKKwkJCXNyY19vZmZzZXRfeCA9IDA7CisJCQlzcmNfb2Zmc2V0X3kgPSAwOworCisJCQkvLyBhbHNvIGVuc3VyZSwgdGhhdCB0aGUgc2Vjb25kIGZpbHRlciBtZXRob2QgZ2V0cyBubyBzb3VyY2UKKwkJCS8vIHBhbGV0dGUgKHRoZSB0ZW1wb3JhcnkgaW1hZ2UgaXMgcGFsbGV0aXplZCBvbmx5LCBpZiBpdCBpcworCQkJLy8gZ3JleXNjYWxlOyBpbiB0aGF0IGNhc2UsIGl0IGlzIGFuIDgtYml0IGltYWdlIHdpdGggYSBsaW5lYXIKKwkJCS8vIHBhbGV0dGUgc28sIHRoZSBzb3VyY2UgcGFsZXR0ZSBpcyBub3QgbmVlZGVkIG9yIHdpbGwgZXZlbiBiZQorCQkJLy8gbWlzbWF0Y2hpbmcsIGlmIHRoZSBzb3VyY2UgcGFsZXR0ZSBpcyB1bm9yZGVyZWQpCisJCQlzcmNfcGFsID0gTlVMTDsKKwkJfSBlbHNlIHsKKwkJCS8vIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gd2lkdGhzIGFyZSBlcXVhbCBzbywganVzdCBjb3B5IHRoZQorCQkJLy8gaW1hZ2UgcG9pbnRlcgorCQkJdG1wID0gc3JjOworCQl9CisKKwkJaWYgKHNyY19oZWlnaHQgIT0gZHN0X2hlaWdodCkgeworCQkJLy8gc291cmNlIGFuZCBkZXN0aW5hdGlvbiBoZWlnaHRzIGFyZSBkaWZmZXJlbnQgc28sIHNjYWxlCisJCQkvLyB0ZW1wb3JhcnkgKG9yIHNvdXJjZSkgaW1hZ2UgdmVydGljYWxseSBpbnRvIGRlc3RpbmF0aW9uIGltYWdlCisJCQl2ZXJ0aWNhbEZpbHRlcih0bXAsIGRzdF93aWR0aCwgc3JjX2hlaWdodCwgc3JjX29mZnNldF94LCBzcmNfb2Zmc2V0X3ksIHNyY19wYWwsIGRzdCwgZHN0X2hlaWdodCk7CisJCX0KKworCQkvLyBmcmVlIHRlbXBvcmFyeSBpbWFnZSwgaWYgbm90IHBvaW50aW5nIHRvIGVpdGhlciBzcmMgb3IgZHN0CisJCWlmICh0bXAgIT0gc3JjICYmIHRtcCAhPSBkc3QpIHsKKwkJCUZyZWVJbWFnZV9VbmxvYWQodG1wKTsKKwkJfQorCisJfSBlbHNlIHsKKwkJLy8geXggZmlsdGVyaW5nCisJCS8vIC0tLS0tLS0tLS0tLS0KKworCQkvLyBSZW1hcms6CisJCS8vIFRoZSB5eCBmaWx0ZXJpbmcgYnJhbmNoIGNvdWxkIGJlIG1vcmUgb3B0aW1pemVkIGJ5IHRha2luZyBpbnRvLAorCQkvLyBhY2NvdW50IHRoYXQgKHNyY193aWR0aCAhPSBkc3Rfd2lkdGgpIGlzIGFsd2F5cyB0cnVlLCB3aGljaAorCQkvLyBmb2xsb3dzIGZyb20gdGhlIGFib3ZlIGNvbmRpdGlvbiwgd2hpY2ggc2VsZWN0cyBmaWx0ZXJpbmcgb3JkZXIuCisJCS8vIFNpbmNlIChkc3Rfd2lkdGggPD0gc3JjX3dpZHRoKSA9PSBUUlVFIHNlbGVjdHMgeHkgZmlsdGVyaW5nLAorCQkvLyBib3RoIHdpZHRocyBtdXN0IGJlIGRpZmZlcmVudCB3aGVuIHBlcmZvcm1pbmcgeXggZmlsdGVyaW5nLgorCQkvLyBIb3dldmVyLCB0byBtYWtlIHRoZSBjb2RlIG1vcmUgcm9idXN0LCBub3QgZGVwZW5kaW5nIG9uIHRoYXQKKwkJLy8gY29uZGl0aW9uIGFuZCBtb3JlIHN5bW1ldHJpYyB0byB0aGUgeHkgZmlsdGVyaW5nIGNhc2UsIHRoZXNlCisJCS8vIChzcmNfd2lkdGggIT0gZHN0X3dpZHRoKSBjb25kaXRpb25zIGFyZSBzdGlsbCBpbiBwbGFjZS4KKworCQlGSUJJVE1BUCAqdG1wID0gTlVMTDsKKworCQlpZiAoc3JjX2hlaWdodCAhPSBkc3RfaGVpZ2h0KSB7CisJCQkvLyBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGhlaWdodHMgYXJlIGRpZmZlcmVudCBzbywgd2UgbXVzdAorCQkJLy8gZmlsdGVyIHZlcnRpY2FsbHkKKwkJCWlmIChzcmNfd2lkdGggIT0gZHN0X3dpZHRoKSB7CisJCQkJLy8gc291cmNlIGFuZCBkZXN0aW5hdGlvbiB3aWR0aHMgYXJlIGFsc28gZGlmZmVyZW50IHNvLCB3ZSBuZWVkCisJCQkJLy8gYSB0ZW1wb3JhcnkgaW1hZ2UKKwkJCQl0bXAgPSBGcmVlSW1hZ2VfQWxsb2NhdGVUKGltYWdlX3R5cGUsIHNyY193aWR0aCwgZHN0X2hlaWdodCwgZHN0X2JwcF9zMSwgMCwgMCwgMCk7CisJCQkJaWYgKCF0bXApIHsKKwkJCQkJRnJlZUltYWdlX1VubG9hZChkc3QpOworCQkJCQlyZXR1cm4gTlVMTDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8vIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gd2lkdGhzIGFyZSBlcXVhbCBzbywgd2UgY2FuIGRpcmVjdGx5CisJCQkJLy8gc2NhbGUgaW50byBkZXN0aW5hdGlvbiBpbWFnZSAoc2Vjb25kIGZpbHRlciBtZXRob2Qgd2lsbCBub3QKKwkJCQkvLyBiZSBpbnZva2VkKQorCQkJCXRtcCA9IGRzdDsKKwkJCX0KKworCQkJLy8gc2NhbGUgc291cmNlIGltYWdlIHZlcnRpY2FsbHkgaW50byB0ZW1wb3JhcnkgKG9yIGRlc3RpbmF0aW9uKSBpbWFnZQorCQkJdmVydGljYWxGaWx0ZXIoc3JjLCBzcmNfd2lkdGgsIHNyY19oZWlnaHQsIHNyY19vZmZzZXRfeCwgc3JjX29mZnNldF95LCBzcmNfcGFsLCB0bXAsIGRzdF9oZWlnaHQpOworCisJCQkvLyBzZXQgeCBhbmQgeSBvZmZzZXRzIHRvIHplcm8gZm9yIHRoZSBzZWNvbmQgZmlsdGVyIG1ldGhvZAorCQkJLy8gaW52b2NhdGlvbiAodGhlIHRlbXBvcmFyeSBpbWFnZSBvbmx5IGNvbnRhaW5zIHRoZSBwb3J0aW9uIG9mCisJCQkvLyB0aGUgaW1hZ2UgdG8gYmUgcmVzY2FsZWQgd2l0aCBubyBvZmZzZXRzKQorCQkJc3JjX29mZnNldF94ID0gMDsKKwkJCXNyY19vZmZzZXRfeSA9IDA7CisKKwkJCS8vIGFsc28gZW5zdXJlLCB0aGF0IHRoZSBzZWNvbmQgZmlsdGVyIG1ldGhvZCBnZXRzIG5vIHNvdXJjZQorCQkJLy8gcGFsZXR0ZSAodGhlIHRlbXBvcmFyeSBpbWFnZSBpcyBwYWxsZXRpemVkIG9ubHksIGlmIGl0IGlzCisJCQkvLyBncmV5c2NhbGU7IGluIHRoYXQgY2FzZSwgaXQgaXMgYW4gOC1iaXQgaW1hZ2Ugd2l0aCBhIGxpbmVhcgorCQkJLy8gcGFsZXR0ZSBzbywgdGhlIHNvdXJjZSBwYWxldHRlIGlzIG5vdCBuZWVkZWQgb3Igd2lsbCBldmVuIGJlCisJCQkvLyBtaXNtYXRjaGluZywgaWYgdGhlIHNvdXJjZSBwYWxldHRlIGlzIHVub3JkZXJlZCkKKwkJCXNyY19wYWwgPSBOVUxMOworCisJCX0gZWxzZSB7CisJCQkvLyBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGhlaWdodHMgYXJlIGVxdWFsIHNvLCBqdXN0IGNvcHkgdGhlCisJCQkvLyBpbWFnZSBwb2ludGVyCisJCQl0bXAgPSBzcmM7CisJCX0KKworCQlpZiAoc3JjX3dpZHRoICE9IGRzdF93aWR0aCkgeworCQkJLy8gc291cmNlIGFuZCBkZXN0aW5hdGlvbiBoZWlnaHRzIGFyZSBkaWZmZXJlbnQgc28sIHNjYWxlCisJCQkvLyB0ZW1wb3JhcnkgKG9yIHNvdXJjZSkgaW1hZ2UgaG9yaXpvbnRhbGx5IGludG8gZGVzdGluYXRpb24gaW1hZ2UKKwkJCWhvcml6b250YWxGaWx0ZXIodG1wLCBkc3RfaGVpZ2h0LCBzcmNfd2lkdGgsIHNyY19vZmZzZXRfeCwgc3JjX29mZnNldF95LCBzcmNfcGFsLCBkc3QsIGRzdF93aWR0aCk7CisJCX0KKworCQkvLyBmcmVlIHRlbXBvcmFyeSBpbWFnZSwgaWYgbm90IHBvaW50aW5nIHRvIGVpdGhlciBzcmMgb3IgZHN0CisJCWlmICh0bXAgIT0gc3JjICYmIHRtcCAhPSBkc3QpIHsKKwkJCUZyZWVJbWFnZV9VbmxvYWQodG1wKTsKKwkJfQorCX0KKworCXJldHVybiBkc3Q7Cit9IAorCit2b2lkIENSZXNpemVFbmdpbmU6Omhvcml6b250YWxGaWx0ZXIoRklCSVRNQVAgKmNvbnN0IHNyYywgdW5zaWduZWQgaGVpZ2h0LCB1bnNpZ25lZCBzcmNfd2lkdGgsIHVuc2lnbmVkIHNyY19vZmZzZXRfeCwgdW5zaWduZWQgc3JjX29mZnNldF95LCBjb25zdCBSR0JRVUFEICpjb25zdCBzcmNfcGFsLCBGSUJJVE1BUCAqY29uc3QgZHN0LCB1bnNpZ25lZCBkc3Rfd2lkdGgpIHsKKworCS8vIGFsbG9jYXRlIGFuZCBjYWxjdWxhdGUgdGhlIGNvbnRyaWJ1dGlvbnMKKwlDV2VpZ2h0c1RhYmxlIHdlaWdodHNUYWJsZShtX3BGaWx0ZXIsIGRzdF93aWR0aCwgc3JjX3dpZHRoKTsKKworCS8vIHN0ZXAgdGhyb3VnaCByb3dzCisJc3dpdGNoKEZyZWVJbWFnZV9HZXRJbWFnZVR5cGUoc3JjKSkgeworCQljYXNlIEZJVF9CSVRNQVA6CisJCXsKKwkJCXN3aXRjaChGcmVlSW1hZ2VfR2V0QlBQKHNyYykpIHsKKwkJCQljYXNlIDE6CisJCQkJeworCQkJCQlzd2l0Y2goRnJlZUltYWdlX0dldEJQUChkc3QpKSB7CisJCQkJCQljYXNlIDg6CisJCQkJCQl7CisJCQkJCQkJLy8gdHJhbnNwYXJlbnRseSBjb252ZXJ0IHRoZSAxLWJpdCBub24tdHJhbnNwYXJlbnQgZ3JleXNjYWxlIGltYWdlIHRvIDggYnBwCisJCQkJCQkJc3JjX29mZnNldF94ID4+PSAzOworCQkJCQkJCWlmIChzcmNfcGFsKSB7CisJCQkJCQkJCS8vIHdlIGhhdmUgZ290IGEgcGFsZXR0ZQorCQkJCQkJCQlmb3IgKHVuc2lnbmVkIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJCQkJCQkJCS8vIHNjYWxlIGVhY2ggcm93CisJCQkJCQkJCQljb25zdCBCWVRFICogY29uc3Qgc3JjX2JpdHMgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoc3JjLCB5ICsgc3JjX29mZnNldF95KSArIHNyY19vZmZzZXRfeDsKKwkJCQkJCQkJCUJZVEUgKiBjb25zdCBkc3RfYml0cyA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShkc3QsIHkpOworCisJCQkJCQkJCQlmb3IgKHVuc2lnbmVkIHggPSAwOyB4IDwgZHN0X3dpZHRoOyB4KyspIHsKKwkJCQkJCQkJCQkvLyBsb29wIHRocm91Z2ggcm93CisJCQkJCQkJCQkJY29uc3QgdW5zaWduZWQgaUxlZnQgPSB3ZWlnaHRzVGFibGUuZ2V0TGVmdEJvdW5kYXJ5KHgpOwkJLy8gcmV0cmlldmUgbGVmdCBib3VuZGFyeQorCQkJCQkJCQkJCWNvbnN0IHVuc2lnbmVkIGlSaWdodCA9IHdlaWdodHNUYWJsZS5nZXRSaWdodEJvdW5kYXJ5KHgpOwkvLyByZXRyaWV2ZSByaWdodCBib3VuZGFyeQorCQkJCQkJCQkJCWRvdWJsZSB2YWx1ZSA9IDA7CisKKwkJCQkJCQkJCQlmb3IgKHVuc2lnbmVkIGkgPSBpTGVmdDsgaSA8IGlSaWdodDsgaSsrKSB7CisJCQkJCQkJCQkJCS8vIHNjYW4gYmV0d2VlbiBib3VuZGFyaWVzCisJCQkJCQkJCQkJCS8vIGFjY3VtdWxhdGUgd2VpZ2h0ZWQgZWZmZWN0IG9mIGVhY2ggbmVpZ2hib3JpbmcgcGl4ZWwKKwkJCQkJCQkJCQkJY29uc3QgdW5zaWduZWQgcGl4ZWwgPSAoc3JjX2JpdHNbaSA+PiAzXSAmICgweDgwID4+IChpICYgMHgwNykpKSAhPSAwOworCQkJCQkJCQkJCQl2YWx1ZSArPSAod2VpZ2h0c1RhYmxlLmdldFdlaWdodCh4LCBpIC0gaUxlZnQpICogKGRvdWJsZSkqKEJZVEUgKikmc3JjX3BhbFtwaXhlbF0pOworCQkJCQkJCQkJCX0KKworCQkJCQkJCQkJCS8vIGNsYW1wIGFuZCBwbGFjZSByZXN1bHQgaW4gZGVzdGluYXRpb24gcGl4ZWwKKwkJCQkJCQkJCQlkc3RfYml0c1t4XSA9IChCWVRFKUNMQU1QPGludD4oKGludCkodmFsdWUgKyAwLjUpLCAwLCAweEZGKTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCS8vIHdlIGRvIG5vdCBoYXZlIGEgcGFsZXR0ZQorCQkJCQkJCQlmb3IgKHVuc2lnbmVkIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJCQkJCQkJCS8vIHNjYWxlIGVhY2ggcm93CisJCQkJCQkJCQljb25zdCBCWVRFICogY29uc3Qgc3JjX2JpdHMgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoc3JjLCB5ICsgc3JjX29mZnNldF95KSArIHNyY19vZmZzZXRfeDsKKwkJCQkJCQkJCUJZVEUgKiBjb25zdCBkc3RfYml0cyA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShkc3QsIHkpOworCisJCQkJCQkJCQlmb3IgKHVuc2lnbmVkIHggPSAwOyB4IDwgZHN0X3dpZHRoOyB4KyspIHsKKwkJCQkJCQkJCQkvLyBsb29wIHRocm91Z2ggcm93CisJCQkJCQkJCQkJY29uc3QgdW5zaWduZWQgaUxlZnQgPSB3ZWlnaHRzVGFibGUuZ2V0TGVmdEJvdW5kYXJ5KHgpOwkJLy8gcmV0cmlldmUgbGVmdCBib3VuZGFyeQorCQkJCQkJCQkJCWNvbnN0IHVuc2lnbmVkIGlSaWdodCA9IHdlaWdodHNUYWJsZS5nZXRSaWdodEJvdW5kYXJ5KHgpOwkvLyByZXRyaWV2ZSByaWdodCBib3VuZGFyeQorCQkJCQkJCQkJCWRvdWJsZSB2YWx1ZSA9IDA7CisKKwkJCQkJCQkJCQlmb3IgKHVuc2lnbmVkIGkgPSBpTGVmdDsgaSA8IGlSaWdodDsgaSsrKSB7CisJCQkJCQkJCQkJCS8vIHNjYW4gYmV0d2VlbiBib3VuZGFyaWVzCisJCQkJCQkJCQkJCS8vIGFjY3VtdWxhdGUgd2VpZ2h0ZWQgZWZmZWN0IG9mIGVhY2ggbmVpZ2hib3JpbmcgcGl4ZWwKKwkJCQkJCQkJCQkJY29uc3QgdW5zaWduZWQgcGl4ZWwgPSAoc3JjX2JpdHNbaSA+PiAzXSAmICgweDgwID4+IChpICYgMHgwNykpKSAhPSAwOworCQkJCQkJCQkJCQl2YWx1ZSArPSAod2VpZ2h0c1RhYmxlLmdldFdlaWdodCh4LCBpIC0gaUxlZnQpICogKGRvdWJsZSlwaXhlbCk7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJCXZhbHVlICo9IDB4RkY7CisKKwkJCQkJCQkJCQkvLyBjbGFtcCBhbmQgcGxhY2UgcmVzdWx0IGluIGRlc3RpbmF0aW9uIHBpeGVsCisJCQkJCQkJCQkJZHN0X2JpdHNbeF0gPSAoQllURSlDTEFNUDxpbnQ+KChpbnQpKHZhbHVlICsgMC41KSwgMCwgMHhGRik7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQlicmVhazsKKworCQkJCQkJY2FzZSAyNDoKKwkJCQkJCXsKKwkJCQkJCQkvLyB0cmFuc3BhcmVudGx5IGNvbnZlcnQgdGhlIG5vbi10cmFuc3BhcmVudCAxLWJpdCBpbWFnZSB0byAyNCBicHAKKwkJCQkJCQlzcmNfb2Zmc2V0X3ggPj49IDM7CisJCQkJCQkJaWYgKHNyY19wYWwpIHsKKwkJCQkJCQkJLy8gd2UgaGF2ZSBnb3QgYSBwYWxldHRlCisJCQkJCQkJCWZvciAodW5zaWduZWQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworCQkJCQkJCQkJLy8gc2NhbGUgZWFjaCByb3cKKwkJCQkJCQkJCWNvbnN0IEJZVEUgKiBjb25zdCBzcmNfYml0cyA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShzcmMsIHkgKyBzcmNfb2Zmc2V0X3kpICsgc3JjX29mZnNldF94OworCQkJCQkJCQkJQllURSAqZHN0X2JpdHMgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZHN0LCB5KTsKKworCQkJCQkJCQkJZm9yICh1bnNpZ25lZCB4ID0gMDsgeCA8IGRzdF93aWR0aDsgeCsrKSB7CisJCQkJCQkJCQkJLy8gbG9vcCB0aHJvdWdoIHJvdworCQkJCQkJCQkJCWNvbnN0IHVuc2lnbmVkIGlMZWZ0ID0gd2VpZ2h0c1RhYmxlLmdldExlZnRCb3VuZGFyeSh4KTsgICAgLy8gcmV0cmlldmUgbGVmdCBib3VuZGFyeQorCQkJCQkJCQkJCWNvbnN0IHVuc2lnbmVkIGlSaWdodCA9IHdlaWdodHNUYWJsZS5nZXRSaWdodEJvdW5kYXJ5KHgpOyAgLy8gcmV0cmlldmUgcmlnaHQgYm91bmRhcnkKKwkJCQkJCQkJCQlkb3VibGUgciA9IDAsIGcgPSAwLCBiID0gMDsKKworCQkJCQkJCQkJCWZvciAodW5zaWduZWQgaSA9IGlMZWZ0OyBpIDwgaVJpZ2h0OyBpKyspIHsKKwkJCQkJCQkJCQkJLy8gc2NhbiBiZXR3ZWVuIGJvdW5kYXJpZXMKKwkJCQkJCQkJCQkJLy8gYWNjdW11bGF0ZSB3ZWlnaHRlZCBlZmZlY3Qgb2YgZWFjaCBuZWlnaGJvcmluZyBwaXhlbAorCQkJCQkJCQkJCQljb25zdCBkb3VibGUgd2VpZ2h0ID0gd2VpZ2h0c1RhYmxlLmdldFdlaWdodCh4LCBpIC0gaUxlZnQpOworCQkJCQkJCQkJCQljb25zdCB1bnNpZ25lZCBwaXhlbCA9IChzcmNfYml0c1tpID4+IDNdICYgKDB4ODAgPj4gKGkgJiAweDA3KSkpICE9IDA7CisJCQkJCQkJCQkJCWNvbnN0IEJZVEUgKiBjb25zdCBlbnRyeSA9IChCWVRFICopJnNyY19wYWxbcGl4ZWxdOworCQkJCQkJCQkJCQlyICs9ICh3ZWlnaHQgKiAoZG91YmxlKWVudHJ5W0ZJX1JHQkFfUkVEXSk7CisJCQkJCQkJCQkJCWcgKz0gKHdlaWdodCAqIChkb3VibGUpZW50cnlbRklfUkdCQV9HUkVFTl0pOworCQkJCQkJCQkJCQliICs9ICh3ZWlnaHQgKiAoZG91YmxlKWVudHJ5W0ZJX1JHQkFfQkxVRV0pOworCQkJCQkJCQkJCX0KKworCQkJCQkJCQkJCS8vIGNsYW1wIGFuZCBwbGFjZSByZXN1bHQgaW4gZGVzdGluYXRpb24gcGl4ZWwKKwkJCQkJCQkJCQlkc3RfYml0c1tGSV9SR0JBX1JFRF0JPSAoQllURSlDTEFNUDxpbnQ+KChpbnQpKHIgKyAwLjUpLCAwLCAweEZGKTsKKwkJCQkJCQkJCQlkc3RfYml0c1tGSV9SR0JBX0dSRUVOXQk9IChCWVRFKUNMQU1QPGludD4oKGludCkoZyArIDAuNSksIDAsIDB4RkYpOworCQkJCQkJCQkJCWRzdF9iaXRzW0ZJX1JHQkFfQkxVRV0JPSAoQllURSlDTEFNUDxpbnQ+KChpbnQpKGIgKyAwLjUpLCAwLCAweEZGKTsKKwkJCQkJCQkJCQlkc3RfYml0cyArPSAzOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJLy8gd2UgZG8gbm90IGhhdmUgYSBwYWxldHRlCisJCQkJCQkJCWZvciAodW5zaWduZWQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworCQkJCQkJCQkJLy8gc2NhbGUgZWFjaCByb3cKKwkJCQkJCQkJCWNvbnN0IEJZVEUgKiBjb25zdCBzcmNfYml0cyA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShzcmMsIHkgKyBzcmNfb2Zmc2V0X3kpICsgc3JjX29mZnNldF94OworCQkJCQkJCQkJQllURSAqZHN0X2JpdHMgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZHN0LCB5KTsKKworCQkJCQkJCQkJZm9yICh1bnNpZ25lZCB4ID0gMDsgeCA8IGRzdF93aWR0aDsgeCsrKSB7CisJCQkJCQkJCQkJLy8gbG9vcCB0aHJvdWdoIHJvdworCQkJCQkJCQkJCWNvbnN0IHVuc2lnbmVkIGlMZWZ0ID0gd2VpZ2h0c1RhYmxlLmdldExlZnRCb3VuZGFyeSh4KTsgICAgLy8gcmV0cmlldmUgbGVmdCBib3VuZGFyeQorCQkJCQkJCQkJCWNvbnN0IHVuc2lnbmVkIGlSaWdodCA9IHdlaWdodHNUYWJsZS5nZXRSaWdodEJvdW5kYXJ5KHgpOyAgLy8gcmV0cmlldmUgcmlnaHQgYm91bmRhcnkKKwkJCQkJCQkJCQlkb3VibGUgdmFsdWUgPSAwOworCisJCQkJCQkJCQkJZm9yICh1bnNpZ25lZCBpID0gaUxlZnQ7IGkgPCBpUmlnaHQ7IGkrKykgeworCQkJCQkJCQkJCQkvLyBzY2FuIGJldHdlZW4gYm91bmRhcmllcworCQkJCQkJCQkJCQkvLyBhY2N1bXVsYXRlIHdlaWdodGVkIGVmZmVjdCBvZiBlYWNoIG5laWdoYm9yaW5nIHBpeGVsCisJCQkJCQkJCQkJCWNvbnN0IHVuc2lnbmVkIHBpeGVsID0gKHNyY19iaXRzW2kgPj4gM10gJiAoMHg4MCA+PiAoaSAmIDB4MDcpKSkgIT0gMDsKKwkJCQkJCQkJCQkJdmFsdWUgKz0gKHdlaWdodHNUYWJsZS5nZXRXZWlnaHQoeCwgaSAtIGlMZWZ0KSAqIChkb3VibGUpcGl4ZWwpOworCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQl2YWx1ZSAqPSAweEZGOworCisJCQkJCQkJCQkJLy8gY2xhbXAgYW5kIHBsYWNlIHJlc3VsdCBpbiBkZXN0aW5hdGlvbiBwaXhlbAorCQkJCQkJCQkJCWNvbnN0IEJZVEUgYnZhbCA9IChCWVRFKUNMQU1QPGludD4oKGludCkodmFsdWUgKyAwLjUpLCAwLCAweEZGKTsKKwkJCQkJCQkJCQlkc3RfYml0c1tGSV9SR0JBX1JFRF0JPSBidmFsOworCQkJCQkJCQkJCWRzdF9iaXRzW0ZJX1JHQkFfR1JFRU5dCT0gYnZhbDsKKwkJCQkJCQkJCQlkc3RfYml0c1tGSV9SR0JBX0JMVUVdCT0gYnZhbDsKKwkJCQkJCQkJCQlkc3RfYml0cyArPSAzOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJYnJlYWs7CisKKwkJCQkJCWNhc2UgMzI6CisJCQkJCQl7CisJCQkJCQkJLy8gdHJhbnNwYXJlbnRseSBjb252ZXJ0IHRoZSB0cmFuc3BhcmVudCAxLWJpdCBpbWFnZSB0byAzMiBicHA7IAorCQkJCQkJCS8vIHdlIGFsd2F5cyBoYXZlIGdvdCBhIHBhbGV0dGUgaGVyZQorCQkJCQkJCXNyY19vZmZzZXRfeCA+Pj0gMzsKKworCQkJCQkJCWZvciAodW5zaWduZWQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworCQkJCQkJCQkvLyBzY2FsZSBlYWNoIHJvdworCQkJCQkJCQljb25zdCBCWVRFICogY29uc3Qgc3JjX2JpdHMgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoc3JjLCB5ICsgc3JjX29mZnNldF95KSArIHNyY19vZmZzZXRfeDsKKwkJCQkJCQkJQllURSAqZHN0X2JpdHMgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZHN0LCB5KTsKKworCQkJCQkJCQlmb3IgKHVuc2lnbmVkIHggPSAwOyB4IDwgZHN0X3dpZHRoOyB4KyspIHsKKwkJCQkJCQkJCS8vIGxvb3AgdGhyb3VnaCByb3cKKwkJCQkJCQkJCWNvbnN0IHVuc2lnbmVkIGlMZWZ0ID0gd2VpZ2h0c1RhYmxlLmdldExlZnRCb3VuZGFyeSh4KTsgICAgLy8gcmV0cmlldmUgbGVmdCBib3VuZGFyeQorCQkJCQkJCQkJY29uc3QgdW5zaWduZWQgaVJpZ2h0ID0gd2VpZ2h0c1RhYmxlLmdldFJpZ2h0Qm91bmRhcnkoeCk7ICAvLyByZXRyaWV2ZSByaWdodCBib3VuZGFyeQorCQkJCQkJCQkJZG91YmxlIHIgPSAwLCBnID0gMCwgYiA9IDAsIGEgPSAwOworCisJCQkJCQkJCQlmb3IgKHVuc2lnbmVkIGkgPSBpTGVmdDsgaSA8IGlSaWdodDsgaSsrKSB7CisJCQkJCQkJCQkJLy8gc2NhbiBiZXR3ZWVuIGJvdW5kYXJpZXMKKwkJCQkJCQkJCQkvLyBhY2N1bXVsYXRlIHdlaWdodGVkIGVmZmVjdCBvZiBlYWNoIG5laWdoYm9yaW5nIHBpeGVsCisJCQkJCQkJCQkJY29uc3QgZG91YmxlIHdlaWdodCA9IHdlaWdodHNUYWJsZS5nZXRXZWlnaHQoeCwgaSAtIGlMZWZ0KTsKKwkJCQkJCQkJCQljb25zdCB1bnNpZ25lZCBwaXhlbCA9IChzcmNfYml0c1tpID4+IDNdICYgKDB4ODAgPj4gKGkgJiAweDA3KSkpICE9IDA7CisJCQkJCQkJCQkJY29uc3QgQllURSAqIGNvbnN0IGVudHJ5ID0gKEJZVEUgKikmc3JjX3BhbFtwaXhlbF07CisJCQkJCQkJCQkJciArPSAod2VpZ2h0ICogKGRvdWJsZSllbnRyeVtGSV9SR0JBX1JFRF0pOworCQkJCQkJCQkJCWcgKz0gKHdlaWdodCAqIChkb3VibGUpZW50cnlbRklfUkdCQV9HUkVFTl0pOworCQkJCQkJCQkJCWIgKz0gKHdlaWdodCAqIChkb3VibGUpZW50cnlbRklfUkdCQV9CTFVFXSk7CisJCQkJCQkJCQkJYSArPSAod2VpZ2h0ICogKGRvdWJsZSllbnRyeVtGSV9SR0JBX0FMUEhBXSk7CisJCQkJCQkJCQl9CisKKwkJCQkJCQkJCS8vIGNsYW1wIGFuZCBwbGFjZSByZXN1bHQgaW4gZGVzdGluYXRpb24gcGl4ZWwKKwkJCQkJCQkJCWRzdF9iaXRzW0ZJX1JHQkFfUkVEXQk9IChCWVRFKUNMQU1QPGludD4oKGludCkociArIDAuNSksIDAsIDB4RkYpOworCQkJCQkJCQkJZHN0X2JpdHNbRklfUkdCQV9HUkVFTl0JPSAoQllURSlDTEFNUDxpbnQ+KChpbnQpKGcgKyAwLjUpLCAwLCAweEZGKTsKKwkJCQkJCQkJCWRzdF9iaXRzW0ZJX1JHQkFfQkxVRV0JPSAoQllURSlDTEFNUDxpbnQ+KChpbnQpKGIgKyAwLjUpLCAwLCAweEZGKTsKKwkJCQkJCQkJCWRzdF9iaXRzW0ZJX1JHQkFfQUxQSEFdCT0gKEJZVEUpQ0xBTVA8aW50PigoaW50KShhICsgMC41KSwgMCwgMHhGRik7CisJCQkJCQkJCQlkc3RfYml0cyArPSA0OworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCQljYXNlIDQ6CisJCQkJeworCQkJCQlzd2l0Y2goRnJlZUltYWdlX0dldEJQUChkc3QpKSB7CisJCQkJCQljYXNlIDg6CisJCQkJCQl7CisJCQkJCQkJLy8gdHJhbnNwYXJlbnRseSBjb252ZXJ0IHRoZSBub24tdHJhbnNwYXJlbnQgNC1iaXQgZ3JleXNjYWxlIGltYWdlIHRvIDggYnBwOyAKKwkJCQkJCQkvLyB3ZSBhbHdheXMgaGF2ZSBnb3QgYSBwYWxldHRlIGZvciA0LWJpdCBpbWFnZXMKKwkJCQkJCQlzcmNfb2Zmc2V0X3ggPj49IDE7CisKKwkJCQkJCQlmb3IgKHVuc2lnbmVkIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJCQkJCQkJLy8gc2NhbGUgZWFjaCByb3cKKwkJCQkJCQkJY29uc3QgQllURSAqIGNvbnN0IHNyY19iaXRzID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKHNyYywgeSArIHNyY19vZmZzZXRfeSkgKyBzcmNfb2Zmc2V0X3g7CisJCQkJCQkJCUJZVEUgKiBjb25zdCBkc3RfYml0cyA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShkc3QsIHkpOworCisJCQkJCQkJCWZvciAodW5zaWduZWQgeCA9IDA7IHggPCBkc3Rfd2lkdGg7IHgrKykgeworCQkJCQkJCQkJLy8gbG9vcCB0aHJvdWdoIHJvdworCQkJCQkJCQkJY29uc3QgdW5zaWduZWQgaUxlZnQgPSB3ZWlnaHRzVGFibGUuZ2V0TGVmdEJvdW5kYXJ5KHgpOyAgICAvLyByZXRyaWV2ZSBsZWZ0IGJvdW5kYXJ5CisJCQkJCQkJCQljb25zdCB1bnNpZ25lZCBpUmlnaHQgPSB3ZWlnaHRzVGFibGUuZ2V0UmlnaHRCb3VuZGFyeSh4KTsgIC8vIHJldHJpZXZlIHJpZ2h0IGJvdW5kYXJ5CisJCQkJCQkJCQlkb3VibGUgdmFsdWUgPSAwOworCisJCQkJCQkJCQlmb3IgKHVuc2lnbmVkIGkgPSBpTGVmdDsgaSA8IGlSaWdodDsgaSsrKSB7CisJCQkJCQkJCQkJLy8gc2NhbiBiZXR3ZWVuIGJvdW5kYXJpZXMKKwkJCQkJCQkJCQkvLyBhY2N1bXVsYXRlIHdlaWdodGVkIGVmZmVjdCBvZiBlYWNoIG5laWdoYm9yaW5nIHBpeGVsCisJCQkJCQkJCQkJY29uc3QgdW5zaWduZWQgcGl4ZWwgPSBpICYgMHgwMSA/IHNyY19iaXRzW2kgPj4gMV0gJiAweDBGIDogc3JjX2JpdHNbaSA+PiAxXSA+PiA0OworCQkJCQkJCQkJCXZhbHVlICs9ICh3ZWlnaHRzVGFibGUuZ2V0V2VpZ2h0KHgsIGkgLSBpTGVmdCkgKiAoZG91YmxlKSooQllURSAqKSZzcmNfcGFsW3BpeGVsXSk7CisJCQkJCQkJCQl9CisKKwkJCQkJCQkJCS8vIGNsYW1wIGFuZCBwbGFjZSByZXN1bHQgaW4gZGVzdGluYXRpb24gcGl4ZWwKKwkJCQkJCQkJCWRzdF9iaXRzW3hdID0gKEJZVEUpQ0xBTVA8aW50PigoaW50KSh2YWx1ZSArIDAuNSksIDAsIDB4RkYpOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJYnJlYWs7CisKKwkJCQkJCWNhc2UgMjQ6CisJCQkJCQl7CisJCQkJCQkJLy8gdHJhbnNwYXJlbnRseSBjb252ZXJ0IHRoZSBub24tdHJhbnNwYXJlbnQgNC1iaXQgaW1hZ2UgdG8gMjQgYnBwOyAKKwkJCQkJCQkvLyB3ZSBhbHdheXMgaGF2ZSBnb3QgYSBwYWxldHRlIGZvciA0LWJpdCBpbWFnZXMKKwkJCQkJCQlzcmNfb2Zmc2V0X3ggPj49IDE7CisKKwkJCQkJCQlmb3IgKHVuc2lnbmVkIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJCQkJCQkJLy8gc2NhbGUgZWFjaCByb3cKKwkJCQkJCQkJY29uc3QgQllURSAqIGNvbnN0IHNyY19iaXRzID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKHNyYywgeSArIHNyY19vZmZzZXRfeSkgKyBzcmNfb2Zmc2V0X3g7CisJCQkJCQkJCUJZVEUgKmRzdF9iaXRzID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKGRzdCwgeSk7CisKKwkJCQkJCQkJZm9yICh1bnNpZ25lZCB4ID0gMDsgeCA8IGRzdF93aWR0aDsgeCsrKSB7CisJCQkJCQkJCQkvLyBsb29wIHRocm91Z2ggcm93CisJCQkJCQkJCQljb25zdCB1bnNpZ25lZCBpTGVmdCA9IHdlaWdodHNUYWJsZS5nZXRMZWZ0Qm91bmRhcnkoeCk7ICAgIC8vIHJldHJpZXZlIGxlZnQgYm91bmRhcnkKKwkJCQkJCQkJCWNvbnN0IHVuc2lnbmVkIGlSaWdodCA9IHdlaWdodHNUYWJsZS5nZXRSaWdodEJvdW5kYXJ5KHgpOyAgLy8gcmV0cmlldmUgcmlnaHQgYm91bmRhcnkKKwkJCQkJCQkJCWRvdWJsZSByID0gMCwgZyA9IDAsIGIgPSAwOworCisJCQkJCQkJCQlmb3IgKHVuc2lnbmVkIGkgPSBpTGVmdDsgaSA8IGlSaWdodDsgaSsrKSB7CisJCQkJCQkJCQkJLy8gc2NhbiBiZXR3ZWVuIGJvdW5kYXJpZXMKKwkJCQkJCQkJCQkvLyBhY2N1bXVsYXRlIHdlaWdodGVkIGVmZmVjdCBvZiBlYWNoIG5laWdoYm9yaW5nIHBpeGVsCisJCQkJCQkJCQkJY29uc3QgZG91YmxlIHdlaWdodCA9IHdlaWdodHNUYWJsZS5nZXRXZWlnaHQoeCwgaSAtIGlMZWZ0KTsKKwkJCQkJCQkJCQljb25zdCB1bnNpZ25lZCBwaXhlbCA9IGkgJiAweDAxID8gc3JjX2JpdHNbaSA+PiAxXSAmIDB4MEYgOiBzcmNfYml0c1tpID4+IDFdID4+IDQ7CisJCQkJCQkJCQkJY29uc3QgQllURSAqIGNvbnN0IGVudHJ5ID0gKEJZVEUgKikmc3JjX3BhbFtwaXhlbF07CisJCQkJCQkJCQkJciArPSAod2VpZ2h0ICogKGRvdWJsZSllbnRyeVtGSV9SR0JBX1JFRF0pOworCQkJCQkJCQkJCWcgKz0gKHdlaWdodCAqIChkb3VibGUpZW50cnlbRklfUkdCQV9HUkVFTl0pOworCQkJCQkJCQkJCWIgKz0gKHdlaWdodCAqIChkb3VibGUpZW50cnlbRklfUkdCQV9CTFVFXSk7CisJCQkJCQkJCQl9CisKKwkJCQkJCQkJCS8vIGNsYW1wIGFuZCBwbGFjZSByZXN1bHQgaW4gZGVzdGluYXRpb24gcGl4ZWwKKwkJCQkJCQkJCWRzdF9iaXRzW0ZJX1JHQkFfUkVEXQk9IChCWVRFKUNMQU1QPGludD4oKGludCkociArIDAuNSksIDAsIDB4RkYpOworCQkJCQkJCQkJZHN0X2JpdHNbRklfUkdCQV9HUkVFTl0JPSAoQllURSlDTEFNUDxpbnQ+KChpbnQpKGcgKyAwLjUpLCAwLCAweEZGKTsKKwkJCQkJCQkJCWRzdF9iaXRzW0ZJX1JHQkFfQkxVRV0JPSAoQllURSlDTEFNUDxpbnQ+KChpbnQpKGIgKyAwLjUpLCAwLCAweEZGKTsKKwkJCQkJCQkJCWRzdF9iaXRzICs9IDM7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQlicmVhazsKKworCQkJCQkJY2FzZSAzMjoKKwkJCQkJCXsKKwkJCQkJCQkvLyB0cmFuc3BhcmVudGx5IGNvbnZlcnQgdGhlIHRyYW5zcGFyZW50IDQtYml0IGltYWdlIHRvIDMyIGJwcDsgCisJCQkJCQkJLy8gd2UgYWx3YXlzIGhhdmUgZ290IGEgcGFsZXR0ZSBmb3IgNC1iaXQgaW1hZ2VzCisJCQkJCQkJc3JjX29mZnNldF94ID4+PSAxOworCisJCQkJCQkJZm9yICh1bnNpZ25lZCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisJCQkJCQkJCS8vIHNjYWxlIGVhY2ggcm93CisJCQkJCQkJCWNvbnN0IEJZVEUgKiBjb25zdCBzcmNfYml0cyA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShzcmMsIHkgKyBzcmNfb2Zmc2V0X3kpICsgc3JjX29mZnNldF94OworCQkJCQkJCQlCWVRFICpkc3RfYml0cyA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShkc3QsIHkpOworCisJCQkJCQkJCWZvciAodW5zaWduZWQgeCA9IDA7IHggPCBkc3Rfd2lkdGg7IHgrKykgeworCQkJCQkJCQkJLy8gbG9vcCB0aHJvdWdoIHJvdworCQkJCQkJCQkJY29uc3QgdW5zaWduZWQgaUxlZnQgPSB3ZWlnaHRzVGFibGUuZ2V0TGVmdEJvdW5kYXJ5KHgpOyAgICAvLyByZXRyaWV2ZSBsZWZ0IGJvdW5kYXJ5CisJCQkJCQkJCQljb25zdCB1bnNpZ25lZCBpUmlnaHQgPSB3ZWlnaHRzVGFibGUuZ2V0UmlnaHRCb3VuZGFyeSh4KTsgIC8vIHJldHJpZXZlIHJpZ2h0IGJvdW5kYXJ5CisJCQkJCQkJCQlkb3VibGUgciA9IDAsIGcgPSAwLCBiID0gMCwgYSA9IDA7CisKKwkJCQkJCQkJCWZvciAodW5zaWduZWQgaSA9IGlMZWZ0OyBpIDwgaVJpZ2h0OyBpKyspIHsKKwkJCQkJCQkJCQkvLyBzY2FuIGJldHdlZW4gYm91bmRhcmllcworCQkJCQkJCQkJCS8vIGFjY3VtdWxhdGUgd2VpZ2h0ZWQgZWZmZWN0IG9mIGVhY2ggbmVpZ2hib3JpbmcgcGl4ZWwKKwkJCQkJCQkJCQljb25zdCBkb3VibGUgd2VpZ2h0ID0gd2VpZ2h0c1RhYmxlLmdldFdlaWdodCh4LCBpIC0gaUxlZnQpOworCQkJCQkJCQkJCWNvbnN0IHVuc2lnbmVkIHBpeGVsID0gaSAmIDB4MDEgPyBzcmNfYml0c1tpID4+IDFdICYgMHgwRiA6IHNyY19iaXRzW2kgPj4gMV0gPj4gNDsKKwkJCQkJCQkJCQljb25zdCBCWVRFICogY29uc3QgZW50cnkgPSAoQllURSAqKSZzcmNfcGFsW3BpeGVsXTsKKwkJCQkJCQkJCQlyICs9ICh3ZWlnaHQgKiAoZG91YmxlKWVudHJ5W0ZJX1JHQkFfUkVEXSk7CisJCQkJCQkJCQkJZyArPSAod2VpZ2h0ICogKGRvdWJsZSllbnRyeVtGSV9SR0JBX0dSRUVOXSk7CisJCQkJCQkJCQkJYiArPSAod2VpZ2h0ICogKGRvdWJsZSllbnRyeVtGSV9SR0JBX0JMVUVdKTsKKwkJCQkJCQkJCQlhICs9ICh3ZWlnaHQgKiAoZG91YmxlKWVudHJ5W0ZJX1JHQkFfQUxQSEFdKTsKKwkJCQkJCQkJCX0KKworCQkJCQkJCQkJLy8gY2xhbXAgYW5kIHBsYWNlIHJlc3VsdCBpbiBkZXN0aW5hdGlvbiBwaXhlbAorCQkJCQkJCQkJZHN0X2JpdHNbRklfUkdCQV9SRURdCT0gKEJZVEUpQ0xBTVA8aW50PigoaW50KShyICsgMC41KSwgMCwgMHhGRik7CisJCQkJCQkJCQlkc3RfYml0c1tGSV9SR0JBX0dSRUVOXQk9IChCWVRFKUNMQU1QPGludD4oKGludCkoZyArIDAuNSksIDAsIDB4RkYpOworCQkJCQkJCQkJZHN0X2JpdHNbRklfUkdCQV9CTFVFXQk9IChCWVRFKUNMQU1QPGludD4oKGludCkoYiArIDAuNSksIDAsIDB4RkYpOworCQkJCQkJCQkJZHN0X2JpdHNbRklfUkdCQV9BTFBIQV0JPSAoQllURSlDTEFNUDxpbnQ+KChpbnQpKGEgKyAwLjUpLCAwLCAweEZGKTsKKwkJCQkJCQkJCWRzdF9iaXRzICs9IDQ7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKworCQkJCWNhc2UgODoKKwkJCQl7CisJCQkJCXN3aXRjaChGcmVlSW1hZ2VfR2V0QlBQKGRzdCkpIHsKKwkJCQkJCWNhc2UgODoKKwkJCQkJCXsKKwkJCQkJCQkvLyBzY2FsZSB0aGUgOC1iaXQgbm9uLXRyYW5zcGFyZW50IGdyZXlzY2FsZSBpbWFnZQorCQkJCQkJCS8vIGludG8gYW4gOCBicHAgZGVzdGluYXRpb24gaW1hZ2UKKwkJCQkJCQlpZiAoc3JjX3BhbCkgeworCQkJCQkJCQkvLyB3ZSBoYXZlIGdvdCBhIHBhbGV0dGUKKwkJCQkJCQkJZm9yICh1bnNpZ25lZCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisJCQkJCQkJCQkvLyBzY2FsZSBlYWNoIHJvdworCQkJCQkJCQkJY29uc3QgQllURSAqIGNvbnN0IHNyY19iaXRzID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKHNyYywgeSArIHNyY19vZmZzZXRfeSkgKyBzcmNfb2Zmc2V0X3g7CisJCQkJCQkJCQlCWVRFICogY29uc3QgZHN0X2JpdHMgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZHN0LCB5KTsKKworCQkJCQkJCQkJZm9yICh1bnNpZ25lZCB4ID0gMDsgeCA8IGRzdF93aWR0aDsgeCsrKSB7CisJCQkJCQkJCQkJLy8gbG9vcCB0aHJvdWdoIHJvdworCQkJCQkJCQkJCWNvbnN0IHVuc2lnbmVkIGlMZWZ0ID0gd2VpZ2h0c1RhYmxlLmdldExlZnRCb3VuZGFyeSh4KTsJCQkJLy8gcmV0cmlldmUgbGVmdCBib3VuZGFyeQorCQkJCQkJCQkJCWNvbnN0IHVuc2lnbmVkIGlMaW1pdCA9IHdlaWdodHNUYWJsZS5nZXRSaWdodEJvdW5kYXJ5KHgpIC0gaUxlZnQ7CS8vIHJldHJpZXZlIHJpZ2h0IGJvdW5kYXJ5CisJCQkJCQkJCQkJY29uc3QgQllURSAqIGNvbnN0IHBpeGVsID0gc3JjX2JpdHMgKyBpTGVmdDsKKwkJCQkJCQkJCQlkb3VibGUgdmFsdWUgPSAwOworCisJCQkJCQkJCQkJLy8gZm9yKGkgPSBpTGVmdCB0byBpUmlnaHQpCisJCQkJCQkJCQkJZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGlMaW1pdDsgaSsrKSB7CisJCQkJCQkJCQkJCS8vIHNjYW4gYmV0d2VlbiBib3VuZGFyaWVzCisJCQkJCQkJCQkJCS8vIGFjY3VtdWxhdGUgd2VpZ2h0ZWQgZWZmZWN0IG9mIGVhY2ggbmVpZ2hib3JpbmcgcGl4ZWwKKwkJCQkJCQkJCQkJdmFsdWUgKz0gKHdlaWdodHNUYWJsZS5nZXRXZWlnaHQoeCwgaSkgKiAoZG91YmxlKSooQllURSAqKSZzcmNfcGFsW3BpeGVsW2ldXSk7CisJCQkJCQkJCQkJfQorCisJCQkJCQkJCQkJLy8gY2xhbXAgYW5kIHBsYWNlIHJlc3VsdCBpbiBkZXN0aW5hdGlvbiBwaXhlbAorCQkJCQkJCQkJCWRzdF9iaXRzW3hdID0gKEJZVEUpQ0xBTVA8aW50PigoaW50KSh2YWx1ZSArIDAuNSksIDAsIDB4RkYpOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJLy8gd2UgZG8gbm90IGhhdmUgYSBwYWxldHRlCisJCQkJCQkJCWZvciAodW5zaWduZWQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworCQkJCQkJCQkJLy8gc2NhbGUgZWFjaCByb3cKKwkJCQkJCQkJCWNvbnN0IEJZVEUgKiBjb25zdCBzcmNfYml0cyA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShzcmMsIHkgKyBzcmNfb2Zmc2V0X3kpICsgc3JjX29mZnNldF94OworCQkJCQkJCQkJQllURSAqIGNvbnN0IGRzdF9iaXRzID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKGRzdCwgeSk7CisKKwkJCQkJCQkJCWZvciAodW5zaWduZWQgeCA9IDA7IHggPCBkc3Rfd2lkdGg7IHgrKykgeworCQkJCQkJCQkJCS8vIGxvb3AgdGhyb3VnaCByb3cKKwkJCQkJCQkJCQljb25zdCB1bnNpZ25lZCBpTGVmdCA9IHdlaWdodHNUYWJsZS5nZXRMZWZ0Qm91bmRhcnkoeCk7CQkJCS8vIHJldHJpZXZlIGxlZnQgYm91bmRhcnkKKwkJCQkJCQkJCQljb25zdCB1bnNpZ25lZCBpTGltaXQgPSB3ZWlnaHRzVGFibGUuZ2V0UmlnaHRCb3VuZGFyeSh4KSAtIGlMZWZ0OwkvLyByZXRyaWV2ZSByaWdodCBib3VuZGFyeQorCQkJCQkJCQkJCWNvbnN0IEJZVEUgKiBjb25zdCBwaXhlbCA9IHNyY19iaXRzICsgaUxlZnQ7CisJCQkJCQkJCQkJZG91YmxlIHZhbHVlID0gMDsKKworCQkJCQkJCQkJCS8vIGZvcihpID0gaUxlZnQgdG8gaVJpZ2h0KQorCQkJCQkJCQkJCWZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBpTGltaXQ7IGkrKykgeworCQkJCQkJCQkJCQkvLyBzY2FuIGJldHdlZW4gYm91bmRhcmllcworCQkJCQkJCQkJCQkvLyBhY2N1bXVsYXRlIHdlaWdodGVkIGVmZmVjdCBvZiBlYWNoIG5laWdoYm9yaW5nIHBpeGVsCisJCQkJCQkJCQkJCXZhbHVlICs9ICh3ZWlnaHRzVGFibGUuZ2V0V2VpZ2h0KHgsIGkpICogKGRvdWJsZSlwaXhlbFtpXSk7CisJCQkJCQkJCQkJfQorCisJCQkJCQkJCQkJLy8gY2xhbXAgYW5kIHBsYWNlIHJlc3VsdCBpbiBkZXN0aW5hdGlvbiBwaXhlbAorCQkJCQkJCQkJCWRzdF9iaXRzW3hdID0gKEJZVEUpQ0xBTVA8aW50PigoaW50KSh2YWx1ZSArIDAuNSksIDAsIDB4RkYpOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJYnJlYWs7CisKKwkJCQkJCWNhc2UgMjQ6CisJCQkJCQl7CisJCQkJCQkJLy8gdHJhbnNwYXJlbnRseSBjb252ZXJ0IHRoZSBub24tdHJhbnNwYXJlbnQgOC1iaXQgaW1hZ2UgdG8gMjQgYnBwCisJCQkJCQkJaWYgKHNyY19wYWwpIHsKKwkJCQkJCQkJLy8gd2UgaGF2ZSBnb3QgYSBwYWxldHRlCisJCQkJCQkJCWZvciAodW5zaWduZWQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworCQkJCQkJCQkJLy8gc2NhbGUgZWFjaCByb3cKKwkJCQkJCQkJCWNvbnN0IEJZVEUgKiBjb25zdCBzcmNfYml0cyA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShzcmMsIHkgKyBzcmNfb2Zmc2V0X3kpICsgc3JjX29mZnNldF94OworCQkJCQkJCQkJQllURSAqZHN0X2JpdHMgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZHN0LCB5KTsKKworCQkJCQkJCQkJZm9yICh1bnNpZ25lZCB4ID0gMDsgeCA8IGRzdF93aWR0aDsgeCsrKSB7CisJCQkJCQkJCQkJLy8gbG9vcCB0aHJvdWdoIHJvdworCQkJCQkJCQkJCWNvbnN0IHVuc2lnbmVkIGlMZWZ0ID0gd2VpZ2h0c1RhYmxlLmdldExlZnRCb3VuZGFyeSh4KTsJCQkJLy8gcmV0cmlldmUgbGVmdCBib3VuZGFyeQorCQkJCQkJCQkJCWNvbnN0IHVuc2lnbmVkIGlMaW1pdCA9IHdlaWdodHNUYWJsZS5nZXRSaWdodEJvdW5kYXJ5KHgpIC0gaUxlZnQ7CS8vIHJldHJpZXZlIHJpZ2h0IGJvdW5kYXJ5CisJCQkJCQkJCQkJY29uc3QgQllURSAqIGNvbnN0IHBpeGVsID0gc3JjX2JpdHMgKyBpTGVmdDsKKwkJCQkJCQkJCQlkb3VibGUgciA9IDAsIGcgPSAwLCBiID0gMDsKKworCQkJCQkJCQkJCS8vIGZvcihpID0gaUxlZnQgdG8gaVJpZ2h0KQorCQkJCQkJCQkJCWZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBpTGltaXQ7IGkrKykgeworCQkJCQkJCQkJCQkvLyBzY2FuIGJldHdlZW4gYm91bmRhcmllcworCQkJCQkJCQkJCQkvLyBhY2N1bXVsYXRlIHdlaWdodGVkIGVmZmVjdCBvZiBlYWNoIG5laWdoYm9yaW5nIHBpeGVsCisJCQkJCQkJCQkJCWNvbnN0IGRvdWJsZSB3ZWlnaHQgPSB3ZWlnaHRzVGFibGUuZ2V0V2VpZ2h0KHgsIGkpOworCQkJCQkJCQkJCQljb25zdCBCWVRFICpjb25zdCBlbnRyeSA9IChCWVRFICopJnNyY19wYWxbcGl4ZWxbaV1dOworCQkJCQkJCQkJCQlyICs9ICh3ZWlnaHQgKiAoZG91YmxlKWVudHJ5W0ZJX1JHQkFfUkVEXSk7CisJCQkJCQkJCQkJCWcgKz0gKHdlaWdodCAqIChkb3VibGUpZW50cnlbRklfUkdCQV9HUkVFTl0pOworCQkJCQkJCQkJCQliICs9ICh3ZWlnaHQgKiAoZG91YmxlKWVudHJ5W0ZJX1JHQkFfQkxVRV0pOworCQkJCQkJCQkJCX0KKworCQkJCQkJCQkJCS8vIGNsYW1wIGFuZCBwbGFjZSByZXN1bHQgaW4gZGVzdGluYXRpb24gcGl4ZWwKKwkJCQkJCQkJCQlkc3RfYml0c1tGSV9SR0JBX1JFRF0JPSAoQllURSlDTEFNUDxpbnQ+KChpbnQpKHIgKyAwLjUpLCAwLCAweEZGKTsKKwkJCQkJCQkJCQlkc3RfYml0c1tGSV9SR0JBX0dSRUVOXQk9IChCWVRFKUNMQU1QPGludD4oKGludCkoZyArIDAuNSksIDAsIDB4RkYpOworCQkJCQkJCQkJCWRzdF9iaXRzW0ZJX1JHQkFfQkxVRV0JPSAoQllURSlDTEFNUDxpbnQ+KChpbnQpKGIgKyAwLjUpLCAwLCAweEZGKTsKKwkJCQkJCQkJCQlkc3RfYml0cyArPSAzOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJLy8gd2UgZG8gbm90IGhhdmUgYSBwYWxldHRlCisJCQkJCQkJCWZvciAodW5zaWduZWQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworCQkJCQkJCQkJLy8gc2NhbGUgZWFjaCByb3cKKwkJCQkJCQkJCWNvbnN0IEJZVEUgKiBjb25zdCBzcmNfYml0cyA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShzcmMsIHkgKyBzcmNfb2Zmc2V0X3kpICsgc3JjX29mZnNldF94OworCQkJCQkJCQkJQllURSAqZHN0X2JpdHMgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZHN0LCB5KTsKKworCQkJCQkJCQkJZm9yICh1bnNpZ25lZCB4ID0gMDsgeCA8IGRzdF93aWR0aDsgeCsrKSB7CisJCQkJCQkJCQkJLy8gbG9vcCB0aHJvdWdoIHJvdworCQkJCQkJCQkJCWNvbnN0IHVuc2lnbmVkIGlMZWZ0ID0gd2VpZ2h0c1RhYmxlLmdldExlZnRCb3VuZGFyeSh4KTsJCQkJLy8gcmV0cmlldmUgbGVmdCBib3VuZGFyeQorCQkJCQkJCQkJCWNvbnN0IHVuc2lnbmVkIGlMaW1pdCA9IHdlaWdodHNUYWJsZS5nZXRSaWdodEJvdW5kYXJ5KHgpIC0gaUxlZnQ7CS8vIHJldHJpZXZlIHJpZ2h0IGJvdW5kYXJ5CisJCQkJCQkJCQkJY29uc3QgQllURSAqIGNvbnN0IHBpeGVsID0gc3JjX2JpdHMgKyBpTGVmdDsKKwkJCQkJCQkJCQlkb3VibGUgdmFsdWUgPSAwOworCisJCQkJCQkJCQkJLy8gZm9yKGkgPSBpTGVmdCB0byBpUmlnaHQpCisJCQkJCQkJCQkJZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGlMaW1pdDsgaSsrKSB7CisJCQkJCQkJCQkJCS8vIHNjYW4gYmV0d2VlbiBib3VuZGFyaWVzCisJCQkJCQkJCQkJCS8vIGFjY3VtdWxhdGUgd2VpZ2h0ZWQgZWZmZWN0IG9mIGVhY2ggbmVpZ2hib3JpbmcgcGl4ZWwKKwkJCQkJCQkJCQkJY29uc3QgZG91YmxlIHdlaWdodCA9IHdlaWdodHNUYWJsZS5nZXRXZWlnaHQoeCwgaSk7CisJCQkJCQkJCQkJCXZhbHVlICs9ICh3ZWlnaHQgKiAoZG91YmxlKXBpeGVsW2ldKTsKKwkJCQkJCQkJCQl9CisKKwkJCQkJCQkJCQkvLyBjbGFtcCBhbmQgcGxhY2UgcmVzdWx0IGluIGRlc3RpbmF0aW9uIHBpeGVsCisJCQkJCQkJCQkJY29uc3QgQllURSBidmFsID0gKEJZVEUpQ0xBTVA8aW50PigoaW50KSh2YWx1ZSArIDAuNSksIDAsIDB4RkYpOworCQkJCQkJCQkJCWRzdF9iaXRzW0ZJX1JHQkFfUkVEXQk9IGJ2YWw7CisJCQkJCQkJCQkJZHN0X2JpdHNbRklfUkdCQV9HUkVFTl0JPSBidmFsOworCQkJCQkJCQkJCWRzdF9iaXRzW0ZJX1JHQkFfQkxVRV0JPSBidmFsOworCQkJCQkJCQkJCWRzdF9iaXRzICs9IDM7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQlicmVhazsKKworCQkJCQkJY2FzZSAzMjoKKwkJCQkJCXsKKwkJCQkJCQkvLyB0cmFuc3BhcmVudGx5IGNvbnZlcnQgdGhlIHRyYW5zcGFyZW50IDgtYml0IGltYWdlIHRvIDMyIGJwcDsgCisJCQkJCQkJLy8gd2UgYWx3YXlzIGhhdmUgZ290IGEgcGFsZXR0ZSBoZXJlCisJCQkJCQkJZm9yICh1bnNpZ25lZCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisJCQkJCQkJCS8vIHNjYWxlIGVhY2ggcm93CisJCQkJCQkJCWNvbnN0IEJZVEUgKiBjb25zdCBzcmNfYml0cyA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShzcmMsIHkgKyBzcmNfb2Zmc2V0X3kpICsgc3JjX29mZnNldF94OworCQkJCQkJCQlCWVRFICpkc3RfYml0cyA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShkc3QsIHkpOworCisJCQkJCQkJCWZvciAodW5zaWduZWQgeCA9IDA7IHggPCBkc3Rfd2lkdGg7IHgrKykgeworCQkJCQkJCQkJLy8gbG9vcCB0aHJvdWdoIHJvdworCQkJCQkJCQkJY29uc3QgdW5zaWduZWQgaUxlZnQgPSB3ZWlnaHRzVGFibGUuZ2V0TGVmdEJvdW5kYXJ5KHgpOwkJCQkvLyByZXRyaWV2ZSBsZWZ0IGJvdW5kYXJ5CisJCQkJCQkJCQljb25zdCB1bnNpZ25lZCBpTGltaXQgPSB3ZWlnaHRzVGFibGUuZ2V0UmlnaHRCb3VuZGFyeSh4KSAtIGlMZWZ0OwkvLyByZXRyaWV2ZSByaWdodCBib3VuZGFyeQorCQkJCQkJCQkJY29uc3QgQllURSAqIGNvbnN0IHBpeGVsID0gc3JjX2JpdHMgKyBpTGVmdDsKKwkJCQkJCQkJCWRvdWJsZSByID0gMCwgZyA9IDAsIGIgPSAwLCBhID0gMDsKKworCQkJCQkJCQkJLy8gZm9yKGkgPSBpTGVmdCB0byBpUmlnaHQpCisJCQkJCQkJCQlmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgaUxpbWl0OyBpKyspIHsKKwkJCQkJCQkJCQkvLyBzY2FuIGJldHdlZW4gYm91bmRhcmllcworCQkJCQkJCQkJCS8vIGFjY3VtdWxhdGUgd2VpZ2h0ZWQgZWZmZWN0IG9mIGVhY2ggbmVpZ2hib3JpbmcgcGl4ZWwKKwkJCQkJCQkJCQljb25zdCBkb3VibGUgd2VpZ2h0ID0gd2VpZ2h0c1RhYmxlLmdldFdlaWdodCh4LCBpKTsKKwkJCQkJCQkJCQljb25zdCBCWVRFICogY29uc3QgZW50cnkgPSAoQllURSAqKSZzcmNfcGFsW3BpeGVsW2ldXTsKKwkJCQkJCQkJCQlyICs9ICh3ZWlnaHQgKiAoZG91YmxlKWVudHJ5W0ZJX1JHQkFfUkVEXSk7CisJCQkJCQkJCQkJZyArPSAod2VpZ2h0ICogKGRvdWJsZSllbnRyeVtGSV9SR0JBX0dSRUVOXSk7CisJCQkJCQkJCQkJYiArPSAod2VpZ2h0ICogKGRvdWJsZSllbnRyeVtGSV9SR0JBX0JMVUVdKTsKKwkJCQkJCQkJCQlhICs9ICh3ZWlnaHQgKiAoZG91YmxlKWVudHJ5W0ZJX1JHQkFfQUxQSEFdKTsKKwkJCQkJCQkJCX0KKworCQkJCQkJCQkJLy8gY2xhbXAgYW5kIHBsYWNlIHJlc3VsdCBpbiBkZXN0aW5hdGlvbiBwaXhlbAorCQkJCQkJCQkJZHN0X2JpdHNbRklfUkdCQV9SRURdCT0gKEJZVEUpQ0xBTVA8aW50PigoaW50KShyICsgMC41KSwgMCwgMHhGRik7CisJCQkJCQkJCQlkc3RfYml0c1tGSV9SR0JBX0dSRUVOXQk9IChCWVRFKUNMQU1QPGludD4oKGludCkoZyArIDAuNSksIDAsIDB4RkYpOworCQkJCQkJCQkJZHN0X2JpdHNbRklfUkdCQV9CTFVFXQk9IChCWVRFKUNMQU1QPGludD4oKGludCkoYiArIDAuNSksIDAsIDB4RkYpOworCQkJCQkJCQkJZHN0X2JpdHNbRklfUkdCQV9BTFBIQV0JPSAoQllURSlDTEFNUDxpbnQ+KChpbnQpKGEgKyAwLjUpLCAwLCAweEZGKTsKKwkJCQkJCQkJCWRzdF9iaXRzICs9IDQ7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKworCQkJCWNhc2UgMTY6CisJCQkJeworCQkJCQkvLyB0cmFuc3BhcmVudGx5IGNvbnZlcnQgdGhlIDE2LWJpdCBub24tdHJhbnNwYXJlbnQgaW1hZ2UgdG8gMjQgYnBwCisJCQkJCWlmIChJU19GT1JNQVRfUkdCNTY1KHNyYykpIHsKKwkJCQkJCS8vIGltYWdlIGhhcyA1NjUgZm9ybWF0CisJCQkJCQlmb3IgKHVuc2lnbmVkIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJCQkJCQkvLyBzY2FsZSBlYWNoIHJvdworCQkJCQkJCWNvbnN0IFdPUkQgKiBjb25zdCBzcmNfYml0cyA9IChXT1JEICopRnJlZUltYWdlX0dldFNjYW5MaW5lKHNyYywgeSArIHNyY19vZmZzZXRfeSkgKyBzcmNfb2Zmc2V0X3ggLyBzaXplb2YoV09SRCk7CisJCQkJCQkJQllURSAqZHN0X2JpdHMgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZHN0LCB5KTsKKworCQkJCQkJCWZvciAodW5zaWduZWQgeCA9IDA7IHggPCBkc3Rfd2lkdGg7IHgrKykgeworCQkJCQkJCQkvLyBsb29wIHRocm91Z2ggcm93CisJCQkJCQkJCWNvbnN0IHVuc2lnbmVkIGlMZWZ0ID0gd2VpZ2h0c1RhYmxlLmdldExlZnRCb3VuZGFyeSh4KTsJCQkJLy8gcmV0cmlldmUgbGVmdCBib3VuZGFyeQorCQkJCQkJCQljb25zdCB1bnNpZ25lZCBpTGltaXQgPSB3ZWlnaHRzVGFibGUuZ2V0UmlnaHRCb3VuZGFyeSh4KSAtIGlMZWZ0OwkvLyByZXRyaWV2ZSByaWdodCBib3VuZGFyeQorCQkJCQkJCQljb25zdCBXT1JEICpwaXhlbCA9IHNyY19iaXRzICsgaUxlZnQ7CisJCQkJCQkJCWRvdWJsZSByID0gMCwgZyA9IDAsIGIgPSAwOworCisJCQkJCQkJCS8vIGZvcihpID0gaUxlZnQgdG8gaVJpZ2h0KQorCQkJCQkJCQlmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgaUxpbWl0OyBpKyspIHsKKwkJCQkJCQkJCS8vIHNjYW4gYmV0d2VlbiBib3VuZGFyaWVzCisJCQkJCQkJCQkvLyBhY2N1bXVsYXRlIHdlaWdodGVkIGVmZmVjdCBvZiBlYWNoIG5laWdoYm9yaW5nIHBpeGVsCisJCQkJCQkJCQljb25zdCBkb3VibGUgd2VpZ2h0ID0gd2VpZ2h0c1RhYmxlLmdldFdlaWdodCh4LCBpKTsKKwkJCQkJCQkJCXIgKz0gKHdlaWdodCAqIChkb3VibGUpKCgqcGl4ZWwgJiBGSTE2XzU2NV9SRURfTUFTSykgPj4gRkkxNl81NjVfUkVEX1NISUZUKSk7CisJCQkJCQkJCQlnICs9ICh3ZWlnaHQgKiAoZG91YmxlKSgoKnBpeGVsICYgRkkxNl81NjVfR1JFRU5fTUFTSykgPj4gRkkxNl81NjVfR1JFRU5fU0hJRlQpKTsKKwkJCQkJCQkJCWIgKz0gKHdlaWdodCAqIChkb3VibGUpKCgqcGl4ZWwgJiBGSTE2XzU2NV9CTFVFX01BU0spID4+IEZJMTZfNTY1X0JMVUVfU0hJRlQpKTsKKwkJCQkJCQkJCXBpeGVsKys7CisJCQkJCQkJCX0KKworCQkJCQkJCQkvLyBjbGFtcCBhbmQgcGxhY2UgcmVzdWx0IGluIGRlc3RpbmF0aW9uIHBpeGVsCisJCQkJCQkJCWRzdF9iaXRzW0ZJX1JHQkFfUkVEXQk9IChCWVRFKUNMQU1QPGludD4oKGludCkoKChyICogMHhGRikgLyAweDFGKSArIDAuNSksIDAsIDB4RkYpOworCQkJCQkJCQlkc3RfYml0c1tGSV9SR0JBX0dSRUVOXQk9IChCWVRFKUNMQU1QPGludD4oKGludCkoKChnICogMHhGRikgLyAweDNGKSArIDAuNSksIDAsIDB4RkYpOworCQkJCQkJCQlkc3RfYml0c1tGSV9SR0JBX0JMVUVdCT0gKEJZVEUpQ0xBTVA8aW50PigoaW50KSgoKGIgKiAweEZGKSAvIDB4MUYpICsgMC41KSwgMCwgMHhGRik7CisJCQkJCQkJCWRzdF9iaXRzICs9IDM7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJLy8gaW1hZ2UgaGFzIDU1NSBmb3JtYXQKKwkJCQkJCWZvciAodW5zaWduZWQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworCQkJCQkJCS8vIHNjYWxlIGVhY2ggcm93CisJCQkJCQkJY29uc3QgV09SRCAqIGNvbnN0IHNyY19iaXRzID0gKFdPUkQgKilGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoc3JjLCB5ICsgc3JjX29mZnNldF95KSArIHNyY19vZmZzZXRfeDsKKwkJCQkJCQlCWVRFICpkc3RfYml0cyA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShkc3QsIHkpOworCisJCQkJCQkJZm9yICh1bnNpZ25lZCB4ID0gMDsgeCA8IGRzdF93aWR0aDsgeCsrKSB7CisJCQkJCQkJCS8vIGxvb3AgdGhyb3VnaCByb3cKKwkJCQkJCQkJY29uc3QgdW5zaWduZWQgaUxlZnQgPSB3ZWlnaHRzVGFibGUuZ2V0TGVmdEJvdW5kYXJ5KHgpOwkJCQkvLyByZXRyaWV2ZSBsZWZ0IGJvdW5kYXJ5CisJCQkJCQkJCWNvbnN0IHVuc2lnbmVkIGlMaW1pdCA9IHdlaWdodHNUYWJsZS5nZXRSaWdodEJvdW5kYXJ5KHgpIC0gaUxlZnQ7CS8vIHJldHJpZXZlIHJpZ2h0IGJvdW5kYXJ5CisJCQkJCQkJCWNvbnN0IFdPUkQgKnBpeGVsID0gc3JjX2JpdHMgKyBpTGVmdDsKKwkJCQkJCQkJZG91YmxlIHIgPSAwLCBnID0gMCwgYiA9IDA7CisKKwkJCQkJCQkJLy8gZm9yKGkgPSBpTGVmdCB0byBpUmlnaHQpCisJCQkJCQkJCWZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBpTGltaXQ7IGkrKykgeworCQkJCQkJCQkJLy8gc2NhbiBiZXR3ZWVuIGJvdW5kYXJpZXMKKwkJCQkJCQkJCS8vIGFjY3VtdWxhdGUgd2VpZ2h0ZWQgZWZmZWN0IG9mIGVhY2ggbmVpZ2hib3JpbmcgcGl4ZWwKKwkJCQkJCQkJCWNvbnN0IGRvdWJsZSB3ZWlnaHQgPSB3ZWlnaHRzVGFibGUuZ2V0V2VpZ2h0KHgsIGkpOworCQkJCQkJCQkJciArPSAod2VpZ2h0ICogKGRvdWJsZSkoKCpwaXhlbCAmIEZJMTZfNTU1X1JFRF9NQVNLKSA+PiBGSTE2XzU1NV9SRURfU0hJRlQpKTsKKwkJCQkJCQkJCWcgKz0gKHdlaWdodCAqIChkb3VibGUpKCgqcGl4ZWwgJiBGSTE2XzU1NV9HUkVFTl9NQVNLKSA+PiBGSTE2XzU1NV9HUkVFTl9TSElGVCkpOworCQkJCQkJCQkJYiArPSAod2VpZ2h0ICogKGRvdWJsZSkoKCpwaXhlbCAmIEZJMTZfNTU1X0JMVUVfTUFTSykgPj4gRkkxNl81NTVfQkxVRV9TSElGVCkpOworCQkJCQkJCQkJcGl4ZWwrKzsKKwkJCQkJCQkJfQorCisJCQkJCQkJCS8vIGNsYW1wIGFuZCBwbGFjZSByZXN1bHQgaW4gZGVzdGluYXRpb24gcGl4ZWwKKwkJCQkJCQkJZHN0X2JpdHNbRklfUkdCQV9SRURdCT0gKEJZVEUpQ0xBTVA8aW50PigoaW50KSgoKHIgKiAweEZGKSAvIDB4MUYpICsgMC41KSwgMCwgMHhGRik7CisJCQkJCQkJCWRzdF9iaXRzW0ZJX1JHQkFfR1JFRU5dCT0gKEJZVEUpQ0xBTVA8aW50PigoaW50KSgoKGcgKiAweEZGKSAvIDB4MUYpICsgMC41KSwgMCwgMHhGRik7CisJCQkJCQkJCWRzdF9iaXRzW0ZJX1JHQkFfQkxVRV0JPSAoQllURSlDTEFNUDxpbnQ+KChpbnQpKCgoYiAqIDB4RkYpIC8gMHgxRikgKyAwLjUpLCAwLCAweEZGKTsKKwkJCQkJCQkJZHN0X2JpdHMgKz0gMzsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCQljYXNlIDI0OgorCQkJCXsKKwkJCQkJLy8gc2NhbGUgdGhlIDI0LWJpdCBub24tdHJhbnNwYXJlbnQgaW1hZ2UgaW50byBhIDI0IGJwcCBkZXN0aW5hdGlvbiBpbWFnZQorCQkJCQlmb3IgKHVuc2lnbmVkIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJCQkJCS8vIHNjYWxlIGVhY2ggcm93CisJCQkJCQljb25zdCBCWVRFICogY29uc3Qgc3JjX2JpdHMgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoc3JjLCB5ICsgc3JjX29mZnNldF95KSArIHNyY19vZmZzZXRfeCAqIDM7CisJCQkJCQlCWVRFICpkc3RfYml0cyA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShkc3QsIHkpOworCisJCQkJCQlmb3IgKHVuc2lnbmVkIHggPSAwOyB4IDwgZHN0X3dpZHRoOyB4KyspIHsKKwkJCQkJCQkvLyBsb29wIHRocm91Z2ggcm93CisJCQkJCQkJY29uc3QgdW5zaWduZWQgaUxlZnQgPSB3ZWlnaHRzVGFibGUuZ2V0TGVmdEJvdW5kYXJ5KHgpOwkJCQkvLyByZXRyaWV2ZSBsZWZ0IGJvdW5kYXJ5CisJCQkJCQkJY29uc3QgdW5zaWduZWQgaUxpbWl0ID0gd2VpZ2h0c1RhYmxlLmdldFJpZ2h0Qm91bmRhcnkoeCkgLSBpTGVmdDsJLy8gcmV0cmlldmUgcmlnaHQgYm91bmRhcnkKKwkJCQkJCQljb25zdCBCWVRFICogcGl4ZWwgPSBzcmNfYml0cyArIGlMZWZ0ICogMzsKKwkJCQkJCQlkb3VibGUgciA9IDAsIGcgPSAwLCBiID0gMDsKKworCQkJCQkJCS8vIGZvcihpID0gaUxlZnQgdG8gaVJpZ2h0KQorCQkJCQkJCWZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBpTGltaXQ7IGkrKykgeworCQkJCQkJCQkvLyBzY2FuIGJldHdlZW4gYm91bmRhcmllcworCQkJCQkJCQkvLyBhY2N1bXVsYXRlIHdlaWdodGVkIGVmZmVjdCBvZiBlYWNoIG5laWdoYm9yaW5nIHBpeGVsCisJCQkJCQkJCWNvbnN0IGRvdWJsZSB3ZWlnaHQgPSB3ZWlnaHRzVGFibGUuZ2V0V2VpZ2h0KHgsIGkpOworCQkJCQkJCQlyICs9ICh3ZWlnaHQgKiAoZG91YmxlKXBpeGVsW0ZJX1JHQkFfUkVEXSk7CisJCQkJCQkJCWcgKz0gKHdlaWdodCAqIChkb3VibGUpcGl4ZWxbRklfUkdCQV9HUkVFTl0pOworCQkJCQkJCQliICs9ICh3ZWlnaHQgKiAoZG91YmxlKXBpeGVsW0ZJX1JHQkFfQkxVRV0pOworCQkJCQkJCQlwaXhlbCArPSAzOworCQkJCQkJCX0KKworCQkJCQkJCS8vIGNsYW1wIGFuZCBwbGFjZSByZXN1bHQgaW4gZGVzdGluYXRpb24gcGl4ZWwKKwkJCQkJCQlkc3RfYml0c1tGSV9SR0JBX1JFRF0JPSAoQllURSlDTEFNUDxpbnQ+KChpbnQpKHIgKyAwLjUpLCAwLCAweEZGKTsKKwkJCQkJCQlkc3RfYml0c1tGSV9SR0JBX0dSRUVOXQk9IChCWVRFKUNMQU1QPGludD4oKGludCkoZyArIDAuNSksIDAsIDB4RkYpOworCQkJCQkJCWRzdF9iaXRzW0ZJX1JHQkFfQkxVRV0JPSAoQllURSlDTEFNUDxpbnQ+KChpbnQpKGIgKyAwLjUpLCAwLCAweEZGKTsKKwkJCQkJCQlkc3RfYml0cyArPSAzOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCisJCQkJY2FzZSAzMjoKKwkJCQl7CisJCQkJCS8vIHNjYWxlIHRoZSAzMi1iaXQgdHJhbnNwYXJlbnQgaW1hZ2UgaW50byBhIDMyIGJwcCBkZXN0aW5hdGlvbiBpbWFnZQorCQkJCQlmb3IgKHVuc2lnbmVkIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJCQkJCS8vIHNjYWxlIGVhY2ggcm93CisJCQkJCQljb25zdCBCWVRFICogY29uc3Qgc3JjX2JpdHMgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoc3JjLCB5ICsgc3JjX29mZnNldF95KSArIHNyY19vZmZzZXRfeCAqIDQ7CisJCQkJCQlCWVRFICpkc3RfYml0cyA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShkc3QsIHkpOworCisJCQkJCQlmb3IgKHVuc2lnbmVkIHggPSAwOyB4IDwgZHN0X3dpZHRoOyB4KyspIHsKKwkJCQkJCQkvLyBsb29wIHRocm91Z2ggcm93CisJCQkJCQkJY29uc3QgdW5zaWduZWQgaUxlZnQgPSB3ZWlnaHRzVGFibGUuZ2V0TGVmdEJvdW5kYXJ5KHgpOwkJCQkvLyByZXRyaWV2ZSBsZWZ0IGJvdW5kYXJ5CisJCQkJCQkJY29uc3QgdW5zaWduZWQgaUxpbWl0ID0gd2VpZ2h0c1RhYmxlLmdldFJpZ2h0Qm91bmRhcnkoeCkgLSBpTGVmdDsJLy8gcmV0cmlldmUgcmlnaHQgYm91bmRhcnkKKwkJCQkJCQljb25zdCBCWVRFICpwaXhlbCA9IHNyY19iaXRzICsgaUxlZnQgKiA0OworCQkJCQkJCWRvdWJsZSByID0gMCwgZyA9IDAsIGIgPSAwLCBhID0gMDsKKworCQkJCQkJCS8vIGZvcihpID0gaUxlZnQgdG8gaVJpZ2h0KQorCQkJCQkJCWZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBpTGltaXQ7IGkrKykgeworCQkJCQkJCQkvLyBzY2FuIGJldHdlZW4gYm91bmRhcmllcworCQkJCQkJCQkvLyBhY2N1bXVsYXRlIHdlaWdodGVkIGVmZmVjdCBvZiBlYWNoIG5laWdoYm9yaW5nIHBpeGVsCisJCQkJCQkJCWNvbnN0IGRvdWJsZSB3ZWlnaHQgPSB3ZWlnaHRzVGFibGUuZ2V0V2VpZ2h0KHgsIGkpOworCQkJCQkJCQlyICs9ICh3ZWlnaHQgKiAoZG91YmxlKXBpeGVsW0ZJX1JHQkFfUkVEXSk7CisJCQkJCQkJCWcgKz0gKHdlaWdodCAqIChkb3VibGUpcGl4ZWxbRklfUkdCQV9HUkVFTl0pOworCQkJCQkJCQliICs9ICh3ZWlnaHQgKiAoZG91YmxlKXBpeGVsW0ZJX1JHQkFfQkxVRV0pOworCQkJCQkJCQlhICs9ICh3ZWlnaHQgKiAoZG91YmxlKXBpeGVsW0ZJX1JHQkFfQUxQSEFdKTsKKwkJCQkJCQkJcGl4ZWwgKz0gNDsKKwkJCQkJCQl9CisKKwkJCQkJCQkvLyBjbGFtcCBhbmQgcGxhY2UgcmVzdWx0IGluIGRlc3RpbmF0aW9uIHBpeGVsCisJCQkJCQkJZHN0X2JpdHNbRklfUkdCQV9SRURdCT0gKEJZVEUpQ0xBTVA8aW50PigoaW50KShyICsgMC41KSwgMCwgMHhGRik7CisJCQkJCQkJZHN0X2JpdHNbRklfUkdCQV9HUkVFTl0JPSAoQllURSlDTEFNUDxpbnQ+KChpbnQpKGcgKyAwLjUpLCAwLCAweEZGKTsKKwkJCQkJCQlkc3RfYml0c1tGSV9SR0JBX0JMVUVdCT0gKEJZVEUpQ0xBTVA8aW50PigoaW50KShiICsgMC41KSwgMCwgMHhGRik7CisJCQkJCQkJZHN0X2JpdHNbRklfUkdCQV9BTFBIQV0JPSAoQllURSlDTEFNUDxpbnQ+KChpbnQpKGEgKyAwLjUpLCAwLCAweEZGKTsKKwkJCQkJCQlkc3RfYml0cyArPSA0OworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWJyZWFrOworCisJCWNhc2UgRklUX1VJTlQxNjoKKwkJeworCQkJLy8gQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2Ygd29yZHMgcGVyIHBpeGVsICgxIGZvciAxNi1iaXQsIDMgZm9yIDQ4LWJpdCBvciA0IGZvciA2NC1iaXQpCisJCQljb25zdCB1bnNpZ25lZCB3b3Jkc3BwID0gKEZyZWVJbWFnZV9HZXRMaW5lKHNyYykgLyBzcmNfd2lkdGgpIC8gc2l6ZW9mKFdPUkQpOworCisJCQlmb3IgKHVuc2lnbmVkIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJCQkvLyBzY2FsZSBlYWNoIHJvdworCQkJCWNvbnN0IFdPUkQgKnNyY19iaXRzID0gKFdPUkQqKUZyZWVJbWFnZV9HZXRTY2FuTGluZShzcmMsIHkgKyBzcmNfb2Zmc2V0X3kpICsgc3JjX29mZnNldF94IC8gc2l6ZW9mKFdPUkQpOworCQkJCVdPUkQgKmRzdF9iaXRzID0gKFdPUkQqKUZyZWVJbWFnZV9HZXRTY2FuTGluZShkc3QsIHkpOworCisJCQkJZm9yICh1bnNpZ25lZCB4ID0gMDsgeCA8IGRzdF93aWR0aDsgeCsrKSB7CisJCQkJCS8vIGxvb3AgdGhyb3VnaCByb3cKKwkJCQkJY29uc3QgdW5zaWduZWQgaUxlZnQgPSB3ZWlnaHRzVGFibGUuZ2V0TGVmdEJvdW5kYXJ5KHgpOwkJCQkvLyByZXRyaWV2ZSBsZWZ0IGJvdW5kYXJ5CisJCQkJCWNvbnN0IHVuc2lnbmVkIGlMaW1pdCA9IHdlaWdodHNUYWJsZS5nZXRSaWdodEJvdW5kYXJ5KHgpIC0gaUxlZnQ7CS8vIHJldHJpZXZlIHJpZ2h0IGJvdW5kYXJ5CisJCQkJCWNvbnN0IFdPUkQgKnBpeGVsID0gc3JjX2JpdHMgKyBpTGVmdCAqIHdvcmRzcHA7CisJCQkJCWRvdWJsZSB2YWx1ZSA9IDA7CisKKwkJCQkJLy8gZm9yKGkgPSBpTGVmdCB0byBpUmlnaHQpCisJCQkJCWZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBpTGltaXQ7IGkrKykgeworCQkJCQkJLy8gc2NhbiBiZXR3ZWVuIGJvdW5kYXJpZXMKKwkJCQkJCS8vIGFjY3VtdWxhdGUgd2VpZ2h0ZWQgZWZmZWN0IG9mIGVhY2ggbmVpZ2hib3JpbmcgcGl4ZWwKKwkJCQkJCWNvbnN0IGRvdWJsZSB3ZWlnaHQgPSB3ZWlnaHRzVGFibGUuZ2V0V2VpZ2h0KHgsIGkpOwkJCQkJCQorCQkJCQkJdmFsdWUgKz0gKHdlaWdodCAqIChkb3VibGUpcGl4ZWxbMF0pOworCQkJCQkJcGl4ZWwrKzsKKwkJCQkJfQorCisJCQkJCS8vIGNsYW1wIGFuZCBwbGFjZSByZXN1bHQgaW4gZGVzdGluYXRpb24gcGl4ZWwKKwkJCQkJZHN0X2JpdHNbMF0gPSAoV09SRClDTEFNUDxpbnQ+KChpbnQpKHZhbHVlICsgMC41KSwgMCwgMHhGRkZGKTsKKwkJCQkJZHN0X2JpdHMgKz0gd29yZHNwcDsKKwkJCQl9CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSBGSVRfUkdCMTY6CisJCXsKKwkJCS8vIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHdvcmRzIHBlciBwaXhlbCAoMSBmb3IgMTYtYml0LCAzIGZvciA0OC1iaXQgb3IgNCBmb3IgNjQtYml0KQorCQkJY29uc3QgdW5zaWduZWQgd29yZHNwcCA9IChGcmVlSW1hZ2VfR2V0TGluZShzcmMpIC8gc3JjX3dpZHRoKSAvIHNpemVvZihXT1JEKTsKKworCQkJZm9yICh1bnNpZ25lZCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisJCQkJLy8gc2NhbGUgZWFjaCByb3cKKwkJCQljb25zdCBXT1JEICpzcmNfYml0cyA9IChXT1JEKilGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoc3JjLCB5ICsgc3JjX29mZnNldF95KSArIHNyY19vZmZzZXRfeCAvIHNpemVvZihXT1JEKTsKKwkJCQlXT1JEICpkc3RfYml0cyA9IChXT1JEKilGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZHN0LCB5KTsKKworCQkJCWZvciAodW5zaWduZWQgeCA9IDA7IHggPCBkc3Rfd2lkdGg7IHgrKykgeworCQkJCQkvLyBsb29wIHRocm91Z2ggcm93CisJCQkJCWNvbnN0IHVuc2lnbmVkIGlMZWZ0ID0gd2VpZ2h0c1RhYmxlLmdldExlZnRCb3VuZGFyeSh4KTsJCQkJLy8gcmV0cmlldmUgbGVmdCBib3VuZGFyeQorCQkJCQljb25zdCB1bnNpZ25lZCBpTGltaXQgPSB3ZWlnaHRzVGFibGUuZ2V0UmlnaHRCb3VuZGFyeSh4KSAtIGlMZWZ0OwkvLyByZXRyaWV2ZSByaWdodCBib3VuZGFyeQorCQkJCQljb25zdCBXT1JEICpwaXhlbCA9IHNyY19iaXRzICsgaUxlZnQgKiB3b3Jkc3BwOworCQkJCQlkb3VibGUgciA9IDAsIGcgPSAwLCBiID0gMDsKKworCQkJCQkvLyBmb3IoaSA9IGlMZWZ0IHRvIGlSaWdodCkKKwkJCQkJZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGlMaW1pdDsgaSsrKSB7CisJCQkJCQkvLyBzY2FuIGJldHdlZW4gYm91bmRhcmllcworCQkJCQkJLy8gYWNjdW11bGF0ZSB3ZWlnaHRlZCBlZmZlY3Qgb2YgZWFjaCBuZWlnaGJvcmluZyBwaXhlbAorCQkJCQkJY29uc3QgZG91YmxlIHdlaWdodCA9IHdlaWdodHNUYWJsZS5nZXRXZWlnaHQoeCwgaSk7CQkJCQkJCisJCQkJCQlyICs9ICh3ZWlnaHQgKiAoZG91YmxlKXBpeGVsWzBdKTsKKwkJCQkJCWcgKz0gKHdlaWdodCAqIChkb3VibGUpcGl4ZWxbMV0pOworCQkJCQkJYiArPSAod2VpZ2h0ICogKGRvdWJsZSlwaXhlbFsyXSk7CisJCQkJCQlwaXhlbCArPSB3b3Jkc3BwOworCQkJCQl9CisKKwkJCQkJLy8gY2xhbXAgYW5kIHBsYWNlIHJlc3VsdCBpbiBkZXN0aW5hdGlvbiBwaXhlbAorCQkJCQlkc3RfYml0c1swXSA9IChXT1JEKUNMQU1QPGludD4oKGludCkociArIDAuNSksIDAsIDB4RkZGRik7CisJCQkJCWRzdF9iaXRzWzFdID0gKFdPUkQpQ0xBTVA8aW50PigoaW50KShnICsgMC41KSwgMCwgMHhGRkZGKTsKKwkJCQkJZHN0X2JpdHNbMl0gPSAoV09SRClDTEFNUDxpbnQ+KChpbnQpKGIgKyAwLjUpLCAwLCAweEZGRkYpOworCQkJCQlkc3RfYml0cyArPSB3b3Jkc3BwOworCQkJCX0KKwkJCX0KKwkJfQorCQlicmVhazsKKworCQljYXNlIEZJVF9SR0JBMTY6CisJCXsKKwkJCS8vIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHdvcmRzIHBlciBwaXhlbCAoMSBmb3IgMTYtYml0LCAzIGZvciA0OC1iaXQgb3IgNCBmb3IgNjQtYml0KQorCQkJY29uc3QgdW5zaWduZWQgd29yZHNwcCA9IChGcmVlSW1hZ2VfR2V0TGluZShzcmMpIC8gc3JjX3dpZHRoKSAvIHNpemVvZihXT1JEKTsKKworCQkJZm9yICh1bnNpZ25lZCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisJCQkJLy8gc2NhbGUgZWFjaCByb3cKKwkJCQljb25zdCBXT1JEICpzcmNfYml0cyA9IChXT1JEKilGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoc3JjLCB5ICsgc3JjX29mZnNldF95KSArIHNyY19vZmZzZXRfeCAvIHNpemVvZihXT1JEKTsKKwkJCQlXT1JEICpkc3RfYml0cyA9IChXT1JEKilGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZHN0LCB5KTsKKworCQkJCWZvciAodW5zaWduZWQgeCA9IDA7IHggPCBkc3Rfd2lkdGg7IHgrKykgeworCQkJCQkvLyBsb29wIHRocm91Z2ggcm93CisJCQkJCWNvbnN0IHVuc2lnbmVkIGlMZWZ0ID0gd2VpZ2h0c1RhYmxlLmdldExlZnRCb3VuZGFyeSh4KTsJCQkJLy8gcmV0cmlldmUgbGVmdCBib3VuZGFyeQorCQkJCQljb25zdCB1bnNpZ25lZCBpTGltaXQgPSB3ZWlnaHRzVGFibGUuZ2V0UmlnaHRCb3VuZGFyeSh4KSAtIGlMZWZ0OwkvLyByZXRyaWV2ZSByaWdodCBib3VuZGFyeQorCQkJCQljb25zdCBXT1JEICpwaXhlbCA9IHNyY19iaXRzICsgaUxlZnQgKiB3b3Jkc3BwOworCQkJCQlkb3VibGUgciA9IDAsIGcgPSAwLCBiID0gMCwgYSA9IDA7CisKKwkJCQkJLy8gZm9yKGkgPSBpTGVmdCB0byBpUmlnaHQpCisJCQkJCWZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBpTGltaXQ7IGkrKykgeworCQkJCQkJLy8gc2NhbiBiZXR3ZWVuIGJvdW5kYXJpZXMKKwkJCQkJCS8vIGFjY3VtdWxhdGUgd2VpZ2h0ZWQgZWZmZWN0IG9mIGVhY2ggbmVpZ2hib3JpbmcgcGl4ZWwKKwkJCQkJCWNvbnN0IGRvdWJsZSB3ZWlnaHQgPSB3ZWlnaHRzVGFibGUuZ2V0V2VpZ2h0KHgsIGkpOwkJCQkJCQorCQkJCQkJciArPSAod2VpZ2h0ICogKGRvdWJsZSlwaXhlbFswXSk7CisJCQkJCQlnICs9ICh3ZWlnaHQgKiAoZG91YmxlKXBpeGVsWzFdKTsKKwkJCQkJCWIgKz0gKHdlaWdodCAqIChkb3VibGUpcGl4ZWxbMl0pOworCQkJCQkJYSArPSAod2VpZ2h0ICogKGRvdWJsZSlwaXhlbFszXSk7CisJCQkJCQlwaXhlbCArPSB3b3Jkc3BwOworCQkJCQl9CisKKwkJCQkJLy8gY2xhbXAgYW5kIHBsYWNlIHJlc3VsdCBpbiBkZXN0aW5hdGlvbiBwaXhlbAorCQkJCQlkc3RfYml0c1swXSA9IChXT1JEKUNMQU1QPGludD4oKGludCkociArIDAuNSksIDAsIDB4RkZGRik7CisJCQkJCWRzdF9iaXRzWzFdID0gKFdPUkQpQ0xBTVA8aW50PigoaW50KShnICsgMC41KSwgMCwgMHhGRkZGKTsKKwkJCQkJZHN0X2JpdHNbMl0gPSAoV09SRClDTEFNUDxpbnQ+KChpbnQpKGIgKyAwLjUpLCAwLCAweEZGRkYpOworCQkJCQlkc3RfYml0c1szXSA9IChXT1JEKUNMQU1QPGludD4oKGludCkoYSArIDAuNSksIDAsIDB4RkZGRik7CisJCQkJCWRzdF9iaXRzICs9IHdvcmRzcHA7CisJCQkJfQorCQkJfQorCQl9CisJCWJyZWFrOworCisJCWNhc2UgRklUX0ZMT0FUOgorCQljYXNlIEZJVF9SR0JGOgorCQljYXNlIEZJVF9SR0JBRjoKKwkJeworCQkJLy8gQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgZmxvYXRzIHBlciBwaXhlbCAoMSBmb3IgMzItYml0LCAzIGZvciA5Ni1iaXQgb3IgNCBmb3IgMTI4LWJpdCkKKwkJCWNvbnN0IHVuc2lnbmVkIGZsb2F0c3BwID0gKEZyZWVJbWFnZV9HZXRMaW5lKHNyYykgLyBzcmNfd2lkdGgpIC8gc2l6ZW9mKGZsb2F0KTsKKworCQkJZm9yKHVuc2lnbmVkIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKwkJCQkvLyBzY2FsZSBlYWNoIHJvdworCQkJCWNvbnN0IGZsb2F0ICpzcmNfYml0cyA9IChmbG9hdCopRnJlZUltYWdlX0dldFNjYW5MaW5lKHNyYywgeSArIHNyY19vZmZzZXRfeSkgKyBzcmNfb2Zmc2V0X3ggLyBzaXplb2YoZmxvYXQpOworCQkJCWZsb2F0ICpkc3RfYml0cyA9IChmbG9hdCopRnJlZUltYWdlX0dldFNjYW5MaW5lKGRzdCwgeSk7CisKKwkJCQlmb3IodW5zaWduZWQgeCA9IDA7IHggPCBkc3Rfd2lkdGg7IHgrKykgeworCQkJCQkvLyBsb29wIHRocm91Z2ggcm93CisJCQkJCWNvbnN0IHVuc2lnbmVkIGlMZWZ0ID0gd2VpZ2h0c1RhYmxlLmdldExlZnRCb3VuZGFyeSh4KTsgICAgLy8gcmV0cmlldmUgbGVmdCBib3VuZGFyeQorCQkJCQljb25zdCB1bnNpZ25lZCBpUmlnaHQgPSB3ZWlnaHRzVGFibGUuZ2V0UmlnaHRCb3VuZGFyeSh4KTsgIC8vIHJldHJpZXZlIHJpZ2h0IGJvdW5kYXJ5CisJCQkJCWRvdWJsZSB2YWx1ZVs0XSA9IHswLCAwLCAwLCAwfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNCA9IDEyOCBicHAgbWF4CisKKwkJCQkJZm9yKHVuc2lnbmVkIGkgPSBpTGVmdDsgaSA8IGlSaWdodDsgaSsrKSB7CisJCQkJCQkvLyBzY2FuIGJldHdlZW4gYm91bmRhcmllcworCQkJCQkJLy8gYWNjdW11bGF0ZSB3ZWlnaHRlZCBlZmZlY3Qgb2YgZWFjaCBuZWlnaGJvcmluZyBwaXhlbAorCQkJCQkJY29uc3QgZG91YmxlIHdlaWdodCA9IHdlaWdodHNUYWJsZS5nZXRXZWlnaHQoeCwgaS1pTGVmdCk7CisKKwkJCQkJCXVuc2lnbmVkIGluZGV4ID0gaSAqIGZsb2F0c3BwOwkvLyBwaXhlbCBpbmRleAorCQkJCQkJZm9yICh1bnNpZ25lZCBqID0gMDsgaiA8IGZsb2F0c3BwOyBqKyspIHsKKwkJCQkJCQl2YWx1ZVtqXSArPSAod2VpZ2h0ICogKGRvdWJsZSlzcmNfYml0c1tpbmRleCsrXSk7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQkvLyBwbGFjZSByZXN1bHQgaW4gZGVzdGluYXRpb24gcGl4ZWwKKwkJCQkJZm9yICh1bnNpZ25lZCBqID0gMDsgaiA8IGZsb2F0c3BwOyBqKyspIHsKKwkJCQkJCWRzdF9iaXRzW2pdID0gKGZsb2F0KXZhbHVlW2pdOworCQkJCQl9CisKKwkJCQkJZHN0X2JpdHMgKz0gZmxvYXRzcHA7CisJCQkJfQorCQkJfQorCQl9CisJCWJyZWFrOworCX0KK30KKworLy8vIFBlcmZvcm1zIHZlcnRpY2FsIGltYWdlIGZpbHRlcmluZwordm9pZCBDUmVzaXplRW5naW5lOjp2ZXJ0aWNhbEZpbHRlcihGSUJJVE1BUCAqY29uc3Qgc3JjLCB1bnNpZ25lZCB3aWR0aCwgdW5zaWduZWQgc3JjX2hlaWdodCwgdW5zaWduZWQgc3JjX29mZnNldF94LCB1bnNpZ25lZCBzcmNfb2Zmc2V0X3ksIGNvbnN0IFJHQlFVQUQgKmNvbnN0IHNyY19wYWwsIEZJQklUTUFQICpjb25zdCBkc3QsIHVuc2lnbmVkIGRzdF9oZWlnaHQpIHsKKworCS8vIGFsbG9jYXRlIGFuZCBjYWxjdWxhdGUgdGhlIGNvbnRyaWJ1dGlvbnMKKwlDV2VpZ2h0c1RhYmxlIHdlaWdodHNUYWJsZShtX3BGaWx0ZXIsIGRzdF9oZWlnaHQsIHNyY19oZWlnaHQpOworCisJLy8gc3RlcCB0aHJvdWdoIGNvbHVtbnMKKwlzd2l0Y2goRnJlZUltYWdlX0dldEltYWdlVHlwZShzcmMpKSB7CisJCWNhc2UgRklUX0JJVE1BUDoKKwkJeworCQkJY29uc3QgdW5zaWduZWQgZHN0X3BpdGNoID0gRnJlZUltYWdlX0dldFBpdGNoKGRzdCk7CisJCQlCWVRFICogY29uc3QgZHN0X2Jhc2UgPSBGcmVlSW1hZ2VfR2V0Qml0cyhkc3QpOworCisJCQlzd2l0Y2goRnJlZUltYWdlX0dldEJQUChzcmMpKSB7CisJCQkJY2FzZSAxOgorCQkJCXsKKwkJCQkJY29uc3QgdW5zaWduZWQgc3JjX3BpdGNoID0gRnJlZUltYWdlX0dldFBpdGNoKHNyYyk7CisJCQkJCWNvbnN0IEJZVEUgKiBjb25zdCBzcmNfYmFzZSA9IEZyZWVJbWFnZV9HZXRCaXRzKHNyYykgKyBzcmNfb2Zmc2V0X3kgKiBzcmNfcGl0Y2ggKyAoc3JjX29mZnNldF94ID4+IDMpOworCisJCQkJCXN3aXRjaChGcmVlSW1hZ2VfR2V0QlBQKGRzdCkpIHsKKwkJCQkJCWNhc2UgODoKKwkJCQkJCXsKKwkJCQkJCQkvLyB0cmFuc3BhcmVudGx5IGNvbnZlcnQgdGhlIDEtYml0IG5vbi10cmFuc3BhcmVudCBncmV5c2NhbGUgaW1hZ2UgdG8gOCBicHAKKwkJCQkJCQlpZiAoc3JjX3BhbCkgeworCQkJCQkJCQkvLyB3ZSBoYXZlIGdvdCBhIHBhbGV0dGUKKwkJCQkJCQkJZm9yICh1bnNpZ25lZCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQkJCQkJCS8vIHdvcmsgb24gY29sdW1uIHggaW4gZHN0CisJCQkJCQkJCQlCWVRFICpkc3RfYml0cyA9IGRzdF9iYXNlICsgeDsKKwkJCQkJCQkJCWNvbnN0IHVuc2lnbmVkIGluZGV4ID0geCA+PiAzOworCQkJCQkJCQkJY29uc3QgdW5zaWduZWQgbWFzayA9IDB4ODAgPj4gKHggJiAweDA3KTsKKworCQkJCQkJCQkJLy8gc2NhbGUgZWFjaCBjb2x1bW4KKwkJCQkJCQkJCWZvciAodW5zaWduZWQgeSA9IDA7IHkgPCBkc3RfaGVpZ2h0OyB5KyspIHsKKwkJCQkJCQkJCQkvLyBsb29wIHRocm91Z2ggY29sdW1uCisJCQkJCQkJCQkJY29uc3QgdW5zaWduZWQgaUxlZnQgPSB3ZWlnaHRzVGFibGUuZ2V0TGVmdEJvdW5kYXJ5KHkpOwkJCQkvLyByZXRyaWV2ZSBsZWZ0IGJvdW5kYXJ5CisJCQkJCQkJCQkJY29uc3QgdW5zaWduZWQgaUxpbWl0ID0gd2VpZ2h0c1RhYmxlLmdldFJpZ2h0Qm91bmRhcnkoeSkgLSBpTGVmdDsJLy8gcmV0cmlldmUgcmlnaHQgYm91bmRhcnkKKwkJCQkJCQkJCQljb25zdCBCWVRFICpzcmNfYml0cyA9IHNyY19iYXNlICsgaUxlZnQgKiBzcmNfcGl0Y2ggKyBpbmRleDsKKwkJCQkJCQkJCQlkb3VibGUgdmFsdWUgPSAwOworCisJCQkJCQkJCQkJZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGlMaW1pdDsgaSsrKSB7CisJCQkJCQkJCQkJCS8vIHNjYW4gYmV0d2VlbiBib3VuZGFyaWVzCisJCQkJCQkJCQkJCS8vIGFjY3VtdWxhdGUgd2VpZ2h0ZWQgZWZmZWN0IG9mIGVhY2ggbmVpZ2hib3JpbmcgcGl4ZWwKKwkJCQkJCQkJCQkJY29uc3QgdW5zaWduZWQgcGl4ZWwgPSAoKnNyY19iaXRzICYgbWFzaykgIT0gMDsKKwkJCQkJCQkJCQkJdmFsdWUgKz0gKHdlaWdodHNUYWJsZS5nZXRXZWlnaHQoeSwgaSkgKiAoZG91YmxlKSooQllURSAqKSZzcmNfcGFsW3BpeGVsXSk7CisJCQkJCQkJCQkJCXNyY19iaXRzICs9IHNyY19waXRjaDsKKwkJCQkJCQkJCQl9CisJCQkJCQkJCQkJdmFsdWUgKj0gMHhGRjsKKworCQkJCQkJCQkJCS8vIGNsYW1wIGFuZCBwbGFjZSByZXN1bHQgaW4gZGVzdGluYXRpb24gcGl4ZWwKKwkJCQkJCQkJCQkqZHN0X2JpdHMgPSAoQllURSlDTEFNUDxpbnQ+KChpbnQpKHZhbHVlICsgMC41KSwgMCwgMHhGRik7CisJCQkJCQkJCQkJZHN0X2JpdHMgKz0gZHN0X3BpdGNoOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJLy8gd2UgZG8gbm90IGhhdmUgYSBwYWxldHRlCisJCQkJCQkJCWZvciAodW5zaWduZWQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisJCQkJCQkJCQkvLyB3b3JrIG9uIGNvbHVtbiB4IGluIGRzdAorCQkJCQkJCQkJQllURSAqZHN0X2JpdHMgPSBkc3RfYmFzZSArIHg7CisJCQkJCQkJCQljb25zdCB1bnNpZ25lZCBpbmRleCA9IHggPj4gMzsKKwkJCQkJCQkJCWNvbnN0IHVuc2lnbmVkIG1hc2sgPSAweDgwID4+ICh4ICYgMHgwNyk7CisKKwkJCQkJCQkJCS8vIHNjYWxlIGVhY2ggY29sdW1uCisJCQkJCQkJCQlmb3IgKHVuc2lnbmVkIHkgPSAwOyB5IDwgZHN0X2hlaWdodDsgeSsrKSB7CisJCQkJCQkJCQkJLy8gbG9vcCB0aHJvdWdoIGNvbHVtbgorCQkJCQkJCQkJCWNvbnN0IHVuc2lnbmVkIGlMZWZ0ID0gd2VpZ2h0c1RhYmxlLmdldExlZnRCb3VuZGFyeSh5KTsJCQkJLy8gcmV0cmlldmUgbGVmdCBib3VuZGFyeQorCQkJCQkJCQkJCWNvbnN0IHVuc2lnbmVkIGlMaW1pdCA9IHdlaWdodHNUYWJsZS5nZXRSaWdodEJvdW5kYXJ5KHkpIC0gaUxlZnQ7CS8vIHJldHJpZXZlIHJpZ2h0IGJvdW5kYXJ5CisJCQkJCQkJCQkJY29uc3QgQllURSAqc3JjX2JpdHMgPSBzcmNfYmFzZSArIGlMZWZ0ICogc3JjX3BpdGNoICsgaW5kZXg7CisJCQkJCQkJCQkJZG91YmxlIHZhbHVlID0gMDsKKworCQkJCQkJCQkJCWZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBpTGltaXQ7IGkrKykgeworCQkJCQkJCQkJCQkvLyBzY2FuIGJldHdlZW4gYm91bmRhcmllcworCQkJCQkJCQkJCQkvLyBhY2N1bXVsYXRlIHdlaWdodGVkIGVmZmVjdCBvZiBlYWNoIG5laWdoYm9yaW5nIHBpeGVsCisJCQkJCQkJCQkJCXZhbHVlICs9ICh3ZWlnaHRzVGFibGUuZ2V0V2VpZ2h0KHksIGkpICogKGRvdWJsZSkoKCpzcmNfYml0cyAmIG1hc2spICE9IDApKTsKKwkJCQkJCQkJCQkJc3JjX2JpdHMgKz0gc3JjX3BpdGNoOworCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQl2YWx1ZSAqPSAweEZGOworCisJCQkJCQkJCQkJLy8gY2xhbXAgYW5kIHBsYWNlIHJlc3VsdCBpbiBkZXN0aW5hdGlvbiBwaXhlbAorCQkJCQkJCQkJCSpkc3RfYml0cyA9IChCWVRFKUNMQU1QPGludD4oKGludCkodmFsdWUgKyAwLjUpLCAwLCAweEZGKTsKKwkJCQkJCQkJCQlkc3RfYml0cyArPSBkc3RfcGl0Y2g7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQlicmVhazsKKworCQkJCQkJY2FzZSAyNDoKKwkJCQkJCXsKKwkJCQkJCQkvLyB0cmFuc3BhcmVudGx5IGNvbnZlcnQgdGhlIG5vbi10cmFuc3BhcmVudCAxLWJpdCBpbWFnZSB0byAyNCBicHAKKwkJCQkJCQlpZiAoc3JjX3BhbCkgeworCQkJCQkJCQkvLyB3ZSBoYXZlIGdvdCBhIHBhbGV0dGUKKwkJCQkJCQkJZm9yICh1bnNpZ25lZCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQkJCQkJCS8vIHdvcmsgb24gY29sdW1uIHggaW4gZHN0CisJCQkJCQkJCQlCWVRFICpkc3RfYml0cyA9IGRzdF9iYXNlICsgeCAqIDM7CisJCQkJCQkJCQljb25zdCB1bnNpZ25lZCBpbmRleCA9IHggPj4gMzsKKwkJCQkJCQkJCWNvbnN0IHVuc2lnbmVkIG1hc2sgPSAweDgwID4+ICh4ICYgMHgwNyk7CisKKwkJCQkJCQkJCS8vIHNjYWxlIGVhY2ggY29sdW1uCisJCQkJCQkJCQlmb3IgKHVuc2lnbmVkIHkgPSAwOyB5IDwgZHN0X2hlaWdodDsgeSsrKSB7CisJCQkJCQkJCQkJLy8gbG9vcCB0aHJvdWdoIGNvbHVtbgorCQkJCQkJCQkJCWNvbnN0IHVuc2lnbmVkIGlMZWZ0ID0gd2VpZ2h0c1RhYmxlLmdldExlZnRCb3VuZGFyeSh5KTsJCQkJLy8gcmV0cmlldmUgbGVmdCBib3VuZGFyeQorCQkJCQkJCQkJCWNvbnN0IHVuc2lnbmVkIGlMaW1pdCA9IHdlaWdodHNUYWJsZS5nZXRSaWdodEJvdW5kYXJ5KHkpIC0gaUxlZnQ7CS8vIHJldHJpZXZlIHJpZ2h0IGJvdW5kYXJ5CisJCQkJCQkJCQkJY29uc3QgQllURSAqc3JjX2JpdHMgPSBzcmNfYmFzZSArIGlMZWZ0ICogc3JjX3BpdGNoICsgaW5kZXg7CisJCQkJCQkJCQkJZG91YmxlIHIgPSAwLCBnID0gMCwgYiA9IDA7CisKKwkJCQkJCQkJCQlmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgaUxpbWl0OyBpKyspIHsKKwkJCQkJCQkJCQkJLy8gc2NhbiBiZXR3ZWVuIGJvdW5kYXJpZXMKKwkJCQkJCQkJCQkJLy8gYWNjdW11bGF0ZSB3ZWlnaHRlZCBlZmZlY3Qgb2YgZWFjaCBuZWlnaGJvcmluZyBwaXhlbAorCQkJCQkJCQkJCQljb25zdCBkb3VibGUgd2VpZ2h0ID0gd2VpZ2h0c1RhYmxlLmdldFdlaWdodCh5LCBpKTsKKwkJCQkJCQkJCQkJY29uc3QgdW5zaWduZWQgcGl4ZWwgPSAoKnNyY19iaXRzICYgbWFzaykgIT0gMDsKKwkJCQkJCQkJCQkJY29uc3QgQllURSAqIGNvbnN0IGVudHJ5ID0gKEJZVEUgKikmc3JjX3BhbFtwaXhlbF07CisJCQkJCQkJCQkJCXIgKz0gKHdlaWdodCAqIChkb3VibGUpZW50cnlbRklfUkdCQV9SRURdKTsKKwkJCQkJCQkJCQkJZyArPSAod2VpZ2h0ICogKGRvdWJsZSllbnRyeVtGSV9SR0JBX0dSRUVOXSk7CisJCQkJCQkJCQkJCWIgKz0gKHdlaWdodCAqIChkb3VibGUpZW50cnlbRklfUkdCQV9CTFVFXSk7CisJCQkJCQkJCQkJCXNyY19iaXRzICs9IHNyY19waXRjaDsKKwkJCQkJCQkJCQl9CisKKwkJCQkJCQkJCQkvLyBjbGFtcCBhbmQgcGxhY2UgcmVzdWx0IGluIGRlc3RpbmF0aW9uIHBpeGVsCisJCQkJCQkJCQkJZHN0X2JpdHNbRklfUkdCQV9SRURdCT0gKEJZVEUpQ0xBTVA8aW50PigoaW50KShyICsgMC41KSwgMCwgMHhGRik7CisJCQkJCQkJCQkJZHN0X2JpdHNbRklfUkdCQV9HUkVFTl0JPSAoQllURSlDTEFNUDxpbnQ+KChpbnQpKGcgKyAwLjUpLCAwLCAweEZGKTsKKwkJCQkJCQkJCQlkc3RfYml0c1tGSV9SR0JBX0JMVUVdCT0gKEJZVEUpQ0xBTVA8aW50PigoaW50KShiICsgMC41KSwgMCwgMHhGRik7CisJCQkJCQkJCQkJZHN0X2JpdHMgKz0gZHN0X3BpdGNoOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJLy8gd2UgZG8gbm90IGhhdmUgYSBwYWxldHRlCisJCQkJCQkJCWZvciAodW5zaWduZWQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisJCQkJCQkJCQkvLyB3b3JrIG9uIGNvbHVtbiB4IGluIGRzdAorCQkJCQkJCQkJQllURSAqZHN0X2JpdHMgPSBkc3RfYmFzZSArIHggKiAzOworCQkJCQkJCQkJY29uc3QgdW5zaWduZWQgaW5kZXggPSB4ID4+IDM7CisJCQkJCQkJCQljb25zdCB1bnNpZ25lZCBtYXNrID0gMHg4MCA+PiAoeCAmIDB4MDcpOworCisJCQkJCQkJCQkvLyBzY2FsZSBlYWNoIGNvbHVtbgorCQkJCQkJCQkJZm9yICh1bnNpZ25lZCB5ID0gMDsgeSA8IGRzdF9oZWlnaHQ7IHkrKykgeworCQkJCQkJCQkJCS8vIGxvb3AgdGhyb3VnaCBjb2x1bW4KKwkJCQkJCQkJCQljb25zdCB1bnNpZ25lZCBpTGVmdCA9IHdlaWdodHNUYWJsZS5nZXRMZWZ0Qm91bmRhcnkoeSk7CQkJCS8vIHJldHJpZXZlIGxlZnQgYm91bmRhcnkKKwkJCQkJCQkJCQljb25zdCB1bnNpZ25lZCBpTGltaXQgPSB3ZWlnaHRzVGFibGUuZ2V0UmlnaHRCb3VuZGFyeSh5KSAtIGlMZWZ0OwkvLyByZXRyaWV2ZSByaWdodCBib3VuZGFyeQorCQkJCQkJCQkJCWNvbnN0IEJZVEUgKnNyY19iaXRzID0gc3JjX2Jhc2UgKyBpTGVmdCAqIHNyY19waXRjaCArIGluZGV4OworCQkJCQkJCQkJCWRvdWJsZSB2YWx1ZSA9IDA7CisKKwkJCQkJCQkJCQlmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgaUxpbWl0OyBpKyspIHsKKwkJCQkJCQkJCQkJLy8gc2NhbiBiZXR3ZWVuIGJvdW5kYXJpZXMKKwkJCQkJCQkJCQkJLy8gYWNjdW11bGF0ZSB3ZWlnaHRlZCBlZmZlY3Qgb2YgZWFjaCBuZWlnaGJvcmluZyBwaXhlbAorCQkJCQkJCQkJCQl2YWx1ZSArPSAod2VpZ2h0c1RhYmxlLmdldFdlaWdodCh5LCBpKSAqIChkb3VibGUpKCgqc3JjX2JpdHMgJiBtYXNrKSAhPSAwKSk7CisJCQkJCQkJCQkJCXNyY19iaXRzICs9IHNyY19waXRjaDsKKwkJCQkJCQkJCQl9CisJCQkJCQkJCQkJdmFsdWUgKj0gMHhGRjsKKworCQkJCQkJCQkJCS8vIGNsYW1wIGFuZCBwbGFjZSByZXN1bHQgaW4gZGVzdGluYXRpb24gcGl4ZWwKKwkJCQkJCQkJCQljb25zdCBCWVRFIGJ2YWwgPSAoQllURSlDTEFNUDxpbnQ+KChpbnQpKHZhbHVlICsgMC41KSwgMCwgMHhGRik7CisJCQkJCQkJCQkJZHN0X2JpdHNbRklfUkdCQV9SRURdCT0gYnZhbDsKKwkJCQkJCQkJCQlkc3RfYml0c1tGSV9SR0JBX0dSRUVOXQk9IGJ2YWw7CisJCQkJCQkJCQkJZHN0X2JpdHNbRklfUkdCQV9CTFVFXQk9IGJ2YWw7CisJCQkJCQkJCQkJZHN0X2JpdHMgKz0gZHN0X3BpdGNoOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJYnJlYWs7CisKKwkJCQkJCWNhc2UgMzI6CisJCQkJCQl7CisJCQkJCQkJLy8gdHJhbnNwYXJlbnRseSBjb252ZXJ0IHRoZSB0cmFuc3BhcmVudCAxLWJpdCBpbWFnZSB0byAzMiBicHA7IAorCQkJCQkJCS8vIHdlIGFsd2F5cyBoYXZlIGdvdCBhIHBhbGV0dGUgaGVyZQorCQkJCQkJCWZvciAodW5zaWduZWQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisJCQkJCQkJCS8vIHdvcmsgb24gY29sdW1uIHggaW4gZHN0CisJCQkJCQkJCUJZVEUgKmRzdF9iaXRzID0gZHN0X2Jhc2UgKyB4ICogNDsKKwkJCQkJCQkJY29uc3QgdW5zaWduZWQgaW5kZXggPSB4ID4+IDM7CisJCQkJCQkJCWNvbnN0IHVuc2lnbmVkIG1hc2sgPSAweDgwID4+ICh4ICYgMHgwNyk7CisKKwkJCQkJCQkJLy8gc2NhbGUgZWFjaCBjb2x1bW4KKwkJCQkJCQkJZm9yICh1bnNpZ25lZCB5ID0gMDsgeSA8IGRzdF9oZWlnaHQ7IHkrKykgeworCQkJCQkJCQkJLy8gbG9vcCB0aHJvdWdoIGNvbHVtbgorCQkJCQkJCQkJY29uc3QgdW5zaWduZWQgaUxlZnQgPSB3ZWlnaHRzVGFibGUuZ2V0TGVmdEJvdW5kYXJ5KHkpOwkJCQkvLyByZXRyaWV2ZSBsZWZ0IGJvdW5kYXJ5CisJCQkJCQkJCQljb25zdCB1bnNpZ25lZCBpTGltaXQgPSB3ZWlnaHRzVGFibGUuZ2V0UmlnaHRCb3VuZGFyeSh5KSAtIGlMZWZ0OwkvLyByZXRyaWV2ZSByaWdodCBib3VuZGFyeQorCQkJCQkJCQkJY29uc3QgQllURSAqc3JjX2JpdHMgPSBzcmNfYmFzZSArIGlMZWZ0ICogc3JjX3BpdGNoICsgaW5kZXg7CisJCQkJCQkJCQlkb3VibGUgciA9IDAsIGcgPSAwLCBiID0gMCwgYSA9IDA7CisKKwkJCQkJCQkJCWZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBpTGltaXQ7IGkrKykgeworCQkJCQkJCQkJCS8vIHNjYW4gYmV0d2VlbiBib3VuZGFyaWVzCisJCQkJCQkJCQkJLy8gYWNjdW11bGF0ZSB3ZWlnaHRlZCBlZmZlY3Qgb2YgZWFjaCBuZWlnaGJvcmluZyBwaXhlbAorCQkJCQkJCQkJCWNvbnN0IGRvdWJsZSB3ZWlnaHQgPSB3ZWlnaHRzVGFibGUuZ2V0V2VpZ2h0KHksIGkpOworCQkJCQkJCQkJCWNvbnN0IHVuc2lnbmVkIHBpeGVsID0gKCpzcmNfYml0cyAmIG1hc2spICE9IDA7CisJCQkJCQkJCQkJY29uc3QgQllURSAqIGNvbnN0IGVudHJ5ID0gKEJZVEUgKikmc3JjX3BhbFtwaXhlbF07CisJCQkJCQkJCQkJciArPSAod2VpZ2h0ICogKGRvdWJsZSllbnRyeVtGSV9SR0JBX1JFRF0pOworCQkJCQkJCQkJCWcgKz0gKHdlaWdodCAqIChkb3VibGUpZW50cnlbRklfUkdCQV9HUkVFTl0pOworCQkJCQkJCQkJCWIgKz0gKHdlaWdodCAqIChkb3VibGUpZW50cnlbRklfUkdCQV9CTFVFXSk7CisJCQkJCQkJCQkJYSArPSAod2VpZ2h0ICogKGRvdWJsZSllbnRyeVtGSV9SR0JBX0FMUEhBXSk7CisJCQkJCQkJCQkJc3JjX2JpdHMgKz0gc3JjX3BpdGNoOworCQkJCQkJCQkJfQorCisJCQkJCQkJCQkvLyBjbGFtcCBhbmQgcGxhY2UgcmVzdWx0IGluIGRlc3RpbmF0aW9uIHBpeGVsCisJCQkJCQkJCQlkc3RfYml0c1tGSV9SR0JBX1JFRF0JPSAoQllURSlDTEFNUDxpbnQ+KChpbnQpKHIgKyAwLjUpLCAwLCAweEZGKTsKKwkJCQkJCQkJCWRzdF9iaXRzW0ZJX1JHQkFfR1JFRU5dCT0gKEJZVEUpQ0xBTVA8aW50PigoaW50KShnICsgMC41KSwgMCwgMHhGRik7CisJCQkJCQkJCQlkc3RfYml0c1tGSV9SR0JBX0JMVUVdCT0gKEJZVEUpQ0xBTVA8aW50PigoaW50KShiICsgMC41KSwgMCwgMHhGRik7CisJCQkJCQkJCQlkc3RfYml0c1tGSV9SR0JBX0FMUEhBXQk9IChCWVRFKUNMQU1QPGludD4oKGludCkoYSArIDAuNSksIDAsIDB4RkYpOworCQkJCQkJCQkJZHN0X2JpdHMgKz0gZHN0X3BpdGNoOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCQljYXNlIDQ6CisJCQkJeworCQkJCQljb25zdCB1bnNpZ25lZCBzcmNfcGl0Y2ggPSBGcmVlSW1hZ2VfR2V0UGl0Y2goc3JjKTsKKwkJCQkJY29uc3QgQllURSAqY29uc3Qgc3JjX2Jhc2UgPSBGcmVlSW1hZ2VfR2V0Qml0cyhzcmMpICsgc3JjX29mZnNldF95ICogc3JjX3BpdGNoICsgKHNyY19vZmZzZXRfeCA+PiAxKTsKKworCQkJCQlzd2l0Y2goRnJlZUltYWdlX0dldEJQUChkc3QpKSB7CisJCQkJCQljYXNlIDg6CisJCQkJCQl7CisJCQkJCQkJLy8gdHJhbnNwYXJlbnRseSBjb252ZXJ0IHRoZSBub24tdHJhbnNwYXJlbnQgNC1iaXQgZ3JleXNjYWxlIGltYWdlIHRvIDggYnBwOyAKKwkJCQkJCQkvLyB3ZSBhbHdheXMgaGF2ZSBnb3QgYSBwYWxldHRlIGZvciA0LWJpdCBpbWFnZXMKKwkJCQkJCQlmb3IgKHVuc2lnbmVkIHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworCQkJCQkJCQkvLyB3b3JrIG9uIGNvbHVtbiB4IGluIGRzdAorCQkJCQkJCQlCWVRFICpkc3RfYml0cyA9IGRzdF9iYXNlICsgeDsKKwkJCQkJCQkJY29uc3QgdW5zaWduZWQgaW5kZXggPSB4ID4+IDE7CisKKwkJCQkJCQkJLy8gc2NhbGUgZWFjaCBjb2x1bW4KKwkJCQkJCQkJZm9yICh1bnNpZ25lZCB5ID0gMDsgeSA8IGRzdF9oZWlnaHQ7IHkrKykgeworCQkJCQkJCQkJLy8gbG9vcCB0aHJvdWdoIGNvbHVtbgorCQkJCQkJCQkJY29uc3QgdW5zaWduZWQgaUxlZnQgPSB3ZWlnaHRzVGFibGUuZ2V0TGVmdEJvdW5kYXJ5KHkpOwkJCQkvLyByZXRyaWV2ZSBsZWZ0IGJvdW5kYXJ5CisJCQkJCQkJCQljb25zdCB1bnNpZ25lZCBpTGltaXQgPSB3ZWlnaHRzVGFibGUuZ2V0UmlnaHRCb3VuZGFyeSh5KSAtIGlMZWZ0OwkvLyByZXRyaWV2ZSByaWdodCBib3VuZGFyeQorCQkJCQkJCQkJY29uc3QgQllURSAqc3JjX2JpdHMgPSBzcmNfYmFzZSArIGlMZWZ0ICogc3JjX3BpdGNoICsgaW5kZXg7CisJCQkJCQkJCQlkb3VibGUgdmFsdWUgPSAwOworCisJCQkJCQkJCQlmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgaUxpbWl0OyBpKyspIHsKKwkJCQkJCQkJCQkvLyBzY2FuIGJldHdlZW4gYm91bmRhcmllcworCQkJCQkJCQkJCS8vIGFjY3VtdWxhdGUgd2VpZ2h0ZWQgZWZmZWN0IG9mIGVhY2ggbmVpZ2hib3JpbmcgcGl4ZWwKKwkJCQkJCQkJCQljb25zdCB1bnNpZ25lZCBwaXhlbCA9IHggJiAweDAxID8gKnNyY19iaXRzICYgMHgwRiA6ICpzcmNfYml0cyA+PiA0OworCQkJCQkJCQkJCXZhbHVlICs9ICh3ZWlnaHRzVGFibGUuZ2V0V2VpZ2h0KHksIGkpICogKGRvdWJsZSkqKEJZVEUgKikmc3JjX3BhbFtwaXhlbF0pOworCQkJCQkJCQkJCXNyY19iaXRzICs9IHNyY19waXRjaDsKKwkJCQkJCQkJCX0KKworCQkJCQkJCQkJLy8gY2xhbXAgYW5kIHBsYWNlIHJlc3VsdCBpbiBkZXN0aW5hdGlvbiBwaXhlbAorCQkJCQkJCQkJKmRzdF9iaXRzID0gKEJZVEUpQ0xBTVA8aW50PigoaW50KSh2YWx1ZSArIDAuNSksIDAsIDB4RkYpOworCQkJCQkJCQkJZHN0X2JpdHMgKz0gZHN0X3BpdGNoOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJYnJlYWs7CisKKwkJCQkJCWNhc2UgMjQ6CisJCQkJCQl7CisJCQkJCQkJLy8gdHJhbnNwYXJlbnRseSBjb252ZXJ0IHRoZSBub24tdHJhbnNwYXJlbnQgNC1iaXQgaW1hZ2UgdG8gMjQgYnBwOyAKKwkJCQkJCQkvLyB3ZSBhbHdheXMgaGF2ZSBnb3QgYSBwYWxldHRlIGZvciA0LWJpdCBpbWFnZXMKKwkJCQkJCQlmb3IgKHVuc2lnbmVkIHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworCQkJCQkJCQkvLyB3b3JrIG9uIGNvbHVtbiB4IGluIGRzdAorCQkJCQkJCQlCWVRFICpkc3RfYml0cyA9IGRzdF9iYXNlICsgeCAqIDM7CisJCQkJCQkJCWNvbnN0IHVuc2lnbmVkIGluZGV4ID0geCA+PiAxOworCisJCQkJCQkJCS8vIHNjYWxlIGVhY2ggY29sdW1uCisJCQkJCQkJCWZvciAodW5zaWduZWQgeSA9IDA7IHkgPCBkc3RfaGVpZ2h0OyB5KyspIHsKKwkJCQkJCQkJCS8vIGxvb3AgdGhyb3VnaCBjb2x1bW4KKwkJCQkJCQkJCWNvbnN0IHVuc2lnbmVkIGlMZWZ0ID0gd2VpZ2h0c1RhYmxlLmdldExlZnRCb3VuZGFyeSh5KTsJCQkJLy8gcmV0cmlldmUgbGVmdCBib3VuZGFyeQorCQkJCQkJCQkJY29uc3QgdW5zaWduZWQgaUxpbWl0ID0gd2VpZ2h0c1RhYmxlLmdldFJpZ2h0Qm91bmRhcnkoeSkgLSBpTGVmdDsJLy8gcmV0cmlldmUgcmlnaHQgYm91bmRhcnkKKwkJCQkJCQkJCWNvbnN0IEJZVEUgKnNyY19iaXRzID0gc3JjX2Jhc2UgKyBpTGVmdCAqIHNyY19waXRjaCArIGluZGV4OworCQkJCQkJCQkJZG91YmxlIHIgPSAwLCBnID0gMCwgYiA9IDA7CisKKwkJCQkJCQkJCWZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBpTGltaXQ7IGkrKykgeworCQkJCQkJCQkJCS8vIHNjYW4gYmV0d2VlbiBib3VuZGFyaWVzCisJCQkJCQkJCQkJLy8gYWNjdW11bGF0ZSB3ZWlnaHRlZCBlZmZlY3Qgb2YgZWFjaCBuZWlnaGJvcmluZyBwaXhlbAorCQkJCQkJCQkJCWNvbnN0IGRvdWJsZSB3ZWlnaHQgPSB3ZWlnaHRzVGFibGUuZ2V0V2VpZ2h0KHksIGkpOworCQkJCQkJCQkJCWNvbnN0IHVuc2lnbmVkIHBpeGVsID0geCAmIDB4MDEgPyAqc3JjX2JpdHMgJiAweDBGIDogKnNyY19iaXRzID4+IDQ7CisJCQkJCQkJCQkJY29uc3QgQllURSAqY29uc3QgZW50cnkgPSAoQllURSAqKSZzcmNfcGFsW3BpeGVsXTsKKwkJCQkJCQkJCQlyICs9ICh3ZWlnaHQgKiAoZG91YmxlKWVudHJ5W0ZJX1JHQkFfUkVEXSk7CisJCQkJCQkJCQkJZyArPSAod2VpZ2h0ICogKGRvdWJsZSllbnRyeVtGSV9SR0JBX0dSRUVOXSk7CisJCQkJCQkJCQkJYiArPSAod2VpZ2h0ICogKGRvdWJsZSllbnRyeVtGSV9SR0JBX0JMVUVdKTsKKwkJCQkJCQkJCQlzcmNfYml0cyArPSBzcmNfcGl0Y2g7CisJCQkJCQkJCQl9CisKKwkJCQkJCQkJCS8vIGNsYW1wIGFuZCBwbGFjZSByZXN1bHQgaW4gZGVzdGluYXRpb24gcGl4ZWwKKwkJCQkJCQkJCWRzdF9iaXRzW0ZJX1JHQkFfUkVEXQk9IChCWVRFKUNMQU1QPGludD4oKGludCkociArIDAuNSksIDAsIDB4RkYpOworCQkJCQkJCQkJZHN0X2JpdHNbRklfUkdCQV9HUkVFTl0JPSAoQllURSlDTEFNUDxpbnQ+KChpbnQpKGcgKyAwLjUpLCAwLCAweEZGKTsKKwkJCQkJCQkJCWRzdF9iaXRzW0ZJX1JHQkFfQkxVRV0JPSAoQllURSlDTEFNUDxpbnQ+KChpbnQpKGIgKyAwLjUpLCAwLCAweEZGKTsKKwkJCQkJCQkJCWRzdF9iaXRzICs9IGRzdF9waXRjaDsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCisJCQkJCQljYXNlIDMyOgorCQkJCQkJeworCQkJCQkJCS8vIHRyYW5zcGFyZW50bHkgY29udmVydCB0aGUgdHJhbnNwYXJlbnQgNC1iaXQgaW1hZ2UgdG8gMzIgYnBwOyAKKwkJCQkJCQkvLyB3ZSBhbHdheXMgaGF2ZSBnb3QgYSBwYWxldHRlIGZvciA0LWJpdCBpbWFnZXMKKwkJCQkJCQlmb3IgKHVuc2lnbmVkIHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworCQkJCQkJCQkvLyB3b3JrIG9uIGNvbHVtbiB4IGluIGRzdAorCQkJCQkJCQlCWVRFICpkc3RfYml0cyA9IGRzdF9iYXNlICsgeCAqIDQ7CisJCQkJCQkJCWNvbnN0IHVuc2lnbmVkIGluZGV4ID0geCA+PiAxOworCisJCQkJCQkJCS8vIHNjYWxlIGVhY2ggY29sdW1uCisJCQkJCQkJCWZvciAodW5zaWduZWQgeSA9IDA7IHkgPCBkc3RfaGVpZ2h0OyB5KyspIHsKKwkJCQkJCQkJCS8vIGxvb3AgdGhyb3VnaCBjb2x1bW4KKwkJCQkJCQkJCWNvbnN0IHVuc2lnbmVkIGlMZWZ0ID0gd2VpZ2h0c1RhYmxlLmdldExlZnRCb3VuZGFyeSh5KTsJCQkJLy8gcmV0cmlldmUgbGVmdCBib3VuZGFyeQorCQkJCQkJCQkJY29uc3QgdW5zaWduZWQgaUxpbWl0ID0gd2VpZ2h0c1RhYmxlLmdldFJpZ2h0Qm91bmRhcnkoeSkgLSBpTGVmdDsJLy8gcmV0cmlldmUgcmlnaHQgYm91bmRhcnkKKwkJCQkJCQkJCWNvbnN0IEJZVEUgKnNyY19iaXRzID0gc3JjX2Jhc2UgKyBpTGVmdCAqIHNyY19waXRjaCArIGluZGV4OworCQkJCQkJCQkJZG91YmxlIHIgPSAwLCBnID0gMCwgYiA9IDAsIGEgPSAwOworCisJCQkJCQkJCQlmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgaUxpbWl0OyBpKyspIHsKKwkJCQkJCQkJCQkvLyBzY2FuIGJldHdlZW4gYm91bmRhcmllcworCQkJCQkJCQkJCS8vIGFjY3VtdWxhdGUgd2VpZ2h0ZWQgZWZmZWN0IG9mIGVhY2ggbmVpZ2hib3JpbmcgcGl4ZWwKKwkJCQkJCQkJCQljb25zdCBkb3VibGUgd2VpZ2h0ID0gd2VpZ2h0c1RhYmxlLmdldFdlaWdodCh5LCBpKTsKKwkJCQkJCQkJCQljb25zdCB1bnNpZ25lZCBwaXhlbCA9IHggJiAweDAxID8gKnNyY19iaXRzICYgMHgwRiA6ICpzcmNfYml0cyA+PiA0OworCQkJCQkJCQkJCWNvbnN0IEJZVEUgKmNvbnN0IGVudHJ5ID0gKEJZVEUgKikmc3JjX3BhbFtwaXhlbF07CisJCQkJCQkJCQkJciArPSAod2VpZ2h0ICogKGRvdWJsZSllbnRyeVtGSV9SR0JBX1JFRF0pOworCQkJCQkJCQkJCWcgKz0gKHdlaWdodCAqIChkb3VibGUpZW50cnlbRklfUkdCQV9HUkVFTl0pOworCQkJCQkJCQkJCWIgKz0gKHdlaWdodCAqIChkb3VibGUpZW50cnlbRklfUkdCQV9CTFVFXSk7CisJCQkJCQkJCQkJYSArPSAod2VpZ2h0ICogKGRvdWJsZSllbnRyeVtGSV9SR0JBX0FMUEhBXSk7CisJCQkJCQkJCQkJc3JjX2JpdHMgKz0gc3JjX3BpdGNoOworCQkJCQkJCQkJfQorCisJCQkJCQkJCQkvLyBjbGFtcCBhbmQgcGxhY2UgcmVzdWx0IGluIGRlc3RpbmF0aW9uIHBpeGVsCisJCQkJCQkJCQlkc3RfYml0c1tGSV9SR0JBX1JFRF0JPSAoQllURSlDTEFNUDxpbnQ+KChpbnQpKHIgKyAwLjUpLCAwLCAweEZGKTsKKwkJCQkJCQkJCWRzdF9iaXRzW0ZJX1JHQkFfR1JFRU5dCT0gKEJZVEUpQ0xBTVA8aW50PigoaW50KShnICsgMC41KSwgMCwgMHhGRik7CisJCQkJCQkJCQlkc3RfYml0c1tGSV9SR0JBX0JMVUVdCT0gKEJZVEUpQ0xBTVA8aW50PigoaW50KShiICsgMC41KSwgMCwgMHhGRik7CisJCQkJCQkJCQlkc3RfYml0c1tGSV9SR0JBX0FMUEhBXQk9IChCWVRFKUNMQU1QPGludD4oKGludCkoYSArIDAuNSksIDAsIDB4RkYpOworCQkJCQkJCQkJZHN0X2JpdHMgKz0gZHN0X3BpdGNoOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCQljYXNlIDg6CisJCQkJeworCQkJCQljb25zdCB1bnNpZ25lZCBzcmNfcGl0Y2ggPSBGcmVlSW1hZ2VfR2V0UGl0Y2goc3JjKTsKKwkJCQkJY29uc3QgQllURSAqY29uc3Qgc3JjX2Jhc2UgPSBGcmVlSW1hZ2VfR2V0Qml0cyhzcmMpICsgc3JjX29mZnNldF95ICogc3JjX3BpdGNoICsgc3JjX29mZnNldF94OworCisJCQkJCXN3aXRjaChGcmVlSW1hZ2VfR2V0QlBQKGRzdCkpIHsKKwkJCQkJCWNhc2UgODoKKwkJCQkJCXsKKwkJCQkJCQkvLyBzY2FsZSB0aGUgOC1iaXQgbm9uLXRyYW5zcGFyZW50IGdyZXlzY2FsZSBpbWFnZSBpbnRvIGFuIDggYnBwIGRlc3RpbmF0aW9uIGltYWdlCisJCQkJCQkJaWYgKHNyY19wYWwpIHsKKwkJCQkJCQkJLy8gd2UgaGF2ZSBnb3QgYSBwYWxldHRlCisJCQkJCQkJCWZvciAodW5zaWduZWQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisJCQkJCQkJCQkvLyB3b3JrIG9uIGNvbHVtbiB4IGluIGRzdAorCQkJCQkJCQkJQllURSAqZHN0X2JpdHMgPSBkc3RfYmFzZSArIHg7CisKKwkJCQkJCQkJCS8vIHNjYWxlIGVhY2ggY29sdW1uCisJCQkJCQkJCQlmb3IgKHVuc2lnbmVkIHkgPSAwOyB5IDwgZHN0X2hlaWdodDsgeSsrKSB7CisJCQkJCQkJCQkJLy8gbG9vcCB0aHJvdWdoIGNvbHVtbgorCQkJCQkJCQkJCWNvbnN0IHVuc2lnbmVkIGlMZWZ0ID0gd2VpZ2h0c1RhYmxlLmdldExlZnRCb3VuZGFyeSh5KTsJCQkJLy8gcmV0cmlldmUgbGVmdCBib3VuZGFyeQorCQkJCQkJCQkJCWNvbnN0IHVuc2lnbmVkIGlMaW1pdCA9IHdlaWdodHNUYWJsZS5nZXRSaWdodEJvdW5kYXJ5KHkpIC0gaUxlZnQ7CS8vIHJldHJpZXZlIHJpZ2h0IGJvdW5kYXJ5CisJCQkJCQkJCQkJY29uc3QgQllURSAqc3JjX2JpdHMgPSBzcmNfYmFzZSArIGlMZWZ0ICogc3JjX3BpdGNoICsgeDsKKwkJCQkJCQkJCQlkb3VibGUgdmFsdWUgPSAwOworCisJCQkJCQkJCQkJZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGlMaW1pdDsgaSsrKSB7CisJCQkJCQkJCQkJCS8vIHNjYW4gYmV0d2VlbiBib3VuZGFyaWVzCisJCQkJCQkJCQkJCS8vIGFjY3VtdWxhdGUgd2VpZ2h0ZWQgZWZmZWN0IG9mIGVhY2ggbmVpZ2hib3JpbmcgcGl4ZWwKKwkJCQkJCQkJCQkJdmFsdWUgKz0gKHdlaWdodHNUYWJsZS5nZXRXZWlnaHQoeSwgaSkgKiAoZG91YmxlKSooQllURSAqKSZzcmNfcGFsWypzcmNfYml0c10pOworCQkJCQkJCQkJCQlzcmNfYml0cyArPSBzcmNfcGl0Y2g7CisJCQkJCQkJCQkJfQorCisJCQkJCQkJCQkJLy8gY2xhbXAgYW5kIHBsYWNlIHJlc3VsdCBpbiBkZXN0aW5hdGlvbiBwaXhlbAorCQkJCQkJCQkJCSpkc3RfYml0cyA9IChCWVRFKUNMQU1QPGludD4oKGludCkodmFsdWUgKyAwLjUpLCAwLCAweEZGKTsKKwkJCQkJCQkJCQlkc3RfYml0cyArPSBkc3RfcGl0Y2g7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkvLyB3ZSBkbyBub3QgaGF2ZSBhIHBhbGV0dGUKKwkJCQkJCQkJZm9yICh1bnNpZ25lZCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQkJCQkJCS8vIHdvcmsgb24gY29sdW1uIHggaW4gZHN0CisJCQkJCQkJCQlCWVRFICpkc3RfYml0cyA9IGRzdF9iYXNlICsgeDsKKworCQkJCQkJCQkJLy8gc2NhbGUgZWFjaCBjb2x1bW4KKwkJCQkJCQkJCWZvciAodW5zaWduZWQgeSA9IDA7IHkgPCBkc3RfaGVpZ2h0OyB5KyspIHsKKwkJCQkJCQkJCQkvLyBsb29wIHRocm91Z2ggY29sdW1uCisJCQkJCQkJCQkJY29uc3QgdW5zaWduZWQgaUxlZnQgPSB3ZWlnaHRzVGFibGUuZ2V0TGVmdEJvdW5kYXJ5KHkpOwkJCQkvLyByZXRyaWV2ZSBsZWZ0IGJvdW5kYXJ5CisJCQkJCQkJCQkJY29uc3QgdW5zaWduZWQgaUxpbWl0ID0gd2VpZ2h0c1RhYmxlLmdldFJpZ2h0Qm91bmRhcnkoeSkgLSBpTGVmdDsJLy8gcmV0cmlldmUgcmlnaHQgYm91bmRhcnkKKwkJCQkJCQkJCQljb25zdCBCWVRFICpzcmNfYml0cyA9IHNyY19iYXNlICsgaUxlZnQgKiBzcmNfcGl0Y2ggKyB4OworCQkJCQkJCQkJCWRvdWJsZSB2YWx1ZSA9IDA7CisKKwkJCQkJCQkJCQlmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgaUxpbWl0OyBpKyspIHsKKwkJCQkJCQkJCQkJLy8gc2NhbiBiZXR3ZWVuIGJvdW5kYXJpZXMKKwkJCQkJCQkJCQkJLy8gYWNjdW11bGF0ZSB3ZWlnaHRlZCBlZmZlY3Qgb2YgZWFjaCBuZWlnaGJvcmluZyBwaXhlbAorCQkJCQkJCQkJCQl2YWx1ZSArPSAod2VpZ2h0c1RhYmxlLmdldFdlaWdodCh5LCBpKSAqIChkb3VibGUpKnNyY19iaXRzKTsKKwkJCQkJCQkJCQkJc3JjX2JpdHMgKz0gc3JjX3BpdGNoOworCQkJCQkJCQkJCX0KKworCQkJCQkJCQkJCS8vIGNsYW1wIGFuZCBwbGFjZSByZXN1bHQgaW4gZGVzdGluYXRpb24gcGl4ZWwKKwkJCQkJCQkJCQkqZHN0X2JpdHMgPSAoQllURSlDTEFNUDxpbnQ+KChpbnQpKHZhbHVlICsgMC41KSwgMCwgMHhGRik7CisJCQkJCQkJCQkJZHN0X2JpdHMgKz0gZHN0X3BpdGNoOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJYnJlYWs7CisKKwkJCQkJCWNhc2UgMjQ6CisJCQkJCQl7CisJCQkJCQkJLy8gdHJhbnNwYXJlbnRseSBjb252ZXJ0IHRoZSBub24tdHJhbnNwYXJlbnQgOC1iaXQgaW1hZ2UgdG8gMjQgYnBwCisJCQkJCQkJaWYgKHNyY19wYWwpIHsKKwkJCQkJCQkJLy8gd2UgaGF2ZSBnb3QgYSBwYWxldHRlCisJCQkJCQkJCWZvciAodW5zaWduZWQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisJCQkJCQkJCQkvLyB3b3JrIG9uIGNvbHVtbiB4IGluIGRzdAorCQkJCQkJCQkJQllURSAqZHN0X2JpdHMgPSBkc3RfYmFzZSArIHggKiAzOworCisJCQkJCQkJCQkvLyBzY2FsZSBlYWNoIGNvbHVtbgorCQkJCQkJCQkJZm9yICh1bnNpZ25lZCB5ID0gMDsgeSA8IGRzdF9oZWlnaHQ7IHkrKykgeworCQkJCQkJCQkJCS8vIGxvb3AgdGhyb3VnaCBjb2x1bW4KKwkJCQkJCQkJCQljb25zdCB1bnNpZ25lZCBpTGVmdCA9IHdlaWdodHNUYWJsZS5nZXRMZWZ0Qm91bmRhcnkoeSk7CQkJCS8vIHJldHJpZXZlIGxlZnQgYm91bmRhcnkKKwkJCQkJCQkJCQljb25zdCB1bnNpZ25lZCBpTGltaXQgPSB3ZWlnaHRzVGFibGUuZ2V0UmlnaHRCb3VuZGFyeSh5KSAtIGlMZWZ0OwkvLyByZXRyaWV2ZSByaWdodCBib3VuZGFyeQorCQkJCQkJCQkJCWNvbnN0IEJZVEUgKnNyY19iaXRzID0gc3JjX2Jhc2UgKyBpTGVmdCAqIHNyY19waXRjaCArIHg7CisJCQkJCQkJCQkJZG91YmxlIHIgPSAwLCBnID0gMCwgYiA9IDA7CisKKwkJCQkJCQkJCQlmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgaUxpbWl0OyBpKyspIHsKKwkJCQkJCQkJCQkJLy8gc2NhbiBiZXR3ZWVuIGJvdW5kYXJpZXMKKwkJCQkJCQkJCQkJLy8gYWNjdW11bGF0ZSB3ZWlnaHRlZCBlZmZlY3Qgb2YgZWFjaCBuZWlnaGJvcmluZyBwaXhlbAorCQkJCQkJCQkJCQljb25zdCBkb3VibGUgd2VpZ2h0ID0gd2VpZ2h0c1RhYmxlLmdldFdlaWdodCh5LCBpKTsKKwkJCQkJCQkJCQkJY29uc3QgQllURSAqIGNvbnN0IGVudHJ5ID0gKEJZVEUgKikmc3JjX3BhbFsqc3JjX2JpdHNdOworCQkJCQkJCQkJCQlyICs9ICh3ZWlnaHQgKiAoZG91YmxlKWVudHJ5W0ZJX1JHQkFfUkVEXSk7CisJCQkJCQkJCQkJCWcgKz0gKHdlaWdodCAqIChkb3VibGUpZW50cnlbRklfUkdCQV9HUkVFTl0pOworCQkJCQkJCQkJCQliICs9ICh3ZWlnaHQgKiAoZG91YmxlKWVudHJ5W0ZJX1JHQkFfQkxVRV0pOworCQkJCQkJCQkJCQlzcmNfYml0cyArPSBzcmNfcGl0Y2g7CisJCQkJCQkJCQkJfQorCisJCQkJCQkJCQkJLy8gY2xhbXAgYW5kIHBsYWNlIHJlc3VsdCBpbiBkZXN0aW5hdGlvbiBwaXhlbAorCQkJCQkJCQkJCWRzdF9iaXRzW0ZJX1JHQkFfUkVEXQk9IChCWVRFKUNMQU1QPGludD4oKGludCkociArIDAuNSksIDAsIDB4RkYpOworCQkJCQkJCQkJCWRzdF9iaXRzW0ZJX1JHQkFfR1JFRU5dCT0gKEJZVEUpQ0xBTVA8aW50PigoaW50KShnICsgMC41KSwgMCwgMHhGRik7CisJCQkJCQkJCQkJZHN0X2JpdHNbRklfUkdCQV9CTFVFXQk9IChCWVRFKUNMQU1QPGludD4oKGludCkoYiArIDAuNSksIDAsIDB4RkYpOworCQkJCQkJCQkJCWRzdF9iaXRzICs9IGRzdF9waXRjaDsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCS8vIHdlIGRvIG5vdCBoYXZlIGEgcGFsZXR0ZQorCQkJCQkJCQlmb3IgKHVuc2lnbmVkIHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworCQkJCQkJCQkJLy8gd29yayBvbiBjb2x1bW4geCBpbiBkc3QKKwkJCQkJCQkJCUJZVEUgKmRzdF9iaXRzID0gZHN0X2Jhc2UgKyB4ICogMzsKKworCQkJCQkJCQkJLy8gc2NhbGUgZWFjaCBjb2x1bW4KKwkJCQkJCQkJCWZvciAodW5zaWduZWQgeSA9IDA7IHkgPCBkc3RfaGVpZ2h0OyB5KyspIHsKKwkJCQkJCQkJCQkvLyBsb29wIHRocm91Z2ggY29sdW1uCisJCQkJCQkJCQkJY29uc3QgdW5zaWduZWQgaUxlZnQgPSB3ZWlnaHRzVGFibGUuZ2V0TGVmdEJvdW5kYXJ5KHkpOwkJCQkvLyByZXRyaWV2ZSBsZWZ0IGJvdW5kYXJ5CisJCQkJCQkJCQkJY29uc3QgdW5zaWduZWQgaUxpbWl0ID0gd2VpZ2h0c1RhYmxlLmdldFJpZ2h0Qm91bmRhcnkoeSkgLSBpTGVmdDsJLy8gcmV0cmlldmUgcmlnaHQgYm91bmRhcnkKKwkJCQkJCQkJCQljb25zdCBCWVRFICpzcmNfYml0cyA9IHNyY19iYXNlICsgaUxlZnQgKiBzcmNfcGl0Y2ggKyB4OworCQkJCQkJCQkJCWRvdWJsZSB2YWx1ZSA9IDA7CisKKwkJCQkJCQkJCQlmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgaUxpbWl0OyBpKyspIHsKKwkJCQkJCQkJCQkJLy8gc2NhbiBiZXR3ZWVuIGJvdW5kYXJpZXMKKwkJCQkJCQkJCQkJLy8gYWNjdW11bGF0ZSB3ZWlnaHRlZCBlZmZlY3Qgb2YgZWFjaCBuZWlnaGJvcmluZyBwaXhlbAorCQkJCQkJCQkJCQl2YWx1ZSArPSAod2VpZ2h0c1RhYmxlLmdldFdlaWdodCh5LCBpKSAqIChkb3VibGUpKnNyY19iaXRzKTsKKwkJCQkJCQkJCQkJc3JjX2JpdHMgKz0gc3JjX3BpdGNoOworCQkJCQkJCQkJCX0KKworCQkJCQkJCQkJCS8vIGNsYW1wIGFuZCBwbGFjZSByZXN1bHQgaW4gZGVzdGluYXRpb24gcGl4ZWwKKwkJCQkJCQkJCQljb25zdCBCWVRFIGJ2YWwgPSAoQllURSlDTEFNUDxpbnQ+KChpbnQpKHZhbHVlICsgMC41KSwgMCwgMHhGRik7CisJCQkJCQkJCQkJZHN0X2JpdHNbRklfUkdCQV9SRURdCT0gYnZhbDsKKwkJCQkJCQkJCQlkc3RfYml0c1tGSV9SR0JBX0dSRUVOXQk9IGJ2YWw7CisJCQkJCQkJCQkJZHN0X2JpdHNbRklfUkdCQV9CTFVFXQk9IGJ2YWw7CisJCQkJCQkJCQkJZHN0X2JpdHMgKz0gZHN0X3BpdGNoOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJYnJlYWs7CisKKwkJCQkJCWNhc2UgMzI6CisJCQkJCQl7CisJCQkJCQkJLy8gdHJhbnNwYXJlbnRseSBjb252ZXJ0IHRoZSB0cmFuc3BhcmVudCA4LWJpdCBpbWFnZSB0byAzMiBicHA7IAorCQkJCQkJCS8vIHdlIGFsd2F5cyBoYXZlIGdvdCBhIHBhbGV0dGUgaGVyZQorCQkJCQkJCWZvciAodW5zaWduZWQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisJCQkJCQkJCS8vIHdvcmsgb24gY29sdW1uIHggaW4gZHN0CisJCQkJCQkJCUJZVEUgKmRzdF9iaXRzID0gZHN0X2Jhc2UgKyB4ICogNDsKKworCQkJCQkJCQkvLyBzY2FsZSBlYWNoIGNvbHVtbgorCQkJCQkJCQlmb3IgKHVuc2lnbmVkIHkgPSAwOyB5IDwgZHN0X2hlaWdodDsgeSsrKSB7CisJCQkJCQkJCQkvLyBsb29wIHRocm91Z2ggY29sdW1uCisJCQkJCQkJCQljb25zdCB1bnNpZ25lZCBpTGVmdCA9IHdlaWdodHNUYWJsZS5nZXRMZWZ0Qm91bmRhcnkoeSk7CQkJCS8vIHJldHJpZXZlIGxlZnQgYm91bmRhcnkKKwkJCQkJCQkJCWNvbnN0IHVuc2lnbmVkIGlMaW1pdCA9IHdlaWdodHNUYWJsZS5nZXRSaWdodEJvdW5kYXJ5KHkpIC0gaUxlZnQ7CS8vIHJldHJpZXZlIHJpZ2h0IGJvdW5kYXJ5CisJCQkJCQkJCQljb25zdCBCWVRFICpzcmNfYml0cyA9IHNyY19iYXNlICsgaUxlZnQgKiBzcmNfcGl0Y2ggKyB4OworCQkJCQkJCQkJZG91YmxlIHIgPSAwLCBnID0gMCwgYiA9IDAsIGEgPSAwOworCisJCQkJCQkJCQlmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgaUxpbWl0OyBpKyspIHsKKwkJCQkJCQkJCQkvLyBzY2FuIGJldHdlZW4gYm91bmRhcmllcworCQkJCQkJCQkJCS8vIGFjY3VtdWxhdGUgd2VpZ2h0ZWQgZWZmZWN0IG9mIGVhY2ggbmVpZ2hib3JpbmcgcGl4ZWwKKwkJCQkJCQkJCQljb25zdCBkb3VibGUgd2VpZ2h0ID0gd2VpZ2h0c1RhYmxlLmdldFdlaWdodCh5LCBpKTsKKwkJCQkJCQkJCQljb25zdCBCWVRFICogY29uc3QgZW50cnkgPSAoQllURSAqKSZzcmNfcGFsWypzcmNfYml0c107CisJCQkJCQkJCQkJciArPSAod2VpZ2h0ICogKGRvdWJsZSllbnRyeVtGSV9SR0JBX1JFRF0pOworCQkJCQkJCQkJCWcgKz0gKHdlaWdodCAqIChkb3VibGUpZW50cnlbRklfUkdCQV9HUkVFTl0pOworCQkJCQkJCQkJCWIgKz0gKHdlaWdodCAqIChkb3VibGUpZW50cnlbRklfUkdCQV9CTFVFXSk7CisJCQkJCQkJCQkJYSArPSAod2VpZ2h0ICogKGRvdWJsZSllbnRyeVtGSV9SR0JBX0FMUEhBXSk7CisJCQkJCQkJCQkJc3JjX2JpdHMgKz0gc3JjX3BpdGNoOworCQkJCQkJCQkJfQorCisJCQkJCQkJCQkvLyBjbGFtcCBhbmQgcGxhY2UgcmVzdWx0IGluIGRlc3RpbmF0aW9uIHBpeGVsCisJCQkJCQkJCQlkc3RfYml0c1tGSV9SR0JBX1JFRF0JPSAoQllURSlDTEFNUDxpbnQ+KChpbnQpKHIgKyAwLjUpLCAwLCAweEZGKTsKKwkJCQkJCQkJCWRzdF9iaXRzW0ZJX1JHQkFfR1JFRU5dCT0gKEJZVEUpQ0xBTVA8aW50PigoaW50KShnICsgMC41KSwgMCwgMHhGRik7CisJCQkJCQkJCQlkc3RfYml0c1tGSV9SR0JBX0JMVUVdCT0gKEJZVEUpQ0xBTVA8aW50PigoaW50KShiICsgMC41KSwgMCwgMHhGRik7CisJCQkJCQkJCQlkc3RfYml0c1tGSV9SR0JBX0FMUEhBXQk9IChCWVRFKUNMQU1QPGludD4oKGludCkoYSArIDAuNSksIDAsIDB4RkYpOworCQkJCQkJCQkJZHN0X2JpdHMgKz0gZHN0X3BpdGNoOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCQljYXNlIDE2OgorCQkJCXsKKwkJCQkJLy8gdHJhbnNwYXJlbnRseSBjb252ZXJ0IHRoZSAxNi1iaXQgbm9uLXRyYW5zcGFyZW50IGltYWdlIHRvIDI0IGJwcAorCQkJCQljb25zdCB1bnNpZ25lZCBzcmNfcGl0Y2ggPSBGcmVlSW1hZ2VfR2V0UGl0Y2goc3JjKSAvIHNpemVvZihXT1JEKTsKKwkJCQkJY29uc3QgV09SRCAqY29uc3Qgc3JjX2Jhc2UgPSAoV09SRCAqKUZyZWVJbWFnZV9HZXRCaXRzKHNyYykgKyBzcmNfb2Zmc2V0X3kgKiBzcmNfcGl0Y2ggKyBzcmNfb2Zmc2V0X3g7CisKKwkJCQkJaWYgKElTX0ZPUk1BVF9SR0I1NjUoc3JjKSkgeworCQkJCQkJLy8gaW1hZ2UgaGFzIDU2NSBmb3JtYXQKKwkJCQkJCWZvciAodW5zaWduZWQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisJCQkJCQkJLy8gd29yayBvbiBjb2x1bW4geCBpbiBkc3QKKwkJCQkJCQlCWVRFICpkc3RfYml0cyA9IGRzdF9iYXNlICsgeCAqIDM7CisKKwkJCQkJCQkvLyBzY2FsZSBlYWNoIGNvbHVtbgorCQkJCQkJCWZvciAodW5zaWduZWQgeSA9IDA7IHkgPCBkc3RfaGVpZ2h0OyB5KyspIHsKKwkJCQkJCQkJLy8gbG9vcCB0aHJvdWdoIGNvbHVtbgorCQkJCQkJCQljb25zdCB1bnNpZ25lZCBpTGVmdCA9IHdlaWdodHNUYWJsZS5nZXRMZWZ0Qm91bmRhcnkoeSk7CQkJCS8vIHJldHJpZXZlIGxlZnQgYm91bmRhcnkKKwkJCQkJCQkJY29uc3QgdW5zaWduZWQgaUxpbWl0ID0gd2VpZ2h0c1RhYmxlLmdldFJpZ2h0Qm91bmRhcnkoeSkgLSBpTGVmdDsJLy8gcmV0cmlldmUgcmlnaHQgYm91bmRhcnkKKwkJCQkJCQkJY29uc3QgV09SRCAqc3JjX2JpdHMgPSBzcmNfYmFzZSArIGlMZWZ0ICogc3JjX3BpdGNoICsgeDsKKwkJCQkJCQkJZG91YmxlIHIgPSAwLCBnID0gMCwgYiA9IDA7CisKKwkJCQkJCQkJZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGlMaW1pdDsgaSsrKSB7CisJCQkJCQkJCQkvLyBzY2FuIGJldHdlZW4gYm91bmRhcmllcworCQkJCQkJCQkJLy8gYWNjdW11bGF0ZSB3ZWlnaHRlZCBlZmZlY3Qgb2YgZWFjaCBuZWlnaGJvcmluZyBwaXhlbAorCQkJCQkJCQkJY29uc3QgZG91YmxlIHdlaWdodCA9IHdlaWdodHNUYWJsZS5nZXRXZWlnaHQoeSwgaSk7CisJCQkJCQkJCQlyICs9ICh3ZWlnaHQgKiAoZG91YmxlKSgoKnNyY19iaXRzICYgRkkxNl81NjVfUkVEX01BU0spID4+IEZJMTZfNTY1X1JFRF9TSElGVCkpOworCQkJCQkJCQkJZyArPSAod2VpZ2h0ICogKGRvdWJsZSkoKCpzcmNfYml0cyAmIEZJMTZfNTY1X0dSRUVOX01BU0spID4+IEZJMTZfNTY1X0dSRUVOX1NISUZUKSk7CisJCQkJCQkJCQliICs9ICh3ZWlnaHQgKiAoZG91YmxlKSgoKnNyY19iaXRzICYgRkkxNl81NjVfQkxVRV9NQVNLKSA+PiBGSTE2XzU2NV9CTFVFX1NISUZUKSk7CisJCQkJCQkJCQlzcmNfYml0cyArPSBzcmNfcGl0Y2g7CisJCQkJCQkJCX0KKworCQkJCQkJCQkvLyBjbGFtcCBhbmQgcGxhY2UgcmVzdWx0IGluIGRlc3RpbmF0aW9uIHBpeGVsCisJCQkJCQkJCWRzdF9iaXRzW0ZJX1JHQkFfUkVEXQk9IChCWVRFKUNMQU1QPGludD4oKGludCkoKChyICogMHhGRikgLyAweDFGKSArIDAuNSksIDAsIDB4RkYpOworCQkJCQkJCQlkc3RfYml0c1tGSV9SR0JBX0dSRUVOXQk9IChCWVRFKUNMQU1QPGludD4oKGludCkoKChnICogMHhGRikgLyAweDNGKSArIDAuNSksIDAsIDB4RkYpOworCQkJCQkJCQlkc3RfYml0c1tGSV9SR0JBX0JMVUVdCT0gKEJZVEUpQ0xBTVA8aW50PigoaW50KSgoKGIgKiAweEZGKSAvIDB4MUYpICsgMC41KSwgMCwgMHhGRik7CisJCQkJCQkJCWRzdF9iaXRzICs9IGRzdF9waXRjaDsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQkvLyBpbWFnZSBoYXMgNTU1IGZvcm1hdAorCQkJCQkJZm9yICh1bnNpZ25lZCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQkJCQkvLyB3b3JrIG9uIGNvbHVtbiB4IGluIGRzdAorCQkJCQkJCUJZVEUgKmRzdF9iaXRzID0gZHN0X2Jhc2UgKyB4ICogMzsKKworCQkJCQkJCS8vIHNjYWxlIGVhY2ggY29sdW1uCisJCQkJCQkJZm9yICh1bnNpZ25lZCB5ID0gMDsgeSA8IGRzdF9oZWlnaHQ7IHkrKykgeworCQkJCQkJCQkvLyBsb29wIHRocm91Z2ggY29sdW1uCisJCQkJCQkJCWNvbnN0IHVuc2lnbmVkIGlMZWZ0ID0gd2VpZ2h0c1RhYmxlLmdldExlZnRCb3VuZGFyeSh5KTsJCQkJLy8gcmV0cmlldmUgbGVmdCBib3VuZGFyeQorCQkJCQkJCQljb25zdCB1bnNpZ25lZCBpTGltaXQgPSB3ZWlnaHRzVGFibGUuZ2V0UmlnaHRCb3VuZGFyeSh5KSAtIGlMZWZ0OwkvLyByZXRyaWV2ZSByaWdodCBib3VuZGFyeQorCQkJCQkJCQljb25zdCBXT1JEICpzcmNfYml0cyA9IHNyY19iYXNlICsgaUxlZnQgKiBzcmNfcGl0Y2ggKyB4OworCQkJCQkJCQlkb3VibGUgciA9IDAsIGcgPSAwLCBiID0gMDsKKworCQkJCQkJCQlmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgaUxpbWl0OyBpKyspIHsKKwkJCQkJCQkJCS8vIHNjYW4gYmV0d2VlbiBib3VuZGFyaWVzCisJCQkJCQkJCQkvLyBhY2N1bXVsYXRlIHdlaWdodGVkIGVmZmVjdCBvZiBlYWNoIG5laWdoYm9yaW5nIHBpeGVsCisJCQkJCQkJCQljb25zdCBkb3VibGUgd2VpZ2h0ID0gd2VpZ2h0c1RhYmxlLmdldFdlaWdodCh5LCBpKTsKKwkJCQkJCQkJCXIgKz0gKHdlaWdodCAqIChkb3VibGUpKCgqc3JjX2JpdHMgJiBGSTE2XzU1NV9SRURfTUFTSykgPj4gRkkxNl81NTVfUkVEX1NISUZUKSk7CisJCQkJCQkJCQlnICs9ICh3ZWlnaHQgKiAoZG91YmxlKSgoKnNyY19iaXRzICYgRkkxNl81NTVfR1JFRU5fTUFTSykgPj4gRkkxNl81NTVfR1JFRU5fU0hJRlQpKTsKKwkJCQkJCQkJCWIgKz0gKHdlaWdodCAqIChkb3VibGUpKCgqc3JjX2JpdHMgJiBGSTE2XzU1NV9CTFVFX01BU0spID4+IEZJMTZfNTU1X0JMVUVfU0hJRlQpKTsKKwkJCQkJCQkJCXNyY19iaXRzICs9IHNyY19waXRjaDsKKwkJCQkJCQkJfQorCisJCQkJCQkJCS8vIGNsYW1wIGFuZCBwbGFjZSByZXN1bHQgaW4gZGVzdGluYXRpb24gcGl4ZWwKKwkJCQkJCQkJZHN0X2JpdHNbRklfUkdCQV9SRURdCT0gKEJZVEUpQ0xBTVA8aW50PigoaW50KSgoKHIgKiAweEZGKSAvIDB4MUYpICsgMC41KSwgMCwgMHhGRik7CisJCQkJCQkJCWRzdF9iaXRzW0ZJX1JHQkFfR1JFRU5dCT0gKEJZVEUpQ0xBTVA8aW50PigoaW50KSgoKGcgKiAweEZGKSAvIDB4MUYpICsgMC41KSwgMCwgMHhGRik7CisJCQkJCQkJCWRzdF9iaXRzW0ZJX1JHQkFfQkxVRV0JPSAoQllURSlDTEFNUDxpbnQ+KChpbnQpKCgoYiAqIDB4RkYpIC8gMHgxRikgKyAwLjUpLCAwLCAweEZGKTsKKwkJCQkJCQkJZHN0X2JpdHMgKz0gZHN0X3BpdGNoOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKworCQkJCWNhc2UgMjQ6CisJCQkJeworCQkJCQkvLyBzY2FsZSB0aGUgMjQtYml0IHRyYW5zcGFyZW50IGltYWdlIGludG8gYSAyNCBicHAgZGVzdGluYXRpb24gaW1hZ2UKKwkJCQkJY29uc3QgdW5zaWduZWQgc3JjX3BpdGNoID0gRnJlZUltYWdlX0dldFBpdGNoKHNyYyk7CisJCQkJCWNvbnN0IEJZVEUgKmNvbnN0IHNyY19iYXNlID0gRnJlZUltYWdlX0dldEJpdHMoc3JjKSArIHNyY19vZmZzZXRfeSAqIHNyY19waXRjaCArIHNyY19vZmZzZXRfeCAqIDM7CisKKwkJCQkJZm9yICh1bnNpZ25lZCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQkJCS8vIHdvcmsgb24gY29sdW1uIHggaW4gZHN0CisJCQkJCQljb25zdCB1bnNpZ25lZCBpbmRleCA9IHggKiAzOworCQkJCQkJQllURSAqZHN0X2JpdHMgPSBkc3RfYmFzZSArIGluZGV4OworCisJCQkJCQkvLyBzY2FsZSBlYWNoIGNvbHVtbgorCQkJCQkJZm9yICh1bnNpZ25lZCB5ID0gMDsgeSA8IGRzdF9oZWlnaHQ7IHkrKykgeworCQkJCQkJCS8vIGxvb3AgdGhyb3VnaCBjb2x1bW4KKwkJCQkJCQljb25zdCB1bnNpZ25lZCBpTGVmdCA9IHdlaWdodHNUYWJsZS5nZXRMZWZ0Qm91bmRhcnkoeSk7CQkJCS8vIHJldHJpZXZlIGxlZnQgYm91bmRhcnkKKwkJCQkJCQljb25zdCB1bnNpZ25lZCBpTGltaXQgPSB3ZWlnaHRzVGFibGUuZ2V0UmlnaHRCb3VuZGFyeSh5KSAtIGlMZWZ0OwkvLyByZXRyaWV2ZSByaWdodCBib3VuZGFyeQorCQkJCQkJCWNvbnN0IEJZVEUgKnNyY19iaXRzID0gc3JjX2Jhc2UgKyBpTGVmdCAqIHNyY19waXRjaCArIGluZGV4OworCQkJCQkJCWRvdWJsZSByID0gMCwgZyA9IDAsIGIgPSAwOworCisJCQkJCQkJZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGlMaW1pdDsgaSsrKSB7CisJCQkJCQkJCS8vIHNjYW4gYmV0d2VlbiBib3VuZGFyaWVzCisJCQkJCQkJCS8vIGFjY3VtdWxhdGUgd2VpZ2h0ZWQgZWZmZWN0IG9mIGVhY2ggbmVpZ2hib3JpbmcgcGl4ZWwKKwkJCQkJCQkJY29uc3QgZG91YmxlIHdlaWdodCA9IHdlaWdodHNUYWJsZS5nZXRXZWlnaHQoeSwgaSk7CisJCQkJCQkJCXIgKz0gKHdlaWdodCAqIChkb3VibGUpc3JjX2JpdHNbRklfUkdCQV9SRURdKTsKKwkJCQkJCQkJZyArPSAod2VpZ2h0ICogKGRvdWJsZSlzcmNfYml0c1tGSV9SR0JBX0dSRUVOXSk7CisJCQkJCQkJCWIgKz0gKHdlaWdodCAqIChkb3VibGUpc3JjX2JpdHNbRklfUkdCQV9CTFVFXSk7CisJCQkJCQkJCXNyY19iaXRzICs9IHNyY19waXRjaDsKKwkJCQkJCQl9CisKKwkJCQkJCQkvLyBjbGFtcCBhbmQgcGxhY2UgcmVzdWx0IGluIGRlc3RpbmF0aW9uIHBpeGVsCisJCQkJCQkJZHN0X2JpdHNbRklfUkdCQV9SRURdCT0gKEJZVEUpQ0xBTVA8aW50PigoaW50KSAociArIDAuNSksIDAsIDB4RkYpOworCQkJCQkJCWRzdF9iaXRzW0ZJX1JHQkFfR1JFRU5dCT0gKEJZVEUpQ0xBTVA8aW50PigoaW50KSAoZyArIDAuNSksIDAsIDB4RkYpOworCQkJCQkJCWRzdF9iaXRzW0ZJX1JHQkFfQkxVRV0JPSAoQllURSlDTEFNUDxpbnQ+KChpbnQpIChiICsgMC41KSwgMCwgMHhGRik7CisJCQkJCQkJZHN0X2JpdHMgKz0gZHN0X3BpdGNoOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCisJCQkJY2FzZSAzMjoKKwkJCQl7CisJCQkJCS8vIHNjYWxlIHRoZSAzMi1iaXQgdHJhbnNwYXJlbnQgaW1hZ2UgaW50byBhIDMyIGJwcCBkZXN0aW5hdGlvbiBpbWFnZQorCQkJCQljb25zdCB1bnNpZ25lZCBzcmNfcGl0Y2ggPSBGcmVlSW1hZ2VfR2V0UGl0Y2goc3JjKTsKKwkJCQkJY29uc3QgQllURSAqY29uc3Qgc3JjX2Jhc2UgPSBGcmVlSW1hZ2VfR2V0Qml0cyhzcmMpICsgc3JjX29mZnNldF95ICogc3JjX3BpdGNoICsgc3JjX29mZnNldF94ICogNDsKKworCQkJCQlmb3IgKHVuc2lnbmVkIHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworCQkJCQkJLy8gd29yayBvbiBjb2x1bW4geCBpbiBkc3QKKwkJCQkJCWNvbnN0IHVuc2lnbmVkIGluZGV4ID0geCAqIDQ7CisJCQkJCQlCWVRFICpkc3RfYml0cyA9IGRzdF9iYXNlICsgaW5kZXg7CisKKwkJCQkJCS8vIHNjYWxlIGVhY2ggY29sdW1uCisJCQkJCQlmb3IgKHVuc2lnbmVkIHkgPSAwOyB5IDwgZHN0X2hlaWdodDsgeSsrKSB7CisJCQkJCQkJLy8gbG9vcCB0aHJvdWdoIGNvbHVtbgorCQkJCQkJCWNvbnN0IHVuc2lnbmVkIGlMZWZ0ID0gd2VpZ2h0c1RhYmxlLmdldExlZnRCb3VuZGFyeSh5KTsJCQkJLy8gcmV0cmlldmUgbGVmdCBib3VuZGFyeQorCQkJCQkJCWNvbnN0IHVuc2lnbmVkIGlMaW1pdCA9IHdlaWdodHNUYWJsZS5nZXRSaWdodEJvdW5kYXJ5KHkpIC0gaUxlZnQ7CS8vIHJldHJpZXZlIHJpZ2h0IGJvdW5kYXJ5CisJCQkJCQkJY29uc3QgQllURSAqc3JjX2JpdHMgPSBzcmNfYmFzZSArIGlMZWZ0ICogc3JjX3BpdGNoICsgaW5kZXg7CisJCQkJCQkJZG91YmxlIHIgPSAwLCBnID0gMCwgYiA9IDAsIGEgPSAwOworCisJCQkJCQkJZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGlMaW1pdDsgaSsrKSB7CisJCQkJCQkJCS8vIHNjYW4gYmV0d2VlbiBib3VuZGFyaWVzCisJCQkJCQkJCS8vIGFjY3VtdWxhdGUgd2VpZ2h0ZWQgZWZmZWN0IG9mIGVhY2ggbmVpZ2hib3JpbmcgcGl4ZWwKKwkJCQkJCQkJY29uc3QgZG91YmxlIHdlaWdodCA9IHdlaWdodHNUYWJsZS5nZXRXZWlnaHQoeSwgaSk7CisJCQkJCQkJCXIgKz0gKHdlaWdodCAqIChkb3VibGUpc3JjX2JpdHNbRklfUkdCQV9SRURdKTsKKwkJCQkJCQkJZyArPSAod2VpZ2h0ICogKGRvdWJsZSlzcmNfYml0c1tGSV9SR0JBX0dSRUVOXSk7CisJCQkJCQkJCWIgKz0gKHdlaWdodCAqIChkb3VibGUpc3JjX2JpdHNbRklfUkdCQV9CTFVFXSk7CisJCQkJCQkJCWEgKz0gKHdlaWdodCAqIChkb3VibGUpc3JjX2JpdHNbRklfUkdCQV9BTFBIQV0pOworCQkJCQkJCQlzcmNfYml0cyArPSBzcmNfcGl0Y2g7CisJCQkJCQkJfQorCisJCQkJCQkJLy8gY2xhbXAgYW5kIHBsYWNlIHJlc3VsdCBpbiBkZXN0aW5hdGlvbiBwaXhlbAorCQkJCQkJCWRzdF9iaXRzW0ZJX1JHQkFfUkVEXQk9IChCWVRFKUNMQU1QPGludD4oKGludCkgKHIgKyAwLjUpLCAwLCAweEZGKTsKKwkJCQkJCQlkc3RfYml0c1tGSV9SR0JBX0dSRUVOXQk9IChCWVRFKUNMQU1QPGludD4oKGludCkgKGcgKyAwLjUpLCAwLCAweEZGKTsKKwkJCQkJCQlkc3RfYml0c1tGSV9SR0JBX0JMVUVdCT0gKEJZVEUpQ0xBTVA8aW50PigoaW50KSAoYiArIDAuNSksIDAsIDB4RkYpOworCQkJCQkJCWRzdF9iaXRzW0ZJX1JHQkFfQUxQSEFdCT0gKEJZVEUpQ0xBTVA8aW50PigoaW50KSAoYSArIDAuNSksIDAsIDB4RkYpOworCQkJCQkJCWRzdF9iaXRzICs9IGRzdF9waXRjaDsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCQljYXNlIEZJVF9VSU5UMTY6CisJCXsKKwkJCS8vIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHdvcmRzIHBlciBwaXhlbCAoMSBmb3IgMTYtYml0LCAzIGZvciA0OC1iaXQgb3IgNCBmb3IgNjQtYml0KQorCQkJY29uc3QgdW5zaWduZWQgd29yZHNwcCA9IChGcmVlSW1hZ2VfR2V0TGluZShzcmMpIC8gd2lkdGgpIC8gc2l6ZW9mKFdPUkQpOworCisJCQljb25zdCB1bnNpZ25lZCBkc3RfcGl0Y2ggPSBGcmVlSW1hZ2VfR2V0UGl0Y2goZHN0KSAvIHNpemVvZihXT1JEKTsKKwkJCVdPUkQgKmNvbnN0IGRzdF9iYXNlID0gKFdPUkQgKilGcmVlSW1hZ2VfR2V0Qml0cyhkc3QpOworCisJCQljb25zdCB1bnNpZ25lZCBzcmNfcGl0Y2ggPSBGcmVlSW1hZ2VfR2V0UGl0Y2goc3JjKSAvIHNpemVvZihXT1JEKTsKKwkJCWNvbnN0IFdPUkQgKmNvbnN0IHNyY19iYXNlID0gKFdPUkQgKilGcmVlSW1hZ2VfR2V0Qml0cyhzcmMpCSsgc3JjX29mZnNldF95ICogc3JjX3BpdGNoICsgc3JjX29mZnNldF94ICogd29yZHNwcDsKKworCQkJZm9yICh1bnNpZ25lZCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQkvLyB3b3JrIG9uIGNvbHVtbiB4IGluIGRzdAorCQkJCWNvbnN0IHVuc2lnbmVkIGluZGV4ID0geCAqIHdvcmRzcHA7CS8vIHBpeGVsIGluZGV4CisJCQkJV09SRCAqZHN0X2JpdHMgPSBkc3RfYmFzZSArIGluZGV4OworCisJCQkJLy8gc2NhbGUgZWFjaCBjb2x1bW4KKwkJCQlmb3IgKHVuc2lnbmVkIHkgPSAwOyB5IDwgZHN0X2hlaWdodDsgeSsrKSB7CisJCQkJCS8vIGxvb3AgdGhyb3VnaCBjb2x1bW4KKwkJCQkJY29uc3QgdW5zaWduZWQgaUxlZnQgPSB3ZWlnaHRzVGFibGUuZ2V0TGVmdEJvdW5kYXJ5KHkpOwkJCQkvLyByZXRyaWV2ZSBsZWZ0IGJvdW5kYXJ5CisJCQkJCWNvbnN0IHVuc2lnbmVkIGlMaW1pdCA9IHdlaWdodHNUYWJsZS5nZXRSaWdodEJvdW5kYXJ5KHkpIC0gaUxlZnQ7CS8vIHJldHJpZXZlIHJpZ2h0IGJvdW5kYXJ5CisJCQkJCWNvbnN0IFdPUkQgKnNyY19iaXRzID0gc3JjX2Jhc2UgKyBpTGVmdCAqIHNyY19waXRjaCArIGluZGV4OworCQkJCQlkb3VibGUgdmFsdWUgPSAwOworCisJCQkJCWZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBpTGltaXQ7IGkrKykgeworCQkJCQkJLy8gc2NhbiBiZXR3ZWVuIGJvdW5kYXJpZXMKKwkJCQkJCS8vIGFjY3VtdWxhdGUgd2VpZ2h0ZWQgZWZmZWN0IG9mIGVhY2ggbmVpZ2hib3JpbmcgcGl4ZWwKKwkJCQkJCWNvbnN0IGRvdWJsZSB3ZWlnaHQgPSB3ZWlnaHRzVGFibGUuZ2V0V2VpZ2h0KHksIGkpOworCQkJCQkJdmFsdWUgKz0gKHdlaWdodCAqIChkb3VibGUpc3JjX2JpdHNbMF0pOworCQkJCQkJc3JjX2JpdHMgKz0gc3JjX3BpdGNoOworCQkJCQl9CisKKwkJCQkJLy8gY2xhbXAgYW5kIHBsYWNlIHJlc3VsdCBpbiBkZXN0aW5hdGlvbiBwaXhlbAorCQkJCQlkc3RfYml0c1swXSA9IChXT1JEKUNMQU1QPGludD4oKGludCkodmFsdWUgKyAwLjUpLCAwLCAweEZGRkYpOworCisJCQkJCWRzdF9iaXRzICs9IGRzdF9waXRjaDsKKwkJCQl9CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSBGSVRfUkdCMTY6CisJCXsKKwkJCS8vIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHdvcmRzIHBlciBwaXhlbCAoMSBmb3IgMTYtYml0LCAzIGZvciA0OC1iaXQgb3IgNCBmb3IgNjQtYml0KQorCQkJY29uc3QgdW5zaWduZWQgd29yZHNwcCA9IChGcmVlSW1hZ2VfR2V0TGluZShzcmMpIC8gd2lkdGgpIC8gc2l6ZW9mKFdPUkQpOworCisJCQljb25zdCB1bnNpZ25lZCBkc3RfcGl0Y2ggPSBGcmVlSW1hZ2VfR2V0UGl0Y2goZHN0KSAvIHNpemVvZihXT1JEKTsKKwkJCVdPUkQgKmNvbnN0IGRzdF9iYXNlID0gKFdPUkQgKilGcmVlSW1hZ2VfR2V0Qml0cyhkc3QpOworCisJCQljb25zdCB1bnNpZ25lZCBzcmNfcGl0Y2ggPSBGcmVlSW1hZ2VfR2V0UGl0Y2goc3JjKSAvIHNpemVvZihXT1JEKTsKKwkJCWNvbnN0IFdPUkQgKmNvbnN0IHNyY19iYXNlID0gKFdPUkQgKilGcmVlSW1hZ2VfR2V0Qml0cyhzcmMpICsgc3JjX29mZnNldF95ICogc3JjX3BpdGNoICsgc3JjX29mZnNldF94ICogd29yZHNwcDsKKworCQkJZm9yICh1bnNpZ25lZCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQkvLyB3b3JrIG9uIGNvbHVtbiB4IGluIGRzdAorCQkJCWNvbnN0IHVuc2lnbmVkIGluZGV4ID0geCAqIHdvcmRzcHA7CS8vIHBpeGVsIGluZGV4CisJCQkJV09SRCAqZHN0X2JpdHMgPSBkc3RfYmFzZSArIGluZGV4OworCisJCQkJLy8gc2NhbGUgZWFjaCBjb2x1bW4KKwkJCQlmb3IgKHVuc2lnbmVkIHkgPSAwOyB5IDwgZHN0X2hlaWdodDsgeSsrKSB7CisJCQkJCS8vIGxvb3AgdGhyb3VnaCBjb2x1bW4KKwkJCQkJY29uc3QgdW5zaWduZWQgaUxlZnQgPSB3ZWlnaHRzVGFibGUuZ2V0TGVmdEJvdW5kYXJ5KHkpOwkJCQkvLyByZXRyaWV2ZSBsZWZ0IGJvdW5kYXJ5CisJCQkJCWNvbnN0IHVuc2lnbmVkIGlMaW1pdCA9IHdlaWdodHNUYWJsZS5nZXRSaWdodEJvdW5kYXJ5KHkpIC0gaUxlZnQ7CS8vIHJldHJpZXZlIHJpZ2h0IGJvdW5kYXJ5CisJCQkJCWNvbnN0IFdPUkQgKnNyY19iaXRzID0gc3JjX2Jhc2UgKyBpTGVmdCAqIHNyY19waXRjaCArIGluZGV4OworCQkJCQlkb3VibGUgciA9IDAsIGcgPSAwLCBiID0gMDsKKworCQkJCQlmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgaUxpbWl0OyBpKyspIHsKKwkJCQkJCS8vIHNjYW4gYmV0d2VlbiBib3VuZGFyaWVzCisJCQkJCQkvLyBhY2N1bXVsYXRlIHdlaWdodGVkIGVmZmVjdCBvZiBlYWNoIG5laWdoYm9yaW5nIHBpeGVsCisJCQkJCQljb25zdCBkb3VibGUgd2VpZ2h0ID0gd2VpZ2h0c1RhYmxlLmdldFdlaWdodCh5LCBpKTsJCQkJCQorCQkJCQkJciArPSAod2VpZ2h0ICogKGRvdWJsZSlzcmNfYml0c1swXSk7CisJCQkJCQlnICs9ICh3ZWlnaHQgKiAoZG91YmxlKXNyY19iaXRzWzFdKTsKKwkJCQkJCWIgKz0gKHdlaWdodCAqIChkb3VibGUpc3JjX2JpdHNbMl0pOworCisJCQkJCQlzcmNfYml0cyArPSBzcmNfcGl0Y2g7CisJCQkJCX0KKworCQkJCQkvLyBjbGFtcCBhbmQgcGxhY2UgcmVzdWx0IGluIGRlc3RpbmF0aW9uIHBpeGVsCisJCQkJCWRzdF9iaXRzWzBdID0gKFdPUkQpQ0xBTVA8aW50PigoaW50KShyICsgMC41KSwgMCwgMHhGRkZGKTsKKwkJCQkJZHN0X2JpdHNbMV0gPSAoV09SRClDTEFNUDxpbnQ+KChpbnQpKGcgKyAwLjUpLCAwLCAweEZGRkYpOworCQkJCQlkc3RfYml0c1syXSA9IChXT1JEKUNMQU1QPGludD4oKGludCkoYiArIDAuNSksIDAsIDB4RkZGRik7CisKKwkJCQkJZHN0X2JpdHMgKz0gZHN0X3BpdGNoOworCQkJCX0KKwkJCX0KKwkJfQorCQlicmVhazsKKworCQljYXNlIEZJVF9SR0JBMTY6CisJCXsKKwkJCS8vIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHdvcmRzIHBlciBwaXhlbCAoMSBmb3IgMTYtYml0LCAzIGZvciA0OC1iaXQgb3IgNCBmb3IgNjQtYml0KQorCQkJY29uc3QgdW5zaWduZWQgd29yZHNwcCA9IChGcmVlSW1hZ2VfR2V0TGluZShzcmMpIC8gd2lkdGgpIC8gc2l6ZW9mKFdPUkQpOworCisJCQljb25zdCB1bnNpZ25lZCBkc3RfcGl0Y2ggPSBGcmVlSW1hZ2VfR2V0UGl0Y2goZHN0KSAvIHNpemVvZihXT1JEKTsKKwkJCVdPUkQgKmNvbnN0IGRzdF9iYXNlID0gKFdPUkQgKilGcmVlSW1hZ2VfR2V0Qml0cyhkc3QpOworCisJCQljb25zdCB1bnNpZ25lZCBzcmNfcGl0Y2ggPSBGcmVlSW1hZ2VfR2V0UGl0Y2goc3JjKSAvIHNpemVvZihXT1JEKTsKKwkJCWNvbnN0IFdPUkQgKmNvbnN0IHNyY19iYXNlID0gKFdPUkQgKilGcmVlSW1hZ2VfR2V0Qml0cyhzcmMpICsgc3JjX29mZnNldF95ICogc3JjX3BpdGNoICsgc3JjX29mZnNldF94ICogd29yZHNwcDsKKworCQkJZm9yICh1bnNpZ25lZCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKwkJCQkvLyB3b3JrIG9uIGNvbHVtbiB4IGluIGRzdAorCQkJCWNvbnN0IHVuc2lnbmVkIGluZGV4ID0geCAqIHdvcmRzcHA7CS8vIHBpeGVsIGluZGV4CisJCQkJV09SRCAqZHN0X2JpdHMgPSBkc3RfYmFzZSArIGluZGV4OworCisJCQkJLy8gc2NhbGUgZWFjaCBjb2x1bW4KKwkJCQlmb3IgKHVuc2lnbmVkIHkgPSAwOyB5IDwgZHN0X2hlaWdodDsgeSsrKSB7CisJCQkJCS8vIGxvb3AgdGhyb3VnaCBjb2x1bW4KKwkJCQkJY29uc3QgdW5zaWduZWQgaUxlZnQgPSB3ZWlnaHRzVGFibGUuZ2V0TGVmdEJvdW5kYXJ5KHkpOwkJCQkvLyByZXRyaWV2ZSBsZWZ0IGJvdW5kYXJ5CisJCQkJCWNvbnN0IHVuc2lnbmVkIGlMaW1pdCA9IHdlaWdodHNUYWJsZS5nZXRSaWdodEJvdW5kYXJ5KHkpIC0gaUxlZnQ7CS8vIHJldHJpZXZlIHJpZ2h0IGJvdW5kYXJ5CisJCQkJCWNvbnN0IFdPUkQgKnNyY19iaXRzID0gc3JjX2Jhc2UgKyBpTGVmdCAqIHNyY19waXRjaCArIGluZGV4OworCQkJCQlkb3VibGUgciA9IDAsIGcgPSAwLCBiID0gMCwgYSA9IDA7CisKKwkJCQkJZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGlMaW1pdDsgaSsrKSB7CisJCQkJCQkvLyBzY2FuIGJldHdlZW4gYm91bmRhcmllcworCQkJCQkJLy8gYWNjdW11bGF0ZSB3ZWlnaHRlZCBlZmZlY3Qgb2YgZWFjaCBuZWlnaGJvcmluZyBwaXhlbAorCQkJCQkJY29uc3QgZG91YmxlIHdlaWdodCA9IHdlaWdodHNUYWJsZS5nZXRXZWlnaHQoeSwgaSk7CQkJCQkKKwkJCQkJCXIgKz0gKHdlaWdodCAqIChkb3VibGUpc3JjX2JpdHNbMF0pOworCQkJCQkJZyArPSAod2VpZ2h0ICogKGRvdWJsZSlzcmNfYml0c1sxXSk7CisJCQkJCQliICs9ICh3ZWlnaHQgKiAoZG91YmxlKXNyY19iaXRzWzJdKTsKKwkJCQkJCWEgKz0gKHdlaWdodCAqIChkb3VibGUpc3JjX2JpdHNbM10pOworCisJCQkJCQlzcmNfYml0cyArPSBzcmNfcGl0Y2g7CisJCQkJCX0KKworCQkJCQkvLyBjbGFtcCBhbmQgcGxhY2UgcmVzdWx0IGluIGRlc3RpbmF0aW9uIHBpeGVsCisJCQkJCWRzdF9iaXRzWzBdID0gKFdPUkQpQ0xBTVA8aW50PigoaW50KShyICsgMC41KSwgMCwgMHhGRkZGKTsKKwkJCQkJZHN0X2JpdHNbMV0gPSAoV09SRClDTEFNUDxpbnQ+KChpbnQpKGcgKyAwLjUpLCAwLCAweEZGRkYpOworCQkJCQlkc3RfYml0c1syXSA9IChXT1JEKUNMQU1QPGludD4oKGludCkoYiArIDAuNSksIDAsIDB4RkZGRik7CisJCQkJCWRzdF9iaXRzWzNdID0gKFdPUkQpQ0xBTVA8aW50PigoaW50KShhICsgMC41KSwgMCwgMHhGRkZGKTsKKworCQkJCQlkc3RfYml0cyArPSBkc3RfcGl0Y2g7CisJCQkJfQorCQkJfQorCQl9CisJCWJyZWFrOworCisJCWNhc2UgRklUX0ZMT0FUOgorCQljYXNlIEZJVF9SR0JGOgorCQljYXNlIEZJVF9SR0JBRjoKKwkJeworCQkJLy8gQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgZmxvYXRzIHBlciBwaXhlbCAoMSBmb3IgMzItYml0LCAzIGZvciA5Ni1iaXQgb3IgNCBmb3IgMTI4LWJpdCkKKwkJCWNvbnN0IHVuc2lnbmVkIGZsb2F0c3BwID0gKEZyZWVJbWFnZV9HZXRMaW5lKHNyYykgLyB3aWR0aCkgLyBzaXplb2YoZmxvYXQpOworCisJCQljb25zdCB1bnNpZ25lZCBkc3RfcGl0Y2ggPSBGcmVlSW1hZ2VfR2V0UGl0Y2goZHN0KSAvIHNpemVvZihmbG9hdCk7CisJCQlmbG9hdCAqY29uc3QgZHN0X2Jhc2UgPSAoZmxvYXQgKilGcmVlSW1hZ2VfR2V0Qml0cyhkc3QpOworCisJCQljb25zdCB1bnNpZ25lZCBzcmNfcGl0Y2ggPSBGcmVlSW1hZ2VfR2V0UGl0Y2goc3JjKSAvIHNpemVvZihmbG9hdCk7CisJCQljb25zdCBmbG9hdCAqY29uc3Qgc3JjX2Jhc2UgPSAoZmxvYXQgKilGcmVlSW1hZ2VfR2V0Qml0cyhzcmMpICsgc3JjX29mZnNldF95ICogc3JjX3BpdGNoICsgc3JjX29mZnNldF94ICogZmxvYXRzcHA7CisKKwkJCWZvciAodW5zaWduZWQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisJCQkJLy8gd29yayBvbiBjb2x1bW4geCBpbiBkc3QKKwkJCQljb25zdCB1bnNpZ25lZCBpbmRleCA9IHggKiBmbG9hdHNwcDsJLy8gcGl4ZWwgaW5kZXgKKwkJCQlmbG9hdCAqZHN0X2JpdHMgPSAoZmxvYXQgKilkc3RfYmFzZSArIGluZGV4OworCisJCQkJLy8gc2NhbGUgZWFjaCBjb2x1bW4KKwkJCQlmb3IgKHVuc2lnbmVkIHkgPSAwOyB5IDwgZHN0X2hlaWdodDsgeSsrKSB7CisJCQkJCS8vIGxvb3AgdGhyb3VnaCBjb2x1bW4KKwkJCQkJY29uc3QgdW5zaWduZWQgaUxlZnQgPSB3ZWlnaHRzVGFibGUuZ2V0TGVmdEJvdW5kYXJ5KHkpOyAgICAvLyByZXRyaWV2ZSBsZWZ0IGJvdW5kYXJ5CisJCQkJCWNvbnN0IHVuc2lnbmVkIGlSaWdodCA9IHdlaWdodHNUYWJsZS5nZXRSaWdodEJvdW5kYXJ5KHkpOyAgLy8gcmV0cmlldmUgcmlnaHQgYm91bmRhcnkKKwkJCQkJY29uc3QgZmxvYXQgKnNyY19iaXRzID0gc3JjX2Jhc2UgKyBpTGVmdCAqIHNyY19waXRjaCArIGluZGV4OworCQkJCQlkb3VibGUgdmFsdWVbNF0gPSB7MCwgMCwgMCwgMH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDQgPSAxMjggYnBwIG1heAorCisJCQkJCWZvciAodW5zaWduZWQgaSA9IGlMZWZ0OyBpIDwgaVJpZ2h0OyBpKyspIHsKKwkJCQkJCS8vIHNjYW4gYmV0d2VlbiBib3VuZGFyaWVzCisJCQkJCQkvLyBhY2N1bXVsYXRlIHdlaWdodGVkIGVmZmVjdCBvZiBlYWNoIG5laWdoYm9yaW5nIHBpeGVsCisJCQkJCQljb25zdCBkb3VibGUgd2VpZ2h0ID0gd2VpZ2h0c1RhYmxlLmdldFdlaWdodCh5LCBpIC0gaUxlZnQpOworCQkJCQkJZm9yICh1bnNpZ25lZCBqID0gMDsgaiA8IGZsb2F0c3BwOyBqKyspIHsKKwkJCQkJCQl2YWx1ZVtqXSArPSAod2VpZ2h0ICogKGRvdWJsZSlzcmNfYml0c1tqXSk7CisJCQkJCQl9CisJCQkJCQlzcmNfYml0cyArPSBzcmNfcGl0Y2g7CisJCQkJCX0KKworCQkJCQkvLyBwbGFjZSByZXN1bHQgaW4gZGVzdGluYXRpb24gcGl4ZWwKKwkJCQkJZm9yICh1bnNpZ25lZCBqID0gMDsgaiA8IGZsb2F0c3BwOyBqKyspIHsKKwkJCQkJCWRzdF9iaXRzW2pdID0gKGZsb2F0KXZhbHVlW2pdOworCQkJCQl9CisJCQkJCWRzdF9iaXRzICs9IGRzdF9waXRjaDsKKwkJCQl9CisJCQl9CisJCX0KKwkJYnJlYWs7CisJfQorfQpkaWZmIC0tZ2l0IGEvZmlsZXMvU291cmNlL0ZyZWVJbWFnZVRvb2xraXQvUmVzaXplLmggYi9maWxlcy9Tb3VyY2UvRnJlZUltYWdlVG9vbGtpdC9SZXNpemUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTFkNzMyCi0tLSAvZGV2L251bGwKKysrIGIvZmlsZXMvU291cmNlL0ZyZWVJbWFnZVRvb2xraXQvUmVzaXplLmgKQEAgLTAsMCArMSwxOTYgQEAKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFVwc2FtcGxpbmcgLyBkb3duc2FtcGxpbmcgY2xhc3NlcworLy8KKy8vIERlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gYnkKKy8vIC0gSGVydukgRHJvbG9uIChkcm9sb25AaW5mb25pZS5mcikKKy8vIC0gRGV0bGV2IFZlbmR0IChkZXRsZXYudmVuZHRAYnJpbGxpdC5kZSkKKy8vIC0gQ2Fyc3RlbiBLbGVpbiAoY2tsZWluMDVAdXNlcnMuc291cmNlZm9yZ2UubmV0KQorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZyZWVJbWFnZSAzCisvLworLy8gQ09WRVJFRCBDT0RFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZCisvLyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUworLy8gVEhBVCBUSEUgQ09WRVJFRCBDT0RFIElTIEZSRUUgT0YgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisvLyBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRAorLy8gQ09ERSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVAorLy8gVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GIEFOWSBORUNFU1NBUlkKKy8vIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwKKy8vIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIKKy8vIFRISVMgRElTQ0xBSU1FUi4KKy8vCisvLyBVc2UgYXQgeW91ciBvd24gcmlzayEKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2lmbmRlZiBfUkVTSVpFX0hfCisjZGVmaW5lIF9SRVNJWkVfSF8KKworI2luY2x1ZGUgIkZyZWVJbWFnZS5oIgorI2luY2x1ZGUgIlV0aWxpdGllcy5oIgorI2luY2x1ZGUgIkZpbHRlcnMuaCIgCisKKy8qKgorICBGaWx0ZXIgd2VpZ2h0cyB0YWJsZS48YnI+CisgIFRoaXMgY2xhc3Mgc3RvcmVzIGNvbnRyaWJ1dGlvbiBpbmZvcm1hdGlvbiBmb3IgYW4gZW50aXJlIGxpbmUgKHJvdyBvciBjb2x1bW4pLgorKi8KK2NsYXNzIENXZWlnaHRzVGFibGUKK3sKKy8qKgorICBTYW1wbGVkIGZpbHRlciB3ZWlnaHQgdGFibGUuPGJyPgorICBDb250cmlidXRpb24gaW5mb3JtYXRpb24gZm9yIGEgc2luZ2xlIHBpeGVsCisqLwordHlwZWRlZiBzdHJ1Y3QgeworCS8vLyBOb3JtYWxpemVkIHdlaWdodHMgb2YgbmVpZ2hib3JpbmcgcGl4ZWxzCisJZG91YmxlICpXZWlnaHRzOworCS8vLyBCb3VuZHMgb2Ygc291cmNlIHBpeGVscyB3aW5kb3cKKwl1bnNpZ25lZCBMZWZ0LCBSaWdodDsKK30gQ29udHJpYnV0aW9uOworCitwcml2YXRlOgorCS8vLyBSb3cgKG9yIGNvbHVtbikgb2YgY29udHJpYnV0aW9uIHdlaWdodHMgCisJQ29udHJpYnV0aW9uICptX1dlaWdodFRhYmxlOworCS8vLyBGaWx0ZXIgd2luZG93IHNpemUgKG9mIGFmZmVjdGluZyBzb3VyY2UgcGl4ZWxzKSAKKwl1bnNpZ25lZCBtX1dpbmRvd1NpemU7CisJLy8vIExlbmd0aCBvZiBsaW5lIChuby4gb2Ygcm93cyAvIGNvbHMpIAorCXVuc2lnbmVkIG1fTGluZUxlbmd0aDsKKworcHVibGljOgorCS8qKiAKKwlDb25zdHJ1Y3Rvcjxicj4KKwlBbGxvY2F0ZSBhbmQgY29tcHV0ZSB0aGUgd2VpZ2h0cyB0YWJsZQorCUBwYXJhbSBwRmlsdGVyIEZpbHRlciB1c2VkIGZvciB1cHNhbXBsaW5nIG9yIGRvd25zYW1wbGluZworCUBwYXJhbSB1RHN0U2l6ZSBMZW5ndGggKGluIHBpeGVscykgb2YgdGhlIGRlc3RpbmF0aW9uIGxpbmUgYnVmZmVyCisJQHBhcmFtIHVTcmNTaXplIExlbmd0aCAoaW4gcGl4ZWxzKSBvZiB0aGUgc291cmNlIGxpbmUgYnVmZmVyCisJKi8KKwlDV2VpZ2h0c1RhYmxlKENHZW5lcmljRmlsdGVyICpwRmlsdGVyLCB1bnNpZ25lZCB1RHN0U2l6ZSwgdW5zaWduZWQgdVNyY1NpemUpOworCisJLyoqCisJRGVzdHJ1Y3Rvcjxicj4KKwlEZXN0cm95IHRoZSB3ZWlnaHRzIHRhYmxlCisJKi8KKwl+Q1dlaWdodHNUYWJsZSgpOworCisJLyoqIFJldHJpZXZlIGEgZmlsdGVyIHdlaWdodCwgZ2l2ZW4gc291cmNlIGFuZCBkZXN0aW5hdGlvbiBwb3NpdGlvbnMKKwlAcGFyYW0gZHN0X3BvcyBQaXhlbCBwb3NpdGlvbiBpbiBkZXN0aW5hdGlvbiBsaW5lIGJ1ZmZlcgorCUBwYXJhbSBzcmNfcG9zIFBpeGVsIHBvc2l0aW9uIGluIHNvdXJjZSBsaW5lIGJ1ZmZlcgorCUByZXR1cm4gUmV0dXJucyB0aGUgZmlsdGVyIHdlaWdodAorCSovCisJZG91YmxlIGdldFdlaWdodCh1bnNpZ25lZCBkc3RfcG9zLCB1bnNpZ25lZCBzcmNfcG9zKSB7CisJCXJldHVybiBtX1dlaWdodFRhYmxlW2RzdF9wb3NdLldlaWdodHNbc3JjX3Bvc107CisJfQorCisJLyoqIFJldHJpZXZlIGxlZnQgYm91bmRhcnkgb2Ygc291cmNlIGxpbmUgYnVmZmVyCisJQHBhcmFtIGRzdF9wb3MgUGl4ZWwgcG9zaXRpb24gaW4gZGVzdGluYXRpb24gbGluZSBidWZmZXIKKwlAcmV0dXJuIFJldHVybnMgdGhlIGxlZnQgYm91bmRhcnkgb2Ygc291cmNlIGxpbmUgYnVmZmVyCisJKi8KKwl1bnNpZ25lZCBnZXRMZWZ0Qm91bmRhcnkodW5zaWduZWQgZHN0X3BvcykgeworCQlyZXR1cm4gbV9XZWlnaHRUYWJsZVtkc3RfcG9zXS5MZWZ0OworCX0KKworCS8qKiBSZXRyaWV2ZSByaWdodCBib3VuZGFyeSBvZiBzb3VyY2UgbGluZSBidWZmZXIKKwlAcGFyYW0gZHN0X3BvcyBQaXhlbCBwb3NpdGlvbiBpbiBkZXN0aW5hdGlvbiBsaW5lIGJ1ZmZlcgorCUByZXR1cm4gUmV0dXJucyB0aGUgcmlnaHQgYm91bmRhcnkgb2Ygc291cmNlIGxpbmUgYnVmZmVyCisJKi8KKwl1bnNpZ25lZCBnZXRSaWdodEJvdW5kYXJ5KHVuc2lnbmVkIGRzdF9wb3MpIHsKKwkJcmV0dXJuIG1fV2VpZ2h0VGFibGVbZHN0X3Bvc10uUmlnaHQ7CisJfQorfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qKgorIENSZXNpemVFbmdpbmU8YnI+CisgVGhpcyBjbGFzcyBwZXJmb3JtcyBmaWx0ZXJlZCB6b29tLiBJdCBzY2FsZXMgYW4gaW1hZ2UgdG8gdGhlIGRlc2lyZWQgZGltZW5zaW9ucyB3aXRoIAorIGFueSBvZiB0aGUgQ0dlbmVyaWNGaWx0ZXIgZGVyaXZlZCBmaWx0ZXIgY2xhc3MuPGJyPgorIEl0IHdvcmtzIHdpdGggRklUX0JJVE1BUCBidWZmZXJzLCBXT1JEIGJ1ZmZlcnMgKEZJVF9VSU5UMTYsIEZJVF9SR0IxNiwgRklUX1JHQkExNikgCisgYW5kIGZsb2F0IGJ1ZmZlcnMgKEZJVF9GTE9BVCwgRklUX1JHQkYsIEZJVF9SR0JBRikuPGJyPjxicj4KKworIDxiPlJlZmVyZW5jZXM8L2I+IDogPGJyPgorIFsxXSBQYXVsIEhlY2tiZXJ0LCBDIGNvZGUgdG8gem9vbSByYXN0ZXIgaW1hZ2VzIHVwIG9yIGRvd24sIHdpdGggbmljZSBmaWx0ZXJpbmcuIAorIFVDIEJlcmtlbGV5LCBBdWd1c3QgMTk4OS4gW29ubGluZV0gaHR0cDovL3d3dy0yLmNzLmNtdS5lZHUvYWZzL2NzLmNtdS5lZHUvV2ViL1Blb3BsZS9waC9oZWNrYmVydC5odG1sCisgWzJdIEVyYW4gWWFyaXYsIFR3byBQYXNzIFNjYWxpbmcgdXNpbmcgRmlsdGVycy4gVGhlIENvZGUgUHJvamVjdCwgRGVjZW1iZXIgMTk5OS4gCisgW29ubGluZV0gaHR0cDovL3d3dy5jb2RlcHJvamVjdC5jb20vYml0bWFwLzJfcGFzc19zY2FsaW5nLmFzcAorCisqLworY2xhc3MgQ1Jlc2l6ZUVuZ2luZQoreworcHJpdmF0ZToKKwkvLy8gUG9pbnRlciB0byB0aGUgRklSIC8gSUlSIGZpbHRlcgorCUNHZW5lcmljRmlsdGVyKiBtX3BGaWx0ZXI7CisKK3B1YmxpYzoKKworCS8qKgorCUNvbnN0cnVjdG9yCisJQHBhcmFtIGZpbHRlciBGSVIgL0lJUiBmaWx0ZXIgdG8gYmUgdXNlZAorCSovCisJQ1Jlc2l6ZUVuZ2luZShDR2VuZXJpY0ZpbHRlciogZmlsdGVyKTptX3BGaWx0ZXIoZmlsdGVyKSB7fQorCisJLy8vIERlc3RydWN0b3IKKwl2aXJ0dWFsIH5DUmVzaXplRW5naW5lKCkge30KKworCS8qKiBTY2FsZSBhbiBpbWFnZSB0byB0aGUgZGVzaXJlZCBkaW1lbnNpb25zLgorCisJTWV0aG9kIENSZXNpemVFbmdpbmU6OnNjYWxlLCBhcyB3ZWxsIGFzIHRoZSB0d28gZmlsdGVyaW5nIG1ldGhvZHMKKwlDUmVzaXplRW5naW5lOjpob3Jpem9udGFsRmlsdGVyIGFuZCBDUmVzaXplRW5naW5lOjp2ZXJ0aWNhbEZpbHRlciB0YWtlCisJZm91ciBhZGRpdGlvbmFsIHBhcmFtZXRlcnMsIHRoYXQgZGVmaW5lIGEgcmVjdGFuZ2xlIGluIHRoZSBzb3VyY2UKKwlpbWFnZSB0byBiZSByZXNjYWxlZC4KKworCVRoZXNlIGFyZSBzcmNfbGVmdCwgc3JjX3RvcCwgc3JjX3dpZHRoIGFuZCBzcmNfaGVpZ2h0IGFuZCBzaG91bGQgd29yaworCWxpa2UgdGhlc2Ugb2YgZnVuY3Rpb24gRnJlZUltYWdlX0NvcHkuIEhvd2V2ZXIsIHNyY19sZWZ0IGFuZCBzcmNfdG9wIGFyZQorCWFjdHVhbGx5IG5hbWVkIHNyY19vZmZzZXRfeCBhbmQgc3JjX29mZnNldF95IGluIHRoZSBmaWx0ZXJpbmcgbWV0aG9kcy4KKworCUFkZGl0aW9uYWxseSwgc2luY2Ugc3JjX2hlaWdodCBhbmQgZHN0X2hlaWdodCBhcmUgYWx3YXlzIHRoZSBzYW1lIGZvcgorCW1ldGhvZCBob3Jpem9udGFsRmlsdGVyIGFzIHNyY193aWR0aCBhbmQgZHN0X3dpZHRoIGFyZSBhbHdheXMgdGhlIHNhbWUKKwlmb3IgdmVydGljYWxGaWx0ZXIsIHRoZXNlIGhhdmUgYmVlbiBzdHJpcHBlZCBkb3duIHRvIGEgc2luZ2xlIHBhcmFtZXRlcgorCWhlaWdodCBhbmQgd2lkdGggZm9yIGhvcml6b250YWxGaWx0ZXIgYW5kIHZlcnRpY2FsRmlsdGVyIHJlc3BlY3RpdmVseS4KKworCUN1cnJlbnRseSwgbWV0aG9kIHNjYWxlIGlzIGNhbGxlZCB3aXRoIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgc291cmNlCisJaW1hZ2UuIEhvd2V2ZXIsIGluIGEgZnV0dXJlIHZlcnNpb24sIHdlIGNvdWxkIHByb3ZpZGUgYSBuZXcgZnVuY3Rpb24KKwljYWxsZWQgRnJlZUltYWdlX1Jlc2NhbGVSZWN0IHRoYXQgcmVzY2FsZXMgb25seSBwYXJ0IG9mIGFuIGltYWdlLiAKKworCUBwYXJhbSBzcmMgUG9pbnRlciB0byB0aGUgc291cmNlIGltYWdlCisJQHBhcmFtIGRzdF93aWR0aCBEZXN0aW5hdGlvbiBpbWFnZSB3aWR0aAorCUBwYXJhbSBkc3RfaGVpZ2h0IERlc3RpbmF0aW9uIGltYWdlIGhlaWdodAorCUBwYXJhbSBzcmNfbGVmdCBMZWZ0IGJvdW5kYXJ5IG9mIHRoZSBzb3VyY2UgcmVjdGFuZ2xlIHRvIGJlIHNjYWxlZAorCUBwYXJhbSBzcmNfdG9wIFRvcCBib3VuZGFyeSBvZiB0aGUgc291cmNlIHJlY3RhbmdsZSB0byBiZSBzY2FsZWQKKwlAcGFyYW0gc3JjX3dpZHRoIFdpZHRoIG9mIHRoZSBzb3VyY2UgcmVjdGFuZ2xlIHRvIGJlIHNjYWxlZAorCUBwYXJhbSBzcmNfaGVpZ2h0IEhlaWdodCBvZiB0aGUgc291cmNlIHJlY3RhbmdsZSB0byBiZSBzY2FsZWQKKwlAcmV0dXJuIFJldHVybnMgdGhlIHNjYWxlZCBpbWFnZSBpZiBzdWNjZXNzZnVsLCByZXR1cm5zIE5VTEwgb3RoZXJ3aXNlCisJKi8KKwlGSUJJVE1BUCogc2NhbGUoRklCSVRNQVAgKnNyYywgdW5zaWduZWQgZHN0X3dpZHRoLCB1bnNpZ25lZCBkc3RfaGVpZ2h0LCB1bnNpZ25lZCBzcmNfbGVmdCwgdW5zaWduZWQgc3JjX3RvcCwgdW5zaWduZWQgc3JjX3dpZHRoLCB1bnNpZ25lZCBzcmNfaGVpZ2h0LCB1bnNpZ25lZCBmbGFncyk7CisKK3ByaXZhdGU6CisKKwkvKioKKwlQZXJmb3JtcyBob3Jpem9udGFsIGltYWdlIGZpbHRlcmluZworCisJQHBhcmFtIHNyYyBTb3VyY2UgaW1hZ2UKKwlAcGFyYW0gaGVpZ2h0IFNvdXJjZSAvIERlc3RpbmF0aW9uIGltYWdlIGhlaWdodAorCUBwYXJhbSBzcmNfd2lkdGggU291cmNlIGltYWdlIHdpZHRoCisJQHBhcmFtIHNyY19vZmZzZXRfeAorCUBwYXJhbSBzcmNfb2Zmc2V0X3kKKwlAcGFyYW0gc3JjX3BhbAorCUBwYXJhbSBkc3QgRGVzdGluYXRpb24gaW1hZ2UKKwlAcGFyYW0gZHN0X3dpZHRoIERlc3RpbmF0aW9uIGltYWdlIHdpZHRoCisJKi8KKwl2b2lkIGhvcml6b250YWxGaWx0ZXIoRklCSVRNQVAgKiBjb25zdCBzcmMsIGNvbnN0IHVuc2lnbmVkIGhlaWdodCwgY29uc3QgdW5zaWduZWQgc3JjX3dpZHRoLAorCQkJY29uc3QgdW5zaWduZWQgc3JjX29mZnNldF94LCBjb25zdCB1bnNpZ25lZCBzcmNfb2Zmc2V0X3ksIGNvbnN0IFJHQlFVQUQgKiBjb25zdCBzcmNfcGFsLAorCQkJRklCSVRNQVAgKiBjb25zdCBkc3QsIGNvbnN0IHVuc2lnbmVkIGRzdF93aWR0aCk7CisKKwkvKioKKwlQZXJmb3JtcyB2ZXJ0aWNhbCBpbWFnZSBmaWx0ZXJpbmcKKwlAcGFyYW0gc3JjIFNvdXJjZSBpbWFnZQorCUBwYXJhbSB3aWR0aCBTb3VyY2UgLyBEZXN0aW5hdGlvbiBpbWFnZSB3aWR0aAorCUBwYXJhbSBzcmNfaGVpZ2h0IFNvdXJjZSBpbWFnZSBoZWlnaHQKKwlAcGFyYW0gc3JjX29mZnNldF94CisJQHBhcmFtIHNyY19vZmZzZXRfeQorCUBwYXJhbSBzcmNfcGFsCisJQHBhcmFtIGRzdCBEZXN0aW5hdGlvbiBpbWFnZQorCUBwYXJhbSBkc3RfaGVpZ2h0IERlc3RpbmF0aW9uIGltYWdlIGhlaWdodAorCSovCisJdm9pZCB2ZXJ0aWNhbEZpbHRlcihGSUJJVE1BUCAqIGNvbnN0IHNyYywgY29uc3QgdW5zaWduZWQgd2lkdGgsIGNvbnN0IHVuc2lnbmVkIHNyY19oZWlnaHQsCisJCQljb25zdCB1bnNpZ25lZCBzcmNfb2Zmc2V0X3gsIGNvbnN0IHVuc2lnbmVkIHNyY19vZmZzZXRfeSwgY29uc3QgUkdCUVVBRCAqIGNvbnN0IHNyY19wYWwsCisJCQlGSUJJVE1BUCAqIGNvbnN0IGRzdCwgY29uc3QgdW5zaWduZWQgZHN0X2hlaWdodCk7Cit9OworCisjZW5kaWYgLy8gICBfUkVTSVpFX0hfCmRpZmYgLS1naXQgYS9maWxlcy9Tb3VyY2UvTGliTU5HL2xpYm1uZy5oIGIvZmlsZXMvU291cmNlL0xpYk1ORy9saWJtbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2IxYWIxCi0tLSAvZGV2L251bGwKKysrIGIvZmlsZXMvU291cmNlL0xpYk1ORy9saWJtbmcuaApAQCAtMCwwICsxLDI5MzIgQEAKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBDT1BZUklHSFQgTk9USUNFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA3IEdlcmFyZCBKdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBbWW91IG1heSBpbnNlcnQgYWRkaXRpb25hbCBub3RpY2VzIGFmdGVyIHRoaXMgc2VudGVuY2UgaWYgeW91IG1vZGlmeSAgICogKi8KKy8qICogIHRoaXMgc291cmNlXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgY29weXJpZ2h0IGFuZCBsaWNlbnNlLCAiQ29udHJpYnV0aW5nIEF1dGhvcnMiICogKi8KKy8qICogaXMgZGVmaW5lZCBhcyB0aGUgZm9sbG93aW5nIHNldCBvZiBpbmRpdmlkdWFsczogICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICBHZXJhcmQgSnV5biAgICAgICAgICAgICAgICAgLSBnanV5biA6YXQ6IHVzZXJzLnNvdXJjZWZvcmdlLm5ldCAgICAgICogKi8KKy8qICogICAgR2xlbm4gUmFuZGVycy1QZWhyc29uICAgICAgIC0gZ2xlbm5ycCA6YXQ6IHVzZXJzLnNvdXJjZWZvcmdlLm5ldCAgICAqICovCisvKiAqICAgIFJhcGhhZWwgQXNzZW5hdCAgICAgICAgICAgICAtIHJhcGggOmF0OiByYXBobmV0Lm5ldCAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICBKb2huIFN0aWxlcyAgICAgICAgICAgICAgICAgLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIFRoZSBNTkcgTGlicmFyeSBpcyBzdXBwbGllZCAiQVMgSVMiLiAgVGhlIENvbnRyaWJ1dGluZyBBdXRob3JzICAgICAgICAgKiAqLworLyogKiBkaXNjbGFpbSBhbGwgd2FycmFudGllcywgZXhwcmVzc2VkIG9yIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCAgICAgICogKi8KKy8qICogbGltaXRhdGlvbiwgdGhlIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBvZiBmaXRuZXNzIGZvciBhbnkgICAqICovCisvKiAqIHB1cnBvc2UuICBUaGUgQ29udHJpYnV0aW5nIEF1dGhvcnMgYXNzdW1lIG5vIGxpYWJpbGl0eSBmb3IgZGlyZWN0LCAgICAgKiAqLworLyogKiBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsICAgICogKi8KKy8qICogd2hpY2ggbWF5IHJlc3VsdCBmcm9tIHRoZSB1c2Ugb2YgdGhlIE1ORyBMaWJyYXJ5LCBldmVuIGlmIGFkdmlzZWQgb2YgICAqICovCisvKiAqIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyAqICovCisvKiAqIHNvdXJjZSBjb2RlLCBvciBwb3J0aW9ucyBoZXJlb2YsIGZvciBhbnkgcHVycG9zZSwgd2l0aG91dCBmZWUsIHN1YmplY3QgKiAqLworLyogKiB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb3VyY2UgY29kZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgICAgICAgICAgKiAqLworLyogKiAgICB5b3UgbXVzdCBub3QgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIDIuIEFsdGVyZWQgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoIGFuZCBtdXN0IG5vdCBiZSAgICAgKiAqLworLyogKiAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc291cmNlLiAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIDMuIFRoaXMgQ29weXJpZ2h0IG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgKiAqLworLyogKiAgICBvciBhbHRlcmVkIHNvdXJjZSBkaXN0cmlidXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIFRoZSBDb250cmlidXRpbmcgQXV0aG9ycyBzcGVjaWZpY2FsbHkgcGVybWl0LCB3aXRob3V0IGZlZSwgYW5kICAgICAgICAgKiAqLworLyogKiBlbmNvdXJhZ2UgdGhlIHVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGFzIGEgY29tcG9uZW50IHRvIHN1cHBvcnRpbmcgICAgICogKi8KKy8qICogdGhlIE1ORyBhbmQgSk5HIGZpbGUgZm9ybWF0IGluIGNvbW1lcmNpYWwgcHJvZHVjdHMuICBJZiB5b3UgdXNlIHRoaXMgICAqICovCisvKiAqIHNvdXJjZSBjb2RlIGluIGEgcHJvZHVjdCwgYWNrbm93bGVkZ21lbnQgd291bGQgYmUgaGlnaGx5IGFwcHJlY2lhdGVkLiAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBQYXJ0cyBvZiB0aGlzIHNvZnR3YXJlIGhhdmUgYmVlbiBhZGFwdGVkIGZyb20gdGhlIGxpYnBuZyBwYWNrYWdlLiAgICAgICogKi8KKy8qICogQWx0aG91Z2ggdGhpcyBsaWJyYXJ5IHN1cHBvcnRzIGFsbCBmZWF0dXJlcyBmcm9tIHRoZSBQTkcgc3BlY2lmaWNhdGlvbiAqICovCisvKiAqIChhcyBNTkcgZGVzY2VuZHMgZnJvbSBpdCkgaXQgZG9lcyBub3QgcmVxdWlyZSB0aGUgbGlicG5nIHBhY2thZ2UuICAgICAgKiAqLworLyogKiBJdCBkb2VzIHJlcXVpcmUgdGhlIHpsaWIgbGlicmFyeSBhbmQgb3B0aW9uYWxseSB0aGUgSUpHIGpwZWcgbGlicmFyeSwgICogKi8KKy8qICogYW5kL29yIHRoZSAibGl0dGxlLWNtcyIgbGlicmFyeSBieSBNYXJ0aSBNYXJpYSAoZGVwZW5kaW5nIG9uIHRoZSAgICAgICAqICovCisvKiAqIGluY2x1c2lvbiBvZiBzdXBwb3J0IGZvciBKTkcgYW5kIEZ1bGwtQ29sb3ItTWFuYWdlbWVudCByZXNwZWN0aXZlbHkuICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogVGhpcyBsaWJyYXJ5J3MgZnVuY3Rpb24gaXMgcHJpbWFyaWx5IHRvIHJlYWQgYW5kIGRpc3BsYXkgTU5HICAgICAgICAgICAqICovCisvKiAqIGFuaW1hdGlvbnMuIEl0IGlzIG5vdCBtZWFudCBhcyBhIGZ1bGwtZmVhdHVyZWQgaW1hZ2UtZWRpdGluZyAgICAgICAgICAgKiAqLworLyogKiBjb21wb25lbnQhIEl0IGRvZXMgaG93ZXZlciBvZmZlciBjcmVhdGlvbiBhbmQgZWRpdGluZyBmdW5jdGlvbmFsaXR5ICAgICogKi8KKy8qICogYXQgdGhlIGNodW5rIGxldmVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIChmdXR1cmUgbW9kaWZpY2F0aW9ucyBtYXkgaW5jbHVkZSBzb21lIG1vcmUgc3VwcG9ydCBmb3IgY3JlYXRpb24gICAgICAgKiAqLworLyogKiAgYW5kIG9yIGVkaXRpbmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogVmVyc2lvbiBudW1iZXJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBYLlkuWiA6IFggPSByZWxlYXNlICgwID0gaW5pdGlhbCBidWlsZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICBZID0gbWFqb3IgdmVyc2lvbiAodW5ldmVuID0gdGVzdDsgZXZlbiA9IHByb2R1Y3Rpb24pICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgWiA9IG1pbm9yIHZlcnNpb24gKGJ1Z2ZpeGVzOyAyIGlzIG9sZGVyIHRoYW4gMTApICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogcHJvZHVjdGlvbiB2ZXJzaW9ucyBvbmx5IGFwcGVhciB3aGVuIGEgdGVzdC12ZXJzaW9uIGlzIGV4dGVuc2l2ZWx5ICAgICAqICovCisvKiAqIHRlc3RlZCBhbmQgZm91bmQgc3RhYmxlIG9yIGZvciBpbnRlcm1lZGlhdGUgYnVnLWZpeGVzIChyZWNvZ25pemVkIGJ5ICAgKiAqLworLyogKiBhIGNoYW5nZSBpbiB0aGUgWiBudW1iZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIHguMS54ICAgICAgPSB0ZXN0IHZlcnNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiB4LjIueCAgICAgID0gcHJvZHVjdGlvbiB2ZXJzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogeC4zLnggICAgICA9IHRlc3QgdmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIHguNC54ICAgICAgPSBwcm9kdWN0aW9uIHZlcnNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgZXRjLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogSWRlbnRpZmllciBuYW1pbmcgY29udmVudGlvbnMgdGhyb3VnaG91dCB0aGlzIGxpYnJhcnkgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBpWHh4eCAgICAgID0gYW4gaW50ZWdlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogZFh4eHggICAgICA9IGEgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIHBYeHh4ICAgICAgPSBhIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBiWHh4eCAgICAgID0gYSBib29sZWFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogZVh4eHggICAgICA9IGFuIGVudW1lcmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGhYeHh4ICAgICAgPSBhIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiB6WHh4eCAgICAgID0gYSB6ZXJvLXRlcm1pbmF0ZWQgc3RyaW5nIChwY2hhcikgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogZlh4eHggICAgICA9IGEgcG9pbnRlciB0byBhIGZ1bmN0aW9uIChjYWxsYmFjaykgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGFYeHh4ICAgICAgPSBhbiBhcnJheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBzWHh4eCAgICAgID0gYSBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIE1hY3JvcyAmIGRlZmluZXMgYXJlIGluIGFsbCB1cHBlcmNhc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBGdW5jdGlvbnMgJiB0eXBlZGVmcyBpbiBhbGwgbG93ZXJjYXNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogRXhwb3J0ZWQgc3R1ZmYgaXMgcHJlZml4ZWQgd2l0aCBNTkdfIG9yIG1uZ18gcmVzcGVjdGl2ZWx5LiAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAoSSBtYXkgaGF2ZSBtaXNzZWQgYSBjb3VwbGU7IGRvbid0IGhlc2l0YXRlIHRvIGxldCBtZSBrbm93ISkgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogcHJvamVjdCAgIDogbGlibW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGZpbGUgICAgICA6IGxpYm1uZy5oICAgICAgICAgICAgICAgICAgY29weXJpZ2h0IChjKSAyMDAwLTIwMDcgRy5KdXluICAgKiAqLworLyogKiB2ZXJzaW9uICAgOiAxLjAuMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIHB1cnBvc2UgICA6IG1haW4gYXBwbGljYXRpb24gaW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogYXV0aG9yICAgIDogRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBjb21tZW50ICAgOiBUaGUgbWFpbiBhcHBsaWNhdGlvbiBpbnRlcmZhY2UuIEFuIGFwcGxpY2F0aW9uIHNob3VsZCBub3QgICogKi8KKy8qICogICAgICAgICAgICAgbmVlZCBhY2Nlc3MgdG8gYW55IG9mIHRoZSBvdGhlciBtb2R1bGVzISAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBjaGFuZ2VzICAgOiAwLjUuMSAtIDA1LzA2LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjaGFuZ2VkIGNodW5rIGl0ZXJhdGlvbiBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4xIC0gMDUvMDgvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGNodW5rIGFjY2VzcyBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCB2ZXJzaW9uIGNvbnRyb2wgY29uc3RhbnRzICYgZnVuY3Rpb25zICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2hhbmdlZCBzdHJpY3QtQU5TSSBzdHVmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMSAtIDA1LzExLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBzZXRfb3V0cHV0cHJvZmlsZTIgJiBzZXRfc3JnYnByb2ZpbGUyICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgZW1wdHktY2h1bmsgcHV0LXJvdXRpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMSAtIDA1LzEyLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCB2ZXJzaW9uX2RsbCAmIFZFUlNJT05fRExMIChmb3IgY29uc2lzdGVuY3kpICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgdmVyc2lvbiBjb250cm9sIGV4cGxhbmF0b3J5IHRleHQgJiBzYW1wbGVzICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMSAtIDA1LzE1LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBnZXRpbWdkYXRhICYgcHV0aW1nZGF0YSBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMiAtIDA1LzE2LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjaGFuZ2VkIHRoZSB2ZXJzaW9uIHBhcmFtZXRlcnMgKG9idmlvdXNseSkgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4yIC0gMDUvMTgvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNvbXBsaW1lbnRlZCBjb25zdGFudHMgZm9yIGNodW5rLXByb3BlcnR5IHZhbHVlcyAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjIgLSAwNS8yMy8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgTU5HX1VJTlRfcEhZZyB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMiAtIDA1LzI0LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBzdXBwb3J0IGZvciBnZXQvc2V0IGRlZmF1bHQgemxpYi9JSkcgcGFybXMgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4yIC0gMDYvMDIvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIE1OR19CSUdFTkRJQU5fU1VQUE9SVCAoY29udHJpYnV0ZWQgYnkgVGltIFJvd2xleSkgICogKi8KKy8qICogICAgICAgICAgICAgLSBzZXBhcmF0ZWQgY29uZmlndXJhdGlvbi1vcHRpb25zIGludG8gIm1uZ19jb25mLmgiICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgUkdCOF9BOCBjYW52YXNzdHlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGdldGFscGhhbGluZSBjYWxsYmFjayBmb3IgUkdCOF9BOCBjYW52YXNzdHlsZSAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjIgLSAwNi8wNi8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gbW92ZWQgZXJyb3Jjb2RlcyBmcm9tICJtbmdfZXJyb3IuaCIgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIG1uZ19yZWFkX3Jlc3VtZSBmdW5jdGlvbiB0byBzdXBwb3J0ICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICByZWFkLXN1c3BlbnNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMyAtIDA2LzE2LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjaGFuZ2VkIHRoZSB2ZXJzaW9uIHBhcmFtZXRlcnMgKG9idmlvdXNseSkgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4zIC0gMDYvMjEvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGdldC9zZXQgZm9yIHNwZWVkdHlwZSB0byBmYWNpbGl0YXRlIHRlc3RpbmcgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBnZXQgZm9yIGltYWdlbGV2ZWwgZHVyaW5nIHByb2Nlc3N0ZXh0IGNhbGxiYWNrICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4zIC0gMDYvMjQvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIGluY2x1c2lvbiBvZiBJSkcgcmVhZC93cml0ZSBjb2RlICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjMgLSAwNi8yNi8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2hhbmdlZCB1c2VyZGF0YSB2YXJpYWJsZSB0byBtbmdfcHRyICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjAgLSAwNi8zMC8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2hhbmdlZCByZWZyZXNoIHBhcmFtZXRlcnMgdG8gJ3gseSx3aWR0aCxoZWlnaHQnICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjEgLSAwNy8wNi8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgTU5HX05FRURUSU1FUldBSVQgZXJyb3Jjb2RlICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNoYW5nZWQgY29tbWVudHMgdG8gaW5kaWNhdGUgbW9kaWZpZWQgYmVoYXZpb3IgZm9yICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICB0aW1lciAmIHN1c3BlbnNpb24gYnJlYWtzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4xIC0gMDcvMDgvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGdldCByb3V0aW5lcyBmb3IgaW50ZXJuYWwgZGlzcGxheSB2YXJpYWJsZXMgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBnZXQvc2V0IHJvdXRpbmVzIGZvciBzdXNwZW5zaW9ubW9kZSB2YXJpYWJsZSAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4xIC0gMDcvMTUvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGNhbGxiYWNrcyBmb3IgU0FWRS9TRUVLIHByb2Nlc3NpbmcgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBnZXQvc2V0IHJvdXRpbmVzIGZvciBzZWN0aW9uYnJlYWsgdmFyaWFibGUgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgTkVFRFNFQ1RJT05XQUlUIGVycm9yY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMSAtIDA3LzE5LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBmdW5jdGlvbiB0byBzZXQgZnJhbWUtL2xheWVyLWNvdW50ICYgcGxheXRpbWUgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgZXJyb3Jjb2RlIGZvciB1cGRhdGVtbmdoZWFkZXIgaWYgbm90IGEgTU5HICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjIgLSAwNy8zMS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgcHJvYmxlbSB3aXRoIHRyYWNlLWZ1bmN0aW9ucyBpbXByb3Blcmx5IHdyYXBwZWQgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHN0YXR1c194eHh4IGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjIgLSAwOC8wNS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2hhbmdlZCBmaWxlLXByZWZpeGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGZ1bmN0aW9uIHRvIHNldCBzaW1wbGljaXR5IGZpZWxkICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4zIC0gMDgvMDkvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGNoZWNrIGZvciBzaW1wbGljaXR5LWJpdHMgaW4gTUhEUiAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjMgLSAwOC8xMi8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgd29ya2Fyb3VuZCBmb3IgZmF1bHR5IFBob3RvU2hvcCBpQ0NQIGNodW5rICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMyAtIDA4LzI2LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBNQUdOIGNodW5rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4zIC0gMDkvMDcvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHN1cHBvcnQgZm9yIG5ldyBmaWx0ZXJfdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjMgLSAxMC8xMC8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgc3VwcG9ydCBmb3IgYWxwaGEtZGVwdGggcHJlZGljdGlvbiAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMyAtIDEwLzExLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaXhlZCBwcm9jZXNzaW5nIG9mIHVua25vd24gY3JpdGljYWwgY2h1bmtzICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gcmVtb3ZlZCB0ZXN0LU1hR04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIFBORy9NTkcgc3BlYyB2ZXJzaW9uIGluZGljYXRvcnMgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBzdXBwb3J0IGZvciBuRUVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4zIC0gMTAvMTYvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGZ1bmN0aW9ucyB0byByZXRyaWV2ZSBQTkcvSk5HIHNwZWNpZmljIGhlYWRlci1pbmZvICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBKREFBIGNodW5rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4zIC0gMTAvMTcvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGNhbGxiYWNrIHRvIHByb2Nlc3Mgbm9uLWNyaXRpY2FsIHVua25vd24gY2h1bmtzICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjMgLSAxMC8yMC8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgZXJyb2NvZGUgZm9yIGRlbGF5ZWQgZGVsdGEtcHJvY2Vzc2luZyAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGdldC9zZXQgZm9yIGJLR0QgcHJlZmVyZW5jZSBzZXR0aW5nICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjMgLSAxMC8yMS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgZ2V0IGZ1bmN0aW9uIGZvciBpbnRlcmxhY2UvcHJvZ3Jlc3NpdmUgZGlzcGxheSAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjQgLSAwMS8xOC8yMDAxIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgZXJyb3Jjb2RlIGZvciBNQUdOIG1ldGhvZHMgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIHJlbW92ZWQgdGVzdCBmaWx0ZXItbWV0aG9kcyAxICYgNjUgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC4wIC0gMDIvMDUvMjAwMSAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIHZlcnNpb24gbnVtYmVycyAob2J2aW91c2x5KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC4xIC0gMDIvMDgvMjAwMSAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIE1FTkQgcHJvY2Vzc2luZyBjYWxsYmFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjEgLSAwNC8yMS8yMDAxIC0gRy5KdXluIChjb2RlIGJ5IEcuS2VsbHkpICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgQkdSQTggY2FudmFzIHdpdGggcHJlbXVsdGlwbGllZCBhbHBoYSAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuMSAtIDA1LzAyLzIwMDEgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCAiZGVmYXVsdCIgc1JHQiBnZW5lcmF0aW9uIChUaGFua3MgTWFydGkhKSAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuMiAtIDA2LzIzLzIwMDEgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBvcHRpbWl6YXRpb24gb3B0aW9uIGZvciBNTkctdmlkZW8gcGxheWJhY2sgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgcHJvY2Vzc3Rlcm0gY2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuMiAtIDA2LzI1LzIwMDEgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBsYXRlIGJpbmRpbmcgZXJyb3Jjb2RlIChub3QgdXNlZCBpbnRlcm5hbGx5KSAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgb3B0aW9uIHRvIHR1cm4gb2ZmIHByb2dyZXNzaXZlIHJlZnJlc2ggICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjMgLSAwOC8wNi8yMDAxIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgZ2V0IGZ1bmN0aW9uIGZvciBsYXN0IHByb2Nlc3NlZCBCQUNLIGNodW5rICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAwNy8wNC8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgZXJyb3Jjb2RlIGZvciBleHRyZW1lIGNodW5rLXNpemVzICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDA4LzA3LzIwMDIgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCB0ZXN0LW9wdGlvbiBmb3IgUE5HIGZpbHRlciBtZXRob2QgMTkzICg9bm8gZmlsdGVyKSAqICovCisvKiAqICAgICAgICAgICAgIDEuMC41IC0gMDgvMTUvMjAwMiAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNvbXBsZXRlZCBQUk9NIHN1cHBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjb21wbGV0ZWQgZGVsdGEtaW1hZ2Ugc3VwcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC41IC0gMDgvMTkvMjAwMiAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIEhMQVBJIGZ1bmN0aW9uIHRvIGNvcHkgY2h1bmtzICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAwOS8xNC8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgZXZlbnQgaGFuZGxpbmcgZm9yIGR5bmFtaWMgTU5HICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkICdzdXBwb3J0cycgY2FsbCB0byBjaGVjayBmdW5jdGlvbiBhdmFpbGFiaWxpdHkgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAwOS8xNS8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgTE9PUCBpdGVyYXRpb249MCBzcGVjaWFsIGNhc2UgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDA5LzIwLzIwMDIgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBzdXBwb3J0IGZvciBQQVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC41IC0gMDkvMjIvMjAwMiAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGJncng4IGNhbnZhcyAoZmlsbGVyIGJ5dGUpICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAxMC8wNy8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgY2hlY2sgZm9yIFRFUk0gcGxhY2VtZW50IGR1cmluZyBjcmVhdGUvd3JpdGUgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGJldGEgdmVyc2lvbiBmdW5jdGlvbiAmIGNvbnN0YW50ICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAxMS8wNy8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgc3VwcG9ydCB0byBnZXQgdG90YWxzIGFmdGVyIG1uZ19yZWFkKCkgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjYgLSAwNy8wNy8yMDAzIC0gRy4gUmFuZGVycy1QZWhyc29uICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgc3VwcG9ydCBmb3IgcmVkdWNpbmcgdGhlIGZvb3RwcmludCBvZiBsaWJtbmcgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgIGJ5IG1hY3JvcyB0aGF0IG9wdGlvbmFsbHkgc2tpcCB1bnVzZWQgY2h1bmtzLCByZW1vdmUgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAxNi1iaXQgc2FtcGxlIHN1cHBvcnQsIHJlbW92ZSBEZWx0YSBzdXBwb3J0LCBhbmQgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgcmVtb3ZlIEpORyBzdXBwb3J0LCB0byBhY2NvbW9kYXRlIE1vemlsbGEvRmlyZWJpcmQuICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNiAtIDA3LzE0LzIwMDMgLSBHLiBSYW5kZXJzLVBlaHJzb24gICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmdXJ0aGVyIG9wdGlvbmFsIHJlbW92YWwgb2YgdW51c2VkIGZ1bmN0aW9ucyAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNyAtIDExLzI3LzIwMDMgLSBSLkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBDQU5WQVNfUkdCNTY1IGFuZCBDQU5WQVNfQkdSNTY1ICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC43IC0gMTIvMDYvMjAwMyAtIFIuQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIENBTlZBU19SR0JBNTY1IGFuZCBDQU5WQVNfQkdSQTU2NSAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjcgLSAwMS8yNS8yMDA0IC0gSi5TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgcHJlbXVsdGlwbGllZCBhbHBoYSBjYW52YXMnIGZvciBSR0JBLCBBUkdCLCBBQkdSICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNyAtIDAzLzA3LzIwMDQgLSBHLiBSYW5kZXJzLVBlaHJzb24gICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBwdXQgZ2FtbWEsIGNtcy1yZWxhdGVkIGRlY2xhcmF0aW9ucyBpbnNpZGUgI2lmZGVmICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC43IC0gMDMvMTAvMjAwNCAtIEcuUi1QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGNvbmRpdGlvbmFscyBhcm91bmQgb3BlbnN0cmVhbS9jbG9zZXN0cmVhbSAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC44IC0gMDQvMDIvMjAwNCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIENSQyBleGlzdGVuY2UgJiBjaGVja2luZyBmbGFncyAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjggLSAwNC8xMi8yMDA0IC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgZGF0YS1wdXNoIG1lY2hhbmlzbXMgZm9yIHNwZWNpYWxpemVkIGRlY29kZXJzICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuOCAtIDA2LzA1LzIwMDQgLSBHLlItUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBkZWZpbmUgTU5HX0lOQ0xVREVfWkxJQiB3aGVuIE1OR19VU0VfWkxJQl9DUkMgaXMgZGVmaW5lZCAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuOSAtIDEwLzAzLzIwMDQgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBmdW5jdGlvbiB0byByZXRyaWV2ZSBjdXJyZW50IEZSQU0gZGVsYXkgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC45IC0gMTAvMTQvMjAwNCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGJncjU2NV9hOCBjYW52YXMtc3R5bGUgKHRoYW5rcyB0byBKLiBFbHZhbmRlcikgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjkgLSAxMC8xNy8yMDA0IC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgUFBMVCBnZXRjaHVuay9wdXRjaHVuayByb3V0aW5lcyAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjEwIC0gMDMvMDcvMjAwNiAtICh0aGFua3MgdG8gVy4gTWFudGhleSkgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgQ0FOVkFTX1JHQjU1NSBhbmQgQ0FOVkFTX0JHUjU1NSAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuMTAgLSAwNC8wOC8yMDA3IC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBzdXBwb3J0IGZvciBtUE5HIHByb3Bvc2FsICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC4xMCAtIDA0LzEyLzIwMDcgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHN1cHBvcnQgZm9yIEFORyBwcm9wb3NhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pICYmIGRlZmluZWQoTU5HX1NUUklDVF9BTlNJKQorI3ByYWdtYSBvcHRpb24gLUEgICAgICAgICAgICAgICAgICAgICAgLyogZm9yY2UgQU5TSS1DICovCisjZW5kaWYKKworI2lmbmRlZiBfbGlibW5nX2hfCisjZGVmaW5lIF9saWJtbmdfaF8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2luY2x1ZGUgImxpYm1uZ19jb25mLmgiICAgICAgICAgICAgICAgLyogdXNlci1zcGVjaWZpYyBjb25maWd1cmF0aW9uIG9wdGlvbnMgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2RlZmluZSBNTkdfQ0hFQ0tfQkFEX0lDQ1AgICAgICAgICAgICAgLyogbGV0J3MgY2F0Y2ggdGhhdCBzdWNrZXIgISEhICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9SRUFEICAgICAgICAgICAgICAgIC8qIGRlcGVuZGVuY2llcyBiYXNlZCBvbiB1c2VyLWNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgTU5HX0lOQ0xVREVfUkVBRF9QUk9DUworI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9XUklURQorI2RlZmluZSBNTkdfSU5DTFVERV9XUklURV9QUk9DUworI2VuZGlmCisKKyNpZmRlZiBNTkdfVVNFX1pMSUJfQ1JDCisjZGVmaW5lIE1OR19JTkNMVURFX1pMSUIKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorI2RlZmluZSBNTkdfSU5DTFVERV9GSUxURVJTCisjZGVmaW5lIE1OR19JTkNMVURFX0lOVEVSTEFDRQorI2RlZmluZSBNTkdfSU5DTFVERV9PQkpFQ1RTCisjZGVmaW5lIE1OR19JTkNMVURFX0RJU1BMQVlfUFJPQ1MKKyNkZWZpbmUgTU5HX0lOQ0xVREVfVElNSU5HX1BST0NTCisjZGVmaW5lIE1OR19JTkNMVURFX1pMSUIKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NUT1JFX0NIVU5LUworI2RlZmluZSBNTkdfSU5DTFVERV9aTElCCisjZW5kaWYKKworI2lmZGVmIE1OR19TVVBQT1JUX0lKRzZCCisjZGVmaW5lIE1OR19JTkNMVURFX0pORworI2RlZmluZSBNTkdfSU5DTFVERV9JSkc2QgorI2RlZmluZSBNTkdfVVNFX1NFVEpNUAorI2VuZGlmCisKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyNpZiBkZWZpbmVkKE1OR19TVVBQT1JUX0RJU1BMQVkpIHx8IGRlZmluZWQoTU5HX0FDQ0VTU19DSFVOS1MpCisjZGVmaW5lIE1OR19JTkNMVURFX0pOR19SRUFECisjZW5kaWYKKyNpZiBkZWZpbmVkKE1OR19TVVBQT1JUX1dSSVRFKSB8fCBkZWZpbmVkKE1OR19BQ0NFU1NfQ0hVTktTKQorI2RlZmluZSBNTkdfSU5DTFVERV9KTkdfV1JJVEUKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBNTkdfRlVMTF9DTVMKKyNkZWZpbmUgTU5HX0lOQ0xVREVfTENNUworI2VuZGlmCisKKyNpZmRlZiBNTkdfQVVUT19ESVRIRVIKKyNkZWZpbmUgTU5HX0lOQ0xVREVfRElUSEVSSU5HCisjZW5kaWYKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisjZGVmaW5lIE1OR19JTkNMVURFX1RSQUNFX1BST0NTCisjaWZkZWYgTU5HX1RSQUNFX1RFTExUQUxFCisjZGVmaW5lIE1OR19JTkNMVURFX1RSQUNFX1NUUklOR1MKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBNTkdfRVJST1JfVEVMTFRBTEUKKyNkZWZpbmUgTU5HX0lOQ0xVREVfRVJST1JfU1RSSU5HUworI2VuZGlmCisKKyNpZmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktBQ0NFU1MKKyNkZWZpbmUgTU5HX09QVElNSVpFX0NIVU5LQUNDRVNTCisjZW5kaWYKKyNlbHNlCisjaWZkZWYgTU5HX09QVElNSVpFX0NIVU5LQUNDRVNTCisjdW5kZWYgTU5HX09QVElNSVpFX0NIVU5LQUNDRVNTCisjZW5kaWYKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaW5jbHVkZSAibGlibW5nX3R5cGVzLmgiICAgICAgICAgICAgICAvKiBwbGF0Zm9ybS1zcGVjaWZpYyBkZWZpbml0aW9ucworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIG90aGVyIGFzc29ydGVkIHN0dWZmICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICBWZXJzaW9uaW5nIGNvbnRyb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogIHZlcnNpb25fc28gYW5kIHZlcnNpb25fZGxsIHdpbGwgTk9UIHJlZmxlY3QgdmVyc2lvbl9tYWpvcjsgICAgICAgICAgICAqICovCisvKiAqICB0aGVzZSB3aWxsIG9ubHkgY2hhbmdlIGZvciBiaW5hcnkgaW5jb21wYXRpYmxlIGNoYW5nZXMgKHdoaWNoIHdpbGwgICAgKiAqLworLyogKiAgaG9wZWZ1bGx5IG5ldmVyIG9jY3VyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogIG5vdGU6IHRoZXkgd2lsbCBiZSBzZXQgdG8gMSBvbiB0aGUgZmlyc3QgcHVibGljIHJlbGVhc2UgISEhICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgZmlyc3QgcHVibGljIHJlbGVhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICNkZWZpbmUgTU5HX1ZFUlNJT05fVEVYVCAgICAiMS4wLjAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAjZGVmaW5lIE1OR19WRVJTSU9OX1NPICAgICAgMSAgICAgICBlZy4gbGlibW5nLnNvLjEgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgI2RlZmluZSBNTkdfVkVSU0lPTl9ETEwgICAgIDEgICAgICAgZWcuIGxpYm1uZy5kbGwgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICNkZWZpbmUgTU5HX1ZFUlNJT05fTUFKT1IgICAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAjZGVmaW5lIE1OR19WRVJTSU9OX01JTk9SICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgI2RlZmluZSBNTkdfVkVSU0lPTl9SRUxFQVNFIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICBidWcgZml4ICYgY29zbWV0aWNzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgI2RlZmluZSBNTkdfVkVSU0lPTl9URVhUICAgICIxLjAuMSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICNkZWZpbmUgTU5HX1ZFUlNJT05fU08gICAgICAxICAgICAgIGVnLiBsaWJtbmcuc28uMSAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAjZGVmaW5lIE1OR19WRVJTSU9OX0RMTCAgICAgMSAgICAgICBlZy4gbGlibW5nLmRsbCAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgI2RlZmluZSBNTkdfVkVSU0lPTl9NQUpPUiAgIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICNkZWZpbmUgTU5HX1ZFUlNJT05fTUlOT1IgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAjZGVmaW5lIE1OR19WRVJTSU9OX1JFTEVBU0UgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogIGZlYXR1cmUgY2hhbmdlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAjZGVmaW5lIE1OR19WRVJTSU9OX1RFWFQgICAgIjEuMi4wIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgI2RlZmluZSBNTkdfVkVSU0lPTl9TTyAgICAgIDEgICAgICAgZWcuIGxpYm1uZy5zby4xICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICNkZWZpbmUgTU5HX1ZFUlNJT05fRExMICAgICAxICAgICAgIGVnLiBsaWJtbmcuZGxsICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAjZGVmaW5lIE1OR19WRVJTSU9OX01BSk9SICAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgI2RlZmluZSBNTkdfVkVSU0lPTl9NSU5PUiAgIDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICNkZWZpbmUgTU5HX1ZFUlNJT05fUkVMRUFTRSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgbWFqb3IgcmV3cml0ZSAoc3RpbGwgYmluYXJ5IGNvbXBhdGlibGUpIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICNkZWZpbmUgTU5HX1ZFUlNJT05fVEVYVCAgICAiMi4wLjAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAjZGVmaW5lIE1OR19WRVJTSU9OX1NPICAgICAgMSAgICAgICBlZy4gbGlibW5nLnNvLjEgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgI2RlZmluZSBNTkdfVkVSU0lPTl9ETEwgICAgIDEgICAgICAgZWcuIGxpYm1uZy5kbGwgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICNkZWZpbmUgTU5HX1ZFUlNJT05fTUFKT1IgICAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAjZGVmaW5lIE1OR19WRVJTSU9OX01JTk9SICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgI2RlZmluZSBNTkdfVkVSU0lPTl9SRUxFQVNFIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICBiaW5hcnkgaW5jb21wYXRpYmxlIGNoYW5nZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgI2RlZmluZSBNTkdfVkVSU0lPTl9URVhUICAgICIxMy4wLjAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICNkZWZpbmUgTU5HX1ZFUlNJT05fU08gICAgICAyICAgICAgIGVnLiBsaWJtbmcuc28uMiAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAjZGVmaW5lIE1OR19WRVJTSU9OX0RMTCAgICAgMiAgICAgICBlZy4gbGlibW5nMi5kbGwgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgI2RlZmluZSBNTkdfVkVSU0lPTl9NQUpPUiAgIDEzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICNkZWZpbmUgTU5HX1ZFUlNJT05fTUlOT1IgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAjZGVmaW5lIE1OR19WRVJTSU9OX1JFTEVBU0UgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogIG5vdGUgdGhhdCB2ZXJzaW9uX3NvICYgdmVyc2lvbl9kbGwgd2lsbCBhbHdheXMgcmVtYWluIGVxdWFsIHNvIGl0ICAgICAqICovCisvKiAqICBkb2Vzbid0IG1hdHRlciB3aGljaCBvbmUgaXMgY2FsbGVkIHRvIGRvIHZlcnNpb24tY2hlY2tpbmc7IHRoZXkgYXJlICAgKiAqLworLyogKiAganVzdCBwcm92aWRlZCBmb3IgdGhlaXIgdGFyZ2V0IHBsYXRmb3JtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjZGVmaW5lIE1OR19WRVJTSU9OX1RFWFQgICAgIjEuMC4xMCIKKyNkZWZpbmUgTU5HX1ZFUlNJT05fU08gICAgICAxICAgICAgICAgIC8qIGVnLiBsaWJtbmcuc28uMSAgKi8KKyNkZWZpbmUgTU5HX1ZFUlNJT05fRExMICAgICAxICAgICAgICAgIC8qIGJ1dDogbGlibW5nLmRsbCAoISkgKi8KKyNkZWZpbmUgTU5HX1ZFUlNJT05fTUFKT1IgICAxCisjZGVmaW5lIE1OR19WRVJTSU9OX01JTk9SICAgMAorI2RlZmluZSBNTkdfVkVSU0lPTl9SRUxFQVNFIDEwCisjZGVmaW5lIE1OR19WRVJTSU9OX0JFVEEgICAgTU5HX0ZBTFNFCisKK01OR19FWFQgbW5nX3BjaGFyIE1OR19ERUNMIG1uZ192ZXJzaW9uX3RleHQgICAgICAodm9pZCk7CitNTkdfRVhUIG1uZ191aW50OCBNTkdfREVDTCBtbmdfdmVyc2lvbl9zbyAgICAgICAgKHZvaWQpOworTU5HX0VYVCBtbmdfdWludDggTU5HX0RFQ0wgbW5nX3ZlcnNpb25fZGxsICAgICAgICh2b2lkKTsKK01OR19FWFQgbW5nX3VpbnQ4IE1OR19ERUNMIG1uZ192ZXJzaW9uX21ham9yICAgICAodm9pZCk7CitNTkdfRVhUIG1uZ191aW50OCBNTkdfREVDTCBtbmdfdmVyc2lvbl9taW5vciAgICAgKHZvaWQpOworTU5HX0VYVCBtbmdfdWludDggTU5HX0RFQ0wgbW5nX3ZlcnNpb25fcmVsZWFzZSAgICh2b2lkKTsKK01OR19FWFQgbW5nX2Jvb2wgIE1OR19ERUNMIG1uZ192ZXJzaW9uX2JldGEgICAgICAodm9pZCk7CisKKy8qIHVzZSB0aGUgZm9sbG93aW5nIGNhbGwgdG8gY2hlY2sgd2V0aGVyIHRoZSB2ZXJzaW9uIG9mIGxpYm1uZyB5b3VyIGFwcAorICAgaXMgdXNpbmcgc3VwcG9ydHMgdGhlIGdpdmVuIGZ1bmN0aW9uOyB0aGlzIGlzIHVzZWZ1bCBpbiBhcHBzIHRoYXQgZHluYW1pY2FsbHkKKyAgIGxvYWQgdGhlIGxpYnJhcnkgdG8gbWFrZSBzdXJlIGEgY2VydGFpbiBmdW5jdGlvbiB3aWxsIHdvcms7IHRoZSByZXN1bHQgd2lsbAorICAgYmUgTU5HX1RSVUUgaWYgdGhlIGdpdmVuIGZ1bmN0aW9uIGlzIGltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbiBvZiB0aGUgbGlicmFyeTsKKyAgIE1ham9yL01pbm9yL1ZlcnNpb24gaW5kaWNhdGUgdGhlIHZlcnNpb24gdGhlIGZ1bmN0aW9uIGJlY2FtZSBhdmFpbGFibGU7CisgICAoaWYgdGhlc2UgZmllbGRzIGFyZSB6ZXJvIHRoZSBmdW5jdGlvbiBpcyBub3QgeWV0IGltcGxlbWVudGVkISkgKi8KKyNpZmRlZiBNTkdfU1VQUE9SVF9GVU5DUVVFUlkKK01OR19FWFQgbW5nX2Jvb2wgIE1OR19ERUNMIG1uZ19zdXBwb3J0c19mdW5jICAgICAobW5nX3BjaGFyICB6RnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCogaU1ham9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDgqIGlNaW5vciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4KiBpUmVsZWFzZSk7CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICBNTkcvUE5HIHNwZWNpZmljYXRpb24gbGV2ZWwgY29uZm9ybWFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNkZWZpbmUgTU5HX1BOR19WRVJTSU9OICAgICAiMS4yIgorI2RlZmluZSBNTkdfUE5HX1ZFUlNJT05fTUFKIDEKKyNkZWZpbmUgTU5HX1BOR19WRVJTSU9OX01JTiAyCisKKyNkZWZpbmUgTU5HX01OR19WRVJTSU9OICAgICAiMS4xIgorI2RlZmluZSBNTkdfTU5HX1ZFUlNJT05fTUFKIDEKKyNkZWZpbmUgTU5HX01OR19WRVJTSU9OX01JTiAxCisjZGVmaW5lIE1OR19NTkdfRFJBRlQgICAgICAgOTkgICAgICAgICAvKiBkZXByZWNhdGVkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seSB1c2VkIGZvciBuRUVEICJNTkcgRFJBRlQgbm4iICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgSGlnaC1sZXZlbCBhcHBsaWNhdGlvbiBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisvKiBsaWJyYXJ5IGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uICovCisvKiBtdXN0IGJlIHRoZSBmaXJzdCBjYWxsZWQgYmVmb3JlIGFueXRoaW5nIGNhbiBiZSBkb25lIGF0IGFsbCAqLworLyogaW5pdGlhbGl6ZXMgaW50ZXJuYWwgZGF0YXN0cnVjdHVyZShzKSAqLworTU5HX0VYVCBtbmdfaGFuZGxlICBNTkdfREVDTCBtbmdfaW5pdGlhbGl6ZSAgICAgIChtbmdfcHRyICAgICAgIHBVc2VyZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX21lbWFsbG9jICBmTWVtYWxsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19tZW1mcmVlICAgZk1lbWZyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ190cmFjZXByb2MgZlRyYWNlcHJvYyk7CisKKy8qIGxpYnJhcnkgcmVzZXQgZnVuY3Rpb24gKi8KKy8qIGNhbiBiZSB1c2VkIHRvIHJlLWluaXRpYWxpemUgdGhlIGxpYnJhcnksIHNvIGFub3RoZXIgaW1hZ2UgY2FuIGJlCisgICBwcm9jZXNzZWQuIHRoZXJlJ3MgYWJzb2x1dGVseSBubyBoYXJtIGluIGNhbGxpbmcgaXQsIGV2ZW4gd2hlbiBpdCdzIG5vdAorICAgcmVhbGx5IG5lY2Vzc2FyeSAqLworTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfcmVzZXQgICAgICAgICAgIChtbmdfaGFuZGxlICAgIGhIYW5kbGUpOworCisvKiBsaWJyYXJ5IGNsZWFudXAgZnVuY3Rpb24gKi8KKy8qIG11c3QgYmUgdGhlIGxhc3QgY2FsbGVkIHRvIGNsZWFuIHVwIGludGVybmFsIGRhdGFzdHJ1Y3R1cmUocykgKi8KK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX2NsZWFudXAgICAgICAgICAobW5nX2hhbmRsZSogICBoSGFuZGxlKTsKKworLyogaGlnaC1sZXZlbCByZWFkIGZ1bmN0aW9ucyAqLworLyogdXNlIG1uZ19yZWFkIGlmIHlvdSBzaW1wbHkgd2FudCB0byByZWFkIGEgTmV0d29yayBHcmFwaGljICovCisvKiBtbmdfcmVhZF9yZXN1bWUgaXMgdXNlZCBpbiBJL08tcmVhZC1zdXNwZW5zaW9uIHNjZW5hcmlvcywgd2hlcmUgdGhlCisgICAicmVhZGRhdGEiIGNhbGxiYWNrIG1heSByZXR1cm4gRkFMU0UgJiBsZW5ndGg9MCBpbmRpY2F0aW5nIGl0cyBidWZmZXIgaXMKKyAgIGRlcGxldGVkIG9yIHRvbyBzaG9ydCB0byBzdXBwbHkgdGhlIHJlcXVpcmVkIGJ5dGVzLCBhbmQgdGhlIGJ1ZmZlciBuZWVkcworICAgdG8gYmUgcmVmaWxsZWQ7IGxpYm1uZyB3aWxsIHJldHVybiB0aGUgZXJyb3Jjb2RlIE1OR19ORUVETU9SRURBVEEgdGVsbGluZworICAgdGhlIGFwcCB0byByZWZpbGwgaXRzIHJlYWQtYnVmZmVyIGFmdGVyIHdoaWNoIGl0IG11c3QgY2FsbCBtbmdfcmVhZF9yZXN1bWUKKyAgIChvciBtbmdfZGlzcGxheV9yZXN1bWUgaWYgaXQgYWxzbyBkaXNwbGF5aW5nIHRoZSBpbWFnZSBzaW11bHRhbmVvdXNseSkgKi8KKyNpZmRlZiBNTkdfU1VQUE9SVF9SRUFECitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19yZWFkICAgICAgICAgICAgKG1uZ19oYW5kbGUgICAgaEhhbmRsZSk7CitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19yZWFkX3Jlc3VtZSAgICAgKG1uZ19oYW5kbGUgICAgaEhhbmRsZSk7CisjZW5kaWYKKworLyogaGlnaC1sZXZlbCAiZGF0YSBwdXNoIiBmdW5jdGlvbnMgKi8KKy8qIHRoZXNlIGZ1bmN0aW9ucyBjYW4gYmUgdXNlZCBpbiBzaXR1YXRpb25zIHdoZXJlIGRhdGEgaXMgc3RyZWFtaW5nIGludG8gdGhlCisgICBhcHBsaWNhdGlvbiBhbmQgbmVlZHMgdG8gYmUgYnVmZmVyZWQgYnkgbGlibW5nIGJlZm9yZSBpdCBpcyBhY3R1YWxseQorICAgcmVxdWVzdGVkIGJ5IGxpYm1uZyBpdHNlbGYuIHRoZSBwdXNoaW5nIGNvbXBsZW1lbnRzIHRoZSBub3JtYWwgcmVhZGluZworICAgbWVjaGFuaXNtLCBidXQgYXBwbGljYXRpb25zIGNhbiBkZWNpZGUgdG8gYWx3YXlzIHJldHVybiAiMCBieXRlcyByZWFkIiB0bworICAgbWFrZSBsaWJtbmcgZ28gaW50byBzdXNwZW5zaW9uIG1vZGUgd2l0aCB0aGUgcmV0dXJuY29kZSBNTkdfTkVFRE1PUkVEQVRBICovCisvKiBtbmdfcmVhZF9wdXNoZGF0YSBjYW4gYmUgdXNlZCB0byBwdXNoIGJsb2JzIG9mIGRhdGEgb2YgYXJiaXRyYXJ5IHNpemU7CisgICBtbmdfcmVhZF9wdXNoc2lnIGFuZCBtbmdfcmVhZF9wdXNoY2h1bmsgY2FuIGJlIHVzZWQgaWYgdGhlIGFwcGxpY2F0aW9uCisgICBoYXMgYWxyZWFkeSBkb25lIHNvbWUgbG93LWxldmVsIGRlY29kaW5nIChlZy4gYXQgdGhlIGNodW5rIGxldmVsKSAqLworLyogdGhlIGRhdGEgYmVpbmcgcHVzaGVkIGludG8gbGlibW5nIHdpdGggbW5nX3JlYWRfcHVzaGRhdGEgKm11c3QqIGNvbnRhaW4KKyAgIHRoZSByZWd1bGFyIDQtYnl0ZSBjaHVua2xlbmd0aCwgYnV0ICptdXN0IG5vdCogY29udGFpbiBpdCB3aXRoCisgICBtbmdfcmVhZF9wdXNoY2h1bmshISEgKi8KKy8qIG1uZ19yZWFkX3B1c2hzaWcgaXMgdXNlZCB0byBwcmV2ZW50IGxpYm1uZyBmcm9tIHRyeWluZyB0byBwYXJzZSB0aGUgcmVndWxhcgorICAgUE5HL0pORy9NTkcgc2lnbmF0dXJlIGJ5dGVzOyB0aGUgYXBwbGljYXRpb24gbXVzdCBoYXZlIGRvbmUgdGhpcyBpdHNlbGYKKyAgIGFuZCAqbXVzdCogaW5kaWNhdGUgdGhlIHByb3BlciB0eXBlIGluIHRoZSBmdW5jdGlvbiBjYWxsIG9yIHRoaW5ncyB3aWxsCisgICBnbyBhbWlzcyEhCisgICBhbHNvIHlvdSAqbXVzdCogY2FsbCB0aGlzIGZpcnN0LCBzbyBwcmV0dHkgbXVjaCByaWdodCBhZnRlciBtbmdfaW5pdGlhbGl6ZQorICAgYW5kIGNlcnRhaW5seSBiZWZvcmUgYW55IGNhbGwgdG8gbW5nX3JlYWQgb3IgbW5nX3JlYWRkaXNwbGF5ICEhISEgKi8KKy8qIElNUE9SVEFOVCEhISBkYXRhIGNhbiBvbmx5IGJlIHNhZmVseSBwdXNoZWQgd2hlbiBsaWJtbmcgaXMgaW4gYQorICAgIndhaXQiIHN0YXRlOyBlZy4gZHVyaW5nIE1OR19ORUVEVElNRVJXQUlULCBNTkdfTkVFRFNFQ1RJT05XQUlUIG9yCisgICBNTkdfTkVFRE1PUkVEQVRBICEhISB0aGlzIGp1c3QgbWVhbnMgeW91IGNhbid0IGhhdmUgb25lIHRocmVhZCBkaXNwbGF5aW5nCisgICBhbmQgYW5vdGhlciB0aHJlYWQgcHVzaGluZyBkYXRhICEhISAqLworLyogaWYgYk93bmVyc2hpcCA9IE1OR19UUlVFLCBsaWJtbmcgd2lsbCByZXRhaW4gdGhlIHN1cHBsaWVkIHBvaW50ZXIgYW5kCisgICAqd2lsbCogZXhwZWN0IHRoZSBidWZmZXIgdG8gcmVtYWluIGF2YWlsYWJsZSB1bnRpbCBsaWJtbmcgaXMgZmluaXNoZWQKKyAgIHdpdGggaXQ7IHdoYXQgaGFwcGVucyB0aGVuIGRlcGVuZHMgb24gd2hldGhlciBvciBub3QgeW91IGhhdmUgc2V0IHRoZQorICAgcmVsZWFzZWRhdGEoKSBjYWxsYmFjazsgaWYgdGhpcyBpcyBzZXQgdGhhbiB0aGUgc3VwcGxpZWQgYnVmZmVyIHdpbGwKKyAgIGJlIHJldHVybmVkIHRocm91Z2ggdGhpcyBjYWxsYmFjayBhbmQgeW91ciBhcHBsaWNhdGlvbiBjYW4gdGFrZSBjYXJlIG9mCisgICBjbGVhbmluZyBpdCB1cCwgb3RoZXJ3aXNlIGxpYm1uZyB3aWxsIHVzZSBpdHMgaW50ZXJuYWwgZnJlZWluZyBtZWNoYW5pc20KKyAgICh3aGljaCwgZGVwZW5kaW5nIG9uIGNvbXBpbGUtb3B0aW9ucywgd2lsbCBiZSB0aGUgc3RhbmRhcmQgQyBmcmVlKCkgY2FsbCwKKyAgIG9yIHRoZSBtZW1mcmVlKCkgY2FsbGJhY2sgKi8KKy8qIGlmIGJPd25lcnNoaXAgPSBNTkdfRkFMU0UsIGxpYm1uZyB3aWxsIGp1c3QgY29weSB0aGUgZGF0YSBpbnRvIGl0cyBvd24KKyAgIGJ1ZmZlcnMgYW5kIGRpc3Bvc2Ugb2YgaXQgaW4gdGhlIG5vcm1hbCB3YXkgKi8KKyNpZmRlZiBNTkdfU1VQUE9SVF9SRUFECitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19yZWFkX3B1c2hkYXRhICAgKG1uZ19oYW5kbGUgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3B0ciAgICAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3NpemVfdCAgICBpTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfYm9vbCAgICAgIGJUYWtlb3duZXJzaGlwKTsKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3JlYWRfcHVzaHNpZyAgICAobW5nX2hhbmRsZSAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW1ndHlwZSAgIGVTaWd0eXBlKTsKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3JlYWRfcHVzaGNodW5rICAobW5nX2hhbmRsZSAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcHRyICAgICAgIHBDaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3NpemVfdCAgICBpTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfYm9vbCAgICAgIGJUYWtlb3duZXJzaGlwKTsKKyNlbmRpZgorCisvKiBoaWdoLWxldmVsIHdyaXRlICYgY3JlYXRlIGZ1bmN0aW9ucyAqLworLyogdXNlIHRoaXMgaWYgeW91IHdhbnQgdG8gd3JpdGUgYSBwcmV2aW91c2x5IHJlYWQgTmV0d29yayBHcmFwaGljIG9yCisgICBpZiB5b3Ugd2FudCB0byBjcmVhdGUgYSBuZXcgZ3JhcGhpYyBhbmQgd3JpdGUgaXQgKi8KKy8qIHRvIHdyaXRlIGEgcHJldmlvdXNseSByZWFkIGdyYXBoaWMgeW91IG11c3QgaGF2ZSBkZWZpbmVkIE1OR19TVE9SRV9DSFVOS1MgKi8KKy8qIHRvIGNyZWF0ZSBhIG5ldyBncmFwaGljIHlvdSdsbCBhbHNvIG5lZWQgYWNjZXNzIHRvIHRoZSBjaHVua3MKKyAgIChlZy4gI2RlZmluZSBNTkdfQUNDRVNTX0NIVU5LUyAhKSAqLworI2lmZGVmIE1OR19TVVBQT1JUX1dSSVRFCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ193cml0ZSAgICAgICAgICAgKG1uZ19oYW5kbGUgICAgaEhhbmRsZSk7CitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19jcmVhdGUgICAgICAgICAgKG1uZ19oYW5kbGUgICAgaEhhbmRsZSk7CisjZW5kaWYKKworLyogaGlnaC1sZXZlbCBkaXNwbGF5IGZ1bmN0aW9ucyAqLworLyogdXNlIHRoZXNlIHRvIGRpc3BsYXkgYSBwcmV2aW91c2x5IHJlYWQgb3IgY3JlYXRlZCBncmFwaGljIG9yCisgICB0byByZWFkICYgZGlzcGxheSBhIGdyYXBoaWMgc2ltdWx0YW5lb3VzbHkgKi8KKy8qIG1uZ19kaXNwbGF5X3Jlc3VtZSBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIGEgdGltZXItaW50ZXJ2YWwKKyAgIGV4cGlyZXMgdGhhdCB3YXMgc2V0IHRocm91Z2ggdGhlIHNldHRpbWVyLWNhbGxiYWNrLCBhZnRlciBhCisgICByZWFkIHN1c3BlbnNpb24tYnJlYWssIG9yLCB0byByZXN1bWUgYW4gYW5pbWF0aW9uIGFmdGVyIGEgY2FsbAorICAgdG8gbW5nX2Rpc3BsYXlfZnJlZXplL21uZ19kaXNwbGF5X3Jlc2V0ICovCisvKiBtbmdfZGlzcGxheV9mcmVlemUgdGhydSBtbmdfZGlzcGxheV9nb3RpbWUgY2FuIGJlIHVzZWQgdG8gaW5mbHVlbmNlCisgICB0aGUgZGlzcGxheSBvZiBhbiBpbWFnZSwgQlVUIE9OTFkgaWYgaXQgaGFzIGJlZW4gY29tcGxldGVseSByZWFkISAqLworI2lmZGVmIE1OR19TVVBQT1JUX0RJU1BMQVkKKyNpZmRlZiBNTkdfU1VQUE9SVF9SRUFECitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19yZWFkZGlzcGxheSAgICAgKG1uZ19oYW5kbGUgICAgaEhhbmRsZSk7CisjZW5kaWYKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX2Rpc3BsYXkgICAgICAgICAobW5nX2hhbmRsZSAgICBoSGFuZGxlKTsKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX2Rpc3BsYXlfcmVzdW1lICAobW5nX2hhbmRsZSAgICBoSGFuZGxlKTsKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX2Rpc3BsYXlfZnJlZXplICAobW5nX2hhbmRsZSAgICBoSGFuZGxlKTsKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX2Rpc3BsYXlfcmVzZXQgICAobW5nX2hhbmRsZSAgICBoSGFuZGxlKTsKKyNpZm5kZWYgTU5HX05PX0RJU1BMQVlfR09fU1VQUE9SVEVECitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19kaXNwbGF5X2dvZnJhbWUgKG1uZ19oYW5kbGUgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICBpRnJhbWVucik7CitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19kaXNwbGF5X2dvbGF5ZXIgKG1uZ19oYW5kbGUgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICBpTGF5ZXJucik7CitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19kaXNwbGF5X2dvdGltZSAgKG1uZ19oYW5kbGUgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICBpUGxheXRpbWUpOworI2VuZGlmCisjZW5kaWYgLyogTU5HX1NVUFBPUlRfRElTUExBWSAqLworCisvKiBldmVudCBwcm9jZXNzaW5nIGZ1bmN0aW9uICovCisvKiB0aGlzIG5lZWRzIHRvIGJlIGNhbGxlZCBieSB0aGUgYXBwIHdoZW4gZHluYW1pYyBNTkcgaXMgZW5hYmxlZCBhbmQKKyAgIGEgc3BlY2lmaWMgZXZlbnQgb2NjdXJzIGluIHRoZSB1c2VyLWludGVyZmFjZSAqLworI2lmIGRlZmluZWQoTU5HX1NVUFBPUlRfRElTUExBWSkgJiYgZGVmaW5lZChNTkdfU1VQUE9SVF9EWU5BTUlDTU5HKQorTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfdHJhcGV2ZW50ICAgICAgIChtbmdfaGFuZGxlICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgaUV2ZW50dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICAgICBpWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICAgICBpWSk7CisjZW5kaWYKKworLyogZXJyb3IgcmVwb3J0aW5nIGZ1bmN0aW9uICovCisvKiB1c2UgdGhpcyBpZiB5b3UgbmVlZCBtb3JlIGRldGFpbGVkIGluZm8gb24gdGhlIGxhc3QgZXJyb3IgKi8KKy8qIGlFeHRyYTEgJiBpRXh0cmEyIG1heSBjb250YWluIGVycm9yY29kZXMgZnJvbSB6bGliLCBqcGVnLCBldGMuLi4gKi8KKy8qIHpFcnJvcnRleHQgd2lsbCBvbmx5IGJlIGZpbGxlZCBpZiB5b3UgI2RlZmluZSBNTkdfRVJST1JfVEVMTFRBTEUgKi8KK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX2dldGxhc3RlcnJvciAgICAobW5nX2hhbmRsZSAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50OCogICAgIGlTZXZlcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2NodW5raWQqICBpQ2h1bmtuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyKiAgIGlDaHVua3NlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyKiAgICBpRXh0cmExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIqICAgIGlFeHRyYTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wY2hhciogICAgekVycm9ydGV4dCk7CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgQ2FsbGJhY2sgc2V0IGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisvKiBtZW1vcnkgY2FsbGJhY2tzICovCisvKiBjYWxsZWQgdG8gYWxsb2NhdGUgYW5kIHJlbGVhc2UgaW50ZXJuYWwgZGF0YXN0cnVjdHVyZXMgKi8KKyNpZm5kZWYgTU5HX0lOVEVSTkFMX01FTU1OR01UCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19zZXRjYl9tZW1hbGxvYyAgICAgIChtbmdfaGFuZGxlICAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX21lbWFsbG9jICAgICAgZlByb2MpOworTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfc2V0Y2JfbWVtZnJlZSAgICAgICAobW5nX2hhbmRsZSAgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19tZW1mcmVlICAgICAgIGZQcm9jKTsKKyNlbmRpZiAvKiBNTkdfSU5URVJOQUxfTUVNTU5HTVQgKi8KKworLyogb3Blbi0gJiBjbG9zZS1zdHJlYW0gY2FsbGJhY2tzICovCisvKiBjYWxsZWQgdG8gb3BlbiAmIGNsb3NlIHN0cmVhbXMgZm9yIGlucHV0IG9yIG91dHB1dCAqLworI2lmIGRlZmluZWQoTU5HX1NVUFBPUlRfUkVBRCkgfHwgZGVmaW5lZChNTkdfU1VQUE9SVF9XUklURSkKKyNpZm5kZWYgTU5HX05PX09QRU5fQ0xPU0VfU1RSRUFNCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19zZXRjYl9vcGVuc3RyZWFtICAgIChtbmdfaGFuZGxlICAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX29wZW5zdHJlYW0gICAgZlByb2MpOworTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfc2V0Y2JfY2xvc2VzdHJlYW0gICAobW5nX2hhbmRsZSAgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19jbG9zZXN0cmVhbSAgIGZQcm9jKTsKKyNlbmRpZgorI2VuZGlmCisKKy8qIHJlYWQgY2FsbGJhY2sgKi8KKy8qIGNhbGxlZCB0byBnZXQgZGF0YSBmcm9tIHRoZSBpbnB1dHN0cmVhbSAqLworI2lmZGVmIE1OR19TVVBQT1JUX1JFQUQKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3NldGNiX3JlYWRkYXRhICAgICAgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcmVhZGRhdGEgICAgICBmUHJvYyk7CisjZW5kaWYKKworLyogd3JpdGUgY2FsbGJhY2sgKi8KKy8qIGNhbGxlZCB0byBwdXQgZGF0YSBpbnRvIHRoZSBvdXRwdXRzdHJlYW0gKi8KKyNpZmRlZiBNTkdfU1VQUE9SVF9XUklURQorTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfc2V0Y2Jfd3JpdGVkYXRhICAgICAobW5nX2hhbmRsZSAgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ193cml0ZWRhdGEgICAgIGZQcm9jKTsKKyNlbmRpZgorCisvKiBlcnJvciBjYWxsYmFjayAqLworLyogY2FsbGVkIHdoZW4gYW4gZXJyb3Igb2NjdXJzICovCisvKiB0aGUgYXBwbGljYXRpb24gY2FuIGRldGVybWluZSBpZiB0aGUgZXJyb3IgaXMgcmVjb3ZlcmFibGUsCisgICBhbmQgbWF5IGluZm9ybSB0aGUgbGlicmFyeSBieSBzZXR0aW5nIHNwZWNpZmljIHJldHVybmNvZGVzICovCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19zZXRjYl9lcnJvcnByb2MgICAgIChtbmdfaGFuZGxlICAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2Vycm9ycHJvYyAgICAgZlByb2MpOworCisvKiB0cmFjZSBjYWxsYmFjayAqLworLyogY2FsbGVkIHRvIHNob3cgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgZnVuY3Rpb24gKi8KKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfc2V0Y2JfdHJhY2Vwcm9jICAgICAobW5nX2hhbmRsZSAgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ190cmFjZXByb2MgICAgIGZQcm9jKTsKKyNlbmRpZgorCisvKiBjYWxsYmFja3MgZm9yIHJlYWQgcHJvY2Vzc2luZyAqLworLyogcHJvY2Vzc2hlYWRlciBpcyBjYWxsZWQgd2hlbiBhbGwgaGVhZGVyIGluZm9ybWF0aW9uIGhhcyBiZWVuIGdhdGhlcmVkCisgICBmcm9tIHRoZSBpbnB1dHN0cmVhbSAqLworLyogcHJvY2Vzc3RleHQgaXMgY2FsbGVkIGZvciBldmVyeSB0RVh0LCB6VFh0IGFuZCBpVFh0IGNodW5rIGluIHRoZQorICAgaW5wdXRzdHJlYW0gKGlUeXBlPTAgZm9yIHRFWHQsIDEgZm9yIHpUWHQgYW5kIDIgZm9yIGlUWHQpOworICAgeW91IGNhbiBjYWxsIGdldF9pbWFnZWxldmVsIHRvIGNoZWNrIGF0IHdoYXQgbmVzdGluZy1sZXZlbCB0aGUgY2h1bmsgaXMKKyAgIGVuY291bnRlcmVkIChlZy4gdEVYdCBpbnNpZGUgYW4gZW1iZWRkZWQgaW1hZ2UgaW5zaWRlIGEgTU5HIC0+IGxldmVsID09IDI7CisgICAgICAgICAgICAgICAgaW4gbW9zdCBvdGhlciBjYXNlIC0+IGxldmVsID09IDEpICovCisvKiBwcm9jZXNzc2F2ZSAmIHByb2Nlc3NzZWVrIGFyZSBjYWxsZWQgZm9yIFNBVkUvU0VFSyBjaHVua3MgKi8KKy8qIHByb2Nlc3NuZWVkIGlzIGNhbGxlZCBmb3IgdGhlIG5FRUQgY2h1bms7IHlvdSBzaG91bGQgc3BlY2lmeSBhIGNhbGxiYWNrCisgICBmb3IgdGhpcyBhcyB0aGUgZGVmYXVsdCBiZWhhdmlvciB3aWxsIGJlIHRvIGFib3J0IHByb2Nlc3NpbmcsIHVubGVzcworICAgdGhlIHJlcXVpcmVtZW50IGlzIG9uZSBvZjoKKyAgIC0gYSBzdXBwb3J0ZWQgY2h1bmsKKyAgIC0gdGhlIHRleHQgImRyYWZ0IG5uIiB3aGVyZSBubiBpcyBhIG51bWVyaWMgdmFsdWUKKyAgIC0gdGhlIHRleHQgIk1ORy0xLjAiIG9yICJNTkctMS4xIgorICAgLSB0aGUgdGV4dCAiQ0FDSEVPRkYiICovCisvKiBwcm9jZXNzbWVuZCBpcyBjYWxsZWQgYXQgdGhlIHZlcnkgZW5kIG9mIHRoZSBhbmltYXRpb24tc3RyZWFtOworICAgbm90ZSB0aGF0IHRoaXMgbWF5IG5vdCBiZSB0aGUgZW5kIG9mIHRoZSBhbmltYXRpb24gdGhvdWdoISAqLworLyogcHJvY2Vzc3Rlcm0gaXMgY2FsbGVkIHdoZW4gYSBURVJNIGNodW5rIGlzIGVuY291bnRlcmVkOyB0aGVyZSBjYW4gYmUgb25seQorICAgMSBpbiB0aGUgc3RyZWFtIChvciBub25lKSAqLworLyogcHJvY2Vzc3Vua25vd24gaXMgY2FsbGVkIGFmdGVyIHJlYWRpbmcgZWFjaCBub24tY3JpdGljYWwgdW5rbm93biBjaHVuayAqLworI2lmZGVmIE1OR19TVVBQT1JUX1JFQUQKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3NldGNiX3Byb2Nlc3NoZWFkZXIgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcHJvY2Vzc2hlYWRlciBmUHJvYyk7CitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19zZXRjYl9wcm9jZXNzdGV4dCAgIChtbmdfaGFuZGxlICAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3Byb2Nlc3N0ZXh0ICAgZlByb2MpOworTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfc2V0Y2JfcHJvY2Vzc3NhdmUgICAobW5nX2hhbmRsZSAgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wcm9jZXNzc2F2ZSAgIGZQcm9jKTsKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3NldGNiX3Byb2Nlc3NzZWVrICAgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcHJvY2Vzc3NlZWsgICBmUHJvYyk7CitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19zZXRjYl9wcm9jZXNzbmVlZCAgIChtbmdfaGFuZGxlICAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3Byb2Nlc3NuZWVkICAgZlByb2MpOworTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfc2V0Y2JfcHJvY2Vzc21lbmQgICAobW5nX2hhbmRsZSAgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wcm9jZXNzbWVuZCAgIGZQcm9jKTsKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3NldGNiX3Byb2Nlc3N0ZXJtICAgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcHJvY2Vzc3Rlcm0gICBmUHJvYyk7CitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19zZXRjYl9wcm9jZXNzdW5rbm93bihtbmdfaGFuZGxlICAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3Byb2Nlc3N1bmtub3duIGZQcm9jKTsKKyNlbmRpZgorCisvKiBjYWxsYmFja3MgZm9yIGRpc3BsYXkgcHJvY2Vzc2luZyAqLworLyogZ2V0Y2FudmFzbGluZSBpcyBjYWxsZWQgdG8gZ2V0IGFuIGFjY2Vzcy1wb2ludGVyIHRvIGEgbGluZSBvbiB0aGUKKyAgIGRyYXdpbmctY2FudmFzICovCisvKiBnZXRia2dkbGluZSBpcyBjYWxsZWQgdG8gZ2V0IGFuIGFjY2Vzcy1wb2ludGVyIHRvIGEgbGluZSBmcm9tIHRoZQorICAgYmFja2dyb3VuZC1jYW52YXMgKi8KKy8qIHJlZnJlc2ggaXMgY2FsbGVkIHRvIGluZm9ybSB0aGUgR1VJIHRvIHJlZHJhdyB0aGUgY3VycmVudCBjYW52YXMgb250bworICAgaXRzIG91dHB1dCBkZXZpY2UgKGVnLiBpbiBXaW4zMiB0aGlzIHdvdWxkIG1lYW4gc2VuZGluZyBhbgorICAgaW52YWxpZGF0ZSBtZXNzYWdlIGZvciB0aGUgc3BlY2lmaWVkIHJlZ2lvbiAqLworLyogTk9URSB0aGF0IHRoZSB1cGRhdGUtcmVnaW9uIGlzIHNwZWNpZmllZCBhcyB4LHksd2lkdGgsaGVpZ2h0OyBlZy4gdGhlCisgICBpbnZhbGlkYXRlIG1lc3NhZ2UgZm9yIFdpbmRvd3MgcmVxdWlyZXMgbGVmdCx0b3AscmlnaHQsYm90dG9tIHBhcmFtZXRlcnMKKyAgIHdoZXJlIHRoZSBib3R0b20tcmlnaHQgaXMgZXhjbHVzaXZlIG9mIHRoZSByZWdpb24hIQorICAgdG8gZ2V0IHRoZXNlIGNvcnJlY3RseSBpcyBhcyBzaW1wbGUgYXM6CisgICBsZWZ0ICAgPSB4OworICAgdG9wICAgID0geTsKKyAgIHJpZ2h0ICA9IHggKyB3aWR0aDsKKyAgIGJvdHRvbSA9IHkgKyBoZWlnaHQ7CisgICBpZiB5b3VyIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIGluY2x1c2l2ZSBwb2ludHMsIHNpbXBseSBzdWJ0cmFjdCAxIGZyb20KKyAgIGJvdGggdGhlIHJpZ2h0ICYgYm90dG9tIHZhbHVlcyBjYWxjdWxhdGVkIGFib3ZlLgorICAgKi8KKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19zZXRjYl9nZXRjYW52YXNsaW5lIChtbmdfaGFuZGxlICAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2dldGNhbnZhc2xpbmUgZlByb2MpOworTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfc2V0Y2JfZ2V0YmtnZGxpbmUgICAobW5nX2hhbmRsZSAgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19nZXRia2dkbGluZSAgIGZQcm9jKTsKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3NldGNiX2dldGFscGhhbGluZSAgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfZ2V0YWxwaGFsaW5lICBmUHJvYyk7CitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19zZXRjYl9yZWZyZXNoICAgICAgIChtbmdfaGFuZGxlICAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3JlZnJlc2ggICAgICAgZlByb2MpOworCisvKiB0aW1pbmcgY2FsbGJhY2tzICovCisvKiBnZXR0aWNrY291bnQgaXMgY2FsbGVkIHRvIGdldCB0aGUgc3lzdGVtIHRpY2tjb3VudCAobWlsbGlzZWNvbmRzKTsKKyAgIHRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIHJlbWFpbmluZyBpbnRlcnZhbCBiZXR3ZWVuIGZyYW1lcyAqLworLyogc2V0dGltZXIgaXMgY2FsbGVkIHRvIGluZm9ybSB0aGUgYXBwbGljYXRpb24gdGhhdCBpdCBzaG91bGQgc2V0IGEgdGltZXI7CisgICB3aGVuIHRoZSB0aW1lciBpcyB0cmlnZ2VyZWQgdGhlIGFwcCBtdXN0IGNhbGwgbW5nX2Rpc3BsYXlfcmVzdW1lICovCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19zZXRjYl9nZXR0aWNrY291bnQgIChtbmdfaGFuZGxlICAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2dldHRpY2tjb3VudCAgZlByb2MpOworTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfc2V0Y2Jfc2V0dGltZXIgICAgICAobW5nX2hhbmRsZSAgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19zZXR0aW1lciAgICAgIGZQcm9jKTsKKworLyogY29sb3IgbWFuYWdlbWVudCBjYWxsYmFja3MgKi8KKy8qIGNhbGxlZCB0byB0cmFuc21pdCBjb2xvciBtYW5hZ2VtZW50IGluZm9ybWF0aW9uIHRvIHRoZSBhcHBsaWNhdGlvbiAqLworLyogdGhlc2UgYXJlIG9ubHkgdXNlZCB3aGVuIHlvdSAjZGVmaW5lIE1OR19BUFBfQ01TICovCisjaWZkZWYgTU5HX0FQUF9DTVMKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3NldGNiX3Byb2Nlc3NnYW1tYSAgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcHJvY2Vzc2dhbW1hICBmUHJvYyk7CitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19zZXRjYl9wcm9jZXNzY2hyb21hIChtbmdfaGFuZGxlICAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3Byb2Nlc3NjaHJvbWEgZlByb2MpOworTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfc2V0Y2JfcHJvY2Vzc3NyZ2IgICAobW5nX2hhbmRsZSAgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wcm9jZXNzc3JnYiAgIGZQcm9jKTsKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3NldGNiX3Byb2Nlc3NpY2NwICAgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcHJvY2Vzc2ljY3AgICBmUHJvYyk7CitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19zZXRjYl9wcm9jZXNzYXJvdyAgIChtbmdfaGFuZGxlICAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3Byb2Nlc3Nhcm93ICAgZlByb2MpOworI2VuZGlmIC8qIE1OR19BUFBfQ01TICovCisjZW5kaWYgLyogTU5HX1NVUFBPUlRfRElTUExBWSAqLworCisvKiByZWxlYXNlIHB1c2ggZGF0YSBjYWxsYmFjayAqLworLyogdXNlZCB3aGVuIHRoZSBhcHAgcHVzaGVzIGRhdGEgaW50byBsaWJtbmcgKGFzIG9wcG9zZWQgdG8gbGlibW5nIHB1bGxpbmcgaXQpCisgICBhbmQgcmVsaW5xdWlzaGVzIG93bmVyc2hpcCBvZiB0aGUgcHVzaGVkIGRhdGEtYnVmZmVyLCBidXQgKmRvZXMqIHdhbnQgdG8KKyAgIHJlbGVhc2UgKGZyZWUpIHRoZSBidWZmZXIgaXRzZWxmIG9uY2UgbGlibW5nIGhhcyBmaW5pc2hlZCBwcm9jZXNzaW5nIGl0ICovCisjaWZkZWYgTU5HX1NVUFBPUlRfUkVBRAorTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfc2V0Y2JfcmVsZWFzZWRhdGEgICAobW5nX2hhbmRsZSAgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19yZWxlYXNlZGF0YSAgIGZQcm9jKTsKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogIENhbGxiYWNrIGdldCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworLyogc2VlIF9zZXRjYl8gKi8KKyNpZm5kZWYgTU5HX0lOVEVSTkFMX01FTU1OR01UCitNTkdfRVhUIG1uZ19tZW1hbGxvYyAgICAgIE1OR19ERUNMIG1uZ19nZXRjYl9tZW1hbGxvYyAgICAgIChtbmdfaGFuZGxlIGhIYW5kbGUpOworTU5HX0VYVCBtbmdfbWVtZnJlZSAgICAgICBNTkdfREVDTCBtbmdfZ2V0Y2JfbWVtZnJlZSAgICAgICAobW5nX2hhbmRsZSBoSGFuZGxlKTsKKyNlbmRpZgorCisvKiBzZWUgX3NldGNiXyAqLworI2lmZGVmIE1OR19TVVBQT1JUX1JFQUQKK01OR19FWFQgbW5nX3JlbGVhc2VkYXRhICAgTU5HX0RFQ0wgbW5nX2dldGNiX3JlbGVhc2VkYXRhICAgKG1uZ19oYW5kbGUgaEhhbmRsZSk7CisjZW5kaWYKKworLyogc2VlIF9zZXRjYl8gKi8KKyNpZiBkZWZpbmVkKE1OR19TVVBQT1JUX1JFQUQpIHx8IGRlZmluZWQoTU5HX1dSSVRFX1NVUFBPUlQpCisjaWZuZGVmIE1OR19OT19PUEVOX0NMT1NFX1NUUkVBTQorTU5HX0VYVCBtbmdfb3BlbnN0cmVhbSAgICBNTkdfREVDTCBtbmdfZ2V0Y2Jfb3BlbnN0cmVhbSAgICAobW5nX2hhbmRsZSBoSGFuZGxlKTsKK01OR19FWFQgbW5nX2Nsb3Nlc3RyZWFtICAgTU5HX0RFQ0wgbW5nX2dldGNiX2Nsb3Nlc3RyZWFtICAgKG1uZ19oYW5kbGUgaEhhbmRsZSk7CisjZW5kaWYKKyNlbmRpZgorCisvKiBzZWUgX3NldGNiXyAqLworI2lmZGVmIE1OR19TVVBQT1JUX1JFQUQKK01OR19FWFQgbW5nX3JlYWRkYXRhICAgICAgTU5HX0RFQ0wgbW5nX2dldGNiX3JlYWRkYXRhICAgICAgKG1uZ19oYW5kbGUgaEhhbmRsZSk7CisjZW5kaWYKKworLyogc2VlIF9zZXRjYl8gKi8KKyNpZmRlZiBNTkdfU1VQUE9SVF9XUklURQorTU5HX0VYVCBtbmdfd3JpdGVkYXRhICAgICBNTkdfREVDTCBtbmdfZ2V0Y2Jfd3JpdGVkYXRhICAgICAobW5nX2hhbmRsZSBoSGFuZGxlKTsKKyNlbmRpZgorCisvKiBzZWUgX3NldGNiXyAqLworTU5HX0VYVCBtbmdfZXJyb3Jwcm9jICAgICBNTkdfREVDTCBtbmdfZ2V0Y2JfZXJyb3Jwcm9jICAgICAobW5nX2hhbmRsZSBoSGFuZGxlKTsKKworLyogc2VlIF9zZXRjYl8gKi8KKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorTU5HX0VYVCBtbmdfdHJhY2Vwcm9jICAgICBNTkdfREVDTCBtbmdfZ2V0Y2JfdHJhY2Vwcm9jICAgICAobW5nX2hhbmRsZSBoSGFuZGxlKTsKKyNlbmRpZgorCisvKiBzZWUgX3NldGNiXyAqLworI2lmZGVmIE1OR19TVVBQT1JUX1JFQUQKK01OR19FWFQgbW5nX3Byb2Nlc3NoZWFkZXIgTU5HX0RFQ0wgbW5nX2dldGNiX3Byb2Nlc3NoZWFkZXIgKG1uZ19oYW5kbGUgaEhhbmRsZSk7CitNTkdfRVhUIG1uZ19wcm9jZXNzdGV4dCAgIE1OR19ERUNMIG1uZ19nZXRjYl9wcm9jZXNzdGV4dCAgIChtbmdfaGFuZGxlIGhIYW5kbGUpOworTU5HX0VYVCBtbmdfcHJvY2Vzc3NhdmUgICBNTkdfREVDTCBtbmdfZ2V0Y2JfcHJvY2Vzc3NhdmUgICAobW5nX2hhbmRsZSBoSGFuZGxlKTsKK01OR19FWFQgbW5nX3Byb2Nlc3NzZWVrICAgTU5HX0RFQ0wgbW5nX2dldGNiX3Byb2Nlc3NzZWVrICAgKG1uZ19oYW5kbGUgaEhhbmRsZSk7CitNTkdfRVhUIG1uZ19wcm9jZXNzbmVlZCAgIE1OR19ERUNMIG1uZ19nZXRjYl9wcm9jZXNzbmVlZCAgIChtbmdfaGFuZGxlIGhIYW5kbGUpOworTU5HX0VYVCBtbmdfcHJvY2Vzc3Vua25vd24gTU5HX0RFQ0wgbW5nX2dldGNiX3Byb2Nlc3N1bmtub3duIChtbmdfaGFuZGxlIGhIYW5kbGUpOworTU5HX0VYVCBtbmdfcHJvY2Vzc3Rlcm0gICBNTkdfREVDTCBtbmdfZ2V0Y2JfcHJvY2Vzc3Rlcm0gICAobW5nX2hhbmRsZSBoSGFuZGxlKTsKKyNlbmRpZgorCisvKiBzZWUgX3NldGNiXyAqLworI2lmZGVmIE1OR19TVVBQT1JUX0RJU1BMQVkKK01OR19FWFQgbW5nX2dldGNhbnZhc2xpbmUgTU5HX0RFQ0wgbW5nX2dldGNiX2dldGNhbnZhc2xpbmUgKG1uZ19oYW5kbGUgaEhhbmRsZSk7CitNTkdfRVhUIG1uZ19nZXRia2dkbGluZSAgIE1OR19ERUNMIG1uZ19nZXRjYl9nZXRia2dkbGluZSAgIChtbmdfaGFuZGxlIGhIYW5kbGUpOworTU5HX0VYVCBtbmdfZ2V0YWxwaGFsaW5lICBNTkdfREVDTCBtbmdfZ2V0Y2JfZ2V0YWxwaGFsaW5lICAobW5nX2hhbmRsZSBoSGFuZGxlKTsKK01OR19FWFQgbW5nX3JlZnJlc2ggICAgICAgTU5HX0RFQ0wgbW5nX2dldGNiX3JlZnJlc2ggICAgICAgKG1uZ19oYW5kbGUgaEhhbmRsZSk7CisKKy8qIHNlZSBfc2V0Y2JfICovCitNTkdfRVhUIG1uZ19nZXR0aWNrY291bnQgIE1OR19ERUNMIG1uZ19nZXRjYl9nZXR0aWNrY291bnQgIChtbmdfaGFuZGxlIGhIYW5kbGUpOworTU5HX0VYVCBtbmdfc2V0dGltZXIgICAgICBNTkdfREVDTCBtbmdfZ2V0Y2Jfc2V0dGltZXIgICAgICAobW5nX2hhbmRsZSBoSGFuZGxlKTsKKworLyogc2VlIF9zZXRjYl8gKi8KKyNpZmRlZiBNTkdfQVBQX0NNUworTU5HX0VYVCBtbmdfcHJvY2Vzc2dhbW1hICBNTkdfREVDTCBtbmdfZ2V0Y2JfcHJvY2Vzc2dhbW1hICAobW5nX2hhbmRsZSBoSGFuZGxlKTsKK01OR19FWFQgbW5nX3Byb2Nlc3NjaHJvbWEgTU5HX0RFQ0wgbW5nX2dldGNiX3Byb2Nlc3NjaHJvbWEgKG1uZ19oYW5kbGUgaEhhbmRsZSk7CitNTkdfRVhUIG1uZ19wcm9jZXNzc3JnYiAgIE1OR19ERUNMIG1uZ19nZXRjYl9wcm9jZXNzc3JnYiAgIChtbmdfaGFuZGxlIGhIYW5kbGUpOworTU5HX0VYVCBtbmdfcHJvY2Vzc2ljY3AgICBNTkdfREVDTCBtbmdfZ2V0Y2JfcHJvY2Vzc2ljY3AgICAobW5nX2hhbmRsZSBoSGFuZGxlKTsKK01OR19FWFQgbW5nX3Byb2Nlc3Nhcm93ICAgTU5HX0RFQ0wgbW5nX2dldGNiX3Byb2Nlc3Nhcm93ICAgKG1uZ19oYW5kbGUgaEhhbmRsZSk7CisjZW5kaWYgLyogTU5HX0FQUF9DTVMgKi8KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgUHJvcGVydHkgc2V0IGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisvKiBBcHBsaWNhdGlvbiBkYXRhIHBvaW50ZXIgKi8KKy8qIHByb3ZpZGVkIGZvciBhcHBsaWNhdGlvbiB1c2U7IG5vdCB1c2VkIGJ5IHRoZSBsaWJyYXJ5ICovCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19zZXRfdXNlcmRhdGEgICAgICAgIChtbmdfaGFuZGxlICAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3B0ciAgICAgICAgICAgcFVzZXJkYXRhKTsKKworLyogVGhlIHN0eWxlIG9mIHRoZSBkcmF3aW5nLSAmIGJhY2tncm91bmQtY2FudmFzICovCisvKiBvbmx5IHVzZWQgZm9yIGRpc3BsYXlpbmcgaW1hZ2VzICovCisvKiBib3RoIGFyZSBpbml0aWFsbHkgc2V0IHRvIDI0LWJpdCBSR0IgKGVnLiA4LWJpdCBwZXIgY2hhbm5lbCkgKi8KK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3NldF9jYW52YXNzdHlsZSAgICAgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpU3R5bGUpOworTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfc2V0X2JrZ2RzdHlsZSAgICAgICAobW5nX2hhbmRsZSAgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlTdHlsZSk7CisKKy8qIFRoZSBkZWZhdWx0IGJhY2tncm91bmQgY29sb3IgKi8KKy8qIG9ubHkgdXNlZCBpZiB0aGUgZ2V0YmtnZGxpbmUgY2FsbGJhY2sgaXMgbm90IGRlZmluZWQgKi8KKy8qIGZvciBpbml0aWFsbHkgcGFpbnRpbmcgdGhlIGNhbnZhcyBhbmQgcmVzdG9yaW5nIChwYXJ0IG9mKSB0aGUgYmFja2dyb3VuZCAqLworTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfc2V0X2JnY29sb3IgICAgICAgICAobW5nX2hhbmRsZSAgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgIGlSZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICBpR3JlZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICBpQmx1ZSk7CisKKy8qIEluZGljYXRlcyBwcmVmZXJyZWQgdXNlIG9mIHRoZSBiS0dEIGNodW5rIGZvciBQTkcgaW1hZ2VzICovCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19zZXRfdXNlYmtnZCAgICAgICAgIChtbmdfaGFuZGxlICAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICAgYlVzZUJLR0QpOworCisvKiBJbmRpY2F0ZXMgc3RvcmFnZSBvZiByZWFkIGNodW5rcyAqLworLyogb25seSB1c2VmdWwgaWYgeW91ICNkZWZpbmUgbW5nX3N0b3JlX2NodW5rcyAqLworLyogY2FuIGJlIHVzZWQgdG8gZHluYW1pY2FsbHkgY2hhbmdlIHN0b3JhZ2UgbWFuYWdlbWVudCAqLworTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfc2V0X3N0b3JlY2h1bmtzICAgICAobW5nX2hhbmRsZSAgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJTdG9yZWNodW5rcyk7CisKKy8qIEluZGljYXRlcyBicmVha3MgcmVxdWVzdGVkIHdoZW4gcHJvY2Vzc2luZyBTQVZFL1NFRUsgKi8KKy8qIHNldCB0aGlzIHRvIGxldCB0aGUgYXBwIGhhbmRsZSBzZWN0aW9uIGJyZWFrczsgdGhlIGxpYnJhcnkgd2lsbCByZXR1cm4KKyAgIE1OR19ORUVEU0VDVElPTldBSVQgcmV0dXJuLWNvZGVzIGZvciBlYWNoIFNFRUsgY2h1bmsgKi8KK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3NldF9zZWN0aW9uYnJlYWtzICAgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICBiU2VjdGlvbmJyZWFrcyk7CisKKy8qIEluZGljYXRlcyBzdG9yYWdlIG9mIHBsYXliYWNrIGluZm8gKE9OIGJ5IGRlZmF1bHQhKSAqLworLyogY2FuIGJlIHVzZWQgdG8gdHVybiBvZmYgY2FjaGluZyBvZiBwbGF5YmFjayBpbmZvOyB0aGlzIGlzIHVzZWZ1bCB0bworICAgc3BlY2lmaWNhbGx5IG9wdGltaXplIE1ORy12aWRlbyBwbGF5YmFjazsgbm90ZSB0aGF0IGlmIGNhY2hpbmcgaXMgdHVybmVkIG9mZgorICAgTE9PUCBjaHVua3Mgd2lsbCBiZSBmbGFnZ2VkIGFzIGVycm9ycyEgVEVSTSBjaHVua3Mgd2lsbCBiZSBpZ25vcmVkIGFuZCBvbmx5CisgICBwYXNzZWQgdG8gdGhlIHByb2Nlc3N0ZXJtKCkgY2FsbGJhY2sgaWYgaXQgaXMgZGVmaW5lZCBieSB0aGUgYXBwOyBhbHNvLCB0aGlzCisgICBmZWF0dXJlIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBtbmdfcmVhZGRpc3BsYXkoKTsgbW5nX3JlYWQoKSwKKyAgIG1uZ19kaXNwbGF5X3Jlc2V0KCkgYW5kIG1uZ19kaXNwbGF5X2dveHh4eCgpIHdpbGwgcmV0dXJuIGFuIGVycm9yOworICAgb25jZSB0aGlzIG9wdGlvbiBpcyB0dXJuZWQgb2ZmIGl0IGNhbid0IGJlIHR1cm5lZCBvbiBmb3IgdGhlIHNhbWUgc3RyZWFtISEhICovCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19zZXRfY2FjaGVwbGF5YmFjayAgIChtbmdfaGFuZGxlICAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICAgYkNhY2hlcGxheWJhY2spOworCisvKiBJbmRpY2F0ZXMgYXV0b21hdGljIHByb2dyZXNzaXZlIHJlZnJlc2hlcyBmb3IgbGFyZ2UgaW1hZ2VzIChPTiBieSBkZWZhdWx0ISkgKi8KKy8qIHR1cm4gdGhpcyBvZmYgaWYgeW91IGRvIG5vdCB3YW50IGludGVybWl0dGVudCBwYWludGluZyB3aGlsZSBhIGxhcmdlIGltYWdlCisgICBpcyBiZWluZyByZWFkLiB1c2VmdWwgaWYgdGhlIGlucHV0LXN0cmVhbSBjb21lcyBmcm9tIGEgZmFzdCBtZWRpdW0sIHN1Y2gKKyAgIGFzIGEgbG9jYWwgaGFyZGRpc2sgKi8KK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3NldF9kb3Byb2dyZXNzaXZlICAgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICBiRG9Qcm9ncmVzc2l2ZSk7CisKKy8qIEluZGljYXRlcyBleGlzdGVuY2UgYW5kIHJlcXVpcmVkIGNoZWNraW5nIG9mIHRoZSBDUkMgaW4gaW5wdXQgc3RyZWFtcywKKyAgIGFuZCBnZW5lcmF0aW9uIGluIG91dHB1dCBzdHJlYW1zICovCisvKiAhISEhIFVzZSB0aGlzIE9OTFkgaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nICEhISEgKi8KKy8qIFRoZSB2YWx1ZSBpcyBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgZmxhZ3M6CisgICAweDAwMDAwMDEgPSBDUkMgaXMgcHJlc2VudCBpbiB0aGUgaW5wdXQgc3RyZWFtCisgICAweDAwMDAwMDIgPSBDUkMgbXVzdCBiZSBnZW5lcmF0ZWQgaW4gdGhlIG91dHB1dCBzdHJlYW0KKyAgIDB4MDAwMDAxMCA9IENSQyBzaG91bGQgYmUgY2hlY2tlZCBmb3IgYW5jaWxsYXJ5IGNodW5rcworICAgMHgwMDAwMDIwID0gYSBmYXVsdHkgQ1JDIGZvciBhbmNpbGxhcnkgY2h1bmtzIGdlbmVyYXRlcyBhIHdhcm5pbmcgb25seQorICAgMHgwMDAwMDQwID0gYSBmYXVsdHkgQ1JDIGZvciBhbmNpbGxhcnkgY2h1bmtzIGdlbmVyYXRlcyBhbiBlcnJvcgorICAgMHgwMDAwMTAwID0gQ1JDIHNob3VsZCBiZSBjaGVja2VkIGZvciBjcml0aWNhbCBjaHVua3MKKyAgIDB4MDAwMDIwMCA9IGEgZmF1bHR5IENSQyBmb3IgY3JpdGljYWwgY2h1bmtzIGdlbmVyYXRlcyBhIHdhcm5pbmcgb25seQorICAgMHgwMDAwNDAwID0gYSBmYXVsdHkgQ1JDIGZvciBjcml0aWNhbCBjaHVua3MgZ2VuZXJhdGVzIGFuIGVycm9yCisKKyAgIFRoZSBkZWZhdWx0IGlzIDB4MDAwMDA1MzMgPSBDUkMgcHJlc2VudCBpbiBpbnB1dCBzdHJlYW1zOyBzaG91bGQgYmUgY2hlY2tlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nIGZvciBhbmNpbGxhcnkgY2h1bmtzOyBlcnJvciBmb3IgY3JpdGljYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHVua3M7IGdlbmVyYXRlIENSQyBmb3Igb3V0cHV0IHN0cmVhbXMKKworICAgTm90ZSB0aGF0IHNvbWUgY29tYmluYXRpb25zIGFyZSBtZWFuaW5nbGVzczsgZWcuIGlmIHRoZSBDUkMgaXMgbm90IHByZXNlbnQKKyAgIGl0IHdvbid0IGRvIGFueSBnb29kIHRvIHR1cm4gdGhlIGNoZWNraW5nIGZsYWdzIG9uOyBpZiBhIGNoZWNraW5nIGZsYWcKKyAgIGlzIG9mZiwgaXQgZG9lc24ndCBkbyBhbnkgZ29vZCB0byBhc2sgZm9yIGdlbmVyYXRpb24gb2Ygd2FybmluZ3Mgb3IgZXJyb3JzLgorICAgQWxzbyBsaWJtbmcgd2lsbCBnZW5lcmF0ZSBlaXRoZXIgYW4gZXJyb3Igb3IgYSB3YXJuaW5nLCBub3QgYm90aCwKKyAgIHNvIGlmIHlvdSBzcGVjaWZ5IGJvdGggdGhlIGRlZmF1bHQgd2lsbCBiZSB0byBnZW5lcmF0ZSBhbiBlcnJvciEKKyAgIFRoZSBvbmx5IHVzZWZ1bCBjb21iaW5hdGlvbnMgZm9yIGlucHV0IGFyZSAzMzEsIDU1MSwgMzUxLCA1MzEsIDAsIDMwMSwgNTAxCisgICBhbmQgb3B0aW9uYWxseSAwMzEgYW5kIDA1MSwgYnV0IG9ubHkgY2hlY2tpbmcgYW5jaWxsYXJ5IGNodW5rcyBhbmQgbm90CisgICBjcml0aWNhbCBjaHVua3MgaXMgZ2VuZXJhbGx5IG5vdCBhIHZlcnkgZ29vZCBpZGVhISEhCisgICBJZiB5b3UndmUgYWxzbyB3cml0aW5nIHRoZXNlIHZhbHVlcyBzaG91bGQgYmUgY29tYmluZWQgd2l0aCAweDAyIGlmCisgICBDUkMncyBhcmUgcmVxdWlyZWQgaW4gdGhlIG91dHB1dCBzdHJlYW0KKyAgICovCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19zZXRfY3JjbW9kZSAgICAgICAgIChtbmdfaGFuZGxlICAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaUNyY21vZGUpOworCisvKiBDb2xvci1tYW5hZ2VtZW50IG5lY2Vzc2FyaWVzICovCisvKgorICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgISEhISEhISEgVEhJUyBORVhUIEJJVCBJUyBJTVBPUlRBTlQgISEhISEhISEhCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgSWYgeW91IGhhdmUgZGVmaW5lZCBNTkdfRlVMTF9DTVMgKGFuZCBhcmUgdXNpbmcgbGNtcyksIHlvdSB3aWxsIGhhdmUgdG8KKyAgICB0aGluayBoYXJkIGFib3V0IHRoZSBmb2xsb3dpbmcgcm91dGluZXMuCisKKyAgICBsY21zIHJlcXVpcmVzIDIgcHJvZmlsZXMgdG8gd29yayBvZmYgdGhlIGRpZmZlcmVuY2VzIGluIHRoZSBpbnB1dC1pbWFnZQorICAgIGFuZCB0aGUgb3V0cHV0LWRldmljZS4gVGhlIElDQyBwcm9maWxlIGZvciB0aGUgaW5wdXQtaW1hZ2Ugd2lsbCBiZQorICAgIGVtYmVkZGVkIHdpdGhpbiBpdCB0byByZWZsZWN0IGl0cyBjb2xvci1jaGFyYWN0ZXJpc3RpY3MsIGJ1dCB0aGUgb3V0cHV0CisgICAgcHJvZmlsZSBkZXBlbmRzIG9uIHRoZSBvdXRwdXQtZGV2aWNlLCB3aGljaCBpcyBzb21ldGhpbmcgb25seSAqWU9VKiBrbm93CisgICAgYWJvdXQuIHNSR0IgKHN0YW5kYXJkIFJHQikgaXMgY29tbW9uIGZvciB4ODYgY29tcGF0aWJsZSBlbnZpcm9ubWVudHMKKyAgICAoZWcuIFdpbmRvd3MsIExpbnV4IGFuZCBzb21lIG90aGVycykKKworICAgIElmIHlvdSBhcmUgY29tcGlsaW5nIGZvciBhIHNSR0IgY29tcGxpYW50IHN5c3RlbSB5b3UgcHJvYmFibHkgd29uJ3QgaGF2ZQorICAgIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwuICh1bmxlc3MgeW91IHdhbnQgdG8gb2YgY291cnNlKQorCisgICAgSWYgeW91IGFyZSBjb21waWxpbmcgZm9yIGEgbm9uLXNSR0IgY29tcGxpYW50IHN5c3RlbQorICAgIChlZy4gU0dJLCBNYWMsIE5leHQsIG90aGVycy4uLikKKyAgICB5b3UgKk1VU1QqIGRlZmluZSBhIHByb3BlciBJQ0MgcHJvZmlsZSBmb3IgdGhlIGdlbmVyaWMgb3V0cHV0LWRldmljZQorICAgIGFzc29jaWF0ZWQgd2l0aCB0aGF0IHBsYXRmb3JtLgorCisgICAgSW4gZWl0aGVyIGV2ZW50LCB5b3UgbWF5IGFsc28gd2FudCB0byBvZmZlciBhbiBvcHRpb24gdG8geW91ciB1c2VycyB0bworICAgIHNldCB0aGUgcHJvZmlsZSBtYW51YWxseSwgb3IsIGlmIHlvdSBrbm93IGhvdywgc2V0IGl0IGZyb20gYQorICAgIHN5c3RlbS1kZWZpbmVkIGRlZmF1bHQuCisKKyAgICBUTyBSRUNBUDogZm9yIHNSR0Igc3lzdGVtcyAoV2luZG93cywgTGludXgpIG5vIGFjdGlvbiByZXF1aXJlZCEKKyAgICAgICAgICAgICAgZm9yIG5vbi1zUkdCIHN5c3RlbXMgKFNHSSwgTWFjLCBOZXh0KSBBQ1RJT04gUkVRVUlSRUQhCisKKyAgICBQbGVhc2UgdmlzaXQgaHR0cDovL3d3dy5zcmdiLmNvbSwgaHR0cDovL3d3dy5jb2xvci5vcmcgYW5kCisgICAgaHR0cDovL3d3dy5saXR0bGVjbXMuY29tIGZvciBtb3JlIGluZm8uCisKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICEhISEhISEhIFRIRSBCSVQgQUJPVkUgSVMgSU1QT1JUQU5UICEhISEhISEhIQorICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisvKiBtbmdfc2V0X3NyZ2IgdGVsbHMgbGlibW5nIGlmIGl0J3MgcnVubmluZyBvbiBhIHNSR0IgY29tcGxpYW50IHN5c3RlbSBvciBub3QKKyAgIHRoZSBkZWZhdWx0IGlzIGFscmVhZHkgc2V0IHRvIE1OR19UUlVFICovCisvKiBtbmdfc2V0X291dHB1dHByb2ZpbGUsIG1uZ19zZXRfb3V0cHV0cHJvZmlsZTIsIG1uZ19zZXRfb3V0cHV0c3JnYgorICAgYXJlIHVzZWQgdG8gc2V0IHRoZSBkZWZhdWx0IHByb2ZpbGUgZGVzY3JpYmluZyB0aGUgb3V0cHV0LWRldmljZQorICAgYnkgZGVmYXVsdCBpdCBpcyBhbHJlYWR5IGluaXRpYWxpemVkIHdpdGggYW4gc1JHQiBwcm9maWxlICovCisvKiBtbmdfc2V0X3NyZ2Jwcm9maWxlLCBtbmdfc2V0X3NyZ2Jwcm9maWxlMiwgbW5nX3NldF9zcmdiaW1wbGljaXQKKyAgIGFyZSB1c2VkIHRvIHNldCB0aGUgZGVmYXVsdCBwcm9maWxlIGRlc2NyaWJpbmcgYSBzdGFuZGFyZCBzUkdCIGRldmljZQorICAgdGhpcyBpcyB1c2VkIHdoZW4gdGhlIGlucHV0LWltYWdlIGlzIHRhZ2dlZCBvbmx5IGFzIGJlaW5nIHNSR0IsIGJ1dCB0aGUKKyAgIG91dHB1dC1kZXZpY2UgaXMgZGVmaW5lZCBhcyBub3QgYmVpbmcgc1JHQiBjb21wbGlhbnQKKyAgIGJ5IGRlZmF1bHQgaXQgaXMgYWxyZWFkeSBpbml0aWFsaXplZCB3aXRoIGEgc3RhbmRhcmQgc1JHQiBwcm9maWxlICovCisjaWYgZGVmaW5lZChNTkdfU1VQUE9SVF9ESVNQTEFZKQorTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfc2V0X3NyZ2IgICAgICAgICAgICAobW5nX2hhbmRsZSAgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJJc3NSR0IpOworTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfc2V0X291dHB1dHByb2ZpbGUgICAobW5nX2hhbmRsZSAgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wY2hhciAgICAgICAgIHpGaWxlbmFtZSk7CitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19zZXRfb3V0cHV0cHJvZmlsZTIgIChtbmdfaGFuZGxlICAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaVByb2ZpbGVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3B0ciAgICAgICAgICAgcFByb2ZpbGUpOworTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfc2V0X291dHB1dHNyZ2IgICAgICAobW5nX2hhbmRsZSAgICAgICAgaEhhbmRsZSk7CitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19zZXRfc3JnYnByb2ZpbGUgICAgIChtbmdfaGFuZGxlICAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3BjaGFyICAgICAgICAgekZpbGVuYW1lKTsKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3NldF9zcmdicHJvZmlsZTIgICAgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpUHJvZmlsZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcHRyICAgICAgICAgICBwUHJvZmlsZSk7CitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19zZXRfc3JnYmltcGxpY2l0ICAgIChtbmdfaGFuZGxlICAgICAgICBoSGFuZGxlKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChNTkdfRlVMTF9DTVMpIHx8IGRlZmluZWQoTU5HX0dBTU1BX09OTFkpIHx8IGRlZmluZWQoTU5HX0FQUF9DTVMpCisvKiBHYW1tYSBzZXR0aW5ncyAqLworLyogLi4uIGJsYWJsYSAoZXhwbGFpbiBnYW1tYSBwcm9jZXNzaW5nIGEgbGl0dGxlOyBlZy4gZm9ybXVsYSAmIHN0dWZmKSAuLi4gKi8KK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3NldF92aWV3Z2FtbWEgICAgICAgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfZmxvYXQgICAgICAgICBkR2FtbWEpOworTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfc2V0X2Rpc3BsYXlnYW1tYSAgICAobW5nX2hhbmRsZSAgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19mbG9hdCAgICAgICAgIGRHYW1tYSk7CitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19zZXRfZGZsdGltZ2dhbW1hICAgIChtbmdfaGFuZGxlICAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2Zsb2F0ICAgICAgICAgZEdhbW1hKTsKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3NldF92aWV3Z2FtbWFpbnQgICAgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpR2FtbWEpOworTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfc2V0X2Rpc3BsYXlnYW1tYWludCAobW5nX2hhbmRsZSAgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlHYW1tYSk7CitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19zZXRfZGZsdGltZ2dhbW1haW50IChtbmdfaGFuZGxlICAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaUdhbW1hKTsKKyNlbmRpZgorCisjaWZuZGVmIE1OR19TS0lQX01BWENBTlZBUworLyogVWx0aW1hdGUgY2xpcHBpbmcgc2l6ZSAqLworLyogdXNlZCB0byBsaW1pdCBleHRyZW1lIGdyYXBoaWNzIGZyb20gb3ZlcmxvYWRpbmcgdGhlIHN5c3RlbSAqLworLyogaWYgYSBncmFwaGljIGV4Y2VlZHMgdGhlc2UgbGltaXRzIGEgd2FybmluZyBpcyBpc3N1ZWQsIHdoaWNoIGNhbgorICAgYmUgaWdub3JlZCBieSB0aGUgYXBwICh1c2luZyB0aGUgZXJyb3Jwcm9jIGNhbGxiYWNrKS4gaW4gdGhhdCBjYXNlCisgICB0aGUgbGlicmFyeSB3aWxsIHVzZSB0aGVzZSBzZXR0aW5ncyB0byBjbGlwIHRoZSBpbnB1dCBncmFwaGljLCBhbmQKKyAgIHRoZSBhcHAncyBjYW52YXMgbXVzdCBhY2NvdW50IGZvciB0aGlzICovCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19zZXRfbWF4Y2FudmFzd2lkdGggIChtbmdfaGFuZGxlICAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaU1heHdpZHRoKTsKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3NldF9tYXhjYW52YXNoZWlnaHQgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpTWF4aGVpZ2h0KTsKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3NldF9tYXhjYW52YXNzaXplICAgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpTWF4d2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpTWF4aGVpZ2h0KTsKKyNlbmRpZgorCisvKiBaTElCIGRlZmF1bHQgY29tcHJlc3Npb24gcGFyYW1ldGVycyAqLworLyogdGhlc2UgYXJlIHVzZWQgd2hlbiB3cml0aW5nIG91dCBjaHVua3MgKi8KKy8qIHRoZXkgYXJlIGFsc28gdXNlZCB3aGVuIGNvbXByZXNzaW5nIFBORyBpbWFnZS1kYXRhIG9yIEpORyBhbHBoYS1kYXRhOworICAgaW4gdGhpcyBjYXNlIHlvdSBjYW4gc2V0IHRoZW0ganVzdCBiZWZvcmUgY2FsbGluZyBtbmdfcHV0aW1nZGF0YV9paGRyICovCisvKiBzZXQgdG8geW91ciBsaWtpbmc7IHVzdWFsbHkgdGhlIGRlZmF1bHRzIHdpbGwgc3VmZmljZSB0aG91Z2ghICovCisvKiBjaGVjayB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgWkxJQiBmb3IgZGV0YWlscyBvbiB0aGVzZSBwYXJhbWV0ZXJzICovCisjaWZkZWYgTU5HX0lOQ0xVREVfWkxJQgorTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfc2V0X3psaWJfbGV2ZWwgICAgICAobW5nX2hhbmRsZSAgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgIGlabGV2ZWwpOworTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfc2V0X3psaWJfbWV0aG9kICAgICAobW5nX2hhbmRsZSAgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgIGlabWV0aG9kKTsKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3NldF96bGliX3dpbmRvd2JpdHMgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgICAgICAgICBpWndpbmRvd2JpdHMpOworTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfc2V0X3psaWJfbWVtbGV2ZWwgICAobW5nX2hhbmRsZSAgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgIGlabWVtbGV2ZWwpOworTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfc2V0X3psaWJfc3RyYXRlZ3kgICAobW5nX2hhbmRsZSAgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgIGlac3RyYXRlZ3kpOworCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19zZXRfemxpYl9tYXhpZGF0ICAgIChtbmdfaGFuZGxlICAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaU1heElEQVQpOworI2VuZGlmIC8qIE1OR19JTkNMVURFX1pMSUIgKi8KKworLyogSk5HIGRlZmF1bHQgY29tcHJlc3Npb24gcGFyYW1ldGVycyAoYmFzZWQgb24gSUpHIGNvZGUpICovCisvKiB0aGVzZSBhcmUgdXNlZCB3aGVuIGNvbXByZXNzaW5nIEpORyBpbWFnZS1kYXRhOyBzbyB5b3UgY2FuIHNldCB0aGVtCisgICBqdXN0IGJlZm9yZSBjYWxsaW5nIG1uZ19wdXRpbWdkYXRhX2poZHIgKi8KKy8qIHNldCB0byB5b3VyIGxpa2luZzsgdXN1YWxseSB0aGUgZGVmYXVsdHMgd2lsbCBzdWZmaWNlIHRob3VnaCEgKi8KKy8qIGNoZWNrIHRoZSBkb2N1bWVudGF0aW9uIGZvciBJSkdTUkM2QiBmb3IgZGV0YWlscyBvbiB0aGVzZSBwYXJhbWV0ZXJzICovCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisjaWZkZWYgTU5HX0lOQ0xVREVfSUpHNkIKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3NldF9qcGVnX2RjdG1ldGhvZCAgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdqcGVnX2RjdG1ldGhvZCBlSlBFR2RjdG1ldGhvZCk7CisjZW5kaWYKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3NldF9qcGVnX3F1YWxpdHkgICAgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgICAgICAgICBpSlBFR3F1YWxpdHkpOworTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfc2V0X2pwZWdfc21vb3RoaW5nICAobW5nX2hhbmRsZSAgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgIGlKUEVHc21vb3RoaW5nKTsKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3NldF9qcGVnX3Byb2dyZXNzaXZlKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICBiSlBFR3Byb2dyZXNzaXZlKTsKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3NldF9qcGVnX29wdGltaXplZCAgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICBiSlBFR29wdGltaXplZCk7CisKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3NldF9qcGVnX21heGpkYXQgICAgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpTWF4SkRBVCk7CisjZW5kaWYgLyogTU5HX0lOQ0xVREVfSk5HICovCisKKy8qIFN1c3BlbnNpb24tbW9kZSBzZXR0aW5nICovCisvKiB1c2UgdGhpcyB0byBhY3RpdmF0ZSB0aGUgaW50ZXJuYWwgc3VzcGVuc2lvbi1idWZmZXIgdG8gaW1wcm92ZQorICAgcmVhZC1zdXNwZW5zaW9uIHByb2Nlc3NpbmcgKi8KKy8qIFRPRE86IHdyaXRlLXN1c3BlbnNpb24gPz8/ICovICAgCisjaWYgZGVmaW5lZChNTkdfU1VQUE9SVF9SRUFEKQorTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfc2V0X3N1c3BlbnNpb25tb2RlICAobW5nX2hhbmRsZSAgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJTdXNwZW5zaW9ubW9kZSk7CisjZW5kaWYKKworLyogU3BlZWQgc2V0dGluZyAqLworLyogdXNlIHRoaXMgdG8gaW5mbHVlbmNlIHRoZSBkaXNwbGF5LXNwZWVkIG9mIGFuaW1hdGlvbnMgKi8KKyNpZiBkZWZpbmVkKE1OR19TVVBQT1JUX0RJU1BMQVkpCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19zZXRfc3BlZWQgICAgICAgICAgIChtbmdfaGFuZGxlICAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3NwZWVkdHlwZSAgICAgaVNwZWVkKTsKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogIFByb3BlcnR5IGdldCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworLyogc2VlIF9zZXRfICovCitNTkdfRVhUIG1uZ19wdHIgICAgIE1OR19ERUNMIG1uZ19nZXRfdXNlcmRhdGEgICAgICAgIChtbmdfaGFuZGxlICAgICAgICBoSGFuZGxlKTsKKworLyogTmV0d29yayBHcmFwaGljIGhlYWRlciBkZXRhaWxzICovCisvKiB0aGVzZSBnZXQgZmlsbGVkIG9uY2UgdGhlIGdyYXBoaWNzIGhlYWRlciBpcyBwcm9jZXNzZWQsCisgICBzbyB0aGV5IGFyZSBhdmFpbGFibGUgaW4gdGhlIHByb2Nlc3NoZWFkZXIgY2FsbGJhY2s7IGJlZm9yZSB0aGF0CisgICB0aGV5IGFyZSB6ZXJvZWQgb3V0IGFuZCBpbWFnZXR5cGUgaXMgc2V0IHRvIGl0X3Vua25vd24gKi8KKy8qIHRoaXMgbWlnaHQgYmUgYSBnb29kIHBvaW50IGZvciB0aGUgYXBwIHRvIGluaXRpYWxpemUgdGhlIGRyYXdpbmctY2FudmFzISAqLworLyogbm90ZSB0aGF0IHNvbWUgZmllbGRzIGFyZSBvbmx5IHNldCBmb3IgdGhlIGZpcnN0KCEpIGhlYWRlci1jaHVuazoKKyAgIE1ORy9NSERSIChpbWFnZXR5cGUgPSBtbmdfaXRfbW5nKSAtIHRpY2tzIHRocnUgc2ltcGxpY2l0eQorICAgUE5HL0lIRFIgKGltYWdldHlwZSA9IG1uZ19pdF9wbmcpIC0gYml0ZGVwdGggdGhydSBpbnRlcmxhY2UKKyAgIEpORy9KSERSIChpbWFnZXR5cGUgPSBtbmdfaXRfam5nKSAtIGJpdGRlcHRoIHRocnUgY29tcHJlc3Npb24gJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJsYWNlIHRocnUgYWxwaGFpbnRlcmxhY2UgKi8KK01OR19FWFQgbW5nX2ltZ3R5cGUgTU5HX0RFQ0wgbW5nX2dldF9zaWd0eXBlICAgICAgICAgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUpOworTU5HX0VYVCBtbmdfaW1ndHlwZSBNTkdfREVDTCBtbmdfZ2V0X2ltYWdldHlwZSAgICAgICAobW5nX2hhbmRsZSAgICAgICAgaEhhbmRsZSk7CitNTkdfRVhUIG1uZ191aW50MzIgIE1OR19ERUNMIG1uZ19nZXRfaW1hZ2V3aWR0aCAgICAgIChtbmdfaGFuZGxlICAgICAgICBoSGFuZGxlKTsKK01OR19FWFQgbW5nX3VpbnQzMiAgTU5HX0RFQ0wgbW5nX2dldF9pbWFnZWhlaWdodCAgICAgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUpOworCitNTkdfRVhUIG1uZ191aW50MzIgIE1OR19ERUNMIG1uZ19nZXRfdGlja3MgICAgICAgICAgIChtbmdfaGFuZGxlICAgICAgICBoSGFuZGxlKTsKK01OR19FWFQgbW5nX3VpbnQzMiAgTU5HX0RFQ0wgbW5nX2dldF9mcmFtZWNvdW50ICAgICAgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUpOworTU5HX0VYVCBtbmdfdWludDMyICBNTkdfREVDTCBtbmdfZ2V0X2xheWVyY291bnQgICAgICAobW5nX2hhbmRsZSAgICAgICAgaEhhbmRsZSk7CitNTkdfRVhUIG1uZ191aW50MzIgIE1OR19ERUNMIG1uZ19nZXRfcGxheXRpbWUgICAgICAgIChtbmdfaGFuZGxlICAgICAgICBoSGFuZGxlKTsKK01OR19FWFQgbW5nX3VpbnQzMiAgTU5HX0RFQ0wgbW5nX2dldF9zaW1wbGljaXR5ICAgICAgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUpOworCitNTkdfRVhUIG1uZ191aW50OCAgIE1OR19ERUNMIG1uZ19nZXRfYml0ZGVwdGggICAgICAgIChtbmdfaGFuZGxlICAgICAgICBoSGFuZGxlKTsKK01OR19FWFQgbW5nX3VpbnQ4ICAgTU5HX0RFQ0wgbW5nX2dldF9jb2xvcnR5cGUgICAgICAgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUpOworTU5HX0VYVCBtbmdfdWludDggICBNTkdfREVDTCBtbmdfZ2V0X2NvbXByZXNzaW9uICAgICAobW5nX2hhbmRsZSAgICAgICAgaEhhbmRsZSk7CitNTkdfRVhUIG1uZ191aW50OCAgIE1OR19ERUNMIG1uZ19nZXRfZmlsdGVyICAgICAgICAgIChtbmdfaGFuZGxlICAgICAgICBoSGFuZGxlKTsKK01OR19FWFQgbW5nX3VpbnQ4ICAgTU5HX0RFQ0wgbW5nX2dldF9pbnRlcmxhY2UgICAgICAgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUpOworTU5HX0VYVCBtbmdfdWludDggICBNTkdfREVDTCBtbmdfZ2V0X2FscGhhYml0ZGVwdGggICAobW5nX2hhbmRsZSAgICAgICAgaEhhbmRsZSk7CitNTkdfRVhUIG1uZ191aW50OCAgIE1OR19ERUNMIG1uZ19nZXRfYWxwaGFjb21wcmVzc2lvbihtbmdfaGFuZGxlICAgICAgICBoSGFuZGxlKTsKK01OR19FWFQgbW5nX3VpbnQ4ICAgTU5HX0RFQ0wgbW5nX2dldF9hbHBoYWZpbHRlciAgICAgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUpOworTU5HX0VYVCBtbmdfdWludDggICBNTkdfREVDTCBtbmdfZ2V0X2FscGhhaW50ZXJsYWNlICAobW5nX2hhbmRsZSAgICAgICAgaEhhbmRsZSk7CisKKy8qIGluZGljYXRlcyB0aGUgcHJlZGljdGVkIGFscGhhLWRlcHRoIHJlcXVpcmVkIHRvIHByb3Blcmx5IGRpc3BsYXkgdGhlIGltYWdlICovCisvKiBnZXRzIHNldCBvbmNlIHRoZSBncmFwaGljcyBoZWFkZXIgaXMgcHJvY2Vzc2VkIGFuZCBpcyBhdmFpbGFibGUgaW4gdGhlCisgICBwcm9jZXNzaGVhZGVyIGNhbGxiYWNrIGZvciBhbnkgdHlwZSBvZiBpbnB1dC1pbWFnZSAoUE5HLCBKTkcgb3IgTU5HKSAqLworLyogcG9zc2libGUgdmFsdWVzIGFyZSAwLDEsMiw0LDgsMTYKKyAgIDAgID0gbm8gdHJhbnNwYXJlbmN5IHJlcXVpcmVkCisgICAxICA9IG9uL29mZiB0cmFuc3BhcmVuY3kgcmVxdWlyZWQgKGFscGhhLXZhbHVlcyBhcmUgMCBvciAyXmJpdF9kZXB0aC0xKQorICAgMisgPSBzZW1pLXRyYW5zcGFyZW5jeSByZXF1aXJlZCAodmFsdWVzIHdpbGwgYmUgc2NhbGVkIHRvIHRoZSBiaXRkZXB0aCBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhc3N0eWxlIHN1cHBsaWVkIGJ5IHRoZSBhcHBsaWNhdGlvbikgKi8KK01OR19FWFQgbW5nX3VpbnQ4ICAgTU5HX0RFQ0wgbW5nX2dldF9hbHBoYWRlcHRoICAgICAgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUpOworCisvKiBkZWZpbmVzIHdoZXRoZXIgYSByZWZyZXNoKCkgY2FsbGJhY2sgaXMgY2FsbGVkIGZvciBhbiBpbnRlcmxhY2UgcGFzcyAoUE5HKQorICAgb3IgcHJvZ3Jlc3NpdmUgc2NhbiAoSk5HKSAqLworLyogcmV0dXJucyB0aGUgaW50ZXJsYWNlIHBhc3MgbnVtYmVyIGZvciBQTkcgb3IgYSBmYWJyaWNhdGVkIHBhc3MgbnVtYmVyIGZvciBKTkc7CisgICByZXR1cm5zIDAgaW4gYWxsIG90aGVyIGNhc2VzICovCisvKiBvbmx5IHVzZWZ1bCBpZiB0aGUgaW1hZ2VfdHlwZSA9IG1uZ19pdF9wbmcgb3IgbW5nX2l0X2puZyBhbmQgaWYgdGhlIGltYWdlCisgICBpcyBhY3R1YWxseSBpbnRlcmxhY2VkIChQTkcpIG9yIHByb2dyZXNzaXZlIChKTkcpICovCisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorTU5HX0VYVCBtbmdfdWludDggICBNTkdfREVDTCBtbmdfZ2V0X3JlZnJlc2hwYXNzICAgICAobW5nX2hhbmRsZSAgICAgICAgaEhhbmRsZSk7CisjZW5kaWYKKworLyogc2VlIF9zZXRfICovCitNTkdfRVhUIG1uZ191aW50MzIgIE1OR19ERUNMIG1uZ19nZXRfY2FudmFzc3R5bGUgICAgIChtbmdfaGFuZGxlICAgICAgICBoSGFuZGxlKTsKK01OR19FWFQgbW5nX3VpbnQzMiAgTU5HX0RFQ0wgbW5nX2dldF9ia2dkc3R5bGUgICAgICAgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUpOworCisvKiBzZWUgX3NldF8gKi8KK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX2dldF9iZ2NvbG9yICAgICAgICAgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2KiAgICAgICBpUmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiogICAgICAgaUdyZWVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiogICAgICAgaUJsdWUpOworCisvKiBzZWUgX3NldF8gKi8KK01OR19FWFQgbW5nX2Jvb2wgICAgTU5HX0RFQ0wgbW5nX2dldF91c2Via2dkICAgICAgICAgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUpOworCisvKiBzZWUgX3NldF8gKi8KK01OR19FWFQgbW5nX2Jvb2wgICAgTU5HX0RFQ0wgbW5nX2dldF9zdG9yZWNodW5rcyAgICAgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUpOworCisvKiBzZWUgX3NldF8gKi8KK01OR19FWFQgbW5nX2Jvb2wgICAgTU5HX0RFQ0wgbW5nX2dldF9zZWN0aW9uYnJlYWtzICAgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUpOworCisvKiBzZWUgX3NldF8gKi8KK01OR19FWFQgbW5nX2Jvb2wgICAgTU5HX0RFQ0wgbW5nX2dldF9jYWNoZXBsYXliYWNrICAgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUpOworCisvKiBzZWUgX3NldF8gKi8KK01OR19FWFQgbW5nX2Jvb2wgICAgTU5HX0RFQ0wgbW5nX2dldF9kb3Byb2dyZXNzaXZlICAgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUpOworCisvKiBzZWUgX3NldF8gKi8KK01OR19FWFQgbW5nX3VpbnQzMiAgTU5HX0RFQ0wgbW5nX2dldF9jcmNtb2RlICAgICAgICAgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUpOworCisvKiBzZWUgX3NldF8gKi8KKyNpZiBkZWZpbmVkKE1OR19TVVBQT1JUX0RJU1BMQVkpICYmIGRlZmluZWQoTU5HX0ZVTExfQ01TKQorTU5HX0VYVCBtbmdfYm9vbCAgICBNTkdfREVDTCBtbmdfZ2V0X3NyZ2IgICAgICAgICAgICAobW5nX2hhbmRsZSAgICAgICAgaEhhbmRsZSk7CisjZW5kaWYKKworLyogc2VlIF9zZXRfICovCitNTkdfRVhUIG1uZ19mbG9hdCAgIE1OR19ERUNMIG1uZ19nZXRfdmlld2dhbW1hICAgICAgIChtbmdfaGFuZGxlICAgICAgICBoSGFuZGxlKTsKK01OR19FWFQgbW5nX2Zsb2F0ICAgTU5HX0RFQ0wgbW5nX2dldF9kaXNwbGF5Z2FtbWEgICAgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUpOworTU5HX0VYVCBtbmdfZmxvYXQgICBNTkdfREVDTCBtbmdfZ2V0X2RmbHRpbWdnYW1tYSAgICAobW5nX2hhbmRsZSAgICAgICAgaEhhbmRsZSk7CitNTkdfRVhUIG1uZ191aW50MzIgIE1OR19ERUNMIG1uZ19nZXRfdmlld2dhbW1haW50ICAgIChtbmdfaGFuZGxlICAgICAgICBoSGFuZGxlKTsKK01OR19FWFQgbW5nX3VpbnQzMiAgTU5HX0RFQ0wgbW5nX2dldF9kaXNwbGF5Z2FtbWFpbnQgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUpOworTU5HX0VYVCBtbmdfdWludDMyICBNTkdfREVDTCBtbmdfZ2V0X2RmbHRpbWdnYW1tYWludCAobW5nX2hhbmRsZSAgICAgICAgaEhhbmRsZSk7CisKKyNpZm5kZWYgTU5HX1NLSVBfTUFYQ0FOVkFTCisvKiBzZWUgX3NldF8gKi8KK01OR19FWFQgbW5nX3VpbnQzMiAgTU5HX0RFQ0wgbW5nX2dldF9tYXhjYW52YXN3aWR0aCAgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUpOworTU5HX0VYVCBtbmdfdWludDMyICBNTkdfREVDTCBtbmdfZ2V0X21heGNhbnZhc2hlaWdodCAobW5nX2hhbmRsZSAgICAgICAgaEhhbmRsZSk7CisjZW5kaWYKKworLyogc2VlIF9zZXRfICovCisjaWZkZWYgTU5HX0lOQ0xVREVfWkxJQgorTU5HX0VYVCBtbmdfaW50MzIgICBNTkdfREVDTCBtbmdfZ2V0X3psaWJfbGV2ZWwgICAgICAobW5nX2hhbmRsZSAgICAgICAgaEhhbmRsZSk7CitNTkdfRVhUIG1uZ19pbnQzMiAgIE1OR19ERUNMIG1uZ19nZXRfemxpYl9tZXRob2QgICAgIChtbmdfaGFuZGxlICAgICAgICBoSGFuZGxlKTsKK01OR19FWFQgbW5nX2ludDMyICAgTU5HX0RFQ0wgbW5nX2dldF96bGliX3dpbmRvd2JpdHMgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUpOworTU5HX0VYVCBtbmdfaW50MzIgICBNTkdfREVDTCBtbmdfZ2V0X3psaWJfbWVtbGV2ZWwgICAobW5nX2hhbmRsZSAgICAgICAgaEhhbmRsZSk7CitNTkdfRVhUIG1uZ19pbnQzMiAgIE1OR19ERUNMIG1uZ19nZXRfemxpYl9zdHJhdGVneSAgIChtbmdfaGFuZGxlICAgICAgICBoSGFuZGxlKTsKKworTU5HX0VYVCBtbmdfdWludDMyICBNTkdfREVDTCBtbmdfZ2V0X3psaWJfbWF4aWRhdCAgICAobW5nX2hhbmRsZSAgICAgICAgaEhhbmRsZSk7CisjZW5kaWYgLyogTU5HX0lOQ0xVREVfWkxJQiAqLworCisvKiBzZWUgX3NldF8gKi8KKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyNpZmRlZiBNTkdfSU5DTFVERV9JSkc2QgorTU5HX0VYVCBtbmdqcGVnX2RjdG1ldGhvZAorICAgICAgICAgICAgICAgICAgICBNTkdfREVDTCBtbmdfZ2V0X2pwZWdfZGN0bWV0aG9kICAobW5nX2hhbmRsZSAgICAgICAgaEhhbmRsZSk7CisjZW5kaWYKK01OR19FWFQgbW5nX2ludDMyICAgTU5HX0RFQ0wgbW5nX2dldF9qcGVnX3F1YWxpdHkgICAgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUpOworTU5HX0VYVCBtbmdfaW50MzIgICBNTkdfREVDTCBtbmdfZ2V0X2pwZWdfc21vb3RoaW5nICAobW5nX2hhbmRsZSAgICAgICAgaEhhbmRsZSk7CitNTkdfRVhUIG1uZ19ib29sICAgIE1OR19ERUNMIG1uZ19nZXRfanBlZ19wcm9ncmVzc2l2ZShtbmdfaGFuZGxlICAgICAgICBoSGFuZGxlKTsKK01OR19FWFQgbW5nX2Jvb2wgICAgTU5HX0RFQ0wgbW5nX2dldF9qcGVnX29wdGltaXplZCAgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUpOworCitNTkdfRVhUIG1uZ191aW50MzIgIE1OR19ERUNMIG1uZ19nZXRfanBlZ19tYXhqZGF0ICAgIChtbmdfaGFuZGxlICAgICAgICBoSGFuZGxlKTsKKyNlbmRpZiAvKiBNTkdfSU5DTFVERV9KTkcgKi8KKworLyogc2VlIF9zZXRfICAqLworI2lmIGRlZmluZWQoTU5HX1NVUFBPUlRfUkVBRCkKK01OR19FWFQgbW5nX2Jvb2wgICAgTU5HX0RFQ0wgbW5nX2dldF9zdXNwZW5zaW9ubW9kZSAgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUpOworI2VuZGlmCisKKy8qIHNlZSBfc2V0XyAgKi8KKyNpZiBkZWZpbmVkKE1OR19TVVBQT1JUX0RJU1BMQVkpCitNTkdfRVhUIG1uZ19zcGVlZHR5cGUKKyAgICAgICAgICAgICAgICAgICAgTU5HX0RFQ0wgbW5nX2dldF9zcGVlZCAgICAgICAgICAgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUpOworI2VuZGlmCisKKy8qIEltYWdlLWxldmVsICovCisvKiB0aGlzIGNhbiBiZSB1c2VkIGluc2lkZSB0aGUgcHJvY2Vzc3RleHQgY2FsbGJhY2sgdG8gZGV0ZXJtaW5lIHRoZSBsZXZlbCBvZgorICAgdGV4dCBvZiB0aGUgaW1hZ2UgYmVpbmcgcHJvY2Vzc2VkOyB0aGUgdmFsdWUgMSBpcyByZXR1cm5lZCBmb3IgdG9wLWxldmVsCisgICB0ZXh0cywgYW5kIHRoZSB2YWx1ZSAyIGZvciBhIHRleHQgaW5zaWRlIGFuIGVtYmVkZGVkIGltYWdlIGluc2lkZSBhIE1ORyAqLworTU5HX0VYVCBtbmdfdWludDMyICBNTkdfREVDTCBtbmdfZ2V0X2ltYWdlbGV2ZWwgICAgICAobW5nX2hhbmRsZSAgICAgICAgaEhhbmRsZSk7CisKKy8qIEJBQ0sgaW5mbyAqLworLyogY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgdGhlIGNvbG9yICYgbWFuZGF0b3J5IHZhbHVlcyBmb3IgdGhlIGxhc3QgcHJvY2Vzc2VkCisgICBCQUNLIGNodW5rIG9mIGEgTU5HICh3aWxsIGZhaWwgZm9yIG90aGVyIGltYWdlLXR5cGVzKTsKKyAgIGlmIG5vIEJBQ0sgY2h1bmsgd2FzIHByb2Nlc3NlZCB5ZXQsIGl0IHdpbGwgcmV0dXJuIGFsbCB6ZXJvZXMgKi8KKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19nZXRfbGFzdGJhY2tjaHVuayAgIChtbmdfaGFuZGxlICAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiogICAgICAgaVJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYqICAgICAgIGlHcmVlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYqICAgICAgIGlCbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4KiAgICAgICAgaU1hbmRhdG9yeSk7CisjZW5kaWYKKworLyogU0VFSyBpbmZvICovCisvKiBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSB0aGUgc2VnbWVudG5hbWUgb2YgdGhlIGxhc3QgcHJvY2Vzc2VkIFNFRUsgY2h1bms7CisgICBpZiBubyBTRUVLIGNodW5rIHdhcyBwcm9jZXNzZWQgb3IgaXRzIHNlZ21lbnRuYW1lIHdhcyBlbXB0eSwgdGhlIGZ1bmN0aW9uCisgICB3aWxsIHJldHVybiBhbiBlbXB0eSBzdHJpbmc7IHRoZSBwcm92aWRlZCBidWZmZXIgbXVzdCBiZSBhdCBsZWFzdCA4MCBieXRlcyEhICovCisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfZ2V0X2xhc3RzZWVrbmFtZSAgICAobW5nX2hhbmRsZSAgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wY2hhciAgICAgICAgIHpTZWdtZW50bmFtZSk7CisjZW5kaWYKKworLyogRlJBTSBpbmZvICovCisvKiBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSB0aGUgY3VycmVudCBGUkFNIGRlbGF5OyB0aGlzIG1heSBiZSB1c2VmdWwgd2hlbgorICAgcmV0cmlldmluZyBhIHN0cmVhbSBvZiBmcmFtZXMgd2l0aCB0aGVpciBjb3JyZXNwb25kaW5nIGRlbGF5cyBieSAiZmFrZSIKKyAgIHJlYWRpbmcgYW5kIGRpc3BsYXlpbmcgdGhlIGZpbGUgKi8KKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCitNTkdfRVhUIG1uZ191aW50MzIgTU5HX0RFQ0wgbW5nX2dldF9jdXJyZnJhbWRlbGF5ICAgIChtbmdfaGFuZGxlICAgICAgICBoSGFuZGxlKTsKKyNlbmRpZgorCisvKiBEaXNwbGF5IHN0YXR1cyB2YXJpYWJsZXMgKi8KKy8qIHRoZXNlIGdldCBmaWxsZWQgJiB1cGRhdGVkIGR1cmluZyBkaXNwbGF5IHByb2Nlc3NpbmcgKi8KKy8qIHN0YXJ0dGltZSBpcyB0aGUgdGlja2NvdW50IGF0IHRoZSBzdGFydCBvZiBkaXNwbGF5aW5nIHRoZSBhbmltYXRpb24gKi8KKy8qIHJ1bnRpbWUgaXMgdGhlIGFjdHVhbCBudW1iZXIgb2YgbWlsbGlzZWNzIHNpbmNlIHRoZSBzdGFydCBvZiB0aGUgYW5pbWF0aW9uICovCisvKiBjdXJyZW50ZnJhbWUsIGN1cnJlbnRsYXllciAmIGN1cnJlbnRwbGF5dGltZSBpbmRpY2F0ZSB0aGUgY3VycmVudAorICAgZnJhbWUvbGF5ZXIvcGxheXRpbWUobXNlY3MpIGluIHRoZSBhbmltYXRpb24gKHRoZXNlIGtlZXAgaW5jcmVhc2luZzsKKyAgIGV2ZW4gYWZ0ZXIgdGhlIGFuaW1hdGlvbiBsb29wcyBiYWNrIHRvIHRoZSBURVJNIGNodW5rKSAqLworLyogdG90YWxmcmFtZXMsIHRvdGFsbGF5ZXJzICYgdG90YWxwbGF5dGltZSBhcmUgZmlsbGVkIGFmdGVyIGEgY29tcGxldGUgcnVuCisgICBvZiBhbiBhbmltYXRpb24gKGVnLiBhdCBNRU5EKTsgdGhleSBhcmUgYWxzbyB2YWxpZCBhZnRlciBqdXN0IHJlYWRpbmcgdGhlIE1ORyAqLworI2lmZGVmIE1OR19TVVBQT1JUX0RJU1BMQVkKK01OR19FWFQgbW5nX3VpbnQzMiAgTU5HX0RFQ0wgbW5nX2dldF9zdGFydHRpbWUgICAgICAgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUpOworTU5HX0VYVCBtbmdfdWludDMyICBNTkdfREVDTCBtbmdfZ2V0X3J1bnRpbWUgICAgICAgICAobW5nX2hhbmRsZSAgICAgICAgaEhhbmRsZSk7CisjaWZuZGVmIE1OR19OT19DVVJSRU5UX0lORk8KK01OR19FWFQgbW5nX3VpbnQzMiAgTU5HX0RFQ0wgbW5nX2dldF9jdXJyZW50ZnJhbWUgICAgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUpOworTU5HX0VYVCBtbmdfdWludDMyICBNTkdfREVDTCBtbmdfZ2V0X2N1cnJlbnRsYXllciAgICAobW5nX2hhbmRsZSAgICAgICAgaEhhbmRsZSk7CitNTkdfRVhUIG1uZ191aW50MzIgIE1OR19ERUNMIG1uZ19nZXRfY3VycmVudHBsYXl0aW1lIChtbmdfaGFuZGxlICAgICAgICBoSGFuZGxlKTsKK01OR19FWFQgbW5nX3VpbnQzMiAgTU5HX0RFQ0wgbW5nX2dldF90b3RhbGZyYW1lcyAgICAgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUpOworTU5HX0VYVCBtbmdfdWludDMyICBNTkdfREVDTCBtbmdfZ2V0X3RvdGFsbGF5ZXJzICAgICAobW5nX2hhbmRsZSAgICAgICAgaEhhbmRsZSk7CitNTkdfRVhUIG1uZ191aW50MzIgIE1OR19ERUNMIG1uZ19nZXRfdG90YWxwbGF5dGltZSAgIChtbmdfaGFuZGxlICAgICAgICBoSGFuZGxlKTsKKyNlbmRpZgorI2VuZGlmCisKKy8qIFN0YXR1cyB2YXJpYWJsZXMgKi8KKy8qIHRoZXNlIGluZGljYXRlIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgbGlicmFyeSAqLworLyogbW9zdCBpbmRpY2F0ZSBleGFjdGx5IHdoYXQgeW91IHdvdWxkIGV4cGVjdCAtCisgICBzdGF0dXNfZXJyb3I6ICAgICAgICB0cnVlIGlmIHRoZSBsYXN0IGZ1bmN0aW9uIGNhbGwgcmV0dXJuZWQgYW4gZXJyb3Jjb2RlCisgICBzdGF0dXNfcmVhZGluZzogICAgICB0cnVlIGlmIHRoZSBsaWJyYXJ5IGlzIChzdGlsbCkgcmVhZGluZyBhbiBpbWFnZQorICAgc3RhdHVzX3N1c3BlbmRicmVhazogdHJ1ZSBpZiB0aGUgbGlicmFyeSBoYXMgc3VzcGVuZGVkIGZvciAiSS9PIgorICAgc3RhdHVzX2NyZWF0aW5nOiAgICAgdHJ1ZSBpZiB0aGUgbGlicmFyeSBpcyBpbiB0aGUgbWlkZGxlIG9mIGNyZWF0aW5nIGFuIGltYWdlCisgICBzdGF0dXNfd3JpdGluZzogICAgICB0cnVlIGlmIHRoZSBsaWJyYXJ5IGlzIGluIHRoZSBtaWRkbGUgb2Ygd3JpdGluZyBhbiBpbWFnZQorICAgc3RhdHVzX2Rpc3BsYXlpbmc6ICAgdHJ1ZSBpZiB0aGUgbGlicmFyeSBpcyBkaXNwbGF5aW5nIGFuIGltYWdlCisgICBzdGF0dXNfcnVubmluZzogICAgICB0cnVlIGlmIGRpc3BsYXkgcHJvY2Vzc2luZyBpcyBhY3RpdmUgKGVnLiBub3QgZnJvemVuIG9yIHJlc2V0KQorICAgc3RhdHVzX3RpbWVyYnJlYWs6ICAgdHJ1ZSBpZiB0aGUgbGlicmFyeSBoYXMgc3VzcGVuZGVkIGZvciBhICJ0aW1lci1icmVhayIKKyAgIHN0YXR1c19keW5hbWljOiAgICAgIHRydWUgaWYgdGhlIGxpYnJhcnkgZW5jb3VudGVyZWQgYW4gZXZOVCBjaHVuayBpbiB0aGUgTU5HCisgICBzdGF0dXNfcnVubmluZ2V2ZW50OiB0cnVlIGlmIHRoZSBsaWJyYXJ5IGlzIHByb2Nlc3NpbmcgYW4gZXh0ZXJuYWwgZXZlbnQgKi8KKy8qIGVnLiBtbmdfcmVhZGRpc3BsYXkoKSB3aWxsIHR1cm4gdGhlIHJlYWRpbmcsIGRpc3BsYXlpbmcgYW5kIHJ1bm5pbmcgc3RhdHVzIG9uOworICAgd2hlbiBFT0YgaXMgcmVhY2hlZCB0aGUgcmVhZGluZyBzdGF0dXMgd2lsbCBiZSB0dXJuZWQgb2ZmICovICAgCitNTkdfRVhUIG1uZ19ib29sICAgIE1OR19ERUNMIG1uZ19zdGF0dXNfZXJyb3IgICAgICAgIChtbmdfaGFuZGxlICAgICAgICBoSGFuZGxlKTsKKyNpZmRlZiBNTkdfU1VQUE9SVF9SRUFECitNTkdfRVhUIG1uZ19ib29sICAgIE1OR19ERUNMIG1uZ19zdGF0dXNfcmVhZGluZyAgICAgIChtbmdfaGFuZGxlICAgICAgICBoSGFuZGxlKTsKK01OR19FWFQgbW5nX2Jvb2wgICAgTU5HX0RFQ0wgbW5nX3N0YXR1c19zdXNwZW5kYnJlYWsgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUpOworI2VuZGlmCisjaWZkZWYgTU5HX1NVUFBPUlRfV1JJVEUKK01OR19FWFQgbW5nX2Jvb2wgICAgTU5HX0RFQ0wgbW5nX3N0YXR1c19jcmVhdGluZyAgICAgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUpOworTU5HX0VYVCBtbmdfYm9vbCAgICBNTkdfREVDTCBtbmdfc3RhdHVzX3dyaXRpbmcgICAgICAobW5nX2hhbmRsZSAgICAgICAgaEhhbmRsZSk7CisjZW5kaWYKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCitNTkdfRVhUIG1uZ19ib29sICAgIE1OR19ERUNMIG1uZ19zdGF0dXNfZGlzcGxheWluZyAgIChtbmdfaGFuZGxlICAgICAgICBoSGFuZGxlKTsKK01OR19FWFQgbW5nX2Jvb2wgICAgTU5HX0RFQ0wgbW5nX3N0YXR1c19ydW5uaW5nICAgICAgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUpOworTU5HX0VYVCBtbmdfYm9vbCAgICBNTkdfREVDTCBtbmdfc3RhdHVzX3RpbWVyYnJlYWsgICAobW5nX2hhbmRsZSAgICAgICAgaEhhbmRsZSk7CisjZW5kaWYKKyNpZmRlZiBNTkdfU1VQUE9SVF9EWU5BTUlDTU5HCitNTkdfRVhUIG1uZ19ib29sICAgIE1OR19ERUNMIG1uZ19zdGF0dXNfZHluYW1pYyAgICAgIChtbmdfaGFuZGxlICAgICAgICBoSGFuZGxlKTsKK01OR19FWFQgbW5nX2Jvb2wgICAgTU5HX0RFQ0wgbW5nX3N0YXR1c19ydW5uaW5nZXZlbnQgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUpOworI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgQ2h1bmsgYWNjZXNzIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX0FDQ0VTU19DSFVOS1MKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworLyogdXNlIHRoaXMgdG8gaXRlcmF0ZSB0aGUgc3RvcmVkIGNodW5rcyAqLworLyogcmVxdWlyZXMgTU5HX0FDQ0VTU19DSFVOS1MgJiBNTkdfU1RPUkVfQ0hVTktTICovCisvKiBzdGFydHMgZnJvbSB0aGUgc3VwcGxpZWQgY2h1bmstaW5kZXgtbnI7IHRoZSBmaXJzdCBjaHVuayBoYXMgaW5kZXggMCEhICovCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19pdGVyYXRlX2NodW5rcyAgICAgIChtbmdfaGFuZGxlICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgIGlDaHVua3NlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pdGVyYXRlY2h1bmsgZlByb2MpOworCisvKiB1c2UgdGhlIG5leHQgZnVuY3Rpb24gaW5zaWRlIHlvdXIgJ2l0ZXJhdGVjaHVuaycgY2FsbGJhY2sgdG8gY29weQorICAgdGhlIGdpdmVuIGNodW5rIHRvIGEgbmV3IG1uZyB5b3UgYXJlIGNyZWF0aW5nICovCisvKiB0aGUgJ291dCcgaGFuZGxlIHNob3VsZCBiZSBpbiAnY3JlYXRlJyBzdGF0dXMhICovCisjaWZkZWYgTU5HX1NVUFBPUlRfV1JJVEUKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX2NvcHlfY2h1bmsgICAgICAgICAgKG1uZ19oYW5kbGUgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19oYW5kbGUgICAgICAgaENodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2hhbmRsZSAgICAgICBoSGFuZGxlT3V0KTsKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisvKiB1c2UgdGhlc2UgdG8gZ2V0IGNodW5rIGRhdGEgZnJvbSB3aXRoaW4gdGhlIGNhbGxiYWNrIGluIGl0ZXJhdGVfY2h1bmtzICovCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19nZXRjaHVua19paGRyICAgICAgIChtbmdfaGFuZGxlICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaGFuZGxlICAgICAgIGhDaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgKmlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgKmlIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICAgICppQml0ZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICAgICppQ29sb3J0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAqaUNvbXByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAqaUZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgKmlJbnRlcmxhY2UpOworCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19nZXRjaHVua19wbHRlICAgICAgIChtbmdfaGFuZGxlICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaGFuZGxlICAgICAgIGhDaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgKmlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wYWxldHRlOCAgICAgKmFQYWxldHRlKTsKKworTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfZ2V0Y2h1bmtfaWRhdCAgICAgICAobW5nX2hhbmRsZSAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2hhbmRsZSAgICAgICBoQ2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgICppUmF3bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3B0ciAgICAgICAgICAqcFJhd2RhdGEpOworCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19nZXRjaHVua190cm5zICAgICAgIChtbmdfaGFuZGxlICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaGFuZGxlICAgICAgIGhDaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgKmJFbXB0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgKmJHbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICAgICppVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgKmlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OGFyciAgICAgKmFBbHBoYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICppR3JheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgKmlSZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICppR3JlZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICppQmx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgKmlSYXdsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhhcnIgICAgICphUmF3ZGF0YSk7CisKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX2dldGNodW5rX2dhbWEgICAgICAgKG1uZ19oYW5kbGUgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19oYW5kbGUgICAgICAgaENodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICAqYkVtcHR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAqaUdhbW1hKTsKKworTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfZ2V0Y2h1bmtfY2hybSAgICAgICAobW5nX2hhbmRsZSAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2hhbmRsZSAgICAgICBoQ2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICpiRW1wdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgICppV2hpdGVwb2ludHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgICppV2hpdGVwb2ludHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgICppUmVkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgKmlSZWR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAqaUdyZWVueCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgKmlHcmVlbnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgICppQmx1ZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgICppQmx1ZXkpOworCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19nZXRjaHVua19zcmdiICAgICAgIChtbmdfaGFuZGxlICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaGFuZGxlICAgICAgIGhDaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgKmJFbXB0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgKmlSZW5kZXJpbmdpbnRlbnQpOworCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19nZXRjaHVua19pY2NwICAgICAgIChtbmdfaGFuZGxlICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaGFuZGxlICAgICAgIGhDaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgKmJFbXB0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgKmlOYW1lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wY2hhciAgICAgICAgKnpOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAqaUNvbXByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAqaVByb2ZpbGVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3B0ciAgICAgICAgICAqcFByb2ZpbGUpOworCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19nZXRjaHVua190ZXh0ICAgICAgIChtbmdfaGFuZGxlICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaGFuZGxlICAgICAgIGhDaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgKmlLZXl3b3Jkc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wY2hhciAgICAgICAgKnpLZXl3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAqaVRleHRzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3BjaGFyICAgICAgICAqelRleHQpOworCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19nZXRjaHVua196dHh0ICAgICAgIChtbmdfaGFuZGxlICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaGFuZGxlICAgICAgIGhDaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgKmlLZXl3b3Jkc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wY2hhciAgICAgICAgKnpLZXl3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAqaUNvbXByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAqaVRleHRzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3BjaGFyICAgICAgICAqelRleHQpOworCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19nZXRjaHVua19pdHh0ICAgICAgIChtbmdfaGFuZGxlICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaGFuZGxlICAgICAgIGhDaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgKmlLZXl3b3Jkc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wY2hhciAgICAgICAgKnpLZXl3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAqaUNvbXByZXNzaW9uZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgKmlDb21wcmVzc2lvbm1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgKmlMYW5ndWFnZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcGNoYXIgICAgICAgICp6TGFuZ3VhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgICppVHJhbnNsYXRpb25zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3BjaGFyICAgICAgICAqelRyYW5zbGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAqaVRleHRzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3BjaGFyICAgICAgICAqelRleHQpOworCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19nZXRjaHVua19ia2dkICAgICAgIChtbmdfaGFuZGxlICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaGFuZGxlICAgICAgIGhDaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgKmJFbXB0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgKmlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAqaUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAqaUdyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICppUmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAqaUdyZWVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAqaUJsdWUpOworCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19nZXRjaHVua19waHlzICAgICAgIChtbmdfaGFuZGxlICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaGFuZGxlICAgICAgIGhDaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgKmJFbXB0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgKmlTaXpleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgKmlTaXpleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgKmlVbml0KTsKKworTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfZ2V0Y2h1bmtfc2JpdCAgICAgICAobW5nX2hhbmRsZSAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2hhbmRsZSAgICAgICBoQ2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICpiRW1wdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICAgICppVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OGFycjQgICAgKmFCaXRzKTsKKworTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfZ2V0Y2h1bmtfc3BsdCAgICAgICAobW5nX2hhbmRsZSAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2hhbmRsZSAgICAgICBoQ2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICpiRW1wdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgICppTmFtZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcGNoYXIgICAgICAgICp6TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgKmlTYW1wbGVkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgKmlFbnRyeWNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3B0ciAgICAgICAgICAqcEVudHJpZXMpOworCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19nZXRjaHVua19oaXN0ICAgICAgIChtbmdfaGFuZGxlICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaGFuZGxlICAgICAgIGhDaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgKmlFbnRyeWNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNmFyciAgICAqYUVudHJpZXMpOworCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19nZXRjaHVua190aW1lICAgICAgIChtbmdfaGFuZGxlICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaGFuZGxlICAgICAgIGhDaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgKmlZZWFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAqaU1vbnRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAqaURheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgKmlIb3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAqaU1pbnV0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgKmlTZWNvbmQpOworCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19nZXRjaHVua19taGRyICAgICAgIChtbmdfaGFuZGxlICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaGFuZGxlICAgICAgIGhDaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgKmlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgKmlIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgICppVGlja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgICppTGF5ZXJjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgKmlGcmFtZWNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAqaVBsYXl0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAqaVNpbXBsaWNpdHkpOworCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19nZXRjaHVua19sb29wICAgICAgIChtbmdfaGFuZGxlICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaGFuZGxlICAgICAgIGhDaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgKmlMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgKmlSZXBlYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICAgICppVGVybWluYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgICppSXRlcm1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgKmlJdGVybWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAqaUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMnAgICAgICAqcFNpZ25hbHMpOworCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19nZXRjaHVua19lbmRsICAgICAgIChtbmdfaGFuZGxlICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaGFuZGxlICAgICAgIGhDaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgKmlMZXZlbCk7CisKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX2dldGNodW5rX2RlZmkgICAgICAgKG1uZ19oYW5kbGUgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19oYW5kbGUgICAgICAgaENodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAqaU9iamVjdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAqaURvbm90c2hvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgKmlDb25jcmV0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgKmJIYXNsb2NhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAqaVhsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgKmlZbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICpiSGFzY2xpcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgKmlMZWZ0Y2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgICAgICAgICppUmlnaHRjYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgKmlUb3BjYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgKmlCb3R0b21jYik7CisKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX2dldGNodW5rX2Jhc2kgICAgICAgKG1uZ19oYW5kbGUgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19oYW5kbGUgICAgICAgaENodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAqaVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAqaUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgKmlCaXRkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgKmlDb2xvcnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICAgICppQ29tcHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICAgICppRmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAqaUludGVybGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgKmlSZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICppR3JlZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICppQmx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgKmlBbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgKmlWaWV3YWJsZSk7CisKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX2dldGNodW5rX2Nsb24gICAgICAgKG1uZ19oYW5kbGUgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19oYW5kbGUgICAgICAgaENodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAqaVNvdXJjZWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAqaUNsb25laWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICAgICppQ2xvbmV0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAqaURvbm90c2hvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgKmlDb25jcmV0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgKmJIYXNsb2NhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAqaUxvY2F0aW9udHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgKmlMb2NhdGlvbngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgICAgICAgICppTG9jYXRpb255KTsKKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX1BBU1QKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX2dldGNodW5rX3Bhc3QgICAgICAgKG1uZ19oYW5kbGUgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19oYW5kbGUgICAgICAgaENodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAqaURlc3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgKmlUYXJnZXR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAqaVRhcmdldHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgICAgICAgICppVGFyZ2V0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgKmlDb3VudCk7CisKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX2dldGNodW5rX3Bhc3Rfc3JjICAgKG1uZ19oYW5kbGUgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19oYW5kbGUgICAgICAgaENodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICBpRW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICppU291cmNlaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICAgICppQ29tcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICAgICppT3JpZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICAgICppT2Zmc2V0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgKmlPZmZzZXR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAqaU9mZnNldHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICAgICppQm91bmRhcnl0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAqaUJvdW5kYXJ5bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgKmlCb3VuZGFyeXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgICAgICAgICppQm91bmRhcnl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAqaUJvdW5kYXJ5Yik7CisjZW5kaWYKKworTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfZ2V0Y2h1bmtfZGlzYyAgICAgICAobW5nX2hhbmRsZSAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2hhbmRsZSAgICAgICBoQ2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgICppQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2cCAgICAgICpwT2JqZWN0aWRzKTsKKworTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfZ2V0Y2h1bmtfYmFjayAgICAgICAobW5nX2hhbmRsZSAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2hhbmRsZSAgICAgICBoQ2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICppUmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAqaUdyZWVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAqaUJsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICAgICppTWFuZGF0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAqaUltYWdlaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICAgICppVGlsZSk7CisKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX2dldGNodW5rX2ZyYW0gICAgICAgKG1uZ19oYW5kbGUgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19oYW5kbGUgICAgICAgaENodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICAqYkVtcHR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAqaU1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgICppTmFtZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcGNoYXIgICAgICAgICp6TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgKmlDaGFuZ2VkZWxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgKmlDaGFuZ2V0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAqaUNoYW5nZWNsaXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAqaUNoYW5nZXN5bmNpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgKmlEZWxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgKmlUaW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAqaUJvdW5kYXJ5dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgKmlCb3VuZGFyeWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgICAgICAgICppQm91bmRhcnlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAqaUJvdW5kYXJ5dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgKmlCb3VuZGFyeWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgICppQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMycCAgICAgICpwU3luY2lkcyk7CisKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX2dldGNodW5rX21vdmUgICAgICAgKG1uZ19oYW5kbGUgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19oYW5kbGUgICAgICAgaENodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAqaUZpcnN0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICppTGFzdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAqaU1vdmV0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAqaU1vdmV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAqaU1vdmV5KTsKKworTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfZ2V0Y2h1bmtfY2xpcCAgICAgICAobW5nX2hhbmRsZSAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2hhbmRsZSAgICAgICBoQ2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICppRmlyc3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgKmlMYXN0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICAgICppQ2xpcHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgICAgICAgICppQ2xpcGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgICAgICAgICppQ2xpcHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgICAgICAgICppQ2xpcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgICAgICAgICppQ2xpcGIpOworCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19nZXRjaHVua19zaG93ICAgICAgIChtbmdfaGFuZGxlICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaGFuZGxlICAgICAgIGhDaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgKmJFbXB0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgKmlGaXJzdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAqaUxhc3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgKmlNb2RlKTsKKworTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfZ2V0Y2h1bmtfdGVybSAgICAgICAobW5nX2hhbmRsZSAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2hhbmRsZSAgICAgICBoQ2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICAgICppVGVybWFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgKmlJdGVyYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAqaURlbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAqaUl0ZXJtYXgpOworCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19nZXRjaHVua19zYXZlICAgICAgIChtbmdfaGFuZGxlICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaGFuZGxlICAgICAgIGhDaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgKmJFbXB0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgKmlPZmZzZXR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAqaUNvdW50KTsKKworTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfZ2V0Y2h1bmtfc2F2ZV9lbnRyeSAobW5nX2hhbmRsZSAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2hhbmRsZSAgICAgICBoQ2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgIGlFbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgKmlFbnRyeXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyYXJyMiAgICppT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMmFycjIgICAqaVN0YXJ0dGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgKmlMYXllcm5yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAqaUZyYW1lbnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgICppTmFtZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcGNoYXIgICAgICAgICp6TmFtZSk7CisKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX2dldGNodW5rX3NlZWsgICAgICAgKG1uZ19oYW5kbGUgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19oYW5kbGUgICAgICAgaENodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAqaU5hbWVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3BjaGFyICAgICAgICAqek5hbWUpOworCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19nZXRjaHVua19leHBpICAgICAgIChtbmdfaGFuZGxlICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaGFuZGxlICAgICAgIGhDaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgKmlTbmFwc2hvdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAqaU5hbWVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3BjaGFyICAgICAgICAqek5hbWUpOworCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19nZXRjaHVua19mcHJpICAgICAgIChtbmdfaGFuZGxlICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaGFuZGxlICAgICAgIGhDaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgKmlEZWx0YXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICAgICppUHJpb3JpdHkpOworCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19nZXRjaHVua19uZWVkICAgICAgIChtbmdfaGFuZGxlICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaGFuZGxlICAgICAgIGhDaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgKmlLZXl3b3Jkc3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcGNoYXIgICAgICAgICp6S2V5d29yZHMpOworCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19nZXRjaHVua19waHlnICAgICAgIChtbmdfaGFuZGxlICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaGFuZGxlICAgICAgIGhDaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgKmJFbXB0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgKmlTaXpleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgKmlTaXpleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgKmlVbml0KTsKKworTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfZ2V0Y2h1bmtfamhkciAgICAgICAobW5nX2hhbmRsZSAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2hhbmRsZSAgICAgICBoQ2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgICppV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgICppSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAqaUNvbG9ydHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgKmlJbWFnZXNhbXBsZWRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAqaUltYWdlY29tcHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICAgICppSW1hZ2VpbnRlcmxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICAgICppQWxwaGFzYW1wbGVkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgKmlBbHBoYWNvbXByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAqaUFscGhhZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAqaUFscGhhaW50ZXJsYWNlKTsKKworTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfZ2V0Y2h1bmtfamRhdCAgICAgICAobW5nX2hhbmRsZSAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2hhbmRsZSAgICAgICBoQ2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgICppUmF3bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3B0ciAgICAgICAgICAqcFJhd2RhdGEpOworCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19nZXRjaHVua19qZGFhICAgICAgIChtbmdfaGFuZGxlICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaGFuZGxlICAgICAgIGhDaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgKmlSYXdsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcHRyICAgICAgICAgICpwUmF3ZGF0YSk7CisKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX2dldGNodW5rX2RoZHIgICAgICAgKG1uZ19oYW5kbGUgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19oYW5kbGUgICAgICAgaENodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAqaU9iamVjdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAqaUltYWdldHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgKmlEZWx0YXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgICppQmxvY2t3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgKmlCbG9ja2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgKmlCbG9ja3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgICppQmxvY2t5KTsKKworTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfZ2V0Y2h1bmtfcHJvbSAgICAgICAobW5nX2hhbmRsZSAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2hhbmRsZSAgICAgICBoQ2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICAgICppQ29sb3J0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAqaVNhbXBsZWRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAqaUZpbGx0eXBlKTsKKworTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfZ2V0Y2h1bmtfcHBsdCAgICAgICAobW5nX2hhbmRsZSAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2hhbmRsZSAgICAgICBoQ2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICAgICppRGVsdGF0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAqaUNvdW50KTsKKworTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfZ2V0Y2h1bmtfcHBsdF9lbnRyeSAobW5nX2hhbmRsZSAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2hhbmRsZSAgICAgICBoQ2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgIGlFbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgKmlSZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICppR3JlZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICppQmx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgKmlBbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgKmJVc2VkKTsKKworTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfZ2V0Y2h1bmtfZHJvcCAgICAgICAobW5nX2hhbmRsZSAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2hhbmRsZSAgICAgICBoQ2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgICppQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfY2h1bmtpZHAgICAgICpwQ2h1bmtuYW1lcyk7CisKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX2dldGNodW5rX2RieWsgICAgICAgKG1uZ19oYW5kbGUgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19oYW5kbGUgICAgICAgaENodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2NodW5raWQgICAgICAqaUNodW5rbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgKmlQb2xhcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgKmlLZXl3b3Jkc3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcGNoYXIgICAgICAgICp6S2V5d29yZHMpOworCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19nZXRjaHVua19vcmRyICAgICAgIChtbmdfaGFuZGxlICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaGFuZGxlICAgICAgIGhDaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgKmlDb3VudCk7CisKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX2dldGNodW5rX29yZHJfZW50cnkgKG1uZ19oYW5kbGUgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19oYW5kbGUgICAgICAgaENodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICBpRW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfY2h1bmtpZCAgICAgICppQ2h1bmtuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAqaU9yZGVydHlwZSk7CisKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX2dldGNodW5rX21hZ24gICAgICAgKG1uZ19oYW5kbGUgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19oYW5kbGUgICAgICAgaENodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAqaUZpcnN0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICppTGFzdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAqaU1ldGhvZFgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICppTVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICppTVksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICppTUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICppTVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICppTVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICppTUIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICppTWV0aG9kWSk7CisKKyNpZmRlZiBNTkdfSU5DTFVERV9NUE5HX1BST1BPU0FMCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19nZXRjaHVua19tcG5nICAgICAgIChtbmdfaGFuZGxlICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaGFuZGxlICAgICAgIGhDaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgKmlGcmFtZXdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAqaUZyYW1laGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAqaU51bXBsYXlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAqaVRpY2tzcGVyc2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAqaUNvbXByZXNzaW9ubWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAqaUNvdW50KTsKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX2dldGNodW5rX21wbmdfZnJhbWUgKG1uZ19oYW5kbGUgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19oYW5kbGUgICAgICAgaENodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICBpRW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgICppWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgKmlZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAqaVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAqaUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgKmlYb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAqaVlvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICppVGlja3MpOworI2VuZGlmCisKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX2dldGNodW5rX2V2bnQgICAgICAgKG1uZ19oYW5kbGUgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19oYW5kbGUgICAgICAgaENodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAqaUNvdW50KTsKKworTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfZ2V0Y2h1bmtfZXZudF9lbnRyeSAobW5nX2hhbmRsZSAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2hhbmRsZSAgICAgICBoQ2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgIGlFbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgKmlFdmVudHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICAgICppTWFza3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgICAgICAgICppTGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgKmlSaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgKmlUb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgICAgICAgICppQm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAqaU9iamVjdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAqaUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAqaVNlZ21lbnRuYW1lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wY2hhciAgICAgICAgKnpTZWdtZW50bmFtZSk7CisKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX2dldGNodW5rX3Vua25vd24gICAgKG1uZ19oYW5kbGUgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19oYW5kbGUgICAgICAgaENodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2NodW5raWQgICAgICAqaUNodW5rbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgKmlSYXdsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcHRyICAgICAgICAgICpwUmF3ZGF0YSk7CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfSU5DTFVERV9XUklURV9QUk9DUworCisvKiB1c2UgdGhlc2UgdG8gY3JlYXRlIG5ldyBjaHVua3MgYXQgdGhlIGVuZCBvZiB0aGUgY2h1bmstbGlzdCAqLworLyogcmVxdWlyZXMgYXQgbGVhc3QgTU5HX0FDQ0VTU19DSFVOS1MgKE1OR19TVVBQT1JUX1dSSVRFIG1heSBiZSBuaWNlIHRvbykgKi8KK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3B1dGNodW5rX2loZHIgICAgICAgKG1uZ19oYW5kbGUgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgaVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICBpSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICBpQml0ZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICAgIGlDb2xvcnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICAgIGlDb21wcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgaUZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgaUludGVybGFjZSk7CisKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3B1dGNodW5rX3BsdGUgICAgICAgKG1uZ19oYW5kbGUgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgaUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3BhbGV0dGU4ICAgICBhUGFsZXR0ZSk7CisKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3B1dGNodW5rX2lkYXQgICAgICAgKG1uZ19oYW5kbGUgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgaVJhd2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wdHIgICAgICAgICAgcFJhd2RhdGEpOworCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19wdXRjaHVua19pZW5kICAgICAgIChtbmdfaGFuZGxlICAgICAgIGhIYW5kbGUpOworCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19wdXRjaHVua190cm5zICAgICAgIChtbmdfaGFuZGxlICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgIGJFbXB0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgYkdsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgaVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgIGlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OGFyciAgICAgYUFscGhhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgaUdyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgICAgIGlSZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgICAgIGlHcmVlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgaUJsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgIGlSYXdsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhhcnIgICAgIGFSYXdkYXRhKTsKKworTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfcHV0Y2h1bmtfZ2FtYSAgICAgICAobW5nX2hhbmRsZSAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICBiRW1wdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgIGlHYW1tYSk7CisKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3B1dGNodW5rX2Nocm0gICAgICAgKG1uZ19oYW5kbGUgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgYkVtcHR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICBpV2hpdGVwb2ludHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgIGlXaGl0ZXBvaW50eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgaVJlZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgIGlSZWR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICBpR3JlZW54LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICBpR3JlZW55LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICBpQmx1ZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgIGlCbHVleSk7CisKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3B1dGNodW5rX3NyZ2IgICAgICAgKG1uZ19oYW5kbGUgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgYkVtcHR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICBpUmVuZGVyaW5naW50ZW50KTsKKworTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfcHV0Y2h1bmtfaWNjcCAgICAgICAobW5nX2hhbmRsZSAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICBiRW1wdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgIGlOYW1lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wY2hhciAgICAgICAgek5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICAgIGlDb21wcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgaVByb2ZpbGVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3B0ciAgICAgICAgICBwUHJvZmlsZSk7CisKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3B1dGNodW5rX3RleHQgICAgICAgKG1uZ19oYW5kbGUgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgaUtleXdvcmRzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3BjaGFyICAgICAgICB6S2V5d29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgaVRleHRzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3BjaGFyICAgICAgICB6VGV4dCk7CisKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3B1dGNodW5rX3p0eHQgICAgICAgKG1uZ19oYW5kbGUgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgaUtleXdvcmRzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3BjaGFyICAgICAgICB6S2V5d29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgaUNvbXByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICBpVGV4dHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcGNoYXIgICAgICAgIHpUZXh0KTsKKworTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfcHV0Y2h1bmtfaXR4dCAgICAgICAobW5nX2hhbmRsZSAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICBpS2V5d29yZHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcGNoYXIgICAgICAgIHpLZXl3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICBpQ29tcHJlc3Npb25mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICBpQ29tcHJlc3Npb25tZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgIGlMYW5ndWFnZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcGNoYXIgICAgICAgIHpMYW5ndWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgaVRyYW5zbGF0aW9uc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wY2hhciAgICAgICAgelRyYW5zbGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICBpVGV4dHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcGNoYXIgICAgICAgIHpUZXh0KTsKKworTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfcHV0Y2h1bmtfYmtnZCAgICAgICAobW5nX2hhbmRsZSAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICBiRW1wdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICAgIGlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICBpSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgICAgIGlHcmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICBpUmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICBpR3JlZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgICAgIGlCbHVlKTsKKworTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfcHV0Y2h1bmtfcGh5cyAgICAgICAobW5nX2hhbmRsZSAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICBiRW1wdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgIGlTaXpleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgaVNpemV5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICBpVW5pdCk7CisKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3B1dGNodW5rX3NiaXQgICAgICAgKG1uZ19oYW5kbGUgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgYkVtcHR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICBpVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OGFycjQgICAgYUJpdHMpOworCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19wdXRjaHVua19zcGx0ICAgICAgIChtbmdfaGFuZGxlICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgIGJFbXB0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgaU5hbWVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3BjaGFyICAgICAgICB6TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgaVNhbXBsZWRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICBpRW50cnljb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wdHIgICAgICAgICAgcEVudHJpZXMpOworCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19wdXRjaHVua19oaXN0ICAgICAgIChtbmdfaGFuZGxlICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgIGlFbnRyeWNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNmFyciAgICBhRW50cmllcyk7CisKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3B1dGNodW5rX3RpbWUgICAgICAgKG1uZ19oYW5kbGUgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgaVllYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICAgIGlNb250aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgaURheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgaUhvdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICAgIGlNaW51dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICAgIGlTZWNvbmQpOworCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19wdXRjaHVua19taGRyICAgICAgIChtbmdfaGFuZGxlICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgIGlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgaUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgaVRpY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICBpTGF5ZXJjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgaUZyYW1lY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgIGlQbGF5dGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgaVNpbXBsaWNpdHkpOworCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19wdXRjaHVua19tZW5kICAgICAgIChtbmdfaGFuZGxlICAgICAgIGhIYW5kbGUpOworCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19wdXRjaHVua19sb29wICAgICAgIChtbmdfaGFuZGxlICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICAgIGlMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgaVJlcGVhdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgaVRlcm1pbmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICBpSXRlcm1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgaUl0ZXJtYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgIGlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzJwICAgICAgcFNpZ25hbHMpOworCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19wdXRjaHVua19lbmRsICAgICAgIChtbmdfaGFuZGxlICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICAgIGlMZXZlbCk7CisKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3B1dGNodW5rX2RlZmkgICAgICAgKG1uZ19oYW5kbGUgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgaU9iamVjdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICBpRG9ub3RzaG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICBpQ29uY3JldGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgIGJIYXNsb2NhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICAgICAgICBpWGxvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICAgICAgICBpWWxvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICBiSGFzY2xpcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgaUxlZnRjYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgaVJpZ2h0Y2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgICAgICAgIGlUb3BjYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgaUJvdHRvbWNiKTsKKworTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfcHV0Y2h1bmtfYmFzaSAgICAgICAobW5nX2hhbmRsZSAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgIGlIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICAgIGlCaXRkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgaUNvbG9ydHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgaUNvbXByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICBpRmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICBpSW50ZXJsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICBpUmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICBpR3JlZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgICAgIGlCbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICBpQWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICAgIGlWaWV3YWJsZSk7CisKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3B1dGNodW5rX2Nsb24gICAgICAgKG1uZ19oYW5kbGUgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgaVNvdXJjZWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICBpQ2xvbmVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgaUNsb25ldHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgaURvbm90c2hvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgaUNvbmNyZXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICBiSGFzbG9jYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgaUxvY2F0aW9udHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgaUxvY2F0aW9ueCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgaUxvY2F0aW9ueSk7CisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19QQVNUCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19wdXRjaHVua19wYXN0ICAgICAgIChtbmdfaGFuZGxlICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgICAgIGlEZXN0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICAgIGlUYXJnZXR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICAgICAgICBpVGFyZ2V0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgaVRhcmdldHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgIGlDb3VudCk7CisKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3B1dGNodW5rX3Bhc3Rfc3JjICAgKG1uZ19oYW5kbGUgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgaUVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICBpU291cmNlaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICAgIGlDb21wb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgaU9yaWVudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICBpT2Zmc2V0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgaU9mZnNldHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgICAgICAgIGlPZmZzZXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICBpQm91bmRhcnl0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICAgICAgICBpQm91bmRhcnlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICAgICAgICBpQm91bmRhcnlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICAgICAgICBpQm91bmRhcnl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICAgICAgICBpQm91bmRhcnliKTsKKyNlbmRpZgorCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19wdXRjaHVua19kaXNjICAgICAgIChtbmdfaGFuZGxlICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgIGlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTZwICAgICAgcE9iamVjdGlkcyk7CisKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3B1dGNodW5rX2JhY2sgICAgICAgKG1uZ19oYW5kbGUgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgaVJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgaUdyZWVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICBpQmx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgaU1hbmRhdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgaUltYWdlaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICAgIGlUaWxlKTsKKworTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfcHV0Y2h1bmtfZnJhbSAgICAgICAobW5nX2hhbmRsZSAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICBiRW1wdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICAgIGlNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICBpTmFtZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcGNoYXIgICAgICAgIHpOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICBpQ2hhbmdlZGVsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICAgIGlDaGFuZ2V0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICBpQ2hhbmdlY2xpcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICAgIGlDaGFuZ2VzeW5jaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgIGlEZWxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgaVRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICAgIGlCb3VuZGFyeXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgICAgICAgIGlCb3VuZGFyeWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgICAgICAgIGlCb3VuZGFyeXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgICAgICAgIGlCb3VuZGFyeXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgICAgICAgIGlCb3VuZGFyeWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgIGlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzJwICAgICAgcFN5bmNpZHMpOworCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19wdXRjaHVua19tb3ZlICAgICAgIChtbmdfaGFuZGxlICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgICAgIGlGaXJzdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICBpTGFzdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICBpTW92ZXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgICAgICAgIGlNb3ZleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgaU1vdmV5KTsKKworTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfcHV0Y2h1bmtfY2xpcCAgICAgICAobW5nX2hhbmRsZSAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICBpRmlyc3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgaUxhc3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgaUNsaXB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICAgICAgICBpQ2xpcGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgICAgICAgIGlDbGlwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgaUNsaXB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICAgICAgICBpQ2xpcGIpOworCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19wdXRjaHVua19zaG93ICAgICAgIChtbmdfaGFuZGxlICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgIGJFbXB0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgaUZpcnN0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgICAgIGlMYXN0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICAgIGlNb2RlKTsKKworTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfcHV0Y2h1bmtfdGVybSAgICAgICAobW5nX2hhbmRsZSAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICBpVGVybWFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgaUl0ZXJhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgIGlEZWxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgaUl0ZXJtYXgpOworCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19wdXRjaHVua19zYXZlICAgICAgIChtbmdfaGFuZGxlICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgIGJFbXB0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgaU9mZnNldHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgIGlDb3VudCk7CisKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3B1dGNodW5rX3NhdmVfZW50cnkgKG1uZ19oYW5kbGUgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgaUVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICBpRW50cnl0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMmFycjIgICBpT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMmFycjIgICBpU3RhcnR0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICBpTGF5ZXJuciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgaUZyYW1lbnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgIGlOYW1lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wY2hhciAgICAgICAgek5hbWUpOworCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19wdXRjaHVua19zZWVrICAgICAgIChtbmdfaGFuZGxlICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgIGlOYW1lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wY2hhciAgICAgICAgek5hbWUpOworCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19wdXRjaHVua19leHBpICAgICAgIChtbmdfaGFuZGxlICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgICAgIGlTbmFwc2hvdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICBpTmFtZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcGNoYXIgICAgICAgIHpOYW1lKTsKKworTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfcHV0Y2h1bmtfZnByaSAgICAgICAobW5nX2hhbmRsZSAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICBpRGVsdGF0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICBpUHJpb3JpdHkpOworCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19wdXRjaHVua19uZWVkICAgICAgIChtbmdfaGFuZGxlICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgIGlLZXl3b3Jkc3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcGNoYXIgICAgICAgIHpLZXl3b3Jkcyk7CisKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3B1dGNodW5rX3BoeWcgICAgICAgKG1uZ19oYW5kbGUgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgYkVtcHR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICBpU2l6ZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgIGlTaXpleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgaVVuaXQpOworCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19wdXRjaHVua19qaGRyICAgICAgIChtbmdfaGFuZGxlICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgIGlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgaUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgaUNvbG9ydHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgaUltYWdlc2FtcGxlZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICAgIGlJbWFnZWNvbXByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICBpSW1hZ2VpbnRlcmxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICAgIGlBbHBoYXNhbXBsZWRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICBpQWxwaGFjb21wcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgaUFscGhhZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICBpQWxwaGFpbnRlcmxhY2UpOworCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19wdXRjaHVua19qZGF0ICAgICAgIChtbmdfaGFuZGxlICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgIGlSYXdsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcHRyICAgICAgICAgIHBSYXdkYXRhKTsKKworTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfcHV0Y2h1bmtfamRhYSAgICAgICAobW5nX2hhbmRsZSAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICBpUmF3bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3B0ciAgICAgICAgICBwUmF3ZGF0YSk7CisKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3B1dGNodW5rX2pzZXAgICAgICAgKG1uZ19oYW5kbGUgICAgICAgaEhhbmRsZSk7CisKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3B1dGNodW5rX2RoZHIgICAgICAgKG1uZ19oYW5kbGUgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgaU9iamVjdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICBpSW1hZ2V0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICBpRGVsdGF0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICBpQmxvY2t3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgaUJsb2NraGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICBpQmxvY2t4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICBpQmxvY2t5KTsKKworTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfcHV0Y2h1bmtfcHJvbSAgICAgICAobW5nX2hhbmRsZSAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICBpQ29sb3J0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICBpU2FtcGxlZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICAgIGlGaWxsdHlwZSk7CisKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3B1dGNodW5rX2lwbmcgICAgICAgKG1uZ19oYW5kbGUgICAgICAgaEhhbmRsZSk7CisKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3B1dGNodW5rX3BwbHQgICAgICAgKG1uZ19oYW5kbGUgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgaURlbHRhdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgaUNvdW50KTsKKworTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfcHV0Y2h1bmtfcHBsdF9lbnRyeSAobW5nX2hhbmRsZSAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICBpRW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgICAgIGlSZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgICAgIGlHcmVlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgaUJsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgICAgIGlBbHBoYSk7CisKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3B1dGNodW5rX2pwbmcgICAgICAgKG1uZ19oYW5kbGUgICAgICAgaEhhbmRsZSk7CisKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3B1dGNodW5rX2Ryb3AgICAgICAgKG1uZ19oYW5kbGUgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgaUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2NodW5raWRwICAgICBwQ2h1bmtuYW1lcyk7CisKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3B1dGNodW5rX2RieWsgICAgICAgKG1uZ19oYW5kbGUgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19jaHVua2lkICAgICAgaUNodW5rbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgaVBvbGFyaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICBpS2V5d29yZHNzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3BjaGFyICAgICAgICB6S2V5d29yZHMpOworCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19wdXRjaHVua19vcmRyICAgICAgIChtbmdfaGFuZGxlICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgIGlDb3VudCk7CisKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3B1dGNodW5rX29yZHJfZW50cnkgKG1uZ19oYW5kbGUgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgaUVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2NodW5raWQgICAgICBpQ2h1bmtuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICBpT3JkZXJ0eXBlKTsKKworTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfcHV0Y2h1bmtfbWFnbiAgICAgICAobW5nX2hhbmRsZSAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICBpRmlyc3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgaUxhc3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgaU1ldGhvZFgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgICAgIGlNWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgaU1ZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICBpTUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgICAgIGlNUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgaU1ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICBpTUIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgICAgIGlNZXRob2RZKTsKKworI2lmZGVmIE1OR19JTkNMVURFX01QTkdfUFJPUE9TQUwKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3B1dGNodW5rX21wbmcgICAgICAgKG1uZ19oYW5kbGUgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgaUZyYW1ld2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgIGlGcmFtZWhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgaU51bXBsYXlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICBpVGlja3NwZXJzZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICAgIGlDb21wcmVzc2lvbm1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgaUNvdW50KTsKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3B1dGNodW5rX21wbmdfZnJhbWUgKG1uZ19oYW5kbGUgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgaUVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICBpWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgaVksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgIGlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgaUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgaVhvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgICAgICAgIGlZb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICBpVGlja3MpOworI2VuZGlmCisKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3B1dGNodW5rX2V2bnQgICAgICAgKG1uZ19oYW5kbGUgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgaUNvdW50KTsKKworTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfcHV0Y2h1bmtfZXZudF9lbnRyeSAobW5nX2hhbmRsZSAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICBpRW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICAgIGlFdmVudHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICAgIGlNYXNrdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgaUxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgICAgICAgIGlSaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgaVRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgaUJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgaU9iamVjdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICBpSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgIGlTZWdtZW50bmFtZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcGNoYXIgICAgICAgIHpTZWdtZW50bmFtZSk7CisKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3B1dGNodW5rX3Vua25vd24gICAgKG1uZ19oYW5kbGUgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19jaHVua2lkICAgICAgaUNodW5rbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgaVJhd2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wdHIgICAgICAgICAgcFJhd2RhdGEpOworCisjZW5kaWYgLyogTU5HX0lOQ0xVREVfV1JJVEVfUFJPQ1MgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworLyogdXNlIHRoZXNlIGZ1bmN0aW9ucyB0byBhY2Nlc3MgdGhlIGFjdHVhbCBpbWFnZS1kYXRhIGluIHN0b3JlZCBjaHVua3MsCisgICBhcyBvcHBvc2VkIHRvIHRoZSBJREFUL0pEQVQgZGF0YSAqLworLyogdG8gZ2V0IGFjY3VyYXRlIHBpeGVsLWRhdGEgdGhlIGNhbnZhc3N0eWxlIHNob3VsZCBzZXJpb3VzbHkgcmVmbGVjdCB0aGUKKyAgIGJpdGRlcHRoL2NvbG9ydHlwZSBjb21iaW5hdGlvbiBvZiB0aGUgcHJlY2VkaW5nIElIRFIvSkhEUi9CQVNJL0RIRFI7CisgICBhbGwgaW5wdXQgY2FuIGJlIGNvbnZlcnRlZCB0byByZ2IoYSk4IChyZ2IoYSkxNiBmb3IgMTYtYml0IGltYWdlcyksIGJ1dAorICAgdGhlcmUgYXJlIG9ubHkgbGltaXRlZCBjb252ZXJzaW9ucyBiYWNrIChzZWUgYmVsb3cgZm9yIHB1dGltZ2RhdGEpICAqLworCisvKiBjYWxsIHRoaXMgZnVuY3Rpb24gaWYgeW91IHdhbnQgdG8gZXh0cmFjdCB0aGUgbnRoIGltYWdlIGZyb20gdGhlIGxpc3Q7CisgICB0aGUgZmlyc3QgaW1hZ2UgaXMgZGVzaWduYXRlZCBzZXFuciAwISAqLworLyogdGhpcyBmdW5jdGlvbiBmaW5kcyB0aGUgSUhEUi9KSERSL0JBU0kvREhEUiB3aXRoIHRoZSBhcHByb3ByaWF0ZSBzZXFuciwKKyAgIHN0YXJ0aW5nIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgY2h1bmstbGlzdDsgdGhpcyBtYXkgdGVuZCB0byBnZXQgYSBsaXR0bGUKKyAgIHNsb3cgZm9yIGFuaW1hdGlvbnMgd2l0aCBhIGxhcmdlIG51bWJlciBvZiBjaHVua3MgZm9yIGltYWdlcyBuZWFyIHRoZSBlbmQgKi8KKy8qIHN1cHBseWluZyBhIHNlcW5yIHBhc3QgdGhlIGxhc3QgaW1hZ2UgaW4gdGhlIGFuaW1hdGlvbiB3aWxsIHJldHVybiB3aXRoCisgICBhbiBlcnJvcmNvZGUgKi8gICAKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX2dldGltZ2RhdGFfc2VxICAgICAgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpU2VxbnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpQ2FudmFzc3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfZ2V0Y2FudmFzbGluZSBmR2V0Y2FudmFzbGluZSk7CisKKy8qIGJvdGggdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgd2lsbCBzZWFyY2ggZm9yd2FyZCB0byBmaW5kIHRoZSBmaXJzdCBJREFUL0pEQVQsCisgICBhbmQgdGhlbiB0cmF2ZXJzZSBiYWNrIHRvIGZpbmQgdGhlIHN0YXJ0IG9mIHRoZSBpbWFnZSAoSUhEUixKSERSLERIRFIsQkFTSSk7CisgICBub3RlIHRoYXQgdGhpcyBpcyB2ZXJ5IGZhc3QgY29tcGFyZWQgdG8gZGVjb2RpbmcgdGhlIElEQVQvSkRBVCwgc28gdGhlcmUncworICAgbm90IHJlYWxseSBhIG5lZWQgZm9yIG9wdGltaXphdGlvbjsgZWl0aGVyIGNhbiBiZSBjYWxsZWQgZnJvbSB0aGUKKyAgIGl0ZXJhdGVfY2h1bmtzIGNhbGxiYWNrIHdoZW4gYSBJSERSL0pIRFIgaXMgZW5jb3VudGVyZWQ7IGZvciBCQVNJL0RIRFIgdGhlcmUKKyAgIG1heSBub3QgYmUgcmVhbCBpbWFnZS1kYXRhIHNvIGl0J3Mgd2lzZXN0IHRvIGtlZXAgaXRlcmF0aW5nIHRpbGwgdGhlIElFTkQsCisgICBhbmQgdGhlbiBjYWxsIGVpdGhlciBvZiB0aGVzZSBmdW5jdGlvbnMgaWYgbmVjZXNzYXJ5IChyZW1lbWJlciB0aGUgY29ycmVjdCBzZXFuciEpICovCisKKy8qIGNhbGwgdGhpcyBmdW5jdGlvbiBpZiB5b3Ugd2FudCB0byBleHRyYWN0IHRoZSBpbWFnZSBzdGFydGluZyBhdCBvciBhZnRlciB0aGUgbnRoCisgICBwb3NpdGlvbiBpbiB0aGUgY2h1bmstbGlzdDsgdGhpcyBudW1iZXIgaXMgcmV0dXJuZWQgaW4gdGhlIGl0ZXJhdGVfY2h1bmtzIGNhbGxiYWNrICovCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19nZXRpbWdkYXRhX2NodW5rc2VxIChtbmdfaGFuZGxlICAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaVNlcW5yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaUNhbnZhc3N0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2dldGNhbnZhc2xpbmUgZkdldGNhbnZhc2xpbmUpOworCisvKiBjYWxsIHRoaXMgZnVuY3Rpb24gaWYgeW91IHdhbnQgdG8gZXh0cmFjdCB0aGUgaW1hZ2Ugc3RhcnRpbmcgYXQgb3IgYWZ0ZXIgdGhlCisgICBpbmRpY2F0ZWQgY2h1bms7IHRoZSBoYW5kbGUgb2YgYSBjaHVuayBpcyByZXR1cm5lZCBpbiB0aGUgaXRlcmF0ZV9jaHVua3MgY2FsbGJhY2sgKi8KK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX2dldGltZ2RhdGFfY2h1bmsgICAgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaGFuZGxlICAgICAgICBoQ2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpQ2FudmFzc3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfZ2V0Y2FudmFzbGluZSBmR2V0Y2FudmFzbGluZSk7CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfSU5DTFVERV9XUklURV9QUk9DUworCisvKiB1c2UgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgdG8gYWRkIGltYWdlLWRhdGEgdG8gdGhlIGxpc3Qgb2Ygc3RvcmVkIGNodW5rcyAqLworLyogbm90ZSB0aGF0IHRoaXMgb25seSBhZGRzIHRoZSBJREFUIG9yIEpEQVQgY2h1bmtzIGFuZCBubyBvdGhlcnM7IHlvdSBtdXN0IGNhbGwKKyAgIG9uZSBvZiB0aGVzZSBmdW5jdGlvbnMgYWZ0ZXIgeW91ICdwdXQnIHRoZSBpbml0aWFsIGNodW5rcyBvZiB0aGUgaW1hZ2UgYW5kCisgICBiZWZvcmUgeW91ICdwdXQnIHRoZSBjbG9zaW5nIGNodW5rcyAqLworLyogdGhlIGNhbnZhc3N0eWxlIHNob3VsZCBzZXJpb3VzbHkgcmVmbGVjdCB0aGUgYml0ZGVwdGgvY29sb3J0eXBlIGNvbWJpbmF0aW9uOworICAgZWcuIGJpdGRlcHRoPTE2IHdvdWxkIGV4cGVjdCBhIDE2LWJpdCBjYW52YXNzdHlsZSwKKyAgIGNvbG9ydHlwZT1nIG9yIGdhIHdvdWxkIGV4cGVjdCBhIGdyYXkgb3IgZ3JheSthbHBoYSBzdHlsZSByZXNwZWN0aXZlbHkKKyAgIGFuZCBzbyBvbiwgYW5kIHNvIGZvcnRoIC4uLgorICAgKG5iLiB0aGUgbnVtYmVyIG9mIGNvbnZlcnNpb25zIHdpbGwgYmUgZXh0cmVtZWx5IGxpbWl0ZWQgZm9yIHRoZSBtb21lbnQhKSAqLworCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19wdXRpbWdkYXRhX2loZHIgICAgIChtbmdfaGFuZGxlICAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlDb2xvcnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpQml0ZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpQ29tcHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpRmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaUludGVybGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlDYW52YXNzdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19nZXRjYW52YXNsaW5lIGZHZXRjYW52YXNsaW5lKTsKKworTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfcHV0aW1nZGF0YV9qaGRyICAgICAobW5nX2hhbmRsZSAgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpQ29sb3J0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaUJpdGRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaUNvbXByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaUludGVybGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlBbHBoYUJpdGRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaUFscGhhQ29tcHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpQWxwaGFGaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpQWxwaGFJbnRlcmxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpQ2FudmFzc3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfZ2V0Y2FudmFzbGluZSBmR2V0Y2FudmFzbGluZSk7CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKy8qIHVzZSB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyB0byBzZXQgdGhlIGZyYW1lY291bnQvbGF5ZXJjb3VudC9wbGF5dGltZSBvcgorICAgc2ltcGxpY2l0eSBvZiBhbiBhbmltYXRpb24geW91IGFyZSBjcmVhdGluZzsgdGhpcyBtYXkgYmUgdXNlZnVsIGlmIHRoZXNlCisgICB2YXJpYWJsZXMgYXJlIGNhbGN1bGF0ZWQgZHVyaW5nIHRoZSBjcmVhdGlvbi1wcm9jZXNzICovCisKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3VwZGF0ZW1uZ2hlYWRlciAgICAgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpRnJhbWVjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlMYXllcmNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaVBsYXl0aW1lKTsKKworTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfdXBkYXRlbW5nc2ltcGxpY2l0eSAobW5nX2hhbmRsZSAgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlTaW1wbGljaXR5KTsKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2VuZGlmIC8qIE1OR19JTkNMVURFX1dSSVRFX1BST0NTICovCisKKyNlbmRpZiAvKiBNTkdfQUNDRVNTX0NIVU5LUyAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogRXJyb3ItY29kZSBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAwYjAwMDAgMDB4eCB4eHh4IHh4eHggLSBiYXNpYyBlcnJvcnM7IHNldmVyaXR5IDkgKGVudmlyb25tZW50KSAgICAgICAgICogKi8KKy8qICogMGIwMDAwIDAxeHggeHh4eCB4eHh4IC0gY2h1bmsgZXJyb3JzOyBzZXZlcml0eSA5IChpbWFnZSBpbmR1Y2VkKSAgICAgICAqICovCisvKiAqIDBiMDAwMCAxMHh4IHh4eHggeHh4eCAtIHNldmVyaXR5IDUgZXJyb3JzIChhcHBsaWNhdGlvbiBpbmR1Y2VkKSAgICAgICAgKiAqLworLyogKiAwYjAwMDEgMDB4eCB4eHh4IHh4eHggLSBzZXZlcml0eSAyIHdhcm5pbmdzIChyZWNvdmVyYWJsZSkgICAgICAgICAgICAgICogKi8KKy8qICogMGIwMDEwIDAweHggeHh4eCB4eHh4IC0gc2V2ZXJpdHkgMSB3YXJuaW5ncyAocmVjb3ZlcmFibGUpICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2RlZmluZSBNTkdfTk9FUlJPUiAgICAgICAgICAobW5nX3JldGNvZGUpMCAgICAvKiBlci4uIGluZGljYXRlcyBhbGwncyB3ZWxsICAgKi8KKworI2RlZmluZSBNTkdfT1VUT0ZNRU1PUlkgICAgICAobW5nX3JldGNvZGUpMSAgICAvKiBvb3BzLCBidXkgc29tZSBtZWdhYnl0ZXMhICAgKi8KKyNkZWZpbmUgTU5HX0lOVkFMSURIQU5ETEUgICAgKG1uZ19yZXRjb2RlKTIgICAgLyogY2FsbCBtbmdfaW5pdGlhbGl6ZSBmaXJzdCAgICovCisjZGVmaW5lIE1OR19OT0NBTExCQUNLICAgICAgIChtbmdfcmV0Y29kZSkzICAgIC8qIHNldCB0aGUgY2FsbGJhY2tzIHBsZWFzZSAgICAqLworI2RlZmluZSBNTkdfVU5FWFBFQ1RFREVPRiAgICAobW5nX3JldGNvZGUpNCAgICAvKiB3aGF0J2QgeWEgZG8gd2l0aCB0aGUgZGF0YT8gKi8KKyNkZWZpbmUgTU5HX1pMSUJFUlJPUiAgICAgICAgKG1uZ19yZXRjb2RlKTUgICAgLyogemxpYiBidXJwZWQgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1OR19KUEVHRVJST1IgICAgICAgIChtbmdfcmV0Y29kZSk2ICAgIC8qIGpwZ2xpYiBjb21wbGFpbmVkICAgICAgICAgICAqLworI2RlZmluZSBNTkdfTENNU0VSUk9SICAgICAgICAobW5nX3JldGNvZGUpNyAgICAvKiBsaXR0bGUgY21zIHN0cmVzc2VkIG91dCAgICAgKi8KKyNkZWZpbmUgTU5HX05PT1VUUFVUUFJPRklMRSAgKG1uZ19yZXRjb2RlKTggICAgLyogbm8gb3V0cHV0LXByb2ZpbGUgZGVmaW5lZCAgICovCisjZGVmaW5lIE1OR19OT1NSR0JQUk9GSUxFICAgIChtbmdfcmV0Y29kZSk5ICAgIC8qIG5vIHNSR0ItcHJvZmlsZSBkZWZpbmVkICAgICAqLworI2RlZmluZSBNTkdfQlVGT1ZFUkZMT1cgICAgICAobW5nX3JldGNvZGUpMTAgICAvKiB6bGliIG91dHB1dC1idWZmZXIgb3ZlcmZsb3cgKi8KKyNkZWZpbmUgTU5HX0ZVTkNUSU9OSU5WQUxJRCAgKG1uZ19yZXRjb2RlKTExICAgLyogYXksIHRvdGFsbHkgaW5hcHByb3ByaWF0ZSAgICovCisjZGVmaW5lIE1OR19PVVRQVVRFUlJPUiAgICAgIChtbmdfcmV0Y29kZSkxMiAgIC8qIGRpc2sgZnVsbCA/ICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNTkdfSlBFR0JVRlRPT1NNQUxMICAobW5nX3JldGNvZGUpMTMgICAvKiBjYW4ndCBoYW5kbGUgYnVmZmVyIG92ZXJmbG93Ki8KKyNkZWZpbmUgTU5HX05FRURNT1JFREFUQSAgICAgKG1uZ19yZXRjb2RlKTE0ICAgLyogSSdtIGh1bmdyeSwgZ2l2ZSBtZSBtb3JlICAgICovCisjZGVmaW5lIE1OR19ORUVEVElNRVJXQUlUICAgIChtbmdfcmV0Y29kZSkxNSAgIC8qIFNsZWVwIGEgd2hpbGUgdGhlbiB3YWtlIG1lICAqLworI2RlZmluZSBNTkdfTkVFRFNFQ1RJT05XQUlUICAobW5nX3JldGNvZGUpMTYgICAvKiBqdXN0IHByb2Nlc3NlZCBhIFNFRUsgICAgICAgKi8KKyNkZWZpbmUgTU5HX0xPT1BXSVRIQ0FDSEVPRkYgKG1uZ19yZXRjb2RlKTE3ICAgLyogTE9PUCB3aGVuIHBsYXliYWNrIGluZm8gb2ZmICovCisKKyNkZWZpbmUgTU5HX0RMTE5PVExPQURFRCAgICAgKG1uZ19yZXRjb2RlKTk5ICAgLyogbGF0ZSBiaW5kaW5nIGZhaWxlZCAgICAgICAgICovCisKKyNkZWZpbmUgTU5HX0FQUElPRVJST1IgICAgICAgKG1uZ19yZXRjb2RlKTkwMSAgLyogYXBwbGljYXRpb24gSS9PIGVycm9yICAgICAgICovCisjZGVmaW5lIE1OR19BUFBUSU1FUkVSUk9SICAgIChtbmdfcmV0Y29kZSk5MDIgIC8qIGFwcGxpY2F0aW9uIHRpbWluZyBlcnJvciAgICAqLworI2RlZmluZSBNTkdfQVBQQ01TRVJST1IgICAgICAobW5nX3JldGNvZGUpOTAzICAvKiBhcHBsaWNhdGlvbiBDTVMgZXJyb3IgICAgICAgKi8KKyNkZWZpbmUgTU5HX0FQUE1JU0NFUlJPUiAgICAgKG1uZ19yZXRjb2RlKTkwNCAgLyogYXBwbGljYXRpb24gb3RoZXIgZXJyb3IgICAgICovCisjZGVmaW5lIE1OR19BUFBUUkFDRUFCT1JUICAgIChtbmdfcmV0Y29kZSk5MDUgIC8qIGFwcGxpY2F0aW9uIGFib3J0cyBvbiB0cmFjZSAqLworCisjZGVmaW5lIE1OR19JTlRFUk5BTEVSUk9SICAgIChtbmdfcmV0Y29kZSk5OTkgIC8qIGludGVybmFsIGluY29uc2lzdGFuY3kgICAgICAqLworCisjZGVmaW5lIE1OR19JTlZBTElEU0lHICAgICAgIChtbmdfcmV0Y29kZSkxMDI1IC8qIGludmFsaWQgZ3JhcGhpY3MgZmlsZSAgICAgICAqLworI2RlZmluZSBNTkdfSU5WQUxJRENSQyAgICAgICAobW5nX3JldGNvZGUpMTAyNyAvKiBjcmMgY2hlY2sgZmFpbGVkICAgICAgICAgICAgKi8KKyNkZWZpbmUgTU5HX0lOVkFMSURMRU5HVEggICAgKG1uZ19yZXRjb2RlKTEwMjggLyogY2h1bmtsZW5ndGggbXlzdGlmaWVzIG1lICAgICovCisjZGVmaW5lIE1OR19TRVFVRU5DRUVSUk9SICAgIChtbmdfcmV0Y29kZSkxMDI5IC8qIGludmFsaWQgY2h1bmsgc2VxdWVuY2UgICAgICAqLworI2RlZmluZSBNTkdfQ0hVTktOT1RBTExPV0VEICAobW5nX3JldGNvZGUpMTAzMCAvKiBjb21wbGV0ZWx5IG91dC1vZi1wbGFjZSAgICAgKi8KKyNkZWZpbmUgTU5HX01VTFRJUExFRVJST1IgICAgKG1uZ19yZXRjb2RlKTEwMzEgLyogb25seSBvbmUgb2NjdXJlbmNlIGFsbG93ZWQgICovCisjZGVmaW5lIE1OR19QTFRFTUlTU0lORyAgICAgIChtbmdfcmV0Y29kZSkxMDMyIC8qIGluZGV4ZWQtY29sb3IgcmVxdWlyZXMgUExURSAqLworI2RlZmluZSBNTkdfSURBVE1JU1NJTkcgICAgICAobW5nX3JldGNvZGUpMTAzMyAvKiBJSERSLWJsb2NrIHJlcXVpcmVzIElEQVQgICAgKi8KKyNkZWZpbmUgTU5HX0NBTk5PVEJFRU1QVFkgICAgKG1uZ19yZXRjb2RlKTEwMzQgLyogbXVzdCBjb250YWluIHNvbWUgZGF0YSAgICAgICovCisjZGVmaW5lIE1OR19HTE9CQUxMRU5HVEhFUlIgIChtbmdfcmV0Y29kZSkxMDM1IC8qIGdsb2JhbCBkYXRhIGluY29ycmVjdCAgICAgICAqLworI2RlZmluZSBNTkdfSU5WQUxJREJJVERFUFRIICAobW5nX3JldGNvZGUpMTAzNiAvKiBiaXRkZXB0aCBvdXQtb2YtcmFuZ2UgICAgICAgKi8KKyNkZWZpbmUgTU5HX0lOVkFMSURDT0xPUlRZUEUgKG1uZ19yZXRjb2RlKTEwMzcgLyogY29sb3J0eXBlIG91dC1vZi1yYW5nZSAgICAgICovCisjZGVmaW5lIE1OR19JTlZBTElEQ09NUFJFU1MgIChtbmdfcmV0Y29kZSkxMDM4IC8qIGNvbXByZXNzaW9uIG1ldGhvZCBpbnZhbGlkICAqLworI2RlZmluZSBNTkdfSU5WQUxJREZJTFRFUiAgICAobW5nX3JldGNvZGUpMTAzOSAvKiBmaWx0ZXIgbWV0aG9kIGludmFsaWQgICAgICAgKi8KKyNkZWZpbmUgTU5HX0lOVkFMSURJTlRFUkxBQ0UgKG1uZ19yZXRjb2RlKTEwNDAgLyogaW50ZXJsYWNlIG1ldGhvZCBpbnZhbGlkICAgICovCisjZGVmaW5lIE1OR19OT1RFTk9VR0hJREFUICAgIChtbmdfcmV0Y29kZSkxMDQxIC8qIHJhbiBvdXQgb2YgY29tcHJlc3NlZCBkYXRhICAqLworI2RlZmluZSBNTkdfUExURUlOREVYRVJST1IgICAobW5nX3JldGNvZGUpMTA0MiAvKiBwYWxldHRlLWluZGV4IG91dC1vZi1yYW5nZSAgKi8KKyNkZWZpbmUgTU5HX05VTExOT1RGT1VORCAgICAgKG1uZ19yZXRjb2RlKTEwNDMgLyogY291bGRuJ3QgZmluZCBudWxsLXNlcGFyYXRvciovCisjZGVmaW5lIE1OR19LRVlXT1JETlVMTCAgICAgIChtbmdfcmV0Y29kZSkxMDQ0IC8qIGtleXdvcmQgY2Fubm90IGJlIGVtcHR5ICAgICAqLworI2RlZmluZSBNTkdfT0JKRUNUVU5LTk9XTiAgICAobW5nX3JldGNvZGUpMTA0NSAvKiB0aGUgb2JqZWN0IGNhbid0IGJlIGZvdW5kICAgKi8KKyNkZWZpbmUgTU5HX09CSkVDVEVYSVNUUyAgICAgKG1uZ19yZXRjb2RlKTEwNDYgLyogdGhlIG9iamVjdCBhbHJlYWR5IGV4aXN0cyAgICovCisjZGVmaW5lIE1OR19UT09NVUNISURBVCAgICAgIChtbmdfcmV0Y29kZSkxMDQ3IC8qIGdvdCB0b28gbXVjaCBjb21wcmVzc2VkIGRhdGEqLworI2RlZmluZSBNTkdfSU5WU0FNUExFREVQVEggICAobW5nX3JldGNvZGUpMTA0OCAvKiBzYW1wbGVkZXB0aCBvdXQtb2YtcmFuZ2UgICAgKi8KKyNkZWZpbmUgTU5HX0lOVk9GRlNFVFNJWkUgICAgKG1uZ19yZXRjb2RlKTEwNDkgLyogaW52YWxpZCBvZmZzZXQtc2l6ZSAgICAgICAgICovCisjZGVmaW5lIE1OR19JTlZFTlRSWVRZUEUgICAgIChtbmdfcmV0Y29kZSkxMDUwIC8qIGludmFsaWQgZW50cnktdHlwZSAgICAgICAgICAqLworI2RlZmluZSBNTkdfRU5EV0lUSE5VTEwgICAgICAobW5nX3JldGNvZGUpMTA1MSAvKiBtYXkgbm90IGVuZCB3aXRoIE5VTEwgICAgICAgKi8KKyNkZWZpbmUgTU5HX0lOVklNQUdFVFlQRSAgICAgKG1uZ19yZXRjb2RlKTEwNTIgLyogaW52YWxpZCBpbWFnZV90eXBlICAgICAgICAgICovCisjZGVmaW5lIE1OR19JTlZERUxUQVRZUEUgICAgIChtbmdfcmV0Y29kZSkxMDUzIC8qIGludmFsaWQgZGVsdGFfdHlwZSAgICAgICAgICAqLworI2RlZmluZSBNTkdfSU5WQUxJRElOREVYICAgICAobW5nX3JldGNvZGUpMTA1NCAvKiBpbmRleC12YWx1ZSBpbnZhbGlkICAgICAgICAgKi8KKyNkZWZpbmUgTU5HX1RPT01VQ0hKREFUICAgICAgKG1uZ19yZXRjb2RlKTEwNTUgLyogZ290IHRvbyBtdWNoIGNvbXByZXNzZWQgZGF0YSovCisjZGVmaW5lIE1OR19KUEVHUEFSTVNFUlIgICAgIChtbmdfcmV0Y29kZSkxMDU2IC8qIEpIRFIvSlBFRyBwYXJtcyBkbyBub3QgbWF0Y2gqLworI2RlZmluZSBNTkdfSU5WRklMTE1FVEhPRCAgICAobW5nX3JldGNvZGUpMTA1NyAvKiBpbnZhbGlkIGZpbGxfbWV0aG9kICAgICAgICAgKi8KKyNkZWZpbmUgTU5HX09CSk5PVENPTkNSRVRFICAgKG1uZ19yZXRjb2RlKTEwNTggLyogb2JqZWN0IG11c3QgYmUgY29uY3JldGUgICAgICovCisjZGVmaW5lIE1OR19UQVJHRVROT0FMUEhBICAgIChtbmdfcmV0Y29kZSkxMDU5IC8qIG9iamVjdCBoYXMgbm8gYWxwaGEtY2hhbm5lbCAqLworI2RlZmluZSBNTkdfTU5HVE9PQ09NUExFWCAgICAobW5nX3JldGNvZGUpMTA2MCAvKiBjYW4ndCBoYW5kbGUgY29tcGxleGl0eSAgICAgKi8KKyNkZWZpbmUgTU5HX1VOS05PV05DUklUSUNBTCAgKG1uZ19yZXRjb2RlKTEwNjEgLyogdW5rbm93biBjcml0aWNhbCBjaHVuayBmb3VuZCovCisjZGVmaW5lIE1OR19VTlNVUFBPUlRFRE5FRUQgIChtbmdfcmV0Y29kZSkxMDYyIC8qIG5FRUQgcmVxdWlyZW1lbnQgdW5zdXBwb3J0ZWQqLworI2RlZmluZSBNTkdfSU5WQUxJRERFTFRBICAgICAobW5nX3JldGNvZGUpMTA2MyAvKiBEZWx0YSBvcGVyYXRpb24gaWxsZWdhbCAgICAgKi8KKyNkZWZpbmUgTU5HX0lOVkFMSURNRVRIT0QgICAgKG1uZ19yZXRjb2RlKTEwNjQgLyogaW52YWxpZCBNQUdOIG1ldGhvZCAgICAgICAgICovCisjZGVmaW5lIE1OR19JTVBST0JBQkxFTEVOR1RIIChtbmdfcmV0Y29kZSkxMDY1IC8qIGltcHJvcGFibGUgY2h1bmsgbGVuZ3RoICAgICAqLworI2RlZmluZSBNTkdfSU5WQUxJREJMT0NLICAgICAobW5nX3JldGNvZGUpMTA2NiAvKiBpbnZhbGlkIGRlbHRhIGJsb2NrICAgICAgICAgKi8KKyNkZWZpbmUgTU5HX0lOVkFMSURFVkVOVCAgICAgKG1uZ19yZXRjb2RlKTEwNjcgLyogaW52YWxpZCBldmVudF90eXBlICAgICAgICAgICovCisjZGVmaW5lIE1OR19JTlZBTElETUFTSyAgICAgIChtbmdfcmV0Y29kZSkxMDY4IC8qIGludmFsaWQgbWFza190eXBlICAgICAgICAgICAqLworI2RlZmluZSBNTkdfTk9NQVRDSElOR0xPT1AgICAobW5nX3JldGNvZGUpMTA2OSAvKiBFTkRMIHdpdGhvdXQgbWF0Y2hpbmcgTE9PUCAgKi8KKyNkZWZpbmUgTU5HX1NFRUtOT1RGT1VORCAgICAgKG1uZ19yZXRjb2RlKTEwNzAgLyogRXZOVCBwb2ludHMgdG8gdW5rbm93biBTRUVLICovCisjZGVmaW5lIE1OR19PQkpOT1RBQlNUUkFDVCAgIChtbmdfcmV0Y29kZSkxMDcxIC8qIG9iamVjdCBtdXN0IGJlIGFic3RyYWN0ICAgICAqLworI2RlZmluZSBNTkdfVEVSTVNFUUVSUk9SICAgICAobW5nX3JldGNvZGUpMTA3MiAvKiBURVJNIGluIHdyb25nIHBsYWNlICAgICAgICAgKi8KKyNkZWZpbmUgTU5HX0lOVkFMSURGSUVMRFZBTCAgKG1uZ19yZXRjb2RlKTEwNzMgLyogaW52YWxpZCBmaWVsZHZhbHVlIChnZW5lcmljKSovCisjZGVmaW5lIE1OR19JTlZBTElEV0lEVEggICAgIChtbmdfcmV0Y29kZSkxMDc0IC8qIGludmFsaWQgZnJhbWUvaW1hZ2Ugd2lkdGggICAqLworI2RlZmluZSBNTkdfSU5WQUxJREhFSUdIVCAgICAobW5nX3JldGNvZGUpMTA3NSAvKiBpbnZhbGlkIGZyYW1lL2ltYWdlIGhlaWdodCAgKi8KKworI2RlZmluZSBNTkdfSU5WQUxJRENOVlNUWUxFICAobW5nX3JldGNvZGUpMjA0OSAvKiBjYW4ndCBtYWtlIGFueXRoaW5nIG9mIHRoaXMgKi8KKyNkZWZpbmUgTU5HX1dST05HQ0hVTksgICAgICAgKG1uZ19yZXRjb2RlKTIwNTAgLyogYWNjZXNzaW5nIHRoZSB3cm9uZyBjaHVuayAgICovCisjZGVmaW5lIE1OR19JTlZBTElERU5UUllJWCAgIChtbmdfcmV0Y29kZSkyMDUxIC8qIGFjY2Vzc2luZyB0aGUgd3JvbmcgZW50cnkgICAqLworI2RlZmluZSBNTkdfTk9IRUFERVIgICAgICAgICAobW5nX3JldGNvZGUpMjA1MiAvKiBtdXN0IGhhdmUgaGFkIGhlYWRlciBmaXJzdCAgKi8KKyNkZWZpbmUgTU5HX05PQ09SUkNIVU5LICAgICAgKG1uZ19yZXRjb2RlKTIwNTMgLyogY2FuJ3QgZmluZCBwYXJlbnQgY2h1bmsgICAgICovCisjZGVmaW5lIE1OR19OT01IRFIgICAgICAgICAgIChtbmdfcmV0Y29kZSkyMDU0IC8qIG5vIE1ORyBoZWFkZXIgYXZhaWxhYmxlICAgICAqLworCisjZGVmaW5lIE1OR19JTUFHRVRPT0xBUkdFICAgIChtbmdfcmV0Y29kZSk0MDk3IC8qIGlucHV0LWltYWdlIHdheSB0b28gYmlnICAgICAqLworI2RlZmluZSBNTkdfTk9UQU5BTklNQVRJT04gICAobW5nX3JldGNvZGUpNDA5OCAvKiBmaWxlIG5vdCBhIE1ORyAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTU5HX0ZSQU1FTlJUT09ISUdIICAgKG1uZ19yZXRjb2RlKTQwOTkgLyogZnJhbWUtbnIgb3V0LW9mLXJhbmdlICAgICAgICovCisjZGVmaW5lIE1OR19MQVlFUk5SVE9PSElHSCAgIChtbmdfcmV0Y29kZSk0MTAwIC8qIGxheWVyLW5yIG91dC1vZi1yYW5nZSAgICAgICAqLworI2RlZmluZSBNTkdfUExBWVRJTUVUT09ISUdIICAobW5nX3JldGNvZGUpNDEwMSAvKiBwbGF5dGltZSBvdXQtb2YtcmFuZ2UgICAgICAgKi8KKyNkZWZpbmUgTU5HX0ZOTk9USU1QTEVNRU5URUQgKG1uZ19yZXRjb2RlKTQxMDIgLyogZnVuY3Rpb24gbm90IHlldCBhdmFpbGFibGUgICovCisKKyNkZWZpbmUgTU5HX0lNQUdFRlJPWkVOICAgICAgKG1uZ19yZXRjb2RlKTgxOTMgLyogc3RvcHBlZCBkaXNwbGF5aW5nICAgICAgICAgICovCisKKyNkZWZpbmUgTU5HX0xDTVNfTk9IQU5ETEUgICAgMSAgICAgICAgICAgICAgICAgLyogTENNUyByZXR1cm5lZCBOVUxMIGhhbmRsZSAgICovCisjZGVmaW5lIE1OR19MQ01TX05PTUVNICAgICAgIDIgICAgICAgICAgICAgICAgIC8qIExDTVMgcmV0dXJuZWQgTlVMTCBnYW1tYXRhYiAqLworI2RlZmluZSBNTkdfTENNU19OT1RSQU5TICAgICAzICAgICAgICAgICAgICAgICAvKiBMQ01TIHJldHVybmVkIE5VTEwgdHJhbnNmb3JtKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICBDYW52YXMgc3R5bGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogIE5vdGUgdGhhdCB0aGUgaW50ZW50aW9ucyBhcmUgcHJldHR5IGRhcm4gZ29vZCwgYnV0IHRoYXQgdGhlIGZvY3VzICAgICAqICovCisvKiAqICBpcyBjdXJyZW50bHkgb24gOC1iaXQgY29sb3Igc3VwcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogIFRoZSBSR0I4X0E4IHN0eWxlIGlzIGRlZmluZWQgZm9yIGFwcHMgdGhhdCByZXF1aXJlIGEgc2VwYXJhdGUgICAgICAgICAqICovCisvKiAqICBjYW52YXMgZm9yIHRoZSBjb2xvci1wbGFuZXMgYW5kIHRoZSBhbHBoYS1wbGFuZSAoZWcuIG1vemlsbGEpICAgICAgICAgKiAqLworLyogKiAgVGhpcyByZXF1aXJlcyBmb3IgdGhlIGFwcCB0byBzdXBwbHkgdGhlICJnZXRhbHBoYWxpbmUiIGNhbGxiYWNrISEhICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjZGVmaW5lIE1OR19DQU5WQVNfUkdCOCAgICAgIDB4MDAwMDAwMDBMCisjZGVmaW5lIE1OR19DQU5WQVNfUkdCQTggICAgIDB4MDAwMDEwMDBMCisjZGVmaW5lIE1OR19DQU5WQVNfUkdCQThfUE0gIDB4MDAwMDkwMDBMCisjZGVmaW5lIE1OR19DQU5WQVNfQVJHQjggICAgIDB4MDAwMDMwMDBMCisjZGVmaW5lIE1OR19DQU5WQVNfQVJHQjhfUE0gIDB4MDAwMEIwMDBMCisjZGVmaW5lIE1OR19DQU5WQVNfUkdCOF9BOCAgIDB4MDAwMDUwMDBMCisjZGVmaW5lIE1OR19DQU5WQVNfQkdSOCAgICAgIDB4MDAwMDAwMDFMCisjZGVmaW5lIE1OR19DQU5WQVNfQkdSWDggICAgIDB4MDAwMTAwMDFMCisjZGVmaW5lIE1OR19DQU5WQVNfQkdSQTggICAgIDB4MDAwMDEwMDFMCisjZGVmaW5lIE1OR19DQU5WQVNfQkdSQThQTSAgIDB4MDAwMDkwMDFMICAgICAgICAgLyogYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLworI2RlZmluZSBNTkdfQ0FOVkFTX0JHUkE4X1BNICAweDAwMDA5MDAxTAorI2RlZmluZSBNTkdfQ0FOVkFTX0FCR1I4ICAgICAweDAwMDAzMDAxTAorI2RlZmluZSBNTkdfQ0FOVkFTX0FCR1I4X1BNICAweDAwMDBCMDAxTAorI2RlZmluZSBNTkdfQ0FOVkFTX1JHQjE2ICAgICAweDAwMDAwMTAwTCAgICAgICAgIC8qIG5vdCBzdXBwb3J0ZWQgeWV0ICovCisjZGVmaW5lIE1OR19DQU5WQVNfUkdCQTE2ICAgIDB4MDAwMDExMDBMICAgICAgICAgLyogbm90IHN1cHBvcnRlZCB5ZXQgKi8KKyNkZWZpbmUgTU5HX0NBTlZBU19BUkdCMTYgICAgMHgwMDAwMzEwMEwgICAgICAgICAvKiBub3Qgc3VwcG9ydGVkIHlldCAqLworI2RlZmluZSBNTkdfQ0FOVkFTX0JHUjE2ICAgICAweDAwMDAwMTAxTCAgICAgICAgIC8qIG5vdCBzdXBwb3J0ZWQgeWV0ICovCisjZGVmaW5lIE1OR19DQU5WQVNfQkdSQTE2ICAgIDB4MDAwMDExMDFMICAgICAgICAgLyogbm90IHN1cHBvcnRlZCB5ZXQgKi8KKyNkZWZpbmUgTU5HX0NBTlZBU19BQkdSMTYgICAgMHgwMDAwMzEwMUwgICAgICAgICAvKiBub3Qgc3VwcG9ydGVkIHlldCAqLworI2RlZmluZSBNTkdfQ0FOVkFTX0dSQVk4ICAgICAweDAwMDAwMDAyTCAgICAgICAgIC8qIG5vdCBzdXBwb3J0ZWQgeWV0ICovCisjZGVmaW5lIE1OR19DQU5WQVNfR1JBWTE2ICAgIDB4MDAwMDAxMDJMICAgICAgICAgLyogbm90IHN1cHBvcnRlZCB5ZXQgKi8KKyNkZWZpbmUgTU5HX0NBTlZBU19HUkFZQTggICAgMHgwMDAwMTAwMkwgICAgICAgICAvKiBub3Qgc3VwcG9ydGVkIHlldCAqLworI2RlZmluZSBNTkdfQ0FOVkFTX0dSQVlBMTYgICAweDAwMDAxMTAyTCAgICAgICAgIC8qIG5vdCBzdXBwb3J0ZWQgeWV0ICovCisjZGVmaW5lIE1OR19DQU5WQVNfQUdSQVk4ICAgIDB4MDAwMDMwMDJMICAgICAgICAgLyogbm90IHN1cHBvcnRlZCB5ZXQgKi8KKyNkZWZpbmUgTU5HX0NBTlZBU19BR1JBWTE2ICAgMHgwMDAwMzEwMkwgICAgICAgICAvKiBub3Qgc3VwcG9ydGVkIHlldCAqLworI2RlZmluZSBNTkdfQ0FOVkFTX0RYMTUgICAgICAweDAwMDAwMDAzTCAgICAgICAgIC8qIG5vdCBzdXBwb3J0ZWQgeWV0ICovCisjZGVmaW5lIE1OR19DQU5WQVNfRFgxNiAgICAgIDB4MDAwMDAwMDRMICAgICAgICAgLyogbm90IHN1cHBvcnRlZCB5ZXQgKi8KKworI2RlZmluZSBNTkdfQ0FOVkFTX1JHQjU2NSAgICAweDAwMDAwMDA1TAorI2RlZmluZSBNTkdfQ0FOVkFTX1JHQkE1NjUgICAweDAwMDAxMDA1TAorI2RlZmluZSBNTkdfQ0FOVkFTX0JHUjU2NSAgICAweDAwMDAwMDA2TAorI2RlZmluZSBNTkdfQ0FOVkFTX0JHUkE1NjUgICAweDAwMDAxMDA2TAorI2RlZmluZSBNTkdfQ0FOVkFTX0JHUjU2NV9BOCAweDAwMDA0MDA2TAorCisjZGVmaW5lIE1OR19DQU5WQVNfUkdCNTU1ICAgIDB4MDAwMDAwMDdMCisjZGVmaW5lIE1OR19DQU5WQVNfQkdSNTU1ICAgIDB4MDAwMDAwMDhMCisKKyNkZWZpbmUgTU5HX0NBTlZBU19QSVhFTFRZUEUoQykgIChDICYgMHgwMDAwMDBGRkwpCisjZGVmaW5lIE1OR19DQU5WQVNfQklUREVQVEgoQykgICAoQyAmIDB4MDAwMDAxMDBMKQorI2RlZmluZSBNTkdfQ0FOVkFTX0hBU0FMUEhBKEMpICAgKEMgJiAweDAwMDAxMDAwTCkKKyNkZWZpbmUgTU5HX0NBTlZBU19BTFBIQUZJUlNUKEMpIChDICYgMHgwMDAwMjAwMEwpCisjZGVmaW5lIE1OR19DQU5WQVNfQUxQSEFTRVBEKEMpICAoQyAmIDB4MDAwMDQwMDBMKQorI2RlZmluZSBNTkdfQ0FOVkFTX0FMUEhBUE0oQykgICAgKEMgJiAweDAwMDA4MDAwTCkKKyNkZWZpbmUgTU5HX0NBTlZBU19IQVNGSUxMRVIoQykgIChDICYgMHgwMDAxMDAwMEwpCisKKyNkZWZpbmUgTU5HX0NBTlZBU19SR0IoQykgICAgICAgIChNTkdfQ0FOVkFTX1BJWEVMVFlQRSAoQykgPT0gMCkKKyNkZWZpbmUgTU5HX0NBTlZBU19CR1IoQykgICAgICAgIChNTkdfQ0FOVkFTX1BJWEVMVFlQRSAoQykgPT0gMSkKKyNkZWZpbmUgTU5HX0NBTlZBU19HUkFZKEMpICAgICAgIChNTkdfQ0FOVkFTX1BJWEVMVFlQRSAoQykgPT0gMikKKyNkZWZpbmUgTU5HX0NBTlZBU19ESVJFQ1RYMTUoQykgIChNTkdfQ0FOVkFTX1BJWEVMVFlQRSAoQykgPT0gMykKKyNkZWZpbmUgTU5HX0NBTlZBU19ESVJFQ1RYMTYoQykgIChNTkdfQ0FOVkFTX1BJWEVMVFlQRSAoQykgPT0gNCkKKyNkZWZpbmUgTU5HX0NBTlZBU19SR0JfNTY1KEMpICAgIChNTkdfQ0FOVkFTX1BJWEVMVFlQRSAoQykgPT0gNSkKKyNkZWZpbmUgTU5HX0NBTlZBU19CR1JfNTY1KEMpICAgIChNTkdfQ0FOVkFTX1BJWEVMVFlQRSAoQykgPT0gNikKKyNkZWZpbmUgTU5HX0NBTlZBU184QklUKEMpICAgICAgICghTU5HX0NBTlZBU19CSVRERVBUSCAoQykpCisjZGVmaW5lIE1OR19DQU5WQVNfMTZCSVQoQykgICAgICAoTU5HX0NBTlZBU19CSVRERVBUSCAoQykpCisjZGVmaW5lIE1OR19DQU5WQVNfUElYRUxGSVJTVChDKSAoIU1OR19DQU5WQVNfQUxQSEFGSVJTVCAoQykpCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgQ2h1bmsgbmFtZXMgKGlkZWEgYWRhcHRlZCBmcm9tIGxpYnBuZyAxLjEuMCAtIHBuZy5oKSAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjZGVmaW5lIE1OR19VSU5UX0hVSCAgMHg0MDQwNDA0MEwKKworI2RlZmluZSBNTkdfVUlOVF9CQUNLIDB4NDI0MTQzNGJMCisjZGVmaW5lIE1OR19VSU5UX0JBU0kgMHg0MjQxNTM0OUwKKyNkZWZpbmUgTU5HX1VJTlRfQ0xJUCAweDQzNGM0OTUwTAorI2RlZmluZSBNTkdfVUlOVF9DTE9OIDB4NDM0YzRmNGVMCisjZGVmaW5lIE1OR19VSU5UX0RCWUsgMHg0NDQyNTk0YkwKKyNkZWZpbmUgTU5HX1VJTlRfREVGSSAweDQ0NDU0NjQ5TAorI2RlZmluZSBNTkdfVUlOVF9ESERSIDB4NDQ0ODQ0NTJMCisjZGVmaW5lIE1OR19VSU5UX0RJU0MgMHg0NDQ5NTM0M0wKKyNkZWZpbmUgTU5HX1VJTlRfRFJPUCAweDQ0NTI0ZjUwTAorI2RlZmluZSBNTkdfVUlOVF9FTkRMIDB4NDU0ZTQ0NGNMCisjZGVmaW5lIE1OR19VSU5UX0ZSQU0gMHg0NjUyNDE0ZEwKKyNkZWZpbmUgTU5HX1VJTlRfSURBVCAweDQ5NDQ0MTU0TAorI2RlZmluZSBNTkdfVUlOVF9JRU5EIDB4NDk0NTRlNDRMCisjZGVmaW5lIE1OR19VSU5UX0lIRFIgMHg0OTQ4NDQ1MkwKKyNkZWZpbmUgTU5HX1VJTlRfSUpORyAweDQ5NGE0ZTQ3TAorI2RlZmluZSBNTkdfVUlOVF9JUE5HIDB4NDk1MDRlNDdMCisjZGVmaW5lIE1OR19VSU5UX0pEQUEgMHg0YTQ0NDE0MUwKKyNkZWZpbmUgTU5HX1VJTlRfSkRBVCAweDRhNDQ0MTU0TAorI2RlZmluZSBNTkdfVUlOVF9KSERSIDB4NGE0ODQ0NTJMCisjZGVmaW5lIE1OR19VSU5UX0pTRVAgMHg0YTUzNDU1MEwKKyNkZWZpbmUgTU5HX1VJTlRfSmRBQSAweDRhNjQ0MTQxTAorI2RlZmluZSBNTkdfVUlOVF9MT09QIDB4NGM0ZjRmNTBMCisjZGVmaW5lIE1OR19VSU5UX01BR04gMHg0ZDQxNDc0ZUwKKyNkZWZpbmUgTU5HX1VJTlRfTUVORCAweDRkNDU0ZTQ0TAorI2RlZmluZSBNTkdfVUlOVF9NSERSIDB4NGQ0ODQ0NTJMCisjZGVmaW5lIE1OR19VSU5UX01PVkUgMHg0ZDRmNTY0NUwKKyNkZWZpbmUgTU5HX1VJTlRfT1JEUiAweDRmNTI0NDUyTAorI2RlZmluZSBNTkdfVUlOVF9QQVNUIDB4NTA0MTUzNTRMCisjZGVmaW5lIE1OR19VSU5UX1BMVEUgMHg1MDRjNTQ0NUwKKyNkZWZpbmUgTU5HX1VJTlRfUFBMVCAweDUwNTA0YzU0TAorI2RlZmluZSBNTkdfVUlOVF9QUk9NIDB4NTA1MjRmNGRMCisjZGVmaW5lIE1OR19VSU5UX1NBVkUgMHg1MzQxNTY0NUwKKyNkZWZpbmUgTU5HX1VJTlRfU0VFSyAweDUzNDU0NTRiTAorI2RlZmluZSBNTkdfVUlOVF9TSE9XIDB4NTM0ODRmNTdMCisjZGVmaW5lIE1OR19VSU5UX1RFUk0gMHg1NDQ1NTI0ZEwKKyNkZWZpbmUgTU5HX1VJTlRfYWRBVCAweDYxNjQ0MTU0TAorI2RlZmluZSBNTkdfVUlOVF9haERSIDB4NjE2ODQ0NTJMCisjZGVmaW5lIE1OR19VSU5UX2JLR0QgMHg2MjRiNDc0NEwKKyNkZWZpbmUgTU5HX1VJTlRfY0hSTSAweDYzNDg1MjRkTAorI2RlZmluZSBNTkdfVUlOVF9lWFBJIDB4NjU1ODUwNDlMCisjZGVmaW5lIE1OR19VSU5UX2V2TlQgMHg2NTc2NGU1NEwKKyNkZWZpbmUgTU5HX1VJTlRfZlBSSSAweDY2NTA1MjQ5TAorI2RlZmluZSBNTkdfVUlOVF9nQU1BIDB4Njc0MTRkNDFMCisjZGVmaW5lIE1OR19VSU5UX2hJU1QgMHg2ODQ5NTM1NEwKKyNkZWZpbmUgTU5HX1VJTlRfaUNDUCAweDY5NDM0MzUwTAorI2RlZmluZSBNTkdfVUlOVF9pVFh0IDB4Njk1NDU4NzRMCisjZGVmaW5lIE1OR19VSU5UX21wTkcgMHg2ZDcwNGU0N0wKKyNkZWZpbmUgTU5HX1VJTlRfbkVFRCAweDZlNDU0NTQ0TAorI2RlZmluZSBNTkdfVUlOVF9vRkZzIDB4NmY0NjQ2NzNMCisjZGVmaW5lIE1OR19VSU5UX3BDQUwgMHg3MDQzNDE0Y0wKKyNkZWZpbmUgTU5HX1VJTlRfcEhZZyAweDcwNDQ0MTY3TAorI2RlZmluZSBNTkdfVUlOVF9wSFlzIDB4NzA0ODU5NzNMCisjZGVmaW5lIE1OR19VSU5UX3NCSVQgMHg3MzQyNDk1NEwKKyNkZWZpbmUgTU5HX1VJTlRfc0NBTCAweDczNDM0MTRjTAorI2RlZmluZSBNTkdfVUlOVF9zUExUIDB4NzM1MDRjNTRMCisjZGVmaW5lIE1OR19VSU5UX3NSR0IgMHg3MzUyNDc0MkwKKyNkZWZpbmUgTU5HX1VJTlRfdEVYdCAweDc0NDU1ODc0TAorI2RlZmluZSBNTkdfVUlOVF90SU1FIDB4NzQ0OTRkNDVMCisjZGVmaW5lIE1OR19VSU5UX3RSTlMgMHg3NDUyNGU1M0wKKyNkZWZpbmUgTU5HX1VJTlRfelRYdCAweDdhNTQ1ODc0TAorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogIENodW5rIHByb3BlcnR5IHZhbHVlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2RlZmluZSBNTkdfQklUREVQVEhfMSAgICAgICAgICAgICAgICAgICAxICAgICAgIC8qIElIRFIsIEJBU0ksIEpIRFIsIFBST00gKi8KKyNkZWZpbmUgTU5HX0JJVERFUFRIXzIgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBNTkdfQklUREVQVEhfNCAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIE1OR19CSVRERVBUSF84ICAgICAgICAgICAgICAgICAgIDggICAgICAgLyogc1BMVCAqLworI2RlZmluZSBNTkdfQklUREVQVEhfMTYgICAgICAgICAgICAgICAgIDE2CisKKyNkZWZpbmUgTU5HX0NPTE9SVFlQRV9HUkFZICAgICAgICAgICAgICAgMCAgICAgICAvKiBJSERSLCBCQVNJLCBQUk9NICovCisjZGVmaW5lIE1OR19DT0xPUlRZUEVfUkdCICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTU5HX0NPTE9SVFlQRV9JTkRFWEVEICAgICAgICAgICAgMworI2RlZmluZSBNTkdfQ09MT1JUWVBFX0dSQVlBICAgICAgICAgICAgICA0CisjZGVmaW5lIE1OR19DT0xPUlRZUEVfUkdCQSAgICAgICAgICAgICAgIDYKKworI2RlZmluZSBNTkdfQ09NUFJFU1NJT05fREVGTEFURSAgICAgICAgICAwICAgICAgIC8qIElIRFIsIHpUWHQsIGlUWHQsIGlDQ1AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkFTSSwgSkhEUiAqLworCisjZGVmaW5lIE1OR19GSUxURVJfQURBUFRJVkUgICAgICAgICAgICAgIDAgICAgICAgLyogSUhEUiwgQkFTSSwgSkhEUiAqLworLyogI2RlZmluZSBNTkdfRklMVEVSX05PX0FEQVBUSVZFICAgICAgICAgICAxCisjZGVmaW5lIE1OR19GSUxURVJfTk9fRElGRkVSSU5HICAgICAgICAgIDAKKyNkZWZpbmUgTU5HX0ZJTFRFUl9ESUZGRVJJTkcgICAgICAgICAgICAgMHg0MAorI2RlZmluZSBNTkdfRklMVEVSX01BU0sgICAgICAgICAgICAgICAgICAoTU5HX0ZJTFRFUl9OT19BREFQVElWRSB8IE1OR19GSUxURVJfRElGRkVSSU5HKSAqLworI2lmZGVmIEZJTFRFUjE5MgorI2RlZmluZSBNTkdfRklMVEVSX0RJRkZFUklORyAgICAgICAgICAgICAweEMwCisjZW5kaWYKKyNpZmRlZiBGSUxURVIxOTMKKyNkZWZpbmUgTU5HX0ZJTFRFUl9OT0ZJTFRFUiAgICAgICAgICAgICAgMHhDMQorI2VuZGlmCisKKyNkZWZpbmUgTU5HX0lOVEVSTEFDRV9OT05FICAgICAgICAgICAgICAgMCAgICAgICAvKiBJSERSLCBCQVNJLCBKSERSICovCisjZGVmaW5lIE1OR19JTlRFUkxBQ0VfQURBTTcgICAgICAgICAgICAgIDEKKworI2RlZmluZSBNTkdfRklMVEVSX05PTkUgICAgICAgICAgICAgICAgICAwICAgICAgIC8qIElEQVQgKi8KKyNkZWZpbmUgTU5HX0ZJTFRFUl9TVUIgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBNTkdfRklMVEVSX1VQICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIE1OR19GSUxURVJfQVZFUkFHRSAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgTU5HX0ZJTFRFUl9QQUVUSCAgICAgICAgICAgICAgICAgNAorCisjZGVmaW5lIE1OR19JTlRFTlRfUEVSQ0VQVFVBTCAgICAgICAgICAgIDAgICAgICAgLyogc1JHQiAqLworI2RlZmluZSBNTkdfSU5URU5UX1JFTEFUSVZFQ09MT1JJTUVUUklDICAxCisjZGVmaW5lIE1OR19JTlRFTlRfU0FUVVJBVElPTiAgICAgICAgICAgIDIKKyNkZWZpbmUgTU5HX0lOVEVOVF9BQlNPTFVURUNPTE9SSU1FVFJJQyAgMworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRFWHQsIHpUWHQsIGlUWHQgKi8KKyNkZWZpbmUgTU5HX1RFWFRfVElUTEUgICAgICAgICAgICAgICAgICAgIlRpdGxlIgorI2RlZmluZSBNTkdfVEVYVF9BVVRIT1IgICAgICAgICAgICAgICAgICAiQXV0aG9yIgorI2RlZmluZSBNTkdfVEVYVF9ERVNDUklQVElPTiAgICAgICAgICAgICAiRGVzY3JpcHRpb24iCisjZGVmaW5lIE1OR19URVhUX0NPUFlSSUdIVCAgICAgICAgICAgICAgICJDb3B5cmlnaHQiCisjZGVmaW5lIE1OR19URVhUX0NSRUFUSU9OVElNRSAgICAgICAgICAgICJDcmVhdGlvbiBUaW1lIgorI2RlZmluZSBNTkdfVEVYVF9TT0ZUV0FSRSAgICAgICAgICAgICAgICAiU29mdHdhcmUiCisjZGVmaW5lIE1OR19URVhUX0RJU0NMQUlNRVIgICAgICAgICAgICAgICJEaXNjbGFpbWVyIgorI2RlZmluZSBNTkdfVEVYVF9XQVJOSU5HICAgICAgICAgICAgICAgICAiV2FybmluZyIKKyNkZWZpbmUgTU5HX1RFWFRfU09VUkNFICAgICAgICAgICAgICAgICAgIlNvdXJjZSIKKyNkZWZpbmUgTU5HX1RFWFRfQ09NTUVOVCAgICAgICAgICAgICAgICAgIkNvbW1lbnQiCisKKyNkZWZpbmUgTU5HX0ZMQUdfVU5DT01QUkVTU0VEICAgICAgICAgICAgMCAgICAgICAvKiBpVFh0ICovCisjZGVmaW5lIE1OR19GTEFHX0NPTVBSRVNTRUQgICAgICAgICAgICAgIDEKKworI2RlZmluZSBNTkdfVU5JVF9VTktOT1dOICAgICAgICAgICAgICAgICAwICAgICAgIC8qIHBIWXMsIHBIWWcgKi8KKyNkZWZpbmUgTU5HX1VOSVRfTUVURVIgICAgICAgICAgICAgICAgICAgMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1IRFIgKi8KKyNkZWZpbmUgTU5HX1NJTVBMSUNJVFlfVkFMSUQgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBNTkdfU0lNUExJQ0lUWV9TSU1QTEVGRUFUVVJFUyAgICAweDAwMDAwMDAyCisjZGVmaW5lIE1OR19TSU1QTElDSVRZX0NPTVBMRVhGRUFUVVJFUyAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgTU5HX1NJTVBMSUNJVFlfVFJBTlNQQVJFTkNZICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBNTkdfU0lNUExJQ0lUWV9KTkcgICAgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIE1OR19TSU1QTElDSVRZX0RFTFRBUE5HICAgICAgICAgIDB4MDAwMDAwMjAKKworI2RlZmluZSBNTkdfVEVSTUlOQVRJT05fREVDT0RFUl9OQyAgICAgICAwICAgICAgIC8qIExPT1AgKi8KKyNkZWZpbmUgTU5HX1RFUk1JTkFUSU9OX1VTRVJfTkMgICAgICAgICAgMQorI2RlZmluZSBNTkdfVEVSTUlOQVRJT05fRVhURVJOQUxfTkMgICAgICAyCisjZGVmaW5lIE1OR19URVJNSU5BVElPTl9ERVRFUk1JTklTVElDX05DIDMKKyNkZWZpbmUgTU5HX1RFUk1JTkFUSU9OX0RFQ09ERVJfQyAgICAgICAgNAorI2RlZmluZSBNTkdfVEVSTUlOQVRJT05fVVNFUl9DICAgICAgICAgICA1CisjZGVmaW5lIE1OR19URVJNSU5BVElPTl9FWFRFUk5BTF9DICAgICAgIDYKKyNkZWZpbmUgTU5HX1RFUk1JTkFUSU9OX0RFVEVSTUlOSVNUSUNfQyAgNworCisjZGVmaW5lIE1OR19ET05PVFNIT1dfVklTSUJMRSAgICAgICAgICAgIDAgICAgICAgLyogREVGSSAqLworI2RlZmluZSBNTkdfRE9OT1RTSE9XX05PVFZJU0lCTEUgICAgICAgICAxCisKKyNkZWZpbmUgTU5HX0FCU1RSQUNUICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAvKiBERUZJICovCisjZGVmaW5lIE1OR19DT05DUkVURSAgICAgICAgICAgICAgICAgICAgIDEKKworI2RlZmluZSBNTkdfTk9UVklFV0FCTEUgICAgICAgICAgICAgICAgICAwICAgICAgIC8qIEJBU0kgKi8KKyNkZWZpbmUgTU5HX1ZJRVdBQkxFICAgICAgICAgICAgICAgICAgICAgMQorCisjZGVmaW5lIE1OR19GVUxMX0NMT05FICAgICAgICAgICAgICAgICAgIDAgICAgICAgLyogQ0xPTiAqLworI2RlZmluZSBNTkdfUEFSVElBTF9DTE9ORSAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1OR19SRU5VTUJFUiAgICAgICAgICAgICAgICAgICAgIDIKKworI2RlZmluZSBNTkdfQ09OQ1JFVEVfQVNQQVJFTlQgICAgICAgICAgICAwICAgICAgIC8qIENMT04gKi8KKyNkZWZpbmUgTU5HX0NPTkNSRVRFX01BS0VBQlNUUkFDVCAgICAgICAgMQorCisjZGVmaW5lIE1OR19MT0NBVElPTl9BQlNPTFVURSAgICAgICAgICAgIDAgICAgICAgLyogQ0xPTiwgTU9WRSAqLworI2RlZmluZSBNTkdfTE9DQVRJT05fUkVMQVRJVkUgICAgICAgICAgICAxCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19QQVNUCisjZGVmaW5lIE1OR19UQVJHRVRfQUJTT0xVVEUgICAgICAgICAgICAgIDAgICAgICAgLyogUEFTVCAqLworI2RlZmluZSBNTkdfVEFSR0VUX1JFTEFUSVZFX1NBTUVQQVNUICAgICAxCisjZGVmaW5lIE1OR19UQVJHRVRfUkVMQVRJVkVfUFJFVlBBU1QgICAgIDIKKworI2RlZmluZSBNTkdfQ09NUE9TSVRFX09WRVIgICAgICAgICAgICAgICAwICAgICAgIC8qIFBBU1QgKi8KKyNkZWZpbmUgTU5HX0NPTVBPU0lURV9SRVBMQUNFICAgICAgICAgICAgMQorI2RlZmluZSBNTkdfQ09NUE9TSVRFX1VOREVSICAgICAgICAgICAgICAyCisKKyNkZWZpbmUgTU5HX09SSUVOVEFUSU9OX1NBTUUgICAgICAgICAgICAgMCAgICAgICAvKiBQQVNUICovCisjZGVmaW5lIE1OR19PUklFTlRBVElPTl8xODBERUcgICAgICAgICAgIDIKKyNkZWZpbmUgTU5HX09SSUVOVEFUSU9OX0ZMSVBIT1JaICAgICAgICAgNAorI2RlZmluZSBNTkdfT1JJRU5UQVRJT05fRkxJUFZFUlQgICAgICAgICA2CisjZGVmaW5lIE1OR19PUklFTlRBVElPTl9USUxFRCAgICAgICAgICAgIDgKKworI2RlZmluZSBNTkdfT0ZGU0VUX0FCU09MVVRFICAgICAgICAgICAgICAwICAgICAgIC8qIFBBU1QgKi8KKyNkZWZpbmUgTU5HX09GRlNFVF9SRUxBVElWRSAgICAgICAgICAgICAgMQorI2VuZGlmCisKKyNkZWZpbmUgTU5HX0JPVU5EQVJZX0FCU09MVVRFICAgICAgICAgICAgMCAgICAgICAvKiBQQVNULCBGUkFNICovCisjZGVmaW5lIE1OR19CT1VOREFSWV9SRUxBVElWRSAgICAgICAgICAgIDEKKworI2RlZmluZSBNTkdfQkFDS0dST1VORENPTE9SX01BTkRBVE9SWSAgICAweDAxICAgIC8qIEJBQ0sgKi8KKyNkZWZpbmUgTU5HX0JBQ0tHUk9VTkRJTUFHRV9NQU5EQVRPUlkgICAgMHgwMiAgICAvKiBCQUNLICovCisKKyNkZWZpbmUgTU5HX0JBQ0tHUk9VTkRJTUFHRV9OT1RJTEUgICAgICAgMCAgICAgICAvKiBCQUNLICovCisjZGVmaW5lIE1OR19CQUNLR1JPVU5ESU1BR0VfVElMRSAgICAgICAgIDEKKworI2RlZmluZSBNTkdfRlJBTUlOR01PREVfTk9DSEFOR0UgICAgICAgICAwICAgICAgIC8qIEZSQU0gKi8KKyNkZWZpbmUgTU5HX0ZSQU1JTkdNT0RFXzEgICAgICAgICAgICAgICAgMQorI2RlZmluZSBNTkdfRlJBTUlOR01PREVfMiAgICAgICAgICAgICAgICAyCisjZGVmaW5lIE1OR19GUkFNSU5HTU9ERV8zICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgTU5HX0ZSQU1JTkdNT0RFXzQgICAgICAgICAgICAgICAgNAorCisjZGVmaW5lIE1OR19DSEFOR0VERUxBWV9OTyAgICAgICAgICAgICAgIDAgICAgICAgLyogRlJBTSAqLworI2RlZmluZSBNTkdfQ0hBTkdFREVMQVlfTkVYVFNVQkZSQU1FICAgICAxCisjZGVmaW5lIE1OR19DSEFOR0VERUxBWV9ERUZBVUxUICAgICAgICAgIDIKKworI2RlZmluZSBNTkdfQ0hBTkdFVElNT1VUX05PICAgICAgICAgICAgICAwICAgICAgIC8qIEZSQU0gKi8KKyNkZWZpbmUgTU5HX0NIQU5HRVRJTU9VVF9ERVRFUk1JTklTVElDXzEgMQorI2RlZmluZSBNTkdfQ0hBTkdFVElNT1VUX0RFVEVSTUlOSVNUSUNfMiAyCisjZGVmaW5lIE1OR19DSEFOR0VUSU1PVVRfREVDT0RFUl8xICAgICAgIDMKKyNkZWZpbmUgTU5HX0NIQU5HRVRJTU9VVF9ERUNPREVSXzIgICAgICAgNAorI2RlZmluZSBNTkdfQ0hBTkdFVElNT1VUX1VTRVJfMSAgICAgICAgICA1CisjZGVmaW5lIE1OR19DSEFOR0VUSU1PVVRfVVNFUl8yICAgICAgICAgIDYKKyNkZWZpbmUgTU5HX0NIQU5HRVRJTU9VVF9FWFRFUk5BTF8xICAgICAgNworI2RlZmluZSBNTkdfQ0hBTkdFVElNT1VUX0VYVEVSTkFMXzIgICAgICA4CisKKyNkZWZpbmUgTU5HX0NIQU5HRUNMSVBQSU5HX05PICAgICAgICAgICAgMCAgICAgICAvKiBGUkFNICovCisjZGVmaW5lIE1OR19DSEFOR0VDTElQUElOR19ORVhUU1VCRlJBTUUgIDEKKyNkZWZpbmUgTU5HX0NIQU5HRUNMSVBQSU5HX0RFRkFVTFQgICAgICAgMgorCisjZGVmaW5lIE1OR19DSEFOR0VTWU5DSURfTk8gICAgICAgICAgICAgIDAgICAgICAgLyogRlJBTSAqLworI2RlZmluZSBNTkdfQ0hBTkdFU1lOQ0lEX05FWFRTVUJGUkFNRSAgICAxCisjZGVmaW5lIE1OR19DSEFOR0VTWU5DSURfREVGQVVMVCAgICAgICAgIDIKKworI2RlZmluZSBNTkdfQ0xJUFBJTkdfQUJTT0xVVEUgICAgICAgICAgICAwICAgICAgIC8qIENMSVAgKi8KKyNkZWZpbmUgTU5HX0NMSVBQSU5HX1JFTEFUSVZFICAgICAgICAgICAgMQorCisjZGVmaW5lIE1OR19TSE9XTU9ERV8wICAgICAgICAgICAgICAgICAgIDAgICAgICAgLyogU0hPVyAqLworI2RlZmluZSBNTkdfU0hPV01PREVfMSAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1OR19TSE9XTU9ERV8yICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTU5HX1NIT1dNT0RFXzMgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBNTkdfU0hPV01PREVfNCAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIE1OR19TSE9XTU9ERV81ICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgTU5HX1NIT1dNT0RFXzYgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBNTkdfU0hPV01PREVfNyAgICAgICAgICAgICAgICAgICA3CisKKyNkZWZpbmUgTU5HX1RFUk1BQ1RJT05fTEFTVEZSQU1FICAgICAgICAgMCAgICAgICAvKiBURVJNICovCisjZGVmaW5lIE1OR19URVJNQUNUSU9OX0NMRUFSICAgICAgICAgICAgIDEKKyNkZWZpbmUgTU5HX1RFUk1BQ1RJT05fRklSU1RGUkFNRSAgICAgICAgMgorI2RlZmluZSBNTkdfVEVSTUFDVElPTl9SRVBFQVQgICAgICAgICAgICAzCisKKyNkZWZpbmUgTU5HX0lURVJBQ1RJT05fTEFTVEZSQU1FICAgICAgICAgMCAgICAgICAvKiBURVJNICovCisjZGVmaW5lIE1OR19JVEVSQUNUSU9OX0NMRUFSICAgICAgICAgICAgIDEKKyNkZWZpbmUgTU5HX0lURVJBQ1RJT05fRklSU1RGUkFNRSAgICAgICAgMgorCisjZGVmaW5lIE1OR19TQVZFT0ZGU0VUXzRCWVRFICAgICAgICAgICAgIDQgICAgICAgLyogU0FWRSAqLworI2RlZmluZSBNTkdfU0FWRU9GRlNFVF84QllURSAgICAgICAgICAgICA4CisKKyNkZWZpbmUgTU5HX1NBVkVFTlRSWV9TRUdNRU5URlVMTCAgICAgICAgMCAgICAgICAvKiBTQVZFICovCisjZGVmaW5lIE1OR19TQVZFRU5UUllfU0VHTUVOVCAgICAgICAgICAgIDEKKyNkZWZpbmUgTU5HX1NBVkVFTlRSWV9TVUJGUkFNRSAgICAgICAgICAgMgorI2RlZmluZSBNTkdfU0FWRUVOVFJZX0VYUE9SVEVESU1BR0UgICAgICAzCisKKyNkZWZpbmUgTU5HX1BSSU9SSVRZX0FCU09MVVRFICAgICAgICAgICAgMCAgICAgICAvKiBmUFJJICovCisjZGVmaW5lIE1OR19QUklPUklUWV9SRUxBVElWRSAgICAgICAgICAgIDEKKworI2lmZGVmIE1OR19JTkNMVURFX0pORworI2RlZmluZSBNTkdfQ09MT1JUWVBFX0pQRUdHUkFZICAgICAgICAgICA4ICAgICAgIC8qIEpIRFIgKi8KKyNkZWZpbmUgTU5HX0NPTE9SVFlQRV9KUEVHQ09MT1IgICAgICAgICAxMAorI2RlZmluZSBNTkdfQ09MT1JUWVBFX0pQRUdHUkFZQSAgICAgICAgIDEyCisjZGVmaW5lIE1OR19DT0xPUlRZUEVfSlBFR0NPTE9SQSAgICAgICAgMTQKKworI2RlZmluZSBNTkdfQklUREVQVEhfSlBFRzggICAgICAgICAgICAgICA4ICAgICAgIC8qIEpIRFIgKi8KKyNkZWZpbmUgTU5HX0JJVERFUFRIX0pQRUcxMiAgICAgICAgICAgICAxMgorI2RlZmluZSBNTkdfQklUREVQVEhfSlBFRzhBTkQxMiAgICAgICAgIDIwCisKKyNkZWZpbmUgTU5HX0NPTVBSRVNTSU9OX0JBU0VMSU5FSlBFRyAgICAgOCAgICAgICAvKiBKSERSICovCisKKyNkZWZpbmUgTU5HX0lOVEVSTEFDRV9TRVFVRU5USUFMICAgICAgICAgMCAgICAgICAvKiBKSERSICovCisjZGVmaW5lIE1OR19JTlRFUkxBQ0VfUFJPR1JFU1NJVkUgICAgICAgIDgKKyNlbmRpZiAvKiBNTkdfSU5DTFVERV9KTkcgKi8KKworI2RlZmluZSBNTkdfSU1BR0VUWVBFX1VOS05PV04gICAgICAgICAgICAwICAgICAgIC8qIERIRFIgKi8KKyNkZWZpbmUgTU5HX0lNQUdFVFlQRV9QTkcgICAgICAgICAgICAgICAgMQorI2RlZmluZSBNTkdfSU1BR0VUWVBFX0pORyAgICAgICAgICAgICAgICAyCisKKyNkZWZpbmUgTU5HX0RFTFRBVFlQRV9SRVBMQUNFICAgICAgICAgICAgMCAgICAgICAvKiBESERSICovCisjZGVmaW5lIE1OR19ERUxUQVRZUEVfQkxPQ0tQSVhFTEFERCAgICAgIDEKKyNkZWZpbmUgTU5HX0RFTFRBVFlQRV9CTE9DS0FMUEhBQUREICAgICAgMgorI2RlZmluZSBNTkdfREVMVEFUWVBFX0JMT0NLQ09MT1JBREQgICAgICAzCisjZGVmaW5lIE1OR19ERUxUQVRZUEVfQkxPQ0tQSVhFTFJFUExBQ0UgIDQKKyNkZWZpbmUgTU5HX0RFTFRBVFlQRV9CTE9DS0FMUEhBUkVQTEFDRSAgNQorI2RlZmluZSBNTkdfREVMVEFUWVBFX0JMT0NLQ09MT1JSRVBMQUNFICA2CisjZGVmaW5lIE1OR19ERUxUQVRZUEVfTk9DSEFOR0UgICAgICAgICAgIDcKKworI2RlZmluZSBNTkdfRklMTE1FVEhPRF9MRUZUQklUUkVQTElDQVRFICAwICAgICAgIC8qIFBST00gKi8KKyNkZWZpbmUgTU5HX0ZJTExNRVRIT0RfWkVST0ZJTEwgICAgICAgICAgMQorCisjZGVmaW5lIE1OR19ERUxUQVRZUEVfUkVQTEFDRVJHQiAgICAgICAgIDAgICAgICAgLyogUFBMVCAqLworI2RlZmluZSBNTkdfREVMVEFUWVBFX0RFTFRBUkdCICAgICAgICAgICAxCisjZGVmaW5lIE1OR19ERUxUQVRZUEVfUkVQTEFDRUFMUEhBICAgICAgIDIKKyNkZWZpbmUgTU5HX0RFTFRBVFlQRV9ERUxUQUFMUEhBICAgICAgICAgMworI2RlZmluZSBNTkdfREVMVEFUWVBFX1JFUExBQ0VSR0JBICAgICAgICA0CisjZGVmaW5lIE1OR19ERUxUQVRZUEVfREVMVEFSR0JBICAgICAgICAgIDUKKworI2RlZmluZSBNTkdfUE9MQVJJVFlfT05MWSAgICAgICAgICAgICAgICAwICAgICAgIC8qIERCWUsgKi8KKyNkZWZpbmUgTU5HX1BPTEFSSVRZX0FMTEJVVCAgICAgICAgICAgICAgMQorCisjZGVmaW5lIE1OR19FVkVOVF9OT05FICAgICAgICAgICAgICAgICAgIDAgICAgICAgLyogZXZOVCAqLworI2RlZmluZSBNTkdfRVZFTlRfTU9VU0VFTlRFUiAgICAgICAgICAgICAxCisjZGVmaW5lIE1OR19FVkVOVF9NT1VTRU1PVkUgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTU5HX0VWRU5UX01PVVNFRVhJVCAgICAgICAgICAgICAgMworI2RlZmluZSBNTkdfRVZFTlRfTU9VU0VET1dOICAgICAgICAgICAgICA0CisjZGVmaW5lIE1OR19FVkVOVF9NT1VTRVVQICAgICAgICAgICAgICAgIDUKKworI2RlZmluZSBNTkdfTUFTS19OT05FICAgICAgICAgICAgICAgICAgICAwICAgICAgIC8qIGV2TlQgKi8KKyNkZWZpbmUgTU5HX01BU0tfQk9YICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBNTkdfTUFTS19PQkpFQ1QgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIE1OR19NQVNLX09CSkVDVElYICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgTU5HX01BU0tfQk9YT0JKRUNUICAgICAgICAgICAgICAgNAorI2RlZmluZSBNTkdfTUFTS19CT1hPQkpFQ1RJWCAgICAgICAgICAgICA1CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgUHJvY2Vzc3RleHQgY2FsbGJhY2sgdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjZGVmaW5lIE1OR19UWVBFX1RFWFQgMAorI2RlZmluZSBNTkdfVFlQRV9aVFhUIDEKKyNkZWZpbmUgTU5HX1RZUEVfSVRYVCAyCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgQ1JDIHByb2Nlc3NpbmcgbWFza3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjZGVmaW5lIE1OR19DUkNfSU5QVVQgICAgICAgICAgICAgIDB4MDAwMDAwMGYKKyNkZWZpbmUgTU5HX0NSQ19JTlBVVF9OT05FICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBNTkdfQ1JDX0lOUFVUX1BSRVNFTlQgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIE1OR19DUkNfT1VUUFVUICAgICAgICAgICAgIDB4MDAwMDAwZjAKKyNkZWZpbmUgTU5HX0NSQ19PVVRQVVRfTk9ORSAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBNTkdfQ1JDX09VVFBVVF9HRU5FUkFURSAgICAweDAwMDAwMDIwCisjZGVmaW5lIE1OR19DUkNfT1VUUFVUX0RVTU1ZICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgTU5HX0NSQ19BTkNJTExBUlkgICAgICAgICAgMHgwMDAwMGYwMAorI2RlZmluZSBNTkdfQ1JDX0FOQ0lMTEFSWV9JR05PUkUgICAweDAwMDAwMDAwCisjZGVmaW5lIE1OR19DUkNfQU5DSUxMQVJZX0RJU0NBUkQgIDB4MDAwMDAxMDAKKyNkZWZpbmUgTU5HX0NSQ19BTkNJTExBUllfV0FSTklORyAgMHgwMDAwMDIwMAorI2RlZmluZSBNTkdfQ1JDX0FOQ0lMTEFSWV9FUlJPUiAgICAweDAwMDAwMzAwCisjZGVmaW5lIE1OR19DUkNfQ1JJVElDQUwgICAgICAgICAgIDB4MDAwMGYwMDAKKyNkZWZpbmUgTU5HX0NSQ19DUklUSUNBTF9JR05PUkUgICAgMHgwMDAwMDAwMAorI2RlZmluZSBNTkdfQ1JDX0NSSVRJQ0FMX1dBUk5JTkcgICAweDAwMDAyMDAwCisjZGVmaW5lIE1OR19DUkNfQ1JJVElDQUxfRVJST1IgICAgIDB4MDAwMDMwMDAKKyNkZWZpbmUgTU5HX0NSQ19ERUZBVUxUICAgICAgICAgICAgMHgwMDAwMjEyMQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX2xpYm1uZ19oXyAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiBlbmQgb2YgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9MaWJNTkcvbGlibW5nX2NhbGxiYWNrX3hzLmMgYi9maWxlcy9Tb3VyY2UvTGliTU5HL2xpYm1uZ19jYWxsYmFja194cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMWEyMmEKLS0tIC9kZXYvbnVsbAorKysgYi9maWxlcy9Tb3VyY2UvTGliTU5HL2xpYm1uZ19jYWxsYmFja194cy5jCkBAIC0wLDAgKzEsMTIzOSBAQAorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIGxpYm1uZy5oICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIHByb2plY3QgICA6IGxpYm1uZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBmaWxlICAgICAgOiBsaWJtbmdfY2FsbGJhY2tfeHMuYyAgICAgIGNvcHlyaWdodCAoYykgMjAwMC0yMDA0IEcuSnV5biAgICogKi8KKy8qICogdmVyc2lvbiAgIDogMS4wLjkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBwdXJwb3NlICAgOiBjYWxsYmFjayBnZXQvc2V0IGludGVyZmFjZSAoaW1wbGVtZW50YXRpb24pICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGF1dGhvciAgICA6IEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogY29tbWVudCAgIDogaW1wbGVtZW50YXRpb24gb2YgdGhlIGNhbGxiYWNrIGdldC9zZXQgZnVuY3Rpb25zICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBjaGFuZ2VzICAgOiAwLjUuMSAtIDA1LzA4LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaXhlZCBjYWxsaW5nIGNvbnZlbnRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2hhbmdlZCBzdHJpY3QtQU5TSSBzdHVmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMSAtIDA1LzEyLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjaGFuZ2VkIHRyYWNlIHRvIG1hY3JvIGZvciBjYWxsYmFjayBlcnJvci1yZXBvcnRpbmcgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMiAtIDA1LzMxLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaXhlZCB1cCBwdW5jdHVhdGlvbiAoY29udHJpYnV0aW9uIGJ5IFRpbSBSb3dsZXkpICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4yIC0gMDYvMDIvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGdldGFscGhhbGluZSBjYWxsYmFjayBmb3IgUkdCOF9BOCBjYW52YXNzdHlsZSAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4xIC0gMDcvMTUvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGNhbGxiYWNrcyBmb3IgU0FWRS9TRUVLIHByb2Nlc3NpbmcgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4yIC0gMDgvMDUvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNoYW5nZWQgZmlsZS1wcmVmaXhlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4zIC0gMTAvMTEvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHN1cHBvcnQgZm9yIG5FRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjMgLSAxMC8xNy8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgY2FsbGJhY2sgdG8gcHJvY2VzcyBub24tY3JpdGljYWwgdW5rbm93biBjaHVua3MgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjEgLSAwMi8wOC8yMDAxIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgTUVORCBwcm9jZXNzaW5nIGNhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjIgLSAwNi8yMy8yMDAxIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgcHJvY2Vzc3Rlcm0gY2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjYgLSAwNy8wNy8yMDAzIC0gRy4gUi1QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgU0tJUENIVU5LIGZlYXR1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjcgLSAwMy8xMC8yMDA0IC0gRy5SLVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgY29uZGl0aW9uYWxzIGFyb3VuZCBvcGVuc3RyZWFtL2Nsb3Nlc3RyZWFtICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNyAtIDAzLzE5LzIwMDQgLSBHLlItUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaXhlZCB0eXBvIChNTkdfU0tJUENIVU5LX1NBVkUgLT4gTU5HX1NLSVBDSFVOS19uRUVEICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuOCAtIDA0LzEwLzIwMDQgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBkYXRhLXB1c2ggbWVjaGFuaXNtcyBmb3Igc3BlY2lhbGl6ZWQgZGVjb2RlcnMgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuOSAtIDA5LzE4LzIwMDQgLSBHLlItUC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCB0d28gU0tJUENIVU5LX1RFUk0gY29uZGl0aW9uYWxzICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC45IC0gMTIvMjAvMjAwNCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNsZWFuZWQgdXAgbWFjcm8taW52b2NhdGlvbnMgKHRoYW5rcyB0byBELiBBaXJsaWUpICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaW5jbHVkZSAibGlibW5nLmgiCisjaW5jbHVkZSAibGlibW5nX2RhdGEuaCIKKyNpbmNsdWRlICJsaWJtbmdfZXJyb3IuaCIKKyNpbmNsdWRlICJsaWJtbmdfdHJhY2UuaCIKKyNpZmRlZiBfX0JPUkxBTkRDX18KKyNwcmFnbWEgaGRyc3RvcAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fQk9STEFORENfXykgJiYgZGVmaW5lZChNTkdfU1RSSUNUX0FOU0kpCisjcHJhZ21hIG9wdGlvbiAtQSAgICAgICAgICAgICAgICAgICAgICAvKiBmb3JjZSBBTlNJLUMgKi8KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogIENhbGxiYWNrIHNldCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfSU5URVJOQUxfTUVNTU5HTVQKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19zZXRjYl9tZW1hbGxvYyAobW5nX2hhbmRsZSAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19tZW1hbGxvYyBmUHJvYykKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU0VUQ0JfTUVNQUxMT0MsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpCisgICgobW5nX2RhdGFwKWhIYW5kbGUpLT5mTWVtYWxsb2MgPSBmUHJvYzsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9TRVRDQl9NRU1BTExPQywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYgLyogTU5HX0lOVEVSTkFMX01FTU1OR01UICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX0lOVEVSTkFMX01FTU1OR01UCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfc2V0Y2JfbWVtZnJlZSAobW5nX2hhbmRsZSAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfbWVtZnJlZSBmUHJvYykKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU0VUQ0JfTUVNRlJFRSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkKKyAgKChtbmdfZGF0YXApaEhhbmRsZSktPmZNZW1mcmVlID0gZlByb2M7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU0VUQ0JfTUVNRlJFRSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYgLyogTU5HX0lOVEVSTkFMX01FTU1OR01UICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9SRUFECittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfc2V0Y2JfcmVsZWFzZWRhdGEgKG1uZ19oYW5kbGUgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcmVsZWFzZWRhdGEgZlByb2MpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1NFVENCX1JFTEVBU0VEQVRBLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFIChoSGFuZGxlKQorICAoKG1uZ19kYXRhcCloSGFuZGxlKS0+ZlJlbGVhc2VkYXRhID0gZlByb2M7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU0VUQ0JfUkVMRUFTRURBVEEsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmIC8qIE1OR19TVVBQT1JUX1JFQUQgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmIGRlZmluZWQoTU5HX1NVUFBPUlRfUkVBRCkgfHwgZGVmaW5lZChNTkdfU1VQUE9SVF9XUklURSkKKyNpZm5kZWYgTU5HX05PX09QRU5fQ0xPU0VfU1RSRUFNCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfc2V0Y2Jfb3BlbnN0cmVhbSAobW5nX2hhbmRsZSAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfb3BlbnN0cmVhbSBmUHJvYykKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU0VUQ0JfT1BFTlNUUkVBTSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkKKyAgKChtbmdfZGF0YXApaEhhbmRsZSktPmZPcGVuc3RyZWFtID0gZlByb2M7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU0VUQ0JfT1BFTlNUUkVBTSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9SRUFEIHx8IE1OR19TVVBQT1JUX1dSSVRFICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZiBkZWZpbmVkKE1OR19TVVBQT1JUX1JFQUQpIHx8IGRlZmluZWQoTU5HX1NVUFBPUlRfV1JJVEUpCisjaWZuZGVmIE1OR19OT19PUEVOX0NMT1NFX1NUUkVBTQorbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3NldGNiX2Nsb3Nlc3RyZWFtIChtbmdfaGFuZGxlICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2Nsb3Nlc3RyZWFtIGZQcm9jKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9TRVRDQl9DTE9TRVNUUkVBTSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkKKyAgKChtbmdfZGF0YXApaEhhbmRsZSktPmZDbG9zZXN0cmVhbSA9IGZQcm9jOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1NFVENCX0NMT1NFU1RSRUFNLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorI2VuZGlmIC8qIE1OR19TVVBQT1JUX1JFQUQgfHwgTU5HX1NVUFBPUlRfV1JJVEUgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1JFQUQKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19zZXRjYl9yZWFkZGF0YSAobW5nX2hhbmRsZSAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19yZWFkZGF0YSBmUHJvYykKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU0VUQ0JfUkVBRERBVEEsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpCisgICgobW5nX2RhdGFwKWhIYW5kbGUpLT5mUmVhZGRhdGEgPSBmUHJvYzsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9TRVRDQl9SRUFEREFUQSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfUkVBRCAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfV1JJVEUKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19zZXRjYl93cml0ZWRhdGEgKG1uZ19oYW5kbGUgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ193cml0ZWRhdGEgZlByb2MpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1NFVENCX1dSSVRFREFUQSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkKKyAgKChtbmdfZGF0YXApaEhhbmRsZSktPmZXcml0ZWRhdGEgPSBmUHJvYzsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9TRVRDQl9XUklURURBVEEsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmIC8qIE1OR19TVVBQT1JUX1dSSVRFICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19zZXRjYl9lcnJvcnByb2MgKG1uZ19oYW5kbGUgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19lcnJvcnByb2MgZlByb2MpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1NFVENCX0VSUk9SUFJPQywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkKKyAgKChtbmdfZGF0YXApaEhhbmRsZSktPmZFcnJvcnByb2MgPSBmUHJvYzsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9TRVRDQl9FUlJPUlBST0MsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19zZXRjYl90cmFjZXByb2MgKG1uZ19oYW5kbGUgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ190cmFjZXByb2MgZlByb2MpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1NFVENCX1RSQUNFUFJPQywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkKKyAgKChtbmdfZGF0YXApaEhhbmRsZSktPmZUcmFjZXByb2MgPSBmUHJvYzsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9TRVRDQl9UUkFDRVBST0MsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmIC8qIE1OR19TVVBQT1JUX1RSQUNFICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9SRUFECittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfc2V0Y2JfcHJvY2Vzc2hlYWRlciAobW5nX2hhbmRsZSAgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcHJvY2Vzc2hlYWRlciBmUHJvYykKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU0VUQ0JfUFJPQ0VTU0hFQURFUiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkKKyAgKChtbmdfZGF0YXApaEhhbmRsZSktPmZQcm9jZXNzaGVhZGVyID0gZlByb2M7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU0VUQ0JfUFJPQ0VTU0hFQURFUiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfUkVBRCAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfUkVBRAorI2lmbmRlZiBNTkdfU0tJUENIVU5LX3RFWHQKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19zZXRjYl9wcm9jZXNzdGV4dCAobW5nX2hhbmRsZSAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wcm9jZXNzdGV4dCBmUHJvYykKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU0VUQ0JfUFJPQ0VTU1RFWFQsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpCisgICgobW5nX2RhdGFwKWhIYW5kbGUpLT5mUHJvY2Vzc3RleHQgPSBmUHJvYzsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9TRVRDQl9QUk9DRVNTVEVYVCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9SRUFEICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9SRUFECisjaWZuZGVmIE1OR19TS0lQQ0hVTktfU0FWRQorbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3NldGNiX3Byb2Nlc3NzYXZlIChtbmdfaGFuZGxlICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3Byb2Nlc3NzYXZlIGZQcm9jKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9TRVRDQl9QUk9DRVNTU0FWRSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkKKyAgKChtbmdfZGF0YXApaEhhbmRsZSktPmZQcm9jZXNzc2F2ZSA9IGZQcm9jOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1NFVENCX1BST0NFU1NTQVZFLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorI2VuZGlmIC8qIE1OR19TVVBQT1JUX1JFQUQgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1JFQUQKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19TRUVLCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfc2V0Y2JfcHJvY2Vzc3NlZWsgKG1uZ19oYW5kbGUgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcHJvY2Vzc3NlZWsgZlByb2MpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1NFVENCX1BST0NFU1NTRUVLLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFIChoSGFuZGxlKQorICAoKG1uZ19kYXRhcCloSGFuZGxlKS0+ZlByb2Nlc3NzZWVrID0gZlByb2M7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU0VUQ0JfUFJPQ0VTU1NFRUssIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisjZW5kaWYgLyogTU5HX1NVUFBPUlRfUkVBRCAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfUkVBRAorI2lmbmRlZiBNTkdfU0tJUENIVU5LX25FRUQKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19zZXRjYl9wcm9jZXNzbmVlZCAobW5nX2hhbmRsZSAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wcm9jZXNzbmVlZCBmUHJvYykKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU0VUQ0JfUFJPQ0VTU05FRUQsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpCisgICgobW5nX2RhdGFwKWhIYW5kbGUpLT5mUHJvY2Vzc25lZWQgPSBmUHJvYzsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9TRVRDQl9QUk9DRVNTTkVFRCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9SRUFEICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9SRUFECittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfc2V0Y2JfcHJvY2Vzc21lbmQgKG1uZ19oYW5kbGUgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcHJvY2Vzc21lbmQgZlByb2MpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1NFVENCX1BST0NFU1NNRU5ELCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFIChoSGFuZGxlKQorICAoKG1uZ19kYXRhcCloSGFuZGxlKS0+ZlByb2Nlc3NtZW5kID0gZlByb2M7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU0VUQ0JfUFJPQ0VTU01FTkQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmIC8qIE1OR19TVVBQT1JUX1JFQUQgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1JFQUQKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19zZXRjYl9wcm9jZXNzdW5rbm93biAobW5nX2hhbmRsZSAgICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wcm9jZXNzdW5rbm93biBmUHJvYykKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU0VUQ0JfUFJPQ0VTU1VOS05PV04sIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpCisgICgobW5nX2RhdGFwKWhIYW5kbGUpLT5mUHJvY2Vzc3Vua25vd24gPSBmUHJvYzsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9TRVRDQl9QUk9DRVNTVU5LTk9XTiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfUkVBRCAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfUkVBRAorI2lmbmRlZiBNTkdfU0tJUENIVU5LX1RFUk0KK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19zZXRjYl9wcm9jZXNzdGVybSAobW5nX2hhbmRsZSAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wcm9jZXNzdGVybSBmUHJvYykKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU0VUQ0JfUFJPQ0VTU1RFUk0sIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpCisgICgobW5nX2RhdGFwKWhIYW5kbGUpLT5mUHJvY2Vzc3Rlcm0gPSBmUHJvYzsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9TRVRDQl9QUk9DRVNTVEVSTSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9SRUFEICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfc2V0Y2JfZ2V0Y2FudmFzbGluZSAobW5nX2hhbmRsZSAgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfZ2V0Y2FudmFzbGluZSBmUHJvYykKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU0VUQ0JfR0VUQ0FOVkFTTElORSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkKKyAgKChtbmdfZGF0YXApaEhhbmRsZSktPmZHZXRjYW52YXNsaW5lID0gZlByb2M7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU0VUQ0JfR0VUQ0FOVkFTTElORSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfRElTUExBWSAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3NldGNiX2dldGJrZ2RsaW5lIChtbmdfaGFuZGxlICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2dldGJrZ2RsaW5lIGZQcm9jKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9TRVRDQl9HRVRCS0dETElORSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkKKyAgKChtbmdfZGF0YXApaEhhbmRsZSktPmZHZXRia2dkbGluZSA9IGZQcm9jOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1NFVENCX0dFVEJLR0RMSU5FLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfc2V0Y2JfZ2V0YWxwaGFsaW5lIChtbmdfaGFuZGxlICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfZ2V0YWxwaGFsaW5lIGZQcm9jKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9TRVRDQl9HRVRBTFBIQUxJTkUsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpCisgICgobW5nX2RhdGFwKWhIYW5kbGUpLT5mR2V0YWxwaGFsaW5lID0gZlByb2M7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU0VUQ0JfR0VUQUxQSEFMSU5FLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfc2V0Y2JfcmVmcmVzaCAobW5nX2hhbmRsZSAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcmVmcmVzaCBmUHJvYykKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU0VUQ0JfUkVGUkVTSCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkKKyAgKChtbmdfZGF0YXApaEhhbmRsZSktPmZSZWZyZXNoID0gZlByb2M7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU0VUQ0JfUkVGUkVTSCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfRElTUExBWSAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3NldGNiX2dldHRpY2tjb3VudCAobW5nX2hhbmRsZSAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2dldHRpY2tjb3VudCBmUHJvYykKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU0VUQ0JfR0VUVElDS0NPVU5ULCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFIChoSGFuZGxlKQorICAoKG1uZ19kYXRhcCloSGFuZGxlKS0+ZkdldHRpY2tjb3VudCA9IGZQcm9jOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1NFVENCX0dFVFRJQ0tDT1VOVCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfRElTUExBWSAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3NldGNiX3NldHRpbWVyIChtbmdfaGFuZGxlICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3NldHRpbWVyIGZQcm9jKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9TRVRDQl9TRVRUSU1FUiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkKKyAgKChtbmdfZGF0YXApaEhhbmRsZSktPmZTZXR0aW1lciA9IGZQcm9jOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1NFVENCX1NFVFRJTUVSLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZiBkZWZpbmVkKE1OR19TVVBQT1JUX0RJU1BMQVkpICYmIGRlZmluZWQoTU5HX0FQUF9DTVMpCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfc2V0Y2JfcHJvY2Vzc2dhbW1hIChtbmdfaGFuZGxlICAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3Byb2Nlc3NnYW1tYSAgZlByb2MpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1NFVENCX1BST0NFU1NHQU1BLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFIChoSGFuZGxlKQorICAoKG1uZ19kYXRhcCloSGFuZGxlKS0+ZlByb2Nlc3NnYW1tYSA9IGZQcm9jOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1NFVENCX1BST0NFU1NHQU1BLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICYmIE1OR19BUFBfQ01TICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZiBkZWZpbmVkKE1OR19TVVBQT1JUX0RJU1BMQVkpICYmIGRlZmluZWQoTU5HX0FQUF9DTVMpCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfY0hSTQorbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3NldGNiX3Byb2Nlc3NjaHJvbWEgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3Byb2Nlc3NjaHJvbWEgZlByb2MpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1NFVENCX1BST0NFU1NDSFJPTUEsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpCisgICgobW5nX2RhdGFwKWhIYW5kbGUpLT5mUHJvY2Vzc2Nocm9tYSA9IGZQcm9jOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1NFVENCX1BST0NFU1NDSFJPTUEsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisjZW5kaWYgLyogTU5HX1NVUFBPUlRfRElTUExBWSAmJiBNTkdfQVBQX0NNUyAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWYgZGVmaW5lZChNTkdfU1VQUE9SVF9ESVNQTEFZKSAmJiBkZWZpbmVkKE1OR19BUFBfQ01TKQorbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3NldGNiX3Byb2Nlc3NzcmdiIChtbmdfaGFuZGxlICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3Byb2Nlc3NzcmdiIGZQcm9jKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9TRVRDQl9QUk9DRVNTU1JHQiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkKKyAgKChtbmdfZGF0YXApaEhhbmRsZSktPmZQcm9jZXNzc3JnYiA9IGZQcm9jOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1NFVENCX1BST0NFU1NTUkdCLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICYmIE1OR19BUFBfQ01TICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZiBkZWZpbmVkKE1OR19TVVBQT1JUX0RJU1BMQVkpICYmIGRlZmluZWQoTU5HX0FQUF9DTVMpCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfaUNDUAorbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3NldGNiX3Byb2Nlc3NpY2NwIChtbmdfaGFuZGxlICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3Byb2Nlc3NpY2NwIGZQcm9jKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9TRVRDQl9QUk9DRVNTSUNDUCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkKKyAgKChtbmdfZGF0YXApaEhhbmRsZSktPmZQcm9jZXNzaWNjcCA9IGZQcm9jOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1NFVENCX1BST0NFU1NJQ0NQLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorI2VuZGlmIC8qIE1OR19TVVBQT1JUX0RJU1BMQVkgJiYgTU5HX0FQUF9DTVMgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmIGRlZmluZWQoTU5HX1NVUFBPUlRfRElTUExBWSkgJiYgZGVmaW5lZChNTkdfQVBQX0NNUykKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19zZXRjYl9wcm9jZXNzYXJvdyAobW5nX2hhbmRsZSAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wcm9jZXNzYXJvdyBmUHJvYykKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU0VUQ0JfUFJPQ0VTU0FST1csIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpCisgICgobW5nX2RhdGFwKWhIYW5kbGUpLT5mUHJvY2Vzc2Fyb3cgPSBmUHJvYzsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9TRVRDQl9QUk9DRVNTQVJPVywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfRElTUExBWSAmJiBNTkdfQVBQX0NNUyAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogIENhbGxiYWNrIGdldCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfSU5URVJOQUxfTUVNTU5HTVQKK21uZ19tZW1hbGxvYyBNTkdfREVDTCBtbmdfZ2V0Y2JfbWVtYWxsb2MgKG1uZ19oYW5kbGUgaEhhbmRsZSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENCX01FTUFMTE9DLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFWCAoaEhhbmRsZSkKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0JfTUVNQUxMT0MsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuICgobW5nX2RhdGFwKWhIYW5kbGUpLT5mTWVtYWxsb2M7Cit9CisjZW5kaWYgLyogTU5HX0lOVEVSTkFMX01FTU1OR01UICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX0lOVEVSTkFMX01FTU1OR01UCittbmdfbWVtZnJlZSBNTkdfREVDTCBtbmdfZ2V0Y2JfbWVtZnJlZSAobW5nX2hhbmRsZSBoSGFuZGxlKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0JfTUVNRlJFRSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRVggKGhIYW5kbGUpCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENCX01FTUZSRUUsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuICgobW5nX2RhdGFwKWhIYW5kbGUpLT5mTWVtZnJlZTsKK30KKyNlbmRpZiAvKiBNTkdfSU5URVJOQUxfTUVNTU5HTVQgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1JFQUQKK21uZ19yZWxlYXNlZGF0YSBNTkdfREVDTCBtbmdfZ2V0Y2JfcmVsZWFzZWRhdGEgKG1uZ19oYW5kbGUgaEhhbmRsZSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENCX1JFTEVBU0VEQVRBLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFWCAoaEhhbmRsZSkKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0JfUkVMRUFTRURBVEEsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuICgobW5nX2RhdGFwKWhIYW5kbGUpLT5mUmVsZWFzZWRhdGE7Cit9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfUkVBRCAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfUkVBRAorbW5nX3JlYWRkYXRhIE1OR19ERUNMIG1uZ19nZXRjYl9yZWFkZGF0YSAobW5nX2hhbmRsZSBoSGFuZGxlKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0JfUkVBRERBVEEsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEVYIChoSGFuZGxlKQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRDQl9SRUFEREFUQSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gKChtbmdfZGF0YXApaEhhbmRsZSktPmZSZWFkZGF0YTsKK30KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9SRUFEICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZiBkZWZpbmVkKE1OR19TVVBQT1JUX1JFQUQpIHx8IGRlZmluZWQoTU5HX1NVUFBPUlRfV1JJVEUpCisjaWZuZGVmIE1OR19OT19PUEVOX0NMT1NFX1NUUkVBTQorbW5nX29wZW5zdHJlYW0gTU5HX0RFQ0wgbW5nX2dldGNiX29wZW5zdHJlYW0gKG1uZ19oYW5kbGUgaEhhbmRsZSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENCX09QRU5TVFJFQU0sIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEVYIChoSGFuZGxlKQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRDQl9PUEVOU1RSRUFNLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiAoKG1uZ19kYXRhcCloSGFuZGxlKS0+Zk9wZW5zdHJlYW07Cit9CisjZW5kaWYKKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9SRUFEIHx8IE1OR19TVVBQT1JUX1dSSVRFICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZiBkZWZpbmVkKE1OR19TVVBQT1JUX1JFQUQpIHx8IGRlZmluZWQoTU5HX1NVUFBPUlRfV1JJVEUpCisjaWZuZGVmIE1OR19OT19PUEVOX0NMT1NFX1NUUkVBTQorbW5nX2Nsb3Nlc3RyZWFtIE1OR19ERUNMIG1uZ19nZXRjYl9jbG9zZXN0cmVhbSAobW5nX2hhbmRsZSBoSGFuZGxlKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0JfQ0xPU0VTVFJFQU0sIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEVYIChoSGFuZGxlKQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRDQl9DTE9TRVNUUkVBTSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gKChtbmdfZGF0YXApaEhhbmRsZSktPmZDbG9zZXN0cmVhbTsKK30KKyNlbmRpZgorI2VuZGlmIC8qIE1OR19TVVBQT1JUX1JFQUQgfHwgTU5HX1NVUFBPUlRfV1JJVEUgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1dSSVRFCittbmdfd3JpdGVkYXRhIE1OR19ERUNMIG1uZ19nZXRjYl93cml0ZWRhdGEgKG1uZ19oYW5kbGUgaEhhbmRsZSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENCX1dSSVRFREFUQSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRVggKGhIYW5kbGUpCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENCX1dSSVRFREFUQSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gKChtbmdfZGF0YXApaEhhbmRsZSktPmZXcml0ZWRhdGE7Cit9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfV1JJVEUgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX2Vycm9ycHJvYyBNTkdfREVDTCBtbmdfZ2V0Y2JfZXJyb3Jwcm9jIChtbmdfaGFuZGxlIGhIYW5kbGUpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRDQl9FUlJPUlBST0MsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEVYIChoSGFuZGxlKQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRDQl9FUlJPUlBST0MsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuICgobW5nX2RhdGFwKWhIYW5kbGUpLT5mRXJyb3Jwcm9jOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKK21uZ190cmFjZXByb2MgTU5HX0RFQ0wgbW5nX2dldGNiX3RyYWNlcHJvYyAobW5nX2hhbmRsZSBoSGFuZGxlKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0JfVFJBQ0VQUk9DLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFWCAoaEhhbmRsZSkKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0JfVFJBQ0VQUk9DLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiAoKG1uZ19kYXRhcCloSGFuZGxlKS0+ZlRyYWNlcHJvYzsKK30KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9UUkFDRSAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfUkVBRAorbW5nX3Byb2Nlc3NoZWFkZXIgTU5HX0RFQ0wgbW5nX2dldGNiX3Byb2Nlc3NoZWFkZXIgKG1uZ19oYW5kbGUgaEhhbmRsZSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENCX1BST0NFU1NIRUFERVIsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEVYIChoSGFuZGxlKQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRDQl9QUk9DRVNTSEVBREVSLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiAoKG1uZ19kYXRhcCloSGFuZGxlKS0+ZlByb2Nlc3NoZWFkZXI7Cit9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfUkVBRCAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfUkVBRAorI2lmbmRlZiBNTkdfU0tJUENIVU5LX3RFWHQKK21uZ19wcm9jZXNzdGV4dCBNTkdfREVDTCBtbmdfZ2V0Y2JfcHJvY2Vzc3RleHQgKG1uZ19oYW5kbGUgaEhhbmRsZSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENCX1BST0NFU1NURVhULCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFWCAoaEhhbmRsZSkKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0JfUFJPQ0VTU1RFWFQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuICgobW5nX2RhdGFwKWhIYW5kbGUpLT5mUHJvY2Vzc3RleHQ7Cit9CisjZW5kaWYKKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9SRUFEICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9SRUFECisjaWZuZGVmIE1OR19TS0lQQ0hVTktfU0FWRQorbW5nX3Byb2Nlc3NzYXZlIE1OR19ERUNMIG1uZ19nZXRjYl9wcm9jZXNzc2F2ZSAobW5nX2hhbmRsZSBoSGFuZGxlKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0JfUFJPQ0VTU1NBVkUsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEVYIChoSGFuZGxlKQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRDQl9QUk9DRVNTU0FWRSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gKChtbmdfZGF0YXApaEhhbmRsZSktPmZQcm9jZXNzc2F2ZTsKK30KKyNlbmRpZgorI2VuZGlmIC8qIE1OR19TVVBQT1JUX1JFQUQgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1JFQUQKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19TRUVLCittbmdfcHJvY2Vzc3NlZWsgTU5HX0RFQ0wgbW5nX2dldGNiX3Byb2Nlc3NzZWVrIChtbmdfaGFuZGxlIGhIYW5kbGUpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRDQl9QUk9DRVNTU0VFSywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRVggKGhIYW5kbGUpCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENCX1BST0NFU1NTRUVLLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiAoKG1uZ19kYXRhcCloSGFuZGxlKS0+ZlByb2Nlc3NzZWVrOworfQorI2VuZGlmCisjZW5kaWYgLyogTU5HX1NVUFBPUlRfUkVBRCAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfUkVBRAorI2lmbmRlZiBNTkdfU0tJUENIVU5LX25FRUQKK21uZ19wcm9jZXNzbmVlZCBNTkdfREVDTCBtbmdfZ2V0Y2JfcHJvY2Vzc25lZWQgKG1uZ19oYW5kbGUgaEhhbmRsZSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENCX1BST0NFU1NORUVELCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFWCAoaEhhbmRsZSkKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0JfUFJPQ0VTU05FRUQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuICgobW5nX2RhdGFwKWhIYW5kbGUpLT5mUHJvY2Vzc25lZWQ7Cit9CisjZW5kaWYKKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9SRUFEICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9SRUFECittbmdfcHJvY2Vzc21lbmQgTU5HX0RFQ0wgbW5nX2dldGNiX3Byb2Nlc3NtZW5kIChtbmdfaGFuZGxlIGhIYW5kbGUpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRDQl9QUk9DRVNTTUVORCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRVggKGhIYW5kbGUpCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENCX1BST0NFU1NNRU5ELCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiAoKG1uZ19kYXRhcCloSGFuZGxlKS0+ZlByb2Nlc3NtZW5kOworfQorI2VuZGlmIC8qIE1OR19TVVBQT1JUX1JFQUQgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1JFQUQKK21uZ19wcm9jZXNzdW5rbm93biBNTkdfREVDTCBtbmdfZ2V0Y2JfcHJvY2Vzc3Vua25vd24gKG1uZ19oYW5kbGUgaEhhbmRsZSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENCX1BST0NFU1NVTktOT1dOLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFWCAoaEhhbmRsZSkKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0JfUFJPQ0VTU1VOS05PV04sIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuICgobW5nX2RhdGFwKWhIYW5kbGUpLT5mUHJvY2Vzc3Vua25vd247Cit9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfUkVBRCAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfUkVBRAorI2lmbmRlZiBNTkdfU0tJUENIVU5LX1RFUk0KK21uZ19wcm9jZXNzdGVybSBNTkdfREVDTCBtbmdfZ2V0Y2JfcHJvY2Vzc3Rlcm0gKG1uZ19oYW5kbGUgaEhhbmRsZSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENCX1BST0NFU1NURVJNLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFWCAoaEhhbmRsZSkKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0JfUFJPQ0VTU1RFUk0sIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuICgobW5nX2RhdGFwKWhIYW5kbGUpLT5mUHJvY2Vzc3Rlcm07Cit9CisjZW5kaWYKKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9SRUFEICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCittbmdfZ2V0Y2FudmFzbGluZSBNTkdfREVDTCBtbmdfZ2V0Y2JfZ2V0Y2FudmFzbGluZSAobW5nX2hhbmRsZSBoSGFuZGxlKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0JfR0VUQ0FOVkFTTElORSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRVggKGhIYW5kbGUpCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENCX0dFVENBTlZBU0xJTkUsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuICgobW5nX2RhdGFwKWhIYW5kbGUpLT5mR2V0Y2FudmFzbGluZTsKK30KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCittbmdfZ2V0YmtnZGxpbmUgTU5HX0RFQ0wgbW5nX2dldGNiX2dldGJrZ2RsaW5lIChtbmdfaGFuZGxlIGhIYW5kbGUpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRDQl9HRVRCS0dETElORSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRVggKGhIYW5kbGUpCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENCX0dFVEJLR0RMSU5FLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiAoKG1uZ19kYXRhcCloSGFuZGxlKS0+ZkdldGJrZ2RsaW5lOworfQorI2VuZGlmIC8qIE1OR19TVVBQT1JUX0RJU1BMQVkgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX0RJU1BMQVkKK21uZ19nZXRhbHBoYWxpbmUgTU5HX0RFQ0wgbW5nX2dldGNiX2dldGFscGhhbGluZSAobW5nX2hhbmRsZSBoSGFuZGxlKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0JfR0VUQUxQSEFMSU5FLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFWCAoaEhhbmRsZSkKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0JfR0VUQUxQSEFMSU5FLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiAoKG1uZ19kYXRhcCloSGFuZGxlKS0+ZkdldGFscGhhbGluZTsKK30KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCittbmdfcmVmcmVzaCBNTkdfREVDTCBtbmdfZ2V0Y2JfcmVmcmVzaCAobW5nX2hhbmRsZSBoSGFuZGxlKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0JfUkVGUkVTSCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRVggKGhIYW5kbGUpCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENCX1JFRlJFU0gsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuICgobW5nX2RhdGFwKWhIYW5kbGUpLT5mUmVmcmVzaDsKK30KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCittbmdfZ2V0dGlja2NvdW50IE1OR19ERUNMIG1uZ19nZXRjYl9nZXR0aWNrY291bnQgKG1uZ19oYW5kbGUgaEhhbmRsZSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENCX0dFVFRJQ0tDT1VOVCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRVggKGhIYW5kbGUpCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENCX0dFVFRJQ0tDT1VOVCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gKChtbmdfZGF0YXApaEhhbmRsZSktPmZHZXR0aWNrY291bnQ7Cit9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfRElTUExBWSAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorbW5nX3NldHRpbWVyIE1OR19ERUNMIG1uZ19nZXRjYl9zZXR0aW1lciAobW5nX2hhbmRsZSBoSGFuZGxlKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0JfU0VUVElNRVIsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEVYIChoSGFuZGxlKQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRDQl9TRVRUSU1FUiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gKChtbmdfZGF0YXApaEhhbmRsZSktPmZTZXR0aW1lcjsKK30KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZiBkZWZpbmVkKE1OR19TVVBQT1JUX0RJU1BMQVkpICYmIGRlZmluZWQoTU5HX0FQUF9DTVMpCittbmdfcHJvY2Vzc2dhbW1hIE1OR19ERUNMIG1uZ19nZXRjYl9wcm9jZXNzZ2FtbWEgKG1uZ19oYW5kbGUgaEhhbmRsZSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENCX1BST0NFU1NHQU1NQSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRVggKGhIYW5kbGUpCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENCX1BST0NFU1NHQU1NQSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gKChtbmdfZGF0YXApaEhhbmRsZSktPmZQcm9jZXNzZ2FtbWE7Cit9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfRElTUExBWSAmJiBNTkdfQVBQX0NNUyAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWYgZGVmaW5lZChNTkdfU1VQUE9SVF9ESVNQTEFZKSAmJiBkZWZpbmVkKE1OR19BUFBfQ01TKQorI2lmbmRlZiBNTkdfU0tJUENIVU5LX2NIUk0KK21uZ19wcm9jZXNzY2hyb21hIE1OR19ERUNMIG1uZ19nZXRjYl9wcm9jZXNzY2hyb21hIChtbmdfaGFuZGxlIGhIYW5kbGUpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRDQl9QUk9DRVNTQ0hST01BLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFWCAoaEhhbmRsZSkKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0JfUFJPQ0VTU0NIUk9NQSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gKChtbmdfZGF0YXApaEhhbmRsZSktPmZQcm9jZXNzY2hyb21hOworfQorI2VuZGlmCisjZW5kaWYgLyogTU5HX1NVUFBPUlRfRElTUExBWSAmJiBNTkdfQVBQX0NNUyAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWYgZGVmaW5lZChNTkdfU1VQUE9SVF9ESVNQTEFZKSAmJiBkZWZpbmVkKE1OR19BUFBfQ01TKQorbW5nX3Byb2Nlc3NzcmdiIE1OR19ERUNMIG1uZ19nZXRjYl9wcm9jZXNzc3JnYiAobW5nX2hhbmRsZSBoSGFuZGxlKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0JfUFJPQ0VTU1NSR0IsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEVYIChoSGFuZGxlKQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRDQl9QUk9DRVNTU1JHQiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gKChtbmdfZGF0YXApaEhhbmRsZSktPmZQcm9jZXNzc3JnYjsKK30KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICYmIE1OR19BUFBfQ01TICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZiBkZWZpbmVkKE1OR19TVVBQT1JUX0RJU1BMQVkpICYmIGRlZmluZWQoTU5HX0FQUF9DTVMpCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfaUNDUAorbW5nX3Byb2Nlc3NpY2NwIE1OR19ERUNMIG1uZ19nZXRjYl9wcm9jZXNzaWNjcCAobW5nX2hhbmRsZSBoSGFuZGxlKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0JfUFJPQ0VTU0lDQ1AsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEVYIChoSGFuZGxlKQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRDQl9QUk9DRVNTSUNDUCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gKChtbmdfZGF0YXApaEhhbmRsZSktPmZQcm9jZXNzaWNjcDsKK30KKyNlbmRpZgorI2VuZGlmIC8qIE1OR19TVVBQT1JUX0RJU1BMQVkgJiYgTU5HX0FQUF9DTVMgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmIGRlZmluZWQoTU5HX1NVUFBPUlRfRElTUExBWSkgJiYgZGVmaW5lZChNTkdfQVBQX0NNUykKK21uZ19wcm9jZXNzYXJvdyBNTkdfREVDTCBtbmdfZ2V0Y2JfcHJvY2Vzc2Fyb3cgKG1uZ19oYW5kbGUgaEhhbmRsZSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENCX1BST0NFU1NBUk9XLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFWCAoaEhhbmRsZSkKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0JfUFJPQ0VTU0FST1csIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuICgobW5nX2RhdGFwKWhIYW5kbGUpLT5mUHJvY2Vzc2Fyb3c7Cit9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfRElTUExBWSAmJiBNTkdfQVBQX0NNUyAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiBlbmQgb2YgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKworCmRpZmYgLS1naXQgYS9maWxlcy9Tb3VyY2UvTGliTU5HL2xpYm1uZ19jaHVua19kZXNjci5jIGIvZmlsZXMvU291cmNlL0xpYk1ORy9saWJtbmdfY2h1bmtfZGVzY3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTAwNGE1Ci0tLSAvZGV2L251bGwKKysrIGIvZmlsZXMvU291cmNlL0xpYk1ORy9saWJtbmdfY2h1bmtfZGVzY3IuYwpAQCAtMCwwICsxLDYwOTAgQEAKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBsaWJtbmcuaCAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBwcm9qZWN0ICAgOiBsaWJtbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogZmlsZSAgICAgIDogbGlibW5nX2NodW5rX2Rlc2NyLmMgICAgICBjb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBHLkp1eW4gICAqICovCisvKiAqIHZlcnNpb24gICA6IDEuMC4xMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogcHVycG9zZSAgIDogQ2h1bmsgZGVzY3JpcHRvciBmdW5jdGlvbnMgKGltcGxlbWVudGF0aW9uKSAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBhdXRob3IgICAgOiBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGNvbW1lbnQgICA6IGltcGxlbWVudGF0aW9uIG9mIHRoZSBjaHVuay0gYW5mIGZpZWxkLWRlc2NyaXB0b3IgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICByb3V0aW5lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGNoYW5nZXMgICA6IDEuMC45IC0gMTIvMDYvMjAwNCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGNvbmRpdGlvbmFsIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUiAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjkgLSAxMi8xMS8yMDA0IC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gbWFkZSBhbGwgY29uc3RhbnRzICdzdGF0aWMnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuOSAtIDEyLzIwLzIwMDQgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjbGVhbmVkIHVwIG1hY3JvLWludm9jYXRpb25zICh0aGFua3MgdG8gRC4gQWlybGllKSAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC45IC0gMDEvMTcvMjAwNSAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIHByb2JsZW0gd2l0aCBnbG9iYWwgUExURS90Uk5TICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC4xMCAtIDAxLzE3LzIwMDUgLSBHLlItUC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHR5cGVjYXN0IHRvIGFwcGVhc2UgdGhlIGNvbXBpbGVyICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjEwIC0gMDQvMDgvMjAwNyAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgc3VwcG9ydCBmb3IgbVBORyBwcm9wb3NhbCAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuMTAgLSAwNC8xMi8yMDA3IC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBzdXBwb3J0IGZvciBBTkcgcHJvcG9zYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPiAgICAgICAgICAgICAgICAgICAgLyogbmVlZGVkIGZvciBvZmZzZXRvZigpICovCisKKyNpbmNsdWRlICJsaWJtbmcuaCIKKyNpbmNsdWRlICJsaWJtbmdfZGF0YS5oIgorI2luY2x1ZGUgImxpYm1uZ19lcnJvci5oIgorI2luY2x1ZGUgImxpYm1uZ190cmFjZS5oIgorI2lmZGVmIF9fQk9STEFORENfXworI3ByYWdtYSBoZHJzdG9wCisjZW5kaWYKKyNpbmNsdWRlICJsaWJtbmdfbWVtb3J5LmgiCisjaW5jbHVkZSAibGlibW5nX29iamVjdHMuaCIKKyNpbmNsdWRlICJsaWJtbmdfY2h1bmtzLmgiCisjaW5jbHVkZSAibGlibW5nX2NodW5rX2Rlc2NyLmgiCisjaW5jbHVkZSAibGlibW5nX29iamVjdF9wcmMuaCIKKyNpbmNsdWRlICJsaWJtbmdfY2h1bmtfcHJjLmgiCisjaW5jbHVkZSAibGlibW5nX2NodW5rX2lvLmgiCisjaW5jbHVkZSAibGlibW5nX2Rpc3BsYXkuaCIKKworI2lmZGVmIE1OR19JTkNMVURFX0FOR19QUk9QT1NBTAorI2luY2x1ZGUgImxpYm1uZ19waXhlbHMuaCIKKyNpbmNsdWRlICJsaWJtbmdfZmlsdGVyLmgiCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19CT1JMQU5EQ19fKSAmJiBkZWZpbmVkKE1OR19TVFJJQ1RfQU5TSSkKKyNwcmFnbWEgb3B0aW9uIC1BICAgICAgICAgICAgICAgICAgICAgIC8qIGZvcmNlIEFOU0ktQyAqLworI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyNpZiBkZWZpbmVkKE1OR19JTkNMVURFX1JFQURfUFJPQ1MpIHx8IGRlZmluZWQoTU5HX0lOQ0xVREVfV1JJVEVfUFJPQ1MpCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogUE5HIGNodW5rcyAqLworCitNTkdfTE9DQUwgbW5nX2ZpZWxkX2Rlc2NyaXB0b3IgbW5nX2ZpZWxkc19paGRyIFtdID0KKyAgeworICAgIHtNTkdfTlVMTCwKKyAgICAgTU5HX0ZJRUxEX0lOVCB8IE1OR19GSUVMRF9OT0hJR0hCSVQsCisgICAgIDEsIDAsIDQsIDQsCisgICAgIG9mZnNldG9mKG1uZ19paGRyLCBpV2lkdGgpLCBNTkdfTlVMTCwgTU5HX05VTEx9LAorICAgIHtNTkdfTlVMTCwKKyAgICAgTU5HX0ZJRUxEX0lOVCB8IE1OR19GSUVMRF9OT0hJR0hCSVQsCisgICAgIDEsIDAsIDQsIDQsCisgICAgIG9mZnNldG9mKG1uZ19paGRyLCBpSGVpZ2h0KSwgTU5HX05VTEwsIE1OR19OVUxMfSwKKyAgICB7TU5HX05VTEwsCisgICAgIE1OR19GSUVMRF9JTlQsCisgICAgIDEsIDE2LCAxLCAxLAorICAgICBvZmZzZXRvZihtbmdfaWhkciwgaUJpdGRlcHRoKSwgTU5HX05VTEwsIE1OR19OVUxMfSwKKyAgICB7TU5HX05VTEwsCisgICAgIE1OR19GSUVMRF9JTlQsCisgICAgIDAsIDYsIDEsIDEsCisgICAgIG9mZnNldG9mKG1uZ19paGRyLCBpQ29sb3J0eXBlKSwgTU5HX05VTEwsIE1OR19OVUxMfSwKKyAgICB7TU5HX05VTEwsCisgICAgIE1OR19GSUVMRF9JTlQsCisgICAgIDAsIDAsIDEsIDEsCisgICAgIG9mZnNldG9mKG1uZ19paGRyLCBpQ29tcHJlc3Npb24pLCBNTkdfTlVMTCwgTU5HX05VTEx9LAorICAgIHtNTkdfTlVMTCwKKyAgICAgTU5HX0ZJRUxEX0lOVCwKKyAgICAgMCwgMCwgMSwgMSwKKyAgICAgb2Zmc2V0b2YobW5nX2loZHIsIGlGaWx0ZXIpLCBNTkdfTlVMTCwgTU5HX05VTEx9LAorICAgIHtNTkdfTlVMTCwKKyAgICAgTU5HX0ZJRUxEX0lOVCwKKyAgICAgMCwgMSwgMSwgMSwKKyAgICAgb2Zmc2V0b2YobW5nX2loZHIsIGlJbnRlcmxhY2UpLCBNTkdfTlVMTCwgTU5HX05VTEx9CisgIH07CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK01OR19MT0NBTCBtbmdfZmllbGRfZGVzY3JpcHRvciBtbmdfZmllbGRzX3BsdGUgW10gPQorICB7CisgICAge21uZ19kZWJ1bmtfcGx0ZSwKKyAgICAgTU5HX05VTEwsCisgICAgIDAsIDAsIDAsIDAsCisgICAgIE1OR19OVUxMLCBNTkdfTlVMTCwgTU5HX05VTEx9CisgIH07CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK01OR19MT0NBTCBtbmdfZmllbGRfZGVzY3JpcHRvciBtbmdfZmllbGRzX2lkYXQgW10gPQorICB7CisgICAge01OR19OVUxMLAorICAgICBNTkdfTlVMTCwKKyAgICAgMCwgMCwgMCwgMCwKKyAgICAgb2Zmc2V0b2YobW5nX2lkYXQsIHBEYXRhKSwgTU5HX05VTEwsIG9mZnNldG9mKG1uZ19pZGF0LCBpRGF0YXNpemUpfQorICB9OworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitNTkdfTE9DQUwgbW5nX2ZpZWxkX2Rlc2NyaXB0b3IgbW5nX2ZpZWxkc190cm5zIFtdID0KKyAgeworICAgIHttbmdfZGVidW5rX3RybnMsCisgICAgIE1OR19OVUxMLAorICAgICAwLCAwLCAwLCAwLAorICAgICBNTkdfTlVMTCwgTU5HX05VTEwsIE1OR19OVUxMfQorICB9OworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfZ0FNQQorTU5HX0xPQ0FMIG1uZ19maWVsZF9kZXNjcmlwdG9yIG1uZ19maWVsZHNfZ2FtYSBbXSA9CisgIHsKKyAgICB7TU5HX05VTEwsCisgICAgIE1OR19GSUVMRF9JTlQsCisgICAgIDAsIDAsIDQsIDQsCisgICAgIG9mZnNldG9mKG1uZ19nYW1hLCBpR2FtbWEpLCBNTkdfTlVMTCwgTU5HX05VTEx9CisgIH07CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX2NIUk0KK01OR19MT0NBTCBtbmdfZmllbGRfZGVzY3JpcHRvciBtbmdfZmllbGRzX2Nocm0gW10gPQorICB7CisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfSU5ULAorICAgICAwLCAwLCA0LCA0LAorICAgICBvZmZzZXRvZihtbmdfY2hybSwgaVdoaXRlcG9pbnR4KSwgTU5HX05VTEwsIE1OR19OVUxMfSwKKyAgICB7TU5HX05VTEwsCisgICAgIE1OR19GSUVMRF9JTlQsCisgICAgIDAsIDAsIDQsIDQsCisgICAgIG9mZnNldG9mKG1uZ19jaHJtLCBpV2hpdGVwb2ludHkpLCBNTkdfTlVMTCwgTU5HX05VTEx9LAorICAgIHtNTkdfTlVMTCwKKyAgICAgTU5HX0ZJRUxEX0lOVCwKKyAgICAgMCwgMCwgNCwgNCwKKyAgICAgb2Zmc2V0b2YobW5nX2Nocm0sIGlSZWR4KSwgTU5HX05VTEwsIE1OR19OVUxMfSwKKyAgICB7TU5HX05VTEwsCisgICAgIE1OR19GSUVMRF9JTlQsCisgICAgIDAsIDAsIDQsIDQsCisgICAgIG9mZnNldG9mKG1uZ19jaHJtLCBpUmVkeSksIE1OR19OVUxMLCBNTkdfTlVMTH0sCisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfSU5ULAorICAgICAwLCAwLCA0LCA0LAorICAgICBvZmZzZXRvZihtbmdfY2hybSwgaUdyZWVueSksIE1OR19OVUxMLCBNTkdfTlVMTH0sCisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfSU5ULAorICAgICAwLCAwLCA0LCA0LAorICAgICBvZmZzZXRvZihtbmdfY2hybSwgaUdyZWVueSksIE1OR19OVUxMLCBNTkdfTlVMTH0sCisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfSU5ULAorICAgICAwLCAwLCA0LCA0LAorICAgICBvZmZzZXRvZihtbmdfY2hybSwgaUJsdWV4KSwgTU5HX05VTEwsIE1OR19OVUxMfSwKKyAgICB7TU5HX05VTEwsCisgICAgIE1OR19GSUVMRF9JTlQsCisgICAgIDAsIDAsIDQsIDQsCisgICAgIG9mZnNldG9mKG1uZ19jaHJtLCBpQmx1ZXkpLCBNTkdfTlVMTCwgTU5HX05VTEx9CisgIH07CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX3NSR0IKK01OR19MT0NBTCBtbmdfZmllbGRfZGVzY3JpcHRvciBtbmdfZmllbGRzX3NyZ2IgW10gPQorICB7CisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfSU5ULAorICAgICAwLCA0LCAxLCAxLAorICAgICBvZmZzZXRvZihtbmdfc3JnYiwgaVJlbmRlcmluZ2ludGVudCksIE1OR19OVUxMLCBNTkdfTlVMTH0KKyAgfTsKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfaUNDUAorTU5HX0xPQ0FMIG1uZ19maWVsZF9kZXNjcmlwdG9yIG1uZ19maWVsZHNfaWNjcCBbXSA9CisgIHsKKyAgICB7TU5HX05VTEwsCisgICAgIE1OR19GSUVMRF9URVJNSU5BVE9SLAorICAgICAwLCAwLCAxLCA3OSwKKyAgICAgb2Zmc2V0b2YobW5nX2ljY3AsIHpOYW1lKSwgTU5HX05VTEwsIG9mZnNldG9mKG1uZ19pY2NwLCBpTmFtZXNpemUpfSwKKyAgICB7TU5HX05VTEwsCisgICAgIE1OR19GSUVMRF9JTlQsCisgICAgIDAsIDAsIDEsIDEsCisgICAgIG9mZnNldG9mKG1uZ19pY2NwLCBpQ29tcHJlc3Npb24pLCBNTkdfTlVMTCwgTU5HX05VTEx9LAorICAgIHtNTkdfTlVMTCwKKyAgICAgTU5HX0ZJRUxEX0RFRkxBVEVELAorICAgICAwLCAwLCAwLCAwLAorICAgICBvZmZzZXRvZihtbmdfaWNjcCwgcFByb2ZpbGUpLCBNTkdfTlVMTCwgb2Zmc2V0b2YobW5nX2ljY3AsIGlQcm9maWxlc2l6ZSl9CisgIH07CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX3RFWHQKK01OR19MT0NBTCBtbmdfZmllbGRfZGVzY3JpcHRvciBtbmdfZmllbGRzX3RleHQgW10gPQorICB7CisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfVEVSTUlOQVRPUiwKKyAgICAgMCwgMCwgMSwgNzksCisgICAgIG9mZnNldG9mKG1uZ190ZXh0LCB6S2V5d29yZCksIE1OR19OVUxMLCBvZmZzZXRvZihtbmdfdGV4dCwgaUtleXdvcmRzaXplKX0sCisgICAge01OR19OVUxMLAorICAgICBNTkdfTlVMTCwKKyAgICAgMCwgMCwgMCwgMCwKKyAgICAgb2Zmc2V0b2YobW5nX3RleHQsIHpUZXh0KSwgTU5HX05VTEwsIG9mZnNldG9mKG1uZ190ZXh0LCBpVGV4dHNpemUpfQorICB9OworI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS196VFh0CitNTkdfTE9DQUwgbW5nX2ZpZWxkX2Rlc2NyaXB0b3IgbW5nX2ZpZWxkc196dHh0IFtdID0KKyAgeworICAgIHtNTkdfTlVMTCwKKyAgICAgTU5HX0ZJRUxEX1RFUk1JTkFUT1IsCisgICAgIDAsIDAsIDEsIDc5LAorICAgICBvZmZzZXRvZihtbmdfenR4dCwgektleXdvcmQpLCBNTkdfTlVMTCwgb2Zmc2V0b2YobW5nX3p0eHQsIGlLZXl3b3Jkc2l6ZSl9LAorICAgIHtNTkdfTlVMTCwKKyAgICAgTU5HX0ZJRUxEX0lOVCwKKyAgICAgMCwgMCwgMSwgMSwKKyAgICAgb2Zmc2V0b2YobW5nX3p0eHQsIGlDb21wcmVzc2lvbiksIE1OR19OVUxMLCBNTkdfTlVMTH0sCisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfREVGTEFURUQsCisgICAgIDAsIDAsIDAsIDAsCisgICAgIG9mZnNldG9mKG1uZ196dHh0LCB6VGV4dCksIE1OR19OVUxMLCBvZmZzZXRvZihtbmdfenR4dCwgaVRleHRzaXplKX0KKyAgfTsKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfaVRYdAorTU5HX0xPQ0FMIG1uZ19maWVsZF9kZXNjcmlwdG9yIG1uZ19maWVsZHNfaXR4dCBbXSA9CisgIHsKKyAgICB7TU5HX05VTEwsCisgICAgIE1OR19GSUVMRF9URVJNSU5BVE9SLAorICAgICAwLCAwLCAxLCA3OSwKKyAgICAgb2Zmc2V0b2YobW5nX2l0eHQsIHpLZXl3b3JkKSwgTU5HX05VTEwsIG9mZnNldG9mKG1uZ19pdHh0LCBpS2V5d29yZHNpemUpfSwKKyAgICB7TU5HX05VTEwsCisgICAgIE1OR19GSUVMRF9JTlQsCisgICAgIDAsIDEsIDEsIDEsCisgICAgIG9mZnNldG9mKG1uZ19pdHh0LCBpQ29tcHJlc3Npb25mbGFnKSwgTU5HX05VTEwsIE1OR19OVUxMfSwKKyAgICB7TU5HX05VTEwsCisgICAgIE1OR19GSUVMRF9JTlQsCisgICAgIDAsIDAsIDEsIDEsCisgICAgIG9mZnNldG9mKG1uZ19pdHh0LCBpQ29tcHJlc3Npb25tZXRob2QpLCBNTkdfTlVMTCwgTU5HX05VTEx9LAorICAgIHtNTkdfTlVMTCwKKyAgICAgTU5HX0ZJRUxEX1RFUk1JTkFUT1IsCisgICAgIDAsIDAsIDAsIDAsCisgICAgIG9mZnNldG9mKG1uZ19pdHh0LCB6TGFuZ3VhZ2UpLCBNTkdfTlVMTCwgb2Zmc2V0b2YobW5nX2l0eHQsIGlMYW5ndWFnZXNpemUpfSwKKyAgICB7TU5HX05VTEwsCisgICAgIE1OR19GSUVMRF9URVJNSU5BVE9SLAorICAgICAwLCAwLCAwLCAwLAorICAgICBvZmZzZXRvZihtbmdfaXR4dCwgelRyYW5zbGF0aW9uKSwgTU5HX05VTEwsIG9mZnNldG9mKG1uZ19pdHh0LCBpVHJhbnNsYXRpb25zaXplKX0sCisgICAge21uZ19kZWZsYXRlX2l0eHQsCisgICAgIE1OR19OVUxMLAorICAgICAwLCAwLCAwLCAwLAorICAgICBNTkdfTlVMTCwgTU5HX05VTEwsIE1OR19OVUxMfQorICB9OworI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19iS0dECitNTkdfTE9DQUwgbW5nX2ZpZWxkX2Rlc2NyaXB0b3IgbW5nX2ZpZWxkc19ia2dkIFtdID0KKyAgeworICAgIHtNTkdfTlVMTCwKKyAgICAgTU5HX0ZJRUxEX0lOVCB8IE1OR19GSUVMRF9QVVRJTUdUWVBFLAorICAgICAwLCAwLCAwLCAwLAorICAgICBvZmZzZXRvZihtbmdfYmtnZCwgaVR5cGUpLCBNTkdfTlVMTCwgTU5HX05VTEx9LAorICAgIHtNTkdfTlVMTCwKKyAgICAgTU5HX0ZJRUxEX0lOVCB8IE1OR19GSUVMRF9JRklNR1RZUEUzLAorICAgICAwLCAweEZGLCAxLCAxLAorICAgICBvZmZzZXRvZihtbmdfYmtnZCwgaUluZGV4KSwgTU5HX05VTEwsIE1OR19OVUxMfSwKKyAgICB7TU5HX05VTEwsCisgICAgIE1OR19GSUVMRF9JTlQgfCBNTkdfRklFTERfSUZJTUdUWVBFMCB8IE1OR19GSUVMRF9JRklNR1RZUEU0LAorICAgICAwLCAweEZGRkYsIDIsIDIsCisgICAgIG9mZnNldG9mKG1uZ19ia2dkLCBpR3JheSksIE1OR19OVUxMLCBNTkdfTlVMTH0sCisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfSU5UIHwgTU5HX0ZJRUxEX0lGSU1HVFlQRTIgfCBNTkdfRklFTERfSUZJTUdUWVBFNiwKKyAgICAgMCwgMHhGRkZGLCAyLCAyLAorICAgICBvZmZzZXRvZihtbmdfYmtnZCwgaVJlZCksIE1OR19OVUxMLCBNTkdfTlVMTH0sCisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfSU5UIHwgTU5HX0ZJRUxEX0lGSU1HVFlQRTIgfCBNTkdfRklFTERfSUZJTUdUWVBFNiwKKyAgICAgMCwgMHhGRkZGLCAyLCAyLAorICAgICBvZmZzZXRvZihtbmdfYmtnZCwgaUdyZWVuKSwgTU5HX05VTEwsIE1OR19OVUxMfSwKKyAgICB7TU5HX05VTEwsCisgICAgIE1OR19GSUVMRF9JTlQgfCBNTkdfRklFTERfSUZJTUdUWVBFMiB8IE1OR19GSUVMRF9JRklNR1RZUEU2LAorICAgICAwLCAweEZGRkYsIDIsIDIsCisgICAgIG9mZnNldG9mKG1uZ19ia2dkLCBpQmx1ZSksIE1OR19OVUxMLCBNTkdfTlVMTH0KKyAgfTsKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfcEhZcworTU5HX0xPQ0FMIG1uZ19maWVsZF9kZXNjcmlwdG9yIG1uZ19maWVsZHNfcGh5cyBbXSA9CisgIHsKKyAgICB7TU5HX05VTEwsCisgICAgIE1OR19GSUVMRF9JTlQsCisgICAgIDAsIDAsIDQsIDQsCisgICAgIG9mZnNldG9mKG1uZ19waHlzLCBpU2l6ZXgpLCBNTkdfTlVMTCwgTU5HX05VTEx9LAorICAgIHtNTkdfTlVMTCwKKyAgICAgTU5HX0ZJRUxEX0lOVCwKKyAgICAgMCwgMCwgNCwgNCwKKyAgICAgb2Zmc2V0b2YobW5nX3BoeXMsIGlTaXpleSksIE1OR19OVUxMLCBNTkdfTlVMTH0sCisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfSU5ULAorICAgICAwLCAxLCAxLCAxLAorICAgICBvZmZzZXRvZihtbmdfcGh5cywgaVVuaXQpLCBNTkdfTlVMTCwgTU5HX05VTEx9CisgIH07CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX3NCSVQKK01OR19MT0NBTCBtbmdfZmllbGRfZGVzY3JpcHRvciBtbmdfZmllbGRzX3NiaXQgW10gPQorICB7CisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfSU5UIHwgTU5HX0ZJRUxEX1BVVElNR1RZUEUsCisgICAgIDAsIDAsIDAsIDAsCisgICAgIG9mZnNldG9mKG1uZ19zYml0LCBpVHlwZSksIE1OR19OVUxMLCBNTkdfTlVMTH0sCisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfSU5UIHwgTU5HX0ZJRUxEX0lGSU1HVFlQRVMsCisgICAgIDAsIDB4RkYsIDEsIDEsCisgICAgIG9mZnNldG9mKG1uZ19zYml0LCBhQml0c1swXSksIE1OR19OVUxMLCBNTkdfTlVMTH0sCisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfSU5UIHwgTU5HX0ZJRUxEX0lGSU1HVFlQRTIgfCBNTkdfRklFTERfSUZJTUdUWVBFMyB8IE1OR19GSUVMRF9JRklNR1RZUEU0IHwgTU5HX0ZJRUxEX0lGSU1HVFlQRTYsCisgICAgIDAsIDB4RkYsIDEsIDEsCisgICAgIG9mZnNldG9mKG1uZ19zYml0LCBhQml0c1sxXSksIE1OR19OVUxMLCBNTkdfTlVMTH0sCisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfSU5UIHwgTU5HX0ZJRUxEX0lGSU1HVFlQRTIgfCBNTkdfRklFTERfSUZJTUdUWVBFMyB8IE1OR19GSUVMRF9JRklNR1RZUEU2LAorICAgICAwLCAweEZGLCAxLCAxLAorICAgICBvZmZzZXRvZihtbmdfc2JpdCwgYUJpdHNbMl0pLCBNTkdfTlVMTCwgTU5HX05VTEx9LAorICAgIHtNTkdfTlVMTCwKKyAgICAgTU5HX0ZJRUxEX0lOVCB8IE1OR19GSUVMRF9JRklNR1RZUEU2LAorICAgICAwLCAweEZGLCAxLCAxLAorICAgICBvZmZzZXRvZihtbmdfc2JpdCwgYUJpdHNbM10pLCBNTkdfTlVMTCwgTU5HX05VTEx9CisgIH07CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX3NQTFQKK01OR19MT0NBTCBtbmdfZmllbGRfZGVzY3JpcHRvciBtbmdfZmllbGRzX3NwbHQgW10gPQorICB7CisgICAge01OR19OVUxMLAorICAgICBNTkdfTlVMTCwKKyAgICAgMCwgMCwgMSwgNzksCisgICAgIG9mZnNldG9mKG1uZ19zcGx0LCB6TmFtZSksIE1OR19OVUxMLCBvZmZzZXRvZihtbmdfc3BsdCwgaU5hbWVzaXplKX0sCisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfSU5ULAorICAgICA4LCAxNiwgMSwgMSwKKyAgICAgb2Zmc2V0b2YobW5nX3NwbHQsIGlTYW1wbGVkZXB0aCksIE1OR19OVUxMLCBNTkdfTlVMTH0sCisgICAge21uZ19zcGx0X2VudHJpZXMsCisgICAgIE1OR19OVUxMLAorICAgICAwLCAwLCAwLCAwLAorICAgICBNTkdfTlVMTCwgTU5HX05VTEwsIE1OR19OVUxMfQorICB9OworI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19oSVNUCitNTkdfTE9DQUwgbW5nX2ZpZWxkX2Rlc2NyaXB0b3IgbW5nX2ZpZWxkc19oaXN0IFtdID0KKyAgeworICAgIHttbmdfaGlzdF9lbnRyaWVzLAorICAgICBNTkdfTlVMTCwKKyAgICAgMCwgMCwgMCwgMCwKKyAgICAgTU5HX05VTEwsIE1OR19OVUxMLCBNTkdfTlVMTH0KKyAgfTsKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfdElNRQorTU5HX0xPQ0FMIG1uZ19maWVsZF9kZXNjcmlwdG9yIG1uZ19maWVsZHNfdGltZSBbXSA9CisgIHsKKyAgICB7TU5HX05VTEwsCisgICAgIE1OR19GSUVMRF9JTlQsCisgICAgIDAsIDB4RkZGRiwgMiwgMiwKKyAgICAgb2Zmc2V0b2YobW5nX3RpbWUsIGlZZWFyKSwgTU5HX05VTEwsIE1OR19OVUxMfSwKKyAgICB7TU5HX05VTEwsCisgICAgIE1OR19GSUVMRF9JTlQsCisgICAgIDEsIDEyLCAxLCAxLAorICAgICBvZmZzZXRvZihtbmdfdGltZSwgaU1vbnRoKSwgTU5HX05VTEwsIE1OR19OVUxMfSwKKyAgICB7TU5HX05VTEwsCisgICAgIE1OR19GSUVMRF9JTlQsCisgICAgIDEsIDMxLCAxLCAxLAorICAgICBvZmZzZXRvZihtbmdfdGltZSwgaURheSksIE1OR19OVUxMLCBNTkdfTlVMTH0sCisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfSU5ULAorICAgICAwLCAyNCwgMSwgMSwKKyAgICAgb2Zmc2V0b2YobW5nX3RpbWUsIGlIb3VyKSwgTU5HX05VTEwsIE1OR19OVUxMfSwKKyAgICB7TU5HX05VTEwsCisgICAgIE1OR19GSUVMRF9JTlQsCisgICAgIDAsIDYwLCAxLCAxLAorICAgICBvZmZzZXRvZihtbmdfdGltZSwgaU1pbnV0ZSksIE1OR19OVUxMLCBNTkdfTlVMTH0sCisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfSU5ULAorICAgICAwLCA2MCwgMSwgMSwKKyAgICAgb2Zmc2V0b2YobW5nX3RpbWUsIGlTZWNvbmQpLCBNTkdfTlVMTCwgTU5HX05VTEx9CisgIH07CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiBKTkcgY2h1bmtzICovCisKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKK01OR19MT0NBTCBtbmdfZmllbGRfZGVzY3JpcHRvciBtbmdfZmllbGRzX2poZHIgW10gPQorICB7CisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfSU5UIHwgTU5HX0ZJRUxEX05PSElHSEJJVCwKKyAgICAgMSwgMCwgNCwgNCwKKyAgICAgb2Zmc2V0b2YobW5nX2poZHIsIGlXaWR0aCksIE1OR19OVUxMLCBNTkdfTlVMTH0sCisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfSU5UIHwgTU5HX0ZJRUxEX05PSElHSEJJVCwKKyAgICAgMSwgMCwgNCwgNCwKKyAgICAgb2Zmc2V0b2YobW5nX2poZHIsIGlIZWlnaHQpLCBNTkdfTlVMTCwgTU5HX05VTEx9LAorICAgIHtNTkdfTlVMTCwKKyAgICAgTU5HX0ZJRUxEX0lOVCwKKyAgICAgOCwgMTYsIDEsIDEsCisgICAgIG9mZnNldG9mKG1uZ19qaGRyLCBpQ29sb3J0eXBlKSwgTU5HX05VTEwsIE1OR19OVUxMfSwKKyAgICB7TU5HX05VTEwsCisgICAgIE1OR19GSUVMRF9JTlQsCisgICAgIDgsIDIwLCAxLCAxLAorICAgICBvZmZzZXRvZihtbmdfamhkciwgaUltYWdlc2FtcGxlZGVwdGgpLCBNTkdfTlVMTCwgTU5HX05VTEx9LAorICAgIHtNTkdfTlVMTCwKKyAgICAgTU5HX0ZJRUxEX0lOVCwKKyAgICAgOCwgOCwgMSwgMSwKKyAgICAgb2Zmc2V0b2YobW5nX2poZHIsIGlJbWFnZWNvbXByZXNzaW9uKSwgTU5HX05VTEwsIE1OR19OVUxMfSwKKyAgICB7TU5HX05VTEwsCisgICAgIE1OR19GSUVMRF9JTlQsCisgICAgIDAsIDgsIDEsIDEsCisgICAgIG9mZnNldG9mKG1uZ19qaGRyLCBpSW1hZ2VpbnRlcmxhY2UpLCBNTkdfTlVMTCwgTU5HX05VTEx9LAorICAgIHtNTkdfTlVMTCwKKyAgICAgTU5HX0ZJRUxEX0lOVCwKKyAgICAgMCwgMTYsIDEsIDEsCisgICAgIG9mZnNldG9mKG1uZ19qaGRyLCBpQWxwaGFzYW1wbGVkZXB0aCksIE1OR19OVUxMLCBNTkdfTlVMTH0sCisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfSU5ULAorICAgICAwLCA4LCAxLCAxLAorICAgICBvZmZzZXRvZihtbmdfamhkciwgaUFscGhhY29tcHJlc3Npb24pLCBNTkdfTlVMTCwgTU5HX05VTEx9LAorICAgIHtNTkdfTlVMTCwKKyAgICAgTU5HX0ZJRUxEX0lOVCwKKyAgICAgMCwgMCwgMSwgMSwKKyAgICAgb2Zmc2V0b2YobW5nX2poZHIsIGlBbHBoYWZpbHRlciksIE1OR19OVUxMLCBNTkdfTlVMTH0sCisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfSU5ULAorICAgICAwLCAxLCAxLCAxLAorICAgICBvZmZzZXRvZihtbmdfamhkciwgaUFscGhhaW50ZXJsYWNlKSwgTU5HX05VTEwsIE1OR19OVUxMfQorICB9OworI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyNkZWZpbmUgbW5nX2ZpZWxkc19qZGFhIG1uZ19maWVsZHNfaWRhdAorI2RlZmluZSBtbmdfZmllbGRzX2pkYXQgbW5nX2ZpZWxkc19pZGF0CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiBNTkcgY2h1bmtzICovCisKK01OR19MT0NBTCBtbmdfZmllbGRfZGVzY3JpcHRvciBtbmdfZmllbGRzX21oZHIgW10gPQorICB7CisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfSU5ULAorICAgICAwLCAwLCA0LCA0LAorICAgICBvZmZzZXRvZihtbmdfbWhkciwgaVdpZHRoKSwgTU5HX05VTEwsIE1OR19OVUxMfSwKKyAgICB7TU5HX05VTEwsCisgICAgIE1OR19GSUVMRF9JTlQsCisgICAgIDAsIDAsIDQsIDQsCisgICAgIG9mZnNldG9mKG1uZ19taGRyLCBpSGVpZ2h0KSwgTU5HX05VTEwsIE1OR19OVUxMfSwKKyAgICB7TU5HX05VTEwsCisgICAgIE1OR19GSUVMRF9JTlQsCisgICAgIDAsIDAsIDQsIDQsCisgICAgIG9mZnNldG9mKG1uZ19taGRyLCBpVGlja3MpLCBNTkdfTlVMTCwgTU5HX05VTEx9LAorICAgIHtNTkdfTlVMTCwKKyAgICAgTU5HX0ZJRUxEX0lOVCwKKyAgICAgMCwgMCwgNCwgNCwKKyAgICAgb2Zmc2V0b2YobW5nX21oZHIsIGlMYXllcmNvdW50KSwgTU5HX05VTEwsIE1OR19OVUxMfSwKKyAgICB7TU5HX05VTEwsCisgICAgIE1OR19GSUVMRF9JTlQsCisgICAgIDAsIDAsIDQsIDQsCisgICAgIG9mZnNldG9mKG1uZ19taGRyLCBpRnJhbWVjb3VudCksIE1OR19OVUxMLCBNTkdfTlVMTH0sCisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfSU5ULAorICAgICAwLCAwLCA0LCA0LAorICAgICBvZmZzZXRvZihtbmdfbWhkciwgaVBsYXl0aW1lKSwgTU5HX05VTEwsIE1OR19OVUxMfSwKKyAgICB7TU5HX05VTEwsCisgICAgIE1OR19GSUVMRF9JTlQsCisgICAgIDAsIDAsIDQsIDQsCisgICAgIG9mZnNldG9mKG1uZ19taGRyLCBpU2ltcGxpY2l0eSksIE1OR19OVUxMLCBNTkdfTlVMTH0KKyAgfTsKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX0xPT1AKK01OR19MT0NBTCBtbmdfZmllbGRfZGVzY3JpcHRvciBtbmdfZmllbGRzX2xvb3AgW10gPQorICB7CisgICAge21uZ19kZWJ1bmtfbG9vcCwKKyAgICAgTU5HX05VTEwsCisgICAgIDAsIDAsIDAsIDAsCisgICAgIE1OR19OVUxMLCBNTkdfTlVMTCwgTU5HX05VTEx9CisgIH07CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX0xPT1AKK01OR19MT0NBTCBtbmdfZmllbGRfZGVzY3JpcHRvciBtbmdfZmllbGRzX2VuZGwgW10gPQorICB7CisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfSU5ULAorICAgICAwLCAweEZGLCAxLCAxLAorICAgICBvZmZzZXRvZihtbmdfZW5kbCwgaUxldmVsKSwgTU5HX05VTEwsIE1OR19OVUxMfQorICB9OworI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19ERUZJCitNTkdfTE9DQUwgbW5nX2ZpZWxkX2Rlc2NyaXB0b3IgbW5nX2ZpZWxkc19kZWZpIFtdID0KKyAgeworICAgIHtNTkdfTlVMTCwKKyAgICAgTU5HX0ZJRUxEX0lOVCwKKyAgICAgMCwgMHhGRkZGLCAyLCAyLAorICAgICBvZmZzZXRvZihtbmdfZGVmaSwgaU9iamVjdGlkKSwgTU5HX05VTEwsIE1OR19OVUxMfSwKKyAgICB7TU5HX05VTEwsCisgICAgIE1OR19GSUVMRF9JTlQgfCBNTkdfRklFTERfT1BUSU9OQUwsCisgICAgIDAsIDB4RkYsIDEsIDEsCisgICAgIG9mZnNldG9mKG1uZ19kZWZpLCBpRG9ub3RzaG93KSwgb2Zmc2V0b2YobW5nX2RlZmksIGJIYXNkb25vdHNob3cpLCBNTkdfTlVMTH0sCisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfSU5UIHwgTU5HX0ZJRUxEX09QVElPTkFMLAorICAgICAwLCAweEZGLCAxLCAxLAorICAgICBvZmZzZXRvZihtbmdfZGVmaSwgaUNvbmNyZXRlKSwgb2Zmc2V0b2YobW5nX2RlZmksIGJIYXNjb25jcmV0ZSksIE1OR19OVUxMfSwKKyAgICB7TU5HX05VTEwsCisgICAgIE1OR19GSUVMRF9JTlQgfCBNTkdfRklFTERfT1BUSU9OQUwgfCBNTkdfRklFTERfR1JPVVAxLAorICAgICAwLCAwLCA0LCA0LAorICAgICBvZmZzZXRvZihtbmdfZGVmaSwgaVhsb2NhdGlvbiksIG9mZnNldG9mKG1uZ19kZWZpLCBiSGFzbG9jYSksIE1OR19OVUxMfSwKKyAgICB7TU5HX05VTEwsCisgICAgIE1OR19GSUVMRF9JTlQgfCBNTkdfRklFTERfT1BUSU9OQUwgfCBNTkdfRklFTERfR1JPVVAxLAorICAgICAwLCAwLCA0LCA0LAorICAgICBvZmZzZXRvZihtbmdfZGVmaSwgaVlsb2NhdGlvbiksIE1OR19OVUxMLCBNTkdfTlVMTH0sCisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfSU5UIHwgTU5HX0ZJRUxEX09QVElPTkFMIHwgTU5HX0ZJRUxEX0dST1VQMiwKKyAgICAgMCwgMCwgNCwgNCwKKyAgICAgb2Zmc2V0b2YobW5nX2RlZmksIGlMZWZ0Y2IpLCBvZmZzZXRvZihtbmdfZGVmaSwgYkhhc2NsaXApLCBNTkdfTlVMTH0sCisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfSU5UIHwgTU5HX0ZJRUxEX09QVElPTkFMIHwgTU5HX0ZJRUxEX0dST1VQMiwKKyAgICAgMCwgMCwgNCwgNCwKKyAgICAgb2Zmc2V0b2YobW5nX2RlZmksIGlSaWdodGNiKSwgTU5HX05VTEwsIE1OR19OVUxMfSwKKyAgICB7TU5HX05VTEwsCisgICAgIE1OR19GSUVMRF9JTlQgfCBNTkdfRklFTERfT1BUSU9OQUwgfCBNTkdfRklFTERfR1JPVVAyLAorICAgICAwLCAwLCA0LCA0LAorICAgICBvZmZzZXRvZihtbmdfZGVmaSwgaVRvcGNiKSwgTU5HX05VTEwsIE1OR19OVUxMfSwKKyAgICB7TU5HX05VTEwsCisgICAgIE1OR19GSUVMRF9JTlQgfCBNTkdfRklFTERfT1BUSU9OQUwgfCBNTkdfRklFTERfR1JPVVAyLAorICAgICAwLCAwLCA0LCA0LAorICAgICBvZmZzZXRvZihtbmdfZGVmaSwgaUJvdHRvbWNiKSwgTU5HX05VTEwsIE1OR19OVUxMfQorICB9OworI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19CQVNJCitNTkdfTE9DQUwgbW5nX2ZpZWxkX2Rlc2NyaXB0b3IgbW5nX2ZpZWxkc19iYXNpIFtdID0KKyAgeworICAgIHtNTkdfTlVMTCwKKyAgICAgTU5HX0ZJRUxEX0lOVCwKKyAgICAgMCwgMCwgNCwgNCwKKyAgICAgb2Zmc2V0b2YobW5nX2Jhc2ksIGlXaWR0aCksIE1OR19OVUxMLCBNTkdfTlVMTH0sCisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfSU5ULAorICAgICAwLCAwLCA0LCA0LAorICAgICBvZmZzZXRvZihtbmdfYmFzaSwgaUhlaWdodCksIE1OR19OVUxMLCBNTkdfTlVMTH0sCisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfSU5ULAorICAgICAxLCAxNiwgMSwgMSwKKyAgICAgb2Zmc2V0b2YobW5nX2Jhc2ksIGlCaXRkZXB0aCksIE1OR19OVUxMLCBNTkdfTlVMTH0sCisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfSU5ULAorICAgICAwLCA2LCAxLCAxLAorICAgICBvZmZzZXRvZihtbmdfYmFzaSwgaUNvbG9ydHlwZSksIE1OR19OVUxMLCBNTkdfTlVMTH0sCisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfSU5ULAorICAgICAwLCAwLCAxLCAxLAorICAgICBvZmZzZXRvZihtbmdfYmFzaSwgaUNvbXByZXNzaW9uKSwgTU5HX05VTEwsIE1OR19OVUxMfSwKKyAgICB7TU5HX05VTEwsCisgICAgIE1OR19GSUVMRF9JTlQsCisgICAgIDAsIDAsIDEsIDEsCisgICAgIG9mZnNldG9mKG1uZ19iYXNpLCBpRmlsdGVyKSwgTU5HX05VTEwsIE1OR19OVUxMfSwKKyAgICB7TU5HX05VTEwsCisgICAgIE1OR19GSUVMRF9JTlQsCisgICAgIDAsIDEsIDEsIDEsCisgICAgIG9mZnNldG9mKG1uZ19iYXNpLCBpSW50ZXJsYWNlKSwgTU5HX05VTEwsIE1OR19OVUxMfSwKKyAgICB7TU5HX05VTEwsCisgICAgIE1OR19GSUVMRF9JTlQgfCBNTkdfRklFTERfT1BUSU9OQUwgfCBNTkdfRklFTERfR1JPVVAxLAorICAgICAwLCAweEZGRkYsIDIsIDIsCisgICAgIG9mZnNldG9mKG1uZ19iYXNpLCBpUmVkKSwgTU5HX05VTEwsIE1OR19OVUxMfSwKKyAgICB7TU5HX05VTEwsCisgICAgIE1OR19GSUVMRF9JTlQgfCBNTkdfRklFTERfT1BUSU9OQUwgfCBNTkdfRklFTERfR1JPVVAxLAorICAgICAwLCAweEZGRkYsIDIsIDIsCisgICAgIG9mZnNldG9mKG1uZ19iYXNpLCBpR3JlZW4pLCBNTkdfTlVMTCwgTU5HX05VTEx9LAorICAgIHtNTkdfTlVMTCwKKyAgICAgTU5HX0ZJRUxEX0lOVCB8IE1OR19GSUVMRF9PUFRJT05BTCB8IE1OR19GSUVMRF9HUk9VUDEsCisgICAgIDAsIDB4RkZGRiwgMiwgMiwKKyAgICAgb2Zmc2V0b2YobW5nX2Jhc2ksIGlCbHVlKSwgTU5HX05VTEwsIE1OR19OVUxMfSwKKyAgICB7TU5HX05VTEwsCisgICAgIE1OR19GSUVMRF9JTlQgfCBNTkdfRklFTERfT1BUSU9OQUwsCisgICAgIDAsIDB4RkZGRiwgMiwgMiwKKyAgICAgb2Zmc2V0b2YobW5nX2Jhc2ksIGlBbHBoYSksIG9mZnNldG9mKG1uZ19iYXNpLCBiSGFzYWxwaGEpLCBNTkdfTlVMTH0sCisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfSU5UIHwgTU5HX0ZJRUxEX09QVElPTkFMLAorICAgICAwLCAxLCAxLCAxLAorICAgICBvZmZzZXRvZihtbmdfYmFzaSwgaVZpZXdhYmxlKSwgTU5HX05VTEwsIE1OR19OVUxMfQorICB9OworI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19DTE9OCitNTkdfTE9DQUwgbW5nX2ZpZWxkX2Rlc2NyaXB0b3IgbW5nX2ZpZWxkc19jbG9uIFtdID0KKyAgeworICAgIHtNTkdfTlVMTCwKKyAgICAgTU5HX0ZJRUxEX0lOVCwKKyAgICAgMCwgMHhGRkZGLCAyLCAyLAorICAgICBvZmZzZXRvZihtbmdfY2xvbiwgaVNvdXJjZWlkKSwgTU5HX05VTEwsIE1OR19OVUxMfSwKKyAgICB7TU5HX05VTEwsCisgICAgIE1OR19GSUVMRF9JTlQsCisgICAgIDAsIDB4RkZGRiwgMiwgMiwKKyAgICAgb2Zmc2V0b2YobW5nX2Nsb24sIGlDbG9uZWlkKSwgTU5HX05VTEwsIE1OR19OVUxMfSwKKyAgICB7TU5HX05VTEwsCisgICAgIE1OR19GSUVMRF9JTlQgfCBNTkdfRklFTERfT1BUSU9OQUwsCisgICAgIDAsIDIsIDEsIDEsCisgICAgIG9mZnNldG9mKG1uZ19jbG9uLCBpQ2xvbmV0eXBlKSwgTU5HX05VTEwsIE1OR19OVUxMfSwKKyAgICB7TU5HX05VTEwsCisgICAgIE1OR19GSUVMRF9JTlQgfCBNTkdfRklFTERfT1BUSU9OQUwsCisgICAgIDAsIDEsIDEsIDEsCisgICAgIG9mZnNldG9mKG1uZ19jbG9uLCBpRG9ub3RzaG93KSwgb2Zmc2V0b2YobW5nX2Nsb24sIGJIYXNkb25vdHNob3cpLCBNTkdfTlVMTH0sCisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfSU5UIHwgTU5HX0ZJRUxEX09QVElPTkFMLAorICAgICAwLCAxLCAxLCAxLAorICAgICBvZmZzZXRvZihtbmdfY2xvbiwgaUNvbmNyZXRlKSwgTU5HX05VTEwsIE1OR19OVUxMfSwKKyAgICB7TU5HX05VTEwsCisgICAgIE1OR19GSUVMRF9JTlQgfCBNTkdfRklFTERfT1BUSU9OQUwgfCBNTkdfRklFTERfR1JPVVAxLAorICAgICAwLCAyLCAxLCAxLAorICAgICBvZmZzZXRvZihtbmdfY2xvbiwgaUxvY2F0aW9udHlwZSksIG9mZnNldG9mKG1uZ19jbG9uLCBiSGFzbG9jYSksIE1OR19OVUxMfSwKKyAgICB7TU5HX05VTEwsCisgICAgIE1OR19GSUVMRF9JTlQgfCBNTkdfRklFTERfT1BUSU9OQUwgfCBNTkdfRklFTERfR1JPVVAxLAorICAgICAwLCAwLCA0LCA0LAorICAgICBvZmZzZXRvZihtbmdfY2xvbiwgaUxvY2F0aW9ueCksIE1OR19OVUxMLCBNTkdfTlVMTH0sCisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfSU5UIHwgTU5HX0ZJRUxEX09QVElPTkFMIHwgTU5HX0ZJRUxEX0dST1VQMSwKKyAgICAgMCwgMCwgNCwgNCwKKyAgICAgb2Zmc2V0b2YobW5nX2Nsb24sIGlMb2NhdGlvbnkpLCBNTkdfTlVMTCwgTU5HX05VTEx9CisgIH07CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX1BBU1QKK01OR19MT0NBTCBtbmdfZmllbGRfZGVzY3JpcHRvciBtbmdfZmllbGRzX3Bhc3QgW10gPQorICB7CisgICAge21uZ19kZWJ1bmtfcGFzdCwKKyAgICAgTU5HX05VTEwsCisgICAgIDAsIDAsIDAsIDAsCisgICAgIE1OR19OVUxMLCBNTkdfTlVMTCwgTU5HX05VTEx9CisgIH07CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX0RJU0MKK01OR19MT0NBTCBtbmdfZmllbGRfZGVzY3JpcHRvciBtbmdfZmllbGRzX2Rpc2MgW10gPQorICB7CisgICAge21uZ19kaXNjX2VudHJpZXMsCisgICAgIE1OR19OVUxMLAorICAgICAwLCAwLCAwLCAwLAorICAgICBNTkdfTlVMTCwgTU5HX05VTEwsIE1OR19OVUxMfQorICB9OworI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19CQUNLCitNTkdfTE9DQUwgbW5nX2ZpZWxkX2Rlc2NyaXB0b3IgbW5nX2ZpZWxkc19iYWNrIFtdID0KKyAgeworICAgIHtNTkdfTlVMTCwKKyAgICAgTU5HX0ZJRUxEX0lOVCwKKyAgICAgMCwgMHhGRkZGLCAyLCAyLAorICAgICBvZmZzZXRvZihtbmdfYmFjaywgaVJlZCksIE1OR19OVUxMLCBNTkdfTlVMTH0sCisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfSU5ULAorICAgICAwLCAweEZGRkYsIDIsIDIsCisgICAgIG9mZnNldG9mKG1uZ19iYWNrLCBpR3JlZW4pLCBNTkdfTlVMTCwgTU5HX05VTEx9LAorICAgIHtNTkdfTlVMTCwKKyAgICAgTU5HX0ZJRUxEX0lOVCwKKyAgICAgMCwgMHhGRkZGLCAyLCAyLAorICAgICBvZmZzZXRvZihtbmdfYmFjaywgaUJsdWUpLCBNTkdfTlVMTCwgTU5HX05VTEx9LAorICAgIHtNTkdfTlVMTCwKKyAgICAgTU5HX0ZJRUxEX0lOVCB8IE1OR19GSUVMRF9PUFRJT05BTCwKKyAgICAgMCwgMywgMSwgMSwKKyAgICAgb2Zmc2V0b2YobW5nX2JhY2ssIGlNYW5kYXRvcnkpLCBNTkdfTlVMTCwgTU5HX05VTEx9LAorICAgIHtNTkdfTlVMTCwKKyAgICAgTU5HX0ZJRUxEX0lOVCB8IE1OR19GSUVMRF9PUFRJT05BTCwKKyAgICAgMCwgMHhGRkZGLCAyLCAyLAorICAgICBvZmZzZXRvZihtbmdfYmFjaywgaUltYWdlaWQpLCBNTkdfTlVMTCwgTU5HX05VTEx9LAorICAgIHtNTkdfTlVMTCwKKyAgICAgTU5HX0ZJRUxEX0lOVCB8IE1OR19GSUVMRF9PUFRJT05BTCwKKyAgICAgMCwgMSwgMSwgMSwKKyAgICAgb2Zmc2V0b2YobW5nX2JhY2ssIGlUaWxlKSwgTU5HX05VTEwsIE1OR19OVUxMfQorICB9OworI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19GUkFNCitNTkdfTE9DQUwgbW5nX2ZpZWxkX2Rlc2NyaXB0b3IgbW5nX2ZpZWxkc19mcmFtIFtdID0KKyAgeworICAgIHtNTkdfTlVMTCwKKyAgICAgTU5HX0ZJRUxEX0lOVCB8IE1OR19GSUVMRF9PUFRJT05BTCwKKyAgICAgMCwgNCwgMSwgMSwKKyAgICAgb2Zmc2V0b2YobW5nX2ZyYW0sIGlNb2RlKSwgTU5HX05VTEwsIE1OR19OVUxMfSwKKyAgICB7TU5HX05VTEwsCisgICAgIE1OR19GSUVMRF9URVJNSU5BVE9SIHwgTU5HX0ZJRUxEX09QVElPTkFMLAorICAgICAwLCAwLCAxLCA3OSwKKyAgICAgb2Zmc2V0b2YobW5nX2ZyYW0sIHpOYW1lKSwgTU5HX05VTEwsIG9mZnNldG9mKG1uZ19mcmFtLCBpTmFtZXNpemUpfSwKKyAgICB7bW5nX2ZyYW1fcmVtYWluZGVyLAorICAgICBNTkdfRklFTERfT1BUSU9OQUwsCisgICAgIDAsIDAsIDAsIDAsCisgICAgIE1OR19OVUxMLCBNTkdfTlVMTCwgTU5HX05VTEx9CisgIH07CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX01PVkUKK01OR19MT0NBTCBtbmdfZmllbGRfZGVzY3JpcHRvciBtbmdfZmllbGRzX21vdmUgW10gPQorICB7CisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfSU5ULAorICAgICAwLCAweEZGRkYsIDIsIDIsCisgICAgIG9mZnNldG9mKG1uZ19tb3ZlLCBpRmlyc3RpZCksIE1OR19OVUxMLCBNTkdfTlVMTH0sCisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfSU5ULAorICAgICAwLCAweEZGRkYsIDIsIDIsCisgICAgIG9mZnNldG9mKG1uZ19tb3ZlLCBpTGFzdGlkKSwgTU5HX05VTEwsIE1OR19OVUxMfSwKKyAgICB7TU5HX05VTEwsCisgICAgIE1OR19GSUVMRF9JTlQsCisgICAgIDAsIDEsIDEsIDEsCisgICAgIG9mZnNldG9mKG1uZ19tb3ZlLCBpTW92ZXR5cGUpLCBNTkdfTlVMTCwgTU5HX05VTEx9LAorICAgIHtNTkdfTlVMTCwKKyAgICAgTU5HX0ZJRUxEX0lOVCwKKyAgICAgMCwgMCwgNCwgNCwKKyAgICAgb2Zmc2V0b2YobW5nX21vdmUsIGlNb3ZleCksIE1OR19OVUxMLCBNTkdfTlVMTH0sCisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfSU5ULAorICAgICAwLCAwLCA0LCA0LAorICAgICBvZmZzZXRvZihtbmdfbW92ZSwgaU1vdmV5KSwgTU5HX05VTEwsIE1OR19OVUxMfQorICB9OworI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19DTElQCitNTkdfTE9DQUwgbW5nX2ZpZWxkX2Rlc2NyaXB0b3IgbW5nX2ZpZWxkc19jbGlwIFtdID0KKyAgeworICAgIHtNTkdfTlVMTCwKKyAgICAgTU5HX0ZJRUxEX0lOVCwKKyAgICAgMCwgMHhGRkZGLCAyLCAyLAorICAgICBvZmZzZXRvZihtbmdfY2xpcCwgaUZpcnN0aWQpLCBNTkdfTlVMTCwgTU5HX05VTEx9LAorICAgIHtNTkdfTlVMTCwKKyAgICAgTU5HX0ZJRUxEX0lOVCwKKyAgICAgMCwgMHhGRkZGLCAyLCAyLAorICAgICBvZmZzZXRvZihtbmdfY2xpcCwgaUxhc3RpZCksIE1OR19OVUxMLCBNTkdfTlVMTH0sCisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfSU5ULAorICAgICAwLCAxLCAxLCAxLAorICAgICBvZmZzZXRvZihtbmdfY2xpcCwgaUNsaXB0eXBlKSwgTU5HX05VTEwsIE1OR19OVUxMfSwKKyAgICB7TU5HX05VTEwsCisgICAgIE1OR19GSUVMRF9JTlQsCisgICAgIDAsIDAsIDQsIDQsCisgICAgIG9mZnNldG9mKG1uZ19jbGlwLCBpQ2xpcGwpLCBNTkdfTlVMTCwgTU5HX05VTEx9LAorICAgIHtNTkdfTlVMTCwKKyAgICAgTU5HX0ZJRUxEX0lOVCwKKyAgICAgMCwgMCwgNCwgNCwKKyAgICAgb2Zmc2V0b2YobW5nX2NsaXAsIGlDbGlwciksIE1OR19OVUxMLCBNTkdfTlVMTH0sCisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfSU5ULAorICAgICAwLCAwLCA0LCA0LAorICAgICBvZmZzZXRvZihtbmdfY2xpcCwgaUNsaXB0KSwgTU5HX05VTEwsIE1OR19OVUxMfSwKKyAgICB7TU5HX05VTEwsCisgICAgIE1OR19GSUVMRF9JTlQsCisgICAgIDAsIDAsIDQsIDQsCisgICAgIG9mZnNldG9mKG1uZ19jbGlwLCBpQ2xpcGIpLCBNTkdfTlVMTCwgTU5HX05VTEx9CisgIH07CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX1NIT1cKK01OR19MT0NBTCBtbmdfZmllbGRfZGVzY3JpcHRvciBtbmdfZmllbGRzX3Nob3cgW10gPQorICB7CisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfSU5ULAorICAgICAxLCAweEZGRkYsIDIsIDIsCisgICAgIG9mZnNldG9mKG1uZ19zaG93LCBpRmlyc3RpZCksIE1OR19OVUxMLCBNTkdfTlVMTH0sCisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfSU5UIHwgTU5HX0ZJRUxEX09QVElPTkFMLAorICAgICAxLCAweEZGRkYsIDIsIDIsCisgICAgIG9mZnNldG9mKG1uZ19zaG93LCBpTGFzdGlkKSwgb2Zmc2V0b2YobW5nX3Nob3csIGJIYXNsYXN0aWQpLCBNTkdfTlVMTH0sCisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfSU5UIHwgTU5HX0ZJRUxEX09QVElPTkFMLAorICAgICAwLCA3LCAxLCAxLAorICAgICBvZmZzZXRvZihtbmdfc2hvdywgaU1vZGUpLCBNTkdfTlVMTCwgTU5HX05VTEx9CisgIH07CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX1RFUk0KK01OR19MT0NBTCBtbmdfZmllbGRfZGVzY3JpcHRvciBtbmdfZmllbGRzX3Rlcm0gW10gPQorICB7CisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfSU5ULAorICAgICAwLCAzLCAxLCAxLAorICAgICBvZmZzZXRvZihtbmdfdGVybSwgaVRlcm1hY3Rpb24pLCBNTkdfTlVMTCwgTU5HX05VTEx9LAorICAgIHtNTkdfTlVMTCwKKyAgICAgTU5HX0ZJRUxEX0lOVCB8IE1OR19GSUVMRF9PUFRJT05BTCB8IE1OR19GSUVMRF9HUk9VUDEsCisgICAgIDAsIDIsIDEsIDEsCisgICAgIG9mZnNldG9mKG1uZ190ZXJtLCBpSXRlcmFjdGlvbiksIE1OR19OVUxMLCBNTkdfTlVMTH0sCisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfSU5UIHwgTU5HX0ZJRUxEX09QVElPTkFMIHwgTU5HX0ZJRUxEX0dST1VQMSwKKyAgICAgMCwgMCwgNCwgNCwKKyAgICAgb2Zmc2V0b2YobW5nX3Rlcm0sIGlEZWxheSksIE1OR19OVUxMLCBNTkdfTlVMTH0sCisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfSU5UIHwgTU5HX0ZJRUxEX09QVElPTkFMIHwgTU5HX0ZJRUxEX0dST1VQMSwKKyAgICAgMCwgMCwgNCwgNCwKKyAgICAgb2Zmc2V0b2YobW5nX3Rlcm0sIGlJdGVybWF4KSwgTU5HX05VTEwsIE1OR19OVUxMfQorICB9OworI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19TQVZFCitNTkdfTE9DQUwgbW5nX2ZpZWxkX2Rlc2NyaXB0b3IgbW5nX2ZpZWxkc19zYXZlIFtdID0KKyAgeworICAgIHttbmdfc2F2ZV9lbnRyaWVzLAorICAgICBNTkdfTlVMTCwKKyAgICAgMCwgMCwgMCwgMCwKKyAgICAgTU5HX05VTEwsIE1OR19OVUxMLCBNTkdfTlVMTH0KKyAgfTsKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfU0VFSworTU5HX0xPQ0FMIG1uZ19maWVsZF9kZXNjcmlwdG9yIG1uZ19maWVsZHNfc2VlayBbXSA9CisgIHsKKyAgICB7TU5HX05VTEwsCisgICAgIE1OR19OVUxMLAorICAgICAwLCAwLCAxLCA3OSwKKyAgICAgb2Zmc2V0b2YobW5nX3NlZWssIHpOYW1lKSwgTU5HX05VTEwsIG9mZnNldG9mKG1uZ19zZWVrLCBpTmFtZXNpemUpfQorICB9OworI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19lWFBJCitNTkdfTE9DQUwgbW5nX2ZpZWxkX2Rlc2NyaXB0b3IgbW5nX2ZpZWxkc19leHBpIFtdID0KKyAgeworICAgIHtNTkdfTlVMTCwKKyAgICAgTU5HX0ZJRUxEX0lOVCwKKyAgICAgMCwgMHhGRkZGLCAyLCAyLAorICAgICBvZmZzZXRvZihtbmdfZXhwaSwgaVNuYXBzaG90aWQpLCBNTkdfTlVMTCwgTU5HX05VTEx9LAorICAgIHtNTkdfTlVMTCwKKyAgICAgTU5HX05VTEwsCisgICAgIDAsIDAsIDEsIDc5LAorICAgICBvZmZzZXRvZihtbmdfZXhwaSwgek5hbWUpLCBNTkdfTlVMTCwgb2Zmc2V0b2YobW5nX2V4cGksIGlOYW1lc2l6ZSl9CisgIH07CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX2ZQUkkKK01OR19MT0NBTCBtbmdfZmllbGRfZGVzY3JpcHRvciBtbmdfZmllbGRzX2ZwcmkgW10gPQorICB7CisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfSU5ULAorICAgICAwLCAxLCAxLCAxLAorICAgICBvZmZzZXRvZihtbmdfZnByaSwgaURlbHRhdHlwZSksIE1OR19OVUxMLCBNTkdfTlVMTH0sCisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfSU5ULAorICAgICAwLCAweEZGLCAxLCAxLAorICAgICBvZmZzZXRvZihtbmdfZnByaSwgaVByaW9yaXR5KSwgTU5HX05VTEwsIE1OR19OVUxMfQorICB9OworI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19uRUVECitNTkdfTE9DQUwgbW5nX2ZpZWxkX2Rlc2NyaXB0b3IgbW5nX2ZpZWxkc19uZWVkIFtdID0KKyAgeworICAgIHtNTkdfTlVMTCwKKyAgICAgTU5HX05VTEwsCisgICAgIDAsIDAsIDEsIDAsCisgICAgIG9mZnNldG9mKG1uZ19uZWVkLCB6S2V5d29yZHMpLCBNTkdfTlVMTCwgb2Zmc2V0b2YobW5nX25lZWQsIGlLZXl3b3Jkc3NpemUpfQorICB9OworI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19wSFlnCisjZGVmaW5lIG1uZ19maWVsZHNfcGh5ZyBtbmdfZmllbGRzX3BoeXMKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKK01OR19MT0NBTCBtbmdfZmllbGRfZGVzY3JpcHRvciBtbmdfZmllbGRzX2RoZHIgW10gPQorICB7CisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfSU5ULAorICAgICAwLCAweEZGRkYsIDIsIDIsCisgICAgIG9mZnNldG9mKG1uZ19kaGRyLCBpT2JqZWN0aWQpLCBNTkdfTlVMTCwgTU5HX05VTEx9LAorICAgIHtNTkdfTlVMTCwKKyAgICAgTU5HX0ZJRUxEX0lOVCwKKyAgICAgMCwgMiwgMSwgMSwKKyAgICAgb2Zmc2V0b2YobW5nX2RoZHIsIGlJbWFnZXR5cGUpLCBNTkdfTlVMTCwgTU5HX05VTEx9LAorICAgIHtNTkdfTlVMTCwKKyAgICAgTU5HX0ZJRUxEX0lOVCwKKyAgICAgMCwgNywgMSwgMSwKKyAgICAgb2Zmc2V0b2YobW5nX2RoZHIsIGlEZWx0YXR5cGUpLCBNTkdfTlVMTCwgTU5HX05VTEx9LAorICAgIHtNTkdfTlVMTCwKKyAgICAgTU5HX0ZJRUxEX0lOVCB8IE1OR19GSUVMRF9PUFRJT05BTCB8IE1OR19GSUVMRF9HUk9VUDEsCisgICAgIDAsIDAsIDQsIDQsCisgICAgIG9mZnNldG9mKG1uZ19kaGRyLCBpQmxvY2t3aWR0aCksIG9mZnNldG9mKG1uZ19kaGRyLCBiSGFzYmxvY2tzaXplKSwgTU5HX05VTEx9LAorICAgIHtNTkdfTlVMTCwKKyAgICAgTU5HX0ZJRUxEX0lOVCB8IE1OR19GSUVMRF9PUFRJT05BTCB8IE1OR19GSUVMRF9HUk9VUDEsCisgICAgIDAsIDAsIDQsIDQsCisgICAgIG9mZnNldG9mKG1uZ19kaGRyLCBpQmxvY2toZWlnaHQpLCBNTkdfTlVMTCwgTU5HX05VTEx9LAorICAgIHtNTkdfTlVMTCwKKyAgICAgTU5HX0ZJRUxEX0lOVCB8IE1OR19GSUVMRF9PUFRJT05BTCB8IE1OR19GSUVMRF9HUk9VUDIsCisgICAgIDAsIDAsIDQsIDQsCisgICAgIG9mZnNldG9mKG1uZ19kaGRyLCBpQmxvY2t4KSwgb2Zmc2V0b2YobW5nX2RoZHIsIGJIYXNibG9ja2xvYyksIE1OR19OVUxMfSwKKyAgICB7TU5HX05VTEwsCisgICAgIE1OR19GSUVMRF9JTlQgfCBNTkdfRklFTERfT1BUSU9OQUwgfCBNTkdfRklFTERfR1JPVVAyLAorICAgICAwLCAwLCA0LCA0LAorICAgICBvZmZzZXRvZihtbmdfZGhkciwgaUJsb2NreSksIE1OR19OVUxMLCBNTkdfTlVMTH0KKyAgfTsKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKK01OR19MT0NBTCBtbmdfZmllbGRfZGVzY3JpcHRvciBtbmdfZmllbGRzX3Byb20gW10gPQorICB7CisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfSU5ULAorICAgICAwLCAxNCwgMSwgMSwKKyAgICAgb2Zmc2V0b2YobW5nX3Byb20sIGlDb2xvcnR5cGUpLCBNTkdfTlVMTCwgTU5HX05VTEx9LAorICAgIHtNTkdfTlVMTCwKKyAgICAgTU5HX0ZJRUxEX0lOVCwKKyAgICAgMCwgMTYsIDEsIDEsCisgICAgIG9mZnNldG9mKG1uZ19wcm9tLCBpU2FtcGxlZGVwdGgpLCBNTkdfTlVMTCwgTU5HX05VTEx9LAorICAgIHtNTkdfTlVMTCwKKyAgICAgTU5HX0ZJRUxEX0lOVCwKKyAgICAgMCwgMSwgMSwgMSwKKyAgICAgb2Zmc2V0b2YobW5nX3Byb20sIGlGaWxsdHlwZSksIE1OR19OVUxMLCBNTkdfTlVMTH0KKyAgfTsKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKK01OR19MT0NBTCBtbmdfZmllbGRfZGVzY3JpcHRvciBtbmdfZmllbGRzX3BwbHQgW10gPQorICB7CisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfSU5ULAorICAgICAwLCA1LCAxLCAxLAorICAgICBvZmZzZXRvZihtbmdfcHBsdCwgaURlbHRhdHlwZSksIE1OR19OVUxMLCBNTkdfTlVMTH0sCisgICAge21uZ19wcGx0X2VudHJpZXMsCisgICAgIE1OR19OVUxMLAorICAgICAwLCAwLCAwLCAwLAorICAgICBNTkdfTlVMTCwgTU5HX05VTEwsIE1OR19OVUxMfQorICB9OworI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworTU5HX0xPQ0FMIG1uZ19maWVsZF9kZXNjcmlwdG9yIG1uZ19maWVsZHNfZHJvcCBbXSA9CisgIHsKKyAgICB7bW5nX2Ryb3BfZW50cmllcywKKyAgICAgTU5HX05VTEwsCisgICAgIDAsIDAsIDAsIDAsCisgICAgIE1OR19OVUxMLCBNTkdfTlVMTCwgTU5HX05VTEx9CisgIH07CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfREJZSworTU5HX0xPQ0FMIG1uZ19maWVsZF9kZXNjcmlwdG9yIG1uZ19maWVsZHNfZGJ5ayBbXSA9CisgIHsKKyAgICB7TU5HX05VTEwsCisgICAgIE1OR19GSUVMRF9JTlQsCisgICAgIDAsIDAsIDQsIDQsCisgICAgIG9mZnNldG9mKG1uZ19kYnlrLCBpQ2h1bmtuYW1lKSwgTU5HX05VTEwsIE1OR19OVUxMfSwKKyAgICB7TU5HX05VTEwsCisgICAgIE1OR19GSUVMRF9JTlQsCisgICAgIDAsIDEsIDEsIDEsCisgICAgIG9mZnNldG9mKG1uZ19kYnlrLCBpUG9sYXJpdHkpLCBNTkdfTlVMTCwgTU5HX05VTEx9LAorICAgIHtNTkdfTlVMTCwKKyAgICAgTU5HX05VTEwsCisgICAgIDAsIDAsIDEsIDAsCisgICAgIG9mZnNldG9mKG1uZ19kYnlrLCB6S2V5d29yZHMpLCBNTkdfTlVMTCwgb2Zmc2V0b2YobW5nX2RieWssIGlLZXl3b3Jkc3NpemUpfQorICB9OworI2VuZGlmCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfT1JEUgorTU5HX0xPQ0FMIG1uZ19maWVsZF9kZXNjcmlwdG9yIG1uZ19maWVsZHNfb3JkciBbXSA9CisgIHsKKyAgICB7bW5nX2Ryb3BfZW50cmllcywKKyAgICAgTU5HX05VTEwsCisgICAgIDAsIDAsIDAsIDAsCisgICAgIE1OR19OVUxMLCBNTkdfTlVMTCwgTU5HX05VTEx9CisgIH07CisjZW5kaWYKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfTUFHTgorTU5HX0xPQ0FMIG1uZ19maWVsZF9kZXNjcmlwdG9yIG1uZ19maWVsZHNfbWFnbiBbXSA9CisgIHsKKyAgICB7bW5nX2RlYnVua19tYWduLAorICAgICBNTkdfTlVMTCwKKyAgICAgMCwgMCwgMCwgMCwKKyAgICAgTU5HX05VTEwsIE1OR19OVUxMLCBNTkdfTlVMTH0KKyAgfTsKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX0lOQ0xVREVfTVBOR19QUk9QT1NBTAorTU5HX0xPQ0FMIG1uZ19maWVsZF9kZXNjcmlwdG9yIG1uZ19maWVsZHNfbXBuZyBbXSA9CisgIHsKKyAgICB7TU5HX05VTEwsCisgICAgIE1OR19GSUVMRF9JTlQsCisgICAgIDEsIDAsIDQsIDQsCisgICAgIG9mZnNldG9mKG1uZ19tcG5nLCBpRnJhbWV3aWR0aCksIE1OR19OVUxMLCBNTkdfTlVMTH0sCisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfSU5ULAorICAgICAxLCAwLCA0LCA0LAorICAgICBvZmZzZXRvZihtbmdfbXBuZywgaUZyYW1laGVpZ2h0KSwgTU5HX05VTEwsIE1OR19OVUxMfSwKKyAgICB7TU5HX05VTEwsCisgICAgIE1OR19GSUVMRF9JTlQsCisgICAgIDAsIDB4RkZGRiwgMiwgMiwKKyAgICAgb2Zmc2V0b2YobW5nX21wbmcsIGlOdW1wbGF5cyksIE1OR19OVUxMLCBNTkdfTlVMTH0sCisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfSU5ULAorICAgICAxLCAweEZGRkYsIDIsIDIsCisgICAgIG9mZnNldG9mKG1uZ19tcG5nLCBpVGlja3NwZXJzZWMpLCBNTkdfTlVMTCwgTU5HX05VTEx9LAorICAgIHtNTkdfTlVMTCwKKyAgICAgTU5HX0ZJRUxEX0lOVCwKKyAgICAgMCwgMCwgMSwgMSwKKyAgICAgb2Zmc2V0b2YobW5nX21wbmcsIGlDb21wcmVzc2lvbm1ldGhvZCksIE1OR19OVUxMLCBNTkdfTlVMTH0sCisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfREVGTEFURUQsCisgICAgIDAsIDAsIDEsIDAsCisgICAgIG9mZnNldG9mKG1uZ19tcG5nLCBwRnJhbWVzKSwgTU5HX05VTEwsIG9mZnNldG9mKG1uZ19tcG5nLCBpRnJhbWVzc2l6ZSl9CisgIH07CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19JTkNMVURFX0FOR19QUk9QT1NBTAorTU5HX0xPQ0FMIG1uZ19maWVsZF9kZXNjcmlwdG9yIG1uZ19maWVsZHNfYWhkciBbXSA9CisgIHsKKyAgICB7TU5HX05VTEwsCisgICAgIE1OR19GSUVMRF9JTlQsCisgICAgIDEsIDAsIDQsIDQsCisgICAgIG9mZnNldG9mKG1uZ19haGRyLCBpTnVtZnJhbWVzKSwgTU5HX05VTEwsIE1OR19OVUxMfSwKKyAgICB7TU5HX05VTEwsCisgICAgIE1OR19GSUVMRF9JTlQsCisgICAgIDAsIDAsIDQsIDQsCisgICAgIG9mZnNldG9mKG1uZ19haGRyLCBpVGlja3NwZXJzZWMpLCBNTkdfTlVMTCwgTU5HX05VTEx9LAorICAgIHtNTkdfTlVMTCwKKyAgICAgTU5HX0ZJRUxEX0lOVCwKKyAgICAgMCwgMCwgNCwgNCwKKyAgICAgb2Zmc2V0b2YobW5nX2FoZHIsIGlOdW1wbGF5cyksIE1OR19OVUxMLCBNTkdfTlVMTH0sCisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfSU5ULAorICAgICAxLCAwLCA0LCA0LAorICAgICBvZmZzZXRvZihtbmdfYWhkciwgaVRpbGV3aWR0aCksIE1OR19OVUxMLCBNTkdfTlVMTH0sCisgICAge01OR19OVUxMLAorICAgICBNTkdfRklFTERfSU5ULAorICAgICAxLCAwLCA0LCA0LAorICAgICBvZmZzZXRvZihtbmdfYWhkciwgaVRpbGVoZWlnaHQpLCBNTkdfTlVMTCwgTU5HX05VTEx9LAorICAgIHtNTkdfTlVMTCwKKyAgICAgTU5HX0ZJRUxEX0lOVCwKKyAgICAgMCwgMSwgMSwgMSwKKyAgICAgb2Zmc2V0b2YobW5nX2FoZHIsIGlJbnRlcmxhY2UpLCBNTkdfTlVMTCwgTU5HX05VTEx9LAorICAgIHtNTkdfTlVMTCwKKyAgICAgTU5HX0ZJRUxEX0lOVCwKKyAgICAgMCwgMSwgMSwgMSwKKyAgICAgb2Zmc2V0b2YobW5nX2FoZHIsIGlTdGlsbHVzZWQpLCBNTkdfTlVMTCwgTU5HX05VTEx9CisgIH07CisKK01OR19MT0NBTCBtbmdfZmllbGRfZGVzY3JpcHRvciBtbmdfZmllbGRzX2FkYXQgW10gPQorICB7CisgICAge21uZ19hZGF0X3RpbGVzLAorICAgICBNTkdfTlVMTCwKKyAgICAgMCwgMCwgMCwgMCwKKyAgICAgTU5HX05VTEwsIE1OR19OVUxMLCBNTkdfTlVMTH0KKyAgfTsKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfZXZOVAorTU5HX0xPQ0FMIG1uZ19maWVsZF9kZXNjcmlwdG9yIG1uZ19maWVsZHNfZXZudCBbXSA9CisgIHsKKyAgICB7bW5nX2V2bnRfZW50cmllcywKKyAgICAgTU5HX05VTEwsCisgICAgIDAsIDAsIDAsIDAsCisgICAgIE1OR19OVUxMLCBNTkdfTlVMTCwgTU5HX05VTEx9CisgIH07CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworTU5HX0xPQ0FMIG1uZ19maWVsZF9kZXNjcmlwdG9yIG1uZ19maWVsZHNfdW5rbm93biBbXSA9CisgIHsKKyAgICB7TU5HX05VTEwsCisgICAgIE1OR19OVUxMLAorICAgICAwLCAwLCAxLCAwLAorICAgICBvZmZzZXRvZihtbmdfdW5rbm93bl9jaHVuaywgcERhdGEpLCBNTkdfTlVMTCwgb2Zmc2V0b2YobW5nX3Vua25vd25fY2h1bmssIGlEYXRhc2l6ZSl9CisgIH07CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogUE5HIGNodW5rcyAqLworCitNTkdfTE9DQUwgbW5nX2NodW5rX2Rlc2NyaXB0b3IgbW5nX2NodW5rX2Rlc2NyX2loZHIgPQorICAgIHttbmdfaXRfcG5nLCBtbmdfY3JlYXRlX25vbmUsIDAsIDAsCisgICAgIE1OR19OVUxMLCBNTkdfTlVMTCwgbW5nX3NwZWNpYWxfaWhkciwKKyAgICAgbW5nX2ZpZWxkc19paGRyLCAoc2l6ZW9mKG1uZ19maWVsZHNfaWhkcikgLyBzaXplb2YobW5nX2ZpZWxkX2Rlc2NyaXB0b3IpKSwKKyAgICAgTU5HX0RFU0NSX0dMT0JBTCwKKyAgICAgTU5HX05VTEwsCisgICAgIE1OR19ERVNDUl9OT0lIRFIgfCBNTkdfREVTQ1JfTk9KSERSIHwgTU5HX0RFU0NSX05PQkFTSSB8IE1OR19ERVNDUl9OT0lEQVQgfCBNTkdfREVTQ1JfTk9QTFRFfTsKKworTU5HX0xPQ0FMIG1uZ19jaHVua19kZXNjcmlwdG9yIG1uZ19jaHVua19kZXNjcl9wbHRlID0KKyAgICB7bW5nX2l0X3BuZywgbW5nX2NyZWF0ZV9ub25lLCAwLCBvZmZzZXRvZihtbmdfcGx0ZSwgYkVtcHR5KSwKKyAgICAgTU5HX05VTEwsIE1OR19OVUxMLCBtbmdfc3BlY2lhbF9wbHRlLAorICAgICBtbmdfZmllbGRzX3BsdGUsIChzaXplb2YobW5nX2ZpZWxkc19wbHRlKSAvIHNpemVvZihtbmdfZmllbGRfZGVzY3JpcHRvcikpLAorICAgICBNTkdfREVTQ1JfR0xPQkFMIHwgTU5HX0RFU0NSX0VNUFRZRU1CRUQsCisgICAgIE1OR19ERVNDUl9HZW5IRFIsCisgICAgIE1OR19ERVNDUl9OT0lEQVQgfCBNTkdfREVTQ1JfTk9KREFUIHwgTU5HX0RFU0NSX05PSkRBQX07CisKK01OR19MT0NBTCBtbmdfY2h1bmtfZGVzY3JpcHRvciBtbmdfY2h1bmtfZGVzY3JfaWRhdCA9CisgICAge21uZ19pdF9wbmcsIG1uZ19jcmVhdGVfbm9uZSwgMCwgb2Zmc2V0b2YobW5nX2lkYXQsIGJFbXB0eSksCisgICAgIE1OR19OVUxMLCBNTkdfTlVMTCwgbW5nX3NwZWNpYWxfaWRhdCwKKyAgICAgbW5nX2ZpZWxkc19pZGF0LCAoc2l6ZW9mKG1uZ19maWVsZHNfaWRhdCkgLyBzaXplb2YobW5nX2ZpZWxkX2Rlc2NyaXB0b3IpKSwKKyAgICAgTU5HX0RFU0NSX0VNUFRZRU1CRUQsCisgICAgIE1OR19ERVNDUl9HZW5IRFIsCisgICAgIE1OR19ERVNDUl9OT0pTRVB9OworCitNTkdfTE9DQUwgbW5nX2NodW5rX2Rlc2NyaXB0b3IgbW5nX2NodW5rX2Rlc2NyX2llbmQgPQorICAgIHttbmdfaXRfcG5nLCBtbmdfY3JlYXRlX25vbmUsIDAsIDAsCisgICAgIE1OR19OVUxMLCBNTkdfTlVMTCwgbW5nX3NwZWNpYWxfaWVuZCwKKyAgICAgTU5HX05VTEwsIDAsCisgICAgIE1OR19ERVNDUl9FTVBUWSB8IE1OR19ERVNDUl9FTVBUWUVNQkVELAorICAgICBNTkdfREVTQ1JfR2VuSERSLAorICAgICBNTkdfTlVMTH07CisKK01OR19MT0NBTCBtbmdfY2h1bmtfZGVzY3JpcHRvciBtbmdfY2h1bmtfZGVzY3JfdHJucyA9CisgICAge21uZ19pdF9wbmcsIG1uZ19jcmVhdGVfbm9uZSwgMCwgb2Zmc2V0b2YobW5nX3RybnMsIGJFbXB0eSksCisgICAgIE1OR19OVUxMLCBNTkdfTlVMTCwgbW5nX3NwZWNpYWxfdHJucywKKyAgICAgbW5nX2ZpZWxkc190cm5zLCAoc2l6ZW9mKG1uZ19maWVsZHNfdHJucykgLyBzaXplb2YobW5nX2ZpZWxkX2Rlc2NyaXB0b3IpKSwKKyAgICAgTU5HX0RFU0NSX0dMT0JBTCB8IE1OR19ERVNDUl9FTVBUWUVNQkVELAorICAgICBNTkdfREVTQ1JfR2VuSERSLAorICAgICBNTkdfREVTQ1JfTk9JREFUIHwgTU5HX0RFU0NSX05PSkRBVCB8IE1OR19ERVNDUl9OT0pEQUF9OworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfZ0FNQQorTU5HX0xPQ0FMIG1uZ19jaHVua19kZXNjcmlwdG9yIG1uZ19jaHVua19kZXNjcl9nYW1hID0KKyAgICB7bW5nX2l0X3BuZywgbW5nX2NyZWF0ZV9ub25lLCAwLCBvZmZzZXRvZihtbmdfZ2FtYSwgYkVtcHR5KSwKKyAgICAgTU5HX05VTEwsIE1OR19OVUxMLCBtbmdfc3BlY2lhbF9nYW1hLAorICAgICBtbmdfZmllbGRzX2dhbWEsIChzaXplb2YobW5nX2ZpZWxkc19nYW1hKSAvIHNpemVvZihtbmdfZmllbGRfZGVzY3JpcHRvcikpLAorICAgICBNTkdfREVTQ1JfR0xPQkFMIHwgTU5HX0RFU0NSX0VNUFRZRU1CRUQgfCBNTkdfREVTQ1JfRU1QVFlHTE9CQUwsCisgICAgIE1OR19ERVNDUl9HZW5IRFIsCisgICAgIE1OR19ERVNDUl9OT1BMVEUgfCBNTkdfREVTQ1JfTk9JREFUIHwgTU5HX0RFU0NSX05PSkRBVCB8IE1OR19ERVNDUl9OT0pEQUF9OworI2VuZGlmCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19jSFJNCitNTkdfTE9DQUwgbW5nX2NodW5rX2Rlc2NyaXB0b3IgbW5nX2NodW5rX2Rlc2NyX2Nocm0gPQorICAgIHttbmdfaXRfcG5nLCBtbmdfY3JlYXRlX25vbmUsIDAsIG9mZnNldG9mKG1uZ19jaHJtLCBiRW1wdHkpLAorICAgICBNTkdfTlVMTCwgTU5HX05VTEwsIG1uZ19zcGVjaWFsX2Nocm0sCisgICAgIG1uZ19maWVsZHNfY2hybSwgKHNpemVvZihtbmdfZmllbGRzX2Nocm0pIC8gc2l6ZW9mKG1uZ19maWVsZF9kZXNjcmlwdG9yKSksCisgICAgIE1OR19ERVNDUl9HTE9CQUwgfCBNTkdfREVTQ1JfRU1QVFlFTUJFRCB8IE1OR19ERVNDUl9FTVBUWUdMT0JBTCwKKyAgICAgTU5HX0RFU0NSX0dlbkhEUiwKKyAgICAgTU5HX0RFU0NSX05PUExURSB8IE1OR19ERVNDUl9OT0lEQVQgfCBNTkdfREVTQ1JfTk9KREFUIHwgTU5HX0RFU0NSX05PSkRBQX07CisjZW5kaWYKKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX3NSR0IKK01OR19MT0NBTCBtbmdfY2h1bmtfZGVzY3JpcHRvciBtbmdfY2h1bmtfZGVzY3Jfc3JnYiA9CisgICAge21uZ19pdF9wbmcsIG1uZ19jcmVhdGVfbm9uZSwgMCwgb2Zmc2V0b2YobW5nX3NyZ2IsIGJFbXB0eSksCisgICAgIE1OR19OVUxMLCBNTkdfTlVMTCwgbW5nX3NwZWNpYWxfc3JnYiwKKyAgICAgbW5nX2ZpZWxkc19zcmdiLCAoc2l6ZW9mKG1uZ19maWVsZHNfc3JnYikgLyBzaXplb2YobW5nX2ZpZWxkX2Rlc2NyaXB0b3IpKSwKKyAgICAgTU5HX0RFU0NSX0dMT0JBTCB8IE1OR19ERVNDUl9FTVBUWUVNQkVEIHwgTU5HX0RFU0NSX0VNUFRZR0xPQkFMLAorICAgICBNTkdfREVTQ1JfR2VuSERSLAorICAgICBNTkdfREVTQ1JfTk9QTFRFIHwgTU5HX0RFU0NSX05PSURBVCB8IE1OR19ERVNDUl9OT0pEQVQgfCBNTkdfREVTQ1JfTk9KREFBfTsKKyNlbmRpZgorCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfaUNDUAorTU5HX0xPQ0FMIG1uZ19jaHVua19kZXNjcmlwdG9yIG1uZ19jaHVua19kZXNjcl9pY2NwID0KKyAgICB7bW5nX2l0X3BuZywgbW5nX2NyZWF0ZV9ub25lLCAwLCBvZmZzZXRvZihtbmdfaWNjcCwgYkVtcHR5KSwKKyAgICAgTU5HX05VTEwsIE1OR19OVUxMLCBtbmdfc3BlY2lhbF9pY2NwLAorICAgICBtbmdfZmllbGRzX2ljY3AsIChzaXplb2YobW5nX2ZpZWxkc19pY2NwKSAvIHNpemVvZihtbmdfZmllbGRfZGVzY3JpcHRvcikpLAorICAgICBNTkdfREVTQ1JfR0xPQkFMIHwgTU5HX0RFU0NSX0VNUFRZRU1CRUQgfCBNTkdfREVTQ1JfRU1QVFlHTE9CQUwsCisgICAgIE1OR19ERVNDUl9HZW5IRFIsCisgICAgIE1OR19ERVNDUl9OT1BMVEUgfCBNTkdfREVTQ1JfTk9JREFUIHwgTU5HX0RFU0NSX05PSkRBVCB8IE1OR19ERVNDUl9OT0pEQUF9OworI2VuZGlmCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS190RVh0CitNTkdfTE9DQUwgbW5nX2NodW5rX2Rlc2NyaXB0b3IgbW5nX2NodW5rX2Rlc2NyX3RleHQgPQorICAgIHttbmdfaXRfcG5nLCBtbmdfY3JlYXRlX25vbmUsIDAsIDAsCisgICAgIE1OR19OVUxMLCBNTkdfTlVMTCwgbW5nX3NwZWNpYWxfdGV4dCwKKyAgICAgbW5nX2ZpZWxkc190ZXh0LCAoc2l6ZW9mKG1uZ19maWVsZHNfdGV4dCkgLyBzaXplb2YobW5nX2ZpZWxkX2Rlc2NyaXB0b3IpKSwKKyAgICAgTU5HX0RFU0NSX0dMT0JBTCwKKyAgICAgTU5HX0RFU0NSX0dlbkhEUiwKKyAgICAgTU5HX05VTEx9OworI2VuZGlmCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS196VFh0CitNTkdfTE9DQUwgbW5nX2NodW5rX2Rlc2NyaXB0b3IgbW5nX2NodW5rX2Rlc2NyX3p0eHQgPQorICAgIHttbmdfaXRfcG5nLCBtbmdfY3JlYXRlX25vbmUsIDAsIDAsCisgICAgIE1OR19OVUxMLCBNTkdfTlVMTCwgbW5nX3NwZWNpYWxfenR4dCwKKyAgICAgbW5nX2ZpZWxkc196dHh0LCAoc2l6ZW9mKG1uZ19maWVsZHNfenR4dCkgLyBzaXplb2YobW5nX2ZpZWxkX2Rlc2NyaXB0b3IpKSwKKyAgICAgTU5HX0RFU0NSX0dMT0JBTCwKKyAgICAgTU5HX0RFU0NSX0dlbkhEUiwKKyAgICAgTU5HX05VTEx9OworI2VuZGlmCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19pVFh0CitNTkdfTE9DQUwgbW5nX2NodW5rX2Rlc2NyaXB0b3IgbW5nX2NodW5rX2Rlc2NyX2l0eHQgPQorICAgIHttbmdfaXRfcG5nLCBtbmdfY3JlYXRlX25vbmUsIDAsIDAsCisgICAgIE1OR19OVUxMLCBNTkdfTlVMTCwgbW5nX3NwZWNpYWxfaXR4dCwKKyAgICAgbW5nX2ZpZWxkc19pdHh0LCAoc2l6ZW9mKG1uZ19maWVsZHNfaXR4dCkgLyBzaXplb2YobW5nX2ZpZWxkX2Rlc2NyaXB0b3IpKSwKKyAgICAgTU5HX0RFU0NSX0dMT0JBTCwKKyAgICAgTU5HX0RFU0NSX0dlbkhEUiwKKyAgICAgTU5HX05VTEx9OworI2VuZGlmCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19iS0dECitNTkdfTE9DQUwgbW5nX2NodW5rX2Rlc2NyaXB0b3IgbW5nX2NodW5rX2Rlc2NyX2JrZ2QgPQorICAgIHttbmdfaXRfcG5nLCBtbmdfY3JlYXRlX25vbmUsIDAsIG9mZnNldG9mKG1uZ19ia2dkLCBiRW1wdHkpLAorICAgICBNTkdfTlVMTCwgTU5HX05VTEwsIG1uZ19zcGVjaWFsX2JrZ2QsCisgICAgIG1uZ19maWVsZHNfYmtnZCwgKHNpemVvZihtbmdfZmllbGRzX2JrZ2QpIC8gc2l6ZW9mKG1uZ19maWVsZF9kZXNjcmlwdG9yKSksCisgICAgIE1OR19ERVNDUl9HTE9CQUwgfCBNTkdfREVTQ1JfRU1QVFlFTUJFRCB8IE1OR19ERVNDUl9FTVBUWUdMT0JBTCwKKyAgICAgTU5HX0RFU0NSX0dlbkhEUiwKKyAgICAgTU5HX0RFU0NSX05PSURBVCB8IE1OR19ERVNDUl9OT0pEQVQgfCBNTkdfREVTQ1JfTk9KREFBfTsKKyNlbmRpZgorCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfcEhZcworTU5HX0xPQ0FMIG1uZ19jaHVua19kZXNjcmlwdG9yIG1uZ19jaHVua19kZXNjcl9waHlzID0KKyAgICB7bW5nX2l0X3BuZywgbW5nX2NyZWF0ZV9ub25lLCAwLCBvZmZzZXRvZihtbmdfcGh5cywgYkVtcHR5KSwKKyAgICAgTU5HX05VTEwsIE1OR19OVUxMLCBtbmdfc3BlY2lhbF9waHlzLAorICAgICBtbmdfZmllbGRzX3BoeXMsIChzaXplb2YobW5nX2ZpZWxkc19waHlzKSAvIHNpemVvZihtbmdfZmllbGRfZGVzY3JpcHRvcikpLAorICAgICBNTkdfREVTQ1JfR0xPQkFMIHwgTU5HX0RFU0NSX0VNUFRZRU1CRUQgfCBNTkdfREVTQ1JfRU1QVFlHTE9CQUwsCisgICAgIE1OR19ERVNDUl9HZW5IRFIsCisgICAgIE1OR19ERVNDUl9OT0lEQVQgfCBNTkdfREVTQ1JfTk9KREFUIHwgTU5HX0RFU0NSX05PSkRBQX07CisjZW5kaWYKKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX3NCSVQKK01OR19MT0NBTCBtbmdfY2h1bmtfZGVzY3JpcHRvciBtbmdfY2h1bmtfZGVzY3Jfc2JpdCA9CisgICAge21uZ19pdF9wbmcsIG1uZ19jcmVhdGVfbm9uZSwgMCwgb2Zmc2V0b2YobW5nX3NiaXQsIGJFbXB0eSksCisgICAgIE1OR19OVUxMLCBNTkdfTlVMTCwgbW5nX3NwZWNpYWxfc2JpdCwKKyAgICAgbW5nX2ZpZWxkc19zYml0LCAoc2l6ZW9mKG1uZ19maWVsZHNfc2JpdCkgLyBzaXplb2YobW5nX2ZpZWxkX2Rlc2NyaXB0b3IpKSwKKyAgICAgTU5HX0RFU0NSX0dMT0JBTCB8IE1OR19ERVNDUl9FTVBUWUVNQkVEIHwgTU5HX0RFU0NSX0VNUFRZR0xPQkFMLAorICAgICBNTkdfREVTQ1JfR2VuSERSLAorICAgICBNTkdfREVTQ1JfTk9JREFUIHwgTU5HX0RFU0NSX05PSkRBVCB8IE1OR19ERVNDUl9OT0pEQUF9OworI2VuZGlmCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19zUExUCitNTkdfTE9DQUwgbW5nX2NodW5rX2Rlc2NyaXB0b3IgbW5nX2NodW5rX2Rlc2NyX3NwbHQgPQorICAgIHttbmdfaXRfcG5nLCBtbmdfY3JlYXRlX25vbmUsIDAsIG9mZnNldG9mKG1uZ19zcGx0LCBiRW1wdHkpLAorICAgICBNTkdfTlVMTCwgTU5HX05VTEwsIG1uZ19zcGVjaWFsX3NwbHQsCisgICAgIG1uZ19maWVsZHNfc3BsdCwgKHNpemVvZihtbmdfZmllbGRzX3NwbHQpIC8gc2l6ZW9mKG1uZ19maWVsZF9kZXNjcmlwdG9yKSksCisgICAgIE1OR19ERVNDUl9HTE9CQUwgfCBNTkdfREVTQ1JfRU1QVFlFTUJFRCB8IE1OR19ERVNDUl9FTVBUWUdMT0JBTCwKKyAgICAgTU5HX0RFU0NSX0dlbkhEUiwKKyAgICAgTU5HX0RFU0NSX05PSURBVCB8IE1OR19ERVNDUl9OT0pEQVQgfCBNTkdfREVTQ1JfTk9KREFBfTsKKyNlbmRpZgorCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfaElTVAorTU5HX0xPQ0FMIG1uZ19jaHVua19kZXNjcmlwdG9yIG1uZ19jaHVua19kZXNjcl9oaXN0ID0KKyAgICB7bW5nX2l0X3BuZywgbW5nX2NyZWF0ZV9ub25lLCAwLCAwLAorICAgICBNTkdfTlVMTCwgTU5HX05VTEwsIG1uZ19zcGVjaWFsX2hpc3QsCisgICAgIG1uZ19maWVsZHNfaGlzdCwgKHNpemVvZihtbmdfZmllbGRzX2hpc3QpIC8gc2l6ZW9mKG1uZ19maWVsZF9kZXNjcmlwdG9yKSksCisgICAgIE1OR19OVUxMLAorICAgICBNTkdfREVTQ1JfR2VuSERSIHwgTU5HX0RFU0NSX1BMVEUsCisgICAgIE1OR19ERVNDUl9OT0lEQVQgfCBNTkdfREVTQ1JfTk9KREFUIHwgTU5HX0RFU0NSX05PSkRBQX07CisjZW5kaWYKKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX3RJTUUKK01OR19MT0NBTCBtbmdfY2h1bmtfZGVzY3JpcHRvciBtbmdfY2h1bmtfZGVzY3JfdGltZSA9CisgICAge21uZ19pdF9wbmcsIG1uZ19jcmVhdGVfbm9uZSwgMCwgMCwKKyAgICAgTU5HX05VTEwsIE1OR19OVUxMLCBtbmdfc3BlY2lhbF90aW1lLAorICAgICBtbmdfZmllbGRzX3RpbWUsIChzaXplb2YobW5nX2ZpZWxkc190aW1lKSAvIHNpemVvZihtbmdfZmllbGRfZGVzY3JpcHRvcikpLAorICAgICBNTkdfREVTQ1JfR0xPQkFMLAorICAgICBNTkdfREVTQ1JfR2VuSERSLAorICAgICBNTkdfTlVMTH07CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qIEpORyBjaHVua3MgKi8KKworI2lmZGVmIE1OR19JTkNMVURFX0pORworTU5HX0xPQ0FMIG1uZ19jaHVua19kZXNjcmlwdG9yIG1uZ19jaHVua19kZXNjcl9qaGRyID0KKyAgICB7bW5nX2l0X2puZywgbW5nX2NyZWF0ZV9ub25lLCAwLCAwLAorICAgICBNTkdfTlVMTCwgTU5HX05VTEwsIG1uZ19zcGVjaWFsX2poZHIsCisgICAgIG1uZ19maWVsZHNfamhkciwgKHNpemVvZihtbmdfZmllbGRzX2poZHIpIC8gc2l6ZW9mKG1uZ19maWVsZF9kZXNjcmlwdG9yKSksCisgICAgIE1OR19OVUxMLAorICAgICBNTkdfTlVMTCwKKyAgICAgTU5HX0RFU0NSX05PSUhEUiB8IE1OR19ERVNDUl9OT0JBU0kgfCBNTkdfREVTQ1JfTk9ESERSIHwgTU5HX0RFU0NSX05PSkhEUn07CisjZW5kaWYKKworI2lmZGVmIE1OR19JTkNMVURFX0pORworTU5HX0xPQ0FMIG1uZ19jaHVua19kZXNjcmlwdG9yIG1uZ19jaHVua19kZXNjcl9qZGFhID0KKyAgICB7bW5nX2l0X2puZywgbW5nX2NyZWF0ZV9ub25lLCAwLCAwLAorICAgICBNTkdfTlVMTCwgTU5HX05VTEwsIG1uZ19zcGVjaWFsX2pkYWEsCisgICAgIG1uZ19maWVsZHNfamRhYSwgKHNpemVvZihtbmdfZmllbGRzX2pkYWEpIC8gc2l6ZW9mKG1uZ19maWVsZF9kZXNjcmlwdG9yKSksCisgICAgIE1OR19OVUxMLAorICAgICBNTkdfREVTQ1JfSm5nSERSLAorICAgICBNTkdfREVTQ1JfTk9KU0VQfTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCitNTkdfTE9DQUwgbW5nX2NodW5rX2Rlc2NyaXB0b3IgbW5nX2NodW5rX2Rlc2NyX2pkYXQgPQorICAgIHttbmdfaXRfam5nLCBtbmdfY3JlYXRlX25vbmUsIDAsIDAsCisgICAgIE1OR19OVUxMLCBNTkdfTlVMTCwgbW5nX3NwZWNpYWxfamRhdCwKKyAgICAgbW5nX2ZpZWxkc19qZGF0LCAoc2l6ZW9mKG1uZ19maWVsZHNfamRhdCkgLyBzaXplb2YobW5nX2ZpZWxkX2Rlc2NyaXB0b3IpKSwKKyAgICAgTU5HX0RFU0NSX0VNUFRZRU1CRUQsCisgICAgIE1OR19ERVNDUl9KbmdIRFIsCisgICAgIE1OR19OVUxMfTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCitNTkdfTE9DQUwgbW5nX2NodW5rX2Rlc2NyaXB0b3IgbW5nX2NodW5rX2Rlc2NyX2pzZXAgPQorICAgIHttbmdfaXRfam5nLCBtbmdfY3JlYXRlX25vbmUsIDAsIDAsCisgICAgIE1OR19OVUxMLCBNTkdfTlVMTCwgbW5nX3NwZWNpYWxfanNlcCwKKyAgICAgTU5HX05VTEwsIDAsCisgICAgIE1OR19ERVNDUl9FTVBUWSB8IE1OR19ERVNDUl9FTVBUWUVNQkVELAorICAgICBNTkdfREVTQ1JfSm5nSERSLAorICAgICBNTkdfREVTQ1JfTk9KU0VQfTsKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogTU5HIGNodW5rcyAqLworCitNTkdfTE9DQUwgbW5nX2NodW5rX2Rlc2NyaXB0b3IgbW5nX2NodW5rX2Rlc2NyX21oZHIgPQorICAgIHttbmdfaXRfbW5nLCBtbmdfY3JlYXRlX25vbmUsIDAsIDAsCisgICAgIE1OR19OVUxMLCBNTkdfTlVMTCwgbW5nX3NwZWNpYWxfbWhkciwKKyAgICAgbW5nX2ZpZWxkc19taGRyLCAoc2l6ZW9mKG1uZ19maWVsZHNfbWhkcikgLyBzaXplb2YobW5nX2ZpZWxkX2Rlc2NyaXB0b3IpKSwKKyAgICAgTU5HX05VTEwsCisgICAgIE1OR19OVUxMLAorICAgICBNTkdfREVTQ1JfTk9NSERSIHwgTU5HX0RFU0NSX05PSUhEUiB8IE1OR19ERVNDUl9OT0pIRFJ9OworCitNTkdfTE9DQUwgbW5nX2NodW5rX2Rlc2NyaXB0b3IgbW5nX2NodW5rX2Rlc2NyX21lbmQgPQorICAgIHttbmdfaXRfbW5nLCBtbmdfY3JlYXRlX25vbmUsIDAsIDAsCisgICAgIE1OR19OVUxMLCBNTkdfTlVMTCwgbW5nX3NwZWNpYWxfbWVuZCwKKyAgICAgTU5HX05VTEwsIDAsCisgICAgIE1OR19ERVNDUl9FTVBUWSB8IE1OR19ERVNDUl9FTVBUWUdMT0JBTCwKKyAgICAgTU5HX0RFU0NSX01IRFIsCisgICAgIE1OR19OVUxMfTsKKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX0xPT1AKK01OR19MT0NBTCBtbmdfY2h1bmtfZGVzY3JpcHRvciBtbmdfY2h1bmtfZGVzY3JfbG9vcCA9CisgICAge21uZ19pdF9tbmcsIG1uZ19jcmVhdGVfbm9uZSwgMCwgMCwKKyAgICAgTU5HX05VTEwsIE1OR19OVUxMLCBtbmdfc3BlY2lhbF9sb29wLAorICAgICBtbmdfZmllbGRzX2xvb3AsIChzaXplb2YobW5nX2ZpZWxkc19sb29wKSAvIHNpemVvZihtbmdfZmllbGRfZGVzY3JpcHRvcikpLAorICAgICBNTkdfTlVMTCwKKyAgICAgTU5HX0RFU0NSX01IRFIsCisgICAgIE1OR19ERVNDUl9OT0lIRFIgfCBNTkdfREVTQ1JfTk9CQVNJIHwgTU5HX0RFU0NSX05PREhEUiB8IE1OR19ERVNDUl9OT0pIRFJ9OworCitNTkdfTE9DQUwgbW5nX2NodW5rX2Rlc2NyaXB0b3IgbW5nX2NodW5rX2Rlc2NyX2VuZGwgPQorICAgIHttbmdfaXRfbW5nLCBtbmdfY3JlYXRlX25vbmUsIDAsIDAsCisgICAgIE1OR19OVUxMLCBNTkdfTlVMTCwgbW5nX3NwZWNpYWxfZW5kbCwKKyAgICAgbW5nX2ZpZWxkc19lbmRsLCAoc2l6ZW9mKG1uZ19maWVsZHNfZW5kbCkgLyBzaXplb2YobW5nX2ZpZWxkX2Rlc2NyaXB0b3IpKSwKKyAgICAgTU5HX05VTEwsCisgICAgIE1OR19ERVNDUl9NSERSLAorICAgICBNTkdfREVTQ1JfTk9JSERSIHwgTU5HX0RFU0NSX05PQkFTSSB8IE1OR19ERVNDUl9OT0RIRFIgfCBNTkdfREVTQ1JfTk9KSERSfTsKKyNlbmRpZgorCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfREVGSQorTU5HX0xPQ0FMIG1uZ19jaHVua19kZXNjcmlwdG9yIG1uZ19jaHVua19kZXNjcl9kZWZpID0KKyAgICB7bW5nX2l0X21uZywgbW5nX2NyZWF0ZV9ub25lLCAwLCAwLAorICAgICBNTkdfTlVMTCwgTU5HX05VTEwsIG1uZ19zcGVjaWFsX2RlZmksCisgICAgIG1uZ19maWVsZHNfZGVmaSwgKHNpemVvZihtbmdfZmllbGRzX2RlZmkpIC8gc2l6ZW9mKG1uZ19maWVsZF9kZXNjcmlwdG9yKSksCisgICAgIE1OR19OVUxMLAorICAgICBNTkdfREVTQ1JfTUhEUiwKKyAgICAgTU5HX0RFU0NSX05PSUhEUiB8IE1OR19ERVNDUl9OT0JBU0kgfCBNTkdfREVTQ1JfTk9ESERSIHwgTU5HX0RFU0NSX05PSkhEUn07CisjZW5kaWYKKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX0JBU0kKK01OR19MT0NBTCBtbmdfY2h1bmtfZGVzY3JpcHRvciBtbmdfY2h1bmtfZGVzY3JfYmFzaSA9CisgICAge21uZ19pdF9tbmcsIG1uZ19jcmVhdGVfbm9uZSwgMCwgMCwKKyAgICAgTU5HX05VTEwsIE1OR19OVUxMLCBtbmdfc3BlY2lhbF9iYXNpLAorICAgICBtbmdfZmllbGRzX2Jhc2ksIChzaXplb2YobW5nX2ZpZWxkc19iYXNpKSAvIHNpemVvZihtbmdfZmllbGRfZGVzY3JpcHRvcikpLAorICAgICBNTkdfTlVMTCwKKyAgICAgTU5HX0RFU0NSX01IRFIsCisgICAgIE1OR19ERVNDUl9OT0lIRFIgfCBNTkdfREVTQ1JfTk9CQVNJIHwgTU5HX0RFU0NSX05PREhEUiB8IE1OR19ERVNDUl9OT0pIRFJ9OworI2VuZGlmCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19DTE9OCitNTkdfTE9DQUwgbW5nX2NodW5rX2Rlc2NyaXB0b3IgbW5nX2NodW5rX2Rlc2NyX2Nsb24gPQorICAgIHttbmdfaXRfbW5nLCBtbmdfY3JlYXRlX25vbmUsIDAsIDAsCisgICAgIE1OR19OVUxMLCBNTkdfTlVMTCwgbW5nX3NwZWNpYWxfY2xvbiwKKyAgICAgbW5nX2ZpZWxkc19jbG9uLCAoc2l6ZW9mKG1uZ19maWVsZHNfY2xvbikgLyBzaXplb2YobW5nX2ZpZWxkX2Rlc2NyaXB0b3IpKSwKKyAgICAgTU5HX05VTEwsCisgICAgIE1OR19ERVNDUl9NSERSLAorICAgICBNTkdfREVTQ1JfTk9JSERSIHwgTU5HX0RFU0NSX05PQkFTSSB8IE1OR19ERVNDUl9OT0RIRFIgfCBNTkdfREVTQ1JfTk9KSERSfTsKKyNlbmRpZgorCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfUEFTVAorTU5HX0xPQ0FMIG1uZ19jaHVua19kZXNjcmlwdG9yIG1uZ19jaHVua19kZXNjcl9wYXN0ID0KKyAgICB7bW5nX2l0X21uZywgbW5nX2NyZWF0ZV9ub25lLCAwLCAwLAorICAgICBNTkdfTlVMTCwgTU5HX05VTEwsIG1uZ19zcGVjaWFsX3Bhc3QsCisgICAgIG1uZ19maWVsZHNfcGFzdCwgKHNpemVvZihtbmdfZmllbGRzX3Bhc3QpIC8gc2l6ZW9mKG1uZ19maWVsZF9kZXNjcmlwdG9yKSksCisgICAgIE1OR19OVUxMLAorICAgICBNTkdfREVTQ1JfTUhEUiwKKyAgICAgTU5HX0RFU0NSX05PSUhEUiB8IE1OR19ERVNDUl9OT0JBU0kgfCBNTkdfREVTQ1JfTk9ESERSIHwgTU5HX0RFU0NSX05PSkhEUn07CisjZW5kaWYKKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX0RJU0MKK01OR19MT0NBTCBtbmdfY2h1bmtfZGVzY3JpcHRvciBtbmdfY2h1bmtfZGVzY3JfZGlzYyA9CisgICAge21uZ19pdF9tbmcsIG1uZ19jcmVhdGVfbm9uZSwgMCwgMCwKKyAgICAgTU5HX05VTEwsIE1OR19OVUxMLCBtbmdfc3BlY2lhbF9kaXNjLAorICAgICBtbmdfZmllbGRzX2Rpc2MsIChzaXplb2YobW5nX2ZpZWxkc19kaXNjKSAvIHNpemVvZihtbmdfZmllbGRfZGVzY3JpcHRvcikpLAorICAgICBNTkdfTlVMTCwKKyAgICAgTU5HX0RFU0NSX01IRFIsCisgICAgIE1OR19ERVNDUl9OT0lIRFIgfCBNTkdfREVTQ1JfTk9CQVNJIHwgTU5HX0RFU0NSX05PREhEUiB8IE1OR19ERVNDUl9OT0pIRFJ9OworI2VuZGlmCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19CQUNLCitNTkdfTE9DQUwgbW5nX2NodW5rX2Rlc2NyaXB0b3IgbW5nX2NodW5rX2Rlc2NyX2JhY2sgPQorICAgIHttbmdfaXRfbW5nLCBtbmdfY3JlYXRlX25vbmUsIDAsIDAsCisgICAgIE1OR19OVUxMLCBNTkdfTlVMTCwgbW5nX3NwZWNpYWxfYmFjaywKKyAgICAgbW5nX2ZpZWxkc19iYWNrLCAoc2l6ZW9mKG1uZ19maWVsZHNfYmFjaykgLyBzaXplb2YobW5nX2ZpZWxkX2Rlc2NyaXB0b3IpKSwKKyAgICAgTU5HX05VTEwsCisgICAgIE1OR19ERVNDUl9NSERSLAorICAgICBNTkdfREVTQ1JfTk9JSERSIHwgTU5HX0RFU0NSX05PQkFTSSB8IE1OR19ERVNDUl9OT0RIRFIgfCBNTkdfREVTQ1JfTk9KSERSfTsKKyNlbmRpZgorCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfRlJBTQorTU5HX0xPQ0FMIG1uZ19jaHVua19kZXNjcmlwdG9yIG1uZ19jaHVua19kZXNjcl9mcmFtID0KKyAgICB7bW5nX2l0X21uZywgbW5nX2NyZWF0ZV9ub25lLCAwLCBvZmZzZXRvZihtbmdfZnJhbSwgYkVtcHR5KSwKKyAgICAgTU5HX05VTEwsIE1OR19OVUxMLCBtbmdfc3BlY2lhbF9mcmFtLAorICAgICBtbmdfZmllbGRzX2ZyYW0sIChzaXplb2YobW5nX2ZpZWxkc19mcmFtKSAvIHNpemVvZihtbmdfZmllbGRfZGVzY3JpcHRvcikpLAorICAgICBNTkdfREVTQ1JfRU1QVFkgfCBNTkdfREVTQ1JfRU1QVFlHTE9CQUwsCisgICAgIE1OR19ERVNDUl9NSERSLAorICAgICBNTkdfREVTQ1JfTk9JSERSIHwgTU5HX0RFU0NSX05PQkFTSSB8IE1OR19ERVNDUl9OT0RIRFIgfCBNTkdfREVTQ1JfTk9KSERSfTsKKyNlbmRpZgorCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfTU9WRQorTU5HX0xPQ0FMIG1uZ19jaHVua19kZXNjcmlwdG9yIG1uZ19jaHVua19kZXNjcl9tb3ZlID0KKyAgICB7bW5nX2l0X21uZywgbW5nX2NyZWF0ZV9ub25lLCAwLCAwLAorICAgICBNTkdfTlVMTCwgTU5HX05VTEwsIG1uZ19zcGVjaWFsX21vdmUsCisgICAgIG1uZ19maWVsZHNfbW92ZSwgKHNpemVvZihtbmdfZmllbGRzX21vdmUpIC8gc2l6ZW9mKG1uZ19maWVsZF9kZXNjcmlwdG9yKSksCisgICAgIE1OR19OVUxMLAorICAgICBNTkdfREVTQ1JfTUhEUiwKKyAgICAgTU5HX0RFU0NSX05PSUhEUiB8IE1OR19ERVNDUl9OT0JBU0kgfCBNTkdfREVTQ1JfTk9ESERSIHwgTU5HX0RFU0NSX05PSkhEUn07CisjZW5kaWYKKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX0NMSVAKK01OR19MT0NBTCBtbmdfY2h1bmtfZGVzY3JpcHRvciBtbmdfY2h1bmtfZGVzY3JfY2xpcCA9CisgICAge21uZ19pdF9tbmcsIG1uZ19jcmVhdGVfbm9uZSwgMCwgMCwKKyAgICAgTU5HX05VTEwsIE1OR19OVUxMLCBtbmdfc3BlY2lhbF9jbGlwLAorICAgICBtbmdfZmllbGRzX2NsaXAsIChzaXplb2YobW5nX2ZpZWxkc19jbGlwKSAvIHNpemVvZihtbmdfZmllbGRfZGVzY3JpcHRvcikpLAorICAgICBNTkdfTlVMTCwKKyAgICAgTU5HX0RFU0NSX01IRFIsCisgICAgIE1OR19ERVNDUl9OT0lIRFIgfCBNTkdfREVTQ1JfTk9CQVNJIHwgTU5HX0RFU0NSX05PREhEUiB8IE1OR19ERVNDUl9OT0pIRFJ9OworI2VuZGlmCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19TSE9XCitNTkdfTE9DQUwgbW5nX2NodW5rX2Rlc2NyaXB0b3IgbW5nX2NodW5rX2Rlc2NyX3Nob3cgPQorICAgIHttbmdfaXRfbW5nLCBtbmdfY3JlYXRlX25vbmUsIDAsIG9mZnNldG9mKG1uZ19zaG93LCBiRW1wdHkpLAorICAgICBNTkdfTlVMTCwgTU5HX05VTEwsIG1uZ19zcGVjaWFsX3Nob3csCisgICAgIG1uZ19maWVsZHNfc2hvdywgKHNpemVvZihtbmdfZmllbGRzX3Nob3cpIC8gc2l6ZW9mKG1uZ19maWVsZF9kZXNjcmlwdG9yKSksCisgICAgIE1OR19ERVNDUl9FTVBUWSB8IE1OR19ERVNDUl9FTVBUWUdMT0JBTCwKKyAgICAgTU5HX0RFU0NSX01IRFIsCisgICAgIE1OR19ERVNDUl9OT0lIRFIgfCBNTkdfREVTQ1JfTk9CQVNJIHwgTU5HX0RFU0NSX05PREhEUiB8IE1OR19ERVNDUl9OT0pIRFJ9OworI2VuZGlmCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19URVJNCitNTkdfTE9DQUwgbW5nX2NodW5rX2Rlc2NyaXB0b3IgbW5nX2NodW5rX2Rlc2NyX3Rlcm0gPQorICAgIHttbmdfaXRfbW5nLCBtbmdfY3JlYXRlX25vbmUsIDAsIDAsCisgICAgIE1OR19OVUxMLCBNTkdfTlVMTCwgbW5nX3NwZWNpYWxfdGVybSwKKyAgICAgbW5nX2ZpZWxkc190ZXJtLCAoc2l6ZW9mKG1uZ19maWVsZHNfdGVybSkgLyBzaXplb2YobW5nX2ZpZWxkX2Rlc2NyaXB0b3IpKSwKKyAgICAgTU5HX05VTEwsCisgICAgIE1OR19ERVNDUl9NSERSLAorICAgICBNTkdfREVTQ1JfTk9JSERSIHwgTU5HX0RFU0NSX05PQkFTSSB8IE1OR19ERVNDUl9OT0RIRFIgfCBNTkdfREVTQ1JfTk9KSERSIHwgTU5HX0RFU0NSX05PVEVSTSB8IE1OR19ERVNDUl9OT0xPT1B9OworI2VuZGlmCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19TQVZFCitNTkdfTE9DQUwgbW5nX2NodW5rX2Rlc2NyaXB0b3IgbW5nX2NodW5rX2Rlc2NyX3NhdmUgPQorICAgIHttbmdfaXRfbW5nLCBtbmdfY3JlYXRlX25vbmUsIDAsIDAsCisgICAgIE1OR19OVUxMLCBNTkdfTlVMTCwgbW5nX3NwZWNpYWxfc2F2ZSwKKyAgICAgbW5nX2ZpZWxkc19zYXZlLCAoc2l6ZW9mKG1uZ19maWVsZHNfc2F2ZSkgLyBzaXplb2YobW5nX2ZpZWxkX2Rlc2NyaXB0b3IpKSwKKyAgICAgTU5HX0RFU0NSX0VNUFRZIHwgTU5HX0RFU0NSX0VNUFRZR0xPQkFMLAorICAgICBNTkdfREVTQ1JfTUhEUiwKKyAgICAgTU5HX0RFU0NSX05PU0FWRSB8IE1OR19ERVNDUl9OT0lIRFIgfCBNTkdfREVTQ1JfTk9CQVNJIHwgTU5HX0RFU0NSX05PREhEUiB8IE1OR19ERVNDUl9OT0pIRFJ9OworI2VuZGlmCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19TRUVLCitNTkdfTE9DQUwgbW5nX2NodW5rX2Rlc2NyaXB0b3IgbW5nX2NodW5rX2Rlc2NyX3NlZWsgPQorICAgIHttbmdfaXRfbW5nLCBtbmdfY3JlYXRlX25vbmUsIDAsIDAsCisgICAgIE1OR19OVUxMLCBNTkdfTlVMTCwgbW5nX3NwZWNpYWxfc2VlaywKKyAgICAgbW5nX2ZpZWxkc19zZWVrLCAoc2l6ZW9mKG1uZ19maWVsZHNfc2VlaykgLyBzaXplb2YobW5nX2ZpZWxkX2Rlc2NyaXB0b3IpKSwKKyAgICAgTU5HX0RFU0NSX0VNUFRZIHwgTU5HX0RFU0NSX0VNUFRZR0xPQkFMLAorICAgICBNTkdfREVTQ1JfTUhEUiB8IE1OR19ERVNDUl9TQVZFLAorICAgICBNTkdfREVTQ1JfTk9JSERSIHwgTU5HX0RFU0NSX05PQkFTSSB8IE1OR19ERVNDUl9OT0RIRFIgfCBNTkdfREVTQ1JfTk9KSERSfTsKKyNlbmRpZgorCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfZVhQSQorTU5HX0xPQ0FMIG1uZ19jaHVua19kZXNjcmlwdG9yIG1uZ19jaHVua19kZXNjcl9leHBpID0KKyAgICB7bW5nX2l0X21uZywgbW5nX2NyZWF0ZV9ub25lLCAwLCAwLAorICAgICBNTkdfTlVMTCwgTU5HX05VTEwsIG1uZ19zcGVjaWFsX2V4cGksCisgICAgIG1uZ19maWVsZHNfZXhwaSwgKHNpemVvZihtbmdfZmllbGRzX2V4cGkpIC8gc2l6ZW9mKG1uZ19maWVsZF9kZXNjcmlwdG9yKSksCisgICAgIE1OR19OVUxMLAorICAgICBNTkdfREVTQ1JfTUhEUiwKKyAgICAgTU5HX0RFU0NSX05PSUhEUiB8IE1OR19ERVNDUl9OT0JBU0kgfCBNTkdfREVTQ1JfTk9ESERSIHwgTU5HX0RFU0NSX05PSkhEUn07CisjZW5kaWYKKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX2ZQUkkKK01OR19MT0NBTCBtbmdfY2h1bmtfZGVzY3JpcHRvciBtbmdfY2h1bmtfZGVzY3JfZnByaSA9CisgICAge21uZ19pdF9tbmcsIG1uZ19jcmVhdGVfbm9uZSwgMCwgMCwKKyAgICAgTU5HX05VTEwsIE1OR19OVUxMLCBtbmdfc3BlY2lhbF9mcHJpLAorICAgICBtbmdfZmllbGRzX2ZwcmksIChzaXplb2YobW5nX2ZpZWxkc19mcHJpKSAvIHNpemVvZihtbmdfZmllbGRfZGVzY3JpcHRvcikpLAorICAgICBNTkdfTlVMTCwKKyAgICAgTU5HX0RFU0NSX01IRFIsCisgICAgIE1OR19ERVNDUl9OT0lIRFIgfCBNTkdfREVTQ1JfTk9CQVNJIHwgTU5HX0RFU0NSX05PREhEUiB8IE1OR19ERVNDUl9OT0pIRFJ9OworI2VuZGlmCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19uRUVECitNTkdfTE9DQUwgbW5nX2NodW5rX2Rlc2NyaXB0b3IgbW5nX2NodW5rX2Rlc2NyX25lZWQgPQorICAgIHttbmdfaXRfbW5nLCBtbmdfY3JlYXRlX25vbmUsIDAsIDAsCisgICAgIE1OR19OVUxMLCBNTkdfTlVMTCwgbW5nX3NwZWNpYWxfbmVlZCwKKyAgICAgbW5nX2ZpZWxkc19uZWVkLCAoc2l6ZW9mKG1uZ19maWVsZHNfbmVlZCkgLyBzaXplb2YobW5nX2ZpZWxkX2Rlc2NyaXB0b3IpKSwKKyAgICAgTU5HX05VTEwsCisgICAgIE1OR19ERVNDUl9NSERSLAorICAgICBNTkdfREVTQ1JfTk9JSERSIHwgTU5HX0RFU0NSX05PQkFTSSB8IE1OR19ERVNDUl9OT0RIRFIgfCBNTkdfREVTQ1JfTk9KSERSfTsKKyNlbmRpZgorCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfcEhZZworTU5HX0xPQ0FMIG1uZ19jaHVua19kZXNjcmlwdG9yIG1uZ19jaHVua19kZXNjcl9waHlnID0KKyAgICB7bW5nX2l0X21uZywgbW5nX2NyZWF0ZV9ub25lLCAwLCAwLAorICAgICBNTkdfTlVMTCwgTU5HX05VTEwsIG1uZ19zcGVjaWFsX3BoeWcsCisgICAgIG1uZ19maWVsZHNfcGh5ZywgKHNpemVvZihtbmdfZmllbGRzX3BoeWcpIC8gc2l6ZW9mKG1uZ19maWVsZF9kZXNjcmlwdG9yKSksCisgICAgIE1OR19OVUxMLAorICAgICBNTkdfREVTQ1JfTUhEUiwKKyAgICAgTU5HX0RFU0NSX05PSUhEUiB8IE1OR19ERVNDUl9OT0JBU0kgfCBNTkdfREVTQ1JfTk9ESERSIHwgTU5HX0RFU0NSX05PSkhEUn07CisjZW5kaWYKKworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCitNTkdfTE9DQUwgbW5nX2NodW5rX2Rlc2NyaXB0b3IgbW5nX2NodW5rX2Rlc2NyX2RoZHIgPQorICAgIHttbmdfaXRfbW5nLCBtbmdfY3JlYXRlX25vbmUsIDAsIDAsCisgICAgIE1OR19OVUxMLCBNTkdfTlVMTCwgbW5nX3NwZWNpYWxfZGhkciwKKyAgICAgbW5nX2ZpZWxkc19kaGRyLCAoc2l6ZW9mKG1uZ19maWVsZHNfZGhkcikgLyBzaXplb2YobW5nX2ZpZWxkX2Rlc2NyaXB0b3IpKSwKKyAgICAgTU5HX05VTEwsCisgICAgIE1OR19ERVNDUl9NSERSLAorICAgICBNTkdfREVTQ1JfTk9JSERSIHwgTU5HX0RFU0NSX05PQkFTSSB8IE1OR19ERVNDUl9OT0RIRFIgfCBNTkdfREVTQ1JfTk9KSERSfTsKKyNlbmRpZgorCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKK01OR19MT0NBTCBtbmdfY2h1bmtfZGVzY3JpcHRvciBtbmdfY2h1bmtfZGVzY3JfcHJvbSA9CisgICAge21uZ19pdF9tbmcsIG1uZ19jcmVhdGVfbm9uZSwgMCwgMCwKKyAgICAgTU5HX05VTEwsIE1OR19OVUxMLCBtbmdfc3BlY2lhbF9wcm9tLAorICAgICBtbmdfZmllbGRzX3Byb20sIChzaXplb2YobW5nX2ZpZWxkc19wcm9tKSAvIHNpemVvZihtbmdfZmllbGRfZGVzY3JpcHRvcikpLAorICAgICBNTkdfTlVMTCwKKyAgICAgTU5HX0RFU0NSX01IRFIgfCBNTkdfREVTQ1JfREhEUiwKKyAgICAgTU5HX05VTEx9OworI2VuZGlmCisKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworTU5HX0xPQ0FMIG1uZ19jaHVua19kZXNjcmlwdG9yIG1uZ19jaHVua19kZXNjcl9pcG5nID0KKyAgICB7bW5nX2l0X21uZywgbW5nX2NyZWF0ZV9ub25lLCAwLCAwLAorICAgICBNTkdfTlVMTCwgTU5HX05VTEwsIG1uZ19zcGVjaWFsX2lwbmcsCisgICAgIE1OR19OVUxMLCAwLAorICAgICBNTkdfREVTQ1JfRU1QVFkgfCBNTkdfREVTQ1JfRU1QVFlFTUJFRCwKKyAgICAgTU5HX0RFU0NSX01IRFIgfCBNTkdfREVTQ1JfREhEUiwKKyAgICAgTU5HX05VTEx9OworI2VuZGlmCisKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworTU5HX0xPQ0FMIG1uZ19jaHVua19kZXNjcmlwdG9yIG1uZ19jaHVua19kZXNjcl9wcGx0ID0KKyAgICB7bW5nX2l0X21uZywgbW5nX2NyZWF0ZV9ub25lLCAwLCAwLAorICAgICBNTkdfTlVMTCwgTU5HX05VTEwsIG1uZ19zcGVjaWFsX3BwbHQsCisgICAgIG1uZ19maWVsZHNfcHBsdCwgKHNpemVvZihtbmdfZmllbGRzX3BwbHQpIC8gc2l6ZW9mKG1uZ19maWVsZF9kZXNjcmlwdG9yKSksCisgICAgIE1OR19OVUxMLAorICAgICBNTkdfREVTQ1JfTUhEUiB8IE1OR19ERVNDUl9ESERSLAorICAgICBNTkdfTlVMTH07CisjZW5kaWYKKworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCitNTkdfTE9DQUwgbW5nX2NodW5rX2Rlc2NyaXB0b3IgbW5nX2NodW5rX2Rlc2NyX2lqbmcgPQorICAgIHttbmdfaXRfbW5nLCBtbmdfY3JlYXRlX25vbmUsIDAsIDAsCisgICAgIE1OR19OVUxMLCBNTkdfTlVMTCwgbW5nX3NwZWNpYWxfaWpuZywKKyAgICAgTU5HX05VTEwsIDAsCisgICAgIE1OR19ERVNDUl9FTVBUWSB8IE1OR19ERVNDUl9FTVBUWUVNQkVELAorICAgICBNTkdfREVTQ1JfTUhEUiB8IE1OR19ERVNDUl9ESERSLAorICAgICBNTkdfTlVMTH07CisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKK01OR19MT0NBTCBtbmdfY2h1bmtfZGVzY3JpcHRvciBtbmdfY2h1bmtfZGVzY3JfZHJvcCA9CisgICAge21uZ19pdF9tbmcsIG1uZ19jcmVhdGVfbm9uZSwgMCwgMCwKKyAgICAgTU5HX05VTEwsIE1OR19OVUxMLCBtbmdfc3BlY2lhbF9kcm9wLAorICAgICBtbmdfZmllbGRzX2Ryb3AsIChzaXplb2YobW5nX2ZpZWxkc19kcm9wKSAvIHNpemVvZihtbmdfZmllbGRfZGVzY3JpcHRvcikpLAorICAgICBNTkdfTlVMTCwKKyAgICAgTU5HX0RFU0NSX01IRFIgfCBNTkdfREVTQ1JfREhEUiwKKyAgICAgTU5HX05VTEx9OworI2VuZGlmCisKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworI2lmbmRlZiBNTkdfU0tJUENIVU5LX0RCWUsKK01OR19MT0NBTCBtbmdfY2h1bmtfZGVzY3JpcHRvciBtbmdfY2h1bmtfZGVzY3JfZGJ5ayA9CisgICAge21uZ19pdF9tbmcsIG1uZ19jcmVhdGVfbm9uZSwgMCwgMCwKKyAgICAgTU5HX05VTEwsIE1OR19OVUxMLCBtbmdfc3BlY2lhbF9kYnlrLAorICAgICBtbmdfZmllbGRzX2RieWssIChzaXplb2YobW5nX2ZpZWxkc19kYnlrKSAvIHNpemVvZihtbmdfZmllbGRfZGVzY3JpcHRvcikpLAorICAgICBNTkdfREVTQ1JfRU1QVFkgfCBNTkdfREVTQ1JfRU1QVFlFTUJFRCwKKyAgICAgTU5HX0RFU0NSX01IRFIgfCBNTkdfREVTQ1JfREhEUiwKKyAgICAgTU5HX05VTEx9OworI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfT1JEUgorTU5HX0xPQ0FMIG1uZ19jaHVua19kZXNjcmlwdG9yIG1uZ19jaHVua19kZXNjcl9vcmRyID0KKyAgICB7bW5nX2l0X21uZywgbW5nX2NyZWF0ZV9ub25lLCAwLCAwLAorICAgICBNTkdfTlVMTCwgTU5HX05VTEwsIG1uZ19zcGVjaWFsX29yZHIsCisgICAgIG1uZ19maWVsZHNfb3JkciwgKHNpemVvZihtbmdfZmllbGRzX29yZHIpIC8gc2l6ZW9mKG1uZ19maWVsZF9kZXNjcmlwdG9yKSksCisgICAgIE1OR19OVUxMLAorICAgICBNTkdfREVTQ1JfTUhEUiB8IE1OR19ERVNDUl9ESERSLAorICAgICBNTkdfTlVMTH07CisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfTUFHTgorTU5HX0xPQ0FMIG1uZ19jaHVua19kZXNjcmlwdG9yIG1uZ19jaHVua19kZXNjcl9tYWduID0KKyAgICB7bW5nX2l0X21uZywgbW5nX2NyZWF0ZV9ub25lLCAwLCAwLAorICAgICBNTkdfTlVMTCwgTU5HX05VTEwsIG1uZ19zcGVjaWFsX21hZ24sCisgICAgIG1uZ19maWVsZHNfbWFnbiwgKHNpemVvZihtbmdfZmllbGRzX21hZ24pIC8gc2l6ZW9mKG1uZ19maWVsZF9kZXNjcmlwdG9yKSksCisgICAgIE1OR19OVUxMLAorICAgICBNTkdfREVTQ1JfTUhEUiwKKyAgICAgTU5HX0RFU0NSX05PSUhEUiB8IE1OR19ERVNDUl9OT0JBU0kgfCBNTkdfREVTQ1JfTk9ESERSIHwgTU5HX0RFU0NSX05PSkhEUn07CisjZW5kaWYKKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX2V2TlQKK01OR19MT0NBTCBtbmdfY2h1bmtfZGVzY3JpcHRvciBtbmdfY2h1bmtfZGVzY3JfZXZudCA9CisgICAge21uZ19pdF9tbmcsIG1uZ19jcmVhdGVfbm9uZSwgMCwgMCwKKyAgICAgTU5HX05VTEwsIE1OR19OVUxMLCBtbmdfc3BlY2lhbF9ldm50LAorICAgICBtbmdfZmllbGRzX2V2bnQsIChzaXplb2YobW5nX2ZpZWxkc19ldm50KSAvIHNpemVvZihtbmdfZmllbGRfZGVzY3JpcHRvcikpLAorICAgICBNTkdfTlVMTCwKKyAgICAgTU5HX0RFU0NSX01IRFIsCisgICAgIE1OR19ERVNDUl9OT1NBVkV9OworI2VuZGlmCisKKyNpZmRlZiBNTkdfSU5DTFVERV9NUE5HX1BST1BPU0FMCitNTkdfTE9DQUwgbW5nX2NodW5rX2Rlc2NyaXB0b3IgbW5nX2NodW5rX2Rlc2NyX21wbmcgPQorICAgIHttbmdfaXRfbXBuZywgbW5nX2NyZWF0ZV9ub25lLCAwLCAwLAorICAgICBNTkdfTlVMTCwgTU5HX05VTEwsIG1uZ19zcGVjaWFsX21wbmcsCisgICAgIG1uZ19maWVsZHNfbXBuZywgKHNpemVvZihtbmdfZmllbGRzX21wbmcpIC8gc2l6ZW9mKG1uZ19maWVsZF9kZXNjcmlwdG9yKSksCisgICAgIE1OR19OVUxMLAorICAgICBNTkdfTlVMTCwKKyAgICAgTU5HX0RFU0NSX05PTUhEUiB8IE1OR19ERVNDUl9OT0lEQVQgfCBNTkdfREVTQ1JfTk9KREFUfTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX0lOQ0xVREVfQU5HX1BST1BPU0FMCitNTkdfTE9DQUwgbW5nX2NodW5rX2Rlc2NyaXB0b3IgbW5nX2NodW5rX2Rlc2NyX2FoZHIgPQorICAgIHttbmdfaXRfYW5nLCBtbmdfY3JlYXRlX25vbmUsIDAsIDAsCisgICAgIE1OR19OVUxMLCBNTkdfTlVMTCwgbW5nX3NwZWNpYWxfYWhkciwKKyAgICAgbW5nX2ZpZWxkc19haGRyLCAoc2l6ZW9mKG1uZ19maWVsZHNfYWhkcikgLyBzaXplb2YobW5nX2ZpZWxkX2Rlc2NyaXB0b3IpKSwKKyAgICAgTU5HX05VTEwsCisgICAgIE1OR19ERVNDUl9JSERSLAorICAgICBNTkdfREVTQ1JfTk9NSERSIHwgTU5HX0RFU0NSX05PSkhEUiB8IE1OR19ERVNDUl9OT0lEQVR9OworCitNTkdfTE9DQUwgbW5nX2NodW5rX2Rlc2NyaXB0b3IgbW5nX2NodW5rX2Rlc2NyX2FkYXQgPQorICAgIHttbmdfaXRfYW5nLCBtbmdfY3JlYXRlX25vbmUsIDAsIDAsCisgICAgIE1OR19OVUxMLCBNTkdfTlVMTCwgbW5nX3NwZWNpYWxfYWRhdCwKKyAgICAgbW5nX2ZpZWxkc19hZGF0LCAoc2l6ZW9mKG1uZ19maWVsZHNfYWRhdCkgLyBzaXplb2YobW5nX2ZpZWxkX2Rlc2NyaXB0b3IpKSwKKyAgICAgTU5HX05VTEwsCisgICAgIE1OR19ERVNDUl9JSERSLAorICAgICBNTkdfREVTQ1JfTk9NSERSIHwgTU5HX0RFU0NSX05PSkhEUn07CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiB0aGUgZ29vZCBvbCcgdW5rbm93biBiYWJlICovCisKK01OR19MT0NBTCBtbmdfY2h1bmtfZGVzY3JpcHRvciBtbmdfY2h1bmtfZGVzY3JfdW5rbm93biA9CisgICAge21uZ19pdF9wbmcsIG1uZ19jcmVhdGVfbm9uZSwgMCwgMCwKKyAgICAgTU5HX05VTEwsIE1OR19OVUxMLCBtbmdfc3BlY2lhbF91bmtub3duLAorICAgICBtbmdfZmllbGRzX3Vua25vd24sIChzaXplb2YobW5nX2ZpZWxkc191bmtub3duKSAvIHNpemVvZihtbmdfZmllbGRfZGVzY3JpcHRvcikpLAorICAgICBNTkdfREVTQ1JfRU1QVFkgfCBNTkdfREVTQ1JfRU1QVFlFTUJFRCwKKyAgICAgTU5HX05VTEwsCisgICAgIE1OR19OVUxMfTsKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK01OR19MT0NBTCBtbmdfY2h1bmtfaGVhZGVyIG1uZ19jaHVua191bmtub3duID0KKyAgICB7TU5HX1VJTlRfSFVILCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV91bmtub3duLAorICAgICBtbmdfcmVhZF9nZW5lcmFsLCBtbmdfd3JpdGVfdW5rbm93biwgbW5nX2Fzc2lnbl91bmtub3duLAorICAgICAwLCAwLCBzaXplb2YobW5nX3Vua25vd25fY2h1bmspLCAmbW5nX2NodW5rX2Rlc2NyX3Vua25vd259OworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisgIC8qIHRoZSB0YWJsZS1pZGVhICYgYmluYXJ5IHNlYXJjaCBjb2RlIHdhcyBhZGFwdGVkIGZyb20KKyAgICAgbGlicG5nIDEuMS4wIChwbmdyZWFkLmMpICovCisgIC8qIE5PVEUxOiB0aGUgdGFibGUgbXVzdCByZW1haW4gc29ydGVkIGJ5IGNodW5rbmFtZSwgb3RoZXJ3aXNlIHRoZSBiaW5hcnkKKyAgICAgc2VhcmNoIHdpbGwgYnJlYWsgISEhIChwcy4gd2F0Y2ggdXBwZXItL2xvd2VyLWNhc2UgY2h1bmtuYW1lcyAhISkgKi8KKyAgLyogTk9URTI6IHRoZSBsYXlvdXQgbXVzdCByZW1haW4gZXF1YWwgdG8gdGhlIGhlYWRlciBwYXJ0IG9mIGFsbCB0aGUKKyAgICAgY2h1bmstc3RydWN0dXJlcyAoeWVzLCB0aGF0IG1lYW5zIGV2ZW4gdGhlIHBOZXh0IGFuZCBwUHJldiBmaWVsZHM7CisgICAgIGl0J3Mgd2FzdGluZyBhIGJpdCBvZiBzcGFjZSwgYnV0IGhleSwgdGhlIGNvZGUgaXMgYSBsb3QgZWFzaWVyKSAqLworCitNTkdfTE9DQUwgbW5nX2NodW5rX2hlYWRlciBtbmdfY2h1bmtfdGFibGUgW10gPQorICB7CisjaWZuZGVmIE1OR19TS0lQQ0hVTktfQkFDSworICAgIHtNTkdfVUlOVF9CQUNLLCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9nZW5lcmFsLCBtbmdfcmVhZF9nZW5lcmFsLCBtbmdfd3JpdGVfYmFjaywgbW5nX2Fzc2lnbl9nZW5lcmFsLCAwLCAwLCBzaXplb2YobW5nX2JhY2spLCAmbW5nX2NodW5rX2Rlc2NyX2JhY2t9LAorI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfQkFTSQorICAgIHtNTkdfVUlOVF9CQVNJLCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9nZW5lcmFsLCBtbmdfcmVhZF9nZW5lcmFsLCBtbmdfd3JpdGVfYmFzaSwgbW5nX2Fzc2lnbl9nZW5lcmFsLCAwLCAwLCBzaXplb2YobW5nX2Jhc2kpLCAmbW5nX2NodW5rX2Rlc2NyX2Jhc2l9LAorI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfQ0xJUAorICAgIHtNTkdfVUlOVF9DTElQLCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9nZW5lcmFsLCBtbmdfcmVhZF9nZW5lcmFsLCBtbmdfd3JpdGVfY2xpcCwgbW5nX2Fzc2lnbl9nZW5lcmFsLCAwLCAwLCBzaXplb2YobW5nX2NsaXApLCAmbW5nX2NodW5rX2Rlc2NyX2NsaXB9LAorI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfQ0xPTgorICAgIHtNTkdfVUlOVF9DTE9OLCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9nZW5lcmFsLCBtbmdfcmVhZF9nZW5lcmFsLCBtbmdfd3JpdGVfY2xvbiwgbW5nX2Fzc2lnbl9nZW5lcmFsLCAwLCAwLCBzaXplb2YobW5nX2Nsb24pLCAmbW5nX2NodW5rX2Rlc2NyX2Nsb259LAorI2VuZGlmCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19EQllLCisgICAge01OR19VSU5UX0RCWUssIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX2RieWssICAgIG1uZ19yZWFkX2dlbmVyYWwsIG1uZ193cml0ZV9kYnlrLCBtbmdfYXNzaWduX2RieWssICAgIDAsIDAsIHNpemVvZihtbmdfZGJ5ayksICZtbmdfY2h1bmtfZGVzY3JfZGJ5a30sCisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX0RFRkkKKyAgICB7TU5HX1VJTlRfREVGSSwgbW5nX2luaXRfZ2VuZXJhbCwgbW5nX2ZyZWVfZ2VuZXJhbCwgbW5nX3JlYWRfZ2VuZXJhbCwgbW5nX3dyaXRlX2RlZmksIG1uZ19hc3NpZ25fZ2VuZXJhbCwgMCwgMCwgc2l6ZW9mKG1uZ19kZWZpKSwgJm1uZ19jaHVua19kZXNjcl9kZWZpfSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisgICAge01OR19VSU5UX0RIRFIsIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX2dlbmVyYWwsIG1uZ19yZWFkX2dlbmVyYWwsIG1uZ193cml0ZV9kaGRyLCBtbmdfYXNzaWduX2dlbmVyYWwsIDAsIDAsIHNpemVvZihtbmdfZGhkciksICZtbmdfY2h1bmtfZGVzY3JfZGhkcn0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19ESVNDCisgICAge01OR19VSU5UX0RJU0MsIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX2Rpc2MsICAgIG1uZ19yZWFkX2dlbmVyYWwsIG1uZ193cml0ZV9kaXNjLCBtbmdfYXNzaWduX2Rpc2MsICAgIDAsIDAsIHNpemVvZihtbmdfZGlzYyksICZtbmdfY2h1bmtfZGVzY3JfZGlzY30sCisjZW5kaWYKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworI2lmbmRlZiBNTkdfU0tJUENIVU5LX0RST1AKKyAgICB7TU5HX1VJTlRfRFJPUCwgbW5nX2luaXRfZ2VuZXJhbCwgbW5nX2ZyZWVfZHJvcCwgICAgbW5nX3JlYWRfZ2VuZXJhbCwgbW5nX3dyaXRlX2Ryb3AsIG1uZ19hc3NpZ25fZHJvcCwgICAgMCwgMCwgc2l6ZW9mKG1uZ19kcm9wKSwgJm1uZ19jaHVua19kZXNjcl9kcm9wfSwKKyNlbmRpZgorI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfTE9PUAorICAgIHtNTkdfVUlOVF9FTkRMLCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9nZW5lcmFsLCBtbmdfcmVhZF9nZW5lcmFsLCBtbmdfd3JpdGVfZW5kbCwgbW5nX2Fzc2lnbl9nZW5lcmFsLCAwLCAwLCBzaXplb2YobW5nX2VuZGwpLCAmbW5nX2NodW5rX2Rlc2NyX2VuZGx9LAorI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfRlJBTQorICAgIHtNTkdfVUlOVF9GUkFNLCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9mcmFtLCAgICBtbmdfcmVhZF9nZW5lcmFsLCBtbmdfd3JpdGVfZnJhbSwgbW5nX2Fzc2lnbl9mcmFtLCAgICAwLCAwLCBzaXplb2YobW5nX2ZyYW0pLCAmbW5nX2NodW5rX2Rlc2NyX2ZyYW19LAorI2VuZGlmCisgICAge01OR19VSU5UX0lEQVQsIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX2lkYXQsICAgIG1uZ19yZWFkX2dlbmVyYWwsIG1uZ193cml0ZV9pZGF0LCBtbmdfYXNzaWduX2lkYXQsICAgIDAsIDAsIHNpemVvZihtbmdfaWRhdCksICZtbmdfY2h1bmtfZGVzY3JfaWRhdH0sICAvKiAxMi10aCBlbGVtZW50ISAqLworICAgIHtNTkdfVUlOVF9JRU5ELCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9nZW5lcmFsLCBtbmdfcmVhZF9nZW5lcmFsLCBtbmdfd3JpdGVfaWVuZCwgbW5nX2Fzc2lnbl9nZW5lcmFsLCAwLCAwLCBzaXplb2YobW5nX2llbmQpLCAmbW5nX2NodW5rX2Rlc2NyX2llbmR9LAorICAgIHtNTkdfVUlOVF9JSERSLCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9nZW5lcmFsLCBtbmdfcmVhZF9nZW5lcmFsLCBtbmdfd3JpdGVfaWhkciwgbW5nX2Fzc2lnbl9nZW5lcmFsLCAwLCAwLCBzaXplb2YobW5nX2loZHIpLCAmbW5nX2NodW5rX2Rlc2NyX2loZHJ9LAorI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisgICAge01OR19VSU5UX0lKTkcsIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX2dlbmVyYWwsIG1uZ19yZWFkX2dlbmVyYWwsIG1uZ193cml0ZV9pam5nLCBtbmdfYXNzaWduX2dlbmVyYWwsIDAsIDAsIHNpemVvZihtbmdfaWpuZyksICZtbmdfY2h1bmtfZGVzY3JfaWpuZ30sCisjZW5kaWYKKyAgICB7TU5HX1VJTlRfSVBORywgbW5nX2luaXRfZ2VuZXJhbCwgbW5nX2ZyZWVfZ2VuZXJhbCwgbW5nX3JlYWRfZ2VuZXJhbCwgbW5nX3dyaXRlX2lwbmcsIG1uZ19hc3NpZ25fZ2VuZXJhbCwgMCwgMCwgc2l6ZW9mKG1uZ19pcG5nKSwgJm1uZ19jaHVua19kZXNjcl9pcG5nfSwKKyNlbmRpZgorI2lmZGVmIE1OR19JTkNMVURFX0pORworICAgIHtNTkdfVUlOVF9KREFBLCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9qZGFhLCAgICBtbmdfcmVhZF9nZW5lcmFsLCBtbmdfd3JpdGVfamRhYSwgbW5nX2Fzc2lnbl9qZGFhLCAgICAwLCAwLCBzaXplb2YobW5nX2pkYWEpLCAmbW5nX2NodW5rX2Rlc2NyX2pkYWF9LAorICAgIHtNTkdfVUlOVF9KREFULCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9qZGF0LCAgICBtbmdfcmVhZF9nZW5lcmFsLCBtbmdfd3JpdGVfamRhdCwgbW5nX2Fzc2lnbl9qZGF0LCAgICAwLCAwLCBzaXplb2YobW5nX2pkYXQpLCAmbW5nX2NodW5rX2Rlc2NyX2pkYXR9LAorICAgIHtNTkdfVUlOVF9KSERSLCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9nZW5lcmFsLCBtbmdfcmVhZF9nZW5lcmFsLCBtbmdfd3JpdGVfamhkciwgbW5nX2Fzc2lnbl9nZW5lcmFsLCAwLCAwLCBzaXplb2YobW5nX2poZHIpLCAmbW5nX2NodW5rX2Rlc2NyX2poZHJ9LAorICAgIHtNTkdfVUlOVF9KU0VQLCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9nZW5lcmFsLCBtbmdfcmVhZF9nZW5lcmFsLCBtbmdfd3JpdGVfanNlcCwgbW5nX2Fzc2lnbl9nZW5lcmFsLCAwLCAwLCBzaXplb2YobW5nX2pzZXApLCAmbW5nX2NodW5rX2Rlc2NyX2pzZXB9LAorICAgIHtNTkdfVUlOVF9KZEFBLCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9qZGFhLCAgICBtbmdfcmVhZF9nZW5lcmFsLCBtbmdfd3JpdGVfamRhYSwgbW5nX2Fzc2lnbl9qZGFhLCAgICAwLCAwLCBzaXplb2YobW5nX2pkYWEpLCAmbW5nX2NodW5rX2Rlc2NyX2pkYWF9LAorI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfTE9PUAorICAgIHtNTkdfVUlOVF9MT09QLCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9sb29wLCAgICBtbmdfcmVhZF9nZW5lcmFsLCBtbmdfd3JpdGVfbG9vcCwgbW5nX2Fzc2lnbl9sb29wLCAgICAwLCAwLCBzaXplb2YobW5nX2xvb3ApLCAmbW5nX2NodW5rX2Rlc2NyX2xvb3B9LAorI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfTUFHTgorICAgIHtNTkdfVUlOVF9NQUdOLCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9nZW5lcmFsLCBtbmdfcmVhZF9nZW5lcmFsLCBtbmdfd3JpdGVfbWFnbiwgbW5nX2Fzc2lnbl9nZW5lcmFsLCAwLCAwLCBzaXplb2YobW5nX21hZ24pLCAmbW5nX2NodW5rX2Rlc2NyX21hZ259LAorI2VuZGlmCisgICAge01OR19VSU5UX01FTkQsIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX2dlbmVyYWwsIG1uZ19yZWFkX2dlbmVyYWwsIG1uZ193cml0ZV9tZW5kLCBtbmdfYXNzaWduX2dlbmVyYWwsIDAsIDAsIHNpemVvZihtbmdfbWVuZCksICZtbmdfY2h1bmtfZGVzY3JfbWVuZH0sCisgICAge01OR19VSU5UX01IRFIsIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX2dlbmVyYWwsIG1uZ19yZWFkX2dlbmVyYWwsIG1uZ193cml0ZV9taGRyLCBtbmdfYXNzaWduX2dlbmVyYWwsIDAsIDAsIHNpemVvZihtbmdfbWhkciksICZtbmdfY2h1bmtfZGVzY3JfbWhkcn0sCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfTU9WRQorICAgIHtNTkdfVUlOVF9NT1ZFLCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9nZW5lcmFsLCBtbmdfcmVhZF9nZW5lcmFsLCBtbmdfd3JpdGVfbW92ZSwgbW5nX2Fzc2lnbl9nZW5lcmFsLCAwLCAwLCBzaXplb2YobW5nX21vdmUpLCAmbW5nX2NodW5rX2Rlc2NyX21vdmV9LAorI2VuZGlmCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19PUkRSCisgICAge01OR19VSU5UX09SRFIsIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX29yZHIsICAgIG1uZ19yZWFkX2dlbmVyYWwsIG1uZ193cml0ZV9vcmRyLCBtbmdfYXNzaWduX29yZHIsICAgIDAsIDAsIHNpemVvZihtbmdfb3JkciksICZtbmdfY2h1bmtfZGVzY3Jfb3Jkcn0sCisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX1BBU1QKKyAgICB7TU5HX1VJTlRfUEFTVCwgbW5nX2luaXRfZ2VuZXJhbCwgbW5nX2ZyZWVfcGFzdCwgICAgbW5nX3JlYWRfZ2VuZXJhbCwgbW5nX3dyaXRlX3Bhc3QsIG1uZ19hc3NpZ25fcGFzdCwgICAgMCwgMCwgc2l6ZW9mKG1uZ19wYXN0KSwgJm1uZ19jaHVua19kZXNjcl9wYXN0fSwKKyNlbmRpZgorICAgIHtNTkdfVUlOVF9QTFRFLCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9nZW5lcmFsLCBtbmdfcmVhZF9nZW5lcmFsLCBtbmdfd3JpdGVfcGx0ZSwgbW5nX2Fzc2lnbl9nZW5lcmFsLCAwLCAwLCBzaXplb2YobW5nX3BsdGUpLCAmbW5nX2NodW5rX2Rlc2NyX3BsdGV9LAorI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisgICAge01OR19VSU5UX1BQTFQsIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX2dlbmVyYWwsIG1uZ19yZWFkX2dlbmVyYWwsIG1uZ193cml0ZV9wcGx0LCBtbmdfYXNzaWduX2dlbmVyYWwsIDAsIDAsIHNpemVvZihtbmdfcHBsdCksICZtbmdfY2h1bmtfZGVzY3JfcHBsdH0sCisgICAge01OR19VSU5UX1BST00sIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX2dlbmVyYWwsIG1uZ19yZWFkX2dlbmVyYWwsIG1uZ193cml0ZV9wcm9tLCBtbmdfYXNzaWduX2dlbmVyYWwsIDAsIDAsIHNpemVvZihtbmdfcHJvbSksICZtbmdfY2h1bmtfZGVzY3JfcHJvbX0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19TQVZFCisgICAge01OR19VSU5UX1NBVkUsIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX3NhdmUsICAgIG1uZ19yZWFkX2dlbmVyYWwsIG1uZ193cml0ZV9zYXZlLCBtbmdfYXNzaWduX3NhdmUsICAgIDAsIDAsIHNpemVvZihtbmdfc2F2ZSksICZtbmdfY2h1bmtfZGVzY3Jfc2F2ZX0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19TRUVLCisgICAge01OR19VSU5UX1NFRUssIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX3NlZWssICAgIG1uZ19yZWFkX2dlbmVyYWwsIG1uZ193cml0ZV9zZWVrLCBtbmdfYXNzaWduX3NlZWssICAgIDAsIDAsIHNpemVvZihtbmdfc2VlayksICZtbmdfY2h1bmtfZGVzY3Jfc2Vla30sCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19TSE9XCisgICAge01OR19VSU5UX1NIT1csIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX2dlbmVyYWwsIG1uZ19yZWFkX2dlbmVyYWwsIG1uZ193cml0ZV9zaG93LCBtbmdfYXNzaWduX2dlbmVyYWwsIDAsIDAsIHNpemVvZihtbmdfc2hvdyksICZtbmdfY2h1bmtfZGVzY3Jfc2hvd30sCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19URVJNCisgICAge01OR19VSU5UX1RFUk0sIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX2dlbmVyYWwsIG1uZ19yZWFkX2dlbmVyYWwsIG1uZ193cml0ZV90ZXJtLCBtbmdfYXNzaWduX2dlbmVyYWwsIDAsIDAsIHNpemVvZihtbmdfdGVybSksICZtbmdfY2h1bmtfZGVzY3JfdGVybX0sCisjZW5kaWYKKyNpZmRlZiBNTkdfSU5DTFVERV9BTkdfUFJPUE9TQUwKKyAgICB7TU5HX1VJTlRfYWRBVCwgbW5nX2luaXRfZ2VuZXJhbCwgbW5nX2ZyZWVfYWRhdCwgICAgbW5nX3JlYWRfZ2VuZXJhbCwgbW5nX3dyaXRlX2FkYXQsIG1uZ19hc3NpZ25fYWRhdCwgICAgMCwgMCwgc2l6ZW9mKG1uZ19hZGF0KSwgJm1uZ19jaHVua19kZXNjcl9hZGF0fSwKKyAgICB7TU5HX1VJTlRfYWhEUiwgbW5nX2luaXRfZ2VuZXJhbCwgbW5nX2ZyZWVfZ2VuZXJhbCwgbW5nX3JlYWRfZ2VuZXJhbCwgbW5nX3dyaXRlX2FoZHIsIG1uZ19hc3NpZ25fYWhkciwgICAgMCwgMCwgc2l6ZW9mKG1uZ19haGRyKSwgJm1uZ19jaHVua19kZXNjcl9haGRyfSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX2JLR0QKKyAgICB7TU5HX1VJTlRfYktHRCwgbW5nX2luaXRfZ2VuZXJhbCwgbW5nX2ZyZWVfZ2VuZXJhbCwgbW5nX3JlYWRfZ2VuZXJhbCwgbW5nX3dyaXRlX2JrZ2QsIG1uZ19hc3NpZ25fZ2VuZXJhbCwgMCwgMCwgc2l6ZW9mKG1uZ19ia2dkKSwgJm1uZ19jaHVua19kZXNjcl9ia2dkfSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX2NIUk0KKyAgICB7TU5HX1VJTlRfY0hSTSwgbW5nX2luaXRfZ2VuZXJhbCwgbW5nX2ZyZWVfZ2VuZXJhbCwgbW5nX3JlYWRfZ2VuZXJhbCwgbW5nX3dyaXRlX2Nocm0sIG1uZ19hc3NpZ25fZ2VuZXJhbCwgMCwgMCwgc2l6ZW9mKG1uZ19jaHJtKSwgJm1uZ19jaHVua19kZXNjcl9jaHJtfSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX2VYUEkKKyAgICB7TU5HX1VJTlRfZVhQSSwgbW5nX2luaXRfZ2VuZXJhbCwgbW5nX2ZyZWVfZXhwaSwgICAgbW5nX3JlYWRfZ2VuZXJhbCwgbW5nX3dyaXRlX2V4cGksIG1uZ19hc3NpZ25fZXhwaSwgICAgMCwgMCwgc2l6ZW9mKG1uZ19leHBpKSwgJm1uZ19jaHVua19kZXNjcl9leHBpfSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX2V2TlQKKyAgICB7TU5HX1VJTlRfZXZOVCwgbW5nX2luaXRfZ2VuZXJhbCwgbW5nX2ZyZWVfZXZudCwgICAgbW5nX3JlYWRfZ2VuZXJhbCwgbW5nX3dyaXRlX2V2bnQsIG1uZ19hc3NpZ25fZXZudCwgICAgMCwgMCwgc2l6ZW9mKG1uZ19ldm50KSwgJm1uZ19jaHVua19kZXNjcl9ldm50fSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX2ZQUkkKKyAgICB7TU5HX1VJTlRfZlBSSSwgbW5nX2luaXRfZ2VuZXJhbCwgbW5nX2ZyZWVfZ2VuZXJhbCwgbW5nX3JlYWRfZ2VuZXJhbCwgbW5nX3dyaXRlX2ZwcmksIG1uZ19hc3NpZ25fZ2VuZXJhbCwgMCwgMCwgc2l6ZW9mKG1uZ19mcHJpKSwgJm1uZ19jaHVua19kZXNjcl9mcHJpfSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX2dBTUEKKyAgICB7TU5HX1VJTlRfZ0FNQSwgbW5nX2luaXRfZ2VuZXJhbCwgbW5nX2ZyZWVfZ2VuZXJhbCwgbW5nX3JlYWRfZ2VuZXJhbCwgbW5nX3dyaXRlX2dhbWEsIG1uZ19hc3NpZ25fZ2VuZXJhbCwgMCwgMCwgc2l6ZW9mKG1uZ19nYW1hKSwgJm1uZ19jaHVua19kZXNjcl9nYW1hfSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX2hJU1QKKyAgICB7TU5HX1VJTlRfaElTVCwgbW5nX2luaXRfZ2VuZXJhbCwgbW5nX2ZyZWVfZ2VuZXJhbCwgbW5nX3JlYWRfZ2VuZXJhbCwgbW5nX3dyaXRlX2hpc3QsIG1uZ19hc3NpZ25fZ2VuZXJhbCwgMCwgMCwgc2l6ZW9mKG1uZ19oaXN0KSwgJm1uZ19jaHVua19kZXNjcl9oaXN0fSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX2lDQ1AKKyAgICB7TU5HX1VJTlRfaUNDUCwgbW5nX2luaXRfZ2VuZXJhbCwgbW5nX2ZyZWVfaWNjcCwgICAgbW5nX3JlYWRfZ2VuZXJhbCwgbW5nX3dyaXRlX2ljY3AsIG1uZ19hc3NpZ25faWNjcCwgICAgMCwgMCwgc2l6ZW9mKG1uZ19pY2NwKSwgJm1uZ19jaHVua19kZXNjcl9pY2NwfSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX2lUWHQKKyAgICB7TU5HX1VJTlRfaVRYdCwgbW5nX2luaXRfZ2VuZXJhbCwgbW5nX2ZyZWVfaXR4dCwgICAgbW5nX3JlYWRfZ2VuZXJhbCwgbW5nX3dyaXRlX2l0eHQsIG1uZ19hc3NpZ25faXR4dCwgICAgMCwgMCwgc2l6ZW9mKG1uZ19pdHh0KSwgJm1uZ19jaHVua19kZXNjcl9pdHh0fSwKKyNlbmRpZgorI2lmZGVmIE1OR19JTkNMVURFX01QTkdfUFJPUE9TQUwKKyAgICB7TU5HX1VJTlRfbXBORywgbW5nX2luaXRfZ2VuZXJhbCwgbW5nX2ZyZWVfbXBuZywgICAgbW5nX3JlYWRfZ2VuZXJhbCwgbW5nX3dyaXRlX21wbmcsIG1uZ19hc3NpZ25fbXBuZywgICAgMCwgMCwgc2l6ZW9mKG1uZ19tcG5nKSwgJm1uZ19jaHVua19kZXNjcl9tcG5nfSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX25FRUQKKyAgICB7TU5HX1VJTlRfbkVFRCwgbW5nX2luaXRfZ2VuZXJhbCwgbW5nX2ZyZWVfbmVlZCwgICAgbW5nX3JlYWRfZ2VuZXJhbCwgbW5nX3dyaXRlX25lZWQsIG1uZ19hc3NpZ25fbmVlZCwgICAgMCwgMCwgc2l6ZW9mKG1uZ19uZWVkKSwgJm1uZ19jaHVua19kZXNjcl9uZWVkfSwKKyNlbmRpZgorLyogVE9ETzogICAgIHtNTkdfVUlOVF9vRkZzLCAwLCAwLCAwLCAwLCAwLCAwfSwgICovCisvKiBUT0RPOiAgICAge01OR19VSU5UX3BDQUwsIDAsIDAsIDAsIDAsIDAsIDB9LCAgKi8KKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19wSFlnCisgICAge01OR19VSU5UX3BIWWcsIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX2dlbmVyYWwsIG1uZ19yZWFkX2dlbmVyYWwsIG1uZ193cml0ZV9waHlnLCBtbmdfYXNzaWduX2dlbmVyYWwsIDAsIDAsIHNpemVvZihtbmdfcGh5ZyksICZtbmdfY2h1bmtfZGVzY3JfcGh5Z30sCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19wSFlzCisgICAge01OR19VSU5UX3BIWXMsIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX2dlbmVyYWwsIG1uZ19yZWFkX2dlbmVyYWwsIG1uZ193cml0ZV9waHlzLCBtbmdfYXNzaWduX2dlbmVyYWwsIDAsIDAsIHNpemVvZihtbmdfcGh5cyksICZtbmdfY2h1bmtfZGVzY3JfcGh5c30sCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19zQklUCisgICAge01OR19VSU5UX3NCSVQsIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX2dlbmVyYWwsIG1uZ19yZWFkX2dlbmVyYWwsIG1uZ193cml0ZV9zYml0LCBtbmdfYXNzaWduX2dlbmVyYWwsIDAsIDAsIHNpemVvZihtbmdfc2JpdCksICZtbmdfY2h1bmtfZGVzY3Jfc2JpdH0sCisjZW5kaWYKKy8qIFRPRE86ICAgICB7TU5HX1VJTlRfc0NBTCwgMCwgMCwgMCwgMCwgMCwgMH0sICAqLworI2lmbmRlZiBNTkdfU0tJUENIVU5LX3NQTFQKKyAgICB7TU5HX1VJTlRfc1BMVCwgbW5nX2luaXRfZ2VuZXJhbCwgbW5nX2ZyZWVfc3BsdCwgICAgbW5nX3JlYWRfZ2VuZXJhbCwgbW5nX3dyaXRlX3NwbHQsIG1uZ19hc3NpZ25fc3BsdCwgICAgMCwgMCwgc2l6ZW9mKG1uZ19zcGx0KSwgJm1uZ19jaHVua19kZXNjcl9zcGx0fSwKKyNlbmRpZgorICAgIHtNTkdfVUlOVF9zUkdCLCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9nZW5lcmFsLCBtbmdfcmVhZF9nZW5lcmFsLCBtbmdfd3JpdGVfc3JnYiwgbW5nX2Fzc2lnbl9nZW5lcmFsLCAwLCAwLCBzaXplb2YobW5nX3NyZ2IpLCAmbW5nX2NodW5rX2Rlc2NyX3NyZ2J9LAorI2lmbmRlZiBNTkdfU0tJUENIVU5LX3RFWHQKKyAgICB7TU5HX1VJTlRfdEVYdCwgbW5nX2luaXRfZ2VuZXJhbCwgbW5nX2ZyZWVfdGV4dCwgICAgbW5nX3JlYWRfZ2VuZXJhbCwgbW5nX3dyaXRlX3RleHQsIG1uZ19hc3NpZ25fdGV4dCwgICAgMCwgMCwgc2l6ZW9mKG1uZ190ZXh0KSwgJm1uZ19jaHVua19kZXNjcl90ZXh0fSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX3RJTUUKKyAgICB7TU5HX1VJTlRfdElNRSwgbW5nX2luaXRfZ2VuZXJhbCwgbW5nX2ZyZWVfZ2VuZXJhbCwgbW5nX3JlYWRfZ2VuZXJhbCwgbW5nX3dyaXRlX3RpbWUsIG1uZ19hc3NpZ25fZ2VuZXJhbCwgMCwgMCwgc2l6ZW9mKG1uZ190aW1lKSwgJm1uZ19jaHVua19kZXNjcl90aW1lfSwKKyNlbmRpZgorICAgIHtNTkdfVUlOVF90Uk5TLCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9nZW5lcmFsLCBtbmdfcmVhZF9nZW5lcmFsLCBtbmdfd3JpdGVfdHJucywgbW5nX2Fzc2lnbl9nZW5lcmFsLCAwLCAwLCBzaXplb2YobW5nX3RybnMpLCAmbW5nX2NodW5rX2Rlc2NyX3RybnN9LAorI2lmbmRlZiBNTkdfU0tJUENIVU5LX3pUWHQKKyAgICB7TU5HX1VJTlRfelRYdCwgbW5nX2luaXRfZ2VuZXJhbCwgbW5nX2ZyZWVfenR4dCwgICAgbW5nX3JlYWRfZ2VuZXJhbCwgbW5nX3dyaXRlX3p0eHQsIG1uZ19hc3NpZ25fenR4dCwgICAgMCwgMCwgc2l6ZW9mKG1uZ196dHh0KSwgJm1uZ19jaHVua19kZXNjcl96dHh0fSwKKyNlbmRpZgorICB9OworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKwordm9pZCBtbmdfZ2V0X2NodW5raGVhZGVyIChtbmdfY2h1bmtpZCAgICAgICBpQ2h1bmtuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfY2h1bmtfaGVhZGVycCBwUmVzdWx0KQoreworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYmluYXJ5IHNlYXJjaCB2YXJpYWJsZXMgKi8KKyAgbW5nX2ludDMyICAgICAgICAgaVRvcCwgaUxvd2VyLCBpVXBwZXIsIGlNaWRkbGU7CisgIG1uZ19jaHVua19oZWFkZXJwIHBFbnRyeTsgICAgICAgICAgICAvKiBwb2ludGVyIHRvIGZvdW5kIGVudHJ5ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZXRlcm1pbmUgbWF4IGluZGV4IG9mIHRhYmxlICovCisgIGlUb3AgPSAoc2l6ZW9mIChtbmdfY2h1bmtfdGFibGUpIC8gc2l6ZW9mIChtbmdfY2h1bmtfdGFibGUgWzBdKSkgLSAxOworCisgIC8qIGJpbmFyeSBzZWFyY2g7IHdpdGggNTQgY2h1bmtzLCB3b3JzdC1jYXNlIGlzIDcgY29tcGFyaXNvbnMgKi8KKyAgaUxvd2VyICA9IDA7CisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKKyAgaU1pZGRsZSA9IDExOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0IHdpdGggdGhlIElEQVQgZW50cnkgKi8KKyNlbHNlCisgIGlNaWRkbGUgPSA4OworI2VuZGlmCisgIGlVcHBlciAgPSBpVG9wOworICBwRW50cnkgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm8gZ29vZHMgeWV0ISAqLworCisgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGUgYmluYXJ5IHNlYXJjaCBpdHNlbGYgKi8KKyAgICB7CisgICAgICBpZiAobW5nX2NodW5rX3RhYmxlIFtpTWlkZGxlXS5pQ2h1bmtuYW1lIDwgaUNodW5rbmFtZSkKKyAgICAgICAgaUxvd2VyID0gaU1pZGRsZSArIDE7CisgICAgICBlbHNlIGlmIChtbmdfY2h1bmtfdGFibGUgW2lNaWRkbGVdLmlDaHVua25hbWUgPiBpQ2h1bmtuYW1lKQorICAgICAgICBpVXBwZXIgPSBpTWlkZGxlIC0gMTsKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgcEVudHJ5ID0gJm1uZ19jaHVua190YWJsZSBbaU1pZGRsZV07CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaU1pZGRsZSA9IChpTG93ZXIgKyBpVXBwZXIpID4+IDE7CisgICAgfQorICB3aGlsZSAoaUxvd2VyIDw9IGlVcHBlcik7CisKKyAgaWYgKCFwRW50cnkpICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVua25vd24gY2h1bmsgPyAqLworICAgIHBFbnRyeSA9ICZtbmdfY2h1bmtfdW5rbm93bjsgICAgICAgLyogbWFrZSBpdCBzbyEgKi8KKworICBNTkdfQ09QWSAocFJlc3VsdCwgcEVudHJ5LCBzaXplb2YobW5nX2NodW5rX2hlYWRlcikpOworCisgIHJldHVybjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiBQTkcgY2h1bmtzICovCisKK01OR19DX1NQRUNJQUxGVU5DIChtbmdfc3BlY2lhbF9paGRyKQoreworICBwRGF0YS0+Ykhhc0lIRFIgICAgICA9IE1OR19UUlVFOyAgICAgLyogaW5kaWNhdGUgSUhEUiBpcyBwcmVzZW50ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgc3RvcmUgaW50ZXJlc3RpbmcgZmllbGRzICovCisgIGlmICgoIXBEYXRhLT5iSGFzREhEUikgfHwgKHBEYXRhLT5pRGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfTk9DSEFOR0UpKQorICB7CisgICAgcERhdGEtPmlEYXRhd2lkdGggID0gKChtbmdfaWhkcnApcENodW5rKS0+aVdpZHRoOworICAgIHBEYXRhLT5pRGF0YWhlaWdodCA9ICgobW5nX2loZHJwKXBDaHVuayktPmlIZWlnaHQ7CisgIH0KKworICBwRGF0YS0+aUJpdGRlcHRoICAgICA9ICgobW5nX2loZHJwKXBDaHVuayktPmlCaXRkZXB0aDsKKyAgcERhdGEtPmlDb2xvcnR5cGUgICAgPSAoKG1uZ19paGRycClwQ2h1bmspLT5pQ29sb3J0eXBlOworICBwRGF0YS0+aUNvbXByZXNzaW9uICA9ICgobW5nX2loZHJwKXBDaHVuayktPmlDb21wcmVzc2lvbjsKKyAgcERhdGEtPmlGaWx0ZXIgICAgICAgPSAoKG1uZ19paGRycClwQ2h1bmspLT5pRmlsdGVyOworICBwRGF0YS0+aUludGVybGFjZSAgICA9ICgobW5nX2loZHJwKXBDaHVuayktPmlJbnRlcmxhY2U7CisKKyNpZiBkZWZpbmVkKE1OR19OT18xXzJfNEJJVF9TVVBQT1JUKSB8fCBkZWZpbmVkKE1OR19OT18xNkJJVF9TVVBQT1JUKQorICBwRGF0YS0+aVBOR211bHQgPSAxOworICBwRGF0YS0+aVBOR2RlcHRoID0gcERhdGEtPmlCaXRkZXB0aDsKKyNlbmRpZgorCisjaWZkZWYgTU5HX05PXzFfMl80QklUX1NVUFBPUlQKKyAgaWYgKHBEYXRhLT5pQml0ZGVwdGggPCA4KQorICAgICAgcERhdGEtPmlCaXRkZXB0aCA9IDg7CisjZW5kaWYKKworI2lmZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgIGlmIChwRGF0YS0+aUJpdGRlcHRoID4gOCkKKyAgICB7CisgICAgICBwRGF0YS0+aUJpdGRlcHRoID0gODsKKyAgICAgIHBEYXRhLT5pUE5HbXVsdCA9IDI7CisgICAgfQorI2VuZGlmCisKKyAgaWYgKChwRGF0YS0+aUJpdGRlcHRoICE9ICA4KSAgICAgIC8qIHBhcmFtZXRlciB2YWxpZGl0eSBjaGVja3MgKi8KKyNpZm5kZWYgTU5HX05PXzFfMl80QklUX1NVUFBPUlQKKyAgICAgICYmIChwRGF0YS0+aUJpdGRlcHRoICE9ICAxKSAmJgorICAgICAgKHBEYXRhLT5pQml0ZGVwdGggIT0gIDIpICYmCisgICAgICAocERhdGEtPmlCaXRkZXB0aCAhPSAgNCkKKyNlbmRpZgorI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgICAgJiYgKHBEYXRhLT5pQml0ZGVwdGggIT0gMTYpICAgCisjZW5kaWYKKyAgICAgICkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJREJJVERFUFRIKTsKKworICBpZiAoKHBEYXRhLT5pQ29sb3J0eXBlICE9IE1OR19DT0xPUlRZUEVfR1JBWSAgICkgJiYKKyAgICAgIChwRGF0YS0+aUNvbG9ydHlwZSAhPSBNTkdfQ09MT1JUWVBFX1JHQiAgICApICYmCisgICAgICAocERhdGEtPmlDb2xvcnR5cGUgIT0gTU5HX0NPTE9SVFlQRV9JTkRFWEVEKSAmJgorICAgICAgKHBEYXRhLT5pQ29sb3J0eXBlICE9IE1OR19DT0xPUlRZUEVfR1JBWUEgICkgJiYKKyAgICAgIChwRGF0YS0+aUNvbG9ydHlwZSAhPSBNTkdfQ09MT1JUWVBFX1JHQkEgICApICAgICkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRENPTE9SVFlQRSk7CisKKyAgaWYgKChwRGF0YS0+aUNvbG9ydHlwZSA9PSBNTkdfQ09MT1JUWVBFX0lOREVYRUQpICYmIChwRGF0YS0+aUJpdGRlcHRoID4gOCkpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURCSVRERVBUSCk7CisKKyAgaWYgKCgocERhdGEtPmlDb2xvcnR5cGUgPT0gTU5HX0NPTE9SVFlQRV9SR0IgICAgKSB8fAorICAgICAgIChwRGF0YS0+aUNvbG9ydHlwZSA9PSBNTkdfQ09MT1JUWVBFX0dSQVlBICApIHx8CisgICAgICAgKHBEYXRhLT5pQ29sb3J0eXBlID09IE1OR19DT0xPUlRZUEVfUkdCQSAgICkgICAgKSAmJgorICAgICAgKHBEYXRhLT5pQml0ZGVwdGggPCA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgICAgKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElEQklUREVQVEgpOworCisgIGlmIChwRGF0YS0+aUNvbXByZXNzaW9uICE9IE1OR19DT01QUkVTU0lPTl9ERUZMQVRFKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElEQ09NUFJFU1MpOworCisjaWYgZGVmaW5lZChGSUxURVIxOTIpIHx8IGRlZmluZWQoRklMVEVSMTkzKQorICBpZiAoKHBEYXRhLT5pRmlsdGVyICE9IE1OR19GSUxURVJfQURBUFRJVkUgKSAmJgorI2lmIGRlZmluZWQoRklMVEVSMTkyKSAmJiBkZWZpbmVkKEZJTFRFUjE5MykKKyAgICAgIChwRGF0YS0+aUZpbHRlciAhPSBNTkdfRklMVEVSX0RJRkZFUklORykgJiYKKyAgICAgIChwRGF0YS0+aUZpbHRlciAhPSBNTkdfRklMVEVSX05PRklMVEVSICkgICAgKQorI2Vsc2UKKyNpZmRlZiBGSUxURVIxOTIKKyAgICAgIChwRGF0YS0+aUZpbHRlciAhPSBNTkdfRklMVEVSX0RJRkZFUklORykgICAgKQorI2Vsc2UKKyAgICAgIChwRGF0YS0+aUZpbHRlciAhPSBNTkdfRklMVEVSX05PRklMVEVSICkgICAgKQorI2VuZGlmCisjZW5kaWYKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJREZJTFRFUik7CisjZWxzZQorICBpZiAocERhdGEtPmlGaWx0ZXIpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURGSUxURVIpOworI2VuZGlmCisKKyAgaWYgKChwRGF0YS0+aUludGVybGFjZSAhPSBNTkdfSU5URVJMQUNFX05PTkUgKSAmJgorICAgICAgKHBEYXRhLT5pSW50ZXJsYWNlICE9IE1OR19JTlRFUkxBQ0VfQURBTTcpICAgICkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRElOVEVSTEFDRSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZIAorI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisgIGlmIChwRGF0YS0+Ykhhc0RIRFIpICAgICAgICAgICAgICAgICAvKiBjaGVjayB0aGUgY29sb3J0eXBlIGZvciBkZWx0YS1pbWFnZXMgISAqLworICB7CisgICAgbW5nX2ltYWdlZGF0YXAgcEJ1ZiA9ICgobW5nX2ltYWdlcClwRGF0YS0+cE9ianplcm8pLT5wSW1nYnVmOworCisgICAgaWYgKHBEYXRhLT5pQ29sb3J0eXBlICE9IHBCdWYtPmlDb2xvcnR5cGUpCisgICAgeworICAgICAgaWYgKCAoIChwRGF0YS0+aUNvbG9ydHlwZSAhPSBNTkdfQ09MT1JUWVBFX0lOREVYRUQpIHx8CisgICAgICAgICAgICAgKHBCdWYtPmlDb2xvcnR5cGUgID09IE1OR19DT0xPUlRZUEVfR1JBWSAgICkgICAgKSAmJgorICAgICAgICAgICAoIChwRGF0YS0+aUNvbG9ydHlwZSAhPSBNTkdfQ09MT1JUWVBFX0dSQVkgICApIHx8CisgICAgICAgICAgICAgKHBCdWYtPmlDb2xvcnR5cGUgID09IE1OR19DT0xPUlRZUEVfSU5ERVhFRCkgICAgKSAgICApCisgICAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElEQ09MT1JUWVBFKTsKKyAgICB9CisgIH0KKyNlbmRpZgorI2VuZGlmCisKKyAgaWYgKCFwRGF0YS0+Ykhhc2hlYWRlcikgICAgICAgICAgICAgIC8qIGZpcnN0IGNodW5rID8gKi8KKyAgeworICAgIHBEYXRhLT5iSGFzaGVhZGVyID0gTU5HX1RSVUU7ICAgICAgLyogd2UndmUgZ290IGEgaGVhZGVyICovCisgICAgcERhdGEtPmVJbWFnZXR5cGUgPSBtbmdfaXRfcG5nOyAgICAvKiB0aGVuIHRoaXMgbXVzdCBiZSBhIFBORyAqLworICAgIHBEYXRhLT5pV2lkdGggICAgID0gcERhdGEtPmlEYXRhd2lkdGg7CisgICAgcERhdGEtPmlIZWlnaHQgICAgPSBwRGF0YS0+aURhdGFoZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcmVkaWN0IGFscGhhLWRlcHRoICEgKi8KKyAgICBpZiAoKHBEYXRhLT5pQ29sb3J0eXBlID09IE1OR19DT0xPUlRZUEVfR1JBWUEgICkgfHwKKyAgICAgICAgKHBEYXRhLT5pQ29sb3J0eXBlID09IE1OR19DT0xPUlRZUEVfUkdCQSAgICkgICAgKQorICAgICAgcERhdGEtPmlBbHBoYWRlcHRoID0gcERhdGEtPmlCaXRkZXB0aDsKKyAgICBlbHNlCisgICAgaWYgKHBEYXRhLT5pQ29sb3J0eXBlID09IE1OR19DT0xPUlRZUEVfSU5ERVhFRCkKKyAgICAgIHBEYXRhLT5pQWxwaGFkZXB0aCA9IDg7ICAgICAgICAgIC8qIHdvcnN0IGNhc2Ugc2NlbmFyaW8gKi8KKyAgICBlbHNlCisgICAgICBwRGF0YS0+aUFscGhhZGVwdGggPSAxOyAgLyogUG9zc2libGUgdFJOUyBjaGVhcCBiaW5hcnkgdHJhbnNwYXJlbmN5ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaXRzIG9uIG1heGltdW0gY2FudmFzID8gKi8KKyAgICBpZiAoKHBEYXRhLT5pV2lkdGggPiBwRGF0YS0+aU1heHdpZHRoKSB8fCAocERhdGEtPmlIZWlnaHQgPiBwRGF0YS0+aU1heGhlaWdodCkpCisgICAgICBNTkdfV0FSTklORyAocERhdGEsIE1OR19JTUFHRVRPT0xBUkdFKTsKKworI2lmICFkZWZpbmVkKE1OR19JTkNMVURFX01QTkdfUFJPUE9TQUwpIHx8ICFkZWZpbmVkKE1OR19TVVBQT1JUX0RJU1BMQVkpCisgICAgaWYgKHBEYXRhLT5mUHJvY2Vzc2hlYWRlcikgICAgICAgICAvKiBpbmZvcm0gdGhlIGFwcCA/ICovCisgICAgICBpZiAoIXBEYXRhLT5mUHJvY2Vzc2hlYWRlciAoKChtbmdfaGFuZGxlKXBEYXRhKSwgcERhdGEtPmlXaWR0aCwgcERhdGEtPmlIZWlnaHQpKQorICAgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfQVBQTUlTQ0VSUk9SKTsKKyNlbmRpZgorICB9CisKKyAgaWYgKCFwRGF0YS0+Ykhhc0RIRFIpCisgICAgcERhdGEtPmlJbWFnZWxldmVsKys7ICAgICAgICAgICAgICAvKiBvbmUgbGV2ZWwgZGVlcGVyICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCisgIHJldHVybiBtbmdfcHJvY2Vzc19kaXNwbGF5X2loZHIgKHBEYXRhKTsKKyNlbHNlCisgIHJldHVybiBNTkdfTk9FUlJPUjsgICAgICAgICAgICAgICAgIAorI2VuZGlmIC8qIE1OR19TVVBQT1JUX0RJU1BMQVkgKi8KK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworTU5HX0ZfU1BFQ0lBTEZVTkMgKG1uZ19kZWJ1bmtfcGx0ZSkKK3sKKyAgbW5nX3BsdGVwICBwUExURSAgICA9IChtbmdfcGx0ZXApcENodW5rOworICBtbmdfdWludDMyIGlSYXdsZW4gID0gKnBpUmF3bGVuOworICBtbmdfdWludDhwIHBSYXdkYXRhID0gKnBwUmF3ZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBtdXN0IGJlIG11bHRpcGxlIG9mIDMgKi8KKyAgaWYgKCgoaVJhd2xlbiAlIDMpICE9IDApIHx8IChpUmF3bGVuID4gNzY4KSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRExFTkdUSCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGlzIGlzIHRoZSBleGFjdCBsZW5ndGggKi8KKyAgcFBMVEUtPmlFbnRyeWNvdW50ID0gaVJhd2xlbiAvIDM7CisKKyAgTU5HX0NPUFkgKHBQTFRFLT5hRW50cmllcywgcFJhd2RhdGEsIGlSYXdsZW4pOworCisgICpwaVJhd2xlbiA9IDA7CisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitNTkdfQ19TUEVDSUFMRlVOQyAobW5nX3NwZWNpYWxfcGx0ZSkKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG11bHRpcGxlIFBMVEUgb25seSBpbnNpZGUgQkFTSSAqLworICBpZiAoKHBEYXRhLT5iSGFzUExURSkgJiYgKCFwRGF0YS0+Ykhhc0JBU0kpKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19NVUxUSVBMRUVSUk9SKTsKKworICBpZiAoKHBEYXRhLT5iSGFzSUhEUikgfHwgKHBEYXRhLT5iSGFzQkFTSSkgfHwgKHBEYXRhLT5iSGFzREhEUikpCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvbmx5IGFsbG93ZWQgZm9yIGluZGV4ZWQtY29sb3Igb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnYihhKS1jb2xvciEgKi8KKyAgICBpZiAoKHBEYXRhLT5pQ29sb3J0eXBlICE9IE1OR19DT0xPUlRZUEVfUkdCICAgICkgJiYKKyAgICAgICAgKHBEYXRhLT5pQ29sb3J0eXBlICE9IE1OR19DT0xPUlRZUEVfSU5ERVhFRCkgJiYKKyAgICAgICAgKHBEYXRhLT5pQ29sb3J0eXBlICE9IE1OR19DT0xPUlRZUEVfUkdCQSAgICkgICApCisgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfQ0hVTktOT1RBTExPV0VEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVtcHR5IG9ubHkgYWxsb3dlZCBpZiBnbG9iYWwgcHJlc2VudCAqLworICAgIGlmICgoKChtbmdfcGx0ZXApcENodW5rKS0+YkVtcHR5KSAmJiAoIXBEYXRhLT5iSGFzZ2xvYmFsUExURSkpCisgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfQ0FOTk9UQkVFTVBUWSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgaWYgKCgobW5nX3BsdGVwKXBDaHVuayktPmJFbXB0eSkgICAvKiBjYW5ub3QgYmUgZW1wdHkgYXMgZ2xvYmFsISAqLworICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0NBTk5PVEJFRU1QVFkpOworICB9CisKKyAgaWYgKChwRGF0YS0+Ykhhc0lIRFIpIHx8IChwRGF0YS0+Ykhhc0JBU0kpIHx8IChwRGF0YS0+Ykhhc0RIRFIpKQorICAgIHBEYXRhLT5iSGFzUExURSA9IE1OR19UUlVFOyAgICAgICAgLyogZ290IGl0ISAqLworICBlbHNlCisgICAgcERhdGEtPmJIYXNnbG9iYWxQTFRFID0gTU5HX1RSVUU7CisKKyAgcERhdGEtPmlQTFRFY291bnQgPSAoKG1uZ19wbHRlcClwQ2h1bmspLT5pRW50cnljb3VudDsKKworI2lmZGVmIE1OR19TVVBQT1JUX0RJU1BMQVkKKyAgaWYgKChwRGF0YS0+Ykhhc0lIRFIpIHx8IChwRGF0YS0+Ykhhc0JBU0kpIHx8IChwRGF0YS0+Ykhhc0RIRFIpKQorICB7CisgICAgbW5nX2ltYWdlcCAgICAgcEltYWdlOworICAgIG1uZ19pbWFnZWRhdGFwIHBCdWY7CisKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworICAgIGlmIChwRGF0YS0+Ykhhc0RIRFIpICAgICAgICAgICAgICAgLyogcHJvY2Vzc2luZyBkZWx0YS1pbWFnZSA/ICovCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZSBpbiBvYmplY3QgMCAhISEgKi8KKyAgICAgIHBJbWFnZSAgICAgICAgICAgPSAobW5nX2ltYWdlcClwRGF0YS0+cE9ianplcm87CisgICAgICBwQnVmICAgICAgICAgICAgID0gcEltYWdlLT5wSW1nYnVmOworICAgICAgcEJ1Zi0+Ykhhc1BMVEUgICA9IE1OR19UUlVFOyAgICAgLyogaXQncyBkZWZpbml0ZWx5IGdvdCBhIFBMVEUgbm93ICovCisgICAgICBwQnVmLT5pUExURWNvdW50ID0gKChtbmdfcGx0ZXApcENodW5rKS0+aUVudHJ5Y291bnQ7CisgICAgICBNTkdfQ09QWSAocEJ1Zi0+YVBMVEVlbnRyaWVzLCAoKG1uZ19wbHRlcClwQ2h1bmspLT5hRW50cmllcywKKyAgICAgICAgICAgICAgICBzaXplb2YgKHBCdWYtPmFQTFRFZW50cmllcykpOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCB0aGUgY3VycmVudCBvYmplY3QgKi8KKyAgICAgIHBJbWFnZSA9IChtbmdfaW1hZ2VwKXBEYXRhLT5wQ3VycmVudG9iajsKKyAgICAgIGlmICghcEltYWdlKSAgICAgICAgICAgICAgICAgICAgIC8qIG5vIG9iamVjdCB0aGVuIGR1bXAgaXQgaW4gb2JqIDAgKi8KKyAgICAgICAgcEltYWdlID0gKG1uZ19pbWFnZXApcERhdGEtPnBPYmp6ZXJvOworCisgICAgICBwQnVmID0gcEltYWdlLT5wSW1nYnVmOyAgICAgICAgICAvKiBhZGRyZXNzIHRoZSBvYmplY3QgYnVmZmVyICovCisgICAgICBwQnVmLT5iSGFzUExURSA9IE1OR19UUlVFOyAgICAgICAvKiBhbmQgdGVsbCBpdCBpdCdzIGdvdCBhIFBMVEUgbm93ICovCisKKyAgICAgIGlmICgoKG1uZ19wbHRlcClwQ2h1bmspLT5iRW1wdHkpIC8qIGlmIGVtcHR5LCBpbmhlcml0IGZyb20gZ2xvYmFsICovCisgICAgICB7CisgICAgICAgIHBCdWYtPmlQTFRFY291bnQgPSBwRGF0YS0+aUdsb2JhbFBMVEVjb3VudDsKKyAgICAgICAgTU5HX0NPUFkgKHBCdWYtPmFQTFRFZW50cmllcywgcERhdGEtPmFHbG9iYWxQTFRFZW50cmllcywKKyAgICAgICAgICAgICAgICAgIHNpemVvZiAocEJ1Zi0+YVBMVEVlbnRyaWVzKSk7CisKKyAgICAgICAgaWYgKHBEYXRhLT5iSGFzZ2xvYmFsVFJOUykgICAgIC8qIGFsc28gY29weSBnbG9iYWwgdFJOUyA/ICovCisgICAgICAgIHsKKyAgICAgICAgICBtbmdfdWludDMyIGlSYXdsZW4yICA9IHBEYXRhLT5pR2xvYmFsVFJOU3Jhd2xlbjsKKyAgICAgICAgICBtbmdfdWludDhwIHBSYXdkYXRhMiA9IChtbmdfdWludDhwKShwRGF0YS0+YUdsb2JhbFRSTlNyYXdkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluZGljYXRlIHRSTlMgYXZhaWxhYmxlICovCisgICAgICAgICAgcEJ1Zi0+Ykhhc1RSTlMgPSBNTkdfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdsb2JhbCBsZW5ndGggb2tlID8gKi8KKyAgICAgICAgICBpZiAoKGlSYXdsZW4yID09IDApIHx8IChpUmF3bGVuMiA+IHBCdWYtPmlQTFRFY291bnQpKQorICAgICAgICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0dMT0JBTExFTkdUSEVSUik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3B5IGl0ICovCisgICAgICAgICAgcEJ1Zi0+aVRSTlNjb3VudCA9IGlSYXdsZW4yOworICAgICAgICAgIE1OR19DT1BZIChwQnVmLT5hVFJOU2VudHJpZXMsIHBSYXdkYXRhMiwgaVJhd2xlbjIpOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZSBmaWVsZHMgZm9yIGZ1dHVyZSByZWZlcmVuY2UgKi8KKyAgICAgICAgcEJ1Zi0+aVBMVEVjb3VudCA9ICgobW5nX3BsdGVwKXBDaHVuayktPmlFbnRyeWNvdW50OworICAgICAgICBNTkdfQ09QWSAocEJ1Zi0+YVBMVEVlbnRyaWVzLCAoKG1uZ19wbHRlcClwQ2h1bmspLT5hRW50cmllcywKKyAgICAgICAgICAgICAgICAgIHNpemVvZiAocEJ1Zi0+YVBMVEVlbnRyaWVzKSk7CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZSBhcyBnbG9iYWwgKi8KKyAgeworICAgIHBEYXRhLT5pR2xvYmFsUExURWNvdW50ID0gKChtbmdfcGx0ZXApcENodW5rKS0+aUVudHJ5Y291bnQ7CisgICAgTU5HX0NPUFkgKHBEYXRhLT5hR2xvYmFsUExURWVudHJpZXMsICgobW5nX3BsdGVwKXBDaHVuayktPmFFbnRyaWVzLAorICAgICAgICAgICAgICBzaXplb2YgKHBEYXRhLT5hR2xvYmFsUExURWVudHJpZXMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSBhbiBhbmltYXRpb24gb2JqZWN0ICovCisgICAgcmV0dXJuIG1uZ19jcmVhdGVfYW5pX3BsdGUgKHBEYXRhKTsKKyAgfQorI2VuZGlmIC8qIE1OR19TVVBQT1JUX0RJU1BMQVkgKi8KKworICByZXR1cm4gTU5HX05PRVJST1I7ICAgICAgICAgICAgICAgICAgLyogZG9uZSAqLworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitNTkdfQ19TUEVDSUFMRlVOQyAobW5nX3NwZWNpYWxfaWRhdCkKK3sKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgaWYgKChwRGF0YS0+Ykhhc0pIRFIpICYmCisgICAgICAocERhdGEtPmlKSERSYWxwaGFjb21wcmVzc2lvbiAhPSBNTkdfQ09NUFJFU1NJT05fREVGTEFURSkpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1NFUVVFTkNFRVJST1IpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3QgYWxsb3dlZCBmb3IgZGVsdGF0eXBlIE5PX0NIQU5HRSAqLworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisgIGlmICgocERhdGEtPmJIYXNESERSKSAmJiAoKHBEYXRhLT5pRGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfTk9DSEFOR0UpKSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfQ0hVTktOT1RBTExPV0VEKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2FuIG9ubHkgYmUgZW1wdHkgaW4gQkFTSS1ibG9jayEgKi8KKyAgaWYgKCgoKG1uZ19pZGF0cClwQ2h1bmspLT5iRW1wdHkpICYmICghcERhdGEtPmJIYXNCQVNJKSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRExFTkdUSCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbmRleGVkLWNvbG9yIHJlcXVpcmVzIFBMVEUgKi8KKyAgaWYgKChwRGF0YS0+Ykhhc0lIRFIpICYmIChwRGF0YS0+aUNvbG9ydHlwZSA9PSAzKSAmJiAoIXBEYXRhLT5iSGFzUExURSkpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1BMVEVNSVNTSU5HKTsKKworICBwRGF0YS0+Ykhhc0lEQVQgPSBNTkdfVFJVRTsgICAgICAgICAgLyogZ290IHNvbWUgSURBVCBub3csIGRvbid0IHdlICovCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOyAgICAgICAgICAgICAgICAgIC8qIGRvbmUgKi8KK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworTU5HX0NfU1BFQ0lBTEZVTkMgKG1uZ19zcGVjaWFsX2llbmQpCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJSERSLWJsb2NrIHJlcXVpcmVzIElEQVQgKi8KKyAgaWYgKChwRGF0YS0+Ykhhc0lIRFIpICYmICghcERhdGEtPmJIYXNJREFUKSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSURBVE1JU1NJTkcpOworCisgIHBEYXRhLT5pSW1hZ2VsZXZlbC0tOyAgICAgICAgICAgICAgICAvKiBvbmUgbGV2ZWwgdXAgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX0RJU1BMQVkKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSBhbiBhbmltYXRpb24gb2JqZWN0ICovCisgICAgbW5nX3JldGNvZGUgaVJldGNvZGUgPSBtbmdfY3JlYXRlX2FuaV9pbWFnZSAocERhdGEpOworICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRpc3BsYXkgcHJvY2Vzc2luZyAqLworICAgIGlSZXRjb2RlID0gbW5nX3Byb2Nlc3NfZGlzcGxheV9pZW5kIChwRGF0YSk7CisgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgcmV0dXJuIGlSZXRjb2RlOworICB9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfRElTUExBWSAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorICBpZiAoIXBEYXRhLT5iVGltZXJzZXQpICAgICAgICAgICAgICAgLyogcmVzZXQgb25seSBpZiBub3QgYnJva2VuICEhISAqLworICB7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElFTkQgc2lnbmFscyB0aGUgZW5kIGZvciBtb3N0IC4uLiAqLworICAgIHBEYXRhLT5iSGFzSUhEUiAgICAgICAgID0gTU5HX0ZBTFNFOworICAgIHBEYXRhLT5iSGFzQkFTSSAgICAgICAgID0gTU5HX0ZBTFNFOworICAgIHBEYXRhLT5iSGFzREhEUiAgICAgICAgID0gTU5HX0ZBTFNFOworI2lmZGVmIE1OR19JTkNMVURFX0pORworICAgIHBEYXRhLT5iSGFzSkhEUiAgICAgICAgID0gTU5HX0ZBTFNFOworICAgIHBEYXRhLT5iSGFzSlNFUCAgICAgICAgID0gTU5HX0ZBTFNFOworICAgIHBEYXRhLT5iSGFzSkRBQSAgICAgICAgID0gTU5HX0ZBTFNFOworICAgIHBEYXRhLT5iSGFzSkRBVCAgICAgICAgID0gTU5HX0ZBTFNFOworI2VuZGlmCisgICAgcERhdGEtPmJIYXNQTFRFICAgICAgICAgPSBNTkdfRkFMU0U7CisgICAgcERhdGEtPmJIYXNUUk5TICAgICAgICAgPSBNTkdfRkFMU0U7CisgICAgcERhdGEtPmJIYXNHQU1BICAgICAgICAgPSBNTkdfRkFMU0U7CisgICAgcERhdGEtPmJIYXNDSFJNICAgICAgICAgPSBNTkdfRkFMU0U7CisgICAgcERhdGEtPmJIYXNTUkdCICAgICAgICAgPSBNTkdfRkFMU0U7CisgICAgcERhdGEtPmJIYXNJQ0NQICAgICAgICAgPSBNTkdfRkFMU0U7CisgICAgcERhdGEtPmJIYXNCS0dEICAgICAgICAgPSBNTkdfRkFMU0U7CisgICAgcERhdGEtPmJIYXNJREFUICAgICAgICAgPSBNTkdfRkFMU0U7CisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorICB9CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7ICAgICAgICAgICAgICAgICAgLyogZG9uZSAqLworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitNTkdfRl9TUEVDSUFMRlVOQyAobW5nX2RlYnVua190cm5zKQoreworICBtbmdfdHJuc3AgIHBUUk5TICAgID0gKG1uZ190cm5zcClwQ2h1bms7CisgIG1uZ191aW50MzIgaVJhd2xlbiAgPSAqcGlSYXdsZW47CisgIG1uZ191aW50OHAgcFJhd2RhdGEgPSAqcHBSYXdkYXRhOworCisgIGlmICgocERhdGEtPmJIYXNJSERSKSB8fCAocERhdGEtPmJIYXNCQVNJKSB8fCAocERhdGEtPmJIYXNESERSKSkKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3QgZ2xvYmFsISAqLworICAgIHBUUk5TLT5iR2xvYmFsID0gTU5HX0ZBTFNFOworICAgIHBUUk5TLT5pVHlwZSAgID0gcERhdGEtPmlDb2xvcnR5cGU7CisKKyAgICBpZiAoaVJhd2xlbiAhPSAwKQorICAgIHsKKyAgICAgIHN3aXRjaCAocERhdGEtPmlDb2xvcnR5cGUpICAgICAvKiBzdG9yZSBmaWVsZHMgKi8KKyAgICAgIHsKKyAgICAgICAgY2FzZSAwOiB7ICAgICAgICAgICAgICAgICAgICAvKiBncmF5ICovCisgICAgICAgICAgICAgICAgICBpZiAoaVJhd2xlbiAhPSAyKQorICAgICAgICAgICAgICAgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRExFTkdUSCk7CisgICAgICAgICAgICAgICAgICBwVFJOUy0+aUdyYXkgID0gbW5nX2dldF91aW50MTYgKHBSYXdkYXRhKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSAyOiB7ICAgICAgICAgICAgICAgICAgICAvKiByZ2IgKi8KKyAgICAgICAgICAgICAgICAgIGlmIChpUmF3bGVuICE9IDYpCisgICAgICAgICAgICAgICAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElETEVOR1RIKTsKKyAgICAgICAgICAgICAgICAgIHBUUk5TLT5pUmVkICAgPSBtbmdfZ2V0X3VpbnQxNiAocFJhd2RhdGEpOworICAgICAgICAgICAgICAgICAgcFRSTlMtPmlHcmVlbiA9IG1uZ19nZXRfdWludDE2IChwUmF3ZGF0YSsyKTsKKyAgICAgICAgICAgICAgICAgIHBUUk5TLT5pQmx1ZSAgPSBtbmdfZ2V0X3VpbnQxNiAocFJhd2RhdGErNCk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIGNhc2UgMzogeyAgICAgICAgICAgICAgICAgICAgLyogaW5kZXhlZCAqLworICAgICAgICAgICAgICAgICAgaWYgKGlSYXdsZW4gPiAyNTYpCisgICAgICAgICAgICAgICAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElETEVOR1RIKTsKKyAgICAgICAgICAgICAgICAgIHBUUk5TLT5pQ291bnQgPSBpUmF3bGVuOworICAgICAgICAgICAgICAgICAgTU5HX0NPUFkgKHBUUk5TLT5hRW50cmllcywgcFJhd2RhdGEsIGlSYXdsZW4pOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGl0J3MgZ2xvYmFsISAqLworICB7CisgICAgaWYgKGlSYXdsZW4gPT0gMCkKKyAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElETEVOR1RIKTsKKyAgICBwVFJOUy0+Ykdsb2JhbCA9IE1OR19UUlVFOworICAgIHBUUk5TLT5pVHlwZSAgID0gMDsKKyAgICBwVFJOUy0+aVJhd2xlbiA9IGlSYXdsZW47CisgICAgTU5HX0NPUFkgKHBUUk5TLT5hUmF3ZGF0YSwgcFJhd2RhdGEsIGlSYXdsZW4pOworCisgICAgcERhdGEtPmlHbG9iYWxUUk5TcmF3bGVuID0gaVJhd2xlbjsKKyAgICBNTkdfQ09QWSAocERhdGEtPmFHbG9iYWxUUk5TcmF3ZGF0YSwgcFJhd2RhdGEsIGlSYXdsZW4pOworICB9CisKKyAgKnBpUmF3bGVuID0gMDsKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK01OR19DX1NQRUNJQUxGVU5DIChtbmdfc3BlY2lhbF90cm5zKQoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbXVsdGlwbGUgdFJOUyBvbmx5IGluc2lkZSBCQVNJICovCisgIGlmICgocERhdGEtPmJIYXNUUk5TKSAmJiAoIXBEYXRhLT5iSGFzQkFTSSkpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX01VTFRJUExFRVJST1IpOworCisgIGlmICgocERhdGEtPmJIYXNJSERSKSB8fCAocERhdGEtPmJIYXNCQVNJKSB8fCAocERhdGEtPmJIYXNESERSKSkKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdCBhbGxvd2VkIHdpdGggZnVsbCBhbHBoYS1jaGFubmVsICovCisgICAgaWYgKChwRGF0YS0+aUNvbG9ydHlwZSA9PSA0KSB8fCAocERhdGEtPmlDb2xvcnR5cGUgPT0gNikpCisgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfQ0hVTktOT1RBTExPV0VEKTsKKworICAgIGlmICghKChtbmdfdHJuc3ApcENodW5rKS0+YkVtcHR5KSAgLyogZmlsbGVkID8gKi8KKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCisgICAgICBpZiAocERhdGEtPmlDb2xvcnR5cGUgPT0gMykKKyAgICAgIHsKKyAgICAgICAgbW5nX2ltYWdlcCAgICAgcEltYWdlID0gKG1uZ19pbWFnZXApcERhdGEtPnBDdXJyZW50b2JqOworICAgICAgICBtbmdfaW1hZ2VkYXRhcCBwQnVmOworCisgICAgICAgIGlmICghcEltYWdlKSAgICAgICAgICAgICAgICAgICAvKiBubyBvYmplY3QgdGhlbiBjaGVjayBvYmogMCAqLworICAgICAgICAgIHBJbWFnZSA9IChtbmdfaW1hZ2VwKXBEYXRhLT5wT2JqemVybzsKKworICAgICAgICBwQnVmID0gcEltYWdlLT5wSW1nYnVmOyAgICAgICAgLyogYWRkcmVzcyBvYmplY3QgYnVmZmVyICovCisKKyAgICAgICAgaWYgKCgobW5nX3RybnNwKXBDaHVuayktPmlDb3VudCA+IHBCdWYtPmlQTFRFY291bnQpCisgICAgICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURMRU5HVEgpOworICAgICAgfQorI2VuZGlmCisgICAgfQorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgZW1wdHkgdGhlcmUgbXVzdCBiZSBnbG9iYWwgc3R1ZmYhICovCisgICAgeworICAgICAgaWYgKCFwRGF0YS0+Ykhhc2dsb2JhbFRSTlMpCisgICAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19DQU5OT1RCRUVNUFRZKTsKKyAgICB9CisgIH0KKworICBpZiAoKHBEYXRhLT5iSGFzSUhEUikgfHwgKHBEYXRhLT5iSGFzQkFTSSkgfHwgKHBEYXRhLT5iSGFzREhEUikpCisgICAgcERhdGEtPmJIYXNUUk5TID0gTU5HX1RSVUU7ICAgICAgICAvKiBpbmRpY2F0ZSB0Uk5TIGF2YWlsYWJsZSAqLworICBlbHNlCisgICAgcERhdGEtPmJIYXNnbG9iYWxUUk5TID0gTU5HX1RSVUU7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCisgIGlmICgocERhdGEtPmJIYXNJSERSKSB8fCAocERhdGEtPmJIYXNCQVNJKSB8fCAocERhdGEtPmJIYXNESERSKSkKKyAgeworICAgIG1uZ19pbWFnZXAgICAgIHBJbWFnZTsKKyAgICBtbmdfaW1hZ2VkYXRhcCBwQnVmOworICAgIG1uZ191aW50OHAgICAgIHBSYXdkYXRhMjsKKyAgICBtbmdfdWludDMyICAgICBpUmF3bGVuMjsKKworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisgICAgaWYgKHBEYXRhLT5iSGFzREhEUikgICAgICAgICAgICAgICAvKiBwcm9jZXNzaW5nIGRlbHRhLWltYWdlID8gKi8KKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlIGluIG9iamVjdCAwICEhISAqLworI2lmIGRlZmluZWQoTU5HX05PXzFfMl80QklUX1NVUFBPUlQpCisgICAgICBtbmdfdWludDggbXVsdGlwbGllcltdPXswLDI1NSw4NSwwLDE3LDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwxfTsKKyNlbmRpZgorICAgICAgcEltYWdlID0gKG1uZ19pbWFnZXApcERhdGEtPnBPYmp6ZXJvOworICAgICAgcEJ1ZiAgID0gcEltYWdlLT5wSW1nYnVmOyAgICAgICAgLyogYWRkcmVzcyBvYmplY3QgYnVmZmVyICovCisgICAgICBwQnVmLT5iSGFzVFJOUyAgID0gTU5HX1RSVUU7ICAgICAvKiB0ZWxsIGl0IGl0J3MgZ290IGEgdFJOUyBub3cgKi8KKyAgICAgIHBCdWYtPmlUUk5TZ3JheSAgPSAwOworICAgICAgcEJ1Zi0+aVRSTlNyZWQgICA9IDA7CisgICAgICBwQnVmLT5pVFJOU2dyZWVuID0gMDsKKyAgICAgIHBCdWYtPmlUUk5TYmx1ZSAgPSAwOworICAgICAgcEJ1Zi0+aVRSTlNjb3VudCA9IDA7CisKKyAgICAgIHN3aXRjaCAocERhdGEtPmlDb2xvcnR5cGUpICAgICAgIC8qIHN0b3JlIGZpZWxkcyBmb3IgZnV0dXJlIHJlZmVyZW5jZSAqLworICAgICAgeworICAgICAgICBjYXNlIDA6IHsgICAgICAgICAgICAgICAgICAgICAgLyogZ3JheSAqLworICAgICAgICAgICAgICAgICAgcEJ1Zi0+aVRSTlNncmF5ICA9ICgobW5nX3RybnNwKXBDaHVuayktPmlHcmF5OworI2lmIGRlZmluZWQoTU5HX05PXzFfMl80QklUX1NVUFBPUlQpCisgICAgICAgICAgICAgICAgICBwQnVmLT5pVFJOU2dyYXkgKj0gbXVsdGlwbGllcltwRGF0YS0+aVBOR2RlcHRoXTsKKyNlbmRpZgorI2lmIGRlZmluZWQoTU5HX05PXzE2QklUX1NVUFBPUlQpCisgICAgICAgICAgICAgICAgICBpZiAocERhdGEtPmlQTkdtdWx0ID09IDIpCisgICAgICAgICAgICAgICAgICAgICBwQnVmLT5pVFJOU2dyYXkgPj49IDg7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSAyOiB7ICAgICAgICAgICAgICAgICAgICAgIC8qIHJnYiAqLworICAgICAgICAgICAgICAgICAgcEJ1Zi0+aVRSTlNyZWQgICA9ICgobW5nX3RybnNwKXBDaHVuayktPmlSZWQ7CisgICAgICAgICAgICAgICAgICBwQnVmLT5pVFJOU2dyZWVuID0gKChtbmdfdHJuc3ApcENodW5rKS0+aUdyZWVuOworICAgICAgICAgICAgICAgICAgcEJ1Zi0+aVRSTlNibHVlICA9ICgobW5nX3RybnNwKXBDaHVuayktPmlCbHVlOworI2lmIGRlZmluZWQoTU5HX05PXzE2QklUX1NVUFBPUlQpCisgICAgICAgICAgICAgICAgICBpZiAocERhdGEtPmlQTkdtdWx0ID09IDIpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBwQnVmLT5pVFJOU3JlZCAgID4+PSA4OworICAgICAgICAgICAgICAgICAgICAgcEJ1Zi0+aVRSTlNncmVlbiA+Pj0gODsKKyAgICAgICAgICAgICAgICAgICAgIHBCdWYtPmlUUk5TYmx1ZSAgPj49IDg7CisgICAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSAzOiB7ICAgICAgICAgICAgICAgICAgICAgIC8qIGluZGV4ZWQgKi8KKyAgICAgICAgICAgICAgICAgIHBCdWYtPmlUUk5TY291bnQgPSAoKG1uZ190cm5zcClwQ2h1bmspLT5pQ291bnQ7CisgICAgICAgICAgICAgICAgICBNTkdfQ09QWSAocEJ1Zi0+YVRSTlNlbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobW5nX3RybnNwKXBDaHVuayktPmFFbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobW5nX3RybnNwKXBDaHVuayktPmlDb3VudCk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkcmVzcyBjdXJyZW50IG9iamVjdCAqLworICAgICAgcEltYWdlID0gKG1uZ19pbWFnZXApcERhdGEtPnBDdXJyZW50b2JqOworCisgICAgICBpZiAoIXBJbWFnZSkgICAgICAgICAgICAgICAgICAgICAvKiBubyBvYmplY3QgdGhlbiBkdW1wIGl0IGluIG9iaiAwICovCisgICAgICAgIHBJbWFnZSA9IChtbmdfaW1hZ2VwKXBEYXRhLT5wT2JqemVybzsKKworICAgICAgcEJ1ZiA9IHBJbWFnZS0+cEltZ2J1ZjsgICAgICAgICAgLyogYWRkcmVzcyBvYmplY3QgYnVmZmVyICovCisgICAgICBwQnVmLT5iSGFzVFJOUyAgID0gTU5HX1RSVUU7ICAgICAvKiBhbmQgdGVsbCBpdCBpdCdzIGdvdCBhIHRSTlMgbm93ICovCisgICAgICBwQnVmLT5pVFJOU2dyYXkgID0gMDsKKyAgICAgIHBCdWYtPmlUUk5TcmVkICAgPSAwOworICAgICAgcEJ1Zi0+aVRSTlNncmVlbiA9IDA7CisgICAgICBwQnVmLT5pVFJOU2JsdWUgID0gMDsKKyAgICAgIHBCdWYtPmlUUk5TY291bnQgPSAwOworCisgICAgICBpZiAoKChtbmdfdHJuc3ApcENodW5rKS0+YkVtcHR5KSAvKiBpZiBlbXB0eSwgaW5oZXJpdCBmcm9tIGdsb2JhbCAqLworICAgICAgeworICAgICAgICBpUmF3bGVuMiAgPSBwRGF0YS0+aUdsb2JhbFRSTlNyYXdsZW47CisgICAgICAgIHBSYXdkYXRhMiA9IChtbmdfcHRyKShwRGF0YS0+YUdsb2JhbFRSTlNyYXdkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdsb2JhbCBsZW5ndGggb2tlID8gKi8KKyAgICAgICAgaWYgKChwRGF0YS0+aUNvbG9ydHlwZSA9PSAwKSAmJiAoaVJhd2xlbjIgIT0gMikpCisgICAgICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0dMT0JBTExFTkdUSEVSUik7CisKKyAgICAgICAgaWYgKChwRGF0YS0+aUNvbG9ydHlwZSA9PSAyKSAmJiAoaVJhd2xlbjIgIT0gNikpCisgICAgICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0dMT0JBTExFTkdUSEVSUik7CisKKyAgICAgICAgaWYgKChwRGF0YS0+aUNvbG9ydHlwZSA9PSAzKSAmJiAoKGlSYXdsZW4yID09IDApIHx8IChpUmF3bGVuMiA+IHBCdWYtPmlQTFRFY291bnQpKSkKKyAgICAgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfR0xPQkFMTEVOR1RIRVJSKTsKKworICAgICAgICBzd2l0Y2ggKHBEYXRhLT5pQ29sb3J0eXBlKSAgICAgLyogc3RvcmUgZmllbGRzIGZvciBmdXR1cmUgcmVmZXJlbmNlICovCisgICAgICAgIHsKKyAgICAgICAgICBjYXNlIDA6IHsgICAgICAgICAgICAgICAgICAgIC8qIGdyYXkgKi8KKyAgICAgICAgICAgICAgICAgICAgcEJ1Zi0+aVRSTlNncmF5ID0gbW5nX2dldF91aW50MTYgKHBSYXdkYXRhMik7CisjaWYgZGVmaW5lZChNTkdfTk9fMTZCSVRfU1VQUE9SVCkKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBEYXRhLT5pUE5HbXVsdCA9PSAyKQorICAgICAgICAgICAgICAgICAgICAgICBwQnVmLT5pVFJOU2dyYXkgPj49IDg7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgY2FzZSAyOiB7ICAgICAgICAgICAgICAgICAgICAvKiByZ2IgKi8KKyAgICAgICAgICAgICAgICAgICAgcEJ1Zi0+aVRSTlNyZWQgICA9IG1uZ19nZXRfdWludDE2IChwUmF3ZGF0YTIpOworICAgICAgICAgICAgICAgICAgICBwQnVmLT5pVFJOU2dyZWVuID0gbW5nX2dldF91aW50MTYgKHBSYXdkYXRhMisyKTsKKyAgICAgICAgICAgICAgICAgICAgcEJ1Zi0+aVRSTlNibHVlICA9IG1uZ19nZXRfdWludDE2IChwUmF3ZGF0YTIrNCk7CisjaWYgZGVmaW5lZChNTkdfTk9fMTZCSVRfU1VQUE9SVCkKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBEYXRhLT5pUE5HbXVsdCA9PSAyKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgIHBCdWYtPmlUUk5TcmVkICAgPj49IDg7CisgICAgICAgICAgICAgICAgICAgICAgIHBCdWYtPmlUUk5TZ3JlZW4gPj49IDg7CisgICAgICAgICAgICAgICAgICAgICAgIHBCdWYtPmlUUk5TYmx1ZSAgPj49IDg7CisgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlIDM6IHsgICAgICAgICAgICAgICAgICAgIC8qIGluZGV4ZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgcEJ1Zi0+aVRSTlNjb3VudCA9IGlSYXdsZW4yOworICAgICAgICAgICAgICAgICAgICBNTkdfQ09QWSAocEJ1Zi0+YVRSTlNlbnRyaWVzLCBwUmF3ZGF0YTIsIGlSYXdsZW4yKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgc3dpdGNoIChwRGF0YS0+aUNvbG9ydHlwZSkgICAgIC8qIHN0b3JlIGZpZWxkcyBmb3IgZnV0dXJlIHJlZmVyZW5jZSAqLworICAgICAgICB7CisgICAgICAgICAgY2FzZSAwOiB7ICAgICAgICAgICAgICAgICAgICAvKiBncmF5ICovCisgICAgICAgICAgICAgICAgICAgIHBCdWYtPmlUUk5TZ3JheSA9ICgobW5nX3RybnNwKXBDaHVuayktPmlHcmF5OworI2lmIGRlZmluZWQoTU5HX05PXzE2QklUX1NVUFBPUlQpCisgICAgICAgICAgICAgICAgICAgIGlmIChwRGF0YS0+aVBOR211bHQgPT0gMikKKyAgICAgICAgICAgICAgICAgICAgICAgcEJ1Zi0+aVRSTlNncmF5ID4+PSA4OworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgIGNhc2UgMjogeyAgICAgICAgICAgICAgICAgICAgLyogcmdiICovCisgICAgICAgICAgICAgICAgICAgIHBCdWYtPmlUUk5TcmVkICAgPSAoKG1uZ190cm5zcClwQ2h1bmspLT5pUmVkOworICAgICAgICAgICAgICAgICAgICBwQnVmLT5pVFJOU2dyZWVuID0gKChtbmdfdHJuc3ApcENodW5rKS0+aUdyZWVuOworICAgICAgICAgICAgICAgICAgICBwQnVmLT5pVFJOU2JsdWUgID0gKChtbmdfdHJuc3ApcENodW5rKS0+aUJsdWU7CisjaWYgZGVmaW5lZChNTkdfTk9fMTZCSVRfU1VQUE9SVCkKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBEYXRhLT5pUE5HbXVsdCA9PSAyKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgIHBCdWYtPmlUUk5TcmVkICAgPj49IDg7CisgICAgICAgICAgICAgICAgICAgICAgIHBCdWYtPmlUUk5TZ3JlZW4gPj49IDg7CisgICAgICAgICAgICAgICAgICAgICAgIHBCdWYtPmlUUk5TYmx1ZSAgPj49IDg7CisgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlIDM6IHsgICAgICAgICAgICAgICAgICAgIC8qIGluZGV4ZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgcEJ1Zi0+aVRSTlNjb3VudCA9ICgobW5nX3RybnNwKXBDaHVuayktPmlDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgTU5HX0NPUFkgKHBCdWYtPmFUUk5TZW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobW5nX3RybnNwKXBDaHVuayktPmFFbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChtbmdfdHJuc3ApcENodW5rKS0+aUNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIGFuIGFuaW1hdGlvbiBvYmplY3QgKi8KKyAgICByZXR1cm4gbW5nX2NyZWF0ZV9hbmlfdHJucyAocERhdGEpOworICB9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfRElTUExBWSAqLworCisgIHJldHVybiBNTkdfTk9FUlJPUjsgICAgICAgICAgICAgICAgICAvKiBkb25lICovCit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK01OR19DX1NQRUNJQUxGVU5DIChtbmdfc3BlY2lhbF9nYW1hKQoreworI2lmZGVmIE1OR19JTkNMVURFX0pORworICBpZiAoKHBEYXRhLT5iSGFzSUhEUikgfHwgKHBEYXRhLT5iSGFzQkFTSSkgfHwgKHBEYXRhLT5iSGFzREhEUikgfHwgKHBEYXRhLT5iSGFzSkhEUikpCisjZWxzZQorICBpZiAoKHBEYXRhLT5iSGFzSUhEUikgfHwgKHBEYXRhLT5iSGFzQkFTSSkgfHwgKHBEYXRhLT5iSGFzREhEUikpCisjZW5kaWYKKyAgICBwRGF0YS0+Ykhhc0dBTUEgPSBNTkdfVFJVRTsgICAgICAgIC8qIGluZGljYXRlIHdlJ3ZlIGdvdCBpdCAqLworICBlbHNlCisgICAgcERhdGEtPmJIYXNnbG9iYWxHQU1BID0gKG1uZ19ib29sKSEoKG1uZ19nYW1hcClwQ2h1bmspLT5iRW1wdHk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisgIGlmICgocERhdGEtPmJIYXNJSERSKSB8fCAocERhdGEtPmJIYXNCQVNJKSB8fCAocERhdGEtPmJIYXNESERSKSB8fCAocERhdGEtPmJIYXNKSERSKSkKKyNlbHNlCisgIGlmICgocERhdGEtPmJIYXNJSERSKSB8fCAocERhdGEtPmJIYXNCQVNJKSB8fCAocERhdGEtPmJIYXNESERSKSkKKyNlbmRpZgorICB7CisgICAgbW5nX2ltYWdlcCBwSW1hZ2U7CisKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworICAgIGlmIChwRGF0YS0+Ykhhc0RIRFIpICAgICAgICAgICAgICAgLyogdXBkYXRlIGRlbHRhIGltYWdlID8gKi8KKyAgICAgIHBJbWFnZSA9IChtbmdfaW1hZ2VwKXBEYXRhLT5wT2JqemVybzsKKyAgICBlbHNlCisjZW5kaWYKKyAgICB7CisgICAgICBwSW1hZ2UgPSAobW5nX2ltYWdlcClwRGF0YS0+cEN1cnJlbnRvYmo7CisgICAgICBpZiAoIXBJbWFnZSkgICAgICAgICAgICAgICAgICAgICAvKiBubyBvYmplY3QgdGhlbiBkdW1wIGl0IGluIG9iaiAwICovCisgICAgICAgIHBJbWFnZSA9IChtbmdfaW1hZ2VwKXBEYXRhLT5wT2JqemVybzsKKyAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZSBmb3IgY29sb3ItcHJvY2Vzc2luZyByb3V0aW5lcyAqLworICAgIHBJbWFnZS0+cEltZ2J1Zi0+aUdhbW1hICAgPSAoKG1uZ19nYW1hcClwQ2h1bmspLT5pR2FtbWE7CisgICAgcEltYWdlLT5wSW1nYnVmLT5iSGFzR0FNQSA9IE1OR19UUlVFOworICB9CisgIGVsc2UKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlIGFzIGdsb2JhbCAqLworICAgIGlmICghKChtbmdfZ2FtYXApcENodW5rKS0+YkVtcHR5KQorICAgICAgcERhdGEtPmlHbG9iYWxHYW1tYSA9ICgobW5nX2dhbWFwKXBDaHVuayktPmlHYW1tYTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSBhbiBhbmltYXRpb24gb2JqZWN0ICovCisgICAgcmV0dXJuIG1uZ19jcmVhdGVfYW5pX2dhbWEgKHBEYXRhLCBwQ2h1bmspOworICB9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfRElTUExBWSAqLworCisgIHJldHVybiBNTkdfTk9FUlJPUjsgICAgICAgICAgICAgICAgICAvKiBkb25lICovCit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19jSFJNCitNTkdfQ19TUEVDSUFMRlVOQyAobW5nX3NwZWNpYWxfY2hybSkKK3sKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgaWYgKChwRGF0YS0+Ykhhc0lIRFIpIHx8IChwRGF0YS0+Ykhhc0JBU0kpIHx8IChwRGF0YS0+Ykhhc0RIRFIpIHx8IChwRGF0YS0+Ykhhc0pIRFIpKQorI2Vsc2UKKyAgaWYgKChwRGF0YS0+Ykhhc0lIRFIpIHx8IChwRGF0YS0+Ykhhc0JBU0kpIHx8IChwRGF0YS0+Ykhhc0RIRFIpKQorI2VuZGlmCisgICAgcERhdGEtPmJIYXNDSFJNID0gTU5HX1RSVUU7ICAgICAgICAvKiBpbmRpY2F0ZSB3ZSd2ZSBnb3QgaXQgKi8KKyAgZWxzZQorICAgIHBEYXRhLT5iSGFzZ2xvYmFsQ0hSTSA9IChtbmdfYm9vbCkhKChtbmdfY2hybXApcENodW5rKS0+YkVtcHR5OworCisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorICB7CisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisgICAgaWYgKChwRGF0YS0+Ykhhc0lIRFIpIHx8IChwRGF0YS0+Ykhhc0JBU0kpIHx8IChwRGF0YS0+Ykhhc0RIRFIpIHx8IChwRGF0YS0+Ykhhc0pIRFIpKQorI2Vsc2UKKyAgICBpZiAoKHBEYXRhLT5iSGFzSUhEUikgfHwgKHBEYXRhLT5iSGFzQkFTSSkgfHwgKHBEYXRhLT5iSGFzREhEUikpCisjZW5kaWYKKyAgICB7CisgICAgICBtbmdfaW1hZ2VwICAgICBwSW1hZ2U7CisgICAgICBtbmdfaW1hZ2VkYXRhcCBwQnVmOworCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKKyAgICAgIGlmIChwRGF0YS0+Ykhhc0RIRFIpICAgICAgICAgICAgIC8qIHVwZGF0ZSBkZWx0YSBpbWFnZSA/ICovCisgICAgICAgIHBJbWFnZSA9IChtbmdfaW1hZ2VwKXBEYXRhLT5wT2JqemVybzsKKyAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgeworICAgICAgICBwSW1hZ2UgPSAobW5nX2ltYWdlcClwRGF0YS0+cEN1cnJlbnRvYmo7CisgICAgICAgIGlmICghcEltYWdlKSAgICAgICAgICAgICAgICAgICAvKiBubyBvYmplY3QgdGhlbiBkdW1wIGl0IGluIG9iaiAwICovCisgICAgICAgICAgcEltYWdlID0gKG1uZ19pbWFnZXApcERhdGEtPnBPYmp6ZXJvOworICAgICAgfQorCisgICAgICBwQnVmID0gcEltYWdlLT5wSW1nYnVmOyAgICAgICAgICAvKiBhZGRyZXNzIG9iamVjdCBidWZmZXIgKi8KKyAgICAgIHBCdWYtPmJIYXNDSFJNID0gTU5HX1RSVUU7ICAgICAgIC8qIGFuZCB0ZWxsIGl0IGl0J3MgZ290IGEgQ0hSTSBub3cgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlIGZvciBjb2xvci1wcm9jZXNzaW5nIHJvdXRpbmVzICovCisgICAgICBwQnVmLT5pV2hpdGVwb2ludHggICA9ICgobW5nX2Nocm1wKXBDaHVuayktPmlXaGl0ZXBvaW50eDsKKyAgICAgIHBCdWYtPmlXaGl0ZXBvaW50eSAgID0gKChtbmdfY2hybXApcENodW5rKS0+aVdoaXRlcG9pbnR5OworICAgICAgcEJ1Zi0+aVByaW1hcnlyZWR4ICAgPSAoKG1uZ19jaHJtcClwQ2h1bmspLT5pUmVkeDsKKyAgICAgIHBCdWYtPmlQcmltYXJ5cmVkeSAgID0gKChtbmdfY2hybXApcENodW5rKS0+aVJlZHk7CisgICAgICBwQnVmLT5pUHJpbWFyeWdyZWVueCA9ICgobW5nX2Nocm1wKXBDaHVuayktPmlHcmVlbng7CisgICAgICBwQnVmLT5pUHJpbWFyeWdyZWVueSA9ICgobW5nX2Nocm1wKXBDaHVuayktPmlHcmVlbnk7CisgICAgICBwQnVmLT5pUHJpbWFyeWJsdWV4ICA9ICgobW5nX2Nocm1wKXBDaHVuayktPmlCbHVleDsKKyAgICAgIHBCdWYtPmlQcmltYXJ5Ymx1ZXkgID0gKChtbmdfY2hybXApcENodW5rKS0+aUJsdWV5OworICAgIH0KKyAgICBlbHNlCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZSBhcyBnbG9iYWwgKi8KKyAgICAgIGlmICghKChtbmdfY2hybXApcENodW5rKS0+YkVtcHR5KQorICAgICAgeworICAgICAgICBwRGF0YS0+aUdsb2JhbFdoaXRlcG9pbnR4ICAgPSAoKG1uZ19jaHJtcClwQ2h1bmspLT5pV2hpdGVwb2ludHg7CisgICAgICAgIHBEYXRhLT5pR2xvYmFsV2hpdGVwb2ludHkgICA9ICgobW5nX2Nocm1wKXBDaHVuayktPmlXaGl0ZXBvaW50eTsKKyAgICAgICAgcERhdGEtPmlHbG9iYWxQcmltYXJ5cmVkeCAgID0gKChtbmdfY2hybXApcENodW5rKS0+aVJlZHg7CisgICAgICAgIHBEYXRhLT5pR2xvYmFsUHJpbWFyeXJlZHkgICA9ICgobW5nX2Nocm1wKXBDaHVuayktPmlSZWR5OworICAgICAgICBwRGF0YS0+aUdsb2JhbFByaW1hcnlncmVlbnggPSAoKG1uZ19jaHJtcClwQ2h1bmspLT5pR3JlZW54OworICAgICAgICBwRGF0YS0+aUdsb2JhbFByaW1hcnlncmVlbnkgPSAoKG1uZ19jaHJtcClwQ2h1bmspLT5pR3JlZW55OworICAgICAgICBwRGF0YS0+aUdsb2JhbFByaW1hcnlibHVleCAgPSAoKG1uZ19jaHJtcClwQ2h1bmspLT5pQmx1ZXg7CisgICAgICAgIHBEYXRhLT5pR2xvYmFsUHJpbWFyeWJsdWV5ICA9ICgobW5nX2Nocm1wKXBDaHVuayktPmlCbHVleTsKKyAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSBhbiBhbmltYXRpb24gb2JqZWN0ICovCisgICAgICByZXR1cm4gbW5nX2NyZWF0ZV9hbmlfY2hybSAocERhdGEsIHBDaHVuayk7CisgICAgfQorICB9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfRElTUExBWSAqLworCisgIHJldHVybiBNTkdfTk9FUlJPUjsgICAgICAgICAgICAgICAgICAvKiBkb25lICovCit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworTU5HX0NfU1BFQ0lBTEZVTkMgKG1uZ19zcGVjaWFsX3NyZ2IpCit7CisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisgIGlmICgocERhdGEtPmJIYXNJSERSKSB8fCAocERhdGEtPmJIYXNCQVNJKSB8fCAocERhdGEtPmJIYXNESERSKSB8fCAocERhdGEtPmJIYXNKSERSKSkKKyNlbHNlCisgIGlmICgocERhdGEtPmJIYXNJSERSKSB8fCAocERhdGEtPmJIYXNCQVNJKSB8fCAocERhdGEtPmJIYXNESERSKSkKKyNlbmRpZgorICAgIHBEYXRhLT5iSGFzU1JHQiA9IE1OR19UUlVFOyAgICAgICAgLyogaW5kaWNhdGUgd2UndmUgZ290IGl0ICovCisgIGVsc2UKKyAgICBwRGF0YS0+Ykhhc2dsb2JhbFNSR0IgPSAobW5nX2Jvb2wpISgobW5nX3NyZ2JwKXBDaHVuayktPmJFbXB0eTsKKworI2lmZGVmIE1OR19TVVBQT1JUX0RJU1BMQVkKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgaWYgKChwRGF0YS0+Ykhhc0lIRFIpIHx8IChwRGF0YS0+Ykhhc0JBU0kpIHx8IChwRGF0YS0+Ykhhc0RIRFIpIHx8IChwRGF0YS0+Ykhhc0pIRFIpKQorI2Vsc2UKKyAgaWYgKChwRGF0YS0+Ykhhc0lIRFIpIHx8IChwRGF0YS0+Ykhhc0JBU0kpIHx8IChwRGF0YS0+Ykhhc0RIRFIpKQorI2VuZGlmCisgIHsKKyAgICBtbmdfaW1hZ2VwIHBJbWFnZTsKKworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisgICAgaWYgKHBEYXRhLT5iSGFzREhEUikgICAgICAgICAgICAgICAvKiB1cGRhdGUgZGVsdGEgaW1hZ2UgPyAqLworICAgICAgcEltYWdlID0gKG1uZ19pbWFnZXApcERhdGEtPnBPYmp6ZXJvOworICAgIGVsc2UKKyNlbmRpZgorICAgIHsKKyAgICAgIHBJbWFnZSA9IChtbmdfaW1hZ2VwKXBEYXRhLT5wQ3VycmVudG9iajsKKyAgICAgIGlmICghcEltYWdlKSAgICAgICAgICAgICAgICAgICAgIC8qIG5vIG9iamVjdCB0aGVuIGR1bXAgaXQgaW4gb2JqIDAgKi8KKyAgICAgICAgcEltYWdlID0gKG1uZ19pbWFnZXApcERhdGEtPnBPYmp6ZXJvOworICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlIGZvciBjb2xvci1wcm9jZXNzaW5nIHJvdXRpbmVzICovCisgICAgcEltYWdlLT5wSW1nYnVmLT5pUmVuZGVyaW5naW50ZW50ID0gKChtbmdfc3JnYnApcENodW5rKS0+aVJlbmRlcmluZ2ludGVudDsKKyAgICBwSW1hZ2UtPnBJbWdidWYtPmJIYXNTUkdCICAgICAgICAgPSBNTkdfVFJVRTsKKyAgfQorICBlbHNlCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZSBhcyBnbG9iYWwgKi8KKyAgICBpZiAoISgobW5nX3NyZ2JwKXBDaHVuayktPmJFbXB0eSkKKyAgICAgIHBEYXRhLT5pR2xvYmFsUmVuZGludGVudCA9ICgobW5nX3NyZ2JwKXBDaHVuayktPmlSZW5kZXJpbmdpbnRlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgYW4gYW5pbWF0aW9uIG9iamVjdCAqLworICAgIHJldHVybiBtbmdfY3JlYXRlX2FuaV9zcmdiIChwRGF0YSwgcENodW5rKTsKKyAgfQorI2VuZGlmIC8qIE1OR19TVVBQT1JUX0RJU1BMQVkgKi8KKworICByZXR1cm4gTU5HX05PRVJST1I7ICAgICAgICAgICAgICAgICAgLyogZG9uZSAqLworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfaUNDUAorTU5HX0NfU1BFQ0lBTEZVTkMgKG1uZ19zcGVjaWFsX2ljY3ApCit7CisgIG1uZ19yZXRjb2RlICAgICAgIGlSZXRjb2RlOworICBtbmdfY2h1bmtfaGVhZGVycCBwRHVtbXk7CisKKyNpZmRlZiBNTkdfQ0hFQ0tfQkFEX0lDQ1AgICAgICAgICAgICAgIC8qIENoZWNrIGZvciBiYWQgaUNDUCBjaHVuayAqLworICBpZiAoIXN0cm5jbXAgKCgobW5nX2ljY3BwKXBDaHVuayktPnpOYW1lLCAiUGhvdG9zaG9wIElDQyBwcm9maWxlIiwgMjEpKQorICB7CisgICAgaWYgKCgobW5nX2ljY3BwKXBDaHVuayktPmlQcm9maWxlc2l6ZSA9PSAyNjE1KSAvKiBpcyBpdCB0aGUgc1JHQiBwcm9maWxlID8gKi8KKyAgICB7CisgICAgICBtbmdfY2h1bmtfaGVhZGVyIGNodW5rX3NyZ2I7CisgICAgICBtbmdfZ2V0X2NodW5raGVhZGVyIChNTkdfVUlOVF9zUkdCLCAmY2h1bmtfc3JnYik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcmV0ZW5kIGl0J3MgYW4gc1JHQiBjaHVuayB0aGVuICEgKi8KKyAgICAgIGlSZXRjb2RlID0gbW5nX3JlYWRfZ2VuZXJhbCAocERhdGEsICZjaHVua19zcmdiLCAxLCAobW5nX3B0cikiMCIsICZwRHVtbXkpOworICAgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgICAgcmV0dXJuIGlSZXRjb2RlOworCisgICAgICBwRHVtbXktPmZDbGVhbnVwIChwRGF0YSwgcER1bW15KTsgIAorICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyNlbmRpZiAvKiBNTkdfQ0hFQ0tfQkFEX0lDQ1AgKi8KKworI2lmZGVmIE1OR19JTkNMVURFX0pORworICAgIGlmICgocERhdGEtPmJIYXNJSERSKSB8fCAocERhdGEtPmJIYXNCQVNJKSB8fCAocERhdGEtPmJIYXNESERSKSB8fCAocERhdGEtPmJIYXNKSERSKSkKKyNlbHNlCisgICAgaWYgKChwRGF0YS0+Ykhhc0lIRFIpIHx8IChwRGF0YS0+Ykhhc0JBU0kpIHx8IChwRGF0YS0+Ykhhc0RIRFIpKQorI2VuZGlmCisgICAgICBwRGF0YS0+Ykhhc0lDQ1AgPSBNTkdfVFJVRTsgICAgICAvKiBpbmRpY2F0ZSB3ZSd2ZSBnb3QgaXQgKi8KKyAgICBlbHNlCisgICAgICBwRGF0YS0+Ykhhc2dsb2JhbElDQ1AgPSAobW5nX2Jvb2wpISgobW5nX2ljY3BwKXBDaHVuayktPmJFbXB0eTsKKworI2lmZGVmIE1OR19TVVBQT1JUX0RJU1BMQVkKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgICBpZiAoKHBEYXRhLT5iSGFzSUhEUikgfHwgKHBEYXRhLT5iSGFzQkFTSSkgfHwgKHBEYXRhLT5iSGFzREhEUikgfHwgKHBEYXRhLT5iSGFzSkhEUikpCisjZWxzZQorICAgIGlmICgocERhdGEtPmJIYXNJSERSKSB8fCAocERhdGEtPmJIYXNCQVNJKSB8fCAocERhdGEtPmJIYXNESERSKSkKKyNlbmRpZgorICAgIHsKKyAgICAgIG1uZ19pbWFnZXAgcEltYWdlOworCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKKyAgICAgIGlmIChwRGF0YS0+Ykhhc0RIRFIpICAgICAgICAgICAgIC8qIHVwZGF0ZSBkZWx0YSBpbWFnZSA/ICovCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZSBpbiBvYmplY3QgMCAhICovCisgICAgICAgIHBJbWFnZSA9IChtbmdfaW1hZ2VwKXBEYXRhLT5wT2JqemVybzsKKworICAgICAgICBpZiAocEltYWdlLT5wSW1nYnVmLT5wUHJvZmlsZSkgLyogcHJvZmlsZSBleGlzdGVkID8gKi8KKyAgICAgICAgICBNTkdfRlJFRVggKHBEYXRhLCBwSW1hZ2UtPnBJbWdidWYtPnBQcm9maWxlLCBwSW1hZ2UtPnBJbWdidWYtPmlQcm9maWxlc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbGxvY2F0ZSBhIGJ1ZmZlciAmIGNvcHkgaXQgKi8KKyAgICAgICAgTU5HX0FMTE9DIChwRGF0YSwgcEltYWdlLT5wSW1nYnVmLT5wUHJvZmlsZSwgKChtbmdfaWNjcHApcENodW5rKS0+aVByb2ZpbGVzaXplKTsKKyAgICAgICAgTU5HX0NPUFkgIChwSW1hZ2UtPnBJbWdidWYtPnBQcm9maWxlLCAoKG1uZ19pY2NwcClwQ2h1bmspLT5wUHJvZmlsZSwgKChtbmdfaWNjcHApcENodW5rKS0+aVByb2ZpbGVzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlIGl0cyBsZW5ndGggYXMgd2VsbCAqLworICAgICAgICBwSW1hZ2UtPnBJbWdidWYtPmlQcm9maWxlc2l6ZSA9ICgobW5nX2ljY3BwKXBDaHVuayktPmlQcm9maWxlc2l6ZTsKKyAgICAgICAgcEltYWdlLT5wSW1nYnVmLT5iSGFzSUNDUCAgICAgPSBNTkdfVFJVRTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgeworICAgICAgICBwSW1hZ2UgPSAobW5nX2ltYWdlcClwRGF0YS0+cEN1cnJlbnRvYmo7CisKKyAgICAgICAgaWYgKCFwSW1hZ2UpICAgICAgICAgICAgICAgICAgIC8qIG5vIG9iamVjdCB0aGVuIGR1bXAgaXQgaW4gb2JqIDAgKi8KKyAgICAgICAgICBwSW1hZ2UgPSAobW5nX2ltYWdlcClwRGF0YS0+cE9ianplcm87CisKKyAgICAgICAgaWYgKHBJbWFnZS0+cEltZ2J1Zi0+cFByb2ZpbGUpIC8qIHByb2ZpbGUgZXhpc3RlZCA/ICovCisgICAgICAgICAgTU5HX0ZSRUVYIChwRGF0YSwgcEltYWdlLT5wSW1nYnVmLT5wUHJvZmlsZSwgcEltYWdlLT5wSW1nYnVmLT5pUHJvZmlsZXNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWxsb2NhdGUgYSBidWZmZXIgJiBjb3B5IGl0ICovCisgICAgICAgIE1OR19BTExPQyAocERhdGEsIHBJbWFnZS0+cEltZ2J1Zi0+cFByb2ZpbGUsICgobW5nX2ljY3BwKXBDaHVuayktPmlQcm9maWxlc2l6ZSk7CisgICAgICAgIE1OR19DT1BZICAocEltYWdlLT5wSW1nYnVmLT5wUHJvZmlsZSwgKChtbmdfaWNjcHApcENodW5rKS0+cFByb2ZpbGUsICgobW5nX2ljY3BwKXBDaHVuayktPmlQcm9maWxlc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZSBpdHMgbGVuZ3RoIGFzIHdlbGwgKi8KKyAgICAgICAgcEltYWdlLT5wSW1nYnVmLT5pUHJvZmlsZXNpemUgPSAoKG1uZ19pY2NwcClwQ2h1bmspLT5pUHJvZmlsZXNpemU7CisgICAgICAgIHBJbWFnZS0+cEltZ2J1Zi0+Ykhhc0lDQ1AgICAgID0gTU5HX1RSVUU7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlIGFzIGdsb2JhbCAqLworICAgICAgaWYgKHBEYXRhLT5wR2xvYmFsUHJvZmlsZSkgICAgIC8qIGRpZCB3ZSBoYXZlIGEgZ2xvYmFsIHByb2ZpbGUgPyAqLworICAgICAgICBNTkdfRlJFRVggKHBEYXRhLCBwRGF0YS0+cEdsb2JhbFByb2ZpbGUsIHBEYXRhLT5pR2xvYmFsUHJvZmlsZXNpemUpOworCisgICAgICBpZiAoKChtbmdfaWNjcHApcENodW5rKS0+YkVtcHR5KSAvKiBlbXB0eSBjaHVuayA/ICovCisgICAgICB7CisgICAgICAgIHBEYXRhLT5pR2xvYmFsUHJvZmlsZXNpemUgPSAwOyAvKiByZXNldCB0byBudWxsICovCisgICAgICAgIHBEYXRhLT5wR2xvYmFsUHJvZmlsZSAgICAgPSBNTkdfTlVMTDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFsbG9jYXRlIGEgZ2xvYmFsIGJ1ZmZlciAmIGNvcHkgaXQgKi8KKyAgICAgICAgTU5HX0FMTE9DIChwRGF0YSwgcERhdGEtPnBHbG9iYWxQcm9maWxlLCAoKG1uZ19pY2NwcClwQ2h1bmspLT5pUHJvZmlsZXNpemUpOworICAgICAgICBNTkdfQ09QWSAgKHBEYXRhLT5wR2xvYmFsUHJvZmlsZSwgKChtbmdfaWNjcHApcENodW5rKS0+cFByb2ZpbGUsICgobW5nX2ljY3BwKXBDaHVuayktPmlQcm9maWxlc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZSBpdHMgbGVuZ3RoIGFzIHdlbGwgKi8KKyAgICAgICAgcERhdGEtPmlHbG9iYWxQcm9maWxlc2l6ZSA9ICgobW5nX2ljY3BwKXBDaHVuayktPmlQcm9maWxlc2l6ZTsKKyAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSBhbiBhbmltYXRpb24gb2JqZWN0ICovCisgICAgICByZXR1cm4gbW5nX2NyZWF0ZV9hbmlfaWNjcCAocERhdGEsIHBDaHVuayk7CisgICAgfQorI2VuZGlmIC8qIE1OR19TVVBQT1JUX0RJU1BMQVkgKi8KKworI2lmZGVmIE1OR19DSEVDS19CQURfSUNDUAorICB9CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7ICAgICAgICAgICAgICAgICAgLyogZG9uZSAqLworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS190RVh0CitNTkdfQ19TUEVDSUFMRlVOQyAobW5nX3NwZWNpYWxfdGV4dCkKK3sKKyAgaWYgKHBEYXRhLT5mUHJvY2Vzc3RleHQpICAgICAgICAgICAgIC8qIGluZm9ybSB0aGUgYXBwbGljYXRpb24gPyAqLworICB7CisgICAgbW5nX2Jvb2wgYk9rZSA9IHBEYXRhLT5mUHJvY2Vzc3RleHQgKChtbmdfaGFuZGxlKXBEYXRhLCBNTkdfVFlQRV9URVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG1uZ190ZXh0cClwQ2h1bmspLT56S2V5d29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChtbmdfdGV4dHApcENodW5rKS0+elRleHQsIDAsIDApOworICAgIGlmICghYk9rZSkKKyAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19BUFBNSVNDRVJST1IpOworICB9CisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOyAgICAgICAgICAgICAgICAgIC8qIGRvbmUgKi8KK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfelRYdAorTU5HX0NfU1BFQ0lBTEZVTkMgKG1uZ19zcGVjaWFsX3p0eHQpCit7CisgIGlmIChwRGF0YS0+ZlByb2Nlc3N0ZXh0KSAgICAgICAgICAgICAvKiBpbmZvcm0gdGhlIGFwcGxpY2F0aW9uID8gKi8KKyAgeworICAgIG1uZ19ib29sIGJPa2UgPSBwRGF0YS0+ZlByb2Nlc3N0ZXh0ICgobW5nX2hhbmRsZSlwRGF0YSwgTU5HX1RZUEVfWlRYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChtbmdfenR4dHApcENodW5rKS0+ektleXdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobW5nX3p0eHRwKXBDaHVuayktPnpUZXh0LCAwLCAwKTsKKyAgICBpZiAoIWJPa2UpCisgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfQVBQTUlTQ0VSUk9SKTsKKyAgfQorCisgIHJldHVybiBNTkdfTk9FUlJPUjsgICAgICAgICAgICAgICAgICAvKiBkb25lICovCit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX2lUWHQKK01OR19GX1NQRUNJQUxGVU5DIChtbmdfZGVmbGF0ZV9pdHh0KQoreworICBtbmdfaXR4dHAgIHBJVFhUICAgID0gKG1uZ19pdHh0cClwQ2h1bms7CisgIG1uZ191aW50MzIgaUJ1ZnNpemUgPSAwOworICBtbmdfdWludDhwIHBCdWYgICAgID0gMDsKKyAgbW5nX3VpbnQzMiBpVGV4dGxlbiA9IDA7CisKKyAgaWYgKHBJVFhULT5pQ29tcHJlc3Npb25mbGFnKSAgICAgICAgIC8qIGRlY29tcHJlc3MgdGhlIHRleHQgPyAqLworICB7CisgICAgbW5nX3JldGNvZGUgaVJldGNvZGUgPSBtbmdfaW5mbGF0ZV9idWZmZXIgKHBEYXRhLCAqcHBSYXdkYXRhLCAqcGlSYXdsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQnVmLCAmaUJ1ZnNpemUsICZpVGV4dGxlbik7CisKKyAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkb24ndCBmb3JnZXQgdG8gZHJvcCB0aGUgdGVtcCBidWZmZXIgKi8KKyAgICAgIE1OR19GUkVFWCAocERhdGEsIHBCdWYsIGlCdWZzaXplKTsKKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICB9CisKKyAgICBNTkdfQUxMT0MgKHBEYXRhLCBwSVRYVC0+elRleHQsIGlUZXh0bGVuKzEpOworICAgIE1OR19DT1BZIChwSVRYVC0+elRleHQsIHBCdWYsIGlUZXh0bGVuKTsKKworICAgIHBJVFhULT5pVGV4dHNpemUgPSBpVGV4dGxlbjsKKworICAgIE1OR19GUkVFWCAocERhdGEsIHBCdWYsIGlCdWZzaXplKTsKKworICB9IGVsc2UgeworCisgICAgTU5HX0FMTE9DIChwRGF0YSwgcElUWFQtPnpUZXh0LCAoKnBpUmF3bGVuKSsxKTsKKyAgICBNTkdfQ09QWSAocElUWFQtPnpUZXh0LCAqcHBSYXdkYXRhLCAqcGlSYXdsZW4pOworCisgICAgcElUWFQtPmlUZXh0c2l6ZSA9ICpwaVJhd2xlbjsKKyAgfQorCisgICpwaVJhd2xlbiA9IDA7CisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19pVFh0CitNTkdfQ19TUEVDSUFMRlVOQyAobW5nX3NwZWNpYWxfaXR4dCkKK3sKKyAgaWYgKHBEYXRhLT5mUHJvY2Vzc3RleHQpICAgICAgICAgICAgIC8qIGluZm9ybSB0aGUgYXBwbGljYXRpb24gPyAqLworICB7CisgICAgbW5nX2Jvb2wgYk9rZSA9IHBEYXRhLT5mUHJvY2Vzc3RleHQgKChtbmdfaGFuZGxlKXBEYXRhLCBNTkdfVFlQRV9JVFhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG1uZ19pdHh0cClwQ2h1bmspLT56S2V5d29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChtbmdfaXR4dHApcENodW5rKS0+elRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobW5nX2l0eHRwKXBDaHVuayktPnpMYW5ndWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChtbmdfaXR4dHApcENodW5rKS0+elRyYW5zbGF0aW9uKTsKKyAgICBpZiAoIWJPa2UpCisgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfQVBQTUlTQ0VSUk9SKTsKKyAgfQorCisgIHJldHVybiBNTkdfTk9FUlJPUjsgICAgICAgICAgICAgICAgICAvKiBkb25lICovCit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX2JLR0QKK01OR19DX1NQRUNJQUxGVU5DIChtbmdfc3BlY2lhbF9ia2dkKQoreworI2lmZGVmIE1OR19TVVBQT1JUX0RJU1BMQVkKKyAgbW5nX2ltYWdlcCAgICAgcEltYWdlID0gKG1uZ19pbWFnZXApcERhdGEtPnBDdXJyZW50b2JqOworICBtbmdfaW1hZ2VkYXRhcCBwQnVmOworI2VuZGlmCisKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgaWYgKChwRGF0YS0+Ykhhc0lIRFIpIHx8IChwRGF0YS0+Ykhhc0JBU0kpIHx8IChwRGF0YS0+Ykhhc0RIRFIpIHx8IChwRGF0YS0+Ykhhc0pIRFIpKQorI2Vsc2UKKyAgaWYgKChwRGF0YS0+Ykhhc0lIRFIpIHx8IChwRGF0YS0+Ykhhc0JBU0kpIHx8IChwRGF0YS0+Ykhhc0RIRFIpKQorI2VuZGlmCisgICAgcERhdGEtPmJIYXNCS0dEID0gTU5HX1RSVUU7ICAgICAgICAvKiBpbmRpY2F0ZSBiS0dEIGF2YWlsYWJsZSAqLworICBlbHNlCisgICAgcERhdGEtPmJIYXNnbG9iYWxCS0dEID0gKG1uZ19ib29sKSEoKChtbmdfYmtnZHApcENodW5rKS0+YkVtcHR5KTsKKworI2lmZGVmIE1OR19TVVBQT1JUX0RJU1BMQVkKKyAgaWYgKCFwSW1hZ2UpICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmIG5vIG9iamVjdCBkdW1wIGl0IGluIG9iaiAwICovCisgICAgcEltYWdlID0gKG1uZ19pbWFnZXApcERhdGEtPnBPYmp6ZXJvOworICBwQnVmID0gcEltYWdlLT5wSW1nYnVmOyAgICAgICAgICAgICAgLyogYWRkcmVzcyBvYmplY3QgYnVmZmVyICovCisKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgaWYgKHBEYXRhLT5iSGFzSkhEUikKKyAgeworICAgIHBCdWYtPmJIYXNCS0dEID0gTU5HX1RSVUU7ICAgICAgICAgLyogdGVsbCB0aGUgb2JqZWN0IGl0J3MgZ290IGJLR0Qgbm93ICovCisKKyAgICBzd2l0Y2ggKHBEYXRhLT5pSkhEUmNvbG9ydHlwZSkgICAgIC8qIHN0b3JlIGZpZWxkcyBmb3IgZnV0dXJlIHJlZmVyZW5jZSAqLworICAgIHsKKyAgICAgIGNhc2UgIDggOiA7ICAgICAgICAgICAgICAgICAgICAgIC8qIGdyYXkgKi8KKyAgICAgIGNhc2UgMTIgOiB7ICAgICAgICAgICAgICAgICAgICAgIC8qIGdyYXlhICovCisgICAgICAgICAgICAgICAgICBwQnVmLT5pQktHRGdyYXkgID0gKChtbmdfYmtnZHApcENodW5rKS0+aUdyYXk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICBjYXNlIDEwIDogOyAgICAgICAgICAgICAgICAgICAgICAvKiByZ2IgKi8KKyAgICAgIGNhc2UgMTQgOiB7ICAgICAgICAgICAgICAgICAgICAgIC8qIHJnYmEgKi8KKyAgICAgICAgICAgICAgICAgIHBCdWYtPmlCS0dEcmVkICAgPSAoKG1uZ19ia2dkcClwQ2h1bmspLT5pUmVkOworICAgICAgICAgICAgICAgICAgcEJ1Zi0+aUJLR0RncmVlbiA9ICgobW5nX2JrZ2RwKXBDaHVuayktPmlHcmVlbjsKKyAgICAgICAgICAgICAgICAgIHBCdWYtPmlCS0dEYmx1ZSAgPSAoKG1uZ19ia2dkcClwQ2h1bmspLT5pQmx1ZTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZQorI2VuZGlmIC8qIE1OR19JTkNMVURFX0pORyAqLworICBpZiAoKHBEYXRhLT5iSGFzSUhEUikgfHwgKHBEYXRhLT5iSGFzQkFTSSkgfHwgKHBEYXRhLT5iSGFzREhEUikpCisgIHsKKyAgICBwQnVmLT5iSGFzQktHRCA9IE1OR19UUlVFOyAgICAgICAgIC8qIHRlbGwgdGhlIG9iamVjdCBpdCdzIGdvdCBiS0dEIG5vdyAqLworCisgICAgc3dpdGNoIChwRGF0YS0+aUNvbG9ydHlwZSkgICAgICAgICAvKiBzdG9yZSBmaWVsZHMgZm9yIGZ1dHVyZSByZWZlcmVuY2UgKi8KKyAgICB7CisgICAgICBjYXNlIDAgOiA7ICAgICAgICAgICAgICAgICAgICAgICAgLyogZ3JheSAqLworICAgICAgY2FzZSA0IDogeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdyYXlhICovCisgICAgICAgICAgICAgICAgIHBCdWYtPmlCS0dEZ3JheSAgPSAoKG1uZ19ia2dkcClwQ2h1bmspLT5pR3JheTsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICB9CisgICAgICBjYXNlIDIgOiA7ICAgICAgICAgICAgICAgICAgICAgICAgLyogcmdiICovCisgICAgICBjYXNlIDYgOiB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogcmdiYSAqLworICAgICAgICAgICAgICAgICBwQnVmLT5pQktHRHJlZCAgID0gKChtbmdfYmtnZHApcENodW5rKS0+aVJlZDsKKyAgICAgICAgICAgICAgICAgcEJ1Zi0+aUJLR0RncmVlbiA9ICgobW5nX2JrZ2RwKXBDaHVuayktPmlHcmVlbjsKKyAgICAgICAgICAgICAgICAgcEJ1Zi0+aUJLR0RibHVlICA9ICgobW5nX2JrZ2RwKXBDaHVuayktPmlCbHVlOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIH0KKyAgICAgIGNhc2UgMyA6IHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbmRleGVkICovCisgICAgICAgICAgICAgICAgIHBCdWYtPmlCS0dEaW5kZXggPSAoKG1uZ19ia2dkcClwQ2h1bmspLT5pSW5kZXg7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmUgYXMgZ2xvYmFsICovCisgIHsKKyAgICBpZiAoISgoKG1uZ19ia2dkcClwQ2h1bmspLT5iRW1wdHkpKQorICAgIHsKKyAgICAgIHBEYXRhLT5pR2xvYmFsQktHRHJlZCAgID0gKChtbmdfYmtnZHApcENodW5rKS0+aVJlZDsKKyAgICAgIHBEYXRhLT5pR2xvYmFsQktHRGdyZWVuID0gKChtbmdfYmtnZHApcENodW5rKS0+aUdyZWVuOworICAgICAgcERhdGEtPmlHbG9iYWxCS0dEYmx1ZSAgPSAoKG1uZ19ia2dkcClwQ2h1bmspLT5pQmx1ZTsKKyAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgYW4gYW5pbWF0aW9uIG9iamVjdCAqLworICAgIHJldHVybiBtbmdfY3JlYXRlX2FuaV9ia2dkIChwRGF0YSk7CisgIH0KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOyAgICAgICAgICAgICAgICAgIC8qIGRvbmUgKi8KK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfcEhZcworTU5HX0NfU1BFQ0lBTEZVTkMgKG1uZ19zcGVjaWFsX3BoeXMpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorICB7CisKKworICAgIC8qIFRPRE86IHNvbWV0aGluZyAhISEgKi8KKworCisgIH0KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOyAgICAgICAgICAgICAgICAgIC8qIGRvbmUgKi8KK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfc0JJVAorTU5HX0NfU1BFQ0lBTEZVTkMgKG1uZ19zcGVjaWFsX3NiaXQpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorICB7CisKKworICAgIC8qIFRPRE86IHNvbWV0aGluZyAhISEgKi8KKworCisgIH0KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOyAgICAgICAgICAgICAgICAgIC8qIGRvbmUgKi8KK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfc1BMVAorTU5HX0ZfU1BFQ0lBTEZVTkMgKG1uZ19zcGx0X2VudHJpZXMpCit7CisgIG1uZ19zcGx0cCAgcFNQTFQgICAgPSAobW5nX3NwbHRwKXBDaHVuazsKKyAgbW5nX3VpbnQzMiBpUmF3bGVuICA9ICpwaVJhd2xlbjsKKyAgbW5nX3VpbnQ4cCBwUmF3ZGF0YSA9ICpwcFJhd2RhdGE7CisKKyAgaWYgKChwU1BMVC0+aVNhbXBsZWRlcHRoICE9IE1OR19CSVRERVBUSF84ICkgJiYKKyAgICAgIChwU1BMVC0+aVNhbXBsZWRlcHRoICE9IE1OR19CSVRERVBUSF8xNikgICApCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVlNBTVBMRURFUFRIKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoZWNrIHJlbWFpbmluZyBsZW5ndGggKi8KKyAgaWYgKCAoKHBTUExULT5pU2FtcGxlZGVwdGggPT0gTU5HX0JJVERFUFRIXzggKSAmJiAoaVJhd2xlbiAlICA2ICE9IDApKSB8fAorICAgICAgICgocFNQTFQtPmlTYW1wbGVkZXB0aCA9PSBNTkdfQklUREVQVEhfMTYpICYmIChpUmF3bGVuICUgMTAgIT0gMCkpICAgICkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRExFTkdUSCk7CisKKyAgaWYgKHBTUExULT5pU2FtcGxlZGVwdGggPT0gTU5HX0JJVERFUFRIXzgpCisgICAgcFNQTFQtPmlFbnRyeWNvdW50ID0gaVJhd2xlbiAvIDY7CisgIGVsc2UKKyAgICBwU1BMVC0+aUVudHJ5Y291bnQgPSBpUmF3bGVuIC8gMTA7CisKKyAgaWYgKGlSYXdsZW4pCisgIHsKKyAgICBNTkdfQUxMT0MgKHBEYXRhLCBwU1BMVC0+cEVudHJpZXMsIGlSYXdsZW4pOworICAgIE1OR19DT1BZIChwU1BMVC0+cEVudHJpZXMsIHBSYXdkYXRhLCBpUmF3bGVuKTsKKyAgfQorCisgICpwaVJhd2xlbiA9IDA7CisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19zUExUCitNTkdfQ19TUEVDSUFMRlVOQyAobW5nX3NwZWNpYWxfc3BsdCkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCisgIHsKKworCisgICAgLyogVE9ETzogc29tZXRoaW5nICEhISAqLworCisKKyAgfQorI2VuZGlmIC8qIE1OR19TVVBQT1JUX0RJU1BMQVkgKi8KKworICByZXR1cm4gTU5HX05PRVJST1I7ICAgICAgICAgICAgICAgICAgLyogZG9uZSAqLworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19oSVNUCitNTkdfRl9TUEVDSUFMRlVOQyAobW5nX2hpc3RfZW50cmllcykKK3sKKyAgbW5nX2hpc3RwICBwSElTVCAgICA9IChtbmdfaGlzdHApcENodW5rOworICBtbmdfdWludDMyIGlSYXdsZW4gID0gKnBpUmF3bGVuOworICBtbmdfdWludDhwIHBSYXdkYXRhID0gKnBwUmF3ZGF0YTsKKyAgbW5nX3VpbnQzMiBpWDsKKworICBpZiAoICgoaVJhd2xlbiAmIDB4MDEpICE9IDApIHx8ICgoaVJhd2xlbiA+PiAxKSAhPSBwRGF0YS0+aVBMVEVjb3VudCkgKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElETEVOR1RIKTsKKworICBwSElTVC0+aUVudHJ5Y291bnQgPSBpUmF3bGVuID4+IDE7CisKKyAgZm9yIChpWCA9IDA7IGlYIDwgcEhJU1QtPmlFbnRyeWNvdW50OyBpWCsrKQorICB7CisgICAgcEhJU1QtPmFFbnRyaWVzW2lYXSA9IG1uZ19nZXRfdWludDE2IChwUmF3ZGF0YSk7CisgICAgcFJhd2RhdGEgKz0gMjsKKyAgfQorCisgICpwaVJhd2xlbiA9IDA7CisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19oSVNUCitNTkdfQ19TUEVDSUFMRlVOQyAobW5nX3NwZWNpYWxfaGlzdCkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCisgIHsKKworCisgICAgLyogVE9ETzogc29tZXRoaW5nICEhISAqLworCisKKyAgfQorI2VuZGlmIC8qIE1OR19TVVBQT1JUX0RJU1BMQVkgKi8KKworICByZXR1cm4gTU5HX05PRVJST1I7ICAgICAgICAgICAgICAgICAgLyogZG9uZSAqLworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS190SU1FCitNTkdfQ19TUEVDSUFMRlVOQyAobW5nX3NwZWNpYWxfdGltZSkKK3sKKy8qICBpZiAocERhdGEtPmZQcm9jZXNzdGltZSkgKi8gICAgICAgICAgICAvKiBpbmZvcm0gdGhlIGFwcGxpY2F0aW9uID8gKi8KKy8qICB7CisKKyAgICBwRGF0YS0+ZlByb2Nlc3N0aW1lICgobW5nX2hhbmRsZSlwRGF0YSwgKTsKKyAgfSAqLworCisgIHJldHVybiBNTkdfTk9FUlJPUjsgICAgICAgICAgICAgICAgICAvKiBkb25lICovCit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiBKTkcgY2h1bmtzICovCisKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKK01OR19DX1NQRUNJQUxGVU5DIChtbmdfc3BlY2lhbF9qaGRyKQoreworICBpZiAoKHBEYXRhLT5lU2lndHlwZSA9PSBtbmdfaXRfam5nKSAmJiAocERhdGEtPmlDaHVua3NlcSA+IDEpKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19TRVFVRU5DRUVSUk9SKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluc2lkZSBhIEpIRFItSUVORCBibG9jayBub3cgKi8KKyAgcERhdGEtPmJIYXNKSERSICAgICAgICAgICAgICA9IE1OR19UUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHN0b3JlIGludGVyZXN0aW5nIGZpZWxkcyAqLworICBwRGF0YS0+aURhdGF3aWR0aCAgICAgICAgICAgID0gKChtbmdfamhkcnApcENodW5rKS0+aVdpZHRoOworICBwRGF0YS0+aURhdGFoZWlnaHQgICAgICAgICAgID0gKChtbmdfamhkcnApcENodW5rKS0+aUhlaWdodDsKKyAgcERhdGEtPmlKSERSY29sb3J0eXBlICAgICAgICA9ICgobW5nX2poZHJwKXBDaHVuayktPmlDb2xvcnR5cGU7CisgIHBEYXRhLT5pSkhEUmltZ2JpdGRlcHRoICAgICAgPSAoKG1uZ19qaGRycClwQ2h1bmspLT5pSW1hZ2VzYW1wbGVkZXB0aDsKKyAgcERhdGEtPmlKSERSaW1nY29tcHJlc3Npb24gICA9ICgobW5nX2poZHJwKXBDaHVuayktPmlJbWFnZWNvbXByZXNzaW9uOworICBwRGF0YS0+aUpIRFJpbWdpbnRlcmxhY2UgICAgID0gKChtbmdfamhkcnApcENodW5rKS0+aUltYWdlaW50ZXJsYWNlOworICBwRGF0YS0+aUpIRFJhbHBoYWJpdGRlcHRoICAgID0gKChtbmdfamhkcnApcENodW5rKS0+aUFscGhhc2FtcGxlZGVwdGg7CisgIHBEYXRhLT5pSkhEUmFscGhhY29tcHJlc3Npb24gPSAoKG1uZ19qaGRycClwQ2h1bmspLT5pQWxwaGFjb21wcmVzc2lvbjsKKyAgcERhdGEtPmlKSERSYWxwaGFmaWx0ZXIgICAgICA9ICgobW5nX2poZHJwKXBDaHVuayktPmlBbHBoYWZpbHRlcjsKKyAgcERhdGEtPmlKSERSYWxwaGFpbnRlcmxhY2UgICA9ICgobW5nX2poZHJwKXBDaHVuayktPmlBbHBoYWludGVybGFjZTsKKworI2lmIGRlZmluZWQoTU5HX05PXzFfMl80QklUX1NVUFBPUlQpIHx8IGRlZmluZWQoTU5HX05PXzE2QklUX1NVUFBPUlQpCisgIHBEYXRhLT5pUE5HbXVsdCA9IDE7CisgIHBEYXRhLT5pUE5HZGVwdGggPSBwRGF0YS0+aUpIRFJhbHBoYWJpdGRlcHRoOworI2VuZGlmCisKKyNpZmRlZiBNTkdfTk9fMV8yXzRCSVRfU1VQUE9SVAorICBpZiAocERhdGEtPmlKSERSYWxwaGFiaXRkZXB0aCA8IDgpCisgICAgcERhdGEtPmlKSERSYWxwaGFiaXRkZXB0aCA9IDg7CisjZW5kaWYKKworI2lmZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgIGlmIChwRGF0YS0+aUpIRFJhbHBoYWJpdGRlcHRoID4gOCkKKyAgeworICAgIHBEYXRhLT5pUE5HbXVsdCA9IDI7CisgICAgcERhdGEtPmlKSERSYWxwaGFiaXRkZXB0aCA9IDg7CisgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGFyYW1ldGVyIHZhbGlkaXR5IGNoZWNrcyAqLworICBpZiAoKHBEYXRhLT5pSkhEUmNvbG9ydHlwZSAhPSBNTkdfQ09MT1JUWVBFX0pQRUdHUkFZICApICYmCisgICAgICAocERhdGEtPmlKSERSY29sb3J0eXBlICE9IE1OR19DT0xPUlRZUEVfSlBFR0NPTE9SICkgJiYKKyAgICAgIChwRGF0YS0+aUpIRFJjb2xvcnR5cGUgIT0gTU5HX0NPTE9SVFlQRV9KUEVHR1JBWUEgKSAmJgorICAgICAgKHBEYXRhLT5pSkhEUmNvbG9ydHlwZSAhPSBNTkdfQ09MT1JUWVBFX0pQRUdDT0xPUkEpICAgICkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRENPTE9SVFlQRSk7CisKKyAgaWYgKChwRGF0YS0+aUpIRFJpbWdiaXRkZXB0aCAhPSBNTkdfQklUREVQVEhfSlBFRzggICAgICkgJiYKKyAgICAgIChwRGF0YS0+aUpIRFJpbWdiaXRkZXB0aCAhPSBNTkdfQklUREVQVEhfSlBFRzEyICAgICkgJiYKKyAgICAgIChwRGF0YS0+aUpIRFJpbWdiaXRkZXB0aCAhPSBNTkdfQklUREVQVEhfSlBFRzhBTkQxMikgICAgKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElEQklUREVQVEgpOworCisgIGlmICgocERhdGEtPmlKSERSY29sb3J0eXBlID09IE1OR19DT0xPUlRZUEVfSlBFR0dSQVlBICkgfHwKKyAgICAgIChwRGF0YS0+aUpIRFJjb2xvcnR5cGUgPT0gTU5HX0NPTE9SVFlQRV9KUEVHQ09MT1JBKSAgICApCisgIHsKKyAgICBpZiAoKHBEYXRhLT5pSkhEUmFscGhhYml0ZGVwdGggIT0gTU5HX0JJVERFUFRIXzggKQorI2lmbmRlZiBNTkdfTk9fMV8yXzRCSVRfU1VQUE9SVAorICAgICAgICAmJiAocERhdGEtPmlKSERSYWxwaGFiaXRkZXB0aCAhPSBNTkdfQklUREVQVEhfMSApICYmCisgICAgICAgIChwRGF0YS0+aUpIRFJhbHBoYWJpdGRlcHRoICE9IE1OR19CSVRERVBUSF8yICkgJiYKKyAgICAgICAgKHBEYXRhLT5pSkhEUmFscGhhYml0ZGVwdGggIT0gTU5HX0JJVERFUFRIXzQgKQorI2VuZGlmCisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgICAgICYmIChwRGF0YS0+aUpIRFJhbHBoYWJpdGRlcHRoICE9IE1OR19CSVRERVBUSF8xNikKKyNlbmRpZgorICAgICAgICApCisgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJREJJVERFUFRIKTsKKworICAgIGlmICgocERhdGEtPmlKSERSYWxwaGFjb21wcmVzc2lvbiAhPSBNTkdfQ09NUFJFU1NJT05fREVGTEFURSAgICAgKSAmJgorICAgICAgICAocERhdGEtPmlKSERSYWxwaGFjb21wcmVzc2lvbiAhPSBNTkdfQ09NUFJFU1NJT05fQkFTRUxJTkVKUEVHKSAgICApCisgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRENPTVBSRVNTKTsKKworICAgIGlmICgocERhdGEtPmlKSERSYWxwaGFjb21wcmVzc2lvbiA9PSBNTkdfQ09NUFJFU1NJT05fQkFTRUxJTkVKUEVHKSAmJgorICAgICAgICAocERhdGEtPmlKSERSYWxwaGFiaXRkZXB0aCAgICAhPSAgTU5HX0JJVERFUFRIXzggICAgICAgICAgICAgKSAgICApCisgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJREJJVERFUFRIKTsKKworI2lmIGRlZmluZWQoRklMVEVSMTkyKSB8fCBkZWZpbmVkKEZJTFRFUjE5MykKKyAgICBpZiAoKHBEYXRhLT5pSkhEUmFscGhhZmlsdGVyICE9IE1OR19GSUxURVJfQURBUFRJVkUgKSAmJgorI2lmIGRlZmluZWQoRklMVEVSMTkyKSAmJiBkZWZpbmVkKEZJTFRFUjE5MykKKyAgICAgICAgKHBEYXRhLT5pSkhEUmFscGhhZmlsdGVyICE9IE1OR19GSUxURVJfRElGRkVSSU5HKSAmJgorICAgICAgICAocERhdGEtPmlKSERSYWxwaGFmaWx0ZXIgIT0gTU5HX0ZJTFRFUl9OT0ZJTFRFUiApICAgICkKKyNlbHNlCisjaWZkZWYgRklMVEVSMTkyCisgICAgICAgIChwRGF0YS0+aUpIRFJhbHBoYWZpbHRlciAhPSBNTkdfRklMVEVSX0RJRkZFUklORykgICAgKQorI2Vsc2UKKyAgICAgICAgKHBEYXRhLT5pSkhEUmFscGhhZmlsdGVyICE9IE1OR19GSUxURVJfTk9GSUxURVIgKSAgICApCisjZW5kaWYKKyNlbmRpZgorICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURGSUxURVIpOworI2Vsc2UKKyAgICBpZiAocERhdGEtPmlKSERSYWxwaGFmaWx0ZXIpCisgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJREZJTFRFUik7CisjZW5kaWYKKworICB9CisgIGVsc2UKKyAgeworICAgIGlmIChwRGF0YS0+aUpIRFJhbHBoYWJpdGRlcHRoKQorICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURCSVRERVBUSCk7CisgICAgaWYgKHBEYXRhLT5pSkhEUmFscGhhY29tcHJlc3Npb24pCisgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRENPTVBSRVNTKTsKKyAgICBpZiAocERhdGEtPmlKSERSYWxwaGFmaWx0ZXIpCisgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJREZJTFRFUik7CisgICAgaWYgKHBEYXRhLT5pSkhEUmFscGhhaW50ZXJsYWNlKQorICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURJTlRFUkxBQ0UpOworICB9CisKKyAgaWYgKCFwRGF0YS0+Ykhhc2hlYWRlcikgICAgICAgICAgICAgIC8qIGZpcnN0IGNodW5rID8gKi8KKyAgeworICAgIHBEYXRhLT5iSGFzaGVhZGVyID0gTU5HX1RSVUU7ICAgICAgLyogd2UndmUgZ290IGEgaGVhZGVyICovCisgICAgcERhdGEtPmVJbWFnZXR5cGUgPSBtbmdfaXRfam5nOyAgICAvKiB0aGVuIHRoaXMgbXVzdCBiZSBhIEpORyAqLworICAgIHBEYXRhLT5pV2lkdGggICAgID0gKChtbmdfamhkcnApcENodW5rKS0+aVdpZHRoOworICAgIHBEYXRhLT5pSGVpZ2h0ICAgID0gKChtbmdfamhkcnApcENodW5rKS0+aUhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByZWRpY3QgYWxwaGEtZGVwdGggISAqLworICAgIGlmICgocERhdGEtPmlKSERSY29sb3J0eXBlID09IE1OR19DT0xPUlRZUEVfSlBFR0dSQVlBICkgfHwKKyAgICAgICAgKHBEYXRhLT5pSkhEUmNvbG9ydHlwZSA9PSBNTkdfQ09MT1JUWVBFX0pQRUdDT0xPUkEpICAgICkKKyAgICAgIHBEYXRhLT5pQWxwaGFkZXB0aCA9IHBEYXRhLT5pSkhEUmFscGhhYml0ZGVwdGg7CisgICAgZWxzZQorICAgICAgcERhdGEtPmlBbHBoYWRlcHRoID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpdHMgb24gbWF4aW11bSBjYW52YXMgPyAqLworICAgIGlmICgocERhdGEtPmlXaWR0aCA+IHBEYXRhLT5pTWF4d2lkdGgpIHx8IChwRGF0YS0+aUhlaWdodCA+IHBEYXRhLT5pTWF4aGVpZ2h0KSkKKyAgICAgIE1OR19XQVJOSU5HIChwRGF0YSwgTU5HX0lNQUdFVE9PTEFSR0UpOworCisgICAgaWYgKHBEYXRhLT5mUHJvY2Vzc2hlYWRlcikgICAgICAgICAvKiBpbmZvcm0gdGhlIGFwcCA/ICovCisgICAgICBpZiAoIXBEYXRhLT5mUHJvY2Vzc2hlYWRlciAoKChtbmdfaGFuZGxlKXBEYXRhKSwgcERhdGEtPmlXaWR0aCwgcERhdGEtPmlIZWlnaHQpKQorICAgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfQVBQTUlTQ0VSUk9SKTsKKworICB9CisKKyAgcERhdGEtPmlDb2xvcnR5cGUgPSAwOyAgICAgICAgICAgICAgIC8qIGZha2UgZ3JheXNjYWxlIGZvciBvdGhlciByb3V0aW5lcyAqLworICBwRGF0YS0+aUltYWdlbGV2ZWwrKzsgICAgICAgICAgICAgICAgLyogb25lIGxldmVsIGRlZXBlciAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorICB7CisgICAgbW5nX3JldGNvZGUgaVJldGNvZGUgPSBtbmdfcHJvY2Vzc19kaXNwbGF5X2poZHIgKHBEYXRhKTsKKyAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICByZXR1cm4gaVJldGNvZGU7CisgIH0KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisKKyNpZmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICBpZiAoKChtbmdfamhkcnApcENodW5rKS0+aUFscGhhc2FtcGxlZGVwdGggPiA4KQorICAgICgobW5nX2poZHJwKXBDaHVuayktPmlBbHBoYXNhbXBsZWRlcHRoID0gODsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsgICAgICAgICAgICAgICAgICAvKiBkb25lICovCit9CisjZW5kaWYgLyogTU5HX0lOQ0xVREVfSk5HICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKK01OR19DX1NQRUNJQUxGVU5DIChtbmdfc3BlY2lhbF9qZGFhKQoreworICBpZiAocERhdGEtPmlKSERSYWxwaGFjb21wcmVzc2lvbiAhPSBNTkdfQ09NUFJFU1NJT05fQkFTRUxJTkVKUEVHKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19TRVFVRU5DRUVSUk9SKTsKKworICBwRGF0YS0+Ykhhc0pEQUEgPSBNTkdfVFJVRTsgICAgICAgICAgLyogZ290IHNvbWUgSkRBQSBub3csIGRvbid0IHdlICovCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZiAvKiBNTkdfSU5DTFVERV9KTkcgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19JTkNMVURFX0pORworTU5HX0NfU1BFQ0lBTEZVTkMgKG1uZ19zcGVjaWFsX2pkYXQpCit7CisgIHBEYXRhLT5iSGFzSkRBVCA9IE1OR19UUlVFOyAgICAgICAgICAvKiBnb3Qgc29tZSBKREFUIG5vdywgZG9uJ3Qgd2UgKi8KKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmIC8qIE1OR19JTkNMVURFX0pORyAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCitNTkdfQ19TUEVDSUFMRlVOQyAobW5nX3NwZWNpYWxfanNlcCkKK3sKKyAgcERhdGEtPmJIYXNKU0VQID0gTU5HX1RSVUU7ICAgICAgICAgIC8qIGluZGljYXRlIHdlJ3ZlIGhhZCB0aGUgOC0vMTItYml0IHNlcGFyYXRvciAqLworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYgLyogTU5HX0lOQ0xVREVfSk5HICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogTU5HIGNodW5rcyAqLworCitNTkdfQ19TUEVDSUFMRlVOQyAobW5nX3NwZWNpYWxfbWhkcikKK3sKKyAgaWYgKHBEYXRhLT5iSGFzaGVhZGVyKSAgICAgICAgICAgICAgIC8qIGNhbiBvbmx5IGJlIHRoZSBmaXJzdCBjaHVuayEgKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfU0VRVUVOQ0VFUlJPUik7CisKKyAgcERhdGEtPmJIYXNNSERSICAgICA9IE1OR19UUlVFOyAgICAgIC8qIG9oIGJveSwgYSByZWFsIE1ORyAqLworICBwRGF0YS0+Ykhhc2hlYWRlciAgID0gTU5HX1RSVUU7ICAgICAgLyogd2UndmUgZ290IGEgaGVhZGVyICovCisgIHBEYXRhLT5lSW1hZ2V0eXBlICAgPSBtbmdfaXRfbW5nOyAgICAvKiBmaWxsIGhlYWRlciBmaWVsZHMgKi8KKyAgcERhdGEtPmlXaWR0aCAgICAgICA9ICgobW5nX21oZHJwKXBDaHVuayktPmlXaWR0aDsKKyAgcERhdGEtPmlIZWlnaHQgICAgICA9ICgobW5nX21oZHJwKXBDaHVuayktPmlIZWlnaHQ7CisgIHBEYXRhLT5pVGlja3MgICAgICAgPSAoKG1uZ19taGRycClwQ2h1bmspLT5pVGlja3M7CisgIHBEYXRhLT5pTGF5ZXJjb3VudCAgPSAoKG1uZ19taGRycClwQ2h1bmspLT5pTGF5ZXJjb3VudDsKKyAgcERhdGEtPmlGcmFtZWNvdW50ICA9ICgobW5nX21oZHJwKXBDaHVuayktPmlGcmFtZWNvdW50OworICBwRGF0YS0+aVBsYXl0aW1lICAgID0gKChtbmdfbWhkcnApcENodW5rKS0+aVBsYXl0aW1lOworICBwRGF0YS0+aVNpbXBsaWNpdHkgID0gKChtbmdfbWhkcnApcENodW5rKS0+aVNpbXBsaWNpdHk7CisjaWZuZGVmIE1OR19OT19PTERfVkVSU0lPTlMKKyAgcERhdGEtPmJQcmVEcmFmdDQ4ICA9IE1OR19GQUxTRTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJlZGljdCBhbHBoYS1kZXB0aCAqLworICBpZiAoKHBEYXRhLT5pU2ltcGxpY2l0eSAmIDB4MDAwMDAwMDEpID09IDApCisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgcERhdGEtPmlBbHBoYWRlcHRoID0gMTY7ICAgICAgICAgICAvKiBubyBpbmRpY2F0b3JzID0gYXNzdW1lIHRoZSB3b3JzdCAqLworI2Vsc2UKKyAgICBwRGF0YS0+aUFscGhhZGVwdGggPSA4OyAgICAgICAgICAgIC8qIGFueXRoaW5nIGVsc2UgPSBhc3N1bWUgdGhlIHdvcnN0ICovCisjZW5kaWYKKyAgZWxzZQorICBpZiAoKHBEYXRhLT5pU2ltcGxpY2l0eSAmIDB4MDAwMDAwMDgpID09IDApCisgICAgcERhdGEtPmlBbHBoYWRlcHRoID0gMDsgICAgICAgICAgICAvKiBubyB0cmFuc3BhcmVuY3kgYXQgYWxsICovCisgIGVsc2UKKyAgaWYgKChwRGF0YS0+aVNpbXBsaWNpdHkgJiAweDAwMDAwMTQwKSA9PSAweDAwMDAwMDQwKQorICAgIHBEYXRhLT5pQWxwaGFkZXB0aCA9IDE7ICAgICAgICAgICAgLyogbm8gc2VtaS10cmFuc3BhcmVuY3kgZ3VhcmFudGVlZCAqLworICBlbHNlCisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgcERhdGEtPmlBbHBoYWRlcHRoID0gMTY7ICAgICAgICAgICAvKiBhbnl0aGluZyBlbHNlID0gYXNzdW1lIHRoZSB3b3JzdCAqLworI2Vsc2UKKyAgICBwRGF0YS0+aUFscGhhZGVwdGggPSA4OyAgICAgICAgICAgIC8qIGFueXRoaW5nIGVsc2UgPSBhc3N1bWUgdGhlIHdvcnN0ICovCisjZW5kaWYKKworI2lmZGVmIE1OR19JTkNMVURFX0pORyAgICAgICAgICAgICAgICAgLyogY2FuIHdlIGhhbmRsZSB0aGUgY29tcGxleGl0eSA/ICovCisgIGlmIChwRGF0YS0+aVNpbXBsaWNpdHkgJiAweDAwMDBGQzAwKQorI2Vsc2UKKyAgaWYgKHBEYXRhLT5pU2ltcGxpY2l0eSAmIDB4MDAwMEZDMTApCisjZW5kaWYKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfTU5HVE9PQ09NUExFWCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaXRzIG9uIG1heGltdW0gY2FudmFzID8gKi8KKyAgaWYgKChwRGF0YS0+aVdpZHRoID4gcERhdGEtPmlNYXh3aWR0aCkgfHwgKHBEYXRhLT5pSGVpZ2h0ID4gcERhdGEtPmlNYXhoZWlnaHQpKQorICAgIE1OR19XQVJOSU5HIChwRGF0YSwgTU5HX0lNQUdFVE9PTEFSR0UpOworCisgIGlmIChwRGF0YS0+ZlByb2Nlc3NoZWFkZXIpICAgICAgICAgICAvKiBpbmZvcm0gdGhlIGFwcCA/ICovCisgICAgaWYgKCFwRGF0YS0+ZlByb2Nlc3NoZWFkZXIgKCgobW5nX2hhbmRsZSlwRGF0YSksIHBEYXRhLT5pV2lkdGgsIHBEYXRhLT5pSGVpZ2h0KSkKKyAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19BUFBNSVNDRVJST1IpOworCisgIHBEYXRhLT5pSW1hZ2VsZXZlbCsrOyAgICAgICAgICAgICAgICAvKiBvbmUgbGV2ZWwgZGVlcGVyICovCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOyAgICAgICAgICAgICAgICAgIC8qIGRvbmUgKi8KK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworTU5HX0NfU1BFQ0lBTEZVTkMgKG1uZ19zcGVjaWFsX21lbmQpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZG8gc29tZXRoaW5nICovCisgICAgbW5nX3JldGNvZGUgaVJldGNvZGUgPSBtbmdfcHJvY2Vzc19kaXNwbGF5X21lbmQgKHBEYXRhKTsKKworICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKworICAgIGlmICghcERhdGEtPmlUb3RhbGZyYW1lcykgICAgICAgICAgLyogc2F2ZSB0b3RhbHMgKi8KKyAgICAgIHBEYXRhLT5pVG90YWxmcmFtZXMgICA9IHBEYXRhLT5pRnJhbWVzZXE7CisgICAgaWYgKCFwRGF0YS0+aVRvdGFsbGF5ZXJzKQorICAgICAgcERhdGEtPmlUb3RhbGxheWVycyAgID0gcERhdGEtPmlMYXllcnNlcTsKKyAgICBpZiAoIXBEYXRhLT5pVG90YWxwbGF5dGltZSkKKyAgICAgIHBEYXRhLT5pVG90YWxwbGF5dGltZSA9IHBEYXRhLT5pRnJhbWV0aW1lOworICB9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfRElTUExBWSAqLworCisgIHBEYXRhLT5iSGFzTUhEUiA9IE1OR19GQUxTRTsgICAgICAgICAvKiBlbmQgb2YgdGhlIGxpbmUsIGJybyEgKi8KKworICByZXR1cm4gTU5HX05PRVJST1I7ICAgICAgICAgICAgICAgICAgLyogZG9uZSAqLworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfTE9PUAorTU5HX0ZfU1BFQ0lBTEZVTkMgKG1uZ19kZWJ1bmtfbG9vcCkKK3sKKyAgbW5nX2xvb3BwICBwTE9PUCAgICA9IChtbmdfbG9vcHApcENodW5rOworICBtbmdfdWludDMyIGlSYXdsZW4gID0gKnBpUmF3bGVuOworICBtbmdfdWludDhwIHBSYXdkYXRhID0gKnBwUmF3ZGF0YTsKKworICBpZiAoaVJhd2xlbiA+PSA1KSAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIGNoZWNrcyAqLworICB7CisgICAgaWYgKGlSYXdsZW4gPj0gNikKKyAgICB7CisgICAgICBpZiAoKGlSYXdsZW4gLSA2KSAlIDQgIT0gMCkKKyAgICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURMRU5HVEgpOworICAgIH0KKyAgfQorICBlbHNlCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURMRU5HVEgpOworCisgIGlmIChpUmF3bGVuID49IDUpICAgICAgICAgICAgICAgICAgLyogc3RvcmUgdGhlIGZpZWxkcyAqLworICB7CisgICAgcExPT1AtPmlMZXZlbCAgPSAqcFJhd2RhdGE7CisKKyNpZm5kZWYgTU5HX05PX09MRF9WRVJTSU9OUworICAgIGlmIChwRGF0YS0+YlByZURyYWZ0NDgpCisgICAgeworICAgICAgcExPT1AtPmlUZXJtaW5hdGlvbiA9ICoocFJhd2RhdGErMSk7CisgICAgICBwTE9PUC0+aVJlcGVhdCA9IG1uZ19nZXRfdWludDMyIChwUmF3ZGF0YSsyKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgeworICAgICAgcExPT1AtPmlSZXBlYXQgPSBtbmdfZ2V0X3VpbnQzMiAocFJhd2RhdGErMSk7CisgICAgfQorCisgICAgaWYgKGlSYXdsZW4gPj0gNikKKyAgICB7CisjaWZuZGVmIE1OR19OT19PTERfVkVSU0lPTlMKKyAgICAgIGlmICghcERhdGEtPmJQcmVEcmFmdDQ4KQorI2VuZGlmCisgICAgICAgIHBMT09QLT5pVGVybWluYXRpb24gPSAqKHBSYXdkYXRhKzUpOworCisgICAgICBpZiAoaVJhd2xlbiA+PSAxMCkKKyAgICAgIHsKKyAgICAgICAgcExPT1AtPmlJdGVybWluID0gbW5nX2dldF91aW50MzIgKHBSYXdkYXRhKzYpOworCisjaWZuZGVmIE1OR19OT19MT09QX1NJR05BTFNfU1VQUE9SVEVECisgICAgICAgIGlmIChpUmF3bGVuID49IDE0KQorICAgICAgICB7CisgICAgICAgICAgcExPT1AtPmlJdGVybWF4ID0gbW5nX2dldF91aW50MzIgKHBSYXdkYXRhKzEwKTsKKyAgICAgICAgICBwTE9PUC0+aUNvdW50ICAgPSAoaVJhd2xlbiAtIDE0KSAvIDQ7CisKKyAgICAgICAgICBpZiAocExPT1AtPmlDb3VudCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBNTkdfQUxMT0MgKHBEYXRhLCBwTE9PUC0+cFNpZ25hbHMsIHBMT09QLT5pQ291bnQgPDwgMik7CisKKyNpZm5kZWYgTU5HX0JJR0VORElBTl9TVVBQT1JURUQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgaVg7CisgICAgICAgICAgICAgIG1uZ191aW50OHAgIHBJbiAgPSBwUmF3ZGF0YSArIDE0OworICAgICAgICAgICAgICBtbmdfdWludDMycCBwT3V0ID0gKG1uZ191aW50MzJwKXBMT09QLT5wU2lnbmFsczsKKworICAgICAgICAgICAgICBmb3IgKGlYID0gMDsgaVggPCBwTE9PUC0+aUNvdW50OyBpWCsrKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKnBPdXQrKyA9IG1uZ19nZXRfdWludDMyIChwSW4pOworICAgICAgICAgICAgICAgIHBJbiArPSA0OworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgTU5HX0NPUFkgKHBMT09QLT5wU2lnbmFscywgcFJhd2RhdGEgKyAxNCwgcExPT1AtPmlDb3VudCA8PCAyKTsKKyNlbmRpZiAvKiAhTU5HX0JJR0VORElBTl9TVVBQT1JURUQgKi8KKyAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgfQorICAgIH0KKyAgfQorCisgICpwaVJhd2xlbiA9IDA7CisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19MT09QCitNTkdfQ19TUEVDSUFMRlVOQyAobW5nX3NwZWNpYWxfbG9vcCkKK3sKKyAgaWYgKCFwRGF0YS0+YkNhY2hlcGxheWJhY2spICAgICAgICAgIC8qIG11c3Qgc3RvcmUgcGxheWJhY2sgaW5mbyB0byB3b3JrISEgKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfTE9PUFdJVEhDQUNIRU9GRik7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCisgIHsKKyAgICBtbmdfcmV0Y29kZSBpUmV0Y29kZTsKKworICAgIHBEYXRhLT5iSGFzTE9PUCA9IE1OR19UUlVFOyAgICAgICAgLyogaW5kaWNhdGUgd2UncmUgaW5zaWRlIGEgbG9vcCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIHRoZSBMT09QIGFuaS1vYmplY3QgKi8KKyAgICBpUmV0Y29kZSA9IG1uZ19jcmVhdGVfYW5pX2xvb3AgKHBEYXRhLCBwQ2h1bmspOworICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNraXAgdGlsbCBtYXRjaGluZyBFTkRMIGlmIGl0ZXJhdGlvbj0wICovCisgICAgaWYgKCghcERhdGEtPmJTa2lwcGluZykgJiYgKCgobW5nX2xvb3BwKXBDaHVuayktPmlSZXBlYXQgPT0gMCkpCisgICAgICBwRGF0YS0+YlNraXBwaW5nID0gTU5HX1RSVUU7CisgIH0KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOyAgICAgICAgICAgICAgICAgIC8qIGRvbmUgKi8KK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfTE9PUAorTU5HX0NfU1BFQ0lBTEZVTkMgKG1uZ19zcGVjaWFsX2VuZGwpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorICBpZiAocERhdGEtPmJIYXNMT09QKSAgICAgICAgICAgICAgICAgLyogYXJlIHdlIHJlYWxseSBwcm9jZXNzaW5nIGEgbG9vcCA/ICovCisgIHsKKyAgICBtbmdfdWludDggaUxldmVsID0gKChtbmdfZW5kbHApcENodW5rKS0+aUxldmVsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIGFuIEVOREwgYW5pbWF0aW9uIG9iamVjdCAqLworICAgIHJldHVybiBtbmdfY3JlYXRlX2FuaV9lbmRsIChwRGF0YSwgaUxldmVsKTsKKyAgfQorICBlbHNlCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX05PTUFUQ0hJTkdMT09QKTsKKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOyAgICAgICAgICAgICAgICAgIC8qIGRvbmUgKi8KK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfREVGSQorTU5HX0NfU1BFQ0lBTEZVTkMgKG1uZ19zcGVjaWFsX2RlZmkpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorICBtbmdfcmV0Y29kZSBpUmV0Y29kZTsKKworICBwRGF0YS0+aURFRklvYmplY3RpZCAgICAgPSAoKG1uZ19kZWZpcClwQ2h1bmspLT5pT2JqZWN0aWQ7CisgIHBEYXRhLT5iREVGSWhhc2Rvbm90c2hvdyA9ICgobW5nX2RlZmlwKXBDaHVuayktPmJIYXNkb25vdHNob3c7CisgIHBEYXRhLT5pREVGSWRvbm90c2hvdyAgICA9ICgobW5nX2RlZmlwKXBDaHVuayktPmlEb25vdHNob3c7CisgIHBEYXRhLT5iREVGSWhhc2NvbmNyZXRlICA9ICgobW5nX2RlZmlwKXBDaHVuayktPmJIYXNjb25jcmV0ZTsKKyAgcERhdGEtPmlERUZJY29uY3JldGUgICAgID0gKChtbmdfZGVmaXApcENodW5rKS0+aUNvbmNyZXRlOworICBwRGF0YS0+YkRFRkloYXNsb2NhICAgICAgPSAoKG1uZ19kZWZpcClwQ2h1bmspLT5iSGFzbG9jYTsKKyAgcERhdGEtPmlERUZJbG9jYXggICAgICAgID0gKChtbmdfZGVmaXApcENodW5rKS0+aVhsb2NhdGlvbjsKKyAgcERhdGEtPmlERUZJbG9jYXkgICAgICAgID0gKChtbmdfZGVmaXApcENodW5rKS0+aVlsb2NhdGlvbjsKKyAgcERhdGEtPmJERUZJaGFzY2xpcCAgICAgID0gKChtbmdfZGVmaXApcENodW5rKS0+Ykhhc2NsaXA7CisgIHBEYXRhLT5pREVGSWNsaXBsICAgICAgICA9ICgobW5nX2RlZmlwKXBDaHVuayktPmlMZWZ0Y2I7CisgIHBEYXRhLT5pREVGSWNsaXByICAgICAgICA9ICgobW5nX2RlZmlwKXBDaHVuayktPmlSaWdodGNiOworICBwRGF0YS0+aURFRkljbGlwdCAgICAgICAgPSAoKG1uZ19kZWZpcClwQ2h1bmspLT5pVG9wY2I7CisgIHBEYXRhLT5pREVGSWNsaXBiICAgICAgICA9ICgobW5nX2RlZmlwKXBDaHVuayktPmlCb3R0b21jYjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSBhbiBhbmltYXRpb24gb2JqZWN0ICovCisgIGlSZXRjb2RlID0gbW5nX2NyZWF0ZV9hbmlfZGVmaSAocERhdGEpOworICBpZiAoIWlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAgLyogZG8gZGlzcGxheSBwcm9jZXNzaW5nICovCisgICAgaVJldGNvZGUgPSBtbmdfcHJvY2Vzc19kaXNwbGF5X2RlZmkgKHBEYXRhKTsKKyAgcmV0dXJuIGlSZXRjb2RlOworI2Vsc2UKKyAgcmV0dXJuIE1OR19OT0VSUk9SOyAgICAgICAgICAgICAgICAgIC8qIGRvbmUgKi8KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX0JBU0kKK01OR19DX1NQRUNJQUxGVU5DIChtbmdfc3BlY2lhbF9iYXNpKQoreworICBwRGF0YS0+Ykhhc0JBU0kgICAgID0gTU5HX1RSVUU7ICAgICAgLyogaW5zaWRlIGEgQkFTSS1JRU5EIGJsb2NrIG5vdyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmUgaW50ZXJlc3RpbmcgZmllbGRzICovCisgIHBEYXRhLT5pRGF0YXdpZHRoICAgPSAoKG1uZ19iYXNpcClwQ2h1bmspLT5pV2lkdGg7CisgIHBEYXRhLT5pRGF0YWhlaWdodCAgPSAoKG1uZ19iYXNpcClwQ2h1bmspLT5pSGVpZ2h0OworICBwRGF0YS0+aUJpdGRlcHRoICAgID0gKChtbmdfYmFzaXApcENodW5rKS0+aUJpdGRlcHRoOyAgIAorICBwRGF0YS0+aUNvbG9ydHlwZSAgID0gKChtbmdfYmFzaXApcENodW5rKS0+aUNvbG9ydHlwZTsKKyAgcERhdGEtPmlDb21wcmVzc2lvbiA9ICgobW5nX2Jhc2lwKXBDaHVuayktPmlDb21wcmVzc2lvbjsKKyAgcERhdGEtPmlGaWx0ZXIgICAgICA9ICgobW5nX2Jhc2lwKXBDaHVuayktPmlGaWx0ZXI7CisgIHBEYXRhLT5pSW50ZXJsYWNlICAgPSAoKG1uZ19iYXNpcClwQ2h1bmspLT5pSW50ZXJsYWNlOworCisjaWYgZGVmaW5lZChNTkdfTk9fMV8yXzRCSVRfU1VQUE9SVCkgfHwgZGVmaW5lZChNTkdfTk9fMTZCSVRfU1VQUE9SVCkKKyAgcERhdGEtPmlQTkdtdWx0ID0gMTsKKyAgcERhdGEtPmlQTkdkZXB0aCA9IHBEYXRhLT5pQml0ZGVwdGg7CisjZW5kaWYKKworI2lmZGVmIE1OR19OT18xXzJfNEJJVF9TVVBQT1JUCisgIGlmIChwRGF0YS0+aUJpdGRlcHRoIDwgOCkKKyAgICBwRGF0YS0+aUJpdGRlcHRoID0gODsKKyNlbmRpZgorI2lmZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgIGlmIChwRGF0YS0+aUJpdGRlcHRoID4gOCkKKyAgICB7CisgICAgICBwRGF0YS0+aUJpdGRlcHRoID0gODsKKyAgICAgIHBEYXRhLT5pUE5HbXVsdCA9IDI7CisgICAgfQorI2VuZGlmCisKKyAgaWYgKChwRGF0YS0+aUJpdGRlcHRoICE9ICA4KSAgICAgIC8qIHBhcmFtZXRlciB2YWxpZGl0eSBjaGVja3MgKi8KKyNpZm5kZWYgTU5HX05PXzFfMl80QklUX1NVUFBPUlQKKyAgICAgICYmIChwRGF0YS0+aUJpdGRlcHRoICE9ICAxKSAmJgorICAgICAgKHBEYXRhLT5pQml0ZGVwdGggIT0gIDIpICYmCisgICAgICAocERhdGEtPmlCaXRkZXB0aCAhPSAgNCkKKyNlbmRpZgorI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgICAgJiYgKHBEYXRhLT5pQml0ZGVwdGggIT0gMTYpCisjZW5kaWYKKyAgICAgICkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJREJJVERFUFRIKTsKKworICBpZiAoKHBEYXRhLT5pQ29sb3J0eXBlICE9IE1OR19DT0xPUlRZUEVfR1JBWSAgICkgJiYKKyAgICAgIChwRGF0YS0+aUNvbG9ydHlwZSAhPSBNTkdfQ09MT1JUWVBFX1JHQiAgICApICYmCisgICAgICAocERhdGEtPmlDb2xvcnR5cGUgIT0gTU5HX0NPTE9SVFlQRV9JTkRFWEVEKSAmJgorICAgICAgKHBEYXRhLT5pQ29sb3J0eXBlICE9IE1OR19DT0xPUlRZUEVfR1JBWUEgICkgJiYKKyAgICAgIChwRGF0YS0+aUNvbG9ydHlwZSAhPSBNTkdfQ09MT1JUWVBFX1JHQkEgICApICAgICkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRENPTE9SVFlQRSk7CisKKyAgaWYgKChwRGF0YS0+aUNvbG9ydHlwZSA9PSBNTkdfQ09MT1JUWVBFX0lOREVYRUQpICYmIChwRGF0YS0+aUJpdGRlcHRoID4gOCkpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURCSVRERVBUSCk7CisKKyAgaWYgKCgocERhdGEtPmlDb2xvcnR5cGUgPT0gTU5HX0NPTE9SVFlQRV9SR0IgICAgKSB8fAorICAgICAgIChwRGF0YS0+aUNvbG9ydHlwZSA9PSBNTkdfQ09MT1JUWVBFX0dSQVlBICApIHx8CisgICAgICAgKHBEYXRhLT5pQ29sb3J0eXBlID09IE1OR19DT0xPUlRZUEVfUkdCQSAgICkgICAgKSAmJgorICAgICAgKHBEYXRhLT5pQml0ZGVwdGggPCA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgICAgKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElEQklUREVQVEgpOworCisjaWYgZGVmaW5lZChGSUxURVIxOTIpIHx8IGRlZmluZWQoRklMVEVSMTkzKQorICBpZiAoKHBEYXRhLT5pRmlsdGVyICE9IE1OR19GSUxURVJfQURBUFRJVkUgKSAmJgorI2lmIGRlZmluZWQoRklMVEVSMTkyKSAmJiBkZWZpbmVkKEZJTFRFUjE5MykKKyAgICAgIChwRGF0YS0+aUZpbHRlciAhPSBNTkdfRklMVEVSX0RJRkZFUklORykgJiYKKyAgICAgIChwRGF0YS0+aUZpbHRlciAhPSBNTkdfRklMVEVSX05PRklMVEVSICkgICAgKQorI2Vsc2UKKyNpZmRlZiBGSUxURVIxOTIKKyAgICAgIChwRGF0YS0+aUZpbHRlciAhPSBNTkdfRklMVEVSX0RJRkZFUklORykgICAgKQorI2Vsc2UKKyAgICAgIChwRGF0YS0+aUZpbHRlciAhPSBNTkdfRklMVEVSX05PRklMVEVSICkgICAgKQorI2VuZGlmCisjZW5kaWYKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJREZJTFRFUik7CisjZWxzZQorICBpZiAocERhdGEtPmlGaWx0ZXIpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURGSUxURVIpOworI2VuZGlmCisKKyAgcERhdGEtPmlJbWFnZWxldmVsKys7ICAgICAgICAgICAgICAgIC8qIG9uZSBsZXZlbCBkZWVwZXIgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX0RJU1BMQVkKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSBhbiBhbmltYXRpb24gb2JqZWN0ICovCisgICAgbW5nX3JldGNvZGUgaVJldGNvZGUgPSBtbmdfY3JlYXRlX2FuaV9iYXNpIChwRGF0YSwgcENodW5rKTsKKyAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICByZXR1cm4gaVJldGNvZGU7CisgIH0KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisKKyNpZmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICBpZiAoKChtbmdfYmFzaXApcENodW5rKS0+aUJpdGRlcHRoID4gOCkKKyAgICAoKG1uZ19iYXNpcClwQ2h1bmspLT5pQml0ZGVwdGggPSA4OworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOyAgICAgICAgICAgICAgICAgIC8qIGRvbmUgKi8KK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfQ0xPTgorTU5HX0NfU1BFQ0lBTEZVTkMgKG1uZ19zcGVjaWFsX2Nsb24pCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorICByZXR1cm4gbW5nX2NyZWF0ZV9hbmlfY2xvbiAocERhdGEsIHBDaHVuayk7CisjZWxzZQorICByZXR1cm4gTU5HX05PRVJST1I7ICAgICAgICAgICAgICAgICAgLyogZG9uZSAqLworI2VuZGlmIC8qIE1OR19TVVBQT1JUX0RJU1BMQVkgKi8KK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfUEFTVAorTU5HX0ZfU1BFQ0lBTEZVTkMgKG1uZ19kZWJ1bmtfcGFzdCkKK3sKKyAgbW5nX3Bhc3RwICAgICAgICBwUEFTVCAgICA9IChtbmdfcGFzdHApcENodW5rOworICBtbmdfdWludDMyICAgICAgIGlSYXdsZW4gID0gKnBpUmF3bGVuOworICBtbmdfdWludDhwICAgICAgIHBSYXdkYXRhID0gKnBwUmF3ZGF0YTsKKyAgbW5nX3VpbnQzMiAgICAgICBpU2l6ZTsKKyAgbW5nX3VpbnQzMiAgICAgICBpWDsKKyAgbW5nX3Bhc3Rfc291cmNlcCBwU291cmNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2hlY2sgdGhlIGxlbmd0aCAqLworICBpZiAoKGlSYXdsZW4gPCA0MSkgfHwgKCgoaVJhd2xlbiAtIDExKSAlIDMwKSAhPSAwKSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRExFTkdUSCk7CisKKyAgcFBBU1QtPmlEZXN0aWQgICAgID0gbW5nX2dldF91aW50MTYgKHBSYXdkYXRhKTsKKyAgcFBBU1QtPmlUYXJnZXR0eXBlID0gKihwUmF3ZGF0YSsyKTsKKyAgcFBBU1QtPmlUYXJnZXR4ICAgID0gbW5nX2dldF9pbnQzMiAgKHBSYXdkYXRhKzMpOworICBwUEFTVC0+aVRhcmdldHkgICAgPSBtbmdfZ2V0X2ludDMyICAocFJhd2RhdGErNyk7CisgIHBQQVNULT5pQ291bnQgICAgICA9ICgoaVJhd2xlbiAtIDExKSAvIDMwKTsgLyogaG93IG1hbnkgZW50cmllcyBhZ2Fpbj8gKi8KKyAgaVNpemUgICAgICAgICAgICAgID0gcFBBU1QtPmlDb3VudCAqIHNpemVvZiAobW5nX3Bhc3Rfc291cmNlKTsKKworICBwUmF3ZGF0YSArPSAxMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCBhIGJ1ZmZlciBmb3IgYWxsIHRoZSBzb3VyY2UgYmxvY2tzICovCisgIE1OR19BTExPQyAocERhdGEsIHBQQVNULT5wU291cmNlcywgaVNpemUpOworCisgIHBTb3VyY2UgPSAobW5nX3Bhc3Rfc291cmNlcCkocFBBU1QtPnBTb3VyY2VzKTsKKworICBmb3IgKGlYID0gcFBBU1QtPmlDb3VudDsgaVggPiAwOyBpWC0tKQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm93IGNvcHkgdGhlIHNvdXJjZSBibG9ja3MgKi8KKyAgICBwU291cmNlLT5pU291cmNlaWQgICAgID0gbW5nX2dldF91aW50MTYgKHBSYXdkYXRhKTsKKyAgICBwU291cmNlLT5pQ29tcG9zaXRpb24gID0gKihwUmF3ZGF0YSsyKTsKKyAgICBwU291cmNlLT5pT3JpZW50YXRpb24gID0gKihwUmF3ZGF0YSszKTsKKyAgICBwU291cmNlLT5pT2Zmc2V0dHlwZSAgID0gKihwUmF3ZGF0YSs0KTsKKyAgICBwU291cmNlLT5pT2Zmc2V0eCAgICAgID0gbW5nX2dldF9pbnQzMiAocFJhd2RhdGErNSk7CisgICAgcFNvdXJjZS0+aU9mZnNldHkgICAgICA9IG1uZ19nZXRfaW50MzIgKHBSYXdkYXRhKzkpOworICAgIHBTb3VyY2UtPmlCb3VuZGFyeXR5cGUgPSAqKHBSYXdkYXRhKzEzKTsKKyAgICBwU291cmNlLT5pQm91bmRhcnlsICAgID0gbW5nX2dldF9pbnQzMiAocFJhd2RhdGErMTQpOworICAgIHBTb3VyY2UtPmlCb3VuZGFyeXIgICAgPSBtbmdfZ2V0X2ludDMyIChwUmF3ZGF0YSsxOCk7CisgICAgcFNvdXJjZS0+aUJvdW5kYXJ5dCAgICA9IG1uZ19nZXRfaW50MzIgKHBSYXdkYXRhKzIyKTsKKyAgICBwU291cmNlLT5pQm91bmRhcnliICAgID0gbW5nX2dldF9pbnQzMiAocFJhd2RhdGErMjYpOworCisgICAgcFNvdXJjZSsrOworICAgIHBSYXdkYXRhICs9IDMwOworICB9CisKKyAgKnBpUmF3bGVuID0gMDsKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX1BBU1QKK01OR19DX1NQRUNJQUxGVU5DIChtbmdfc3BlY2lhbF9wYXN0KQoreworI2lmZGVmIE1OR19TVVBQT1JUX0RJU1BMQVkKKyAgcmV0dXJuIG1uZ19jcmVhdGVfYW5pX3Bhc3QgKHBEYXRhLCBwQ2h1bmspOworI2Vsc2UKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworI2VuZGlmIC8qIE1OR19TVVBQT1JUX0RJU1BMQVkgKi8KK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfRElTQworTU5HX0ZfU1BFQ0lBTEZVTkMgKG1uZ19kaXNjX2VudHJpZXMpCit7CisgIG1uZ19kaXNjcCAgIHBESVNDICAgID0gKG1uZ19kaXNjcClwQ2h1bms7CisgIG1uZ191aW50MzIgIGlSYXdsZW4gID0gKnBpUmF3bGVuOworICBtbmdfdWludDhwICBwUmF3ZGF0YSA9ICpwcFJhd2RhdGE7CisKKyAgaWYgKChpUmF3bGVuICUgMikgIT0gMCkgICAgICAgICAgICAgIC8qIGNoZWNrIHRoZSBsZW5ndGggKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRExFTkdUSCk7CisKKyAgcERJU0MtPmlDb3VudCA9IChpUmF3bGVuIC8gc2l6ZW9mIChtbmdfdWludDE2KSk7CisKKyAgaWYgKHBESVNDLT5pQ291bnQpCisgIHsKKyAgICBNTkdfQUxMT0MgKHBEYXRhLCBwRElTQy0+cE9iamVjdGlkcywgaVJhd2xlbik7CisKKyNpZm5kZWYgTU5HX0JJR0VORElBTl9TVVBQT1JURUQKKyAgICB7CisgICAgICBtbmdfdWludDMyICBpWDsKKyAgICAgIG1uZ191aW50OHAgIHBJbiAgPSBwUmF3ZGF0YTsKKyAgICAgIG1uZ191aW50MTZwIHBPdXQgPSBwRElTQy0+cE9iamVjdGlkczsKKworICAgICAgZm9yIChpWCA9IHBESVNDLT5pQ291bnQ7IGlYID4gMDsgaVgtLSkKKyAgICAgIHsKKyAgICAgICAgKnBPdXQrKyA9IG1uZ19nZXRfdWludDE2IChwSW4pOworICAgICAgICBwSW4gKz0gMjsKKyAgICAgIH0KKyAgICB9CisjZWxzZQorICAgIE1OR19DT1BZIChwRElTQy0+cE9iamVjdGlkcywgcFJhd2RhdGEsIGlSYXdsZW4pOworI2VuZGlmIC8qICFNTkdfQklHRU5ESUFOX1NVUFBPUlRFRCAqLworICB9CisKKyAgKnBpUmF3bGVuID0gMDsKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX0RJU0MKK01OR19DX1NQRUNJQUxGVU5DIChtbmdfc3BlY2lhbF9kaXNjKQoreworI2lmZGVmIE1OR19TVVBQT1JUX0RJU1BMQVkKKyAgcmV0dXJuIG1uZ19jcmVhdGVfYW5pX2Rpc2MgKHBEYXRhLCBwQ2h1bmspOworI2Vsc2UKKyAgcmV0dXJuIE1OR19OT0VSUk9SOyAgICAgICAgICAgICAgICAgIAorI2VuZGlmIC8qIE1OR19TVVBQT1JUX0RJU1BMQVkgKi8KK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfQkFDSworTU5HX0NfU1BFQ0lBTEZVTkMgKG1uZ19zcGVjaWFsX2JhY2spCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmV0cmlldmUgdGhlIGZpZWxkcyAqLworICBwRGF0YS0+Ykhhc0JBQ0sgICAgICAgPSBNTkdfVFJVRTsKKyAgcERhdGEtPmlCQUNLcmVkICAgICAgID0gKChtbmdfYmFja3ApcENodW5rKS0+aVJlZDsKKyAgcERhdGEtPmlCQUNLZ3JlZW4gICAgID0gKChtbmdfYmFja3ApcENodW5rKS0+aUdyZWVuOworICBwRGF0YS0+aUJBQ0tibHVlICAgICAgPSAoKG1uZ19iYWNrcClwQ2h1bmspLT5pQmx1ZTsKKyAgcERhdGEtPmlCQUNLbWFuZGF0b3J5ID0gKChtbmdfYmFja3ApcENodW5rKS0+aU1hbmRhdG9yeTsKKyAgcERhdGEtPmlCQUNLaW1hZ2VpZCAgID0gKChtbmdfYmFja3ApcENodW5rKS0+aUltYWdlaWQ7CisgIHBEYXRhLT5pQkFDS3RpbGUgICAgICA9ICgobW5nX2JhY2twKXBDaHVuayktPmlUaWxlOworCisgIHJldHVybiBtbmdfY3JlYXRlX2FuaV9iYWNrIChwRGF0YSk7CisjZWxzZQorICByZXR1cm4gTU5HX05PRVJST1I7CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfRElTUExBWSAqLworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19GUkFNCitNTkdfRl9TUEVDSUFMRlVOQyAobW5nX2ZyYW1fcmVtYWluZGVyKQoreworICBtbmdfZnJhbXAgIHBGUkFNICAgICA9IChtbmdfZnJhbXApcENodW5rOworICBtbmdfdWludDMyIGlSYXdsZW4gICA9ICpwaVJhd2xlbjsKKyAgbW5nX3VpbnQ4cCBwUmF3ZGF0YSAgPSAqcHBSYXdkYXRhOworICBtbmdfdWludDMyIGlSZXF1aXJlZCA9IDA7CisKKyAgaWYgKGlSYXdsZW4gPCA0KSAgICAgICAgICAgICAgICAgICAgIC8qIG11c3QgaGF2ZSBhdCBsZWFzdCA0IGJ5dGVzICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURMRU5HVEgpOworCisgIGlSZXF1aXJlZCA9IDQ7ICAgICAgICAgICAgICAgICAgICAgICAvKiBjYWxjdWxhdGUgYW5kIGNoZWNrIHJlcXVpcmVkIHJlbWFpbmluZyBsZW5ndGggKi8KKworICBwRlJBTS0+aUNoYW5nZWRlbGF5ICAgID0gKnBSYXdkYXRhOworICBwRlJBTS0+aUNoYW5nZXRpbWVvdXQgID0gKihwUmF3ZGF0YSsxKTsKKyAgcEZSQU0tPmlDaGFuZ2VjbGlwcGluZyA9ICoocFJhd2RhdGErMik7CisgIHBGUkFNLT5pQ2hhbmdlc3luY2lkICAgPSAqKHBSYXdkYXRhKzMpOworCisgIGlmIChwRlJBTS0+aUNoYW5nZWRlbGF5ICAgKSB7IGlSZXF1aXJlZCArPSAgNDsgfQorICBpZiAocEZSQU0tPmlDaGFuZ2V0aW1lb3V0ICkgeyBpUmVxdWlyZWQgKz0gIDQ7IH0KKyAgaWYgKHBGUkFNLT5pQ2hhbmdlY2xpcHBpbmcpIHsgaVJlcXVpcmVkICs9IDE3OyB9CisKKyAgaWYgKHBGUkFNLT5pQ2hhbmdlc3luY2lkKQorICB7CisgICAgaWYgKChpUmF3bGVuIC0gaVJlcXVpcmVkKSAlIDQgIT0gMCkKKyAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElETEVOR1RIKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBpZiAoaVJhd2xlbiAhPSBpUmVxdWlyZWQpCisgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRExFTkdUSCk7CisgIH0KKworICBwUmF3ZGF0YSArPSA0OworCisgIGlmIChwRlJBTS0+aUNoYW5nZWRlbGF5KSAgICAgICAgICAgICAgLyogZGVsYXkgY2hhbmdlZCA/ICovCisgIHsKKyAgICBwRlJBTS0+aURlbGF5ID0gbW5nX2dldF91aW50MzIgKHBSYXdkYXRhKTsKKyAgICBwUmF3ZGF0YSArPSA0OworICB9CisKKyAgaWYgKHBGUkFNLT5pQ2hhbmdldGltZW91dCkgICAgICAgICAgICAvKiB0aW1lb3V0IGNoYW5nZWQgPyAqLworICB7CisgICAgcEZSQU0tPmlUaW1lb3V0ID0gbW5nX2dldF91aW50MzIgKHBSYXdkYXRhKTsKKyAgICBwUmF3ZGF0YSArPSA0OworICB9CisKKyAgaWYgKHBGUkFNLT5pQ2hhbmdlY2xpcHBpbmcpICAgICAgICAgICAvKiBjbGlwcGluZyBjaGFuZ2VkID8gKi8KKyAgeworICAgIHBGUkFNLT5pQm91bmRhcnl0eXBlID0gKnBSYXdkYXRhOworICAgIHBGUkFNLT5pQm91bmRhcnlsICAgID0gbW5nX2dldF9pbnQzMiAocFJhd2RhdGErMSk7CisgICAgcEZSQU0tPmlCb3VuZGFyeXIgICAgPSBtbmdfZ2V0X2ludDMyIChwUmF3ZGF0YSs1KTsKKyAgICBwRlJBTS0+aUJvdW5kYXJ5dCAgICA9IG1uZ19nZXRfaW50MzIgKHBSYXdkYXRhKzkpOworICAgIHBGUkFNLT5pQm91bmRhcnliICAgID0gbW5nX2dldF9pbnQzMiAocFJhd2RhdGErMTMpOworICAgIHBSYXdkYXRhICs9IDE3OworICB9CisKKyAgaWYgKHBGUkFNLT5pQ2hhbmdlc3luY2lkKQorICB7CisgICAgcEZSQU0tPmlDb3VudCAgICA9IChpUmF3bGVuIC0gaVJlcXVpcmVkKSAvIDQ7CisKKyAgICBpZiAocEZSQU0tPmlDb3VudCkKKyAgICB7CisgICAgICBNTkdfQUxMT0MgKHBEYXRhLCBwRlJBTS0+cFN5bmNpZHMsIHBGUkFNLT5pQ291bnQgKiA0KTsKKworI2lmbmRlZiBNTkdfQklHRU5ESUFOX1NVUFBPUlRFRAorICAgICAgeworICAgICAgICBtbmdfdWludDMyIGlYOworICAgICAgICBtbmdfdWludDMycCBwT3V0ID0gcEZSQU0tPnBTeW5jaWRzOworCisgICAgICAgIGZvciAoaVggPSBwRlJBTS0+aUNvdW50OyBpWCA+IDA7IGlYLS0pCisgICAgICAgIHsKKyAgICAgICAgICAqcE91dCsrID0gbW5nX2dldF91aW50MzIgKHBSYXdkYXRhKTsKKyAgICAgICAgICBwUmF3ZGF0YSArPSA0OworICAgICAgICB9CisgICAgICB9CisjZWxzZQorICAgICAgTU5HX0NPUFkgKHBGUkFNLT5wU3luY2lkcywgcFJhd2RhdGEsIHBGUkFNLT5pQ291bnQgKiA0KTsKKyNlbmRpZiAvKiAhTU5HX0JJR0VORElBTl9TVVBQT1JURUQgKi8KKyAgICB9CisgIH0KKworI2lmbmRlZiBNTkdfTk9fT0xEX1ZFUlNJT05TCisgIGlmIChwRGF0YS0+YlByZURyYWZ0NDgpICAgICAgICAgICAgICAvKiBvbGQgc3R5bGUgaW5wdXQtc3RyZWFtID8gKi8KKyAgeworICAgIHN3aXRjaCAocEZSQU0tPmlNb2RlKSAgICAgICAgICAgICAgLyogZml4IHRoZSBmcmFtaW5nIG1vZGUgdGhlbiAqLworICAgIHsKKyAgICAgIGNhc2UgIDA6IHsgYnJlYWs7IH0KKyAgICAgIGNhc2UgIDE6IHsgcEZSQU0tPmlNb2RlID0gMzsgYnJlYWs7IH0KKyAgICAgIGNhc2UgIDI6IHsgcEZSQU0tPmlNb2RlID0gNDsgYnJlYWs7IH0KKyAgICAgIGNhc2UgIDM6IHsgcEZSQU0tPmlNb2RlID0gMTsgYnJlYWs7IH0KKyAgICAgIGNhc2UgIDQ6IHsgcEZSQU0tPmlNb2RlID0gMTsgYnJlYWs7IH0KKyAgICAgIGNhc2UgIDU6IHsgcEZSQU0tPmlNb2RlID0gMjsgYnJlYWs7IH0KKyAgICAgIGRlZmF1bHQ6IHsgcEZSQU0tPmlNb2RlID0gMTsgYnJlYWs7IH0KKyAgICB9CisgIH0KKyNlbmRpZgorCisgICpwaVJhd2xlbiA9IDA7CisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19GUkFNCitNTkdfQ19TUEVDSUFMRlVOQyAobW5nX3NwZWNpYWxfZnJhbSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCisgIHJldHVybiBtbmdfY3JlYXRlX2FuaV9mcmFtIChwRGF0YSwgcENodW5rKTsKKyNlbHNlCisgIHJldHVybiBNTkdfTk9FUlJPUjsKKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX01PVkUKK01OR19DX1NQRUNJQUxGVU5DIChtbmdfc3BlY2lhbF9tb3ZlKQoreworI2lmZGVmIE1OR19TVVBQT1JUX0RJU1BMQVkKKyAgcmV0dXJuIG1uZ19jcmVhdGVfYW5pX21vdmUgKHBEYXRhLCBwQ2h1bmspOworI2Vsc2UKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworI2VuZGlmIC8qIE1OR19TVVBQT1JUX0RJU1BMQVkgKi8KK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfQ0xJUAorTU5HX0NfU1BFQ0lBTEZVTkMgKG1uZ19zcGVjaWFsX2NsaXApCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorICByZXR1cm4gbW5nX2NyZWF0ZV9hbmlfY2xpcCAocERhdGEsIHBDaHVuayk7CisjZWxzZQorICByZXR1cm4gTU5HX05PRVJST1I7ICAgICAgICAgICAgICAgICAgCisjZW5kaWYgLyogTU5HX1NVUFBPUlRfRElTUExBWSAqLworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19TSE9XCitNTkdfQ19TUEVDSUFMRlVOQyAobW5nX3NwZWNpYWxfc2hvdykKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCisgIG1uZ19yZXRjb2RlIGlSZXRjb2RlOworCisgIGlmICghKChtbmdfc2hvd3ApcENodW5rKS0+YkVtcHR5KSAgICAvKiBhbnkgZGF0YSA/ICovCisgIHsKKyAgICBpZiAoISgobW5nX3Nob3dwKXBDaHVuayktPmJIYXNsYXN0aWQpCisgICAgICAoKG1uZ19zaG93cClwQ2h1bmspLT5pTGFzdGlkID0gKChtbmdfc2hvd3ApcENodW5rKS0+aUZpcnN0aWQ7CisKKyAgICBwRGF0YS0+aVNIT1dmcm9taWQgPSAoKG1uZ19zaG93cClwQ2h1bmspLT5pRmlyc3RpZDsKKyAgICBwRGF0YS0+aVNIT1d0b2lkICAgPSAoKG1uZ19zaG93cClwQ2h1bmspLT5pTGFzdGlkOworICAgIHBEYXRhLT5pU0hPV21vZGUgICA9ICgobW5nX3Nob3dwKXBDaHVuayktPmlNb2RlOworICB9CisgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1c2UgZGVmYXVsdHMgdGhlbiAqLworICB7CisgICAgcERhdGEtPmlTSE9XZnJvbWlkID0gMTsKKyAgICBwRGF0YS0+aVNIT1d0b2lkICAgPSA2NTUzNTsKKyAgICBwRGF0YS0+aVNIT1dtb2RlICAgPSAyOworICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgYSBTSE9XIGFuaW1hdGlvbiBvYmplY3QgKi8KKyAgaVJldGNvZGUgPSBtbmdfY3JlYXRlX2FuaV9zaG93IChwRGF0YSk7CisgIGlmICghaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgICAvKiBnbyBhbmQgZG8gaXQhICovCisgICAgaVJldGNvZGUgPSBtbmdfcHJvY2Vzc19kaXNwbGF5X3Nob3cgKHBEYXRhKTsKKworI2VuZGlmIC8qIE1OR19TVVBQT1JUX0RJU1BMQVkgKi8KKworICByZXR1cm4gaVJldGNvZGU7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX1RFUk0KK01OR19DX1NQRUNJQUxGVU5DIChtbmdfc3BlY2lhbF90ZXJtKQoreworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2hvdWxkIGJlIGJlaGluZCBNSERSIG9yIFNBVkUgISEgKi8KKyAgaWYgKCghcERhdGEtPmJIYXNTQVZFKSAmJiAocERhdGEtPmlDaHVua3NlcSA+IDIpKQorICB7CisgICAgcERhdGEtPmJNaXNwbGFjZWRURVJNID0gTU5HX1RSVUU7ICAvKiBpbmRpY2F0ZSB3ZSBmb3VuZCBhIG1pc3BsYWNlZCBURVJNICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgc2VuZCBhIHdhcm5pbmcgc2lnbmFsISEhICovCisgICAgTU5HX1dBUk5JTkcgKHBEYXRhLCBNTkdfU0VRVUVOQ0VFUlJPUik7CisgIH0KKworICBwRGF0YS0+Ykhhc1RFUk0gPSBNTkdfVFJVRTsKKworICBpZiAocERhdGEtPmZQcm9jZXNzdGVybSkgICAgICAgICAgICAgLyogaW5mb3JtIHRoZSBhcHAgPyAqLworICAgIGlmICghcERhdGEtPmZQcm9jZXNzdGVybSAoKChtbmdfaGFuZGxlKXBEYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobW5nX3Rlcm1wKXBDaHVuayktPmlUZXJtYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChtbmdfdGVybXApcENodW5rKS0+aUl0ZXJhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG1uZ190ZXJtcClwQ2h1bmspLT5pRGVsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG1uZ190ZXJtcClwQ2h1bmspLT5pSXRlcm1heCkpCisgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfQVBQTUlTQ0VSUk9SKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX0RJU1BMQVkKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSB0aGUgVEVSTSBhbmktb2JqZWN0ICovCisgICAgbW5nX3JldGNvZGUgaVJldGNvZGUgPSBtbmdfY3JlYXRlX2FuaV90ZXJtIChwRGF0YSwgcENodW5rKTsKKyAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzYXZlIGZvciBmdXR1cmUgcmVmZXJlbmNlICovCisgICAgcERhdGEtPnBUZXJtYW5pb2JqID0gcERhdGEtPnBMYXN0YW5pb2JqOworICB9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfRElTUExBWSAqLworCisgIHJldHVybiBNTkdfTk9FUlJPUjsgICAgICAgICAgICAgICAgICAvKiBkb25lICovCit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX1NBVkUKK01OR19GX1NQRUNJQUxGVU5DIChtbmdfc2F2ZV9lbnRyaWVzKQoreworICBtbmdfc2F2ZXAgICAgICAgcFNBVkUgICAgID0gKG1uZ19zYXZlcClwQ2h1bms7CisgIG1uZ191aW50MzIgICAgICBpUmF3bGVuICAgPSAqcGlSYXdsZW47CisgIG1uZ191aW50OHAgICAgICBwUmF3ZGF0YSAgPSAqcHBSYXdkYXRhOworICBtbmdfc2F2ZV9lbnRyeXAgcEVudHJ5ICAgID0gTU5HX05VTEw7CisgIG1uZ191aW50MzIgICAgICBpQ291bnQgICAgPSAwOworICBtbmdfdWludDggICAgICAgaU90eXBlICAgID0gKnBSYXdkYXRhOworICBtbmdfdWludDggICAgICAgaUV0eXBlOworICBtbmdfdWludDhwICAgICAgcFRlbXA7CisgIG1uZ191aW50OHAgICAgICBwTnVsbDsKKyAgbW5nX3VpbnQzMiAgICAgIGlMZW47CisgIG1uZ191aW50MzIgICAgICBpT2Zmc2V0WzJdOworICBtbmdfdWludDMyICAgICAgaVN0YXJ0dGltZVsyXTsKKyAgbW5nX3VpbnQzMiAgICAgIGlGcmFtZW5yOworICBtbmdfdWludDMyICAgICAgaUxheWVybnI7CisgIG1uZ191aW50MzIgICAgICBpWDsKKyAgbW5nX3VpbnQzMiAgICAgIGlOYW1lc2l6ZTsKKworICBpZiAoKGlPdHlwZSAhPSA0KSAmJiAoaU90eXBlICE9IDgpKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZPRkZTRVRTSVpFKTsKKworICBwU0FWRS0+aU9mZnNldHR5cGUgPSBpT3R5cGU7CisKKyAgZm9yIChpWCA9IDA7IGlYIDwgMjsgaVgrKykgICAgICAgLyogZG8gdGhpcyB0d2ljZSB0byBnZXQgdGhlIGNvdW50IGZpcnN0ICEgKi8KKyAgeworICAgIHBUZW1wID0gcFJhd2RhdGEgKyAxOworICAgIGlMZW4gID0gaVJhd2xlbiAgLSAxOworCisgICAgaWYgKGlYKSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNlY29uZCBydW4gPyAqLworICAgIHsKKyAgICAgIE1OR19BTExPQyAocERhdGEsIHBFbnRyeSwgKGlDb3VudCAqIHNpemVvZiAobW5nX3NhdmVfZW50cnkpKSk7CisKKyAgICAgIHBTQVZFLT5pQ291bnQgICA9IGlDb3VudDsKKyAgICAgIHBTQVZFLT5wRW50cmllcyA9IHBFbnRyeTsKKyAgICB9CisKKyAgICB3aGlsZSAoaUxlbikgICAgICAgICAgICAgICAgICAgLyogYW55dGhpbmcgbGVmdCA/ICovCisgICAgeworICAgICAgaUV0eXBlID0gKnBUZW1wOyAgICAgICAgICAgICAvKiBlbnRyeXR5cGUgKi8KKworICAgICAgaWYgKChpRXR5cGUgIT0gMCkgJiYgKGlFdHlwZSAhPSAxKSAmJiAoaUV0eXBlICE9IDIpICYmIChpRXR5cGUgIT0gMykpCisgICAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZFTlRSWVRZUEUpOworCisgICAgICBwVGVtcCsrOworCisgICAgICBpZiAoaUV0eXBlID4gMSkKKyAgICAgIHsKKyAgICAgICAgaU9mZnNldCAgICBbMF0gPSAwOworICAgICAgICBpT2Zmc2V0ICAgIFsxXSA9IDA7CisgICAgICAgIGlTdGFydHRpbWUgWzBdID0gMDsKKyAgICAgICAgaVN0YXJ0dGltZSBbMV0gPSAwOworICAgICAgICBpTGF5ZXJuciAgICAgICA9IDA7CisgICAgICAgIGlGcmFtZW5yICAgICAgID0gMDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgaWYgKGlPdHlwZSA9PSA0KQorICAgICAgICB7CisgICAgICAgICAgaU9mZnNldCBbMF0gPSAwOworICAgICAgICAgIGlPZmZzZXQgWzFdID0gbW5nX2dldF91aW50MzIgKHBUZW1wKTsKKworICAgICAgICAgIHBUZW1wICs9IDQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgaU9mZnNldCBbMF0gPSBtbmdfZ2V0X3VpbnQzMiAocFRlbXApOworICAgICAgICAgIGlPZmZzZXQgWzFdID0gbW5nX2dldF91aW50MzIgKHBUZW1wKzQpOworCisgICAgICAgICAgcFRlbXAgKz0gODsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpRXR5cGUgPiAwKQorICAgICAgICB7CisgICAgICAgICAgaVN0YXJ0dGltZSBbMF0gPSAwOworICAgICAgICAgIGlTdGFydHRpbWUgWzFdID0gMDsKKyAgICAgICAgICBpTGF5ZXJuciAgICAgICA9IDA7CisgICAgICAgICAgaUZyYW1lbnIgICAgICAgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGlmIChpT3R5cGUgPT0gNCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBpU3RhcnR0aW1lIFswXSA9IDA7CisgICAgICAgICAgICBpU3RhcnR0aW1lIFsxXSA9IG1uZ19nZXRfdWludDMyIChwVGVtcCswKTsKKyAgICAgICAgICAgIGlMYXllcm5yICAgICAgID0gbW5nX2dldF91aW50MzIgKHBUZW1wKzQpOworICAgICAgICAgICAgaUZyYW1lbnIgICAgICAgPSBtbmdfZ2V0X3VpbnQzMiAocFRlbXArOCk7CisKKyAgICAgICAgICAgIHBUZW1wICs9IDEyOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgaVN0YXJ0dGltZSBbMF0gPSBtbmdfZ2V0X3VpbnQzMiAocFRlbXArMCk7CisgICAgICAgICAgICBpU3RhcnR0aW1lIFsxXSA9IG1uZ19nZXRfdWludDMyIChwVGVtcCs0KTsKKyAgICAgICAgICAgIGlMYXllcm5yICAgICAgID0gbW5nX2dldF91aW50MzIgKHBUZW1wKzgpOworICAgICAgICAgICAgaUZyYW1lbnIgICAgICAgPSBtbmdfZ2V0X3VpbnQzMiAocFRlbXArMTIpOworCisgICAgICAgICAgICBwVGVtcCArPSAxNjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcE51bGwgPSBwVGVtcDsgICAgICAgICAgICAgICAvKiBnZXQgdGhlIG5hbWUgbGVuZ3RoICovCisgICAgICB3aGlsZSAoKnBOdWxsKQorICAgICAgICBwTnVsbCsrOworCisgICAgICBpZiAoKHBOdWxsIC0gcFJhd2RhdGEpID4gKG1uZ19pbnQzMilpUmF3bGVuKQorICAgICAgeworICAgICAgICBpTmFtZXNpemUgPSBpTGVuOyAgICAgICAgICAvKiBubyBudWxsIGZvdW5kOyBzbyBlbmQgb2YgU0FWRSAqLworICAgICAgICBpTGVuICAgICAgPSAwOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBpTmFtZXNpemUgPSBwTnVsbCAtIHBUZW1wOyAvKiBzaG91bGQgYmUgYW5vdGhlciBlbnRyeSAqLworICAgICAgICBpTGVuICAgICAtPSBpTmFtZXNpemU7CisKKyAgICAgICAgaWYgKCFpTGVuKSAgICAgICAgICAgICAgICAgLyogbXVzdCBub3QgZW5kIHdpdGggYSBudWxsICEgKi8KKyAgICAgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfRU5EV0lUSE5VTEwpOworICAgICAgfQorCisgICAgICBpZiAoIXBFbnRyeSkKKyAgICAgIHsKKyAgICAgICAgaUNvdW50Kys7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHBFbnRyeS0+aUVudHJ5dHlwZSAgICAgPSBpRXR5cGU7CisgICAgICAgIHBFbnRyeS0+aU9mZnNldCAgICBbMF0gPSBpT2Zmc2V0ICAgIFswXTsKKyAgICAgICAgcEVudHJ5LT5pT2Zmc2V0ICAgIFsxXSA9IGlPZmZzZXQgICAgWzFdOworICAgICAgICBwRW50cnktPmlTdGFydHRpbWUgWzBdID0gaVN0YXJ0dGltZSBbMF07CisgICAgICAgIHBFbnRyeS0+aVN0YXJ0dGltZSBbMV0gPSBpU3RhcnR0aW1lIFsxXTsKKyAgICAgICAgcEVudHJ5LT5pTGF5ZXJuciAgICAgICA9IGlMYXllcm5yOworICAgICAgICBwRW50cnktPmlGcmFtZW5yICAgICAgID0gaUZyYW1lbnI7CisgICAgICAgIHBFbnRyeS0+aU5hbWVzaXplICAgICAgPSBpTmFtZXNpemU7CisKKyAgICAgICAgaWYgKGlOYW1lc2l6ZSkKKyAgICAgICAgeworICAgICAgICAgIE1OR19BTExPQyAocERhdGEsIHBFbnRyeS0+ek5hbWUsIGlOYW1lc2l6ZSsxKTsKKyAgICAgICAgICBNTkdfQ09QWSAocEVudHJ5LT56TmFtZSwgcFRlbXAsIGlOYW1lc2l6ZSk7CisgICAgICAgIH0KKworICAgICAgICBwRW50cnkrKzsKKyAgICAgIH0KKworICAgICAgcFRlbXAgKz0gaU5hbWVzaXplOworICAgIH0KKyAgfQorCisgICpwaVJhd2xlbiA9IDA7CisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19TQVZFCitNTkdfQ19TUEVDSUFMRlVOQyAobW5nX3NwZWNpYWxfc2F2ZSkKK3sKKyAgcERhdGEtPmJIYXNTQVZFID0gTU5HX1RSVUU7CisKKyAgaWYgKHBEYXRhLT5mUHJvY2Vzc3NhdmUpICAgICAgICAgICAgIC8qIGluZm9ybSB0aGUgYXBwbGljYXRpb24gPyAqLworICB7CisgICAgbW5nX2Jvb2wgYk9rZSA9IHBEYXRhLT5mUHJvY2Vzc3NhdmUgKChtbmdfaGFuZGxlKXBEYXRhKTsKKyAgICBpZiAoIWJPa2UpCisgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfQVBQTUlTQ0VSUk9SKTsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorICB7CisgICAgbW5nX3JldGNvZGUgaVJldGNvZGU7CisKKyAgICAvKiBUT0RPOiBzb21ldGhpbmcgd2l0aCB0aGUgcGFyYW1ldGVycyAqLworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgYSBTQVZFIGFuaW1hdGlvbiBvYmplY3QgKi8KKyAgICBpUmV0Y29kZSA9IG1uZ19jcmVhdGVfYW5pX3NhdmUgKHBEYXRhKTsKKyAgICBpZiAoIWlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgIC8qIHByb2Nlc3MgaXQgKi8KKyAgICAgIGlSZXRjb2RlID0gbW5nX3Byb2Nlc3NfZGlzcGxheV9zYXZlIChwRGF0YSk7CisgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgcmV0dXJuIGlSZXRjb2RlOworICB9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfRElTUExBWSAqLworCisgIHJldHVybiBNTkdfTk9FUlJPUjsgICAgICAgICAgICAgICAgICAvKiBkb25lICovCit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX1NFRUsKK01OR19DX1NQRUNJQUxGVU5DIChtbmdfc3BlY2lhbF9zZWVrKQoreworICBtbmdfcmV0Y29kZSBpUmV0Y29kZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX0RJU1BMQVkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSBhIFNFRUsgYW5pbWF0aW9uIG9iamVjdCAqLworICBpUmV0Y29kZSA9IG1uZ19jcmVhdGVfYW5pX3NlZWsgKHBEYXRhLCBwQ2h1bmspOworICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICByZXR1cm4gaVJldGNvZGU7CisKKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisKKyAgaWYgKHBEYXRhLT5mUHJvY2Vzc3NlZWspICAgICAgICAgICAgIC8qIGluZm9ybSB0aGUgYXBwID8gKi8KKyAgICBpZiAoIXBEYXRhLT5mUHJvY2Vzc3NlZWsgKChtbmdfaGFuZGxlKXBEYXRhLCAoKG1uZ19zZWVrcClwQ2h1bmspLT56TmFtZSkpCisgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfQVBQTUlTQ0VSUk9SKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX0RJU1BMQVkKKyAgcmV0dXJuIG1uZ19wcm9jZXNzX2Rpc3BsYXlfc2VlayAocERhdGEpOworI2Vsc2UKKyAgcmV0dXJuIE1OR19OT0VSUk9SOyAgICAgICAgICAgICAgICAgIAorI2VuZGlmIC8qIE1OR19TVVBQT1JUX0RJU1BMQVkgKi8KK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfZVhQSQorTU5HX0NfU1BFQ0lBTEZVTkMgKG1uZ19zcGVjaWFsX2V4cGkpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorICB7CisKKworICAgIC8qIFRPRE86IHNvbWV0aGluZyAhISEgKi8KKworCisgIH0KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOyAgICAgICAgICAgICAgICAgIC8qIGRvbmUgKi8KK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfZlBSSQorTU5HX0NfU1BFQ0lBTEZVTkMgKG1uZ19zcGVjaWFsX2ZwcmkpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorICB7CisKKworICAgIC8qIFRPRE86IHNvbWV0aGluZyAhISEgKi8KKworCisgIH0KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOyAgICAgICAgICAgICAgICAgIC8qIGRvbmUgKi8KK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfbkVFRAorTU5HX0xPQ0FMIG1uZ19ib29sIENoZWNrS2V5d29yZCAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcEtleXdvcmQpCit7CisgIG1uZ19jaHVua2lkIGhhbmRsZWRfY2h1bmtzIFtdID0KKyAgeworICAgIE1OR19VSU5UX0JBQ0ssICAgICAgICAgICAgICAgICAgICAgLyoga2VlcCBpdCBzb3J0ZWQgISEhISAqLworICAgIE1OR19VSU5UX0JBU0ksCisgICAgTU5HX1VJTlRfQ0xJUCwKKyAgICBNTkdfVUlOVF9DTE9OLAorI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisvKiBUT0RPOiAgICBNTkdfVUlOVF9EQllLLCAgKi8KKyNlbmRpZgorICAgIE1OR19VSU5UX0RFRkksCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKKyAgICBNTkdfVUlOVF9ESERSLAorI2VuZGlmCisgICAgTU5HX1VJTlRfRElTQywKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworLyogVE9ETzogICAgTU5HX1VJTlRfRFJPUCwgICovCisjZW5kaWYKKyAgICBNTkdfVUlOVF9FTkRMLAorICAgIE1OR19VSU5UX0ZSQU0sCisgICAgTU5HX1VJTlRfSURBVCwKKyAgICBNTkdfVUlOVF9JRU5ELAorICAgIE1OR19VSU5UX0lIRFIsCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgICBNTkdfVUlOVF9JSk5HLAorI2VuZGlmICAgIAorICAgIE1OR19VSU5UX0lQTkcsCisjZW5kaWYKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgICBNTkdfVUlOVF9KREFBLAorICAgIE1OR19VSU5UX0pEQVQsCisgICAgTU5HX1VJTlRfSkhEUiwKKy8qIFRPRE86ICAgIE1OR19VSU5UX0pTRVAsICAqLworICAgIE1OR19VSU5UX0pkQUEsCisjZW5kaWYKKyAgICBNTkdfVUlOVF9MT09QLAorICAgIE1OR19VSU5UX01BR04sCisgICAgTU5HX1VJTlRfTUVORCwKKyAgICBNTkdfVUlOVF9NSERSLAorICAgIE1OR19VSU5UX01PVkUsCisvKiBUT0RPOiAgICBNTkdfVUlOVF9PUkRSLCAgKi8KKyAgICBNTkdfVUlOVF9QQVNULAorICAgIE1OR19VSU5UX1BMVEUsCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKKyAgICBNTkdfVUlOVF9QUExULAorICAgIE1OR19VSU5UX1BST00sCisjZW5kaWYKKyAgICBNTkdfVUlOVF9TQVZFLAorICAgIE1OR19VSU5UX1NFRUssCisgICAgTU5HX1VJTlRfU0hPVywKKyAgICBNTkdfVUlOVF9URVJNLAorICAgIE1OR19VSU5UX2JLR0QsCisgICAgTU5HX1VJTlRfY0hSTSwKKy8qIFRPRE86ICAgIE1OR19VSU5UX2VYUEksICAqLworICAgIE1OR19VSU5UX2V2TlQsCisvKiBUT0RPOiAgICBNTkdfVUlOVF9mUFJJLCAgKi8KKyAgICBNTkdfVUlOVF9nQU1BLAorLyogVE9ETzogICAgTU5HX1VJTlRfaElTVCwgICovCisgICAgTU5HX1VJTlRfaUNDUCwKKyAgICBNTkdfVUlOVF9pVFh0LAorICAgIE1OR19VSU5UX25FRUQsCisvKiBUT0RPOiAgICBNTkdfVUlOVF9vRkZzLCAgKi8KKy8qIFRPRE86ICAgIE1OR19VSU5UX3BDQUwsICAqLworLyogVE9ETzogICAgTU5HX1VJTlRfcEhZZywgICovCisvKiBUT0RPOiAgICBNTkdfVUlOVF9wSFlzLCAgKi8KKy8qIFRPRE86ICAgIE1OR19VSU5UX3NCSVQsICAqLworLyogVE9ETzogICAgTU5HX1VJTlRfc0NBTCwgICovCisvKiBUT0RPOiAgICBNTkdfVUlOVF9zUExULCAgKi8KKyAgICBNTkdfVUlOVF9zUkdCLAorICAgIE1OR19VSU5UX3RFWHQsCisgICAgTU5HX1VJTlRfdElNRSwKKyAgICBNTkdfVUlOVF90Uk5TLAorICAgIE1OR19VSU5UX3pUWHQsCisgIH07CisKKyAgbW5nX2Jvb2wgYk9rZSA9IE1OR19GQUxTRTsKKworICBpZiAocERhdGEtPmZQcm9jZXNzbmVlZCkgICAgICAgICAgICAgLyogZG9lcyB0aGUgYXBwIGhhbmRsZSBpdCA/ICovCisgICAgYk9rZSA9IHBEYXRhLT5mUHJvY2Vzc25lZWQgKChtbmdfaGFuZGxlKXBEYXRhLCAobW5nX3BjaGFyKXBLZXl3b3JkKTsKKworICBpZiAoIWJPa2UpCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaW5kIHRoZSBrZXl3b3JkIGxlbmd0aCAqLworICAgIG1uZ191aW50OHAgcE51bGwgPSBwS2V5d29yZDsKKyAgICB3aGlsZSAoKnBOdWxsKQorICAgICAgcE51bGwrKzsKKworICAgIGlmICgocE51bGwgLSBwS2V5d29yZCkgPT0gNCkgICAgICAgLyogdGVzdCBhIGNodW5rID8gKi8KKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCB0aGUgY2h1bmstaWQgKi8KKyAgICAgIG1uZ19jaHVua2lkIGlDaHVua2lkID0gKCpwS2V5d29yZCAgICAgPDwgMjQpICsgKCoocEtleXdvcmQrMSkgPDwgMTYpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCoocEtleXdvcmQrMikgPDwgIDgpICsgKCoocEtleXdvcmQrMykgICAgICApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYmluYXJ5IHNlYXJjaCB2YXJpYWJsZXMgKi8KKyAgICAgIG1uZ19pbnQzMiAgIGlUb3AsIGlMb3dlciwgaVVwcGVyLCBpTWlkZGxlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGV0ZXJtaW5lIG1heCBpbmRleCBvZiB0YWJsZSAqLworICAgICAgaVRvcCA9IChzaXplb2YgKGhhbmRsZWRfY2h1bmtzKSAvIHNpemVvZiAoaGFuZGxlZF9jaHVua3MgWzBdKSkgLSAxOworCisgICAgICAvKiBiaW5hcnkgc2VhcmNoOyB3aXRoIDUyIGNodW5rcywgd29yc3QtY2FzZSBpcyA3IGNvbXBhcmlzb25zICovCisgICAgICBpTG93ZXIgID0gMDsKKyAgICAgIGlNaWRkbGUgPSBpVG9wID4+IDE7CisgICAgICBpVXBwZXIgID0gaVRvcDsKKworICAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZSBiaW5hcnkgc2VhcmNoIGl0c2VsZiAqLworICAgICAgICB7CisgICAgICAgICAgaWYgKGhhbmRsZWRfY2h1bmtzIFtpTWlkZGxlXSA8IGlDaHVua2lkKQorICAgICAgICAgICAgaUxvd2VyID0gaU1pZGRsZSArIDE7CisgICAgICAgICAgZWxzZSBpZiAoaGFuZGxlZF9jaHVua3MgW2lNaWRkbGVdID4gaUNodW5raWQpCisgICAgICAgICAgICBpVXBwZXIgPSBpTWlkZGxlIC0gMTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgYk9rZSA9IE1OR19UUlVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgICAgaU1pZGRsZSA9IChpTG93ZXIgKyBpVXBwZXIpID4+IDE7CisgICAgICAgIH0KKyAgICAgIHdoaWxlIChpTG93ZXIgPD0gaVVwcGVyKTsKKyAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0ZXN0IGRyYWZ0ID8gKi8KKyAgICBpZiAoKCFiT2tlKSAmJiAoKHBOdWxsIC0gcEtleXdvcmQpID09IDgpICYmCisgICAgICAgICgqcEtleXdvcmQgICAgID09ICdkJykgJiYgKCoocEtleXdvcmQrMSkgPT0gJ3InKSAmJgorICAgICAgICAoKihwS2V5d29yZCsyKSA9PSAnYScpICYmICgqKHBLZXl3b3JkKzMpID09ICdmJykgJiYKKyAgICAgICAgKCoocEtleXdvcmQrNCkgPT0gJ3QnKSAmJiAoKihwS2V5d29yZCs1KSA9PSAnICcpKQorICAgIHsKKyAgICAgIG1uZ191aW50MzIgaURyYWZ0OworCisgICAgICBpRHJhZnQgPSAoKihwS2V5d29yZCs2KSAtICcwJykgKiAxMCArICgqKHBLZXl3b3JkKzcpIC0gJzAnKTsKKyAgICAgIGJPa2UgICA9IChtbmdfYm9vbCkoaURyYWZ0IDw9IE1OR19NTkdfRFJBRlQpOworICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRlc3QgTU5HIDEuMC8xLjEgPyAqLworICAgIGlmICgoIWJPa2UpICYmICgocE51bGwgLSBwS2V5d29yZCkgPT0gNykgJiYKKyAgICAgICAgKCpwS2V5d29yZCAgICAgPT0gJ00nKSAmJiAoKihwS2V5d29yZCsxKSA9PSAnTicpICYmCisgICAgICAgICgqKHBLZXl3b3JkKzIpID09ICdHJykgJiYgKCoocEtleXdvcmQrMykgPT0gJy0nKSAmJgorICAgICAgICAoKihwS2V5d29yZCs0KSA9PSAnMScpICYmICgqKHBLZXl3b3JkKzUpID09ICcuJykgJiYKKyAgICAgICAgKCgqKHBLZXl3b3JkKzYpID09ICcwJykgfHwgKCoocEtleXdvcmQrNikgPT0gJzEnKSkpCisgICAgICBiT2tlICAgPSBNTkdfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRlc3QgQ0FDSEVPRkYgPyAqLworICAgIGlmICgoIWJPa2UpICYmICgocE51bGwgLSBwS2V5d29yZCkgPT0gOCkgJiYKKyAgICAgICAgKCpwS2V5d29yZCAgICAgPT0gJ0MnKSAmJiAoKihwS2V5d29yZCsxKSA9PSAnQScpICYmCisgICAgICAgICgqKHBLZXl3b3JkKzIpID09ICdDJykgJiYgKCoocEtleXdvcmQrMykgPT0gJ0gnKSAmJgorICAgICAgICAoKihwS2V5d29yZCs0KSA9PSAnRScpICYmICgqKHBLZXl3b3JkKzUpID09ICdPJykgJiYKKyAgICAgICAgKCoocEtleXdvcmQrNikgPT0gJ0YnKSAmJiAoKihwS2V5d29yZCs3KSA9PSAnRicpKQorICAgIHsKKyAgICAgIGlmICghcERhdGEtPnBGaXJzdGFuaW9iaikgICAgICAgIC8qIG9ubHkgaWYgY2FjaGluZyBoYXNuJ3Qgc3RhcnRlZCB5ZXQgISAqLworICAgICAgeworICAgICAgICBiT2tlICAgICAgICAgICAgICAgICAgPSBNTkdfVFJVRTsKKyAgICAgICAgcERhdGEtPmJDYWNoZXBsYXliYWNrID0gTU5HX0ZBTFNFOworICAgICAgICBwRGF0YS0+YlN0b3JlY2h1bmtzICAgPSBNTkdfRkFMU0U7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIGJPa2U7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX25FRUQKK01OR19DX1NQRUNJQUxGVU5DIChtbmdfc3BlY2lhbF9uZWVkKQoreworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGV0J3MgY2hlY2sgaXQgKi8KKyAgbW5nX2Jvb2wgICBiT2tlID0gTU5HX1RSVUU7CisgIG1uZ191aW50OHAgcE51bGwsIHBUZW1wLCBwTWF4OworCisgIHBUZW1wID0gKG1uZ191aW50OHApKChtbmdfbmVlZHApcENodW5rKS0+ektleXdvcmRzOworICBwTWF4ICA9IChtbmdfdWludDhwKShwVGVtcCArICgobW5nX25lZWRwKXBDaHVuayktPmlLZXl3b3Jkc3NpemUpOworICBwTnVsbCA9IHBUZW1wOworICB3aGlsZSAoKnBOdWxsKQorICAgIHBOdWxsKys7CisKKyAgd2hpbGUgKChiT2tlKSAmJiAocE51bGwgPCBwTWF4KSkKKyAgeworICAgIGJPa2UgID0gQ2hlY2tLZXl3b3JkIChwRGF0YSwgcFRlbXApOworICAgIHBUZW1wID0gcE51bGwgKyAxOworICAgIHBOdWxsID0gcFRlbXA7CisgICAgd2hpbGUgKCpwTnVsbCkKKyAgICAgIHBOdWxsKys7CisgIH0KKworICBpZiAoYk9rZSkKKyAgICBiT2tlID0gQ2hlY2tLZXl3b3JkIChwRGF0YSwgcFRlbXApOworCisgIGlmICghYk9rZSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfVU5TVVBQT1JURURORUVEKTsKKworICByZXR1cm4gTU5HX05PRVJST1I7ICAgICAgICAgICAgICAgICAgLyogZG9uZSAqLworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19wSFlnCitNTkdfQ19TUEVDSUFMRlVOQyAobW5nX3NwZWNpYWxfcGh5ZykKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCisgIHsKKworCisgICAgLyogVE9ETzogc29tZXRoaW5nICEhISAqLworCisKKyAgfQorI2VuZGlmIC8qIE1OR19TVVBQT1JUX0RJU1BMQVkgKi8KKworICByZXR1cm4gTU5HX05PRVJST1I7ICAgICAgICAgICAgICAgICAgLyogZG9uZSAqLworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworTU5HX0NfU1BFQ0lBTEZVTkMgKG1uZ19zcGVjaWFsX2RoZHIpCit7CisgIGlmICgoKChtbmdfZGhkcnApcENodW5rKS0+aURlbHRhdHlwZSA9PSBNTkdfREVMVEFUWVBFX1JFUExBQ0UpICYmICgoKG1uZ19kaGRycClwQ2h1bmspLT5iSGFzYmxvY2tsb2MpKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElETEVOR1RIKTsKKyAgaWYgKCgoKG1uZ19kaGRycClwQ2h1bmspLT5pRGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfTk9DSEFOR0UpICYmICgoKG1uZ19kaGRycClwQ2h1bmspLT5iSGFzYmxvY2tzaXplKSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRExFTkdUSCk7CisKKyAgcERhdGEtPmJIYXNESERSICAgPSBNTkdfVFJVRTsgICAgICAgIC8qIGluc2lkZSBhIERIRFItSUVORCBibG9jayBub3cgKi8KKyAgcERhdGEtPmlEZWx0YXR5cGUgPSAoKG1uZ19kaGRycClwQ2h1bmspLT5pRGVsdGF0eXBlOworCisgIHBEYXRhLT5pSW1hZ2VsZXZlbCsrOyAgICAgICAgICAgICAgICAvKiBvbmUgbGV2ZWwgZGVlcGVyICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCisgIHJldHVybiBtbmdfY3JlYXRlX2FuaV9kaGRyIChwRGF0YSwgcENodW5rKTsKKyNlbHNlCisgIHJldHVybiBNTkdfTk9FUlJPUjsgICAgICAgICAgICAgICAgICAKKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCitNTkdfQ19TUEVDSUFMRlVOQyAobW5nX3NwZWNpYWxfcHJvbSkKK3sKKyAgaWYgKCgoKG1uZ19wcm9tcClwQ2h1bmspLT5pQ29sb3J0eXBlICE9IE1OR19DT0xPUlRZUEVfR1JBWSAgICkgJiYKKyAgICAgICgoKG1uZ19wcm9tcClwQ2h1bmspLT5pQ29sb3J0eXBlICE9IE1OR19DT0xPUlRZUEVfUkdCICAgICkgJiYKKyAgICAgICgoKG1uZ19wcm9tcClwQ2h1bmspLT5pQ29sb3J0eXBlICE9IE1OR19DT0xPUlRZUEVfSU5ERVhFRCkgJiYKKyAgICAgICgoKG1uZ19wcm9tcClwQ2h1bmspLT5pQ29sb3J0eXBlICE9IE1OR19DT0xPUlRZUEVfR1JBWUEgICkgJiYKKyAgICAgICgoKG1uZ19wcm9tcClwQ2h1bmspLT5pQ29sb3J0eXBlICE9IE1OR19DT0xPUlRZUEVfUkdCQSAgICkgICAgKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElEQ09MT1JUWVBFKTsKKworI2lmZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgIGlmICgoKG1uZ19wcm9tcClwQ2h1bmspLT5pU2FtcGxlZGVwdGggPT0gTU5HX0JJVERFUFRIXzE2ICkKKyAgICAgICgobW5nX3Byb21wKXBDaHVuayktPmlTYW1wbGVkZXB0aCA9IE1OR19CSVRERVBUSF84OworI2VuZGlmCisKKyAgaWYgKCgoKG1uZ19wcm9tcClwQ2h1bmspLT5pU2FtcGxlZGVwdGggIT0gTU5HX0JJVERFUFRIXzEgKSAmJgorICAgICAgKCgobW5nX3Byb21wKXBDaHVuayktPmlTYW1wbGVkZXB0aCAhPSBNTkdfQklUREVQVEhfMiApICYmCisgICAgICAoKChtbmdfcHJvbXApcENodW5rKS0+aVNhbXBsZWRlcHRoICE9IE1OR19CSVRERVBUSF80ICkgJiYKKyAgICAgICgoKG1uZ19wcm9tcClwQ2h1bmspLT5pU2FtcGxlZGVwdGggIT0gTU5HX0JJVERFUFRIXzggKQorI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgICAgJiYgKCgobW5nX3Byb21wKXBDaHVuayktPmlTYW1wbGVkZXB0aCAhPSBNTkdfQklUREVQVEhfMTYpCisjZW5kaWYKKyAgICApCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVlNBTVBMRURFUFRIKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX0RJU1BMQVkKKyAgeworICAgIG1uZ19yZXRjb2RlIGlSZXRjb2RlID0gbW5nX2NyZWF0ZV9hbmlfcHJvbSAocERhdGEsIHBDaHVuayk7CisgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgcmV0dXJuIGlSZXRjb2RlOworICB9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfRElTUExBWSAqLworCisgIHJldHVybiBNTkdfTk9FUlJPUjsgICAgICAgICAgICAgICAgICAvKiBkb25lICovCit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCitNTkdfQ19TUEVDSUFMRlVOQyAobW5nX3NwZWNpYWxfaXBuZykKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCisgIG1uZ19yZXRjb2RlIGlSZXRjb2RlID0gbW5nX2NyZWF0ZV9hbmlfaXBuZyAocERhdGEpOworICBpZiAoIWlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAgLyogcHJvY2VzcyBpdCAqLworICAgIGlSZXRjb2RlID0gbW5nX3Byb2Nlc3NfZGlzcGxheV9pcG5nIChwRGF0YSk7CisgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgIHJldHVybiBpUmV0Y29kZTsKKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOyAgICAgICAgICAgICAgICAgIC8qIGRvbmUgKi8KK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKK01OR19GX1NQRUNJQUxGVU5DIChtbmdfcHBsdF9lbnRyaWVzKQoreworICBtbmdfcHBsdHAgICAgIHBQUExUICAgICAgPSAobW5nX3BwbHRwKXBDaHVuazsKKyAgbW5nX3VpbnQzMiAgICBpUmF3bGVuICAgID0gKnBpUmF3bGVuOworICBtbmdfdWludDhwICAgIHBSYXdkYXRhICAgPSAqcHBSYXdkYXRhOworICBtbmdfdWludDggICAgIGlEZWx0YXR5cGUgPSBwUFBMVC0+aURlbHRhdHlwZTsKKyAgbW5nX3VpbnQzMiAgICBpTWF4ICAgICAgID0gMDsKKyAgbW5nX2ludDMyICAgICBpWCwgaVksIGlNOworICBtbmdfcmdicGFsdGFiIGFJbmRleGVudHJpZXM7CisgIG1uZ191aW50OGFyciAgYUFscGhhZW50cmllczsKKyAgbW5nX3VpbnQ4YXJyICBhVXNlZGVudHJpZXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtdXN0IGJlIGluZGV4ZWQgY29sb3IgISAqLworICBpZiAocERhdGEtPmlDb2xvcnR5cGUgIT0gTU5HX0NPTE9SVFlQRV9JTkRFWEVEKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElEQ09MT1JUWVBFKTsKKworICBmb3IgKGlZID0gMjU1OyBpWSA+PSAwOyBpWS0tKSAgICAgICAgLyogcmVzZXQgYXJyYXlzICovCisgIHsKKyAgICBhSW5kZXhlbnRyaWVzIFtpWV0uaVJlZCAgID0gMDsKKyAgICBhSW5kZXhlbnRyaWVzIFtpWV0uaUdyZWVuID0gMDsKKyAgICBhSW5kZXhlbnRyaWVzIFtpWV0uaUJsdWUgID0gMDsKKyAgICBhQWxwaGFlbnRyaWVzIFtpWV0gICAgICAgID0gMjU1OworICAgIGFVc2VkZW50cmllcyAgW2lZXSAgICAgICAgPSAwOworICB9CisKKyAgd2hpbGUgKGlSYXdsZW4pICAgICAgICAgICAgICAgICAgICAgIC8qIGFzIGxvbmcgYXMgdGhlcmUgYXJlIGVudHJpZXMgbGVmdCAuLi4gKi8KKyAgeworICAgIG1uZ191aW50MzIgaURpZmY7CisKKyAgICBpZiAoaVJhd2xlbiA8IDIpCisgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRExFTkdUSCk7CisKKyAgICBpWCA9IChtbmdfaW50MzIpKCpwUmF3ZGF0YSk7ICAgICAgLyogZ2V0IHN0YXJ0IGFuZCBlbmQgaW5kZXggKi8KKyAgICBpTSA9IChtbmdfaW50MzIpKCoocFJhd2RhdGErMSkpOworCisgICAgaWYgKGlNIDwgaVgpCisgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRElOREVYKTsKKworICAgIGlmIChpTSA+PSAobW5nX2ludDMyKSBpTWF4KSAgICAgICAvKiBkZXRlcm1pbmUgaGlnaGVzdCB1c2VkIGluZGV4ICovCisgICAgICBpTWF4ID0gaU0gKyAxOworCisgICAgcFJhd2RhdGEgKz0gMjsKKyAgICBpUmF3bGVuICAtPSAyOworICAgIGlEaWZmID0gKGlNIC0gaVggKyAxKTsKKyAgICBpZiAoKGlEZWx0YXR5cGUgPT0gTU5HX0RFTFRBVFlQRV9SRVBMQUNFUkdCICApIHx8CisgICAgICAgIChpRGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfREVMVEFSR0IgICAgKSAgICApCisgICAgICBpRGlmZiA9IGlEaWZmICogMzsKKyAgICBlbHNlCisgICAgaWYgKChpRGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfUkVQTEFDRVJHQkEpIHx8CisgICAgICAgIChpRGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfREVMVEFSR0JBICApICAgICkKKyAgICAgIGlEaWZmID0gaURpZmYgKiA0OworCisgICAgaWYgKGlSYXdsZW4gPCBpRGlmZikKKyAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElETEVOR1RIKTsKKworICAgIGlmICgoaURlbHRhdHlwZSA9PSBNTkdfREVMVEFUWVBFX1JFUExBQ0VSR0IgICkgfHwKKyAgICAgICAgKGlEZWx0YXR5cGUgPT0gTU5HX0RFTFRBVFlQRV9ERUxUQVJHQiAgICApICAgICkKKyAgICB7CisgICAgICBmb3IgKGlZID0gaVg7IGlZIDw9IGlNOyBpWSsrKQorICAgICAgeworICAgICAgICBhSW5kZXhlbnRyaWVzIFtpWV0uaVJlZCAgID0gKnBSYXdkYXRhOworICAgICAgICBhSW5kZXhlbnRyaWVzIFtpWV0uaUdyZWVuID0gKihwUmF3ZGF0YSsxKTsKKyAgICAgICAgYUluZGV4ZW50cmllcyBbaVldLmlCbHVlICA9ICoocFJhd2RhdGErMik7CisgICAgICAgIGFVc2VkZW50cmllcyAgW2lZXSAgICAgICAgPSAxOworCisgICAgICAgIHBSYXdkYXRhICs9IDM7CisgICAgICAgIGlSYXdsZW4gIC09IDM7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICBpZiAoKGlEZWx0YXR5cGUgPT0gTU5HX0RFTFRBVFlQRV9SRVBMQUNFQUxQSEEpIHx8CisgICAgICAgIChpRGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfREVMVEFBTFBIQSAgKSAgICApCisgICAgeworICAgICAgZm9yIChpWSA9IGlYOyBpWSA8PSBpTTsgaVkrKykKKyAgICAgIHsKKyAgICAgICAgYUFscGhhZW50cmllcyBbaVldICAgICAgICA9ICpwUmF3ZGF0YTsKKyAgICAgICAgYVVzZWRlbnRyaWVzICBbaVldICAgICAgICA9IDE7CisKKyAgICAgICAgcFJhd2RhdGErKzsKKyAgICAgICAgaVJhd2xlbi0tOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgZm9yIChpWSA9IGlYOyBpWSA8PSBpTTsgaVkrKykKKyAgICAgIHsKKyAgICAgICAgYUluZGV4ZW50cmllcyBbaVldLmlSZWQgICA9ICpwUmF3ZGF0YTsKKyAgICAgICAgYUluZGV4ZW50cmllcyBbaVldLmlHcmVlbiA9ICoocFJhd2RhdGErMSk7CisgICAgICAgIGFJbmRleGVudHJpZXMgW2lZXS5pQmx1ZSAgPSAqKHBSYXdkYXRhKzIpOworICAgICAgICBhQWxwaGFlbnRyaWVzIFtpWV0gICAgICAgID0gKihwUmF3ZGF0YSszKTsKKyAgICAgICAgYVVzZWRlbnRyaWVzICBbaVldICAgICAgICA9IDE7CisKKyAgICAgICAgcFJhd2RhdGEgKz0gNDsKKyAgICAgICAgaVJhd2xlbiAgLT0gNDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBzd2l0Y2ggKHBEYXRhLT5pQml0ZGVwdGgpICAgICAgICAgICAgLyogY2hlY2sgbWF4aW11bSBhbGxvd2VkIGVudHJpZXMgZm9yIGJpdGRlcHRoICovCisgIHsKKyAgICBjYXNlIE1OR19CSVRERVBUSF8xIDogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpTWF4ID4gMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElESU5ERVgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgY2FzZSBNTkdfQklUREVQVEhfMiA6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaU1heCA+IDQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRElOREVYKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgIGNhc2UgTU5HX0JJVERFUFRIXzQgOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlNYXggPiAxNikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElESU5ERVgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgIH0KKworICBwUFBMVC0+aUNvdW50ID0gaU1heDsKKworICBmb3IgKGlZID0gMjU1OyBpWSA+PSAwOyBpWS0tKSAgICAgICAgCisgIHsKKyAgICBwUFBMVC0+YUVudHJpZXMgW2lZXS5pUmVkICAgPSBhSW5kZXhlbnRyaWVzIFtpWV0uaVJlZDsKKyAgICBwUFBMVC0+YUVudHJpZXMgW2lZXS5pR3JlZW4gPSBhSW5kZXhlbnRyaWVzIFtpWV0uaUdyZWVuOworICAgIHBQUExULT5hRW50cmllcyBbaVldLmlCbHVlICA9IGFJbmRleGVudHJpZXMgW2lZXS5pQmx1ZTsKKyAgICBwUFBMVC0+YUVudHJpZXMgW2lZXS5pQWxwaGEgPSBhQWxwaGFlbnRyaWVzIFtpWV07CisgICAgcFBQTFQtPmFFbnRyaWVzIFtpWV0uYlVzZWQgID0gKG1uZ19ib29sKShhVXNlZGVudHJpZXMgW2lZXSk7CisgIH0KKworICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIGFuaW1hdGlvbiBvYmplY3QgKi8KKyAgICBtbmdfcmV0Y29kZSBpUmV0Y29kZSA9IG1uZ19jcmVhdGVfYW5pX3BwbHQgKHBEYXRhLCBpRGVsdGF0eXBlLCBpTWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUluZGV4ZW50cmllcywgYUFscGhhZW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFVc2VkZW50cmllcyk7CisgICAgaWYgKGlSZXRjb2RlKQorICAgICAgcmV0dXJuIGlSZXRjb2RlOworICB9CisKKyAgKnBpUmF3bGVuID0gMDsKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCitNTkdfQ19TUEVDSUFMRlVOQyAobW5nX3NwZWNpYWxfcHBsdCkKK3sKKyAgcmV0dXJuIE1OR19OT0VSUk9SOyAgICAgICAgICAgICAgICAgCit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCitNTkdfQ19TUEVDSUFMRlVOQyAobW5nX3NwZWNpYWxfaWpuZykKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCisgIG1uZ19yZXRjb2RlIGlSZXRjb2RlID0gbW5nX2NyZWF0ZV9hbmlfaWpuZyAocERhdGEpOworICBpZiAoIWlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAgLyogcHJvY2VzcyBpdCAqLworICAgIGlSZXRjb2RlID0gbW5nX3Byb2Nlc3NfZGlzcGxheV9pam5nIChwRGF0YSk7CisgIHJldHVybiBpUmV0Y29kZTsKKyNlbHNlCisgIHJldHVybiBNTkdfTk9FUlJPUjsgICAgICAgICAgICAgICAgICAvKiBkb25lICovCisjZW5kaWYgLyogTU5HX1NVUFBPUlRfRElTUExBWSAqLworfQorI2VuZGlmCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCitNTkdfRl9TUEVDSUFMRlVOQyAobW5nX2Ryb3BfZW50cmllcykKK3sKKyAgbW5nX2Ryb3BwICAgcERST1AgICAgPSAobW5nX2Ryb3BwKXBDaHVuazsKKyAgbW5nX3VpbnQzMiAgaVJhd2xlbiAgPSAqcGlSYXdsZW47CisgIG1uZ191aW50OHAgIHBSYXdkYXRhID0gKnBwUmF3ZGF0YTsKKyAgbW5nX3VpbnQzMiAgaVg7CisgIG1uZ191aW50MzJwIHBFbnRyeTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoZWNrIGxlbmd0aCAqLworICBpZiAoKGlSYXdsZW4gPCA0KSB8fCAoKGlSYXdsZW4gJSA0KSAhPSAwKSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRExFTkdUSCk7CisKKyAgTU5HX0FMTE9DIChwRGF0YSwgcEVudHJ5LCBpUmF3bGVuKTsKKyAgcERST1AtPmlDb3VudCAgICAgID0gaVJhd2xlbiAvIDQ7CisgIHBEUk9QLT5wQ2h1bmtuYW1lcyA9IChtbmdfcHRyKXBFbnRyeTsKKworICBmb3IgKGlYID0gcERST1AtPmlDb3VudDsgaVggPiAwOyBpWC0tKQorICB7CisgICAgKnBFbnRyeSsrID0gbW5nX2dldF91aW50MzIgKHBSYXdkYXRhKTsKKyAgICBwUmF3ZGF0YSArPSA0OworICB9CisKKyAgKnBpUmF3bGVuID0gMDsKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCitNTkdfQ19TUEVDSUFMRlVOQyAobW5nX3NwZWNpYWxfZHJvcCkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCisgIHsKKworCisgICAgLyogVE9ETzogc29tZXRoaW5nICEhISAqLworCisKKyAgfQorI2VuZGlmIC8qIE1OR19TVVBQT1JUX0RJU1BMQVkgKi8KKworICByZXR1cm4gTU5HX05PRVJST1I7ICAgICAgICAgICAgICAgICAgLyogZG9uZSAqLworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworI2lmbmRlZiBNTkdfU0tJUENIVU5LX0RCWUsKK01OR19DX1NQRUNJQUxGVU5DIChtbmdfc3BlY2lhbF9kYnlrKQoreworI2lmZGVmIE1OR19TVVBQT1JUX0RJU1BMQVkKKyAgeworCisKKyAgICAvKiBUT0RPOiBzb21ldGhpbmcgISEhICovCisKKworICB9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfRElTUExBWSAqLworCisgIHJldHVybiBNTkdfTk9FUlJPUjsgICAgICAgICAgICAgICAgICAvKiBkb25lICovCit9CisjZW5kaWYKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19PUkRSCitNTkdfRl9TUEVDSUFMRlVOQyAobW5nX29yZHJfZW50cmllcykKK3sKKyAgbW5nX29yZHJwICAgICAgIHBPUkRSICAgID0gKG1uZ19vcmRycClwQ2h1bms7CisgIG1uZ191aW50MzIgICAgICBpUmF3bGVuICA9ICpwaVJhd2xlbjsKKyAgbW5nX3VpbnQ4cCAgICAgIHBSYXdkYXRhID0gKnBwUmF3ZGF0YTsKKyAgbW5nX3VpbnQzMiAgICAgIGlYOworICBtbmdfb3Jkcl9lbnRyeXAgcEVudHJ5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2hlY2sgbGVuZ3RoICovCisgIGlmICgoaVJhd2xlbiA8IDUpIHx8ICgoaVJhd2xlbiAlIDUpICE9IDApKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElETEVOR1RIKTsKKworICBNTkdfQUxMT0MgKHBEYXRhLCBwRW50cnksIGlSYXdsZW4pOworICBwT1JEUi0+aUNvdW50ICAgPSBpUmF3bGVuIC8gNTsKKyAgcE9SRFItPnBFbnRyaWVzID0gKG1uZ19wdHIpcEVudHJ5OworCisgIGZvciAoaVggPSBwT1JEUi0+aUNvdW50OyBpWCA+IDA7IGlYLS0pCisgIHsKKyAgICBwRW50cnktPmlDaHVua25hbWUgPSBtbmdfZ2V0X3VpbnQzMiAocFJhd2RhdGEpOworICAgIHBFbnRyeS0+aU9yZGVydHlwZSA9ICoocFJhd2RhdGErNCk7CisgICAgcEVudHJ5Kys7CisgICAgcFJhd2RhdGEgKz0gNTsKKyAgfQorCisgICpwaVJhd2xlbiA9IDA7CisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfT1JEUgorTU5HX0NfU1BFQ0lBTEZVTkMgKG1uZ19zcGVjaWFsX29yZHIpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorICB7CisKKworICAgIC8qIFRPRE86IHNvbWV0aGluZyAhISEgKi8KKworCisgIH0KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOyAgICAgICAgICAgICAgICAgIC8qIGRvbmUgKi8KK30KKyNlbmRpZgorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19NQUdOCitNTkdfRl9TUEVDSUFMRlVOQyAobW5nX2RlYnVua19tYWduKQoreworICBtbmdfbWFnbnAgIHBNQUdOICAgID0gKG1uZ19tYWducClwQ2h1bms7CisgIG1uZ191aW50MzIgaVJhd2xlbiAgPSAqcGlSYXdsZW47CisgIG1uZ191aW50OHAgcFJhd2RhdGEgPSAqcHBSYXdkYXRhOworICBtbmdfYm9vbCAgIGJGYXVsdHk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGVjayBsZW5ndGggKi8KKyAgaWYgKGlSYXdsZW4gPiAyMCkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRExFTkdUSCk7CisKKyAgLyogZm9sbG93aW5nIGlzIGFuIHVnbHkgaGFjayB0byBhbGxvdyBmYXVsdHkgbGF5b3V0IGNhdXNlZCBieSBwcmV2aW91cworICAgICB2ZXJzaW9ucyBvZiBsaWJtbmcgYW5kIE1OR2V5ZSwgd2hpY2ggd3JvdGUgTUFHTiB3aXRoIGEgMTYtYml0CisgICAgIE1ldGhvZFgvTWV0aG9kWSAoYXMgb3Bwb3NlZCB0byB0aGUgcHJvcGVyIDgtYml0IGFzIGRlZmluZWQgaW4gdGhlIHNwZWMhKSAqLworCisgIGlmICgoaVJhd2xlbiA9PSAgNikgfHwgKGlSYXdsZW4gPT0gIDgpIHx8IChpUmF3bGVuID09IDEwKSB8fCAoaVJhd2xlbiA9PSAxMikgfHwKKyAgICAgIChpUmF3bGVuID09IDE0KSB8fCAoaVJhd2xlbiA9PSAxNikgfHwgKGlSYXdsZW4gPT0gMjApKQorICAgIGJGYXVsdHkgPSBNTkdfVFJVRTsgICAgICAgICAgICAgICAgLyogdGhlc2UgbGVuZ3RocyBhcmUgYWxsIHdyb25nICovCisgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggMTggY2FuIGJlIHJpZ2h0IG9yIHdyb25nICEhISAqLworICBpZiAoKGlSYXdsZW4gPT0gIDE4KSAmJiAobW5nX2dldF91aW50MTYgKHBSYXdkYXRhKzQpIDw9IDUpICYmCisgICAgICAobW5nX2dldF91aW50MTYgKHBSYXdkYXRhKzYpICA8IDI1NikgJiYKKyAgICAgIChtbmdfZ2V0X3VpbnQxNiAocFJhd2RhdGErOCkgIDwgMjU2KSAmJgorICAgICAgKG1uZ19nZXRfdWludDE2IChwUmF3ZGF0YSsxMCkgPCAyNTYpICYmCisgICAgICAobW5nX2dldF91aW50MTYgKHBSYXdkYXRhKzEyKSA8IDI1NikgJiYKKyAgICAgIChtbmdfZ2V0X3VpbnQxNiAocFJhd2RhdGErMTQpIDwgMjU2KSAmJgorICAgICAgKG1uZ19nZXRfdWludDE2IChwUmF3ZGF0YSsxNikgPCAyNTYpKQorICAgIGJGYXVsdHkgPSBNTkdfVFJVRTsgICAgICAgICAgICAgICAgLyogdGhpcyBpcyB2ZXJ5IGxpa2VseSB0aGUgd3JvbmcgbGF5b3V0ICovCisgIGVsc2UKKyAgICBiRmF1bHR5ID0gTU5HX0ZBTFNFOyAgICAgICAgICAgICAgIC8qIGFsbCBvdGhlciBjYXNlcyBhcmUgaGFuZGxlZCBhcyByaWdodCAqLworCisgIGlmIChiRmF1bHR5KSAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3cm9uZyBsYXlvdXQgPyAqLworICB7CisgICAgaWYgKGlSYXdsZW4gPiAwKSAgICAgICAgICAgICAgICAgICAvKiBnZXQgdGhlIGZpZWxkcyAqLworICAgICAgcE1BR04tPmlGaXJzdGlkID0gbW5nX2dldF91aW50MTYgKHBSYXdkYXRhKTsKKyAgICBlbHNlCisgICAgICBwTUFHTi0+aUZpcnN0aWQgPSAwOworCisgICAgaWYgKGlSYXdsZW4gPiAyKQorICAgICAgcE1BR04tPmlMYXN0aWQgID0gbW5nX2dldF91aW50MTYgKHBSYXdkYXRhKzIpOworICAgIGVsc2UKKyAgICAgIHBNQUdOLT5pTGFzdGlkICA9IHBNQUdOLT5pRmlyc3RpZDsKKworICAgIGlmIChpUmF3bGVuID4gNCkKKyAgICAgIHBNQUdOLT5pTWV0aG9kWCA9IChtbmdfdWludDgpKG1uZ19nZXRfdWludDE2IChwUmF3ZGF0YSs0KSk7CisgICAgZWxzZQorICAgICAgcE1BR04tPmlNZXRob2RYID0gMDsKKworICAgIGlmIChpUmF3bGVuID4gNikKKyAgICAgIHBNQUdOLT5pTVggICAgICA9IG1uZ19nZXRfdWludDE2IChwUmF3ZGF0YSs2KTsKKyAgICBlbHNlCisgICAgICBwTUFHTi0+aU1YICAgICAgPSAxOworCisgICAgaWYgKGlSYXdsZW4gPiA4KQorICAgICAgcE1BR04tPmlNWSAgICAgID0gbW5nX2dldF91aW50MTYgKHBSYXdkYXRhKzgpOworICAgIGVsc2UKKyAgICAgIHBNQUdOLT5pTVkgICAgICA9IHBNQUdOLT5pTVg7CisKKyAgICBpZiAoaVJhd2xlbiA+IDEwKQorICAgICAgcE1BR04tPmlNTCAgICAgID0gbW5nX2dldF91aW50MTYgKHBSYXdkYXRhKzEwKTsKKyAgICBlbHNlCisgICAgICBwTUFHTi0+aU1MICAgICAgPSBwTUFHTi0+aU1YOworCisgICAgaWYgKGlSYXdsZW4gPiAxMikKKyAgICAgIHBNQUdOLT5pTVIgICAgICA9IG1uZ19nZXRfdWludDE2IChwUmF3ZGF0YSsxMik7CisgICAgZWxzZQorICAgICAgcE1BR04tPmlNUiAgICAgID0gcE1BR04tPmlNWDsKKworICAgIGlmIChpUmF3bGVuID4gMTQpCisgICAgICBwTUFHTi0+aU1UICAgICAgPSBtbmdfZ2V0X3VpbnQxNiAocFJhd2RhdGErMTQpOworICAgIGVsc2UKKyAgICAgIHBNQUdOLT5pTVQgICAgICA9IHBNQUdOLT5pTVk7CisKKyAgICBpZiAoaVJhd2xlbiA+IDE2KQorICAgICAgcE1BR04tPmlNQiAgICAgID0gbW5nX2dldF91aW50MTYgKHBSYXdkYXRhKzE2KTsKKyAgICBlbHNlCisgICAgICBwTUFHTi0+aU1CICAgICAgPSBwTUFHTi0+aU1ZOworCisgICAgaWYgKGlSYXdsZW4gPiAxOCkKKyAgICAgIHBNQUdOLT5pTWV0aG9kWSA9IChtbmdfdWludDgpKG1uZ19nZXRfdWludDE2IChwUmF3ZGF0YSsxOCkpOworICAgIGVsc2UKKyAgICAgIHBNQUdOLT5pTWV0aG9kWSA9IHBNQUdOLT5pTWV0aG9kWDsKKyAgfQorICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJvcGVyIGxheW91dCAhISEhICovCisgIHsKKyAgICBpZiAoaVJhd2xlbiA+IDApICAgICAgICAgICAgICAgICAgIC8qIGdldCB0aGUgZmllbGRzICovCisgICAgICBwTUFHTi0+aUZpcnN0aWQgPSBtbmdfZ2V0X3VpbnQxNiAocFJhd2RhdGEpOworICAgIGVsc2UKKyAgICAgIHBNQUdOLT5pRmlyc3RpZCA9IDA7CisKKyAgICBpZiAoaVJhd2xlbiA+IDIpCisgICAgICBwTUFHTi0+aUxhc3RpZCAgPSBtbmdfZ2V0X3VpbnQxNiAocFJhd2RhdGErMik7CisgICAgZWxzZQorICAgICAgcE1BR04tPmlMYXN0aWQgID0gcE1BR04tPmlGaXJzdGlkOworCisgICAgaWYgKGlSYXdsZW4gPiA0KQorICAgICAgcE1BR04tPmlNZXRob2RYID0gKihwUmF3ZGF0YSs0KTsKKyAgICBlbHNlCisgICAgICBwTUFHTi0+aU1ldGhvZFggPSAwOworCisgICAgaWYgKGlSYXdsZW4gPiA1KQorICAgICAgcE1BR04tPmlNWCAgICAgID0gbW5nX2dldF91aW50MTYgKHBSYXdkYXRhKzUpOworICAgIGVsc2UKKyAgICAgIHBNQUdOLT5pTVggICAgICA9IDE7CisKKyAgICBpZiAoaVJhd2xlbiA+IDcpCisgICAgICBwTUFHTi0+aU1ZICAgICAgPSBtbmdfZ2V0X3VpbnQxNiAocFJhd2RhdGErNyk7CisgICAgZWxzZQorICAgICAgcE1BR04tPmlNWSAgICAgID0gcE1BR04tPmlNWDsKKworICAgIGlmIChpUmF3bGVuID4gOSkKKyAgICAgIHBNQUdOLT5pTUwgICAgICA9IG1uZ19nZXRfdWludDE2IChwUmF3ZGF0YSs5KTsKKyAgICBlbHNlCisgICAgICBwTUFHTi0+aU1MICAgICAgPSBwTUFHTi0+aU1YOworCisgICAgaWYgKGlSYXdsZW4gPiAxMSkKKyAgICAgIHBNQUdOLT5pTVIgICAgICA9IG1uZ19nZXRfdWludDE2IChwUmF3ZGF0YSsxMSk7CisgICAgZWxzZQorICAgICAgcE1BR04tPmlNUiAgICAgID0gcE1BR04tPmlNWDsKKworICAgIGlmIChpUmF3bGVuID4gMTMpCisgICAgICBwTUFHTi0+aU1UICAgICAgPSBtbmdfZ2V0X3VpbnQxNiAocFJhd2RhdGErMTMpOworICAgIGVsc2UKKyAgICAgIHBNQUdOLT5pTVQgICAgICA9IHBNQUdOLT5pTVk7CisKKyAgICBpZiAoaVJhd2xlbiA+IDE1KQorICAgICAgcE1BR04tPmlNQiAgICAgID0gbW5nX2dldF91aW50MTYgKHBSYXdkYXRhKzE1KTsKKyAgICBlbHNlCisgICAgICBwTUFHTi0+aU1CICAgICAgPSBwTUFHTi0+aU1ZOworCisgICAgaWYgKGlSYXdsZW4gPiAxNykKKyAgICAgIHBNQUdOLT5pTWV0aG9kWSA9ICoocFJhd2RhdGErMTcpOworICAgIGVsc2UKKyAgICAgIHBNQUdOLT5pTWV0aG9kWSA9IHBNQUdOLT5pTWV0aG9kWDsKKyAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2hlY2sgZmllbGQgdmFsaWRpdHkgKi8KKyAgaWYgKChwTUFHTi0+aU1ldGhvZFggPiA1KSB8fCAocE1BR04tPmlNZXRob2RZID4gNSkpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURNRVRIT0QpOworCisgICpwaVJhd2xlbiA9IDA7CisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19NQUdOCitNTkdfQ19TUEVDSUFMRlVOQyAobW5nX3NwZWNpYWxfbWFnbikKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCisgIHJldHVybiBtbmdfY3JlYXRlX2FuaV9tYWduIChwRGF0YSwgcENodW5rKTsKKyNlbHNlCisgIHJldHVybiBNTkdfTk9FUlJPUjsgICAgICAgICAgICAgICAgICAKKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX2V2TlQKK01OR19GX1NQRUNJQUxGVU5DIChtbmdfZXZudF9lbnRyaWVzKQoreworICBtbmdfZXZudHAgICAgICAgcEVWTlQgPSAobW5nX2V2bnRwKXBDaHVuazsKKyAgbW5nX3VpbnQzMiAgICAgIGlSYXdsZW47CisgIG1uZ191aW50OHAgICAgICBwUmF3ZGF0YTsKKyNpZiBkZWZpbmVkKE1OR19TVVBQT1JUX0RJU1BMQVkpICYmIGRlZmluZWQoTU5HX1NVUFBPUlRfRFlOQU1JQ01ORykKKyAgbW5nX3JldGNvZGUgICAgIGlSZXRjb2RlOworI2VuZGlmCisgIG1uZ191aW50OHAgICAgICBwTnVsbDsKKyAgbW5nX3VpbnQ4ICAgICAgIGlFdmVudHR5cGU7CisgIG1uZ191aW50OCAgICAgICBpTWFza3R5cGU7CisgIG1uZ19pbnQzMiAgICAgICBpTGVmdDsKKyAgbW5nX2ludDMyICAgICAgIGlSaWdodDsKKyAgbW5nX2ludDMyICAgICAgIGlUb3A7CisgIG1uZ19pbnQzMiAgICAgICBpQm90dG9tOworICBtbmdfdWludDE2ICAgICAgaU9iamVjdGlkOworICBtbmdfdWludDggICAgICAgaUluZGV4OworICBtbmdfdWludDMyICAgICAgaU5hbWVzaXplOworICBtbmdfdWludDMyICAgICAgaUNvdW50ID0gMDsKKyAgbW5nX2V2bnRfZW50cnlwIHBFbnRyeSA9IE1OR19OVUxMOworICBtbmdfdWludDMyICAgICAgaVg7CisKKyAgZm9yIChpWCA9IDA7IGlYIDwgMjsgaVgrKykKKyAgeworICAgIGlSYXdsZW4gID0gKnBpUmF3bGVuOworICAgIHBSYXdkYXRhID0gKnBwUmF3ZGF0YTsKKworICAgIGlmIChpWCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2Vjb25kIHJ1biA/ICovCisgICAgeworICAgICAgTU5HX0FMTE9DIChwRGF0YSwgcEVudHJ5LCAoaUNvdW50ICogc2l6ZW9mIChtbmdfZXZudF9lbnRyeSkpKTsKKyAgICAgIHBFVk5ULT5pQ291bnQgICA9IGlDb3VudDsKKyAgICAgIHBFVk5ULT5wRW50cmllcyA9IHBFbnRyeTsKKyAgICB9CisKKyAgICB3aGlsZSAoaVJhd2xlbikgICAgICAgICAgICAgICAgICAgIC8qIGFueXRoaW5nIGxlZnQgPyAqLworICAgIHsKKyAgICAgIGlmIChpUmF3bGVuIDwgMikgICAgICAgICAgICAgICAgIC8qIG11c3QgaGF2ZSBhdCBsZWFzdCAyIGJ5dGVzICEgKi8KKyAgICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURMRU5HVEgpOworCisgICAgICBpRXZlbnR0eXBlID0gKnBSYXdkYXRhOyAgICAgICAgICAvKiBldmVudHR5cGUgKi8KKyAgICAgIGlmIChpRXZlbnR0eXBlID4gNSkKKyAgICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURFVkVOVCk7CisKKyAgICAgIHBSYXdkYXRhKys7CisKKyAgICAgIGlNYXNrdHlwZSAgPSAqcFJhd2RhdGE7ICAgICAgICAgIC8qIG1hc2t0eXBlICovCisgICAgICBpZiAoaU1hc2t0eXBlID4gNSkKKyAgICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURNQVNLKTsKKworICAgICAgcFJhd2RhdGErKzsKKyAgICAgIGlSYXdsZW4gLT0gMjsKKworICAgICAgaUxlZnQgICAgID0gMDsKKyAgICAgIGlSaWdodCAgICA9IDA7CisgICAgICBpVG9wICAgICAgPSAwOworICAgICAgaUJvdHRvbSAgID0gMDsKKyAgICAgIGlPYmplY3RpZCA9IDA7CisgICAgICBpSW5kZXggICAgPSAwOworCisgICAgICBzd2l0Y2ggKGlNYXNrdHlwZSkKKyAgICAgIHsKKyAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoaVJhd2xlbiA+IDE2KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpTGVmdCAgICAgPSBtbmdfZ2V0X2ludDMyIChwUmF3ZGF0YSk7CisgICAgICAgICAgICAgIGlSaWdodCAgICA9IG1uZ19nZXRfaW50MzIgKHBSYXdkYXRhKzQpOworICAgICAgICAgICAgICBpVG9wICAgICAgPSBtbmdfZ2V0X2ludDMyIChwUmF3ZGF0YSs4KTsKKyAgICAgICAgICAgICAgaUJvdHRvbSAgID0gbW5nX2dldF9pbnQzMiAocFJhd2RhdGErMTIpOworICAgICAgICAgICAgICBwUmF3ZGF0YSArPSAxNjsKKyAgICAgICAgICAgICAgaVJhd2xlbiAtPSAxNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURMRU5HVEgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICBjYXNlIDIgOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpUmF3bGVuID4gMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaU9iamVjdGlkID0gbW5nX2dldF91aW50MTYgKHBSYXdkYXRhKTsKKyAgICAgICAgICAgICAgcFJhd2RhdGEgKz0gMjsKKyAgICAgICAgICAgICAgaVJhd2xlbiAtPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRExFTkdUSCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIGNhc2UgMyA6CisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKGlSYXdsZW4gPiAzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpT2JqZWN0aWQgPSBtbmdfZ2V0X3VpbnQxNiAocFJhd2RhdGEpOworICAgICAgICAgICAgICBpSW5kZXggICAgPSAqKHBSYXdkYXRhKzIpOworICAgICAgICAgICAgICBwUmF3ZGF0YSArPSAzOworICAgICAgICAgICAgICBpUmF3bGVuIC09IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElETEVOR1RIKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgY2FzZSA0IDoKKyAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoaVJhd2xlbiA+IDE4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpTGVmdCAgICAgPSBtbmdfZ2V0X2ludDMyIChwUmF3ZGF0YSk7CisgICAgICAgICAgICAgIGlSaWdodCAgICA9IG1uZ19nZXRfaW50MzIgKHBSYXdkYXRhKzQpOworICAgICAgICAgICAgICBpVG9wICAgICAgPSBtbmdfZ2V0X2ludDMyIChwUmF3ZGF0YSs4KTsKKyAgICAgICAgICAgICAgaUJvdHRvbSAgID0gbW5nX2dldF9pbnQzMiAocFJhd2RhdGErMTIpOworICAgICAgICAgICAgICBpT2JqZWN0aWQgPSBtbmdfZ2V0X3VpbnQxNiAocFJhd2RhdGErMTYpOworICAgICAgICAgICAgICBwUmF3ZGF0YSArPSAxODsKKyAgICAgICAgICAgICAgaVJhd2xlbiAtPSAxODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURMRU5HVEgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICBjYXNlIDUgOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpUmF3bGVuID4gMTkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlMZWZ0ICAgICA9IG1uZ19nZXRfaW50MzIgKHBSYXdkYXRhKTsKKyAgICAgICAgICAgICAgaVJpZ2h0ICAgID0gbW5nX2dldF9pbnQzMiAocFJhd2RhdGErNCk7CisgICAgICAgICAgICAgIGlUb3AgICAgICA9IG1uZ19nZXRfaW50MzIgKHBSYXdkYXRhKzgpOworICAgICAgICAgICAgICBpQm90dG9tICAgPSBtbmdfZ2V0X2ludDMyIChwUmF3ZGF0YSsxMik7CisgICAgICAgICAgICAgIGlPYmplY3RpZCA9IG1uZ19nZXRfdWludDE2IChwUmF3ZGF0YSsxNik7CisgICAgICAgICAgICAgIGlJbmRleCAgICA9ICoocFJhd2RhdGErMTgpOworICAgICAgICAgICAgICBwUmF3ZGF0YSArPSAxOTsKKyAgICAgICAgICAgICAgaVJhd2xlbiAtPSAxOTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURMRU5HVEgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgfQorCisgICAgICBwTnVsbCA9IHBSYXdkYXRhOyAgICAgICAgICAgICAgICAvKiBnZXQgdGhlIG5hbWUgbGVuZ3RoICovCisgICAgICB3aGlsZSAoKnBOdWxsKQorICAgICAgICBwTnVsbCsrOworCisgICAgICBpZiAoKHBOdWxsIC0gcFJhd2RhdGEpID4gKG1uZ19pbnQzMilpUmF3bGVuKQorICAgICAgeworICAgICAgICBpTmFtZXNpemUgPSBpUmF3bGVuOyAgICAgICAgICAgLyogbm8gbnVsbCBmb3VuZDsgc28gZW5kIG9mIGV2TlQgKi8KKyAgICAgICAgaVJhd2xlbiAgID0gMDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgaU5hbWVzaXplID0gcE51bGwgLSBwUmF3ZGF0YTsgIC8qIHNob3VsZCBiZSBhbm90aGVyIGVudHJ5ICovCisgICAgICAgIGlSYXdsZW4gICA9IGlSYXdsZW4gLSBpTmFtZXNpemUgLSAxOworCisgICAgICAgIGlmICghaVJhd2xlbikgICAgICAgICAgICAgICAgICAvKiBtdXN0IG5vdCBlbmQgd2l0aCBhIG51bGwgISAqLworICAgICAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19FTkRXSVRITlVMTCk7CisgICAgICB9CisKKyAgICAgIGlmICghaVgpCisgICAgICB7CisgICAgICAgIGlDb3VudCsrOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBwRW50cnktPmlFdmVudHR5cGUgICAgICAgPSBpRXZlbnR0eXBlOworICAgICAgICBwRW50cnktPmlNYXNrdHlwZSAgICAgICAgPSBpTWFza3R5cGU7CisgICAgICAgIHBFbnRyeS0+aUxlZnQgICAgICAgICAgICA9IGlMZWZ0OworICAgICAgICBwRW50cnktPmlSaWdodCAgICAgICAgICAgPSBpUmlnaHQ7CisgICAgICAgIHBFbnRyeS0+aVRvcCAgICAgICAgICAgICA9IGlUb3A7CisgICAgICAgIHBFbnRyeS0+aUJvdHRvbSAgICAgICAgICA9IGlCb3R0b207CisgICAgICAgIHBFbnRyeS0+aU9iamVjdGlkICAgICAgICA9IGlPYmplY3RpZDsKKyAgICAgICAgcEVudHJ5LT5pSW5kZXggICAgICAgICAgID0gaUluZGV4OworICAgICAgICBwRW50cnktPmlTZWdtZW50bmFtZXNpemUgPSBpTmFtZXNpemU7CisKKyAgICAgICAgaWYgKGlOYW1lc2l6ZSkKKyAgICAgICAgeworICAgICAgICAgIE1OR19BTExPQyAocERhdGEsIHBFbnRyeS0+elNlZ21lbnRuYW1lLCBpTmFtZXNpemUrMSk7CisgICAgICAgICAgTU5HX0NPUFkgKHBFbnRyeS0+elNlZ21lbnRuYW1lLCBwUmF3ZGF0YSwgaU5hbWVzaXplKTsKKyAgICAgICAgfQorCisjaWYgZGVmaW5lZChNTkdfU1VQUE9SVF9ESVNQTEFZKSAmJiBkZWZpbmVkKE1OR19TVVBQT1JUX0RZTkFNSUNNTkcpCisgICAgICAgIGlSZXRjb2RlID0gbW5nX2NyZWF0ZV9ldmVudCAocERhdGEsIChtbmdfcHRyKXBFbnRyeSk7CisgICAgICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICAgICAgcmV0dXJuIGlSZXRjb2RlOworI2VuZGlmCisKKyAgICAgICAgcEVudHJ5Kys7CisgICAgICB9CisKKyAgICAgIHBSYXdkYXRhID0gcFJhd2RhdGEgKyBpTmFtZXNpemUgKyAxOworICAgIH0KKyAgfQorCisgICpwaVJhd2xlbiA9IDA7CisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19ldk5UCitNTkdfQ19TUEVDSUFMRlVOQyAobW5nX3NwZWNpYWxfZXZudCkKK3sKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfSU5DTFVERV9NUE5HX1BST1BPU0FMCitNTkdfQ19TUEVDSUFMRlVOQyAobW5nX3NwZWNpYWxfbXBuZykKK3sKKyAgaWYgKChwRGF0YS0+ZUltYWdldHlwZSAhPSBtbmdfaXRfcG5nKSAmJiAocERhdGEtPmVJbWFnZXR5cGUgIT0gbW5nX2l0X2puZykpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0NIVU5LTk9UQUxMT1dFRCk7CisgICAgCisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorICByZXR1cm4gbW5nX2NyZWF0ZV9tcG5nX29iaiAocERhdGEsIHBDaHVuayk7CisjZWxzZQorICByZXR1cm4gTU5HX05PRVJST1I7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX0lOQ0xVREVfQU5HX1BST1BPU0FMCitNTkdfQ19TUEVDSUFMRlVOQyAobW5nX3NwZWNpYWxfYWhkcikKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCisgIHJldHVybiBtbmdfY3JlYXRlX2FuZ19vYmogKHBEYXRhLCBwQ2h1bmspOworI2Vsc2UKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworI2VuZGlmCit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19JTkNMVURFX0FOR19QUk9QT1NBTAorTU5HX0ZfU1BFQ0lBTEZVTkMgKG1uZ19hZGF0X3RpbGVzKQoreworICBpZiAoKHBEYXRhLT5lSW1hZ2V0eXBlICE9IG1uZ19pdF9hbmcpIHx8ICghcERhdGEtPnBBTkcpKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19DSFVOS05PVEFMTE9XRUQpOworCisgIHsKKyAgICBtbmdfYWRhdHAgICAgICBwQURBVCA9IChtbmdfYWRhdHApcENodW5rOworICAgIG1uZ19hbmdfb2JqcCAgIHBBTkcgID0gKG1uZ19hbmdfb2JqcClwRGF0YS0+cEFORzsKKyAgICBtbmdfdWludDMyICAgICBpUmF3bGVuICA9ICpwaVJhd2xlbjsKKyAgICBtbmdfdWludDhwICAgICBwUmF3ZGF0YSA9ICpwcFJhd2RhdGE7CisgICAgbW5nX3JldGNvZGUgICAgaVJldGNvZGU7CisgICAgbW5nX3VpbnQ4cCAgICAgcEJ1ZjsKKyAgICBtbmdfdWludDMyICAgICBpQnVmc2l6ZTsKKyAgICBtbmdfdWludDMyICAgICBpUmVhbHNpemU7CisgICAgbW5nX3VpbnQ4cCAgICAgcFRlbXA7CisgICAgbW5nX3VpbnQ4cCAgICAgcFRlbXAyOworICAgIG1uZ19pbnQzMiAgICAgIGlYOworICAgIG1uZ19pbnQzMiAgICAgIGlTaXplOworCisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorICAgIG1uZ19pbWFnZXAgICAgIHBJbWFnZTsKKyAgICBtbmdfaW50MzIgICAgICBpVGVtcGxlbjsKKyAgICBtbmdfdWludDhwICAgICBwU3dhcDsKKworICAgIG1uZ19wcm9jZXNzb2JqZWN0IHBQcm9jZXNzOworCisgICAgbW5nX3VpbnQzMiAgICAgaVNhdmVkYXRhd2lkdGg7CisgICAgbW5nX3VpbnQzMiAgICAgaVNhdmVkYXRhaGVpZ2h0OworCisgICAgbW5nX2ZwdHIgICAgICAgZlNhdmVpbml0cm93cHJvYzsKKyAgICBtbmdfZnB0ciAgICAgICBmU2F2ZXN0b3Jlcm93OworICAgIG1uZ19mcHRyICAgICAgIGZTYXZlcHJvY2Vzc3JvdzsKKyAgICBtbmdfZnB0ciAgICAgICBmU2F2ZWRpZmZlcnJvdzsKKyAgICBtbmdfaW1hZ2VwICAgICBmU2F2ZXN0b3Jlb2JqOworICAgIG1uZ19pbWFnZWRhdGFwIGZTYXZlc3RvcmVidWY7CisKKyNpZmRlZiBNTkdfT1BUSU1JWkVfRk9PVFBSSU5UX0lOSVQKKyAgICBwbmdfaW1ndHlwZSAgICBlU2F2ZXBuZ2ltZ3R5cGU7CisjZW5kaWYKKworICAgIG1uZ191aW50OCAgICAgIGlTYXZlaW50ZXJsYWNlOworICAgIG1uZ19pbnQ4ICAgICAgIGlTYXZlcGFzczsKKyAgICBtbmdfaW50MzIgICAgICBpU2F2ZXJvdzsKKyAgICBtbmdfaW50MzIgICAgICBpU2F2ZXJvd2luYzsKKyAgICBtbmdfaW50MzIgICAgICBpU2F2ZWNvbDsKKyAgICBtbmdfaW50MzIgICAgICBpU2F2ZWNvbGluYzsKKyAgICBtbmdfaW50MzIgICAgICBpU2F2ZXJvd3NhbXBsZXM7CisgICAgbW5nX2ludDMyICAgICAgaVNhdmVzYW1wbGVtdWw7CisgICAgbW5nX2ludDMyICAgICAgaVNhdmVzYW1wbGVvZnM7CisgICAgbW5nX2ludDMyICAgICAgaVNhdmVzYW1wbGVkaXY7CisgICAgbW5nX2ludDMyICAgICAgaVNhdmVyb3dzaXplOworICAgIG1uZ19pbnQzMiAgICAgIGlTYXZlcm93bWF4OworICAgIG1uZ19pbnQzMiAgICAgIGlTYXZlZmlsdGVyb2ZzOworICAgIG1uZ19pbnQzMiAgICAgIGlTYXZlcGl4ZWxvZnM7CisgICAgbW5nX3VpbnQzMiAgICAgaVNhdmVsZXZlbDA7CisgICAgbW5nX3VpbnQzMiAgICAgaVNhdmVsZXZlbDE7CisgICAgbW5nX3VpbnQzMiAgICAgaVNhdmVsZXZlbDI7CisgICAgbW5nX3VpbnQzMiAgICAgaVNhdmVsZXZlbDM7CisgICAgbW5nX3VpbnQ4cCAgICAgcFNhdmV3b3Jrcm93OworICAgIG1uZ191aW50OHAgICAgIHBTYXZlcHJldnJvdzsKKyAgICBtbmdfdWludDhwICAgICBwU2F2ZXJHQkFyb3c7CisgICAgbW5nX2Jvb2wgICAgICAgYlNhdmVpc1JHQkExNjsKKyAgICBtbmdfYm9vbCAgICAgICBiU2F2ZWlzT3BhcXVlOworICAgIG1uZ19pbnQzMiAgICAgIGlTYXZlZmlsdGVyYnBwOworCisgICAgbW5nX2ludDMyICAgICAgaVNhdmVkZXN0bDsKKyAgICBtbmdfaW50MzIgICAgICBpU2F2ZWRlc3R0OworICAgIG1uZ19pbnQzMiAgICAgIGlTYXZlZGVzdHI7CisgICAgbW5nX2ludDMyICAgICAgaVNhdmVkZXN0YjsKKyAgICBtbmdfaW50MzIgICAgICBpU2F2ZXNvdXJjZWw7CisgICAgbW5nX2ludDMyICAgICAgaVNhdmVzb3VyY2V0OworICAgIG1uZ19pbnQzMiAgICAgIGlTYXZlc291cmNlcjsKKyAgICBtbmdfaW50MzIgICAgICBpU2F2ZXNvdXJjZWI7CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfRElTUExBWSAqLworCisgICAgaVJldGNvZGUgPSBtbmdfaW5mbGF0ZV9idWZmZXIgKHBEYXRhLCBwUmF3ZGF0YSwgaVJhd2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBCdWYsICZpQnVmc2l6ZSwgJmlSZWFsc2l6ZSk7CisgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZG9uJ3QgZm9yZ2V0IHRvIGRyb3AgdGhlIHRlbXAgYnVmZmVyICovCisgICAgICBNTkdfRlJFRVggKHBEYXRhLCBwQnVmLCBpQnVmc2l6ZSk7CisgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0IGJ1ZmZlciBmb3IgdGlsZSBpbmZvIGluIEFEQVQgY2h1bmsgKi8KKyAgICBwQURBVC0+aVRpbGVzc2l6ZSA9IHBBTkctPmlOdW1mcmFtZXMgKiBzaXplb2YobW5nX2FkYXRfdGlsZSk7CisgICAgTU5HX0FMTE9DWCAocERhdGEsIHBBREFULT5wVGlsZXMsIHBBREFULT5pVGlsZXNzaXplKTsKKyAgICBpZiAoIXBBREFULT5wVGlsZXMpCisgICAgeworICAgICAgcEFEQVQtPmlUaWxlc3NpemUgPSAwOworICAgICAgTU5HX0ZSRUVYIChwRGF0YSwgcEJ1ZiwgaUJ1ZnNpemUpOworICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX09VVE9GTUVNT1JZKTsKKyAgICB9CisKKyAgICBwVGVtcCAgPSBwQnVmOworICAgIHBUZW1wMiA9IChtbmdfdWludDhwKXBBREFULT5wVGlsZXM7CisKKyAgICBpZiAoIXBBTkctPmlTdGlsbHVzZWQpCisgICAgICBpU2l6ZSA9IDEyOworICAgIGVsc2UKKyAgICAgIGlTaXplID0gMTM7CisKKyAgICBmb3IgKGlYID0gMDsgaVggPCBwQU5HLT5pTnVtZnJhbWVzOyBpWCsrKQorICAgIHsKKyAgICAgIE1OR19DT1BZIChwVGVtcDIsIHBUZW1wLCBpU2l6ZSk7CisgICAgICBwVGVtcCAgKz0gaVNpemU7CisgICAgICBwVGVtcDIgKz0gc2l6ZW9mKG1uZ19hZGF0X3RpbGUpOworICAgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX0RJU1BMQVkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCBidWZmZXIgZm9yIHRpbGUgaW5mbyBpbiBBTkcgb2JqZWN0ICovCisgICAgcEFORy0+aVRpbGVzc2l6ZSA9IHBBREFULT5pVGlsZXNzaXplOworICAgIE1OR19BTExPQ1ggKHBEYXRhLCBwQU5HLT5wVGlsZXMsIHBBTkctPmlUaWxlc3NpemUpOworICAgIGlmICghcEFORy0+cFRpbGVzKQorICAgIHsKKyAgICAgIHBBTkctPmlUaWxlc3NpemUgPSAwOworICAgICAgTU5HX0ZSRUVYIChwRGF0YSwgcEJ1ZiwgaUJ1ZnNpemUpOworICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX09VVE9GTUVNT1JZKTsKKyAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3B5IGl0IGZyb20gdGhlIEFEQVQgb2JqZWN0ICovCisgICAgTU5HX0NPUFkgKHBBTkctPnBUaWxlcywgcEFEQVQtPnBUaWxlcywgcEFORy0+aVRpbGVzc2l6ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNhdmUgSURBVCB3b3JrLXBhcm1zICovCisgICAgZlNhdmVpbml0cm93cHJvYyAgICA9IHBEYXRhLT5mSW5pdHJvd3Byb2M7CisgICAgZlNhdmVzdG9yZXJvdyAgICAgICA9IHBEYXRhLT5mRGlzcGxheXJvdzsKKyAgICBmU2F2ZXByb2Nlc3Nyb3cgICAgID0gcERhdGEtPmZQcm9jZXNzcm93OworICAgIGZTYXZlZGlmZmVycm93ICAgICAgPSBwRGF0YS0+ZkRpZmZlcnJvdzsKKyAgICBmU2F2ZXN0b3Jlb2JqICAgICAgID0gcERhdGEtPnBTdG9yZW9iajsKKyAgICBmU2F2ZXN0b3JlYnVmICAgICAgID0gcERhdGEtPnBTdG9yZWJ1ZjsKKworI2lmZGVmIE1OR19PUFRJTUlaRV9GT09UUFJJTlRfSU5JVAorICAgIGVTYXZlcG5naW1ndHlwZSAgICAgPSBwRGF0YS0+ZVBuZ19pbWd0eXBlOworI2VuZGlmCisKKyAgICBpU2F2ZWRhdGF3aWR0aCAgICAgID0gcERhdGEtPmlEYXRhd2lkdGg7CisgICAgaVNhdmVkYXRhaGVpZ2h0ICAgICA9IHBEYXRhLT5pRGF0YWhlaWdodDsKKyAgICBpU2F2ZWludGVybGFjZSAgICAgID0gcERhdGEtPmlJbnRlcmxhY2U7CisgICAgaVNhdmVwYXNzICAgICAgICAgICA9IHBEYXRhLT5pUGFzczsKKyAgICBpU2F2ZXJvdyAgICAgICAgICAgID0gcERhdGEtPmlSb3c7CisgICAgaVNhdmVyb3dpbmMgICAgICAgICA9IHBEYXRhLT5pUm93aW5jOworICAgIGlTYXZlY29sICAgICAgICAgICAgPSBwRGF0YS0+aUNvbDsKKyAgICBpU2F2ZWNvbGluYyAgICAgICAgID0gcERhdGEtPmlDb2xpbmM7CisgICAgaVNhdmVyb3dzYW1wbGVzICAgICA9IHBEYXRhLT5pUm93c2FtcGxlczsKKyAgICBpU2F2ZXNhbXBsZW11bCAgICAgID0gcERhdGEtPmlTYW1wbGVtdWw7CisgICAgaVNhdmVzYW1wbGVvZnMgICAgICA9IHBEYXRhLT5pU2FtcGxlb2ZzOworICAgIGlTYXZlc2FtcGxlZGl2ICAgICAgPSBwRGF0YS0+aVNhbXBsZWRpdjsKKyAgICBpU2F2ZXJvd3NpemUgICAgICAgID0gcERhdGEtPmlSb3dzaXplOworICAgIGlTYXZlcm93bWF4ICAgICAgICAgPSBwRGF0YS0+aVJvd21heDsKKyAgICBpU2F2ZWZpbHRlcm9mcyAgICAgID0gcERhdGEtPmlGaWx0ZXJvZnM7CisgICAgaVNhdmVwaXhlbG9mcyAgICAgICA9IHBEYXRhLT5pUGl4ZWxvZnM7CisgICAgaVNhdmVsZXZlbDAgICAgICAgICA9IHBEYXRhLT5pTGV2ZWwwOworICAgIGlTYXZlbGV2ZWwxICAgICAgICAgPSBwRGF0YS0+aUxldmVsMTsKKyAgICBpU2F2ZWxldmVsMiAgICAgICAgID0gcERhdGEtPmlMZXZlbDI7CisgICAgaVNhdmVsZXZlbDMgICAgICAgICA9IHBEYXRhLT5pTGV2ZWwzOworICAgIHBTYXZld29ya3JvdyAgICAgICAgPSBwRGF0YS0+cFdvcmtyb3c7CisgICAgcFNhdmVwcmV2cm93ICAgICAgICA9IHBEYXRhLT5wUHJldnJvdzsKKyAgICBwU2F2ZXJHQkFyb3cgICAgICAgID0gcERhdGEtPnBSR0JBcm93OworICAgIGJTYXZlaXNSR0JBMTYgICAgICAgPSBwRGF0YS0+YklzUkdCQTE2OworICAgIGJTYXZlaXNPcGFxdWUgICAgICAgPSBwRGF0YS0+YklzT3BhcXVlOworICAgIGlTYXZlZmlsdGVyYnBwICAgICAgPSBwRGF0YS0+aUZpbHRlcmJwcDsKKyAgICBpU2F2ZWRlc3RsICAgICAgICAgID0gcERhdGEtPmlEZXN0bDsKKyAgICBpU2F2ZWRlc3R0ICAgICAgICAgID0gcERhdGEtPmlEZXN0dDsKKyAgICBpU2F2ZWRlc3RyICAgICAgICAgID0gcERhdGEtPmlEZXN0cjsKKyAgICBpU2F2ZWRlc3RiICAgICAgICAgID0gcERhdGEtPmlEZXN0YjsKKyAgICBpU2F2ZXNvdXJjZWwgICAgICAgID0gcERhdGEtPmlTb3VyY2VsOworICAgIGlTYXZlc291cmNldCAgICAgICAgPSBwRGF0YS0+aVNvdXJjZXQ7CisgICAgaVNhdmVzb3VyY2VyICAgICAgICA9IHBEYXRhLT5pU291cmNlcjsKKyAgICBpU2F2ZXNvdXJjZWIgICAgICAgID0gcERhdGEtPmlTb3VyY2ViOworCisgICAgcERhdGEtPmlEYXRhd2lkdGggICA9IHBBTkctPmlUaWxld2lkdGg7CisgICAgcERhdGEtPmlEYXRhaGVpZ2h0ICA9IHBBTkctPmlUaWxlaGVpZ2h0OworCisgICAgcERhdGEtPmlEZXN0bCAgICAgICA9IDA7CisgICAgcERhdGEtPmlEZXN0dCAgICAgICA9IDA7CisgICAgcERhdGEtPmlEZXN0ciAgICAgICA9IHBBTkctPmlUaWxld2lkdGg7CisgICAgcERhdGEtPmlEZXN0YiAgICAgICA9IHBBTkctPmlUaWxlaGVpZ2h0OworICAgIHBEYXRhLT5pU291cmNlbCAgICAgPSAwOworICAgIHBEYXRhLT5pU291cmNldCAgICAgPSAwOworICAgIHBEYXRhLT5pU291cmNlciAgICAgPSBwQU5HLT5pVGlsZXdpZHRoOworICAgIHBEYXRhLT5pU291cmNlYiAgICAgPSBwQU5HLT5pVGlsZWhlaWdodDsKKworICAgIHBEYXRhLT5mSW5pdHJvd3Byb2MgPSBNTkdfTlVMTDsKKyAgICBwRGF0YS0+ZlN0b3Jlcm93ICAgID0gTU5HX05VTEw7CisgICAgcERhdGEtPmZQcm9jZXNzcm93ICA9IE1OR19OVUxMOworICAgIHBEYXRhLT5mRGlmZmVycm93ICAgPSBNTkdfTlVMTDsKKworICAgIC8qIGNsb25lIGltYWdlIG9iamVjdCB0byBzdG9yZSB0aGUgcGl4ZWwtZGF0YSBmcm9tIG9iamVjdCAwICovCisgICAgaVJldGNvZGUgPSBtbmdfY2xvbmVfaW1hZ2VvYmplY3QgKHBEYXRhLCAxLCBNTkdfRkFMU0UsIE1OR19GQUxTRSwgTU5HX0ZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTkdfRkFMU0UsIDAsIDAsIDAsIHBEYXRhLT5wT2JqemVybywgJnBJbWFnZSk7CisgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciwgZHJvcCB0ZW1wIGJ1ZmZlciBhbmQgYmFpbCAqLworICAgIHsKKyAgICAgIE1OR19GUkVFWCAocERhdGEsIHBCdWYsIGlCdWZzaXplKTsKKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICB9CisKKyAgICAvKiBtYWtlIHN1cmUgd2UgZ290IHRoZSByaWdodCBkaW1lbnNpb25zIGFuZCBpbnRlcmxhY2luZyAqLworICAgIGlSZXRjb2RlID0gbW5nX3Jlc2V0X29iamVjdF9kZXRhaWxzIChwRGF0YSwgcEltYWdlLCBwQU5HLT5pVGlsZXdpZHRoLCBwQU5HLT5pVGlsZWhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlLT5wSW1nYnVmLT5pQml0ZGVwdGgsIHBJbWFnZS0+cEltZ2J1Zi0+aUNvbG9ydHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlLT5wSW1nYnVmLT5pQ29tcHJlc3Npb24sIHBJbWFnZS0+cEltZ2J1Zi0+aUZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFORy0+aUludGVybGFjZSwgTU5HX0ZBTFNFKTsKKyAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yLCBkcm9wIHRlbXAgYnVmZmVyIGFuZCBiYWlsICovCisgICAgeworICAgICAgTU5HX0ZSRUVYIChwRGF0YSwgcEJ1ZiwgaUJ1ZnNpemUpOworICAgICAgcmV0dXJuIGlSZXRjb2RlOworICAgIH0KKworICAgIHBEYXRhLT5wU3RvcmVvYmogICAgPSBwSW1hZ2U7CisKKyNpZmRlZiBNTkdfT1BUSU1JWkVfRk9PVFBSSU5UX0lOSVQKKyAgICBwRGF0YS0+ZkluaXRyb3dwcm9jID0gKG1uZ19mcHRyKW1uZ19pbml0X3Jvd3Byb2M7CisgICAgcERhdGEtPmVQbmdfaW1ndHlwZSA9IG1uZ19wbmdfaW1ndHlwZShwRGF0YS0+aUNvbG9ydHlwZSxwRGF0YS0+aUJpdGRlcHRoKTsKKyNlbHNlCisgICAgc3dpdGNoIChwRGF0YS0+aUNvbG9ydHlwZSkgICAgICAgICAvKiBkZXRlcm1pbmUgcm93IGluaXRpYWxpemF0aW9uIHJvdXRpbmUgKi8KKyAgICB7CisgICAgICBjYXNlIDAgOiB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBncmF5ICovCisgICAgICAgICAgICAgICAgIHN3aXRjaCAocERhdGEtPmlCaXRkZXB0aCkKKyAgICAgICAgICAgICAgICAgeworI2lmbmRlZiBNTkdfTk9fMV8yXzRCSVRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgIGNhc2UgIDEgOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwRGF0YS0+aUludGVybGFjZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mSW5pdHJvd3Byb2MgPSAobW5nX2ZwdHIpbW5nX2luaXRfZzFfbmk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZJbml0cm93cHJvYyA9IChtbmdfZnB0ciltbmdfaW5pdF9nMV9pOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICBjYXNlICAyIDogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcERhdGEtPmlJbnRlcmxhY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZkluaXRyb3dwcm9jID0gKG1uZ19mcHRyKW1uZ19pbml0X2cyX25pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mSW5pdHJvd3Byb2MgPSAobW5nX2ZwdHIpbW5nX2luaXRfZzJfaTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgY2FzZSAgNCA6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBEYXRhLT5pSW50ZXJsYWNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZJbml0cm93cHJvYyA9IChtbmdfZnB0ciltbmdfaW5pdF9nNF9uaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZkluaXRyb3dwcm9jID0gKG1uZ19mcHRyKW1uZ19pbml0X2c0X2k7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBNTkdfTk9fMV8yXzRCSVRfU1VQUE9SVCAqLworICAgICAgICAgICAgICAgICAgIGNhc2UgIDggOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwRGF0YS0+aUludGVybGFjZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mSW5pdHJvd3Byb2MgPSAobW5nX2ZwdHIpbW5nX2luaXRfZzhfbmk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZJbml0cm93cHJvYyA9IChtbmdfZnB0ciltbmdfaW5pdF9nOF9pOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICBjYXNlIDE2IDogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcERhdGEtPmlJbnRlcmxhY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZkluaXRyb3dwcm9jID0gKG1uZ19mcHRyKW1uZ19pbml0X2cxNl9uaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZkluaXRyb3dwcm9jID0gKG1uZ19mcHRyKW1uZ19pbml0X2cxNl9pOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICB9CisgICAgICBjYXNlIDIgOiB7ICAgICAgICAgICAgICAgICAgICAgICAvKiByZ2IgKi8KKyAgICAgICAgICAgICAgICAgc3dpdGNoIChwRGF0YS0+aUJpdGRlcHRoKQorICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgY2FzZSAgOCA6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBEYXRhLT5pSW50ZXJsYWNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZJbml0cm93cHJvYyA9IChtbmdfZnB0ciltbmdfaW5pdF9yZ2I4X25pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mSW5pdHJvd3Byb2MgPSAobW5nX2ZwdHIpbW5nX2luaXRfcmdiOF9pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgY2FzZSAxNiA6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBEYXRhLT5pSW50ZXJsYWNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZJbml0cm93cHJvYyA9IChtbmdfZnB0ciltbmdfaW5pdF9yZ2IxNl9uaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZkluaXRyb3dwcm9jID0gKG1uZ19mcHRyKW1uZ19pbml0X3JnYjE2X2k7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIH0KKyAgICAgIGNhc2UgMyA6IHsgICAgICAgICAgICAgICAgICAgICAgIC8qIGluZGV4ZWQgKi8KKyAgICAgICAgICAgICAgICAgc3dpdGNoIChwRGF0YS0+aUJpdGRlcHRoKQorICAgICAgICAgICAgICAgICB7CisjaWZuZGVmIE1OR19OT18xXzJfNEJJVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgY2FzZSAgMSA6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBEYXRhLT5pSW50ZXJsYWNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZJbml0cm93cHJvYyA9IChtbmdfZnB0ciltbmdfaW5pdF9pZHgxX25pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mSW5pdHJvd3Byb2MgPSAobW5nX2ZwdHIpbW5nX2luaXRfaWR4MV9pOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICBjYXNlICAyIDogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcERhdGEtPmlJbnRlcmxhY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZkluaXRyb3dwcm9jID0gKG1uZ19mcHRyKW1uZ19pbml0X2lkeDJfbmk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZJbml0cm93cHJvYyA9IChtbmdfZnB0ciltbmdfaW5pdF9pZHgyX2k7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgIGNhc2UgIDQgOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwRGF0YS0+aUludGVybGFjZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mSW5pdHJvd3Byb2MgPSAobW5nX2ZwdHIpbW5nX2luaXRfaWR4NF9uaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZkluaXRyb3dwcm9jID0gKG1uZ19mcHRyKW1uZ19pbml0X2lkeDRfaTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogTU5HX05PXzFfMl80QklUX1NVUFBPUlQgKi8KKyAgICAgICAgICAgICAgICAgICBjYXNlICA4IDogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcERhdGEtPmlJbnRlcmxhY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZkluaXRyb3dwcm9jID0gKG1uZ19mcHRyKW1uZ19pbml0X2lkeDhfbmk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZJbml0cm93cHJvYyA9IChtbmdfZnB0ciltbmdfaW5pdF9pZHg4X2k7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICB9CisgICAgICBjYXNlIDQgOiB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBncmF5K2FscGhhICovCisgICAgICAgICAgICAgICAgIHN3aXRjaCAocERhdGEtPmlCaXRkZXB0aCkKKyAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIGNhc2UgIDggOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwRGF0YS0+aUludGVybGFjZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mSW5pdHJvd3Byb2MgPSAobW5nX2ZwdHIpbW5nX2luaXRfZ2E4X25pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mSW5pdHJvd3Byb2MgPSAobW5nX2ZwdHIpbW5nX2luaXRfZ2E4X2k7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgIGNhc2UgMTYgOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwRGF0YS0+aUludGVybGFjZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mSW5pdHJvd3Byb2MgPSAobW5nX2ZwdHIpbW5nX2luaXRfZ2ExNl9uaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZkluaXRyb3dwcm9jID0gKG1uZ19mcHRyKW1uZ19pbml0X2dhMTZfaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIH0KKyAgICAgIGNhc2UgNiA6IHsgICAgICAgICAgICAgICAgICAgICAgIC8qIHJnYithbHBoYSAqLworICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBEYXRhLT5pQml0ZGVwdGgpCisgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICBjYXNlICA4IDogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcERhdGEtPmlJbnRlcmxhY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZkluaXRyb3dwcm9jID0gKG1uZ19mcHRyKW1uZ19pbml0X3JnYmE4X25pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mSW5pdHJvd3Byb2MgPSAobW5nX2ZwdHIpbW5nX2luaXRfcmdiYThfaTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgY2FzZSAxNiA6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBEYXRhLT5pSW50ZXJsYWNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZJbml0cm93cHJvYyA9IChtbmdfZnB0ciltbmdfaW5pdF9yZ2JhMTZfbmk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZJbml0cm93cHJvYyA9IChtbmdfZnB0ciltbmdfaW5pdF9yZ2JhMTZfaTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBNTkdfT1BUSU1JWkVfRk9PVFBSSU5UX0lOSVQgKi8KKworICAgIHBEYXRhLT5pRmlsdGVyb2ZzID0gMDsgICAgICAgICAgICAgLyogZGV0ZXJtaW5lIGZpbHRlciBjaGFyYWN0ZXJpc3RpY3MgKi8KKyAgICBwRGF0YS0+aUxldmVsMCAgICA9IDA7ICAgICAgICAgICAgIC8qIGRlZmF1bHQgbGV2ZWxzICovCisgICAgcERhdGEtPmlMZXZlbDEgICAgPSAwOyAgICAKKyAgICBwRGF0YS0+aUxldmVsMiAgICA9IDA7CisgICAgcERhdGEtPmlMZXZlbDMgICAgPSAwOworCisjaWZkZWYgRklMVEVSMTkyICAgICAgICAgICAgICAgICAgICAgICAvKiBsZXZlbGluZyAmIGRpZmZlcmluZyA/ICovCisgICAgaWYgKHBEYXRhLT5pRmlsdGVyID09IE1OR19GSUxURVJfRElGRkVSSU5HKQorICAgIHsKKyAgICAgIHN3aXRjaCAocERhdGEtPmlDb2xvcnR5cGUpCisgICAgICB7CisgICAgICAgIGNhc2UgMCA6IHsKKyAgICAgICAgICAgICAgICAgICBpZiAocERhdGEtPmlCaXRkZXB0aCA8PSA4KQorICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlGaWx0ZXJvZnMgPSAxOworICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pRmlsdGVyb2ZzID0gMjsKKworICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICB9CisgICAgICAgIGNhc2UgMiA6IHsKKyAgICAgICAgICAgICAgICAgICBpZiAocERhdGEtPmlCaXRkZXB0aCA8PSA4KQorICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlGaWx0ZXJvZnMgPSAzOworICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pRmlsdGVyb2ZzID0gNjsKKworICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICB9CisgICAgICAgIGNhc2UgMyA6IHsKKyAgICAgICAgICAgICAgICAgICBwRGF0YS0+aUZpbHRlcm9mcyA9IDE7CisgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSA0IDogeworICAgICAgICAgICAgICAgICAgIGlmIChwRGF0YS0+aUJpdGRlcHRoIDw9IDgpCisgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aUZpbHRlcm9mcyA9IDI7CisgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlGaWx0ZXJvZnMgPSA0OworCisgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSA2IDogeworICAgICAgICAgICAgICAgICAgIGlmIChwRGF0YS0+aUJpdGRlcHRoIDw9IDgpCisgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aUZpbHRlcm9mcyA9IDQ7CisgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlGaWx0ZXJvZnMgPSA4OworCisgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisjZW5kaWYKKworI2lmZGVmIEZJTFRFUjE5MyAgICAgICAgICAgICAgICAgICAgICAgLyogbm8gYWRhcHRpdmUgZmlsdGVyaW5nID8gKi8KKyAgICBpZiAocERhdGEtPmlGaWx0ZXIgPT0gTU5HX0ZJTFRFUl9OT0ZJTFRFUikKKyAgICAgIHBEYXRhLT5pUGl4ZWxvZnMgPSBwRGF0YS0+aUZpbHRlcm9mczsKKyAgICBlbHNlCisjZW5kaWYKKyAgICAgIHBEYXRhLT5pUGl4ZWxvZnMgPSBwRGF0YS0+aUZpbHRlcm9mcyArIDE7CisKKyAgICBpZiAocERhdGEtPmZJbml0cm93cHJvYykgICAgICAgICAgIC8qIG5lZWQgdG8gaW5pdGlhbGl6ZSByb3cgcHJvY2Vzc2luZz8gKi8KKyAgICB7CisgICAgICBpUmV0Y29kZSA9ICgobW5nX2luaXRyb3dwcm9jKXBEYXRhLT5mSW5pdHJvd3Byb2MpIChwRGF0YSk7CisgICAgICBpZiAoaVJldGNvZGUpCisgICAgICB7CisgICAgICAgICBNTkdfRlJFRVggKHBEYXRhLCBwQnVmLCBpQnVmc2l6ZSk7CisgICAgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICB9CisgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2FsY3VsYXRlIHJlbWFpbmRlciBvZiBidWZmZXIgKi8KKyAgICBwVGVtcCAgICA9IHBCdWYgKyAobW5nX2ludDMyKShwQU5HLT5pTnVtZnJhbWVzICogaVNpemUpOworICAgIGlUZW1wbGVuID0gaVJlYWxzaXplIC0gKG1uZ19pbnQzMikocEFORy0+aU51bWZyYW1lcyAqIGlTaXplKTsKKworICAgIGRvCisgICAgeworICAgICAgaWYgKGlUZW1wbGVuID4gcERhdGEtPmlSb3dtYXgpICAgLyogZ2V0IGEgcGl4ZWwtcm93IGZyb20gdGhlIHRlbXAgYnVmZmVyICovCisgICAgICB7CisgICAgICAgIE1OR19DT1BZIChwRGF0YS0+cFdvcmtyb3csIHBUZW1wLCBwRGF0YS0+aVJvd21heCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIE1OR19DT1BZIChwRGF0YS0+cFdvcmtyb3csIHBUZW1wLCBpVGVtcGxlbik7CisgICAgICB9CisKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGltYWdlIG5vdCBjb21wbGV0ZWQgeWV0ID8gKi8KKyAgICAgICAgaWYgKHBEYXRhLT5pUm93IDwgKG1uZ19pbnQzMilwRGF0YS0+aURhdGFoZWlnaHQpCisgICAgICAgIHsKKyNpZmRlZiBNTkdfTk9fMV8yXzRCSVRfU1VQUE9SVAorICAgICAgICAgIGlmIChwRGF0YS0+aVBOR2RlcHRoID09IDEpCisgICAgICAgICAgeworICAgICAgICAgICAgLyogSW5mbGF0ZSBXb3Jrcm93IHRvIDgtYml0ICovCisgICAgICAgICAgICBtbmdfaW50MzIgIGlYOworICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjID0gcERhdGEtPnBXb3Jrcm93KzE7CisgICAgICAgICAgICBtbmdfdWludDhwIHBEZXN0ID0gcFNyYyArIHBEYXRhLT5pUm93c2l6ZSAtIChwRGF0YS0+aVJvd3NpemUrNykvODsKKworICAgICAgICAgICAgZm9yIChpWCA9ICgocERhdGEtPmlSb3dzaXplKzcpLzgpIDsgaVggPiAwIDsgaVgtLSkKKyAgICAgICAgICAgICAgKnBEZXN0KysgPSAqcFNyYysrOworCisgICAgICAgICAgICBwRGVzdCA9IHBEYXRhLT5wV29ya3JvdysxOworICAgICAgICAgICAgcFNyYyA9IHBEZXN0ICsgcERhdGEtPmlSb3dzaXplIC0gKHBEYXRhLT5pUm93c2l6ZSs3KS84OworICAgICAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2l6ZTsgOykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgKnBEZXN0KysgPSAoKCgqcFNyYyk+PjcpJjEpOworICAgICAgICAgICAgICBpZiAoaVgtLSA8PSAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAqcERlc3QrKyA9ICgoKCpwU3JjKT4+NikmMSk7CisgICAgICAgICAgICAgIGlmIChpWC0tIDw9IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICpwRGVzdCsrID0gKCgoKnBTcmMpPj41KSYxKTsKKyAgICAgICAgICAgICAgaWYgKGlYLS0gPD0gMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgKnBEZXN0KysgPSAoKCgqcFNyYyk+PjQpJjEpOworICAgICAgICAgICAgICBpZiAoaVgtLSA8PSAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAqcERlc3QrKyA9ICgoKCpwU3JjKT4+MykmMSk7CisgICAgICAgICAgICAgIGlmIChpWC0tIDw9IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICpwRGVzdCsrID0gKCgoKnBTcmMpPj4yKSYxKTsKKyAgICAgICAgICAgICAgaWYgKGlYLS0gPD0gMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgKnBEZXN0KysgPSAoKCgqcFNyYyk+PjEpJjEpOworICAgICAgICAgICAgICBpZiAoaVgtLSA8PSAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAqcERlc3QrKyA9ICgoKCpwU3JjKSAgICkmMSk7CisgICAgICAgICAgICAgIGlmIChpWC0tIDw9IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIHBTcmMrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAocERhdGEtPmlQTkdkZXB0aCA9PSAyKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEluZmxhdGUgV29ya3JvdyB0byA4LWJpdCAqLworICAgICAgICAgICAgbW5nX2ludDMyICBpWDsKKyAgICAgICAgICAgIG1uZ191aW50OHAgcFNyYyA9IHBEYXRhLT5wV29ya3JvdysxOworICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRGVzdCA9IHBTcmMgKyBwRGF0YS0+aVJvd3NpemUgLSAoMipwRGF0YS0+aVJvd3NpemUrNykvODsKKworICAgICAgICAgICAgZm9yIChpWCA9ICgoMipwRGF0YS0+aVJvd3NpemUrNykvOCkgOyBpWCA+IDAgOyBpWC0tKQorICAgICAgICAgICAgICAgKnBEZXN0KysgPSAqcFNyYysrOworCisgICAgICAgICAgICBwRGVzdCA9IHBEYXRhLT5wV29ya3JvdysxOworICAgICAgICAgICAgcFNyYyA9IHBEZXN0ICsgcERhdGEtPmlSb3dzaXplIC0gKDIqcERhdGEtPmlSb3dzaXplKzcpLzg7CisgICAgICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlSb3dzaXplOyA7KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAqcERlc3QrKyA9ICgoKCpwU3JjKT4+NikmMyk7CisgICAgICAgICAgICAgIGlmIChpWC0tIDw9IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICpwRGVzdCsrID0gKCgoKnBTcmMpPj40KSYzKTsKKyAgICAgICAgICAgICAgaWYgKGlYLS0gPD0gMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgKnBEZXN0KysgPSAoKCgqcFNyYyk+PjIpJjMpOworICAgICAgICAgICAgICBpZiAoaVgtLSA8PSAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAqcERlc3QrKyA9ICgoKCpwU3JjKSAgICkmMyk7CisgICAgICAgICAgICAgIGlmIChpWC0tIDw9IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIHBTcmMrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAocERhdGEtPmlQTkdkZXB0aCA9PSA0KQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEluZmxhdGUgV29ya3JvdyB0byA4LWJpdCAqLworICAgICAgICAgICAgbW5nX2ludDMyICBpWDsKKyAgICAgICAgICAgIG1uZ191aW50OHAgcFNyYyA9IHBEYXRhLT5wV29ya3JvdysxOworICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRGVzdCA9IHBTcmMgKyBwRGF0YS0+aVJvd3NpemUgLSAoNCpwRGF0YS0+aVJvd3NpemUrNykvODsKKworICAgICAgICAgICAgZm9yIChpWCA9ICgoNCpwRGF0YS0+aVJvd3NpemUrNykvOCkgOyBpWCA+IDAgOyBpWC0tKQorICAgICAgICAgICAgICAgKnBEZXN0KysgPSAqcFNyYysrOworCisgICAgICAgICAgICBwRGVzdCA9IHBEYXRhLT5wV29ya3JvdysxOworICAgICAgICAgICAgcFNyYyA9IHBEZXN0ICsgcERhdGEtPmlSb3dzaXplIC0gKDQqcERhdGEtPmlSb3dzaXplKzcpLzg7CisgICAgICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlSb3dzaXplOyA7KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAqcERlc3QrKyA9ICgoKCpwU3JjKT4+NCkmMHgwZik7CisgICAgICAgICAgICAgIGlmIChpWC0tIDw9IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICpwRGVzdCsrID0gKCgoKnBTcmMpICAgKSYweDBmKTsKKyAgICAgICAgICAgICAgaWYgKGlYLS0gPD0gMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgcFNyYysrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBpZiAocERhdGEtPmlQTkdkZXB0aCA8IDggJiYgcERhdGEtPmlDb2xvcnR5cGUgPT0gMCkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBFeHBhbmQgc2FtcGxlcyB0byA4LWJpdCBieSBMQlIgKi8KKyAgICAgICAgICAgIG1uZ19pbnQzMiAgaVg7CisgICAgICAgICAgICBtbmdfdWludDhwIHBTcmMgPSBwRGF0YS0+cFdvcmtyb3crMTsKKyAgICAgICAgICAgIG1uZ191aW50OCBtdWx0aXBsaWVyW109ezAsMjU1LDg1LDAsMTcsMCwwLDAsMX07CisKKyAgICAgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NpemU7IGlYID4gMDsgaVgtLSkKKyAgICAgICAgICAgICAgICAqcFNyYysrICo9IG11bHRpcGxpZXJbcERhdGEtPmlQTkdkZXB0aF07CisgICAgICAgICAgfQorI2VuZGlmCisjaWZkZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyAgICAgICAgICBpZiAocERhdGEtPmlQTkdkZXB0aCA+IDgpCisgICAgICAgICAgeworICAgICAgICAgICAgLyogUmVkdWNlIFdvcmtyb3cgdG8gOC1iaXQgKi8KKyAgICAgICAgICAgIG1uZ19pbnQzMiAgaVg7CisgICAgICAgICAgICBtbmdfdWludDhwIHBTcmMgPSBwRGF0YS0+cFdvcmtyb3crMTsKKyAgICAgICAgICAgIG1uZ191aW50OHAgcERlc3QgPSBwU3JjOworCisgICAgICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlSb3dzaXplOyBpWCA+IDA7IGlYLS0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICpwRGVzdCA9ICpwU3JjOworICAgICAgICAgICAgICBwRGVzdCsrOworICAgICAgICAgICAgICBwU3JjKz0yOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyNlbmRpZgorCisjaWZkZWYgRklMVEVSMTkyICAgICAgICAgICAgICAgICAgICAgICAvKiBoYXMgbGV2ZWxpbmcgaW5mbyA/ICovCisgICAgICAgICAgaWYgKHBEYXRhLT5pRmlsdGVyb2ZzID09IE1OR19GSUxURVJfRElGRkVSSU5HKQorICAgICAgICAgICAgaVJldGNvZGUgPSBpbml0X3Jvd2RpZmZlcmluZyAocERhdGEpOworICAgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgaVJldGNvZGUgPSBNTkdfTk9FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbHRlciB0aGUgcm93IGlmIG5lY2Vzc2FyeSAqLworICAgICAgICAgIGlmICgoIWlSZXRjb2RlKSAmJiAocERhdGEtPmlGaWx0ZXJvZnMgPCBwRGF0YS0+aVBpeGVsb2ZzICApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqKHBEYXRhLT5wV29ya3JvdyArIHBEYXRhLT5pRmlsdGVyb2ZzKSkgICAgKQorICAgICAgICAgICAgaVJldGNvZGUgPSBtbmdfZmlsdGVyX2Ffcm93IChwRGF0YSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZGl0aW9uYWwgbGV2ZWxpbmcvZGlmZmVyaW5nID8gKi8KKyAgICAgICAgICBpZiAoKCFpUmV0Y29kZSkgJiYgKHBEYXRhLT5mRGlmZmVycm93KSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBpUmV0Y29kZSA9ICgobW5nX2RpZmZlcnJvdylwRGF0YS0+ZkRpZmZlcnJvdykgKHBEYXRhKTsKKworICAgICAgICAgICAgcFN3YXAgICAgICAgICAgID0gcERhdGEtPnBXb3Jrcm93OworICAgICAgICAgICAgcERhdGEtPnBXb3Jrcm93ID0gcERhdGEtPnBQcmV2cm93OworICAgICAgICAgICAgcERhdGEtPnBQcmV2cm93ID0gcFN3YXA7ICAgLyogbWFrZSBzdXJlIHdlJ3JlIHByb2Nlc3NpbmcgdGhlIHJpZ2h0IGRhdGEgKi8KKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIWlSZXRjb2RlKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByb2Nlc3MgdGhpcyByb3cgKi8KKyAgICAgICAgICAgICAgaWYgKCghaVJldGNvZGUpICYmIChwRGF0YS0+ZlByb2Nlc3Nyb3cpKQorICAgICAgICAgICAgICAgIGlSZXRjb2RlID0gKChtbmdfcHJvY2Vzc3JvdylwRGF0YS0+ZlByb2Nlc3Nyb3cpIChwRGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZSBpbiBvYmplY3QgPyAqLworICAgICAgICAgICAgICBpZiAoKCFpUmV0Y29kZSkgJiYgKHBEYXRhLT5mU3RvcmVyb3cpKQorICAgICAgICAgICAgICAgIGlSZXRjb2RlID0gKChtbmdfc3RvcmVyb3cpcERhdGEtPmZTdG9yZXJvdykgICAgIChwRGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgICAgIHsKKyAgICAgICAgICAgIE1OR19GUkVFWCAocERhdGEsIHBCdWYsIGlCdWZzaXplKTsKKyAgICAgICAgICAgIE1OR19FUlJPUiAocERhdGEsIGlSZXRjb2RlKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIXBEYXRhLT5mRGlmZmVycm93KSAgICAgIC8qIHN3YXAgcm93LXBvaW50ZXJzICovCisgICAgICAgICAgeworICAgICAgICAgICAgcFN3YXAgICAgICAgICAgID0gcERhdGEtPnBXb3Jrcm93OworICAgICAgICAgICAgcERhdGEtPnBXb3Jrcm93ID0gcERhdGEtPnBQcmV2cm93OworICAgICAgICAgICAgcERhdGEtPnBQcmV2cm93ID0gcFN3YXA7ICAgLyogc28gcHJldiBwb2ludHMgdG8gdGhlIHByb2Nlc3NlZCByb3chICovCisgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRqdXN0IHZhcmlhYmxlcyBmb3IgbmV4dCByb3cgKi8KKyAgICAgICAgICBpUmV0Y29kZSA9IG1uZ19uZXh0X3JvdyAocERhdGEpOworCisgICAgICAgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgICAgIHsKKyAgICAgICAgICAgIE1OR19GUkVFWCAocERhdGEsIHBCdWYsIGlCdWZzaXplKTsKKyAgICAgICAgICAgIE1OR19FUlJPUiAocERhdGEsIGlSZXRjb2RlKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcFRlbXAgICAgKz0gcERhdGEtPmlSb3dtYXg7CisgICAgICBpVGVtcGxlbiAtPSBwRGF0YS0+aVJvd21heDsKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVudGlsIHNvbWUgZXJyb3Igb3IgRU9JCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBhbGwgcGl4ZWxzIHJlY2VpdmVkICovCisgICAgd2hpbGUgKCAoaVRlbXBsZW4gPiAwKSAgJiYKKyAgICAgICAgICAgICggKHBEYXRhLT5pUm93IDwgKG1uZ19pbnQzMilwRGF0YS0+aURhdGFoZWlnaHQpIHx8CisgICAgICAgICAgICAgICggKHBEYXRhLT5pUGFzcyA+PSAwKSAmJiAocERhdGEtPmlQYXNzIDwgNykgKSAgICApICAgICk7CisKKyAgICBtbmdfY2xlYW51cF9yb3dwcm9jIChwRGF0YSk7ICAgICAgIC8qIGNsZWFudXAgcm93IHByb2Nlc3NpbmcgYnVmZmVycyAhISAqLworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZXN0b3JlIHNhdmVkIHdvcmstcGFybXMgKi8KKyAgICBwRGF0YS0+aURhdGF3aWR0aCAgID0gaVNhdmVkYXRhd2lkdGg7CisgICAgcERhdGEtPmlEYXRhaGVpZ2h0ICA9IGlTYXZlZGF0YWhlaWdodDsKKworICAgIHBEYXRhLT5mSW5pdHJvd3Byb2MgPSBmU2F2ZWluaXRyb3dwcm9jOworICAgIHBEYXRhLT5mRGlzcGxheXJvdyAgPSBmU2F2ZXN0b3Jlcm93OworICAgIHBEYXRhLT5mUHJvY2Vzc3JvdyAgPSBmU2F2ZXByb2Nlc3Nyb3c7CisgICAgcERhdGEtPmZEaWZmZXJyb3cgICA9IGZTYXZlZGlmZmVycm93OworICAgIHBEYXRhLT5wU3RvcmVvYmogICAgPSBmU2F2ZXN0b3Jlb2JqOworICAgIHBEYXRhLT5wU3RvcmVidWYgICAgPSBmU2F2ZXN0b3JlYnVmOworCisjaWZkZWYgTU5HX09QVElNSVpFX0ZPT1RQUklOVF9JTklUCisgICAgcERhdGEtPmVQbmdfaW1ndHlwZSA9IGVTYXZlcG5naW1ndHlwZTsKKyNlbmRpZgorCisgICAgcERhdGEtPmlJbnRlcmxhY2UgICA9IGlTYXZlaW50ZXJsYWNlOworICAgIHBEYXRhLT5pUGFzcyAgICAgICAgPSBpU2F2ZXBhc3M7CisgICAgcERhdGEtPmlSb3cgICAgICAgICA9IGlTYXZlcm93OworICAgIHBEYXRhLT5pUm93aW5jICAgICAgPSBpU2F2ZXJvd2luYzsKKyAgICBwRGF0YS0+aUNvbCAgICAgICAgID0gaVNhdmVjb2w7CisgICAgcERhdGEtPmlDb2xpbmMgICAgICA9IGlTYXZlY29saW5jOworICAgIHBEYXRhLT5pUm93c2FtcGxlcyAgPSBpU2F2ZXJvd3NhbXBsZXM7CisgICAgcERhdGEtPmlTYW1wbGVtdWwgICA9IGlTYXZlc2FtcGxlbXVsOworICAgIHBEYXRhLT5pU2FtcGxlb2ZzICAgPSBpU2F2ZXNhbXBsZW9mczsKKyAgICBwRGF0YS0+aVNhbXBsZWRpdiAgID0gaVNhdmVzYW1wbGVkaXY7CisgICAgcERhdGEtPmlSb3dzaXplICAgICA9IGlTYXZlcm93c2l6ZTsKKyAgICBwRGF0YS0+aVJvd21heCAgICAgID0gaVNhdmVyb3dtYXg7CisgICAgcERhdGEtPmlGaWx0ZXJvZnMgICA9IGlTYXZlZmlsdGVyb2ZzOworICAgIHBEYXRhLT5pUGl4ZWxvZnMgICAgPSBpU2F2ZXBpeGVsb2ZzOworICAgIHBEYXRhLT5pTGV2ZWwwICAgICAgPSBpU2F2ZWxldmVsMDsKKyAgICBwRGF0YS0+aUxldmVsMSAgICAgID0gaVNhdmVsZXZlbDE7CisgICAgcERhdGEtPmlMZXZlbDIgICAgICA9IGlTYXZlbGV2ZWwyOworICAgIHBEYXRhLT5pTGV2ZWwzICAgICAgPSBpU2F2ZWxldmVsMzsKKyAgICBwRGF0YS0+cFdvcmtyb3cgICAgID0gcFNhdmV3b3Jrcm93OworICAgIHBEYXRhLT5wUHJldnJvdyAgICAgPSBwU2F2ZXByZXZyb3c7CisgICAgcERhdGEtPnBSR0JBcm93ICAgICA9IHBTYXZlckdCQXJvdzsKKyAgICBwRGF0YS0+YklzUkdCQTE2ICAgID0gYlNhdmVpc1JHQkExNjsKKyAgICBwRGF0YS0+YklzT3BhcXVlICAgID0gYlNhdmVpc09wYXF1ZTsKKyAgICBwRGF0YS0+aUZpbHRlcmJwcCAgID0gaVNhdmVmaWx0ZXJicHA7CisgICAgcERhdGEtPmlEZXN0bCAgICAgICA9IGlTYXZlZGVzdGw7CisgICAgcERhdGEtPmlEZXN0dCAgICAgICA9IGlTYXZlZGVzdHQ7CisgICAgcERhdGEtPmlEZXN0ciAgICAgICA9IGlTYXZlZGVzdHI7CisgICAgcERhdGEtPmlEZXN0YiAgICAgICA9IGlTYXZlZGVzdGI7CisgICAgcERhdGEtPmlTb3VyY2VsICAgICA9IGlTYXZlc291cmNlbDsKKyAgICBwRGF0YS0+aVNvdXJjZXQgICAgID0gaVNhdmVzb3VyY2V0OworICAgIHBEYXRhLT5pU291cmNlciAgICAgPSBpU2F2ZXNvdXJjZXI7CisgICAgcERhdGEtPmlTb3VyY2ViICAgICA9IGlTYXZlc291cmNlYjsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIHRoZSBhbmltYXRpb24gZGlyZWN0aXZlcyAhICovCisgICAgcFByb2Nlc3MgPSAobW5nX3Byb2Nlc3NvYmplY3QpcEFORy0+c0hlYWRlci5mUHJvY2VzczsKKyAgICBpUmV0Y29kZSA9IHBQcm9jZXNzIChwRGF0YSwgKG1uZ19vYmplY3RwKXBEYXRhLT5wQU5HKTsKKyAgICBpZiAoaVJldGNvZGUpCisgICAgICByZXR1cm4gaVJldGNvZGU7CisKKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisKKyAgICBNTkdfRlJFRSAocERhdGEsIHBCdWYsIGlCdWZzaXplKTsgIC8qIGFsd2F5cyBmcmVlIHRoZSB0ZW1wIGJ1ZmZlciAhICovCisgIH0KKworICAqcGlSYXdsZW4gPSAwOworCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX0lOQ0xVREVfQU5HX1BST1BPU0FMCitNTkdfQ19TUEVDSUFMRlVOQyAobW5nX3NwZWNpYWxfYWRhdCkKK3sKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK01OR19DX1NQRUNJQUxGVU5DIChtbmdfc3BlY2lhbF91bmtub3duKQoreworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3JpdGljYWwgY2h1bmsgPyAqLworICBpZiAoKCgobW5nX3VpbnQzMilwRGF0YS0+aUNodW5rbmFtZSAmIDB4MjAwMDAwMDApID09IDApCisjaWZkZWYgTU5HX1NLSVBDSFVOS19TQVZFCisgICAgJiYgKHBEYXRhLT5pQ2h1bmtuYW1lICE9IE1OR19VSU5UX1NBVkUpCisjZW5kaWYKKyNpZmRlZiBNTkdfU0tJUENIVU5LX1NFRUsKKyAgICAmJiAocERhdGEtPmlDaHVua25hbWUgIT0gTU5HX1VJTlRfU0VFSykKKyNlbmRpZgorI2lmZGVmIE1OR19TS0lQQ0hVTktfREJZSworICAgICYmIChwRGF0YS0+aUNodW5rbmFtZSAhPSBNTkdfVUlOVF9EQllLKQorI2VuZGlmCisjaWZkZWYgTU5HX1NLSVBDSFVOS19PUkRSCisgICAgJiYgKHBEYXRhLT5pQ2h1bmtuYW1lICE9IE1OR19VSU5UX09SRFIpCisjZW5kaWYKKyAgICAgICkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfVU5LTk9XTkNSSVRJQ0FMKTsKKworICBpZiAocERhdGEtPmZQcm9jZXNzdW5rbm93bikgICAgICAgICAgLyogbGV0IHRoZSBhcHAgaGFuZGxlIGl0ID8gKi8KKyAgeworICAgIG1uZ19ib29sIGJPa2UgPSBwRGF0YS0+ZlByb2Nlc3N1bmtub3duICgobW5nX2hhbmRsZSlwRGF0YSwgcERhdGEtPmlDaHVua25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobW5nX3Vua25vd25fY2h1bmtwKXBDaHVuayktPmlEYXRhc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChtbmdfdW5rbm93bl9jaHVua3ApcENodW5rKS0+cERhdGEpOworICAgIGlmICghYk9rZSkKKyAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19BUFBNSVNDRVJST1IpOworICB9CisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOyAgICAgICAgICAgICAgICAgIC8qIGRvbmUgKi8KK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2VuZGlmIC8qIE1OR19JTkNMVURFX1JFQURfUFJPQ1MgfHwgTU5HX0lOQ0xVREVfV1JJVEVfUFJPQ1MgKi8KKyNlbmRpZiAvKiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogZW5kIG9mIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisKKworCisKZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9MaWJNTkcvbGlibW5nX2NodW5rX2Rlc2NyLmggYi9maWxlcy9Tb3VyY2UvTGliTU5HL2xpYm1uZ19jaHVua19kZXNjci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ODFhYjAKLS0tIC9kZXYvbnVsbAorKysgYi9maWxlcy9Tb3VyY2UvTGliTU5HL2xpYm1uZ19jaHVua19kZXNjci5oCkBAIC0wLDAgKzEsMTQ2IEBACisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gbGlibW5nLmggICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogcHJvamVjdCAgIDogbGlibW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGZpbGUgICAgICA6IGxpYm1uZ19jaHVua19kZXNjci5oICAgICAgY29weXJpZ2h0IChjKSAyMDA3IEcuSnV5biAgICAgICAgKiAqLworLyogKiB2ZXJzaW9uICAgOiAxLjAuMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIHB1cnBvc2UgICA6IENodW5rIGRlc2NyaXB0b3IgZnVuY3Rpb25zIChpbXBsZW1lbnRhdGlvbikgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogYXV0aG9yICAgIDogRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBjb21tZW50ICAgOiBkZWZpbml0aW9uIG9mIHRoZSBjaHVuay0gYW5mIGZpZWxkLWRlc2NyaXB0b3Igcm91dGluZXMgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGNoYW5nZXMgICA6IDEuMC45IC0gMTIvMDYvMjAwNCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGNvbmRpdGlvbmFsIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUiAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC4xMCAtIDA0LzA4LzIwMDcgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHN1cHBvcnQgZm9yIG1QTkcgcHJvcG9zYWwgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjEwIC0gMDQvMTIvMjAwNyAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgc3VwcG9ydCBmb3IgQU5HIHByb3Bvc2FsICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZiBkZWZpbmVkKF9fQk9STEFORENfXykgJiYgZGVmaW5lZChNTkdfU1RSSUNUX0FOU0kpCisjcHJhZ21hIG9wdGlvbiAtQSAgICAgICAgICAgICAgICAgICAgICAvKiBmb3JjZSBBTlNJLUMgKi8KKyNlbmRpZgorCisjaWZuZGVmIF9saWJtbmdfY2h1bmtfZGVzY3JfaF8KKyNkZWZpbmUgX2xpYm1uZ19jaHVua19kZXNjcl9oXworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisjaWYgZGVmaW5lZChNTkdfSU5DTFVERV9SRUFEX1BST0NTKSB8fCBkZWZpbmVkKE1OR19JTkNMVURFX1dSSVRFX1BST0NTKQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCit2b2lkIG1uZ19nZXRfY2h1bmtoZWFkZXIgKG1uZ19jaHVua2lkICAgICAgIGlDaHVua25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19jaHVua19oZWFkZXJwIHBSZXN1bHQpOworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjZGVmaW5lIE1OR19GX1NQRUNJQUxGVU5DKG4pIG1uZ19yZXRjb2RlIG4gKG1uZ19kYXRhcCAgIHBEYXRhLCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19jaHVua3AgIHBDaHVuaywgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIqIHBpUmF3bGVuLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAqIHBwUmF3ZGF0YSkKKworTU5HX0ZfU1BFQ0lBTEZVTkMgKG1uZ19kZWJ1bmtfcGx0ZSkgOworTU5HX0ZfU1BFQ0lBTEZVTkMgKG1uZ19kZWJ1bmtfdHJucykgOworTU5HX0ZfU1BFQ0lBTEZVTkMgKG1uZ19kZWZsYXRlX2l0eHQpIDsKK01OR19GX1NQRUNJQUxGVU5DIChtbmdfc3BsdF9lbnRyaWVzKSA7CitNTkdfRl9TUEVDSUFMRlVOQyAobW5nX2hpc3RfZW50cmllcykgOworCitNTkdfRl9TUEVDSUFMRlVOQyAobW5nX2RlYnVua19sb29wKSA7CitNTkdfRl9TUEVDSUFMRlVOQyAobW5nX2RlYnVua19wYXN0KSA7CitNTkdfRl9TUEVDSUFMRlVOQyAobW5nX2Rpc2NfZW50cmllcykgOworTU5HX0ZfU1BFQ0lBTEZVTkMgKG1uZ19mcmFtX3JlbWFpbmRlcikgOworTU5HX0ZfU1BFQ0lBTEZVTkMgKG1uZ19zYXZlX2VudHJpZXMpIDsKK01OR19GX1NQRUNJQUxGVU5DIChtbmdfcHBsdF9lbnRyaWVzKSA7CitNTkdfRl9TUEVDSUFMRlVOQyAobW5nX2Ryb3BfZW50cmllcykgOworTU5HX0ZfU1BFQ0lBTEZVTkMgKG1uZ19vcmRyX2VudHJpZXMpIDsKK01OR19GX1NQRUNJQUxGVU5DIChtbmdfZGVidW5rX21hZ24pIDsKK01OR19GX1NQRUNJQUxGVU5DIChtbmdfZXZudF9lbnRyaWVzKSA7CitNTkdfRl9TUEVDSUFMRlVOQyAobW5nX2FkYXRfdGlsZXMpIDsKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2RlZmluZSBNTkdfQ19TUEVDSUFMRlVOQyhuKSBtbmdfcmV0Y29kZSBuIChtbmdfZGF0YXAgIHBEYXRhLCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2NodW5rcCBwQ2h1bmspCisKK01OR19DX1NQRUNJQUxGVU5DIChtbmdfc3BlY2lhbF9paGRyKSA7CitNTkdfQ19TUEVDSUFMRlVOQyAobW5nX3NwZWNpYWxfcGx0ZSkgOworTU5HX0NfU1BFQ0lBTEZVTkMgKG1uZ19zcGVjaWFsX2lkYXQpIDsKK01OR19DX1NQRUNJQUxGVU5DIChtbmdfc3BlY2lhbF9pZW5kKSA7CitNTkdfQ19TUEVDSUFMRlVOQyAobW5nX3NwZWNpYWxfdHJucykgOworTU5HX0NfU1BFQ0lBTEZVTkMgKG1uZ19zcGVjaWFsX2dhbWEpIDsKK01OR19DX1NQRUNJQUxGVU5DIChtbmdfc3BlY2lhbF9jaHJtKSA7CitNTkdfQ19TUEVDSUFMRlVOQyAobW5nX3NwZWNpYWxfc3JnYikgOworTU5HX0NfU1BFQ0lBTEZVTkMgKG1uZ19zcGVjaWFsX2ljY3ApIDsKK01OR19DX1NQRUNJQUxGVU5DIChtbmdfc3BlY2lhbF90ZXh0KSA7CitNTkdfQ19TUEVDSUFMRlVOQyAobW5nX3NwZWNpYWxfenR4dCkgOworTU5HX0NfU1BFQ0lBTEZVTkMgKG1uZ19zcGVjaWFsX2l0eHQpIDsKK01OR19DX1NQRUNJQUxGVU5DIChtbmdfc3BlY2lhbF9ia2dkKSA7CitNTkdfQ19TUEVDSUFMRlVOQyAobW5nX3NwZWNpYWxfcGh5cykgOworTU5HX0NfU1BFQ0lBTEZVTkMgKG1uZ19zcGVjaWFsX3NiaXQpIDsKK01OR19DX1NQRUNJQUxGVU5DIChtbmdfc3BlY2lhbF9zcGx0KSA7CitNTkdfQ19TUEVDSUFMRlVOQyAobW5nX3NwZWNpYWxfaGlzdCkgOworTU5HX0NfU1BFQ0lBTEZVTkMgKG1uZ19zcGVjaWFsX3RpbWUpIDsKKworTU5HX0NfU1BFQ0lBTEZVTkMgKG1uZ19zcGVjaWFsX2poZHIpIDsKK01OR19DX1NQRUNJQUxGVU5DIChtbmdfc3BlY2lhbF9qZGFhKSA7CitNTkdfQ19TUEVDSUFMRlVOQyAobW5nX3NwZWNpYWxfamRhdCkgOworTU5HX0NfU1BFQ0lBTEZVTkMgKG1uZ19zcGVjaWFsX2pzZXApIDsKKworTU5HX0NfU1BFQ0lBTEZVTkMgKG1uZ19zcGVjaWFsX21oZHIpIDsKK01OR19DX1NQRUNJQUxGVU5DIChtbmdfc3BlY2lhbF9tZW5kKSA7CitNTkdfQ19TUEVDSUFMRlVOQyAobW5nX3NwZWNpYWxfbG9vcCkgOworTU5HX0NfU1BFQ0lBTEZVTkMgKG1uZ19zcGVjaWFsX2VuZGwpIDsKK01OR19DX1NQRUNJQUxGVU5DIChtbmdfc3BlY2lhbF9kZWZpKSA7CitNTkdfQ19TUEVDSUFMRlVOQyAobW5nX3NwZWNpYWxfYmFzaSkgOworTU5HX0NfU1BFQ0lBTEZVTkMgKG1uZ19zcGVjaWFsX2Nsb24pIDsKK01OR19DX1NQRUNJQUxGVU5DIChtbmdfc3BlY2lhbF9wYXN0KSA7CitNTkdfQ19TUEVDSUFMRlVOQyAobW5nX3NwZWNpYWxfZGlzYykgOworTU5HX0NfU1BFQ0lBTEZVTkMgKG1uZ19zcGVjaWFsX2JhY2spIDsKK01OR19DX1NQRUNJQUxGVU5DIChtbmdfc3BlY2lhbF9mcmFtKSA7CitNTkdfQ19TUEVDSUFMRlVOQyAobW5nX3NwZWNpYWxfbW92ZSkgOworTU5HX0NfU1BFQ0lBTEZVTkMgKG1uZ19zcGVjaWFsX2NsaXApIDsKK01OR19DX1NQRUNJQUxGVU5DIChtbmdfc3BlY2lhbF9zaG93KSA7CitNTkdfQ19TUEVDSUFMRlVOQyAobW5nX3NwZWNpYWxfdGVybSkgOworTU5HX0NfU1BFQ0lBTEZVTkMgKG1uZ19zcGVjaWFsX3NhdmUpIDsKK01OR19DX1NQRUNJQUxGVU5DIChtbmdfc3BlY2lhbF9zZWVrKSA7CitNTkdfQ19TUEVDSUFMRlVOQyAobW5nX3NwZWNpYWxfZXhwaSkgOworTU5HX0NfU1BFQ0lBTEZVTkMgKG1uZ19zcGVjaWFsX2ZwcmkpIDsKK01OR19DX1NQRUNJQUxGVU5DIChtbmdfc3BlY2lhbF9uZWVkKSA7CitNTkdfQ19TUEVDSUFMRlVOQyAobW5nX3NwZWNpYWxfcGh5ZykgOworCitNTkdfQ19TUEVDSUFMRlVOQyAobW5nX3NwZWNpYWxfZGhkcikgOworTU5HX0NfU1BFQ0lBTEZVTkMgKG1uZ19zcGVjaWFsX3Byb20pIDsKK01OR19DX1NQRUNJQUxGVU5DIChtbmdfc3BlY2lhbF9pcG5nKSA7CitNTkdfQ19TUEVDSUFMRlVOQyAobW5nX3NwZWNpYWxfcHBsdCkgOworTU5HX0NfU1BFQ0lBTEZVTkMgKG1uZ19zcGVjaWFsX2lqbmcpIDsKK01OR19DX1NQRUNJQUxGVU5DIChtbmdfc3BlY2lhbF9kcm9wKSA7CitNTkdfQ19TUEVDSUFMRlVOQyAobW5nX3NwZWNpYWxfZGJ5aykgOworTU5HX0NfU1BFQ0lBTEZVTkMgKG1uZ19zcGVjaWFsX29yZHIpIDsKKworTU5HX0NfU1BFQ0lBTEZVTkMgKG1uZ19zcGVjaWFsX21hZ24pIDsKK01OR19DX1NQRUNJQUxGVU5DIChtbmdfc3BlY2lhbF9ldm50KSA7CitNTkdfQ19TUEVDSUFMRlVOQyAobW5nX3NwZWNpYWxfbXBuZykgOworTU5HX0NfU1BFQ0lBTEZVTkMgKG1uZ19zcGVjaWFsX2FoZHIpIDsKK01OR19DX1NQRUNJQUxGVU5DIChtbmdfc3BlY2lhbF9hZGF0KSA7CitNTkdfQ19TUEVDSUFMRlVOQyAobW5nX3NwZWNpYWxfdW5rbm93bikgOworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjZW5kaWYgLyogTU5HX0lOQ0xVREVfUkVBRF9QUk9DUykgfHwgTU5HX0lOQ0xVREVfV1JJVEVfUFJPQ1MgKi8KKyNlbmRpZiAvKiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2VuZGlmIC8qIF9saWJtbmdfY2h1bmtfZGVzY3JfaF8gKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogZW5kIG9mIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwpkaWZmIC0tZ2l0IGEvZmlsZXMvU291cmNlL0xpYk1ORy9saWJtbmdfY2h1bmtfaW8uYyBiL2ZpbGVzL1NvdXJjZS9MaWJNTkcvbGlibW5nX2NodW5rX2lvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIxODA5OQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9MaWJNTkcvbGlibW5nX2NodW5rX2lvLmMKQEAgLTAsMCArMSwxMDc0MCBAQAorLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIGxpYm1uZy5oICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIHByb2plY3QgICA6IGxpYm1uZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBmaWxlICAgICAgOiBsaWJtbmdfY2h1bmtfaW8uYyAgICAgICAgIGNvcHlyaWdodCAoYykgMjAwMC0yMDA3IEcuSnV5biAgICogKi8KKy8qICogdmVyc2lvbiAgIDogMS4wLjEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBwdXJwb3NlICAgOiBDaHVuayBJL08gcm91dGluZXMgKGltcGxlbWVudGF0aW9uKSAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGF1dGhvciAgICA6IEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogY29tbWVudCAgIDogaW1wbGVtZW50YXRpb24gb2YgY2h1bmsgaW5wdXQvb3V0cHV0IHJvdXRpbmVzICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBjaGFuZ2VzICAgOiAwLjUuMSAtIDA1LzAxLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjbGVhbmVkIHVwIGxlZnQtb3ZlciB0ZXN0c3R1ZmYgaW4gdGhlIEJBQ0sgY2h1bmsgcm91dGluZSAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4xIC0gMDUvMDQvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNoYW5nZWQgQ1JDIGluaXRpYWxpemF0aW9uIHRvIHVzZSBkeW5hbWljIHN0cnVjdHVyZSAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAod2Fzbid0IHRocmVhZC1zYWZlIHRoZSBvbGQgd2F5ICEpICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4xIC0gMDUvMDYvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpbGxlZCBpbiBtYW55IG1pc3Npbmcgc2VxdWVuY2UmbGVuZ3RoIGNoZWNrcyAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaWxsZWQgaW4gbWFueSBtaXNzaW5nIGNodW5rLXN0b3JlIHNuaXBwZXRzICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4xIC0gMDUvMDgvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGNoZWNrcyBmb3IgcnVubmluZyBhbmltYXRpb25zICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaWxsZWQgc29tZSB3cml0ZSByb3V0aW5lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2hhbmdlZCBzdHJpY3QtQU5TSSBzdHVmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMSAtIDA1LzEwLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaWxsZWQgc29tZSBtb3JlIHdyaXRlIHJvdXRpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4xIC0gMDUvMTEvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpbGxlZCByZW1haW5pbmcgd3JpdGUgcm91dGluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaXhlZCByZWFkX3BwbHQgd2l0aCByZWdhcmQgdG8gZGVsdGF0eXBlICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgY2FsbGJhY2sgZXJyb3ItcmVwb3J0aW5nIHN1cHBvcnQgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHByZS1kcmFmdDQ4IHN1cHBvcnQgKHNob3J0IE1IRFIsIGZyYW1lX21vZGUsIExPT1ApICogKi8KKy8qICogICAgICAgICAgICAgMC41LjEgLSAwNS8xMi8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2hhbmdlZCB0cmFjZSB0byBtYWNybyBmb3IgY2FsbGJhY2sgZXJyb3ItcmVwb3J0aW5nICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIGNodW5rLXN0b3JhZ2UgYml0IGluIHNldmVyYWwgcm91dGluZXMgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjEgLSAwNS8xMy8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgZU1OR21hIGhhY2sgKHdpbGwgYmUgcmVtb3ZlZCBpbiAxLjAuMCAhISEpICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIFRFUk0gYW5pbWF0aW9uIG9iamVjdCBwb2ludGVyIChlYXNpZXIgcmVmZXJlbmNlKSAgICogKi8KKy8qICogICAgICAgICAgICAgLSBzdXBwbGVtZW50ZWQgdGhlIFNBVkUgJiBTRUVLIGRpc3BsYXkgcHJvY2Vzc2luZyAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMiAtIDA1LzE4LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBCMDA0IC0gZml4ZWQgcHJvYmxlbSB3aXRoIE1OR19TVVBQT1JUX1dSSVRFIG5vdCBkZWZpbmVkICAqICovCisvKiAqICAgICAgICAgICAgICAgYWxzbyBmb3IgTU5HX1NVUFBPUlRfV1JJVEUgd2l0aG91dCBNTkdfSU5DTFVERV9KTkcgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMiAtIDA1LzE5LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjbGVhbmVkIHVwIHNvbWUgY29kZSByZWdhcmRpbmcgbWl4ZWQgc3VwcG9ydCAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4yIC0gMDUvMjAvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGltcGxlbWVudGVkIEpORyBzdXBwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjIgLSAwNS8yNC8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgc3VwcG9ydCBmb3IgZ2xvYmFsIGNvbG9yLWNodW5rcyBpbiBhbmltYXRpb24gICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHN1cHBvcnQgZm9yIGdsb2JhbCBQTFRFLHRSTlMsYktHRCBpbiBhbmltYXRpb24gICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBzdXBwb3J0IGZvciBTQVZFICYgU0VFSyBpbiBhbmltYXRpb24gICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4yIC0gMDUvMjkvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNoYW5nZWQgYW5pX2NyZWF0ZSBjYWxscyBub3QgcmV0dXJuaW5nIG9iamVjdCBwb2ludGVyICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjcmVhdGUgYW5pIG9iamVjdHMgYWx3YXlzIChub3QganVzdCBpbnNpZGUgVEVSTS9MT09QKSAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4yIC0gMDUvMzAvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHN1cHBvcnQgZm9yIGRlbHRhLWltYWdlIHByb2Nlc3NpbmcgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjIgLSAwNS8zMS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgdXAgcHVuY3R1YXRpb24gKGNvbnRyaWJ1dGVkIGJ5IFRpbSBSb3dsZXkpICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMiAtIDA2LzAyLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjaGFuZ2VkIFNXQVBfRU5ESUFOIHRvIEJJR0VORElBTl9TVVBQT1JURUQgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4yIC0gMDYvMDMvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIG1ha2V1cCBmb3IgTGludXggZ2NjIGNvbXBpbGUgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4zIC0gMDYvMTIvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHByb2Nlc3Npbmcgb2YgY29sb3ItaW5mbyBvbiBkZWx0YS1pbWFnZSAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjMgLSAwNi8xMy8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgaGFuZGxpbmcgb2YgZW1wdHkgU0FWRSBjaHVuayAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMyAtIDA2LzE3LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjaGFuZ2VkIHRvIHN1cHBvcnQgZGVsdGEtaW1hZ2VzICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgZXh0cmEgY2hlY2tzIGZvciBkZWx0YS1pbWFnZXMgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMyAtIDA2LzIwLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaXhlZCBwb3NzaWJsZSB0cm91YmxlIGlmIElFTkQgZGlzcGxheS1wcm9jZXNzIGdvdCAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgYnJva2VuIHVwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMyAtIDA2LzIxLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBwcm9jZXNzaW5nIG9mIFBMVEUgJiB0Uk5TIGZvciBkZWx0YS1pbWFnZXMgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgYWRtaW5pc3RyYXRpb24gb2YgaW1hZ2VsZXZlbCBwYXJhbWV0ZXIgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMyAtIDA2LzIyLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBpbXBsZW1lbnRlZCBzdXBwb3J0IGZvciBQUExUIGNodW5rICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4zIC0gMDYvMjYvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHByZWNhdXRpb24gYWdhaW5zdCBmYXVsdHkgaUNDUCBjaHVua3MgZnJvbSBQUyAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjMgLSAwNi8yOS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgc29tZSA2NC1iaXQgd2FybmluZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjEgLSAwNy8xNC8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2hhbmdlZCBwcmUtZHJhZnQ0OCBmcmFtZV9tb2RlPTMgdG8gZnJhbWVfbW9kZT0xICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMSAtIDA3LzE2LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaXhlZCBzdG9yYWdlIG9mIGltYWdlcyBkdXJpbmcgbW5nX3JlYWQoKSAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgc3VwcG9ydCBmb3IgbW5nX2Rpc3BsYXkoKSBhZnRlciBtbmdfcmVhZCgpICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMSAtIDA3LzE5LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaXhlZCBzZXZlcmFsIGNodW5rLXdyaXRpbmcgcm91dGluZXMgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4xIC0gMDcvMjQvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIHJlYWRpbmcgb2Ygc3RpbGwtaW1hZ2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4yIC0gMDgvMDUvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNoYW5nZWQgZmlsZS1wcmVmaXhlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4zIC0gMDgvMDcvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIEIxMTEzMDAgLSBmaXh1cCBmb3IgaW1wcm92ZWQgcG9ydGFiaWxpdHkgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjMgLSAwOC8wOC8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgY29tcGlsZXItd2FybmluZ3MgZnJvbSBNb3ppbGxhICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMyAtIDA4LzA5LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBjaGVjayBmb3Igc2ltcGxpY2l0eS1iaXRzIGluIE1IRFIgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4zIC0gMDgvMTIvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIGNoZWNrIGZvciBzaW1wbGljaXR5LWJpdHMgaW4gTUhEUiAoSk5HKSAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjMgLSAwOC8xMi8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgd29ya2Fyb3VuZCBmb3IgZmF1bHR5IFBob3RvU2hvcCBpQ0NQIGNodW5rICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMyAtIDA4LzIyLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaXhlZCB3cml0ZS1jb2RlIGZvciB6VFh0ICYgaVRYdCAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgcmVhZC1jb2RlIGZvciBpVFh0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMyAtIDA4LzI2LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBNQUdOIGNodW5rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4zIC0gMDkvMDcvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHN1cHBvcnQgZm9yIG5ldyBmaWx0ZXJfdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjMgLSAwOS8xMC8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgREVGSSBiZWhhdmlvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMyAtIDEwLzAyLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaXhlZCBzaW1wbGljaXR5LWNoZWNrIGluIGNvbXBsaWFuY2Ugd2l0aCBkcmFmdCA4MS8wLjk4YSAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4zIC0gMTAvMTAvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHN1cHBvcnQgZm9yIGFscGhhLWRlcHRoIHByZWRpY3Rpb24gICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjMgLSAxMC8xMS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgc3VwcG9ydCBmb3IgbkVFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMyAtIDEwLzE2LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBzdXBwb3J0IGZvciBKREFBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4zIC0gMTAvMTcvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIHN1cHBvcnQgZm9yIE1BR04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBpbXBsZW1lbnRlZCBuRUVEICJ4eHh4IiAod2hlcmUgInh4eHgiIGlzIGEgY2h1bmtpZCkgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgY2FsbGJhY2sgdG8gcHJvY2VzcyBub24tY3JpdGljYWwgdW5rbm93biBjaHVua3MgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIHN1cHBvcnQgZm9yIGJLR0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjMgLSAxMC8yMy8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgYnVnIGluIGVtcHR5IFBMVEUgaGFuZGxpbmcgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjQgLSAxMS8yMC8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2hhbmdlZCBJSERSIGZpbHRlcl9tZXRob2QgY2hlY2sgZm9yIFBOR3MgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuNCAtICAxLzE4LzIwMDEgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBlcnJvcmNoZWNraW5nIGZvciBNQUdOIG1ldGhvZHMgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gcmVtb3ZlZCB0ZXN0IGZpbHRlci1tZXRob2RzIDEgJiA2NSAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjUgLSAgMS8yNS8yMDAxIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgc29tZSBzbWFsbCBjb21waWxlciB3YXJuaW5ncyAodGhhbmtzIE5pa2tpKSAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjIgLSAwNS8wNS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gQjQyMTQyNyAtIHdyaXRlcyB3cm9uZyBmb3JtYXQgaW4gYktHRCBhbmQgdFJOUyAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuMiAtIDA2LzIwLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBCNDM0NTgzIC0gY29tcGlsZXItd2FybmluZyBpZiBNTkdfU1RPUkVfQ0hVTktTIHVuZGVmaW5lZCAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDA3LzA4LzIwMDIgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBCNTc4NTcyIC0gcmVtb3ZlZCBlTU5HbWEgaGFjayAodGhhbmtzIERpbWl0cmkhKSAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC41IC0gMDgvMDcvMjAwMiAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHRlc3Qtb3B0aW9uIGZvciBQTkcgZmlsdGVyIG1ldGhvZCAxOTMgKD1ubyBmaWx0ZXIpICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAwOC8xNS8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY29tcGxldGVkIFBST00gc3VwcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDA4LzE5LzIwMDIgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBCNTk3MTM0IC0gbGlibW5nIHBvbGx1dGVzIHRoZSBsaW5rZXIgbmFtZXNwYWNlICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC41IC0gMDkvMDcvMjAwMiAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIHJlYWRpbmcgb2YgRlJBTSB3aXRoIGp1c3QgZnJhbWVfbW9kZSBhbmQgbmFtZSAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAwOS8xMy8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgcmVhZC93cml0ZSBvZiBNQUdOIGNodW5rICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDA5LzE0LzIwMDIgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBldmVudCBoYW5kbGluZyBmb3IgZHluYW1pYyBNTkcgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC41IC0gMDkvMTUvMjAwMiAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIExPT1AgaXRlcmF0aW9uPTAgc3BlY2lhbCBjYXNlICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAwOS8xOS8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gbWlzcGxhY2VkIFRFUk0gaXMgbm93IHRyZWF0ZWQgYXMgd2FybmluZyAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDA5LzIwLzIwMDIgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBzdXBwb3J0IGZvciBQQVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC41IC0gMTAvMDMvMjAwMiAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIGNodW5rLXN0b3JhZ2UgZm9yIGV2TlQgY2h1bmsgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAxMC8wNy8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgRElTQyBzdXBwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGFub3RoZXIgZml4IGZvciBtaXNwbGFjZWQgVEVSTSBjaHVuayAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAxMC8xNy8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgaW5pdGlhbGl6dGlvbiBvZiBwSWRzIGluIGRJU0MgcmVhZCByb3V0aW5lICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDExLzA2LzIwMDIgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBzdXBwb3J0IGZvciBuRUVEICJNTkcgMS4xIiAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgc3VwcG9ydCBmb3IgbkVFRCAiQ0FDSEVPRkYiICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjYgLSAwNS8yNS8yMDAzIC0gRy5SLVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgTU5HX1NLSVBDSFVOS19jSE5LIGZvb3RwcmludCBvcHRpbWl6YXRpb25zICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNiAtIDA2LzAyLzIwMDMgLSBHLlItUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSByZW1vdmVkIHNvbWUgcmVkdW5kYW50IGNoZWNrcyBmb3IgaVJhd2xlbj09MCAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC42IC0gMDYvMjIvMjAwMyAtIEcuUi1QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIE1OR19OT18xNkJJVF9TVVBQT1JULCBNTkdfTk9fREVMVEFfUE5HIHJlZHVjdGlvbnMgICogKi8KKy8qICogICAgICAgICAgICAgLSBvcHRpb25hbGx5IHVzZSB6bGliJ3MgY3JjMzIgZnVuY3Rpb24gaW5zdGVhZCBvZiAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgbG9jYWwgbW5nX3VwZGF0ZV9jcmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNiAtIDA3LzE0LzIwMDMgLSBHLlItUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBNTkdfTk9fTE9PUF9TSUdOQUxTX1NVUFBPUlRFRCBjb25kaXRpb25hbCAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC42IC0gMDcvMjkvMjAwMyAtIEcuUi1QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGNvbmRpdGlvbmFscyBhcm91bmQgUEFTVCBjaHVuayBzdXBwb3J0ICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjYgLSAwOC8xNy8yMDAzIC0gRy5SLVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgY29uZGl0aW9uYWxzIGFyb3VuZCBub24tVkxDIGNodW5rIHN1cHBvcnQgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjcgLSAxMC8yOS8yMDAzIC0gRy5SLVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gcmV2aXNlZCBKREFBIGFuZCBKREFUIHJlYWRlcnMgdG8gYXZvaWQgY29tcGlsZXIgYnVnICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNyAtIDAxLzI1LzIwMDQgLSBKLlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBwcmVtdWx0aXBsaWVkIGFscGhhIGNhbnZhcycgZm9yIFJHQkEsIEFSR0IsIEFCR1IgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC43IC0gMDEvMjcvMjAwNCAtIEouUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIGluY2x1c2lvbiBvZiBJSk5HIGNodW5rIGZvciBub24tSk5HIHVzZSAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjcgLSAwMi8yNi8yMDA0IC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgYnVnIGluIGNodW5rLXN0b3JhZ2Ugb2YgU0hPVyBjaHVuayAoZnJvbSA9PSB0bykgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjggLSAwNC8wMi8yMDA0IC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgQ1JDIGV4aXN0ZW5jZSAmIGNoZWNraW5nIGZsYWdzICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuOCAtIDA3LzA3LzIwMDQgLSBHLlItUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjaGFuZ2Ugd29yc3QtY2FzZSBpQWxwaGFkZXB0aCB0byAxIGZvciBzdGFuZGFsb25lIFBOR3MgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuOSAtIDA5LzI4LzIwMDQgLSBHLlItUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBpbXByb3ZlZCBoYW5kbGluZyBvZiBjaGVhcCB0cmFuc3BhcmVuY3kgd2hlbiAxNi1iaXQgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgc3VwcG9ydCBpcyBkaXNhYmxlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuOSAtIDEwLzA0LzIwMDQgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaXhlZCBidWcgaW4gd3JpdGluZyBzQklUIGZvciBpbmRleGVkIGNvbG9yICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC45IC0gMTAvMTAvMjAwNCAtIEcuUi1QLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIE1OR19OT18xXzJfNEJJVF9TVVBQT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjkgLSAxMi8wNS8yMDA0IC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgY29uZGl0aW9uYWwgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuOSAtIDEyLzA2LzIwMDQgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBjb25kaXRpb25hbCBNTkdfT1BUSU1JWkVfQ0hVTktBU1NJR04gICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC45IC0gMTIvMDcvMjAwNCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGNvbmRpdGlvbmFsIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUiAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjkgLSAxMi8xMS8yMDA0IC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgY29uZGl0aW9uYWwgTU5HX09QVElNSVpFX0RJU1BMQVlDQUxMUyAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuOSAtIDEyLzIwLzIwMDQgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjbGVhbmVkIHVwIG1hY3JvLWludm9jYXRpb25zICh0aGFua3MgdG8gRC4gQWlybGllKSAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC45IC0gMDEvMTcvMjAwNSAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIHByb2JsZW0gd2l0aCBnbG9iYWwgUExURS90Uk5TICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC4xMCAtIDAyLzA3LzIwMDUgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIGRpc3BsYXkgcm91dGluZXMgY2FsbGVkIHR3aWNlIGZvciBGVUxMX01ORyAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICBzdXBwb3J0IGluIG1vemxpYm1uZ2NvbmYuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC4xMCAtIDEyLzA0LzIwMDUgLSBHLlItUC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtICNpZmRlZiBvdXQgdXNlIG9mIG1uZ19pbmZsYXRlX2J1ZmZlciB3aGVuIGl0IGlzIG5vdCAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICBhdmFpbGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC4xMCAtIDA0LzA4LzIwMDcgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHN1cHBvcnQgZm9yIG1QTkcgcHJvcG9zYWwgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjEwIC0gMDQvMTIvMjAwNyAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgc3VwcG9ydCBmb3IgQU5HIHByb3Bvc2FsICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuMTAgLSAwNS8wMi8yMDA3IC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaXhlZCBpbmZsYXRlX2J1ZmZlciBmb3IgZXh0cmVtZSBjb21wcmVzc2lvbiByYXRpb3MgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2luY2x1ZGUgImxpYm1uZy5oIgorI2luY2x1ZGUgImxpYm1uZ19kYXRhLmgiCisjaW5jbHVkZSAibGlibW5nX2Vycm9yLmgiCisjaW5jbHVkZSAibGlibW5nX3RyYWNlLmgiCisjaWZkZWYgX19CT1JMQU5EQ19fCisjcHJhZ21hIGhkcnN0b3AKKyNlbmRpZgorI2luY2x1ZGUgImxpYm1uZ19vYmplY3RzLmgiCisjaW5jbHVkZSAibGlibW5nX29iamVjdF9wcmMuaCIKKyNpbmNsdWRlICJsaWJtbmdfY2h1bmtzLmgiCisjaWZkZWYgTU5HX0NIRUNLX0JBRF9JQ0NQCisjaW5jbHVkZSAibGlibW5nX2NodW5rX3ByYy5oIgorI2VuZGlmCisjaW5jbHVkZSAibGlibW5nX21lbW9yeS5oIgorI2luY2x1ZGUgImxpYm1uZ19kaXNwbGF5LmgiCisjaW5jbHVkZSAibGlibW5nX3psaWIuaCIKKyNpbmNsdWRlICJsaWJtbmdfcGl4ZWxzLmgiCisjaW5jbHVkZSAibGlibW5nX2NodW5rX2lvLmgiCisKKyNpZiBkZWZpbmVkKF9fQk9STEFORENfXykgJiYgZGVmaW5lZChNTkdfU1RSSUNUX0FOU0kpCisjcHJhZ21hIG9wdGlvbiAtQSAgICAgICAgICAgICAgICAgICAgICAvKiBmb3JjZSBBTlNJLUMgKi8KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogQ1JDIC0gQ3ljbGljIFJlZHVuZGFuY3kgQ2hlY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBUaGUgY29kZSBiZWxvdyBpcyB0YWtlbiBkaXJlY3RseSBmcm9tIHRoZSBzYW1wbGUgcHJvdmlkZWQgd2l0aCB0aGUgICAgICogKi8KKy8qICogUE5HIHNwZWNpZmljYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIChpdCBpcyBvbmx5IGFkYXB0ZWQgdG8gdGhlIGxpYnJhcnkncyBpbnRlcm5hbCBkYXRhLWRlZmluaXRpb25zKSAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiBNYWtlIHRoZSB0YWJsZSBmb3IgYSBmYXN0IENSQy4gKi8KKyNpZm5kZWYgTU5HX1VTRV9aTElCX0NSQworTU5HX0xPQ0FMIHZvaWQgbWFrZV9jcmNfdGFibGUgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX3VpbnQzMiBpQzsKKyAgbW5nX2ludDMyICBpTiwgaUs7CisKKyAgZm9yIChpTiA9IDA7IGlOIDwgMjU2OyBpTisrKQorICB7CisgICAgaUMgPSAobW5nX3VpbnQzMikgaU47CisKKyAgICBmb3IgKGlLID0gMDsgaUsgPCA4OyBpSysrKQorICAgIHsKKyAgICAgIGlmIChpQyAmIDEpCisgICAgICAgIGlDID0gMHhlZGI4ODMyMFUgXiAoaUMgPj4gMSk7CisgICAgICBlbHNlCisgICAgICAgIGlDID0gaUMgPj4gMTsKKyAgICB9CisKKyAgICBwRGF0YS0+YUNSQ3RhYmxlIFtpTl0gPSBpQzsKKyAgfQorCisgIHBEYXRhLT5iQ1JDY29tcHV0ZWQgPSBNTkdfVFJVRTsKK30KKyNlbmRpZgorCisvKiBVcGRhdGUgYSBydW5uaW5nIENSQyB3aXRoIHRoZSBieXRlcyBidWZbMC4ubGVuLTFdLS10aGUgQ1JDCisgICBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgdG8gYWxsIDEncywgYW5kIHRoZSB0cmFuc21pdHRlZCB2YWx1ZQorICAgaXMgdGhlIDEncyBjb21wbGVtZW50IG9mIHRoZSBmaW5hbCBydW5uaW5nIENSQyAoc2VlIHRoZQorICAgY3JjKCkgcm91dGluZSBiZWxvdykuICovCisKK01OR19MT0NBTCBtbmdfdWludDMyIHVwZGF0ZV9jcmMgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlDcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlMZW4pCit7CisjaWZkZWYgTU5HX1VTRV9aTElCX0NSQworICByZXR1cm4gY3JjMzIgKGlDcmMsIHBCdWYsIGlMZW4pOworI2Vsc2UKKyAgbW5nX3VpbnQzMiBpQyA9IGlDcmM7CisgIG1uZ19pbnQzMiBpTjsKKworICBpZiAoIXBEYXRhLT5iQ1JDY29tcHV0ZWQpCisgICAgbWFrZV9jcmNfdGFibGUgKHBEYXRhKTsKKworICBmb3IgKGlOID0gMDsgaU4gPCBpTGVuOyBpTisrKQorICAgIGlDID0gcERhdGEtPmFDUkN0YWJsZSBbKGlDIF4gcEJ1ZiBbaU5dKSAmIDB4ZmZdIF4gKGlDID4+IDgpOworCisgIHJldHVybiBpQzsKKyNlbmRpZgorfQorCisvKiBSZXR1cm4gdGhlIENSQyBvZiB0aGUgYnl0ZXMgYnVmWzAuLmxlbi0xXS4gKi8KK21uZ191aW50MzIgbW5nX2NyYyAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwQnVmLAorICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlMZW4pCit7CisjaWZkZWYgTU5HX1VTRV9aTElCX0NSQworICByZXR1cm4gdXBkYXRlX2NyYyAocERhdGEsIDAsIHBCdWYsIGlMZW4pOworI2Vsc2UKKyAgcmV0dXJuIHVwZGF0ZV9jcmMgKHBEYXRhLCAweGZmZmZmZmZmVSwgcEJ1ZiwgaUxlbikgXiAweGZmZmZmZmZmVTsKKyNlbmRpZgorfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogUm91dGluZXMgZm9yIHN3YXBwaW5nIGJ5dGUtb3JkZXIgZnJvbSBhbmQgdG8gZ3JhcGhpYyBmaWxlcyAgICAgICAgICAgICAqICovCisvKiAqIChUaGlzIGNvZGUgaXMgYWRhcHRlZCBmcm9tIHRoZSBsaWJwbmcgcGFja2FnZSkgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX0JJR0VORElBTl9TVVBQT1JURUQKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3VpbnQzMiBtbmdfZ2V0X3VpbnQzMiAobW5nX3VpbnQ4cCBwQnVmKQoreworICAgbW5nX3VpbnQzMiBpID0gKChtbmdfdWludDMyKSgqcEJ1ZikgICAgICAgPDwgMjQpICsKKyAgICAgICAgICAgICAgICAgICgobW5nX3VpbnQzMikoKihwQnVmICsgMSkpIDw8IDE2KSArCisgICAgICAgICAgICAgICAgICAoKG1uZ191aW50MzIpKCoocEJ1ZiArIDIpKSA8PCAgOCkgKworICAgICAgICAgICAgICAgICAgIChtbmdfdWludDMyKSgqKHBCdWYgKyAzKSk7CisgICByZXR1cm4gKGkpOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfaW50MzIgbW5nX2dldF9pbnQzMiAobW5nX3VpbnQ4cCBwQnVmKQoreworICAgbW5nX2ludDMyIGkgPSAoKG1uZ19pbnQzMikoKnBCdWYpICAgICAgIDw8IDI0KSArCisgICAgICAgICAgICAgICAgICgobW5nX2ludDMyKSgqKHBCdWYgKyAxKSkgPDwgMTYpICsKKyAgICAgICAgICAgICAgICAgKChtbmdfaW50MzIpKCoocEJ1ZiArIDIpKSA8PCAgOCkgKworICAgICAgICAgICAgICAgICAgKG1uZ19pbnQzMikoKihwQnVmICsgMykpOworICAgcmV0dXJuIChpKTsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3VpbnQxNiBtbmdfZ2V0X3VpbnQxNiAobW5nX3VpbnQ4cCBwQnVmKQoreworICAgbW5nX3VpbnQxNiBpID0gKG1uZ191aW50MTYpKCgobW5nX3VpbnQxNikoKnBCdWYpIDw8IDgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ191aW50MTYpKCoocEJ1ZiArIDEpKSk7CisgICByZXR1cm4gKGkpOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCit2b2lkIG1uZ19wdXRfdWludDMyIChtbmdfdWludDhwIHBCdWYsCisgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGkpCit7CisgICAqcEJ1ZiAgICAgPSAobW5nX3VpbnQ4KSgoaSA+PiAyNCkgJiAweGZmKTsKKyAgICoocEJ1ZisxKSA9IChtbmdfdWludDgpKChpID4+IDE2KSAmIDB4ZmYpOworICAgKihwQnVmKzIpID0gKG1uZ191aW50OCkoKGkgPj4gOCkgJiAweGZmKTsKKyAgICoocEJ1ZiszKSA9IChtbmdfdWludDgpKGkgJiAweGZmKTsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKwordm9pZCBtbmdfcHV0X2ludDMyIChtbmdfdWludDhwIHBCdWYsCisgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaSkKK3sKKyAgICpwQnVmICAgICA9IChtbmdfdWludDgpKChpID4+IDI0KSAmIDB4ZmYpOworICAgKihwQnVmKzEpID0gKG1uZ191aW50OCkoKGkgPj4gMTYpICYgMHhmZik7CisgICAqKHBCdWYrMikgPSAobW5nX3VpbnQ4KSgoaSA+PiA4KSAmIDB4ZmYpOworICAgKihwQnVmKzMpID0gKG1uZ191aW50OCkoaSAmIDB4ZmYpOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCit2b2lkIG1uZ19wdXRfdWludDE2IChtbmdfdWludDhwIHBCdWYsCisgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGkpCit7CisgICAqcEJ1ZiAgICAgPSAobW5nX3VpbnQ4KSgoaSA+PiA4KSAmIDB4ZmYpOworICAgKihwQnVmKzEpID0gKG1uZ191aW50OCkoaSAmIDB4ZmYpOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjZW5kaWYgLyogIU1OR19CSUdFTkRJQU5fU1VQUE9SVEVEICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBIZWxwZXIgcm91dGluZXMgdG8gc2ltcGxpZnkgY2h1bmstZGF0YSBleHRyYWN0aW9uICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX0lOQ0xVREVfUkVBRF9QUk9DUworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorTU5HX0xPQ0FMIG1uZ191aW50OHAgZmluZF9udWxsIChtbmdfdWludDhwIHBJbikKK3sKKyAgbW5nX3VpbnQ4cCBwT3V0ID0gcEluOworICB3aGlsZSAoKnBPdXQpICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlIHJlYWRfZ3JhcGhpYyByb3V0aW5lIGhhcyBtYWRlIHN1cmUgdGhlcmUncyAqLworICAgIHBPdXQrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWx3YXlzIGF0IGxlYXN0IDEgemVyby1ieXRlIGluIHRoZSBidWZmZXIgKi8KKyAgcmV0dXJuIHBPdXQ7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmICFkZWZpbmVkKE1OR19TS0lQQ0hVTktfaUNDUCkgfHwgIWRlZmluZWQoTU5HX1NLSVBDSFVOS196VFh0KSB8fCBcCisgICAgIWRlZmluZWQoTU5HX1NLSVBDSFVOS19pVFh0KSB8fCBkZWZpbmVkKE1OR19JTkNMVURFX01QTkdfUFJPUE9TQUwpIHx8IFwKKyAgICBkZWZpbmVkKE1OR19JTkNMVURFX0FOR19QUk9QT1NBTCkKK21uZ19yZXRjb2RlIG1uZ19pbmZsYXRlX2J1ZmZlciAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwSW5idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaUluc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCAqcE91dGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAqaU91dHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgKmlSZWFsc2l6ZSkKK3sKKyAgbW5nX3JldGNvZGUgaVJldGNvZGUgPSBNTkdfTk9FUlJPUjsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTkZMQVRFX0JVRkZFUiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmIChpSW5zaXplKSAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbnl0aGluZyB0byBkbyA/ICovCisgIHsKKyAgICAqaU91dHNpemUgPSBpSW5zaXplICogMzsgICAgICAgICAgIC8qIGVzdGltYXRlIHVuY29tcHJlc3NlZCBzaXplICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgYWxsb2NhdGUgYSB0ZW1wb3JhcnkgYnVmZmVyICovCisgICAgTU5HX0FMTE9DIChwRGF0YSwgKnBPdXRidWYsICppT3V0c2l6ZSk7CisKKyAgICBkbworICAgIHsKKyAgICAgIG1uZ3psaWJfaW5mbGF0ZWluaXQgKHBEYXRhKTsgICAgIC8qIGluaXRpYWxpemUgemxpYiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGV0IHpsaWIga25vdyB3aGVyZSB0byBzdG9yZSB0aGUgb3V0cHV0ICovCisgICAgICBwRGF0YS0+c1psaWIubmV4dF9vdXQgID0gKnBPdXRidWY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAic2l6ZSAtIDEiIHNvIHdlJ3ZlIGdvdCBzcGFjZSBmb3IgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZXJvLXRlcm1pbmF0aW9uIG9mIGEgcG9zc2libGUgc3RyaW5nICovCisgICAgICBwRGF0YS0+c1psaWIuYXZhaWxfb3V0ID0gKmlPdXRzaXplIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9rOyBsZXQncyBpbmZsYXRlLi4uICovCisgICAgICBpUmV0Y29kZSA9IG1uZ3psaWJfaW5mbGF0ZWRhdGEgKHBEYXRhLCBpSW5zaXplLCBwSW5idWYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGV0ZXJtaW5lIGFjdHVhbCBvdXRwdXQgc2l6ZSAqLworICAgICAgKmlSZWFsc2l6ZSA9IChtbmdfdWludDMyKXBEYXRhLT5zWmxpYi50b3RhbF9vdXQ7CisKKyAgICAgIG1uZ3psaWJfaW5mbGF0ZWZyZWUgKHBEYXRhKTsgICAgIC8qIHpsaWIncyBkb25lICovCisKKyAgICAgIGlmIChpUmV0Y29kZSA9PSBNTkdfQlVGT1ZFUkZMT1cpIC8qIG5vdCBlbm91Z2ggc3BhY2UgPyAqLworICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlbiBnZXQgc29tZSBtb3JlICovCisgICAgICAgIE1OR19GUkVFWCAocERhdGEsICpwT3V0YnVmLCAqaU91dHNpemUpOworICAgICAgICAqaU91dHNpemUgPSAqaU91dHNpemUgKyAqaU91dHNpemU7CisgICAgICAgIE1OR19BTExPQyAocERhdGEsICpwT3V0YnVmLCAqaU91dHNpemUpOworICAgICAgfQorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVwZWF0IGlmIHdlIGRpZG4ndCBoYXZlIGVub3VnaCBzcGFjZSAqLworICAgIHdoaWxlICgoaVJldGNvZGUgPT0gTU5HX0JVRk9WRVJGTE9XKSAmJgorICAgICAgICAgICAoKmlPdXRzaXplIDwgMjAwICogaUluc2l6ZSkpOworCisgICAgaWYgKCFpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAvKiBpZiBva2UgPyAqLworICAgICAgKigoKnBPdXRidWYpICsgKmlSZWFsc2l6ZSkgPSAwOyAgLyogdGhlbiBwdXQgdGVybWluYXRvciB6ZXJvICovCisKKyAgfQorICBlbHNlCisgIHsKKyAgICAqcE91dGJ1ZiAgID0gMDsgICAgICAgICAgICAgICAgICAgIC8qIG5vdGhpbmcgdG8gZG87IHRoZW4gdGhlcmUncyBubyBvdXRwdXQgKi8KKyAgICAqaU91dHNpemUgID0gMDsKKyAgICAqaVJlYWxzaXplID0gMDsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lORkxBVEVfQlVGRkVSLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBpUmV0Y29kZTsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjZW5kaWYgLyogTU5HX0lOQ0xVREVfUkVBRF9QUk9DUyAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogSGVscGVyIHJvdXRpbmVzIHRvIHNpbXBsaWZ5IGNodW5rIHdyaXRpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNpZmRlZiBNTkdfSU5DTFVERV9XUklURV9QUk9DUworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmICFkZWZpbmVkKE1OR19TS0lQQ0hVTktfaUNDUCkgfHwgIWRlZmluZWQoTU5HX1NLSVBDSFVOS196VFh0KSB8fCAhZGVmaW5lZChNTkdfU0tJUENIVU5LX2lUWHQpCitNTkdfTE9DQUwgbW5nX3JldGNvZGUgZGVmbGF0ZV9idWZmZXIgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcEluYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlJbnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgKnBPdXRidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgKmlPdXRzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICppUmVhbHNpemUpCit7CisgIG1uZ19yZXRjb2RlIGlSZXRjb2RlID0gTU5HX05PRVJST1I7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fREVGTEFURV9CVUZGRVIsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAoaUluc2l6ZSkgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW55dGhpbmcgdG8gZG8gPyAqLworICB7CisgICAgKmlPdXRzaXplID0gKGlJbnNpemUgKiA1KSA+PiAyOyAgICAvKiBlc3RpbWF0ZSBjb21wcmVzc2VkIHNpemUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCBhbGxvY2F0ZSBhIHRlbXBvcmFyeSBidWZmZXIgKi8KKyAgICBNTkdfQUxMT0MgKHBEYXRhLCAqcE91dGJ1ZiwgKmlPdXRzaXplKTsKKworICAgIGRvCisgICAgeworICAgICAgbW5nemxpYl9kZWZsYXRlaW5pdCAocERhdGEpOyAgICAgLyogaW5pdGlhbGl6ZSB6bGliICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZXQgemxpYiBrbm93IHdoZXJlIHRvIHN0b3JlIHRoZSBvdXRwdXQgKi8KKyAgICAgIHBEYXRhLT5zWmxpYi5uZXh0X291dCAgPSAqcE91dGJ1ZjsKKyAgICAgIHBEYXRhLT5zWmxpYi5hdmFpbF9vdXQgPSAqaU91dHNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvazsgbGV0J3MgZGVmbGF0ZS4uLiAqLworICAgICAgaVJldGNvZGUgPSBtbmd6bGliX2RlZmxhdGVkYXRhIChwRGF0YSwgaUluc2l6ZSwgcEluYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRldGVybWluZSBhY3R1YWwgb3V0cHV0IHNpemUgKi8KKyAgICAgICppUmVhbHNpemUgPSBwRGF0YS0+c1psaWIudG90YWxfb3V0OworCisgICAgICBtbmd6bGliX2RlZmxhdGVmcmVlIChwRGF0YSk7ICAgICAvKiB6bGliJ3MgZG9uZSAqLworCisgICAgICBpZiAoaVJldGNvZGUgPT0gTU5HX0JVRk9WRVJGTE9XKSAvKiBub3QgZW5vdWdoIHNwYWNlID8gKi8KKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZW4gZ2V0IHNvbWUgbW9yZSAqLworICAgICAgICBNTkdfRlJFRVggKHBEYXRhLCAqcE91dGJ1ZiwgKmlPdXRzaXplKTsKKyAgICAgICAgKmlPdXRzaXplID0gKmlPdXRzaXplICsgKGlJbnNpemUgPj4gMSk7CisgICAgICAgIE1OR19BTExPQyAocERhdGEsICpwT3V0YnVmLCAqaU91dHNpemUpOworICAgICAgfQorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVwZWF0IGlmIHdlIGRpZG4ndCBoYXZlIGVub3VnaCBzcGFjZSAqLworICAgIHdoaWxlIChpUmV0Y29kZSA9PSBNTkdfQlVGT1ZFUkZMT1cpOworICB9CisgIGVsc2UKKyAgeworICAgICpwT3V0YnVmICAgPSAwOyAgICAgICAgICAgICAgICAgICAgLyogbm90aGluZyB0byBkbzsgdGhlbiB0aGVyZSdzIG5vIG91dHB1dCAqLworICAgICppT3V0c2l6ZSAgPSAwOworICAgICppUmVhbHNpemUgPSAwOworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fREVGTEFURV9CVUZGRVIsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIGlSZXRjb2RlOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK01OR19MT0NBTCBtbmdfcmV0Y29kZSB3cml0ZV9yYXdfY2h1bmsgKG1uZ19kYXRhcCAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2NodW5raWQgaUNodW5rbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgIGlSYXdsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwICBwUmF3ZGF0YSkKK3sKKyAgbW5nX3VpbnQzMiBpQ3JjOworICBtbmdfdWludDMyIGlXcml0dGVuOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1dSSVRFX1JBV19DSFVOSywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGVtcG9yYXJ5IGJ1ZmZlciA/ICovCisgIGlmICgocFJhd2RhdGEgIT0gMCkgJiYgKHBSYXdkYXRhICE9IHBEYXRhLT5wV3JpdGVidWYrOCkpCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZSBsZW5ndGggJiBjaHVua3R5cGUgaW4gZGVmYXVsdCBidWZmZXIgKi8KKyAgICBtbmdfcHV0X3VpbnQzMiAocERhdGEtPnBXcml0ZWJ1ZiwgICBpUmF3bGVuKTsKKyAgICBtbmdfcHV0X3VpbnQzMiAocERhdGEtPnBXcml0ZWJ1Zis0LCAobW5nX3VpbnQzMilpQ2h1bmtuYW1lKTsKKworICAgIGlmIChwRGF0YS0+aUNyY21vZGUgJiBNTkdfQ1JDX09VVFBVVCkKKyAgICB7CisgICAgICBpZiAoKHBEYXRhLT5pQ3JjbW9kZSAmIE1OR19DUkNfT1VUUFVUKSA9PSBNTkdfQ1JDX09VVFBVVF9HRU5FUkFURSkKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNhbGN1bGF0ZSB0aGUgY3JjICovCisgICAgICAgIGlDcmMgPSB1cGRhdGVfY3JjIChwRGF0YSwgMHhmZmZmZmZmZkwsIHBEYXRhLT5wV3JpdGVidWYrNCwgNCk7CisgICAgICAgIGlDcmMgPSB1cGRhdGVfY3JjIChwRGF0YSwgaUNyYywgcFJhd2RhdGEsIGlSYXdsZW4pIF4gMHhmZmZmZmZmZkw7CisgICAgICB9IGVsc2UgeworICAgICAgICBpQ3JjID0gMDsgICAgICAgICAgICAgICAgICAgICAgLyogZHVtbXkgY3JjICovCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZSBpbiBkZWZhdWx0IGJ1ZmZlciAqLworICAgICAgbW5nX3B1dF91aW50MzIgKHBEYXRhLT5wV3JpdGVidWYrOCwgaUNyYyk7CisgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd3JpdGUgdGhlIGxlbmd0aCAmIGNodW5rdHlwZSAqLworICAgIGlmICghcERhdGEtPmZXcml0ZWRhdGEgKChtbmdfaGFuZGxlKXBEYXRhLCBwRGF0YS0+cFdyaXRlYnVmLCA4LCAmaVdyaXR0ZW4pKQorICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0FQUElPRVJST1IpOworCisgICAgaWYgKGlXcml0dGVuICE9IDgpICAgICAgICAgICAgICAgICAvKiBkaXNrIGZ1bGwgPyAqLworICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX09VVFBVVEVSUk9SKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdyaXRlIHRoZSB0ZW1wb3JhcnkgYnVmZmVyICovCisgICAgaWYgKCFwRGF0YS0+ZldyaXRlZGF0YSAoKG1uZ19oYW5kbGUpcERhdGEsIHBSYXdkYXRhLCBpUmF3bGVuLCAmaVdyaXR0ZW4pKQorICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0FQUElPRVJST1IpOworCisgICAgaWYgKGlXcml0dGVuICE9IGlSYXdsZW4pICAgICAgICAgICAvKiBkaXNrIGZ1bGwgPyAqLworICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX09VVFBVVEVSUk9SKTsKKworICAgIGlmIChwRGF0YS0+aUNyY21vZGUgJiBNTkdfQ1JDX09VVFBVVCkKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdyaXRlIHRoZSBjcmMgKi8KKyAgICAgIGlmICghcERhdGEtPmZXcml0ZWRhdGEgKChtbmdfaGFuZGxlKXBEYXRhLCBwRGF0YS0+cFdyaXRlYnVmKzgsIDQsICZpV3JpdHRlbikpCisgICAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19BUFBJT0VSUk9SKTsKKworICAgICAgaWYgKGlXcml0dGVuICE9IDQpICAgICAgICAgICAgICAgLyogZGlzayBmdWxsID8gKi8KKyAgICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX09VVFBVVEVSUk9SKTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJlZml4IHdpdGggbGVuZ3RoICYgY2h1bmt0eXBlICovCisgICAgbW5nX3B1dF91aW50MzIgKHBEYXRhLT5wV3JpdGVidWYsICAgaVJhd2xlbik7CisgICAgbW5nX3B1dF91aW50MzIgKHBEYXRhLT5wV3JpdGVidWYrNCwgKG1uZ191aW50MzIpaUNodW5rbmFtZSk7CisKKyAgICBpZiAocERhdGEtPmlDcmNtb2RlICYgTU5HX0NSQ19PVVRQVVQpCisgICAgeworICAgICAgaWYgKChwRGF0YS0+aUNyY21vZGUgJiBNTkdfQ1JDX09VVFBVVCkgPT0gTU5HX0NSQ19PVVRQVVRfR0VORVJBVEUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjYWxjdWxhdGUgdGhlIGNyYyAqLworICAgICAgICBpQ3JjID0gbW5nX2NyYyAocERhdGEsIHBEYXRhLT5wV3JpdGVidWYrNCwgaVJhd2xlbiArIDQpOworICAgICAgZWxzZQorICAgICAgICBpQ3JjID0gMDsgICAgICAgICAgICAgICAgICAgICAgLyogZHVtbXkgY3JjICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGQgaXQgdG8gdGhlIGJ1ZmZlciAqLworICAgICAgbW5nX3B1dF91aW50MzIgKHBEYXRhLT5wV3JpdGVidWYgKyBpUmF3bGVuICsgOCwgaUNyYyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3cml0ZSBpdCBpbiBhIHNpbmdsZSBwYXNzICovCisgICAgICBpZiAoIXBEYXRhLT5mV3JpdGVkYXRhICgobW5nX2hhbmRsZSlwRGF0YSwgcERhdGEtPnBXcml0ZWJ1ZiwgaVJhd2xlbiArIDEyLCAmaVdyaXR0ZW4pKQorICAgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfQVBQSU9FUlJPUik7CisKKyAgICAgIGlmIChpV3JpdHRlbiAhPSBpUmF3bGVuICsgMTIpICAgIC8qIGRpc2sgZnVsbCA/ICovCisgICAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19PVVRQVVRFUlJPUik7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICghcERhdGEtPmZXcml0ZWRhdGEgKChtbmdfaGFuZGxlKXBEYXRhLCBwRGF0YS0+cFdyaXRlYnVmLCBpUmF3bGVuICsgOCwgJmlXcml0dGVuKSkKKyAgICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0FQUElPRVJST1IpOworCisgICAgICBpZiAoaVdyaXR0ZW4gIT0gaVJhd2xlbiArIDgpICAgICAvKiBkaXNrIGZ1bGwgPyAqLworICAgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfT1VUUFVURVJST1IpOworICAgIH0KKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1dSSVRFX1JBV19DSFVOSywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiBCMDA0ICovCisjZW5kaWYgLyogTU5HX0lOQ0xVREVfV1JJVEVfUFJPQ1MgKi8KKy8qIEIwMDQgKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBjaHVuayByZWFkIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX0lOQ0xVREVfUkVBRF9QUk9DUworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK01OR19MT0NBTCBtbmdfcmV0Y29kZSBjcmVhdGVfY2h1bmtfc3RvcmFnZSAobW5nX2RhdGFwICAgICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfY2h1bmtwICAgICAgcEhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgIGlSYXdsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgICAgICBwUmF3ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ZpZWxkX2Rlc2NwIHBGaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgIGlGaWVsZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19jaHVua3AqICAgICBwcENodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgYldvcmtjb3B5KQoreworICBtbmdfZmllbGRfZGVzY3AgcFRlbXBmaWVsZCAgPSBwRmllbGQ7CisgIG1uZ191aW50MTYgICAgICBpRmllbGRjb3VudCA9IGlGaWVsZHM7CisgIG1uZ191aW50OHAgICAgICBwVGVtcGRhdGEgICA9IHBSYXdkYXRhOworICBtbmdfdWludDMyICAgICAgaVRlbXBsZW4gICAgPSBpUmF3bGVuOworICBtbmdfdWludDE2ICAgICAgaUxhc3Rncm91cCAgPSAwOworICBtbmdfdWludDhwICAgICAgcENodW5rZGF0YTsKKyAgbW5nX3VpbnQzMiAgICAgIGlEYXRhbGVuOworICBtbmdfdWludDggICAgICAgaUNvbG9ydHlwZTsKKyAgbW5nX2Jvb2wgICAgICAgIGJQcm9jZXNzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdGlhbGl6ZSBzdG9yYWdlICovCisgIG1uZ19yZXRjb2RlIGlSZXRjb2RlID0gKChtbmdfY2h1bmtfaGVhZGVycClwSGVhZGVyKS0+ZkNyZWF0ZSAocERhdGEsIHBIZWFkZXIsIHBwQ2h1bmspOworICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICByZXR1cm4gaVJldGNvZGU7CisKKyAgaWYgKCgobW5nX2NodW5rX2hlYWRlcnApKCpwcENodW5rKSktPmlDaHVua25hbWUgPT0gTU5HX1VJTlRfSFVIKQorICAgICgobW5nX2NodW5rX2hlYWRlcnApKCpwcENodW5rKSktPmlDaHVua25hbWUgPSBwRGF0YS0+aUNodW5rbmFtZTsKKworICBpZiAoKCFiV29ya2NvcHkpIHx8CisgICAgICAoKCgobW5nX2NodW5rX2hlYWRlcnApcEhlYWRlciktPmlDaHVua25hbWUgIT0gTU5HX1VJTlRfSURBVCkgJiYKKyAgICAgICAoKChtbmdfY2h1bmtfaGVhZGVycClwSGVhZGVyKS0+aUNodW5rbmFtZSAhPSBNTkdfVUlOVF9KREFUKSAmJgorICAgICAgICgoKG1uZ19jaHVua19oZWFkZXJwKXBIZWFkZXIpLT5pQ2h1bmtuYW1lICE9IE1OR19VSU5UX0pEQUEpICAgKSkKKyAgeworICAgIHBDaHVua2RhdGEgPSAobW5nX3VpbnQ4cCkoKnBwQ2h1bmspOworCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HICAgICAgICAgICAgICAgICAvKiBkZXRlcm1pbmUgY3VycmVudCBjb2xvcnR5cGUgKi8KKyAgICBpZiAocERhdGEtPmJIYXNKSERSKQorICAgICAgaUNvbG9ydHlwZSA9IChtbmdfdWludDgpKHBEYXRhLT5pSkhEUmNvbG9ydHlwZSAtIDgpOworICAgIGVsc2UKKyNlbmRpZiAvKiBNTkdfSU5DTFVERV9KTkcgKi8KKyAgICBpZiAoKHBEYXRhLT5iSGFzSUhEUikgfHwgKHBEYXRhLT5iSGFzQkFTSSkgfHwgKHBEYXRhLT5iSGFzREhEUikpCisgICAgICBpQ29sb3J0eXBlID0gcERhdGEtPmlDb2xvcnR5cGU7CisgICAgZWxzZQorICAgICAgaUNvbG9ydHlwZSA9IDY7CisKKyAgICBpZiAoaVRlbXBsZW4pICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdCBlbXB0eSA/ICovCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGVuIGdvIGZpbGwgdGhlIGZpZWxkcyAqLworICAgICAgd2hpbGUgKChpRmllbGRjb3VudCkgJiYgKGlUZW1wbGVuKSkKKyAgICAgIHsKKyAgICAgICAgaWYgKHBUZW1wZmllbGQtPmlPZmZzZXRjaHVuaykKKyAgICAgICAgeworICAgICAgICAgIGlmIChwVGVtcGZpZWxkLT5pRmxhZ3MgJiBNTkdfRklFTERfUFVUSU1HVFlQRSkKKyAgICAgICAgICB7CisgICAgICAgICAgICAqKHBDaHVua2RhdGErcFRlbXBmaWVsZC0+aU9mZnNldGNodW5rKSA9IGlDb2xvcnR5cGU7CisgICAgICAgICAgICBiUHJvY2VzcyA9IE1OR19GQUxTRTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIGlmIChwVGVtcGZpZWxkLT5pRmxhZ3MgJiBNTkdfRklFTERfSUZJTUdUWVBFUykKKyAgICAgICAgICAgIGJQcm9jZXNzID0gKG1uZ19ib29sKSgoKHBUZW1wZmllbGQtPmlGbGFncyAmIE1OR19GSUVMRF9JRklNR1RZUEUwKSAmJiAoaUNvbG9ydHlwZSA9PSAwKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHBUZW1wZmllbGQtPmlGbGFncyAmIE1OR19GSUVMRF9JRklNR1RZUEUyKSAmJiAoaUNvbG9ydHlwZSA9PSAyKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHBUZW1wZmllbGQtPmlGbGFncyAmIE1OR19GSUVMRF9JRklNR1RZUEUzKSAmJiAoaUNvbG9ydHlwZSA9PSAzKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHBUZW1wZmllbGQtPmlGbGFncyAmIE1OR19GSUVMRF9JRklNR1RZUEU0KSAmJiAoaUNvbG9ydHlwZSA9PSA0KSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHBUZW1wZmllbGQtPmlGbGFncyAmIE1OR19GSUVMRF9JRklNR1RZUEU2KSAmJiAoaUNvbG9ydHlwZSA9PSA2KSkgICApOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJQcm9jZXNzID0gTU5HX1RSVUU7CisKKyAgICAgICAgICBpZiAoYlByb2Nlc3MpCisgICAgICAgICAgeworICAgICAgICAgICAgaUxhc3Rncm91cCA9IChtbmdfdWludDE2KShwVGVtcGZpZWxkLT5pRmxhZ3MgJiBNTkdfRklFTERfR1JPVVBNQVNLKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtZXJpYyBmaWVsZCA/ICovCisgICAgICAgICAgICBpZiAocFRlbXBmaWVsZC0+aUZsYWdzICYgTU5HX0ZJRUxEX0lOVCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKGlUZW1wbGVuIDwgcFRlbXBmaWVsZC0+aUxlbmd0aG1heCkKKyAgICAgICAgICAgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRExFTkdUSCk7CisKKyAgICAgICAgICAgICAgc3dpdGNoIChwVGVtcGZpZWxkLT5pTGVuZ3RobWF4KQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDogeyBtbmdfdWludDggaU51bSA9ICpwVGVtcGRhdGE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKChtbmdfdWludDE2KWlOdW0gPCBwVGVtcGZpZWxkLT5pTWludmFsdWUpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChtbmdfdWludDE2KWlOdW0gPiBwVGVtcGZpZWxkLT5pTWF4dmFsdWUpICAgICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURGSUVMRFZBTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHBDaHVua2RhdGErcFRlbXBmaWVsZC0+aU9mZnNldGNodW5rKSA9IGlOdW07CisgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgfQorICAgICAgICAgICAgICAgIGNhc2UgMiA6IHsgbW5nX3VpbnQxNiBpTnVtID0gbW5nX2dldF91aW50MTYgKHBUZW1wZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGlOdW0gPCBwVGVtcGZpZWxkLT5pTWludmFsdWUpIHx8IChpTnVtID4gcFRlbXBmaWVsZC0+aU1heHZhbHVlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURGSUVMRFZBTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAqKChtbmdfdWludDE2cCkocENodW5rZGF0YStwVGVtcGZpZWxkLT5pT2Zmc2V0Y2h1bmspKSA9IGlOdW07CisgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgfQorICAgICAgICAgICAgICAgIGNhc2UgNCA6IHsgbW5nX3VpbnQzMiBpTnVtID0gbW5nX2dldF91aW50MzIgKHBUZW1wZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGlOdW0gPCBwVGVtcGZpZWxkLT5pTWludmFsdWUpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwVGVtcGZpZWxkLT5pRmxhZ3MgJiBNTkdfRklFTERfTk9ISUdIQklUKSAmJiAoaU51bSAmIDB4ODAwMDAwMDApKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElERklFTERWQUwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgKigobW5nX3VpbnQzMnApKHBDaHVua2RhdGErcFRlbXBmaWVsZC0+aU9mZnNldGNodW5rKSkgPSBpTnVtOworICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IH0KKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHBUZW1wZGF0YSArPSBwVGVtcGZpZWxkLT5pTGVuZ3RobWF4OworICAgICAgICAgICAgICBpVGVtcGxlbiAgLT0gcFRlbXBmaWVsZC0+aUxlbmd0aG1heDsKKworICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgLyogbm90IG51bWVyaWMgc28gaXQncyBhIGJ1bmNoIG9mIGJ5dGVzICovCisKKyAgICAgICAgICAgICAgaWYgKCFwVGVtcGZpZWxkLT5pT2Zmc2V0Y2h1bmtsZW4pICAgIC8qIGJpZyBmYXQgTk9OTyAqLworICAgICAgICAgICAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlRFUk5BTEVSUk9SKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdpdGggdGVybWluYXRpbmcgMCA/ICovCisgICAgICAgICAgICAgIGlmIChwVGVtcGZpZWxkLT5pRmxhZ3MgJiBNTkdfRklFTERfVEVSTUlOQVRPUikKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcFdvcmsgPSBwVGVtcGRhdGE7CisgICAgICAgICAgICAgICAgd2hpbGUgKCpwV29yaykgICAgICAgICAvKiBmaW5kIHRoZSB6ZXJvICovCisgICAgICAgICAgICAgICAgICBwV29yaysrOworICAgICAgICAgICAgICAgIGlEYXRhbGVuID0gKG1uZ191aW50MzIpKHBXb3JrIC0gcFRlbXBkYXRhKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgIC8qIG5vIHRlcm1pbmF0b3IsIHNvIGV2ZXJ5dGhpbmcgdGhhdCdzIGxlZnQgISAqLworICAgICAgICAgICAgICAgIGlEYXRhbGVuID0gaVRlbXBsZW47CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpZiAoKHBUZW1wZmllbGQtPmlMZW5ndGhtYXgpICYmIChpRGF0YWxlbiA+IHBUZW1wZmllbGQtPmlMZW5ndGhtYXgpKQorICAgICAgICAgICAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElETEVOR1RIKTsKKyNpZiAhZGVmaW5lZChNTkdfU0tJUENIVU5LX2lDQ1ApIHx8ICFkZWZpbmVkKE1OR19TS0lQQ0hVTktfelRYdCkgfHwgXAorICAgICFkZWZpbmVkKE1OR19TS0lQQ0hVTktfaVRYdCkgfHwgZGVmaW5lZChNTkdfSU5DTFVERV9NUE5HX1BST1BPU0FMKSB8fCBcCisgICAgZGVmaW5lZChNTkdfSU5DTFVERV9BTkdfUFJPUE9TQUwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuZWVkcyBkZWNvbXByZXNzaW9uID8gKi8KKyAgICAgICAgICAgICAgaWYgKHBUZW1wZmllbGQtPmlGbGFncyAmIE1OR19GSUVMRF9ERUZMQVRFRCkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcEJ1ZiA9IDA7CisgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpQnVmc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpUmVhbHNpemU7CisgICAgICAgICAgICAgICAgbW5nX3B0ciAgICBwV29yazsKKworICAgICAgICAgICAgICAgIGlSZXRjb2RlID0gbW5nX2luZmxhdGVfYnVmZmVyIChwRGF0YSwgcFRlbXBkYXRhLCBpRGF0YWxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBCdWYsICZpQnVmc2l6ZSwgJmlSZWFsc2l6ZSk7CisKKyNpZmRlZiBNTkdfQ0hFQ0tfQkFEX0lDQ1AgICAgICAgICAgICAgIC8qIENoZWNrIGZvciBiYWQgaUNDUCBjaHVuayAqLworICAgICAgICAgICAgICAgIGlmICgoaVJldGNvZGUpICYmICgoKG1uZ19jaHVua19oZWFkZXJwKXBIZWFkZXIpLT5pQ2h1bmtuYW1lID09IE1OR19VSU5UX2lDQ1ApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICooKG1uZ19wdHIgKikocENodW5rZGF0YStwVGVtcGZpZWxkLT5pT2Zmc2V0Y2h1bmspKSAgICAgID0gTU5HX05VTEw7CisgICAgICAgICAgICAgICAgICAqKChtbmdfdWludDMycCkocENodW5rZGF0YStwVGVtcGZpZWxkLT5pT2Zmc2V0Y2h1bmtsZW4pKSA9IGlEYXRhbGVuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpZiAoaVJldGNvZGUpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpUmV0Y29kZTsKKworI2lmIGRlZmluZWQoTU5HX0lOQ0xVREVfTVBOR19QUk9QT1NBTCkgfHwgZGVmaW5lZChNTkdfSU5DTFVERV9BTkdfUFJPUE9TQUwpCisgICAgICAgICAgICAgICAgICBpZiAoICgoKG1uZ19jaHVua19oZWFkZXJwKXBIZWFkZXIpLT5pQ2h1bmtuYW1lID09IE1OR19VSU5UX21wTkcpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICgoKG1uZ19jaHVua19oZWFkZXJwKXBIZWFkZXIpLT5pQ2h1bmtuYW1lID09IE1OR19VSU5UX2FkQVQpICAgICkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTU5HX0FMTE9DIChwRGF0YSwgcFdvcmssIGlSZWFsc2l6ZSk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICB7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvbid0IGZvcmdldCB0byBnZW5lcmF0ZSBudWxsIHRlcm1pbmF0b3IgKi8KKyAgICAgICAgICAgICAgICAgICAgTU5HX0FMTE9DIChwRGF0YSwgcFdvcmssIGlSZWFsc2l6ZSsxKTsKKyNpZiBkZWZpbmVkKE1OR19JTkNMVURFX01QTkdfUFJPUE9TQUwpIHx8IGRlZmluZWQoTU5HX0lOQ0xVREVfQU5HX1BST1BPU0FMKQorICAgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAgICAgICBNTkdfQ09QWSAocFdvcmssIHBCdWYsIGlSZWFsc2l6ZSk7CisKKyAgICAgICAgICAgICAgICAgICooKG1uZ19wdHIgKikocENodW5rZGF0YStwVGVtcGZpZWxkLT5pT2Zmc2V0Y2h1bmspKSAgICAgID0gcFdvcms7CisgICAgICAgICAgICAgICAgICAqKChtbmdfdWludDMycCkocENodW5rZGF0YStwVGVtcGZpZWxkLT5pT2Zmc2V0Y2h1bmtsZW4pKSA9IGlSZWFsc2l6ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAocEJ1ZikgICAgICAgICAgICAgIC8qIGZyZWUgdGhlIHRlbXBvcmFyeSBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgIE1OR19GUkVFWCAocERhdGEsIHBCdWYsIGlCdWZzaXplKTsKKworICAgICAgICAgICAgICB9IGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgLyogbm8gZGVjb21wcmVzc2lvbiwgc28ganVzdCBjb3B5ICovCisKKyAgICAgICAgICAgICAgICBtbmdfcHRyIHBXb3JrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZG9uJ3QgZm9yZ2V0IHRvIGdlbmVyYXRlIG51bGwgdGVybWluYXRvciAqLworICAgICAgICAgICAgICAgIE1OR19BTExPQyAocERhdGEsIHBXb3JrLCBpRGF0YWxlbisxKTsKKyAgICAgICAgICAgICAgICBNTkdfQ09QWSAocFdvcmssIHBUZW1wZGF0YSwgaURhdGFsZW4pOworCisgICAgICAgICAgICAgICAgKigobW5nX3B0ciAqKShwQ2h1bmtkYXRhK3BUZW1wZmllbGQtPmlPZmZzZXRjaHVuaykpICAgICAgPSBwV29yazsKKyAgICAgICAgICAgICAgICAqKChtbmdfdWludDMycCkocENodW5rZGF0YStwVGVtcGZpZWxkLT5pT2Zmc2V0Y2h1bmtsZW4pKSA9IGlEYXRhbGVuOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaWYgKHBUZW1wZmllbGQtPmlGbGFncyAmIE1OR19GSUVMRF9URVJNSU5BVE9SKQorICAgICAgICAgICAgICAgIGlEYXRhbGVuKys7ICAgICAgICAgICAgLyogc2tpcCB0aGUgdGVybWluYXRpbmcgemVybyBhcyB3ZWxsICEhISAqLworCisgICAgICAgICAgICAgIGlUZW1wbGVuICAtPSBpRGF0YWxlbjsKKyAgICAgICAgICAgICAgcFRlbXBkYXRhICs9IGlEYXRhbGVuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmVlZCB0byBzZXQgYW4gaW5kaWNhdG9yID8gKi8KKyAgICAgICAgICAgIGlmIChwVGVtcGZpZWxkLT5pT2Zmc2V0Y2h1bmtpbmQpCisgICAgICAgICAgICAgICooKG1uZ191aW50OHApKHBDaHVua2RhdGErcFRlbXBmaWVsZC0+aU9mZnNldGNodW5raW5kKSkgPSBNTkdfVFJVRTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocFRlbXBmaWVsZC0+cFNwZWNpYWxmdW5jKSAgLyogc3BlY2lhbCBmdW5jdGlvbiByZXF1aXJlZCA/ICovCisgICAgICAgIHsKKyAgICAgICAgICBpUmV0Y29kZSA9IHBUZW1wZmllbGQtPnBTcGVjaWFsZnVuYyhwRGF0YSwgKnBwQ2h1bmssICZpVGVtcGxlbiwgJnBUZW1wZGF0YSk7CisgICAgICAgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgICAgICAgcmV0dXJuIGlSZXRjb2RlOworICAgICAgICB9CisKKyAgICAgICAgcFRlbXBmaWVsZCsrOyAgICAgICAgICAgICAgICAgIC8qIE5lZWVlZWVleHh4dHQgKi8KKyAgICAgICAgaUZpZWxkY291bnQtLTsKKyAgICAgIH0KKworICAgICAgaWYgKGlUZW1wbGVuKSAgICAgICAgICAgICAgICAgICAgLyogZXh0cmEgZGF0YSA/Pz8gKi8KKyAgICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURMRU5HVEgpOworCisgICAgICB3aGlsZSAoaUZpZWxkY291bnQpICAgICAgICAgICAgICAvKiBub3QgZW5vdWdoIGRhdGEgPz8/ICovCisgICAgICB7CisgICAgICAgIGlmIChwVGVtcGZpZWxkLT5pRmxhZ3MgJiBNTkdfRklFTERfSUZJTUdUWVBFUykKKyAgICAgICAgICBiUHJvY2VzcyA9IChtbmdfYm9vbCkoKChwVGVtcGZpZWxkLT5pRmxhZ3MgJiBNTkdfRklFTERfSUZJTUdUWVBFMCkgJiYgKGlDb2xvcnR5cGUgPT0gMCkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocFRlbXBmaWVsZC0+aUZsYWdzICYgTU5HX0ZJRUxEX0lGSU1HVFlQRTIpICYmIChpQ29sb3J0eXBlID09IDIpKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHBUZW1wZmllbGQtPmlGbGFncyAmIE1OR19GSUVMRF9JRklNR1RZUEUzKSAmJiAoaUNvbG9ydHlwZSA9PSAzKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwVGVtcGZpZWxkLT5pRmxhZ3MgJiBNTkdfRklFTERfSUZJTUdUWVBFNCkgJiYgKGlDb2xvcnR5cGUgPT0gNCkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocFRlbXBmaWVsZC0+aUZsYWdzICYgTU5HX0ZJRUxEX0lGSU1HVFlQRTYpICYmIChpQ29sb3J0eXBlID09IDYpKSAgICk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBiUHJvY2VzcyA9IE1OR19UUlVFOworCisgICAgICAgIGlmIChiUHJvY2VzcykKKyAgICAgICAgeworICAgICAgICAgIGlmICghKHBUZW1wZmllbGQtPmlGbGFncyAmIE1OR19GSUVMRF9PUFRJT05BTCkpCisgICAgICAgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRExFTkdUSCk7CisgICAgICAgICAgaWYgKChwVGVtcGZpZWxkLT5pRmxhZ3MgJiBNTkdfRklFTERfR1JPVVBNQVNLKSAmJgorICAgICAgICAgICAgICAoKG1uZ191aW50MTYpKHBUZW1wZmllbGQtPmlGbGFncyAmIE1OR19GSUVMRF9HUk9VUE1BU0spID09IGlMYXN0Z3JvdXApKQorICAgICAgICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURMRU5HVEgpOworICAgICAgICB9CisKKyAgICAgICAgcFRlbXBmaWVsZCsrOworICAgICAgICBpRmllbGRjb3VudC0tOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworUkVBRF9DSFVOSyAobW5nX3JlYWRfZ2VuZXJhbCkKK3sKKyAgbW5nX3JldGNvZGUgICAgIGlSZXRjb2RlID0gTU5HX05PRVJST1I7CisgIG1uZ19jaHVua19kZXNjcCBwRGVzY3IgICA9ICgobW5nX2NodW5rX2hlYWRlcnApcEhlYWRlciktPnBDaHVua2Rlc2NyOworICBtbmdfZmllbGRfZGVzY3AgcEZpZWxkOworICBtbmdfdWludDE2ICAgICAgaUZpZWxkczsKKworICBpZiAoIXBEZXNjcikgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhpcyBpcyBhIGJhZCBib29ib28gISEhICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVEVSTkFMRVJST1IpOworCisgIHBGaWVsZCAgPSBwRGVzY3ItPnBGaWVsZGRlc2M7CisgIGlGaWVsZHMgPSBwRGVzY3ItPmlGaWVsZGRlc2M7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGVjayBjaHVuayBhZ2FpbnN0IHNpZ25hdHVyZSAqLworICBpZiAoKHBEZXNjci0+ZUltZ3R5cGUgPT0gbW5nX2l0X21uZykgJiYgKHBEYXRhLT5lU2lndHlwZSAhPSBtbmdfaXRfbW5nKSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfQ0hVTktOT1RBTExPV0VEKTsKKworICBpZiAoKHBEZXNjci0+ZUltZ3R5cGUgPT0gbW5nX2l0X2puZykgJiYgKHBEYXRhLT5lU2lndHlwZSA9PSBtbmdfaXRfcG5nKSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfQ0hVTktOT1RBTExPV0VEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVtcHRpZXMgYWxsb3dlZCA/ICovCisgIGlmICgoaVJhd2xlbiA9PSAwKSAmJiAoIShwRGVzY3ItPmlBbGxvd2VkICYgTU5HX0RFU0NSX0VNUFRZKSkpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURMRU5HVEgpOworCisgIGlmICgocERhdGEtPmVJbWFnZXR5cGUgIT0gbW5nX2l0X21uZykgfHwgKCEocERlc2NyLT5pQWxsb3dlZCAmIE1OR19ERVNDUl9HTE9CQUwpKSkKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICphKiBoZWFkZXIgcmVxdWlyZWQgPyAqLworICAgIGlmICgocERlc2NyLT5pTXVzdGhhdmVzICYgTU5HX0RFU0NSX0dlbkhEUikgJiYKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgICAgICAgKCFwRGF0YS0+Ykhhc0lIRFIpICYmICghcERhdGEtPmJIYXNCQVNJKSAmJiAoIXBEYXRhLT5iSGFzREhEUikgJiYgKCFwRGF0YS0+Ykhhc0pIRFIpKQorI2Vsc2UKKyAgICAgICAgKCFwRGF0YS0+Ykhhc0lIRFIpICYmICghcERhdGEtPmJIYXNCQVNJKSAmJiAoIXBEYXRhLT5iSGFzREhEUikpCisjZW5kaWYKKyAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19TRVFVRU5DRUVSUk9SKTsKKworI2lmZGVmIE1OR19JTkNMVURFX0pORworICAgIGlmICgocERlc2NyLT5pTXVzdGhhdmVzICYgTU5HX0RFU0NSX0puZ0hEUikgJiYKKyAgICAgICAgKCFwRGF0YS0+Ykhhc0RIRFIpICYmICghcERhdGEtPmJIYXNKSERSKSkKKyAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19TRVFVRU5DRUVSUk9SKTsKKyNlbmRpZgorICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcGVjaWZpYyBjaHVuayBwcmUtcmVxdWlzaXRlID8gKi8KKyAgaWYgKCgocERlc2NyLT5pTXVzdGhhdmVzICYgTU5HX0RFU0NSX0lIRFIpICYmICghcERhdGEtPmJIYXNJSERSKSkgfHwKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgICAgICgocERlc2NyLT5pTXVzdGhhdmVzICYgTU5HX0RFU0NSX0pIRFIpICYmICghcERhdGEtPmJIYXNKSERSKSkgfHwKKyNlbmRpZgorICAgICAgKChwRGVzY3ItPmlNdXN0aGF2ZXMgJiBNTkdfREVTQ1JfREhEUikgJiYgKCFwRGF0YS0+Ykhhc0RIRFIpKSB8fAorICAgICAgKChwRGVzY3ItPmlNdXN0aGF2ZXMgJiBNTkdfREVTQ1JfTE9PUCkgJiYgKCFwRGF0YS0+Ykhhc0xPT1ApKSB8fAorICAgICAgKChwRGVzY3ItPmlNdXN0aGF2ZXMgJiBNTkdfREVTQ1JfUExURSkgJiYgKCFwRGF0YS0+Ykhhc1BMVEUpKSB8fAorICAgICAgKChwRGVzY3ItPmlNdXN0aGF2ZXMgJiBNTkdfREVTQ1JfTUhEUikgJiYgKCFwRGF0YS0+Ykhhc01IRFIpKSB8fAorICAgICAgKChwRGVzY3ItPmlNdXN0aGF2ZXMgJiBNTkdfREVTQ1JfU0FWRSkgJiYgKCFwRGF0YS0+Ykhhc1NBVkUpKSAgICkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfU0VRVUVOQ0VFUlJPUik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcGVjaWZpYyBjaHVuayB1bmRlc2lyZWQgPyAqLworICBpZiAoKChwRGVzY3ItPmlNdXN0Tk9UaGF2ZXMgJiBNTkdfREVTQ1JfTk9JSERSKSAmJiAocERhdGEtPmJIYXNJSERSKSkgfHwKKyAgICAgICgocERlc2NyLT5pTXVzdE5PVGhhdmVzICYgTU5HX0RFU0NSX05PQkFTSSkgJiYgKHBEYXRhLT5iSGFzQkFTSSkpIHx8CisgICAgICAoKHBEZXNjci0+aU11c3ROT1RoYXZlcyAmIE1OR19ERVNDUl9OT0RIRFIpICYmIChwRGF0YS0+Ykhhc0RIRFIpKSB8fAorICAgICAgKChwRGVzY3ItPmlNdXN0Tk9UaGF2ZXMgJiBNTkdfREVTQ1JfTk9JREFUKSAmJiAocERhdGEtPmJIYXNJREFUKSkgfHwKKyAgICAgICgocERlc2NyLT5pTXVzdE5PVGhhdmVzICYgTU5HX0RFU0NSX05PUExURSkgJiYgKHBEYXRhLT5iSGFzUExURSkpIHx8CisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisgICAgICAoKHBEZXNjci0+aU11c3ROT1RoYXZlcyAmIE1OR19ERVNDUl9OT0pIRFIpICYmIChwRGF0YS0+Ykhhc0pIRFIpKSB8fAorICAgICAgKChwRGVzY3ItPmlNdXN0Tk9UaGF2ZXMgJiBNTkdfREVTQ1JfTk9KREFUKSAmJiAocERhdGEtPmJIYXNKREFUKSkgfHwKKyAgICAgICgocERlc2NyLT5pTXVzdE5PVGhhdmVzICYgTU5HX0RFU0NSX05PSkRBQSkgJiYgKHBEYXRhLT5iSGFzSkRBQSkpIHx8CisgICAgICAoKHBEZXNjci0+aU11c3ROT1RoYXZlcyAmIE1OR19ERVNDUl9OT0pTRVApICYmIChwRGF0YS0+Ykhhc0pTRVApKSB8fAorI2VuZGlmCisgICAgICAoKHBEZXNjci0+aU11c3ROT1RoYXZlcyAmIE1OR19ERVNDUl9OT01IRFIpICYmIChwRGF0YS0+Ykhhc01IRFIpKSB8fAorICAgICAgKChwRGVzY3ItPmlNdXN0Tk9UaGF2ZXMgJiBNTkdfREVTQ1JfTk9MT09QKSAmJiAocERhdGEtPmJIYXNMT09QKSkgfHwKKyAgICAgICgocERlc2NyLT5pTXVzdE5PVGhhdmVzICYgTU5HX0RFU0NSX05PVEVSTSkgJiYgKHBEYXRhLT5iSGFzVEVSTSkpIHx8CisgICAgICAoKHBEZXNjci0+aU11c3ROT1RoYXZlcyAmIE1OR19ERVNDUl9OT1NBVkUpICYmIChwRGF0YS0+Ykhhc1NBVkUpKSAgICkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfU0VRVUVOQ0VFUlJPUik7CisKKyAgaWYgKHBEYXRhLT5lU2lndHlwZSA9PSBtbmdfaXRfbW5nKSAgIC8qIGNoZWNrIGdsb2JhbCBhbmQgZW1iZWRkZWQgZW1wdHkgY2h1bmtzICovCisgIHsKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgICBpZiAoKHBEYXRhLT5iSGFzSUhEUikgfHwgKHBEYXRhLT5iSGFzQkFTSSkgfHwgKHBEYXRhLT5iSGFzREhEUikgfHwgKHBEYXRhLT5iSGFzSkhEUikpCisjZWxzZQorICAgIGlmICgocERhdGEtPmJIYXNJSERSKSB8fCAocERhdGEtPmJIYXNCQVNJKSB8fCAocERhdGEtPmJIYXNESERSKSkKKyNlbmRpZgorICAgIHsKKyAgICAgIGlmICgoaVJhd2xlbiA9PSAwKSAmJiAoIShwRGVzY3ItPmlBbGxvd2VkICYgTU5HX0RFU0NSX0VNUFRZRU1CRUQpKSkKKyAgICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURMRU5HVEgpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoKGlSYXdsZW4gPT0gMCkgJiYgKCEocERlc2NyLT5pQWxsb3dlZCAmIE1OR19ERVNDUl9FTVBUWUdMT0JBTCkpKQorICAgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRExFTkdUSCk7CisgICAgfQorICB9CisKKyAgaWYgKHBEZXNjci0+cFNwZWNpYWxmdW5jKSAgICAgICAgICAgIC8qIG5lZWQgc3BlY2lhbCBwcm9jZXNzaW5nID8gKi8KKyAgeworICAgIGlSZXRjb2RlID0gY3JlYXRlX2NodW5rX3N0b3JhZ2UgKHBEYXRhLCBwSGVhZGVyLCBpUmF3bGVuLCBwUmF3ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmllbGQsIGlGaWVsZHMsIHBwQ2h1bmssIE1OR19UUlVFKTsKKyAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbXB0eSBpbmRpY2F0b3IgPyAqLworICAgIGlmICgoIWlSYXdsZW4pICYmIChwRGVzY3ItPmlPZmZzZXRlbXB0eSkpCisgICAgICAqKCgobW5nX3VpbnQ4cCkqcHBDaHVuaykrcERlc2NyLT5pT2Zmc2V0ZW1wdHkpID0gTU5HX1RSVUU7CisKKyAgICBpUmV0Y29kZSA9IHBEZXNjci0+cFNwZWNpYWxmdW5jKHBEYXRhLCAqcHBDaHVuayk7CisgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgcmV0dXJuIGlSZXRjb2RlOworCisgICAgaWYgKCgoKG1uZ19jaHVua19oZWFkZXJwKXBIZWFkZXIpLT5pQ2h1bmtuYW1lID09IE1OR19VSU5UX0lEQVQpIHx8CisgICAgICAgICgoKG1uZ19jaHVua19oZWFkZXJwKXBIZWFkZXIpLT5pQ2h1bmtuYW1lID09IE1OR19VSU5UX0pEQVQpIHx8CisgICAgICAgICgoKG1uZ19jaHVua19oZWFkZXJwKXBIZWFkZXIpLT5pQ2h1bmtuYW1lID09IE1OR19VSU5UX0pEQUEpICAgICkKKyAgICB7CisgICAgICBpUmV0Y29kZSA9ICgobW5nX2NodW5rX2hlYWRlcnApKnBwQ2h1bmspLT5mQ2xlYW51cCAocERhdGEsICpwcENodW5rKTsKKyAgICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICAgICpwcENodW5rID0gTU5HX05VTEw7CisgICAgfSBlbHNlIHsKKyNpZmRlZiBNTkdfU1RPUkVfQ0hVTktTCisgICAgICBpZiAoIXBEYXRhLT5iU3RvcmVjaHVua3MpCisjZW5kaWYKKyAgICAgIHsKKyAgICAgICAgaVJldGNvZGUgPSAoKG1uZ19jaHVua19oZWFkZXJwKSpwcENodW5rKS0+ZkNsZWFudXAgKHBEYXRhLCAqcHBDaHVuayk7CisgICAgICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICAgICAgKnBwQ2h1bmsgPSBNTkdfTlVMTDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX0RJU1BMQVkKKyAgaWYgKGlSYXdsZW4pCisgIHsKKyNpZmRlZiBNTkdfT1BUSU1JWkVfRElTUExBWUNBTExTCisgICAgcERhdGEtPmlSYXdsZW4gID0gaVJhd2xlbjsKKyAgICBwRGF0YS0+cFJhd2RhdGEgPSBwUmF3ZGF0YTsKKyNlbmRpZgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkaXNwbGF5IHByb2Nlc3NpbmcgKi8KKyNpZm5kZWYgTU5HX09QVElNSVpFX0RJU1BMQVlDQUxMUworICAgIGlmICgoKG1uZ19jaHVua19oZWFkZXJwKXBIZWFkZXIpLT5pQ2h1bmtuYW1lID09IE1OR19VSU5UX0lEQVQpCisgICAgICBpUmV0Y29kZSA9IG1uZ19wcm9jZXNzX2Rpc3BsYXlfaWRhdCAocERhdGEsIGlSYXdsZW4sIHBSYXdkYXRhKTsKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgICBlbHNlCisgICAgaWYgKCgobW5nX2NodW5rX2hlYWRlcnApcEhlYWRlciktPmlDaHVua25hbWUgPT0gTU5HX1VJTlRfSkRBVCkKKyAgICAgIGlSZXRjb2RlID0gbW5nX3Byb2Nlc3NfZGlzcGxheV9qZGF0IChwRGF0YSwgaVJhd2xlbiwgcFJhd2RhdGEpOworICAgIGVsc2UKKyAgICBpZiAoKChtbmdfY2h1bmtfaGVhZGVycClwSGVhZGVyKS0+aUNodW5rbmFtZSA9PSBNTkdfVUlOVF9KREFBKQorICAgICAgaVJldGNvZGUgPSBtbmdfcHJvY2Vzc19kaXNwbGF5X2pkYWEgKHBEYXRhLCBpUmF3bGVuLCBwUmF3ZGF0YSk7CisjZW5kaWYKKyNlbHNlCisgICAgaWYgKCgobW5nX2NodW5rX2hlYWRlcnApcEhlYWRlciktPmlDaHVua25hbWUgPT0gTU5HX1VJTlRfSURBVCkKKyAgICAgIGlSZXRjb2RlID0gbW5nX3Byb2Nlc3NfZGlzcGxheV9pZGF0IChwRGF0YSk7CisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisgICAgZWxzZQorICAgIGlmICgoKG1uZ19jaHVua19oZWFkZXJwKXBIZWFkZXIpLT5pQ2h1bmtuYW1lID09IE1OR19VSU5UX0pEQVQpCisgICAgICBpUmV0Y29kZSA9IG1uZ19wcm9jZXNzX2Rpc3BsYXlfamRhdCAocERhdGEpOworICAgIGVsc2UKKyAgICBpZiAoKChtbmdfY2h1bmtfaGVhZGVycClwSGVhZGVyKS0+aUNodW5rbmFtZSA9PSBNTkdfVUlOVF9KREFBKQorICAgICAgaVJldGNvZGUgPSBtbmdfcHJvY2Vzc19kaXNwbGF5X2pkYWEgKHBEYXRhKTsKKyNlbmRpZgorI2VuZGlmCisKKyAgICBpZiAoaVJldGNvZGUpCisgICAgICByZXR1cm4gaVJldGNvZGU7CisgIH0KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisKKyNpZmRlZiBNTkdfU1RPUkVfQ0hVTktTCisgIGlmICgocERhdGEtPmJTdG9yZWNodW5rcykgJiYgKCEoKnBwQ2h1bmspKSkKKyAgeworICAgIGlSZXRjb2RlID0gY3JlYXRlX2NodW5rX3N0b3JhZ2UgKHBEYXRhLCBwSGVhZGVyLCBpUmF3bGVuLCBwUmF3ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmllbGQsIGlGaWVsZHMsIHBwQ2h1bmssIE1OR19GQUxTRSk7CisgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgcmV0dXJuIGlSZXRjb2RlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW1wdHkgaW5kaWNhdG9yID8gKi8KKyAgICBpZiAoKCFpUmF3bGVuKSAmJiAocERlc2NyLT5pT2Zmc2V0ZW1wdHkpKQorICAgICAgKigoKG1uZ191aW50OHApKnBwQ2h1bmspK3BEZXNjci0+aU9mZnNldGVtcHR5KSA9IE1OR19UUlVFOworICB9CisjZW5kaWYgLyogTU5HX1NUT1JFX0NIVU5LUyAqLworCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2VuZGlmIC8qIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUiAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorUkVBRF9DSFVOSyAobW5nX3JlYWRfaWhkcikKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVBRF9JSERSLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKGlSYXdsZW4gIT0gMTMpICAgICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBva2UgPyAqLworICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElETEVOR1RIKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9ubHkgYWxsb3dlZCBpbnNpZGUgUE5HIG9yIE1ORyAqLworICBpZiAoKHBEYXRhLT5lU2lndHlwZSAhPSBtbmdfaXRfcG5nKSAmJiAocERhdGEtPmVTaWd0eXBlICE9IG1uZ19pdF9tbmcpKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19DSFVOS05PVEFMTE9XRUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2VxdWVuY2UgY2hlY2tzICovCisgIGlmICgocERhdGEtPmVTaWd0eXBlID09IG1uZ19pdF9wbmcpICYmIChwRGF0YS0+aUNodW5rc2VxID4gMSkpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1NFUVVFTkNFRVJST1IpOworCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisgIGlmICgocERhdGEtPmJIYXNJSERSKSB8fCAocERhdGEtPmJIYXNCQVNJKSB8fCAocERhdGEtPmJIYXNJREFUKSB8fCAocERhdGEtPmJIYXNKSERSKSkKKyNlbHNlCisgIGlmICgocERhdGEtPmJIYXNJSERSKSB8fCAocERhdGEtPmJIYXNCQVNJKSB8fCAocERhdGEtPmJIYXNJREFUKSkKKyNlbmRpZgorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19TRVFVRU5DRUVSUk9SKTsKKworICBwRGF0YS0+Ykhhc0lIRFIgICAgICA9IE1OR19UUlVFOyAgICAgLyogaW5kaWNhdGUgSUhEUiBpcyBwcmVzZW50ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgc3RvcmUgaW50ZXJlc3RpbmcgZmllbGRzICovCisgIGlmICgoIXBEYXRhLT5iSGFzREhEUikgfHwgKHBEYXRhLT5pRGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfTk9DSEFOR0UpKQorICB7CisgICAgcERhdGEtPmlEYXRhd2lkdGggID0gbW5nX2dldF91aW50MzIgKHBSYXdkYXRhKTsKKyAgICBwRGF0YS0+aURhdGFoZWlnaHQgPSBtbmdfZ2V0X3VpbnQzMiAocFJhd2RhdGErNCk7CisgIH0KKworICBwRGF0YS0+aUJpdGRlcHRoICAgICA9ICoocFJhd2RhdGErOCk7CisgIHBEYXRhLT5pQ29sb3J0eXBlICAgID0gKihwUmF3ZGF0YSs5KTsKKyAgcERhdGEtPmlDb21wcmVzc2lvbiAgPSAqKHBSYXdkYXRhKzEwKTsKKyAgcERhdGEtPmlGaWx0ZXIgICAgICAgPSAqKHBSYXdkYXRhKzExKTsKKyAgcERhdGEtPmlJbnRlcmxhY2UgICAgPSAqKHBSYXdkYXRhKzEyKTsKKworI2lmIGRlZmluZWQoTU5HX05PXzFfMl80QklUX1NVUFBPUlQpIHx8IGRlZmluZWQoTU5HX05PXzE2QklUX1NVUFBPUlQpCisgIHBEYXRhLT5pUE5HbXVsdCA9IDE7CisgIHBEYXRhLT5pUE5HZGVwdGggPSBwRGF0YS0+aUJpdGRlcHRoOworI2VuZGlmCisKKyNpZmRlZiBNTkdfTk9fMV8yXzRCSVRfU1VQUE9SVAorICBpZiAocERhdGEtPmlCaXRkZXB0aCA8IDgpCisgICAgICBwRGF0YS0+aUJpdGRlcHRoID0gODsKKyNlbmRpZgorCisjaWZkZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyAgaWYgKHBEYXRhLT5pQml0ZGVwdGggPiA4KQorICAgIHsKKyAgICAgIHBEYXRhLT5pQml0ZGVwdGggPSA4OworICAgICAgcERhdGEtPmlQTkdtdWx0ID0gMjsKKyAgICB9CisjZW5kaWYKKworICBpZiAoKHBEYXRhLT5pQml0ZGVwdGggIT0gIDgpICAgICAgLyogcGFyYW1ldGVyIHZhbGlkaXR5IGNoZWNrcyAqLworI2lmbmRlZiBNTkdfTk9fMV8yXzRCSVRfU1VQUE9SVAorICAgICAgJiYgKHBEYXRhLT5pQml0ZGVwdGggIT0gIDEpICYmCisgICAgICAocERhdGEtPmlCaXRkZXB0aCAhPSAgMikgJiYKKyAgICAgIChwRGF0YS0+aUJpdGRlcHRoICE9ICA0KQorI2VuZGlmCisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgICAmJiAocERhdGEtPmlCaXRkZXB0aCAhPSAxNikgICAKKyNlbmRpZgorICAgICAgKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElEQklUREVQVEgpOworCisgIGlmICgocERhdGEtPmlDb2xvcnR5cGUgIT0gTU5HX0NPTE9SVFlQRV9HUkFZICAgKSAmJgorICAgICAgKHBEYXRhLT5pQ29sb3J0eXBlICE9IE1OR19DT0xPUlRZUEVfUkdCICAgICkgJiYKKyAgICAgIChwRGF0YS0+aUNvbG9ydHlwZSAhPSBNTkdfQ09MT1JUWVBFX0lOREVYRUQpICYmCisgICAgICAocERhdGEtPmlDb2xvcnR5cGUgIT0gTU5HX0NPTE9SVFlQRV9HUkFZQSAgKSAmJgorICAgICAgKHBEYXRhLT5pQ29sb3J0eXBlICE9IE1OR19DT0xPUlRZUEVfUkdCQSAgICkgICAgKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElEQ09MT1JUWVBFKTsKKworICBpZiAoKHBEYXRhLT5pQ29sb3J0eXBlID09IE1OR19DT0xPUlRZUEVfSU5ERVhFRCkgJiYgKHBEYXRhLT5pQml0ZGVwdGggPiA4KSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJREJJVERFUFRIKTsKKworICBpZiAoKChwRGF0YS0+aUNvbG9ydHlwZSA9PSBNTkdfQ09MT1JUWVBFX1JHQiAgICApIHx8CisgICAgICAgKHBEYXRhLT5pQ29sb3J0eXBlID09IE1OR19DT0xPUlRZUEVfR1JBWUEgICkgfHwKKyAgICAgICAocERhdGEtPmlDb2xvcnR5cGUgPT0gTU5HX0NPTE9SVFlQRV9SR0JBICAgKSAgICApICYmCisgICAgICAocERhdGEtPmlCaXRkZXB0aCA8IDggICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAgICApCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURCSVRERVBUSCk7CisKKyAgaWYgKHBEYXRhLT5pQ29tcHJlc3Npb24gIT0gTU5HX0NPTVBSRVNTSU9OX0RFRkxBVEUpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURDT01QUkVTUyk7CisKKyNpZiBkZWZpbmVkKEZJTFRFUjE5MikgfHwgZGVmaW5lZChGSUxURVIxOTMpCisgIGlmICgocERhdGEtPmlGaWx0ZXIgIT0gTU5HX0ZJTFRFUl9BREFQVElWRSApICYmCisjaWYgZGVmaW5lZChGSUxURVIxOTIpICYmIGRlZmluZWQoRklMVEVSMTkzKQorICAgICAgKHBEYXRhLT5pRmlsdGVyICE9IE1OR19GSUxURVJfRElGRkVSSU5HKSAmJgorICAgICAgKHBEYXRhLT5pRmlsdGVyICE9IE1OR19GSUxURVJfTk9GSUxURVIgKSAgICApCisjZWxzZQorI2lmZGVmIEZJTFRFUjE5MgorICAgICAgKHBEYXRhLT5pRmlsdGVyICE9IE1OR19GSUxURVJfRElGRkVSSU5HKSAgICApCisjZWxzZQorICAgICAgKHBEYXRhLT5pRmlsdGVyICE9IE1OR19GSUxURVJfTk9GSUxURVIgKSAgICApCisjZW5kaWYKKyNlbmRpZgorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElERklMVEVSKTsKKyNlbHNlCisgIGlmIChwRGF0YS0+aUZpbHRlcikKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJREZJTFRFUik7CisjZW5kaWYKKworICBpZiAoKHBEYXRhLT5pSW50ZXJsYWNlICE9IE1OR19JTlRFUkxBQ0VfTk9ORSApICYmCisgICAgICAocERhdGEtPmlJbnRlcmxhY2UgIT0gTU5HX0lOVEVSTEFDRV9BREFNNykgICAgKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElESU5URVJMQUNFKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX0RJU1BMQVkgCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKKyAgaWYgKHBEYXRhLT5iSGFzREhEUikgICAgICAgICAgICAgICAgIC8qIGNoZWNrIHRoZSBjb2xvcnR5cGUgZm9yIGRlbHRhLWltYWdlcyAhICovCisgIHsKKyAgICBtbmdfaW1hZ2VkYXRhcCBwQnVmID0gKChtbmdfaW1hZ2VwKXBEYXRhLT5wT2JqemVybyktPnBJbWdidWY7CisKKyAgICBpZiAocERhdGEtPmlDb2xvcnR5cGUgIT0gcEJ1Zi0+aUNvbG9ydHlwZSkKKyAgICB7CisgICAgICBpZiAoICggKHBEYXRhLT5pQ29sb3J0eXBlICE9IE1OR19DT0xPUlRZUEVfSU5ERVhFRCkgfHwKKyAgICAgICAgICAgICAocEJ1Zi0+aUNvbG9ydHlwZSAgPT0gTU5HX0NPTE9SVFlQRV9HUkFZICAgKSAgICApICYmCisgICAgICAgICAgICggKHBEYXRhLT5pQ29sb3J0eXBlICE9IE1OR19DT0xPUlRZUEVfR1JBWSAgICkgfHwKKyAgICAgICAgICAgICAocEJ1Zi0+aUNvbG9ydHlwZSAgPT0gTU5HX0NPTE9SVFlQRV9JTkRFWEVEKSAgICApICAgICkKKyAgICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURDT0xPUlRZUEUpOworICAgIH0KKyAgfQorI2VuZGlmCisjZW5kaWYKKworICBpZiAoIXBEYXRhLT5iSGFzaGVhZGVyKSAgICAgICAgICAgICAgLyogZmlyc3QgY2h1bmsgPyAqLworICB7CisgICAgcERhdGEtPmJIYXNoZWFkZXIgPSBNTkdfVFJVRTsgICAgICAvKiB3ZSd2ZSBnb3QgYSBoZWFkZXIgKi8KKyAgICBwRGF0YS0+ZUltYWdldHlwZSA9IG1uZ19pdF9wbmc7ICAgIC8qIHRoZW4gdGhpcyBtdXN0IGJlIGEgUE5HICovCisgICAgcERhdGEtPmlXaWR0aCAgICAgPSBwRGF0YS0+aURhdGF3aWR0aDsKKyAgICBwRGF0YS0+aUhlaWdodCAgICA9IHBEYXRhLT5pRGF0YWhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByZWRpY3QgYWxwaGEtZGVwdGggISAqLworICAgIGlmICgocERhdGEtPmlDb2xvcnR5cGUgPT0gTU5HX0NPTE9SVFlQRV9HUkFZQSAgKSB8fAorICAgICAgICAocERhdGEtPmlDb2xvcnR5cGUgPT0gTU5HX0NPTE9SVFlQRV9SR0JBICAgKSAgICApCisgICAgICBwRGF0YS0+aUFscGhhZGVwdGggPSBwRGF0YS0+aUJpdGRlcHRoOworICAgIGVsc2UKKyAgICBpZiAocERhdGEtPmlDb2xvcnR5cGUgPT0gTU5HX0NPTE9SVFlQRV9JTkRFWEVEKQorICAgICAgcERhdGEtPmlBbHBoYWRlcHRoID0gODsgICAgICAgICAgLyogd29yc3QgY2FzZSBzY2VuYXJpbyAqLworICAgIGVsc2UKKyAgICAgIHBEYXRhLT5pQWxwaGFkZXB0aCA9IDE7ICAvKiBQb3NzaWJsZSB0Uk5TIGNoZWFwIGJpbmFyeSB0cmFuc3BhcmVuY3kgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpdHMgb24gbWF4aW11bSBjYW52YXMgPyAqLworICAgIGlmICgocERhdGEtPmlXaWR0aCA+IHBEYXRhLT5pTWF4d2lkdGgpIHx8IChwRGF0YS0+aUhlaWdodCA+IHBEYXRhLT5pTWF4aGVpZ2h0KSkKKyAgICAgIE1OR19XQVJOSU5HIChwRGF0YSwgTU5HX0lNQUdFVE9PTEFSR0UpOworCisjaWYgIWRlZmluZWQoTU5HX0lOQ0xVREVfTVBOR19QUk9QT1NBTCkgfHwgIWRlZmluZWQoTU5HX1NVUFBPUlRfRElTUExBWSkKKyAgICBpZiAocERhdGEtPmZQcm9jZXNzaGVhZGVyKSAgICAgICAgIC8qIGluZm9ybSB0aGUgYXBwID8gKi8KKyAgICAgIGlmICghcERhdGEtPmZQcm9jZXNzaGVhZGVyICgoKG1uZ19oYW5kbGUpcERhdGEpLCBwRGF0YS0+aVdpZHRoLCBwRGF0YS0+aUhlaWdodCkpCisgICAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19BUFBNSVNDRVJST1IpOworI2VuZGlmICAgICAgICAKKyAgfQorCisgIGlmICghcERhdGEtPmJIYXNESERSKQorICAgIHBEYXRhLT5pSW1hZ2VsZXZlbCsrOyAgICAgICAgICAgICAgLyogb25lIGxldmVsIGRlZXBlciAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorICB7CisgICAgbW5nX3JldGNvZGUgaVJldGNvZGUgPSBtbmdfcHJvY2Vzc19kaXNwbGF5X2loZHIgKHBEYXRhKTsKKworICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgfQorI2VuZGlmIC8qIE1OR19TVVBQT1JUX0RJU1BMQVkgKi8KKworI2lmZGVmIE1OR19TVE9SRV9DSFVOS1MKKyAgaWYgKHBEYXRhLT5iU3RvcmVjaHVua3MpCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0aWFsaXplIHN0b3JhZ2UgKi8KKyAgICBtbmdfcmV0Y29kZSBpUmV0Y29kZSA9ICgobW5nX2NodW5rX2hlYWRlcnApcEhlYWRlciktPmZDcmVhdGUgKHBEYXRhLCBwSGVhZGVyLCBwcENodW5rKTsKKworICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbGwgdGhlIGZpZWxkcyAqLworICAgICgobW5nX2loZHJwKSpwcENodW5rKS0+aVdpZHRoICAgICAgID0gbW5nX2dldF91aW50MzIgKHBSYXdkYXRhKTsKKyAgICAoKG1uZ19paGRycCkqcHBDaHVuayktPmlIZWlnaHQgICAgICA9IG1uZ19nZXRfdWludDMyIChwUmF3ZGF0YSs0KTsKKyAgICAoKG1uZ19paGRycCkqcHBDaHVuayktPmlCaXRkZXB0aCAgICA9IHBEYXRhLT5pQml0ZGVwdGg7CisgICAgKChtbmdfaWhkcnApKnBwQ2h1bmspLT5pQ29sb3J0eXBlICAgPSBwRGF0YS0+aUNvbG9ydHlwZTsKKyAgICAoKG1uZ19paGRycCkqcHBDaHVuayktPmlDb21wcmVzc2lvbiA9IHBEYXRhLT5pQ29tcHJlc3Npb247CisgICAgKChtbmdfaWhkcnApKnBwQ2h1bmspLT5pRmlsdGVyICAgICAgPSBwRGF0YS0+aUZpbHRlcjsKKyAgICAoKG1uZ19paGRycCkqcHBDaHVuayktPmlJbnRlcmxhY2UgICA9IHBEYXRhLT5pSW50ZXJsYWNlOworICB9CisjZW5kaWYgLyogTU5HX1NUT1JFX0NIVU5LUyAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1JFQURfSUhEUiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7ICAgICAgICAgICAgICAgICAgLyogZG9uZSAqLworfQorI2VuZGlmIC8qIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUiAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorUkVBRF9DSFVOSyAobW5nX3JlYWRfcGx0ZSkKK3sKKyNpZiBkZWZpbmVkKE1OR19TVVBQT1JUX0RJU1BMQVkpIHx8IGRlZmluZWQoTU5HX1NUT1JFX0NIVU5LUykKKyAgbW5nX3VpbnQzMiAgaVg7CisgIG1uZ191aW50OHAgIHBSYXdkYXRhMjsKKyNlbmRpZgorI2lmZGVmIE1OR19TVVBQT1JUX0RJU1BMQVkKKyAgbW5nX3VpbnQzMiAgaVJhd2xlbjI7CisjZW5kaWYKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9SRUFEX1BMVEUsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNlcXVlbmNlIGNoZWNrcyAqLworICBpZiAoKCFwRGF0YS0+Ykhhc01IRFIpICYmICghcERhdGEtPmJIYXNJSERSKSAmJgorICAgICAgKCFwRGF0YS0+Ykhhc0JBU0kpICYmICghcERhdGEtPmJIYXNESERSKSAgICApCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1NFUVVFTkNFRVJST1IpOworCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisgIGlmICgocERhdGEtPmJIYXNJREFUKSB8fCAocERhdGEtPmJIYXNKSERSKSkKKyNlbHNlCisgIGlmIChwRGF0YS0+Ykhhc0lEQVQpCisjZW5kaWYgIAorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19TRVFVRU5DRUVSUk9SKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG11bHRpcGxlIFBMVEUgb25seSBpbnNpZGUgQkFTSSAqLworICBpZiAoKHBEYXRhLT5iSGFzUExURSkgJiYgKCFwRGF0YS0+Ykhhc0JBU0kpKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19NVUxUSVBMRUVSUk9SKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBtdXN0IGJlIG11bHRpcGxlIG9mIDMgKi8KKyAgaWYgKCgoaVJhd2xlbiAlIDMpICE9IDApIHx8IChpUmF3bGVuID4gNzY4KSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRExFTkdUSCk7CisKKyAgaWYgKChwRGF0YS0+Ykhhc0lIRFIpIHx8IChwRGF0YS0+Ykhhc0JBU0kpIHx8IChwRGF0YS0+Ykhhc0RIRFIpKQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb25seSBhbGxvd2VkIGZvciBpbmRleGVkLWNvbG9yIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ2IoYSktY29sb3IhICovCisgICAgaWYgKChwRGF0YS0+aUNvbG9ydHlwZSAhPSAyKSAmJiAocERhdGEtPmlDb2xvcnR5cGUgIT0gMykgJiYgKHBEYXRhLT5pQ29sb3J0eXBlICE9IDYpKQorICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0NIVU5LTk9UQUxMT1dFRCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbXB0eSBvbmx5IGFsbG93ZWQgaWYgZ2xvYmFsIHByZXNlbnQgKi8KKyAgICBpZiAoKGlSYXdsZW4gPT0gMCkgJiYgKCFwRGF0YS0+Ykhhc2dsb2JhbFBMVEUpKQorICAgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfQ0FOTk9UQkVFTVBUWSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgaWYgKGlSYXdsZW4gPT0gMCkgICAgICAgICAgICAgICAgICAvKiBjYW5ub3QgYmUgZW1wdHkgYXMgZ2xvYmFsISAqLworICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0NBTk5PVEJFRU1QVFkpOworICB9CisKKyAgaWYgKChwRGF0YS0+Ykhhc0lIRFIpIHx8IChwRGF0YS0+Ykhhc0JBU0kpIHx8IChwRGF0YS0+Ykhhc0RIRFIpKQorICAgIHBEYXRhLT5iSGFzUExURSA9IE1OR19UUlVFOyAgICAgICAgLyogZ290IGl0ISAqLworICBlbHNlCisgICAgcERhdGEtPmJIYXNnbG9iYWxQTFRFID0gTU5HX1RSVUU7CisKKyAgcERhdGEtPmlQTFRFY291bnQgPSBpUmF3bGVuIC8gMzsgIAorCisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorICBpZiAoKHBEYXRhLT5iSGFzSUhEUikgfHwgKHBEYXRhLT5iSGFzQkFTSSkgfHwgKHBEYXRhLT5iSGFzREhEUikpCisgIHsKKyAgICBtbmdfaW1hZ2VwICAgICBwSW1hZ2U7CisgICAgbW5nX2ltYWdlZGF0YXAgcEJ1ZjsKKworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisgICAgaWYgKHBEYXRhLT5iSGFzREhEUikgICAgICAgICAgICAgICAvKiBwcm9jZXNzaW5nIGRlbHRhLWltYWdlID8gKi8KKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlIGluIG9iamVjdCAwICEhISAqLworICAgICAgcEltYWdlICAgICAgICAgICA9IChtbmdfaW1hZ2VwKXBEYXRhLT5wT2JqemVybzsKKyAgICAgIHBCdWYgICAgICAgICAgICAgPSBwSW1hZ2UtPnBJbWdidWY7CisgICAgICBwQnVmLT5iSGFzUExURSAgID0gTU5HX1RSVUU7ICAgICAvKiBpdCdzIGRlZmluaXRlbHkgZ290IGEgUExURSBub3cgKi8KKyAgICAgIHBCdWYtPmlQTFRFY291bnQgPSBpUmF3bGVuIC8gMzsgIC8qIHRoaXMgaXMgdGhlIGV4YWN0IGxlbmd0aCAqLworICAgICAgcFJhd2RhdGEyICAgICAgICA9IHBSYXdkYXRhOyAgICAgLyogY29weSB0aGUgZW50cmllcyAqLworCisgICAgICBmb3IgKGlYID0gMDsgaVggPCBpUmF3bGVuIC8gMzsgaVgrKykKKyAgICAgIHsKKyAgICAgICAgcEJ1Zi0+YVBMVEVlbnRyaWVzW2lYXS5pUmVkICAgPSAqcFJhd2RhdGEyOworICAgICAgICBwQnVmLT5hUExURWVudHJpZXNbaVhdLmlHcmVlbiA9ICoocFJhd2RhdGEyKzEpOworICAgICAgICBwQnVmLT5hUExURWVudHJpZXNbaVhdLmlCbHVlICA9ICoocFJhd2RhdGEyKzIpOworCisgICAgICAgIHBSYXdkYXRhMiArPSAzOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCB0aGUgY3VycmVudCBvYmplY3QgKi8KKyAgICAgIHBJbWFnZSA9IChtbmdfaW1hZ2VwKXBEYXRhLT5wQ3VycmVudG9iajsKKworICAgICAgaWYgKCFwSW1hZ2UpICAgICAgICAgICAgICAgICAgICAgLyogbm8gb2JqZWN0IHRoZW4gZHVtcCBpdCBpbiBvYmogMCAqLworICAgICAgICBwSW1hZ2UgPSAobW5nX2ltYWdlcClwRGF0YS0+cE9ianplcm87CisKKyAgICAgIHBCdWYgPSBwSW1hZ2UtPnBJbWdidWY7ICAgICAgICAgIC8qIGFkZHJlc3MgdGhlIG9iamVjdCBidWZmZXIgKi8KKyAgICAgIHBCdWYtPmJIYXNQTFRFID0gTU5HX1RSVUU7ICAgICAgIC8qIGFuZCB0ZWxsIGl0IGl0J3MgZ290IGEgUExURSBub3cgKi8KKworICAgICAgaWYgKCFpUmF3bGVuKSAgICAgICAgICAgICAgICAgICAgLyogaWYgZW1wdHksIGluaGVyaXQgZnJvbSBnbG9iYWwgKi8KKyAgICAgIHsKKyAgICAgICAgcEJ1Zi0+aVBMVEVjb3VudCA9IHBEYXRhLT5pR2xvYmFsUExURWNvdW50OworICAgICAgICBNTkdfQ09QWSAocEJ1Zi0+YVBMVEVlbnRyaWVzLCBwRGF0YS0+YUdsb2JhbFBMVEVlbnRyaWVzLAorICAgICAgICAgICAgICAgICAgc2l6ZW9mIChwQnVmLT5hUExURWVudHJpZXMpKTsKKworICAgICAgICBpZiAocERhdGEtPmJIYXNnbG9iYWxUUk5TKSAgICAgLyogYWxzbyBjb3B5IGdsb2JhbCB0Uk5TID8gKi8KKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluZGljYXRlIHRSTlMgYXZhaWxhYmxlICovCisgICAgICAgICAgcEJ1Zi0+Ykhhc1RSTlMgPSBNTkdfVFJVRTsKKworICAgICAgICAgIGlSYXdsZW4yICA9IHBEYXRhLT5pR2xvYmFsVFJOU3Jhd2xlbjsKKyAgICAgICAgICBwUmF3ZGF0YTIgPSAobW5nX3VpbnQ4cCkocERhdGEtPmFHbG9iYWxUUk5TcmF3ZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnbG9iYWwgbGVuZ3RoIG9rZSA/ICovCisgICAgICAgICAgaWYgKChpUmF3bGVuMiA9PSAwKSB8fCAoaVJhd2xlbjIgPiBwQnVmLT5pUExURWNvdW50KSkKKyAgICAgICAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19HTE9CQUxMRU5HVEhFUlIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29weSBpdCAqLworICAgICAgICAgIHBCdWYtPmlUUk5TY291bnQgPSBpUmF3bGVuMjsKKyAgICAgICAgICBNTkdfQ09QWSAocEJ1Zi0+YVRSTlNlbnRyaWVzLCBwUmF3ZGF0YTIsIGlSYXdsZW4yKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmUgZmllbGRzIGZvciBmdXR1cmUgcmVmZXJlbmNlICovCisgICAgICAgIHBCdWYtPmlQTFRFY291bnQgPSBpUmF3bGVuIC8gMzsKKyAgICAgICAgcFJhd2RhdGEyICAgICAgICA9IHBSYXdkYXRhOworCisgICAgICAgIGZvciAoaVggPSAwOyBpWCA8IHBCdWYtPmlQTFRFY291bnQ7IGlYKyspCisgICAgICAgIHsKKyAgICAgICAgICBwQnVmLT5hUExURWVudHJpZXNbaVhdLmlSZWQgICA9ICpwUmF3ZGF0YTI7CisgICAgICAgICAgcEJ1Zi0+YVBMVEVlbnRyaWVzW2lYXS5pR3JlZW4gPSAqKHBSYXdkYXRhMisxKTsKKyAgICAgICAgICBwQnVmLT5hUExURWVudHJpZXNbaVhdLmlCbHVlICA9ICoocFJhd2RhdGEyKzIpOworCisgICAgICAgICAgcFJhd2RhdGEyICs9IDM7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlIGFzIGdsb2JhbCAqLworICB7CisgICAgcERhdGEtPmlHbG9iYWxQTFRFY291bnQgPSBpUmF3bGVuIC8gMzsKKyAgICBwUmF3ZGF0YTIgICAgICAgICAgICAgICA9IHBSYXdkYXRhOworCisgICAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlHbG9iYWxQTFRFY291bnQ7IGlYKyspCisgICAgeworICAgICAgcERhdGEtPmFHbG9iYWxQTFRFZW50cmllc1tpWF0uaVJlZCAgID0gKnBSYXdkYXRhMjsKKyAgICAgIHBEYXRhLT5hR2xvYmFsUExURWVudHJpZXNbaVhdLmlHcmVlbiA9ICoocFJhd2RhdGEyKzEpOworICAgICAgcERhdGEtPmFHbG9iYWxQTFRFZW50cmllc1tpWF0uaUJsdWUgID0gKihwUmF3ZGF0YTIrMik7CisKKyAgICAgIHBSYXdkYXRhMiArPSAzOworICAgIH0KKworICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIGFuIGFuaW1hdGlvbiBvYmplY3QgKi8KKyAgICAgIG1uZ19yZXRjb2RlIGlSZXRjb2RlID0gbW5nX2NyZWF0ZV9hbmlfcGx0ZSAocERhdGEsIHBEYXRhLT5pR2xvYmFsUExURWNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+YUdsb2JhbFBMVEVlbnRyaWVzKTsKKyAgICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICB9CisgIH0KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisKKyNpZmRlZiBNTkdfU1RPUkVfQ0hVTktTCisgIGlmIChwRGF0YS0+YlN0b3JlY2h1bmtzKQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdGlhbGl6ZSBzdG9yYWdlICovCisgICAgbW5nX3JldGNvZGUgaVJldGNvZGUgPSAoKG1uZ19jaHVua19oZWFkZXJwKXBIZWFkZXIpLT5mQ3JlYXRlIChwRGF0YSwgcEhlYWRlciwgcHBDaHVuayk7CisKKyAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZSB0aGUgZmllbGRzICovCisgICAgKChtbmdfcGx0ZXApKnBwQ2h1bmspLT5iRW1wdHkgICAgICA9IChtbmdfYm9vbCkoaVJhd2xlbiA9PSAwKTsKKyAgICAoKG1uZ19wbHRlcCkqcHBDaHVuayktPmlFbnRyeWNvdW50ID0gaVJhd2xlbiAvIDM7CisgICAgcFJhd2RhdGEyICAgICAgICAgICAgICAgICAgICAgICAgICA9IHBSYXdkYXRhOworCisgICAgZm9yIChpWCA9IDA7IGlYIDwgKChtbmdfcGx0ZXApKnBwQ2h1bmspLT5pRW50cnljb3VudDsgaVgrKykKKyAgICB7CisgICAgICAoKG1uZ19wbHRlcCkqcHBDaHVuayktPmFFbnRyaWVzW2lYXS5pUmVkICAgPSAqcFJhd2RhdGEyOworICAgICAgKChtbmdfcGx0ZXApKnBwQ2h1bmspLT5hRW50cmllc1tpWF0uaUdyZWVuID0gKihwUmF3ZGF0YTIrMSk7CisgICAgICAoKG1uZ19wbHRlcCkqcHBDaHVuayktPmFFbnRyaWVzW2lYXS5pQmx1ZSAgPSAqKHBSYXdkYXRhMisyKTsKKworICAgICAgcFJhd2RhdGEyICs9IDM7CisgICAgfQorICB9CisjZW5kaWYgLyogTU5HX1NUT1JFX0NIVU5LUyAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1JFQURfUExURSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7ICAgICAgICAgICAgICAgICAgLyogZG9uZSAqLworfQorI2VuZGlmIC8qIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUiAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorUkVBRF9DSFVOSyAobW5nX3JlYWRfaWRhdCkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVBRF9JREFULCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcgICAgICAgICAgICAgICAgIC8qIHNlcXVlbmNlIGNoZWNrcyAqLworICBpZiAoKCFwRGF0YS0+Ykhhc0lIRFIpICYmICghcERhdGEtPmJIYXNCQVNJKSAmJiAoIXBEYXRhLT5iSGFzREhEUikgJiYgKCFwRGF0YS0+Ykhhc0pIRFIpKQorI2Vsc2UKKyAgaWYgKCghcERhdGEtPmJIYXNJSERSKSAmJiAoIXBEYXRhLT5iSGFzQkFTSSkgJiYgKCFwRGF0YS0+Ykhhc0RIRFIpKQorI2VuZGlmCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1NFUVVFTkNFRVJST1IpOworCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisgIGlmICgocERhdGEtPmJIYXNKSERSKSAmJgorICAgICAgKHBEYXRhLT5pSkhEUmFscGhhY29tcHJlc3Npb24gIT0gTU5HX0NPTVBSRVNTSU9OX0RFRkxBVEUpKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19TRVFVRU5DRUVSUk9SKTsKKworICBpZiAocERhdGEtPmJIYXNKU0VQKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19TRVFVRU5DRUVSUk9SKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm90IGFsbG93ZWQgZm9yIGRlbHRhdHlwZSBOT19DSEFOR0UgKi8KKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworICBpZiAoKHBEYXRhLT5iSGFzREhEUikgJiYgKChwRGF0YS0+aURlbHRhdHlwZSA9PSBNTkdfREVMVEFUWVBFX05PQ0hBTkdFKSkpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0NIVU5LTk9UQUxMT1dFRCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNhbiBvbmx5IGJlIGVtcHR5IGluIEJBU0ktYmxvY2shICovCisgIGlmICgoaVJhd2xlbiA9PSAwKSAmJiAoIXBEYXRhLT5iSGFzQkFTSSkpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURMRU5HVEgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5kZXhlZC1jb2xvciByZXF1aXJlcyBQTFRFICovCisgIGlmICgocERhdGEtPmJIYXNJSERSKSAmJiAocERhdGEtPmlDb2xvcnR5cGUgPT0gMykgJiYgKCFwRGF0YS0+Ykhhc1BMVEUpKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19QTFRFTUlTU0lORyk7CisKKyAgcERhdGEtPmJIYXNJREFUID0gTU5HX1RSVUU7ICAgICAgICAgIC8qIGdvdCBzb21lIElEQVQgbm93LCBkb24ndCB3ZSAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorICBpZiAoaVJhd2xlbikKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRpc3BsYXkgcHJvY2Vzc2luZyAqLworICAgIG1uZ19yZXRjb2RlIGlSZXRjb2RlID0gbW5nX3Byb2Nlc3NfZGlzcGxheV9pZGF0IChwRGF0YSwgaVJhd2xlbiwgcFJhd2RhdGEpOworCisgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgcmV0dXJuIGlSZXRjb2RlOworICB9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfRElTUExBWSAqLworCisjaWZkZWYgTU5HX1NUT1JFX0NIVU5LUworICBpZiAocERhdGEtPmJTdG9yZWNodW5rcykKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpemUgc3RvcmFnZSAqLworICAgIG1uZ19yZXRjb2RlIGlSZXRjb2RlID0gKChtbmdfY2h1bmtfaGVhZGVycClwSGVhZGVyKS0+ZkNyZWF0ZSAocERhdGEsIHBIZWFkZXIsIHBwQ2h1bmspOworCisgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgcmV0dXJuIGlSZXRjb2RlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmUgdGhlIGZpZWxkcyAqLworICAgICgobW5nX2lkYXRwKSpwcENodW5rKS0+YkVtcHR5ICAgID0gKG1uZ19ib29sKShpUmF3bGVuID09IDApOworICAgICgobW5nX2lkYXRwKSpwcENodW5rKS0+aURhdGFzaXplID0gaVJhd2xlbjsKKworICAgIGlmIChpUmF3bGVuICE9IDApICAgICAgICAgICAgICAgICAgLyogaXMgdGhlcmUgYW55IGRhdGEgPyAqLworICAgIHsKKyAgICAgIE1OR19BTExPQyAocERhdGEsICgobW5nX2lkYXRwKSpwcENodW5rKS0+cERhdGEsIGlSYXdsZW4pOworICAgICAgTU5HX0NPUFkgICgoKG1uZ19pZGF0cCkqcHBDaHVuayktPnBEYXRhLCBwUmF3ZGF0YSwgaVJhd2xlbik7CisgICAgfQorICB9CisjZW5kaWYgLyogTU5HX1NUT1JFX0NIVU5LUyAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1JFQURfSURBVCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7ICAgICAgICAgICAgICAgICAgLyogZG9uZSAqLworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCitSRUFEX0NIVU5LIChtbmdfcmVhZF9pZW5kKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9SRUFEX0lFTkQsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAoaVJhd2xlbiA+IDApICAgICAgICAgICAgICAgICAgICAgLyogbXVzdCBub3QgY29udGFpbiBkYXRhISAqLworICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElETEVOR1RIKTsKKworI2lmZGVmIE1OR19JTkNMVURFX0pORyAgICAgICAgICAgICAgICAgLyogc2VxdWVuY2UgY2hlY2tzICovCisgIGlmICgoIXBEYXRhLT5iSGFzSUhEUikgJiYgKCFwRGF0YS0+Ykhhc0JBU0kpICYmICghcERhdGEtPmJIYXNESERSKSAmJiAoIXBEYXRhLT5iSGFzSkhEUikpCisjZWxzZQorICBpZiAoKCFwRGF0YS0+Ykhhc0lIRFIpICYmICghcERhdGEtPmJIYXNCQVNJKSAmJiAoIXBEYXRhLT5iSGFzREhEUikpCisjZW5kaWYKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfU0VRVUVOQ0VFUlJPUik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJSERSLWJsb2NrIHJlcXVpcmVzIElEQVQgKi8KKyAgaWYgKChwRGF0YS0+Ykhhc0lIRFIpICYmICghcERhdGEtPmJIYXNJREFUKSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSURBVE1JU1NJTkcpOworCisgIHBEYXRhLT5pSW1hZ2VsZXZlbC0tOyAgICAgICAgICAgICAgICAvKiBvbmUgbGV2ZWwgdXAgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX0RJU1BMQVkKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSBhbiBhbmltYXRpb24gb2JqZWN0ICovCisgICAgbW5nX3JldGNvZGUgaVJldGNvZGUgPSBtbmdfY3JlYXRlX2FuaV9pbWFnZSAocERhdGEpOworICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRpc3BsYXkgcHJvY2Vzc2luZyAqLworICAgIGlSZXRjb2RlID0gbW5nX3Byb2Nlc3NfZGlzcGxheV9pZW5kIChwRGF0YSk7CisgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgcmV0dXJuIGlSZXRjb2RlOworICB9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfRElTUExBWSAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorICBpZiAoIXBEYXRhLT5iVGltZXJzZXQpICAgICAgICAgICAgICAgLyogcmVzZXQgb25seSBpZiBub3QgYnJva2VuICEhISAqLworICB7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElFTkQgc2lnbmFscyB0aGUgZW5kIGZvciBtb3N0IC4uLiAqLworICAgIHBEYXRhLT5iSGFzSUhEUiAgICAgICAgID0gTU5HX0ZBTFNFOworICAgIHBEYXRhLT5iSGFzQkFTSSAgICAgICAgID0gTU5HX0ZBTFNFOworICAgIHBEYXRhLT5iSGFzREhEUiAgICAgICAgID0gTU5HX0ZBTFNFOworI2lmZGVmIE1OR19JTkNMVURFX0pORworICAgIHBEYXRhLT5iSGFzSkhEUiAgICAgICAgID0gTU5HX0ZBTFNFOworICAgIHBEYXRhLT5iSGFzSlNFUCAgICAgICAgID0gTU5HX0ZBTFNFOworICAgIHBEYXRhLT5iSGFzSkRBQSAgICAgICAgID0gTU5HX0ZBTFNFOworICAgIHBEYXRhLT5iSGFzSkRBVCAgICAgICAgID0gTU5HX0ZBTFNFOworI2VuZGlmCisgICAgcERhdGEtPmJIYXNQTFRFICAgICAgICAgPSBNTkdfRkFMU0U7CisgICAgcERhdGEtPmJIYXNUUk5TICAgICAgICAgPSBNTkdfRkFMU0U7CisgICAgcERhdGEtPmJIYXNHQU1BICAgICAgICAgPSBNTkdfRkFMU0U7CisgICAgcERhdGEtPmJIYXNDSFJNICAgICAgICAgPSBNTkdfRkFMU0U7CisgICAgcERhdGEtPmJIYXNTUkdCICAgICAgICAgPSBNTkdfRkFMU0U7CisgICAgcERhdGEtPmJIYXNJQ0NQICAgICAgICAgPSBNTkdfRkFMU0U7CisgICAgcERhdGEtPmJIYXNCS0dEICAgICAgICAgPSBNTkdfRkFMU0U7CisgICAgcERhdGEtPmJIYXNJREFUICAgICAgICAgPSBNTkdfRkFMU0U7CisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorICB9CisjZW5kaWYKKworI2lmZGVmIE1OR19TVE9SRV9DSFVOS1MKKyAgaWYgKHBEYXRhLT5iU3RvcmVjaHVua3MpCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0aWFsaXplIHN0b3JhZ2UgKi8KKyAgICBtbmdfcmV0Y29kZSBpUmV0Y29kZSA9ICgobW5nX2NodW5rX2hlYWRlcnApcEhlYWRlciktPmZDcmVhdGUgKHBEYXRhLCBwSGVhZGVyLCBwcENodW5rKTsKKworICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgfQorI2VuZGlmIC8qIE1OR19TVE9SRV9DSFVOS1MgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9SRUFEX0lFTkQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOyAgICAgICAgICAgICAgICAgIC8qIGRvbmUgKi8KK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorUkVBRF9DSFVOSyAobW5nX3JlYWRfdHJucykKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVBRF9UUk5TLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXF1ZW5jZSBjaGVja3MgKi8KKyAgaWYgKCghcERhdGEtPmJIYXNNSERSKSAmJiAoIXBEYXRhLT5iSGFzSUhEUikgJiYKKyAgICAgICghcERhdGEtPmJIYXNCQVNJKSAmJiAoIXBEYXRhLT5iSGFzREhEUikgICAgKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19TRVFVRU5DRUVSUk9SKTsKKworI2lmZGVmIE1OR19JTkNMVURFX0pORworICBpZiAoKHBEYXRhLT5iSGFzSURBVCkgfHwgKHBEYXRhLT5iSGFzSkhEUikpCisjZWxzZQorICBpZiAocERhdGEtPmJIYXNJREFUKQorI2VuZGlmICAKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfU0VRVUVOQ0VFUlJPUik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtdWx0aXBsZSB0Uk5TIG9ubHkgaW5zaWRlIEJBU0kgKi8KKyAgaWYgKChwRGF0YS0+Ykhhc1RSTlMpICYmICghcERhdGEtPmJIYXNCQVNJKSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfTVVMVElQTEVFUlJPUik7CisKKyAgaWYgKGlSYXdsZW4gPiAyNTYpICAgICAgICAgICAgICAgICAgIC8qIGl0IGp1c3QgY2FuJ3QgYmUgYmlnZ2VyIHRoYW4gdGhhdCEgKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRExFTkdUSCk7CisKKyAgaWYgKChwRGF0YS0+Ykhhc0lIRFIpIHx8IChwRGF0YS0+Ykhhc0JBU0kpIHx8IChwRGF0YS0+Ykhhc0RIRFIpKQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm90IGFsbG93ZWQgd2l0aCBmdWxsIGFscGhhLWNoYW5uZWwgKi8KKyAgICBpZiAoKHBEYXRhLT5pQ29sb3J0eXBlID09IDQpIHx8IChwRGF0YS0+aUNvbG9ydHlwZSA9PSA2KSkKKyAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19DSFVOS05PVEFMTE9XRUQpOworCisgICAgaWYgKGlSYXdsZW4gIT0gMCkgICAgICAgICAgICAgICAgICAvKiBmaWxsZWQgPyAqLworICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIGNoZWNrcyAqLworICAgICAgaWYgKChwRGF0YS0+aUNvbG9ydHlwZSA9PSAwKSAmJiAoaVJhd2xlbiAhPSAyKSkKKyAgICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURMRU5HVEgpOworCisgICAgICBpZiAoKHBEYXRhLT5pQ29sb3J0eXBlID09IDIpICYmIChpUmF3bGVuICE9IDYpKQorICAgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRExFTkdUSCk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCisgICAgICBpZiAocERhdGEtPmlDb2xvcnR5cGUgPT0gMykKKyAgICAgIHsKKyAgICAgICAgbW5nX2ltYWdlcCAgICAgcEltYWdlID0gKG1uZ19pbWFnZXApcERhdGEtPnBDdXJyZW50b2JqOworICAgICAgICBtbmdfaW1hZ2VkYXRhcCBwQnVmOworCisgICAgICAgIGlmICghcEltYWdlKSAgICAgICAgICAgICAgICAgICAvKiBubyBvYmplY3QgdGhlbiBjaGVjayBvYmogMCAqLworICAgICAgICAgIHBJbWFnZSA9IChtbmdfaW1hZ2VwKXBEYXRhLT5wT2JqemVybzsKKworICAgICAgICBwQnVmID0gcEltYWdlLT5wSW1nYnVmOyAgICAgICAgLyogYWRkcmVzcyBvYmplY3QgYnVmZmVyICovCisKKyAgICAgICAgaWYgKGlSYXdsZW4gPiBwQnVmLT5pUExURWNvdW50KQorICAgICAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElETEVOR1RIKTsKKyAgICAgIH0KKyNlbmRpZgorICAgIH0KKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmIGVtcHR5IHRoZXJlIG11c3QgYmUgZ2xvYmFsIHN0dWZmISAqLworICAgIHsKKyAgICAgIGlmICghcERhdGEtPmJIYXNnbG9iYWxUUk5TKQorICAgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfQ0FOTk9UQkVFTVBUWSk7CisgICAgfQorICB9CisKKyAgaWYgKChwRGF0YS0+Ykhhc0lIRFIpIHx8IChwRGF0YS0+Ykhhc0JBU0kpIHx8IChwRGF0YS0+Ykhhc0RIRFIpKQorICAgIHBEYXRhLT5iSGFzVFJOUyA9IE1OR19UUlVFOyAgICAgICAgLyogaW5kaWNhdGUgdFJOUyBhdmFpbGFibGUgKi8KKyAgZWxzZQorICAgIHBEYXRhLT5iSGFzZ2xvYmFsVFJOUyA9IE1OR19UUlVFOworCisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorICBpZiAoKHBEYXRhLT5iSGFzSUhEUikgfHwgKHBEYXRhLT5iSGFzQkFTSSkgfHwgKHBEYXRhLT5iSGFzREhEUikpCisgIHsKKyAgICBtbmdfaW1hZ2VwICAgICBwSW1hZ2U7CisgICAgbW5nX2ltYWdlZGF0YXAgcEJ1ZjsKKyAgICBtbmdfdWludDhwICAgICBwUmF3ZGF0YTI7CisgICAgbW5nX3VpbnQzMiAgICAgaVJhd2xlbjI7CisKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworICAgIGlmIChwRGF0YS0+Ykhhc0RIRFIpICAgICAgICAgICAgICAgLyogcHJvY2Vzc2luZyBkZWx0YS1pbWFnZSA/ICovCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZSBpbiBvYmplY3QgMCAhISEgKi8KKyAgICAgIHBJbWFnZSA9IChtbmdfaW1hZ2VwKXBEYXRhLT5wT2JqemVybzsKKyAgICAgIHBCdWYgICA9IHBJbWFnZS0+cEltZ2J1ZjsgICAgICAgIC8qIGFkZHJlc3Mgb2JqZWN0IGJ1ZmZlciAqLworCisgICAgICBzd2l0Y2ggKHBEYXRhLT5pQ29sb3J0eXBlKSAgICAgICAvKiBzdG9yZSBmaWVsZHMgZm9yIGZ1dHVyZSByZWZlcmVuY2UgKi8KKyAgICAgIHsKKyAgICAgICAgY2FzZSAwOiB7ICAgICAgICAgICAgICAgICAgICAgIC8qIGdyYXkgKi8KKyNpZiBkZWZpbmVkKE1OR19OT18xXzJfNEJJVF9TVVBQT1JUKQorICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4IG11bHRpcGxpZXJbXT17MCwyNTUsODUsMCwxNywwLDAsMCwxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwwLDAsMCwwLDAsMCwxfTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgcEJ1Zi0+aVRSTlNncmF5ICA9IG1uZ19nZXRfdWludDE2IChwUmF3ZGF0YSk7CisgICAgICAgICAgICAgICAgICBwQnVmLT5pVFJOU3JlZCAgID0gMDsKKyAgICAgICAgICAgICAgICAgIHBCdWYtPmlUUk5TZ3JlZW4gPSAwOworICAgICAgICAgICAgICAgICAgcEJ1Zi0+aVRSTlNibHVlICA9IDA7CisgICAgICAgICAgICAgICAgICBwQnVmLT5pVFJOU2NvdW50ID0gMDsKKyNpZiBkZWZpbmVkKE1OR19OT18xXzJfNEJJVF9TVVBQT1JUKQorICAgICAgICAgICAgICAgICAgcEJ1Zi0+aVRSTlNncmF5ICo9IG11bHRpcGxpZXJbcERhdGEtPmlQTkdkZXB0aF07CisjZW5kaWYKKyNpZiBkZWZpbmVkKE1OR19OT18xNkJJVF9TVVBQT1JUKQorICAgICAgICAgICAgICAgICAgaWYgKHBEYXRhLT5pUE5HbXVsdCA9PSAyKQorICAgICAgICAgICAgICAgICAgICAgcEJ1Zi0+aVRSTlNncmF5ID4+PSA4OworI2VuZGlmCisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIGNhc2UgMjogeyAgICAgICAgICAgICAgICAgICAgICAvKiByZ2IgKi8KKyAgICAgICAgICAgICAgICAgIHBCdWYtPmlUUk5TZ3JheSAgPSAwOworICAgICAgICAgICAgICAgICAgcEJ1Zi0+aVRSTlNyZWQgICA9IG1uZ19nZXRfdWludDE2IChwUmF3ZGF0YSk7CisgICAgICAgICAgICAgICAgICBwQnVmLT5pVFJOU2dyZWVuID0gbW5nX2dldF91aW50MTYgKHBSYXdkYXRhKzIpOworICAgICAgICAgICAgICAgICAgcEJ1Zi0+aVRSTlNibHVlICA9IG1uZ19nZXRfdWludDE2IChwUmF3ZGF0YSs0KTsKKyAgICAgICAgICAgICAgICAgIHBCdWYtPmlUUk5TY291bnQgPSAwOworI2lmIGRlZmluZWQoTU5HX05PXzE2QklUX1NVUFBPUlQpCisgICAgICAgICAgICAgICAgICBpZiAocERhdGEtPmlQTkdtdWx0ID09IDIpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBwQnVmLT5pVFJOU3JlZCAgID4+PSA4OworICAgICAgICAgICAgICAgICAgICAgcEJ1Zi0+aVRSTlNncmVlbiA+Pj0gODsKKyAgICAgICAgICAgICAgICAgICAgIHBCdWYtPmlUUk5TYmx1ZSAgPj49IDg7CisgICAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSAzOiB7ICAgICAgICAgICAgICAgICAgICAgIC8qIGluZGV4ZWQgKi8KKyAgICAgICAgICAgICAgICAgIHBCdWYtPmlUUk5TZ3JheSAgPSAwOworICAgICAgICAgICAgICAgICAgcEJ1Zi0+aVRSTlNyZWQgICA9IDA7CisgICAgICAgICAgICAgICAgICBwQnVmLT5pVFJOU2dyZWVuID0gMDsKKyAgICAgICAgICAgICAgICAgIHBCdWYtPmlUUk5TYmx1ZSAgPSAwOworICAgICAgICAgICAgICAgICAgcEJ1Zi0+aVRSTlNjb3VudCA9IGlSYXdsZW47CisgICAgICAgICAgICAgICAgICBNTkdfQ09QWSAocEJ1Zi0+YVRSTlNlbnRyaWVzLCBwUmF3ZGF0YSwgaVJhd2xlbik7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHBCdWYtPmJIYXNUUk5TID0gTU5HX1RSVUU7ICAgICAgIC8qIHRlbGwgaXQgaXQncyBnb3QgYSB0Uk5TIG5vdyAqLworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHJlc3MgY3VycmVudCBvYmplY3QgKi8KKyAgICAgIHBJbWFnZSA9IChtbmdfaW1hZ2VwKXBEYXRhLT5wQ3VycmVudG9iajsKKworICAgICAgaWYgKCFwSW1hZ2UpICAgICAgICAgICAgICAgICAgICAgLyogbm8gb2JqZWN0IHRoZW4gZHVtcCBpdCBpbiBvYmogMCAqLworICAgICAgICBwSW1hZ2UgPSAobW5nX2ltYWdlcClwRGF0YS0+cE9ianplcm87CisKKyAgICAgIHBCdWYgPSBwSW1hZ2UtPnBJbWdidWY7ICAgICAgICAgIC8qIGFkZHJlc3Mgb2JqZWN0IGJ1ZmZlciAqLworICAgICAgcEJ1Zi0+Ykhhc1RSTlMgPSBNTkdfVFJVRTsgICAgICAgLyogYW5kIHRlbGwgaXQgaXQncyBnb3QgYSB0Uk5TIG5vdyAqLworCisgICAgICBpZiAoaVJhd2xlbiA9PSAwKSAgICAgICAgICAgICAgICAvKiBpZiBlbXB0eSwgaW5oZXJpdCBmcm9tIGdsb2JhbCAqLworICAgICAgeworICAgICAgICBpUmF3bGVuMiAgPSBwRGF0YS0+aUdsb2JhbFRSTlNyYXdsZW47CisgICAgICAgIHBSYXdkYXRhMiA9IChtbmdfcHRyKShwRGF0YS0+YUdsb2JhbFRSTlNyYXdkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2xvYmFsIGxlbmd0aCBva2UgPyAqLworICAgICAgICBpZiAoKHBEYXRhLT5pQ29sb3J0eXBlID09IDApICYmIChpUmF3bGVuMiAhPSAyKSkKKyAgICAgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfR0xPQkFMTEVOR1RIRVJSKTsKKworICAgICAgICBpZiAoKHBEYXRhLT5pQ29sb3J0eXBlID09IDIpICYmIChpUmF3bGVuMiAhPSA2KSkKKyAgICAgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfR0xPQkFMTEVOR1RIRVJSKTsKKworICAgICAgICBpZiAoKHBEYXRhLT5pQ29sb3J0eXBlID09IDMpICYmICgoaVJhd2xlbjIgPT0gMCkgfHwgKGlSYXdsZW4yID4gcEJ1Zi0+aVBMVEVjb3VudCkpKQorICAgICAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19HTE9CQUxMRU5HVEhFUlIpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBpUmF3bGVuMiAgPSBpUmF3bGVuOworICAgICAgICBwUmF3ZGF0YTIgPSBwUmF3ZGF0YTsKKyAgICAgIH0KKworICAgICAgc3dpdGNoIChwRGF0YS0+aUNvbG9ydHlwZSkgICAgICAgIC8qIHN0b3JlIGZpZWxkcyBmb3IgZnV0dXJlIHJlZmVyZW5jZSAqLworICAgICAgeworICAgICAgICBjYXNlIDA6IHsgICAgICAgICAgICAgICAgICAgICAgLyogZ3JheSAqLworICAgICAgICAgICAgICAgICAgcEJ1Zi0+aVRSTlNncmF5ICA9IG1uZ19nZXRfdWludDE2IChwUmF3ZGF0YTIpOworICAgICAgICAgICAgICAgICAgcEJ1Zi0+aVRSTlNyZWQgICA9IDA7CisgICAgICAgICAgICAgICAgICBwQnVmLT5pVFJOU2dyZWVuID0gMDsKKyAgICAgICAgICAgICAgICAgIHBCdWYtPmlUUk5TYmx1ZSAgPSAwOworICAgICAgICAgICAgICAgICAgcEJ1Zi0+aVRSTlNjb3VudCA9IDA7CisjaWYgZGVmaW5lZChNTkdfTk9fMTZCSVRfU1VQUE9SVCkKKyAgICAgICAgICAgICAgICAgIGlmIChwRGF0YS0+aVBOR211bHQgPT0gMikKKyAgICAgICAgICAgICAgICAgICAgIHBCdWYtPmlUUk5TZ3JheSA+Pj0gODsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICBjYXNlIDI6IHsgICAgICAgICAgICAgICAgICAgICAgLyogcmdiICovCisgICAgICAgICAgICAgICAgICBwQnVmLT5pVFJOU2dyYXkgID0gMDsKKyAgICAgICAgICAgICAgICAgIHBCdWYtPmlUUk5TcmVkICAgPSBtbmdfZ2V0X3VpbnQxNiAocFJhd2RhdGEyKTsKKyAgICAgICAgICAgICAgICAgIHBCdWYtPmlUUk5TZ3JlZW4gPSBtbmdfZ2V0X3VpbnQxNiAocFJhd2RhdGEyKzIpOworICAgICAgICAgICAgICAgICAgcEJ1Zi0+aVRSTlNibHVlICA9IG1uZ19nZXRfdWludDE2IChwUmF3ZGF0YTIrNCk7CisgICAgICAgICAgICAgICAgICBwQnVmLT5pVFJOU2NvdW50ID0gMDsKKyNpZiBkZWZpbmVkKE1OR19OT18xNkJJVF9TVVBQT1JUKQorICAgICAgICAgICAgICAgICAgaWYgKHBEYXRhLT5pUE5HbXVsdCA9PSAyKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgcEJ1Zi0+aVRSTlNyZWQgICA+Pj0gODsKKyAgICAgICAgICAgICAgICAgICAgIHBCdWYtPmlUUk5TZ3JlZW4gPj49IDg7CisgICAgICAgICAgICAgICAgICAgICBwQnVmLT5pVFJOU2JsdWUgID4+PSA4OworICAgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIGNhc2UgMzogeyAgICAgICAgICAgICAgICAgICAgICAvKiBpbmRleGVkICovCisgICAgICAgICAgICAgICAgICBwQnVmLT5pVFJOU2dyYXkgID0gMDsKKyAgICAgICAgICAgICAgICAgIHBCdWYtPmlUUk5TcmVkICAgPSAwOworICAgICAgICAgICAgICAgICAgcEJ1Zi0+aVRSTlNncmVlbiA9IDA7CisgICAgICAgICAgICAgICAgICBwQnVmLT5pVFJOU2JsdWUgID0gMDsKKyAgICAgICAgICAgICAgICAgIHBCdWYtPmlUUk5TY291bnQgPSBpUmF3bGVuMjsKKyAgICAgICAgICAgICAgICAgIE1OR19DT1BZIChwQnVmLT5hVFJOU2VudHJpZXMsIHBSYXdkYXRhMiwgaVJhd2xlbjIpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgfQorICAgIH0gIAorICB9CisgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZSBhcyBnbG9iYWwgKi8KKyAgeworICAgIHBEYXRhLT5pR2xvYmFsVFJOU3Jhd2xlbiA9IGlSYXdsZW47CisgICAgTU5HX0NPUFkgKHBEYXRhLT5hR2xvYmFsVFJOU3Jhd2RhdGEsIHBSYXdkYXRhLCBpUmF3bGVuKTsKKworICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIGFuIGFuaW1hdGlvbiBvYmplY3QgKi8KKyAgICAgIG1uZ19yZXRjb2RlIGlSZXRjb2RlID0gbW5nX2NyZWF0ZV9hbmlfdHJucyAocERhdGEsIHBEYXRhLT5pR2xvYmFsVFJOU3Jhd2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmFHbG9iYWxUUk5TcmF3ZGF0YSk7CisKKyAgICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICB9CisgIH0KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisKKyNpZmRlZiBNTkdfU1RPUkVfQ0hVTktTCisgIGlmIChwRGF0YS0+YlN0b3JlY2h1bmtzKQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdGlhbGl6ZSBzdG9yYWdlICovCisgICAgbW5nX3JldGNvZGUgaVJldGNvZGUgPSAoKG1uZ19jaHVua19oZWFkZXJwKXBIZWFkZXIpLT5mQ3JlYXRlIChwRGF0YSwgcEhlYWRlciwgcHBDaHVuayk7CisKKyAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICByZXR1cm4gaVJldGNvZGU7CisKKyAgICBpZiAoKHBEYXRhLT5iSGFzSUhEUikgfHwgKHBEYXRhLT5iSGFzQkFTSSkgfHwgKHBEYXRhLT5iSGFzREhEUikpCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3QgZ2xvYmFsISAqLworICAgICAgKChtbmdfdHJuc3ApKnBwQ2h1bmspLT5iR2xvYmFsICA9IE1OR19GQUxTRTsKKyAgICAgICgobW5nX3RybnNwKSpwcENodW5rKS0+aVR5cGUgICAgPSBwRGF0YS0+aUNvbG9ydHlwZTsKKworICAgICAgaWYgKGlSYXdsZW4gPT0gMCkgICAgICAgICAgICAgICAgLyogaWYgZW1wdHksIGluZGljYXRlIHNvICovCisgICAgICAgICgobW5nX3RybnNwKSpwcENodW5rKS0+YkVtcHR5ID0gTU5HX1RSVUU7CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICgobW5nX3RybnNwKSpwcENodW5rKS0+YkVtcHR5ID0gTU5HX0ZBTFNFOworCisgICAgICAgIHN3aXRjaCAocERhdGEtPmlDb2xvcnR5cGUpICAgICAvKiBzdG9yZSBmaWVsZHMgKi8KKyAgICAgICAgeworICAgICAgICAgIGNhc2UgMDogeyAgICAgICAgICAgICAgICAgICAgLyogZ3JheSAqLworICAgICAgICAgICAgICAgICAgICAoKG1uZ190cm5zcCkqcHBDaHVuayktPmlHcmF5ICA9IG1uZ19nZXRfdWludDE2IChwUmF3ZGF0YSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgIGNhc2UgMjogeyAgICAgICAgICAgICAgICAgICAgLyogcmdiICovCisgICAgICAgICAgICAgICAgICAgICgobW5nX3RybnNwKSpwcENodW5rKS0+aVJlZCAgID0gbW5nX2dldF91aW50MTYgKHBSYXdkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgKChtbmdfdHJuc3ApKnBwQ2h1bmspLT5pR3JlZW4gPSBtbmdfZ2V0X3VpbnQxNiAocFJhd2RhdGErMik7CisgICAgICAgICAgICAgICAgICAgICgobW5nX3RybnNwKSpwcENodW5rKS0+aUJsdWUgID0gbW5nX2dldF91aW50MTYgKHBSYXdkYXRhKzQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlIDM6IHsgICAgICAgICAgICAgICAgICAgIC8qIGluZGV4ZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgKChtbmdfdHJuc3ApKnBwQ2h1bmspLT5pQ291bnQgPSBpUmF3bGVuOworICAgICAgICAgICAgICAgICAgICBNTkdfQ09QWSAoKChtbmdfdHJuc3ApKnBwQ2h1bmspLT5hRW50cmllcywgcFJhd2RhdGEsIGlSYXdsZW4pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGl0J3MgZ2xvYmFsISAqLworICAgIHsKKyAgICAgICgobW5nX3RybnNwKSpwcENodW5rKS0+YkVtcHR5ICA9IChtbmdfYm9vbCkoaVJhd2xlbiA9PSAwKTsKKyAgICAgICgobW5nX3RybnNwKSpwcENodW5rKS0+Ykdsb2JhbCA9IE1OR19UUlVFOworICAgICAgKChtbmdfdHJuc3ApKnBwQ2h1bmspLT5pVHlwZSAgID0gMDsKKyAgICAgICgobW5nX3RybnNwKSpwcENodW5rKS0+aVJhd2xlbiA9IGlSYXdsZW47CisKKyAgICAgIE1OR19DT1BZICgoKG1uZ190cm5zcCkqcHBDaHVuayktPmFSYXdkYXRhLCBwUmF3ZGF0YSwgaVJhd2xlbik7CisgICAgfQorICB9CisjZW5kaWYgLyogTU5HX1NUT1JFX0NIVU5LUyAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1JFQURfVFJOUywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7ICAgICAgICAgICAgICAgICAgLyogZG9uZSAqLworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCitSRUFEX0NIVU5LIChtbmdfcmVhZF9nYW1hKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9SRUFEX0dBTUEsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNlcXVlbmNlIGNoZWNrcyAqLworI2lmZGVmIE1OR19JTkNMVURFX0pORworICBpZiAoKCFwRGF0YS0+Ykhhc01IRFIpICYmICghcERhdGEtPmJIYXNJSERSKSAmJgorICAgICAgKCFwRGF0YS0+Ykhhc0JBU0kpICYmICghcERhdGEtPmJIYXNESERSKSAmJiAoIXBEYXRhLT5iSGFzSkhEUikpCisjZWxzZQorICBpZiAoKCFwRGF0YS0+Ykhhc01IRFIpICYmICghcERhdGEtPmJIYXNJSERSKSAmJgorICAgICAgKCFwRGF0YS0+Ykhhc0JBU0kpICYmICghcERhdGEtPmJIYXNESERSKSAgICApCisjZW5kaWYKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfU0VRVUVOQ0VFUlJPUik7CisKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgaWYgKChwRGF0YS0+Ykhhc0lEQVQpIHx8IChwRGF0YS0+Ykhhc1BMVEUpIHx8IChwRGF0YS0+Ykhhc0pEQVQpIHx8IChwRGF0YS0+Ykhhc0pEQUEpKQorI2Vsc2UKKyAgaWYgKChwRGF0YS0+Ykhhc0lEQVQpIHx8IChwRGF0YS0+Ykhhc1BMVEUpKQorI2VuZGlmCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1NFUVVFTkNFRVJST1IpOworCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisgIGlmICgocERhdGEtPmJIYXNJSERSKSB8fCAocERhdGEtPmJIYXNCQVNJKSB8fCAocERhdGEtPmJIYXNESERSKSB8fCAocERhdGEtPmJIYXNKSERSKSkKKyNlbHNlCisgIGlmICgocERhdGEtPmJIYXNJSERSKSB8fCAocERhdGEtPmJIYXNCQVNJKSB8fCAocERhdGEtPmJIYXNESERSKSkKKyNlbmRpZgorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG11c3QgYmUgZXhhY3RseSA0ICovCisgICAgaWYgKGlSYXdsZW4gIT0gNCkKKyAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElETEVOR1RIKTsKKyAgfQorICBlbHNlCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggbXVzdCBiZSBlbXB0eSBvciBleGFjdGx5IDQgKi8KKyAgICBpZiAoKGlSYXdsZW4gIT0gMCkgJiYgKGlSYXdsZW4gIT0gNCkpCisgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRExFTkdUSCk7CisgIH0KKworI2lmZGVmIE1OR19JTkNMVURFX0pORworICBpZiAoKHBEYXRhLT5iSGFzSUhEUikgfHwgKHBEYXRhLT5iSGFzQkFTSSkgfHwgKHBEYXRhLT5iSGFzREhEUikgfHwgKHBEYXRhLT5iSGFzSkhEUikpCisjZWxzZQorICBpZiAoKHBEYXRhLT5iSGFzSUhEUikgfHwgKHBEYXRhLT5iSGFzQkFTSSkgfHwgKHBEYXRhLT5iSGFzREhEUikpCisjZW5kaWYKKyAgICBwRGF0YS0+Ykhhc0dBTUEgPSBNTkdfVFJVRTsgICAgICAgIC8qIGluZGljYXRlIHdlJ3ZlIGdvdCBpdCAqLworICBlbHNlCisgICAgcERhdGEtPmJIYXNnbG9iYWxHQU1BID0gKG1uZ19ib29sKShpUmF3bGVuICE9IDApOworCisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorI2lmZGVmIE1OR19JTkNMVURFX0pORworICBpZiAoKHBEYXRhLT5iSGFzSUhEUikgfHwgKHBEYXRhLT5iSGFzQkFTSSkgfHwgKHBEYXRhLT5iSGFzREhEUikgfHwgKHBEYXRhLT5iSGFzSkhEUikpCisjZWxzZQorICBpZiAoKHBEYXRhLT5iSGFzSUhEUikgfHwgKHBEYXRhLT5iSGFzQkFTSSkgfHwgKHBEYXRhLT5iSGFzREhEUikpCisjZW5kaWYKKyAgeworICAgIG1uZ19pbWFnZXAgcEltYWdlOworCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKKyAgICBpZiAocERhdGEtPmJIYXNESERSKSAgICAgICAgICAgICAgIC8qIHVwZGF0ZSBkZWx0YSBpbWFnZSA/ICovCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZSBpbiBvYmplY3QgMCAhICovCisgICAgICBwSW1hZ2UgPSAobW5nX2ltYWdlcClwRGF0YS0+cE9ianplcm87CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZSBmb3IgY29sb3ItcHJvY2Vzc2luZyByb3V0aW5lcyAqLworICAgICAgcEltYWdlLT5wSW1nYnVmLT5pR2FtbWEgICA9IG1uZ19nZXRfdWludDMyIChwUmF3ZGF0YSk7CisgICAgICBwSW1hZ2UtPnBJbWdidWYtPmJIYXNHQU1BID0gTU5HX1RSVUU7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgIHsKKyAgICAgIHBJbWFnZSA9IChtbmdfaW1hZ2VwKXBEYXRhLT5wQ3VycmVudG9iajsKKworICAgICAgaWYgKCFwSW1hZ2UpICAgICAgICAgICAgICAgICAgICAgLyogbm8gb2JqZWN0IHRoZW4gZHVtcCBpdCBpbiBvYmogMCAqLworICAgICAgICBwSW1hZ2UgPSAobW5nX2ltYWdlcClwRGF0YS0+cE9ianplcm87CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZSBmb3IgY29sb3ItcHJvY2Vzc2luZyByb3V0aW5lcyAqLworICAgICAgcEltYWdlLT5wSW1nYnVmLT5pR2FtbWEgICA9IG1uZ19nZXRfdWludDMyIChwUmF3ZGF0YSk7CisgICAgICBwSW1hZ2UtPnBJbWdidWYtPmJIYXNHQU1BID0gTU5HX1RSVUU7CisgICAgfQorICB9CisgIGVsc2UKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlIGFzIGdsb2JhbCAqLworICAgIGlmIChpUmF3bGVuICE9IDApCisgICAgICBwRGF0YS0+aUdsb2JhbEdhbW1hID0gbW5nX2dldF91aW50MzIgKHBSYXdkYXRhKTsKKworICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIGFuIGFuaW1hdGlvbiBvYmplY3QgKi8KKyAgICAgIG1uZ19yZXRjb2RlIGlSZXRjb2RlID0gbW5nX2NyZWF0ZV9hbmlfZ2FtYSAocERhdGEsIChtbmdfYm9vbCkoaVJhd2xlbiA9PSAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlHbG9iYWxHYW1tYSk7CisKKyAgICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICB9CisgIH0KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisKKyNpZmRlZiBNTkdfU1RPUkVfQ0hVTktTCisgIGlmIChwRGF0YS0+YlN0b3JlY2h1bmtzKQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdGlhbGl6ZSBzdG9yYWdlICovCisgICAgbW5nX3JldGNvZGUgaVJldGNvZGUgPSAoKG1uZ19jaHVua19oZWFkZXJwKXBIZWFkZXIpLT5mQ3JlYXRlIChwRGF0YSwgcEhlYWRlciwgcHBDaHVuayk7CisKKyAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZSB0aGUgZmllbGRzICovCisgICAgKChtbmdfZ2FtYXApKnBwQ2h1bmspLT5iRW1wdHkgPSAobW5nX2Jvb2wpKGlSYXdsZW4gPT0gMCk7CisKKyAgICBpZiAoaVJhd2xlbikKKyAgICAgICgobW5nX2dhbWFwKSpwcENodW5rKS0+aUdhbW1hID0gbW5nX2dldF91aW50MzIgKHBSYXdkYXRhKTsKKworICB9CisjZW5kaWYgLyogTU5HX1NUT1JFX0NIVU5LUyAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1JFQURfR0FNQSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7ICAgICAgICAgICAgICAgICAgLyogZG9uZSAqLworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfY0hSTQorUkVBRF9DSFVOSyAobW5nX3JlYWRfY2hybSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVBRF9DSFJNLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXF1ZW5jZSBjaGVja3MgKi8KKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgaWYgKCghcERhdGEtPmJIYXNNSERSKSAmJiAoIXBEYXRhLT5iSGFzSUhEUikgJiYKKyAgICAgICghcERhdGEtPmJIYXNCQVNJKSAmJiAoIXBEYXRhLT5iSGFzREhEUikgJiYgKCFwRGF0YS0+Ykhhc0pIRFIpKQorI2Vsc2UKKyAgaWYgKCghcERhdGEtPmJIYXNNSERSKSAmJiAoIXBEYXRhLT5iSGFzSUhEUikgJiYKKyAgICAgICghcERhdGEtPmJIYXNCQVNJKSAmJiAoIXBEYXRhLT5iSGFzREhEUikgICAgKQorI2VuZGlmCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1NFUVVFTkNFRVJST1IpOworCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisgIGlmICgocERhdGEtPmJIYXNJREFUKSB8fCAocERhdGEtPmJIYXNQTFRFKSB8fCAocERhdGEtPmJIYXNKREFUKSB8fCAocERhdGEtPmJIYXNKREFBKSkKKyNlbHNlCisgIGlmICgocERhdGEtPmJIYXNJREFUKSB8fCAocERhdGEtPmJIYXNQTFRFKSkKKyNlbmRpZgorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19TRVFVRU5DRUVSUk9SKTsKKworI2lmZGVmIE1OR19JTkNMVURFX0pORworICBpZiAoKHBEYXRhLT5iSGFzSUhEUikgfHwgKHBEYXRhLT5iSGFzQkFTSSkgfHwgKHBEYXRhLT5iSGFzREhEUikgfHwgKHBEYXRhLT5iSGFzSkhEUikpCisjZWxzZQorICBpZiAoKHBEYXRhLT5iSGFzSUhEUikgfHwgKHBEYXRhLT5iSGFzQkFTSSkgfHwgKHBEYXRhLT5iSGFzREhEUikpCisjZW5kaWYKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBtdXN0IGJlIGV4YWN0bHkgMzIgKi8KKyAgICBpZiAoaVJhd2xlbiAhPSAzMikKKyAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElETEVOR1RIKTsKKyAgfQorICBlbHNlCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggbXVzdCBiZSBlbXB0eSBvciBleGFjdGx5IDMyICovCisgICAgaWYgKChpUmF3bGVuICE9IDApICYmIChpUmF3bGVuICE9IDMyKSkKKyAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElETEVOR1RIKTsKKyAgfQorCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisgIGlmICgocERhdGEtPmJIYXNJSERSKSB8fCAocERhdGEtPmJIYXNCQVNJKSB8fCAocERhdGEtPmJIYXNESERSKSB8fCAocERhdGEtPmJIYXNKSERSKSkKKyNlbHNlCisgIGlmICgocERhdGEtPmJIYXNJSERSKSB8fCAocERhdGEtPmJIYXNCQVNJKSB8fCAocERhdGEtPmJIYXNESERSKSkKKyNlbmRpZgorICAgIHBEYXRhLT5iSGFzQ0hSTSA9IE1OR19UUlVFOyAgICAgICAgLyogaW5kaWNhdGUgd2UndmUgZ290IGl0ICovCisgIGVsc2UKKyAgICBwRGF0YS0+Ykhhc2dsb2JhbENIUk0gPSAobW5nX2Jvb2wpKGlSYXdsZW4gIT0gMCk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCisgIHsKKyAgICBtbmdfdWludDMyIGlXaGl0ZXBvaW50eCwgICBpV2hpdGVwb2ludHk7CisgICAgbW5nX3VpbnQzMiBpUHJpbWFyeXJlZHgsICAgaVByaW1hcnlyZWR5OworICAgIG1uZ191aW50MzIgaVByaW1hcnlncmVlbngsIGlQcmltYXJ5Z3JlZW55OworICAgIG1uZ191aW50MzIgaVByaW1hcnlibHVleCwgIGlQcmltYXJ5Ymx1ZXk7CisKKyAgICBpV2hpdGVwb2ludHggICA9IG1uZ19nZXRfdWludDMyIChwUmF3ZGF0YSk7CisgICAgaVdoaXRlcG9pbnR5ICAgPSBtbmdfZ2V0X3VpbnQzMiAocFJhd2RhdGErNCk7CisgICAgaVByaW1hcnlyZWR4ICAgPSBtbmdfZ2V0X3VpbnQzMiAocFJhd2RhdGErOCk7CisgICAgaVByaW1hcnlyZWR5ICAgPSBtbmdfZ2V0X3VpbnQzMiAocFJhd2RhdGErMTIpOworICAgIGlQcmltYXJ5Z3JlZW54ID0gbW5nX2dldF91aW50MzIgKHBSYXdkYXRhKzE2KTsKKyAgICBpUHJpbWFyeWdyZWVueSA9IG1uZ19nZXRfdWludDMyIChwUmF3ZGF0YSsyMCk7CisgICAgaVByaW1hcnlibHVleCAgPSBtbmdfZ2V0X3VpbnQzMiAocFJhd2RhdGErMjQpOworICAgIGlQcmltYXJ5Ymx1ZXkgID0gbW5nX2dldF91aW50MzIgKHBSYXdkYXRhKzI4KTsKKworI2lmZGVmIE1OR19JTkNMVURFX0pORworICAgIGlmICgocERhdGEtPmJIYXNJSERSKSB8fCAocERhdGEtPmJIYXNCQVNJKSB8fCAocERhdGEtPmJIYXNESERSKSB8fCAocERhdGEtPmJIYXNKSERSKSkKKyNlbHNlCisgICAgaWYgKChwRGF0YS0+Ykhhc0lIRFIpIHx8IChwRGF0YS0+Ykhhc0JBU0kpIHx8IChwRGF0YS0+Ykhhc0RIRFIpKQorI2VuZGlmCisgICAgeworICAgICAgbW5nX2ltYWdlcCAgICAgcEltYWdlOworICAgICAgbW5nX2ltYWdlZGF0YXAgcEJ1ZjsKKworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisgICAgICBpZiAocERhdGEtPmJIYXNESERSKSAgICAgICAgICAgICAvKiB1cGRhdGUgZGVsdGEgaW1hZ2UgPyAqLworICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmUgaXQgaW4gb2JqZWN0IDAgISAqLworICAgICAgICBwSW1hZ2UgPSAobW5nX2ltYWdlcClwRGF0YS0+cE9ianplcm87CisKKyAgICAgICAgcEJ1ZiA9IHBJbWFnZS0+cEltZ2J1ZjsgICAgICAgIC8qIGFkZHJlc3Mgb2JqZWN0IGJ1ZmZlciAqLworICAgICAgICBwQnVmLT5iSGFzQ0hSTSA9IE1OR19UUlVFOyAgICAgLyogYW5kIHRlbGwgaXQgaXQncyBnb3QgYSBDSFJNIG5vdyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmUgZm9yIGNvbG9yLXByb2Nlc3Npbmcgcm91dGluZXMgKi8KKyAgICAgICAgcEJ1Zi0+aVdoaXRlcG9pbnR4ICAgPSBpV2hpdGVwb2ludHg7CisgICAgICAgIHBCdWYtPmlXaGl0ZXBvaW50eSAgID0gaVdoaXRlcG9pbnR5OworICAgICAgICBwQnVmLT5pUHJpbWFyeXJlZHggICA9IGlQcmltYXJ5cmVkeDsKKyAgICAgICAgcEJ1Zi0+aVByaW1hcnlyZWR5ICAgPSBpUHJpbWFyeXJlZHk7CisgICAgICAgIHBCdWYtPmlQcmltYXJ5Z3JlZW54ID0gaVByaW1hcnlncmVlbng7CisgICAgICAgIHBCdWYtPmlQcmltYXJ5Z3JlZW55ID0gaVByaW1hcnlncmVlbnk7CisgICAgICAgIHBCdWYtPmlQcmltYXJ5Ymx1ZXggID0gaVByaW1hcnlibHVleDsKKyAgICAgICAgcEJ1Zi0+aVByaW1hcnlibHVleSAgPSBpUHJpbWFyeWJsdWV5OworICAgICAgfQorICAgICAgZWxzZQorI2VuZGlmCisgICAgICB7CisgICAgICAgIHBJbWFnZSA9IChtbmdfaW1hZ2VwKXBEYXRhLT5wQ3VycmVudG9iajsKKworICAgICAgICBpZiAoIXBJbWFnZSkgICAgICAgICAgICAgICAgICAgLyogbm8gb2JqZWN0IHRoZW4gZHVtcCBpdCBpbiBvYmogMCAqLworICAgICAgICAgIHBJbWFnZSA9IChtbmdfaW1hZ2VwKXBEYXRhLT5wT2JqemVybzsKKworICAgICAgICBwQnVmID0gcEltYWdlLT5wSW1nYnVmOyAgICAgICAgLyogYWRkcmVzcyBvYmplY3QgYnVmZmVyICovCisgICAgICAgIHBCdWYtPmJIYXNDSFJNID0gTU5HX1RSVUU7ICAgICAvKiBhbmQgdGVsbCBpdCBpdCdzIGdvdCBhIENIUk0gbm93ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZSBmb3IgY29sb3ItcHJvY2Vzc2luZyByb3V0aW5lcyAqLworICAgICAgICBwQnVmLT5pV2hpdGVwb2ludHggICA9IGlXaGl0ZXBvaW50eDsKKyAgICAgICAgcEJ1Zi0+aVdoaXRlcG9pbnR5ICAgPSBpV2hpdGVwb2ludHk7CisgICAgICAgIHBCdWYtPmlQcmltYXJ5cmVkeCAgID0gaVByaW1hcnlyZWR4OworICAgICAgICBwQnVmLT5pUHJpbWFyeXJlZHkgICA9IGlQcmltYXJ5cmVkeTsKKyAgICAgICAgcEJ1Zi0+aVByaW1hcnlncmVlbnggPSBpUHJpbWFyeWdyZWVueDsKKyAgICAgICAgcEJ1Zi0+aVByaW1hcnlncmVlbnkgPSBpUHJpbWFyeWdyZWVueTsKKyAgICAgICAgcEJ1Zi0+aVByaW1hcnlibHVleCAgPSBpUHJpbWFyeWJsdWV4OworICAgICAgICBwQnVmLT5pUHJpbWFyeWJsdWV5ICA9IGlQcmltYXJ5Ymx1ZXk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlIGFzIGdsb2JhbCAqLworICAgICAgaWYgKGlSYXdsZW4gIT0gMCkKKyAgICAgIHsKKyAgICAgICAgcERhdGEtPmlHbG9iYWxXaGl0ZXBvaW50eCAgID0gaVdoaXRlcG9pbnR4OworICAgICAgICBwRGF0YS0+aUdsb2JhbFdoaXRlcG9pbnR5ICAgPSBpV2hpdGVwb2ludHk7CisgICAgICAgIHBEYXRhLT5pR2xvYmFsUHJpbWFyeXJlZHggICA9IGlQcmltYXJ5cmVkeDsKKyAgICAgICAgcERhdGEtPmlHbG9iYWxQcmltYXJ5cmVkeSAgID0gaVByaW1hcnlyZWR5OworICAgICAgICBwRGF0YS0+aUdsb2JhbFByaW1hcnlncmVlbnggPSBpUHJpbWFyeWdyZWVueDsKKyAgICAgICAgcERhdGEtPmlHbG9iYWxQcmltYXJ5Z3JlZW55ID0gaVByaW1hcnlncmVlbnk7CisgICAgICAgIHBEYXRhLT5pR2xvYmFsUHJpbWFyeWJsdWV4ICA9IGlQcmltYXJ5Ymx1ZXg7CisgICAgICAgIHBEYXRhLT5pR2xvYmFsUHJpbWFyeWJsdWV5ICA9IGlQcmltYXJ5Ymx1ZXk7CisgICAgICB9CisKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSBhbiBhbmltYXRpb24gb2JqZWN0ICovCisgICAgICAgIG1uZ19yZXRjb2RlIGlSZXRjb2RlID0gbW5nX2NyZWF0ZV9hbmlfY2hybSAocERhdGEsIChtbmdfYm9vbCkoaVJhd2xlbiA9PSAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpV2hpdGVwb2ludHgsICAgaVdoaXRlcG9pbnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlQcmltYXJ5cmVkeCwgICBpUHJpbWFyeXJlZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVByaW1hcnlncmVlbngsIGlQcmltYXJ5Z3JlZW55LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlQcmltYXJ5Ymx1ZXgsICBpUHJpbWFyeWJsdWV5KTsKKworICAgICAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICB9CisgICAgfQorICB9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfRElTUExBWSAqLworCisjaWZkZWYgTU5HX1NUT1JFX0NIVU5LUworICBpZiAocERhdGEtPmJTdG9yZWNodW5rcykKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpemUgc3RvcmFnZSAqLworICAgIG1uZ19yZXRjb2RlIGlSZXRjb2RlID0gKChtbmdfY2h1bmtfaGVhZGVycClwSGVhZGVyKS0+ZkNyZWF0ZSAocERhdGEsIHBIZWFkZXIsIHBwQ2h1bmspOworCisgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgcmV0dXJuIGlSZXRjb2RlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmUgdGhlIGZpZWxkcyAqLworICAgICgobW5nX2Nocm1wKSpwcENodW5rKS0+YkVtcHR5ID0gKG1uZ19ib29sKShpUmF3bGVuID09IDApOworCisgICAgaWYgKGlSYXdsZW4pCisgICAgeworICAgICAgKChtbmdfY2hybXApKnBwQ2h1bmspLT5pV2hpdGVwb2ludHggPSBtbmdfZ2V0X3VpbnQzMiAocFJhd2RhdGEpOworICAgICAgKChtbmdfY2hybXApKnBwQ2h1bmspLT5pV2hpdGVwb2ludHkgPSBtbmdfZ2V0X3VpbnQzMiAocFJhd2RhdGErNCk7CisgICAgICAoKG1uZ19jaHJtcCkqcHBDaHVuayktPmlSZWR4ICAgICAgICA9IG1uZ19nZXRfdWludDMyIChwUmF3ZGF0YSs4KTsKKyAgICAgICgobW5nX2Nocm1wKSpwcENodW5rKS0+aVJlZHkgICAgICAgID0gbW5nX2dldF91aW50MzIgKHBSYXdkYXRhKzEyKTsKKyAgICAgICgobW5nX2Nocm1wKSpwcENodW5rKS0+aUdyZWVueCAgICAgID0gbW5nX2dldF91aW50MzIgKHBSYXdkYXRhKzE2KTsKKyAgICAgICgobW5nX2Nocm1wKSpwcENodW5rKS0+aUdyZWVueSAgICAgID0gbW5nX2dldF91aW50MzIgKHBSYXdkYXRhKzIwKTsKKyAgICAgICgobW5nX2Nocm1wKSpwcENodW5rKS0+aUJsdWV4ICAgICAgID0gbW5nX2dldF91aW50MzIgKHBSYXdkYXRhKzI0KTsKKyAgICAgICgobW5nX2Nocm1wKSpwcENodW5rKS0+aUJsdWV5ICAgICAgID0gbW5nX2dldF91aW50MzIgKHBSYXdkYXRhKzI4KTsKKyAgICB9CisgIH0KKyNlbmRpZiAvKiBNTkdfU1RPUkVfQ0hVTktTICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVBRF9DSFJNLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsgICAgICAgICAgICAgICAgICAvKiBkb25lICovCit9CisjZW5kaWYKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorUkVBRF9DSFVOSyAobW5nX3JlYWRfc3JnYikKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVBRF9TUkdCLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXF1ZW5jZSBjaGVja3MgKi8KKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgaWYgKCghcERhdGEtPmJIYXNNSERSKSAmJiAoIXBEYXRhLT5iSGFzSUhEUikgJiYKKyAgICAgICghcERhdGEtPmJIYXNCQVNJKSAmJiAoIXBEYXRhLT5iSGFzREhEUikgJiYgKCFwRGF0YS0+Ykhhc0pIRFIpKQorI2Vsc2UKKyAgaWYgKCghcERhdGEtPmJIYXNNSERSKSAmJiAoIXBEYXRhLT5iSGFzSUhEUikgJiYKKyAgICAgICghcERhdGEtPmJIYXNCQVNJKSAmJiAoIXBEYXRhLT5iSGFzREhEUikgICAgKQorI2VuZGlmCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1NFUVVFTkNFRVJST1IpOworCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisgIGlmICgocERhdGEtPmJIYXNJREFUKSB8fCAocERhdGEtPmJIYXNQTFRFKSB8fCAocERhdGEtPmJIYXNKREFUKSB8fCAocERhdGEtPmJIYXNKREFBKSkKKyNlbHNlCisgIGlmICgocERhdGEtPmJIYXNJREFUKSB8fCAocERhdGEtPmJIYXNQTFRFKSkKKyNlbmRpZgorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19TRVFVRU5DRUVSUk9SKTsKKworI2lmZGVmIE1OR19JTkNMVURFX0pORworICBpZiAoKHBEYXRhLT5iSGFzSUhEUikgfHwgKHBEYXRhLT5iSGFzQkFTSSkgfHwgKHBEYXRhLT5iSGFzREhEUikgfHwgKHBEYXRhLT5iSGFzSkhEUikpCisjZWxzZQorICBpZiAoKHBEYXRhLT5iSGFzSUhEUikgfHwgKHBEYXRhLT5iSGFzQkFTSSkgfHwgKHBEYXRhLT5iSGFzREhEUikpCisjZW5kaWYKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBtdXN0IGJlIGV4YWN0bHkgMSAqLworICAgIGlmIChpUmF3bGVuICE9IDEpCisgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRExFTkdUSCk7CisgIH0KKyAgZWxzZQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG11c3QgYmUgZW1wdHkgb3IgZXhhY3RseSAxICovCisgICAgaWYgKChpUmF3bGVuICE9IDApICYmIChpUmF3bGVuICE9IDEpKQorICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURMRU5HVEgpOworICB9CisKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgaWYgKChwRGF0YS0+Ykhhc0lIRFIpIHx8IChwRGF0YS0+Ykhhc0JBU0kpIHx8IChwRGF0YS0+Ykhhc0RIRFIpIHx8IChwRGF0YS0+Ykhhc0pIRFIpKQorI2Vsc2UKKyAgaWYgKChwRGF0YS0+Ykhhc0lIRFIpIHx8IChwRGF0YS0+Ykhhc0JBU0kpIHx8IChwRGF0YS0+Ykhhc0RIRFIpKQorI2VuZGlmCisgICAgcERhdGEtPmJIYXNTUkdCID0gTU5HX1RSVUU7ICAgICAgICAvKiBpbmRpY2F0ZSB3ZSd2ZSBnb3QgaXQgKi8KKyAgZWxzZQorICAgIHBEYXRhLT5iSGFzZ2xvYmFsU1JHQiA9IChtbmdfYm9vbCkoaVJhd2xlbiAhPSAwKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX0RJU1BMQVkKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgaWYgKChwRGF0YS0+Ykhhc0lIRFIpIHx8IChwRGF0YS0+Ykhhc0JBU0kpIHx8IChwRGF0YS0+Ykhhc0RIRFIpIHx8IChwRGF0YS0+Ykhhc0pIRFIpKQorI2Vsc2UKKyAgaWYgKChwRGF0YS0+Ykhhc0lIRFIpIHx8IChwRGF0YS0+Ykhhc0JBU0kpIHx8IChwRGF0YS0+Ykhhc0RIRFIpKQorI2VuZGlmCisgIHsKKyAgICBtbmdfaW1hZ2VwIHBJbWFnZTsKKworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisgICAgaWYgKHBEYXRhLT5iSGFzREhEUikgICAgICAgICAgICAgICAvKiB1cGRhdGUgZGVsdGEgaW1hZ2UgPyAqLworICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmUgaW4gb2JqZWN0IDAgISAqLworICAgICAgcEltYWdlID0gKG1uZ19pbWFnZXApcERhdGEtPnBPYmp6ZXJvOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmUgZm9yIGNvbG9yLXByb2Nlc3Npbmcgcm91dGluZXMgKi8KKyAgICAgIHBJbWFnZS0+cEltZ2J1Zi0+aVJlbmRlcmluZ2ludGVudCA9ICpwUmF3ZGF0YTsKKyAgICAgIHBJbWFnZS0+cEltZ2J1Zi0+Ykhhc1NSR0IgICAgICAgICA9IE1OR19UUlVFOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICB7CisgICAgICBwSW1hZ2UgPSAobW5nX2ltYWdlcClwRGF0YS0+cEN1cnJlbnRvYmo7CisKKyAgICAgIGlmICghcEltYWdlKSAgICAgICAgICAgICAgICAgICAgIC8qIG5vIG9iamVjdCB0aGVuIGR1bXAgaXQgaW4gb2JqIDAgKi8KKyAgICAgICAgcEltYWdlID0gKG1uZ19pbWFnZXApcERhdGEtPnBPYmp6ZXJvOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmUgZm9yIGNvbG9yLXByb2Nlc3Npbmcgcm91dGluZXMgKi8KKyAgICAgIHBJbWFnZS0+cEltZ2J1Zi0+aVJlbmRlcmluZ2ludGVudCA9ICpwUmF3ZGF0YTsKKyAgICAgIHBJbWFnZS0+cEltZ2J1Zi0+Ykhhc1NSR0IgICAgICAgICA9IE1OR19UUlVFOworICAgIH0KKyAgfQorICBlbHNlCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZSBhcyBnbG9iYWwgKi8KKyAgICBpZiAoaVJhd2xlbiAhPSAwKQorICAgICAgcERhdGEtPmlHbG9iYWxSZW5kaW50ZW50ID0gKnBSYXdkYXRhOworCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgYW4gYW5pbWF0aW9uIG9iamVjdCAqLworICAgICAgbW5nX3JldGNvZGUgaVJldGNvZGUgPSBtbmdfY3JlYXRlX2FuaV9zcmdiIChwRGF0YSwgKG1uZ19ib29sKShpUmF3bGVuID09IDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aUdsb2JhbFJlbmRpbnRlbnQpOworCisgICAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgfQorICB9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfRElTUExBWSAqLworCisjaWZkZWYgTU5HX1NUT1JFX0NIVU5LUworICBpZiAocERhdGEtPmJTdG9yZWNodW5rcykKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpemUgc3RvcmFnZSAqLworICAgIG1uZ19yZXRjb2RlIGlSZXRjb2RlID0gKChtbmdfY2h1bmtfaGVhZGVycClwSGVhZGVyKS0+ZkNyZWF0ZSAocERhdGEsIHBIZWFkZXIsIHBwQ2h1bmspOworCisgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgcmV0dXJuIGlSZXRjb2RlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmUgdGhlIGZpZWxkcyAqLworICAgICgobW5nX3NyZ2JwKSpwcENodW5rKS0+YkVtcHR5ID0gKG1uZ19ib29sKShpUmF3bGVuID09IDApOworCisgICAgaWYgKGlSYXdsZW4pCisgICAgICAoKG1uZ19zcmdicCkqcHBDaHVuayktPmlSZW5kZXJpbmdpbnRlbnQgPSAqcFJhd2RhdGE7CisKKyAgfQorI2VuZGlmIC8qIE1OR19TVE9SRV9DSFVOS1MgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9SRUFEX1NSR0IsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOyAgICAgICAgICAgICAgICAgIC8qIGRvbmUgKi8KK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX2lDQ1AKK1JFQURfQ0hVTksgKG1uZ19yZWFkX2ljY3ApCit7CisgIG1uZ19yZXRjb2RlIGlSZXRjb2RlOworICBtbmdfdWludDhwICBwVGVtcDsKKyAgbW5nX3VpbnQzMiAgaUNvbXByZXNzZWRzaXplOworICBtbmdfdWludDMyICBpUHJvZmlsZXNpemU7CisgIG1uZ191aW50MzIgIGlCdWZzaXplID0gMDsKKyAgbW5nX3VpbnQ4cCAgcEJ1ZiA9IDA7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVBRF9JQ0NQLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXF1ZW5jZSBjaGVja3MgKi8KKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgaWYgKCghcERhdGEtPmJIYXNNSERSKSAmJiAoIXBEYXRhLT5iSGFzSUhEUikgJiYKKyAgICAgICghcERhdGEtPmJIYXNCQVNJKSAmJiAoIXBEYXRhLT5iSGFzREhEUikgJiYgKCFwRGF0YS0+Ykhhc0pIRFIpKQorI2Vsc2UKKyAgaWYgKCghcERhdGEtPmJIYXNNSERSKSAmJiAoIXBEYXRhLT5iSGFzSUhEUikgJiYKKyAgICAgICghcERhdGEtPmJIYXNCQVNJKSAmJiAoIXBEYXRhLT5iSGFzREhEUikgICAgKQorI2VuZGlmCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1NFUVVFTkNFRVJST1IpOworCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisgIGlmICgocERhdGEtPmJIYXNJREFUKSB8fCAocERhdGEtPmJIYXNQTFRFKSB8fCAocERhdGEtPmJIYXNKREFUKSB8fCAocERhdGEtPmJIYXNKREFBKSkKKyNlbHNlCisgIGlmICgocERhdGEtPmJIYXNJREFUKSB8fCAocERhdGEtPmJIYXNQTFRFKSkKKyNlbmRpZgorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19TRVFVRU5DRUVSUk9SKTsKKworI2lmZGVmIE1OR19JTkNMVURFX0pORworICBpZiAoKHBEYXRhLT5iSGFzSUhEUikgfHwgKHBEYXRhLT5iSGFzQkFTSSkgfHwgKHBEYXRhLT5iSGFzREhEUikgfHwgKHBEYXRhLT5iSGFzSkhEUikpCisjZWxzZQorICBpZiAoKHBEYXRhLT5iSGFzSUhEUikgfHwgKHBEYXRhLT5iSGFzQkFTSSkgfHwgKHBEYXRhLT5iSGFzREhEUikpCisjZW5kaWYKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBtdXN0IGJlIGF0IGxlYXN0IDIgKi8KKyAgICBpZiAoaVJhd2xlbiA8IDIpCisgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRExFTkdUSCk7CisgIH0KKyAgZWxzZQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG11c3QgYmUgZW1wdHkgb3IgYXQgbGVhc3QgMiAqLworICAgIGlmICgoaVJhd2xlbiAhPSAwKSAmJiAoaVJhd2xlbiA8IDIpKQorICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURMRU5HVEgpOworICB9CisKKyAgcFRlbXAgPSBmaW5kX251bGwgKHBSYXdkYXRhKTsgICAgICAgIC8qIGZpbmQgbnVsbC1zZXBhcmF0b3IgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdCBmb3VuZCBpbnNpZGUgaW5wdXQtZGF0YSA/ICovCisgIGlmICgocFRlbXAgLSBwUmF3ZGF0YSkgPiAobW5nX2ludDMyKWlSYXdsZW4pCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX05VTExOT1RGT1VORCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZXRlcm1pbmUgc2l6ZSBvZiBjb21wcmVzc2VkIHByb2ZpbGUgKi8KKyAgaUNvbXByZXNzZWRzaXplID0gKG1uZ191aW50MzIpKGlSYXdsZW4gLSAocFRlbXAgLSBwUmF3ZGF0YSkgLSAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlY29tcHJlc3MgdGhlIHByb2ZpbGUgKi8KKyAgaVJldGNvZGUgPSBtbmdfaW5mbGF0ZV9idWZmZXIgKHBEYXRhLCBwVGVtcCsyLCBpQ29tcHJlc3NlZHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEJ1ZiwgJmlCdWZzaXplLCAmaVByb2ZpbGVzaXplKTsKKworI2lmZGVmIE1OR19DSEVDS19CQURfSUNDUCAgICAgICAgICAgICAgLyogQ2hlY2sgZm9yIGJhZCBpQ0NQIGNodW5rICovCisgIGlmICgoaVJldGNvZGUpICYmICghc3RybmNtcCAoKGNoYXIgKilwUmF3ZGF0YSwgIlBob3Rvc2hvcCBJQ0MgcHJvZmlsZSIsIDIxKSkpCisgIHsKKyAgICBpZiAoaVJhd2xlbiA9PSAyNjE1KSAgICAgICAgICAgICAgIC8qIGlzIGl0IHRoZSBzUkdCIHByb2ZpbGUgPyAqLworICAgIHsKKyAgICAgIG1uZ19jaHVua19oZWFkZXIgY2h1bmtfc3JnYiA9CisjaWZkZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyAgICAgICAge01OR19VSU5UX3NSR0IsIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX2dlbmVyYWwsIG1uZ19yZWFkX3NyZ2IsIG1uZ193cml0ZV9zcmdiLCBtbmdfYXNzaWduX2dlbmVyYWwsIDAsIDAsIHNpemVvZihtbmdfc3JnYil9OworI2Vsc2UKKyAgICAgICAge01OR19VSU5UX3NSR0IsIG1uZ19pbml0X3NyZ2IsIG1uZ19mcmVlX3NyZ2IsIG1uZ19yZWFkX3NyZ2IsIG1uZ193cml0ZV9zcmdiLCBtbmdfYXNzaWduX3NyZ2IsIDAsIDB9OworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcmV0ZW5kIGl0J3MgYW4gc1JHQiBjaHVuayB0aGVuICEgKi8KKyAgICAgIGlSZXRjb2RlID0gbW5nX3JlYWRfc3JnYiAocERhdGEsICZjaHVua19zcmdiLCAxLCAobW5nX3B0cikiMCIsIHBwQ2h1bmspOworCisgICAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZG9uJ3QgZm9yZ2V0IHRvIGRyb3AgdGhlIHRlbXAgYnVmZmVyICovCisgICAgICAgIE1OR19GUkVFWCAocERhdGEsIHBCdWYsIGlCdWZzaXplKTsKKyAgICAgICAgcmV0dXJuIGlSZXRjb2RlOworICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyNlbmRpZiAvKiBNTkdfQ0hFQ0tfQkFEX0lDQ1AgKi8KKworICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvbid0IGZvcmdldCB0byBkcm9wIHRoZSB0ZW1wIGJ1ZmZlciAqLworICAgICAgTU5HX0ZSRUVYIChwRGF0YSwgcEJ1ZiwgaUJ1ZnNpemUpOworICAgICAgcmV0dXJuIGlSZXRjb2RlOworICAgIH0KKworI2lmZGVmIE1OR19JTkNMVURFX0pORworICAgIGlmICgocERhdGEtPmJIYXNJSERSKSB8fCAocERhdGEtPmJIYXNCQVNJKSB8fCAocERhdGEtPmJIYXNESERSKSB8fCAocERhdGEtPmJIYXNKSERSKSkKKyNlbHNlCisgICAgaWYgKChwRGF0YS0+Ykhhc0lIRFIpIHx8IChwRGF0YS0+Ykhhc0JBU0kpIHx8IChwRGF0YS0+Ykhhc0RIRFIpKQorI2VuZGlmCisgICAgICBwRGF0YS0+Ykhhc0lDQ1AgPSBNTkdfVFJVRTsgICAgICAvKiBpbmRpY2F0ZSB3ZSd2ZSBnb3QgaXQgKi8KKyAgICBlbHNlCisgICAgICBwRGF0YS0+Ykhhc2dsb2JhbElDQ1AgPSAobW5nX2Jvb2wpKGlSYXdsZW4gIT0gMCk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisgICAgaWYgKChwRGF0YS0+Ykhhc0lIRFIpIHx8IChwRGF0YS0+Ykhhc0JBU0kpIHx8IChwRGF0YS0+Ykhhc0RIRFIpIHx8IChwRGF0YS0+Ykhhc0pIRFIpKQorI2Vsc2UKKyAgICBpZiAoKHBEYXRhLT5iSGFzSUhEUikgfHwgKHBEYXRhLT5iSGFzQkFTSSkgfHwgKHBEYXRhLT5iSGFzREhEUikpCisjZW5kaWYKKyAgICB7CisgICAgICBtbmdfaW1hZ2VwIHBJbWFnZTsKKworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisgICAgICBpZiAocERhdGEtPmJIYXNESERSKSAgICAgICAgICAgICAvKiB1cGRhdGUgZGVsdGEgaW1hZ2UgPyAqLworICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmUgaW4gb2JqZWN0IDAgISAqLworICAgICAgICBwSW1hZ2UgPSAobW5nX2ltYWdlcClwRGF0YS0+cE9ianplcm87CisKKyAgICAgICAgaWYgKHBJbWFnZS0+cEltZ2J1Zi0+cFByb2ZpbGUpIC8qIHByb2ZpbGUgZXhpc3RlZCA/ICovCisgICAgICAgICAgTU5HX0ZSRUVYIChwRGF0YSwgcEltYWdlLT5wSW1nYnVmLT5wUHJvZmlsZSwgcEltYWdlLT5wSW1nYnVmLT5pUHJvZmlsZXNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWxsb2NhdGUgYSBidWZmZXIgJiBjb3B5IGl0ICovCisgICAgICAgIE1OR19BTExPQyAocERhdGEsIHBJbWFnZS0+cEltZ2J1Zi0+cFByb2ZpbGUsIGlQcm9maWxlc2l6ZSk7CisgICAgICAgIE1OR19DT1BZICAocEltYWdlLT5wSW1nYnVmLT5wUHJvZmlsZSwgcEJ1ZiwgaVByb2ZpbGVzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlIGl0cyBsZW5ndGggYXMgd2VsbCAqLworICAgICAgICBwSW1hZ2UtPnBJbWdidWYtPmlQcm9maWxlc2l6ZSA9IGlQcm9maWxlc2l6ZTsKKyAgICAgICAgcEltYWdlLT5wSW1nYnVmLT5iSGFzSUNDUCAgICAgPSBNTkdfVFJVRTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgeworICAgICAgICBwSW1hZ2UgPSAobW5nX2ltYWdlcClwRGF0YS0+cEN1cnJlbnRvYmo7CisKKyAgICAgICAgaWYgKCFwSW1hZ2UpICAgICAgICAgICAgICAgICAgIC8qIG5vIG9iamVjdCB0aGVuIGR1bXAgaXQgaW4gb2JqIDAgKi8KKyAgICAgICAgICBwSW1hZ2UgPSAobW5nX2ltYWdlcClwRGF0YS0+cE9ianplcm87CisKKyAgICAgICAgaWYgKHBJbWFnZS0+cEltZ2J1Zi0+cFByb2ZpbGUpIC8qIHByb2ZpbGUgZXhpc3RlZCA/ICovCisgICAgICAgICAgTU5HX0ZSRUVYIChwRGF0YSwgcEltYWdlLT5wSW1nYnVmLT5wUHJvZmlsZSwgcEltYWdlLT5wSW1nYnVmLT5pUHJvZmlsZXNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWxsb2NhdGUgYSBidWZmZXIgJiBjb3B5IGl0ICovCisgICAgICAgIE1OR19BTExPQyAocERhdGEsIHBJbWFnZS0+cEltZ2J1Zi0+cFByb2ZpbGUsIGlQcm9maWxlc2l6ZSk7CisgICAgICAgIE1OR19DT1BZICAocEltYWdlLT5wSW1nYnVmLT5wUHJvZmlsZSwgcEJ1ZiwgaVByb2ZpbGVzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlIGl0cyBsZW5ndGggYXMgd2VsbCAqLworICAgICAgICBwSW1hZ2UtPnBJbWdidWYtPmlQcm9maWxlc2l6ZSA9IGlQcm9maWxlc2l6ZTsKKyAgICAgICAgcEltYWdlLT5wSW1nYnVmLT5iSGFzSUNDUCAgICAgPSBNTkdfVFJVRTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmUgYXMgZ2xvYmFsICovCisgICAgICBpZiAoaVJhd2xlbiA9PSAwKSAgICAgICAgICAgICAgICAvKiBlbXB0eSBjaHVuayA/ICovCisgICAgICB7CisgICAgICAgIGlmIChwRGF0YS0+cEdsb2JhbFByb2ZpbGUpICAgICAvKiBkaWQgd2UgaGF2ZSBhIGdsb2JhbCBwcm9maWxlID8gKi8KKyAgICAgICAgICBNTkdfRlJFRVggKHBEYXRhLCBwRGF0YS0+cEdsb2JhbFByb2ZpbGUsIHBEYXRhLT5pR2xvYmFsUHJvZmlsZXNpemUpOworCisgICAgICAgIHBEYXRhLT5pR2xvYmFsUHJvZmlsZXNpemUgPSAwOyAvKiByZXNldCB0byBudWxsICovCisgICAgICAgIHBEYXRhLT5wR2xvYmFsUHJvZmlsZSAgICAgPSBNTkdfTlVMTDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFsbG9jYXRlIGEgZ2xvYmFsIGJ1ZmZlciAmIGNvcHkgaXQgKi8KKyAgICAgICAgTU5HX0FMTE9DIChwRGF0YSwgcERhdGEtPnBHbG9iYWxQcm9maWxlLCBpUHJvZmlsZXNpemUpOworICAgICAgICBNTkdfQ09QWSAgKHBEYXRhLT5wR2xvYmFsUHJvZmlsZSwgcEJ1ZiwgaVByb2ZpbGVzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlIGl0cyBsZW5ndGggYXMgd2VsbCAqLworICAgICAgICBwRGF0YS0+aUdsb2JhbFByb2ZpbGVzaXplID0gaVByb2ZpbGVzaXplOworICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgYW4gYW5pbWF0aW9uIG9iamVjdCAqLworICAgICAgaVJldGNvZGUgPSBtbmdfY3JlYXRlX2FuaV9pY2NwIChwRGF0YSwgKG1uZ19ib29sKShpUmF3bGVuID09IDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aUdsb2JhbFByb2ZpbGVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+cEdsb2JhbFByb2ZpbGUpOworCisgICAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgfQorI2VuZGlmIC8qIE1OR19TVVBQT1JUX0RJU1BMQVkgKi8KKworI2lmZGVmIE1OR19TVE9SRV9DSFVOS1MKKyAgICBpZiAocERhdGEtPmJTdG9yZWNodW5rcykKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpemUgc3RvcmFnZSAqLworICAgICAgaVJldGNvZGUgPSAoKG1uZ19jaHVua19oZWFkZXJwKXBIZWFkZXIpLT5mQ3JlYXRlIChwRGF0YSwgcEhlYWRlciwgcHBDaHVuayk7CisKKyAgICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkb24ndCBmb3JnZXQgdG8gZHJvcCB0aGUgdGVtcCBidWZmZXIgKi8KKyAgICAgICAgTU5HX0ZSRUVYIChwRGF0YSwgcEJ1ZiwgaUJ1ZnNpemUpOworICAgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZSB0aGUgZmllbGRzICovCisgICAgICAoKG1uZ19pY2NwcCkqcHBDaHVuayktPmJFbXB0eSA9IChtbmdfYm9vbCkoaVJhd2xlbiA9PSAwKTsKKworICAgICAgaWYgKGlSYXdsZW4pICAgICAgICAgICAgICAgICAgICAgLyogbm90IGVtcHR5ID8gKi8KKyAgICAgIHsKKyAgICAgICAgaWYgKCFwQnVmKSAgICAgICAgICAgICAgICAgICAgIC8qIGhhc24ndCBiZWVuIHVucHV6emxlZCBpdCB5ZXQgPyAqLworICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmluZCBudWxsLXNlcGFyYXRvciAqLworICAgICAgICAgIHBUZW1wID0gZmluZF9udWxsIChwUmF3ZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3QgZm91bmQgaW5zaWRlIGlucHV0LWRhdGEgPyAqLworICAgICAgICAgIGlmICgocFRlbXAgLSBwUmF3ZGF0YSkgPiAobW5nX2ludDMyKWlSYXdsZW4pCisgICAgICAgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfTlVMTE5PVEZPVU5EKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRldGVybWluZSBzaXplIG9mIGNvbXByZXNzZWQgcHJvZmlsZSAqLworICAgICAgICAgIGlDb21wcmVzc2Vkc2l6ZSA9IGlSYXdsZW4gLSAocFRlbXAgLSBwUmF3ZGF0YSkgLSAyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVjb21wcmVzcyB0aGUgcHJvZmlsZSAqLworICAgICAgICAgIGlSZXRjb2RlID0gbW5nX2luZmxhdGVfYnVmZmVyIChwRGF0YSwgcFRlbXArMiwgaUNvbXByZXNzZWRzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEJ1ZiwgJmlCdWZzaXplLCAmaVByb2ZpbGVzaXplKTsKKworICAgICAgICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvbid0IGZvcmdldCB0byBkcm9wIHRoZSB0ZW1wIGJ1ZmZlciAqLworICAgICAgICAgICAgTU5HX0ZSRUVYIChwRGF0YSwgcEJ1ZiwgaUJ1ZnNpemUpOworICAgICAgICAgICAgcmV0dXJuIGlSZXRjb2RlOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICgobW5nX2ljY3BwKSpwcENodW5rKS0+aU5hbWVzaXplID0gKG1uZ191aW50MzIpKHBUZW1wIC0gcFJhd2RhdGEpOworCisgICAgICAgIGlmICgoKG1uZ19pY2NwcCkqcHBDaHVuayktPmlOYW1lc2l6ZSkKKyAgICAgICAgeworICAgICAgICAgIE1OR19BTExPQyAocERhdGEsICgobW5nX2ljY3BwKSpwcENodW5rKS0+ek5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChtbmdfaWNjcHApKnBwQ2h1bmspLT5pTmFtZXNpemUgKyAxKTsKKyAgICAgICAgICBNTkdfQ09QWSAgKCgobW5nX2ljY3BwKSpwcENodW5rKS0+ek5hbWUsIHBSYXdkYXRhLAorICAgICAgICAgICAgICAgICAgICAgKChtbmdfaWNjcHApKnBwQ2h1bmspLT5pTmFtZXNpemUpOworICAgICAgICB9CisKKyAgICAgICAgKChtbmdfaWNjcHApKnBwQ2h1bmspLT5pQ29tcHJlc3Npb24gPSAqKHBUZW1wKzEpOworICAgICAgICAoKG1uZ19pY2NwcCkqcHBDaHVuayktPmlQcm9maWxlc2l6ZSA9IGlQcm9maWxlc2l6ZTsKKworICAgICAgICBNTkdfQUxMT0MgKHBEYXRhLCAoKG1uZ19pY2NwcCkqcHBDaHVuayktPnBQcm9maWxlLCBpUHJvZmlsZXNpemUpOworICAgICAgICBNTkdfQ09QWSAgKCgobW5nX2ljY3BwKSpwcENodW5rKS0+cFByb2ZpbGUsIHBCdWYsIGlQcm9maWxlc2l6ZSk7CisgICAgICB9CisgICAgfQorI2VuZGlmIC8qIE1OR19TVE9SRV9DSFVOS1MgKi8KKworICAgIGlmIChwQnVmKSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZnJlZSB0aGUgdGVtcG9yYXJ5IGJ1ZmZlciAqLworICAgICAgTU5HX0ZSRUVYIChwRGF0YSwgcEJ1ZiwgaUJ1ZnNpemUpOworCisjaWZkZWYgTU5HX0NIRUNLX0JBRF9JQ0NQCisgIH0KKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1JFQURfSUNDUCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7ICAgICAgICAgICAgICAgICAgLyogZG9uZSAqLworfQorI2VuZGlmCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS190RVh0CitSRUFEX0NIVU5LIChtbmdfcmVhZF90ZXh0KQoreworICBtbmdfdWludDMyIGlLZXl3b3JkbGVuLCBpVGV4dGxlbjsKKyAgbW5nX3BjaGFyICB6S2V5d29yZCwgelRleHQ7CisgIG1uZ191aW50OHAgcFRlbXA7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVBRF9URVhULCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXF1ZW5jZSBjaGVja3MgKi8KKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgaWYgKCghcERhdGEtPmJIYXNNSERSKSAmJiAoIXBEYXRhLT5iSGFzSUhEUikgJiYKKyAgICAgICghcERhdGEtPmJIYXNCQVNJKSAmJiAoIXBEYXRhLT5iSGFzREhEUikgJiYgKCFwRGF0YS0+Ykhhc0pIRFIpKQorI2Vsc2UKKyAgaWYgKCghcERhdGEtPmJIYXNNSERSKSAmJiAoIXBEYXRhLT5iSGFzSUhEUikgJiYKKyAgICAgICghcERhdGEtPmJIYXNCQVNJKSAmJiAoIXBEYXRhLT5iSGFzREhEUikgICAgKQorI2VuZGlmCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1NFUVVFTkNFRVJST1IpOworCisgIGlmIChpUmF3bGVuIDwgMikgICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggbXVzdCBiZSBhdCBsZWFzdCAyICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURMRU5HVEgpOworCisgIHBUZW1wID0gZmluZF9udWxsIChwUmF3ZGF0YSk7ICAgICAgICAvKiBmaW5kIHRoZSBudWxsIHNlcGFyYXRvciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm90IGZvdW5kIGluc2lkZSBpbnB1dC1kYXRhID8gKi8KKyAgaWYgKChwVGVtcCAtIHBSYXdkYXRhKSA+IChtbmdfaW50MzIpaVJhd2xlbikKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfTlVMTE5PVEZPVU5EKTsKKworICBpZiAocFRlbXAgPT0gcFJhd2RhdGEpICAgICAgICAgICAgICAgLyogdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCAxIGNoYXIgZm9yIGtleXdvcmQgKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfS0VZV09SRE5VTEwpOworCisgIGlLZXl3b3JkbGVuID0gKG1uZ191aW50MzIpKHBUZW1wIC0gcFJhd2RhdGEpOworICBpVGV4dGxlbiAgICA9IGlSYXdsZW4gLSBpS2V5d29yZGxlbiAtIDE7CisKKyAgaWYgKHBEYXRhLT5mUHJvY2Vzc3RleHQpICAgICAgICAgICAgIC8qIGluZm9ybSB0aGUgYXBwbGljYXRpb24gPyAqLworICB7CisgICAgbW5nX2Jvb2wgYk9rZTsKKworICAgIE1OR19BTExPQyAocERhdGEsIHpLZXl3b3JkLCBpS2V5d29yZGxlbiArIDEpOworICAgIE1OR19DT1BZICAoektleXdvcmQsIHBSYXdkYXRhLCBpS2V5d29yZGxlbik7CisKKyAgICBNTkdfQUxMT0NYIChwRGF0YSwgelRleHQsIGlUZXh0bGVuICsgMSk7CisKKyAgICBpZiAoIXpUZXh0KSAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgeworICAgICAgTU5HX0ZSRUVYIChwRGF0YSwgektleXdvcmQsIGlLZXl3b3JkbGVuICsgMSk7CisgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfT1VUT0ZNRU1PUlkpOworICAgIH0KKworICAgIGlmIChpVGV4dGxlbikKKyAgICAgIE1OR19DT1BZICh6VGV4dCwgcFRlbXArMSwgaVRleHRsZW4pOworCisgICAgYk9rZSA9IHBEYXRhLT5mUHJvY2Vzc3RleHQgKChtbmdfaGFuZGxlKXBEYXRhLCBNTkdfVFlQRV9URVhULCB6S2V5d29yZCwgelRleHQsIDAsIDApOworCisgICAgTU5HX0ZSRUVYIChwRGF0YSwgelRleHQsIGlUZXh0bGVuICsgMSk7CisgICAgTU5HX0ZSRUVYIChwRGF0YSwgektleXdvcmQsIGlLZXl3b3JkbGVuICsgMSk7CisKKyAgICBpZiAoIWJPa2UpCisgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfQVBQTUlTQ0VSUk9SKTsKKworICB9CisKKyNpZmRlZiBNTkdfU1RPUkVfQ0hVTktTCisgIGlmIChwRGF0YS0+YlN0b3JlY2h1bmtzKQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdGlhbGl6ZSBzdG9yYWdlICovCisgICAgbW5nX3JldGNvZGUgaVJldGNvZGUgPSAoKG1uZ19jaHVua19oZWFkZXJwKXBIZWFkZXIpLT5mQ3JlYXRlIChwRGF0YSwgcEhlYWRlciwgcHBDaHVuayk7CisKKyAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZSB0aGUgZmllbGRzICovCisgICAgKChtbmdfdGV4dHApKnBwQ2h1bmspLT5pS2V5d29yZHNpemUgPSBpS2V5d29yZGxlbjsKKyAgICAoKG1uZ190ZXh0cCkqcHBDaHVuayktPmlUZXh0c2l6ZSAgICA9IGlUZXh0bGVuOworCisgICAgaWYgKGlLZXl3b3JkbGVuKQorICAgIHsKKyAgICAgIE1OR19BTExPQyAocERhdGEsICgobW5nX3RleHRwKSpwcENodW5rKS0+ektleXdvcmQsIGlLZXl3b3JkbGVuKzEpOworICAgICAgTU5HX0NPUFkgICgoKG1uZ190ZXh0cCkqcHBDaHVuayktPnpLZXl3b3JkLCBwUmF3ZGF0YSwgaUtleXdvcmRsZW4pOworICAgIH0KKworICAgIGlmIChpVGV4dGxlbikKKyAgICB7CisgICAgICBNTkdfQUxMT0MgKHBEYXRhLCAoKG1uZ190ZXh0cCkqcHBDaHVuayktPnpUZXh0LCBpVGV4dGxlbisxKTsKKyAgICAgIE1OR19DT1BZICAoKChtbmdfdGV4dHApKnBwQ2h1bmspLT56VGV4dCwgcFRlbXArMSwgaVRleHRsZW4pOworICAgIH0KKyAgfQorI2VuZGlmIC8qIE1OR19TVE9SRV9DSFVOS1MgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9SRUFEX1RFWFQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOyAgICAgICAgICAgICAgICAgIC8qIGRvbmUgKi8KK30KKyNlbmRpZgorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfelRYdAorUkVBRF9DSFVOSyAobW5nX3JlYWRfenR4dCkKK3sKKyAgbW5nX3JldGNvZGUgaVJldGNvZGU7CisgIG1uZ191aW50MzIgIGlLZXl3b3JkbGVuLCBpVGV4dGxlbjsKKyAgbW5nX3BjaGFyICAgektleXdvcmQ7CisgIG1uZ191aW50OHAgIHBUZW1wOworICBtbmdfdWludDMyICBpQ29tcHJlc3NlZHNpemU7CisgIG1uZ191aW50MzIgIGlCdWZzaXplOworICBtbmdfdWludDhwICBwQnVmOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1JFQURfWlRYVCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2VxdWVuY2UgY2hlY2tzICovCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisgIGlmICgoIXBEYXRhLT5iSGFzTUhEUikgJiYgKCFwRGF0YS0+Ykhhc0lIRFIpICYmCisgICAgICAoIXBEYXRhLT5iSGFzQkFTSSkgJiYgKCFwRGF0YS0+Ykhhc0RIRFIpICYmICghcERhdGEtPmJIYXNKSERSKSkKKyNlbHNlCisgIGlmICgoIXBEYXRhLT5iSGFzTUhEUikgJiYgKCFwRGF0YS0+Ykhhc0lIRFIpICYmCisgICAgICAoIXBEYXRhLT5iSGFzQkFTSSkgJiYgKCFwRGF0YS0+Ykhhc0RIRFIpICAgICkKKyNlbmRpZgorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19TRVFVRU5DRUVSUk9SKTsKKworICBpZiAoaVJhd2xlbiA8IDMpICAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG11c3QgYmUgYXQgbGVhc3QgMyAqLworICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElETEVOR1RIKTsKKworICBwVGVtcCA9IGZpbmRfbnVsbCAocFJhd2RhdGEpOyAgICAgICAgLyogZmluZCB0aGUgbnVsbCBzZXBhcmF0b3IgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdCBmb3VuZCBpbnNpZGUgaW5wdXQtZGF0YSA/ICovCisgIGlmICgocFRlbXAgLSBwUmF3ZGF0YSkgPiAobW5nX2ludDMyKWlSYXdsZW4pCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX05VTExOT1RGT1VORCk7CisKKyAgaWYgKHBUZW1wID09IHBSYXdkYXRhKSAgICAgICAgICAgICAgIC8qIHRoZXJlIG11c3QgYmUgYXQgbGVhc3QgMSBjaGFyIGZvciBrZXl3b3JkICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0tFWVdPUkROVUxMKTsKKworICBpZiAoKihwVGVtcCsxKSAhPSAwKSAgICAgICAgICAgICAgICAgLyogb25seSBkZWZsYXRlIGNvbXByZXNzaW9uLW1ldGhvZCBhbGxvd2VkICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURDT01QUkVTUyk7CisKKyAgaUtleXdvcmRsZW4gICAgID0gKG1uZ191aW50MzIpKHBUZW1wIC0gcFJhd2RhdGEpOworICBpQ29tcHJlc3NlZHNpemUgPSAobW5nX3VpbnQzMikoaVJhd2xlbiAtIGlLZXl3b3JkbGVuIC0gMik7CisKKyAgektleXdvcmQgICAgICAgID0gMDsgICAgICAgICAgICAgICAgIC8qIHRoZXJlJ3Mgbm8ga2V5d29yZCBidWZmZXIgeWV0ICovCisgIHBCdWYgICAgICAgICAgICA9IDA7ICAgICAgICAgICAgICAgICAvKiBvciBhIHRlbXBvcmFyeSBidWZmZXIgISAqLworCisgIGlmIChwRGF0YS0+ZlByb2Nlc3N0ZXh0KSAgICAgICAgICAgICAvKiBpbmZvcm0gdGhlIGFwcGxpY2F0aW9uID8gKi8KKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlY29tcHJlc3MgdGhlIHRleHQgKi8KKyAgICBpUmV0Y29kZSA9IG1uZ19pbmZsYXRlX2J1ZmZlciAocERhdGEsIHBUZW1wKzIsIGlDb21wcmVzc2Vkc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBCdWYsICZpQnVmc2l6ZSwgJmlUZXh0bGVuKTsKKworICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvbid0IGZvcmdldCB0byBkcm9wIHRoZSB0ZW1wIGJ1ZmZlcnMgKi8KKyAgICAgIE1OR19GUkVFWCAocERhdGEsIHBCdWYsIGlCdWZzaXplKTsKKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICB9CisKKyAgICBNTkdfQUxMT0NYIChwRGF0YSwgektleXdvcmQsIGlLZXl3b3JkbGVuKzEpOworCisgICAgaWYgKCF6S2V5d29yZCkgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZG9uJ3QgZm9yZ2V0IHRvIGRyb3AgdGhlIHRlbXAgYnVmZmVycyAqLworICAgICAgTU5HX0ZSRUVYIChwRGF0YSwgcEJ1ZiwgaUJ1ZnNpemUpOworICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX09VVE9GTUVNT1JZKTsKKyAgICB9CisKKyAgICBNTkdfQ09QWSAoektleXdvcmQsIHBSYXdkYXRhLCBpS2V5d29yZGxlbik7CisKKyAgICBpZiAoIXBEYXRhLT5mUHJvY2Vzc3RleHQgKChtbmdfaGFuZGxlKXBEYXRhLCBNTkdfVFlQRV9aVFhULCB6S2V5d29yZCwgKG1uZ19wY2hhcilwQnVmLCAwLCAwKSkKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvbid0IGZvcmdldCB0byBkcm9wIHRoZSB0ZW1wIGJ1ZmZlcnMgKi8KKyAgICAgIE1OR19GUkVFWCAocERhdGEsIHBCdWYsIGlCdWZzaXplKTsKKyAgICAgIE1OR19GUkVFWCAocERhdGEsIHpLZXl3b3JkLCBpS2V5d29yZGxlbisxKTsKKyAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19BUFBNSVNDRVJST1IpOworICAgIH0KKyAgfQorCisjaWZkZWYgTU5HX1NUT1JFX0NIVU5LUworICBpZiAocERhdGEtPmJTdG9yZWNodW5rcykKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpemUgc3RvcmFnZSAqLworICAgIGlSZXRjb2RlID0gKChtbmdfY2h1bmtfaGVhZGVycClwSGVhZGVyKS0+ZkNyZWF0ZSAocERhdGEsIHBIZWFkZXIsIHBwQ2h1bmspOworCisgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZG9uJ3QgZm9yZ2V0IHRvIGRyb3AgdGhlIHRlbXAgYnVmZmVycyAqLworICAgICAgTU5HX0ZSRUVYIChwRGF0YSwgcEJ1ZiwgaUJ1ZnNpemUpOworICAgICAgTU5HX0ZSRUVYIChwRGF0YSwgektleXdvcmQsIGlLZXl3b3JkbGVuKzEpOworICAgICAgcmV0dXJuIGlSZXRjb2RlOworICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlIHRoZSBmaWVsZHMgKi8KKyAgICAoKG1uZ196dHh0cCkqcHBDaHVuayktPmlLZXl3b3Jkc2l6ZSA9IGlLZXl3b3JkbGVuOworICAgICgobW5nX3p0eHRwKSpwcENodW5rKS0+aUNvbXByZXNzaW9uID0gKihwVGVtcCsxKTsKKworICAgIGlmICgoIXBCdWYpICYmIChpQ29tcHJlc3NlZHNpemUpKSAgLyogZGlkIHdlIG5vdCBnZXQgYSB0ZXh0LWJ1ZmZlciB5ZXQgPyAqLworICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVjb21wcmVzcyB0aGUgdGV4dCAqLworICAgICAgaVJldGNvZGUgPSBtbmdfaW5mbGF0ZV9idWZmZXIgKHBEYXRhLCBwVGVtcCsyLCBpQ29tcHJlc3NlZHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBCdWYsICZpQnVmc2l6ZSwgJmlUZXh0bGVuKTsKKworICAgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvbid0IGZvcmdldCB0byBkcm9wIHRoZSB0ZW1wIGJ1ZmZlcnMgKi8KKyAgICAgICAgTU5HX0ZSRUVYIChwRGF0YSwgcEJ1ZiwgaUJ1ZnNpemUpOworICAgICAgICBNTkdfRlJFRVggKHBEYXRhLCB6S2V5d29yZCwgaUtleXdvcmRsZW4rMSk7CisgICAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBNTkdfQUxMT0NYIChwRGF0YSwgKChtbmdfenR4dHApKnBwQ2h1bmspLT56S2V5d29yZCwgaUtleXdvcmRsZW4gKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgaWYgKCEoKG1uZ196dHh0cCkqcHBDaHVuayktPnpLZXl3b3JkKQorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZG9uJ3QgZm9yZ2V0IHRvIGRyb3AgdGhlIHRlbXAgYnVmZmVycyAqLworICAgICAgTU5HX0ZSRUVYIChwRGF0YSwgcEJ1ZiwgaUJ1ZnNpemUpOworICAgICAgTU5HX0ZSRUVYIChwRGF0YSwgektleXdvcmQsIGlLZXl3b3JkbGVuKzEpOworICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX09VVE9GTUVNT1JZKTsKKyAgICB9CisKKyAgICBNTkdfQ09QWSAoKChtbmdfenR4dHApKnBwQ2h1bmspLT56S2V5d29yZCwgcFJhd2RhdGEsIGlLZXl3b3JkbGVuKTsKKworICAgICgobW5nX3p0eHRwKSpwcENodW5rKS0+aVRleHRzaXplID0gaVRleHRsZW47CisKKyAgICBpZiAoaUNvbXByZXNzZWRzaXplKQorICAgIHsKKyAgICAgIE1OR19BTExPQ1ggKHBEYXRhLCAoKG1uZ196dHh0cCkqcHBDaHVuayktPnpUZXh0LCBpVGV4dGxlbiArIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgIGlmICghKChtbmdfenR4dHApKnBwQ2h1bmspLT56VGV4dCkKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvbid0IGZvcmdldCB0byBkcm9wIHRoZSB0ZW1wIGJ1ZmZlcnMgKi8KKyAgICAgICAgTU5HX0ZSRUVYIChwRGF0YSwgcEJ1ZiwgaUJ1ZnNpemUpOworICAgICAgICBNTkdfRlJFRVggKHBEYXRhLCB6S2V5d29yZCwgaUtleXdvcmRsZW4rMSk7CisgICAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19PVVRPRk1FTU9SWSk7CisgICAgICB9CisKKyAgICAgIE1OR19DT1BZICgoKG1uZ196dHh0cCkqcHBDaHVuayktPnpUZXh0LCBwQnVmLCBpVGV4dGxlbik7CisgICAgfQorICB9CisjZW5kaWYgLyogTU5HX1NUT1JFX0NIVU5LUyAqLworCisgIE1OR19GUkVFWCAocERhdGEsIHBCdWYsIGlCdWZzaXplKTsgICAvKiBmcmVlIHRoZSB0ZW1wb3JhcnkgYnVmZmVycyAqLworICBNTkdfRlJFRVggKHBEYXRhLCB6S2V5d29yZCwgaUtleXdvcmRsZW4rMSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVBRF9aVFhULCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsgICAgICAgICAgICAgICAgICAvKiBkb25lICovCit9CisjZW5kaWYKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX2lUWHQKK1JFQURfQ0hVTksgKG1uZ19yZWFkX2l0eHQpCit7CisgIG1uZ19yZXRjb2RlIGlSZXRjb2RlOworICBtbmdfdWludDMyICBpS2V5d29yZGxlbiwgaVRleHRsZW4sIGlMYW5ndWFnZWxlbiwgaVRyYW5zbGF0aW9ubGVuOworICBtbmdfcGNoYXIgICB6S2V5d29yZCwgekxhbmd1YWdlLCB6VHJhbnNsYXRpb247CisgIG1uZ191aW50OHAgIHBOdWxsMSwgcE51bGwyLCBwTnVsbDM7CisgIG1uZ191aW50MzIgIGlDb21wcmVzc2Vkc2l6ZTsKKyAgbW5nX3VpbnQ4ICAgaUNvbXByZXNzaW9uZmxhZzsKKyAgbW5nX3VpbnQzMiAgaUJ1ZnNpemU7CisgIG1uZ191aW50OHAgIHBCdWY7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVBRF9JVFhULCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXF1ZW5jZSBjaGVja3MgKi8KKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgaWYgKCghcERhdGEtPmJIYXNNSERSKSAmJiAoIXBEYXRhLT5iSGFzSUhEUikgJiYKKyAgICAgICghcERhdGEtPmJIYXNCQVNJKSAmJiAoIXBEYXRhLT5iSGFzREhEUikgJiYgKCFwRGF0YS0+Ykhhc0pIRFIpKQorI2Vsc2UKKyAgaWYgKCghcERhdGEtPmJIYXNNSERSKSAmJiAoIXBEYXRhLT5iSGFzSUhEUikgJiYKKyAgICAgICghcERhdGEtPmJIYXNCQVNJKSAmJiAoIXBEYXRhLT5iSGFzREhEUikgICAgKQorI2VuZGlmCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1NFUVVFTkNFRVJST1IpOworCisgIGlmIChpUmF3bGVuIDwgNikgICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggbXVzdCBiZSBhdCBsZWFzdCA2ICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURMRU5HVEgpOworCisgIHBOdWxsMSA9IGZpbmRfbnVsbCAocFJhd2RhdGEpOyAgICAgICAvKiBmaW5kIHRoZSBudWxsIHNlcGFyYXRvcnMgKi8KKyAgcE51bGwyID0gZmluZF9udWxsIChwTnVsbDErMyk7CisgIHBOdWxsMyA9IGZpbmRfbnVsbCAocE51bGwyKzEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm90IGZvdW5kIGluc2lkZSBpbnB1dC1kYXRhID8gKi8KKyAgaWYgKCgocE51bGwxIC0gcFJhd2RhdGEpID4gKG1uZ19pbnQzMilpUmF3bGVuKSB8fAorICAgICAgKChwTnVsbDIgLSBwUmF3ZGF0YSkgPiAobW5nX2ludDMyKWlSYXdsZW4pIHx8CisgICAgICAoKHBOdWxsMyAtIHBSYXdkYXRhKSA+IChtbmdfaW50MzIpaVJhd2xlbikgICAgKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19OVUxMTk9URk9VTkQpOworCisgIGlmIChwTnVsbDEgPT0gcFJhd2RhdGEpICAgICAgICAgICAgICAvKiB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IDEgY2hhciBmb3Iga2V5d29yZCAqLworICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19LRVlXT1JETlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb21wcmVzc2lvbiBvciBub3QgPyAqLworICBpZiAoKCoocE51bGwxKzEpICE9IDApICYmICgqKHBOdWxsMSsxKSAhPSAxKSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRENPTVBSRVNTKTsKKworICBpZiAoKihwTnVsbDErMikgIT0gMCkgICAgICAgICAgICAgICAgLyogb25seSBkZWZsYXRlIGNvbXByZXNzaW9uLW1ldGhvZCBhbGxvd2VkICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURDT01QUkVTUyk7CisKKyAgaUtleXdvcmRsZW4gICAgICA9IChtbmdfdWludDMyKShwTnVsbDEgLSBwUmF3ZGF0YSk7CisgIGlMYW5ndWFnZWxlbiAgICAgPSAobW5nX3VpbnQzMikocE51bGwyIC0gcE51bGwxIC0gMyk7CisgIGlUcmFuc2xhdGlvbmxlbiAgPSAobW5nX3VpbnQzMikocE51bGwzIC0gcE51bGwyIC0gMSk7CisgIGlDb21wcmVzc2Vkc2l6ZSAgPSAobW5nX3VpbnQzMikoaVJhd2xlbiAtIGlLZXl3b3JkbGVuIC0gaUxhbmd1YWdlbGVuIC0gaVRyYW5zbGF0aW9ubGVuIC0gNSk7CisgIGlDb21wcmVzc2lvbmZsYWcgPSAqKHBOdWxsMSsxKTsKKworICB6S2V5d29yZCAgICAgPSAwOyAgICAgICAgICAgICAgICAgICAgLyogbm8gYnVmZmVycyBhY3F1aXJlZCB5ZXQgKi8KKyAgekxhbmd1YWdlICAgID0gMDsKKyAgelRyYW5zbGF0aW9uID0gMDsKKyAgcEJ1ZiAgICAgICAgID0gMDsKKyAgaVRleHRsZW4gICAgID0gMDsKKworICBpZiAocERhdGEtPmZQcm9jZXNzdGV4dCkgICAgICAgICAgICAgLyogaW5mb3JtIHRoZSBhcHBsaWNhdGlvbiA/ICovCisgIHsKKyAgICBpZiAoaUNvbXByZXNzaW9uZmxhZykgICAgICAgICAgICAgIC8qIGRlY29tcHJlc3MgdGhlIHRleHQgPyAqLworICAgIHsKKyAgICAgIGlSZXRjb2RlID0gbW5nX2luZmxhdGVfYnVmZmVyIChwRGF0YSwgcE51bGwzKzEsIGlDb21wcmVzc2Vkc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEJ1ZiwgJmlCdWZzaXplLCAmaVRleHRsZW4pOworCisgICAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZG9uJ3QgZm9yZ2V0IHRvIGRyb3AgdGhlIHRlbXAgYnVmZmVyICovCisgICAgICAgIE1OR19GUkVFWCAocERhdGEsIHBCdWYsIGlCdWZzaXplKTsKKyAgICAgICAgcmV0dXJuIGlSZXRjb2RlOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaVRleHRsZW4gPSBpQ29tcHJlc3NlZHNpemU7CisgICAgICBpQnVmc2l6ZSA9IGlUZXh0bGVuKzE7ICAgICAgICAgICAvKiBwbHVzIDEgZm9yIHRlcm1pbmF0b3IgYnl0ZSEhISAqLworCisgICAgICBNTkdfQUxMT0MgKHBEYXRhLCBwQnVmLCBpQnVmc2l6ZSk7CisgICAgICBNTkdfQ09QWSAgKHBCdWYsIHBOdWxsMysxLCBpVGV4dGxlbik7CisgICAgfQorCisgICAgTU5HX0FMTE9DWCAocERhdGEsIHpLZXl3b3JkLCAgICAgaUtleXdvcmRsZW4gICAgICsgMSk7CisgICAgTU5HX0FMTE9DWCAocERhdGEsIHpMYW5ndWFnZSwgICAgaUxhbmd1YWdlbGVuICAgICsgMSk7CisgICAgTU5HX0FMTE9DWCAocERhdGEsIHpUcmFuc2xhdGlvbiwgaVRyYW5zbGF0aW9ubGVuICsgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgIGlmICgoIXpLZXl3b3JkKSB8fCAoIXpMYW5ndWFnZSkgfHwgKCF6VHJhbnNsYXRpb24pKQorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZG9uJ3QgZm9yZ2V0IHRvIGRyb3AgdGhlIHRlbXAgYnVmZmVycyAqLworICAgICAgTU5HX0ZSRUVYIChwRGF0YSwgelRyYW5zbGF0aW9uLCBpVHJhbnNsYXRpb25sZW4gKyAxKTsKKyAgICAgIE1OR19GUkVFWCAocERhdGEsIHpMYW5ndWFnZSwgICAgaUxhbmd1YWdlbGVuICAgICsgMSk7CisgICAgICBNTkdfRlJFRVggKHBEYXRhLCB6S2V5d29yZCwgICAgIGlLZXl3b3JkbGVuICAgICArIDEpOworICAgICAgTU5HX0ZSRUVYIChwRGF0YSwgcEJ1ZiwgaUJ1ZnNpemUpOworICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX09VVE9GTUVNT1JZKTsKKyAgICB9CisKKyAgICBNTkdfQ09QWSAoektleXdvcmQsICAgICBwUmF3ZGF0YSwgaUtleXdvcmRsZW4pOworICAgIE1OR19DT1BZICh6TGFuZ3VhZ2UsICAgIHBOdWxsMSszLCBpTGFuZ3VhZ2VsZW4pOworICAgIE1OR19DT1BZICh6VHJhbnNsYXRpb24sIHBOdWxsMisxLCBpVHJhbnNsYXRpb25sZW4pOworCisgICAgaWYgKCFwRGF0YS0+ZlByb2Nlc3N0ZXh0ICgobW5nX2hhbmRsZSlwRGF0YSwgTU5HX1RZUEVfSVRYVCwgektleXdvcmQsIChtbmdfcGNoYXIpcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6TGFuZ3VhZ2UsIHpUcmFuc2xhdGlvbikpCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkb24ndCBmb3JnZXQgdG8gZHJvcCB0aGUgdGVtcCBidWZmZXJzICovCisgICAgICBNTkdfRlJFRVggKHBEYXRhLCB6VHJhbnNsYXRpb24sIGlUcmFuc2xhdGlvbmxlbiArIDEpOworICAgICAgTU5HX0ZSRUVYIChwRGF0YSwgekxhbmd1YWdlLCAgICBpTGFuZ3VhZ2VsZW4gICAgKyAxKTsKKyAgICAgIE1OR19GUkVFWCAocERhdGEsIHpLZXl3b3JkLCAgICAgaUtleXdvcmRsZW4gICAgICsgMSk7CisgICAgICBNTkdfRlJFRVggKHBEYXRhLCBwQnVmLCAgICAgICAgIGlCdWZzaXplKTsKKworICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0FQUE1JU0NFUlJPUik7CisgICAgfQorICB9CisKKyNpZmRlZiBNTkdfU1RPUkVfQ0hVTktTCisgIGlmIChwRGF0YS0+YlN0b3JlY2h1bmtzKQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdGlhbGl6ZSBzdG9yYWdlICovCisgICAgaVJldGNvZGUgPSAoKG1uZ19jaHVua19oZWFkZXJwKXBIZWFkZXIpLT5mQ3JlYXRlIChwRGF0YSwgcEhlYWRlciwgcHBDaHVuayk7CisKKyAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkb24ndCBmb3JnZXQgdG8gZHJvcCB0aGUgdGVtcCBidWZmZXJzICovCisgICAgICBNTkdfRlJFRVggKHBEYXRhLCB6VHJhbnNsYXRpb24sIGlUcmFuc2xhdGlvbmxlbiArIDEpOworICAgICAgTU5HX0ZSRUVYIChwRGF0YSwgekxhbmd1YWdlLCAgICBpTGFuZ3VhZ2VsZW4gICAgKyAxKTsKKyAgICAgIE1OR19GUkVFWCAocERhdGEsIHpLZXl3b3JkLCAgICAgaUtleXdvcmRsZW4gICAgICsgMSk7CisgICAgICBNTkdfRlJFRVggKHBEYXRhLCBwQnVmLCAgICAgICAgIGlCdWZzaXplKTsKKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZSB0aGUgZmllbGRzICovCisgICAgKChtbmdfaXR4dHApKnBwQ2h1bmspLT5pS2V5d29yZHNpemUgICAgICAgPSBpS2V5d29yZGxlbjsKKyAgICAoKG1uZ19pdHh0cCkqcHBDaHVuayktPmlMYW5ndWFnZXNpemUgICAgICA9IGlMYW5ndWFnZWxlbjsKKyAgICAoKG1uZ19pdHh0cCkqcHBDaHVuayktPmlUcmFuc2xhdGlvbnNpemUgICA9IGlUcmFuc2xhdGlvbmxlbjsKKyAgICAoKG1uZ19pdHh0cCkqcHBDaHVuayktPmlDb21wcmVzc2lvbmZsYWcgICA9ICoocE51bGwxKzEpOworICAgICgobW5nX2l0eHRwKSpwcENodW5rKS0+aUNvbXByZXNzaW9ubWV0aG9kID0gKihwTnVsbDErMik7CisKKyAgICBpZiAoKCFwQnVmKSAmJiAoaUNvbXByZXNzZWRzaXplKSkgIC8qIGRpZCB3ZSBub3QgZ2V0IGEgdGV4dC1idWZmZXIgeWV0ID8gKi8KKyAgICB7CisgICAgICBpZiAoaUNvbXByZXNzaW9uZmxhZykgICAgICAgICAgICAvKiBkZWNvbXByZXNzIHRoZSB0ZXh0ID8gKi8KKyAgICAgIHsKKyAgICAgICAgaVJldGNvZGUgPSBtbmdfaW5mbGF0ZV9idWZmZXIgKHBEYXRhLCBwTnVsbDMrMSwgaUNvbXByZXNzZWRzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBCdWYsICZpQnVmc2l6ZSwgJmlUZXh0bGVuKTsKKworICAgICAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvbid0IGZvcmdldCB0byBkcm9wIHRoZSB0ZW1wIGJ1ZmZlcnMgKi8KKyAgICAgICAgICBNTkdfRlJFRVggKHBEYXRhLCB6VHJhbnNsYXRpb24sIGlUcmFuc2xhdGlvbmxlbiArIDEpOworICAgICAgICAgIE1OR19GUkVFWCAocERhdGEsIHpMYW5ndWFnZSwgICAgaUxhbmd1YWdlbGVuICAgICsgMSk7CisgICAgICAgICAgTU5HX0ZSRUVYIChwRGF0YSwgektleXdvcmQsICAgICBpS2V5d29yZGxlbiAgICAgKyAxKTsKKyAgICAgICAgICBNTkdfRlJFRVggKHBEYXRhLCBwQnVmLCAgICAgICAgIGlCdWZzaXplKTsKKyAgICAgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgaVRleHRsZW4gPSBpQ29tcHJlc3NlZHNpemU7CisgICAgICAgIGlCdWZzaXplID0gaVRleHRsZW4rMTsgICAgICAgICAvKiBwbHVzIDEgZm9yIHRlcm1pbmF0b3IgYnl0ZSEhISAqLworCisgICAgICAgIE1OR19BTExPQyAocERhdGEsIHBCdWYsIGlCdWZzaXplKTsKKyAgICAgICAgTU5HX0NPUFkgIChwQnVmLCBwTnVsbDMrMSwgaVRleHRsZW4pOworICAgICAgfQorICAgIH0KKworICAgIE1OR19BTExPQ1ggKHBEYXRhLCAoKG1uZ19pdHh0cCkqcHBDaHVuayktPnpLZXl3b3JkLCAgICAgaUtleXdvcmRsZW4gICAgICsgMSk7CisgICAgTU5HX0FMTE9DWCAocERhdGEsICgobW5nX2l0eHRwKSpwcENodW5rKS0+ekxhbmd1YWdlLCAgICBpTGFuZ3VhZ2VsZW4gICAgKyAxKTsKKyAgICBNTkdfQUxMT0NYIChwRGF0YSwgKChtbmdfaXR4dHApKnBwQ2h1bmspLT56VHJhbnNsYXRpb24sIGlUcmFuc2xhdGlvbmxlbiArIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICBpZiAoKCEoKG1uZ19pdHh0cCkqcHBDaHVuayktPnpLZXl3b3JkICAgICkgfHwKKyAgICAgICAgKCEoKG1uZ19pdHh0cCkqcHBDaHVuayktPnpMYW5ndWFnZSAgICkgfHwKKyAgICAgICAgKCEoKG1uZ19pdHh0cCkqcHBDaHVuayktPnpUcmFuc2xhdGlvbikgICAgKQorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZG9uJ3QgZm9yZ2V0IHRvIGRyb3AgdGhlIHRlbXAgYnVmZmVycyAqLworICAgICAgTU5HX0ZSRUVYIChwRGF0YSwgelRyYW5zbGF0aW9uLCBpVHJhbnNsYXRpb25sZW4gKyAxKTsKKyAgICAgIE1OR19GUkVFWCAocERhdGEsIHpMYW5ndWFnZSwgICAgaUxhbmd1YWdlbGVuICAgICsgMSk7CisgICAgICBNTkdfRlJFRVggKHBEYXRhLCB6S2V5d29yZCwgICAgIGlLZXl3b3JkbGVuICAgICArIDEpOworICAgICAgTU5HX0ZSRUVYIChwRGF0YSwgcEJ1ZiwgICAgICAgICBpQnVmc2l6ZSk7CisgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfT1VUT0ZNRU1PUlkpOworICAgIH0KKworICAgIE1OR19DT1BZICgoKG1uZ19pdHh0cCkqcHBDaHVuayktPnpLZXl3b3JkLCAgICAgcFJhd2RhdGEsIGlLZXl3b3JkbGVuKTsKKyAgICBNTkdfQ09QWSAoKChtbmdfaXR4dHApKnBwQ2h1bmspLT56TGFuZ3VhZ2UsICAgIHBOdWxsMSszLCBpTGFuZ3VhZ2VsZW4pOworICAgIE1OR19DT1BZICgoKG1uZ19pdHh0cCkqcHBDaHVuayktPnpUcmFuc2xhdGlvbiwgcE51bGwyKzEsIGlUcmFuc2xhdGlvbmxlbik7CisKKyAgICAoKG1uZ19pdHh0cCkqcHBDaHVuayktPmlUZXh0c2l6ZSA9IGlUZXh0bGVuOworCisgICAgaWYgKGlUZXh0bGVuKQorICAgIHsKKyAgICAgIE1OR19BTExPQ1ggKHBEYXRhLCAoKG1uZ19pdHh0cCkqcHBDaHVuayktPnpUZXh0LCBpVGV4dGxlbiArIDEpOworCisgICAgICBpZiAoISgobW5nX2l0eHRwKSpwcENodW5rKS0+elRleHQpCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkb24ndCBmb3JnZXQgdG8gZHJvcCB0aGUgdGVtcCBidWZmZXJzICovCisgICAgICAgIE1OR19GUkVFWCAocERhdGEsIHpUcmFuc2xhdGlvbiwgaVRyYW5zbGF0aW9ubGVuICsgMSk7CisgICAgICAgIE1OR19GUkVFWCAocERhdGEsIHpMYW5ndWFnZSwgICAgaUxhbmd1YWdlbGVuICAgICsgMSk7CisgICAgICAgIE1OR19GUkVFWCAocERhdGEsIHpLZXl3b3JkLCAgICAgaUtleXdvcmRsZW4gICAgICsgMSk7CisgICAgICAgIE1OR19GUkVFWCAocERhdGEsIHBCdWYsICAgICAgICAgaUJ1ZnNpemUpOworICAgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfT1VUT0ZNRU1PUlkpOworICAgICAgfQorCisgICAgICBNTkdfQ09QWSAgKCgobW5nX2l0eHRwKSpwcENodW5rKS0+elRleHQsIHBCdWYsIGlUZXh0bGVuKTsKKyAgICB9CisgIH0KKyNlbmRpZiAvKiBNTkdfU1RPUkVfQ0hVTktTICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmcmVlIHRoZSB0ZW1wb3JhcnkgYnVmZmVycyAqLworICBNTkdfRlJFRVggKHBEYXRhLCB6VHJhbnNsYXRpb24sIGlUcmFuc2xhdGlvbmxlbiArIDEpOworICBNTkdfRlJFRVggKHBEYXRhLCB6TGFuZ3VhZ2UsICAgIGlMYW5ndWFnZWxlbiAgICArIDEpOworICBNTkdfRlJFRVggKHBEYXRhLCB6S2V5d29yZCwgICAgIGlLZXl3b3JkbGVuICAgICArIDEpOworICBNTkdfRlJFRVggKHBEYXRhLCBwQnVmLCAgICAgICAgIGlCdWZzaXplKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9SRUFEX0lUWFQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOyAgICAgICAgICAgICAgICAgIC8qIGRvbmUgKi8KK30KKyNlbmRpZgorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfYktHRAorUkVBRF9DSFVOSyAobW5nX3JlYWRfYmtnZCkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCisgIG1uZ19pbWFnZXAgICAgIHBJbWFnZSA9IChtbmdfaW1hZ2VwKXBEYXRhLT5wQ3VycmVudG9iajsKKyAgbW5nX2ltYWdlZGF0YXAgcEJ1ZjsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1JFQURfQktHRCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2VxdWVuY2UgY2hlY2tzICovCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisgIGlmICgoIXBEYXRhLT5iSGFzTUhEUikgJiYgKCFwRGF0YS0+Ykhhc0lIRFIpICYmCisgICAgICAoIXBEYXRhLT5iSGFzQkFTSSkgJiYgKCFwRGF0YS0+Ykhhc0RIRFIpICYmICghcERhdGEtPmJIYXNKSERSKSkKKyNlbHNlCisgIGlmICgoIXBEYXRhLT5iSGFzTUhEUikgJiYgKCFwRGF0YS0+Ykhhc0lIRFIpICYmCisgICAgICAoIXBEYXRhLT5iSGFzQkFTSSkgJiYgKCFwRGF0YS0+Ykhhc0RIRFIpICAgICkKKyNlbmRpZgorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19TRVFVRU5DRUVSUk9SKTsKKworI2lmZGVmIE1OR19JTkNMVURFX0pORworICBpZiAoKHBEYXRhLT5iSGFzSURBVCkgfHwgKHBEYXRhLT5iSGFzSkRBVCkgfHwgKHBEYXRhLT5iSGFzSkRBQSkpCisjZWxzZQorICBpZiAocERhdGEtPmJIYXNJREFUKQorI2VuZGlmCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1NFUVVFTkNFRVJST1IpOworCisgIGlmIChpUmF3bGVuID4gNikgICAgICAgICAgICAgICAgICAgICAvKiBpdCBqdXN0IGNhbid0IGJlIGJpZ2dlciB0aGFuIHRoYXQhICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURMRU5HVEgpOworCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HICAgICAgICAgICAgICAgICAvKiBsZW5ndGggY2hlY2tzICovCisgIGlmIChwRGF0YS0+Ykhhc0pIRFIpCisgIHsKKyAgICBpZiAoKChwRGF0YS0+aUpIRFJjb2xvcnR5cGUgPT0gOCkgfHwgKHBEYXRhLT5pSkhEUmNvbG9ydHlwZSA9PSAxMikpICYmIChpUmF3bGVuICE9IDIpKQorICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURMRU5HVEgpOworCisgICAgaWYgKCgocERhdGEtPmlKSERSY29sb3J0eXBlID09IDEwKSB8fCAocERhdGEtPmlKSERSY29sb3J0eXBlID09IDE0KSkgJiYgKGlSYXdsZW4gIT0gNikpCisgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRExFTkdUSCk7CisgIH0KKyAgZWxzZQorI2VuZGlmIC8qIE1OR19JTkNMVURFX0pORyAqLworICBpZiAoKHBEYXRhLT5iSGFzSUhEUikgfHwgKHBEYXRhLT5iSGFzQkFTSSkgfHwgKHBEYXRhLT5iSGFzREhEUikpCisgIHsKKyAgICBpZiAoKChwRGF0YS0+aUNvbG9ydHlwZSA9PSAwKSB8fCAocERhdGEtPmlDb2xvcnR5cGUgPT0gNCkpICYmIChpUmF3bGVuICE9IDIpKQorICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURMRU5HVEgpOworCisgICAgaWYgKCgocERhdGEtPmlDb2xvcnR5cGUgPT0gMikgfHwgKHBEYXRhLT5pQ29sb3J0eXBlID09IDYpKSAmJiAoaVJhd2xlbiAhPSA2KSkKKyAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElETEVOR1RIKTsKKworICAgIGlmICgocERhdGEtPmlDb2xvcnR5cGUgPT0gMykgJiYgKGlSYXdsZW4gIT0gMSkpCisgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRExFTkdUSCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgaWYgKGlSYXdsZW4gIT0gNikgICAgICAgICAgICAgICAgICAvKiBnbG9iYWwgaXMgYWx3YXlzIDE2LWJpdCBSR0IgISAqLworICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURMRU5HVEgpOworICB9CisKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgaWYgKChwRGF0YS0+Ykhhc0lIRFIpIHx8IChwRGF0YS0+Ykhhc0JBU0kpIHx8IChwRGF0YS0+Ykhhc0RIRFIpIHx8IChwRGF0YS0+Ykhhc0pIRFIpKQorI2Vsc2UKKyAgaWYgKChwRGF0YS0+Ykhhc0lIRFIpIHx8IChwRGF0YS0+Ykhhc0JBU0kpIHx8IChwRGF0YS0+Ykhhc0RIRFIpKQorI2VuZGlmCisgICAgcERhdGEtPmJIYXNCS0dEID0gTU5HX1RSVUU7ICAgICAgICAvKiBpbmRpY2F0ZSBiS0dEIGF2YWlsYWJsZSAqLworICBlbHNlCisgICAgcERhdGEtPmJIYXNnbG9iYWxCS0dEID0gKG1uZ19ib29sKShpUmF3bGVuICE9IDApOworCisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorICBpZiAoIXBJbWFnZSkgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgbm8gb2JqZWN0IGR1bXAgaXQgaW4gb2JqIDAgKi8KKyAgICBwSW1hZ2UgPSAobW5nX2ltYWdlcClwRGF0YS0+cE9ianplcm87CisKKyAgcEJ1ZiA9IHBJbWFnZS0+cEltZ2J1ZjsgICAgICAgICAgICAgIC8qIGFkZHJlc3Mgb2JqZWN0IGJ1ZmZlciAqLworCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisgIGlmIChwRGF0YS0+Ykhhc0pIRFIpCisgIHsKKyAgICBwQnVmLT5iSGFzQktHRCA9IE1OR19UUlVFOyAgICAgICAgIC8qIHRlbGwgdGhlIG9iamVjdCBpdCdzIGdvdCBiS0dEIG5vdyAqLworCisgICAgc3dpdGNoIChwRGF0YS0+aUpIRFJjb2xvcnR5cGUpICAgICAvKiBzdG9yZSBmaWVsZHMgZm9yIGZ1dHVyZSByZWZlcmVuY2UgKi8KKyAgICB7CisgICAgICBjYXNlICA4IDogOyAgICAgICAgICAgICAgICAgICAgICAvKiBncmF5ICovCisgICAgICBjYXNlIDEyIDogeyAgICAgICAgICAgICAgICAgICAgICAvKiBncmF5YSAqLworICAgICAgICAgICAgICAgICAgcEJ1Zi0+aUJLR0RncmF5ICA9IG1uZ19nZXRfdWludDE2IChwUmF3ZGF0YSk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICBjYXNlIDEwIDogOyAgICAgICAgICAgICAgICAgICAgICAvKiByZ2IgKi8KKyAgICAgIGNhc2UgMTQgOiB7ICAgICAgICAgICAgICAgICAgICAgIC8qIHJnYmEgKi8KKyAgICAgICAgICAgICAgICAgIHBCdWYtPmlCS0dEcmVkICAgPSBtbmdfZ2V0X3VpbnQxNiAocFJhd2RhdGEpOworICAgICAgICAgICAgICAgICAgcEJ1Zi0+aUJLR0RncmVlbiA9IG1uZ19nZXRfdWludDE2IChwUmF3ZGF0YSsyKTsKKyAgICAgICAgICAgICAgICAgIHBCdWYtPmlCS0dEYmx1ZSAgPSBtbmdfZ2V0X3VpbnQxNiAocFJhd2RhdGErNCk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgfQorICB9CisgIGVsc2UKKyNlbmRpZiAvKiBNTkdfSU5DTFVERV9KTkcgKi8KKyAgaWYgKChwRGF0YS0+Ykhhc0lIRFIpIHx8IChwRGF0YS0+Ykhhc0JBU0kpIHx8IChwRGF0YS0+Ykhhc0RIRFIpKQorICB7CisgICAgcEJ1Zi0+Ykhhc0JLR0QgPSBNTkdfVFJVRTsgICAgICAgICAvKiB0ZWxsIHRoZSBvYmplY3QgaXQncyBnb3QgYktHRCBub3cgKi8KKworICAgIHN3aXRjaCAocERhdGEtPmlDb2xvcnR5cGUpICAgICAgICAgLyogc3RvcmUgZmllbGRzIGZvciBmdXR1cmUgcmVmZXJlbmNlICovCisgICAgeworICAgICAgY2FzZSAwIDogOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdyYXkgKi8KKyAgICAgIGNhc2UgNCA6IHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBncmF5YSAqLworICAgICAgICAgICAgICAgICBwQnVmLT5pQktHRGdyYXkgID0gbW5nX2dldF91aW50MTYgKHBSYXdkYXRhKTsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICB9CisgICAgICBjYXNlIDIgOiA7ICAgICAgICAgICAgICAgICAgICAgICAgLyogcmdiICovCisgICAgICBjYXNlIDYgOiB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogcmdiYSAqLworICAgICAgICAgICAgICAgICBwQnVmLT5pQktHRHJlZCAgID0gbW5nX2dldF91aW50MTYgKHBSYXdkYXRhKTsKKyAgICAgICAgICAgICAgICAgcEJ1Zi0+aUJLR0RncmVlbiA9IG1uZ19nZXRfdWludDE2IChwUmF3ZGF0YSsyKTsKKyAgICAgICAgICAgICAgICAgcEJ1Zi0+aUJLR0RibHVlICA9IG1uZ19nZXRfdWludDE2IChwUmF3ZGF0YSs0KTsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICB9CisgICAgICBjYXNlIDMgOiB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5kZXhlZCAqLworICAgICAgICAgICAgICAgICBwQnVmLT5pQktHRGluZGV4ID0gKnBSYXdkYXRhOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlIGFzIGdsb2JhbCAqLworICB7CisgICAgaWYgKGlSYXdsZW4pCisgICAgeworICAgICAgcERhdGEtPmlHbG9iYWxCS0dEcmVkICAgPSBtbmdfZ2V0X3VpbnQxNiAocFJhd2RhdGEpOworICAgICAgcERhdGEtPmlHbG9iYWxCS0dEZ3JlZW4gPSBtbmdfZ2V0X3VpbnQxNiAocFJhd2RhdGErMik7CisgICAgICBwRGF0YS0+aUdsb2JhbEJLR0RibHVlICA9IG1uZ19nZXRfdWludDE2IChwUmF3ZGF0YSs0KTsKKyAgICB9CisKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSBhbiBhbmltYXRpb24gb2JqZWN0ICovCisgICAgICBtbmdfcmV0Y29kZSBpUmV0Y29kZSA9IG1uZ19jcmVhdGVfYW5pX2JrZ2QgKHBEYXRhLCBwRGF0YS0+aUdsb2JhbEJLR0RyZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pR2xvYmFsQktHRGdyZWVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aUdsb2JhbEJLR0RibHVlKTsKKworICAgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgICAgcmV0dXJuIGlSZXRjb2RlOworICAgIH0KKyAgfQorI2VuZGlmIC8qIE1OR19TVVBQT1JUX0RJU1BMQVkgKi8KKworI2lmZGVmIE1OR19TVE9SRV9DSFVOS1MKKyAgaWYgKHBEYXRhLT5iU3RvcmVjaHVua3MpCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0aWFsaXplIHN0b3JhZ2UgKi8KKyAgICBtbmdfcmV0Y29kZSBpUmV0Y29kZSA9ICgobW5nX2NodW5rX2hlYWRlcnApcEhlYWRlciktPmZDcmVhdGUgKHBEYXRhLCBwSGVhZGVyLCBwcENodW5rKTsKKworICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlIHRoZSBmaWVsZHMgKi8KKyAgICAoKG1uZ19ia2dkcCkqcHBDaHVuayktPmJFbXB0eSA9IChtbmdfYm9vbCkoaVJhd2xlbiA9PSAwKTsKKyAgICAoKG1uZ19ia2dkcCkqcHBDaHVuayktPmlUeXBlICA9IHBEYXRhLT5pQ29sb3J0eXBlOworCisgICAgaWYgKGlSYXdsZW4pCisgICAgeworICAgICAgc3dpdGNoIChpUmF3bGVuKSAgICAgICAgICAgICAgICAgLyogZ3Vlc3MgZnJvbSBsZW5ndGggKi8KKyAgICAgIHsKKyAgICAgICAgY2FzZSAxIDogeyAgICAgICAgICAgICAgICAgICAgIC8qIGluZGV4ZWQgKi8KKyAgICAgICAgICAgICAgICAgICAoKG1uZ19ia2dkcCkqcHBDaHVuayktPmlUeXBlICA9IDM7CisgICAgICAgICAgICAgICAgICAgKChtbmdfYmtnZHApKnBwQ2h1bmspLT5pSW5kZXggPSAqcFJhd2RhdGE7CisgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSAyIDogeyAgICAgICAgICAgICAgICAgICAgIC8qIGdyYXkgKi8KKyAgICAgICAgICAgICAgICAgICAoKG1uZ19ia2dkcCkqcHBDaHVuayktPmlUeXBlICA9IDA7CisgICAgICAgICAgICAgICAgICAgKChtbmdfYmtnZHApKnBwQ2h1bmspLT5pR3JheSAgPSBtbmdfZ2V0X3VpbnQxNiAocFJhd2RhdGEpOworICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICB9CisgICAgICAgIGNhc2UgNiA6IHsgICAgICAgICAgICAgICAgICAgICAvKiByZ2IgKi8KKyAgICAgICAgICAgICAgICAgICAoKG1uZ19ia2dkcCkqcHBDaHVuayktPmlUeXBlICA9IDI7CisgICAgICAgICAgICAgICAgICAgKChtbmdfYmtnZHApKnBwQ2h1bmspLT5pUmVkICAgPSBtbmdfZ2V0X3VpbnQxNiAocFJhd2RhdGEpOworICAgICAgICAgICAgICAgICAgICgobW5nX2JrZ2RwKSpwcENodW5rKS0+aUdyZWVuID0gbW5nX2dldF91aW50MTYgKHBSYXdkYXRhKzIpOworICAgICAgICAgICAgICAgICAgICgobW5nX2JrZ2RwKSpwcENodW5rKS0+aUJsdWUgID0gbW5nX2dldF91aW50MTYgKHBSYXdkYXRhKzQpOworICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisjZW5kaWYgLyogTU5HX1NUT1JFX0NIVU5LUyAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1JFQURfQktHRCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7ICAgICAgICAgICAgICAgICAgLyogZG9uZSAqLworfQorI2VuZGlmCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19wSFlzCitSRUFEX0NIVU5LIChtbmdfcmVhZF9waHlzKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9SRUFEX1BIWVMsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNlcXVlbmNlIGNoZWNrcyAqLworI2lmZGVmIE1OR19JTkNMVURFX0pORworICBpZiAoKCFwRGF0YS0+Ykhhc01IRFIpICYmICghcERhdGEtPmJIYXNJSERSKSAmJgorICAgICAgKCFwRGF0YS0+Ykhhc0JBU0kpICYmICghcERhdGEtPmJIYXNESERSKSAmJiAoIXBEYXRhLT5iSGFzSkhEUikpCisjZWxzZQorICBpZiAoKCFwRGF0YS0+Ykhhc01IRFIpICYmICghcERhdGEtPmJIYXNJSERSKSAmJgorICAgICAgKCFwRGF0YS0+Ykhhc0JBU0kpICYmICghcERhdGEtPmJIYXNESERSKSAgICApCisjZW5kaWYKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfU0VRVUVOQ0VFUlJPUik7CisKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgaWYgKChwRGF0YS0+Ykhhc0lEQVQpIHx8IChwRGF0YS0+Ykhhc0pEQVQpIHx8IChwRGF0YS0+Ykhhc0pEQUEpKQorI2Vsc2UKKyAgaWYgKHBEYXRhLT5iSGFzSURBVCkKKyNlbmRpZgorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19TRVFVRU5DRUVSUk9SKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGl0J3MgOSBieXRlcyBvciBlbXB0eTsgbm8gbW9yZSwgbm8gbGVzcyEgKi8KKyAgaWYgKChpUmF3bGVuICE9IDkpICYmIChpUmF3bGVuICE9IDApKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElETEVOR1RIKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX0RJU1BMQVkKKyAgeworCisKKyAgICAvKiBUT0RPOiBzb21ldGhpbmcgISEhICovCisKKworICB9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfRElTUExBWSAqLworCisjaWZkZWYgTU5HX1NUT1JFX0NIVU5LUworICBpZiAocERhdGEtPmJTdG9yZWNodW5rcykKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpemUgc3RvcmFnZSAqLworICAgIG1uZ19yZXRjb2RlIGlSZXRjb2RlID0gKChtbmdfY2h1bmtfaGVhZGVycClwSGVhZGVyKS0+ZkNyZWF0ZSAocERhdGEsIHBIZWFkZXIsIHBwQ2h1bmspOworCisgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgcmV0dXJuIGlSZXRjb2RlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmUgdGhlIGZpZWxkcyAqLworICAgICgobW5nX3BoeXNwKSpwcENodW5rKS0+YkVtcHR5ID0gKG1uZ19ib29sKShpUmF3bGVuID09IDApOworCisgICAgaWYgKGlSYXdsZW4pCisgICAgeworICAgICAgKChtbmdfcGh5c3ApKnBwQ2h1bmspLT5pU2l6ZXggPSBtbmdfZ2V0X3VpbnQzMiAocFJhd2RhdGEpOworICAgICAgKChtbmdfcGh5c3ApKnBwQ2h1bmspLT5pU2l6ZXkgPSBtbmdfZ2V0X3VpbnQzMiAocFJhd2RhdGErNCk7CisgICAgICAoKG1uZ19waHlzcCkqcHBDaHVuayktPmlVbml0ICA9ICoocFJhd2RhdGErOCk7CisgICAgfQorICB9CisjZW5kaWYgLyogTU5HX1NUT1JFX0NIVU5LUyAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1JFQURfUEhZUywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7ICAgICAgICAgICAgICAgICAgLyogZG9uZSAqLworfQorI2VuZGlmCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19zQklUCitSRUFEX0NIVU5LIChtbmdfcmVhZF9zYml0KQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9SRUFEX1NCSVQsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNlcXVlbmNlIGNoZWNrcyAqLworI2lmZGVmIE1OR19JTkNMVURFX0pORworICBpZiAoKCFwRGF0YS0+Ykhhc01IRFIpICYmICghcERhdGEtPmJIYXNJSERSKSAmJgorICAgICAgKCFwRGF0YS0+Ykhhc0JBU0kpICYmICghcERhdGEtPmJIYXNESERSKSAmJiAoIXBEYXRhLT5iSGFzSkhEUikpCisjZWxzZQorICBpZiAoKCFwRGF0YS0+Ykhhc01IRFIpICYmICghcERhdGEtPmJIYXNJSERSKSAmJgorICAgICAgKCFwRGF0YS0+Ykhhc0JBU0kpICYmICghcERhdGEtPmJIYXNESERSKSAgICApCisjZW5kaWYKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfU0VRVUVOQ0VFUlJPUik7CisKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgaWYgKChwRGF0YS0+Ykhhc1BMVEUpIHx8IChwRGF0YS0+Ykhhc0lEQVQpIHx8IChwRGF0YS0+Ykhhc0pEQVQpIHx8IChwRGF0YS0+Ykhhc0pEQUEpKQorI2Vsc2UKKyAgaWYgKChwRGF0YS0+Ykhhc1BMVEUpIHx8IChwRGF0YS0+Ykhhc0lEQVQpKQorI2VuZGlmCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1NFUVVFTkNFRVJST1IpOworCisgIGlmIChpUmF3bGVuID4gNCkgICAgICAgICAgICAgICAgICAgICAvKiBpdCBqdXN0IGNhbid0IGJlIGJpZ2dlciB0aGFuIHRoYXQhICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURMRU5HVEgpOworCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HICAgICAgICAgICAgICAgICAvKiBsZW5ndGggY2hlY2tzICovCisgIGlmIChwRGF0YS0+Ykhhc0pIRFIpCisgIHsKKyAgICBpZiAoKHBEYXRhLT5pSkhEUmNvbG9ydHlwZSA9PSAgOCkgJiYgKGlSYXdsZW4gIT0gMSkpCisgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRExFTkdUSCk7CisKKyAgICBpZiAoKHBEYXRhLT5pSkhEUmNvbG9ydHlwZSA9PSAxMCkgJiYgKGlSYXdsZW4gIT0gMykpCisgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRExFTkdUSCk7CisKKyAgICBpZiAoKHBEYXRhLT5pSkhEUmNvbG9ydHlwZSA9PSAxMikgJiYgKGlSYXdsZW4gIT0gMikpCisgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRExFTkdUSCk7CisKKyAgICBpZiAoKHBEYXRhLT5pSkhEUmNvbG9ydHlwZSA9PSAxNCkgJiYgKGlSYXdsZW4gIT0gNCkpCisgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRExFTkdUSCk7CisgIH0KKyAgZWxzZQorI2VuZGlmIC8qIE1OR19JTkNMVURFX0pORyAqLworICBpZiAoKHBEYXRhLT5iSGFzSUhEUikgfHwgKHBEYXRhLT5iSGFzQkFTSSkgfHwgKHBEYXRhLT5iSGFzREhEUikpCisgIHsKKyAgICBpZiAoKHBEYXRhLT5pQ29sb3J0eXBlID09IDApICYmIChpUmF3bGVuICE9IDEpKQorICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURMRU5HVEgpOworCisgICAgaWYgKChwRGF0YS0+aUNvbG9ydHlwZSA9PSAyKSAmJiAoaVJhd2xlbiAhPSAzKSkKKyAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElETEVOR1RIKTsKKworICAgIGlmICgocERhdGEtPmlDb2xvcnR5cGUgPT0gMykgJiYgKGlSYXdsZW4gIT0gMykpCisgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRExFTkdUSCk7CisKKyAgICBpZiAoKHBEYXRhLT5pQ29sb3J0eXBlID09IDQpICYmIChpUmF3bGVuICE9IDIpKQorICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURMRU5HVEgpOworCisgICAgaWYgKChwRGF0YS0+aUNvbG9ydHlwZSA9PSA2KSAmJiAoaVJhd2xlbiAhPSA0KSkKKyAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElETEVOR1RIKTsKKyAgfQorICBlbHNlCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnbG9iYWwgPSBlbXB0eSBvciBSR0JBICovCisgICAgaWYgKChpUmF3bGVuICE9IDApICYmIChpUmF3bGVuICE9IDQpKQorICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURMRU5HVEgpOworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCisgIHsKKworCisgICAgLyogVE9ETzogc29tZXRoaW5nICEhISAqLworCisKKyAgfQorI2VuZGlmIC8qIE1OR19TVVBQT1JUX0RJU1BMQVkgKi8KKworI2lmZGVmIE1OR19TVE9SRV9DSFVOS1MKKyAgaWYgKHBEYXRhLT5iU3RvcmVjaHVua3MpCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0aWFsaXplIHN0b3JhZ2UgKi8KKyAgICBtbmdfcmV0Y29kZSBpUmV0Y29kZSA9ICgobW5nX2NodW5rX2hlYWRlcnApcEhlYWRlciktPmZDcmVhdGUgKHBEYXRhLCBwSGVhZGVyLCBwcENodW5rKTsKKworICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlIHRoZSBmaWVsZHMgKi8KKyAgICAoKG1uZ19zYml0cCkqcHBDaHVuayktPmJFbXB0eSA9IChtbmdfYm9vbCkoaVJhd2xlbiA9PSAwKTsKKworICAgIGlmIChpUmF3bGVuKQorICAgIHsKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgICAgIGlmIChwRGF0YS0+Ykhhc0pIRFIpCisgICAgICAgICgobW5nX3NiaXRwKSpwcENodW5rKS0+aVR5cGUgPSBwRGF0YS0+aUpIRFJjb2xvcnR5cGU7CisgICAgICBlbHNlCisjZW5kaWYKKyAgICAgIGlmIChwRGF0YS0+Ykhhc0lIRFIpCisgICAgICAgICgobW5nX3NiaXRwKSpwcENodW5rKS0+aVR5cGUgPSBwRGF0YS0+aUNvbG9ydHlwZTsKKyAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdsb2JhbCAhICovCisgICAgICAgICgobW5nX3NiaXRwKSpwcENodW5rKS0+aVR5cGUgPSA2OworCisgICAgICBpZiAoaVJhd2xlbiA+IDApCisgICAgICAgICgobW5nX3NiaXRwKSpwcENodW5rKS0+YUJpdHMgWzBdID0gKnBSYXdkYXRhOworICAgICAgaWYgKGlSYXdsZW4gPiAxKQorICAgICAgICAoKG1uZ19zYml0cCkqcHBDaHVuayktPmFCaXRzIFsxXSA9ICoocFJhd2RhdGErMSk7CisgICAgICBpZiAoaVJhd2xlbiA+IDIpCisgICAgICAgICgobW5nX3NiaXRwKSpwcENodW5rKS0+YUJpdHMgWzJdID0gKihwUmF3ZGF0YSsyKTsKKyAgICAgIGlmIChpUmF3bGVuID4gMykKKyAgICAgICAgKChtbmdfc2JpdHApKnBwQ2h1bmspLT5hQml0cyBbM10gPSAqKHBSYXdkYXRhKzMpOworCisgICAgfQorICB9CisjZW5kaWYgLyogTU5HX1NUT1JFX0NIVU5LUyAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1JFQURfU0JJVCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7ICAgICAgICAgICAgICAgICAgLyogZG9uZSAqLworfQorI2VuZGlmCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19zUExUCitSRUFEX0NIVU5LIChtbmdfcmVhZF9zcGx0KQoreworICBtbmdfdWludDhwIHBUZW1wOworICBtbmdfdWludDMyIGlOYW1lbGVuOworICBtbmdfdWludDggIGlTYW1wbGVkZXB0aDsKKyAgbW5nX3VpbnQzMiBpUmVtYWluOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1JFQURfU1BMVCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2VxdWVuY2UgY2hlY2tzICovCisgIGlmICgoIXBEYXRhLT5iSGFzTUhEUikgJiYgKCFwRGF0YS0+Ykhhc0lIRFIpICYmCisgICAgICAoIXBEYXRhLT5iSGFzQkFTSSkgJiYgKCFwRGF0YS0+Ykhhc0RIRFIpICAgICkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfU0VRVUVOQ0VFUlJPUik7CisKKyAgaWYgKHBEYXRhLT5iSGFzSURBVCkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfU0VRVUVOQ0VFUlJPUik7CisKKyAgaWYgKGlSYXdsZW4pCisgIHsKKyAgICBwVGVtcCA9IGZpbmRfbnVsbCAocFJhd2RhdGEpOyAgICAgIC8qIGZpbmQgbnVsbC1zZXBhcmF0b3IgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdCBmb3VuZCBpbnNpZGUgaW5wdXQtZGF0YSA/ICovCisgICAgaWYgKChwVGVtcCAtIHBSYXdkYXRhKSA+IChtbmdfaW50MzIpaVJhd2xlbikKKyAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19OVUxMTk9URk9VTkQpOworCisgICAgaU5hbWVsZW4gICAgID0gKG1uZ191aW50MzIpKHBUZW1wIC0gcFJhd2RhdGEpOworICAgIGlTYW1wbGVkZXB0aCA9ICoocFRlbXArMSk7CisgICAgaVJlbWFpbiAgICAgID0gKGlSYXdsZW4gLSAyIC0gaU5hbWVsZW4pOworCisgICAgaWYgKChpU2FtcGxlZGVwdGggIT0gMSkgJiYgKGlTYW1wbGVkZXB0aCAhPSAyKSkKKyAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZTQU1QTEVERVBUSCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGVjayByZW1haW5pbmcgbGVuZ3RoICovCisgICAgaWYgKCAoKGlTYW1wbGVkZXB0aCA9PSAxKSAmJiAoaVJlbWFpbiAlICA2ICE9IDApKSB8fAorICAgICAgICAgKChpU2FtcGxlZGVwdGggPT0gMikgJiYgKGlSZW1haW4gJSAxMCAhPSAwKSkgICAgKQorICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURMRU5HVEgpOworCisgIH0KKyAgZWxzZQorICB7CisgICAgcFRlbXAgICAgICAgID0gTU5HX05VTEw7CisgICAgaU5hbWVsZW4gICAgID0gMDsKKyAgICBpU2FtcGxlZGVwdGggPSAwOworICAgIGlSZW1haW4gICAgICA9IDA7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX0RJU1BMQVkKKyAgeworCisKKyAgICAvKiBUT0RPOiBzb21ldGhpbmcgISEhICovCisKKworICB9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfRElTUExBWSAqLworCisjaWZkZWYgTU5HX1NUT1JFX0NIVU5LUworICBpZiAocERhdGEtPmJTdG9yZWNodW5rcykKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpemUgc3RvcmFnZSAqLworICAgIG1uZ19yZXRjb2RlIGlSZXRjb2RlID0gKChtbmdfY2h1bmtfaGVhZGVycClwSGVhZGVyKS0+ZkNyZWF0ZSAocERhdGEsIHBIZWFkZXIsIHBwQ2h1bmspOworCisgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgcmV0dXJuIGlSZXRjb2RlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmUgdGhlIGZpZWxkcyAqLworICAgICgobW5nX3NwbHRwKSpwcENodW5rKS0+YkVtcHR5ID0gKG1uZ19ib29sKShpUmF3bGVuID09IDApOworCisgICAgaWYgKGlSYXdsZW4pCisgICAgeworICAgICAgKChtbmdfc3BsdHApKnBwQ2h1bmspLT5pTmFtZXNpemUgICAgPSBpTmFtZWxlbjsKKyAgICAgICgobW5nX3NwbHRwKSpwcENodW5rKS0+aVNhbXBsZWRlcHRoID0gaVNhbXBsZWRlcHRoOworCisgICAgICBpZiAoaVNhbXBsZWRlcHRoID09IDEpCisgICAgICAgICgobW5nX3NwbHRwKSpwcENodW5rKS0+aUVudHJ5Y291bnQgPSBpUmVtYWluIC8gNjsKKyAgICAgIGVsc2UKKyAgICAgICAgKChtbmdfc3BsdHApKnBwQ2h1bmspLT5pRW50cnljb3VudCA9IGlSZW1haW4gLyAxMDsKKworICAgICAgaWYgKGlOYW1lbGVuKQorICAgICAgeworICAgICAgICBNTkdfQUxMT0MgKHBEYXRhLCAoKG1uZ19zcGx0cCkqcHBDaHVuayktPnpOYW1lLCBpTmFtZWxlbisxKTsKKyAgICAgICAgTU5HX0NPUFkgKCgobW5nX3NwbHRwKSpwcENodW5rKS0+ek5hbWUsIHBSYXdkYXRhLCBpTmFtZWxlbik7CisgICAgICB9CisKKyAgICAgIGlmIChpUmVtYWluKQorICAgICAgeworICAgICAgICBNTkdfQUxMT0MgKHBEYXRhLCAoKG1uZ19zcGx0cCkqcHBDaHVuayktPnBFbnRyaWVzLCBpUmVtYWluKTsKKyAgICAgICAgTU5HX0NPUFkgKCgobW5nX3NwbHRwKSpwcENodW5rKS0+cEVudHJpZXMsIHBUZW1wKzIsIGlSZW1haW4pOworICAgICAgfQorICAgIH0KKyAgfQorI2VuZGlmIC8qIE1OR19TVE9SRV9DSFVOS1MgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9SRUFEX1NQTFQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOyAgICAgICAgICAgICAgICAgIC8qIGRvbmUgKi8KK30KKyNlbmRpZgorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfaElTVAorUkVBRF9DSFVOSyAobW5nX3JlYWRfaGlzdCkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVBRF9ISVNULCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXF1ZW5jZSBjaGVja3MgKi8KKyAgaWYgKCghcERhdGEtPmJIYXNJSERSKSAmJiAoIXBEYXRhLT5iSGFzQkFTSSkgJiYgKCFwRGF0YS0+Ykhhc0RIRFIpICAgICkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfU0VRVUVOQ0VFUlJPUik7CisKKyAgaWYgKCghcERhdGEtPmJIYXNQTFRFKSB8fCAocERhdGEtPmJIYXNJREFUKSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfU0VRVUVOQ0VFUlJPUik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggb2tlID8gKi8KKyAgaWYgKCAoKGlSYXdsZW4gJiAweDAxKSAhPSAwKSB8fCAoKGlSYXdsZW4gPj4gMSkgIT0gcERhdGEtPmlQTFRFY291bnQpICkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRExFTkdUSCk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCisgIHsKKworCisgICAgLyogVE9ETzogc29tZXRoaW5nICEhISAqLworCisKKyAgfQorI2VuZGlmIC8qIE1OR19TVVBQT1JUX0RJU1BMQVkgKi8KKworI2lmZGVmIE1OR19TVE9SRV9DSFVOS1MKKyAgaWYgKHBEYXRhLT5iU3RvcmVjaHVua3MpCisgIHsKKyAgICBtbmdfdWludDMyIGlYOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdGlhbGl6ZSBzdG9yYWdlICovCisgICAgbW5nX3JldGNvZGUgaVJldGNvZGUgPSAoKG1uZ19jaHVua19oZWFkZXJwKXBIZWFkZXIpLT5mQ3JlYXRlIChwRGF0YSwgcEhlYWRlciwgcHBDaHVuayk7CisKKyAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZSB0aGUgZmllbGRzICovCisgICAgKChtbmdfaGlzdHApKnBwQ2h1bmspLT5pRW50cnljb3VudCA9IGlSYXdsZW4gPj4gMTsKKworICAgIGZvciAoaVggPSAwOyBpWCA8IChpUmF3bGVuID4+IDEpOyBpWCsrKQorICAgIHsKKyAgICAgICgobW5nX2hpc3RwKSpwcENodW5rKS0+YUVudHJpZXMgW2lYXSA9IG1uZ19nZXRfdWludDE2IChwUmF3ZGF0YSk7CisgICAgICBwUmF3ZGF0YSArPSAyOworICAgIH0KKyAgfQorI2VuZGlmIC8qIE1OR19TVE9SRV9DSFVOS1MgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9SRUFEX0hJU1QsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOyAgICAgICAgICAgICAgICAgIC8qIGRvbmUgKi8KK30KKyNlbmRpZgorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfdElNRQorUkVBRF9DSFVOSyAobW5nX3JlYWRfdGltZSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVBRF9USU1FLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXF1ZW5jZSBjaGVja3MgKi8KKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgaWYgKCghcERhdGEtPmJIYXNNSERSKSAmJiAoIXBEYXRhLT5iSGFzSUhEUikgJiYKKyAgICAgICghcERhdGEtPmJIYXNCQVNJKSAmJiAoIXBEYXRhLT5iSGFzREhEUikgJiYgKCFwRGF0YS0+Ykhhc0pIRFIpKQorI2Vsc2UKKyAgaWYgKCghcERhdGEtPmJIYXNNSERSKSAmJiAoIXBEYXRhLT5iSGFzSUhEUikgJiYKKyAgICAgICghcERhdGEtPmJIYXNCQVNJKSAmJiAoIXBEYXRhLT5iSGFzREhEUikgICAgKQorI2VuZGlmCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1NFUVVFTkNFRVJST1IpOworCisgIGlmIChpUmF3bGVuICE9IDcpICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggbXVzdCBiZSBleGFjdGx5IDcgKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRExFTkdUSCk7CisKKy8qICBpZiAocERhdGEtPmZQcm9jZXNzdGltZSkgKi8gICAgICAgICAgICAvKiBpbmZvcm0gdGhlIGFwcGxpY2F0aW9uID8gKi8KKy8qICB7CisKKyAgICBwRGF0YS0+ZlByb2Nlc3N0aW1lICgobW5nX2hhbmRsZSlwRGF0YSwgKTsKKyAgfSAqLworCisjaWZkZWYgTU5HX1NUT1JFX0NIVU5LUworICBpZiAocERhdGEtPmJTdG9yZWNodW5rcykKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpemUgc3RvcmFnZSAqLworICAgIG1uZ19yZXRjb2RlIGlSZXRjb2RlID0gKChtbmdfY2h1bmtfaGVhZGVycClwSGVhZGVyKS0+ZkNyZWF0ZSAocERhdGEsIHBIZWFkZXIsIHBwQ2h1bmspOworCisgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgcmV0dXJuIGlSZXRjb2RlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmUgdGhlIGZpZWxkcyAqLworICAgICgobW5nX3RpbWVwKSpwcENodW5rKS0+aVllYXIgICA9IG1uZ19nZXRfdWludDE2IChwUmF3ZGF0YSk7CisgICAgKChtbmdfdGltZXApKnBwQ2h1bmspLT5pTW9udGggID0gKihwUmF3ZGF0YSsyKTsKKyAgICAoKG1uZ190aW1lcCkqcHBDaHVuayktPmlEYXkgICAgPSAqKHBSYXdkYXRhKzMpOworICAgICgobW5nX3RpbWVwKSpwcENodW5rKS0+aUhvdXIgICA9ICoocFJhd2RhdGErNCk7CisgICAgKChtbmdfdGltZXApKnBwQ2h1bmspLT5pTWludXRlID0gKihwUmF3ZGF0YSs1KTsKKyAgICAoKG1uZ190aW1lcCkqcHBDaHVuayktPmlTZWNvbmQgPSAqKHBSYXdkYXRhKzYpOworICB9CisjZW5kaWYgLyogTU5HX1NUT1JFX0NIVU5LUyAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1JFQURfVElNRSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7ICAgICAgICAgICAgICAgICAgLyogZG9uZSAqLworfQorI2VuZGlmCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKK1JFQURfQ0hVTksgKG1uZ19yZWFkX21oZHIpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1JFQURfTUhEUiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmIChwRGF0YS0+ZVNpZ3R5cGUgIT0gbW5nX2l0X21uZykgICAvKiBzZXF1ZW5jZSBjaGVja3MgKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfQ0hVTktOT1RBTExPV0VEKTsKKworICBpZiAocERhdGEtPmJIYXNoZWFkZXIpICAgICAgICAgICAgICAgLyogY2FuIG9ubHkgYmUgdGhlIGZpcnN0IGNodW5rISAqLworICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19TRVFVRU5DRUVSUk9SKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvcnJlY3QgbGVuZ3RoID8gKi8KKyNpZm5kZWYgTU5HX05PX09MRF9WRVJTSU9OUworICBpZiAoKGlSYXdsZW4gIT0gMjgpICYmIChpUmF3bGVuICE9IDEyKSkKKyNlbHNlCisgIGlmICgoaVJhd2xlbiAhPSAyOCkpCisjZW5kaWYKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRExFTkdUSCk7CisKKyAgcERhdGEtPmJIYXNNSERSICAgICAgID0gTU5HX1RSVUU7ICAgIC8qIG9oIGJveSwgYSByZWFsIE1ORyAqLworICBwRGF0YS0+Ykhhc2hlYWRlciAgICAgPSBNTkdfVFJVRTsgICAgLyogd2UndmUgZ290IGEgaGVhZGVyICovCisgIHBEYXRhLT5lSW1hZ2V0eXBlICAgICA9IG1uZ19pdF9tbmc7ICAvKiBmaWxsIGhlYWRlciBmaWVsZHMgKi8KKyAgcERhdGEtPmlXaWR0aCAgICAgICAgID0gbW5nX2dldF91aW50MzIgKHBSYXdkYXRhKTsKKyAgcERhdGEtPmlIZWlnaHQgICAgICAgID0gbW5nX2dldF91aW50MzIgKHBSYXdkYXRhKzQpOworICBwRGF0YS0+aVRpY2tzICAgICAgICAgPSBtbmdfZ2V0X3VpbnQzMiAocFJhd2RhdGErOCk7CisKKyNpZm5kZWYgTU5HX05PX09MRF9WRVJTSU9OUworICBpZiAoaVJhd2xlbiA9PSAyOCkgICAgICAgICAgICAgICAgICAgLyogcHJvcGVyIE1IRFIgPyAqLworICB7CisjZW5kaWYKKyAgICBwRGF0YS0+aUxheWVyY291bnQgID0gbW5nX2dldF91aW50MzIgKHBSYXdkYXRhKzEyKTsKKyAgICBwRGF0YS0+aUZyYW1lY291bnQgID0gbW5nX2dldF91aW50MzIgKHBSYXdkYXRhKzE2KTsKKyAgICBwRGF0YS0+aVBsYXl0aW1lICAgID0gbW5nX2dldF91aW50MzIgKHBSYXdkYXRhKzIwKTsKKyAgICBwRGF0YS0+aVNpbXBsaWNpdHkgID0gbW5nX2dldF91aW50MzIgKHBSYXdkYXRhKzI0KTsKKworI2lmbmRlZiBNTkdfTk9fT0xEX1ZFUlNJT05TCisgICAgcERhdGEtPmJQcmVEcmFmdDQ4ICA9IE1OR19GQUxTRTsKKyAgfQorICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJvYmFibHkgcHJlLWRyYWZ0NDggdGhlbiAqLworICB7CisgICAgcERhdGEtPmlMYXllcmNvdW50ICA9IDA7CisgICAgcERhdGEtPmlGcmFtZWNvdW50ICA9IDA7CisgICAgcERhdGEtPmlQbGF5dGltZSAgICA9IDA7CisgICAgcERhdGEtPmlTaW1wbGljaXR5ICA9IDA7CisKKyAgICBwRGF0YS0+YlByZURyYWZ0NDggID0gTU5HX1RSVUU7CisgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJlZGljdCBhbHBoYS1kZXB0aCAqLworICBpZiAoKHBEYXRhLT5pU2ltcGxpY2l0eSAmIDB4MDAwMDAwMDEpID09IDApCisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgcERhdGEtPmlBbHBoYWRlcHRoID0gMTY7ICAgICAgICAgICAvKiBubyBpbmRpY2F0b3JzID0gYXNzdW1lIHRoZSB3b3JzdCAqLworI2Vsc2UKKyAgICBwRGF0YS0+aUFscGhhZGVwdGggPSA4OyAgICAgICAgICAgIC8qIGFueXRoaW5nIGVsc2UgPSBhc3N1bWUgdGhlIHdvcnN0ICovCisjZW5kaWYKKyAgZWxzZQorICBpZiAoKHBEYXRhLT5pU2ltcGxpY2l0eSAmIDB4MDAwMDAwMDgpID09IDApCisgICAgcERhdGEtPmlBbHBoYWRlcHRoID0gMDsgICAgICAgICAgICAvKiBubyB0cmFuc3BhcmVuY3kgYXQgYWxsICovCisgIGVsc2UKKyAgaWYgKChwRGF0YS0+aVNpbXBsaWNpdHkgJiAweDAwMDAwMTQwKSA9PSAweDAwMDAwMDQwKQorICAgIHBEYXRhLT5pQWxwaGFkZXB0aCA9IDE7ICAgICAgICAgICAgLyogbm8gc2VtaS10cmFuc3BhcmVuY3kgZ3VhcmFudGVlZCAqLworICBlbHNlCisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgcERhdGEtPmlBbHBoYWRlcHRoID0gMTY7ICAgICAgICAgICAvKiBhbnl0aGluZyBlbHNlID0gYXNzdW1lIHRoZSB3b3JzdCAqLworI2Vsc2UKKyAgICBwRGF0YS0+aUFscGhhZGVwdGggPSA4OyAgICAgICAgICAgIC8qIGFueXRoaW5nIGVsc2UgPSBhc3N1bWUgdGhlIHdvcnN0ICovCisjZW5kaWYKKworI2lmZGVmIE1OR19JTkNMVURFX0pORyAgICAgICAgICAgICAgICAgLyogY2FuIHdlIGhhbmRsZSB0aGUgY29tcGxleGl0eSA/ICovCisgIGlmIChwRGF0YS0+aVNpbXBsaWNpdHkgJiAweDAwMDBGQzAwKQorI2Vsc2UKKyAgaWYgKHBEYXRhLT5pU2ltcGxpY2l0eSAmIDB4MDAwMEZDMTApCisjZW5kaWYKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfTU5HVE9PQ09NUExFWCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaXRzIG9uIG1heGltdW0gY2FudmFzID8gKi8KKyAgaWYgKChwRGF0YS0+aVdpZHRoID4gcERhdGEtPmlNYXh3aWR0aCkgfHwgKHBEYXRhLT5pSGVpZ2h0ID4gcERhdGEtPmlNYXhoZWlnaHQpKQorICAgIE1OR19XQVJOSU5HIChwRGF0YSwgTU5HX0lNQUdFVE9PTEFSR0UpOworCisgIGlmIChwRGF0YS0+ZlByb2Nlc3NoZWFkZXIpICAgICAgICAgICAvKiBpbmZvcm0gdGhlIGFwcCA/ICovCisgICAgaWYgKCFwRGF0YS0+ZlByb2Nlc3NoZWFkZXIgKCgobW5nX2hhbmRsZSlwRGF0YSksIHBEYXRhLT5pV2lkdGgsIHBEYXRhLT5pSGVpZ2h0KSkKKyAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19BUFBNSVNDRVJST1IpOworCisgIHBEYXRhLT5pSW1hZ2VsZXZlbCsrOyAgICAgICAgICAgICAgICAvKiBvbmUgbGV2ZWwgZGVlcGVyICovCisKKyNpZmRlZiBNTkdfU1RPUkVfQ0hVTktTCisgIGlmIChwRGF0YS0+YlN0b3JlY2h1bmtzKQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdGlhbGl6ZSBzdG9yYWdlICovCisgICAgbW5nX3JldGNvZGUgaVJldGNvZGUgPSAoKG1uZ19jaHVua19oZWFkZXJwKXBIZWFkZXIpLT5mQ3JlYXRlIChwRGF0YSwgcEhlYWRlciwgcHBDaHVuayk7CisKKyAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZSB0aGUgZmllbGRzICovCisgICAgKChtbmdfbWhkcnApKnBwQ2h1bmspLT5pV2lkdGggICAgICA9IHBEYXRhLT5pV2lkdGg7CisgICAgKChtbmdfbWhkcnApKnBwQ2h1bmspLT5pSGVpZ2h0ICAgICA9IHBEYXRhLT5pSGVpZ2h0OworICAgICgobW5nX21oZHJwKSpwcENodW5rKS0+aVRpY2tzICAgICAgPSBwRGF0YS0+aVRpY2tzOworICAgICgobW5nX21oZHJwKSpwcENodW5rKS0+aUxheWVyY291bnQgPSBwRGF0YS0+aUxheWVyY291bnQ7CisgICAgKChtbmdfbWhkcnApKnBwQ2h1bmspLT5pRnJhbWVjb3VudCA9IHBEYXRhLT5pRnJhbWVjb3VudDsKKyAgICAoKG1uZ19taGRycCkqcHBDaHVuayktPmlQbGF5dGltZSAgID0gcERhdGEtPmlQbGF5dGltZTsKKyAgICAoKG1uZ19taGRycCkqcHBDaHVuayktPmlTaW1wbGljaXR5ID0gcERhdGEtPmlTaW1wbGljaXR5OworICB9CisjZW5kaWYgLyogTU5HX1NUT1JFX0NIVU5LUyAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1JFQURfTUhEUiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7ICAgICAgICAgICAgICAgICAgLyogZG9uZSAqLworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCitSRUFEX0NIVU5LIChtbmdfcmVhZF9tZW5kKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9SRUFEX01FTkQsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAoIXBEYXRhLT5iSGFzTUhEUikgICAgICAgICAgICAgICAgLyogc2VxdWVuY2UgY2hlY2tzICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1NFUVVFTkNFRVJST1IpOworCisgIGlmIChpUmF3bGVuID4gMCkgICAgICAgICAgICAgICAgICAgICAvKiBtdXN0IG5vdCBjb250YWluIGRhdGEhICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURMRU5HVEgpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZG8gc29tZXRoaW5nICovCisgICAgbW5nX3JldGNvZGUgaVJldGNvZGUgPSBtbmdfcHJvY2Vzc19kaXNwbGF5X21lbmQgKHBEYXRhKTsKKworICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKworICAgIGlmICghcERhdGEtPmlUb3RhbGZyYW1lcykgICAgICAgICAgLyogc2F2ZSB0b3RhbHMgKi8KKyAgICAgIHBEYXRhLT5pVG90YWxmcmFtZXMgICA9IHBEYXRhLT5pRnJhbWVzZXE7CisgICAgaWYgKCFwRGF0YS0+aVRvdGFsbGF5ZXJzKQorICAgICAgcERhdGEtPmlUb3RhbGxheWVycyAgID0gcERhdGEtPmlMYXllcnNlcTsKKyAgICBpZiAoIXBEYXRhLT5pVG90YWxwbGF5dGltZSkKKyAgICAgIHBEYXRhLT5pVG90YWxwbGF5dGltZSA9IHBEYXRhLT5pRnJhbWV0aW1lOworICB9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfRElTUExBWSAqLworCisgIHBEYXRhLT5iSGFzTUhEUiA9IE1OR19GQUxTRTsgICAgICAgICAvKiBlbmQgb2YgdGhlIGxpbmUsIGJybyEgKi8KKworI2lmZGVmIE1OR19TVE9SRV9DSFVOS1MKKyAgaWYgKHBEYXRhLT5iU3RvcmVjaHVua3MpCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0aWFsaXplIHN0b3JhZ2UgKi8KKyAgICBtbmdfcmV0Y29kZSBpUmV0Y29kZSA9ICgobW5nX2NodW5rX2hlYWRlcnApcEhlYWRlciktPmZDcmVhdGUgKHBEYXRhLCBwSGVhZGVyLCBwcENodW5rKTsKKworICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgfQorI2VuZGlmIC8qIE1OR19TVE9SRV9DSFVOS1MgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9SRUFEX01FTkQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOyAgICAgICAgICAgICAgICAgIC8qIGRvbmUgKi8KK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX0xPT1AKK1JFQURfQ0hVTksgKG1uZ19yZWFkX2xvb3ApCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1JFQURfTE9PUCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmICghcERhdGEtPmJIYXNNSERSKSAgICAgICAgICAgICAgICAvKiBzZXF1ZW5jZSBjaGVja3MgKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfU0VRVUVOQ0VFUlJPUik7CisKKyAgaWYgKCFwRGF0YS0+YkNhY2hlcGxheWJhY2spICAgICAgICAgIC8qIG11c3Qgc3RvcmUgcGxheWJhY2sgaW5mbyB0byB3b3JrISEgKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfTE9PUFdJVEhDQUNIRU9GRik7CisKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgaWYgKChwRGF0YS0+Ykhhc0lIRFIpIHx8IChwRGF0YS0+Ykhhc0JBU0kpIHx8IChwRGF0YS0+Ykhhc0RIRFIpIHx8IChwRGF0YS0+Ykhhc0pIRFIpKQorI2Vsc2UKKyAgaWYgKChwRGF0YS0+Ykhhc0lIRFIpIHx8IChwRGF0YS0+Ykhhc0JBU0kpIHx8IChwRGF0YS0+Ykhhc0RIRFIpKQorI2VuZGlmCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1NFUVVFTkNFRVJST1IpOworCisgIGlmIChpUmF3bGVuID49IDUpICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggY2hlY2tzICovCisgIHsKKyAgICBpZiAoaVJhd2xlbiA+PSA2KQorICAgIHsKKyAgICAgIGlmICgoaVJhd2xlbiAtIDYpICUgNCAhPSAwKQorICAgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRExFTkdUSCk7CisgICAgfQorICB9CisgIGVsc2UKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRExFTkdUSCk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCisgIHsKKyAgICBtbmdfdWludDggICBpTGV2ZWw7CisgICAgbW5nX3VpbnQzMiAgaVJlcGVhdDsKKyAgICBtbmdfdWludDggICBpVGVybWluYXRpb24gPSAwOworICAgIG1uZ191aW50MzIgIGlJdGVybWluICAgICA9IDE7CisgICAgbW5nX3VpbnQzMiAgaUl0ZXJtYXggICAgID0gMHg3ZmZmZmZmZkw7CisgICAgbW5nX3JldGNvZGUgaVJldGNvZGU7CisKKyAgICBwRGF0YS0+Ykhhc0xPT1AgPSBNTkdfVFJVRTsgICAgICAgIC8qIGluZGljYXRlIHdlJ3JlIGluc2lkZSBhIGxvb3AgKi8KKworICAgIGlMZXZlbCA9ICpwUmF3ZGF0YTsgICAgICAgICAgICAgICAgLyogZGV0ZXJtaW5lIHRoZSBmaWVsZHMgZm9yIHByb2Nlc3NpbmcgKi8KKworI2lmbmRlZiBNTkdfTk9fT0xEX1ZFUlNJT05TCisgICAgaWYgKHBEYXRhLT5iUHJlRHJhZnQ0OCkKKyAgICB7CisgICAgICBpVGVybWluYXRpb24gPSAqKHBSYXdkYXRhKzEpOworCisgICAgICBpUmVwZWF0ID0gbW5nX2dldF91aW50MzIgKHBSYXdkYXRhKzIpOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICAgIGlSZXBlYXQgPSBtbmdfZ2V0X3VpbnQzMiAocFJhd2RhdGErMSk7CisKKyAgICBpZiAoaVJhd2xlbiA+PSA2KQorICAgIHsKKyNpZm5kZWYgTU5HX05PX09MRF9WRVJTSU9OUworICAgICAgaWYgKCFwRGF0YS0+YlByZURyYWZ0NDgpCisjZW5kaWYKKyAgICAgICAgaVRlcm1pbmF0aW9uID0gKihwUmF3ZGF0YSs1KTsKKworICAgICAgaWYgKGlSYXdsZW4gPj0gMTApCisgICAgICB7CisgICAgICAgIGlJdGVybWluID0gbW5nX2dldF91aW50MzIgKHBSYXdkYXRhKzYpOworCisgICAgICAgIGlmIChpUmF3bGVuID49IDE0KQorICAgICAgICB7CisgICAgICAgICAgaUl0ZXJtYXggPSBtbmdfZ2V0X3VpbnQzMiAocFJhd2RhdGErMTApOworCisgICAgICAgICAgLyogVE9ETzogcHJvY2VzcyBzaWduYWxzICovCisKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSB0aGUgTE9PUCBhbmktb2JqZWN0ICovCisgICAgaVJldGNvZGUgPSBtbmdfY3JlYXRlX2FuaV9sb29wIChwRGF0YSwgaUxldmVsLCBpUmVwZWF0LCBpVGVybWluYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUl0ZXJtaW4sIGlJdGVybWF4LCAwLCAwKTsKKworICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNraXAgdGlsbCBtYXRjaGluZyBFTkRMIGlmIGl0ZXJhdGlvbj0wICovCisgICAgaWYgKCghcERhdGEtPmJTa2lwcGluZykgJiYgKGlSZXBlYXQgPT0gMCkpCisgICAgICBwRGF0YS0+YlNraXBwaW5nID0gTU5HX1RSVUU7CisgIH0KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisKKyNpZmRlZiBNTkdfU1RPUkVfQ0hVTktTCisgIGlmIChwRGF0YS0+YlN0b3JlY2h1bmtzKQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdGlhbGl6ZSBzdG9yYWdlICovCisgICAgbW5nX3JldGNvZGUgaVJldGNvZGUgPSAoKG1uZ19jaHVua19oZWFkZXJwKXBIZWFkZXIpLT5mQ3JlYXRlIChwRGF0YSwgcEhlYWRlciwgcHBDaHVuayk7CisKKyAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICByZXR1cm4gaVJldGNvZGU7CisKKyAgICBpZiAoaVJhd2xlbiA+PSA1KSAgICAgICAgICAgICAgICAgIC8qIHN0b3JlIHRoZSBmaWVsZHMgKi8KKyAgICB7CisgICAgICAoKG1uZ19sb29wcCkqcHBDaHVuayktPmlMZXZlbCAgPSAqcFJhd2RhdGE7CisKKyNpZm5kZWYgTU5HX05PX09MRF9WRVJTSU9OUworICAgICAgaWYgKHBEYXRhLT5iUHJlRHJhZnQ0OCkKKyAgICAgIHsKKyAgICAgICAgKChtbmdfbG9vcHApKnBwQ2h1bmspLT5pVGVybWluYXRpb24gPSAqKHBSYXdkYXRhKzEpOworICAgICAgICAoKG1uZ19sb29wcCkqcHBDaHVuayktPmlSZXBlYXQgPSBtbmdfZ2V0X3VpbnQzMiAocFJhd2RhdGErMik7CisgICAgICB9CisgICAgICBlbHNlCisjZW5kaWYKKyAgICAgIHsKKyAgICAgICAgKChtbmdfbG9vcHApKnBwQ2h1bmspLT5pUmVwZWF0ID0gbW5nX2dldF91aW50MzIgKHBSYXdkYXRhKzEpOworICAgICAgfQorCisgICAgICBpZiAoaVJhd2xlbiA+PSA2KQorICAgICAgeworI2lmbmRlZiBNTkdfTk9fT0xEX1ZFUlNJT05TCisgICAgICAgIGlmICghcERhdGEtPmJQcmVEcmFmdDQ4KQorI2VuZGlmCisgICAgICAgICAgKChtbmdfbG9vcHApKnBwQ2h1bmspLT5pVGVybWluYXRpb24gPSAqKHBSYXdkYXRhKzUpOworCisgICAgICAgIGlmIChpUmF3bGVuID49IDEwKQorICAgICAgICB7CisgICAgICAgICAgKChtbmdfbG9vcHApKnBwQ2h1bmspLT5pSXRlcm1pbiA9IG1uZ19nZXRfdWludDMyIChwUmF3ZGF0YSs2KTsKKworI2lmbmRlZiBNTkdfTk9fTE9PUF9TSUdOQUxTX1NVUFBPUlRFRAorICAgICAgICAgIGlmIChpUmF3bGVuID49IDE0KQorICAgICAgICAgIHsKKyAgICAgICAgICAgICgobW5nX2xvb3BwKSpwcENodW5rKS0+aUl0ZXJtYXggPSBtbmdfZ2V0X3VpbnQzMiAocFJhd2RhdGErMTApOworICAgICAgICAgICAgKChtbmdfbG9vcHApKnBwQ2h1bmspLT5pQ291bnQgICA9IChpUmF3bGVuIC0gMTQpIC8gNDsKKworICAgICAgICAgICAgaWYgKCgobW5nX2xvb3BwKSpwcENodW5rKS0+aUNvdW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBNTkdfQUxMT0MgKHBEYXRhLCAoKG1uZ19sb29wcCkqcHBDaHVuayktPnBTaWduYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG1uZ19sb29wcCkqcHBDaHVuayktPmlDb3VudCA8PCAyKTsKKworI2lmbmRlZiBNTkdfQklHRU5ESUFOX1NVUFBPUlRFRAorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgaVg7CisgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCAgcEluICA9IHBSYXdkYXRhICsgMTQ7CisgICAgICAgICAgICAgICAgbW5nX3VpbnQzMnAgcE91dCA9IChtbmdfdWludDMycCkoKG1uZ19sb29wcCkqcHBDaHVuayktPnBTaWduYWxzOworCisgICAgICAgICAgICAgICAgZm9yIChpWCA9IDA7IGlYIDwgKChtbmdfbG9vcHApKnBwQ2h1bmspLT5pQ291bnQ7IGlYKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgKnBPdXQrKyA9IG1uZ19nZXRfdWludDMyIChwSW4pOworICAgICAgICAgICAgICAgICAgcEluICs9IDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgICBNTkdfQ09QWSAoKChtbmdfbG9vcHApKnBwQ2h1bmspLT5wU2lnbmFscywgcFJhd2RhdGEgKyAxNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICgobW5nX2xvb3BwKSpwcENodW5rKS0+aUNvdW50IDw8IDIpOworI2VuZGlmIC8qICFNTkdfQklHRU5ESUFOX1NVUFBPUlRFRCAqLworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisjZW5kaWYgLyogTU5HX1NUT1JFX0NIVU5LUyAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1JFQURfTE9PUCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7ICAgICAgICAgICAgICAgICAgLyogZG9uZSAqLworfQorI2VuZGlmCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19MT09QCitSRUFEX0NIVU5LIChtbmdfcmVhZF9lbmRsKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9SRUFEX0VOREwsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAoIXBEYXRhLT5iSGFzTUhEUikgICAgICAgICAgICAgICAgLyogc2VxdWVuY2UgY2hlY2tzICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1NFUVVFTkNFRVJST1IpOworCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisgIGlmICgocERhdGEtPmJIYXNJSERSKSB8fCAocERhdGEtPmJIYXNCQVNJKSB8fCAocERhdGEtPmJIYXNESERSKSB8fCAocERhdGEtPmJIYXNKSERSKSkKKyNlbHNlCisgIGlmICgocERhdGEtPmJIYXNJSERSKSB8fCAocERhdGEtPmJIYXNCQVNJKSB8fCAocERhdGEtPmJIYXNESERSKSkKKyNlbmRpZgorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19TRVFVRU5DRUVSUk9SKTsKKworICBpZiAoaVJhd2xlbiAhPSAxKSAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG11c3QgYmUgZXhhY3RseSAxICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURMRU5HVEgpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorICB7CisgICAgaWYgKHBEYXRhLT5iSGFzTE9PUCkgICAgICAgICAgICAgICAvKiBhcmUgd2UgcmVhbGx5IHByb2Nlc3NpbmcgYSBsb29wID8gKi8KKyAgICB7CisgICAgICBtbmdfdWludDggaUxldmVsID0gKnBSYXdkYXRhOyAgICAvKiBnZXQgdGhlIG5lc3QgbGV2ZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSBhbiBFTkRMIGFuaW1hdGlvbiBvYmplY3QgKi8KKyAgICAgIG1uZ19yZXRjb2RlIGlSZXRjb2RlID0gbW5nX2NyZWF0ZV9hbmlfZW5kbCAocERhdGEsIGlMZXZlbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICAgIHJldHVybiBpUmV0Y29kZTsKKworLyogICAgICB7CisgICAgICAgIG1uZ19hbmlfZW5kbHAgcEVOREwgPSAobW5nX2FuaV9lbmRscClwRGF0YS0+cExhc3RhbmlvYmo7CisKKyAgICAgICAgaVJldGNvZGUgPSBwRU5ETC0+c0hlYWRlci5mUHJvY2VzcyAocERhdGEsIHBFTkRMKTsKKworICAgICAgICBpZiAoaVJldGNvZGUpCisgICAgICAgICAgcmV0dXJuIGlSZXRjb2RlOworICAgICAgfSAqLworICAgIH0KKyAgICBlbHNlCisgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfTk9NQVRDSElOR0xPT1ApOworICAgICAgCisgIH0KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisKKyNpZmRlZiBNTkdfU1RPUkVfQ0hVTktTCisgIGlmIChwRGF0YS0+YlN0b3JlY2h1bmtzKQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdGlhbGl6ZSBzdG9yYWdlICovCisgICAgbW5nX3JldGNvZGUgaVJldGNvZGUgPSAoKG1uZ19jaHVua19oZWFkZXJwKXBIZWFkZXIpLT5mQ3JlYXRlIChwRGF0YSwgcEhlYWRlciwgcHBDaHVuayk7CisKKyAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZSB0aGUgZmllbGRzICovCisgICAgKChtbmdfZW5kbHApKnBwQ2h1bmspLT5pTGV2ZWwgPSAqcFJhd2RhdGE7CisgIH0KKyNlbmRpZiAvKiBNTkdfU1RPUkVfQ0hVTktTICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVBRF9FTkRMLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsgICAgICAgICAgICAgICAgICAvKiBkb25lICovCit9CisjZW5kaWYKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX0RFRkkKK1JFQURfQ0hVTksgKG1uZ19yZWFkX2RlZmkpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1JFQURfREVGSSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmICghcERhdGEtPmJIYXNNSERSKSAgICAgICAgICAgICAgICAvKiBzZXF1ZW5jZSBjaGVja3MgKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfU0VRVUVOQ0VFUlJPUik7CisKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgaWYgKChwRGF0YS0+Ykhhc0lIRFIpIHx8IChwRGF0YS0+Ykhhc0JBU0kpIHx8IChwRGF0YS0+Ykhhc0RIRFIpIHx8IChwRGF0YS0+Ykhhc0pIRFIpKQorI2Vsc2UKKyAgaWYgKChwRGF0YS0+Ykhhc0lIRFIpIHx8IChwRGF0YS0+Ykhhc0JBU0kpIHx8IChwRGF0YS0+Ykhhc0RIRFIpKQorI2VuZGlmCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1NFUVVFTkNFRVJST1IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2hlY2sgdGhlIGxlbmd0aCAqLworICBpZiAoKGlSYXdsZW4gIT0gMikgJiYgKGlSYXdsZW4gIT0gMykgJiYgKGlSYXdsZW4gIT0gNCkgJiYKKyAgICAgIChpUmF3bGVuICE9IDEyKSAmJiAoaVJhd2xlbiAhPSAyOCkpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURMRU5HVEgpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorICB7CisgICAgbW5nX3JldGNvZGUgaVJldGNvZGU7CisKKyAgICBwRGF0YS0+aURFRklvYmplY3RpZCAgICAgICA9IG1uZ19nZXRfdWludDE2IChwUmF3ZGF0YSk7CisKKyAgICBpZiAoaVJhd2xlbiA+IDIpCisgICAgeworICAgICAgcERhdGEtPmJERUZJaGFzZG9ub3RzaG93ID0gTU5HX1RSVUU7CisgICAgICBwRGF0YS0+aURFRklkb25vdHNob3cgICAgPSAqKHBSYXdkYXRhKzIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgcERhdGEtPmJERUZJaGFzZG9ub3RzaG93ID0gTU5HX0ZBTFNFOworICAgICAgcERhdGEtPmlERUZJZG9ub3RzaG93ICAgID0gMDsKKyAgICB9CisKKyAgICBpZiAoaVJhd2xlbiA+IDMpCisgICAgeworICAgICAgcERhdGEtPmJERUZJaGFzY29uY3JldGUgID0gTU5HX1RSVUU7CisgICAgICBwRGF0YS0+aURFRkljb25jcmV0ZSAgICAgPSAqKHBSYXdkYXRhKzMpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgcERhdGEtPmJERUZJaGFzY29uY3JldGUgID0gTU5HX0ZBTFNFOworICAgICAgcERhdGEtPmlERUZJY29uY3JldGUgICAgID0gMDsKKyAgICB9CisKKyAgICBpZiAoaVJhd2xlbiA+IDQpCisgICAgeworICAgICAgcERhdGEtPmJERUZJaGFzbG9jYSAgICAgID0gTU5HX1RSVUU7CisgICAgICBwRGF0YS0+aURFRklsb2NheCAgICAgICAgPSBtbmdfZ2V0X2ludDMyIChwUmF3ZGF0YSs0KTsKKyAgICAgIHBEYXRhLT5pREVGSWxvY2F5ICAgICAgICA9IG1uZ19nZXRfaW50MzIgKHBSYXdkYXRhKzgpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgcERhdGEtPmJERUZJaGFzbG9jYSAgICAgID0gTU5HX0ZBTFNFOworICAgICAgcERhdGEtPmlERUZJbG9jYXggICAgICAgID0gMDsKKyAgICAgIHBEYXRhLT5pREVGSWxvY2F5ICAgICAgICA9IDA7CisgICAgfQorCisgICAgaWYgKGlSYXdsZW4gPiAxMikKKyAgICB7CisgICAgICBwRGF0YS0+YkRFRkloYXNjbGlwICAgICAgPSBNTkdfVFJVRTsKKyAgICAgIHBEYXRhLT5pREVGSWNsaXBsICAgICAgICA9IG1uZ19nZXRfaW50MzIgKHBSYXdkYXRhKzEyKTsKKyAgICAgIHBEYXRhLT5pREVGSWNsaXByICAgICAgICA9IG1uZ19nZXRfaW50MzIgKHBSYXdkYXRhKzE2KTsKKyAgICAgIHBEYXRhLT5pREVGSWNsaXB0ICAgICAgICA9IG1uZ19nZXRfaW50MzIgKHBSYXdkYXRhKzIwKTsKKyAgICAgIHBEYXRhLT5pREVGSWNsaXBiICAgICAgICA9IG1uZ19nZXRfaW50MzIgKHBSYXdkYXRhKzI0KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHBEYXRhLT5iREVGSWhhc2NsaXAgICAgICA9IE1OR19GQUxTRTsKKyAgICAgIHBEYXRhLT5pREVGSWNsaXBsICAgICAgICA9IDA7CisgICAgICBwRGF0YS0+aURFRkljbGlwciAgICAgICAgPSAwOworICAgICAgcERhdGEtPmlERUZJY2xpcHQgICAgICAgID0gMDsKKyAgICAgIHBEYXRhLT5pREVGSWNsaXBiICAgICAgICA9IDA7CisgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIGFuIGFuaW1hdGlvbiBvYmplY3QgKi8KKyAgICBpUmV0Y29kZSA9IG1uZ19jcmVhdGVfYW5pX2RlZmkgKHBEYXRhKTsKKyAgICAgICAgICAgICAgICAgICAKKyAgICBpZiAoIWlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgIC8qIGRvIGRpc3BsYXkgcHJvY2Vzc2luZyAqLworICAgICAgaVJldGNvZGUgPSBtbmdfcHJvY2Vzc19kaXNwbGF5X2RlZmkgKHBEYXRhKTsKKworICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKworICB9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfRElTUExBWSAqLworCisjaWZkZWYgTU5HX1NUT1JFX0NIVU5LUworICBpZiAocERhdGEtPmJTdG9yZWNodW5rcykKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpemUgc3RvcmFnZSAqLworICAgIG1uZ19yZXRjb2RlIGlSZXRjb2RlID0gKChtbmdfY2h1bmtfaGVhZGVycClwSGVhZGVyKS0+ZkNyZWF0ZSAocERhdGEsIHBIZWFkZXIsIHBwQ2h1bmspOworCisgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgcmV0dXJuIGlSZXRjb2RlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmUgdGhlIGZpZWxkcyAqLworICAgICgobW5nX2RlZmlwKSpwcENodW5rKS0+aU9iamVjdGlkICAgICAgID0gbW5nX2dldF91aW50MTYgKHBSYXdkYXRhKTsKKworICAgIGlmIChpUmF3bGVuID4gMikKKyAgICB7CisgICAgICAoKG1uZ19kZWZpcCkqcHBDaHVuayktPmJIYXNkb25vdHNob3cgPSBNTkdfVFJVRTsKKyAgICAgICgobW5nX2RlZmlwKSpwcENodW5rKS0+aURvbm90c2hvdyAgICA9ICoocFJhd2RhdGErMik7CisgICAgfQorICAgIGVsc2UKKyAgICAgICgobW5nX2RlZmlwKSpwcENodW5rKS0+Ykhhc2Rvbm90c2hvdyA9IE1OR19GQUxTRTsKKworICAgIGlmIChpUmF3bGVuID4gMykKKyAgICB7CisgICAgICAoKG1uZ19kZWZpcCkqcHBDaHVuayktPmJIYXNjb25jcmV0ZSAgPSBNTkdfVFJVRTsKKyAgICAgICgobW5nX2RlZmlwKSpwcENodW5rKS0+aUNvbmNyZXRlICAgICA9ICoocFJhd2RhdGErMyk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICgobW5nX2RlZmlwKSpwcENodW5rKS0+Ykhhc2NvbmNyZXRlICA9IE1OR19GQUxTRTsKKworICAgIGlmIChpUmF3bGVuID4gNCkKKyAgICB7CisgICAgICAoKG1uZ19kZWZpcCkqcHBDaHVuayktPmJIYXNsb2NhICAgICAgPSBNTkdfVFJVRTsKKyAgICAgICgobW5nX2RlZmlwKSpwcENodW5rKS0+aVhsb2NhdGlvbiAgICA9IG1uZ19nZXRfaW50MzIgKHBSYXdkYXRhKzQpOworICAgICAgKChtbmdfZGVmaXApKnBwQ2h1bmspLT5pWWxvY2F0aW9uICAgID0gbW5nX2dldF9pbnQzMiAocFJhd2RhdGErOCk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICgobW5nX2RlZmlwKSpwcENodW5rKS0+Ykhhc2xvY2EgICAgICA9IE1OR19GQUxTRTsKKworICAgIGlmIChpUmF3bGVuID4gMTIpCisgICAgeworICAgICAgKChtbmdfZGVmaXApKnBwQ2h1bmspLT5iSGFzY2xpcCAgICAgID0gTU5HX1RSVUU7CisgICAgICAoKG1uZ19kZWZpcCkqcHBDaHVuayktPmlMZWZ0Y2IgICAgICAgPSBtbmdfZ2V0X2ludDMyIChwUmF3ZGF0YSsxMik7CisgICAgICAoKG1uZ19kZWZpcCkqcHBDaHVuayktPmlSaWdodGNiICAgICAgPSBtbmdfZ2V0X2ludDMyIChwUmF3ZGF0YSsxNik7CisgICAgICAoKG1uZ19kZWZpcCkqcHBDaHVuayktPmlUb3BjYiAgICAgICAgPSBtbmdfZ2V0X2ludDMyIChwUmF3ZGF0YSsyMCk7CisgICAgICAoKG1uZ19kZWZpcCkqcHBDaHVuayktPmlCb3R0b21jYiAgICAgPSBtbmdfZ2V0X2ludDMyIChwUmF3ZGF0YSsyNCk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICgobW5nX2RlZmlwKSpwcENodW5rKS0+Ykhhc2NsaXAgICAgICA9IE1OR19GQUxTRTsKKworICB9CisjZW5kaWYgLyogTU5HX1NUT1JFX0NIVU5LUyAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1JFQURfREVGSSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7ICAgICAgICAgICAgICAgICAgLyogZG9uZSAqLworfQorI2VuZGlmCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19CQVNJCitSRUFEX0NIVU5LIChtbmdfcmVhZF9iYXNpKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9SRUFEX0JBU0ksIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAoIXBEYXRhLT5iSGFzTUhEUikgICAgICAgICAgICAgICAgLyogc2VxdWVuY2UgY2hlY2tzICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1NFUVVFTkNFRVJST1IpOworCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisgIGlmICgocERhdGEtPmJIYXNJSERSKSB8fCAocERhdGEtPmJIYXNCQVNJKSB8fCAocERhdGEtPmJIYXNESERSKSB8fCAocERhdGEtPmJIYXNKSERSKSkKKyNlbHNlCisgIGlmICgocERhdGEtPmJIYXNJSERSKSB8fCAocERhdGEtPmJIYXNCQVNJKSB8fCAocERhdGEtPmJIYXNESERSKSkKKyNlbmRpZgorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19TRVFVRU5DRUVSUk9SKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoZWNrIHRoZSBsZW5ndGggKi8KKyAgaWYgKChpUmF3bGVuICE9IDEzKSAmJiAoaVJhd2xlbiAhPSAxOSkgJiYgKGlSYXdsZW4gIT0gMjEpICYmIChpUmF3bGVuICE9IDIyKSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRExFTkdUSCk7CisKKyAgcERhdGEtPmJIYXNCQVNJICAgICA9IE1OR19UUlVFOyAgICAgIC8qIGluc2lkZSBhIEJBU0ktSUVORCBibG9jayBub3cgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlIGludGVyZXN0aW5nIGZpZWxkcyAqLworICBwRGF0YS0+aURhdGF3aWR0aCAgID0gbW5nX2dldF91aW50MzIgKHBSYXdkYXRhKTsKKyAgcERhdGEtPmlEYXRhaGVpZ2h0ICA9IG1uZ19nZXRfdWludDMyIChwUmF3ZGF0YSs0KTsKKyAgcERhdGEtPmlCaXRkZXB0aCAgICA9ICoocFJhd2RhdGErOCk7CisgIHBEYXRhLT5pQ29sb3J0eXBlICAgPSAqKHBSYXdkYXRhKzkpOworICBwRGF0YS0+aUNvbXByZXNzaW9uID0gKihwUmF3ZGF0YSsxMCk7CisgIHBEYXRhLT5pRmlsdGVyICAgICAgPSAqKHBSYXdkYXRhKzExKTsKKyAgcERhdGEtPmlJbnRlcmxhY2UgICA9ICoocFJhd2RhdGErMTIpOworCisKKyNpZiBkZWZpbmVkKE1OR19OT18xXzJfNEJJVF9TVVBQT1JUKSB8fCBkZWZpbmVkKE1OR19OT18xNkJJVF9TVVBQT1JUKQorICBwRGF0YS0+aVBOR211bHQgPSAxOworICBwRGF0YS0+aVBOR2RlcHRoID0gcERhdGEtPmlCaXRkZXB0aDsKKyNlbmRpZgorCisjaWZkZWYgTU5HX05PXzFfMl80QklUX1NVUFBPUlQKKyAgaWYgKHBEYXRhLT5pQml0ZGVwdGggPCA4KQorICAgIHBEYXRhLT5pQml0ZGVwdGggPSA4OworI2VuZGlmCisjaWZkZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyAgaWYgKHBEYXRhLT5pQml0ZGVwdGggPiA4KQorICAgIHsKKyAgICAgIHBEYXRhLT5pQml0ZGVwdGggPSA4OworICAgICAgcERhdGEtPmlQTkdtdWx0ID0gMjsKKyAgICB9CisjZW5kaWYKKworICBpZiAoKHBEYXRhLT5pQml0ZGVwdGggIT0gIDgpICAgICAgLyogcGFyYW1ldGVyIHZhbGlkaXR5IGNoZWNrcyAqLworI2lmbmRlZiBNTkdfTk9fMV8yXzRCSVRfU1VQUE9SVAorICAgICAgJiYgKHBEYXRhLT5pQml0ZGVwdGggIT0gIDEpICYmCisgICAgICAocERhdGEtPmlCaXRkZXB0aCAhPSAgMikgJiYKKyAgICAgIChwRGF0YS0+aUJpdGRlcHRoICE9ICA0KQorI2VuZGlmCisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgICAmJiAocERhdGEtPmlCaXRkZXB0aCAhPSAxNikKKyNlbmRpZgorICAgICAgKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElEQklUREVQVEgpOworCisgIGlmICgocERhdGEtPmlDb2xvcnR5cGUgIT0gTU5HX0NPTE9SVFlQRV9HUkFZICAgKSAmJgorICAgICAgKHBEYXRhLT5pQ29sb3J0eXBlICE9IE1OR19DT0xPUlRZUEVfUkdCICAgICkgJiYKKyAgICAgIChwRGF0YS0+aUNvbG9ydHlwZSAhPSBNTkdfQ09MT1JUWVBFX0lOREVYRUQpICYmCisgICAgICAocERhdGEtPmlDb2xvcnR5cGUgIT0gTU5HX0NPTE9SVFlQRV9HUkFZQSAgKSAmJgorICAgICAgKHBEYXRhLT5pQ29sb3J0eXBlICE9IE1OR19DT0xPUlRZUEVfUkdCQSAgICkgICAgKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElEQ09MT1JUWVBFKTsKKworICBpZiAoKHBEYXRhLT5pQ29sb3J0eXBlID09IE1OR19DT0xPUlRZUEVfSU5ERVhFRCkgJiYgKHBEYXRhLT5pQml0ZGVwdGggPiA4KSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJREJJVERFUFRIKTsKKworICBpZiAoKChwRGF0YS0+aUNvbG9ydHlwZSA9PSBNTkdfQ09MT1JUWVBFX1JHQiAgICApIHx8CisgICAgICAgKHBEYXRhLT5pQ29sb3J0eXBlID09IE1OR19DT0xPUlRZUEVfR1JBWUEgICkgfHwKKyAgICAgICAocERhdGEtPmlDb2xvcnR5cGUgPT0gTU5HX0NPTE9SVFlQRV9SR0JBICAgKSAgICApICYmCisgICAgICAocERhdGEtPmlCaXRkZXB0aCA8IDggICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAgICApCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURCSVRERVBUSCk7CisKKyAgaWYgKHBEYXRhLT5pQ29tcHJlc3Npb24gIT0gTU5HX0NPTVBSRVNTSU9OX0RFRkxBVEUpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURDT01QUkVTUyk7CisKKyNpZiBkZWZpbmVkKEZJTFRFUjE5MikgfHwgZGVmaW5lZChGSUxURVIxOTMpCisgIGlmICgocERhdGEtPmlGaWx0ZXIgIT0gTU5HX0ZJTFRFUl9BREFQVElWRSApICYmCisjaWYgZGVmaW5lZChGSUxURVIxOTIpICYmIGRlZmluZWQoRklMVEVSMTkzKQorICAgICAgKHBEYXRhLT5pRmlsdGVyICE9IE1OR19GSUxURVJfRElGRkVSSU5HKSAmJgorICAgICAgKHBEYXRhLT5pRmlsdGVyICE9IE1OR19GSUxURVJfTk9GSUxURVIgKSAgICApCisjZWxzZQorI2lmZGVmIEZJTFRFUjE5MgorICAgICAgKHBEYXRhLT5pRmlsdGVyICE9IE1OR19GSUxURVJfRElGRkVSSU5HKSAgICApCisjZWxzZQorICAgICAgKHBEYXRhLT5pRmlsdGVyICE9IE1OR19GSUxURVJfTk9GSUxURVIgKSAgICApCisjZW5kaWYKKyNlbmRpZgorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElERklMVEVSKTsKKyNlbHNlCisgIGlmIChwRGF0YS0+aUZpbHRlcikKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJREZJTFRFUik7CisjZW5kaWYKKworICBpZiAoKHBEYXRhLT5pSW50ZXJsYWNlICE9IE1OR19JTlRFUkxBQ0VfTk9ORSApICYmCisgICAgICAocERhdGEtPmlJbnRlcmxhY2UgIT0gTU5HX0lOVEVSTEFDRV9BREFNNykgICAgKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElESU5URVJMQUNFKTsKKworICBwRGF0YS0+aUltYWdlbGV2ZWwrKzsgICAgICAgICAgICAgICAgLyogb25lIGxldmVsIGRlZXBlciAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorICB7CisgICAgbW5nX3VpbnQxNiAgaVJlZCAgICAgID0gMDsKKyAgICBtbmdfdWludDE2ICBpR3JlZW4gICAgPSAwOworICAgIG1uZ191aW50MTYgIGlCbHVlICAgICA9IDA7CisgICAgbW5nX2Jvb2wgICAgYkhhc2FscGhhID0gTU5HX0ZBTFNFOworICAgIG1uZ191aW50MTYgIGlBbHBoYSAgICA9IDB4RkZGRjsKKyAgICBtbmdfdWludDggICBpVmlld2FibGUgPSAwOworICAgIG1uZ19yZXRjb2RlIGlSZXRjb2RlOworCisgICAgaWYgKGlSYXdsZW4gPiAxMykgICAgICAgICAgICAgICAgICAvKiBnZXQgcmVtYWluaW5nIGZpZWxkcywgaWYgYW55ICovCisgICAgeworICAgICAgaVJlZCAgICAgID0gbW5nX2dldF91aW50MTYgKHBSYXdkYXRhKzEzKTsKKyAgICAgIGlHcmVlbiAgICA9IG1uZ19nZXRfdWludDE2IChwUmF3ZGF0YSsxNSk7CisgICAgICBpQmx1ZSAgICAgPSBtbmdfZ2V0X3VpbnQxNiAocFJhd2RhdGErMTcpOworICAgIH0KKworICAgIGlmIChpUmF3bGVuID4gMTkpCisgICAgeworICAgICAgYkhhc2FscGhhID0gTU5HX1RSVUU7CisgICAgICBpQWxwaGEgICAgPSBtbmdfZ2V0X3VpbnQxNiAocFJhd2RhdGErMTkpOworICAgIH0KKworICAgIGlmIChpUmF3bGVuID4gMjEpCisgICAgICBpVmlld2FibGUgPSAqKHBSYXdkYXRhKzIxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSBhbiBhbmltYXRpb24gb2JqZWN0ICovCisgICAgaVJldGNvZGUgPSBtbmdfY3JlYXRlX2FuaV9iYXNpIChwRGF0YSwgaVJlZCwgaUdyZWVuLCBpQmx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJIYXNhbHBoYSwgaUFscGhhLCBpVmlld2FibGUpOworCisvKiAgICBpZiAoIWlSZXRjb2RlKQorICAgICAgaVJldGNvZGUgPSBtbmdfcHJvY2Vzc19kaXNwbGF5X2Jhc2kgKHBEYXRhLCBpUmVkLCBpR3JlZW4sIGlCbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJIYXNhbHBoYSwgaUFscGhhLCBpVmlld2FibGUpOyAqLworCisgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgcmV0dXJuIGlSZXRjb2RlOworCisgIH0KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisKKyNpZmRlZiBNTkdfU1RPUkVfQ0hVTktTCisgIGlmIChwRGF0YS0+YlN0b3JlY2h1bmtzKQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdGlhbGl6ZSBzdG9yYWdlICovCisgICAgbW5nX3JldGNvZGUgaVJldGNvZGUgPSAoKG1uZ19jaHVua19oZWFkZXJwKXBIZWFkZXIpLT5mQ3JlYXRlIChwRGF0YSwgcEhlYWRlciwgcHBDaHVuayk7CisKKyAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZSB0aGUgZmllbGRzICovCisgICAgKChtbmdfYmFzaXApKnBwQ2h1bmspLT5pV2lkdGggICAgICAgPSBtbmdfZ2V0X3VpbnQzMiAocFJhd2RhdGEpOworICAgICgobW5nX2Jhc2lwKSpwcENodW5rKS0+aUhlaWdodCAgICAgID0gbW5nX2dldF91aW50MzIgKHBSYXdkYXRhKzQpOworI2lmZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgaWYgKCoocFJhd2RhdGErOCkgPiA4KQorICAgICAgKChtbmdfYmFzaXApKnBwQ2h1bmspLT5pQml0ZGVwdGggICAgPSA4OworICAgIGVsc2UKKyNlbmRpZgorICAgICAgKChtbmdfYmFzaXApKnBwQ2h1bmspLT5pQml0ZGVwdGggICAgPSAqKHBSYXdkYXRhKzgpOworICAgICgobW5nX2Jhc2lwKSpwcENodW5rKS0+aUNvbG9ydHlwZSAgID0gKihwUmF3ZGF0YSs5KTsKKyAgICAoKG1uZ19iYXNpcCkqcHBDaHVuayktPmlDb21wcmVzc2lvbiA9ICoocFJhd2RhdGErMTApOworICAgICgobW5nX2Jhc2lwKSpwcENodW5rKS0+aUZpbHRlciAgICAgID0gKihwUmF3ZGF0YSsxMSk7CisgICAgKChtbmdfYmFzaXApKnBwQ2h1bmspLT5pSW50ZXJsYWNlICAgPSAqKHBSYXdkYXRhKzEyKTsKKworICAgIGlmIChpUmF3bGVuID4gMTMpCisgICAgeworICAgICAgKChtbmdfYmFzaXApKnBwQ2h1bmspLT5pUmVkICAgICAgID0gbW5nX2dldF91aW50MTYgKHBSYXdkYXRhKzEzKTsKKyAgICAgICgobW5nX2Jhc2lwKSpwcENodW5rKS0+aUdyZWVuICAgICA9IG1uZ19nZXRfdWludDE2IChwUmF3ZGF0YSsxNSk7CisgICAgICAoKG1uZ19iYXNpcCkqcHBDaHVuayktPmlCbHVlICAgICAgPSBtbmdfZ2V0X3VpbnQxNiAocFJhd2RhdGErMTcpOworICAgIH0KKworICAgIGlmIChpUmF3bGVuID4gMTkpCisgICAgICAoKG1uZ19iYXNpcCkqcHBDaHVuayktPmlBbHBoYSAgICAgPSBtbmdfZ2V0X3VpbnQxNiAocFJhd2RhdGErMTkpOworCisgICAgaWYgKGlSYXdsZW4gPiAyMSkKKyAgICAgICgobW5nX2Jhc2lwKSpwcENodW5rKS0+aVZpZXdhYmxlICA9ICoocFJhd2RhdGErMjEpOworCisgIH0KKyNlbmRpZiAvKiBNTkdfU1RPUkVfQ0hVTktTICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVBRF9CQVNJLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsgICAgICAgICAgICAgICAgICAvKiBkb25lICovCit9CisjZW5kaWYKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX0NMT04KK1JFQURfQ0hVTksgKG1uZ19yZWFkX2Nsb24pCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1JFQURfQ0xPTiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmICghcERhdGEtPmJIYXNNSERSKSAgICAgICAgICAgICAgICAvKiBzZXF1ZW5jZSBjaGVja3MgKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfU0VRVUVOQ0VFUlJPUik7CisKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgaWYgKChwRGF0YS0+Ykhhc0lIRFIpIHx8IChwRGF0YS0+Ykhhc0JBU0kpIHx8IChwRGF0YS0+Ykhhc0RIRFIpIHx8IChwRGF0YS0+Ykhhc0pIRFIpKQorI2Vsc2UKKyAgaWYgKChwRGF0YS0+Ykhhc0lIRFIpIHx8IChwRGF0YS0+Ykhhc0JBU0kpIHx8IChwRGF0YS0+Ykhhc0RIRFIpKQorI2VuZGlmCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1NFUVVFTkNFRVJST1IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2hlY2sgdGhlIGxlbmd0aCAqLworICBpZiAoKGlSYXdsZW4gIT0gNCkgJiYgKGlSYXdsZW4gIT0gNSkgJiYgKGlSYXdsZW4gIT0gNikgJiYKKyAgICAgIChpUmF3bGVuICE9IDcpICYmIChpUmF3bGVuICE9IDE2KSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRExFTkdUSCk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCisgIHsKKyAgICBtbmdfdWludDE2ICBpU291cmNlaWQsIGlDbG9uZWlkOworICAgIG1uZ191aW50OCAgIGlDbG9uZXR5cGUgICAgPSAwOworICAgIG1uZ19ib29sICAgIGJIYXNkb25vdHNob3cgPSBNTkdfRkFMU0U7CisgICAgbW5nX3VpbnQ4ICAgaURvbm90c2hvdyAgICA9IDA7CisgICAgbW5nX3VpbnQ4ICAgaUNvbmNyZXRlICAgICA9IDA7CisgICAgbW5nX2Jvb2wgICAgYkhhc2xvY2EgICAgICA9IE1OR19GQUxTRTsKKyAgICBtbmdfdWludDggICBpTG9jYXRpb250eXBlID0gMDsKKyAgICBtbmdfaW50MzIgICBpTG9jYXRpb254ICAgID0gMDsKKyAgICBtbmdfaW50MzIgICBpTG9jYXRpb255ICAgID0gMDsKKyAgICBtbmdfcmV0Y29kZSBpUmV0Y29kZTsKKworICAgIGlTb3VyY2VpZCAgICAgICA9IG1uZ19nZXRfdWludDE2IChwUmF3ZGF0YSk7CisgICAgaUNsb25laWQgICAgICAgID0gbW5nX2dldF91aW50MTYgKHBSYXdkYXRhKzIpOworCisgICAgaWYgKGlSYXdsZW4gPiA0KQorICAgICAgaUNsb25ldHlwZSAgICA9ICoocFJhd2RhdGErNCk7CisKKyAgICBpZiAoaVJhd2xlbiA+IDUpCisgICAgeworICAgICAgYkhhc2Rvbm90c2hvdyA9IE1OR19UUlVFOworICAgICAgaURvbm90c2hvdyAgICA9ICoocFJhd2RhdGErNSk7CisgICAgfQorCisgICAgaWYgKGlSYXdsZW4gPiA2KQorICAgICAgaUNvbmNyZXRlICAgICA9ICoocFJhd2RhdGErNik7CisKKyAgICBpZiAoaVJhd2xlbiA+IDcpCisgICAgeworICAgICAgYkhhc2xvY2EgICAgICA9IE1OR19UUlVFOworICAgICAgaUxvY2F0aW9udHlwZSA9ICoocFJhd2RhdGErNyk7CisgICAgICBpTG9jYXRpb254ICAgID0gbW5nX2dldF9pbnQzMiAocFJhd2RhdGErOCk7CisgICAgICBpTG9jYXRpb255ICAgID0gbW5nX2dldF9pbnQzMiAocFJhd2RhdGErMTIpOworICAgIH0KKworICAgIGlSZXRjb2RlID0gbW5nX2NyZWF0ZV9hbmlfY2xvbiAocERhdGEsIGlTb3VyY2VpZCwgaUNsb25laWQsIGlDbG9uZXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSGFzZG9ub3RzaG93LCBpRG9ub3RzaG93LCBpQ29uY3JldGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSGFzbG9jYSwgaUxvY2F0aW9udHlwZSwgaUxvY2F0aW9ueCwgaUxvY2F0aW9ueSk7CisKKy8qICAgIGlmICghaVJldGNvZGUpCisgICAgICBpUmV0Y29kZSA9IG1uZ19wcm9jZXNzX2Rpc3BsYXlfY2xvbiAocERhdGEsIGlTb3VyY2VpZCwgaUNsb25laWQsIGlDbG9uZXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkhhc2Rvbm90c2hvdywgaURvbm90c2hvdywgaUNvbmNyZXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJIYXNsb2NhLCBpTG9jYXRpb250eXBlLCBpTG9jYXRpb254LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlMb2NhdGlvbnkpOyAqLworCisgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgcmV0dXJuIGlSZXRjb2RlOworCisgIH0KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisKKyNpZmRlZiBNTkdfU1RPUkVfQ0hVTktTCisgIGlmIChwRGF0YS0+YlN0b3JlY2h1bmtzKQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdGlhbGl6ZSBzdG9yYWdlICovCisgICAgbW5nX3JldGNvZGUgaVJldGNvZGUgPSAoKG1uZ19jaHVua19oZWFkZXJwKXBIZWFkZXIpLT5mQ3JlYXRlIChwRGF0YSwgcEhlYWRlciwgcHBDaHVuayk7CisKKyAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZSB0aGUgZmllbGRzICovCisgICAgKChtbmdfY2xvbnApKnBwQ2h1bmspLT5pU291cmNlaWQgICAgICAgPSBtbmdfZ2V0X3VpbnQxNiAocFJhd2RhdGEpOworICAgICgobW5nX2Nsb25wKSpwcENodW5rKS0+aUNsb25laWQgICAgICAgID0gbW5nX2dldF91aW50MTYgKHBSYXdkYXRhKzIpOworCisgICAgaWYgKGlSYXdsZW4gPiA0KQorICAgICAgKChtbmdfY2xvbnApKnBwQ2h1bmspLT5pQ2xvbmV0eXBlICAgID0gKihwUmF3ZGF0YSs0KTsKKworICAgIGlmIChpUmF3bGVuID4gNSkKKyAgICAgICgobW5nX2Nsb25wKSpwcENodW5rKS0+aURvbm90c2hvdyAgICA9ICoocFJhd2RhdGErNSk7CisKKyAgICBpZiAoaVJhd2xlbiA+IDYpCisgICAgICAoKG1uZ19jbG9ucCkqcHBDaHVuayktPmlDb25jcmV0ZSAgICAgPSAqKHBSYXdkYXRhKzYpOworCisgICAgaWYgKGlSYXdsZW4gPiA3KQorICAgIHsKKyAgICAgICgobW5nX2Nsb25wKSpwcENodW5rKS0+Ykhhc2xvY2EgICAgICA9IE1OR19UUlVFOworICAgICAgKChtbmdfY2xvbnApKnBwQ2h1bmspLT5pTG9jYXRpb250eXBlID0gKihwUmF3ZGF0YSs3KTsKKyAgICAgICgobW5nX2Nsb25wKSpwcENodW5rKS0+aUxvY2F0aW9ueCAgICA9IG1uZ19nZXRfaW50MzIgKHBSYXdkYXRhKzgpOworICAgICAgKChtbmdfY2xvbnApKnBwQ2h1bmspLT5pTG9jYXRpb255ICAgID0gbW5nX2dldF9pbnQzMiAocFJhd2RhdGErMTIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgKChtbmdfY2xvbnApKnBwQ2h1bmspLT5iSGFzbG9jYSAgICAgID0gTU5HX0ZBTFNFOworICAgIH0KKyAgfQorI2VuZGlmIC8qIE1OR19TVE9SRV9DSFVOS1MgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9SRUFEX0NMT04sIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOyAgICAgICAgICAgICAgICAgIC8qIGRvbmUgKi8KK30KKyNlbmRpZgorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfUEFTVAorUkVBRF9DSFVOSyAobW5nX3JlYWRfcGFzdCkKK3sKKyNpZiBkZWZpbmVkKE1OR19TVE9SRV9DSFVOS1MpIHx8IGRlZmluZWQoTU5HX1NVUFBPUlRfRElTUExBWSkKKyAgbW5nX3JldGNvZGUgICAgICBpUmV0Y29kZTsKKyAgbW5nX3VpbnQxNiAgICAgICBpVGFyZ2V0aWQ7CisgIG1uZ191aW50OCAgICAgICAgaVRhcmdldHR5cGU7CisgIG1uZ19pbnQzMiAgICAgICAgaVRhcmdldHg7CisgIG1uZ19pbnQzMiAgICAgICAgaVRhcmdldHk7CisgIG1uZ191aW50MzIgICAgICAgaUNvdW50OworICBtbmdfdWludDMyICAgICAgIGlTaXplOworICBtbmdfcHRyICAgICAgICAgIHBTb3VyY2VzOworICBtbmdfdWludDMyICAgICAgIGlYOworICBtbmdfcGFzdF9zb3VyY2VwIHBTb3VyY2U7CisjZW5kaWYKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9SRUFEX1BBU1QsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAoIXBEYXRhLT5iSGFzTUhEUikgICAgICAgICAgICAgICAgLyogc2VxdWVuY2UgY2hlY2tzICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1NFUVVFTkNFRVJST1IpOworCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisgIGlmICgocERhdGEtPmJIYXNJSERSKSB8fCAocERhdGEtPmJIYXNCQVNJKSB8fCAocERhdGEtPmJIYXNESERSKSB8fCAocERhdGEtPmJIYXNKSERSKSkKKyNlbHNlCisgIGlmICgocERhdGEtPmJIYXNJSERSKSB8fCAocERhdGEtPmJIYXNCQVNJKSB8fCAocERhdGEtPmJIYXNESERSKSkKKyNlbmRpZgorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19TRVFVRU5DRUVSUk9SKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2hlY2sgdGhlIGxlbmd0aCAqLworICBpZiAoKGlSYXdsZW4gPCA0MSkgfHwgKCgoaVJhd2xlbiAtIDExKSAlIDMwKSAhPSAwKSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRExFTkdUSCk7CisKKyNpZiBkZWZpbmVkKE1OR19TVE9SRV9DSFVOS1MpIHx8IGRlZmluZWQoTU5HX1NVUFBPUlRfRElTUExBWSkKKyAgaVRhcmdldGlkICAgPSBtbmdfZ2V0X3VpbnQxNiAocFJhd2RhdGEpOworICBpVGFyZ2V0dHlwZSA9ICoocFJhd2RhdGErMik7CisgIGlUYXJnZXR4ICAgID0gbW5nX2dldF9pbnQzMiAgKHBSYXdkYXRhKzMpOworICBpVGFyZ2V0eSAgICA9IG1uZ19nZXRfaW50MzIgIChwUmF3ZGF0YSs3KTsKKyAgaUNvdW50ICAgICAgPSAoKGlSYXdsZW4gLSAxMSkgLyAzMCk7IC8qIGhvdyBtYW55IGVudHJpZXMgYWdhaW4/ICovCisgIGlTaXplICAgICAgID0gaUNvdW50ICogc2l6ZW9mIChtbmdfcGFzdF9zb3VyY2UpOworCisgIHBSYXdkYXRhICs9IDExOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0IGEgYnVmZmVyIGZvciBhbGwgdGhlIHNvdXJjZSBibG9ja3MgKi8KKyAgTU5HX0FMTE9DIChwRGF0YSwgcFNvdXJjZXMsIGlTaXplKTsKKworICBwU291cmNlID0gKG1uZ19wYXN0X3NvdXJjZXApcFNvdXJjZXM7CisKKyAgZm9yIChpWCA9IDA7IGlYIDwgaUNvdW50OyBpWCsrKSAgICAgIC8qIG5vdyBjb3B5IHRoZSBzb3VyY2UgYmxvY2tzICovCisgIHsKKyAgICBwU291cmNlLT5pU291cmNlaWQgICAgID0gbW5nX2dldF91aW50MTYgKHBSYXdkYXRhKTsKKyAgICBwU291cmNlLT5pQ29tcG9zaXRpb24gID0gKihwUmF3ZGF0YSsyKTsKKyAgICBwU291cmNlLT5pT3JpZW50YXRpb24gID0gKihwUmF3ZGF0YSszKTsKKyAgICBwU291cmNlLT5pT2Zmc2V0dHlwZSAgID0gKihwUmF3ZGF0YSs0KTsKKyAgICBwU291cmNlLT5pT2Zmc2V0eCAgICAgID0gbW5nX2dldF9pbnQzMiAocFJhd2RhdGErNSk7CisgICAgcFNvdXJjZS0+aU9mZnNldHkgICAgICA9IG1uZ19nZXRfaW50MzIgKHBSYXdkYXRhKzkpOworICAgIHBTb3VyY2UtPmlCb3VuZGFyeXR5cGUgPSAqKHBSYXdkYXRhKzEzKTsKKyAgICBwU291cmNlLT5pQm91bmRhcnlsICAgID0gbW5nX2dldF9pbnQzMiAocFJhd2RhdGErMTQpOworICAgIHBTb3VyY2UtPmlCb3VuZGFyeXIgICAgPSBtbmdfZ2V0X2ludDMyIChwUmF3ZGF0YSsxOCk7CisgICAgcFNvdXJjZS0+aUJvdW5kYXJ5dCAgICA9IG1uZ19nZXRfaW50MzIgKHBSYXdkYXRhKzIyKTsKKyAgICBwU291cmNlLT5pQm91bmRhcnliICAgID0gbW5nX2dldF9pbnQzMiAocFJhd2RhdGErMjYpOworCisgICAgcFNvdXJjZSsrOworICAgIHBSYXdkYXRhICs9IDMwOworICB9CisjZW5kaWYKKworI2lmZGVmIE1OR19TVVBQT1JUX0RJU1BMQVkKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSBwbGF5YmFjayBvYmplY3QgKi8KKyAgICBpUmV0Y29kZSA9IG1uZ19jcmVhdGVfYW5pX3Bhc3QgKHBEYXRhLCBpVGFyZ2V0aWQsIGlUYXJnZXR0eXBlLCBpVGFyZ2V0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlUYXJnZXR5LCBpQ291bnQsIHBTb3VyY2VzKTsKKworLyogICAgaWYgKCFpUmV0Y29kZSkKKyAgICAgIGlSZXRjb2RlID0gbW5nX3Byb2Nlc3NfZGlzcGxheV9wYXN0IChwRGF0YSwgaVRhcmdldGlkLCBpVGFyZ2V0dHlwZSwgaVRhcmdldHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVRhcmdldHksIGlDb3VudCwgcFNvdXJjZXMpOyAqLworCisgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgIHsKKyAgICAgIE1OR19GUkVFWCAocERhdGEsIHBTb3VyY2VzLCBpU2l6ZSk7CisgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgfQorICB9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfRElTUExBWSAqLworCisjaWZkZWYgTU5HX1NUT1JFX0NIVU5LUworICBpZiAocERhdGEtPmJTdG9yZWNodW5rcykKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpemUgc3RvcmFnZSAqLworICAgIGlSZXRjb2RlID0gKChtbmdfY2h1bmtfaGVhZGVycClwSGVhZGVyKS0+ZkNyZWF0ZSAocERhdGEsIHBIZWFkZXIsIHBwQ2h1bmspOworCisgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgIHsKKyAgICAgIE1OR19GUkVFWCAocERhdGEsIHBTb3VyY2VzLCBpU2l6ZSk7CisgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmUgdGhlIGZpZWxkcyAqLworICAgICgobW5nX3Bhc3RwKSpwcENodW5rKS0+aURlc3RpZCAgICAgPSBpVGFyZ2V0aWQ7CisgICAgKChtbmdfcGFzdHApKnBwQ2h1bmspLT5pVGFyZ2V0dHlwZSA9IGlUYXJnZXR0eXBlOworICAgICgobW5nX3Bhc3RwKSpwcENodW5rKS0+aVRhcmdldHggICAgPSBpVGFyZ2V0eDsKKyAgICAoKG1uZ19wYXN0cCkqcHBDaHVuayktPmlUYXJnZXR5ICAgID0gaVRhcmdldHk7CisgICAgKChtbmdfcGFzdHApKnBwQ2h1bmspLT5pQ291bnQgICAgICA9IGlDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCBhIGJ1ZmZlciAmIGNvcHkgdGhlIHNvdXJjZSBibG9ja3MgKi8KKyAgICBNTkdfQUxMT0MgKHBEYXRhLCAoKG1uZ19wYXN0cCkqcHBDaHVuayktPnBTb3VyY2VzLCBpU2l6ZSk7CisgICAgTU5HX0NPUFkgKCgobW5nX3Bhc3RwKSpwcENodW5rKS0+cFNvdXJjZXMsIHBTb3VyY2VzLCBpU2l6ZSk7CisgIH0KKyNlbmRpZiAvKiBNTkdfU1RPUkVfQ0hVTktTICovCisKKyNpZiBkZWZpbmVkKE1OR19TVE9SRV9DSFVOS1MpIHx8IGRlZmluZWQoTU5HX1NVUFBPUlRfRElTUExBWSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZyZWUgdGhlIHNvdXJjZSBibG9jayBidWZmZXIgKi8KKyAgTU5HX0ZSRUVYIChwRGF0YSwgcFNvdXJjZXMsIGlTaXplKTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1JFQURfUEFTVCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7ICAgICAgICAgICAgICAgICAgLyogZG9uZSAqLworfQorI2VuZGlmCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19ESVNDCitSRUFEX0NIVU5LIChtbmdfcmVhZF9kaXNjKQoreworI2lmIGRlZmluZWQoTU5HX1NVUFBPUlRfRElTUExBWSkgfHwgZGVmaW5lZChNTkdfU1RPUkVfQ0hVTktTKQorICBtbmdfdWludDMyICBpQ291bnQ7CisgIG1uZ191aW50MTZwIHBJZHMgPSBNTkdfTlVMTDsKKyAgbW5nX3JldGNvZGUgaVJldGNvZGU7CisjZW5kaWYKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9SRUFEX0RJU0MsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAoIXBEYXRhLT5iSGFzTUhEUikgICAgICAgICAgICAgICAgLyogc2VxdWVuY2UgY2hlY2tzICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1NFUVVFTkNFRVJST1IpOworCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisgIGlmICgocERhdGEtPmJIYXNJSERSKSB8fCAocERhdGEtPmJIYXNCQVNJKSB8fCAocERhdGEtPmJIYXNESERSKSB8fCAocERhdGEtPmJIYXNKSERSKSkKKyNlbHNlCisgIGlmICgocERhdGEtPmJIYXNJSERSKSB8fCAocERhdGEtPmJIYXNCQVNJKSB8fCAocERhdGEtPmJIYXNESERSKSkKKyNlbmRpZgorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19TRVFVRU5DRUVSUk9SKTsKKworICBpZiAoKGlSYXdsZW4gJSAyKSAhPSAwKSAgICAgICAgICAgICAgLyogY2hlY2sgdGhlIGxlbmd0aCAqLworICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElETEVOR1RIKTsKKworI2lmIGRlZmluZWQoTU5HX1NVUFBPUlRfRElTUExBWSkgfHwgZGVmaW5lZChNTkdfU1RPUkVfQ0hVTktTKQorICBpQ291bnQgPSAoaVJhd2xlbiAvIHNpemVvZiAobW5nX3VpbnQxNikpOworCisgIGlmIChpQ291bnQpCisgIHsKKyAgICBNTkdfQUxMT0MgKHBEYXRhLCBwSWRzLCBpUmF3bGVuKTsKKworI2lmbmRlZiBNTkdfQklHRU5ESUFOX1NVUFBPUlRFRAorICAgIHsKKyAgICAgIG1uZ191aW50MzIgIGlYOworICAgICAgbW5nX3VpbnQ4cCAgcEluICA9IHBSYXdkYXRhOworICAgICAgbW5nX3VpbnQxNnAgcE91dCA9IHBJZHM7CisKKyAgICAgIGZvciAoaVggPSAwOyBpWCA8IGlDb3VudDsgaVgrKykKKyAgICAgIHsKKyAgICAgICAgKnBPdXQrKyA9IG1uZ19nZXRfdWludDE2IChwSW4pOworICAgICAgICBwSW4gKz0gMjsKKyAgICAgIH0KKyAgICB9CisjZWxzZQorICAgIE1OR19DT1BZIChwSWRzLCBwUmF3ZGF0YSwgaVJhd2xlbik7CisjZW5kaWYgLyogIU1OR19CSUdFTkRJQU5fU1VQUE9SVEVEICovCisgIH0KKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIHBsYXliYWNrIG9iamVjdCAqLworICAgIGlSZXRjb2RlID0gbW5nX2NyZWF0ZV9hbmlfZGlzYyAocERhdGEsIGlDb3VudCwgcElkcyk7CisKKy8qICAgIGlmICghaVJldGNvZGUpCisgICAgICBpUmV0Y29kZSA9IG1uZ19wcm9jZXNzX2Rpc3BsYXlfZGlzYyAocERhdGEsIGlDb3VudCwgcElkcyk7ICovCisKKyAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICByZXR1cm4gaVJldGNvZGU7CisgIH0KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisKKyNpZmRlZiBNTkdfU1RPUkVfQ0hVTktTCisgIGlmIChwRGF0YS0+YlN0b3JlY2h1bmtzKQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdGlhbGl6ZSBzdG9yYWdlICovCisgICAgaVJldGNvZGUgPSAoKG1uZ19jaHVua19oZWFkZXJwKXBIZWFkZXIpLT5mQ3JlYXRlIChwRGF0YSwgcEhlYWRlciwgcHBDaHVuayk7CisKKyAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZSB0aGUgZmllbGRzICovCisgICAgKChtbmdfZGlzY3ApKnBwQ2h1bmspLT5pQ291bnQgPSBpQ291bnQ7CisKKyAgICBpZiAoaVJhd2xlbikKKyAgICB7CisgICAgICBNTkdfQUxMT0MgKHBEYXRhLCAoKG1uZ19kaXNjcCkqcHBDaHVuayktPnBPYmplY3RpZHMsIGlSYXdsZW4pOworICAgICAgTU5HX0NPUFkgKCgobW5nX2Rpc2NwKSpwcENodW5rKS0+cE9iamVjdGlkcywgcElkcywgaVJhd2xlbik7CisgICAgfQorICB9CisjZW5kaWYgLyogTU5HX1NUT1JFX0NIVU5LUyAqLworCisjaWYgZGVmaW5lZChNTkdfU1VQUE9SVF9ESVNQTEFZKSB8fCBkZWZpbmVkKE1OR19TVE9SRV9DSFVOS1MpCisgIGlmIChpUmF3bGVuKQorICAgIE1OR19GUkVFWCAocERhdGEsIHBJZHMsIGlSYXdsZW4pOworI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVBRF9ESVNDLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsgICAgICAgICAgICAgICAgICAvKiBkb25lICovCit9CisjZW5kaWYKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX0JBQ0sKK1JFQURfQ0hVTksgKG1uZ19yZWFkX2JhY2spCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1JFQURfQkFDSywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmICghcERhdGEtPmJIYXNNSERSKSAgICAgICAgICAgICAgICAvKiBzZXF1ZW5jZSBjaGVja3MgKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfU0VRVUVOQ0VFUlJPUik7CisKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgaWYgKChwRGF0YS0+Ykhhc0lIRFIpIHx8IChwRGF0YS0+Ykhhc0JBU0kpIHx8IChwRGF0YS0+Ykhhc0RIRFIpIHx8IChwRGF0YS0+Ykhhc0pIRFIpKQorI2Vsc2UKKyAgaWYgKChwRGF0YS0+Ykhhc0lIRFIpIHx8IChwRGF0YS0+Ykhhc0JBU0kpIHx8IChwRGF0YS0+Ykhhc0RIRFIpKQorI2VuZGlmCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1NFUVVFTkNFRVJST1IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2hlY2sgdGhlIGxlbmd0aCAqLworICBpZiAoKGlSYXdsZW4gIT0gNikgJiYgKGlSYXdsZW4gIT0gNykgJiYgKGlSYXdsZW4gIT0gOSkgJiYgKGlSYXdsZW4gIT0gMTApKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElETEVOR1RIKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX0RJU1BMQVkKKyAgeworICAgIG1uZ19yZXRjb2RlIGlSZXRjb2RlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmV0cmlldmUgdGhlIGZpZWxkcyAqLworICAgIHBEYXRhLT5iSGFzQkFDSyAgICAgICAgID0gTU5HX1RSVUU7CisgICAgcERhdGEtPmlCQUNLcmVkICAgICAgICAgPSBtbmdfZ2V0X3VpbnQxNiAocFJhd2RhdGEpOworICAgIHBEYXRhLT5pQkFDS2dyZWVuICAgICAgID0gbW5nX2dldF91aW50MTYgKHBSYXdkYXRhKzIpOworICAgIHBEYXRhLT5pQkFDS2JsdWUgICAgICAgID0gbW5nX2dldF91aW50MTYgKHBSYXdkYXRhKzQpOworCisgICAgaWYgKGlSYXdsZW4gPiA2KQorICAgICAgcERhdGEtPmlCQUNLbWFuZGF0b3J5ID0gKihwUmF3ZGF0YSs2KTsKKyAgICBlbHNlCisgICAgICBwRGF0YS0+aUJBQ0ttYW5kYXRvcnkgPSAwOworCisgICAgaWYgKGlSYXdsZW4gPiA3KQorICAgICAgcERhdGEtPmlCQUNLaW1hZ2VpZCAgID0gbW5nX2dldF91aW50MTYgKHBSYXdkYXRhKzcpOworICAgIGVsc2UKKyAgICAgIHBEYXRhLT5pQkFDS2ltYWdlaWQgICA9IDA7CisKKyAgICBpZiAoaVJhd2xlbiA+IDkpCisgICAgICBwRGF0YS0+aUJBQ0t0aWxlICAgICAgPSAqKHBSYXdkYXRhKzkpOworICAgIGVsc2UKKyAgICAgIHBEYXRhLT5pQkFDS3RpbGUgICAgICA9IDA7CisKKyAgICBpUmV0Y29kZSA9IG1uZ19jcmVhdGVfYW5pX2JhY2sgKHBEYXRhLCBwRGF0YS0+aUJBQ0tyZWQsIHBEYXRhLT5pQkFDS2dyZWVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlCQUNLYmx1ZSwgcERhdGEtPmlCQUNLbWFuZGF0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlCQUNLaW1hZ2VpZCwgcERhdGEtPmlCQUNLdGlsZSk7CisKKyAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgcmV0dXJuIGlSZXRjb2RlOworICB9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfRElTUExBWSAqLworCisjaWZkZWYgTU5HX1NUT1JFX0NIVU5LUworICBpZiAocERhdGEtPmJTdG9yZWNodW5rcykKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpemUgc3RvcmFnZSAqLworICAgIG1uZ19yZXRjb2RlIGlSZXRjb2RlID0gKChtbmdfY2h1bmtfaGVhZGVycClwSGVhZGVyKS0+ZkNyZWF0ZSAocERhdGEsIHBIZWFkZXIsIHBwQ2h1bmspOworCisgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgcmV0dXJuIGlSZXRjb2RlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmUgdGhlIGZpZWxkcyAqLworICAgICgobW5nX2JhY2twKSpwcENodW5rKS0+aVJlZCAgICAgICAgID0gbW5nX2dldF91aW50MTYgKHBSYXdkYXRhKTsKKyAgICAoKG1uZ19iYWNrcCkqcHBDaHVuayktPmlHcmVlbiAgICAgICA9IG1uZ19nZXRfdWludDE2IChwUmF3ZGF0YSsyKTsKKyAgICAoKG1uZ19iYWNrcCkqcHBDaHVuayktPmlCbHVlICAgICAgICA9IG1uZ19nZXRfdWludDE2IChwUmF3ZGF0YSs0KTsKKworICAgIGlmIChpUmF3bGVuID4gNikKKyAgICAgICgobW5nX2JhY2twKSpwcENodW5rKS0+aU1hbmRhdG9yeSA9ICoocFJhd2RhdGErNik7CisKKyAgICBpZiAoaVJhd2xlbiA+IDcpCisgICAgICAoKG1uZ19iYWNrcCkqcHBDaHVuayktPmlJbWFnZWlkICAgPSBtbmdfZ2V0X3VpbnQxNiAocFJhd2RhdGErNyk7CisKKyAgICBpZiAoaVJhd2xlbiA+IDkpCisgICAgICAoKG1uZ19iYWNrcCkqcHBDaHVuayktPmlUaWxlICAgICAgPSAqKHBSYXdkYXRhKzkpOworCisgIH0KKyNlbmRpZiAvKiBNTkdfU1RPUkVfQ0hVTktTICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVBRF9CQUNLLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsgICAgICAgICAgICAgICAgICAvKiBkb25lICovCit9CisjZW5kaWYKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX0ZSQU0KK1JFQURfQ0hVTksgKG1uZ19yZWFkX2ZyYW0pCit7CisgIG1uZ191aW50OHAgcFRlbXA7CisjaWZkZWYgTU5HX1NUT1JFX0NIVU5LUworICBtbmdfdWludDMyIGlOYW1lbGVuOworI2VuZGlmCisgIG1uZ191aW50MzIgaVJlbWFpbjsKKyAgbW5nX3VpbnQzMiBpUmVxdWlyZWQgPSAwOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1JFQURfRlJBTSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmICghcERhdGEtPmJIYXNNSERSKSAgICAgICAgICAgICAgICAvKiBzZXF1ZW5jZSBjaGVja3MgKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfU0VRVUVOQ0VFUlJPUik7CisKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgaWYgKChwRGF0YS0+Ykhhc0lIRFIpIHx8IChwRGF0YS0+Ykhhc0JBU0kpIHx8IChwRGF0YS0+Ykhhc0RIRFIpIHx8IChwRGF0YS0+Ykhhc0pIRFIpKQorI2Vsc2UKKyAgaWYgKChwRGF0YS0+Ykhhc0lIRFIpIHx8IChwRGF0YS0+Ykhhc0JBU0kpIHx8IChwRGF0YS0+Ykhhc0RIRFIpKQorI2VuZGlmCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1NFUVVFTkNFRVJST1IpOworCisgIGlmIChpUmF3bGVuIDw9IDEpICAgICAgICAgICAgICAgICAgICAvKiBvbmx5IGZyYW1pbmctbW9kZSA/ICovCisgIHsKKyNpZmRlZiBNTkdfU1RPUkVfQ0hVTktTCisgICAgaU5hbWVsZW4gPSAwOyAgICAgICAgICAgICAgICAgICAgICAvKiBpbmRpY2F0ZSBzbyAqLworI2VuZGlmCisgICAgaVJlbWFpbiAgPSAwOworICAgIHBUZW1wICAgID0gTU5HX05VTEw7CisgIH0KKyAgZWxzZQorICB7CisgICAgcFRlbXAgPSBmaW5kX251bGwgKHBSYXdkYXRhKzEpOyAgICAvKiBmaW5kIG51bGwtc2VwYXJhdG9yICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3QgZm91bmQgaW5zaWRlIGlucHV0LWRhdGEgPyAqLworICAgIGlmICgocFRlbXAgLSBwUmF3ZGF0YSkgPiAobW5nX2ludDMyKWlSYXdsZW4pCisgICAgICBwVGVtcCAgPSBwUmF3ZGF0YSArIGlSYXdsZW47ICAgICAvKiB0aGFuIHJlbWFpbmRlciBpcyBuYW1lICovCisKKyNpZmRlZiBNTkdfU1RPUkVfQ0hVTktTCisgICAgaU5hbWVsZW4gPSAobW5nX3VpbnQzMikoKHBUZW1wIC0gcFJhd2RhdGEpIC0gMSk7CisjZW5kaWYKKyAgICBpUmVtYWluICA9IChtbmdfdWludDMyKShpUmF3bGVuIC0gKHBUZW1wIC0gcFJhd2RhdGEpKTsKKworICAgIGlmIChpUmVtYWluKSAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgdGhlcmUgaXMgcmVtYWluaW5nIGRhdGEgaXQncyBsZXNzIDEgYnl0ZSAqLworICAgICAgaVJlbWFpbi0tOworCisgICAgaWYgKChpUmVtYWluKSAmJiAoaVJlbWFpbiA8IDQpKSAgICAvKiByZW1haW5zIG11c3QgYmUgZW1wdHkgb3IgYXQgbGVhc3QgNCBieXRlcyAqLworICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURMRU5HVEgpOworCisgICAgaWYgKGlSZW1haW4pCisgICAgeworICAgICAgaVJlcXVpcmVkID0gNDsgICAgICAgICAgICAgICAgICAgLyogY2FsY3VsYXRlIGFuZCBjaGVjayByZXF1aXJlZCByZW1haW5pbmcgbGVuZ3RoICovCisKKyAgICAgIGlmICgqKHBUZW1wKzEpKSB7IGlSZXF1aXJlZCArPSA0OyB9CisgICAgICBpZiAoKihwVGVtcCsyKSkgeyBpUmVxdWlyZWQgKz0gNDsgfQorICAgICAgaWYgKCoocFRlbXArMykpIHsgaVJlcXVpcmVkICs9IDE3OyB9CisKKyAgICAgIGlmICgqKHBUZW1wKzQpKQorICAgICAgeworICAgICAgICBpZiAoKGlSZW1haW4gLSBpUmVxdWlyZWQpICUgNCAhPSAwKQorICAgICAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElETEVOR1RIKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgaWYgKGlSZW1haW4gIT0gaVJlcXVpcmVkKQorICAgICAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElETEVOR1RIKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX0RJU1BMQVkKKyAgeworICAgIG1uZ191aW50OHAgIHBXb3JrICAgICAgICAgICA9IHBUZW1wOworICAgIG1uZ191aW50OCAgIGlGcmFtZW1vZGUgICAgICA9IDA7CisgICAgbW5nX3VpbnQ4ICAgaUNoYW5nZWRlbGF5ICAgID0gMDsKKyAgICBtbmdfdWludDMyICBpRGVsYXkgICAgICAgICAgPSAwOworICAgIG1uZ191aW50OCAgIGlDaGFuZ2V0aW1lb3V0ICA9IDA7CisgICAgbW5nX3VpbnQzMiAgaVRpbWVvdXQgICAgICAgID0gMDsKKyAgICBtbmdfdWludDggICBpQ2hhbmdlY2xpcHBpbmcgPSAwOworICAgIG1uZ191aW50OCAgIGlDbGlwdHlwZSAgICAgICA9IDA7CisgICAgbW5nX2ludDMyICAgaUNsaXBsICAgICAgICAgID0gMDsKKyAgICBtbmdfaW50MzIgICBpQ2xpcHIgICAgICAgICAgPSAwOworICAgIG1uZ19pbnQzMiAgIGlDbGlwdCAgICAgICAgICA9IDA7CisgICAgbW5nX2ludDMyICAgaUNsaXBiICAgICAgICAgID0gMDsKKyAgICBtbmdfcmV0Y29kZSBpUmV0Y29kZTsKKworICAgIGlmIChpUmF3bGVuKSAgICAgICAgICAgICAgICAgICAgICAgLyogYW55IGRhdGEgc3BlY2lmaWVkID8gKi8KKyAgICB7CisgICAgICBpZiAoKihwUmF3ZGF0YSkpICAgICAgICAgICAgICAgICAvKiBzYXZlIHRoZSBuZXcgZnJhbWluZyBtb2RlID8gKi8KKyAgICAgIHsKKyAgICAgICAgaUZyYW1lbW9kZSA9ICoocFJhd2RhdGEpOworCisjaWZuZGVmIE1OR19OT19PTERfVkVSU0lPTlMKKyAgICAgICAgaWYgKHBEYXRhLT5iUHJlRHJhZnQ0OCkgICAgICAgIC8qIG9sZCBzdHlsZSBpbnB1dC1zdHJlYW0gPyAqLworICAgICAgICB7CisgICAgICAgICAgc3dpdGNoIChpRnJhbWVtb2RlKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgIDA6IHsgYnJlYWs7IH0KKyAgICAgICAgICAgIGNhc2UgIDE6IHsgaUZyYW1lbW9kZSA9IDM7IGJyZWFrOyB9CisgICAgICAgICAgICBjYXNlICAyOiB7IGlGcmFtZW1vZGUgPSA0OyBicmVhazsgfQorICAgICAgICAgICAgY2FzZSAgMzogeyBpRnJhbWVtb2RlID0gMTsgYnJlYWs7IH0KKyAgICAgICAgICAgIGNhc2UgIDQ6IHsgaUZyYW1lbW9kZSA9IDE7IGJyZWFrOyB9CisgICAgICAgICAgICBjYXNlICA1OiB7IGlGcmFtZW1vZGUgPSAyOyBicmVhazsgfQorICAgICAgICAgICAgZGVmYXVsdDogeyBpRnJhbWVtb2RlID0gMTsgYnJlYWs7IH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgfQorCisgICAgICBpZiAoaVJlbWFpbikKKyAgICAgIHsKKyAgICAgICAgaUNoYW5nZWRlbGF5ICAgID0gKihwV29yaysxKTsKKyAgICAgICAgaUNoYW5nZXRpbWVvdXQgID0gKihwV29yaysyKTsKKyAgICAgICAgaUNoYW5nZWNsaXBwaW5nID0gKihwV29yayszKTsKKyAgICAgICAgcFdvcmsgKz0gNTsKKworICAgICAgICBpZiAoaUNoYW5nZWRlbGF5KSAgICAgICAgICAgICAgLyogZGVsYXkgY2hhbmdlZCA/ICovCisgICAgICAgIHsKKyAgICAgICAgICBpRGVsYXkgPSBtbmdfZ2V0X3VpbnQzMiAocFdvcmspOworICAgICAgICAgIHBXb3JrICs9IDQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaUNoYW5nZXRpbWVvdXQpICAgICAgICAgICAgLyogdGltZW91dCBjaGFuZ2VkID8gKi8KKyAgICAgICAgeworICAgICAgICAgIGlUaW1lb3V0ID0gbW5nX2dldF91aW50MzIgKHBXb3JrKTsKKyAgICAgICAgICBwV29yayArPSA0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKGlDaGFuZ2VjbGlwcGluZykgICAgICAgICAgIC8qIGNsaXBwaW5nIGNoYW5nZWQgPyAqLworICAgICAgICB7CisgICAgICAgICAgaUNsaXB0eXBlID0gKnBXb3JrOworICAgICAgICAgIGlDbGlwbCAgICA9IG1uZ19nZXRfaW50MzIgKHBXb3JrKzEpOworICAgICAgICAgIGlDbGlwciAgICA9IG1uZ19nZXRfaW50MzIgKHBXb3JrKzUpOworICAgICAgICAgIGlDbGlwdCAgICA9IG1uZ19nZXRfaW50MzIgKHBXb3JrKzkpOworICAgICAgICAgIGlDbGlwYiAgICA9IG1uZ19nZXRfaW50MzIgKHBXb3JrKzEzKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGlSZXRjb2RlID0gbW5nX2NyZWF0ZV9hbmlfZnJhbSAocERhdGEsIGlGcmFtZW1vZGUsIGlDaGFuZ2VkZWxheSwgaURlbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUNoYW5nZXRpbWVvdXQsIGlUaW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUNoYW5nZWNsaXBwaW5nLCBpQ2xpcHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpQ2xpcGwsIGlDbGlwciwgaUNsaXB0LCBpQ2xpcGIpOworCisvKiAgICBpZiAoIWlSZXRjb2RlKQorICAgICAgaVJldGNvZGUgPSBtbmdfcHJvY2Vzc19kaXNwbGF5X2ZyYW0gKHBEYXRhLCBpRnJhbWVtb2RlLCBpQ2hhbmdlZGVsYXksIGlEZWxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpQ2hhbmdldGltZW91dCwgaVRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUNoYW5nZWNsaXBwaW5nLCBpQ2xpcHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUNsaXBsLCBpQ2xpcHIsIGlDbGlwdCwgaUNsaXBiKTsgKi8KKworICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKworICB9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfRElTUExBWSAqLworCisjaWZkZWYgTU5HX1NUT1JFX0NIVU5LUworICBpZiAocERhdGEtPmJTdG9yZWNodW5rcykKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpemUgc3RvcmFnZSAqLworICAgIG1uZ19yZXRjb2RlIGlSZXRjb2RlID0gKChtbmdfY2h1bmtfaGVhZGVycClwSGVhZGVyKS0+ZkNyZWF0ZSAocERhdGEsIHBIZWFkZXIsIHBwQ2h1bmspOworCisgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgcmV0dXJuIGlSZXRjb2RlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmUgdGhlIGZpZWxkcyAqLworICAgICgobW5nX2ZyYW1wKSpwcENodW5rKS0+YkVtcHR5ICAgICAgICAgICAgICA9IChtbmdfYm9vbCkoaVJhd2xlbiA9PSAwKTsKKworICAgIGlmIChpUmF3bGVuKQorICAgIHsKKyAgICAgIG1uZ191aW50OCBpRnJhbWVtb2RlID0gKihwUmF3ZGF0YSk7CisKKyNpZm5kZWYgTU5HX05PX09MRF9WRVJTSU9OUworICAgICAgaWYgKHBEYXRhLT5iUHJlRHJhZnQ0OCkgICAgICAgICAgLyogb2xkIHN0eWxlIGlucHV0LXN0cmVhbSA/ICovCisgICAgICB7CisgICAgICAgIHN3aXRjaCAoaUZyYW1lbW9kZSkKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgIDE6IHsgaUZyYW1lbW9kZSA9IDM7IGJyZWFrOyB9CisgICAgICAgICAgY2FzZSAgMjogeyBpRnJhbWVtb2RlID0gNDsgYnJlYWs7IH0KKyAgICAgICAgICBjYXNlICAzOiB7IGlGcmFtZW1vZGUgPSA1OyBicmVhazsgfSAgICAvKiBUT0RPOiBwcm92aXNpb24gZm9yIG1vZGU9NSA/Pz8gKi8KKyAgICAgICAgICBjYXNlICA0OiB7IGlGcmFtZW1vZGUgPSAxOyBicmVhazsgfQorICAgICAgICAgIGNhc2UgIDU6IHsgaUZyYW1lbW9kZSA9IDI7IGJyZWFrOyB9CisgICAgICAgICAgZGVmYXVsdDogeyBpRnJhbWVtb2RlID0gMTsgYnJlYWs7IH0KKyAgICAgICAgfQorICAgICAgfQorI2VuZGlmCisKKyAgICAgICgobW5nX2ZyYW1wKSpwcENodW5rKS0+aU1vZGUgICAgICAgICAgICAgPSBpRnJhbWVtb2RlOworICAgICAgKChtbmdfZnJhbXApKnBwQ2h1bmspLT5pTmFtZXNpemUgICAgICAgICA9IGlOYW1lbGVuOworCisgICAgICBpZiAoaU5hbWVsZW4pCisgICAgICB7CisgICAgICAgIE1OR19BTExPQyAocERhdGEsICgobW5nX2ZyYW1wKSpwcENodW5rKS0+ek5hbWUsIGlOYW1lbGVuKzEpOworICAgICAgICBNTkdfQ09QWSAoKChtbmdfZnJhbXApKnBwQ2h1bmspLT56TmFtZSwgcFJhd2RhdGErMSwgaU5hbWVsZW4pOworICAgICAgfQorCisgICAgICBpZiAoaVJlbWFpbikKKyAgICAgIHsKKyAgICAgICAgKChtbmdfZnJhbXApKnBwQ2h1bmspLT5pQ2hhbmdlZGVsYXkgICAgPSAqKHBUZW1wKzEpOworICAgICAgICAoKG1uZ19mcmFtcCkqcHBDaHVuayktPmlDaGFuZ2V0aW1lb3V0ICA9ICoocFRlbXArMik7CisgICAgICAgICgobW5nX2ZyYW1wKSpwcENodW5rKS0+aUNoYW5nZWNsaXBwaW5nID0gKihwVGVtcCszKTsKKyAgICAgICAgKChtbmdfZnJhbXApKnBwQ2h1bmspLT5pQ2hhbmdlc3luY2lkICAgPSAqKHBUZW1wKzQpOworCisgICAgICAgIHBUZW1wICs9IDU7CisKKyAgICAgICAgaWYgKCgobW5nX2ZyYW1wKSpwcENodW5rKS0+aUNoYW5nZWRlbGF5KQorICAgICAgICB7CisgICAgICAgICAgKChtbmdfZnJhbXApKnBwQ2h1bmspLT5pRGVsYXkgICAgICAgID0gbW5nX2dldF91aW50MzIgKHBUZW1wKTsKKyAgICAgICAgICBwVGVtcCArPSA0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKCgobW5nX2ZyYW1wKSpwcENodW5rKS0+aUNoYW5nZXRpbWVvdXQpCisgICAgICAgIHsKKyAgICAgICAgICAoKG1uZ19mcmFtcCkqcHBDaHVuayktPmlUaW1lb3V0ICAgICAgPSBtbmdfZ2V0X3VpbnQzMiAocFRlbXApOworICAgICAgICAgIHBUZW1wICs9IDQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKChtbmdfZnJhbXApKnBwQ2h1bmspLT5pQ2hhbmdlY2xpcHBpbmcpCisgICAgICAgIHsKKyAgICAgICAgICAoKG1uZ19mcmFtcCkqcHBDaHVuayktPmlCb3VuZGFyeXR5cGUgPSAqcFRlbXA7CisgICAgICAgICAgKChtbmdfZnJhbXApKnBwQ2h1bmspLT5pQm91bmRhcnlsICAgID0gbW5nX2dldF9pbnQzMiAocFRlbXArMSk7CisgICAgICAgICAgKChtbmdfZnJhbXApKnBwQ2h1bmspLT5pQm91bmRhcnlyICAgID0gbW5nX2dldF9pbnQzMiAocFRlbXArNSk7CisgICAgICAgICAgKChtbmdfZnJhbXApKnBwQ2h1bmspLT5pQm91bmRhcnl0ICAgID0gbW5nX2dldF9pbnQzMiAocFRlbXArOSk7CisgICAgICAgICAgKChtbmdfZnJhbXApKnBwQ2h1bmspLT5pQm91bmRhcnliICAgID0gbW5nX2dldF9pbnQzMiAocFRlbXArMTMpOworICAgICAgICAgIHBUZW1wICs9IDE3OworICAgICAgICB9CisKKyAgICAgICAgaWYgKCgobW5nX2ZyYW1wKSpwcENodW5rKS0+aUNoYW5nZXN5bmNpZCkKKyAgICAgICAgeworICAgICAgICAgICgobW5nX2ZyYW1wKSpwcENodW5rKS0+aUNvdW50ICAgICAgICA9IChpUmVtYWluIC0gaVJlcXVpcmVkKSAvIDQ7CisKKyAgICAgICAgICBpZiAoKChtbmdfZnJhbXApKnBwQ2h1bmspLT5pQ291bnQpCisgICAgICAgICAgeworICAgICAgICAgICAgTU5HX0FMTE9DIChwRGF0YSwgKChtbmdfZnJhbXApKnBwQ2h1bmspLT5wU3luY2lkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobW5nX2ZyYW1wKSpwcENodW5rKS0+aUNvdW50ICogNCk7CisKKyNpZm5kZWYgTU5HX0JJR0VORElBTl9TVVBQT1JURUQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpWDsKKyAgICAgICAgICAgICAgbW5nX3VpbnQzMnAgcE91dCA9ICgobW5nX2ZyYW1wKSpwcENodW5rKS0+cFN5bmNpZHM7CisKKyAgICAgICAgICAgICAgZm9yIChpWCA9IDA7IGlYIDwgKChtbmdfZnJhbXApKnBwQ2h1bmspLT5pQ291bnQ7IGlYKyspCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqcE91dCsrID0gbW5nX2dldF91aW50MzIgKHBUZW1wKTsKKyAgICAgICAgICAgICAgICBwVGVtcCArPSA0OworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgTU5HX0NPUFkgKCgobW5nX2ZyYW1wKSpwcENodW5rKS0+cFN5bmNpZHMsIHBUZW1wLAorICAgICAgICAgICAgICAgICAgICAgICgobW5nX2ZyYW1wKSpwcENodW5rKS0+aUNvdW50ICogNCk7CisjZW5kaWYgLyogIU1OR19CSUdFTkRJQU5fU1VQUE9SVEVEICovCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisjZW5kaWYgLyogTU5HX1NUT1JFX0NIVU5LUyAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1JFQURfRlJBTSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7ICAgICAgICAgICAgICAgICAgLyogZG9uZSAqLworfQorI2VuZGlmCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19NT1ZFCitSRUFEX0NIVU5LIChtbmdfcmVhZF9tb3ZlKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9SRUFEX01PVkUsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAoIXBEYXRhLT5iSGFzTUhEUikgICAgICAgICAgICAgICAgLyogc2VxdWVuY2UgY2hlY2tzICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1NFUVVFTkNFRVJST1IpOworCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisgIGlmICgocERhdGEtPmJIYXNJSERSKSB8fCAocERhdGEtPmJIYXNCQVNJKSB8fCAocERhdGEtPmJIYXNESERSKSB8fCAocERhdGEtPmJIYXNKSERSKSkKKyNlbHNlCisgIGlmICgocERhdGEtPmJIYXNJSERSKSB8fCAocERhdGEtPmJIYXNCQVNJKSB8fCAocERhdGEtPmJIYXNESERSKSkKKyNlbmRpZgorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19TRVFVRU5DRUVSUk9SKTsKKworICBpZiAoaVJhd2xlbiAhPSAxMykgICAgICAgICAgICAgICAgICAgLyogY2hlY2sgdGhlIGxlbmd0aCAqLworICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElETEVOR1RIKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX0RJU1BMQVkKKyAgeworICAgIG1uZ19yZXRjb2RlIGlSZXRjb2RlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIGEgTU9WRSBhbmltYXRpb24gb2JqZWN0ICovCisgICAgaVJldGNvZGUgPSBtbmdfY3JlYXRlX2FuaV9tb3ZlIChwRGF0YSwgbW5nX2dldF91aW50MTYgKHBSYXdkYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfZ2V0X3VpbnQxNiAocFJhd2RhdGErMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwUmF3ZGF0YSs0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfZ2V0X2ludDMyIChwUmF3ZGF0YSs1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfZ2V0X2ludDMyIChwUmF3ZGF0YSs5KSk7CisKKy8qICAgIGlmICghaVJldGNvZGUpCisgICAgICBpUmV0Y29kZSA9IG1uZ19wcm9jZXNzX2Rpc3BsYXlfbW92ZSAocERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2dldF91aW50MTYgKHBSYXdkYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfZ2V0X3VpbnQxNiAocFJhd2RhdGErMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwUmF3ZGF0YSs0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfZ2V0X2ludDMyIChwUmF3ZGF0YSs1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfZ2V0X2ludDMyIChwUmF3ZGF0YSs5KSk7ICovCisKKyAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICByZXR1cm4gaVJldGNvZGU7CisKKyAgfQorI2VuZGlmIC8qIE1OR19TVVBQT1JUX0RJU1BMQVkgKi8KKworI2lmZGVmIE1OR19TVE9SRV9DSFVOS1MKKyAgaWYgKHBEYXRhLT5iU3RvcmVjaHVua3MpCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0aWFsaXplIHN0b3JhZ2UgKi8KKyAgICBtbmdfcmV0Y29kZSBpUmV0Y29kZSA9ICgobW5nX2NodW5rX2hlYWRlcnApcEhlYWRlciktPmZDcmVhdGUgKHBEYXRhLCBwSGVhZGVyLCBwcENodW5rKTsKKworICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlIHRoZSBmaWVsZHMgKi8KKyAgICAoKG1uZ19tb3ZlcCkqcHBDaHVuayktPmlGaXJzdGlkICA9IG1uZ19nZXRfdWludDE2IChwUmF3ZGF0YSk7CisgICAgKChtbmdfbW92ZXApKnBwQ2h1bmspLT5pTGFzdGlkICAgPSBtbmdfZ2V0X3VpbnQxNiAocFJhd2RhdGErMik7CisgICAgKChtbmdfbW92ZXApKnBwQ2h1bmspLT5pTW92ZXR5cGUgPSAqKHBSYXdkYXRhKzQpOworICAgICgobW5nX21vdmVwKSpwcENodW5rKS0+aU1vdmV4ICAgID0gbW5nX2dldF9pbnQzMiAocFJhd2RhdGErNSk7CisgICAgKChtbmdfbW92ZXApKnBwQ2h1bmspLT5pTW92ZXkgICAgPSBtbmdfZ2V0X2ludDMyIChwUmF3ZGF0YSs5KTsKKyAgfQorI2VuZGlmIC8qIE1OR19TVE9SRV9DSFVOS1MgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9SRUFEX01PVkUsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOyAgICAgICAgICAgICAgICAgIC8qIGRvbmUgKi8KK30KKyNlbmRpZgorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfQ0xJUAorUkVBRF9DSFVOSyAobW5nX3JlYWRfY2xpcCkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVBRF9DTElQLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKCFwRGF0YS0+Ykhhc01IRFIpICAgICAgICAgICAgICAgIC8qIHNlcXVlbmNlIGNoZWNrcyAqLworICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19TRVFVRU5DRUVSUk9SKTsKKworI2lmZGVmIE1OR19JTkNMVURFX0pORworICBpZiAoKHBEYXRhLT5iSGFzSUhEUikgfHwgKHBEYXRhLT5iSGFzQkFTSSkgfHwgKHBEYXRhLT5iSGFzREhEUikgfHwgKHBEYXRhLT5iSGFzSkhEUikpCisjZWxzZQorICBpZiAoKHBEYXRhLT5iSGFzSUhEUikgfHwgKHBEYXRhLT5iSGFzQkFTSSkgfHwgKHBEYXRhLT5iSGFzREhEUikpCisjZW5kaWYKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfU0VRVUVOQ0VFUlJPUik7CisKKyAgaWYgKGlSYXdsZW4gIT0gMjEpICAgICAgICAgICAgICAgICAgIC8qIGNoZWNrIHRoZSBsZW5ndGggKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRExFTkdUSCk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCisgIHsKKyAgICBtbmdfcmV0Y29kZSBpUmV0Y29kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSBhIENMSVAgYW5pbWF0aW9uIG9iamVjdCAqLworICAgIGlSZXRjb2RlID0gbW5nX2NyZWF0ZV9hbmlfY2xpcCAocERhdGEsIG1uZ19nZXRfdWludDE2IChwUmF3ZGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2dldF91aW50MTYgKHBSYXdkYXRhKzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocFJhd2RhdGErNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2dldF9pbnQzMiAocFJhd2RhdGErNSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2dldF9pbnQzMiAocFJhd2RhdGErOSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2dldF9pbnQzMiAocFJhd2RhdGErMTMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19nZXRfaW50MzIgKHBSYXdkYXRhKzE3KSk7CisKKy8qICAgIGlmICghaVJldGNvZGUpCisgICAgICBpUmV0Y29kZSA9IG1uZ19wcm9jZXNzX2Rpc3BsYXlfY2xpcCAocERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2dldF91aW50MTYgKHBSYXdkYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfZ2V0X3VpbnQxNiAocFJhd2RhdGErMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwUmF3ZGF0YSs0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfZ2V0X2ludDMyIChwUmF3ZGF0YSs1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfZ2V0X2ludDMyIChwUmF3ZGF0YSs5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfZ2V0X2ludDMyIChwUmF3ZGF0YSsxMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2dldF9pbnQzMiAocFJhd2RhdGErMTcpKTsgKi8KKworICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKworICB9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfRElTUExBWSAqLworCisjaWZkZWYgTU5HX1NUT1JFX0NIVU5LUworICBpZiAocERhdGEtPmJTdG9yZWNodW5rcykKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpemUgc3RvcmFnZSAqLworICAgIG1uZ19yZXRjb2RlIGlSZXRjb2RlID0gKChtbmdfY2h1bmtfaGVhZGVycClwSGVhZGVyKS0+ZkNyZWF0ZSAocERhdGEsIHBIZWFkZXIsIHBwQ2h1bmspOworCisgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgcmV0dXJuIGlSZXRjb2RlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmUgdGhlIGZpZWxkcyAqLworICAgICgobW5nX2NsaXBwKSpwcENodW5rKS0+aUZpcnN0aWQgID0gbW5nX2dldF91aW50MTYgKHBSYXdkYXRhKTsKKyAgICAoKG1uZ19jbGlwcCkqcHBDaHVuayktPmlMYXN0aWQgICA9IG1uZ19nZXRfdWludDE2IChwUmF3ZGF0YSsyKTsKKyAgICAoKG1uZ19jbGlwcCkqcHBDaHVuayktPmlDbGlwdHlwZSA9ICoocFJhd2RhdGErNCk7CisgICAgKChtbmdfY2xpcHApKnBwQ2h1bmspLT5pQ2xpcGwgICAgPSBtbmdfZ2V0X2ludDMyIChwUmF3ZGF0YSs1KTsKKyAgICAoKG1uZ19jbGlwcCkqcHBDaHVuayktPmlDbGlwciAgICA9IG1uZ19nZXRfaW50MzIgKHBSYXdkYXRhKzkpOworICAgICgobW5nX2NsaXBwKSpwcENodW5rKS0+aUNsaXB0ICAgID0gbW5nX2dldF9pbnQzMiAocFJhd2RhdGErMTMpOworICAgICgobW5nX2NsaXBwKSpwcENodW5rKS0+aUNsaXBiICAgID0gbW5nX2dldF9pbnQzMiAocFJhd2RhdGErMTcpOworICB9CisjZW5kaWYgLyogTU5HX1NUT1JFX0NIVU5LUyAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1JFQURfQ0xJUCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7ICAgICAgICAgICAgICAgICAgLyogZG9uZSAqLworfQorI2VuZGlmCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19TSE9XCitSRUFEX0NIVU5LIChtbmdfcmVhZF9zaG93KQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9SRUFEX1NIT1csIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAoIXBEYXRhLT5iSGFzTUhEUikgICAgICAgICAgICAgICAgLyogc2VxdWVuY2UgY2hlY2tzICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1NFUVVFTkNFRVJST1IpOworCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisgIGlmICgocERhdGEtPmJIYXNJSERSKSB8fCAocERhdGEtPmJIYXNCQVNJKSB8fCAocERhdGEtPmJIYXNESERSKSB8fCAocERhdGEtPmJIYXNKSERSKSkKKyNlbHNlCisgIGlmICgocERhdGEtPmJIYXNJSERSKSB8fCAocERhdGEtPmJIYXNCQVNJKSB8fCAocERhdGEtPmJIYXNESERSKSkKKyNlbmRpZgorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19TRVFVRU5DRUVSUk9SKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoZWNrIHRoZSBsZW5ndGggKi8KKyAgaWYgKChpUmF3bGVuICE9IDApICYmIChpUmF3bGVuICE9IDIpICYmIChpUmF3bGVuICE9IDQpICYmIChpUmF3bGVuICE9IDUpKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElETEVOR1RIKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX0RJU1BMQVkKKyAgeworICAgIG1uZ19yZXRjb2RlIGlSZXRjb2RlOworCisgICAgaWYgKGlSYXdsZW4pICAgICAgICAgICAgICAgICAgICAgICAvKiBkZXRlcm1pbmUgcGFyYW1ldGVycyBpZiBhbnkgKi8KKyAgICB7CisgICAgICBwRGF0YS0+aVNIT1dmcm9taWQgPSBtbmdfZ2V0X3VpbnQxNiAocFJhd2RhdGEpOworCisgICAgICBpZiAoaVJhd2xlbiA+IDIpCisgICAgICAgIHBEYXRhLT5pU0hPV3RvaWQgPSBtbmdfZ2V0X3VpbnQxNiAocFJhd2RhdGErMik7CisgICAgICBlbHNlCisgICAgICAgIHBEYXRhLT5pU0hPV3RvaWQgPSBwRGF0YS0+aVNIT1dmcm9taWQ7CisKKyAgICAgIGlmIChpUmF3bGVuID4gNCkKKyAgICAgICAgcERhdGEtPmlTSE9XbW9kZSA9ICoocFJhd2RhdGErNCk7CisgICAgICBlbHNlCisgICAgICAgIHBEYXRhLT5pU0hPV21vZGUgPSAwOworICAgIH0KKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVzZSBkZWZhdWx0cyB0aGVuICovCisgICAgeworICAgICAgcERhdGEtPmlTSE9XbW9kZSAgID0gMjsKKyAgICAgIHBEYXRhLT5pU0hPV2Zyb21pZCA9IDE7CisgICAgICBwRGF0YS0+aVNIT1d0b2lkICAgPSA2NTUzNTsKKyAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgYSBTSE9XIGFuaW1hdGlvbiBvYmplY3QgKi8KKyAgICBpUmV0Y29kZSA9IG1uZ19jcmVhdGVfYW5pX3Nob3cgKHBEYXRhLCBwRGF0YS0+aVNIT1dmcm9taWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aVNIT1d0b2lkLCBwRGF0YS0+aVNIT1dtb2RlKTsKKworICAgIGlmICghaVJldGNvZGUpCisgICAgICBpUmV0Y29kZSA9IG1uZ19wcm9jZXNzX2Rpc3BsYXlfc2hvdyAocERhdGEpOworCisgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgcmV0dXJuIGlSZXRjb2RlOworCisgIH0KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisKKyNpZmRlZiBNTkdfU1RPUkVfQ0hVTktTCisgIGlmIChwRGF0YS0+YlN0b3JlY2h1bmtzKQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdGlhbGl6ZSBzdG9yYWdlICovCisgICAgbW5nX3JldGNvZGUgaVJldGNvZGUgPSAoKG1uZ19jaHVua19oZWFkZXJwKXBIZWFkZXIpLT5mQ3JlYXRlIChwRGF0YSwgcEhlYWRlciwgcHBDaHVuayk7CisKKyAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZSB0aGUgZmllbGRzICovCisgICAgKChtbmdfc2hvd3ApKnBwQ2h1bmspLT5iRW1wdHkgICAgICA9IChtbmdfYm9vbCkoaVJhd2xlbiA9PSAwKTsKKworICAgIGlmIChpUmF3bGVuKQorICAgIHsKKyAgICAgICgobW5nX3Nob3dwKSpwcENodW5rKS0+aUZpcnN0aWQgID0gbW5nX2dldF91aW50MTYgKHBSYXdkYXRhKTsKKworICAgICAgaWYgKGlSYXdsZW4gPiAyKQorICAgICAgICAoKG1uZ19zaG93cCkqcHBDaHVuayktPmlMYXN0aWQgPSBtbmdfZ2V0X3VpbnQxNiAocFJhd2RhdGErMik7CisgICAgICBlbHNlCisgICAgICAgICgobW5nX3Nob3dwKSpwcENodW5rKS0+aUxhc3RpZCA9ICgobW5nX3Nob3dwKSpwcENodW5rKS0+aUZpcnN0aWQ7CisKKyAgICAgIGlmIChpUmF3bGVuID4gNCkKKyAgICAgICAgKChtbmdfc2hvd3ApKnBwQ2h1bmspLT5pTW9kZSAgID0gKihwUmF3ZGF0YSs0KTsKKyAgICB9CisgIH0KKyNlbmRpZiAvKiBNTkdfU1RPUkVfQ0hVTktTICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVBRF9TSE9XLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsgICAgICAgICAgICAgICAgICAvKiBkb25lICovCit9CisjZW5kaWYKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX1RFUk0KK1JFQURfQ0hVTksgKG1uZ19yZWFkX3Rlcm0pCit7CisgIG1uZ191aW50OCAgIGlUZXJtYWN0aW9uOworICBtbmdfdWludDggICBpSXRlcmFjdGlvbiA9IDA7CisgIG1uZ191aW50MzIgIGlEZWxheSAgICAgID0gMDsKKyAgbW5nX3VpbnQzMiAgaUl0ZXJtYXggICAgPSAwOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1JFQURfVEVSTSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmICghcERhdGEtPmJIYXNNSERSKSAgICAgICAgICAgICAgICAvKiBzZXF1ZW5jZSBjaGVja3MgKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfU0VRVUVOQ0VFUlJPUik7CisKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgaWYgKChwRGF0YS0+Ykhhc0lIRFIpIHx8IChwRGF0YS0+Ykhhc0JBU0kpIHx8IChwRGF0YS0+Ykhhc0RIRFIpIHx8IChwRGF0YS0+Ykhhc0pIRFIpKQorI2Vsc2UKKyAgaWYgKChwRGF0YS0+Ykhhc0lIRFIpIHx8IChwRGF0YS0+Ykhhc0JBU0kpIHx8IChwRGF0YS0+Ykhhc0RIRFIpKQorI2VuZGlmCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1NFUVVFTkNFRVJST1IpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaG91bGQgYmUgYmVoaW5kIE1IRFIgb3IgU0FWRSAhISAqLworICBpZiAoKCFwRGF0YS0+Ykhhc1NBVkUpICYmIChwRGF0YS0+aUNodW5rc2VxID4gMikpCisgIHsKKyAgICBwRGF0YS0+Yk1pc3BsYWNlZFRFUk0gPSBNTkdfVFJVRTsgIC8qIGluZGljYXRlIHdlIGZvdW5kIGEgbWlzcGxhY2VkIFRFUk0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCBzZW5kIGEgd2FybmluZyBzaWduYWwhISEgKi8KKyAgICBNTkdfV0FSTklORyAocERhdGEsIE1OR19TRVFVRU5DRUVSUk9SKTsKKyAgfQorCisgIGlmIChwRGF0YS0+Ykhhc0xPT1ApICAgICAgICAgICAgICAgICAvKiBubyB3YXksIGpvc2UhICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1NFUVVFTkNFRVJST1IpOworCisgIGlmIChwRGF0YS0+Ykhhc1RFUk0pICAgICAgICAgICAgICAgICAvKiBvbmx5IDEgYWxsb3dlZCEgKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfTVVMVElQTEVFUlJPUik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGVjayB0aGUgbGVuZ3RoICovCisgIGlmICgoaVJhd2xlbiAhPSAxKSAmJiAoaVJhd2xlbiAhPSAxMCkpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURMRU5HVEgpOworCisgIHBEYXRhLT5iSGFzVEVSTSA9IE1OR19UUlVFOworCisgIGlUZXJtYWN0aW9uID0gKnBSYXdkYXRhOyAgICAgICAgICAgICAvKiBnZXQgdGhlIGZpZWxkcyAqLworCisgIGlmIChpUmF3bGVuID4gMSkKKyAgeworICAgIGlJdGVyYWN0aW9uID0gKihwUmF3ZGF0YSsxKTsKKyAgICBpRGVsYXkgICAgICA9IG1uZ19nZXRfdWludDMyIChwUmF3ZGF0YSsyKTsKKyAgICBpSXRlcm1heCAgICA9IG1uZ19nZXRfdWludDMyIChwUmF3ZGF0YSs2KTsKKyAgfQorCisgIGlmIChwRGF0YS0+ZlByb2Nlc3N0ZXJtKSAgICAgICAgICAgICAvKiBpbmZvcm0gdGhlIGFwcCA/ICovCisgICAgaWYgKCFwRGF0YS0+ZlByb2Nlc3N0ZXJtICgoKG1uZ19oYW5kbGUpcERhdGEpLCBpVGVybWFjdGlvbiwgaUl0ZXJhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpRGVsYXksIGlJdGVybWF4KSkKKyAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19BUFBNSVNDRVJST1IpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIHRoZSBURVJNIGFuaS1vYmplY3QgKi8KKyAgICBtbmdfcmV0Y29kZSBpUmV0Y29kZSA9IG1uZ19jcmVhdGVfYW5pX3Rlcm0gKHBEYXRhLCBpVGVybWFjdGlvbiwgaUl0ZXJhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpRGVsYXksIGlJdGVybWF4KTsKKworICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNhdmUgZm9yIGZ1dHVyZSByZWZlcmVuY2UgKi8KKyAgICBwRGF0YS0+cFRlcm1hbmlvYmogPSBwRGF0YS0+cExhc3RhbmlvYmo7CisgIH0KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisKKyNpZmRlZiBNTkdfU1RPUkVfQ0hVTktTCisgIGlmIChwRGF0YS0+YlN0b3JlY2h1bmtzKQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdGlhbGl6ZSBzdG9yYWdlICovCisgICAgbW5nX3JldGNvZGUgaVJldGNvZGUgPSAoKG1uZ19jaHVua19oZWFkZXJwKXBIZWFkZXIpLT5mQ3JlYXRlIChwRGF0YSwgcEhlYWRlciwgcHBDaHVuayk7CisKKyAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZSB0aGUgZmllbGRzICovCisgICAgKChtbmdfdGVybXApKnBwQ2h1bmspLT5pVGVybWFjdGlvbiA9IGlUZXJtYWN0aW9uOworICAgICgobW5nX3Rlcm1wKSpwcENodW5rKS0+aUl0ZXJhY3Rpb24gPSBpSXRlcmFjdGlvbjsKKyAgICAoKG1uZ190ZXJtcCkqcHBDaHVuayktPmlEZWxheSAgICAgID0gaURlbGF5OworICAgICgobW5nX3Rlcm1wKSpwcENodW5rKS0+aUl0ZXJtYXggICAgPSBpSXRlcm1heDsKKyAgfQorI2VuZGlmIC8qIE1OR19TVE9SRV9DSFVOS1MgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9SRUFEX1RFUk0sIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOyAgICAgICAgICAgICAgICAgIC8qIGRvbmUgKi8KK30KKyNlbmRpZgorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfU0FWRQorUkVBRF9DSFVOSyAobW5nX3JlYWRfc2F2ZSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVBRF9TQVZFLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXF1ZW5jZSBjaGVja3MgKi8KKyAgaWYgKCghcERhdGEtPmJIYXNNSERSKSB8fCAocERhdGEtPmJIYXNTQVZFKSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfU0VRVUVOQ0VFUlJPUik7CisKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgaWYgKChwRGF0YS0+Ykhhc0lIRFIpIHx8IChwRGF0YS0+Ykhhc0JBU0kpIHx8IChwRGF0YS0+Ykhhc0RIRFIpIHx8IChwRGF0YS0+Ykhhc0pIRFIpKQorI2Vsc2UKKyAgaWYgKChwRGF0YS0+Ykhhc0lIRFIpIHx8IChwRGF0YS0+Ykhhc0JBU0kpIHx8IChwRGF0YS0+Ykhhc0RIRFIpKQorI2VuZGlmCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1NFUVVFTkNFRVJST1IpOworCisgIHBEYXRhLT5iSGFzU0FWRSA9IE1OR19UUlVFOworCisgIGlmIChwRGF0YS0+ZlByb2Nlc3NzYXZlKSAgICAgICAgICAgICAvKiBpbmZvcm0gdGhlIGFwcGxpY2F0aW9uID8gKi8KKyAgeworICAgIG1uZ19ib29sIGJPa2UgPSBwRGF0YS0+ZlByb2Nlc3NzYXZlICgobW5nX2hhbmRsZSlwRGF0YSk7CisKKyAgICBpZiAoIWJPa2UpCisgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfQVBQTUlTQ0VSUk9SKTsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorICB7CisgICAgbW5nX3JldGNvZGUgaVJldGNvZGU7CisKKworICAgIC8qIFRPRE86IHNvbWV0aGluZyB3aXRoIHRoZSBwYXJhbWV0ZXJzICovCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIGEgU0FWRSBhbmltYXRpb24gb2JqZWN0ICovCisgICAgaVJldGNvZGUgPSBtbmdfY3JlYXRlX2FuaV9zYXZlIChwRGF0YSk7CisKKyAgICBpZiAoIWlSZXRjb2RlKQorICAgICAgaVJldGNvZGUgPSBtbmdfcHJvY2Vzc19kaXNwbGF5X3NhdmUgKHBEYXRhKTsKKworICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICAgIAorICB9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfRElTUExBWSAqLworCisjaWZkZWYgTU5HX1NUT1JFX0NIVU5LUworICBpZiAocERhdGEtPmJTdG9yZWNodW5rcykKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpemUgc3RvcmFnZSAqLworICAgIG1uZ19yZXRjb2RlIGlSZXRjb2RlID0gKChtbmdfY2h1bmtfaGVhZGVycClwSGVhZGVyKS0+ZkNyZWF0ZSAocERhdGEsIHBIZWFkZXIsIHBwQ2h1bmspOworCisgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgcmV0dXJuIGlSZXRjb2RlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmUgdGhlIGZpZWxkcyAqLworICAgICgobW5nX3NhdmVwKSpwcENodW5rKS0+YkVtcHR5ID0gKG1uZ19ib29sKShpUmF3bGVuID09IDApOworCisgICAgaWYgKGlSYXdsZW4pICAgICAgICAgICAgICAgICAgICAgICAvKiBub3QgZW1wdHkgPyAqLworICAgIHsKKyAgICAgIG1uZ191aW50OCAgICAgICBpT3R5cGUgPSAqcFJhd2RhdGE7CisgICAgICBtbmdfdWludDggICAgICAgaUV0eXBlOworICAgICAgbW5nX3VpbnQzMiAgICAgIGlDb3VudCA9IDA7CisgICAgICBtbmdfdWludDhwICAgICAgcFRlbXA7CisgICAgICBtbmdfdWludDhwICAgICAgcE51bGw7CisgICAgICBtbmdfdWludDMyICAgICAgaUxlbjsKKyAgICAgIG1uZ191aW50MzIgICAgICBpT2Zmc2V0WzJdOworICAgICAgbW5nX3VpbnQzMiAgICAgIGlTdGFydHRpbWVbMl07CisgICAgICBtbmdfdWludDMyICAgICAgaUZyYW1lbnI7CisgICAgICBtbmdfdWludDMyICAgICAgaUxheWVybnI7CisgICAgICBtbmdfdWludDMyICAgICAgaVg7CisgICAgICBtbmdfc2F2ZV9lbnRyeXAgcEVudHJ5ID0gTU5HX05VTEw7CisgICAgICBtbmdfdWludDMyICAgICAgaU5hbWVzaXplOworCisgICAgICBpZiAoKGlPdHlwZSAhPSA0KSAmJiAoaU90eXBlICE9IDgpKQorICAgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WT0ZGU0VUU0laRSk7CisKKyAgICAgICgobW5nX3NhdmVwKSpwcENodW5rKS0+aU9mZnNldHR5cGUgPSBpT3R5cGU7CisKKyAgICAgIGZvciAoaVggPSAwOyBpWCA8IDI7IGlYKyspICAgICAgIC8qIGRvIHRoaXMgdHdpY2UgdG8gZ2V0IHRoZSBjb3VudCBmaXJzdCAhICovCisgICAgICB7CisgICAgICAgIHBUZW1wID0gcFJhd2RhdGEgKyAxOworICAgICAgICBpTGVuICA9IGlSYXdsZW4gIC0gMTsKKworICAgICAgICBpZiAoaVgpICAgICAgICAgICAgICAgICAgICAgICAgLyogc2Vjb25kIHJ1biA/ICovCisgICAgICAgIHsKKyAgICAgICAgICBNTkdfQUxMT0MgKHBEYXRhLCBwRW50cnksIChpQ291bnQgKiBzaXplb2YgKG1uZ19zYXZlX2VudHJ5KSkpOworCisgICAgICAgICAgKChtbmdfc2F2ZXApKnBwQ2h1bmspLT5pQ291bnQgICA9IGlDb3VudDsKKyAgICAgICAgICAoKG1uZ19zYXZlcCkqcHBDaHVuayktPnBFbnRyaWVzID0gcEVudHJ5OworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKGlMZW4pICAgICAgICAgICAgICAgICAgIC8qIGFueXRoaW5nIGxlZnQgPyAqLworICAgICAgICB7CisgICAgICAgICAgaUV0eXBlID0gKnBUZW1wOyAgICAgICAgICAgICAvKiBlbnRyeXR5cGUgKi8KKworICAgICAgICAgIGlmICgoaUV0eXBlICE9IDApICYmIChpRXR5cGUgIT0gMSkgJiYgKGlFdHlwZSAhPSAyKSAmJiAoaUV0eXBlICE9IDMpKQorICAgICAgICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkVOVFJZVFlQRSk7CisKKyAgICAgICAgICBwVGVtcCsrOworCisgICAgICAgICAgaWYgKGlFdHlwZSA+IDEpCisgICAgICAgICAgeworICAgICAgICAgICAgaU9mZnNldCAgICBbMF0gPSAwOworICAgICAgICAgICAgaU9mZnNldCAgICBbMV0gPSAwOworICAgICAgICAgICAgaVN0YXJ0dGltZSBbMF0gPSAwOworICAgICAgICAgICAgaVN0YXJ0dGltZSBbMV0gPSAwOworICAgICAgICAgICAgaUxheWVybnIgICAgICAgPSAwOworICAgICAgICAgICAgaUZyYW1lbnIgICAgICAgPSAwOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKGlPdHlwZSA9PSA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpT2Zmc2V0IFswXSA9IDA7CisgICAgICAgICAgICAgIGlPZmZzZXQgWzFdID0gbW5nX2dldF91aW50MzIgKHBUZW1wKTsKKworICAgICAgICAgICAgICBwVGVtcCArPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpT2Zmc2V0IFswXSA9IG1uZ19nZXRfdWludDMyIChwVGVtcCk7CisgICAgICAgICAgICAgIGlPZmZzZXQgWzFdID0gbW5nX2dldF91aW50MzIgKHBUZW1wKzQpOworCisgICAgICAgICAgICAgIHBUZW1wICs9IDg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpRXR5cGUgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpU3RhcnR0aW1lIFswXSA9IDA7CisgICAgICAgICAgICAgIGlTdGFydHRpbWUgWzFdID0gMDsKKyAgICAgICAgICAgICAgaUxheWVybnIgICAgICAgPSAwOworICAgICAgICAgICAgICBpRnJhbWVuciAgICAgICA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChpT3R5cGUgPT0gNCkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlTdGFydHRpbWUgWzBdID0gMDsKKyAgICAgICAgICAgICAgICBpU3RhcnR0aW1lIFsxXSA9IG1uZ19nZXRfdWludDMyIChwVGVtcCswKTsKKyAgICAgICAgICAgICAgICBpTGF5ZXJuciAgICAgICA9IG1uZ19nZXRfdWludDMyIChwVGVtcCs0KTsKKyAgICAgICAgICAgICAgICBpRnJhbWVuciAgICAgICA9IG1uZ19nZXRfdWludDMyIChwVGVtcCs4KTsKKworICAgICAgICAgICAgICAgIHBUZW1wICs9IDEyOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlTdGFydHRpbWUgWzBdID0gbW5nX2dldF91aW50MzIgKHBUZW1wKzApOworICAgICAgICAgICAgICAgIGlTdGFydHRpbWUgWzFdID0gbW5nX2dldF91aW50MzIgKHBUZW1wKzQpOworICAgICAgICAgICAgICAgIGlMYXllcm5yICAgICAgID0gbW5nX2dldF91aW50MzIgKHBUZW1wKzgpOworICAgICAgICAgICAgICAgIGlGcmFtZW5yICAgICAgID0gbW5nX2dldF91aW50MzIgKHBUZW1wKzEyKTsKKworICAgICAgICAgICAgICAgIHBUZW1wICs9IDE2OworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgcE51bGwgPSBmaW5kX251bGwgKHBUZW1wKTsgICAvKiBnZXQgdGhlIG5hbWUgbGVuZ3RoICovCisKKyAgICAgICAgICBpZiAoKHBOdWxsIC0gcFJhd2RhdGEpID4gKG1uZ19pbnQzMilpUmF3bGVuKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGlOYW1lc2l6ZSA9IGlMZW47ICAgICAgICAgIC8qIG5vIG51bGwgZm91bmQ7IHNvIGVuZCBvZiBTQVZFICovCisgICAgICAgICAgICBpTGVuICAgICAgPSAwOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgaU5hbWVzaXplID0gcE51bGwgLSBwVGVtcDsgLyogc2hvdWxkIGJlIGFub3RoZXIgZW50cnkgKi8KKyAgICAgICAgICAgIGlMZW4gICAgIC09IGlOYW1lc2l6ZTsKKworICAgICAgICAgICAgaWYgKCFpTGVuKSAgICAgICAgICAgICAgICAgLyogbXVzdCBub3QgZW5kIHdpdGggYSBudWxsICEgKi8KKyAgICAgICAgICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0VORFdJVEhOVUxMKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIXBFbnRyeSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBpQ291bnQrKzsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHBFbnRyeS0+aUVudHJ5dHlwZSAgICAgPSBpRXR5cGU7CisgICAgICAgICAgICBwRW50cnktPmlPZmZzZXQgICAgWzBdID0gaU9mZnNldCAgICBbMF07CisgICAgICAgICAgICBwRW50cnktPmlPZmZzZXQgICAgWzFdID0gaU9mZnNldCAgICBbMV07CisgICAgICAgICAgICBwRW50cnktPmlTdGFydHRpbWUgWzBdID0gaVN0YXJ0dGltZSBbMF07CisgICAgICAgICAgICBwRW50cnktPmlTdGFydHRpbWUgWzFdID0gaVN0YXJ0dGltZSBbMV07CisgICAgICAgICAgICBwRW50cnktPmlMYXllcm5yICAgICAgID0gaUxheWVybnI7CisgICAgICAgICAgICBwRW50cnktPmlGcmFtZW5yICAgICAgID0gaUZyYW1lbnI7CisgICAgICAgICAgICBwRW50cnktPmlOYW1lc2l6ZSAgICAgID0gaU5hbWVzaXplOworCisgICAgICAgICAgICBpZiAoaU5hbWVzaXplKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBNTkdfQUxMT0MgKHBEYXRhLCBwRW50cnktPnpOYW1lLCBpTmFtZXNpemUrMSk7CisgICAgICAgICAgICAgIE1OR19DT1BZIChwRW50cnktPnpOYW1lLCBwVGVtcCwgaU5hbWVzaXplKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcEVudHJ5Kys7CisgICAgICAgICAgfQorCisgICAgICAgICAgcFRlbXAgKz0gaU5hbWVzaXplOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisjZW5kaWYgLyogTU5HX1NUT1JFX0NIVU5LUyAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1JFQURfU0FWRSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7ICAgICAgICAgICAgICAgICAgLyogZG9uZSAqLworfQorI2VuZGlmCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19TRUVLCitSRUFEX0NIVU5LIChtbmdfcmVhZF9zZWVrKQoreworICBtbmdfcmV0Y29kZSBpUmV0Y29kZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9SRUFEX1NFRUssIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNlcXVlbmNlIGNoZWNrcyAqLworICBpZiAoKCFwRGF0YS0+Ykhhc01IRFIpIHx8ICghcERhdGEtPmJIYXNTQVZFKSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfU0VRVUVOQ0VFUlJPUik7CisKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgaWYgKChwRGF0YS0+Ykhhc0lIRFIpIHx8IChwRGF0YS0+Ykhhc0JBU0kpIHx8IChwRGF0YS0+Ykhhc0RIRFIpIHx8IChwRGF0YS0+Ykhhc0pIRFIpKQorI2Vsc2UKKyAgaWYgKChwRGF0YS0+Ykhhc0lIRFIpIHx8IChwRGF0YS0+Ykhhc0JBU0kpIHx8IChwRGF0YS0+Ykhhc0RIRFIpKQorI2VuZGlmCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1NFUVVFTkNFRVJST1IpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIGEgU0VFSyBhbmltYXRpb24gb2JqZWN0ICovCisgIGlSZXRjb2RlID0gbW5nX2NyZWF0ZV9hbmlfc2VlayAocERhdGEsIGlSYXdsZW4sIChtbmdfcGNoYXIpcFJhd2RhdGEpOworCisgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICAKKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisKKyAgaWYgKHBEYXRhLT5mUHJvY2Vzc3NlZWspICAgICAgICAgICAgIC8qIGluZm9ybSB0aGUgYXBwID8gKi8KKyAgeworICAgIG1uZ19ib29sICBiT2tlOworICAgIG1uZ19wY2hhciB6TmFtZTsKKworICAgIE1OR19BTExPQyAocERhdGEsIHpOYW1lLCBpUmF3bGVuICsgMSk7CisKKyAgICBpZiAoaVJhd2xlbikKKyAgICAgIE1OR19DT1BZICh6TmFtZSwgcFJhd2RhdGEsIGlSYXdsZW4pOworCisgICAgYk9rZSA9IHBEYXRhLT5mUHJvY2Vzc3NlZWsgKChtbmdfaGFuZGxlKXBEYXRhLCB6TmFtZSk7CisKKyAgICBNTkdfRlJFRVggKHBEYXRhLCB6TmFtZSwgaVJhd2xlbiArIDEpOworCisgICAgaWYgKCFiT2tlKQorICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0FQUE1JU0NFUlJPUik7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX0RJU1BMQVkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvIGRpc3BsYXkgcHJvY2Vzc2luZyBvZiB0aGUgU0VFSyAqLworICBpUmV0Y29kZSA9IG1uZ19wcm9jZXNzX2Rpc3BsYXlfc2VlayAocERhdGEpOworCisgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgIHJldHVybiBpUmV0Y29kZTsKKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisKKyNpZmRlZiBNTkdfU1RPUkVfQ0hVTktTCisgIGlmIChwRGF0YS0+YlN0b3JlY2h1bmtzKQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdGlhbGl6ZSBzdG9yYWdlICovCisgICAgbW5nX3JldGNvZGUgaVJldGNvZGUgPSAoKG1uZ19jaHVua19oZWFkZXJwKXBIZWFkZXIpLT5mQ3JlYXRlIChwRGF0YSwgcEhlYWRlciwgcHBDaHVuayk7CisKKyAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZSB0aGUgZmllbGRzICovCisgICAgKChtbmdfc2Vla3ApKnBwQ2h1bmspLT5pTmFtZXNpemUgPSBpUmF3bGVuOworCisgICAgaWYgKGlSYXdsZW4pCisgICAgeworICAgICAgTU5HX0FMTE9DIChwRGF0YSwgKChtbmdfc2Vla3ApKnBwQ2h1bmspLT56TmFtZSwgaVJhd2xlbisxKTsKKyAgICAgIE1OR19DT1BZICgoKG1uZ19zZWVrcCkqcHBDaHVuayktPnpOYW1lLCBwUmF3ZGF0YSwgaVJhd2xlbik7CisgICAgfQorICB9CisjZW5kaWYgLyogTU5HX1NUT1JFX0NIVU5LUyAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1JFQURfU0VFSywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7ICAgICAgICAgICAgICAgICAgLyogZG9uZSAqLworfQorI2VuZGlmCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19lWFBJCitSRUFEX0NIVU5LIChtbmdfcmVhZF9leHBpKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9SRUFEX0VYUEksIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAoIXBEYXRhLT5iSGFzTUhEUikgICAgICAgICAgICAgICAgLyogc2VxdWVuY2UgY2hlY2tzICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1NFUVVFTkNFRVJST1IpOworCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisgIGlmICgocERhdGEtPmJIYXNJSERSKSB8fCAocERhdGEtPmJIYXNCQVNJKSB8fCAocERhdGEtPmJIYXNESERSKSB8fCAocERhdGEtPmJIYXNKSERSKSkKKyNlbHNlCisgIGlmICgocERhdGEtPmJIYXNJSERSKSB8fCAocERhdGEtPmJIYXNCQVNJKSB8fCAocERhdGEtPmJIYXNESERSKSkKKyNlbmRpZgorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19TRVFVRU5DRUVSUk9SKTsKKworICBpZiAoaVJhd2xlbiA8IDMpICAgICAgICAgICAgICAgICAgICAgLyogY2hlY2sgdGhlIGxlbmd0aCAqLworICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElETEVOR1RIKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX0RJU1BMQVkKKyAgeworCisKKyAgICAvKiBUT0RPOiBzb21ldGhpbmcgISEhICovCisKKworICB9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfRElTUExBWSAqLworCisjaWZkZWYgTU5HX1NUT1JFX0NIVU5LUworICBpZiAocERhdGEtPmJTdG9yZWNodW5rcykKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpemUgc3RvcmFnZSAqLworICAgIG1uZ19yZXRjb2RlIGlSZXRjb2RlID0gKChtbmdfY2h1bmtfaGVhZGVycClwSGVhZGVyKS0+ZkNyZWF0ZSAocERhdGEsIHBIZWFkZXIsIHBwQ2h1bmspOworCisgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgcmV0dXJuIGlSZXRjb2RlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmUgdGhlIGZpZWxkcyAqLworICAgICgobW5nX2V4cGlwKSpwcENodW5rKS0+aVNuYXBzaG90aWQgPSBtbmdfZ2V0X3VpbnQxNiAocFJhd2RhdGEpOworICAgICgobW5nX2V4cGlwKSpwcENodW5rKS0+aU5hbWVzaXplICAgPSBpUmF3bGVuIC0gMjsKKworICAgIGlmICgoKG1uZ19leHBpcCkqcHBDaHVuayktPmlOYW1lc2l6ZSkKKyAgICB7CisgICAgICBNTkdfQUxMT0MgKHBEYXRhLCAoKG1uZ19leHBpcCkqcHBDaHVuayktPnpOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgKChtbmdfZXhwaXApKnBwQ2h1bmspLT5pTmFtZXNpemUgKyAxKTsKKyAgICAgIE1OR19DT1BZICgoKG1uZ19leHBpcCkqcHBDaHVuayktPnpOYW1lLCBwUmF3ZGF0YSsyLAorICAgICAgICAgICAgICAgICgobW5nX2V4cGlwKSpwcENodW5rKS0+aU5hbWVzaXplKTsKKyAgICB9CisgIH0KKyNlbmRpZiAvKiBNTkdfU1RPUkVfQ0hVTktTICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVBRF9FWFBJLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsgICAgICAgICAgICAgICAgICAvKiBkb25lICovCit9CisjZW5kaWYKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX2ZQUkkKK1JFQURfQ0hVTksgKG1uZ19yZWFkX2ZwcmkpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1JFQURfRlBSSSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmICghcERhdGEtPmJIYXNNSERSKSAgICAgICAgICAgICAgICAvKiBzZXF1ZW5jZSBjaGVja3MgKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfU0VRVUVOQ0VFUlJPUik7CisKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgaWYgKChwRGF0YS0+Ykhhc0lIRFIpIHx8IChwRGF0YS0+Ykhhc0JBU0kpIHx8IChwRGF0YS0+Ykhhc0RIRFIpIHx8IChwRGF0YS0+Ykhhc0pIRFIpKQorI2Vsc2UKKyAgaWYgKChwRGF0YS0+Ykhhc0lIRFIpIHx8IChwRGF0YS0+Ykhhc0JBU0kpIHx8IChwRGF0YS0+Ykhhc0RIRFIpKQorI2VuZGlmCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1NFUVVFTkNFRVJST1IpOworCisgIGlmIChpUmF3bGVuICE9IDIpICAgICAgICAgICAgICAgICAgICAvKiBtdXN0IGJlIHR3byBieXRlcyBsb25nICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURMRU5HVEgpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorICB7CisKKworICAgIC8qIFRPRE86IHNvbWV0aGluZyAhISEgKi8KKworCisgIH0KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisKKyNpZmRlZiBNTkdfU1RPUkVfQ0hVTktTCisgIGlmIChwRGF0YS0+YlN0b3JlY2h1bmtzKQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdGlhbGl6ZSBzdG9yYWdlICovCisgICAgbW5nX3JldGNvZGUgaVJldGNvZGUgPSAoKG1uZ19jaHVua19oZWFkZXJwKXBIZWFkZXIpLT5mQ3JlYXRlIChwRGF0YSwgcEhlYWRlciwgcHBDaHVuayk7CisKKyAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZSB0aGUgZmllbGRzICovCisgICAgKChtbmdfZnByaXApKnBwQ2h1bmspLT5pRGVsdGF0eXBlID0gKnBSYXdkYXRhOworICAgICgobW5nX2ZwcmlwKSpwcENodW5rKS0+aVByaW9yaXR5ICA9ICoocFJhd2RhdGErMSk7CisgIH0KKyNlbmRpZiAvKiBNTkdfU1RPUkVfQ0hVTktTICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVBRF9GUFJJLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsgICAgICAgICAgICAgICAgICAvKiBkb25lICovCit9CisjZW5kaWYKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX25FRUQKK01OR19MT0NBTCBtbmdfYm9vbCBDaGVja0tleXdvcmQgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBLZXl3b3JkKQoreworICBtbmdfY2h1bmtpZCBoYW5kbGVkX2NodW5rcyBbXSA9CisgIHsKKyAgICBNTkdfVUlOVF9CQUNLLCAgICAgICAgICAgICAgICAgICAgIC8qIGtlZXAgaXQgc29ydGVkICEhISEgKi8KKyAgICBNTkdfVUlOVF9CQVNJLAorICAgIE1OR19VSU5UX0NMSVAsCisgICAgTU5HX1VJTlRfQ0xPTiwKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworLyogVE9ETzogICAgTU5HX1VJTlRfREJZSywgICovCisjZW5kaWYKKyAgICBNTkdfVUlOVF9ERUZJLAorI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisgICAgTU5HX1VJTlRfREhEUiwKKyNlbmRpZgorICAgIE1OR19VSU5UX0RJU0MsCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKKy8qIFRPRE86ICAgIE1OR19VSU5UX0RST1AsICAqLworI2VuZGlmCisgICAgTU5HX1VJTlRfRU5ETCwKKyAgICBNTkdfVUlOVF9GUkFNLAorICAgIE1OR19VSU5UX0lEQVQsCisgICAgTU5HX1VJTlRfSUVORCwKKyAgICBNTkdfVUlOVF9JSERSLAorI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisgICAgTU5HX1VJTlRfSUpORywKKyNlbmRpZiAgICAKKyAgICBNTkdfVUlOVF9JUE5HLAorI2VuZGlmCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisgICAgTU5HX1VJTlRfSkRBQSwKKyAgICBNTkdfVUlOVF9KREFULAorICAgIE1OR19VSU5UX0pIRFIsCisvKiBUT0RPOiAgICBNTkdfVUlOVF9KU0VQLCAgKi8KKyAgICBNTkdfVUlOVF9KZEFBLAorI2VuZGlmCisgICAgTU5HX1VJTlRfTE9PUCwKKyAgICBNTkdfVUlOVF9NQUdOLAorICAgIE1OR19VSU5UX01FTkQsCisgICAgTU5HX1VJTlRfTUhEUiwKKyAgICBNTkdfVUlOVF9NT1ZFLAorLyogVE9ETzogICAgTU5HX1VJTlRfT1JEUiwgICovCisgICAgTU5HX1VJTlRfUEFTVCwKKyAgICBNTkdfVUlOVF9QTFRFLAorI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisgICAgTU5HX1VJTlRfUFBMVCwKKyAgICBNTkdfVUlOVF9QUk9NLAorI2VuZGlmCisgICAgTU5HX1VJTlRfU0FWRSwKKyAgICBNTkdfVUlOVF9TRUVLLAorICAgIE1OR19VSU5UX1NIT1csCisgICAgTU5HX1VJTlRfVEVSTSwKKyNpZmRlZiBNTkdfSU5DTFVERV9BTkdfUFJPUE9TQUwKKyAgICBNTkdfVUlOVF9hZEFULAorICAgIE1OR19VSU5UX2FoRFIsCisjZW5kaWYKKyAgICBNTkdfVUlOVF9iS0dELAorICAgIE1OR19VSU5UX2NIUk0sCisvKiBUT0RPOiAgICBNTkdfVUlOVF9lWFBJLCAgKi8KKyAgICBNTkdfVUlOVF9ldk5ULAorLyogVE9ETzogICAgTU5HX1VJTlRfZlBSSSwgICovCisgICAgTU5HX1VJTlRfZ0FNQSwKKy8qIFRPRE86ICAgIE1OR19VSU5UX2hJU1QsICAqLworICAgIE1OR19VSU5UX2lDQ1AsCisgICAgTU5HX1VJTlRfaVRYdCwKKyNpZmRlZiBNTkdfSU5DTFVERV9NUE5HX1BST1BPU0FMCisgICAgTU5HX1VJTlRfbXBORywKKyNlbmRpZgorICAgIE1OR19VSU5UX25FRUQsCisvKiBUT0RPOiAgICBNTkdfVUlOVF9vRkZzLCAgKi8KKy8qIFRPRE86ICAgIE1OR19VSU5UX3BDQUwsICAqLworLyogVE9ETzogICAgTU5HX1VJTlRfcEhZZywgICovCisvKiBUT0RPOiAgICBNTkdfVUlOVF9wSFlzLCAgKi8KKy8qIFRPRE86ICAgIE1OR19VSU5UX3NCSVQsICAqLworLyogVE9ETzogICAgTU5HX1VJTlRfc0NBTCwgICovCisvKiBUT0RPOiAgICBNTkdfVUlOVF9zUExULCAgKi8KKyAgICBNTkdfVUlOVF9zUkdCLAorICAgIE1OR19VSU5UX3RFWHQsCisgICAgTU5HX1VJTlRfdElNRSwKKyAgICBNTkdfVUlOVF90Uk5TLAorICAgIE1OR19VSU5UX3pUWHQsCisgIH07CisKKyAgbW5nX2Jvb2wgYk9rZSA9IE1OR19GQUxTRTsKKworICBpZiAocERhdGEtPmZQcm9jZXNzbmVlZCkgICAgICAgICAgICAgLyogZG9lcyB0aGUgYXBwIGhhbmRsZSBpdCA/ICovCisgICAgYk9rZSA9IHBEYXRhLT5mUHJvY2Vzc25lZWQgKChtbmdfaGFuZGxlKXBEYXRhLCAobW5nX3BjaGFyKXBLZXl3b3JkKTsKKworICBpZiAoIWJPa2UpCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaW5kIHRoZSBrZXl3b3JkIGxlbmd0aCAqLworICAgIG1uZ191aW50OHAgcE51bGwgPSBmaW5kX251bGwgKHBLZXl3b3JkKTsKKworICAgIGlmIChwTnVsbCAtIHBLZXl3b3JkID09IDQpICAgICAgICAgLyogdGVzdCBhIGNodW5rID8gKi8KKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCB0aGUgY2h1bmstaWQgKi8KKyAgICAgIG1uZ19jaHVua2lkIGlDaHVua2lkID0gKCpwS2V5d29yZCAgICAgPDwgMjQpICsgKCoocEtleXdvcmQrMSkgPDwgMTYpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCoocEtleXdvcmQrMikgPDwgIDgpICsgKCoocEtleXdvcmQrMykgICAgICApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYmluYXJ5IHNlYXJjaCB2YXJpYWJsZXMgKi8KKyAgICAgIG1uZ19pbnQzMiAgIGlUb3AsIGlMb3dlciwgaVVwcGVyLCBpTWlkZGxlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGV0ZXJtaW5lIG1heCBpbmRleCBvZiB0YWJsZSAqLworICAgICAgaVRvcCA9IChzaXplb2YgKGhhbmRsZWRfY2h1bmtzKSAvIHNpemVvZiAoaGFuZGxlZF9jaHVua3MgWzBdKSkgLSAxOworCisgICAgICAvKiBiaW5hcnkgc2VhcmNoOyB3aXRoIDUyIGNodW5rcywgd29yc3QtY2FzZSBpcyA3IGNvbXBhcmlzb25zICovCisgICAgICBpTG93ZXIgID0gMDsKKyAgICAgIGlNaWRkbGUgPSBpVG9wID4+IDE7CisgICAgICBpVXBwZXIgID0gaVRvcDsKKworICAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZSBiaW5hcnkgc2VhcmNoIGl0c2VsZiAqLworICAgICAgICB7CisgICAgICAgICAgaWYgKGhhbmRsZWRfY2h1bmtzIFtpTWlkZGxlXSA8IGlDaHVua2lkKQorICAgICAgICAgICAgaUxvd2VyID0gaU1pZGRsZSArIDE7CisgICAgICAgICAgZWxzZSBpZiAoaGFuZGxlZF9jaHVua3MgW2lNaWRkbGVdID4gaUNodW5raWQpCisgICAgICAgICAgICBpVXBwZXIgPSBpTWlkZGxlIC0gMTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgYk9rZSA9IE1OR19UUlVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgICAgaU1pZGRsZSA9IChpTG93ZXIgKyBpVXBwZXIpID4+IDE7CisgICAgICAgIH0KKyAgICAgIHdoaWxlIChpTG93ZXIgPD0gaVVwcGVyKTsKKyAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0ZXN0IGRyYWZ0ID8gKi8KKyAgICBpZiAoKCFiT2tlKSAmJiAocE51bGwgLSBwS2V5d29yZCA9PSA4KSAmJgorICAgICAgICAoKnBLZXl3b3JkICAgICA9PSAnZCcpICYmICgqKHBLZXl3b3JkKzEpID09ICdyJykgJiYKKyAgICAgICAgKCoocEtleXdvcmQrMikgPT0gJ2EnKSAmJiAoKihwS2V5d29yZCszKSA9PSAnZicpICYmCisgICAgICAgICgqKHBLZXl3b3JkKzQpID09ICd0JykgJiYgKCoocEtleXdvcmQrNSkgPT0gJyAnKSkKKyAgICB7CisgICAgICBtbmdfdWludDMyIGlEcmFmdDsKKworICAgICAgaURyYWZ0ID0gKCoocEtleXdvcmQrNikgLSAnMCcpICogMTAgKyAoKihwS2V5d29yZCs3KSAtICcwJyk7CisgICAgICBiT2tlICAgPSAobW5nX2Jvb2wpKGlEcmFmdCA8PSBNTkdfTU5HX0RSQUZUKTsKKyAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0ZXN0IE1ORyAxLjAvMS4xID8gKi8KKyAgICBpZiAoKCFiT2tlKSAmJiAocE51bGwgLSBwS2V5d29yZCA9PSA3KSAmJgorICAgICAgICAoKnBLZXl3b3JkICAgICA9PSAnTScpICYmICgqKHBLZXl3b3JkKzEpID09ICdOJykgJiYKKyAgICAgICAgKCoocEtleXdvcmQrMikgPT0gJ0cnKSAmJiAoKihwS2V5d29yZCszKSA9PSAnLScpICYmCisgICAgICAgICgqKHBLZXl3b3JkKzQpID09ICcxJykgJiYgKCoocEtleXdvcmQrNSkgPT0gJy4nKSAmJgorICAgICAgICAoKCoocEtleXdvcmQrNikgPT0gJzAnKSB8fCAoKihwS2V5d29yZCs2KSA9PSAnMScpKSkKKyAgICAgIGJPa2UgICA9IE1OR19UUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGVzdCBDQUNIRU9GRiA/ICovCisgICAgaWYgKCghYk9rZSkgJiYgKHBOdWxsIC0gcEtleXdvcmQgPT0gOCkgJiYKKyAgICAgICAgKCpwS2V5d29yZCAgICAgPT0gJ0MnKSAmJiAoKihwS2V5d29yZCsxKSA9PSAnQScpICYmCisgICAgICAgICgqKHBLZXl3b3JkKzIpID09ICdDJykgJiYgKCoocEtleXdvcmQrMykgPT0gJ0gnKSAmJgorICAgICAgICAoKihwS2V5d29yZCs0KSA9PSAnRScpICYmICgqKHBLZXl3b3JkKzUpID09ICdPJykgJiYKKyAgICAgICAgKCoocEtleXdvcmQrNikgPT0gJ0YnKSAmJiAoKihwS2V5d29yZCs3KSA9PSAnRicpKQorICAgIHsKKyAgICAgIGlmICghcERhdGEtPnBGaXJzdGFuaW9iaikgICAgICAgIC8qIG9ubHkgaWYgY2FjaGluZyBoYXNuJ3Qgc3RhcnRlZCB5ZXQgISAqLworICAgICAgeworICAgICAgICBiT2tlICAgICAgICAgICAgICAgICAgPSBNTkdfVFJVRTsKKyAgICAgICAgcERhdGEtPmJDYWNoZXBsYXliYWNrID0gTU5HX0ZBTFNFOworICAgICAgICBwRGF0YS0+YlN0b3JlY2h1bmtzICAgPSBNTkdfRkFMU0U7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIGJPa2U7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX25FRUQKK1JFQURfQ0hVTksgKG1uZ19yZWFkX25lZWQpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1JFQURfTkVFRCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmICghcERhdGEtPmJIYXNNSERSKSAgICAgICAgICAgICAgICAvKiBzZXF1ZW5jZSBjaGVja3MgKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfU0VRVUVOQ0VFUlJPUik7CisKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgaWYgKChwRGF0YS0+Ykhhc0lIRFIpIHx8IChwRGF0YS0+Ykhhc0JBU0kpIHx8IChwRGF0YS0+Ykhhc0RIRFIpIHx8IChwRGF0YS0+Ykhhc0pIRFIpKQorI2Vsc2UKKyAgaWYgKChwRGF0YS0+Ykhhc0lIRFIpIHx8IChwRGF0YS0+Ykhhc0JBU0kpIHx8IChwRGF0YS0+Ykhhc0RIRFIpKQorI2VuZGlmCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1NFUVVFTkNFRVJST1IpOworCisgIGlmIChpUmF3bGVuIDwgMSkgICAgICAgICAgICAgICAgICAgICAvKiBjaGVjayB0aGUgbGVuZ3RoICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURMRU5HVEgpOworCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZXQncyBjaGVjayBpdCAqLworICAgIG1uZ19ib29sICAgYk9rZSA9IE1OR19UUlVFOworICAgIG1uZ19wY2hhciAgektleXdvcmRzOworICAgIG1uZ191aW50OHAgcE51bGwsIHBUZW1wOworCisgICAgTU5HX0FMTE9DIChwRGF0YSwgektleXdvcmRzLCBpUmF3bGVuICsgMSk7CisKKyAgICBpZiAoaVJhd2xlbikKKyAgICAgIE1OR19DT1BZICh6S2V5d29yZHMsIHBSYXdkYXRhLCBpUmF3bGVuKTsKKworICAgIHBUZW1wID0gKG1uZ191aW50OHApektleXdvcmRzOworICAgIHBOdWxsID0gZmluZF9udWxsIChwVGVtcCk7CisKKyAgICB3aGlsZSAoKGJPa2UpICYmIChwTnVsbCA8IChtbmdfdWludDhwKXpLZXl3b3JkcyArIGlSYXdsZW4pKQorICAgIHsKKyAgICAgIGJPa2UgID0gQ2hlY2tLZXl3b3JkIChwRGF0YSwgcFRlbXApOworICAgICAgcFRlbXAgPSBwTnVsbCArIDE7CisgICAgICBwTnVsbCA9IGZpbmRfbnVsbCAocFRlbXApOworICAgIH0KKworICAgIGlmIChiT2tlKQorICAgICAgYk9rZSA9IENoZWNrS2V5d29yZCAocERhdGEsIHBUZW1wKTsKKworICAgIE1OR19GUkVFWCAocERhdGEsIHpLZXl3b3JkcywgaVJhd2xlbiArIDEpOworCisgICAgaWYgKCFiT2tlKQorICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1VOU1VQUE9SVEVETkVFRCk7CisgIH0KKworI2lmZGVmIE1OR19TVE9SRV9DSFVOS1MKKyAgaWYgKHBEYXRhLT5iU3RvcmVjaHVua3MpCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0aWFsaXplIHN0b3JhZ2UgKi8KKyAgICBtbmdfcmV0Y29kZSBpUmV0Y29kZSA9ICgobW5nX2NodW5rX2hlYWRlcnApcEhlYWRlciktPmZDcmVhdGUgKHBEYXRhLCBwSGVhZGVyLCBwcENodW5rKTsKKworICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlIHRoZSBmaWVsZHMgKi8KKyAgICAoKG1uZ19uZWVkcCkqcHBDaHVuayktPmlLZXl3b3Jkc3NpemUgPSBpUmF3bGVuOworCisgICAgaWYgKGlSYXdsZW4pCisgICAgeworICAgICAgTU5HX0FMTE9DIChwRGF0YSwgKChtbmdfbmVlZHApKnBwQ2h1bmspLT56S2V5d29yZHMsIGlSYXdsZW4rMSk7CisgICAgICBNTkdfQ09QWSAoKChtbmdfbmVlZHApKnBwQ2h1bmspLT56S2V5d29yZHMsIHBSYXdkYXRhLCBpUmF3bGVuKTsKKyAgICB9CisgIH0KKyNlbmRpZiAvKiBNTkdfU1RPUkVfQ0hVTktTICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVBRF9ORUVELCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsgICAgICAgICAgICAgICAgICAvKiBkb25lICovCit9CisjZW5kaWYKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX3BIWWcKK1JFQURfQ0hVTksgKG1uZ19yZWFkX3BoeWcpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1JFQURfUEhZRywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmICghcERhdGEtPmJIYXNNSERSKSAgICAgICAgICAgICAgICAvKiBzZXF1ZW5jZSBjaGVja3MgKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfU0VRVUVOQ0VFUlJPUik7CisKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgaWYgKChwRGF0YS0+Ykhhc0lIRFIpIHx8IChwRGF0YS0+Ykhhc0JBU0kpIHx8IChwRGF0YS0+Ykhhc0RIRFIpIHx8IChwRGF0YS0+Ykhhc0pIRFIpKQorI2Vsc2UKKyAgaWYgKChwRGF0YS0+Ykhhc0lIRFIpIHx8IChwRGF0YS0+Ykhhc0JBU0kpIHx8IChwRGF0YS0+Ykhhc0RIRFIpKQorI2VuZGlmCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1NFUVVFTkNFRVJST1IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaXQncyA5IGJ5dGVzIG9yIGVtcHR5OyBubyBtb3JlLCBubyBsZXNzISAqLworICBpZiAoKGlSYXdsZW4gIT0gOSkgJiYgKGlSYXdsZW4gIT0gMCkpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURMRU5HVEgpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorICB7CisKKworICAgIC8qIFRPRE86IHNvbWV0aGluZyAhISEgKi8KKworCisgIH0KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisKKyNpZmRlZiBNTkdfU1RPUkVfQ0hVTktTCisgIGlmIChwRGF0YS0+YlN0b3JlY2h1bmtzKQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdGlhbGl6ZSBzdG9yYWdlICovCisgICAgbW5nX3JldGNvZGUgaVJldGNvZGUgPSAoKG1uZ19jaHVua19oZWFkZXJwKXBIZWFkZXIpLT5mQ3JlYXRlIChwRGF0YSwgcEhlYWRlciwgcHBDaHVuayk7CisKKyAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZSB0aGUgZmllbGRzICovCisgICAgKChtbmdfcGh5Z3ApKnBwQ2h1bmspLT5iRW1wdHkgPSAobW5nX2Jvb2wpKGlSYXdsZW4gPT0gMCk7CisKKyAgICBpZiAoaVJhd2xlbikKKyAgICB7CisgICAgICAoKG1uZ19waHlncCkqcHBDaHVuayktPmlTaXpleCA9IG1uZ19nZXRfdWludDMyIChwUmF3ZGF0YSk7CisgICAgICAoKG1uZ19waHlncCkqcHBDaHVuayktPmlTaXpleSA9IG1uZ19nZXRfdWludDMyIChwUmF3ZGF0YSs0KTsKKyAgICAgICgobW5nX3BoeWdwKSpwcENodW5rKS0+aVVuaXQgID0gKihwUmF3ZGF0YSs4KTsKKyAgICB9CisgIH0KKyNlbmRpZiAvKiBNTkdfU1RPUkVfQ0hVTktTICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVBRF9QSFlHLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsgICAgICAgICAgICAgICAgICAvKiBkb25lICovCit9CisjZW5kaWYKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorI2lmZGVmIE1OR19JTkNMVURFX0pORworUkVBRF9DSFVOSyAobW5nX3JlYWRfamhkcikKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVBRF9KSERSLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXF1ZW5jZSBjaGVja3MgKi8KKyAgaWYgKChwRGF0YS0+ZVNpZ3R5cGUgIT0gbW5nX2l0X2puZykgJiYgKHBEYXRhLT5lU2lndHlwZSAhPSBtbmdfaXRfbW5nKSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfQ0hVTktOT1RBTExPV0VEKTsKKworICBpZiAoKHBEYXRhLT5lU2lndHlwZSA9PSBtbmdfaXRfam5nKSAmJiAocERhdGEtPmlDaHVua3NlcSA+IDEpKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19TRVFVRU5DRUVSUk9SKTsKKworICBpZiAoKHBEYXRhLT5iSGFzSUhEUikgfHwgKHBEYXRhLT5iSGFzQkFTSSkgfHwgKHBEYXRhLT5iSGFzREhEUikgfHwgKHBEYXRhLT5iSGFzSkhEUikpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1NFUVVFTkNFRVJST1IpOworCisgIGlmIChpUmF3bGVuICE9IDE2KSAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggb2tlID8gKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRExFTkdUSCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnNpZGUgYSBKSERSLUlFTkQgYmxvY2sgbm93ICovCisgIHBEYXRhLT5iSGFzSkhEUiAgICAgICAgICAgICAgPSBNTkdfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCBzdG9yZSBpbnRlcmVzdGluZyBmaWVsZHMgKi8KKyAgcERhdGEtPmlEYXRhd2lkdGggICAgICAgICAgICA9IG1uZ19nZXRfdWludDMyIChwUmF3ZGF0YSk7CisgIHBEYXRhLT5pRGF0YWhlaWdodCAgICAgICAgICAgPSBtbmdfZ2V0X3VpbnQzMiAocFJhd2RhdGErNCk7CisgIHBEYXRhLT5pSkhEUmNvbG9ydHlwZSAgICAgICAgPSAqKHBSYXdkYXRhKzgpOworICBwRGF0YS0+aUpIRFJpbWdiaXRkZXB0aCAgICAgID0gKihwUmF3ZGF0YSs5KTsKKyAgcERhdGEtPmlKSERSaW1nY29tcHJlc3Npb24gICA9ICoocFJhd2RhdGErMTApOworICBwRGF0YS0+aUpIRFJpbWdpbnRlcmxhY2UgICAgID0gKihwUmF3ZGF0YSsxMSk7CisgIHBEYXRhLT5pSkhEUmFscGhhYml0ZGVwdGggICAgPSAqKHBSYXdkYXRhKzEyKTsKKyAgcERhdGEtPmlKSERSYWxwaGFjb21wcmVzc2lvbiA9ICoocFJhd2RhdGErMTMpOworICBwRGF0YS0+aUpIRFJhbHBoYWZpbHRlciAgICAgID0gKihwUmF3ZGF0YSsxNCk7CisgIHBEYXRhLT5pSkhEUmFscGhhaW50ZXJsYWNlICAgPSAqKHBSYXdkYXRhKzE1KTsKKworCisjaWYgZGVmaW5lZChNTkdfTk9fMV8yXzRCSVRfU1VQUE9SVCkgfHwgZGVmaW5lZChNTkdfTk9fMTZCSVRfU1VQUE9SVCkKKyAgcERhdGEtPmlQTkdtdWx0ID0gMTsKKyAgcERhdGEtPmlQTkdkZXB0aCA9IHBEYXRhLT5pSkhEUmFscGhhYml0ZGVwdGg7CisjZW5kaWYKKworI2lmZGVmIE1OR19OT18xXzJfNEJJVF9TVVBQT1JUCisgIGlmIChwRGF0YS0+aUpIRFJhbHBoYWJpdGRlcHRoIDwgOCkKKyAgICBwRGF0YS0+aUpIRFJhbHBoYWJpdGRlcHRoID0gODsKKyNlbmRpZgorCisjaWZkZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyAgaWYgKHBEYXRhLT5pSkhEUmFscGhhYml0ZGVwdGggPiA4KQorICB7CisgICAgcERhdGEtPmlQTkdtdWx0ID0gMjsKKyAgICBwRGF0YS0+aUpIRFJhbHBoYWJpdGRlcHRoID0gODsKKyAgfQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwYXJhbWV0ZXIgdmFsaWRpdHkgY2hlY2tzICovCisgIGlmICgocERhdGEtPmlKSERSY29sb3J0eXBlICE9IE1OR19DT0xPUlRZUEVfSlBFR0dSQVkgICkgJiYKKyAgICAgIChwRGF0YS0+aUpIRFJjb2xvcnR5cGUgIT0gTU5HX0NPTE9SVFlQRV9KUEVHQ09MT1IgKSAmJgorICAgICAgKHBEYXRhLT5pSkhEUmNvbG9ydHlwZSAhPSBNTkdfQ09MT1JUWVBFX0pQRUdHUkFZQSApICYmCisgICAgICAocERhdGEtPmlKSERSY29sb3J0eXBlICE9IE1OR19DT0xPUlRZUEVfSlBFR0NPTE9SQSkgICAgKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElEQ09MT1JUWVBFKTsKKworICBpZiAoKHBEYXRhLT5pSkhEUmltZ2JpdGRlcHRoICE9IE1OR19CSVRERVBUSF9KUEVHOCAgICAgKSAmJgorICAgICAgKHBEYXRhLT5pSkhEUmltZ2JpdGRlcHRoICE9IE1OR19CSVRERVBUSF9KUEVHMTIgICAgKSAmJgorICAgICAgKHBEYXRhLT5pSkhEUmltZ2JpdGRlcHRoICE9IE1OR19CSVRERVBUSF9KUEVHOEFORDEyKSAgICApCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURCSVRERVBUSCk7CisKKyAgaWYgKHBEYXRhLT5pSkhEUmltZ2NvbXByZXNzaW9uICE9IE1OR19DT01QUkVTU0lPTl9CQVNFTElORUpQRUcpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURDT01QUkVTUyk7CisKKyAgaWYgKChwRGF0YS0+aUpIRFJpbWdpbnRlcmxhY2UgIT0gTU5HX0lOVEVSTEFDRV9TRVFVRU5USUFMICkgJiYKKyAgICAgIChwRGF0YS0+aUpIRFJpbWdpbnRlcmxhY2UgIT0gTU5HX0lOVEVSTEFDRV9QUk9HUkVTU0lWRSkgICAgKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElESU5URVJMQUNFKTsKKworICBpZiAoKHBEYXRhLT5pSkhEUmNvbG9ydHlwZSA9PSBNTkdfQ09MT1JUWVBFX0pQRUdHUkFZQSApIHx8CisgICAgICAocERhdGEtPmlKSERSY29sb3J0eXBlID09IE1OR19DT0xPUlRZUEVfSlBFR0NPTE9SQSkgICAgKQorICB7CisgICAgaWYgKChwRGF0YS0+aUpIRFJhbHBoYWJpdGRlcHRoICE9IE1OR19CSVRERVBUSF84ICkKKyNpZm5kZWYgTU5HX05PXzFfMl80QklUX1NVUFBPUlQKKyAgICAgICAgJiYgKHBEYXRhLT5pSkhEUmFscGhhYml0ZGVwdGggIT0gTU5HX0JJVERFUFRIXzEgKSAmJgorICAgICAgICAocERhdGEtPmlKSERSYWxwaGFiaXRkZXB0aCAhPSBNTkdfQklUREVQVEhfMiApICYmCisgICAgICAgIChwRGF0YS0+aUpIRFJhbHBoYWJpdGRlcHRoICE9IE1OR19CSVRERVBUSF80ICkKKyNlbmRpZgorI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgICAgICAmJiAocERhdGEtPmlKSERSYWxwaGFiaXRkZXB0aCAhPSBNTkdfQklUREVQVEhfMTYpCisjZW5kaWYKKyAgICAgICAgKQorICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURCSVRERVBUSCk7CisKKyAgICBpZiAoKHBEYXRhLT5pSkhEUmFscGhhY29tcHJlc3Npb24gIT0gTU5HX0NPTVBSRVNTSU9OX0RFRkxBVEUgICAgICkgJiYKKyAgICAgICAgKHBEYXRhLT5pSkhEUmFscGhhY29tcHJlc3Npb24gIT0gTU5HX0NPTVBSRVNTSU9OX0JBU0VMSU5FSlBFRykgICAgKQorICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURDT01QUkVTUyk7CisKKyAgICBpZiAoKHBEYXRhLT5pSkhEUmFscGhhY29tcHJlc3Npb24gPT0gTU5HX0NPTVBSRVNTSU9OX0JBU0VMSU5FSlBFRykgJiYKKyAgICAgICAgKHBEYXRhLT5pSkhEUmFscGhhYml0ZGVwdGggICAgIT0gIE1OR19CSVRERVBUSF84ICAgICAgICAgICAgICkgICAgKQorICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURCSVRERVBUSCk7CisKKyNpZiBkZWZpbmVkKEZJTFRFUjE5MikgfHwgZGVmaW5lZChGSUxURVIxOTMpCisgICAgaWYgKChwRGF0YS0+aUpIRFJhbHBoYWZpbHRlciAhPSBNTkdfRklMVEVSX0FEQVBUSVZFICkgJiYKKyNpZiBkZWZpbmVkKEZJTFRFUjE5MikgJiYgZGVmaW5lZChGSUxURVIxOTMpCisgICAgICAgIChwRGF0YS0+aUpIRFJhbHBoYWZpbHRlciAhPSBNTkdfRklMVEVSX0RJRkZFUklORykgJiYKKyAgICAgICAgKHBEYXRhLT5pSkhEUmFscGhhZmlsdGVyICE9IE1OR19GSUxURVJfTk9GSUxURVIgKSAgICApCisjZWxzZQorI2lmZGVmIEZJTFRFUjE5MgorICAgICAgICAocERhdGEtPmlKSERSYWxwaGFmaWx0ZXIgIT0gTU5HX0ZJTFRFUl9ESUZGRVJJTkcpICAgICkKKyNlbHNlCisgICAgICAgIChwRGF0YS0+aUpIRFJhbHBoYWZpbHRlciAhPSBNTkdfRklMVEVSX05PRklMVEVSICkgICAgKQorI2VuZGlmCisjZW5kaWYKKyAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElERklMVEVSKTsKKyNlbHNlCisgICAgaWYgKHBEYXRhLT5pSkhEUmFscGhhZmlsdGVyKQorICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURGSUxURVIpOworI2VuZGlmCisKKyAgICBpZiAoKHBEYXRhLT5pSkhEUmFscGhhaW50ZXJsYWNlICE9IE1OR19JTlRFUkxBQ0VfTk9ORSApICYmCisgICAgICAgIChwRGF0YS0+aUpIRFJhbHBoYWludGVybGFjZSAhPSBNTkdfSU5URVJMQUNFX0FEQU03KSAgICApCisgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRElOVEVSTEFDRSk7CisKKyAgfQorICBlbHNlCisgIHsKKyAgICBpZiAocERhdGEtPmlKSERSYWxwaGFiaXRkZXB0aCkKKyAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElEQklUREVQVEgpOworCisgICAgaWYgKHBEYXRhLT5pSkhEUmFscGhhY29tcHJlc3Npb24pCisgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRENPTVBSRVNTKTsKKworICAgIGlmIChwRGF0YS0+aUpIRFJhbHBoYWZpbHRlcikKKyAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElERklMVEVSKTsKKworICAgIGlmIChwRGF0YS0+aUpIRFJhbHBoYWludGVybGFjZSkKKyAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElESU5URVJMQUNFKTsKKworICB9CisKKyAgaWYgKCFwRGF0YS0+Ykhhc2hlYWRlcikgICAgICAgICAgICAgIC8qIGZpcnN0IGNodW5rID8gKi8KKyAgeworICAgIHBEYXRhLT5iSGFzaGVhZGVyID0gTU5HX1RSVUU7ICAgICAgLyogd2UndmUgZ290IGEgaGVhZGVyICovCisgICAgcERhdGEtPmVJbWFnZXR5cGUgPSBtbmdfaXRfam5nOyAgICAvKiB0aGVuIHRoaXMgbXVzdCBiZSBhIEpORyAqLworICAgIHBEYXRhLT5pV2lkdGggICAgID0gbW5nX2dldF91aW50MzIgKHBSYXdkYXRhKTsKKyAgICBwRGF0YS0+aUhlaWdodCAgICA9IG1uZ19nZXRfdWludDMyIChwUmF3ZGF0YSs0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByZWRpY3QgYWxwaGEtZGVwdGggISAqLworICBpZiAoKHBEYXRhLT5pSkhEUmNvbG9ydHlwZSA9PSBNTkdfQ09MT1JUWVBFX0pQRUdHUkFZQSApIHx8CisgICAgICAocERhdGEtPmlKSERSY29sb3J0eXBlID09IE1OR19DT0xPUlRZUEVfSlBFR0NPTE9SQSkgICAgKQorICAgICAgcERhdGEtPmlBbHBoYWRlcHRoID0gcERhdGEtPmlKSERSYWxwaGFiaXRkZXB0aDsKKyAgICBlbHNlCisgICAgICBwRGF0YS0+aUFscGhhZGVwdGggPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZml0cyBvbiBtYXhpbXVtIGNhbnZhcyA/ICovCisgICAgaWYgKChwRGF0YS0+aVdpZHRoID4gcERhdGEtPmlNYXh3aWR0aCkgfHwgKHBEYXRhLT5pSGVpZ2h0ID4gcERhdGEtPmlNYXhoZWlnaHQpKQorICAgICAgTU5HX1dBUk5JTkcgKHBEYXRhLCBNTkdfSU1BR0VUT09MQVJHRSk7CisKKyAgICBpZiAocERhdGEtPmZQcm9jZXNzaGVhZGVyKSAgICAgICAgIC8qIGluZm9ybSB0aGUgYXBwID8gKi8KKyAgICAgIGlmICghcERhdGEtPmZQcm9jZXNzaGVhZGVyICgoKG1uZ19oYW5kbGUpcERhdGEpLCBwRGF0YS0+aVdpZHRoLCBwRGF0YS0+aUhlaWdodCkpCisgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfQVBQTUlTQ0VSUk9SKTsKKworICB9CisKKyAgcERhdGEtPmlDb2xvcnR5cGUgPSAwOyAgICAgICAgICAgICAgIC8qIGZha2UgZ3JheXNjYWxlIGZvciBvdGhlciByb3V0aW5lcyAqLworICBwRGF0YS0+aUltYWdlbGV2ZWwrKzsgICAgICAgICAgICAgICAgLyogb25lIGxldmVsIGRlZXBlciAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorICB7CisgICAgbW5nX3JldGNvZGUgaVJldGNvZGUgPSBtbmdfcHJvY2Vzc19kaXNwbGF5X2poZHIgKHBEYXRhKTsKKworICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgfQorI2VuZGlmIC8qIE1OR19TVVBQT1JUX0RJU1BMQVkgKi8KKworI2lmZGVmIE1OR19TVE9SRV9DSFVOS1MKKyAgaWYgKHBEYXRhLT5iU3RvcmVjaHVua3MpCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0aWFsaXplIHN0b3JhZ2UgKi8KKyAgICBtbmdfcmV0Y29kZSBpUmV0Y29kZSA9ICgobW5nX2NodW5rX2hlYWRlcnApcEhlYWRlciktPmZDcmVhdGUgKHBEYXRhLCBwSGVhZGVyLCBwcENodW5rKTsKKworICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlIHRoZSBmaWVsZHMgKi8KKyAgICAoKG1uZ19qaGRycCkqcHBDaHVuayktPmlXaWR0aCAgICAgICAgICAgID0gbW5nX2dldF91aW50MzIgKHBSYXdkYXRhKTsKKyAgICAoKG1uZ19qaGRycCkqcHBDaHVuayktPmlIZWlnaHQgICAgICAgICAgID0gbW5nX2dldF91aW50MzIgKHBSYXdkYXRhKzQpOworICAgICgobW5nX2poZHJwKSpwcENodW5rKS0+aUNvbG9ydHlwZSAgICAgICAgPSAqKHBSYXdkYXRhKzgpOworICAgICgobW5nX2poZHJwKSpwcENodW5rKS0+aUltYWdlc2FtcGxlZGVwdGggPSAqKHBSYXdkYXRhKzkpOworICAgICgobW5nX2poZHJwKSpwcENodW5rKS0+aUltYWdlY29tcHJlc3Npb24gPSAqKHBSYXdkYXRhKzEwKTsKKyAgICAoKG1uZ19qaGRycCkqcHBDaHVuayktPmlJbWFnZWludGVybGFjZSAgID0gKihwUmF3ZGF0YSsxMSk7CisgICAgKChtbmdfamhkcnApKnBwQ2h1bmspLT5pQWxwaGFzYW1wbGVkZXB0aCA9ICoocFJhd2RhdGErMTIpOworI2lmZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgaWYgKCoocFJhd2RhdGErMTIpID4gOCkKKyAgICAgICAgKChtbmdfamhkcnApKnBwQ2h1bmspLT5pQWxwaGFzYW1wbGVkZXB0aCA9IDg7CisjZW5kaWYKKyAgICAoKG1uZ19qaGRycCkqcHBDaHVuayktPmlBbHBoYWNvbXByZXNzaW9uID0gKihwUmF3ZGF0YSsxMyk7CisgICAgKChtbmdfamhkcnApKnBwQ2h1bmspLT5pQWxwaGFmaWx0ZXIgICAgICA9ICoocFJhd2RhdGErMTQpOworICAgICgobW5nX2poZHJwKSpwcENodW5rKS0+aUFscGhhaW50ZXJsYWNlICAgPSAqKHBSYXdkYXRhKzE1KTsKKyAgfQorI2VuZGlmIC8qIE1OR19TVE9SRV9DSFVOS1MgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9SRUFEX0pIRFIsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOyAgICAgICAgICAgICAgICAgIC8qIGRvbmUgKi8KK30KKyNlbHNlCisjZGVmaW5lIHJlYWRfamhkciAwCisjZW5kaWYgLyogTU5HX0lOQ0xVREVfSk5HICovCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKK1JFQURfQ0hVTksgKG1uZ19yZWFkX2pkYWEpCit7CisjaWYgZGVmaW5lZChNTkdfU1VQUE9SVF9ESVNQTEFZKSB8fCBkZWZpbmVkKE1OR19TVE9SRV9DSFVOS1MpCisgIHZvbGF0aWxlIG1uZ19yZXRjb2RlIGlSZXRjb2RlOworCisgIGlSZXRjb2RlPU1OR19OT0VSUk9SOworI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVBRF9KREFBLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXF1ZW5jZSBjaGVja3MgKi8KKyAgaWYgKCghcERhdGEtPmJIYXNKSERSKSAmJiAoIXBEYXRhLT5iSGFzREhEUikpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1NFUVVFTkNFRVJST1IpOworCisgIGlmIChwRGF0YS0+Ykhhc0pTRVApCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1NFUVVFTkNFRVJST1IpOworICAgIAorICBpZiAocERhdGEtPmlKSERSYWxwaGFjb21wcmVzc2lvbiAhPSBNTkdfQ09NUFJFU1NJT05fQkFTRUxJTkVKUEVHKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19TRVFVRU5DRUVSUk9SKTsKKworICBpZiAoaVJhd2xlbiA9PSAwKSAgICAgICAgICAgICAgICAgICAgLyogY2FuIG5ldmVyIGJlIGVtcHR5ICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURMRU5HVEgpOworCisgIHBEYXRhLT5iSGFzSkRBQSA9IE1OR19UUlVFOyAgICAgICAgICAvKiBnb3Qgc29tZSBKREFBIG5vdywgZG9uJ3Qgd2UgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX0RJU1BMQVkKKyAgaVJldGNvZGUgPSBtbmdfcHJvY2Vzc19kaXNwbGF5X2pkYWEgKHBEYXRhLCBpUmF3bGVuLCBwUmF3ZGF0YSk7CisKKyAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgIHJldHVybiBpUmV0Y29kZTsKKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisKKyNpZmRlZiBNTkdfU1RPUkVfQ0hVTktTCisgIGlmIChwRGF0YS0+YlN0b3JlY2h1bmtzKQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdGlhbGl6ZSBzdG9yYWdlICovCisgICAgaVJldGNvZGUgPSAoKG1uZ19jaHVua19oZWFkZXJwKXBIZWFkZXIpLT5mQ3JlYXRlIChwRGF0YSwgcEhlYWRlciwgcHBDaHVuayk7CisKKyAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZSB0aGUgZmllbGRzICovCisgICAgKChtbmdfamRhYXApKnBwQ2h1bmspLT5iRW1wdHkgICAgPSAobW5nX2Jvb2wpKGlSYXdsZW4gPT0gMCk7CisgICAgKChtbmdfamRhYXApKnBwQ2h1bmspLT5pRGF0YXNpemUgPSBpUmF3bGVuOworCisgICAgaWYgKGlSYXdsZW4gIT0gMCkgICAgICAgICAgICAgICAgICAvKiBpcyB0aGVyZSBhbnkgZGF0YSA/ICovCisgICAgeworICAgICAgTU5HX0FMTE9DIChwRGF0YSwgKChtbmdfamRhYXApKnBwQ2h1bmspLT5wRGF0YSwgaVJhd2xlbik7CisgICAgICBNTkdfQ09QWSAgKCgobW5nX2pkYWFwKSpwcENodW5rKS0+cERhdGEsIHBSYXdkYXRhLCBpUmF3bGVuKTsKKyAgICB9CisgIH0KKyNlbmRpZiAvKiBNTkdfU1RPUkVfQ0hVTktTICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVBRF9KREFBLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsgICAgICAgICAgICAgICAgICAvKiBkb25lICovCit9CisjZWxzZQorI2RlZmluZSByZWFkX2pkYWEgMAorI2VuZGlmIC8qIE1OR19JTkNMVURFX0pORyAqLworI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCitSRUFEX0NIVU5LIChtbmdfcmVhZF9qZGF0KQoreworI2lmIGRlZmluZWQoTU5HX1NVUFBPUlRfRElTUExBWSkgfHwgZGVmaW5lZChNTkdfU1RPUkVfQ0hVTktTKQorICB2b2xhdGlsZSBtbmdfcmV0Y29kZSBpUmV0Y29kZTsKKworICBpUmV0Y29kZT1NTkdfTk9FUlJPUjsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1JFQURfSkRBVCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2VxdWVuY2UgY2hlY2tzICovCisgIGlmICgoIXBEYXRhLT5iSGFzSkhEUikgJiYgKCFwRGF0YS0+Ykhhc0RIRFIpKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19TRVFVRU5DRUVSUk9SKTsKKworICBpZiAoaVJhd2xlbiA9PSAwKSAgICAgICAgICAgICAgICAgICAgLyogY2FuIG5ldmVyIGJlIGVtcHR5ICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURMRU5HVEgpOworCisgIHBEYXRhLT5iSGFzSkRBVCA9IE1OR19UUlVFOyAgICAgICAgICAvKiBnb3Qgc29tZSBKREFUIG5vdywgZG9uJ3Qgd2UgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX0RJU1BMQVkKKyAgaVJldGNvZGUgPSBtbmdfcHJvY2Vzc19kaXNwbGF5X2pkYXQgKHBEYXRhLCBpUmF3bGVuLCBwUmF3ZGF0YSk7CisKKyAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgIHJldHVybiBpUmV0Y29kZTsKKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisKKyNpZmRlZiBNTkdfU1RPUkVfQ0hVTktTCisgIGlmIChwRGF0YS0+YlN0b3JlY2h1bmtzKQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdGlhbGl6ZSBzdG9yYWdlICovCisgICAgaVJldGNvZGUgPSAoKG1uZ19jaHVua19oZWFkZXJwKXBIZWFkZXIpLT5mQ3JlYXRlIChwRGF0YSwgcEhlYWRlciwgcHBDaHVuayk7CisKKyAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZSB0aGUgZmllbGRzICovCisgICAgKChtbmdfamRhdHApKnBwQ2h1bmspLT5iRW1wdHkgICAgPSAobW5nX2Jvb2wpKGlSYXdsZW4gPT0gMCk7CisgICAgKChtbmdfamRhdHApKnBwQ2h1bmspLT5pRGF0YXNpemUgPSBpUmF3bGVuOworCisgICAgaWYgKGlSYXdsZW4gIT0gMCkgICAgICAgICAgICAgICAgICAvKiBpcyB0aGVyZSBhbnkgZGF0YSA/ICovCisgICAgeworICAgICAgTU5HX0FMTE9DIChwRGF0YSwgKChtbmdfamRhdHApKnBwQ2h1bmspLT5wRGF0YSwgaVJhd2xlbik7CisgICAgICBNTkdfQ09QWSAgKCgobW5nX2pkYXRwKSpwcENodW5rKS0+cERhdGEsIHBSYXdkYXRhLCBpUmF3bGVuKTsKKyAgICB9CisgIH0KKyNlbmRpZiAvKiBNTkdfU1RPUkVfQ0hVTktTICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVBRF9KREFULCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsgICAgICAgICAgICAgICAgICAvKiBkb25lICovCit9CisjZWxzZQorI2RlZmluZSByZWFkX2pkYXQgMAorI2VuZGlmIC8qIE1OR19JTkNMVURFX0pORyAqLworI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCitSRUFEX0NIVU5LIChtbmdfcmVhZF9qc2VwKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9SRUFEX0pTRVAsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAoIXBEYXRhLT5iSGFzSkhEUikgICAgICAgICAgICAgICAgLyogc2VxdWVuY2UgY2hlY2tzICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1NFUVVFTkNFRVJST1IpOworCisgIGlmIChpUmF3bGVuICE9IDApICAgICAgICAgICAgICAgICAgICAvKiBtdXN0IGJlIGVtcHR5ICEgKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRExFTkdUSCk7CisKKyAgcERhdGEtPmJIYXNKU0VQID0gTU5HX1RSVUU7ICAgICAgICAgIC8qIGluZGljYXRlIHdlJ3ZlIGhhZCB0aGUgOC0vMTItYml0IHNlcGFyYXRvciAqLworCisjaWZkZWYgTU5HX1NUT1JFX0NIVU5LUworICBpZiAocERhdGEtPmJTdG9yZWNodW5rcykKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpemUgc3RvcmFnZSAqLworICAgIG1uZ19yZXRjb2RlIGlSZXRjb2RlID0gKChtbmdfY2h1bmtfaGVhZGVycClwSGVhZGVyKS0+ZkNyZWF0ZSAocERhdGEsIHBIZWFkZXIsIHBwQ2h1bmspOworCisgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgcmV0dXJuIGlSZXRjb2RlOworCisgIH0KKyNlbmRpZiAvKiBNTkdfU1RPUkVfQ0hVTktTICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVBRF9KU0VQLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsgICAgICAgICAgICAgICAgICAvKiBkb25lICovCit9CisjZWxzZQorI2RlZmluZSByZWFkX2pzZXAgMAorI2VuZGlmIC8qIE1OR19JTkNMVURFX0pORyAqLworI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKK1JFQURfQ0hVTksgKG1uZ19yZWFkX2RoZHIpCit7CisgIG1uZ191aW50OCBpSW1hZ2V0eXBlLCBpRGVsdGF0eXBlOworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9SRUFEX0RIRFIsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAoIXBEYXRhLT5iSGFzTUhEUikgICAgICAgICAgICAgICAgLyogc2VxdWVuY2UgY2hlY2tzICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1NFUVVFTkNFRVJST1IpOworCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisgIGlmICgocERhdGEtPmJIYXNJSERSKSB8fCAocERhdGEtPmJIYXNCQVNJKSB8fCAocERhdGEtPmJIYXNESERSKSB8fCAocERhdGEtPmJIYXNKSERSKSkKKyNlbHNlCisgIGlmICgocERhdGEtPmJIYXNJSERSKSB8fCAocERhdGEtPmJIYXNCQVNJKSB8fCAocERhdGEtPmJIYXNESERSKSkKKyNlbmRpZgorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19TRVFVRU5DRUVSUk9SKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoZWNrIGZvciB2YWxpZCBsZW5ndGggKi8KKyAgaWYgKChpUmF3bGVuICE9IDQpICYmIChpUmF3bGVuICE9IDEyKSAmJiAoaVJhd2xlbiAhPSAyMCkpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURMRU5HVEgpOworCisgIGlJbWFnZXR5cGUgPSAqKHBSYXdkYXRhKzIpOyAgICAgICAgICAvKiBjaGVjayBmaWVsZHMgZm9yIHZhbGlkaXR5ICovCisgIGlEZWx0YXR5cGUgPSAqKHBSYXdkYXRhKzMpOworCisgIGlmIChpSW1hZ2V0eXBlID4gTU5HX0lNQUdFVFlQRV9KTkcpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVklNQUdFVFlQRSk7CisKKyAgaWYgKGlEZWx0YXR5cGUgPiBNTkdfREVMVEFUWVBFX05PQ0hBTkdFKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZERUxUQVRZUEUpOworCisgIGlmICgoaURlbHRhdHlwZSA9PSBNTkdfREVMVEFUWVBFX1JFUExBQ0UpICYmIChpUmF3bGVuID4gMTIpKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElETEVOR1RIKTsKKworICBpZiAoKGlEZWx0YXR5cGUgPT0gTU5HX0RFTFRBVFlQRV9OT0NIQU5HRSkgJiYgKGlSYXdsZW4gPiA0KSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRExFTkdUSCk7CisKKyAgcERhdGEtPmJIYXNESERSICAgPSBNTkdfVFJVRTsgICAgICAgIC8qIGluc2lkZSBhIERIRFItSUVORCBibG9jayBub3cgKi8KKyAgcERhdGEtPmlEZWx0YXR5cGUgPSBpRGVsdGF0eXBlOworCisgIHBEYXRhLT5pSW1hZ2VsZXZlbCsrOyAgICAgICAgICAgICAgICAvKiBvbmUgbGV2ZWwgZGVlcGVyICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCisgIHsKKyAgICBtbmdfdWludDE2ICBpT2JqZWN0aWQgICAgPSBtbmdfZ2V0X3VpbnQxNiAocFJhd2RhdGEpOworICAgIG1uZ191aW50MzIgIGlCbG9ja3dpZHRoICA9IDA7CisgICAgbW5nX3VpbnQzMiAgaUJsb2NraGVpZ2h0ID0gMDsKKyAgICBtbmdfdWludDMyICBpQmxvY2t4ICAgICAgPSAwOworICAgIG1uZ191aW50MzIgIGlCbG9ja3kgICAgICA9IDA7CisgICAgbW5nX3JldGNvZGUgaVJldGNvZGU7CisKKyAgICBpZiAoaVJhd2xlbiA+IDQpCisgICAgeworICAgICAgaUJsb2Nrd2lkdGggID0gbW5nX2dldF91aW50MzIgKHBSYXdkYXRhKzQpOworICAgICAgaUJsb2NraGVpZ2h0ID0gbW5nX2dldF91aW50MzIgKHBSYXdkYXRhKzgpOworICAgIH0KKworICAgIGlmIChpUmF3bGVuID4gMTIpCisgICAgeworICAgICAgaUJsb2NreCAgICAgID0gbW5nX2dldF91aW50MzIgKHBSYXdkYXRhKzEyKTsKKyAgICAgIGlCbG9ja3kgICAgICA9IG1uZ19nZXRfdWludDMyIChwUmF3ZGF0YSsxNik7CisgICAgfQorCisgICAgaVJldGNvZGUgPSBtbmdfY3JlYXRlX2FuaV9kaGRyIChwRGF0YSwgaU9iamVjdGlkLCBpSW1hZ2V0eXBlLCBpRGVsdGF0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUJsb2Nrd2lkdGgsIGlCbG9ja2hlaWdodCwgaUJsb2NreCwgaUJsb2NreSk7CisKKy8qICAgIGlmICghaVJldGNvZGUpCisgICAgICBpUmV0Y29kZSA9IG1uZ19wcm9jZXNzX2Rpc3BsYXlfZGhkciAocERhdGEsIGlPYmplY3RpZCwgaUltYWdldHlwZSwgaURlbHRhdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpQmxvY2t3aWR0aCwgaUJsb2NraGVpZ2h0LCBpQmxvY2t4LCBpQmxvY2t5KTsgKi8KKworICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKworICB9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfRElTUExBWSAqLworCisjaWZkZWYgTU5HX1NUT1JFX0NIVU5LUworICBpZiAocERhdGEtPmJTdG9yZWNodW5rcykKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpemUgc3RvcmFnZSAqLworICAgIG1uZ19yZXRjb2RlIGlSZXRjb2RlID0gKChtbmdfY2h1bmtfaGVhZGVycClwSGVhZGVyKS0+ZkNyZWF0ZSAocERhdGEsIHBIZWFkZXIsIHBwQ2h1bmspOworCisgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgcmV0dXJuIGlSZXRjb2RlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmUgdGhlIGZpZWxkcyAqLworICAgICgobW5nX2RoZHJwKSpwcENodW5rKS0+aU9iamVjdGlkICAgICAgPSBtbmdfZ2V0X3VpbnQxNiAocFJhd2RhdGEpOworICAgICgobW5nX2RoZHJwKSpwcENodW5rKS0+aUltYWdldHlwZSAgICAgPSBpSW1hZ2V0eXBlOworICAgICgobW5nX2RoZHJwKSpwcENodW5rKS0+aURlbHRhdHlwZSAgICAgPSBpRGVsdGF0eXBlOworCisgICAgaWYgKGlSYXdsZW4gPiA0KQorICAgIHsKKyAgICAgICgobW5nX2RoZHJwKSpwcENodW5rKS0+aUJsb2Nrd2lkdGggID0gbW5nX2dldF91aW50MzIgKHBSYXdkYXRhKzQpOworICAgICAgKChtbmdfZGhkcnApKnBwQ2h1bmspLT5pQmxvY2toZWlnaHQgPSBtbmdfZ2V0X3VpbnQzMiAocFJhd2RhdGErOCk7CisgICAgfQorCisgICAgaWYgKGlSYXdsZW4gPiAxMikKKyAgICB7CisgICAgICAoKG1uZ19kaGRycCkqcHBDaHVuayktPmlCbG9ja3ggICAgICA9IG1uZ19nZXRfdWludDMyIChwUmF3ZGF0YSsxMik7CisgICAgICAoKG1uZ19kaGRycCkqcHBDaHVuayktPmlCbG9ja3kgICAgICA9IG1uZ19nZXRfdWludDMyIChwUmF3ZGF0YSsxNik7CisgICAgfQorICB9CisjZW5kaWYgLyogTU5HX1NUT1JFX0NIVU5LUyAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1JFQURfREhEUiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7ICAgICAgICAgICAgICAgICAgLyogZG9uZSAqLworfQorI2VuZGlmCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworUkVBRF9DSFVOSyAobW5nX3JlYWRfcHJvbSkKK3sKKyAgbW5nX3VpbnQ4IGlDb2xvcnR5cGU7CisgIG1uZ191aW50OCBpU2FtcGxlZGVwdGg7CisgIG1uZ191aW50OCBpRmlsbHR5cGU7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVBRF9QUk9NLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXF1ZW5jZSBjaGVja3MgKi8KKyAgaWYgKCghcERhdGEtPmJIYXNNSERSKSB8fCAoIXBEYXRhLT5iSGFzREhEUikpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1NFUVVFTkNFRVJST1IpOworCisgIGlmIChpUmF3bGVuICE9IDMpICAgICAgICAgICAgICAgICAgICAvKiBnb3R0YSBiZSBleGFjdGx5IDMgYnl0ZXMgKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRExFTkdUSCk7CisKKyAgaUNvbG9ydHlwZSAgID0gKnBSYXdkYXRhOyAgICAgICAgICAgIC8qIGNoZWNrIGZpZWxkcyBmb3IgdmFsaWRpdHkgKi8KKyAgaVNhbXBsZWRlcHRoID0gKihwUmF3ZGF0YSsxKTsKKyAgaUZpbGx0eXBlICAgID0gKihwUmF3ZGF0YSsyKTsKKworICBpZiAoKGlDb2xvcnR5cGUgIT0gTU5HX0NPTE9SVFlQRV9HUkFZICAgKSAmJgorICAgICAgKGlDb2xvcnR5cGUgIT0gTU5HX0NPTE9SVFlQRV9SR0IgICAgKSAmJgorICAgICAgKGlDb2xvcnR5cGUgIT0gTU5HX0NPTE9SVFlQRV9JTkRFWEVEKSAmJgorICAgICAgKGlDb2xvcnR5cGUgIT0gTU5HX0NPTE9SVFlQRV9HUkFZQSAgKSAmJgorICAgICAgKGlDb2xvcnR5cGUgIT0gTU5HX0NPTE9SVFlQRV9SR0JBICAgKSAgICApCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURDT0xPUlRZUEUpOworCisjaWZkZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyAgaWYgKGlTYW1wbGVkZXB0aCA9PSBNTkdfQklUREVQVEhfMTYgKQorICAgICAgaVNhbXBsZWRlcHRoID0gTU5HX0JJVERFUFRIXzg7CisjZW5kaWYKKworICBpZiAoKGlTYW1wbGVkZXB0aCAhPSBNTkdfQklUREVQVEhfMSApICYmCisgICAgICAoaVNhbXBsZWRlcHRoICE9IE1OR19CSVRERVBUSF8yICkgJiYKKyAgICAgIChpU2FtcGxlZGVwdGggIT0gTU5HX0JJVERFUFRIXzQgKSAmJgorICAgICAgKGlTYW1wbGVkZXB0aCAhPSBNTkdfQklUREVQVEhfOCApCisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgICAmJiAoaVNhbXBsZWRlcHRoICE9IE1OR19CSVRERVBUSF8xNikKKyNlbmRpZgorICAgICkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WU0FNUExFREVQVEgpOworCisgIGlmICgoaUZpbGx0eXBlICE9IE1OR19GSUxMTUVUSE9EX0xFRlRCSVRSRVBMSUNBVEUpICYmCisgICAgICAoaUZpbGx0eXBlICE9IE1OR19GSUxMTUVUSE9EX1pFUk9GSUxMICAgICAgICApICAgICkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WRklMTE1FVEhPRCk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCisgIHsKKyAgICBtbmdfcmV0Y29kZSBpUmV0Y29kZSA9IG1uZ19jcmVhdGVfYW5pX3Byb20gKHBEYXRhLCBpU2FtcGxlZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpQ29sb3J0eXBlLCBpRmlsbHR5cGUpOworCisvKiAgICBpZiAoIWlSZXRjb2RlKQorICAgICAgaVJldGNvZGUgPSBtbmdfcHJvY2Vzc19kaXNwbGF5X3Byb20gKHBEYXRhLCBpU2FtcGxlZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUNvbG9ydHlwZSwgaUZpbGx0eXBlKTsgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICByZXR1cm4gaVJldGNvZGU7CisgIH0KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisKKyNpZmRlZiBNTkdfU1RPUkVfQ0hVTktTCisgIGlmIChwRGF0YS0+YlN0b3JlY2h1bmtzKQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdGlhbGl6ZSBzdG9yYWdlICovCisgICAgbW5nX3JldGNvZGUgaVJldGNvZGUgPSAoKG1uZ19jaHVua19oZWFkZXJwKXBIZWFkZXIpLT5mQ3JlYXRlIChwRGF0YSwgcEhlYWRlciwgcHBDaHVuayk7CisKKyAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZSB0aGUgZmllbGRzICovCisgICAgKChtbmdfcHJvbXApKnBwQ2h1bmspLT5pQ29sb3J0eXBlICAgPSBpQ29sb3J0eXBlOworICAgICgobW5nX3Byb21wKSpwcENodW5rKS0+aVNhbXBsZWRlcHRoID0gaVNhbXBsZWRlcHRoOworICAgICgobW5nX3Byb21wKSpwcENodW5rKS0+aUZpbGx0eXBlICAgID0gaUZpbGx0eXBlOworICB9CisjZW5kaWYgLyogTU5HX1NUT1JFX0NIVU5LUyAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1JFQURfUFJPTSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7ICAgICAgICAgICAgICAgICAgLyogZG9uZSAqLworfQorI2VuZGlmCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworUkVBRF9DSFVOSyAobW5nX3JlYWRfaXBuZykKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVBRF9JUE5HLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXF1ZW5jZSBjaGVja3MgKi8KKyAgaWYgKCghcERhdGEtPmJIYXNNSERSKSB8fCAoIXBEYXRhLT5iSGFzREhEUikpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1NFUVVFTkNFRVJST1IpOworCisgIGlmIChpUmF3bGVuICE9IDApICAgICAgICAgICAgICAgICAgICAvKiBnb3R0YSBiZSBlbXB0eSAqLworICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElETEVOR1RIKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX0RJU1BMQVkKKyAgeworICAgIG1uZ19yZXRjb2RlIGlSZXRjb2RlID0gbW5nX2NyZWF0ZV9hbmlfaXBuZyAocERhdGEpOworCisgICAgaWYgKCFpUmV0Y29kZSkKKyAgICAgIGlSZXRjb2RlID0gbW5nX3Byb2Nlc3NfZGlzcGxheV9pcG5nIChwRGF0YSk7CisKKyAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICByZXR1cm4gaVJldGNvZGU7CisKKyAgfQorI2VuZGlmIC8qIE1OR19TVVBQT1JUX0RJU1BMQVkgKi8KKworI2lmZGVmIE1OR19TVE9SRV9DSFVOS1MKKyAgaWYgKHBEYXRhLT5iU3RvcmVjaHVua3MpCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0aWFsaXplIHN0b3JhZ2UgKi8KKyAgICBtbmdfcmV0Y29kZSBpUmV0Y29kZSA9ICgobW5nX2NodW5rX2hlYWRlcnApcEhlYWRlciktPmZDcmVhdGUgKHBEYXRhLCBwSGVhZGVyLCBwcENodW5rKTsKKworICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgfQorI2VuZGlmIC8qIE1OR19TVE9SRV9DSFVOS1MgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9SRUFEX0lQTkcsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOyAgICAgICAgICAgICAgICAgIC8qIGRvbmUgKi8KK30KKyNlbmRpZgorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKK1JFQURfQ0hVTksgKG1uZ19yZWFkX3BwbHQpCit7CisgIG1uZ191aW50OCAgICAgaURlbHRhdHlwZTsKKyAgbW5nX3VpbnQ4cCAgICBwVGVtcDsKKyAgbW5nX3VpbnQzMiAgICBpTGVuOworICBtbmdfdWludDggICAgIGlYLCBpTTsKKyAgbW5nX3VpbnQzMiAgICBpWTsKKyAgbW5nX3VpbnQzMiAgICBpTWF4OworICBtbmdfcmdicGFsdGFiIGFJbmRleGVudHJpZXM7CisgIG1uZ191aW50OGFyciAgYUFscGhhZW50cmllczsKKyAgbW5nX3VpbnQ4YXJyICBhVXNlZGVudHJpZXM7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVBRF9QUExULCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXF1ZW5jZSBjaGVja3MgKi8KKyAgaWYgKCghcERhdGEtPmJIYXNNSERSKSAmJiAoIXBEYXRhLT5iSGFzREhEUikpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1NFUVVFTkNFRVJST1IpOworCisgIGlmIChpUmF3bGVuIDwgMSkgICAgICAgICAgICAgICAgICAgICAvKiBtdXN0IGhhdmUgYXQgbGVhc3QgMSBieXRlICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURMRU5HVEgpOworCisgIGlEZWx0YXR5cGUgPSAqcFJhd2RhdGE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2YWxpZCA/ICovCisgIGlmIChpRGVsdGF0eXBlID4gTU5HX0RFTFRBVFlQRV9ERUxUQVJHQkEpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkRFTFRBVFlQRSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtdXN0IGJlIGluZGV4ZWQgY29sb3IgISAqLworICBpZiAocERhdGEtPmlDb2xvcnR5cGUgIT0gTU5HX0NPTE9SVFlQRV9JTkRFWEVEKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElEQ09MT1JUWVBFKTsKKworICBwVGVtcCA9IHBSYXdkYXRhICsgMTsKKyAgaUxlbiAgPSBpUmF3bGVuIC0gMTsKKyAgaU1heCAgPSAwOworCisgIGZvciAoaVkgPSAwOyBpWSA8IDI1NjsgaVkrKykgICAgICAgICAvKiByZXNldCBhcnJheXMgKi8KKyAgeworICAgIGFJbmRleGVudHJpZXMgW2lZXS5pUmVkICAgPSAwOworICAgIGFJbmRleGVudHJpZXMgW2lZXS5pR3JlZW4gPSAwOworICAgIGFJbmRleGVudHJpZXMgW2lZXS5pQmx1ZSAgPSAwOworICAgIGFBbHBoYWVudHJpZXMgW2lZXSAgICAgICAgPSAyNTU7CisgICAgYVVzZWRlbnRyaWVzICBbaVldICAgICAgICA9IDA7CisgIH0KKworICB3aGlsZSAoaUxlbikgICAgICAgICAgICAgICAgICAgICAgICAgLyogYXMgbG9uZyBhcyB0aGVyZSBhcmUgZW50cmllcyBsZWZ0IC4uLiAqLworICB7CisgICAgbW5nX3VpbnQzMiBpRGlmZjsKKworICAgIGlmIChpTGVuIDwgMikKKyAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElETEVOR1RIKTsKKworICAgIGlYID0gKnBUZW1wOyAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0IHN0YXJ0IGFuZCBlbmQgaW5kZXggKi8KKyAgICBpTSA9ICoocFRlbXArMSk7CisKKyAgICBpZiAoaU0gPCBpWCkKKyAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElESU5ERVgpOworCisgICAgaWYgKChtbmdfdWludDMyKWlNID49IGlNYXgpICAgICAgICAvKiBkZXRlcm1pbmUgaGlnaGVzdCB1c2VkIGluZGV4ICovCisgICAgICBpTWF4ID0gKG1uZ191aW50MzIpaU0gKyAxOworCisgICAgcFRlbXAgKz0gMjsKKyAgICBpTGVuICAtPSAyOworICAgIGlEaWZmID0gKGlNIC0gaVggKyAxKTsKKyAgICBpZiAoKGlEZWx0YXR5cGUgPT0gTU5HX0RFTFRBVFlQRV9SRVBMQUNFUkdCICApIHx8CisgICAgICAgIChpRGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfREVMVEFSR0IgICAgKSAgICApCisgICAgICBpRGlmZiA9IGlEaWZmICogMzsKKyAgICBlbHNlCisgICAgaWYgKChpRGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfUkVQTEFDRVJHQkEpIHx8CisgICAgICAgIChpRGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfREVMVEFSR0JBICApICAgICkKKyAgICAgIGlEaWZmID0gaURpZmYgKiA0OworCisgICAgaWYgKGlMZW4gPCBpRGlmZikKKyAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElETEVOR1RIKTsKKworICAgIGlmICgoaURlbHRhdHlwZSA9PSBNTkdfREVMVEFUWVBFX1JFUExBQ0VSR0IgICkgfHwKKyAgICAgICAgKGlEZWx0YXR5cGUgPT0gTU5HX0RFTFRBVFlQRV9ERUxUQVJHQiAgICApICAgICkKKyAgICB7CisgICAgICBmb3IgKGlZID0gKG1uZ191aW50MzIpaVg7IGlZIDw9IChtbmdfdWludDMyKWlNOyBpWSsrKQorICAgICAgeworICAgICAgICBhSW5kZXhlbnRyaWVzIFtpWV0uaVJlZCAgID0gKnBUZW1wOworICAgICAgICBhSW5kZXhlbnRyaWVzIFtpWV0uaUdyZWVuID0gKihwVGVtcCsxKTsKKyAgICAgICAgYUluZGV4ZW50cmllcyBbaVldLmlCbHVlICA9ICoocFRlbXArMik7CisgICAgICAgIGFVc2VkZW50cmllcyAgW2lZXSAgICAgICAgPSAxOworCisgICAgICAgIHBUZW1wICs9IDM7CisgICAgICAgIGlMZW4gIC09IDM7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICBpZiAoKGlEZWx0YXR5cGUgPT0gTU5HX0RFTFRBVFlQRV9SRVBMQUNFQUxQSEEpIHx8CisgICAgICAgIChpRGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfREVMVEFBTFBIQSAgKSAgICApCisgICAgeworICAgICAgZm9yIChpWSA9IChtbmdfdWludDMyKWlYOyBpWSA8PSAobW5nX3VpbnQzMilpTTsgaVkrKykKKyAgICAgIHsKKyAgICAgICAgYUFscGhhZW50cmllcyBbaVldICAgICAgICA9ICpwVGVtcDsKKyAgICAgICAgYVVzZWRlbnRyaWVzICBbaVldICAgICAgICA9IDE7CisKKyAgICAgICAgcFRlbXArKzsKKyAgICAgICAgaUxlbi0tOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgZm9yIChpWSA9IChtbmdfdWludDMyKWlYOyBpWSA8PSAobW5nX3VpbnQzMilpTTsgaVkrKykKKyAgICAgIHsKKyAgICAgICAgYUluZGV4ZW50cmllcyBbaVldLmlSZWQgICA9ICpwVGVtcDsKKyAgICAgICAgYUluZGV4ZW50cmllcyBbaVldLmlHcmVlbiA9ICoocFRlbXArMSk7CisgICAgICAgIGFJbmRleGVudHJpZXMgW2lZXS5pQmx1ZSAgPSAqKHBUZW1wKzIpOworICAgICAgICBhQWxwaGFlbnRyaWVzIFtpWV0gICAgICAgID0gKihwVGVtcCszKTsKKyAgICAgICAgYVVzZWRlbnRyaWVzICBbaVldICAgICAgICA9IDE7CisKKyAgICAgICAgcFRlbXAgKz0gNDsKKyAgICAgICAgaUxlbiAgLT0gNDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBzd2l0Y2ggKHBEYXRhLT5pQml0ZGVwdGgpICAgICAgICAgICAgLyogY2hlY2sgbWF4aW11bSBhbGxvd2VkIGVudHJpZXMgZm9yIGJpdGRlcHRoICovCisgIHsKKyAgICBjYXNlIE1OR19CSVRERVBUSF8xIDogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpTWF4ID4gMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElESU5ERVgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgY2FzZSBNTkdfQklUREVQVEhfMiA6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaU1heCA+IDQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRElOREVYKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgIGNhc2UgTU5HX0JJVERFUFRIXzQgOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlNYXggPiAxNikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElESU5ERVgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX0RJU1BMQVkKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSBhbmltYXRpb24gb2JqZWN0ICovCisgICAgbW5nX3JldGNvZGUgaVJldGNvZGUgPSBtbmdfY3JlYXRlX2FuaV9wcGx0IChwRGF0YSwgaURlbHRhdHlwZSwgaU1heCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFJbmRleGVudHJpZXMsIGFBbHBoYWVudHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVXNlZGVudHJpZXMpOworCisvKiAgICBpZiAoIWlSZXRjb2RlKQorICAgICAgaVJldGNvZGUgPSBtbmdfcHJvY2Vzc19kaXNwbGF5X3BwbHQgKHBEYXRhLCBpRGVsdGF0eXBlLCBpTWF4LCBhSW5kZXhlbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFBbHBoYWVudHJpZXMsIGFVc2VkZW50cmllcyk7ICovCisKKyAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICByZXR1cm4gaVJldGNvZGU7CisKKyAgfQorI2VuZGlmIC8qIE1OR19TVVBQT1JUX0RJU1BMQVkgKi8KKworI2lmZGVmIE1OR19TVE9SRV9DSFVOS1MKKyAgaWYgKHBEYXRhLT5iU3RvcmVjaHVua3MpCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0aWFsaXplIHN0b3JhZ2UgKi8KKyAgICBtbmdfcmV0Y29kZSBpUmV0Y29kZSA9ICgobW5nX2NodW5rX2hlYWRlcnApcEhlYWRlciktPmZDcmVhdGUgKHBEYXRhLCBwSGVhZGVyLCBwcENodW5rKTsKKworICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlIHRoZSBmaWVsZHMgKi8KKyAgICAoKG1uZ19wcGx0cCkqcHBDaHVuayktPmlEZWx0YXR5cGUgPSBpRGVsdGF0eXBlOworICAgICgobW5nX3BwbHRwKSpwcENodW5rKS0+aUNvdW50ICAgICA9IGlNYXg7CisKKyAgICBmb3IgKGlZID0gMDsgaVkgPCAyNTY7IGlZKyspCisgICAgeworICAgICAgKChtbmdfcHBsdHApKnBwQ2h1bmspLT5hRW50cmllcyBbaVldLmlSZWQgICA9IGFJbmRleGVudHJpZXMgW2lZXS5pUmVkOworICAgICAgKChtbmdfcHBsdHApKnBwQ2h1bmspLT5hRW50cmllcyBbaVldLmlHcmVlbiA9IGFJbmRleGVudHJpZXMgW2lZXS5pR3JlZW47CisgICAgICAoKG1uZ19wcGx0cCkqcHBDaHVuayktPmFFbnRyaWVzIFtpWV0uaUJsdWUgID0gYUluZGV4ZW50cmllcyBbaVldLmlCbHVlOworICAgICAgKChtbmdfcHBsdHApKnBwQ2h1bmspLT5hRW50cmllcyBbaVldLmlBbHBoYSA9IGFBbHBoYWVudHJpZXMgW2lZXTsKKyAgICAgICgobW5nX3BwbHRwKSpwcENodW5rKS0+YUVudHJpZXMgW2lZXS5iVXNlZCAgPSAobW5nX2Jvb2wpKGFVc2VkZW50cmllcyBbaVldKTsKKyAgICB9CisgIH0KKyNlbmRpZiAvKiBNTkdfU1RPUkVfQ0hVTktTICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVBRF9QUExULCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsgICAgICAgICAgICAgICAgICAvKiBkb25lICovCit9CisjZW5kaWYKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCitSRUFEX0NIVU5LIChtbmdfcmVhZF9pam5nKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9SRUFEX0lKTkcsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNlcXVlbmNlIGNoZWNrcyAqLworICBpZiAoKCFwRGF0YS0+Ykhhc01IRFIpIHx8ICghcERhdGEtPmJIYXNESERSKSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfU0VRVUVOQ0VFUlJPUik7CisKKyAgaWYgKGlSYXdsZW4gIT0gMCkgICAgICAgICAgICAgICAgICAgIC8qIGdvdHRhIGJlIGVtcHR5ICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURMRU5HVEgpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorICB7CisgICAgbW5nX3JldGNvZGUgaVJldGNvZGUgPSBtbmdfY3JlYXRlX2FuaV9pam5nIChwRGF0YSk7CisKKyAgICBpZiAoIWlSZXRjb2RlKQorICAgICAgaVJldGNvZGUgPSBtbmdfcHJvY2Vzc19kaXNwbGF5X2lqbmcgKHBEYXRhKTsKKworICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKworICB9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfRElTUExBWSAqLworCisjaWZkZWYgTU5HX1NUT1JFX0NIVU5LUworICBpZiAocERhdGEtPmJTdG9yZWNodW5rcykKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpemUgc3RvcmFnZSAqLworICAgIG1uZ19yZXRjb2RlIGlSZXRjb2RlID0gKChtbmdfY2h1bmtfaGVhZGVycClwSGVhZGVyKS0+ZkNyZWF0ZSAocERhdGEsIHBIZWFkZXIsIHBwQ2h1bmspOworCisgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgcmV0dXJuIGlSZXRjb2RlOworICB9CisjZW5kaWYgLyogTU5HX1NUT1JFX0NIVU5LUyAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1JFQURfSUpORywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7ICAgICAgICAgICAgICAgICAgLyogZG9uZSAqLworfQorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCitSRUFEX0NIVU5LIChtbmdfcmVhZF9kcm9wKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9SRUFEX0RST1AsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNlcXVlbmNlIGNoZWNrcyAqLworICBpZiAoKCFwRGF0YS0+Ykhhc01IRFIpIHx8ICghcERhdGEtPmJIYXNESERSKSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfU0VRVUVOQ0VFUlJPUik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGVjayBsZW5ndGggKi8KKyAgaWYgKChpUmF3bGVuIDwgNCkgfHwgKChpUmF3bGVuICUgNCkgIT0gMCkpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURMRU5HVEgpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorICB7CisKKworICAgIC8qIFRPRE86IHNvbWV0aGluZyAhISEgKi8KKworCisgIH0KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisKKyNpZmRlZiBNTkdfU1RPUkVfQ0hVTktTCisgIGlmIChwRGF0YS0+YlN0b3JlY2h1bmtzKQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdGlhbGl6ZSBzdG9yYWdlICovCisgICAgbW5nX3JldGNvZGUgaVJldGNvZGUgPSAoKG1uZ19jaHVua19oZWFkZXJwKXBIZWFkZXIpLT5mQ3JlYXRlIChwRGF0YSwgcEhlYWRlciwgcHBDaHVuayk7CisKKyAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZSB0aGUgZmllbGRzICovCisgICAgKChtbmdfZHJvcHApKnBwQ2h1bmspLT5pQ291bnQgPSBpUmF3bGVuIC8gNDsKKworICAgIGlmIChpUmF3bGVuKQorICAgIHsKKyAgICAgIG1uZ191aW50MzIgICAgICBpWDsKKyAgICAgIG1uZ191aW50OHAgICAgICBwVGVtcCA9IHBSYXdkYXRhOworICAgICAgbW5nX3VpbnQzMnAgICAgIHBFbnRyeTsKKworICAgICAgTU5HX0FMTE9DIChwRGF0YSwgcEVudHJ5LCBpUmF3bGVuKTsKKworICAgICAgKChtbmdfZHJvcHApKnBwQ2h1bmspLT5wQ2h1bmtuYW1lcyA9IChtbmdfcHRyKXBFbnRyeTsKKworICAgICAgZm9yIChpWCA9IDA7IGlYIDwgaVJhd2xlbiAvIDQ7IGlYKyspCisgICAgICB7CisgICAgICAgICpwRW50cnkgPSBtbmdfZ2V0X3VpbnQzMiAocFRlbXApOworCisgICAgICAgIHBUZW1wICArPSA0OworICAgICAgICBwRW50cnkrKzsKKyAgICAgIH0KKyAgICB9CisgIH0KKyNlbmRpZiAvKiBNTkdfU1RPUkVfQ0hVTktTICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVBRF9EUk9QLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsgICAgICAgICAgICAgICAgICAvKiBkb25lICovCit9CisjZW5kaWYKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfREJZSworUkVBRF9DSFVOSyAobW5nX3JlYWRfZGJ5aykKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVBRF9EQllLLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXF1ZW5jZSBjaGVja3MgKi8KKyAgaWYgKCghcERhdGEtPmJIYXNNSERSKSB8fCAoIXBEYXRhLT5iSGFzREhEUikpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1NFUVVFTkNFRVJST1IpOworCisgIGlmIChpUmF3bGVuIDwgNikgICAgICAgICAgICAgICAgICAgICAvKiBtdXN0IGJlIGF0IGxlYXN0IDYgbG9uZyAqLworICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElETEVOR1RIKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX0RJU1BMQVkKKyAgeworCisKKyAgICAvKiBUT0RPOiBzb21ldGhpbmcgISEhICovCisKKworICB9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfRElTUExBWSAqLworCisjaWZkZWYgTU5HX1NUT1JFX0NIVU5LUworICBpZiAocERhdGEtPmJTdG9yZWNodW5rcykKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpemUgc3RvcmFnZSAqLworICAgIG1uZ19yZXRjb2RlIGlSZXRjb2RlID0gKChtbmdfY2h1bmtfaGVhZGVycClwSGVhZGVyKS0+ZkNyZWF0ZSAocERhdGEsIHBIZWFkZXIsIHBwQ2h1bmspOworCisgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgcmV0dXJuIGlSZXRjb2RlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmUgdGhlIGZpZWxkcyAqLworICAgICgobW5nX2RieWtwKSpwcENodW5rKS0+aUNodW5rbmFtZSAgICA9IG1uZ19nZXRfdWludDMyIChwUmF3ZGF0YSk7CisgICAgKChtbmdfZGJ5a3ApKnBwQ2h1bmspLT5pUG9sYXJpdHkgICAgID0gKihwUmF3ZGF0YSs0KTsKKyAgICAoKG1uZ19kYnlrcCkqcHBDaHVuayktPmlLZXl3b3Jkc3NpemUgPSBpUmF3bGVuIC0gNTsKKworICAgIGlmIChpUmF3bGVuID4gNSkKKyAgICB7CisgICAgICBNTkdfQUxMT0MgKHBEYXRhLCAoKG1uZ19kYnlrcCkqcHBDaHVuayktPnpLZXl3b3JkcywgaVJhd2xlbi00KTsKKyAgICAgIE1OR19DT1BZICgoKG1uZ19kYnlrcCkqcHBDaHVuayktPnpLZXl3b3JkcywgcFJhd2RhdGErNSwgaVJhd2xlbi01KTsKKyAgICB9CisgIH0KKyNlbmRpZiAvKiBNTkdfU1RPUkVfQ0hVTktTICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVBRF9EQllLLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsgICAgICAgICAgICAgICAgICAvKiBkb25lICovCit9CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19PUkRSCitSRUFEX0NIVU5LIChtbmdfcmVhZF9vcmRyKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9SRUFEX09SRFIsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNlcXVlbmNlIGNoZWNrcyAqLworICBpZiAoKCFwRGF0YS0+Ykhhc01IRFIpIHx8ICghcERhdGEtPmJIYXNESERSKSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfU0VRVUVOQ0VFUlJPUik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGVjayBsZW5ndGggKi8KKyAgaWYgKChpUmF3bGVuIDwgNSkgfHwgKChpUmF3bGVuICUgNSkgIT0gMCkpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURMRU5HVEgpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorICB7CisKKworICAgIC8qIFRPRE86IHNvbWV0aGluZyAhISEgKi8KKworCisgIH0KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisKKyNpZmRlZiBNTkdfU1RPUkVfQ0hVTktTCisgIGlmIChwRGF0YS0+YlN0b3JlY2h1bmtzKQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdGlhbGl6ZSBzdG9yYWdlICovCisgICAgbW5nX3JldGNvZGUgaVJldGNvZGUgPSAoKG1uZ19jaHVua19oZWFkZXJwKXBIZWFkZXIpLT5mQ3JlYXRlIChwRGF0YSwgcEhlYWRlciwgcHBDaHVuayk7CisKKyAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZSB0aGUgZmllbGRzICovCisgICAgKChtbmdfb3JkcnApKnBwQ2h1bmspLT5pQ291bnQgPSBpUmF3bGVuIC8gNTsKKworICAgIGlmIChpUmF3bGVuKQorICAgIHsKKyAgICAgIG1uZ191aW50MzIgICAgICBpWDsKKyAgICAgIG1uZ19vcmRyX2VudHJ5cCBwRW50cnk7CisgICAgICBtbmdfdWludDhwICAgICAgcFRlbXAgPSBwUmF3ZGF0YTsKKyAgICAgIAorICAgICAgTU5HX0FMTE9DIChwRGF0YSwgcEVudHJ5LCBpUmF3bGVuKTsKKworICAgICAgKChtbmdfb3JkcnApKnBwQ2h1bmspLT5wRW50cmllcyA9IHBFbnRyeTsKKworICAgICAgZm9yIChpWCA9IDA7IGlYIDwgaVJhd2xlbiAvIDU7IGlYKyspCisgICAgICB7CisgICAgICAgIHBFbnRyeS0+aUNodW5rbmFtZSA9IG1uZ19nZXRfdWludDMyIChwVGVtcCk7CisgICAgICAgIHBFbnRyeS0+aU9yZGVydHlwZSA9ICoocFRlbXArNCk7CisKKyAgICAgICAgcFRlbXAgKz0gNTsKKyAgICAgICAgcEVudHJ5Kys7CisgICAgICB9CisgICAgfQorICB9CisjZW5kaWYgLyogTU5HX1NUT1JFX0NIVU5LUyAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1JFQURfT1JEUiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7ICAgICAgICAgICAgICAgICAgLyogZG9uZSAqLworfQorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX01BR04KK1JFQURfQ0hVTksgKG1uZ19yZWFkX21hZ24pCit7CisgIG1uZ191aW50MTYgaUZpcnN0aWQsIGlMYXN0aWQ7CisgIG1uZ191aW50OCAgaU1ldGhvZFgsIGlNZXRob2RZOworICBtbmdfdWludDE2IGlNWCwgaU1ZLCBpTUwsIGlNUiwgaU1ULCBpTUI7CisgIG1uZ19ib29sICAgYkZhdWx0eTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9SRUFEX01BR04sIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNlcXVlbmNlIGNoZWNrcyAqLworI2lmZGVmIE1OR19TVVBQT1JUX0pORworICBpZiAoKCFwRGF0YS0+Ykhhc01IRFIpIHx8IChwRGF0YS0+Ykhhc0lIRFIpIHx8IChwRGF0YS0+Ykhhc0RIRFIpIHx8IChwRGF0YS0+Ykhhc0pIRFIpKQorI2Vsc2UKKyAgaWYgKCghcERhdGEtPmJIYXNNSERSKSB8fCAocERhdGEtPmJIYXNJSERSKSB8fCAocERhdGEtPmJIYXNESERSKSkKKyNlbmRpZgorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19TRVFVRU5DRUVSUk9SKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoZWNrIGxlbmd0aCAqLworICBpZiAoaVJhd2xlbiA+IDIwKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElETEVOR1RIKTsKKworICAvKiBmb2xsb3dpbmcgaXMgYW4gdWdseSBoYWNrIHRvIGFsbG93IGZhdWx0eSBsYXlvdXQgY2F1c2VkIGJ5IHByZXZpb3VzCisgICAgIHZlcnNpb25zIG9mIGxpYm1uZyBhbmQgTU5HZXllLCB3aGljaCB3cm90ZSBNQUdOIHdpdGggYSAxNi1iaXQKKyAgICAgTWV0aG9kWC9NZXRob2RZIChhcyBvcHBvc2VkIHRvIHRoZSBwcm9wZXIgOC1iaXQgYXMgZGVmaW5lZCBpbiB0aGUgc3BlYyEpICovCisKKyAgaWYgKChpUmF3bGVuID09ICA2KSB8fCAoaVJhd2xlbiA9PSAgOCkgfHwgKGlSYXdsZW4gPT0gMTApIHx8IChpUmF3bGVuID09IDEyKSB8fAorICAgICAgKGlSYXdsZW4gPT0gMTQpIHx8IChpUmF3bGVuID09IDE2KSB8fCAoaVJhd2xlbiA9PSAyMCkpCisgICAgYkZhdWx0eSA9IE1OR19UUlVFOyAgICAgICAgICAgICAgICAvKiB0aGVzZSBsZW5ndGhzIGFyZSBhbGwgd3JvbmcgKi8KKyAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxlbmd0aCAxOCBjYW4gYmUgcmlnaHQgb3Igd3JvbmcgISEhICovCisgIGlmICgoaVJhd2xlbiA9PSAgMTgpICYmIChtbmdfZ2V0X3VpbnQxNiAocFJhd2RhdGErNCkgPD0gNSkgJiYKKyAgICAgIChtbmdfZ2V0X3VpbnQxNiAocFJhd2RhdGErNikgIDwgMjU2KSAmJgorICAgICAgKG1uZ19nZXRfdWludDE2IChwUmF3ZGF0YSs4KSAgPCAyNTYpICYmCisgICAgICAobW5nX2dldF91aW50MTYgKHBSYXdkYXRhKzEwKSA8IDI1NikgJiYKKyAgICAgIChtbmdfZ2V0X3VpbnQxNiAocFJhd2RhdGErMTIpIDwgMjU2KSAmJgorICAgICAgKG1uZ19nZXRfdWludDE2IChwUmF3ZGF0YSsxNCkgPCAyNTYpICYmCisgICAgICAobW5nX2dldF91aW50MTYgKHBSYXdkYXRhKzE2KSA8IDI1NikpCisgICAgYkZhdWx0eSA9IE1OR19UUlVFOyAgICAgICAgICAgICAgICAvKiB0aGlzIGlzIHZlcnkgbGlrZWx5IHRoZSB3cm9uZyBsYXlvdXQgKi8KKyAgZWxzZQorICAgIGJGYXVsdHkgPSBNTkdfRkFMU0U7ICAgICAgICAgICAgICAgLyogYWxsIG90aGVyIGNhc2VzIGFyZSBoYW5kbGVkIGFzIHJpZ2h0ICovCisKKyAgaWYgKGJGYXVsdHkpICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdyb25nIGxheW91dCA/ICovCisgIHsKKyAgICBpZiAoaVJhd2xlbiA+IDApICAgICAgICAgICAgICAgICAgIC8qIGdldCB0aGUgZmllbGRzICovCisgICAgICBpRmlyc3RpZCA9IG1uZ19nZXRfdWludDE2IChwUmF3ZGF0YSk7CisgICAgZWxzZQorICAgICAgaUZpcnN0aWQgPSAwOworCisgICAgaWYgKGlSYXdsZW4gPiAyKQorICAgICAgaUxhc3RpZCAgPSBtbmdfZ2V0X3VpbnQxNiAocFJhd2RhdGErMik7CisgICAgZWxzZQorICAgICAgaUxhc3RpZCAgPSBpRmlyc3RpZDsKKworICAgIGlmIChpUmF3bGVuID4gNCkKKyAgICAgIGlNZXRob2RYID0gKG1uZ191aW50OCkobW5nX2dldF91aW50MTYgKHBSYXdkYXRhKzQpKTsKKyAgICBlbHNlCisgICAgICBpTWV0aG9kWCA9IDA7CisKKyAgICBpZiAoaVJhd2xlbiA+IDYpCisgICAgICBpTVggICAgICA9IG1uZ19nZXRfdWludDE2IChwUmF3ZGF0YSs2KTsKKyAgICBlbHNlCisgICAgICBpTVggICAgICA9IDE7CisKKyAgICBpZiAoaVJhd2xlbiA+IDgpCisgICAgICBpTVkgICAgICA9IG1uZ19nZXRfdWludDE2IChwUmF3ZGF0YSs4KTsKKyAgICBlbHNlCisgICAgICBpTVkgICAgICA9IGlNWDsKKworICAgIGlmIChpUmF3bGVuID4gMTApCisgICAgICBpTUwgICAgICA9IG1uZ19nZXRfdWludDE2IChwUmF3ZGF0YSsxMCk7CisgICAgZWxzZQorICAgICAgaU1MICAgICAgPSBpTVg7CisKKyAgICBpZiAoaVJhd2xlbiA+IDEyKQorICAgICAgaU1SICAgICAgPSBtbmdfZ2V0X3VpbnQxNiAocFJhd2RhdGErMTIpOworICAgIGVsc2UKKyAgICAgIGlNUiAgICAgID0gaU1YOworCisgICAgaWYgKGlSYXdsZW4gPiAxNCkKKyAgICAgIGlNVCAgICAgID0gbW5nX2dldF91aW50MTYgKHBSYXdkYXRhKzE0KTsKKyAgICBlbHNlCisgICAgICBpTVQgICAgICA9IGlNWTsKKworICAgIGlmIChpUmF3bGVuID4gMTYpCisgICAgICBpTUIgICAgICA9IG1uZ19nZXRfdWludDE2IChwUmF3ZGF0YSsxNik7CisgICAgZWxzZQorICAgICAgaU1CICAgICAgPSBpTVk7CisKKyAgICBpZiAoaVJhd2xlbiA+IDE4KQorICAgICAgaU1ldGhvZFkgPSAobW5nX3VpbnQ4KShtbmdfZ2V0X3VpbnQxNiAocFJhd2RhdGErMTgpKTsKKyAgICBlbHNlCisgICAgICBpTWV0aG9kWSA9IGlNZXRob2RYOworICB9CisgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcm9wZXIgbGF5b3V0ICEhISEgKi8KKyAgeworICAgIGlmIChpUmF3bGVuID4gMCkgICAgICAgICAgICAgICAgICAgLyogZ2V0IHRoZSBmaWVsZHMgKi8KKyAgICAgIGlGaXJzdGlkID0gbW5nX2dldF91aW50MTYgKHBSYXdkYXRhKTsKKyAgICBlbHNlCisgICAgICBpRmlyc3RpZCA9IDA7CisKKyAgICBpZiAoaVJhd2xlbiA+IDIpCisgICAgICBpTGFzdGlkICA9IG1uZ19nZXRfdWludDE2IChwUmF3ZGF0YSsyKTsKKyAgICBlbHNlCisgICAgICBpTGFzdGlkICA9IGlGaXJzdGlkOworCisgICAgaWYgKGlSYXdsZW4gPiA0KQorICAgICAgaU1ldGhvZFggPSAqKHBSYXdkYXRhKzQpOworICAgIGVsc2UKKyAgICAgIGlNZXRob2RYID0gMDsKKworICAgIGlmIChpUmF3bGVuID4gNSkKKyAgICAgIGlNWCAgICAgID0gbW5nX2dldF91aW50MTYgKHBSYXdkYXRhKzUpOworICAgIGVsc2UKKyAgICAgIGlNWCAgICAgID0gMTsKKworICAgIGlmIChpUmF3bGVuID4gNykKKyAgICAgIGlNWSAgICAgID0gbW5nX2dldF91aW50MTYgKHBSYXdkYXRhKzcpOworICAgIGVsc2UKKyAgICAgIGlNWSAgICAgID0gaU1YOworCisgICAgaWYgKGlSYXdsZW4gPiA5KQorICAgICAgaU1MICAgICAgPSBtbmdfZ2V0X3VpbnQxNiAocFJhd2RhdGErOSk7CisgICAgZWxzZQorICAgICAgaU1MICAgICAgPSBpTVg7CisKKyAgICBpZiAoaVJhd2xlbiA+IDExKQorICAgICAgaU1SICAgICAgPSBtbmdfZ2V0X3VpbnQxNiAocFJhd2RhdGErMTEpOworICAgIGVsc2UKKyAgICAgIGlNUiAgICAgID0gaU1YOworCisgICAgaWYgKGlSYXdsZW4gPiAxMykKKyAgICAgIGlNVCAgICAgID0gbW5nX2dldF91aW50MTYgKHBSYXdkYXRhKzEzKTsKKyAgICBlbHNlCisgICAgICBpTVQgICAgICA9IGlNWTsKKworICAgIGlmIChpUmF3bGVuID4gMTUpCisgICAgICBpTUIgICAgICA9IG1uZ19nZXRfdWludDE2IChwUmF3ZGF0YSsxNSk7CisgICAgZWxzZQorICAgICAgaU1CICAgICAgPSBpTVk7CisKKyAgICBpZiAoaVJhd2xlbiA+IDE3KQorICAgICAgaU1ldGhvZFkgPSAqKHBSYXdkYXRhKzE3KTsKKyAgICBlbHNlCisgICAgICBpTWV0aG9kWSA9IGlNZXRob2RYOworICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGVjayBmaWVsZCB2YWxpZGl0eSAqLworICBpZiAoKGlNZXRob2RYID4gNSkgfHwgKGlNZXRob2RZID4gNSkpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURNRVRIT0QpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorICB7CisgICAgbW5nX3JldGNvZGUgaVJldGNvZGU7CisKKyAgICBpUmV0Y29kZSA9IG1uZ19jcmVhdGVfYW5pX21hZ24gKHBEYXRhLCBpRmlyc3RpZCwgaUxhc3RpZCwgaU1ldGhvZFgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpTVgsIGlNWSwgaU1MLCBpTVIsIGlNVCwgaU1CLCBpTWV0aG9kWSk7CisKKy8qICAgIGlmICghaVJldGNvZGUpCisgICAgICBpUmV0Y29kZSA9IG1uZ19wcm9jZXNzX2Rpc3BsYXlfbWFnbiAocERhdGEsIGlGaXJzdGlkLCBpTGFzdGlkLCBpTWV0aG9kWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpTVgsIGlNWSwgaU1MLCBpTVIsIGlNVCwgaU1CLCBpTWV0aG9kWSk7ICovCisKKyAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICByZXR1cm4gaVJldGNvZGU7CisKKyAgfQorI2VuZGlmIC8qIE1OR19TVVBQT1JUX0RJU1BMQVkgKi8KKworI2lmZGVmIE1OR19TVE9SRV9DSFVOS1MKKyAgaWYgKHBEYXRhLT5iU3RvcmVjaHVua3MpCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0aWFsaXplIHN0b3JhZ2UgKi8KKyAgICBtbmdfcmV0Y29kZSBpUmV0Y29kZSA9ICgobW5nX2NodW5rX2hlYWRlcnApcEhlYWRlciktPmZDcmVhdGUgKHBEYXRhLCBwSGVhZGVyLCBwcENodW5rKTsKKworICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlIHRoZSBmaWVsZHMgKi8KKyAgICAoKG1uZ19tYWducCkqcHBDaHVuayktPmlGaXJzdGlkID0gaUZpcnN0aWQ7CisgICAgKChtbmdfbWFnbnApKnBwQ2h1bmspLT5pTGFzdGlkICA9IGlMYXN0aWQ7CisgICAgKChtbmdfbWFnbnApKnBwQ2h1bmspLT5pTWV0aG9kWCA9IGlNZXRob2RYOworICAgICgobW5nX21hZ25wKSpwcENodW5rKS0+aU1YICAgICAgPSBpTVg7CisgICAgKChtbmdfbWFnbnApKnBwQ2h1bmspLT5pTVkgICAgICA9IGlNWTsKKyAgICAoKG1uZ19tYWducCkqcHBDaHVuayktPmlNTCAgICAgID0gaU1MOworICAgICgobW5nX21hZ25wKSpwcENodW5rKS0+aU1SICAgICAgPSBpTVI7CisgICAgKChtbmdfbWFnbnApKnBwQ2h1bmspLT5pTVQgICAgICA9IGlNVDsKKyAgICAoKG1uZ19tYWducCkqcHBDaHVuayktPmlNQiAgICAgID0gaU1COworICAgICgobW5nX21hZ25wKSpwcENodW5rKS0+aU1ldGhvZFkgPSBpTWV0aG9kWTsKKyAgfQorI2VuZGlmIC8qIE1OR19TVE9SRV9DSFVOS1MgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9SRUFEX01BR04sIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOyAgICAgICAgICAgICAgICAgIC8qIGRvbmUgKi8KK30KKyNlbmRpZgorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisjaWZkZWYgTU5HX0lOQ0xVREVfTVBOR19QUk9QT1NBTAorUkVBRF9DSFVOSyAobW5nX3JlYWRfbXBuZykKK3sKKyAgbW5nX3VpbnQzMiAgaUZyYW1ld2lkdGg7CisgIG1uZ191aW50MzIgIGlGcmFtZWhlaWdodDsKKyAgbW5nX3VpbnQxNiAgaVRpY2tzcGVyc2VjOworICBtbmdfdWludDMyICBpRnJhbWVzc2l6ZTsKKyAgbW5nX3VpbnQzMiAgaUNvbXByZXNzZWRzaXplOworI2lmIGRlZmluZWQoTU5HX1NVUFBPUlRfRElTUExBWSkgfHwgZGVmaW5lZChNTkdfU1RPUkVfQ0hVTktTKQorICBtbmdfcmV0Y29kZSBpUmV0Y29kZTsKKyAgbW5nX3VpbnQxNiAgaU51bXBsYXlzOworICBtbmdfdWludDMyICBpQnVmc2l6ZTsKKyAgbW5nX3VpbnQ4cCAgcEJ1ZiA9IDA7CisjZW5kaWYKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9SRUFEX01QTkcsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNlcXVlbmNlIGNoZWNrcyAqLworICBpZiAoIXBEYXRhLT5iSGFzSUhEUikKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfU0VRVUVOQ0VFUlJPUik7CisKKyAgaWYgKGlSYXdsZW4gPCA0MSkgICAgICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBtdXN0IGJlIGF0IGxlYXN0IDQxICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURMRU5HVEgpOworCisgIGlGcmFtZXdpZHRoICAgICA9IG1uZ19nZXRfaW50MzIgKHBSYXdkYXRhKTsKKyAgaWYgKGlGcmFtZXdpZHRoID09IDApICAgICAgICAgICAgICAgIC8qIGZyYW1lX3dpZHRoIG11c3Qgbm90IGJlIHplcm8gKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRFdJRFRIKTsKKworICBpRnJhbWVoZWlnaHQgICAgPSBtbmdfZ2V0X2ludDMyIChwUmF3ZGF0YSs0KTsKKyAgaWYgKGlGcmFtZWhlaWdodCA9PSAwKSAgICAgICAgICAgICAgIC8qIGZyYW1lX2hlaWdodCBtdXN0IG5vdCBiZSB6ZXJvICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURIRUlHSFQpOworCisgIGlUaWNrc3BlcnNlYyAgICA9IG1uZ19nZXRfdWludDE2IChwUmF3ZGF0YSsxMCk7CisgIGlmIChpVGlja3NwZXJzZWMgPT0gMCkgICAgICAgICAgICAgICAvKiBkZWxheV9kZW4gbXVzdCBub3QgYmUgemVybyAqLworICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElERklFTERWQUwpOworCisgIGlmICgqKHBSYXdkYXRhKzEyKSAhPSAwKSAgICAgICAgICAgICAvKiBvbmx5IGRlZmxhdGUgY29tcHJlc3Npb24tbWV0aG9kIGFsbG93ZWQgKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRENPTVBSRVNTKTsKKworI2lmIGRlZmluZWQoTU5HX1NVUFBPUlRfRElTUExBWSkgfHwgZGVmaW5lZChNTkdfU1RPUkVfQ0hVTktTKQorICBpTnVtcGxheXMgICAgICAgPSBtbmdfZ2V0X3VpbnQxNiAocFJhd2RhdGErOCk7CisgIGlDb21wcmVzc2Vkc2l6ZSA9IChtbmdfdWludDMyKShpUmF3bGVuIC0gMTMpOworI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCisgIHsKKyAgICBpUmV0Y29kZSA9IG1uZ19pbmZsYXRlX2J1ZmZlciAocERhdGEsIHBSYXdkYXRhKzEzLCBpQ29tcHJlc3NlZHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQnVmLCAmaUJ1ZnNpemUsICZpRnJhbWVzc2l6ZSk7CisgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICB7CisgICAgICBNTkdfRlJFRVggKHBEYXRhLCBwQnVmLCBpQnVmc2l6ZSk7CisgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgfQorCisgICAgaWYgKGlGcmFtZXNzaXplICUgMjYpCisgICAgeworICAgICAgTU5HX0ZSRUVYIChwRGF0YSwgcEJ1ZiwgaUJ1ZnNpemUpOworICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURMRU5HVEgpOworICAgIH0KKworICAgIGlSZXRjb2RlID0gbW5nX2NyZWF0ZV9tcG5nX29iaiAocERhdGEsIGlGcmFtZXdpZHRoLCBpRnJhbWVoZWlnaHQsIGlOdW1wbGF5cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlUaWNrc3BlcnNlYywgaUZyYW1lc3NpemUsIHBCdWYpOworICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICB7CisgICAgICBNTkdfRlJFRVggKHBEYXRhLCBwQnVmLCBpQnVmc2l6ZSk7CisgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgfQorICB9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfRElTUExBWSAqLworCisjaWZkZWYgTU5HX1NUT1JFX0NIVU5LUworICBpZiAocERhdGEtPmJTdG9yZWNodW5rcykKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpemUgc3RvcmFnZSAqLworICAgIGlSZXRjb2RlID0gKChtbmdfY2h1bmtfaGVhZGVycClwSGVhZGVyKS0+ZkNyZWF0ZSAocERhdGEsIHBIZWFkZXIsIHBwQ2h1bmspOworICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlIHRoZSBmaWVsZHMgKi8KKyAgICAoKG1uZ19tcG5ncCkqcHBDaHVuayktPmlGcmFtZXdpZHRoICAgICAgICA9IGlGcmFtZXdpZHRoOworICAgICgobW5nX21wbmdwKSpwcENodW5rKS0+aUZyYW1laGVpZ2h0ICAgICAgID0gaUZyYW1laGVpZ2h0OworICAgICgobW5nX21wbmdwKSpwcENodW5rKS0+aU51bXBsYXlzICAgICAgICAgID0gaU51bXBsYXlzOworICAgICgobW5nX21wbmdwKSpwcENodW5rKS0+aVRpY2tzcGVyc2VjICAgICAgID0gaVRpY2tzcGVyc2VjOworICAgICgobW5nX21wbmdwKSpwcENodW5rKS0+aUNvbXByZXNzaW9ubWV0aG9kID0gKihwUmF3ZGF0YSsxNCk7CisKKyNpZm5kZWYgTU5HX1NVUFBPUlRfRElTUExBWQorICAgIGlSZXRjb2RlID0gbW5nX2luZmxhdGVfYnVmZmVyIChwRGF0YSwgcFJhd2RhdGErMTMsIGlDb21wcmVzc2Vkc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBCdWYsICZpQnVmc2l6ZSwgJmlGcmFtZXNzaXplKTsKKyAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgIHsKKyAgICAgIE1OR19GUkVFWCAocERhdGEsIHBCdWYsIGlCdWZzaXplKTsKKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICB9CisKKyAgICBpZiAoaUZyYW1lc3NpemUgJSAyNikKKyAgICB7CisgICAgICBNTkdfRlJFRVggKHBEYXRhLCBwQnVmLCBpQnVmc2l6ZSk7CisgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRExFTkdUSCk7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoaUZyYW1lc3NpemUpCisgICAgeworICAgICAgTU5HX0FMTE9DWCAocERhdGEsICgobW5nX21wbmdwKSpwcENodW5rKS0+cEZyYW1lcywgaUZyYW1lc3NpemUpOworICAgICAgaWYgKCgobW5nX21wbmdwKSpwcENodW5rKS0+cEZyYW1lcyA9PSAwKQorICAgICAgeworICAgICAgICBNTkdfRlJFRVggKHBEYXRhLCBwQnVmLCBpQnVmc2l6ZSk7CisgICAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19PVVRPRk1FTU9SWSk7CisgICAgICB9CisKKyAgICAgICgobW5nX21wbmdwKSpwcENodW5rKS0+aUZyYW1lc3NpemUgPSBpRnJhbWVzc2l6ZTsKKyAgICAgIE1OR19DT1BZICgoKG1uZ19tcG5ncCkqcHBDaHVuayktPnBGcmFtZXMsIHBCdWYsIGlGcmFtZXNzaXplKTsKKyAgICB9CisgIH0KKyNlbmRpZiAvKiBNTkdfU1RPUkVfQ0hVTktTICovCisKKyNpZiBkZWZpbmVkKE1OR19TVVBQT1JUX0RJU1BMQVkpIHx8IGRlZmluZWQoTU5HX1NUT1JFX0NIVU5LUykKKyAgTU5HX0ZSRUVYIChwRGF0YSwgcEJ1ZiwgaUJ1ZnNpemUpOworI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVBRF9NUE5HLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsgICAgICAgICAgICAgICAgICAvKiBkb25lICovCit9CisjZW5kaWYKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX2V2TlQKK1JFQURfQ0hVTksgKG1uZ19yZWFkX2V2bnQpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1JFQURfRVZOVCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2VxdWVuY2UgY2hlY2tzICovCisgIGlmICgoIXBEYXRhLT5iSGFzTUhEUikgfHwgKHBEYXRhLT5iSGFzU0FWRSkpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1NFUVVFTkNFRVJST1IpOworCisgIGlmIChpUmF3bGVuIDwgMikgICAgICAgICAgICAgICAgICAgICAvKiBtdXN0IGhhdmUgYXQgbGVhc3QgMSBlbnRyeSAhICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURMRU5HVEgpOworCisjaWYgZGVmaW5lZChNTkdfU1VQUE9SVF9ESVNQTEFZKSAmJiBkZWZpbmVkKE1OR19TVVBQT1JUX0RZTkFNSUNNTkcpCisgIHsKKyAgICBpZiAoaVJhd2xlbikgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdCBlbXB0eSA/ICovCisgICAgeworICAgICAgbW5nX3JldGNvZGUgaVJldGNvZGU7CisgICAgICBtbmdfdWludDhwICBwVGVtcDsKKyAgICAgIG1uZ191aW50OHAgIHBOdWxsOworICAgICAgbW5nX3VpbnQzMiAgaUxlbjsKKyAgICAgIG1uZ191aW50OCAgIGlFdmVudHR5cGU7CisgICAgICBtbmdfdWludDggICBpTWFza3R5cGU7CisgICAgICBtbmdfaW50MzIgICBpTGVmdDsKKyAgICAgIG1uZ19pbnQzMiAgIGlSaWdodDsKKyAgICAgIG1uZ19pbnQzMiAgIGlUb3A7CisgICAgICBtbmdfaW50MzIgICBpQm90dG9tOworICAgICAgbW5nX3VpbnQxNiAgaU9iamVjdGlkOworICAgICAgbW5nX3VpbnQ4ICAgaUluZGV4OworICAgICAgbW5nX3VpbnQzMiAgaU5hbWVzaXplOworCisgICAgICBwVGVtcCA9IHBSYXdkYXRhOworICAgICAgaUxlbiAgPSBpUmF3bGVuOworCisgICAgICB3aGlsZSAoaUxlbikgICAgICAgICAgICAgICAgICAgLyogYW55dGhpbmcgbGVmdCA/ICovCisgICAgICB7CisgICAgICAgIGlFdmVudHR5cGUgPSAqcFRlbXA7ICAgICAgICAgLyogZXZlbnR0eXBlICovCisgICAgICAgIGlmIChpRXZlbnR0eXBlID4gNSkKKyAgICAgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJREVWRU5UKTsKKworICAgICAgICBwVGVtcCsrOworCisgICAgICAgIGlNYXNrdHlwZSAgPSAqcFRlbXA7ICAgICAgICAgLyogbWFza3R5cGUgKi8KKyAgICAgICAgaWYgKGlNYXNrdHlwZSA+IDUpCisgICAgICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURNQVNLKTsKKworICAgICAgICBwVGVtcCsrOworICAgICAgICBpTGVuIC09IDI7CisKKyAgICAgICAgaUxlZnQgICAgID0gMDsKKyAgICAgICAgaVJpZ2h0ICAgID0gMDsKKyAgICAgICAgaVRvcCAgICAgID0gMDsKKyAgICAgICAgaUJvdHRvbSAgID0gMDsKKyAgICAgICAgaU9iamVjdGlkID0gMDsKKyAgICAgICAgaUluZGV4ICAgID0gMDsKKworICAgICAgICBzd2l0Y2ggKGlNYXNrdHlwZSkKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChpTGVuID4gMTYpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpTGVmdCAgICAgPSBtbmdfZ2V0X2ludDMyIChwVGVtcCk7CisgICAgICAgICAgICAgICAgaVJpZ2h0ICAgID0gbW5nX2dldF9pbnQzMiAocFRlbXArNCk7CisgICAgICAgICAgICAgICAgaVRvcCAgICAgID0gbW5nX2dldF9pbnQzMiAocFRlbXArOCk7CisgICAgICAgICAgICAgICAgaUJvdHRvbSAgID0gbW5nX2dldF9pbnQzMiAocFRlbXArMTIpOworICAgICAgICAgICAgICAgIHBUZW1wICs9IDE2OworICAgICAgICAgICAgICAgIGlMZW4gLT0gMTY7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElETEVOR1RIKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgY2FzZSAyIDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKGlMZW4gPiAyKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaU9iamVjdGlkID0gbW5nX2dldF91aW50MTYgKHBUZW1wKTsKKyAgICAgICAgICAgICAgICBwVGVtcCArPSAyOworICAgICAgICAgICAgICAgIGlMZW4gLT0gMjsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURMRU5HVEgpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlIDMgOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoaUxlbiA+IDMpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpT2JqZWN0aWQgPSBtbmdfZ2V0X3VpbnQxNiAocFRlbXApOworICAgICAgICAgICAgICAgIGlJbmRleCAgICA9ICoocFRlbXArMik7CisgICAgICAgICAgICAgICAgcFRlbXAgKz0gMzsKKyAgICAgICAgICAgICAgICBpTGVuIC09IDM7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElETEVOR1RIKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgY2FzZSA0IDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKGlMZW4gPiAxOCkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlMZWZ0ICAgICA9IG1uZ19nZXRfaW50MzIgKHBUZW1wKTsKKyAgICAgICAgICAgICAgICBpUmlnaHQgICAgPSBtbmdfZ2V0X2ludDMyIChwVGVtcCs0KTsKKyAgICAgICAgICAgICAgICBpVG9wICAgICAgPSBtbmdfZ2V0X2ludDMyIChwVGVtcCs4KTsKKyAgICAgICAgICAgICAgICBpQm90dG9tICAgPSBtbmdfZ2V0X2ludDMyIChwVGVtcCsxMik7CisgICAgICAgICAgICAgICAgaU9iamVjdGlkID0gbW5nX2dldF91aW50MTYgKHBUZW1wKzE2KTsKKyAgICAgICAgICAgICAgICBwVGVtcCArPSAxODsKKyAgICAgICAgICAgICAgICBpTGVuIC09IDE4OworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRExFTkdUSCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIGNhc2UgNSA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChpTGVuID4gMTkpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpTGVmdCAgICAgPSBtbmdfZ2V0X2ludDMyIChwVGVtcCk7CisgICAgICAgICAgICAgICAgaVJpZ2h0ICAgID0gbW5nX2dldF9pbnQzMiAocFRlbXArNCk7CisgICAgICAgICAgICAgICAgaVRvcCAgICAgID0gbW5nX2dldF9pbnQzMiAocFRlbXArOCk7CisgICAgICAgICAgICAgICAgaUJvdHRvbSAgID0gbW5nX2dldF9pbnQzMiAocFRlbXArMTIpOworICAgICAgICAgICAgICAgIGlPYmplY3RpZCA9IG1uZ19nZXRfdWludDE2IChwVGVtcCsxNik7CisgICAgICAgICAgICAgICAgaUluZGV4ICAgID0gKihwVGVtcCsxOCk7CisgICAgICAgICAgICAgICAgcFRlbXAgKz0gMTk7CisgICAgICAgICAgICAgICAgaUxlbiAtPSAxOTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURMRU5HVEgpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHBOdWxsID0gZmluZF9udWxsIChwVGVtcCk7ICAgLyogZ2V0IHRoZSBuYW1lIGxlbmd0aCAqLworCisgICAgICAgIGlmICgocE51bGwgLSBwVGVtcCkgPiAobW5nX2ludDMyKWlMZW4pCisgICAgICAgIHsKKyAgICAgICAgICBpTmFtZXNpemUgPSBpTGVuOyAgICAgICAgICAvKiBubyBudWxsIGZvdW5kOyBzbyBlbmQgb2YgZXZOVCAqLworICAgICAgICAgIGlMZW4gICAgICA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgaU5hbWVzaXplID0gcE51bGwgLSBwVGVtcDsgLyogc2hvdWxkIGJlIGFub3RoZXIgZW50cnkgKi8KKyAgICAgICAgICBpTGVuICAgICAgPSBpTGVuIC0gaU5hbWVzaXplIC0gMTsKKworICAgICAgICAgIGlmICghaUxlbikgICAgICAgICAgICAgICAgIC8qIG11c3Qgbm90IGVuZCB3aXRoIGEgbnVsbCAhICovCisgICAgICAgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfRU5EV0lUSE5VTEwpOworICAgICAgICB9CisKKyAgICAgICAgaVJldGNvZGUgPSBtbmdfY3JlYXRlX2V2ZW50IChwRGF0YSwgaUV2ZW50dHlwZSwgaU1hc2t0eXBlLCBpTGVmdCwgaVJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpVG9wLCBpQm90dG9tLCBpT2JqZWN0aWQsIGlJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaU5hbWVzaXplLCAobW5nX3BjaGFyKXBUZW1wKTsKKworICAgICAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgICAgIHJldHVybiBpUmV0Y29kZTsKKworICAgICAgICBwVGVtcCA9IHBUZW1wICsgaU5hbWVzaXplICsgMTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICYmIE1OR19TVVBQT1JUX0RZTkFNSUNNTkcgKi8KKworI2lmZGVmIE1OR19TVE9SRV9DSFVOS1MKKyAgaWYgKHBEYXRhLT5iU3RvcmVjaHVua3MpCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0aWFsaXplIHN0b3JhZ2UgKi8KKyAgICBtbmdfcmV0Y29kZSBpUmV0Y29kZSA9ICgobW5nX2NodW5rX2hlYWRlcnApcEhlYWRlciktPmZDcmVhdGUgKHBEYXRhLCBwSGVhZGVyLCBwcENodW5rKTsKKworICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKworICAgIGlmIChpUmF3bGVuKSAgICAgICAgICAgICAgICAgICAgICAgLyogbm90IGVtcHR5ID8gKi8KKyAgICB7CisgICAgICBtbmdfdWludDMyICAgICAgaVg7CisgICAgICBtbmdfdWludDMyICAgICAgaUNvdW50ID0gMDsKKyAgICAgIG1uZ191aW50OHAgICAgICBwVGVtcDsKKyAgICAgIG1uZ191aW50OHAgICAgICBwTnVsbDsKKyAgICAgIG1uZ191aW50MzIgICAgICBpTGVuOworICAgICAgbW5nX3VpbnQ4ICAgICAgIGlFdmVudHR5cGU7CisgICAgICBtbmdfdWludDggICAgICAgaU1hc2t0eXBlOworICAgICAgbW5nX2ludDMyICAgICAgIGlMZWZ0OworICAgICAgbW5nX2ludDMyICAgICAgIGlSaWdodDsKKyAgICAgIG1uZ19pbnQzMiAgICAgICBpVG9wOworICAgICAgbW5nX2ludDMyICAgICAgIGlCb3R0b207CisgICAgICBtbmdfdWludDE2ICAgICAgaU9iamVjdGlkOworICAgICAgbW5nX3VpbnQ4ICAgICAgIGlJbmRleDsKKyAgICAgIG1uZ191aW50MzIgICAgICBpTmFtZXNpemU7CisgICAgICBtbmdfZXZudF9lbnRyeXAgcEVudHJ5ID0gTU5HX05VTEw7CisKKyAgICAgIGZvciAoaVggPSAwOyBpWCA8IDI7IGlYKyspICAgICAgIC8qIGRvIHRoaXMgdHdpY2UgdG8gZ2V0IHRoZSBjb3VudCBmaXJzdCAhICovCisgICAgICB7CisgICAgICAgIHBUZW1wID0gcFJhd2RhdGE7CisgICAgICAgIGlMZW4gID0gaVJhd2xlbjsKKworICAgICAgICBpZiAoaVgpICAgICAgICAgICAgICAgICAgICAgICAgLyogc2Vjb25kIHJ1biA/ICovCisgICAgICAgIHsKKyAgICAgICAgICBNTkdfQUxMT0MgKHBEYXRhLCBwRW50cnksIChpQ291bnQgKiBzaXplb2YgKG1uZ19ldm50X2VudHJ5KSkpOworCisgICAgICAgICAgKChtbmdfZXZudHApKnBwQ2h1bmspLT5pQ291bnQgICA9IGlDb3VudDsKKyAgICAgICAgICAoKG1uZ19ldm50cCkqcHBDaHVuayktPnBFbnRyaWVzID0gcEVudHJ5OworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKGlMZW4pICAgICAgICAgICAgICAgICAgIC8qIGFueXRoaW5nIGxlZnQgPyAqLworICAgICAgICB7CisgICAgICAgICAgaUV2ZW50dHlwZSA9ICpwVGVtcDsgICAgICAgICAvKiBldmVudHR5cGUgKi8KKyAgICAgICAgICBpZiAoaUV2ZW50dHlwZSA+IDUpCisgICAgICAgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJREVWRU5UKTsKKworICAgICAgICAgIHBUZW1wKys7CisKKyAgICAgICAgICBpTWFza3R5cGUgID0gKnBUZW1wOyAgICAgICAgIC8qIG1hc2t0eXBlICovCisgICAgICAgICAgaWYgKGlNYXNrdHlwZSA+IDUpCisgICAgICAgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRE1BU0spOworCisgICAgICAgICAgcFRlbXArKzsKKyAgICAgICAgICBpTGVuIC09IDI7CisKKyAgICAgICAgICBpTGVmdCAgICAgPSAwOworICAgICAgICAgIGlSaWdodCAgICA9IDA7CisgICAgICAgICAgaVRvcCAgICAgID0gMDsKKyAgICAgICAgICBpQm90dG9tICAgPSAwOworICAgICAgICAgIGlPYmplY3RpZCA9IDA7CisgICAgICAgICAgaUluZGV4ICAgID0gMDsKKworICAgICAgICAgIHN3aXRjaCAoaU1hc2t0eXBlKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoaUxlbiA+IDE2KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGlMZWZ0ICAgICA9IG1uZ19nZXRfaW50MzIgKHBUZW1wKTsKKyAgICAgICAgICAgICAgICAgIGlSaWdodCAgICA9IG1uZ19nZXRfaW50MzIgKHBUZW1wKzQpOworICAgICAgICAgICAgICAgICAgaVRvcCAgICAgID0gbW5nX2dldF9pbnQzMiAocFRlbXArOCk7CisgICAgICAgICAgICAgICAgICBpQm90dG9tICAgPSBtbmdfZ2V0X2ludDMyIChwVGVtcCsxMik7CisgICAgICAgICAgICAgICAgICBwVGVtcCArPSAxNjsKKyAgICAgICAgICAgICAgICAgIGlMZW4gLT0gMTY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElETEVOR1RIKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSAyIDoKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChpTGVuID4gMikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpT2JqZWN0aWQgPSBtbmdfZ2V0X3VpbnQxNiAocFRlbXApOworICAgICAgICAgICAgICAgICAgcFRlbXAgKz0gMjsKKyAgICAgICAgICAgICAgICAgIGlMZW4gLT0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURMRU5HVEgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIDMgOgorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGlMZW4gPiAzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGlPYmplY3RpZCA9IG1uZ19nZXRfdWludDE2IChwVGVtcCk7CisgICAgICAgICAgICAgICAgICBpSW5kZXggICAgPSAqKHBUZW1wKzIpOworICAgICAgICAgICAgICAgICAgcFRlbXAgKz0gMzsKKyAgICAgICAgICAgICAgICAgIGlMZW4gLT0gMzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURMRU5HVEgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIDQgOgorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGlMZW4gPiAxOCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpTGVmdCAgICAgPSBtbmdfZ2V0X2ludDMyIChwVGVtcCk7CisgICAgICAgICAgICAgICAgICBpUmlnaHQgICAgPSBtbmdfZ2V0X2ludDMyIChwVGVtcCs0KTsKKyAgICAgICAgICAgICAgICAgIGlUb3AgICAgICA9IG1uZ19nZXRfaW50MzIgKHBUZW1wKzgpOworICAgICAgICAgICAgICAgICAgaUJvdHRvbSAgID0gbW5nX2dldF9pbnQzMiAocFRlbXArMTIpOworICAgICAgICAgICAgICAgICAgaU9iamVjdGlkID0gbW5nX2dldF91aW50MTYgKHBUZW1wKzE2KTsKKyAgICAgICAgICAgICAgICAgIHBUZW1wICs9IDE4OworICAgICAgICAgICAgICAgICAgaUxlbiAtPSAxODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURMRU5HVEgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIDUgOgorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGlMZW4gPiAxOSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpTGVmdCAgICAgPSBtbmdfZ2V0X2ludDMyIChwVGVtcCk7CisgICAgICAgICAgICAgICAgICBpUmlnaHQgICAgPSBtbmdfZ2V0X2ludDMyIChwVGVtcCs0KTsKKyAgICAgICAgICAgICAgICAgIGlUb3AgICAgICA9IG1uZ19nZXRfaW50MzIgKHBUZW1wKzgpOworICAgICAgICAgICAgICAgICAgaUJvdHRvbSAgID0gbW5nX2dldF9pbnQzMiAocFRlbXArMTIpOworICAgICAgICAgICAgICAgICAgaU9iamVjdGlkID0gbW5nX2dldF91aW50MTYgKHBUZW1wKzE2KTsKKyAgICAgICAgICAgICAgICAgIGlJbmRleCAgICA9ICoocFRlbXArMTgpOworICAgICAgICAgICAgICAgICAgcFRlbXAgKz0gMTk7CisgICAgICAgICAgICAgICAgICBpTGVuIC09IDE5OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRExFTkdUSCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBwTnVsbCA9IGZpbmRfbnVsbCAocFRlbXApOyAgIC8qIGdldCB0aGUgbmFtZSBsZW5ndGggKi8KKworICAgICAgICAgIGlmICgocE51bGwgLSBwVGVtcCkgPiAobW5nX2ludDMyKWlMZW4pCisgICAgICAgICAgeworICAgICAgICAgICAgaU5hbWVzaXplID0gaUxlbjsgICAgICAgICAgLyogbm8gbnVsbCBmb3VuZDsgc28gZW5kIG9mIGV2TlQgKi8KKyAgICAgICAgICAgIGlMZW4gICAgICA9IDA7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICBpTmFtZXNpemUgPSBwTnVsbCAtIHBUZW1wOyAvKiBzaG91bGQgYmUgYW5vdGhlciBlbnRyeSAqLworICAgICAgICAgICAgaUxlbiAgICAgID0gaUxlbiAtIGlOYW1lc2l6ZSAtIDE7CisKKyAgICAgICAgICAgIGlmICghaUxlbikgICAgICAgICAgICAgICAgIC8qIG11c3Qgbm90IGVuZCB3aXRoIGEgbnVsbCAhICovCisgICAgICAgICAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19FTkRXSVRITlVMTCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCFpWCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBpQ291bnQrKzsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHBFbnRyeS0+aUV2ZW50dHlwZSAgICAgICA9IGlFdmVudHR5cGU7CisgICAgICAgICAgICBwRW50cnktPmlNYXNrdHlwZSAgICAgICAgPSBpTWFza3R5cGU7CisgICAgICAgICAgICBwRW50cnktPmlMZWZ0ICAgICAgICAgICAgPSBpTGVmdDsKKyAgICAgICAgICAgIHBFbnRyeS0+aVJpZ2h0ICAgICAgICAgICA9IGlSaWdodDsKKyAgICAgICAgICAgIHBFbnRyeS0+aVRvcCAgICAgICAgICAgICA9IGlUb3A7CisgICAgICAgICAgICBwRW50cnktPmlCb3R0b20gICAgICAgICAgPSBpQm90dG9tOworICAgICAgICAgICAgcEVudHJ5LT5pT2JqZWN0aWQgICAgICAgID0gaU9iamVjdGlkOworICAgICAgICAgICAgcEVudHJ5LT5pSW5kZXggICAgICAgICAgID0gaUluZGV4OworICAgICAgICAgICAgcEVudHJ5LT5pU2VnbWVudG5hbWVzaXplID0gaU5hbWVzaXplOworCisgICAgICAgICAgICBpZiAoaU5hbWVzaXplKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBNTkdfQUxMT0MgKHBEYXRhLCBwRW50cnktPnpTZWdtZW50bmFtZSwgaU5hbWVzaXplKzEpOworICAgICAgICAgICAgICBNTkdfQ09QWSAocEVudHJ5LT56U2VnbWVudG5hbWUsIHBUZW1wLCBpTmFtZXNpemUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwRW50cnkrKzsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBwVGVtcCA9IHBUZW1wICsgaU5hbWVzaXplICsgMTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorI2VuZGlmIC8qIE1OR19TVE9SRV9DSFVOS1MgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9SRUFEX0VWTlQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOyAgICAgICAgICAgICAgICAgIC8qIGRvbmUgKi8KK30KKyNlbmRpZgorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCitSRUFEX0NIVU5LIChtbmdfcmVhZF91bmtub3duKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9SRUFEX1VOS05PV04sIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNlcXVlbmNlIGNoZWNrcyAqLworI2lmZGVmIE1OR19JTkNMVURFX0pORworICBpZiAoKCFwRGF0YS0+Ykhhc01IRFIpICYmICghcERhdGEtPmJIYXNJSERSKSAmJgorICAgICAgKCFwRGF0YS0+Ykhhc0JBU0kpICYmICghcERhdGEtPmJIYXNESERSKSAmJiAoIXBEYXRhLT5iSGFzSkhEUikpCisjZWxzZQorICBpZiAoKCFwRGF0YS0+Ykhhc01IRFIpICYmICghcERhdGEtPmJIYXNJSERSKSAmJgorICAgICAgKCFwRGF0YS0+Ykhhc0JBU0kpICYmICghcERhdGEtPmJIYXNESERSKSAgICApCisjZW5kaWYKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfU0VRVUVOQ0VFUlJPUik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjcml0aWNhbCBjaHVuayA/ICovCisgIGlmICgoKChtbmdfdWludDMyKXBEYXRhLT5pQ2h1bmtuYW1lICYgMHgyMDAwMDAwMCkgPT0gMCkKKyNpZmRlZiBNTkdfU0tJUENIVU5LX1NBVkUKKyAgICAmJiAocERhdGEtPmlDaHVua25hbWUgIT0gTU5HX1VJTlRfU0FWRSkKKyNlbmRpZgorI2lmZGVmIE1OR19TS0lQQ0hVTktfU0VFSworICAgICYmIChwRGF0YS0+aUNodW5rbmFtZSAhPSBNTkdfVUlOVF9TRUVLKQorI2VuZGlmCisjaWZkZWYgTU5HX1NLSVBDSFVOS19EQllLCisgICAgJiYgKHBEYXRhLT5pQ2h1bmtuYW1lICE9IE1OR19VSU5UX0RCWUspCisjZW5kaWYKKyNpZmRlZiBNTkdfU0tJUENIVU5LX09SRFIKKyAgICAmJiAocERhdGEtPmlDaHVua25hbWUgIT0gTU5HX1VJTlRfT1JEUikKKyNlbmRpZgorICAgICAgKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19VTktOT1dOQ1JJVElDQUwpOworCisgIGlmIChwRGF0YS0+ZlByb2Nlc3N1bmtub3duKSAgICAgICAgICAvKiBsZXQgdGhlIGFwcCBoYW5kbGUgaXQgPyAqLworICB7CisgICAgbW5nX2Jvb2wgYk9rZSA9IHBEYXRhLT5mUHJvY2Vzc3Vua25vd24gKChtbmdfaGFuZGxlKXBEYXRhLCBwRGF0YS0+aUNodW5rbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVJhd2xlbiwgKG1uZ19wdHIpcFJhd2RhdGEpOworCisgICAgaWYgKCFiT2tlKQorICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0FQUE1JU0NFUlJPUik7CisgIH0KKworI2lmZGVmIE1OR19TVE9SRV9DSFVOS1MKKyAgaWYgKHBEYXRhLT5iU3RvcmVjaHVua3MpCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0aWFsaXplIHN0b3JhZ2UgKi8KKyAgICBtbmdfcmV0Y29kZSBpUmV0Y29kZSA9ICgobW5nX2NodW5rX2hlYWRlcnApcEhlYWRlciktPmZDcmVhdGUgKHBEYXRhLCBwSGVhZGVyLCBwcENodW5rKTsKKworICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlIHRoZSBsZW5ndGggKi8KKyAgICAoKG1uZ19jaHVua19oZWFkZXJwKSpwcENodW5rKS0+aUNodW5rbmFtZSA9IHBEYXRhLT5pQ2h1bmtuYW1lOworICAgICgobW5nX3Vua25vd25fY2h1bmtwKSpwcENodW5rKS0+aURhdGFzaXplID0gaVJhd2xlbjsKKworICAgIGlmIChpUmF3bGVuID09IDApICAgICAgICAgICAgICAgICAgLyogYW55IGRhdGEgYXQgYWxsID8gKi8KKyAgICAgICgobW5nX3Vua25vd25fY2h1bmtwKSpwcENodW5rKS0+cERhdGEgPSAwOworICAgIGVsc2UKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZW4gc3RvcmUgaXQgKi8KKyAgICAgIE1OR19BTExPQyAocERhdGEsICgobW5nX3Vua25vd25fY2h1bmtwKSpwcENodW5rKS0+cERhdGEsIGlSYXdsZW4pOworICAgICAgTU5HX0NPUFkgKCgobW5nX3Vua25vd25fY2h1bmtwKSpwcENodW5rKS0+cERhdGEsIHBSYXdkYXRhLCBpUmF3bGVuKTsKKyAgICB9CisgIH0KKyNlbmRpZiAvKiBNTkdfU1RPUkVfQ0hVTktTICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVBRF9VTktOT1dOLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsgICAgICAgICAgICAgICAgICAvKiBkb25lICovCit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2VuZGlmIC8qIE1OR19JTkNMVURFX1JFQURfUFJPQ1MgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGNodW5rIHdyaXRlIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfSU5DTFVERV9XUklURV9QUk9DUworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitXUklURV9DSFVOSyAobW5nX3dyaXRlX2loZHIpCit7CisgIG1uZ19paGRycCAgIHBJSERSOworICBtbmdfdWludDhwICBwUmF3ZGF0YTsKKyAgbW5nX3VpbnQzMiAgaVJhd2xlbjsKKyAgbW5nX3JldGNvZGUgaVJldGNvZGU7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fV1JJVEVfSUhEUiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBJSERSICAgID0gKG1uZ19paGRycClwQ2h1bms7ICAgICAgICAvKiBhZGRyZXNzIHRoZSBwcm9wZXIgY2h1bmsgKi8KKyAgcFJhd2RhdGEgPSBwRGF0YS0+cFdyaXRlYnVmKzg7ICAgICAgIC8qIGluaXQgb3V0cHV0IGJ1ZmZlciAmIHNpemUgKi8KKyAgaVJhd2xlbiAgPSAxMzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbGwgdGhlIG91dHB1dCBidWZmZXIgKi8KKyAgbW5nX3B1dF91aW50MzIgKHBSYXdkYXRhLCAgIHBJSERSLT5pV2lkdGgpOworICBtbmdfcHV0X3VpbnQzMiAocFJhd2RhdGErNCwgcElIRFItPmlIZWlnaHQpOworCisgICoocFJhd2RhdGErOCkgID0gcElIRFItPmlCaXRkZXB0aDsKKyAgKihwUmF3ZGF0YSs5KSAgPSBwSUhEUi0+aUNvbG9ydHlwZTsKKyAgKihwUmF3ZGF0YSsxMCkgPSBwSUhEUi0+aUNvbXByZXNzaW9uOworICAqKHBSYXdkYXRhKzExKSA9IHBJSERSLT5pRmlsdGVyOworICAqKHBSYXdkYXRhKzEyKSA9IHBJSERSLT5pSW50ZXJsYWNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHdyaXRlIGl0ICovCisgIGlSZXRjb2RlID0gd3JpdGVfcmF3X2NodW5rIChwRGF0YSwgcElIRFItPnNIZWFkZXIuaUNodW5rbmFtZSwgaVJhd2xlbiwgcFJhd2RhdGEpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1dSSVRFX0lIRFIsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIGlSZXRjb2RlOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitXUklURV9DSFVOSyAobW5nX3dyaXRlX3BsdGUpCit7CisgIG1uZ19wbHRlcCAgIHBQTFRFOworICBtbmdfdWludDhwICBwUmF3ZGF0YTsKKyAgbW5nX3VpbnQzMiAgaVJhd2xlbjsKKyAgbW5nX3JldGNvZGUgaVJldGNvZGU7CisgIG1uZ191aW50OHAgIHBUZW1wOworICBtbmdfdWludDMyICBpWDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9XUklURV9QTFRFLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcFBMVEUgICAgPSAobW5nX3BsdGVwKXBDaHVuazsgICAgICAgIC8qIGFkZHJlc3MgdGhlIHByb3BlciBjaHVuayAqLworCisgIGlmIChwUExURS0+YkVtcHR5KSAgICAgICAgICAgICAgICAgICAvKiB3cml0ZSBlbXB0eSBjaHVuayA/ICovCisgICAgaVJldGNvZGUgPSB3cml0ZV9yYXdfY2h1bmsgKHBEYXRhLCBwUExURS0+c0hlYWRlci5pQ2h1bmtuYW1lLCAwLCAwKTsKKyAgZWxzZQorICB7CisgICAgcFJhd2RhdGEgPSBwRGF0YS0+cFdyaXRlYnVmKzg7ICAgICAvKiBpbml0IG91dHB1dCBidWZmZXIgJiBzaXplICovCisgICAgaVJhd2xlbiAgPSBwUExURS0+aUVudHJ5Y291bnQgKiAzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmlsbCB0aGUgb3V0cHV0IGJ1ZmZlciAqLworICAgIHBUZW1wID0gcFJhd2RhdGE7CisKKyAgICBmb3IgKGlYID0gMDsgaVggPCBwUExURS0+aUVudHJ5Y291bnQ7IGlYKyspCisgICAgeworICAgICAgKnBUZW1wICAgICA9IHBQTFRFLT5hRW50cmllcyBbaVhdLmlSZWQ7CisgICAgICAqKHBUZW1wKzEpID0gcFBMVEUtPmFFbnRyaWVzIFtpWF0uaUdyZWVuOworICAgICAgKihwVGVtcCsyKSA9IHBQTFRFLT5hRW50cmllcyBbaVhdLmlCbHVlOworCisgICAgICBwVGVtcCArPSAzOworICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCB3cml0ZSBpdCAqLworICAgIGlSZXRjb2RlID0gd3JpdGVfcmF3X2NodW5rIChwRGF0YSwgcFBMVEUtPnNIZWFkZXIuaUNodW5rbmFtZSwgaVJhd2xlbiwgcFJhd2RhdGEpOworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fV1JJVEVfUExURSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gaVJldGNvZGU7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK1dSSVRFX0NIVU5LIChtbmdfd3JpdGVfaWRhdCkKK3sKKyAgbW5nX2lkYXRwICAgcElEQVQ7CisgIG1uZ19yZXRjb2RlIGlSZXRjb2RlOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1dSSVRFX0lEQVQsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBwSURBVCA9IChtbmdfaWRhdHApcENodW5rOyAgICAgICAgICAgLyogYWRkcmVzcyB0aGUgcHJvcGVyIGNodW5rICovCisKKyAgaWYgKHBJREFULT5iRW1wdHkpICAgICAgICAgICAgICAgICAgIC8qIGFuZCB3cml0ZSBpdCAqLworICAgIGlSZXRjb2RlID0gd3JpdGVfcmF3X2NodW5rIChwRGF0YSwgcElEQVQtPnNIZWFkZXIuaUNodW5rbmFtZSwgMCwgMCk7CisgIGVsc2UKKyAgICBpUmV0Y29kZSA9IHdyaXRlX3Jhd19jaHVuayAocERhdGEsIHBJREFULT5zSGVhZGVyLmlDaHVua25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJREFULT5pRGF0YXNpemUsIHBJREFULT5wRGF0YSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fV1JJVEVfSURBVCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gaVJldGNvZGU7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK1dSSVRFX0NIVU5LIChtbmdfd3JpdGVfaWVuZCkKK3sKKyAgbW5nX2llbmRwICAgcElFTkQ7CisgIG1uZ19yZXRjb2RlIGlSZXRjb2RlOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1dSSVRFX0lFTkQsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBwSUVORCA9IChtbmdfaWVuZHApcENodW5rOyAgICAgICAgICAgLyogYWRkcmVzcyB0aGUgcHJvcGVyIGNodW5rICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgd3JpdGUgaXQgKi8KKyAgaVJldGNvZGUgPSB3cml0ZV9yYXdfY2h1bmsgKHBEYXRhLCBwSUVORC0+c0hlYWRlci5pQ2h1bmtuYW1lLCAwLCAwKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9XUklURV9JRU5ELCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBpUmV0Y29kZTsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworV1JJVEVfQ0hVTksgKG1uZ193cml0ZV90cm5zKQoreworICBtbmdfdHJuc3AgICBwVFJOUzsKKyAgbW5nX3VpbnQ4cCAgcFJhd2RhdGE7CisgIG1uZ191aW50MzIgIGlSYXdsZW47CisgIG1uZ19yZXRjb2RlIGlSZXRjb2RlOworICBtbmdfdWludDhwICBwVGVtcDsKKyAgbW5nX3VpbnQzMiAgaVg7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fV1JJVEVfVFJOUywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBUUk5TID0gKG1uZ190cm5zcClwQ2h1bms7ICAgICAgICAgICAvKiBhZGRyZXNzIHRoZSBwcm9wZXIgY2h1bmsgKi8KKworICBpZiAocFRSTlMtPmJFbXB0eSkgICAgICAgICAgICAgICAgICAgLyogd3JpdGUgZW1wdHkgY2h1bmsgPyAqLworICAgIGlSZXRjb2RlID0gd3JpdGVfcmF3X2NodW5rIChwRGF0YSwgcFRSTlMtPnNIZWFkZXIuaUNodW5rbmFtZSwgMCwgMCk7CisgIGVsc2UKKyAgaWYgKHBUUk5TLT5iR2xvYmFsKSAgICAgICAgICAgICAgICAgIC8qIHdyaXRlIGdsb2JhbCBjaHVuayA/ICovCisgICAgaVJldGNvZGUgPSB3cml0ZV9yYXdfY2h1bmsgKHBEYXRhLCBwVFJOUy0+c0hlYWRlci5pQ2h1bmtuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVFJOUy0+aVJhd2xlbiwgKG1uZ191aW50OHApcFRSTlMtPmFSYXdkYXRhKTsKKyAgZWxzZQorICB7CisgICAgcFJhd2RhdGEgPSBwRGF0YS0+cFdyaXRlYnVmKzg7ICAgICAvKiBpbml0IG91dHB1dCBidWZmZXIgKi8KKyAgICBpUmF3bGVuICA9IDA7ICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCBkZWZhdWx0IHNpemUgKi8KKworICAgIHN3aXRjaCAocFRSTlMtPmlUeXBlKQorICAgIHsKKyAgICAgIGNhc2UgMDogeworICAgICAgICAgICAgICAgIGlSYXdsZW4gICA9IDI7ICAgICAgICAgLyogZmlsbCB0aGUgc2l6ZSAmIG91dHB1dCBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICBtbmdfcHV0X3VpbnQxNiAocFJhd2RhdGEsIHBUUk5TLT5pR3JheSk7CisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgY2FzZSAyOiB7CisgICAgICAgICAgICAgICAgaVJhd2xlbiAgICAgICA9IDY7ICAgICAvKiBmaWxsIHRoZSBzaXplICYgb3V0cHV0IGJ1ZmZlciAqLworICAgICAgICAgICAgICAgIG1uZ19wdXRfdWludDE2IChwUmF3ZGF0YSwgICBwVFJOUy0+aVJlZCk7CisgICAgICAgICAgICAgICAgbW5nX3B1dF91aW50MTYgKHBSYXdkYXRhKzIsIHBUUk5TLT5pR3JlZW4pOworICAgICAgICAgICAgICAgIG1uZ19wdXRfdWludDE2IChwUmF3ZGF0YSs0LCBwVFJOUy0+aUJsdWUpOworCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgIGNhc2UgMzogeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXQgb3V0cHV0IGJ1ZmZlciBzaXplICovCisgICAgICAgICAgICAgICAgaVJhd2xlbiA9IHBUUk5TLT5pQ291bnQ7CisKKyAgICAgICAgICAgICAgICBwVGVtcCAgID0gcFJhd2RhdGE7ICAgIC8qIGZpbGwgdGhlIG91dHB1dCBidWZmZXIgKi8KKworICAgICAgICAgICAgICAgIGZvciAoaVggPSAwOyBpWCA8IHBUUk5TLT5pQ291bnQ7IGlYKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgKnBUZW1wID0gcFRSTlMtPmFFbnRyaWVzW2lYXTsKKyAgICAgICAgICAgICAgICAgIHBUZW1wKys7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3cml0ZSB0aGUgY2h1bmsgKi8KKyAgICBpUmV0Y29kZSA9IHdyaXRlX3Jhd19jaHVuayAocERhdGEsIHBUUk5TLT5zSGVhZGVyLmlDaHVua25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlSYXdsZW4sIHBSYXdkYXRhKTsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1dSSVRFX1RSTlMsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIGlSZXRjb2RlOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitXUklURV9DSFVOSyAobW5nX3dyaXRlX2dhbWEpCit7CisgIG1uZ19nYW1hcCAgIHBHQU1BOworICBtbmdfdWludDhwICBwUmF3ZGF0YTsKKyAgbW5nX3VpbnQzMiAgaVJhd2xlbjsKKyAgbW5nX3JldGNvZGUgaVJldGNvZGU7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fV1JJVEVfR0FNQSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBHQU1BID0gKG1uZ19nYW1hcClwQ2h1bms7ICAgICAgICAgICAvKiBhZGRyZXNzIHRoZSBwcm9wZXIgY2h1bmsgKi8KKworICBpZiAocEdBTUEtPmJFbXB0eSkgICAgICAgICAgICAgICAgICAgLyogd3JpdGUgZW1wdHkgPyAqLworICAgIGlSZXRjb2RlID0gd3JpdGVfcmF3X2NodW5rIChwRGF0YSwgcEdBTUEtPnNIZWFkZXIuaUNodW5rbmFtZSwgMCwgMCk7CisgIGVsc2UKKyAgeworICAgIHBSYXdkYXRhID0gcERhdGEtPnBXcml0ZWJ1Zis4OyAgICAgLyogaW5pdCBvdXRwdXQgYnVmZmVyICYgc2l6ZSAqLworICAgIGlSYXdsZW4gID0gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbGwgdGhlIGJ1ZmZlciAqLworICAgIG1uZ19wdXRfdWludDMyIChwUmF3ZGF0YSwgcEdBTUEtPmlHYW1tYSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgd3JpdGUgaXQgKi8KKyAgICBpUmV0Y29kZSA9IHdyaXRlX3Jhd19jaHVuayAocERhdGEsIHBHQU1BLT5zSGVhZGVyLmlDaHVua25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlSYXdsZW4sIHBSYXdkYXRhKTsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1dSSVRFX0dBTUEsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIGlSZXRjb2RlOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfY0hSTQorV1JJVEVfQ0hVTksgKG1uZ193cml0ZV9jaHJtKQoreworICBtbmdfY2hybXAgICBwQ0hSTTsKKyAgbW5nX3VpbnQ4cCAgcFJhd2RhdGE7CisgIG1uZ191aW50MzIgIGlSYXdsZW47CisgIG1uZ19yZXRjb2RlIGlSZXRjb2RlOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1dSSVRFX0NIUk0sIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBwQ0hSTSA9IChtbmdfY2hybXApcENodW5rOyAgICAgICAgICAgLyogYWRkcmVzcyB0aGUgcHJvcGVyIGNodW5rICovCisKKyAgaWYgKHBDSFJNLT5iRW1wdHkpICAgICAgICAgICAgICAgICAgIC8qIHdyaXRlIGVtcHR5ID8gKi8KKyAgICBpUmV0Y29kZSA9IHdyaXRlX3Jhd19jaHVuayAocERhdGEsIHBDSFJNLT5zSGVhZGVyLmlDaHVua25hbWUsIDAsIDApOworICBlbHNlCisgIHsKKyAgICBwUmF3ZGF0YSA9IHBEYXRhLT5wV3JpdGVidWYrODsgICAgIC8qIGluaXQgb3V0cHV0IGJ1ZmZlciAmIHNpemUgKi8KKyAgICBpUmF3bGVuICA9IDMyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmlsbCB0aGUgYnVmZmVyICovCisgICAgbW5nX3B1dF91aW50MzIgKHBSYXdkYXRhLCAgICBwQ0hSTS0+aVdoaXRlcG9pbnR4KTsKKyAgICBtbmdfcHV0X3VpbnQzMiAocFJhd2RhdGErNCwgIHBDSFJNLT5pV2hpdGVwb2ludHkpOworICAgIG1uZ19wdXRfdWludDMyIChwUmF3ZGF0YSs4LCAgcENIUk0tPmlSZWR4KTsKKyAgICBtbmdfcHV0X3VpbnQzMiAocFJhd2RhdGErMTIsIHBDSFJNLT5pUmVkeSk7CisgICAgbW5nX3B1dF91aW50MzIgKHBSYXdkYXRhKzE2LCBwQ0hSTS0+aUdyZWVueCk7CisgICAgbW5nX3B1dF91aW50MzIgKHBSYXdkYXRhKzIwLCBwQ0hSTS0+aUdyZWVueSk7CisgICAgbW5nX3B1dF91aW50MzIgKHBSYXdkYXRhKzI0LCBwQ0hSTS0+aUJsdWV4KTsKKyAgICBtbmdfcHV0X3VpbnQzMiAocFJhd2RhdGErMjgsIHBDSFJNLT5pQmx1ZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHdyaXRlIGl0ICovCisgICAgaVJldGNvZGUgPSB3cml0ZV9yYXdfY2h1bmsgKHBEYXRhLCBwQ0hSTS0+c0hlYWRlci5pQ2h1bmtuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpUmF3bGVuLCBwUmF3ZGF0YSk7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9XUklURV9DSFJNLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBpUmV0Y29kZTsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitXUklURV9DSFVOSyAobW5nX3dyaXRlX3NyZ2IpCit7CisgIG1uZ19zcmdicCAgIHBTUkdCOworICBtbmdfdWludDhwICBwUmF3ZGF0YTsKKyAgbW5nX3VpbnQzMiAgaVJhd2xlbjsKKyAgbW5nX3JldGNvZGUgaVJldGNvZGU7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fV1JJVEVfU1JHQiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBTUkdCID0gKG1uZ19zcmdicClwQ2h1bms7ICAgICAgICAgICAvKiBhZGRyZXNzIHRoZSBwcm9wZXIgY2h1bmsgKi8KKworICBpZiAocFNSR0ItPmJFbXB0eSkgICAgICAgICAgICAgICAgICAgLyogd3JpdGUgZW1wdHkgPyAqLworICAgIGlSZXRjb2RlID0gd3JpdGVfcmF3X2NodW5rIChwRGF0YSwgcFNSR0ItPnNIZWFkZXIuaUNodW5rbmFtZSwgMCwgMCk7CisgIGVsc2UKKyAgeworICAgIHBSYXdkYXRhID0gcERhdGEtPnBXcml0ZWJ1Zis4OyAgICAgLyogaW5pdCBvdXRwdXQgYnVmZmVyICYgc2l6ZSAqLworICAgIGlSYXdsZW4gID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbGwgdGhlIGJ1ZmZlciAqLworICAgICpwUmF3ZGF0YSA9IHBTUkdCLT5pUmVuZGVyaW5naW50ZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHdyaXRlIGl0ICovCisgICAgaVJldGNvZGUgPSB3cml0ZV9yYXdfY2h1bmsgKHBEYXRhLCBwU1JHQi0+c0hlYWRlci5pQ2h1bmtuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpUmF3bGVuLCBwUmF3ZGF0YSk7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9XUklURV9TUkdCLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBpUmV0Y29kZTsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX2lDQ1AKK1dSSVRFX0NIVU5LIChtbmdfd3JpdGVfaWNjcCkKK3sKKyAgbW5nX2ljY3BwICAgcElDQ1A7CisgIG1uZ191aW50OHAgIHBSYXdkYXRhOworICBtbmdfdWludDMyICBpUmF3bGVuOworICBtbmdfcmV0Y29kZSBpUmV0Y29kZTsKKyAgbW5nX3VpbnQ4cCAgcFRlbXA7CisgIG1uZ191aW50OHAgIHBCdWYgPSAwOworICBtbmdfdWludDMyICBpQnVmbGVuOworICBtbmdfdWludDMyICBpUmVhbGxlbjsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9XUklURV9JQ0NQLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcElDQ1AgPSAobW5nX2ljY3BwKXBDaHVuazsgICAgICAgICAgIC8qIGFkZHJlc3MgdGhlIHByb3BlciBjaHVuayAqLworCisgIGlmIChwSUNDUC0+YkVtcHR5KSAgICAgICAgICAgICAgICAgICAvKiB3cml0ZSBlbXB0eSA/ICovCisgICAgaVJldGNvZGUgPSB3cml0ZV9yYXdfY2h1bmsgKHBEYXRhLCBwSUNDUC0+c0hlYWRlci5pQ2h1bmtuYW1lLCAwLCAwKTsKKyAgZWxzZQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29tcHJlc3MgdGhlIHByb2ZpbGUgKi8KKyAgICBpUmV0Y29kZSA9IGRlZmxhdGVfYnVmZmVyIChwRGF0YSwgcElDQ1AtPnBQcm9maWxlLCBwSUNDUC0+aVByb2ZpbGVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQnVmLCAmaUJ1ZmxlbiwgJmlSZWFsbGVuKTsKKworICAgIGlmICghaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgLyogc3RpbGwgb2tlID8gKi8KKyAgICB7CisgICAgICBwUmF3ZGF0YSA9IHBEYXRhLT5wV3JpdGVidWYrODsgICAvKiBpbml0IG91dHB1dCBidWZmZXIgJiBzaXplICovCisgICAgICBpUmF3bGVuICA9IHBJQ0NQLT5pTmFtZXNpemUgKyAyICsgaVJlYWxsZW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZXF1aXJlcyBsYXJnZSBidWZmZXIgPyAqLworICAgICAgaWYgKGlSYXdsZW4gPiBwRGF0YS0+aVdyaXRlYnVmc2l6ZSkKKyAgICAgICAgTU5HX0FMTE9DIChwRGF0YSwgcFJhd2RhdGEsIGlSYXdsZW4pOworCisgICAgICBwVGVtcCA9IHBSYXdkYXRhOyAgICAgICAgICAgICAgICAvKiBmaWxsIHRoZSBidWZmZXIgKi8KKworICAgICAgaWYgKHBJQ0NQLT5pTmFtZXNpemUpCisgICAgICB7CisgICAgICAgIE1OR19DT1BZIChwVGVtcCwgcElDQ1AtPnpOYW1lLCBwSUNDUC0+aU5hbWVzaXplKTsKKyAgICAgICAgcFRlbXAgKz0gcElDQ1AtPmlOYW1lc2l6ZTsKKyAgICAgIH0KKworICAgICAgKnBUZW1wICAgICA9IDA7CisgICAgICAqKHBUZW1wKzEpID0gcElDQ1AtPmlDb21wcmVzc2lvbjsKKyAgICAgIHBUZW1wICs9IDI7CisKKyAgICAgIGlmIChpUmVhbGxlbikKKyAgICAgICAgTU5HX0NPUFkgKHBUZW1wLCBwQnVmLCBpUmVhbGxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgd3JpdGUgaXQgKi8KKyAgICAgIGlSZXRjb2RlID0gd3JpdGVfcmF3X2NodW5rIChwRGF0YSwgcElDQ1AtPnNIZWFkZXIuaUNodW5rbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpUmF3bGVuLCBwUmF3ZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkcm9wIHRoZSB0ZW1wIGJ1ZmZlciA/ICovCisgICAgICBpZiAoaVJhd2xlbiA+IHBEYXRhLT5pV3JpdGVidWZzaXplKQorICAgICAgICBNTkdfRlJFRVggKHBEYXRhLCBwUmF3ZGF0YSwgaVJhd2xlbik7CisKKyAgICB9CisKKyAgICBNTkdfRlJFRVggKHBEYXRhLCBwQnVmLCBpQnVmbGVuKTsgIC8qIGFsd2F5cyBkcm9wIHRoZSBleHRyYSBidWZmZXIgKi8KKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1dSSVRFX0lDQ1AsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIGlSZXRjb2RlOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS190RVh0CitXUklURV9DSFVOSyAobW5nX3dyaXRlX3RleHQpCit7CisgIG1uZ190ZXh0cCAgIHBURVhUOworICBtbmdfdWludDhwICBwUmF3ZGF0YTsKKyAgbW5nX3VpbnQzMiAgaVJhd2xlbjsKKyAgbW5nX3JldGNvZGUgaVJldGNvZGU7CisgIG1uZ191aW50OHAgIHBUZW1wOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1dSSVRFX1RFWFQsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBwVEVYVCA9IChtbmdfdGV4dHApcENodW5rOyAgICAgICAgICAgLyogYWRkcmVzcyB0aGUgcHJvcGVyIGNodW5rICovCisKKyAgcFJhd2RhdGEgPSBwRGF0YS0+cFdyaXRlYnVmKzg7ICAgICAgIC8qIGluaXQgb3V0cHV0IGJ1ZmZlciAmIHNpemUgKi8KKyAgaVJhd2xlbiAgPSBwVEVYVC0+aUtleXdvcmRzaXplICsgMSArIHBURVhULT5pVGV4dHNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZXF1aXJlcyBsYXJnZSBidWZmZXIgPyAqLworICBpZiAoaVJhd2xlbiA+IHBEYXRhLT5pV3JpdGVidWZzaXplKQorICAgIE1OR19BTExPQyAocERhdGEsIHBSYXdkYXRhLCBpUmF3bGVuKTsKKworICBwVGVtcCA9IHBSYXdkYXRhOyAgICAgICAgICAgICAgICAgICAgLyogZmlsbCB0aGUgYnVmZmVyICovCisKKyAgaWYgKHBURVhULT5pS2V5d29yZHNpemUpCisgIHsKKyAgICBNTkdfQ09QWSAocFRlbXAsIHBURVhULT56S2V5d29yZCwgcFRFWFQtPmlLZXl3b3Jkc2l6ZSk7CisgICAgcFRlbXAgKz0gcFRFWFQtPmlLZXl3b3Jkc2l6ZTsKKyAgfQorCisgICpwVGVtcCA9IDA7CisgIHBUZW1wICs9IDE7CisKKyAgaWYgKHBURVhULT5pVGV4dHNpemUpCisgICAgTU5HX0NPUFkgKHBUZW1wLCBwVEVYVC0+elRleHQsIHBURVhULT5pVGV4dHNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHdyaXRlIGl0ICovCisgIGlSZXRjb2RlID0gd3JpdGVfcmF3X2NodW5rIChwRGF0YSwgcFRFWFQtPnNIZWFkZXIuaUNodW5rbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlSYXdsZW4sIHBSYXdkYXRhKTsKKworICBpZiAoaVJhd2xlbiA+IHBEYXRhLT5pV3JpdGVidWZzaXplKSAgLyogZHJvcCB0aGUgdGVtcCBidWZmZXIgPyAqLworICAgIE1OR19GUkVFWCAocERhdGEsIHBSYXdkYXRhLCBpUmF3bGVuKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9XUklURV9URVhULCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBpUmV0Y29kZTsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfelRYdAorV1JJVEVfQ0hVTksgKG1uZ193cml0ZV96dHh0KQoreworICBtbmdfenR4dHAgICBwWlRYVDsKKyAgbW5nX3VpbnQ4cCAgcFJhd2RhdGE7CisgIG1uZ191aW50MzIgIGlSYXdsZW47CisgIG1uZ19yZXRjb2RlIGlSZXRjb2RlOworICBtbmdfdWludDhwICBwVGVtcDsKKyAgbW5nX3VpbnQ4cCAgcEJ1ZiA9IDA7CisgIG1uZ191aW50MzIgIGlCdWZsZW47CisgIG1uZ191aW50MzIgIGlSZWFsbGVuOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1dSSVRFX1pUWFQsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBwWlRYVCA9IChtbmdfenR4dHApcENodW5rOyAgICAgICAgICAgLyogYWRkcmVzcyB0aGUgcHJvcGVyIGNodW5rICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb21wcmVzcyB0aGUgdGV4dCAqLworICBpUmV0Y29kZSA9IGRlZmxhdGVfYnVmZmVyIChwRGF0YSwgKG1uZ191aW50OHApcFpUWFQtPnpUZXh0LCBwWlRYVC0+aVRleHRzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEJ1ZiwgJmlCdWZsZW4sICZpUmVhbGxlbik7CisKKyAgaWYgKCFpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgIC8qIGFsbCBvayA/ICovCisgIHsKKyAgICBwUmF3ZGF0YSA9IHBEYXRhLT5wV3JpdGVidWYrODsgICAgIC8qIGluaXQgb3V0cHV0IGJ1ZmZlciAmIHNpemUgKi8KKyAgICBpUmF3bGVuICA9IHBaVFhULT5pS2V5d29yZHNpemUgKyAyICsgaVJlYWxsZW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZXF1aXJlcyBsYXJnZSBidWZmZXIgPyAqLworICAgIGlmIChpUmF3bGVuID4gcERhdGEtPmlXcml0ZWJ1ZnNpemUpCisgICAgICBNTkdfQUxMT0MgKHBEYXRhLCBwUmF3ZGF0YSwgaVJhd2xlbik7CisKKyAgICBwVGVtcCA9IHBSYXdkYXRhOyAgICAgICAgICAgICAgICAgIC8qIGZpbGwgdGhlIGJ1ZmZlciAqLworCisgICAgaWYgKHBaVFhULT5pS2V5d29yZHNpemUpCisgICAgeworICAgICAgTU5HX0NPUFkgKHBUZW1wLCBwWlRYVC0+ektleXdvcmQsIHBaVFhULT5pS2V5d29yZHNpemUpOworICAgICAgcFRlbXAgKz0gcFpUWFQtPmlLZXl3b3Jkc2l6ZTsKKyAgICB9CisKKyAgICAqcFRlbXAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRlcm1pbmF0b3IgemVybyAqLworICAgIHBUZW1wKys7CisgICAgKnBUZW1wID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb21wcmVzc2lvbiB0eXBlICovCisgICAgcFRlbXArKzsKKworICAgIGlmIChpUmVhbGxlbikKKyAgICAgIE1OR19DT1BZIChwVGVtcCwgcEJ1ZiwgaVJlYWxsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHdyaXRlIGl0ICovCisgICAgaVJldGNvZGUgPSB3cml0ZV9yYXdfY2h1bmsgKHBEYXRhLCBwWlRYVC0+c0hlYWRlci5pQ2h1bmtuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpUmF3bGVuLCBwUmF3ZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkcm9wIHRoZSB0ZW1wIGJ1ZmZlciA/ICovCisgICAgaWYgKGlSYXdsZW4gPiBwRGF0YS0+aVdyaXRlYnVmc2l6ZSkKKyAgICAgIE1OR19GUkVFWCAocERhdGEsIHBSYXdkYXRhLCBpUmF3bGVuKTsKKworICB9CisKKyAgTU5HX0ZSRUVYIChwRGF0YSwgcEJ1ZiwgaUJ1Zmxlbik7ICAgIC8qIGFsd2F5cyBkcm9wIHRoZSBjb21wcmVzc2lvbiBidWZmZXIgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9XUklURV9aVFhULCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBpUmV0Y29kZTsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfaVRYdAorV1JJVEVfQ0hVTksgKG1uZ193cml0ZV9pdHh0KQoreworICBtbmdfaXR4dHAgICBwSVRYVDsKKyAgbW5nX3VpbnQ4cCAgcFJhd2RhdGE7CisgIG1uZ191aW50MzIgIGlSYXdsZW47CisgIG1uZ19yZXRjb2RlIGlSZXRjb2RlOworICBtbmdfdWludDhwICBwVGVtcDsKKyAgbW5nX3VpbnQ4cCAgcEJ1ZiA9IDA7CisgIG1uZ191aW50MzIgIGlCdWZsZW47CisgIG1uZ191aW50MzIgIGlSZWFsbGVuOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1dSSVRFX0lUWFQsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBwSVRYVCA9IChtbmdfaXR4dHApcENodW5rOyAgICAgICAgICAgLyogYWRkcmVzcyB0aGUgcHJvcGVyIGNodW5rICovCisKKyAgaWYgKHBJVFhULT5pQ29tcHJlc3Npb25mbGFnKSAgICAgICAgIC8qIGNvbXByZXNzIHRoZSB0ZXh0ICovCisgICAgaVJldGNvZGUgPSBkZWZsYXRlX2J1ZmZlciAocERhdGEsIChtbmdfdWludDhwKXBJVFhULT56VGV4dCwgcElUWFQtPmlUZXh0c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEJ1ZiwgJmlCdWZsZW4sICZpUmVhbGxlbik7CisgIGVsc2UKKyAgICBpUmV0Y29kZSA9IE1OR19OT0VSUk9SOworCisgIGlmICghaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgICAvKiBhbGwgb2sgPyAqLworICB7CisgICAgcFJhd2RhdGEgPSBwRGF0YS0+cFdyaXRlYnVmKzg7ICAgICAvKiBpbml0IG91dHB1dCBidWZmZXIgJiBzaXplICovCisgICAgaVJhd2xlbiAgPSBwSVRYVC0+aUtleXdvcmRzaXplICsgcElUWFQtPmlMYW5ndWFnZXNpemUgKworICAgICAgICAgICAgICAgcElUWFQtPmlUcmFuc2xhdGlvbnNpemUgKyA1OworCisgICAgaWYgKHBJVFhULT5pQ29tcHJlc3Npb25mbGFnKQorICAgICAgaVJhd2xlbiA9IGlSYXdsZW4gKyBpUmVhbGxlbjsKKyAgICBlbHNlCisgICAgICBpUmF3bGVuID0gaVJhd2xlbiArIHBJVFhULT5pVGV4dHNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZXF1aXJlcyBsYXJnZSBidWZmZXIgPyAqLworICAgIGlmIChpUmF3bGVuID4gcERhdGEtPmlXcml0ZWJ1ZnNpemUpCisgICAgICBNTkdfQUxMT0MgKHBEYXRhLCBwUmF3ZGF0YSwgaVJhd2xlbik7CisKKyAgICBwVGVtcCA9IHBSYXdkYXRhOyAgICAgICAgICAgICAgICAgIC8qIGZpbGwgdGhlIGJ1ZmZlciAqLworCisgICAgaWYgKHBJVFhULT5pS2V5d29yZHNpemUpCisgICAgeworICAgICAgTU5HX0NPUFkgKHBUZW1wLCBwSVRYVC0+ektleXdvcmQsIHBJVFhULT5pS2V5d29yZHNpemUpOworICAgICAgcFRlbXAgKz0gcElUWFQtPmlLZXl3b3Jkc2l6ZTsKKyAgICB9CisKKyAgICAqcFRlbXAgPSAwOworICAgIHBUZW1wKys7CisgICAgKnBUZW1wID0gcElUWFQtPmlDb21wcmVzc2lvbmZsYWc7CisgICAgcFRlbXArKzsKKyAgICAqcFRlbXAgPSBwSVRYVC0+aUNvbXByZXNzaW9ubWV0aG9kOworICAgIHBUZW1wKys7CisKKyAgICBpZiAocElUWFQtPmlMYW5ndWFnZXNpemUpCisgICAgeworICAgICAgTU5HX0NPUFkgKHBUZW1wLCBwSVRYVC0+ekxhbmd1YWdlLCBwSVRYVC0+aUxhbmd1YWdlc2l6ZSk7CisgICAgICBwVGVtcCArPSBwSVRYVC0+aUxhbmd1YWdlc2l6ZTsKKyAgICB9CisKKyAgICAqcFRlbXAgPSAwOworICAgIHBUZW1wKys7CisKKyAgICBpZiAocElUWFQtPmlUcmFuc2xhdGlvbnNpemUpCisgICAgeworICAgICAgTU5HX0NPUFkgKHBUZW1wLCBwSVRYVC0+elRyYW5zbGF0aW9uLCBwSVRYVC0+aVRyYW5zbGF0aW9uc2l6ZSk7CisgICAgICBwVGVtcCArPSBwSVRYVC0+aVRyYW5zbGF0aW9uc2l6ZTsKKyAgICB9CisKKyAgICAqcFRlbXAgPSAwOworICAgIHBUZW1wKys7CisKKyAgICBpZiAocElUWFQtPmlDb21wcmVzc2lvbmZsYWcpCisgICAgeworICAgICAgaWYgKGlSZWFsbGVuKQorICAgICAgICBNTkdfQ09QWSAocFRlbXAsIHBCdWYsIGlSZWFsbGVuKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGlmIChwSVRYVC0+aVRleHRzaXplKQorICAgICAgICBNTkdfQ09QWSAocFRlbXAsIHBJVFhULT56VGV4dCwgcElUWFQtPmlUZXh0c2l6ZSk7CisgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHdyaXRlIGl0ICovCisgICAgaVJldGNvZGUgPSB3cml0ZV9yYXdfY2h1bmsgKHBEYXRhLCBwSVRYVC0+c0hlYWRlci5pQ2h1bmtuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpUmF3bGVuLCBwUmF3ZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkcm9wIHRoZSB0ZW1wIGJ1ZmZlciA/ICovCisgICAgaWYgKGlSYXdsZW4gPiBwRGF0YS0+aVdyaXRlYnVmc2l6ZSkKKyAgICAgIE1OR19GUkVFWCAocERhdGEsIHBSYXdkYXRhLCBpUmF3bGVuKTsKKworICB9CisKKyAgTU5HX0ZSRUVYIChwRGF0YSwgcEJ1ZiwgaUJ1Zmxlbik7ICAgIC8qIGFsd2F5cyBkcm9wIHRoZSBjb21wcmVzc2lvbiBidWZmZXIgKi8KKworICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICByZXR1cm4gaVJldGNvZGU7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fV1JJVEVfSVRYVCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX2JLR0QKK1dSSVRFX0NIVU5LIChtbmdfd3JpdGVfYmtnZCkKK3sKKyAgbW5nX2JrZ2RwICAgcEJLR0Q7CisgIG1uZ191aW50OHAgIHBSYXdkYXRhOworICBtbmdfdWludDMyICBpUmF3bGVuOworICBtbmdfcmV0Y29kZSBpUmV0Y29kZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9XUklURV9CS0dELCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcEJLR0QgPSAobW5nX2JrZ2RwKXBDaHVuazsgICAgICAgICAgIC8qIGFkZHJlc3MgdGhlIHByb3BlciBjaHVuayAqLworCisgIGlmIChwQktHRC0+YkVtcHR5KSAgICAgICAgICAgICAgICAgICAvKiB3cml0ZSBlbXB0eSA/ICovCisgICAgaVJldGNvZGUgPSB3cml0ZV9yYXdfY2h1bmsgKHBEYXRhLCBwQktHRC0+c0hlYWRlci5pQ2h1bmtuYW1lLCAwLCAwKTsKKyAgZWxzZQorICB7CisgICAgcFJhd2RhdGEgPSBwRGF0YS0+cFdyaXRlYnVmKzg7ICAgICAvKiBpbml0IG91dHB1dCBidWZmZXIgJiBzaXplICovCisgICAgaVJhd2xlbiAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgZGVmYXVsdCBzaXplICovCisKKyAgICBzd2l0Y2ggKHBCS0dELT5pVHlwZSkKKyAgICB7CisgICAgICBjYXNlIDA6IHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBncmF5ICovCisgICAgICAgICAgICAgICAgaVJhd2xlbiA9IDI7ICAgICAgICAgICAvKiBmaWxsIHRoZSBzaXplICYgb3V0cHV0IGJ1ZmZlciAqLworICAgICAgICAgICAgICAgIG1uZ19wdXRfdWludDE2IChwUmF3ZGF0YSwgcEJLR0QtPmlHcmF5KTsKKworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICBjYXNlIDI6IHsgICAgICAgICAgICAgICAgICAgICAgICAvKiByZ2IgKi8KKyAgICAgICAgICAgICAgICBpUmF3bGVuID0gNjsgICAgICAgICAgIC8qIGZpbGwgdGhlIHNpemUgJiBvdXRwdXQgYnVmZmVyICovCisgICAgICAgICAgICAgICAgbW5nX3B1dF91aW50MTYgKHBSYXdkYXRhLCAgIHBCS0dELT5pUmVkKTsKKyAgICAgICAgICAgICAgICBtbmdfcHV0X3VpbnQxNiAocFJhd2RhdGErMiwgcEJLR0QtPmlHcmVlbik7CisgICAgICAgICAgICAgICAgbW5nX3B1dF91aW50MTYgKHBSYXdkYXRhKzQsIHBCS0dELT5pQmx1ZSk7CisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgY2FzZSAzOiB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5kZXhlZCAqLworICAgICAgICAgICAgICAgIGlSYXdsZW4gICA9IDE7ICAgICAgICAgLyogZmlsbCB0aGUgc2l6ZSAmIG91dHB1dCBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAqcFJhd2RhdGEgPSBwQktHRC0+aUluZGV4OworCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgd3JpdGUgaXQgKi8KKyAgICBpUmV0Y29kZSA9IHdyaXRlX3Jhd19jaHVuayAocERhdGEsIHBCS0dELT5zSGVhZGVyLmlDaHVua25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlSYXdsZW4sIHBSYXdkYXRhKTsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1dSSVRFX0JLR0QsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIGlSZXRjb2RlOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19wSFlzCitXUklURV9DSFVOSyAobW5nX3dyaXRlX3BoeXMpCit7CisgIG1uZ19waHlzcCAgIHBQSFlTOworICBtbmdfdWludDhwICBwUmF3ZGF0YTsKKyAgbW5nX3VpbnQzMiAgaVJhd2xlbjsKKyAgbW5nX3JldGNvZGUgaVJldGNvZGU7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fV1JJVEVfUEhZUywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBQSFlTID0gKG1uZ19waHlzcClwQ2h1bms7ICAgICAgICAgICAvKiBhZGRyZXNzIHRoZSBwcm9wZXIgY2h1bmsgKi8KKworICBpZiAocFBIWVMtPmJFbXB0eSkgICAgICAgICAgICAgICAgICAgLyogd3JpdGUgZW1wdHkgPyAqLworICAgIGlSZXRjb2RlID0gd3JpdGVfcmF3X2NodW5rIChwRGF0YSwgcFBIWVMtPnNIZWFkZXIuaUNodW5rbmFtZSwgMCwgMCk7CisgIGVsc2UKKyAgeworICAgIHBSYXdkYXRhID0gcERhdGEtPnBXcml0ZWJ1Zis4OyAgICAgLyogaW5pdCBvdXRwdXQgYnVmZmVyICYgc2l6ZSAqLworICAgIGlSYXdsZW4gID0gOTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbGwgdGhlIG91dHB1dCBidWZmZXIgKi8KKyAgICBtbmdfcHV0X3VpbnQzMiAocFJhd2RhdGEsICAgcFBIWVMtPmlTaXpleCk7CisgICAgbW5nX3B1dF91aW50MzIgKHBSYXdkYXRhKzQsIHBQSFlTLT5pU2l6ZXkpOworCisgICAgKihwUmF3ZGF0YSs4KSA9IHBQSFlTLT5pVW5pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCB3cml0ZSBpdCAqLworICAgIGlSZXRjb2RlID0gd3JpdGVfcmF3X2NodW5rIChwRGF0YSwgcFBIWVMtPnNIZWFkZXIuaUNodW5rbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVJhd2xlbiwgcFJhd2RhdGEpOworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fV1JJVEVfUEhZUywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gaVJldGNvZGU7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX3NCSVQKK1dSSVRFX0NIVU5LIChtbmdfd3JpdGVfc2JpdCkKK3sKKyAgbW5nX3NiaXRwICAgcFNCSVQ7CisgIG1uZ191aW50OHAgIHBSYXdkYXRhOworICBtbmdfdWludDMyICBpUmF3bGVuOworICBtbmdfcmV0Y29kZSBpUmV0Y29kZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9XUklURV9TQklULCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcFNCSVQgPSAobW5nX3NiaXRwKXBDaHVuazsgICAgICAgICAgIC8qIGFkZHJlc3MgdGhlIHByb3BlciBjaHVuayAqLworCisgIGlmIChwU0JJVC0+YkVtcHR5KSAgICAgICAgICAgICAgICAgICAvKiB3cml0ZSBlbXB0eSA/ICovCisgICAgaVJldGNvZGUgPSB3cml0ZV9yYXdfY2h1bmsgKHBEYXRhLCBwU0JJVC0+c0hlYWRlci5pQ2h1bmtuYW1lLCAwLCAwKTsKKyAgZWxzZQorICB7CisgICAgcFJhd2RhdGEgPSBwRGF0YS0+cFdyaXRlYnVmKzg7ICAgICAvKiBpbml0IG91dHB1dCBidWZmZXIgJiBzaXplICovCisgICAgaVJhd2xlbiAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgZGVmYXVsdCBzaXplICovCisKKyAgICBzd2l0Y2ggKHBTQklULT5pVHlwZSkKKyAgICB7CisgICAgICBjYXNlICAwOiB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBncmF5ICovCisgICAgICAgICAgICAgICAgIGlSYXdsZW4gICAgICAgPSAxOyAgICAvKiBmaWxsIHRoZSBzaXplICYgb3V0cHV0IGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAqcFJhd2RhdGEgICAgID0gcFNCSVQtPmFCaXRzWzBdOworCisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgfQorICAgICAgY2FzZSAgMjogeyAgICAgICAgICAgICAgICAgICAgICAgLyogcmdiICovCisgICAgICAgICAgICAgICAgIGlSYXdsZW4gICAgICAgPSAzOyAgICAvKiBmaWxsIHRoZSBzaXplICYgb3V0cHV0IGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAqcFJhd2RhdGEgICAgID0gcFNCSVQtPmFCaXRzWzBdOworICAgICAgICAgICAgICAgICAqKHBSYXdkYXRhKzEpID0gcFNCSVQtPmFCaXRzWzFdOworICAgICAgICAgICAgICAgICAqKHBSYXdkYXRhKzIpID0gcFNCSVQtPmFCaXRzWzJdOworCisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgfQorICAgICAgY2FzZSAgMzogeyAgICAgICAgICAgICAgICAgICAgICAgLyogaW5kZXhlZCAqLworICAgICAgICAgICAgICAgICBpUmF3bGVuICAgICAgID0gMzsgICAgLyogZmlsbCB0aGUgc2l6ZSAmIG91dHB1dCBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgKnBSYXdkYXRhICAgICA9IHBTQklULT5hQml0c1swXTsKKyAgICAgICAgICAgICAgICAgKnBSYXdkYXRhICAgICA9IHBTQklULT5hQml0c1sxXTsKKyAgICAgICAgICAgICAgICAgKnBSYXdkYXRhICAgICA9IHBTQklULT5hQml0c1syXTsKKworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIH0KKyAgICAgIGNhc2UgIDQ6IHsgICAgICAgICAgICAgICAgICAgICAgIC8qIGdyYXkgKyBhbHBoYSAqLworICAgICAgICAgICAgICAgICBpUmF3bGVuICAgICAgID0gMjsgICAgLyogZmlsbCB0aGUgc2l6ZSAmIG91dHB1dCBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgKnBSYXdkYXRhICAgICA9IHBTQklULT5hQml0c1swXTsKKyAgICAgICAgICAgICAgICAgKihwUmF3ZGF0YSsxKSA9IHBTQklULT5hQml0c1sxXTsKKworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIH0KKyAgICAgIGNhc2UgIDY6IHsgICAgICAgICAgICAgICAgICAgICAgIC8qIHJnYiArIGFscGhhICovCisgICAgICAgICAgICAgICAgIGlSYXdsZW4gICAgICAgPSA0OyAgICAvKiBmaWxsIHRoZSBzaXplICYgb3V0cHV0IGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAqcFJhd2RhdGEgICAgID0gcFNCSVQtPmFCaXRzWzBdOworICAgICAgICAgICAgICAgICAqKHBSYXdkYXRhKzEpID0gcFNCSVQtPmFCaXRzWzFdOworICAgICAgICAgICAgICAgICAqKHBSYXdkYXRhKzIpID0gcFNCSVQtPmFCaXRzWzJdOworICAgICAgICAgICAgICAgICAqKHBSYXdkYXRhKzMpID0gcFNCSVQtPmFCaXRzWzNdOworCisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgfQorICAgICAgY2FzZSAxMDogeyAgICAgICAgICAgICAgICAgICAgICAgLyoganBlZyBncmF5ICovCisgICAgICAgICAgICAgICAgIGlSYXdsZW4gICAgICAgPSAxOyAgICAvKiBmaWxsIHRoZSBzaXplICYgb3V0cHV0IGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAqcFJhd2RhdGEgICAgID0gcFNCSVQtPmFCaXRzWzBdOworCisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgfQorICAgICAgY2FzZSAxMjogeyAgICAgICAgICAgICAgICAgICAgICAgLyoganBlZyByZ2IgKi8KKyAgICAgICAgICAgICAgICAgaVJhd2xlbiAgICAgICA9IDM7ICAgIC8qIGZpbGwgdGhlIHNpemUgJiBvdXRwdXQgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICpwUmF3ZGF0YSAgICAgPSBwU0JJVC0+YUJpdHNbMF07CisgICAgICAgICAgICAgICAgICoocFJhd2RhdGErMSkgPSBwU0JJVC0+YUJpdHNbMV07CisgICAgICAgICAgICAgICAgICoocFJhd2RhdGErMikgPSBwU0JJVC0+YUJpdHNbMl07CisKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICB9CisgICAgICBjYXNlIDE0OiB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBqcGVnIGdyYXkgKyBhbHBoYSAqLworICAgICAgICAgICAgICAgICBpUmF3bGVuICAgICAgID0gMjsgICAgLyogZmlsbCB0aGUgc2l6ZSAmIG91dHB1dCBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgKnBSYXdkYXRhICAgICA9IHBTQklULT5hQml0c1swXTsKKyAgICAgICAgICAgICAgICAgKihwUmF3ZGF0YSsxKSA9IHBTQklULT5hQml0c1sxXTsKKworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIH0KKyAgICAgIGNhc2UgMTY6IHsgICAgICAgICAgICAgICAgICAgICAgIC8qIGpwZWcgcmdiICsgYWxwaGEgKi8KKyAgICAgICAgICAgICAgICAgaVJhd2xlbiAgICAgICA9IDQ7ICAgIC8qIGZpbGwgdGhlIHNpemUgJiBvdXRwdXQgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICpwUmF3ZGF0YSAgICAgPSBwU0JJVC0+YUJpdHNbMF07CisgICAgICAgICAgICAgICAgICoocFJhd2RhdGErMSkgPSBwU0JJVC0+YUJpdHNbMV07CisgICAgICAgICAgICAgICAgICoocFJhd2RhdGErMikgPSBwU0JJVC0+YUJpdHNbMl07CisgICAgICAgICAgICAgICAgICoocFJhd2RhdGErMykgPSBwU0JJVC0+YUJpdHNbM107CisKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICB9CisgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHdyaXRlIGl0ICovCisgICAgaVJldGNvZGUgPSB3cml0ZV9yYXdfY2h1bmsgKHBEYXRhLCBwU0JJVC0+c0hlYWRlci5pQ2h1bmtuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpUmF3bGVuLCBwUmF3ZGF0YSk7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9XUklURV9TQklULCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBpUmV0Y29kZTsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfc1BMVAorV1JJVEVfQ0hVTksgKG1uZ193cml0ZV9zcGx0KQoreworICBtbmdfc3BsdHAgICBwU1BMVDsKKyAgbW5nX3VpbnQ4cCAgcFJhd2RhdGE7CisgIG1uZ191aW50MzIgIGlSYXdsZW47CisgIG1uZ19yZXRjb2RlIGlSZXRjb2RlOworICBtbmdfdWludDMyICBpRW50cmllc2xlbjsKKyAgbW5nX3VpbnQ4cCAgcFRlbXA7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fV1JJVEVfU1BMVCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBTUExUID0gKG1uZ19zcGx0cClwQ2h1bms7ICAgICAgICAgICAvKiBhZGRyZXNzIHRoZSBwcm9wZXIgY2h1bmsgKi8KKworICBwUmF3ZGF0YSAgICA9IHBEYXRhLT5wV3JpdGVidWYrODsgICAgLyogaW5pdCBvdXRwdXQgYnVmZmVyICYgc2l6ZSAqLworICBpRW50cmllc2xlbiA9ICgocFNQTFQtPmlTYW1wbGVkZXB0aCA+PiAzKSAqIDQgKyAyKSAqIHBTUExULT5pRW50cnljb3VudDsKKyAgaVJhd2xlbiAgICAgPSBwU1BMVC0+aU5hbWVzaXplICsgMiArIGlFbnRyaWVzbGVuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVxdWlyZXMgbGFyZ2UgYnVmZmVyID8gKi8KKyAgaWYgKGlSYXdsZW4gPiBwRGF0YS0+aVdyaXRlYnVmc2l6ZSkKKyAgICBNTkdfQUxMT0MgKHBEYXRhLCBwUmF3ZGF0YSwgaVJhd2xlbik7CisKKyAgcFRlbXAgPSBwUmF3ZGF0YTsgICAgICAgICAgICAgICAgICAgIC8qIGZpbGwgdGhlIGJ1ZmZlciAqLworCisgIGlmIChwU1BMVC0+aU5hbWVzaXplKQorICB7CisgICAgTU5HX0NPUFkgKHBUZW1wLCBwU1BMVC0+ek5hbWUsIHBTUExULT5pTmFtZXNpemUpOworICAgIHBUZW1wICs9IHBTUExULT5pTmFtZXNpemU7CisgIH0KKworICAqcFRlbXAgICAgID0gMDsKKyAgKihwVGVtcCsxKSA9IHBTUExULT5pU2FtcGxlZGVwdGg7CisgIHBUZW1wICs9IDI7CisKKyAgaWYgKHBTUExULT5pRW50cnljb3VudCkKKyAgICBNTkdfQ09QWSAocFRlbXAsIHBTUExULT5wRW50cmllcywgaUVudHJpZXNsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHdyaXRlIGl0ICovCisgIGlSZXRjb2RlID0gd3JpdGVfcmF3X2NodW5rIChwRGF0YSwgcFNQTFQtPnNIZWFkZXIuaUNodW5rbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlSYXdsZW4sIHBSYXdkYXRhKTsKKworICBpZiAoaVJhd2xlbiA+IHBEYXRhLT5pV3JpdGVidWZzaXplKSAgLyogZHJvcCB0aGUgdGVtcCBidWZmZXIgPyAqLworICAgIE1OR19GUkVFWCAocERhdGEsIHBSYXdkYXRhLCBpUmF3bGVuKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9XUklURV9TUExULCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBpUmV0Y29kZTsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfaElTVAorV1JJVEVfQ0hVTksgKG1uZ193cml0ZV9oaXN0KQoreworICBtbmdfaGlzdHAgICBwSElTVDsKKyAgbW5nX3VpbnQ4cCAgcFJhd2RhdGE7CisgIG1uZ191aW50MzIgIGlSYXdsZW47CisgIG1uZ19yZXRjb2RlIGlSZXRjb2RlOworICBtbmdfdWludDhwICBwVGVtcDsKKyAgbW5nX3VpbnQzMiAgaVg7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fV1JJVEVfSElTVCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBISVNUID0gKG1uZ19oaXN0cClwQ2h1bms7ICAgICAgICAgICAvKiBhZGRyZXNzIHRoZSBwcm9wZXIgY2h1bmsgKi8KKworICBwUmF3ZGF0YSA9IHBEYXRhLT5wV3JpdGVidWYrODsgICAgICAgLyogaW5pdCBvdXRwdXQgYnVmZmVyICYgc2l6ZSAqLworICBpUmF3bGVuICA9IHBISVNULT5pRW50cnljb3VudCA8PCAxOworCisgIHBUZW1wICAgID0gcFJhd2RhdGE7ICAgICAgICAgICAgICAgICAvKiBmaWxsIHRoZSBvdXRwdXQgYnVmZmVyICovCisKKyAgZm9yIChpWCA9IDA7IGlYIDwgcEhJU1QtPmlFbnRyeWNvdW50OyBpWCsrKQorICB7CisgICAgbW5nX3B1dF91aW50MTYgKHBUZW1wLCBwSElTVC0+YUVudHJpZXMgW2lYXSk7CisgICAgcFRlbXAgKz0gMjsKKyAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHdyaXRlIGl0ICovCisgIGlSZXRjb2RlID0gd3JpdGVfcmF3X2NodW5rIChwRGF0YSwgcEhJU1QtPnNIZWFkZXIuaUNodW5rbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlSYXdsZW4sIHBSYXdkYXRhKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9XUklURV9ISVNULCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBpUmV0Y29kZTsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfdElNRQorV1JJVEVfQ0hVTksgKG1uZ193cml0ZV90aW1lKQoreworICBtbmdfdGltZXAgICBwVElNRTsKKyAgbW5nX3VpbnQ4cCAgcFJhd2RhdGE7CisgIG1uZ191aW50MzIgIGlSYXdsZW47CisgIG1uZ19yZXRjb2RlIGlSZXRjb2RlOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1dSSVRFX1RJTUUsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBwVElNRSA9IChtbmdfdGltZXApcENodW5rOyAgICAgICAgICAgLyogYWRkcmVzcyB0aGUgcHJvcGVyIGNodW5rICovCisKKyAgcFJhd2RhdGEgPSBwRGF0YS0+cFdyaXRlYnVmKzg7ICAgICAgIC8qIGluaXQgb3V0cHV0IGJ1ZmZlciAmIHNpemUgKi8KKyAgaVJhd2xlbiAgPSA3OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmlsbCB0aGUgb3V0cHV0IGJ1ZmZlciAqLworICBtbmdfcHV0X3VpbnQxNiAocFJhd2RhdGEsIHBUSU1FLT5pWWVhcik7CisKKyAgKihwUmF3ZGF0YSsyKSA9IHBUSU1FLT5pTW9udGg7CisgICoocFJhd2RhdGErMykgPSBwVElNRS0+aURheTsKKyAgKihwUmF3ZGF0YSs0KSA9IHBUSU1FLT5pSG91cjsKKyAgKihwUmF3ZGF0YSs1KSA9IHBUSU1FLT5pTWludXRlOworICAqKHBSYXdkYXRhKzYpID0gcFRJTUUtPmlTZWNvbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgd3JpdGUgaXQgKi8KKyAgaVJldGNvZGUgPSB3cml0ZV9yYXdfY2h1bmsgKHBEYXRhLCBwVElNRS0+c0hlYWRlci5pQ2h1bmtuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVJhd2xlbiwgcFJhd2RhdGEpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1dSSVRFX1RJTUUsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIGlSZXRjb2RlOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK1dSSVRFX0NIVU5LIChtbmdfd3JpdGVfbWhkcikKK3sKKyAgbW5nX21oZHJwICAgcE1IRFI7CisgIG1uZ191aW50OHAgIHBSYXdkYXRhOworICBtbmdfdWludDMyICBpUmF3bGVuOworICBtbmdfcmV0Y29kZSBpUmV0Y29kZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9XUklURV9NSERSLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcE1IRFIgPSAobW5nX21oZHJwKXBDaHVuazsgICAgICAgICAgIC8qIGFkZHJlc3MgdGhlIHByb3BlciBjaHVuayAqLworCisgIHBSYXdkYXRhID0gcERhdGEtPnBXcml0ZWJ1Zis4OyAgICAgICAvKiBpbml0IG91dHB1dCBidWZmZXIgJiBzaXplICovCisgIGlSYXdsZW4gID0gMjg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaWxsIHRoZSBvdXRwdXQgYnVmZmVyICovCisgIG1uZ19wdXRfdWludDMyIChwUmF3ZGF0YSwgICAgcE1IRFItPmlXaWR0aCk7CisgIG1uZ19wdXRfdWludDMyIChwUmF3ZGF0YSs0LCAgcE1IRFItPmlIZWlnaHQpOworICBtbmdfcHV0X3VpbnQzMiAocFJhd2RhdGErOCwgIHBNSERSLT5pVGlja3MpOworICBtbmdfcHV0X3VpbnQzMiAocFJhd2RhdGErMTIsIHBNSERSLT5pTGF5ZXJjb3VudCk7CisgIG1uZ19wdXRfdWludDMyIChwUmF3ZGF0YSsxNiwgcE1IRFItPmlGcmFtZWNvdW50KTsKKyAgbW5nX3B1dF91aW50MzIgKHBSYXdkYXRhKzIwLCBwTUhEUi0+aVBsYXl0aW1lKTsKKyAgbW5nX3B1dF91aW50MzIgKHBSYXdkYXRhKzI0LCBwTUhEUi0+aVNpbXBsaWNpdHkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgd3JpdGUgaXQgKi8KKyAgaVJldGNvZGUgPSB3cml0ZV9yYXdfY2h1bmsgKHBEYXRhLCBwTUhEUi0+c0hlYWRlci5pQ2h1bmtuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVJhd2xlbiwgcFJhd2RhdGEpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1dSSVRFX01IRFIsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIGlSZXRjb2RlOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitXUklURV9DSFVOSyAobW5nX3dyaXRlX21lbmQpCit7CisgIG1uZ19tZW5kcCAgIHBNRU5EOworICBtbmdfcmV0Y29kZSBpUmV0Y29kZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9XUklURV9NRU5ELCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcE1FTkQgPSAobW5nX21lbmRwKXBDaHVuazsgICAgICAgICAgIC8qIGFkZHJlc3MgdGhlIHByb3BlciBjaHVuayAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHdyaXRlIGl0ICovCisgIGlSZXRjb2RlID0gd3JpdGVfcmF3X2NodW5rIChwRGF0YSwgcE1FTkQtPnNIZWFkZXIuaUNodW5rbmFtZSwgMCwgMCk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fV1JJVEVfTUVORCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gaVJldGNvZGU7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK1dSSVRFX0NIVU5LIChtbmdfd3JpdGVfbG9vcCkKK3sKKyAgbW5nX2xvb3BwICAgcExPT1A7CisgIG1uZ191aW50OHAgIHBSYXdkYXRhOworICBtbmdfdWludDMyICBpUmF3bGVuOworICBtbmdfcmV0Y29kZSBpUmV0Y29kZTsKKyNpZm5kZWYgTU5HX05PX0xPT1BfU0lHTkFMU19TVVBQT1JURUQKKyAgbW5nX3VpbnQ4cCAgcFRlbXAxOworICBtbmdfdWludDMycCBwVGVtcDI7CisgIG1uZ191aW50MzIgIGlYOworI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fV1JJVEVfTE9PUCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBMT09QID0gKG1uZ19sb29wcClwQ2h1bms7ICAgICAgICAgICAvKiBhZGRyZXNzIHRoZSBwcm9wZXIgY2h1bmsgKi8KKworICBwUmF3ZGF0YSA9IHBEYXRhLT5wV3JpdGVidWYrODsgICAgICAgLyogaW5pdCBvdXRwdXQgYnVmZmVyICYgc2l6ZSAqLworICBpUmF3bGVuICA9IDU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaWxsIHRoZSBvdXRwdXQgYnVmZmVyICovCisgICpwUmF3ZGF0YSA9IHBMT09QLT5pTGV2ZWw7CisgIG1uZ19wdXRfdWludDMyIChwUmF3ZGF0YSsxLCAgcExPT1AtPmlSZXBlYXQpOworCisgIGlmIChwTE9PUC0+aVRlcm1pbmF0aW9uKQorICB7CisgICAgaVJhd2xlbisrOworICAgICoocFJhd2RhdGErNSkgPSBwTE9PUC0+aVRlcm1pbmF0aW9uOworCisgICAgaWYgKChwTE9PUC0+aUNvdW50KSB8fAorICAgICAgICAocExPT1AtPmlJdGVybWluICE9IDEpIHx8IChwTE9PUC0+aUl0ZXJtYXggIT0gMHg3RkZGRkZGRkwpKQorICAgIHsKKyAgICAgIGlSYXdsZW4gKz0gODsKKworICAgICAgbW5nX3B1dF91aW50MzIgKHBSYXdkYXRhKzYsICBwTE9PUC0+aUl0ZXJtaW4pOworICAgICAgbW5nX3B1dF91aW50MzIgKHBSYXdkYXRhKzEwLCBwTE9PUC0+aUl0ZXJtYXgpOworCisjaWZuZGVmIE1OR19OT19MT09QX1NJR05BTFNfU1VQUE9SVEVECisgICAgICBpZiAocExPT1AtPmlDb3VudCkKKyAgICAgIHsKKyAgICAgICAgaVJhd2xlbiArPSBwTE9PUC0+aUNvdW50ICogNDsKKworICAgICAgICBwVGVtcDEgPSBwUmF3ZGF0YSsxNDsKKyAgICAgICAgcFRlbXAyID0gcExPT1AtPnBTaWduYWxzOworCisgICAgICAgIGZvciAoaVggPSAwOyBpWCA8IHBMT09QLT5pQ291bnQ7IGlYKyspCisgICAgICAgIHsKKyAgICAgICAgICBtbmdfcHV0X3VpbnQzMiAocFRlbXAxLCAqcFRlbXAyKTsKKworICAgICAgICAgIHBUZW1wMSArPSA0OworICAgICAgICAgIHBUZW1wMisrOworICAgICAgICB9CisgICAgICB9CisjZW5kaWYKKyAgICB9CisgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCB3cml0ZSBpdCAqLworICBpUmV0Y29kZSA9IHdyaXRlX3Jhd19jaHVuayAocERhdGEsIHBMT09QLT5zSGVhZGVyLmlDaHVua25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpUmF3bGVuLCBwUmF3ZGF0YSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fV1JJVEVfTE9PUCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gaVJldGNvZGU7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK1dSSVRFX0NIVU5LIChtbmdfd3JpdGVfZW5kbCkKK3sKKyAgbW5nX2VuZGxwICAgcEVOREw7CisgIG1uZ191aW50OHAgIHBSYXdkYXRhOworICBtbmdfdWludDMyICBpUmF3bGVuOworICBtbmdfcmV0Y29kZSBpUmV0Y29kZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9XUklURV9FTkRMLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcEVOREwgICAgID0gKG1uZ19lbmRscClwQ2h1bms7ICAgICAgIC8qIGFkZHJlc3MgdGhlIHByb3BlciBjaHVuayAqLworCisgIHBSYXdkYXRhICA9IHBEYXRhLT5wV3JpdGVidWYrODsgICAgICAvKiBpbml0IG91dHB1dCBidWZmZXIgJiBzaXplICovCisgIGlSYXdsZW4gICA9IDE7CisKKyAgKnBSYXdkYXRhID0gcEVOREwtPmlMZXZlbDsgICAgICAgICAgIC8qIGZpbGwgdGhlIG91dHB1dCBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCB3cml0ZSBpdCAqLworICBpUmV0Y29kZSAgPSB3cml0ZV9yYXdfY2h1bmsgKHBEYXRhLCBwRU5ETC0+c0hlYWRlci5pQ2h1bmtuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlSYXdsZW4sIHBSYXdkYXRhKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9XUklURV9FTkRMLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBpUmV0Y29kZTsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworV1JJVEVfQ0hVTksgKG1uZ193cml0ZV9kZWZpKQoreworICBtbmdfZGVmaXAgICBwREVGSTsKKyAgbW5nX3VpbnQ4cCAgcFJhd2RhdGE7CisgIG1uZ191aW50MzIgIGlSYXdsZW47CisgIG1uZ19yZXRjb2RlIGlSZXRjb2RlOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1dSSVRFX0RFRkksIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBwREVGSSA9IChtbmdfZGVmaXApcENodW5rOyAgICAgICAgICAgLyogYWRkcmVzcyB0aGUgcHJvcGVyIGNodW5rICovCisKKyAgcFJhd2RhdGEgPSBwRGF0YS0+cFdyaXRlYnVmKzg7ICAgICAgIC8qIGluaXQgb3V0cHV0IGJ1ZmZlciAmIHNpemUgKi8KKyAgaVJhd2xlbiAgPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmlsbCB0aGUgb3V0cHV0IGJ1ZmZlciAqLworICBtbmdfcHV0X3VpbnQxNiAocFJhd2RhdGEsIHBERUZJLT5pT2JqZWN0aWQpOworCisgIGlmICgocERFRkktPmlEb25vdHNob3cpIHx8IChwREVGSS0+aUNvbmNyZXRlKSB8fCAocERFRkktPmJIYXNsb2NhKSB8fCAocERFRkktPmJIYXNjbGlwKSkKKyAgeworICAgIGlSYXdsZW4rKzsKKyAgICAqKHBSYXdkYXRhKzIpID0gcERFRkktPmlEb25vdHNob3c7CisKKyAgICBpZiAoKHBERUZJLT5pQ29uY3JldGUpIHx8IChwREVGSS0+Ykhhc2xvY2EpIHx8IChwREVGSS0+Ykhhc2NsaXApKQorICAgIHsKKyAgICAgIGlSYXdsZW4rKzsKKyAgICAgICoocFJhd2RhdGErMykgPSBwREVGSS0+aUNvbmNyZXRlOworCisgICAgICBpZiAoKHBERUZJLT5iSGFzbG9jYSkgfHwgKHBERUZJLT5iSGFzY2xpcCkpCisgICAgICB7CisgICAgICAgIGlSYXdsZW4gKz0gODsKKworICAgICAgICBtbmdfcHV0X3VpbnQzMiAocFJhd2RhdGErNCwgcERFRkktPmlYbG9jYXRpb24pOworICAgICAgICBtbmdfcHV0X3VpbnQzMiAocFJhd2RhdGErOCwgcERFRkktPmlZbG9jYXRpb24pOworCisgICAgICAgIGlmIChwREVGSS0+Ykhhc2NsaXApCisgICAgICAgIHsKKyAgICAgICAgICBpUmF3bGVuICs9IDE2OworCisgICAgICAgICAgbW5nX3B1dF91aW50MzIgKHBSYXdkYXRhKzEyLCBwREVGSS0+aUxlZnRjYik7CisgICAgICAgICAgbW5nX3B1dF91aW50MzIgKHBSYXdkYXRhKzE2LCBwREVGSS0+aVJpZ2h0Y2IpOworICAgICAgICAgIG1uZ19wdXRfdWludDMyIChwUmF3ZGF0YSsyMCwgcERFRkktPmlUb3BjYik7CisgICAgICAgICAgbW5nX3B1dF91aW50MzIgKHBSYXdkYXRhKzI0LCBwREVGSS0+aUJvdHRvbWNiKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHdyaXRlIGl0ICovCisgIGlSZXRjb2RlID0gd3JpdGVfcmF3X2NodW5rIChwRGF0YSwgcERFRkktPnNIZWFkZXIuaUNodW5rbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlSYXdsZW4sIHBSYXdkYXRhKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9XUklURV9ERUZJLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBpUmV0Y29kZTsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworV1JJVEVfQ0hVTksgKG1uZ193cml0ZV9iYXNpKQoreworICBtbmdfYmFzaXAgICBwQkFTSTsKKyAgbW5nX3VpbnQ4cCAgcFJhd2RhdGE7CisgIG1uZ191aW50MzIgIGlSYXdsZW47CisgIG1uZ19yZXRjb2RlIGlSZXRjb2RlOworICBtbmdfYm9vbCAgICBiT3BhcXVlOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1dSSVRFX0JBU0ksIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBwQkFTSSA9IChtbmdfYmFzaXApcENodW5rOyAgICAgICAgICAgLyogYWRkcmVzcyB0aGUgcHJvcGVyIGNodW5rICovCisKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyAgaWYgKHBCQVNJLT5pQml0ZGVwdGggPD0gOCkgICAgICAgICAgIC8qIGRldGVybWluZSBvcGFjaXR5IGFscGhhLWZpZWxkICovCisjZW5kaWYKKyAgICBiT3BhcXVlID0gKG1uZ19ib29sKShwQkFTSS0+aUFscGhhID09IDB4RkYpOworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICBlbHNlCisgICAgYk9wYXF1ZSA9IChtbmdfYm9vbCkocEJBU0ktPmlBbHBoYSA9PSAweEZGRkYpOworI2VuZGlmCisKKyAgcFJhd2RhdGEgPSBwRGF0YS0+cFdyaXRlYnVmKzg7ICAgICAgIC8qIGluaXQgb3V0cHV0IGJ1ZmZlciAmIHNpemUgKi8KKyAgaVJhd2xlbiAgPSAxMzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbGwgdGhlIG91dHB1dCBidWZmZXIgKi8KKyAgbW5nX3B1dF91aW50MzIgKHBSYXdkYXRhLCAgIHBCQVNJLT5pV2lkdGgpOworICBtbmdfcHV0X3VpbnQzMiAocFJhd2RhdGErNCwgcEJBU0ktPmlIZWlnaHQpOworCisgICoocFJhd2RhdGErOCkgID0gcEJBU0ktPmlCaXRkZXB0aDsKKyAgKihwUmF3ZGF0YSs5KSAgPSBwQkFTSS0+aUNvbG9ydHlwZTsKKyAgKihwUmF3ZGF0YSsxMCkgPSBwQkFTSS0+aUNvbXByZXNzaW9uOworICAqKHBSYXdkYXRhKzExKSA9IHBCQVNJLT5pRmlsdGVyOworICAqKHBSYXdkYXRhKzEyKSA9IHBCQVNJLT5pSW50ZXJsYWNlOworCisgIGlmICgocEJBU0ktPmlSZWQpIHx8IChwQkFTSS0+aUdyZWVuKSB8fCAocEJBU0ktPmlCbHVlKSB8fAorICAgICAgKCFiT3BhcXVlKSB8fCAocEJBU0ktPmlWaWV3YWJsZSkpCisgIHsKKyAgICBpUmF3bGVuICs9IDY7CisgICAgbW5nX3B1dF91aW50MTYgKHBSYXdkYXRhKzEzLCBwQkFTSS0+aVJlZCk7CisgICAgbW5nX3B1dF91aW50MTYgKHBSYXdkYXRhKzE1LCBwQkFTSS0+aUdyZWVuKTsKKyAgICBtbmdfcHV0X3VpbnQxNiAocFJhd2RhdGErMTcsIHBCQVNJLT5pQmx1ZSk7CisKKyAgICBpZiAoKCFiT3BhcXVlKSB8fCAocEJBU0ktPmlWaWV3YWJsZSkpCisgICAgeworICAgICAgaVJhd2xlbiArPSAyOworICAgICAgbW5nX3B1dF91aW50MTYgKHBSYXdkYXRhKzE5LCBwQkFTSS0+aUFscGhhKTsKKworICAgICAgaWYgKHBCQVNJLT5pVmlld2FibGUpCisgICAgICB7CisgICAgICAgIGlSYXdsZW4rKzsKKyAgICAgICAgKihwUmF3ZGF0YSsyMSkgPSBwQkFTSS0+aVZpZXdhYmxlOworICAgICAgfQorICAgIH0KKyAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHdyaXRlIGl0ICovCisgIGlSZXRjb2RlID0gd3JpdGVfcmF3X2NodW5rIChwRGF0YSwgcEJBU0ktPnNIZWFkZXIuaUNodW5rbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlSYXdsZW4sIHBSYXdkYXRhKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9XUklURV9CQVNJLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBpUmV0Y29kZTsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworV1JJVEVfQ0hVTksgKG1uZ193cml0ZV9jbG9uKQoreworICBtbmdfY2xvbnAgICBwQ0xPTjsKKyAgbW5nX3VpbnQ4cCAgcFJhd2RhdGE7CisgIG1uZ191aW50MzIgIGlSYXdsZW47CisgIG1uZ19yZXRjb2RlIGlSZXRjb2RlOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1dSSVRFX0NMT04sIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBwQ0xPTiA9IChtbmdfY2xvbnApcENodW5rOyAgICAgICAgICAgLyogYWRkcmVzcyB0aGUgcHJvcGVyIGNodW5rICovCisKKyAgcFJhd2RhdGEgPSBwRGF0YS0+cFdyaXRlYnVmKzg7ICAgICAgIC8qIGluaXQgb3V0cHV0IGJ1ZmZlciAmIHNpemUgKi8KKyAgaVJhd2xlbiAgPSA0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmlsbCB0aGUgb3V0cHV0IGJ1ZmZlciAqLworICBtbmdfcHV0X3VpbnQxNiAocFJhd2RhdGEsICAgcENMT04tPmlTb3VyY2VpZCk7CisgIG1uZ19wdXRfdWludDE2IChwUmF3ZGF0YSsyLCBwQ0xPTi0+aUNsb25laWQpOworCisgIGlmICgocENMT04tPmlDbG9uZXR5cGUpIHx8IChwQ0xPTi0+aURvbm90c2hvdykgfHwgKHBDTE9OLT5pQ29uY3JldGUpIHx8IChwQ0xPTi0+Ykhhc2xvY2EpKQorICB7CisgICAgaVJhd2xlbisrOworICAgICoocFJhd2RhdGErNCkgPSBwQ0xPTi0+aUNsb25ldHlwZTsKKworICAgIGlmICgocENMT04tPmlEb25vdHNob3cpIHx8IChwQ0xPTi0+aUNvbmNyZXRlKSB8fCAocENMT04tPmJIYXNsb2NhKSkKKyAgICB7CisgICAgICBpUmF3bGVuKys7CisgICAgICAqKHBSYXdkYXRhKzUpID0gcENMT04tPmlEb25vdHNob3c7CisKKyAgICAgIGlmICgocENMT04tPmlDb25jcmV0ZSkgfHwgKHBDTE9OLT5iSGFzbG9jYSkpCisgICAgICB7CisgICAgICAgIGlSYXdsZW4rKzsKKyAgICAgICAgKihwUmF3ZGF0YSs2KSA9IHBDTE9OLT5pQ29uY3JldGU7CisKKyAgICAgICAgaWYgKHBDTE9OLT5iSGFzbG9jYSkKKyAgICAgICAgeworICAgICAgICAgIGlSYXdsZW4gKz0gOTsKKyAgICAgICAgICAqKHBSYXdkYXRhKzcpID0gcENMT04tPmlMb2NhdGlvbnR5cGU7CisgICAgICAgICAgbW5nX3B1dF9pbnQzMiAocFJhd2RhdGErOCwgIHBDTE9OLT5pTG9jYXRpb254KTsKKyAgICAgICAgICBtbmdfcHV0X2ludDMyIChwUmF3ZGF0YSsxMiwgcENMT04tPmlMb2NhdGlvbnkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgd3JpdGUgaXQgKi8KKyAgaVJldGNvZGUgPSB3cml0ZV9yYXdfY2h1bmsgKHBEYXRhLCBwQ0xPTi0+c0hlYWRlci5pQ2h1bmtuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVJhd2xlbiwgcFJhd2RhdGEpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1dSSVRFX0NMT04sIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIGlSZXRjb2RlOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfUEFTVAorV1JJVEVfQ0hVTksgKG1uZ193cml0ZV9wYXN0KQoreworICBtbmdfcGFzdHAgICAgICAgIHBQQVNUOworICBtbmdfdWludDhwICAgICAgIHBSYXdkYXRhOworICBtbmdfdWludDMyICAgICAgIGlSYXdsZW47CisgIG1uZ19yZXRjb2RlICAgICAgaVJldGNvZGU7CisgIG1uZ19wYXN0X3NvdXJjZXAgcFNvdXJjZTsKKyAgbW5nX3VpbnQzMiAgICAgICBpWDsKKyAgbW5nX3VpbnQ4cCAgICAgICBwVGVtcDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9XUklURV9QQVNULCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcFBBU1QgPSAobW5nX3Bhc3RwKXBDaHVuazsgICAgICAgICAgIC8qIGFkZHJlc3MgdGhlIHByb3BlciBjaHVuayAqLworCisgIHBSYXdkYXRhID0gcERhdGEtPnBXcml0ZWJ1Zis4OyAgICAgICAvKiBpbml0IG91dHB1dCBidWZmZXIgJiBzaXplICovCisgIGlSYXdsZW4gID0gMTEgKyAoMzAgKiBwUEFTVC0+aUNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlcXVpcmVzIGxhcmdlIGJ1ZmZlciA/ICovCisgIGlmIChpUmF3bGVuID4gcERhdGEtPmlXcml0ZWJ1ZnNpemUpCisgICAgTU5HX0FMTE9DIChwRGF0YSwgcFJhd2RhdGEsIGlSYXdsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmlsbCB0aGUgb3V0cHV0IGJ1ZmZlciAqLworICBtbmdfcHV0X3VpbnQxNiAocFJhd2RhdGEsICAgcFBBU1QtPmlEZXN0aWQpOworCisgICoocFJhd2RhdGErMikgPSBwUEFTVC0+aVRhcmdldHR5cGU7CisKKyAgbW5nX3B1dF9pbnQzMiAgKHBSYXdkYXRhKzMsIHBQQVNULT5pVGFyZ2V0eCk7CisgIG1uZ19wdXRfaW50MzIgIChwUmF3ZGF0YSs3LCBwUEFTVC0+aVRhcmdldHkpOworCisgIHBUZW1wICAgPSBwUmF3ZGF0YSsxMTsKKyAgcFNvdXJjZSA9IHBQQVNULT5wU291cmNlczsKKworICBmb3IgKGlYID0gMDsgaVggPCBwUEFTVC0+aUNvdW50OyBpWCsrKQorICB7CisgICAgbW5nX3B1dF91aW50MTYgKHBUZW1wLCAgICBwU291cmNlLT5pU291cmNlaWQpOworCisgICAgKihwVGVtcCsyKSAgPSBwU291cmNlLT5pQ29tcG9zaXRpb247CisgICAgKihwVGVtcCszKSAgPSBwU291cmNlLT5pT3JpZW50YXRpb247CisgICAgKihwVGVtcCs0KSAgPSBwU291cmNlLT5pT2Zmc2V0dHlwZTsKKworICAgIG1uZ19wdXRfaW50MzIgIChwVGVtcCs1LCAgcFNvdXJjZS0+aU9mZnNldHgpOworICAgIG1uZ19wdXRfaW50MzIgIChwVGVtcCs5LCAgcFNvdXJjZS0+aU9mZnNldHkpOworCisgICAgKihwVGVtcCsxMykgPSBwU291cmNlLT5pQm91bmRhcnl0eXBlOworCisgICAgbW5nX3B1dF9pbnQzMiAgKHBUZW1wKzE0LCBwU291cmNlLT5pQm91bmRhcnlsKTsKKyAgICBtbmdfcHV0X2ludDMyICAocFRlbXArMTgsIHBTb3VyY2UtPmlCb3VuZGFyeXIpOworICAgIG1uZ19wdXRfaW50MzIgIChwVGVtcCsyMiwgcFNvdXJjZS0+aUJvdW5kYXJ5dCk7CisgICAgbW5nX3B1dF9pbnQzMiAgKHBUZW1wKzI2LCBwU291cmNlLT5pQm91bmRhcnliKTsKKworICAgIHBTb3VyY2UrKzsKKyAgICBwVGVtcCArPSAzMDsKKyAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHdyaXRlIGl0ICovCisgIGlSZXRjb2RlID0gd3JpdGVfcmF3X2NodW5rIChwRGF0YSwgcFBBU1QtPnNIZWFkZXIuaUNodW5rbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlSYXdsZW4sIHBSYXdkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZyZWUgdGVtcG9yYXJ5IGJ1ZmZlciA/ICovCisgIGlmIChpUmF3bGVuID4gcERhdGEtPmlXcml0ZWJ1ZnNpemUpCisgICAgTU5HX0ZSRUVYIChwRGF0YSwgcFJhd2RhdGEsIGlSYXdsZW4pOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1dSSVRFX1BBU1QsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIGlSZXRjb2RlOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK1dSSVRFX0NIVU5LIChtbmdfd3JpdGVfZGlzYykKK3sKKyAgbW5nX2Rpc2NwICAgICAgICBwRElTQzsKKyAgbW5nX3VpbnQ4cCAgICAgICBwUmF3ZGF0YTsKKyAgbW5nX3VpbnQzMiAgICAgICBpUmF3bGVuOworICBtbmdfcmV0Y29kZSAgICAgIGlSZXRjb2RlOworICBtbmdfdWludDMyICAgICAgIGlYOworICBtbmdfdWludDhwICAgICAgIHBUZW1wMTsKKyAgbW5nX3VpbnQxNnAgICAgICBwVGVtcDI7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fV1JJVEVfRElTQywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBESVNDICAgID0gKG1uZ19kaXNjcClwQ2h1bms7ICAgICAgICAvKiBhZGRyZXNzIHRoZSBwcm9wZXIgY2h1bmsgKi8KKworICBwUmF3ZGF0YSA9IHBEYXRhLT5wV3JpdGVidWYrODsgICAgICAgLyogaW5pdCBvdXRwdXQgYnVmZmVyICYgc2l6ZSAqLworICBpUmF3bGVuICA9IHBESVNDLT5pQ291bnQgPDwgMTsKKworICBwVGVtcDEgICA9IHBSYXdkYXRhOyAgICAgICAgICAgICAgICAgLyogZmlsbCB0aGUgb3V0cHV0IGJ1ZmZlciAqLworICBwVGVtcDIgICA9IHBESVNDLT5wT2JqZWN0aWRzOworCisgIGZvciAoaVggPSAwOyBpWCA8IHBESVNDLT5pQ291bnQ7IGlYKyspCisgIHsKKyAgICBtbmdfcHV0X3VpbnQxNiAocFRlbXAxLCAqcFRlbXAyKTsKKworICAgIHBUZW1wMisrOworICAgIHBUZW1wMSArPSAyOworICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgd3JpdGUgaXQgKi8KKyAgaVJldGNvZGUgPSB3cml0ZV9yYXdfY2h1bmsgKHBEYXRhLCBwRElTQy0+c0hlYWRlci5pQ2h1bmtuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVJhd2xlbiwgcFJhd2RhdGEpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1dSSVRFX0RJU0MsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIGlSZXRjb2RlOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitXUklURV9DSFVOSyAobW5nX3dyaXRlX2JhY2spCit7CisgIG1uZ19iYWNrcCAgIHBCQUNLOworICBtbmdfdWludDhwICBwUmF3ZGF0YTsKKyAgbW5nX3VpbnQzMiAgaVJhd2xlbjsKKyAgbW5nX3JldGNvZGUgaVJldGNvZGU7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fV1JJVEVfQkFDSywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBCQUNLID0gKG1uZ19iYWNrcClwQ2h1bms7ICAgICAgICAgICAvKiBhZGRyZXNzIHRoZSBwcm9wZXIgY2h1bmsgKi8KKworICBwUmF3ZGF0YSA9IHBEYXRhLT5wV3JpdGVidWYrODsgICAgICAgLyogaW5pdCBvdXRwdXQgYnVmZmVyICYgc2l6ZSAqLworICBpUmF3bGVuICA9IDY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaWxsIHRoZSBvdXRwdXQgYnVmZmVyICovCisgIG1uZ19wdXRfdWludDE2IChwUmF3ZGF0YSwgICBwQkFDSy0+aVJlZCk7CisgIG1uZ19wdXRfdWludDE2IChwUmF3ZGF0YSsyLCBwQkFDSy0+aUdyZWVuKTsKKyAgbW5nX3B1dF91aW50MTYgKHBSYXdkYXRhKzQsIHBCQUNLLT5pQmx1ZSk7CisKKyAgaWYgKChwQkFDSy0+aU1hbmRhdG9yeSkgfHwgKHBCQUNLLT5pSW1hZ2VpZCkgfHwgKHBCQUNLLT5pVGlsZSkpCisgIHsKKyAgICBpUmF3bGVuKys7CisgICAgKihwUmF3ZGF0YSs2KSA9IHBCQUNLLT5pTWFuZGF0b3J5OworCisgICAgaWYgKChwQkFDSy0+aUltYWdlaWQpIHx8IChwQkFDSy0+aVRpbGUpKQorICAgIHsKKyAgICAgIGlSYXdsZW4gKz0gMjsKKyAgICAgIG1uZ19wdXRfdWludDE2IChwUmF3ZGF0YSs3LCBwQkFDSy0+aUltYWdlaWQpOworCisgICAgICBpZiAocEJBQ0stPmlUaWxlKQorICAgICAgeworICAgICAgICBpUmF3bGVuKys7CisgICAgICAgICoocFJhd2RhdGErOSkgPSBwQkFDSy0+aVRpbGU7CisgICAgICB9CisgICAgfQorICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgd3JpdGUgaXQgKi8KKyAgaVJldGNvZGUgPSB3cml0ZV9yYXdfY2h1bmsgKHBEYXRhLCBwQkFDSy0+c0hlYWRlci5pQ2h1bmtuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVJhd2xlbiwgcFJhd2RhdGEpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1dSSVRFX0JBQ0ssIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIGlSZXRjb2RlOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitXUklURV9DSFVOSyAobW5nX3dyaXRlX2ZyYW0pCit7CisgIG1uZ19mcmFtcCAgIHBGUkFNOworICBtbmdfdWludDhwICBwUmF3ZGF0YTsKKyAgbW5nX3VpbnQzMiAgaVJhd2xlbjsKKyAgbW5nX3JldGNvZGUgaVJldGNvZGU7CisgIG1uZ191aW50OHAgIHBUZW1wOworICBtbmdfdWludDMycCBwVGVtcDI7CisgIG1uZ191aW50MzIgIGlYOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1dSSVRFX0ZSQU0sIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBwRlJBTSA9IChtbmdfZnJhbXApcENodW5rOyAgICAgICAgICAgLyogYWRkcmVzcyB0aGUgcHJvcGVyIGNodW5rICovCisKKyAgaWYgKHBGUkFNLT5iRW1wdHkpICAgICAgICAgICAgICAgICAgIC8qIGVtcHR5ID8gKi8KKyAgICBpUmV0Y29kZSA9IHdyaXRlX3Jhd19jaHVuayAocERhdGEsIHBGUkFNLT5zSGVhZGVyLmlDaHVua25hbWUsIDAsIDApOworICBlbHNlCisgIHsKKyAgICBwUmF3ZGF0YSA9IHBEYXRhLT5wV3JpdGVidWYrODsgICAgIC8qIGluaXQgb3V0cHV0IGJ1ZmZlciAmIHNpemUgKi8KKyAgICBpUmF3bGVuICA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaWxsIHRoZSBvdXRwdXQgYnVmZmVyICovCisgICAgKnBSYXdkYXRhID0gcEZSQU0tPmlNb2RlOworCisgICAgaWYgKChwRlJBTS0+aU5hbWVzaXplICAgICAgKSB8fAorICAgICAgICAocEZSQU0tPmlDaGFuZ2VkZWxheSAgICkgfHwgKHBGUkFNLT5pQ2hhbmdldGltZW91dCkgfHwKKyAgICAgICAgKHBGUkFNLT5pQ2hhbmdlY2xpcHBpbmcpIHx8IChwRlJBTS0+aUNoYW5nZXN5bmNpZCApICAgICkKKyAgICB7CisgICAgICBpZiAocEZSQU0tPmlOYW1lc2l6ZSkKKyAgICAgICAgTU5HX0NPUFkgKHBSYXdkYXRhKzEsIHBGUkFNLT56TmFtZSwgcEZSQU0tPmlOYW1lc2l6ZSk7CisKKyAgICAgIGlSYXdsZW4gKz0gcEZSQU0tPmlOYW1lc2l6ZTsKKyAgICAgIHBUZW1wID0gcFJhd2RhdGEgKyBwRlJBTS0+aU5hbWVzaXplICsgMTsKKworICAgICAgaWYgKChwRlJBTS0+aUNoYW5nZWRlbGF5ICAgKSB8fCAocEZSQU0tPmlDaGFuZ2V0aW1lb3V0KSB8fAorICAgICAgICAgIChwRlJBTS0+aUNoYW5nZWNsaXBwaW5nKSB8fCAocEZSQU0tPmlDaGFuZ2VzeW5jaWQgKSAgICApCisgICAgICB7CisgICAgICAgICpwVGVtcCAgICAgPSAwOworICAgICAgICAqKHBUZW1wKzEpID0gcEZSQU0tPmlDaGFuZ2VkZWxheTsKKyAgICAgICAgKihwVGVtcCsyKSA9IHBGUkFNLT5pQ2hhbmdldGltZW91dDsKKyAgICAgICAgKihwVGVtcCszKSA9IHBGUkFNLT5pQ2hhbmdlY2xpcHBpbmc7CisgICAgICAgICoocFRlbXArNCkgPSBwRlJBTS0+aUNoYW5nZXN5bmNpZDsKKworICAgICAgICBpUmF3bGVuICs9IDU7CisgICAgICAgIHBUZW1wICAgKz0gNTsKKworICAgICAgICBpZiAocEZSQU0tPmlDaGFuZ2VkZWxheSkKKyAgICAgICAgeworICAgICAgICAgIG1uZ19wdXRfdWludDMyIChwVGVtcCwgcEZSQU0tPmlEZWxheSk7CisgICAgICAgICAgaVJhd2xlbiArPSA0OworICAgICAgICAgIHBUZW1wICAgKz0gNDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwRlJBTS0+aUNoYW5nZXRpbWVvdXQpCisgICAgICAgIHsKKyAgICAgICAgICBtbmdfcHV0X3VpbnQzMiAocFRlbXAsIHBGUkFNLT5pVGltZW91dCk7CisgICAgICAgICAgaVJhd2xlbiArPSA0OworICAgICAgICAgIHBUZW1wICAgKz0gNDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwRlJBTS0+aUNoYW5nZWNsaXBwaW5nKQorICAgICAgICB7CisgICAgICAgICAgKnBUZW1wID0gcEZSQU0tPmlCb3VuZGFyeXR5cGU7CisKKyAgICAgICAgICBtbmdfcHV0X3VpbnQzMiAocFRlbXArMSwgIHBGUkFNLT5pQm91bmRhcnlsKTsKKyAgICAgICAgICBtbmdfcHV0X3VpbnQzMiAocFRlbXArNSwgIHBGUkFNLT5pQm91bmRhcnlyKTsKKyAgICAgICAgICBtbmdfcHV0X3VpbnQzMiAocFRlbXArOSwgIHBGUkFNLT5pQm91bmRhcnl0KTsKKyAgICAgICAgICBtbmdfcHV0X3VpbnQzMiAocFRlbXArMTMsIHBGUkFNLT5pQm91bmRhcnliKTsKKworICAgICAgICAgIGlSYXdsZW4gKz0gMTc7CisgICAgICAgICAgcFRlbXAgICArPSAxNzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwRlJBTS0+aUNoYW5nZXN5bmNpZCkKKyAgICAgICAgeworICAgICAgICAgIGlSYXdsZW4gKz0gcEZSQU0tPmlDb3VudCAqIDQ7CisgICAgICAgICAgcFRlbXAyID0gcEZSQU0tPnBTeW5jaWRzOworCisgICAgICAgICAgZm9yIChpWCA9IDA7IGlYIDwgcEZSQU0tPmlDb3VudDsgaVgrKykKKyAgICAgICAgICB7CisgICAgICAgICAgICBtbmdfcHV0X3VpbnQzMiAocFRlbXAsICpwVGVtcDIpOworCisgICAgICAgICAgICBwVGVtcDIrKzsKKyAgICAgICAgICAgIHBUZW1wICs9IDQ7CisgICAgICAgICAgfSAgCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgd3JpdGUgaXQgKi8KKyAgICBpUmV0Y29kZSA9IHdyaXRlX3Jhd19jaHVuayAocERhdGEsIHBGUkFNLT5zSGVhZGVyLmlDaHVua25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlSYXdsZW4sIHBSYXdkYXRhKTsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1dSSVRFX0ZSQU0sIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIGlSZXRjb2RlOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitXUklURV9DSFVOSyAobW5nX3dyaXRlX21vdmUpCit7CisgIG1uZ19tb3ZlcCAgIHBNT1ZFOworICBtbmdfdWludDhwICBwUmF3ZGF0YTsKKyAgbW5nX3VpbnQzMiAgaVJhd2xlbjsKKyAgbW5nX3JldGNvZGUgaVJldGNvZGU7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fV1JJVEVfTU9WRSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBNT1ZFID0gKG1uZ19tb3ZlcClwQ2h1bms7ICAgICAgICAgICAvKiBhZGRyZXNzIHRoZSBwcm9wZXIgY2h1bmsgKi8KKworICBwUmF3ZGF0YSA9IHBEYXRhLT5wV3JpdGVidWYrODsgICAgICAgLyogaW5pdCBvdXRwdXQgYnVmZmVyICYgc2l6ZSAqLworICBpUmF3bGVuICA9IDEzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmlsbCB0aGUgb3V0cHV0IGJ1ZmZlciAqLworICBtbmdfcHV0X3VpbnQxNiAocFJhd2RhdGEsICAgcE1PVkUtPmlGaXJzdGlkKTsKKyAgbW5nX3B1dF91aW50MTYgKHBSYXdkYXRhKzIsIHBNT1ZFLT5pTGFzdGlkKTsKKworICAqKHBSYXdkYXRhKzQpID0gcE1PVkUtPmlNb3ZldHlwZTsKKworICBtbmdfcHV0X2ludDMyICAocFJhd2RhdGErNSwgcE1PVkUtPmlNb3ZleCk7CisgIG1uZ19wdXRfaW50MzIgIChwUmF3ZGF0YSs5LCBwTU9WRS0+aU1vdmV5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCB3cml0ZSBpdCAqLworICBpUmV0Y29kZSA9IHdyaXRlX3Jhd19jaHVuayAocERhdGEsIHBNT1ZFLT5zSGVhZGVyLmlDaHVua25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpUmF3bGVuLCBwUmF3ZGF0YSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fV1JJVEVfTU9WRSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gaVJldGNvZGU7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK1dSSVRFX0NIVU5LIChtbmdfd3JpdGVfY2xpcCkKK3sKKyAgbW5nX2NsaXBwICAgcENMSVA7CisgIG1uZ191aW50OHAgIHBSYXdkYXRhOworICBtbmdfdWludDMyICBpUmF3bGVuOworICBtbmdfcmV0Y29kZSBpUmV0Y29kZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9XUklURV9DTElQLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcENMSVAgPSAobW5nX2NsaXBwKXBDaHVuazsgICAgICAgICAgIC8qIGFkZHJlc3MgdGhlIHByb3BlciBjaHVuayAqLworCisgIHBSYXdkYXRhID0gcERhdGEtPnBXcml0ZWJ1Zis4OyAgICAgICAvKiBpbml0IG91dHB1dCBidWZmZXIgJiBzaXplICovCisgIGlSYXdsZW4gID0gMjE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaWxsIHRoZSBvdXRwdXQgYnVmZmVyICovCisgIG1uZ19wdXRfdWludDE2IChwUmF3ZGF0YSwgICAgcENMSVAtPmlGaXJzdGlkKTsKKyAgbW5nX3B1dF91aW50MTYgKHBSYXdkYXRhKzIsICBwQ0xJUC0+aUxhc3RpZCk7CisKKyAgKihwUmF3ZGF0YSs0KSA9IHBDTElQLT5pQ2xpcHR5cGU7CisKKyAgbW5nX3B1dF9pbnQzMiAgKHBSYXdkYXRhKzUsICBwQ0xJUC0+aUNsaXBsKTsKKyAgbW5nX3B1dF9pbnQzMiAgKHBSYXdkYXRhKzksICBwQ0xJUC0+aUNsaXByKTsKKyAgbW5nX3B1dF9pbnQzMiAgKHBSYXdkYXRhKzEzLCBwQ0xJUC0+aUNsaXB0KTsKKyAgbW5nX3B1dF9pbnQzMiAgKHBSYXdkYXRhKzE3LCBwQ0xJUC0+aUNsaXBiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCB3cml0ZSBpdCAqLworICBpUmV0Y29kZSA9IHdyaXRlX3Jhd19jaHVuayAocERhdGEsIHBDTElQLT5zSGVhZGVyLmlDaHVua25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpUmF3bGVuLCBwUmF3ZGF0YSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fV1JJVEVfQ0xJUCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gaVJldGNvZGU7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK1dSSVRFX0NIVU5LIChtbmdfd3JpdGVfc2hvdykKK3sKKyAgbW5nX3Nob3dwICAgcFNIT1c7CisgIG1uZ191aW50OHAgIHBSYXdkYXRhOworICBtbmdfdWludDMyICBpUmF3bGVuOworICBtbmdfcmV0Y29kZSBpUmV0Y29kZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9XUklURV9TSE9XLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcFNIT1cgPSAobW5nX3Nob3dwKXBDaHVuazsgICAgICAgICAgIC8qIGFkZHJlc3MgdGhlIHByb3BlciBjaHVuayAqLworCisgIGlmIChwU0hPVy0+YkVtcHR5KSAgICAgICAgICAgICAgICAgICAvKiBlbXB0eSA/ICovCisgICAgaVJldGNvZGUgPSB3cml0ZV9yYXdfY2h1bmsgKHBEYXRhLCBwU0hPVy0+c0hlYWRlci5pQ2h1bmtuYW1lLCAwLCAwKTsKKyAgZWxzZQorICB7CisgICAgcFJhd2RhdGEgPSBwRGF0YS0+cFdyaXRlYnVmKzg7ICAgICAvKiBpbml0IG91dHB1dCBidWZmZXIgJiBzaXplICovCisgICAgaVJhd2xlbiAgPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmlsbCB0aGUgb3V0cHV0IGJ1ZmZlciAqLworICAgIG1uZ19wdXRfdWludDE2IChwUmF3ZGF0YSwgcFNIT1ctPmlGaXJzdGlkKTsKKworICAgIGlmICgocFNIT1ctPmlMYXN0aWQgIT0gcFNIT1ctPmlGaXJzdGlkKSB8fCAocFNIT1ctPmlNb2RlKSkKKyAgICB7CisgICAgICBpUmF3bGVuICs9IDI7CisgICAgICBtbmdfcHV0X3VpbnQxNiAocFJhd2RhdGErMiwgcFNIT1ctPmlMYXN0aWQpOworCisgICAgICBpZiAocFNIT1ctPmlNb2RlKQorICAgICAgeworICAgICAgICBpUmF3bGVuKys7CisgICAgICAgICoocFJhd2RhdGErNCkgPSBwU0hPVy0+aU1vZGU7CisgICAgICB9CisgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHdyaXRlIGl0ICovCisgICAgaVJldGNvZGUgPSB3cml0ZV9yYXdfY2h1bmsgKHBEYXRhLCBwU0hPVy0+c0hlYWRlci5pQ2h1bmtuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpUmF3bGVuLCBwUmF3ZGF0YSk7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9XUklURV9TSE9XLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBpUmV0Y29kZTsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworV1JJVEVfQ0hVTksgKG1uZ193cml0ZV90ZXJtKQoreworICBtbmdfdGVybXAgICBwVEVSTTsKKyAgbW5nX3VpbnQ4cCAgcFJhd2RhdGE7CisgIG1uZ191aW50MzIgIGlSYXdsZW47CisgIG1uZ19yZXRjb2RlIGlSZXRjb2RlOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1dSSVRFX1RFUk0sIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBwVEVSTSAgICAgPSAobW5nX3Rlcm1wKXBDaHVuazsgICAgICAgLyogYWRkcmVzcyB0aGUgcHJvcGVyIGNodW5rICovCisKKyAgcFJhd2RhdGEgID0gcERhdGEtPnBXcml0ZWJ1Zis4OyAgICAgIC8qIGluaXQgb3V0cHV0IGJ1ZmZlciAmIHNpemUgKi8KKyAgaVJhd2xlbiAgID0gMTsKKworICAqcFJhd2RhdGEgPSBwVEVSTS0+aVRlcm1hY3Rpb247ICAgICAgLyogZmlsbCB0aGUgb3V0cHV0IGJ1ZmZlciAqLworCisgIGlmIChwVEVSTS0+aVRlcm1hY3Rpb24gPT0gMykKKyAgeworICAgIGlSYXdsZW4gICAgICAgPSAxMDsKKyAgICAqKHBSYXdkYXRhKzEpID0gcFRFUk0tPmlJdGVyYWN0aW9uOworCisgICAgbW5nX3B1dF91aW50MzIgKHBSYXdkYXRhKzIsIHBURVJNLT5pRGVsYXkpOworICAgIG1uZ19wdXRfdWludDMyIChwUmF3ZGF0YSs2LCBwVEVSTS0+aUl0ZXJtYXgpOworICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgd3JpdGUgaXQgKi8KKyAgaVJldGNvZGUgPSB3cml0ZV9yYXdfY2h1bmsgKHBEYXRhLCBwVEVSTS0+c0hlYWRlci5pQ2h1bmtuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVJhd2xlbiwgcFJhd2RhdGEpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1dSSVRFX1RFUk0sIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIGlSZXRjb2RlOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfU0FWRQorV1JJVEVfQ0hVTksgKG1uZ193cml0ZV9zYXZlKQoreworICBtbmdfc2F2ZXAgICAgICAgcFNBVkU7CisgIG1uZ191aW50OHAgICAgICBwUmF3ZGF0YTsKKyAgbW5nX3VpbnQzMiAgICAgIGlSYXdsZW47CisgIG1uZ19yZXRjb2RlICAgICBpUmV0Y29kZTsKKyAgbW5nX3NhdmVfZW50cnlwIHBFbnRyeTsKKyAgbW5nX3VpbnQzMiAgICAgIGlFbnRyeXNpemU7CisgIG1uZ191aW50OHAgICAgICBwVGVtcDsKKyAgbW5nX3VpbnQzMiAgICAgIGlYOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1dSSVRFX1NBVkUsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBwU0FWRSA9IChtbmdfc2F2ZXApcENodW5rOyAgICAgICAgICAgLyogYWRkcmVzcyB0aGUgcHJvcGVyIGNodW5rICovCisKKyAgaWYgKHBTQVZFLT5iRW1wdHkpICAgICAgICAgICAgICAgICAgIC8qIGVtcHR5ID8gKi8KKyAgICBpUmV0Y29kZSA9IHdyaXRlX3Jhd19jaHVuayAocERhdGEsIHBTQVZFLT5zSGVhZGVyLmlDaHVua25hbWUsIDAsIDApOworICBlbHNlCisgIHsKKyAgICBwUmF3ZGF0YSAgPSBwRGF0YS0+cFdyaXRlYnVmKzg7ICAgIC8qIGluaXQgb3V0cHV0IGJ1ZmZlciAmIHNpemUgKi8KKyAgICBpUmF3bGVuICAgPSAxOworCisgICAgKnBSYXdkYXRhID0gcFNBVkUtPmlPZmZzZXR0eXBlOyAgICAvKiBmaWxsIHRoZSBvdXRwdXQgYnVmZmVyICovCisKKyAgICBpZiAocFNBVkUtPmlPZmZzZXR0eXBlID09IDE2KQorICAgICAgaUVudHJ5c2l6ZSA9IDI1OworICAgIGVsc2UKKyAgICAgIGlFbnRyeXNpemUgPSAxNzsKKworICAgIHBUZW1wICA9IHBSYXdkYXRhKzE7CisgICAgcEVudHJ5ID0gcFNBVkUtPnBFbnRyaWVzOworCisgICAgZm9yIChpWCA9IDA7IGlYIDwgcFNBVkUtPmlDb3VudDsgaVgrKykKKyAgICB7CisgICAgICBpZiAoaVgpICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwdXQgc2VwYXJhdG9yIG51bGwtYnl0ZSwgZXhjZXB0IHRoZSBmaXJzdCAqLworICAgICAgeworICAgICAgICAqcFRlbXAgPSAwOworICAgICAgICBwVGVtcCsrOworICAgICAgICBpUmF3bGVuKys7CisgICAgICB9CisKKyAgICAgIGlSYXdsZW4gKz0gaUVudHJ5c2l6ZSArIHBFbnRyeS0+aU5hbWVzaXplOworICAgICAgKnBUZW1wID0gcEVudHJ5LT5pRW50cnl0eXBlOworCisgICAgICBpZiAocFNBVkUtPmlPZmZzZXR0eXBlID09IDE2KQorICAgICAgeworICAgICAgICBtbmdfcHV0X3VpbnQzMiAocFRlbXArMSwgIHBFbnRyeS0+aU9mZnNldFswXSk7CisgICAgICAgIG1uZ19wdXRfdWludDMyIChwVGVtcCs1LCAgcEVudHJ5LT5pT2Zmc2V0WzFdKTsKKyAgICAgICAgbW5nX3B1dF91aW50MzIgKHBUZW1wKzksICBwRW50cnktPmlTdGFydHRpbWVbMF0pOworICAgICAgICBtbmdfcHV0X3VpbnQzMiAocFRlbXArMTMsIHBFbnRyeS0+aVN0YXJ0dGltZVsxXSk7CisgICAgICAgIG1uZ19wdXRfdWludDMyIChwVGVtcCsxNywgcEVudHJ5LT5pTGF5ZXJucik7CisgICAgICAgIG1uZ19wdXRfdWludDMyIChwVGVtcCsyMSwgcEVudHJ5LT5pRnJhbWVucik7CisKKyAgICAgICAgcFRlbXAgKz0gMjU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIG1uZ19wdXRfdWludDMyIChwVGVtcCsxLCAgcEVudHJ5LT5pT2Zmc2V0WzFdKTsKKyAgICAgICAgbW5nX3B1dF91aW50MzIgKHBUZW1wKzUsICBwRW50cnktPmlTdGFydHRpbWVbMV0pOworICAgICAgICBtbmdfcHV0X3VpbnQzMiAocFRlbXArOSwgIHBFbnRyeS0+aUxheWVybnIpOworICAgICAgICBtbmdfcHV0X3VpbnQzMiAocFRlbXArMTMsIHBFbnRyeS0+aUZyYW1lbnIpOworCisgICAgICAgIHBUZW1wICs9IDE3OworICAgICAgfQorCisgICAgICBpZiAocEVudHJ5LT5pTmFtZXNpemUpCisgICAgICB7CisgICAgICAgIE1OR19DT1BZIChwVGVtcCwgcEVudHJ5LT56TmFtZSwgcEVudHJ5LT5pTmFtZXNpemUpOworICAgICAgICBwVGVtcCArPSBwRW50cnktPmlOYW1lc2l6ZTsKKyAgICAgIH0KKworICAgICAgcEVudHJ5Kys7ICAKKyAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgd3JpdGUgaXQgKi8KKyAgICBpUmV0Y29kZSA9IHdyaXRlX3Jhd19jaHVuayAocERhdGEsIHBTQVZFLT5zSGVhZGVyLmlDaHVua25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlSYXdsZW4sIHBSYXdkYXRhKTsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1dSSVRFX1NBVkUsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIGlSZXRjb2RlOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19TRUVLCitXUklURV9DSFVOSyAobW5nX3dyaXRlX3NlZWspCit7CisgIG1uZ19zZWVrcCAgIHBTRUVLOworICBtbmdfdWludDhwICBwUmF3ZGF0YTsKKyAgbW5nX3VpbnQzMiAgaVJhd2xlbjsKKyAgbW5nX3JldGNvZGUgaVJldGNvZGU7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fV1JJVEVfU0VFSywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBTRUVLICAgID0gKG1uZ19zZWVrcClwQ2h1bms7ICAgICAgICAvKiBhZGRyZXNzIHRoZSBwcm9wZXIgY2h1bmsgKi8KKworICBwUmF3ZGF0YSA9IHBEYXRhLT5wV3JpdGVidWYrODsgICAgICAgLyogaW5pdCBvdXRwdXQgYnVmZmVyICYgc2l6ZSAqLworICBpUmF3bGVuICA9IHBTRUVLLT5pTmFtZXNpemU7CisKKyAgaWYgKGlSYXdsZW4pICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbGwgdGhlIG91dHB1dCBidWZmZXIgKi8KKyAgICBNTkdfQ09QWSAocFJhd2RhdGEsIHBTRUVLLT56TmFtZSwgaVJhd2xlbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgd3JpdGUgaXQgKi8KKyAgaVJldGNvZGUgPSB3cml0ZV9yYXdfY2h1bmsgKHBEYXRhLCBwU0VFSy0+c0hlYWRlci5pQ2h1bmtuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVJhd2xlbiwgcFJhd2RhdGEpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1dSSVRFX1NFRUssIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIGlSZXRjb2RlOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19lWFBJCitXUklURV9DSFVOSyAobW5nX3dyaXRlX2V4cGkpCit7CisgIG1uZ19leHBpcCAgIHBFWFBJOworICBtbmdfdWludDhwICBwUmF3ZGF0YTsKKyAgbW5nX3VpbnQzMiAgaVJhd2xlbjsKKyAgbW5nX3JldGNvZGUgaVJldGNvZGU7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fV1JJVEVfRVhQSSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBFWFBJICAgID0gKG1uZ19leHBpcClwQ2h1bms7ICAgICAgICAvKiBhZGRyZXNzIHRoZSBwcm9wZXIgY2h1bmsgKi8KKworICBwUmF3ZGF0YSA9IHBEYXRhLT5wV3JpdGVidWYrODsgICAgICAgLyogaW5pdCBvdXRwdXQgYnVmZmVyICYgc2l6ZSAqLworICBpUmF3bGVuICA9IDIgKyBwRVhQSS0+aU5hbWVzaXplOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmlsbCB0aGUgb3V0cHV0IGJ1ZmZlciAqLworICBtbmdfcHV0X3VpbnQxNiAocFJhd2RhdGEsIHBFWFBJLT5pU25hcHNob3RpZCk7CisKKyAgaWYgKHBFWFBJLT5pTmFtZXNpemUpCisgICAgTU5HX0NPUFkgKHBSYXdkYXRhKzIsIHBFWFBJLT56TmFtZSwgcEVYUEktPmlOYW1lc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgd3JpdGUgaXQgKi8KKyAgaVJldGNvZGUgPSB3cml0ZV9yYXdfY2h1bmsgKHBEYXRhLCBwRVhQSS0+c0hlYWRlci5pQ2h1bmtuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVJhd2xlbiwgcFJhd2RhdGEpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1dSSVRFX0VYUEksIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIGlSZXRjb2RlOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19mUFJJCitXUklURV9DSFVOSyAobW5nX3dyaXRlX2ZwcmkpCit7CisgIG1uZ19mcHJpcCAgIHBGUFJJOworICBtbmdfdWludDhwICBwUmF3ZGF0YTsKKyAgbW5nX3VpbnQzMiAgaVJhd2xlbjsKKyAgbW5nX3JldGNvZGUgaVJldGNvZGU7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fV1JJVEVfRlBSSSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBGUFJJICAgICAgICAgPSAobW5nX2ZwcmlwKXBDaHVuazsgICAvKiBhZGRyZXNzIHRoZSBwcm9wZXIgY2h1bmsgKi8KKworICBwUmF3ZGF0YSAgICAgID0gcERhdGEtPnBXcml0ZWJ1Zis4OyAgLyogaW5pdCBvdXRwdXQgYnVmZmVyICYgc2l6ZSAqLworICBpUmF3bGVuICAgICAgID0gMjsKKworICAqcFJhd2RhdGEgICAgID0gcEZQUkktPmlEZWx0YXR5cGU7ICAgLyogZmlsbCB0aGUgb3V0cHV0IGJ1ZmZlciAqLworICAqKHBSYXdkYXRhKzEpID0gcEZQUkktPmlQcmlvcml0eTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCB3cml0ZSBpdCAqLworICBpUmV0Y29kZSA9IHdyaXRlX3Jhd19jaHVuayAocERhdGEsIHBGUFJJLT5zSGVhZGVyLmlDaHVua25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpUmF3bGVuLCBwUmF3ZGF0YSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fV1JJVEVfRlBSSSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gaVJldGNvZGU7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX25FRUQKK1dSSVRFX0NIVU5LIChtbmdfd3JpdGVfbmVlZCkKK3sKKyAgbW5nX25lZWRwICAgcE5FRUQ7CisgIG1uZ191aW50OHAgIHBSYXdkYXRhOworICBtbmdfdWludDMyICBpUmF3bGVuOworICBtbmdfcmV0Y29kZSBpUmV0Y29kZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9XUklURV9ORUVELCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcE5FRUQgICAgPSAobW5nX25lZWRwKXBDaHVuazsgICAgICAgIC8qIGFkZHJlc3MgdGhlIHByb3BlciBjaHVuayAqLworCisgIHBSYXdkYXRhID0gcERhdGEtPnBXcml0ZWJ1Zis4OyAgICAgICAvKiBpbml0IG91dHB1dCBidWZmZXIgJiBzaXplICovCisgIGlSYXdsZW4gID0gcE5FRUQtPmlLZXl3b3Jkc3NpemU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaWxsIHRoZSBvdXRwdXQgYnVmZmVyICovCisgIGlmIChwTkVFRC0+aUtleXdvcmRzc2l6ZSkKKyAgICBNTkdfQ09QWSAocFJhd2RhdGEsIHBORUVELT56S2V5d29yZHMsIHBORUVELT5pS2V5d29yZHNzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCB3cml0ZSBpdCAqLworICBpUmV0Y29kZSA9IHdyaXRlX3Jhd19jaHVuayAocERhdGEsIHBORUVELT5zSGVhZGVyLmlDaHVua25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpUmF3bGVuLCBwUmF3ZGF0YSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fV1JJVEVfTkVFRCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gaVJldGNvZGU7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX3BIWWcKK1dSSVRFX0NIVU5LIChtbmdfd3JpdGVfcGh5ZykKK3sKKyAgbW5nX3BoeWdwICAgcFBIWUc7CisgIG1uZ191aW50OHAgIHBSYXdkYXRhOworICBtbmdfdWludDMyICBpUmF3bGVuOworICBtbmdfcmV0Y29kZSBpUmV0Y29kZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9XUklURV9QSFlHLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcFBIWUcgPSAobW5nX3BoeWdwKXBDaHVuazsgICAgICAgICAgIC8qIGFkZHJlc3MgdGhlIHByb3BlciBjaHVuayAqLworCisgIGlmIChwUEhZRy0+YkVtcHR5KSAgICAgICAgICAgICAgICAgICAvKiB3cml0ZSBlbXB0eSA/ICovCisgICAgaVJldGNvZGUgPSB3cml0ZV9yYXdfY2h1bmsgKHBEYXRhLCBwUEhZRy0+c0hlYWRlci5pQ2h1bmtuYW1lLCAwLCAwKTsKKyAgZWxzZQorICB7CisgICAgcFJhd2RhdGEgPSBwRGF0YS0+cFdyaXRlYnVmKzg7ICAgICAvKiBpbml0IG91dHB1dCBidWZmZXIgJiBzaXplICovCisgICAgaVJhd2xlbiAgPSA5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmlsbCB0aGUgb3V0cHV0IGJ1ZmZlciAqLworICAgIG1uZ19wdXRfdWludDMyIChwUmF3ZGF0YSwgICBwUEhZRy0+aVNpemV4KTsKKyAgICBtbmdfcHV0X3VpbnQzMiAocFJhd2RhdGErNCwgcFBIWUctPmlTaXpleSk7CisKKyAgICAqKHBSYXdkYXRhKzgpID0gcFBIWUctPmlVbml0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHdyaXRlIGl0ICovCisgICAgaVJldGNvZGUgPSB3cml0ZV9yYXdfY2h1bmsgKHBEYXRhLCBwUEhZRy0+c0hlYWRlci5pQ2h1bmtuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpUmF3bGVuLCBwUmF3ZGF0YSk7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9XUklURV9QSFlHLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBpUmV0Y29kZTsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisvKiBCMDA0ICovCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisvKiBCMDA0ICovCitXUklURV9DSFVOSyAobW5nX3dyaXRlX2poZHIpCit7CisgIG1uZ19qaGRycCAgIHBKSERSOworICBtbmdfdWludDhwICBwUmF3ZGF0YTsKKyAgbW5nX3VpbnQzMiAgaVJhd2xlbjsKKyAgbW5nX3JldGNvZGUgaVJldGNvZGU7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fV1JJVEVfSkhEUiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBKSERSICAgID0gKG1uZ19qaGRycClwQ2h1bms7ICAgICAgICAvKiBhZGRyZXNzIHRoZSBwcm9wZXIgY2h1bmsgKi8KKyAgcFJhd2RhdGEgPSBwRGF0YS0+cFdyaXRlYnVmKzg7ICAgICAgIC8qIGluaXQgb3V0cHV0IGJ1ZmZlciAmIHNpemUgKi8KKyAgaVJhd2xlbiAgPSAxNjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbGwgdGhlIG91dHB1dCBidWZmZXIgKi8KKyAgbW5nX3B1dF91aW50MzIgKHBSYXdkYXRhLCAgIHBKSERSLT5pV2lkdGgpOworICBtbmdfcHV0X3VpbnQzMiAocFJhd2RhdGErNCwgcEpIRFItPmlIZWlnaHQpOworCisgICoocFJhd2RhdGErOCkgID0gcEpIRFItPmlDb2xvcnR5cGU7CisgICoocFJhd2RhdGErOSkgID0gcEpIRFItPmlJbWFnZXNhbXBsZWRlcHRoOworICAqKHBSYXdkYXRhKzEwKSA9IHBKSERSLT5pSW1hZ2Vjb21wcmVzc2lvbjsKKyAgKihwUmF3ZGF0YSsxMSkgPSBwSkhEUi0+aUltYWdlaW50ZXJsYWNlOworICAqKHBSYXdkYXRhKzEyKSA9IHBKSERSLT5pQWxwaGFzYW1wbGVkZXB0aDsKKyAgKihwUmF3ZGF0YSsxMykgPSBwSkhEUi0+aUFscGhhY29tcHJlc3Npb247CisgICoocFJhd2RhdGErMTQpID0gcEpIRFItPmlBbHBoYWZpbHRlcjsKKyAgKihwUmF3ZGF0YSsxNSkgPSBwSkhEUi0+aUFscGhhaW50ZXJsYWNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHdyaXRlIGl0ICovCisgIGlSZXRjb2RlID0gd3JpdGVfcmF3X2NodW5rIChwRGF0YSwgcEpIRFItPnNIZWFkZXIuaUNodW5rbmFtZSwgaVJhd2xlbiwgcFJhd2RhdGEpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1dSSVRFX0pIRFIsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIGlSZXRjb2RlOworfQorI2Vsc2UKKyNkZWZpbmUgd3JpdGVfamhkciAwCisvKiBCMDA0ICovCisjZW5kaWYgLyogTU5HX0lOQ0xVREVfSk5HICovCisvKiBCMDA0ICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKK1dSSVRFX0NIVU5LIChtbmdfd3JpdGVfamRhYSkKK3sKKyAgbW5nX2pkYXRwICAgcEpEQUE7CisgIG1uZ19yZXRjb2RlIGlSZXRjb2RlOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1dSSVRFX0pEQUEsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBwSkRBQSA9IChtbmdfamRhYXApcENodW5rOyAgICAgICAgICAgLyogYWRkcmVzcyB0aGUgcHJvcGVyIGNodW5rICovCisKKyAgaWYgKHBKREFBLT5iRW1wdHkpICAgICAgICAgICAgICAgICAgIC8qIGFuZCB3cml0ZSBpdCAqLworICAgIGlSZXRjb2RlID0gd3JpdGVfcmF3X2NodW5rIChwRGF0YSwgcEpEQUEtPnNIZWFkZXIuaUNodW5rbmFtZSwgMCwgMCk7CisgIGVsc2UKKyAgICBpUmV0Y29kZSA9IHdyaXRlX3Jhd19jaHVuayAocERhdGEsIHBKREFBLT5zSGVhZGVyLmlDaHVua25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBKREFBLT5pRGF0YXNpemUsIHBKREFBLT5wRGF0YSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fV1JJVEVfSkRBQSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gaVJldGNvZGU7Cit9CisjZWxzZQorI2RlZmluZSB3cml0ZV9qZGFhIDAKKyNlbmRpZiAvKiBNTkdfSU5DTFVERV9KTkcgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworLyogQjAwNCAqLworI2lmZGVmIE1OR19JTkNMVURFX0pORworLyogQjAwNCAqLworV1JJVEVfQ0hVTksgKG1uZ193cml0ZV9qZGF0KQoreworICBtbmdfamRhdHAgICBwSkRBVDsKKyAgbW5nX3JldGNvZGUgaVJldGNvZGU7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fV1JJVEVfSkRBVCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBKREFUID0gKG1uZ19qZGF0cClwQ2h1bms7ICAgICAgICAgICAvKiBhZGRyZXNzIHRoZSBwcm9wZXIgY2h1bmsgKi8KKworICBpZiAocEpEQVQtPmJFbXB0eSkgICAgICAgICAgICAgICAgICAgLyogYW5kIHdyaXRlIGl0ICovCisgICAgaVJldGNvZGUgPSB3cml0ZV9yYXdfY2h1bmsgKHBEYXRhLCBwSkRBVC0+c0hlYWRlci5pQ2h1bmtuYW1lLCAwLCAwKTsKKyAgZWxzZQorICAgIGlSZXRjb2RlID0gd3JpdGVfcmF3X2NodW5rIChwRGF0YSwgcEpEQVQtPnNIZWFkZXIuaUNodW5rbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEpEQVQtPmlEYXRhc2l6ZSwgcEpEQVQtPnBEYXRhKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9XUklURV9KREFULCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBpUmV0Y29kZTsKK30KKyNlbHNlCisjZGVmaW5lIHdyaXRlX2pkYXQgMAorLyogQjAwNCAqLworI2VuZGlmIC8qIE1OR19JTkNMVURFX0pORyAqLworLyogQjAwNCAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisvKiBCMDA0ICovCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisvKiBCMDA0ICovCitXUklURV9DSFVOSyAobW5nX3dyaXRlX2pzZXApCit7CisgIG1uZ19qc2VwcCAgIHBKU0VQOworICBtbmdfcmV0Y29kZSBpUmV0Y29kZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9XUklURV9KU0VQLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcEpTRVAgPSAobW5nX2pzZXBwKXBDaHVuazsgICAgICAgICAgIC8qIGFkZHJlc3MgdGhlIHByb3BlciBjaHVuayAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHdyaXRlIGl0ICovCisgIGlSZXRjb2RlID0gd3JpdGVfcmF3X2NodW5rIChwRGF0YSwgcEpTRVAtPnNIZWFkZXIuaUNodW5rbmFtZSwgMCwgMCk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fV1JJVEVfSlNFUCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gaVJldGNvZGU7Cit9CisjZWxzZQorI2RlZmluZSB3cml0ZV9qc2VwIDAKKy8qIEIwMDQgKi8KKyNlbmRpZiAvKiBNTkdfSU5DTFVERV9KTkcgKi8KKy8qIEIwMDQgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCitXUklURV9DSFVOSyAobW5nX3dyaXRlX2RoZHIpCit7CisgIG1uZ19kaGRycCAgIHBESERSOworICBtbmdfdWludDhwICBwUmF3ZGF0YTsKKyAgbW5nX3VpbnQzMiAgaVJhd2xlbjsKKyAgbW5nX3JldGNvZGUgaVJldGNvZGU7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fV1JJVEVfREhEUiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBESERSICAgID0gKG1uZ19kaGRycClwQ2h1bms7ICAgICAgICAvKiBhZGRyZXNzIHRoZSBwcm9wZXIgY2h1bmsgKi8KKworICBwUmF3ZGF0YSA9IHBEYXRhLT5wV3JpdGVidWYrODsgICAgICAgLyogaW5pdCBvdXRwdXQgYnVmZmVyICYgc2l6ZSAqLworICBpUmF3bGVuICA9IDQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaWxsIHRoZSBvdXRwdXQgYnVmZmVyICovCisgIG1uZ19wdXRfdWludDE2IChwUmF3ZGF0YSwgcERIRFItPmlPYmplY3RpZCk7CisKKyAgKihwUmF3ZGF0YSsyKSA9IHBESERSLT5pSW1hZ2V0eXBlOworICAqKHBSYXdkYXRhKzMpID0gcERIRFItPmlEZWx0YXR5cGU7CisKKyAgaWYgKHBESERSLT5pRGVsdGF0eXBlICE9IDcpCisgIHsKKyAgICBpUmF3bGVuICs9IDg7CisgICAgbW5nX3B1dF91aW50MzIgKHBSYXdkYXRhKzQsIHBESERSLT5pQmxvY2t3aWR0aCk7CisgICAgbW5nX3B1dF91aW50MzIgKHBSYXdkYXRhKzgsIHBESERSLT5pQmxvY2toZWlnaHQpOworCisgICAgaWYgKHBESERSLT5pRGVsdGF0eXBlICE9IDApCisgICAgeworICAgICAgaVJhd2xlbiArPSA4OworICAgICAgbW5nX3B1dF91aW50MzIgKHBSYXdkYXRhKzEyLCBwREhEUi0+aUJsb2NreCk7CisgICAgICBtbmdfcHV0X3VpbnQzMiAocFJhd2RhdGErMTYsIHBESERSLT5pQmxvY2t5KTsKKyAgICB9CisgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCB3cml0ZSBpdCAqLworICBpUmV0Y29kZSA9IHdyaXRlX3Jhd19jaHVuayAocERhdGEsIHBESERSLT5zSGVhZGVyLmlDaHVua25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpUmF3bGVuLCBwUmF3ZGF0YSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fV1JJVEVfREhEUiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gaVJldGNvZGU7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCitXUklURV9DSFVOSyAobW5nX3dyaXRlX3Byb20pCit7CisgIG1uZ19wcm9tcCAgIHBQUk9NOworICBtbmdfdWludDhwICBwUmF3ZGF0YTsKKyAgbW5nX3VpbnQzMiAgaVJhd2xlbjsKKyAgbW5nX3JldGNvZGUgaVJldGNvZGU7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fV1JJVEVfUFJPTSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBQUk9NICAgID0gKG1uZ19wcm9tcClwQ2h1bms7ICAgICAgICAvKiBhZGRyZXNzIHRoZSBwcm9wZXIgY2h1bmsgKi8KKworICBwUmF3ZGF0YSA9IHBEYXRhLT5wV3JpdGVidWYrODsgICAgICAgLyogaW5pdCBvdXRwdXQgYnVmZmVyICYgc2l6ZSAqLworICBpUmF3bGVuICA9IDM7CisKKyAgKnBSYXdkYXRhICAgICA9IHBQUk9NLT5pQ29sb3J0eXBlOyAgIC8qIGZpbGwgdGhlIG91dHB1dCBidWZmZXIgKi8KKyAgKihwUmF3ZGF0YSsxKSA9IHBQUk9NLT5pU2FtcGxlZGVwdGg7CisgICoocFJhd2RhdGErMikgPSBwUFJPTS0+aUZpbGx0eXBlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHdyaXRlIGl0ICovCisgIGlSZXRjb2RlID0gd3JpdGVfcmF3X2NodW5rIChwRGF0YSwgcFBST00tPnNIZWFkZXIuaUNodW5rbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlSYXdsZW4sIHBSYXdkYXRhKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9XUklURV9QUk9NLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBpUmV0Y29kZTsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKK1dSSVRFX0NIVU5LIChtbmdfd3JpdGVfaXBuZykKK3sKKyAgbW5nX2lwbmdwICAgcElQTkc7CisgIG1uZ19yZXRjb2RlIGlSZXRjb2RlOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1dSSVRFX0lQTkcsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBwSVBORyA9IChtbmdfaXBuZ3ApcENodW5rOyAgICAgICAgICAgLyogYWRkcmVzcyB0aGUgcHJvcGVyIGNodW5rICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgd3JpdGUgaXQgKi8KKyAgaVJldGNvZGUgPSB3cml0ZV9yYXdfY2h1bmsgKHBEYXRhLCBwSVBORy0+c0hlYWRlci5pQ2h1bmtuYW1lLCAwLCAwKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9XUklURV9JUE5HLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBpUmV0Y29kZTsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKK1dSSVRFX0NIVU5LIChtbmdfd3JpdGVfcHBsdCkKK3sKKyAgbW5nX3BwbHRwICAgICAgIHBQUExUOworICBtbmdfdWludDhwICAgICAgcFJhd2RhdGE7CisgIG1uZ191aW50MzIgICAgICBpUmF3bGVuOworICBtbmdfcmV0Y29kZSAgICAgaVJldGNvZGU7CisgIG1uZ19wcGx0X2VudHJ5cCBwRW50cnk7CisgIG1uZ191aW50OHAgICAgICBwVGVtcDsKKyAgbW5nX3VpbnQzMiAgICAgIGlYOworICBtbmdfYm9vbCAgICAgICAgYkhhc2dyb3VwOworICBtbmdfdWludDhwICAgICAgcExhc3RpZCA9IDA7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fV1JJVEVfUFBMVCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBQUExUID0gKG1uZ19wcGx0cClwQ2h1bms7ICAgICAgICAgICAvKiBhZGRyZXNzIHRoZSBwcm9wZXIgY2h1bmsgKi8KKworICBwUmF3ZGF0YSAgPSBwRGF0YS0+cFdyaXRlYnVmKzg7ICAgICAgLyogaW5pdCBvdXRwdXQgYnVmZmVyICYgc2l6ZSAqLworICBpUmF3bGVuICAgPSAxOworCisgICpwUmF3ZGF0YSA9IHBQUExULT5pRGVsdGF0eXBlOyAgICAgICAvKiBmaWxsIHRoZSBvdXRwdXQgYnVmZmVyICovCisKKyAgcFRlbXAgICAgID0gcFJhd2RhdGErMTsKKyAgYkhhc2dyb3VwID0gTU5HX0ZBTFNFOworCisgIGZvciAoaVggPSAwOyBpWCA8IHBQUExULT5pQ291bnQ7IGlYKyspCisgIHsKKyAgICBwRW50cnkgPSAmcFBQTFQtPmFFbnRyaWVzW2lYXTsKKyAgICAKKyAgICBpZiAocEVudHJ5LT5iVXNlZCkgICAgICAgICAgICAgICAgIC8qIHZhbGlkIGVudHJ5ID8gKi8KKyAgICB7CisgICAgICBpZiAoIWJIYXNncm91cCkgICAgICAgICAgICAgICAgICAvKiBzdGFydCBhIG5ldyBncm91cCA/ICovCisgICAgICB7CisgICAgICAgIGJIYXNncm91cCAgPSBNTkdfVFJVRTsKKyAgICAgICAgcExhc3RpZCAgICA9IHBUZW1wKzE7CisKKyAgICAgICAgKnBUZW1wICAgICA9IChtbmdfdWludDgpaVg7CisgICAgICAgICoocFRlbXArMSkgPSAwOworCisgICAgICAgIHBUZW1wICs9IDI7CisgICAgICAgIGlSYXdsZW4gKz0gMjsKKyAgICAgIH0KKworICAgICAgc3dpdGNoIChwUFBMVC0+aURlbHRhdHlwZSkgICAgICAgLyogYWRkIGdyb3VwLWVudHJ5IGRlcGVuZGluZyBvbiB0eXBlICovCisgICAgICB7CisgICAgICAgIGNhc2UgMDogOworICAgICAgICBjYXNlIDE6IHsKKyAgICAgICAgICAgICAgICAgICpwVGVtcCAgICAgPSBwRW50cnktPmlSZWQ7CisgICAgICAgICAgICAgICAgICAqKHBUZW1wKzEpID0gcEVudHJ5LT5pR3JlZW47CisgICAgICAgICAgICAgICAgICAqKHBUZW1wKzIpID0gcEVudHJ5LT5pQmx1ZTsKKworICAgICAgICAgICAgICAgICAgcFRlbXAgKz0gMzsKKyAgICAgICAgICAgICAgICAgIGlSYXdsZW4gKz0gMzsKKworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgMjogOworICAgICAgICBjYXNlIDM6IHsKKyAgICAgICAgICAgICAgICAgICpwVGVtcCAgICAgPSBwRW50cnktPmlBbHBoYTsKKworICAgICAgICAgICAgICAgICAgcFRlbXArKzsKKyAgICAgICAgICAgICAgICAgIGlSYXdsZW4rKzsKKworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgNDogOworICAgICAgICBjYXNlIDU6IHsKKyAgICAgICAgICAgICAgICAgICpwVGVtcCAgICAgPSBwRW50cnktPmlSZWQ7CisgICAgICAgICAgICAgICAgICAqKHBUZW1wKzEpID0gcEVudHJ5LT5pR3JlZW47CisgICAgICAgICAgICAgICAgICAqKHBUZW1wKzIpID0gcEVudHJ5LT5pQmx1ZTsKKyAgICAgICAgICAgICAgICAgICoocFRlbXArMykgPSBwRW50cnktPmlBbHBoYTsKKworICAgICAgICAgICAgICAgICAgcFRlbXAgKz0gNDsKKyAgICAgICAgICAgICAgICAgIGlSYXdsZW4gKz0gNDsKKworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBpZiAoYkhhc2dyb3VwKSAgICAgICAgICAgICAgICAgICAvKiBmaW5pc2ggb2ZmIGEgZ3JvdXAgPyAqLworICAgICAgICAqcExhc3RpZCA9IChtbmdfdWludDgpKGlYLTEpOworCisgICAgICBiSGFzZ3JvdXAgPSBNTkdfRkFMU0U7CisgICAgfQorICB9CisKKyAgaWYgKGJIYXNncm91cCkgICAgICAgICAgICAgICAgICAgICAgIC8qIGxhc3QgZ3JvdXAgdW5maW5pc2hlZCA/ICovCisgICAgKnBMYXN0aWQgPSAobW5nX3VpbnQ4KShwUFBMVC0+aUNvdW50LTEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd3JpdGUgdGhlIG91dHB1dCBidWZmZXIgKi8KKyAgaVJldGNvZGUgPSB3cml0ZV9yYXdfY2h1bmsgKHBEYXRhLCBwUFBMVC0+c0hlYWRlci5pQ2h1bmtuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVJhd2xlbiwgcFJhd2RhdGEpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1dSSVRFX1BQTFQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIGlSZXRjb2RlOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworI2lmZGVmIE1OR19JTkNMVURFX0pORworV1JJVEVfQ0hVTksgKG1uZ193cml0ZV9pam5nKQoreworICBtbmdfaWpuZ3AgICBwSUpORzsKKyAgbW5nX3JldGNvZGUgaVJldGNvZGU7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fV1JJVEVfSUpORywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBJSk5HID0gKG1uZ19pam5ncClwQ2h1bms7ICAgICAgICAgICAvKiBhZGRyZXNzIHRoZSBwcm9wZXIgY2h1bmsgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCB3cml0ZSBpdCAqLworICBpUmV0Y29kZSA9IHdyaXRlX3Jhd19jaHVuayAocERhdGEsIHBJSk5HLT5zSGVhZGVyLmlDaHVua25hbWUsIDAsIDApOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1dSSVRFX0lKTkcsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIGlSZXRjb2RlOworfQorI2VuZGlmCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCitXUklURV9DSFVOSyAobW5nX3dyaXRlX2Ryb3ApCit7CisgIG1uZ19kcm9wcCAgICAgICAgcERST1A7CisgIG1uZ191aW50OHAgICAgICAgcFJhd2RhdGE7CisgIG1uZ191aW50MzIgICAgICAgaVJhd2xlbjsKKyAgbW5nX3JldGNvZGUgICAgICBpUmV0Y29kZTsKKyAgbW5nX3VpbnQzMiAgICAgICBpWDsKKyAgbW5nX3VpbnQ4cCAgICAgICBwVGVtcDE7CisgIG1uZ19jaHVua2lkcCAgICAgcFRlbXAyOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1dSSVRFX0RST1AsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBwRFJPUCAgICA9IChtbmdfZHJvcHApcENodW5rOyAgICAgICAgLyogYWRkcmVzcyB0aGUgcHJvcGVyIGNodW5rICovCisKKyAgcFJhd2RhdGEgPSBwRGF0YS0+cFdyaXRlYnVmKzg7ICAgICAgIC8qIGluaXQgb3V0cHV0IGJ1ZmZlciAmIHNpemUgKi8KKyAgaVJhd2xlbiAgPSBwRFJPUC0+aUNvdW50IDw8IDI7CisKKyAgcFRlbXAxICAgPSBwUmF3ZGF0YTsgICAgICAgICAgICAgICAgIC8qIGZpbGwgdGhlIG91dHB1dCBidWZmZXIgKi8KKyAgcFRlbXAyICAgPSBwRFJPUC0+cENodW5rbmFtZXM7CisKKyAgZm9yIChpWCA9IDA7IGlYIDwgcERST1AtPmlDb3VudDsgaVgrKykKKyAgeworICAgIG1uZ19wdXRfdWludDMyIChwVGVtcDEsIChtbmdfdWludDMyKSpwVGVtcDIpOworCisgICAgcFRlbXAyKys7CisgICAgcFRlbXAxICs9IDQ7CisgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCB3cml0ZSBpdCAqLworICBpUmV0Y29kZSA9IHdyaXRlX3Jhd19jaHVuayAocERhdGEsIHBEUk9QLT5zSGVhZGVyLmlDaHVua25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpUmF3bGVuLCBwUmF3ZGF0YSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fV1JJVEVfRFJPUCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gaVJldGNvZGU7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfREJZSworV1JJVEVfQ0hVTksgKG1uZ193cml0ZV9kYnlrKQoreworICBtbmdfZGJ5a3AgICBwREJZSzsKKyAgbW5nX3VpbnQ4cCAgcFJhd2RhdGE7CisgIG1uZ191aW50MzIgIGlSYXdsZW47CisgIG1uZ19yZXRjb2RlIGlSZXRjb2RlOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1dSSVRFX0RCWUssIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBwREJZSyA9IChtbmdfZGJ5a3ApcENodW5rOyAgICAgICAgICAgLyogYWRkcmVzcyB0aGUgcHJvcGVyIGNodW5rICovCisKKyAgcFJhd2RhdGEgPSBwRGF0YS0+cFdyaXRlYnVmKzg7ICAgICAgIC8qIGluaXQgb3V0cHV0IGJ1ZmZlciAmIHNpemUgKi8KKyAgaVJhd2xlbiAgPSA1ICsgcERCWUstPmlLZXl3b3Jkc3NpemU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaWxsIHRoZSBvdXRwdXQgYnVmZmVyICovCisgIG1uZ19wdXRfdWludDMyIChwUmF3ZGF0YSwgcERCWUstPmlDaHVua25hbWUpOworICAqKHBSYXdkYXRhKzQpID0gcERCWUstPmlQb2xhcml0eTsKKworICBpZiAocERCWUstPmlLZXl3b3Jkc3NpemUpCisgICAgTU5HX0NPUFkgKHBSYXdkYXRhKzUsIHBEQllLLT56S2V5d29yZHMsIHBEQllLLT5pS2V5d29yZHNzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCB3cml0ZSBpdCAqLworICBpUmV0Y29kZSA9IHdyaXRlX3Jhd19jaHVuayAocERhdGEsIHBEQllLLT5zSGVhZGVyLmlDaHVua25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpUmF3bGVuLCBwUmF3ZGF0YSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fV1JJVEVfREJZSywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gaVJldGNvZGU7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19PUkRSCitXUklURV9DSFVOSyAobW5nX3dyaXRlX29yZHIpCit7CisgIG1uZ19vcmRycCAgICAgICBwT1JEUjsKKyAgbW5nX3VpbnQ4cCAgICAgIHBSYXdkYXRhOworICBtbmdfdWludDMyICAgICAgaVJhd2xlbjsKKyAgbW5nX3JldGNvZGUgICAgIGlSZXRjb2RlOworICBtbmdfdWludDhwICAgICAgcFRlbXA7CisgIG1uZ19vcmRyX2VudHJ5cCBwRW50cnk7CisgIG1uZ191aW50MzIgICAgICBpWDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9XUklURV9PUkRSLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcE9SRFIgICAgPSAobW5nX29yZHJwKXBDaHVuazsgICAgICAgIC8qIGFkZHJlc3MgdGhlIHByb3BlciBjaHVuayAqLworCisgIHBSYXdkYXRhID0gcERhdGEtPnBXcml0ZWJ1Zis4OyAgICAgICAvKiBpbml0IG91dHB1dCBidWZmZXIgJiBzaXplICovCisgIGlSYXdsZW4gID0gcE9SRFItPmlDb3VudCAqIDU7CisKKyAgcFRlbXAgICAgPSBwUmF3ZGF0YTsgICAgICAgICAgICAgICAgIC8qIGZpbGwgdGhlIG91dHB1dCBidWZmZXIgKi8KKyAgcEVudHJ5ICAgPSBwT1JEUi0+cEVudHJpZXM7CisKKyAgZm9yIChpWCA9IDA7IGlYIDwgcE9SRFItPmlDb3VudDsgaVgrKykKKyAgeworICAgIG1uZ19wdXRfdWludDMyIChwVGVtcCwgcEVudHJ5LT5pQ2h1bmtuYW1lKTsKKyAgICAqKHBUZW1wKzQpID0gcEVudHJ5LT5pT3JkZXJ0eXBlOworICAgIHBUZW1wICs9IDU7CisgICAgcEVudHJ5Kys7CisgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCB3cml0ZSBpdCAqLworICBpUmV0Y29kZSA9IHdyaXRlX3Jhd19jaHVuayAocERhdGEsIHBPUkRSLT5zSGVhZGVyLmlDaHVua25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpUmF3bGVuLCBwUmF3ZGF0YSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fV1JJVEVfT1JEUiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gaVJldGNvZGU7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitXUklURV9DSFVOSyAobW5nX3dyaXRlX21hZ24pCit7CisgIG1uZ19tYWducCAgIHBNQUdOOworICBtbmdfdWludDhwICBwUmF3ZGF0YTsKKyAgbW5nX3VpbnQzMiAgaVJhd2xlbjsKKyAgbW5nX3JldGNvZGUgaVJldGNvZGU7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fV1JJVEVfTUFHTiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBNQUdOICAgID0gKG1uZ19tYWducClwQ2h1bms7ICAgICAgICAvKiBhZGRyZXNzIHRoZSBwcm9wZXIgY2h1bmsgKi8KKworICBwUmF3ZGF0YSA9IHBEYXRhLT5wV3JpdGVidWYrODsgICAgICAgLyogaW5pdCBvdXRwdXQgYnVmZmVyICYgc2l6ZSAqLworICBpUmF3bGVuICA9IDE4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmlsbCB0aGUgb3V0cHV0IGJ1ZmZlciAqLworICBtbmdfcHV0X3VpbnQxNiAocFJhd2RhdGEsICAgIHBNQUdOLT5pRmlyc3RpZCk7CisgIG1uZ19wdXRfdWludDE2IChwUmF3ZGF0YSsyLCAgcE1BR04tPmlMYXN0aWQpOworICAqKHBSYXdkYXRhKzQpID0gcE1BR04tPmlNZXRob2RYOworICBtbmdfcHV0X3VpbnQxNiAocFJhd2RhdGErNSwgIHBNQUdOLT5pTVgpOworICBtbmdfcHV0X3VpbnQxNiAocFJhd2RhdGErNywgIHBNQUdOLT5pTVkpOworICBtbmdfcHV0X3VpbnQxNiAocFJhd2RhdGErOSwgIHBNQUdOLT5pTUwpOworICBtbmdfcHV0X3VpbnQxNiAocFJhd2RhdGErMTEsIHBNQUdOLT5pTVIpOworICBtbmdfcHV0X3VpbnQxNiAocFJhd2RhdGErMTMsIHBNQUdOLT5pTVQpOworICBtbmdfcHV0X3VpbnQxNiAocFJhd2RhdGErMTUsIHBNQUdOLT5pTUIpOworICAqKHBSYXdkYXRhKzE3KSA9IHBNQUdOLT5pTWV0aG9kWTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9wdGltaXplIGxlbmd0aCAqLworICBpZiAocE1BR04tPmlNZXRob2RZID09IHBNQUdOLT5pTWV0aG9kWCkKKyAgeworICAgIGlSYXdsZW4tLTsKKworICAgIGlmIChwTUFHTi0+aU1CID09IHBNQUdOLT5pTVkpCisgICAgeworICAgICAgaVJhd2xlbiAtPSAyOworCisgICAgICBpZiAocE1BR04tPmlNVCA9PSBwTUFHTi0+aU1ZKQorICAgICAgeworICAgICAgICBpUmF3bGVuIC09IDI7CisKKyAgICAgICAgaWYgKHBNQUdOLT5pTVIgPT0gcE1BR04tPmlNWCkKKyAgICAgICAgeworICAgICAgICAgIGlSYXdsZW4gLT0gMjsKKworICAgICAgICAgIGlmIChwTUFHTi0+aU1MID09IHBNQUdOLT5pTVgpCisgICAgICAgICAgeworICAgICAgICAgICAgaVJhd2xlbiAtPSAyOworCisgICAgICAgICAgICBpZiAocE1BR04tPmlNWSA9PSBwTUFHTi0+aU1YKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpUmF3bGVuIC09IDI7CisKKyAgICAgICAgICAgICAgaWYgKHBNQUdOLT5pTVggPT0gMSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlSYXdsZW4gLT0gMjsKKworICAgICAgICAgICAgICAgIGlmIChwTUFHTi0+aU1ldGhvZFggPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpUmF3bGVuLS07CisKKyAgICAgICAgICAgICAgICAgIGlmIChwTUFHTi0+aUxhc3RpZCA9PSBwTUFHTi0+aUZpcnN0aWQpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlSYXdsZW4gLT0gMjsKKworICAgICAgICAgICAgICAgICAgICBpZiAocE1BR04tPmlGaXJzdGlkID09IDApCisgICAgICAgICAgICAgICAgICAgICAgaVJhd2xlbiA9IDA7CisKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCB3cml0ZSBpdCAqLworICBpUmV0Y29kZSA9IHdyaXRlX3Jhd19jaHVuayAocERhdGEsIHBNQUdOLT5zSGVhZGVyLmlDaHVua25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpUmF3bGVuLCBwUmF3ZGF0YSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fV1JJVEVfTUFHTiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gaVJldGNvZGU7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfSU5DTFVERV9NUE5HX1BST1BPU0FMCitXUklURV9DSFVOSyAobW5nX3dyaXRlX21wbmcpCit7CisgIG1uZ19tcG5ncCAgIHBNUE5HOworICBtbmdfdWludDhwICBwUmF3ZGF0YTsKKyAgbW5nX3VpbnQzMiAgaVJhd2xlbjsKKyAgbW5nX3JldGNvZGUgaVJldGNvZGU7CisgIG1uZ191aW50OHAgIHBCdWYgPSAwOworICBtbmdfdWludDMyICBpQnVmbGVuOworICBtbmdfdWludDMyICBpUmVhbGxlbjsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9XUklURV9NUE5HLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcE1QTkcgPSAobW5nX21wbmdwKXBDaHVuazsgICAgICAgICAgIC8qIGFkZHJlc3MgdGhlIHByb3BlciBjaHVuayAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29tcHJlc3MgdGhlIGZyYW1lIHN0cnVjdHVyZXMgKi8KKyAgaVJldGNvZGUgPSBkZWZsYXRlX2J1ZmZlciAocERhdGEsIChtbmdfdWludDhwKXBNUE5HLT5wRnJhbWVzLCBwTVBORy0+aUZyYW1lc3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQnVmLCAmaUJ1ZmxlbiwgJmlSZWFsbGVuKTsKKworICBpZiAoIWlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAgLyogYWxsIG9rID8gKi8KKyAgeworICAgIHBSYXdkYXRhID0gcERhdGEtPnBXcml0ZWJ1Zis4OyAgICAgLyogaW5pdCBvdXRwdXQgYnVmZmVyICYgc2l6ZSAqLworICAgIGlSYXdsZW4gID0gMTUgKyBpUmVhbGxlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlcXVpcmVzIGxhcmdlIGJ1ZmZlciA/ICovCisgICAgaWYgKGlSYXdsZW4gPiBwRGF0YS0+aVdyaXRlYnVmc2l6ZSkKKyAgICAgIE1OR19BTExPQyAocERhdGEsIHBSYXdkYXRhLCBpUmF3bGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbGwgdGhlIGJ1ZmZlciAqLworICAgIG1uZ19wdXRfdWludDMyIChwUmF3ZGF0YSwgICAgcE1QTkctPmlGcmFtZXdpZHRoKTsKKyAgICBtbmdfcHV0X3VpbnQzMiAocFJhd2RhdGErNCwgIHBNUE5HLT5pRnJhbWVoZWlnaHQpOworICAgIG1uZ19wdXRfdWludDE2IChwUmF3ZGF0YSs4LCAgcE1QTkctPmlOdW1wbGF5cyk7CisgICAgbW5nX3B1dF91aW50MTYgKHBSYXdkYXRhKzEwLCBwTVBORy0+aVRpY2tzcGVyc2VjKTsKKyAgICAqKHBSYXdkYXRhKzEyKSA9IHBNUE5HLT5pQ29tcHJlc3Npb25tZXRob2Q7CisKKyAgICBpZiAoaVJlYWxsZW4pCisgICAgICBNTkdfQ09QWSAocFJhd2RhdGErMTMsIHBCdWYsIGlSZWFsbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCB3cml0ZSBpdCAqLworICAgIGlSZXRjb2RlID0gd3JpdGVfcmF3X2NodW5rIChwRGF0YSwgcE1QTkctPnNIZWFkZXIuaUNodW5rbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVJhd2xlbiwgcFJhd2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZHJvcCB0aGUgdGVtcCBidWZmZXIgPyAqLworICAgIGlmIChpUmF3bGVuID4gcERhdGEtPmlXcml0ZWJ1ZnNpemUpCisgICAgICBNTkdfRlJFRVggKHBEYXRhLCBwUmF3ZGF0YSwgaVJhd2xlbik7CisgIH0KKworICBNTkdfRlJFRVggKHBEYXRhLCBwQnVmLCBpQnVmbGVuKTsgICAgLyogYWx3YXlzIGRyb3AgdGhlIGNvbXByZXNzaW9uIGJ1ZmZlciAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1dSSVRFX01QTkcsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIGlSZXRjb2RlOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfSU5DTFVERV9BTkdfUFJPUE9TQUwKK1dSSVRFX0NIVU5LIChtbmdfd3JpdGVfYWhkcikKK3sKKyAgbW5nX2FoZHJwICAgcEFIRFI7CisgIG1uZ191aW50OHAgIHBSYXdkYXRhOworICBtbmdfdWludDMyICBpUmF3bGVuOworICBtbmdfcmV0Y29kZSBpUmV0Y29kZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9XUklURV9BSERSLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcEFIRFIgICAgPSAobW5nX2FoZHJwKXBDaHVuazsgICAgICAgIC8qIGFkZHJlc3MgdGhlIHByb3BlciBjaHVuayAqLworICBwUmF3ZGF0YSA9IHBEYXRhLT5wV3JpdGVidWYrODsgICAgICAgLyogaW5pdCBvdXRwdXQgYnVmZmVyICYgc2l6ZSAqLworICBpUmF3bGVuICA9IDIyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmlsbCB0aGUgYnVmZmVyICovCisgIG1uZ19wdXRfdWludDMyIChwUmF3ZGF0YSwgICAgcEFIRFItPmlOdW1mcmFtZXMpOworICBtbmdfcHV0X3VpbnQzMiAocFJhd2RhdGErNCwgIHBBSERSLT5pVGlja3NwZXJzZWMpOworICBtbmdfcHV0X3VpbnQzMiAocFJhd2RhdGErOCwgIHBBSERSLT5pTnVtcGxheXMpOworICBtbmdfcHV0X3VpbnQzMiAocFJhd2RhdGErMTIsIHBBSERSLT5pVGlsZXdpZHRoKTsKKyAgbW5nX3B1dF91aW50MzIgKHBSYXdkYXRhKzE2LCBwQUhEUi0+aVRpbGVoZWlnaHQpOworICAqKHBSYXdkYXRhKzIwKSA9IHBBSERSLT5pSW50ZXJsYWNlOworICAqKHBSYXdkYXRhKzIxKSA9IHBBSERSLT5pU3RpbGx1c2VkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHdyaXRlIGl0ICovCisgIGlSZXRjb2RlID0gd3JpdGVfcmF3X2NodW5rIChwRGF0YSwgcEFIRFItPnNIZWFkZXIuaUNodW5rbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlSYXdsZW4sIHBSYXdkYXRhKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9XUklURV9BSERSLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBpUmV0Y29kZTsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX0lOQ0xVREVfQU5HX1BST1BPU0FMCitXUklURV9DSFVOSyAobW5nX3dyaXRlX2FkYXQpCit7CisKKyAgLyogVE9ETzogc29tZXRoaW5nICovCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19ldk5UCitXUklURV9DSFVOSyAobW5nX3dyaXRlX2V2bnQpCit7CisgIG1uZ19ldm50cCAgICAgICBwRVZOVDsKKyAgbW5nX3VpbnQ4cCAgICAgIHBSYXdkYXRhOworICBtbmdfdWludDMyICAgICAgaVJhd2xlbjsKKyAgbW5nX3JldGNvZGUgICAgIGlSZXRjb2RlOworICBtbmdfZXZudF9lbnRyeXAgcEVudHJ5OworICBtbmdfdWludDhwICAgICAgcFRlbXA7CisgIG1uZ191aW50MzIgICAgICBpWDsKKyAgbW5nX3VpbnQzMiAgICAgIGlOYW1lc2l6ZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9XUklURV9FVk5ULCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcEVWTlQgPSAobW5nX2V2bnRwKXBDaHVuazsgICAgICAgICAgIC8qIGFkZHJlc3MgdGhlIHByb3BlciBjaHVuayAqLworCisgIGlmICghcEVWTlQtPmlDb3VudCkgICAgICAgICAgICAgICAgICAvKiBlbXB0eSA/ICovCisgICAgaVJldGNvZGUgPSB3cml0ZV9yYXdfY2h1bmsgKHBEYXRhLCBwRVZOVC0+c0hlYWRlci5pQ2h1bmtuYW1lLCAwLCAwKTsKKyAgZWxzZQorICB7CisgICAgcFJhd2RhdGEgID0gcERhdGEtPnBXcml0ZWJ1Zis4OyAgICAvKiBpbml0IG91dHB1dCBidWZmZXIgJiBzaXplICovCisgICAgaVJhd2xlbiAgID0gMDsKKyAgICBwVGVtcCAgICAgPSBwUmF3ZGF0YTsKKyAgICBwRW50cnkgICAgPSBwRVZOVC0+cEVudHJpZXM7CisKKyAgICBmb3IgKGlYID0gMDsgaVggPCBwRVZOVC0+aUNvdW50OyBpWCsrKQorICAgIHsKKyAgICAgIGlmIChpWCkgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHB1dCBzZXBhcmF0b3IgbnVsbC1ieXRlLCBleGNlcHQgdGhlIGZpcnN0ICovCisgICAgICB7CisgICAgICAgICpwVGVtcCA9IDA7CisgICAgICAgIHBUZW1wKys7CisgICAgICAgIGlSYXdsZW4rKzsKKyAgICAgIH0KKworICAgICAgKnBUZW1wICAgICA9IHBFbnRyeS0+aUV2ZW50dHlwZTsKKyAgICAgICoocFRlbXArMSkgPSBwRW50cnktPmlNYXNrdHlwZTsKKyAgICAgIHBUZW1wICAgKz0gMjsKKyAgICAgIGlSYXdsZW4gKz0gMjsKKworICAgICAgc3dpdGNoIChwRW50cnktPmlNYXNrdHlwZSkKKyAgICAgIHsKKyAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICB7CisgICAgICAgICAgICBtbmdfcHV0X2ludDMyIChwVGVtcCwgcEVudHJ5LT5pTGVmdCk7CisgICAgICAgICAgICBtbmdfcHV0X2ludDMyIChwVGVtcCs0LCBwRW50cnktPmlSaWdodCk7CisgICAgICAgICAgICBtbmdfcHV0X2ludDMyIChwVGVtcCs4LCBwRW50cnktPmlUb3ApOworICAgICAgICAgICAgbW5nX3B1dF9pbnQzMiAocFRlbXArMTIsIHBFbnRyeS0+aUJvdHRvbSk7CisgICAgICAgICAgICBwVGVtcCAgICs9IDE2OworICAgICAgICAgICAgaVJhd2xlbiArPSAxNjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgY2FzZSAyIDoKKyAgICAgICAgICB7CisgICAgICAgICAgICBtbmdfcHV0X3VpbnQxNiAocFRlbXAsIHBFbnRyeS0+aU9iamVjdGlkKTsKKyAgICAgICAgICAgIHBUZW1wICAgKz0gMjsKKyAgICAgICAgICAgIGlSYXdsZW4gKz0gMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgY2FzZSAzIDoKKyAgICAgICAgICB7CisgICAgICAgICAgICBtbmdfcHV0X3VpbnQxNiAocFRlbXAsIHBFbnRyeS0+aU9iamVjdGlkKTsKKyAgICAgICAgICAgICoocFRlbXArMikgPSBwRW50cnktPmlJbmRleDsKKyAgICAgICAgICAgIHBUZW1wICAgKz0gMzsKKyAgICAgICAgICAgIGlSYXdsZW4gKz0gMzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgY2FzZSA0IDoKKyAgICAgICAgICB7CisgICAgICAgICAgICBtbmdfcHV0X2ludDMyIChwVGVtcCwgcEVudHJ5LT5pTGVmdCk7CisgICAgICAgICAgICBtbmdfcHV0X2ludDMyIChwVGVtcCs0LCBwRW50cnktPmlSaWdodCk7CisgICAgICAgICAgICBtbmdfcHV0X2ludDMyIChwVGVtcCs4LCBwRW50cnktPmlUb3ApOworICAgICAgICAgICAgbW5nX3B1dF9pbnQzMiAocFRlbXArMTIsIHBFbnRyeS0+aUJvdHRvbSk7CisgICAgICAgICAgICBtbmdfcHV0X3VpbnQxNiAocFRlbXArMTYsIHBFbnRyeS0+aU9iamVjdGlkKTsKKyAgICAgICAgICAgIHBUZW1wICAgKz0gMTg7CisgICAgICAgICAgICBpUmF3bGVuICs9IDE4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICBjYXNlIDUgOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIG1uZ19wdXRfaW50MzIgKHBUZW1wLCBwRW50cnktPmlMZWZ0KTsKKyAgICAgICAgICAgIG1uZ19wdXRfaW50MzIgKHBUZW1wKzQsIHBFbnRyeS0+aVJpZ2h0KTsKKyAgICAgICAgICAgIG1uZ19wdXRfaW50MzIgKHBUZW1wKzgsIHBFbnRyeS0+aVRvcCk7CisgICAgICAgICAgICBtbmdfcHV0X2ludDMyIChwVGVtcCsxMiwgcEVudHJ5LT5pQm90dG9tKTsKKyAgICAgICAgICAgIG1uZ19wdXRfdWludDE2IChwVGVtcCsxNiwgcEVudHJ5LT5pT2JqZWN0aWQpOworICAgICAgICAgICAgKihwVGVtcCsxOCkgPSBwRW50cnktPmlJbmRleDsKKyAgICAgICAgICAgIHBUZW1wICAgKz0gMTk7CisgICAgICAgICAgICBpUmF3bGVuICs9IDE5OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgfQorCisgICAgICBpTmFtZXNpemUgPSBwRW50cnktPmlTZWdtZW50bmFtZXNpemU7CisKKyAgICAgIGlmIChpTmFtZXNpemUpCisgICAgICB7CisgICAgICAgIE1OR19DT1BZIChwVGVtcCwgcEVudHJ5LT56U2VnbWVudG5hbWUsIGlOYW1lc2l6ZSk7CisgICAgICAgIHBUZW1wICAgKz0gaU5hbWVzaXplOworICAgICAgICBpUmF3bGVuICs9IGlOYW1lc2l6ZTsKKyAgICAgIH0KKworICAgICAgcEVudHJ5Kys7ICAKKyAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgd3JpdGUgaXQgKi8KKyAgICBpUmV0Y29kZSA9IHdyaXRlX3Jhd19jaHVuayAocERhdGEsIHBFVk5ULT5zSGVhZGVyLmlDaHVua25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlSYXdsZW4sIHBSYXdkYXRhKTsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1dSSVRFX0VWTlQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIGlSZXRjb2RlOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK1dSSVRFX0NIVU5LIChtbmdfd3JpdGVfdW5rbm93bikKK3sKKyAgbW5nX3Vua25vd25fY2h1bmtwIHBVbmtub3duOworICBtbmdfcmV0Y29kZSAgICAgICAgaVJldGNvZGU7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fV1JJVEVfVU5LTk9XTiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkcmVzcyB0aGUgcHJvcGVyIGNodW5rICovCisgIHBVbmtub3duID0gKG1uZ191bmtub3duX2NodW5rcClwQ2h1bms7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgd3JpdGUgaXQgKi8KKyAgaVJldGNvZGUgPSB3cml0ZV9yYXdfY2h1bmsgKHBEYXRhLCBwVW5rbm93bi0+c0hlYWRlci5pQ2h1bmtuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFVua25vd24tPmlEYXRhc2l6ZSwgcFVua25vd24tPnBEYXRhKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9XUklURV9VTktOT1dOLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBpUmV0Y29kZTsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2VuZGlmIC8qIE1OR19JTkNMVURFX1dSSVRFX1BST0NTICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqIGVuZCBvZiBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKwpkaWZmIC0tZ2l0IGEvZmlsZXMvU291cmNlL0xpYk1ORy9saWJtbmdfY2h1bmtfaW8uaCBiL2ZpbGVzL1NvdXJjZS9MaWJNTkcvbGlibW5nX2NodW5rX2lvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg1MDViYQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9MaWJNTkcvbGlibW5nX2NodW5rX2lvLmgKQEAgLTAsMCArMSw0MTUgQEAKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBsaWJtbmcuaCAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBwcm9qZWN0ICAgOiBsaWJtbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogZmlsZSAgICAgIDogbGlibW5nX2NodW5rX2lvLmggICAgICAgICBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwNyBHLkp1eW4gICAqICovCisvKiAqIHZlcnNpb24gICA6IDEuMC4xMDkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBwdXJwb3NlICAgOiBDaHVuayBJL08gcm91dGluZXMgKGRlZmluaXRpb24pICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGF1dGhvciAgICA6IEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogY29tbWVudCAgIDogRGVmaW5pdGlvbiBvZiB0aGUgY2h1bmsgaW5wdXQvb3V0cHV0IHJvdXRpbmVzICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBjaGFuZ2VzICAgOiAwLjUuMSAtIDA1LzA0LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjaGFuZ2VkIENSQyBpbml0aWFsaXphdGlvbiB0byB1c2UgZHluYW1pYyBzdHJ1Y3R1cmUgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgKHdhc24ndCB0aHJlYWQtc2FmZSB0aGUgb2xkIHdheSAhKSAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMSAtIDA1LzA4LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjaGFuZ2VkIHdyaXRlIHJvdXRpbmVzIGRlZmluaXRpb24gICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2hhbmdlZCBzdHJpY3QtQU5TSSBzdHVmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjIgLSAwOC8wNS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2hhbmdlZCBmaWxlLXByZWZpeGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjMgLSAwOC8yNi8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgTUFHTiBjaHVuayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMyAtIDEwLzE2LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBzdXBwb3J0IGZvciBKREFBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDA4LzE5LzIwMDIgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBCNTk3MTM0IC0gbGlibW5nIHBvbGx1dGVzIHRoZSBsaW5rZXIgbmFtZXNwYWNlICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC41IC0gMDkvMTQvMjAwMiAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGV2ZW50IGhhbmRsaW5nIGZvciBkeW5hbWljIE1ORyAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC42IC0gMDcvMDcvMjAwMyAtIEcuUi1QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIFNLSVBfQ0hVTksgYW5kIE5PX0RFTFRBX1BORyBzdXBwb3J0ICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjYgLSAwNy8yOS8yMDAzIC0gRy5SLVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgY29uZGl0aW9uYWxzIGFyb3VuZCBQQVNUIGNodW5rIHN1cHBvcnQgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjcgLSAwMy8yNC8yMDA0IC0gRy5SLVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgU0tJUENIVU5LX2l0WFQgYW5kIFNLSVBDSFVOS196dFhUIHR5cG9zICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjkgLSAxMi8wNy8yMDA0IC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgY29uZGl0aW9uYWwgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjEwIC0gMDQvMDgvMjAwNyAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgc3VwcG9ydCBmb3IgbVBORyBwcm9wb3NhbCAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuMTAgLSAwNC8xMi8yMDA3IC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBzdXBwb3J0IGZvciBBTkcgcHJvcG9zYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmIGRlZmluZWQoX19CT1JMQU5EQ19fKSAmJiBkZWZpbmVkKE1OR19TVFJJQ1RfQU5TSSkKKyNwcmFnbWEgb3B0aW9uIC1BICAgICAgICAgICAgICAgICAgICAgIC8qIGZvcmNlIEFOU0ktQyAqLworI2VuZGlmCisKKyNpZm5kZWYgX2xpYm1uZ19jaHVua19pb19oXworI2RlZmluZSBfbGlibW5nX2NodW5rX2lvX2hfCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ191aW50MzIgbW5nX2NyYyAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBidWYsCisgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgbGVuKTsKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19JTkNMVURFX1JFQURfUFJPQ1MKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX2luZmxhdGVfYnVmZmVyIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBJbmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpSW5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwICpwT3V0YnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICppT3V0c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAqaVJlYWxzaXplKTsKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2RlZmluZSBSRUFEX0NIVU5LKG4pIG1uZ19yZXRjb2RlIG4gKG1uZ19kYXRhcCAgIHBEYXRhLCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2NodW5rcCAgcEhlYWRlciwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICBpUmF3bGVuLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgIHBSYXdkYXRhLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2NodW5rcCogcHBDaHVuaykKKworI2lmZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorUkVBRF9DSFVOSyAobW5nX3JlYWRfZ2VuZXJhbCkgOworI2VuZGlmCisKK1JFQURfQ0hVTksgKG1uZ19yZWFkX2loZHIpIDsKK1JFQURfQ0hVTksgKG1uZ19yZWFkX3BsdGUpIDsKK1JFQURfQ0hVTksgKG1uZ19yZWFkX2lkYXQpIDsKK1JFQURfQ0hVTksgKG1uZ19yZWFkX2llbmQpIDsKK1JFQURfQ0hVTksgKG1uZ19yZWFkX3RybnMpIDsKK1JFQURfQ0hVTksgKG1uZ19yZWFkX2dhbWEpIDsKK1JFQURfQ0hVTksgKG1uZ19yZWFkX2Nocm0pIDsKK1JFQURfQ0hVTksgKG1uZ19yZWFkX3NyZ2IpIDsKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19pQ0NQCitSRUFEX0NIVU5LIChtbmdfcmVhZF9pY2NwKSA7CisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS190RVh0CitSRUFEX0NIVU5LIChtbmdfcmVhZF90ZXh0KSA7CisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS196VFh0CitSRUFEX0NIVU5LIChtbmdfcmVhZF96dHh0KSA7CisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19pVFh0CitSRUFEX0NIVU5LIChtbmdfcmVhZF9pdHh0KSA7CisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19iS0dECitSRUFEX0NIVU5LIChtbmdfcmVhZF9ia2dkKSA7CisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19wSFlzCitSRUFEX0NIVU5LIChtbmdfcmVhZF9waHlzKSA7CisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19zQklUCitSRUFEX0NIVU5LIChtbmdfcmVhZF9zYml0KSA7CisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19zUExUCitSRUFEX0NIVU5LIChtbmdfcmVhZF9zcGx0KSA7CisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19oSVNUCitSRUFEX0NIVU5LIChtbmdfcmVhZF9oaXN0KSA7CisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS190SU1FCitSRUFEX0NIVU5LIChtbmdfcmVhZF90aW1lKSA7CisjZW5kaWYKK1JFQURfQ0hVTksgKG1uZ19yZWFkX21oZHIpIDsKK1JFQURfQ0hVTksgKG1uZ19yZWFkX21lbmQpIDsKK1JFQURfQ0hVTksgKG1uZ19yZWFkX2xvb3ApIDsKK1JFQURfQ0hVTksgKG1uZ19yZWFkX2VuZGwpIDsKK1JFQURfQ0hVTksgKG1uZ19yZWFkX2RlZmkpIDsKK1JFQURfQ0hVTksgKG1uZ19yZWFkX2Jhc2kpIDsKK1JFQURfQ0hVTksgKG1uZ19yZWFkX2Nsb24pIDsKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19QQVNUCitSRUFEX0NIVU5LIChtbmdfcmVhZF9wYXN0KSA7CisjZW5kaWYKK1JFQURfQ0hVTksgKG1uZ19yZWFkX2Rpc2MpIDsKK1JFQURfQ0hVTksgKG1uZ19yZWFkX2JhY2spIDsKK1JFQURfQ0hVTksgKG1uZ19yZWFkX2ZyYW0pIDsKK1JFQURfQ0hVTksgKG1uZ19yZWFkX21vdmUpIDsKK1JFQURfQ0hVTksgKG1uZ19yZWFkX2NsaXApIDsKK1JFQURfQ0hVTksgKG1uZ19yZWFkX3Nob3cpIDsKK1JFQURfQ0hVTksgKG1uZ19yZWFkX3Rlcm0pIDsKK1JFQURfQ0hVTksgKG1uZ19yZWFkX3NhdmUpIDsKK1JFQURfQ0hVTksgKG1uZ19yZWFkX3NlZWspIDsKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19lWFBJCitSRUFEX0NIVU5LIChtbmdfcmVhZF9leHBpKSA7CisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19mUFJJCitSRUFEX0NIVU5LIChtbmdfcmVhZF9mcHJpKSA7CisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19wSFlnCitSRUFEX0NIVU5LIChtbmdfcmVhZF9waHlnKSA7CisjZW5kaWYKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKK1JFQURfQ0hVTksgKG1uZ19yZWFkX2poZHIpIDsKK1JFQURfQ0hVTksgKG1uZ19yZWFkX2pkYWEpIDsKK1JFQURfQ0hVTksgKG1uZ19yZWFkX2pkYXQpIDsKK1JFQURfQ0hVTksgKG1uZ19yZWFkX2pzZXApIDsKKyNlbmRpZgorI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCitSRUFEX0NIVU5LIChtbmdfcmVhZF9kaGRyKSA7CitSRUFEX0NIVU5LIChtbmdfcmVhZF9wcm9tKSA7CitSRUFEX0NIVU5LIChtbmdfcmVhZF9pcG5nKSA7CitSRUFEX0NIVU5LIChtbmdfcmVhZF9wcGx0KSA7CisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCitSRUFEX0NIVU5LIChtbmdfcmVhZF9pam5nKSA7CisjZW5kaWYKK1JFQURfQ0hVTksgKG1uZ19yZWFkX2Ryb3ApIDsKK1JFQURfQ0hVTksgKG1uZ19yZWFkX2RieWspIDsKK1JFQURfQ0hVTksgKG1uZ19yZWFkX29yZHIpIDsKKyNlbmRpZgorUkVBRF9DSFVOSyAobW5nX3JlYWRfbWFnbikgOworI2lmbmRlZiBNTkdfU0tJUENIVU5LX25FRUQKK1JFQURfQ0hVTksgKG1uZ19yZWFkX25lZWQpIDsKKyNlbmRpZgorI2lmZGVmIE1OR19JTkNMVURFX01QTkdfUFJPUE9TQUwKK1JFQURfQ0hVTksgKG1uZ19yZWFkX21wbmcpIDsKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX2V2TlQKK1JFQURfQ0hVTksgKG1uZ19yZWFkX2V2bnQpIDsKKyNlbmRpZgorUkVBRF9DSFVOSyAobW5nX3JlYWRfdW5rbm93bikgOworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjZWxzZSAvKiBNTkdfSU5DTFVERV9SRUFEX1BST0NTICovCisjZGVmaW5lIG1uZ19yZWFkX2loZHIgMAorI2RlZmluZSBtbmdfcmVhZF9wbHRlIDAKKyNkZWZpbmUgbW5nX3JlYWRfaWRhdCAwCisjZGVmaW5lIG1uZ19yZWFkX2llbmQgMAorI2RlZmluZSBtbmdfcmVhZF90cm5zIDAKKyNkZWZpbmUgbW5nX3JlYWRfZ2FtYSAwCisjZGVmaW5lIG1uZ19yZWFkX2Nocm0gMAorI2RlZmluZSBtbmdfcmVhZF9zcmdiIDAKKyNkZWZpbmUgbW5nX3JlYWRfaWNjcCAwCisjZGVmaW5lIG1uZ19yZWFkX3RleHQgMAorI2RlZmluZSBtbmdfcmVhZF96dHh0IDAKKyNkZWZpbmUgbW5nX3JlYWRfaXR4dCAwCisjZGVmaW5lIG1uZ19yZWFkX2JrZ2QgMAorI2RlZmluZSBtbmdfcmVhZF9waHlzIDAKKyNkZWZpbmUgbW5nX3JlYWRfc2JpdCAwCisjZGVmaW5lIG1uZ19yZWFkX3NwbHQgMAorI2RlZmluZSBtbmdfcmVhZF9oaXN0IDAKKyNkZWZpbmUgbW5nX3JlYWRfdGltZSAwCisjZGVmaW5lIG1uZ19yZWFkX21oZHIgMAorI2RlZmluZSBtbmdfcmVhZF9tZW5kIDAKKyNkZWZpbmUgbW5nX3JlYWRfbG9vcCAwCisjZGVmaW5lIG1uZ19yZWFkX2VuZGwgMAorI2RlZmluZSBtbmdfcmVhZF9kZWZpIDAKKyNkZWZpbmUgbW5nX3JlYWRfYmFzaSAwCisjZGVmaW5lIG1uZ19yZWFkX2Nsb24gMAorI2lmbmRlZiBNTkdfU0tJUENIVU5LX1BBU1QKKyNkZWZpbmUgbW5nX3JlYWRfcGFzdCAwCisjZW5kaWYKKyNkZWZpbmUgbW5nX3JlYWRfZGlzYyAwCisjZGVmaW5lIG1uZ19yZWFkX2JhY2sgMAorI2RlZmluZSBtbmdfcmVhZF9mcmFtIDAKKyNkZWZpbmUgbW5nX3JlYWRfbW92ZSAwCisjZGVmaW5lIG1uZ19yZWFkX2NsaXAgMAorI2RlZmluZSBtbmdfcmVhZF9zaG93IDAKKyNkZWZpbmUgbW5nX3JlYWRfdGVybSAwCisjZGVmaW5lIG1uZ19yZWFkX3NhdmUgMAorI2RlZmluZSBtbmdfcmVhZF9zZWVrIDAKKyNkZWZpbmUgbW5nX3JlYWRfZXhwaSAwCisjZGVmaW5lIG1uZ19yZWFkX2ZwcmkgMAorI2RlZmluZSBtbmdfcmVhZF9waHlnIDAKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyNkZWZpbmUgbW5nX3JlYWRfamhkciAwCisjZGVmaW5lIG1uZ19yZWFkX2pkYWEgMAorI2RlZmluZSBtbmdfcmVhZF9qZGF0IDAKKyNkZWZpbmUgbW5nX3JlYWRfanNlcCAwCisjZW5kaWYKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworI2RlZmluZSBtbmdfcmVhZF9kaGRyIDAKKyNkZWZpbmUgbW5nX3JlYWRfcHJvbSAwCisjZGVmaW5lIG1uZ19yZWFkX2lwbmcgMAorI2RlZmluZSBtbmdfcmVhZF9wcGx0IDAKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyNkZWZpbmUgbW5nX3JlYWRfaWpuZyAwCisjZW5kaWYKKyNkZWZpbmUgbW5nX3JlYWRfZHJvcCAwCisjZGVmaW5lIG1uZ19yZWFkX2RieWsgMAorI2RlZmluZSBtbmdfcmVhZF9vcmRyIDAKKyNlbmRpZgorI2RlZmluZSBtbmdfcmVhZF9tYWduIDAKKyNkZWZpbmUgbW5nX3JlYWRfbmVlZCAwCisjaWZkZWYgTU5HX0lOQ0xVREVfTVBOR19QUk9QT1NBTAorI2RlZmluZSBtbmdfcmVhZF9tcG5nIDAKKyNlbmRpZgorI2RlZmluZSBtbmdfcmVhZF9ldm50IDAKKyNkZWZpbmUgbW5nX3JlYWRfdW5rbm93biAwCisjZW5kaWYgLyogTU5HX0lOQ0xVREVfUkVBRF9QUk9DUyAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX0lOQ0xVREVfV1JJVEVfUFJPQ1MKKworI2RlZmluZSBXUklURV9DSFVOSyhuKSBtbmdfcmV0Y29kZSBuIChtbmdfZGF0YXAgIHBEYXRhLCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2NodW5rcCBwQ2h1bmspCisKK1dSSVRFX0NIVU5LIChtbmdfd3JpdGVfaWhkcikgOworV1JJVEVfQ0hVTksgKG1uZ193cml0ZV9wbHRlKSA7CitXUklURV9DSFVOSyAobW5nX3dyaXRlX2lkYXQpIDsKK1dSSVRFX0NIVU5LIChtbmdfd3JpdGVfaWVuZCkgOworV1JJVEVfQ0hVTksgKG1uZ193cml0ZV90cm5zKSA7CitXUklURV9DSFVOSyAobW5nX3dyaXRlX2dhbWEpIDsKK1dSSVRFX0NIVU5LIChtbmdfd3JpdGVfY2hybSkgOworV1JJVEVfQ0hVTksgKG1uZ193cml0ZV9zcmdiKSA7CitXUklURV9DSFVOSyAobW5nX3dyaXRlX2ljY3ApIDsKK1dSSVRFX0NIVU5LIChtbmdfd3JpdGVfdGV4dCkgOworV1JJVEVfQ0hVTksgKG1uZ193cml0ZV96dHh0KSA7CitXUklURV9DSFVOSyAobW5nX3dyaXRlX2l0eHQpIDsKK1dSSVRFX0NIVU5LIChtbmdfd3JpdGVfYmtnZCkgOworV1JJVEVfQ0hVTksgKG1uZ193cml0ZV9waHlzKSA7CitXUklURV9DSFVOSyAobW5nX3dyaXRlX3NiaXQpIDsKK1dSSVRFX0NIVU5LIChtbmdfd3JpdGVfc3BsdCkgOworV1JJVEVfQ0hVTksgKG1uZ193cml0ZV9oaXN0KSA7CitXUklURV9DSFVOSyAobW5nX3dyaXRlX3RpbWUpIDsKK1dSSVRFX0NIVU5LIChtbmdfd3JpdGVfbWhkcikgOworV1JJVEVfQ0hVTksgKG1uZ193cml0ZV9tZW5kKSA7CitXUklURV9DSFVOSyAobW5nX3dyaXRlX2xvb3ApIDsKK1dSSVRFX0NIVU5LIChtbmdfd3JpdGVfZW5kbCkgOworV1JJVEVfQ0hVTksgKG1uZ193cml0ZV9kZWZpKSA7CitXUklURV9DSFVOSyAobW5nX3dyaXRlX2Jhc2kpIDsKK1dSSVRFX0NIVU5LIChtbmdfd3JpdGVfY2xvbikgOworI2lmbmRlZiBNTkdfU0tJUENIVU5LX1BBU1QKK1dSSVRFX0NIVU5LIChtbmdfd3JpdGVfcGFzdCkgOworI2VuZGlmCitXUklURV9DSFVOSyAobW5nX3dyaXRlX2Rpc2MpIDsKK1dSSVRFX0NIVU5LIChtbmdfd3JpdGVfYmFjaykgOworV1JJVEVfQ0hVTksgKG1uZ193cml0ZV9mcmFtKSA7CitXUklURV9DSFVOSyAobW5nX3dyaXRlX21vdmUpIDsKK1dSSVRFX0NIVU5LIChtbmdfd3JpdGVfY2xpcCkgOworV1JJVEVfQ0hVTksgKG1uZ193cml0ZV9zaG93KSA7CitXUklURV9DSFVOSyAobW5nX3dyaXRlX3Rlcm0pIDsKK1dSSVRFX0NIVU5LIChtbmdfd3JpdGVfc2F2ZSkgOworV1JJVEVfQ0hVTksgKG1uZ193cml0ZV9zZWVrKSA7CitXUklURV9DSFVOSyAobW5nX3dyaXRlX2V4cGkpIDsKK1dSSVRFX0NIVU5LIChtbmdfd3JpdGVfZnByaSkgOworV1JJVEVfQ0hVTksgKG1uZ193cml0ZV9waHlnKSA7CisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCitXUklURV9DSFVOSyAobW5nX3dyaXRlX2poZHIpIDsKK1dSSVRFX0NIVU5LIChtbmdfd3JpdGVfamRhYSkgOworV1JJVEVfQ0hVTksgKG1uZ193cml0ZV9qZGF0KSA7CitXUklURV9DSFVOSyAobW5nX3dyaXRlX2pzZXApIDsKKyNlbmRpZgorI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCitXUklURV9DSFVOSyAobW5nX3dyaXRlX2RoZHIpIDsKK1dSSVRFX0NIVU5LIChtbmdfd3JpdGVfcHJvbSkgOworV1JJVEVfQ0hVTksgKG1uZ193cml0ZV9pcG5nKSA7CitXUklURV9DSFVOSyAobW5nX3dyaXRlX3BwbHQpIDsKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKK1dSSVRFX0NIVU5LIChtbmdfd3JpdGVfaWpuZykgOworI2VuZGlmCitXUklURV9DSFVOSyAobW5nX3dyaXRlX2Ryb3ApIDsKK1dSSVRFX0NIVU5LIChtbmdfd3JpdGVfZGJ5aykgOworV1JJVEVfQ0hVTksgKG1uZ193cml0ZV9vcmRyKSA7CisjZW5kaWYKK1dSSVRFX0NIVU5LIChtbmdfd3JpdGVfbWFnbikgOworV1JJVEVfQ0hVTksgKG1uZ193cml0ZV9uZWVkKSA7CisjaWZkZWYgTU5HX0lOQ0xVREVfTVBOR19QUk9QT1NBTAorV1JJVEVfQ0hVTksgKG1uZ193cml0ZV9tcG5nKSA7CisjZW5kaWYKKyNpZmRlZiBNTkdfSU5DTFVERV9BTkdfUFJPUE9TQUwKK1dSSVRFX0NIVU5LIChtbmdfd3JpdGVfYWhkcikgOworV1JJVEVfQ0hVTksgKG1uZ193cml0ZV9hZGF0KSA7CisjZW5kaWYKK1dSSVRFX0NIVU5LIChtbmdfd3JpdGVfZXZudCkgOworV1JJVEVfQ0hVTksgKG1uZ193cml0ZV91bmtub3duKSA7CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNlbHNlIC8qIE1OR19JTkNMVURFX1dSSVRFX1BST0NTICovCisjZGVmaW5lIG1uZ193cml0ZV9paGRyIDAKKyNkZWZpbmUgbW5nX3dyaXRlX3BsdGUgMAorI2RlZmluZSBtbmdfd3JpdGVfaWRhdCAwCisjZGVmaW5lIG1uZ193cml0ZV9pZW5kIDAKKyNkZWZpbmUgbW5nX3dyaXRlX3RybnMgMAorI2RlZmluZSBtbmdfd3JpdGVfZ2FtYSAwCisjZGVmaW5lIG1uZ193cml0ZV9jaHJtIDAKKyNkZWZpbmUgbW5nX3dyaXRlX3NyZ2IgMAorI2RlZmluZSBtbmdfd3JpdGVfaWNjcCAwCisjZGVmaW5lIG1uZ193cml0ZV90ZXh0IDAKKyNkZWZpbmUgbW5nX3dyaXRlX3p0eHQgMAorI2RlZmluZSBtbmdfd3JpdGVfaXR4dCAwCisjZGVmaW5lIG1uZ193cml0ZV9ia2dkIDAKKyNkZWZpbmUgbW5nX3dyaXRlX3BoeXMgMAorI2RlZmluZSBtbmdfd3JpdGVfc2JpdCAwCisjZGVmaW5lIG1uZ193cml0ZV9zcGx0IDAKKyNkZWZpbmUgbW5nX3dyaXRlX2hpc3QgMAorI2RlZmluZSBtbmdfd3JpdGVfdGltZSAwCisjZGVmaW5lIG1uZ193cml0ZV9taGRyIDAKKyNkZWZpbmUgbW5nX3dyaXRlX21lbmQgMAorI2RlZmluZSBtbmdfd3JpdGVfbG9vcCAwCisjZGVmaW5lIG1uZ193cml0ZV9lbmRsIDAKKyNkZWZpbmUgbW5nX3dyaXRlX2RlZmkgMAorI2RlZmluZSBtbmdfd3JpdGVfYmFzaSAwCisjZGVmaW5lIG1uZ193cml0ZV9jbG9uIDAKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19QQVNUCisjZGVmaW5lIG1uZ193cml0ZV9wYXN0IDAKKyNlbmRpZgorI2RlZmluZSBtbmdfd3JpdGVfZGlzYyAwCisjZGVmaW5lIG1uZ193cml0ZV9iYWNrIDAKKyNkZWZpbmUgbW5nX3dyaXRlX2ZyYW0gMAorI2RlZmluZSBtbmdfd3JpdGVfbW92ZSAwCisjZGVmaW5lIG1uZ193cml0ZV9jbGlwIDAKKyNkZWZpbmUgbW5nX3dyaXRlX3Nob3cgMAorI2RlZmluZSBtbmdfd3JpdGVfdGVybSAwCisjZGVmaW5lIG1uZ193cml0ZV9zYXZlIDAKKyNkZWZpbmUgbW5nX3dyaXRlX3NlZWsgMAorI2RlZmluZSBtbmdfd3JpdGVfZXhwaSAwCisjZGVmaW5lIG1uZ193cml0ZV9mcHJpIDAKKyNkZWZpbmUgbW5nX3dyaXRlX3BoeWcgMAorI2lmZGVmIE1OR19JTkNMVURFX0pORworI2RlZmluZSBtbmdfd3JpdGVfamhkciAwCisjZGVmaW5lIG1uZ193cml0ZV9qZGFhIDAKKyNkZWZpbmUgbW5nX3dyaXRlX2pkYXQgMAorI2RlZmluZSBtbmdfd3JpdGVfanNlcCAwCisjZW5kaWYKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworI2RlZmluZSBtbmdfd3JpdGVfZGhkciAwCisjZGVmaW5lIG1uZ193cml0ZV9wcm9tIDAKKyNkZWZpbmUgbW5nX3dyaXRlX2lwbmcgMAorI2RlZmluZSBtbmdfd3JpdGVfcHBsdCAwCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisjZGVmaW5lIG1uZ193cml0ZV9pam5nIDAKKyNlbmRpZgorI2RlZmluZSBtbmdfd3JpdGVfZHJvcCAwCisjZGVmaW5lIG1uZ193cml0ZV9kYnlrIDAKKyNkZWZpbmUgbW5nX3dyaXRlX29yZHIgMAorI2VuZGlmCisjZGVmaW5lIG1uZ193cml0ZV9tYWduIDAKKyNkZWZpbmUgbW5nX3dyaXRlX25lZWQgMAorI2lmZGVmIE1OR19JTkNMVURFX01QTkdfUFJPUE9TQUwKKyNkZWZpbmUgbW5nX3dyaXRlX21wbmcgMAorI2VuZGlmCisjaWZkZWYgTU5HX0lOQ0xVREVfQU5HX1BST1BPU0FMCisjZGVmaW5lIG1uZ193cml0ZV9hZGF0IDAKKyNkZWZpbmUgbW5nX3dyaXRlX2FoZHIgMAorI2VuZGlmCisjZGVmaW5lIG1uZ193cml0ZV9ldm50IDAKKyNkZWZpbmUgbW5nX3dyaXRlX3Vua25vd24gMAorI2VuZGlmIC8qIE1OR19JTkNMVURFX1dSSVRFX1BST0NTICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNlbmRpZiAvKiBfbGlibW5nX2NodW5rX2lvX2hfICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqIGVuZCBvZiBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9MaWJNTkcvbGlibW5nX2NodW5rX3ByYy5jIGIvZmlsZXMvU291cmNlL0xpYk1ORy9saWJtbmdfY2h1bmtfcHJjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYzM2U3ZQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9MaWJNTkcvbGlibW5nX2NodW5rX3ByYy5jCkBAIC0wLDAgKzEsNDQ1MiBAQAorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIGxpYm1uZy5oICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIHByb2plY3QgICA6IGxpYm1uZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBmaWxlICAgICAgOiBsaWJtbmdfY2h1bmtfcHJjLmMgICAgICAgIGNvcHlyaWdodCAoYykgMjAwMC0yMDA1IEcuSnV5biAgICogKi8KKy8qICogdmVyc2lvbiAgIDogMS4wLjEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBwdXJwb3NlICAgOiBDaHVuayBpbml0aWFsaXphdGlvbiAmIGNsZWFudXAgKGltcGxlbWVudGF0aW9uKSAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGF1dGhvciAgICA6IEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogY29tbWVudCAgIDogaW1wbGVtZW50YXRpb24gb2YgdGhlIGNodW5rIGluaXRpYWxpemF0aW9uICYgY2xlYW51cCAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIHJvdXRpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogY2hhbmdlcyAgIDogMC41LjEgLSAwNS8wOC8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2hhbmdlZCBzdHJpY3QtQU5TSSBzdHVmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMSAtIDA1LzEyLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjaGFuZ2VkIHRyYWNlIHRvIG1hY3JvIGZvciBjYWxsYmFjayBlcnJvci1yZXBvcnRpbmcgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMSAtIDA3LzE5LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaXhlZCBjcmVhdGlvbi1jb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMiAtIDA3LzMxLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBwdXQgYWRkX2NodW5rKCkgaW5zaWRlIE1OR19JTkNMVURFX1dSSVRFX1BST0NTIHdyYXBwZXIgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4yIC0gMDgvMDEvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIHdyYXBwZXIgZm9yIGFkZF9jaHVuaygpIGNoYW5nZWQgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjIgLSAwOC8wNS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2hhbmdlZCBmaWxlLXByZWZpeGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjMgLSAwOC8yNi8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgTUFHTiBjaHVuayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMyAtIDEwLzE2LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBzdXBwb3J0IGZvciBKREFBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDA4LzE5LzIwMDIgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBCNTk3MTM0IC0gbGlibW5nIHBvbGx1dGVzIHRoZSBsaW5rZXIgbmFtZXNwYWNlICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgSExBUEkgZnVuY3Rpb24gdG8gY29weSBjaHVua3MgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDA5LzE0LzIwMDIgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBldmVudCBoYW5kbGluZyBmb3IgZHluYW1pYyBNTkcgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC41IC0gMTAvMDQvMjAwMiAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIGNodW5rLXN0b3JhZ2UgZm9yIGV2TlQgY2h1bmsgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAxMC8xNy8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgaXNzdWUgaW4gZnJlZWluZyBldk5UIGNodW5rICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjYgLSAwNy8wNy8yMDAzIC0gRy5SLVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgTU5HX1NLSVBDSFVOS19jSE5LIGZvb3RwcmludCBvcHRpbWl6YXRpb25zICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIE1OR19OT19ERUxUQV9QTkcgcmVkdWN0aW9uIGZlYXR1cmUgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjYgLSAwNy8xNC8yMDAzIC0gRy5SLVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgTU5HX05PX0xPT1BfU0lHTkFMU19TVVBQT1JURUQgY29uZGl0aW9uYWwgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNiAtIDA3LzI5LzIwMDMgLSBHLlItUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBjb25kaXRpb25hbHMgYXJvdW5kIFBBU1QgY2h1bmsgc3VwcG9ydCAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC42IC0gMDgvMTcvMjAwMyAtIEcuUi1QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGNvbmRpdGlvbmFscyBhcm91bmQgbm9uLVZMQyBjaHVuayBzdXBwb3J0ICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC43IC0gMDMvMjQvMjAwNCAtIEcuUi1QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIFNLSVBDSFVOS19lWFBJIC0+IGZQUkkgdHlwbyAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC45IC0gMDkvMjUvMjAwNCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIHJlcGxhY2VkIE1OR19UV0VBS19MQVJHRV9GSUxFUyB3aXRoIHBlcm1hbmVudCBzb2x1dGlvbiAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjkgLSAxMi8wNS8yMDA0IC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgY29uZGl0aW9uYWwgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuOSAtIDEyLzA2LzIwMDQgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBjb25kaXRpb25hbCBNTkdfT1BUSU1JWkVfQ0hVTktBU1NJR04gICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC45IC0gMTIvMjAvMjAwNCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNsZWFuZWQgdXAgbWFjcm8taW52b2NhdGlvbnMgKHRoYW5rcyB0byBELiBBaXJsaWUpICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC4xMCAtIDA3LzMwLzIwMDUgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIHByb2JsZW0gd2l0aCBDTE9OIG9iamVjdCBkdXJpbmcgcmVhZGRpc3BsYXkoKSAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjEwIC0gMDQvMDgvMjAwNyAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgc3VwcG9ydCBmb3IgbVBORyBwcm9wb3NhbCAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuMTAgLSAwNC8xMi8yMDA3IC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBzdXBwb3J0IGZvciBBTkcgcHJvcG9zYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2luY2x1ZGUgImxpYm1uZy5oIgorI2luY2x1ZGUgImxpYm1uZ19kYXRhLmgiCisjaW5jbHVkZSAibGlibW5nX2Vycm9yLmgiCisjaW5jbHVkZSAibGlibW5nX3RyYWNlLmgiCisjaWZkZWYgX19CT1JMQU5EQ19fCisjcHJhZ21hIGhkcnN0b3AKKyNlbmRpZgorI2luY2x1ZGUgImxpYm1uZ19tZW1vcnkuaCIKKyNpbmNsdWRlICJsaWJtbmdfY2h1bmtzLmgiCisjaW5jbHVkZSAibGlibW5nX2NodW5rX3ByYy5oIgorCisjaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pICYmIGRlZmluZWQoTU5HX1NUUklDVF9BTlNJKQorI3ByYWdtYSBvcHRpb24gLUEgICAgICAgICAgICAgICAgICAgICAgLyogZm9yY2UgQU5TSS1DICovCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIEdlbmVyYWwgY2h1bmsgcm91dGluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3ZvaWQgbW5nX2FkZF9jaHVuayAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgbW5nX2NodW5rcCBwQ2h1bmspCit7CisgIGlmICghcERhdGEtPnBGaXJzdGNodW5rKSAgICAgICAgICAgICAvKiBsaXN0IGlzIHN0aWxsIGVtcHR5ID8gKi8KKyAgeworICAgIHBEYXRhLT5wRmlyc3RjaHVuayAgICAgID0gcENodW5rOyAgLyogdGhlbiB0aGlzIGJlY29tZXMgdGhlIGZpcnN0ICovCisgICAgCisjaWZkZWYgTU5HX1NVUFBPUlRfV1JJVEUKKyAgICBpZiAoIXBEYXRhLT5pRmlyc3RjaHVua2FkZGVkKQorICAgIHsKKyAgICAgIHBEYXRhLT5pRmlyc3RjaHVua2FkZGVkID0gKChtbmdfY2h1bmtfaGVhZGVycClwQ2h1bmspLT5pQ2h1bmtuYW1lOworI2VuZGlmCisKKyAgICAgIGlmICgoKG1uZ19jaHVua19oZWFkZXJwKXBDaHVuayktPmlDaHVua25hbWUgPT0gTU5HX1VJTlRfSUhEUikKKyAgICAgICAgcERhdGEtPmVJbWFnZXR5cGUgICAgID0gbW5nX2l0X3BuZzsKKyAgICAgIGVsc2UKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgICAgIGlmICgoKG1uZ19jaHVua19oZWFkZXJwKXBDaHVuayktPmlDaHVua25hbWUgPT0gTU5HX1VJTlRfSkhEUikKKyAgICAgICAgcERhdGEtPmVJbWFnZXR5cGUgICAgID0gbW5nX2l0X2puZzsKKyAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICBwRGF0YS0+ZUltYWdldHlwZSAgICAgPSBtbmdfaXRfbW5nOworCisgICAgICBwRGF0YS0+ZVNpZ3R5cGUgICAgICAgICA9IHBEYXRhLT5lSW1hZ2V0eXBlOworI2lmZGVmIE1OR19TVVBQT1JUX1dSSVRFCisgICAgfQorI2VuZGlmCisgIH0KKyAgZWxzZQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZWxzZSB3ZSBtYWtlIGFwcHJvcHJpYXRlIGxpbmtzICovCisgICAgKChtbmdfY2h1bmtfaGVhZGVycClwQ2h1bmspLT5wUHJldiA9IHBEYXRhLT5wTGFzdGNodW5rOworICAgICgobW5nX2NodW5rX2hlYWRlcnApcERhdGEtPnBMYXN0Y2h1bmspLT5wTmV4dCA9IHBDaHVuazsKKyAgfQorCisgIHBEYXRhLT5wTGFzdGNodW5rID0gcENodW5rOyAgICAgICAgICAvKiBhbmQgaXQncyBhbHdheXMgdGhlIGxhc3QgKi8KKworICByZXR1cm47Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBDaHVuayBzcGVjaWZpYyBpbml0aWFsaXphdGlvbiByb3V0aW5lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKK0lOSVRfQ0hVTktfSERSIChtbmdfaW5pdF9nZW5lcmFsKQoreworICBNTkdfQUxMT0MgKHBEYXRhLCAqcHBDaHVuaywgKChtbmdfY2h1bmtfaGVhZGVycClwSGVhZGVyKS0+aUNodW5rc2l6ZSk7CisgIE1OR19DT1BZICgqcHBDaHVuaywgcEhlYWRlciwgc2l6ZW9mIChtbmdfY2h1bmtfaGVhZGVyKSk7CisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworI2Vsc2UgLyogTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworSU5JVF9DSFVOS19IRFIgKG1uZ19pbml0X2loZHIpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfSUhEUiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19BTExPQyAocERhdGEsICpwcENodW5rLCBzaXplb2YgKG1uZ19paGRyKSk7CisgICgobW5nX2loZHJwKSpwcENodW5rKS0+c0hlYWRlciA9ICooKG1uZ19jaHVua19oZWFkZXJwKXBIZWFkZXIpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfSUhEUiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK0lOSVRfQ0hVTktfSERSIChtbmdfaW5pdF9wbHRlKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX1BMVEUsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfQUxMT0MgKHBEYXRhLCAqcHBDaHVuaywgc2l6ZW9mIChtbmdfcGx0ZSkpOworICAoKG1uZ19wbHRlcCkqcHBDaHVuayktPnNIZWFkZXIgPSAqKChtbmdfY2h1bmtfaGVhZGVycClwSGVhZGVyKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX1BMVEUsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitJTklUX0NIVU5LX0hEUiAobW5nX2luaXRfaWRhdCkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSU5JVF9JREFULCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX0FMTE9DIChwRGF0YSwgKnBwQ2h1bmssIHNpemVvZiAobW5nX2lkYXQpKTsKKyAgKChtbmdfaWRhdHApKnBwQ2h1bmspLT5zSGVhZGVyID0gKigobW5nX2NodW5rX2hlYWRlcnApcEhlYWRlcik7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSU5JVF9JREFULCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworSU5JVF9DSFVOS19IRFIgKG1uZ19pbml0X2llbmQpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfSUVORCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19BTExPQyAocERhdGEsICpwcENodW5rLCBzaXplb2YgKG1uZ19pZW5kKSk7CisgICgobW5nX2llbmRwKSpwcENodW5rKS0+c0hlYWRlciA9ICooKG1uZ19jaHVua19oZWFkZXJwKXBIZWFkZXIpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfSUVORCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK0lOSVRfQ0hVTktfSERSIChtbmdfaW5pdF90cm5zKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX1RSTlMsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfQUxMT0MgKHBEYXRhLCAqcHBDaHVuaywgc2l6ZW9mIChtbmdfdHJucykpOworICAoKG1uZ190cm5zcCkqcHBDaHVuayktPnNIZWFkZXIgPSAqKChtbmdfY2h1bmtfaGVhZGVycClwSGVhZGVyKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX1RSTlMsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfZ0FNQQorSU5JVF9DSFVOS19IRFIgKG1uZ19pbml0X2dhbWEpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfR0FNQSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19BTExPQyAocERhdGEsICpwcENodW5rLCBzaXplb2YgKG1uZ19nYW1hKSk7CisgICgobW5nX2dhbWFwKSpwcENodW5rKS0+c0hlYWRlciA9ICooKG1uZ19jaHVua19oZWFkZXJwKXBIZWFkZXIpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfR0FNQSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX2NIUk0KK0lOSVRfQ0hVTktfSERSIChtbmdfaW5pdF9jaHJtKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX0NIUk0sIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfQUxMT0MgKHBEYXRhLCAqcHBDaHVuaywgc2l6ZW9mIChtbmdfY2hybSkpOworICAoKG1uZ19jaHJtcCkqcHBDaHVuayktPnNIZWFkZXIgPSAqKChtbmdfY2h1bmtfaGVhZGVycClwSGVhZGVyKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX0NIUk0sIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19zUkdCCitJTklUX0NIVU5LX0hEUiAobW5nX2luaXRfc3JnYikKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSU5JVF9TUkdCLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX0FMTE9DIChwRGF0YSwgKnBwQ2h1bmssIHNpemVvZiAobW5nX3NyZ2IpKTsKKyAgKChtbmdfc3JnYnApKnBwQ2h1bmspLT5zSGVhZGVyID0gKigobW5nX2NodW5rX2hlYWRlcnApcEhlYWRlcik7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSU5JVF9TUkdCLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfaUNDUAorSU5JVF9DSFVOS19IRFIgKG1uZ19pbml0X2ljY3ApCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfSUNDUCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19BTExPQyAocERhdGEsICpwcENodW5rLCBzaXplb2YgKG1uZ19pY2NwKSk7CisgICgobW5nX2ljY3BwKSpwcENodW5rKS0+c0hlYWRlciA9ICooKG1uZ19jaHVua19oZWFkZXJwKXBIZWFkZXIpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfSUNDUCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX3RFWHQKK0lOSVRfQ0hVTktfSERSIChtbmdfaW5pdF90ZXh0KQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX1RFWFQsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfQUxMT0MgKHBEYXRhLCAqcHBDaHVuaywgc2l6ZW9mIChtbmdfdGV4dCkpOworICAoKG1uZ190ZXh0cCkqcHBDaHVuayktPnNIZWFkZXIgPSAqKChtbmdfY2h1bmtfaGVhZGVycClwSGVhZGVyKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX1RFWFQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS196VFh0CitJTklUX0NIVU5LX0hEUiAobW5nX2luaXRfenR4dCkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSU5JVF9aVFhULCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX0FMTE9DIChwRGF0YSwgKnBwQ2h1bmssIHNpemVvZiAobW5nX3p0eHQpKTsKKyAgKChtbmdfenR4dHApKnBwQ2h1bmspLT5zSGVhZGVyID0gKigobW5nX2NodW5rX2hlYWRlcnApcEhlYWRlcik7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSU5JVF9aVFhULCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfaVRYdAorSU5JVF9DSFVOS19IRFIgKG1uZ19pbml0X2l0eHQpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfSVRYVCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19BTExPQyAocERhdGEsICpwcENodW5rLCBzaXplb2YgKG1uZ19pdHh0KSk7CisgICgobW5nX2l0eHRwKSpwcENodW5rKS0+c0hlYWRlciA9ICooKG1uZ19jaHVua19oZWFkZXJwKXBIZWFkZXIpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfSVRYVCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX2JLR0QKK0lOSVRfQ0hVTktfSERSIChtbmdfaW5pdF9ia2dkKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX0JLR0QsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfQUxMT0MgKHBEYXRhLCAqcHBDaHVuaywgc2l6ZW9mIChtbmdfYmtnZCkpOworICAoKG1uZ19ia2dkcCkqcHBDaHVuayktPnNIZWFkZXIgPSAqKChtbmdfY2h1bmtfaGVhZGVycClwSGVhZGVyKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX0JLR0QsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19wSFlzCitJTklUX0NIVU5LX0hEUiAobW5nX2luaXRfcGh5cykKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSU5JVF9QSFlTLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX0FMTE9DIChwRGF0YSwgKnBwQ2h1bmssIHNpemVvZiAobW5nX3BoeXMpKTsKKyAgKChtbmdfcGh5c3ApKnBwQ2h1bmspLT5zSGVhZGVyID0gKigobW5nX2NodW5rX2hlYWRlcnApcEhlYWRlcik7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSU5JVF9QSFlTLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfc0JJVAorSU5JVF9DSFVOS19IRFIgKG1uZ19pbml0X3NiaXQpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfU0JJVCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19BTExPQyAocERhdGEsICpwcENodW5rLCBzaXplb2YgKG1uZ19zYml0KSk7CisgICgobW5nX3NiaXRwKSpwcENodW5rKS0+c0hlYWRlciA9ICooKG1uZ19jaHVua19oZWFkZXJwKXBIZWFkZXIpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfU0JJVCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX3NQTFQKK0lOSVRfQ0hVTktfSERSIChtbmdfaW5pdF9zcGx0KQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX1NQTFQsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfQUxMT0MgKHBEYXRhLCAqcHBDaHVuaywgc2l6ZW9mIChtbmdfc3BsdCkpOworICAoKG1uZ19zcGx0cCkqcHBDaHVuayktPnNIZWFkZXIgPSAqKChtbmdfY2h1bmtfaGVhZGVycClwSGVhZGVyKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX1NQTFQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19oSVNUCitJTklUX0NIVU5LX0hEUiAobW5nX2luaXRfaGlzdCkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSU5JVF9ISVNULCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX0FMTE9DIChwRGF0YSwgKnBwQ2h1bmssIHNpemVvZiAobW5nX2hpc3QpKTsKKyAgKChtbmdfaGlzdHApKnBwQ2h1bmspLT5zSGVhZGVyID0gKigobW5nX2NodW5rX2hlYWRlcnApcEhlYWRlcik7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSU5JVF9ISVNULCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfdElNRQorSU5JVF9DSFVOS19IRFIgKG1uZ19pbml0X3RpbWUpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfVElNRSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19BTExPQyAocERhdGEsICpwcENodW5rLCBzaXplb2YgKG1uZ190aW1lKSk7CisgICgobW5nX3RpbWVwKSpwcENodW5rKS0+c0hlYWRlciA9ICooKG1uZ19jaHVua19oZWFkZXJwKXBIZWFkZXIpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfVElNRSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworSU5JVF9DSFVOS19IRFIgKG1uZ19pbml0X21oZHIpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfTUhEUiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19BTExPQyAocERhdGEsICpwcENodW5rLCBzaXplb2YgKG1uZ19taGRyKSk7CisgICgobW5nX21oZHJwKSpwcENodW5rKS0+c0hlYWRlciA9ICooKG1uZ19jaHVua19oZWFkZXJwKXBIZWFkZXIpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfTUhEUiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK0lOSVRfQ0hVTktfSERSIChtbmdfaW5pdF9tZW5kKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX01FTkQsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfQUxMT0MgKHBEYXRhLCAqcHBDaHVuaywgc2l6ZW9mIChtbmdfbWVuZCkpOworICAoKG1uZ19tZW5kcCkqcHBDaHVuayktPnNIZWFkZXIgPSAqKChtbmdfY2h1bmtfaGVhZGVycClwSGVhZGVyKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX01FTkQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfTE9PUAorSU5JVF9DSFVOS19IRFIgKG1uZ19pbml0X2xvb3ApCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfTE9PUCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19BTExPQyAocERhdGEsICpwcENodW5rLCBzaXplb2YgKG1uZ19sb29wKSk7CisgICgobW5nX2xvb3BwKSpwcENodW5rKS0+c0hlYWRlciA9ICooKG1uZ19jaHVua19oZWFkZXJwKXBIZWFkZXIpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfTE9PUCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK0lOSVRfQ0hVTktfSERSIChtbmdfaW5pdF9lbmRsKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX0VOREwsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfQUxMT0MgKHBEYXRhLCAqcHBDaHVuaywgc2l6ZW9mIChtbmdfZW5kbCkpOworICAoKG1uZ19lbmRscCkqcHBDaHVuayktPnNIZWFkZXIgPSAqKChtbmdfY2h1bmtfaGVhZGVycClwSGVhZGVyKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX0VOREwsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19ERUZJCitJTklUX0NIVU5LX0hEUiAobW5nX2luaXRfZGVmaSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSU5JVF9ERUZJLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX0FMTE9DIChwRGF0YSwgKnBwQ2h1bmssIHNpemVvZiAobW5nX2RlZmkpKTsKKyAgKChtbmdfZGVmaXApKnBwQ2h1bmspLT5zSGVhZGVyID0gKigobW5nX2NodW5rX2hlYWRlcnApcEhlYWRlcik7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSU5JVF9ERUZJLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfQkFTSQorSU5JVF9DSFVOS19IRFIgKG1uZ19pbml0X2Jhc2kpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfQkFTSSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19BTExPQyAocERhdGEsICpwcENodW5rLCBzaXplb2YgKG1uZ19iYXNpKSk7CisgICgobW5nX2Jhc2lwKSpwcENodW5rKS0+c0hlYWRlciA9ICooKG1uZ19jaHVua19oZWFkZXJwKXBIZWFkZXIpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfQkFTSSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX0NMT04KK0lOSVRfQ0hVTktfSERSIChtbmdfaW5pdF9jbG9uKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX0NMT04sIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfQUxMT0MgKHBEYXRhLCAqcHBDaHVuaywgc2l6ZW9mIChtbmdfY2xvbikpOworICAoKG1uZ19jbG9ucCkqcHBDaHVuayktPnNIZWFkZXIgPSAqKChtbmdfY2h1bmtfaGVhZGVycClwSGVhZGVyKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX0NMT04sIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19QQVNUCitJTklUX0NIVU5LX0hEUiAobW5nX2luaXRfcGFzdCkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSU5JVF9QQVNULCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX0FMTE9DIChwRGF0YSwgKnBwQ2h1bmssIHNpemVvZiAobW5nX3Bhc3QpKTsKKyAgKChtbmdfcGFzdHApKnBwQ2h1bmspLT5zSGVhZGVyID0gKigobW5nX2NodW5rX2hlYWRlcnApcEhlYWRlcik7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSU5JVF9QQVNULCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfRElTQworSU5JVF9DSFVOS19IRFIgKG1uZ19pbml0X2Rpc2MpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfRElTQywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19BTExPQyAocERhdGEsICpwcENodW5rLCBzaXplb2YgKG1uZ19kaXNjKSk7CisgICgobW5nX2Rpc2NwKSpwcENodW5rKS0+c0hlYWRlciA9ICooKG1uZ19jaHVua19oZWFkZXJwKXBIZWFkZXIpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfRElTQywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX0JBQ0sKK0lOSVRfQ0hVTktfSERSIChtbmdfaW5pdF9iYWNrKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX0JBQ0ssIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfQUxMT0MgKHBEYXRhLCAqcHBDaHVuaywgc2l6ZW9mIChtbmdfYmFjaykpOworICAoKG1uZ19iYWNrcCkqcHBDaHVuayktPnNIZWFkZXIgPSAqKChtbmdfY2h1bmtfaGVhZGVycClwSGVhZGVyKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX0JBQ0ssIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19GUkFNCitJTklUX0NIVU5LX0hEUiAobW5nX2luaXRfZnJhbSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSU5JVF9GUkFNLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX0FMTE9DIChwRGF0YSwgKnBwQ2h1bmssIHNpemVvZiAobW5nX2ZyYW0pKTsKKyAgKChtbmdfZnJhbXApKnBwQ2h1bmspLT5zSGVhZGVyID0gKigobW5nX2NodW5rX2hlYWRlcnApcEhlYWRlcik7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSU5JVF9GUkFNLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfTU9WRQorSU5JVF9DSFVOS19IRFIgKG1uZ19pbml0X21vdmUpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfTU9WRSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19BTExPQyAocERhdGEsICpwcENodW5rLCBzaXplb2YgKG1uZ19tb3ZlKSk7CisgICgobW5nX21vdmVwKSpwcENodW5rKS0+c0hlYWRlciA9ICooKG1uZ19jaHVua19oZWFkZXJwKXBIZWFkZXIpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfTU9WRSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX0NMSVAKK0lOSVRfQ0hVTktfSERSIChtbmdfaW5pdF9jbGlwKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX0NMSVAsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfQUxMT0MgKHBEYXRhLCAqcHBDaHVuaywgc2l6ZW9mIChtbmdfY2xpcCkpOworICAoKG1uZ19jbGlwcCkqcHBDaHVuayktPnNIZWFkZXIgPSAqKChtbmdfY2h1bmtfaGVhZGVycClwSGVhZGVyKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX0NMSVAsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19TSE9XCitJTklUX0NIVU5LX0hEUiAobW5nX2luaXRfc2hvdykKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSU5JVF9TSE9XLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX0FMTE9DIChwRGF0YSwgKnBwQ2h1bmssIHNpemVvZiAobW5nX3Nob3cpKTsKKyAgKChtbmdfc2hvd3ApKnBwQ2h1bmspLT5zSGVhZGVyID0gKigobW5nX2NodW5rX2hlYWRlcnApcEhlYWRlcik7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSU5JVF9TSE9XLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfVEVSTQorSU5JVF9DSFVOS19IRFIgKG1uZ19pbml0X3Rlcm0pCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfVEVSTSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19BTExPQyAocERhdGEsICpwcENodW5rLCBzaXplb2YgKG1uZ190ZXJtKSk7CisgICgobW5nX3Rlcm1wKSpwcENodW5rKS0+c0hlYWRlciA9ICooKG1uZ19jaHVua19oZWFkZXJwKXBIZWFkZXIpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfVEVSTSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX1NBVkUKK0lOSVRfQ0hVTktfSERSIChtbmdfaW5pdF9zYXZlKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX1NBVkUsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfQUxMT0MgKHBEYXRhLCAqcHBDaHVuaywgc2l6ZW9mIChtbmdfc2F2ZSkpOworICAoKG1uZ19zYXZlcCkqcHBDaHVuayktPnNIZWFkZXIgPSAqKChtbmdfY2h1bmtfaGVhZGVycClwSGVhZGVyKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX1NBVkUsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworCit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX1NFRUsKK0lOSVRfQ0hVTktfSERSIChtbmdfaW5pdF9zZWVrKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX1NFRUssIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfQUxMT0MgKHBEYXRhLCAqcHBDaHVuaywgc2l6ZW9mIChtbmdfc2VlaykpOworICAoKG1uZ19zZWVrcCkqcHBDaHVuayktPnNIZWFkZXIgPSAqKChtbmdfY2h1bmtfaGVhZGVycClwSGVhZGVyKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX1NFRUssIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19lWFBJCitJTklUX0NIVU5LX0hEUiAobW5nX2luaXRfZXhwaSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSU5JVF9FWFBJLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX0FMTE9DIChwRGF0YSwgKnBwQ2h1bmssIHNpemVvZiAobW5nX2V4cGkpKTsKKyAgKChtbmdfZXhwaXApKnBwQ2h1bmspLT5zSGVhZGVyID0gKigobW5nX2NodW5rX2hlYWRlcnApcEhlYWRlcik7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSU5JVF9FWFBJLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfZlBSSQorSU5JVF9DSFVOS19IRFIgKG1uZ19pbml0X2ZwcmkpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfRlBSSSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19BTExPQyAocERhdGEsICpwcENodW5rLCBzaXplb2YgKG1uZ19mcHJpKSk7CisgICgobW5nX2ZwcmlwKSpwcENodW5rKS0+c0hlYWRlciA9ICooKG1uZ19jaHVua19oZWFkZXJwKXBIZWFkZXIpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfRlBSSSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX25FRUQKK0lOSVRfQ0hVTktfSERSIChtbmdfaW5pdF9uZWVkKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX05FRUQsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfQUxMT0MgKHBEYXRhLCAqcHBDaHVuaywgc2l6ZW9mIChtbmdfbmVlZCkpOworICAoKG1uZ19uZWVkcCkqcHBDaHVuayktPnNIZWFkZXIgPSAqKChtbmdfY2h1bmtfaGVhZGVycClwSGVhZGVyKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX05FRUQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19wSFlnCitJTklUX0NIVU5LX0hEUiAobW5nX2luaXRfcGh5ZykKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSU5JVF9QSFlHLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX0FMTE9DIChwRGF0YSwgKnBwQ2h1bmssIHNpemVvZiAobW5nX3BoeWcpKTsKKyAgKChtbmdfcGh5Z3ApKnBwQ2h1bmspLT5zSGVhZGVyID0gKigobW5nX2NodW5rX2hlYWRlcnApcEhlYWRlcik7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSU5JVF9QSFlHLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCitJTklUX0NIVU5LX0hEUiAobW5nX2luaXRfamhkcikKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSU5JVF9KSERSLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX0FMTE9DIChwRGF0YSwgKnBwQ2h1bmssIHNpemVvZiAobW5nX2poZHIpKTsKKyAgKChtbmdfamhkcnApKnBwQ2h1bmspLT5zSGVhZGVyID0gKigobW5nX2NodW5rX2hlYWRlcnApcEhlYWRlcik7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSU5JVF9KSERSLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZiAvKiBNTkdfSU5DTFVERV9KTkcgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19JTkNMVURFX0pORworSU5JVF9DSFVOS19IRFIgKG1uZ19pbml0X2pkYWEpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfSkRBQSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19BTExPQyAocERhdGEsICpwcENodW5rLCBzaXplb2YgKG1uZ19qZGFhKSk7CisgICgobW5nX2pkYWFwKSpwcENodW5rKS0+c0hlYWRlciA9ICooKG1uZ19jaHVua19oZWFkZXJwKXBIZWFkZXIpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfSkRBQSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYgLyogTU5HX0lOQ0xVREVfSk5HICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKK0lOSVRfQ0hVTktfSERSIChtbmdfaW5pdF9qZGF0KQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX0pEQVQsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfQUxMT0MgKHBEYXRhLCAqcHBDaHVuaywgc2l6ZW9mIChtbmdfamRhdCkpOworICAoKG1uZ19qZGF0cCkqcHBDaHVuayktPnNIZWFkZXIgPSAqKChtbmdfY2h1bmtfaGVhZGVycClwSGVhZGVyKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX0pEQVQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmIC8qIE1OR19JTkNMVURFX0pORyAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCitJTklUX0NIVU5LX0hEUiAobW5nX2luaXRfanNlcCkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSU5JVF9KU0VQLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX0FMTE9DIChwRGF0YSwgKnBwQ2h1bmssIHNpemVvZiAobW5nX2pzZXApKTsKKyAgKChtbmdfanNlcHApKnBwQ2h1bmspLT5zSGVhZGVyID0gKigobW5nX2NodW5rX2hlYWRlcnApcEhlYWRlcik7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSU5JVF9KU0VQLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZiAvKiBNTkdfSU5DTFVERV9KTkcgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCitJTklUX0NIVU5LX0hEUiAobW5nX2luaXRfZGhkcikKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSU5JVF9ESERSLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX0FMTE9DIChwRGF0YSwgKnBwQ2h1bmssIHNpemVvZiAobW5nX2RoZHIpKTsKKyAgKChtbmdfZGhkcnApKnBwQ2h1bmspLT5zSGVhZGVyID0gKigobW5nX2NodW5rX2hlYWRlcnApcEhlYWRlcik7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSU5JVF9ESERSLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKK0lOSVRfQ0hVTktfSERSIChtbmdfaW5pdF9wcm9tKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX1BST00sIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfQUxMT0MgKHBEYXRhLCAqcHBDaHVuaywgc2l6ZW9mIChtbmdfcHJvbSkpOworICAoKG1uZ19wcm9tcCkqcHBDaHVuayktPnNIZWFkZXIgPSAqKChtbmdfY2h1bmtfaGVhZGVycClwSGVhZGVyKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX1BST00sIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworSU5JVF9DSFVOS19IRFIgKG1uZ19pbml0X2lwbmcpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfSVBORywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19BTExPQyAocERhdGEsICpwcENodW5rLCBzaXplb2YgKG1uZ19pcG5nKSk7CisgICgobW5nX2lwbmdwKSpwcENodW5rKS0+c0hlYWRlciA9ICooKG1uZ19jaHVua19oZWFkZXJwKXBIZWFkZXIpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfSVBORywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCitJTklUX0NIVU5LX0hEUiAobW5nX2luaXRfcHBsdCkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSU5JVF9QUExULCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX0FMTE9DIChwRGF0YSwgKnBwQ2h1bmssIHNpemVvZiAobW5nX3BwbHQpKTsKKyAgKChtbmdfcHBsdHApKnBwQ2h1bmspLT5zSGVhZGVyID0gKigobW5nX2NodW5rX2hlYWRlcnApcEhlYWRlcik7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSU5JVF9QUExULCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKK0lOSVRfQ0hVTktfSERSIChtbmdfaW5pdF9pam5nKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX0lKTkcsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfQUxMT0MgKHBEYXRhLCAqcHBDaHVuaywgc2l6ZW9mIChtbmdfaWpuZykpOworICAoKG1uZ19pam5ncCkqcHBDaHVuayktPnNIZWFkZXIgPSAqKChtbmdfY2h1bmtfaGVhZGVycClwSGVhZGVyKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX0lKTkcsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCitJTklUX0NIVU5LX0hEUiAobW5nX2luaXRfZHJvcCkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSU5JVF9EUk9QLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX0FMTE9DIChwRGF0YSwgKnBwQ2h1bmssIHNpemVvZiAobW5nX2Ryb3ApKTsKKyAgKChtbmdfZHJvcHApKnBwQ2h1bmspLT5zSGVhZGVyID0gKigobW5nX2NodW5rX2hlYWRlcnApcEhlYWRlcik7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSU5JVF9EUk9QLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworI2lmbmRlZiBNTkdfU0tJUENIVU5LX0RCWUsKK0lOSVRfQ0hVTktfSERSIChtbmdfaW5pdF9kYnlrKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX0RCWUssIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfQUxMT0MgKHBEYXRhLCAqcHBDaHVuaywgc2l6ZW9mIChtbmdfZGJ5aykpOworICAoKG1uZ19kYnlrcCkqcHBDaHVuayktPnNIZWFkZXIgPSAqKChtbmdfY2h1bmtfaGVhZGVycClwSGVhZGVyKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX0RCWUssIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfT1JEUgorSU5JVF9DSFVOS19IRFIgKG1uZ19pbml0X29yZHIpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfT1JEUiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19BTExPQyAocERhdGEsICpwcENodW5rLCBzaXplb2YgKG1uZ19vcmRyKSk7CisgICgobW5nX29yZHJwKSpwcENodW5rKS0+c0hlYWRlciA9ICooKG1uZ19jaHVua19oZWFkZXJwKXBIZWFkZXIpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfT1JEUiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfTUFHTgorSU5JVF9DSFVOS19IRFIgKG1uZ19pbml0X21hZ24pCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfTUFHTiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19BTExPQyAocERhdGEsICpwcENodW5rLCBzaXplb2YgKG1uZ19tYWduKSk7CisgICgobW5nX21hZ25wKSpwcENodW5rKS0+c0hlYWRlciA9ICooKG1uZ19jaHVua19oZWFkZXJwKXBIZWFkZXIpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfTUFHTiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX2V2TlQKK0lOSVRfQ0hVTktfSERSIChtbmdfaW5pdF9ldm50KQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX0VWTlQsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfQUxMT0MgKHBEYXRhLCAqcHBDaHVuaywgc2l6ZW9mIChtbmdfZXZudCkpOworICAoKG1uZ19ldm50cCkqcHBDaHVuayktPnNIZWFkZXIgPSAqKChtbmdfY2h1bmtfaGVhZGVycClwSGVhZGVyKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX0VWTlQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK0lOSVRfQ0hVTktfSERSIChtbmdfaW5pdF91bmtub3duKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX1VOS05PV04sIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfQUxMT0MgKHBEYXRhLCAqcHBDaHVuaywgc2l6ZW9mIChtbmdfdW5rbm93bl9jaHVuaykpOworICAoKG1uZ191bmtub3duX2NodW5rcCkqcHBDaHVuayktPnNIZWFkZXIgPSAqKChtbmdfY2h1bmtfaGVhZGVycClwSGVhZGVyKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX1VOS05PV04sIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjZW5kaWYgLyogTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIENodW5rIHNwZWNpZmljIGNsZWFudXAgcm91dGluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorRlJFRV9DSFVOS19IRFIgKG1uZ19mcmVlX2dlbmVyYWwpCit7CisgIE1OR19GUkVFWCAocERhdGEsIHBIZWFkZXIsICgobW5nX2NodW5rX2hlYWRlcnApcEhlYWRlciktPmlDaHVua3NpemUpOworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorRlJFRV9DSFVOS19IRFIgKG1uZ19mcmVlX2loZHIpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfSUhEUiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19GUkVFWCAocERhdGEsIHBIZWFkZXIsIHNpemVvZiAobW5nX2loZHIpKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX0lIRFIsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKK0ZSRUVfQ0hVTktfSERSIChtbmdfZnJlZV9wbHRlKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX1BMVEUsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfRlJFRVggKHBEYXRhLCBwSGVhZGVyLCBzaXplb2YgKG1uZ19wbHRlKSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9QTFRFLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitGUkVFX0NIVU5LX0hEUiAobW5nX2ZyZWVfaWRhdCkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9JREFULCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKCgobW5nX2lkYXRwKXBIZWFkZXIpLT5pRGF0YXNpemUpCisgICAgTU5HX0ZSRUVYIChwRGF0YSwgKChtbmdfaWRhdHApcEhlYWRlciktPnBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICgobW5nX2lkYXRwKXBIZWFkZXIpLT5pRGF0YXNpemUpOworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisgIE1OR19GUkVFWCAocERhdGEsIHBIZWFkZXIsIHNpemVvZiAobW5nX2lkYXQpKTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfSURBVCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICByZXR1cm4gTU5HX05PRVJST1I7CisjZWxzZQorICByZXR1cm4gbW5nX2ZyZWVfZ2VuZXJhbChwRGF0YSwgcEhlYWRlcik7CisjZW5kaWYKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorRlJFRV9DSFVOS19IRFIgKG1uZ19mcmVlX2llbmQpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfSUVORCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19GUkVFWCAocERhdGEsIHBIZWFkZXIsIHNpemVvZiAobW5nX2llbmQpKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX0lFTkQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKK0ZSRUVfQ0hVTktfSERSIChtbmdfZnJlZV90cm5zKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX1RSTlMsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfRlJFRVggKHBEYXRhLCBwSGVhZGVyLCBzaXplb2YgKG1uZ190cm5zKSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9UUk5TLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfZ0FNQQorRlJFRV9DSFVOS19IRFIgKG1uZ19mcmVlX2dhbWEpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfR0FNQSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19GUkVFWCAocERhdGEsIHBIZWFkZXIsIHNpemVvZiAobW5nX2dhbWEpKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX0dBTUEsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorI2lmbmRlZiBNTkdfU0tJUENIVU5LX2NIUk0KK0ZSRUVfQ0hVTktfSERSIChtbmdfZnJlZV9jaHJtKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX0NIUk0sIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfRlJFRVggKHBEYXRhLCBwSGVhZGVyLCBzaXplb2YgKG1uZ19jaHJtKSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9DSFJNLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19zUkdCCitGUkVFX0NIVU5LX0hEUiAobW5nX2ZyZWVfc3JnYikKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9TUkdCLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX0ZSRUVYIChwRGF0YSwgcEhlYWRlciwgc2l6ZW9mIChtbmdfc3JnYikpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfU1JHQiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfaUNDUAorRlJFRV9DSFVOS19IRFIgKG1uZ19mcmVlX2ljY3ApCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfSUNDUCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmICgoKG1uZ19pY2NwcClwSGVhZGVyKS0+aU5hbWVzaXplKQorICAgIE1OR19GUkVFWCAocERhdGEsICgobW5nX2ljY3BwKXBIZWFkZXIpLT56TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAoKG1uZ19pY2NwcClwSGVhZGVyKS0+aU5hbWVzaXplICsgMSk7CisKKyAgaWYgKCgobW5nX2ljY3BwKXBIZWFkZXIpLT5pUHJvZmlsZXNpemUpCisgICAgTU5HX0ZSRUVYIChwRGF0YSwgKChtbmdfaWNjcHApcEhlYWRlciktPnBQcm9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICgobW5nX2ljY3BwKXBIZWFkZXIpLT5pUHJvZmlsZXNpemUpOworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisgIE1OR19GUkVFWCAocERhdGEsIHBIZWFkZXIsIHNpemVvZiAobW5nX2ljY3ApKTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfSUNDUCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICByZXR1cm4gTU5HX05PRVJST1I7CisjZWxzZQorICByZXR1cm4gbW5nX2ZyZWVfZ2VuZXJhbChwRGF0YSwgcEhlYWRlcik7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfdEVYdAorRlJFRV9DSFVOS19IRFIgKG1uZ19mcmVlX3RleHQpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfVEVYVCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmICgoKG1uZ190ZXh0cClwSGVhZGVyKS0+aUtleXdvcmRzaXplKQorICAgIE1OR19GUkVFWCAocERhdGEsICgobW5nX3RleHRwKXBIZWFkZXIpLT56S2V5d29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAoKG1uZ190ZXh0cClwSGVhZGVyKS0+aUtleXdvcmRzaXplICsgMSk7CisKKyAgaWYgKCgobW5nX3RleHRwKXBIZWFkZXIpLT5pVGV4dHNpemUpCisgICAgTU5HX0ZSRUVYIChwRGF0YSwgKChtbmdfdGV4dHApcEhlYWRlciktPnpUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICgobW5nX3RleHRwKXBIZWFkZXIpLT5pVGV4dHNpemUgKyAxKTsKKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICBNTkdfRlJFRVggKHBEYXRhLCBwSGVhZGVyLCBzaXplb2YgKG1uZ190ZXh0KSk7CisjZW5kaWYKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX1RFWFQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworI2Vsc2UKKyAgcmV0dXJuIG1uZ19mcmVlX2dlbmVyYWwocERhdGEsIHBIZWFkZXIpOworI2VuZGlmCit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX3pUWHQKK0ZSRUVfQ0hVTktfSERSIChtbmdfZnJlZV96dHh0KQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX1pUWFQsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAoKChtbmdfenR4dHApcEhlYWRlciktPmlLZXl3b3Jkc2l6ZSkKKyAgICBNTkdfRlJFRVggKHBEYXRhLCAoKG1uZ196dHh0cClwSGVhZGVyKS0+ektleXdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgKChtbmdfenR4dHApcEhlYWRlciktPmlLZXl3b3Jkc2l6ZSArIDEpOworCisgIGlmICgoKG1uZ196dHh0cClwSGVhZGVyKS0+aVRleHRzaXplKQorICAgIE1OR19GUkVFWCAocERhdGEsICgobW5nX3p0eHRwKXBIZWFkZXIpLT56VGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAoKG1uZ196dHh0cClwSGVhZGVyKS0+aVRleHRzaXplKTsKKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICBNTkdfRlJFRVggKHBEYXRhLCBwSGVhZGVyLCBzaXplb2YgKG1uZ196dHh0KSk7CisjZW5kaWYKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX1pUWFQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworI2Vsc2UKKyAgcmV0dXJuIG1uZ19mcmVlX2dlbmVyYWwocERhdGEsIHBIZWFkZXIpOworI2VuZGlmCit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19pVFh0CitGUkVFX0NIVU5LX0hEUiAobW5nX2ZyZWVfaXR4dCkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9JVFhULCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKCgobW5nX2l0eHRwKXBIZWFkZXIpLT5pS2V5d29yZHNpemUpCisgICAgTU5HX0ZSRUVYIChwRGF0YSwgKChtbmdfaXR4dHApcEhlYWRlciktPnpLZXl3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICgobW5nX2l0eHRwKXBIZWFkZXIpLT5pS2V5d29yZHNpemUgKyAxKTsKKworICBpZiAoKChtbmdfaXR4dHApcEhlYWRlciktPmlMYW5ndWFnZXNpemUpCisgICAgTU5HX0ZSRUVYIChwRGF0YSwgKChtbmdfaXR4dHApcEhlYWRlciktPnpMYW5ndWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAoKG1uZ19pdHh0cClwSGVhZGVyKS0+aUxhbmd1YWdlc2l6ZSArIDEpOworCisgIGlmICgoKG1uZ19pdHh0cClwSGVhZGVyKS0+aVRyYW5zbGF0aW9uc2l6ZSkKKyAgICBNTkdfRlJFRVggKHBEYXRhLCAoKG1uZ19pdHh0cClwSGVhZGVyKS0+elRyYW5zbGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICgobW5nX2l0eHRwKXBIZWFkZXIpLT5pVHJhbnNsYXRpb25zaXplICsgMSk7CisKKyAgaWYgKCgobW5nX2l0eHRwKXBIZWFkZXIpLT5pVGV4dHNpemUpCisgICAgTU5HX0ZSRUVYIChwRGF0YSwgKChtbmdfaXR4dHApcEhlYWRlciktPnpUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICgobW5nX2l0eHRwKXBIZWFkZXIpLT5pVGV4dHNpemUpOworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisgIE1OR19GUkVFWCAocERhdGEsIHBIZWFkZXIsIHNpemVvZiAobW5nX2l0eHQpKTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfSVRYVCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICByZXR1cm4gTU5HX05PRVJST1I7CisjZWxzZQorICByZXR1cm4gbW5nX2ZyZWVfZ2VuZXJhbChwRGF0YSwgcEhlYWRlcik7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2lmZGVmIE1OR19JTkNMVURFX01QTkdfUFJPUE9TQUwKK0ZSRUVfQ0hVTktfSERSIChtbmdfZnJlZV9tcG5nKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX01QTkcsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAoKChtbmdfbXBuZ3ApcEhlYWRlciktPmlGcmFtZXNzaXplKQorICAgIE1OR19GUkVFWCAocERhdGEsICgobW5nX21wbmdwKXBIZWFkZXIpLT5wRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICgobW5nX21wbmdwKXBIZWFkZXIpLT5pRnJhbWVzc2l6ZSk7CisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyAgTU5HX0ZSRUVYIChwRGF0YSwgcEhlYWRlciwgc2l6ZW9mIChtbmdfbXBuZykpOworI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9NUE5HLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisgIHJldHVybiBNTkdfTk9FUlJPUjsKKyNlbHNlCisgIHJldHVybiBtbmdfZnJlZV9nZW5lcmFsKHBEYXRhLCBwSGVhZGVyKTsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjaWZkZWYgTU5HX0lOQ0xVREVfQU5HX1BST1BPU0FMCitGUkVFX0NIVU5LX0hEUiAobW5nX2ZyZWVfYWRhdCkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9BREFULCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKCgobW5nX2FkYXRwKXBIZWFkZXIpLT5pVGlsZXNzaXplKQorICAgIE1OR19GUkVFWCAocERhdGEsICgobW5nX2FkYXRwKXBIZWFkZXIpLT5wVGlsZXMsICgobW5nX2FkYXRwKXBIZWFkZXIpLT5pVGlsZXNzaXplKTsKKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICBNTkdfRlJFRVggKHBEYXRhLCBwSGVhZGVyLCBzaXplb2YgKG1uZ19hZGF0KSk7CisjZW5kaWYKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX0FEQVQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworI2Vsc2UKKyAgcmV0dXJuIG1uZ19mcmVlX2dlbmVyYWwocERhdGEsIHBIZWFkZXIpOworI2VuZGlmCit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorI2lmbmRlZiBNTkdfU0tJUENIVU5LX2JLR0QKK0ZSRUVfQ0hVTktfSERSIChtbmdfZnJlZV9ia2dkKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX0JLR0QsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfRlJFRVggKHBEYXRhLCBwSGVhZGVyLCBzaXplb2YgKG1uZ19ia2dkKSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9CS0dELCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19wSFlzCitGUkVFX0NIVU5LX0hEUiAobW5nX2ZyZWVfcGh5cykKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9QSFlTLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX0ZSRUVYIChwRGF0YSwgcEhlYWRlciwgc2l6ZW9mIChtbmdfcGh5cykpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfUEhZUywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfc0JJVAorRlJFRV9DSFVOS19IRFIgKG1uZ19mcmVlX3NiaXQpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfU0JJVCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19GUkVFWCAocERhdGEsIHBIZWFkZXIsIHNpemVvZiAobW5nX3NiaXQpKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX1NCSVQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX3NQTFQKK0ZSRUVfQ0hVTktfSERSIChtbmdfZnJlZV9zcGx0KQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX1NQTFQsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAoKChtbmdfc3BsdHApcEhlYWRlciktPmlOYW1lc2l6ZSkKKyAgICBNTkdfRlJFRVggKHBEYXRhLCAoKG1uZ19zcGx0cClwSGVhZGVyKS0+ek5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgKChtbmdfc3BsdHApcEhlYWRlciktPmlOYW1lc2l6ZSArIDEpOworCisgIGlmICgoKG1uZ19zcGx0cClwSGVhZGVyKS0+aUVudHJ5Y291bnQpCisgICAgTU5HX0ZSRUVYIChwRGF0YSwgKChtbmdfc3BsdHApcEhlYWRlciktPnBFbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICgobW5nX3NwbHRwKXBIZWFkZXIpLT5pRW50cnljb3VudCAqCisgICAgICAgICAgICAgICAgICAgICAgKCgobW5nX3NwbHRwKXBIZWFkZXIpLT5pU2FtcGxlZGVwdGggKiAzICsgc2l6ZW9mIChtbmdfdWludDE2KSkgKTsKKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICBNTkdfRlJFRVggKHBEYXRhLCBwSGVhZGVyLCBzaXplb2YgKG1uZ19zcGx0KSk7CisjZW5kaWYKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX1NQTFQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworI2Vsc2UKKyAgcmV0dXJuIG1uZ19mcmVlX2dlbmVyYWwocERhdGEsIHBIZWFkZXIpOworI2VuZGlmCit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorI2lmbmRlZiBNTkdfU0tJUENIVU5LX2hJU1QKK0ZSRUVfQ0hVTktfSERSIChtbmdfZnJlZV9oaXN0KQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX0hJU1QsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfRlJFRVggKHBEYXRhLCBwSGVhZGVyLCBzaXplb2YgKG1uZ19oaXN0KSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9ISVNULCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS190SU1FCitGUkVFX0NIVU5LX0hEUiAobW5nX2ZyZWVfdGltZSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9USU1FLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX0ZSRUVYIChwRGF0YSwgcEhlYWRlciwgc2l6ZW9mIChtbmdfdGltZSkpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfVElNRSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCitGUkVFX0NIVU5LX0hEUiAobW5nX2ZyZWVfbWhkcikKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9NSERSLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX0ZSRUVYIChwRGF0YSwgcEhlYWRlciwgc2l6ZW9mIChtbmdfbWhkcikpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfTUhEUiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorRlJFRV9DSFVOS19IRFIgKG1uZ19mcmVlX21lbmQpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfTUVORCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19GUkVFWCAocERhdGEsIHBIZWFkZXIsIHNpemVvZiAobW5nX21lbmQpKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX01FTkQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19MT09QCitGUkVFX0NIVU5LX0hEUiAobW5nX2ZyZWVfbG9vcCkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9MT09QLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyNpZm5kZWYgTU5HX05PX0xPT1BfU0lHTkFMU19TVVBQT1JURUQKKyAgaWYgKCgobW5nX2xvb3BwKXBIZWFkZXIpLT5pQ291bnQpCisgICAgTU5HX0ZSRUVYIChwRGF0YSwgKChtbmdfbG9vcHApcEhlYWRlciktPnBTaWduYWxzLAorICAgICAgICAgICAgICAgICAgICAgICgobW5nX2xvb3BwKXBIZWFkZXIpLT5pQ291bnQgKiBzaXplb2YgKG1uZ191aW50MzIpICk7CisjZW5kaWYKKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICBNTkdfRlJFRVggKHBEYXRhLCBwSGVhZGVyLCBzaXplb2YgKG1uZ19sb29wKSk7CisjZW5kaWYKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX0xPT1AsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworI2Vsc2UKKyAgcmV0dXJuIG1uZ19mcmVlX2dlbmVyYWwocERhdGEsIHBIZWFkZXIpOworI2VuZGlmCit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKK0ZSRUVfQ0hVTktfSERSIChtbmdfZnJlZV9lbmRsKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX0VOREwsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfRlJFRVggKHBEYXRhLCBwSGVhZGVyLCBzaXplb2YgKG1uZ19lbmRsKSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9FTkRMLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19ERUZJCitGUkVFX0NIVU5LX0hEUiAobW5nX2ZyZWVfZGVmaSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9ERUZJLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX0ZSRUVYIChwRGF0YSwgcEhlYWRlciwgc2l6ZW9mIChtbmdfZGVmaSkpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfREVGSSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfQkFTSQorRlJFRV9DSFVOS19IRFIgKG1uZ19mcmVlX2Jhc2kpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfQkFTSSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19GUkVFWCAocERhdGEsIHBIZWFkZXIsIHNpemVvZiAobW5nX2Jhc2kpKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX0JBU0ksIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorI2lmbmRlZiBNTkdfU0tJUENIVU5LX0NMT04KK0ZSRUVfQ0hVTktfSERSIChtbmdfZnJlZV9jbG9uKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX0NMT04sIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfRlJFRVggKHBEYXRhLCBwSGVhZGVyLCBzaXplb2YgKG1uZ19jbG9uKSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9DTE9OLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19QQVNUCitGUkVFX0NIVU5LX0hEUiAobW5nX2ZyZWVfcGFzdCkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9QQVNULCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKCgobW5nX3Bhc3RwKXBIZWFkZXIpLT5pQ291bnQpCisgICAgTU5HX0ZSRUVYIChwRGF0YSwgKChtbmdfcGFzdHApcEhlYWRlciktPnBTb3VyY2VzLAorICAgICAgICAgICAgICAgICAgICAgICgobW5nX3Bhc3RwKXBIZWFkZXIpLT5pQ291bnQgKiBzaXplb2YgKG1uZ19wYXN0X3NvdXJjZSkgKTsKKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICBNTkdfRlJFRVggKHBEYXRhLCBwSGVhZGVyLCBzaXplb2YgKG1uZ19wYXN0KSk7CisjZW5kaWYKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX1BBU1QsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworI2Vsc2UKKyAgcmV0dXJuIG1uZ19mcmVlX2dlbmVyYWwocERhdGEsIHBIZWFkZXIpOworI2VuZGlmCit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX0RJU0MKK0ZSRUVfQ0hVTktfSERSIChtbmdfZnJlZV9kaXNjKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX0RJU0MsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAoKChtbmdfZGlzY3ApcEhlYWRlciktPmlDb3VudCkKKyAgICBNTkdfRlJFRVggKHBEYXRhLCAoKG1uZ19kaXNjcClwSGVhZGVyKS0+cE9iamVjdGlkcywKKyAgICAgICAgICAgICAgICAgICAgICAoKG1uZ19kaXNjcClwSGVhZGVyKS0+aUNvdW50ICogc2l6ZW9mIChtbmdfdWludDE2KSApOworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisgIE1OR19GUkVFWCAocERhdGEsIHBIZWFkZXIsIHNpemVvZiAobW5nX2Rpc2MpKTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfRElTQywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICByZXR1cm4gTU5HX05PRVJST1I7CisjZWxzZQorICByZXR1cm4gbW5nX2ZyZWVfZ2VuZXJhbChwRGF0YSwgcEhlYWRlcik7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfQkFDSworRlJFRV9DSFVOS19IRFIgKG1uZ19mcmVlX2JhY2spCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfQkFDSywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19GUkVFWCAocERhdGEsIHBIZWFkZXIsIHNpemVvZiAobW5nX2JhY2spKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX0JBQ0ssIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX0ZSQU0KK0ZSRUVfQ0hVTktfSERSIChtbmdfZnJlZV9mcmFtKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX0ZSQU0sIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAoKChtbmdfZnJhbXApcEhlYWRlciktPmlOYW1lc2l6ZSkKKyAgICBNTkdfRlJFRVggKHBEYXRhLCAoKG1uZ19mcmFtcClwSGVhZGVyKS0+ek5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgKChtbmdfZnJhbXApcEhlYWRlciktPmlOYW1lc2l6ZSArIDEpOworCisgIGlmICgoKG1uZ19mcmFtcClwSGVhZGVyKS0+aUNvdW50KQorICAgIE1OR19GUkVFWCAocERhdGEsICgobW5nX2ZyYW1wKXBIZWFkZXIpLT5wU3luY2lkcywKKyAgICAgICAgICAgICAgICAgICAgICAoKG1uZ19mcmFtcClwSGVhZGVyKS0+aUNvdW50ICogc2l6ZW9mIChtbmdfdWludDMyKSApOworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisgIE1OR19GUkVFWCAocERhdGEsIHBIZWFkZXIsIHNpemVvZiAobW5nX2ZyYW0pKTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfRlJBTSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICByZXR1cm4gTU5HX05PRVJST1I7CisjZWxzZQorICByZXR1cm4gbW5nX2ZyZWVfZ2VuZXJhbChwRGF0YSwgcEhlYWRlcik7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfTU9WRQorRlJFRV9DSFVOS19IRFIgKG1uZ19mcmVlX21vdmUpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfTU9WRSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19GUkVFWCAocERhdGEsIHBIZWFkZXIsIHNpemVvZiAobW5nX21vdmUpKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX01PVkUsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorI2lmbmRlZiBNTkdfU0tJUENIVU5LX0NMSVAKK0ZSRUVfQ0hVTktfSERSIChtbmdfZnJlZV9jbGlwKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX0NMSVAsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfRlJFRVggKHBEYXRhLCBwSGVhZGVyLCBzaXplb2YgKG1uZ19jbGlwKSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9DTElQLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19TSE9XCitGUkVFX0NIVU5LX0hEUiAobW5nX2ZyZWVfc2hvdykKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9TSE9XLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX0ZSRUVYIChwRGF0YSwgcEhlYWRlciwgc2l6ZW9mIChtbmdfc2hvdykpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfU0hPVywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfVEVSTQorRlJFRV9DSFVOS19IRFIgKG1uZ19mcmVlX3Rlcm0pCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfVEVSTSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19GUkVFWCAocERhdGEsIHBIZWFkZXIsIHNpemVvZiAobW5nX3Rlcm0pKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX1RFUk0sIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX1NBVkUKK0ZSRUVfQ0hVTktfSERSIChtbmdfZnJlZV9zYXZlKQoreworICBtbmdfc2F2ZV9lbnRyeXAgcEVudHJ5ID0gKChtbmdfc2F2ZXApcEhlYWRlciktPnBFbnRyaWVzOworICBtbmdfdWludDMyICAgICAgaVg7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9TQVZFLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgZm9yIChpWCA9IDA7IGlYIDwgKChtbmdfc2F2ZXApcEhlYWRlciktPmlDb3VudDsgaVgrKykKKyAgeworICAgIGlmIChwRW50cnktPmlOYW1lc2l6ZSkKKyAgICAgIE1OR19GUkVFWCAocERhdGEsIHBFbnRyeS0+ek5hbWUsIHBFbnRyeS0+aU5hbWVzaXplKTsKKworICAgIHBFbnRyeSA9IHBFbnRyeSArIHNpemVvZiAobW5nX3NhdmVfZW50cnkpOworICB9CisKKyAgaWYgKCgobW5nX3NhdmVwKXBIZWFkZXIpLT5pQ291bnQpCisgICAgTU5HX0ZSRUVYIChwRGF0YSwgKChtbmdfc2F2ZXApcEhlYWRlciktPnBFbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICgobW5nX3NhdmVwKXBIZWFkZXIpLT5pQ291bnQgKiBzaXplb2YgKG1uZ19zYXZlX2VudHJ5KSApOworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisgIE1OR19GUkVFWCAocERhdGEsIHBIZWFkZXIsIHNpemVvZiAobW5nX3NhdmUpKTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfU0FWRSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICByZXR1cm4gTU5HX05PRVJST1I7CisjZWxzZQorICByZXR1cm4gbW5nX2ZyZWVfZ2VuZXJhbChwRGF0YSwgcEhlYWRlcik7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfU0VFSworRlJFRV9DSFVOS19IRFIgKG1uZ19mcmVlX3NlZWspCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfU0VFSywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmICgoKG1uZ19zZWVrcClwSGVhZGVyKS0+aU5hbWVzaXplKQorICAgIE1OR19GUkVFWCAocERhdGEsICgobW5nX3NlZWtwKXBIZWFkZXIpLT56TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAoKG1uZ19zZWVrcClwSGVhZGVyKS0+aU5hbWVzaXplICsgMSk7CisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyAgTU5HX0ZSRUVYIChwRGF0YSwgcEhlYWRlciwgc2l6ZW9mIChtbmdfc2VlaykpOworI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9TRUVLLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisgIHJldHVybiBNTkdfTk9FUlJPUjsKKyNlbHNlCisgIHJldHVybiBtbmdfZnJlZV9nZW5lcmFsKHBEYXRhLCBwSGVhZGVyKTsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19lWFBJCitGUkVFX0NIVU5LX0hEUiAobW5nX2ZyZWVfZXhwaSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9FWFBJLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKCgobW5nX2V4cGlwKXBIZWFkZXIpLT5pTmFtZXNpemUpCisgICAgTU5HX0ZSRUVYIChwRGF0YSwgKChtbmdfZXhwaXApcEhlYWRlciktPnpOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICgobW5nX2V4cGlwKXBIZWFkZXIpLT5pTmFtZXNpemUgKyAxKTsKKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICBNTkdfRlJFRVggKHBEYXRhLCBwSGVhZGVyLCBzaXplb2YgKG1uZ19leHBpKSk7CisjZW5kaWYKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX0VYUEksIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworI2Vsc2UKKyAgcmV0dXJuIG1uZ19mcmVlX2dlbmVyYWwocERhdGEsIHBIZWFkZXIpOworI2VuZGlmCit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorI2lmbmRlZiBNTkdfU0tJUENIVU5LX2ZQUkkKK0ZSRUVfQ0hVTktfSERSIChtbmdfZnJlZV9mcHJpKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX0ZQUkksIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfRlJFRVggKHBEYXRhLCBwSGVhZGVyLCBzaXplb2YgKG1uZ19mcHJpKSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9GUFJJLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19uRUVECitGUkVFX0NIVU5LX0hEUiAobW5nX2ZyZWVfbmVlZCkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9ORUVELCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKCgobW5nX25lZWRwKXBIZWFkZXIpLT5pS2V5d29yZHNzaXplKQorICAgIE1OR19GUkVFWCAocERhdGEsICgobW5nX25lZWRwKXBIZWFkZXIpLT56S2V5d29yZHMsCisgICAgICAgICAgICAgICAgICAgICAgKChtbmdfbmVlZHApcEhlYWRlciktPmlLZXl3b3Jkc3NpemUgKyAxKTsKKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICBNTkdfRlJFRVggKHBEYXRhLCBwSGVhZGVyLCBzaXplb2YgKG1uZ19uZWVkKSk7CisjZW5kaWYKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX05FRUQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworI2Vsc2UKKyAgcmV0dXJuIG1uZ19mcmVlX2dlbmVyYWwocERhdGEsIHBIZWFkZXIpOworI2VuZGlmCit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorI2lmbmRlZiBNTkdfU0tJUENIVU5LX3BIWWcKK0ZSRUVfQ0hVTktfSERSIChtbmdfZnJlZV9waHlnKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX1BIWUcsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfRlJFRVggKHBEYXRhLCBwSGVhZGVyLCBzaXplb2YgKG1uZ19waHlnKSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9QSFlHLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKK0ZSRUVfQ0hVTktfSERSIChtbmdfZnJlZV9qaGRyKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX0pIRFIsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfRlJFRVggKHBEYXRhLCBwSGVhZGVyLCBzaXplb2YgKG1uZ19qaGRyKSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9KSERSLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZiAvKiBNTkdfSU5DTFVERV9KTkcgKi8KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCitGUkVFX0NIVU5LX0hEUiAobW5nX2ZyZWVfamRhYSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9KREFBLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKCgobW5nX2pkYWFwKXBIZWFkZXIpLT5pRGF0YXNpemUpCisgICAgTU5HX0ZSRUVYIChwRGF0YSwgKChtbmdfamRhYXApcEhlYWRlciktPnBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICgobW5nX2pkYWFwKXBIZWFkZXIpLT5pRGF0YXNpemUpOworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisgIE1OR19GUkVFWCAocERhdGEsIHBIZWFkZXIsIHNpemVvZiAobW5nX2pkYWEpKTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfSkRBQSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICByZXR1cm4gTU5HX05PRVJST1I7CisjZWxzZQorICByZXR1cm4gbW5nX2ZyZWVfZ2VuZXJhbChwRGF0YSwgcEhlYWRlcik7CisjZW5kaWYKK30KKyNlbmRpZiAvKiBNTkdfSU5DTFVERV9KTkcgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19JTkNMVURFX0pORworRlJFRV9DSFVOS19IRFIgKG1uZ19mcmVlX2pkYXQpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfSkRBVCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmICgoKG1uZ19qZGF0cClwSGVhZGVyKS0+aURhdGFzaXplKQorICAgIE1OR19GUkVFWCAocERhdGEsICgobW5nX2pkYXRwKXBIZWFkZXIpLT5wRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAoKG1uZ19qZGF0cClwSGVhZGVyKS0+aURhdGFzaXplKTsKKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICBNTkdfRlJFRVggKHBEYXRhLCBwSGVhZGVyLCBzaXplb2YgKG1uZ19qZGF0KSk7CisjZW5kaWYKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX0pEQVQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworI2Vsc2UKKyAgcmV0dXJuIG1uZ19mcmVlX2dlbmVyYWwocERhdGEsIHBIZWFkZXIpOworI2VuZGlmCit9CisjZW5kaWYgLyogTU5HX0lOQ0xVREVfSk5HICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKK0ZSRUVfQ0hVTktfSERSIChtbmdfZnJlZV9qc2VwKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX0pTRVAsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfRlJFRVggKHBEYXRhLCBwSGVhZGVyLCBzaXplb2YgKG1uZ19qc2VwKSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9KU0VQLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZiAvKiBNTkdfSU5DTFVERV9KTkcgKi8KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKK0ZSRUVfQ0hVTktfSERSIChtbmdfZnJlZV9kaGRyKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX0RIRFIsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfRlJFRVggKHBEYXRhLCBwSGVhZGVyLCBzaXplb2YgKG1uZ19kaGRyKSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9ESERSLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworRlJFRV9DSFVOS19IRFIgKG1uZ19mcmVlX3Byb20pCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfUFJPTSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19GUkVFWCAocERhdGEsIHBIZWFkZXIsIHNpemVvZiAobW5nX3Byb20pKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX1BST00sIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCitGUkVFX0NIVU5LX0hEUiAobW5nX2ZyZWVfaXBuZykKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9JUE5HLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX0ZSRUVYIChwRGF0YSwgcEhlYWRlciwgc2l6ZW9mIChtbmdfaXBuZykpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfSVBORywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKK0ZSRUVfQ0hVTktfSERSIChtbmdfZnJlZV9wcGx0KQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX1BQTFQsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfRlJFRVggKHBEYXRhLCBwSGVhZGVyLCBzaXplb2YgKG1uZ19wcGx0KSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9QUExULCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworI2lmZGVmIE1OR19JTkNMVURFX0pORworRlJFRV9DSFVOS19IRFIgKG1uZ19mcmVlX2lqbmcpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfSUpORywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19GUkVFWCAocERhdGEsIHBIZWFkZXIsIHNpemVvZiAobW5nX2lqbmcpKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX0lKTkcsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKK0ZSRUVfQ0hVTktfSERSIChtbmdfZnJlZV9kcm9wKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX0RST1AsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAoKChtbmdfZHJvcHApcEhlYWRlciktPmlDb3VudCkKKyAgICBNTkdfRlJFRVggKHBEYXRhLCAoKG1uZ19kcm9wcClwSGVhZGVyKS0+cENodW5rbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgKChtbmdfZHJvcHApcEhlYWRlciktPmlDb3VudCAqIHNpemVvZiAobW5nX2NodW5raWQpICk7CisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyAgTU5HX0ZSRUVYIChwRGF0YSwgcEhlYWRlciwgc2l6ZW9mIChtbmdfZHJvcCkpOworI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9EUk9QLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisgIHJldHVybiBNTkdfTk9FUlJPUjsKKyNlbHNlCisgIHJldHVybiBtbmdfZnJlZV9nZW5lcmFsKHBEYXRhLCBwSGVhZGVyKTsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworI2lmbmRlZiBNTkdfU0tJUENIVU5LX0RCWUsKK0ZSRUVfQ0hVTktfSERSIChtbmdfZnJlZV9kYnlrKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX0RCWUssIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAoKChtbmdfZGJ5a3ApcEhlYWRlciktPmlLZXl3b3Jkc3NpemUpCisgICAgTU5HX0ZSRUVYIChwRGF0YSwgKChtbmdfZGJ5a3ApcEhlYWRlciktPnpLZXl3b3JkcywKKyAgICAgICAgICAgICAgICAgICAgICAoKG1uZ19kYnlrcClwSGVhZGVyKS0+aUtleXdvcmRzc2l6ZSk7CisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyAgTU5HX0ZSRUVYIChwRGF0YSwgcEhlYWRlciwgc2l6ZW9mIChtbmdfZGJ5aykpOworI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9EQllLLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisgIHJldHVybiBNTkdfTk9FUlJPUjsKKyNlbHNlCisgIHJldHVybiBtbmdfZnJlZV9nZW5lcmFsKHBEYXRhLCBwSGVhZGVyKTsKKyNlbmRpZgorfQorI2VuZGlmCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfT1JEUgorRlJFRV9DSFVOS19IRFIgKG1uZ19mcmVlX29yZHIpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfT1JEUiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmICgoKG1uZ19vcmRycClwSGVhZGVyKS0+aUNvdW50KQorICAgIE1OR19GUkVFWCAocERhdGEsICgobW5nX29yZHJwKXBIZWFkZXIpLT5wRW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAoKG1uZ19vcmRycClwSGVhZGVyKS0+aUNvdW50ICogc2l6ZW9mIChtbmdfb3Jkcl9lbnRyeSkgKTsKKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICBNTkdfRlJFRVggKHBEYXRhLCBwSGVhZGVyLCBzaXplb2YgKG1uZ19vcmRyKSk7CisjZW5kaWYKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX09SRFIsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworI2Vsc2UKKyAgcmV0dXJuIG1uZ19mcmVlX2dlbmVyYWwocERhdGEsIHBIZWFkZXIpOworI2VuZGlmCit9CisjZW5kaWYKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfTUFHTgorRlJFRV9DSFVOS19IRFIgKG1uZ19mcmVlX21hZ24pCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfTUFHTiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19GUkVFWCAocERhdGEsIHBIZWFkZXIsIHNpemVvZiAobW5nX21hZ24pKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX01BR04sIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX2V2TlQKK0ZSRUVfQ0hVTktfSERSIChtbmdfZnJlZV9ldm50KQoreworICBtbmdfZXZudF9lbnRyeXAgcEVudHJ5ID0gKChtbmdfZXZudHApcEhlYWRlciktPnBFbnRyaWVzOworICBtbmdfdWludDMyICAgICAgaVg7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9FVk5ULCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgZm9yIChpWCA9IDA7IGlYIDwgKChtbmdfZXZudHApcEhlYWRlciktPmlDb3VudDsgaVgrKykKKyAgeworICAgIGlmIChwRW50cnktPmlTZWdtZW50bmFtZXNpemUpCisgICAgICBNTkdfRlJFRVggKHBEYXRhLCBwRW50cnktPnpTZWdtZW50bmFtZSwgcEVudHJ5LT5pU2VnbWVudG5hbWVzaXplKzEpOworCisgICAgcEVudHJ5Kys7CisgIH0KKworICBpZiAoKChtbmdfZXZudHApcEhlYWRlciktPmlDb3VudCkKKyAgICBNTkdfRlJFRVggKHBEYXRhLCAoKG1uZ19ldm50cClwSGVhZGVyKS0+cEVudHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgKChtbmdfZXZudHApcEhlYWRlciktPmlDb3VudCAqIHNpemVvZiAobW5nX2V2bnRfZW50cnkpICk7CisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyAgTU5HX0ZSRUVYIChwRGF0YSwgcEhlYWRlciwgc2l6ZW9mIChtbmdfZXZudCkpOworI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9FVk5ULCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisgIHJldHVybiBNTkdfTk9FUlJPUjsKKyNlbHNlCisgIHJldHVybiBtbmdfZnJlZV9nZW5lcmFsKHBEYXRhLCBwSGVhZGVyKTsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK0ZSRUVfQ0hVTktfSERSIChtbmdfZnJlZV91bmtub3duKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX1VOS05PV04sIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAoKChtbmdfdW5rbm93bl9jaHVua3ApcEhlYWRlciktPmlEYXRhc2l6ZSkKKyAgICBNTkdfRlJFRVggKHBEYXRhLCAoKG1uZ191bmtub3duX2NodW5rcClwSGVhZGVyKS0+cERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgKChtbmdfdW5rbm93bl9jaHVua3ApcEhlYWRlciktPmlEYXRhc2l6ZSk7CisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyAgTU5HX0ZSRUVYIChwRGF0YSwgcEhlYWRlciwgc2l6ZW9mIChtbmdfdW5rbm93bl9jaHVuaykpOworI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9VTktOT1dOLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisgIHJldHVybiBNTkdfTk9FUlJPUjsKKyNlbHNlCisgIHJldHVybiBtbmdfZnJlZV9nZW5lcmFsKHBEYXRhLCBwSGVhZGVyKTsKKyNlbmRpZgorfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogQ2h1bmsgc3BlY2lmaWMgY29weSByb3V0aW5lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19JTkNMVURFX1dSSVRFX1BST0NTCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktBU1NJR04KK0FTU0lHTl9DSFVOS19IRFIgKG1uZ19hc3NpZ25fZ2VuZXJhbCkKK3sKKyAgbW5nX3B0ciAgICBwU3JjID0gKG1uZ191aW50OHApcENodW5rZnJvbSArIHNpemVvZiAobW5nX2NodW5rX2hlYWRlcik7CisgIG1uZ19wdHIgICAgcERzdCA9IChtbmdfdWludDhwKXBDaHVua3RvICAgKyBzaXplb2YgKG1uZ19jaHVua19oZWFkZXIpOworICBtbmdfc2l6ZV90IGlMZW4gPSAoKG1uZ19jaHVua19oZWFkZXJwKXBDaHVua2Zyb20pLT5pQ2h1bmtzaXplIC0gc2l6ZW9mIChtbmdfY2h1bmtfaGVhZGVyKTsKKworICBNTkdfQ09QWSAocERzdCwgcFNyYywgaUxlbik7CisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LQVNTSUdOCitBU1NJR05fQ0hVTktfSERSIChtbmdfYXNzaWduX2loZHIpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0FTU0lHTl9JSERSLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKCgobW5nX2NodW5rX2hlYWRlcnApcENodW5rZnJvbSktPmlDaHVua25hbWUgIT0gTU5HX1VJTlRfSUhEUikKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfV1JPTkdDSFVOSyk7IC8qIG91Y2ggKi8KKworICAoKG1uZ19paGRycClwQ2h1bmt0byktPmlXaWR0aCAgICAgICA9ICgobW5nX2loZHJwKXBDaHVua2Zyb20pLT5pV2lkdGg7CisgICgobW5nX2loZHJwKXBDaHVua3RvKS0+aUhlaWdodCAgICAgID0gKChtbmdfaWhkcnApcENodW5rZnJvbSktPmlIZWlnaHQ7CisgICgobW5nX2loZHJwKXBDaHVua3RvKS0+aUJpdGRlcHRoICAgID0gKChtbmdfaWhkcnApcENodW5rZnJvbSktPmlCaXRkZXB0aDsKKyAgKChtbmdfaWhkcnApcENodW5rdG8pLT5pQ29sb3J0eXBlICAgPSAoKG1uZ19paGRycClwQ2h1bmtmcm9tKS0+aUNvbG9ydHlwZTsKKyAgKChtbmdfaWhkcnApcENodW5rdG8pLT5pQ29tcHJlc3Npb24gPSAoKG1uZ19paGRycClwQ2h1bmtmcm9tKS0+aUNvbXByZXNzaW9uOworICAoKG1uZ19paGRycClwQ2h1bmt0byktPmlGaWx0ZXIgICAgICA9ICgobW5nX2loZHJwKXBDaHVua2Zyb20pLT5pRmlsdGVyOworICAoKG1uZ19paGRycClwQ2h1bmt0byktPmlJbnRlcmxhY2UgICA9ICgobW5nX2loZHJwKXBDaHVua2Zyb20pLT5pSW50ZXJsYWNlOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0FTU0lHTl9JSERSLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS0FTU0lHTgorQVNTSUdOX0NIVU5LX0hEUiAobW5nX2Fzc2lnbl9wbHRlKQoreworICBtbmdfdWludDMyIGlYOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0FTU0lHTl9QTFRFLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKCgobW5nX2NodW5rX2hlYWRlcnApcENodW5rZnJvbSktPmlDaHVua25hbWUgIT0gTU5HX1VJTlRfUExURSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfV1JPTkdDSFVOSyk7IC8qIG91Y2ggKi8KKworICAoKG1uZ19wbHRlcClwQ2h1bmt0byktPmJFbXB0eSAgICAgID0gKChtbmdfcGx0ZXApcENodW5rZnJvbSktPmJFbXB0eTsKKyAgKChtbmdfcGx0ZXApcENodW5rdG8pLT5pRW50cnljb3VudCA9ICgobW5nX3BsdGVwKXBDaHVua2Zyb20pLT5pRW50cnljb3VudDsKKworICBmb3IgKGlYID0gMDsgaVggPCAoKG1uZ19wbHRlcClwQ2h1bmt0byktPmlFbnRyeWNvdW50OyBpWCsrKQorICAgICgobW5nX3BsdGVwKXBDaHVua3RvKS0+YUVudHJpZXMgW2lYXSA9ICgobW5nX3BsdGVwKXBDaHVua2Zyb20pLT5hRW50cmllcyBbaVhdOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0FTU0lHTl9QTFRFLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitBU1NJR05fQ0hVTktfSERSIChtbmdfYXNzaWduX2lkYXQpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0FTU0lHTl9JREFULCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKCgobW5nX2NodW5rX2hlYWRlcnApcENodW5rZnJvbSktPmlDaHVua25hbWUgIT0gTU5HX1VJTlRfSURBVCkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfV1JPTkdDSFVOSyk7IC8qIG91Y2ggKi8KKworICAoKG1uZ19pZGF0cClwQ2h1bmt0byktPmJFbXB0eSAgICA9ICgobW5nX2lkYXRwKXBDaHVua2Zyb20pLT5iRW1wdHk7CisgICgobW5nX2lkYXRwKXBDaHVua3RvKS0+aURhdGFzaXplID0gKChtbmdfaWRhdHApcENodW5rZnJvbSktPmlEYXRhc2l6ZTsKKworICBpZiAoKChtbmdfaWRhdHApcENodW5rdG8pLT5pRGF0YXNpemUpCisgIHsKKyAgICBNTkdfQUxMT0MgKHBEYXRhLCAoKG1uZ19pZGF0cClwQ2h1bmt0byktPnBEYXRhLCAoKG1uZ19pZGF0cClwQ2h1bmt0byktPmlEYXRhc2l6ZSk7CisgICAgTU5HX0NPUFkgICgoKG1uZ19pZGF0cClwQ2h1bmt0byktPnBEYXRhLCAoKG1uZ19pZGF0cClwQ2h1bmtmcm9tKS0+cERhdGEsCisgICAgICAgICAgICAgICAoKG1uZ19pZGF0cClwQ2h1bmt0byktPmlEYXRhc2l6ZSk7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9BU1NJR05fSURBVCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LQVNTSUdOCitBU1NJR05fQ0hVTktfSERSIChtbmdfYXNzaWduX2llbmQpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0FTU0lHTl9JRU5ELCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKCgobW5nX2NodW5rX2hlYWRlcnApcENodW5rZnJvbSktPmlDaHVua25hbWUgIT0gTU5HX1VJTlRfSUVORCkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfV1JPTkdDSFVOSyk7IC8qIG91Y2ggKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9BU1NJR05fSUVORCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktBU1NJR04KK0FTU0lHTl9DSFVOS19IRFIgKG1uZ19hc3NpZ25fdHJucykKK3sKKyAgbW5nX3VpbnQzMiBpWDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9BU1NJR05fVFJOUywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmICgoKG1uZ19jaHVua19oZWFkZXJwKXBDaHVua2Zyb20pLT5pQ2h1bmtuYW1lICE9IE1OR19VSU5UX3RSTlMpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1dST05HQ0hVTkspOyAvKiBvdWNoICovCisKKyAgKChtbmdfdHJuc3ApcENodW5rdG8pLT5iRW1wdHkgID0gKChtbmdfdHJuc3ApcENodW5rZnJvbSktPmJFbXB0eTsKKyAgKChtbmdfdHJuc3ApcENodW5rdG8pLT5iR2xvYmFsID0gKChtbmdfdHJuc3ApcENodW5rZnJvbSktPmJHbG9iYWw7CisgICgobW5nX3RybnNwKXBDaHVua3RvKS0+aVR5cGUgICA9ICgobW5nX3RybnNwKXBDaHVua2Zyb20pLT5pVHlwZTsKKyAgKChtbmdfdHJuc3ApcENodW5rdG8pLT5pQ291bnQgID0gKChtbmdfdHJuc3ApcENodW5rZnJvbSktPmlDb3VudDsKKyAgKChtbmdfdHJuc3ApcENodW5rdG8pLT5pR3JheSAgID0gKChtbmdfdHJuc3ApcENodW5rZnJvbSktPmlHcmF5OworICAoKG1uZ190cm5zcClwQ2h1bmt0byktPmlSZWQgICAgPSAoKG1uZ190cm5zcClwQ2h1bmtmcm9tKS0+aVJlZDsKKyAgKChtbmdfdHJuc3ApcENodW5rdG8pLT5pR3JlZW4gID0gKChtbmdfdHJuc3ApcENodW5rZnJvbSktPmlHcmVlbjsKKyAgKChtbmdfdHJuc3ApcENodW5rdG8pLT5pQmx1ZSAgID0gKChtbmdfdHJuc3ApcENodW5rZnJvbSktPmlCbHVlOworICAoKG1uZ190cm5zcClwQ2h1bmt0byktPmlSYXdsZW4gPSAoKG1uZ190cm5zcClwQ2h1bmtmcm9tKS0+aVJhd2xlbjsKKworICBmb3IgKGlYID0gMDsgaVggPCAoKG1uZ190cm5zcClwQ2h1bmt0byktPmlDb3VudDsgaVgrKykKKyAgICAoKG1uZ190cm5zcClwQ2h1bmt0byktPmFFbnRyaWVzIFtpWF0gPSAoKG1uZ190cm5zcClwQ2h1bmtmcm9tKS0+YUVudHJpZXMgW2lYXTsKKworICBmb3IgKGlYID0gMDsgaVggPCAoKG1uZ190cm5zcClwQ2h1bmt0byktPmlSYXdsZW47IGlYKyspCisgICAgKChtbmdfdHJuc3ApcENodW5rdG8pLT5hUmF3ZGF0YSBbaVhdID0gKChtbmdfdHJuc3ApcENodW5rZnJvbSktPmFSYXdkYXRhIFtpWF07CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQVNTSUdOX1RSTlMsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LQVNTSUdOCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfZ0FNQQorQVNTSUdOX0NIVU5LX0hEUiAobW5nX2Fzc2lnbl9nYW1hKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9BU1NJR05fR0FNQSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmICgoKG1uZ19jaHVua19oZWFkZXJwKXBDaHVua2Zyb20pLT5pQ2h1bmtuYW1lICE9IE1OR19VSU5UX2dBTUEpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1dST05HQ0hVTkspOyAvKiBvdWNoICovCisKKyAgKChtbmdfZ2FtYXApcENodW5rdG8pLT5iRW1wdHkgPSAoKG1uZ19nYW1hcClwQ2h1bmtmcm9tKS0+YkVtcHR5OworICAoKG1uZ19nYW1hcClwQ2h1bmt0byktPmlHYW1tYSA9ICgobW5nX2dhbWFwKXBDaHVua2Zyb20pLT5pR2FtbWE7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQVNTSUdOX0dBTUEsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktBU1NJR04KKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19jSFJNCitBU1NJR05fQ0hVTktfSERSIChtbmdfYXNzaWduX2Nocm0pCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0FTU0lHTl9DSFJNLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKCgobW5nX2NodW5rX2hlYWRlcnApcENodW5rZnJvbSktPmlDaHVua25hbWUgIT0gTU5HX1VJTlRfY0hSTSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfV1JPTkdDSFVOSyk7IC8qIG91Y2ggKi8KKworICAoKG1uZ19jaHJtcClwQ2h1bmt0byktPmJFbXB0eSAgICAgICA9ICgobW5nX2Nocm1wKXBDaHVua2Zyb20pLT5iRW1wdHk7CisgICgobW5nX2Nocm1wKXBDaHVua3RvKS0+aVdoaXRlcG9pbnR4ID0gKChtbmdfY2hybXApcENodW5rZnJvbSktPmlXaGl0ZXBvaW50eDsKKyAgKChtbmdfY2hybXApcENodW5rdG8pLT5pV2hpdGVwb2ludHkgPSAoKG1uZ19jaHJtcClwQ2h1bmtmcm9tKS0+aVdoaXRlcG9pbnR5OworICAoKG1uZ19jaHJtcClwQ2h1bmt0byktPmlSZWR4ICAgICAgICA9ICgobW5nX2Nocm1wKXBDaHVua2Zyb20pLT5pUmVkeDsKKyAgKChtbmdfY2hybXApcENodW5rdG8pLT5pUmVkeSAgICAgICAgPSAoKG1uZ19jaHJtcClwQ2h1bmtmcm9tKS0+aVJlZHk7CisgICgobW5nX2Nocm1wKXBDaHVua3RvKS0+aUdyZWVueCAgICAgID0gKChtbmdfY2hybXApcENodW5rZnJvbSktPmlHcmVlbng7CisgICgobW5nX2Nocm1wKXBDaHVua3RvKS0+aUdyZWVueSAgICAgID0gKChtbmdfY2hybXApcENodW5rZnJvbSktPmlHcmVlbnk7CisgICgobW5nX2Nocm1wKXBDaHVua3RvKS0+aUJsdWV4ICAgICAgID0gKChtbmdfY2hybXApcENodW5rZnJvbSktPmlCbHVleDsKKyAgKChtbmdfY2hybXApcENodW5rdG8pLT5pQmx1ZXkgICAgICAgPSAoKG1uZ19jaHJtcClwQ2h1bmtmcm9tKS0+aUJsdWV5OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0FTU0lHTl9DSFJNLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LQVNTSUdOCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfc1JHQgorQVNTSUdOX0NIVU5LX0hEUiAobW5nX2Fzc2lnbl9zcmdiKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9BU1NJR05fU1JHQiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmICgoKG1uZ19jaHVua19oZWFkZXJwKXBDaHVua2Zyb20pLT5pQ2h1bmtuYW1lICE9IE1OR19VSU5UX3NSR0IpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1dST05HQ0hVTkspOyAvKiBvdWNoICovCisKKyAgKChtbmdfc3JnYnApcENodW5rdG8pLT5pUmVuZGVyaW5naW50ZW50ID0gKChtbmdfc3JnYnApcENodW5rZnJvbSktPmlSZW5kZXJpbmdpbnRlbnQ7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQVNTSUdOX1NSR0IsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX2lDQ1AKK0FTU0lHTl9DSFVOS19IRFIgKG1uZ19hc3NpZ25faWNjcCkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQVNTSUdOX0lDQ1AsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAoKChtbmdfY2h1bmtfaGVhZGVycClwQ2h1bmtmcm9tKS0+aUNodW5rbmFtZSAhPSBNTkdfVUlOVF9pQ0NQKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19XUk9OR0NIVU5LKTsgLyogb3VjaCAqLworCisgICgobW5nX2ljY3BwKXBDaHVua3RvKS0+YkVtcHR5ICAgICAgID0gKChtbmdfaWNjcHApcENodW5rZnJvbSktPmJFbXB0eTsKKyAgKChtbmdfaWNjcHApcENodW5rdG8pLT5pTmFtZXNpemUgICAgPSAoKG1uZ19pY2NwcClwQ2h1bmtmcm9tKS0+aU5hbWVzaXplOworICAoKG1uZ19pY2NwcClwQ2h1bmt0byktPmlDb21wcmVzc2lvbiA9ICgobW5nX2ljY3BwKXBDaHVua2Zyb20pLT5pQ29tcHJlc3Npb247CisgICgobW5nX2ljY3BwKXBDaHVua3RvKS0+aVByb2ZpbGVzaXplID0gKChtbmdfaWNjcHApcENodW5rZnJvbSktPmlQcm9maWxlc2l6ZTsKKworICBpZiAoKChtbmdfaWNjcHApcENodW5rdG8pLT5pTmFtZXNpemUpCisgIHsKKyAgICBNTkdfQUxMT0MgKHBEYXRhLCAoKG1uZ19pY2NwcClwQ2h1bmt0byktPnpOYW1lLCAoKG1uZ19pY2NwcClwQ2h1bmt0byktPmlOYW1lc2l6ZSk7CisgICAgTU5HX0NPUFkgICgoKG1uZ19pY2NwcClwQ2h1bmt0byktPnpOYW1lLCAoKG1uZ19pY2NwcClwQ2h1bmtmcm9tKS0+ek5hbWUsCisgICAgICAgICAgICAgICAoKG1uZ19pY2NwcClwQ2h1bmt0byktPmlOYW1lc2l6ZSk7CisgIH0KKworICBpZiAoKChtbmdfaWNjcHApcENodW5rdG8pLT5pUHJvZmlsZXNpemUpCisgIHsKKyAgICBNTkdfQUxMT0MgKHBEYXRhLCAoKG1uZ19pY2NwcClwQ2h1bmt0byktPnBQcm9maWxlLCAoKG1uZ19pY2NwcClwQ2h1bmt0byktPmlQcm9maWxlc2l6ZSk7CisgICAgTU5HX0NPUFkgICgoKG1uZ19pY2NwcClwQ2h1bmt0byktPnBQcm9maWxlLCAoKG1uZ19pY2NwcClwQ2h1bmtmcm9tKS0+cFByb2ZpbGUsCisgICAgICAgICAgICAgICAoKG1uZ19pY2NwcClwQ2h1bmt0byktPmlQcm9maWxlc2l6ZSk7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9BU1NJR05fSUNDUCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX3RFWHQKK0FTU0lHTl9DSFVOS19IRFIgKG1uZ19hc3NpZ25fdGV4dCkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQVNTSUdOX1RFWFQsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAoKChtbmdfY2h1bmtfaGVhZGVycClwQ2h1bmtmcm9tKS0+aUNodW5rbmFtZSAhPSBNTkdfVUlOVF90RVh0KQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19XUk9OR0NIVU5LKTsgLyogb3VjaCAqLworCisgICgobW5nX3RleHRwKXBDaHVua3RvKS0+aUtleXdvcmRzaXplID0gKChtbmdfdGV4dHApcENodW5rZnJvbSktPmlLZXl3b3Jkc2l6ZTsKKyAgKChtbmdfdGV4dHApcENodW5rdG8pLT5pVGV4dHNpemUgICAgPSAoKG1uZ190ZXh0cClwQ2h1bmtmcm9tKS0+aVRleHRzaXplOworCisgIGlmICgoKG1uZ190ZXh0cClwQ2h1bmt0byktPmlLZXl3b3Jkc2l6ZSkKKyAgeworICAgIE1OR19BTExPQyAocERhdGEsICgobW5nX2l0eHRwKXBDaHVua3RvKS0+ektleXdvcmQsICgobW5nX3RleHRwKXBDaHVua3RvKS0+aUtleXdvcmRzaXplKTsKKyAgICBNTkdfQ09QWSAgKCgobW5nX2l0eHRwKXBDaHVua3RvKS0+ektleXdvcmQsICgobW5nX3RleHRwKXBDaHVua2Zyb20pLT56S2V5d29yZCwKKyAgICAgICAgICAgICAgICgobW5nX2l0eHRwKXBDaHVua3RvKS0+aUtleXdvcmRzaXplKTsKKyAgfQorCisgIGlmICgoKG1uZ190ZXh0cClwQ2h1bmt0byktPmlUZXh0c2l6ZSkKKyAgeworICAgIE1OR19BTExPQyAocERhdGEsICgobW5nX3RleHRwKXBDaHVua3RvKS0+elRleHQsICgobW5nX3RleHRwKXBDaHVua3RvKS0+aVRleHRzaXplKTsKKyAgICBNTkdfQ09QWSAgKCgobW5nX3RleHRwKXBDaHVua3RvKS0+elRleHQsICgobW5nX3RleHRwKXBDaHVua2Zyb20pLT56VGV4dCwKKyAgICAgICAgICAgICAgICgobW5nX3RleHRwKXBDaHVua3RvKS0+aVRleHRzaXplKTsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0FTU0lHTl9URVhULCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfelRYdAorQVNTSUdOX0NIVU5LX0hEUiAobW5nX2Fzc2lnbl96dHh0KQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9BU1NJR05fWlRYVCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmICgoKG1uZ19jaHVua19oZWFkZXJwKXBDaHVua2Zyb20pLT5pQ2h1bmtuYW1lICE9IE1OR19VSU5UX3pUWHQpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1dST05HQ0hVTkspOyAvKiBvdWNoICovCisKKyAgKChtbmdfenR4dHApcENodW5rdG8pLT5pS2V5d29yZHNpemUgPSAoKG1uZ196dHh0cClwQ2h1bmtmcm9tKS0+aUtleXdvcmRzaXplOworICAoKG1uZ196dHh0cClwQ2h1bmt0byktPmlDb21wcmVzc2lvbiA9ICgobW5nX3p0eHRwKXBDaHVua2Zyb20pLT5pQ29tcHJlc3Npb247CisgICgobW5nX3p0eHRwKXBDaHVua3RvKS0+aVRleHRzaXplICAgID0gKChtbmdfenR4dHApcENodW5rZnJvbSktPmlUZXh0c2l6ZTsKKworICBpZiAoKChtbmdfenR4dHApcENodW5rdG8pLT5pS2V5d29yZHNpemUpCisgIHsKKyAgICBNTkdfQUxMT0MgKHBEYXRhLCAoKG1uZ196dHh0cClwQ2h1bmt0byktPnpLZXl3b3JkLCAoKG1uZ196dHh0cClwQ2h1bmt0byktPmlLZXl3b3Jkc2l6ZSk7CisgICAgTU5HX0NPUFkgICgoKG1uZ196dHh0cClwQ2h1bmt0byktPnpLZXl3b3JkLCAoKG1uZ196dHh0cClwQ2h1bmtmcm9tKS0+ektleXdvcmQsCisgICAgICAgICAgICAgICAoKG1uZ196dHh0cClwQ2h1bmt0byktPmlLZXl3b3Jkc2l6ZSk7CisgIH0KKworICBpZiAoKChtbmdfenR4dHApcENodW5rdG8pLT5pVGV4dHNpemUpCisgIHsKKyAgICBNTkdfQUxMT0MgKHBEYXRhLCAoKG1uZ196dHh0cClwQ2h1bmt0byktPnpUZXh0LCAoKG1uZ196dHh0cClwQ2h1bmt0byktPmlUZXh0c2l6ZSk7CisgICAgTU5HX0NPUFkgICgoKG1uZ196dHh0cClwQ2h1bmt0byktPnpUZXh0LCAoKG1uZ196dHh0cClwQ2h1bmtmcm9tKS0+elRleHQsCisgICAgICAgICAgICAgICAoKG1uZ196dHh0cClwQ2h1bmt0byktPmlUZXh0c2l6ZSk7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9BU1NJR05fWlRYVCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX2lUWHQKK0FTU0lHTl9DSFVOS19IRFIgKG1uZ19hc3NpZ25faXR4dCkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQVNTSUdOX0lUWFQsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAoKChtbmdfY2h1bmtfaGVhZGVycClwQ2h1bmtmcm9tKS0+aUNodW5rbmFtZSAhPSBNTkdfVUlOVF9pVFh0KQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19XUk9OR0NIVU5LKTsgLyogb3VjaCAqLworCisgICgobW5nX2l0eHRwKXBDaHVua3RvKS0+aUtleXdvcmRzaXplICAgICAgID0gKChtbmdfaXR4dHApcENodW5rZnJvbSktPmlLZXl3b3Jkc2l6ZTsKKyAgKChtbmdfaXR4dHApcENodW5rdG8pLT5pQ29tcHJlc3Npb25mbGFnICAgPSAoKG1uZ19pdHh0cClwQ2h1bmtmcm9tKS0+aUNvbXByZXNzaW9uZmxhZzsKKyAgKChtbmdfaXR4dHApcENodW5rdG8pLT5pQ29tcHJlc3Npb25tZXRob2QgPSAoKG1uZ19pdHh0cClwQ2h1bmtmcm9tKS0+aUNvbXByZXNzaW9ubWV0aG9kOworICAoKG1uZ19pdHh0cClwQ2h1bmt0byktPmlMYW5ndWFnZXNpemUgICAgICA9ICgobW5nX2l0eHRwKXBDaHVua2Zyb20pLT5pTGFuZ3VhZ2VzaXplOworICAoKG1uZ19pdHh0cClwQ2h1bmt0byktPmlUcmFuc2xhdGlvbnNpemUgICA9ICgobW5nX2l0eHRwKXBDaHVua2Zyb20pLT5pVHJhbnNsYXRpb25zaXplOworICAoKG1uZ19pdHh0cClwQ2h1bmt0byktPmlUZXh0c2l6ZSAgICAgICAgICA9ICgobW5nX2l0eHRwKXBDaHVua2Zyb20pLT5pVGV4dHNpemU7CisKKyAgaWYgKCgobW5nX2l0eHRwKXBDaHVua3RvKS0+aUtleXdvcmRzaXplKQorICB7CisgICAgTU5HX0FMTE9DIChwRGF0YSwgKChtbmdfaXR4dHApcENodW5rdG8pLT56S2V5d29yZCwgKChtbmdfaXR4dHApcENodW5rdG8pLT5pS2V5d29yZHNpemUpOworICAgIE1OR19DT1BZICAoKChtbmdfaXR4dHApcENodW5rdG8pLT56S2V5d29yZCwgKChtbmdfaXR4dHApcENodW5rZnJvbSktPnpLZXl3b3JkLAorICAgICAgICAgICAgICAgKChtbmdfaXR4dHApcENodW5rdG8pLT5pS2V5d29yZHNpemUpOworICB9CisKKyAgaWYgKCgobW5nX2l0eHRwKXBDaHVua3RvKS0+aVRleHRzaXplKQorICB7CisgICAgTU5HX0FMTE9DIChwRGF0YSwgKChtbmdfaXR4dHApcENodW5rdG8pLT56TGFuZ3VhZ2UsICgobW5nX2l0eHRwKXBDaHVua3RvKS0+aUxhbmd1YWdlc2l6ZSk7CisgICAgTU5HX0NPUFkgICgoKG1uZ19pdHh0cClwQ2h1bmt0byktPnpMYW5ndWFnZSwgKChtbmdfaXR4dHApcENodW5rZnJvbSktPnpMYW5ndWFnZSwKKyAgICAgICAgICAgICAgICgobW5nX2l0eHRwKXBDaHVua3RvKS0+aUxhbmd1YWdlc2l6ZSk7CisgIH0KKworICBpZiAoKChtbmdfaXR4dHApcENodW5rdG8pLT5pVGV4dHNpemUpCisgIHsKKyAgICBNTkdfQUxMT0MgKHBEYXRhLCAoKG1uZ19pdHh0cClwQ2h1bmt0byktPnpUcmFuc2xhdGlvbiwgKChtbmdfaXR4dHApcENodW5rdG8pLT5pVHJhbnNsYXRpb25zaXplKTsKKyAgICBNTkdfQ09QWSAgKCgobW5nX2l0eHRwKXBDaHVua3RvKS0+elRyYW5zbGF0aW9uLCAoKG1uZ19pdHh0cClwQ2h1bmtmcm9tKS0+elRyYW5zbGF0aW9uLAorICAgICAgICAgICAgICAgKChtbmdfaXR4dHApcENodW5rdG8pLT5pVHJhbnNsYXRpb25zaXplKTsKKyAgfQorCisgIGlmICgoKG1uZ19pdHh0cClwQ2h1bmt0byktPmlUZXh0c2l6ZSkKKyAgeworICAgIE1OR19BTExPQyAocERhdGEsICgobW5nX2l0eHRwKXBDaHVua3RvKS0+elRleHQsICgobW5nX2l0eHRwKXBDaHVua3RvKS0+aVRleHRzaXplKTsKKyAgICBNTkdfQ09QWSAgKCgobW5nX2l0eHRwKXBDaHVua3RvKS0+elRleHQsICgobW5nX2l0eHRwKXBDaHVua2Zyb20pLT56VGV4dCwKKyAgICAgICAgICAgICAgICgobW5nX2l0eHRwKXBDaHVua3RvKS0+aVRleHRzaXplKTsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0FTU0lHTl9JVFhULCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS0FTU0lHTgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX2JLR0QKK0FTU0lHTl9DSFVOS19IRFIgKG1uZ19hc3NpZ25fYmtnZCkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQVNTSUdOX0JLR0QsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAoKChtbmdfY2h1bmtfaGVhZGVycClwQ2h1bmtmcm9tKS0+aUNodW5rbmFtZSAhPSBNTkdfVUlOVF9iS0dEKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19XUk9OR0NIVU5LKTsgLyogb3VjaCAqLworCisgICgobW5nX2JrZ2RwKXBDaHVua3RvKS0+YkVtcHR5ID0gKChtbmdfYmtnZHApcENodW5rZnJvbSktPmJFbXB0eTsKKyAgKChtbmdfYmtnZHApcENodW5rdG8pLT5pVHlwZSAgPSAoKG1uZ19ia2dkcClwQ2h1bmtmcm9tKS0+aVR5cGU7CisgICgobW5nX2JrZ2RwKXBDaHVua3RvKS0+aUluZGV4ID0gKChtbmdfYmtnZHApcENodW5rZnJvbSktPmlJbmRleDsKKyAgKChtbmdfYmtnZHApcENodW5rdG8pLT5pR3JheSAgPSAoKG1uZ19ia2dkcClwQ2h1bmtmcm9tKS0+aUdyYXk7CisgICgobW5nX2JrZ2RwKXBDaHVua3RvKS0+aVJlZCAgID0gKChtbmdfYmtnZHApcENodW5rZnJvbSktPmlSZWQ7CisgICgobW5nX2JrZ2RwKXBDaHVua3RvKS0+aUdyZWVuID0gKChtbmdfYmtnZHApcENodW5rZnJvbSktPmlHcmVlbjsKKyAgKChtbmdfYmtnZHApcENodW5rdG8pLT5pQmx1ZSAgPSAoKG1uZ19ia2dkcClwQ2h1bmtmcm9tKS0+aUJsdWU7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQVNTSUdOX0JLR0QsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktBU1NJR04KKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19wSFlzCitBU1NJR05fQ0hVTktfSERSIChtbmdfYXNzaWduX3BoeXMpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0FTU0lHTl9QSFlTLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKCgobW5nX2NodW5rX2hlYWRlcnApcENodW5rZnJvbSktPmlDaHVua25hbWUgIT0gTU5HX1VJTlRfcEhZcykKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfV1JPTkdDSFVOSyk7IC8qIG91Y2ggKi8KKworICAoKG1uZ19waHlzcClwQ2h1bmt0byktPmJFbXB0eSA9ICgobW5nX3BoeXNwKXBDaHVua2Zyb20pLT5iRW1wdHk7CisgICgobW5nX3BoeXNwKXBDaHVua3RvKS0+aVNpemV4ID0gKChtbmdfcGh5c3ApcENodW5rZnJvbSktPmlTaXpleDsKKyAgKChtbmdfcGh5c3ApcENodW5rdG8pLT5pU2l6ZXkgPSAoKG1uZ19waHlzcClwQ2h1bmtmcm9tKS0+aVNpemV5OworICAoKG1uZ19waHlzcClwQ2h1bmt0byktPmlVbml0ICA9ICgobW5nX3BoeXNwKXBDaHVua2Zyb20pLT5pVW5pdDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9BU1NJR05fUEhZUywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS0FTU0lHTgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX3NCSVQKK0FTU0lHTl9DSFVOS19IRFIgKG1uZ19hc3NpZ25fc2JpdCkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQVNTSUdOX1NCSVQsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAoKChtbmdfY2h1bmtfaGVhZGVycClwQ2h1bmtmcm9tKS0+aUNodW5rbmFtZSAhPSBNTkdfVUlOVF9zQklUKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19XUk9OR0NIVU5LKTsgLyogb3VjaCAqLworCisgICgobW5nX3NiaXRwKXBDaHVua3RvKS0+YkVtcHR5ICAgID0gKChtbmdfc2JpdHApcENodW5rZnJvbSktPmJFbXB0eTsKKyAgKChtbmdfc2JpdHApcENodW5rdG8pLT5pVHlwZSAgICAgPSAoKG1uZ19zYml0cClwQ2h1bmtmcm9tKS0+aVR5cGU7CisgICgobW5nX3NiaXRwKXBDaHVua3RvKS0+YUJpdHMgWzBdID0gKChtbmdfc2JpdHApcENodW5rZnJvbSktPmFCaXRzIFswXTsKKyAgKChtbmdfc2JpdHApcENodW5rdG8pLT5hQml0cyBbMV0gPSAoKG1uZ19zYml0cClwQ2h1bmtmcm9tKS0+YUJpdHMgWzFdOworICAoKG1uZ19zYml0cClwQ2h1bmt0byktPmFCaXRzIFsyXSA9ICgobW5nX3NiaXRwKXBDaHVua2Zyb20pLT5hQml0cyBbMl07CisgICgobW5nX3NiaXRwKXBDaHVua3RvKS0+YUJpdHMgWzNdID0gKChtbmdfc2JpdHApcENodW5rZnJvbSktPmFCaXRzIFszXTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9BU1NJR05fU0JJVCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfc1BMVAorQVNTSUdOX0NIVU5LX0hEUiAobW5nX2Fzc2lnbl9zcGx0KQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9BU1NJR05fU1BMVCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmICgoKG1uZ19jaHVua19oZWFkZXJwKXBDaHVua2Zyb20pLT5pQ2h1bmtuYW1lICE9IE1OR19VSU5UX3NQTFQpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1dST05HQ0hVTkspOyAvKiBvdWNoICovCisKKyAgKChtbmdfc3BsdHApcENodW5rdG8pLT5iRW1wdHkgICAgICAgPSAoKG1uZ19zcGx0cClwQ2h1bmtmcm9tKS0+YkVtcHR5OworICAoKG1uZ19zcGx0cClwQ2h1bmt0byktPmlOYW1lc2l6ZSAgICA9ICgobW5nX3NwbHRwKXBDaHVua2Zyb20pLT5pTmFtZXNpemU7CisgICgobW5nX3NwbHRwKXBDaHVua3RvKS0+aVNhbXBsZWRlcHRoID0gKChtbmdfc3BsdHApcENodW5rZnJvbSktPmlTYW1wbGVkZXB0aDsKKyAgKChtbmdfc3BsdHApcENodW5rdG8pLT5pRW50cnljb3VudCAgPSAoKG1uZ19zcGx0cClwQ2h1bmtmcm9tKS0+aUVudHJ5Y291bnQ7CisgICgobW5nX3NwbHRwKXBDaHVua3RvKS0+cEVudHJpZXMgICAgID0gKChtbmdfc3BsdHApcENodW5rZnJvbSktPnBFbnRyaWVzOworCisgIGlmICgoKG1uZ19zcGx0cClwQ2h1bmt0byktPmlOYW1lc2l6ZSkKKyAgeworICAgIE1OR19BTExPQyAocERhdGEsICgobW5nX3NwbHRwKXBDaHVua3RvKS0+ek5hbWUsICgobW5nX3NwbHRwKXBDaHVua3RvKS0+aU5hbWVzaXplKTsKKyAgICBNTkdfQ09QWSAgKCgobW5nX3NwbHRwKXBDaHVua3RvKS0+ek5hbWUsICgobW5nX3NwbHRwKXBDaHVua2Zyb20pLT56TmFtZSwKKyAgICAgICAgICAgICAgICgobW5nX3NwbHRwKXBDaHVua3RvKS0+aU5hbWVzaXplKTsKKyAgfQorCisgIGlmICgoKG1uZ19zcGx0cClwQ2h1bmt0byktPmlFbnRyeWNvdW50KQorICB7CisgICAgbW5nX3VpbnQzMiBpTGVuID0gKChtbmdfc3BsdHApcENodW5rdG8pLT5pRW50cnljb3VudCAqCisgICAgICAgICAgICAgICAgICAgICAgKCgobW5nX3NwbHRwKXBDaHVua3RvKS0+aVNhbXBsZWRlcHRoICogMyArIHNpemVvZiAobW5nX3VpbnQxNikpOworCisgICAgTU5HX0FMTE9DIChwRGF0YSwgKChtbmdfc3BsdHApcENodW5rdG8pLT5wRW50cmllcywgaUxlbik7CisgICAgTU5HX0NPUFkgICgoKG1uZ19zcGx0cClwQ2h1bmt0byktPnBFbnRyaWVzLCAoKG1uZ19zcGx0cClwQ2h1bmtmcm9tKS0+cEVudHJpZXMsIGlMZW4pOworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQVNTSUdOX1NQTFQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LQVNTSUdOCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfaElTVAorQVNTSUdOX0NIVU5LX0hEUiAobW5nX2Fzc2lnbl9oaXN0KQoreworICBtbmdfdWludDMyIGlYOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0FTU0lHTl9ISVNULCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKCgobW5nX2NodW5rX2hlYWRlcnApcENodW5rZnJvbSktPmlDaHVua25hbWUgIT0gTU5HX1VJTlRfaElTVCkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfV1JPTkdDSFVOSyk7IC8qIG91Y2ggKi8KKworICAoKG1uZ19oaXN0cClwQ2h1bmt0byktPmlFbnRyeWNvdW50ID0gKChtbmdfaGlzdHApcENodW5rZnJvbSktPmlFbnRyeWNvdW50OworCisgIGZvciAoaVggPSAwOyBpWCA8ICgobW5nX2hpc3RwKXBDaHVua3RvKS0+aUVudHJ5Y291bnQ7IGlYKyspCisgICAgKChtbmdfaGlzdHApcENodW5rdG8pLT5hRW50cmllcyBbaVhdID0gKChtbmdfaGlzdHApcENodW5rZnJvbSktPmFFbnRyaWVzIFtpWF07CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQVNTSUdOX0hJU1QsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktBU1NJR04KKyNpZm5kZWYgTU5HX1NLSVBDSFVOS190SU1FCitBU1NJR05fQ0hVTktfSERSIChtbmdfYXNzaWduX3RpbWUpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0FTU0lHTl9USU1FLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKCgobW5nX2NodW5rX2hlYWRlcnApcENodW5rZnJvbSktPmlDaHVua25hbWUgIT0gTU5HX1VJTlRfdElNRSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfV1JPTkdDSFVOSyk7IC8qIG91Y2ggKi8KKworICAoKG1uZ190aW1lcClwQ2h1bmt0byktPmlZZWFyICAgPSAoKG1uZ190aW1lcClwQ2h1bmtmcm9tKS0+aVllYXI7CisgICgobW5nX3RpbWVwKXBDaHVua3RvKS0+aU1vbnRoICA9ICgobW5nX3RpbWVwKXBDaHVua2Zyb20pLT5pTW9udGg7CisgICgobW5nX3RpbWVwKXBDaHVua3RvKS0+aURheSAgICA9ICgobW5nX3RpbWVwKXBDaHVua2Zyb20pLT5pRGF5OworICAoKG1uZ190aW1lcClwQ2h1bmt0byktPmlIb3VyICAgPSAoKG1uZ190aW1lcClwQ2h1bmtmcm9tKS0+aUhvdXI7CisgICgobW5nX3RpbWVwKXBDaHVua3RvKS0+aU1pbnV0ZSA9ICgobW5nX3RpbWVwKXBDaHVua2Zyb20pLT5pTWludXRlOworICAoKG1uZ190aW1lcClwQ2h1bmt0byktPmlTZWNvbmQgPSAoKG1uZ190aW1lcClwQ2h1bmtmcm9tKS0+aVNlY29uZDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9BU1NJR05fVElNRSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS0FTU0lHTgorQVNTSUdOX0NIVU5LX0hEUiAobW5nX2Fzc2lnbl9taGRyKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9BU1NJR05fTUhEUiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmICgoKG1uZ19jaHVua19oZWFkZXJwKXBDaHVua2Zyb20pLT5pQ2h1bmtuYW1lICE9IE1OR19VSU5UX01IRFIpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1dST05HQ0hVTkspOyAvKiBvdWNoICovCisKKyAgKChtbmdfbWhkcnApcENodW5rdG8pLT5pV2lkdGggICAgICA9ICgobW5nX21oZHJwKXBDaHVua2Zyb20pLT5pV2lkdGg7CisgICgobW5nX21oZHJwKXBDaHVua3RvKS0+aUhlaWdodCAgICAgPSAoKG1uZ19taGRycClwQ2h1bmtmcm9tKS0+aUhlaWdodDsKKyAgKChtbmdfbWhkcnApcENodW5rdG8pLT5pVGlja3MgICAgICA9ICgobW5nX21oZHJwKXBDaHVua2Zyb20pLT5pVGlja3M7CisgICgobW5nX21oZHJwKXBDaHVua3RvKS0+aUxheWVyY291bnQgPSAoKG1uZ19taGRycClwQ2h1bmtmcm9tKS0+aUxheWVyY291bnQ7CisgICgobW5nX21oZHJwKXBDaHVua3RvKS0+aUZyYW1lY291bnQgPSAoKG1uZ19taGRycClwQ2h1bmtmcm9tKS0+aUZyYW1lY291bnQ7CisgICgobW5nX21oZHJwKXBDaHVua3RvKS0+aVBsYXl0aW1lICAgPSAoKG1uZ19taGRycClwQ2h1bmtmcm9tKS0+aVBsYXl0aW1lOworICAoKG1uZ19taGRycClwQ2h1bmt0byktPmlTaW1wbGljaXR5ID0gKChtbmdfbWhkcnApcENodW5rZnJvbSktPmlTaW1wbGljaXR5OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0FTU0lHTl9NSERSLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS0FTU0lHTgorQVNTSUdOX0NIVU5LX0hEUiAobW5nX2Fzc2lnbl9tZW5kKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9BU1NJR05fTUVORCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmICgoKG1uZ19jaHVua19oZWFkZXJwKXBDaHVua2Zyb20pLT5pQ2h1bmtuYW1lICE9IE1OR19VSU5UX01FTkQpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1dST05HQ0hVTkspOyAvKiBvdWNoICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQVNTSUdOX01FTkQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19MT09QCitBU1NJR05fQ0hVTktfSERSIChtbmdfYXNzaWduX2xvb3ApCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0FTU0lHTl9MT09QLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKCgobW5nX2NodW5rX2hlYWRlcnApcENodW5rZnJvbSktPmlDaHVua25hbWUgIT0gTU5HX1VJTlRfTE9PUCkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfV1JPTkdDSFVOSyk7IC8qIG91Y2ggKi8KKworICAoKG1uZ19sb29wcClwQ2h1bmt0byktPmlMZXZlbCAgICAgICA9ICgobW5nX2xvb3BwKXBDaHVua2Zyb20pLT5pTGV2ZWw7CisgICgobW5nX2xvb3BwKXBDaHVua3RvKS0+aVJlcGVhdCAgICAgID0gKChtbmdfbG9vcHApcENodW5rZnJvbSktPmlSZXBlYXQ7CisgICgobW5nX2xvb3BwKXBDaHVua3RvKS0+aVRlcm1pbmF0aW9uID0gKChtbmdfbG9vcHApcENodW5rZnJvbSktPmlUZXJtaW5hdGlvbjsKKyAgKChtbmdfbG9vcHApcENodW5rdG8pLT5pSXRlcm1pbiAgICAgPSAoKG1uZ19sb29wcClwQ2h1bmtmcm9tKS0+aUl0ZXJtaW47CisgICgobW5nX2xvb3BwKXBDaHVua3RvKS0+aUl0ZXJtYXggICAgID0gKChtbmdfbG9vcHApcENodW5rZnJvbSktPmlJdGVybWF4OworICAoKG1uZ19sb29wcClwQ2h1bmt0byktPmlDb3VudCAgICAgICA9ICgobW5nX2xvb3BwKXBDaHVua2Zyb20pLT5pQ291bnQ7CisKKyNpZm5kZWYgTU5HX05PX0xPT1BfU0lHTkFMU19TVVBQT1JURUQKKyAgaWYgKCgobW5nX2xvb3BwKXBDaHVua3RvKS0+aUNvdW50KQorICB7CisgICAgbW5nX3VpbnQzMiBpTGVuID0gKChtbmdfbG9vcHApcENodW5rdG8pLT5pQ291bnQgKiBzaXplb2YgKG1uZ191aW50MzIpOworICAgIE1OR19BTExPQyAocERhdGEsICgobW5nX2xvb3BwKXBDaHVua3RvKS0+cFNpZ25hbHMsIGlMZW4pOworICAgIE1OR19DT1BZICAoKChtbmdfbG9vcHApcENodW5rdG8pLT5wU2lnbmFscywgKChtbmdfbG9vcHApcENodW5rZnJvbSktPnBTaWduYWxzLCBpTGVuKTsKKyAgfQorI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQVNTSUdOX0xPT1AsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS0FTU0lHTgorQVNTSUdOX0NIVU5LX0hEUiAobW5nX2Fzc2lnbl9lbmRsKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9BU1NJR05fRU5ETCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmICgoKG1uZ19jaHVua19oZWFkZXJwKXBDaHVua2Zyb20pLT5pQ2h1bmtuYW1lICE9IE1OR19VSU5UX0VOREwpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1dST05HQ0hVTkspOyAvKiBvdWNoICovCisKKyAgKChtbmdfZW5kbHApcENodW5rdG8pLT5pTGV2ZWwgPSAoKG1uZ19lbmRscClwQ2h1bmtmcm9tKS0+aUxldmVsOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0FTU0lHTl9FTkRMLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LQVNTSUdOCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfREVGSQorQVNTSUdOX0NIVU5LX0hEUiAobW5nX2Fzc2lnbl9kZWZpKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9BU1NJR05fREVGSSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmICgoKG1uZ19jaHVua19oZWFkZXJwKXBDaHVua2Zyb20pLT5pQ2h1bmtuYW1lICE9IE1OR19VSU5UX0RFRkkpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1dST05HQ0hVTkspOyAvKiBvdWNoICovCisKKyAgKChtbmdfZGVmaXApcENodW5rdG8pLT5pT2JqZWN0aWQgICAgID0gKChtbmdfZGVmaXApcENodW5rZnJvbSktPmlPYmplY3RpZDsKKyAgKChtbmdfZGVmaXApcENodW5rdG8pLT5iSGFzZG9ub3RzaG93ID0gKChtbmdfZGVmaXApcENodW5rZnJvbSktPmJIYXNkb25vdHNob3c7CisgICgobW5nX2RlZmlwKXBDaHVua3RvKS0+aURvbm90c2hvdyAgICA9ICgobW5nX2RlZmlwKXBDaHVua2Zyb20pLT5pRG9ub3RzaG93OworICAoKG1uZ19kZWZpcClwQ2h1bmt0byktPmJIYXNjb25jcmV0ZSAgPSAoKG1uZ19kZWZpcClwQ2h1bmtmcm9tKS0+Ykhhc2NvbmNyZXRlOworICAoKG1uZ19kZWZpcClwQ2h1bmt0byktPmlDb25jcmV0ZSAgICAgPSAoKG1uZ19kZWZpcClwQ2h1bmtmcm9tKS0+aUNvbmNyZXRlOworICAoKG1uZ19kZWZpcClwQ2h1bmt0byktPmJIYXNsb2NhICAgICAgPSAoKG1uZ19kZWZpcClwQ2h1bmtmcm9tKS0+Ykhhc2xvY2E7CisgICgobW5nX2RlZmlwKXBDaHVua3RvKS0+aVhsb2NhdGlvbiAgICA9ICgobW5nX2RlZmlwKXBDaHVua2Zyb20pLT5pWGxvY2F0aW9uOworICAoKG1uZ19kZWZpcClwQ2h1bmt0byktPmlZbG9jYXRpb24gICAgPSAoKG1uZ19kZWZpcClwQ2h1bmtmcm9tKS0+aVlsb2NhdGlvbjsKKyAgKChtbmdfZGVmaXApcENodW5rdG8pLT5iSGFzY2xpcCAgICAgID0gKChtbmdfZGVmaXApcENodW5rZnJvbSktPmJIYXNjbGlwOworICAoKG1uZ19kZWZpcClwQ2h1bmt0byktPmlMZWZ0Y2IgICAgICAgPSAoKG1uZ19kZWZpcClwQ2h1bmtmcm9tKS0+aUxlZnRjYjsKKyAgKChtbmdfZGVmaXApcENodW5rdG8pLT5pUmlnaHRjYiAgICAgID0gKChtbmdfZGVmaXApcENodW5rZnJvbSktPmlSaWdodGNiOworICAoKG1uZ19kZWZpcClwQ2h1bmt0byktPmlUb3BjYiAgICAgICAgPSAoKG1uZ19kZWZpcClwQ2h1bmtmcm9tKS0+aVRvcGNiOworICAoKG1uZ19kZWZpcClwQ2h1bmt0byktPmlCb3R0b21jYiAgICAgPSAoKG1uZ19kZWZpcClwQ2h1bmtmcm9tKS0+aUJvdHRvbWNiOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0FTU0lHTl9ERUZJLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LQVNTSUdOCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfQkFTSQorQVNTSUdOX0NIVU5LX0hEUiAobW5nX2Fzc2lnbl9iYXNpKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9BU1NJR05fQkFTSSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmICgoKG1uZ19jaHVua19oZWFkZXJwKXBDaHVua2Zyb20pLT5pQ2h1bmtuYW1lICE9IE1OR19VSU5UX0JBU0kpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1dST05HQ0hVTkspOyAvKiBvdWNoICovCisKKyAgKChtbmdfYmFzaXApcENodW5rdG8pLT5pV2lkdGggICAgICAgPSAoKG1uZ19iYXNpcClwQ2h1bmtmcm9tKS0+aVdpZHRoOworICAoKG1uZ19iYXNpcClwQ2h1bmt0byktPmlIZWlnaHQgICAgICA9ICgobW5nX2Jhc2lwKXBDaHVua2Zyb20pLT5pSGVpZ2h0OworICAoKG1uZ19iYXNpcClwQ2h1bmt0byktPmlCaXRkZXB0aCAgICA9ICgobW5nX2Jhc2lwKXBDaHVua2Zyb20pLT5pQml0ZGVwdGg7CisgICgobW5nX2Jhc2lwKXBDaHVua3RvKS0+aUNvbG9ydHlwZSAgID0gKChtbmdfYmFzaXApcENodW5rZnJvbSktPmlDb2xvcnR5cGU7CisgICgobW5nX2Jhc2lwKXBDaHVua3RvKS0+aUNvbXByZXNzaW9uID0gKChtbmdfYmFzaXApcENodW5rZnJvbSktPmlDb21wcmVzc2lvbjsKKyAgKChtbmdfYmFzaXApcENodW5rdG8pLT5pRmlsdGVyICAgICAgPSAoKG1uZ19iYXNpcClwQ2h1bmtmcm9tKS0+aUZpbHRlcjsKKyAgKChtbmdfYmFzaXApcENodW5rdG8pLT5pSW50ZXJsYWNlICAgPSAoKG1uZ19iYXNpcClwQ2h1bmtmcm9tKS0+aUludGVybGFjZTsKKyAgKChtbmdfYmFzaXApcENodW5rdG8pLT5pUmVkICAgICAgICAgPSAoKG1uZ19iYXNpcClwQ2h1bmtmcm9tKS0+aVJlZDsKKyAgKChtbmdfYmFzaXApcENodW5rdG8pLT5pR3JlZW4gICAgICAgPSAoKG1uZ19iYXNpcClwQ2h1bmtmcm9tKS0+aUdyZWVuOworICAoKG1uZ19iYXNpcClwQ2h1bmt0byktPmlCbHVlICAgICAgICA9ICgobW5nX2Jhc2lwKXBDaHVua2Zyb20pLT5pQmx1ZTsKKyAgKChtbmdfYmFzaXApcENodW5rdG8pLT5pQWxwaGEgICAgICAgPSAoKG1uZ19iYXNpcClwQ2h1bmtmcm9tKS0+aUFscGhhOworICAoKG1uZ19iYXNpcClwQ2h1bmt0byktPmlWaWV3YWJsZSAgICA9ICgobW5nX2Jhc2lwKXBDaHVua2Zyb20pLT5pVmlld2FibGU7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQVNTSUdOX0JBU0ksIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktBU1NJR04KKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19DTE9OCitBU1NJR05fQ0hVTktfSERSIChtbmdfYXNzaWduX2Nsb24pCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0FTU0lHTl9DTE9OLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKCgobW5nX2NodW5rX2hlYWRlcnApcENodW5rZnJvbSktPmlDaHVua25hbWUgIT0gTU5HX1VJTlRfQ0xPTikKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfV1JPTkdDSFVOSyk7IC8qIG91Y2ggKi8KKworICAoKG1uZ19jbG9ucClwQ2h1bmt0byktPmlTb3VyY2VpZCAgICAgPSAoKG1uZ19jbG9ucClwQ2h1bmtmcm9tKS0+aVNvdXJjZWlkOworICAoKG1uZ19jbG9ucClwQ2h1bmt0byktPmlDbG9uZWlkICAgICAgPSAoKG1uZ19jbG9ucClwQ2h1bmtmcm9tKS0+aUNsb25laWQ7CisgICgobW5nX2Nsb25wKXBDaHVua3RvKS0+aUNsb25ldHlwZSAgICA9ICgobW5nX2Nsb25wKXBDaHVua2Zyb20pLT5pQ2xvbmV0eXBlOworI2lmZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorICAoKG1uZ19jbG9ucClwQ2h1bmt0byktPmJIYXNkb25vdHNob3cgPSAoKG1uZ19jbG9ucClwQ2h1bmtmcm9tKS0+Ykhhc2Rvbm90c2hvdzsKKyNlbmRpZgorICAoKG1uZ19jbG9ucClwQ2h1bmt0byktPmlEb25vdHNob3cgICAgPSAoKG1uZ19jbG9ucClwQ2h1bmtmcm9tKS0+aURvbm90c2hvdzsKKyAgKChtbmdfY2xvbnApcENodW5rdG8pLT5pQ29uY3JldGUgICAgID0gKChtbmdfY2xvbnApcENodW5rZnJvbSktPmlDb25jcmV0ZTsKKyAgKChtbmdfY2xvbnApcENodW5rdG8pLT5iSGFzbG9jYSAgICAgID0gKChtbmdfY2xvbnApcENodW5rZnJvbSktPmJIYXNsb2NhOworICAoKG1uZ19jbG9ucClwQ2h1bmt0byktPmlMb2NhdGlvbnR5cGUgPSAoKG1uZ19jbG9ucClwQ2h1bmtmcm9tKS0+aUxvY2F0aW9udHlwZTsKKyAgKChtbmdfY2xvbnApcENodW5rdG8pLT5pTG9jYXRpb254ICAgID0gKChtbmdfY2xvbnApcENodW5rZnJvbSktPmlMb2NhdGlvbng7CisgICgobW5nX2Nsb25wKXBDaHVua3RvKS0+aUxvY2F0aW9ueSAgICA9ICgobW5nX2Nsb25wKXBDaHVua2Zyb20pLT5pTG9jYXRpb255OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0FTU0lHTl9DTE9OLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorI2VuZGlmCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfUEFTVAorQVNTSUdOX0NIVU5LX0hEUiAobW5nX2Fzc2lnbl9wYXN0KQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9BU1NJR05fUEFTVCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmICgoKG1uZ19jaHVua19oZWFkZXJwKXBDaHVua2Zyb20pLT5pQ2h1bmtuYW1lICE9IE1OR19VSU5UX1BBU1QpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1dST05HQ0hVTkspOyAvKiBvdWNoICovCisKKyAgKChtbmdfcGFzdHApcENodW5rdG8pLT5pRGVzdGlkICAgICA9ICgobW5nX3Bhc3RwKXBDaHVua2Zyb20pLT5pRGVzdGlkOworICAoKG1uZ19wYXN0cClwQ2h1bmt0byktPmlUYXJnZXR0eXBlID0gKChtbmdfcGFzdHApcENodW5rZnJvbSktPmlUYXJnZXR0eXBlOworICAoKG1uZ19wYXN0cClwQ2h1bmt0byktPmlUYXJnZXR4ICAgID0gKChtbmdfcGFzdHApcENodW5rZnJvbSktPmlUYXJnZXR4OworICAoKG1uZ19wYXN0cClwQ2h1bmt0byktPmlUYXJnZXR5ICAgID0gKChtbmdfcGFzdHApcENodW5rZnJvbSktPmlUYXJnZXR5OworICAoKG1uZ19wYXN0cClwQ2h1bmt0byktPmlDb3VudCAgICAgID0gKChtbmdfcGFzdHApcENodW5rZnJvbSktPmlDb3VudDsKKworICBpZiAoKChtbmdfcGFzdHApcENodW5rdG8pLT5pQ291bnQpCisgIHsKKyAgICBtbmdfdWludDMyIGlMZW4gPSAoKG1uZ19wYXN0cClwQ2h1bmt0byktPmlDb3VudCAqIHNpemVvZiAobW5nX3Bhc3Rfc291cmNlKTsKKworICAgIE1OR19BTExPQyAocERhdGEsICgobW5nX3Bhc3RwKXBDaHVua3RvKS0+cFNvdXJjZXMsIGlMZW4pOworICAgIE1OR19DT1BZICAoKChtbmdfcGFzdHApcENodW5rdG8pLT5wU291cmNlcywgKChtbmdfcGFzdHApcENodW5rZnJvbSktPnBTb3VyY2VzLCBpTGVuKTsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0FTU0lHTl9QQVNULCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfRElTQworQVNTSUdOX0NIVU5LX0hEUiAobW5nX2Fzc2lnbl9kaXNjKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9BU1NJR05fRElTQywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmICgoKG1uZ19jaHVua19oZWFkZXJwKXBDaHVua2Zyb20pLT5pQ2h1bmtuYW1lICE9IE1OR19VSU5UX0RJU0MpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1dST05HQ0hVTkspOyAvKiBvdWNoICovCisKKyAgKChtbmdfZGlzY3ApcENodW5rdG8pLT5pQ291bnQgPSAoKG1uZ19kaXNjcClwQ2h1bmtmcm9tKS0+aUNvdW50OworCisgIGlmICgoKG1uZ19kaXNjcClwQ2h1bmt0byktPmlDb3VudCkKKyAgeworICAgIG1uZ191aW50MzIgaUxlbiA9ICgobW5nX2Rpc2NwKXBDaHVua3RvKS0+aUNvdW50ICogc2l6ZW9mIChtbmdfdWludDE2KTsKKworICAgIE1OR19BTExPQyAocERhdGEsICgobW5nX2Rpc2NwKXBDaHVua3RvKS0+cE9iamVjdGlkcywgaUxlbik7CisgICAgTU5HX0NPUFkgICgoKG1uZ19kaXNjcClwQ2h1bmt0byktPnBPYmplY3RpZHMsICgobW5nX2Rpc2NwKXBDaHVua2Zyb20pLT5wT2JqZWN0aWRzLCBpTGVuKTsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0FTU0lHTl9ESVNDLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS0FTU0lHTgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX0JBQ0sKK0FTU0lHTl9DSFVOS19IRFIgKG1uZ19hc3NpZ25fYmFjaykKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQVNTSUdOX0JBQ0ssIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAoKChtbmdfY2h1bmtfaGVhZGVycClwQ2h1bmtmcm9tKS0+aUNodW5rbmFtZSAhPSBNTkdfVUlOVF9CQUNLKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19XUk9OR0NIVU5LKTsgLyogb3VjaCAqLworCisgICgobW5nX2JhY2twKXBDaHVua3RvKS0+aVJlZCAgICAgICA9ICgobW5nX2JhY2twKXBDaHVua2Zyb20pLT5pUmVkOworICAoKG1uZ19iYWNrcClwQ2h1bmt0byktPmlHcmVlbiAgICAgPSAoKG1uZ19iYWNrcClwQ2h1bmtmcm9tKS0+aUdyZWVuOworICAoKG1uZ19iYWNrcClwQ2h1bmt0byktPmlCbHVlICAgICAgPSAoKG1uZ19iYWNrcClwQ2h1bmtmcm9tKS0+aUJsdWU7CisgICgobW5nX2JhY2twKXBDaHVua3RvKS0+aU1hbmRhdG9yeSA9ICgobW5nX2JhY2twKXBDaHVua2Zyb20pLT5pTWFuZGF0b3J5OworICAoKG1uZ19iYWNrcClwQ2h1bmt0byktPmlJbWFnZWlkICAgPSAoKG1uZ19iYWNrcClwQ2h1bmtmcm9tKS0+aUltYWdlaWQ7CisgICgobW5nX2JhY2twKXBDaHVua3RvKS0+aVRpbGUgICAgICA9ICgobW5nX2JhY2twKXBDaHVua2Zyb20pLT5pVGlsZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9BU1NJR05fQkFDSywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfRlJBTQorQVNTSUdOX0NIVU5LX0hEUiAobW5nX2Fzc2lnbl9mcmFtKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9BU1NJR05fRlJBTSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmICgoKG1uZ19jaHVua19oZWFkZXJwKXBDaHVua2Zyb20pLT5pQ2h1bmtuYW1lICE9IE1OR19VSU5UX0ZSQU0pCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1dST05HQ0hVTkspOyAvKiBvdWNoICovCisKKyAgKChtbmdfZnJhbXApcENodW5rdG8pLT5iRW1wdHkgICAgICAgICAgPSAoKG1uZ19mcmFtcClwQ2h1bmtmcm9tKS0+YkVtcHR5OworICAoKG1uZ19mcmFtcClwQ2h1bmt0byktPmlNb2RlICAgICAgICAgICA9ICgobW5nX2ZyYW1wKXBDaHVua2Zyb20pLT5pTW9kZTsKKyAgKChtbmdfZnJhbXApcENodW5rdG8pLT5pTmFtZXNpemUgICAgICAgPSAoKG1uZ19mcmFtcClwQ2h1bmtmcm9tKS0+aU5hbWVzaXplOworICAoKG1uZ19mcmFtcClwQ2h1bmt0byktPmlDaGFuZ2VkZWxheSAgICA9ICgobW5nX2ZyYW1wKXBDaHVua2Zyb20pLT5pQ2hhbmdlZGVsYXk7CisgICgobW5nX2ZyYW1wKXBDaHVua3RvKS0+aUNoYW5nZXRpbWVvdXQgID0gKChtbmdfZnJhbXApcENodW5rZnJvbSktPmlDaGFuZ2V0aW1lb3V0OworICAoKG1uZ19mcmFtcClwQ2h1bmt0byktPmlDaGFuZ2VjbGlwcGluZyA9ICgobW5nX2ZyYW1wKXBDaHVua2Zyb20pLT5pQ2hhbmdlY2xpcHBpbmc7CisgICgobW5nX2ZyYW1wKXBDaHVua3RvKS0+aUNoYW5nZXN5bmNpZCAgID0gKChtbmdfZnJhbXApcENodW5rZnJvbSktPmlDaGFuZ2VzeW5jaWQ7CisgICgobW5nX2ZyYW1wKXBDaHVua3RvKS0+aURlbGF5ICAgICAgICAgID0gKChtbmdfZnJhbXApcENodW5rZnJvbSktPmlEZWxheTsKKyAgKChtbmdfZnJhbXApcENodW5rdG8pLT5pVGltZW91dCAgICAgICAgPSAoKG1uZ19mcmFtcClwQ2h1bmtmcm9tKS0+aVRpbWVvdXQ7CisgICgobW5nX2ZyYW1wKXBDaHVua3RvKS0+aUJvdW5kYXJ5dHlwZSAgID0gKChtbmdfZnJhbXApcENodW5rZnJvbSktPmlCb3VuZGFyeXR5cGU7CisgICgobW5nX2ZyYW1wKXBDaHVua3RvKS0+aUJvdW5kYXJ5bCAgICAgID0gKChtbmdfZnJhbXApcENodW5rZnJvbSktPmlCb3VuZGFyeWw7CisgICgobW5nX2ZyYW1wKXBDaHVua3RvKS0+aUJvdW5kYXJ5ciAgICAgID0gKChtbmdfZnJhbXApcENodW5rZnJvbSktPmlCb3VuZGFyeXI7CisgICgobW5nX2ZyYW1wKXBDaHVua3RvKS0+aUJvdW5kYXJ5dCAgICAgID0gKChtbmdfZnJhbXApcENodW5rZnJvbSktPmlCb3VuZGFyeXQ7CisgICgobW5nX2ZyYW1wKXBDaHVua3RvKS0+aUJvdW5kYXJ5YiAgICAgID0gKChtbmdfZnJhbXApcENodW5rZnJvbSktPmlCb3VuZGFyeWI7CisgICgobW5nX2ZyYW1wKXBDaHVua3RvKS0+aUNvdW50ICAgICAgICAgID0gKChtbmdfZnJhbXApcENodW5rZnJvbSktPmlDb3VudDsKKworICBpZiAoKChtbmdfZnJhbXApcENodW5rdG8pLT5pTmFtZXNpemUpCisgIHsKKyAgICBNTkdfQUxMT0MgKHBEYXRhLCAoKG1uZ19mcmFtcClwQ2h1bmt0byktPnpOYW1lLCAoKG1uZ19mcmFtcClwQ2h1bmt0byktPmlOYW1lc2l6ZSk7CisgICAgTU5HX0NPUFkgICgoKG1uZ19mcmFtcClwQ2h1bmt0byktPnpOYW1lLCAoKG1uZ19mcmFtcClwQ2h1bmtmcm9tKS0+ek5hbWUsCisgICAgICAgICAgICAgICAoKG1uZ19mcmFtcClwQ2h1bmt0byktPmlOYW1lc2l6ZSk7CisgIH0KKworICBpZiAoKChtbmdfZnJhbXApcENodW5rdG8pLT5pQ291bnQpCisgIHsKKyAgICBtbmdfdWludDMyIGlMZW4gPSAoKG1uZ19mcmFtcClwQ2h1bmt0byktPmlDb3VudCAqIHNpemVvZiAobW5nX3VpbnQzMik7CisKKyAgICBNTkdfQUxMT0MgKHBEYXRhLCAoKG1uZ19mcmFtcClwQ2h1bmt0byktPnBTeW5jaWRzLCBpTGVuKTsKKyAgICBNTkdfQ09QWSAgKCgobW5nX2ZyYW1wKXBDaHVua3RvKS0+cFN5bmNpZHMsICgobW5nX2ZyYW1wKXBDaHVua2Zyb20pLT5wU3luY2lkcywgaUxlbik7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9BU1NJR05fRlJBTSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktBU1NJR04KKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19NT1ZFCitBU1NJR05fQ0hVTktfSERSIChtbmdfYXNzaWduX21vdmUpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0FTU0lHTl9NT1ZFLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKCgobW5nX2NodW5rX2hlYWRlcnApcENodW5rZnJvbSktPmlDaHVua25hbWUgIT0gTU5HX1VJTlRfTU9WRSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfV1JPTkdDSFVOSyk7IC8qIG91Y2ggKi8KKworICAoKG1uZ19tb3ZlcClwQ2h1bmt0byktPmlGaXJzdGlkICA9ICgobW5nX21vdmVwKXBDaHVua2Zyb20pLT5pRmlyc3RpZDsKKyAgKChtbmdfbW92ZXApcENodW5rdG8pLT5pTGFzdGlkICAgPSAoKG1uZ19tb3ZlcClwQ2h1bmtmcm9tKS0+aUxhc3RpZDsKKyAgKChtbmdfbW92ZXApcENodW5rdG8pLT5pTW92ZXR5cGUgPSAoKG1uZ19tb3ZlcClwQ2h1bmtmcm9tKS0+aU1vdmV0eXBlOworICAoKG1uZ19tb3ZlcClwQ2h1bmt0byktPmlNb3ZleCAgICA9ICgobW5nX21vdmVwKXBDaHVua2Zyb20pLT5pTW92ZXg7CisgICgobW5nX21vdmVwKXBDaHVua3RvKS0+aU1vdmV5ICAgID0gKChtbmdfbW92ZXApcENodW5rZnJvbSktPmlNb3ZleTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9BU1NJR05fTU9WRSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS0FTU0lHTgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX0NMSVAKK0FTU0lHTl9DSFVOS19IRFIgKG1uZ19hc3NpZ25fY2xpcCkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQVNTSUdOX0NMSVAsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAoKChtbmdfY2h1bmtfaGVhZGVycClwQ2h1bmtmcm9tKS0+aUNodW5rbmFtZSAhPSBNTkdfVUlOVF9DTElQKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19XUk9OR0NIVU5LKTsgLyogb3VjaCAqLworCisgICgobW5nX2NsaXBwKXBDaHVua3RvKS0+aUZpcnN0aWQgID0gKChtbmdfY2xpcHApcENodW5rZnJvbSktPmlGaXJzdGlkOworICAoKG1uZ19jbGlwcClwQ2h1bmt0byktPmlMYXN0aWQgICA9ICgobW5nX2NsaXBwKXBDaHVua2Zyb20pLT5pTGFzdGlkOworICAoKG1uZ19jbGlwcClwQ2h1bmt0byktPmlDbGlwdHlwZSA9ICgobW5nX2NsaXBwKXBDaHVua2Zyb20pLT5pQ2xpcHR5cGU7CisgICgobW5nX2NsaXBwKXBDaHVua3RvKS0+aUNsaXBsICAgID0gKChtbmdfY2xpcHApcENodW5rZnJvbSktPmlDbGlwbDsKKyAgKChtbmdfY2xpcHApcENodW5rdG8pLT5pQ2xpcHIgICAgPSAoKG1uZ19jbGlwcClwQ2h1bmtmcm9tKS0+aUNsaXByOworICAoKG1uZ19jbGlwcClwQ2h1bmt0byktPmlDbGlwdCAgICA9ICgobW5nX2NsaXBwKXBDaHVua2Zyb20pLT5pQ2xpcHQ7CisgICgobW5nX2NsaXBwKXBDaHVua3RvKS0+aUNsaXBiICAgID0gKChtbmdfY2xpcHApcENodW5rZnJvbSktPmlDbGlwYjsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9BU1NJR05fQ0xJUCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS0FTU0lHTgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX1NIT1cKK0FTU0lHTl9DSFVOS19IRFIgKG1uZ19hc3NpZ25fc2hvdykKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQVNTSUdOX1NIT1csIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAoKChtbmdfY2h1bmtfaGVhZGVycClwQ2h1bmtmcm9tKS0+aUNodW5rbmFtZSAhPSBNTkdfVUlOVF9TSE9XKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19XUk9OR0NIVU5LKTsgLyogb3VjaCAqLworCisgICgobW5nX3Nob3dwKXBDaHVua3RvKS0+YkVtcHR5ICAgPSAoKG1uZ19zaG93cClwQ2h1bmtmcm9tKS0+YkVtcHR5OworICAoKG1uZ19zaG93cClwQ2h1bmt0byktPmlGaXJzdGlkID0gKChtbmdfc2hvd3ApcENodW5rZnJvbSktPmlGaXJzdGlkOworICAoKG1uZ19zaG93cClwQ2h1bmt0byktPmlMYXN0aWQgID0gKChtbmdfc2hvd3ApcENodW5rZnJvbSktPmlMYXN0aWQ7CisgICgobW5nX3Nob3dwKXBDaHVua3RvKS0+aU1vZGUgICAgPSAoKG1uZ19zaG93cClwQ2h1bmtmcm9tKS0+aU1vZGU7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQVNTSUdOX1NIT1csIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktBU1NJR04KKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19URVJNCitBU1NJR05fQ0hVTktfSERSIChtbmdfYXNzaWduX3Rlcm0pCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0FTU0lHTl9URVJNLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKCgobW5nX2NodW5rX2hlYWRlcnApcENodW5rZnJvbSktPmlDaHVua25hbWUgIT0gTU5HX1VJTlRfVEVSTSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfV1JPTkdDSFVOSyk7IC8qIG91Y2ggKi8KKworICAoKG1uZ190ZXJtcClwQ2h1bmt0byktPmlUZXJtYWN0aW9uID0gKChtbmdfdGVybXApcENodW5rZnJvbSktPmlUZXJtYWN0aW9uOworICAoKG1uZ190ZXJtcClwQ2h1bmt0byktPmlJdGVyYWN0aW9uID0gKChtbmdfdGVybXApcENodW5rZnJvbSktPmlJdGVyYWN0aW9uOworICAoKG1uZ190ZXJtcClwQ2h1bmt0byktPmlEZWxheSAgICAgID0gKChtbmdfdGVybXApcENodW5rZnJvbSktPmlEZWxheTsKKyAgKChtbmdfdGVybXApcENodW5rdG8pLT5pSXRlcm1heCAgICA9ICgobW5nX3Rlcm1wKXBDaHVua2Zyb20pLT5pSXRlcm1heDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9BU1NJR05fVEVSTSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfU0FWRQorQVNTSUdOX0NIVU5LX0hEUiAobW5nX2Fzc2lnbl9zYXZlKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9BU1NJR05fU0FWRSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmICgoKG1uZ19jaHVua19oZWFkZXJwKXBDaHVua2Zyb20pLT5pQ2h1bmtuYW1lICE9IE1OR19VSU5UX1NBVkUpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1dST05HQ0hVTkspOyAvKiBvdWNoICovCisKKyAgKChtbmdfc2F2ZXApcENodW5rdG8pLT5iRW1wdHkgICAgICA9ICgobW5nX3NhdmVwKXBDaHVua2Zyb20pLT5iRW1wdHk7CisgICgobW5nX3NhdmVwKXBDaHVua3RvKS0+aU9mZnNldHR5cGUgPSAoKG1uZ19zYXZlcClwQ2h1bmtmcm9tKS0+aU9mZnNldHR5cGU7CisgICgobW5nX3NhdmVwKXBDaHVua3RvKS0+aUNvdW50ICAgICAgPSAoKG1uZ19zYXZlcClwQ2h1bmtmcm9tKS0+aUNvdW50OworCisgIGlmICgoKG1uZ19zYXZlcClwQ2h1bmt0byktPmlDb3VudCkKKyAgeworICAgIG1uZ191aW50MzIgICAgICBpWDsKKyAgICBtbmdfc2F2ZV9lbnRyeXAgcEVudHJ5OworICAgIG1uZ191aW50MzIgICAgICBpTGVuID0gKChtbmdfc2F2ZXApcENodW5rdG8pLT5pQ291bnQgKiBzaXplb2YgKG1uZ19zYXZlX2VudHJ5KTsKKworICAgIE1OR19BTExPQyAocERhdGEsICgobW5nX3NhdmVwKXBDaHVua3RvKS0+cEVudHJpZXMsIGlMZW4pOworICAgIE1OR19DT1BZICAoKChtbmdfc2F2ZXApcENodW5rdG8pLT5wRW50cmllcywgKChtbmdfc2F2ZXApcENodW5rZnJvbSktPnBFbnRyaWVzLCBpTGVuKTsKKworICAgIHBFbnRyeSA9ICgobW5nX3NhdmVwKXBDaHVua3RvKS0+cEVudHJpZXM7CisKKyAgICBmb3IgKGlYID0gMDsgaVggPCAoKG1uZ19zYXZlcClwQ2h1bmt0byktPmlDb3VudDsgaVgrKykKKyAgICB7CisgICAgICBpZiAocEVudHJ5LT5pTmFtZXNpemUpCisgICAgICB7CisgICAgICAgIG1uZ19wY2hhciBwVGVtcCA9IHBFbnRyeS0+ek5hbWU7CisKKyAgICAgICAgTU5HX0FMTE9DIChwRGF0YSwgcEVudHJ5LT56TmFtZSwgcEVudHJ5LT5pTmFtZXNpemUpOworICAgICAgICBNTkdfQ09QWSAgKHBFbnRyeS0+ek5hbWUsIHBUZW1wLCBwRW50cnktPmlOYW1lc2l6ZSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHBFbnRyeS0+ek5hbWUgPSBNTkdfTlVMTDsKKyAgICAgIH0KKworICAgICAgcEVudHJ5Kys7CisgICAgfQorICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQVNTSUdOX1NBVkUsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19TRUVLCitBU1NJR05fQ0hVTktfSERSIChtbmdfYXNzaWduX3NlZWspCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0FTU0lHTl9TRUVLLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKCgobW5nX2NodW5rX2hlYWRlcnApcENodW5rZnJvbSktPmlDaHVua25hbWUgIT0gTU5HX1VJTlRfU0VFSykKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfV1JPTkdDSFVOSyk7IC8qIG91Y2ggKi8KKworICAoKG1uZ19zZWVrcClwQ2h1bmt0byktPmlOYW1lc2l6ZSA9ICgobW5nX3NlZWtwKXBDaHVua2Zyb20pLT5pTmFtZXNpemU7CisKKyAgaWYgKCgobW5nX3NlZWtwKXBDaHVua3RvKS0+aU5hbWVzaXplKQorICB7CisgICAgTU5HX0FMTE9DIChwRGF0YSwgKChtbmdfc2Vla3ApcENodW5rdG8pLT56TmFtZSwgKChtbmdfc2Vla3ApcENodW5rdG8pLT5pTmFtZXNpemUpOworICAgIE1OR19DT1BZICAoKChtbmdfc2Vla3ApcENodW5rdG8pLT56TmFtZSwgKChtbmdfc2Vla3ApcENodW5rZnJvbSktPnpOYW1lLAorICAgICAgICAgICAgICAgKChtbmdfc2Vla3ApcENodW5rdG8pLT5pTmFtZXNpemUpOworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQVNTSUdOX1NFRUssIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19lWFBJCitBU1NJR05fQ0hVTktfSERSIChtbmdfYXNzaWduX2V4cGkpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0FTU0lHTl9FWFBJLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKCgobW5nX2NodW5rX2hlYWRlcnApcENodW5rZnJvbSktPmlDaHVua25hbWUgIT0gTU5HX1VJTlRfZVhQSSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfV1JPTkdDSFVOSyk7IC8qIG91Y2ggKi8KKworICAoKG1uZ19leHBpcClwQ2h1bmt0byktPmlTbmFwc2hvdGlkID0gKChtbmdfZXhwaXApcENodW5rZnJvbSktPmlTbmFwc2hvdGlkOworICAoKG1uZ19leHBpcClwQ2h1bmt0byktPmlOYW1lc2l6ZSAgID0gKChtbmdfZXhwaXApcENodW5rZnJvbSktPmlOYW1lc2l6ZTsKKworICBpZiAoKChtbmdfZXhwaXApcENodW5rdG8pLT5pTmFtZXNpemUpCisgIHsKKyAgICBNTkdfQUxMT0MgKHBEYXRhLCAoKG1uZ19leHBpcClwQ2h1bmt0byktPnpOYW1lLCAoKG1uZ19leHBpcClwQ2h1bmt0byktPmlOYW1lc2l6ZSk7CisgICAgTU5HX0NPUFkgICgoKG1uZ19leHBpcClwQ2h1bmt0byktPnpOYW1lLCAoKG1uZ19leHBpcClwQ2h1bmtmcm9tKS0+ek5hbWUsCisgICAgICAgICAgICAgICAoKG1uZ19leHBpcClwQ2h1bmt0byktPmlOYW1lc2l6ZSk7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9BU1NJR05fRVhQSSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktBU1NJR04KKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19mUFJJCitBU1NJR05fQ0hVTktfSERSIChtbmdfYXNzaWduX2ZwcmkpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0FTU0lHTl9GUFJJLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKCgobW5nX2NodW5rX2hlYWRlcnApcENodW5rZnJvbSktPmlDaHVua25hbWUgIT0gTU5HX1VJTlRfZlBSSSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfV1JPTkdDSFVOSyk7IC8qIG91Y2ggKi8KKworICAoKG1uZ19mcHJpcClwQ2h1bmt0byktPmlEZWx0YXR5cGUgPSAoKG1uZ19mcHJpcClwQ2h1bmtmcm9tKS0+aURlbHRhdHlwZTsKKyAgKChtbmdfZnByaXApcENodW5rdG8pLT5pUHJpb3JpdHkgID0gKChtbmdfZnByaXApcENodW5rZnJvbSktPmlQcmlvcml0eTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9BU1NJR05fRlBSSSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfbkVFRAorQVNTSUdOX0NIVU5LX0hEUiAobW5nX2Fzc2lnbl9uZWVkKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9BU1NJR05fTkVFRCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmICgoKG1uZ19jaHVua19oZWFkZXJwKXBDaHVua2Zyb20pLT5pQ2h1bmtuYW1lICE9IE1OR19VSU5UX25FRUQpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1dST05HQ0hVTkspOyAvKiBvdWNoICovCisKKyAgKChtbmdfbmVlZHApcENodW5rdG8pLT5pS2V5d29yZHNzaXplID0gKChtbmdfbmVlZHApcENodW5rZnJvbSktPmlLZXl3b3Jkc3NpemU7CisKKyAgaWYgKCgobW5nX25lZWRwKXBDaHVua3RvKS0+aUtleXdvcmRzc2l6ZSkKKyAgeworICAgIE1OR19BTExPQyAocERhdGEsICgobW5nX25lZWRwKXBDaHVua3RvKS0+ektleXdvcmRzLCAoKG1uZ19uZWVkcClwQ2h1bmt0byktPmlLZXl3b3Jkc3NpemUpOworICAgIE1OR19DT1BZICAoKChtbmdfbmVlZHApcENodW5rdG8pLT56S2V5d29yZHMsICgobW5nX25lZWRwKXBDaHVua2Zyb20pLT56S2V5d29yZHMsCisgICAgICAgICAgICAgICAoKG1uZ19uZWVkcClwQ2h1bmt0byktPmlLZXl3b3Jkc3NpemUpOworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQVNTSUdOX05FRUQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LQVNTSUdOCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfcEhZZworQVNTSUdOX0NIVU5LX0hEUiAobW5nX2Fzc2lnbl9waHlnKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9BU1NJR05fUEhZRywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmICgoKG1uZ19jaHVua19oZWFkZXJwKXBDaHVua2Zyb20pLT5pQ2h1bmtuYW1lICE9IE1OR19VSU5UX3BIWWcpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1dST05HQ0hVTkspOyAvKiBvdWNoICovCisKKyAgKChtbmdfcGh5Z3ApcENodW5rdG8pLT5iRW1wdHkgPSAoKG1uZ19waHlncClwQ2h1bmtmcm9tKS0+YkVtcHR5OworICAoKG1uZ19waHlncClwQ2h1bmt0byktPmlTaXpleCA9ICgobW5nX3BoeWdwKXBDaHVua2Zyb20pLT5pU2l6ZXg7CisgICgobW5nX3BoeWdwKXBDaHVua3RvKS0+aVNpemV5ID0gKChtbmdfcGh5Z3ApcENodW5rZnJvbSktPmlTaXpleTsKKyAgKChtbmdfcGh5Z3ApcENodW5rdG8pLT5pVW5pdCAgPSAoKG1uZ19waHlncClwQ2h1bmtmcm9tKS0+aVVuaXQ7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQVNTSUdOX1BIWUcsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktBU1NJR04KKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKK0FTU0lHTl9DSFVOS19IRFIgKG1uZ19hc3NpZ25famhkcikKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQVNTSUdOX0pIRFIsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAoKChtbmdfY2h1bmtfaGVhZGVycClwQ2h1bmtmcm9tKS0+aUNodW5rbmFtZSAhPSBNTkdfVUlOVF9KSERSKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19XUk9OR0NIVU5LKTsgLyogb3VjaCAqLworCisgICgobW5nX2poZHJwKXBDaHVua3RvKS0+aVdpZHRoICAgICAgICAgICAgPSAoKG1uZ19qaGRycClwQ2h1bmtmcm9tKS0+aVdpZHRoOworICAoKG1uZ19qaGRycClwQ2h1bmt0byktPmlIZWlnaHQgICAgICAgICAgID0gKChtbmdfamhkcnApcENodW5rZnJvbSktPmlIZWlnaHQ7CisgICgobW5nX2poZHJwKXBDaHVua3RvKS0+aUNvbG9ydHlwZSAgICAgICAgPSAoKG1uZ19qaGRycClwQ2h1bmtmcm9tKS0+aUNvbG9ydHlwZTsKKyAgKChtbmdfamhkcnApcENodW5rdG8pLT5pSW1hZ2VzYW1wbGVkZXB0aCA9ICgobW5nX2poZHJwKXBDaHVua2Zyb20pLT5pSW1hZ2VzYW1wbGVkZXB0aDsKKyAgKChtbmdfamhkcnApcENodW5rdG8pLT5pSW1hZ2Vjb21wcmVzc2lvbiA9ICgobW5nX2poZHJwKXBDaHVua2Zyb20pLT5pSW1hZ2Vjb21wcmVzc2lvbjsKKyAgKChtbmdfamhkcnApcENodW5rdG8pLT5pSW1hZ2VpbnRlcmxhY2UgICA9ICgobW5nX2poZHJwKXBDaHVua2Zyb20pLT5pSW1hZ2VpbnRlcmxhY2U7CisgICgobW5nX2poZHJwKXBDaHVua3RvKS0+aUFscGhhc2FtcGxlZGVwdGggPSAoKG1uZ19qaGRycClwQ2h1bmtmcm9tKS0+aUFscGhhc2FtcGxlZGVwdGg7CisgICgobW5nX2poZHJwKXBDaHVua3RvKS0+aUFscGhhY29tcHJlc3Npb24gPSAoKG1uZ19qaGRycClwQ2h1bmtmcm9tKS0+aUFscGhhY29tcHJlc3Npb247CisgICgobW5nX2poZHJwKXBDaHVua3RvKS0+aUFscGhhZmlsdGVyICAgICAgPSAoKG1uZ19qaGRycClwQ2h1bmtmcm9tKS0+aUFscGhhZmlsdGVyOworICAoKG1uZ19qaGRycClwQ2h1bmt0byktPmlBbHBoYWludGVybGFjZSAgID0gKChtbmdfamhkcnApcENodW5rZnJvbSktPmlBbHBoYWludGVybGFjZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9BU1NJR05fSkhEUiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYgLyogTU5HX0lOQ0xVREVfSk5HICovCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19JTkNMVURFX0pORworQVNTSUdOX0NIVU5LX0hEUiAobW5nX2Fzc2lnbl9qZGFhKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9BU1NJR05fSkRBQSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmICgoKG1uZ19jaHVua19oZWFkZXJwKXBDaHVua2Zyb20pLT5pQ2h1bmtuYW1lICE9IE1OR19VSU5UX0pEQUEpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1dST05HQ0hVTkspOyAvKiBvdWNoICovCisKKyAgKChtbmdfamRhYXApcENodW5rdG8pLT5iRW1wdHkgICAgPSAoKG1uZ19qZGFhcClwQ2h1bmtmcm9tKS0+YkVtcHR5OworICAoKG1uZ19qZGFhcClwQ2h1bmt0byktPmlEYXRhc2l6ZSA9ICgobW5nX2pkYWFwKXBDaHVua2Zyb20pLT5pRGF0YXNpemU7CisKKyAgaWYgKCgobW5nX2pkYWFwKXBDaHVua3RvKS0+aURhdGFzaXplKQorICB7CisgICAgTU5HX0FMTE9DIChwRGF0YSwgKChtbmdfamRhYXApcENodW5rdG8pLT5wRGF0YSwgKChtbmdfamRhYXApcENodW5rdG8pLT5pRGF0YXNpemUpOworICAgIE1OR19DT1BZICAoKChtbmdfamRhYXApcENodW5rdG8pLT5wRGF0YSwgKChtbmdfamRhYXApcENodW5rZnJvbSktPnBEYXRhLAorICAgICAgICAgICAgICAgKChtbmdfamRhYXApcENodW5rdG8pLT5pRGF0YXNpemUpOworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQVNTSUdOX0pEQUEsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmIC8qIE1OR19JTkNMVURFX0pORyAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCitBU1NJR05fQ0hVTktfSERSIChtbmdfYXNzaWduX2pkYXQpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0FTU0lHTl9KREFULCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKCgobW5nX2NodW5rX2hlYWRlcnApcENodW5rZnJvbSktPmlDaHVua25hbWUgIT0gTU5HX1VJTlRfSkRBVCkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfV1JPTkdDSFVOSyk7IC8qIG91Y2ggKi8KKworICAoKG1uZ19qZGF0cClwQ2h1bmt0byktPmJFbXB0eSAgICA9ICgobW5nX2pkYXRwKXBDaHVua2Zyb20pLT5iRW1wdHk7CisgICgobW5nX2pkYXRwKXBDaHVua3RvKS0+aURhdGFzaXplID0gKChtbmdfamRhdHApcENodW5rZnJvbSktPmlEYXRhc2l6ZTsKKworICBpZiAoKChtbmdfamRhdHApcENodW5rdG8pLT5pRGF0YXNpemUpCisgIHsKKyAgICBNTkdfQUxMT0MgKHBEYXRhLCAoKG1uZ19qZGF0cClwQ2h1bmt0byktPnBEYXRhLCAoKG1uZ19qZGF0cClwQ2h1bmt0byktPmlEYXRhc2l6ZSk7CisgICAgTU5HX0NPUFkgICgoKG1uZ19qZGF0cClwQ2h1bmt0byktPnBEYXRhLCAoKG1uZ19qZGF0cClwQ2h1bmtmcm9tKS0+cERhdGEsCisgICAgICAgICAgICAgICAoKG1uZ19qZGF0cClwQ2h1bmt0byktPmlEYXRhc2l6ZSk7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9BU1NJR05fSkRBVCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYgLyogTU5HX0lOQ0xVREVfSk5HICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LQVNTSUdOCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCitBU1NJR05fQ0hVTktfSERSIChtbmdfYXNzaWduX2pzZXApCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0FTU0lHTl9KU0VQLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKCgobW5nX2NodW5rX2hlYWRlcnApcENodW5rZnJvbSktPmlDaHVua25hbWUgIT0gTU5HX1VJTlRfSlNFUCkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfV1JPTkdDSFVOSyk7IC8qIG91Y2ggKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9BU1NJR05fSlNFUCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYgLyogTU5HX0lOQ0xVREVfSk5HICovCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktBU1NJR04KKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworQVNTSUdOX0NIVU5LX0hEUiAobW5nX2Fzc2lnbl9kaGRyKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9BU1NJR05fREhEUiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmICgoKG1uZ19jaHVua19oZWFkZXJwKXBDaHVua2Zyb20pLT5pQ2h1bmtuYW1lICE9IE1OR19VSU5UX0RIRFIpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1dST05HQ0hVTkspOyAvKiBvdWNoICovCisKKyAgKChtbmdfZGhkcnApcENodW5rdG8pLT5pT2JqZWN0aWQgICAgPSAoKG1uZ19kaGRycClwQ2h1bmtmcm9tKS0+aU9iamVjdGlkOworICAoKG1uZ19kaGRycClwQ2h1bmt0byktPmlJbWFnZXR5cGUgICA9ICgobW5nX2RoZHJwKXBDaHVua2Zyb20pLT5pSW1hZ2V0eXBlOworICAoKG1uZ19kaGRycClwQ2h1bmt0byktPmlEZWx0YXR5cGUgICA9ICgobW5nX2RoZHJwKXBDaHVua2Zyb20pLT5pRGVsdGF0eXBlOworICAoKG1uZ19kaGRycClwQ2h1bmt0byktPmlCbG9ja3dpZHRoICA9ICgobW5nX2RoZHJwKXBDaHVua2Zyb20pLT5pQmxvY2t3aWR0aDsKKyAgKChtbmdfZGhkcnApcENodW5rdG8pLT5pQmxvY2toZWlnaHQgPSAoKG1uZ19kaGRycClwQ2h1bmtmcm9tKS0+aUJsb2NraGVpZ2h0OworICAoKG1uZ19kaGRycClwQ2h1bmt0byktPmlCbG9ja3ggICAgICA9ICgobW5nX2RoZHJwKXBDaHVua2Zyb20pLT5pQmxvY2t4OworICAoKG1uZ19kaGRycClwQ2h1bmt0byktPmlCbG9ja3kgICAgICA9ICgobW5nX2RoZHJwKXBDaHVua2Zyb20pLT5pQmxvY2t5OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0FTU0lHTl9ESERSLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LQVNTSUdOCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKK0FTU0lHTl9DSFVOS19IRFIgKG1uZ19hc3NpZ25fcHJvbSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQVNTSUdOX1BST00sIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAoKChtbmdfY2h1bmtfaGVhZGVycClwQ2h1bmtmcm9tKS0+aUNodW5rbmFtZSAhPSBNTkdfVUlOVF9QUk9NKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19XUk9OR0NIVU5LKTsgLyogb3VjaCAqLworCisgICgobW5nX3Byb21wKXBDaHVua3RvKS0+aUNvbG9ydHlwZSAgID0gKChtbmdfcHJvbXApcENodW5rZnJvbSktPmlDb2xvcnR5cGU7CisgICgobW5nX3Byb21wKXBDaHVua3RvKS0+aVNhbXBsZWRlcHRoID0gKChtbmdfcHJvbXApcENodW5rZnJvbSktPmlTYW1wbGVkZXB0aDsKKyAgKChtbmdfcHJvbXApcENodW5rdG8pLT5pRmlsbHR5cGUgICAgPSAoKG1uZ19wcm9tcClwQ2h1bmtmcm9tKS0+aUZpbGx0eXBlOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0FTU0lHTl9QUk9NLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LQVNTSUdOCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKK0FTU0lHTl9DSFVOS19IRFIgKG1uZ19hc3NpZ25faXBuZykKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQVNTSUdOX0lQTkcsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAoKChtbmdfY2h1bmtfaGVhZGVycClwQ2h1bmtmcm9tKS0+aUNodW5rbmFtZSAhPSBNTkdfVUlOVF9JUE5HKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19XUk9OR0NIVU5LKTsgLyogb3VjaCAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0FTU0lHTl9JUE5HLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LQVNTSUdOCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKK0FTU0lHTl9DSFVOS19IRFIgKG1uZ19hc3NpZ25fcHBsdCkKK3sKKyAgbW5nX3VpbnQzMiBpWDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9BU1NJR05fUFBMVCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmICgoKG1uZ19jaHVua19oZWFkZXJwKXBDaHVua2Zyb20pLT5pQ2h1bmtuYW1lICE9IE1OR19VSU5UX1BQTFQpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1dST05HQ0hVTkspOyAvKiBvdWNoICovCisKKyAgKChtbmdfcHBsdHApcENodW5rdG8pLT5pRGVsdGF0eXBlID0gKChtbmdfcHBsdHApcENodW5rZnJvbSktPmlEZWx0YXR5cGU7CisgICgobW5nX3BwbHRwKXBDaHVua3RvKS0+aUNvdW50ICAgICA9ICgobW5nX3BwbHRwKXBDaHVua2Zyb20pLT5pQ291bnQ7CisKKyAgZm9yIChpWCA9IDA7IGlYIDwgKChtbmdfcHBsdHApcENodW5rdG8pLT5pQ291bnQ7IGlYKyspCisgICAgKChtbmdfcHBsdHApcENodW5rdG8pLT5hRW50cmllcyBbaVhdID0gKChtbmdfcHBsdHApcENodW5rZnJvbSktPmFFbnRyaWVzIFtpWF07CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQVNTSUdOX1BQTFQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktBU1NJR04KKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworI2lmZGVmIE1OR19JTkNMVURFX0pORworQVNTSUdOX0NIVU5LX0hEUiAobW5nX2Fzc2lnbl9pam5nKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9BU1NJR05fSUpORywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmICgoKG1uZ19jaHVua19oZWFkZXJwKXBDaHVua2Zyb20pLT5pQ2h1bmtuYW1lICE9IE1OR19VSU5UX0lKTkcpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1dST05HQ0hVTkspOyAvKiBvdWNoICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQVNTSUdOX0lKTkcsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKK0FTU0lHTl9DSFVOS19IRFIgKG1uZ19hc3NpZ25fZHJvcCkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQVNTSUdOX0RST1AsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAoKChtbmdfY2h1bmtfaGVhZGVycClwQ2h1bmtmcm9tKS0+aUNodW5rbmFtZSAhPSBNTkdfVUlOVF9EUk9QKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19XUk9OR0NIVU5LKTsgLyogb3VjaCAqLworCisgICgobW5nX2Ryb3BwKXBDaHVua3RvKS0+aUNvdW50ID0gKChtbmdfZHJvcHApcENodW5rZnJvbSktPmlDb3VudDsKKworICBpZiAoKChtbmdfZHJvcHApcENodW5rdG8pLT5pQ291bnQpCisgIHsKKyAgICBtbmdfdWludDMyIGlMZW4gPSAoKG1uZ19kcm9wcClwQ2h1bmt0byktPmlDb3VudCAqIHNpemVvZiAobW5nX3VpbnQzMik7CisKKyAgICBNTkdfQUxMT0MgKHBEYXRhLCAoKG1uZ19kcm9wcClwQ2h1bmt0byktPnBDaHVua25hbWVzLCBpTGVuKTsKKyAgICBNTkdfQ09QWSAgKCgobW5nX2Ryb3BwKXBDaHVua3RvKS0+cENodW5rbmFtZXMsICgobW5nX2Ryb3BwKXBDaHVua2Zyb20pLT5wQ2h1bmtuYW1lcywgaUxlbik7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9BU1NJR05fRFJPUCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfREJZSworQVNTSUdOX0NIVU5LX0hEUiAobW5nX2Fzc2lnbl9kYnlrKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9BU1NJR05fREJZSywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmICgoKG1uZ19jaHVua19oZWFkZXJwKXBDaHVua2Zyb20pLT5pQ2h1bmtuYW1lICE9IE1OR19VSU5UX0RCWUspCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1dST05HQ0hVTkspOyAvKiBvdWNoICovCisKKyAgKChtbmdfZGJ5a3ApcENodW5rdG8pLT5pQ2h1bmtuYW1lICAgID0gKChtbmdfZGJ5a3ApcENodW5rZnJvbSktPmlDaHVua25hbWU7CisgICgobW5nX2RieWtwKXBDaHVua3RvKS0+aVBvbGFyaXR5ICAgICA9ICgobW5nX2RieWtwKXBDaHVua2Zyb20pLT5pUG9sYXJpdHk7CisgICgobW5nX2RieWtwKXBDaHVua3RvKS0+aUtleXdvcmRzc2l6ZSA9ICgobW5nX2RieWtwKXBDaHVua2Zyb20pLT5pS2V5d29yZHNzaXplOworCisgIGlmICgoKG1uZ19kYnlrcClwQ2h1bmt0byktPmlLZXl3b3Jkc3NpemUpCisgIHsKKyAgICBNTkdfQUxMT0MgKHBEYXRhLCAoKG1uZ19kYnlrcClwQ2h1bmt0byktPnpLZXl3b3JkcywgKChtbmdfZGJ5a3ApcENodW5rdG8pLT5pS2V5d29yZHNzaXplKTsKKyAgICBNTkdfQ09QWSAgKCgobW5nX2RieWtwKXBDaHVua3RvKS0+ektleXdvcmRzLCAoKG1uZ19kYnlrcClwQ2h1bmtmcm9tKS0+ektleXdvcmRzLAorICAgICAgICAgICAgICAgKChtbmdfZGJ5a3ApcENodW5rdG8pLT5pS2V5d29yZHNzaXplKTsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0FTU0lHTl9EQllLLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworI2lmbmRlZiBNTkdfU0tJUENIVU5LX09SRFIKK0FTU0lHTl9DSFVOS19IRFIgKG1uZ19hc3NpZ25fb3JkcikKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQVNTSUdOX09SRFIsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAoKChtbmdfY2h1bmtfaGVhZGVycClwQ2h1bmtmcm9tKS0+aUNodW5rbmFtZSAhPSBNTkdfVUlOVF9PUkRSKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19XUk9OR0NIVU5LKTsgLyogb3VjaCAqLworCisgICgobW5nX29yZHJwKXBDaHVua3RvKS0+aUNvdW50ID0gKChtbmdfb3JkcnApcENodW5rZnJvbSktPmlDb3VudDsKKworICBpZiAoKChtbmdfb3JkcnApcENodW5rdG8pLT5pQ291bnQpCisgIHsKKyAgICBtbmdfdWludDMyIGlMZW4gPSAoKG1uZ19vcmRycClwQ2h1bmt0byktPmlDb3VudCAqIHNpemVvZiAobW5nX29yZHJfZW50cnkpOworCisgICAgTU5HX0FMTE9DIChwRGF0YSwgKChtbmdfb3JkcnApcENodW5rdG8pLT5wRW50cmllcywgaUxlbik7CisgICAgTU5HX0NPUFkgICgoKG1uZ19vcmRycClwQ2h1bmt0byktPnBFbnRyaWVzLCAoKG1uZ19vcmRycClwQ2h1bmtmcm9tKS0+cEVudHJpZXMsIGlMZW4pOworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQVNTSUdOX09SRFIsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktBU1NJR04KKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19NQUdOCitBU1NJR05fQ0hVTktfSERSIChtbmdfYXNzaWduX21hZ24pCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0FTU0lHTl9NQUdOLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKCgobW5nX2NodW5rX2hlYWRlcnApcENodW5rZnJvbSktPmlDaHVua25hbWUgIT0gTU5HX1VJTlRfTUFHTikKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfV1JPTkdDSFVOSyk7IC8qIG91Y2ggKi8KKworICAoKG1uZ19tYWducClwQ2h1bmt0byktPmlGaXJzdGlkID0gKChtbmdfbWFnbnApcENodW5rZnJvbSktPmlGaXJzdGlkOworICAoKG1uZ19tYWducClwQ2h1bmt0byktPmlMYXN0aWQgID0gKChtbmdfbWFnbnApcENodW5rZnJvbSktPmlMYXN0aWQ7CisgICgobW5nX21hZ25wKXBDaHVua3RvKS0+aU1ldGhvZFggPSAoKG1uZ19tYWducClwQ2h1bmtmcm9tKS0+aU1ldGhvZFg7CisgICgobW5nX21hZ25wKXBDaHVua3RvKS0+aU1YICAgICAgPSAoKG1uZ19tYWducClwQ2h1bmtmcm9tKS0+aU1YOworICAoKG1uZ19tYWducClwQ2h1bmt0byktPmlNWSAgICAgID0gKChtbmdfbWFnbnApcENodW5rZnJvbSktPmlNWTsKKyAgKChtbmdfbWFnbnApcENodW5rdG8pLT5pTUwgICAgICA9ICgobW5nX21hZ25wKXBDaHVua2Zyb20pLT5pTUw7CisgICgobW5nX21hZ25wKXBDaHVua3RvKS0+aU1SICAgICAgPSAoKG1uZ19tYWducClwQ2h1bmtmcm9tKS0+aU1SOworICAoKG1uZ19tYWducClwQ2h1bmt0byktPmlNVCAgICAgID0gKChtbmdfbWFnbnApcENodW5rZnJvbSktPmlNVDsKKyAgKChtbmdfbWFnbnApcENodW5rdG8pLT5pTUIgICAgICA9ICgobW5nX21hZ25wKXBDaHVua2Zyb20pLT5pTUI7CisgICgobW5nX21hZ25wKXBDaHVua3RvKS0+aU1ldGhvZFkgPSAoKG1uZ19tYWducClwQ2h1bmtmcm9tKS0+aU1ldGhvZFk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQVNTSUdOX01BR04sIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19JTkNMVURFX01QTkdfUFJPUE9TQUwKK0FTU0lHTl9DSFVOS19IRFIgKG1uZ19hc3NpZ25fbXBuZykKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQVNTSUdOX01QTkcsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAoKChtbmdfY2h1bmtfaGVhZGVycClwQ2h1bmtmcm9tKS0+aUNodW5rbmFtZSAhPSBNTkdfVUlOVF9tcE5HKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19XUk9OR0NIVU5LKTsgLyogb3VjaCAqLworCisgICgobW5nX21wbmdwKXBDaHVua3RvKS0+aUZyYW1ld2lkdGggICAgICAgID0gKChtbmdfbXBuZ3ApcENodW5rZnJvbSktPmlGcmFtZXdpZHRoOworICAoKG1uZ19tcG5ncClwQ2h1bmt0byktPmlGcmFtZWhlaWdodCAgICAgICA9ICgobW5nX21wbmdwKXBDaHVua2Zyb20pLT5pRnJhbWVoZWlnaHQ7CisgICgobW5nX21wbmdwKXBDaHVua3RvKS0+aU51bXBsYXlzICAgICAgICAgID0gKChtbmdfbXBuZ3ApcENodW5rZnJvbSktPmlOdW1wbGF5czsKKyAgKChtbmdfbXBuZ3ApcENodW5rdG8pLT5pVGlja3NwZXJzZWMgICAgICAgPSAoKG1uZ19tcG5ncClwQ2h1bmtmcm9tKS0+aVRpY2tzcGVyc2VjOworICAoKG1uZ19tcG5ncClwQ2h1bmt0byktPmlDb21wcmVzc2lvbm1ldGhvZCA9ICgobW5nX21wbmdwKXBDaHVua2Zyb20pLT5pQ29tcHJlc3Npb25tZXRob2Q7CisgICgobW5nX21wbmdwKXBDaHVua3RvKS0+aUZyYW1lc3NpemUgICAgICAgID0gKChtbmdfbXBuZ3ApcENodW5rZnJvbSktPmlGcmFtZXNzaXplOworCisgIGlmICgoKG1uZ19tcG5ncClwQ2h1bmt0byktPmlGcmFtZXNzaXplKQorICB7CisgICAgTU5HX0FMTE9DIChwRGF0YSwgKChtbmdfbXBuZ3ApcENodW5rdG8pLT5wRnJhbWVzLCAoKG1uZ19tcG5ncClwQ2h1bmt0byktPmlGcmFtZXNzaXplKTsKKyAgICBNTkdfQ09QWSAgKCgobW5nX21wbmdwKXBDaHVua3RvKS0+cEZyYW1lcywgKChtbmdfbXBuZ3ApcENodW5rZnJvbSktPnBGcmFtZXMsCisgICAgICAgICAgICAgICAoKG1uZ19tcG5ncClwQ2h1bmt0byktPmlGcmFtZXNzaXplKTsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0FTU0lHTl9NUE5HLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX0lOQ0xVREVfQU5HX1BST1BPU0FMCitBU1NJR05fQ0hVTktfSERSIChtbmdfYXNzaWduX2FoZHIpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0FTU0lHTl9BSERSLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKCgobW5nX2NodW5rX2hlYWRlcnApcENodW5rZnJvbSktPmlDaHVua25hbWUgIT0gTU5HX1VJTlRfYWhEUikKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfV1JPTkdDSFVOSyk7IC8qIG91Y2ggKi8KKworICAoKG1uZ19haGRycClwQ2h1bmt0byktPmlOdW1mcmFtZXMgICA9ICgobW5nX2FoZHJwKXBDaHVua2Zyb20pLT5pTnVtZnJhbWVzOworICAoKG1uZ19haGRycClwQ2h1bmt0byktPmlUaWNrc3BlcnNlYyA9ICgobW5nX2FoZHJwKXBDaHVua2Zyb20pLT5pVGlja3NwZXJzZWM7CisgICgobW5nX2FoZHJwKXBDaHVua3RvKS0+aU51bXBsYXlzICAgID0gKChtbmdfYWhkcnApcENodW5rZnJvbSktPmlOdW1wbGF5czsKKyAgKChtbmdfYWhkcnApcENodW5rdG8pLT5pVGlsZXdpZHRoICAgPSAoKG1uZ19haGRycClwQ2h1bmtmcm9tKS0+aVRpbGV3aWR0aDsKKyAgKChtbmdfYWhkcnApcENodW5rdG8pLT5pVGlsZWhlaWdodCAgPSAoKG1uZ19haGRycClwQ2h1bmtmcm9tKS0+aVRpbGVoZWlnaHQ7CisgICgobW5nX2FoZHJwKXBDaHVua3RvKS0+aUludGVybGFjZSAgID0gKChtbmdfYWhkcnApcENodW5rZnJvbSktPmlJbnRlcmxhY2U7CisgICgobW5nX2FoZHJwKXBDaHVua3RvKS0+aVN0aWxsdXNlZCAgID0gKChtbmdfYWhkcnApcENodW5rZnJvbSktPmlTdGlsbHVzZWQ7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQVNTSUdOX0FIRFIsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfSU5DTFVERV9BTkdfUFJPUE9TQUwKK0FTU0lHTl9DSFVOS19IRFIgKG1uZ19hc3NpZ25fYWRhdCkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQVNTSUdOX0FEQVQsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAoKChtbmdfY2h1bmtfaGVhZGVycClwQ2h1bmtmcm9tKS0+aUNodW5rbmFtZSAhPSBNTkdfVUlOVF9hZEFUKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19XUk9OR0NIVU5LKTsgLyogb3VjaCAqLworCisgICgobW5nX2FkYXRwKXBDaHVua3RvKS0+aVRpbGVzc2l6ZSA9ICgobW5nX2FkYXRwKXBDaHVua2Zyb20pLT5pVGlsZXNzaXplOworCisgIGlmICgoKG1uZ19hZGF0cClwQ2h1bmt0byktPmlUaWxlc3NpemUpCisgIHsKKyAgICBNTkdfQUxMT0MgKHBEYXRhLCAoKG1uZ19hZGF0cClwQ2h1bmt0byktPnBUaWxlcywgKChtbmdfYWRhdHApcENodW5rdG8pLT5pVGlsZXNzaXplKTsKKyAgICBNTkdfQ09QWSAgKCgobW5nX2FkYXRwKXBDaHVua3RvKS0+cFRpbGVzLCAoKG1uZ19hZGF0cClwQ2h1bmtmcm9tKS0+cFRpbGVzLAorICAgICAgICAgICAgICAgKChtbmdfYWRhdHApcENodW5rdG8pLT5pVGlsZXNzaXplKTsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0FTU0lHTl9BREFULCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfZXZOVAorQVNTSUdOX0NIVU5LX0hEUiAobW5nX2Fzc2lnbl9ldm50KQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9BU1NJR05fRVZOVCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmICgoKG1uZ19jaHVua19oZWFkZXJwKXBDaHVua2Zyb20pLT5pQ2h1bmtuYW1lICE9IE1OR19VSU5UX2V2TlQpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1dST05HQ0hVTkspOyAvKiBvdWNoICovCisKKyAgKChtbmdfZXZudHApcENodW5rdG8pLT5pQ291bnQgPSAoKG1uZ19ldm50cClwQ2h1bmtmcm9tKS0+aUNvdW50OworCisgIGlmICgoKG1uZ19ldm50cClwQ2h1bmt0byktPmlDb3VudCkKKyAgeworICAgIG1uZ191aW50MzIgICAgICBpWDsKKyAgICBtbmdfZXZudF9lbnRyeXAgcEVudHJ5OworICAgIG1uZ191aW50MzIgICAgICBpTGVuID0gKChtbmdfZXZudHApcENodW5rdG8pLT5pQ291bnQgKiBzaXplb2YgKG1uZ19ldm50X2VudHJ5KTsKKworICAgIE1OR19BTExPQyAocERhdGEsICgobW5nX2V2bnRwKXBDaHVua3RvKS0+cEVudHJpZXMsIGlMZW4pOworICAgIE1OR19DT1BZICAoKChtbmdfZXZudHApcENodW5rdG8pLT5wRW50cmllcywgKChtbmdfZXZudHApcENodW5rZnJvbSktPnBFbnRyaWVzLCBpTGVuKTsKKworICAgIHBFbnRyeSA9ICgobW5nX2V2bnRwKXBDaHVua3RvKS0+cEVudHJpZXM7CisKKyAgICBmb3IgKGlYID0gMDsgaVggPCAoKG1uZ19ldm50cClwQ2h1bmt0byktPmlDb3VudDsgaVgrKykKKyAgICB7CisgICAgICBpZiAocEVudHJ5LT5pU2VnbWVudG5hbWVzaXplKQorICAgICAgeworICAgICAgICBtbmdfcGNoYXIgcFRlbXAgPSBwRW50cnktPnpTZWdtZW50bmFtZTsKKworICAgICAgICBNTkdfQUxMT0MgKHBEYXRhLCBwRW50cnktPnpTZWdtZW50bmFtZSwgcEVudHJ5LT5pU2VnbWVudG5hbWVzaXplKzEpOworICAgICAgICBNTkdfQ09QWSAgKHBFbnRyeS0+elNlZ21lbnRuYW1lLCBwVGVtcCwgcEVudHJ5LT5pU2VnbWVudG5hbWVzaXplKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgcEVudHJ5LT56U2VnbWVudG5hbWUgPSBNTkdfTlVMTDsKKyAgICAgIH0KKworICAgICAgcEVudHJ5Kys7CisgICAgfQorICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQVNTSUdOX0VWTlQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK0FTU0lHTl9DSFVOS19IRFIgKG1uZ19hc3NpZ25fdW5rbm93bikKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQVNTSUdOX1VOS05PV04sIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICAoKG1uZ191bmtub3duX2NodW5rcClwQ2h1bmt0byktPmlEYXRhc2l6ZSA9ICgobW5nX3Vua25vd25fY2h1bmtwKXBDaHVua2Zyb20pLT5pRGF0YXNpemU7CisKKyAgaWYgKCgobW5nX3Vua25vd25fY2h1bmtwKXBDaHVua3RvKS0+aURhdGFzaXplKQorICB7CisgICAgTU5HX0FMTE9DIChwRGF0YSwgKChtbmdfdW5rbm93bl9jaHVua3ApcENodW5rdG8pLT5wRGF0YSwgKChtbmdfdW5rbm93bl9jaHVua3ApcENodW5rdG8pLT5pRGF0YXNpemUpOworICAgIE1OR19DT1BZICAoKChtbmdfdW5rbm93bl9jaHVua3ApcENodW5rdG8pLT5wRGF0YSwgKChtbmdfdW5rbm93bl9jaHVua3ApcENodW5rZnJvbSktPnBEYXRhLAorICAgICAgICAgICAgICAgKChtbmdfdW5rbm93bl9jaHVua3ApcENodW5rdG8pLT5pRGF0YXNpemUpOworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQVNTSUdOX1VOS05PV04sIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjZW5kaWYgLyogTU5HX0lOQ0xVREVfV1JJVEVfUFJPQ1MgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogZW5kIG9mIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCmRpZmYgLS1naXQgYS9maWxlcy9Tb3VyY2UvTGliTU5HL2xpYm1uZ19jaHVua19wcmMuaCBiL2ZpbGVzL1NvdXJjZS9MaWJNTkcvbGlibW5nX2NodW5rX3ByYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZjBmM2MKLS0tIC9kZXYvbnVsbAorKysgYi9maWxlcy9Tb3VyY2UvTGliTU5HL2xpYm1uZ19jaHVua19wcmMuaApAQCAtMCwwICsxLDM4MSBAQAorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIGxpYm1uZy5oICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIHByb2plY3QgICA6IGxpYm1uZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBmaWxlICAgICAgOiBsaWJtbmdfY2h1bmtfcHJjLmggICAgICAgIGNvcHlyaWdodCAoYykgMjAwMC0yMDA3IEcuSnV5biAgICogKi8KKy8qICogdmVyc2lvbiAgIDogMS4wLjEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBwdXJwb3NlICAgOiBDaHVuayBpbml0aWFsaXphdGlvbiAmIGNsZWFudXAgKGRlZmluaXRpb24pICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGF1dGhvciAgICA6IEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogY29tbWVudCAgIDogZGVmaW5pdGlvbiBvZiB0aGUgY2h1bmsgaW5pdGlhbGl6YXRpb24gJiBjbGVhbnVwIHJvdXRpbmVzICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBjaGFuZ2VzICAgOiAwLjUuMSAtIDA1LzA4LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjaGFuZ2VkIHN0cmljdC1BTlNJIHN0dWZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMiAtIDA4LzA1LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjaGFuZ2VkIGZpbGUtcHJlZml4ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMyAtIDA4LzI2LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBNQUdOIGNodW5rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4zIC0gMTAvMTYvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHN1cHBvcnQgZm9yIEpEQUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC41IC0gMDgvMTkvMjAwMiAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIEI1OTcxMzQgLSBsaWJtbmcgcG9sbHV0ZXMgdGhlIGxpbmtlciBuYW1lc3BhY2UgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAwOS8xNC8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgZXZlbnQgaGFuZGxpbmcgZm9yIGR5bmFtaWMgTU5HICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjYgLSAwNy8wNy8yMDAzIC0gRy5SLVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgTk9fREVMVEFfUE5HIHN1cHBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNiAtIDA3LzI5LzIwMDMgLSBHLlItUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBjb25kaXRpb25hbHMgYXJvdW5kIFBBU1QgY2h1bmsgc3VwcG9ydCAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuOSAtIDEyLzA1LzIwMDQgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBjb25kaXRpb25hbCBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRSAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC45IC0gMTIvMDYvMjAwNCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGNvbmRpdGlvbmFsIE1OR19PUFRJTUlaRV9DSFVOS0FTU0lHTiAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC4xMCAtIDA0LzA4LzIwMDcgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHN1cHBvcnQgZm9yIG1QTkcgcHJvcG9zYWwgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjEwIC0gMDQvMTIvMjAwNyAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgc3VwcG9ydCBmb3IgQU5HIHByb3Bvc2FsICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZiBkZWZpbmVkKF9fQk9STEFORENfXykgJiYgZGVmaW5lZChNTkdfU1RSSUNUX0FOU0kpCisjcHJhZ21hIG9wdGlvbiAtQSAgICAgICAgICAgICAgICAgICAgICAvKiBmb3JjZSBBTlNJLUMgKi8KKyNlbmRpZgorCisjaWZuZGVmIF9saWJtbmdfY2h1bmtfcHJjX2hfCisjZGVmaW5lIF9saWJtbmdfY2h1bmtfcHJjX2hfCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3ZvaWQgbW5nX2FkZF9jaHVuayAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgbW5nX2NodW5rcCBwQ2h1bmspOworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjZGVmaW5lIElOSVRfQ0hVTktfSERSKG4pIG1uZ19yZXRjb2RlIG4gKG1uZ19kYXRhcCAgIHBEYXRhLCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19jaHVua3AgIHBIZWFkZXIsICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19jaHVua3AqIHBwQ2h1bmspCisKKyNpZmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorSU5JVF9DSFVOS19IRFIgKG1uZ19pbml0X2dlbmVyYWwpIDsKKyNlbHNlCitJTklUX0NIVU5LX0hEUiAobW5nX2luaXRfaWhkcikgOworSU5JVF9DSFVOS19IRFIgKG1uZ19pbml0X3BsdGUpIDsKK0lOSVRfQ0hVTktfSERSIChtbmdfaW5pdF9pZGF0KSA7CitJTklUX0NIVU5LX0hEUiAobW5nX2luaXRfaWVuZCkgOworSU5JVF9DSFVOS19IRFIgKG1uZ19pbml0X3RybnMpIDsKK0lOSVRfQ0hVTktfSERSIChtbmdfaW5pdF9nYW1hKSA7CitJTklUX0NIVU5LX0hEUiAobW5nX2luaXRfY2hybSkgOworSU5JVF9DSFVOS19IRFIgKG1uZ19pbml0X3NyZ2IpIDsKK0lOSVRfQ0hVTktfSERSIChtbmdfaW5pdF9pY2NwKSA7CitJTklUX0NIVU5LX0hEUiAobW5nX2luaXRfdGV4dCkgOworSU5JVF9DSFVOS19IRFIgKG1uZ19pbml0X3p0eHQpIDsKK0lOSVRfQ0hVTktfSERSIChtbmdfaW5pdF9pdHh0KSA7CitJTklUX0NIVU5LX0hEUiAobW5nX2luaXRfYmtnZCkgOworSU5JVF9DSFVOS19IRFIgKG1uZ19pbml0X3BoeXMpIDsKK0lOSVRfQ0hVTktfSERSIChtbmdfaW5pdF9zYml0KSA7CitJTklUX0NIVU5LX0hEUiAobW5nX2luaXRfc3BsdCkgOworSU5JVF9DSFVOS19IRFIgKG1uZ19pbml0X2hpc3QpIDsKK0lOSVRfQ0hVTktfSERSIChtbmdfaW5pdF90aW1lKSA7CitJTklUX0NIVU5LX0hEUiAobW5nX2luaXRfbWhkcikgOworSU5JVF9DSFVOS19IRFIgKG1uZ19pbml0X21lbmQpIDsKK0lOSVRfQ0hVTktfSERSIChtbmdfaW5pdF9sb29wKSA7CitJTklUX0NIVU5LX0hEUiAobW5nX2luaXRfZW5kbCkgOworSU5JVF9DSFVOS19IRFIgKG1uZ19pbml0X2RlZmkpIDsKK0lOSVRfQ0hVTktfSERSIChtbmdfaW5pdF9iYXNpKSA7CitJTklUX0NIVU5LX0hEUiAobW5nX2luaXRfY2xvbikgOworI2lmbmRlZiBNTkdfU0tJUENIVU5LX1BBU1QKK0lOSVRfQ0hVTktfSERSIChtbmdfaW5pdF9wYXN0KSA7CisjZW5kaWYKK0lOSVRfQ0hVTktfSERSIChtbmdfaW5pdF9kaXNjKSA7CitJTklUX0NIVU5LX0hEUiAobW5nX2luaXRfYmFjaykgOworSU5JVF9DSFVOS19IRFIgKG1uZ19pbml0X2ZyYW0pIDsKK0lOSVRfQ0hVTktfSERSIChtbmdfaW5pdF9tb3ZlKSA7CitJTklUX0NIVU5LX0hEUiAobW5nX2luaXRfY2xpcCkgOworSU5JVF9DSFVOS19IRFIgKG1uZ19pbml0X3Nob3cpIDsKK0lOSVRfQ0hVTktfSERSIChtbmdfaW5pdF90ZXJtKSA7CitJTklUX0NIVU5LX0hEUiAobW5nX2luaXRfc2F2ZSkgOworSU5JVF9DSFVOS19IRFIgKG1uZ19pbml0X3NlZWspIDsKK0lOSVRfQ0hVTktfSERSIChtbmdfaW5pdF9leHBpKSA7CitJTklUX0NIVU5LX0hEUiAobW5nX2luaXRfZnByaSkgOworSU5JVF9DSFVOS19IRFIgKG1uZ19pbml0X25lZWQpIDsKK0lOSVRfQ0hVTktfSERSIChtbmdfaW5pdF9waHlnKSA7CisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCitJTklUX0NIVU5LX0hEUiAobW5nX2luaXRfamhkcikgOworSU5JVF9DSFVOS19IRFIgKG1uZ19pbml0X2pkYWEpIDsKK0lOSVRfQ0hVTktfSERSIChtbmdfaW5pdF9qZGF0KSA7CitJTklUX0NIVU5LX0hEUiAobW5nX2luaXRfanNlcCkgOworI2VuZGlmCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKK0lOSVRfQ0hVTktfSERSIChtbmdfaW5pdF9kaGRyKSA7CitJTklUX0NIVU5LX0hEUiAobW5nX2luaXRfcHJvbSkgOworSU5JVF9DSFVOS19IRFIgKG1uZ19pbml0X2lwbmcpIDsKK0lOSVRfQ0hVTktfSERSIChtbmdfaW5pdF9wcGx0KSA7CisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCitJTklUX0NIVU5LX0hEUiAobW5nX2luaXRfaWpuZykgOworI2VuZGlmCitJTklUX0NIVU5LX0hEUiAobW5nX2luaXRfZHJvcCkgOworSU5JVF9DSFVOS19IRFIgKG1uZ19pbml0X2RieWspIDsKK0lOSVRfQ0hVTktfSERSIChtbmdfaW5pdF9vcmRyKSA7CisjZW5kaWYKK0lOSVRfQ0hVTktfSERSIChtbmdfaW5pdF9tYWduKSA7CitJTklUX0NIVU5LX0hEUiAobW5nX2luaXRfZXZudCkgOworSU5JVF9DSFVOS19IRFIgKG1uZ19pbml0X3Vua25vd24pIDsKKyNlbmRpZiAvKiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRSAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjZGVmaW5lIEZSRUVfQ0hVTktfSERSKG4pIG1uZ19yZXRjb2RlIG4gKG1uZ19kYXRhcCAgIHBEYXRhLCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19jaHVua3AgIHBIZWFkZXIpCisKKyNpZmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorRlJFRV9DSFVOS19IRFIgKG1uZ19mcmVlX2dlbmVyYWwpIDsKKyNlbHNlIC8qIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFICovCitGUkVFX0NIVU5LX0hEUiAobW5nX2ZyZWVfaWhkcikgOworRlJFRV9DSFVOS19IRFIgKG1uZ19mcmVlX3BsdGUpIDsKK0ZSRUVfQ0hVTktfSERSIChtbmdfZnJlZV9pZW5kKSA7CitGUkVFX0NIVU5LX0hEUiAobW5nX2ZyZWVfdHJucykgOworRlJFRV9DSFVOS19IRFIgKG1uZ19mcmVlX2dhbWEpIDsKK0ZSRUVfQ0hVTktfSERSIChtbmdfZnJlZV9jaHJtKSA7CitGUkVFX0NIVU5LX0hEUiAobW5nX2ZyZWVfc3JnYikgOworRlJFRV9DSFVOS19IRFIgKG1uZ19mcmVlX2JrZ2QpIDsKK0ZSRUVfQ0hVTktfSERSIChtbmdfZnJlZV9waHlzKSA7CitGUkVFX0NIVU5LX0hEUiAobW5nX2ZyZWVfc2JpdCkgOworRlJFRV9DSFVOS19IRFIgKG1uZ19mcmVlX2hpc3QpIDsKK0ZSRUVfQ0hVTktfSERSIChtbmdfZnJlZV90aW1lKSA7CitGUkVFX0NIVU5LX0hEUiAobW5nX2ZyZWVfbWhkcikgOworRlJFRV9DSFVOS19IRFIgKG1uZ19mcmVlX21lbmQpIDsKK0ZSRUVfQ0hVTktfSERSIChtbmdfZnJlZV9lbmRsKSA7CitGUkVFX0NIVU5LX0hEUiAobW5nX2ZyZWVfZGVmaSkgOworRlJFRV9DSFVOS19IRFIgKG1uZ19mcmVlX2Jhc2kpIDsKK0ZSRUVfQ0hVTktfSERSIChtbmdfZnJlZV9jbG9uKSA7CitGUkVFX0NIVU5LX0hEUiAobW5nX2ZyZWVfYmFjaykgOworRlJFRV9DSFVOS19IRFIgKG1uZ19mcmVlX21vdmUpIDsKK0ZSRUVfQ0hVTktfSERSIChtbmdfZnJlZV9jbGlwKSA7CitGUkVFX0NIVU5LX0hEUiAobW5nX2ZyZWVfc2hvdykgOworRlJFRV9DSFVOS19IRFIgKG1uZ19mcmVlX3Rlcm0pIDsKK0ZSRUVfQ0hVTktfSERSIChtbmdfZnJlZV9mcHJpKSA7CitGUkVFX0NIVU5LX0hEUiAobW5nX2ZyZWVfcGh5ZykgOworI2lmZGVmIE1OR19JTkNMVURFX0pORworRlJFRV9DSFVOS19IRFIgKG1uZ19mcmVlX2poZHIpIDsKK0ZSRUVfQ0hVTktfSERSIChtbmdfZnJlZV9qc2VwKSA7CisjZW5kaWYKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworRlJFRV9DSFVOS19IRFIgKG1uZ19mcmVlX2RoZHIpIDsKK0ZSRUVfQ0hVTktfSERSIChtbmdfZnJlZV9wcm9tKSA7CitGUkVFX0NIVU5LX0hEUiAobW5nX2ZyZWVfaXBuZykgOworRlJFRV9DSFVOS19IRFIgKG1uZ19mcmVlX3BwbHQpIDsKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKK0ZSRUVfQ0hVTktfSERSIChtbmdfZnJlZV9pam5nKSA7CisjZW5kaWYKKyNlbmRpZgorRlJFRV9DSFVOS19IRFIgKG1uZ19mcmVlX21hZ24pIDsKKyNlbmRpZiAvKiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRSAqLworCitGUkVFX0NIVU5LX0hEUiAobW5nX2ZyZWVfaWRhdCkgOworRlJFRV9DSFVOS19IRFIgKG1uZ19mcmVlX2ljY3ApIDsKK0ZSRUVfQ0hVTktfSERSIChtbmdfZnJlZV90ZXh0KSA7CitGUkVFX0NIVU5LX0hEUiAobW5nX2ZyZWVfenR4dCkgOworRlJFRV9DSFVOS19IRFIgKG1uZ19mcmVlX2l0eHQpIDsKK0ZSRUVfQ0hVTktfSERSIChtbmdfZnJlZV9zcGx0KSA7CitGUkVFX0NIVU5LX0hEUiAobW5nX2ZyZWVfbG9vcCkgOworI2lmbmRlZiBNTkdfU0tJUENIVU5LX1BBU1QKK0ZSRUVfQ0hVTktfSERSIChtbmdfZnJlZV9wYXN0KSA7CisjZW5kaWYKK0ZSRUVfQ0hVTktfSERSIChtbmdfZnJlZV9kaXNjKSA7CitGUkVFX0NIVU5LX0hEUiAobW5nX2ZyZWVfZnJhbSkgOworRlJFRV9DSFVOS19IRFIgKG1uZ19mcmVlX3NhdmUpIDsKK0ZSRUVfQ0hVTktfSERSIChtbmdfZnJlZV9zZWVrKSA7CitGUkVFX0NIVU5LX0hEUiAobW5nX2ZyZWVfZXhwaSkgOworRlJFRV9DSFVOS19IRFIgKG1uZ19mcmVlX25lZWQpIDsKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKK0ZSRUVfQ0hVTktfSERSIChtbmdfZnJlZV9qZGFhKSA7CitGUkVFX0NIVU5LX0hEUiAobW5nX2ZyZWVfamRhdCkgOworI2VuZGlmCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKK0ZSRUVfQ0hVTktfSERSIChtbmdfZnJlZV9kcm9wKSA7CitGUkVFX0NIVU5LX0hEUiAobW5nX2ZyZWVfZGJ5aykgOworRlJFRV9DSFVOS19IRFIgKG1uZ19mcmVlX29yZHIpIDsKKyNlbmRpZgorI2lmZGVmIE1OR19JTkNMVURFX01QTkdfUFJPUE9TQUwKK0ZSRUVfQ0hVTktfSERSIChtbmdfZnJlZV9tcG5nKSA7CisjZW5kaWYKKyNpZmRlZiBNTkdfSU5DTFVERV9BTkdfUFJPUE9TQUwKK0ZSRUVfQ0hVTktfSERSIChtbmdfZnJlZV9hZGF0KSA7CisjZW5kaWYKK0ZSRUVfQ0hVTktfSERSIChtbmdfZnJlZV9ldm50KSA7CitGUkVFX0NIVU5LX0hEUiAobW5nX2ZyZWVfdW5rbm93bikgOworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX0lOQ0xVREVfV1JJVEVfUFJPQ1MKKworI2RlZmluZSBBU1NJR05fQ0hVTktfSERSKG4pIG1uZ19yZXRjb2RlIG4gKG1uZ19kYXRhcCAgIHBEYXRhLCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2NodW5rcCAgcENodW5rdG8sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfY2h1bmtwICBwQ2h1bmtmcm9tKQorCisjaWZkZWYgTU5HX09QVElNSVpFX0NIVU5LQVNTSUdOCitBU1NJR05fQ0hVTktfSERSIChtbmdfYXNzaWduX2dlbmVyYWwpIDsKKyNlbHNlIC8qIE1OR19PUFRJTUlaRV9DSFVOS0FTU0lHTiAqLworQVNTSUdOX0NIVU5LX0hEUiAobW5nX2Fzc2lnbl9paGRyKSA7CitBU1NJR05fQ0hVTktfSERSIChtbmdfYXNzaWduX3BsdGUpIDsKK0FTU0lHTl9DSFVOS19IRFIgKG1uZ19hc3NpZ25faWVuZCkgOworQVNTSUdOX0NIVU5LX0hEUiAobW5nX2Fzc2lnbl90cm5zKSA7CitBU1NJR05fQ0hVTktfSERSIChtbmdfYXNzaWduX2dhbWEpIDsKK0FTU0lHTl9DSFVOS19IRFIgKG1uZ19hc3NpZ25fY2hybSkgOworQVNTSUdOX0NIVU5LX0hEUiAobW5nX2Fzc2lnbl9zcmdiKSA7CitBU1NJR05fQ0hVTktfSERSIChtbmdfYXNzaWduX2JrZ2QpIDsKK0FTU0lHTl9DSFVOS19IRFIgKG1uZ19hc3NpZ25fcGh5cykgOworQVNTSUdOX0NIVU5LX0hEUiAobW5nX2Fzc2lnbl9zYml0KSA7CitBU1NJR05fQ0hVTktfSERSIChtbmdfYXNzaWduX2hpc3QpIDsKK0FTU0lHTl9DSFVOS19IRFIgKG1uZ19hc3NpZ25fdGltZSkgOworQVNTSUdOX0NIVU5LX0hEUiAobW5nX2Fzc2lnbl9taGRyKSA7CitBU1NJR05fQ0hVTktfSERSIChtbmdfYXNzaWduX21lbmQpIDsKK0FTU0lHTl9DSFVOS19IRFIgKG1uZ19hc3NpZ25fZW5kbCkgOworQVNTSUdOX0NIVU5LX0hEUiAobW5nX2Fzc2lnbl9kZWZpKSA7CitBU1NJR05fQ0hVTktfSERSIChtbmdfYXNzaWduX2Jhc2kpIDsKK0FTU0lHTl9DSFVOS19IRFIgKG1uZ19hc3NpZ25fY2xvbikgOworQVNTSUdOX0NIVU5LX0hEUiAobW5nX2Fzc2lnbl9iYWNrKSA7CitBU1NJR05fQ0hVTktfSERSIChtbmdfYXNzaWduX21vdmUpIDsKK0FTU0lHTl9DSFVOS19IRFIgKG1uZ19hc3NpZ25fY2xpcCkgOworQVNTSUdOX0NIVU5LX0hEUiAobW5nX2Fzc2lnbl9zaG93KSA7CitBU1NJR05fQ0hVTktfSERSIChtbmdfYXNzaWduX3Rlcm0pIDsKK0FTU0lHTl9DSFVOS19IRFIgKG1uZ19hc3NpZ25fZnByaSkgOworQVNTSUdOX0NIVU5LX0hEUiAobW5nX2Fzc2lnbl9waHlnKSA7CisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCitBU1NJR05fQ0hVTktfSERSIChtbmdfYXNzaWduX2poZHIpIDsKK0FTU0lHTl9DSFVOS19IRFIgKG1uZ19hc3NpZ25fanNlcCkgOworI2VuZGlmCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKK0FTU0lHTl9DSFVOS19IRFIgKG1uZ19hc3NpZ25fZGhkcikgOworQVNTSUdOX0NIVU5LX0hEUiAobW5nX2Fzc2lnbl9wcm9tKSA7CitBU1NJR05fQ0hVTktfSERSIChtbmdfYXNzaWduX2lwbmcpIDsKK0FTU0lHTl9DSFVOS19IRFIgKG1uZ19hc3NpZ25fcHBsdCkgOworI2lmZGVmIE1OR19JTkNMVURFX0pORworQVNTSUdOX0NIVU5LX0hEUiAobW5nX2Fzc2lnbl9pam5nKSA7CisjZW5kaWYKKyNlbmRpZgorQVNTSUdOX0NIVU5LX0hEUiAobW5nX2Fzc2lnbl9tYWduKSA7CisjZW5kaWYgLyogTU5HX09QVElNSVpFX0NIVU5LQVNTSUdOICovCisKK0FTU0lHTl9DSFVOS19IRFIgKG1uZ19hc3NpZ25faWRhdCkgOworQVNTSUdOX0NIVU5LX0hEUiAobW5nX2Fzc2lnbl9pY2NwKSA7CitBU1NJR05fQ0hVTktfSERSIChtbmdfYXNzaWduX3RleHQpIDsKK0FTU0lHTl9DSFVOS19IRFIgKG1uZ19hc3NpZ25fenR4dCkgOworQVNTSUdOX0NIVU5LX0hEUiAobW5nX2Fzc2lnbl9pdHh0KSA7CitBU1NJR05fQ0hVTktfSERSIChtbmdfYXNzaWduX3NwbHQpIDsKK0FTU0lHTl9DSFVOS19IRFIgKG1uZ19hc3NpZ25fbG9vcCkgOworI2lmbmRlZiBNTkdfU0tJUENIVU5LX1BBU1QKK0FTU0lHTl9DSFVOS19IRFIgKG1uZ19hc3NpZ25fcGFzdCkgOworI2VuZGlmCitBU1NJR05fQ0hVTktfSERSIChtbmdfYXNzaWduX2Rpc2MpIDsKK0FTU0lHTl9DSFVOS19IRFIgKG1uZ19hc3NpZ25fZnJhbSkgOworQVNTSUdOX0NIVU5LX0hEUiAobW5nX2Fzc2lnbl9zYXZlKSA7CitBU1NJR05fQ0hVTktfSERSIChtbmdfYXNzaWduX3NlZWspIDsKK0FTU0lHTl9DSFVOS19IRFIgKG1uZ19hc3NpZ25fbmVlZCkgOworQVNTSUdOX0NIVU5LX0hEUiAobW5nX2Fzc2lnbl9leHBpKSA7CisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCitBU1NJR05fQ0hVTktfSERSIChtbmdfYXNzaWduX2pkYWEpIDsKK0FTU0lHTl9DSFVOS19IRFIgKG1uZ19hc3NpZ25famRhdCkgOworI2VuZGlmCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKK0FTU0lHTl9DSFVOS19IRFIgKG1uZ19hc3NpZ25fZHJvcCkgOworQVNTSUdOX0NIVU5LX0hEUiAobW5nX2Fzc2lnbl9kYnlrKSA7CitBU1NJR05fQ0hVTktfSERSIChtbmdfYXNzaWduX29yZHIpIDsKKyNlbmRpZgorI2lmZGVmIE1OR19JTkNMVURFX01QTkdfUFJPUE9TQUwKK0FTU0lHTl9DSFVOS19IRFIgKG1uZ19hc3NpZ25fbXBuZykgOworI2VuZGlmCisjaWZkZWYgTU5HX0lOQ0xVREVfQU5HX1BST1BPU0FMCitBU1NJR05fQ0hVTktfSERSIChtbmdfYXNzaWduX2FoZHIpIDsKK0FTU0lHTl9DSFVOS19IRFIgKG1uZ19hc3NpZ25fYWRhdCkgOworI2VuZGlmCitBU1NJR05fQ0hVTktfSERSIChtbmdfYXNzaWduX2V2bnQpIDsKK0FTU0lHTl9DSFVOS19IRFIgKG1uZ19hc3NpZ25fdW5rbm93bikgOworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjZWxzZSAvKiBNTkdfSU5DTFVERV9XUklURV9QUk9DUyAqLworI2RlZmluZSBtbmdfYXNzaWduX2dlbmVyYWwgMAorI2RlZmluZSBtbmdfYXNzaWduX2loZHIgMAorI2RlZmluZSBtbmdfYXNzaWduX3BsdGUgMAorI2RlZmluZSBtbmdfYXNzaWduX2lkYXQgMAorI2RlZmluZSBtbmdfYXNzaWduX2llbmQgMAorI2RlZmluZSBtbmdfYXNzaWduX3RybnMgMAorI2RlZmluZSBtbmdfYXNzaWduX2dhbWEgMAorI2RlZmluZSBtbmdfYXNzaWduX2Nocm0gMAorI2RlZmluZSBtbmdfYXNzaWduX3NyZ2IgMAorI2RlZmluZSBtbmdfYXNzaWduX2ljY3AgMAorI2RlZmluZSBtbmdfYXNzaWduX3RleHQgMAorI2RlZmluZSBtbmdfYXNzaWduX3p0eHQgMAorI2RlZmluZSBtbmdfYXNzaWduX2l0eHQgMAorI2RlZmluZSBtbmdfYXNzaWduX2JrZ2QgMAorI2RlZmluZSBtbmdfYXNzaWduX3BoeXMgMAorI2RlZmluZSBtbmdfYXNzaWduX3NiaXQgMAorI2RlZmluZSBtbmdfYXNzaWduX3NwbHQgMAorI2RlZmluZSBtbmdfYXNzaWduX2hpc3QgMAorI2RlZmluZSBtbmdfYXNzaWduX3RpbWUgMAorI2RlZmluZSBtbmdfYXNzaWduX21oZHIgMAorI2RlZmluZSBtbmdfYXNzaWduX21lbmQgMAorI2RlZmluZSBtbmdfYXNzaWduX2xvb3AgMAorI2RlZmluZSBtbmdfYXNzaWduX2VuZGwgMAorI2RlZmluZSBtbmdfYXNzaWduX2RlZmkgMAorI2RlZmluZSBtbmdfYXNzaWduX2Jhc2kgMAorI2RlZmluZSBtbmdfYXNzaWduX2Nsb24gMAorI2lmbmRlZiBNTkdfU0tJUENIVU5LX1BBU1QKKyNkZWZpbmUgbW5nX2Fzc2lnbl9wYXN0IDAKKyNlbmRpZgorI2RlZmluZSBtbmdfYXNzaWduX2Rpc2MgMAorI2RlZmluZSBtbmdfYXNzaWduX2JhY2sgMAorI2RlZmluZSBtbmdfYXNzaWduX2ZyYW0gMAorI2RlZmluZSBtbmdfYXNzaWduX21vdmUgMAorI2RlZmluZSBtbmdfYXNzaWduX2NsaXAgMAorI2RlZmluZSBtbmdfYXNzaWduX3Nob3cgMAorI2RlZmluZSBtbmdfYXNzaWduX3Rlcm0gMAorI2RlZmluZSBtbmdfYXNzaWduX3NhdmUgMAorI2RlZmluZSBtbmdfYXNzaWduX3NlZWsgMAorI2RlZmluZSBtbmdfYXNzaWduX2V4cGkgMAorI2RlZmluZSBtbmdfYXNzaWduX2ZwcmkgMAorI2RlZmluZSBtbmdfYXNzaWduX3BoeWcgMAorI2lmZGVmIE1OR19JTkNMVURFX0pORworI2RlZmluZSBtbmdfYXNzaWduX2poZHIgMAorI2RlZmluZSBtbmdfYXNzaWduX2pkYWEgMAorI2RlZmluZSBtbmdfYXNzaWduX2pkYXQgMAorI2RlZmluZSBtbmdfYXNzaWduX2pzZXAgMAorI2VuZGlmCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKKyNkZWZpbmUgbW5nX2Fzc2lnbl9kaGRyIDAKKyNkZWZpbmUgbW5nX2Fzc2lnbl9wcm9tIDAKKyNkZWZpbmUgbW5nX2Fzc2lnbl9pcG5nIDAKKyNkZWZpbmUgbW5nX2Fzc2lnbl9wcGx0IDAKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyNkZWZpbmUgbW5nX2Fzc2lnbl9pam5nIDAKKyNlbmRpZgorI2RlZmluZSBtbmdfYXNzaWduX2Ryb3AgMAorI2RlZmluZSBtbmdfYXNzaWduX2RieWsgMAorI2RlZmluZSBtbmdfYXNzaWduX29yZHIgMAorI2VuZGlmCisjZGVmaW5lIG1uZ19hc3NpZ25fbWFnbiAwCisjZGVmaW5lIG1uZ19hc3NpZ25fbmVlZCAwCisjZGVmaW5lIG1uZ19hc3NpZ25fbXBuZyAwCisjZGVmaW5lIG1uZ19hc3NpZ25fYWhkciAwCisjZGVmaW5lIG1uZ19hc3NpZ25fYWRhdCAwCisjZGVmaW5lIG1uZ19hc3NpZ25fZXZudCAwCisjZGVmaW5lIG1uZ19hc3NpZ25fdW5rbm93biAwCisjZW5kaWYgLyogTU5HX0lOQ0xVREVfV1JJVEVfUFJPQ1MgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2VuZGlmIC8qIF9saWJtbmdfY2h1bmtfcHJjX2hfICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqIGVuZCBvZiBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9MaWJNTkcvbGlibW5nX2NodW5rX3hzLmMgYi9maWxlcy9Tb3VyY2UvTGliTU5HL2xpYm1uZ19jaHVua194cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMTE0MDkKLS0tIC9kZXYvbnVsbAorKysgYi9maWxlcy9Tb3VyY2UvTGliTU5HL2xpYm1uZ19jaHVua194cy5jCkBAIC0wLDAgKzEsNzAxNiBAQAorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIGxpYm1uZy5oICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIHByb2plY3QgICA6IGxpYm1uZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBmaWxlICAgICAgOiBsaWJtbmdfY2h1bmtfeHMuYyAgICAgICAgIGNvcHlyaWdodCAoYykgMjAwMC0yMDA3IEcuSnV5biAgICogKi8KKy8qICogdmVyc2lvbiAgIDogMS4wLjEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBwdXJwb3NlICAgOiBjaHVuayBhY2Nlc3MgZnVuY3Rpb25zIChpbXBsZW1lbnRhdGlvbikgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGF1dGhvciAgICA6IEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogY29tbWVudCAgIDogaW1wbGVtZW50YXRpb24gb2YgdGhlIGNodW5rIGFjY2VzcyBmdW5jdGlvbnMgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBjaGFuZ2VzICAgOiAwLjUuMSAtIDA1LzA2LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjaGFuZ2VkIGFuZCBmaWxsZWQgaXRlcmF0ZS1jaHVuayBmdW5jdGlvbiAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4xIC0gMDUvMDgvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIGNhbGxpbmcgY29udmVudGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBnZXRjaHVuayBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgcHV0Y2h1bmsgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNoYW5nZWQgc3RyaWN0LUFOU0kgc3R1ZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjEgLSAwNS8xMS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgZW1wdHktY2h1bmsgcHV0LXJvdXRpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMSAtIDA1LzEyLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjaGFuZ2VkIHRyYWNlIHRvIG1hY3JvIGZvciBjYWxsYmFjayBlcnJvci1yZXBvcnRpbmcgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4xIC0gMDUvMTUvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGdldGltZ2RhdGEgJiBwdXRpbWdkYXRhIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4yIC0gMDUvMTkvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIEIwMDQgLSBmaXhlZCBwcm9ibGVtIHdpdGggTU5HX1NVUFBPUlRfV1JJVEUgbm90IGRlZmluZWQgICogKi8KKy8qICogICAgICAgICAgICAgICBhbHNvIGZvciBNTkdfU1VQUE9SVF9XUklURSB3aXRob3V0IE1OR19JTkNMVURFX0pORyAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gQ2xlYW5lZCB1cCBzb21lIGNvZGUgcmVnYXJkaW5nIG1peGVkIHN1cHBvcnQgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjEgLSAwNy8xOS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgY3JlYXRpb24tY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjIgLSAwOC8wNS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2hhbmdlZCBmaWxlLXByZWZpeGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGZ1bmN0aW9uIHRvIHNldCBzaW1wbGljaXR5IGZpZWxkICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaXhlZCBwdXRjaHVua191bmtub3duKCkgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMyAtIDA4LzA3LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBCMTExMzAwIC0gZml4dXAgZm9yIGltcHJvdmVkIHBvcnRhYmlsaXR5ICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4zIC0gMDgvMjYvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIE1BR04gY2h1bmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjMgLSAxMC8yMC8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgcHV0Y2h1bmtfcGx0ZSgpIHRvIHNldCBiRW1wdHkgcGFyYW1ldGVyICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjUgLSAwMS8yNS8yMDAxIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgc29tZSBzbWFsbCBjb21waWxlciB3YXJuaW5ncyAodGhhbmtzIE5pa2tpKSAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAwOS8wNy8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gQjU3ODk0MCAtIHVuaW1wbGVtZW50ZWQgZnVuY3Rpb25zIHJldHVybiBlcnJvcmNvZGUgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDA4LzE5LzIwMDIgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBCNTk3MTM0IC0gbGlibW5nIHBvbGx1dGVzIHRoZSBsaW5rZXIgbmFtZXNwYWNlICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgSExBUEkgZnVuY3Rpb24gdG8gY29weSBjaHVua3MgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDA5LzE0LzIwMDIgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBldmVudCBoYW5kbGluZyBmb3IgZHluYW1pYyBNTkcgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC41IC0gMTAvMDcvMjAwMiAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGNoZWNrIGZvciBURVJNIHBsYWNlbWVudCBkdXJpbmcgY3JlYXRlL3dyaXRlICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAxMS8yOC8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgZGVmaW5pdGlvbiBvZiBpTWV0aG9kWC9ZIGZvciBNQUdOIGNodW5rICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjYgLSAwNS8yNS8yMDAzIC0gRy5SLVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgTU5HX1NLSVBDSFVOS19jSE5LIGZvb3RwcmludCBvcHRpbWl6YXRpb25zICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNiAtIDA3LzA3LzIwMDMgLSBHLlItUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBNTkdfTk9fREVMVEFfUE5HIHJlZHVjdGlvbiBhbmQgbW9yZSBTS0lQQ0hVTksgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgb3B0aW1pemF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNiAtIDA3LzI5LzIwMDMgLSBHLlItUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBjb25kaXRpb25hbHMgYXJvdW5kIFBBU1QgY2h1bmsgc3VwcG9ydCAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC42IC0gMDgvMTcvMjAwMyAtIEcuUi1QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGNvbmRpdGlvbmFscyBhcm91bmQgbm9uLVZMQyBjaHVuayBzdXBwb3J0ICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC44IC0gMDQvMDEvMjAwNCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIG1pc3NpbmcgZ2V0LS9wdXQtY2h1bmstamRhYSAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjggLSAwOC8wMi8yMDA0IC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgY29uZGl0aW9uYWwgdG8gYWxsb3cgZWFzaWVyIHdyaXRpbmcgb2YgbGFyZ2UgTU5HJ3MgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjkgLSAwOS8xNy8yMDA0IC0gRy5SLVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgdHdvIG1vcmUgY29uZGl0aW9uYWxzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuOSAtIDA5LzI1LzIwMDQgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSByZXBsYWNlZCBNTkdfVFdFQUtfTEFSR0VfRklMRVMgd2l0aCBwZXJtYW5lbnQgc29sdXRpb24gICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC45IC0gMTcvMTQvMjAwNCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIFBQTFQgZ2V0Y2h1bmsvcHV0Y2h1bmsgcm91dGluZXMgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjkgLSAxMi8wNS8yMDA0IC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgY29uZGl0aW9uYWwgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuOSAtIDEyLzIwLzIwMDQgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjbGVhbmVkIHVwIG1hY3JvLWludm9jYXRpb25zICh0aGFua3MgdG8gRC4gQWlybGllKSAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuMTAgLSAwNC8wOC8yMDA3IC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBzdXBwb3J0IGZvciBtUE5HIHByb3Bvc2FsICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2luY2x1ZGUgImxpYm1uZy5oIgorI2luY2x1ZGUgImxpYm1uZ19kYXRhLmgiCisjaW5jbHVkZSAibGlibW5nX2Vycm9yLmgiCisjaW5jbHVkZSAibGlibW5nX3RyYWNlLmgiCisjaWZkZWYgX19CT1JMQU5EQ19fCisjcHJhZ21hIGhkcnN0b3AKKyNlbmRpZgorI2luY2x1ZGUgImxpYm1uZ19tZW1vcnkuaCIKKyNpbmNsdWRlICJsaWJtbmdfY2h1bmtzLmgiCisjaWZkZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisjaW5jbHVkZSAibGlibW5nX2NodW5rX2Rlc2NyLmgiCisjZW5kaWYKKyNpbmNsdWRlICJsaWJtbmdfY2h1bmtfcHJjLmgiCisjaW5jbHVkZSAibGlibW5nX2NodW5rX2lvLmgiCisKKyNpZiBkZWZpbmVkKF9fQk9STEFORENfXykgJiYgZGVmaW5lZChNTkdfU1RSSUNUX0FOU0kpCisjcHJhZ21hIG9wdGlvbiAtQSAgICAgICAgICAgICAgICAgICAgICAvKiBmb3JjZSBBTlNJLUMgKi8KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX0FDQ0VTU19DSFVOS1MKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX2l0ZXJhdGVfY2h1bmtzIChtbmdfaGFuZGxlICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgaUNodW5rc2VxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaXRlcmF0ZWNodW5rIGZQcm9jKQoreworICBtbmdfdWludDMyICBpU2VxOworICBtbmdfY2h1bmtpZCBpQ2h1bmtuYW1lOworICBtbmdfZGF0YXAgICBwRGF0YTsKKyAgbW5nX2NodW5rcCAgcENodW5rOworICBtbmdfYm9vbCAgICBiQ29udDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9JVEVSQVRFX0NIVU5LUywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkgICAgICAgICAgICAvKiBjaGVjayB2YWxpZGl0eSBoYW5kbGUgKi8KKyAgcERhdGEgPSAoKG1uZ19kYXRhcCloSGFuZGxlKTsgICAgICAgIC8qIGFuZCBtYWtlIGl0IGFkZHJlc3NhYmxlICovCisKKyAgaVNlcSAgID0gMDsKKyAgYkNvbnQgID0gTU5HX1RSVUU7CisgIHBDaHVuayA9IHBEYXRhLT5wRmlyc3RjaHVuazsgICAgICAgICAvKiBnZXQgdGhlIGZpcnN0IGNodW5rICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhcyBsb25nIGFzIHRoZXJlIGFyZSBzb21lIG1vcmUgKi8KKyAgd2hpbGUgKChwQ2h1bmspICYmIChiQ29udCkpICAgICAgICAgIC8qIGFuZCB0aGUgYXBwIGRpZG4ndCBzaWduYWwgYSBzdG9wICovCisgIHsKKyAgICBpZiAoaVNlcSA+PSBpQ2h1bmtzZXEpICAgICAgICAgICAgIC8qIHJlYWNoZWQgdGhlIGZpcnN0IHRhcmdldCA/ICovCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGVuIGNhbGwgdGhpcyBhbmQgbmV4dCBvbmVzIGJhY2sgaW4uLi4gKi8KKyAgICAgIGlDaHVua25hbWUgPSAoKG1uZ19jaHVua19oZWFkZXJwKXBDaHVuayktPmlDaHVua25hbWU7CisgICAgICBiQ29udCAgICAgID0gZlByb2MgKGhIYW5kbGUsIChtbmdfaGFuZGxlKXBDaHVuaywgaUNodW5rbmFtZSwgaVNlcSk7CisgICAgfQorCisgICAgaVNlcSsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuZXh0IG9uZSAqLworICAgIHBDaHVuayA9ICgobW5nX2NodW5rX2hlYWRlcnApcENodW5rKS0+cE5leHQ7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9JVEVSQVRFX0NIVU5LUywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9XUklURQorbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX2NvcHlfY2h1bmsgKG1uZ19oYW5kbGUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaGFuZGxlIGhDaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaGFuZGxlIGhIYW5kbGVPdXQpCit7CisgIG1uZ19kYXRhcCAgIHBEYXRhT3V0OworICBtbmdfY2h1bmtwICBwQ2h1bms7CisgIG1uZ19jaHVua3AgIHBDaHVua091dDsKKyAgbW5nX3JldGNvZGUgaVJldGNvZGU7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fQ09QWV9DSFVOSywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkgICAgICAgICAgICAvKiBjaGVjayB2YWxpZGl0eSBoYW5kbGVzICovCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZU91dCkKKworICBwRGF0YU91dCA9IChtbmdfZGF0YXApaEhhbmRsZU91dDsgICAgLyogbWFrZSBvdXRoYW5kbGUgYWRkcmVzc2FibGUgKi8KKyAgcENodW5rICAgPSAobW5nX2NodW5rcCloQ2h1bms7ICAgICAgIC8qIGFkZHJlc3MgdGhlIGNodW5rICovCisKKyAgaWYgKCFwRGF0YU91dC0+YkNyZWF0aW5nKSAgICAgICAgICAgIC8qIGFyZW4ndCB3ZSBjcmVhdGluZyBhIG5ldyBmaWxlID8gKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhT3V0LCBNTkdfRlVOQ1RJT05JTlZBTElEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIGEgbmV3IGNodW5rICovCisgIGlSZXRjb2RlID0gKChtbmdfY3JlYXRlY2h1bmspKChtbmdfY2h1bmtfaGVhZGVycClwQ2h1bmspLT5mQ3JlYXRlKQorICAgICAgICAgICAgICAgICAgICAgICAgKHBEYXRhT3V0LCAoKG1uZ19jaHVua19oZWFkZXJwKXBDaHVuayksICZwQ2h1bmtPdXQpOworICBpZiAoIWlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAgLyogYXNzaWduIHRoZSBjaHVuay1zcGVjaWZpYyBkYXRhICovCisgICAgaVJldGNvZGUgPSAoKG1uZ19hc3NpZ25jaHVuaykoKG1uZ19jaHVua19oZWFkZXJwKXBDaHVuayktPmZBc3NpZ24pCisgICAgICAgICAgICAgICAgICAgICAgICAgIChwRGF0YU91dCwgcENodW5rT3V0LCBwQ2h1bmspOworCisgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgIHJldHVybiBpUmV0Y29kZTsgCisKKyAgbW5nX2FkZF9jaHVuayAocERhdGFPdXQsIHBDaHVua091dCk7IC8qIGFuZCBwdXQgaXQgaW4gdGhlIG91dHB1dC1zdHJlYW0gKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY291bGQgaXQgYmUgdGhlIGVuZCBvZiB0aGUgY2hhaW4gPyAqLworICBpZiAoKChtbmdfY2h1bmtfaGVhZGVycClwQ2h1bmtPdXQpLT5pQ2h1bmtuYW1lID09IE1OR19VSU5UX0lFTkQpCisgIHsKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgICBpZiAoKHBEYXRhT3V0LT5pRmlyc3RjaHVua2FkZGVkID09IE1OR19VSU5UX0lIRFIpIHx8CisgICAgICAgIChwRGF0YU91dC0+aUZpcnN0Y2h1bmthZGRlZCA9PSBNTkdfVUlOVF9KSERSKSAgICApCisjZWxzZQorICAgIGlmIChwRGF0YU91dC0+aUZpcnN0Y2h1bmthZGRlZCA9PSBNTkdfVUlOVF9JSERSKQorI2VuZGlmCisgICAgICBwRGF0YU91dC0+YkNyZWF0aW5nID0gTU5HX0ZBTFNFOyAvKiByaWdodDsgdGhpcyBzaG91bGQgYmUgdGhlIGxhc3QgY2h1bmsgISEhICovCisgIH0KKworICBpZiAoKChtbmdfY2h1bmtfaGVhZGVycClwQ2h1bmtPdXQpLT5pQ2h1bmtuYW1lID09IE1OR19VSU5UX01FTkQpCisgICAgcERhdGFPdXQtPmJDcmVhdGluZyA9IE1OR19GQUxTRTsgICAvKiBkZWZpbml0ZWx5IHRoaXMgc2hvdWxkIGJlIHRoZSBsYXN0ICEhISAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0NPUFlfQ0hVTkssIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmIC8qIE1OR19TVVBQT1JUX1dSSVRFICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19nZXRjaHVua19paGRyIChtbmdfaGFuZGxlIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2hhbmRsZSBoQ2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAqaVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgKmlIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAqaUJpdGRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgKmlDb2xvcnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAqaUNvbXByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgKmlGaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAqaUludGVybGFjZSkKK3sKKyAgbW5nX2RhdGFwIHBEYXRhOworICBtbmdfaWhkcnAgcENodW5rOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENIVU5LX0lIRFIsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhICA9IChtbmdfZGF0YXApaEhhbmRsZTsgICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworICBwQ2h1bmsgPSAobW5nX2loZHJwKWhDaHVuazsgICAgICAgICAgLyogYWRkcmVzcyB0aGUgY2h1bmsgKi8KKworICBpZiAocENodW5rLT5zSGVhZGVyLmlDaHVua25hbWUgIT0gTU5HX1VJTlRfSUhEUikKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfV1JPTkdDSFVOSykgIC8qIG91Y2ggKi8KKworICAqaVdpZHRoICAgICAgID0gcENodW5rLT5pV2lkdGg7ICAgICAgLyogZmlsbCB0aGUgZmllbGRzICovCisgICppSGVpZ2h0ICAgICAgPSBwQ2h1bmstPmlIZWlnaHQ7CisgICppQml0ZGVwdGggICAgPSBwQ2h1bmstPmlCaXRkZXB0aDsKKyAgKmlDb2xvcnR5cGUgICA9IHBDaHVuay0+aUNvbG9ydHlwZTsKKyAgKmlDb21wcmVzc2lvbiA9IHBDaHVuay0+aUNvbXByZXNzaW9uOworICAqaUZpbHRlciAgICAgID0gcENodW5rLT5pRmlsdGVyOworICAqaUludGVybGFjZSAgID0gcENodW5rLT5pSW50ZXJsYWNlOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaWxsIHRoZSBjaHVuayAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENIVU5LX0lIRFIsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfZ2V0Y2h1bmtfcGx0ZSAobW5nX2hhbmRsZSAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2hhbmRsZSAgIGhDaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgKmlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcGFsZXR0ZTggKmFQYWxldHRlKQoreworICBtbmdfZGF0YXAgcERhdGE7CisgIG1uZ19wbHRlcCBwQ2h1bms7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0hVTktfUExURSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkgICAgICAgICAgICAvKiBjaGVjayB2YWxpZGl0eSBoYW5kbGUgKi8KKyAgcERhdGEgID0gKG1uZ19kYXRhcCloSGFuZGxlOyAgICAgICAgIC8qIGFuZCBtYWtlIGl0IGFkZHJlc3NhYmxlICovCisgIHBDaHVuayA9IChtbmdfcGx0ZXApaENodW5rOyAgICAgICAgICAvKiBhZGRyZXNzIHRoZSBjaHVuayAqLworCisgIGlmIChwQ2h1bmstPnNIZWFkZXIuaUNodW5rbmFtZSAhPSBNTkdfVUlOVF9QTFRFKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19XUk9OR0NIVU5LKSAgLyogb3VjaCAqLworCisgICppQ291bnQgPSBwQ2h1bmstPmlFbnRyeWNvdW50OyAgICAgICAvKiBmaWxsIHRoZSBmaWVsZHMgKi8KKworICBNTkdfQ09QWSAoKmFQYWxldHRlLCBwQ2h1bmstPmFFbnRyaWVzLCBzaXplb2YgKG1uZ19wYWxldHRlOCkpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENIVU5LX1BMVEUsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfZ2V0Y2h1bmtfaWRhdCAobW5nX2hhbmRsZSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19oYW5kbGUgaENodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgKmlSYXdsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3B0ciAgICAqcFJhd2RhdGEpCit7CisgIG1uZ19kYXRhcCBwRGF0YTsKKyAgbW5nX2lkYXRwIHBDaHVuazsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRDSFVOS19JREFULCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFIChoSGFuZGxlKSAgICAgICAgICAgIC8qIGNoZWNrIHZhbGlkaXR5IGhhbmRsZSAqLworICBwRGF0YSAgPSAobW5nX2RhdGFwKWhIYW5kbGU7ICAgICAgICAgLyogYW5kIG1ha2UgaXQgYWRkcmVzc2FibGUgKi8KKyAgcENodW5rID0gKG1uZ19pZGF0cCloQ2h1bms7ICAgICAgICAgIC8qIGFkZHJlc3MgdGhlIGNodW5rICovCisKKyAgaWYgKHBDaHVuay0+c0hlYWRlci5pQ2h1bmtuYW1lICE9IE1OR19VSU5UX0lEQVQpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1dST05HQ0hVTkspICAvKiBvdWNoICovCisKKyAgKmlSYXdsZW4gID0gcENodW5rLT5pRGF0YXNpemU7ICAgICAgIC8qIGZpbGwgdGhlIGZpZWxkcyAqLworICAqcFJhd2RhdGEgPSBwQ2h1bmstPnBEYXRhOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENIVU5LX0lEQVQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfZ2V0Y2h1bmtfdHJucyAobW5nX2hhbmRsZSAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2hhbmRsZSAgIGhDaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfYm9vbCAgICAgKmJFbXB0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfYm9vbCAgICAgKmJHbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICppVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgKmlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhhcnIgKmFBbHBoYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAgICppR3JheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgKmlSZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAgICppR3JlZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAgICppQmx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgKmlSYXdsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4YXJyICphUmF3ZGF0YSkKK3sKKyAgbW5nX2RhdGFwIHBEYXRhOworICBtbmdfdHJuc3AgcENodW5rOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENIVU5LX1RSTlMsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhICA9IChtbmdfZGF0YXApaEhhbmRsZTsgICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworICBwQ2h1bmsgPSAobW5nX3RybnNwKWhDaHVuazsgICAgICAgICAgLyogYWRkcmVzcyB0aGUgY2h1bmsgKi8KKworICBpZiAocENodW5rLT5zSGVhZGVyLmlDaHVua25hbWUgIT0gTU5HX1VJTlRfdFJOUykKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfV1JPTkdDSFVOSykgIC8qIG91Y2ggKi8KKworICAqYkVtcHR5ICAgPSBwQ2h1bmstPmJFbXB0eTsgICAgICAgICAgLyogZmlsbCB0aGUgZmllbGRzICovCisgICpiR2xvYmFsICA9IHBDaHVuay0+Ykdsb2JhbDsKKyAgKmlUeXBlICAgID0gcENodW5rLT5pVHlwZTsKKyAgKmlDb3VudCAgID0gcENodW5rLT5pQ291bnQ7CisgICppR3JheSAgICA9IHBDaHVuay0+aUdyYXk7CisgICppUmVkICAgICA9IHBDaHVuay0+aVJlZDsKKyAgKmlHcmVlbiAgID0gcENodW5rLT5pR3JlZW47CisgICppQmx1ZSAgICA9IHBDaHVuay0+aUJsdWU7CisgICppUmF3bGVuICA9IHBDaHVuay0+aVJhd2xlbjsKKworICBNTkdfQ09QWSAoKmFBbHBoYXMsICBwQ2h1bmstPmFFbnRyaWVzLCBzaXplb2YgKG1uZ191aW50OGFycikpOworICBNTkdfQ09QWSAoKmFSYXdkYXRhLCBwQ2h1bmstPmFSYXdkYXRhLCBzaXplb2YgKG1uZ191aW50OGFycikpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENIVU5LX1RSTlMsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfZ0FNQQorbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX2dldGNodW5rX2dhbWEgKG1uZ19oYW5kbGUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaGFuZGxlIGhDaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfYm9vbCAgICpiRW1wdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAqaUdhbW1hKQoreworICBtbmdfZGF0YXAgcERhdGE7CisgIG1uZ19nYW1hcCBwQ2h1bms7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0hVTktfR0FNQSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkgICAgICAgICAgICAvKiBjaGVjayB2YWxpZGl0eSBoYW5kbGUgKi8KKyAgcERhdGEgID0gKG1uZ19kYXRhcCloSGFuZGxlOyAgICAgICAgIC8qIGFuZCBtYWtlIGl0IGFkZHJlc3NhYmxlICovCisgIHBDaHVuayA9IChtbmdfZ2FtYXApaENodW5rOyAgICAgICAgICAvKiBhZGRyZXNzIHRoZSBjaHVuayAqLworCisgIGlmIChwQ2h1bmstPnNIZWFkZXIuaUNodW5rbmFtZSAhPSBNTkdfVUlOVF9nQU1BKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19XUk9OR0NIVU5LKSAgLyogb3VjaCAqLworCisgICpiRW1wdHkgPSBwQ2h1bmstPmJFbXB0eTsgICAgICAgICAgICAvKiBmaWxsIHRoZSBmaWVsZHMgKi8KKyAgKmlHYW1tYSA9IHBDaHVuay0+aUdhbW1hOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENIVU5LX0dBTUEsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19jSFJNCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfZ2V0Y2h1bmtfY2hybSAobW5nX2hhbmRsZSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19oYW5kbGUgaENodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgKmJFbXB0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICppV2hpdGVwb2ludHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAqaVdoaXRlcG9pbnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgKmlSZWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgKmlSZWR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgKmlHcmVlbngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAqaUdyZWVueSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICppQmx1ZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAqaUJsdWV5KQoreworICBtbmdfZGF0YXAgcERhdGE7CisgIG1uZ19jaHJtcCBwQ2h1bms7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0hVTktfQ0hSTSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkgICAgICAgICAgICAvKiBjaGVjayB2YWxpZGl0eSBoYW5kbGUgKi8KKyAgcERhdGEgID0gKG1uZ19kYXRhcCloSGFuZGxlOyAgICAgICAgIC8qIGFuZCBtYWtlIGl0IGFkZHJlc3NhYmxlICovCisgIHBDaHVuayA9IChtbmdfY2hybXApaENodW5rOyAgICAgICAgICAvKiBhZGRyZXNzIHRoZSBjaHVuayAqLworCisgIGlmIChwQ2h1bmstPnNIZWFkZXIuaUNodW5rbmFtZSAhPSBNTkdfVUlOVF9jSFJNKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19XUk9OR0NIVU5LKSAgLyogb3VjaCAqLworCisgICpiRW1wdHkgICAgICAgPSBwQ2h1bmstPmJFbXB0eTsgICAgICAvKiBmaWxsIHRoZSBmaWVsZHMgKi8gICAgIAorICAqaVdoaXRlcG9pbnR4ID0gcENodW5rLT5pV2hpdGVwb2ludHg7CisgICppV2hpdGVwb2ludHkgPSBwQ2h1bmstPmlXaGl0ZXBvaW50eTsKKyAgKmlSZWR4ICAgICAgICA9IHBDaHVuay0+aVJlZHg7CisgICppUmVkeSAgICAgICAgPSBwQ2h1bmstPmlSZWR5OworICAqaUdyZWVueCAgICAgID0gcENodW5rLT5pR3JlZW54OworICAqaUdyZWVueSAgICAgID0gcENodW5rLT5pR3JlZW55OworICAqaUJsdWV4ICAgICAgID0gcENodW5rLT5pQmx1ZXg7CisgICppQmx1ZXkgICAgICAgPSBwQ2h1bmstPmlCbHVleTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRDSFVOS19DSFJNLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfc1JHQgorbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX2dldGNodW5rX3NyZ2IgKG1uZ19oYW5kbGUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaGFuZGxlIGhDaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfYm9vbCAgICpiRW1wdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAqaVJlbmRlcmluZ2ludGVudCkKK3sKKyAgbW5nX2RhdGFwIHBEYXRhOworICBtbmdfc3JnYnAgcENodW5rOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENIVU5LX1NSR0IsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhICA9IChtbmdfZGF0YXApaEhhbmRsZTsgICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworICBwQ2h1bmsgPSAobW5nX3NyZ2JwKWhDaHVuazsgICAgICAgICAgLyogYWRkcmVzcyB0aGUgY2h1bmsgKi8KKworICBpZiAocENodW5rLT5zSGVhZGVyLmlDaHVua25hbWUgIT0gTU5HX1VJTlRfc1JHQikKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfV1JPTkdDSFVOSykgIC8qIG91Y2ggKi8KKworICAqYkVtcHR5ICAgICAgICAgICA9IHBDaHVuay0+YkVtcHR5OyAgLyogZmlsbCB0aGUgZmllbGRzICovICAgICAgICAKKyAgKmlSZW5kZXJpbmdpbnRlbnQgPSBwQ2h1bmstPmlSZW5kZXJpbmdpbnRlbnQ7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0hVTktfU1JHQiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX2lDQ1AKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19nZXRjaHVua19pY2NwIChtbmdfaGFuZGxlIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2hhbmRsZSBoQ2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2Jvb2wgICAqYkVtcHR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgKmlOYW1lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcGNoYXIgICp6TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICppQ29tcHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAqaVByb2ZpbGVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wdHIgICAgKnBQcm9maWxlKQoreworICBtbmdfZGF0YXAgcERhdGE7CisgIG1uZ19pY2NwcCBwQ2h1bms7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0hVTktfSUNDUCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkgICAgICAgICAgICAvKiBjaGVjayB2YWxpZGl0eSBoYW5kbGUgKi8KKyAgcERhdGEgID0gKG1uZ19kYXRhcCloSGFuZGxlOyAgICAgICAgIC8qIGFuZCBtYWtlIGl0IGFkZHJlc3NhYmxlICovCisgIHBDaHVuayA9IChtbmdfaWNjcHApaENodW5rOyAgICAgICAgICAvKiBhZGRyZXNzIHRoZSBjaHVuayAqLworCisgIGlmIChwQ2h1bmstPnNIZWFkZXIuaUNodW5rbmFtZSAhPSBNTkdfVUlOVF9pQ0NQKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19XUk9OR0NIVU5LKSAgLyogb3VjaCAqLworCisgICpiRW1wdHkgICAgICAgPSBwQ2h1bmstPmJFbXB0eTsgICAgICAvKiBmaWxsIHRoZSBmaWVsZHMgKi8gICAgIAorICAqaU5hbWVzaXplICAgID0gcENodW5rLT5pTmFtZXNpemU7CisgICp6TmFtZSAgICAgICAgPSBwQ2h1bmstPnpOYW1lOworICAqaUNvbXByZXNzaW9uID0gcENodW5rLT5pQ29tcHJlc3Npb247CisgICppUHJvZmlsZXNpemUgPSBwQ2h1bmstPmlQcm9maWxlc2l6ZTsKKyAgKnBQcm9maWxlICAgICA9IHBDaHVuay0+cFByb2ZpbGU7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0hVTktfSUNDUCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX3RFWHQKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19nZXRjaHVua190ZXh0IChtbmdfaGFuZGxlIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2hhbmRsZSBoQ2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAqaUtleXdvcmRzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wY2hhciAgKnpLZXl3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgKmlUZXh0c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcGNoYXIgICp6VGV4dCkKK3sKKyAgbW5nX2RhdGFwIHBEYXRhOworICBtbmdfdGV4dHAgcENodW5rOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENIVU5LX1RFWFQsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhICA9IChtbmdfZGF0YXApaEhhbmRsZTsgICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworICBwQ2h1bmsgPSAobW5nX3RleHRwKWhDaHVuazsgICAgICAgICAgLyogYWRkcmVzcyB0aGUgY2h1bmsgKi8KKworICBpZiAocENodW5rLT5zSGVhZGVyLmlDaHVua25hbWUgIT0gTU5HX1VJTlRfdEVYdCkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfV1JPTkdDSFVOSykgIC8qIG91Y2ggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbGwgdGhlIGZpZWxkcyAqLworICAqaUtleXdvcmRzaXplID0gcENodW5rLT5pS2V5d29yZHNpemU7CisgICp6S2V5d29yZCAgICAgPSBwQ2h1bmstPnpLZXl3b3JkOworICAqaVRleHRzaXplICAgID0gcENodW5rLT5pVGV4dHNpemU7CisgICp6VGV4dCAgICAgICAgPSBwQ2h1bmstPnpUZXh0OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENIVU5LX1RFWFQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS196VFh0CittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfZ2V0Y2h1bmtfenR4dCAobW5nX2hhbmRsZSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19oYW5kbGUgaENodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgKmlLZXl3b3Jkc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcGNoYXIgICp6S2V5d29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICppQ29tcHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAqaVRleHRzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wY2hhciAgKnpUZXh0KQoreworICBtbmdfZGF0YXAgcERhdGE7CisgIG1uZ196dHh0cCBwQ2h1bms7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0hVTktfWlRYVCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkgICAgICAgICAgICAvKiBjaGVjayB2YWxpZGl0eSBoYW5kbGUgKi8KKyAgcERhdGEgID0gKG1uZ19kYXRhcCloSGFuZGxlOyAgICAgICAgIC8qIGFuZCBtYWtlIGl0IGFkZHJlc3NhYmxlICovCisgIHBDaHVuayA9IChtbmdfenR4dHApaENodW5rOyAgICAgICAgICAvKiBhZGRyZXNzIHRoZSBjaHVuayAqLworCisgIGlmIChwQ2h1bmstPnNIZWFkZXIuaUNodW5rbmFtZSAhPSBNTkdfVUlOVF96VFh0KQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19XUk9OR0NIVU5LKSAgLyogb3VjaCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmlsbCB0aGUgZmllbGRzICovCisgICppS2V5d29yZHNpemUgPSBwQ2h1bmstPmlLZXl3b3Jkc2l6ZTsKKyAgKnpLZXl3b3JkICAgICA9IHBDaHVuay0+ektleXdvcmQ7CisgICppQ29tcHJlc3Npb24gPSBwQ2h1bmstPmlDb21wcmVzc2lvbjsKKyAgKmlUZXh0c2l6ZSAgICA9IHBDaHVuay0+aVRleHRzaXplOworICAqelRleHQgICAgICAgID0gcENodW5rLT56VGV4dDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRDSFVOS19aVFhULCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfaVRYdAorbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX2dldGNodW5rX2l0eHQgKG1uZ19oYW5kbGUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaGFuZGxlIGhDaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICppS2V5d29yZHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3BjaGFyICAqektleXdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAqaUNvbXByZXNzaW9uZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICppQ29tcHJlc3Npb25tZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAqaUxhbmd1YWdlc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcGNoYXIgICp6TGFuZ3VhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAqaVRyYW5zbGF0aW9uc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcGNoYXIgICp6VHJhbnNsYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAqaVRleHRzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wY2hhciAgKnpUZXh0KQoreworICBtbmdfZGF0YXAgcERhdGE7CisgIG1uZ19pdHh0cCBwQ2h1bms7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0hVTktfSVRYVCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkgICAgICAgICAgICAvKiBjaGVjayB2YWxpZGl0eSBoYW5kbGUgKi8KKyAgcERhdGEgID0gKG1uZ19kYXRhcCloSGFuZGxlOyAgICAgICAgIC8qIGFuZCBtYWtlIGl0IGFkZHJlc3NhYmxlICovCisgIHBDaHVuayA9IChtbmdfaXR4dHApaENodW5rOyAgICAgICAgICAvKiBhZGRyZXNzIHRoZSBjaHVuayAqLworCisgIGlmIChwQ2h1bmstPnNIZWFkZXIuaUNodW5rbmFtZSAhPSBNTkdfVUlOVF9pVFh0KQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19XUk9OR0NIVU5LKSAgLyogb3VjaCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmlsbCB0aGUgZmllbGRzICovCisgICppS2V5d29yZHNpemUgICAgICAgPSBwQ2h1bmstPmlLZXl3b3Jkc2l6ZTsKKyAgKnpLZXl3b3JkICAgICAgICAgICA9IHBDaHVuay0+ektleXdvcmQ7CisgICppQ29tcHJlc3Npb25mbGFnICAgPSBwQ2h1bmstPmlDb21wcmVzc2lvbmZsYWc7CisgICppQ29tcHJlc3Npb25tZXRob2QgPSBwQ2h1bmstPmlDb21wcmVzc2lvbm1ldGhvZDsKKyAgKmlMYW5ndWFnZXNpemUgICAgICA9IHBDaHVuay0+aUxhbmd1YWdlc2l6ZTsKKyAgKnpMYW5ndWFnZSAgICAgICAgICA9IHBDaHVuay0+ekxhbmd1YWdlOworICAqaVRyYW5zbGF0aW9uc2l6ZSAgID0gcENodW5rLT5pVHJhbnNsYXRpb25zaXplOworICAqelRyYW5zbGF0aW9uICAgICAgID0gcENodW5rLT56VHJhbnNsYXRpb247CisgICppVGV4dHNpemUgICAgICAgICAgPSBwQ2h1bmstPmlUZXh0c2l6ZTsKKyAgKnpUZXh0ICAgICAgICAgICAgICA9IHBDaHVuay0+elRleHQ7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0hVTktfSVRYVCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX2JLR0QKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19nZXRjaHVua19ia2dkIChtbmdfaGFuZGxlIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2hhbmRsZSBoQ2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2Jvb2wgICAqYkVtcHR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgKmlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgKmlJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICppR3JheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICppUmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgKmlHcmVlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICppQmx1ZSkKK3sKKyAgbW5nX2RhdGFwIHBEYXRhOworICBtbmdfYmtnZHAgcENodW5rOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENIVU5LX0JLR0QsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhICA9IChtbmdfZGF0YXApaEhhbmRsZTsgICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworICBwQ2h1bmsgPSAobW5nX2JrZ2RwKWhDaHVuazsgICAgICAgICAgLyogYWRkcmVzcyB0aGUgY2h1bmsgKi8KKworICBpZiAocENodW5rLT5zSGVhZGVyLmlDaHVua25hbWUgIT0gTU5HX1VJTlRfYktHRCkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfV1JPTkdDSFVOSykgIC8qIG91Y2ggKi8KKworICAqYkVtcHR5ID0gcENodW5rLT5iRW1wdHk7ICAgICAgICAgICAgLyogZmlsbCB0aGUgZmllbGRzICovCisgICppVHlwZSAgPSBwQ2h1bmstPmlUeXBlOworICAqaUluZGV4ID0gcENodW5rLT5pSW5kZXg7CisgICppR3JheSAgPSBwQ2h1bmstPmlHcmF5OworICAqaVJlZCAgID0gcENodW5rLT5pUmVkOworICAqaUdyZWVuID0gcENodW5rLT5pR3JlZW47CisgICppQmx1ZSAgPSBwQ2h1bmstPmlCbHVlOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENIVU5LX0JLR0QsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19wSFlzCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfZ2V0Y2h1bmtfcGh5cyAobW5nX2hhbmRsZSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19oYW5kbGUgaENodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgKmJFbXB0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICppU2l6ZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAqaVNpemV5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgKmlVbml0KQoreworICBtbmdfZGF0YXAgcERhdGE7CisgIG1uZ19waHlzcCBwQ2h1bms7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0hVTktfUEhZUywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkgICAgICAgICAgICAvKiBjaGVjayB2YWxpZGl0eSBoYW5kbGUgKi8KKyAgcERhdGEgID0gKG1uZ19kYXRhcCloSGFuZGxlOyAgICAgICAgIC8qIGFuZCBtYWtlIGl0IGFkZHJlc3NhYmxlICovCisgIHBDaHVuayA9IChtbmdfcGh5c3ApaENodW5rOyAgICAgICAgICAvKiBhZGRyZXNzIHRoZSBjaHVuayAqLworCisgIGlmIChwQ2h1bmstPnNIZWFkZXIuaUNodW5rbmFtZSAhPSBNTkdfVUlOVF9wSFlzKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19XUk9OR0NIVU5LKSAgLyogb3VjaCAqLworCisgICpiRW1wdHkgPSBwQ2h1bmstPmJFbXB0eTsgICAgICAgICAgICAvKiBmaWxsIHRoZSBmaWVsZHMgKi8KKyAgKmlTaXpleCA9IHBDaHVuay0+aVNpemV4OworICAqaVNpemV5ID0gcENodW5rLT5pU2l6ZXk7CisgICppVW5pdCAgPSBwQ2h1bmstPmlVbml0OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENIVU5LX1BIWVMsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19zQklUCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfZ2V0Y2h1bmtfc2JpdCAobW5nX2hhbmRsZSAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19oYW5kbGUgICAgaENodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgICAgKmJFbXB0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICppVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhhcnI0ICphQml0cykKK3sKKyAgbW5nX2RhdGFwIHBEYXRhOworICBtbmdfc2JpdHAgcENodW5rOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENIVU5LX1NCSVQsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhICA9IChtbmdfZGF0YXApaEhhbmRsZTsgICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworICBwQ2h1bmsgPSAobW5nX3NiaXRwKWhDaHVuazsgICAgICAgICAgLyogYWRkcmVzcyB0aGUgY2h1bmsgKi8KKworICBpZiAocENodW5rLT5zSGVhZGVyLmlDaHVua25hbWUgIT0gTU5HX1VJTlRfc0JJVCkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfV1JPTkdDSFVOSykgIC8qIG91Y2ggKi8KKworICAqYkVtcHR5ICAgICA9IHBDaHVuay0+YkVtcHR5OworICAqaVR5cGUgICAgICA9IHBDaHVuay0+aVR5cGU7CisgICgqYUJpdHMpWzBdID0gcENodW5rLT5hQml0c1swXTsKKyAgKCphQml0cylbMV0gPSBwQ2h1bmstPmFCaXRzWzFdOworICAoKmFCaXRzKVsyXSA9IHBDaHVuay0+YUJpdHNbMl07CisgICgqYUJpdHMpWzNdID0gcENodW5rLT5hQml0c1szXTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRDSFVOS19TQklULCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfc1BMVAorbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX2dldGNodW5rX3NwbHQgKG1uZ19oYW5kbGUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaGFuZGxlIGhDaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfYm9vbCAgICpiRW1wdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAqaU5hbWVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wY2hhciAgKnpOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgKmlTYW1wbGVkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICppRW50cnljb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcHRyICAgICpwRW50cmllcykKK3sKKyAgbW5nX2RhdGFwIHBEYXRhOworICBtbmdfc3BsdHAgcENodW5rOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENIVU5LX1NQTFQsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhICA9IChtbmdfZGF0YXApaEhhbmRsZTsgICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworICBwQ2h1bmsgPSAobW5nX3NwbHRwKWhDaHVuazsgICAgICAgICAgLyogYWRkcmVzcyB0aGUgY2h1bmsgKi8KKworICBpZiAocENodW5rLT5zSGVhZGVyLmlDaHVua25hbWUgIT0gTU5HX1VJTlRfc1BMVCkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfV1JPTkdDSFVOSykgIC8qIG91Y2ggKi8KKworICAqYkVtcHR5ICAgICAgID0gcENodW5rLT5iRW1wdHk7ICAgICAgLyogZmlsbCB0aGUgZmllbGRzICovICAgICAgCisgICppTmFtZXNpemUgICAgPSBwQ2h1bmstPmlOYW1lc2l6ZTsKKyAgKnpOYW1lICAgICAgICA9IHBDaHVuay0+ek5hbWU7CisgICppU2FtcGxlZGVwdGggPSBwQ2h1bmstPmlTYW1wbGVkZXB0aDsKKyAgKmlFbnRyeWNvdW50ICA9IHBDaHVuay0+aUVudHJ5Y291bnQ7CisgICpwRW50cmllcyAgICAgPSBwQ2h1bmstPnBFbnRyaWVzOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENIVU5LX1NQTFQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19oSVNUCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfZ2V0Y2h1bmtfaGlzdCAobW5nX2hhbmRsZSAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19oYW5kbGUgICAgaENodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgKmlFbnRyeWNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTZhcnIgKmFFbnRyaWVzKQoreworICBtbmdfZGF0YXAgcERhdGE7CisgIG1uZ19oaXN0cCBwQ2h1bms7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0hVTktfSElTVCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkgICAgICAgICAgICAvKiBjaGVjayB2YWxpZGl0eSBoYW5kbGUgKi8KKyAgcERhdGEgID0gKG1uZ19kYXRhcCloSGFuZGxlOyAgICAgICAgIC8qIGFuZCBtYWtlIGl0IGFkZHJlc3NhYmxlICovCisgIHBDaHVuayA9IChtbmdfaGlzdHApaENodW5rOyAgICAgICAgICAvKiBhZGRyZXNzIHRoZSBjaHVuayAqLworCisgIGlmIChwQ2h1bmstPnNIZWFkZXIuaUNodW5rbmFtZSAhPSBNTkdfVUlOVF9oSVNUKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19XUk9OR0NIVU5LKSAgLyogb3VjaCAqLworCisgICppRW50cnljb3VudCA9IHBDaHVuay0+aUVudHJ5Y291bnQ7ICAvKiBmaWxsIHRoZSBmaWVsZHMgKi8KKworICBNTkdfQ09QWSAoKmFFbnRyaWVzLCBwQ2h1bmstPmFFbnRyaWVzLCBzaXplb2YgKG1uZ191aW50MTZhcnIpKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRDSFVOS19ISVNULCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfdElNRQorbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX2dldGNodW5rX3RpbWUgKG1uZ19oYW5kbGUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaGFuZGxlIGhDaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICppWWVhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICppTW9udGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAqaURheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICppSG91ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICppTWludXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgKmlTZWNvbmQpCit7CisgIG1uZ19kYXRhcCBwRGF0YTsKKyAgbW5nX3RpbWVwIHBDaHVuazsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRDSFVOS19USU1FLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFIChoSGFuZGxlKSAgICAgICAgICAgIC8qIGNoZWNrIHZhbGlkaXR5IGhhbmRsZSAqLworICBwRGF0YSAgPSAobW5nX2RhdGFwKWhIYW5kbGU7ICAgICAgICAgLyogYW5kIG1ha2UgaXQgYWRkcmVzc2FibGUgKi8KKyAgcENodW5rID0gKG1uZ190aW1lcCloQ2h1bms7ICAgICAgICAgIC8qIGFkZHJlc3MgdGhlIGNodW5rICovCisKKyAgaWYgKHBDaHVuay0+c0hlYWRlci5pQ2h1bmtuYW1lICE9IE1OR19VSU5UX3RJTUUpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1dST05HQ0hVTkspICAvKiBvdWNoICovCisKKyAgKmlZZWFyICAgPSBwQ2h1bmstPmlZZWFyOyAgICAgICAgICAgIC8qIGZpbGwgdGhlIGZpZWxkcyAqLyAKKyAgKmlNb250aCAgPSBwQ2h1bmstPmlNb250aDsKKyAgKmlEYXkgICAgPSBwQ2h1bmstPmlEYXk7CisgICppSG91ciAgID0gcENodW5rLT5pSG91cjsKKyAgKmlNaW51dGUgPSBwQ2h1bmstPmlNaW51dGU7CisgICppU2Vjb25kID0gcENodW5rLT5pU2Vjb25kOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENIVU5LX1RJTUUsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19nZXRjaHVua19taGRyIChtbmdfaGFuZGxlIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2hhbmRsZSBoQ2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAqaVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgKmlIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAqaVRpY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgKmlMYXllcmNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgKmlGcmFtZWNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgKmlQbGF5dGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICppU2ltcGxpY2l0eSkKK3sKKyAgbW5nX2RhdGFwIHBEYXRhOworICBtbmdfbWhkcnAgcENodW5rOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENIVU5LX01IRFIsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhICA9IChtbmdfZGF0YXApaEhhbmRsZTsgICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworICBwQ2h1bmsgPSAobW5nX21oZHJwKWhDaHVuazsgICAgICAgICAgLyogYWRkcmVzcyB0aGUgY2h1bmsgKi8KKworICBpZiAocENodW5rLT5zSGVhZGVyLmlDaHVua25hbWUgIT0gTU5HX1VJTlRfTUhEUikKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfV1JPTkdDSFVOSykgIC8qIG91Y2ggKi8KKworICAqaVdpZHRoICAgICAgPSBwQ2h1bmstPmlXaWR0aDsgICAgICAgLyogZmlsbCB0aGUgZmllbGRzICovICAgCisgICppSGVpZ2h0ICAgICA9IHBDaHVuay0+aUhlaWdodDsKKyAgKmlUaWNrcyAgICAgID0gcENodW5rLT5pVGlja3M7CisgICppTGF5ZXJjb3VudCA9IHBDaHVuay0+aUxheWVyY291bnQ7CisgICppRnJhbWVjb3VudCA9IHBDaHVuay0+aUZyYW1lY291bnQ7CisgICppUGxheXRpbWUgICA9IHBDaHVuay0+aVBsYXl0aW1lOworICAqaVNpbXBsaWNpdHkgPSBwQ2h1bmstPmlTaW1wbGljaXR5OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENIVU5LX01IRFIsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfTE9PUAorbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX2dldGNodW5rX2xvb3AgKG1uZ19oYW5kbGUgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2hhbmRsZSAgaENodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICppTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgKmlSZXBlYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgKmlUZXJtaW5hdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAqaUl0ZXJtaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgKmlJdGVybWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICppQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMnAgKnBTaWduYWxzKQoreworICBtbmdfZGF0YXAgcERhdGE7CisgIG1uZ19sb29wcCBwQ2h1bms7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0hVTktfTE9PUCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkgICAgICAgICAgICAvKiBjaGVjayB2YWxpZGl0eSBoYW5kbGUgKi8KKyAgcERhdGEgID0gKG1uZ19kYXRhcCloSGFuZGxlOyAgICAgICAgIC8qIGFuZCBtYWtlIGl0IGFkZHJlc3NhYmxlICovCisgIHBDaHVuayA9IChtbmdfbG9vcHApaENodW5rOyAgICAgICAgICAvKiBhZGRyZXNzIHRoZSBjaHVuayAqLworCisgIGlmIChwQ2h1bmstPnNIZWFkZXIuaUNodW5rbmFtZSAhPSBNTkdfVUlOVF9MT09QKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19XUk9OR0NIVU5LKSAgLyogb3VjaCAqLworCisgICppTGV2ZWwgICAgICAgPSBwQ2h1bmstPmlMZXZlbDsgICAgICAvKiBmaWxsIHRlaCBmaWVsZHMgKi8KKyAgKmlSZXBlYXQgICAgICA9IHBDaHVuay0+aVJlcGVhdDsKKyAgKmlUZXJtaW5hdGlvbiA9IHBDaHVuay0+aVRlcm1pbmF0aW9uOworICAqaUl0ZXJtaW4gICAgID0gcENodW5rLT5pSXRlcm1pbjsKKyAgKmlJdGVybWF4ICAgICA9IHBDaHVuay0+aUl0ZXJtYXg7CisgICppQ291bnQgICAgICAgPSBwQ2h1bmstPmlDb3VudDsKKyAgKnBTaWduYWxzICAgICA9IHBDaHVuay0+cFNpZ25hbHM7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0hVTktfTE9PUCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19nZXRjaHVua19lbmRsIChtbmdfaGFuZGxlIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2hhbmRsZSBoQ2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAqaUxldmVsKQoreworICBtbmdfZGF0YXAgcERhdGE7CisgIG1uZ19lbmRscCBwQ2h1bms7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0hVTktfRU5ETCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkgICAgICAgICAgICAvKiBjaGVjayB2YWxpZGl0eSBoYW5kbGUgKi8KKyAgcERhdGEgID0gKG1uZ19kYXRhcCloSGFuZGxlOyAgICAgICAgIC8qIGFuZCBtYWtlIGl0IGFkZHJlc3NhYmxlICovCisgIHBDaHVuayA9IChtbmdfZW5kbHApaENodW5rOyAgICAgICAgICAvKiBhZGRyZXNzIHRoZSBjaHVuayAqLworCisgIGlmIChwQ2h1bmstPnNIZWFkZXIuaUNodW5rbmFtZSAhPSBNTkdfVUlOVF9FTkRMKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19XUk9OR0NIVU5LKSAgLyogb3VjaCAqLworCisgICppTGV2ZWwgPSBwQ2h1bmstPmlMZXZlbDsgICAgICAgICAgICAvKiBmaWxsIHRoZSBmaWVsZCAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENIVU5LX0VOREwsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19ERUZJCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfZ2V0Y2h1bmtfZGVmaSAobW5nX2hhbmRsZSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19oYW5kbGUgaENodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgKmlPYmplY3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICppRG9ub3RzaG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgKmlDb25jcmV0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfYm9vbCAgICpiSGFzbG9jYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgICppWGxvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgKmlZbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2Jvb2wgICAqYkhhc2NsaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICAqaUxlZnRjYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgICppUmlnaHRjYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgICppVG9wY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICAqaUJvdHRvbWNiKQoreworICBtbmdfZGF0YXAgcERhdGE7CisgIG1uZ19kZWZpcCBwQ2h1bms7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0hVTktfREVGSSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkgICAgICAgICAgICAvKiBjaGVjayB2YWxpZGl0eSBoYW5kbGUgKi8KKyAgcERhdGEgID0gKG1uZ19kYXRhcCloSGFuZGxlOyAgICAgICAgIC8qIGFuZCBtYWtlIGl0IGFkZHJlc3NhYmxlICovCisgIHBDaHVuayA9IChtbmdfZGVmaXApaENodW5rOyAgICAgICAgICAvKiBhZGRyZXNzIHRoZSBjaHVuayAqLworCisgIGlmIChwQ2h1bmstPnNIZWFkZXIuaUNodW5rbmFtZSAhPSBNTkdfVUlOVF9ERUZJKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19XUk9OR0NIVU5LKSAgLyogb3VjaCAqLworCisgICppT2JqZWN0aWQgID0gcENodW5rLT5pT2JqZWN0aWQ7ICAgICAvKiBmaWxsIHRoZSBmaWVsZHMgKi8KKyAgKmlEb25vdHNob3cgPSBwQ2h1bmstPmlEb25vdHNob3c7CisgICppQ29uY3JldGUgID0gcENodW5rLT5pQ29uY3JldGU7CisgICpiSGFzbG9jYSAgID0gcENodW5rLT5iSGFzbG9jYTsKKyAgKmlYbG9jYXRpb24gPSBwQ2h1bmstPmlYbG9jYXRpb247CisgICppWWxvY2F0aW9uID0gcENodW5rLT5pWWxvY2F0aW9uOworICAqYkhhc2NsaXAgICA9IHBDaHVuay0+Ykhhc2NsaXA7CisgICppTGVmdGNiICAgID0gcENodW5rLT5pTGVmdGNiOworICAqaVJpZ2h0Y2IgICA9IHBDaHVuay0+aVJpZ2h0Y2I7CisgICppVG9wY2IgICAgID0gcENodW5rLT5pVG9wY2I7CisgICppQm90dG9tY2IgID0gcENodW5rLT5pQm90dG9tY2I7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0hVTktfREVGSSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX0JBU0kKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19nZXRjaHVua19iYXNpIChtbmdfaGFuZGxlIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2hhbmRsZSBoQ2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAqaVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgKmlIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAqaUJpdGRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgKmlDb2xvcnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAqaUNvbXByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgKmlGaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAqaUludGVybGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICppUmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgKmlHcmVlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICppQmx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICppQWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAqaVZpZXdhYmxlKQoreworICBtbmdfZGF0YXAgcERhdGE7CisgIG1uZ19iYXNpcCBwQ2h1bms7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0hVTktfQkFTSSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkgICAgICAgICAgICAvKiBjaGVjayB2YWxpZGl0eSBoYW5kbGUgKi8KKyAgcERhdGEgID0gKG1uZ19kYXRhcCloSGFuZGxlOyAgICAgICAgIC8qIGFuZCBtYWtlIGl0IGFkZHJlc3NhYmxlICovCisgIHBDaHVuayA9IChtbmdfYmFzaXApaENodW5rOyAgICAgICAgICAvKiBhZGRyZXNzIHRoZSBjaHVuayAqLworCisgIGlmIChwQ2h1bmstPnNIZWFkZXIuaUNodW5rbmFtZSAhPSBNTkdfVUlOVF9CQVNJKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19XUk9OR0NIVU5LKSAgLyogb3VjaCAqLworCisgICppV2lkdGggICAgICAgPSBwQ2h1bmstPmlXaWR0aDsgICAgICAvKiBmaWxsIHRoZSBmaWVsZHMgKi8KKyAgKmlIZWlnaHQgICAgICA9IHBDaHVuay0+aUhlaWdodDsKKyAgKmlCaXRkZXB0aCAgICA9IHBDaHVuay0+aUJpdGRlcHRoOworICAqaUNvbG9ydHlwZSAgID0gcENodW5rLT5pQ29sb3J0eXBlOworICAqaUNvbXByZXNzaW9uID0gcENodW5rLT5pQ29tcHJlc3Npb247CisgICppRmlsdGVyICAgICAgPSBwQ2h1bmstPmlGaWx0ZXI7CisgICppSW50ZXJsYWNlICAgPSBwQ2h1bmstPmlJbnRlcmxhY2U7CisgICppUmVkICAgICAgICAgPSBwQ2h1bmstPmlSZWQ7CisgICppR3JlZW4gICAgICAgPSBwQ2h1bmstPmlHcmVlbjsKKyAgKmlCbHVlICAgICAgICA9IHBDaHVuay0+aUJsdWU7CisgICppQWxwaGEgICAgICAgPSBwQ2h1bmstPmlBbHBoYTsKKyAgKmlWaWV3YWJsZSAgICA9IHBDaHVuay0+aVZpZXdhYmxlOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENIVU5LX0JBU0ksIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19DTE9OCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfZ2V0Y2h1bmtfY2xvbiAobW5nX2hhbmRsZSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19oYW5kbGUgaENodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgKmlTb3VyY2VpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICppQ2xvbmVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICppQ2xvbmV0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgKmlEb25vdHNob3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAqaUNvbmNyZXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgKmJIYXNsb2NhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgKmlMb2NhdGlvbnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICAqaUxvY2F0aW9ueCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgICppTG9jYXRpb255KQoreworICBtbmdfZGF0YXAgcERhdGE7CisgIG1uZ19jbG9ucCBwQ2h1bms7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0hVTktfQ0xPTiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkgICAgICAgICAgICAvKiBjaGVjayB2YWxpZGl0eSBoYW5kbGUgKi8KKyAgcERhdGEgID0gKG1uZ19kYXRhcCloSGFuZGxlOyAgICAgICAgIC8qIGFuZCBtYWtlIGl0IGFkZHJlc3NhYmxlICovCisgIHBDaHVuayA9IChtbmdfY2xvbnApaENodW5rOyAgICAgICAgICAvKiBhZGRyZXNzIHRoZSBjaHVuayAqLworCisgIGlmIChwQ2h1bmstPnNIZWFkZXIuaUNodW5rbmFtZSAhPSBNTkdfVUlOVF9DTE9OKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19XUk9OR0NIVU5LKSAgLyogb3VjaCAqLworCisgICppU291cmNlaWQgICAgID0gcENodW5rLT5pU291cmNlaWQ7ICAvKiBmaWxsIHRoZSBmaWVsZHMgKi8gIAorICAqaUNsb25laWQgICAgICA9IHBDaHVuay0+aUNsb25laWQ7CisgICppQ2xvbmV0eXBlICAgID0gcENodW5rLT5pQ2xvbmV0eXBlOworICAqaURvbm90c2hvdyAgICA9IHBDaHVuay0+aURvbm90c2hvdzsKKyAgKmlDb25jcmV0ZSAgICAgPSBwQ2h1bmstPmlDb25jcmV0ZTsKKyAgKmJIYXNsb2NhICAgICAgPSBwQ2h1bmstPmJIYXNsb2NhOworICAqaUxvY2F0aW9udHlwZSA9IHBDaHVuay0+aUxvY2F0aW9udHlwZTsKKyAgKmlMb2NhdGlvbnggICAgPSBwQ2h1bmstPmlMb2NhdGlvbng7CisgICppTG9jYXRpb255ICAgID0gcENodW5rLT5pTG9jYXRpb255OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENIVU5LX0NMT04sIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19QQVNUCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfZ2V0Y2h1bmtfcGFzdCAobW5nX2hhbmRsZSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19oYW5kbGUgaENodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgKmlEZXN0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAqaVRhcmdldHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICAqaVRhcmdldHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICAqaVRhcmdldHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAqaUNvdW50KQoreworICBtbmdfZGF0YXAgcERhdGE7CisgIG1uZ19wYXN0cCBwQ2h1bms7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0hVTktfUEFTVCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkgICAgICAgICAgICAvKiBjaGVjayB2YWxpZGl0eSBoYW5kbGUgKi8KKyAgcERhdGEgID0gKG1uZ19kYXRhcCloSGFuZGxlOyAgICAgICAgIC8qIGFuZCBtYWtlIGl0IGFkZHJlc3NhYmxlICovCisgIHBDaHVuayA9IChtbmdfcGFzdHApaENodW5rOyAgICAgICAgICAvKiBhZGRyZXNzIHRoZSBjaHVuayAqLworCisgIGlmIChwQ2h1bmstPnNIZWFkZXIuaUNodW5rbmFtZSAhPSBNTkdfVUlOVF9QQVNUKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19XUk9OR0NIVU5LKSAgLyogb3VjaCAqLworCisgICppRGVzdGlkICAgICA9IHBDaHVuay0+aURlc3RpZDsgICAgICAgLyogZmlsbCB0aGUgZmllbGRzICovCisgICppVGFyZ2V0dHlwZSA9IHBDaHVuay0+aVRhcmdldHR5cGU7CisgICppVGFyZ2V0eCAgICA9IHBDaHVuay0+aVRhcmdldHg7CisgICppVGFyZ2V0eSAgICA9IHBDaHVuay0+aVRhcmdldHk7CisgICppQ291bnQgICAgICA9IHBDaHVuay0+aUNvdW50OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENIVU5LX1BBU1QsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19QQVNUCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfZ2V0Y2h1bmtfcGFzdF9zcmMgKG1uZ19oYW5kbGUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2hhbmRsZSBoQ2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaUVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICppU291cmNlaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgKmlDb21wb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAqaU9yaWVudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICppT2Zmc2V0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICAqaU9mZnNldHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgKmlPZmZzZXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICppQm91bmRhcnl0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgICppQm91bmRhcnlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgICppQm91bmRhcnlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgICppQm91bmRhcnl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgICppQm91bmRhcnliKQoreworICBtbmdfZGF0YXAgICAgICAgIHBEYXRhOworICBtbmdfcGFzdHAgICAgICAgIHBDaHVuazsKKyAgbW5nX3Bhc3Rfc291cmNlcCBwRW50cnk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0hVTktfUEFTVF9TUkMsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhICA9IChtbmdfZGF0YXApaEhhbmRsZTsgICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworICBwQ2h1bmsgPSAobW5nX3Bhc3RwKWhDaHVuazsgICAgICAgICAgLyogYWRkcmVzcyB0aGUgY2h1bmsgKi8KKworICBpZiAocENodW5rLT5zSGVhZGVyLmlDaHVua25hbWUgIT0gTU5HX1VJTlRfUEFTVCkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfV1JPTkdDSFVOSykgIC8qIG91Y2ggKi8KKworICBpZiAoaUVudHJ5ID49IHBDaHVuay0+aUNvdW50KSAgICAgICAgLyogdmFsaWQgaW5kZXggPyAqLworICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElERU5UUllJWCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHJlc3MgdGhlIGVudHJ5ICovCisgIHBFbnRyeSAgICAgICAgID0gcENodW5rLT5wU291cmNlcyArIGlFbnRyeTsKKworICAqaVNvdXJjZWlkICAgICA9IHBFbnRyeS0+aVNvdXJjZWlkOyAgLyogZmlsbCB0aGUgZmllbGRzICovCisgICppQ29tcG9zaXRpb24gID0gcEVudHJ5LT5pQ29tcG9zaXRpb247CisgICppT3JpZW50YXRpb24gID0gcEVudHJ5LT5pT3JpZW50YXRpb247CisgICppT2Zmc2V0dHlwZSAgID0gcEVudHJ5LT5pT2Zmc2V0dHlwZTsKKyAgKmlPZmZzZXR4ICAgICAgPSBwRW50cnktPmlPZmZzZXR4OworICAqaU9mZnNldHkgICAgICA9IHBFbnRyeS0+aU9mZnNldHk7CisgICppQm91bmRhcnl0eXBlID0gcEVudHJ5LT5pQm91bmRhcnl0eXBlOworICAqaUJvdW5kYXJ5bCAgICA9IHBFbnRyeS0+aUJvdW5kYXJ5bDsKKyAgKmlCb3VuZGFyeXIgICAgPSBwRW50cnktPmlCb3VuZGFyeXI7CisgICppQm91bmRhcnl0ICAgID0gcEVudHJ5LT5pQm91bmRhcnl0OworICAqaUJvdW5kYXJ5YiAgICA9IHBFbnRyeS0+aUJvdW5kYXJ5YjsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRDSFVOS19QQVNUX1NSQywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX0RJU0MKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19nZXRjaHVua19kaXNjIChtbmdfaGFuZGxlICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19oYW5kbGUgIGhDaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAqaUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTZwICpwT2JqZWN0aWRzKQoreworICBtbmdfZGF0YXAgcERhdGE7CisgIG1uZ19kaXNjcCBwQ2h1bms7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0hVTktfRElTQywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkgICAgICAgICAgICAvKiBjaGVjayB2YWxpZGl0eSBoYW5kbGUgKi8KKyAgcERhdGEgID0gKG1uZ19kYXRhcCloSGFuZGxlOyAgICAgICAgIC8qIGFuZCBtYWtlIGl0IGFkZHJlc3NhYmxlICovCisgIHBDaHVuayA9IChtbmdfZGlzY3ApaENodW5rOyAgICAgICAgICAvKiBhZGRyZXNzIHRoZSBjaHVuayAqLworCisgIGlmIChwQ2h1bmstPnNIZWFkZXIuaUNodW5rbmFtZSAhPSBNTkdfVUlOVF9ESVNDKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19XUk9OR0NIVU5LKSAgLyogb3VjaCAqLworCisgICppQ291bnQgICAgID0gcENodW5rLT5pQ291bnQ7ICAgICAgICAvKiBmaWxsIHRoZSBmaWVsZHMgKi8KKyAgKnBPYmplY3RpZHMgPSBwQ2h1bmstPnBPYmplY3RpZHM7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0hVTktfRElTQywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX0JBQ0sKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19nZXRjaHVua19iYWNrIChtbmdfaGFuZGxlIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2hhbmRsZSBoQ2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAqaVJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICppR3JlZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAqaUJsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAqaU1hbmRhdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICppSW1hZ2VpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICppVGlsZSkKK3sKKyAgbW5nX2RhdGFwIHBEYXRhOworICBtbmdfYmFja3AgcENodW5rOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENIVU5LX0JBQ0ssIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhICA9IChtbmdfZGF0YXApaEhhbmRsZTsgICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworICBwQ2h1bmsgPSAobW5nX2JhY2twKWhDaHVuazsgICAgICAgICAgLyogYWRkcmVzcyB0aGUgY2h1bmsgKi8KKworICBpZiAocENodW5rLT5zSGVhZGVyLmlDaHVua25hbWUgIT0gTU5HX1VJTlRfQkFDSykKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfV1JPTkdDSFVOSykgIC8qIG91Y2ggKi8KKworICAqaVJlZCAgICAgICA9IHBDaHVuay0+aVJlZDsgICAgICAgICAgLyogZmlsbCB0aGUgZmllbGRzICovCisgICppR3JlZW4gICAgID0gcENodW5rLT5pR3JlZW47CisgICppQmx1ZSAgICAgID0gcENodW5rLT5pQmx1ZTsKKyAgKmlNYW5kYXRvcnkgPSBwQ2h1bmstPmlNYW5kYXRvcnk7CisgICppSW1hZ2VpZCAgID0gcENodW5rLT5pSW1hZ2VpZDsKKyAgKmlUaWxlICAgICAgPSBwQ2h1bmstPmlUaWxlOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENIVU5LX0JBQ0ssIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19GUkFNCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfZ2V0Y2h1bmtfZnJhbSAobW5nX2hhbmRsZSAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaGFuZGxlICBoQ2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2Jvb2wgICAgKmJFbXB0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAqaU1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgKmlOYW1lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcGNoYXIgICAqek5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgKmlDaGFuZ2VkZWxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAqaUNoYW5nZXRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgKmlDaGFuZ2VjbGlwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAqaUNoYW5nZXN5bmNpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAqaURlbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICppVGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAqaUJvdW5kYXJ5dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgICAqaUJvdW5kYXJ5bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgICAqaUJvdW5kYXJ5ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgICAqaUJvdW5kYXJ5dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgICAqaUJvdW5kYXJ5YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAqaUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzJwICpwU3luY2lkcykKK3sKKyAgbW5nX2RhdGFwIHBEYXRhOworICBtbmdfZnJhbXAgcENodW5rOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENIVU5LX0ZSQU0sIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhICA9IChtbmdfZGF0YXApaEhhbmRsZTsgICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworICBwQ2h1bmsgPSAobW5nX2ZyYW1wKWhDaHVuazsgICAgICAgICAgLyogYWRkcmVzcyB0aGUgY2h1bmsgKi8KKworICBpZiAocENodW5rLT5zSGVhZGVyLmlDaHVua25hbWUgIT0gTU5HX1VJTlRfRlJBTSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfV1JPTkdDSFVOSykgIC8qIG91Y2ggKi8KKworICAqYkVtcHR5ICAgICAgICAgID0gcENodW5rLT5iRW1wdHk7ICAgLyogZmlsbCB0aGUgZmllbGRzICovICAgICAgCisgICppTW9kZSAgICAgICAgICAgPSBwQ2h1bmstPmlNb2RlOworICAqaU5hbWVzaXplICAgICAgID0gcENodW5rLT5pTmFtZXNpemU7CisgICp6TmFtZSAgICAgICAgICAgPSBwQ2h1bmstPnpOYW1lOworICAqaUNoYW5nZWRlbGF5ICAgID0gcENodW5rLT5pQ2hhbmdlZGVsYXk7CisgICppQ2hhbmdldGltZW91dCAgPSBwQ2h1bmstPmlDaGFuZ2V0aW1lb3V0OworICAqaUNoYW5nZWNsaXBwaW5nID0gcENodW5rLT5pQ2hhbmdlY2xpcHBpbmc7CisgICppQ2hhbmdlc3luY2lkICAgPSBwQ2h1bmstPmlDaGFuZ2VzeW5jaWQ7CisgICppRGVsYXkgICAgICAgICAgPSBwQ2h1bmstPmlEZWxheTsKKyAgKmlUaW1lb3V0ICAgICAgICA9IHBDaHVuay0+aVRpbWVvdXQ7CisgICppQm91bmRhcnl0eXBlICAgPSBwQ2h1bmstPmlCb3VuZGFyeXR5cGU7CisgICppQm91bmRhcnlsICAgICAgPSBwQ2h1bmstPmlCb3VuZGFyeWw7CisgICppQm91bmRhcnlyICAgICAgPSBwQ2h1bmstPmlCb3VuZGFyeXI7CisgICppQm91bmRhcnl0ICAgICAgPSBwQ2h1bmstPmlCb3VuZGFyeXQ7CisgICppQm91bmRhcnliICAgICAgPSBwQ2h1bmstPmlCb3VuZGFyeWI7CisgICppQ291bnQgICAgICAgICAgPSBwQ2h1bmstPmlDb3VudDsKKyAgKnBTeW5jaWRzICAgICAgICA9IHBDaHVuay0+cFN5bmNpZHM7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0hVTktfRlJBTSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX01PVkUKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19nZXRjaHVua19tb3ZlIChtbmdfaGFuZGxlIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2hhbmRsZSBoQ2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAqaUZpcnN0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAqaUxhc3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICppTW92ZXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICAqaU1vdmV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgKmlNb3ZleSkKK3sKKyAgbW5nX2RhdGFwIHBEYXRhOworICBtbmdfbW92ZXAgcENodW5rOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENIVU5LX01PVkUsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhICA9IChtbmdfZGF0YXApaEhhbmRsZTsgICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworICBwQ2h1bmsgPSAobW5nX21vdmVwKWhDaHVuazsgICAgICAgICAgLyogYWRkcmVzcyB0aGUgY2h1bmsgKi8KKworICBpZiAocENodW5rLT5zSGVhZGVyLmlDaHVua25hbWUgIT0gTU5HX1VJTlRfTU9WRSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfV1JPTkdDSFVOSykgIC8qIG91Y2ggKi8KKworICAqaUZpcnN0aWQgID0gcENodW5rLT5pRmlyc3RpZDsgICAgICAgLyogZmlsbCB0aGUgZmllbGRzICovCisgICppTGFzdGlkICAgPSBwQ2h1bmstPmlMYXN0aWQ7CisgICppTW92ZXR5cGUgPSBwQ2h1bmstPmlNb3ZldHlwZTsKKyAgKmlNb3ZleCAgICA9IHBDaHVuay0+aU1vdmV4OworICAqaU1vdmV5ICAgID0gcENodW5rLT5pTW92ZXk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0hVTktfTU9WRSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX0NMSVAKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19nZXRjaHVua19jbGlwIChtbmdfaGFuZGxlIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2hhbmRsZSBoQ2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAqaUZpcnN0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAqaUxhc3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICppQ2xpcHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICAqaUNsaXBsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgKmlDbGlwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgICppQ2xpcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICAqaUNsaXBiKQoreworICBtbmdfZGF0YXAgcERhdGE7CisgIG1uZ19jbGlwcCBwQ2h1bms7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0hVTktfQ0xJUCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkgICAgICAgICAgICAvKiBjaGVjayB2YWxpZGl0eSBoYW5kbGUgKi8KKyAgcERhdGEgID0gKG1uZ19kYXRhcCloSGFuZGxlOyAgICAgICAgIC8qIGFuZCBtYWtlIGl0IGFkZHJlc3NhYmxlICovCisgIHBDaHVuayA9IChtbmdfY2xpcHApaENodW5rOyAgICAgICAgICAvKiBhZGRyZXNzIHRoZSBjaHVuayAqLworCisgIGlmIChwQ2h1bmstPnNIZWFkZXIuaUNodW5rbmFtZSAhPSBNTkdfVUlOVF9DTElQKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19XUk9OR0NIVU5LKSAgLyogb3VjaCAqLworCisgICppRmlyc3RpZCAgPSBwQ2h1bmstPmlGaXJzdGlkOyAgICAgICAvKiBmaWxsIHRoZSBmaWVsZHMgKi8KKyAgKmlMYXN0aWQgICA9IHBDaHVuay0+aUxhc3RpZDsKKyAgKmlDbGlwdHlwZSA9IHBDaHVuay0+aUNsaXB0eXBlOworICAqaUNsaXBsICAgID0gcENodW5rLT5pQ2xpcGw7CisgICppQ2xpcHIgICAgPSBwQ2h1bmstPmlDbGlwcjsKKyAgKmlDbGlwdCAgICA9IHBDaHVuay0+aUNsaXB0OworICAqaUNsaXBiICAgID0gcENodW5rLT5pQ2xpcGI7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0hVTktfQ0xJUCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX1NIT1cKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19nZXRjaHVua19zaG93IChtbmdfaGFuZGxlIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2hhbmRsZSBoQ2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2Jvb2wgICAqYkVtcHR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgKmlGaXJzdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgKmlMYXN0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAqaU1vZGUpCit7CisgIG1uZ19kYXRhcCBwRGF0YTsKKyAgbW5nX3Nob3dwIHBDaHVuazsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRDSFVOS19TSE9XLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFIChoSGFuZGxlKSAgICAgICAgICAgIC8qIGNoZWNrIHZhbGlkaXR5IGhhbmRsZSAqLworICBwRGF0YSAgPSAobW5nX2RhdGFwKWhIYW5kbGU7ICAgICAgICAgLyogYW5kIG1ha2UgaXQgYWRkcmVzc2FibGUgKi8KKyAgcENodW5rID0gKG1uZ19zaG93cCloQ2h1bms7ICAgICAgICAgIC8qIGFkZHJlc3MgdGhlIGNodW5rICovCisKKyAgaWYgKHBDaHVuay0+c0hlYWRlci5pQ2h1bmtuYW1lICE9IE1OR19VSU5UX1NIT1cpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1dST05HQ0hVTkspICAvKiBvdWNoICovCisKKyAgKmJFbXB0eSAgID0gcENodW5rLT5iRW1wdHk7ICAgICAgICAgIC8qIGZpbGwgdGhlIGZpZWxkcyAqLworICAqaUZpcnN0aWQgPSBwQ2h1bmstPmlGaXJzdGlkOworICAqaUxhc3RpZCAgPSBwQ2h1bmstPmlMYXN0aWQ7CisgICppTW9kZSAgICA9IHBDaHVuay0+aU1vZGU7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0hVTktfU0hPVywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX1RFUk0KK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19nZXRjaHVua190ZXJtIChtbmdfaGFuZGxlIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2hhbmRsZSBoQ2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAqaVRlcm1hY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAqaUl0ZXJhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAqaURlbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgKmlJdGVybWF4KQoreworICBtbmdfZGF0YXAgcERhdGE7CisgIG1uZ190ZXJtcCBwQ2h1bms7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0hVTktfVEVSTSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkgICAgICAgICAgICAvKiBjaGVjayB2YWxpZGl0eSBoYW5kbGUgKi8KKyAgcERhdGEgID0gKG1uZ19kYXRhcCloSGFuZGxlOyAgICAgICAgIC8qIGFuZCBtYWtlIGl0IGFkZHJlc3NhYmxlICovCisgIHBDaHVuayA9IChtbmdfdGVybXApaENodW5rOyAgICAgICAgICAvKiBhZGRyZXNzIHRoZSBjaHVuayAqLworCisgIGlmIChwQ2h1bmstPnNIZWFkZXIuaUNodW5rbmFtZSAhPSBNTkdfVUlOVF9URVJNKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19XUk9OR0NIVU5LKSAgLyogb3VjaCAqLworCisgICppVGVybWFjdGlvbiA9IHBDaHVuay0+aVRlcm1hY3Rpb247ICAvKiBmaWxsIHRoZSBmaWVsZHMgKi8KKyAgKmlJdGVyYWN0aW9uID0gcENodW5rLT5pSXRlcmFjdGlvbjsKKyAgKmlEZWxheSAgICAgID0gcENodW5rLT5pRGVsYXk7CisgICppSXRlcm1heCAgICA9IHBDaHVuay0+aUl0ZXJtYXg7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0hVTktfVEVSTSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX1NBVkUKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19nZXRjaHVua19zYXZlIChtbmdfaGFuZGxlIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2hhbmRsZSBoQ2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2Jvb2wgICAqYkVtcHR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgKmlPZmZzZXR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgKmlDb3VudCkKK3sKKyAgbW5nX2RhdGFwIHBEYXRhOworICBtbmdfc2F2ZXAgcENodW5rOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENIVU5LX1NBVkUsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhICA9IChtbmdfZGF0YXApaEhhbmRsZTsgICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworICBwQ2h1bmsgPSAobW5nX3NhdmVwKWhDaHVuazsgICAgICAgICAgLyogYWRkcmVzcyB0aGUgY2h1bmsgKi8KKworICBpZiAocENodW5rLT5zSGVhZGVyLmlDaHVua25hbWUgIT0gTU5HX1VJTlRfU0FWRSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfV1JPTkdDSFVOSykgIC8qIG91Y2ggKi8KKworICAqYkVtcHR5ICAgICAgPSBwQ2h1bmstPmJFbXB0eTsgICAgICAgLyogZmlsbCB0aGUgZmllbGRzICovCisgICppT2Zmc2V0dHlwZSA9IHBDaHVuay0+aU9mZnNldHR5cGU7CisgICppQ291bnQgICAgICA9IHBDaHVuay0+aUNvdW50OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENIVU5LX1NBVkUsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfZ2V0Y2h1bmtfc2F2ZV9lbnRyeSAobW5nX2hhbmRsZSAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaGFuZGxlICAgICBoQ2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgaUVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICppRW50cnl0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzJhcnIyICppT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzJhcnIyICppU3RhcnR0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICppTGF5ZXJuciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAqaUZyYW1lbnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgKmlOYW1lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcGNoYXIgICAgICAqek5hbWUpCit7CisgIG1uZ19kYXRhcCAgICAgICBwRGF0YTsKKyAgbW5nX3NhdmVwICAgICAgIHBDaHVuazsKKyAgbW5nX3NhdmVfZW50cnlwIHBFbnRyeTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRDSFVOS19TQVZFX0VOVFJZLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFIChoSGFuZGxlKSAgICAgICAgICAgIC8qIGNoZWNrIHZhbGlkaXR5IGhhbmRsZSAqLworICBwRGF0YSAgPSAobW5nX2RhdGFwKWhIYW5kbGU7ICAgICAgICAgLyogYW5kIG1ha2UgaXQgYWRkcmVzc2FibGUgKi8KKyAgcENodW5rID0gKG1uZ19zYXZlcCloQ2h1bms7ICAgICAgICAgIC8qIGFkZHJlc3MgdGhlIGNodW5rICovCisKKyAgaWYgKHBDaHVuay0+c0hlYWRlci5pQ2h1bmtuYW1lICE9IE1OR19VSU5UX1NBVkUpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1dST05HQ0hVTkspICAvKiBvdWNoICovCisKKyAgaWYgKGlFbnRyeSA+PSBwQ2h1bmstPmlDb3VudCkgICAgICAgIC8qIHZhbGlkIGluZGV4ID8gKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJREVOVFJZSVgpCisKKyAgcEVudHJ5ICA9IHBDaHVuay0+cEVudHJpZXMgKyBpRW50cnk7IC8qIGFkZHJlc3MgdGhlIGVudHJ5ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaWxsIHRoZSBmaWVsZHMgKi8KKyAgKmlFbnRyeXR5cGUgICAgICA9IHBFbnRyeS0+aUVudHJ5dHlwZTsKKyAgKCppT2Zmc2V0KVswXSAgICA9IHBFbnRyeS0+aU9mZnNldFswXTsKKyAgKCppT2Zmc2V0KVsxXSAgICA9IHBFbnRyeS0+aU9mZnNldFsxXTsKKyAgKCppU3RhcnR0aW1lKVswXSA9IHBFbnRyeS0+aVN0YXJ0dGltZVswXTsKKyAgKCppU3RhcnR0aW1lKVsxXSA9IHBFbnRyeS0+aVN0YXJ0dGltZVsxXTsKKyAgKmlMYXllcm5yICAgICAgICA9IHBFbnRyeS0+aUxheWVybnI7CisgICppRnJhbWVuciAgICAgICAgPSBwRW50cnktPmlGcmFtZW5yOworICAqaU5hbWVzaXplICAgICAgID0gcEVudHJ5LT5pTmFtZXNpemU7CisgICp6TmFtZSAgICAgICAgICAgPSBwRW50cnktPnpOYW1lOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENIVU5LX1NBVkVfRU5UUlksIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19TRUVLCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfZ2V0Y2h1bmtfc2VlayAobW5nX2hhbmRsZSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19oYW5kbGUgaENodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgKmlOYW1lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcGNoYXIgICp6TmFtZSkKK3sKKyAgbW5nX2RhdGFwIHBEYXRhOworICBtbmdfc2Vla3AgcENodW5rOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENIVU5LX1NFRUssIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhICA9IChtbmdfZGF0YXApaEhhbmRsZTsgICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworICBwQ2h1bmsgPSAobW5nX3NlZWtwKWhDaHVuazsgICAgICAgICAgLyogYWRkcmVzcyB0aGUgY2h1bmsgKi8KKworICBpZiAocENodW5rLT5zSGVhZGVyLmlDaHVua25hbWUgIT0gTU5HX1VJTlRfU0VFSykKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfV1JPTkdDSFVOSykgIC8qIG91Y2ggKi8KKworICAqaU5hbWVzaXplID0gcENodW5rLT5pTmFtZXNpemU7ICAgICAgLyogZmlsbCB0aGUgZmllbGRzICovCisgICp6TmFtZSAgICAgPSBwQ2h1bmstPnpOYW1lOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENIVU5LX1NFRUssIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19lWFBJCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfZ2V0Y2h1bmtfZXhwaSAobW5nX2hhbmRsZSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19oYW5kbGUgaENodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgKmlTbmFwc2hvdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgKmlOYW1lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcGNoYXIgICp6TmFtZSkKK3sKKyAgbW5nX2RhdGFwIHBEYXRhOworICBtbmdfZXhwaXAgcENodW5rOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENIVU5LX0VYUEksIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhICA9IChtbmdfZGF0YXApaEhhbmRsZTsgICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworICBwQ2h1bmsgPSAobW5nX2V4cGlwKWhDaHVuazsgICAgICAgICAgLyogYWRkcmVzcyB0aGUgY2h1bmsgKi8KKworICBpZiAocENodW5rLT5zSGVhZGVyLmlDaHVua25hbWUgIT0gTU5HX1VJTlRfZVhQSSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfV1JPTkdDSFVOSykgIC8qIG91Y2ggKi8KKworICAqaVNuYXBzaG90aWQgPSBwQ2h1bmstPmlTbmFwc2hvdGlkOyAgLyogZmlsbCB0aGUgZmllbGRzICovCisgICppTmFtZXNpemUgICA9IHBDaHVuay0+aU5hbWVzaXplOworICAqek5hbWUgICAgICAgPSBwQ2h1bmstPnpOYW1lOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENIVU5LX0VYUEksIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19mUFJJCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfZ2V0Y2h1bmtfZnByaSAobW5nX2hhbmRsZSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19oYW5kbGUgaENodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgKmlEZWx0YXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAqaVByaW9yaXR5KQoreworICBtbmdfZGF0YXAgcERhdGE7CisgIG1uZ19mcHJpcCBwQ2h1bms7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0hVTktfRlBSSSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkgICAgICAgICAgICAvKiBjaGVjayB2YWxpZGl0eSBoYW5kbGUgKi8KKyAgcERhdGEgID0gKG1uZ19kYXRhcCloSGFuZGxlOyAgICAgICAgIC8qIGFuZCBtYWtlIGl0IGFkZHJlc3NhYmxlICovCisgIHBDaHVuayA9IChtbmdfZnByaXApaENodW5rOyAgICAgICAgICAvKiBhZGRyZXNzIHRoZSBjaHVuayAqLworCisgIGlmIChwQ2h1bmstPnNIZWFkZXIuaUNodW5rbmFtZSAhPSBNTkdfVUlOVF9mUFJJKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19XUk9OR0NIVU5LKSAgLyogb3VjaCAqLworCisgICppRGVsdGF0eXBlID0gcENodW5rLT5pRGVsdGF0eXBlOyAgICAvKiBmaWxsIHRoZSBmaWVsZHMgKi8KKyAgKmlQcmlvcml0eSAgPSBwQ2h1bmstPmlQcmlvcml0eTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRDSFVOS19GUFJJLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfbkVFRAorbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX2dldGNodW5rX25lZWQgKG1uZ19oYW5kbGUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaGFuZGxlIGhDaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICppS2V5d29yZHNzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wY2hhciAgKnpLZXl3b3JkcykKK3sKKyAgbW5nX2RhdGFwIHBEYXRhOworICBtbmdfbmVlZHAgcENodW5rOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENIVU5LX05FRUQsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhICA9IChtbmdfZGF0YXApaEhhbmRsZTsgICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworICBwQ2h1bmsgPSAobW5nX25lZWRwKWhDaHVuazsgICAgICAgICAgLyogYWRkcmVzcyB0aGUgY2h1bmsgKi8KKworICBpZiAocENodW5rLT5zSGVhZGVyLmlDaHVua25hbWUgIT0gTU5HX1VJTlRfbkVFRCkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfV1JPTkdDSFVOSykgIC8qIG91Y2ggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbGwgdGhlIGZpZWxkcyAqLworICAqaUtleXdvcmRzc2l6ZSA9IHBDaHVuay0+aUtleXdvcmRzc2l6ZTsKKyAgKnpLZXl3b3JkcyAgICAgPSBwQ2h1bmstPnpLZXl3b3JkczsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRDSFVOS19ORUVELCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfcEhZZworbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX2dldGNodW5rX3BoeWcgKG1uZ19oYW5kbGUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaGFuZGxlIGhDaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfYm9vbCAgICpiRW1wdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAqaVNpemV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgKmlTaXpleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICppVW5pdCkKK3sKKyAgbW5nX2RhdGFwIHBEYXRhOworICBtbmdfcGh5Z3AgcENodW5rOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENIVU5LX1BIWUcsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhICA9IChtbmdfZGF0YXApaEhhbmRsZTsgICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworICBwQ2h1bmsgPSAobW5nX3BoeWdwKWhDaHVuazsgICAgICAgICAgLyogYWRkcmVzcyB0aGUgY2h1bmsgKi8KKworICBpZiAocENodW5rLT5zSGVhZGVyLmlDaHVua25hbWUgIT0gTU5HX1VJTlRfcEhZZykKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfV1JPTkdDSFVOSykgIC8qIG91Y2ggKi8KKworICAqYkVtcHR5ID0gcENodW5rLT5iRW1wdHk7ICAgICAgICAgICAgLyogZmlsbCB0aGUgZmllbGRzICovCisgICppU2l6ZXggPSBwQ2h1bmstPmlTaXpleDsKKyAgKmlTaXpleSA9IHBDaHVuay0+aVNpemV5OworICAqaVVuaXQgID0gcENodW5rLT5pVW5pdDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRDSFVOS19QSFlHLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19nZXRjaHVua19qaGRyIChtbmdfaGFuZGxlIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2hhbmRsZSBoQ2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAqaVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgKmlIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAqaUNvbG9ydHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICppSW1hZ2VzYW1wbGVkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICppSW1hZ2Vjb21wcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICppSW1hZ2VpbnRlcmxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAqaUFscGhhc2FtcGxlZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAqaUFscGhhY29tcHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAqaUFscGhhZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgKmlBbHBoYWludGVybGFjZSkKK3sKKyAgbW5nX2RhdGFwIHBEYXRhOworICBtbmdfamhkcnAgcENodW5rOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENIVU5LX0pIRFIsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhICA9IChtbmdfZGF0YXApaEhhbmRsZTsgICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworICBwQ2h1bmsgPSAobW5nX2poZHJwKWhDaHVuazsgICAgICAgICAgLyogYWRkcmVzcyB0aGUgY2h1bmsgKi8KKworICBpZiAocENodW5rLT5zSGVhZGVyLmlDaHVua25hbWUgIT0gTU5HX1VJTlRfSkhEUikKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfV1JPTkdDSFVOSykgIC8qIG91Y2ggKi8KKworICAqaVdpZHRoICAgICAgICAgICAgPSBwQ2h1bmstPmlXaWR0aDsgLyogZmlsbCB0aGUgZmllbGRzICovICAgICAgICAgIAorICAqaUhlaWdodCAgICAgICAgICAgPSBwQ2h1bmstPmlIZWlnaHQ7CisgICppQ29sb3J0eXBlICAgICAgICA9IHBDaHVuay0+aUNvbG9ydHlwZTsKKyAgKmlJbWFnZXNhbXBsZWRlcHRoID0gcENodW5rLT5pSW1hZ2VzYW1wbGVkZXB0aDsKKyAgKmlJbWFnZWNvbXByZXNzaW9uID0gcENodW5rLT5pSW1hZ2Vjb21wcmVzc2lvbjsKKyAgKmlJbWFnZWludGVybGFjZSAgID0gcENodW5rLT5pSW1hZ2VpbnRlcmxhY2U7CisgICppQWxwaGFzYW1wbGVkZXB0aCA9IHBDaHVuay0+aUFscGhhc2FtcGxlZGVwdGg7CisgICppQWxwaGFjb21wcmVzc2lvbiA9IHBDaHVuay0+aUFscGhhY29tcHJlc3Npb247CisgICppQWxwaGFmaWx0ZXIgICAgICA9IHBDaHVuay0+aUFscGhhZmlsdGVyOworICAqaUFscGhhaW50ZXJsYWNlICAgPSBwQ2h1bmstPmlBbHBoYWludGVybGFjZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRDSFVOS19KSERSLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworI2VuZGlmIC8qIE1OR19JTkNMVURFX0pORyAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19nZXRjaHVua19qZGF0IChtbmdfaGFuZGxlIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2hhbmRsZSBoQ2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAqaVJhd2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcHRyICAgICpwUmF3ZGF0YSkKK3sKKyAgbW5nX2RhdGFwIHBEYXRhOworICBtbmdfamRhdHAgcENodW5rOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENIVU5LX0pEQVQsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhICA9IChtbmdfZGF0YXApaEhhbmRsZTsgICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworICBwQ2h1bmsgPSAobW5nX2pkYXRwKWhDaHVuazsgICAgICAgICAgLyogYWRkcmVzcyB0aGUgY2h1bmsgKi8KKworICBpZiAocENodW5rLT5zSGVhZGVyLmlDaHVua25hbWUgIT0gTU5HX1VJTlRfSkRBVCkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfV1JPTkdDSFVOSykgIC8qIG91Y2ggKi8KKworICAqaVJhd2xlbiAgPSBwQ2h1bmstPmlEYXRhc2l6ZTsgICAgICAgLyogZmlsbCB0aGUgZmllbGRzICovCisgICpwUmF3ZGF0YSA9IHBDaHVuay0+cERhdGE7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0hVTktfSkRBVCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKyNlbmRpZiAvKiBNTkdfSU5DTFVERV9KTkcgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19JTkNMVURFX0pORworCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfZ2V0Y2h1bmtfamRhYSAobW5nX2hhbmRsZSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19oYW5kbGUgaENodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgKmlSYXdsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3B0ciAgICAqcFJhd2RhdGEpCit7CisgIG1uZ19kYXRhcCBwRGF0YTsKKyAgbW5nX2pkYWFwIHBDaHVuazsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRDSFVOS19KREFBLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFIChoSGFuZGxlKSAgICAgICAgICAgIC8qIGNoZWNrIHZhbGlkaXR5IGhhbmRsZSAqLworICBwRGF0YSAgPSAobW5nX2RhdGFwKWhIYW5kbGU7ICAgICAgICAgLyogYW5kIG1ha2UgaXQgYWRkcmVzc2FibGUgKi8KKyAgcENodW5rID0gKG1uZ19qZGFhcCloQ2h1bms7ICAgICAgICAgIC8qIGFkZHJlc3MgdGhlIGNodW5rICovCisKKyAgaWYgKHBDaHVuay0+c0hlYWRlci5pQ2h1bmtuYW1lICE9IE1OR19VSU5UX0pEQUEpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1dST05HQ0hVTkspICAvKiBvdWNoICovCisKKyAgKmlSYXdsZW4gID0gcENodW5rLT5pRGF0YXNpemU7ICAgICAgIC8qIGZpbGwgdGhlIGZpZWxkcyAqLworICAqcFJhd2RhdGEgPSBwQ2h1bmstPnBEYXRhOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENIVU5LX0pEQUEsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisjZW5kaWYgLyogTU5HX0lOQ0xVREVfSk5HICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX2dldGNodW5rX2RoZHIgKG1uZ19oYW5kbGUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaGFuZGxlIGhDaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICppT2JqZWN0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAqaUltYWdldHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICppRGVsdGF0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgKmlCbG9ja3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgKmlCbG9ja2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICppQmxvY2t4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgKmlCbG9ja3kpCit7CisgIG1uZ19kYXRhcCBwRGF0YTsKKyAgbW5nX2RoZHJwIHBDaHVuazsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRDSFVOS19ESERSLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFIChoSGFuZGxlKSAgICAgICAgICAgIC8qIGNoZWNrIHZhbGlkaXR5IGhhbmRsZSAqLworICBwRGF0YSAgPSAobW5nX2RhdGFwKWhIYW5kbGU7ICAgICAgICAgLyogYW5kIG1ha2UgaXQgYWRkcmVzc2FibGUgKi8KKyAgcENodW5rID0gKG1uZ19kaGRycCloQ2h1bms7ICAgICAgICAgIC8qIGFkZHJlc3MgdGhlIGNodW5rICovCisKKyAgaWYgKHBDaHVuay0+c0hlYWRlci5pQ2h1bmtuYW1lICE9IE1OR19VSU5UX0RIRFIpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1dST05HQ0hVTkspICAvKiBvdWNoICovCisKKyAgKmlPYmplY3RpZCAgICA9IHBDaHVuay0+aU9iamVjdGlkOyAgIC8qIGZpbGwgdGhlIGZpZWxkcyAqLworICAqaUltYWdldHlwZSAgID0gcENodW5rLT5pSW1hZ2V0eXBlOworICAqaURlbHRhdHlwZSAgID0gcENodW5rLT5pRGVsdGF0eXBlOworICAqaUJsb2Nrd2lkdGggID0gcENodW5rLT5pQmxvY2t3aWR0aDsKKyAgKmlCbG9ja2hlaWdodCA9IHBDaHVuay0+aUJsb2NraGVpZ2h0OworICAqaUJsb2NreCAgICAgID0gcENodW5rLT5pQmxvY2t4OworICAqaUJsb2NreSAgICAgID0gcENodW5rLT5pQmxvY2t5OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENIVU5LX0RIRFIsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX2dldGNodW5rX3Byb20gKG1uZ19oYW5kbGUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaGFuZGxlIGhDaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICppQ29sb3J0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgKmlTYW1wbGVkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICppRmlsbHR5cGUpCit7CisgIG1uZ19kYXRhcCBwRGF0YTsKKyAgbW5nX3Byb21wIHBDaHVuazsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRDSFVOS19QUk9NLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFIChoSGFuZGxlKSAgICAgICAgICAgIC8qIGNoZWNrIHZhbGlkaXR5IGhhbmRsZSAqLworICBwRGF0YSAgPSAobW5nX2RhdGFwKWhIYW5kbGU7ICAgICAgICAgLyogYW5kIG1ha2UgaXQgYWRkcmVzc2FibGUgKi8KKyAgcENodW5rID0gKG1uZ19wcm9tcCloQ2h1bms7ICAgICAgICAgIC8qIGFkZHJlc3MgdGhlIGNodW5rICovCisKKyAgaWYgKHBDaHVuay0+c0hlYWRlci5pQ2h1bmtuYW1lICE9IE1OR19VSU5UX1BST00pCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1dST05HQ0hVTkspICAvKiBvdWNoICovCisKKyAgKmlDb2xvcnR5cGUgICA9IHBDaHVuay0+aUNvbG9ydHlwZTsgIC8qIGZpbGwgdGhlIGZpZWxkcyAqLworICAqaVNhbXBsZWRlcHRoID0gcENodW5rLT5pU2FtcGxlZGVwdGg7CisgICppRmlsbHR5cGUgICAgPSBwQ2h1bmstPmlGaWxsdHlwZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRDSFVOS19QUk9NLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19nZXRjaHVua19wcGx0IChtbmdfaGFuZGxlIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2hhbmRsZSBoQ2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAqaURlbHRhdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICppQ291bnQpCit7CisgIG1uZ19kYXRhcCBwRGF0YTsKKyAgbW5nX3BwbHRwIHBDaHVuazsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRDSFVOS19QUExULCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFIChoSGFuZGxlKSAgICAgICAgICAgIC8qIGNoZWNrIHZhbGlkaXR5IGhhbmRsZSAqLworICBwRGF0YSAgPSAobW5nX2RhdGFwKWhIYW5kbGU7ICAgICAgICAgLyogYW5kIG1ha2UgaXQgYWRkcmVzc2FibGUgKi8KKyAgcENodW5rID0gKG1uZ19wcGx0cCloQ2h1bms7ICAgICAgICAgIC8qIGFkZHJlc3MgdGhlIGNodW5rICovCisKKyAgaWYgKHBDaHVuay0+c0hlYWRlci5pQ2h1bmtuYW1lICE9IE1OR19VSU5UX1BQTFQpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1dST05HQ0hVTkspICAvKiBvdWNoICovCisKKyAgKmlEZWx0YXR5cGUgPSBwQ2h1bmstPmlEZWx0YXR5cGU7ICAgIC8qIGZpbGwgdGhlIGZpZWxkcyAqLworICAqaUNvdW50ICAgICA9IHBDaHVuay0+aUNvdW50OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENIVU5LX1BQTFQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX2dldGNodW5rX3BwbHRfZW50cnkgKG1uZ19oYW5kbGUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaGFuZGxlIGhDaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlFbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICppUmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgKmlHcmVlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICppQmx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICppQWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2Jvb2wgICAqYlVzZWQpCit7CisgIG1uZ19kYXRhcCAgICAgICBwRGF0YTsKKyAgbW5nX3BwbHRwICAgICAgIHBDaHVuazsKKyAgbW5nX3BwbHRfZW50cnlwIHBFbnRyeTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRDSFVOS19QUExUX0VOVFJZLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFIChoSGFuZGxlKSAgICAgICAgICAgIC8qIGNoZWNrIHZhbGlkaXR5IGhhbmRsZSAqLworICBwRGF0YSAgPSAobW5nX2RhdGFwKWhIYW5kbGU7ICAgICAgICAgLyogYW5kIG1ha2UgaXQgYWRkcmVzc2FibGUgKi8KKyAgcENodW5rID0gKG1uZ19wcGx0cCloQ2h1bms7ICAgICAgICAgIC8qIGFkZHJlc3MgdGhlIGNodW5rICovCisKKyAgaWYgKHBDaHVuay0+c0hlYWRlci5pQ2h1bmtuYW1lICE9IE1OR19VSU5UX1BQTFQpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1dST05HQ0hVTkspICAvKiBvdWNoICovCisKKyAgaWYgKGlFbnRyeSA+PSBwQ2h1bmstPmlDb3VudCkgICAgICAgIC8qIHZhbGlkIGluZGV4ID8gKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJREVOVFJZSVgpCisKKyAgcEVudHJ5ICA9ICZwQ2h1bmstPmFFbnRyaWVzW2lFbnRyeV07IC8qIGFkZHJlc3MgdGhlIGVudHJ5ICovCisKKyAgKmlSZWQgICA9IHBFbnRyeS0+aVJlZDsgICAgICAgICAgICAgIC8qIGZpbGwgdGhlIGZpZWxkcyAqLworICAqaUdyZWVuID0gcEVudHJ5LT5pR3JlZW47CisgICppQmx1ZSAgPSBwRW50cnktPmlCbHVlOworICAqaUFscGhhID0gcEVudHJ5LT5pQWxwaGE7CisgICpiVXNlZCAgPSBwRW50cnktPmJVc2VkOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENIVU5LX1BQTFRfRU5UUlksIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX2dldGNodW5rX2Ryb3AgKG1uZ19oYW5kbGUgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19oYW5kbGUgICBoQ2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICppQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2NodW5raWRwICpwQ2h1bmtuYW1lcykKK3sKKyAgbW5nX2RhdGFwIHBEYXRhOworICBtbmdfZHJvcHAgcENodW5rOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENIVU5LX0RST1AsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhICA9IChtbmdfZGF0YXApaEhhbmRsZTsgICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworICBwQ2h1bmsgPSAobW5nX2Ryb3BwKWhDaHVuazsgICAgICAgICAgLyogYWRkcmVzcyB0aGUgY2h1bmsgKi8KKworICBpZiAocENodW5rLT5zSGVhZGVyLmlDaHVua25hbWUgIT0gTU5HX1VJTlRfRFJPUCkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfV1JPTkdDSFVOSykgIC8qIG91Y2ggKi8KKworICAqaUNvdW50ICAgICAgPSBwQ2h1bmstPmlDb3VudDsgICAgICAgLyogZmlsbCB0aGUgZmllbGRzICovCisgICpwQ2h1bmtuYW1lcyA9IHBDaHVuay0+cENodW5rbmFtZXM7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0hVTktfRFJPUCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfREJZSworbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX2dldGNodW5rX2RieWsgKG1uZ19oYW5kbGUgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2hhbmRsZSAgaENodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19jaHVua2lkICppQ2h1bmtuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICppUG9sYXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgKmlLZXl3b3Jkc3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3BjaGFyICAgKnpLZXl3b3JkcykKK3sKKyAgbW5nX2RhdGFwIHBEYXRhOworICBtbmdfZGJ5a3AgcENodW5rOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENIVU5LX0RCWUssIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhICA9IChtbmdfZGF0YXApaEhhbmRsZTsgICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworICBwQ2h1bmsgPSAobW5nX2RieWtwKWhDaHVuazsgICAgICAgICAgLyogYWRkcmVzcyB0aGUgY2h1bmsgKi8KKworICBpZiAocENodW5rLT5zSGVhZGVyLmlDaHVua25hbWUgIT0gTU5HX1VJTlRfREJZSykKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfV1JPTkdDSFVOSykgIC8qIG91Y2ggKi8KKworICAqaUNodW5rbmFtZSAgICA9IHBDaHVuay0+aUNodW5rbmFtZTsgLyogZmlsbCB0aGUgZmllbGRzICovICAKKyAgKmlQb2xhcml0eSAgICAgPSBwQ2h1bmstPmlQb2xhcml0eTsKKyAgKmlLZXl3b3Jkc3NpemUgPSBwQ2h1bmstPmlLZXl3b3Jkc3NpemU7CisgICp6S2V5d29yZHMgICAgID0gcENodW5rLT56S2V5d29yZHM7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0hVTktfREJZSywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19PUkRSCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfZ2V0Y2h1bmtfb3JkciAobW5nX2hhbmRsZSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19oYW5kbGUgaENodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgKmlDb3VudCkKK3sKKyAgbW5nX2RhdGFwIHBEYXRhOworICBtbmdfb3JkcnAgcENodW5rOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENIVU5LX09SRFIsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhICA9IChtbmdfZGF0YXApaEhhbmRsZTsgICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworICBwQ2h1bmsgPSAobW5nX29yZHJwKWhDaHVuazsgICAgICAgICAgLyogYWRkcmVzcyB0aGUgY2h1bmsgKi8KKworICBpZiAocENodW5rLT5zSGVhZGVyLmlDaHVua25hbWUgIT0gTU5HX1VJTlRfT1JEUikKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfV1JPTkdDSFVOSykgIC8qIG91Y2ggKi8KKworICAqaUNvdW50ID0gcENodW5rLT5pQ291bnQ7ICAgICAgICAgICAgLyogZmlsbCB0aGUgZmllbGQgKi8gCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0hVTktfT1JEUiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19PUkRSCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfZ2V0Y2h1bmtfb3Jkcl9lbnRyeSAobW5nX2hhbmRsZSAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaGFuZGxlICBoQ2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgaUVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19jaHVua2lkICppQ2h1bmtuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICppT3JkZXJ0eXBlKQoreworICBtbmdfZGF0YXAgICAgICAgcERhdGE7CisgIG1uZ19vcmRycCAgICAgICBwQ2h1bms7CisgIG1uZ19vcmRyX2VudHJ5cCBwRW50cnk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0hVTktfT1JEUl9FTlRSWSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkgICAgICAgICAgICAvKiBjaGVjayB2YWxpZGl0eSBoYW5kbGUgKi8KKyAgcERhdGEgID0gKG1uZ19kYXRhcCloSGFuZGxlOyAgICAgICAgIC8qIGFuZCBtYWtlIGl0IGFkZHJlc3NhYmxlICovCisgIHBDaHVuayA9IChtbmdfb3JkcnApaENodW5rOyAgICAgICAgICAvKiBhZGRyZXNzIHRoZSBjaHVuayAqLworCisgIGlmIChwQ2h1bmstPnNIZWFkZXIuaUNodW5rbmFtZSAhPSBNTkdfVUlOVF9PUkRSKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19XUk9OR0NIVU5LKSAgLyogb3VjaCAqLworCisgIGlmIChpRW50cnkgPj0gcENodW5rLT5pQ291bnQpICAgICAgICAvKiB2YWxpZCBpbmRleCA/ICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURFTlRSWUlYKQorCisgIHBFbnRyeSA9IHBDaHVuay0+cEVudHJpZXMgKyBpRW50cnk7ICAvKiBhZGRyZXNzIHRoZSBwcm9wZXIgZW50cnkgKi8KKworICAqaUNodW5rbmFtZSA9IHBFbnRyeS0+aUNodW5rbmFtZTsgICAgLyogZmlsbCB0aGUgZmllbGRzICovCisgICppT3JkZXJ0eXBlID0gcEVudHJ5LT5pT3JkZXJ0eXBlOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENIVU5LX09SRFJfRU5UUlksIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX01BR04KK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19nZXRjaHVua19tYWduIChtbmdfaGFuZGxlIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2hhbmRsZSBoQ2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAqaUZpcnN0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAqaUxhc3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICppTWV0aG9kWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICppTVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAqaU1ZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgKmlNTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICppTVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAqaU1ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgKmlNQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICppTWV0aG9kWSkKK3sKKyAgbW5nX2RhdGFwIHBEYXRhOworICBtbmdfbWFnbnAgcENodW5rOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENIVU5LX01BR04sIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhICA9IChtbmdfZGF0YXApaEhhbmRsZTsgICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworICBwQ2h1bmsgPSAobW5nX21hZ25wKWhDaHVuazsgICAgICAgICAgLyogYWRkcmVzcyB0aGUgY2h1bmsgKi8KKworICBpZiAocENodW5rLT5zSGVhZGVyLmlDaHVua25hbWUgIT0gTU5HX1VJTlRfTUFHTikKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfV1JPTkdDSFVOSykgIC8qIG91Y2ggKi8KKworICAqaUZpcnN0aWQgPSBwQ2h1bmstPmlGaXJzdGlkOyAgICAgICAgLyogZmlsbCB0aGUgZmllbGRzICovCisgICppTGFzdGlkICA9IHBDaHVuay0+aUxhc3RpZDsKKyAgKmlNZXRob2RYID0gKG1uZ191aW50MTYpcENodW5rLT5pTWV0aG9kWDsKKyAgKmlNWCAgICAgID0gcENodW5rLT5pTVg7CisgICppTVkgICAgICA9IHBDaHVuay0+aU1ZOworICAqaU1MICAgICAgPSBwQ2h1bmstPmlNTDsKKyAgKmlNUiAgICAgID0gcENodW5rLT5pTVI7CisgICppTVQgICAgICA9IHBDaHVuay0+aU1UOworICAqaU1CICAgICAgPSBwQ2h1bmstPmlNQjsKKyAgKmlNZXRob2RZID0gKG1uZ191aW50MTYpcENodW5rLT5pTWV0aG9kWTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRDSFVOS19NQUdOLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX0lOQ0xVREVfTVBOR19QUk9QT1NBTAorTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfZ2V0Y2h1bmtfbXBuZyAobW5nX2hhbmRsZSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2hhbmRsZSBoQ2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICppRnJhbWV3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgKmlGcmFtZWhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgKmlOdW1wbGF5cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgKmlUaWNrc3BlcnNlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgKmlDb21wcmVzc2lvbm1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgKmlDb3VudCkKK3sKKyAgbW5nX2RhdGFwIHBEYXRhOworICBtbmdfbXBuZ3AgcENodW5rOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENIVU5LX01QTkcsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhICA9IChtbmdfZGF0YXApaEhhbmRsZTsgICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworICBwQ2h1bmsgPSAobW5nX21wbmdwKWhDaHVuazsgICAgICAgICAgLyogYWRkcmVzcyB0aGUgY2h1bmsgKi8KKworICBpZiAocENodW5rLT5zSGVhZGVyLmlDaHVua25hbWUgIT0gTU5HX1VJTlRfbXBORykKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfV1JPTkdDSFVOSykgIC8qIG91Y2ggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbGwgdGhlIGZpZWxkcyAqLworICAqaUZyYW1ld2lkdGggICAgICAgID0gcENodW5rLT5pRnJhbWV3aWR0aDsKKyAgKmlGcmFtZWhlaWdodCAgICAgICA9IHBDaHVuay0+aUZyYW1laGVpZ2h0OworICAqaU51bXBsYXlzICAgICAgICAgID0gcENodW5rLT5pTnVtcGxheXM7CisgICppVGlja3NwZXJzZWMgICAgICAgPSBwQ2h1bmstPmlUaWNrc3BlcnNlYzsKKyAgKmlDb21wcmVzc2lvbm1ldGhvZCA9IHBDaHVuay0+aUNvbXByZXNzaW9ubWV0aG9kOworICAqaUNvdW50ICAgICAgICAgICAgID0gcENodW5rLT5pRnJhbWVzc2l6ZSAvIHNpemVvZiAobW5nX21wbmdfZnJhbWUpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENIVU5LX01QTkcsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfSU5DTFVERV9NUE5HX1BST1BPU0FMCitNTkdfRVhUIG1uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19nZXRjaHVua19tcG5nX2ZyYW1lIChtbmdfaGFuZGxlIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaGFuZGxlIGhDaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaUVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAqaVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICppWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgKmlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgKmlIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgICppWG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgKmlZb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAqaVRpY2tzKQoreworICBtbmdfZGF0YXAgICAgICAgcERhdGE7CisgIG1uZ19tcG5ncCAgICAgICBwQ2h1bms7CisgIG1uZ19tcG5nX2ZyYW1lcCBwRnJhbWU7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0hVTktfTVBOR19GUkFNRSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkgICAgICAgICAgICAvKiBjaGVjayB2YWxpZGl0eSBoYW5kbGUgKi8KKyAgcERhdGEgID0gKG1uZ19kYXRhcCloSGFuZGxlOyAgICAgICAgIC8qIGFuZCBtYWtlIGl0IGFkZHJlc3NhYmxlICovCisgIHBDaHVuayA9IChtbmdfbXBuZ3ApaENodW5rOyAgICAgICAgICAvKiBhZGRyZXNzIHRoZSBjaHVuayAqLworCisgIGlmIChwQ2h1bmstPnNIZWFkZXIuaUNodW5rbmFtZSAhPSBNTkdfVUlOVF9tcE5HKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19XUk9OR0NIVU5LKSAgLyogb3VjaCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdmFsaWQgaW5kZXggPyAqLworICBpZiAoaUVudHJ5ID49IChwQ2h1bmstPmlGcmFtZXNzaXplIC8gc2l6ZW9mIChtbmdfbXBuZ19mcmFtZSkpKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElERU5UUllJWCkKKworICBwRnJhbWUgID0gcENodW5rLT5wRnJhbWVzICsgaUVudHJ5OyAgLyogYWRkcmVzcyB0aGUgZW50cnkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbGwgdGhlIGZpZWxkcyAqLworICAqaVggICAgICAgID0gcEZyYW1lLT5pWDsKKyAgKmlZICAgICAgICA9IHBGcmFtZS0+aVk7CisgICppV2lkdGggICAgPSBwRnJhbWUtPmlXaWR0aDsKKyAgKmlIZWlnaHQgICA9IHBGcmFtZS0+aUhlaWdodDsKKyAgKmlYb2Zmc2V0ICA9IHBGcmFtZS0+aVhvZmZzZXQ7CisgICppWW9mZnNldCAgPSBwRnJhbWUtPmlZb2Zmc2V0OworICAqaVRpY2tzICAgID0gcEZyYW1lLT5pVGlja3M7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0hVTktfTVBOR19GUkFNRSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX2V2TlQKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19nZXRjaHVua19ldm50IChtbmdfaGFuZGxlIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2hhbmRsZSBoQ2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAqaUNvdW50KQoreworICBtbmdfZGF0YXAgcERhdGE7CisgIG1uZ19ldm50cCBwQ2h1bms7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0hVTktfRVZOVCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkgICAgICAgICAgICAvKiBjaGVjayB2YWxpZGl0eSBoYW5kbGUgKi8KKyAgcERhdGEgID0gKG1uZ19kYXRhcCloSGFuZGxlOyAgICAgICAgIC8qIGFuZCBtYWtlIGl0IGFkZHJlc3NhYmxlICovCisgIHBDaHVuayA9IChtbmdfZXZudHApaENodW5rOyAgICAgICAgICAvKiBhZGRyZXNzIHRoZSBjaHVuayAqLworCisgIGlmIChwQ2h1bmstPnNIZWFkZXIuaUNodW5rbmFtZSAhPSBNTkdfVUlOVF9ldk5UKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19XUk9OR0NIVU5LKSAgLyogb3VjaCAqLworCisgICppQ291bnQgPSBwQ2h1bmstPmlDb3VudDsgICAgICAgICAgICAvKiBmaWxsIHRoZSBmaWVsZHMgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRDSFVOS19FVk5ULCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX2dldGNodW5rX2V2bnRfZW50cnkgKG1uZ19oYW5kbGUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaGFuZGxlIGhDaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlFbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICppRXZlbnR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgKmlNYXNrdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgICppTGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgICppUmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICAqaVRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgICppQm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgKmlPYmplY3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICppSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAqaVNlZ21lbnRuYW1lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcGNoYXIgICp6U2VnbWVudG5hbWUpCit7CisgIG1uZ19kYXRhcCAgICAgICBwRGF0YTsKKyAgbW5nX2V2bnRwICAgICAgIHBDaHVuazsKKyAgbW5nX2V2bnRfZW50cnlwIHBFbnRyeTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRDSFVOS19FVk5UX0VOVFJZLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFIChoSGFuZGxlKSAgICAgICAgICAgIC8qIGNoZWNrIHZhbGlkaXR5IGhhbmRsZSAqLworICBwRGF0YSAgPSAobW5nX2RhdGFwKWhIYW5kbGU7ICAgICAgICAgLyogYW5kIG1ha2UgaXQgYWRkcmVzc2FibGUgKi8KKyAgcENodW5rID0gKG1uZ19ldm50cCloQ2h1bms7ICAgICAgICAgIC8qIGFkZHJlc3MgdGhlIGNodW5rICovCisKKyAgaWYgKHBDaHVuay0+c0hlYWRlci5pQ2h1bmtuYW1lICE9IE1OR19VSU5UX2V2TlQpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1dST05HQ0hVTkspICAvKiBvdWNoICovCisKKyAgaWYgKGlFbnRyeSA+PSBwQ2h1bmstPmlDb3VudCkgICAgICAgIC8qIHZhbGlkIGluZGV4ID8gKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJREVOVFJZSVgpCisKKyAgcEVudHJ5ICA9IHBDaHVuay0+cEVudHJpZXMgKyBpRW50cnk7IC8qIGFkZHJlc3MgdGhlIGVudHJ5ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaWxsIHRoZSBmaWVsZHMgKi8KKyAgKmlFdmVudHR5cGUgICAgICAgPSBwRW50cnktPmlFdmVudHR5cGU7CisgICppTWFza3R5cGUgICAgICAgID0gcEVudHJ5LT5pTWFza3R5cGU7CisgICppTGVmdCAgICAgICAgICAgID0gcEVudHJ5LT5pTGVmdDsgICAgCisgICppUmlnaHQgICAgICAgICAgID0gcEVudHJ5LT5pUmlnaHQ7CisgICppVG9wICAgICAgICAgICAgID0gcEVudHJ5LT5pVG9wOworICAqaUJvdHRvbSAgICAgICAgICA9IHBFbnRyeS0+aUJvdHRvbTsKKyAgKmlPYmplY3RpZCAgICAgICAgPSBwRW50cnktPmlPYmplY3RpZDsKKyAgKmlJbmRleCAgICAgICAgICAgPSBwRW50cnktPmlJbmRleDsKKyAgKmlTZWdtZW50bmFtZXNpemUgPSBwRW50cnktPmlTZWdtZW50bmFtZXNpemU7CisgICp6U2VnbWVudG5hbWUgICAgID0gcEVudHJ5LT56U2VnbWVudG5hbWU7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUQ0hVTktfRVZOVF9FTlRSWSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX2dldGNodW5rX3Vua25vd24gKG1uZ19oYW5kbGUgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2hhbmRsZSAgaENodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19jaHVua2lkICppQ2h1bmtuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICppUmF3bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wdHIgICAgICpwUmF3ZGF0YSkKK3sKKyAgbW5nX2RhdGFwICAgICAgICAgIHBEYXRhOworICBtbmdfdW5rbm93bl9jaHVua3AgcENodW5rOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENIVU5LX1VOS05PV04sIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhICA9IChtbmdfZGF0YXApaEhhbmRsZTsgICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworICBwQ2h1bmsgPSAobW5nX3Vua25vd25fY2h1bmtwKWhDaHVuazsgLyogYWRkcmVzcyB0aGUgY2h1bmsgKi8KKworICBpZiAocENodW5rLT5zSGVhZGVyLmZDbGVhbnVwICE9IG1uZ19mcmVlX3Vua25vd24pCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1dST05HQ0hVTkspICAvKiBvdWNoICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaWxsIHRoZSBmaWVsZHMgKi8KKyAgKmlDaHVua25hbWUgPSBwQ2h1bmstPnNIZWFkZXIuaUNodW5rbmFtZTsKKyAgKmlSYXdsZW4gICAgPSBwQ2h1bmstPmlEYXRhc2l6ZTsKKyAgKnBSYXdkYXRhICAgPSBwQ2h1bmstPnBEYXRhOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVENIVU5LX1VOS05PV04sIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19JTkNMVURFX1dSSVRFX1BST0NTCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19URVJNCitNTkdfTE9DQUwgbW5nX2Jvb2wgY2hlY2tfdGVybSAobW5nX2RhdGFwICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2NodW5raWQgaUNodW5rbmFtZSkKK3sKKyAgbW5nX2NodW5rX2hlYWRlcnAgcENodW5rID0gKG1uZ19jaHVua19oZWFkZXJwKXBEYXRhLT5wTGFzdGNodW5rOworCisgIGlmICghcENodW5rKSAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3RoaW5nIGFkZGVkIHlldCA/ICovCisgICAgcmV0dXJuIE1OR19UUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGFzdCBhZGRlZCBjaHVuayBpcyBURVJNID8gKi8KKyAgaWYgKHBDaHVuay0+aUNodW5rbmFtZSAhPSBNTkdfVUlOVF9URVJNKQorICAgIHJldHVybiBNTkdfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByZXZpb3VzIHRvIGxhc3QgaXMgTUhEUiA/ICovCisgIGlmICgocENodW5rLT5wUHJldikgJiYgKCgobW5nX2NodW5rX2hlYWRlcnApcENodW5rLT5wUHJldiktPmlDaHVua25hbWUgPT0gTU5HX1VJTlRfTUhEUikpCisgICAgcmV0dXJuIE1OR19UUlVFOworCisgIGlmIChpQ2h1bmtuYW1lID09IE1OR19VSU5UX1NFRUspICAgICAvKiBuZXcgY2h1bmsgdG8gYmUgYWRkZWQgaXMgU0VFSyA/ICovCisgICAgcmV0dXJuIE1OR19UUlVFOworCisgIHJldHVybiBNTkdfRkFMU0U7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3B1dGNodW5rX2loZHIgKG1uZ19oYW5kbGUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICBpQml0ZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICBpQ29sb3J0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaUNvbXByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaUZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggIGlJbnRlcmxhY2UpCit7CisgIG1uZ19kYXRhcCAgICAgICAgcERhdGE7CisgIG1uZ19jaHVua3AgICAgICAgcENodW5rOworICBtbmdfcmV0Y29kZSAgICAgIGlSZXRjb2RlOworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyAgbW5nX2NodW5rX2hlYWRlciBzQ2h1bmtoZWFkZXIgPQorI2lmZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisgICAgICAgICAge01OR19VSU5UX0lIRFIsIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX2dlbmVyYWwsIG1uZ19yZWFkX2loZHIsIG1uZ193cml0ZV9paGRyLCBtbmdfYXNzaWduX2dlbmVyYWwsIDAsIDAsIHNpemVvZihtbmdfaWhkcil9OworI2Vsc2UKKyAgICAgICAgICB7TU5HX1VJTlRfSUhEUiwgbW5nX2luaXRfaWhkciwgbW5nX2ZyZWVfaWhkciwgbW5nX3JlYWRfaWhkciwgbW5nX3dyaXRlX2loZHIsIG1uZ19hc3NpZ25faWhkciwgMCwgMH07CisjZW5kaWYKKyNlbHNlCisgIG1uZ19jaHVua19oZWFkZXIgc0NodW5raGVhZGVyOworI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fUFVUQ0hVTktfSUhEUiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkgICAgICAgICAgICAvKiBjaGVjayB2YWxpZGl0eSBoYW5kbGUgKi8KKyAgcERhdGEgPSAobW5nX2RhdGFwKWhIYW5kbGU7ICAgICAgICAgIC8qIGFuZCBtYWtlIGl0IGFkZHJlc3NhYmxlICovCisKKyAgaWYgKCFwRGF0YS0+YkNyZWF0aW5nKSAgICAgICAgICAgICAgIC8qIGFyZW4ndCB3ZSBjcmVhdGluZyBhIG5ldyBmaWxlID8gKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfRlVOQ1RJT05JTlZBTElEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJldmVudCBtaXNwbGFjZWQgVEVSTSAhICovCisgIGlmICghY2hlY2tfdGVybSAocERhdGEsIE1OR19VSU5UX0lIRFIpKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19URVJNU0VRRVJST1IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgdGhlIGNodW5rICovCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorI2lmZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisgIGlSZXRjb2RlID0gbW5nX2luaXRfZ2VuZXJhbCAocERhdGEsICZzQ2h1bmtoZWFkZXIsICZwQ2h1bmspOworI2Vsc2UKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9paGRyIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZW5kaWYKKyNlbHNlCisgIG1uZ19nZXRfY2h1bmtoZWFkZXIoTU5HX1VJTlRfSUhEUiwgJnNDaHVua2hlYWRlcik7CisgIGlSZXRjb2RlID0gbW5nX2luaXRfZ2VuZXJhbCAocERhdGEsICZzQ2h1bmtoZWFkZXIsICZwQ2h1bmspOworI2VuZGlmCisKKyAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgcmV0dXJuIGlSZXRjb2RlOworICAoKG1uZ19paGRycClwQ2h1bmspLT5pV2lkdGggICAgICAgPSBpV2lkdGg7CisgICgobW5nX2loZHJwKXBDaHVuayktPmlIZWlnaHQgICAgICA9IGlIZWlnaHQ7CisgICgobW5nX2loZHJwKXBDaHVuayktPmlCaXRkZXB0aCAgICA9IGlCaXRkZXB0aDsKKyAgKChtbmdfaWhkcnApcENodW5rKS0+aUNvbG9ydHlwZSAgID0gaUNvbG9ydHlwZTsKKyAgKChtbmdfaWhkcnApcENodW5rKS0+aUNvbXByZXNzaW9uID0gaUNvbXByZXNzaW9uOworICAoKG1uZ19paGRycClwQ2h1bmspLT5pRmlsdGVyICAgICAgPSBpRmlsdGVyOworICAoKG1uZ19paGRycClwQ2h1bmspLT5pSW50ZXJsYWNlICAgPSBpSW50ZXJsYWNlOworCisgIG1uZ19hZGRfY2h1bmsgKHBEYXRhLCBwQ2h1bmspOyAgICAgICAvKiBhZGQgaXQgdG8gdGhlIGxpc3QgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9QVVRDSFVOS19JSERSLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3B1dGNodW5rX3BsdGUgKG1uZ19oYW5kbGUgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICBpQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3BhbGV0dGU4IGFQYWxldHRlKQoreworICBtbmdfZGF0YXAgICAgICAgIHBEYXRhOworICBtbmdfY2h1bmtwICAgICAgIHBDaHVuazsKKyAgbW5nX3JldGNvZGUgICAgICBpUmV0Y29kZTsKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisgIG1uZ19jaHVua19oZWFkZXIgc0NodW5raGVhZGVyID0KKyNpZmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICAgICAgICAgIHtNTkdfVUlOVF9QTFRFLCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9nZW5lcmFsLCBtbmdfcmVhZF9wbHRlLCBtbmdfd3JpdGVfcGx0ZSwgbW5nX2Fzc2lnbl9nZW5lcmFsLCAwLCAwLCBzaXplb2YobW5nX3BsdGUpfTsKKyNlbHNlCisgICAgICAgICAge01OR19VSU5UX1BMVEUsIG1uZ19pbml0X3BsdGUsIG1uZ19mcmVlX3BsdGUsIG1uZ19yZWFkX3BsdGUsIG1uZ193cml0ZV9wbHRlLCBtbmdfYXNzaWduX3BsdGUsIDAsIDB9OworI2VuZGlmCisjZWxzZQorICBtbmdfY2h1bmtfaGVhZGVyIHNDaHVua2hlYWRlcjsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1BVVENIVU5LX1BMVEUsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhID0gKG1uZ19kYXRhcCloSGFuZGxlOyAgICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworCisgIGlmICghcERhdGEtPmJDcmVhdGluZykgICAgICAgICAgICAgICAvKiBhcmVuJ3Qgd2UgY3JlYXRpbmcgYSBuZXcgZmlsZSA/ICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0ZVTkNUSU9OSU5WQUxJRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG11c3QgaGF2ZSBoYWQgYSBoZWFkZXIgZmlyc3QhICovCisgIGlmIChwRGF0YS0+aUZpcnN0Y2h1bmthZGRlZCA9PSAwKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19OT0hFQURFUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByZXZlbnQgbWlzcGxhY2VkIFRFUk0gISAqLworICBpZiAoIWNoZWNrX3Rlcm0gKHBEYXRhLCBNTkdfVUlOVF9QTFRFKSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfVEVSTVNFUUVSUk9SKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIHRoZSBjaHVuayAqLworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyNpZmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICBpUmV0Y29kZSA9IG1uZ19pbml0X2dlbmVyYWwgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbHNlCisgIGlSZXRjb2RlID0gbW5nX2luaXRfcGx0ZSAocERhdGEsICZzQ2h1bmtoZWFkZXIsICZwQ2h1bmspOworI2VuZGlmCisjZWxzZQorICBtbmdfZ2V0X2NodW5raGVhZGVyKE1OR19VSU5UX1BMVEUsICZzQ2h1bmtoZWFkZXIpOworICBpUmV0Y29kZSA9IG1uZ19pbml0X2dlbmVyYWwgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbmRpZgorCisgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbGwgdGhlIGNodW5rICovCisgICgobW5nX3BsdGVwKXBDaHVuayktPmlFbnRyeWNvdW50ID0gaUNvdW50OworICAoKG1uZ19wbHRlcClwQ2h1bmspLT5iRW1wdHkgICAgICA9IChtbmdfYm9vbCkoaUNvdW50ID09IDApOworCisgIE1OR19DT1BZICgoKG1uZ19wbHRlcClwQ2h1bmspLT5hRW50cmllcywgYVBhbGV0dGUsIHNpemVvZiAobW5nX3BhbGV0dGU4KSk7CisKKyAgbW5nX2FkZF9jaHVuayAocERhdGEsIHBDaHVuayk7ICAgICAgIC8qIGFkZCBpdCB0byB0aGUgbGlzdCAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1BVVENIVU5LX1BMVEUsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfcHV0Y2h1bmtfaWRhdCAobW5nX2hhbmRsZSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaVJhd2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcHRyICAgIHBSYXdkYXRhKQoreworICBtbmdfZGF0YXAgICAgICAgIHBEYXRhOworICBtbmdfY2h1bmtwICAgICAgIHBDaHVuazsKKyAgbW5nX3JldGNvZGUgICAgICBpUmV0Y29kZTsKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisgIG1uZ19jaHVua19oZWFkZXIgc0NodW5raGVhZGVyID0KKyNpZmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICAgICAgICAgIHtNTkdfVUlOVF9JREFULCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9pZGF0LCBtbmdfcmVhZF9pZGF0LCBtbmdfd3JpdGVfaWRhdCwgbW5nX2Fzc2lnbl9pZGF0LCAwLCAwLCBzaXplb2YobW5nX2lkYXQpfTsKKyNlbHNlCisgICAgICAgICAge01OR19VSU5UX0lEQVQsIG1uZ19pbml0X2lkYXQsIG1uZ19mcmVlX2lkYXQsIG1uZ19yZWFkX2lkYXQsIG1uZ193cml0ZV9pZGF0LCBtbmdfYXNzaWduX2lkYXQsIDAsIDB9OworI2VuZGlmCisjZWxzZQorICBtbmdfY2h1bmtfaGVhZGVyIHNDaHVua2hlYWRlcjsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1BVVENIVU5LX0lEQVQsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhID0gKG1uZ19kYXRhcCloSGFuZGxlOyAgICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworCisgIGlmICghcERhdGEtPmJDcmVhdGluZykgICAgICAgICAgICAgICAvKiBhcmVuJ3Qgd2UgY3JlYXRpbmcgYSBuZXcgZmlsZSA/ICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0ZVTkNUSU9OSU5WQUxJRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG11c3QgaGF2ZSBoYWQgYSBoZWFkZXIgZmlyc3QhICovCisgIGlmIChwRGF0YS0+aUZpcnN0Y2h1bmthZGRlZCA9PSAwKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19OT0hFQURFUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByZXZlbnQgbWlzcGxhY2VkIFRFUk0gISAqLworICBpZiAoIWNoZWNrX3Rlcm0gKHBEYXRhLCBNTkdfVUlOVF9JREFUKSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfVEVSTVNFUUVSUk9SKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIHRoZSBjaHVuayAqLworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyNpZmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICBpUmV0Y29kZSA9IG1uZ19pbml0X2dlbmVyYWwgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbHNlCisgIGlSZXRjb2RlID0gbW5nX2luaXRfaWRhdCAocERhdGEsICZzQ2h1bmtoZWFkZXIsICZwQ2h1bmspOworI2VuZGlmCisjZWxzZQorICBtbmdfZ2V0X2NodW5raGVhZGVyKE1OR19VSU5UX0lEQVQsICZzQ2h1bmtoZWFkZXIpOworICBpUmV0Y29kZSA9IG1uZ19pbml0X2dlbmVyYWwgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbmRpZgorCisgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbGwgdGhlIGNodW5rICovCisgICgobW5nX2lkYXRwKXBDaHVuayktPmJFbXB0eSAgICA9IChtbmdfYm9vbCkoaVJhd2xlbiA9PSAwKTsKKyAgKChtbmdfaWRhdHApcENodW5rKS0+aURhdGFzaXplID0gaVJhd2xlbjsKKworICBpZiAoaVJhd2xlbikKKyAgeworICAgIE1OR19BTExPQyAocERhdGEsICgobW5nX2lkYXRwKXBDaHVuayktPnBEYXRhLCBpUmF3bGVuKTsKKyAgICBNTkdfQ09QWSAoKChtbmdfaWRhdHApcENodW5rKS0+cERhdGEsIHBSYXdkYXRhLCBpUmF3bGVuKTsKKyAgfQorCisgIG1uZ19hZGRfY2h1bmsgKHBEYXRhLCBwQ2h1bmspOyAgICAgICAvKiBhZGQgaXQgdG8gdGhlIGxpc3QgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9QVVRDSFVOS19JREFULCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3B1dGNodW5rX2llbmQgKG1uZ19oYW5kbGUgaEhhbmRsZSkKK3sKKyAgbW5nX2RhdGFwICAgICAgICBwRGF0YTsKKyAgbW5nX2NodW5rcCAgICAgICBwQ2h1bms7CisgIG1uZ19yZXRjb2RlICAgICAgaVJldGNvZGU7CisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorICBtbmdfY2h1bmtfaGVhZGVyIHNDaHVua2hlYWRlciA9CisjaWZkZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyAgICAgICAgICB7TU5HX1VJTlRfSUVORCwgbW5nX2luaXRfZ2VuZXJhbCwgbW5nX2ZyZWVfZ2VuZXJhbCwgbW5nX3JlYWRfaWVuZCwgbW5nX3dyaXRlX2llbmQsIG1uZ19hc3NpZ25fZ2VuZXJhbCwgMCwgMCwgc2l6ZW9mKG1uZ19pZW5kKX07CisjZWxzZQorICAgICAgICAgIHtNTkdfVUlOVF9JRU5ELCBtbmdfaW5pdF9pZW5kLCBtbmdfZnJlZV9pZW5kLCBtbmdfcmVhZF9pZW5kLCBtbmdfd3JpdGVfaWVuZCwgbW5nX2Fzc2lnbl9pZW5kLCAwLCAwfTsKKyNlbmRpZgorI2Vsc2UKKyAgbW5nX2NodW5rX2hlYWRlciBzQ2h1bmtoZWFkZXI7CisjZW5kaWYKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9QVVRDSFVOS19JRU5ELCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFIChoSGFuZGxlKSAgICAgICAgICAgIC8qIGNoZWNrIHZhbGlkaXR5IGhhbmRsZSAqLworICBwRGF0YSA9IChtbmdfZGF0YXApaEhhbmRsZTsgICAgICAgICAgLyogYW5kIG1ha2UgaXQgYWRkcmVzc2FibGUgKi8KKworICBpZiAoIXBEYXRhLT5iQ3JlYXRpbmcpICAgICAgICAgICAgICAgLyogYXJlbid0IHdlIGNyZWF0aW5nIGEgbmV3IGZpbGUgPyAqLworICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19GVU5DVElPTklOVkFMSUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtdXN0IGhhdmUgaGFkIGEgaGVhZGVyIGZpcnN0ISAqLworICBpZiAocERhdGEtPmlGaXJzdGNodW5rYWRkZWQgPT0gMCkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfTk9IRUFERVIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcmV2ZW50IG1pc3BsYWNlZCBURVJNICEgKi8KKyAgaWYgKCFjaGVja190ZXJtIChwRGF0YSwgTU5HX1VJTlRfSUVORCkpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1RFUk1TRVFFUlJPUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSB0aGUgY2h1bmsgKi8KKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisjaWZkZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9nZW5lcmFsIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZWxzZQorICBpUmV0Y29kZSA9IG1uZ19pbml0X2llbmQgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbmRpZgorI2Vsc2UKKyAgbW5nX2dldF9jaHVua2hlYWRlcihNTkdfVUlOVF9JRU5ELCAmc0NodW5raGVhZGVyKTsKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9nZW5lcmFsIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZW5kaWYKKworICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICByZXR1cm4gaVJldGNvZGU7CisKKyAgbW5nX2FkZF9jaHVuayAocERhdGEsIHBDaHVuayk7ICAgICAgIC8qIGFkZCBpdCB0byB0aGUgbGlzdCAqLworCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisgIGlmICgocERhdGEtPmlGaXJzdGNodW5rYWRkZWQgPT0gTU5HX1VJTlRfSUhEUikgfHwKKyAgICAgIChwRGF0YS0+aUZpcnN0Y2h1bmthZGRlZCA9PSBNTkdfVUlOVF9KSERSKSAgICApCisjZWxzZQorICBpZiAocERhdGEtPmlGaXJzdGNodW5rYWRkZWQgPT0gTU5HX1VJTlRfSUhEUikKKyNlbmRpZgorICAgIHBEYXRhLT5iQ3JlYXRpbmcgPSBNTkdfRkFMU0U7ICAgICAgLyogc2hvdWxkIGJlIGxhc3QgY2h1bmsgISEhICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fUFVUQ0hVTktfSUVORCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19wdXRjaHVua190cm5zIChtbmdfaGFuZGxlICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfYm9vbCAgICAgYkVtcHR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgICBiR2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICBpVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgaUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OGFyciBhQWxwaGFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgICBpR3JheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgaVJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgaUdyZWVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgICBpQmx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgaVJhd2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhhcnIgYVJhd2RhdGEpCit7CisgIG1uZ19kYXRhcCAgICAgICAgcERhdGE7CisgIG1uZ19jaHVua3AgICAgICAgcENodW5rOworICBtbmdfcmV0Y29kZSAgICAgIGlSZXRjb2RlOworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyAgbW5nX2NodW5rX2hlYWRlciBzQ2h1bmtoZWFkZXIgPQorI2lmZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisgICAgICAgICAge01OR19VSU5UX3RSTlMsIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX2dlbmVyYWwsIG1uZ19yZWFkX3RybnMsIG1uZ193cml0ZV90cm5zLCBtbmdfYXNzaWduX2dlbmVyYWwsIDAsIDAsIHNpemVvZihtbmdfdHJucyl9OworI2Vsc2UKKyAgICAgICAgICB7TU5HX1VJTlRfdFJOUywgbW5nX2luaXRfdHJucywgbW5nX2ZyZWVfdHJucywgbW5nX3JlYWRfdHJucywgbW5nX3dyaXRlX3RybnMsIG1uZ19hc3NpZ25fdHJucywgMCwgMH07CisjZW5kaWYKKyNlbHNlCisgIG1uZ19jaHVua19oZWFkZXIgc0NodW5raGVhZGVyOworI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fUFVUQ0hVTktfVFJOUywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkgICAgICAgICAgICAvKiBjaGVjayB2YWxpZGl0eSBoYW5kbGUgKi8KKyAgcERhdGEgPSAobW5nX2RhdGFwKWhIYW5kbGU7ICAgICAgICAgIC8qIGFuZCBtYWtlIGl0IGFkZHJlc3NhYmxlICovCisKKyAgaWYgKCFwRGF0YS0+YkNyZWF0aW5nKSAgICAgICAgICAgICAgIC8qIGFyZW4ndCB3ZSBjcmVhdGluZyBhIG5ldyBmaWxlID8gKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfRlVOQ1RJT05JTlZBTElEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbXVzdCBoYXZlIGhhZCBhIGhlYWRlciBmaXJzdCEgKi8KKyAgaWYgKHBEYXRhLT5pRmlyc3RjaHVua2FkZGVkID09IDApCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX05PSEVBREVSKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJldmVudCBtaXNwbGFjZWQgVEVSTSAhICovCisgIGlmICghY2hlY2tfdGVybSAocERhdGEsIE1OR19VSU5UX3RSTlMpKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19URVJNU0VRRVJST1IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgdGhlIGNodW5rICovCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorI2lmZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisgIGlSZXRjb2RlID0gbW5nX2luaXRfZ2VuZXJhbCAocERhdGEsICZzQ2h1bmtoZWFkZXIsICZwQ2h1bmspOworI2Vsc2UKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF90cm5zIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZW5kaWYKKyNlbHNlCisgIG1uZ19nZXRfY2h1bmtoZWFkZXIoTU5HX1VJTlRfdFJOUywgJnNDaHVua2hlYWRlcik7CisgIGlSZXRjb2RlID0gbW5nX2luaXRfZ2VuZXJhbCAocERhdGEsICZzQ2h1bmtoZWFkZXIsICZwQ2h1bmspOworI2VuZGlmCisKKyAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgcmV0dXJuIGlSZXRjb2RlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmlsbCB0aGUgY2h1bmsgKi8KKyAgKChtbmdfdHJuc3ApcENodW5rKS0+YkVtcHR5ICAgPSBiRW1wdHk7CisgICgobW5nX3RybnNwKXBDaHVuayktPmJHbG9iYWwgID0gYkdsb2JhbDsKKyAgKChtbmdfdHJuc3ApcENodW5rKS0+aVR5cGUgICAgPSBpVHlwZTsKKyAgKChtbmdfdHJuc3ApcENodW5rKS0+aUNvdW50ICAgPSBpQ291bnQ7CisgICgobW5nX3RybnNwKXBDaHVuayktPmlHcmF5ICAgID0gaUdyYXk7CisgICgobW5nX3RybnNwKXBDaHVuayktPmlSZWQgICAgID0gaVJlZDsKKyAgKChtbmdfdHJuc3ApcENodW5rKS0+aUdyZWVuICAgPSBpR3JlZW47CisgICgobW5nX3RybnNwKXBDaHVuayktPmlCbHVlICAgID0gaUJsdWU7CisgICgobW5nX3RybnNwKXBDaHVuayktPmlSYXdsZW4gID0gaVJhd2xlbjsKKworICBNTkdfQ09QWSAoKChtbmdfdHJuc3ApcENodW5rKS0+YUVudHJpZXMsIGFBbHBoYXMsICBzaXplb2YgKG1uZ191aW50OGFycikpOworICBNTkdfQ09QWSAoKChtbmdfdHJuc3ApcENodW5rKS0+YVJhd2RhdGEsIGFSYXdkYXRhLCBzaXplb2YgKG1uZ191aW50OGFycikpOworCisgIG1uZ19hZGRfY2h1bmsgKHBEYXRhLCBwQ2h1bmspOyAgICAgICAvKiBhZGQgaXQgdG8gdGhlIGxpc3QgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9QVVRDSFVOS19UUk5TLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX2dBTUEKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19wdXRjaHVua19nYW1hIChtbmdfaGFuZGxlIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2Jvb2wgICBiRW1wdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpR2FtbWEpCit7CisgIG1uZ19kYXRhcCAgICAgICAgcERhdGE7CisgIG1uZ19jaHVua3AgICAgICAgcENodW5rOworICBtbmdfcmV0Y29kZSAgICAgIGlSZXRjb2RlOworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyAgbW5nX2NodW5rX2hlYWRlciBzQ2h1bmtoZWFkZXIgPQorI2lmZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisgICAgICAgICAge01OR19VSU5UX2dBTUEsIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX2dlbmVyYWwsIG1uZ19yZWFkX2dhbWEsIG1uZ193cml0ZV9nYW1hLCBtbmdfYXNzaWduX2dlbmVyYWwsIDAsIDAsIHNpemVvZihtbmdfZ2FtYSl9OworI2Vsc2UKKyAgICAgICAgICB7TU5HX1VJTlRfZ0FNQSwgbW5nX2luaXRfZ2FtYSwgbW5nX2ZyZWVfZ2FtYSwgbW5nX3JlYWRfZ2FtYSwgbW5nX3dyaXRlX2dhbWEsIG1uZ19hc3NpZ25fZ2FtYSwgMCwgMH07CisjZW5kaWYKKyNlbHNlCisgIG1uZ19jaHVua19oZWFkZXIgc0NodW5raGVhZGVyOworI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fUFVUQ0hVTktfR0FNQSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkgICAgICAgICAgICAvKiBjaGVjayB2YWxpZGl0eSBoYW5kbGUgKi8KKyAgcERhdGEgPSAobW5nX2RhdGFwKWhIYW5kbGU7ICAgICAgICAgIC8qIGFuZCBtYWtlIGl0IGFkZHJlc3NhYmxlICovCisKKyAgaWYgKCFwRGF0YS0+YkNyZWF0aW5nKSAgICAgICAgICAgICAgIC8qIGFyZW4ndCB3ZSBjcmVhdGluZyBhIG5ldyBmaWxlID8gKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfRlVOQ1RJT05JTlZBTElEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbXVzdCBoYXZlIGhhZCBhIGhlYWRlciBmaXJzdCEgKi8KKyAgaWYgKHBEYXRhLT5pRmlyc3RjaHVua2FkZGVkID09IDApCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX05PSEVBREVSKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJldmVudCBtaXNwbGFjZWQgVEVSTSAhICovCisgIGlmICghY2hlY2tfdGVybSAocERhdGEsIE1OR19VSU5UX2dBTUEpKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19URVJNU0VRRVJST1IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgdGhlIGNodW5rICovCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorI2lmZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisgIGlSZXRjb2RlID0gbW5nX2luaXRfZ2VuZXJhbCAocERhdGEsICZzQ2h1bmtoZWFkZXIsICZwQ2h1bmspOworI2Vsc2UKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9nYW1hIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZW5kaWYKKyNlbHNlCisgIG1uZ19nZXRfY2h1bmtoZWFkZXIoTU5HX1VJTlRfZ0FNQSwgJnNDaHVua2hlYWRlcik7CisgIGlSZXRjb2RlID0gbW5nX2luaXRfZ2VuZXJhbCAocERhdGEsICZzQ2h1bmtoZWFkZXIsICZwQ2h1bmspOworI2VuZGlmCisKKyAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgcmV0dXJuIGlSZXRjb2RlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmlsbCB0aGUgY2h1bmsgKi8KKyAgKChtbmdfZ2FtYXApcENodW5rKS0+YkVtcHR5ID0gYkVtcHR5OworICAoKG1uZ19nYW1hcClwQ2h1bmspLT5pR2FtbWEgPSBpR2FtbWE7CisKKyAgbW5nX2FkZF9jaHVuayAocERhdGEsIHBDaHVuayk7ICAgICAgIC8qIGFkZCBpdCB0byB0aGUgbGlzdCAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1BVVENIVU5LX0dBTUEsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19jSFJNCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfcHV0Y2h1bmtfY2hybSAobW5nX2hhbmRsZSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgYkVtcHR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaVdoaXRlcG9pbnR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaVdoaXRlcG9pbnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaVJlZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpUmVkeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlHcmVlbngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpR3JlZW55LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaUJsdWV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaUJsdWV5KQoreworICBtbmdfZGF0YXAgICAgICAgIHBEYXRhOworICBtbmdfY2h1bmtwICAgICAgIHBDaHVuazsKKyAgbW5nX3JldGNvZGUgICAgICBpUmV0Y29kZTsKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisgIG1uZ19jaHVua19oZWFkZXIgc0NodW5raGVhZGVyID0KKyNpZmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICAgICAgICAgIHtNTkdfVUlOVF9jSFJNLCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9nZW5lcmFsLCBtbmdfcmVhZF9jaHJtLCBtbmdfd3JpdGVfY2hybSwgbW5nX2Fzc2lnbl9nZW5lcmFsLCAwLCAwLCBzaXplb2YobW5nX2Nocm0pfTsKKyNlbHNlCisgICAgICAgICAge01OR19VSU5UX2NIUk0sIG1uZ19pbml0X2Nocm0sIG1uZ19mcmVlX2Nocm0sIG1uZ19yZWFkX2Nocm0sIG1uZ193cml0ZV9jaHJtLCBtbmdfYXNzaWduX2Nocm0sIDAsIDB9OworI2VuZGlmCisjZWxzZQorICBtbmdfY2h1bmtfaGVhZGVyIHNDaHVua2hlYWRlcjsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1BVVENIVU5LX0NIUk0sIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhID0gKG1uZ19kYXRhcCloSGFuZGxlOyAgICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworCisgIGlmICghcERhdGEtPmJDcmVhdGluZykgICAgICAgICAgICAgICAvKiBhcmVuJ3Qgd2UgY3JlYXRpbmcgYSBuZXcgZmlsZSA/ICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0ZVTkNUSU9OSU5WQUxJRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG11c3QgaGF2ZSBoYWQgYSBoZWFkZXIgZmlyc3QhICovCisgIGlmIChwRGF0YS0+aUZpcnN0Y2h1bmthZGRlZCA9PSAwKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19OT0hFQURFUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByZXZlbnQgbWlzcGxhY2VkIFRFUk0gISAqLworICBpZiAoIWNoZWNrX3Rlcm0gKHBEYXRhLCBNTkdfVUlOVF9jSFJNKSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfVEVSTVNFUUVSUk9SKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIHRoZSBjaHVuayAqLworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyNpZmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICBpUmV0Y29kZSA9IG1uZ19pbml0X2dlbmVyYWwgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbHNlCisgIGlSZXRjb2RlID0gbW5nX2luaXRfY2hybSAocERhdGEsICZzQ2h1bmtoZWFkZXIsICZwQ2h1bmspOworI2VuZGlmCisjZWxzZQorICBtbmdfZ2V0X2NodW5raGVhZGVyKE1OR19VSU5UX2NIUk0sICZzQ2h1bmtoZWFkZXIpOworICBpUmV0Y29kZSA9IG1uZ19pbml0X2dlbmVyYWwgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbmRpZgorCisgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbGwgdGhlIGNodW5rICovCisgICgobW5nX2Nocm1wKXBDaHVuayktPmJFbXB0eSAgICAgICA9IGJFbXB0eTsKKyAgKChtbmdfY2hybXApcENodW5rKS0+aVdoaXRlcG9pbnR4ID0gaVdoaXRlcG9pbnR4OworICAoKG1uZ19jaHJtcClwQ2h1bmspLT5pV2hpdGVwb2ludHkgPSBpV2hpdGVwb2ludHk7CisgICgobW5nX2Nocm1wKXBDaHVuayktPmlSZWR4ICAgICAgICA9IGlSZWR4OworICAoKG1uZ19jaHJtcClwQ2h1bmspLT5pUmVkeSAgICAgICAgPSBpUmVkeTsKKyAgKChtbmdfY2hybXApcENodW5rKS0+aUdyZWVueCAgICAgID0gaUdyZWVueDsKKyAgKChtbmdfY2hybXApcENodW5rKS0+aUdyZWVueSAgICAgID0gaUdyZWVueTsKKyAgKChtbmdfY2hybXApcENodW5rKS0+aUJsdWV4ICAgICAgID0gaUJsdWV4OworICAoKG1uZ19jaHJtcClwQ2h1bmspLT5pQmx1ZXkgICAgICAgPSBpQmx1ZXk7CisKKyAgbW5nX2FkZF9jaHVuayAocERhdGEsIHBDaHVuayk7ICAgICAgIC8qIGFkZCBpdCB0byB0aGUgbGlzdCAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1BVVENIVU5LX0NIUk0sIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19zUkdCCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfcHV0Y2h1bmtfc3JnYiAobW5nX2hhbmRsZSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgYkVtcHR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaVJlbmRlcmluZ2ludGVudCkKK3sKKyAgbW5nX2RhdGFwICAgICAgICBwRGF0YTsKKyAgbW5nX2NodW5rcCAgICAgICBwQ2h1bms7CisgIG1uZ19yZXRjb2RlICAgICAgaVJldGNvZGU7CisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorICBtbmdfY2h1bmtfaGVhZGVyIHNDaHVua2hlYWRlciA9CisjaWZkZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyAgICAgICAgICB7TU5HX1VJTlRfc1JHQiwgbW5nX2luaXRfZ2VuZXJhbCwgbW5nX2ZyZWVfZ2VuZXJhbCwgbW5nX3JlYWRfc3JnYiwgbW5nX3dyaXRlX3NyZ2IsIG1uZ19hc3NpZ25fZ2VuZXJhbCwgMCwgMCwgc2l6ZW9mKG1uZ19zcmdiKX07CisjZWxzZQorICAgICAgICAgIHtNTkdfVUlOVF9zUkdCLCBtbmdfaW5pdF9zcmdiLCBtbmdfZnJlZV9zcmdiLCBtbmdfcmVhZF9zcmdiLCBtbmdfd3JpdGVfc3JnYiwgbW5nX2Fzc2lnbl9zcmdiLCAwLCAwfTsKKyNlbmRpZgorI2Vsc2UKKyAgbW5nX2NodW5rX2hlYWRlciBzQ2h1bmtoZWFkZXI7CisjZW5kaWYKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9QVVRDSFVOS19TUkdCLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFIChoSGFuZGxlKSAgICAgICAgICAgIC8qIGNoZWNrIHZhbGlkaXR5IGhhbmRsZSAqLworICBwRGF0YSA9IChtbmdfZGF0YXApaEhhbmRsZTsgICAgICAgICAgLyogYW5kIG1ha2UgaXQgYWRkcmVzc2FibGUgKi8KKworICBpZiAoIXBEYXRhLT5iQ3JlYXRpbmcpICAgICAgICAgICAgICAgLyogYXJlbid0IHdlIGNyZWF0aW5nIGEgbmV3IGZpbGUgPyAqLworICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19GVU5DVElPTklOVkFMSUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtdXN0IGhhdmUgaGFkIGEgaGVhZGVyIGZpcnN0ISAqLworICBpZiAocERhdGEtPmlGaXJzdGNodW5rYWRkZWQgPT0gMCkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfTk9IRUFERVIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcmV2ZW50IG1pc3BsYWNlZCBURVJNICEgKi8KKyAgaWYgKCFjaGVja190ZXJtIChwRGF0YSwgTU5HX1VJTlRfc1JHQikpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1RFUk1TRVFFUlJPUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSB0aGUgY2h1bmsgKi8KKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisjaWZkZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9nZW5lcmFsIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZWxzZQorICBpUmV0Y29kZSA9IG1uZ19pbml0X3NyZ2IgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbmRpZgorI2Vsc2UKKyAgbW5nX2dldF9jaHVua2hlYWRlcihNTkdfVUlOVF9zUkdCLCAmc0NodW5raGVhZGVyKTsKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9nZW5lcmFsIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZW5kaWYKKworICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaWxsIHRoZSBjaHVuayAqLworICAoKG1uZ19zcmdicClwQ2h1bmspLT5iRW1wdHkgICAgICAgICAgID0gYkVtcHR5OworICAoKG1uZ19zcmdicClwQ2h1bmspLT5pUmVuZGVyaW5naW50ZW50ID0gaVJlbmRlcmluZ2ludGVudDsKKworICBtbmdfYWRkX2NodW5rIChwRGF0YSwgcENodW5rKTsgICAgICAgLyogYWRkIGl0IHRvIHRoZSBsaXN0ICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fUFVUQ0hVTktfU1JHQiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX2lDQ1AKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19wdXRjaHVua19pY2NwIChtbmdfaGFuZGxlIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2Jvb2wgICBiRW1wdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpTmFtZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3BjaGFyICB6TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggIGlDb21wcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlQcm9maWxlc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcHRyICAgIHBQcm9maWxlKQoreworICBtbmdfZGF0YXAgICAgICAgIHBEYXRhOworICBtbmdfY2h1bmtwICAgICAgIHBDaHVuazsKKyAgbW5nX3JldGNvZGUgICAgICBpUmV0Y29kZTsKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisgIG1uZ19jaHVua19oZWFkZXIgc0NodW5raGVhZGVyID0KKyNpZmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICAgICAgICAgIHtNTkdfVUlOVF9pQ0NQLCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9pY2NwLCBtbmdfcmVhZF9pY2NwLCBtbmdfd3JpdGVfaWNjcCwgbW5nX2Fzc2lnbl9pY2NwLCAwLCAwLCBzaXplb2YobW5nX2ljY3ApfTsKKyNlbHNlCisgICAgICAgICAge01OR19VSU5UX2lDQ1AsIG1uZ19pbml0X2ljY3AsIG1uZ19mcmVlX2ljY3AsIG1uZ19yZWFkX2ljY3AsIG1uZ193cml0ZV9pY2NwLCBtbmdfYXNzaWduX2ljY3AsIDAsIDB9OworI2VuZGlmCisjZWxzZQorICBtbmdfY2h1bmtfaGVhZGVyIHNDaHVua2hlYWRlcjsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1BVVENIVU5LX0lDQ1AsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhID0gKG1uZ19kYXRhcCloSGFuZGxlOyAgICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworCisgIGlmICghcERhdGEtPmJDcmVhdGluZykgICAgICAgICAgICAgICAvKiBhcmVuJ3Qgd2UgY3JlYXRpbmcgYSBuZXcgZmlsZSA/ICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0ZVTkNUSU9OSU5WQUxJRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG11c3QgaGF2ZSBoYWQgYSBoZWFkZXIgZmlyc3QhICovCisgIGlmIChwRGF0YS0+aUZpcnN0Y2h1bmthZGRlZCA9PSAwKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19OT0hFQURFUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByZXZlbnQgbWlzcGxhY2VkIFRFUk0gISAqLworICBpZiAoIWNoZWNrX3Rlcm0gKHBEYXRhLCBNTkdfVUlOVF9pQ0NQKSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfVEVSTVNFUUVSUk9SKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIHRoZSBjaHVuayAqLworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyNpZmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICBpUmV0Y29kZSA9IG1uZ19pbml0X2dlbmVyYWwgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbHNlCisgIGlSZXRjb2RlID0gbW5nX2luaXRfaWNjcCAocERhdGEsICZzQ2h1bmtoZWFkZXIsICZwQ2h1bmspOworI2VuZGlmCisjZWxzZQorICBtbmdfZ2V0X2NodW5raGVhZGVyKE1OR19VSU5UX2lDQ1AsICZzQ2h1bmtoZWFkZXIpOworICBpUmV0Y29kZSA9IG1uZ19pbml0X2dlbmVyYWwgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbmRpZgorCisgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbGwgdGhlIGNodW5rICovCisgICgobW5nX2ljY3BwKXBDaHVuayktPmJFbXB0eSAgICAgICA9IGJFbXB0eTsKKyAgKChtbmdfaWNjcHApcENodW5rKS0+aU5hbWVzaXplICAgID0gaU5hbWVzaXplOworICAoKG1uZ19pY2NwcClwQ2h1bmspLT5pQ29tcHJlc3Npb24gPSBpQ29tcHJlc3Npb247CisgICgobW5nX2ljY3BwKXBDaHVuayktPmlQcm9maWxlc2l6ZSA9IGlQcm9maWxlc2l6ZTsKKworICBpZiAoaU5hbWVzaXplKQorICB7CisgICAgTU5HX0FMTE9DIChwRGF0YSwgKChtbmdfaWNjcHApcENodW5rKS0+ek5hbWUsIGlOYW1lc2l6ZSArIDEpOworICAgIE1OR19DT1BZICgoKG1uZ19pY2NwcClwQ2h1bmspLT56TmFtZSwgek5hbWUsIGlOYW1lc2l6ZSk7CisgIH0KKworICBpZiAoaVByb2ZpbGVzaXplKQorICB7CisgICAgTU5HX0FMTE9DIChwRGF0YSwgKChtbmdfaWNjcHApcENodW5rKS0+cFByb2ZpbGUsIGlQcm9maWxlc2l6ZSk7CisgICAgTU5HX0NPUFkgKCgobW5nX2ljY3BwKXBDaHVuayktPnBQcm9maWxlLCBwUHJvZmlsZSwgaVByb2ZpbGVzaXplKTsKKyAgfQorCisgIG1uZ19hZGRfY2h1bmsgKHBEYXRhLCBwQ2h1bmspOyAgICAgICAvKiBhZGQgaXQgdG8gdGhlIGxpc3QgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9QVVRDSFVOS19JQ0NQLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfdEVYdAorbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3B1dGNodW5rX3RleHQgKG1uZ19oYW5kbGUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlLZXl3b3Jkc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcGNoYXIgIHpLZXl3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaVRleHRzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wY2hhciAgelRleHQpCit7CisgIG1uZ19kYXRhcCAgICAgICAgcERhdGE7CisgIG1uZ19jaHVua3AgICAgICAgcENodW5rOworICBtbmdfcmV0Y29kZSAgICAgIGlSZXRjb2RlOworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyAgbW5nX2NodW5rX2hlYWRlciBzQ2h1bmtoZWFkZXIgPQorI2lmZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisgICAgICAgICAge01OR19VSU5UX3RFWHQsIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX3RleHQsIG1uZ19yZWFkX3RleHQsIG1uZ193cml0ZV90ZXh0LCBtbmdfYXNzaWduX3RleHQsIDAsIDAsIHNpemVvZihtbmdfdGV4dCl9OworI2Vsc2UKKyAgICAgICAgICB7TU5HX1VJTlRfdEVYdCwgbW5nX2luaXRfdGV4dCwgbW5nX2ZyZWVfdGV4dCwgbW5nX3JlYWRfdGV4dCwgbW5nX3dyaXRlX3RleHQsIG1uZ19hc3NpZ25fdGV4dCwgMCwgMH07CisjZW5kaWYKKyNlbHNlCisgIG1uZ19jaHVua19oZWFkZXIgc0NodW5raGVhZGVyOworI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fUFVUQ0hVTktfVEVYVCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkgICAgICAgICAgICAvKiBjaGVjayB2YWxpZGl0eSBoYW5kbGUgKi8KKyAgcERhdGEgPSAobW5nX2RhdGFwKWhIYW5kbGU7ICAgICAgICAgIC8qIGFuZCBtYWtlIGl0IGFkZHJlc3NhYmxlICovCisKKyAgaWYgKCFwRGF0YS0+YkNyZWF0aW5nKSAgICAgICAgICAgICAgIC8qIGFyZW4ndCB3ZSBjcmVhdGluZyBhIG5ldyBmaWxlID8gKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfRlVOQ1RJT05JTlZBTElEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbXVzdCBoYXZlIGhhZCBhIGhlYWRlciBmaXJzdCEgKi8KKyAgaWYgKHBEYXRhLT5pRmlyc3RjaHVua2FkZGVkID09IDApCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX05PSEVBREVSKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJldmVudCBtaXNwbGFjZWQgVEVSTSAhICovCisgIGlmICghY2hlY2tfdGVybSAocERhdGEsIE1OR19VSU5UX3RFWHQpKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19URVJNU0VRRVJST1IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgdGhlIGNodW5rICovCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorI2lmZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisgIGlSZXRjb2RlID0gbW5nX2luaXRfZ2VuZXJhbCAocERhdGEsICZzQ2h1bmtoZWFkZXIsICZwQ2h1bmspOworI2Vsc2UKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF90ZXh0IChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZW5kaWYKKyNlbHNlCisgIG1uZ19nZXRfY2h1bmtoZWFkZXIoTU5HX1VJTlRfdEVYdCwgJnNDaHVua2hlYWRlcik7CisgIGlSZXRjb2RlID0gbW5nX2luaXRfZ2VuZXJhbCAocERhdGEsICZzQ2h1bmtoZWFkZXIsICZwQ2h1bmspOworI2VuZGlmCisKKyAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgcmV0dXJuIGlSZXRjb2RlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmlsbCB0aGUgY2h1bmsgKi8KKyAgKChtbmdfdGV4dHApcENodW5rKS0+aUtleXdvcmRzaXplID0gaUtleXdvcmRzaXplOworICAoKG1uZ190ZXh0cClwQ2h1bmspLT5pVGV4dHNpemUgICAgPSBpVGV4dHNpemU7CisKKyAgaWYgKGlLZXl3b3Jkc2l6ZSkKKyAgeworICAgIE1OR19BTExPQyAocERhdGEsICgobW5nX3RleHRwKXBDaHVuayktPnpLZXl3b3JkLCBpS2V5d29yZHNpemUgKyAxKTsKKyAgICBNTkdfQ09QWSAoKChtbmdfdGV4dHApcENodW5rKS0+ektleXdvcmQsIHpLZXl3b3JkLCBpS2V5d29yZHNpemUpOworICB9CisKKyAgaWYgKGlUZXh0c2l6ZSkKKyAgeworICAgIE1OR19BTExPQyAocERhdGEsICgobW5nX3RleHRwKXBDaHVuayktPnpUZXh0LCBpVGV4dHNpemUgKyAxKTsKKyAgICBNTkdfQ09QWSAoKChtbmdfdGV4dHApcENodW5rKS0+elRleHQsIHpUZXh0LCBpVGV4dHNpemUpOworICB9CisKKyAgbW5nX2FkZF9jaHVuayAocERhdGEsIHBDaHVuayk7ICAgICAgIC8qIGFkZCBpdCB0byB0aGUgbGlzdCAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1BVVENIVU5LX1RFWFQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS196VFh0CittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfcHV0Y2h1bmtfenR4dCAobW5nX2hhbmRsZSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaUtleXdvcmRzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wY2hhciAgektleXdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICBpQ29tcHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpVGV4dHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3BjaGFyICB6VGV4dCkKK3sKKyAgbW5nX2RhdGFwICAgICAgICBwRGF0YTsKKyAgbW5nX2NodW5rcCAgICAgICBwQ2h1bms7CisgIG1uZ19yZXRjb2RlICAgICAgaVJldGNvZGU7CisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorICBtbmdfY2h1bmtfaGVhZGVyIHNDaHVua2hlYWRlciA9CisjaWZkZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyAgICAgICAgICB7TU5HX1VJTlRfelRYdCwgbW5nX2luaXRfZ2VuZXJhbCwgbW5nX2ZyZWVfenR4dCwgbW5nX3JlYWRfenR4dCwgbW5nX3dyaXRlX3p0eHQsIG1uZ19hc3NpZ25fenR4dCwgMCwgMCwgc2l6ZW9mKG1uZ196dHh0KX07CisjZWxzZQorICAgICAgICAgIHtNTkdfVUlOVF96VFh0LCBtbmdfaW5pdF96dHh0LCBtbmdfZnJlZV96dHh0LCBtbmdfcmVhZF96dHh0LCBtbmdfd3JpdGVfenR4dCwgbW5nX2Fzc2lnbl96dHh0LCAwLCAwfTsKKyNlbmRpZgorI2Vsc2UKKyAgbW5nX2NodW5rX2hlYWRlciBzQ2h1bmtoZWFkZXI7CisjZW5kaWYKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9QVVRDSFVOS19aVFhULCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFIChoSGFuZGxlKSAgICAgICAgICAgIC8qIGNoZWNrIHZhbGlkaXR5IGhhbmRsZSAqLworICBwRGF0YSA9IChtbmdfZGF0YXApaEhhbmRsZTsgICAgICAgICAgLyogYW5kIG1ha2UgaXQgYWRkcmVzc2FibGUgKi8KKworICBpZiAoIXBEYXRhLT5iQ3JlYXRpbmcpICAgICAgICAgICAgICAgLyogYXJlbid0IHdlIGNyZWF0aW5nIGEgbmV3IGZpbGUgPyAqLworICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19GVU5DVElPTklOVkFMSUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtdXN0IGhhdmUgaGFkIGEgaGVhZGVyIGZpcnN0ISAqLworICBpZiAocERhdGEtPmlGaXJzdGNodW5rYWRkZWQgPT0gMCkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfTk9IRUFERVIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcmV2ZW50IG1pc3BsYWNlZCBURVJNICEgKi8KKyAgaWYgKCFjaGVja190ZXJtIChwRGF0YSwgTU5HX1VJTlRfelRYdCkpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1RFUk1TRVFFUlJPUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSB0aGUgY2h1bmsgKi8KKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisjaWZkZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9nZW5lcmFsIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZWxzZQorICBpUmV0Y29kZSA9IG1uZ19pbml0X3p0eHQgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbmRpZgorI2Vsc2UKKyAgbW5nX2dldF9jaHVua2hlYWRlcihNTkdfVUlOVF96VFh0LCAmc0NodW5raGVhZGVyKTsKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9nZW5lcmFsIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZW5kaWYKKworICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaWxsIHRoZSBjaHVuayAqLworICAoKG1uZ196dHh0cClwQ2h1bmspLT5pS2V5d29yZHNpemUgPSBpS2V5d29yZHNpemU7CisgICgobW5nX3p0eHRwKXBDaHVuayktPmlDb21wcmVzc2lvbiA9IGlDb21wcmVzc2lvbjsKKyAgKChtbmdfenR4dHApcENodW5rKS0+aVRleHRzaXplICAgID0gaVRleHRzaXplOworCisgIGlmIChpS2V5d29yZHNpemUpCisgIHsKKyAgICBNTkdfQUxMT0MgKHBEYXRhLCAoKG1uZ196dHh0cClwQ2h1bmspLT56S2V5d29yZCwgaUtleXdvcmRzaXplICsgMSk7CisgICAgTU5HX0NPUFkgKCgobW5nX3p0eHRwKXBDaHVuayktPnpLZXl3b3JkLCB6S2V5d29yZCwgaUtleXdvcmRzaXplKTsKKyAgfQorCisgIGlmIChpVGV4dHNpemUpCisgIHsKKyAgICBNTkdfQUxMT0MgKHBEYXRhLCAoKG1uZ196dHh0cClwQ2h1bmspLT56VGV4dCwgaVRleHRzaXplICsgMSk7CisgICAgTU5HX0NPUFkgICgoKG1uZ196dHh0cClwQ2h1bmspLT56VGV4dCwgelRleHQsIGlUZXh0c2l6ZSk7CisgIH0KKworICBtbmdfYWRkX2NodW5rIChwRGF0YSwgcENodW5rKTsgICAgICAgLyogYWRkIGl0IHRvIHRoZSBsaXN0ICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fUFVUQ0hVTktfWlRYVCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX2lUWHQKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19wdXRjaHVua19pdHh0IChtbmdfaGFuZGxlIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpS2V5d29yZHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3BjaGFyICB6S2V5d29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggIGlDb21wcmVzc2lvbmZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICBpQ29tcHJlc3Npb25tZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpTGFuZ3VhZ2VzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wY2hhciAgekxhbmd1YWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaVRyYW5zbGF0aW9uc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcGNoYXIgIHpUcmFuc2xhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlUZXh0c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcGNoYXIgIHpUZXh0KQoreworICBtbmdfZGF0YXAgICAgICAgIHBEYXRhOworICBtbmdfY2h1bmtwICAgICAgIHBDaHVuazsKKyAgbW5nX3JldGNvZGUgICAgICBpUmV0Y29kZTsKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisgIG1uZ19jaHVua19oZWFkZXIgc0NodW5raGVhZGVyID0KKyNpZmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICAgICAgICAgIHtNTkdfVUlOVF9pVFh0LCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9pdHh0LCBtbmdfcmVhZF9pdHh0LCBtbmdfd3JpdGVfaXR4dCwgbW5nX2Fzc2lnbl9pdHh0LCAwLCAwLCBzaXplb2YobW5nX2l0eHQpfTsKKyNlbHNlCisgICAgICAgICAge01OR19VSU5UX2lUWHQsIG1uZ19pbml0X2l0eHQsIG1uZ19mcmVlX2l0eHQsIG1uZ19yZWFkX2l0eHQsIG1uZ193cml0ZV9pdHh0LCBtbmdfYXNzaWduX2l0eHQsIDAsIDB9OworI2VuZGlmCisjZWxzZQorICBtbmdfY2h1bmtfaGVhZGVyIHNDaHVua2hlYWRlcjsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1BVVENIVU5LX0lUWFQsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhID0gKG1uZ19kYXRhcCloSGFuZGxlOyAgICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworCisgIGlmICghcERhdGEtPmJDcmVhdGluZykgICAgICAgICAgICAgICAvKiBhcmVuJ3Qgd2UgY3JlYXRpbmcgYSBuZXcgZmlsZSA/ICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0ZVTkNUSU9OSU5WQUxJRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG11c3QgaGF2ZSBoYWQgYSBoZWFkZXIgZmlyc3QhICovCisgIGlmIChwRGF0YS0+aUZpcnN0Y2h1bmthZGRlZCA9PSAwKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19OT0hFQURFUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByZXZlbnQgbWlzcGxhY2VkIFRFUk0gISAqLworICBpZiAoIWNoZWNrX3Rlcm0gKHBEYXRhLCBNTkdfVUlOVF9pVFh0KSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfVEVSTVNFUUVSUk9SKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIHRoZSBjaHVuayAqLworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyNpZmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICBpUmV0Y29kZSA9IG1uZ19pbml0X2dlbmVyYWwgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbHNlCisgIGlSZXRjb2RlID0gbW5nX2luaXRfaXR4dCAocERhdGEsICZzQ2h1bmtoZWFkZXIsICZwQ2h1bmspOworI2VuZGlmCisjZWxzZQorICBtbmdfZ2V0X2NodW5raGVhZGVyKE1OR19VSU5UX2lUWHQsICZzQ2h1bmtoZWFkZXIpOworICBpUmV0Y29kZSA9IG1uZ19pbml0X2dlbmVyYWwgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbmRpZgorCisgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbGwgdGhlIGNodW5rICovCisgICgobW5nX2l0eHRwKXBDaHVuayktPmlLZXl3b3Jkc2l6ZSAgICAgICA9IGlLZXl3b3Jkc2l6ZTsKKyAgKChtbmdfaXR4dHApcENodW5rKS0+aUNvbXByZXNzaW9uZmxhZyAgID0gaUNvbXByZXNzaW9uZmxhZzsKKyAgKChtbmdfaXR4dHApcENodW5rKS0+aUNvbXByZXNzaW9ubWV0aG9kID0gaUNvbXByZXNzaW9ubWV0aG9kOworICAoKG1uZ19pdHh0cClwQ2h1bmspLT5pTGFuZ3VhZ2VzaXplICAgICAgPSBpTGFuZ3VhZ2VzaXplOworICAoKG1uZ19pdHh0cClwQ2h1bmspLT5pVHJhbnNsYXRpb25zaXplICAgPSBpVHJhbnNsYXRpb25zaXplOworICAoKG1uZ19pdHh0cClwQ2h1bmspLT5pVGV4dHNpemUgICAgICAgICAgPSBpVGV4dHNpemU7CisKKyAgaWYgKGlLZXl3b3Jkc2l6ZSkKKyAgeworICAgIE1OR19BTExPQyAocERhdGEsICgobW5nX2l0eHRwKXBDaHVuayktPnpLZXl3b3JkLCBpS2V5d29yZHNpemUgKyAxKTsKKyAgICBNTkdfQ09QWSAoKChtbmdfaXR4dHApcENodW5rKS0+ektleXdvcmQsIHpLZXl3b3JkLCBpS2V5d29yZHNpemUpOworICB9CisKKyAgaWYgKGlMYW5ndWFnZXNpemUpCisgIHsKKyAgICBNTkdfQUxMT0MgKHBEYXRhLCAoKG1uZ19pdHh0cClwQ2h1bmspLT56TGFuZ3VhZ2UsIGlMYW5ndWFnZXNpemUgKyAxKTsKKyAgICBNTkdfQ09QWSAoKChtbmdfaXR4dHApcENodW5rKS0+ekxhbmd1YWdlLCB6TGFuZ3VhZ2UsIGlMYW5ndWFnZXNpemUpOworICB9CisKKyAgaWYgKGlUcmFuc2xhdGlvbnNpemUpCisgIHsKKyAgICBNTkdfQUxMT0MgKHBEYXRhLCAoKG1uZ19pdHh0cClwQ2h1bmspLT56VHJhbnNsYXRpb24sIGlUcmFuc2xhdGlvbnNpemUgKyAxKTsKKyAgICBNTkdfQ09QWSAoKChtbmdfaXR4dHApcENodW5rKS0+elRyYW5zbGF0aW9uLCB6VHJhbnNsYXRpb24sIGlUcmFuc2xhdGlvbnNpemUpOworICB9CisKKyAgaWYgKGlUZXh0c2l6ZSkKKyAgeworICAgIE1OR19BTExPQyAocERhdGEsICgobW5nX2l0eHRwKXBDaHVuayktPnpUZXh0LCBpVGV4dHNpemUgKyAxKTsKKyAgICBNTkdfQ09QWSAoKChtbmdfaXR4dHApcENodW5rKS0+elRleHQsIHpUZXh0LCBpVGV4dHNpemUpOworICB9CisKKyAgbW5nX2FkZF9jaHVuayAocERhdGEsIHBDaHVuayk7ICAgICAgIC8qIGFkZCBpdCB0byB0aGUgbGlzdCAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1BVVENIVU5LX0lUWFQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19iS0dECittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfcHV0Y2h1bmtfYmtnZCAobW5nX2hhbmRsZSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgYkVtcHR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICBpSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpR3JheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlSZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpR3JlZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpQmx1ZSkKK3sKKyAgbW5nX2RhdGFwICAgICAgICBwRGF0YTsKKyAgbW5nX2NodW5rcCAgICAgICBwQ2h1bms7CisgIG1uZ19yZXRjb2RlICAgICAgaVJldGNvZGU7CisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorICBtbmdfY2h1bmtfaGVhZGVyIHNDaHVua2hlYWRlciA9CisjaWZkZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyAgICAgICAgICB7TU5HX1VJTlRfYktHRCwgbW5nX2luaXRfZ2VuZXJhbCwgbW5nX2ZyZWVfZ2VuZXJhbCwgbW5nX3JlYWRfYmtnZCwgbW5nX3dyaXRlX2JrZ2QsIG1uZ19hc3NpZ25fZ2VuZXJhbCwgMCwgMCwgc2l6ZW9mKG1uZ19ia2dkKX07CisjZWxzZQorICAgICAgICAgIHtNTkdfVUlOVF9iS0dELCBtbmdfaW5pdF9ia2dkLCBtbmdfZnJlZV9ia2dkLCBtbmdfcmVhZF9ia2dkLCBtbmdfd3JpdGVfYmtnZCwgbW5nX2Fzc2lnbl9ia2dkLCAwLCAwfTsKKyNlbmRpZgorI2Vsc2UKKyAgbW5nX2NodW5rX2hlYWRlciBzQ2h1bmtoZWFkZXI7CisjZW5kaWYKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9QVVRDSFVOS19CS0dELCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFIChoSGFuZGxlKSAgICAgICAgICAgIC8qIGNoZWNrIHZhbGlkaXR5IGhhbmRsZSAqLworICBwRGF0YSA9IChtbmdfZGF0YXApaEhhbmRsZTsgICAgICAgICAgLyogYW5kIG1ha2UgaXQgYWRkcmVzc2FibGUgKi8KKworICBpZiAoIXBEYXRhLT5iQ3JlYXRpbmcpICAgICAgICAgICAgICAgLyogYXJlbid0IHdlIGNyZWF0aW5nIGEgbmV3IGZpbGUgPyAqLworICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19GVU5DVElPTklOVkFMSUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtdXN0IGhhdmUgaGFkIGEgaGVhZGVyIGZpcnN0ISAqLworICBpZiAocERhdGEtPmlGaXJzdGNodW5rYWRkZWQgPT0gMCkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfTk9IRUFERVIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcmV2ZW50IG1pc3BsYWNlZCBURVJNICEgKi8KKyAgaWYgKCFjaGVja190ZXJtIChwRGF0YSwgTU5HX1VJTlRfYktHRCkpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1RFUk1TRVFFUlJPUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSB0aGUgY2h1bmsgKi8KKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisjaWZkZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9nZW5lcmFsIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZWxzZQorICBpUmV0Y29kZSA9IG1uZ19pbml0X2JrZ2QgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbmRpZgorI2Vsc2UKKyAgbW5nX2dldF9jaHVua2hlYWRlcihNTkdfVUlOVF9iS0dELCAmc0NodW5raGVhZGVyKTsKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9nZW5lcmFsIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZW5kaWYKKworICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaWxsIHRoZSBjaHVuayAqLworICAoKG1uZ19ia2dkcClwQ2h1bmspLT5iRW1wdHkgPSBiRW1wdHk7CisgICgobW5nX2JrZ2RwKXBDaHVuayktPmlUeXBlICA9IGlUeXBlOworICAoKG1uZ19ia2dkcClwQ2h1bmspLT5pSW5kZXggPSBpSW5kZXg7CisgICgobW5nX2JrZ2RwKXBDaHVuayktPmlHcmF5ICA9IGlHcmF5OworICAoKG1uZ19ia2dkcClwQ2h1bmspLT5pUmVkICAgPSBpUmVkOworICAoKG1uZ19ia2dkcClwQ2h1bmspLT5pR3JlZW4gPSBpR3JlZW47CisgICgobW5nX2JrZ2RwKXBDaHVuayktPmlCbHVlICA9IGlCbHVlOworCisgIG1uZ19hZGRfY2h1bmsgKHBEYXRhLCBwQ2h1bmspOyAgICAgICAvKiBhZGQgaXQgdG8gdGhlIGxpc3QgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9QVVRDSFVOS19CS0dELCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfcEhZcworbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3B1dGNodW5rX3BoeXMgKG1uZ19oYW5kbGUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfYm9vbCAgIGJFbXB0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlTaXpleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlTaXpleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggIGlVbml0KQoreworICBtbmdfZGF0YXAgICAgICAgIHBEYXRhOworICBtbmdfY2h1bmtwICAgICAgIHBDaHVuazsKKyAgbW5nX3JldGNvZGUgICAgICBpUmV0Y29kZTsKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisgIG1uZ19jaHVua19oZWFkZXIgc0NodW5raGVhZGVyID0KKyNpZmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICAgICAgICAgIHtNTkdfVUlOVF9wSFlzLCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9nZW5lcmFsLCBtbmdfcmVhZF9waHlzLCBtbmdfd3JpdGVfcGh5cywgbW5nX2Fzc2lnbl9nZW5lcmFsLCAwLCAwLCBzaXplb2YobW5nX3BoeXMpfTsKKyNlbHNlCisgICAgICAgICAge01OR19VSU5UX3BIWXMsIG1uZ19pbml0X3BoeXMsIG1uZ19mcmVlX3BoeXMsIG1uZ19yZWFkX3BoeXMsIG1uZ193cml0ZV9waHlzLCBtbmdfYXNzaWduX3BoeXMsIDAsIDB9OworI2VuZGlmCisjZWxzZQorICBtbmdfY2h1bmtfaGVhZGVyIHNDaHVua2hlYWRlcjsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1BVVENIVU5LX1BIWVMsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhID0gKG1uZ19kYXRhcCloSGFuZGxlOyAgICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworCisgIGlmICghcERhdGEtPmJDcmVhdGluZykgICAgICAgICAgICAgICAvKiBhcmVuJ3Qgd2UgY3JlYXRpbmcgYSBuZXcgZmlsZSA/ICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0ZVTkNUSU9OSU5WQUxJRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG11c3QgaGF2ZSBoYWQgYSBoZWFkZXIgZmlyc3QhICovCisgIGlmIChwRGF0YS0+aUZpcnN0Y2h1bmthZGRlZCA9PSAwKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19OT0hFQURFUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByZXZlbnQgbWlzcGxhY2VkIFRFUk0gISAqLworICBpZiAoIWNoZWNrX3Rlcm0gKHBEYXRhLCBNTkdfVUlOVF9wSFlzKSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfVEVSTVNFUUVSUk9SKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIHRoZSBjaHVuayAqLworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyNpZmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICBpUmV0Y29kZSA9IG1uZ19pbml0X2dlbmVyYWwgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbHNlCisgIGlSZXRjb2RlID0gbW5nX2luaXRfcGh5cyAocERhdGEsICZzQ2h1bmtoZWFkZXIsICZwQ2h1bmspOworI2VuZGlmCisjZWxzZQorICBtbmdfZ2V0X2NodW5raGVhZGVyKE1OR19VSU5UX3BIWXMsICZzQ2h1bmtoZWFkZXIpOworICBpUmV0Y29kZSA9IG1uZ19pbml0X2dlbmVyYWwgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbmRpZgorCisgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbGwgdGhlIGNodW5rICovCisgICgobW5nX3BoeXNwKXBDaHVuayktPmJFbXB0eSA9IGJFbXB0eTsKKyAgKChtbmdfcGh5c3ApcENodW5rKS0+aVNpemV4ID0gaVNpemV4OworICAoKG1uZ19waHlzcClwQ2h1bmspLT5pU2l6ZXkgPSBpU2l6ZXk7CisgICgobW5nX3BoeXNwKXBDaHVuayktPmlVbml0ICA9IGlVbml0OworCisgIG1uZ19hZGRfY2h1bmsgKHBEYXRhLCBwQ2h1bmspOyAgICAgICAvKiBhZGQgaXQgdG8gdGhlIGxpc3QgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9QVVRDSFVOS19QSFlTLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfc0JJVAorbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3B1dGNodW5rX3NiaXQgKG1uZ19oYW5kbGUgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfYm9vbCAgICAgIGJFbXB0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgIGlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OGFycjQgYUJpdHMpCit7CisgIG1uZ19kYXRhcCAgICAgICAgcERhdGE7CisgIG1uZ19jaHVua3AgICAgICAgcENodW5rOworICBtbmdfcmV0Y29kZSAgICAgIGlSZXRjb2RlOworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyAgbW5nX2NodW5rX2hlYWRlciBzQ2h1bmtoZWFkZXIgPQorI2lmZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisgICAgICAgICAge01OR19VSU5UX3NCSVQsIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX2dlbmVyYWwsIG1uZ19yZWFkX3NiaXQsIG1uZ193cml0ZV9zYml0LCBtbmdfYXNzaWduX2dlbmVyYWwsIDAsIDAsIHNpemVvZihtbmdfc2JpdCl9OworI2Vsc2UKKyAgICAgICAgICB7TU5HX1VJTlRfc0JJVCwgbW5nX2luaXRfc2JpdCwgbW5nX2ZyZWVfc2JpdCwgbW5nX3JlYWRfc2JpdCwgbW5nX3dyaXRlX3NiaXQsIG1uZ19hc3NpZ25fc2JpdCwgMCwgMH07CisjZW5kaWYKKyNlbHNlCisgIG1uZ19jaHVua19oZWFkZXIgc0NodW5raGVhZGVyOworI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fUFVUQ0hVTktfU0JJVCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkgICAgICAgICAgICAvKiBjaGVjayB2YWxpZGl0eSBoYW5kbGUgKi8KKyAgcERhdGEgPSAobW5nX2RhdGFwKWhIYW5kbGU7ICAgICAgICAgIC8qIGFuZCBtYWtlIGl0IGFkZHJlc3NhYmxlICovCisKKyAgaWYgKCFwRGF0YS0+YkNyZWF0aW5nKSAgICAgICAgICAgICAgIC8qIGFyZW4ndCB3ZSBjcmVhdGluZyBhIG5ldyBmaWxlID8gKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfRlVOQ1RJT05JTlZBTElEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbXVzdCBoYXZlIGhhZCBhIGhlYWRlciBmaXJzdCEgKi8KKyAgaWYgKHBEYXRhLT5pRmlyc3RjaHVua2FkZGVkID09IDApCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX05PSEVBREVSKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJldmVudCBtaXNwbGFjZWQgVEVSTSAhICovCisgIGlmICghY2hlY2tfdGVybSAocERhdGEsIE1OR19VSU5UX3NCSVQpKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19URVJNU0VRRVJST1IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgdGhlIGNodW5rICovCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorI2lmZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisgIGlSZXRjb2RlID0gbW5nX2luaXRfZ2VuZXJhbCAocERhdGEsICZzQ2h1bmtoZWFkZXIsICZwQ2h1bmspOworI2Vsc2UKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9zYml0IChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZW5kaWYKKyNlbHNlCisgIG1uZ19nZXRfY2h1bmtoZWFkZXIoTU5HX1VJTlRfc0JJVCwgJnNDaHVua2hlYWRlcik7CisgIGlSZXRjb2RlID0gbW5nX2luaXRfZ2VuZXJhbCAocERhdGEsICZzQ2h1bmtoZWFkZXIsICZwQ2h1bmspOworI2VuZGlmCisKKyAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgcmV0dXJuIGlSZXRjb2RlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmlsbCB0aGUgY2h1bmsgKi8KKyAgKChtbmdfc2JpdHApcENodW5rKS0+YkVtcHR5ICAgPSBiRW1wdHk7CisgICgobW5nX3NiaXRwKXBDaHVuayktPmlUeXBlICAgID0gaVR5cGU7CisgICgobW5nX3NiaXRwKXBDaHVuayktPmFCaXRzWzBdID0gYUJpdHNbMF07CisgICgobW5nX3NiaXRwKXBDaHVuayktPmFCaXRzWzFdID0gYUJpdHNbMV07CisgICgobW5nX3NiaXRwKXBDaHVuayktPmFCaXRzWzJdID0gYUJpdHNbMl07CisgICgobW5nX3NiaXRwKXBDaHVuayktPmFCaXRzWzNdID0gYUJpdHNbM107CisKKyAgbW5nX2FkZF9jaHVuayAocERhdGEsIHBDaHVuayk7ICAgICAgIC8qIGFkZCBpdCB0byB0aGUgbGlzdCAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1BVVENIVU5LX1NCSVQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19zUExUCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfcHV0Y2h1bmtfc3BsdCAobW5nX2hhbmRsZSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgYkVtcHR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaU5hbWVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wY2hhciAgek5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICBpU2FtcGxlZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpRW50cnljb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcHRyICAgIHBFbnRyaWVzKQoreworICBtbmdfZGF0YXAgICAgICAgIHBEYXRhOworICBtbmdfY2h1bmtwICAgICAgIHBDaHVuazsKKyAgbW5nX3JldGNvZGUgICAgICBpUmV0Y29kZTsKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisgIG1uZ19jaHVua19oZWFkZXIgc0NodW5raGVhZGVyID0KKyNpZmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICAgICAgICAgIHtNTkdfVUlOVF9zUExULCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9zcGx0LCBtbmdfcmVhZF9zcGx0LCBtbmdfd3JpdGVfc3BsdCwgbW5nX2Fzc2lnbl9zcGx0LCAwLCAwLCBzaXplb2YobW5nX3NwbHQpfTsKKyNlbHNlCisgICAgICAgICAge01OR19VSU5UX3NQTFQsIG1uZ19pbml0X3NwbHQsIG1uZ19mcmVlX3NwbHQsIG1uZ19yZWFkX3NwbHQsIG1uZ193cml0ZV9zcGx0LCBtbmdfYXNzaWduX3NwbHQsIDAsIDB9OworI2VuZGlmCisjZWxzZQorICBtbmdfY2h1bmtfaGVhZGVyIHNDaHVua2hlYWRlcjsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1BVVENIVU5LX1NQTFQsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhID0gKG1uZ19kYXRhcCloSGFuZGxlOyAgICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworCisgIGlmICghcERhdGEtPmJDcmVhdGluZykgICAgICAgICAgICAgICAvKiBhcmVuJ3Qgd2UgY3JlYXRpbmcgYSBuZXcgZmlsZSA/ICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0ZVTkNUSU9OSU5WQUxJRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG11c3QgaGF2ZSBoYWQgYSBoZWFkZXIgZmlyc3QhICovCisgIGlmIChwRGF0YS0+aUZpcnN0Y2h1bmthZGRlZCA9PSAwKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19OT0hFQURFUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByZXZlbnQgbWlzcGxhY2VkIFRFUk0gISAqLworICBpZiAoIWNoZWNrX3Rlcm0gKHBEYXRhLCBNTkdfVUlOVF9zUExUKSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfVEVSTVNFUUVSUk9SKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIHRoZSBjaHVuayAqLworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyNpZmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICBpUmV0Y29kZSA9IG1uZ19pbml0X2dlbmVyYWwgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbHNlCisgIGlSZXRjb2RlID0gbW5nX2luaXRfc3BsdCAocERhdGEsICZzQ2h1bmtoZWFkZXIsICZwQ2h1bmspOworI2VuZGlmCisjZWxzZQorICBtbmdfZ2V0X2NodW5raGVhZGVyKE1OR19VSU5UX3NQTFQsICZzQ2h1bmtoZWFkZXIpOworICBpUmV0Y29kZSA9IG1uZ19pbml0X2dlbmVyYWwgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbmRpZgorCisgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbGwgdGhlIGNodW5rICovCisgICgobW5nX3NwbHRwKXBDaHVuayktPmJFbXB0eSAgICAgICA9IGJFbXB0eTsKKyAgKChtbmdfc3BsdHApcENodW5rKS0+aU5hbWVzaXplICAgID0gaU5hbWVzaXplOworICAoKG1uZ19zcGx0cClwQ2h1bmspLT5pU2FtcGxlZGVwdGggPSBpU2FtcGxlZGVwdGg7CisgICgobW5nX3NwbHRwKXBDaHVuayktPmlFbnRyeWNvdW50ICA9IGlFbnRyeWNvdW50OworCisgIGlmIChpTmFtZXNpemUpCisgIHsKKyAgICBNTkdfQUxMT0MgKHBEYXRhLCAoKG1uZ19zcGx0cClwQ2h1bmspLT56TmFtZSwgaU5hbWVzaXplICsgMSk7CisgICAgTU5HX0NPUFkgKCgobW5nX3NwbHRwKXBDaHVuayktPnpOYW1lLCB6TmFtZSwgaU5hbWVzaXplKTsKKyAgfQorCisgIGlmIChpRW50cnljb3VudCkKKyAgeworICAgIG1uZ191aW50MzIgaVNpemUgPSBpRW50cnljb3VudCAqICgoaVNhbXBsZWRlcHRoID4+IDEpICsgMik7CisKKyAgICBNTkdfQUxMT0MgKHBEYXRhLCAoKG1uZ19zcGx0cClwQ2h1bmspLT5wRW50cmllcywgaVNpemUpOworICAgIE1OR19DT1BZICAoKChtbmdfc3BsdHApcENodW5rKS0+cEVudHJpZXMsIHBFbnRyaWVzLCBpU2l6ZSk7CisgIH0KKworICBtbmdfYWRkX2NodW5rIChwRGF0YSwgcENodW5rKTsgICAgICAgLyogYWRkIGl0IHRvIHRoZSBsaXN0ICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fUFVUQ0hVTktfU1BMVCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX2hJU1QKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19wdXRjaHVua19oaXN0IChtbmdfaGFuZGxlICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICBpRW50cnljb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2YXJyIGFFbnRyaWVzKQoreworICBtbmdfZGF0YXAgICAgICAgIHBEYXRhOworICBtbmdfY2h1bmtwICAgICAgIHBDaHVuazsKKyAgbW5nX3JldGNvZGUgICAgICBpUmV0Y29kZTsKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisgIG1uZ19jaHVua19oZWFkZXIgc0NodW5raGVhZGVyID0KKyNpZmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICAgICAgICAgIHtNTkdfVUlOVF9oSVNULCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9nZW5lcmFsLCBtbmdfcmVhZF9oaXN0LCBtbmdfd3JpdGVfaGlzdCwgbW5nX2Fzc2lnbl9nZW5lcmFsLCAwLCAwLCBzaXplb2YobW5nX2hpc3QpfTsKKyNlbHNlCisgICAgICAgICAge01OR19VSU5UX2hJU1QsIG1uZ19pbml0X2hpc3QsIG1uZ19mcmVlX2hpc3QsIG1uZ19yZWFkX2hpc3QsIG1uZ193cml0ZV9oaXN0LCBtbmdfYXNzaWduX2hpc3QsIDAsIDB9OworI2VuZGlmCisjZWxzZQorICBtbmdfY2h1bmtfaGVhZGVyIHNDaHVua2hlYWRlcjsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1BVVENIVU5LX0hJU1QsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhID0gKG1uZ19kYXRhcCloSGFuZGxlOyAgICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworCisgIGlmICghcERhdGEtPmJDcmVhdGluZykgICAgICAgICAgICAgICAvKiBhcmVuJ3Qgd2UgY3JlYXRpbmcgYSBuZXcgZmlsZSA/ICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0ZVTkNUSU9OSU5WQUxJRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG11c3QgaGF2ZSBoYWQgYSBoZWFkZXIgZmlyc3QhICovCisgIGlmIChwRGF0YS0+aUZpcnN0Y2h1bmthZGRlZCA9PSAwKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19OT0hFQURFUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByZXZlbnQgbWlzcGxhY2VkIFRFUk0gISAqLworICBpZiAoIWNoZWNrX3Rlcm0gKHBEYXRhLCBNTkdfVUlOVF9oSVNUKSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfVEVSTVNFUUVSUk9SKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIHRoZSBjaHVuayAqLworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyNpZmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICBpUmV0Y29kZSA9IG1uZ19pbml0X2dlbmVyYWwgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbHNlCisgIGlSZXRjb2RlID0gbW5nX2luaXRfaGlzdCAocERhdGEsICZzQ2h1bmtoZWFkZXIsICZwQ2h1bmspOworI2VuZGlmCisjZWxzZQorICBtbmdfZ2V0X2NodW5raGVhZGVyKE1OR19VSU5UX2hJU1QsICZzQ2h1bmtoZWFkZXIpOworICBpUmV0Y29kZSA9IG1uZ19pbml0X2dlbmVyYWwgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbmRpZgorCisgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbGwgdGhlIGNodW5rICovCisgICgobW5nX2hpc3RwKXBDaHVuayktPmlFbnRyeWNvdW50ID0gaUVudHJ5Y291bnQ7CisKKyAgTU5HX0NPUFkgKCgobW5nX2hpc3RwKXBDaHVuayktPmFFbnRyaWVzLCBhRW50cmllcywgc2l6ZW9mIChtbmdfdWludDE2YXJyKSk7CisKKyAgbW5nX2FkZF9jaHVuayAocERhdGEsIHBDaHVuayk7ICAgICAgIC8qIGFkZCBpdCB0byB0aGUgbGlzdCAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1BVVENIVU5LX0hJU1QsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS190SU1FCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfcHV0Y2h1bmtfdGltZSAobW5nX2hhbmRsZSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaVllYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICBpTW9udGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICBpRGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaUhvdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICBpTWludXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaVNlY29uZCkKK3sKKyAgbW5nX2RhdGFwICAgICAgICBwRGF0YTsKKyAgbW5nX2NodW5rcCAgICAgICBwQ2h1bms7CisgIG1uZ19yZXRjb2RlICAgICAgaVJldGNvZGU7CisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorICBtbmdfY2h1bmtfaGVhZGVyIHNDaHVua2hlYWRlciA9CisjaWZkZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyAgICAgICAgICB7TU5HX1VJTlRfdElNRSwgbW5nX2luaXRfZ2VuZXJhbCwgbW5nX2ZyZWVfZ2VuZXJhbCwgbW5nX3JlYWRfdGltZSwgbW5nX3dyaXRlX3RpbWUsIG1uZ19hc3NpZ25fZ2VuZXJhbCwgMCwgMCwgc2l6ZW9mKG1uZ190aW1lKX07CisjZWxzZQorICAgICAgICAgIHtNTkdfVUlOVF90SU1FLCBtbmdfaW5pdF90aW1lLCBtbmdfZnJlZV90aW1lLCBtbmdfcmVhZF90aW1lLCBtbmdfd3JpdGVfdGltZSwgbW5nX2Fzc2lnbl90aW1lLCAwLCAwfTsKKyNlbmRpZgorI2Vsc2UKKyAgbW5nX2NodW5rX2hlYWRlciBzQ2h1bmtoZWFkZXI7CisjZW5kaWYKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9QVVRDSFVOS19USU1FLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFIChoSGFuZGxlKSAgICAgICAgICAgIC8qIGNoZWNrIHZhbGlkaXR5IGhhbmRsZSAqLworICBwRGF0YSA9IChtbmdfZGF0YXApaEhhbmRsZTsgICAgICAgICAgLyogYW5kIG1ha2UgaXQgYWRkcmVzc2FibGUgKi8KKworICBpZiAoIXBEYXRhLT5iQ3JlYXRpbmcpICAgICAgICAgICAgICAgLyogYXJlbid0IHdlIGNyZWF0aW5nIGEgbmV3IGZpbGUgPyAqLworICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19GVU5DVElPTklOVkFMSUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcmV2ZW50IG1pc3BsYWNlZCBURVJNICEgKi8KKyAgaWYgKCFjaGVja190ZXJtIChwRGF0YSwgTU5HX1VJTlRfdElNRSkpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1RFUk1TRVFFUlJPUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG11c3QgaGF2ZSBoYWQgYSBoZWFkZXIgZmlyc3QhICovCisgIGlmIChwRGF0YS0+aUZpcnN0Y2h1bmthZGRlZCA9PSAwKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19OT0hFQURFUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSB0aGUgY2h1bmsgKi8KKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisjaWZkZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9nZW5lcmFsIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZWxzZQorICBpUmV0Y29kZSA9IG1uZ19pbml0X3RpbWUgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbmRpZgorI2Vsc2UKKyAgbW5nX2dldF9jaHVua2hlYWRlcihNTkdfVUlOVF90SU1FLCAmc0NodW5raGVhZGVyKTsKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9nZW5lcmFsIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZW5kaWYKKworICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaWxsIHRoZSBjaHVuayAqLworICAoKG1uZ190aW1lcClwQ2h1bmspLT5pWWVhciAgID0gaVllYXI7CisgICgobW5nX3RpbWVwKXBDaHVuayktPmlNb250aCAgPSBpTW9udGg7CisgICgobW5nX3RpbWVwKXBDaHVuayktPmlEYXkgICAgPSBpRGF5OworICAoKG1uZ190aW1lcClwQ2h1bmspLT5pSG91ciAgID0gaUhvdXI7CisgICgobW5nX3RpbWVwKXBDaHVuayktPmlNaW51dGUgPSBpTWludXRlOworICAoKG1uZ190aW1lcClwQ2h1bmspLT5pU2Vjb25kID0gaVNlY29uZDsKKworICBtbmdfYWRkX2NodW5rIChwRGF0YSwgcENodW5rKTsgICAgICAgLyogYWRkIGl0IHRvIHRoZSBsaXN0ICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fUFVUQ0hVTktfVElNRSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3B1dGNodW5rX21oZHIgKG1uZ19oYW5kbGUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpVGlja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpTGF5ZXJjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlGcmFtZWNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaVBsYXl0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaVNpbXBsaWNpdHkpCit7CisgIG1uZ19kYXRhcCAgICAgICAgcERhdGE7CisgIG1uZ19jaHVua3AgICAgICAgcENodW5rOworICBtbmdfcmV0Y29kZSAgICAgIGlSZXRjb2RlOworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyAgbW5nX2NodW5rX2hlYWRlciBzQ2h1bmtoZWFkZXIgPQorI2lmZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisgICAgICAgICAge01OR19VSU5UX01IRFIsIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX2dlbmVyYWwsIG1uZ19yZWFkX21oZHIsIG1uZ193cml0ZV9taGRyLCBtbmdfYXNzaWduX2dlbmVyYWwsIDAsIDAsIHNpemVvZihtbmdfbWhkcil9OworI2Vsc2UKKyAgICAgICAgICB7TU5HX1VJTlRfTUhEUiwgbW5nX2luaXRfbWhkciwgbW5nX2ZyZWVfbWhkciwgbW5nX3JlYWRfbWhkciwgbW5nX3dyaXRlX21oZHIsIG1uZ19hc3NpZ25fbWhkciwgMCwgMH07CisjZW5kaWYKKyNlbHNlCisgIG1uZ19jaHVua19oZWFkZXIgc0NodW5raGVhZGVyOworI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fUFVUQ0hVTktfTUhEUiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkgICAgICAgICAgICAvKiBjaGVjayB2YWxpZGl0eSBoYW5kbGUgKi8KKyAgcERhdGEgPSAobW5nX2RhdGFwKWhIYW5kbGU7ICAgICAgICAgIC8qIGFuZCBtYWtlIGl0IGFkZHJlc3NhYmxlICovCisKKyAgaWYgKCFwRGF0YS0+YkNyZWF0aW5nKSAgICAgICAgICAgICAgIC8qIGFyZW4ndCB3ZSBjcmVhdGluZyBhIG5ldyBmaWxlID8gKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfRlVOQ1RJT05JTlZBTElEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbXVzdCBiZSB2ZXJ5IGZpcnN0ISAqLworICBpZiAocERhdGEtPmlGaXJzdGNodW5rYWRkZWQgIT0gMCkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfU0VRVUVOQ0VFUlJPUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByZXZlbnQgbWlzcGxhY2VkIFRFUk0gISAqLworICBpZiAoIWNoZWNrX3Rlcm0gKHBEYXRhLCBNTkdfVUlOVF9NSERSKSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfVEVSTVNFUUVSUk9SKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIHRoZSBjaHVuayAqLworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyNpZmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICBpUmV0Y29kZSA9IG1uZ19pbml0X2dlbmVyYWwgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbHNlCisgIGlSZXRjb2RlID0gbW5nX2luaXRfbWhkciAocERhdGEsICZzQ2h1bmtoZWFkZXIsICZwQ2h1bmspOworI2VuZGlmCisjZWxzZQorICBtbmdfZ2V0X2NodW5raGVhZGVyKE1OR19VSU5UX01IRFIsICZzQ2h1bmtoZWFkZXIpOworICBpUmV0Y29kZSA9IG1uZ19pbml0X2dlbmVyYWwgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbmRpZgorCisgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbGwgdGhlIGNodW5rICovCisgICgobW5nX21oZHJwKXBDaHVuayktPmlXaWR0aCAgICAgID0gaVdpZHRoOworICAoKG1uZ19taGRycClwQ2h1bmspLT5pSGVpZ2h0ICAgICA9IGlIZWlnaHQ7CisgICgobW5nX21oZHJwKXBDaHVuayktPmlUaWNrcyAgICAgID0gaVRpY2tzOworICAoKG1uZ19taGRycClwQ2h1bmspLT5pTGF5ZXJjb3VudCA9IGlMYXllcmNvdW50OworICAoKG1uZ19taGRycClwQ2h1bmspLT5pRnJhbWVjb3VudCA9IGlGcmFtZWNvdW50OworICAoKG1uZ19taGRycClwQ2h1bmspLT5pUGxheXRpbWUgICA9IGlQbGF5dGltZTsKKyAgKChtbmdfbWhkcnApcENodW5rKS0+aVNpbXBsaWNpdHkgPSBpU2ltcGxpY2l0eTsKKworICBtbmdfYWRkX2NodW5rIChwRGF0YSwgcENodW5rKTsgICAgICAgLyogYWRkIGl0IHRvIHRoZSBsaXN0ICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fUFVUQ0hVTktfTUhEUiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19wdXRjaHVua19tZW5kIChtbmdfaGFuZGxlIGhIYW5kbGUpCit7CisgIG1uZ19kYXRhcCAgICAgICAgcERhdGE7CisgIG1uZ19jaHVua3AgICAgICAgcENodW5rOworICBtbmdfcmV0Y29kZSAgICAgIGlSZXRjb2RlOworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyAgbW5nX2NodW5rX2hlYWRlciBzQ2h1bmtoZWFkZXIgPQorI2lmZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisgICAgICAgICAge01OR19VSU5UX01FTkQsIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX2dlbmVyYWwsIG1uZ19yZWFkX21lbmQsIG1uZ193cml0ZV9tZW5kLCBtbmdfYXNzaWduX2dlbmVyYWwsIDAsIDAsIHNpemVvZihtbmdfbWVuZCl9OworI2Vsc2UKKyAgICAgICAgICB7TU5HX1VJTlRfTUVORCwgbW5nX2luaXRfbWVuZCwgbW5nX2ZyZWVfbWVuZCwgbW5nX3JlYWRfbWVuZCwgbW5nX3dyaXRlX21lbmQsIG1uZ19hc3NpZ25fbWVuZCwgMCwgMH07CisjZW5kaWYKKyNlbHNlCisgIG1uZ19jaHVua19oZWFkZXIgc0NodW5raGVhZGVyOworI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fUFVUQ0hVTktfTUVORCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkgICAgICAgICAgICAvKiBjaGVjayB2YWxpZGl0eSBoYW5kbGUgKi8KKyAgcERhdGEgPSAobW5nX2RhdGFwKWhIYW5kbGU7ICAgICAgICAgIC8qIGFuZCBtYWtlIGl0IGFkZHJlc3NhYmxlICovCisKKyAgaWYgKCFwRGF0YS0+YkNyZWF0aW5nKSAgICAgICAgICAgICAgIC8qIGFyZW4ndCB3ZSBjcmVhdGluZyBhIG5ldyBmaWxlID8gKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfRlVOQ1RJT05JTlZBTElEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbXVzdCBoYXZlIGhhZCBhIGhlYWRlciBmaXJzdCEgKi8KKyAgaWYgKHBEYXRhLT5pRmlyc3RjaHVua2FkZGVkID09IDApCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX05PSEVBREVSKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJldmVudCBtaXNwbGFjZWQgVEVSTSAhICovCisgIGlmICghY2hlY2tfdGVybSAocERhdGEsIE1OR19VSU5UX01FTkQpKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19URVJNU0VRRVJST1IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgdGhlIGNodW5rICovCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorI2lmZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisgIGlSZXRjb2RlID0gbW5nX2luaXRfZ2VuZXJhbCAocERhdGEsICZzQ2h1bmtoZWFkZXIsICZwQ2h1bmspOworI2Vsc2UKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9tZW5kIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZW5kaWYKKyNlbHNlCisgIG1uZ19nZXRfY2h1bmtoZWFkZXIoTU5HX1VJTlRfTUVORCwgJnNDaHVua2hlYWRlcik7CisgIGlSZXRjb2RlID0gbW5nX2luaXRfZ2VuZXJhbCAocERhdGEsICZzQ2h1bmtoZWFkZXIsICZwQ2h1bmspOworI2VuZGlmCisKKyAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgcmV0dXJuIGlSZXRjb2RlOworCisgIG1uZ19hZGRfY2h1bmsgKHBEYXRhLCBwQ2h1bmspOyAgICAgICAvKiBhZGQgaXQgdG8gdGhlIGxpc3QgKi8KKworICBwRGF0YS0+YkNyZWF0aW5nID0gTU5HX0ZBTFNFOyAgICAgICAgLyogc2hvdWxkIGJlIGxhc3QgY2h1bmsgISEhICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fUFVUQ0hVTktfTUVORCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19MT09QCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfcHV0Y2h1bmtfbG9vcCAobW5nX2hhbmRsZSAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICBpTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgaVJlcGVhdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICBpVGVybWluYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgaUl0ZXJtaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgaUl0ZXJtYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgaUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzJwIHBTaWduYWxzKQoreworICBtbmdfZGF0YXAgICAgICAgIHBEYXRhOworICBtbmdfY2h1bmtwICAgICAgIHBDaHVuazsKKyAgbW5nX3JldGNvZGUgICAgICBpUmV0Y29kZTsKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisgIG1uZ19jaHVua19oZWFkZXIgc0NodW5raGVhZGVyID0KKyNpZmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICAgICAgICAgIHtNTkdfVUlOVF9MT09QLCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9sb29wLCBtbmdfcmVhZF9sb29wLCBtbmdfd3JpdGVfbG9vcCwgbW5nX2Fzc2lnbl9sb29wLCAwLCAwLCBzaXplb2YobW5nX2xvb3ApfTsKKyNlbHNlCisgICAgICAgICAge01OR19VSU5UX0xPT1AsIG1uZ19pbml0X2xvb3AsIG1uZ19mcmVlX2xvb3AsIG1uZ19yZWFkX2xvb3AsIG1uZ193cml0ZV9sb29wLCBtbmdfYXNzaWduX2xvb3AsIDAsIDB9OworI2VuZGlmCisjZWxzZQorICBtbmdfY2h1bmtfaGVhZGVyIHNDaHVua2hlYWRlcjsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1BVVENIVU5LX0xPT1AsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhID0gKG1uZ19kYXRhcCloSGFuZGxlOyAgICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworCisgIGlmICghcERhdGEtPmJDcmVhdGluZykgICAgICAgICAgICAgICAvKiBhcmVuJ3Qgd2UgY3JlYXRpbmcgYSBuZXcgZmlsZSA/ICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0ZVTkNUSU9OSU5WQUxJRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG11c3QgaGF2ZSBoYWQgYSBNSERSIGZpcnN0ISAqLworICBpZiAocERhdGEtPmlGaXJzdGNodW5rYWRkZWQgIT0gTU5HX1VJTlRfTUhEUikKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfTk9IRUFERVIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcmV2ZW50IG1pc3BsYWNlZCBURVJNICEgKi8KKyAgaWYgKCFjaGVja190ZXJtIChwRGF0YSwgTU5HX1VJTlRfTE9PUCkpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1RFUk1TRVFFUlJPUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSB0aGUgY2h1bmsgKi8KKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisjaWZkZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9nZW5lcmFsIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZWxzZQorICBpUmV0Y29kZSA9IG1uZ19pbml0X2xvb3AgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbmRpZgorI2Vsc2UKKyAgbW5nX2dldF9jaHVua2hlYWRlcihNTkdfVUlOVF9MT09QLCAmc0NodW5raGVhZGVyKTsKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9nZW5lcmFsIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZW5kaWYKKworICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaWxsIHRoZSBjaHVuayAqLworICAoKG1uZ19sb29wcClwQ2h1bmspLT5pTGV2ZWwgICAgICAgPSBpTGV2ZWw7CisgICgobW5nX2xvb3BwKXBDaHVuayktPmlSZXBlYXQgICAgICA9IGlSZXBlYXQ7CisgICgobW5nX2xvb3BwKXBDaHVuayktPmlUZXJtaW5hdGlvbiA9IGlUZXJtaW5hdGlvbjsKKyAgKChtbmdfbG9vcHApcENodW5rKS0+aUl0ZXJtaW4gICAgID0gaUl0ZXJtaW47CisgICgobW5nX2xvb3BwKXBDaHVuayktPmlJdGVybWF4ICAgICA9IGlJdGVybWF4OworICAoKG1uZ19sb29wcClwQ2h1bmspLT5pQ291bnQgICAgICAgPSBpQ291bnQ7CisgICgobW5nX2xvb3BwKXBDaHVuayktPnBTaWduYWxzICAgICA9IHBTaWduYWxzOworCisgIG1uZ19hZGRfY2h1bmsgKHBEYXRhLCBwQ2h1bmspOyAgICAgICAvKiBhZGQgaXQgdG8gdGhlIGxpc3QgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9QVVRDSFVOS19MT09QLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3B1dGNodW5rX2VuZGwgKG1uZ19oYW5kbGUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggIGlMZXZlbCkKK3sKKyAgbW5nX2RhdGFwICAgICAgICBwRGF0YTsKKyAgbW5nX2NodW5rcCAgICAgICBwQ2h1bms7CisgIG1uZ19yZXRjb2RlICAgICAgaVJldGNvZGU7CisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorICBtbmdfY2h1bmtfaGVhZGVyIHNDaHVua2hlYWRlciA9CisjaWZkZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyAgICAgICAgICB7TU5HX1VJTlRfRU5ETCwgbW5nX2luaXRfZ2VuZXJhbCwgbW5nX2ZyZWVfZ2VuZXJhbCwgbW5nX3JlYWRfZW5kbCwgbW5nX3dyaXRlX2VuZGwsIG1uZ19hc3NpZ25fZ2VuZXJhbCwgMCwgMCwgc2l6ZW9mKG1uZ19lbmRsKX07CisjZWxzZQorICAgICAgICAgIHtNTkdfVUlOVF9FTkRMLCBtbmdfaW5pdF9lbmRsLCBtbmdfZnJlZV9lbmRsLCBtbmdfcmVhZF9lbmRsLCBtbmdfd3JpdGVfZW5kbCwgbW5nX2Fzc2lnbl9lbmRsLCAwLCAwfTsKKyNlbmRpZgorI2Vsc2UKKyAgbW5nX2NodW5rX2hlYWRlciBzQ2h1bmtoZWFkZXI7CisjZW5kaWYKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9QVVRDSFVOS19FTkRMLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFIChoSGFuZGxlKSAgICAgICAgICAgIC8qIGNoZWNrIHZhbGlkaXR5IGhhbmRsZSAqLworICBwRGF0YSA9IChtbmdfZGF0YXApaEhhbmRsZTsgICAgICAgICAgLyogYW5kIG1ha2UgaXQgYWRkcmVzc2FibGUgKi8KKworICBpZiAoIXBEYXRhLT5iQ3JlYXRpbmcpICAgICAgICAgICAgICAgLyogYXJlbid0IHdlIGNyZWF0aW5nIGEgbmV3IGZpbGUgPyAqLworICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19GVU5DVElPTklOVkFMSUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtdXN0IGhhdmUgaGFkIGEgTUhEUiBmaXJzdCEgKi8KKyAgaWYgKHBEYXRhLT5pRmlyc3RjaHVua2FkZGVkICE9IE1OR19VSU5UX01IRFIpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX05PSEVBREVSKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJldmVudCBtaXNwbGFjZWQgVEVSTSAhICovCisgIGlmICghY2hlY2tfdGVybSAocERhdGEsIE1OR19VSU5UX0VOREwpKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19URVJNU0VRRVJST1IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgdGhlIGNodW5rICovCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorI2lmZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisgIGlSZXRjb2RlID0gbW5nX2luaXRfZ2VuZXJhbCAocERhdGEsICZzQ2h1bmtoZWFkZXIsICZwQ2h1bmspOworI2Vsc2UKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9lbmRsIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZW5kaWYKKyNlbHNlCisgIG1uZ19nZXRfY2h1bmtoZWFkZXIoTU5HX1VJTlRfRU5ETCwgJnNDaHVua2hlYWRlcik7CisgIGlSZXRjb2RlID0gbW5nX2luaXRfZ2VuZXJhbCAocERhdGEsICZzQ2h1bmtoZWFkZXIsICZwQ2h1bmspOworI2VuZGlmCisKKyAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgcmV0dXJuIGlSZXRjb2RlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmlsbCB0aGUgY2h1bmsgKi8KKyAgKChtbmdfZW5kbHApcENodW5rKS0+aUxldmVsID0gaUxldmVsOworCisgIG1uZ19hZGRfY2h1bmsgKHBEYXRhLCBwQ2h1bmspOyAgICAgICAvKiBhZGQgaXQgdG8gdGhlIGxpc3QgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9QVVRDSFVOS19FTkRMLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfREVGSQorbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3B1dGNodW5rX2RlZmkgKG1uZ19oYW5kbGUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlPYmplY3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggIGlEb25vdHNob3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICBpQ29uY3JldGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2Jvb2wgICBiSGFzbG9jYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlYbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpWWxvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgYkhhc2NsaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpTGVmdGNiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaVJpZ2h0Y2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpVG9wY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpQm90dG9tY2IpCit7CisgIG1uZ19kYXRhcCAgICAgICAgcERhdGE7CisgIG1uZ19jaHVua3AgICAgICAgcENodW5rOworICBtbmdfcmV0Y29kZSAgICAgIGlSZXRjb2RlOworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyAgbW5nX2NodW5rX2hlYWRlciBzQ2h1bmtoZWFkZXIgPQorI2lmZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisgICAgICAgICAge01OR19VSU5UX0RFRkksIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX2dlbmVyYWwsIG1uZ19yZWFkX2RlZmksIG1uZ193cml0ZV9kZWZpLCBtbmdfYXNzaWduX2dlbmVyYWwsIDAsIDAsIHNpemVvZihtbmdfZGVmaSl9OworI2Vsc2UKKyAgICAgICAgICB7TU5HX1VJTlRfREVGSSwgbW5nX2luaXRfZGVmaSwgbW5nX2ZyZWVfZGVmaSwgbW5nX3JlYWRfZGVmaSwgbW5nX3dyaXRlX2RlZmksIG1uZ19hc3NpZ25fZGVmaSwgMCwgMH07CisjZW5kaWYKKyNlbHNlCisgIG1uZ19jaHVua19oZWFkZXIgc0NodW5raGVhZGVyOworI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fUFVUQ0hVTktfREVGSSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkgICAgICAgICAgICAvKiBjaGVjayB2YWxpZGl0eSBoYW5kbGUgKi8KKyAgcERhdGEgPSAobW5nX2RhdGFwKWhIYW5kbGU7ICAgICAgICAgIC8qIGFuZCBtYWtlIGl0IGFkZHJlc3NhYmxlICovCisKKyAgaWYgKCFwRGF0YS0+YkNyZWF0aW5nKSAgICAgICAgICAgICAgIC8qIGFyZW4ndCB3ZSBjcmVhdGluZyBhIG5ldyBmaWxlID8gKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfRlVOQ1RJT05JTlZBTElEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbXVzdCBoYXZlIGhhZCBhIE1IRFIgZmlyc3QhICovCisgIGlmIChwRGF0YS0+aUZpcnN0Y2h1bmthZGRlZCAhPSBNTkdfVUlOVF9NSERSKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19OT0hFQURFUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByZXZlbnQgbWlzcGxhY2VkIFRFUk0gISAqLworICBpZiAoIWNoZWNrX3Rlcm0gKHBEYXRhLCBNTkdfVUlOVF9ERUZJKSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfVEVSTVNFUUVSUk9SKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIHRoZSBjaHVuayAqLworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyNpZmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICBpUmV0Y29kZSA9IG1uZ19pbml0X2dlbmVyYWwgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbHNlCisgIGlSZXRjb2RlID0gbW5nX2luaXRfZGVmaSAocERhdGEsICZzQ2h1bmtoZWFkZXIsICZwQ2h1bmspOworI2VuZGlmCisjZWxzZQorICBtbmdfZ2V0X2NodW5raGVhZGVyKE1OR19VSU5UX0RFRkksICZzQ2h1bmtoZWFkZXIpOworICBpUmV0Y29kZSA9IG1uZ19pbml0X2dlbmVyYWwgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbmRpZgorCisgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbGwgdGhlIGNodW5rICovCisgICgobW5nX2RlZmlwKXBDaHVuayktPmlPYmplY3RpZCAgPSBpT2JqZWN0aWQ7CisgICgobW5nX2RlZmlwKXBDaHVuayktPmlEb25vdHNob3cgPSBpRG9ub3RzaG93OworICAoKG1uZ19kZWZpcClwQ2h1bmspLT5pQ29uY3JldGUgID0gaUNvbmNyZXRlOworICAoKG1uZ19kZWZpcClwQ2h1bmspLT5iSGFzbG9jYSAgID0gYkhhc2xvY2E7CisgICgobW5nX2RlZmlwKXBDaHVuayktPmlYbG9jYXRpb24gPSBpWGxvY2F0aW9uOworICAoKG1uZ19kZWZpcClwQ2h1bmspLT5pWWxvY2F0aW9uID0gaVlsb2NhdGlvbjsKKyAgKChtbmdfZGVmaXApcENodW5rKS0+Ykhhc2NsaXAgICA9IGJIYXNjbGlwOworICAoKG1uZ19kZWZpcClwQ2h1bmspLT5pTGVmdGNiICAgID0gaUxlZnRjYjsKKyAgKChtbmdfZGVmaXApcENodW5rKS0+aVJpZ2h0Y2IgICA9IGlSaWdodGNiOworICAoKG1uZ19kZWZpcClwQ2h1bmspLT5pVG9wY2IgICAgID0gaVRvcGNiOworICAoKG1uZ19kZWZpcClwQ2h1bmspLT5pQm90dG9tY2IgID0gaUJvdHRvbWNiOworCisgIG1uZ19hZGRfY2h1bmsgKHBEYXRhLCBwQ2h1bmspOyAgICAgICAvKiBhZGQgaXQgdG8gdGhlIGxpc3QgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9QVVRDSFVOS19ERUZJLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfQkFTSQorbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3B1dGNodW5rX2Jhc2kgKG1uZ19oYW5kbGUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICBpQml0ZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICBpQ29sb3J0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaUNvbXByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaUZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggIGlJbnRlcmxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpUmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaUdyZWVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaUJsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpQWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICBpVmlld2FibGUpCit7CisgIG1uZ19kYXRhcCAgICAgICAgcERhdGE7CisgIG1uZ19jaHVua3AgICAgICAgcENodW5rOworICBtbmdfcmV0Y29kZSAgICAgIGlSZXRjb2RlOworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyAgbW5nX2NodW5rX2hlYWRlciBzQ2h1bmtoZWFkZXIgPQorI2lmZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisgICAgICAgICAge01OR19VSU5UX0JBU0ksIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX2dlbmVyYWwsIG1uZ19yZWFkX2Jhc2ksIG1uZ193cml0ZV9iYXNpLCBtbmdfYXNzaWduX2dlbmVyYWwsIDAsIDAsIHNpemVvZihtbmdfYmFzaSl9OworI2Vsc2UKKyAgICAgICAgICB7TU5HX1VJTlRfQkFTSSwgbW5nX2luaXRfYmFzaSwgbW5nX2ZyZWVfYmFzaSwgbW5nX3JlYWRfYmFzaSwgbW5nX3dyaXRlX2Jhc2ksIG1uZ19hc3NpZ25fYmFzaSwgMCwgMH07CisjZW5kaWYKKyNlbHNlCisgIG1uZ19jaHVua19oZWFkZXIgc0NodW5raGVhZGVyOworI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fUFVUQ0hVTktfQkFTSSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkgICAgICAgICAgICAvKiBjaGVjayB2YWxpZGl0eSBoYW5kbGUgKi8KKyAgcERhdGEgPSAobW5nX2RhdGFwKWhIYW5kbGU7ICAgICAgICAgIC8qIGFuZCBtYWtlIGl0IGFkZHJlc3NhYmxlICovCisKKyAgaWYgKCFwRGF0YS0+YkNyZWF0aW5nKSAgICAgICAgICAgICAgIC8qIGFyZW4ndCB3ZSBjcmVhdGluZyBhIG5ldyBmaWxlID8gKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfRlVOQ1RJT05JTlZBTElEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbXVzdCBoYXZlIGhhZCBhIE1IRFIgZmlyc3QhICovCisgIGlmIChwRGF0YS0+aUZpcnN0Y2h1bmthZGRlZCAhPSBNTkdfVUlOVF9NSERSKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19OT0hFQURFUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByZXZlbnQgbWlzcGxhY2VkIFRFUk0gISAqLworICBpZiAoIWNoZWNrX3Rlcm0gKHBEYXRhLCBNTkdfVUlOVF9CQVNJKSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfVEVSTVNFUUVSUk9SKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIHRoZSBjaHVuayAqLworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyNpZmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICBpUmV0Y29kZSA9IG1uZ19pbml0X2dlbmVyYWwgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbHNlCisgIGlSZXRjb2RlID0gbW5nX2luaXRfYmFzaSAocERhdGEsICZzQ2h1bmtoZWFkZXIsICZwQ2h1bmspOworI2VuZGlmCisjZWxzZQorICBtbmdfZ2V0X2NodW5raGVhZGVyKE1OR19VSU5UX0JBU0ksICZzQ2h1bmtoZWFkZXIpOworICBpUmV0Y29kZSA9IG1uZ19pbml0X2dlbmVyYWwgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbmRpZgorCisgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbGwgdGhlIGNodW5rICovCisgICgobW5nX2Jhc2lwKXBDaHVuayktPmlXaWR0aCAgICAgICA9IGlXaWR0aDsKKyAgKChtbmdfYmFzaXApcENodW5rKS0+aUhlaWdodCAgICAgID0gaUhlaWdodDsKKyAgKChtbmdfYmFzaXApcENodW5rKS0+aUJpdGRlcHRoICAgID0gaUJpdGRlcHRoOworICAoKG1uZ19iYXNpcClwQ2h1bmspLT5pQ29sb3J0eXBlICAgPSBpQ29sb3J0eXBlOworICAoKG1uZ19iYXNpcClwQ2h1bmspLT5pQ29tcHJlc3Npb24gPSBpQ29tcHJlc3Npb247CisgICgobW5nX2Jhc2lwKXBDaHVuayktPmlGaWx0ZXIgICAgICA9IGlGaWx0ZXI7CisgICgobW5nX2Jhc2lwKXBDaHVuayktPmlJbnRlcmxhY2UgICA9IGlJbnRlcmxhY2U7CisgICgobW5nX2Jhc2lwKXBDaHVuayktPmlSZWQgICAgICAgICA9IGlSZWQ7CisgICgobW5nX2Jhc2lwKXBDaHVuayktPmlHcmVlbiAgICAgICA9IGlHcmVlbjsKKyAgKChtbmdfYmFzaXApcENodW5rKS0+aUJsdWUgICAgICAgID0gaUJsdWU7CisgICgobW5nX2Jhc2lwKXBDaHVuayktPmlBbHBoYSAgICAgICA9IGlBbHBoYTsKKyAgKChtbmdfYmFzaXApcENodW5rKS0+aVZpZXdhYmxlICAgID0gaVZpZXdhYmxlOworCisgIG1uZ19hZGRfY2h1bmsgKHBEYXRhLCBwQ2h1bmspOyAgICAgICAvKiBhZGQgaXQgdG8gdGhlIGxpc3QgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9QVVRDSFVOS19CQVNJLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfQ0xPTgorbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3B1dGNodW5rX2Nsb24gKG1uZ19oYW5kbGUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlTb3VyY2VpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlDbG9uZWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaUNsb25ldHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggIGlEb25vdHNob3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICBpQ29uY3JldGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2Jvb2wgICBiSGFzbG9jYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggIGlMb2NhdGlvbnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpTG9jYXRpb254LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaUxvY2F0aW9ueSkKK3sKKyAgbW5nX2RhdGFwICAgICAgICBwRGF0YTsKKyAgbW5nX2NodW5rcCAgICAgICBwQ2h1bms7CisgIG1uZ19yZXRjb2RlICAgICAgaVJldGNvZGU7CisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorICBtbmdfY2h1bmtfaGVhZGVyIHNDaHVua2hlYWRlciA9CisjaWZkZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyAgICAgICAgICB7TU5HX1VJTlRfQ0xPTiwgbW5nX2luaXRfZ2VuZXJhbCwgbW5nX2ZyZWVfZ2VuZXJhbCwgbW5nX3JlYWRfY2xvbiwgbW5nX3dyaXRlX2Nsb24sIG1uZ19hc3NpZ25fZ2VuZXJhbCwgMCwgMCwgc2l6ZW9mKG1uZ19jbG9uKX07CisjZWxzZQorICAgICAgICAgIHtNTkdfVUlOVF9DTE9OLCBtbmdfaW5pdF9jbG9uLCBtbmdfZnJlZV9jbG9uLCBtbmdfcmVhZF9jbG9uLCBtbmdfd3JpdGVfY2xvbiwgbW5nX2Fzc2lnbl9jbG9uLCAwLCAwfTsKKyNlbmRpZgorI2Vsc2UKKyAgbW5nX2NodW5rX2hlYWRlciBzQ2h1bmtoZWFkZXI7CisjZW5kaWYKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9QVVRDSFVOS19DTE9OLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFIChoSGFuZGxlKSAgICAgICAgICAgIC8qIGNoZWNrIHZhbGlkaXR5IGhhbmRsZSAqLworICBwRGF0YSA9IChtbmdfZGF0YXApaEhhbmRsZTsgICAgICAgICAgLyogYW5kIG1ha2UgaXQgYWRkcmVzc2FibGUgKi8KKworICBpZiAoIXBEYXRhLT5iQ3JlYXRpbmcpICAgICAgICAgICAgICAgLyogYXJlbid0IHdlIGNyZWF0aW5nIGEgbmV3IGZpbGUgPyAqLworICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19GVU5DVElPTklOVkFMSUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtdXN0IGhhdmUgaGFkIGEgTUhEUiBmaXJzdCEgKi8KKyAgaWYgKHBEYXRhLT5pRmlyc3RjaHVua2FkZGVkICE9IE1OR19VSU5UX01IRFIpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX05PSEVBREVSKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJldmVudCBtaXNwbGFjZWQgVEVSTSAhICovCisgIGlmICghY2hlY2tfdGVybSAocERhdGEsIE1OR19VSU5UX0NMT04pKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19URVJNU0VRRVJST1IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgdGhlIGNodW5rICovCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorI2lmZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisgIGlSZXRjb2RlID0gbW5nX2luaXRfZ2VuZXJhbCAocERhdGEsICZzQ2h1bmtoZWFkZXIsICZwQ2h1bmspOworI2Vsc2UKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9jbG9uIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZW5kaWYKKyNlbHNlCisgIG1uZ19nZXRfY2h1bmtoZWFkZXIoTU5HX1VJTlRfQ0xPTiwgJnNDaHVua2hlYWRlcik7CisgIGlSZXRjb2RlID0gbW5nX2luaXRfZ2VuZXJhbCAocERhdGEsICZzQ2h1bmtoZWFkZXIsICZwQ2h1bmspOworI2VuZGlmCisKKyAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgcmV0dXJuIGlSZXRjb2RlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmlsbCB0aGUgY2h1bmsgKi8KKyAgKChtbmdfY2xvbnApcENodW5rKS0+aVNvdXJjZWlkICAgICA9IGlTb3VyY2VpZDsKKyAgKChtbmdfY2xvbnApcENodW5rKS0+aUNsb25laWQgICAgICA9IGlDbG9uZWlkOworICAoKG1uZ19jbG9ucClwQ2h1bmspLT5pQ2xvbmV0eXBlICAgID0gaUNsb25ldHlwZTsKKyAgKChtbmdfY2xvbnApcENodW5rKS0+aURvbm90c2hvdyAgICA9IGlEb25vdHNob3c7CisgICgobW5nX2Nsb25wKXBDaHVuayktPmlDb25jcmV0ZSAgICAgPSBpQ29uY3JldGU7CisgICgobW5nX2Nsb25wKXBDaHVuayktPmJIYXNsb2NhICAgICAgPSBiSGFzbG9jYTsKKyAgKChtbmdfY2xvbnApcENodW5rKS0+aUxvY2F0aW9udHlwZSA9IGlMb2NhdGlvbnR5cGU7CisgICgobW5nX2Nsb25wKXBDaHVuayktPmlMb2NhdGlvbnggICAgPSBpTG9jYXRpb254OworICAoKG1uZ19jbG9ucClwQ2h1bmspLT5pTG9jYXRpb255ICAgID0gaUxvY2F0aW9ueTsKKworICBtbmdfYWRkX2NodW5rIChwRGF0YSwgcENodW5rKTsgICAgICAgLyogYWRkIGl0IHRvIHRoZSBsaXN0ICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fUFVUQ0hVTktfQ0xPTiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX1BBU1QKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19wdXRjaHVua19wYXN0IChtbmdfaGFuZGxlIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpRGVzdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaVRhcmdldHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpVGFyZ2V0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlUYXJnZXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaUNvdW50KQoreworICBtbmdfZGF0YXAgICAgICAgIHBEYXRhOworICBtbmdfY2h1bmtwICAgICAgIHBDaHVuazsKKyAgbW5nX3JldGNvZGUgICAgICBpUmV0Y29kZTsKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisgIG1uZ19jaHVua19oZWFkZXIgc0NodW5raGVhZGVyID0KKyNpZmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICAgICAgICAgIHtNTkdfVUlOVF9QQVNULCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9wYXN0LCBtbmdfcmVhZF9wYXN0LCBtbmdfd3JpdGVfcGFzdCwgbW5nX2Fzc2lnbl9wYXN0LCAwLCAwLCBzaXplb2YobW5nX3Bhc3QpfTsKKyNlbHNlCisgICAgICAgICAge01OR19VSU5UX1BBU1QsIG1uZ19pbml0X3Bhc3QsIG1uZ19mcmVlX3Bhc3QsIG1uZ19yZWFkX3Bhc3QsIG1uZ193cml0ZV9wYXN0LCBtbmdfYXNzaWduX3Bhc3QsIDAsIDB9OworI2VuZGlmCisjZWxzZQorICBtbmdfY2h1bmtfaGVhZGVyIHNDaHVua2hlYWRlcjsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1BVVENIVU5LX1BBU1QsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhID0gKG1uZ19kYXRhcCloSGFuZGxlOyAgICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworCisgIGlmICghcERhdGEtPmJDcmVhdGluZykgICAgICAgICAgICAgICAvKiBhcmVuJ3Qgd2UgY3JlYXRpbmcgYSBuZXcgZmlsZSA/ICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0ZVTkNUSU9OSU5WQUxJRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG11c3QgaGF2ZSBoYWQgYSBNSERSIGZpcnN0ISAqLworICBpZiAocERhdGEtPmlGaXJzdGNodW5rYWRkZWQgIT0gTU5HX1VJTlRfTUhEUikKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfTk9IRUFERVIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcmV2ZW50IG1pc3BsYWNlZCBURVJNICEgKi8KKyAgaWYgKCFjaGVja190ZXJtIChwRGF0YSwgTU5HX1VJTlRfUEFTVCkpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1RFUk1TRVFFUlJPUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSB0aGUgY2h1bmsgKi8KKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisjaWZkZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9nZW5lcmFsIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZWxzZQorICBpUmV0Y29kZSA9IG1uZ19pbml0X3Bhc3QgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbmRpZgorI2Vsc2UKKyAgbW5nX2dldF9jaHVua2hlYWRlcihNTkdfVUlOVF9QQVNULCAmc0NodW5raGVhZGVyKTsKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9nZW5lcmFsIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZW5kaWYKKworICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaWxsIHRoZSBjaHVuayAqLworICAoKG1uZ19wYXN0cClwQ2h1bmspLT5pRGVzdGlkICAgICA9IGlEZXN0aWQ7CisgICgobW5nX3Bhc3RwKXBDaHVuayktPmlUYXJnZXR0eXBlID0gaVRhcmdldHR5cGU7CisgICgobW5nX3Bhc3RwKXBDaHVuayktPmlUYXJnZXR4ICAgID0gaVRhcmdldHg7CisgICgobW5nX3Bhc3RwKXBDaHVuayktPmlUYXJnZXR5ICAgID0gaVRhcmdldHk7CisgICgobW5nX3Bhc3RwKXBDaHVuayktPmlDb3VudCAgICAgID0gaUNvdW50OworCisgIGlmIChpQ291bnQpCisgICAgTU5HX0FMTE9DIChwRGF0YSwgKChtbmdfcGFzdHApcENodW5rKS0+cFNvdXJjZXMsIGlDb3VudCAqIHNpemVvZiAobW5nX3Bhc3Rfc291cmNlKSk7CisKKyAgbW5nX2FkZF9jaHVuayAocERhdGEsIHBDaHVuayk7ICAgICAgIC8qIGFkZCBpdCB0byB0aGUgbGlzdCAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1BVVENIVU5LX1BBU1QsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19QQVNUCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfcHV0Y2h1bmtfcGFzdF9zcmMgKG1uZ19oYW5kbGUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpRW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaVNvdXJjZWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggIGlDb21wb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICBpT3JpZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaU9mZnNldHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaU9mZnNldHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaU9mZnNldHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaUJvdW5kYXJ5dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpQm91bmRhcnlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlCb3VuZGFyeXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaUJvdW5kYXJ5dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpQm91bmRhcnliKQoreworICBtbmdfZGF0YXAgICAgICAgIHBEYXRhOworICBtbmdfY2h1bmtwICAgICAgIHBDaHVuazsKKyAgbW5nX3Bhc3Rfc291cmNlcCBwRW50cnk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fUFVUQ0hVTktfUEFTVF9TUkMsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhID0gKG1uZ19kYXRhcCloSGFuZGxlOyAgICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworCisgIGlmICghcERhdGEtPmJDcmVhdGluZykgICAgICAgICAgICAgICAvKiBhcmVuJ3Qgd2UgY3JlYXRpbmcgYSBuZXcgZmlsZSA/ICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0ZVTkNUSU9OSU5WQUxJRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG11c3QgaGF2ZSBoYWQgYSBNSERSIGZpcnN0ISAqLworICBpZiAocERhdGEtPmlGaXJzdGNodW5rYWRkZWQgIT0gTU5HX1VJTlRfTUhEUikKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfTk9IRUFERVIpCisKKyAgcENodW5rID0gcERhdGEtPnBMYXN0Y2h1bms7ICAgICAgICAgIC8qIGxhc3Qgb25lIG11c3QgaGF2ZSBiZWVuIFBBU1QgISAqLworCisgIGlmICgoKG1uZ19jaHVua19oZWFkZXJwKXBDaHVuayktPmlDaHVua25hbWUgIT0gTU5HX1VJTlRfUEFTVCkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfTk9DT1JSQ0hVTkspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbmRleCBvdXQgb2YgYm91bmRzID8gKi8KKyAgaWYgKGlFbnRyeSA+PSAoKG1uZ19wYXN0cClwQ2h1bmspLT5pQ291bnQpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURFTlRSWUlYKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkcmVzcyBwcm9wZXIgZW50cnkgKi8KKyAgcEVudHJ5ID0gKChtbmdfcGFzdHApcENodW5rKS0+cFNvdXJjZXMgKyBpRW50cnk7CisKKyAgcEVudHJ5LT5pU291cmNlaWQgICAgID0gaVNvdXJjZWlkOyAgIC8qIGZpbGwgZW50cnkgKi8KKyAgcEVudHJ5LT5pQ29tcG9zaXRpb24gID0gaUNvbXBvc2l0aW9uOworICBwRW50cnktPmlPcmllbnRhdGlvbiAgPSBpT3JpZW50YXRpb247CisgIHBFbnRyeS0+aU9mZnNldHR5cGUgICA9IGlPZmZzZXR0eXBlOworICBwRW50cnktPmlPZmZzZXR4ICAgICAgPSBpT2Zmc2V0eDsKKyAgcEVudHJ5LT5pT2Zmc2V0eSAgICAgID0gaU9mZnNldHk7CisgIHBFbnRyeS0+aUJvdW5kYXJ5dHlwZSA9IGlCb3VuZGFyeXR5cGU7CisgIHBFbnRyeS0+aUJvdW5kYXJ5bCAgICA9IGlCb3VuZGFyeWw7CisgIHBFbnRyeS0+aUJvdW5kYXJ5ciAgICA9IGlCb3VuZGFyeXI7CisgIHBFbnRyeS0+aUJvdW5kYXJ5dCAgICA9IGlCb3VuZGFyeXQ7CisgIHBFbnRyeS0+aUJvdW5kYXJ5YiAgICA9IGlCb3VuZGFyeWI7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fUFVUQ0hVTktfUEFTVF9TUkMsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19ESVNDCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfcHV0Y2h1bmtfZGlzYyAobW5nX2hhbmRsZSAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICBpQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNnAgcE9iamVjdGlkcykKK3sKKyAgbW5nX2RhdGFwICAgICAgICBwRGF0YTsKKyAgbW5nX2NodW5rcCAgICAgICBwQ2h1bms7CisgIG1uZ19yZXRjb2RlICAgICAgaVJldGNvZGU7CisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorICBtbmdfY2h1bmtfaGVhZGVyIHNDaHVua2hlYWRlciA9CisjaWZkZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyAgICAgICAgICB7TU5HX1VJTlRfRElTQywgbW5nX2luaXRfZ2VuZXJhbCwgbW5nX2ZyZWVfZGlzYywgbW5nX3JlYWRfZGlzYywgbW5nX3dyaXRlX2Rpc2MsIG1uZ19hc3NpZ25fZGlzYywgMCwgMCwgc2l6ZW9mKG1uZ19kaXNjKX07CisjZWxzZQorICAgICAgICAgIHtNTkdfVUlOVF9ESVNDLCBtbmdfaW5pdF9kaXNjLCBtbmdfZnJlZV9kaXNjLCBtbmdfcmVhZF9kaXNjLCBtbmdfd3JpdGVfZGlzYywgbW5nX2Fzc2lnbl9kaXNjLCAwLCAwfTsKKyNlbmRpZgorI2Vsc2UKKyAgbW5nX2NodW5rX2hlYWRlciBzQ2h1bmtoZWFkZXI7CisjZW5kaWYKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9QVVRDSFVOS19ESVNDLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFIChoSGFuZGxlKSAgICAgICAgICAgIC8qIGNoZWNrIHZhbGlkaXR5IGhhbmRsZSAqLworICBwRGF0YSA9IChtbmdfZGF0YXApaEhhbmRsZTsgICAgICAgICAgLyogYW5kIG1ha2UgaXQgYWRkcmVzc2FibGUgKi8KKworICBpZiAoIXBEYXRhLT5iQ3JlYXRpbmcpICAgICAgICAgICAgICAgLyogYXJlbid0IHdlIGNyZWF0aW5nIGEgbmV3IGZpbGUgPyAqLworICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19GVU5DVElPTklOVkFMSUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtdXN0IGhhdmUgaGFkIGEgTUhEUiBmaXJzdCEgKi8KKyAgaWYgKHBEYXRhLT5pRmlyc3RjaHVua2FkZGVkICE9IE1OR19VSU5UX01IRFIpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX05PSEVBREVSKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJldmVudCBtaXNwbGFjZWQgVEVSTSAhICovCisgIGlmICghY2hlY2tfdGVybSAocERhdGEsIE1OR19VSU5UX0RJU0MpKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19URVJNU0VRRVJST1IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgdGhlIGNodW5rICovCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorI2lmZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisgIGlSZXRjb2RlID0gbW5nX2luaXRfZ2VuZXJhbCAocERhdGEsICZzQ2h1bmtoZWFkZXIsICZwQ2h1bmspOworI2Vsc2UKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9kaXNjIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZW5kaWYKKyNlbHNlCisgIG1uZ19nZXRfY2h1bmtoZWFkZXIoTU5HX1VJTlRfRElTQywgJnNDaHVua2hlYWRlcik7CisgIGlSZXRjb2RlID0gbW5nX2luaXRfZ2VuZXJhbCAocERhdGEsICZzQ2h1bmtoZWFkZXIsICZwQ2h1bmspOworI2VuZGlmCisKKyAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgcmV0dXJuIGlSZXRjb2RlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmlsbCB0aGUgY2h1bmsgKi8KKyAgKChtbmdfZGlzY3ApcENodW5rKS0+aUNvdW50ID0gaUNvdW50OworCisgIGlmIChpQ291bnQpCisgIHsKKyAgICBtbmdfdWludDMyIGlTaXplID0gaUNvdW50ICogc2l6ZW9mIChtbmdfdWludDMyKTsKKworICAgIE1OR19BTExPQyAocERhdGEsICgobW5nX2Rpc2NwKXBDaHVuayktPnBPYmplY3RpZHMsIGlTaXplKTsKKyAgICBNTkdfQ09QWSAoKChtbmdfZGlzY3ApcENodW5rKS0+cE9iamVjdGlkcywgcE9iamVjdGlkcywgaVNpemUpOworICB9CisKKyAgbW5nX2FkZF9jaHVuayAocERhdGEsIHBDaHVuayk7ICAgICAgIC8qIGFkZCBpdCB0byB0aGUgbGlzdCAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1BVVENIVU5LX0RJU0MsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19CQUNLCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfcHV0Y2h1bmtfYmFjayAobW5nX2hhbmRsZSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaVJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlHcmVlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlCbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaU1hbmRhdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlJbWFnZWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaVRpbGUpCit7CisgIG1uZ19kYXRhcCAgICAgICAgcERhdGE7CisgIG1uZ19jaHVua3AgICAgICAgcENodW5rOworICBtbmdfcmV0Y29kZSAgICAgIGlSZXRjb2RlOworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyAgbW5nX2NodW5rX2hlYWRlciBzQ2h1bmtoZWFkZXIgPQorI2lmZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisgICAgICAgICAge01OR19VSU5UX0JBQ0ssIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX2dlbmVyYWwsIG1uZ19yZWFkX2JhY2ssIG1uZ193cml0ZV9iYWNrLCBtbmdfYXNzaWduX2dlbmVyYWwsIDAsIDAsIHNpemVvZihtbmdfYmFjayl9OworI2Vsc2UKKyAgICAgICAgICB7TU5HX1VJTlRfQkFDSywgbW5nX2luaXRfYmFjaywgbW5nX2ZyZWVfYmFjaywgbW5nX3JlYWRfYmFjaywgbW5nX3dyaXRlX2JhY2ssIG1uZ19hc3NpZ25fYmFjaywgMCwgMH07CisjZW5kaWYKKyNlbHNlCisgIG1uZ19jaHVua19oZWFkZXIgc0NodW5raGVhZGVyOworI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fUFVUQ0hVTktfQkFDSywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkgICAgICAgICAgICAvKiBjaGVjayB2YWxpZGl0eSBoYW5kbGUgKi8KKyAgcERhdGEgPSAobW5nX2RhdGFwKWhIYW5kbGU7ICAgICAgICAgIC8qIGFuZCBtYWtlIGl0IGFkZHJlc3NhYmxlICovCisKKyAgaWYgKCFwRGF0YS0+YkNyZWF0aW5nKSAgICAgICAgICAgICAgIC8qIGFyZW4ndCB3ZSBjcmVhdGluZyBhIG5ldyBmaWxlID8gKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfRlVOQ1RJT05JTlZBTElEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbXVzdCBoYXZlIGhhZCBhIE1IRFIgZmlyc3QhICovCisgIGlmIChwRGF0YS0+aUZpcnN0Y2h1bmthZGRlZCAhPSBNTkdfVUlOVF9NSERSKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19OT0hFQURFUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByZXZlbnQgbWlzcGxhY2VkIFRFUk0gISAqLworICBpZiAoIWNoZWNrX3Rlcm0gKHBEYXRhLCBNTkdfVUlOVF9CQUNLKSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfVEVSTVNFUUVSUk9SKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIHRoZSBjaHVuayAqLworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyNpZmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICBpUmV0Y29kZSA9IG1uZ19pbml0X2dlbmVyYWwgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbHNlCisgIGlSZXRjb2RlID0gbW5nX2luaXRfYmFjayAocERhdGEsICZzQ2h1bmtoZWFkZXIsICZwQ2h1bmspOworI2VuZGlmCisjZWxzZQorICBtbmdfZ2V0X2NodW5raGVhZGVyKE1OR19VSU5UX0JBQ0ssICZzQ2h1bmtoZWFkZXIpOworICBpUmV0Y29kZSA9IG1uZ19pbml0X2dlbmVyYWwgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbmRpZgorCisgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbGwgdGhlIGNodW5rICovCisgICgobW5nX2JhY2twKXBDaHVuayktPmlSZWQgICAgICAgPSBpUmVkOworICAoKG1uZ19iYWNrcClwQ2h1bmspLT5pR3JlZW4gICAgID0gaUdyZWVuOworICAoKG1uZ19iYWNrcClwQ2h1bmspLT5pQmx1ZSAgICAgID0gaUJsdWU7CisgICgobW5nX2JhY2twKXBDaHVuayktPmlNYW5kYXRvcnkgPSBpTWFuZGF0b3J5OworICAoKG1uZ19iYWNrcClwQ2h1bmspLT5pSW1hZ2VpZCAgID0gaUltYWdlaWQ7CisgICgobW5nX2JhY2twKXBDaHVuayktPmlUaWxlICAgICAgPSBpVGlsZTsKKworICBtbmdfYWRkX2NodW5rIChwRGF0YSwgcENodW5rKTsgICAgICAgLyogYWRkIGl0IHRvIHRoZSBsaXN0ICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fUFVUQ0hVTktfQkFDSywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX0ZSQU0KK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19wdXRjaHVua19mcmFtIChtbmdfaGFuZGxlICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgIGJFbXB0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICBpTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICBpTmFtZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3BjaGFyICAgek5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgaUNoYW5nZWRlbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgIGlDaGFuZ2V0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgIGlDaGFuZ2VjbGlwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICBpQ2hhbmdlc3luY2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgIGlEZWxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICBpVGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICBpQm91bmRhcnl0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgIGlCb3VuZGFyeWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICAgaUJvdW5kYXJ5ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgICBpQm91bmRhcnl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgIGlCb3VuZGFyeWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgaUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzJwIHBTeW5jaWRzKQoreworICBtbmdfZGF0YXAgICAgICAgIHBEYXRhOworICBtbmdfY2h1bmtwICAgICAgIHBDaHVuazsKKyAgbW5nX3JldGNvZGUgICAgICBpUmV0Y29kZTsKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisgIG1uZ19jaHVua19oZWFkZXIgc0NodW5raGVhZGVyID0KKyNpZmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICAgICAgICAgIHtNTkdfVUlOVF9GUkFNLCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9mcmFtLCBtbmdfcmVhZF9mcmFtLCBtbmdfd3JpdGVfZnJhbSwgbW5nX2Fzc2lnbl9mcmFtLCAwLCAwLCBzaXplb2YobW5nX2ZyYW0pfTsKKyNlbHNlCisgICAgICAgICAge01OR19VSU5UX0ZSQU0sIG1uZ19pbml0X2ZyYW0sIG1uZ19mcmVlX2ZyYW0sIG1uZ19yZWFkX2ZyYW0sIG1uZ193cml0ZV9mcmFtLCBtbmdfYXNzaWduX2ZyYW0sIDAsIDB9OworI2VuZGlmCisjZWxzZQorICBtbmdfY2h1bmtfaGVhZGVyIHNDaHVua2hlYWRlcjsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1BVVENIVU5LX0ZSQU0sIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhID0gKG1uZ19kYXRhcCloSGFuZGxlOyAgICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworCisgIGlmICghcERhdGEtPmJDcmVhdGluZykgICAgICAgICAgICAgICAvKiBhcmVuJ3Qgd2UgY3JlYXRpbmcgYSBuZXcgZmlsZSA/ICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0ZVTkNUSU9OSU5WQUxJRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG11c3QgaGF2ZSBoYWQgYSBNSERSIGZpcnN0ISAqLworICBpZiAocERhdGEtPmlGaXJzdGNodW5rYWRkZWQgIT0gTU5HX1VJTlRfTUhEUikKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfTk9IRUFERVIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcmV2ZW50IG1pc3BsYWNlZCBURVJNICEgKi8KKyAgaWYgKCFjaGVja190ZXJtIChwRGF0YSwgTU5HX1VJTlRfRlJBTSkpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1RFUk1TRVFFUlJPUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSB0aGUgY2h1bmsgKi8KKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisjaWZkZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9nZW5lcmFsIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZWxzZQorICBpUmV0Y29kZSA9IG1uZ19pbml0X2ZyYW0gKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbmRpZgorI2Vsc2UKKyAgbW5nX2dldF9jaHVua2hlYWRlcihNTkdfVUlOVF9GUkFNLCAmc0NodW5raGVhZGVyKTsKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9nZW5lcmFsIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZW5kaWYKKworICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaWxsIHRoZSBjaHVuayAqLworICAoKG1uZ19mcmFtcClwQ2h1bmspLT5iRW1wdHkgICAgICAgICAgPSBiRW1wdHk7CisgICgobW5nX2ZyYW1wKXBDaHVuayktPmlNb2RlICAgICAgICAgICA9IGlNb2RlOworICAoKG1uZ19mcmFtcClwQ2h1bmspLT5pTmFtZXNpemUgICAgICAgPSBpTmFtZXNpemU7CisgICgobW5nX2ZyYW1wKXBDaHVuayktPmlDaGFuZ2VkZWxheSAgICA9IGlDaGFuZ2VkZWxheTsKKyAgKChtbmdfZnJhbXApcENodW5rKS0+aUNoYW5nZXRpbWVvdXQgID0gaUNoYW5nZXRpbWVvdXQ7CisgICgobW5nX2ZyYW1wKXBDaHVuayktPmlDaGFuZ2VjbGlwcGluZyA9IGlDaGFuZ2VjbGlwcGluZzsKKyAgKChtbmdfZnJhbXApcENodW5rKS0+aUNoYW5nZXN5bmNpZCAgID0gaUNoYW5nZXN5bmNpZDsKKyAgKChtbmdfZnJhbXApcENodW5rKS0+aURlbGF5ICAgICAgICAgID0gaURlbGF5OworICAoKG1uZ19mcmFtcClwQ2h1bmspLT5pVGltZW91dCAgICAgICAgPSBpVGltZW91dDsKKyAgKChtbmdfZnJhbXApcENodW5rKS0+aUJvdW5kYXJ5dHlwZSAgID0gaUJvdW5kYXJ5dHlwZTsKKyAgKChtbmdfZnJhbXApcENodW5rKS0+aUJvdW5kYXJ5bCAgICAgID0gaUJvdW5kYXJ5bDsKKyAgKChtbmdfZnJhbXApcENodW5rKS0+aUJvdW5kYXJ5ciAgICAgID0gaUJvdW5kYXJ5cjsKKyAgKChtbmdfZnJhbXApcENodW5rKS0+aUJvdW5kYXJ5dCAgICAgID0gaUJvdW5kYXJ5dDsKKyAgKChtbmdfZnJhbXApcENodW5rKS0+aUJvdW5kYXJ5YiAgICAgID0gaUJvdW5kYXJ5YjsKKyAgKChtbmdfZnJhbXApcENodW5rKS0+aUNvdW50ICAgICAgICAgID0gaUNvdW50OworCisgIGlmIChpTmFtZXNpemUpCisgIHsKKyAgICBNTkdfQUxMT0MgKHBEYXRhLCAoKG1uZ19mcmFtcClwQ2h1bmspLT56TmFtZSwgaU5hbWVzaXplICsgMSk7CisgICAgTU5HX0NPUFkgKCgobW5nX2ZyYW1wKXBDaHVuayktPnpOYW1lLCB6TmFtZSwgaU5hbWVzaXplKTsKKyAgfQorCisgIGlmIChpQ291bnQpCisgIHsKKyAgICBtbmdfdWludDMyIGlTaXplID0gaUNvdW50ICogc2l6ZW9mIChtbmdfdWludDMyKTsKKworICAgIE1OR19BTExPQyAocERhdGEsICgobW5nX2ZyYW1wKXBDaHVuayktPnBTeW5jaWRzLCBpU2l6ZSk7CisgICAgTU5HX0NPUFkgKCgobW5nX2ZyYW1wKXBDaHVuayktPnBTeW5jaWRzLCBwU3luY2lkcywgaVNpemUpOworICB9CisKKyAgbW5nX2FkZF9jaHVuayAocERhdGEsIHBDaHVuayk7ICAgICAgIC8qIGFkZCBpdCB0byB0aGUgbGlzdCAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1BVVENIVU5LX0ZSQU0sIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19NT1ZFCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfcHV0Y2h1bmtfbW92ZSAobW5nX2hhbmRsZSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaUZpcnN0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTGFzdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaU1vdmV0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaU1vdmV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaU1vdmV5KQoreworICBtbmdfZGF0YXAgICAgICAgIHBEYXRhOworICBtbmdfY2h1bmtwICAgICAgIHBDaHVuazsKKyAgbW5nX3JldGNvZGUgICAgICBpUmV0Y29kZTsKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisgIG1uZ19jaHVua19oZWFkZXIgc0NodW5raGVhZGVyID0KKyNpZmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICAgICAgICAgIHtNTkdfVUlOVF9NT1ZFLCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9nZW5lcmFsLCBtbmdfcmVhZF9tb3ZlLCBtbmdfd3JpdGVfbW92ZSwgbW5nX2Fzc2lnbl9nZW5lcmFsLCAwLCAwLCBzaXplb2YobW5nX21vdmUpfTsKKyNlbHNlCisgICAgICAgICAge01OR19VSU5UX01PVkUsIG1uZ19pbml0X21vdmUsIG1uZ19mcmVlX21vdmUsIG1uZ19yZWFkX21vdmUsIG1uZ193cml0ZV9tb3ZlLCBtbmdfYXNzaWduX21vdmUsIDAsIDB9OworI2VuZGlmCisjZWxzZQorICBtbmdfY2h1bmtfaGVhZGVyIHNDaHVua2hlYWRlcjsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1BVVENIVU5LX01PVkUsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhID0gKG1uZ19kYXRhcCloSGFuZGxlOyAgICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworCisgIGlmICghcERhdGEtPmJDcmVhdGluZykgICAgICAgICAgICAgICAvKiBhcmVuJ3Qgd2UgY3JlYXRpbmcgYSBuZXcgZmlsZSA/ICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0ZVTkNUSU9OSU5WQUxJRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG11c3QgaGF2ZSBoYWQgYSBNSERSIGZpcnN0ISAqLworICBpZiAocERhdGEtPmlGaXJzdGNodW5rYWRkZWQgIT0gTU5HX1VJTlRfTUhEUikKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfTk9IRUFERVIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcmV2ZW50IG1pc3BsYWNlZCBURVJNICEgKi8KKyAgaWYgKCFjaGVja190ZXJtIChwRGF0YSwgTU5HX1VJTlRfTU9WRSkpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1RFUk1TRVFFUlJPUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSB0aGUgY2h1bmsgKi8KKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisjaWZkZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9nZW5lcmFsIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZWxzZQorICBpUmV0Y29kZSA9IG1uZ19pbml0X21vdmUgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbmRpZgorI2Vsc2UKKyAgbW5nX2dldF9jaHVua2hlYWRlcihNTkdfVUlOVF9NT1ZFLCAmc0NodW5raGVhZGVyKTsKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9nZW5lcmFsIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZW5kaWYKKworICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaWxsIHRoZSBjaHVuayAqLworICAoKG1uZ19tb3ZlcClwQ2h1bmspLT5pRmlyc3RpZCAgPSBpRmlyc3RpZDsKKyAgKChtbmdfbW92ZXApcENodW5rKS0+aUxhc3RpZCAgID0gaUxhc3RpZDsKKyAgKChtbmdfbW92ZXApcENodW5rKS0+aU1vdmV0eXBlID0gaU1vdmV0eXBlOworICAoKG1uZ19tb3ZlcClwQ2h1bmspLT5pTW92ZXggICAgPSBpTW92ZXg7CisgICgobW5nX21vdmVwKXBDaHVuayktPmlNb3ZleSAgICA9IGlNb3ZleTsKKworICBtbmdfYWRkX2NodW5rIChwRGF0YSwgcENodW5rKTsgICAgICAgLyogYWRkIGl0IHRvIHRoZSBsaXN0ICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fUFVUQ0hVTktfTU9WRSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX0NMSVAKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19wdXRjaHVua19jbGlwIChtbmdfaGFuZGxlIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpRmlyc3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlMYXN0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICBpQ2xpcHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpQ2xpcGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpQ2xpcHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpQ2xpcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpQ2xpcGIpCit7CisgIG1uZ19kYXRhcCAgICAgICAgcERhdGE7CisgIG1uZ19jaHVua3AgICAgICAgcENodW5rOworICBtbmdfcmV0Y29kZSAgICAgIGlSZXRjb2RlOworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyAgbW5nX2NodW5rX2hlYWRlciBzQ2h1bmtoZWFkZXIgPQorI2lmZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisgICAgICAgICAge01OR19VSU5UX0NMSVAsIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX2dlbmVyYWwsIG1uZ19yZWFkX2NsaXAsIG1uZ193cml0ZV9jbGlwLCBtbmdfYXNzaWduX2dlbmVyYWwsIDAsIDAsIHNpemVvZihtbmdfY2xpcCl9OworI2Vsc2UKKyAgICAgICAgICB7TU5HX1VJTlRfQ0xJUCwgbW5nX2luaXRfY2xpcCwgbW5nX2ZyZWVfY2xpcCwgbW5nX3JlYWRfY2xpcCwgbW5nX3dyaXRlX2NsaXAsIG1uZ19hc3NpZ25fY2xpcCwgMCwgMH07CisjZW5kaWYKKyNlbHNlCisgIG1uZ19jaHVua19oZWFkZXIgc0NodW5raGVhZGVyOworI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fUFVUQ0hVTktfQ0xJUCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkgICAgICAgICAgICAvKiBjaGVjayB2YWxpZGl0eSBoYW5kbGUgKi8KKyAgcERhdGEgPSAobW5nX2RhdGFwKWhIYW5kbGU7ICAgICAgICAgIC8qIGFuZCBtYWtlIGl0IGFkZHJlc3NhYmxlICovCisKKyAgaWYgKCFwRGF0YS0+YkNyZWF0aW5nKSAgICAgICAgICAgICAgIC8qIGFyZW4ndCB3ZSBjcmVhdGluZyBhIG5ldyBmaWxlID8gKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfRlVOQ1RJT05JTlZBTElEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbXVzdCBoYXZlIGhhZCBhIE1IRFIgZmlyc3QhICovCisgIGlmIChwRGF0YS0+aUZpcnN0Y2h1bmthZGRlZCAhPSBNTkdfVUlOVF9NSERSKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19OT0hFQURFUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByZXZlbnQgbWlzcGxhY2VkIFRFUk0gISAqLworICBpZiAoIWNoZWNrX3Rlcm0gKHBEYXRhLCBNTkdfVUlOVF9DTElQKSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfVEVSTVNFUUVSUk9SKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIHRoZSBjaHVuayAqLworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyNpZmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICBpUmV0Y29kZSA9IG1uZ19pbml0X2dlbmVyYWwgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbHNlCisgIGlSZXRjb2RlID0gbW5nX2luaXRfY2xpcCAocERhdGEsICZzQ2h1bmtoZWFkZXIsICZwQ2h1bmspOworI2VuZGlmCisjZWxzZQorICBtbmdfZ2V0X2NodW5raGVhZGVyKE1OR19VSU5UX0NMSVAsICZzQ2h1bmtoZWFkZXIpOworICBpUmV0Y29kZSA9IG1uZ19pbml0X2dlbmVyYWwgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbmRpZgorCisgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbGwgdGhlIGNodW5rICovCisgICgobW5nX2NsaXBwKXBDaHVuayktPmlGaXJzdGlkICA9IGlGaXJzdGlkOworICAoKG1uZ19jbGlwcClwQ2h1bmspLT5pTGFzdGlkICAgPSBpTGFzdGlkOworICAoKG1uZ19jbGlwcClwQ2h1bmspLT5pQ2xpcHR5cGUgPSBpQ2xpcHR5cGU7CisgICgobW5nX2NsaXBwKXBDaHVuayktPmlDbGlwbCAgICA9IGlDbGlwbDsKKyAgKChtbmdfY2xpcHApcENodW5rKS0+aUNsaXByICAgID0gaUNsaXByOworICAoKG1uZ19jbGlwcClwQ2h1bmspLT5pQ2xpcHQgICAgPSBpQ2xpcHQ7CisgICgobW5nX2NsaXBwKXBDaHVuayktPmlDbGlwYiAgICA9IGlDbGlwYjsKKworICBtbmdfYWRkX2NodW5rIChwRGF0YSwgcENodW5rKTsgICAgICAgLyogYWRkIGl0IHRvIHRoZSBsaXN0ICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fUFVUQ0hVTktfQ0xJUCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfU0hPVworbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3B1dGNodW5rX3Nob3cgKG1uZ19oYW5kbGUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfYm9vbCAgIGJFbXB0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlGaXJzdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaUxhc3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggIGlNb2RlKQoreworICBtbmdfZGF0YXAgICAgICAgIHBEYXRhOworICBtbmdfY2h1bmtwICAgICAgIHBDaHVuazsKKyAgbW5nX3JldGNvZGUgICAgICBpUmV0Y29kZTsKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisgIG1uZ19jaHVua19oZWFkZXIgc0NodW5raGVhZGVyID0KKyNpZmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICAgICAgICAgIHtNTkdfVUlOVF9TSE9XLCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9nZW5lcmFsLCBtbmdfcmVhZF9zaG93LCBtbmdfd3JpdGVfc2hvdywgbW5nX2Fzc2lnbl9nZW5lcmFsLCAwLCAwLCBzaXplb2YobW5nX3Nob3cpfTsKKyNlbHNlCisgICAgICAgICAge01OR19VSU5UX1NIT1csIG1uZ19pbml0X3Nob3csIG1uZ19mcmVlX3Nob3csIG1uZ19yZWFkX3Nob3csIG1uZ193cml0ZV9zaG93LCBtbmdfYXNzaWduX3Nob3csIDAsIDB9OworI2VuZGlmCisjZWxzZQorICBtbmdfY2h1bmtfaGVhZGVyIHNDaHVua2hlYWRlcjsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1BVVENIVU5LX1NIT1csIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhID0gKG1uZ19kYXRhcCloSGFuZGxlOyAgICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworCisgIGlmICghcERhdGEtPmJDcmVhdGluZykgICAgICAgICAgICAgICAvKiBhcmVuJ3Qgd2UgY3JlYXRpbmcgYSBuZXcgZmlsZSA/ICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0ZVTkNUSU9OSU5WQUxJRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG11c3QgaGF2ZSBoYWQgYSBNSERSIGZpcnN0ISAqLworICBpZiAocERhdGEtPmlGaXJzdGNodW5rYWRkZWQgIT0gTU5HX1VJTlRfTUhEUikKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfTk9IRUFERVIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcmV2ZW50IG1pc3BsYWNlZCBURVJNICEgKi8KKyAgaWYgKCFjaGVja190ZXJtIChwRGF0YSwgTU5HX1VJTlRfU0hPVykpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1RFUk1TRVFFUlJPUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSB0aGUgY2h1bmsgKi8KKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisjaWZkZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9nZW5lcmFsIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZWxzZQorICBpUmV0Y29kZSA9IG1uZ19pbml0X3Nob3cgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbmRpZgorI2Vsc2UKKyAgbW5nX2dldF9jaHVua2hlYWRlcihNTkdfVUlOVF9TSE9XLCAmc0NodW5raGVhZGVyKTsKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9nZW5lcmFsIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZW5kaWYKKworICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaWxsIHRoZSBjaHVuayAqLworICAoKG1uZ19zaG93cClwQ2h1bmspLT5iRW1wdHkgICA9IGJFbXB0eTsKKyAgKChtbmdfc2hvd3ApcENodW5rKS0+aUZpcnN0aWQgPSBpRmlyc3RpZDsKKyAgKChtbmdfc2hvd3ApcENodW5rKS0+aUxhc3RpZCAgPSBpTGFzdGlkOworICAoKG1uZ19zaG93cClwQ2h1bmspLT5pTW9kZSAgICA9IGlNb2RlOworCisgIG1uZ19hZGRfY2h1bmsgKHBEYXRhLCBwQ2h1bmspOyAgICAgICAvKiBhZGQgaXQgdG8gdGhlIGxpc3QgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9QVVRDSFVOS19TSE9XLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfVEVSTQorbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3B1dGNodW5rX3Rlcm0gKG1uZ19oYW5kbGUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggIGlUZXJtYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaUl0ZXJhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpRGVsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpSXRlcm1heCkKK3sKKyAgbW5nX2RhdGFwICAgICAgICBwRGF0YTsKKyAgbW5nX2NodW5rcCAgICAgICBwQ2h1bms7CisgIG1uZ19yZXRjb2RlICAgICAgaVJldGNvZGU7CisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorICBtbmdfY2h1bmtfaGVhZGVyIHNDaHVua2hlYWRlciA9CisjaWZkZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyAgICAgICAgICB7TU5HX1VJTlRfVEVSTSwgbW5nX2luaXRfZ2VuZXJhbCwgbW5nX2ZyZWVfZ2VuZXJhbCwgbW5nX3JlYWRfdGVybSwgbW5nX3dyaXRlX3Rlcm0sIG1uZ19hc3NpZ25fZ2VuZXJhbCwgMCwgMCwgc2l6ZW9mKG1uZ190ZXJtKX07CisjZWxzZQorICAgICAgICAgIHtNTkdfVUlOVF9URVJNLCBtbmdfaW5pdF90ZXJtLCBtbmdfZnJlZV90ZXJtLCBtbmdfcmVhZF90ZXJtLCBtbmdfd3JpdGVfdGVybSwgbW5nX2Fzc2lnbl90ZXJtLCAwLCAwfTsKKyNlbmRpZgorI2Vsc2UKKyAgbW5nX2NodW5rX2hlYWRlciBzQ2h1bmtoZWFkZXI7CisjZW5kaWYKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9QVVRDSFVOS19URVJNLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFIChoSGFuZGxlKSAgICAgICAgICAgIC8qIGNoZWNrIHZhbGlkaXR5IGhhbmRsZSAqLworICBwRGF0YSA9IChtbmdfZGF0YXApaEhhbmRsZTsgICAgICAgICAgLyogYW5kIG1ha2UgaXQgYWRkcmVzc2FibGUgKi8KKworICBpZiAoIXBEYXRhLT5iQ3JlYXRpbmcpICAgICAgICAgICAgICAgLyogYXJlbid0IHdlIGNyZWF0aW5nIGEgbmV3IGZpbGUgPyAqLworICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19GVU5DVElPTklOVkFMSUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtdXN0IGhhdmUgaGFkIGEgTUhEUiBmaXJzdCEgKi8KKyAgaWYgKHBEYXRhLT5pRmlyc3RjaHVua2FkZGVkICE9IE1OR19VSU5UX01IRFIpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX05PSEVBREVSKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIHRoZSBjaHVuayAqLworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyNpZmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICBpUmV0Y29kZSA9IG1uZ19pbml0X2dlbmVyYWwgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbHNlCisgIGlSZXRjb2RlID0gbW5nX2luaXRfdGVybSAocERhdGEsICZzQ2h1bmtoZWFkZXIsICZwQ2h1bmspOworI2VuZGlmCisjZWxzZQorICBtbmdfZ2V0X2NodW5raGVhZGVyKE1OR19VSU5UX1RFUk0sICZzQ2h1bmtoZWFkZXIpOworICBpUmV0Y29kZSA9IG1uZ19pbml0X2dlbmVyYWwgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbmRpZgorCisgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbGwgdGhlIGNodW5rICovCisgICgobW5nX3Rlcm1wKXBDaHVuayktPmlUZXJtYWN0aW9uID0gaVRlcm1hY3Rpb247CisgICgobW5nX3Rlcm1wKXBDaHVuayktPmlJdGVyYWN0aW9uID0gaUl0ZXJhY3Rpb247CisgICgobW5nX3Rlcm1wKXBDaHVuayktPmlEZWxheSAgICAgID0gaURlbGF5OworICAoKG1uZ190ZXJtcClwQ2h1bmspLT5pSXRlcm1heCAgICA9IGlJdGVybWF4OworCisgIG1uZ19hZGRfY2h1bmsgKHBEYXRhLCBwQ2h1bmspOyAgICAgICAvKiBhZGQgaXQgdG8gdGhlIGxpc3QgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9QVVRDSFVOS19URVJNLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfU0FWRQorbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3B1dGNodW5rX3NhdmUgKG1uZ19oYW5kbGUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfYm9vbCAgIGJFbXB0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggIGlPZmZzZXR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaUNvdW50KQoreworICBtbmdfZGF0YXAgICAgICAgIHBEYXRhOworICBtbmdfY2h1bmtwICAgICAgIHBDaHVuazsKKyAgbW5nX3JldGNvZGUgICAgICBpUmV0Y29kZTsKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisgIG1uZ19jaHVua19oZWFkZXIgc0NodW5raGVhZGVyID0KKyNpZmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICAgICAgICAgIHtNTkdfVUlOVF9TQVZFLCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9zYXZlLCBtbmdfcmVhZF9zYXZlLCBtbmdfd3JpdGVfc2F2ZSwgbW5nX2Fzc2lnbl9zYXZlLCAwLCAwLCBzaXplb2YobW5nX3NhdmUpfTsKKyNlbHNlCisgICAgICAgICAge01OR19VSU5UX1NBVkUsIG1uZ19pbml0X3NhdmUsIG1uZ19mcmVlX3NhdmUsIG1uZ19yZWFkX3NhdmUsIG1uZ193cml0ZV9zYXZlLCBtbmdfYXNzaWduX3NhdmUsIDAsIDB9OworI2VuZGlmCisjZWxzZQorICBtbmdfY2h1bmtfaGVhZGVyIHNDaHVua2hlYWRlcjsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1BVVENIVU5LX1NBVkUsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhID0gKG1uZ19kYXRhcCloSGFuZGxlOyAgICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworCisgIGlmICghcERhdGEtPmJDcmVhdGluZykgICAgICAgICAgICAgICAvKiBhcmVuJ3Qgd2UgY3JlYXRpbmcgYSBuZXcgZmlsZSA/ICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0ZVTkNUSU9OSU5WQUxJRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG11c3QgaGF2ZSBoYWQgYSBNSERSIGZpcnN0ISAqLworICBpZiAocERhdGEtPmlGaXJzdGNodW5rYWRkZWQgIT0gTU5HX1VJTlRfTUhEUikKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfTk9IRUFERVIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcmV2ZW50IG1pc3BsYWNlZCBURVJNICEgKi8KKyAgaWYgKCFjaGVja190ZXJtIChwRGF0YSwgTU5HX1VJTlRfU0FWRSkpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1RFUk1TRVFFUlJPUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSB0aGUgY2h1bmsgKi8KKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisjaWZkZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9nZW5lcmFsIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZWxzZQorICBpUmV0Y29kZSA9IG1uZ19pbml0X3NhdmUgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbmRpZgorI2Vsc2UKKyAgbW5nX2dldF9jaHVua2hlYWRlcihNTkdfVUlOVF9TQVZFLCAmc0NodW5raGVhZGVyKTsKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9nZW5lcmFsIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZW5kaWYKKworICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaWxsIHRoZSBjaHVuayAqLworICAoKG1uZ19zYXZlcClwQ2h1bmspLT5iRW1wdHkgICAgICA9IGJFbXB0eTsKKyAgKChtbmdfc2F2ZXApcENodW5rKS0+aU9mZnNldHR5cGUgPSBpT2Zmc2V0dHlwZTsKKyAgKChtbmdfc2F2ZXApcENodW5rKS0+aUNvdW50ICAgICAgPSBpQ291bnQ7CisKKyAgaWYgKGlDb3VudCkKKyAgICBNTkdfQUxMT0MgKHBEYXRhLCAoKG1uZ19zYXZlcClwQ2h1bmspLT5wRW50cmllcywgaUNvdW50ICogc2l6ZW9mIChtbmdfc2F2ZV9lbnRyeSkpOworCisgIG1uZ19hZGRfY2h1bmsgKHBEYXRhLCBwQ2h1bmspOyAgICAgICAvKiBhZGQgaXQgdG8gdGhlIGxpc3QgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9QVVRDSFVOS19TQVZFLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3B1dGNodW5rX3NhdmVfZW50cnkgKG1uZ19oYW5kbGUgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgaUVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgIGlFbnRyeXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMmFycjIgaU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyYXJyMiBpU3RhcnR0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgIGlMYXllcm5yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgIGlGcmFtZW5yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgIGlOYW1lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcGNoYXIgICAgICB6TmFtZSkKK3sKKyAgbW5nX2RhdGFwICAgICAgIHBEYXRhOworICBtbmdfY2h1bmtwICAgICAgcENodW5rOworICBtbmdfc2F2ZV9lbnRyeXAgcEVudHJ5OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1BVVENIVU5LX1NBVkVfRU5UUlksIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhID0gKG1uZ19kYXRhcCloSGFuZGxlOyAgICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworCisgIGlmICghcERhdGEtPmJDcmVhdGluZykgICAgICAgICAgICAgICAvKiBhcmVuJ3Qgd2UgY3JlYXRpbmcgYSBuZXcgZmlsZSA/ICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0ZVTkNUSU9OSU5WQUxJRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG11c3QgaGF2ZSBoYWQgYSBNSERSIGZpcnN0ISAqLworICBpZiAocERhdGEtPmlGaXJzdGNodW5rYWRkZWQgIT0gTU5HX1VJTlRfTUhEUikKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfTk9IRUFERVIpCisKKyAgcENodW5rID0gcERhdGEtPnBMYXN0Y2h1bms7ICAgICAgICAgIC8qIGxhc3Qgb25lIG11c3QgaGF2ZSBiZWVuIFNBVkUgISAqLworCisgIGlmICgoKG1uZ19jaHVua19oZWFkZXJwKXBDaHVuayktPmlDaHVua25hbWUgIT0gTU5HX1VJTlRfU0FWRSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfTk9DT1JSQ0hVTkspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbmRleCBvdXQgb2YgYm91bmRzID8gKi8KKyAgaWYgKGlFbnRyeSA+PSAoKG1uZ19zYXZlcClwQ2h1bmspLT5pQ291bnQpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURFTlRSWUlYKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkcmVzcyBwcm9wZXIgZW50cnkgKi8KKyAgcEVudHJ5ID0gKChtbmdfc2F2ZXApcENodW5rKS0+cEVudHJpZXMgKyBpRW50cnk7CisKKyAgcEVudHJ5LT5pRW50cnl0eXBlICAgID0gaUVudHJ5dHlwZTsgIC8qIGZpbGwgZW50cnkgKi8KKyAgcEVudHJ5LT5pT2Zmc2V0WzBdICAgID0gaU9mZnNldFswXTsKKyAgcEVudHJ5LT5pT2Zmc2V0WzFdICAgID0gaU9mZnNldFsxXTsKKyAgcEVudHJ5LT5pU3RhcnR0aW1lWzBdID0gaVN0YXJ0dGltZVswXTsKKyAgcEVudHJ5LT5pU3RhcnR0aW1lWzFdID0gaVN0YXJ0dGltZVsxXTsKKyAgcEVudHJ5LT5pTGF5ZXJuciAgICAgID0gaUxheWVybnI7CisgIHBFbnRyeS0+aUZyYW1lbnIgICAgICA9IGlGcmFtZW5yOworICBwRW50cnktPmlOYW1lc2l6ZSAgICAgPSBpTmFtZXNpemU7CisKKyAgaWYgKGlOYW1lc2l6ZSkKKyAgeworICAgIE1OR19BTExPQyAocERhdGEsIHBFbnRyeS0+ek5hbWUsIGlOYW1lc2l6ZSArIDEpOworICAgIE1OR19DT1BZIChwRW50cnktPnpOYW1lLCB6TmFtZSwgaU5hbWVzaXplKTsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1BVVENIVU5LX1NBVkVfRU5UUlksIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19TRUVLCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfcHV0Y2h1bmtfc2VlayAobW5nX2hhbmRsZSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaU5hbWVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wY2hhciAgek5hbWUpCit7CisgIG1uZ19kYXRhcCAgICAgICAgcERhdGE7CisgIG1uZ19jaHVua3AgICAgICAgcENodW5rOworICBtbmdfcmV0Y29kZSAgICAgIGlSZXRjb2RlOworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyAgbW5nX2NodW5rX2hlYWRlciBzQ2h1bmtoZWFkZXIgPQorI2lmZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisgICAgICAgICAge01OR19VSU5UX1NFRUssIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX3NlZWssIG1uZ19yZWFkX3NlZWssIG1uZ193cml0ZV9zZWVrLCBtbmdfYXNzaWduX3NlZWssIDAsIDAsIHNpemVvZihtbmdfc2Vlayl9OworI2Vsc2UKKyAgICAgICAgICB7TU5HX1VJTlRfU0VFSywgbW5nX2luaXRfc2VlaywgbW5nX2ZyZWVfc2VlaywgbW5nX3JlYWRfc2VlaywgbW5nX3dyaXRlX3NlZWssIG1uZ19hc3NpZ25fc2VlaywgMCwgMH07CisjZW5kaWYKKyNlbHNlCisgIG1uZ19jaHVua19oZWFkZXIgc0NodW5raGVhZGVyOworI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fUFVUQ0hVTktfU0VFSywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkgICAgICAgICAgICAvKiBjaGVjayB2YWxpZGl0eSBoYW5kbGUgKi8KKyAgcERhdGEgPSAobW5nX2RhdGFwKWhIYW5kbGU7ICAgICAgICAgIC8qIGFuZCBtYWtlIGl0IGFkZHJlc3NhYmxlICovCisKKyAgaWYgKCFwRGF0YS0+YkNyZWF0aW5nKSAgICAgICAgICAgICAgIC8qIGFyZW4ndCB3ZSBjcmVhdGluZyBhIG5ldyBmaWxlID8gKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfRlVOQ1RJT05JTlZBTElEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbXVzdCBoYXZlIGhhZCBhIE1IRFIgZmlyc3QhICovCisgIGlmIChwRGF0YS0+aUZpcnN0Y2h1bmthZGRlZCAhPSBNTkdfVUlOVF9NSERSKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19OT0hFQURFUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByZXZlbnQgbWlzcGxhY2VkIFRFUk0gISAqLworICBpZiAoIWNoZWNrX3Rlcm0gKHBEYXRhLCBNTkdfVUlOVF9TRUVLKSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfVEVSTVNFUUVSUk9SKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIHRoZSBjaHVuayAqLworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyNpZmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICBpUmV0Y29kZSA9IG1uZ19pbml0X2dlbmVyYWwgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbHNlCisgIGlSZXRjb2RlID0gbW5nX2luaXRfc2VlayAocERhdGEsICZzQ2h1bmtoZWFkZXIsICZwQ2h1bmspOworI2VuZGlmCisjZWxzZQorICBtbmdfZ2V0X2NodW5raGVhZGVyKE1OR19VSU5UX1NFRUssICZzQ2h1bmtoZWFkZXIpOworICBpUmV0Y29kZSA9IG1uZ19pbml0X2dlbmVyYWwgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbmRpZgorCisgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbGwgdGhlIGNodW5rICovCisgICgobW5nX3NlZWtwKXBDaHVuayktPmlOYW1lc2l6ZSA9IGlOYW1lc2l6ZTsKKworICBpZiAoaU5hbWVzaXplKQorICB7CisgICAgTU5HX0FMTE9DIChwRGF0YSwgKChtbmdfc2Vla3ApcENodW5rKS0+ek5hbWUsIGlOYW1lc2l6ZSArIDEpOworICAgIE1OR19DT1BZICgoKG1uZ19zZWVrcClwQ2h1bmspLT56TmFtZSwgek5hbWUsIGlOYW1lc2l6ZSk7CisgIH0KKworICBtbmdfYWRkX2NodW5rIChwRGF0YSwgcENodW5rKTsgICAgICAgLyogYWRkIGl0IHRvIHRoZSBsaXN0ICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fUFVUQ0hVTktfU0VFSywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX2VYUEkKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19wdXRjaHVua19leHBpIChtbmdfaGFuZGxlIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpU25hcHNob3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlOYW1lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcGNoYXIgIHpOYW1lKQoreworICBtbmdfZGF0YXAgICAgICAgIHBEYXRhOworICBtbmdfY2h1bmtwICAgICAgIHBDaHVuazsKKyAgbW5nX3JldGNvZGUgICAgICBpUmV0Y29kZTsKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisgIG1uZ19jaHVua19oZWFkZXIgc0NodW5raGVhZGVyID0KKyNpZmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICAgICAgICAgIHtNTkdfVUlOVF9lWFBJLCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9leHBpLCBtbmdfcmVhZF9leHBpLCBtbmdfd3JpdGVfZXhwaSwgbW5nX2Fzc2lnbl9nZW5lcmFsLCAwLCAwLCBzaXplb2YobW5nX2V4cGkpfTsKKyNlbHNlCisgICAgICAgICAge01OR19VSU5UX2VYUEksIG1uZ19pbml0X2V4cGksIG1uZ19mcmVlX2V4cGksIG1uZ19yZWFkX2V4cGksIG1uZ193cml0ZV9leHBpLCBtbmdfYXNzaWduX2V4cGksIDAsIDB9OworI2VuZGlmCisjZWxzZQorICBtbmdfY2h1bmtfaGVhZGVyIHNDaHVua2hlYWRlcjsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1BVVENIVU5LX0VYUEksIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhID0gKG1uZ19kYXRhcCloSGFuZGxlOyAgICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworCisgIGlmICghcERhdGEtPmJDcmVhdGluZykgICAgICAgICAgICAgICAvKiBhcmVuJ3Qgd2UgY3JlYXRpbmcgYSBuZXcgZmlsZSA/ICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0ZVTkNUSU9OSU5WQUxJRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG11c3QgaGF2ZSBoYWQgYSBNSERSIGZpcnN0ISAqLworICBpZiAocERhdGEtPmlGaXJzdGNodW5rYWRkZWQgIT0gTU5HX1VJTlRfTUhEUikKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfTk9IRUFERVIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcmV2ZW50IG1pc3BsYWNlZCBURVJNICEgKi8KKyAgaWYgKCFjaGVja190ZXJtIChwRGF0YSwgTU5HX1VJTlRfZVhQSSkpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1RFUk1TRVFFUlJPUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSB0aGUgY2h1bmsgKi8KKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisjaWZkZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9nZW5lcmFsIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZWxzZQorICBpUmV0Y29kZSA9IG1uZ19pbml0X2V4cGkgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbmRpZgorI2Vsc2UKKyAgbW5nX2dldF9jaHVua2hlYWRlcihNTkdfVUlOVF9lWFBJLCAmc0NodW5raGVhZGVyKTsKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9nZW5lcmFsIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZW5kaWYKKworICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaWxsIHRoZSBjaHVuayAqLworICAoKG1uZ19leHBpcClwQ2h1bmspLT5pU25hcHNob3RpZCA9IGlTbmFwc2hvdGlkOworICAoKG1uZ19leHBpcClwQ2h1bmspLT5pTmFtZXNpemUgICA9IGlOYW1lc2l6ZTsKKworICBpZiAoaU5hbWVzaXplKQorICB7CisgICAgTU5HX0FMTE9DIChwRGF0YSwgKChtbmdfZXhwaXApcENodW5rKS0+ek5hbWUsIGlOYW1lc2l6ZSArIDEpOworICAgIE1OR19DT1BZICgoKG1uZ19leHBpcClwQ2h1bmspLT56TmFtZSwgek5hbWUsIGlOYW1lc2l6ZSk7CisgIH0KKworICBtbmdfYWRkX2NodW5rIChwRGF0YSwgcENodW5rKTsgICAgICAgLyogYWRkIGl0IHRvIHRoZSBsaXN0ICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fUFVUQ0hVTktfRVhQSSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX2ZQUkkKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19wdXRjaHVua19mcHJpIChtbmdfaGFuZGxlIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICBpRGVsdGF0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaVByaW9yaXR5KQoreworICBtbmdfZGF0YXAgICAgICAgIHBEYXRhOworICBtbmdfY2h1bmtwICAgICAgIHBDaHVuazsKKyAgbW5nX3JldGNvZGUgICAgICBpUmV0Y29kZTsKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisgIG1uZ19jaHVua19oZWFkZXIgc0NodW5raGVhZGVyID0KKyNpZmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICAgICAgICAgIHtNTkdfVUlOVF9mUFJJLCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9nZW5lcmFsLCBtbmdfcmVhZF9mcHJpLCBtbmdfd3JpdGVfZnByaSwgbW5nX2Fzc2lnbl9nZW5lcmFsLCAwLCAwLCBzaXplb2YobW5nX2ZwcmkpfTsKKyNlbHNlCisgICAgICAgICAge01OR19VSU5UX2ZQUkksIG1uZ19pbml0X2ZwcmksIG1uZ19mcmVlX2ZwcmksIG1uZ19yZWFkX2ZwcmksIG1uZ193cml0ZV9mcHJpLCBtbmdfYXNzaWduX2ZwcmksIDAsIDB9OworI2VuZGlmCisjZWxzZQorICBtbmdfY2h1bmtfaGVhZGVyIHNDaHVua2hlYWRlcjsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1BVVENIVU5LX0ZQUkksIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhID0gKG1uZ19kYXRhcCloSGFuZGxlOyAgICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworCisgIGlmICghcERhdGEtPmJDcmVhdGluZykgICAgICAgICAgICAgICAvKiBhcmVuJ3Qgd2UgY3JlYXRpbmcgYSBuZXcgZmlsZSA/ICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0ZVTkNUSU9OSU5WQUxJRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG11c3QgaGF2ZSBoYWQgYSBNSERSIGZpcnN0ISAqLworICBpZiAocERhdGEtPmlGaXJzdGNodW5rYWRkZWQgIT0gTU5HX1VJTlRfTUhEUikKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfTk9IRUFERVIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcmV2ZW50IG1pc3BsYWNlZCBURVJNICEgKi8KKyAgaWYgKCFjaGVja190ZXJtIChwRGF0YSwgTU5HX1VJTlRfZlBSSSkpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1RFUk1TRVFFUlJPUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSB0aGUgY2h1bmsgKi8KKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisjaWZkZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9nZW5lcmFsIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZWxzZQorICBpUmV0Y29kZSA9IG1uZ19pbml0X2ZwcmkgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbmRpZgorI2Vsc2UKKyAgbW5nX2dldF9jaHVua2hlYWRlcihNTkdfVUlOVF9mUFJJLCAmc0NodW5raGVhZGVyKTsKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9nZW5lcmFsIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZW5kaWYKKworICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaWxsIHRoZSBjaHVuayAqLworICAoKG1uZ19mcHJpcClwQ2h1bmspLT5pRGVsdGF0eXBlID0gaURlbHRhdHlwZTsKKyAgKChtbmdfZnByaXApcENodW5rKS0+aVByaW9yaXR5ICA9IGlQcmlvcml0eTsKKworICBtbmdfYWRkX2NodW5rIChwRGF0YSwgcENodW5rKTsgICAgICAgLyogYWRkIGl0IHRvIHRoZSBsaXN0ICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fUFVUQ0hVTktfRlBSSSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX25FRUQKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19wdXRjaHVua19uZWVkIChtbmdfaGFuZGxlIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpS2V5d29yZHNzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wY2hhciAgektleXdvcmRzKQoreworICBtbmdfZGF0YXAgICAgICAgIHBEYXRhOworICBtbmdfY2h1bmtwICAgICAgIHBDaHVuazsKKyAgbW5nX3JldGNvZGUgICAgICBpUmV0Y29kZTsKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisgIG1uZ19jaHVua19oZWFkZXIgc0NodW5raGVhZGVyID0KKyNpZmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICAgICAgICAgIHtNTkdfVUlOVF9uRUVELCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9uZWVkLCBtbmdfcmVhZF9uZWVkLCBtbmdfd3JpdGVfbmVlZCwgbW5nX2Fzc2lnbl9uZWVkLCAwLCAwLCBzaXplb2YobW5nX25lZWQpfTsKKyNlbHNlCisgICAgICAgICAge01OR19VSU5UX25FRUQsIG1uZ19pbml0X25lZWQsIG1uZ19mcmVlX25lZWQsIG1uZ19yZWFkX25lZWQsIG1uZ193cml0ZV9uZWVkLCBtbmdfYXNzaWduX25lZWQsIDAsIDB9OworI2VuZGlmCisjZWxzZQorICBtbmdfY2h1bmtfaGVhZGVyIHNDaHVua2hlYWRlcjsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1BVVENIVU5LX05FRUQsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhID0gKG1uZ19kYXRhcCloSGFuZGxlOyAgICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworCisgIGlmICghcERhdGEtPmJDcmVhdGluZykgICAgICAgICAgICAgICAvKiBhcmVuJ3Qgd2UgY3JlYXRpbmcgYSBuZXcgZmlsZSA/ICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0ZVTkNUSU9OSU5WQUxJRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG11c3QgaGF2ZSBoYWQgYSBNSERSIGZpcnN0ISAqLworICBpZiAocERhdGEtPmlGaXJzdGNodW5rYWRkZWQgIT0gTU5HX1VJTlRfTUhEUikKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfTk9IRUFERVIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcmV2ZW50IG1pc3BsYWNlZCBURVJNICEgKi8KKyAgaWYgKCFjaGVja190ZXJtIChwRGF0YSwgTU5HX1VJTlRfbkVFRCkpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1RFUk1TRVFFUlJPUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSB0aGUgY2h1bmsgKi8KKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisjaWZkZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9nZW5lcmFsIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZWxzZQorICBpUmV0Y29kZSA9IG1uZ19pbml0X25lZWQgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbmRpZgorI2Vsc2UKKyAgbW5nX2dldF9jaHVua2hlYWRlcihNTkdfVUlOVF9uRUVELCAmc0NodW5raGVhZGVyKTsKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9nZW5lcmFsIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZW5kaWYKKworICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaWxsIHRoZSBjaHVuayAqLworICAoKG1uZ19uZWVkcClwQ2h1bmspLT5pS2V5d29yZHNzaXplID0gaUtleXdvcmRzc2l6ZTsKKworICBpZiAoaUtleXdvcmRzc2l6ZSkKKyAgeworICAgIE1OR19BTExPQyAocERhdGEsICgobW5nX25lZWRwKXBDaHVuayktPnpLZXl3b3JkcywgaUtleXdvcmRzc2l6ZSArIDEpOworICAgIE1OR19DT1BZICgoKG1uZ19uZWVkcClwQ2h1bmspLT56S2V5d29yZHMsIHpLZXl3b3JkcywgaUtleXdvcmRzc2l6ZSk7CisgIH0KKworICBtbmdfYWRkX2NodW5rIChwRGF0YSwgcENodW5rKTsgICAgICAgLyogYWRkIGl0IHRvIHRoZSBsaXN0ICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fUFVUQ0hVTktfTkVFRCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX3BIWWcKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19wdXRjaHVua19waHlnIChtbmdfaGFuZGxlIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2Jvb2wgICBiRW1wdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpU2l6ZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpU2l6ZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICBpVW5pdCkKK3sKKyAgbW5nX2RhdGFwICAgICAgICBwRGF0YTsKKyAgbW5nX2NodW5rcCAgICAgICBwQ2h1bms7CisgIG1uZ19yZXRjb2RlICAgICAgaVJldGNvZGU7CisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorICBtbmdfY2h1bmtfaGVhZGVyIHNDaHVua2hlYWRlciA9CisjaWZkZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyAgICAgICAgICB7TU5HX1VJTlRfcEhZZywgbW5nX2luaXRfZ2VuZXJhbCwgbW5nX2ZyZWVfZ2VuZXJhbCwgbW5nX3JlYWRfcGh5ZywgbW5nX3dyaXRlX3BoeWcsIG1uZ19hc3NpZ25fZ2VuZXJhbCwgMCwgMCwgc2l6ZW9mKG1uZ19waHlnKX07CisjZWxzZQorICAgICAgICAgIHtNTkdfVUlOVF9wSFlnLCBtbmdfaW5pdF9waHlnLCBtbmdfZnJlZV9waHlnLCBtbmdfcmVhZF9waHlnLCBtbmdfd3JpdGVfcGh5ZywgbW5nX2Fzc2lnbl9waHlnLCAwLCAwfTsKKyNlbmRpZgorI2Vsc2UKKyAgbW5nX2NodW5rX2hlYWRlciBzQ2h1bmtoZWFkZXI7CisjZW5kaWYKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9QVVRDSFVOS19QSFlHLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFIChoSGFuZGxlKSAgICAgICAgICAgIC8qIGNoZWNrIHZhbGlkaXR5IGhhbmRsZSAqLworICBwRGF0YSA9IChtbmdfZGF0YXApaEhhbmRsZTsgICAgICAgICAgLyogYW5kIG1ha2UgaXQgYWRkcmVzc2FibGUgKi8KKworICBpZiAoIXBEYXRhLT5iQ3JlYXRpbmcpICAgICAgICAgICAgICAgLyogYXJlbid0IHdlIGNyZWF0aW5nIGEgbmV3IGZpbGUgPyAqLworICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19GVU5DVElPTklOVkFMSUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtdXN0IGhhdmUgaGFkIGEgTUhEUiBmaXJzdCEgKi8KKyAgaWYgKHBEYXRhLT5pRmlyc3RjaHVua2FkZGVkICE9IE1OR19VSU5UX01IRFIpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX05PSEVBREVSKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJldmVudCBtaXNwbGFjZWQgVEVSTSAhICovCisgIGlmICghY2hlY2tfdGVybSAocERhdGEsIE1OR19VSU5UX3BIWWcpKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19URVJNU0VRRVJST1IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgdGhlIGNodW5rICovCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorI2lmZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisgIGlSZXRjb2RlID0gbW5nX2luaXRfZ2VuZXJhbCAocERhdGEsICZzQ2h1bmtoZWFkZXIsICZwQ2h1bmspOworI2Vsc2UKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9waHlnIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZW5kaWYKKyNlbHNlCisgIG1uZ19nZXRfY2h1bmtoZWFkZXIoTU5HX1VJTlRfcEhZZywgJnNDaHVua2hlYWRlcik7CisgIGlSZXRjb2RlID0gbW5nX2luaXRfZ2VuZXJhbCAocERhdGEsICZzQ2h1bmtoZWFkZXIsICZwQ2h1bmspOworI2VuZGlmCisKKyAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgcmV0dXJuIGlSZXRjb2RlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmlsbCB0aGUgY2h1bmsgKi8KKyAgKChtbmdfcGh5Z3ApcENodW5rKS0+YkVtcHR5ID0gYkVtcHR5OworICAoKG1uZ19waHlncClwQ2h1bmspLT5pU2l6ZXggPSBpU2l6ZXg7CisgICgobW5nX3BoeWdwKXBDaHVuayktPmlTaXpleSA9IGlTaXpleTsKKyAgKChtbmdfcGh5Z3ApcENodW5rKS0+aVVuaXQgID0gaVVuaXQ7CisKKyAgbW5nX2FkZF9jaHVuayAocERhdGEsIHBDaHVuayk7ICAgICAgIC8qIGFkZCBpdCB0byB0aGUgbGlzdCAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1BVVENIVU5LX1BIWUcsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKworbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3B1dGNodW5rX2poZHIgKG1uZ19oYW5kbGUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICBpQ29sb3J0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaUltYWdlc2FtcGxlZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICBpSW1hZ2Vjb21wcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggIGlJbWFnZWludGVybGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggIGlBbHBoYXNhbXBsZWRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaUFscGhhY29tcHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICBpQWxwaGFmaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICBpQWxwaGFpbnRlcmxhY2UpCit7CisgIG1uZ19kYXRhcCAgICAgICAgcERhdGE7CisgIG1uZ19jaHVua3AgICAgICAgcENodW5rOworICBtbmdfcmV0Y29kZSAgICAgIGlSZXRjb2RlOworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyAgbW5nX2NodW5rX2hlYWRlciBzQ2h1bmtoZWFkZXIgPQorI2lmZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisgICAgICAgICAge01OR19VSU5UX0pIRFIsIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX2dlbmVyYWwsIG1uZ19yZWFkX2poZHIsIG1uZ193cml0ZV9qaGRyLCBtbmdfYXNzaWduX2dlbmVyYWwsIDAsIDAsIHNpemVvZihtbmdfamhkcil9OworI2Vsc2UKKyAgICAgICAgICB7TU5HX1VJTlRfSkhEUiwgbW5nX2luaXRfamhkciwgbW5nX2ZyZWVfamhkciwgbW5nX3JlYWRfamhkciwgbW5nX3dyaXRlX2poZHIsIG1uZ19hc3NpZ25famhkciwgMCwgMH07CisjZW5kaWYKKyNlbHNlCisgIG1uZ19jaHVua19oZWFkZXIgc0NodW5raGVhZGVyOworI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fUFVUQ0hVTktfSkhEUiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkgICAgICAgICAgICAvKiBjaGVjayB2YWxpZGl0eSBoYW5kbGUgKi8KKyAgcERhdGEgPSAobW5nX2RhdGFwKWhIYW5kbGU7ICAgICAgICAgIC8qIGFuZCBtYWtlIGl0IGFkZHJlc3NhYmxlICovCisKKyAgaWYgKCFwRGF0YS0+YkNyZWF0aW5nKSAgICAgICAgICAgICAgIC8qIGFyZW4ndCB3ZSBjcmVhdGluZyBhIG5ldyBmaWxlID8gKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfRlVOQ1RJT05JTlZBTElEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJldmVudCBtaXNwbGFjZWQgVEVSTSAhICovCisgIGlmICghY2hlY2tfdGVybSAocERhdGEsIE1OR19VSU5UX0pIRFIpKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19URVJNU0VRRVJST1IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgdGhlIGNodW5rICovCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorI2lmZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisgIGlSZXRjb2RlID0gbW5nX2luaXRfZ2VuZXJhbCAocERhdGEsICZzQ2h1bmtoZWFkZXIsICZwQ2h1bmspOworI2Vsc2UKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9qaGRyIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZW5kaWYKKyNlbHNlCisgIG1uZ19nZXRfY2h1bmtoZWFkZXIoTU5HX1VJTlRfSkhEUiwgJnNDaHVua2hlYWRlcik7CisgIGlSZXRjb2RlID0gbW5nX2luaXRfZ2VuZXJhbCAocERhdGEsICZzQ2h1bmtoZWFkZXIsICZwQ2h1bmspOworI2VuZGlmCisKKyAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgcmV0dXJuIGlSZXRjb2RlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmlsbCB0aGUgY2h1bmsgKi8KKyAgKChtbmdfamhkcnApcENodW5rKS0+aVdpZHRoICAgICAgICAgICAgPSBpV2lkdGg7CisgICgobW5nX2poZHJwKXBDaHVuayktPmlIZWlnaHQgICAgICAgICAgID0gaUhlaWdodDsKKyAgKChtbmdfamhkcnApcENodW5rKS0+aUNvbG9ydHlwZSAgICAgICAgPSBpQ29sb3J0eXBlOworICAoKG1uZ19qaGRycClwQ2h1bmspLT5pSW1hZ2VzYW1wbGVkZXB0aCA9IGlJbWFnZXNhbXBsZWRlcHRoOworICAoKG1uZ19qaGRycClwQ2h1bmspLT5pSW1hZ2Vjb21wcmVzc2lvbiA9IGlJbWFnZWNvbXByZXNzaW9uOworICAoKG1uZ19qaGRycClwQ2h1bmspLT5pSW1hZ2VpbnRlcmxhY2UgICA9IGlJbWFnZWludGVybGFjZTsKKyAgKChtbmdfamhkcnApcENodW5rKS0+aUFscGhhc2FtcGxlZGVwdGggPSBpQWxwaGFzYW1wbGVkZXB0aDsKKyAgKChtbmdfamhkcnApcENodW5rKS0+aUFscGhhY29tcHJlc3Npb24gPSBpQWxwaGFjb21wcmVzc2lvbjsKKyAgKChtbmdfamhkcnApcENodW5rKS0+aUFscGhhZmlsdGVyICAgICAgPSBpQWxwaGFmaWx0ZXI7CisgICgobW5nX2poZHJwKXBDaHVuayktPmlBbHBoYWludGVybGFjZSAgID0gaUFscGhhaW50ZXJsYWNlOworCisgIG1uZ19hZGRfY2h1bmsgKHBEYXRhLCBwQ2h1bmspOyAgICAgICAvKiBhZGQgaXQgdG8gdGhlIGxpc3QgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9QVVRDSFVOS19KSERSLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworI2VuZGlmIC8qIE1OR19JTkNMVURFX0pORyAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19wdXRjaHVua19qZGF0IChtbmdfaGFuZGxlIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpUmF3bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wdHIgICAgcFJhd2RhdGEpCit7CisgIG1uZ19kYXRhcCAgICAgICAgcERhdGE7CisgIG1uZ19jaHVua3AgICAgICAgcENodW5rOworICBtbmdfcmV0Y29kZSAgICAgIGlSZXRjb2RlOworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyAgbW5nX2NodW5rX2hlYWRlciBzQ2h1bmtoZWFkZXIgPQorI2lmZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisgICAgICAgICAge01OR19VSU5UX0pEQVQsIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX2pkYXQsIG1uZ19yZWFkX2pkYXQsIG1uZ193cml0ZV9qZGF0LCBtbmdfYXNzaWduX2pkYXQsIDAsIDAsIHNpemVvZihtbmdfamRhdCl9OworI2Vsc2UKKyAgICAgICAgICB7TU5HX1VJTlRfSkRBVCwgbW5nX2luaXRfamRhdCwgbW5nX2ZyZWVfamRhdCwgbW5nX3JlYWRfamRhdCwgbW5nX3dyaXRlX2pkYXQsIG1uZ19hc3NpZ25famRhdCwgMCwgMH07CisjZW5kaWYKKyNlbHNlCisgIG1uZ19jaHVua19oZWFkZXIgc0NodW5raGVhZGVyOworI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fUFVUQ0hVTktfSkRBVCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkgICAgICAgICAgICAvKiBjaGVjayB2YWxpZGl0eSBoYW5kbGUgKi8KKyAgcERhdGEgPSAobW5nX2RhdGFwKWhIYW5kbGU7ICAgICAgICAgIC8qIGFuZCBtYWtlIGl0IGFkZHJlc3NhYmxlICovCisKKyAgaWYgKCFwRGF0YS0+YkNyZWF0aW5nKSAgICAgICAgICAgICAgIC8qIGFyZW4ndCB3ZSBjcmVhdGluZyBhIG5ldyBmaWxlID8gKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfRlVOQ1RJT05JTlZBTElEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbXVzdCBoYXZlIGhhZCBhIE1IRFIgb3IgSkhEUiBmaXJzdCEgKi8KKyAgaWYgKChwRGF0YS0+aUZpcnN0Y2h1bmthZGRlZCAhPSBNTkdfVUlOVF9NSERSKSAmJgorICAgICAgKHBEYXRhLT5pRmlyc3RjaHVua2FkZGVkICE9IE1OR19VSU5UX0pIRFIpICAgICkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfTk9IRUFERVIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcmV2ZW50IG1pc3BsYWNlZCBURVJNICEgKi8KKyAgaWYgKCFjaGVja190ZXJtIChwRGF0YSwgTU5HX1VJTlRfSkRBVCkpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1RFUk1TRVFFUlJPUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSB0aGUgY2h1bmsgKi8KKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisjaWZkZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9nZW5lcmFsIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZWxzZQorICBpUmV0Y29kZSA9IG1uZ19pbml0X2pkYXQgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbmRpZgorI2Vsc2UKKyAgbW5nX2dldF9jaHVua2hlYWRlcihNTkdfVUlOVF9KREFULCAmc0NodW5raGVhZGVyKTsKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9nZW5lcmFsIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZW5kaWYKKworICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaWxsIHRoZSBjaHVuayAqLworICAoKG1uZ19qZGF0cClwQ2h1bmspLT5pRGF0YXNpemUgPSBpUmF3bGVuOworCisgIGlmIChpUmF3bGVuKQorICB7CisgICAgTU5HX0FMTE9DIChwRGF0YSwgKChtbmdfamRhdHApcENodW5rKS0+cERhdGEsIGlSYXdsZW4pOworICAgIE1OR19DT1BZICgoKG1uZ19qZGF0cClwQ2h1bmspLT5wRGF0YSwgcFJhd2RhdGEsIGlSYXdsZW4pOworICB9CisKKyAgbW5nX2FkZF9jaHVuayAocERhdGEsIHBDaHVuayk7ICAgICAgIC8qIGFkZCBpdCB0byB0aGUgbGlzdCAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1BVVENIVU5LX0pEQVQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisjZW5kaWYgLyogIE1OR19JTkNMVURFX0pORyAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19wdXRjaHVua19qZGFhIChtbmdfaGFuZGxlIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpUmF3bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wdHIgICAgcFJhd2RhdGEpCit7CisgIG1uZ19kYXRhcCAgICAgICAgcERhdGE7CisgIG1uZ19jaHVua3AgICAgICAgcENodW5rOworICBtbmdfcmV0Y29kZSAgICAgIGlSZXRjb2RlOworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyAgbW5nX2NodW5rX2hlYWRlciBzQ2h1bmtoZWFkZXIgPQorI2lmZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisgICAgICAgICAge01OR19VSU5UX0pEQUEsIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX2pkYWEsIG1uZ19yZWFkX2pkYWEsIG1uZ193cml0ZV9qZGFhLCBtbmdfYXNzaWduX2pkYWEsIDAsIDAsIHNpemVvZihtbmdfamRhYSl9OworI2Vsc2UKKyAgICAgICAgICB7TU5HX1VJTlRfSkRBQSwgbW5nX2luaXRfamRhYSwgbW5nX2ZyZWVfamRhYSwgbW5nX3JlYWRfamRhYSwgbW5nX3dyaXRlX2pkYWEsIG1uZ19hc3NpZ25famRhYSwgMCwgMH07CisjZW5kaWYKKyNlbHNlCisgIG1uZ19jaHVua19oZWFkZXIgc0NodW5raGVhZGVyOworI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fUFVUQ0hVTktfSkRBQSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkgICAgICAgICAgICAvKiBjaGVjayB2YWxpZGl0eSBoYW5kbGUgKi8KKyAgcERhdGEgPSAobW5nX2RhdGFwKWhIYW5kbGU7ICAgICAgICAgIC8qIGFuZCBtYWtlIGl0IGFkZHJlc3NhYmxlICovCisKKyAgaWYgKCFwRGF0YS0+YkNyZWF0aW5nKSAgICAgICAgICAgICAgIC8qIGFyZW4ndCB3ZSBjcmVhdGluZyBhIG5ldyBmaWxlID8gKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfRlVOQ1RJT05JTlZBTElEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbXVzdCBoYXZlIGhhZCBhIE1IRFIgb3IgSkhEUiBmaXJzdCEgKi8KKyAgaWYgKChwRGF0YS0+aUZpcnN0Y2h1bmthZGRlZCAhPSBNTkdfVUlOVF9NSERSKSAmJgorICAgICAgKHBEYXRhLT5pRmlyc3RjaHVua2FkZGVkICE9IE1OR19VSU5UX0pIRFIpICAgICkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfTk9IRUFERVIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcmV2ZW50IG1pc3BsYWNlZCBURVJNICEgKi8KKyAgaWYgKCFjaGVja190ZXJtIChwRGF0YSwgTU5HX1VJTlRfSkRBQSkpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1RFUk1TRVFFUlJPUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSB0aGUgY2h1bmsgKi8KKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisjaWZkZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9nZW5lcmFsIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZWxzZQorICBpUmV0Y29kZSA9IG1uZ19pbml0X2pkYWEgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbmRpZgorI2Vsc2UKKyAgbW5nX2dldF9jaHVua2hlYWRlcihNTkdfVUlOVF9KREFBLCAmc0NodW5raGVhZGVyKTsKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9nZW5lcmFsIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZW5kaWYKKworICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaWxsIHRoZSBjaHVuayAqLworICAoKG1uZ19qZGFhcClwQ2h1bmspLT5pRGF0YXNpemUgPSBpUmF3bGVuOworCisgIGlmIChpUmF3bGVuKQorICB7CisgICAgTU5HX0FMTE9DIChwRGF0YSwgKChtbmdfamRhYXApcENodW5rKS0+cERhdGEsIGlSYXdsZW4pOworICAgIE1OR19DT1BZICgoKG1uZ19qZGFhcClwQ2h1bmspLT5wRGF0YSwgcFJhd2RhdGEsIGlSYXdsZW4pOworICB9CisKKyAgbW5nX2FkZF9jaHVuayAocERhdGEsIHBDaHVuayk7ICAgICAgIC8qIGFkZCBpdCB0byB0aGUgbGlzdCAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1BVVENIVU5LX0pEQUEsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisjZW5kaWYgLyogIE1OR19JTkNMVURFX0pORyAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19wdXRjaHVua19qc2VwIChtbmdfaGFuZGxlIGhIYW5kbGUpCit7CisgIG1uZ19kYXRhcCAgICAgICAgcERhdGE7CisgIG1uZ19jaHVua3AgICAgICAgcENodW5rOworICBtbmdfcmV0Y29kZSAgICAgIGlSZXRjb2RlOworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyAgbW5nX2NodW5rX2hlYWRlciBzQ2h1bmtoZWFkZXIgPQorI2lmZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisgICAgICAgICAge01OR19VSU5UX0pTRVAsIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX2dlbmVyYWwsIG1uZ19yZWFkX2pzZXAsIG1uZ193cml0ZV9qc2VwLCBtbmdfYXNzaWduX2dlbmVyYWwsIDAsIDAsIHNpemVvZihtbmdfanNlcCl9OworI2Vsc2UKKyAgICAgICAgICB7TU5HX1VJTlRfSlNFUCwgbW5nX2luaXRfanNlcCwgbW5nX2ZyZWVfanNlcCwgbW5nX3JlYWRfanNlcCwgbW5nX3dyaXRlX2pzZXAsIG1uZ19hc3NpZ25fanNlcCwgMCwgMH07CisjZW5kaWYKKyNlbHNlCisgIG1uZ19jaHVua19oZWFkZXIgc0NodW5raGVhZGVyOworI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fUFVUQ0hVTktfSlNFUCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkgICAgICAgICAgICAvKiBjaGVjayB2YWxpZGl0eSBoYW5kbGUgKi8KKyAgcERhdGEgPSAobW5nX2RhdGFwKWhIYW5kbGU7ICAgICAgICAgIC8qIGFuZCBtYWtlIGl0IGFkZHJlc3NhYmxlICovCisKKyAgaWYgKCFwRGF0YS0+YkNyZWF0aW5nKSAgICAgICAgICAgICAgIC8qIGFyZW4ndCB3ZSBjcmVhdGluZyBhIG5ldyBmaWxlID8gKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfRlVOQ1RJT05JTlZBTElEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbXVzdCBoYXZlIGhhZCBhIE1IRFIgb3IgSkhEUiBmaXJzdCEgKi8KKyAgaWYgKChwRGF0YS0+aUZpcnN0Y2h1bmthZGRlZCAhPSBNTkdfVUlOVF9NSERSKSAmJgorICAgICAgKHBEYXRhLT5pRmlyc3RjaHVua2FkZGVkICE9IE1OR19VSU5UX0pIRFIpICAgICkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfTk9IRUFERVIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcmV2ZW50IG1pc3BsYWNlZCBURVJNICEgKi8KKyAgaWYgKCFjaGVja190ZXJtIChwRGF0YSwgTU5HX1VJTlRfSlNFUCkpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1RFUk1TRVFFUlJPUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSB0aGUgY2h1bmsgKi8KKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisjaWZkZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9nZW5lcmFsIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZWxzZQorICBpUmV0Y29kZSA9IG1uZ19pbml0X2pzZXAgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbmRpZgorI2Vsc2UKKyAgbW5nX2dldF9jaHVua2hlYWRlcihNTkdfVUlOVF9KU0VQLCAmc0NodW5raGVhZGVyKTsKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9nZW5lcmFsIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZW5kaWYKKworICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICByZXR1cm4gaVJldGNvZGU7CisKKyAgbW5nX2FkZF9jaHVuayAocERhdGEsIHBDaHVuayk7ICAgICAgIC8qIGFkZCBpdCB0byB0aGUgbGlzdCAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1BVVENIVU5LX0pTRVAsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisjZW5kaWYgLyogTU5HX0lOQ0xVREVfSk5HICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3B1dGNodW5rX2RoZHIgKG1uZ19oYW5kbGUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlPYmplY3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggIGlJbWFnZXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICBpRGVsdGF0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaUJsb2Nrd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpQmxvY2toZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpQmxvY2t4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaUJsb2NreSkKK3sKKyAgbW5nX2RhdGFwICAgICAgICBwRGF0YTsKKyAgbW5nX2NodW5rcCAgICAgICBwQ2h1bms7CisgIG1uZ19yZXRjb2RlICAgICAgaVJldGNvZGU7CisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorICBtbmdfY2h1bmtfaGVhZGVyIHNDaHVua2hlYWRlciA9CisjaWZkZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyAgICAgICAgICB7TU5HX1VJTlRfREhEUiwgbW5nX2luaXRfZ2VuZXJhbCwgbW5nX2ZyZWVfZ2VuZXJhbCwgbW5nX3JlYWRfZGhkciwgbW5nX3dyaXRlX2RoZHIsIG1uZ19hc3NpZ25fZ2VuZXJhbCwgMCwgMCwgc2l6ZW9mKG1uZ19kaGRyKX07CisjZWxzZQorICAgICAgICAgIHtNTkdfVUlOVF9ESERSLCBtbmdfaW5pdF9kaGRyLCBtbmdfZnJlZV9kaGRyLCBtbmdfcmVhZF9kaGRyLCBtbmdfd3JpdGVfZGhkciwgbW5nX2Fzc2lnbl9kaGRyLCAwLCAwfTsKKyNlbmRpZgorI2Vsc2UKKyAgbW5nX2NodW5rX2hlYWRlciBzQ2h1bmtoZWFkZXI7CisjZW5kaWYKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9QVVRDSFVOS19ESERSLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFIChoSGFuZGxlKSAgICAgICAgICAgIC8qIGNoZWNrIHZhbGlkaXR5IGhhbmRsZSAqLworICBwRGF0YSA9IChtbmdfZGF0YXApaEhhbmRsZTsgICAgICAgICAgLyogYW5kIG1ha2UgaXQgYWRkcmVzc2FibGUgKi8KKworICBpZiAoIXBEYXRhLT5iQ3JlYXRpbmcpICAgICAgICAgICAgICAgLyogYXJlbid0IHdlIGNyZWF0aW5nIGEgbmV3IGZpbGUgPyAqLworICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19GVU5DVElPTklOVkFMSUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtdXN0IGhhdmUgaGFkIGEgTUhEUiBmaXJzdCEgKi8KKyAgaWYgKHBEYXRhLT5pRmlyc3RjaHVua2FkZGVkICE9IE1OR19VSU5UX01IRFIpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX05PSEVBREVSKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJldmVudCBtaXNwbGFjZWQgVEVSTSAhICovCisgIGlmICghY2hlY2tfdGVybSAocERhdGEsIE1OR19VSU5UX0RIRFIpKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19URVJNU0VRRVJST1IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgdGhlIGNodW5rICovCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorI2lmZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisgIGlSZXRjb2RlID0gbW5nX2luaXRfZ2VuZXJhbCAocERhdGEsICZzQ2h1bmtoZWFkZXIsICZwQ2h1bmspOworI2Vsc2UKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9kaGRyIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZW5kaWYKKyNlbHNlCisgIG1uZ19nZXRfY2h1bmtoZWFkZXIoTU5HX1VJTlRfREhEUiwgJnNDaHVua2hlYWRlcik7CisgIGlSZXRjb2RlID0gbW5nX2luaXRfZ2VuZXJhbCAocERhdGEsICZzQ2h1bmtoZWFkZXIsICZwQ2h1bmspOworI2VuZGlmCisKKyAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgcmV0dXJuIGlSZXRjb2RlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmlsbCB0aGUgY2h1bmsgKi8KKyAgKChtbmdfZGhkcnApcENodW5rKS0+aU9iamVjdGlkICAgID0gaU9iamVjdGlkOworICAoKG1uZ19kaGRycClwQ2h1bmspLT5pSW1hZ2V0eXBlICAgPSBpSW1hZ2V0eXBlOworICAoKG1uZ19kaGRycClwQ2h1bmspLT5pRGVsdGF0eXBlICAgPSBpRGVsdGF0eXBlOworICAoKG1uZ19kaGRycClwQ2h1bmspLT5pQmxvY2t3aWR0aCAgPSBpQmxvY2t3aWR0aDsKKyAgKChtbmdfZGhkcnApcENodW5rKS0+aUJsb2NraGVpZ2h0ID0gaUJsb2NraGVpZ2h0OworICAoKG1uZ19kaGRycClwQ2h1bmspLT5pQmxvY2t4ICAgICAgPSBpQmxvY2t4OworICAoKG1uZ19kaGRycClwQ2h1bmspLT5pQmxvY2t5ICAgICAgPSBpQmxvY2t5OworCisgIG1uZ19hZGRfY2h1bmsgKHBEYXRhLCBwQ2h1bmspOyAgICAgICAvKiBhZGQgaXQgdG8gdGhlIGxpc3QgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9QVVRDSFVOS19ESERSLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19wdXRjaHVua19wcm9tIChtbmdfaGFuZGxlIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICBpQ29sb3J0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaVNhbXBsZWRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaUZpbGx0eXBlKQoreworICBtbmdfZGF0YXAgICAgICAgIHBEYXRhOworICBtbmdfY2h1bmtwICAgICAgIHBDaHVuazsKKyAgbW5nX3JldGNvZGUgICAgICBpUmV0Y29kZTsKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisgIG1uZ19jaHVua19oZWFkZXIgc0NodW5raGVhZGVyID0KKyNpZmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICAgICAgICAgIHtNTkdfVUlOVF9QUk9NLCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9nZW5lcmFsLCBtbmdfcmVhZF9wcm9tLCBtbmdfd3JpdGVfcHJvbSwgbW5nX2Fzc2lnbl9nZW5lcmFsLCAwLCAwLCBzaXplb2YobW5nX3Byb20pfTsKKyNlbHNlCisgICAgICAgICAge01OR19VSU5UX1BST00sIG1uZ19pbml0X3Byb20sIG1uZ19mcmVlX3Byb20sIG1uZ19yZWFkX3Byb20sIG1uZ193cml0ZV9wcm9tLCBtbmdfYXNzaWduX3Byb20sIDAsIDB9OworI2VuZGlmCisjZWxzZQorICBtbmdfY2h1bmtfaGVhZGVyIHNDaHVua2hlYWRlcjsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1BVVENIVU5LX1BST00sIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhID0gKG1uZ19kYXRhcCloSGFuZGxlOyAgICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworCisgIGlmICghcERhdGEtPmJDcmVhdGluZykgICAgICAgICAgICAgICAvKiBhcmVuJ3Qgd2UgY3JlYXRpbmcgYSBuZXcgZmlsZSA/ICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0ZVTkNUSU9OSU5WQUxJRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG11c3QgaGF2ZSBoYWQgYSBNSERSIGZpcnN0ISAqLworICBpZiAocERhdGEtPmlGaXJzdGNodW5rYWRkZWQgIT0gTU5HX1VJTlRfTUhEUikKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfTk9IRUFERVIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcmV2ZW50IG1pc3BsYWNlZCBURVJNICEgKi8KKyAgaWYgKCFjaGVja190ZXJtIChwRGF0YSwgTU5HX1VJTlRfUFJPTSkpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1RFUk1TRVFFUlJPUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSB0aGUgY2h1bmsgKi8KKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisjaWZkZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9nZW5lcmFsIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZWxzZQorICBpUmV0Y29kZSA9IG1uZ19pbml0X3Byb20gKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbmRpZgorI2Vsc2UKKyAgbW5nX2dldF9jaHVua2hlYWRlcihNTkdfVUlOVF9QUk9NLCAmc0NodW5raGVhZGVyKTsKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9nZW5lcmFsIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZW5kaWYKKworICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaWxsIHRoZSBjaHVuayAqLworICAoKG1uZ19wcm9tcClwQ2h1bmspLT5pQ29sb3J0eXBlICAgPSBpQ29sb3J0eXBlOworICAoKG1uZ19wcm9tcClwQ2h1bmspLT5pU2FtcGxlZGVwdGggPSBpU2FtcGxlZGVwdGg7CisgICgobW5nX3Byb21wKXBDaHVuayktPmlGaWxsdHlwZSAgICA9IGlGaWxsdHlwZTsKKworICBtbmdfYWRkX2NodW5rIChwRGF0YSwgcENodW5rKTsgICAgICAgLyogYWRkIGl0IHRvIHRoZSBsaXN0ICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fUFVUQ0hVTktfUFJPTSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfcHV0Y2h1bmtfaXBuZyAobW5nX2hhbmRsZSBoSGFuZGxlKQoreworICBtbmdfZGF0YXAgICAgICAgIHBEYXRhOworICBtbmdfY2h1bmtwICAgICAgIHBDaHVuazsKKyAgbW5nX3JldGNvZGUgICAgICBpUmV0Y29kZTsKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisgIG1uZ19jaHVua19oZWFkZXIgc0NodW5raGVhZGVyID0KKyNpZmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICAgICAgICAgIHtNTkdfVUlOVF9JUE5HLCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9nZW5lcmFsLCBtbmdfcmVhZF9pcG5nLCBtbmdfd3JpdGVfaXBuZywgbW5nX2Fzc2lnbl9nZW5lcmFsLCAwLCAwLCBzaXplb2YobW5nX2lwbmcpfTsKKyNlbHNlCisgICAgICAgICAge01OR19VSU5UX0lQTkcsIG1uZ19pbml0X2lwbmcsIG1uZ19mcmVlX2lwbmcsIG1uZ19yZWFkX2lwbmcsIG1uZ193cml0ZV9pcG5nLCBtbmdfYXNzaWduX2lwbmcsIDAsIDB9OworI2VuZGlmCisjZWxzZQorICBtbmdfY2h1bmtfaGVhZGVyIHNDaHVua2hlYWRlcjsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1BVVENIVU5LX0lQTkcsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhID0gKG1uZ19kYXRhcCloSGFuZGxlOyAgICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworCisgIGlmICghcERhdGEtPmJDcmVhdGluZykgICAgICAgICAgICAgICAvKiBhcmVuJ3Qgd2UgY3JlYXRpbmcgYSBuZXcgZmlsZSA/ICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0ZVTkNUSU9OSU5WQUxJRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG11c3QgaGF2ZSBoYWQgYSBNSERSIGZpcnN0ISAqLworICBpZiAocERhdGEtPmlGaXJzdGNodW5rYWRkZWQgIT0gTU5HX1VJTlRfTUhEUikKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfTk9IRUFERVIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcmV2ZW50IG1pc3BsYWNlZCBURVJNICEgKi8KKyAgaWYgKCFjaGVja190ZXJtIChwRGF0YSwgTU5HX1VJTlRfSVBORykpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1RFUk1TRVFFUlJPUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSB0aGUgY2h1bmsgKi8KKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisjaWZkZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9nZW5lcmFsIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZWxzZQorICBpUmV0Y29kZSA9IG1uZ19pbml0X2lwbmcgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbmRpZgorI2Vsc2UKKyAgbW5nX2dldF9jaHVua2hlYWRlcihNTkdfVUlOVF9JUE5HLCAmc0NodW5raGVhZGVyKTsKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9nZW5lcmFsIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZW5kaWYKKworICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICByZXR1cm4gaVJldGNvZGU7CisKKyAgbW5nX2FkZF9jaHVuayAocERhdGEsIHBDaHVuayk7ICAgICAgIC8qIGFkZCBpdCB0byB0aGUgbGlzdCAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1BVVENIVU5LX0lQTkcsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3B1dGNodW5rX3BwbHQgKG1uZ19oYW5kbGUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggIGlEZWx0YXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpQ291bnQpCit7CisgIG1uZ19kYXRhcCAgICAgICAgcERhdGE7CisgIG1uZ19jaHVua3AgICAgICAgcENodW5rOworICBtbmdfcmV0Y29kZSAgICAgIGlSZXRjb2RlOworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyAgbW5nX2NodW5rX2hlYWRlciBzQ2h1bmtoZWFkZXIgPQorI2lmZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisgICAgICAgICAge01OR19VSU5UX1BQTFQsIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX2dlbmVyYWwsIG1uZ19yZWFkX3BwbHQsIG1uZ193cml0ZV9wcGx0LCBtbmdfYXNzaWduX2dlbmVyYWwsIDAsIDAsIHNpemVvZihtbmdfcHBsdCl9OworI2Vsc2UKKyAgICAgICAgICB7TU5HX1VJTlRfUFBMVCwgbW5nX2luaXRfcHBsdCwgbW5nX2ZyZWVfcHBsdCwgbW5nX3JlYWRfcHBsdCwgbW5nX3dyaXRlX3BwbHQsIG1uZ19hc3NpZ25fcHBsdCwgMCwgMH07CisjZW5kaWYKKyNlbHNlCisgIG1uZ19jaHVua19oZWFkZXIgc0NodW5raGVhZGVyOworI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fUFVUQ0hVTktfUFBMVCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkgICAgICAgICAgICAvKiBjaGVjayB2YWxpZGl0eSBoYW5kbGUgKi8KKyAgcERhdGEgPSAobW5nX2RhdGFwKWhIYW5kbGU7ICAgICAgICAgIC8qIGFuZCBtYWtlIGl0IGFkZHJlc3NhYmxlICovCisKKyAgaWYgKCFwRGF0YS0+YkNyZWF0aW5nKSAgICAgICAgICAgICAgIC8qIGFyZW4ndCB3ZSBjcmVhdGluZyBhIG5ldyBmaWxlID8gKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfRlVOQ1RJT05JTlZBTElEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbXVzdCBoYXZlIGhhZCBhIE1IRFIgZmlyc3QhICovCisgIGlmIChwRGF0YS0+aUZpcnN0Y2h1bmthZGRlZCAhPSBNTkdfVUlOVF9NSERSKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19OT0hFQURFUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByZXZlbnQgbWlzcGxhY2VkIFRFUk0gISAqLworICBpZiAoIWNoZWNrX3Rlcm0gKHBEYXRhLCBNTkdfVUlOVF9QUExUKSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfVEVSTVNFUUVSUk9SKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIHRoZSBjaHVuayAqLworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyNpZmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICBpUmV0Y29kZSA9IG1uZ19pbml0X2dlbmVyYWwgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbHNlCisgIGlSZXRjb2RlID0gbW5nX2luaXRfcHBsdCAocERhdGEsICZzQ2h1bmtoZWFkZXIsICZwQ2h1bmspOworI2VuZGlmCisjZWxzZQorICBtbmdfZ2V0X2NodW5raGVhZGVyKE1OR19VSU5UX1BQTFQsICZzQ2h1bmtoZWFkZXIpOworICBpUmV0Y29kZSA9IG1uZ19pbml0X2dlbmVyYWwgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbmRpZgorCisgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbGwgdGhlIGNodW5rICovCisgICgobW5nX3BwbHRwKXBDaHVuayktPmlEZWx0YXR5cGUgPSBpRGVsdGF0eXBlOworICAoKG1uZ19wcGx0cClwQ2h1bmspLT5pQ291bnQgICAgID0gaUNvdW50OworCisgIG1uZ19hZGRfY2h1bmsgKHBEYXRhLCBwQ2h1bmspOyAgICAgICAvKiBhZGQgaXQgdG8gdGhlIGxpc3QgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9QVVRDSFVOS19QUExULCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19wdXRjaHVua19wcGx0X2VudHJ5IChtbmdfaGFuZGxlIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpRW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpUmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaUdyZWVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaUJsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpQWxwaGEpCit7CisgIG1uZ19kYXRhcCAgICAgICBwRGF0YTsKKyAgbW5nX2NodW5rcCAgICAgIHBDaHVuazsKKyAgbW5nX3BwbHRfZW50cnlwIHBFbnRyeTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9QVVRDSFVOS19QUExUX0VOVFJZLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFIChoSGFuZGxlKSAgICAgICAgICAgIC8qIGNoZWNrIHZhbGlkaXR5IGhhbmRsZSAqLworICBwRGF0YSA9IChtbmdfZGF0YXApaEhhbmRsZTsgICAgICAgICAgLyogYW5kIG1ha2UgaXQgYWRkcmVzc2FibGUgKi8KKworICBpZiAoIXBEYXRhLT5iQ3JlYXRpbmcpICAgICAgICAgICAgICAgLyogYXJlbid0IHdlIGNyZWF0aW5nIGEgbmV3IGZpbGUgPyAqLworICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19GVU5DVElPTklOVkFMSUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtdXN0IGhhdmUgaGFkIGEgTUhEUiBmaXJzdCEgKi8KKyAgaWYgKHBEYXRhLT5pRmlyc3RjaHVua2FkZGVkICE9IE1OR19VSU5UX01IRFIpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX05PSEVBREVSKQorCisgIHBDaHVuayA9IHBEYXRhLT5wTGFzdGNodW5rOyAgICAgICAgICAvKiBsYXN0IG9uZSBtdXN0IGhhdmUgYmVlbiBQUExUICEgKi8KKworICBpZiAoKChtbmdfY2h1bmtfaGVhZGVycClwQ2h1bmspLT5pQ2h1bmtuYW1lICE9IE1OR19VSU5UX1BQTFQpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX05PQ09SUkNIVU5LKQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbmRleCBvdXQgb2YgYm91bmRzID8gKi8KKyAgaWYgKGlFbnRyeSA+PSAoKG1uZ19wcGx0cClwQ2h1bmspLT5pQ291bnQpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURFTlRSWUlYKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkcmVzcyBwcm9wZXIgZW50cnkgKi8KKyAgcEVudHJ5ID0gKG1uZ19wcGx0X2VudHJ5cCkoKChtbmdfcHBsdHApcENodW5rKS0+YUVudHJpZXMpICsgaUVudHJ5OworCisgIHBFbnRyeS0+aVJlZCAgID0gKG1uZ191aW50OClpUmVkOyAgICAvKiBmaWxsIHRoZSBlbnRyeSAqLworICBwRW50cnktPmlHcmVlbiA9IChtbmdfdWludDgpaUdyZWVuOworICBwRW50cnktPmlCbHVlICA9IChtbmdfdWludDgpaUJsdWU7CisgIHBFbnRyeS0+aUFscGhhID0gKG1uZ191aW50OClpQWxwaGE7CisgIHBFbnRyeS0+YlVzZWQgID0gTU5HX1RSVUU7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fUFVUQ0hVTktfUFBMVF9FTlRSWSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfcHV0Y2h1bmtfaWpuZyAobW5nX2hhbmRsZSBoSGFuZGxlKQoreworICBtbmdfZGF0YXAgICAgICAgIHBEYXRhOworICBtbmdfY2h1bmtwICAgICAgIHBDaHVuazsKKyAgbW5nX3JldGNvZGUgICAgICBpUmV0Y29kZTsKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisgIG1uZ19jaHVua19oZWFkZXIgc0NodW5raGVhZGVyID0KKyNpZmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICAgICAgICAgIHtNTkdfVUlOVF9JSk5HLCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9nZW5lcmFsLCBtbmdfcmVhZF9pam5nLCBtbmdfd3JpdGVfaWpuZywgbW5nX2Fzc2lnbl9nZW5lcmFsLCAwLCAwLCBzaXplb2YobW5nX2lqbmcpfTsKKyNlbHNlCisgICAgICAgICAge01OR19VSU5UX0lKTkcsIG1uZ19pbml0X2lqbmcsIG1uZ19mcmVlX2lqbmcsIG1uZ19yZWFkX2lqbmcsIG1uZ193cml0ZV9pam5nLCBtbmdfYXNzaWduX2lqbmcsIDAsIDB9OworI2VuZGlmCisjZWxzZQorICBtbmdfY2h1bmtfaGVhZGVyIHNDaHVua2hlYWRlcjsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1BVVENIVU5LX0lKTkcsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhID0gKG1uZ19kYXRhcCloSGFuZGxlOyAgICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworCisgIGlmICghcERhdGEtPmJDcmVhdGluZykgICAgICAgICAgICAgICAvKiBhcmVuJ3Qgd2UgY3JlYXRpbmcgYSBuZXcgZmlsZSA/ICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0ZVTkNUSU9OSU5WQUxJRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG11c3QgaGF2ZSBoYWQgYSBNSERSIGZpcnN0ISAqLworICBpZiAocERhdGEtPmlGaXJzdGNodW5rYWRkZWQgIT0gTU5HX1VJTlRfTUhEUikKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfTk9IRUFERVIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcmV2ZW50IG1pc3BsYWNlZCBURVJNICEgKi8KKyAgaWYgKCFjaGVja190ZXJtIChwRGF0YSwgTU5HX1VJTlRfSUpORykpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1RFUk1TRVFFUlJPUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSB0aGUgY2h1bmsgKi8KKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisjaWZkZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9nZW5lcmFsIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZWxzZQorICBpUmV0Y29kZSA9IG1uZ19pbml0X2lqbmcgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbmRpZgorI2Vsc2UKKyAgbW5nX2dldF9jaHVua2hlYWRlcihNTkdfVUlOVF9JSk5HLCAmc0NodW5raGVhZGVyKTsKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9nZW5lcmFsIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZW5kaWYKKworICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICByZXR1cm4gaVJldGNvZGU7CisKKyAgbW5nX2FkZF9jaHVuayAocERhdGEsIHBDaHVuayk7ICAgICAgIC8qIGFkZCBpdCB0byB0aGUgbGlzdCAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1BVVENIVU5LX0lKTkcsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfcHV0Y2h1bmtfZHJvcCAobW5nX2hhbmRsZSAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgIGlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfY2h1bmtpZHAgcENodW5rbmFtZXMpCit7CisgIG1uZ19kYXRhcCAgICAgICAgcERhdGE7CisgIG1uZ19jaHVua3AgICAgICAgcENodW5rOworICBtbmdfcmV0Y29kZSAgICAgIGlSZXRjb2RlOworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyAgbW5nX2NodW5rX2hlYWRlciBzQ2h1bmtoZWFkZXIgPQorI2lmZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisgICAgICAgICAge01OR19VSU5UX0RST1AsIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX2Ryb3AsIG1uZ19yZWFkX2Ryb3AsIG1uZ193cml0ZV9kcm9wLCBtbmdfYXNzaWduX2Ryb3AsIDAsIDAsIHNpemVvZihtbmdfZHJvcCl9OworI2Vsc2UKKyAgICAgICAgICB7TU5HX1VJTlRfRFJPUCwgbW5nX2luaXRfZHJvcCwgbW5nX2ZyZWVfZHJvcCwgbW5nX3JlYWRfZHJvcCwgbW5nX3dyaXRlX2Ryb3AsIG1uZ19hc3NpZ25fZHJvcCwgMCwgMH07CisjZW5kaWYKKyNlbHNlCisgIG1uZ19jaHVua19oZWFkZXIgc0NodW5raGVhZGVyOworI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fUFVUQ0hVTktfRFJPUCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkgICAgICAgICAgICAvKiBjaGVjayB2YWxpZGl0eSBoYW5kbGUgKi8KKyAgcERhdGEgPSAobW5nX2RhdGFwKWhIYW5kbGU7ICAgICAgICAgIC8qIGFuZCBtYWtlIGl0IGFkZHJlc3NhYmxlICovCisKKyAgaWYgKCFwRGF0YS0+YkNyZWF0aW5nKSAgICAgICAgICAgICAgIC8qIGFyZW4ndCB3ZSBjcmVhdGluZyBhIG5ldyBmaWxlID8gKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfRlVOQ1RJT05JTlZBTElEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbXVzdCBoYXZlIGhhZCBhIE1IRFIgZmlyc3QhICovCisgIGlmIChwRGF0YS0+aUZpcnN0Y2h1bmthZGRlZCAhPSBNTkdfVUlOVF9NSERSKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19OT0hFQURFUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByZXZlbnQgbWlzcGxhY2VkIFRFUk0gISAqLworICBpZiAoIWNoZWNrX3Rlcm0gKHBEYXRhLCBNTkdfVUlOVF9EUk9QKSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfVEVSTVNFUUVSUk9SKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIHRoZSBjaHVuayAqLworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyNpZmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICBpUmV0Y29kZSA9IG1uZ19pbml0X2dlbmVyYWwgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbHNlCisgIGlSZXRjb2RlID0gbW5nX2luaXRfZHJvcCAocERhdGEsICZzQ2h1bmtoZWFkZXIsICZwQ2h1bmspOworI2VuZGlmCisjZWxzZQorICBtbmdfZ2V0X2NodW5raGVhZGVyKE1OR19VSU5UX0RST1AsICZzQ2h1bmtoZWFkZXIpOworICBpUmV0Y29kZSA9IG1uZ19pbml0X2dlbmVyYWwgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbmRpZgorCisgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbGwgdGhlIGNodW5rICovCisgICgobW5nX2Ryb3BwKXBDaHVuayktPmlDb3VudCA9IGlDb3VudDsKKworICBpZiAoaUNvdW50KQorICB7CisgICAgbW5nX3VpbnQzMiBpU2l6ZSA9IGlDb3VudCAqIHNpemVvZiAobW5nX2NodW5raWQpOworCisgICAgTU5HX0FMTE9DIChwRGF0YSwgKChtbmdfZHJvcHApcENodW5rKS0+cENodW5rbmFtZXMsIGlTaXplKTsKKyAgICBNTkdfQ09QWSAoKChtbmdfZHJvcHApcENodW5rKS0+cENodW5rbmFtZXMsIHBDaHVua25hbWVzLCBpU2l6ZSk7CisgIH0KKworICBtbmdfYWRkX2NodW5rIChwRGF0YSwgcENodW5rKTsgICAgICAgLyogYWRkIGl0IHRvIHRoZSBsaXN0ICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fUFVUQ0hVTktfRFJPUCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfREJZSworbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3B1dGNodW5rX2RieWsgKG1uZ19oYW5kbGUgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2NodW5raWQgaUNodW5rbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICBpUG9sYXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgaUtleXdvcmRzc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcGNoYXIgICB6S2V5d29yZHMpCit7CisgIG1uZ19kYXRhcCAgICAgICAgcERhdGE7CisgIG1uZ19jaHVua3AgICAgICAgcENodW5rOworICBtbmdfcmV0Y29kZSAgICAgIGlSZXRjb2RlOworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyAgbW5nX2NodW5rX2hlYWRlciBzQ2h1bmtoZWFkZXIgPQorI2lmZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisgICAgICAgICAge01OR19VSU5UX0RCWUssIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX2RieWssIG1uZ19yZWFkX2RieWssIG1uZ193cml0ZV9kYnlrLCBtbmdfYXNzaWduX2RieWssIDAsIDAsIHNpemVvZihtbmdfZGJ5ayl9OworI2Vsc2UKKyAgICAgICAgICB7TU5HX1VJTlRfREJZSywgbW5nX2luaXRfZGJ5aywgbW5nX2ZyZWVfZGJ5aywgbW5nX3JlYWRfZGJ5aywgbW5nX3dyaXRlX2RieWssIG1uZ19hc3NpZ25fZGJ5aywgMCwgMH07CisjZW5kaWYKKyNlbHNlCisgIG1uZ19jaHVua19oZWFkZXIgc0NodW5raGVhZGVyOworI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fUFVUQ0hVTktfREJZSywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkgICAgICAgICAgICAvKiBjaGVjayB2YWxpZGl0eSBoYW5kbGUgKi8KKyAgcERhdGEgPSAobW5nX2RhdGFwKWhIYW5kbGU7ICAgICAgICAgIC8qIGFuZCBtYWtlIGl0IGFkZHJlc3NhYmxlICovCisKKyAgaWYgKCFwRGF0YS0+YkNyZWF0aW5nKSAgICAgICAgICAgICAgIC8qIGFyZW4ndCB3ZSBjcmVhdGluZyBhIG5ldyBmaWxlID8gKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfRlVOQ1RJT05JTlZBTElEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbXVzdCBoYXZlIGhhZCBhIE1IRFIgZmlyc3QhICovCisgIGlmIChwRGF0YS0+aUZpcnN0Y2h1bmthZGRlZCAhPSBNTkdfVUlOVF9NSERSKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19OT0hFQURFUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByZXZlbnQgbWlzcGxhY2VkIFRFUk0gISAqLworICBpZiAoIWNoZWNrX3Rlcm0gKHBEYXRhLCBNTkdfVUlOVF9EQllLKSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfVEVSTVNFUUVSUk9SKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIHRoZSBjaHVuayAqLworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyNpZmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICBpUmV0Y29kZSA9IG1uZ19pbml0X2dlbmVyYWwgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbHNlCisgIGlSZXRjb2RlID0gbW5nX2luaXRfZGJ5ayAocERhdGEsICZzQ2h1bmtoZWFkZXIsICZwQ2h1bmspOworI2VuZGlmCisjZWxzZQorICBtbmdfZ2V0X2NodW5raGVhZGVyKE1OR19VSU5UX0RCWUssICZzQ2h1bmtoZWFkZXIpOworICBpUmV0Y29kZSA9IG1uZ19pbml0X2dlbmVyYWwgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbmRpZgorCisgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbGwgdGhlIGNodW5rICovCisgICgobW5nX2RieWtwKXBDaHVuayktPmlDaHVua25hbWUgICAgPSBpQ2h1bmtuYW1lOworICAoKG1uZ19kYnlrcClwQ2h1bmspLT5pUG9sYXJpdHkgICAgID0gaVBvbGFyaXR5OworICAoKG1uZ19kYnlrcClwQ2h1bmspLT5pS2V5d29yZHNzaXplID0gaUtleXdvcmRzc2l6ZTsKKworICBpZiAoaUtleXdvcmRzc2l6ZSkKKyAgeworICAgIE1OR19BTExPQyAocERhdGEsICgobW5nX2RieWtwKXBDaHVuayktPnpLZXl3b3JkcywgaUtleXdvcmRzc2l6ZSArIDEpOworICAgIE1OR19DT1BZICgoKG1uZ19kYnlrcClwQ2h1bmspLT56S2V5d29yZHMsIHpLZXl3b3JkcywgaUtleXdvcmRzc2l6ZSk7CisgIH0KKworICBtbmdfYWRkX2NodW5rIChwRGF0YSwgcENodW5rKTsgICAgICAgLyogYWRkIGl0IHRvIHRoZSBsaXN0ICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fUFVUQ0hVTktfREJZSywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19PUkRSCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfcHV0Y2h1bmtfb3JkciAobW5nX2hhbmRsZSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaUNvdW50KQoreworICBtbmdfZGF0YXAgICAgICAgIHBEYXRhOworICBtbmdfY2h1bmtwICAgICAgIHBDaHVuazsKKyAgbW5nX3JldGNvZGUgICAgICBpUmV0Y29kZTsKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisgIG1uZ19jaHVua19oZWFkZXIgc0NodW5raGVhZGVyID0KKyNpZmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICAgICAgICAgIHtNTkdfVUlOVF9PUkRSLCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9vcmRyLCBtbmdfcmVhZF9vcmRyLCBtbmdfd3JpdGVfb3JkciwgbW5nX2Fzc2lnbl9vcmRyLCAwLCAwLCBzaXplb2YobW5nX29yZHIpfTsKKyNlbHNlCisgICAgICAgICAge01OR19VSU5UX09SRFIsIG1uZ19pbml0X29yZHIsIG1uZ19mcmVlX29yZHIsIG1uZ19yZWFkX29yZHIsIG1uZ193cml0ZV9vcmRyLCBtbmdfYXNzaWduX29yZHIsIDAsIDB9OworI2VuZGlmCisjZWxzZQorICBtbmdfY2h1bmtfaGVhZGVyIHNDaHVua2hlYWRlcjsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1BVVENIVU5LX09SRFIsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhID0gKG1uZ19kYXRhcCloSGFuZGxlOyAgICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworCisgIGlmICghcERhdGEtPmJDcmVhdGluZykgICAgICAgICAgICAgICAvKiBhcmVuJ3Qgd2UgY3JlYXRpbmcgYSBuZXcgZmlsZSA/ICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0ZVTkNUSU9OSU5WQUxJRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG11c3QgaGF2ZSBoYWQgYSBNSERSIGZpcnN0ISAqLworICBpZiAocERhdGEtPmlGaXJzdGNodW5rYWRkZWQgIT0gTU5HX1VJTlRfTUhEUikKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfTk9IRUFERVIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcmV2ZW50IG1pc3BsYWNlZCBURVJNICEgKi8KKyAgaWYgKCFjaGVja190ZXJtIChwRGF0YSwgTU5HX1VJTlRfT1JEUikpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1RFUk1TRVFFUlJPUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSB0aGUgY2h1bmsgKi8KKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisjaWZkZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9nZW5lcmFsIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZWxzZQorICBpUmV0Y29kZSA9IG1uZ19pbml0X29yZHIgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbmRpZgorI2Vsc2UKKyAgbW5nX2dldF9jaHVua2hlYWRlcihNTkdfVUlOVF9PUkRSLCAmc0NodW5raGVhZGVyKTsKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9nZW5lcmFsIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZW5kaWYKKworICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaWxsIHRoZSBjaHVuayAqLworICAoKG1uZ19vcmRycClwQ2h1bmspLT5pQ291bnQgPSBpQ291bnQ7CisKKyAgaWYgKGlDb3VudCkKKyAgICBNTkdfQUxMT0MgKHBEYXRhLCAoKG1uZ19vcmRycClwQ2h1bmspLT5wRW50cmllcywgaUNvdW50ICogc2l6ZW9mIChtbmdfb3Jkcl9lbnRyeSkpOworCisgIG1uZ19hZGRfY2h1bmsgKHBEYXRhLCBwQ2h1bmspOyAgICAgICAvKiBhZGQgaXQgdG8gdGhlIGxpc3QgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9QVVRDSFVOS19PUkRSLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworI2lmbmRlZiBNTkdfU0tJUENIVU5LX09SRFIKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19wdXRjaHVua19vcmRyX2VudHJ5IChtbmdfaGFuZGxlICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgIGlFbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfY2h1bmtpZCBpQ2h1bmtuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgIGlPcmRlcnR5cGUpCit7CisgIG1uZ19kYXRhcCAgICAgICBwRGF0YTsKKyAgbW5nX2NodW5rcCAgICAgIHBDaHVuazsKKyAgbW5nX29yZHJfZW50cnlwIHBFbnRyeTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9QVVRDSFVOS19PUkRSX0VOVFJZLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFIChoSGFuZGxlKSAgICAgICAgICAgIC8qIGNoZWNrIHZhbGlkaXR5IGhhbmRsZSAqLworICBwRGF0YSA9IChtbmdfZGF0YXApaEhhbmRsZTsgICAgICAgICAgLyogYW5kIG1ha2UgaXQgYWRkcmVzc2FibGUgKi8KKworICBpZiAoIXBEYXRhLT5iQ3JlYXRpbmcpICAgICAgICAgICAgICAgLyogYXJlbid0IHdlIGNyZWF0aW5nIGEgbmV3IGZpbGUgPyAqLworICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19GVU5DVElPTklOVkFMSUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtdXN0IGhhdmUgaGFkIGEgTUhEUiBmaXJzdCEgKi8KKyAgaWYgKHBEYXRhLT5pRmlyc3RjaHVua2FkZGVkICE9IE1OR19VSU5UX01IRFIpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX05PSEVBREVSKQorCisgIHBDaHVuayA9IHBEYXRhLT5wTGFzdGNodW5rOyAgICAgICAgICAvKiBsYXN0IG9uZSBtdXN0IGhhdmUgYmVlbiBPUkRSICEgKi8KKworICBpZiAoKChtbmdfY2h1bmtfaGVhZGVycClwQ2h1bmspLT5pQ2h1bmtuYW1lICE9IE1OR19VSU5UX09SRFIpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX05PQ09SUkNIVU5LKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5kZXggb3V0IG9mIGJvdW5kcyA/ICovCisgIGlmIChpRW50cnkgPj0gKChtbmdfb3JkcnApcENodW5rKS0+aUNvdW50KQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElERU5UUllJWCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHJlc3MgcHJvcGVyIGVudHJ5ICovCisgIHBFbnRyeSA9ICgobW5nX29yZHJwKXBDaHVuayktPnBFbnRyaWVzICsgaUVudHJ5OworCisgIHBFbnRyeS0+aUNodW5rbmFtZSA9IGlDaHVua25hbWU7ICAgICAvKiBmaWxsIHRoZSBlbnRyeSAqLworICBwRW50cnktPmlPcmRlcnR5cGUgPSBpT3JkZXJ0eXBlOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1BVVENIVU5LX09SRFJfRU5UUlksIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX01BR04KK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19wdXRjaHVua19tYWduIChtbmdfaGFuZGxlIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpRmlyc3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlMYXN0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTWV0aG9kWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNZXRob2RZKQoreworICBtbmdfZGF0YXAgICAgICAgIHBEYXRhOworICBtbmdfY2h1bmtwICAgICAgIHBDaHVuazsKKyAgbW5nX3JldGNvZGUgICAgICBpUmV0Y29kZTsKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisgIG1uZ19jaHVua19oZWFkZXIgc0NodW5raGVhZGVyID0KKyNpZmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICAgICAgICAgIHtNTkdfVUlOVF9NQUdOLCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9nZW5lcmFsLCBtbmdfcmVhZF9tYWduLCBtbmdfd3JpdGVfbWFnbiwgbW5nX2Fzc2lnbl9nZW5lcmFsLCAwLCAwLCBzaXplb2YobW5nX21hZ24pfTsKKyNlbHNlCisgICAgICAgICAge01OR19VSU5UX01BR04sIG1uZ19pbml0X21hZ24sIG1uZ19mcmVlX21hZ24sIG1uZ19yZWFkX21hZ24sIG1uZ193cml0ZV9tYWduLCBtbmdfYXNzaWduX21hZ24sIDAsIDB9OworI2VuZGlmCisjZWxzZQorICBtbmdfY2h1bmtfaGVhZGVyIHNDaHVua2hlYWRlcjsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1BVVENIVU5LX01BR04sIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhID0gKG1uZ19kYXRhcCloSGFuZGxlOyAgICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworCisgIGlmICghcERhdGEtPmJDcmVhdGluZykgICAgICAgICAgICAgICAvKiBhcmVuJ3Qgd2UgY3JlYXRpbmcgYSBuZXcgZmlsZSA/ICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0ZVTkNUSU9OSU5WQUxJRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG11c3QgaGF2ZSBoYWQgYSBNSERSIGZpcnN0ISAqLworICBpZiAocERhdGEtPmlGaXJzdGNodW5rYWRkZWQgIT0gTU5HX1VJTlRfTUhEUikKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfTk9IRUFERVIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcmV2ZW50IG1pc3BsYWNlZCBURVJNICEgKi8KKyAgaWYgKCFjaGVja190ZXJtIChwRGF0YSwgTU5HX1VJTlRfTUFHTikpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1RFUk1TRVFFUlJPUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSB0aGUgY2h1bmsgKi8KKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisjaWZkZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9nZW5lcmFsIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZWxzZQorICBpUmV0Y29kZSA9IG1uZ19pbml0X21hZ24gKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbmRpZgorI2Vsc2UKKyAgbW5nX2dldF9jaHVua2hlYWRlcihNTkdfVUlOVF9NQUdOLCAmc0NodW5raGVhZGVyKTsKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9nZW5lcmFsIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZW5kaWYKKworICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaWxsIHRoZSBjaHVuayAqLworICAoKG1uZ19tYWducClwQ2h1bmspLT5pRmlyc3RpZCA9IGlGaXJzdGlkOworICAoKG1uZ19tYWducClwQ2h1bmspLT5pTGFzdGlkICA9IGlMYXN0aWQ7CisgICgobW5nX21hZ25wKXBDaHVuayktPmlNZXRob2RYID0gKG1uZ191aW50OClpTWV0aG9kWDsKKyAgKChtbmdfbWFnbnApcENodW5rKS0+aU1YICAgICAgPSBpTVg7CisgICgobW5nX21hZ25wKXBDaHVuayktPmlNWSAgICAgID0gaU1ZOworICAoKG1uZ19tYWducClwQ2h1bmspLT5pTUwgICAgICA9IGlNTDsKKyAgKChtbmdfbWFnbnApcENodW5rKS0+aU1SICAgICAgPSBpTVI7CisgICgobW5nX21hZ25wKXBDaHVuayktPmlNVCAgICAgID0gaU1UOworICAoKG1uZ19tYWducClwQ2h1bmspLT5pTUIgICAgICA9IGlNQjsKKyAgKChtbmdfbWFnbnApcENodW5rKS0+aU1ldGhvZFkgPSAobW5nX3VpbnQ4KWlNZXRob2RZOworCisgIG1uZ19hZGRfY2h1bmsgKHBEYXRhLCBwQ2h1bmspOyAgICAgICAvKiBhZGQgaXQgdG8gdGhlIGxpc3QgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9QVVRDSFVOS19NQUdOLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX0lOQ0xVREVfTVBOR19QUk9QT1NBTAorTU5HX0VYVCBtbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfcHV0Y2h1bmtfbXBuZyAobW5nX2hhbmRsZSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpRnJhbWV3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaUZyYW1laGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTnVtcGxheXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlUaWNrc3BlcnNlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaUNvbXByZXNzaW9ubWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpQ291bnQpCit7CisgIG1uZ19kYXRhcCAgICAgICAgcERhdGE7CisgIG1uZ19jaHVua3AgICAgICAgcENodW5rOworICBtbmdfcmV0Y29kZSAgICAgIGlSZXRjb2RlOworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyAgbW5nX2NodW5rX2hlYWRlciBzQ2h1bmtoZWFkZXIgPQorI2lmZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisgICAgICAgICAge01OR19VSU5UX21wTkcsIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX21wbmcsIG1uZ19yZWFkX21wbmcsIG1uZ193cml0ZV9tcG5nLCBtbmdfYXNzaWduX21wbmcsIDAsIDAsIHNpemVvZihtbmdfbXBuZyl9OworI2Vsc2UKKyAgICAgICAgICB7TU5HX1VJTlRfbXBORywgbW5nX2luaXRfbXBuZywgbW5nX2ZyZWVfbXBuZywgbW5nX3JlYWRfbXBuZywgbW5nX3dyaXRlX21wbmcsIG1uZ19hc3NpZ25fbXBuZywgMCwgMH07CisjZW5kaWYKKyNlbHNlCisgIG1uZ19jaHVua19oZWFkZXIgc0NodW5raGVhZGVyOworI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fUFVUQ0hVTktfTVBORywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkgICAgICAgICAgICAvKiBjaGVjayB2YWxpZGl0eSBoYW5kbGUgKi8KKyAgcERhdGEgPSAobW5nX2RhdGFwKWhIYW5kbGU7ICAgICAgICAgIC8qIGFuZCBtYWtlIGl0IGFkZHJlc3NhYmxlICovCisKKyAgaWYgKCFwRGF0YS0+YkNyZWF0aW5nKSAgICAgICAgICAgICAgIC8qIGFyZW4ndCB3ZSBjcmVhdGluZyBhIG5ldyBmaWxlID8gKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfRlVOQ1RJT05JTlZBTElEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbXVzdCBoYXZlIGhhZCBhIElIRFIgZmlyc3QhICovCisgIGlmIChwRGF0YS0+aUZpcnN0Y2h1bmthZGRlZCAhPSBNTkdfVUlOVF9JSERSKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19OT0hFQURFUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSB0aGUgY2h1bmsgKi8KKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisjaWZkZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9nZW5lcmFsIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZWxzZQorICBpUmV0Y29kZSA9IG1uZ19pbml0X21wbmcgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbmRpZgorI2Vsc2UKKyAgbW5nX2dldF9jaHVua2hlYWRlcihNTkdfVUlOVF9tcE5HLCAmc0NodW5raGVhZGVyKTsKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9nZW5lcmFsIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZW5kaWYKKworICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaWxsIHRoZSBjaHVuayAqLworICAoKG1uZ19tcG5ncClwQ2h1bmspLT5pRnJhbWV3aWR0aCAgICAgICAgPSBpRnJhbWV3aWR0aDsKKyAgKChtbmdfbXBuZ3ApcENodW5rKS0+aUZyYW1laGVpZ2h0ICAgICAgID0gaUZyYW1laGVpZ2h0OworICAoKG1uZ19tcG5ncClwQ2h1bmspLT5pTnVtcGxheXMgICAgICAgICAgPSBpTnVtcGxheXM7CisgICgobW5nX21wbmdwKXBDaHVuayktPmlUaWNrc3BlcnNlYyAgICAgICA9IGlUaWNrc3BlcnNlYzsKKyAgKChtbmdfbXBuZ3ApcENodW5rKS0+aUNvbXByZXNzaW9ubWV0aG9kID0gaUNvbXByZXNzaW9ubWV0aG9kOworICAoKG1uZ19tcG5ncClwQ2h1bmspLT5pRnJhbWVzc2l6ZSAgICAgICAgPSBpQ291bnQgKiBzaXplb2YgKG1uZ19tcG5nX2ZyYW1lKTsKKworICBpZiAoaUNvdW50KQorICAgIE1OR19BTExPQyAocERhdGEsICgobW5nX21wbmdwKXBDaHVuayktPnBGcmFtZXMsICgobW5nX21wbmdwKXBDaHVuayktPmlGcmFtZXNzaXplKTsKKworICBtbmdfYWRkX2NodW5rIChwRGF0YSwgcENodW5rKTsgICAgICAgLyogYWRkIGl0IHRvIHRoZSBsaXN0ICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fUFVUQ0hVTktfTVBORywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19JTkNMVURFX01QTkdfUFJPUE9TQUwKK01OR19FWFQgbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3B1dGNodW5rX21wbmdfZnJhbWUgKG1uZ19oYW5kbGUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaUVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaVksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaVhvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlZb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpVGlja3MpCit7CisgIG1uZ19kYXRhcCAgICAgICBwRGF0YTsKKyAgbW5nX2NodW5rcCAgICAgIHBDaHVuazsKKyAgbW5nX21wbmdfZnJhbWVwIHBGcmFtZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9QVVRDSFVOS19NUE5HX0ZSQU1FLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFIChoSGFuZGxlKSAgICAgICAgICAgIC8qIGNoZWNrIHZhbGlkaXR5IGhhbmRsZSAqLworICBwRGF0YSA9IChtbmdfZGF0YXApaEhhbmRsZTsgICAgICAgICAgLyogYW5kIG1ha2UgaXQgYWRkcmVzc2FibGUgKi8KKworICBpZiAoIXBEYXRhLT5iQ3JlYXRpbmcpICAgICAgICAgICAgICAgLyogYXJlbid0IHdlIGNyZWF0aW5nIGEgbmV3IGZpbGUgPyAqLworICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19GVU5DVElPTklOVkFMSUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtdXN0IGhhdmUgaGFkIGEgSUhEUiBmaXJzdCEgKi8KKyAgaWYgKHBEYXRhLT5pRmlyc3RjaHVua2FkZGVkICE9IE1OR19VSU5UX0lIRFIpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX05PSEVBREVSKQorCisgIHBDaHVuayA9IHBEYXRhLT5wTGFzdGNodW5rOyAgICAgICAgICAvKiBsYXN0IG9uZSBtdXN0IGhhdmUgYmVlbiBtcE5HICEgKi8KKworICBpZiAoKChtbmdfY2h1bmtfaGVhZGVycClwQ2h1bmspLT5pQ2h1bmtuYW1lICE9IE1OR19VSU5UX21wTkcpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX05PQ09SUkNIVU5LKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5kZXggb3V0IG9mIGJvdW5kcyA/ICovCisgIGlmIChpRW50cnkgPj0gKCgobW5nX21wbmdwKXBDaHVuayktPmlGcmFtZXNzaXplIC8gc2l6ZW9mIChtbmdfbXBuZ19mcmFtZSkpKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElERU5UUllJWCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHJlc3MgcHJvcGVyIGVudHJ5ICovCisgIHBGcmFtZSA9ICgobW5nX21wbmdwKXBDaHVuayktPnBGcmFtZXMgKyBpRW50cnk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaWxsIGVudHJ5ICovCisgIHBGcmFtZS0+aVggICAgICAgID0gaVg7CisgIHBGcmFtZS0+aVkgICAgICAgID0gaVk7CisgIHBGcmFtZS0+aVdpZHRoICAgID0gaVdpZHRoOworICBwRnJhbWUtPmlIZWlnaHQgICA9IGlIZWlnaHQ7CisgIHBGcmFtZS0+aVhvZmZzZXQgID0gaVhvZmZzZXQ7CisgIHBGcmFtZS0+aVlvZmZzZXQgID0gaVlvZmZzZXQ7CisgIHBGcmFtZS0+aVRpY2tzICAgID0gaVRpY2tzOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1BVVENIVU5LX01QTkdfRlJBTUUsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19ldk5UCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfcHV0Y2h1bmtfZXZudCAobW5nX2hhbmRsZSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaUNvdW50KQoreworICBtbmdfZGF0YXAgICAgICAgIHBEYXRhOworICBtbmdfY2h1bmtwICAgICAgIHBDaHVuazsKKyAgbW5nX3JldGNvZGUgICAgICBpUmV0Y29kZTsKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisgIG1uZ19jaHVua19oZWFkZXIgc0NodW5raGVhZGVyID0KKyNpZmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRQorICAgICAgICAgIHtNTkdfVUlOVF9ldk5ULCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9ldm50LCBtbmdfcmVhZF9ldm50LCBtbmdfd3JpdGVfZXZudCwgbW5nX2Fzc2lnbl9ldm50LCAwLCAwLCBzaXplb2YobW5nX2V2bnQpfTsKKyNlbHNlCisgICAgICAgICAge01OR19VSU5UX2V2TlQsIG1uZ19pbml0X2V2bnQsIG1uZ19mcmVlX2V2bnQsIG1uZ19yZWFkX2V2bnQsIG1uZ193cml0ZV9ldm50LCBtbmdfYXNzaWduX2V2bnQsIDAsIDB9OworI2VuZGlmCisjZWxzZQorICBtbmdfY2h1bmtfaGVhZGVyIHNDaHVua2hlYWRlcjsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1BVVENIVU5LX0VWTlQsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhID0gKG1uZ19kYXRhcCloSGFuZGxlOyAgICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworCisgIGlmICghcERhdGEtPmJDcmVhdGluZykgICAgICAgICAgICAgICAvKiBhcmVuJ3Qgd2UgY3JlYXRpbmcgYSBuZXcgZmlsZSA/ICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0ZVTkNUSU9OSU5WQUxJRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG11c3QgaGF2ZSBoYWQgYSBNSERSIGZpcnN0ISAqLworICBpZiAocERhdGEtPmlGaXJzdGNodW5rYWRkZWQgIT0gTU5HX1VJTlRfTUhEUikKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfTk9IRUFERVIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcmV2ZW50IG1pc3BsYWNlZCBURVJNICEgKi8KKyAgaWYgKCFjaGVja190ZXJtIChwRGF0YSwgTU5HX1VJTlRfZXZOVCkpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1RFUk1TRVFFUlJPUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSB0aGUgY2h1bmsgKi8KKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisjaWZkZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9nZW5lcmFsIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZWxzZQorICBpUmV0Y29kZSA9IG1uZ19pbml0X2V2bnQgKHBEYXRhLCAmc0NodW5raGVhZGVyLCAmcENodW5rKTsKKyNlbmRpZgorI2Vsc2UKKyAgbW5nX2dldF9jaHVua2hlYWRlcihNTkdfVUlOVF9ldk5ULCAmc0NodW5raGVhZGVyKTsKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9nZW5lcmFsIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZW5kaWYKKworICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaWxsIHRoZSBjaHVuayAqLworICAoKG1uZ19ldm50cClwQ2h1bmspLT5pQ291bnQgPSBpQ291bnQ7CisKKyAgaWYgKGlDb3VudCkKKyAgICBNTkdfQUxMT0MgKHBEYXRhLCAoKG1uZ19ldm50cClwQ2h1bmspLT5wRW50cmllcywgaUNvdW50ICogc2l6ZW9mIChtbmdfZXZudF9lbnRyeSkpOworCisgIG1uZ19hZGRfY2h1bmsgKHBEYXRhLCBwQ2h1bmspOyAgICAgICAvKiBhZGQgaXQgdG8gdGhlIGxpc3QgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9QVVRDSFVOS19FVk5ULCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3B1dGNodW5rX2V2bnRfZW50cnkgKG1uZ19oYW5kbGUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlFbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggIGlFdmVudHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICBpTWFza3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpTGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlSaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlUb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpQm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU9iamVjdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaVNlZ21lbnRuYW1lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcGNoYXIgIHpTZWdtZW50bmFtZSkKK3sKKyAgbW5nX2RhdGFwICAgICAgIHBEYXRhOworICBtbmdfY2h1bmtwICAgICAgcENodW5rOworICBtbmdfZXZudF9lbnRyeXAgcEVudHJ5OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1BVVENIVU5LX0VWTlRfRU5UUlksIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhID0gKG1uZ19kYXRhcCloSGFuZGxlOyAgICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworCisgIGlmICghcERhdGEtPmJDcmVhdGluZykgICAgICAgICAgICAgICAvKiBhcmVuJ3Qgd2UgY3JlYXRpbmcgYSBuZXcgZmlsZSA/ICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0ZVTkNUSU9OSU5WQUxJRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG11c3QgaGF2ZSBoYWQgYSBNSERSIGZpcnN0ISAqLworICBpZiAocERhdGEtPmlGaXJzdGNodW5rYWRkZWQgIT0gTU5HX1VJTlRfTUhEUikKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfTk9IRUFERVIpCisKKyAgcENodW5rID0gcERhdGEtPnBMYXN0Y2h1bms7ICAgICAgICAgIC8qIGxhc3Qgb25lIG11c3QgaGF2ZSBiZWVuIGV2TlQgISAqLworCisgIGlmICgoKG1uZ19jaHVua19oZWFkZXJwKXBDaHVuayktPmlDaHVua25hbWUgIT0gTU5HX1VJTlRfZXZOVCkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfTk9DT1JSQ0hVTkspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbmRleCBvdXQgb2YgYm91bmRzID8gKi8KKyAgaWYgKGlFbnRyeSA+PSAoKG1uZ19ldm50cClwQ2h1bmspLT5pQ291bnQpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURFTlRSWUlYKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkcmVzcyBwcm9wZXIgZW50cnkgKi8KKyAgcEVudHJ5ID0gKChtbmdfZXZudHApcENodW5rKS0+cEVudHJpZXMgKyBpRW50cnk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaWxsIGVudHJ5ICovCisgIHBFbnRyeS0+aUV2ZW50dHlwZSAgICAgICA9IGlFdmVudHR5cGU7CisgIHBFbnRyeS0+aU1hc2t0eXBlICAgICAgICA9IGlNYXNrdHlwZTsKKyAgcEVudHJ5LT5pTGVmdCAgICAgICAgICAgID0gaUxlZnQ7CisgIHBFbnRyeS0+aVJpZ2h0ICAgICAgICAgICA9IGlSaWdodDsKKyAgcEVudHJ5LT5pVG9wICAgICAgICAgICAgID0gaVRvcDsKKyAgcEVudHJ5LT5pQm90dG9tICAgICAgICAgID0gaUJvdHRvbTsKKyAgcEVudHJ5LT5pT2JqZWN0aWQgICAgICAgID0gaU9iamVjdGlkOworICBwRW50cnktPmlJbmRleCAgICAgICAgICAgPSBpSW5kZXg7CisgIHBFbnRyeS0+aVNlZ21lbnRuYW1lc2l6ZSA9IGlTZWdtZW50bmFtZXNpemU7CisKKyAgaWYgKGlTZWdtZW50bmFtZXNpemUpCisgIHsKKyAgICBNTkdfQUxMT0MgKHBEYXRhLCBwRW50cnktPnpTZWdtZW50bmFtZSwgaVNlZ21lbnRuYW1lc2l6ZSArIDEpOworICAgIE1OR19DT1BZIChwRW50cnktPnpTZWdtZW50bmFtZSwgelNlZ21lbnRuYW1lLCBpU2VnbWVudG5hbWVzaXplKTsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1BVVENIVU5LX0VWTlRfRU5UUlksIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19wdXRjaHVua191bmtub3duIChtbmdfaGFuZGxlICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19jaHVua2lkIGlDaHVua25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgaVJhd2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcHRyICAgICBwUmF3ZGF0YSkKK3sKKyAgbW5nX2RhdGFwICAgICAgICBwRGF0YTsKKyAgbW5nX2NodW5rcCAgICAgICBwQ2h1bms7CisgIG1uZ19yZXRjb2RlICAgICAgaVJldGNvZGU7CisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorICBtbmdfY2h1bmtfaGVhZGVyIHNDaHVua2hlYWRlciA9CisjaWZkZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyAgICAgICAgICB7TU5HX1VJTlRfSFVILCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV91bmtub3duLCBtbmdfcmVhZF91bmtub3duLCBtbmdfd3JpdGVfdW5rbm93biwgbW5nX2Fzc2lnbl91bmtub3duLCAwLCAwLCBzaXplb2YobW5nX3Vua25vd25fY2h1bmspfTsKKyNlbHNlCisgICAgICAgICAge01OR19VSU5UX0hVSCwgbW5nX2luaXRfdW5rbm93biwgbW5nX2ZyZWVfdW5rbm93biwgbW5nX3JlYWRfdW5rbm93biwgbW5nX3dyaXRlX3Vua25vd24sIG1uZ19hc3NpZ25fdW5rbm93biwgMCwgMH07CisjZW5kaWYKKyNlbHNlCisgIG1uZ19jaHVua19oZWFkZXIgc0NodW5raGVhZGVyOworI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fUFVUQ0hVTktfVU5LTk9XTiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkgICAgICAgICAgICAvKiBjaGVjayB2YWxpZGl0eSBoYW5kbGUgKi8KKyAgcERhdGEgPSAobW5nX2RhdGFwKWhIYW5kbGU7ICAgICAgICAgIC8qIGFuZCBtYWtlIGl0IGFkZHJlc3NhYmxlICovCisKKyAgaWYgKCFwRGF0YS0+YkNyZWF0aW5nKSAgICAgICAgICAgICAgIC8qIGFyZW4ndCB3ZSBjcmVhdGluZyBhIG5ldyBmaWxlID8gKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfRlVOQ1RJT05JTlZBTElEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbXVzdCBoYXZlIGhhZCBhIGhlYWRlciBmaXJzdCEgKi8KKyAgaWYgKHBEYXRhLT5pRmlyc3RjaHVua2FkZGVkID09IDApCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX05PSEVBREVSKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJldmVudCBtaXNwbGFjZWQgVEVSTSAhICovCisgIGlmICghY2hlY2tfdGVybSAocERhdGEsIGlDaHVua25hbWUpKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19URVJNU0VRRVJST1IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgdGhlIGNodW5rICovCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorI2lmZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisgIGlSZXRjb2RlID0gbW5nX2luaXRfZ2VuZXJhbCAocERhdGEsICZzQ2h1bmtoZWFkZXIsICZwQ2h1bmspOworI2Vsc2UKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF91bmtub3duIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZW5kaWYKKyNlbHNlCisgIG1uZ19nZXRfY2h1bmtoZWFkZXIoTU5HX1VJTlRfSFVILCAmc0NodW5raGVhZGVyKTsKKyAgaVJldGNvZGUgPSBtbmdfaW5pdF9nZW5lcmFsIChwRGF0YSwgJnNDaHVua2hlYWRlciwgJnBDaHVuayk7CisjZW5kaWYKKworICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaWxsIHRoZSBjaHVuayAqLworICAoKG1uZ191bmtub3duX2NodW5rcClwQ2h1bmspLT5zSGVhZGVyLmlDaHVua25hbWUgPSBpQ2h1bmtuYW1lOworICAoKG1uZ191bmtub3duX2NodW5rcClwQ2h1bmspLT5pRGF0YXNpemUgICAgICAgICAgPSBpUmF3bGVuOworCisgIGlmIChpUmF3bGVuKQorICB7CisgICAgTU5HX0FMTE9DIChwRGF0YSwgKChtbmdfdW5rbm93bl9jaHVua3ApcENodW5rKS0+cERhdGEsIGlSYXdsZW4pOworICAgIE1OR19DT1BZICgoKG1uZ191bmtub3duX2NodW5rcClwQ2h1bmspLT5wRGF0YSwgcFJhd2RhdGEsIGlSYXdsZW4pOworICB9CisKKyAgbW5nX2FkZF9jaHVuayAocERhdGEsIHBDaHVuayk7ICAgICAgIC8qIGFkZCBpdCB0byB0aGUgbGlzdCAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1BVVENIVU5LX1VOS05PV04sIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjZW5kaWYgLyogTU5HX0lOQ0xVREVfV1JJVEVfUFJPQ1MgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19nZXRpbWdkYXRhX3NlcSAobW5nX2hhbmRsZSAgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaVNlcW5yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpQ2FudmFzc3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19nZXRjYW52YXNsaW5lIGZHZXRjYW52YXNsaW5lKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRJTUdEQVRBX1NFUSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRJTUdEQVRBX1NFUSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX0ZOTk9USU1QTEVNRU5URUQ7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19nZXRpbWdkYXRhX2NodW5rc2VxIChtbmdfaGFuZGxlICAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlTZXFuciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpQ2FudmFzc3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2dldGNhbnZhc2xpbmUgZkdldGNhbnZhc2xpbmUpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVElNR0RBVEFfQ0hVTktTRVEsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUSU1HREFUQV9DSFVOS1NFUSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX0ZOTk9USU1QTEVNRU5URUQ7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19nZXRpbWdkYXRhX2NodW5rIChtbmdfaGFuZGxlICAgICAgICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19oYW5kbGUgICAgICAgIGhDaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpQ2FudmFzc3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2dldGNhbnZhc2xpbmUgZkdldGNhbnZhc2xpbmUpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVElNR0RBVEFfQ0hVTkssIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUSU1HREFUQV9DSFVOSywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX0ZOTk9USU1QTEVNRU5URUQ7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX0lOQ0xVREVfV1JJVEVfUFJPQ1MKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3B1dGltZ2RhdGFfaWhkciAobW5nX2hhbmRsZSAgICAgICAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpQ29sb3J0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaUJpdGRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaUNvbXByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaUZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlJbnRlcmxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpQ2FudmFzc3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfZ2V0Y2FudmFzbGluZSBmR2V0Y2FudmFzbGluZSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fUFVUSU1HREFUQV9JSERSLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1BVVElNR0RBVEFfSUhEUiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX0ZOTk9USU1QTEVNRU5URUQ7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19wdXRpbWdkYXRhX2poZHIgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaUNvbG9ydHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlCaXRkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlDb21wcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlJbnRlcmxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpQWxwaGFCaXRkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlBbHBoYUNvbXByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaUFscGhhRmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaUFscGhhSW50ZXJsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaUNhbnZhc3N0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2dldGNhbnZhc2xpbmUgZkdldGNhbnZhc2xpbmUpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1BVVElNR0RBVEFfSkhEUiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9QVVRJTUdEQVRBX0pIRFIsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19GTk5PVElNUExFTUVOVEVEOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ191cGRhdGVtbmdoZWFkZXIgKG1uZ19oYW5kbGUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaUZyYW1lY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlMYXllcmNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpUGxheXRpbWUpCit7CisgIG1uZ19kYXRhcCAgcERhdGE7CisgIG1uZ19jaHVua3AgcENodW5rOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1VQREFURU1OR0hFQURFUiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkgICAgICAgICAgICAvKiBjaGVjayB2YWxpZGl0eSBoYW5kbGUgKi8KKyAgcERhdGEgPSAobW5nX2RhdGFwKWhIYW5kbGU7ICAgICAgICAgIC8qIGFuZCBtYWtlIGl0IGFkZHJlc3NhYmxlICovCisKKyAgaWYgKCFwRGF0YS0+YkNyZWF0aW5nKSAgICAgICAgICAgICAgIC8qIGFyZW4ndCB3ZSBjcmVhdGluZyBhIG5ldyBmaWxlID8gKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfRlVOQ1RJT05JTlZBTElEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbXVzdCBiZSBhIE1ORyBhbmltYXRpb24hICovCisgIGlmICgocERhdGEtPmVJbWFnZXR5cGUgIT0gbW5nX2l0X21uZykgfHwgKHBEYXRhLT5pRmlyc3RjaHVua2FkZGVkICE9IE1OR19VSU5UX01IRFIpKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19OT01IRFIpCisKKyAgcENodW5rID0gcERhdGEtPnBGaXJzdGNodW5rOyAgICAgICAgIC8qIGdldCB0aGUgZmlyc3QgY2h1bmsgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCB1cGRhdGUgdGhlIHZhcmlhYmxlcyAqLworICAoKG1uZ19taGRycClwQ2h1bmspLT5pRnJhbWVjb3VudCA9IGlGcmFtZWNvdW50OworICAoKG1uZ19taGRycClwQ2h1bmspLT5pTGF5ZXJjb3VudCA9IGlMYXllcmNvdW50OworICAoKG1uZ19taGRycClwQ2h1bmspLT5pUGxheXRpbWUgICA9IGlQbGF5dGltZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9VUERBVEVNTkdIRUFERVIsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfdXBkYXRlbW5nc2ltcGxpY2l0eSAobW5nX2hhbmRsZSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaVNpbXBsaWNpdHkpCit7CisgIG1uZ19kYXRhcCAgcERhdGE7CisgIG1uZ19jaHVua3AgcENodW5rOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1VQREFURU1OR1NJTVBMSUNJVFksIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhID0gKG1uZ19kYXRhcCloSGFuZGxlOyAgICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworCisgIGlmICghcERhdGEtPmJDcmVhdGluZykgICAgICAgICAgICAgICAvKiBhcmVuJ3Qgd2UgY3JlYXRpbmcgYSBuZXcgZmlsZSA/ICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0ZVTkNUSU9OSU5WQUxJRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG11c3QgYmUgYSBNTkcgYW5pbWF0aW9uISAqLworICBpZiAoKHBEYXRhLT5lSW1hZ2V0eXBlICE9IG1uZ19pdF9tbmcpIHx8IChwRGF0YS0+aUZpcnN0Y2h1bmthZGRlZCAhPSBNTkdfVUlOVF9NSERSKSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfTk9NSERSKQorCisgIHBDaHVuayA9IHBEYXRhLT5wRmlyc3RjaHVuazsgICAgICAgICAvKiBnZXQgdGhlIGZpcnN0IGNodW5rICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgdXBkYXRlIHRoZSB2YXJpYWJsZSAqLworICAoKG1uZ19taGRycClwQ2h1bmspLT5pU2ltcGxpY2l0eSA9IGlTaW1wbGljaXR5OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1VQREFURU1OR1NJTVBMSUNJVFksIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjZW5kaWYgLyogTU5HX0lOQ0xVREVfV1JJVEVfUFJPQ1MgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2VuZGlmIC8qIE1OR19BQ0NFU1NfQ0hVTktTICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqIGVuZCBvZiBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworCisKZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9MaWJNTkcvbGlibW5nX2NodW5rcy5oIGIvZmlsZXMvU291cmNlL0xpYk1ORy9saWJtbmdfY2h1bmtzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEwYmYyZAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9MaWJNTkcvbGlibW5nX2NodW5rcy5oCkBAIC0wLDAgKzEsMTAyNiBAQAorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIGxpYm1uZy5oICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIHByb2plY3QgICA6IGxpYm1uZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBmaWxlICAgICAgOiBsaWJtbmdfY2h1bmtzLmggICAgICAgICAgIGNvcHlyaWdodCAoYykgMjAwMC0yMDA3IEcuSnV5biAgICogKi8KKy8qICogdmVyc2lvbiAgIDogMS4wLjEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBwdXJwb3NlICAgOiBDaHVuayBzdHJ1Y3R1cmVzIChkZWZpbml0aW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGF1dGhvciAgICA6IEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogY29tbWVudCAgIDogRGVmaW5pdGlvbiBvZiBrbm93biBjaHVuayBzdHJ1Y3R1cmVzICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBjaGFuZ2VzICAgOiAwLjUuMSAtIDA1LzA0LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBwdXQgaW4gc29tZSBleHRyYSBjb21tZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4xIC0gMDUvMDYvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIGxheW91dCBmb3Igc0JJVCwgUFBMVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjEgLSAwNS8wOC8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2hhbmdlZCB3cml0ZSBjYWxsYmFjayBkZWZpbml0aW9uICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNoYW5nZWQgc3RyaWN0LUFOU0kgc3R1ZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjEgLSAwNS8xMS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgbGF5b3V0IGZvciBQUExUIGFnYWluIChtaXNzZWQgZGVsdGF0eXBlID8hPykgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjIgLSAwNS8zMS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gcmVtb3ZlZCB1c2VsZXNzIGRlZmluaXRpb24gKGNvbnRyaWJ1dGVkIGJ5IFRpbSBSb3dsZXkpICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMiAtIDA2LzAzLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaXhlZCBtYWtldXAgZm9yIExpbnV4IGdjYyBjb21waWxlICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMiAtIDA4LzA1LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjaGFuZ2VkIGZpbGUtcHJlZml4ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMyAtIDA4LzI2LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBNQUdOIGNodW5rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4zIC0gMDkvMTAvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIERFRkkgYmVoYXZpb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjMgLSAxMC8xNi8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgSkRBQSBjaHVuayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAwOC8xOS8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgSExBUEkgZnVuY3Rpb24gdG8gY29weSBjaHVua3MgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDA5LzE0LzIwMDIgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBldmVudCBoYW5kbGluZyBmb3IgZHluYW1pYyBNTkcgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC41IC0gMTEvMjgvMjAwMiAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIGRlZmluaXRpb24gb2YgaU1ldGhvZFgvWSBmb3IgTUFHTiBjaHVuayAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC42IC0gMDUvMjUvMjAwMyAtIEcuUi1QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgIGFkZGVkIE1OR19TS0lQQ0hVTktfY0hOSyBmb290cHJpbnQgb3B0aW1pemF0aW9ucyAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjYgLSAwNy8yOS8yMDAzIC0gRy5SLVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgY29uZGl0aW9uYWxzIGFyb3VuZCBQQVNUIGNodW5rIHN1cHBvcnQgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjcgLSAwMy8yNC8yMDA0IC0gRy5SLVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgY29uZGl0aW9uYWwgYXJvdW5kIE1OR19OT19ERUxUQV9QTkcgc3VwcG9ydCAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjkgLSAxMi8wNS8yMDA0IC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgY29uZGl0aW9uYWwgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuOSAtIDEyLzA2LzIwMDQgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBjb25kaXRpb25hbCBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuMTAgLSAwNC8wOC8yMDA3IC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBzdXBwb3J0IGZvciBtUE5HIHByb3Bvc2FsICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC4xMCAtIDA0LzEyLzIwMDcgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHN1cHBvcnQgZm9yIEFORyBwcm9wb3NhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pICYmIGRlZmluZWQoTU5HX1NUUklDVF9BTlNJKQorI3ByYWdtYSBvcHRpb24gLUEgICAgICAgICAgICAgICAgICAgICAgLyogZm9yY2UgQU5TSS1DICovCisjZW5kaWYKKworI2lmbmRlZiBfbGlibW5nX2NodW5rc19oXworI2RlZmluZSBfbGlibW5nX2NodW5rc19oXworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX1NXQVBfRU5ESUFOCisjZGVmaW5lIFBOR19TSUcgMHg0NzRlNTA4OUwKKyNkZWZpbmUgSk5HX1NJRyAweDQ3NGU0YThiTAorI2RlZmluZSBNTkdfU0lHIDB4NDc0ZTRkOGFMCisjZGVmaW5lIFBPU1RfU0lHIDB4MGExYTBhMGRMCisjZWxzZQorI2RlZmluZSBQTkdfU0lHIDB4ODk1MDRlNDdMCisjZGVmaW5lIEpOR19TSUcgMHg4YjRhNGU0N0wKKyNkZWZpbmUgTU5HX1NJRyAweDhhNGQ0ZTQ3TAorI2RlZmluZSBQT1NUX1NJRyAweDBkMGExYTBhTAorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKwordHlwZWRlZiBtbmdfcmV0Y29kZSAoKm1uZ19mX3NwZWNpYWxmdW5jKSAgKG1uZ19kYXRhcCAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19jaHVua3AgIHBDaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyKiBwaVJhd2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwKiBwcFJhd2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAordHlwZWRlZiBtbmdfcmV0Y29kZSAoKm1uZ19jX3NwZWNpYWxmdW5jKSAgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2NodW5rcCBwQ2h1bmspOworCisjZGVmaW5lIE1OR19GSUVMRF9PUFRJT05BTCAgICAweDAwMDEKKyNkZWZpbmUgTU5HX0ZJRUxEX1RFUk1JTkFUT1IgIDB4MDAwMgorI2RlZmluZSBNTkdfRklFTERfUkVQRVRJVElWRSAgMHgwMDA0CisjZGVmaW5lIE1OR19GSUVMRF9ERUZMQVRFRCAgICAweDAwMDgKKyNkZWZpbmUgTU5HX0ZJRUxEX0lGSU1HVFlQRVMgIDB4MDFGMCAgIC8qIGltYWdlLXR5cGUgbWFzayAqLworI2RlZmluZSBNTkdfRklFTERfSUZJTUdUWVBFMCAgMHgwMDEwCisjZGVmaW5lIE1OR19GSUVMRF9JRklNR1RZUEUyICAweDAwMjAKKyNkZWZpbmUgTU5HX0ZJRUxEX0lGSU1HVFlQRTMgIDB4MDA0MAorI2RlZmluZSBNTkdfRklFTERfSUZJTUdUWVBFNCAgMHgwMDgwCisjZGVmaW5lIE1OR19GSUVMRF9JRklNR1RZUEU2ICAweDAxMDAKKyNkZWZpbmUgTU5HX0ZJRUxEX1BVVElNR1RZUEUgIDB4MDIwMAorI2RlZmluZSBNTkdfRklFTERfTk9ISUdIQklUICAgMHgwNDAwCisjZGVmaW5lIE1OR19GSUVMRF9HUk9VUE1BU0sgICAweDcwMDAKKyNkZWZpbmUgTU5HX0ZJRUxEX0dST1VQMSAgICAgIDB4MTAwMAorI2RlZmluZSBNTkdfRklFTERfR1JPVVAyICAgICAgMHgyMDAwCisjZGVmaW5lIE1OR19GSUVMRF9HUk9VUDMgICAgICAweDMwMDAKKyNkZWZpbmUgTU5HX0ZJRUxEX0dST1VQNCAgICAgIDB4NDAwMAorI2RlZmluZSBNTkdfRklFTERfR1JPVVA1ICAgICAgMHg1MDAwCisjZGVmaW5lIE1OR19GSUVMRF9HUk9VUDYgICAgICAweDYwMDAKKyNkZWZpbmUgTU5HX0ZJRUxEX0dST1VQNyAgICAgIDB4NzAwMAorI2RlZmluZSBNTkdfRklFTERfSU5UICAgICAgICAgMHg4MDAwCisKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgICAgICAgICAgICAgICAgIC8qIGNodW5rLWZpZWxkIGRlc2NyaXB0b3IgKi8KKyAgICAgICAgICAgbW5nX2Zfc3BlY2lhbGZ1bmMgcFNwZWNpYWxmdW5jOworICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICBpRmxhZ3M7CisgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgIGlNaW52YWx1ZTsKKyAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAgaU1heHZhbHVlOworICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICBpTGVuZ3RobWluOworICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICBpTGVuZ3RobWF4OworICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICBpT2Zmc2V0Y2h1bms7CisgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgIGlPZmZzZXRjaHVua2luZDsKKyAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAgaU9mZnNldGNodW5rbGVuOworICAgICAgICB9IG1uZ19maWVsZF9kZXNjcmlwdG9yOwordHlwZWRlZiBtbmdfZmllbGRfZGVzY3JpcHRvciAqIG1uZ19maWVsZF9kZXNjcDsKKworI2RlZmluZSBNTkdfREVTQ1JfR0xPQkFMICAgICAgMHgwMDAxCisjZGVmaW5lIE1OR19ERVNDUl9FTVBUWSAgICAgICAweDAwMDIKKyNkZWZpbmUgTU5HX0RFU0NSX0VNUFRZRU1CRUQgIDB4MDAwNgorI2RlZmluZSBNTkdfREVTQ1JfRU1QVFlHTE9CQUwgMHgwMDBBCisKKyNkZWZpbmUgTU5HX0RFU0NSX0dlbkhEUiAgICAgIDB4MDAwMSAgIC8qIElIRFIvSkhEUi9CQVNJL0RIRFIgKi8KKyNkZWZpbmUgTU5HX0RFU0NSX0puZ0hEUiAgICAgIDB4MDAwMiAgIC8qIEpIRFIvREhEUiAqLworI2RlZmluZSBNTkdfREVTQ1JfTUhEUiAgICAgICAgMHgwMDA0CisjZGVmaW5lIE1OR19ERVNDUl9JSERSICAgICAgICAweDAwMDgKKyNkZWZpbmUgTU5HX0RFU0NSX0pIRFIgICAgICAgIDB4MDAxMAorI2RlZmluZSBNTkdfREVTQ1JfREhEUiAgICAgICAgMHgwMDIwCisjZGVmaW5lIE1OR19ERVNDUl9MT09QICAgICAgICAweDAwNDAKKyNkZWZpbmUgTU5HX0RFU0NSX1BMVEUgICAgICAgIDB4MDA4MAorI2RlZmluZSBNTkdfREVTQ1JfU0FWRSAgICAgICAgMHgwMTAwCisKKyNkZWZpbmUgTU5HX0RFU0NSX05PSUhEUiAgICAgIDB4MDAwMQorI2RlZmluZSBNTkdfREVTQ1JfTk9KSERSICAgICAgMHgwMDAyCisjZGVmaW5lIE1OR19ERVNDUl9OT0JBU0kgICAgICAweDAwMDQKKyNkZWZpbmUgTU5HX0RFU0NSX05PREhEUiAgICAgIDB4MDAwOAorI2RlZmluZSBNTkdfREVTQ1JfTk9JREFUICAgICAgMHgwMDEwCisjZGVmaW5lIE1OR19ERVNDUl9OT0pEQVQgICAgICAweDAwMjAKKyNkZWZpbmUgTU5HX0RFU0NSX05PSkRBQSAgICAgIDB4MDA0MAorI2RlZmluZSBNTkdfREVTQ1JfTk9QTFRFICAgICAgMHgwMDgwCisjZGVmaW5lIE1OR19ERVNDUl9OT0pTRVAgICAgICAweDAxMDAKKyNkZWZpbmUgTU5HX0RFU0NSX05PTUhEUiAgICAgIDB4MDIwMAorI2RlZmluZSBNTkdfREVTQ1JfTk9URVJNICAgICAgMHgwNDAwCisjZGVmaW5lIE1OR19ERVNDUl9OT0xPT1AgICAgICAweDA4MDAKKyNkZWZpbmUgTU5HX0RFU0NSX05PU0FWRSAgICAgIDB4MTAwMAorCit0eXBlZGVmIHN0cnVjdCB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBjaHVuayBkZXNjcmlwdG9yICovCisgICAgICAgICAgIG1uZ19pbWd0eXBlICAgICAgIGVJbWd0eXBlOworICAgICAgICAgICBtbmdfY3JlYXRlb2JqdHlwZSBlQ3JlYXRlb2JqZWN0OworICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICBpT2Jqc2l6ZTsKKyAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAgaU9mZnNldGVtcHR5OworICAgICAgICAgICBtbmdfcHRyICAgICAgICAgICBwT2JqY2xlYW51cDsKKyAgICAgICAgICAgbW5nX3B0ciAgICAgICAgICAgcE9ianByb2Nlc3M7CisgICAgICAgICAgIG1uZ19jX3NwZWNpYWxmdW5jIHBTcGVjaWFsZnVuYzsKKyAgICAgICAgICAgbW5nX2ZpZWxkX2Rlc2NwICAgcEZpZWxkZGVzYzsKKyAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAgaUZpZWxkZGVzYzsKKyAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAgaUFsbG93ZWQ7CisgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgIGlNdXN0aGF2ZXM7CisgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgIGlNdXN0Tk9UaGF2ZXM7CisgICAgICAgIH0gbW5nX2NodW5rX2Rlc2NyaXB0b3I7Cit0eXBlZGVmIG1uZ19jaHVua19kZXNjcmlwdG9yICogbW5nX2NodW5rX2Rlc2NwOworCisjZW5kaWYgLyogTU5HX09QVElNSVpFX0NIVU5LUkVBREVSICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3R5cGVkZWYgbW5nX3JldGNvZGUgKCptbmdfY3JlYXRlY2h1bmspICAobW5nX2RhdGFwICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19jaHVua3AgIHBIZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19jaHVua3AqIHBwQ2h1bmspOworCit0eXBlZGVmIG1uZ19yZXRjb2RlICgqbW5nX2NsZWFudXBjaHVuaykgKG1uZ19kYXRhcCAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfY2h1bmtwICBwSGVhZGVyKTsKKwordHlwZWRlZiBtbmdfcmV0Y29kZSAoKm1uZ19yZWFkY2h1bmspICAgIChtbmdfZGF0YXAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2NodW5rcCAgcEhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgaVJhd2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCAgcFJhd2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19jaHVua3AqIHBDaHVuayk7CisKK3R5cGVkZWYgbW5nX3JldGNvZGUgKCptbmdfd3JpdGVjaHVuaykgICAobW5nX2RhdGFwICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19jaHVua3AgIHBDaHVuayk7CisKK3R5cGVkZWYgbW5nX3JldGNvZGUgKCptbmdfYXNzaWduY2h1bmspICAobW5nX2RhdGFwICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19jaHVua3AgIHBDaHVua3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfY2h1bmtwICBwQ2h1bmtmcm9tKTsKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKwordHlwZWRlZiBzdHJ1Y3QgeyAgICAgICAgICAgICAgICAgICAgICAgLyogZ2VuZXJpYyBoZWFkZXIgKi8KKyAgICAgICAgICAgbW5nX2NodW5raWQgICAgICAgaUNodW5rbmFtZTsKKyAgICAgICAgICAgbW5nX2NyZWF0ZWNodW5rICAgZkNyZWF0ZTsKKyAgICAgICAgICAgbW5nX2NsZWFudXBjaHVuayAgZkNsZWFudXA7CisgICAgICAgICAgIG1uZ19yZWFkY2h1bmsgICAgIGZSZWFkOworICAgICAgICAgICBtbmdfd3JpdGVjaHVuayAgICBmV3JpdGU7CisgICAgICAgICAgIG1uZ19hc3NpZ25jaHVuayAgIGZBc3NpZ247CisgICAgICAgICAgIG1uZ19jaHVua3AgICAgICAgIHBOZXh0OyAgICAvKiBmb3IgZG91YmxlLWxpbmtlZCBsaXN0ICovCisgICAgICAgICAgIG1uZ19jaHVua3AgICAgICAgIHBQcmV2OworI2lmZGVmIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisgICAgICAgICAgIG1uZ19zaXplX3QgICAgICAgIGlDaHVua3NpemU7CisjZW5kaWYKKyNpZmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyAgICAgICAgICAgbW5nX2NodW5rX2Rlc2NwICAgcENodW5rZGVzY3I7CisjZW5kaWYKKyAgICAgICAgfSBtbmdfY2h1bmtfaGVhZGVyOwordHlwZWRlZiBtbmdfY2h1bmtfaGVhZGVyICogbW5nX2NodW5rX2hlYWRlcnA7CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgICAgICAgICAgICAgICAgIC8qIElIRFIgKi8KKyAgICAgICAgICAgbW5nX2NodW5rX2hlYWRlciAgc0hlYWRlcjsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaVdpZHRoOworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpSGVpZ2h0OworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpQml0ZGVwdGg7CisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlDb2xvcnR5cGU7CisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlDb21wcmVzc2lvbjsKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaUZpbHRlcjsKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaUludGVybGFjZTsKKyAgICAgICAgfSBtbmdfaWhkcjsKK3R5cGVkZWYgbW5nX2loZHIgKiBtbmdfaWhkcnA7CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgICAgICAgICAgICAgICAgIC8qIFBMVEUgKi8KKyAgICAgICAgICAgbW5nX2NodW5rX2hlYWRlciAgc0hlYWRlcjsKKyAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICAgYkVtcHR5OworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpRW50cnljb3VudDsKKyAgICAgICAgICAgbW5nX3JnYnBhbHRhYiAgICAgYUVudHJpZXM7CisgICAgICAgIH0gbW5nX3BsdGU7Cit0eXBlZGVmIG1uZ19wbHRlICogbW5nX3BsdGVwOworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCit0eXBlZGVmIHN0cnVjdCB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBJREFUICovCisgICAgICAgICAgIG1uZ19jaHVua19oZWFkZXIgIHNIZWFkZXI7CisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJFbXB0eTsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaURhdGFzaXplOworICAgICAgICAgICBtbmdfcHRyICAgICAgICAgICBwRGF0YTsKKyAgICAgICAgfSBtbmdfaWRhdDsKK3R5cGVkZWYgbW5nX2lkYXQgKiBtbmdfaWRhdHA7CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgICAgICAgICAgICAgICAgIC8qIElFTkQgKi8KKyAgICAgICAgICAgbW5nX2NodW5rX2hlYWRlciAgc0hlYWRlcjsKKyAgICAgICAgfSBtbmdfaWVuZDsKK3R5cGVkZWYgbW5nX2llbmQgKiBtbmdfaWVuZHA7CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgICAgICAgICAgICAgICAgIC8qIHRSTlMgKi8KKyAgICAgICAgICAgbW5nX2NodW5rX2hlYWRlciAgc0hlYWRlcjsKKyAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICAgYkVtcHR5OworICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICBiR2xvYmFsOworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpVHlwZTsgICAgLyogY29sb3J0eXBlICgwLDIsMykgKi8KKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaUNvdW50OworICAgICAgICAgICBtbmdfdWludDhhcnIgICAgICBhRW50cmllczsKKyAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAgaUdyYXk7CisgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgIGlSZWQ7CisgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgIGlHcmVlbjsKKyAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAgaUJsdWU7CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlSYXdsZW47CisgICAgICAgICAgIG1uZ191aW50OGFyciAgICAgIGFSYXdkYXRhOworICAgICAgICB9IG1uZ190cm5zOwordHlwZWRlZiBtbmdfdHJucyAqIG1uZ190cm5zcDsKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKwordHlwZWRlZiBzdHJ1Y3QgeyAgICAgICAgICAgICAgICAgICAgICAgLyogZ0FNQSAqLworICAgICAgICAgICBtbmdfY2h1bmtfaGVhZGVyICBzSGVhZGVyOworICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICBiRW1wdHk7CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlHYW1tYTsKKyAgICAgICAgfSBtbmdfZ2FtYTsKK3R5cGVkZWYgbW5nX2dhbWEgKiBtbmdfZ2FtYXA7CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19jSFJNCit0eXBlZGVmIHN0cnVjdCB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBjSFJNICovCisgICAgICAgICAgIG1uZ19jaHVua19oZWFkZXIgIHNIZWFkZXI7CisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJFbXB0eTsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaVdoaXRlcG9pbnR4OworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpV2hpdGVwb2ludHk7CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlSZWR4OworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpUmVkeTsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaUdyZWVueDsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaUdyZWVueTsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaUJsdWV4OworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpQmx1ZXk7CisgICAgICAgIH0gbW5nX2Nocm07Cit0eXBlZGVmIG1uZ19jaHJtICogbW5nX2Nocm1wOworI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgICAgICAgICAgICAgICAgIC8qIHNSR0IgKi8KKyAgICAgICAgICAgbW5nX2NodW5rX2hlYWRlciAgc0hlYWRlcjsKKyAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICAgYkVtcHR5OworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpUmVuZGVyaW5naW50ZW50OworICAgICAgICB9IG1uZ19zcmdiOwordHlwZWRlZiBtbmdfc3JnYiAqIG1uZ19zcmdicDsKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX2lDQ1AKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgICAgICAgICAgICAgICAgIC8qIGlDQ1AgKi8KKyAgICAgICAgICAgbW5nX2NodW5rX2hlYWRlciAgc0hlYWRlcjsKKyAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICAgYkVtcHR5OworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpTmFtZXNpemU7CisgICAgICAgICAgIG1uZ19wY2hhciAgICAgICAgIHpOYW1lOworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpQ29tcHJlc3Npb247CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlQcm9maWxlc2l6ZTsKKyAgICAgICAgICAgbW5nX3B0ciAgICAgICAgICAgcFByb2ZpbGU7CisgICAgICAgIH0gbW5nX2ljY3A7Cit0eXBlZGVmIG1uZ19pY2NwICogbW5nX2ljY3BwOworI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS190RVh0Cit0eXBlZGVmIHN0cnVjdCB7ICAgICAgICAgICAgICAgICAgICAgICAvKiB0RVh0ICovCisgICAgICAgICAgIG1uZ19jaHVua19oZWFkZXIgIHNIZWFkZXI7CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlLZXl3b3Jkc2l6ZTsKKyAgICAgICAgICAgbW5nX3BjaGFyICAgICAgICAgektleXdvcmQ7CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlUZXh0c2l6ZTsKKyAgICAgICAgICAgbW5nX3BjaGFyICAgICAgICAgelRleHQ7CisgICAgICAgIH0gbW5nX3RleHQ7Cit0eXBlZGVmIG1uZ190ZXh0ICogbW5nX3RleHRwOworI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS196VFh0Cit0eXBlZGVmIHN0cnVjdCB7ICAgICAgICAgICAgICAgICAgICAgICAvKiB6VFh0ICovCisgICAgICAgICAgIG1uZ19jaHVua19oZWFkZXIgIHNIZWFkZXI7CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlLZXl3b3Jkc2l6ZTsKKyAgICAgICAgICAgbW5nX3BjaGFyICAgICAgICAgektleXdvcmQ7CisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlDb21wcmVzc2lvbjsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaVRleHRzaXplOworICAgICAgICAgICBtbmdfcGNoYXIgICAgICAgICB6VGV4dDsKKyAgICAgICAgfSBtbmdfenR4dDsKK3R5cGVkZWYgbW5nX3p0eHQgKiBtbmdfenR4dHA7CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX2lUWHQKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgICAgICAgICAgICAgICAgIC8qIGlUWHQgKi8KKyAgICAgICAgICAgbW5nX2NodW5rX2hlYWRlciAgc0hlYWRlcjsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaUtleXdvcmRzaXplOworICAgICAgICAgICBtbmdfcGNoYXIgICAgICAgICB6S2V5d29yZDsKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaUNvbXByZXNzaW9uZmxhZzsKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaUNvbXByZXNzaW9ubWV0aG9kOworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpTGFuZ3VhZ2VzaXplOworICAgICAgICAgICBtbmdfcGNoYXIgICAgICAgICB6TGFuZ3VhZ2U7CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlUcmFuc2xhdGlvbnNpemU7CisgICAgICAgICAgIG1uZ19wY2hhciAgICAgICAgIHpUcmFuc2xhdGlvbjsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaVRleHRzaXplOworICAgICAgICAgICBtbmdfcGNoYXIgICAgICAgICB6VGV4dDsKKyAgICAgICAgfSBtbmdfaXR4dDsKK3R5cGVkZWYgbW5nX2l0eHQgKiBtbmdfaXR4dHA7CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX2JLR0QKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgICAgICAgICAgICAgICAgIC8qIGJLR0QgKi8KKyAgICAgICAgICAgbW5nX2NodW5rX2hlYWRlciAgc0hlYWRlcjsKKyAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICAgYkVtcHR5OworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpVHlwZTsgICAgLyogMz1pbmRleGVkLCAwPWdyYXksIDI9cmdiICovCisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlJbmRleDsKKyAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAgaUdyYXk7CisgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgIGlSZWQ7CisgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgIGlHcmVlbjsKKyAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAgaUJsdWU7CisgICAgICAgIH0gbW5nX2JrZ2Q7Cit0eXBlZGVmIG1uZ19ia2dkICogbW5nX2JrZ2RwOworI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19wSFlzCit0eXBlZGVmIHN0cnVjdCB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBwSFlzICovCisgICAgICAgICAgIG1uZ19jaHVua19oZWFkZXIgIHNIZWFkZXI7CisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJFbXB0eTsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaVNpemV4OworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpU2l6ZXk7CisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlVbml0OworICAgICAgICB9IG1uZ19waHlzOwordHlwZWRlZiBtbmdfcGh5cyAqIG1uZ19waHlzcDsKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2lmbmRlZiBNTkdfU0tJUENIVU5LX3NCSVQKKwordHlwZWRlZiBzdHJ1Y3QgeyAgICAgICAgICAgICAgICAgICAgICAgLyogc0JJVCAqLworICAgICAgICAgICBtbmdfY2h1bmtfaGVhZGVyICBzSGVhZGVyOworICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICBiRW1wdHk7CisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlUeXBlOyAgICAvKiBjb2xvcnR5cGUgKDAsMiwzLDQsNiwxMCwxMiwxNCwxNikgKi8KKyAgICAgICAgICAgbW5nX3VpbnQ4YXJyNCAgICAgYUJpdHM7CisgICAgICAgIH0gbW5nX3NiaXQ7Cit0eXBlZGVmIG1uZ19zYml0ICogbW5nX3NiaXRwOworI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19zUExUCit0eXBlZGVmIHN0cnVjdCB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBzUExUICovCisgICAgICAgICAgIG1uZ19jaHVua19oZWFkZXIgIHNIZWFkZXI7CisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJFbXB0eTsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaU5hbWVzaXplOworICAgICAgICAgICBtbmdfcGNoYXIgICAgICAgICB6TmFtZTsKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaVNhbXBsZWRlcHRoOworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpRW50cnljb3VudDsKKyAgICAgICAgICAgbW5nX3B0ciAgICAgICAgICAgcEVudHJpZXM7CisgICAgICAgIH0gbW5nX3NwbHQ7Cit0eXBlZGVmIG1uZ19zcGx0ICogbW5nX3NwbHRwOworI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19oSVNUCit0eXBlZGVmIHN0cnVjdCB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBoSVNUICovCisgICAgICAgICAgIG1uZ19jaHVua19oZWFkZXIgIHNIZWFkZXI7CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlFbnRyeWNvdW50OworICAgICAgICAgICBtbmdfdWludDE2YXJyICAgICBhRW50cmllczsKKyAgICAgICAgfSBtbmdfaGlzdDsKK3R5cGVkZWYgbW5nX2hpc3QgKiBtbmdfaGlzdHA7CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX3RJTUUKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgICAgICAgICAgICAgICAgIC8qIHRJTUUgKi8KKyAgICAgICAgICAgbW5nX2NodW5rX2hlYWRlciAgc0hlYWRlcjsKKyAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAgaVllYXI7CisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlNb250aDsKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaURheTsKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaUhvdXI7CisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlNaW51dGU7CisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlTZWNvbmQ7CisgICAgICAgIH0gbW5nX3RpbWU7Cit0eXBlZGVmIG1uZ190aW1lICogbW5nX3RpbWVwOworI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgICAgICAgICAgICAgICAgIC8qIE1IRFIgKi8KKyAgICAgICAgICAgbW5nX2NodW5rX2hlYWRlciAgc0hlYWRlcjsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaVdpZHRoOworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpSGVpZ2h0OworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpVGlja3M7CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlMYXllcmNvdW50OworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpRnJhbWVjb3VudDsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaVBsYXl0aW1lOworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpU2ltcGxpY2l0eTsKKyAgICAgICAgfSBtbmdfbWhkcjsKK3R5cGVkZWYgbW5nX21oZHIgKiBtbmdfbWhkcnA7CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgICAgICAgICAgICAgICAgIC8qIE1FTkQgKi8KKyAgICAgICAgICAgbW5nX2NodW5rX2hlYWRlciAgc0hlYWRlcjsKKyAgICAgICAgfSBtbmdfbWVuZDsKK3R5cGVkZWYgbW5nX21lbmQgKiBtbmdfbWVuZHA7CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgICAgICAgICAgICAgICAgIC8qIExPT1AgKi8KKyAgICAgICAgICAgbW5nX2NodW5rX2hlYWRlciAgc0hlYWRlcjsKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaUxldmVsOworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpUmVwZWF0OworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpVGVybWluYXRpb247CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlJdGVybWluOworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpSXRlcm1heDsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaUNvdW50OworICAgICAgICAgICBtbmdfdWludDMycCAgICAgICBwU2lnbmFsczsKKyAgICAgICAgfSBtbmdfbG9vcDsKK3R5cGVkZWYgbW5nX2xvb3AgKiBtbmdfbG9vcHA7CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgICAgICAgICAgICAgICAgIC8qIEVOREwgKi8KKyAgICAgICAgICAgbW5nX2NodW5rX2hlYWRlciAgc0hlYWRlcjsKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaUxldmVsOworICAgICAgICB9IG1uZ19lbmRsOwordHlwZWRlZiBtbmdfZW5kbCAqIG1uZ19lbmRscDsKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKwordHlwZWRlZiBzdHJ1Y3QgeyAgICAgICAgICAgICAgICAgICAgICAgLyogREVGSSAqLworICAgICAgICAgICBtbmdfY2h1bmtfaGVhZGVyICBzSGVhZGVyOworICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICBpT2JqZWN0aWQ7CisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJIYXNkb25vdHNob3c7CisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlEb25vdHNob3c7CisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJIYXNjb25jcmV0ZTsKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaUNvbmNyZXRlOworICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICBiSGFzbG9jYTsKKyAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAgaVhsb2NhdGlvbjsKKyAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAgaVlsb2NhdGlvbjsKKyAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICAgYkhhc2NsaXA7CisgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgIGlMZWZ0Y2I7CisgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgIGlSaWdodGNiOworICAgICAgICAgICBtbmdfaW50MzIgICAgICAgICBpVG9wY2I7CisgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgIGlCb3R0b21jYjsKKyAgICAgICAgfSBtbmdfZGVmaTsKK3R5cGVkZWYgbW5nX2RlZmkgKiBtbmdfZGVmaXA7CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgICAgICAgICAgICAgICAgIC8qIEJBU0kgKi8KKyAgICAgICAgICAgbW5nX2NodW5rX2hlYWRlciAgc0hlYWRlcjsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaVdpZHRoOworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpSGVpZ2h0OworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpQml0ZGVwdGg7CisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlDb2xvcnR5cGU7CisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlDb21wcmVzc2lvbjsKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaUZpbHRlcjsKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaUludGVybGFjZTsKKyAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAgaVJlZDsKKyAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAgaUdyZWVuOworICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICBpQmx1ZTsKKyNpZmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICAgYkhhc2FscGhhOworI2VuZGlmCisgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgIGlBbHBoYTsKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaVZpZXdhYmxlOworICAgICAgICB9IG1uZ19iYXNpOwordHlwZWRlZiBtbmdfYmFzaSAqIG1uZ19iYXNpcDsKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKwordHlwZWRlZiBzdHJ1Y3QgeyAgICAgICAgICAgICAgICAgICAgICAgLyogQ0xPTiAqLworICAgICAgICAgICBtbmdfY2h1bmtfaGVhZGVyICBzSGVhZGVyOworICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICBpU291cmNlaWQ7CisgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgIGlDbG9uZWlkOworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpQ2xvbmV0eXBlOworI2lmZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICBiSGFzZG9ub3RzaG93OworI2VuZGlmCisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlEb25vdHNob3c7CisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlDb25jcmV0ZTsKKyAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICAgYkhhc2xvY2E7CisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlMb2NhdGlvbnR5cGU7CisgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgIGlMb2NhdGlvbng7CisgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgIGlMb2NhdGlvbnk7CisgICAgICAgIH0gbW5nX2Nsb247Cit0eXBlZGVmIG1uZ19jbG9uICogbW5nX2Nsb25wOworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfUEFTVAordHlwZWRlZiBzdHJ1Y3QgeyAgICAgICAgICAgICAgICAgICAgICAgLyogUEFTVCBzb3VyY2UgKi8KKyAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAgaVNvdXJjZWlkOworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpQ29tcG9zaXRpb247CisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlPcmllbnRhdGlvbjsKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaU9mZnNldHR5cGU7CisgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgIGlPZmZzZXR4OworICAgICAgICAgICBtbmdfaW50MzIgICAgICAgICBpT2Zmc2V0eTsKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaUJvdW5kYXJ5dHlwZTsKKyAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAgaUJvdW5kYXJ5bDsKKyAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAgaUJvdW5kYXJ5cjsKKyAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAgaUJvdW5kYXJ5dDsKKyAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAgaUJvdW5kYXJ5YjsKKyAgICAgICAgfSBtbmdfcGFzdF9zb3VyY2U7Cit0eXBlZGVmIG1uZ19wYXN0X3NvdXJjZSAqIG1uZ19wYXN0X3NvdXJjZXA7CisKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgICAgICAgICAgICAgICAgIC8qIFBBU1QgKi8KKyAgICAgICAgICAgbW5nX2NodW5rX2hlYWRlciAgc0hlYWRlcjsKKyAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAgaURlc3RpZDsKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaVRhcmdldHR5cGU7CisgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgIGlUYXJnZXR4OworICAgICAgICAgICBtbmdfaW50MzIgICAgICAgICBpVGFyZ2V0eTsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaUNvdW50OworICAgICAgICAgICBtbmdfcGFzdF9zb3VyY2VwICBwU291cmNlczsKKyAgICAgICAgfSBtbmdfcGFzdDsKK3R5cGVkZWYgbW5nX3Bhc3QgKiBtbmdfcGFzdHA7CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKwordHlwZWRlZiBzdHJ1Y3QgeyAgICAgICAgICAgICAgICAgICAgICAgLyogRElTQyAqLworICAgICAgICAgICBtbmdfY2h1bmtfaGVhZGVyICBzSGVhZGVyOworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpQ291bnQ7CisgICAgICAgICAgIG1uZ191aW50MTZwICAgICAgIHBPYmplY3RpZHM7CisgICAgICAgIH0gbW5nX2Rpc2M7Cit0eXBlZGVmIG1uZ19kaXNjICogbW5nX2Rpc2NwOworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCit0eXBlZGVmIHN0cnVjdCB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBCQUNLICovCisgICAgICAgICAgIG1uZ19jaHVua19oZWFkZXIgIHNIZWFkZXI7CisgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgIGlSZWQ7CisgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgIGlHcmVlbjsKKyAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAgaUJsdWU7CisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlNYW5kYXRvcnk7CisgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgIGlJbWFnZWlkOworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpVGlsZTsKKyAgICAgICAgfSBtbmdfYmFjazsKK3R5cGVkZWYgbW5nX2JhY2sgKiBtbmdfYmFja3A7CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgICAgICAgICAgICAgICAgIC8qIEZSQU0gKi8KKyAgICAgICAgICAgbW5nX2NodW5rX2hlYWRlciAgc0hlYWRlcjsKKyAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICAgYkVtcHR5OworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpTW9kZTsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaU5hbWVzaXplOworICAgICAgICAgICBtbmdfcGNoYXIgICAgICAgICB6TmFtZTsKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaUNoYW5nZWRlbGF5OworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpQ2hhbmdldGltZW91dDsKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaUNoYW5nZWNsaXBwaW5nOworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpQ2hhbmdlc3luY2lkOworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpRGVsYXk7CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlUaW1lb3V0OworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpQm91bmRhcnl0eXBlOworICAgICAgICAgICBtbmdfaW50MzIgICAgICAgICBpQm91bmRhcnlsOworICAgICAgICAgICBtbmdfaW50MzIgICAgICAgICBpQm91bmRhcnlyOworICAgICAgICAgICBtbmdfaW50MzIgICAgICAgICBpQm91bmRhcnl0OworICAgICAgICAgICBtbmdfaW50MzIgICAgICAgICBpQm91bmRhcnliOworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpQ291bnQ7CisgICAgICAgICAgIG1uZ191aW50MzJwICAgICAgIHBTeW5jaWRzOworICAgICAgICB9IG1uZ19mcmFtOwordHlwZWRlZiBtbmdfZnJhbSAqIG1uZ19mcmFtcDsKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKwordHlwZWRlZiBzdHJ1Y3QgeyAgICAgICAgICAgICAgICAgICAgICAgLyogTU9WRSAqLworICAgICAgICAgICBtbmdfY2h1bmtfaGVhZGVyICBzSGVhZGVyOworICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICBpRmlyc3RpZDsKKyAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAgaUxhc3RpZDsKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaU1vdmV0eXBlOworICAgICAgICAgICBtbmdfaW50MzIgICAgICAgICBpTW92ZXg7CisgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgIGlNb3ZleTsKKyAgICAgICAgfSBtbmdfbW92ZTsKK3R5cGVkZWYgbW5nX21vdmUgKiBtbmdfbW92ZXA7CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgICAgICAgICAgICAgICAgIC8qIENMSVAgKi8KKyAgICAgICAgICAgbW5nX2NodW5rX2hlYWRlciAgc0hlYWRlcjsKKyAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAgaUZpcnN0aWQ7CisgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgIGlMYXN0aWQ7CisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlDbGlwdHlwZTsKKyAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAgaUNsaXBsOworICAgICAgICAgICBtbmdfaW50MzIgICAgICAgICBpQ2xpcHI7CisgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgIGlDbGlwdDsKKyAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAgaUNsaXBiOworICAgICAgICB9IG1uZ19jbGlwOwordHlwZWRlZiBtbmdfY2xpcCAqIG1uZ19jbGlwcDsKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKwordHlwZWRlZiBzdHJ1Y3QgeyAgICAgICAgICAgICAgICAgICAgICAgLyogU0hPVyAqLworICAgICAgICAgICBtbmdfY2h1bmtfaGVhZGVyICBzSGVhZGVyOworICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICBiRW1wdHk7CisgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgIGlGaXJzdGlkOworI2lmZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICBiSGFzbGFzdGlkOworI2VuZGlmCisgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgIGlMYXN0aWQ7CisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlNb2RlOworICAgICAgICB9IG1uZ19zaG93OwordHlwZWRlZiBtbmdfc2hvdyAqIG1uZ19zaG93cDsKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKwordHlwZWRlZiBzdHJ1Y3QgeyAgICAgICAgICAgICAgICAgICAgICAgLyogVEVSTSAqLworICAgICAgICAgICBtbmdfY2h1bmtfaGVhZGVyICBzSGVhZGVyOworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpVGVybWFjdGlvbjsKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaUl0ZXJhY3Rpb247CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlEZWxheTsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaUl0ZXJtYXg7CisgICAgICAgIH0gbW5nX3Rlcm07Cit0eXBlZGVmIG1uZ190ZXJtICogbW5nX3Rlcm1wOworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfU0FWRQordHlwZWRlZiBzdHJ1Y3QgeyAgICAgICAgICAgICAgICAgICAgICAgLyogU0FWRSBlbnRyeSAqLworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpRW50cnl0eXBlOworICAgICAgICAgICBtbmdfdWludDMyYXJyMiAgICBpT2Zmc2V0OyAgICAgICAgICAgIC8qIDA9TVNJLCAxPUxTSSAqLworICAgICAgICAgICBtbmdfdWludDMyYXJyMiAgICBpU3RhcnR0aW1lOyAgICAgICAgIC8qIDA9TVNJLCAxPUxTSSAqLworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpTGF5ZXJucjsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaUZyYW1lbnI7CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlOYW1lc2l6ZTsKKyAgICAgICAgICAgbW5nX3BjaGFyICAgICAgICAgek5hbWU7CisgICAgICAgIH0gbW5nX3NhdmVfZW50cnk7Cit0eXBlZGVmIG1uZ19zYXZlX2VudHJ5ICogbW5nX3NhdmVfZW50cnlwOworCit0eXBlZGVmIHN0cnVjdCB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBTQVZFICovCisgICAgICAgICAgIG1uZ19jaHVua19oZWFkZXIgIHNIZWFkZXI7CisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJFbXB0eTsKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaU9mZnNldHR5cGU7CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlDb3VudDsKKyAgICAgICAgICAgbW5nX3NhdmVfZW50cnlwICAgcEVudHJpZXM7CisgICAgICAgIH0gbW5nX3NhdmU7Cit0eXBlZGVmIG1uZ19zYXZlICogbW5nX3NhdmVwOworI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19TRUVLCit0eXBlZGVmIHN0cnVjdCB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBTRUVLICovCisgICAgICAgICAgIG1uZ19jaHVua19oZWFkZXIgIHNIZWFkZXI7CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlOYW1lc2l6ZTsKKyAgICAgICAgICAgbW5nX3BjaGFyICAgICAgICAgek5hbWU7CisgICAgICAgIH0gbW5nX3NlZWs7Cit0eXBlZGVmIG1uZ19zZWVrICogbW5nX3NlZWtwOworI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19lWFBJCit0eXBlZGVmIHN0cnVjdCB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBlWFBJICovCisgICAgICAgICAgIG1uZ19jaHVua19oZWFkZXIgIHNIZWFkZXI7CisgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgIGlTbmFwc2hvdGlkOworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpTmFtZXNpemU7CisgICAgICAgICAgIG1uZ19wY2hhciAgICAgICAgIHpOYW1lOworICAgICAgICB9IG1uZ19leHBpOwordHlwZWRlZiBtbmdfZXhwaSAqIG1uZ19leHBpcDsKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfZlBSSQordHlwZWRlZiBzdHJ1Y3QgeyAgICAgICAgICAgICAgICAgICAgICAgLyogZlBSSSAqLworICAgICAgICAgICBtbmdfY2h1bmtfaGVhZGVyICBzSGVhZGVyOworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpRGVsdGF0eXBlOworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpUHJpb3JpdHk7CisgICAgICAgIH0gbW5nX2Zwcmk7Cit0eXBlZGVmIG1uZ19mcHJpICogbW5nX2ZwcmlwOworI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19uRUVECit0eXBlZGVmIHN0cnVjdCB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBuRUVEICovCisgICAgICAgICAgIG1uZ19jaHVua19oZWFkZXIgIHNIZWFkZXI7CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlLZXl3b3Jkc3NpemU7CisgICAgICAgICAgIG1uZ19wY2hhciAgICAgICAgIHpLZXl3b3JkczsKKyAgICAgICAgfSBtbmdfbmVlZDsKK3R5cGVkZWYgbW5nX25lZWQgKiBtbmdfbmVlZHA7CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX3BIWWcKK3R5cGVkZWYgbW5nX3BoeXMgbW5nX3BoeWc7ICAgICAgICAgICAgIC8qIHBIWWcgKi8KK3R5cGVkZWYgbW5nX3BoeWcgKiBtbmdfcGh5Z3A7CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19JTkNMVURFX0pORworCit0eXBlZGVmIHN0cnVjdCB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBKSERSICovCisgICAgICAgICAgIG1uZ19jaHVua19oZWFkZXIgIHNIZWFkZXI7CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlXaWR0aDsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaUhlaWdodDsKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaUNvbG9ydHlwZTsKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaUltYWdlc2FtcGxlZGVwdGg7CisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlJbWFnZWNvbXByZXNzaW9uOworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpSW1hZ2VpbnRlcmxhY2U7CisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlBbHBoYXNhbXBsZWRlcHRoOworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpQWxwaGFjb21wcmVzc2lvbjsKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaUFscGhhZmlsdGVyOworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpQWxwaGFpbnRlcmxhY2U7CisgICAgICAgIH0gbW5nX2poZHI7Cit0eXBlZGVmIG1uZ19qaGRyICogbW5nX2poZHJwOworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCit0eXBlZGVmIG1uZ19pZGF0IG1uZ19qZGFhOyAgICAgICAgICAgICAvKiBKREFBICovCit0eXBlZGVmIG1uZ19qZGFhICogbW5nX2pkYWFwOworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCit0eXBlZGVmIG1uZ19pZGF0IG1uZ19qZGF0OyAgICAgICAgICAgICAvKiBKREFUICovCit0eXBlZGVmIG1uZ19qZGF0ICogbW5nX2pkYXRwOworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCit0eXBlZGVmIHN0cnVjdCB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBKU0VQICovCisgICAgICAgICAgIG1uZ19jaHVua19oZWFkZXIgIHNIZWFkZXI7CisgICAgICAgIH0gbW5nX2pzZXA7Cit0eXBlZGVmIG1uZ19qc2VwICogbW5nX2pzZXBwOworCisjZW5kaWYgLyogTU5HX0lOQ0xVREVfSk5HICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworCit0eXBlZGVmIHN0cnVjdCB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBESERSICovCisgICAgICAgICAgIG1uZ19jaHVua19oZWFkZXIgIHNIZWFkZXI7CisgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgIGlPYmplY3RpZDsKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaUltYWdldHlwZTsKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaURlbHRhdHlwZTsKKyNpZmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICAgYkhhc2Jsb2Nrc2l6ZTsKKyNlbmRpZgorICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpQmxvY2t3aWR0aDsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaUJsb2NraGVpZ2h0OworI2lmZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICBiSGFzYmxvY2tsb2M7CisjZW5kaWYKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaUJsb2NreDsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaUJsb2NreTsKKyAgICAgICAgfSBtbmdfZGhkcjsKK3R5cGVkZWYgbW5nX2RoZHIgKiBtbmdfZGhkcnA7CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgICAgICAgICAgICAgICAgIC8qIFBST00gKi8KKyAgICAgICAgICAgbW5nX2NodW5rX2hlYWRlciAgc0hlYWRlcjsKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaUNvbG9ydHlwZTsKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaVNhbXBsZWRlcHRoOworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpRmlsbHR5cGU7CisgICAgICAgIH0gbW5nX3Byb207Cit0eXBlZGVmIG1uZ19wcm9tICogbW5nX3Byb21wOworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCit0eXBlZGVmIHN0cnVjdCB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBJUE5HICovCisgICAgICAgICAgIG1uZ19jaHVua19oZWFkZXIgIHNIZWFkZXI7CisgICAgICAgIH0gbW5nX2lwbmc7Cit0eXBlZGVmIG1uZ19pcG5nICptbmdfaXBuZ3A7CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgICAgICAgICAgICAgICAgIC8qIFBQTFQgZW50cnkgKi8KKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaVJlZDsKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaUdyZWVuOworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpQmx1ZTsKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaUFscGhhOworICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICBiVXNlZDsKKyAgICAgICAgfSBtbmdfcHBsdF9lbnRyeTsKK3R5cGVkZWYgbW5nX3BwbHRfZW50cnkgKiBtbmdfcHBsdF9lbnRyeXA7CisKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgICAgICAgICAgICAgICAgIC8qIFBQTFQgKi8KKyAgICAgICAgICAgbW5nX2NodW5rX2hlYWRlciAgc0hlYWRlcjsKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaURlbHRhdHlwZTsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaUNvdW50OworICAgICAgICAgICBtbmdfcHBsdF9lbnRyeSAgICBhRW50cmllcyBbMjU2XTsKKyAgICAgICAgfSBtbmdfcHBsdDsKK3R5cGVkZWYgbW5nX3BwbHQgKiBtbmdfcHBsdHA7CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgICAgICAgICAgICAgICAgIC8qIElKTkcgKi8KKyAgICAgICAgICAgbW5nX2NodW5rX2hlYWRlciAgc0hlYWRlcjsKKyAgICAgICAgfSBtbmdfaWpuZzsKK3R5cGVkZWYgbW5nX2lqbmcgKm1uZ19pam5ncDsKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKwordHlwZWRlZiBzdHJ1Y3QgeyAgICAgICAgICAgICAgICAgICAgICAgLyogRFJPUCAqLworICAgICAgICAgICBtbmdfY2h1bmtfaGVhZGVyICBzSGVhZGVyOworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpQ291bnQ7CisgICAgICAgICAgIG1uZ19jaHVua2lkcCAgICAgIHBDaHVua25hbWVzOworICAgICAgICB9IG1uZ19kcm9wOwordHlwZWRlZiBtbmdfZHJvcCAqIG1uZ19kcm9wcDsKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX0RCWUsKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgICAgICAgICAgICAgICAgIC8qIERCWUsgKi8KKyAgICAgICAgICAgbW5nX2NodW5rX2hlYWRlciAgc0hlYWRlcjsKKyAgICAgICAgICAgbW5nX2NodW5raWQgICAgICAgaUNodW5rbmFtZTsKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaVBvbGFyaXR5OworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpS2V5d29yZHNzaXplOworICAgICAgICAgICBtbmdfcGNoYXIgICAgICAgICB6S2V5d29yZHM7CisgICAgICAgIH0gbW5nX2RieWs7Cit0eXBlZGVmIG1uZ19kYnlrICogbW5nX2RieWtwOworI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19PUkRSCit0eXBlZGVmIHN0cnVjdCB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBPUkRSIGVudHJ5ICovCisgICAgICAgICAgIG1uZ19jaHVua2lkICAgICAgIGlDaHVua25hbWU7CisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlPcmRlcnR5cGU7CisgICAgICAgIH0gbW5nX29yZHJfZW50cnk7Cit0eXBlZGVmIG1uZ19vcmRyX2VudHJ5ICogbW5nX29yZHJfZW50cnlwOworCit0eXBlZGVmIHN0cnVjdCBtbmdfb3Jkcl9zdHJ1Y3QgeyAgICAgICAvKiBPUkRSICovCisgICAgICAgICAgIG1uZ19jaHVua19oZWFkZXIgIHNIZWFkZXI7CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlDb3VudDsKKyAgICAgICAgICAgbW5nX29yZHJfZW50cnlwICAgcEVudHJpZXM7CisgICAgICAgIH0gbW5nX29yZHI7Cit0eXBlZGVmIG1uZ19vcmRyICogbW5nX29yZHJwOworI2VuZGlmCisjZW5kaWYgLyogTU5HX05PX0RFTFRBX1BORyAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCit0eXBlZGVmIHN0cnVjdCB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBNQUdOICovCisgICAgICAgICAgIG1uZ19jaHVua19oZWFkZXIgIHNIZWFkZXI7CisgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgIGlGaXJzdGlkOworICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICBpTGFzdGlkOworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpTWV0aG9kWDsKKyAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAgaU1YOworICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICBpTVk7CisgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgIGlNTDsKKyAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAgaU1SOworICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICBpTVQ7CisgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgIGlNQjsKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaU1ldGhvZFk7CisgICAgICAgIH0gbW5nX21hZ247Cit0eXBlZGVmIG1uZ19tYWduICogbW5nX21hZ25wOworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCit0eXBlZGVmIHN0cnVjdCB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBldk5UIGVudHJ5ICovCisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlFdmVudHR5cGU7CisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlNYXNrdHlwZTsKKyAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAgaUxlZnQ7CisgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgIGlSaWdodDsKKyAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAgaVRvcDsKKyAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAgaUJvdHRvbTsKKyAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAgaU9iamVjdGlkOworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpSW5kZXg7CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlTZWdtZW50bmFtZXNpemU7CisgICAgICAgICAgIG1uZ19wY2hhciAgICAgICAgIHpTZWdtZW50bmFtZTsKKyAgICAgICAgfSBtbmdfZXZudF9lbnRyeTsKK3R5cGVkZWYgbW5nX2V2bnRfZW50cnkgKiBtbmdfZXZudF9lbnRyeXA7CisKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgICAgICAgICAgICAgICAgIC8qIGV2TlQgKi8KKyAgICAgICAgICAgbW5nX2NodW5rX2hlYWRlciAgc0hlYWRlcjsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaUNvdW50OworICAgICAgICAgICBtbmdfZXZudF9lbnRyeXAgICBwRW50cmllczsKKyAgICAgICAgfSBtbmdfZXZudDsKK3R5cGVkZWYgbW5nX2V2bnQgKiBtbmdfZXZudHA7CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfSU5DTFVERV9NUE5HX1BST1BPU0FMCit0eXBlZGVmIHN0cnVjdCB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBtcE5HIGZyYW1lICovCisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlYOworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpWTsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaVdpZHRoOworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpSGVpZ2h0OworICAgICAgICAgICBtbmdfaW50MzIgICAgICAgICBpWG9mZnNldDsKKyAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAgaVlvZmZzZXQ7CisgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgIGlUaWNrczsKKyAgICAgICAgfSBtbmdfbXBuZ19mcmFtZTsKK3R5cGVkZWYgbW5nX21wbmdfZnJhbWUgKiBtbmdfbXBuZ19mcmFtZXA7CisKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgICAgICAgICAgICAgICAgIC8qIG1wTkcgKi8KKyAgICAgICAgICAgbW5nX2NodW5rX2hlYWRlciAgc0hlYWRlcjsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaUZyYW1ld2lkdGg7CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlGcmFtZWhlaWdodDsKKyAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAgaU51bXBsYXlzOworICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICBpVGlja3NwZXJzZWM7CisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlDb21wcmVzc2lvbm1ldGhvZDsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaUZyYW1lc3NpemU7CisgICAgICAgICAgIG1uZ19tcG5nX2ZyYW1lcCAgIHBGcmFtZXM7CisgICAgICAgIH0gbW5nX21wbmc7Cit0eXBlZGVmIG1uZ19tcG5nICogbW5nX21wbmdwOworI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfSU5DTFVERV9BTkdfUFJPUE9TQUwKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgICAgICAgICAgICAgICAgIC8qIGFoRFIgKi8KKyAgICAgICAgICAgbW5nX2NodW5rX2hlYWRlciAgc0hlYWRlcjsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaU51bWZyYW1lczsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaVRpY2tzcGVyc2VjOworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpTnVtcGxheXM7CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlUaWxld2lkdGg7CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlUaWxlaGVpZ2h0OworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpSW50ZXJsYWNlOworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpU3RpbGx1c2VkOworICAgICAgICB9IG1uZ19haGRyOwordHlwZWRlZiBtbmdfYWhkciAqIG1uZ19haGRycDsKKwordHlwZWRlZiBzdHJ1Y3QgeyAgICAgICAgICAgICAgICAgICAgICAgLyogYWRBVCB0aWxlICovCisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlUaWNrczsKKyAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAgaVhvZmZzZXQ7CisgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgIGlZb2Zmc2V0OworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpVGlsZXNvdXJjZTsKKyAgICAgICAgfSBtbmdfYWRhdF90aWxlOwordHlwZWRlZiBtbmdfYWRhdF90aWxlICogbW5nX2FkYXRfdGlsZXA7CisKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkQVQgKi8KKyAgICAgICAgICAgbW5nX2NodW5rX2hlYWRlciAgc0hlYWRlcjsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaVRpbGVzc2l6ZTsKKyAgICAgICAgICAgbW5nX2FkYXRfdGlsZXAgICAgcFRpbGVzOworICAgICAgICB9IG1uZ19hZGF0OwordHlwZWRlZiBtbmdfYWRhdCAqIG1uZ19hZGF0cDsKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCit0eXBlZGVmIHN0cnVjdCB7ICAgICAgICAgICAgICAgICAgICAgICAvKiB1bmtub3duIGNodW5rICovCisgICAgICAgICAgIG1uZ19jaHVua19oZWFkZXIgIHNIZWFkZXI7CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlEYXRhc2l6ZTsKKyAgICAgICAgICAgbW5nX3B0ciAgICAgICAgICAgcERhdGE7CisgICAgICAgIH0gbW5nX3Vua25vd25fY2h1bms7Cit0eXBlZGVmIG1uZ191bmtub3duX2NodW5rICogbW5nX3Vua25vd25fY2h1bmtwOworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjZW5kaWYgLyogX2xpYm1uZ19jaHVua3NfaF8gKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogZW5kIG9mIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwpkaWZmIC0tZ2l0IGEvZmlsZXMvU291cmNlL0xpYk1ORy9saWJtbmdfY21zLmMgYi9maWxlcy9Tb3VyY2UvTGliTU5HL2xpYm1uZ19jbXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTk1NzVmCi0tLSAvZGV2L251bGwKKysrIGIvZmlsZXMvU291cmNlL0xpYk1ORy9saWJtbmdfY21zLmMKQEAgLTAsMCArMSw3NTggQEAKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBsaWJtbmcuaCAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBwcm9qZWN0ICAgOiBsaWJtbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogZmlsZSAgICAgIDogbGlibW5nX2Ntcy5jICAgICAgICAgICAgICBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwNCBHLkp1eW4gICAqICovCisvKiAqIHZlcnNpb24gICA6IDEuMC45ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogcHVycG9zZSAgIDogY29sb3IgbWFuYWdlbWVudCByb3V0aW5lcyAoaW1wbGVtZW50YXRpb24pICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBhdXRob3IgICAgOiBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGNvbW1lbnQgICA6IGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb2xvciBtYW5hZ2VtZW50IHJvdXRpbmVzICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogY2hhbmdlcyAgIDogMC41LjEgLSAwNS8wMS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gQjAwMSgxMDU3OTUpIC0gZml4ZWQgYSB0eXBvIGFuZCBtaXNjb25jZXB0aW9uIGFib3V0ICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgIGZyZWVpbmcgYWxsb2NhdGVkIGdhbW1hLXRhYmxlLiAocmVwb3J0ZWQgYnkgTWFydGkgTWFyaWEpICogKi8KKy8qICogICAgICAgICAgICAgMC41LjEgLSAwNS8wOC8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2hhbmdlZCBzdHJpY3QtQU5TSSBzdHVmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMSAtIDA1LzA5LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaWxsZWQgYXBwbGljYXRpb24tYmFzZWQgY29sb3ItbWFuYWdlbWVudCByb3V0aW5lcyAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4xIC0gMDUvMTEvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGNyZWF0ZW1lbXByb2ZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBjYWxsYmFjayBlcnJvci1yZXBvcnRpbmcgc3VwcG9ydCAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4xIC0gMDUvMTIvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNoYW5nZWQgdHJhY2UgdG8gbWFjcm8gZm9yIGNhbGxiYWNrIGVycm9yLXJlcG9ydGluZyAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4yIC0gMDYvMTAvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIHNvbWUgY29tcGlsYXRpb24td2FybmluZ3MgKGNvbnRyaWIgSmFzb24gTW9ycmlzKSAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4zIC0gMDYvMjEvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIHByb2JsZW0gd2l0aCBjb2xvci1jb3JyZWN0aW9uIGZvciBzdG9yZWQgaW1hZ2VzICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjMgLSAwNi8yMy8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgcHJvYmxlbSB3aXRoIGluY29ycmVjdCBnYW1tYS1jb3JyZWN0aW9uICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjIgLSAwOC8wNS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2hhbmdlZCBmaWxlLXByZWZpeGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjMgLSAwOC8zMS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgc1JHQiBwcmVjZWRlbmNlIGZvciBnYW1tYV9vbmx5IGNvcmVjdGlvbiAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjQgLSAxMi8xNi8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgbWl4dXAgb2YgZGF0YS0gJiBmdW5jdGlvbi1wb2ludGVycyAodGhhbmtzIERpbWl0cmkpKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjEgLSAwMy8zMS8yMDAxIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gaWdub3JlIGdhbW1hPTAgKHNlZSBwbmctbGlzdCBmb3IgbW9yZSBpbmZvKSAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuMSAtIDA0LzI1LzIwMDEgLSBHLkp1eW4gKHJlcG9ydGVkIGJ5IEdyZWdnIEtlbGx5KSAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaXhlZCBwcm9ibGVtIHdpdGggY21zIHByb2ZpbGUgYmVpbmcgY3JlYXRlZCBtdWx0aXBsZSAgICAqICovCisvKiAqICAgICAgICAgICAgICAgdGltZXMgd2hlbiBib3RoIGlDQ1AgJiBjSFJNL2dBTUEgYXJlIHByZXNlbnQgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuMSAtIDA0LzI1LzIwMDEgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBtb3ZlZCBtbmdfY2xlYXJfY21zIHRvIGxpYm1uZ19jbXMgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC4xIC0gMDUvMDIvMjAwMSAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkICJkZWZhdWx0IiBzUkdCIGdlbmVyYXRpb24gKFRoYW5rcyBNYXJ0aSEpICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC41IC0gMDgvMTkvMjAwMiAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIEI1OTcxMzQgLSBsaWJtbmcgcG9sbHV0ZXMgdGhlIGxpbmtlciBuYW1lc3BhY2UgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAwOS8xOS8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gb3B0aW1pemVkIGNvbG9yLWNvcnJlY3Rpb24gcm91dGluZXMgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDA5LzIzLzIwMDIgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBpbi1tZW1vcnkgY29sb3ItY29ycmVjdGlvbiBvZiBhYnN0cmFjdCBpbWFnZXMgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC41IC0gMTEvMDgvMjAwMiAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIGlzc3VlcyBpbiBpbml0X2FwcF9jbXMoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC42IC0gMDQvMTEvMjAwMyAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIEI3MTk0MjAgLSBmaXhlZCBzZXZlcmFsIE1OR19BUFBfQ01TIHByb2JsZW1zICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjYgLSAwNy8xMS8yMDAzIC0gRy4gUi1QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgY29uZGl0aW9uYWwgTU5HX1NLSVBDSFVOS19jSFJNL2lDQ1AgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjkgLSAxMi8yMC8yMDA0IC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2xlYW5lZCB1cCBtYWNyby1pbnZvY2F0aW9ucyAodGhhbmtzIHRvIEQuIEFpcmxpZSkgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpbmNsdWRlICJsaWJtbmcuaCIKKyNpbmNsdWRlICJsaWJtbmdfZGF0YS5oIgorI2luY2x1ZGUgImxpYm1uZ19lcnJvci5oIgorI2luY2x1ZGUgImxpYm1uZ190cmFjZS5oIgorI2lmZGVmIF9fQk9STEFORENfXworI3ByYWdtYSBoZHJzdG9wCisjZW5kaWYKKyNpbmNsdWRlICJsaWJtbmdfb2JqZWN0cy5oIgorI2luY2x1ZGUgImxpYm1uZ19jbXMuaCIKKworI2lmIGRlZmluZWQoX19CT1JMQU5EQ19fKSAmJiBkZWZpbmVkKE1OR19TVFJJQ1RfQU5TSSkKKyNwcmFnbWEgb3B0aW9uIC1BICAgICAgICAgICAgICAgICAgICAgIC8qIGZvcmNlIEFOU0ktQyAqLworI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfSU5DTFVERV9ESVNQTEFZX1BST0NTCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBMaXR0bGUgQ01TIGhlbHBlciByb3V0aW5lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX0lOQ0xVREVfTENNUworCisjZGVmaW5lIE1OR19DTVNfRkxBR1MgMAorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCit2b2lkIG1uZ2xjbXNfaW5pdGxpYnJhcnkgKCkKK3sKKyAgY21zRXJyb3JBY3Rpb24gKExDTVNfRVJST1JfSUdOT1JFKTsgIC8qIExDTVMgc2hvdWxkIGlnbm9yZSBlcnJvcnMhICovCit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19jbXNwcm9mIG1uZ2xjbXNfY3JlYXRlZmlsZXByb2ZpbGUgKG1uZ19wY2hhciB6RmlsZW5hbWUpCit7CisgIHJldHVybiBjbXNPcGVuUHJvZmlsZUZyb21GaWxlICh6RmlsZW5hbWUsICJyIik7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19jbXNwcm9mIG1uZ2xjbXNfY3JlYXRlbWVtcHJvZmlsZSAobW5nX3VpbnQzMiBpUHJvZmlsZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wdHIgICAgcFByb2ZpbGUpCit7CisgIHJldHVybiBjbXNPcGVuUHJvZmlsZUZyb21NZW0gKHBQcm9maWxlLCBpUHJvZmlsZXNpemUpOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfY21zcHJvZiBtbmdsY21zX2NyZWF0ZXNyZ2Jwcm9maWxlICh2b2lkKQoreworICBjbXNDSUV4eVkgICAgICAgRDY1OworICBjbXNDSUV4eVlUUklQTEUgUmVjNzA5UHJpbWFyaWVzID0geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MC42NDAwLCAwLjMzMDAsIDEuMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswLjMwMDAsIDAuNjAwMCwgMS4wfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezAuMTUwMCwgMC4wNjAwLCAxLjB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworICBMUEdBTU1BVEFCTEUgICAgR2FtbWEyNFszXTsKKyAgbW5nX2Ntc3Byb2YgICAgIGhzUkdCOworCisgIGNtc1doaXRlUG9pbnRGcm9tVGVtcCg2NTA0LCAmRDY1KTsKKyAgR2FtbWEyNFswXSA9IEdhbW1hMjRbMV0gPSBHYW1tYTI0WzJdID0gY21zQnVpbGRHYW1tYSgyNTYsIDIuNCk7CisgIGhzUkdCID0gY21zQ3JlYXRlUkdCUHJvZmlsZSgmRDY1LCAmUmVjNzA5UHJpbWFyaWVzLCBHYW1tYTI0KTsKKyAgY21zRnJlZUdhbW1hKEdhbW1hMjRbMF0pOworCisgIHJldHVybiBoc1JHQjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKwordm9pZCBtbmdsY21zX2ZyZWVwcm9maWxlIChtbmdfY21zcHJvZiBoUHJvZikKK3sKKyAgY21zQ2xvc2VQcm9maWxlIChoUHJvZik7CisgIHJldHVybjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKwordm9pZCBtbmdsY21zX2ZyZWV0cmFuc2Zvcm0gKG1uZ19jbXN0cmFucyBoVHJhbnMpCit7CisvKiBCMDAxIHN0YXJ0ICovCisgIGNtc0RlbGV0ZVRyYW5zZm9ybSAoaFRyYW5zKTsKKy8qIEIwMDEgZW5kICovCisgIHJldHVybjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX2NsZWFyX2NtcyAobW5nX2RhdGFwIHBEYXRhKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9DTEVBUl9DTVMsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAocERhdGEtPmhUcmFucykgICAgICAgICAgICAgICAgICAgLyogdHJhbnNmb3JtYXRpb24gc3RpbGwgYWN0aXZlID8gKi8KKyAgICBtbmdsY21zX2ZyZWV0cmFuc2Zvcm0gKHBEYXRhLT5oVHJhbnMpOworCisgIHBEYXRhLT5oVHJhbnMgPSAwOworCisgIGlmIChwRGF0YS0+aFByb2YxKSAgICAgICAgICAgICAgICAgICAvKiBmaWxlIHByb2ZpbGUgc3RpbGwgYWN0aXZlID8gKi8KKyAgICBtbmdsY21zX2ZyZWVwcm9maWxlIChwRGF0YS0+aFByb2YxKTsKKworICBwRGF0YS0+aFByb2YxID0gMDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9DTEVBUl9DTVMsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjZW5kaWYgLyogTU5HX0lOQ0xVREVfTENNUyAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogQ29sb3ItbWFuYWdlbWVudCBpbml0aWFsaXphdGlvbiAmIGNvcnJlY3Rpb24gcm91dGluZXMgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19JTkNMVURFX0xDTVMKKworbW5nX3JldGNvZGUgbW5nX2luaXRfZnVsbF9jbXMgKG1uZ19kYXRhcCBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfYm9vbCAgYkdsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfYm9vbCAgYk9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfYm9vbCAgYlJldHJvYmopCit7CisgIG1uZ19jbXNwcm9mICAgIGhQcm9mOworICBtbmdfY21zdHJhbnMgICBoVHJhbnM7CisgIG1uZ19pbWFnZXAgICAgIHBJbWFnZSA9IE1OR19OVUxMOworICBtbmdfaW1hZ2VkYXRhcCBwQnVmICAgPSBNTkdfTlVMTDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX0ZVTExfQ01TLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKGJPYmplY3QpICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVzZSBvYmplY3QgaWYgcHJlc2VudCA/ICovCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjdXJyZW50IG9iamVjdCA/ICovCisgICAgaWYgKChtbmdfaW1hZ2VwKXBEYXRhLT5wQ3VycmVudG9iaikKKyAgICAgIHBJbWFnZSA9IChtbmdfaW1hZ2VwKXBEYXRhLT5wQ3VycmVudG9iajsKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmIG5vdDsgdXNlIG9iamVjdCAwICovCisgICAgICBwSW1hZ2UgPSAobW5nX2ltYWdlcClwRGF0YS0+cE9ianplcm87CisgIH0KKworICBpZiAoYlJldHJvYmopICAgICAgICAgICAgICAgICAgICAgICAgLyogcmV0cmlldmluZyBmcm9tIGFuIG9iamVjdCA/ICovCisgICAgcEltYWdlID0gKG1uZ19pbWFnZXApcERhdGEtPnBSZXRyaWV2ZW9iajsKKworICBpZiAocEltYWdlKSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYXJlIHdlIHVzaW5nIGFuIG9iamVjdCA/ICovCisgICAgcEJ1ZiA9IHBJbWFnZS0+cEltZ2J1ZjsgICAgICAgICAgICAvKiB0aGVuIGFkZHJlc3MgdGhlIGJ1ZmZlciAqLworCisgIGlmICgoIXBCdWYpIHx8ICghcEJ1Zi0+YkNvcnJlY3RlZCkpICAvKiBpcyB0aGUgYnVmZmVyIGFscmVhZHkgY29ycmVjdGVkID8gKi8KKyAgeworI2lmbmRlZiBNTkdfU0tJUENIVU5LX2lDQ1AKKyAgICBpZiAoKChwQnVmKSAmJiAocEJ1Zi0+Ykhhc0lDQ1ApKSB8fCAoKGJHbG9iYWwpICYmIChwRGF0YS0+Ykhhc2dsb2JhbElDQ1ApKSkKKyAgICB7CisgICAgICBpZiAoIXBEYXRhLT5oUHJvZjIpICAgICAgICAgICAgICAvKiBvdXRwdXQgcHJvZmlsZSBub3QgZGVmaW5lZCA/ICovCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGVuIGFzc3VtZSBzUkdCICEhICovCisgICAgICAgIHBEYXRhLT5oUHJvZjIgPSBtbmdsY21zX2NyZWF0ZXNyZ2Jwcm9maWxlICgpOworCisgICAgICAgIGlmICghcERhdGEtPmhQcm9mMikgICAgICAgICAgICAvKiBoYW5kbGUgZXJyb3IgPyAqLworICAgICAgICAgIE1OR19FUlJPUkwgKHBEYXRhLCBNTkdfTENNU19OT0hBTkRMRSk7CisgICAgICB9CisKKyAgICAgIGlmICgocEJ1ZikgJiYgKHBCdWYtPmJIYXNJQ0NQKSkgIC8qIGdlbmVyYXRlIGEgcHJvZmlsZSBoYW5kbGUgKi8KKyAgICAgICAgaFByb2YgPSBjbXNPcGVuUHJvZmlsZUZyb21NZW0gKHBCdWYtPnBQcm9maWxlLCBwQnVmLT5pUHJvZmlsZXNpemUpOworICAgICAgZWxzZQorICAgICAgICBoUHJvZiA9IGNtc09wZW5Qcm9maWxlRnJvbU1lbSAocERhdGEtPnBHbG9iYWxQcm9maWxlLCBwRGF0YS0+aUdsb2JhbFByb2ZpbGVzaXplKTsKKworICAgICAgcERhdGEtPmhQcm9mMSA9IGhQcm9mOyAgICAgICAgICAgLyogc2F2ZSBmb3IgZnV0dXJlIHVzZSAqLworCisgICAgICBpZiAoIWhQcm9mKSAgICAgICAgICAgICAgICAgICAgICAvKiBoYW5kbGUgZXJyb3IgPyAqLworICAgICAgICBNTkdfRVJST1JMIChwRGF0YSwgTU5HX0xDTVNfTk9IQU5ETEUpOworCisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgICBpZiAocERhdGEtPmJJc1JHQkExNikgICAgICAgICAgICAvKiAxNi1iaXQgaW50ZXJtZWRpYXRlcyA/ICovCisgICAgICAgIGhUcmFucyA9IGNtc0NyZWF0ZVRyYW5zZm9ybSAoaFByb2YsICAgICAgICAgVFlQRV9SR0JBXzE2X1NFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5oUHJvZjIsIFRZUEVfUkdCQV8xNl9TRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRFTlRfUEVSQ0VQVFVBTCwgTU5HX0NNU19GTEFHUyk7CisgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgaFRyYW5zID0gY21zQ3JlYXRlVHJhbnNmb3JtIChoUHJvZiwgICAgICAgICBUWVBFX1JHQkFfOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aFByb2YyLCBUWVBFX1JHQkFfOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRFTlRfUEVSQ0VQVFVBTCwgTU5HX0NNU19GTEFHUyk7CisKKyAgICAgIHBEYXRhLT5oVHJhbnMgPSBoVHJhbnM7ICAgICAgICAgIC8qIHNhdmUgZm9yIGZ1dHVyZSB1c2UgKi8KKworICAgICAgaWYgKCFoVHJhbnMpICAgICAgICAgICAgICAgICAgICAgLyogaGFuZGxlIGVycm9yID8gKi8KKyAgICAgICAgTU5HX0VSUk9STCAocERhdGEsIE1OR19MQ01TX05PVFJBTlMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbG9hZCBjb2xvci1jb3JyZWN0aW9uIHJvdXRpbmUgKi8KKyAgICAgIHBEYXRhLT5mQ29ycmVjdHJvdyA9IChtbmdfZnB0ciltbmdfY29ycmVjdF9mdWxsX2NtczsKKworICAgICAgcmV0dXJuIE1OR19OT0VSUk9SOyAgICAgICAgICAgICAgLyogYW5kIGRvbmUgKi8KKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgaWYgKCgocEJ1ZikgJiYgKHBCdWYtPmJIYXNTUkdCKSkgfHwgKChiR2xvYmFsKSAmJiAocERhdGEtPmJIYXNnbG9iYWxTUkdCKSkpCisgICAgeworICAgICAgbW5nX3VpbnQ4IGlJbnRlbnQ7CisKKyAgICAgIGlmIChwRGF0YS0+Yklzc1JHQikgICAgICAgICAgICAgIC8qIHNSR0Igc3lzdGVtID8gKi8KKyAgICAgICAgcmV0dXJuIE1OR19OT0VSUk9SOyAgICAgICAgICAgIC8qIG5vIGNvbnZlcnNpb24gcmVxdWlyZWQgKi8KKworICAgICAgaWYgKCFwRGF0YS0+aFByb2YzKSAgICAgICAgICAgICAgLyogc1JHQiBwcm9maWxlIG5vdCBkZWZpbmVkID8gKi8KKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZW4gY3JlYXRlIGl0IGltcGxpY2l0bHkgISEgKi8KKyAgICAgICAgcERhdGEtPmhQcm9mMyA9IG1uZ2xjbXNfY3JlYXRlc3JnYnByb2ZpbGUgKCk7CisKKyAgICAgICAgaWYgKCFwRGF0YS0+aFByb2YzKSAgICAgICAgICAgIC8qIGhhbmRsZSBlcnJvciA/ICovCisgICAgICAgICAgTU5HX0VSUk9STCAocERhdGEsIE1OR19MQ01TX05PSEFORExFKTsKKyAgICAgIH0KKworICAgICAgaFByb2YgPSBwRGF0YS0+aFByb2YzOyAgICAgICAgICAgLyogY29udmVydCBmcm9tIHNSR0IgcHJvZmlsZSAqLworCisgICAgICBpZiAoKHBCdWYpICYmIChwQnVmLT5iSGFzU1JHQikpICAvKiBkZXRlcm1pbmUgcmVuZGVyaW5nIGludGVudCAqLworICAgICAgICBpSW50ZW50ID0gcEJ1Zi0+aVJlbmRlcmluZ2ludGVudDsKKyAgICAgIGVsc2UKKyAgICAgICAgaUludGVudCA9IHBEYXRhLT5pR2xvYmFsUmVuZGludGVudDsKKworICAgICAgaWYgKHBEYXRhLT5iSXNSR0JBMTYpICAgICAgICAgICAgLyogMTYtYml0IGludGVybWVkaWF0ZXMgPyAqLworICAgICAgICBoVHJhbnMgPSBjbXNDcmVhdGVUcmFuc2Zvcm0gKGhQcm9mLCAgICAgICAgIFRZUEVfUkdCQV8xNl9TRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aFByb2YyLCBUWVBFX1JHQkFfMTZfU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUludGVudCwgTU5HX0NNU19GTEFHUyk7CisgICAgICBlbHNlCisgICAgICAgIGhUcmFucyA9IGNtc0NyZWF0ZVRyYW5zZm9ybSAoaFByb2YsICAgICAgICAgVFlQRV9SR0JBXzgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmhQcm9mMiwgVFlQRV9SR0JBXzgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUludGVudCwgTU5HX0NNU19GTEFHUyk7CisKKyAgICAgIHBEYXRhLT5oVHJhbnMgPSBoVHJhbnM7ICAgICAgICAgIC8qIHNhdmUgZm9yIGZ1dHVyZSB1c2UgKi8KKworICAgICAgaWYgKCFoVHJhbnMpICAgICAgICAgICAgICAgICAgICAgLyogaGFuZGxlIGVycm9yID8gKi8KKyAgICAgICAgTU5HX0VSUk9STCAocERhdGEsIE1OR19MQ01TX05PVFJBTlMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbG9hZCBjb2xvci1jb3JyZWN0aW9uIHJvdXRpbmUgKi8KKyAgICAgIHBEYXRhLT5mQ29ycmVjdHJvdyA9IChtbmdfZnB0ciltbmdfY29ycmVjdF9mdWxsX2NtczsKKworICAgICAgcmV0dXJuIE1OR19OT0VSUk9SOyAgICAgICAgICAgICAgLyogYW5kIGRvbmUgKi8KKyAgICB9CisgICAgZWxzZQorICAgIGlmICggKCgocEJ1ZikgJiYgKHBCdWYtPmJIYXNDSFJNKSkgfHwgKChiR2xvYmFsKSAmJiAocERhdGEtPmJIYXNnbG9iYWxDSFJNKSkpICYmCisgICAgICAgICAoICgocEJ1ZikgJiYgKHBCdWYtPmJIYXNHQU1BKSAmJiAocEJ1Zi0+aUdhbW1hID4gMCkpIHx8CisgICAgICAgICAgICgoYkdsb2JhbCkgJiYgKHBEYXRhLT5iSGFzZ2xvYmFsR0FNQSkgJiYgKHBEYXRhLT5pR2xvYmFsR2FtbWEgPiAwKSkgICkgICAgKQorICAgIHsKKyAgICAgIG1uZ19DSUV4eVkgICAgICAgc1doaXRlcG9pbnQ7CisgICAgICBtbmdfQ0lFeHlZVFJJUExFIHNQcmltYXJpZXM7CisgICAgICBtbmdfZ2FtbWF0YWJwICAgIHBHYW1tYXRhYmxlWzNdOworICAgICAgbW5nX2Zsb2F0ICAgICAgICBkR2FtbWE7CisKKyAgICAgIGlmICghcERhdGEtPmhQcm9mMikgICAgICAgICAgICAgIC8qIG91dHB1dCBwcm9maWxlIG5vdCBkZWZpbmVkID8gKi8KKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZW4gYXNzdW1lIHNSR0IgISEgKi8KKyAgICAgICAgcERhdGEtPmhQcm9mMiA9IG1uZ2xjbXNfY3JlYXRlc3JnYnByb2ZpbGUgKCk7CisKKyAgICAgICAgaWYgKCFwRGF0YS0+aFByb2YyKSAgICAgICAgICAgIC8qIGhhbmRsZSBlcnJvciA/ICovCisgICAgICAgICAgTU5HX0VSUk9STCAocERhdGEsIE1OR19MQ01TX05PSEFORExFKTsKKyAgICAgIH0KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX2NIUk0KKyAgICAgIGlmICgocEJ1ZikgJiYgKHBCdWYtPmJIYXNDSFJNKSkgIC8qIGxvY2FsIGNIUk0gPyAqLworICAgICAgeworICAgICAgICBzV2hpdGVwb2ludC54ICAgICAgPSAobW5nX2Zsb2F0KXBCdWYtPmlXaGl0ZXBvaW50eCAgIC8gMTAwMDAwOworICAgICAgICBzV2hpdGVwb2ludC55ICAgICAgPSAobW5nX2Zsb2F0KXBCdWYtPmlXaGl0ZXBvaW50eSAgIC8gMTAwMDAwOworICAgICAgICBzUHJpbWFyaWVzLlJlZC54ICAgPSAobW5nX2Zsb2F0KXBCdWYtPmlQcmltYXJ5cmVkeCAgIC8gMTAwMDAwOworICAgICAgICBzUHJpbWFyaWVzLlJlZC55ICAgPSAobW5nX2Zsb2F0KXBCdWYtPmlQcmltYXJ5cmVkeSAgIC8gMTAwMDAwOworICAgICAgICBzUHJpbWFyaWVzLkdyZWVuLnggPSAobW5nX2Zsb2F0KXBCdWYtPmlQcmltYXJ5Z3JlZW54IC8gMTAwMDAwOworICAgICAgICBzUHJpbWFyaWVzLkdyZWVuLnkgPSAobW5nX2Zsb2F0KXBCdWYtPmlQcmltYXJ5Z3JlZW55IC8gMTAwMDAwOworICAgICAgICBzUHJpbWFyaWVzLkJsdWUueCAgPSAobW5nX2Zsb2F0KXBCdWYtPmlQcmltYXJ5Ymx1ZXggIC8gMTAwMDAwOworICAgICAgICBzUHJpbWFyaWVzLkJsdWUueSAgPSAobW5nX2Zsb2F0KXBCdWYtPmlQcmltYXJ5Ymx1ZXkgIC8gMTAwMDAwOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBzV2hpdGVwb2ludC54ICAgICAgPSAobW5nX2Zsb2F0KXBEYXRhLT5pR2xvYmFsV2hpdGVwb2ludHggICAvIDEwMDAwMDsKKyAgICAgICAgc1doaXRlcG9pbnQueSAgICAgID0gKG1uZ19mbG9hdClwRGF0YS0+aUdsb2JhbFdoaXRlcG9pbnR5ICAgLyAxMDAwMDA7CisgICAgICAgIHNQcmltYXJpZXMuUmVkLnggICA9IChtbmdfZmxvYXQpcERhdGEtPmlHbG9iYWxQcmltYXJ5cmVkeCAgIC8gMTAwMDAwOworICAgICAgICBzUHJpbWFyaWVzLlJlZC55ICAgPSAobW5nX2Zsb2F0KXBEYXRhLT5pR2xvYmFsUHJpbWFyeXJlZHkgICAvIDEwMDAwMDsKKyAgICAgICAgc1ByaW1hcmllcy5HcmVlbi54ID0gKG1uZ19mbG9hdClwRGF0YS0+aUdsb2JhbFByaW1hcnlncmVlbnggLyAxMDAwMDA7CisgICAgICAgIHNQcmltYXJpZXMuR3JlZW4ueSA9IChtbmdfZmxvYXQpcERhdGEtPmlHbG9iYWxQcmltYXJ5Z3JlZW55IC8gMTAwMDAwOworICAgICAgICBzUHJpbWFyaWVzLkJsdWUueCAgPSAobW5nX2Zsb2F0KXBEYXRhLT5pR2xvYmFsUHJpbWFyeWJsdWV4ICAvIDEwMDAwMDsKKyAgICAgICAgc1ByaW1hcmllcy5CbHVlLnkgID0gKG1uZ19mbG9hdClwRGF0YS0+aUdsb2JhbFByaW1hcnlibHVleSAgLyAxMDAwMDA7CisgICAgICB9CisjZW5kaWYKKworICAgICAgc1doaXRlcG9pbnQuWSAgICAgID0gICAgICAgICAgICAgLyogWSBjb21wb25lbnQgaXMgYWx3YXlzIDEuMCAqLworICAgICAgc1ByaW1hcmllcy5SZWQuWSAgID0KKyAgICAgIHNQcmltYXJpZXMuR3JlZW4uWSA9CisgICAgICBzUHJpbWFyaWVzLkJsdWUuWSAgPSAxLjA7CisKKyAgICAgIGlmICgocEJ1ZikgJiYgKHBCdWYtPmJIYXNHQU1BKSkgIC8qIGdldCB0aGUgZ2FtbWEgdmFsdWUgKi8KKyAgICAgICAgZEdhbW1hID0gKG1uZ19mbG9hdClwQnVmLT5pR2FtbWEgLyAxMDAwMDA7CisgICAgICBlbHNlCisgICAgICAgIGRHYW1tYSA9IChtbmdfZmxvYXQpcERhdGEtPmlHbG9iYWxHYW1tYSAvIDEwMDAwMDsKKworICAgICAgZEdhbW1hID0gcERhdGEtPmRWaWV3Z2FtbWEgLyBkR2FtbWE7CisKKyAgICAgIHBHYW1tYXRhYmxlIFswXSA9ICAgICAgICAgICAgICAgIC8qIGFuZCBidWlsZCB0aGUgbG9va3VwIHRhYmxlcyAqLworICAgICAgcEdhbW1hdGFibGUgWzFdID0KKyAgICAgIHBHYW1tYXRhYmxlIFsyXSA9IGNtc0J1aWxkR2FtbWEgKDI1NiwgZEdhbW1hKTsKKworICAgICAgaWYgKCFwR2FtbWF0YWJsZSBbMF0pICAgICAgICAgICAgLyogZW5vdWdoIG1lbW9yeSA/ICovCisgICAgICAgIE1OR19FUlJPUkwgKHBEYXRhLCBNTkdfTENNU19OT01FTSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgdGhlIHByb2ZpbGUgKi8KKyAgICAgIGhQcm9mID0gY21zQ3JlYXRlUkdCUHJvZmlsZSAoJnNXaGl0ZXBvaW50LCAmc1ByaW1hcmllcywgcEdhbW1hdGFibGUpOworCisgICAgICBjbXNGcmVlR2FtbWEgKHBHYW1tYXRhYmxlIFswXSk7ICAvKiBmcmVlIHRoZSB0ZW1wb3JhcnkgZ2FtbWEgdGFibGVzID8gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHllcyEgYnV0IGp1c3QgdGhlIG9uZSEgKi8KKworICAgICAgcERhdGEtPmhQcm9mMSA9IGhQcm9mOyAgICAgICAgICAgLyogc2F2ZSBmb3IgZnV0dXJlIHVzZSAqLworCisgICAgICBpZiAoIWhQcm9mKSAgICAgICAgICAgICAgICAgICAgICAvKiBoYW5kbGUgZXJyb3IgPyAqLworICAgICAgICBNTkdfRVJST1JMIChwRGF0YSwgTU5HX0xDTVNfTk9IQU5ETEUpOworCisgICAgICBpZiAocERhdGEtPmJJc1JHQkExNikgICAgICAgICAgICAvKiAxNi1iaXQgaW50ZXJtZWRpYXRlcyA/ICovCisgICAgICAgIGhUcmFucyA9IGNtc0NyZWF0ZVRyYW5zZm9ybSAoaFByb2YsICAgICAgICAgVFlQRV9SR0JBXzE2X1NFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5oUHJvZjIsIFRZUEVfUkdCQV8xNl9TRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRFTlRfUEVSQ0VQVFVBTCwgTU5HX0NNU19GTEFHUyk7CisgICAgICBlbHNlCisgICAgICAgIGhUcmFucyA9IGNtc0NyZWF0ZVRyYW5zZm9ybSAoaFByb2YsICAgICAgICAgVFlQRV9SR0JBXzgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmhQcm9mMiwgVFlQRV9SR0JBXzgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5URU5UX1BFUkNFUFRVQUwsIE1OR19DTVNfRkxBR1MpOworCisgICAgICBwRGF0YS0+aFRyYW5zID0gaFRyYW5zOyAgICAgICAgICAvKiBzYXZlIGZvciBmdXR1cmUgdXNlICovCisKKyAgICAgIGlmICghaFRyYW5zKSAgICAgICAgICAgICAgICAgICAgIC8qIGhhbmRsZSBlcnJvciA/ICovCisgICAgICAgIE1OR19FUlJPUkwgKHBEYXRhLCBNTkdfTENNU19OT1RSQU5TKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxvYWQgY29sb3ItY29ycmVjdGlvbiByb3V0aW5lICovCisgICAgICBwRGF0YS0+ZkNvcnJlY3Ryb3cgPSAobW5nX2ZwdHIpbW5nX2NvcnJlY3RfZnVsbF9jbXM7CisKKyAgICAgIHJldHVybiBNTkdfTk9FUlJPUjsgICAgICAgICAgICAgIC8qIGFuZCBkb25lICovCisgICAgfQorICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSU5JVF9GVUxMX0NNUywgTU5HX0xDX0VORCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmIHdlIGdldCBoZXJlLCB3ZSdsbCBvbmx5IGRvIGdhbW1hICovCisgIHJldHVybiBtbmdfaW5pdF9nYW1tYV9vbmx5IChwRGF0YSwgYkdsb2JhbCwgYk9iamVjdCwgYlJldHJvYmopOworfQorI2VuZGlmIC8qIE1OR19JTkNMVURFX0xDTVMgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19JTkNMVURFX0xDTVMKK21uZ19yZXRjb2RlIG1uZ19jb3JyZWN0X2Z1bGxfY21zIChtbmdfZGF0YXAgcERhdGEpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0NPUlJFQ1RfRlVMTF9DTVMsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBjbXNEb1RyYW5zZm9ybSAocERhdGEtPmhUcmFucywgcERhdGEtPnBSR0JBcm93LCBwRGF0YS0+cFJHQkFyb3csIHBEYXRhLT5pUm93c2FtcGxlcyk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQ09SUkVDVF9GVUxMX0NNUywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYgLyogTU5HX0lOQ0xVREVfTENNUyAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWYgZGVmaW5lZChNTkdfR0FNTUFfT05MWSkgfHwgZGVmaW5lZChNTkdfRlVMTF9DTVMpIHx8IGRlZmluZWQoTU5HX0FQUF9DTVMpCittbmdfcmV0Y29kZSBtbmdfaW5pdF9nYW1tYV9vbmx5IChtbmdfZGF0YXAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfYm9vbCAgYkdsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICBiT2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2Jvb2wgIGJSZXRyb2JqKQoreworICBtbmdfZmxvYXQgICAgICBkR2FtbWE7CisgIG1uZ19pbWFnZXAgICAgIHBJbWFnZSA9IE1OR19OVUxMOworICBtbmdfaW1hZ2VkYXRhcCBwQnVmICAgPSBNTkdfTlVMTDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX0dBTU1BX09OTFksIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAoYk9iamVjdCkgICAgICAgICAgICAgICAgICAgICAgICAgLyogdXNlIG9iamVjdCBpZiBwcmVzZW50ID8gKi8KKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgb2JqZWN0ID8gKi8KKyAgICBpZiAoKG1uZ19pbWFnZXApcERhdGEtPnBDdXJyZW50b2JqKQorICAgICAgcEltYWdlID0gKG1uZ19pbWFnZXApcERhdGEtPnBDdXJyZW50b2JqOworICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgbm90OyB1c2Ugb2JqZWN0IDAgKi8KKyAgICAgIHBJbWFnZSA9IChtbmdfaW1hZ2VwKXBEYXRhLT5wT2JqemVybzsKKyAgfQorCisgIGlmIChiUmV0cm9iaikgICAgICAgICAgICAgICAgICAgICAgICAvKiByZXRyaWV2aW5nIGZyb20gYW4gb2JqZWN0ID8gKi8KKyAgICBwSW1hZ2UgPSAobW5nX2ltYWdlcClwRGF0YS0+cFJldHJpZXZlb2JqOworCisgIGlmIChwSW1hZ2UpICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhcmUgd2UgdXNpbmcgYW4gb2JqZWN0ID8gKi8KKyAgICBwQnVmID0gcEltYWdlLT5wSW1nYnVmOyAgICAgICAgICAgIC8qIHRoZW4gYWRkcmVzcyB0aGUgYnVmZmVyICovCisKKyAgaWYgKCghcEJ1ZikgfHwgKCFwQnVmLT5iQ29ycmVjdGVkKSkgIC8qIGlzIHRoZSBidWZmZXIgYWxyZWFkeSBjb3JyZWN0ZWQgPyAqLworICB7CisgICAgaWYgKChwQnVmKSAmJiAocEJ1Zi0+Ykhhc1NSR0IpKSAgICAvKiBnZXQgdGhlIGdhbW1hIHZhbHVlICovCisgICAgICBkR2FtbWEgPSAwLjQ1NDU1OworICAgIGVsc2UKKyAgICBpZiAoKHBCdWYpICYmIChwQnVmLT5iSGFzR0FNQSkpCisgICAgICBkR2FtbWEgPSAobW5nX2Zsb2F0KXBCdWYtPmlHYW1tYSAvIDEwMDAwMDsKKyAgICBlbHNlCisgICAgaWYgKChiR2xvYmFsKSAmJiAocERhdGEtPmJIYXNnbG9iYWxTUkdCKSkKKyAgICAgIGRHYW1tYSA9IDAuNDU0NTU7CisgICAgZWxzZQorICAgIGlmICgoYkdsb2JhbCkgJiYgKHBEYXRhLT5iSGFzZ2xvYmFsR0FNQSkpCisgICAgICBkR2FtbWEgPSAobW5nX2Zsb2F0KXBEYXRhLT5pR2xvYmFsR2FtbWEgLyAxMDAwMDA7CisgICAgZWxzZQorICAgICAgZEdhbW1hID0gcERhdGEtPmREZmx0aW1nZ2FtbWE7CisKKyAgICBpZiAoZEdhbW1hID4gMCkgICAgICAgICAgICAgICAgICAgIC8qIGlnbm9yZSBnYW1tYT0wICovCisgICAgeworICAgICAgZEdhbW1hID0gcERhdGEtPmRWaWV3Z2FtbWEgLyAoZEdhbW1hICogcERhdGEtPmREaXNwbGF5Z2FtbWEpOworCisgICAgICBpZiAoZEdhbW1hICE9IHBEYXRhLT5kTGFzdGdhbW1hKSAvKiBsb29rdXAgdGFibGUgbmVlZHMgdG8gYmUgY29tcHV0ZWQgPyAqLworICAgICAgeworICAgICAgICBtbmdfaW50MzIgaVg7CisKKyAgICAgICAgcERhdGEtPmFHYW1tYXRhYiBbMF0gPSAwOworCisgICAgICAgIGZvciAoaVggPSAxOyBpWCA8PSAyNTU7IGlYKyspCisgICAgICAgICAgcERhdGEtPmFHYW1tYXRhYiBbaVhdID0gKG1uZ191aW50OCkocG93IChpWCAvIDI1NS4wLCBkR2FtbWEpICogMjU1ICsgMC41KTsKKworICAgICAgICBwRGF0YS0+ZExhc3RnYW1tYSA9IGRHYW1tYTsgICAgLyoga2VlcCBmb3IgbmV4dCB0aW1lICovCisgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsb2FkIGNvbG9yLWNvcnJlY3Rpb24gcm91dGluZSAqLworICAgICAgcERhdGEtPmZDb3JyZWN0cm93ID0gKG1uZ19mcHRyKW1uZ19jb3JyZWN0X2dhbW1hX29ubHk7CisgICAgfQorICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSU5JVF9HQU1NQV9PTkxZLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZiAvKiBNTkdfR0FNTUFfT05MWSB8fCBNTkdfRlVMTF9DTVMgfHwgTU5HX0FQUF9DTVMgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmIGRlZmluZWQoTU5HX0dBTU1BX09OTFkpIHx8IGRlZmluZWQoTU5HX0ZVTExfQ01TKSB8fCBkZWZpbmVkKE1OR19BUFBfQ01TKQorbW5nX3JldGNvZGUgbW5nX2NvcnJlY3RfZ2FtbWFfb25seSAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfdWludDhwIHBXb3JrOworICBtbmdfaW50MzIgIGlYOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0NPUlJFQ1RfR0FNTUFfT05MWSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBXb3JrID0gcERhdGEtPnBSR0JBcm93OyAgICAgICAgICAgICAvKiBhZGRyZXNzIGludGVybWVkaWF0ZSByb3cgKi8KKworICBpZiAocERhdGEtPmJJc1JHQkExNikgICAgICAgICAgICAgICAgLyogMTYtYml0IGludGVybWVkaWF0ZSByb3cgPyAqLworICB7CisKKyAgCisgICAgIC8qIFRPRE86IDE2LWJpdCBwcmVjaXNpb24gZ2FtbWEgcHJvY2Vzc2luZyAqLworICAgICAvKiB3ZSdsbCBqdXN0IGRvIHRoZSBoaWdoLW9yZGVyIGJ5dGUgZm9yIG5vdyAqLworCisgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29udmVydCBhbGwgc2FtcGxlcyBpbiB0aGUgcm93ICovCisgICAgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVzaW5nIHRoZSBwcmVjYWxjdWxhdGVkIGdhbW1hIGxvb2t1cCB0YWJsZSAqLworICAgICAgICpwV29yayAgICAgPSBwRGF0YS0+YUdhbW1hdGFiIFsqcFdvcmtdOworICAgICAgICoocFdvcmsrMikgPSBwRGF0YS0+YUdhbW1hdGFiIFsqKHBXb3JrKzIpXTsKKyAgICAgICAqKHBXb3JrKzQpID0gcERhdGEtPmFHYW1tYXRhYiBbKihwV29yays0KV07CisKKyAgICAgICBwV29yayArPSA4OworICAgICB9CisgIH0KKyAgZWxzZQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29udmVydCBhbGwgc2FtcGxlcyBpbiB0aGUgcm93ICovCisgICAgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVzaW5nIHRoZSBwcmVjYWxjdWxhdGVkIGdhbW1hIGxvb2t1cCB0YWJsZSAqLworICAgICAgICpwV29yayAgICAgPSBwRGF0YS0+YUdhbW1hdGFiIFsqcFdvcmtdOworICAgICAgICoocFdvcmsrMSkgPSBwRGF0YS0+YUdhbW1hdGFiIFsqKHBXb3JrKzEpXTsKKyAgICAgICAqKHBXb3JrKzIpID0gcERhdGEtPmFHYW1tYXRhYiBbKihwV29yaysyKV07CisKKyAgICAgICBwV29yayArPSA0OworICAgICB9CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9DT1JSRUNUX0dBTU1BX09OTFksIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmIC8qIE1OR19HQU1NQV9PTkxZIHx8IE1OR19GVUxMX0NNUyB8fCBNTkdfQVBQX0NNUyAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX0FQUF9DTVMKK21uZ19yZXRjb2RlIG1uZ19pbml0X2FwcF9jbXMgKG1uZ19kYXRhcCBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICBiR2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2Jvb2wgIGJPYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfYm9vbCAgYlJldHJvYmopCit7CisgIG1uZ19pbWFnZXAgICAgIHBJbWFnZSA9IE1OR19OVUxMOworICBtbmdfaW1hZ2VkYXRhcCBwQnVmICAgPSBNTkdfTlVMTDsKKyAgbW5nX2Jvb2wgICAgICAgYkRvbmUgID0gTU5HX0ZBTFNFOworICBtbmdfcmV0Y29kZSAgICBpUmV0Y29kZTsKKyAgCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfQVBQX0NNUywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmIChiT2JqZWN0KSAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1c2Ugb2JqZWN0IGlmIHByZXNlbnQgPyAqLworICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBvYmplY3QgPyAqLworICAgIGlmICgobW5nX2ltYWdlcClwRGF0YS0+cEN1cnJlbnRvYmopCisgICAgICBwSW1hZ2UgPSAobW5nX2ltYWdlcClwRGF0YS0+cEN1cnJlbnRvYmo7CisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiBub3Q7IHVzZSBvYmplY3QgMCAqLworICAgICAgcEltYWdlID0gKG1uZ19pbWFnZXApcERhdGEtPnBPYmp6ZXJvOworICB9CisKKyAgaWYgKGJSZXRyb2JqKSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJldHJpZXZpbmcgZnJvbSBhbiBvYmplY3QgPyAqLworICAgIHBJbWFnZSA9IChtbmdfaW1hZ2VwKXBEYXRhLT5wUmV0cmlldmVvYmo7CisKKyAgaWYgKHBJbWFnZSkgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFyZSB3ZSB1c2luZyBhbiBvYmplY3QgPyAqLworICAgIHBCdWYgPSBwSW1hZ2UtPnBJbWdidWY7ICAgICAgICAgICAgLyogdGhlbiBhZGRyZXNzIHRoZSBidWZmZXIgKi8KKworICBpZiAoKCFwQnVmKSB8fCAoIXBCdWYtPmJDb3JyZWN0ZWQpKSAgLyogaXMgdGhlIGJ1ZmZlciBhbHJlYWR5IGNvcnJlY3RlZCA/ICovCisgIHsKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19pQ0NQCisgICAgaWYgKCAocERhdGEtPmZQcm9jZXNzaWNjcCkgJiYKKyAgICAgICAgICgoKHBCdWYpICYmIChwQnVmLT5iSGFzSUNDUCkpIHx8ICgoYkdsb2JhbCkgJiYgKHBEYXRhLT5iSGFzZ2xvYmFsSUNDUCkpKSApCisgICAgeworICAgICAgbW5nX3VpbnQzMiBpUHJvZmlsZXNpemU7CisgICAgICBtbmdfcHRyICAgIHBQcm9maWxlOworCisgICAgICBpZiAoKHBCdWYpICYmIChwQnVmLT5iSGFzSUNDUCkpICAvKiBnZXQgdGhlIHJpZ2h0IHByb2ZpbGUgKi8KKyAgICAgIHsKKyAgICAgICAgaVByb2ZpbGVzaXplID0gcEJ1Zi0+aVByb2ZpbGVzaXplOworICAgICAgICBwUHJvZmlsZSAgICAgPSBwQnVmLT5wUHJvZmlsZTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgaVByb2ZpbGVzaXplID0gcERhdGEtPmlHbG9iYWxQcm9maWxlc2l6ZTsKKyAgICAgICAgcFByb2ZpbGUgICAgID0gcERhdGEtPnBHbG9iYWxQcm9maWxlOworICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5mb3JtIHRoZSBhcHAgKi8KKyAgICAgIGlmICghcERhdGEtPmZQcm9jZXNzaWNjcCAoKG1uZ19oYW5kbGUpcERhdGEsIGlQcm9maWxlc2l6ZSwgcFByb2ZpbGUpKQorICAgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfQVBQQ01TRVJST1IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbG9hZCBjb2xvci1jb3JyZWN0aW9uIHJvdXRpbmUgKi8KKyAgICAgIHBEYXRhLT5mQ29ycmVjdHJvdyA9IChtbmdfZnB0ciltbmdfY29ycmVjdF9hcHBfY21zOworICAgICAgYkRvbmUgICAgICAgICAgICAgID0gTU5HX1RSVUU7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoIChwRGF0YS0+ZlByb2Nlc3NzcmdiKSAmJgorICAgICAgICAgKCgocEJ1ZikgJiYgKHBCdWYtPmJIYXNTUkdCKSkgfHwgKChiR2xvYmFsKSAmJiAocERhdGEtPmJIYXNnbG9iYWxTUkdCKSkpICkKKyAgICB7CisgICAgICBtbmdfdWludDggaUludGVudDsKKworICAgICAgaWYgKChwQnVmKSAmJiAocEJ1Zi0+Ykhhc1NSR0IpKSAgLyogZGV0ZXJtaW5lIHJlbmRlcmluZyBpbnRlbnQgKi8KKyAgICAgICAgaUludGVudCA9IHBCdWYtPmlSZW5kZXJpbmdpbnRlbnQ7CisgICAgICBlbHNlCisgICAgICAgIGlJbnRlbnQgPSBwRGF0YS0+aUdsb2JhbFJlbmRpbnRlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbmZvcm0gdGhlIGFwcCAqLworICAgICAgaWYgKCFwRGF0YS0+ZlByb2Nlc3NzcmdiICgobW5nX2hhbmRsZSlwRGF0YSwgaUludGVudCkpCisgICAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19BUFBDTVNFUlJPUik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsb2FkIGNvbG9yLWNvcnJlY3Rpb24gcm91dGluZSAqLworICAgICAgcERhdGEtPmZDb3JyZWN0cm93ID0gKG1uZ19mcHRyKW1uZ19jb3JyZWN0X2FwcF9jbXM7CisgICAgICBiRG9uZSAgICAgICAgICAgICAgPSBNTkdfVFJVRTsKKyAgICB9CisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19jSFJNCisgICAgaWYgKCAocERhdGEtPmZQcm9jZXNzY2hyb21hKSAmJgorICAgICAgICAgKCgocEJ1ZikgJiYgKHBCdWYtPmJIYXNDSFJNKSkgfHwgKChiR2xvYmFsKSAmJiAocERhdGEtPmJIYXNnbG9iYWxDSFJNKSkpICkKKyAgICB7CisgICAgICBtbmdfdWludDMyIGlXaGl0ZXBvaW50eCwgICBpV2hpdGVwb2ludHk7CisgICAgICBtbmdfdWludDMyIGlQcmltYXJ5cmVkeCwgICBpUHJpbWFyeXJlZHk7CisgICAgICBtbmdfdWludDMyIGlQcmltYXJ5Z3JlZW54LCBpUHJpbWFyeWdyZWVueTsKKyAgICAgIG1uZ191aW50MzIgaVByaW1hcnlibHVleCwgIGlQcmltYXJ5Ymx1ZXk7CisKKyAgICAgIGlmICgocEJ1ZikgJiYgKHBCdWYtPmJIYXNDSFJNKSkgIC8qIGxvY2FsIGNIUk0gPyAqLworICAgICAgeworICAgICAgICBpV2hpdGVwb2ludHggICA9IHBCdWYtPmlXaGl0ZXBvaW50eDsKKyAgICAgICAgaVdoaXRlcG9pbnR5ICAgPSBwQnVmLT5pV2hpdGVwb2ludHk7CisgICAgICAgIGlQcmltYXJ5cmVkeCAgID0gcEJ1Zi0+aVByaW1hcnlyZWR4OworICAgICAgICBpUHJpbWFyeXJlZHkgICA9IHBCdWYtPmlQcmltYXJ5cmVkeTsKKyAgICAgICAgaVByaW1hcnlncmVlbnggPSBwQnVmLT5pUHJpbWFyeWdyZWVueDsKKyAgICAgICAgaVByaW1hcnlncmVlbnkgPSBwQnVmLT5pUHJpbWFyeWdyZWVueTsKKyAgICAgICAgaVByaW1hcnlibHVleCAgPSBwQnVmLT5pUHJpbWFyeWJsdWV4OworICAgICAgICBpUHJpbWFyeWJsdWV5ICA9IHBCdWYtPmlQcmltYXJ5Ymx1ZXk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGlXaGl0ZXBvaW50eCAgID0gcERhdGEtPmlHbG9iYWxXaGl0ZXBvaW50eDsKKyAgICAgICAgaVdoaXRlcG9pbnR5ICAgPSBwRGF0YS0+aUdsb2JhbFdoaXRlcG9pbnR5OworICAgICAgICBpUHJpbWFyeXJlZHggICA9IHBEYXRhLT5pR2xvYmFsUHJpbWFyeXJlZHg7CisgICAgICAgIGlQcmltYXJ5cmVkeSAgID0gcERhdGEtPmlHbG9iYWxQcmltYXJ5cmVkeTsKKyAgICAgICAgaVByaW1hcnlncmVlbnggPSBwRGF0YS0+aUdsb2JhbFByaW1hcnlncmVlbng7CisgICAgICAgIGlQcmltYXJ5Z3JlZW55ID0gcERhdGEtPmlHbG9iYWxQcmltYXJ5Z3JlZW55OworICAgICAgICBpUHJpbWFyeWJsdWV4ICA9IHBEYXRhLT5pR2xvYmFsUHJpbWFyeWJsdWV4OworICAgICAgICBpUHJpbWFyeWJsdWV5ICA9IHBEYXRhLT5pR2xvYmFsUHJpbWFyeWJsdWV5OworICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5mb3JtIHRoZSBhcHAgKi8KKyAgICAgIGlmICghcERhdGEtPmZQcm9jZXNzY2hyb21hICgobW5nX2hhbmRsZSlwRGF0YSwgaVdoaXRlcG9pbnR4LCAgIGlXaGl0ZXBvaW50eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVByaW1hcnlyZWR4LCAgIGlQcmltYXJ5cmVkeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVByaW1hcnlncmVlbngsIGlQcmltYXJ5Z3JlZW55LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpUHJpbWFyeWJsdWV4LCAgaVByaW1hcnlibHVleSkpCisgICAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19BUFBDTVNFUlJPUik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsb2FkIGNvbG9yLWNvcnJlY3Rpb24gcm91dGluZSAqLworICAgICAgcERhdGEtPmZDb3JyZWN0cm93ID0gKG1uZ19mcHRyKW1uZ19jb3JyZWN0X2FwcF9jbXM7CisgICAgICBiRG9uZSAgICAgICAgICAgICAgPSBNTkdfVFJVRTsKKyAgICB9CisjZW5kaWYKKworICAgIGlmICggKHBEYXRhLT5mUHJvY2Vzc2dhbW1hKSAmJgorICAgICAgICAgKCgocEJ1ZikgJiYgKHBCdWYtPmJIYXNHQU1BKSkgfHwgKChiR2xvYmFsKSAmJiAocERhdGEtPmJIYXNnbG9iYWxHQU1BKSkpICkKKyAgICB7CisgICAgICBtbmdfdWludDMyIGlHYW1tYTsKKworICAgICAgaWYgKChwQnVmKSAmJiAocEJ1Zi0+Ykhhc0dBTUEpKSAgLyogZ2V0IHRoZSBnYW1tYSB2YWx1ZSAqLworICAgICAgICBpR2FtbWEgPSBwQnVmLT5pR2FtbWE7CisgICAgICBlbHNlCisgICAgICAgIGlHYW1tYSA9IHBEYXRhLT5pR2xvYmFsR2FtbWE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbmZvcm0gdGhlIGFwcCAqLworICAgICAgaWYgKCFwRGF0YS0+ZlByb2Nlc3NnYW1tYSAoKG1uZ19oYW5kbGUpcERhdGEsIGlHYW1tYSkpCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhcHAgd2FudHMgdXMgdG8gdXNlIGludGVybmFsIHJvdXRpbmVzICEgKi8KKyAgICAgICAgaVJldGNvZGUgPSBtbmdfaW5pdF9nYW1tYV9vbmx5IChwRGF0YSwgYkdsb2JhbCwgYk9iamVjdCwgYlJldHJvYmopOworICAgICAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsb2FkIGNvbG9yLWNvcnJlY3Rpb24gcm91dGluZSAqLworICAgICAgICBwRGF0YS0+ZkNvcnJlY3Ryb3cgPSAobW5nX2ZwdHIpbW5nX2NvcnJlY3RfYXBwX2NtczsKKyAgICAgIH0KKworICAgICAgYkRvbmUgPSBNTkdfVFJVRTsKKyAgICB9CisKKyAgICBpZiAoIWJEb25lKSAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vIGNvbG9yLWluZm8gYXQgYWxsID8gKi8KKyAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGVuIHVzZSBkZWZhdWx0IGltYWdlIGdhbW1hICEgKi8KKyAgICAgIGlmICghcERhdGEtPmZQcm9jZXNzZ2FtbWEgKChtbmdfaGFuZGxlKXBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ191aW50MzIpKChwRGF0YS0+ZERmbHRpbWdnYW1tYSAqIDEwMDAwMCkgKyAwLjUpKSkKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFwcCB3YW50cyB1cyB0byB1c2UgaW50ZXJuYWwgcm91dGluZXMgISAqLworICAgICAgICBpUmV0Y29kZSA9IG1uZ19pbml0X2dhbW1hX29ubHkgKHBEYXRhLCBiR2xvYmFsLCBiT2JqZWN0LCBiUmV0cm9iaik7CisgICAgICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxvYWQgY29sb3ItY29ycmVjdGlvbiByb3V0aW5lICovCisgICAgICAgIHBEYXRhLT5mQ29ycmVjdHJvdyA9IChtbmdfZnB0ciltbmdfY29ycmVjdF9hcHBfY21zOworICAgICAgfSAgCisgICAgfQorICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSU5JVF9BUFBfQ01TLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZiAvKiBNTkdfQVBQX0NNUyAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX0FQUF9DTVMKK21uZ19yZXRjb2RlIG1uZ19jb3JyZWN0X2FwcF9jbXMgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQ09SUkVDVF9BUFBfQ01TLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKHBEYXRhLT5mUHJvY2Vzc2Fyb3cpICAgICAgICAgICAgIC8qIGxldCB0aGUgYXBwIGRvIHNvbWV0aGluZyB3aXRoIG91ciByb3cgKi8KKyAgICBpZiAoIXBEYXRhLT5mUHJvY2Vzc2Fyb3cgKChtbmdfaGFuZGxlKXBEYXRhLCBwRGF0YS0+aVJvd3NhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+YklzUkdCQTE2LCBwRGF0YS0+cFJHQkFyb3cpKQorICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0FQUENNU0VSUk9SKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9DT1JSRUNUX0FQUF9DTVMsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmIC8qIE1OR19BUFBfQ01TICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNlbmRpZiAvKiBNTkdfSU5DTFVERV9ESVNQTEFZX1BST0NTICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqIGVuZCBvZiBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworCisKZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9MaWJNTkcvbGlibW5nX2Ntcy5oIGIvZmlsZXMvU291cmNlL0xpYk1ORy9saWJtbmdfY21zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ1OWY4MAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9MaWJNTkcvbGlibW5nX2Ntcy5oCkBAIC0wLDAgKzEsOTIgQEAKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBsaWJtbmcuaCAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBwcm9qZWN0ICAgOiBsaWJtbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogZmlsZSAgICAgIDogbGlibW5nX2Ntcy5oICAgICAgICAgICAgICBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBHLkp1eW4gICAqICovCisvKiAqIHZlcnNpb24gICA6IDEuMC42ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogcHVycG9zZSAgIDogY29sb3IgbWFuYWdlbWVudCByb3V0aW5lcyAoZGVmaW5pdGlvbikgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBhdXRob3IgICAgOiBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGNvbW1lbnQgICA6IERlZmluaXRpb24gb2YgY29sb3IgbWFuYWdlbWVudCByb3V0aW5lcyAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogY2hhbmdlcyAgIDogMC41LjEgLSAwNS8wOC8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2hhbmdlZCBzdHJpY3QtQU5TSSBzdHVmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMSAtIDA1LzExLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBjcmVhdGVtZW1wcm9maWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMiAtIDA4LzA1LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjaGFuZ2VkIGZpbGUtcHJlZml4ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuMSAtIDA0LzI1LzIwMDEgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBtb3ZlZCBtbmdfY2xlYXJfY21zIHRvIGxpYm1uZ19jbXMgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC4xIC0gMDUvMDIvMjAwMSAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkICJkZWZhdWx0IiBzUkdCIGdlbmVyYXRpb24gKFRoYW5rcyBNYXJ0aSEpICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC41IC0gMDgvMTkvMjAwMiAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIEI1OTcxMzQgLSBsaWJtbmcgcG9sbHV0ZXMgdGhlIGxpbmtlciBuYW1lc3BhY2UgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAwOS8xOS8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gb3B0aW1pemVkIGNvbG9yLWNvcnJlY3Rpb24gcm91dGluZXMgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjYgLSAwNC8xMS8yMDAzIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gQjcxOTQyMCAtIGZpeGVkIHNldmVyYWwgTU5HX0FQUF9DTVMgcHJvYmxlbXMgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZiBkZWZpbmVkKF9fQk9STEFORENfXykgJiYgZGVmaW5lZChNTkdfU1RSSUNUX0FOU0kpCisjcHJhZ21hIG9wdGlvbiAtQSAgICAgICAgICAgICAgICAgICAgICAvKiBmb3JjZSBBTlNJLUMgKi8KKyNlbmRpZgorCisjaWZuZGVmIF9saWJtbmdfY21zX2hfCisjZGVmaW5lIF9saWJtbmdfY21zX2hfCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfSU5DTFVERV9MQ01TCit2b2lkICAgICAgICBtbmdsY21zX2luaXRsaWJyYXJ5ICAgICAgICh2b2lkKTsKK21uZ19jbXNwcm9mIG1uZ2xjbXNfY3JlYXRlZmlsZXByb2ZpbGUgKG1uZ19wY2hhciAgICB6RmlsZW5hbWUpOworbW5nX2Ntc3Byb2YgbW5nbGNtc19jcmVhdGVtZW1wcm9maWxlICAobW5nX3VpbnQzMiAgIGlQcm9maWxlc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wdHIgICAgICBwUHJvZmlsZSApOworbW5nX2Ntc3Byb2YgbW5nbGNtc19jcmVhdGVzcmdicHJvZmlsZSAodm9pZCk7Cit2b2lkICAgICAgICBtbmdsY21zX2ZyZWVwcm9maWxlICAgICAgIChtbmdfY21zcHJvZiAgaFByb2YgICAgKTsKK3ZvaWQgICAgICAgIG1uZ2xjbXNfZnJlZXRyYW5zZm9ybSAgICAgKG1uZ19jbXN0cmFucyBoVHJhbnMgICApOworCittbmdfcmV0Y29kZSBtbmdfY2xlYXJfY21zICAgICAgICAgICAgIChtbmdfZGF0YXAgICAgcERhdGEgICAgKTsKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX0ZVTExfQ01TCittbmdfcmV0Y29kZSBtbmdfaW5pdF9mdWxsX2NtcyAgICAgICAgICAobW5nX2RhdGFwIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICBiR2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICBiT2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICBiUmV0cm9iaik7CittbmdfcmV0Y29kZSBtbmdfY29ycmVjdF9mdWxsX2NtcyAgICAgICAobW5nX2RhdGFwIHBEYXRhKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChNTkdfRlVMTF9DTVMpIHx8IGRlZmluZWQoTU5HX0dBTU1BX09OTFkpIHx8IGRlZmluZWQoTU5HX0FQUF9DTVMpCittbmdfcmV0Y29kZSBtbmdfaW5pdF9nYW1tYV9vbmx5ICAgICAgICAobW5nX2RhdGFwIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICBiR2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICBiT2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICBiUmV0cm9iaik7CittbmdfcmV0Y29kZSBtbmdfY29ycmVjdF9nYW1tYV9vbmx5ICAgICAobW5nX2RhdGFwIHBEYXRhKTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX0FQUF9DTVMKK21uZ19yZXRjb2RlIG1uZ19pbml0X2FwcF9jbXMgICAgICAgICAgIChtbmdfZGF0YXAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2Jvb2wgIGJHbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2Jvb2wgIGJPYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2Jvb2wgIGJSZXRyb2JqKTsKK21uZ19yZXRjb2RlIG1uZ19jb3JyZWN0X2FwcF9jbXMgICAgICAgIChtbmdfZGF0YXAgcERhdGEpOworI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNlbmRpZiAvKiBfbGlibW5nX2Ntc19oXyAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiBlbmQgb2YgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCmRpZmYgLS1naXQgYS9maWxlcy9Tb3VyY2UvTGliTU5HL2xpYm1uZ19jb25mLmggYi9maWxlcy9Tb3VyY2UvTGliTU5HL2xpYm1uZ19jb25mLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUwOTI1ZQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9MaWJNTkcvbGlibW5nX2NvbmYuaApAQCAtMCwwICsxLDMwNiBAQAorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIHByb2plY3QgICA6IGxpYm1uZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBmaWxlICAgICAgOiBsaWJtbmdfY29uZi5oICAgICAgICAgICAgIGNvcHlyaWdodCAoYykgRy5KdXluIDIwMDAtMjAwNCAgICogKi8KKy8qICogdmVyc2lvbiAgIDogMS4wLjkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBwdXJwb3NlICAgOiBtYWluIGNvbmZpZ3VyYXRpb24gZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGF1dGhvciAgICA6IEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogY29tbWVudCAgIDogVGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4gQ2hhbmdlIHRoaXMgdG8gaW5jbHVkZS9leGNsdWRlICAgICAqICovCisvKiAqICAgICAgICAgICAgIHRoZSBvcHRpb25zIHlvdSB3YW50IG9yIGRvIG5vdCB3YW50IGluIGxpYm1uZy4gICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogY2hhbmdlcyAgIDogMC41LjIgLSAwNi8wMi8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gc2VwYXJhdGVkIGNvbmZpZ3VyYXRpb24tb3B0aW9ucyBpbnRvIHRoaXMgZmlsZSAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNoYW5nZWQgdG8gbW9zdCBsaWtlbHkgY29uZmlndXJhdGlvbiAoPykgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjIgLSAwNi8wMy8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2hhbmdlZCBvcHRpb25zIHRvIGNyZWF0ZSBhIHN0YW5kYXJkIHNvLWxpYnJhcnkgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgIHdpdGggZXZlcnl0aGluZyBlbmFibGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjIgLSAwNi8wNC8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2hhbmdlZCBvcHRpb25zIHRvIGNyZWF0ZSBhIHN0YW5kYXJkIHdpbjMyLWRsbCAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgIHdpdGggZXZlcnl0aGluZyBlbmFibGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4yIC0gMDgvMDUvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNoYW5nZWQgZmlsZS1wcmVmaXhlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4zIC0gMDgvMTIvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHdvcmthcm91bmQgZm9yIGZhdWx0eSBQaG90b1Nob3AgaUNDUCBjaHVuayAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjMgLSAwOS8xNi8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gcmVtb3ZlZCB0cmFjZS1vcHRpb25zIGZyb20gZGVmYXVsdCBTTy9ETEwgYnVpbGRzICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjQgLSAwNi8yMi8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gQjUyNjEzOCAtIHJldHVybmVkIElKR1NSQzZCIGNhbGxpbmcgY29udmVudGlvbiB0byAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgIGRlZmF1bHQgZm9yIE1TVkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC41IC0gMDkvMTQvMjAwMiAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGV2ZW50IGhhbmRsaW5nIGZvciBkeW5hbWljIE1ORyAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCAnc3VwcG9ydHMnIGNhbGwgdG8gY2hlY2sgZnVuY3Rpb24gYXZhaWxhYmlsaXR5ICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNiAtIDA2LzIyLzIwMDIgLSBHLlItUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBNTkdfTk9fSU5DTFVERV9KTkcgY29uZGl0aW9uYWwgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgTU5HX1NLSVBDSFVOS19ldk5UIGNvbmRpdGlvbmFsICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNiAtIDA3LzE0LzIwMDIgLSBHLlItUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBNTkdfTk9fU1VQUE9SVF9GVU5DUVVFUlkgY29uZGl0aW9uYWwgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNyAtIDAzLzA3LzIwMDQgLSBHLlItUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBNTkdfVkVSU0lPTl9RVUVSWV9TVVBQT1JUXyBjb25kaXRpb25hbCAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuOSAtIDA1LzEyLzIwMDQgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjbGVhcmlmaWVkIE1OR19CSUdFTkRJQU5fU1VQUE9SVEVEIGNvbmRpdGlvbmFsICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgTU5HX0xJVFRMRUVORElBTl9TVVBQT1JURUQgY29uZGl0aW9uYWwgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKworI2lmIGRlZmluZWQoX19CT1JMQU5EQ19fKSAmJiBkZWZpbmVkKE1OR19TVFJJQ1RfQU5TSSkKKyNwcmFnbWEgb3B0aW9uIC1BICAgICAgICAgICAgICAgICAgICAgIC8qIGZvcmNlIEFOU0ktQyAqLworI2VuZGlmCisKKyNpZm5kZWYgX2xpYm1uZ19jb25mX2hfCisjZGVmaW5lIF9saWJtbmdfY29uZl9oXworCisjaWZkZWYgTU5HX01PWklMTEFfQ0ZHCisjaW5jbHVkZSAic3BlY2lhbFxtb3pjZmdcbW96bGlibW5nY29uZi5oIgorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgVXNlci1zZWxlY3RhYmxlIGNvbXBpbGUtdGltZSBvcHRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogYWRkZWQgYnkgRnJlZUltYWdlICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjZGVmaW5lIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFCisjZGVmaW5lIE1OR19PUFRJTUlaRV9PQkpDTEVBTlVQCisjZGVmaW5lIE1OR19PUFRJTUlaRV9DSFVOS0FTU0lHTgorI2RlZmluZSBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworLyogZW5hYmxlIGV4YWN0bHkgb25lKDEpIG9mIHRoZSBNTkctKHN1YilzZXQgc2VsZWN0b3JzICovCisvKiB1c2UgdGhpcyB0byBzZWxlY3Qgd2hpY2ggKHN1YilzZXQgb2YgdGhlIE1ORyBzcGVjaWZpY2F0aW9uIHlvdSB3aXNoCisgICB0byBzdXBwb3J0ICovCisvKiBnZW5lcmFsbHkgeW91J2xsIHdhbnQgZnVsbCBzdXBwb3J0IGFzIHRoZSBsaWJyYXJ5IHByb3ZpZGVzIGl0IGF1dG9tYXRpY2FsbHkKKyAgIGZvciB5b3UhIGlmIHlvdSdyZSByZWFsbHkgc3RydW5nIG9uIG1lbW9yeS1yZXF1aXJlbWVudHMgeW91IGNhbiBvcHQKKyAgIHRvIGVuYWJsZSBsZXNzIHN1cHBvcnQgKGJ1dCBpdCdzIGp1c3QgTk9UIGEgZ29vZCBpZGVhISkgKi8KKy8qIE5PVEUgdGhhdCB0aGlzIGlzbid0IGFjdHVhbGx5IGltcGxlbWVudGVkIHlldCAqLworCisjaWYgIWRlZmluZWQoTU5HX1NVUFBPUlRfRlVMTCkgJiYgIWRlZmluZWQoTU5HX1NVUFBPUlRfTEMpICYmICFkZWZpbmVkKE1OR19TVVBQT1JUX1ZMQykKKyNkZWZpbmUgTU5HX1NVUFBPUlRfRlVMTAorLyogI2RlZmluZSBNTkdfU1VQUE9SVF9MQyAqLworLyogI2RlZmluZSBNTkdfU1VQUE9SVF9WTEMgKi8KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisvKiBlbmFibGUgSlBFRyBzdXBwb3J0IGlmIHJlcXVpcmVkICovCisvKiB1c2UgdGhpcyB0byBlbmFibGUgdGhlIEpORyBzdXBwb3J0IHJvdXRpbmVzICovCisvKiB0aGlzIHJlcXVpcmVzIGFuIGV4dGVybmFsIGpwZWcgcGFja2FnZTsKKyAgIGN1cnJlbnRseSBvbmx5IElKRydzIGpwZ3NyYzZiIGlzIHN1cHBvcnRlZCEgKi8KKy8qIE5PVEUgdGhhdCB0aGUgSUpHIGNvZGUgY2FuIGJlIGVpdGhlciA4LSBvciAxMi1iaXQgKGVnLiBub3QgYm90aCk7CisgICBzbyBjaG9vc2UgdGhlIG9uZSB5b3UndmUgZGVmaW5lZCBpbiBqY29uZmlnLmg7IGlmIHlvdSBkb24ndCBrbm93IHdoYXQKKyAgIHRoZSBoZWNrIEknbSB0YWxraW5nIGFib3V0LCBqdXN0IGxlYXZlIGl0IGF0IDgtYml0IHN1cHBvcnQgKHRoYW5rIHlvdSEpICovCisKKyNpZm5kZWYgTU5HX05PX0lOQ0xVREVfSk5HCisjaWZkZWYgTU5HX1NVUFBPUlRfRlVMTCAgICAgICAgICAgICAgICAvKiBmdWxsIHN1cHBvcnQgaW5jbHVkZXMgSk5HICovCisjZGVmaW5lIE1OR19TVVBQT1JUX0lKRzZCCisjZW5kaWYKKworI2lmbmRlZiBNTkdfU1VQUE9SVF9JSkc2QgorI2lmIGRlZmluZWQoTU5HX0JVSUxEX1NPKSB8fCBkZWZpbmVkKE1OR19VU0VfU08pIHx8IGRlZmluZWQoTU5HX0JVSUxEX0RMTCkgfHwgZGVmaW5lZChNTkdfVVNFX0RMTCkKKyNkZWZpbmUgTU5HX1NVUFBPUlRfSUpHNkIKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKE1OR19TVVBQT1JUX0lKRzZCKSAmJiAhZGVmaW5lZChNTkdfU1VQUE9SVF9KUEVHOCkgJiYgIWRlZmluZWQoTU5HX1NVUFBPUlRfSlBFRzEyKQorI2RlZmluZSBNTkdfU1VQUE9SVF9KUEVHOAorLyogI2RlZmluZSBNTkdfU1VQUE9SVF9KUEVHMTIgKi8KKyNlbmRpZgorCisvKiBUaGUgZm9sbG93aW5nIGlzIHJlcXVpcmVkIHRvIGV4cG9ydCB0aGUgSUpHIHJvdXRpbmVzIGZyb20gdGhlIERMTCBpbgorICAgdGhlIFdpbmRvd3Mtc3RhbmRhcmQgY2FsbGluZyBjb252ZW50aW9uOworICAgY3VycmVudGx5IHRoaXMgb25seSB3b3JrcyBmb3IgQm9ybGFuZCBDKysgISEhICovCisKKyNpZiBkZWZpbmVkKE1OR19CVUlMRF9ETEwpIHx8IGRlZmluZWQoTU5HX1VTRV9ETEwpCisjaWYgZGVmaW5lZChNTkdfU1VQUE9SVF9JSkc2QikgJiYgZGVmaW5lZChfX0JPUkxBTkRDX18pCisjZGVmaW5lIE1OR19ERUZJTkVfSlBFR19TVERDQUxMCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKy8qIGVuYWJsZSByZXF1aXJlZCBoaWdoLWxldmVsIGZ1bmN0aW9ucyAqLworLyogdXNlIHRoaXMgdG8gc2VsZWN0IHRoZSBoaWdoLWxldmVsIGZ1bmN0aW9ucyB5b3UgcmVxdWlyZSAqLworLyogaWYgeW91IG9ubHkgbmVlZCB0byBkaXNwbGF5IGEgTU5HLCBkaXNhYmxlIHdyaXRlIHN1cHBvcnQhICovCisvKiBpZiB5b3Ugb25seSBuZWVkIHRvIGV4YW1pbmUgYSBNTkcsIGRpc2FibGUgd3JpdGUgJiBkaXNwbGF5IHN1cHBvcnQhICovCisvKiBpZiB5b3Ugb25seSBuZWVkIHRvIGNvcHkgYSBNTkcsIGRpc2FibGUgZGlzcGxheSBzdXBwb3J0ISAqLworLyogaWYgeW91IG9ubHkgbmVlZCB0byBjcmVhdGUgYSBNTkcsIGRpc2FibGUgcmVhZCAmIGRpc3BsYXkgc3VwcG9ydCEgKi8KKy8qIE5PVEUgdGhhdCB0dXJuaW5nIGFsbCBvcHRpb25zIG9mZiB3aWxsIGJlIHZlcnkgdW51c2VmdWwhICovCisKKyNpZiAhZGVmaW5lZChNTkdfU1VQUE9SVF9SRUFEKSAmJiAhZGVmaW5lZChNTkdfU1VQUE9SVF9XUklURSkgJiYgIWRlZmluZWQoTU5HX1NVUFBPUlRfRElTUExBWSkKKyNkZWZpbmUgTU5HX1NVUFBPUlRfUkVBRAorI2lmIGRlZmluZWQoTU5HX0JVSUxEX1NPKSB8fCBkZWZpbmVkKE1OR19VU0VfU08pIHx8IGRlZmluZWQoTU5HX0JVSUxEX0RMTCkgfHwgZGVmaW5lZChNTkdfVVNFX0RMTCkKKyNkZWZpbmUgTU5HX1NVUFBPUlRfV1JJVEUKKyNlbmRpZgorI2RlZmluZSBNTkdfU1VQUE9SVF9ESVNQTEFZCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworLyogZW5hYmxlIGNodW5rIGFjY2VzcyBmdW5jdGlvbnMgKi8KKy8qIHVzZSB0aGlzIHRvIHNlbGVjdCB3aGV0aGVyIHlvdSBuZWVkIGFjY2VzcyB0byB0aGUgaW5kaXZpZHVhbCBjaHVua3MgKi8KKy8qIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byBleGFtaW5lIGEgcmVhZCBNTkcgKHlvdSdsbCBhbHNvIG5lZWQgTU5HX1NUT1JFX0NIVU5LUyAhKSovCisvKiByZXF1aXJlZCBpZiB5b3UgbmVlZCB0byBjcmVhdGUgJiB3cml0ZSBhIG5ldyBNTkchICovCisKKyNpZm5kZWYgTU5HX0FDQ0VTU19DSFVOS1MKKyNpZiBkZWZpbmVkKE1OR19CVUlMRF9TTykgfHwgZGVmaW5lZChNTkdfVVNFX1NPKSB8fCBkZWZpbmVkKE1OR19CVUlMRF9ETEwpIHx8IGRlZmluZWQoTU5HX1VTRV9ETEwpCisjZGVmaW5lIE1OR19BQ0NFU1NfQ0hVTktTCisjZW5kaWYKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisvKiBlbmFibGUgZXhhY3RseSBvbmUoMSkgb2YgdGhlIGNvbG9yLW1hbmFnZW1lbnQgZnVuY3Rpb25hbGl0eSBzZWxlY3RvcnMgKi8KKy8qIHVzZSB0aGlzIHRvIHNlbGVjdCB0aGUgbGV2ZWwgb2YgYXV0b21hdGljIGNvbG9yIHN1cHBvcnQgKi8KKy8qIE1OR19GVUxMX0NNUyByZXF1aXJlcyB0aGUgbGNtcyAobGl0dGxlIGNtcykgZXh0ZXJuYWwgcGFja2FnZSAhICovCisvKiBpZiB5b3Ugd2FudCB5b3VyIG93biBhcHAgKG9yIHRoZSBPUykgdG8gaGFuZGxlIGNvbG9yLW1hbmFnZW1lbnQKKyAgIHNlbGVjdCBNTkdfQVBQX0NNUyAqLworCisjZGVmaW5lIE1OR19HQU1NQV9PTkxZCisvKiAjZGVmaW5lIE1OR19GVUxMX0NNUyAqLworLyogI2RlZmluZSBNTkdfQVBQX0NNUyAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisvKiBlbmFibGUgYXV0b21hdGljIGRpdGhlcmluZyAqLworLyogdXNlIHRoaXMgaWYgeW91IG5lZWQgZGl0aGVyaW5nIHN1cHBvcnQgdG8gY29udmVydCBoaWdoLXJlc29sdXRpb24KKyAgIGltYWdlcyB0byBhIGxvdy1yZXNvbHV0aW9uIG91dHB1dC1kZXZpY2UgKi8KKy8qIE5PVEUgdGhhdCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQgeWV0ICovCisKKy8qICNkZWZpbmUgTU5HX0FVVE9fRElUSEVSICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKy8qIGVuYWJsZSB3aGV0aGVyIGNodW5rcyBzaG91bGQgYmUgc3RvcmVkIGZvciByZWZlcmVuY2UgbGF0ZXIgKi8KKy8qIHVzZSB0aGlzIGlmIHlvdSBuZWVkIHRvIGV4YW1pbmUgdGhlIGNodW5rcyBvZiBhIE1ORyB5b3UgaGF2ZSByZWFkLAorICAgb3IgKHJlLSl3cml0ZSBhIE1ORyB5b3UgaGF2ZSByZWFkICovCisvKiB0dXJuIHRoaXMgb2ZmIGlmIHlvdSB3YW50IHRvIHJlZHVjZSBtZW1vcnktY29uc3VtcHRpb24gKi8KKworI2lmbmRlZiBNTkdfU1RPUkVfQ0hVTktTCisjaWYgZGVmaW5lZChNTkdfQlVJTERfU08pIHx8IGRlZmluZWQoTU5HX1VTRV9TTykgfHwgZGVmaW5lZChNTkdfQlVJTERfRExMKSB8fCBkZWZpbmVkKE1OR19VU0VfRExMKQorI2RlZmluZSBNTkdfU1RPUkVfQ0hVTktTCisjZW5kaWYKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisvKiBlbmFibGUgaW50ZXJuYWwgbWVtb3J5IG1hbmFnZW1lbnQgKGlmIHlvdXIgY29tcGlsZXIgc3VwcG9ydHMgaXQpICovCisvKiB1c2UgdGhpcyBpZiB5b3VyIGNvbXBpbGVyIHN1cHBvcnRzIHRoZSAnc3RhbmRhcmQnIG1lbW9yeSBmdW5jdGlvbnMKKyAgIChjYWxsb2MgJiBmcmVlKSwgYW5kIHlvdSB3YW50IHRoZSBsaWJyYXJ5IHRvIHVzZSB0aGVzZSBmdW5jdGlvbnMgYW5kIG5vdAorICAgYm90aGVyIHlvdXIgYXBwIHdpdGggbWVtb3J5LWNhbGxiYWNrcyAqLworCisvKiAjZGVmaW5lIE1OR19JTlRFUk5BTF9NRU1NTkdNVCAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisvKiBlbmFibGUgaW50ZXJuYWwgdHJhY2luZy1mdW5jdGlvbmFsaXR5IChtYW51YWwgZGVidWdnaW5nIHB1cnBvc2VzKSAqLworLyogdXNlIHRoaXMgaWYgeW91IGhhdmUgdHJvdWJsZSBsb2NhdGlvbiBidWdzIG9yIHByb2JsZW1zICovCisvKiBOT1RFIHRoYXQgeW91J2xsIG5lZWQgdG8gc3BlY2lmeSB0aGUgdHJhY2UgY2FsbGJhY2sgZnVuY3Rpb24hICovCisKKy8qICNkZWZpbmUgTU5HX1NVUFBPUlRfVFJBQ0UgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworLyogZW5hYmxlIGV4dGVuZGVkIGVycm9yLSBhbmQgdHJhY2UtdGVsbHRhbGluZyAqLworLyogdXNlIHRoaXMgaWYgeW91IG5lZWQgZXhwbGFuYXRvcnkgbWVzc2FnZXMgd2l0aCBlcnJvcnMgYW5kL29yIHRyYWNpbmcgKi8KKworI2lmICFkZWZpbmVkKE1OR19FUlJPUl9URUxMVEFMRSkgJiYgIWRlZmluZWQoTU5HX1RSQUNFX1RFTExUQUxFKQorI2lmIGRlZmluZWQoTU5HX0JVSUxEX1NPKSB8fCBkZWZpbmVkKE1OR19VU0VfU08pIHx8IGRlZmluZWQoTU5HX0JVSUxEX0RMTCkgfHwgZGVmaW5lZChNTkdfVVNFX0RMTCkKKyNkZWZpbmUgTU5HX0VSUk9SX1RFTExUQUxFCisjZGVmaW5lIE1OR19UUkFDRV9URUxMVEFMRQorI2VuZGlmCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworLyogZW5hYmxlIEJJRy9MSVRUTEUgZW5kaWFuIG9wdGltaXphdGlvbnMgKi8KKy8qIGVuYWJsZSBCSUcgaWYgeW91J3JlIG9uIGFuIGFyY2hpdGVjdHVyZSB0aGF0IHN1cHBvcnRzIGJpZy1lbmRpYW4gcmVhZHMKKyAgIGFuZCB3cml0ZXMgdGhhdCBhcmVuJ3Qgd29yZC1hbGlnbmVkICovCisvKiBhY2NvcmRpbmcgdG8gcmVsaWFibGUgc291cmNlcyB0aGlzIG9ubHkgd29ya3MgZm9yIFBvd2VyUEMgKGJpZ2VuZGlhbiBtb2RlKQorICAgYW5kIDY4MHgwICovCisvKiBlbmFibGUgTElUVExFIGlmIHlvdSdyZSBvbiBhbiBhcmNoaXRlY3R1cmUgdGhhdCBzdXBwb3J0cyBsaXR0bGUtZW5kaWFuICovCisvKiB3aGVuIGluIGRvdWJ0IGxlYXZlIGJvdGggb2ZmICEhISAqLworCisvKiAjZGVmaW5lIE1OR19CSUdFTkRJQU5fU1VQUE9SVEVEICovCisvKiAjZGVmaW5lIE1OR19MSVRUTEVFTkRJQU5fU1VQUE9SVEVEICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiBlbmFibGUgJ3ZlcnNpb24nIGZ1bmN0aW9ucyAqLworI2lmICFkZWZpbmVkKE1OR19WRVJTSU9OX1FVRVJZX1NVUFBPUlQpICYmIFwKKyAgICAhZGVmaW5lZChNTkdfTk9fVkVSU0lPTl9RVUVSWV9TVVBQT1JUKQorI2RlZmluZSBNTkdfVkVSU0lPTl9RVUVSWV9TVVBQT1JUCisjZW5kaWYKKworLyogZW5hYmxlICdzdXBwb3J0cycgZnVuY3Rpb24gKi8KKy8qIHVzZSB0aGlzIGlmIHlvdSBuZWVkIHRvIHF1ZXJ5IHRoZSBhdmFpbGFiaWxpdHkgb2YgZnVuY3Rpb25zIGF0IHJ1bnRpbWU7CisgICB1c2VmdWwgZm9yIGFwcHMgdGhhdCBkeW5hbWljYWxseSBsb2FkIHRoZSBsaWJyYXJ5IGFuZCB0aGF0IG5lZWQgc3BlY2lmaWMKKyAgIGZ1bmN0aW9ucyAqLworCisjaWYgIWRlZmluZWQoTU5HX05PX1NVUFBPUlRfRlVOQ1FVRVJZKSAmJiAhZGVmaW5lZChNTkdfU1VQUE9SVF9GVU5DUVVFUlkpCisjaWYgZGVmaW5lZChNTkdfQlVJTERfU08pIHx8IGRlZmluZWQoTU5HX1VTRV9TTykgfHwgXAorICAgIGRlZmluZWQoTU5HX0JVSUxEX0RMTCkgfHwgZGVmaW5lZChNTkdfVVNFX0RMTCkKKyNkZWZpbmUgTU5HX1NVUFBPUlRfRlVOQ1FVRVJZCisjZW5kaWYKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisvKiBlbmFibGUgZHluYW1pYyBNTkcgZmVhdHVyZXMgKi8KKy8qIHVzZSB0aGlzIGlmIHlvdSB3b3VsZCBsaWtlIHRvIGhhdmUgZHluYW1pYyBzdXBwb3J0IGZvciBzcGVjaWZpY2FsbHkKKyAgIGRlc2lnbmVkIE1OR3M7IGVnLiB0aGlzIGlzIHVzZWZ1bCBmb3IgJ3JvbGxvdmVyJyBlZmZlY3RzIHN1Y2ggYXMgY29tbW9uCisgICBvbiB0aGUgd29ybGQgd2lkZSB3ZWIgKi8KKworI2lmbmRlZiBNTkdfU1VQUE9SVF9EWU5BTUlDTU5HCisjaWYgZGVmaW5lZChNTkdfQlVJTERfU08pIHx8IGRlZmluZWQoTU5HX1VTRV9TTykgfHwgZGVmaW5lZChNTkdfQlVJTERfRExMKSB8fCBkZWZpbmVkKE1OR19VU0VfRExMKQorI2RlZmluZSBNTkdfU1VQUE9SVF9EWU5BTUlDTU5HCisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBNTkdfU1VQUE9SVF9EWU5BTUlDTU5HCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfZXZOVAorI2RlZmluZSBNTkdfU0tJUENIVU5LX2V2TlQKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyNpZm5kZWYgTU5HX05PX0FDQ0VTU19KUEVHCisjaWZuZGVmIE1OR19BQ0NFU1NfSlBFRworI2RlZmluZSBNTkdfQUNDRVNTX0pQRUcKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIE1OR19JTkNMVURFX1pMSUIKKyNpZm5kZWYgTU5HX05PX0FDQ0VTU19aTElCCisjaWZuZGVmIE1OR19BQ0NFU1NfWkxJQgorI2RlZmluZSBNTkdfQUNDRVNTX1pMSUIKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICBFbmQgb2YgdXNlci1zZWxlY3RhYmxlIGNvbXBpbGUtdGltZSBvcHRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNlbmRpZiAvKiBfbGlibW5nX2NvbmZfaF8gKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogZW5kIG9mIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCmRpZmYgLS1naXQgYS9maWxlcy9Tb3VyY2UvTGliTU5HL2xpYm1uZ19kYXRhLmggYi9maWxlcy9Tb3VyY2UvTGliTU5HL2xpYm1uZ19kYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMwZGNhOQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9MaWJNTkcvbGlibW5nX2RhdGEuaApAQCAtMCwwICsxLDEwMjkgQEAKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBsaWJtbmcuaCAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBwcm9qZWN0ICAgOiBsaWJtbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogZmlsZSAgICAgIDogbGlibW5nX2RhdGEuaCAgICAgICAgICAgICBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwNyBHLkp1eW4gICAqICovCisvKiAqIHZlcnNpb24gICA6IDEuMC4xMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogcHVycG9zZSAgIDogbWFpbiBkYXRhIHN0cnVjdHVyZSBkZWZpbml0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBhdXRob3IgICAgOiBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGNvbW1lbnQgICA6IERlZmluaXRpb24gb2YgdGhlIGxpYnJhcnkgbWFpbiBkYXRhIHN0cnVjdHVyZSAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogY2hhbmdlcyAgIDogMC41LjEgLSAwNS8wNC8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgQ1JDIHRhYmxlIHRvIG1haW4gc3RydWN0dXJlIChmb3IgdGhyZWFkLXNhZmV0eSkgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMSAtIDA1LzA2LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBpUExURWVudHJpZXMgZm9yIGNoZWNraW5nIGhJU1QtbGVuZ3RoICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4xIC0gMDUvMDgvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNoYW5nZWQgcGFsZXR0ZSBkZWZpbml0aW9uIHRvIGV4cG9ydGVkIHBhbGV0dGUtdHlwZSAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSByZW1vdmVkIGZyb3plbiBpbmRpY2F0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgY3JlYXRlL3dyaXRlIGluZGljYXRvcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNoYW5nZWQgc3RyaWN0LUFOU0kgc3R1ZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjEgLSAwNS8xMy8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgZU1OR21hIGhhY2sgKHdpbGwgYmUgcmVtb3ZlZCBpbiAxLjAuMCAhISEpICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIFRFUk0gYW5pbWF0aW9uIG9iamVjdCBwb2ludGVyIChlYXNpZXIgcmVmZXJlbmNlKSAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBzYXZlZC1kYXRhIHN0cnVjdHVyZSBmb3IgU0FWRS9TRUVLIHByb2Nlc3NpbmcgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMiAtIDA1LzE4LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBmaWVsZHMgZm9yIEpORyBzdXBwb3J0IChJSkctYmFzZWQpICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4yIC0gMDUvMjQvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNoYW5nZWQgZ2xvYmFsIHRSTlMgZGVmaW5pdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjIgLSAwNS8zMC8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgZGVsdGEtaW1hZ2UgZmllbGRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMiAtIDA2LzAxLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBpbnRlcm5hbCBkZWx0YS1pbWFnZSBwcm9jZXNzaW5nIGNhbGxiYWNrcyAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4yIC0gMDYvMDIvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNoYW5nZWQgU1dBUF9FTkRJQU4gdG8gQklHRU5ESUFOX1NVUFBPUlRFRCAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAoY29udHJpYnV0ZWQgYnkgVGltIFJvd2xleSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgZ2V0YWxwaGFsaW5lIGNhbGxiYWNrIGZvciBSR0I4X0E4IGNhbnZhc3N0eWxlICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMiAtIDA2LzA2LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBwYXJhbWV0ZXIgZm9yIGRlbGF5ZWQgYnVmZmVyLXByb2Nlc3NpbmcgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMyAtIDA2LzE2LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCB1cGRhdGUtcmVnaW9uIHBhcm1zIGZvciByZWZyZXNoIGNhbGJhY2sgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgTmVlZHJlZnJlc2ggcGFyYW1ldGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMyAtIDA2LzE3LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBEZWx0YWltbWVkaWF0ZSBwYXJtIGZvciBmYXN0ZXIgZGVsdGEtcHJvY2Vzc2luZyAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4zIC0gMDYvMjEvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIFNwZWVkIHBhcmFtZXRlciB0byBmYWNpbGl0YXRlIHRlc3RpbmcgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBJbWFnZWxldmVsIHBhcmFtZXRlciBmb3IgcHJvY2Vzc3RleHQgY2FsbGJhY2sgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4zIC0gMDYvMjYvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNoYW5nZWQgdXNlcmRhdGEgdmFyaWFibGUgdG8gbW5nX3B0ciAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4xIC0gMDcvMDcvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHZhcmlhYmxlcyBmb3IgZ29feHh4eCBwcm9jZXNzaW5nICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjEgLSAwNy8wOC8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgdmFyaWFibGVzIGZvciBpbXByb3ZlZCB0aW1pbmcgc3VwcG9ydCAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMSAtIDA3LzE1LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBjYWxsYmFja3MgZm9yIFNBVkUvU0VFSyBwcm9jZXNzaW5nICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgdmFyaWFibGUgZm9yIE5FRURTRUNUSU9OV0FJVCBicmVha3MgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHZhcmlhYmxlIGZvciBmcmVlemUgJiByZXNldCBwcm9jZXNzaW5nICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjEgLSAwNy8xNy8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgc3VzcGVuc2lvbi1idWZmZXJpbmcgZm9yIDMySysgY2h1bmtzICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjIgLSAwNy8yOS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gcmVtb3ZlZCBOZXh0YmFja3h4eCBmaWVsZHMgKG5vIGxvbmdlciB1c2VkKSAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMiAtIDA3LzMxLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaXhlZCB3cmFwcGluZyBvZiBzdXNwZW5zaW9uIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4yIC0gMDgvMDQvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIEIxMTEwOTYgLSBmaXhlZCBsYXJnZS1idWZmZXIgcmVhZC1zdXNwZW5zaW9uICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjIgLSAwOC8wNS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2hhbmdlZCBmaWxlLXByZWZpeGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjMgLSAwOC8yNi8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgTUFHTiBjaHVuayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMyAtIDA5LzA3LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBzdXBwb3J0IGZvciBuZXcgZmlsdGVyX3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4zIC0gMDkvMTAvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIERFRkkgYmVoYXZpb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjMgLSAxMC8xMC8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgc3VwcG9ydCBmb3IgYWxwaGEtZGVwdGggcHJlZGljdGlvbiAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMyAtIDEwLzExLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBzdXBwb3J0IGZvciBuRUVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4zIC0gMTAvMTYvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIG9wdGlvbmFsIHN1cHBvcnQgZm9yIGJLR0QgZm9yIFBORyBpbWFnZXMgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBzdXBwb3J0IGZvciBKREFBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4zIC0gMTAvMTcvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGNhbGxiYWNrIHRvIHByb2Nlc3Mgbm9uLWNyaXRpY2FsIHVua25vd24gY2h1bmtzICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaXhlZCBzdXBwb3J0IGZvciBiS0dEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4zIC0gMTAvMTkvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGltcGxlbWVudGVkIGRlbGF5ZWQgZGVsdGEtcHJvY2Vzc2luZyAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjQgLSAxMi8xNi8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgbWl4dXAgb2YgZGF0YS0gJiBmdW5jdGlvbi1wb2ludGVycyAodGhhbmtzIERpbWl0cmkpKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjEgLSAwMi8wOC8yMDAxIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgTUVORCBwcm9jZXNzaW5nIGNhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuMSAtIDAyLzEzLzIwMDEgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaXhlZCBmaXJzdCBGUkFNX01PREU9NCB0aW1pbmcgcHJvYmxlbSAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuMiAtIDA2LzIzLzIwMDEgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBvcHRpbWl6YXRpb24gb3B0aW9uIGZvciBNTkctdmlkZW8gcGxheWJhY2sgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgcHJvY2Vzc3Rlcm0gY2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuMiAtIDA2LzI1LzIwMDEgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBvcHRpb24gdG8gdHVybiBvZmYgcHJvZ3Jlc3NpdmUgcmVmcmVzaCAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDA3LzA4LzIwMDIgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBCNTc4NTcyIC0gcmVtb3ZlZCBlTU5HbWEgaGFjayAodGhhbmtzIERpbWl0cmkhKSAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC41IC0gMDcvMTYvMjAwMiAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIEI1ODE2MjUgLSBsYXJnZSBjaHVua3MgZmFpbCB3aXRoIHN1c3BlbnNpb24gcmVhZHMgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAwOC8xNS8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY29tcGxldGVkIFBST00gc3VwcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDA5LzE1LzIwMDIgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaXhlZCBMT09QIGl0ZXJhdGlvbj0wIHNwZWNpYWwgY2FzZSAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC41IC0gMDkvMjAvMjAwMiAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpbmlzaGVkIHN1cHBvcnQgZm9yIEJBQ0sgaW1hZ2UgJiB0aWxpbmcgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAxMC8wNy8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgYW5vdGhlciBmaXggZm9yIG1pc3BsYWNlZCBURVJNIGNodW5rICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNvbXBsZXRlZCBzdXBwb3J0IGZvciBjb25kaXRpb249MiBpbiBURVJNIGNodW5rICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAxMC8yMC8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgcHJvY2Vzc2luZyBmb3IgbXVsdGlwbGUgb2JqZWN0cyBpbiBNQUdOICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIGRpc3BsYXkgb2YgdmlzaWJsZSB0YXJnZXQgb2YgUEFTVCBvcGVyYXRpb24gICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAxMS8wNy8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgc3VwcG9ydCB0byBnZXQgdG90YWxzIGFmdGVyIG1uZ19yZWFkKCkgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDI0LzAyLzIwMDMgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBCNjgzMTUyIC0gbGlianBlZyBzdXNwZW5zaW9uIG5vdCBhbHdheXMgaG9ub3JlZCBjb3JyZWN0bHkqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNiAtIDA0LzExLzIwMDMgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBCNzE5NDIwIC0gZml4ZWQgc2V2ZXJhbCBNTkdfQVBQX0NNUyBwcm9ibGVtcyAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC42IC0gMDcvMDUvMjAwMyAtIEcuIFItUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIG9wdGlvbmFsbHkgdXNlIHpsaWIncyBjcmMzMigpIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjYgLSAwNy8yOS8yMDAzIC0gRy5SLVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgU0tJUENIVU5LIGNvbmRpdGlvbmFscyBhcm91bmQgUEFTVCBjaHVuayBzdXBwb3J0ICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNiAtIDA4LzE3LzIwMDMgLSBHLlItUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBpUE5HZGVwdGggbWVtYmVyIHRvIHBEYXRhIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNyAtIDAzLzEwLzIwMDQgLSBHLlItUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBjb25kaXRpb25hbHMgYXJvdW5kIG9wZW5zdHJlYW0vY2xvc2VzdHJlYW0gICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC43IC0gMDMvMjQvMjAwNCAtIEcuUi1QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIG1vcmUgU0tJUENIVU5LIGNvbmRpdGlvbmFscyAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC44IC0gMDQvMDIvMjAwNCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIENSQyBleGlzdGVuY2UgJiBjaGVja2luZyBmbGFncyAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjggLSAwNC8xMC8yMDA0IC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgZGF0YS1wdXNoIG1lY2hhbmlzbXMgZm9yIHNwZWNpYWxpemVkIGRlY29kZXJzICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjkgLSAxMi8xMS8yMDA0IC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgY29uZGl0aW9uYWwgTU5HX09QVElNSVpFX0RJU1BMQVlDQUxMUyAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjEwIC0gMDQvMDgvMjAwNyAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgc3VwcG9ydCBmb3IgbVBORyBwcm9wb3NhbCAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuMTAgLSAwNC8xMi8yMDA3IC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBzdXBwb3J0IGZvciBBTkcgcHJvcG9zYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmIGRlZmluZWQoX19CT1JMQU5EQ19fKSAmJiBkZWZpbmVkKE1OR19TVFJJQ1RfQU5TSSkKKyNwcmFnbWEgb3B0aW9uIC1BICAgICAgICAgICAgICAgICAgICAgIC8qIGZvcmNlIEFOU0ktQyAqLworI2VuZGlmCisKKyNpZm5kZWYgX2xpYm1uZ19kYXRhX2hfCisjZGVmaW5lIF9saWJtbmdfZGF0YV9oXworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjZGVmaW5lIE1OR19NQUdJQyAweDUyNTMwYTBhTAorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogSW50ZXJuYWwgc3RydWN0dXJlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKwordHlwZWRlZiBtbmdfcGFsZXR0ZTggbW5nX3JnYnBhbHRhYjsKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIFRoZSBzYXZlZF9kYXRhIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogVGhpcyBjb250YWlucyB0aGUgc2F2ZWQgZGF0YSBhZnRlciBhIFNBVkUgY2h1bmsgaGFzIGJlZW4gcHJvY2Vzc2VkLiAgICAqICovCisvKiAqIFRoZSBkYXRhIGlzIHNhdmVkIGZyb20gdGhlIG1haW4gZGF0YSBzdHJ1Y3R1cmUgZHVyaW5nIFNBVkUgcHJvY2Vzc2luZywgKiAqLworLyogKiBhbmQgcmVzdG9yZWQgdG8gdGhlIG1haW4gZGF0YSBzdHJ1Y3R1cmUgZHVyaW5nIFNFRUsgcHJvY2Vzc2luZy4gICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCit0eXBlZGVmIHN0cnVjdCBtbmdfc2F2ZWRhdGFfc3RydWN0IHsKKworI2lmIGRlZmluZWQoTU5HX1NVUFBPUlRfUkVBRCkgfHwgZGVmaW5lZChNTkdfU1VQUE9SVF9XUklURSkKKyAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICAgYkhhc2dsb2JhbFBMVEU7ICAgICAvKiBnbG9iYWwgUExURSBjaHVuayBwcm9jZXNzZWQgKi8KKyAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICAgYkhhc2dsb2JhbFRSTlM7ICAgICAvKiBnbG9iYWwgdFJOUyBjaHVuayBwcm9jZXNzZWQgKi8KKyAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICAgYkhhc2dsb2JhbEdBTUE7ICAgICAvKiBnbG9iYWwgZ0FNQSBjaHVuayBwcm9jZXNzZWQgKi8KKyAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICAgYkhhc2dsb2JhbENIUk07ICAgICAvKiBnbG9iYWwgY0hSTSBjaHVuayBwcm9jZXNzZWQgKi8KKyAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICAgYkhhc2dsb2JhbFNSR0I7ICAgICAvKiBnbG9iYWwgc1JHQiBjaHVuayBwcm9jZXNzZWQgKi8KKyAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICAgYkhhc2dsb2JhbElDQ1A7ICAgICAvKiBnbG9iYWwgaUNDUCBjaHVuayBwcm9jZXNzZWQgKi8KKyAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICAgYkhhc2dsb2JhbEJLR0Q7ICAgICAvKiBnbG9iYWwgYktHRCBjaHVuayBwcm9jZXNzZWQgKi8KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9SRUFEIHx8IE1OR19TVVBQT1JUX1dSSVRFICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCisgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgIGlCQUNLcmVkOyAgICAgICAgICAgLyogQkFDSyBmaWVsZHMgKi8KKyAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAgaUJBQ0tncmVlbjsKKyAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAgaUJBQ0tibHVlOworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpQkFDS21hbmRhdG9yeTsKKyAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAgaUJBQ0tpbWFnZWlkOworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpQkFDS3RpbGU7CisKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaUZSQU1tb2RlOyAgICAgICAgICAvKiBGUkFNIGZpZWxkcyAoZ2xvYmFsKSAqLworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpRlJBTWRlbGF5OworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpRlJBTXRpbWVvdXQ7CisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJGUkFNY2xpcHBpbmc7CisgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgIGlGUkFNY2xpcGw7CisgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgIGlGUkFNY2xpcHI7CisgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgIGlGUkFNY2xpcHQ7CisgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgIGlGUkFNY2xpcGI7CisKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaUdsb2JhbFBMVEVjb3VudDsgICAvKiBnbG9iYWwgUExURSBmaWVsZHMgKi8KKyAgICAgICAgICAgbW5nX3JnYnBhbHRhYiAgICAgYUdsb2JhbFBMVEVlbnRyaWVzOworCisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlHbG9iYWxUUk5TcmF3bGVuOyAgLyogZ2xvYmFsIHRSTlMgZmllbGRzICovCisgICAgICAgICAgIG1uZ191aW50OGFyciAgICAgIGFHbG9iYWxUUk5TcmF3ZGF0YTsKKworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpR2xvYmFsR2FtbWE7ICAgICAgIC8qIGdsb2JhbCBnQU1BIGZpZWxkcyAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfY0hSTQorICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpR2xvYmFsV2hpdGVwb2ludHg7IC8qIGdsb2JhbCBjSFJNIGZpZWxkcyAqLworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpR2xvYmFsV2hpdGVwb2ludHk7CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlHbG9iYWxQcmltYXJ5cmVkeDsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaUdsb2JhbFByaW1hcnlyZWR5OworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpR2xvYmFsUHJpbWFyeWdyZWVueDsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaUdsb2JhbFByaW1hcnlncmVlbnk7CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlHbG9iYWxQcmltYXJ5Ymx1ZXg7CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlHbG9iYWxQcmltYXJ5Ymx1ZXk7CisjZW5kaWYKKworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpR2xvYmFsUmVuZGludGVudDsgIC8qIGdsb2JhbCBzUkdCIGZpZWxkcyAqLworCisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlHbG9iYWxQcm9maWxlc2l6ZTsgLyogZ2xvYmFsIGlDQ1AgZmllbGRzICovCisgICAgICAgICAgIG1uZ19wdHIgICAgICAgICAgIHBHbG9iYWxQcm9maWxlOworCisgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgIGlHbG9iYWxCS0dEcmVkOyAgICAgLyogZ2xvYmFsIGJLR0QgZmllbGRzICovCisgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgIGlHbG9iYWxCS0dEZ3JlZW47CisgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgIGlHbG9iYWxCS0dEYmx1ZTsKKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisKKyAgICAgICAgfSBtbmdfc2F2ZWRhdGE7CisKK3R5cGVkZWYgbW5nX3NhdmVkYXRhICogbW5nX3NhdmVkYXRhcDsKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIEludGVybmFsIGJ1ZmZlciBzdHJ1Y3R1cmUgZm9yIGRhdGEgcHVzaCBtZWNoYW5pc21zICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgICAgbW5nX3B0ciAgICAgICAgICAgcE5leHQ7ICAgICAgICAgICAgICAvKiBmb3IgbGlua2VkIGxpc3QgKi8KKyAgICAgICAgICAgbW5nX3B0ciAgICAgICAgICAgcERhdGE7ICAgICAgICAgICAgICAvKiB1c2VkIGZvciBjaHVua3MgJiBkYXRhICovCisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlMZW5ndGg7CisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJPd25lZDsKKyAgICAgICAgICAgbW5nX3VpbnQ4cCAgICAgICAgcERhdGFuZXh0OyAgICAgICAgICAvKiBvbmx5IHVzZWQgZm9yIGRhdGEgKi8KKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaVJlbWFpbmluZzsKKyAgICAgICAgfSBtbmdfcHVzaGRhdGE7Cit0eXBlZGVmIG1uZ19wdXNoZGF0YSAqIG1uZ19wdXNoZGF0YXA7CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBUaGUgbWFpbiBsaWJtbmcgZGF0YSBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIFRoZSBoYW5kbGUgdXNlZCBpbiBhbGwgZnVuY3Rpb25zIHBvaW50cyB0byB0aGlzIHN0cnVjdHVyZSB3aGljaCAgICAgICAgKiAqLworLyogKiBjb250YWlucyBhbGwgdm9sYXRpbGUgZGF0YSBuZWNlc3NhcnkgdG8gcHJvY2VzcyB0aGUgbmV0d29yayBncmFwaGljLiAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCit0eXBlZGVmIHN0cnVjdCBtbmdfZGF0YV9zdHJ1Y3QgeworCisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlNYWdpYzsgICAgICAgICAgICAgLyogbWFnaWMgbnVtYmVyIHRvIHZhbGlkYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBnaXZlbiBoYW5kbGUgKi8gICAgIAorICAgICAgICAgICBtbmdfcHRyICAgICAgICAgICBwVXNlcmRhdGE7ICAgICAgICAgIC8qIGFwcGxpY2F0aW9uIHdvcmtkYXRhICovCisKKyAgICAgICAgICAgbW5nX2ltZ3R5cGUgICAgICAgZVNpZ3R5cGU7ICAgICAgICAgICAvKiBpbWFnZSBpbmZvcm1hdGlvbiAqLworICAgICAgICAgICBtbmdfaW1ndHlwZSAgICAgICBlSW1hZ2V0eXBlOyAgICAgICAgIC8qIGluaXRpYWxseSB6ZXJvZWQgKi8KKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaVdpZHRoOyAgICAgICAgICAgICAvKiBmaWxsZWQgYWZ0ZXIgaGVhZGVyIGlzIHByb2Nlc3NlZCAqLworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpSGVpZ2h0OworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpVGlja3M7ICAgICAgICAgICAgIC8qIHRoZXNlIG9ubHkgYWZ0ZXIgTUhEUiAqLworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpTGF5ZXJjb3VudDsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaUZyYW1lY291bnQ7CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlQbGF5dGltZTsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaVNpbXBsaWNpdHk7CisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlBbHBoYWRlcHRoOyAgICAgICAgLyogaW5kaWNhdGVzIGV4cGVjdGVkIGFscGhhLWRlcHRoICovCisKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaUltYWdlbGV2ZWw7ICAgICAgICAvKiBsZXZlbCBvZiBpbWFnZSBpbnNpZGUgYSBzdHJlYW0gKi8KKworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpQ2FudmFzc3R5bGU7ICAgICAgIC8qIGxheW91dCBvZiB0aGUgZHJhd2luZy1jYW52YXMgKi8KKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaUJrZ2RzdHlsZTsgICAgICAgICAvKiBsYXlvdXQgb2YgdGhlIGJhY2tncm91bmQtY2FudmFzICovCisKKyAgICAgICAgICAgbW5nX2ludDggICAgICAgICAgaU1hZ25pZnk7ICAgICAgICAgICAvKiBtYWduaWZpY2F0aW9uIGZhY3RvciAobm90IHVzZWQgeWV0KSAqLworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpT2Zmc2V0eDsgICAgICAgICAgIC8qIHgtb2Zmc2V0IGZvciBleHRyZW1lbHkgbGFyZ2UgaW1hZ2UgKi8KKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaU9mZnNldHk7ICAgICAgICAgICAvKiB5LW9mZnNldCBmb3IgZXh0cmVtZWx5IGxhcmdlIGltYWdlICovCisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlDYW52YXN3aWR0aDsgICAgICAgLyogcmVhbCBjYW52YXMgc2l6ZSAqLworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpQ2FudmFzaGVpZ2h0OyAgICAgIC8qIG11c3QgYmUgc2V0IGJ5IHByb2Nlc3NoZWFkZXIgY2FsbGJhY2sgKi8KKworICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICBpQkdyZWQ7ICAgICAgICAgICAgIC8qIGRlZmF1bHQgYmFja2dyb3VuZCBjb2xvciAqLworICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICBpQkdncmVlbjsgICAgICAgICAgIC8qIGluaXRpYWxseSAiYmxhY2siICovCisgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgIGlCR2JsdWU7CisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJVc2VCS0dEOyAgICAgICAgICAgLyogcHJlZmVycmVkIHVzZSBvZiBiS0dEIGZvciBQTkcgKi8KKworICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICBiSXNzUkdCOyAgICAgICAgICAgIC8qIGluZGljYXRlcyBzUkdCIHN5c3RlbSAqLworCisjaWZkZWYgTU5HX0ZVTExfQ01TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGl0dGxlIENNUyB2YXJpYWJsZXMgKi8KKyAgICAgICAgICAgbW5nX2Ntc3Byb2YgICAgICAgaFByb2YxOyAgICAgICAgICAgICAvKiBpbWFnZSBpbnB1dCBwcm9maWxlICovCisgICAgICAgICAgIG1uZ19jbXNwcm9mICAgICAgIGhQcm9mMjsgICAgICAgICAgICAgLyogZGVmYXVsdCBvdXRwdXQgcHJvZmlsZSAqLworICAgICAgICAgICBtbmdfY21zcHJvZiAgICAgICBoUHJvZjM7ICAgICAgICAgICAgIC8qIGRlZmF1bHQgc1JHQiBwcm9maWxlICovCisgICAgICAgICAgIG1uZ19jbXN0cmFucyAgICAgIGhUcmFuczsgICAgICAgICAgICAgLyogY3VycmVudCB0cmFuc2Zvcm1hdGlvbiBoYW5kbGUgKi8KKyNlbmRpZgorCisgICAgICAgICAgIG1uZ19mbG9hdCAgICAgICAgIGRWaWV3Z2FtbWE7ICAgICAgICAgLyogZ2FtbWEgY2FsY3VsYXRpb24gdmFyaWFibGVzICovCisgICAgICAgICAgIG1uZ19mbG9hdCAgICAgICAgIGREaXNwbGF5Z2FtbWE7ICAgICAgLyogaW5pdGlhbGx5IHNldCBmb3Igc1JHQiBjb25kaXRpb25zICovCisgICAgICAgICAgIG1uZ19mbG9hdCAgICAgICAgIGREZmx0aW1nZ2FtbWE7CisKKyAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICAgYlN0b3JlY2h1bmtzOyAgICAgICAvKiBzd2l0Y2ggZm9yIHN0b3JpbmcgY2h1bmtkYXRhICovCisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJTZWN0aW9uYnJlYWtzOyAgICAgLyogaW5kaWNhdGUgTkVFRFNFQ1RJT05XQUlUIGJyZWFrcyAqLworICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICBiQ2FjaGVwbGF5YmFjazsgICAgIC8qIHN3aXRjaCB0byBjYWNoZSBwbGF5YmFjayBpbmZvICovCisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJEb1Byb2dyZXNzaXZlOyAgICAgLyogcHJvZ3Jlc3NpdmUgcmVmcmVzaCBmb3IgbGFyZ2UgaW1hZ2VzICovCisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlDcmNtb2RlOyAgICAgICAgICAgLyogQ1JDIGV4aXN0ZW5jZSAmIGNoZWNraW5nIGZsYWdzICovCisKKyAgICAgICAgICAgbW5nX3NwZWVkdHlwZSAgICAgaVNwZWVkOyAgICAgICAgICAgICAvKiBzcGVlZC1tb2RpZmllciBmb3IgYW5pbWF0aW9ucyAqLworCisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlNYXh3aWR0aDsgICAgICAgICAgLyogbWF4aW11bSBjYW52YXMgc2l6ZSAqLworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpTWF4aGVpZ2h0OyAgICAgICAgIC8qIGluaXRpYWxseSBzZXQgdG8gMTAyNCB4IDEwMjQgKi8KKworICAgICAgICAgICBtbmdfaW50MzIgICAgICAgICBpRXJyb3Jjb2RlOyAgICAgICAgIC8qIGVycm9yIHJlcG9ydGluZyBmaWVsZHMgKi8KKyAgICAgICAgICAgbW5nX2ludDggICAgICAgICAgaVNldmVyaXR5OworICAgICAgICAgICBtbmdfaW50MzIgICAgICAgICBpRXJyb3J4MTsKKyAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAgaUVycm9yeDI7CisgICAgICAgICAgIG1uZ19wY2hhciAgICAgICAgIHpFcnJvcnRleHQ7CisKKyAgICAgICAgICAgbW5nX21lbWFsbG9jICAgICAgZk1lbWFsbG9jOyAgICAgICAgICAvKiBjYWxsYmFjayBwb2ludGVycyAqLworICAgICAgICAgICBtbmdfbWVtZnJlZSAgICAgICBmTWVtZnJlZTsgICAgICAgICAgIC8qIGluaXRpYWxseSBudWxsZWQgKi8KKyAgICAgICAgICAgbW5nX3JlbGVhc2VkYXRhICAgZlJlbGVhc2VkYXRhOworI2lmbmRlZiBNTkdfTk9fT1BFTl9DTE9TRV9TVFJFQU0KKyAgICAgICAgICAgbW5nX29wZW5zdHJlYW0gICAgZk9wZW5zdHJlYW07CisgICAgICAgICAgIG1uZ19jbG9zZXN0cmVhbSAgIGZDbG9zZXN0cmVhbTsKKyNlbmRpZgorICAgICAgICAgICBtbmdfcmVhZGRhdGEgICAgICBmUmVhZGRhdGE7CisgICAgICAgICAgIG1uZ193cml0ZWRhdGEgICAgIGZXcml0ZWRhdGE7CisgICAgICAgICAgIG1uZ19lcnJvcnByb2MgICAgIGZFcnJvcnByb2M7CisgICAgICAgICAgIG1uZ190cmFjZXByb2MgICAgIGZUcmFjZXByb2M7CisgICAgICAgICAgIG1uZ19wcm9jZXNzaGVhZGVyIGZQcm9jZXNzaGVhZGVyOworICAgICAgICAgICBtbmdfcHJvY2Vzc3RleHQgICBmUHJvY2Vzc3RleHQ7CisgICAgICAgICAgIG1uZ19wcm9jZXNzc2F2ZSAgIGZQcm9jZXNzc2F2ZTsKKyAgICAgICAgICAgbW5nX3Byb2Nlc3NzZWVrICAgZlByb2Nlc3NzZWVrOworICAgICAgICAgICBtbmdfcHJvY2Vzc25lZWQgICBmUHJvY2Vzc25lZWQ7CisgICAgICAgICAgIG1uZ19wcm9jZXNzbWVuZCAgIGZQcm9jZXNzbWVuZDsKKyAgICAgICAgICAgbW5nX3Byb2Nlc3N1bmtub3duIGZQcm9jZXNzdW5rbm93bjsKKyAgICAgICAgICAgbW5nX3Byb2Nlc3N0ZXJtICAgZlByb2Nlc3N0ZXJtOworICAgICAgICAgICBtbmdfZ2V0Y2FudmFzbGluZSBmR2V0Y2FudmFzbGluZTsKKyAgICAgICAgICAgbW5nX2dldGJrZ2RsaW5lICAgZkdldGJrZ2RsaW5lOworICAgICAgICAgICBtbmdfZ2V0YWxwaGFsaW5lICBmR2V0YWxwaGFsaW5lOworICAgICAgICAgICBtbmdfcmVmcmVzaCAgICAgICBmUmVmcmVzaDsKKyAgICAgICAgICAgbW5nX2dldHRpY2tjb3VudCAgZkdldHRpY2tjb3VudDsKKyAgICAgICAgICAgbW5nX3NldHRpbWVyICAgICAgZlNldHRpbWVyOworICAgICAgICAgICBtbmdfcHJvY2Vzc2dhbW1hICBmUHJvY2Vzc2dhbW1hOworICAgICAgICAgICBtbmdfcHJvY2Vzc2Nocm9tYSBmUHJvY2Vzc2Nocm9tYTsKKyAgICAgICAgICAgbW5nX3Byb2Nlc3NzcmdiICAgZlByb2Nlc3NzcmdiOworICAgICAgICAgICBtbmdfcHJvY2Vzc2ljY3AgICBmUHJvY2Vzc2ljY3A7CisgICAgICAgICAgIG1uZ19wcm9jZXNzYXJvdyAgIGZQcm9jZXNzYXJvdzsKKworI2lmIGRlZmluZWQoTU5HX1NVUFBPUlRfUkVBRCkgfHwgZGVmaW5lZChNTkdfU1VQUE9SVF9XUklURSkKKyNpZm5kZWYgTU5HX05PX09MRF9WRVJTSU9OUworICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICBiUHJlRHJhZnQ0ODsgICAgICAgIC8qIGZsYWdzIGFuY2llbnQgc3R5bGUgZHJhZnQgKi8KKyNlbmRpZgorCisgICAgICAgICAgIG1uZ19jaHVua2lkICAgICAgIGlDaHVua25hbWU7ICAgICAgICAgLyogcmVhZC93cml0ZS1zdGF0ZSB2YXJpYWJsZXMgKi8KKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaUNodW5rc2VxOworICAgICAgICAgICBtbmdfY2h1bmtwICAgICAgICBwRmlyc3RjaHVuazsgICAgICAgIC8qIGRvdWJsZS1saW5rZWQgbGlzdCBvZiAqLworICAgICAgICAgICBtbmdfY2h1bmtwICAgICAgICBwTGFzdGNodW5rOyAgICAgICAgIC8qIHN0b3JlZCBjaHVuay1zdHJ1Y3R1cmVzICovCisKKyAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICAgYkhhc2hlYWRlcjsgICAgICAgICAvKiBmaXJzdCBoZWFkZXIgY2h1bmsgcHJvY2Vzc2VkICovCisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJIYXNNSERSOyAgICAgICAgICAgLyogaW5zaWRlIGEgTUhEUi1NRU5EIHNlcXVlbmNlICovCisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJIYXNJSERSOyAgICAgICAgICAgLyogaW5zaWRlIGEgSUhEUi1JRU5EIHNlcXVlbmNlICovCisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJIYXNCQVNJOyAgICAgICAgICAgLyogaW5zaWRlIGEgQkFTSS1JRU5EIHNlcXVlbmNlICovCisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJIYXNESERSOyAgICAgICAgICAgLyogaW5zaWRlIGEgREhEUi1JRU5EIHNlcXVlbmNlICovCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJIYXNKSERSOyAgICAgICAgICAgLyogaW5zaWRlIGEgSkhEUi1JRU5EIHNlcXVlbmNlICovCisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJIYXNKU0VQOyAgICAgICAgICAgLyogcGFzc2VkIHRoZSBKU0VQIHNlcGFyYXRvciAqLworICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICBiSGFzSkRBQTsgICAgICAgICAgIC8qIGF0IGxlYXN0IDEgSkRBQSBwcm9jZXNzZWQgKi8KKyAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICAgYkhhc0pEQVQ7ICAgICAgICAgICAvKiBhdCBsZWFzdCAxIEpEQVQgcHJvY2Vzc2VkICovCisjZW5kaWYKKyAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICAgYkhhc1BMVEU7ICAgICAgICAgICAvKiBQTFRFIGNodW5rIHByb2Nlc3NlZCAqLworICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICBiSGFzVFJOUzsgICAgICAgICAgIC8qIHRSTlMgY2h1bmsgcHJvY2Vzc2VkICovCisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJIYXNHQU1BOyAgICAgICAgICAgLyogZ0FNQSBjaHVuayBwcm9jZXNzZWQgKi8KKyAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICAgYkhhc0NIUk07ICAgICAgICAgICAvKiBjSFJNIGNodW5rIHByb2Nlc3NlZCAqLworICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICBiSGFzU1JHQjsgICAgICAgICAgIC8qIHNSR0IgY2h1bmsgcHJvY2Vzc2VkICovCisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJIYXNJQ0NQOyAgICAgICAgICAgLyogaUNDUCBjaHVuayBwcm9jZXNzZWQgKi8KKyAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICAgYkhhc0JLR0Q7ICAgICAgICAgICAvKiBiS0dEIGNodW5rIHByb2Nlc3NlZCAqLworICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICBiSGFzSURBVDsgICAgICAgICAgIC8qIGF0IGxlYXN0IDEgSURBVCBwcm9jZXNzZWQgKi8KKyAgICAgICAgICAgCisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJIYXNTQVZFOyAgICAgICAgICAgLyogU0FWRSBjaHVuayBwcm9jZXNzZWQgKi8KKyAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICAgYkhhc0JBQ0s7ICAgICAgICAgICAvKiBCQUNLIGNodW5rIHByb2Nlc3NlZCAqLworICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICBiSGFzRlJBTTsgICAgICAgICAgIC8qIEZSQU0gY2h1bmsgcHJvY2Vzc2VkICovCisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJIYXNURVJNOyAgICAgICAgICAgLyogVEVSTSBjaHVuayBwcm9jZXNzZWQgKi8KKyAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICAgYkhhc0xPT1A7ICAgICAgICAgICAvKiBhdCBsZWFzdCAxIExPT1Agb3BlbiAqLworCisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJIYXNnbG9iYWxQTFRFOyAgICAgLyogZ2xvYmFsIFBMVEUgY2h1bmsgcHJvY2Vzc2VkICovCisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJIYXNnbG9iYWxUUk5TOyAgICAgLyogZ2xvYmFsIHRSTlMgY2h1bmsgcHJvY2Vzc2VkICovCisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJIYXNnbG9iYWxHQU1BOyAgICAgLyogZ2xvYmFsIGdBTUEgY2h1bmsgcHJvY2Vzc2VkICovCisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJIYXNnbG9iYWxDSFJNOyAgICAgLyogZ2xvYmFsIGNIUk0gY2h1bmsgcHJvY2Vzc2VkICovCisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJIYXNnbG9iYWxTUkdCOyAgICAgLyogZ2xvYmFsIHNSR0IgY2h1bmsgcHJvY2Vzc2VkICovCisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJIYXNnbG9iYWxJQ0NQOyAgICAgLyogZ2xvYmFsIGlDQ1AgY2h1bmsgcHJvY2Vzc2VkICovCisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJIYXNnbG9iYWxCS0dEOyAgICAgLyogZ2xvYmFsIGJLR0QgY2h1bmsgcHJvY2Vzc2VkICovCisKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaURhdGF3aWR0aDsgICAgICAgICAvKiBJSERSL0JBU0kvREhEUiBmaWVsZHMgKi8KKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaURhdGFoZWlnaHQ7ICAgICAgICAvKiB2YWxpZCBpZiBpbnNpZGUgSUhEUi1JRU5ELCAqLworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpQml0ZGVwdGg7ICAgICAgICAgIC8qIEJBU0ktSUVORCBvciBESERSLUlFTkQgKi8KKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaUNvbG9ydHlwZTsKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaUNvbXByZXNzaW9uOworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpRmlsdGVyOworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpSW50ZXJsYWNlOworCisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlQTFRFY291bnQ7ICAgICAgICAgLyogUExURSBmaWVsZHMgKi8KKworI2lmZGVmIE1OR19JTkNMVURFX0pORworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpSkhEUmNvbG9ydHlwZTsgICAgIC8qIEpIRFIgZmllbGRzICovCisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlKSERSaW1nYml0ZGVwdGg7ICAgLyogdmFsaWQgaWYgaW5zaWRlIEpIRFItSUVORCAqLworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpSkhEUmltZ2NvbXByZXNzaW9uOworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpSkhEUmltZ2ludGVybGFjZTsKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaUpIRFJhbHBoYWJpdGRlcHRoOworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpSkhEUmFscGhhY29tcHJlc3Npb247CisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlKSERSYWxwaGFmaWx0ZXI7CisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlKSERSYWxwaGFpbnRlcmxhY2U7CisjZW5kaWYKKworI2VuZGlmIC8qIE1OR19TVVBQT1JUX1JFQUQgfHwgTU5HX1NVUFBPUlRfV1JJVEUgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1JFQUQKKyAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICAgYlJlYWRpbmc7ICAgICAgICAgICAvKiByZWFkIHByb2Nlc3NpbmcgdmFyaWFibGVzICovCisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJIYXZlc2lnOworICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICBiRU9GOworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpUmVhZGJ1ZnNpemU7CisgICAgICAgICAgIG1uZ191aW50OHAgICAgICAgIHBSZWFkYnVmOworCisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlMYXJnZWJ1ZnNpemU7ICAgICAgLyogdGVtcCBmb3IgdmVyeSBsYXJnZSBjaHVua3MgKi8KKyAgICAgICAgICAgbW5nX3VpbnQ4cCAgICAgICAgcExhcmdlYnVmOworCisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlTdXNwZW5kdGltZTsgICAgICAgLyogdGlja2NvdW50IGF0IGxhc3Qgc3VzcGVuc2lvbiAqLworICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICBiU3VzcGVuZGVkOyAgICAgICAgIC8qIGlucHV0LXJlYWRpbmcgaGFzIGJlZW4gc3VzcGVuZGVkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlJ3JlIGV4cGVjdGluZyBhIGNhbGwgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcmVhZF9yZXN1bWUhICovCisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlTdXNwZW5kcG9pbnQ7ICAgICAgLyogaW5kaWNhdGVzIGF0IHdoaWNoIHBvaW50IHRoZSBmbG93CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FzIGJyb2tlbiB0byBzdXNwZW5kIGlucHV0LXJlYWRpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICAgYlN1c3BlbnNpb25tb2RlOyAgICAvKiBJL08tc3VzcGVuc2lvbiB2YXJpYWJsZXMgKi8KKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaVN1c3BlbmRidWZzaXplOworICAgICAgICAgICBtbmdfdWludDhwICAgICAgICBwU3VzcGVuZGJ1ZjsKKyAgICAgICAgICAgbW5nX3VpbnQ4cCAgICAgICAgcFN1c3BlbmRidWZuZXh0OworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpU3VzcGVuZGJ1ZmxlZnQ7CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlDaHVua2xlbjsgICAgICAgICAgLyogY2h1bmsgbGVuZ3RoICovCisgICAgICAgICAgIG1uZ191aW50OHAgICAgICAgIHBSZWFkYnVmbmV4dDsgICAgICAgLyogMzJLKyBzdXNwZW5zaW9uLXByb2Nlc3NpbmcgKi8KKyAgICAgICAgICAgbW5nX3VpbnQ4cCAgICAgICAgcExhcmdlYnVmbmV4dDsKKworICAgICAgICAgICBtbmdfcHVzaGRhdGFwICAgICBwRmlyc3RwdXNoY2h1bms7ICAgIC8qIHZhcmlhYmxlcyBmb3IgcHVzaCBtZWNoYW5pc21zICovCisgICAgICAgICAgIG1uZ19wdXNoZGF0YXAgICAgIHBMYXN0cHVzaGNodW5rOworICAgICAgICAgICBtbmdfcHVzaGRhdGFwICAgICBwRmlyc3RwdXNoZGF0YTsKKyAgICAgICAgICAgbW5nX3B1c2hkYXRhcCAgICAgcExhc3RwdXNoZGF0YTsKKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9SRUFEICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9XUklURQorICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICBiQ3JlYXRpbmc7ICAgICAgICAgIC8qIGNyZWF0ZS93cml0ZSBwcm9jZXNzaW5nIHZhcmlhYmxlcyAqLworICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICBiV3JpdGluZzsKKyAgICAgICAgICAgbW5nX2NodW5raWQgICAgICAgaUZpcnN0Y2h1bmthZGRlZDsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaVdyaXRlYnVmc2l6ZTsKKyAgICAgICAgICAgbW5nX3VpbnQ4cCAgICAgICAgcFdyaXRlYnVmOworI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJEaXNwbGF5aW5nOyAgICAgICAgLyogZGlzcGxheS1zdGF0ZSB2YXJpYWJsZXMgKi8KKyAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICAgYkZyYW1lZG9uZTsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaUZyYW1lc2VxOworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpTGF5ZXJzZXE7CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlGcmFtZXRpbWU7ICAgICAgICAgLyogbWlsbGlzZWNzICovCisKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaVRvdGFsZnJhbWVzOyAgICAgICAvKiBlbmQtdG90YWxzIGFmdGVyIG1uZ19yZWFkKCkgKi8KKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaVRvdGFsbGF5ZXJzOworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpVG90YWxwbGF5dGltZTsgICAgIC8qIG1pbGxpc2VjcyAqLworCisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJTa2lwcGluZzsgICAgICAgICAgLyogTE9PUCBpdGVyYXRpb249MCAqLworICAgICAgICAgICAKKyNpZmRlZiBNTkdfU1VQUE9SVF9EWU5BTUlDTU5HCisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJEeW5hbWljOyAgICAgICAgICAgLyogTU5HIGlzIGR5bmFtaWMgKGVnLiBoYXMgZXZlbnRzKSAqLworICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICBiUnVubmluZ2V2ZW50OyAgICAgIC8qIGN1cnJlbnRseSBwcm9jZXNzaW5nIGFuIGV2ZW50ICovCisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJTdG9wYWZ0ZXJzZWVrOyAgICAgLyogc3RvcCBhZnRlciBuZXh0IFNFRUsgKi8KKyAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAgaUV2ZW50eDsgICAgICAgICAgICAvKiBYL1kgb2YgY3VycmVudCBldmVudCAqLworICAgICAgICAgICBtbmdfaW50MzIgICAgICAgICBpRXZlbnR5OworICAgICAgICAgICBtbmdfb2JqZWN0cCAgICAgICBwTGFzdG1vdXNlbW92ZTsgICAgIC8qIGxhc3QgZXZlbnQgdHJpZ2dlcmVkICovCisjZW5kaWYKKworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpUmVxdWVzdGZyYW1lOyAgICAgIC8qIGdvX3h4eHggdmFyaWFibGVzICovCisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlSZXF1ZXN0bGF5ZXI7CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlSZXF1ZXN0dGltZTsKKyAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICAgYlNlYXJjaGluZzsKKworICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICBiUmVzdG9yZWJrZ2Q7ICAgICAgIC8qIGZsYWdzIHJlc3RvcmUgcmVxdWlyZWQgYmVmb3JlIElEQVQvSkRBVCAqLworCisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlSdW50aW1lOyAgICAgICAgICAgLyogbWlsbGlzZWNzIHNpbmNlIHN0YXJ0ICovCisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlTeW5jdGltZTsgICAgICAgICAgLyogdGlja2NvdW50IGF0IGxhc3QgZnJhbWVzeW5jICovCisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlTdGFydHRpbWU7ICAgICAgICAgLyogdGlja2NvdW50IGF0IHN0YXJ0ICovCisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlFbmR0aW1lOyAgICAgICAgICAgLyogdGlja2NvdW50IGF0IGVuZCAqLworICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICBiUnVubmluZzsgICAgICAgICAgIC8qIGFuaW1hdGlvbiBpcyBhY3RpdmUgKi8KKyAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICAgYlRpbWVyc2V0OyAgICAgICAgICAvKiB0aGUgdGltZXIgaGFzIGJlZW4gc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlJ3JlIGV4cGVjdGluZyBhIGNhbGwgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfZGlzcGxheV9yZXN1bWUhICovCisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlCcmVha3BvaW50OyAgICAgICAgLyogaW5kaWNhdGVzIGF0IHdoaWNoIHBvaW50IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb3cgd2FzIGJyb2tlbiB0byBydW4gdGhlIHRpbWVyICovCisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJTZWN0aW9ud2FpdDsgICAgICAgLyogaW5kaWNhdGVzIGEgc2VjdGlvbiBicmVhayAqLworICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICBiRnJlZXppbmc7ICAgICAgICAgIC8qIGluZGljYXRlcyBhcHAgcmVxdWVzdGVkIGEgZnJlZXplICovICAgCisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJSZXNldHRpbmc7ICAgICAgICAgLyogaW5kaWNhdGVzIGFwcCByZXF1ZXN0ZWQgYSByZXNldCAqLyAgIAorICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICBiTmVlZHJlZnJlc2g7ICAgICAgIC8qIGluZGljYXRlcyBzY3JlZW4tcmVmcmVzaCBpcyBuZWVkZWQgKi8KKyAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICAgYk1pc3BsYWNlZFRFUk07ICAgICAvKiBpbmRpY2F0ZXMgVEVSTSBpcyBvdXQgb2YgcGxhY2UgKi8KKyAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICAgYk9ubHlmaXJzdGZyYW1lOyAgICAvKiBzaG93IGZpcnN0IGZyYW1lIGFmdGVyIFRFUk0gYW5kIHN0b3AgKi8KKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaUZyYW1lc2FmdGVyVEVSTTsgICAvKiBkZXRlcm1pbmVzIGZyYW1lLWNvdW50IGFmdGVyIFRFUk0gKi8gICAgICAgICAgCisgICAgICAgICAgIG1uZ19vYmplY3RwICAgICAgIHBDdXJyZW50b2JqOyAgICAgICAgLyogY3VycmVudCAib2JqZWN0IiAqLworICAgICAgICAgICBtbmdfb2JqZWN0cCAgICAgICBwQ3VycmFuaW9iajsgICAgICAgIC8qIGN1cnJlbnQgYW5pbWF0aW9uIG9iamVjdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0byBiZSIvImJlaW5nIiBwcm9jZXNzZWQgKi8KKyAgICAgICAgICAgbW5nX29iamVjdHAgICAgICAgcFRlcm1hbmlvYmo7ICAgICAgICAvKiBURVJNIGFuaW1hdGlvbiBvYmplY3QgKi8KKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaUl0ZXJhdGlvbnM7ICAgICAgICAvKiBURVJNL01FTkQgaXRlcmF0aW9uIGNvdW50ICovCisgICAgICAgICAgIG1uZ19vYmplY3RwICAgICAgIHBPYmp6ZXJvOyAgICAgICAgICAgLyogIm9uLXRoZS1mbHkiIGltYWdlIChvYmplY3QgPSAwKSAqLworICAgICAgICAgICBtbmdfb2JqZWN0cCAgICAgICBwTGFzdGNsb25lOyAgICAgICAgIC8qIGxhc3QgY2xvbmUgKi8KKyAgICAgICAgICAgbW5nX29iamVjdHAgICAgICAgcFN0b3Jlb2JqOyAgICAgICAgICAvKiBjdXJyZW50IHN0b3JlIG9iamVjdCBmb3Igcm93IHJvdXRpbmVzICovCisgICAgICAgICAgIG1uZ19vYmplY3RwICAgICAgIHBTdG9yZWJ1ZjsgICAgICAgICAgLyogY3VycmVudCBzdG9yZSBvYmplY3QtYnVmZmVyIGZvciByb3cgcm91dGluZXMgKi8KKyAgICAgICAgICAgbW5nX29iamVjdHAgICAgICAgcFJldHJpZXZlb2JqOyAgICAgICAvKiBjdXJyZW50IHJldHJpZXZlIG9iamVjdCBmb3Igcm93IHJvdXRpbmVzICovCisgICAgICAgICAgIG1uZ19zYXZlZGF0YXAgICAgIHBTYXZlZGF0YTsgICAgICAgICAgLyogcG9pbnRlciB0byBzYXZlZCBkYXRhIChhZnRlciBTQVZFKSAqLworCisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlVcGRhdGVsZWZ0OyAgICAgICAgLyogdXBkYXRlIHJlZ2lvbiBmb3IgcmVmcmVzaCAqLworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpVXBkYXRlcmlnaHQ7CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlVcGRhdGV0b3A7CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlVcGRhdGVib3R0b207CisKKyAgICAgICAgICAgbW5nX2ludDggICAgICAgICAgaVBhc3M7ICAgICAgICAgICAgICAvKiBjdXJyZW50IGludGVybGFjaW5nIHBhc3M7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVnYXRpdmUgdmFsdWUgbWVhbnMgbm8gaW50ZXJsYWNlICovCisgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgIGlSb3c7ICAgICAgICAgICAgICAgLyogY3VycmVudCByb3cgY291bnRlciAqLworICAgICAgICAgICBtbmdfaW50MzIgICAgICAgICBpUm93aW5jOyAgICAgICAgICAgIC8qIHJvdyBpbmNyZW1lbnQgZm9yIHRoaXMgcGFzcyAqLworICAgICAgICAgICBtbmdfaW50MzIgICAgICAgICBpQ29sOyAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgc3RhcnRpbmcgY29sdW1uICovCisgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgIGlDb2xpbmM7ICAgICAgICAgICAgLyogY29sdW1uIGluY3JlbWVudCBmb3IgdGhpcyBwYXNzICovCisgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgIGlSb3dzYW1wbGVzOyAgICAgICAgLyogbnIuIG9mIHNhbXBsZXMgaW4gY3VycmVudCB3b3Jrcm93ICovCisgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgIGlTYW1wbGVtdWw7ICAgICAgICAgLyogbmVlZGVkIHRvIGNhbGN1bGF0ZSByb3dzaXplICovCisgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgIGlTYW1wbGVvZnM7ICAgICAgICAgICAgLyogZnJvbSByb3dzYW1wbGVzICovCisgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgIGlTYW1wbGVkaXY7CisgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgIGlSb3dzaXplOyAgICAgICAgICAgLyogc2l6ZSBvZiBhY3R1YWwgZGF0YSBpbiB3b3JrIHJvdyAqLworICAgICAgICAgICBtbmdfaW50MzIgICAgICAgICBpUm93bWF4OyAgICAgICAgICAgIC8qIG1heGltdW0gc2l6ZSBvZiBkYXRhIGluIHdvcmsgcm93ICovCisgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgIGlGaWx0ZXJvZnM7ICAgICAgICAgLyogb2Zmc2V0IHRvIGZpbHRlci1ieXRlIGluIHdvcmsgcm93ICovCisgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgIGlQaXhlbG9mczsgICAgICAgICAgLyogb2Zmc2V0IHRvIHBpeGVsLWJ5dGVzIGluIHdvcmsgcm93ICovCisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlMZXZlbDA7ICAgICAgICAgICAgLyogbGV2ZWxpbmcgdmFyaWFibGVzICovCisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlMZXZlbDE7CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlMZXZlbDI7CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlMZXZlbDM7CisgICAgICAgICAgIG1uZ191aW50OHAgICAgICAgIHBXb3Jrcm93OyAgICAgICAgICAgLyogd29ya2luZyByb3cgb2YgcGl4ZWwtZGF0YSAqLworICAgICAgICAgICBtbmdfdWludDhwICAgICAgICBwUHJldnJvdzsgICAgICAgICAgIC8qIHByZXZpb3VzIHJvdyBvZiBwaXhlbC1kYXRhICovCisgICAgICAgICAgIG1uZ191aW50OHAgICAgICAgIHBSR0JBcm93OyAgICAgICAgICAgLyogaW50ZXJtZWRpYXRlIHJvdyBvZiBSR0JBOCBvciBSR0JBMTYgZGF0YSAqLworICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICBiSXNSR0JBMTY7ICAgICAgICAgIC8qIGluZGljYXRlcyBpbnRlcm1lZGlhdGUgcm93IGlzIFJHQkExNiAqLworICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICBiSXNPcGFxdWU7ICAgICAgICAgIC8qIGluZGljYXRlcyBpbnRlcm1lZGlhdGUgcm93IGlzIGZ1bGx5IG9wYXF1ZSAqLworICAgICAgICAgICBtbmdfaW50MzIgICAgICAgICBpRmlsdGVyYnBwOyAgICAgICAgIC8qIGJwcCBpbmRleCBmb3IgZmlsdGVyaW5nIHJvdXRpbmVzICovCisKKyAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAgaVNvdXJjZWw7ICAgICAgICAgICAvKiB2YXJpYWJsZXMgZm9yIHNob3dpbmcgb2JqZWN0cyAqLworICAgICAgICAgICBtbmdfaW50MzIgICAgICAgICBpU291cmNlcjsKKyAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAgaVNvdXJjZXQ7CisgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgIGlTb3VyY2ViOworICAgICAgICAgICBtbmdfaW50MzIgICAgICAgICBpRGVzdGw7CisgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgIGlEZXN0cjsKKyAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAgaURlc3R0OworICAgICAgICAgICBtbmdfaW50MzIgICAgICAgICBpRGVzdGI7CisKKyAgICAgICAgICAgbW5nX29iamVjdHAgICAgICAgcEZpcnN0aW1nb2JqOyAgICAgICAvKiBkb3VibGUtbGlua2VkIGxpc3Qgb2YgKi8KKyAgICAgICAgICAgbW5nX29iamVjdHAgICAgICAgcExhc3RpbWdvYmo7ICAgICAgICAvKiBpbWFnZS1vYmplY3Qgc3RydWN0dXJlcyAqLworICAgICAgICAgICBtbmdfb2JqZWN0cCAgICAgICBwRmlyc3RhbmlvYmo7ICAgICAgIC8qIGRvdWJsZS1saW5rZWQgbGlzdCBvZiAqLworICAgICAgICAgICBtbmdfb2JqZWN0cCAgICAgICBwTGFzdGFuaW9iajsgICAgICAgIC8qIGFuaW1hdGlvbi1vYmplY3Qgc3RydWN0dXJlcyAqLworI2lmZGVmIE1OR19TVVBQT1JUX0RZTkFNSUNNTkcKKyAgICAgICAgICAgbW5nX29iamVjdHAgICAgICAgcEZpcnN0ZXZlbnQ7ICAgICAgICAvKiBkb3VibGUtbGlua2VkIGxpc3Qgb2YgKi8KKyAgICAgICAgICAgbW5nX29iamVjdHAgICAgICAgcExhc3RldmVudDsgICAgICAgICAvKiBldmVudC1vYmplY3Qgc3RydWN0dXJlcyAqLworI2VuZGlmCisKKyNpZiBkZWZpbmVkKE1OR19HQU1NQV9PTkxZKSB8fCBkZWZpbmVkKE1OR19GVUxMX0NNUykgfHwgZGVmaW5lZChNTkdfQVBQX0NNUykKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgYUdhbW1hdGFiWzI1Nl07ICAgICAvKiBwcmVjb21wdXRlZCBnYW1tYSBsb29rdXAgdGFibGUgKi8KKyAgICAgICAgICAgbW5nX2Zsb2F0ICAgICAgICAgZExhc3RnYW1tYTsgICAgICAgICAvKiBsYXN0IGdhbW1hIHVzZWQgdG8gY29tcHV0ZSB0YWJsZSAqLworI2VuZGlmCisKKyAgICAgICAgICAgbW5nX2ZwdHIgICAgICAgICAgZkRpc3BsYXlyb3c7ICAgICAgICAvKiBpbnRlcm5hbCBjYWxsYmFjayB0byBkaXNwbGF5IGFuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5jb21wcmVzc2VkL3VuZmlsdGVyZWQvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3ItY29ycmVjdGVkIHJvdyAqLworICAgICAgICAgICBtbmdfZnB0ciAgICAgICAgICBmUmVzdGJrZ2Ryb3c7ICAgICAgIC8qIGludGVybmFsIGNhbGxiYWNrIGZvciByZXN0b3JlLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQgcHJvY2Vzc2luZyBvZiBhIHJvdyAqLworICAgICAgICAgICBtbmdfZnB0ciAgICAgICAgICBmQ29ycmVjdHJvdzsgICAgICAgIC8qIGludGVybmFsIGNhbGxiYWNrIHRvIGNvbG9yLWNvcnJlY3QgYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmNvbXByZXNzZWQvdW5maWx0ZXJlZCByb3cgKi8KKyAgICAgICAgICAgbW5nX2ZwdHIgICAgICAgICAgZlJldHJpZXZlcm93OyAgICAgICAvKiBpbnRlcm5hbCBjYWxsYmFjayB0byByZXRyaWV2ZSBhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuY29tcHJlc3NlZC91bmZpbHRlcmVkIHJvdyBvZiBkYXRhICovCisgICAgICAgICAgIG1uZ19mcHRyICAgICAgICAgIGZTdG9yZXJvdzsgICAgICAgICAgLyogaW50ZXJuYWwgY2FsbGJhY2sgdG8gc3RvcmUgYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmNvbXByZXNzZWQvdW5maWx0ZXJlZCByb3cgb2YgZGF0YSAqLworICAgICAgICAgICBtbmdfZnB0ciAgICAgICAgICBmUHJvY2Vzc3JvdzsgICAgICAgIC8qIGludGVybmFsIGNhbGxiYWNrIHRvIHByb2Nlc3MgYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmNvbXByZXNzZWQgcm93IG9mIGRhdGEgKi8KKyAgICAgICAgICAgbW5nX2ZwdHIgICAgICAgICAgZkRpZmZlcnJvdzsgICAgICAgICAvKiBpbnRlcm5hbCBjYWxsYmFjayB0byBwZXJmb3JtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkZWQgZmlsdGVyIGxldmVsaW5nIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmluZyBvbiBhbiB1bmZpbHRlcmVkIHJvdyAqLworICAgICAgICAgICBtbmdfZnB0ciAgICAgICAgICBmU2NhbGVyb3c7ICAgICAgICAgIC8qIGludGVybmFsIGNhbGxiYWNrIHRvIHNjYWxlIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YS1yb3cgdG8gdGhlIGJpdGRlcHRoIG9mIGl0cyB0YXJnZXQgKi8KKyAgICAgICAgICAgbW5nX2ZwdHIgICAgICAgICAgZkRlbHRhcm93OyAgICAgICAgICAvKiBpbnRlcm5hbCBjYWxsYmFjayB0byBleGVjdXRlIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YS1yb3cgb250byBhIHRhcmdldCAqLworI2lmbmRlZiBNTkdfU0tJUENIVU5LX1BBU1QKKyAgICAgICAgICAgbW5nX2ZwdHIgICAgICAgICAgZkZsaXByb3c7ICAgICAgICAgICAvKiBpbnRlcm5hbCBjYWxsYmFjayB0byBmbGlwIGEgcm93IG9mIHBpeGVscworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ8LT5yaWdodCBmb3IgYSBQQVNUIG9wZXJhdGlvbiAqLworICAgICAgICAgICBtbmdfZnB0ciAgICAgICAgICBmVGlsZXJvdzsgICAgICAgICAgIC8qIGludGVybmFsIGNhbGxiYWNrIHRvIHRpbGUgYSByb3cgb2YgcGl4ZWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyaW5nIGEgUEFTVCBvcGVyYXRpb24gKi8KKyNlbmRpZgorICAgICAgICAgICBtbmdfZnB0ciAgICAgICAgICBmSW5pdHJvd3Byb2M7ICAgICAgIC8qIGludGVybmFsIGNhbGxiYWNrIHRvIGluaXRpYWxpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcm93IHByb2Nlc3NpbmcgKi8KKworICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICBpREVGSW9iamVjdGlkOyAgICAgIC8qIERFRkkgZmllbGRzICovCisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJERUZJaGFzZG9ub3RzaG93OworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpREVGSWRvbm90c2hvdzsKKyAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICAgYkRFRkloYXNjb25jcmV0ZTsKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaURFRkljb25jcmV0ZTsKKyAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICAgYkRFRkloYXNsb2NhOworICAgICAgICAgICBtbmdfaW50MzIgICAgICAgICBpREVGSWxvY2F4OworICAgICAgICAgICBtbmdfaW50MzIgICAgICAgICBpREVGSWxvY2F5OworICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICBiREVGSWhhc2NsaXA7CisgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgIGlERUZJY2xpcGw7CisgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgIGlERUZJY2xpcHI7CisgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgIGlERUZJY2xpcHQ7CisgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgIGlERUZJY2xpcGI7CisKKyAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAgaUJBQ0tyZWQ7ICAgICAgICAgICAvKiBCQUNLIGZpZWxkcyAqLworICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICBpQkFDS2dyZWVuOworICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICBpQkFDS2JsdWU7CisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlCQUNLbWFuZGF0b3J5OworICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICBpQkFDS2ltYWdlaWQ7CisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlCQUNLdGlsZTsKKworICAgICAgICAgICBtbmdfaW50MzIgICAgICAgICBpQmFja2ltZ29mZnN4OyAgICAgIC8qIHRlbXAgdmFyaWFibGVzIGZvciByZXN0b3JlX2JrZ2QgKi8KKyAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAgaUJhY2tpbWdvZmZzeTsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaUJhY2tpbWd3aWR0aDsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaUJhY2tpbWdoZWlnaHQ7CisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19GUkFNCisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlGUkFNbW9kZTsgICAgICAgICAgLyogRlJBTSBmaWVsZHMgKGdsb2JhbCkgKi8KKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaUZSQU1kZWxheTsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaUZSQU10aW1lb3V0OworICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICBiRlJBTWNsaXBwaW5nOworICAgICAgICAgICBtbmdfaW50MzIgICAgICAgICBpRlJBTWNsaXBsOworICAgICAgICAgICBtbmdfaW50MzIgICAgICAgICBpRlJBTWNsaXByOworICAgICAgICAgICBtbmdfaW50MzIgICAgICAgICBpRlJBTWNsaXB0OworICAgICAgICAgICBtbmdfaW50MzIgICAgICAgICBpRlJBTWNsaXBiOworCisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlGcmFtZW1vZGU7ICAgICAgICAgLyogY3VycmVudCBzdWJmcmFtZSB2YXJpYWJsZXMgKi8KKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaUZyYW1lZGVsYXk7CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlGcmFtZXRpbWVvdXQ7CisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJGcmFtZWNsaXBwaW5nOworICAgICAgICAgICBtbmdfaW50MzIgICAgICAgICBpRnJhbWVjbGlwbDsKKyAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAgaUZyYW1lY2xpcHI7CisgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgIGlGcmFtZWNsaXB0OworICAgICAgICAgICBtbmdfaW50MzIgICAgICAgICBpRnJhbWVjbGlwYjsKKworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpTmV4dGRlbGF5OyAgICAgICAgIC8qIGRlbGF5ICphZnRlciogbmV4dCBpbWFnZSAqLworI2VuZGlmCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19TSE9XCisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlTSE9XbW9kZTsgICAgICAgICAgLyogU0hPVyBmaWVsZHMgKi8KKyAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAgaVNIT1dmcm9taWQ7CisgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgIGlTSE9XdG9pZDsKKyAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAgaVNIT1duZXh0aWQ7CisgICAgICAgICAgIG1uZ19pbnQxNiAgICAgICAgIGlTSE9Xc2tpcDsKKyNlbmRpZgorCisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlHbG9iYWxQTFRFY291bnQ7ICAgLyogZ2xvYmFsIFBMVEUgZmllbGRzICovCisgICAgICAgICAgIG1uZ19yZ2JwYWx0YWIgICAgIGFHbG9iYWxQTFRFZW50cmllczsKKworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpR2xvYmFsVFJOU3Jhd2xlbjsgIC8qIGdsb2JhbCB0Uk5TIGZpZWxkcyAqLworICAgICAgICAgICBtbmdfdWludDhhcnIgICAgICBhR2xvYmFsVFJOU3Jhd2RhdGE7CisKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaUdsb2JhbEdhbW1hOyAgICAgICAvKiBnbG9iYWwgZ0FNQSBmaWVsZHMgKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX2NIUk0KKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaUdsb2JhbFdoaXRlcG9pbnR4OyAvKiBnbG9iYWwgY0hSTSBmaWVsZHMgKi8KKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaUdsb2JhbFdoaXRlcG9pbnR5OworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpR2xvYmFsUHJpbWFyeXJlZHg7CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlHbG9iYWxQcmltYXJ5cmVkeTsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaUdsb2JhbFByaW1hcnlncmVlbng7CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlHbG9iYWxQcmltYXJ5Z3JlZW55OworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpR2xvYmFsUHJpbWFyeWJsdWV4OworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpR2xvYmFsUHJpbWFyeWJsdWV5OworI2VuZGlmCisKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaUdsb2JhbFJlbmRpbnRlbnQ7ICAvKiBnbG9iYWwgc1JHQiBmaWVsZHMgKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX2lDQ1AKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaUdsb2JhbFByb2ZpbGVzaXplOyAvKiBnbG9iYWwgaUNDUCBmaWVsZHMgKi8KKyAgICAgICAgICAgbW5nX3B0ciAgICAgICAgICAgcEdsb2JhbFByb2ZpbGU7CisjZW5kaWYKKworICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICBpR2xvYmFsQktHRHJlZDsgICAgIC8qIGdsb2JhbCBiS0dEIGZpZWxkcyAqLworICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICBpR2xvYmFsQktHRGdyZWVuOworICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICBpR2xvYmFsQktHRGJsdWU7CisKKyAgICAgICAgICAgbW5nX3B0ciAgICAgICAgICAgcERlbHRhSW1hZ2U7ICAgICAgICAvKiBkZWx0YS1pbWFnZSBmaWVsZHMgKi8KKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaURlbHRhSW1hZ2V0eXBlOworI2VuZGlmIC8qIE1OR19TVVBQT1JUX0RJU1BMQVkgKi8KKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaURlbHRhdHlwZTsgICAgICAgICAvKiBuZWVkIHRoaXMgb25lIGluIHJlYWQgcHJvY2Vzc2luZyAhISAqLworI2lmZGVmIE1OR19TVVBQT1JUX0RJU1BMQVkKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaURlbHRhQmxvY2t3aWR0aDsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaURlbHRhQmxvY2toZWlnaHQ7CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlEZWx0YUJsb2NreDsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaURlbHRhQmxvY2t5OworICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICBiRGVsdGFpbW1lZGlhdGU7CisKKyAgICAgICAgICAgbW5nX2ZwdHIgICAgICAgICAgZkRlbHRhZ2V0cm93OyAgICAgICAvKiBpbnRlcm5hbCBkZWx0YS1wcm9jIGNhbGxiYWNrcyAqLworICAgICAgICAgICBtbmdfZnB0ciAgICAgICAgICBmRGVsdGFhZGRyb3c7CisgICAgICAgICAgIG1uZ19mcHRyICAgICAgICAgIGZEZWx0YXJlcGxhY2Vyb3c7CisgICAgICAgICAgIG1uZ19mcHRyICAgICAgICAgIGZEZWx0YXB1dHJvdzsKKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX1BST00KKyAgICAgICAgICAgbW5nX2ZwdHIgICAgICAgICAgZlByb21vdGVyb3c7ICAgICAgICAvKiBpbnRlcm5hbCBQUk9NIGZpZWxkcyAqLworICAgICAgICAgICBtbmdfZnB0ciAgICAgICAgICBmUHJvbUJpdGRlcHRoOworICAgICAgICAgICBtbmdfcHRyICAgICAgICAgICBwUHJvbUJ1ZjsKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaVByb21Db2xvcnR5cGU7CisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlQcm9tQml0ZGVwdGg7CisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlQcm9tRmlsbHR5cGU7CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlQcm9tV2lkdGg7CisgICAgICAgICAgIG1uZ19wdHIgICAgICAgICAgIHBQcm9tU3JjOworICAgICAgICAgICBtbmdfcHRyICAgICAgICAgICBwUHJvbURzdDsKKyNlbmRpZgorCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfTUFHTgorICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICBpTUFHTmZyb21pZDsKKyAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAgaU1BR05jdXJyZW50aWQ7CisgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgIGlNQUdOdG9pZDsKKyNlbmRpZgorCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfUEFTVAorICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICBpUEFTVGlkOworICAgICAgICAgICBtbmdfaW50MzIgICAgICAgICBpUGFzdHg7ICAgICAgICAgICAgIC8qIHRhcmdldCB4L3kgb2YgbGFzdCBQQVNUICovCisgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgIGlQYXN0eTsKKyNlbmRpZgorCisgICAgICAgICAgIG1uZ19vYmplY3RwICAgICAgIHBMYXN0c2VlazsgICAgICAgICAgLyogbGFzdCBwcm9jZXNzZWQgYW5pX3NlZWsgb2JqZWN0ICovCisKKyNpZmRlZiBNTkdfSU5DTFVERV9NUE5HX1BST1BPU0FMCisgICAgICAgICAgIG1uZ19vYmplY3RwICAgICAgIHBNUE5HOyAgICAgICAgICAgICAgLyogbXBORyBvYmplY3QgaWYgYXZhaWxhYmxlICovCisjZW5kaWYKKyNpZmRlZiBNTkdfSU5DTFVERV9BTkdfUFJPUE9TQUwKKyAgICAgICAgICAgbW5nX29iamVjdHAgICAgICAgcEFORzsgICAgICAgICAgICAgICAvKiBBTkcgb2JqZWN0IGlmIGF2YWlsYWJsZSAqLworI2VuZGlmCisKKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisKKyNpZmRlZiBNTkdfSU5DTFVERV9aTElCCisgICAgICAgICAgIHpfc3RyZWFtICAgICAgICAgIHNabGliOyAgICAgICAgICAgICAgLyogemxpYiAoZGUpY29tcHJlc3Npb24gdmFyaWFibGVzICovCisKKyAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAgaVpsZXZlbDsgICAgICAgICAgICAvKiB6bGliIGNvbXByZXNzaW9uIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAgaVptZXRob2Q7CisgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgIGlad2luZG93Yml0czsKKyAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAgaVptZW1sZXZlbDsKKyAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAgaVpzdHJhdGVneTsKKworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpTWF4SURBVDsgICAgICAgICAgIC8qIG1heGltdW0gc2l6ZSBvZiBJREFUIGRhdGEgKi8KKworICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICBiSW5mbGF0aW5nOyAgICAgICAgIC8qIGluZGljYXRlcyAiaW5mbGF0ZSIgaW4gcHJvZ3Jlc3MgKi8KKyAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICAgYkRlZmxhdGluZzsgICAgICAgICAvKiBpbmRpY2F0ZXMgImRlZmxhdGUiIGluIHByb2dyZXNzICovCisjZW5kaWYgLyogTU5HX0lOQ0xVREVfWkxJQiAqLworCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisgICAgICAgICAgIG1uZ2pwZWdfZGN0bWV0aG9kIGVKUEVHZGN0bWV0aG9kOyAgICAgLyogSUpHIGNvbXByZXNzaW9uIHZhcmlhYmxlcyAqLworICAgICAgICAgICBtbmdfaW50MzIgICAgICAgICBpSlBFR3F1YWxpdHk7CisgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgIGlKUEVHc21vb3RoaW5nOworICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICBiSlBFR2NvbXByZXNzcHJvZ3I7CisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJKUEVHY29tcHJlc3NvcHQ7CisKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaU1heEpEQVQ7ICAgICAgICAgICAvKiBtYXhpbXVtIHNpemUgb2YgSkRBVC9KREFBIGRhdGEgKi8KKworICAgICAgICAgICBtbmdqcGVnX2NvbXBwICAgICBwSlBFR2NpbmZvOyAgICAgICAgIC8qIGNvbXByZXNzaW9uIHN0cnVjdHVyZSAqLworICAgICAgICAgICBtbmdqcGVnX2Vycm9ycCAgICBwSlBFR2NlcnI7ICAgICAgICAgIC8qIGVycm9yLW1hbmFnZXIgY29tcHJlc3MgKi8KKworICAgICAgICAgICBtbmdqcGVnX2RlY29tcHAgICBwSlBFR2RpbmZvOyAgICAgICAgIC8qIGRlY29tcHJlc3Npb24gc3RydWN0dXJlIChKREFUKSAqLworICAgICAgICAgICBtbmdqcGVnX2Vycm9ycCAgICBwSlBFR2RlcnI7ICAgICAgICAgIC8qIGVycm9yLW1hbmFnZXIgZGVjb21wcmVzcyAoSkRBVCkgKi8KKyAgICAgICAgICAgbW5nanBlZ19zb3VyY2VwICAgcEpQRUdkc3JjOyAgICAgICAgICAvKiBzb3VyY2UtbWFuYWdlciBkZWNvbXByZXNzIChKREFUKSAqLworCisgICAgICAgICAgIG1uZ2pwZWdfZGVjb21wcCAgIHBKUEVHZGluZm8yOyAgICAgICAgLyogZGVjb21wcmVzc2lvbiBzdHJ1Y3R1cmUgKEpEQUEpICovCisgICAgICAgICAgIG1uZ2pwZWdfZXJyb3JwICAgIHBKUEVHZGVycjI7ICAgICAgICAgLyogZXJyb3ItbWFuYWdlciBkZWNvbXByZXNzIChKREFBKSAqLworICAgICAgICAgICBtbmdqcGVnX3NvdXJjZXAgICBwSlBFR2RzcmMyOyAgICAgICAgIC8qIHNvdXJjZS1tYW5hZ2VyIGRlY29tcHJlc3MgKEpEQUEpICovCisKKyAgICAgICAgICAgbW5nX3VpbnQ4cCAgICAgICAgcEpQRUdidWY7ICAgICAgICAgICAvKiBidWZmZXIgZm9yIEpQRUcgKGRlKWNvbXByZXNzaW9uIChKREFUKSAqLworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpSlBFR2J1Zm1heDsgICAgICAgIC8qIGFsbG9jYXRlZCBzcGFjZSBmb3IgYnVmZmVyIChKREFUKSAqLworICAgICAgICAgICBtbmdfdWludDhwICAgICAgICBwSlBFR2N1cnJlbnQ7ICAgICAgIC8qIGN1cnJlbnQgcG9pbnRlciBpbnRvIGJ1ZmZlciAoSkRBVCkgKi8KKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaUpQRUdidWZyZW1haW47ICAgICAvKiByZW1haW5pbmcgYnl0ZXMgaW4gYnVmZmVyIChKREFUKSAqLworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpSlBFR3Rvc2tpcDsgICAgICAgIC8qIGJ5dGVzIHRvIHNraXAgb24gbmV4dCBpbnB1dC1ibG9jayAoSkRBVCkgKi8KKworICAgICAgICAgICBtbmdfdWludDhwICAgICAgICBwSlBFR2J1ZjI7ICAgICAgICAgIC8qIGJ1ZmZlciBmb3IgSlBFRyAoZGUpY29tcHJlc3Npb24gKEpEQUEpICovCisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlKUEVHYnVmbWF4MjsgICAgICAgLyogYWxsb2NhdGVkIHNwYWNlIGZvciBidWZmZXIgKEpEQUEpICovCisgICAgICAgICAgIG1uZ191aW50OHAgICAgICAgIHBKUEVHY3VycmVudDI7ICAgICAgLyogY3VycmVudCBwb2ludGVyIGludG8gYnVmZmVyIChKREFBKSAqLworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpSlBFR2J1ZnJlbWFpbjI7ICAgIC8qIHJlbWFpbmluZyBieXRlcyBpbiBidWZmZXIgKEpEQUEpICovCisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlKUEVHdG9za2lwMjsgICAgICAgLyogYnl0ZXMgdG8gc2tpcCBvbiBuZXh0IGlucHV0LWJsb2NrIChKREFBKSAqLworCisgICAgICAgICAgIG1uZ191aW50OHAgICAgICAgIHBKUEVHcm93OyAgICAgICAgICAgLyogYnVmZmVyIGZvciBhIEpQRUcgcm93IG9mIHNhbXBsZXMgKEpEQVQpICovCisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlKUEVHcm93bGVuOworCisgICAgICAgICAgIG1uZ191aW50OHAgICAgICAgIHBKUEVHcm93MjsgICAgICAgICAgLyogYnVmZmVyIGZvciBhIEpQRUcgcm93IG9mIHNhbXBsZXMgKEpEQUEpICovCisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlKUEVHcm93bGVuMjsKKworICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICBiSlBFR2NvbXByZXNzOyAgICAgIC8qIGluZGljYXRlcyAiY29tcHJlc3MiIGluaXRpYWxpemVkICovCisKKyAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICAgYkpQRUdkZWNvbXByZXNzOyAgICAvKiBpbmRpY2F0ZXMgImRlY29tcHJlc3MiIGluaXRpYWxpemVkIChKREFUKSAqLworICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICBiSlBFR2hhc2hlYWRlcjsgICAgIC8qIGluZGljYXRlcyAicmVhZGhlYWRlciIgc3VjY2VlZGVkIChKREFUKSAqLworICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICBiSlBFR2RlY29zdGFydGVkOyAgIC8qIGluZGljYXRlcyAiZGVjb21wcmVzcyIgc3RhcnRlZCAoSkRBVCkgKi8KKyAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICAgYkpQRUdzY2Fuc3RhcnRlZDsgICAvKiBpbmRpY2F0ZXMgImZpcnN0IHNjYW4iIHN0YXJ0ZWQgKEpEQVQpICovCisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJKUEVHc2NhbmVuZGluZzsgICAgLyogaW5kaWNhdGVzICJmaW5pc2hfb3V0cHV0IiBzdXNwZW5kZWQgKEpEQVQpICovCisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJKUEVHcHJvZ3Jlc3NpdmU7ICAgLyogaW5kaWNhdGVzIGEgcHJvZ3Jlc3NpdmUgaW1hZ2UgKEpEQVQpICovCisKKyAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICAgYkpQRUdkZWNvbXByZXNzMjsgICAvKiBpbmRpY2F0ZXMgImRlY29tcHJlc3MiIGluaXRpYWxpemVkIChKREFBKSAqLworICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICBiSlBFR2hhc2hlYWRlcjI7ICAgIC8qIGluZGljYXRlcyAicmVhZGhlYWRlciIgc3VjY2VlZGVkIChKREFBKSAqLworICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICBiSlBFR2RlY29zdGFydGVkMjsgIC8qIGluZGljYXRlcyAiZGVjb21wcmVzcyIgc3RhcnRlZCAoSkRBQSkgKi8KKyAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICAgYkpQRUdzY2Fuc3RhcnRlZDI7ICAvKiBpbmRpY2F0ZXMgImZpcnN0IHNjYW4iIHN0YXJ0ZWQgKEpEQUEpICovCisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJKUEVHcHJvZ3Jlc3NpdmUyOyAgLyogaW5kaWNhdGVzIGEgcHJvZ3Jlc3NpdmUgaW1hZ2UgKEpEQUEpICovCisKKyAgICAgICAgICAgbW5nX2ZwdHIgICAgICAgICAgZlN0b3Jlcm93MjsgICAgICAgICAvKiBpbnRlcm5hbCBjYWxsYmFjayB0byBzdG9yZSBhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuY29tcHJlc3NlZC91bmZpbHRlcmVkIHJvdyBvZiBKUEVHLWRhdGEgKEpEQVQpICovCisKKyAgICAgICAgICAgbW5nX2ZwdHIgICAgICAgICAgZlN0b3Jlcm93MzsgICAgICAgICAvKiBpbnRlcm5hbCBjYWxsYmFjayB0byBzdG9yZSBhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuY29tcHJlc3NlZC91bmZpbHRlcmVkIHJvdyBvZiBKUEVHLWRhdGEgKEpEQUEpICovCisKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaUpQRUdyb3c7ICAgICAgICAgICAvKiByb3ctbnVtYmVyIGZvciBjdXJyZW50IEpQRUcgcm93ICovCisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlKUEVHYWxwaGFyb3c7ICAgICAgLyogbnIuIG9mIHJvd3MgZmlsbGVkIHdpdGggYWxwaGEgKi8KKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaUpQRUdyZ2Jyb3c7ICAgICAgICAvKiBuci4gb2Ygcm93cyBmaWxsZWQgd2l0aCAnY29sb3InLWluZm8gKi8KKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaUpQRUdkaXNwcm93OyAgICAgICAvKiBuci4gb2Ygcm93cyBhbHJlYWR5IGRpc3BsYXllZCAib24tdGhlLWZseSIgKi8KKworI2lmIGRlZmluZWQoTU5HX1VTRV9TRVRKTVApICYmIGRlZmluZWQgKE1OR19JTkNMVURFX0lKRzZCKQorICAgICAgICAgICBqbXBfYnVmICAgICAgICAgICBzRXJyb3JidWY7ICAgICAgICAgIC8qIHNldGptcC9sb25nam1wIGJ1ZmZlciAoZXJyb3ItcmVjb3ZlcnkpICovCisjZW5kaWYKKworI2VuZGlmIC8qIE1OR19JTkNMVURFX0pORyAqLworCisjaWZuZGVmIE1OR19VU0VfWkxJQl9DUkMKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgYUNSQ3RhYmxlIFsyNTZdOyAgICAvKiBDUkMgcHJlZmFiIHRhYmxlICovCisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJDUkNjb21wdXRlZDsgICAgICAgLyogImhhcyBiZWVuIGJ1aWx0IiBpbmRpY2F0b3IgKi8KKyNlbmRpZgorCisjaWZkZWYgTU5HX09QVElNSVpFX0ZPT1RQUklOVF9JTklUCisgICAgICAgICAgIHBuZ19pbWd0eXBlICAgICAgIGVQbmdfaW1ndHlwZTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChNTkdfTk9fMV8yXzRCSVRfU1VQUE9SVCkgfHwgZGVmaW5lZChNTkdfTk9fMTZCSVRfU1VQUE9SVCkKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaVBOR2RlcHRoOyAgICAgICAgICAvKiBSZWFsIGlucHV0IGRlcHRoICovCisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlQTkdtdWx0OworI2VuZGlmCisKKyNpZmRlZiBNTkdfT1BUSU1JWkVfRElTUExBWUNBTExTCisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlSYXdsZW47ICAgICAgICAgICAgLyogdGVtcCB2YXJzIGZvciBkaXNwbGF5IHByb2Nlc3NpbmcgKi8KKyAgICAgICAgICAgbW5nX3VpbnQ4cCAgICAgICAgcFJhd2RhdGE7CisjaWZuZGVmIE1OR19TS0lQQ0hVTktfQkFTSQorICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICBpQkFTSXJlZDsKKyAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAgaUJBU0lncmVlbjsKKyAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAgaUJBU0libHVlOworICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICBiQkFTSWhhc2FscGhhOworICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICBpQkFTSWFscGhhOworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpQkFTSXZpZXdhYmxlOworI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfQ0xPTgorICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICBpQ0xPTnNvdXJjZWlkOworICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICBpQ0xPTmNsb25laWQ7CisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlDTE9OY2xvbmV0eXBlOworICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICBiQ0xPTmhhc2Rvbm90c2hvdzsKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaUNMT05kb25vdHNob3c7CisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlDTE9OY29uY3JldGU7CisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJDTE9OaGFzbG9jYTsKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaUNMT05sb2NhdGlvbnR5cGU7CisgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgIGlDTE9ObG9jYXRpb254OworICAgICAgICAgICBtbmdfaW50MzIgICAgICAgICBpQ0xPTmxvY2F0aW9ueTsKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX0RJU0MKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaURJU0Njb3VudDsKKyAgICAgICAgICAgbW5nX3VpbnQxNnAgICAgICAgcERJU0NpZHM7CisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19GUkFNCisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlUZW1wRnJhbWVtb2RlOworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpVGVtcENoYW5nZWRlbGF5OworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpVGVtcERlbGF5OworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpVGVtcENoYW5nZXRpbWVvdXQ7CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlUZW1wVGltZW91dDsKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaVRlbXBDaGFuZ2VjbGlwcGluZzsKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaVRlbXBDbGlwdHlwZTsKKyAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAgaVRlbXBDbGlwbDsKKyAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAgaVRlbXBDbGlwcjsKKyAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAgaVRlbXBDbGlwdDsKKyAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAgaVRlbXBDbGlwYjsKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX01PVkUKKyAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAgaU1PVkVmcm9taWQ7CisgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgIGlNT1ZFdG9pZDsKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaU1PVkVtb3ZldHlwZTsKKyAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAgaU1PVkVtb3ZleDsKKyAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAgaU1PVkVtb3ZleTsKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX0NMSVAKKyAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAgaUNMSVBmcm9taWQ7CisgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgIGlDTElQdG9pZDsKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaUNMSVBjbGlwdHlwZTsKKyAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAgaUNMSVBjbGlwbDsKKyAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAgaUNMSVBjbGlwcjsKKyAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAgaUNMSVBjbGlwdDsKKyAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAgaUNMSVBjbGlwYjsKKyNlbmRpZgorI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgIGlESERSb2JqZWN0aWQ7CisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlESERSaW1hZ2V0eXBlOworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpREhEUmRlbHRhdHlwZTsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaURIRFJibG9ja3dpZHRoOworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpREhEUmJsb2NraGVpZ2h0OworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpREhEUmJsb2NreDsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaURIRFJibG9ja3k7CisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlQUk9NYml0ZGVwdGg7CisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlQUk9NY29sb3J0eXBlOworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpUFJPTWZpbGx0eXBlOworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpUFBMVHR5cGU7CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlQUExUY291bnQ7CisgICAgICAgICAgIG1uZ19wYWxldHRlOGVwICAgIHBhUFBMVGluZGV4ZW50cmllczsKKyAgICAgICAgICAgbW5nX3VpbnQ4cCAgICAgICAgcGFQUExUYWxwaGFlbnRyaWVzOworICAgICAgICAgICBtbmdfdWludDhwICAgICAgICBwYVBQTFR1c2VkZW50cmllczsKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX01BR04KKyAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAgaU1BR05maXJzdGlkOworICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICBpTUFHTmxhc3RpZDsKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaU1BR05tZXRob2RYOworICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICBpTUFHTm1YOworICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICBpTUFHTm1ZOworICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICBpTUFHTm1MOworICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICBpTUFHTm1SOworICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICBpTUFHTm1UOworICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICBpTUFHTm1COworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpTUFHTm1ldGhvZFk7CisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19QQVNUCisgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgIGlQQVNUdGFyZ2V0aWQ7CisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlQQVNUdGFyZ2V0dHlwZTsKKyAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAgaVBBU1R0YXJnZXR4OworICAgICAgICAgICBtbmdfaW50MzIgICAgICAgICBpUEFTVHRhcmdldHk7CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlQQVNUY291bnQ7CisgICAgICAgICAgIG1uZ19wdHIgICAgICAgICAgIHBQQVNUc291cmNlczsKKyNlbmRpZgorI2VuZGlmIC8qIE1OR19PUFRJTUlaRV9ESVNQTEFZQ0FMTFMgKi8KKworICAgICAgICB9IG1uZ19kYXRhOworCit0eXBlZGVmIG1uZ19kYXRhICogbW5nX2RhdGFwOworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogSW50ZXJuYWwgQ2FsbGJhY2stRnVuY3Rpb24gcHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKwordHlwZWRlZiBtbmdfcmV0Y29kZSgqbW5nX2Rpc3BsYXlyb3cpICAobW5nX2RhdGFwICBwRGF0YSk7Cit0eXBlZGVmIG1uZ19yZXRjb2RlKCptbmdfcmVzdGJrZ2Ryb3cpIChtbmdfZGF0YXAgIHBEYXRhKTsKK3R5cGVkZWYgbW5nX3JldGNvZGUoKm1uZ19jb3JyZWN0cm93KSAgKG1uZ19kYXRhcCAgcERhdGEpOwordHlwZWRlZiBtbmdfcmV0Y29kZSgqbW5nX3JldHJpZXZlcm93KSAobW5nX2RhdGFwICBwRGF0YSk7Cit0eXBlZGVmIG1uZ19yZXRjb2RlKCptbmdfc3RvcmVyb3cpICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKK3R5cGVkZWYgbW5nX3JldGNvZGUoKm1uZ19wcm9jZXNzcm93KSAgKG1uZ19kYXRhcCAgcERhdGEpOwordHlwZWRlZiBtbmdfcmV0Y29kZSgqbW5nX2luaXRyb3dwcm9jKSAobW5nX2RhdGFwICBwRGF0YSk7Cit0eXBlZGVmIG1uZ19yZXRjb2RlKCptbmdfZGlmZmVycm93KSAgIChtbmdfZGF0YXAgIHBEYXRhKTsKK3R5cGVkZWYgbW5nX3JldGNvZGUoKm1uZ19zY2FsZXJvdykgICAgKG1uZ19kYXRhcCAgcERhdGEpOwordHlwZWRlZiBtbmdfcmV0Y29kZSgqbW5nX2RlbHRhcm93KSAgICAobW5nX2RhdGFwICBwRGF0YSk7Cit0eXBlZGVmIG1uZ19yZXRjb2RlKCptbmdfcHJvbW90ZXJvdykgIChtbmdfZGF0YXAgIHBEYXRhKTsKK3R5cGVkZWYgbW5nX3JldGNvZGUoKm1uZ19mbGlwcm93KSAgICAgKG1uZ19kYXRhcCAgcERhdGEpOwordHlwZWRlZiBtbmdfcmV0Y29kZSgqbW5nX3RpbGVyb3cpICAgICAobW5nX2RhdGFwICBwRGF0YSk7CisKK3R5cGVkZWYgbW5nX3VpbnQ4ICAoKm1uZ19iaXRkZXB0aF84KSAgKG1uZ191aW50OCAgaUIpOwordHlwZWRlZiBtbmdfdWludDE2ICgqbW5nX2JpdGRlcHRoXzE2KSAobW5nX3VpbnQ4ICBpQik7CisKK3R5cGVkZWYgbW5nX3JldGNvZGUoKm1uZ19tYWduaWZ5X3gpICAgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgaVNyY2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIGlEc3RsaW5lKTsKK3R5cGVkZWYgbW5nX3JldGNvZGUoKm1uZ19tYWduaWZ5X3kpICAgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBpU3JjbGluZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIGlTcmNsaW5lMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgaURzdGxpbmUpOworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogUm91dGluZXMgZm9yIHN3YXBwaW5nIGJ5dGUtb3JkZXIgZnJvbSBhbmQgdG8gZ3JhcGhpYyBmaWxlcyAgICAgICAgICAgICAqICovCisvKiAqIChUaGlzIGNvZGUgaXMgYWRhcHRlZCBmcm9tIHRoZSBsaWJwbmcgcGFja2FnZSkgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX0JJR0VORElBTl9TVVBQT1JURUQKK21uZ191aW50MzIgbW5nX2dldF91aW50MzIgKG1uZ191aW50OHAgcEJ1Zik7CittbmdfaW50MzIgIG1uZ19nZXRfaW50MzIgIChtbmdfdWludDhwIHBCdWYpOworbW5nX3VpbnQxNiBtbmdfZ2V0X3VpbnQxNiAobW5nX3VpbnQ4cCBwQnVmKTsKK3ZvaWQgICAgICAgbW5nX3B1dF91aW50MzIgKG1uZ191aW50OHAgcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaSk7Cit2b2lkICAgICAgIG1uZ19wdXRfaW50MzIgIChtbmdfdWludDhwIHBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGkpOwordm9pZCAgICAgICBtbmdfcHV0X3VpbnQxNiAobW5nX3VpbnQ4cCBwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpKTsKKyNlbHNlIC8qIE1OR19CSUdFTkRJQU5fU1VQUE9SVEVEICovCisjZGVmaW5lIG1uZ19nZXRfdWludDMyKFApICAgKihtbmdfdWludDMycCkoUCkKKyNkZWZpbmUgbW5nX2dldF9pbnQzMihQKSAgICAqKG1uZ19pbnQzMnApKFApCisjZGVmaW5lIG1uZ19nZXRfdWludDE2KFApICAgKihtbmdfdWludDE2cCkoUCkKKyNkZWZpbmUgbW5nX3B1dF91aW50MzIoUCxJKSAqKG1uZ191aW50MzJwKShQKSA9IChJKQorI2RlZmluZSBtbmdfcHV0X2ludDMyKFAsSSkgICoobW5nX2ludDMycCkoUCkgPSAoSSkKKyNkZWZpbmUgbW5nX3B1dF91aW50MTYoUCxJKSAqKG1uZ191aW50MTZwKShQKSA9IChJKQorI2VuZGlmIC8qIE1OR19CSUdFTkRJQU5fU1VQUE9SVEVEICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBTb21lIGhhbmR5KD8pIG1hY3JvIGRlZmluaXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjZGVmaW5lIE1BWF9DT09SRChhLCBiKSAgKCgoYSkgPiAoYikpID8gKGEpIDogKGIpKQorI2RlZmluZSBNSU5fQ09PUkQoYSwgYikgICgoKGEpIDwgKGIpKSA/IChhKSA6IChiKSkKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2VuZGlmIC8qIF9saWJtbmdfZGF0YV9oXyAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiBlbmQgb2YgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCmRpZmYgLS1naXQgYS9maWxlcy9Tb3VyY2UvTGliTU5HL2xpYm1uZ19kaXNwbGF5LmMgYi9maWxlcy9Tb3VyY2UvTGliTU5HL2xpYm1uZ19kaXNwbGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRmYjkxZAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9MaWJNTkcvbGlibW5nX2Rpc3BsYXkuYwpAQCAtMCwwICsxLDcxMzUgQEAKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBsaWJtbmcuaCAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBwcm9qZWN0ICAgOiBsaWJtbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogZmlsZSAgICAgIDogbGlibW5nX2Rpc3BsYXkuYyAgICAgICAgICBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwNyBHLkp1eW4gICAqICovCisvKiAqIHZlcnNpb24gICA6IDEuMC4xMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogcHVycG9zZSAgIDogRGlzcGxheSBtYW5hZ2VtZW50IChpbXBsZW1lbnRhdGlvbikgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBhdXRob3IgICAgOiBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGNvbW1lbnQgICA6IGltcGxlbWVudGF0aW9uIG9mIHRoZSBkaXNwbGF5IG1hbmFnZW1lbnQgcm91dGluZXMgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogY2hhbmdlcyAgIDogMC41LjEgLSAwNS8wOC8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2hhbmdlZCBzdHJpY3QtQU5TSSBzdHVmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMSAtIDA1LzExLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBjYWxsYmFjayBlcnJvci1yZXBvcnRpbmcgc3VwcG9ydCAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgZnJhbWVfZGVsYXkgbWlzYWxpZ25tZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMSAtIDA1LzEyLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBzYW5pdHkgY2hlY2sgZm9yIGZyb3plbiBzdGF0dXMgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2hhbmdlZCB0cmFjZSB0byBtYWNybyBmb3IgY2FsbGJhY2sgZXJyb3ItcmVwb3J0aW5nICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMSAtIDA1LzEzLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjaGFuZ2VkIGRpc3BsYXlfbWVuZCB0byByZXNldCBzdGF0ZSB0byBpbml0aWFsIG9yIFNBVkUgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgZU1OR21hIGhhY2sgKHdpbGwgYmUgcmVtb3ZlZCBpbiAxLjAuMCAhISEpICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIFRFUk0gYW5pbWF0aW9uIG9iamVjdCBwb2ludGVyIChlYXNpZXIgcmVmZXJlbmNlKSAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBwcm9jZXNzX3NhdmUgJiBwcm9jZXNzX3NlZWsgcm91dGluZXMgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4xIC0gMDUvMTQvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHNhdmVfc3RhdGUgYW5kIHJlc3RvcmVfc3RhdGUgZm9yIFNBVkUvU0VFSy9URVJNICAgICogKi8KKy8qICogICAgICAgICAgICAgICBwcm9jZXNzaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMiAtIDA1LzIwLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBKTkcgc3VwcG9ydCAoSkhEUi9KREFUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4yIC0gMDUvMjMvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIHByb2JsZW0gd2l0aCBERUZJIGNsaXBwaW5nICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjIgLSAwNS8zMC8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgZGVsdGEtaW1hZ2Ugc3VwcG9ydCAoREhEUixQUk9NLElQTkcsSUpORykgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMiAtIDA1LzMxLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaXhlZCBwb2ludGVyIGNvbmZ1c2lvbiAoY29udHJpYnV0ZWQgYnkgVGltIFJvd2xleSkgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4yIC0gMDYvMDMvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIG1ha2V1cCBmb3IgTGludXggZ2NjIGNvbXBpbGUgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjIgLSAwNi8wNS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgc3VwcG9ydCBmb3IgUkdCOF9BOCBjYW52YXNzdHlsZSAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMiAtIDA2LzA5LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaXhlZCB0aW1lci1oYW5kbGluZyB0byBydW4gd2l0aCBNb3ppbGxhIChUaW0gUm93bGV5KSAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4yIC0gMDYvMTAvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIHNvbWUgY29tcGlsYXRpb24td2FybmluZ3MgKGNvbnRyaWIgSmFzb24gTW9ycmlzKSAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4zIC0gMDYvMTIvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIGRpc3BsYXkgb2Ygc3RvcmVkIEpORyBpbWFnZXMgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjMgLSAwNi8xMy8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgcHJvYmxlbSB3aXRoIEJBU0ktSUVORCBhcyBvYmplY3QgMCAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMyAtIDA2LzE2LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjaGFuZ2VkIHByb2dyZXNzaXZlLWRpc3BsYXkgcHJvY2Vzc2luZyAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4zIC0gMDYvMTcvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNoYW5nZWQgZGVsdGEtaW1hZ2UgcHJvY2Vzc2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjMgLSAwNi8yMC8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgc29tZSBtaW5vciBzdHVmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMyAtIDA2LzIxLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBzcGVlZC1tb2RpZmllciB0byB0aW1pbmcgcm91dGluZSAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4zIC0gMDYvMjIvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHN1cHBvcnQgZm9yIFBQTFQgY2h1bmsgcHJvY2Vzc2luZyAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjMgLSAwNi8yOS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gc3dhcHBlZCByZWZyZXNoIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjAgLSAwNi8zMC8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2hhbmdlZCByZWZyZXNoIHBhcmFtZXRlcnMgdG8gJ3gseSx3aWR0aCxoZWlnaHQnICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjEgLSAwNy8wNy8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gaW1wbGVtZW50ZWQgc3VwcG9ydCBmb3IgZnJlZXplL3Jlc2V0L3Jlc3VtZSAmIGdvX3h4eHggICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMSAtIDA3LzA4LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBzdXBwb3J0IGZvciBpbXByb3ZlZCB0aW1pbmcgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4xIC0gMDcvMTQvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNoYW5nZWQgRU9GIHByb2Nlc3NpbmcgYmVoYXZpb3IgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaXhlZCBURVJNIGRlbGF5IHByb2Nlc3NpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4xIC0gMDcvMTUvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIGZyZWV6ZSAmIHJlc2V0IHByb2Nlc3NpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjEgLSAwNy8xNi8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgc3RvcmFnZSBvZiBpbWFnZXMgZHVyaW5nIG1uZ19yZWFkKCkgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIHN1cHBvcnQgZm9yIG1uZ19kaXNwbGF5KCkgYWZ0ZXIgbW5nX3JlYWQoKSAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjEgLSAwNy8yNC8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgcmVhZGluZyBvZiBzdGlsbC1pbWFnZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjIgLSAwOC8wNS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2hhbmdlZCBmaWxlLXByZWZpeGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjMgLSAwOC8wNy8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gQjExMTMwMCAtIGZpeHVwIGZvciBpbXByb3ZlZCBwb3J0YWJpbGl0eSAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMyAtIDA4LzIxLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaXhlZCBURVJNIHByb2Nlc3NpbmcgZGVsYXkgb2YgMCBtc2VjcyAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4zIC0gMDgvMjYvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIE1BR04gY2h1bmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjMgLSAwOS8xMC8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgcHJvYmxlbSB3aXRoIG5vIHJlZnJlc2ggYWZ0ZXIgVEVSTSAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIERFRkkgYmVoYXZpb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjMgLSAwOS8xNi8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgdGltaW5nICYgcmVmcmVzaCBiZWhhdmlvciBmb3Igc2luZ2xlIFBORy9KTkcgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMyAtIDA5LzE5LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSByZWZpeGVkIHRpbWluZyAmIHJlZnJlc2ggYmVoYXZpb3IgZm9yIHNpbmdsZSBQTkcvSk5HICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4zIC0gMTAvMDIvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIHRpbWluZyBhZ2FpbiAodGhpcyBpcyBnZXR0aW5nIGJvcmluZy4uLikgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSByZWZpeGVkIHByb2JsZW0gd2l0aCBubyByZWZyZXNoIGFmdGVyIFRFUk0gICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4zIC0gMTAvMTYvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIEpEQUEgY2h1bmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjMgLSAxMC8xNy8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgc3VwcG9ydCBmb3IgYktHRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMyAtIDEwLzE4LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaXhlZCBkZWx0YS1wcm9jZXNzaW5nIGJlaGF2aW9yICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4zIC0gMTAvMTkvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHN0b3JhZ2UgZm9yIHBpeGVsLS9hbHBoYS1zYW1wbGVkZXB0aCBmb3IgZGVsdGEncyAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjMgLSAxMC8yNy8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgc2VwYXJhdGUgcmVhZCgpICYgZGlzcGxheSgpIHByb2Nlc3NpbmcgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjQgLSAxMC8zMS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgcG9zc2libGUgbG9vcCBpbiBkaXNwbGF5X3Jlc3VtZSgpIChUaGFua3MgVm92YSEpICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuNCAtIDExLzIwLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaXhlZCB1bndhbnRlZCByZXBldGl0aW9uIGluIG1uZ19yZWFkZGlzcGxheSgpICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS40IC0gMTEvMjQvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIG1vdmVkIHJlc3RvcmUgb2Ygb2JqZWN0IDAgdG8gbGlibW5nX2Rpc3BsYXkgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCByZXN0b3JlIG9mIG9iamVjdCAwIHRvIFRFUk0gcHJvY2Vzc2luZyAhISEgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgVEVSTSBkZWxheSBwcm9jZXNzaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIFRFUk0gZW5kIHByb2Nlc3NpbmcgKGNvdW50ID0gMCkgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjQgLSAxMi8xNi8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgbWl4dXAgb2YgZGF0YS0gJiBmdW5jdGlvbi1wb2ludGVycyAodGhhbmtzIERpbWl0cmkpKiAqLworLyogKiAgICAgICAgICAgICAwLjkuNCAtICAxLzE4LzIwMDEgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSByZW1vdmVkIHRlc3QgZmlsdGVyLW1ldGhvZHMgMSAmIDY1ICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gc2V0IGRlZmF1bHQgbGV2ZWwtc2V0IGZvciBmaWx0ZXJ0eXBlPTY0IHRvIGFsbCB6ZXJvZXMgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjUgLSAgMS8yMC8yMDAxIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgY29tcGlsZXItd2FybmluZ3MgTW96aWxsYSAodGhhbmtzIFRpbSkgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuNSAtICAxLzIzLzIwMDEgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaXhlZCB0aW1pbmctcHJvYmxlbSB3aXRoIHN3aXRjaGluZyBmcmFtaW5nX21vZGVzICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuMSAtIDAyLzA4LzIwMDEgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBNRU5EIHByb2Nlc3NpbmcgY2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC4xIC0gMDIvMTMvMjAwMSAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIGZpcnN0IEZSQU1fTU9ERT00IHRpbWluZyBwcm9ibGVtICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjEgLSAwNC8yMS8yMDAxIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgbWVtb3J5LWxlYWsgZm9yIEpOR3Mgd2l0aCBhbHBoYSAoVGhhbmtzIEdyZWdnISkgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIEJHUkE4IGNhbnZhcyB3aXRoIHByZW11bHRpcGxpZWQgYWxwaGEgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC4yIC0gMDYvMjUvMjAwMSAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIG1lbW9yeS1sZWFrIHdpdGggZGVsdGEtaW1hZ2VzIChUaGFua3MgTWljaGFlbCEpICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC41IC0gMDgvMTUvMjAwMiAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNvbXBsZXRlZCBQUk9NIHN1cHBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjb21wbGV0ZWQgZGVsdGEtaW1hZ2Ugc3VwcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC41IC0gMDgvMTkvMjAwMiAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIEI1OTcxMzQgLSBsaWJtbmcgcG9sbHV0ZXMgdGhlIGxpbmtlciBuYW1lc3BhY2UgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAwOS8xMy8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgcmVhZC93cml0ZSBvZiBNQUdOIGNodW5rICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDA5LzE1LzIwMDIgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaXhlZCBMT09QIGl0ZXJhdGlvbj0wIHNwZWNpYWwgY2FzZSAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC41IC0gMDkvMTkvMjAwMiAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIGNvbG9yLWNvcnJlY3Rpb24gZm9yIHJlc3RvcmUtYmFja2dyb3VuZCBoYW5kbGluZyAgICogKi8KKy8qICogICAgICAgICAgICAgLSBvcHRpbWl6ZWQgcmVzdG9yZS1iYWNrZ3JvdW5kIGZvciBiS0dEIGNhc2VzICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2xlYW5lZCB1cCBzb21lIG9sZCBzdHVmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDA5LzIwLzIwMDIgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaW5pc2hlZCBzdXBwb3J0IGZvciBCQUNLIGltYWdlICYgdGlsaW5nICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgc3VwcG9ydCBmb3IgUEFTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDA5LzIyLzIwMDIgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBiZ3J4OCBjYW52YXMgKGZpbGxlciBieXRlKSAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC41IC0gMTAvMDUvMjAwMiAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIGRyb3BwaW5nIG1peCBvZiBmcm96ZW4vdW5mcm96ZW4gb2JqZWN0cyAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAxMC8wNy8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgcHJvcG9zZWQgY2hhbmdlIGluIGhhbmRsaW5nIG9mIFRFUk0tICYgaWYtZGVsYXkgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGFub3RoZXIgZml4IGZvciBtaXNwbGFjZWQgVEVSTSBjaHVuayAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjb21wbGV0ZWQgc3VwcG9ydCBmb3IgY29uZGl0aW9uPTIgaW4gVEVSTSBjaHVuayAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC41IC0gMTAvMTgvMjAwMiAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIGNsaXBwaW5nLXByb2JsZW0gd2l0aCBCQUNLIHRpbGluZyAoVGhhbmtzIFNha3VyYSEpICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAxMC8yMC8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgcHJvY2Vzc2luZyBmb3IgbXVsdGlwbGUgb2JqZWN0cyBpbiBNQUdOICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIGRpc3BsYXkgb2YgdmlzaWJsZSB0YXJnZXQgb2YgUEFTVCBvcGVyYXRpb24gICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAxMC8zMC8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gbW9kaWZpZWQgVEVSTS9NRU5EIHByb2Nlc3NpbmcgZm9yIG1heCgxLCBURVJNX2RlbGF5LCAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgIGludGVyZnJhbWVfZGVsYXkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAxMS8wNC8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgbGF5ZXItICYgZnJhbWUtY291bnRpbmcgZHVyaW5nIHJlYWQoKSAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIGdvZnJhbWUvZ29sYXllci9nb3RpbWUgcHJvY2Vzc2luZyAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAwMS8xOS8yMDAzIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gQjY1NDYyNyAtIGZpeGVkIFNFR1Ygd2hlbiBubyBnZXR0aWNrY291bnQgY2FsbGJhY2sgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIEI2NjQzODMgLSBmaXhlZCB0eXBvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaW5hbGl6ZWQgY2hhbmdlcyBpbiBURVJNL2ZpbmFsX2RlbGF5IHRvIGVsZWN0ZWQgcHJvcG9zYWwqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNiAtIDA1LzExLzIwMDMgLSBHLiBKdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBjb25kaXRpb25hbHMgYXJvdW5kIGNhbnZhcyB1cGRhdGUgcm91dGluZXMgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC42IC0gMDUvMjUvMjAwMyAtIEcuUi1QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIE1OR19TS0lQQ0hVTktfY0hOSyBmb290cHJpbnQgb3B0aW1pemF0aW9ucyAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjYgLSAwNy8wNy8yMDAzIC0gRy5SLVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgY29uZGl0aW9uYWxzIGFyb3VuZCBzb21lIEpORy1zdXBwb3J0aW5nIGNvZGUgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGNvbmRpdGlvbmFscyBhcm91bmQgMTYtYml0IHN1cHBvcnRpbmcgY29kZSAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSByZXZlcnNlZCBzb21lIGxvb3BzIHRvIHVzZSBkZWNyZW1lbnRpbmcgY291bnRlciAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY29tYmluZWQgaW5pdCBmdW5jdGlvbnMgaW50byBvbmUgZnVuY3Rpb24gICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNiAtIDA3LzEwLzIwMDMgLSBHLlItUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSByZXBsYWNlZCBuZXN0ZWQgc3dpdGNoZXMgd2l0aCBzaW1wbGUgaW5pdCBzZXR1cCBmdW5jdGlvbiAqICovCisvKiAqICAgICAgICAgICAgIDEuMC42IC0gMDcvMjkvMjAwMyAtIEcuUi1QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGNvbmRpdGlvbmFscyBhcm91bmQgUEFTVCBjaHVuayBzdXBwb3J0ICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjYgLSAwOC8xNy8yMDAzIC0gRy5SLVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgY29uZGl0aW9uYWxzIGFyb3VuZCBub24tVkxDIGNodW5rIHN1cHBvcnQgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjcgLSAxMS8yNy8yMDAzIC0gUi5BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgQ0FOVkFTX1JHQjU2NSBhbmQgQ0FOVkFTX0JHUjU2NSAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNyAtIDEyLzA2LzIwMDMgLSBSLkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBDQU5WQVNfUkdCQTU2NSBhbmQgQ0FOVkFTX0JHUkE1NjUgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC43IC0gMDEvMjUvMjAwNCAtIEouUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHByZW11bHRpcGxpZWQgYWxwaGEgY2FudmFzJyBmb3IgUkdCQSwgQVJHQiwgQUJHUiAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC44IC0gMDMvMzEvMjAwNCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIHByb2JsZW0gd2l0aCBQQVNUIHVzYWdlIHdoZXJlIHNvdXJjZSA+IGRlc3QgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjggLSAwNS8wNC8yMDA0IC0gRy5SLVAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgbWlzcGxhY2VkIDE2LWJpdCBjb25kaXRpb25hbHMgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjkgLSAwOS8xOC8yMDA0IC0gRy5SLVAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gcmV2aXNlZCBzb21lIFNLSVBDSFVOSyBjb25kaXRpb25hbHMgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuOSAtIDEwLzEwLzIwMDQgLSBHLlItUC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBNTkdfTk9fMV8yXzRCSVRfU1VQUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC45IC0gMTAvMTQvMjAwNCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGJncjU2NV9hOCBjYW52YXMtc3R5bGUgKHRoYW5rcyB0byBKLiBFbHZhbmRlcikgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjkgLSAxMi8xMS8yMDA0IC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgY29uZGl0aW9uYWwgTU5HX09QVElNSVpFX0RJU1BMQVlDQUxMUyAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuOSAtIDEyLzIwLzIwMDQgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjbGVhbmVkIHVwIG1hY3JvLWludm9jYXRpb25zICh0aGFua3MgdG8gRC4gQWlybGllKSAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuMTAgLSAwNy8wNi8yMDA1IC0gRy5SLVAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBtb3JlIFNLSVBDSFVOSyBjb25kaXRpb25hbHMgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC4xMCAtIDEyLzI4LzIwMDUgLSBHLlItUC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIG1pc3NpbmcgU0tJUENIVU5LX01BR04gY29uZGl0aW9uYWwgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjEwIC0gMDMvMDcvMjAwNiAtICh0aGFua3MgdG8gVy4gTWFudGhleSkgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgQ0FOVkFTX1JHQjU1NSBhbmQgQ0FOVkFTX0JHUjU1NSAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuMTAgLSAwNC8wOC8yMDA3IC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaXhlZCBzZXZlcmFsIGNvbXBpbGVyIHdhcm5pbmdzICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC4xMCAtIDA0LzA4LzIwMDcgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHN1cHBvcnQgZm9yIG1QTkcgcHJvcG9zYWwgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjEwIC0gMDQvMTIvMjAwNyAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgc3VwcG9ydCBmb3IgQU5HIHByb3Bvc2FsICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpbmNsdWRlICJsaWJtbmcuaCIKKyNpbmNsdWRlICJsaWJtbmdfZGF0YS5oIgorI2luY2x1ZGUgImxpYm1uZ19lcnJvci5oIgorI2luY2x1ZGUgImxpYm1uZ190cmFjZS5oIgorI2lmZGVmIF9fQk9STEFORENfXworI3ByYWdtYSBoZHJzdG9wCisjZW5kaWYKKyNpbmNsdWRlICJsaWJtbmdfY2h1bmtzLmgiCisjaW5jbHVkZSAibGlibW5nX29iamVjdHMuaCIKKyNpbmNsdWRlICJsaWJtbmdfb2JqZWN0X3ByYy5oIgorI2luY2x1ZGUgImxpYm1uZ19tZW1vcnkuaCIKKyNpbmNsdWRlICJsaWJtbmdfemxpYi5oIgorI2luY2x1ZGUgImxpYm1uZ19qcGVnLmgiCisjaW5jbHVkZSAibGlibW5nX2Ntcy5oIgorI2luY2x1ZGUgImxpYm1uZ19waXhlbHMuaCIKKyNpbmNsdWRlICJsaWJtbmdfZGlzcGxheS5oIgorCisjaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pICYmIGRlZmluZWQoTU5HX1NUUklDVF9BTlNJKQorI3ByYWdtYSBvcHRpb24gLUEgICAgICAgICAgICAgICAgICAgICAgLyogZm9yY2UgQU5TSS1DICovCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19JTkNMVURFX0RJU1BMQVlfUFJPQ1MKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworTU5HX0xPQ0FMIG1uZ19yZXRjb2RlIHNldF9kZWxheSAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaUludGVydmFsKQoreworICBpZiAoIWlJbnRlcnZhbCkgICAgICAgICAgICAgICAgICAgICAgLyogYXQgbGVhc3QgMSBtc2VjIHBsZWFzZSEgKi8KKyAgICBpSW50ZXJ2YWwgPSAxOworCisgIGlmIChwRGF0YS0+YlJ1bm5pbmcpICAgICAgICAgICAgICAgICAvKiBvbmx5IHdoZW4gcmVhbGx5IGRpc3BsYXlpbmcgKi8KKyAgICBpZiAoIXBEYXRhLT5mU2V0dGltZXIgKChtbmdfaGFuZGxlKXBEYXRhLCBpSW50ZXJ2YWwpKQorICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0FQUFRJTUVSRVJST1IpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfRFlOQU1JQ01ORworICBpZiAoKCFwRGF0YS0+YkR5bmFtaWMpIHx8IChwRGF0YS0+YlJ1bm5pbmcpKQorI2Vsc2UKKyAgaWYgKHBEYXRhLT5iUnVubmluZykKKyNlbmRpZgorICAgIHBEYXRhLT5iVGltZXJzZXQgPSBNTkdfVFJVRTsgICAgICAgLyogYW5kIGluZGljYXRlIHNvICovCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitNTkdfTE9DQUwgbW5nX3VpbnQzMiBjYWxjdWxhdGVfZGVsYXkgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaURlbGF5KQoreworICBtbmdfdWludDMyIGlUaWNrcyAgID0gcERhdGEtPmlUaWNrczsKKyAgbW5nX3VpbnQzMiBpV2FpdGZvciA9IDE7ICAgICAgICAgICAgIC8qIGRlZmF1bHQgbm9uLU1ORyBkZWxheSAqLworCisgIGlmICghaVRpY2tzKSAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aWNrX2NvdW50IG5vdCBzcGVjaWZpZWQgPyAqLworICAgIGlmIChwRGF0YS0+ZUltYWdldHlwZSA9PSBtbmdfaXRfbW5nKQorICAgICAgaVRpY2tzID0gMTAwMDsKKworICBpZiAoaVRpY2tzKQorICB7CisgICAgc3dpdGNoIChwRGF0YS0+aVNwZWVkKSAgICAgICAgICAgICAvKiBob25vciBzcGVlZCBtb2RpZmllciAqLworICAgIHsKKyAgICAgIGNhc2UgbW5nX3N0X2Zhc3QgOgorICAgICAgICB7CisgICAgICAgICAgaVdhaXRmb3IgPSAobW5nX3VpbnQzMikoKCA1MDAgKiBpRGVsYXkpIC8gaVRpY2tzKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgY2FzZSBtbmdfc3Rfc2xvdyA6CisgICAgICAgIHsKKyAgICAgICAgICBpV2FpdGZvciA9IChtbmdfdWludDMyKSgoMzAwMCAqIGlEZWxheSkgLyBpVGlja3MpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBjYXNlIG1uZ19zdF9zbG93ZXN0IDoKKyAgICAgICAgeworICAgICAgICAgIGlXYWl0Zm9yID0gKG1uZ191aW50MzIpKCg4MDAwICogaURlbGF5KSAvIGlUaWNrcyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGRlZmF1bHQgOgorICAgICAgICB7CisgICAgICAgICAgaVdhaXRmb3IgPSAobW5nX3VpbnQzMikoKDEwMDAgKiBpRGVsYXkpIC8gaVRpY2tzKTsKKyAgICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBpV2FpdGZvcjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIFByb2dyZXNzaXZlIGRpc3BsYXkgcmVmcmVzaCAtIGRvZXMgdGhlIGNhbGwgdG8gdGhlIHJlZnJlc2ggY2FsbGJhY2sgICAgKiAqLworLyogKiBhbmQgc2V0cyB0aGUgdGltZXIgdG8gYWxsb3cgdGhlIGFwcCB0byBwZXJmb3JtIHRoZSBhY3R1YWwgcmVmcmVzaCB0byAgICogKi8KKy8qICogdGhlIHNjcmVlbiAoZWcuIHByb2Nlc3MgaXRzIG1haW4gbWVzc2FnZS1sb29wKSAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX2Rpc3BsYXlfcHJvZ3Jlc3NpdmVfcmVmcmVzaCAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaUludGVydmFsKQoreworICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGV0IHRoZSBhcHAgcmVmcmVzaCBmaXJzdCA/ICovCisgICAgaWYgKChwRGF0YS0+YlJ1bm5pbmcpICYmICghcERhdGEtPmJTa2lwcGluZykgJiYKKyAgICAgICAgKHBEYXRhLT5pVXBkYXRldG9wIDwgcERhdGEtPmlVcGRhdGVib3R0b20pICYmIChwRGF0YS0+aVVwZGF0ZWxlZnQgPCBwRGF0YS0+aVVwZGF0ZXJpZ2h0KSkKKyAgICB7CisgICAgICBpZiAoIXBEYXRhLT5mUmVmcmVzaCAoKChtbmdfaGFuZGxlKXBEYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aVVwZGF0ZWxlZnQsIHBEYXRhLT5pVXBkYXRldG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pVXBkYXRlcmlnaHQgIC0gcERhdGEtPmlVcGRhdGVsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pVXBkYXRlYm90dG9tIC0gcERhdGEtPmlVcGRhdGV0b3ApKQorICAgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfQVBQTUlTQ0VSUk9SKTsKKworICAgICAgcERhdGEtPmlVcGRhdGVsZWZ0ICAgPSAwOyAgICAgICAgLyogcmVzZXQgdXBkYXRlLXJlZ2lvbiAqLworICAgICAgcERhdGEtPmlVcGRhdGVyaWdodCAgPSAwOworICAgICAgcERhdGEtPmlVcGRhdGV0b3AgICAgPSAwOworICAgICAgcERhdGEtPmlVcGRhdGVib3R0b20gPSAwOyAgICAgICAgLyogcmVzZXQgcmVmcmVzaG5lZWRlZCBpbmRpY2F0b3IgKi8KKyAgICAgIHBEYXRhLT5iTmVlZHJlZnJlc2ggID0gTU5HX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW50ZXJ2YWwgcmVxdWVzdGVkID8gKi8KKyAgICAgIGlmICgoIXBEYXRhLT5iRnJlZXppbmcpICYmIChpSW50ZXJ2YWwpKQorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2V0dXAgdGhlIHRpbWVyICovCisgICAgICAgIG1uZ19yZXRjb2RlIGlSZXRjb2RlID0gc2V0X2RlbGF5IChwRGF0YSwgaUludGVydmFsKTsKKworICAgICAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogR2VuZXJpYyBkaXNwbGF5IHJvdXRpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworTU5HX0xPQ0FMIG1uZ19yZXRjb2RlIGludGVyZnJhbWVfZGVsYXkgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX3VpbnQzMiAgaVdhaXRmb3IgPSAwOworICBtbmdfdWludDMyICBpSW50ZXJ2YWw7CisgIG1uZ191aW50MzIgIGlSdW5pbnRlcnZhbDsKKyAgbW5nX3JldGNvZGUgaVJldGNvZGU7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSU5URVJGUkFNRV9ERUxBWSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHsKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19GUkFNCisgICAgaWYgKHBEYXRhLT5pRnJhbWVkZWxheSA+IDApICAgICAgICAvKiByZWFsIGRlbGF5ID8gKi8KKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxldCB0aGUgYXBwIHJlZnJlc2ggZmlyc3QgPyAqLworICAgICAgaWYgKChwRGF0YS0+YlJ1bm5pbmcpICYmICghcERhdGEtPmJTa2lwcGluZykgJiYKKyAgICAgICAgICAocERhdGEtPmlVcGRhdGV0b3AgPCBwRGF0YS0+aVVwZGF0ZWJvdHRvbSkgJiYgKHBEYXRhLT5pVXBkYXRlbGVmdCA8IHBEYXRhLT5pVXBkYXRlcmlnaHQpKQorICAgICAgICBpZiAoIXBEYXRhLT5mUmVmcmVzaCAoKChtbmdfaGFuZGxlKXBEYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pVXBkYXRlbGVmdCwgIHBEYXRhLT5pVXBkYXRldG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlVcGRhdGVyaWdodCAtIHBEYXRhLT5pVXBkYXRlbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pVXBkYXRlYm90dG9tIC0gcERhdGEtPmlVcGRhdGV0b3ApKQorICAgICAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19BUFBNSVNDRVJST1IpOworCisgICAgICBwRGF0YS0+aVVwZGF0ZWxlZnQgICA9IDA7ICAgICAgICAvKiByZXNldCB1cGRhdGUtcmVnaW9uICovCisgICAgICBwRGF0YS0+aVVwZGF0ZXJpZ2h0ICA9IDA7CisgICAgICBwRGF0YS0+aVVwZGF0ZXRvcCAgICA9IDA7CisgICAgICBwRGF0YS0+aVVwZGF0ZWJvdHRvbSA9IDA7ICAgICAgICAvKiByZXNldCByZWZyZXNobmVlZGVkIGluZGljYXRvciAqLworICAgICAgcERhdGEtPmJOZWVkcmVmcmVzaCAgPSBNTkdfRkFMU0U7CisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19URVJNCisgICAgICBpZiAocERhdGEtPmJPbmx5Zmlyc3RmcmFtZSkgICAgICAvKiBvbmx5IHByb2Nlc3NpbmcgZmlyc3QgZnJhbWUgYWZ0ZXIgVEVSTSA/ICovCisgICAgICB7CisgICAgICAgIHBEYXRhLT5pRnJhbWVzYWZ0ZXJURVJNKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkaWQgd2UgZG8gYSBmcmFtZSB5ZXQgPyAqLworICAgICAgICBpZiAocERhdGEtPmlGcmFtZXNhZnRlclRFUk0gPiAxKQorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlbiB0aGF0J3MgaXQ7IGp1c3Qgc3RvcCByaWdodCBoZXJlICEgKi8KKyAgICAgICAgICBwRGF0YS0+cEN1cnJhbmlvYmogPSBNTkdfTlVMTDsKKyAgICAgICAgICBwRGF0YS0+YlJ1bm5pbmcgICAgPSBNTkdfRkFMU0U7CisKKyAgICAgICAgICByZXR1cm4gTU5HX05PRVJST1I7CisgICAgICAgIH0KKyAgICAgIH0KKyNlbmRpZgorCisgICAgICBpZiAocERhdGEtPmZHZXR0aWNrY291bnQpCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgY3VycmVudCB0aWNrY291bnQgKi8KKyAgICAgICAgcERhdGEtPmlSdW50aW1lID0gcERhdGEtPmZHZXR0aWNrY291bnQgKChtbmdfaGFuZGxlKXBEYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNhbGN1bGF0ZSBpbnRlcnZhbCBzaW5jZSBsYXN0IHN5bmMtcG9pbnQgKi8KKyAgICAgICAgaWYgKHBEYXRhLT5pUnVudGltZSA8IHBEYXRhLT5pU3luY3RpbWUpCisgICAgICAgICAgaVJ1bmludGVydmFsICAgID0gcERhdGEtPmlSdW50aW1lICsgfnBEYXRhLT5pU3luY3RpbWUgKyAxOworICAgICAgICBlbHNlCisgICAgICAgICAgaVJ1bmludGVydmFsICAgID0gcERhdGEtPmlSdW50aW1lIC0gcERhdGEtPmlTeW5jdGltZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNhbGN1bGF0ZSBhY3R1YWwgcnVuLXRpbWUgKi8KKyAgICAgICAgaWYgKHBEYXRhLT5pUnVudGltZSA8IHBEYXRhLT5pU3RhcnR0aW1lKQorICAgICAgICAgIHBEYXRhLT5pUnVudGltZSA9IHBEYXRhLT5pUnVudGltZSArIH5wRGF0YS0+aVN0YXJ0dGltZSArIDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwRGF0YS0+aVJ1bnRpbWUgPSBwRGF0YS0+aVJ1bnRpbWUgLSBwRGF0YS0+aVN0YXJ0dGltZTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgaVJ1bmludGVydmFsID0gMDsKKyAgICAgIH0KKworICAgICAgaVdhaXRmb3IgPSBjYWxjdWxhdGVfZGVsYXkgKHBEYXRhLCBwRGF0YS0+aUZyYW1lZGVsYXkpOworCisgICAgICBpZiAoaVdhaXRmb3IgPiBpUnVuaW50ZXJ2YWwpICAgICAvKiBkZWxheSBuZWNlc3NhcnkgPyAqLworICAgICAgICBpSW50ZXJ2YWwgPSBpV2FpdGZvciAtIGlSdW5pbnRlcnZhbDsKKyAgICAgIGVsc2UKKyAgICAgICAgaUludGVydmFsID0gMTsgICAgICAgICAgICAgICAgIC8qIGZvcmNlIGFwcCB0byBwcm9jZXNzIG1lc3NhZ2Vsb29wICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXQgdGhlIHRpbWVyID8gKi8KKyAgICAgIGlmICgoKHBEYXRhLT5iUnVubmluZykgfHwgKHBEYXRhLT5iU2VhcmNoaW5nKSB8fCAocERhdGEtPmJSZWFkaW5nKSkgJiYKKyAgICAgICAgICAoIXBEYXRhLT5iU2tpcHBpbmcpKQorICAgICAgeworICAgICAgICBpUmV0Y29kZSA9IHNldF9kZWxheSAocERhdGEsIGlJbnRlcnZhbCk7CisKKyAgICAgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICAgICAgcmV0dXJuIGlSZXRjb2RlOworICAgICAgfQorICAgIH0KKworICAgIGlmICghcERhdGEtPmJTa2lwcGluZykgICAgICAgICAgICAgLyogaW5jcmVhc2UgZnJhbWV0aW1lIGluIGFkdmFuY2UgKi8KKyAgICAgIHBEYXRhLT5pRnJhbWV0aW1lID0gcERhdGEtPmlGcmFtZXRpbWUgKyBpV2FpdGZvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNldHVwIGZvciBuZXh0IGRlbGF5ICovCisgICAgcERhdGEtPmlGcmFtZWRlbGF5ID0gcERhdGEtPmlOZXh0ZGVsYXk7CisjZW5kaWYKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOVEVSRlJBTUVfREVMQVksIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitNTkdfTE9DQUwgdm9pZCBzZXRfZGlzcGxheV9yb3V0aW5lIChtbmdfZGF0YXAgcERhdGEpCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFjdGl2ZWx5IHJ1bm5pbmcgPyAqLworICBpZiAoKChwRGF0YS0+YlJ1bm5pbmcpIHx8IChwRGF0YS0+YlNlYXJjaGluZykpICYmICghcERhdGEtPmJTa2lwcGluZykpCisgIHsKKyAgICBzd2l0Y2ggKHBEYXRhLT5pQ2FudmFzc3R5bGUpICAgICAgICAgLyogZGV0ZXJtaW5lIGRpc3BsYXkgcm91dGluZSAqLworICAgIHsKKyNpZm5kZWYgTU5HX1NLSVBDQU5WQVNfUkdCOAorICAgICAgY2FzZSBNTkdfQ0FOVkFTX1JHQjggICAgOiB7IHBEYXRhLT5mRGlzcGxheXJvdyA9IChtbmdfZnB0ciltbmdfZGlzcGxheV9yZ2I4OyAgICAgYnJlYWs7IH0KKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENBTlZBU19SR0JBOAorICAgICAgY2FzZSBNTkdfQ0FOVkFTX1JHQkE4ICAgOiB7IHBEYXRhLT5mRGlzcGxheXJvdyA9IChtbmdfZnB0ciltbmdfZGlzcGxheV9yZ2JhODsgICAgYnJlYWs7IH0KKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENBTlZBU19SR0JBOF9QTQorICAgICAgY2FzZSBNTkdfQ0FOVkFTX1JHQkE4X1BNOiB7IHBEYXRhLT5mRGlzcGxheXJvdyA9IChtbmdfZnB0ciltbmdfZGlzcGxheV9yZ2JhOF9wbTsgYnJlYWs7IH0KKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENBTlZBU19BUkdCOAorICAgICAgY2FzZSBNTkdfQ0FOVkFTX0FSR0I4ICAgOiB7IHBEYXRhLT5mRGlzcGxheXJvdyA9IChtbmdfZnB0ciltbmdfZGlzcGxheV9hcmdiODsgICAgYnJlYWs7IH0KKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENBTlZBU19BUkdCOF9QTQorICAgICAgY2FzZSBNTkdfQ0FOVkFTX0FSR0I4X1BNOiB7IHBEYXRhLT5mRGlzcGxheXJvdyA9IChtbmdfZnB0ciltbmdfZGlzcGxheV9hcmdiOF9wbTsgYnJlYWs7IH0KKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENBTlZBU19SR0I4X0E4CisgICAgICBjYXNlIE1OR19DQU5WQVNfUkdCOF9BOCA6IHsgcERhdGEtPmZEaXNwbGF5cm93ID0gKG1uZ19mcHRyKW1uZ19kaXNwbGF5X3JnYjhfYTg7ICBicmVhazsgfQorI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0FOVkFTX0JHUjgKKyAgICAgIGNhc2UgTU5HX0NBTlZBU19CR1I4ICAgIDogeyBwRGF0YS0+ZkRpc3BsYXlyb3cgPSAobW5nX2ZwdHIpbW5nX2Rpc3BsYXlfYmdyODsgICAgIGJyZWFrOyB9CisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDQU5WQVNfQkdSWDgKKyAgICAgIGNhc2UgTU5HX0NBTlZBU19CR1JYOCAgIDogeyBwRGF0YS0+ZkRpc3BsYXlyb3cgPSAobW5nX2ZwdHIpbW5nX2Rpc3BsYXlfYmdyeDg7ICAgIGJyZWFrOyB9CisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDQU5WQVNfQkdSQTgKKyAgICAgIGNhc2UgTU5HX0NBTlZBU19CR1JBOCAgIDogeyBwRGF0YS0+ZkRpc3BsYXlyb3cgPSAobW5nX2ZwdHIpbW5nX2Rpc3BsYXlfYmdyYTg7ICAgIGJyZWFrOyB9CisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDQU5WQVNfQkdSQThfUE0KKyAgICAgIGNhc2UgTU5HX0NBTlZBU19CR1JBOF9QTTogeyBwRGF0YS0+ZkRpc3BsYXlyb3cgPSAobW5nX2ZwdHIpbW5nX2Rpc3BsYXlfYmdyYThfcG07IGJyZWFrOyB9CisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDQU5WQVNfQUJHUjgKKyAgICAgIGNhc2UgTU5HX0NBTlZBU19BQkdSOCAgIDogeyBwRGF0YS0+ZkRpc3BsYXlyb3cgPSAobW5nX2ZwdHIpbW5nX2Rpc3BsYXlfYWJncjg7ICAgIGJyZWFrOyB9CisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDQU5WQVNfQUJHUjhfUE0KKyAgICAgIGNhc2UgTU5HX0NBTlZBU19BQkdSOF9QTTogeyBwRGF0YS0+ZkRpc3BsYXlyb3cgPSAobW5nX2ZwdHIpbW5nX2Rpc3BsYXlfYWJncjhfcG07IGJyZWFrOyB9CisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDQU5WQVNfUkdCNTY1CisgICAgICBjYXNlIE1OR19DQU5WQVNfUkdCNTY1ICA6IHsgcERhdGEtPmZEaXNwbGF5cm93ID0gKG1uZ19mcHRyKW1uZ19kaXNwbGF5X3JnYjU2NTsgICBicmVhazsgfQorI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0FOVkFTX1JHQkE1NjUKKyAgICAgIGNhc2UgTU5HX0NBTlZBU19SR0JBNTY1IDogeyBwRGF0YS0+ZkRpc3BsYXlyb3cgPSAobW5nX2ZwdHIpbW5nX2Rpc3BsYXlfcmdiYTU2NTsgIGJyZWFrOyB9CisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDQU5WQVNfQkdSNTY1CisgICAgICBjYXNlIE1OR19DQU5WQVNfQkdSNTY1ICA6IHsgcERhdGEtPmZEaXNwbGF5cm93ID0gKG1uZ19mcHRyKW1uZ19kaXNwbGF5X2JncjU2NTsgICBicmVhazsgfQorI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0FOVkFTX0JHUkE1NjUKKyAgICAgIGNhc2UgTU5HX0NBTlZBU19CR1JBNTY1IDogeyBwRGF0YS0+ZkRpc3BsYXlyb3cgPSAobW5nX2ZwdHIpbW5nX2Rpc3BsYXlfYmdyYTU2NTsgIGJyZWFrOyB9CisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDQU5WQVNfQkdSNTY1X0E4CisgICAgICBjYXNlIE1OR19DQU5WQVNfQkdSNTY1X0E4IDogeyBwRGF0YS0+ZkRpc3BsYXlyb3cgPSAobW5nX2ZwdHIpbW5nX2Rpc3BsYXlfYmdyNTY1X2E4OyAgYnJlYWs7IH0KKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENBTlZBU19SR0I1NTUKKyAgICAgIGNhc2UgTU5HX0NBTlZBU19SR0I1NTUgIDogeyBwRGF0YS0+ZkRpc3BsYXlyb3cgPSAobW5nX2ZwdHIpbW5nX2Rpc3BsYXlfcmdiNTU1OyAgYnJlYWs7IH0KKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENBTlZBU19CR1I1NTUKKyAgICAgIGNhc2UgTU5HX0NBTlZBU19CR1I1NTUgIDogeyBwRGF0YS0+ZkRpc3BsYXlyb3cgPSAobW5nX2ZwdHIpbW5nX2Rpc3BsYXlfYmdyNTU1OyAgYnJlYWs7IH0KKyNlbmRpZgorCisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisvKiAgICAgIGNhc2UgTU5HX0NBTlZBU19SR0IxNiAgIDogeyBwRGF0YS0+ZkRpc3BsYXlyb3cgPSAobW5nX2ZwdHIpbW5nX2Rpc3BsYXlfcmdiMTY7ICAgIGJyZWFrOyB9ICovCisvKiAgICAgIGNhc2UgTU5HX0NBTlZBU19SR0JBMTYgIDogeyBwRGF0YS0+ZkRpc3BsYXlyb3cgPSAobW5nX2ZwdHIpbW5nX2Rpc3BsYXlfcmdiYTE2OyAgIGJyZWFrOyB9ICovCisvKiAgICAgIGNhc2UgTU5HX0NBTlZBU19BUkdCMTYgIDogeyBwRGF0YS0+ZkRpc3BsYXlyb3cgPSAobW5nX2ZwdHIpbW5nX2Rpc3BsYXlfYXJnYjE2OyAgIGJyZWFrOyB9ICovCisvKiAgICAgIGNhc2UgTU5HX0NBTlZBU19CR1IxNiAgIDogeyBwRGF0YS0+ZkRpc3BsYXlyb3cgPSAobW5nX2ZwdHIpbW5nX2Rpc3BsYXlfYmdyMTY7ICAgIGJyZWFrOyB9ICovCisvKiAgICAgIGNhc2UgTU5HX0NBTlZBU19CR1JBMTYgIDogeyBwRGF0YS0+ZkRpc3BsYXlyb3cgPSAobW5nX2ZwdHIpbW5nX2Rpc3BsYXlfYmdyYTE2OyAgIGJyZWFrOyB9ICovCisvKiAgICAgIGNhc2UgTU5HX0NBTlZBU19BQkdSMTYgIDogeyBwRGF0YS0+ZkRpc3BsYXlyb3cgPSAobW5nX2ZwdHIpbW5nX2Rpc3BsYXlfYWJncjE2OyAgIGJyZWFrOyB9ICovCisjZW5kaWYKKy8qICAgICAgY2FzZSBNTkdfQ0FOVkFTX0lOREVYOCAgOiB7IHBEYXRhLT5mRGlzcGxheXJvdyA9IChtbmdfZnB0ciltbmdfZGlzcGxheV9pbmRleDg7ICAgYnJlYWs7IH0gKi8KKy8qICAgICAgY2FzZSBNTkdfQ0FOVkFTX0lOREVYQTggOiB7IHBEYXRhLT5mRGlzcGxheXJvdyA9IChtbmdfZnB0ciltbmdfZGlzcGxheV9pbmRleGE4OyAgYnJlYWs7IH0gKi8KKy8qICAgICAgY2FzZSBNTkdfQ0FOVkFTX0FJTkRFWDggOiB7IHBEYXRhLT5mRGlzcGxheXJvdyA9IChtbmdfZnB0ciltbmdfZGlzcGxheV9haW5kZXg4OyAgYnJlYWs7IH0gKi8KKy8qICAgICAgY2FzZSBNTkdfQ0FOVkFTX0dSQVk4ICAgOiB7IHBEYXRhLT5mRGlzcGxheXJvdyA9IChtbmdfZnB0ciltbmdfZGlzcGxheV9ncmF5ODsgICAgYnJlYWs7IH0gKi8KKy8qICAgICAgY2FzZSBNTkdfQ0FOVkFTX0FHUkFZOCAgOiB7IHBEYXRhLT5mRGlzcGxheXJvdyA9IChtbmdfZnB0ciltbmdfZGlzcGxheV9hZ3JheTg7ICAgYnJlYWs7IH0gKi8KKy8qICAgICAgY2FzZSBNTkdfQ0FOVkFTX0dSQVlBOCAgOiB7IHBEYXRhLT5mRGlzcGxheXJvdyA9IChtbmdfZnB0ciltbmdfZGlzcGxheV9ncmF5YTg7ICAgYnJlYWs7IH0gKi8KKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKy8qICAgICAgY2FzZSBNTkdfQ0FOVkFTX0dSQVkxNiAgOiB7IHBEYXRhLT5mRGlzcGxheXJvdyA9IChtbmdfZnB0ciltbmdfZGlzcGxheV9ncmF5MTY7ICAgYnJlYWs7IH0gKi8KKy8qICAgICAgY2FzZSBNTkdfQ0FOVkFTX0dSQVlBMTYgOiB7IHBEYXRhLT5mRGlzcGxheXJvdyA9IChtbmdfZnB0ciltbmdfZGlzcGxheV9ncmF5YTE2OyAgYnJlYWs7IH0gKi8KKy8qICAgICAgY2FzZSBNTkdfQ0FOVkFTX0FHUkFZMTYgOiB7IHBEYXRhLT5mRGlzcGxheXJvdyA9IChtbmdfZnB0ciltbmdfZGlzcGxheV9hZ3JheTE2OyAgYnJlYWs7IH0gKi8KKyNlbmRpZgorLyogICAgICBjYXNlIE1OR19DQU5WQVNfRFgxNSAgICA6IHsgcERhdGEtPmZEaXNwbGF5cm93ID0gKG1uZ19mcHRyKW1uZ19kaXNwbGF5X2R4MTU7ICAgICBicmVhazsgfSAqLworLyogICAgICBjYXNlIE1OR19DQU5WQVNfRFgxNiAgICA6IHsgcERhdGEtPmZEaXNwbGF5cm93ID0gKG1uZ19mcHRyKW1uZ19kaXNwbGF5X2R4MTY7ICAgICBicmVhazsgfSAqLworICAgIH0KKyAgfQorCisgIHJldHVybjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworTU5HX0xPQ0FMIG1uZ19yZXRjb2RlIGxvYWRfYmtnZGxheWVyIChtbmdfZGF0YXAgcERhdGEpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0xPQURfQktHRExBWUVSLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhY3RpdmVseSBydW5uaW5nID8gKi8KKyAgaWYgKCgocERhdGEtPmJSdW5uaW5nKSB8fCAocERhdGEtPmJTZWFyY2hpbmcpKSAmJiAoIXBEYXRhLT5iU2tpcHBpbmcpKQorICB7CisgICAgbW5nX2ludDMyICAgaVk7CisgICAgbW5nX3JldGNvZGUgaVJldGNvZGU7CisgICAgbW5nX2Jvb2wgICAgYkNvbG9yY29yciAgID0gTU5HX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2F2ZSB2YWx1ZXMgKi8KKyAgICBtbmdfaW50MzIgICBpRGVzdGwgICAgICAgPSBwRGF0YS0+aURlc3RsOworICAgIG1uZ19pbnQzMiAgIGlEZXN0ciAgICAgICA9IHBEYXRhLT5pRGVzdHI7CisgICAgbW5nX2ludDMyICAgaURlc3R0ICAgICAgID0gcERhdGEtPmlEZXN0dDsKKyAgICBtbmdfaW50MzIgICBpRGVzdGIgICAgICAgPSBwRGF0YS0+aURlc3RiOworICAgIG1uZ19pbnQzMiAgIGlTb3VyY2VsICAgICA9IHBEYXRhLT5pU291cmNlbDsKKyAgICBtbmdfaW50MzIgICBpU291cmNlciAgICAgPSBwRGF0YS0+aVNvdXJjZXI7CisgICAgbW5nX2ludDMyICAgaVNvdXJjZXQgICAgID0gcERhdGEtPmlTb3VyY2V0OworICAgIG1uZ19pbnQzMiAgIGlTb3VyY2ViICAgICA9IHBEYXRhLT5pU291cmNlYjsKKyAgICBtbmdfaW50OCAgICBpUGFzcyAgICAgICAgPSBwRGF0YS0+aVBhc3M7CisgICAgbW5nX2ludDMyICAgaVJvdyAgICAgICAgID0gcERhdGEtPmlSb3c7CisgICAgbW5nX2ludDMyICAgaVJvd2luYyAgICAgID0gcERhdGEtPmlSb3dpbmM7CisgICAgbW5nX2ludDMyICAgaUNvbCAgICAgICAgID0gcERhdGEtPmlDb2w7CisgICAgbW5nX2ludDMyICAgaUNvbGluYyAgICAgID0gcERhdGEtPmlDb2xpbmM7CisgICAgbW5nX2ludDMyICAgaVJvd3NhbXBsZXMgID0gcERhdGEtPmlSb3dzYW1wbGVzOworICAgIG1uZ19pbnQzMiAgIGlSb3dzaXplICAgICA9IHBEYXRhLT5pUm93c2l6ZTsKKyAgICBtbmdfdWludDhwICBwUHJldnJvdyAgICAgPSBwRGF0YS0+cFByZXZyb3c7CisgICAgbW5nX3VpbnQ4cCAgcFJHQkFyb3cgICAgID0gcERhdGEtPnBSR0JBcm93OworICAgIG1uZ19ib29sICAgIGJJc1JHQkExNiAgICA9IHBEYXRhLT5iSXNSR0JBMTY7CisgICAgbW5nX2Jvb2wgICAgYklzT3BhcXVlICAgID0gcERhdGEtPmJJc09wYXF1ZTsKKyAgICBtbmdfZnB0ciAgICBmQ29ycmVjdHJvdyAgPSBwRGF0YS0+ZkNvcnJlY3Ryb3c7CisgICAgbW5nX2ZwdHIgICAgZkRpc3BsYXlyb3cgID0gcERhdGEtPmZEaXNwbGF5cm93OworICAgIG1uZ19mcHRyICAgIGZSZXRyaWV2ZXJvdyA9IHBEYXRhLT5mUmV0cmlldmVyb3c7CisgICAgbW5nX29iamVjdHAgcEN1cnJlbnRvYmogID0gcERhdGEtPnBDdXJyZW50b2JqOworICAgIG1uZ19vYmplY3RwIHBSZXRyaWV2ZW9iaiA9IHBEYXRhLT5wUmV0cmlldmVvYmo7CisKKyAgICBwRGF0YS0+aURlc3RsICAgPSAwOyAgICAgICAgICAgICAgIC8qIGRldGVybWluZSBjbGlwcGluZyByZWdpb24gKi8KKyAgICBwRGF0YS0+aURlc3R0ICAgPSAwOworICAgIHBEYXRhLT5pRGVzdHIgICA9IHBEYXRhLT5pV2lkdGg7CisgICAgcERhdGEtPmlEZXN0YiAgID0gcERhdGEtPmlIZWlnaHQ7CisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19GUkFNCisgICAgaWYgKHBEYXRhLT5iRnJhbWVjbGlwcGluZykgICAgICAgICAvKiBmcmFtZSBjbGlwcGluZyBzcGVjaWZpZWQgPyAqLworICAgIHsKKyAgICAgIHBEYXRhLT5pRGVzdGwgPSBNQVhfQ09PUkQgKHBEYXRhLT5pRGVzdGwsICBwRGF0YS0+aUZyYW1lY2xpcGwpOworICAgICAgcERhdGEtPmlEZXN0dCA9IE1BWF9DT09SRCAocERhdGEtPmlEZXN0dCwgIHBEYXRhLT5pRnJhbWVjbGlwdCk7CisgICAgICBwRGF0YS0+aURlc3RyID0gTUlOX0NPT1JEIChwRGF0YS0+aURlc3RyLCAgcERhdGEtPmlGcmFtZWNsaXByKTsKKyAgICAgIHBEYXRhLT5pRGVzdGIgPSBNSU5fQ09PUkQgKHBEYXRhLT5pRGVzdGIsICBwRGF0YS0+aUZyYW1lY2xpcGIpOworICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW55dGhpbmcgdG8gY2xlYXIgPyAqLworICAgIGlmICgocERhdGEtPmlEZXN0ciA+PSBwRGF0YS0+aURlc3RsKSAmJiAocERhdGEtPmlEZXN0YiA+PSBwRGF0YS0+aURlc3R0KSkKKyAgICB7CisgICAgICBwRGF0YS0+aVBhc3MgICAgICAgPSAtMTsgICAgICAgICAvKiB0aGVzZSBhcmUgdGhlIG9iamVjdCdzIGRpbWVuc2lvbnMgbm93ICovCisgICAgICBwRGF0YS0+aVJvdyAgICAgICAgPSAwOworICAgICAgcERhdGEtPmlSb3dpbmMgICAgID0gMTsKKyAgICAgIHBEYXRhLT5pQ29sICAgICAgICA9IDA7CisgICAgICBwRGF0YS0+aUNvbGluYyAgICAgPSAxOworICAgICAgcERhdGEtPmlSb3dzYW1wbGVzID0gcERhdGEtPmlXaWR0aDsKKyAgICAgIHBEYXRhLT5pUm93c2l6ZSAgICA9IHBEYXRhLT5pUm93c2FtcGxlcyA8PCAyOworICAgICAgcERhdGEtPmJJc1JHQkExNiAgID0gTU5HX0ZBTFNFOyAgLyogbGV0J3Mga2VlcCBpdCBzaW1wbGUgISAqLworICAgICAgcERhdGEtPmJJc09wYXF1ZSAgID0gTU5HX1RSVUU7CisKKyAgICAgIHBEYXRhLT5pU291cmNlbCAgICA9IDA7ICAgICAgICAgIC8qIHNvdXJjZSByZWxhdGl2ZSB0byBkZXN0aW5hdGlvbiAqLworICAgICAgcERhdGEtPmlTb3VyY2VyICAgID0gcERhdGEtPmlEZXN0ciAtIHBEYXRhLT5pRGVzdGw7CisgICAgICBwRGF0YS0+aVNvdXJjZXQgICAgPSAwOworICAgICAgcERhdGEtPmlTb3VyY2ViICAgID0gcERhdGEtPmlEZXN0YiAtIHBEYXRhLT5pRGVzdHQ7CisKKyAgICAgIHNldF9kaXNwbGF5X3JvdXRpbmUgKHBEYXRhKTsgICAgIC8qIGRldGVybWluZSBkaXNwbGF5IHJvdXRpbmUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZmF1bHQgcmVzdG9yZSB1c2luZyBwcmVzZXQgQkcgY29sb3IgKi8KKyAgICAgIHBEYXRhLT5mUmVzdGJrZ2Ryb3cgPSAobW5nX2ZwdHIpbW5nX3Jlc3RvcmVfYmtnZF9iZ2NvbG9yOworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfYktHRAorICAgICAgaWYgKCgocERhdGEtPmVJbWFnZXR5cGUgPT0gbW5nX2l0X3BuZykgfHwgKHBEYXRhLT5lSW1hZ2V0eXBlID09IG1uZ19pdF9qbmcpKSAmJgorICAgICAgICAgIChwRGF0YS0+YlVzZUJLR0QpKQorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJlZmVyIGJLR0QgaW4gUE5HL0pORyAqLworICAgICAgICBpZiAoIXBEYXRhLT5wQ3VycmVudG9iaikKKyAgICAgICAgICBwRGF0YS0+cEN1cnJlbnRvYmogPSBwRGF0YS0+cE9ianplcm87CisKKyAgICAgICAgaWYgKCgobW5nX2ltYWdlcClwRGF0YS0+cEN1cnJlbnRvYmopLT5wSW1nYnVmLT5iSGFzQktHRCkKKyAgICAgICAgeworICAgICAgICAgIHBEYXRhLT5mUmVzdGJrZ2Ryb3cgPSAobW5nX2ZwdHIpbW5nX3Jlc3RvcmVfYmtnZF9ia2dkOworICAgICAgICAgIGJDb2xvcmNvcnIgICAgICAgICAgPSBNTkdfVFJVRTsKKyAgICAgICAgfQorICAgICAgfQorI2VuZGlmCisKKyAgICAgIGlmIChwRGF0YS0+ZkdldGJrZ2RsaW5lKSAgICAgICAgIC8qIGJhY2tncm91bmQtY2FudmFzLWFjY2VzcyBjYWxsYmFjayBzZXQgPyAqLworICAgICAgeworICAgICAgICBzd2l0Y2ggKHBEYXRhLT5pQmtnZHN0eWxlKQorICAgICAgICB7CisjaWZuZGVmIE1OR19TS0lQQ0FOVkFTX1JHQjgKKyAgICAgICAgICBjYXNlIE1OR19DQU5WQVNfUkdCOCAgICA6IHsgcERhdGEtPmZSZXN0YmtnZHJvdyA9IChtbmdfZnB0ciltbmdfcmVzdG9yZV9ia2dkX3JnYjg7ICAgIGJyZWFrOyB9CisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDQU5WQVNfQkdSOAorICAgICAgICAgIGNhc2UgTU5HX0NBTlZBU19CR1I4ICAgIDogeyBwRGF0YS0+ZlJlc3Ria2dkcm93ID0gKG1uZ19mcHRyKW1uZ19yZXN0b3JlX2JrZ2RfYmdyODsgICAgYnJlYWs7IH0KKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENBTlZBU19CR1JYOAorICAgICAgICAgIGNhc2UgTU5HX0NBTlZBU19CR1JYOCAgIDogeyBwRGF0YS0+ZlJlc3Ria2dkcm93ID0gKG1uZ19mcHRyKW1uZ19yZXN0b3JlX2JrZ2RfYmdyeDg7ICAgYnJlYWs7IH0KKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENBTlZBU19CR1I1NjUKKyAgICAgICAgICBjYXNlIE1OR19DQU5WQVNfQkdSNTY1ICA6IHsgcERhdGEtPmZSZXN0YmtnZHJvdyA9IChtbmdfZnB0ciltbmdfcmVzdG9yZV9ia2dkX2JncjU2NTsgIGJyZWFrOyB9CisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDQU5WQVNfUkdCNTY1CisgICAgICAgICAgY2FzZSBNTkdfQ0FOVkFTX1JHQjU2NSAgOiB7IHBEYXRhLT5mUmVzdGJrZ2Ryb3cgPSAobW5nX2ZwdHIpbW5nX3Jlc3RvcmVfYmtnZF9yZ2I1NjU7ICBicmVhazsgfQorI2VuZGlmCisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgIC8qICAgICAgICBjYXNlIE1OR19DQU5WQVNfUkdCMTYgICA6IHsgcERhdGEtPmZSZXN0YmtnZHJvdyA9IChtbmdfZnB0ciltbmdfcmVzdG9yZV9ia2dkX3JnYjE2OyAgIGJyZWFrOyB9ICovCisgIC8qICAgICAgICBjYXNlIE1OR19DQU5WQVNfQkdSMTYgICA6IHsgcERhdGEtPmZSZXN0YmtnZHJvdyA9IChtbmdfZnB0ciltbmdfcmVzdG9yZV9ia2dkX2JncjE2OyAgIGJyZWFrOyB9ICovCisjZW5kaWYKKyAgLyogICAgICAgIGNhc2UgTU5HX0NBTlZBU19JTkRFWDggIDogeyBwRGF0YS0+ZlJlc3Ria2dkcm93ID0gKG1uZ19mcHRyKW1uZ19yZXN0b3JlX2JrZ2RfaW5kZXg4OyAgYnJlYWs7IH0gKi8KKyAgLyogICAgICAgIGNhc2UgTU5HX0NBTlZBU19HUkFZOCAgIDogeyBwRGF0YS0+ZlJlc3Ria2dkcm93ID0gKG1uZ19mcHRyKW1uZ19yZXN0b3JlX2JrZ2RfZ3JheTg7ICAgYnJlYWs7IH0gKi8KKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyAgLyogICAgICAgIGNhc2UgTU5HX0NBTlZBU19HUkFZMTYgIDogeyBwRGF0YS0+ZlJlc3Ria2dkcm93ID0gKG1uZ19mcHRyKW1uZ19yZXN0b3JlX2JrZ2RfZ3JheTE2OyAgYnJlYWs7IH0gKi8KKyNlbmRpZgorICAvKiAgICAgICAgY2FzZSBNTkdfQ0FOVkFTX0RYMTUgICAgOiB7IHBEYXRhLT5mUmVzdGJrZ2Ryb3cgPSAobW5nX2ZwdHIpbW5nX3Jlc3RvcmVfYmtnZF9keDE1OyAgICBicmVhazsgfSAqLworICAvKiAgICAgICAgY2FzZSBNTkdfQ0FOVkFTX0RYMTYgICAgOiB7IHBEYXRhLT5mUmVzdGJrZ2Ryb3cgPSAobW5nX2ZwdHIpbW5nX3Jlc3RvcmVfYmtnZF9keDE2OyAgICBicmVhazsgfSAqLworICAgICAgICB9CisgICAgICB9CisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19CQUNLCisgICAgICBpZiAocERhdGEtPmJIYXNCQUNLKQorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYmFja2dyb3VuZCBpbWFnZSA/ICovCisgICAgICAgIGlmICgocERhdGEtPmlCQUNLbWFuZGF0b3J5ICYgMHgwMikgJiYgKHBEYXRhLT5pQkFDS2ltYWdlaWQpKQorICAgICAgICB7CisgICAgICAgICAgcERhdGEtPmZSZXN0YmtnZHJvdyA9IChtbmdfZnB0ciltbmdfcmVzdG9yZV9ia2dkX2JhY2tjb2xvcjsKKyAgICAgICAgICBiQ29sb3Jjb3JyICAgICAgICAgID0gTU5HX1RSVUU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJhY2tncm91bmQgY29sb3IgPyAqLworICAgICAgICBpZiAocERhdGEtPmlCQUNLbWFuZGF0b3J5ICYgMHgwMSkKKyAgICAgICAgeworICAgICAgICAgIHBEYXRhLT5mUmVzdGJrZ2Ryb3cgPSAobW5nX2ZwdHIpbW5nX3Jlc3RvcmVfYmtnZF9iYWNrY29sb3I7CisgICAgICAgICAgYkNvbG9yY29yciAgICAgICAgICA9IE1OR19UUlVFOworICAgICAgICB9CisgICAgICB9CisjZW5kaWYKKworICAgICAgcERhdGEtPmZDb3JyZWN0cm93ID0gTU5HX05VTEw7ICAgLyogZGVmYXVsdCBubyBjb2xvci1jb3JyZWN0aW9uICovCisKKyAgICAgIGlmIChiQ29sb3Jjb3JyKSAgICAgICAgICAgICAgICAgIC8qIGRvIHdlIGhhdmUgdG8gZG8gY29sb3ItY29ycmVjdGlvbiA/ICovCisgICAgICB7CisjaWZkZWYgTU5HX05PX0NNUworICAgICAgICBpUmV0Y29kZSA9IE1OR19OT0VSUk9SOworI2Vsc2UKKyNpZiBkZWZpbmVkKE1OR19GVUxMX0NNUykgICAgICAgICAgICAgIC8qIGRldGVybWluZSBjb2xvci1tYW5hZ2VtZW50IHJvdXRpbmUgKi8KKyAgICAgICAgaVJldGNvZGUgPSBtbmdfaW5pdF9mdWxsX2NtcyAgIChwRGF0YSwgTU5HX1RSVUUsIE1OR19GQUxTRSwgTU5HX0ZBTFNFKTsKKyNlbGlmIGRlZmluZWQoTU5HX0dBTU1BX09OTFkpCisgICAgICAgIGlSZXRjb2RlID0gbW5nX2luaXRfZ2FtbWFfb25seSAocERhdGEsIE1OR19UUlVFLCBNTkdfRkFMU0UsIE1OR19GQUxTRSk7CisjZWxpZiBkZWZpbmVkKE1OR19BUFBfQ01TKQorICAgICAgICBpUmV0Y29kZSA9IG1uZ19pbml0X2FwcF9jbXMgICAgKHBEYXRhLCBNTkdfVFJVRSwgTU5HX0ZBTFNFLCBNTkdfRkFMU0UpOworI2VuZGlmCisgICAgICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgICAgIHJldHVybiBpUmV0Y29kZTsKKyNlbmRpZiAvKiBNTkdfTk9fQ01TICovCisgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgYSB0ZW1wb3Jhcnkgcm93LWJ1ZmZlciAqLworICAgICAgTU5HX0FMTE9DIChwRGF0YSwgcERhdGEtPnBSR0JBcm93LCBwRGF0YS0+aVJvd3NpemUpOworCisgICAgICBpWSAgICAgICA9IHBEYXRhLT5pRGVzdHQ7ICAgICAgICAvKiB0aGlzIGlzIHdoZXJlIHdlIHN0YXJ0ICovCisgICAgICBpUmV0Y29kZSA9IE1OR19OT0VSUk9SOyAgICAgICAgICAvKiBzbyBmYXIsIHNvIGdvb2QgKi8KKworICAgICAgd2hpbGUgKCghaVJldGNvZGUpICYmIChpWSA8IHBEYXRhLT5pRGVzdGIpKQorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVzdG9yZSBhIGJhY2tncm91bmQgcm93ICovCisgICAgICAgIGlSZXRjb2RlID0gKChtbmdfcmVzdGJrZ2Ryb3cpcERhdGEtPmZSZXN0YmtnZHJvdykgKHBEYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbG9yIGNvcnJlY3Rpb24gPyAqLworICAgICAgICBpZiAoKCFpUmV0Y29kZSkgJiYgKHBEYXRhLT5mQ29ycmVjdHJvdykpCisgICAgICAgICAgaVJldGNvZGUgPSAoKG1uZ19jb3JyZWN0cm93KXBEYXRhLT5mQ29ycmVjdHJvdykgKHBEYXRhKTsKKworICAgICAgICBpZiAoIWlSZXRjb2RlKSAgICAgICAgICAgICAgICAgLyogc28uLi4gZGlzcGxheSBpdCAqLworICAgICAgICAgIGlSZXRjb2RlID0gKChtbmdfZGlzcGxheXJvdylwRGF0YS0+ZkRpc3BsYXlyb3cpIChwRGF0YSk7CisKKyAgICAgICAgaWYgKCFpUmV0Y29kZSkKKyAgICAgICAgICBpUmV0Y29kZSA9IG1uZ19uZXh0X3JvdyAocERhdGEpOworCisgICAgICAgIGlZKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgbmV4dCBsaW5lICovCisgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkcm9wIHRoZSB0ZW1wb3Jhcnkgcm93LWJ1ZmZlciAqLworICAgICAgTU5HX0ZSRUUgKHBEYXRhLCBwRGF0YS0+cFJHQkFyb3csIHBEYXRhLT5pUm93c2l6ZSk7CisKKyAgICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICAgIHJldHVybiBpUmV0Y29kZTsKKworI2lmIGRlZmluZWQoTU5HX0ZVTExfQ01TKSAgICAgICAgICAgICAgLyogY2xlYW51cCBjbXMgc3R1ZmYgKi8KKyAgICAgIGlmIChiQ29sb3Jjb3JyKSAgICAgICAgICAgICAgICAgIC8qIGRpZCB3ZSBkbyBjb2xvci1jb3JyZWN0aW9uID8gKi8KKyAgICAgIHsKKyAgICAgICAgaVJldGNvZGUgPSBtbmdfY2xlYXJfY21zIChwRGF0YSk7CisKKyAgICAgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICAgICAgcmV0dXJuIGlSZXRjb2RlOworICAgICAgfQorI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfQkFDSworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYmFja2dyb3VuZCBpbWFnZSA/ICovCisgICAgICBpZiAoKHBEYXRhLT5iSGFzQkFDSykgJiYgKHBEYXRhLT5pQkFDS21hbmRhdG9yeSAmIDB4MDIpICYmIChwRGF0YS0+aUJBQ0tpbWFnZWlkKSkKKyAgICAgIHsKKyAgICAgICAgbW5nX2ltYWdlcCBwSW1hZ2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZXQncyBmaW5kIHRoYXQgb2JqZWN0IHRoZW4gKi8KKyAgICAgICAgcERhdGEtPnBSZXRyaWV2ZW9iaiA9IG1uZ19maW5kX2ltYWdlb2JqZWN0IChwRGF0YSwgcERhdGEtPmlCQUNLaW1hZ2VpZCk7CisgICAgICAgIHBJbWFnZSAgICAgICAgICAgICAgPSAobW5nX2ltYWdlcClwRGF0YS0+cFJldHJpZXZlb2JqOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZXhpc3RzLCB2aWV3YWJsZSBhbmQgdmlzaWJsZSA/ICovCisgICAgICAgIGlmICgocEltYWdlKSAmJiAocEltYWdlLT5iVmlld2FibGUpICYmIChwSW1hZ2UtPmJWaXNpYmxlKSkKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdpbGwgaXQgZmFsbCB3aXRoaW4gdGhlIHRhcmdldCByZWdpb24gPyAqLworICAgICAgICAgIGlmICgocEltYWdlLT5pUG9zeCA8IHBEYXRhLT5pRGVzdHIpICYmIChwSW1hZ2UtPmlQb3N5IDwgcERhdGEtPmlEZXN0YikgICAgICAgICAgICAgJiYKKyAgICAgICAgICAgICAgKChwRGF0YS0+aUJBQ0t0aWxlKSB8fAorICAgICAgICAgICAgICAgKChwSW1hZ2UtPmlQb3N4ICsgKG1uZ19pbnQzMilwSW1hZ2UtPnBJbWdidWYtPmlXaWR0aCAgPj0gcERhdGEtPmlEZXN0bCkgJiYKKyAgICAgICAgICAgICAgICAocEltYWdlLT5pUG9zeSArIChtbmdfaW50MzIpcEltYWdlLT5wSW1nYnVmLT5pSGVpZ2h0ID49IHBEYXRhLT5pRGVzdHQpICAgICkpICYmCisgICAgICAgICAgICAgICgoIXBJbWFnZS0+YkNsaXBwZWQpIHx8CisgICAgICAgICAgICAgICAoKHBJbWFnZS0+aUNsaXBsIDw9IHBJbWFnZS0+aUNsaXByKSAmJiAocEltYWdlLT5pQ2xpcHQgPD0gcEltYWdlLT5pQ2xpcGIpICAgICAmJgorICAgICAgICAgICAgICAgIChwSW1hZ2UtPmlDbGlwbCA8IHBEYXRhLT5pRGVzdHIpICAgJiYgKHBJbWFnZS0+aUNsaXByID49IHBEYXRhLT5pRGVzdGwpICAgICAgJiYKKyAgICAgICAgICAgICAgICAocEltYWdlLT5pQ2xpcHQgPCBwRGF0YS0+aURlc3RiKSAgICYmIChwSW1hZ2UtPmlDbGlwYiA+PSBwRGF0YS0+aURlc3R0KSAgICAgICAgICkpKQorICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHQ7IHdlJ3ZlIGdvdCBvdXJzZWx2ZXMgc29tZXRoaW5nIHRvIGRvICovCisgICAgICAgICAgICBpZiAocEltYWdlLT5iQ2xpcHBlZCkgICAgICAvKiBjbGlwIG91dHB1dCByZWdpb24gd2l0aCBpbWFnZSdzIGNsaXBwaW5nIHJlZ2lvbiA/ICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChwSW1hZ2UtPmlDbGlwbCA+IHBEYXRhLT5pRGVzdGwpCisgICAgICAgICAgICAgICAgcERhdGEtPmlEZXN0bCA9IHBJbWFnZS0+aUNsaXBsOworICAgICAgICAgICAgICBpZiAocEltYWdlLT5pQ2xpcHIgPCBwRGF0YS0+aURlc3RyKQorICAgICAgICAgICAgICAgIHBEYXRhLT5pRGVzdHIgPSBwSW1hZ2UtPmlDbGlwcjsKKyAgICAgICAgICAgICAgaWYgKHBJbWFnZS0+aUNsaXB0ID4gcERhdGEtPmlEZXN0dCkKKyAgICAgICAgICAgICAgICBwRGF0YS0+aURlc3R0ID0gcEltYWdlLT5pQ2xpcHQ7CisgICAgICAgICAgICAgIGlmIChwSW1hZ2UtPmlDbGlwYiA8IHBEYXRhLT5pRGVzdGIpCisgICAgICAgICAgICAgICAgcERhdGEtPmlEZXN0YiA9IHBJbWFnZS0+aUNsaXBiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW1hZ2Ugb2Zmc2V0IGRvZXMgc29tZSBleHRyYSBjbGlwcGluZyB0b28gISAqLworICAgICAgICAgICAgaWYgKHBJbWFnZS0+aVBvc3ggPiBwRGF0YS0+aURlc3RsKQorICAgICAgICAgICAgICBwRGF0YS0+aURlc3RsID0gcEltYWdlLT5pUG9zeDsKKyAgICAgICAgICAgIGlmIChwSW1hZ2UtPmlQb3N5ID4gcERhdGEtPmlEZXN0dCkKKyAgICAgICAgICAgICAgcERhdGEtPmlEZXN0dCA9IHBJbWFnZS0+aVBvc3k7CisKKyAgICAgICAgICAgIGlmICghcERhdGEtPmlCQUNLdGlsZSkgICAgIC8qIHdpdGhvdXQgdGlsaW5nIGZ1cnRoZXIgY2xpcHBpbmcgaXMgbmVlZGVkICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChwSW1hZ2UtPmlQb3N4ICsgKG1uZ19pbnQzMilwSW1hZ2UtPnBJbWdidWYtPmlXaWR0aCAgPCBwRGF0YS0+aURlc3RyKQorICAgICAgICAgICAgICAgIHBEYXRhLT5pRGVzdHIgPSBwSW1hZ2UtPmlQb3N4ICsgKG1uZ19pbnQzMilwSW1hZ2UtPnBJbWdidWYtPmlXaWR0aDsKKyAgICAgICAgICAgICAgaWYgKHBJbWFnZS0+aVBvc3kgKyAobW5nX2ludDMyKXBJbWFnZS0+cEltZ2J1Zi0+aUhlaWdodCA8IHBEYXRhLT5pRGVzdGIpCisgICAgICAgICAgICAgICAgcERhdGEtPmlEZXN0YiA9IHBJbWFnZS0+aVBvc3kgKyAobW5nX2ludDMyKXBJbWFnZS0+cEltZ2J1Zi0+aUhlaWdodDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgcERhdGEtPmlTb3VyY2VsICAgID0gMDsgICAgLyogc291cmNlIHJlbGF0aXZlIHRvIGRlc3RpbmF0aW9uICovCisgICAgICAgICAgICBwRGF0YS0+aVNvdXJjZXIgICAgPSBwRGF0YS0+aURlc3RyIC0gcERhdGEtPmlEZXN0bDsKKyAgICAgICAgICAgIHBEYXRhLT5pU291cmNldCAgICA9IDA7CisgICAgICAgICAgICBwRGF0YS0+aVNvdXJjZWIgICAgPSBwRGF0YS0+aURlc3RiIC0gcERhdGEtPmlEZXN0dDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE2LWJpdCBiYWNrZ3JvdW5kID8gKi8KKworI2lmZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgICAgICAgICBwRGF0YS0+YklzUkdCQTE2ICAgPSBNTkdfRkFMU0U7CisjZWxzZQorICAgICAgICAgICAgcERhdGEtPmJJc1JHQkExNiAgICAgID0gKG1uZ19ib29sKShwSW1hZ2UtPnBJbWdidWYtPmlCaXRkZXB0aCA+IDgpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZXQgcmVzdG9yZSByb3V0aW5lIGtub3cgdGhlIG9mZnNldHMgISEhICovCisgICAgICAgICAgICBwRGF0YS0+aUJhY2tpbWdvZmZzeCAgPSBwSW1hZ2UtPmlQb3N4OworICAgICAgICAgICAgcERhdGEtPmlCYWNraW1nb2Zmc3kgID0gcEltYWdlLT5pUG9zeTsKKyAgICAgICAgICAgIHBEYXRhLT5pQmFja2ltZ3dpZHRoICA9IHBJbWFnZS0+cEltZ2J1Zi0+aVdpZHRoOworICAgICAgICAgICAgcERhdGEtPmlCYWNraW1naGVpZ2h0ID0gcEltYWdlLT5wSW1nYnVmLT5pSGVpZ2h0OworICAgICAgICAgICAgcERhdGEtPmlSb3cgICAgICAgICAgID0gMDsgLyogc3RhcnQgYXQgdGhlIHRvcCBhZ2FpbiAhISAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGV0ZXJtaW5lIGJhY2tncm91bmQgb2JqZWN0IHJldHJpZXZhbCByb3V0aW5lICovCisgICAgICAgICAgICBzd2l0Y2ggKHBJbWFnZS0+cEltZ2J1Zi0+aUNvbG9ydHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY2FzZSAgMCA6IHsKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBJbWFnZS0+cEltZ2J1Zi0+aUJpdGRlcHRoID4gOCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZlJldHJpZXZlcm93ID0gKG1uZ19mcHRyKW1uZ19yZXRyaWV2ZV9nMTY7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mUmV0cmlldmVyb3cgPSAobW5nX2ZwdHIpbW5nX3JldHJpZXZlX2c4OworCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5iSXNPcGFxdWUgICAgICA9IChtbmdfYm9vbCkoIXBJbWFnZS0+cEltZ2J1Zi0+Ykhhc1RSTlMpOworICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBjYXNlICAyIDogeworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocEltYWdlLT5wSW1nYnVmLT5pQml0ZGVwdGggPiA4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mUmV0cmlldmVyb3cgPSAobW5nX2ZwdHIpbW5nX3JldHJpZXZlX3JnYjE2OworICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZlJldHJpZXZlcm93ID0gKG1uZ19mcHRyKW1uZ19yZXRyaWV2ZV9yZ2I4OworCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5iSXNPcGFxdWUgICAgICA9IChtbmdfYm9vbCkoIXBJbWFnZS0+cEltZ2J1Zi0+Ykhhc1RSTlMpOworICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBjYXNlICAzIDogeyBwRGF0YS0+ZlJldHJpZXZlcm93ICAgPSAobW5nX2ZwdHIpbW5nX3JldHJpZXZlX2lkeDg7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5iSXNPcGFxdWUgICAgICA9IChtbmdfYm9vbCkoIXBJbWFnZS0+cEltZ2J1Zi0+Ykhhc1RSTlMpOworICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBjYXNlICA0IDogeyAKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKwkJCWlmIChwSW1hZ2UtPnBJbWdidWYtPmlCaXRkZXB0aCA+IDgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZSZXRyaWV2ZXJvdyA9IChtbmdfZnB0ciltbmdfcmV0cmlldmVfZ2ExNjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZSZXRyaWV2ZXJvdyA9IChtbmdfZnB0ciltbmdfcmV0cmlldmVfZ2E4OworCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5iSXNPcGFxdWUgICAgICA9IE1OR19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgY2FzZSAgNiA6IHsKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBJbWFnZS0+cEltZ2J1Zi0+aUJpdGRlcHRoID4gOCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZlJldHJpZXZlcm93ID0gKG1uZ19mcHRyKW1uZ19yZXRyaWV2ZV9yZ2JhMTY7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mUmV0cmlldmVyb3cgPSAobW5nX2ZwdHIpbW5nX3JldHJpZXZlX3JnYmE4OworCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5iSXNPcGFxdWUgICAgICA9IE1OR19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgY2FzZSAgOCA6IHsKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBJbWFnZS0+cEltZ2J1Zi0+aUJpdGRlcHRoID4gOCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZlJldHJpZXZlcm93ID0gKG1uZ19mcHRyKW1uZ19yZXRyaWV2ZV9nMTY7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mUmV0cmlldmVyb3cgPSAobW5nX2ZwdHIpbW5nX3JldHJpZXZlX2c4OworCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5iSXNPcGFxdWUgICAgICA9IE1OR19UUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBjYXNlIDEwIDogeworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocEltYWdlLT5wSW1nYnVmLT5pQml0ZGVwdGggPiA4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mUmV0cmlldmVyb3cgPSAobW5nX2ZwdHIpbW5nX3JldHJpZXZlX3JnYjE2OworICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZlJldHJpZXZlcm93ID0gKG1uZ19mcHRyKW1uZ19yZXRyaWV2ZV9yZ2I4OworCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5iSXNPcGFxdWUgICAgICA9IE1OR19UUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBjYXNlIDEyIDogeworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocEltYWdlLT5wSW1nYnVmLT5pQml0ZGVwdGggPiA4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mUmV0cmlldmVyb3cgPSAobW5nX2ZwdHIpbW5nX3JldHJpZXZlX2dhMTY7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mUmV0cmlldmVyb3cgPSAobW5nX2ZwdHIpbW5nX3JldHJpZXZlX2dhODsKKworICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+YklzT3BhcXVlICAgICAgPSBNTkdfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGNhc2UgMTQgOiB7CisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwSW1hZ2UtPnBJbWdidWYtPmlCaXRkZXB0aCA+IDgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZSZXRyaWV2ZXJvdyA9IChtbmdfZnB0ciltbmdfcmV0cmlldmVfcmdiYTE2OworICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZlJldHJpZXZlcm93ID0gKG1uZ19mcHRyKW1uZ19yZXRyaWV2ZV9yZ2JhODsKKworICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+YklzT3BhcXVlICAgICAgPSBNTkdfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisjaWZkZWYgTU5HX05PX0NNUworICAgICAgICAgICAgaVJldGNvZGUgPSBNTkdfTk9FUlJPUjsKKyNlbHNlCisjaWYgZGVmaW5lZChNTkdfRlVMTF9DTVMpICAgICAgICAgICAgICAvKiBkZXRlcm1pbmUgY29sb3ItbWFuYWdlbWVudCByb3V0aW5lICovCisgICAgICAgICAgICBpUmV0Y29kZSA9IG1uZ19pbml0X2Z1bGxfY21zICAgKHBEYXRhLCBNTkdfRkFMU0UsIE1OR19GQUxTRSwgTU5HX1RSVUUpOworI2VsaWYgZGVmaW5lZChNTkdfR0FNTUFfT05MWSkKKyAgICAgICAgICAgIGlSZXRjb2RlID0gbW5nX2luaXRfZ2FtbWFfb25seSAocERhdGEsIE1OR19GQUxTRSwgTU5HX0ZBTFNFLCBNTkdfVFJVRSk7CisjZWxpZiBkZWZpbmVkKE1OR19BUFBfQ01TKQorICAgICAgICAgICAgaVJldGNvZGUgPSBtbmdfaW5pdF9hcHBfY21zICAgIChwRGF0YSwgTU5HX0ZBTFNFLCBNTkdfRkFMU0UsIE1OR19UUlVFKTsKKyNlbmRpZgorICAgICAgICAgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgICAgICAgICAgcmV0dXJuIGlSZXRjb2RlOworI2VuZGlmIC8qIE1OR19OT19DTVMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCB0ZW1wb3Jhcnkgcm93LWJ1ZmZlcnMgKi8KKyAgICAgICAgICAgIE1OR19BTExPQyAocERhdGEsIHBEYXRhLT5wUHJldnJvdywgcERhdGEtPmlSb3dzaXplKTsKKyAgICAgICAgICAgIE1OR19BTExPQyAocERhdGEsIHBEYXRhLT5wUkdCQXJvdywgcERhdGEtPmlSb3dzaXplKTsKKworICAgICAgICAgICAgaVkgICAgICAgPSBwRGF0YS0+aURlc3R0OyAgLyogdGhpcyBpcyB3aGVyZSB3ZSBzdGFydCAqLworICAgICAgICAgICAgaVJldGNvZGUgPSBNTkdfTk9FUlJPUjsgICAgLyogc28gZmFyLCBzbyBnb29kICovCisKKyAgICAgICAgICAgIHdoaWxlICgoIWlSZXRjb2RlKSAmJiAoaVkgPCBwRGF0YS0+aURlc3RiKSkKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlc3RvcmUgYSBiYWNrZ3JvdW5kIHJvdyAqLworICAgICAgICAgICAgICBpUmV0Y29kZSA9IG1uZ19yZXN0b3JlX2JrZ2RfYmFja2ltYWdlIChwRGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb2xvciBjb3JyZWN0aW9uID8gKi8KKyAgICAgICAgICAgICAgaWYgKCghaVJldGNvZGUpICYmIChwRGF0YS0+ZkNvcnJlY3Ryb3cpKQorICAgICAgICAgICAgICAgIGlSZXRjb2RlID0gKChtbmdfY29ycmVjdHJvdylwRGF0YS0+ZkNvcnJlY3Ryb3cpIChwRGF0YSk7CisKKyAgICAgICAgICAgICAgaWYgKCFpUmV0Y29kZSkgICAgICAgICAgIC8qIHNvLi4uIGRpc3BsYXkgaXQgKi8KKyAgICAgICAgICAgICAgICBpUmV0Y29kZSA9ICgobW5nX2Rpc3BsYXlyb3cpcERhdGEtPmZEaXNwbGF5cm93KSAocERhdGEpOworCisgICAgICAgICAgICAgIGlmICghaVJldGNvZGUpCisgICAgICAgICAgICAgICAgaVJldGNvZGUgPSBtbmdfbmV4dF9yb3cgKHBEYXRhKTsKKworICAgICAgICAgICAgICBpWSsrOyAgICAgICAgICAgICAgICAgICAgLyogYW5kIG5leHQgbGluZSAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZHJvcCB0ZW1wb3Jhcnkgcm93LWJ1ZmZlcnMgKi8KKyAgICAgICAgICAgIE1OR19GUkVFIChwRGF0YSwgcERhdGEtPnBSR0JBcm93LCBwRGF0YS0+aVJvd3NpemUpOworICAgICAgICAgICAgTU5HX0ZSRUUgKHBEYXRhLCBwRGF0YS0+cFByZXZyb3csIHBEYXRhLT5pUm93c2l6ZSk7CisKKyAgICAgICAgICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICAgICAgICAgIHJldHVybiBpUmV0Y29kZTsKKworI2lmIGRlZmluZWQoTU5HX0ZVTExfQ01TKSAgICAgICAgICAgICAgLyogY2xlYW51cCBjbXMgc3R1ZmYgKi8KKyAgICAgICAgICAgIGlSZXRjb2RlID0gbW5nX2NsZWFyX2NtcyAocERhdGEpOworCisgICAgICAgICAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgICAgICAgICByZXR1cm4gaVJldGNvZGU7CisjZW5kaWYKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyNlbmRpZgorICAgIH0KKworICAgIHBEYXRhLT5pRGVzdGwgICAgICAgPSBpRGVzdGw7ICAgICAgLyogcmVzdG9yZSB2YWx1ZXMgKi8KKyAgICBwRGF0YS0+aURlc3RyICAgICAgID0gaURlc3RyOworICAgIHBEYXRhLT5pRGVzdHQgICAgICAgPSBpRGVzdHQ7CisgICAgcERhdGEtPmlEZXN0YiAgICAgICA9IGlEZXN0YjsKKyAgICBwRGF0YS0+aVNvdXJjZWwgICAgID0gaVNvdXJjZWw7CisgICAgcERhdGEtPmlTb3VyY2VyICAgICA9IGlTb3VyY2VyOworICAgIHBEYXRhLT5pU291cmNldCAgICAgPSBpU291cmNldDsKKyAgICBwRGF0YS0+aVNvdXJjZWIgICAgID0gaVNvdXJjZWI7CisgICAgcERhdGEtPmlQYXNzICAgICAgICA9IGlQYXNzOworICAgIHBEYXRhLT5pUm93ICAgICAgICAgPSBpUm93OworICAgIHBEYXRhLT5pUm93aW5jICAgICAgPSBpUm93aW5jOworICAgIHBEYXRhLT5pQ29sICAgICAgICAgPSBpQ29sOworICAgIHBEYXRhLT5pQ29saW5jICAgICAgPSBpQ29saW5jOworICAgIHBEYXRhLT5pUm93c2FtcGxlcyAgPSBpUm93c2FtcGxlczsKKyAgICBwRGF0YS0+aVJvd3NpemUgICAgID0gaVJvd3NpemU7CisgICAgcERhdGEtPnBQcmV2cm93ICAgICA9IHBQcmV2cm93OworICAgIHBEYXRhLT5wUkdCQXJvdyAgICAgPSBwUkdCQXJvdzsKKyAgICBwRGF0YS0+YklzUkdCQTE2ICAgID0gYklzUkdCQTE2OworICAgIHBEYXRhLT5iSXNPcGFxdWUgICAgPSBiSXNPcGFxdWU7CisgICAgcERhdGEtPmZDb3JyZWN0cm93ICA9IGZDb3JyZWN0cm93OworICAgIHBEYXRhLT5mRGlzcGxheXJvdyAgPSBmRGlzcGxheXJvdzsgCisgICAgcERhdGEtPmZSZXRyaWV2ZXJvdyA9IGZSZXRyaWV2ZXJvdzsKKyAgICBwRGF0YS0+cEN1cnJlbnRvYmogID0gcEN1cnJlbnRvYmo7CisgICAgcERhdGEtPnBSZXRyaWV2ZW9iaiA9IHBSZXRyaWV2ZW9iajsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0xPQURfQktHRExBWUVSLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworTU5HX0xPQ0FMIG1uZ19yZXRjb2RlIGNsZWFyX2NhbnZhcyAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfaW50MzIgICBpWTsKKyAgbW5nX3JldGNvZGUgaVJldGNvZGU7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQ0xFQVJfQ0FOVkFTLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcERhdGEtPmlEZXN0bCAgICAgID0gMDsgICAgICAgICAgICAgIC8qIGNsaXBwaW5nIHJlZ2lvbiBpcyBmdWxsIGNhbnZhcyEgKi8KKyAgcERhdGEtPmlEZXN0dCAgICAgID0gMDsKKyAgcERhdGEtPmlEZXN0ciAgICAgID0gcERhdGEtPmlXaWR0aDsKKyAgcERhdGEtPmlEZXN0YiAgICAgID0gcERhdGEtPmlIZWlnaHQ7CisKKyAgcERhdGEtPmlTb3VyY2VsICAgID0gMDsgICAgICAgICAgICAgIC8qIHNvdXJjZSBpcyBzYW1lIGFzIGRlc3RpbmF0aW9uICovCisgIHBEYXRhLT5pU291cmNlciAgICA9IHBEYXRhLT5pV2lkdGg7CisgIHBEYXRhLT5pU291cmNldCAgICA9IDA7CisgIHBEYXRhLT5pU291cmNlYiAgICA9IHBEYXRhLT5pSGVpZ2h0OworCisgIHBEYXRhLT5pUGFzcyAgICAgICA9IC0xOyAgICAgICAgICAgICAvKiB0aGVzZSBhcmUgdGhlIG9iamVjdCdzIGRpbWVuc2lvbnMgbm93ICovCisgIHBEYXRhLT5pUm93ICAgICAgICA9IDA7CisgIHBEYXRhLT5pUm93aW5jICAgICA9IDE7CisgIHBEYXRhLT5pQ29sICAgICAgICA9IDA7CisgIHBEYXRhLT5pQ29saW5jICAgICA9IDE7CisgIHBEYXRhLT5pUm93c2FtcGxlcyA9IHBEYXRhLT5pV2lkdGg7CisgIHBEYXRhLT5pUm93c2l6ZSAgICA9IHBEYXRhLT5pUm93c2FtcGxlcyA8PCAyOworICBwRGF0YS0+YklzUkdCQTE2ICAgPSBNTkdfRkFMU0U7ICAgICAgLyogbGV0J3Mga2VlcCBpdCBzaW1wbGUgISAqLworICBwRGF0YS0+YklzT3BhcXVlICAgPSBNTkdfVFJVRTsKKworICBzZXRfZGlzcGxheV9yb3V0aW5lIChwRGF0YSk7ICAgICAgICAgLyogZGV0ZXJtaW5lIGRpc3BsYXkgcm91dGluZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0IGEgdGVtcG9yYXJ5IHJvdy1idWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGl0J3MgdHJhbnNwYXJlbnQgYmxhY2sgYnkgZGVmYXVsdCEhICovCisgIE1OR19BTExPQyAocERhdGEsIHBEYXRhLT5wUkdCQXJvdywgcERhdGEtPmlSb3dzaXplKTsKKworICBpWSAgICAgICA9IHBEYXRhLT5pRGVzdHQ7ICAgICAgICAgICAgLyogdGhpcyBpcyB3aGVyZSB3ZSBzdGFydCAqLworICBpUmV0Y29kZSA9IE1OR19OT0VSUk9SOyAgICAgICAgICAgICAgLyogc28gZmFyLCBzbyBnb29kICovCisKKyAgd2hpbGUgKCghaVJldGNvZGUpICYmIChpWSA8IHBEYXRhLT5pRGVzdGIpKQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2xlYXIgYSByb3cgdGhlbiAqLworICAgIGlSZXRjb2RlID0gKChtbmdfZGlzcGxheXJvdylwRGF0YS0+ZkRpc3BsYXlyb3cpIChwRGF0YSk7CisKKyAgICBpZiAoIWlSZXRjb2RlKQorICAgICAgaVJldGNvZGUgPSBtbmdfbmV4dF9yb3cgKHBEYXRhKTsgLyogYWRqdXN0IHZhcmlhYmxlcyBmb3IgbmV4dCByb3cgKi8KKworICAgIGlZKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIG5leHQgbGluZSAqLworICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkcm9wIHRoZSB0ZW1wb3Jhcnkgcm93LWJ1ZmZlciAqLworICBNTkdfRlJFRSAocERhdGEsIHBEYXRhLT5wUkdCQXJvdywgcERhdGEtPmlSb3dzaXplKTsKKworICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICByZXR1cm4gaVJldGNvZGU7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQ0xFQVJfQ0FOVkFTLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworTU5HX0xPQ0FMIG1uZ19yZXRjb2RlIG5leHRfZnJhbWUgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICBpRnJhbWVtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaUNoYW5nZWRlbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaURlbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaUNoYW5nZXRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpVGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggIGlDaGFuZ2VjbGlwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggIGlDbGlwdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlDbGlwbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlDbGlwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlDbGlwdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlDbGlwYikKK3sKKyAgbW5nX3JldGNvZGUgaVJldGNvZGUgPSBNTkdfTk9FUlJPUjsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ORVhUX0ZSQU1FLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKCFwRGF0YS0+aUJyZWFrcG9pbnQpICAgICAgICAgICAgIC8qIG5vIHByZXZpb3VzIGJyZWFrIGhlcmUgPyAqLworICB7CisjaWZuZGVmIE1OR19TS0lQQ0hVTktfRlJBTQorICAgIG1uZ191aW50OCBpT2xkbW9kZSA9IHBEYXRhLT5pRnJhbWVtb2RlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW50ZXJmcmFtZSBkZWxheSByZXF1aXJlZCA/ICovCisgICAgaWYgKChpT2xkbW9kZSA9PSAyKSB8fCAoaU9sZG1vZGUgPT0gNCkpCisgICAgeworICAgICAgaWYgKChwRGF0YS0+aUZyYW1lc2VxKSAmJiAoaUZyYW1lbW9kZSAhPSAxKSAmJiAoaUZyYW1lbW9kZSAhPSAzKSkKKyAgICAgICAgaVJldGNvZGUgPSBpbnRlcmZyYW1lX2RlbGF5IChwRGF0YSk7CisgICAgICBlbHNlCisgICAgICAgIHBEYXRhLT5pRnJhbWVkZWxheSA9IHBEYXRhLT5pTmV4dGRlbGF5OworICAgIH0KKyAgICBlbHNlCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWxheSBiZWZvcmUgaW5zZXJ0aW5nIGJhY2tncm91bmQgbGF5ZXI/ICovCisgICAgICBpZiAoKHBEYXRhLT5iRnJhbWVkb25lKSAmJiAoaUZyYW1lbW9kZSA9PSA0KSkKKyAgICAgICAgaVJldGNvZGUgPSBpbnRlcmZyYW1lX2RlbGF5IChwRGF0YSk7CisgICAgfQorCisgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgcmV0dXJuIGlSZXRjb2RlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm93IHdlJ2xsIGFzc3VtZSB3ZSdyZSBpbiB0aGUgbmV4dCBmcmFtZSEgKi8KKyAgICBpZiAoaUZyYW1lbW9kZSkgICAgICAgICAgICAgICAgICAgIC8qIHNhdmUgdGhlIG5ldyBmcmFtaW5nIG1vZGUgPyAqLworICAgIHsKKyAgICAgIHBEYXRhLT5pRlJBTW1vZGUgID0gaUZyYW1lbW9kZTsKKyAgICAgIHBEYXRhLT5pRnJhbWVtb2RlID0gaUZyYW1lbW9kZTsKKyAgICB9CisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWxvYWQgZGVmYXVsdCAqLworICAgICAgcERhdGEtPmlGcmFtZW1vZGUgPSBwRGF0YS0+aUZSQU1tb2RlOworCisgICAgaWYgKGlDaGFuZ2VkZWxheSkgICAgICAgICAgICAgICAgICAvKiBkZWxheSBjaGFuZ2VkID8gKi8KKyAgICB7CisgICAgICBwRGF0YS0+aU5leHRkZWxheSA9IGlEZWxheTsgICAgICAvKiBmb3IgKmFmdGVyKiBuZXh0IHN1YmZyYW1lICovCisKKyAgICAgIGlmICgoaU9sZG1vZGUgPT0gMikgfHwgKGlPbGRtb2RlID09IDQpKQorICAgICAgICBwRGF0YS0+aUZyYW1lZGVsYXkgPSBwRGF0YS0+aUZSQU1kZWxheTsKKworICAgICAgaWYgKGlDaGFuZ2VkZWxheSA9PSAyKSAgICAgICAgICAgLyogYWxzbyBvdmVyYWxsID8gKi8KKyAgICAgICAgcERhdGEtPmlGUkFNZGVsYXkgPSBpRGVsYXk7CisgICAgfQorICAgIGVsc2UKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlbG9hZCBkZWZhdWx0ICovCisgICAgICBwRGF0YS0+aU5leHRkZWxheSA9IHBEYXRhLT5pRlJBTWRlbGF5OworICAgIH0KKworICAgIGlmIChpQ2hhbmdldGltZW91dCkgICAgICAgICAgICAgICAgLyogdGltZW91dCBjaGFuZ2VkID8gKi8KKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciBuZXh0IHN1YmZyYW1lICovCisgICAgICBwRGF0YS0+aUZyYW1ldGltZW91dCA9IGlUaW1lb3V0OworCisgICAgICBpZiAoKGlDaGFuZ2V0aW1lb3V0ID09IDIpIHx8ICAgICAvKiBhbHNvIG92ZXJhbGwgPyAqLworICAgICAgICAgIChpQ2hhbmdldGltZW91dCA9PSA0KSB8fAorICAgICAgICAgIChpQ2hhbmdldGltZW91dCA9PSA2KSB8fAorICAgICAgICAgIChpQ2hhbmdldGltZW91dCA9PSA4KSkKKyAgICAgICAgcERhdGEtPmlGUkFNdGltZW91dCA9IGlUaW1lb3V0OworICAgIH0KKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlbG9hZCBkZWZhdWx0ICovCisgICAgICBwRGF0YS0+aUZyYW1ldGltZW91dCA9IHBEYXRhLT5pRlJBTXRpbWVvdXQ7CisKKyAgICBpZiAoaUNoYW5nZWNsaXBwaW5nKSAgICAgICAgICAgICAgIC8qIGNsaXBwaW5nIGNoYW5nZWQgPyAqLworICAgIHsKKyAgICAgIHBEYXRhLT5iRnJhbWVjbGlwcGluZyA9IE1OR19UUlVFOworCisgICAgICBpZiAoIWlDbGlwdHlwZSkgICAgICAgICAgICAgICAgICAvKiBhYnNvbHV0ZSA/ICovCisgICAgICB7CisgICAgICAgIHBEYXRhLT5pRnJhbWVjbGlwbCA9IGlDbGlwbDsKKyAgICAgICAgcERhdGEtPmlGcmFtZWNsaXByID0gaUNsaXByOworICAgICAgICBwRGF0YS0+aUZyYW1lY2xpcHQgPSBpQ2xpcHQ7CisgICAgICAgIHBEYXRhLT5pRnJhbWVjbGlwYiA9IGlDbGlwYjsKKyAgICAgIH0KKyAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlbGF0aXZlICovCisgICAgICB7CisgICAgICAgIHBEYXRhLT5pRnJhbWVjbGlwbCA9IHBEYXRhLT5pRnJhbWVjbGlwbCArIGlDbGlwbDsKKyAgICAgICAgcERhdGEtPmlGcmFtZWNsaXByID0gcERhdGEtPmlGcmFtZWNsaXByICsgaUNsaXByOworICAgICAgICBwRGF0YS0+aUZyYW1lY2xpcHQgPSBwRGF0YS0+aUZyYW1lY2xpcHQgKyBpQ2xpcHQ7CisgICAgICAgIHBEYXRhLT5pRnJhbWVjbGlwYiA9IHBEYXRhLT5pRnJhbWVjbGlwYiArIGlDbGlwYjsKKyAgICAgIH0KKworICAgICAgaWYgKGlDaGFuZ2VjbGlwcGluZyA9PSAyKSAgICAgICAgLyogYWxzbyBvdmVyYWxsID8gKi8KKyAgICAgIHsKKyAgICAgICAgcERhdGEtPmJGUkFNY2xpcHBpbmcgPSBNTkdfVFJVRTsKKworICAgICAgICBpZiAoIWlDbGlwdHlwZSkgICAgICAgICAgICAgICAgLyogYWJzb2x1dGUgPyAqLworICAgICAgICB7CisgICAgICAgICAgcERhdGEtPmlGUkFNY2xpcGwgPSBpQ2xpcGw7CisgICAgICAgICAgcERhdGEtPmlGUkFNY2xpcHIgPSBpQ2xpcHI7CisgICAgICAgICAgcERhdGEtPmlGUkFNY2xpcHQgPSBpQ2xpcHQ7CisgICAgICAgICAgcERhdGEtPmlGUkFNY2xpcGIgPSBpQ2xpcGI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlbGF0aXZlICovCisgICAgICAgIHsKKyAgICAgICAgICBwRGF0YS0+aUZSQU1jbGlwbCA9IHBEYXRhLT5pRlJBTWNsaXBsICsgaUNsaXBsOworICAgICAgICAgIHBEYXRhLT5pRlJBTWNsaXByID0gcERhdGEtPmlGUkFNY2xpcHIgKyBpQ2xpcHI7CisgICAgICAgICAgcERhdGEtPmlGUkFNY2xpcHQgPSBwRGF0YS0+aUZSQU1jbGlwdCArIGlDbGlwdDsKKyAgICAgICAgICBwRGF0YS0+aUZSQU1jbGlwYiA9IHBEYXRhLT5pRlJBTWNsaXBiICsgaUNsaXBiOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlbG9hZCBkZWZhdWx0cyAqLworICAgICAgcERhdGEtPmJGcmFtZWNsaXBwaW5nID0gcERhdGEtPmJGUkFNY2xpcHBpbmc7CisgICAgICBwRGF0YS0+aUZyYW1lY2xpcGwgICAgPSBwRGF0YS0+aUZSQU1jbGlwbDsKKyAgICAgIHBEYXRhLT5pRnJhbWVjbGlwciAgICA9IHBEYXRhLT5pRlJBTWNsaXByOworICAgICAgcERhdGEtPmlGcmFtZWNsaXB0ICAgID0gcERhdGEtPmlGUkFNY2xpcHQ7CisgICAgICBwRGF0YS0+aUZyYW1lY2xpcGIgICAgPSBwRGF0YS0+aUZSQU1jbGlwYjsKKyAgICB9CisjZW5kaWYKKyAgfQorCisgIGlmICghcERhdGEtPmJUaW1lcnNldCkgICAgICAgICAgICAgICAvKiB0aW1lciBzdGlsbCBvZmYgPyAqLworICB7CisgICAgaWYgKAorI2lmbmRlZiBNTkdfU0tJUENIVU5LX0ZSQU0KKyAgICAgICAocERhdGEtPmlGcmFtZW1vZGUgPT0gNCkgfHwgICAgLyogaW5zZXJ0IGJhY2tncm91bmQgbGF5ZXIgYWZ0ZXIgYSBuZXcgZnJhbWUgKi8KKyNlbmRpZgorICAgICAgICAoIXBEYXRhLT5pTGF5ZXJzZXEpKSAgICAgICAgICAgLyogYW5kIGNlcnRhaW5seSBiZWZvcmUgdGhlIHZlcnkgZmlyc3QgbGF5ZXIgKi8KKyAgICAgIGlSZXRjb2RlID0gbG9hZF9ia2dkbGF5ZXIgKHBEYXRhKTsKKworICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKworICAgIHBEYXRhLT5pRnJhbWVzZXErKzsgICAgICAgICAgICAgICAgLyogY291bnQgdGhlIGZyYW1lICEgKi8KKyAgICBwRGF0YS0+YkZyYW1lZG9uZSA9IE1OR19UUlVFOyAgICAgIC8qIGFuZCBpbmRpY2F0ZSB3ZSd2ZSBkb25lIG9uZSAqLworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fTkVYVF9GUkFNRSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK01OR19MT0NBTCBtbmdfcmV0Y29kZSBuZXh0X2xheWVyIChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ19pbWFnZXAgIHBJbWFnZTsKKyAgbW5nX3JldGNvZGUgaVJldGNvZGUgPSBNTkdfTk9FUlJPUjsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ORVhUX0xBWUVSLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19GUkFNCisgIGlmICghcERhdGEtPmlCcmVha3BvaW50KSAgICAgICAgICAgICAvKiBubyBwcmV2aW91cyBicmVhayBoZXJlID8gKi8KKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGludGVyZnJhbWUgZGVsYXkgcmVxdWlyZWQgPyAqLworICAgIGlmICgocERhdGEtPmVJbWFnZXR5cGUgPT0gbW5nX2l0X21uZykgJiYgKHBEYXRhLT5pTGF5ZXJzZXEpICYmCisgICAgICAgICgocERhdGEtPmlGcmFtZW1vZGUgPT0gMSkgfHwgKHBEYXRhLT5pRnJhbWVtb2RlID09IDMpKSkKKyAgICAgIGlSZXRjb2RlID0gaW50ZXJmcmFtZV9kZWxheSAocERhdGEpOworICAgIGVsc2UKKyAgICAgIHBEYXRhLT5pRnJhbWVkZWxheSA9IHBEYXRhLT5pTmV4dGRlbGF5OworCisgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgcmV0dXJuIGlSZXRjb2RlOworICB9CisjZW5kaWYKKworICBpZiAoIXBEYXRhLT5iVGltZXJzZXQpICAgICAgICAgICAgICAgLyogdGltZXIgc3RpbGwgb2ZmID8gKi8KKyAgeworICAgIGlmICghcERhdGEtPmlMYXllcnNlcSkgICAgICAgICAgICAgLyogcmVzdG9yZSBiYWNrZ3JvdW5kIGZvciB0aGUgdmVyeSBmaXJzdCBsYXllciA/ICovCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3YWl0IHRpbGwgSURBVC9KREFUIGZvciBQTkdzICYgSk5HcyAhISEgKi8KKyAgICAgIGlmICgocERhdGEtPmVJbWFnZXR5cGUgPT0gbW5nX2l0X3BuZykgfHwgKHBEYXRhLT5lSW1hZ2V0eXBlID09IG1uZ19pdF9qbmcpKQorICAgICAgICBwRGF0YS0+YlJlc3RvcmVia2dkID0gTU5HX1RSVUU7CisgICAgICBlbHNlCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3IgTU5HIHdlIGRvIGl0IHJpZ2h0IGF3YXkgKi8KKyAgICAgICAgaVJldGNvZGUgPSBsb2FkX2JrZ2RsYXllciAocERhdGEpOworICAgICAgICBwRGF0YS0+aUxheWVyc2VxKys7ICAgICAgICAgICAgLyogYW5kIGl0IGNvdW50cyBhcyBhIGxheWVyIHRoZW4gISAqLworICAgICAgfQorICAgIH0KKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19GUkFNCisgICAgZWxzZQorICAgIGlmIChwRGF0YS0+aUZyYW1lbW9kZSA9PSAzKSAgICAgICAgLyogcmVzdG9yZSBiYWNrZ3JvdW5kIGZvciBlYWNoIGxheWVyID8gKi8KKyAgICAgIGlSZXRjb2RlID0gbG9hZF9ia2dkbGF5ZXIgKHBEYXRhKTsKKyNlbmRpZgorCisgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgcmV0dXJuIGlSZXRjb2RlOworCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKKyAgICBpZiAocERhdGEtPmJIYXNESERSKSAgICAgICAgICAgICAgIC8qIHByb2Nlc3NpbmcgYSBkZWx0YS1pbWFnZSA/ICovCisgICAgICBwSW1hZ2UgPSAobW5nX2ltYWdlcClwRGF0YS0+cERlbHRhSW1hZ2U7CisgICAgZWxzZQorI2VuZGlmCisgICAgICBwSW1hZ2UgPSAobW5nX2ltYWdlcClwRGF0YS0+cEN1cnJlbnRvYmo7CisKKyAgICBpZiAoIXBJbWFnZSkgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdCBhbiBhY3RpdmUgb2JqZWN0ID8gKi8KKyAgICAgIHBJbWFnZSA9IChtbmdfaW1hZ2VwKXBEYXRhLT5wT2JqemVybzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRldGVybWluZSBkaXNwbGF5IHJlY3RhbmdsZSAqLworICAgIHBEYXRhLT5pRGVzdGwgICA9IE1BWF9DT09SRCAoKG1uZ19pbnQzMikwLCAgIHBJbWFnZS0+aVBvc3gpOworICAgIHBEYXRhLT5pRGVzdHQgICA9IE1BWF9DT09SRCAoKG1uZ19pbnQzMikwLCAgIHBJbWFnZS0+aVBvc3kpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaXMgaXQgYSB2YWxpZCBidWZmZXIgPyAqLworICAgIGlmICgocEltYWdlLT5wSW1nYnVmLT5pV2lkdGgpICYmIChwSW1hZ2UtPnBJbWdidWYtPmlIZWlnaHQpKQorICAgIHsKKyAgICAgIHBEYXRhLT5pRGVzdHIgPSBNSU5fQ09PUkQgKChtbmdfaW50MzIpcERhdGEtPmlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZS0+aVBvc3ggKyAobW5nX2ludDMyKXBJbWFnZS0+cEltZ2J1Zi0+aVdpZHRoICk7CisgICAgICBwRGF0YS0+aURlc3RiID0gTUlOX0NPT1JEICgobW5nX2ludDMyKXBEYXRhLT5pSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlLT5pUG9zeSArIChtbmdfaW50MzIpcEltYWdlLT5wSW1nYnVmLT5pSGVpZ2h0KTsKKyAgICB9CisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpdCdzIGEgc2luZ2xlIGltYWdlICEgKi8KKyAgICB7CisgICAgICBwRGF0YS0+aURlc3RyID0gTUlOX0NPT1JEICgobW5nX2ludDMyKXBEYXRhLT5pV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX2ludDMyKXBEYXRhLT5pRGF0YXdpZHRoICk7CisgICAgICBwRGF0YS0+aURlc3RiID0gTUlOX0NPT1JEICgobW5nX2ludDMyKXBEYXRhLT5pSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ19pbnQzMilwRGF0YS0+aURhdGFoZWlnaHQpOworICAgIH0KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX0ZSQU0KKyAgICBpZiAocERhdGEtPmJGcmFtZWNsaXBwaW5nKSAgICAgICAgIC8qIGZyYW1lIGNsaXBwaW5nIHNwZWNpZmllZCA/ICovCisgICAgeworICAgICAgcERhdGEtPmlEZXN0bCA9IE1BWF9DT09SRCAocERhdGEtPmlEZXN0bCwgIHBEYXRhLT5pRnJhbWVjbGlwbCk7CisgICAgICBwRGF0YS0+aURlc3R0ID0gTUFYX0NPT1JEIChwRGF0YS0+aURlc3R0LCAgcERhdGEtPmlGcmFtZWNsaXB0KTsKKyAgICAgIHBEYXRhLT5pRGVzdHIgPSBNSU5fQ09PUkQgKHBEYXRhLT5pRGVzdHIsICBwRGF0YS0+aUZyYW1lY2xpcHIpOworICAgICAgcERhdGEtPmlEZXN0YiA9IE1JTl9DT09SRCAocERhdGEtPmlEZXN0YiwgIHBEYXRhLT5pRnJhbWVjbGlwYik7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAocEltYWdlLT5iQ2xpcHBlZCkgICAgICAgICAgICAgIC8qIGlzIHRoZSBpbWFnZSBjbGlwcGVkIGl0c2VsZiA/ICovCisgICAgeworICAgICAgcERhdGEtPmlEZXN0bCA9IE1BWF9DT09SRCAocERhdGEtPmlEZXN0bCwgIHBJbWFnZS0+aUNsaXBsKTsKKyAgICAgIHBEYXRhLT5pRGVzdHQgPSBNQVhfQ09PUkQgKHBEYXRhLT5pRGVzdHQsICBwSW1hZ2UtPmlDbGlwdCk7CisgICAgICBwRGF0YS0+aURlc3RyID0gTUlOX0NPT1JEIChwRGF0YS0+aURlc3RyLCAgcEltYWdlLT5pQ2xpcHIpOworICAgICAgcERhdGEtPmlEZXN0YiA9IE1JTl9DT09SRCAocERhdGEtPmlEZXN0YiwgIHBJbWFnZS0+aUNsaXBiKTsKKyAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZXRlcm1pbmUgc291cmNlIHN0YXJ0aW5nIHBvaW50ICovCisgICAgcERhdGEtPmlTb3VyY2VsID0gTUFYX0NPT1JEICgobW5nX2ludDMyKTAsICAgcERhdGEtPmlEZXN0bCAtIHBJbWFnZS0+aVBvc3gpOworICAgIHBEYXRhLT5pU291cmNldCA9IE1BWF9DT09SRCAoKG1uZ19pbnQzMikwLCAgIHBEYXRhLT5pRGVzdHQgLSBwSW1hZ2UtPmlQb3N5KTsKKworICAgIGlmICgocEltYWdlLT5wSW1nYnVmLT5pV2lkdGgpICYmIChwSW1hZ2UtPnBJbWdidWYtPmlIZWlnaHQpKQorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIG1heGltdW0gc2l6ZSAgKi8KKyAgICAgIHBEYXRhLT5pU291cmNlciA9IE1JTl9DT09SRCAoKG1uZ19pbnQzMilwSW1hZ2UtPnBJbWdidWYtPmlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlTb3VyY2VsICsgcERhdGEtPmlEZXN0ciAtIHBEYXRhLT5pRGVzdGwpOworICAgICAgcERhdGEtPmlTb3VyY2ViID0gTUlOX0NPT1JEICgobW5nX2ludDMyKXBJbWFnZS0+cEltZ2J1Zi0+aUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlTb3VyY2V0ICsgcERhdGEtPmlEZXN0YiAtIHBEYXRhLT5pRGVzdHQpOworICAgIH0KKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGl0J3MgYSBzaW5nbGUgaW1hZ2UgISAqLworICAgIHsKKyAgICAgIHBEYXRhLT5pU291cmNlciA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pRGVzdHIgLSBwRGF0YS0+aURlc3RsOworICAgICAgcERhdGEtPmlTb3VyY2ViID0gcERhdGEtPmlTb3VyY2V0ICsgcERhdGEtPmlEZXN0YiAtIHBEYXRhLT5pRGVzdHQ7CisgICAgfQorCisgICAgcERhdGEtPmlMYXllcnNlcSsrOyAgICAgICAgICAgICAgICAvKiBjb3VudCB0aGUgbGF5ZXIgISAqLworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fTkVYVF9MQVlFUiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19kaXNwbGF5X2ltYWdlIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbWFnZXAgcEltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgYkxheWVyYWR2YW5jZWQpCit7CisgIG1uZ19yZXRjb2RlIGlSZXRjb2RlOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RJU1BMQVlfSU1BR0UsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFjdGl2ZWx5IHJ1bm5pbmcgPyAqLworI2lmbmRlZiBNTkdfU0tJUENIVU5LX01BR04KKyAgaWYgKCgocERhdGEtPmJSdW5uaW5nKSB8fCAocERhdGEtPmJTZWFyY2hpbmcpKSAmJiAoIXBEYXRhLT5iU2tpcHBpbmcpKQorICB7CisgICAgaWYgKCAoIXBEYXRhLT5pQnJlYWtwb2ludCkgJiYgICAgICAvKiBuZWVkcyBtYWduaWZpY2F0aW9uID8gKi8KKyAgICAgICAgICggKHBJbWFnZS0+aU1BR05fTWV0aG9kWCkgfHwgKHBJbWFnZS0+aU1BR05fTWV0aG9kWSkgKSApCisgICAgeworICAgICAgaVJldGNvZGUgPSBtbmdfbWFnbmlmeV9pbWFnZW9iamVjdCAocERhdGEsIHBJbWFnZSk7CisKKyAgICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICB9CisgIH0KKyNlbmRpZgorCisgIHBEYXRhLT5wUmV0cmlldmVvYmogPSBwSW1hZ2U7ICAgICAgICAvKiBzbyByZXRyaWV2ZS1yb3cgYW5kIGNvbG9yLWNvcnJlY3Rpb24gY2FuIGZpbmQgaXQgKi8KKworICBpZiAoIWJMYXllcmFkdmFuY2VkKSAgICAgICAgICAgICAgICAgLyogbmVlZCB0byBhZHZhbmNlIHRoZSBsYXllciA/ICovCisgIHsKKyAgICBtbmdfaW1hZ2VwIHBTYXZlICAgID0gcERhdGEtPnBDdXJyZW50b2JqOworICAgIHBEYXRhLT5wQ3VycmVudG9iaiAgPSBwSW1hZ2U7CisgICAgbmV4dF9sYXllciAocERhdGEpOyAgICAgICAgICAgICAgICAvKiBhZHZhbmNlIHRvIG5leHQgbGF5ZXIgKi8KKyAgICBwRGF0YS0+cEN1cnJlbnRvYmogID0gcFNhdmU7CisgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5lZWQgdG8gcmVzdG9yZSB0aGUgYmFja2dyb3VuZCA/ICovCisgIGlmICgoIXBEYXRhLT5iVGltZXJzZXQpICYmIChwRGF0YS0+YlJlc3RvcmVia2dkKSkKKyAgeworICAgIG1uZ19pbWFnZXAgcFNhdmUgICAgPSBwRGF0YS0+cEN1cnJlbnRvYmo7CisgICAgcERhdGEtPnBDdXJyZW50b2JqICA9IHBJbWFnZTsKKyAgICBwRGF0YS0+YlJlc3RvcmVia2dkID0gTU5HX0ZBTFNFOworICAgIGlSZXRjb2RlICAgICAgICAgICAgPSBsb2FkX2JrZ2RsYXllciAocERhdGEpOworICAgIHBEYXRhLT5wQ3VycmVudG9iaiAgPSBwU2F2ZTsKKworICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKworICAgIHBEYXRhLT5pTGF5ZXJzZXErKzsgICAgICAgICAgICAgICAgLyogYW5kIGl0IGNvdW50cyBhcyBhIGxheWVyIHRoZW4gISAqLworICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhY3RpdmVseSBydW5uaW5nID8gKi8KKyAgaWYgKCgocERhdGEtPmJSdW5uaW5nKSB8fCAocERhdGEtPmJTZWFyY2hpbmcpKSAmJiAoIXBEYXRhLT5iU2tpcHBpbmcpKQorICB7CisgICAgaWYgKCFwRGF0YS0+YlRpbWVyc2V0KSAgICAgICAgICAgICAvKiBhbGwgc3lzdGVtcyBzdGlsbCBnbyA/ICovCisgICAgeworICAgICAgcERhdGEtPmlCcmVha3BvaW50ID0gMDsgICAgICAgICAgLyogbGV0J3MgbWFrZSBhYnNvbHV0ZWx5IHN1cmUuLi4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFueXRoaW5nIHRvIGRpc3BsYXkgPyAqLworICAgICAgaWYgKChwRGF0YS0+aURlc3RyID49IHBEYXRhLT5pRGVzdGwpICYmIChwRGF0YS0+aURlc3RiID49IHBEYXRhLT5pRGVzdHQpKQorICAgICAgeworICAgICAgICBtbmdfaW50MzIgaVk7CisKKyAgICAgICAgc2V0X2Rpc3BsYXlfcm91dGluZSAocERhdGEpOyAgIC8qIGRldGVybWluZSBkaXNwbGF5IHJvdXRpbmUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCBpbWFnZS1idWZmZXIgcmV0cmlldmFsIHJvdXRpbmUgKi8KKyAgICAgICAgc3dpdGNoIChwSW1hZ2UtPnBJbWdidWYtPmlDb2xvcnR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICBjYXNlICAwIDogeworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICAgIGlmIChwSW1hZ2UtPnBJbWdidWYtPmlCaXRkZXB0aCA+IDgpCisgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZlJldHJpZXZlcm93ID0gKG1uZ19mcHRyKW1uZ19yZXRyaWV2ZV9nMTY7CisgICAgICAgICAgICAgICAgICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZlJldHJpZXZlcm93ID0gKG1uZ19mcHRyKW1uZ19yZXRyaWV2ZV9nODsKKworICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5iSXNPcGFxdWUgICAgICA9IChtbmdfYm9vbCkoIXBJbWFnZS0+cEltZ2J1Zi0+Ykhhc1RSTlMpOworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICBjYXNlICAyIDogeworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICAgIGlmIChwSW1hZ2UtPnBJbWdidWYtPmlCaXRkZXB0aCA+IDgpCisgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZlJldHJpZXZlcm93ID0gKG1uZ19mcHRyKW1uZ19yZXRyaWV2ZV9yZ2IxNjsKKyAgICAgICAgICAgICAgICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mUmV0cmlldmVyb3cgPSAobW5nX2ZwdHIpbW5nX3JldHJpZXZlX3JnYjg7CisKKyAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+YklzT3BhcXVlICAgICAgPSAobW5nX2Jvb2wpKCFwSW1hZ2UtPnBJbWdidWYtPmJIYXNUUk5TKTsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICBjYXNlICAzIDogeyBwRGF0YS0+ZlJldHJpZXZlcm93ICAgPSAobW5nX2ZwdHIpbW5nX3JldHJpZXZlX2lkeDg7CisgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmJJc09wYXF1ZSAgICAgID0gKG1uZ19ib29sKSghcEltYWdlLT5wSW1nYnVmLT5iSGFzVFJOUyk7CisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgY2FzZSAgNCA6IHsKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgICBpZiAocEltYWdlLT5wSW1nYnVmLT5pQml0ZGVwdGggPiA4KQorICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZSZXRyaWV2ZXJvdyA9IChtbmdfZnB0ciltbmdfcmV0cmlldmVfZ2ExNjsKKyAgICAgICAgICAgICAgICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mUmV0cmlldmVyb3cgPSAobW5nX2ZwdHIpbW5nX3JldHJpZXZlX2dhODsKKworICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5iSXNPcGFxdWUgICAgICA9IE1OR19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICBjYXNlICA2IDogeworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICAgIGlmIChwSW1hZ2UtPnBJbWdidWYtPmlCaXRkZXB0aCA+IDgpCisgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZlJldHJpZXZlcm93ID0gKG1uZ19mcHRyKW1uZ19yZXRyaWV2ZV9yZ2JhMTY7CisgICAgICAgICAgICAgICAgICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZlJldHJpZXZlcm93ID0gKG1uZ19mcHRyKW1uZ19yZXRyaWV2ZV9yZ2JhODsKKworICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5iSXNPcGFxdWUgICAgICA9IE1OR19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgY2FzZSAgOCA6IHsKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgICBpZiAocEltYWdlLT5wSW1nYnVmLT5pQml0ZGVwdGggPiA4KQorICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZSZXRyaWV2ZXJvdyA9IChtbmdfZnB0ciltbmdfcmV0cmlldmVfZzE2OworICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZSZXRyaWV2ZXJvdyA9IChtbmdfZnB0ciltbmdfcmV0cmlldmVfZzg7CisKKyAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+YklzT3BhcXVlICAgICAgPSBNTkdfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgY2FzZSAxMCA6IHsKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgICBpZiAocEltYWdlLT5wSW1nYnVmLT5pQml0ZGVwdGggPiA4KQorICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZSZXRyaWV2ZXJvdyA9IChtbmdfZnB0ciltbmdfcmV0cmlldmVfcmdiMTY7CisgICAgICAgICAgICAgICAgICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZlJldHJpZXZlcm93ID0gKG1uZ19mcHRyKW1uZ19yZXRyaWV2ZV9yZ2I4OworCisgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmJJc09wYXF1ZSAgICAgID0gTU5HX1RSVUU7CisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgY2FzZSAxMiA6IHsKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgICBpZiAocEltYWdlLT5wSW1nYnVmLT5pQml0ZGVwdGggPiA4KQorICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZSZXRyaWV2ZXJvdyA9IChtbmdfZnB0ciltbmdfcmV0cmlldmVfZ2ExNjsKKyAgICAgICAgICAgICAgICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mUmV0cmlldmVyb3cgPSAobW5nX2ZwdHIpbW5nX3JldHJpZXZlX2dhODsKKworICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5iSXNPcGFxdWUgICAgICA9IE1OR19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICBjYXNlIDE0IDogeworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICAgIGlmIChwSW1hZ2UtPnBJbWdidWYtPmlCaXRkZXB0aCA+IDgpCisgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZlJldHJpZXZlcm93ID0gKG1uZ19mcHRyKW1uZ19yZXRyaWV2ZV9yZ2JhMTY7CisgICAgICAgICAgICAgICAgICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZlJldHJpZXZlcm93ID0gKG1uZ19mcHRyKW1uZ19yZXRyaWV2ZV9yZ2JhODsKKworICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5iSXNPcGFxdWUgICAgICA9IE1OR19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICBwRGF0YS0+aVBhc3MgICAgICAgPSAtMTsgICAgICAgLyogdGhlc2UgYXJlIHRoZSBvYmplY3QncyBkaW1lbnNpb25zIG5vdyAqLworICAgICAgICBwRGF0YS0+aVJvdyAgICAgICAgPSBwRGF0YS0+aVNvdXJjZXQ7CisgICAgICAgIHBEYXRhLT5pUm93aW5jICAgICA9IDE7CisgICAgICAgIHBEYXRhLT5pQ29sICAgICAgICA9IDA7CisgICAgICAgIHBEYXRhLT5pQ29saW5jICAgICA9IDE7CisgICAgICAgIHBEYXRhLT5pUm93c2FtcGxlcyA9IHBJbWFnZS0+cEltZ2J1Zi0+aVdpZHRoOworICAgICAgICBwRGF0YS0+aVJvd3NpemUgICAgPSBwRGF0YS0+aVJvd3NhbXBsZXMgPDwgMjsKKyAgICAgICAgcERhdGEtPmJJc1JHQkExNiAgID0gTU5HX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRqdXN0IGZvciAxNi1iaXQgb2JqZWN0ID8gKi8KKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyAgICAgICAgaWYgKHBJbWFnZS0+cEltZ2J1Zi0+aUJpdGRlcHRoID4gOCkKKyAgICAgICAgeworICAgICAgICAgIHBEYXRhLT5iSXNSR0JBMTYgPSBNTkdfVFJVRTsKKyAgICAgICAgICBwRGF0YS0+aVJvd3NpemUgID0gcERhdGEtPmlSb3dzYW1wbGVzIDw8IDM7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIHBEYXRhLT5mQ29ycmVjdHJvdyA9IE1OR19OVUxMOyAvKiBkZWZhdWx0IG5vIGNvbG9yLWNvcnJlY3Rpb24gKi8KKworI2lmZGVmIE1OR19OT19DTVMKKyAgICAgICAgaVJldGNvZGUgPSBNTkdfTk9FUlJPUjsKKyNlbHNlCisjaWYgZGVmaW5lZChNTkdfRlVMTF9DTVMpICAgICAgICAgICAgICAvKiBkZXRlcm1pbmUgY29sb3ItbWFuYWdlbWVudCByb3V0aW5lICovCisgICAgICAgIGlSZXRjb2RlID0gbW5nX2luaXRfZnVsbF9jbXMgICAocERhdGEsIE1OR19GQUxTRSwgTU5HX0ZBTFNFLCBNTkdfVFJVRSk7CisjZWxpZiBkZWZpbmVkKE1OR19HQU1NQV9PTkxZKQorICAgICAgICBpUmV0Y29kZSA9IG1uZ19pbml0X2dhbW1hX29ubHkgKHBEYXRhLCBNTkdfRkFMU0UsIE1OR19GQUxTRSwgTU5HX1RSVUUpOworI2VsaWYgZGVmaW5lZChNTkdfQVBQX0NNUykKKyAgICAgICAgaVJldGNvZGUgPSBtbmdfaW5pdF9hcHBfY21zICAgIChwRGF0YSwgTU5HX0ZBTFNFLCBNTkdfRkFMU0UsIE1OR19UUlVFKTsKKyNlbmRpZgorICAgICAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgICAgICByZXR1cm4gaVJldGNvZGU7CisjZW5kaWYgLyogTU5HX05PX0NNUyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0IGEgdGVtcG9yYXJ5IHJvdy1idWZmZXIgKi8KKyAgICAgICAgTU5HX0FMTE9DIChwRGF0YSwgcERhdGEtPnBSR0JBcm93LCBwRGF0YS0+aVJvd3NpemUpOworCisgICAgICAgIGlZID0gcERhdGEtPmlTb3VyY2V0OyAgICAgICAgICAvKiB0aGlzIGlzIHdoZXJlIHdlIHN0YXJ0ICovCisKKyAgICAgICAgd2hpbGUgKCghaVJldGNvZGUpICYmIChpWSA8IHBEYXRhLT5pU291cmNlYikpCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgYSByb3cgKi8KKyAgICAgICAgICBpUmV0Y29kZSA9ICgobW5nX3JldHJpZXZlcm93KXBEYXRhLT5mUmV0cmlldmVyb3cpIChwRGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb2xvciBjb3JyZWN0aW9uID8gKi8KKyAgICAgICAgICBpZiAoKCFpUmV0Y29kZSkgJiYgKHBEYXRhLT5mQ29ycmVjdHJvdykpCisgICAgICAgICAgICBpUmV0Y29kZSA9ICgobW5nX2NvcnJlY3Ryb3cpcERhdGEtPmZDb3JyZWN0cm93KSAocERhdGEpOworCisgICAgICAgICAgaWYgKCFpUmV0Y29kZSkgICAgICAgICAgICAgICAvKiBzby4uLiBkaXNwbGF5IGl0ICovCisgICAgICAgICAgICBpUmV0Y29kZSA9ICgobW5nX2Rpc3BsYXlyb3cpcERhdGEtPmZEaXNwbGF5cm93KSAocERhdGEpOworCisgICAgICAgICAgaWYgKCFpUmV0Y29kZSkgICAgICAgICAgICAgICAvKiBhZGp1c3QgdmFyaWFibGVzIGZvciBuZXh0IHJvdyAqLworICAgICAgICAgICAgaVJldGNvZGUgPSBtbmdfbmV4dF9yb3cgKHBEYXRhKTsKKworICAgICAgICAgIGlZKys7ICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIG5leHQgbGluZSAqLworICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkcm9wIHRoZSB0ZW1wb3Jhcnkgcm93LWJ1ZmZlciAqLworICAgICAgICBNTkdfRlJFRSAocERhdGEsIHBEYXRhLT5wUkdCQXJvdywgcERhdGEtPmlSb3dzaXplKTsKKworICAgICAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgICAgICByZXR1cm4gaVJldGNvZGU7CisKKyNpZiBkZWZpbmVkKE1OR19GVUxMX0NNUykgICAgICAgICAgICAgIC8qIGNsZWFudXAgY21zIHN0dWZmICovCisgICAgICAgIGlSZXRjb2RlID0gbW5nX2NsZWFyX2NtcyAocERhdGEpOworCisgICAgICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgICAgIHJldHVybiBpUmV0Y29kZTsKKyNlbmRpZgorICAgICAgfQorICAgIH0KKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RJU1BMQVlfSU1BR0UsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOyAgICAgICAgICAgICAgICAgIC8qIHdoZWhlaGUsIHRoaXMgaXMgZ29vZCAhICovCit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworbW5nX3JldGNvZGUgbW5nX2V4ZWN1dGVfZGVsdGFfaW1hZ2UgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ltYWdlcCBwVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbWFnZXAgcERlbHRhKQoreworICBtbmdfaW1hZ2VkYXRhcCBwQnVmdGFyZ2V0ID0gcFRhcmdldC0+cEltZ2J1ZjsKKyAgbW5nX2ltYWdlZGF0YXAgcEJ1ZmRlbHRhICA9IHBEZWx0YS0+cEltZ2J1ZjsKKyAgbW5nX3VpbnQzMiAgICAgaVk7CisgIG1uZ19yZXRjb2RlICAgIGlSZXRjb2RlOworICBtbmdfcHRyICAgICAgICBwU2F2ZVJHQkE7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRVhFQ1VURV9ERUxUQV9JTUFHRSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWN0aXZlbHkgcnVubmluZyA/ICovCisgIGlmICgoKHBEYXRhLT5iUnVubmluZykgfHwgKHBEYXRhLT5iU2VhcmNoaW5nKSkgJiYgKCFwRGF0YS0+YlNraXBwaW5nKSkKKyAgeworICAgIGlmIChwQnVmZGVsdGEtPmJIYXNQTFRFKSAgICAgICAgICAgLyogcGFsZXR0ZSBpbiBkZWx0YSA/ICovCisgICAgeworICAgICAgbW5nX3VpbnQzMiBpWDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5ldyBwYWxldHRlIGxhcmdlciB0aGFuIG9sZCBvbmUgPyAqLworICAgICAgaWYgKCghcEJ1ZnRhcmdldC0+Ykhhc1BMVEUpIHx8IChwQnVmdGFyZ2V0LT5pUExURWNvdW50IDwgcEJ1ZmRlbHRhLT5pUExURWNvdW50KSkKKyAgICAgICAgcEJ1ZnRhcmdldC0+aVBMVEVjb3VudCA9IHBCdWZkZWx0YS0+aVBMVEVjb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGl0J3MgZGVmaW5pdGVseSBnb3QgYSBQTFRFIG5vdyAqLworICAgICAgcEJ1ZnRhcmdldC0+Ykhhc1BMVEUgPSBNTkdfVFJVRTsKKworICAgICAgZm9yIChpWCA9IDA7IGlYIDwgcEJ1ZmRlbHRhLT5pUExURWNvdW50OyBpWCsrKQorICAgICAgeworICAgICAgICBwQnVmdGFyZ2V0LT5hUExURWVudHJpZXNbaVhdLmlSZWQgICA9IHBCdWZkZWx0YS0+YVBMVEVlbnRyaWVzW2lYXS5pUmVkOworICAgICAgICBwQnVmdGFyZ2V0LT5hUExURWVudHJpZXNbaVhdLmlHcmVlbiA9IHBCdWZkZWx0YS0+YVBMVEVlbnRyaWVzW2lYXS5pR3JlZW47CisgICAgICAgIHBCdWZ0YXJnZXQtPmFQTFRFZW50cmllc1tpWF0uaUJsdWUgID0gcEJ1ZmRlbHRhLT5hUExURWVudHJpZXNbaVhdLmlCbHVlOworICAgICAgfQorICAgIH0KKworICAgIGlmIChwQnVmZGVsdGEtPmJIYXNUUk5TKSAgICAgICAgICAgLyogY2hlYXAgdHJhbnNwYXJlbmN5IGluIGRlbHRhID8gKi8KKyAgICB7CisgICAgICBzd2l0Y2ggKHBEYXRhLT5pQ29sb3J0eXBlKSAgICAgICAvKiBkcm9wIGl0IGludG8gdGhlIHRhcmdldCAqLworICAgICAgeworICAgICAgICBjYXNlIDA6IHsgICAgICAgICAgICAgICAgICAgICAgLyogZ3JheSAqLworICAgICAgICAgICAgICAgICAgcEJ1ZnRhcmdldC0+aVRSTlNncmF5ICA9IHBCdWZkZWx0YS0+aVRSTlNncmF5OworICAgICAgICAgICAgICAgICAgcEJ1ZnRhcmdldC0+aVRSTlNyZWQgICA9IDA7CisgICAgICAgICAgICAgICAgICBwQnVmdGFyZ2V0LT5pVFJOU2dyZWVuID0gMDsKKyAgICAgICAgICAgICAgICAgIHBCdWZ0YXJnZXQtPmlUUk5TYmx1ZSAgPSAwOworICAgICAgICAgICAgICAgICAgcEJ1ZnRhcmdldC0+aVRSTlNjb3VudCA9IDA7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIGNhc2UgMjogeyAgICAgICAgICAgICAgICAgICAgICAvKiByZ2IgKi8KKyAgICAgICAgICAgICAgICAgIHBCdWZ0YXJnZXQtPmlUUk5TZ3JheSAgPSAwOworICAgICAgICAgICAgICAgICAgcEJ1ZnRhcmdldC0+aVRSTlNyZWQgICA9IHBCdWZkZWx0YS0+aVRSTlNyZWQ7CisgICAgICAgICAgICAgICAgICBwQnVmdGFyZ2V0LT5pVFJOU2dyZWVuID0gcEJ1ZmRlbHRhLT5pVFJOU2dyZWVuOworICAgICAgICAgICAgICAgICAgcEJ1ZnRhcmdldC0+aVRSTlNibHVlICA9IHBCdWZkZWx0YS0+aVRSTlNibHVlOworICAgICAgICAgICAgICAgICAgcEJ1ZnRhcmdldC0+aVRSTlNjb3VudCA9IDA7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIGNhc2UgMzogeyAgICAgICAgICAgICAgICAgICAgICAvKiBpbmRleGVkICovCisgICAgICAgICAgICAgICAgICBwQnVmdGFyZ2V0LT5pVFJOU2dyYXkgID0gMDsKKyAgICAgICAgICAgICAgICAgIHBCdWZ0YXJnZXQtPmlUUk5TcmVkICAgPSAwOworICAgICAgICAgICAgICAgICAgcEJ1ZnRhcmdldC0+aVRSTlNncmVlbiA9IDA7CisgICAgICAgICAgICAgICAgICBwQnVmdGFyZ2V0LT5pVFJOU2JsdWUgID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGV4aXN0aW5nIHJhbmdlIHNtYWxsZXIgdGhhbiBuZXcgb25lID8gKi8KKyAgICAgICAgICAgICAgICAgIGlmICgoIXBCdWZ0YXJnZXQtPmJIYXNUUk5TKSB8fCAocEJ1ZnRhcmdldC0+aVRSTlNjb3VudCA8IHBCdWZkZWx0YS0+aVRSTlNjb3VudCkpCisgICAgICAgICAgICAgICAgICAgIHBCdWZ0YXJnZXQtPmlUUk5TY291bnQgPSBwQnVmZGVsdGEtPmlUUk5TY291bnQ7CisKKyAgICAgICAgICAgICAgICAgIE1OR19DT1BZIChwQnVmdGFyZ2V0LT5hVFJOU2VudHJpZXMsIHBCdWZkZWx0YS0+YVRSTlNlbnRyaWVzLCBwQnVmZGVsdGEtPmlUUk5TY291bnQpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgfQorCisgICAgICBwQnVmdGFyZ2V0LT5iSGFzVFJOUyA9IE1OR19UUlVFOyAvKiB0ZWxsIGl0IGl0J3MgZ290IGEgdFJOUyBub3cgKi8KKyAgICB9CisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19iS0dECisgICAgaWYgKHBCdWZkZWx0YS0+Ykhhc0JLR0QpICAgICAgICAgICAvKiBia2dkIGluIHNvdXJjZSA/ICovCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkcm9wIGl0IG9udG8gdGhlIHRhcmdldCAqLworICAgICAgcEJ1ZnRhcmdldC0+Ykhhc0JLR0QgICA9IE1OR19UUlVFOworICAgICAgcEJ1ZnRhcmdldC0+aUJLR0RpbmRleCA9IHBCdWZkZWx0YS0+aUJLR0RpbmRleDsKKyAgICAgIHBCdWZ0YXJnZXQtPmlCS0dEZ3JheSAgPSBwQnVmZGVsdGEtPmlCS0dEZ3JheTsKKyAgICAgIHBCdWZ0YXJnZXQtPmlCS0dEcmVkICAgPSBwQnVmZGVsdGEtPmlCS0dEcmVkOworICAgICAgcEJ1ZnRhcmdldC0+aUJLR0RncmVlbiA9IHBCdWZkZWx0YS0+aUJLR0RncmVlbjsKKyAgICAgIHBCdWZ0YXJnZXQtPmlCS0dEYmx1ZSAgPSBwQnVmZGVsdGEtPmlCS0dEYmx1ZTsKKyAgICB9CisjZW5kaWYKKworICAgIGlmIChwQnVmZGVsdGEtPmJIYXNHQU1BKSAgICAgICAgICAgLyogZ2FtbWEgaW4gc291cmNlID8gKi8KKyAgICB7CisgICAgICBwQnVmdGFyZ2V0LT5iSGFzR0FNQSA9IE1OR19UUlVFOyAvKiBkcm9wIGl0IG9udG8gdGhlIHRhcmdldCAqLworICAgICAgcEJ1ZnRhcmdldC0+aUdhbW1hICAgPSBwQnVmZGVsdGEtPmlHYW1tYTsKKyAgICB9CisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19jSFJNCisgICAgaWYgKHBCdWZkZWx0YS0+Ykhhc0NIUk0pICAgICAgICAgICAvKiBjaHJvbWEgaW4gZGVsdGEgPyAqLworICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZHJvcCBpdCBvbnRvIHRoZSB0YXJnZXQgKi8KKyAgICAgIHBCdWZ0YXJnZXQtPmJIYXNDSFJNICAgICAgID0gTU5HX1RSVUU7CisgICAgICBwQnVmdGFyZ2V0LT5pV2hpdGVwb2ludHggICA9IHBCdWZkZWx0YS0+aVdoaXRlcG9pbnR4OworICAgICAgcEJ1ZnRhcmdldC0+aVdoaXRlcG9pbnR5ICAgPSBwQnVmZGVsdGEtPmlXaGl0ZXBvaW50eTsKKyAgICAgIHBCdWZ0YXJnZXQtPmlQcmltYXJ5cmVkeCAgID0gcEJ1ZmRlbHRhLT5pUHJpbWFyeXJlZHg7CisgICAgICBwQnVmdGFyZ2V0LT5pUHJpbWFyeXJlZHkgICA9IHBCdWZkZWx0YS0+aVByaW1hcnlyZWR5OworICAgICAgcEJ1ZnRhcmdldC0+aVByaW1hcnlncmVlbnggPSBwQnVmZGVsdGEtPmlQcmltYXJ5Z3JlZW54OworICAgICAgcEJ1ZnRhcmdldC0+aVByaW1hcnlncmVlbnkgPSBwQnVmZGVsdGEtPmlQcmltYXJ5Z3JlZW55OworICAgICAgcEJ1ZnRhcmdldC0+aVByaW1hcnlibHVleCAgPSBwQnVmZGVsdGEtPmlQcmltYXJ5Ymx1ZXg7CisgICAgICBwQnVmdGFyZ2V0LT5pUHJpbWFyeWJsdWV5ICA9IHBCdWZkZWx0YS0+aVByaW1hcnlibHVleTsKKyAgICB9CisjZW5kaWYKKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX3NSR0IKKyAgICBpZiAocEJ1ZmRlbHRhLT5iSGFzU1JHQikgICAgICAgICAgIC8qIHNSR0IgaW4gZGVsdGEgPyAqLworICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZHJvcCBpdCBvbnRvIHRoZSB0YXJnZXQgKi8KKyAgICAgIHBCdWZ0YXJnZXQtPmJIYXNTUkdCICAgICAgICAgPSBNTkdfVFJVRTsKKyAgICAgIHBCdWZ0YXJnZXQtPmlSZW5kZXJpbmdpbnRlbnQgPSBwQnVmZGVsdGEtPmlSZW5kZXJpbmdpbnRlbnQ7CisgICAgfQorI2VuZGlmCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19pQ0NQCisgICAgaWYgKHBCdWZkZWx0YS0+Ykhhc0lDQ1ApICAgICAgICAgICAvKiBJQ0MgcHJvZmlsZSBpbiBkZWx0YSA/ICovCisgICAgeworICAgICAgcEJ1ZnRhcmdldC0+Ykhhc0lDQ1AgPSBNTkdfVFJVRTsgLyogZHJvcCBpdCBvbnRvIHRoZSB0YXJnZXQgKi8KKworICAgICAgaWYgKHBCdWZ0YXJnZXQtPnBQcm9maWxlKSAgICAgICAgLyogcHJvZmlsZSBleGlzdGVkID8gKi8KKyAgICAgICAgTU5HX0ZSRUVYIChwRGF0YSwgcEJ1ZnRhcmdldC0+cFByb2ZpbGUsIHBCdWZ0YXJnZXQtPmlQcm9maWxlc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbGxvY2F0ZSBhIGJ1ZmZlciAmIGNvcHkgaXQgKi8KKyAgICAgIE1OR19BTExPQyAocERhdGEsIHBCdWZ0YXJnZXQtPnBQcm9maWxlLCBwQnVmZGVsdGEtPmlQcm9maWxlc2l6ZSk7CisgICAgICBNTkdfQ09QWSAgKHBCdWZ0YXJnZXQtPnBQcm9maWxlLCBwQnVmZGVsdGEtPnBQcm9maWxlLCBwQnVmZGVsdGEtPmlQcm9maWxlc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZSBpdHMgbGVuZ3RoIGFzIHdlbGwgKi8KKyAgICAgIHBCdWZ0YXJnZXQtPmlQcm9maWxlc2l6ZSA9IHBCdWZkZWx0YS0+aVByb2ZpbGVzaXplOworICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmVlZCB0byBleGVjdXRlIGRlbHRhIHBpeGVscyA/ICovCisgICAgaWYgKCghcERhdGEtPmJEZWx0YWltbWVkaWF0ZSkgJiYgKHBEYXRhLT5pRGVsdGF0eXBlICE9IE1OR19ERUxUQVRZUEVfTk9DSEFOR0UpKQorICAgIHsKKyAgICAgIHBEYXRhLT5mU2NhbGVyb3cgPSBNTkdfTlVMTDsgICAgIC8qIG5vdCBuZWVkZWQgYnkgZGVmYXVsdCAqLworCisgICAgICBzd2l0Y2ggKHBCdWZkZWx0YS0+aUJpdGRlcHRoKSAgICAvKiBkZXRlcm1pbmUgc2NhbGluZyByb3V0aW5lICovCisgICAgICB7CisjaWZuZGVmIE1OR19OT18xXzJfNEJJVF9TVVBQT1JUCisgICAgICAgIGNhc2UgIDEgOiB7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocEJ1ZnRhcmdldC0+aUJpdGRlcHRoKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgY2FzZSAgMiA6IHsgcERhdGEtPmZTY2FsZXJvdyA9IChtbmdfZnB0ciltbmdfc2NhbGVfZzFfZzI7ICBicmVhazsgfQorICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIDQgOiB7IHBEYXRhLT5mU2NhbGVyb3cgPSAobW5nX2ZwdHIpbW5nX3NjYWxlX2cxX2c0OyAgYnJlYWs7IH0KKworICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIDggOiB7IHBEYXRhLT5mU2NhbGVyb3cgPSAobW5nX2ZwdHIpbW5nX3NjYWxlX2cxX2c4OyAgYnJlYWs7IH0KKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2IDogeyBwRGF0YS0+ZlNjYWxlcm93ID0gKG1uZ19mcHRyKW1uZ19zY2FsZV9nMV9nMTY7IGJyZWFrOyB9CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlICAyIDogeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBCdWZ0YXJnZXQtPmlCaXRkZXB0aCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIDEgOiB7IHBEYXRhLT5mU2NhbGVyb3cgPSAobW5nX2ZwdHIpbW5nX3NjYWxlX2cyX2cxOyAgYnJlYWs7IH0KKyAgICAgICAgICAgICAgICAgICAgICBjYXNlICA0IDogeyBwRGF0YS0+ZlNjYWxlcm93ID0gKG1uZ19mcHRyKW1uZ19zY2FsZV9nMl9nNDsgIGJyZWFrOyB9CisgICAgICAgICAgICAgICAgICAgICAgY2FzZSAgOCA6IHsgcERhdGEtPmZTY2FsZXJvdyA9IChtbmdfZnB0ciltbmdfc2NhbGVfZzJfZzg7ICBicmVhazsgfQorI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTYgOiB7IHBEYXRhLT5mU2NhbGVyb3cgPSAobW5nX2ZwdHIpbW5nX3NjYWxlX2cyX2cxNjsgYnJlYWs7IH0KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgIDQgOiB7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocEJ1ZnRhcmdldC0+aUJpdGRlcHRoKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgY2FzZSAgMSA6IHsgcERhdGEtPmZTY2FsZXJvdyA9IChtbmdfZnB0ciltbmdfc2NhbGVfZzRfZzE7ICBicmVhazsgfQorICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIDIgOiB7IHBEYXRhLT5mU2NhbGVyb3cgPSAobW5nX2ZwdHIpbW5nX3NjYWxlX2c0X2cyOyAgYnJlYWs7IH0KKyAgICAgICAgICAgICAgICAgICAgICBjYXNlICA4IDogeyBwRGF0YS0+ZlNjYWxlcm93ID0gKG1uZ19mcHRyKW1uZ19zY2FsZV9nNF9nODsgIGJyZWFrOyB9CisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNiA6IHsgcERhdGEtPmZTY2FsZXJvdyA9IChtbmdfZnB0ciltbmdfc2NhbGVfZzRfZzE2OyBicmVhazsgfQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogTU5HX05PXzFfMl80QklUX1NVUFBPUlQgKi8KKworICAgICAgICBjYXNlICA4IDogeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBCdWZkZWx0YS0+aUNvbG9ydHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIDAgOiA7CisgICAgICAgICAgICAgICAgICAgICAgY2FzZSAgMyA6IDsKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlICA4IDogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocEJ1ZnRhcmdldC0+aUJpdGRlcHRoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyNpZm5kZWYgTU5HX05PXzFfMl80QklUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIDEgOiB7IHBEYXRhLT5mU2NhbGVyb3cgPSAobW5nX2ZwdHIpbW5nX3NjYWxlX2c4X2cxOyAgYnJlYWs7IH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIDIgOiB7IHBEYXRhLT5mU2NhbGVyb3cgPSAobW5nX2ZwdHIpbW5nX3NjYWxlX2c4X2cyOyAgYnJlYWs7IH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIDQgOiB7IHBEYXRhLT5mU2NhbGVyb3cgPSAobW5nX2ZwdHIpbW5nX3NjYWxlX2c4X2c0OyAgYnJlYWs7IH0KKyNlbmRpZiAvKiBNTkdfTk9fMV8yXzRCSVRfU1VQUE9SVCAqLworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNiA6IHsgcERhdGEtPmZTY2FsZXJvdyA9IChtbmdfZnB0ciltbmdfc2NhbGVfZzhfZzE2OyBicmVhazsgfQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgY2FzZSAgMiA6IDsKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwIDogeworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwQnVmdGFyZ2V0LT5pQml0ZGVwdGggPT0gMTYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZlNjYWxlcm93ID0gKG1uZ19mcHRyKW1uZ19zY2FsZV9yZ2I4X3JnYjE2OworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICBjYXNlICA0IDogOworICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTIgOiB7CisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBCdWZ0YXJnZXQtPmlCaXRkZXB0aCA9PSAxNikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mU2NhbGVyb3cgPSAobW5nX2ZwdHIpbW5nX3NjYWxlX2dhOF9nYTE2OworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICBjYXNlICA2IDogOworICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQgOiB7CisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBCdWZ0YXJnZXQtPmlCaXRkZXB0aCA9PSAxNikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mU2NhbGVyb3cgPSAobW5nX2ZwdHIpbW5nX3NjYWxlX3JnYmE4X3JnYmExNjsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICB9CisKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyAgICAgICAgY2FzZSAxNiA6IHsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwQnVmZGVsdGEtPmlDb2xvcnR5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlICAwIDogOworICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIDMgOiA7CisgICAgICAgICAgICAgICAgICAgICAgY2FzZSAgOCA6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBCdWZ0YXJnZXQtPmlCaXRkZXB0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisjaWZuZGVmIE1OR19OT18xXzJfNEJJVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOiB7IHBEYXRhLT5mU2NhbGVyb3cgPSAobW5nX2ZwdHIpbW5nX3NjYWxlX2cxNl9nMTsgYnJlYWs7IH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMiA6IHsgcERhdGEtPmZTY2FsZXJvdyA9IChtbmdfZnB0ciltbmdfc2NhbGVfZzE2X2cyOyBicmVhazsgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0IDogeyBwRGF0YS0+ZlNjYWxlcm93ID0gKG1uZ19mcHRyKW1uZ19zY2FsZV9nMTZfZzQ7IGJyZWFrOyB9CisjZW5kaWYgLyogTU5HX05PXzFfMl80QklUX1NVUFBPUlQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOCA6IHsgcERhdGEtPmZTY2FsZXJvdyA9IChtbmdfZnB0ciltbmdfc2NhbGVfZzE2X2c4OyBicmVhazsgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIDIgOiA7CisgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMCA6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocEJ1ZnRhcmdldC0+aUJpdGRlcHRoID09IDgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZlNjYWxlcm93ID0gKG1uZ19mcHRyKW1uZ19zY2FsZV9yZ2IxNl9yZ2I4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgY2FzZSAgNCA6IDsKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyIDogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwQnVmdGFyZ2V0LT5pQml0ZGVwdGggPT0gOCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mU2NhbGVyb3cgPSAobW5nX2ZwdHIpbW5nX3NjYWxlX2dhMTZfZ2E4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgY2FzZSAgNiA6IDsKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE0IDogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwQnVmdGFyZ2V0LT5pQml0ZGVwdGggPT0gOCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mU2NhbGVyb3cgPSAobW5nX2ZwdHIpbW5nX3NjYWxlX3JnYmExNl9yZ2JhODsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgIH0KKworICAgICAgcERhdGEtPmZEZWx0YXJvdyA9IE1OR19OVUxMOyAgICAgLyogbGV0J3MgYXNzdW1lIHRoZXJlJ3Mgbm90aGluZyB0byBkbyAqLworCisgICAgICBzd2l0Y2ggKHBCdWZ0YXJnZXQtPmlDb2xvcnR5cGUpICAvKiBkZXRlcm1pbmUgZGVsdGEgcHJvY2Vzc2luZyByb3V0aW5lICovCisgICAgICB7CisgICAgICAgIGNhc2UgIDAgOiA7CisgICAgICAgIGNhc2UgIDggOiB7ICAgICAgICAgICAgICAgICAgICAgLyogZ3JheSAqLworICAgICAgICAgICAgICAgICAgICBpZiAoKHBEYXRhLT5pRGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfUkVQTEFDRSAgICAgICAgICApIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAocERhdGEtPmlEZWx0YXR5cGUgPT0gTU5HX0RFTFRBVFlQRV9CTE9DS1BJWEVMQUREICAgICkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChwRGF0YS0+aURlbHRhdHlwZSA9PSBNTkdfREVMVEFUWVBFX0JMT0NLUElYRUxSRVBMQUNFKSAgICApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoKHBCdWZkZWx0YS0+aUNvbG9ydHlwZSA9PSAwKSB8fCAocEJ1ZmRlbHRhLT5pQ29sb3J0eXBlID09IDMpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgIChwQnVmZGVsdGEtPmlDb2xvcnR5cGUgPT0gOCkpCisgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwQnVmdGFyZ2V0LT5pQml0ZGVwdGgpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisjaWZuZGVmIE1OR19OT18xXzJfNEJJVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIDEgOiB7IHBEYXRhLT5mRGVsdGFyb3cgPSAobW5nX2ZwdHIpbW5nX2RlbHRhX2cxX2cxOyAgIGJyZWFrOyB9CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIDIgOiB7IHBEYXRhLT5mRGVsdGFyb3cgPSAobW5nX2ZwdHIpbW5nX2RlbHRhX2cyX2cyOyAgIGJyZWFrOyB9CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIDQgOiB7IHBEYXRhLT5mRGVsdGFyb3cgPSAobW5nX2ZwdHIpbW5nX2RlbHRhX2c0X2c0OyAgIGJyZWFrOyB9CisjZW5kaWYgLyogTU5HX05PXzFfMl80QklUX1NVUFBPUlQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAgOCA6IHsgcERhdGEtPmZEZWx0YXJvdyA9IChtbmdfZnB0ciltbmdfZGVsdGFfZzhfZzg7ICAgYnJlYWs7IH0KKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNiA6IHsgcERhdGEtPmZEZWx0YXJvdyA9IChtbmdfZnB0ciltbmdfZGVsdGFfZzE2X2cxNjsgYnJlYWs7IH0KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgIDIgOiA7CisgICAgICAgIGNhc2UgMTAgOiB7ICAgICAgICAgICAgICAgICAgICAgLyogcmdiICovCisgICAgICAgICAgICAgICAgICAgIGlmICgocERhdGEtPmlEZWx0YXR5cGUgPT0gTU5HX0RFTFRBVFlQRV9SRVBMQUNFICAgICAgICAgICkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChwRGF0YS0+aURlbHRhdHlwZSA9PSBNTkdfREVMVEFUWVBFX0JMT0NLUElYRUxBREQgICAgKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKHBEYXRhLT5pRGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfQkxPQ0tQSVhFTFJFUExBQ0UpICAgICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIGlmICgocEJ1ZmRlbHRhLT5pQ29sb3J0eXBlID09IDIpIHx8IChwQnVmZGVsdGEtPmlDb2xvcnR5cGUgPT0gMTApKQorICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocEJ1ZnRhcmdldC0+aUJpdGRlcHRoKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICA4IDogeyBwRGF0YS0+ZkRlbHRhcm93ID0gKG1uZ19mcHRyKW1uZ19kZWx0YV9yZ2I4X3JnYjg7ICAgYnJlYWs7IH0KKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNiA6IHsgcERhdGEtPmZEZWx0YXJvdyA9IChtbmdfZnB0ciltbmdfZGVsdGFfcmdiMTZfcmdiMTY7IGJyZWFrOyB9CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlICAzIDogeyAgICAgICAgICAgICAgICAgICAgIC8qIGluZGV4ZWQ7IGFidXNlIGdyYXkgcm91dGluZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKChwRGF0YS0+aURlbHRhdHlwZSA9PSBNTkdfREVMVEFUWVBFX1JFUExBQ0UgICAgICAgICAgKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKHBEYXRhLT5pRGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfQkxPQ0tQSVhFTEFERCAgICApIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAocERhdGEtPmlEZWx0YXR5cGUgPT0gTU5HX0RFTFRBVFlQRV9CTE9DS1BJWEVMUkVQTEFDRSkgICAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKChwQnVmZGVsdGEtPmlDb2xvcnR5cGUgPT0gMCkgfHwgKHBCdWZkZWx0YS0+aUNvbG9ydHlwZSA9PSAzKSkKKyAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBCdWZ0YXJnZXQtPmlCaXRkZXB0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyNpZm5kZWYgTU5HX05PXzFfMl80QklUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAgMSA6IHsgcERhdGEtPmZEZWx0YXJvdyA9IChtbmdfZnB0ciltbmdfZGVsdGFfZzFfZzE7IGJyZWFrOyB9CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIDIgOiB7IHBEYXRhLT5mRGVsdGFyb3cgPSAobW5nX2ZwdHIpbW5nX2RlbHRhX2cyX2cyOyBicmVhazsgfQorICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICA0IDogeyBwRGF0YS0+ZkRlbHRhcm93ID0gKG1uZ19mcHRyKW1uZ19kZWx0YV9nNF9nNDsgYnJlYWs7IH0KKyNlbmRpZiAvKiBNTkdfTk9fMV8yXzRCSVRfU1VQUE9SVCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICA4IDogeyBwRGF0YS0+ZkRlbHRhcm93ID0gKG1uZ19mcHRyKW1uZ19kZWx0YV9nOF9nODsgYnJlYWs7IH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlICA0IDogOworICAgICAgICBjYXNlIDEyIDogeyAgICAgICAgICAgICAgICAgICAgIC8qIGdyYXkgKyBhbHBoYSAqLworICAgICAgICAgICAgICAgICAgICBpZiAoKHBEYXRhLT5pRGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfUkVQTEFDRSAgICAgICAgICApIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAocERhdGEtPmlEZWx0YXR5cGUgPT0gTU5HX0RFTFRBVFlQRV9CTE9DS1BJWEVMQUREICAgICkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChwRGF0YS0+aURlbHRhdHlwZSA9PSBNTkdfREVMVEFUWVBFX0JMT0NLUElYRUxSRVBMQUNFKSAgICApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoKHBCdWZkZWx0YS0+aUNvbG9ydHlwZSA9PSA0KSB8fCAocEJ1ZmRlbHRhLT5pQ29sb3J0eXBlID09IDEyKSkKKyAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBCdWZ0YXJnZXQtPmlCaXRkZXB0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAgOCA6IHsgcERhdGEtPmZEZWx0YXJvdyA9IChtbmdfZnB0ciltbmdfZGVsdGFfZ2E4X2dhODsgICBicmVhazsgfQorI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2IDogeyBwRGF0YS0+ZkRlbHRhcm93ID0gKG1uZ19mcHRyKW1uZ19kZWx0YV9nYTE2X2dhMTY7IGJyZWFrOyB9CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBpZiAoKHBEYXRhLT5pRGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfQkxPQ0tDT0xPUkFERCAgICApIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAocERhdGEtPmlEZWx0YXR5cGUgPT0gTU5HX0RFTFRBVFlQRV9CTE9DS0NPTE9SUkVQTEFDRSkgICAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKChwQnVmZGVsdGEtPmlDb2xvcnR5cGUgPT0gMCkgfHwgKHBCdWZkZWx0YS0+aUNvbG9ydHlwZSA9PSAzKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAocEJ1ZmRlbHRhLT5pQ29sb3J0eXBlID09IDgpKQorICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocEJ1ZnRhcmdldC0+aUJpdGRlcHRoKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICA4IDogeyBwRGF0YS0+ZkRlbHRhcm93ID0gKG1uZ19mcHRyKW1uZ19kZWx0YV9nYThfZzg7ICAgYnJlYWs7IH0KKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNiA6IHsgcERhdGEtPmZEZWx0YXJvdyA9IChtbmdfZnB0ciltbmdfZGVsdGFfZ2ExNl9nMTY7IGJyZWFrOyB9CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBpZiAoKHBEYXRhLT5pRGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfQkxPQ0tBTFBIQUFERCAgICApIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAocERhdGEtPmlEZWx0YXR5cGUgPT0gTU5HX0RFTFRBVFlQRV9CTE9DS0FMUEhBUkVQTEFDRSkgICAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKChwQnVmZGVsdGEtPmlDb2xvcnR5cGUgPT0gMCkgfHwgKHBCdWZkZWx0YS0+aUNvbG9ydHlwZSA9PSAzKSkKKyAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBCdWZ0YXJnZXQtPmlCaXRkZXB0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAgOCA6IHsgcERhdGEtPmZEZWx0YXJvdyA9IChtbmdfZnB0ciltbmdfZGVsdGFfZ2E4X2E4OyAgIGJyZWFrOyB9CisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTYgOiB7IHBEYXRhLT5mRGVsdGFyb3cgPSAobW5nX2ZwdHIpbW5nX2RlbHRhX2dhMTZfYTE2OyBicmVhazsgfQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSAgNiA6IDsKKyAgICAgICAgY2FzZSAxNCA6IHsgICAgICAgICAgICAgICAgICAgICAvKiByZ2IgKyBhbHBoYSAqLworICAgICAgICAgICAgICAgICAgICBpZiAoKHBEYXRhLT5pRGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfUkVQTEFDRSAgICAgICAgICApIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAocERhdGEtPmlEZWx0YXR5cGUgPT0gTU5HX0RFTFRBVFlQRV9CTE9DS1BJWEVMQUREICAgICkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChwRGF0YS0+aURlbHRhdHlwZSA9PSBNTkdfREVMVEFUWVBFX0JMT0NLUElYRUxSRVBMQUNFKSAgICApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoKHBCdWZkZWx0YS0+aUNvbG9ydHlwZSA9PSA2KSB8fCAocEJ1ZmRlbHRhLT5pQ29sb3J0eXBlID09IDE0KSkKKyAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBCdWZ0YXJnZXQtPmlCaXRkZXB0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAgOCA6IHsgcERhdGEtPmZEZWx0YXJvdyA9IChtbmdfZnB0ciltbmdfZGVsdGFfcmdiYThfcmdiYTg7ICAgYnJlYWs7IH0KKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNiA6IHsgcERhdGEtPmZEZWx0YXJvdyA9IChtbmdfZnB0ciltbmdfZGVsdGFfcmdiYTE2X3JnYmExNjsgYnJlYWs7IH0KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGlmICgocERhdGEtPmlEZWx0YXR5cGUgPT0gTU5HX0RFTFRBVFlQRV9CTE9DS0NPTE9SQUREICAgICkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChwRGF0YS0+aURlbHRhdHlwZSA9PSBNTkdfREVMVEFUWVBFX0JMT0NLQ09MT1JSRVBMQUNFKSAgICApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoKHBCdWZkZWx0YS0+aUNvbG9ydHlwZSA9PSAyKSB8fCAocEJ1ZmRlbHRhLT5pQ29sb3J0eXBlID09IDEwKSkKKyAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBCdWZ0YXJnZXQtPmlCaXRkZXB0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAgOCA6IHsgcERhdGEtPmZEZWx0YXJvdyA9IChtbmdfZnB0ciltbmdfZGVsdGFfcmdiYThfcmdiODsgICBicmVhazsgfQorI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2IDogeyBwRGF0YS0+ZkRlbHRhcm93ID0gKG1uZ19mcHRyKW1uZ19kZWx0YV9yZ2JhMTZfcmdiMTY7IGJyZWFrOyB9CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBpZiAoKHBEYXRhLT5pRGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfQkxPQ0tBTFBIQUFERCAgICApIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAocERhdGEtPmlEZWx0YXR5cGUgPT0gTU5HX0RFTFRBVFlQRV9CTE9DS0FMUEhBUkVQTEFDRSkgICAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKChwQnVmZGVsdGEtPmlDb2xvcnR5cGUgPT0gMCkgfHwgKHBCdWZkZWx0YS0+aUNvbG9ydHlwZSA9PSAzKSkKKyAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBCdWZ0YXJnZXQtPmlCaXRkZXB0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAgOCA6IHsgcERhdGEtPmZEZWx0YXJvdyA9IChtbmdfZnB0ciltbmdfZGVsdGFfcmdiYThfYTg7ICAgYnJlYWs7IH0KKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNiA6IHsgcERhdGEtPmZEZWx0YXJvdyA9IChtbmdfZnB0ciltbmdfZGVsdGFfcmdiYTE2X2ExNjsgYnJlYWs7IH0KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICB9CisKKyAgICAgIGlmIChwRGF0YS0+ZkRlbHRhcm93KSAgICAgICAgICAgIC8qIGRvIHdlIG5lZWQgdG8gdGFrZSBhY3Rpb24gPyAqLworICAgICAgeworICAgICAgICBwRGF0YS0+aVBhc3MgICAgICAgID0gLTE7ICAgICAgLyogc2V0dXAgcm93IGRpbWVuc2lvbnMgYW5kIHN0dWZmICovCisgICAgICAgIHBEYXRhLT5pUm93ICAgICAgICAgPSBwRGF0YS0+aURlbHRhQmxvY2t5OworICAgICAgICBwRGF0YS0+aVJvd2luYyAgICAgID0gMTsKKyAgICAgICAgcERhdGEtPmlDb2wgICAgICAgICA9IHBEYXRhLT5pRGVsdGFCbG9ja3g7CisgICAgICAgIHBEYXRhLT5pQ29saW5jICAgICAgPSAxOworICAgICAgICBwRGF0YS0+aVJvd3NhbXBsZXMgID0gcEJ1ZmRlbHRhLT5pV2lkdGg7CisgICAgICAgIHBEYXRhLT5pUm93c2l6ZSAgICAgPSBwQnVmdGFyZ2V0LT5pUm93c2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluZGljYXRlIHdoZXJlIHRvIHJldHJpZXZlICYgd2hlcmUgdG8gc3RvcmUgKi8KKyAgICAgICAgcERhdGEtPnBSZXRyaWV2ZW9iaiA9IChtbmdfb2JqZWN0cClwRGVsdGE7CisgICAgICAgIHBEYXRhLT5wU3RvcmVvYmogICAgPSAobW5nX29iamVjdHApcFRhcmdldDsKKworICAgICAgICBwU2F2ZVJHQkEgPSBwRGF0YS0+cFJHQkFyb3c7ICAgLyogc2F2ZSBjdXJyZW50IHRlbXAtYnVmZmVyISAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0IGEgdGVtcG9yYXJ5IHJvdy1idWZmZXIgKi8KKyAgICAgICAgTU5HX0FMTE9DIChwRGF0YSwgcERhdGEtPnBSR0JBcm93LCAocEJ1ZmRlbHRhLT5pUm93c2l6ZSA8PCAxKSk7CisKKyAgICAgICAgaVkgICAgICAgPSAwOyAgICAgICAgICAgICAgICAgIC8qIHRoaXMgaXMgd2hlcmUgd2Ugc3RhcnQgKi8KKyAgICAgICAgaVJldGNvZGUgPSBNTkdfTk9FUlJPUjsgICAgICAgIC8qIHN0aWxsIG9rZSBmb3Igbm93ICovCisKKyAgICAgICAgd2hpbGUgKCghaVJldGNvZGUpICYmIChpWSA8IHBCdWZkZWx0YS0+aUhlaWdodCkpCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgYSByb3cgKi8KKyAgICAgICAgICBtbmdfdWludDhwIHBXb3JrID0gcEJ1ZmRlbHRhLT5wSW1nZGF0YSArIChpWSAqIHBCdWZkZWx0YS0+aVJvd3NpemUpOworCisgICAgICAgICAgTU5HX0NPUFkgKHBEYXRhLT5wUkdCQXJvdywgcFdvcmssIHBCdWZkZWx0YS0+aVJvd3NpemUpOworCisgICAgICAgICAgaWYgKHBEYXRhLT5mU2NhbGVyb3cpICAgICAgICAvKiBzY2FsZSBpdCAoaWYgbmVjZXNzYXJ5KSAqLworICAgICAgICAgICAgaVJldGNvZGUgPSAoKG1uZ19zY2FsZXJvdylwRGF0YS0+ZlNjYWxlcm93KSAocERhdGEpOworCisgICAgICAgICAgaWYgKCFpUmV0Y29kZSkgICAgICAgICAgICAgICAvKiBhbmQuLi4gZXhlY3V0ZSBpdCAqLworICAgICAgICAgICAgaVJldGNvZGUgPSAoKG1uZ19kZWx0YXJvdylwRGF0YS0+ZkRlbHRhcm93KSAocERhdGEpOworCisgICAgICAgICAgaWYgKCFpUmV0Y29kZSkgICAgICAgICAgICAgICAvKiBhZGp1c3QgdmFyaWFibGVzIGZvciBuZXh0IHJvdyAqLworICAgICAgICAgICAgaVJldGNvZGUgPSBtbmdfbmV4dF9yb3cgKHBEYXRhKTsKKworICAgICAgICAgIGlZKys7ICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIG5leHQgbGluZSAqLworICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkcm9wIHRoZSB0ZW1wb3Jhcnkgcm93LWJ1ZmZlciAqLworICAgICAgICBNTkdfRlJFRSAocERhdGEsIHBEYXRhLT5wUkdCQXJvdywgKHBCdWZkZWx0YS0+aVJvd3NpemUgPDwgMSkpOworICAgICAgICBwRGF0YS0+cFJHQkFyb3cgPSBwU2F2ZVJHQkE7ICAgLyogcmVzdG9yZSBzYXZlZCB0ZW1wLWJ1ZmZlciEgKi8KKworICAgICAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgICAgICByZXR1cm4gaVJldGNvZGU7CisKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURERUxUQSk7CisKKyAgICB9CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9FWEVDVVRFX0RFTFRBX0lNQUdFLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZiAvKiBNTkdfTk9fREVMVEFfUE5HICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19TQVZFCitNTkdfTE9DQUwgbW5nX3JldGNvZGUgc2F2ZV9zdGF0ZSAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfc2F2ZWRhdGFwIHBTYXZlOworICBtbmdfaW1hZ2VwICAgIHBJbWFnZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9TQVZFX1NUQVRFLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKHBEYXRhLT5wU2F2ZWRhdGEpICAgICAgICAgICAgICAgIC8qIHNhbml0eSBjaGVjayAqLworICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlRFUk5BTEVSUk9SKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCBhIGJ1ZmZlciBmb3Igc2F2aW5nICovCisgIE1OR19BTExPQyAocERhdGEsIHBEYXRhLT5wU2F2ZWRhdGEsIHNpemVvZiAobW5nX3NhdmVkYXRhKSk7CisKKyAgcFNhdmUgPSBwRGF0YS0+cFNhdmVkYXRhOyAgICAgICAgICAgIC8qIGFkZHJlc3MgaXQgbW9yZSBkaXJlY3RseSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIGNvcHkgZ2xvYmFsIGRhdGEgZnJvbSB0aGUgbWFpbiBzdHJ1Y3QgKi8KKyNpZiBkZWZpbmVkKE1OR19TVVBQT1JUX1JFQUQpIHx8IGRlZmluZWQoTU5HX1NVUFBPUlRfV1JJVEUpCisgIHBTYXZlLT5iSGFzZ2xvYmFsUExURSAgICAgICA9IHBEYXRhLT5iSGFzZ2xvYmFsUExURTsKKyAgcFNhdmUtPmJIYXNnbG9iYWxUUk5TICAgICAgID0gcERhdGEtPmJIYXNnbG9iYWxUUk5TOworICBwU2F2ZS0+Ykhhc2dsb2JhbEdBTUEgICAgICAgPSBwRGF0YS0+Ykhhc2dsb2JhbEdBTUE7CisgIHBTYXZlLT5iSGFzZ2xvYmFsQ0hSTSAgICAgICA9IHBEYXRhLT5iSGFzZ2xvYmFsQ0hSTTsKKyAgcFNhdmUtPmJIYXNnbG9iYWxTUkdCICAgICAgID0gcERhdGEtPmJIYXNnbG9iYWxTUkdCOworICBwU2F2ZS0+Ykhhc2dsb2JhbElDQ1AgICAgICAgPSBwRGF0YS0+Ykhhc2dsb2JhbElDQ1A7CisgIHBTYXZlLT5iSGFzZ2xvYmFsQktHRCAgICAgICA9IHBEYXRhLT5iSGFzZ2xvYmFsQktHRDsKKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9SRUFEIHx8IE1OR19TVVBQT1JUX1dSSVRFICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19CQUNLCisgIHBTYXZlLT5pQkFDS3JlZCAgICAgICAgICAgICA9IHBEYXRhLT5pQkFDS3JlZDsKKyAgcFNhdmUtPmlCQUNLZ3JlZW4gICAgICAgICAgID0gcERhdGEtPmlCQUNLZ3JlZW47CisgIHBTYXZlLT5pQkFDS2JsdWUgICAgICAgICAgICA9IHBEYXRhLT5pQkFDS2JsdWU7CisgIHBTYXZlLT5pQkFDS21hbmRhdG9yeSAgICAgICA9IHBEYXRhLT5pQkFDS21hbmRhdG9yeTsKKyAgcFNhdmUtPmlCQUNLaW1hZ2VpZCAgICAgICAgID0gcERhdGEtPmlCQUNLaW1hZ2VpZDsKKyAgcFNhdmUtPmlCQUNLdGlsZSAgICAgICAgICAgID0gcERhdGEtPmlCQUNLdGlsZTsKKyNlbmRpZgorCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfRlJBTQorICBwU2F2ZS0+aUZSQU1tb2RlICAgICAgICAgICAgPSBwRGF0YS0+aUZSQU1tb2RlOworICBwU2F2ZS0+aUZSQU1kZWxheSAgICAgICAgICAgPSBwRGF0YS0+aUZSQU1kZWxheTsKKyAgcFNhdmUtPmlGUkFNdGltZW91dCAgICAgICAgID0gcERhdGEtPmlGUkFNdGltZW91dDsKKyAgcFNhdmUtPmJGUkFNY2xpcHBpbmcgICAgICAgID0gcERhdGEtPmJGUkFNY2xpcHBpbmc7CisgIHBTYXZlLT5pRlJBTWNsaXBsICAgICAgICAgICA9IHBEYXRhLT5pRlJBTWNsaXBsOworICBwU2F2ZS0+aUZSQU1jbGlwciAgICAgICAgICAgPSBwRGF0YS0+aUZSQU1jbGlwcjsKKyAgcFNhdmUtPmlGUkFNY2xpcHQgICAgICAgICAgID0gcERhdGEtPmlGUkFNY2xpcHQ7CisgIHBTYXZlLT5pRlJBTWNsaXBiICAgICAgICAgICA9IHBEYXRhLT5pRlJBTWNsaXBiOworI2VuZGlmCisKKyAgcFNhdmUtPmlHbG9iYWxQTFRFY291bnQgICAgID0gcERhdGEtPmlHbG9iYWxQTFRFY291bnQ7CisKKyAgTU5HX0NPUFkgKHBTYXZlLT5hR2xvYmFsUExURWVudHJpZXMsIHBEYXRhLT5hR2xvYmFsUExURWVudHJpZXMsIHNpemVvZiAobW5nX3JnYnBhbHRhYikpOworCisgIHBTYXZlLT5pR2xvYmFsVFJOU3Jhd2xlbiAgICA9IHBEYXRhLT5pR2xvYmFsVFJOU3Jhd2xlbjsKKyAgTU5HX0NPUFkgKHBTYXZlLT5hR2xvYmFsVFJOU3Jhd2RhdGEsIHBEYXRhLT5hR2xvYmFsVFJOU3Jhd2RhdGEsIDI1Nik7CisKKyAgcFNhdmUtPmlHbG9iYWxHYW1tYSAgICAgICAgID0gcERhdGEtPmlHbG9iYWxHYW1tYTsKKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX2NIUk0KKyAgcFNhdmUtPmlHbG9iYWxXaGl0ZXBvaW50eCAgID0gcERhdGEtPmlHbG9iYWxXaGl0ZXBvaW50eDsKKyAgcFNhdmUtPmlHbG9iYWxXaGl0ZXBvaW50eSAgID0gcERhdGEtPmlHbG9iYWxXaGl0ZXBvaW50eTsKKyAgcFNhdmUtPmlHbG9iYWxQcmltYXJ5cmVkeCAgID0gcERhdGEtPmlHbG9iYWxQcmltYXJ5cmVkeDsKKyAgcFNhdmUtPmlHbG9iYWxQcmltYXJ5cmVkeSAgID0gcERhdGEtPmlHbG9iYWxQcmltYXJ5cmVkeTsKKyAgcFNhdmUtPmlHbG9iYWxQcmltYXJ5Z3JlZW54ID0gcERhdGEtPmlHbG9iYWxQcmltYXJ5Z3JlZW54OworICBwU2F2ZS0+aUdsb2JhbFByaW1hcnlncmVlbnkgPSBwRGF0YS0+aUdsb2JhbFByaW1hcnlncmVlbnk7CisgIHBTYXZlLT5pR2xvYmFsUHJpbWFyeWJsdWV4ICA9IHBEYXRhLT5pR2xvYmFsUHJpbWFyeWJsdWV4OworICBwU2F2ZS0+aUdsb2JhbFByaW1hcnlibHVleSAgPSBwRGF0YS0+aUdsb2JhbFByaW1hcnlibHVleTsKKyNlbmRpZgorCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfc1JHQgorICBwU2F2ZS0+aUdsb2JhbFJlbmRpbnRlbnQgICAgPSBwRGF0YS0+aUdsb2JhbFJlbmRpbnRlbnQ7CisjZW5kaWYKKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX2lDQ1AKKyAgcFNhdmUtPmlHbG9iYWxQcm9maWxlc2l6ZSAgID0gcERhdGEtPmlHbG9iYWxQcm9maWxlc2l6ZTsKKworICBpZiAocFNhdmUtPmlHbG9iYWxQcm9maWxlc2l6ZSkgICAgICAgLyogaGFzIGEgcHJvZmlsZSA/ICovCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGVuIGNvcHkgdGhhdCAhICovCisgICAgTU5HX0FMTE9DIChwRGF0YSwgcFNhdmUtPnBHbG9iYWxQcm9maWxlLCBwU2F2ZS0+aUdsb2JhbFByb2ZpbGVzaXplKTsKKyAgICBNTkdfQ09QWSAocFNhdmUtPnBHbG9iYWxQcm9maWxlLCBwRGF0YS0+cEdsb2JhbFByb2ZpbGUsIHBTYXZlLT5pR2xvYmFsUHJvZmlsZXNpemUpOworICB9CisjZW5kaWYKKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX2JLR0QKKyAgcFNhdmUtPmlHbG9iYWxCS0dEcmVkICAgICAgID0gcERhdGEtPmlHbG9iYWxCS0dEcmVkOworICBwU2F2ZS0+aUdsb2JhbEJLR0RncmVlbiAgICAgPSBwRGF0YS0+aUdsb2JhbEJLR0RncmVlbjsKKyAgcFNhdmUtPmlHbG9iYWxCS0dEYmx1ZSAgICAgID0gcERhdGEtPmlHbG9iYWxCS0dEYmx1ZTsKKyNlbmRpZgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmcmVlemUgY3VycmVudCBpbWFnZSBvYmplY3RzICovCisgIHBJbWFnZSA9IChtbmdfaW1hZ2VwKXBEYXRhLT5wRmlyc3RpbWdvYmo7CisKKyAgd2hpbGUgKHBJbWFnZSkKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZyZWV6ZSB0aGUgb2JqZWN0IEFORCBpdHMgYnVmZmVyICovCisgICAgcEltYWdlLT5iRnJvemVuICAgICAgICAgID0gTU5HX1RSVUU7CisgICAgcEltYWdlLT5wSW1nYnVmLT5iRnJvemVuID0gTU5HX1RSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuZWVlZXh0ICovCisgICAgcEltYWdlID0gKG1uZ19pbWFnZXApcEltYWdlLT5zSGVhZGVyLnBOZXh0OworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fU0FWRV9TVEFURSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX3Jlc2V0X29ianplcm8gKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX2ltYWdlcCAgcEltYWdlICAgPSAobW5nX2ltYWdlcClwRGF0YS0+cE9ianplcm87CisgIG1uZ19yZXRjb2RlIGlSZXRjb2RlID0gbW5nX3Jlc2V0X29iamVjdF9kZXRhaWxzIChwRGF0YSwgcEltYWdlLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgTU5HX1RSVUUpOworCisgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgIHJldHVybiBpUmV0Y29kZTsKKworICBwSW1hZ2UtPmJWaXNpYmxlICAgICAgICAgICAgID0gTU5HX1RSVUU7CisgIHBJbWFnZS0+YlZpZXdhYmxlICAgICAgICAgICAgPSBNTkdfVFJVRTsKKyAgcEltYWdlLT5pUG9zeCAgICAgICAgICAgICAgICA9IDA7CisgIHBJbWFnZS0+aVBvc3kgICAgICAgICAgICAgICAgPSAwOworICBwSW1hZ2UtPmJDbGlwcGVkICAgICAgICAgICAgID0gTU5HX0ZBTFNFOworICBwSW1hZ2UtPmlDbGlwbCAgICAgICAgICAgICAgID0gMDsKKyAgcEltYWdlLT5pQ2xpcHIgICAgICAgICAgICAgICA9IDA7CisgIHBJbWFnZS0+aUNsaXB0ICAgICAgICAgICAgICAgPSAwOworICBwSW1hZ2UtPmlDbGlwYiAgICAgICAgICAgICAgID0gMDsKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19NQUdOCisgIHBJbWFnZS0+aU1BR05fTWV0aG9kWCAgICAgICAgPSAwOworICBwSW1hZ2UtPmlNQUdOX01ldGhvZFkgICAgICAgID0gMDsKKyAgcEltYWdlLT5pTUFHTl9NWCAgICAgICAgICAgICA9IDA7CisgIHBJbWFnZS0+aU1BR05fTVkgICAgICAgICAgICAgPSAwOworICBwSW1hZ2UtPmlNQUdOX01MICAgICAgICAgICAgID0gMDsKKyAgcEltYWdlLT5pTUFHTl9NUiAgICAgICAgICAgICA9IDA7CisgIHBJbWFnZS0+aU1BR05fTVQgICAgICAgICAgICAgPSAwOworICBwSW1hZ2UtPmlNQUdOX01CICAgICAgICAgICAgID0gMDsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworTU5HX0xPQ0FMIG1uZ19yZXRjb2RlIHJlc3RvcmVfc3RhdGUgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19TQVZFCisgIG1uZ19zYXZlZGF0YXAgcFNhdmU7CisjZW5kaWYKKyAgbW5nX2ltYWdlcCAgICBwSW1hZ2U7CisgIG1uZ19yZXRjb2RlICAgaVJldGNvZGU7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVTVE9SRV9TVEFURSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVzdG9yZSBvYmplY3QgMCBzdGF0dXMgISEhICovCisgIGlSZXRjb2RlID0gbW5nX3Jlc2V0X29ianplcm8gKHBEYXRhKTsKKworICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmcmVzaCBjeWNsZTsgZmFrZSBubyBmcmFtZXMgZG9uZSB5ZXQgKi8KKyAgcERhdGEtPmJGcmFtZWRvbmUgICAgICAgICAgICAgPSBNTkdfRkFMU0U7CisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19TQVZFCisgIGlmIChwRGF0YS0+cFNhdmVkYXRhKSAgICAgICAgICAgICAgICAvKiBkbyB3ZSBoYXZlIGEgc2F2ZWQgc3RhdGUgPyAqLworICB7CisgICAgcFNhdmUgPSBwRGF0YS0+cFNhdmVkYXRhOyAgICAgICAgICAvKiBhZGRyZXNzIGl0IG1vcmUgZGlyZWN0bHkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCBjb3B5IGl0IGJhY2sgdG8gdGhlIG1haW4gc3RydWN0ICovCisjaWYgZGVmaW5lZChNTkdfU1VQUE9SVF9SRUFEKSB8fCBkZWZpbmVkKE1OR19TVVBQT1JUX1dSSVRFKQorICAgIHBEYXRhLT5iSGFzZ2xvYmFsUExURSAgICAgICA9IHBTYXZlLT5iSGFzZ2xvYmFsUExURTsKKyAgICBwRGF0YS0+Ykhhc2dsb2JhbFRSTlMgICAgICAgPSBwU2F2ZS0+Ykhhc2dsb2JhbFRSTlM7CisgICAgcERhdGEtPmJIYXNnbG9iYWxHQU1BICAgICAgID0gcFNhdmUtPmJIYXNnbG9iYWxHQU1BOworICAgIHBEYXRhLT5iSGFzZ2xvYmFsQ0hSTSAgICAgICA9IHBTYXZlLT5iSGFzZ2xvYmFsQ0hSTTsKKyAgICBwRGF0YS0+Ykhhc2dsb2JhbFNSR0IgICAgICAgPSBwU2F2ZS0+Ykhhc2dsb2JhbFNSR0I7CisgICAgcERhdGEtPmJIYXNnbG9iYWxJQ0NQICAgICAgID0gcFNhdmUtPmJIYXNnbG9iYWxJQ0NQOworICAgIHBEYXRhLT5iSGFzZ2xvYmFsQktHRCAgICAgICA9IHBTYXZlLT5iSGFzZ2xvYmFsQktHRDsKKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9SRUFEIHx8IE1OR19TVVBQT1JUX1dSSVRFICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19CQUNLCisgICAgcERhdGEtPmlCQUNLcmVkICAgICAgICAgICAgID0gcFNhdmUtPmlCQUNLcmVkOworICAgIHBEYXRhLT5pQkFDS2dyZWVuICAgICAgICAgICA9IHBTYXZlLT5pQkFDS2dyZWVuOworICAgIHBEYXRhLT5pQkFDS2JsdWUgICAgICAgICAgICA9IHBTYXZlLT5pQkFDS2JsdWU7CisgICAgcERhdGEtPmlCQUNLbWFuZGF0b3J5ICAgICAgID0gcFNhdmUtPmlCQUNLbWFuZGF0b3J5OworICAgIHBEYXRhLT5pQkFDS2ltYWdlaWQgICAgICAgICA9IHBTYXZlLT5pQkFDS2ltYWdlaWQ7CisgICAgcERhdGEtPmlCQUNLdGlsZSAgICAgICAgICAgID0gcFNhdmUtPmlCQUNLdGlsZTsKKyNlbmRpZgorCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfRlJBTQorICAgIHBEYXRhLT5pRlJBTW1vZGUgICAgICAgICAgICA9IHBTYXZlLT5pRlJBTW1vZGU7CisvKiAgICBwRGF0YS0+aUZSQU1kZWxheSAgICAgICAgICAgPSBwU2F2ZS0+aUZSQU1kZWxheTsgKi8KKyAgICBwRGF0YS0+aUZSQU10aW1lb3V0ICAgICAgICAgPSBwU2F2ZS0+aUZSQU10aW1lb3V0OworICAgIHBEYXRhLT5iRlJBTWNsaXBwaW5nICAgICAgICA9IHBTYXZlLT5iRlJBTWNsaXBwaW5nOworICAgIHBEYXRhLT5pRlJBTWNsaXBsICAgICAgICAgICA9IHBTYXZlLT5pRlJBTWNsaXBsOworICAgIHBEYXRhLT5pRlJBTWNsaXByICAgICAgICAgICA9IHBTYXZlLT5pRlJBTWNsaXByOworICAgIHBEYXRhLT5pRlJBTWNsaXB0ICAgICAgICAgICA9IHBTYXZlLT5pRlJBTWNsaXB0OworICAgIHBEYXRhLT5pRlJBTWNsaXBiICAgICAgICAgICA9IHBTYXZlLT5pRlJBTWNsaXBiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTk9PT09PT09PT09PTyAqLworLyogICAgcERhdGEtPmlGcmFtZW1vZGUgICAgICAgICAgID0gcFNhdmUtPmlGUkFNbW9kZTsKKyAgICBwRGF0YS0+aUZyYW1lZGVsYXkgICAgICAgICAgPSBwU2F2ZS0+aUZSQU1kZWxheTsKKyAgICBwRGF0YS0+aUZyYW1ldGltZW91dCAgICAgICAgPSBwU2F2ZS0+aUZSQU10aW1lb3V0OworICAgIHBEYXRhLT5iRnJhbWVjbGlwcGluZyAgICAgICA9IHBTYXZlLT5iRlJBTWNsaXBwaW5nOworICAgIHBEYXRhLT5pRnJhbWVjbGlwbCAgICAgICAgICA9IHBTYXZlLT5pRlJBTWNsaXBsOworICAgIHBEYXRhLT5pRnJhbWVjbGlwciAgICAgICAgICA9IHBTYXZlLT5pRlJBTWNsaXByOworICAgIHBEYXRhLT5pRnJhbWVjbGlwdCAgICAgICAgICA9IHBTYXZlLT5pRlJBTWNsaXB0OworICAgIHBEYXRhLT5pRnJhbWVjbGlwYiAgICAgICAgICA9IHBTYXZlLT5pRlJBTWNsaXBiOyAqLworCisvKiAgICBwRGF0YS0+aU5leHRkZWxheSAgICAgICAgICAgPSBwU2F2ZS0+aUZSQU1kZWxheTsgKi8KKyAgICBwRGF0YS0+aU5leHRkZWxheSAgICAgICAgICAgPSBwRGF0YS0+aUZyYW1lZGVsYXk7CisjZW5kaWYKKworICAgIHBEYXRhLT5pR2xvYmFsUExURWNvdW50ICAgICA9IHBTYXZlLT5pR2xvYmFsUExURWNvdW50OworICAgIE1OR19DT1BZIChwRGF0YS0+YUdsb2JhbFBMVEVlbnRyaWVzLCBwU2F2ZS0+YUdsb2JhbFBMVEVlbnRyaWVzLCBzaXplb2YgKG1uZ19yZ2JwYWx0YWIpKTsKKworICAgIHBEYXRhLT5pR2xvYmFsVFJOU3Jhd2xlbiAgICA9IHBTYXZlLT5pR2xvYmFsVFJOU3Jhd2xlbjsKKyAgICBNTkdfQ09QWSAocERhdGEtPmFHbG9iYWxUUk5TcmF3ZGF0YSwgcFNhdmUtPmFHbG9iYWxUUk5TcmF3ZGF0YSwgMjU2KTsKKworICAgIHBEYXRhLT5pR2xvYmFsR2FtbWEgICAgICAgICA9IHBTYXZlLT5pR2xvYmFsR2FtbWE7CisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19jSFJNCisgICAgcERhdGEtPmlHbG9iYWxXaGl0ZXBvaW50eCAgID0gcFNhdmUtPmlHbG9iYWxXaGl0ZXBvaW50eDsKKyAgICBwRGF0YS0+aUdsb2JhbFdoaXRlcG9pbnR5ICAgPSBwU2F2ZS0+aUdsb2JhbFdoaXRlcG9pbnR5OworICAgIHBEYXRhLT5pR2xvYmFsUHJpbWFyeXJlZHggICA9IHBTYXZlLT5pR2xvYmFsUHJpbWFyeXJlZHg7CisgICAgcERhdGEtPmlHbG9iYWxQcmltYXJ5cmVkeSAgID0gcFNhdmUtPmlHbG9iYWxQcmltYXJ5cmVkeTsKKyAgICBwRGF0YS0+aUdsb2JhbFByaW1hcnlncmVlbnggPSBwU2F2ZS0+aUdsb2JhbFByaW1hcnlncmVlbng7CisgICAgcERhdGEtPmlHbG9iYWxQcmltYXJ5Z3JlZW55ID0gcFNhdmUtPmlHbG9iYWxQcmltYXJ5Z3JlZW55OworICAgIHBEYXRhLT5pR2xvYmFsUHJpbWFyeWJsdWV4ICA9IHBTYXZlLT5pR2xvYmFsUHJpbWFyeWJsdWV4OworICAgIHBEYXRhLT5pR2xvYmFsUHJpbWFyeWJsdWV5ICA9IHBTYXZlLT5pR2xvYmFsUHJpbWFyeWJsdWV5OworI2VuZGlmCisKKyAgICBwRGF0YS0+aUdsb2JhbFJlbmRpbnRlbnQgICAgPSBwU2F2ZS0+aUdsb2JhbFJlbmRpbnRlbnQ7CisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19pQ0NQCisgICAgcERhdGEtPmlHbG9iYWxQcm9maWxlc2l6ZSAgID0gcFNhdmUtPmlHbG9iYWxQcm9maWxlc2l6ZTsKKworICAgIGlmIChwRGF0YS0+aUdsb2JhbFByb2ZpbGVzaXplKSAgICAgLyogaGFzIGEgcHJvZmlsZSA/ICovCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGVuIGNvcHkgdGhhdCAhICovCisgICAgICBNTkdfQUxMT0MgKHBEYXRhLCBwRGF0YS0+cEdsb2JhbFByb2ZpbGUsIHBEYXRhLT5pR2xvYmFsUHJvZmlsZXNpemUpOworICAgICAgTU5HX0NPUFkgKHBEYXRhLT5wR2xvYmFsUHJvZmlsZSwgcFNhdmUtPnBHbG9iYWxQcm9maWxlLCBwRGF0YS0+aUdsb2JhbFByb2ZpbGVzaXplKTsKKyAgICB9CisjZW5kaWYKKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX2JLR0QKKyAgICBwRGF0YS0+aUdsb2JhbEJLR0RyZWQgICAgICAgPSBwU2F2ZS0+aUdsb2JhbEJLR0RyZWQ7CisgICAgcERhdGEtPmlHbG9iYWxCS0dEZ3JlZW4gICAgID0gcFNhdmUtPmlHbG9iYWxCS0dEZ3JlZW47CisgICAgcERhdGEtPmlHbG9iYWxCS0dEYmx1ZSAgICAgID0gcFNhdmUtPmlHbG9iYWxCS0dEYmx1ZTsKKyNlbmRpZgorICB9CisgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBubyBzYXZlZC1kYXRhOyBzbyByZXNldCB0aGUgbG90ICovCisjZW5kaWYgLyogU0tJUENIVU5LX1NBVkUgKi8KKyAgeworI2lmIGRlZmluZWQoTU5HX1NVUFBPUlRfUkVBRCkgfHwgZGVmaW5lZChNTkdfU1VQUE9SVF9XUklURSkKKyAgICBwRGF0YS0+Ykhhc2dsb2JhbFBMVEUgICAgICAgPSBNTkdfRkFMU0U7CisgICAgcERhdGEtPmJIYXNnbG9iYWxUUk5TICAgICAgID0gTU5HX0ZBTFNFOworICAgIHBEYXRhLT5iSGFzZ2xvYmFsR0FNQSAgICAgICA9IE1OR19GQUxTRTsKKyAgICBwRGF0YS0+Ykhhc2dsb2JhbENIUk0gICAgICAgPSBNTkdfRkFMU0U7CisgICAgcERhdGEtPmJIYXNnbG9iYWxTUkdCICAgICAgID0gTU5HX0ZBTFNFOworICAgIHBEYXRhLT5iSGFzZ2xvYmFsSUNDUCAgICAgICA9IE1OR19GQUxTRTsKKyAgICBwRGF0YS0+Ykhhc2dsb2JhbEJLR0QgICAgICAgPSBNTkdfRkFMU0U7CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfUkVBRCB8fCBNTkdfU1VQUE9SVF9XUklURSAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfVEVSTQorICAgIGlmICghcERhdGEtPmJNaXNwbGFjZWRURVJNKSAgICAgICAgLyogYmFja3dhcmQgY29tcGF0aWJsZSB1Z2xpbmVzcyAhISEgKi8KKyAgICB7CisgICAgICBwRGF0YS0+aUJBQ0tyZWQgICAgICAgICAgID0gMDsKKyAgICAgIHBEYXRhLT5pQkFDS2dyZWVuICAgICAgICAgPSAwOworICAgICAgcERhdGEtPmlCQUNLYmx1ZSAgICAgICAgICA9IDA7CisgICAgICBwRGF0YS0+aUJBQ0ttYW5kYXRvcnkgICAgID0gMDsKKyAgICAgIHBEYXRhLT5pQkFDS2ltYWdlaWQgICAgICAgPSAwOworICAgICAgcERhdGEtPmlCQUNLdGlsZSAgICAgICAgICA9IDA7CisgICAgfQorI2VuZGlmCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19GUkFNCisgICAgcERhdGEtPmlGUkFNbW9kZSAgICAgICAgICAgID0gMTsKKy8qICAgIHBEYXRhLT5pRlJBTWRlbGF5ICAgICAgICAgICA9IDE7ICovCisgICAgcERhdGEtPmlGUkFNdGltZW91dCAgICAgICAgID0gMHg3ZmZmZmZmZmw7CisgICAgcERhdGEtPmJGUkFNY2xpcHBpbmcgICAgICAgID0gTU5HX0ZBTFNFOworICAgIHBEYXRhLT5pRlJBTWNsaXBsICAgICAgICAgICA9IDA7CisgICAgcERhdGEtPmlGUkFNY2xpcHIgICAgICAgICAgID0gMDsKKyAgICBwRGF0YS0+aUZSQU1jbGlwdCAgICAgICAgICAgPSAwOworICAgIHBEYXRhLT5pRlJBTWNsaXBiICAgICAgICAgICA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOT09PT09PT09PT09PICovCisvKiAgICBwRGF0YS0+aUZyYW1lbW9kZSAgICAgICAgICAgPSAxOworICAgIHBEYXRhLT5pRnJhbWVkZWxheSAgICAgICAgICA9IDE7CisgICAgcERhdGEtPmlGcmFtZXRpbWVvdXQgICAgICAgID0gMHg3ZmZmZmZmZmw7CisgICAgcERhdGEtPmJGcmFtZWNsaXBwaW5nICAgICAgID0gTU5HX0ZBTFNFOworICAgIHBEYXRhLT5pRnJhbWVjbGlwbCAgICAgICAgICA9IDA7CisgICAgcERhdGEtPmlGcmFtZWNsaXByICAgICAgICAgID0gMDsKKyAgICBwRGF0YS0+aUZyYW1lY2xpcHQgICAgICAgICAgPSAwOworICAgIHBEYXRhLT5pRnJhbWVjbGlwYiAgICAgICAgICA9IDA7ICovCisKKy8qICAgIHBEYXRhLT5pTmV4dGRlbGF5ICAgICAgICAgICA9IDE7ICovCisgICAgcERhdGEtPmlOZXh0ZGVsYXkgICAgICAgICAgID0gcERhdGEtPmlGcmFtZWRlbGF5OworI2VuZGlmCisKKyAgICBwRGF0YS0+aUdsb2JhbFBMVEVjb3VudCAgICAgPSAwOworCisgICAgcERhdGEtPmlHbG9iYWxUUk5TcmF3bGVuICAgID0gMDsKKworICAgIHBEYXRhLT5pR2xvYmFsR2FtbWEgICAgICAgICA9IDA7CisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19jSFJNCisgICAgcERhdGEtPmlHbG9iYWxXaGl0ZXBvaW50eCAgID0gMDsKKyAgICBwRGF0YS0+aUdsb2JhbFdoaXRlcG9pbnR5ICAgPSAwOworICAgIHBEYXRhLT5pR2xvYmFsUHJpbWFyeXJlZHggICA9IDA7CisgICAgcERhdGEtPmlHbG9iYWxQcmltYXJ5cmVkeSAgID0gMDsKKyAgICBwRGF0YS0+aUdsb2JhbFByaW1hcnlncmVlbnggPSAwOworICAgIHBEYXRhLT5pR2xvYmFsUHJpbWFyeWdyZWVueSA9IDA7CisgICAgcERhdGEtPmlHbG9iYWxQcmltYXJ5Ymx1ZXggID0gMDsKKyAgICBwRGF0YS0+aUdsb2JhbFByaW1hcnlibHVleSAgPSAwOworI2VuZGlmCisKKyAgICBwRGF0YS0+aUdsb2JhbFJlbmRpbnRlbnQgICAgPSAwOworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfaUNDUAorICAgIGlmIChwRGF0YS0+aUdsb2JhbFByb2ZpbGVzaXplKSAgICAgLyogZnJlZSBhIHByZXZpb3VzIHByb2ZpbGUgPyAqLworICAgICAgTU5HX0ZSRUUgKHBEYXRhLCBwRGF0YS0+cEdsb2JhbFByb2ZpbGUsIHBEYXRhLT5pR2xvYmFsUHJvZmlsZXNpemUpOworCisgICAgcERhdGEtPmlHbG9iYWxQcm9maWxlc2l6ZSAgID0gMDsKKyNlbmRpZgorCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfYktHRAorICAgIHBEYXRhLT5pR2xvYmFsQktHRHJlZCAgICAgICA9IDA7CisgICAgcERhdGEtPmlHbG9iYWxCS0dEZ3JlZW4gICAgID0gMDsKKyAgICBwRGF0YS0+aUdsb2JhbEJLR0RibHVlICAgICAgPSAwOworI2VuZGlmCisgIH0KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX1RFUk0KKyAgaWYgKCFwRGF0YS0+Yk1pc3BsYWNlZFRFUk0pICAgICAgICAgIC8qIGJhY2t3YXJkIGNvbXBhdGlibGUgdWdsaW5lc3MgISEhICovCisgIHsKKyAgICBwSW1hZ2UgPSAobW5nX2ltYWdlcClwRGF0YS0+cEZpcnN0aW1nb2JqOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZHJvcCB1bi1mcm96ZW4gaW1hZ2Ugb2JqZWN0cyAqLworICAgIHdoaWxlIChwSW1hZ2UpCisgICAgeworICAgICAgbW5nX2ltYWdlcCBwTmV4dCA9IChtbmdfaW1hZ2VwKXBJbWFnZS0+c0hlYWRlci5wTmV4dDsKKworICAgICAgaWYgKCFwSW1hZ2UtPmJGcm96ZW4pICAgICAgICAgICAgLyogaXMgaXQgdW4tZnJvemVuID8gKi8KKyAgICAgIHsKKyAgICAgICAgbW5nX2ltYWdlcCBwUHJldiA9IChtbmdfaW1hZ2VwKXBJbWFnZS0+c0hlYWRlci5wUHJldjsKKworICAgICAgICBpZiAocFByZXYpICAgICAgICAgICAgICAgICAgICAgLyogdW5saW5rIGl0ICovCisgICAgICAgICAgcFByZXYtPnNIZWFkZXIucE5leHQgPSBwTmV4dDsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHBEYXRhLT5wRmlyc3RpbWdvYmogID0gcE5leHQ7CisKKyAgICAgICAgaWYgKHBOZXh0KQorICAgICAgICAgIHBOZXh0LT5zSGVhZGVyLnBQcmV2ID0gcFByZXY7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwRGF0YS0+cExhc3RpbWdvYmogICA9IHBQcmV2OworCisgICAgICAgIGlmIChwSW1hZ2UtPnBJbWdidWYtPmJGcm96ZW4pICAvKiBidWZmZXIgZnJvemVuID8gKi8KKyAgICAgICAgeworICAgICAgICAgIGlmIChwSW1hZ2UtPnBJbWdidWYtPmlSZWZjb3VudCA8IDIpCisgICAgICAgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5URVJOQUxFUlJPUik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWNyZWFzZSByZWYgY291bnRlciAqLworICAgICAgICAgIHBJbWFnZS0+cEltZ2J1Zi0+aVJlZmNvdW50LS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBqdXN0IGNsZWFudXAgdGhlIG9iamVjdCB0aGVuICovCisgICAgICAgICAgTU5HX0ZSRUVYIChwRGF0YSwgcEltYWdlLCBzaXplb2YgKG1uZ19pbWFnZSkpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZyZWUgdGhlIGltYWdlIGJ1ZmZlciAqLworICAgICAgICAgIGlSZXRjb2RlID0gbW5nX2ZyZWVfaW1hZ2VkYXRhb2JqZWN0IChwRGF0YSwgcEltYWdlLT5wSW1nYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCBjbGVhbnVwIHRoZSBvYmplY3QgKi8KKyAgICAgICAgICBNTkdfRlJFRVggKHBEYXRhLCBwSW1hZ2UsIHNpemVvZiAobW5nX2ltYWdlKSk7CisKKyAgICAgICAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICAgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcEltYWdlID0gcE5leHQ7ICAgICAgICAgICAgICAgICAgLyogbmVlZWV4dCAqLworICAgIH0KKyAgfQorI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVTVE9SRV9TVEFURSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBHZW5lcmFsIGRpc3BsYXkgcHJvY2Vzc2luZyByb3V0aW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19kaXNwbGF5IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ19yZXRjb2RlIGlSZXRjb2RlID0gTU5HX05PRVJST1I7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19ESVNQTEFZLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKCFwRGF0YS0+aUJyZWFrcG9pbnQpICAgICAgICAgICAgIC8qIG5vdCBicm9rZW4gcHJldmlvdXNseSA/ICovCisgIHsKKyAgICBpZiAoKHBEYXRhLT5pUmVxdWVzdGZyYW1lKSB8fCAocERhdGEtPmlSZXF1ZXN0bGF5ZXIpIHx8IChwRGF0YS0+aVJlcXVlc3R0aW1lKSkKKyAgICB7CisgICAgICBwRGF0YS0+YlNlYXJjaGluZyA9IE1OR19UUlVFOyAgICAvKiBpbmRpY2F0ZSB3ZSdyZSBzZWFyY2hpbmcgKi8KKworICAgICAgaVJldGNvZGUgPSBjbGVhcl9jYW52YXMgKHBEYXRhKTsgLyogbWFrZSB0aGUgY2FudmFzIHZpcmdpbiBibGFjayA/IT8gKi8KKworICAgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgICAgcmV0dXJuIGlSZXRjb2RlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGV0J3Mgc3RhcnQgZnJvbSB0aGUgdG9wLCBzaGFsbCB3ZSAqLworICAgICAgcERhdGEtPnBDdXJyYW5pb2JqID0gcERhdGEtPnBGaXJzdGFuaW9iajsKKyAgICB9CisgIH0KKworICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJvY2VzcyB0aGUgb2JqZWN0cyAqLworICB7CisgICAgaWYgKHBEYXRhLT5iU2VhcmNoaW5nKSAgICAgICAgICAgICAvKiBjbGVhciB0aW1lci1mbGFnIHdoZW4gc2VhcmNoaW5nICEhISAqLworICAgICAgcERhdGEtPmJUaW1lcnNldCA9IE1OR19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvIHdlIG5lZWQgdG8gZmluaXNoIHNvbWV0aGluZyBmaXJzdCA/ICovCisgICAgaWYgKChwRGF0YS0+aUJyZWFrcG9pbnQpICYmIChwRGF0YS0+aUJyZWFrcG9pbnQgPCA5OSkpCisgICAgeworICAgICAgc3dpdGNoIChwRGF0YS0+aUJyZWFrcG9pbnQpICAgICAgLyogcmV0dXJuIHRvIGJyb2tlbiBkaXNwbGF5IHJvdXRpbmUgKi8KKyAgICAgIHsKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19GUkFNCisgICAgICAgIGNhc2UgIDEgOiB7IGlSZXRjb2RlID0gbW5nX3Byb2Nlc3NfZGlzcGxheV9mcmFtMiAocERhdGEpOyBicmVhazsgfQorI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfU0hPVworICAgICAgICBjYXNlICAzIDogOyAgICAgICAgICAgICAgICAgICAgLyogc2FtZSBhcyA0ICEhISAqLworICAgICAgICBjYXNlICA0IDogeyBpUmV0Y29kZSA9IG1uZ19wcm9jZXNzX2Rpc3BsYXlfc2hvdyAgKHBEYXRhKTsgYnJlYWs7IH0KKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX0NMT04KKyAgICAgICAgY2FzZSAgNSA6IHsgaVJldGNvZGUgPSBtbmdfcHJvY2Vzc19kaXNwbGF5X2Nsb24yIChwRGF0YSk7IGJyZWFrOyB9CisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19NQUdOCisgICAgICAgIGNhc2UgIDkgOiB7IGlSZXRjb2RlID0gbW5nX3Byb2Nlc3NfZGlzcGxheV9tYWduMiAocERhdGEpOyBicmVhazsgfQorICAgICAgICBjYXNlIDEwIDogeyBpUmV0Y29kZSA9IG1uZ19wcm9jZXNzX2Rpc3BsYXlfbWVuZDIgKHBEYXRhKTsgYnJlYWs7IH0KKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX1BBU1QKKyAgICAgICAgY2FzZSAxMSA6IHsgaVJldGNvZGUgPSBtbmdfcHJvY2Vzc19kaXNwbGF5X3Bhc3QyIChwRGF0YSk7IGJyZWFrOyB9CisjZW5kaWYKKyAgICAgICAgZGVmYXVsdCA6IE1OR19FUlJPUiAocERhdGEsIE1OR19JTlRFUk5BTEVSUk9SKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGlmIChwRGF0YS0+cEN1cnJhbmlvYmopCisgICAgICAgIGlSZXRjb2RlID0gKChtbmdfb2JqZWN0X2hlYWRlcnApcERhdGEtPnBDdXJyYW5pb2JqKS0+ZlByb2Nlc3MgKHBEYXRhLCBwRGF0YS0+cEN1cnJhbmlvYmopOworICAgIH0KKworICAgIGlmICghcERhdGEtPmJUaW1lcnNldCkgICAgICAgICAgICAgLyogcmVzZXQgYnJlYWtwb2ludCBmbGFnID8gKi8KKyAgICAgIHBEYXRhLT5pQnJlYWtwb2ludCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjYW4gd2UgYWR2YW5jZSB0byBuZXh0IG9iamVjdCA/ICovCisgICAgaWYgKCghaVJldGNvZGUpICYmIChwRGF0YS0+cEN1cnJhbmlvYmopICYmCisgICAgICAgICghcERhdGEtPmJUaW1lcnNldCkgJiYgKCFwRGF0YS0+YlNlY3Rpb253YWl0KSkKKyAgICB7CisgICAgICBwRGF0YS0+cEN1cnJhbmlvYmogPSAoKG1uZ19vYmplY3RfaGVhZGVycClwRGF0YS0+cEN1cnJhbmlvYmopLT5wTmV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1FTkQgcHJvY2Vzc2luZyB0byBiZSBkb25lID8gKi8KKyAgICAgIGlmICgocERhdGEtPmVJbWFnZXR5cGUgPT0gbW5nX2l0X21uZykgJiYgKCFwRGF0YS0+cEN1cnJhbmlvYmopKQorICAgICAgICBpUmV0Y29kZSA9IG1uZ19wcm9jZXNzX2Rpc3BsYXlfbWVuZCAocERhdGEpOworCisgICAgICBpZiAoIXBEYXRhLT5wQ3VycmFuaW9iaikgICAgICAgICAvKiByZWZyZXNoIGFmdGVyIGxhc3QgaW1hZ2UgPyAqLworICAgICAgICBwRGF0YS0+Yk5lZWRyZWZyZXNoID0gTU5HX1RSVUU7CisgICAgfQorCisgICAgaWYgKHBEYXRhLT5iU2VhcmNoaW5nKSAgICAgICAgICAgICAvKiBhcmUgd2UgbG9va2luZyBmb3Igc29tZXRoaW5nID8gKi8KKyAgICB7CisgICAgICBpZiAoKHBEYXRhLT5pUmVxdWVzdGZyYW1lKSAmJiAocERhdGEtPmlSZXF1ZXN0ZnJhbWUgPD0gcERhdGEtPmlGcmFtZXNlcSkpCisgICAgICB7CisgICAgICAgIHBEYXRhLT5pUmVxdWVzdGZyYW1lID0gMDsgICAgICAvKiBmb3VuZCB0aGUgZnJhbWUgISAqLworICAgICAgICBwRGF0YS0+YlNlYXJjaGluZyAgICA9IE1OR19GQUxTRTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIGlmICgocERhdGEtPmlSZXF1ZXN0bGF5ZXIpICYmIChwRGF0YS0+aVJlcXVlc3RsYXllciA8PSBwRGF0YS0+aUxheWVyc2VxKSkKKyAgICAgIHsKKyAgICAgICAgcERhdGEtPmlSZXF1ZXN0bGF5ZXIgPSAwOyAgICAgIC8qIGZvdW5kIHRoZSBsYXllciAhICovCisgICAgICAgIHBEYXRhLT5iU2VhcmNoaW5nICAgID0gTU5HX0ZBTFNFOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgaWYgKChwRGF0YS0+aVJlcXVlc3R0aW1lKSAmJiAocERhdGEtPmlSZXF1ZXN0dGltZSA8PSBwRGF0YS0+aUZyYW1ldGltZSkpCisgICAgICB7CisgICAgICAgIHBEYXRhLT5pUmVxdWVzdHRpbWUgID0gMDsgICAgICAvKiBmb3VuZCB0aGUgcGxheXRpbWUgISAqLworICAgICAgICBwRGF0YS0+YlNlYXJjaGluZyAgICA9IE1OR19GQUxTRTsKKyAgICAgIH0KKyAgICB9CisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1bnRpbCBlcnJvciBvciBhIGJyZWFrIG9yIG5vIG1vcmUgb2JqZWN0cyAqLworICB3aGlsZSAoKCFpUmV0Y29kZSkgJiYgKHBEYXRhLT5wQ3VycmFuaW9iaikgJiYKKyAgICAgICAgICgoKHBEYXRhLT5iUnVubmluZykgJiYgKCFwRGF0YS0+YlRpbWVyc2V0KSkgfHwgKHBEYXRhLT5iU2VhcmNoaW5nKSkgJiYKKyAgICAgICAgICghcERhdGEtPmJTZWN0aW9ud2FpdCkgJiYgKCFwRGF0YS0+YkZyZWV6aW5nKSk7CisKKyAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgcmV0dXJuIGlSZXRjb2RlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVmcmVzaCBuZWVkZWQgPyAqLworICBpZiAoKCFwRGF0YS0+YlRpbWVyc2V0KSAmJiAocERhdGEtPmJOZWVkcmVmcmVzaCkpCisgIHsKKyAgICBpUmV0Y29kZSA9IG1uZ19kaXNwbGF5X3Byb2dyZXNzaXZlX3JlZnJlc2ggKHBEYXRhLCAxKTsKKworICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGltZXIgYnJlYWsgPyAqLworICBpZiAoKHBEYXRhLT5iVGltZXJzZXQpICYmICghcERhdGEtPmlCcmVha3BvaW50KSkKKyAgICBwRGF0YS0+aUJyZWFrcG9pbnQgPSA5OTsKKyAgZWxzZQorICBpZiAoIXBEYXRhLT5iVGltZXJzZXQpCisgICAgcERhdGEtPmlCcmVha3BvaW50ID0gMDsgICAgICAgICAgICAvKiByZXNldCBpZiBubyB0aW1lciBicmVhayAqLworCisgIGlmICgoIXBEYXRhLT5iVGltZXJzZXQpICYmICghcERhdGEtPnBDdXJyYW5pb2JqKSkKKyAgICBwRGF0YS0+YlJ1bm5pbmcgPSBNTkdfRkFMU0U7ICAgICAgIC8qIGFsbCBkb25lIG5vdyAhICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19ESVNQTEFZLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIENodW5rIGRpc3BsYXkgcHJvY2Vzc2luZyByb3V0aW5lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfT1BUSU1JWkVfRk9PVFBSSU5UX0lOSVQKK3BuZ19pbWd0eXBlIG1uZ19wbmdfaW1ndHlwZShtbmdfdWludDggY29sb3J0eXBlLCBtbmdfdWludDggYml0ZGVwdGgpCit7CisgIHBuZ19pbWd0eXBlIHJldDsKKyAgc3dpdGNoIChiaXRkZXB0aCkKKyAgeworI2lmbmRlZiBNTkdfTk9fMV8yXzRCSVRfU1VQUE9SVAorICAgIGNhc2UgMToKKyAgICB7CisgICAgICBwbmdfaW1ndHlwZSBpbWd0eXBlW109e3BuZ19nMSxwbmdfbm9uZSxwbmdfbm9uZSxwbmdfaWR4MX07CisgICAgICByZXQ9aW1ndHlwZVtjb2xvcnR5cGVdOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgMjoKKyAgICB7CisgICAgICBwbmdfaW1ndHlwZSBpbWd0eXBlW109e3BuZ19nMixwbmdfbm9uZSxwbmdfbm9uZSxwbmdfaWR4Mn07CisgICAgICByZXQ9aW1ndHlwZVtjb2xvcnR5cGVdOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgNDoKKyAgICB7CisgICAgICBwbmdfaW1ndHlwZSBpbWd0eXBlW109e3BuZ19nNCxwbmdfbm9uZSxwbmdfbm9uZSxwbmdfaWR4NH07CisgICAgICByZXQ9aW1ndHlwZVtjb2xvcnR5cGVdOworICAgICAgYnJlYWs7CisgICAgfQorI2VuZGlmCisgICAgY2FzZSA4OgorICAgIHsKKyAgICAgIHBuZ19pbWd0eXBlIGltZ3R5cGVbXT17cG5nX2c4LHBuZ19ub25lLHBuZ19yZ2I4LHBuZ19pZHg4LHBuZ19nYTgsCisgICAgICAgICAgcG5nX25vbmUscG5nX3JnYmE4fTsKKyAgICAgIHJldD1pbWd0eXBlW2NvbG9ydHlwZV07CisgICAgICBicmVhazsKKyAgICB9CisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgY2FzZSAxNjoKKyAgICB7CisgICAgICBwbmdfaW1ndHlwZSBpbWd0eXBlW109e3BuZ19nMTYscG5nX25vbmUscG5nX3JnYjE2LHBuZ19ub25lLHBuZ19nYTE2LAorICAgICAgICAgIHBuZ19ub25lLHBuZ19yZ2JhMTZ9OworICAgICAgcmV0PWltZ3R5cGVbY29sb3J0eXBlXTsKKyAgICAgIGJyZWFrOworICAgIH0KKyNlbmRpZgorICAgIGRlZmF1bHQ6CisgICAgICByZXQ9cG5nX25vbmU7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gKHJldCk7Cit9CisjZW5kaWYgLyogTU5HX09QVElNSVpFX0ZPT1RQUklOVF9JTklUICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19wcm9jZXNzX2Rpc3BsYXlfaWhkciAobW5nX2RhdGFwIHBEYXRhKQoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkcmVzcyB0aGUgY3VycmVudCAib2JqZWN0IiBpZiBhbnkgKi8KKyAgbW5nX2ltYWdlcCBwSW1hZ2UgPSAobW5nX2ltYWdlcClwRGF0YS0+cEN1cnJlbnRvYmo7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX0lIRFIsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAoIXBEYXRhLT5iSGFzREhEUikKKyAgeworICAgIHBEYXRhLT5mSW5pdHJvd3Byb2MgPSBNTkdfTlVMTDsgICAgLyogZG8gbm90aGluZyBieSBkZWZhdWx0ICovCisgICAgcERhdGEtPmZEaXNwbGF5cm93ICA9IE1OR19OVUxMOworICAgIHBEYXRhLT5mQ29ycmVjdHJvdyAgPSBNTkdfTlVMTDsKKyAgICBwRGF0YS0+ZlN0b3Jlcm93ICAgID0gTU5HX05VTEw7CisgICAgcERhdGEtPmZQcm9jZXNzcm93ICA9IE1OR19OVUxMOworICAgIHBEYXRhLT5mRGlmZmVycm93ICAgPSBNTkdfTlVMTDsKKyAgICBwRGF0YS0+cFN0b3Jlb2JqICAgID0gTU5HX05VTEw7CisgIH0KKworICBpZiAoIXBEYXRhLT5pQnJlYWtwb2ludCkgICAgICAgICAgICAgLyogbm90IHByZXZpb3VzbHkgYnJva2VuID8gKi8KKyAgeworICAgIG1uZ19yZXRjb2RlIGlSZXRjb2RlID0gTU5HX05PRVJST1I7CisKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworICAgIGlmIChwRGF0YS0+Ykhhc0RIRFIpICAgICAgICAgICAgICAgLyogaXMgYSBkZWx0YS1pbWFnZSA/ICovCisgICAgeworICAgICAgaWYgKHBEYXRhLT5pRGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfUkVQTEFDRSkKKyAgICAgICAgaVJldGNvZGUgPSBtbmdfcmVzZXRfb2JqZWN0X2RldGFpbHMgKHBEYXRhLCAobW5nX2ltYWdlcClwRGF0YS0+cERlbHRhSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aURhdGF3aWR0aCwgcERhdGEtPmlEYXRhaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlCaXRkZXB0aCwgcERhdGEtPmlDb2xvcnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aUNvbXByZXNzaW9uLCBwRGF0YS0+aUZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pSW50ZXJsYWNlLCBNTkdfVFJVRSk7CisgICAgICBlbHNlCisgICAgICBpZiAoKHBEYXRhLT5pRGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfQkxPQ0tQSVhFTEFERCAgICApIHx8CisgICAgICAgICAgKHBEYXRhLT5pRGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfQkxPQ0tQSVhFTFJFUExBQ0UpICAgICkKKyAgICAgIHsKKyAgICAgICAgKChtbmdfaW1hZ2VwKXBEYXRhLT5wRGVsdGFJbWFnZSktPnBJbWdidWYtPmlQaXhlbHNhbXBsZWRlcHRoID0gcERhdGEtPmlCaXRkZXB0aDsKKyAgICAgICAgKChtbmdfaW1hZ2VwKXBEYXRhLT5wRGVsdGFJbWFnZSktPnBJbWdidWYtPmlBbHBoYXNhbXBsZWRlcHRoID0gcERhdGEtPmlCaXRkZXB0aDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIGlmICgocERhdGEtPmlEZWx0YXR5cGUgPT0gTU5HX0RFTFRBVFlQRV9CTE9DS0FMUEhBQUREICAgICkgfHwKKyAgICAgICAgICAocERhdGEtPmlEZWx0YXR5cGUgPT0gTU5HX0RFTFRBVFlQRV9CTE9DS0FMUEhBUkVQTEFDRSkgICAgKQorICAgICAgICAoKG1uZ19pbWFnZXApcERhdGEtPnBEZWx0YUltYWdlKS0+cEltZ2J1Zi0+aUFscGhhc2FtcGxlZGVwdGggPSBwRGF0YS0+aUJpdGRlcHRoOworICAgICAgZWxzZQorICAgICAgaWYgKChwRGF0YS0+aURlbHRhdHlwZSA9PSBNTkdfREVMVEFUWVBFX0JMT0NLQ09MT1JBREQgICAgKSB8fAorICAgICAgICAgIChwRGF0YS0+aURlbHRhdHlwZSA9PSBNTkdfREVMVEFUWVBFX0JMT0NLQ09MT1JSRVBMQUNFKSAgICApCisgICAgICAgICgobW5nX2ltYWdlcClwRGF0YS0+cERlbHRhSW1hZ2UpLT5wSW1nYnVmLT5pUGl4ZWxzYW1wbGVkZXB0aCA9IHBEYXRhLT5pQml0ZGVwdGg7CisKKyAgICAgIGlmICghaVJldGNvZGUpCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcm9jZXNzIGltbWVkaWF0ZWx5IGlmIGJpdGRlcHRoICYgY29sb3J0eXBlIGFyZSBlcXVhbCAqLworICAgICAgICBwRGF0YS0+YkRlbHRhaW1tZWRpYXRlID0KKyAgICAgICAgICAobW5nX2Jvb2wpKChwRGF0YS0+aUJpdGRlcHRoICA9PSAoKG1uZ19pbWFnZXApcERhdGEtPnBEZWx0YUltYWdlKS0+cEltZ2J1Zi0+aUJpdGRlcHRoICkgJiYKKyAgICAgICAgICAgICAgICAgICAgIChwRGF0YS0+aUNvbG9ydHlwZSA9PSAoKG1uZ19pbWFnZXApcERhdGEtPnBEZWx0YUltYWdlKS0+cEltZ2J1Zi0+aUNvbG9ydHlwZSkgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJlIHN1cmUgdG8gcmVzZXQgb2JqZWN0IDAgKi8KKyAgICAgICAgaVJldGNvZGUgPSBtbmdfcmVzZXRfb2JqZWN0X2RldGFpbHMgKHBEYXRhLCAobW5nX2ltYWdlcClwRGF0YS0+cE9ianplcm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aURhdGF3aWR0aCwgcERhdGEtPmlEYXRhaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlCaXRkZXB0aCwgcERhdGEtPmlDb2xvcnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aUNvbXByZXNzaW9uLCBwRGF0YS0+aUZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pSW50ZXJsYWNlLCBNTkdfVFJVRSk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgIHsKKyAgICAgIGlmIChwSW1hZ2UpICAgICAgICAgICAgICAgICAgICAgIC8qIHVwZGF0ZSBvYmplY3QgYnVmZmVyID8gKi8KKyAgICAgICAgaVJldGNvZGUgPSBtbmdfcmVzZXRfb2JqZWN0X2RldGFpbHMgKHBEYXRhLCBwSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aURhdGF3aWR0aCwgcERhdGEtPmlEYXRhaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlCaXRkZXB0aCwgcERhdGEtPmlDb2xvcnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aUNvbXByZXNzaW9uLCBwRGF0YS0+aUZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pSW50ZXJsYWNlLCBNTkdfVFJVRSk7CisgICAgICBlbHNlCisgICAgICAgIGlSZXRjb2RlID0gbW5nX3Jlc2V0X29iamVjdF9kZXRhaWxzIChwRGF0YSwgKG1uZ19pbWFnZXApcERhdGEtPnBPYmp6ZXJvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlEYXRhd2lkdGgsIHBEYXRhLT5pRGF0YWhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pQml0ZGVwdGgsIHBEYXRhLT5pQ29sb3J0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlDb21wcmVzc2lvbiwgcERhdGEtPmlGaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aUludGVybGFjZSwgTU5HX1RSVUUpOworICAgIH0KKworICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgfQorCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKKyAgaWYgKCFwRGF0YS0+Ykhhc0RIRFIpCisjZW5kaWYKKyAgeworICAgIGlmIChwSW1hZ2UpICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVhbCBvYmplY3QgPyAqLworICAgICAgcERhdGEtPnBTdG9yZW9iaiA9IHBJbWFnZTsgICAgICAgLyogdGVsbCB0aGUgcm93IHJvdXRpbmVzICovCisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvdGhlcndpc2UgdXNlIG9iamVjdCAwICovCisgICAgICBwRGF0YS0+cFN0b3Jlb2JqID0gcERhdGEtPnBPYmp6ZXJvOworCisjaWYgIWRlZmluZWQoTU5HX0lOQ0xVREVfTVBOR19QUk9QT1NBTCkgJiYgIWRlZmluZWQoTU5HX0lOQ0xVREVfQU5HX1BST1BPU0FMKQorICAgIGlmICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGlzcGxheSAib24tdGhlLWZseSIgPyAqLworI2lmbmRlZiBNTkdfU0tJUENIVU5LX01BR04KKyAgICAgICAgICgoKG1uZ19pbWFnZXApcERhdGEtPnBTdG9yZW9iaiktPmlNQUdOX01ldGhvZFggPT0gMCkgJiYKKyAgICAgICAgICgoKG1uZ19pbWFnZXApcERhdGEtPnBTdG9yZW9iaiktPmlNQUdOX01ldGhvZFkgPT0gMCkgJiYKKyNlbmRpZgorICAgICAgICAgKCAocERhdGEtPmVJbWFnZXR5cGUgPT0gbW5nX2l0X3BuZyAgICAgICAgICkgfHwKKyAgICAgICAgICAgKCgobW5nX2ltYWdlcClwRGF0YS0+cFN0b3Jlb2JqKS0+YlZpc2libGUpICAgICkgICAgICAgKQorICAgIHsKKyAgICAgIG5leHRfbGF5ZXIgKHBEYXRhKTsgICAgICAgICAgICAgIC8qIHRoYXQncyBhIG5ldyBsYXllciB0aGVuICEgKi8KKworICAgICAgaWYgKHBEYXRhLT5iVGltZXJzZXQpICAgICAgICAgICAgLyogdGltZXIgYnJlYWsgPyAqLworICAgICAgICBwRGF0YS0+aUJyZWFrcG9pbnQgPSAyOworICAgICAgZWxzZQorICAgICAgeworICAgICAgICBwRGF0YS0+aUJyZWFrcG9pbnQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW55dGhpbmcgdG8gZGlzcGxheSA/ICovCisgICAgICAgIGlmICgocERhdGEtPmlEZXN0ciA+IHBEYXRhLT5pRGVzdGwpICYmIChwRGF0YS0+aURlc3RiID4gcERhdGEtPmlEZXN0dCkpCisgICAgICAgICAgc2V0X2Rpc3BsYXlfcm91dGluZSAocERhdGEpOyAvKiB0aGVuIGRldGVybWluZSBkaXNwbGF5IHJvdXRpbmUgKi8KKyAgICAgIH0KKyAgICB9CisjZW5kaWYKKyAgfQorCisgIGlmICghcERhdGEtPmJUaW1lcnNldCkgICAgICAgICAgICAgICAvKiBubyB0aW1lciBicmVhayA/ICovCisgIHsKKyNpZmRlZiBNTkdfT1BUSU1JWkVfRk9PVFBSSU5UX0lOSVQKKyAgICBwRGF0YS0+ZkluaXRyb3dwcm9jID0gKG1uZ19mcHRyKW1uZ19pbml0X3Jvd3Byb2M7CisgICAgcERhdGEtPmVQbmdfaW1ndHlwZT1tbmdfcG5nX2ltZ3R5cGUocERhdGEtPmlDb2xvcnR5cGUscERhdGEtPmlCaXRkZXB0aCk7CisjZWxzZQorICAgIHN3aXRjaCAocERhdGEtPmlDb2xvcnR5cGUpICAgICAgICAgLyogZGV0ZXJtaW5lIHJvdyBpbml0aWFsaXphdGlvbiByb3V0aW5lICovCisgICAgeworICAgICAgY2FzZSAwIDogeyAgICAgICAgICAgICAgICAgICAgICAgLyogZ3JheSAqLworICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBEYXRhLT5pQml0ZGVwdGgpCisgICAgICAgICAgICAgICAgIHsKKyNpZm5kZWYgTU5HX05PXzFfMl80QklUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICBjYXNlICAxIDogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcERhdGEtPmlJbnRlcmxhY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZkluaXRyb3dwcm9jID0gKG1uZ19mcHRyKW1uZ19pbml0X2cxX25pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mSW5pdHJvd3Byb2MgPSAobW5nX2ZwdHIpbW5nX2luaXRfZzFfaTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgY2FzZSAgMiA6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBEYXRhLT5pSW50ZXJsYWNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZJbml0cm93cHJvYyA9IChtbmdfZnB0ciltbmdfaW5pdF9nMl9uaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZkluaXRyb3dwcm9jID0gKG1uZ19mcHRyKW1uZ19pbml0X2cyX2k7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgIGNhc2UgIDQgOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwRGF0YS0+aUludGVybGFjZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mSW5pdHJvd3Byb2MgPSAobW5nX2ZwdHIpbW5nX2luaXRfZzRfbmk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZJbml0cm93cHJvYyA9IChtbmdfZnB0ciltbmdfaW5pdF9nNF9pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogTU5HX05PXzFfMl80QklUX1NVUFBPUlQgKi8KKyAgICAgICAgICAgICAgICAgICBjYXNlICA4IDogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcERhdGEtPmlJbnRlcmxhY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZkluaXRyb3dwcm9jID0gKG1uZ19mcHRyKW1uZ19pbml0X2c4X25pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mSW5pdHJvd3Byb2MgPSAobW5nX2ZwdHIpbW5nX2luaXRfZzhfaTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgY2FzZSAxNiA6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBEYXRhLT5pSW50ZXJsYWNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZJbml0cm93cHJvYyA9IChtbmdfZnB0ciltbmdfaW5pdF9nMTZfbmk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZJbml0cm93cHJvYyA9IChtbmdfZnB0ciltbmdfaW5pdF9nMTZfaTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgfQorICAgICAgY2FzZSAyIDogeyAgICAgICAgICAgICAgICAgICAgICAgLyogcmdiICovCisgICAgICAgICAgICAgICAgIHN3aXRjaCAocERhdGEtPmlCaXRkZXB0aCkKKyAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIGNhc2UgIDggOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwRGF0YS0+aUludGVybGFjZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mSW5pdHJvd3Byb2MgPSAobW5nX2ZwdHIpbW5nX2luaXRfcmdiOF9uaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZkluaXRyb3dwcm9jID0gKG1uZ19mcHRyKW1uZ19pbml0X3JnYjhfaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgIGNhc2UgMTYgOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwRGF0YS0+aUludGVybGFjZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mSW5pdHJvd3Byb2MgPSAobW5nX2ZwdHIpbW5nX2luaXRfcmdiMTZfbmk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZJbml0cm93cHJvYyA9IChtbmdfZnB0ciltbmdfaW5pdF9yZ2IxNl9pOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICB9CisgICAgICBjYXNlIDMgOiB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBpbmRleGVkICovCisgICAgICAgICAgICAgICAgIHN3aXRjaCAocERhdGEtPmlCaXRkZXB0aCkKKyAgICAgICAgICAgICAgICAgeworI2lmbmRlZiBNTkdfTk9fMV8yXzRCSVRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgIGNhc2UgIDEgOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwRGF0YS0+aUludGVybGFjZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mSW5pdHJvd3Byb2MgPSAobW5nX2ZwdHIpbW5nX2luaXRfaWR4MV9uaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZkluaXRyb3dwcm9jID0gKG1uZ19mcHRyKW1uZ19pbml0X2lkeDFfaTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgY2FzZSAgMiA6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBEYXRhLT5pSW50ZXJsYWNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZJbml0cm93cHJvYyA9IChtbmdfZnB0ciltbmdfaW5pdF9pZHgyX25pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mSW5pdHJvd3Byb2MgPSAobW5nX2ZwdHIpbW5nX2luaXRfaWR4Ml9pOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICBjYXNlICA0IDogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcERhdGEtPmlJbnRlcmxhY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZkluaXRyb3dwcm9jID0gKG1uZ19mcHRyKW1uZ19pbml0X2lkeDRfbmk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZJbml0cm93cHJvYyA9IChtbmdfZnB0ciltbmdfaW5pdF9pZHg0X2k7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIE1OR19OT18xXzJfNEJJVF9TVVBQT1JUICovCisgICAgICAgICAgICAgICAgICAgY2FzZSAgOCA6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBEYXRhLT5pSW50ZXJsYWNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZJbml0cm93cHJvYyA9IChtbmdfZnB0ciltbmdfaW5pdF9pZHg4X25pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mSW5pdHJvd3Byb2MgPSAobW5nX2ZwdHIpbW5nX2luaXRfaWR4OF9pOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgfQorICAgICAgY2FzZSA0IDogeyAgICAgICAgICAgICAgICAgICAgICAgLyogZ3JheSthbHBoYSAqLworICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBEYXRhLT5pQml0ZGVwdGgpCisgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICBjYXNlICA4IDogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcERhdGEtPmlJbnRlcmxhY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZkluaXRyb3dwcm9jID0gKG1uZ19mcHRyKW1uZ19pbml0X2dhOF9uaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZkluaXRyb3dwcm9jID0gKG1uZ19mcHRyKW1uZ19pbml0X2dhOF9pOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICBjYXNlIDE2IDogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcERhdGEtPmlJbnRlcmxhY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZkluaXRyb3dwcm9jID0gKG1uZ19mcHRyKW1uZ19pbml0X2dhMTZfbmk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZJbml0cm93cHJvYyA9IChtbmdfZnB0ciltbmdfaW5pdF9nYTE2X2k7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICB9CisgICAgICBjYXNlIDYgOiB7ICAgICAgICAgICAgICAgICAgICAgICAvKiByZ2IrYWxwaGEgKi8KKyAgICAgICAgICAgICAgICAgc3dpdGNoIChwRGF0YS0+aUJpdGRlcHRoKQorICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgY2FzZSAgOCA6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBEYXRhLT5pSW50ZXJsYWNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZJbml0cm93cHJvYyA9IChtbmdfZnB0ciltbmdfaW5pdF9yZ2JhOF9uaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZkluaXRyb3dwcm9jID0gKG1uZ19mcHRyKW1uZ19pbml0X3JnYmE4X2k7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgIGNhc2UgMTYgOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwRGF0YS0+aUludGVybGFjZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mSW5pdHJvd3Byb2MgPSAobW5nX2ZwdHIpbW5nX2luaXRfcmdiYTE2X25pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mSW5pdHJvd3Byb2MgPSAobW5nX2ZwdHIpbW5nX2luaXRfcmdiYTE2X2k7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogTU5HX09QVElNSVpFX0ZPT1RQUklOVF9JTklUICovCisKKyAgICBwRGF0YS0+aUZpbHRlcm9mcyA9IDA7ICAgICAgICAgICAgIC8qIGRldGVybWluZSBmaWx0ZXIgY2hhcmFjdGVyaXN0aWNzICovCisgICAgcERhdGEtPmlMZXZlbDAgICAgPSAwOyAgICAgICAgICAgICAvKiBkZWZhdWx0IGxldmVscyAqLworICAgIHBEYXRhLT5pTGV2ZWwxICAgID0gMDsgICAgCisgICAgcERhdGEtPmlMZXZlbDIgICAgPSAwOworICAgIHBEYXRhLT5pTGV2ZWwzICAgID0gMDsKKworI2lmZGVmIEZJTFRFUjE5MiAgICAgICAgICAgICAgICAgICAgICAgLyogbGV2ZWxpbmcgJiBkaWZmZXJpbmcgPyAqLworICAgIGlmIChwRGF0YS0+aUZpbHRlciA9PSBNTkdfRklMVEVSX0RJRkZFUklORykKKyAgICB7CisgICAgICBzd2l0Y2ggKHBEYXRhLT5pQ29sb3J0eXBlKQorICAgICAgeworICAgICAgICBjYXNlIDAgOiB7CisgICAgICAgICAgICAgICAgICAgaWYgKHBEYXRhLT5pQml0ZGVwdGggPD0gOCkKKyAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pRmlsdGVyb2ZzID0gMTsKKyAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aUZpbHRlcm9mcyA9IDI7CisKKyAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICBjYXNlIDIgOiB7CisgICAgICAgICAgICAgICAgICAgaWYgKHBEYXRhLT5pQml0ZGVwdGggPD0gOCkKKyAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pRmlsdGVyb2ZzID0gMzsKKyAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aUZpbHRlcm9mcyA9IDY7CisKKyAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICBjYXNlIDMgOiB7CisgICAgICAgICAgICAgICAgICAgcERhdGEtPmlGaWx0ZXJvZnMgPSAxOworICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICB9CisgICAgICAgIGNhc2UgNCA6IHsKKyAgICAgICAgICAgICAgICAgICBpZiAocERhdGEtPmlCaXRkZXB0aCA8PSA4KQorICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlGaWx0ZXJvZnMgPSAyOworICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pRmlsdGVyb2ZzID0gNDsKKworICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICB9CisgICAgICAgIGNhc2UgNiA6IHsKKyAgICAgICAgICAgICAgICAgICBpZiAocERhdGEtPmlCaXRkZXB0aCA8PSA4KQorICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlGaWx0ZXJvZnMgPSA0OworICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pRmlsdGVyb2ZzID0gODsKKworICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICB9CisgICAgICB9CisgICAgfQorI2VuZGlmCisKKyNpZmRlZiBGSUxURVIxOTMgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vIGFkYXB0aXZlIGZpbHRlcmluZyA/ICovCisgICAgaWYgKHBEYXRhLT5pRmlsdGVyID09IE1OR19GSUxURVJfTk9GSUxURVIpCisgICAgICBwRGF0YS0+aVBpeGVsb2ZzID0gcERhdGEtPmlGaWx0ZXJvZnM7CisgICAgZWxzZQorI2VuZGlmICAgIAorICAgICAgcERhdGEtPmlQaXhlbG9mcyA9IHBEYXRhLT5pRmlsdGVyb2ZzICsgMTsKKworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX0lIRFIsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX0lOQ0xVREVfTVBOR19QUk9QT1NBTAorbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfZGlzcGxheV9tcG5nIChtbmdfZGF0YXAgcERhdGEpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST0NFU1NfRElTUExBWV9NUE5HLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcERhdGEtPmlBbHBoYWRlcHRoID0gODsgICAgICAgICAgICAgIC8qIGFzc3VtZSB0cmFuc3BhcmVuY3kgISEgKi8KKworICBpZiAocERhdGEtPmZQcm9jZXNzaGVhZGVyKSAgICAgICAgICAgLyogaW5mb3JtIHRoZSBhcHAgKGNyZWF0aW5nIHRoZSBvdXRwdXQgY2FudmFzKSA/ICovCisgIHsKKyAgICBwRGF0YS0+aVdpZHRoICA9ICgobW5nX21wbmdfb2JqcClwRGF0YS0+cE1QTkcpLT5pRnJhbWV3aWR0aDsKKyAgICBwRGF0YS0+aUhlaWdodCA9ICgobW5nX21wbmdfb2JqcClwRGF0YS0+cE1QTkcpLT5pRnJhbWVoZWlnaHQ7CisKKyAgICBpZiAoIXBEYXRhLT5mUHJvY2Vzc2hlYWRlciAoKChtbmdfaGFuZGxlKXBEYXRhKSwgcERhdGEtPmlXaWR0aCwgcERhdGEtPmlIZWlnaHQpKQorICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0FQUE1JU0NFUlJPUik7CisgIH0KKworICBuZXh0X2xheWVyIChwRGF0YSk7ICAgICAgICAgICAgICAgICAgLyogZmlyc3QgbVBORyBsYXllciB0aGVuICEgKi8KKyAgcERhdGEtPmJUaW1lcnNldCAgID0gTU5HX0ZBTFNFOworICBwRGF0YS0+aUJyZWFrcG9pbnQgPSAwOworCisgIGlmICgocERhdGEtPmlEZXN0ciA+IHBEYXRhLT5pRGVzdGwpICYmIChwRGF0YS0+aURlc3RiID4gcERhdGEtPmlEZXN0dCkpCisgICAgc2V0X2Rpc3BsYXlfcm91dGluZSAocERhdGEpOyAgICAgICAvKiB0aGVuIGRldGVybWluZSBkaXNwbGF5IHJvdXRpbmUgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9DRVNTX0RJU1BMQVlfTVBORywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19JTkNMVURFX0FOR19QUk9QT1NBTAorbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfZGlzcGxheV9hbmcgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX0FORywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmIChwRGF0YS0+ZlByb2Nlc3NoZWFkZXIpICAgICAgICAgICAvKiBpbmZvcm0gdGhlIGFwcCAoY3JlYXRpbmcgdGhlIG91dHB1dCBjYW52YXMpID8gKi8KKyAgeworICAgIGlmICghcERhdGEtPmZQcm9jZXNzaGVhZGVyICgoKG1uZ19oYW5kbGUpcERhdGEpLCBwRGF0YS0+aVdpZHRoLCBwRGF0YS0+aUhlaWdodCkpCisgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfQVBQTUlTQ0VSUk9SKTsKKyAgfQorCisgIG5leHRfbGF5ZXIgKHBEYXRhKTsgICAgICAgICAgICAgICAgICAvKiBmaXJzdCBtUE5HIGxheWVyIHRoZW4gISAqLworICBwRGF0YS0+YlRpbWVyc2V0ICAgPSBNTkdfRkFMU0U7CisgIHBEYXRhLT5pQnJlYWtwb2ludCA9IDA7CisKKyAgaWYgKChwRGF0YS0+aURlc3RyID4gcERhdGEtPmlEZXN0bCkgJiYgKHBEYXRhLT5pRGVzdGIgPiBwRGF0YS0+aURlc3R0KSkKKyAgICBzZXRfZGlzcGxheV9yb3V0aW5lIChwRGF0YSk7ICAgICAgIC8qIHRoZW4gZGV0ZXJtaW5lIGRpc3BsYXkgcm91dGluZSAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST0NFU1NfRElTUExBWV9BTkcsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0RJU1BMQVlDQUxMUworbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfZGlzcGxheV9pZGF0IChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlSYXdsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcFJhd2RhdGEpCisjZWxzZQorbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfZGlzcGxheV9pZGF0IChtbmdfZGF0YXAgIHBEYXRhKQorI2VuZGlmCit7CisgIG1uZ19yZXRjb2RlIGlSZXRjb2RlID0gTU5HX05PRVJST1I7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX0lEQVQsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoTU5HX0lOQ0xVREVfTVBOR19QUk9QT1NBTCkgfHwgZGVmaW5lZChNTkdfSU5DTFVERV9BTkdfUFJPUE9TQUwpIAorICBpZiAoKHBEYXRhLT5lSW1hZ2V0eXBlID09IG1uZ19pdF9wbmcpICYmIChwRGF0YS0+aUxheWVyc2VxIDw9IDApKQorICB7CisgICAgaWYgKHBEYXRhLT5mUHJvY2Vzc2hlYWRlcikgICAgICAgICAvKiBpbmZvcm0gdGhlIGFwcCAoY3JlYXRpbmcgdGhlIG91dHB1dCBjYW52YXMpID8gKi8KKyAgICAgIGlmICghcERhdGEtPmZQcm9jZXNzaGVhZGVyICgoKG1uZ19oYW5kbGUpcERhdGEpLCBwRGF0YS0+aVdpZHRoLCBwRGF0YS0+aUhlaWdodCkpCisgICAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19BUFBNSVNDRVJST1IpOworCisgICAgbmV4dF9sYXllciAocERhdGEpOyAgICAgICAgICAgICAgICAvKiBmaXJzdCByZWd1bGFyIFBORyBsYXllciB0aGVuICEgKi8KKyAgICBwRGF0YS0+YlRpbWVyc2V0ICAgPSBNTkdfRkFMU0U7CisgICAgcERhdGEtPmlCcmVha3BvaW50ID0gMDsKKworICAgIGlmICgocERhdGEtPmlEZXN0ciA+IHBEYXRhLT5pRGVzdGwpICYmIChwRGF0YS0+aURlc3RiID4gcERhdGEtPmlEZXN0dCkpCisgICAgICBzZXRfZGlzcGxheV9yb3V0aW5lIChwRGF0YSk7ICAgICAvKiB0aGVuIGRldGVybWluZSBkaXNwbGF5IHJvdXRpbmUgKi8KKyAgfQorI2VuZGlmCisKKyAgaWYgKHBEYXRhLT5iUmVzdG9yZWJrZ2QpICAgICAgICAgICAgIC8qIG5lZWQgdG8gcmVzdG9yZSB0aGUgYmFja2dyb3VuZCA/ICovCisgIHsKKyAgICBwRGF0YS0+YlJlc3RvcmVia2dkID0gTU5HX0ZBTFNFOworICAgIGlSZXRjb2RlICAgICAgICAgICAgPSBsb2FkX2JrZ2RsYXllciAocERhdGEpOworCisgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgcmV0dXJuIGlSZXRjb2RlOworCisgICAgcERhdGEtPmlMYXllcnNlcSsrOyAgICAgICAgICAgICAgICAvKiBhbmQgaXQgY291bnRzIGFzIGEgbGF5ZXIgdGhlbiAhICovCisgIH0KKworICBpZiAocERhdGEtPmZJbml0cm93cHJvYykgICAgICAgICAgICAgLyogbmVlZCB0byBpbml0aWFsaXplIHJvdyBwcm9jZXNzaW5nPyAqLworICB7CisgICAgaVJldGNvZGUgPSAoKG1uZ19pbml0cm93cHJvYylwRGF0YS0+ZkluaXRyb3dwcm9jKSAocERhdGEpOworICAgIHBEYXRhLT5mSW5pdHJvd3Byb2MgPSBNTkdfTlVMTDsgICAgLyogb25seSBjYWxsIHRoaXMgb25jZSAhISEgKi8KKyAgfQorCisgIGlmICgoIWlSZXRjb2RlKSAmJiAoIXBEYXRhLT5iSW5mbGF0aW5nKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpemUgaW5mbGF0ZSAqLworICAgIGlSZXRjb2RlID0gbW5nemxpYl9pbmZsYXRlaW5pdCAocERhdGEpOworCisgIGlmICghaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgICAvKiBhbGwgb2s/IHRoZW4gaW5mbGF0ZSwgbXkgbWFuICovCisjaWZuZGVmIE1OR19PUFRJTUlaRV9ESVNQTEFZQ0FMTFMKKyAgICBpUmV0Y29kZSA9IG1uZ3psaWJfaW5mbGF0ZXJvd3MgKHBEYXRhLCBpUmF3bGVuLCBwUmF3ZGF0YSk7CisjZWxzZQorICAgIGlSZXRjb2RlID0gbW5nemxpYl9pbmZsYXRlcm93cyAocERhdGEsIHBEYXRhLT5pUmF3bGVuLCBwRGF0YS0+cFJhd2RhdGEpOworI2VuZGlmCisKKyAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgcmV0dXJuIGlSZXRjb2RlOworICAgIAorI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9DRVNTX0RJU1BMQVlfSURBVCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19wcm9jZXNzX2Rpc3BsYXlfaWVuZCAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfcmV0Y29kZSBpUmV0Y29kZSwgaVJldGNvZGUyOworICBtbmdfYm9vbCBiRG9kaXNwbGF5ID0gTU5HX0ZBTFNFOworICBtbmdfYm9vbCBiTWFnbmlmeSAgID0gTU5HX0ZBTFNFOworICBtbmdfYm9vbCBiQ2xlYW51cCAgID0gKG1uZ19ib29sKShwRGF0YS0+aUJyZWFrcG9pbnQgIT0gMCk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX0lFTkQsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworI2lmZGVmIE1OR19JTkNMVURFX0pORyAgICAgICAgICAgICAgICAgLyogcHJvZ3Jlc3NpdmUrYWxwaGEgSk5HIGNhbiBiZSBkaXNwbGF5ZWQgbm93ICovCisgIGlmICggKHBEYXRhLT5iSGFzSkhEUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAmJgorICAgICAgICggKHBEYXRhLT5iSlBFR3Byb2dyZXNzaXZlKSB8fCAocERhdGEtPmJKUEVHcHJvZ3Jlc3NpdmUyKSkgJiYKKyAgICAgICAoIChwRGF0YS0+ZUltYWdldHlwZSA9PSBtbmdfaXRfam5nICAgICAgICAgKSB8fAorICAgICAgICAgKCgobW5nX2ltYWdlcClwRGF0YS0+cFN0b3Jlb2JqKS0+YlZpc2libGUpICAgICAgICAgICAgICkgJiYKKyAgICAgICAoIChwRGF0YS0+aUpIRFJjb2xvcnR5cGUgPT0gTU5HX0NPTE9SVFlQRV9KUEVHR1JBWUEgKSB8fAorICAgICAgICAgKHBEYXRhLT5pSkhEUmNvbG9ydHlwZSA9PSBNTkdfQ09MT1JUWVBFX0pQRUdDT0xPUkEpICAgICkgICAgKQorICAgIGJEb2Rpc3BsYXkgPSBNTkdfVFJVRTsKKyNlbmRpZgorCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfTUFHTgorICBpZiAoIChwRGF0YS0+cFN0b3Jlb2JqKSAmJiAgICAgICAgICAgLyogb24tdGhlLWZseSBtYWduaWZpY2F0aW9uID8gKi8KKyAgICAgICAoICgoKG1uZ19pbWFnZXApcERhdGEtPnBTdG9yZW9iaiktPmlNQUdOX01ldGhvZFgpIHx8CisgICAgICAgICAoKChtbmdfaW1hZ2VwKXBEYXRhLT5wU3RvcmVvYmopLT5pTUFHTl9NZXRob2RZKSAgICApICkKKyAgICBiTWFnbmlmeSA9IE1OR19UUlVFOworI2VuZGlmCisKKyAgaWYgKChwRGF0YS0+Ykhhc0JBU0kpIHx8ICAgICAgICAgICAgIC8qIHdhcyBpdCBhIEJBU0kgc3RyZWFtICovCisgICAgICAoYkRvZGlzcGxheSkgICAgICB8fCAgICAgICAgICAgICAvKiBvciBzaG91bGQgd2UgZGlzcGxheSB0aGUgSk5HICovCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfTUFHTgorICAgICAgKGJNYWduaWZ5KSAgICAgICAgfHwgICAgICAgICAgICAgLyogb3Igc2hvdWxkIHdlIG1hZ25pZnkgaXQgKi8KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3IgZGlkIHdlIGdldCBicm9rZW4gaGVyZSBsYXN0IHRpbWUgPyAqLworICAgICAgKChwRGF0YS0+aUJyZWFrcG9pbnQpICYmIChwRGF0YS0+aUJyZWFrcG9pbnQgIT0gOCkpKQorICB7CisgICAgbW5nX2ltYWdlcCBwSW1hZ2UgPSAobW5nX2ltYWdlcClwRGF0YS0+cEN1cnJlbnRvYmo7CisKKyAgICBpZiAoIXBJbWFnZSkgICAgICAgICAgICAgICAgICAgICAgIC8qIG9yIHdhcyBpdCBvYmplY3QgMCA/ICovCisgICAgICBwSW1hZ2UgPSAobW5nX2ltYWdlcClwRGF0YS0+cE9ianplcm87CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkaXNwbGF5IGl0IG5vdyB0aGVuID8gKi8KKyAgICBpZiAoKHBJbWFnZS0+YlZpc2libGUpICYmIChwSW1hZ2UtPmJWaWV3YWJsZSkpCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvaywgc28gZG8gaXQgKi8KKyAgICAgIGlSZXRjb2RlID0gbW5nX2Rpc3BsYXlfaW1hZ2UgKHBEYXRhLCBwSW1hZ2UsIGJEb2Rpc3BsYXkpOworCisgICAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgICByZXR1cm4gaVJldGNvZGU7CisKKyAgICAgIGlmIChwRGF0YS0+YlRpbWVyc2V0KSAgICAgICAgICAgIC8qIHRpbWVyIGJyZWFrID8gKi8KKyAgICAgICAgcERhdGEtPmlCcmVha3BvaW50ID0gNjsKKyAgICB9CisgIH0KKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworICBlbHNlCisgIGlmICgocERhdGEtPmJIYXNESERSKSB8fCAgICAgICAgICAgICAvKiB3YXMgaXQgYSBESERSIHN0cmVhbSAqLworICAgICAgKHBEYXRhLT5pQnJlYWtwb2ludCA9PSA4KSkgICAgICAgLyogb3IgZGlkIHdlIGdldCBicm9rZW4gaGVyZSBsYXN0IHRpbWUgPyAqLworICB7CisgICAgbW5nX2ltYWdlcCBwSW1hZ2UgPSAobW5nX2ltYWdlcClwRGF0YS0+cERlbHRhSW1hZ2U7CisKKyAgICBpZiAoIXBEYXRhLT5pQnJlYWtwb2ludCkKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBlcmZvcm0gdGhlIGRlbHRhIG9wZXJhdGlvbnMgbmVlZGVkICovCisgICAgICBpUmV0Y29kZSA9IG1uZ19leGVjdXRlX2RlbHRhX2ltYWdlIChwRGF0YSwgcEltYWdlLCAobW5nX2ltYWdlcClwRGF0YS0+cE9ianplcm8pOworCisgICAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGlzcGxheSBpdCBub3cgdGhlbiA/ICovCisgICAgaWYgKChwSW1hZ2UtPmJWaXNpYmxlKSAmJiAocEltYWdlLT5iVmlld2FibGUpKQorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb2ssIHNvIGRvIGl0ICovCisgICAgICBpUmV0Y29kZSA9IG1uZ19kaXNwbGF5X2ltYWdlIChwRGF0YSwgcEltYWdlLCBNTkdfRkFMU0UpOworCisgICAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgICByZXR1cm4gaVJldGNvZGU7CisKKyAgICAgIGlmIChwRGF0YS0+YlRpbWVyc2V0KSAgICAgICAgICAgIC8qIHRpbWVyIGJyZWFrID8gKi8KKyAgICAgICAgcERhdGEtPmlCcmVha3BvaW50ID0gODsKKyAgICB9CisgIH0KKyNlbmRpZgorCisgIGlmICghcERhdGEtPmJUaW1lcnNldCkgICAgICAgICAgICAgICAvKiBjYW4gd2UgY29udGludWUgPyAqLworICB7CisgICAgcERhdGEtPmlCcmVha3BvaW50ID0gMDsgICAgICAgICAgICAvKiBjbGVhciB0aGlzIGZsYWcgbm93ICEgKi8KKworCisjaWZkZWYgTU5HX0lOQ0xVREVfTVBOR19QUk9QT1NBTAorICAgIGlmIChwRGF0YS0+ZUltYWdldHlwZSA9PSBtbmdfaXRfbXBuZykKKyAgICB7CisgICAgICBwRGF0YS0+cEN1cnJhbmlvYmogPSBwRGF0YS0+cEZpcnN0YW5pb2JqOworICAgIH0gZWxzZQorI2VuZGlmCisjaWZkZWYgTU5HX0lOQ0xVREVfQU5HX1BST1BPU0FMCisgICAgaWYgKHBEYXRhLT5lSW1hZ2V0eXBlID09IG1uZ19pdF9hbmcpCisgICAgeworICAgICAgcERhdGEtPnBDdXJyYW5pb2JqID0gcERhdGEtPnBGaXJzdGFuaW9iajsKKyAgICB9IGVsc2UKKyNlbmRpZgorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2xlYW51cCBvYmplY3QgMCAqLworICAgICAgbW5nX3Jlc2V0X29iamVjdF9kZXRhaWxzIChwRGF0YSwgKG1uZ19pbWFnZXApcERhdGEtPnBPYmp6ZXJvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCBNTkdfVFJVRSk7CisgICAgfQorCisgICAgaWYgKHBEYXRhLT5iSW5mbGF0aW5nKSAgICAgICAgICAgICAvKiBpZiB3ZSd2ZSBiZWVuIGluZmxhdGluZyAqLworICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2xlYW51cCByb3ctcHJvY2Vzc2luZywgKi8KKyAgICAgIGlSZXRjb2RlICA9IG1uZ19jbGVhbnVwX3Jvd3Byb2MgKHBEYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFsc28gY2xlYW51cCBpbmZsYXRlISAqLworICAgICAgaVJldGNvZGUyID0gbW5nemxpYl9pbmZsYXRlZnJlZSAocERhdGEpOworCisgICAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICBpZiAoaVJldGNvZGUyKQorICAgICAgICByZXR1cm4gaVJldGNvZGUyOworICAgIH0KKworI2lmZGVmIE1OR19JTkNMVURFX0pORworICAgIGlmIChwRGF0YS0+YkpQRUdkZWNvbXByZXNzKSAgICAgICAgLyogaWYgd2UndmUgYmVlbiBkZWNvbXByZXNzaW5nIEpEQVQgKi8KKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNsZWFudXAgcm93LXByb2Nlc3NpbmcsICovCisgICAgICBpUmV0Y29kZSAgPSBtbmdfY2xlYW51cF9yb3dwcm9jIChwRGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbHNvIGNsZWFudXAgZGVjb21wcmVzcyEgKi8KKyAgICAgIGlSZXRjb2RlMiA9IG1uZ2pwZWdfZGVjb21wcmVzc2ZyZWUgKHBEYXRhKTsKKworICAgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgICAgcmV0dXJuIGlSZXRjb2RlOworICAgICAgaWYgKGlSZXRjb2RlMikKKyAgICAgICAgcmV0dXJuIGlSZXRjb2RlMjsKKyAgICB9CisKKyAgICBpZiAocERhdGEtPmJKUEVHZGVjb21wcmVzczIpICAgICAgIC8qIGlmIHdlJ3ZlIGJlZW4gZGVjb21wcmVzc2luZyBKREFBICovCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjbGVhbnVwIHJvdy1wcm9jZXNzaW5nLCAqLworICAgICAgaVJldGNvZGUgID0gbW5nX2NsZWFudXBfcm93cHJvYyAocERhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWxzbyBjbGVhbnVwIGRlY29tcHJlc3MhICovCisgICAgICBpUmV0Y29kZTIgPSBtbmdqcGVnX2RlY29tcHJlc3NmcmVlMiAocERhdGEpOworCisgICAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICBpZiAoaVJldGNvZGUyKQorICAgICAgICByZXR1cm4gaVJldGNvZGUyOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKGJDbGVhbnVwKSAgICAgICAgICAgICAgICAgICAgICAvKiBpZiB3ZSBnb3QgYnJva2VuIGxhc3QgdGltZSB3ZSBuZWVkIHRvIGNsZWFudXAgKi8KKyAgICB7CisgICAgICBwRGF0YS0+Ykhhc0lIRFIgPSBNTkdfRkFMU0U7ICAgICAvKiBJRU5EIHNpZ25hbHMgdGhlIGVuZCBmb3IgbW9zdCAuLi4gKi8KKyAgICAgIHBEYXRhLT5iSGFzQkFTSSA9IE1OR19GQUxTRTsKKyAgICAgIHBEYXRhLT5iSGFzREhEUiA9IE1OR19GQUxTRTsKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgICAgIHBEYXRhLT5iSGFzSkhEUiA9IE1OR19GQUxTRTsKKyAgICAgIHBEYXRhLT5iSGFzSlNFUCA9IE1OR19GQUxTRTsKKyAgICAgIHBEYXRhLT5iSGFzSkRBQSA9IE1OR19GQUxTRTsKKyAgICAgIHBEYXRhLT5iSGFzSkRBVCA9IE1OR19GQUxTRTsKKyNlbmRpZgorICAgICAgcERhdGEtPmJIYXNQTFRFID0gTU5HX0ZBTFNFOworICAgICAgcERhdGEtPmJIYXNUUk5TID0gTU5HX0ZBTFNFOworICAgICAgcERhdGEtPmJIYXNHQU1BID0gTU5HX0ZBTFNFOworICAgICAgcERhdGEtPmJIYXNDSFJNID0gTU5HX0ZBTFNFOworICAgICAgcERhdGEtPmJIYXNTUkdCID0gTU5HX0ZBTFNFOworICAgICAgcERhdGEtPmJIYXNJQ0NQID0gTU5HX0ZBTFNFOworICAgICAgcERhdGEtPmJIYXNCS0dEID0gTU5HX0ZBTFNFOworICAgICAgcERhdGEtPmJIYXNJREFUID0gTU5HX0ZBTFNFOworICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmIHRoZSBpbWFnZSB3YXMgZGlzcGxheWVkIG9uIHRoZSBmbHksICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSdsbCBoYXZlIHRvIG1ha2UgdGhlIGFwcCByZWZyZXNoICovCisgICAgaWYgKChwRGF0YS0+ZUltYWdldHlwZSAhPSBtbmdfaXRfbW5nKSAmJiAocERhdGEtPmZEaXNwbGF5cm93KSkKKyAgICAgIHBEYXRhLT5iTmVlZHJlZnJlc2ggPSBNTkdfVFJVRTsKKyAgICAgCisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9DRVNTX0RJU1BMQVlfSUVORCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKy8qIGNoYW5nZSBpbiB0aGUgTU5HIHNwZWMgd2l0aCByZWdhcmRzIHRvIFRFUk0gZGVsYXkgJiBpbnRlcmZyYW1lX2RlbGF5CisgICBhcyBwcm9wb3NlZCBieSBBZGFtIE0uIENvc3RlbGxvIChvcHRpb24gNCkgYW5kIGZpbmFsaXplZCBieSBvZmZpY2lhbCB2b3RlCisgICBkdXJpbmcgZGVjZW1iZXIgMjAwMiAvIGNoZWNrIHRoZSAnbW5nLWxpc3QnIGFyY2hpdmVzIGZvciBtb3JlIGRldGFpbHMgKi8KKworbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfZGlzcGxheV9tZW5kIChtbmdfZGF0YXAgcERhdGEpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST0NFU1NfRElTUExBWV9NRU5ELCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9EWU5BTUlDTU5HCisgIGlmIChwRGF0YS0+YlN0b3BhZnRlcnNlZWspICAgICAgICAgICAvKiBuZWVkIHRvIHN0b3AgYWZ0ZXIgdGhpcyA/ICovCisgIHsKKyAgICBwRGF0YS0+YkZyZWV6aW5nICAgICAgPSBNTkdfVFJVRTsgIC8qIHN0b3AgcHJvY2Vzc2luZyBvbiB0aGlzIG9uZSAqLworICAgIHBEYXRhLT5iUnVubmluZ2V2ZW50ICA9IE1OR19GQUxTRTsKKyAgICBwRGF0YS0+YlN0b3BhZnRlcnNlZWsgPSBNTkdfRkFMU0U7CisgICAgcERhdGEtPmJOZWVkcmVmcmVzaCAgID0gTU5HX1RSVUU7ICAvKiBtYWtlIHN1cmUgdGhlIGxhc3QgYml0IGlzIGRpc3BsYXllZCAhICovCisgIH0KKyNlbmRpZgorCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfVEVSTQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVEVSTSBwcm9jZXNzZWQgPyAqLworICBpZiAoKHBEYXRhLT5iRGlzcGxheWluZykgJiYgKHBEYXRhLT5iUnVubmluZykgJiYKKyAgICAgIChwRGF0YS0+Ykhhc1RFUk0pICYmIChwRGF0YS0+cFRlcm1hbmlvYmopKQorICB7CisgICAgbW5nX3JldGNvZGUgICBpUmV0Y29kZTsKKyAgICBtbmdfYW5pX3Rlcm1wIHBURVJNOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0IHRoZSByaWdodCBhbmltYXRpb24gb2JqZWN0ICEgKi8KKyAgICBwVEVSTSA9IChtbmdfYW5pX3Rlcm1wKXBEYXRhLT5wVGVybWFuaW9iajsKKworICAgIHBEYXRhLT5pSXRlcmF0aW9ucysrOyAgICAgICAgICAgICAgLyogaW5jcmVhc2UgaXRlcmF0aW9uIGNvdW50ICovCisKKyAgICBzd2l0Y2ggKHBURVJNLT5pVGVybWFjdGlvbikgICAgICAgIC8qIGRldGVybWluZSB3aGF0IHRvIGRvISAqLworICAgIHsKKyAgICAgIGNhc2UgMCA6IHsgICAgICAgICAgICAgICAgICAgICAgIC8qIHNob3cgbGFzdCBmcmFtZSBpbmRlZmluaXRseSAqLworICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgLyogcGllY2Ugb2YgY2FrZSwgdGhhdCBpcy4uLiAqLworICAgICAgICAgICAgICAgfQorCisgICAgICBjYXNlIDEgOiB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBjZWFzZSBkaXNwbGF5aW5nIGFueXRoaW5nICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXgoMSwgVEVSTSBkZWxheSwgaW50ZXJmcmFtZV9kZWxheSkgKi8KKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19GUkFNCisgICAgICAgICAgICAgICAgIGlmIChwVEVSTS0+aURlbGF5ID4gcERhdGEtPmlGcmFtZWRlbGF5KQorICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pRnJhbWVkZWxheSA9IHBURVJNLT5pRGVsYXk7CisgICAgICAgICAgICAgICAgIGlmICghcERhdGEtPmlGcmFtZWRlbGF5KQorICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pRnJhbWVkZWxheSA9IDE7CisjZW5kaWYKKworICAgICAgICAgICAgICAgICBpUmV0Y29kZSA9IGludGVyZnJhbWVfZGVsYXkgKHBEYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vIGludGVyZnJhbWVfZGVsYXk/IHRoZW4gZmFrZSBpdCAqLworICAgICAgICAgICAgICAgICBpZiAoKCFpUmV0Y29kZSkgJiYgKCFwRGF0YS0+YlRpbWVyc2V0KSkKKyAgICAgICAgICAgICAgICAgICBpUmV0Y29kZSA9IHNldF9kZWxheSAocERhdGEsIDEpOworCisgICAgICAgICAgICAgICAgIGlmIChpUmV0Y29kZSkKKyAgICAgICAgICAgICAgICAgICByZXR1cm4gaVJldGNvZGU7CisKKyAgICAgICAgICAgICAgICAgcERhdGEtPmlCcmVha3BvaW50ID0gMTA7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgfQorCisgICAgICBjYXNlIDIgOiB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBzaG93IGZpcnN0IGltYWdlIGFmdGVyIFRFUk0gKi8KKyAgICAgICAgICAgICAgICAgaVJldGNvZGUgPSByZXN0b3JlX3N0YXRlIChwRGF0YSk7CisKKyAgICAgICAgICAgICAgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlSZXRjb2RlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm90aWZ5IHRoZSBhcHAgPyAqLworICAgICAgICAgICAgICAgICBpZiAocERhdGEtPmZQcm9jZXNzbWVuZCkKKyAgICAgICAgICAgICAgICAgICBpZiAoIXBEYXRhLT5mUHJvY2Vzc21lbmQgKChtbmdfaGFuZGxlKXBEYXRhLCBwRGF0YS0+aUl0ZXJhdGlvbnMsIDApKQorICAgICAgICAgICAgICAgICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0FQUE1JU0NFUlJPUik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNob3cgZmlyc3QgZnJhbWUgYWZ0ZXIgVEVSTSBjaHVuayAqLworICAgICAgICAgICAgICAgICBwRGF0YS0+cEN1cnJhbmlvYmogICAgICA9IHBURVJNOworICAgICAgICAgICAgICAgICBwRGF0YS0+Yk9ubHlmaXJzdGZyYW1lICA9IE1OR19UUlVFOworICAgICAgICAgICAgICAgICBwRGF0YS0+aUZyYW1lc2FmdGVyVEVSTSA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1heCgxLCBURVJNIGRlbGF5LCBpbnRlcmZyYW1lX2RlbGF5KSAqLworI2lmbmRlZiBNTkdfU0tJUENIVU5LX0ZSQU0KKyAgICAgICAgICAgICAgICAgaWYgKHBURVJNLT5pRGVsYXkgPiBwRGF0YS0+aUZyYW1lZGVsYXkpCisgICAgICAgICAgICAgICAgICAgcERhdGEtPmlGcmFtZWRlbGF5ID0gcFRFUk0tPmlEZWxheTsKKyAgICAgICAgICAgICAgICAgaWYgKCFwRGF0YS0+aUZyYW1lZGVsYXkpCisgICAgICAgICAgICAgICAgICAgcERhdGEtPmlGcmFtZWRlbGF5ID0gMTsKKyNlbmRpZgorCisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgfQorCisgICAgICBjYXNlIDMgOiB7ICAgICAgICAgICAgICAgICAgICAgICAvKiByZXBlYXQgKi8KKyAgICAgICAgICAgICAgICAgaWYgKChwVEVSTS0+aUl0ZXJtYXgpICYmIChwVEVSTS0+aUl0ZXJtYXggPCAweDdGRkZGRkZGKSkKKyAgICAgICAgICAgICAgICAgICBwVEVSTS0+aUl0ZXJtYXgtLTsKKworICAgICAgICAgICAgICAgICBpZiAocFRFUk0tPmlJdGVybWF4KSAgLyogZ28gYmFjayB0byBURVJNID8gKi8KKyAgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgIC8qIHJlc3RvcmUgdG8gaW5pdGlhbCBvciBTQVZFIHN0YXRlICovCisgICAgICAgICAgICAgICAgICAgaVJldGNvZGUgPSByZXN0b3JlX3N0YXRlIChwRGF0YSk7CisKKyAgICAgICAgICAgICAgICAgICBpZiAoaVJldGNvZGUpICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3RpZnkgdGhlIGFwcCA/ICovCisgICAgICAgICAgICAgICAgICAgaWYgKHBEYXRhLT5mUHJvY2Vzc21lbmQpCisgICAgICAgICAgICAgICAgICAgICBpZiAoIXBEYXRhLT5mUHJvY2Vzc21lbmQgKChtbmdfaGFuZGxlKXBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aUl0ZXJhdGlvbnMsIHBURVJNLT5pSXRlcm1heCkpCisgICAgICAgICAgICAgICAgICAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19BUFBNSVNDRVJST1IpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZXN0YXJ0IGZyb20gVEVSTSBjaHVuayAqLworICAgICAgICAgICAgICAgICAgIHBEYXRhLT5wQ3VycmFuaW9iaiA9IHBURVJNOworCisgICAgICAgICAgICAgICAgICAgaWYgKHBURVJNLT5pRGVsYXkpICAvKiBzZXQgdGhlIGRlbGF5ICg/KSAqLworICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1heCgxLCBURVJNIGRlbGF5LCBpbnRlcmZyYW1lX2RlbGF5KSAqLworI2lmbmRlZiBNTkdfU0tJUENIVU5LX0ZSQU0KKyAgICAgICAgICAgICAgICAgICAgIGlmIChwVEVSTS0+aURlbGF5ID4gcERhdGEtPmlGcmFtZWRlbGF5KQorICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aUZyYW1lZGVsYXkgPSBwVEVSTS0+aURlbGF5OworICAgICAgICAgICAgICAgICAgICAgaWYgKCFwRGF0YS0+aUZyYW1lZGVsYXkpCisgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pRnJhbWVkZWxheSA9IDE7CisjZW5kaWYKKworICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmJOZWVkcmVmcmVzaCA9IE1OR19UUlVFOworICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBURVJNLT5pSXRlcmFjdGlvbikKKyAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBjYXNlIDAgOiB7ICAgICAgICAvKiBzaG93IGxhc3QgZnJhbWUgaW5kZWZpbml0bHkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8qIHBpZWNlIG9mIGNha2UsIHRoYXQgaXMuLi4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgY2FzZSAxIDogeyAgICAgICAgLyogY2Vhc2UgZGlzcGxheWluZyBhbnl0aGluZyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWF4KDEsIFRFUk0gZGVsYXksIGludGVyZnJhbWVfZGVsYXkpICovCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfRlJBTQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocFRFUk0tPmlEZWxheSA+IHBEYXRhLT5pRnJhbWVkZWxheSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aUZyYW1lZGVsYXkgPSBwVEVSTS0+aURlbGF5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBEYXRhLT5pRnJhbWVkZWxheSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aUZyYW1lZGVsYXkgPSAxOworI2VuZGlmCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVJldGNvZGUgPSBpbnRlcmZyYW1lX2RlbGF5IChwRGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBubyBpbnRlcmZyYW1lX2RlbGF5PyB0aGVuIGZha2UgaXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCghaVJldGNvZGUpICYmICghcERhdGEtPmJUaW1lcnNldCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVJldGNvZGUgPSBzZXRfZGVsYXkgKHBEYXRhLCAxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaVJldGNvZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlSZXRjb2RlOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pQnJlYWtwb2ludCA9IDEwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgY2FzZSAyIDogeyAgICAgICAgLyogc2hvdyBmaXJzdCBpbWFnZSBhZnRlciBURVJNICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlSZXRjb2RlID0gcmVzdG9yZV9zdGF0ZSAocERhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlSZXRjb2RlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdGlmeSB0aGUgYXBwID8gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBEYXRhLT5mUHJvY2Vzc21lbmQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwRGF0YS0+ZlByb2Nlc3NtZW5kICgobW5nX2hhbmRsZSlwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pSXRlcmF0aW9ucywgMCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfQVBQTUlTQ0VSUk9SKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2hvdyBmaXJzdCBmcmFtZSBhZnRlciBURVJNIGNodW5rICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5wQ3VycmFuaW9iaiAgICAgID0gcFRFUk07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5iT25seWZpcnN0ZnJhbWUgID0gTU5HX1RSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pRnJhbWVzYWZ0ZXJURVJNID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1heCgxLCBURVJNIGRlbGF5LCBpbnRlcmZyYW1lX2RlbGF5KSAqLworI2lmbmRlZiBNTkdfU0tJUENIVU5LX0ZSQU0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBURVJNLT5pRGVsYXkgPiBwRGF0YS0+aUZyYW1lZGVsYXkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlGcmFtZWRlbGF5ID0gcFRFUk0tPmlEZWxheTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwRGF0YS0+aUZyYW1lZGVsYXkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlGcmFtZWRlbGF5ID0gMTsKKyNlbmRpZgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgfQorICAgIH0KKyAgfQorI2VuZGlmIC8qIE1OR19TS0lQQ0hVTktfVEVSTSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoganVzdCByZWFkaW5nID8gKi8KKyAgaWYgKCghcERhdGEtPmJEaXNwbGF5aW5nKSAmJiAocERhdGEtPmJSZWFkaW5nKSkKKyAgICBpZiAocERhdGEtPmZQcm9jZXNzbWVuZCkgICAgICAgICAgIC8qIGluZm9ybSB0aGUgYXBwID8gKi8KKyAgICAgIGlmICghcERhdGEtPmZQcm9jZXNzbWVuZCAoKG1uZ19oYW5kbGUpcERhdGEsIDAsIDApKQorICAgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfQVBQTUlTQ0VSUk9SKTsKKworICBpZiAoIXBEYXRhLT5wQ3VycmFuaW9iaikgICAgICAgICAgICAgLyogYWx3YXlzIGxldCB0aGUgYXBwIHJlZnJlc2ggYXQgdGhlIGVuZCAhICovCisgICAgcERhdGEtPmJOZWVkcmVmcmVzaCA9IE1OR19UUlVFOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST0NFU1NfRElTUExBWV9NRU5ELCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfZGlzcGxheV9tZW5kMiAobW5nX2RhdGFwIHBEYXRhKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9DRVNTX0RJU1BMQVlfTUVORCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfRlJBTQorICBwRGF0YS0+YkZyYW1lY2xpcHBpbmcgPSBNTkdfRkFMU0U7ICAgLyogbm90aGluZyB0byBkbyBidXQgcmVzdG9yZSB0aGUgYXBwIGJhY2tncm91bmQgKi8KKyNlbmRpZgorICBsb2FkX2JrZ2RsYXllciAocERhdGEpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST0NFU1NfRElTUExBWV9NRU5ELCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX0RFRkkKK21uZ19yZXRjb2RlIG1uZ19wcm9jZXNzX2Rpc3BsYXlfZGVmaSAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfaW1hZ2VwIHBJbWFnZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9DRVNTX0RJU1BMQVlfREVGSSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmICghcERhdGEtPmlERUZJb2JqZWN0aWQpICAgICAgICAgICAvKiBvYmplY3QgaWQ9MCA/ICovCisgIHsKKyAgICBwSW1hZ2UgICAgICAgICAgICAgPSAobW5nX2ltYWdlcClwRGF0YS0+cE9ianplcm87CisKKyAgICBpZiAocERhdGEtPmJERUZJaGFzZG9ub3RzaG93KQorICAgICAgcEltYWdlLT5iVmlzaWJsZSA9IChtbmdfYm9vbCkocERhdGEtPmlERUZJZG9ub3RzaG93ID09IDApOworCisgICAgaWYgKHBEYXRhLT5iREVGSWhhc2xvY2EpCisgICAgeworICAgICAgcEltYWdlLT5pUG9zeCAgICA9IHBEYXRhLT5pREVGSWxvY2F4OworICAgICAgcEltYWdlLT5pUG9zeSAgICA9IHBEYXRhLT5pREVGSWxvY2F5OworICAgIH0KKworICAgIGlmIChwRGF0YS0+YkRFRkloYXNjbGlwKQorICAgIHsKKyAgICAgIHBJbWFnZS0+YkNsaXBwZWQgPSBwRGF0YS0+YkRFRkloYXNjbGlwOworICAgICAgcEltYWdlLT5pQ2xpcGwgICA9IHBEYXRhLT5pREVGSWNsaXBsOworICAgICAgcEltYWdlLT5pQ2xpcHIgICA9IHBEYXRhLT5pREVGSWNsaXByOworICAgICAgcEltYWdlLT5pQ2xpcHQgICA9IHBEYXRhLT5pREVGSWNsaXB0OworICAgICAgcEltYWdlLT5pQ2xpcGIgICA9IHBEYXRhLT5pREVGSWNsaXBiOworICAgIH0KKworICAgIHBEYXRhLT5wQ3VycmVudG9iaiA9IDA7ICAgICAgICAgICAgLyogbm90IGEgcmVhbCBvYmplY3QgISAqLworICB9CisgIGVsc2UKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFscmVhZHkgZXhpc3RzID8gKi8KKyAgICBwSW1hZ2UgPSAobW5nX2ltYWdlcCltbmdfZmluZF9pbWFnZW9iamVjdCAocERhdGEsIHBEYXRhLT5pREVGSW9iamVjdGlkKTsKKworICAgIGlmICghcEltYWdlKSAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgbm90OyBjcmVhdGUgbmV3ICovCisgICAgeworICAgICAgbW5nX3JldGNvZGUgaVJldGNvZGUgPSBtbmdfY3JlYXRlX2ltYWdlb2JqZWN0IChwRGF0YSwgcERhdGEtPmlERUZJb2JqZWN0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfYm9vbCkocERhdGEtPmlERUZJY29uY3JldGUgPT0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfYm9vbCkocERhdGEtPmlERUZJZG9ub3RzaG93ID09IDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTkdfRkFMU0UsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pREVGSWxvY2F4LCBwRGF0YS0+aURFRklsb2NheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmJERUZJaGFzY2xpcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlERUZJY2xpcGwsIHBEYXRhLT5pREVGSWNsaXByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aURFRkljbGlwdCwgcERhdGEtPmlERUZJY2xpcGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW1hZ2UpOworCisgICAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgfQorICAgIGVsc2UKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGV4aXN0czsgdGhlbiBzZXQgbmV3IGluZm8gKi8KKyAgICAgIGlmIChwRGF0YS0+YkRFRkloYXNkb25vdHNob3cpCisgICAgICAgIHBJbWFnZS0+YlZpc2libGUgPSAobW5nX2Jvb2wpKHBEYXRhLT5pREVGSWRvbm90c2hvdyA9PSAwKTsKKworICAgICAgcEltYWdlLT5iVmlld2FibGUgID0gTU5HX0ZBTFNFOworCisgICAgICBpZiAocERhdGEtPmJERUZJaGFzbG9jYSkKKyAgICAgIHsKKyAgICAgICAgcEltYWdlLT5pUG9zeCAgICA9IHBEYXRhLT5pREVGSWxvY2F4OworICAgICAgICBwSW1hZ2UtPmlQb3N5ICAgID0gcERhdGEtPmlERUZJbG9jYXk7CisgICAgICB9CisKKyAgICAgIGlmIChwRGF0YS0+YkRFRkloYXNjbGlwKQorICAgICAgeworICAgICAgICBwSW1hZ2UtPmJDbGlwcGVkID0gcERhdGEtPmJERUZJaGFzY2xpcDsKKyAgICAgICAgcEltYWdlLT5pQ2xpcGwgICA9IHBEYXRhLT5pREVGSWNsaXBsOworICAgICAgICBwSW1hZ2UtPmlDbGlwciAgID0gcERhdGEtPmlERUZJY2xpcHI7CisgICAgICAgIHBJbWFnZS0+aUNsaXB0ICAgPSBwRGF0YS0+aURFRkljbGlwdDsKKyAgICAgICAgcEltYWdlLT5pQ2xpcGIgICA9IHBEYXRhLT5pREVGSWNsaXBiOworICAgICAgfQorCisgICAgICBpZiAocERhdGEtPmJERUZJaGFzY29uY3JldGUpCisgICAgICAgIHBJbWFnZS0+cEltZ2J1Zi0+YkNvbmNyZXRlID0gKG1uZ19ib29sKShwRGF0YS0+aURFRkljb25jcmV0ZSA9PSAxKTsKKyAgICB9CisKKyAgICBwRGF0YS0+cEN1cnJlbnRvYmogPSBwSW1hZ2U7ICAgICAgIC8qIG90aGVycyBtYXkgd2FudCB0byBrbm93IHRoaXMgKi8KKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST0NFU1NfRElTUExBWV9ERUZJLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfQkFTSQorI2lmbmRlZiBNTkdfT1BUSU1JWkVfRElTUExBWUNBTExTCittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19kaXNwbGF5X2Jhc2kgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaVJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpR3JlZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaUJsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgYkhhc2FscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlBbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICBpVmlld2FibGUpCisjZWxzZQorbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfZGlzcGxheV9iYXNpIChtbmdfZGF0YXAgIHBEYXRhKQorI2VuZGlmCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGRyZXNzIHRoZSBjdXJyZW50ICJvYmplY3QiIGlmIGFueSAqLworICBtbmdfaW1hZ2VwICAgICBwSW1hZ2UgPSAobW5nX2ltYWdlcClwRGF0YS0+cEN1cnJlbnRvYmo7CisgIG1uZ191aW50OHAgICAgIHBXb3JrOworICBtbmdfdWludDMyICAgICBpWDsKKyAgbW5nX2ltYWdlZGF0YXAgcEJ1ZjsKKyAgbW5nX3JldGNvZGUgICAgaVJldGNvZGU7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX0JBU0ksIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAoIXBJbWFnZSkgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3IgaXMgaXQgYW4gIm9uLXRoZS1mbHkiIGltYWdlID8gKi8KKyAgICBwSW1hZ2UgPSAobW5nX2ltYWdlcClwRGF0YS0+cE9ianplcm87CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGRyZXNzIHRoZSBvYmplY3QtYnVmZmVyICovCisgIHBCdWYgICAgICAgICAgICAgICA9IHBJbWFnZS0+cEltZ2J1ZjsKKworICBwRGF0YS0+ZkRpc3BsYXlyb3cgPSBNTkdfTlVMTDsgICAgICAgLyogZG8gbm90aGluZyBieSBkZWZhdWx0ICovCisgIHBEYXRhLT5mQ29ycmVjdHJvdyA9IE1OR19OVUxMOworICBwRGF0YS0+ZlN0b3Jlcm93ICAgPSBNTkdfTlVMTDsKKyAgcERhdGEtPmZQcm9jZXNzcm93ID0gTU5HX05VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXQgcGFybXMgbm93IHRoYXQgdGhleSdyZSBrbm93biAqLworICBpUmV0Y29kZSA9IG1uZ19yZXNldF9vYmplY3RfZGV0YWlscyAocERhdGEsIHBJbWFnZSwgcERhdGEtPmlEYXRhd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aURhdGFoZWlnaHQsIHBEYXRhLT5pQml0ZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aUNvbG9ydHlwZSwgcERhdGEtPmlDb21wcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pRmlsdGVyLCBwRGF0YS0+aUludGVybGFjZSwgTU5HX0ZBTFNFKTsKKyAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgcmV0dXJuIGlSZXRjb2RlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2F2ZSB0aGUgdmlld2FibGUgZmxhZyAqLworI2lmbmRlZiBNTkdfT1BUSU1JWkVfRElTUExBWUNBTExTCisgIHBJbWFnZS0+YlZpZXdhYmxlID0gKG1uZ19ib29sKShpVmlld2FibGUgPT0gMSk7CisjZWxzZQorICBwSW1hZ2UtPmJWaWV3YWJsZSA9IChtbmdfYm9vbCkocERhdGEtPmlCQVNJdmlld2FibGUgPT0gMSk7CisjZW5kaWYKKyAgcEJ1Zi0+YlZpZXdhYmxlICAgPSBwSW1hZ2UtPmJWaWV3YWJsZTsKKyAgcERhdGEtPnBTdG9yZW9iaiAgPSBwSW1hZ2U7ICAgICAgICAgIC8qIGxldCByb3ctcm91dGluZXMga25vdyB3aGljaCBvYmplY3QgKi8KKworICBwV29yayA9IHBCdWYtPnBJbWdkYXRhOyAgICAgICAgICAgICAgLyogZmlsbCB0aGUgb2JqZWN0LWJ1ZmZlciB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xvciIgc2FtcGxlICovCisgIHN3aXRjaCAocERhdGEtPmlDb2xvcnR5cGUpICAgICAgICAgICAvKiBkZXBlbmRpbmcgb24gY29sb3JfdHlwZSAmIGJpdF9kZXB0aCAqLworICB7CisgICAgY2FzZSAwIDogeyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBncmF5ICovCisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgICAgICAgICAgICBpZiAocERhdGEtPmlCaXRkZXB0aCA9PSAxNikKKyAgICAgICAgICAgICAgIHsKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgICAgICAgICAgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aURhdGF3aWR0aCAqIHBEYXRhLT5pRGF0YWhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgaVggPiAwO2lYLS0pCisjZWxzZQorICAgICAgICAgICAgICAgICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aURhdGF3aWR0aCAqIHBEYXRhLT5pRGF0YWhlaWdodDsgaVgrKykKKyNlbmRpZgorICAgICAgICAgICAgICAgICB7CisjaWZuZGVmIE1OR19PUFRJTUlaRV9ESVNQTEFZQ0FMTFMKKyAgICAgICAgICAgICAgICAgICBtbmdfcHV0X3VpbnQxNiAocFdvcmssIGlSZWQpOworI2Vsc2UKKyAgICAgICAgICAgICAgICAgICBtbmdfcHV0X3VpbnQxNiAocFdvcmssIHBEYXRhLT5pQkFTSXJlZCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICBwV29yayArPSAyOworICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgICAgIHsKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgICAgICAgICAgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aURhdGF3aWR0aCAqIHBEYXRhLT5pRGF0YWhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgaVggPiAwO2lYLS0pCisjZWxzZQorICAgICAgICAgICAgICAgICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aURhdGF3aWR0aCAqIHBEYXRhLT5pRGF0YWhlaWdodDsgaVgrKykKKyNlbmRpZgorICAgICAgICAgICAgICAgICB7CisjaWZuZGVmIE1OR19PUFRJTUlaRV9ESVNQTEFZQ0FMTFMKKyAgICAgICAgICAgICAgICAgICAqcFdvcmsgPSAobW5nX3VpbnQ4KWlSZWQ7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICpwV29yayA9IChtbmdfdWludDgpcERhdGEtPmlCQVNJcmVkOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgcFdvcmsrKzsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm9yY2UgdFJOUyA/ICovCisjaWZuZGVmIE1OR19PUFRJTUlaRV9ESVNQTEFZQ0FMTFMKKyAgICAgICAgICAgICAgIGlmICgoYkhhc2FscGhhKSAmJiAoIWlBbHBoYSkpCisjZWxzZQorICAgICAgICAgICAgICAgaWYgKChwRGF0YS0+YkJBU0loYXNhbHBoYSkgJiYgKCFwRGF0YS0+aUJBU0lhbHBoYSkpCisjZW5kaWYKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgcEJ1Zi0+Ykhhc1RSTlMgID0gTU5HX1RSVUU7CisjaWZuZGVmIE1OR19PUFRJTUlaRV9ESVNQTEFZQ0FMTFMKKyAgICAgICAgICAgICAgICAgcEJ1Zi0+aVRSTlNncmF5ID0gaVJlZDsKKyNlbHNlCisgICAgICAgICAgICAgICAgIHBCdWYtPmlUUk5TZ3JheSA9IHBEYXRhLT5pQkFTSXJlZDsKKyNlbmRpZgorICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICB9CisKKyAgICBjYXNlIDIgOiB7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJnYiAqLworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgICAgICAgICAgICAgaWYgKHBEYXRhLT5pQml0ZGVwdGggPT0gMTYpCisgICAgICAgICAgICAgICB7CisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICAgICAgICAgICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlEYXRhd2lkdGggKiBwRGF0YS0+aURhdGFoZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgIGlYID4gMDtpWC0tKQorI2Vsc2UKKyAgICAgICAgICAgICAgICAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlEYXRhd2lkdGggKiBwRGF0YS0+aURhdGFoZWlnaHQ7IGlYKyspCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgeworI2lmbmRlZiBNTkdfT1BUSU1JWkVfRElTUExBWUNBTExTCisgICAgICAgICAgICAgICAgICAgbW5nX3B1dF91aW50MTYgKHBXb3JrLCAgIGlSZWQgICk7CisgICAgICAgICAgICAgICAgICAgbW5nX3B1dF91aW50MTYgKHBXb3JrKzIsIGlHcmVlbik7CisgICAgICAgICAgICAgICAgICAgbW5nX3B1dF91aW50MTYgKHBXb3JrKzQsIGlCbHVlICk7CisjZWxzZQorICAgICAgICAgICAgICAgICAgIG1uZ19wdXRfdWludDE2IChwV29yaywgICBwRGF0YS0+aUJBU0lyZWQgICk7CisgICAgICAgICAgICAgICAgICAgbW5nX3B1dF91aW50MTYgKHBXb3JrKzIsIHBEYXRhLT5pQkFTSWdyZWVuKTsKKyAgICAgICAgICAgICAgICAgICBtbmdfcHV0X3VpbnQxNiAocFdvcmsrNCwgcERhdGEtPmlCQVNJYmx1ZSApOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgcFdvcmsgKz0gNjsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgICAgICAgICB7CisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICAgICAgICAgICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlEYXRhd2lkdGggKiBwRGF0YS0+aURhdGFoZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgIGlYID4gMDtpWC0tKQorI2Vsc2UKKyAgICAgICAgICAgICAgICAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlEYXRhd2lkdGggKiBwRGF0YS0+aURhdGFoZWlnaHQ7IGlYKyspCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgeworI2lmbmRlZiBNTkdfT1BUSU1JWkVfRElTUExBWUNBTExTCisgICAgICAgICAgICAgICAgICAgKnBXb3JrICAgICA9IChtbmdfdWludDgpaVJlZDsKKyAgICAgICAgICAgICAgICAgICAqKHBXb3JrKzEpID0gKG1uZ191aW50OClpR3JlZW47CisgICAgICAgICAgICAgICAgICAgKihwV29yaysyKSA9IChtbmdfdWludDgpaUJsdWU7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICpwV29yayAgICAgPSAobW5nX3VpbnQ4KXBEYXRhLT5pQkFTSXJlZDsKKyAgICAgICAgICAgICAgICAgICAqKHBXb3JrKzEpID0gKG1uZ191aW50OClwRGF0YS0+aUJBU0lncmVlbjsKKyAgICAgICAgICAgICAgICAgICAqKHBXb3JrKzIpID0gKG1uZ191aW50OClwRGF0YS0+aUJBU0libHVlOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgcFdvcmsgKz0gMzsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm9yY2UgdFJOUyA/ICovCisjaWZuZGVmIE1OR19PUFRJTUlaRV9ESVNQTEFZQ0FMTFMKKyAgICAgICAgICAgICAgIGlmICgoYkhhc2FscGhhKSAmJiAoIWlBbHBoYSkpCisjZWxzZQorICAgICAgICAgICAgICAgaWYgKChwRGF0YS0+YkJBU0loYXNhbHBoYSkgJiYgKCFwRGF0YS0+aUJBU0lhbHBoYSkpCisjZW5kaWYKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgcEJ1Zi0+Ykhhc1RSTlMgICA9IE1OR19UUlVFOworI2lmbmRlZiBNTkdfT1BUSU1JWkVfRElTUExBWUNBTExTCisgICAgICAgICAgICAgICAgIHBCdWYtPmlUUk5TcmVkICAgPSBpUmVkOworICAgICAgICAgICAgICAgICBwQnVmLT5pVFJOU2dyZWVuID0gaUdyZWVuOworICAgICAgICAgICAgICAgICBwQnVmLT5pVFJOU2JsdWUgID0gaUJsdWU7CisjZWxzZQorICAgICAgICAgICAgICAgICBwQnVmLT5pVFJOU3JlZCAgID0gcERhdGEtPmlCQVNJcmVkOworICAgICAgICAgICAgICAgICBwQnVmLT5pVFJOU2dyZWVuID0gcERhdGEtPmlCQVNJZ3JlZW47CisgICAgICAgICAgICAgICAgIHBCdWYtPmlUUk5TYmx1ZSAgPSBwRGF0YS0+aUJBU0libHVlOworI2VuZGlmCisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgIH0KKworICAgIGNhc2UgMyA6IHsgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5kZXhlZCAqLworICAgICAgICAgICAgICAgcEJ1Zi0+Ykhhc1BMVEUgPSBNTkdfVFJVRTsKKworICAgICAgICAgICAgICAgc3dpdGNoIChwRGF0YS0+aUJpdGRlcHRoKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICBjYXNlIDEgIDogeyBwQnVmLT5pUExURWNvdW50ID0gICAyOyBicmVhazsgfQorICAgICAgICAgICAgICAgICBjYXNlIDIgIDogeyBwQnVmLT5pUExURWNvdW50ID0gICA0OyBicmVhazsgfQorICAgICAgICAgICAgICAgICBjYXNlIDQgIDogeyBwQnVmLT5pUExURWNvdW50ID0gIDE2OyBicmVhazsgfQorICAgICAgICAgICAgICAgICBjYXNlIDggIDogeyBwQnVmLT5pUExURWNvdW50ID0gMjU2OyBicmVhazsgfQorICAgICAgICAgICAgICAgICBkZWZhdWx0IDogeyBwQnVmLT5pUExURWNvdW50ID0gICAxOyBicmVhazsgfQorICAgICAgICAgICAgICAgfQorCisjaWZuZGVmIE1OR19PUFRJTUlaRV9ESVNQTEFZQ0FMTFMKKyAgICAgICAgICAgICAgIHBCdWYtPmFQTFRFZW50cmllcyBbMF0uaVJlZCAgID0gKG1uZ191aW50OClpUmVkOworICAgICAgICAgICAgICAgcEJ1Zi0+YVBMVEVlbnRyaWVzIFswXS5pR3JlZW4gPSAobW5nX3VpbnQ4KWlHcmVlbjsKKyAgICAgICAgICAgICAgIHBCdWYtPmFQTFRFZW50cmllcyBbMF0uaUJsdWUgID0gKG1uZ191aW50OClpQmx1ZTsKKyNlbHNlCisgICAgICAgICAgICAgICBwQnVmLT5hUExURWVudHJpZXMgWzBdLmlSZWQgICA9IChtbmdfdWludDgpcERhdGEtPmlCQVNJcmVkOworICAgICAgICAgICAgICAgcEJ1Zi0+YVBMVEVlbnRyaWVzIFswXS5pR3JlZW4gPSAobW5nX3VpbnQ4KXBEYXRhLT5pQkFTSWdyZWVuOworICAgICAgICAgICAgICAgcEJ1Zi0+YVBMVEVlbnRyaWVzIFswXS5pQmx1ZSAgPSAobW5nX3VpbnQ4KXBEYXRhLT5pQkFTSWJsdWU7CisjZW5kaWYKKworICAgICAgICAgICAgICAgZm9yIChpWCA9IDE7IGlYIDwgcEJ1Zi0+aVBMVEVjb3VudDsgaVgrKykKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgcEJ1Zi0+YVBMVEVlbnRyaWVzIFtpWF0uaVJlZCAgID0gMDsKKyAgICAgICAgICAgICAgICAgcEJ1Zi0+YVBMVEVlbnRyaWVzIFtpWF0uaUdyZWVuID0gMDsKKyAgICAgICAgICAgICAgICAgcEJ1Zi0+YVBMVEVlbnRyaWVzIFtpWF0uaUJsdWUgID0gMDsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvcmNlIHRSTlMgPyAqLworI2lmbmRlZiBNTkdfT1BUSU1JWkVfRElTUExBWUNBTExTCisgICAgICAgICAgICAgICBpZiAoKGJIYXNhbHBoYSkgJiYgKGlBbHBoYSA8IDI1NSkpCisjZWxzZQorICAgICAgICAgICAgICAgaWYgKChwRGF0YS0+YkJBU0loYXNhbHBoYSkgJiYgKHBEYXRhLT5pQkFTSWFscGhhIDwgMjU1KSkKKyNlbmRpZgorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICBwQnVmLT5iSGFzVFJOUyAgICAgICAgID0gTU5HX1RSVUU7CisgICAgICAgICAgICAgICAgIHBCdWYtPmlUUk5TY291bnQgICAgICAgPSAxOworI2lmbmRlZiBNTkdfT1BUSU1JWkVfRElTUExBWUNBTExTCisgICAgICAgICAgICAgICAgIHBCdWYtPmFUUk5TZW50cmllcyBbMF0gPSAobW5nX3VpbnQ4KWlBbHBoYTsKKyNlbHNlCisgICAgICAgICAgICAgICAgIHBCdWYtPmFUUk5TZW50cmllcyBbMF0gPSAobW5nX3VpbnQ4KXBEYXRhLT5pQkFTSWFscGhhOworI2VuZGlmCisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgIH0KKworICAgIGNhc2UgNCA6IHsgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ3JheSthbHBoYSAqLworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgICAgICAgICAgICAgaWYgKHBEYXRhLT5pQml0ZGVwdGggPT0gMTYpCisgICAgICAgICAgICAgICB7CisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICAgICAgICAgICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlEYXRhd2lkdGggKiBwRGF0YS0+aURhdGFoZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgIGlYID4gMDtpWC0tKQorI2Vsc2UKKyAgICAgICAgICAgICAgICAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlEYXRhd2lkdGggKiBwRGF0YS0+aURhdGFoZWlnaHQ7IGlYKyspCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgeworI2lmbmRlZiBNTkdfT1BUSU1JWkVfRElTUExBWUNBTExTCisgICAgICAgICAgICAgICAgICAgbW5nX3B1dF91aW50MTYgKHBXb3JrLCAgIGlSZWQpOworICAgICAgICAgICAgICAgICAgIG1uZ19wdXRfdWludDE2IChwV29yaysyLCBpQWxwaGEpOworI2Vsc2UKKyAgICAgICAgICAgICAgICAgICBtbmdfcHV0X3VpbnQxNiAocFdvcmssICAgcERhdGEtPmlCQVNJcmVkKTsKKyAgICAgICAgICAgICAgICAgICBtbmdfcHV0X3VpbnQxNiAocFdvcmsrMiwgcERhdGEtPmlCQVNJYWxwaGEpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgcFdvcmsgKz0gNDsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgICAgICAgICB7CisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICAgICAgICAgICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlEYXRhd2lkdGggKiBwRGF0YS0+aURhdGFoZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgIGlYID4gMDtpWC0tKQorI2Vsc2UKKyAgICAgICAgICAgICAgICAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlEYXRhd2lkdGggKiBwRGF0YS0+aURhdGFoZWlnaHQ7IGlYKyspCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgeworI2lmbmRlZiBNTkdfT1BUSU1JWkVfRElTUExBWUNBTExTCisgICAgICAgICAgICAgICAgICAgKnBXb3JrICAgICA9IChtbmdfdWludDgpaVJlZDsKKyAgICAgICAgICAgICAgICAgICAqKHBXb3JrKzEpID0gKG1uZ191aW50OClpQWxwaGE7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICpwV29yayAgICAgPSAobW5nX3VpbnQ4KXBEYXRhLT5pQkFTSXJlZDsKKyAgICAgICAgICAgICAgICAgICAqKHBXb3JrKzEpID0gKG1uZ191aW50OClwRGF0YS0+aUJBU0lhbHBoYTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgIHBXb3JrICs9IDI7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgfQorCisgICAgY2FzZSA2IDogeyAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZ2IrYWxwaGEgKi8KKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyAgICAgICAgICAgICAgIGlmIChwRGF0YS0+aUJpdGRlcHRoID09IDE2KQorICAgICAgICAgICAgICAgeworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgICAgICAgICAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pRGF0YXdpZHRoICogcERhdGEtPmlEYXRhaGVpZ2h0OworICAgICAgICAgICAgICAgICAgICBpWCA+IDA7aVgtLSkKKyNlbHNlCisgICAgICAgICAgICAgICAgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pRGF0YXdpZHRoICogcERhdGEtPmlEYXRhaGVpZ2h0OyBpWCsrKQorI2VuZGlmCisgICAgICAgICAgICAgICAgIHsKKyNpZm5kZWYgTU5HX09QVElNSVpFX0RJU1BMQVlDQUxMUworICAgICAgICAgICAgICAgICAgIG1uZ19wdXRfdWludDE2IChwV29yaywgICBpUmVkKTsKKyAgICAgICAgICAgICAgICAgICBtbmdfcHV0X3VpbnQxNiAocFdvcmsrMiwgaUdyZWVuKTsKKyAgICAgICAgICAgICAgICAgICBtbmdfcHV0X3VpbnQxNiAocFdvcmsrNCwgaUJsdWUpOworICAgICAgICAgICAgICAgICAgIG1uZ19wdXRfdWludDE2IChwV29yays2LCBpQWxwaGEpOworI2Vsc2UKKyAgICAgICAgICAgICAgICAgICBtbmdfcHV0X3VpbnQxNiAocFdvcmssICAgcERhdGEtPmlCQVNJcmVkKTsKKyAgICAgICAgICAgICAgICAgICBtbmdfcHV0X3VpbnQxNiAocFdvcmsrMiwgcERhdGEtPmlCQVNJZ3JlZW4pOworICAgICAgICAgICAgICAgICAgIG1uZ19wdXRfdWludDE2IChwV29yays0LCBwRGF0YS0+aUJBU0libHVlKTsKKyAgICAgICAgICAgICAgICAgICBtbmdfcHV0X3VpbnQxNiAocFdvcmsrNiwgcERhdGEtPmlCQVNJYWxwaGEpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgcFdvcmsgKz0gODsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgICAgICAgICB7CisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICAgICAgICAgICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlEYXRhd2lkdGggKiBwRGF0YS0+aURhdGFoZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgIGlYID4gMDtpWC0tKQorI2Vsc2UKKyAgICAgICAgICAgICAgICAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlEYXRhd2lkdGggKiBwRGF0YS0+aURhdGFoZWlnaHQ7IGlYKyspCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgeworI2lmbmRlZiBNTkdfT1BUSU1JWkVfRElTUExBWUNBTExTCisgICAgICAgICAgICAgICAgICAgKnBXb3JrICAgICA9IChtbmdfdWludDgpaVJlZDsKKyAgICAgICAgICAgICAgICAgICAqKHBXb3JrKzEpID0gKG1uZ191aW50OClpR3JlZW47CisgICAgICAgICAgICAgICAgICAgKihwV29yaysyKSA9IChtbmdfdWludDgpaUJsdWU7CisgICAgICAgICAgICAgICAgICAgKihwV29yayszKSA9IChtbmdfdWludDgpaUFscGhhOworI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAqcFdvcmsgICAgID0gKG1uZ191aW50OClwRGF0YS0+aUJBU0lyZWQ7CisgICAgICAgICAgICAgICAgICAgKihwV29yaysxKSA9IChtbmdfdWludDgpcERhdGEtPmlCQVNJZ3JlZW47CisgICAgICAgICAgICAgICAgICAgKihwV29yaysyKSA9IChtbmdfdWludDgpcERhdGEtPmlCQVNJYmx1ZTsKKyAgICAgICAgICAgICAgICAgICAqKHBXb3JrKzMpID0gKG1uZ191aW50OClwRGF0YS0+aUJBU0lhbHBoYTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgIHBXb3JrICs9IDQ7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgfQorCisgIH0KKworI2lmZGVmIE1OR19PUFRJTUlaRV9GT09UUFJJTlRfSU5JVAorICBwRGF0YS0+ZkluaXRyb3dwcm9jID0gKG1uZ19mcHRyKW1uZ19pbml0X3Jvd3Byb2M7CisgIHBEYXRhLT5lUG5nX2ltZ3R5cGU9bW5nX3BuZ19pbWd0eXBlKHBEYXRhLT5pQ29sb3J0eXBlLHBEYXRhLT5pQml0ZGVwdGgpOworI2Vsc2UKKyAgc3dpdGNoIChwRGF0YS0+aUNvbG9ydHlwZSkgICAgICAgICAgIC8qIGRldGVybWluZSByb3cgaW5pdGlhbGl6YXRpb24gcm91dGluZSAqLworICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoganVzdCB0byBhY2NvbW9kYXRlIElEQVQgaWYgaXQgYXJyaXZlcyAqLworICAgIGNhc2UgMCA6IHsgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ3JheSAqLworICAgICAgICAgICAgICAgc3dpdGNoIChwRGF0YS0+aUJpdGRlcHRoKQorICAgICAgICAgICAgICAgeworI2lmbmRlZiBNTkdfTk9fMV8yXzRCSVRfU1VQUE9SVAorICAgICAgICAgICAgICAgICBjYXNlICAxIDogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBEYXRhLT5pSW50ZXJsYWNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mSW5pdHJvd3Byb2MgPSAobW5nX2ZwdHIpbW5nX2luaXRfZzFfbmk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZkluaXRyb3dwcm9jID0gKG1uZ19mcHRyKW1uZ19pbml0X2cxX2k7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgIGNhc2UgIDIgOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcERhdGEtPmlJbnRlcmxhY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZJbml0cm93cHJvYyA9IChtbmdfZnB0ciltbmdfaW5pdF9nMl9uaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mSW5pdHJvd3Byb2MgPSAobW5nX2ZwdHIpbW5nX2luaXRfZzJfaTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgY2FzZSAgNCA6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwRGF0YS0+aUludGVybGFjZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZkluaXRyb3dwcm9jID0gKG1uZ19mcHRyKW1uZ19pbml0X2c0X25pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZJbml0cm93cHJvYyA9IChtbmdfZnB0ciltbmdfaW5pdF9nNF9pOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIE1OR19OT18xXzJfNEJJVF9TVVBQT1JUICovCisgICAgICAgICAgICAgICAgIGNhc2UgIDggOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcERhdGEtPmlJbnRlcmxhY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZJbml0cm93cHJvYyA9IChtbmdfZnB0ciltbmdfaW5pdF9nOF9uaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mSW5pdHJvd3Byb2MgPSAobW5nX2ZwdHIpbW5nX2luaXRfZzhfaTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgY2FzZSAxNiA6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwRGF0YS0+aUludGVybGFjZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZkluaXRyb3dwcm9jID0gKG1uZ19mcHRyKW1uZ19pbml0X2cxNl9uaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mSW5pdHJvd3Byb2MgPSAobW5nX2ZwdHIpbW5nX2luaXRfZzE2X2k7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgfQorICAgIGNhc2UgMiA6IHsgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmdiICovCisgICAgICAgICAgICAgICBzd2l0Y2ggKHBEYXRhLT5pQml0ZGVwdGgpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIGNhc2UgIDggOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcERhdGEtPmlJbnRlcmxhY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZJbml0cm93cHJvYyA9IChtbmdfZnB0ciltbmdfaW5pdF9yZ2I4X25pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZJbml0cm93cHJvYyA9IChtbmdfZnB0ciltbmdfaW5pdF9yZ2I4X2k7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgIGNhc2UgMTYgOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcERhdGEtPmlJbnRlcmxhY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZJbml0cm93cHJvYyA9IChtbmdfZnB0ciltbmdfaW5pdF9yZ2IxNl9uaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mSW5pdHJvd3Byb2MgPSAobW5nX2ZwdHIpbW5nX2luaXRfcmdiMTZfaTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICB9CisgICAgY2FzZSAzIDogeyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbmRleGVkICovCisgICAgICAgICAgICAgICBzd2l0Y2ggKHBEYXRhLT5pQml0ZGVwdGgpCisgICAgICAgICAgICAgICB7CisjaWZuZGVmIE1OR19OT18xXzJfNEJJVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgIGNhc2UgIDEgOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcERhdGEtPmlJbnRlcmxhY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZJbml0cm93cHJvYyA9IChtbmdfZnB0ciltbmdfaW5pdF9pZHgxX25pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZJbml0cm93cHJvYyA9IChtbmdfZnB0ciltbmdfaW5pdF9pZHgxX2k7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgIGNhc2UgIDIgOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcERhdGEtPmlJbnRlcmxhY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZJbml0cm93cHJvYyA9IChtbmdfZnB0ciltbmdfaW5pdF9pZHgyX25pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZJbml0cm93cHJvYyA9IChtbmdfZnB0ciltbmdfaW5pdF9pZHgyX2k7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgIGNhc2UgIDQgOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcERhdGEtPmlJbnRlcmxhY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZJbml0cm93cHJvYyA9IChtbmdfZnB0ciltbmdfaW5pdF9pZHg0X25pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZJbml0cm93cHJvYyA9IChtbmdfZnB0ciltbmdfaW5pdF9pZHg0X2k7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogTU5HX05PXzFfMl80QklUX1NVUFBPUlQgKi8KKyAgICAgICAgICAgICAgICAgY2FzZSAgOCA6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwRGF0YS0+aUludGVybGFjZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZkluaXRyb3dwcm9jID0gKG1uZ19mcHRyKW1uZ19pbml0X2lkeDhfbmk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZkluaXRyb3dwcm9jID0gKG1uZ19mcHRyKW1uZ19pbml0X2lkeDhfaTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgfQorICAgIGNhc2UgNCA6IHsgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ3JheSthbHBoYSAqLworICAgICAgICAgICAgICAgc3dpdGNoIChwRGF0YS0+aUJpdGRlcHRoKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICBjYXNlICA4IDogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBEYXRhLT5pSW50ZXJsYWNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mSW5pdHJvd3Byb2MgPSAobW5nX2ZwdHIpbW5nX2luaXRfZ2E4X25pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZJbml0cm93cHJvYyA9IChtbmdfZnB0ciltbmdfaW5pdF9nYThfaTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgY2FzZSAxNiA6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwRGF0YS0+aUludGVybGFjZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZkluaXRyb3dwcm9jID0gKG1uZ19mcHRyKW1uZ19pbml0X2dhMTZfbmk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZkluaXRyb3dwcm9jID0gKG1uZ19mcHRyKW1uZ19pbml0X2dhMTZfaTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICB9CisgICAgY2FzZSA2IDogeyAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZ2IrYWxwaGEgKi8KKyAgICAgICAgICAgICAgIHN3aXRjaCAocERhdGEtPmlCaXRkZXB0aCkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgY2FzZSAgOCA6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwRGF0YS0+aUludGVybGFjZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZkluaXRyb3dwcm9jID0gKG1uZ19mcHRyKW1uZ19pbml0X3JnYmE4X25pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZJbml0cm93cHJvYyA9IChtbmdfZnB0ciltbmdfaW5pdF9yZ2JhOF9pOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgICAgICAgICAgICAgICBjYXNlIDE2IDogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBEYXRhLT5pSW50ZXJsYWNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mSW5pdHJvd3Byb2MgPSAobW5nX2ZwdHIpbW5nX2luaXRfcmdiYTE2X25pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZJbml0cm93cHJvYyA9IChtbmdfZnB0ciltbmdfaW5pdF9yZ2JhMTZfaTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICB9CisgIH0KKyNlbmRpZiAvKiBNTkdfT1BUSU1JWkVfRk9PVFBSSU5UX0lOSVQgKi8KKworICBwRGF0YS0+aUZpbHRlcm9mcyA9IDA7ICAgICAgICAgICAgICAgLyogZGV0ZXJtaW5lIGZpbHRlciBjaGFyYWN0ZXJpc3RpY3MgKi8KKyAgcERhdGEtPmlMZXZlbDAgICAgPSAwOyAgICAgICAgICAgICAgIC8qIGRlZmF1bHQgbGV2ZWxzICovCisgIHBEYXRhLT5pTGV2ZWwxICAgID0gMDsKKyAgcERhdGEtPmlMZXZlbDIgICAgPSAwOworICBwRGF0YS0+aUxldmVsMyAgICA9IDA7CisKKyNpZmRlZiBGSUxURVIxOTIKKyAgaWYgKHBEYXRhLT5pRmlsdGVyID09IDB4QzApICAgICAgICAgIC8qIGxldmVsaW5nICYgZGlmZmVyaW5nID8gKi8KKyAgeworICAgIHN3aXRjaCAocERhdGEtPmlDb2xvcnR5cGUpCisgICAgeworICAgICAgY2FzZSAwIDogeworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgICAgICAgICAgICAgICBpZiAocERhdGEtPmlCaXRkZXB0aCA8PSA4KQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgcERhdGEtPmlGaWx0ZXJvZnMgPSAxOworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgcERhdGEtPmlGaWx0ZXJvZnMgPSAyOworI2VuZGlmCisKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICB9CisgICAgICBjYXNlIDIgOiB7CisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgIGlmIChwRGF0YS0+aUJpdGRlcHRoIDw9IDgpCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICBwRGF0YS0+aUZpbHRlcm9mcyA9IDM7CisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICBwRGF0YS0+aUZpbHRlcm9mcyA9IDY7CisjZW5kaWYKKworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIH0KKyAgICAgIGNhc2UgMyA6IHsKKyAgICAgICAgICAgICAgICAgcERhdGEtPmlGaWx0ZXJvZnMgPSAxOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIH0KKyAgICAgIGNhc2UgNCA6IHsKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgaWYgKHBEYXRhLT5pQml0ZGVwdGggPD0gOCkKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pRmlsdGVyb2ZzID0gMjsKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pRmlsdGVyb2ZzID0gNDsKKyNlbmRpZgorCisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgfQorICAgICAgY2FzZSA2IDogeworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgICAgICAgICAgICAgICBpZiAocERhdGEtPmlCaXRkZXB0aCA8PSA4KQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgcERhdGEtPmlGaWx0ZXJvZnMgPSA0OworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgcERhdGEtPmlGaWx0ZXJvZnMgPSA4OworI2VuZGlmCisKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICB9CisgICAgfQorICB9CisjZW5kaWYKKworI2lmZGVmIEZJTFRFUjE5MworICBpZiAocERhdGEtPmlGaWx0ZXIgPT0gMHhDMSkgICAgICAgICAgLyogbm8gYWRhcHRpdmUgZmlsdGVyaW5nID8gKi8KKyAgICBwRGF0YS0+aVBpeGVsb2ZzID0gcERhdGEtPmlGaWx0ZXJvZnM7CisgIGVsc2UKKyNlbmRpZgorICAgIHBEYXRhLT5pUGl4ZWxvZnMgPSBwRGF0YS0+aUZpbHRlcm9mcyArIDE7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX0JBU0ksIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19DTE9OCisjaWZuZGVmIE1OR19PUFRJTUlaRV9ESVNQTEFZQ0FMTFMKK21uZ19yZXRjb2RlIG1uZ19wcm9jZXNzX2Rpc3BsYXlfY2xvbiAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpU291cmNlaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaUNsb25laWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaUNsb25ldHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2Jvb2wgICBiSGFzZG9ub3RzaG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggIGlEb25vdHNob3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaUNvbmNyZXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfYm9vbCAgIGJIYXNsb2NhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggIGlMb2NhdGlvbnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaUxvY2F0aW9ueCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpTG9jYXRpb255KQorI2Vsc2UKK21uZ19yZXRjb2RlIG1uZ19wcm9jZXNzX2Rpc3BsYXlfY2xvbiAobW5nX2RhdGFwICBwRGF0YSkKKyNlbmRpZgoreworICBtbmdfaW1hZ2VwICBwU291cmNlLCBwQ2xvbmU7CisgIG1uZ19ib29sICAgIGJWaXNpYmxlLCBiQWJzdHJhY3Q7CisgIG1uZ19yZXRjb2RlIGlSZXRjb2RlID0gTU5HX05PRVJST1I7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX0NMT04sIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyNpZm5kZWYgTU5HX09QVElNSVpFX0RJU1BMQVlDQUxMUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbG9jYXRlIHRoZSBzb3VyY2Ugb2JqZWN0IGZpcnN0ICovCisgIHBTb3VyY2UgPSBtbmdfZmluZF9pbWFnZW9iamVjdCAocERhdGEsIGlTb3VyY2VpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGVjayBpZiB0aGUgY2xvbmUgZXhpc3RzICovCisgIHBDbG9uZSAgPSBtbmdfZmluZF9pbWFnZW9iamVjdCAocERhdGEsIGlDbG9uZWlkKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsb2NhdGUgdGhlIHNvdXJjZSBvYmplY3QgZmlyc3QgKi8KKyAgcFNvdXJjZSA9IG1uZ19maW5kX2ltYWdlb2JqZWN0IChwRGF0YSwgcERhdGEtPmlDTE9Oc291cmNlaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2hlY2sgaWYgdGhlIGNsb25lIGV4aXN0cyAqLworICBwQ2xvbmUgID0gbW5nX2ZpbmRfaW1hZ2VvYmplY3QgKHBEYXRhLCBwRGF0YS0+aUNMT05jbG9uZWlkKTsKKyNlbmRpZgorCisgIGlmICghcFNvdXJjZSkgICAgICAgICAgICAgICAgICAgICAgICAvKiBzb3VyY2UgbXVzdCBleGlzdCAhICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX09CSkVDVFVOS05PV04pOworCisgIGlmIChwQ2xvbmUpICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjbG9uZSBtdXN0IG5vdCBleGlzdCAhICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX09CSkVDVEVYSVNUUyk7CisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0RJU1BMQVlDQUxMUworICBpZiAoYkhhc2Rvbm90c2hvdykgICAgICAgICAgICAgICAgICAgLyogRG9Ob3RTaG93IGZsYWcgZmlsbGVkID8gKi8KKyAgICBiVmlzaWJsZSA9IChtbmdfYm9vbCkoaURvbm90c2hvdyA9PSAwKTsKKyAgZWxzZQorICAgIGJWaXNpYmxlID0gcFNvdXJjZS0+YlZpc2libGU7CisjZWxzZQorICBpZiAocERhdGEtPmJDTE9OaGFzZG9ub3RzaG93KSAgICAgICAgLyogRG9Ob3RTaG93IGZsYWcgZmlsbGVkID8gKi8KKyAgICBiVmlzaWJsZSA9IChtbmdfYm9vbCkocERhdGEtPmlDTE9OZG9ub3RzaG93ID09IDApOworICBlbHNlCisgICAgYlZpc2libGUgPSBwU291cmNlLT5iVmlzaWJsZTsKKyNlbmRpZgorCisjaWZuZGVmIE1OR19PUFRJTUlaRV9ESVNQTEFZQ0FMTFMKKyAgYkFic3RyYWN0ICA9IChtbmdfYm9vbCkoaUNvbmNyZXRlID09IDEpOworI2Vsc2UKKyAgYkFic3RyYWN0ICA9IChtbmdfYm9vbCkocERhdGEtPmlDTE9OY29uY3JldGUgPT0gMSk7CisjZW5kaWYKKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfRElTUExBWUNBTExTCisgIHN3aXRjaCAoaUNsb25ldHlwZSkgICAgICAgICAgICAgICAgICAvKiBkZXRlcm1pbmUgYWN0aW9uIHRvIHRha2UgKi8KKyAgeworICAgIGNhc2UgMCA6IHsgICAgICAgICAgICAgICAgICAgICAgICAgLyogZnVsbCBjbG9uZSAqLworICAgICAgICAgICAgICAgaVJldGNvZGUgPSBtbmdfY2xvbmVfaW1hZ2VvYmplY3QgKHBEYXRhLCBpQ2xvbmVpZCwgTU5HX0ZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJWaXNpYmxlLCBiQWJzdHJhY3QsIGJIYXNsb2NhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlMb2NhdGlvbnR5cGUsIGlMb2NhdGlvbngsIGlMb2NhdGlvbnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNvdXJjZSwgJnBDbG9uZSk7CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICB9CisKKyAgICBjYXNlIDEgOiB7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBhcnRpYWwgY2xvbmUgKi8KKyAgICAgICAgICAgICAgIGlSZXRjb2RlID0gbW5nX2Nsb25lX2ltYWdlb2JqZWN0IChwRGF0YSwgaUNsb25laWQsIE1OR19UUlVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJWaXNpYmxlLCBiQWJzdHJhY3QsIGJIYXNsb2NhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlMb2NhdGlvbnR5cGUsIGlMb2NhdGlvbngsIGlMb2NhdGlvbnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNvdXJjZSwgJnBDbG9uZSk7CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICB9CisKKyAgICBjYXNlIDIgOiB7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlbnVtYmVyIG9iamVjdCAqLworICAgICAgICAgICAgICAgaVJldGNvZGUgPSBtbmdfcmVudW1faW1hZ2VvYmplY3QgKHBEYXRhLCBwU291cmNlLCBpQ2xvbmVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVmlzaWJsZSwgYkFic3RyYWN0LCBiSGFzbG9jYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpTG9jYXRpb250eXBlLCBpTG9jYXRpb254LCBpTG9jYXRpb255KTsKKyAgICAgICAgICAgICAgIHBDbG9uZSAgID0gcFNvdXJjZTsKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgIH0KKworICB9CisjZWxzZQorICBzd2l0Y2ggKHBEYXRhLT5pQ0xPTmNsb25ldHlwZSkgICAgICAgLyogZGV0ZXJtaW5lIGFjdGlvbiB0byB0YWtlICovCisgIHsKKyAgICBjYXNlIDAgOiB7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZ1bGwgY2xvbmUgKi8KKyAgICAgICAgICAgICAgIGlSZXRjb2RlID0gbW5nX2Nsb25lX2ltYWdlb2JqZWN0IChwRGF0YSwgcERhdGEtPmlDTE9OY2xvbmVpZCwgTU5HX0ZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJWaXNpYmxlLCBiQWJzdHJhY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmJDTE9OaGFzbG9jYSwgcERhdGEtPmlDTE9ObG9jYXRpb250eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pQ0xPTmxvY2F0aW9ueCwgcERhdGEtPmlDTE9ObG9jYXRpb255LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTb3VyY2UsICZwQ2xvbmUpOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgfQorCisgICAgY2FzZSAxIDogeyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsIGNsb25lICovCisgICAgICAgICAgICAgICBpUmV0Y29kZSA9IG1uZ19jbG9uZV9pbWFnZW9iamVjdCAocERhdGEsIHBEYXRhLT5pQ0xPTmNsb25laWQsIE1OR19UUlVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJWaXNpYmxlLCBiQWJzdHJhY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmJDTE9OaGFzbG9jYSwgcERhdGEtPmlDTE9ObG9jYXRpb250eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pQ0xPTmxvY2F0aW9ueCwgcERhdGEtPmlDTE9ObG9jYXRpb255LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTb3VyY2UsICZwQ2xvbmUpOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgfQorCisgICAgY2FzZSAyIDogeyAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZW51bWJlciBvYmplY3QgKi8KKyAgICAgICAgICAgICAgIGlSZXRjb2RlID0gbW5nX3JlbnVtX2ltYWdlb2JqZWN0IChwRGF0YSwgcFNvdXJjZSwgcERhdGEtPmlDTE9OY2xvbmVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVmlzaWJsZSwgYkFic3RyYWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5iQ0xPTmhhc2xvY2EsIHBEYXRhLT5pQ0xPTmxvY2F0aW9udHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aUNMT05sb2NhdGlvbngsIHBEYXRhLT5pQ0xPTmxvY2F0aW9ueSk7CisgICAgICAgICAgICAgICBwQ2xvbmUgICA9IHBTb3VyY2U7CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICB9CisKKyAgfQorI2VuZGlmCisKKyAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgcmV0dXJuIGlSZXRjb2RlOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkaXNwbGF5IG9uIHRoZSBmbHkgPyAqLworICBpZiAoKHBDbG9uZS0+YlZpZXdhYmxlKSAmJiAocENsb25lLT5iVmlzaWJsZSkpCisgIHsKKyAgICBwRGF0YS0+cExhc3RjbG9uZSA9IHBDbG9uZTsgICAgICAgIC8qIHJlbWVtYmVyIGluIGNhc2Ugb2YgdGltZXIgYnJlYWsgISAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGlzcGxheSBpdCAqLworICAgIG1uZ19kaXNwbGF5X2ltYWdlIChwRGF0YSwgcENsb25lLCBNTkdfRkFMU0UpOworCisgICAgaWYgKHBEYXRhLT5iVGltZXJzZXQpICAgICAgICAgICAgICAvKiB0aW1lciBicmVhayA/ICovCisgICAgICBwRGF0YS0+aUJyZWFrcG9pbnQgPSA1OworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX0NMT04sIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19kaXNwbGF5X2Nsb24yIChtbmdfZGF0YXAgcERhdGEpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST0NFU1NfRElTUExBWV9DTE9OLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvbmx5IGNhbGxlZCBhZnRlciB0aW1lciBicmVhayAhICovCisgIG1uZ19kaXNwbGF5X2ltYWdlIChwRGF0YSwgKG1uZ19pbWFnZXApcERhdGEtPnBMYXN0Y2xvbmUsIE1OR19GQUxTRSk7CisgIHBEYXRhLT5pQnJlYWtwb2ludCA9IDA7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX0NMT04sIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19ESVNDCisjaWZuZGVmIE1OR19PUFRJTUlaRV9ESVNQTEFZQ0FMTFMKK21uZ19yZXRjb2RlIG1uZ19wcm9jZXNzX2Rpc3BsYXlfZGlzYyAobW5nX2RhdGFwICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgIGlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNnAgcElkcykKKyNlbHNlCittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19kaXNwbGF5X2Rpc2MgKG1uZ19kYXRhcCAgIHBEYXRhKQorI2VuZGlmCit7CisgIG1uZ191aW50MzIgaVg7CisgIG1uZ19pbWFnZXAgcEltYWdlOworICBtbmdfdWludDMyIGlSZXRjb2RlOworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9DRVNTX0RJU1BMQVlfRElTQywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisjaWZuZGVmIE1OR19PUFRJTUlaRV9ESVNQTEFZQ0FMTFMKKyAgaWYgKGlDb3VudCkgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNwZWNpZmljIGxpc3QgPyAqLworI2Vsc2UKKyAgaWYgKHBEYXRhLT5pRElTQ2NvdW50KSAgICAgICAgICAgICAgIC8qIHNwZWNpZmljIGxpc3QgPyAqLworI2VuZGlmCisgIHsKKyNpZm5kZWYgTU5HX09QVElNSVpFX0RJU1BMQVlDQUxMUworICAgIG1uZ191aW50MTZwIHBXb3JrID0gcElkczsKKyNlbHNlCisgICAgbW5nX3VpbnQxNnAgcFdvcmsgPSBwRGF0YS0+cERJU0NpZHM7CisjZW5kaWYKKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfRElTUExBWUNBTExTCisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUyAgICAgICAgICAgICAvKiBpdGVyYXRlIHRoZSBsaXN0ICovCisgICAgZm9yIChpWCA9IGlDb3VudDsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgICBmb3IgKGlYID0gMDsgaVggPCBpQ291bnQ7IGlYKyspCisjZW5kaWYKKyNlbHNlCisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUyAgICAgICAgICAgICAvKiBpdGVyYXRlIHRoZSBsaXN0ICovCisgICAgZm9yIChpWCA9IHBEYXRhLT5pRElTQ2NvdW50OyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICAgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pRElTQ2NvdW50OyBpWCsrKQorI2VuZGlmCisjZW5kaWYKKyAgICB7CisgICAgICBwSW1hZ2UgPSBtbmdfZmluZF9pbWFnZW9iamVjdCAocERhdGEsICpwV29yaysrKTsKKworICAgICAgaWYgKHBJbWFnZSkgICAgICAgICAgICAgICAgICAgICAgLyogZm91bmQgdGhlIG9iamVjdCA/ICovCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGVuIGRyb3AgaXQgKi8KKyAgICAgICAgaVJldGNvZGUgPSBtbmdfZnJlZV9pbWFnZW9iamVjdCAocERhdGEsIHBJbWFnZSk7CisKKyAgICAgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICAgICAgcmV0dXJuIGlSZXRjb2RlOworICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW1wdHk6IGRyb3AgYWxsIHVuLWZyb3plbiBvYmplY3RzICovCisgIHsKKyAgICBtbmdfaW1hZ2VwIHBOZXh0ID0gKG1uZ19pbWFnZXApcERhdGEtPnBGaXJzdGltZ29iajsKKworICAgIHdoaWxlIChwTmV4dCkgICAgICAgICAgICAgICAgICAgICAgLyogYW55IGxlZnQgPyAqLworICAgIHsKKyAgICAgIHBJbWFnZSA9IHBOZXh0OworICAgICAgcE5leHQgID0gcEltYWdlLT5zSGVhZGVyLnBOZXh0OworCisgICAgICBpZiAoIXBJbWFnZS0+YkZyb3plbikgICAgICAgICAgICAvKiBub3QgZnJvemVuID8gKi8KKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZW4gZHJvcCBpdCAqLworICAgICAgICBpUmV0Y29kZSA9IG1uZ19mcmVlX2ltYWdlb2JqZWN0IChwRGF0YSwgcEltYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9DRVNTX0RJU1BMQVlfRElTQywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX0ZSQU0KKyNpZm5kZWYgTU5HX09QVElNSVpFX0RJU1BMQVlDQUxMUworbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfZGlzcGxheV9mcmFtIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggIGlGcmFtZW1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaUNoYW5nZWRlbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlEZWxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICBpQ2hhbmdldGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpVGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICBpQ2hhbmdlY2xpcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaUNsaXB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlDbGlwbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpQ2xpcHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaUNsaXB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlDbGlwYikKKyNlbHNlCittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19kaXNwbGF5X2ZyYW0gKG1uZ19kYXRhcCAgcERhdGEpCisjZW5kaWYKK3sKKyAgbW5nX3JldGNvZGUgaVJldGNvZGU7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX0ZSQU0sIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkdmFuY2UgYSBmcmFtZSB0aGVuICovCisjaWZuZGVmIE1OR19PUFRJTUlaRV9ESVNQTEFZQ0FMTFMKKyAgaVJldGNvZGUgPSBuZXh0X2ZyYW1lIChwRGF0YSwgaUZyYW1lbW9kZSwgaUNoYW5nZWRlbGF5LCBpRGVsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgaUNoYW5nZXRpbWVvdXQsIGlUaW1lb3V0LCBpQ2hhbmdlY2xpcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgaUNsaXB0eXBlLCBpQ2xpcGwsIGlDbGlwciwgaUNsaXB0LCBpQ2xpcGIpOworI2Vsc2UKKyAgaVJldGNvZGUgPSBuZXh0X2ZyYW1lIChwRGF0YSwgcERhdGEtPmlUZW1wRnJhbWVtb2RlLCBwRGF0YS0+aVRlbXBDaGFuZ2VkZWxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aVRlbXBEZWxheSwgcERhdGEtPmlUZW1wQ2hhbmdldGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aVRlbXBUaW1lb3V0LCBwRGF0YS0+aVRlbXBDaGFuZ2VjbGlwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aVRlbXBDbGlwdHlwZSwgcERhdGEtPmlUZW1wQ2xpcGwsIHBEYXRhLT5pVGVtcENsaXByLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pVGVtcENsaXB0LCBwRGF0YS0+aVRlbXBDbGlwYik7CisjZW5kaWYKKworICBpZiAocERhdGEtPmJUaW1lcnNldCkgICAgICAgICAgICAgICAgLyogdGltZXIgYnJlYWsgPyAqLworICAgIHBEYXRhLT5pQnJlYWtwb2ludCA9IDE7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX0ZSQU0sIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIGlSZXRjb2RlOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19kaXNwbGF5X2ZyYW0yIChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ19yZXRjb2RlIGlSZXRjb2RlOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST0NFU1NfRElTUExBWV9GUkFNLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZ2FpbjsgYWZ0ZXIgdGhlIGJyZWFrICovCisgIGlSZXRjb2RlID0gbmV4dF9mcmFtZSAocERhdGEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDApOworICBwRGF0YS0+aUJyZWFrcG9pbnQgPSAwOyAgICAgICAgICAgICAgLyogbm90IGFnYWluISAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST0NFU1NfRElTUExBWV9GUkFNLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBpUmV0Y29kZTsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfTU9WRQorI2lmbmRlZiBNTkdfT1BUSU1JWkVfRElTUExBWUNBTExTCittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19kaXNwbGF5X21vdmUgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaUZyb21pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpVG9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICBpTW92ZXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaU1vdmV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlNb3ZleSkKKyNlbHNlCittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19kaXNwbGF5X21vdmUgKG1uZ19kYXRhcCAgcERhdGEpCisjZW5kaWYKK3sKKyAgbW5nX3VpbnQxNiBpWDsKKyAgbW5nX2ltYWdlcCBwSW1hZ2U7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX01PVkUsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGl0ZXJhdGUgdGhlIGxpc3QgKi8KKyNpZm5kZWYgTU5HX09QVElNSVpFX0RJU1BMQVlDQUxMUworICBmb3IgKGlYID0gaUZyb21pZDsgaVggPD0gaVRvaWQ7IGlYKyspCisjZWxzZQorICBmb3IgKGlYID0gcERhdGEtPmlNT1ZFZnJvbWlkOyBpWCA8PSBwRGF0YS0+aU1PVkV0b2lkOyBpWCsrKQorI2VuZGlmCisgIHsKKyAgICBpZiAoIWlYKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9iamVjdCBpZD0wID8gKi8KKyAgICAgIHBJbWFnZSA9IChtbmdfaW1hZ2VwKXBEYXRhLT5wT2JqemVybzsKKyAgICBlbHNlCisgICAgICBwSW1hZ2UgPSBtbmdfZmluZF9pbWFnZW9iamVjdCAocERhdGEsIGlYKTsKKworICAgIGlmIChwSW1hZ2UpICAgICAgICAgICAgICAgICAgICAgICAgLyogb2JqZWN0IGV4aXN0cyA/ICovCisgICAgeworI2lmbmRlZiBNTkdfT1BUSU1JWkVfRElTUExBWUNBTExTCisgICAgICBzd2l0Y2ggKGlNb3ZldHlwZSkKKyNlbHNlCisgICAgICBzd2l0Y2ggKHBEYXRhLT5pTU9WRW1vdmV0eXBlKQorI2VuZGlmCisgICAgICB7CisgICAgICAgIGNhc2UgMCA6IHsgICAgICAgICAgICAgICAgICAgICAvKiBhYnNvbHV0ZSAqLworI2lmbmRlZiBNTkdfT1BUSU1JWkVfRElTUExBWUNBTExTCisgICAgICAgICAgICAgICAgICAgcEltYWdlLT5pUG9zeCA9IGlNb3ZleDsKKyAgICAgICAgICAgICAgICAgICBwSW1hZ2UtPmlQb3N5ID0gaU1vdmV5OworI2Vsc2UKKyAgICAgICAgICAgICAgICAgICBwSW1hZ2UtPmlQb3N4ID0gcERhdGEtPmlNT1ZFbW92ZXg7CisgICAgICAgICAgICAgICAgICAgcEltYWdlLT5pUG9zeSA9IHBEYXRhLT5pTU9WRW1vdmV5OworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSAxIDogeyAgICAgICAgICAgICAgICAgICAgIC8qIHJlbGF0aXZlICovCisjaWZuZGVmIE1OR19PUFRJTUlaRV9ESVNQTEFZQ0FMTFMKKyAgICAgICAgICAgICAgICAgICBwSW1hZ2UtPmlQb3N4ID0gcEltYWdlLT5pUG9zeCArIGlNb3ZleDsKKyAgICAgICAgICAgICAgICAgICBwSW1hZ2UtPmlQb3N5ID0gcEltYWdlLT5pUG9zeSArIGlNb3ZleTsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgcEltYWdlLT5pUG9zeCA9IHBJbWFnZS0+aVBvc3ggKyBwRGF0YS0+aU1PVkVtb3ZleDsKKyAgICAgICAgICAgICAgICAgICBwSW1hZ2UtPmlQb3N5ID0gcEltYWdlLT5pUG9zeSArIHBEYXRhLT5pTU9WRW1vdmV5OworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9DRVNTX0RJU1BMQVlfTU9WRSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX0NMSVAKKyNpZm5kZWYgTU5HX09QVElNSVpFX0RJU1BMQVlDQUxMUworbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfZGlzcGxheV9jbGlwIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlGcm9taWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaVRvaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaUNsaXB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlDbGlwbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpQ2xpcHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaUNsaXB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlDbGlwYikKKyNlbHNlCittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19kaXNwbGF5X2NsaXAgKG1uZ19kYXRhcCAgcERhdGEpCisjZW5kaWYKK3sKKyAgbW5nX3VpbnQxNiBpWDsKKyAgbW5nX2ltYWdlcCBwSW1hZ2U7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX0NMSVAsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGl0ZXJhdGUgdGhlIGxpc3QgKi8KKyNpZm5kZWYgTU5HX09QVElNSVpFX0RJU1BMQVlDQUxMUworICBmb3IgKGlYID0gaUZyb21pZDsgaVggPD0gaVRvaWQ7IGlYKyspCisjZWxzZQorICBmb3IgKGlYID0gcERhdGEtPmlDTElQZnJvbWlkOyBpWCA8PSBwRGF0YS0+aUNMSVB0b2lkOyBpWCsrKQorI2VuZGlmCisgIHsKKyAgICBpZiAoIWlYKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9iamVjdCBpZD0wID8gKi8KKyAgICAgIHBJbWFnZSA9IChtbmdfaW1hZ2VwKXBEYXRhLT5wT2JqemVybzsKKyAgICBlbHNlCisgICAgICBwSW1hZ2UgPSBtbmdfZmluZF9pbWFnZW9iamVjdCAocERhdGEsIGlYKTsKKworICAgIGlmIChwSW1hZ2UpICAgICAgICAgICAgICAgICAgICAgICAgLyogb2JqZWN0IGV4aXN0cyA/ICovCisgICAgeworI2lmbmRlZiBNTkdfT1BUSU1JWkVfRElTUExBWUNBTExTCisgICAgICBzd2l0Y2ggKGlDbGlwdHlwZSkKKyNlbHNlCisgICAgICBzd2l0Y2ggKHBEYXRhLT5pQ0xJUGNsaXB0eXBlKQorI2VuZGlmCisgICAgICB7CisgICAgICAgIGNhc2UgMCA6IHsgICAgICAgICAgICAgICAgICAgICAvKiBhYnNvbHV0ZSAqLworICAgICAgICAgICAgICAgICAgIHBJbWFnZS0+YkNsaXBwZWQgPSBNTkdfVFJVRTsKKyNpZm5kZWYgTU5HX09QVElNSVpFX0RJU1BMQVlDQUxMUworICAgICAgICAgICAgICAgICAgIHBJbWFnZS0+aUNsaXBsICAgPSBpQ2xpcGw7CisgICAgICAgICAgICAgICAgICAgcEltYWdlLT5pQ2xpcHIgICA9IGlDbGlwcjsKKyAgICAgICAgICAgICAgICAgICBwSW1hZ2UtPmlDbGlwdCAgID0gaUNsaXB0OworICAgICAgICAgICAgICAgICAgIHBJbWFnZS0+aUNsaXBiICAgPSBpQ2xpcGI7CisjZWxzZQorICAgICAgICAgICAgICAgICAgIHBJbWFnZS0+aUNsaXBsICAgPSBwRGF0YS0+aUNMSVBjbGlwbDsKKyAgICAgICAgICAgICAgICAgICBwSW1hZ2UtPmlDbGlwciAgID0gcERhdGEtPmlDTElQY2xpcHI7CisgICAgICAgICAgICAgICAgICAgcEltYWdlLT5pQ2xpcHQgICA9IHBEYXRhLT5pQ0xJUGNsaXB0OworICAgICAgICAgICAgICAgICAgIHBJbWFnZS0+aUNsaXBiICAgPSBwRGF0YS0+aUNMSVBjbGlwYjsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICB9CisgICAgICAgIGNhc2UgMSA6IHsgICAgICAgICAgICAgICAgICAgIC8qIHJlbGF0aXZlICovCisgICAgICAgICAgICAgICAgICAgcEltYWdlLT5iQ2xpcHBlZCA9IE1OR19UUlVFOworI2lmbmRlZiBNTkdfT1BUSU1JWkVfRElTUExBWUNBTExTCisgICAgICAgICAgICAgICAgICAgcEltYWdlLT5pQ2xpcGwgICA9IHBJbWFnZS0+aUNsaXBsICsgaUNsaXBsOworICAgICAgICAgICAgICAgICAgIHBJbWFnZS0+aUNsaXByICAgPSBwSW1hZ2UtPmlDbGlwciArIGlDbGlwcjsKKyAgICAgICAgICAgICAgICAgICBwSW1hZ2UtPmlDbGlwdCAgID0gcEltYWdlLT5pQ2xpcHQgKyBpQ2xpcHQ7CisgICAgICAgICAgICAgICAgICAgcEltYWdlLT5pQ2xpcGIgICA9IHBJbWFnZS0+aUNsaXBiICsgaUNsaXBiOworI2Vsc2UKKyAgICAgICAgICAgICAgICAgICBwSW1hZ2UtPmlDbGlwbCAgID0gcEltYWdlLT5pQ2xpcGwgKyBwRGF0YS0+aUNMSVBjbGlwbDsKKyAgICAgICAgICAgICAgICAgICBwSW1hZ2UtPmlDbGlwciAgID0gcEltYWdlLT5pQ2xpcHIgKyBwRGF0YS0+aUNMSVBjbGlwcjsKKyAgICAgICAgICAgICAgICAgICBwSW1hZ2UtPmlDbGlwdCAgID0gcEltYWdlLT5pQ2xpcHQgKyBwRGF0YS0+aUNMSVBjbGlwdDsKKyAgICAgICAgICAgICAgICAgICBwSW1hZ2UtPmlDbGlwYiAgID0gcEltYWdlLT5pQ2xpcGIgKyBwRGF0YS0+aUNMSVBjbGlwYjsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX0NMSVAsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19TSE9XCittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19kaXNwbGF5X3Nob3cgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX2ludDE2ICBpWCwgaVMsIGlGcm9tLCBpVG87CisgIG1uZ19pbWFnZXAgcEltYWdlOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST0NFU1NfRElTUExBWV9TSE9XLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgLyogVE9ETzogb3B0aW1pemF0aW9uIGZvciB0aGUgY2FzZXMgd2hlcmUgImFicyAoaVRvIC0gaUZyb20pIiBpcyByYXRoZXIgaGlnaDsKKyAgICAgZXNwZWNpYWxseSB3aGVyZSAoKGlGcm9tPT0xKSAmJiAoaVRvPT02NTUzNSkpOyBlZy4gYW4gZW1wdHkgU0hPVyAhISEgKi8KKworICBpZiAocERhdGEtPmlCcmVha3BvaW50ID09IDMpICAgICAgICAgLyogcHJldmlvdXNseSBicm9rZW4gZHVyaW5nIGN5Y2xlLW1vZGUgPyAqLworICB7CisgICAgcEltYWdlID0gbW5nX2ZpbmRfaW1hZ2VvYmplY3QgKHBEYXRhLCBwRGF0YS0+aVNIT1duZXh0aWQpOworICAgICAgICAgICAgICAgICAKKyAgICBpZiAocEltYWdlKSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0aWxsIHRoZXJlID8gKi8KKyAgICAgIG1uZ19kaXNwbGF5X2ltYWdlIChwRGF0YSwgcEltYWdlLCBNTkdfRkFMU0UpOworCisgICAgcERhdGEtPmlCcmVha3BvaW50ID0gMDsgICAgICAgICAgICAvKiBsZXQncyBub3QgZ28gdGhyb3VnaCB0aGlzIGFnYWluISAqLworICB9CisgIGVsc2UKKyAgeworICAgIGlmIChwRGF0YS0+aUJyZWFrcG9pbnQpICAgICAgICAgICAgLyogcHJldmlvdXNseSBicm9rZW4gYXQgb3RoZXIgcG9pbnQgPyAqLworICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVzdG9yZSBsYXN0IHBhcm1zICovCisgICAgICBpRnJvbSA9IChtbmdfaW50MTYpcERhdGEtPmlTSE9XZnJvbWlkOworICAgICAgaVRvICAgPSAobW5nX2ludDE2KXBEYXRhLT5pU0hPV3RvaWQ7CisgICAgICBpWCAgICA9IChtbmdfaW50MTYpcERhdGEtPmlTSE9XbmV4dGlkOworICAgICAgaVMgICAgPSAobW5nX2ludDE2KXBEYXRhLT5pU0hPV3NraXA7CisgICAgfQorICAgIGVsc2UKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ3VsYXIgc2VxdWVuY2UgPyAqLworICAgICAgaWYgKHBEYXRhLT5pU0hPV3RvaWQgPj0gcERhdGEtPmlTSE9XZnJvbWlkKQorICAgICAgICBpUyAgPSAxOworICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmV2ZXJzZSBzZXF1ZW5jZSAhICovCisgICAgICAgIGlTICA9IC0xOworCisgICAgICBpRnJvbSA9IChtbmdfaW50MTYpcERhdGEtPmlTSE9XZnJvbWlkOworICAgICAgaVRvICAgPSAobW5nX2ludDE2KXBEYXRhLT5pU0hPV3RvaWQ7CisgICAgICBpWCAgICA9IGlGcm9tOworCisgICAgICBwRGF0YS0+aVNIT1dmcm9taWQgPSAobW5nX3VpbnQxNilpRnJvbTsKKyAgICAgIHBEYXRhLT5pU0hPV3RvaWQgICA9IChtbmdfdWludDE2KWlUbzsKKyAgICAgIHBEYXRhLT5pU0hPV3NraXAgICA9IGlTOworICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGN5Y2xlIG1vZGUgPyAqLworICAgIGlmICgocERhdGEtPmlTSE9XbW9kZSA9PSA2KSB8fCAocERhdGEtPmlTSE9XbW9kZSA9PSA3KSkKKyAgICB7CisgICAgICBtbmdfdWludDE2IGlUcmlnZ2VyID0gMDsKKyAgICAgIG1uZ191aW50MTYgaUZvdW5kICAgPSAwOworICAgICAgbW5nX3VpbnQxNiBpUGFzcyAgICA9IDA7CisgICAgICBtbmdfaW1hZ2VwIHBGb3VuZCAgID0gMDsKKworICAgICAgZG8KKyAgICAgIHsKKyAgICAgICAgaVBhc3MrKzsgICAgICAgICAgICAgICAgICAgICAgIC8qIGxldHMgcHJldmVudCBlbmRsZXNzIGxvb3BzIHdoZW4gdGhlcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBubyBwb3RlbnRpYWwgY2FuZGlkYXRlcyBpbiB0aGUgbGlzdCEgKi8KKworICAgICAgICBpZiAoaVMgPiAwKSAgICAgICAgICAgICAgICAgICAgLyogZm9yd2FyZCA/ICovCisgICAgICAgIHsKKyAgICAgICAgICBmb3IgKGlYID0gaUZyb207IGlYIDw9IGlUbzsgaVggKz0gaVMpCisgICAgICAgICAgeworICAgICAgICAgICAgcEltYWdlID0gbW5nX2ZpbmRfaW1hZ2VvYmplY3QgKHBEYXRhLCAobW5nX3VpbnQxNilpWCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAocEltYWdlKSAgICAgICAgICAgICAgICAvKiBvYmplY3QgZXhpc3RzID8gKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKGlGb3VuZCkgICAgICAgICAgICAgIC8qIGFscmVhZHkgZm91bmQgYSBjYW5kaWRhdGUgPyAqLworICAgICAgICAgICAgICAgIHBJbWFnZS0+YlZpc2libGUgPSBNTkdfRkFMU0U7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgaWYgKGlUcmlnZ2VyKSAgICAgICAgICAgIC8qIGZvdW5kIHRoZSB0cmlnZ2VyID8gKi8KKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBJbWFnZS0+YlZpc2libGUgPSBNTkdfVFJVRTsKKyAgICAgICAgICAgICAgICBpRm91bmQgICAgICAgICAgID0gaVg7CisgICAgICAgICAgICAgICAgcEZvdW5kICAgICAgICAgICA9IHBJbWFnZTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGlmIChwSW1hZ2UtPmJWaXNpYmxlKSAgICAvKiBvaywgdGhpcyBpcyB0aGUgdHJpZ2dlciAqLworICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEltYWdlLT5iVmlzaWJsZSA9IE1OR19GQUxTRTsKKyAgICAgICAgICAgICAgICBpVHJpZ2dlciAgICAgICAgID0gaVg7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgZm9yIChpWCA9IGlGcm9tOyBpWCA+PSBpVG87IGlYICs9IGlTKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHBJbWFnZSA9IG1uZ19maW5kX2ltYWdlb2JqZWN0IChwRGF0YSwgKG1uZ191aW50MTYpaVgpOworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKHBJbWFnZSkgICAgICAgICAgICAgICAgLyogb2JqZWN0IGV4aXN0cyA/ICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChpRm91bmQpICAgICAgICAgICAgICAvKiBhbHJlYWR5IGZvdW5kIGEgY2FuZGlkYXRlID8gKi8KKyAgICAgICAgICAgICAgICBwSW1hZ2UtPmJWaXNpYmxlID0gTU5HX0ZBTFNFOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGlmIChpVHJpZ2dlcikgICAgICAgICAgICAvKiBmb3VuZCB0aGUgdHJpZ2dlciA/ICovCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwSW1hZ2UtPmJWaXNpYmxlID0gTU5HX1RSVUU7CisgICAgICAgICAgICAgICAgaUZvdW5kICAgICAgICAgICA9IGlYOworICAgICAgICAgICAgICAgIHBGb3VuZCAgICAgICAgICAgPSBwSW1hZ2U7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBpZiAocEltYWdlLT5iVmlzaWJsZSkgICAgLyogb2ssIHRoaXMgaXMgdGhlIHRyaWdnZXIgKi8KKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBJbWFnZS0+YlZpc2libGUgPSBNTkdfRkFMU0U7CisgICAgICAgICAgICAgICAgaVRyaWdnZXIgICAgICAgICA9IGlYOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFpVHJpZ2dlcikgICAgICAgICAgICAgICAgIC8qIGRpZCBub3QgZmluZCBhIHRyaWdnZXIgPyAqLworICAgICAgICAgIGlUcmlnZ2VyID0gMTsgICAgICAgICAgICAgICAgLyogdGhlbiBmYWtlIGl0IHNvIHRoZSBmaXJzdCBpbWFnZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0cyBub21pbmF0ZWQgKi8KKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGN5Y2xlIGJhY2sgdG8gYmVnaW5uaW5nID8gKi8KKyAgICAgIHdoaWxlICgoaVBhc3MgPCAyKSAmJiAoaVRyaWdnZXIpICYmICghaUZvdW5kKSk7CisKKyAgICAgIHBEYXRhLT5pQnJlYWtwb2ludCA9IDA7ICAgICAgICAgIC8qIGp1c3QgYSBzYW5pdHkgcHJlY2F1dGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGlzcGxheSBpdCA/ICovCisgICAgICBpZiAoKHBEYXRhLT5pU0hPV21vZGUgPT0gNikgJiYgKHBGb3VuZCkpCisgICAgICB7CisgICAgICAgIG1uZ19kaXNwbGF5X2ltYWdlIChwRGF0YSwgcEZvdW5kLCBNTkdfRkFMU0UpOworCisgICAgICAgIGlmIChwRGF0YS0+YlRpbWVyc2V0KSAgICAgICAgICAvKiB0aW1lciBzZXQgPyAqLworICAgICAgICB7CisgICAgICAgICAgcERhdGEtPmlCcmVha3BvaW50ID0gMzsKKyAgICAgICAgICBwRGF0YS0+aVNIT1duZXh0aWQgPSBpRm91bmQ7IC8qIHNhdmUgaXQgZm9yIGFmdGVyIHRoZSBicmVhayAqLworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBkbworICAgICAgeworICAgICAgICBwSW1hZ2UgPSBtbmdfZmluZF9pbWFnZW9iamVjdCAocERhdGEsIGlYKTsKKyAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBpZiAocEltYWdlKSAgICAgICAgICAgICAgICAgICAgLyogb2JqZWN0IGV4aXN0cyA/ICovCisgICAgICAgIHsKKyAgICAgICAgICBpZiAocERhdGEtPmlCcmVha3BvaW50KSAgICAgIC8qIGRpZCB3ZSBnZXQgYnJva2VuIGxhc3QgdGltZSA/ICovCisgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3VsZCBvbmx5IGhhcHBlbiBpbiB0aGUgZGlzcGxheSByb3V0aW5lICovCisgICAgICAgICAgICBtbmdfZGlzcGxheV9pbWFnZSAocERhdGEsIHBJbWFnZSwgTU5HX0ZBTFNFKTsKKyAgICAgICAgICAgIHBEYXRhLT5pQnJlYWtwb2ludCA9IDA7ICAgIC8qIG9ubHkgb25jZSBpbnNpZGUgdGhpcyBsb29wIHBsZWFzZSAhICovCisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKHBEYXRhLT5pU0hPV21vZGUpICAvKiBkbyB3aGF0ID8gKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY2FzZSAwIDogeworICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZS0+YlZpc2libGUgPSBNTkdfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfZGlzcGxheV9pbWFnZSAocERhdGEsIHBJbWFnZSwgTU5HX0ZBTFNFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBjYXNlIDEgOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlLT5iVmlzaWJsZSA9IE1OR19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBjYXNlIDIgOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBJbWFnZS0+YlZpc2libGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfZGlzcGxheV9pbWFnZSAocERhdGEsIHBJbWFnZSwgTU5HX0ZBTFNFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBjYXNlIDMgOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlLT5iVmlzaWJsZSA9IE1OR19UUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGNhc2UgNCA6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2UtPmJWaXNpYmxlID0gKG1uZ19ib29sKSghcEltYWdlLT5iVmlzaWJsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBJbWFnZS0+YlZpc2libGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfZGlzcGxheV9pbWFnZSAocERhdGEsIHBJbWFnZSwgTU5HX0ZBTFNFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBjYXNlIDUgOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlLT5iVmlzaWJsZSA9IChtbmdfYm9vbCkoIXBJbWFnZS0+YlZpc2libGUpOworICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFwRGF0YS0+YlRpbWVyc2V0KSAgICAgICAgIC8qIG5leHQgPyAqLworICAgICAgICAgIGlYICs9IGlTOworCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb250aW51ZSA/ICovCisgICAgICB3aGlsZSAoKCFwRGF0YS0+YlRpbWVyc2V0KSAmJiAoKChpUyA+IDApICYmIChpWCA8PSBpVG8pKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaVMgPCAwKSAmJiAoaVggPj0gaVRvKSkgICAgKSk7CisKKyAgICAgIGlmIChwRGF0YS0+YlRpbWVyc2V0KSAgICAgICAgICAgIC8qIHRpbWVyIHNldCA/ICovCisgICAgICB7CisgICAgICAgIHBEYXRhLT5pQnJlYWtwb2ludCA9IDQ7CisgICAgICAgIHBEYXRhLT5pU0hPV25leHRpZCA9IGlYOyAgICAgICAvKiBzYXZlIGZvciBuZXh0IHRpbWUgKi8KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgcERhdGEtPmlCcmVha3BvaW50ID0gMDsKKyAgICAgICAgCisgICAgfQorICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX1NIT1csIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19TQVZFCittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19kaXNwbGF5X3NhdmUgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX3JldGNvZGUgaVJldGNvZGU7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX1NBVkUsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpUmV0Y29kZSA9IHNhdmVfc3RhdGUgKHBEYXRhKTsgICAgICAgLyogc2F2ZSB0aGUgY3VycmVudCBzdGF0ZSAqLworCisgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgIHJldHVybiBpUmV0Y29kZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9DRVNTX0RJU1BMQVlfU0FWRSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX1NFRUsKK21uZ19yZXRjb2RlIG1uZ19wcm9jZXNzX2Rpc3BsYXlfc2VlayAobW5nX2RhdGFwIHBEYXRhKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9DRVNTX0RJU1BMQVlfU0VFSywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfRFlOQU1JQ01ORworICBpZiAocERhdGEtPmJTdG9wYWZ0ZXJzZWVrKSAgICAgICAgICAgLyogbmVlZCB0byBzdG9wIGFmdGVyIHRoaXMgU0VFSyA/ICovCisgIHsKKyAgICBwRGF0YS0+YkZyZWV6aW5nICAgICAgPSBNTkdfVFJVRTsgIC8qIHN0b3AgcHJvY2Vzc2luZyBvbiB0aGlzIG9uZSAqLworICAgIHBEYXRhLT5iUnVubmluZ2V2ZW50ICA9IE1OR19GQUxTRTsKKyAgICBwRGF0YS0+YlN0b3BhZnRlcnNlZWsgPSBNTkdfRkFMU0U7CisgICAgcERhdGEtPmJOZWVkcmVmcmVzaCAgID0gTU5HX1RSVUU7ICAvKiBtYWtlIHN1cmUgdGhlIGxhc3QgYml0IGlzIGRpc3BsYXllZCAhICovCisgIH0KKyAgZWxzZQorI2VuZGlmCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZXN0b3JlIHRoZSBpbml0aWFsIG9yIFNBVkUgc3RhdGUgKi8KKyAgICBtbmdfcmV0Y29kZSBpUmV0Y29kZSA9IHJlc3RvcmVfc3RhdGUgKHBEYXRhKTsKKworICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX0RZTkFNSUNNTkcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3AgYWZ0ZXIgbmV4dCBTRUVLID8gKi8KKyAgICBpZiAoKHBEYXRhLT5iRHluYW1pYykgfHwgKHBEYXRhLT5iUnVubmluZ2V2ZW50KSkKKyAgICAgIHBEYXRhLT5iU3RvcGFmdGVyc2VlayA9IE1OR19UUlVFOworI2VuZGlmCisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9DRVNTX0RJU1BMQVlfU0VFSywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19JTkNMVURFX0pORworbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfZGlzcGxheV9qaGRyIChtbmdfZGF0YXAgcERhdGEpCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGRyZXNzIHRoZSBjdXJyZW50ICJvYmplY3QiIGlmIGFueSAqLworICBtbmdfaW1hZ2VwICBwSW1hZ2UgICA9IChtbmdfaW1hZ2VwKXBEYXRhLT5wQ3VycmVudG9iajsKKyAgbW5nX3JldGNvZGUgaVJldGNvZGUgPSBNTkdfTk9FUlJPUjsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9DRVNTX0RJU1BMQVlfSkhEUiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmICghcERhdGEtPmJIYXNESERSKQorICB7CisgICAgcERhdGEtPmZJbml0cm93cHJvYyAgPSBNTkdfTlVMTDsgICAvKiBkbyBub3RoaW5nIGJ5IGRlZmF1bHQgKi8KKyAgICBwRGF0YS0+ZkRpc3BsYXlyb3cgICA9IE1OR19OVUxMOworICAgIHBEYXRhLT5mQ29ycmVjdHJvdyAgID0gTU5HX05VTEw7CisgICAgcERhdGEtPmZTdG9yZXJvdyAgICAgPSBNTkdfTlVMTDsKKyAgICBwRGF0YS0+ZlByb2Nlc3Nyb3cgICA9IE1OR19OVUxMOworICAgIHBEYXRhLT5mRGlmZmVycm93ICAgID0gTU5HX05VTEw7CisgICAgcERhdGEtPmZTdG9yZXJvdzIgICAgPSBNTkdfTlVMTDsKKyAgICBwRGF0YS0+ZlN0b3Jlcm93MyAgICA9IE1OR19OVUxMOworCisgICAgcERhdGEtPnBTdG9yZW9iaiAgICAgPSBNTkdfTlVMTDsgICAvKiBpbml0aWFsaXplIGltcG9ydGFudCB3b3JrLXBhcm1zICovCisKKyAgICBwRGF0YS0+aUpQRUdyb3cgICAgICA9IDA7CisgICAgcERhdGEtPmlKUEVHYWxwaGFyb3cgPSAwOworICAgIHBEYXRhLT5pSlBFR3JnYnJvdyAgID0gMDsKKyAgICBwRGF0YS0+aVJvd21heCAgICAgICA9IDA7ICAgICAgICAgIC8qIHNvIGluaXRfcm93cHJvYyBkb2VzIHRoZSByaWdodCB0aGluZyAhICovCisgIH0KKworICBpZiAoIXBEYXRhLT5pQnJlYWtwb2ludCkgICAgICAgICAgICAgLyogbm90IHByZXZpb3VzbHkgYnJva2VuID8gKi8KKyAgeworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisgICAgaWYgKHBEYXRhLT5iSGFzREhEUikgICAgICAgICAgICAgICAvKiBkZWx0YS1pbWFnZSA/ICovCisgICAgeworICAgICAgaWYgKHBEYXRhLT5pRGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfUkVQTEFDRSkKKyAgICAgIHsKKyAgICAgICAgaVJldGNvZGUgPSBtbmdfcmVzZXRfb2JqZWN0X2RldGFpbHMgKHBEYXRhLCAobW5nX2ltYWdlcClwRGF0YS0+cERlbHRhSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aURhdGF3aWR0aCwgcERhdGEtPmlEYXRhaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlKSERSaW1nYml0ZGVwdGgsIHBEYXRhLT5pSkhEUmNvbG9ydHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pSkhEUmFscGhhY29tcHJlc3Npb24sIHBEYXRhLT5pSkhEUmFscGhhZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlKSERSYWxwaGFpbnRlcmxhY2UsIE1OR19UUlVFKTsKKworICAgICAgICAoKG1uZ19pbWFnZXApcERhdGEtPnBEZWx0YUltYWdlKS0+cEltZ2J1Zi0+aUFscGhhYml0ZGVwdGggICAgPSBwRGF0YS0+aUpIRFJhbHBoYWJpdGRlcHRoOworICAgICAgICAoKG1uZ19pbWFnZXApcERhdGEtPnBEZWx0YUltYWdlKS0+cEltZ2J1Zi0+aUpIRFJjb21wcmVzc2lvbiAgPSBwRGF0YS0+aUpIRFJpbWdjb21wcmVzc2lvbjsKKyAgICAgICAgKChtbmdfaW1hZ2VwKXBEYXRhLT5wRGVsdGFJbWFnZSktPnBJbWdidWYtPmlKSERSaW50ZXJsYWNlICAgID0gcERhdGEtPmlKSERSaW1naW50ZXJsYWNlOworICAgICAgICAoKG1uZ19pbWFnZXApcERhdGEtPnBEZWx0YUltYWdlKS0+cEltZ2J1Zi0+aUFscGhhc2FtcGxlZGVwdGggPSBwRGF0YS0+aUpIRFJhbHBoYWJpdGRlcHRoOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgaWYgKChwRGF0YS0+aURlbHRhdHlwZSA9PSBNTkdfREVMVEFUWVBFX0JMT0NLUElYRUxBREQgICAgKSB8fAorICAgICAgICAgIChwRGF0YS0+aURlbHRhdHlwZSA9PSBNTkdfREVMVEFUWVBFX0JMT0NLUElYRUxSRVBMQUNFKSAgICApCisgICAgICB7CisgICAgICAgICgobW5nX2ltYWdlcClwRGF0YS0+cERlbHRhSW1hZ2UpLT5wSW1nYnVmLT5pUGl4ZWxzYW1wbGVkZXB0aCA9IHBEYXRhLT5pSkhEUmltZ2JpdGRlcHRoOworICAgICAgICAoKG1uZ19pbWFnZXApcERhdGEtPnBEZWx0YUltYWdlKS0+cEltZ2J1Zi0+aUFscGhhc2FtcGxlZGVwdGggPSBwRGF0YS0+aUpIRFJhbHBoYWJpdGRlcHRoOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgaWYgKChwRGF0YS0+aURlbHRhdHlwZSA9PSBNTkdfREVMVEFUWVBFX0JMT0NLQUxQSEFBREQgICAgKSB8fAorICAgICAgICAgIChwRGF0YS0+aURlbHRhdHlwZSA9PSBNTkdfREVMVEFUWVBFX0JMT0NLQUxQSEFSRVBMQUNFKSAgICApCisgICAgICAgICgobW5nX2ltYWdlcClwRGF0YS0+cERlbHRhSW1hZ2UpLT5wSW1nYnVmLT5pQWxwaGFzYW1wbGVkZXB0aCA9IHBEYXRhLT5pSkhEUmFscGhhYml0ZGVwdGg7CisgICAgICBlbHNlCisgICAgICBpZiAoKHBEYXRhLT5pRGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfQkxPQ0tDT0xPUkFERCAgICApIHx8CisgICAgICAgICAgKHBEYXRhLT5pRGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfQkxPQ0tDT0xPUlJFUExBQ0UpICAgICkKKyAgICAgICAgKChtbmdfaW1hZ2VwKXBEYXRhLT5wRGVsdGFJbWFnZSktPnBJbWdidWYtPmlQaXhlbHNhbXBsZWRlcHRoID0gcERhdGEtPmlKSERSaW1nYml0ZGVwdGg7CisgICAgICAgIAorICAgIH0KKyAgICBlbHNlCisjZW5kaWYgLyogTU5HX05PX0RFTFRBX1BORyAqLworICAgIHsKKyAgICAgIGlmIChwSW1hZ2UpICAgICAgICAgICAgICAgICAgICAgIC8qIHVwZGF0ZSBvYmplY3QgYnVmZmVyID8gKi8KKyAgICAgIHsKKyAgICAgICAgaVJldGNvZGUgPSBtbmdfcmVzZXRfb2JqZWN0X2RldGFpbHMgKHBEYXRhLCBwSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aURhdGF3aWR0aCwgcERhdGEtPmlEYXRhaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlKSERSaW1nYml0ZGVwdGgsIHBEYXRhLT5pSkhEUmNvbG9ydHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pSkhEUmFscGhhY29tcHJlc3Npb24sIHBEYXRhLT5pSkhEUmFscGhhZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlKSERSYWxwaGFpbnRlcmxhY2UsIE1OR19UUlVFKTsKKworICAgICAgICBwSW1hZ2UtPnBJbWdidWYtPmlBbHBoYWJpdGRlcHRoICAgID0gcERhdGEtPmlKSERSYWxwaGFiaXRkZXB0aDsKKyAgICAgICAgcEltYWdlLT5wSW1nYnVmLT5pSkhEUmNvbXByZXNzaW9uICA9IHBEYXRhLT5pSkhEUmltZ2NvbXByZXNzaW9uOworICAgICAgICBwSW1hZ2UtPnBJbWdidWYtPmlKSERSaW50ZXJsYWNlICAgID0gcERhdGEtPmlKSERSaW1naW50ZXJsYWNlOworICAgICAgICBwSW1hZ2UtPnBJbWdidWYtPmlBbHBoYXNhbXBsZWRlcHRoID0gcERhdGEtPmlKSERSYWxwaGFiaXRkZXB0aDsKKyAgICAgIH0KKyAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVwZGF0ZSBvYmplY3QgMCAqLworICAgICAgeworICAgICAgICBpUmV0Y29kZSA9IG1uZ19yZXNldF9vYmplY3RfZGV0YWlscyAocERhdGEsIChtbmdfaW1hZ2VwKXBEYXRhLT5wT2JqemVybywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pRGF0YXdpZHRoLCBwRGF0YS0+aURhdGFoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aUpIRFJpbWdiaXRkZXB0aCwgcERhdGEtPmlKSERSY29sb3J0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlKSERSYWxwaGFjb21wcmVzc2lvbiwgcERhdGEtPmlKSERSYWxwaGFmaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aUpIRFJhbHBoYWludGVybGFjZSwgTU5HX1RSVUUpOworCisgICAgICAgICgobW5nX2ltYWdlcClwRGF0YS0+cE9ianplcm8pLT5wSW1nYnVmLT5pQWxwaGFiaXRkZXB0aCAgICA9IHBEYXRhLT5pSkhEUmFscGhhYml0ZGVwdGg7CisgICAgICAgICgobW5nX2ltYWdlcClwRGF0YS0+cE9ianplcm8pLT5wSW1nYnVmLT5pSkhEUmNvbXByZXNzaW9uICA9IHBEYXRhLT5pSkhEUmltZ2NvbXByZXNzaW9uOworICAgICAgICAoKG1uZ19pbWFnZXApcERhdGEtPnBPYmp6ZXJvKS0+cEltZ2J1Zi0+aUpIRFJpbnRlcmxhY2UgICAgPSBwRGF0YS0+aUpIRFJpbWdpbnRlcmxhY2U7CisgICAgICAgICgobW5nX2ltYWdlcClwRGF0YS0+cE9ianplcm8pLT5wSW1nYnVmLT5pQWxwaGFzYW1wbGVkZXB0aCA9IHBEYXRhLT5pSkhEUmFscGhhYml0ZGVwdGg7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgcmV0dXJuIGlSZXRjb2RlOworICB9CisKKyAgaWYgKCFwRGF0YS0+Ykhhc0RIRFIpCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSdyZSBhbHdheXMgc3RvcmluZyBhIEpQRUcgKi8KKyAgICBpZiAocEltYWdlKSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlYWwgb2JqZWN0ID8gKi8KKyAgICAgIHBEYXRhLT5wU3RvcmVvYmogPSBwSW1hZ2U7ICAgICAgIC8qIHRlbGwgdGhlIHJvdyByb3V0aW5lcyAqLworICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3RoZXJ3aXNlIHVzZSBvYmplY3QgMCAqLworICAgICAgcERhdGEtPnBTdG9yZW9iaiA9IHBEYXRhLT5wT2JqemVybzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRpc3BsYXkgIm9uLXRoZS1mbHkiID8gKi8KKyAgICBpZiAoCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfTUFHTgorICAgICAgICAgKCAoKG1uZ19pbWFnZXApcERhdGEtPnBTdG9yZW9iaiktPmlNQUdOX01ldGhvZFggPT0gMCkgJiYKKyAgICAgICAgICggKChtbmdfaW1hZ2VwKXBEYXRhLT5wU3RvcmVvYmopLT5pTUFHTl9NZXRob2RZID09IDApICYmCisjZW5kaWYKKyAgICAgICAgICggKHBEYXRhLT5lSW1hZ2V0eXBlID09IG1uZ19pdF9qbmcgICAgICAgICApIHx8CisgICAgICAgICAgICgoKG1uZ19pbWFnZXApcERhdGEtPnBTdG9yZW9iaiktPmJWaXNpYmxlKSAgICApICAgICAgICkKKyAgICB7CisgICAgICBuZXh0X2xheWVyIChwRGF0YSk7ICAgICAgICAgICAgICAvKiB0aGF0J3MgYSBuZXcgbGF5ZXIgdGhlbiAhICovCisKKyAgICAgIHBEYXRhLT5pQnJlYWtwb2ludCA9IDA7CisKKyAgICAgIGlmIChwRGF0YS0+YlRpbWVyc2V0KSAgICAgICAgICAgIC8qIHRpbWVyIGJyZWFrID8gKi8KKyAgICAgICAgcERhdGEtPmlCcmVha3BvaW50ID0gNzsKKyAgICAgIGVsc2UKKyAgICAgIGlmIChwRGF0YS0+YlJ1bm5pbmcpICAgICAgICAgICAgIC8qIHN0aWxsIHJ1bm5pbmcgPyAqLworICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW55dGhpbmcgdG8gZGlzcGxheSA/ICovCisgICAgICAgIGlmICgocERhdGEtPmlEZXN0ciA+IHBEYXRhLT5pRGVzdGwpICYmIChwRGF0YS0+aURlc3RiID4gcERhdGEtPmlEZXN0dCkpCisgICAgICAgIHsKKyAgICAgICAgICBzZXRfZGlzcGxheV9yb3V0aW5lIChwRGF0YSk7IC8qIHRoZW4gZGV0ZXJtaW5lIGRpc3BsYXkgcm91dGluZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGlzcGxheSBmcm9tIHRoZSBvYmplY3Qgd2Ugc3RvcmUgaW4gKi8KKyAgICAgICAgICBwRGF0YS0+cFJldHJpZXZlb2JqID0gcERhdGEtPnBTdG9yZW9iajsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmICghcERhdGEtPmJUaW1lcnNldCkgICAgICAgICAgICAgICAvKiBubyB0aW1lciBicmVhayA/ICovCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZhdWx0IHJvdyBpbml0aWFsaXphdGlvbiAhICovCisjaWZkZWYgTU5HX09QVElNSVpFX0ZPT1RQUklOVF9JTklUCisgICAgcERhdGEtPmVQbmdfaW1ndHlwZT1wbmdfbm9uZTsKKyNlbmRpZgorICAgIHBEYXRhLT5mSW5pdHJvd3Byb2MgPSAobW5nX2ZwdHIpbW5nX2luaXRfcm93cHJvYzsKKworICAgIGlmICgoIXBEYXRhLT5iSGFzREhEUikgfHwgKHBEYXRhLT5pRGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfUkVQTEFDRSkpCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4LWJpdCBKUEVHID8gKi8KKyAgICAgIGlmIChwRGF0YS0+aUpIRFJpbWdiaXRkZXB0aCA9PSA4KQorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW50ZXJtZWRpYXRlIHJvdyBpcyA4LWJpdCBkZWVwICovCisgICAgICAgIHBEYXRhLT5iSXNSR0JBMTYgICA9IE1OR19GQUxTRTsKKyAgICAgICAgcERhdGEtPmlSb3dzYW1wbGVzID0gcERhdGEtPmlEYXRhd2lkdGg7CisKKyAgICAgICAgc3dpdGNoIChwRGF0YS0+aUpIRFJjb2xvcnR5cGUpIC8qIGRldGVybWluZSBwaXhlbCBwcm9jZXNzaW5nIHJvdXRpbmVzICovCisgICAgICAgIHsKKyAgICAgICAgICBjYXNlIE1OR19DT0xPUlRZUEVfSlBFR0dSQVkgOgorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICBwRGF0YS0+ZlN0b3Jlcm93MiAgID0gKG1uZ19mcHRyKW1uZ19zdG9yZV9qcGVnX2c4OworICAgICAgICAgICAgICAgICBwRGF0YS0+ZlJldHJpZXZlcm93ID0gKG1uZ19mcHRyKW1uZ19yZXRyaWV2ZV9nODsKKyAgICAgICAgICAgICAgICAgcERhdGEtPmJJc09wYXF1ZSAgICA9IE1OR19UUlVFOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlIE1OR19DT0xPUlRZUEVfSlBFR0NPTE9SIDoKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgcERhdGEtPmZTdG9yZXJvdzIgICA9IChtbmdfZnB0ciltbmdfc3RvcmVfanBlZ19yZ2I4OworICAgICAgICAgICAgICAgICBwRGF0YS0+ZlJldHJpZXZlcm93ID0gKG1uZ19mcHRyKW1uZ19yZXRyaWV2ZV9yZ2I4OworICAgICAgICAgICAgICAgICBwRGF0YS0+YklzT3BhcXVlICAgID0gTU5HX1RSVUU7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgfQorICAgICAgICAgIGNhc2UgTU5HX0NPTE9SVFlQRV9KUEVHR1JBWUEgOgorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICBwRGF0YS0+ZlN0b3Jlcm93MiAgID0gKG1uZ19mcHRyKW1uZ19zdG9yZV9qcGVnX2dhODsKKyAgICAgICAgICAgICAgICAgcERhdGEtPmZSZXRyaWV2ZXJvdyA9IChtbmdfZnB0ciltbmdfcmV0cmlldmVfZ2E4OworICAgICAgICAgICAgICAgICBwRGF0YS0+YklzT3BhcXVlICAgID0gTU5HX0ZBTFNFOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlIE1OR19DT0xPUlRZUEVfSlBFR0NPTE9SQSA6CisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIHBEYXRhLT5mU3RvcmVyb3cyICAgPSAobW5nX2ZwdHIpbW5nX3N0b3JlX2pwZWdfcmdiYTg7CisgICAgICAgICAgICAgICAgIHBEYXRhLT5mUmV0cmlldmVyb3cgPSAobW5nX2ZwdHIpbW5nX3JldHJpZXZlX3JnYmE4OworICAgICAgICAgICAgICAgICBwRGF0YS0+YklzT3BhcXVlICAgID0gTU5HX0ZBTFNFOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBwRGF0YS0+YklzUkdCQTE2ID0gTU5HX1RSVUU7ICAgLyogaW50ZXJtZWRpYXRlIHJvdyBpcyAxNi1iaXQgZGVlcCAqLworCisgICAgICAgIC8qIFRPRE86IDEyLWJpdCBKUEVHICovCisgICAgICAgIC8qIFRPRE86IDgtICsgMTItYml0IEpQRUcgKGVnLiB0eXBlPTIwKSAqLworCisgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBvc3NpYmxlIElEQVQgYWxwaGEtY2hhbm5lbCA/ICovCisgICAgICBpZiAocERhdGEtPmlKSERSYWxwaGFjb21wcmVzc2lvbiA9PSBNTkdfQ09NUFJFU1NJT05fREVGTEFURSkKKyAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRldGVybWluZSBhbHBoYSBwcm9jZXNzaW5nIHJvdXRpbmUgKi8KKyNpZmRlZiBNTkdfT1BUSU1JWkVfRk9PVFBSSU5UX0lOSVQKKyAgICAgICAgcERhdGEtPmZJbml0cm93cHJvYyA9IChtbmdfZnB0ciltbmdfaW5pdF9yb3dwcm9jOworI2VuZGlmCisgICAgICAgIHN3aXRjaCAocERhdGEtPmlKSERSYWxwaGFiaXRkZXB0aCkKKyAgICAgICAgeworI2lmbmRlZiBNTkdfT1BUSU1JWkVfRk9PVFBSSU5UX0lOSVQKKyNpZm5kZWYgTU5HX05PXzFfMl80QklUX1NVUFBPUlQKKyAgICAgICAgICBjYXNlICAxIDogeyBwRGF0YS0+ZkluaXRyb3dwcm9jID0gKG1uZ19mcHRyKW1uZ19pbml0X2pwZWdfYTFfbmk7ICBicmVhazsgfQorICAgICAgICAgIGNhc2UgIDIgOiB7IHBEYXRhLT5mSW5pdHJvd3Byb2MgPSAobW5nX2ZwdHIpbW5nX2luaXRfanBlZ19hMl9uaTsgIGJyZWFrOyB9CisgICAgICAgICAgY2FzZSAgNCA6IHsgcERhdGEtPmZJbml0cm93cHJvYyA9IChtbmdfZnB0ciltbmdfaW5pdF9qcGVnX2E0X25pOyAgYnJlYWs7IH0KKyNlbmRpZiAvKiBNTkdfTk9fMV8yXzRCSVRfU1VQUE9SVCAqLworICAgICAgICAgIGNhc2UgIDggOiB7IHBEYXRhLT5mSW5pdHJvd3Byb2MgPSAobW5nX2ZwdHIpbW5nX2luaXRfanBlZ19hOF9uaTsgIGJyZWFrOyB9CisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgICAgICAgY2FzZSAxNiA6IHsgcERhdGEtPmZJbml0cm93cHJvYyA9IChtbmdfZnB0ciltbmdfaW5pdF9qcGVnX2ExNl9uaTsgYnJlYWs7IH0KKyNlbmRpZgorI2Vsc2UKKyNpZm5kZWYgTU5HX05PXzFfMl80QklUX1NVUFBPUlQKKyAgICAgICAgICBjYXNlICAxIDogeyBwRGF0YS0+ZVBuZ19pbWd0eXBlID0gcG5nX2pwZWdfYTE7ICBicmVhazsgfQorICAgICAgICAgIGNhc2UgIDIgOiB7IHBEYXRhLT5lUG5nX2ltZ3R5cGUgPSBwbmdfanBlZ19hMjsgIGJyZWFrOyB9CisgICAgICAgICAgY2FzZSAgNCA6IHsgcERhdGEtPmVQbmdfaW1ndHlwZSA9IHBuZ19qcGVnX2E0OyAgYnJlYWs7IH0KKyNlbmRpZiAvKiBNTkdfTk9fMV8yXzRCSVRfU1VQUE9SVCAqLworICAgICAgICAgIGNhc2UgIDggOiB7IHBEYXRhLT5lUG5nX2ltZ3R5cGUgPSBwbmdfanBlZ19hODsgIGJyZWFrOyB9CisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgICAgICAgY2FzZSAxNiA6IHsgcERhdGEtPmVQbmdfaW1ndHlwZSA9IHBuZ19qcGVnX2ExNjsgYnJlYWs7IH0KKyNlbmRpZgorI2VuZGlmCisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBvc3NpYmxlIEpEQUEgYWxwaGEtY2hhbm5lbCA/ICovCisgICAgICBpZiAocERhdGEtPmlKSERSYWxwaGFjb21wcmVzc2lvbiA9PSBNTkdfQ09NUFJFU1NJT05fQkFTRUxJTkVKUEVHKQorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogOC1iaXQgSlBFRyA/ICovCisgICAgICAgIGlmIChwRGF0YS0+aUpIRFJpbWdiaXRkZXB0aCA9PSA4KQorICAgICAgICB7CisgICAgICAgICAgaWYgKHBEYXRhLT5pSkhEUmNvbG9ydHlwZSA9PSBNTkdfQ09MT1JUWVBFX0pQRUdHUkFZQSkKKyAgICAgICAgICAgIHBEYXRhLT5mU3RvcmVyb3czID0gKG1uZ19mcHRyKW1uZ19zdG9yZV9qcGVnX2c4X2FscGhhOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICBpZiAocERhdGEtPmlKSERSY29sb3J0eXBlID09IE1OR19DT0xPUlRZUEVfSlBFR0NPTE9SQSkKKyAgICAgICAgICAgIHBEYXRhLT5mU3RvcmVyb3czID0gKG1uZ19mcHRyKW1uZ19zdG9yZV9qcGVnX3JnYjhfYWxwaGE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogVE9ETzogMTItYml0IEpQRUcgd2l0aCA4LWJpdCBKREFBICovCisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpemUgSlBFRyBsaWJyYXJ5ICovCisgICAgICBpUmV0Y29kZSA9IG1uZ2pwZWdfaW5pdGlhbGl6ZSAocERhdGEpOworCisgICAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgfQorICAgIGVsc2UKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG11c3QgYmUgYWxwaGEgYWRkL3JlcGxhY2UgISEgKi8KKyAgICAgIGlmICgocERhdGEtPmlEZWx0YXR5cGUgIT0gTU5HX0RFTFRBVFlQRV9CTE9DS0FMUEhBQUREICAgICkgJiYKKyAgICAgICAgICAocERhdGEtPmlEZWx0YXR5cGUgIT0gTU5HX0RFTFRBVFlQRV9CTE9DS0FMUEhBUkVQTEFDRSkgICAgKQorICAgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WREVMVEFUWVBFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRldGVybWluZSBhbHBoYSBwcm9jZXNzaW5nIHJvdXRpbmUgKi8KKyNpZmRlZiBNTkdfT1BUSU1JWkVfRk9PVFBSSU5UX0lOSVQKKyAgICAgICAgcERhdGEtPmZJbml0cm93cHJvYyA9IChtbmdfZnB0ciltbmdfaW5pdF9yb3dwcm9jOworI2VuZGlmCisgICAgICBzd2l0Y2ggKHBEYXRhLT5pSkhEUmFscGhhYml0ZGVwdGgpCisgICAgICB7CisjaWZuZGVmIE1OR19PUFRJTUlaRV9GT09UUFJJTlRfSU5JVAorI2lmbmRlZiBNTkdfTk9fMV8yXzRCSVRfU1VQUE9SVAorICAgICAgICBjYXNlICAxIDogeyBwRGF0YS0+ZkluaXRyb3dwcm9jID0gKG1uZ19mcHRyKW1uZ19pbml0X2cxX25pOyAgYnJlYWs7IH0KKyAgICAgICAgY2FzZSAgMiA6IHsgcERhdGEtPmZJbml0cm93cHJvYyA9IChtbmdfZnB0ciltbmdfaW5pdF9nMl9uaTsgIGJyZWFrOyB9CisgICAgICAgIGNhc2UgIDQgOiB7IHBEYXRhLT5mSW5pdHJvd3Byb2MgPSAobW5nX2ZwdHIpbW5nX2luaXRfZzRfbmk7ICBicmVhazsgfQorI2VuZGlmIC8qIE1OR19OT18xXzJfNEJJVF9TVVBQT1JUICovCisgICAgICAgIGNhc2UgIDggOiB7IHBEYXRhLT5mSW5pdHJvd3Byb2MgPSAobW5nX2ZwdHIpbW5nX2luaXRfZzhfbmk7ICBicmVhazsgfQorI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgICAgICBjYXNlIDE2IDogeyBwRGF0YS0+ZkluaXRyb3dwcm9jID0gKG1uZ19mcHRyKW1uZ19pbml0X2cxNl9uaTsgYnJlYWs7IH0KKyNlbmRpZgorI2Vsc2UKKyNpZm5kZWYgTU5HX05PXzFfMl80QklUX1NVUFBPUlQKKyAgICAgICAgY2FzZSAgMSA6IHsgcERhdGEtPmVQbmdfaW1ndHlwZSA9IHBuZ19qcGVnX2ExOyAgYnJlYWs7IH0KKyAgICAgICAgY2FzZSAgMiA6IHsgcERhdGEtPmVQbmdfaW1ndHlwZSA9IHBuZ19qcGVnX2EyOyAgYnJlYWs7IH0KKyAgICAgICAgY2FzZSAgNCA6IHsgcERhdGEtPmVQbmdfaW1ndHlwZSA9IHBuZ19qcGVnX2E0OyAgYnJlYWs7IH0KKyNlbmRpZiAvKiBNTkdfTk9fMV8yXzRCSVRfU1VQUE9SVCAqLworICAgICAgICBjYXNlICA4IDogeyBwRGF0YS0+ZVBuZ19pbWd0eXBlID0gcG5nX2pwZWdfYTg7ICBicmVhazsgfQorI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgICAgICBjYXNlIDE2IDogeyBwRGF0YS0+ZVBuZ19pbWd0eXBlID0gcG5nX2pwZWdfYTE2OyBicmVhazsgfQorI2VuZGlmCisjZW5kaWYgLyogTU5HX09QVElNSVpFX0ZPT1RQUklOVF9JTklUICovCisgICAgICB9CisgICAgfQorCisgICAgcERhdGEtPmlGaWx0ZXJvZnMgPSAwOyAgICAgICAgICAgICAvKiBkZXRlcm1pbmUgZmlsdGVyIGNoYXJhY3RlcmlzdGljcyAqLworICAgIHBEYXRhLT5pTGV2ZWwwICAgID0gMDsgICAgICAgICAgICAgLyogZGVmYXVsdCBsZXZlbHMgKi8KKyAgICBwRGF0YS0+aUxldmVsMSAgICA9IDA7ICAgIAorICAgIHBEYXRhLT5pTGV2ZWwyICAgID0gMDsKKyAgICBwRGF0YS0+aUxldmVsMyAgICA9IDA7CisKKyNpZmRlZiBGSUxURVIxOTIgICAgICAgICAgICAgICAgICAgICAgIC8qIGxldmVsaW5nICYgZGlmZmVyaW5nID8gKi8KKyAgICBpZiAocERhdGEtPmlKSERSYWxwaGFmaWx0ZXIgPT0gMHhDMCkKKyAgICB7CisgICAgICAgaWYgKHBEYXRhLT5pSkhEUmFscGhhYml0ZGVwdGggPD0gOCkKKyAgICAgICAgIHBEYXRhLT5pRmlsdGVyb2ZzID0gMTsKKyAgICAgICBlbHNlCisgICAgICAgICBwRGF0YS0+aUZpbHRlcm9mcyA9IDI7CisKKyAgICB9CisjZW5kaWYKKyNpZmRlZiBGSUxURVIxOTMgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vIGFkYXB0aXZlIGZpbHRlcmluZyA/ICovCisgICAgaWYgKHBEYXRhLT5pSkhEUmFscGhhZmlsdGVyID09IDB4QzEpCisgICAgICBwRGF0YS0+aVBpeGVsb2ZzID0gcERhdGEtPmlGaWx0ZXJvZnM7CisgICAgZWxzZQorI2VuZGlmCisgICAgICBwRGF0YS0+aVBpeGVsb2ZzID0gcERhdGEtPmlGaWx0ZXJvZnMgKyAxOworCisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9DRVNTX0RJU1BMQVlfSkhEUiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYgLyogTU5HX0lOQ0xVREVfSk5HICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyNpZm5kZWYgTU5HX09QVElNSVpFX0RJU1BMQVlDQUxMUworbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfZGlzcGxheV9qZGFhIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlSYXdsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcFJhd2RhdGEpCisjZWxzZQorbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfZGlzcGxheV9qZGFhIChtbmdfZGF0YXAgIHBEYXRhKQorI2VuZGlmCit7CisgIG1uZ19yZXRjb2RlIGlSZXRjb2RlID0gTU5HX05PRVJST1I7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX0pEQUEsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAoIXBEYXRhLT5iSlBFR2RlY29tcHJlc3MyKSAgICAgICAgLyogaWYgd2UncmUgbm90IGRlY29tcHJlc3NpbmcgYWxyZWFkeSAqLworICB7CisgICAgaWYgKHBEYXRhLT5mSW5pdHJvd3Byb2MpICAgICAgICAgICAvKiBpbml0aWFsaXplIHJvdy1wcm9jZXNzaW5nPyAqLworICAgIHsKKyAgICAgIGlSZXRjb2RlID0gKChtbmdfaW5pdHJvd3Byb2MpcERhdGEtPmZJbml0cm93cHJvYykgKHBEYXRhKTsKKyAgICAgIHBEYXRhLT5mSW5pdHJvd3Byb2MgPSBNTkdfTlVMTDsgIC8qIG9ubHkgY2FsbCB0aGlzIG9uY2UgISEhICovCisgICAgfQorCisgICAgaWYgKCFpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAvKiBpbml0aWFsaXplIGRlY29tcHJlc3MgKi8KKyAgICAgIGlSZXRjb2RlID0gbW5nanBlZ19kZWNvbXByZXNzaW5pdDIgKHBEYXRhKTsKKyAgfQorCisgIGlmICghaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgICAvKiBhbGwgb2s/IHRoZW4gZGVjb21wcmVzcywgbXkgbWFuICovCisjaWZuZGVmIE1OR19PUFRJTUlaRV9ESVNQTEFZQ0FMTFMKKyAgICBpUmV0Y29kZSA9IG1uZ2pwZWdfZGVjb21wcmVzc2RhdGEyIChwRGF0YSwgaVJhd2xlbiwgcFJhd2RhdGEpOworI2Vsc2UKKyAgICBpUmV0Y29kZSA9IG1uZ2pwZWdfZGVjb21wcmVzc2RhdGEyIChwRGF0YSwgcERhdGEtPmlSYXdsZW4sIHBEYXRhLT5wUmF3ZGF0YSk7CisjZW5kaWYKKworICBpZiAoaVJldGNvZGUpCisgICAgcmV0dXJuIGlSZXRjb2RlOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST0NFU1NfRElTUExBWV9KREFBLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZiAvKiBNTkdfSU5DTFVERV9KTkcgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19JTkNMVURFX0pORworI2lmbmRlZiBNTkdfT1BUSU1JWkVfRElTUExBWUNBTExTCittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19kaXNwbGF5X2pkYXQgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaVJhd2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwUmF3ZGF0YSkKKyNlbHNlCittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19kaXNwbGF5X2pkYXQgKG1uZ19kYXRhcCAgcERhdGEpCisjZW5kaWYKK3sKKyAgbW5nX3JldGNvZGUgaVJldGNvZGUgPSBNTkdfTk9FUlJPUjsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9DRVNTX0RJU1BMQVlfSkRBVCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmIChwRGF0YS0+YlJlc3RvcmVia2dkKSAgICAgICAgICAgICAvKiBuZWVkIHRvIHJlc3RvcmUgdGhlIGJhY2tncm91bmQgPyAqLworICB7CisgICAgcERhdGEtPmJSZXN0b3JlYmtnZCA9IE1OR19GQUxTRTsKKyAgICBpUmV0Y29kZSAgICAgICAgICAgID0gbG9hZF9ia2dkbGF5ZXIgKHBEYXRhKTsKKworICAgIHBEYXRhLT5pTGF5ZXJzZXErKzsgICAgICAgICAgICAgICAgLyogYW5kIGl0IGNvdW50cyBhcyBhIGxheWVyIHRoZW4gISAqLworCisgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgcmV0dXJuIGlSZXRjb2RlOworICB9CisKKyAgaWYgKCFwRGF0YS0+YkpQRUdkZWNvbXByZXNzKSAgICAgICAgIC8qIGlmIHdlJ3JlIG5vdCBkZWNvbXByZXNzaW5nIGFscmVhZHkgKi8KKyAgeworICAgIGlmIChwRGF0YS0+ZkluaXRyb3dwcm9jKSAgICAgICAgICAgLyogaW5pdGlhbGl6ZSByb3ctcHJvY2Vzc2luZz8gKi8KKyAgICB7CisgICAgICBpUmV0Y29kZSA9ICgobW5nX2luaXRyb3dwcm9jKXBEYXRhLT5mSW5pdHJvd3Byb2MpIChwRGF0YSk7CisgICAgICBwRGF0YS0+ZkluaXRyb3dwcm9jID0gTU5HX05VTEw7ICAvKiBvbmx5IGNhbGwgdGhpcyBvbmNlICEhISAqLworICAgIH0KKworICAgIGlmICghaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgLyogaW5pdGlhbGl6ZSBkZWNvbXByZXNzICovCisgICAgICBpUmV0Y29kZSA9IG1uZ2pwZWdfZGVjb21wcmVzc2luaXQgKHBEYXRhKTsKKyAgfQorCisgIGlmICghaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgICAvKiBhbGwgb2s/IHRoZW4gZGVjb21wcmVzcywgbXkgbWFuICovCisjaWZuZGVmIE1OR19PUFRJTUlaRV9ESVNQTEFZQ0FMTFMKKyAgICBpUmV0Y29kZSA9IG1uZ2pwZWdfZGVjb21wcmVzc2RhdGEgKHBEYXRhLCBpUmF3bGVuLCBwUmF3ZGF0YSk7CisjZWxzZQorICAgIGlSZXRjb2RlID0gbW5nanBlZ19kZWNvbXByZXNzZGF0YSAocERhdGEsIHBEYXRhLT5pUmF3bGVuLCBwRGF0YS0+cFJhd2RhdGEpOworI2VuZGlmCisKKyAgaWYgKGlSZXRjb2RlKQorICAgIHJldHVybiBpUmV0Y29kZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9DRVNTX0RJU1BMQVlfSkRBVCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYgLyogTU5HX0lOQ0xVREVfSk5HICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworI2lmbmRlZiBNTkdfT1BUSU1JWkVfRElTUExBWUNBTExTCittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19kaXNwbGF5X2RoZHIgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU9iamVjdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggIGlJbWFnZXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaURlbHRhdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpQmxvY2t3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpQmxvY2toZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaUJsb2NreCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpQmxvY2t5KQorI2Vsc2UKK21uZ19yZXRjb2RlIG1uZ19wcm9jZXNzX2Rpc3BsYXlfZGhkciAobW5nX2RhdGFwICBwRGF0YSkKKyNlbmRpZgoreworICBtbmdfaW1hZ2VwICBwSW1hZ2U7CisgIG1uZ19yZXRjb2RlIGlSZXRjb2RlOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST0NFU1NfRElTUExBWV9ESERSLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcERhdGEtPmZJbml0cm93cHJvYyAgICAgPSBNTkdfTlVMTDsgIC8qIGRvIG5vdGhpbmcgYnkgZGVmYXVsdCAqLworICBwRGF0YS0+ZkRpc3BsYXlyb3cgICAgICA9IE1OR19OVUxMOworICBwRGF0YS0+ZkNvcnJlY3Ryb3cgICAgICA9IE1OR19OVUxMOworICBwRGF0YS0+ZlN0b3Jlcm93ICAgICAgICA9IE1OR19OVUxMOworICBwRGF0YS0+ZlByb2Nlc3Nyb3cgICAgICA9IE1OR19OVUxMOworICBwRGF0YS0+cFN0b3Jlb2JqICAgICAgICA9IE1OR19OVUxMOworCisgIHBEYXRhLT5mRGVsdGFnZXRyb3cgICAgID0gTU5HX05VTEw7CisgIHBEYXRhLT5mRGVsdGFhZGRyb3cgICAgID0gTU5HX05VTEw7CisgIHBEYXRhLT5mRGVsdGFyZXBsYWNlcm93ID0gTU5HX05VTEw7CisgIHBEYXRhLT5mRGVsdGFwdXRyb3cgICAgID0gTU5HX05VTEw7CisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0RJU1BMQVlDQUxMUworICBwSW1hZ2UgPSBtbmdfZmluZF9pbWFnZW9iamVjdCAocERhdGEsIGlPYmplY3RpZCk7CisjZWxzZQorICBwSW1hZ2UgPSBtbmdfZmluZF9pbWFnZW9iamVjdCAocERhdGEsIHBEYXRhLT5pREhEUm9iamVjdGlkKTsKKyNlbmRpZgorCisgIGlmIChwSW1hZ2UpICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvYmplY3QgZXhpc3RzID8gKi8KKyAgeworICAgIGlmIChwSW1hZ2UtPnBJbWdidWYtPmJDb25jcmV0ZSkgICAgLyogaXMgaXQgY29uY3JldGUgPyAqLworICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJldmlvdXMgbWFnbmlmaWNhdGlvbiB0byBiZSBkb25lID8gKi8KKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19NQUdOCisgICAgICBpZiAoKHBJbWFnZS0+aU1BR05fTWV0aG9kWCkgfHwgKHBJbWFnZS0+aU1BR05fTWV0aG9kWSkpCisgICAgICB7CisgICAgICAgIGlSZXRjb2RlID0gbW5nX21hZ25pZnlfaW1hZ2VvYmplY3QgKHBEYXRhLCBwSW1hZ2UpOworICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICAgICAgcmV0dXJuIGlSZXRjb2RlOworICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzYXZlIGRlbHRhIGZpZWxkcyAqLworICAgICAgcERhdGEtPnBEZWx0YUltYWdlICAgICAgICAgICA9IChtbmdfcHRyKXBJbWFnZTsKKyNpZm5kZWYgTU5HX09QVElNSVpFX0RJU1BMQVlDQUxMUworICAgICAgcERhdGEtPmlEZWx0YUltYWdldHlwZSAgICAgICA9IGlJbWFnZXR5cGU7CisgICAgICBwRGF0YS0+aURlbHRhdHlwZSAgICAgICAgICAgID0gaURlbHRhdHlwZTsKKyAgICAgIHBEYXRhLT5pRGVsdGFCbG9ja3dpZHRoICAgICAgPSBpQmxvY2t3aWR0aDsKKyAgICAgIHBEYXRhLT5pRGVsdGFCbG9ja2hlaWdodCAgICAgPSBpQmxvY2toZWlnaHQ7CisgICAgICBwRGF0YS0+aURlbHRhQmxvY2t4ICAgICAgICAgID0gaUJsb2NreDsKKyAgICAgIHBEYXRhLT5pRGVsdGFCbG9ja3kgICAgICAgICAgPSBpQmxvY2t5OworI2Vsc2UKKyAgICAgIHBEYXRhLT5pRGVsdGFJbWFnZXR5cGUgICAgICAgPSBwRGF0YS0+aURIRFJpbWFnZXR5cGU7CisgICAgICBwRGF0YS0+aURlbHRhdHlwZSAgICAgICAgICAgID0gcERhdGEtPmlESERSZGVsdGF0eXBlOworICAgICAgcERhdGEtPmlEZWx0YUJsb2Nrd2lkdGggICAgICA9IHBEYXRhLT5pREhEUmJsb2Nrd2lkdGg7CisgICAgICBwRGF0YS0+aURlbHRhQmxvY2toZWlnaHQgICAgID0gcERhdGEtPmlESERSYmxvY2toZWlnaHQ7CisgICAgICBwRGF0YS0+aURlbHRhQmxvY2t4ICAgICAgICAgID0gcERhdGEtPmlESERSYmxvY2t4OworICAgICAgcERhdGEtPmlEZWx0YUJsb2NreSAgICAgICAgICA9IHBEYXRhLT5pREhEUmJsb2NreTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVzdG9yZSB0YXJnZXQtb2JqZWN0IGZpZWxkcyAqLworICAgICAgcERhdGEtPmlEYXRhd2lkdGggICAgICAgICAgICA9IHBJbWFnZS0+cEltZ2J1Zi0+aVdpZHRoOworICAgICAgcERhdGEtPmlEYXRhaGVpZ2h0ICAgICAgICAgICA9IHBJbWFnZS0+cEltZ2J1Zi0+aUhlaWdodDsKKyAgICAgIHBEYXRhLT5pQml0ZGVwdGggICAgICAgICAgICAgPSBwSW1hZ2UtPnBJbWdidWYtPmlCaXRkZXB0aDsKKyAgICAgIHBEYXRhLT5pQ29sb3J0eXBlICAgICAgICAgICAgPSBwSW1hZ2UtPnBJbWdidWYtPmlDb2xvcnR5cGU7CisgICAgICBwRGF0YS0+aUNvbXByZXNzaW9uICAgICAgICAgID0gcEltYWdlLT5wSW1nYnVmLT5pQ29tcHJlc3Npb247CisgICAgICBwRGF0YS0+aUZpbHRlciAgICAgICAgICAgICAgID0gcEltYWdlLT5wSW1nYnVmLT5pRmlsdGVyOworICAgICAgcERhdGEtPmlJbnRlcmxhY2UgICAgICAgICAgICA9IHBJbWFnZS0+cEltZ2J1Zi0+aUludGVybGFjZTsKKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfRElTUExBWUNBTExTCisgICAgICBpZiAoKGlEZWx0YXR5cGUgPT0gTU5HX0RFTFRBVFlQRV9CTE9DS1BJWEVMQUREICAgICkgfHwKKyAgICAgICAgICAoaURlbHRhdHlwZSA9PSBNTkdfREVMVEFUWVBFX0JMT0NLUElYRUxSRVBMQUNFKSAgICApCisgICAgICAgIHBEYXRhLT5pQml0ZGVwdGggICAgICAgICAgID0gcEltYWdlLT5wSW1nYnVmLT5pUGl4ZWxzYW1wbGVkZXB0aDsKKyAgICAgIGVsc2UKKyAgICAgIGlmICgoaURlbHRhdHlwZSA9PSBNTkdfREVMVEFUWVBFX0JMT0NLQUxQSEFBREQgICAgKSB8fAorICAgICAgICAgIChpRGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfQkxPQ0tBTFBIQVJFUExBQ0UpICAgICkKKyAgICAgICAgcERhdGEtPmlCaXRkZXB0aCAgICAgICAgICAgPSBwSW1hZ2UtPnBJbWdidWYtPmlBbHBoYXNhbXBsZWRlcHRoOworICAgICAgZWxzZQorICAgICAgaWYgKChpRGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfQkxPQ0tDT0xPUkFERCAgICApIHx8CisgICAgICAgICAgKGlEZWx0YXR5cGUgPT0gTU5HX0RFTFRBVFlQRV9CTE9DS0NPTE9SUkVQTEFDRSkgICAgKQorICAgICAgICBwRGF0YS0+aUJpdGRlcHRoICAgICAgICAgICA9IHBJbWFnZS0+cEltZ2J1Zi0+aVBpeGVsc2FtcGxlZGVwdGg7CisjZWxzZQorICAgICAgaWYgKChwRGF0YS0+aURIRFJkZWx0YXR5cGUgPT0gTU5HX0RFTFRBVFlQRV9CTE9DS1BJWEVMQUREICAgICkgfHwKKyAgICAgICAgICAocERhdGEtPmlESERSZGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfQkxPQ0tQSVhFTFJFUExBQ0UpICAgICkKKyAgICAgICAgcERhdGEtPmlCaXRkZXB0aCAgICAgICAgICAgPSBwSW1hZ2UtPnBJbWdidWYtPmlQaXhlbHNhbXBsZWRlcHRoOworICAgICAgZWxzZQorICAgICAgaWYgKChwRGF0YS0+aURIRFJkZWx0YXR5cGUgPT0gTU5HX0RFTFRBVFlQRV9CTE9DS0FMUEhBQUREICAgICkgfHwKKyAgICAgICAgICAocERhdGEtPmlESERSZGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfQkxPQ0tBTFBIQVJFUExBQ0UpICAgICkKKyAgICAgICAgcERhdGEtPmlCaXRkZXB0aCAgICAgICAgICAgPSBwSW1hZ2UtPnBJbWdidWYtPmlBbHBoYXNhbXBsZWRlcHRoOworICAgICAgZWxzZQorICAgICAgaWYgKChwRGF0YS0+aURIRFJkZWx0YXR5cGUgPT0gTU5HX0RFTFRBVFlQRV9CTE9DS0NPTE9SQUREICAgICkgfHwKKyAgICAgICAgICAocERhdGEtPmlESERSZGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfQkxPQ0tDT0xPUlJFUExBQ0UpICAgICkKKyAgICAgICAgcERhdGEtPmlCaXRkZXB0aCAgICAgICAgICAgPSBwSW1hZ2UtPnBJbWdidWYtPmlQaXhlbHNhbXBsZWRlcHRoOworI2VuZGlmCisKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgICAgIHBEYXRhLT5pSkhEUmltZ2JpdGRlcHRoICAgICAgPSBwSW1hZ2UtPnBJbWdidWYtPmlCaXRkZXB0aDsKKyAgICAgIHBEYXRhLT5pSkhEUmNvbG9ydHlwZSAgICAgICAgPSBwSW1hZ2UtPnBJbWdidWYtPmlDb2xvcnR5cGU7CisgICAgICBwRGF0YS0+aUpIRFJpbWdjb21wcmVzc2lvbiAgID0gcEltYWdlLT5wSW1nYnVmLT5pSkhEUmNvbXByZXNzaW9uOworICAgICAgcERhdGEtPmlKSERSaW1naW50ZXJsYWNlICAgICA9IHBJbWFnZS0+cEltZ2J1Zi0+aUpIRFJpbnRlcmxhY2U7CisgICAgICBwRGF0YS0+aUpIRFJhbHBoYWNvbXByZXNzaW9uID0gcEltYWdlLT5wSW1nYnVmLT5pQ29tcHJlc3Npb247CisgICAgICBwRGF0YS0+aUpIRFJhbHBoYWZpbHRlciAgICAgID0gcEltYWdlLT5wSW1nYnVmLT5pRmlsdGVyOworICAgICAgcERhdGEtPmlKSERSYWxwaGFpbnRlcmxhY2UgICA9IHBJbWFnZS0+cEltZ2J1Zi0+aUludGVybGFjZTsKKyAgICAgIHBEYXRhLT5pSkhEUmFscGhhYml0ZGVwdGggICAgPSBwSW1hZ2UtPnBJbWdidWYtPmlBbHBoYWJpdGRlcHRoOworI2VuZGlmCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0RJU1BMQVlDQUxMUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYmxvY2sgc2l6ZSBzcGVjaWZpZWQgPyAqLworICAgICAgaWYgKGlEZWx0YXR5cGUgIT0gTU5HX0RFTFRBVFlQRV9OT0NIQU5HRSkKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJsb2NrIGVudGlyZWx5IHdpdGhpbiB0YXJnZXQgPyAqLworICAgICAgICBpZiAoaURlbHRhdHlwZSAhPSBNTkdfREVMVEFUWVBFX1JFUExBQ0UpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKChpQmxvY2t4ICsgaUJsb2Nrd2lkdGggKSA+IHBEYXRhLT5pRGF0YXdpZHRoICkgfHwKKyAgICAgICAgICAgICAgKChpQmxvY2t5ICsgaUJsb2NraGVpZ2h0KSA+IHBEYXRhLT5pRGF0YWhlaWdodCkgICAgKQorICAgICAgICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURCTE9DSyk7CisgICAgICAgIH0KKworICAgICAgICBwRGF0YS0+aURhdGF3aWR0aCAgICAgICAgICA9IGlCbG9ja3dpZHRoOworICAgICAgICBwRGF0YS0+aURhdGFoZWlnaHQgICAgICAgICA9IGlCbG9ja2hlaWdodDsKKyAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBibG9jayBzaXplIHNwZWNpZmllZCA/ICovCisgICAgICBpZiAocERhdGEtPmlESERSZGVsdGF0eXBlICE9IE1OR19ERUxUQVRZUEVfTk9DSEFOR0UpCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBibG9jayBlbnRpcmVseSB3aXRoaW4gdGFyZ2V0ID8gKi8KKyAgICAgICAgaWYgKHBEYXRhLT5pREhEUmRlbHRhdHlwZSAhPSBNTkdfREVMVEFUWVBFX1JFUExBQ0UpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKChwRGF0YS0+aURIRFJibG9ja3ggKyBwRGF0YS0+aURIRFJibG9ja3dpZHRoICkgPiBwRGF0YS0+aURhdGF3aWR0aCApIHx8CisgICAgICAgICAgICAgICgocERhdGEtPmlESERSYmxvY2t5ICsgcERhdGEtPmlESERSYmxvY2toZWlnaHQpID4gcERhdGEtPmlEYXRhaGVpZ2h0KSAgICApCisgICAgICAgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJREJMT0NLKTsKKyAgICAgICAgfQorCisgICAgICAgIHBEYXRhLT5pRGF0YXdpZHRoICAgICAgICAgID0gcERhdGEtPmlESERSYmxvY2t3aWR0aDsKKyAgICAgICAgcERhdGEtPmlEYXRhaGVpZ2h0ICAgICAgICAgPSBwRGF0YS0+aURIRFJibG9ja2hlaWdodDsKKyAgICAgIH0KKyNlbmRpZgorCisjaWZuZGVmIE1OR19PUFRJTUlaRV9ESVNQTEFZQ0FMTFMKKyAgICAgIHN3aXRjaCAoaURlbHRhdHlwZSkgICAgICAgICAgICAgIC8qIGRldGVybWluZSBuciBvZiBkZWx0YS1jaGFubmVscyAqLworI2Vsc2UKKyAgICAgIHN3aXRjaCAocERhdGEtPmlESERSZGVsdGF0eXBlKSAgIC8qIGRldGVybWluZSBuciBvZiBkZWx0YS1jaGFubmVscyAqLworI2VuZGlmCisgICAgICB7CisgICAgICAgICBjYXNlIE1OR19ERUxUQVRZUEVfQkxPQ0tBTFBIQUFERCA6IDsKKyAgICAgICAgIGNhc2UgTU5HX0RFTFRBVFlQRV9CTE9DS0FMUEhBUkVQTEFDRSA6CisgICAgICAgICAgICAgIHsKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgICAgICAgICAgICAgICBpZiAoKHBEYXRhLT5pQ29sb3J0eXBlICAgICA9PSBNTkdfQ09MT1JUWVBFX0dSQVlBICAgICkgfHwKKyAgICAgICAgICAgICAgICAgICAgKHBEYXRhLT5pSkhEUmNvbG9ydHlwZSA9PSBNTkdfQ09MT1JUWVBFX0pQRUdHUkFZQSkgICAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHBEYXRhLT5pQ29sb3J0eXBlICAgICA9IE1OR19DT0xPUlRZUEVfR1JBWTsKKyAgICAgICAgICAgICAgICAgIHBEYXRhLT5pSkhEUmNvbG9ydHlwZSA9IE1OR19DT0xPUlRZUEVfSlBFR0dSQVk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBpZiAoKHBEYXRhLT5pQ29sb3J0eXBlICAgICA9PSBNTkdfQ09MT1JUWVBFX1JHQkEgICAgICApIHx8CisgICAgICAgICAgICAgICAgICAgIChwRGF0YS0+aUpIRFJjb2xvcnR5cGUgPT0gTU5HX0NPTE9SVFlQRV9KUEVHQ09MT1JBKSAgICApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcERhdGEtPmlDb2xvcnR5cGUgICAgID0gTU5HX0NPTE9SVFlQRV9HUkFZOworICAgICAgICAgICAgICAgICAgcERhdGEtPmlKSERSY29sb3J0eXBlID0gTU5HX0NPTE9SVFlQRV9KUEVHR1JBWTsKKyAgICAgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgICAgIGlmIChwRGF0YS0+aUNvbG9ydHlwZSAgICAgID09IE1OR19DT0xPUlRZUEVfR1JBWUEpCisgICAgICAgICAgICAgICAgICBwRGF0YS0+aUNvbG9ydHlwZSAgICAgPSBNTkdfQ09MT1JUWVBFX0dSQVk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGlmIChwRGF0YS0+aUNvbG9ydHlwZSAgICAgID09IE1OR19DT0xPUlRZUEVfUkdCQSkKKyAgICAgICAgICAgICAgICAgIHBEYXRhLT5pQ29sb3J0eXBlICAgICA9IE1OR19DT0xPUlRZUEVfR1JBWTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgLyogdGFyZ2V0IGhhcyBubyBhbHBoYTsgdGhhdCBzdWNrcyEgKi8KKyAgICAgICAgICAgICAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19UQVJHRVROT0FMUEhBKTsKKworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgIGNhc2UgTU5HX0RFTFRBVFlQRV9CTE9DS0NPTE9SQUREIDogOworICAgICAgICAgY2FzZSBNTkdfREVMVEFUWVBFX0JMT0NLQ09MT1JSRVBMQUNFIDoKKyAgICAgICAgICAgICAgeworI2lmZGVmIE1OR19JTkNMVURFX0pORworICAgICAgICAgICAgICAgIGlmICgocERhdGEtPmlDb2xvcnR5cGUgICAgID09IE1OR19DT0xPUlRZUEVfR1JBWUEgICAgKSB8fAorICAgICAgICAgICAgICAgICAgICAocERhdGEtPmlKSERSY29sb3J0eXBlID09IE1OR19DT0xPUlRZUEVfSlBFR0dSQVlBKSAgICApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcERhdGEtPmlDb2xvcnR5cGUgICAgID0gTU5HX0NPTE9SVFlQRV9HUkFZOworICAgICAgICAgICAgICAgICAgcERhdGEtPmlKSERSY29sb3J0eXBlID0gTU5HX0NPTE9SVFlQRV9KUEVHR1JBWTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGlmICgocERhdGEtPmlDb2xvcnR5cGUgICAgID09IE1OR19DT0xPUlRZUEVfUkdCQSAgICAgICkgfHwKKyAgICAgICAgICAgICAgICAgICAgKHBEYXRhLT5pSkhEUmNvbG9ydHlwZSA9PSBNTkdfQ09MT1JUWVBFX0pQRUdDT0xPUkEpICAgICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBwRGF0YS0+aUNvbG9ydHlwZSAgICAgPSBNTkdfQ09MT1JUWVBFX1JHQjsKKyAgICAgICAgICAgICAgICAgIHBEYXRhLT5pSkhEUmNvbG9ydHlwZSA9IE1OR19DT0xPUlRZUEVfSlBFR0NPTE9SOworICAgICAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICAgICAgaWYgKHBEYXRhLT5pQ29sb3J0eXBlID09IE1OR19DT0xPUlRZUEVfR1JBWUEpCisgICAgICAgICAgICAgICAgICBwRGF0YS0+aUNvbG9ydHlwZSA9IE1OR19DT0xPUlRZUEVfR1JBWTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaWYgKHBEYXRhLT5pQ29sb3J0eXBlID09IE1OR19DT0xPUlRZUEVfUkdCQSkKKyAgICAgICAgICAgICAgICAgIHBEYXRhLT5pQ29sb3J0eXBlID0gTU5HX0NPTE9SVFlQRV9SR0I7CisjZW5kaWYgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgIC8qIHRhcmdldCBoYXMgbm8gYWxwaGE7IHRoYXQgc3Vja3MhICovCisgICAgICAgICAgICAgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfVEFSR0VUTk9BTFBIQSk7CisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmdWxsIGltYWdlIHJlcGxhY2UgPyAqLworI2lmbmRlZiBNTkdfT1BUSU1JWkVfRElTUExBWUNBTExTCisgICAgICBpZiAoaURlbHRhdHlwZSA9PSBNTkdfREVMVEFUWVBFX1JFUExBQ0UpCisjZWxzZQorICAgICAgaWYgKHBEYXRhLT5pREhEUmRlbHRhdHlwZSA9PSBNTkdfREVMVEFUWVBFX1JFUExBQ0UpCisjZW5kaWYKKyAgICAgIHsKKyAgICAgICAgaVJldGNvZGUgPSBtbmdfcmVzZXRfb2JqZWN0X2RldGFpbHMgKHBEYXRhLCBwSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aURhdGF3aWR0aCwgcERhdGEtPmlEYXRhaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlCaXRkZXB0aCwgcERhdGEtPmlDb2xvcnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aUNvbXByZXNzaW9uLCBwRGF0YS0+aUZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pSW50ZXJsYWNlLCBNTkdfRkFMU0UpOworCisgICAgICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgICAgIHJldHVybiBpUmV0Y29kZTsKKworICAgICAgICBwRGF0YS0+cFN0b3Jlb2JqID0gcEltYWdlOyAgICAgLyogYW5kIHN0b3JlIHN0cmFpZ2h0IGludG8gdGhpcyBvYmplY3QgKi8KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgbW5nX2ltYWdlZGF0YXAgcEJ1Znplcm8sIHBCdWY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSBzdG9yZSBpbiBvYmplY3QgMCBhbmQgcHJvY2VzcyBpdCBsYXRlciAqLworICAgICAgICBwRGF0YS0+cFN0b3Jlb2JqID0gcERhdGEtPnBPYmp6ZXJvOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWFrZSBzdXJlIHRvIGluaXRpYWxpemUgb2JqZWN0IDAgdGhlbiAqLworICAgICAgICBpUmV0Y29kZSA9IG1uZ19yZXNldF9vYmplY3RfZGV0YWlscyAocERhdGEsIChtbmdfaW1hZ2VwKXBEYXRhLT5wT2JqemVybywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pRGF0YXdpZHRoLCBwRGF0YS0+aURhdGFoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aUJpdGRlcHRoLCBwRGF0YS0+aUNvbG9ydHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pQ29tcHJlc3Npb24sIHBEYXRhLT5pRmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlJbnRlcmxhY2UsIE1OR19UUlVFKTsKKworICAgICAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgICAgICByZXR1cm4gaVJldGNvZGU7CisKKyAgICAgICAgcEJ1ZiAgICAgPSBwSW1hZ2UtPnBJbWdidWY7ICAgIC8qIGNvcHkgcG9zc2libGUgcGFsZXR0ZSAmIGNoZWFwIHRyYW5zcGFyZW5jeSAqLworICAgICAgICBwQnVmemVybyA9ICgobW5nX2ltYWdlcClwRGF0YS0+cE9ianplcm8pLT5wSW1nYnVmOworCisgICAgICAgIHBCdWZ6ZXJvLT5iSGFzUExURSA9IHBCdWYtPmJIYXNQTFRFOworICAgICAgICBwQnVmemVyby0+Ykhhc1RSTlMgPSBwQnVmLT5iSGFzVFJOUzsKKworICAgICAgICBpZiAocEJ1Znplcm8tPmJIYXNQTFRFKSAgICAgICAgLyogY29weSBwYWxldHRlID8gKi8KKyAgICAgICAgeworICAgICAgICAgIG1uZ191aW50MzIgaVg7CisKKyAgICAgICAgICBwQnVmemVyby0+aVBMVEVjb3VudCA9IHBCdWYtPmlQTFRFY291bnQ7CisKKyAgICAgICAgICBmb3IgKGlYID0gMDsgaVggPCBwQnVmLT5pUExURWNvdW50OyBpWCsrKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHBCdWZ6ZXJvLT5hUExURWVudHJpZXMgW2lYXS5pUmVkICAgPSBwQnVmLT5hUExURWVudHJpZXMgW2lYXS5pUmVkOworICAgICAgICAgICAgcEJ1Znplcm8tPmFQTFRFZW50cmllcyBbaVhdLmlHcmVlbiA9IHBCdWYtPmFQTFRFZW50cmllcyBbaVhdLmlHcmVlbjsKKyAgICAgICAgICAgIHBCdWZ6ZXJvLT5hUExURWVudHJpZXMgW2lYXS5pQmx1ZSAgPSBwQnVmLT5hUExURWVudHJpZXMgW2lYXS5pQmx1ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocEJ1Znplcm8tPmJIYXNUUk5TKSAgICAgICAgLyogY29weSBjaGVhcCB0cmFuc3BhcmVuY3kgPyAqLworICAgICAgICB7CisgICAgICAgICAgcEJ1Znplcm8tPmlUUk5TZ3JheSAgPSBwQnVmLT5pVFJOU2dyYXk7CisgICAgICAgICAgcEJ1Znplcm8tPmlUUk5TcmVkICAgPSBwQnVmLT5pVFJOU3JlZDsKKyAgICAgICAgICBwQnVmemVyby0+aVRSTlNncmVlbiA9IHBCdWYtPmlUUk5TZ3JlZW47CisgICAgICAgICAgcEJ1Znplcm8tPmlUUk5TYmx1ZSAgPSBwQnVmLT5pVFJOU2JsdWU7CisgICAgICAgICAgcEJ1Znplcm8tPmlUUk5TY291bnQgPSBwQnVmLT5pVFJOU2NvdW50OworCisgICAgICAgICAgTU5HX0NPUFkgKHBCdWZ6ZXJvLT5hVFJOU2VudHJpZXMsIHBCdWYtPmFUUk5TZW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChwQnVmemVyby0+YVRSTlNlbnRyaWVzKSk7CisgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByb2Nlc3MgaW1tZWRpYXRlbHkgaWYgYml0ZGVwdGggJiBjb2xvcnR5cGUgYXJlIGVxdWFsICovCisgICAgICAgIHBEYXRhLT5iRGVsdGFpbW1lZGlhdGUgPQorICAgICAgICAgIChtbmdfYm9vbCkoKHBEYXRhLT5iRGlzcGxheWluZykgJiYgKCFwRGF0YS0+YlNraXBwaW5nKSAmJgorICAgICAgICAgICAgICAgICAgICAgKChwRGF0YS0+YlJ1bm5pbmcpIHx8IChwRGF0YS0+YlNlYXJjaGluZykpICYmCisgICAgICAgICAgICAgICAgICAgICAocERhdGEtPmlCaXRkZXB0aCAgPT0gKChtbmdfaW1hZ2VwKXBEYXRhLT5wRGVsdGFJbWFnZSktPnBJbWdidWYtPmlCaXRkZXB0aCApICYmCisgICAgICAgICAgICAgICAgICAgICAocERhdGEtPmlDb2xvcnR5cGUgPT0gKChtbmdfaW1hZ2VwKXBEYXRhLT5wRGVsdGFJbWFnZSktPnBJbWdidWYtPmlDb2xvcnR5cGUpICAgICk7CisgICAgICB9CisgCisjaWZkZWYgTU5HX09QVElNSVpFX0ZPT1RQUklOVF9JTklUCisgIHBEYXRhLT5mSW5pdHJvd3Byb2MgPSAobW5nX2ZwdHIpbW5nX2luaXRfcm93cHJvYzsKKyAgcERhdGEtPmVQbmdfaW1ndHlwZSA9IG1uZ19wbmdfaW1ndHlwZSAocERhdGEtPmlDb2xvcnR5cGUsIHBEYXRhLT5pQml0ZGVwdGgpOworI2Vsc2UKKyAgICAgIHN3aXRjaCAocERhdGEtPmlDb2xvcnR5cGUpICAgICAgIC8qIGRldGVybWluZSByb3cgaW5pdGlhbGl6YXRpb24gcm91dGluZSAqLworICAgICAgeworICAgICAgICBjYXNlIDAgOiB7ICAgICAgICAgICAgICAgICAgICAgLyogZ3JheSAqLworICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocERhdGEtPmlCaXRkZXB0aCkKKyAgICAgICAgICAgICAgICAgICB7CisjaWZuZGVmIE1OR19OT18xXzJfNEJJVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgICBjYXNlICAxIDogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwRGF0YS0+aUludGVybGFjZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZJbml0cm93cHJvYyA9IChtbmdfZnB0ciltbmdfaW5pdF9nMV9uaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZJbml0cm93cHJvYyA9IChtbmdfZnB0ciltbmdfaW5pdF9nMV9pOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICBjYXNlICAyIDogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwRGF0YS0+aUludGVybGFjZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZJbml0cm93cHJvYyA9IChtbmdfZnB0ciltbmdfaW5pdF9nMl9uaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZJbml0cm93cHJvYyA9IChtbmdfZnB0ciltbmdfaW5pdF9nMl9pOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICBjYXNlICA0IDogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwRGF0YS0+aUludGVybGFjZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZJbml0cm93cHJvYyA9IChtbmdfZnB0ciltbmdfaW5pdF9nNF9uaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZJbml0cm93cHJvYyA9IChtbmdfZnB0ciltbmdfaW5pdF9nNF9pOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogTU5HX05PXzFfMl80QklUX1NVUFBPUlQgKi8KKyAgICAgICAgICAgICAgICAgICAgIGNhc2UgIDggOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBEYXRhLT5pSW50ZXJsYWNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZkluaXRyb3dwcm9jID0gKG1uZ19mcHRyKW1uZ19pbml0X2c4X25pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZkluaXRyb3dwcm9jID0gKG1uZ19mcHRyKW1uZ19pbml0X2c4X2k7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTYgOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBEYXRhLT5pSW50ZXJsYWNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZkluaXRyb3dwcm9jID0gKG1uZ19mcHRyKW1uZ19pbml0X2cxNl9uaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZJbml0cm93cHJvYyA9IChtbmdfZnB0ciltbmdfaW5pdF9nMTZfaTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSAyIDogeyAgICAgICAgICAgICAgICAgICAgIC8qIHJnYiAqLworICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocERhdGEtPmlCaXRkZXB0aCkKKyAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBjYXNlICA4IDogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwRGF0YS0+aUludGVybGFjZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZJbml0cm93cHJvYyA9IChtbmdfZnB0ciltbmdfaW5pdF9yZ2I4X25pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZkluaXRyb3dwcm9jID0gKG1uZ19mcHRyKW1uZ19pbml0X3JnYjhfaTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNiA6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcERhdGEtPmlJbnRlcmxhY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mSW5pdHJvd3Byb2MgPSAobW5nX2ZwdHIpbW5nX2luaXRfcmdiMTZfbmk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mSW5pdHJvd3Byb2MgPSAobW5nX2ZwdHIpbW5nX2luaXRfcmdiMTZfaTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSAzIDogeyAgICAgICAgICAgICAgICAgICAgIC8qIGluZGV4ZWQgKi8KKyAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBEYXRhLT5pQml0ZGVwdGgpCisgICAgICAgICAgICAgICAgICAgeworI2lmbmRlZiBNTkdfTk9fMV8yXzRCSVRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICAgY2FzZSAgMSA6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcERhdGEtPmlJbnRlcmxhY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mSW5pdHJvd3Byb2MgPSAobW5nX2ZwdHIpbW5nX2luaXRfaWR4MV9uaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZJbml0cm93cHJvYyA9IChtbmdfZnB0ciltbmdfaW5pdF9pZHgxX2k7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIGNhc2UgIDIgOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBEYXRhLT5pSW50ZXJsYWNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZkluaXRyb3dwcm9jID0gKG1uZ19mcHRyKW1uZ19pbml0X2lkeDJfbmk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mSW5pdHJvd3Byb2MgPSAobW5nX2ZwdHIpbW5nX2luaXRfaWR4Ml9pOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICBjYXNlICA0IDogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwRGF0YS0+aUludGVybGFjZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZJbml0cm93cHJvYyA9IChtbmdfZnB0ciltbmdfaW5pdF9pZHg0X25pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZkluaXRyb3dwcm9jID0gKG1uZ19mcHRyKW1uZ19pbml0X2lkeDRfaTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIE1OR19OT18xXzJfNEJJVF9TVVBQT1JUICovCisgICAgICAgICAgICAgICAgICAgICBjYXNlICA4IDogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwRGF0YS0+aUludGVybGFjZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZJbml0cm93cHJvYyA9IChtbmdfZnB0ciltbmdfaW5pdF9pZHg4X25pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZkluaXRyb3dwcm9jID0gKG1uZ19mcHRyKW1uZ19pbml0X2lkeDhfaTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICB9CisgICAgICAgIGNhc2UgNCA6IHsgICAgICAgICAgICAgICAgICAgICAvKiBncmF5K2FscGhhICovCisgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwRGF0YS0+aUJpdGRlcHRoKQorICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIGNhc2UgIDggOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBEYXRhLT5pSW50ZXJsYWNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZkluaXRyb3dwcm9jID0gKG1uZ19mcHRyKW1uZ19pbml0X2dhOF9uaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZJbml0cm93cHJvYyA9IChtbmdfZnB0ciltbmdfaW5pdF9nYThfaTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNiA6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcERhdGEtPmlJbnRlcmxhY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mSW5pdHJvd3Byb2MgPSAobW5nX2ZwdHIpbW5nX2luaXRfZ2ExNl9uaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZJbml0cm93cHJvYyA9IChtbmdfZnB0ciltbmdfaW5pdF9nYTE2X2k7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICB9CisgICAgICAgIGNhc2UgNiA6IHsgICAgICAgICAgICAgICAgICAgICAvKiByZ2IrYWxwaGEgKi8KKyAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBEYXRhLT5pQml0ZGVwdGgpCisgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgY2FzZSAgOCA6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcERhdGEtPmlJbnRlcmxhY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mSW5pdHJvd3Byb2MgPSAobW5nX2ZwdHIpbW5nX2luaXRfcmdiYThfbmk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mSW5pdHJvd3Byb2MgPSAobW5nX2ZwdHIpbW5nX2luaXRfcmdiYThfaTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNiA6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcERhdGEtPmlJbnRlcmxhY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mSW5pdHJvd3Byb2MgPSAobW5nX2ZwdHIpbW5nX2luaXRfcmdiYTE2X25pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZkluaXRyb3dwcm9jID0gKG1uZ19mcHRyKW1uZ19pbml0X3JnYmExNl9pOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgfQorI2VuZGlmIC8qIE1OR19PUFRJTUlaRV9GT09UUFJJTlRfSU5JVCAqLworICAgIH0KKyAgICBlbHNlCisgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfT0JKTk9UQ09OQ1JFVEUpOworCisgIH0KKyAgZWxzZQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19PQkpFQ1RVTktOT1dOKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9DRVNTX0RJU1BMQVlfREhEUiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisjaWZuZGVmIE1OR19PUFRJTUlaRV9ESVNQTEFZQ0FMTFMKK21uZ19yZXRjb2RlIG1uZ19wcm9jZXNzX2Rpc3BsYXlfcHJvbSAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICBpQml0ZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaUNvbG9ydHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICBpRmlsbHR5cGUpCisjZWxzZQorbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfZGlzcGxheV9wcm9tIChtbmdfZGF0YXAgIHBEYXRhKQorI2VuZGlmCit7CisgIG1uZ19pbWFnZXAgICAgIHBJbWFnZTsKKyAgbW5nX2ltYWdlZGF0YXAgcEJ1ZjsKKyAgbW5nX3JldGNvZGUgICAgaVJldGNvZGU7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX1BST00sIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAoIXBEYXRhLT5wRGVsdGFJbWFnZSkgICAgICAgICAgICAgLyogZ290dGEgaGF2ZSB0aGlzIG5vdyEgKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRERFTFRBKTsKKworICBwSW1hZ2UgPSAobW5nX2ltYWdlcClwRGF0YS0+cERlbHRhSW1hZ2U7CisgIHBCdWYgICA9IHBJbWFnZS0+cEltZ2J1ZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNhbid0IGRlbW90ZSBiaXRkZXB0aCEgKi8KKyNpZm5kZWYgTU5HX09QVElNSVpFX0RJU1BMQVlDQUxMUworICBpZiAoaUJpdGRlcHRoIDwgcEJ1Zi0+aUJpdGRlcHRoKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElEQklUREVQVEgpOworCisgIGlmICggKChwQnVmLT5pQ29sb3J0eXBlID09IE1OR19DT0xPUlRZUEVfR1JBWSAgICAgICkgJiYKKyAgICAgICAgKGlDb2xvcnR5cGUgICAgICAgIT0gTU5HX0NPTE9SVFlQRV9HUkFZICAgICAgKSAmJgorICAgICAgICAoaUNvbG9ydHlwZSAgICAgICAhPSBNTkdfQ09MT1JUWVBFX0dSQVlBICAgICApICYmCisgICAgICAgIChpQ29sb3J0eXBlICAgICAgICE9IE1OR19DT0xPUlRZUEVfUkdCICAgICAgICkgJiYKKyAgICAgICAgKGlDb2xvcnR5cGUgICAgICAgIT0gTU5HX0NPTE9SVFlQRV9SR0JBICAgICAgKSAgICApIHx8CisgICAgICAgKChwQnVmLT5pQ29sb3J0eXBlID09IE1OR19DT0xPUlRZUEVfR1JBWUEgICAgICkgJiYKKyAgICAgICAgKGlDb2xvcnR5cGUgICAgICAgIT0gTU5HX0NPTE9SVFlQRV9HUkFZQSAgICAgKSAmJgorICAgICAgICAoaUNvbG9ydHlwZSAgICAgICAhPSBNTkdfQ09MT1JUWVBFX1JHQkEgICAgICApICAgICkgfHwKKyAgICAgICAoKHBCdWYtPmlDb2xvcnR5cGUgPT0gTU5HX0NPTE9SVFlQRV9SR0IgICAgICAgKSAmJgorICAgICAgICAoaUNvbG9ydHlwZSAgICAgICAhPSBNTkdfQ09MT1JUWVBFX1JHQiAgICAgICApICYmCisgICAgICAgIChpQ29sb3J0eXBlICAgICAgICE9IE1OR19DT0xPUlRZUEVfUkdCQSAgICAgICkgICAgKSB8fAorICAgICAgICgocEJ1Zi0+aUNvbG9ydHlwZSA9PSBNTkdfQ09MT1JUWVBFX1JHQkEgICAgICApICYmCisgICAgICAgIChpQ29sb3J0eXBlICAgICAgICE9IE1OR19DT0xPUlRZUEVfUkdCQSAgICAgICkgICAgKSB8fAorI2lmZGVmIE1OR19JTkNMVURFX0pORworICAgICAgICgocEJ1Zi0+aUNvbG9ydHlwZSA9PSBNTkdfQ09MT1JUWVBFX0pQRUdHUkFZICApICYmCisgICAgICAgIChpQ29sb3J0eXBlICAgICAgICE9IE1OR19DT0xPUlRZUEVfSlBFR0dSQVkgICkgJiYKKyAgICAgICAgKGlDb2xvcnR5cGUgICAgICAgIT0gTU5HX0NPTE9SVFlQRV9KUEVHQ09MT1IgKSAmJgorICAgICAgICAoaUNvbG9ydHlwZSAgICAgICAhPSBNTkdfQ09MT1JUWVBFX0pQRUdHUkFZQSApICYmCisgICAgICAgIChpQ29sb3J0eXBlICAgICAgICE9IE1OR19DT0xPUlRZUEVfSlBFR0NPTE9SQSkgICAgKSB8fAorICAgICAgICgocEJ1Zi0+aUNvbG9ydHlwZSA9PSBNTkdfQ09MT1JUWVBFX0pQRUdDT0xPUiApICYmCisgICAgICAgIChpQ29sb3J0eXBlICAgICAgICE9IE1OR19DT0xPUlRZUEVfSlBFR0NPTE9SICkgJiYKKyAgICAgICAgKGlDb2xvcnR5cGUgICAgICAgIT0gTU5HX0NPTE9SVFlQRV9KUEVHQ09MT1JBKSAgICApIHx8CisgICAgICAgKChwQnVmLT5pQ29sb3J0eXBlID09IE1OR19DT0xPUlRZUEVfSlBFR0dSQVlBICkgJiYKKyAgICAgICAgKGlDb2xvcnR5cGUgICAgICAgIT0gTU5HX0NPTE9SVFlQRV9KUEVHR1JBWUEgKSAmJgorICAgICAgICAoaUNvbG9ydHlwZSAgICAgICAhPSBNTkdfQ09MT1JUWVBFX0pQRUdDT0xPUkEpICAgICkgfHwKKyAgICAgICAoKHBCdWYtPmlDb2xvcnR5cGUgPT0gTU5HX0NPTE9SVFlQRV9KUEVHQ09MT1JBKSAmJgorICAgICAgICAoaUNvbG9ydHlwZSAgICAgICAhPSBNTkdfQ09MT1JUWVBFX0pQRUdDT0xPUkEpICAgICkgfHwKKyNlbmRpZgorICAgICAgICgocEJ1Zi0+aUNvbG9ydHlwZSA9PSBNTkdfQ09MT1JUWVBFX0lOREVYRUQgICApICYmCisgICAgICAgIChpQ29sb3J0eXBlICAgICAgICE9IE1OR19DT0xPUlRZUEVfSU5ERVhFRCAgICkgJiYKKyAgICAgICAgKGlDb2xvcnR5cGUgICAgICAgIT0gTU5HX0NPTE9SVFlQRV9SR0IgICAgICAgKSAmJgorICAgICAgICAoaUNvbG9ydHlwZSAgICAgICAhPSBNTkdfQ09MT1JUWVBFX1JHQkEgICAgICApICAgICkgICAgKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElEQ09MT1JUWVBFKTsKKworICBpUmV0Y29kZSA9IG1uZ19wcm9tb3RlX2ltYWdlb2JqZWN0IChwRGF0YSwgcEltYWdlLCBpQml0ZGVwdGgsIGlDb2xvcnR5cGUsIGlGaWxsdHlwZSk7CisjZWxzZQorICBpZiAocERhdGEtPmlQUk9NYml0ZGVwdGggPCBwQnVmLT5pQml0ZGVwdGgpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURCSVRERVBUSCk7CisKKyAgaWYgKCAoKHBCdWYtPmlDb2xvcnR5cGUgICAgICA9PSBNTkdfQ09MT1JUWVBFX0dSQVkgICAgICApICYmCisgICAgICAgIChwRGF0YS0+aVBST01jb2xvcnR5cGUgIT0gTU5HX0NPTE9SVFlQRV9HUkFZICAgICAgKSAmJgorICAgICAgICAocERhdGEtPmlQUk9NY29sb3J0eXBlICE9IE1OR19DT0xPUlRZUEVfR1JBWUEgICAgICkgJiYKKyAgICAgICAgKHBEYXRhLT5pUFJPTWNvbG9ydHlwZSAhPSBNTkdfQ09MT1JUWVBFX1JHQiAgICAgICApICYmCisgICAgICAgIChwRGF0YS0+aVBST01jb2xvcnR5cGUgIT0gTU5HX0NPTE9SVFlQRV9SR0JBICAgICAgKSAgICApIHx8CisgICAgICAgKChwQnVmLT5pQ29sb3J0eXBlICAgICAgPT0gTU5HX0NPTE9SVFlQRV9HUkFZQSAgICAgKSAmJgorICAgICAgICAocERhdGEtPmlQUk9NY29sb3J0eXBlICE9IE1OR19DT0xPUlRZUEVfR1JBWUEgICAgICkgJiYKKyAgICAgICAgKHBEYXRhLT5pUFJPTWNvbG9ydHlwZSAhPSBNTkdfQ09MT1JUWVBFX1JHQkEgICAgICApICAgICkgfHwKKyAgICAgICAoKHBCdWYtPmlDb2xvcnR5cGUgICAgICA9PSBNTkdfQ09MT1JUWVBFX1JHQiAgICAgICApICYmCisgICAgICAgIChwRGF0YS0+aVBST01jb2xvcnR5cGUgIT0gTU5HX0NPTE9SVFlQRV9SR0IgICAgICAgKSAmJgorICAgICAgICAocERhdGEtPmlQUk9NY29sb3J0eXBlICE9IE1OR19DT0xPUlRZUEVfUkdCQSAgICAgICkgICAgKSB8fAorICAgICAgICgocEJ1Zi0+aUNvbG9ydHlwZSAgICAgID09IE1OR19DT0xPUlRZUEVfUkdCQSAgICAgICkgJiYKKyAgICAgICAgKHBEYXRhLT5pUFJPTWNvbG9ydHlwZSAhPSBNTkdfQ09MT1JUWVBFX1JHQkEgICAgICApICAgICkgfHwKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgICAgICAoKHBCdWYtPmlDb2xvcnR5cGUgICAgICA9PSBNTkdfQ09MT1JUWVBFX0pQRUdHUkFZICApICYmCisgICAgICAgIChwRGF0YS0+aVBST01jb2xvcnR5cGUgIT0gTU5HX0NPTE9SVFlQRV9KUEVHR1JBWSAgKSAmJgorICAgICAgICAocERhdGEtPmlQUk9NY29sb3J0eXBlICE9IE1OR19DT0xPUlRZUEVfSlBFR0NPTE9SICkgJiYKKyAgICAgICAgKHBEYXRhLT5pUFJPTWNvbG9ydHlwZSAhPSBNTkdfQ09MT1JUWVBFX0pQRUdHUkFZQSApICYmCisgICAgICAgIChwRGF0YS0+aVBST01jb2xvcnR5cGUgIT0gTU5HX0NPTE9SVFlQRV9KUEVHQ09MT1JBKSAgICApIHx8CisgICAgICAgKChwQnVmLT5pQ29sb3J0eXBlICAgICAgPT0gTU5HX0NPTE9SVFlQRV9KUEVHQ09MT1IgKSAmJgorICAgICAgICAocERhdGEtPmlQUk9NY29sb3J0eXBlICE9IE1OR19DT0xPUlRZUEVfSlBFR0NPTE9SICkgJiYKKyAgICAgICAgKHBEYXRhLT5pUFJPTWNvbG9ydHlwZSAhPSBNTkdfQ09MT1JUWVBFX0pQRUdDT0xPUkEpICAgICkgfHwKKyAgICAgICAoKHBCdWYtPmlDb2xvcnR5cGUgICAgICA9PSBNTkdfQ09MT1JUWVBFX0pQRUdHUkFZQSApICYmCisgICAgICAgIChwRGF0YS0+aVBST01jb2xvcnR5cGUgIT0gTU5HX0NPTE9SVFlQRV9KUEVHR1JBWUEgKSAmJgorICAgICAgICAocERhdGEtPmlQUk9NY29sb3J0eXBlICE9IE1OR19DT0xPUlRZUEVfSlBFR0NPTE9SQSkgICAgKSB8fAorICAgICAgICgocEJ1Zi0+aUNvbG9ydHlwZSAgICAgID09IE1OR19DT0xPUlRZUEVfSlBFR0NPTE9SQSkgJiYKKyAgICAgICAgKHBEYXRhLT5pUFJPTWNvbG9ydHlwZSAhPSBNTkdfQ09MT1JUWVBFX0pQRUdDT0xPUkEpICAgICkgfHwKKyNlbmRpZgorICAgICAgICgocEJ1Zi0+aUNvbG9ydHlwZSAgICAgID09IE1OR19DT0xPUlRZUEVfSU5ERVhFRCAgICkgJiYKKyAgICAgICAgKHBEYXRhLT5pUFJPTWNvbG9ydHlwZSAhPSBNTkdfQ09MT1JUWVBFX0lOREVYRUQgICApICYmCisgICAgICAgIChwRGF0YS0+aVBST01jb2xvcnR5cGUgIT0gTU5HX0NPTE9SVFlQRV9SR0IgICAgICAgKSAmJgorICAgICAgICAocERhdGEtPmlQUk9NY29sb3J0eXBlICE9IE1OR19DT0xPUlRZUEVfUkdCQSAgICAgICkgICAgKSAgICApCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURDT0xPUlRZUEUpOworCisgIGlSZXRjb2RlID0gbW5nX3Byb21vdGVfaW1hZ2VvYmplY3QgKHBEYXRhLCBwSW1hZ2UsIHBEYXRhLT5pUFJPTWJpdGRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aVBST01jb2xvcnR5cGUsIHBEYXRhLT5pUFJPTWZpbGx0eXBlKTsKKyNlbmRpZgorCisgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgIHJldHVybiBpUmV0Y29kZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9DRVNTX0RJU1BMQVlfUFJPTSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19kaXNwbGF5X2lwbmcgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX0lQTkcsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluZGljYXRlIGl0IGZvciB3aGF0IGl0IGlzIG5vdyAqLworICBwRGF0YS0+aURlbHRhSW1hZ2V0eXBlID0gTU5HX0lNQUdFVFlQRV9QTkc7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX0lQTkcsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworI2lmZGVmIE1OR19JTkNMVURFX0pORworbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfZGlzcGxheV9pam5nIChtbmdfZGF0YXAgcERhdGEpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST0NFU1NfRElTUExBWV9JSk5HLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbmRpY2F0ZSBpdCBmb3Igd2hhdCBpdCBpcyBub3cgKi8KKyAgcERhdGEtPmlEZWx0YUltYWdldHlwZSA9IE1OR19JTUFHRVRZUEVfSk5HOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST0NFU1NfRElTUExBWV9JSk5HLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworI2lmbmRlZiBNTkdfT1BUSU1JWkVfRElTUExBWUNBTExTCittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19kaXNwbGF5X3BwbHQgKG1uZ19kYXRhcCAgICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICBpVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgaUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcGFsZXR0ZThlcCBwYUluZGV4ZW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCAgICAgcGFBbHBoYWVudHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgICAgIHBhVXNlZGVudHJpZXMpCisjZWxzZQorbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfZGlzcGxheV9wcGx0IChtbmdfZGF0YXAgICAgICBwRGF0YSkKKyNlbmRpZgoreworICBtbmdfdWludDMyICAgICBpWDsKKyAgbW5nX2ltYWdlcCAgICAgcEltYWdlID0gKG1uZ19pbWFnZXApcERhdGEtPnBPYmp6ZXJvOworICBtbmdfaW1hZ2VkYXRhcCBwQnVmICAgPSBwSW1hZ2UtPnBJbWdidWY7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX1BQTFQsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyNpZm5kZWYgTU5HX09QVElNSVpFX0RJU1BMQVlDQUxMUworICBpWCA9IGlDb3VudDsKKyNlbHNlCisgIGlYID0gcERhdGEtPmlQUExUY291bnQ7CisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIE1OR19PUFRJTUlaRV9ESVNQTEFZQ0FMTFMKKyAgc3dpdGNoIChpVHlwZSkKKyNlbHNlCisgIHN3aXRjaCAocERhdGEtPmlQUExUdHlwZSkKKyNlbmRpZgorICB7CisgICAgY2FzZSBNTkdfREVMVEFUWVBFX1JFUExBQ0VSR0IgOgorICAgICAgeworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgICAgICAgZm9yICg7IGlYID4gMDtpWC0tKQorI2Vsc2UKKyNpZm5kZWYgTU5HX09QVElNSVpFX0RJU1BMQVlDQUxMUworICAgICAgICBmb3IgKGlYID0gMDsgaVggPCBpQ291bnQ7IGlYKyspCisjZWxzZQorICAgICAgICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVBQTFRjb3VudDsgaVgrKykKKyNlbmRpZgorI2VuZGlmCisgICAgICAgIHsKKyNpZm5kZWYgTU5HX09QVElNSVpFX0RJU1BMQVlDQUxMUworICAgICAgICAgIGlmIChwYVVzZWRlbnRyaWVzIFtpWF0pCisgICAgICAgICAgeworICAgICAgICAgICAgcEJ1Zi0+YVBMVEVlbnRyaWVzIFtpWF0uaVJlZCAgID0gcGFJbmRleGVudHJpZXMgW2lYXS5pUmVkOworICAgICAgICAgICAgcEJ1Zi0+YVBMVEVlbnRyaWVzIFtpWF0uaUdyZWVuID0gcGFJbmRleGVudHJpZXMgW2lYXS5pR3JlZW47CisgICAgICAgICAgICBwQnVmLT5hUExURWVudHJpZXMgW2lYXS5pQmx1ZSAgPSBwYUluZGV4ZW50cmllcyBbaVhdLmlCbHVlOworICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgaWYgKHBEYXRhLT5wYVBQTFR1c2VkZW50cmllcyBbaVhdKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHBCdWYtPmFQTFRFZW50cmllcyBbaVhdLmlSZWQgICA9IHBEYXRhLT5wYVBQTFRpbmRleGVudHJpZXMgW2lYXS5pUmVkOworICAgICAgICAgICAgcEJ1Zi0+YVBMVEVlbnRyaWVzIFtpWF0uaUdyZWVuID0gcERhdGEtPnBhUFBMVGluZGV4ZW50cmllcyBbaVhdLmlHcmVlbjsKKyAgICAgICAgICAgIHBCdWYtPmFQTFRFZW50cmllcyBbaVhdLmlCbHVlICA9IHBEYXRhLT5wYVBQTFRpbmRleGVudHJpZXMgW2lYXS5pQmx1ZTsKKyAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgTU5HX0RFTFRBVFlQRV9ERUxUQVJHQiA6CisgICAgICB7CisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICAgICAgICBmb3IgKDsgaVggPiAwO2lYLS0pCisjZWxzZQorI2lmbmRlZiBNTkdfT1BUSU1JWkVfRElTUExBWUNBTExTCisgICAgICAgIGZvciAoaVggPSAwOyBpWCA8IGlDb3VudDsgaVgrKykKKyNlbHNlCisgICAgICAgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUFBMVGNvdW50OyBpWCsrKQorI2VuZGlmCisjZW5kaWYKKyAgICAgICAgeworI2lmbmRlZiBNTkdfT1BUSU1JWkVfRElTUExBWUNBTExTCisgICAgICAgICAgaWYgKHBhVXNlZGVudHJpZXMgW2lYXSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBwQnVmLT5hUExURWVudHJpZXMgW2lYXS5pUmVkICAgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfdWludDgpKHBCdWYtPmFQTFRFZW50cmllcyBbaVhdLmlSZWQgICArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFJbmRleGVudHJpZXMgW2lYXS5pUmVkICApOworICAgICAgICAgICAgcEJ1Zi0+YVBMVEVlbnRyaWVzIFtpWF0uaUdyZWVuID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX3VpbnQ4KShwQnVmLT5hUExURWVudHJpZXMgW2lYXS5pR3JlZW4gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhSW5kZXhlbnRyaWVzIFtpWF0uaUdyZWVuKTsKKyAgICAgICAgICAgIHBCdWYtPmFQTFRFZW50cmllcyBbaVhdLmlCbHVlICA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ191aW50OCkocEJ1Zi0+YVBMVEVlbnRyaWVzIFtpWF0uaUJsdWUgICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYUluZGV4ZW50cmllcyBbaVhdLmlCbHVlICk7CisgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICBpZiAocERhdGEtPnBhUFBMVHVzZWRlbnRyaWVzIFtpWF0pCisgICAgICAgICAgeworICAgICAgICAgICAgcEJ1Zi0+YVBMVEVlbnRyaWVzIFtpWF0uaVJlZCAgID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX3VpbnQ4KShwQnVmLT5hUExURWVudHJpZXMgW2lYXS5pUmVkICAgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5wYVBQTFRpbmRleGVudHJpZXMgW2lYXS5pUmVkICApOworICAgICAgICAgICAgcEJ1Zi0+YVBMVEVlbnRyaWVzIFtpWF0uaUdyZWVuID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX3VpbnQ4KShwQnVmLT5hUExURWVudHJpZXMgW2lYXS5pR3JlZW4gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5wYVBQTFRpbmRleGVudHJpZXMgW2lYXS5pR3JlZW4pOworICAgICAgICAgICAgcEJ1Zi0+YVBMVEVlbnRyaWVzIFtpWF0uaUJsdWUgID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX3VpbnQ4KShwQnVmLT5hUExURWVudHJpZXMgW2lYXS5pQmx1ZSAgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5wYVBQTFRpbmRleGVudHJpZXMgW2lYXS5pQmx1ZSApOworICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgY2FzZSBNTkdfREVMVEFUWVBFX1JFUExBQ0VBTFBIQSA6CisgICAgICB7CisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICAgICAgICBmb3IgKDsgaVggPiAwO2lYLS0pCisjZWxzZQorI2lmbmRlZiBNTkdfT1BUSU1JWkVfRElTUExBWUNBTExTCisgICAgICAgIGZvciAoaVggPSAwOyBpWCA8IGlDb3VudDsgaVgrKykKKyNlbHNlCisgICAgICAgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUFBMVGNvdW50OyBpWCsrKQorI2VuZGlmCisjZW5kaWYKKyAgICAgICAgeworI2lmbmRlZiBNTkdfT1BUSU1JWkVfRElTUExBWUNBTExTCisgICAgICAgICAgaWYgKHBhVXNlZGVudHJpZXMgW2lYXSkKKyAgICAgICAgICAgIHBCdWYtPmFUUk5TZW50cmllcyBbaVhdID0gcGFBbHBoYWVudHJpZXMgW2lYXTsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICBpZiAocERhdGEtPnBhUFBMVHVzZWRlbnRyaWVzIFtpWF0pCisgICAgICAgICAgICBwQnVmLT5hVFJOU2VudHJpZXMgW2lYXSA9IHBEYXRhLT5wYVBQTFRhbHBoYWVudHJpZXMgW2lYXTsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgY2FzZSBNTkdfREVMVEFUWVBFX0RFTFRBQUxQSEEgOgorICAgICAgeworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgICAgICAgZm9yICg7IGlYID4gMDtpWC0tKQorI2Vsc2UKKyNpZm5kZWYgTU5HX09QVElNSVpFX0RJU1BMQVlDQUxMUworICAgICAgICBmb3IgKGlYID0gMDsgaVggPCBpQ291bnQ7IGlYKyspCisjZWxzZQorICAgICAgICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVBQTFRjb3VudDsgaVgrKykKKyNlbmRpZgorI2VuZGlmCisgICAgICAgIHsKKyNpZm5kZWYgTU5HX09QVElNSVpFX0RJU1BMQVlDQUxMUworICAgICAgICAgIGlmIChwYVVzZWRlbnRyaWVzIFtpWF0pCisgICAgICAgICAgICBwQnVmLT5hVFJOU2VudHJpZXMgW2lYXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ191aW50OCkocEJ1Zi0+YVRSTlNlbnRyaWVzIFtpWF0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhQWxwaGFlbnRyaWVzIFtpWF0pOworI2Vsc2UKKyAgICAgICAgICBpZiAocERhdGEtPnBhUFBMVHVzZWRlbnRyaWVzIFtpWF0pCisgICAgICAgICAgICBwQnVmLT5hVFJOU2VudHJpZXMgW2lYXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ191aW50OCkocEJ1Zi0+YVRSTlNlbnRyaWVzIFtpWF0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5wYVBQTFRhbHBoYWVudHJpZXMgW2lYXSk7CisjZW5kaWYKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgTU5HX0RFTFRBVFlQRV9SRVBMQUNFUkdCQSA6CisgICAgICB7CisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICAgICAgICBmb3IgKDsgaVggPiAwO2lYLS0pCisjZWxzZQorI2lmbmRlZiBNTkdfT1BUSU1JWkVfRElTUExBWUNBTExTCisgICAgICAgIGZvciAoaVggPSAwOyBpWCA8IGlDb3VudDsgaVgrKykKKyNlbHNlCisgICAgICAgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUFBMVGNvdW50OyBpWCsrKQorI2VuZGlmCisjZW5kaWYKKyAgICAgICAgeworI2lmbmRlZiBNTkdfT1BUSU1JWkVfRElTUExBWUNBTExTCisgICAgICAgICAgaWYgKHBhVXNlZGVudHJpZXMgW2lYXSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBwQnVmLT5hUExURWVudHJpZXMgW2lYXS5pUmVkICAgPSBwYUluZGV4ZW50cmllcyBbaVhdLmlSZWQ7CisgICAgICAgICAgICBwQnVmLT5hUExURWVudHJpZXMgW2lYXS5pR3JlZW4gPSBwYUluZGV4ZW50cmllcyBbaVhdLmlHcmVlbjsKKyAgICAgICAgICAgIHBCdWYtPmFQTFRFZW50cmllcyBbaVhdLmlCbHVlICA9IHBhSW5kZXhlbnRyaWVzIFtpWF0uaUJsdWU7CisgICAgICAgICAgICBwQnVmLT5hVFJOU2VudHJpZXMgW2lYXSAgICAgICAgPSBwYUFscGhhZW50cmllcyBbaVhdOworICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgaWYgKHBEYXRhLT5wYVBQTFR1c2VkZW50cmllcyBbaVhdKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHBCdWYtPmFQTFRFZW50cmllcyBbaVhdLmlSZWQgICA9IHBEYXRhLT5wYVBQTFRpbmRleGVudHJpZXMgW2lYXS5pUmVkOworICAgICAgICAgICAgcEJ1Zi0+YVBMVEVlbnRyaWVzIFtpWF0uaUdyZWVuID0gcERhdGEtPnBhUFBMVGluZGV4ZW50cmllcyBbaVhdLmlHcmVlbjsKKyAgICAgICAgICAgIHBCdWYtPmFQTFRFZW50cmllcyBbaVhdLmlCbHVlICA9IHBEYXRhLT5wYVBQTFRpbmRleGVudHJpZXMgW2lYXS5pQmx1ZTsKKyAgICAgICAgICAgIHBCdWYtPmFUUk5TZW50cmllcyBbaVhdICAgICAgICA9IHBEYXRhLT5wYVBQTFRhbHBoYWVudHJpZXMgW2lYXTsKKyAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgTU5HX0RFTFRBVFlQRV9ERUxUQVJHQkEgOgorICAgICAgeworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgICAgICAgZm9yICg7IGlYID4gMDtpWC0tKQorI2Vsc2UKKyNpZm5kZWYgTU5HX09QVElNSVpFX0RJU1BMQVlDQUxMUworICAgICAgICBmb3IgKGlYID0gMDsgaVggPCBpQ291bnQ7IGlYKyspCisjZWxzZQorICAgICAgICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVBQTFRjb3VudDsgaVgrKykKKyNlbmRpZgorI2VuZGlmCisgICAgICAgIHsKKyNpZm5kZWYgTU5HX09QVElNSVpFX0RJU1BMQVlDQUxMUworICAgICAgICAgIGlmIChwYVVzZWRlbnRyaWVzIFtpWF0pCisgICAgICAgICAgeworICAgICAgICAgICAgcEJ1Zi0+YVBMVEVlbnRyaWVzIFtpWF0uaVJlZCAgID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX3VpbnQ4KShwQnVmLT5hUExURWVudHJpZXMgW2lYXS5pUmVkICAgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhSW5kZXhlbnRyaWVzIFtpWF0uaVJlZCAgKTsKKyAgICAgICAgICAgIHBCdWYtPmFQTFRFZW50cmllcyBbaVhdLmlHcmVlbiA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ191aW50OCkocEJ1Zi0+YVBMVEVlbnRyaWVzIFtpWF0uaUdyZWVuICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYUluZGV4ZW50cmllcyBbaVhdLmlHcmVlbik7CisgICAgICAgICAgICBwQnVmLT5hUExURWVudHJpZXMgW2lYXS5pQmx1ZSAgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfdWludDgpKHBCdWYtPmFQTFRFZW50cmllcyBbaVhdLmlCbHVlICArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFJbmRleGVudHJpZXMgW2lYXS5pQmx1ZSApOworICAgICAgICAgICAgcEJ1Zi0+YVRSTlNlbnRyaWVzIFtpWF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfdWludDgpKHBCdWYtPmFUUk5TZW50cmllcyBbaVhdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYUFscGhhZW50cmllcyBbaVhdKTsKKyAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgIGlmIChwRGF0YS0+cGFQUExUdXNlZGVudHJpZXMgW2lYXSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBwQnVmLT5hUExURWVudHJpZXMgW2lYXS5pUmVkICAgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfdWludDgpKHBCdWYtPmFQTFRFZW50cmllcyBbaVhdLmlSZWQgICArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPnBhUFBMVGluZGV4ZW50cmllcyBbaVhdLmlSZWQgICk7CisgICAgICAgICAgICBwQnVmLT5hUExURWVudHJpZXMgW2lYXS5pR3JlZW4gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfdWludDgpKHBCdWYtPmFQTFRFZW50cmllcyBbaVhdLmlHcmVlbiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPnBhUFBMVGluZGV4ZW50cmllcyBbaVhdLmlHcmVlbik7CisgICAgICAgICAgICBwQnVmLT5hUExURWVudHJpZXMgW2lYXS5pQmx1ZSAgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfdWludDgpKHBCdWYtPmFQTFRFZW50cmllcyBbaVhdLmlCbHVlICArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPnBhUFBMVGluZGV4ZW50cmllcyBbaVhdLmlCbHVlICk7CisgICAgICAgICAgICBwQnVmLT5hVFJOU2VudHJpZXMgW2lYXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ191aW50OCkocEJ1Zi0+YVRSTlNlbnRyaWVzIFtpWF0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5wYVBQTFRhbHBoYWVudHJpZXMgW2lYXSk7CisgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgfQorCisjaWZuZGVmIE1OR19PUFRJTUlaRV9ESVNQTEFZQ0FMTFMKKyAgaWYgKChpVHlwZSAhPSBNTkdfREVMVEFUWVBFX1JFUExBQ0VSR0IpICYmIChpVHlwZSAhPSBNTkdfREVMVEFUWVBFX0RFTFRBUkdCKSkKKyNlbHNlCisgIGlmICgocERhdGEtPmlQUExUdHlwZSAhPSBNTkdfREVMVEFUWVBFX1JFUExBQ0VSR0IpICYmCisgICAgICAocERhdGEtPmlQUExUdHlwZSAhPSBNTkdfREVMVEFUWVBFX0RFTFRBUkdCICApICAgICkKKyNlbmRpZgorICB7CisgICAgaWYgKHBCdWYtPmJIYXNUUk5TKQorICAgIHsKKyNpZm5kZWYgTU5HX09QVElNSVpFX0RJU1BMQVlDQUxMUworICAgICAgaWYgKGlDb3VudCA+IHBCdWYtPmlUUk5TY291bnQpCisgICAgICAgIHBCdWYtPmlUUk5TY291bnQgPSBpQ291bnQ7CisjZWxzZQorICAgICAgaWYgKHBEYXRhLT5pUFBMVGNvdW50ID4gcEJ1Zi0+aVRSTlNjb3VudCkKKyAgICAgICAgcEJ1Zi0+aVRSTlNjb3VudCA9IHBEYXRhLT5pUFBMVGNvdW50OworI2VuZGlmCisgICAgfQorICAgIGVsc2UKKyAgICB7CisjaWZuZGVmIE1OR19PUFRJTUlaRV9ESVNQTEFZQ0FMTFMKKyAgICAgIHBCdWYtPmlUUk5TY291bnQgPSBpQ291bnQ7CisgICAgICBwQnVmLT5iSGFzVFJOUyAgID0gTU5HX1RSVUU7CisjZWxzZQorICAgICAgcEJ1Zi0+aVRSTlNjb3VudCA9IHBEYXRhLT5pUFBMVGNvdW50OworICAgICAgcEJ1Zi0+Ykhhc1RSTlMgICA9IE1OR19UUlVFOworI2VuZGlmCisgICAgfQorICB9CisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0RJU1BMQVlDQUxMUworICBpZiAoKGlUeXBlICE9IE1OR19ERUxUQVRZUEVfUkVQTEFDRUFMUEhBKSAmJiAoaVR5cGUgIT0gTU5HX0RFTFRBVFlQRV9ERUxUQUFMUEhBKSkKKyNlbHNlCisgIGlmICgocERhdGEtPmlQUExUdHlwZSAhPSBNTkdfREVMVEFUWVBFX1JFUExBQ0VBTFBIQSkgJiYKKyAgICAgIChwRGF0YS0+aVBQTFR0eXBlICE9IE1OR19ERUxUQVRZUEVfREVMVEFBTFBIQSAgKSAgICApCisjZW5kaWYKKyAgeworI2lmbmRlZiBNTkdfT1BUSU1JWkVfRElTUExBWUNBTExTCisgICAgaWYgKGlDb3VudCA+IHBCdWYtPmlQTFRFY291bnQpCisgICAgICBwQnVmLT5pUExURWNvdW50ID0gaUNvdW50OworI2Vsc2UKKyAgICBpZiAocERhdGEtPmlQUExUY291bnQgPiBwQnVmLT5pUExURWNvdW50KQorICAgICAgcEJ1Zi0+aVBMVEVjb3VudCA9IHBEYXRhLT5pUFBMVGNvdW50OworI2VuZGlmCisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9DRVNTX0RJU1BMQVlfUFBMVCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX01BR04KKyNpZm5kZWYgTU5HX09QVElNSVpFX0RJU1BMQVlDQUxMUworbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfZGlzcGxheV9tYWduIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlGaXJzdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlMYXN0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaU1ldGhvZFgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1YLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTUIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaU1ldGhvZFkpCisjZWxzZQorbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfZGlzcGxheV9tYWduIChtbmdfZGF0YXAgIHBEYXRhKQorI2VuZGlmCit7CisgIG1uZ191aW50MTYgaVg7CisgIG1uZ19pbWFnZXAgcEltYWdlOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST0NFU1NfRElTUExBWV9NQUdOLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpdGVyYXRlIHRoZSBvYmplY3QtaWRzICovCisjaWZuZGVmIE1OR19PUFRJTUlaRV9ESVNQTEFZQ0FMTFMKKyAgZm9yIChpWCA9IGlGaXJzdGlkOyBpWCA8PSBpTGFzdGlkOyBpWCsrKQorI2Vsc2UKKyAgZm9yIChpWCA9IHBEYXRhLT5pTUFHTmZpcnN0aWQ7IGlYIDw9IHBEYXRhLT5pTUFHTmxhc3RpZDsgaVgrKykKKyNlbmRpZgorICB7CisgICAgaWYgKGlYID09IDApICAgICAgICAgICAgICAgICAgICAgICAvKiBwcm9jZXNzIG9iamVjdCAwID8gKi8KKyAgICB7CisgICAgICBwSW1hZ2UgPSAobW5nX2ltYWdlcClwRGF0YS0+cE9ianplcm87CisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0RJU1BMQVlDQUxMUworICAgICAgcEltYWdlLT5pTUFHTl9NZXRob2RYID0gaU1ldGhvZFg7CisgICAgICBwSW1hZ2UtPmlNQUdOX01ldGhvZFkgPSBpTWV0aG9kWTsKKyAgICAgIHBJbWFnZS0+aU1BR05fTVggICAgICA9IGlNWDsKKyAgICAgIHBJbWFnZS0+aU1BR05fTVkgICAgICA9IGlNWTsKKyAgICAgIHBJbWFnZS0+aU1BR05fTUwgICAgICA9IGlNTDsKKyAgICAgIHBJbWFnZS0+aU1BR05fTVIgICAgICA9IGlNUjsKKyAgICAgIHBJbWFnZS0+aU1BR05fTVQgICAgICA9IGlNVDsKKyAgICAgIHBJbWFnZS0+aU1BR05fTUIgICAgICA9IGlNQjsKKyNlbHNlCisgICAgICBwSW1hZ2UtPmlNQUdOX01ldGhvZFggPSBwRGF0YS0+aU1BR05tZXRob2RYOworICAgICAgcEltYWdlLT5pTUFHTl9NZXRob2RZID0gcERhdGEtPmlNQUdObWV0aG9kWTsKKyAgICAgIHBJbWFnZS0+aU1BR05fTVggICAgICA9IHBEYXRhLT5pTUFHTm1YOworICAgICAgcEltYWdlLT5pTUFHTl9NWSAgICAgID0gcERhdGEtPmlNQUdObVk7CisgICAgICBwSW1hZ2UtPmlNQUdOX01MICAgICAgPSBwRGF0YS0+aU1BR05tTDsKKyAgICAgIHBJbWFnZS0+aU1BR05fTVIgICAgICA9IHBEYXRhLT5pTUFHTm1SOworICAgICAgcEltYWdlLT5pTUFHTl9NVCAgICAgID0gcERhdGEtPmlNQUdObVQ7CisgICAgICBwSW1hZ2UtPmlNQUdOX01CICAgICAgPSBwRGF0YS0+aU1BR05tQjsKKyNlbmRpZgorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgcEltYWdlID0gbW5nX2ZpbmRfaW1hZ2VvYmplY3QgKHBEYXRhLCBpWCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvYmplY3QgZXhpc3RzICYgaXMgbm90IGZyb3plbiA/ICovCisgICAgICBpZiAoKHBJbWFnZSkgJiYgKCFwSW1hZ2UtPmJGcm96ZW4pKQorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJldmlvdXMgbWFnbmlmaWNhdGlvbiB0byBiZSBkb25lID8gKi8KKyAgICAgICAgaWYgKChwSW1hZ2UtPmlNQUdOX01ldGhvZFgpIHx8IChwSW1hZ2UtPmlNQUdOX01ldGhvZFkpKQorICAgICAgICB7CisgICAgICAgICAgbW5nX3JldGNvZGUgaVJldGNvZGUgPSBtbmdfbWFnbmlmeV9pbWFnZW9iamVjdCAocERhdGEsIHBJbWFnZSk7CisgICAgICAgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgICAgICAgcmV0dXJuIGlSZXRjb2RlOworICAgICAgICB9CisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0RJU1BMQVlDQUxMUworICAgICAgICBwSW1hZ2UtPmlNQUdOX01ldGhvZFggPSBpTWV0aG9kWDsKKyAgICAgICAgcEltYWdlLT5pTUFHTl9NZXRob2RZID0gaU1ldGhvZFk7CisgICAgICAgIHBJbWFnZS0+aU1BR05fTVggICAgICA9IGlNWDsKKyAgICAgICAgcEltYWdlLT5pTUFHTl9NWSAgICAgID0gaU1ZOworICAgICAgICBwSW1hZ2UtPmlNQUdOX01MICAgICAgPSBpTUw7CisgICAgICAgIHBJbWFnZS0+aU1BR05fTVIgICAgICA9IGlNUjsKKyAgICAgICAgcEltYWdlLT5pTUFHTl9NVCAgICAgID0gaU1UOworICAgICAgICBwSW1hZ2UtPmlNQUdOX01CICAgICAgPSBpTUI7CisjZWxzZQorICAgICAgICBwSW1hZ2UtPmlNQUdOX01ldGhvZFggPSBwRGF0YS0+aU1BR05tZXRob2RYOworICAgICAgICBwSW1hZ2UtPmlNQUdOX01ldGhvZFkgPSBwRGF0YS0+aU1BR05tZXRob2RZOworICAgICAgICBwSW1hZ2UtPmlNQUdOX01YICAgICAgPSBwRGF0YS0+aU1BR05tWDsKKyAgICAgICAgcEltYWdlLT5pTUFHTl9NWSAgICAgID0gcERhdGEtPmlNQUdObVk7CisgICAgICAgIHBJbWFnZS0+aU1BR05fTUwgICAgICA9IHBEYXRhLT5pTUFHTm1MOworICAgICAgICBwSW1hZ2UtPmlNQUdOX01SICAgICAgPSBwRGF0YS0+aU1BR05tUjsKKyAgICAgICAgcEltYWdlLT5pTUFHTl9NVCAgICAgID0gcERhdGEtPmlNQUdObVQ7CisgICAgICAgIHBJbWFnZS0+aU1BR05fTUIgICAgICA9IHBEYXRhLT5pTUFHTm1COworI2VuZGlmCisgICAgICB9CisgICAgfQorICB9CisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0RJU1BMQVlDQUxMUworICBwRGF0YS0+aU1BR05mcm9taWQgPSBpRmlyc3RpZDsKKyAgcERhdGEtPmlNQUdOdG9pZCAgID0gaUxhc3RpZDsKKyAgaVggICAgICAgICAgICAgICAgID0gaUZpcnN0aWQ7CisjZWxzZQorICBwRGF0YS0+aU1BR05mcm9taWQgPSBwRGF0YS0+aU1BR05maXJzdGlkOworICBwRGF0YS0+aU1BR050b2lkICAgPSBwRGF0YS0+aU1BR05sYXN0aWQ7CisgIGlYICAgICAgICAgICAgICAgICA9IHBEYXRhLT5pTUFHTmZpcnN0aWQ7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGl0ZXJhdGUgYWdhaW4gZm9yIHNob3dpbmcgKi8KKyNpZm5kZWYgTU5HX09QVElNSVpFX0RJU1BMQVlDQUxMUworICB3aGlsZSAoKGlYIDw9IGlMYXN0aWQpICYmICghcERhdGEtPmJUaW1lcnNldCkpCisjZWxzZQorICB3aGlsZSAoKGlYIDw9IHBEYXRhLT5pTUFHTmxhc3RpZCkgJiYgKCFwRGF0YS0+YlRpbWVyc2V0KSkKKyNlbmRpZgorICB7CisgICAgcERhdGEtPmlNQUdOY3VycmVudGlkID0gaVg7CisKKyAgICBpZiAoaVgpICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9ubHkgcmVhbCBvYmplY3RzICEgKi8KKyAgICB7CisgICAgICBwSW1hZ2UgPSBtbmdfZmluZF9pbWFnZW9iamVjdCAocERhdGEsIGlYKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9iamVjdCBleGlzdHMgJiBpcyBub3QgZnJvemVuICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyB2aXNpYmxlICYgaXMgdmlld2FibGUgPyAqLworICAgICAgaWYgKChwSW1hZ2UpICYmICghcEltYWdlLT5iRnJvemVuKSAmJgorICAgICAgICAgIChwSW1hZ2UtPmJWaXNpYmxlKSAmJiAocEltYWdlLT5iVmlld2FibGUpKQorICAgICAgeworICAgICAgICBtbmdfcmV0Y29kZSBpUmV0Y29kZSA9IG1uZ19kaXNwbGF5X2ltYWdlIChwRGF0YSwgcEltYWdlLCBNTkdfRkFMU0UpOworICAgICAgICBpZiAoaVJldGNvZGUpCisgICAgICAgICAgcmV0dXJuIGlSZXRjb2RlOworICAgICAgfQorICAgIH0KKworICAgIGlYKys7CisgIH0KKworICBpZiAocERhdGEtPmJUaW1lcnNldCkgICAgICAgICAgICAgICAgLyogYnJva2VuID8gKi8KKyAgICBwRGF0YS0+aUJyZWFrcG9pbnQgPSA5OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST0NFU1NfRElTUExBWV9NQUdOLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfZGlzcGxheV9tYWduMiAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfdWludDE2IGlYOworICBtbmdfaW1hZ2VwIHBJbWFnZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9DRVNTX0RJU1BMQVlfTUFHTiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlYID0gcERhdGEtPmlNQUdOY3VycmVudGlkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaXRlcmF0ZSBhZ2FpbiBmb3Igc2hvd2luZyAqLworICB3aGlsZSAoKGlYIDw9IHBEYXRhLT5pTUFHTnRvaWQpICYmICghcERhdGEtPmJUaW1lcnNldCkpCisgIHsKKyAgICBwRGF0YS0+aU1BR05jdXJyZW50aWQgPSBpWDsKKworICAgIGlmIChpWCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb25seSByZWFsIG9iamVjdHMgISAqLworICAgIHsKKyAgICAgIHBJbWFnZSA9IG1uZ19maW5kX2ltYWdlb2JqZWN0IChwRGF0YSwgaVgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb2JqZWN0IGV4aXN0cyAmIGlzIG5vdCBmcm96ZW4gICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHZpc2libGUgJiBpcyB2aWV3YWJsZSA/ICovCisgICAgICBpZiAoKHBJbWFnZSkgJiYgKCFwSW1hZ2UtPmJGcm96ZW4pICYmCisgICAgICAgICAgKHBJbWFnZS0+YlZpc2libGUpICYmIChwSW1hZ2UtPmJWaWV3YWJsZSkpCisgICAgICB7CisgICAgICAgIG1uZ19yZXRjb2RlIGlSZXRjb2RlID0gbW5nX2Rpc3BsYXlfaW1hZ2UgKHBEYXRhLCBwSW1hZ2UsIE1OR19GQUxTRSk7CisgICAgICAgIGlmIChpUmV0Y29kZSkKKyAgICAgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICB9CisgICAgfQorCisgICAgaVgrKzsKKyAgfQorCisgIGlmIChwRGF0YS0+YlRpbWVyc2V0KSAgICAgICAgICAgICAgICAvKiBicm9rZW4gPyAqLworICAgIHBEYXRhLT5pQnJlYWtwb2ludCA9IDk7CisgIGVsc2UKKyAgICBwRGF0YS0+aUJyZWFrcG9pbnQgPSAwOyAgICAgICAgICAgIC8qIG5vdCBhZ2FpbiAhICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX01BR04sIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19QQVNUCisjaWZuZGVmIE1OR19PUFRJTUlaRV9ESVNQTEFZQ0FMTFMKK21uZ19yZXRjb2RlIG1uZ19wcm9jZXNzX2Rpc3BsYXlfcGFzdCAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpVGFyZ2V0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaVRhcmdldHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaVRhcmdldHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaVRhcmdldHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcHRyICAgIHBTb3VyY2VzKQorI2Vsc2UKK21uZ19yZXRjb2RlIG1uZ19wcm9jZXNzX2Rpc3BsYXlfcGFzdCAobW5nX2RhdGFwICBwRGF0YSkKKyNlbmRpZgoreworICBtbmdfcmV0Y29kZSAgICAgIGlSZXRjb2RlID0gTU5HX05PRVJST1I7CisgIG1uZ19pbWFnZXAgICAgICAgcFRhcmdldGltZzsKKyAgbW5nX2ltYWdlcCAgICAgICBwU291cmNlaW1nOworI2lmbmRlZiBNTkdfT1BUSU1JWkVfRElTUExBWUNBTExTCisgIG1uZ19wYXN0X3NvdXJjZXAgcFNvdXJjZSA9IChtbmdfcGFzdF9zb3VyY2VwKXBTb3VyY2VzOworI2Vsc2UKKyAgbW5nX3Bhc3Rfc291cmNlcCBwU291cmNlID0gKG1uZ19wYXN0X3NvdXJjZXApcERhdGEtPnBQQVNUc291cmNlczsKKyNlbmRpZgorICBtbmdfdWludDMyICAgICAgIGlYICAgICAgPSAwOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST0NFU1NfRElTUExBWV9QQVNULCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0RJU1BMQVlDQUxMUworICBpZiAoaVRhcmdldGlkKSAgICAgICAgICAgICAgICAgICAgICAgLyogYSByZWFsIGRlc3RpbmF0aW9uIG9iamVjdCA/ICovCisjZWxzZQorICBpZiAocERhdGEtPmlQQVNUdGFyZ2V0aWQpICAgICAgICAgICAgLyogYSByZWFsIGRlc3RpbmF0aW9uIG9iamVjdCA/ICovCisjZW5kaWYKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxldCdzIGZpbmQgaXQgdGhlbiAqLworI2lmbmRlZiBNTkdfT1BUSU1JWkVfRElTUExBWUNBTExTCisgICAgcFRhcmdldGltZyA9IChtbmdfaW1hZ2VwKW1uZ19maW5kX2ltYWdlb2JqZWN0IChwRGF0YSwgaVRhcmdldGlkKTsKKyNlbHNlCisgICAgcFRhcmdldGltZyA9IChtbmdfaW1hZ2VwKW1uZ19maW5kX2ltYWdlb2JqZWN0IChwRGF0YSwgcERhdGEtPmlQQVNUdGFyZ2V0aWQpOworI2VuZGlmCisKKyAgICBpZiAoIXBUYXJnZXRpbWcpICAgICAgICAgICAgICAgICAgIC8qIGlmIGl0IGRvZXNuJ3QgZXhpc3RzOyBkbyBhIGJhcmYgKi8KKyAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19PQkpFQ1RVTktOT1dOKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGl0J3MgZ290dGEgYmUgYWJzdHJhY3QgISEhICovCisgICAgaWYgKHBUYXJnZXRpbWctPnBJbWdidWYtPmJDb25jcmV0ZSkKKyAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19PQkpOT1RBQlNUUkFDVCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSB3YW50IDMyLS82NC1iaXQgUkdCQSB0byBwbGF5IHdpdGggISAqLworICAgIGlmICgocFRhcmdldGltZy0+cEltZ2J1Zi0+aUJpdGRlcHRoIDw9IE1OR19CSVRERVBUSF84KSAgICAgICAgICB8fAorICAgICAgICAocFRhcmdldGltZy0+cEltZ2J1Zi0+aUNvbG9ydHlwZSA9PSAgTU5HX0NPTE9SVFlQRV9HUkFZKSAgICB8fAorICAgICAgICAocFRhcmdldGltZy0+cEltZ2J1Zi0+aUNvbG9ydHlwZSA9PSAgTU5HX0NPTE9SVFlQRV9SR0IpICAgICB8fAorICAgICAgICAocFRhcmdldGltZy0+cEltZ2J1Zi0+aUNvbG9ydHlwZSA9PSAgTU5HX0NPTE9SVFlQRV9JTkRFWEVEKSB8fAorICAgICAgICAocFRhcmdldGltZy0+cEltZ2J1Zi0+aUNvbG9ydHlwZSA9PSAgTU5HX0NPTE9SVFlQRV9HUkFZQSkgICAgICApCisgICAgICBpUmV0Y29kZSA9IG1uZ19wcm9tb3RlX2ltYWdlb2JqZWN0IChwRGF0YSwgcFRhcmdldGltZywgTU5HX0JJVERFUFRIXzgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTkdfQ09MT1JUWVBFX1JHQkEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTkdfRklMTE1FVEhPRF9MRUZUQklUUkVQTElDQVRFKTsKKyAgICBlbHNlCisgICAgaWYgKChwVGFyZ2V0aW1nLT5wSW1nYnVmLT5pQml0ZGVwdGggPiBNTkdfQklUREVQVEhfOCkgICAgICAgICAgICAgICYmCisgICAgICAgICgocFRhcmdldGltZy0+cEltZ2J1Zi0+aUNvbG9ydHlwZSA9PSAgTU5HX0NPTE9SVFlQRV9HUkFZKSAgfHwKKyAgICAgICAgIChwVGFyZ2V0aW1nLT5wSW1nYnVmLT5pQ29sb3J0eXBlID09ICBNTkdfQ09MT1JUWVBFX1JHQikgICB8fAorICAgICAgICAgKHBUYXJnZXRpbWctPnBJbWdidWYtPmlDb2xvcnR5cGUgPT0gIE1OR19DT0xPUlRZUEVfR1JBWUEpICAgICkgICApCisgICAgICBpUmV0Y29kZSA9IG1uZ19wcm9tb3RlX2ltYWdlb2JqZWN0IChwRGF0YSwgcFRhcmdldGltZywgTU5HX0JJVERFUFRIXzE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU5HX0NPTE9SVFlQRV9SR0JBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU5HX0ZJTExNRVRIT0RfTEVGVEJJVFJFUExJQ0FURSk7CisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisgICAgZWxzZQorICAgIGlmICgocFRhcmdldGltZy0+cEltZ2J1Zi0+aUNvbG9ydHlwZSA9PSAgTU5HX0NPTE9SVFlQRV9KUEVHR1JBWSkgIHx8CisgICAgICAgIChwVGFyZ2V0aW1nLT5wSW1nYnVmLT5pQ29sb3J0eXBlID09ICBNTkdfQ09MT1JUWVBFX0pQRUdDT0xPUikgfHwKKyAgICAgICAgKHBUYXJnZXRpbWctPnBJbWdidWYtPmlDb2xvcnR5cGUgPT0gIE1OR19DT0xPUlRZUEVfSlBFR0dSQVlBKSAgICApCisgICAgICBpUmV0Y29kZSA9IG1uZ19wcm9tb3RlX2ltYWdlb2JqZWN0IChwRGF0YSwgcFRhcmdldGltZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUYXJnZXRpbWctPnBJbWdidWYtPmlCaXRkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1OR19DT0xPUlRZUEVfSlBFR0NPTE9SQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1OR19GSUxMTUVUSE9EX0xFRlRCSVRSRVBMSUNBVEUpOworI2VuZGlmCisKKyAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtYWtlIGl0IHJlYWxseSBhYnN0cmFjdCA/ICovCisgICAgaWYgKCFwVGFyZ2V0aW1nLT5wSW1nYnVmLT5iQ29ycmVjdGVkKQorICAgIHsKKyAgICAgIGlSZXRjb2RlID0gbW5nX2NvbG9yY29ycmVjdF9vYmplY3QgKHBEYXRhLCBwVGFyZ2V0aW1nKTsKKworICAgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgICAgcmV0dXJuIGlSZXRjb2RlOworICAgIH0KKyAgfQorICBlbHNlCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwYXN0aW5nIGludG8gb2JqZWN0IDAgISEhICovCisgICAgcFRhcmdldGltZyA9IChtbmdfaW1hZ2VwKXBEYXRhLT5wT2JqemVybzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlzIGl0IHVzYWJsZSA/Pz8gKi8KKyAgICBpZiAoKHBUYXJnZXRpbWctPmJDbGlwcGVkKSAmJgorICAgICAgICAocFRhcmdldGltZy0+aUNsaXByID4gcFRhcmdldGltZy0+aVBvc3gpICYmCisgICAgICAgIChwVGFyZ2V0aW1nLT5pQ2xpcGIgPiBwVGFyZ2V0aW1nLT5pUG9zeSkpCisgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWFrZSBpdCAzMi1iaXQgUkdCQSBwbGVhc2UgISEhICovCisgICAgICBpUmV0Y29kZSA9IG1uZ19yZXNldF9vYmplY3RfZGV0YWlscyAocERhdGEsIHBUYXJnZXRpbWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRhcmdldGltZy0+aUNsaXByIC0gcFRhcmdldGltZy0+aVBvc3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRhcmdldGltZy0+aUNsaXBiIC0gcFRhcmdldGltZy0+aVBvc3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU5HX0JJVERFUFRIXzgsIE1OR19DT0xPUlRZUEVfUkdCQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCBNTkdfRkFMU0UpOworCisgICAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHBUYXJnZXRpbWcgPSBNTkdfTlVMTDsgICAgICAgICAgIC8qIGNsaXBwZWQgYmV5b25kIHZpc2liaWxpdHkgISAqLworICB9CisKKyAgaWYgKHBUYXJnZXRpbWcpICAgICAgICAgICAgICAgICAgICAgIC8qIHVzYWJsZSBkZXN0aW5hdGlvbiA/ICovCisgIHsKKyAgICBtbmdfaW50MzIgICAgICBpU291cmNlWTsKKyAgICBtbmdfaW50MzIgICAgICBpU291cmNlWWluYzsKKyAgICBtbmdfaW50MzIgICAgICBpU291cmNlcm93c2l6ZTsKKyAgICBtbmdfaW50MzIgICAgICBpU291cmNlc2FtcGxlczsKKyAgICBtbmdfYm9vbCAgICAgICBiU291cmNlUkdCQTE2OworICAgIG1uZ19pbnQzMiAgICAgIGlUYXJnZXRZOworICAgIG1uZ19pbnQzMiAgICAgIGlUYXJnZXRyb3dzaXplOworICAgIG1uZ19pbnQzMiAgICAgIGlUYXJnZXRzYW1wbGVzOworICAgIG1uZ19ib29sICAgICAgIGJUYXJnZXRSR0JBMTYgPSBNTkdfRkFMU0U7CisgICAgbW5nX2ludDMyICAgICAgaVRlbXByb3dzaXplOworICAgIG1uZ19pbWFnZWRhdGFwIHBCdWY7CisjaWZuZGVmIE1OR19TS0lQQ0hVTktfTUFHTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmVlZHMgbWFnbmlmaWNhdGlvbiA/ICovCisgICAgaWYgKChwVGFyZ2V0aW1nLT5pTUFHTl9NZXRob2RYKSB8fCAocFRhcmdldGltZy0+aU1BR05fTWV0aG9kWSkpCisgICAgICBpUmV0Y29kZSA9IG1uZ19tYWduaWZ5X2ltYWdlb2JqZWN0IChwRGF0YSwgcFRhcmdldGltZyk7CisjZW5kaWYKKworICAgIGlmICghaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgLyogc3RpbGwgb2sgPyAqLworICAgIHsKKyAgICAgIGJUYXJnZXRSR0JBMTYgPSAobW5nX2Jvb2wpKHBUYXJnZXRpbWctPnBJbWdidWYtPmlCaXRkZXB0aCA+IDgpOworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9ESVNQTEFZQ0FMTFMKKyAgICAgIHN3aXRjaCAoaVRhcmdldHR5cGUpICAgICAgICAgICAgIC8qIGRldGVybWluZSB0YXJnZXQgeC95ICovCisjZWxzZQorICAgICAgc3dpdGNoIChwRGF0YS0+aVBBU1R0YXJnZXR0eXBlKSAgLyogZGV0ZXJtaW5lIHRhcmdldCB4L3kgKi8KKyNlbmRpZgorICAgICAgeworICAgICAgICBjYXNlIDAgOiB7CisjaWZuZGVmIE1OR19PUFRJTUlaRV9ESVNQTEFZQ0FMTFMKKyAgICAgICAgICAgICAgICAgICBwRGF0YS0+aVBhc3R4ID0gaVRhcmdldHg7CisgICAgICAgICAgICAgICAgICAgcERhdGEtPmlQYXN0eSA9IGlUYXJnZXR5OworI2Vsc2UKKyAgICAgICAgICAgICAgICAgICBwRGF0YS0+aVBhc3R4ID0gcERhdGEtPmlQQVNUdGFyZ2V0eDsKKyAgICAgICAgICAgICAgICAgICBwRGF0YS0+aVBhc3R5ID0gcERhdGEtPmlQQVNUdGFyZ2V0eTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSAxIDogeworI2lmbmRlZiBNTkdfT1BUSU1JWkVfRElTUExBWUNBTExTCisgICAgICAgICAgICAgICAgICAgcERhdGEtPmlQYXN0eCA9IHBUYXJnZXRpbWctPmlQYXN0eCArIGlUYXJnZXR4OworICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pUGFzdHkgPSBwVGFyZ2V0aW1nLT5pUGFzdHkgKyBpVGFyZ2V0eTsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgcERhdGEtPmlQYXN0eCA9IHBUYXJnZXRpbWctPmlQYXN0eCArIHBEYXRhLT5pUEFTVHRhcmdldHg7CisgICAgICAgICAgICAgICAgICAgcERhdGEtPmlQYXN0eSA9IHBUYXJnZXRpbWctPmlQYXN0eSArIHBEYXRhLT5pUEFTVHRhcmdldHk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgMiA6IHsKKyNpZm5kZWYgTU5HX09QVElNSVpFX0RJU1BMQVlDQUxMUworICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pUGFzdHggKz0gaVRhcmdldHg7CisgICAgICAgICAgICAgICAgICAgcERhdGEtPmlQYXN0eSArPSBpVGFyZ2V0eTsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgcERhdGEtPmlQYXN0eCArPSBwRGF0YS0+aVBBU1R0YXJnZXR4OworICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pUGFzdHkgKz0gcERhdGEtPmlQQVNUdGFyZ2V0eTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICB9CisgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzYXZlIGZvciBuZXh0IHRpbWUgLi4uICovCisgICAgICBwVGFyZ2V0aW1nLT5pUGFzdHggICAgICA9IHBEYXRhLT5pUGFzdHg7CisgICAgICBwVGFyZ2V0aW1nLT5pUGFzdHkgICAgICA9IHBEYXRhLT5pUGFzdHk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGRyZXNzIGRlc3RpbmF0aW9uIGZvciByb3ctcm91dGluZXMgKi8KKyAgICAgIHBEYXRhLT5wU3RvcmVvYmogICAgICAgID0gKG1uZ19vYmplY3RwKXBUYXJnZXRpbWc7CisgICAgICBwRGF0YS0+cFN0b3JlYnVmICAgICAgICA9IChtbmdfb2JqZWN0cClwVGFyZ2V0aW1nLT5wSW1nYnVmOworICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByb2Nlc3MgdGhlIHNvdXJjZXMgb25lIGJ5IG9uZSAqLworI2lmbmRlZiBNTkdfT1BUSU1JWkVfRElTUExBWUNBTExTCisgICAgd2hpbGUgKCghaVJldGNvZGUpICYmIChpWCA8IGlDb3VudCkpCisjZWxzZQorICAgIHdoaWxlICgoIWlSZXRjb2RlKSAmJiAoaVggPCBwRGF0YS0+aVBBU1Rjb3VudCkpCisjZW5kaWYKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbmQgdGhlIGxpdHRsZSBiYXN0YXJkcyBmaXJzdCAqLworICAgICAgcFNvdXJjZWltZyAgICAgICAgICAgICAgPSAobW5nX2ltYWdlcCltbmdfZmluZF9pbWFnZW9iamVjdCAocERhdGEsIHBTb3VyY2UtPmlTb3VyY2VpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBleGlzdHMgYW5kIHZpZXdhYmxlPyAqLworICAgICAgaWYgKChwU291cmNlaW1nKSAmJiAocFNvdXJjZWltZy0+YlZpZXdhYmxlKSkKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5lZWRzIG1hZ25pZmljYXRpb24gPyAqLworI2lmbmRlZiBNTkdfU0tJUENIVU5LX01BR04KKyAgICAgICAgaWYgKChwU291cmNlaW1nLT5pTUFHTl9NZXRob2RYKSB8fCAocFNvdXJjZWltZy0+aU1BR05fTWV0aG9kWSkpCisgICAgICAgICAgaVJldGNvZGUgPSBtbmdfbWFnbmlmeV9pbWFnZW9iamVjdCAocERhdGEsIHBTb3VyY2VpbWcpOworI2VuZGlmCisKKyAgICAgICAgaWYgKCFpUmV0Y29kZSkgICAgICAgICAgICAgICAgIC8qIHN0aWxsIG9rID8gKi8KKyAgICAgICAgeworICAgICAgICAgIHBCdWYgICAgICAgICAgICAgICAgPSAobW5nX2ltYWdlZGF0YXApcFNvdXJjZWltZy0+cEltZ2J1ZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHJlc3Mgc291cmNlIGZvciByb3ctcm91dGluZXMgKi8KKyAgICAgICAgICBwRGF0YS0+cFJldHJpZXZlb2JqID0gKG1uZ19vYmplY3RwKXBTb3VyY2VpbWc7CisKKyAgICAgICAgICBwRGF0YS0+aVBhc3MgICAgICAgID0gLTE7ICAgIC8qIGluaXQgcm93LXByb2Nlc3NpbmcgdmFyaWFibGVzICovCisgICAgICAgICAgcERhdGEtPmlSb3dpbmMgICAgICA9IDE7CisgICAgICAgICAgcERhdGEtPmlDb2xpbmMgICAgICA9IDE7CisgICAgICAgICAgcERhdGEtPmlQaXhlbG9mcyAgICA9IDA7CisgICAgICAgICAgaVNvdXJjZXNhbXBsZXMgICAgICA9IChtbmdfaW50MzIpcEJ1Zi0+aVdpZHRoOworICAgICAgICAgIGlTb3VyY2Vyb3dzaXplICAgICAgPSBwQnVmLT5pUm93c2l6ZTsKKyAgICAgICAgICBiU291cmNlUkdCQTE2ICAgICAgID0gKG1uZ19ib29sKShwQnVmLT5pQml0ZGVwdGggPiA4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1ha2Ugc3VyZSB0aGUgZGVsdGEtcm91dGluZXMgZG8gdGhlIHJpZ2h0IHRoaW5nICovCisgICAgICAgICAgcERhdGEtPmlEZWx0YXR5cGUgICA9IE1OR19ERUxUQVRZUEVfQkxPQ0tQSVhFTFJFUExBQ0U7CisKKyAgICAgICAgICBzd2l0Y2ggKHBCdWYtPmlDb2xvcnR5cGUpCisgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSAgMCA6IHsgCisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJTb3VyY2VSR0JBMTYpCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mUmV0cmlldmVyb3cgPSAobW5nX2ZwdHIpbW5nX3JldHJpZXZlX2cxNjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZlJldHJpZXZlcm93ID0gKG1uZ19mcHRyKW1uZ19yZXRyaWV2ZV9nODsKKworICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmJJc09wYXF1ZSAgICAgID0gKG1uZ19ib29sKSghcEJ1Zi0+Ykhhc1RSTlMpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlICAyIDogeworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJTb3VyY2VSR0JBMTYpCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mUmV0cmlldmVyb3cgPSAobW5nX2ZwdHIpbW5nX3JldHJpZXZlX3JnYjE2OworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mUmV0cmlldmVyb3cgPSAobW5nX2ZwdHIpbW5nX3JldHJpZXZlX3JnYjg7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5iSXNPcGFxdWUgICAgICA9IChtbmdfYm9vbCkoIXBCdWYtPmJIYXNUUk5TKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBjYXNlICAzIDogeyBwRGF0YS0+ZlJldHJpZXZlcm93ICAgPSAobW5nX2ZwdHIpbW5nX3JldHJpZXZlX2lkeDg7CisgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+YklzT3BhcXVlICAgICAgPSAobW5nX2Jvb2wpKCFwQnVmLT5iSGFzVFJOUyk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgY2FzZSAgNCA6IHsKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiU291cmNlUkdCQTE2KQorICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZlJldHJpZXZlcm93ID0gKG1uZ19mcHRyKW1uZ19yZXRyaWV2ZV9nYTE2OworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mUmV0cmlldmVyb3cgPSAobW5nX2ZwdHIpbW5nX3JldHJpZXZlX2dhODsKKworICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmJJc09wYXF1ZSAgICAgID0gTU5HX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIGNhc2UgIDYgOiB7CisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJTb3VyY2VSR0JBMTYpCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mUmV0cmlldmVyb3cgPSAobW5nX2ZwdHIpbW5nX3JldHJpZXZlX3JnYmExNjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZlJldHJpZXZlcm93ID0gKG1uZ19mcHRyKW1uZ19yZXRyaWV2ZV9yZ2JhODsKKworICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmJJc09wYXF1ZSAgICAgID0gTU5HX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlICA4IDogeworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiU291cmNlUkdCQTE2KQorICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZlJldHJpZXZlcm93ID0gKG1uZ19mcHRyKW1uZ19yZXRyaWV2ZV9nMTY7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZSZXRyaWV2ZXJvdyA9IChtbmdfZnB0ciltbmdfcmV0cmlldmVfZzg7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5iSXNPcGFxdWUgICAgICA9IE1OR19UUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIDEwIDogeworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiU291cmNlUkdCQTE2KQorICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZlJldHJpZXZlcm93ID0gKG1uZ19mcHRyKW1uZ19yZXRyaWV2ZV9yZ2IxNjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZlJldHJpZXZlcm93ID0gKG1uZ19mcHRyKW1uZ19yZXRyaWV2ZV9yZ2I4OworCisgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+YklzT3BhcXVlICAgICAgPSBNTkdfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBjYXNlIDEyIDogeworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiU291cmNlUkdCQTE2KQorICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZlJldHJpZXZlcm93ID0gKG1uZ19mcHRyKW1uZ19yZXRyaWV2ZV9nYTE2OworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mUmV0cmlldmVyb3cgPSAobW5nX2ZwdHIpbW5nX3JldHJpZXZlX2dhODsKKworICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmJJc09wYXF1ZSAgICAgID0gTU5HX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIGNhc2UgMTQgOiB7CisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJTb3VyY2VSR0JBMTYpCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mUmV0cmlldmVyb3cgPSAobW5nX2ZwdHIpbW5nX3JldHJpZXZlX3JnYmExNjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZlJldHJpZXZlcm93ID0gKG1uZ19mcHRyKW1uZ19yZXRyaWV2ZV9yZ2JhODsKKworICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmJJc09wYXF1ZSAgICAgID0gTU5HX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRldGVybWluZSBzY2FsaW5nICovCisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKKyAgICAgICAgICBpZiAoKCFiU291cmNlUkdCQTE2KSAmJiAoYlRhcmdldFJHQkExNikpCisgICAgICAgICAgICBwRGF0YS0+ZlNjYWxlcm93ID0gKG1uZ19mcHRyKW1uZ19zY2FsZV9yZ2JhOF9yZ2JhMTY7CisgICAgICAgICAgZWxzZQorICAgICAgICAgIGlmICgoYlNvdXJjZVJHQkExNikgJiYgKCFiVGFyZ2V0UkdCQTE2KSkKKyAgICAgICAgICAgIHBEYXRhLT5mU2NhbGVyb3cgPSAobW5nX2ZwdHIpbW5nX3NjYWxlX3JnYmExNl9yZ2JhODsKKyAgICAgICAgICBlbHNlCisjZW5kaWYKKyNlbmRpZgorICAgICAgICAgICAgcERhdGEtPmZTY2FsZXJvdyA9IE1OR19OVUxMOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZhdWx0IG5vIGNvbG9yLWNvcnJlY3Rpb24gKi8KKyAgICAgICAgICBwRGF0YS0+ZkNvcnJlY3Ryb3cgPSBNTkdfTlVMTDsKKworI2lmIGRlZmluZWQoTU5HX0ZVTExfQ01TKSAgICAgICAgICAgICAgLyogZGV0ZXJtaW5lIGNvbG9yLW1hbmFnZW1lbnQgcm91dGluZSAqLworICAgICAgICAgIGlSZXRjb2RlID0gbW5nX2luaXRfZnVsbF9jbXMgICAocERhdGEsIE1OR19GQUxTRSwgTU5HX0ZBTFNFLCBNTkdfVFJVRSk7CisjZWxpZiBkZWZpbmVkKE1OR19HQU1NQV9PTkxZKQorICAgICAgICAgIGlSZXRjb2RlID0gbW5nX2luaXRfZ2FtbWFfb25seSAocERhdGEsIE1OR19GQUxTRSwgTU5HX0ZBTFNFLCBNTkdfVFJVRSk7CisjZWxpZiBkZWZpbmVkKE1OR19BUFBfQ01TKQorICAgICAgICAgIGlSZXRjb2RlID0gbW5nX2luaXRfYXBwX2NtcyAgICAocERhdGEsIE1OR19GQUxTRSwgTU5HX0ZBTFNFLCBNTkdfVFJVRSk7CisjZW5kaWYKKyAgICAgICAgfQorCisgICAgICAgIGlmICghaVJldGNvZGUpICAgICAgICAgICAgICAgICAvKiBzdGlsbCBvayA/ICovCisgICAgICAgIHsgIAorICAgICAgICAgIHBEYXRhLT5mRmxpcHJvdyA9IE1OR19OVUxMOyAgLyogbm8gZmxpcHBpbmcgb3IgdGlsaW5nIGJ5IGRlZmF1bHQgKi8KKyAgICAgICAgICBwRGF0YS0+ZlRpbGVyb3cgPSBNTkdfTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1dCBwZXJoYXBzIHdlIGRvIGhhdmUgdG8gLi4uICovCisgICAgICAgICAgc3dpdGNoIChwU291cmNlLT5pT3JpZW50YXRpb24pCisgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSAyIDogOworICAgICAgICAgICAgY2FzZSA0IDogeworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICAgICBpZiAoYlRhcmdldFJHQkExNikKKyAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZkZsaXByb3cgPSAobW5nX2ZwdHIpbW5nX2ZsaXBfcmdiYTE2OworICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZkZsaXByb3cgPSAobW5nX2ZwdHIpbW5nX2ZsaXBfcmdiYTg7CisgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIDggOiB7CisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgICAgIGlmIChiVGFyZ2V0UkdCQTE2KQorICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mVGlsZXJvdyA9IChtbmdfZnB0ciltbmdfdGlsZV9yZ2JhMTY7CisgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mVGlsZXJvdyA9IChtbmdfZnB0ciltbmdfdGlsZV9yZ2JhODsKKyAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGV0ZXJtaW5lIGNvbXBvc2l0aW9uIHJvdXRpbmUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdGUgdGhhdCB3ZSdyZSBhYnVzaW5nIHRoZSBkZWx0YS1yb3V0aW5lIHNldHVwICEhISAqLworICAgICAgICAgIHN3aXRjaCAocFNvdXJjZS0+aUNvbXBvc2l0aW9uKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgMCA6IHsgICAgICAgICAgICAgICAgIC8qIGNvbXBvc2l0ZSBvdmVyICovCisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgICAgIGlmIChiVGFyZ2V0UkdCQTE2KQorICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mRGVsdGFyb3cgPSAobW5nX2ZwdHIpbW5nX2NvbXBvc2VvdmVyX3JnYmExNjsKKyAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZEZWx0YXJvdyA9IChtbmdfZnB0ciltbmdfY29tcG9zZW92ZXJfcmdiYTg7CisgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIDEgOiB7ICAgICAgICAgICAgICAgICAvKiByZXBsYWNlICovCisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgICAgIGlmIChiVGFyZ2V0UkdCQTE2KQorICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mRGVsdGFyb3cgPSAobW5nX2ZwdHIpbW5nX2RlbHRhX3JnYmExNl9yZ2JhMTY7CisgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mRGVsdGFyb3cgPSAobW5nX2ZwdHIpbW5nX2RlbHRhX3JnYmE4X3JnYmE4OworICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSAyIDogeyAgICAgICAgICAgICAgICAgLyogY29tcG9zaXRlIHVuZGVyICovCisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgICAgIGlmIChiVGFyZ2V0UkdCQTE2KQorICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mRGVsdGFyb3cgPSAobW5nX2ZwdHIpbW5nX2NvbXBvc2V1bmRlcl9yZ2JhMTY7CisgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5mRGVsdGFyb3cgPSAobW5nX2ZwdHIpbW5nX2NvbXBvc2V1bmRlcl9yZ2JhODsKKyAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGV0ZXJtaW5lIG9mZnNldHMgJiBjbGlwcGluZyAqLworICAgICAgICAgIGlmIChwU291cmNlLT5pT2Zmc2V0dHlwZSA9PSAxKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHBEYXRhLT5pRGVzdGwgICAgICAgICAgPSBwRGF0YS0+aVBhc3R4ICsgcFNvdXJjZS0+aU9mZnNldHg7CisgICAgICAgICAgICBwRGF0YS0+aURlc3R0ICAgICAgICAgID0gcERhdGEtPmlQYXN0eSArIHBTb3VyY2UtPmlPZmZzZXR5OworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgcERhdGEtPmlEZXN0bCAgICAgICAgICA9IHBTb3VyY2UtPmlPZmZzZXR4OworICAgICAgICAgICAgcERhdGEtPmlEZXN0dCAgICAgICAgICA9IHBTb3VyY2UtPmlPZmZzZXR5OworICAgICAgICAgIH0KKworICAgICAgICAgIHBEYXRhLT5pRGVzdHIgICAgICAgICAgICA9IChtbmdfaW50MzIpcFRhcmdldGltZy0+cEltZ2J1Zi0+aVdpZHRoOworICAgICAgICAgIHBEYXRhLT5pRGVzdGIgICAgICAgICAgICA9IChtbmdfaW50MzIpcFRhcmdldGltZy0+cEltZ2J1Zi0+aUhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRha2UgdGhlIHNvdXJjZSBkaW1lbnNpb24gaW50byBhY2NvdW50ID8gKi8KKyAgICAgICAgICBpZiAocFNvdXJjZS0+aU9yaWVudGF0aW9uICE9IDgpCisgICAgICAgICAgeworICAgICAgICAgICAgcERhdGEtPmlEZXN0ciAgICAgICAgICA9IE1JTl9DT09SRCAocERhdGEtPmlEZXN0ciwgcERhdGEtPmlEZXN0bCArIChtbmdfaW50MzIpcEJ1Zi0+aVdpZHRoKTsKKyAgICAgICAgICAgIHBEYXRhLT5pRGVzdGIgICAgICAgICAgPSBNSU5fQ09PUkQgKHBEYXRhLT5pRGVzdGIsIHBEYXRhLT5pRGVzdHQgKyAobW5nX2ludDMyKXBCdWYtPmlIZWlnaHQpOworICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNvdXJjZSBjbGlwcGluZyAqLworICAgICAgICAgIGlmIChwU291cmNlLT5pQm91bmRhcnl0eXBlID09IDEpCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKHBEYXRhLT5pRGVzdGwgPCBwRGF0YS0+aVBhc3R4ICsgcFNvdXJjZS0+aUJvdW5kYXJ5bCkKKyAgICAgICAgICAgICAgcERhdGEtPmlTb3VyY2VsICAgICAgPSBwRGF0YS0+aVBhc3R4ICsgcFNvdXJjZS0+aUJvdW5kYXJ5bCAtIHBEYXRhLT5pRGVzdGw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHBEYXRhLT5pU291cmNlbCAgICAgID0gMDsKKworICAgICAgICAgICAgaWYgKHBEYXRhLT5pRGVzdHQgPCBwRGF0YS0+aVBhc3R5ICsgcFNvdXJjZS0+aUJvdW5kYXJ5dCkKKyAgICAgICAgICAgICAgcERhdGEtPmlTb3VyY2V0ICAgICAgPSBwRGF0YS0+aVBhc3R5ICsgcFNvdXJjZS0+aUJvdW5kYXJ5dCAtIHBEYXRhLT5pRGVzdHQ7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHBEYXRhLT5pU291cmNldCAgICAgID0gMDsKKworICAgICAgICAgICAgcERhdGEtPmlEZXN0bCAgICAgICAgICA9IE1BWF9DT09SRCAocERhdGEtPmlEZXN0bCwgcERhdGEtPmlQYXN0eCArIHBTb3VyY2UtPmlCb3VuZGFyeWwpOworICAgICAgICAgICAgcERhdGEtPmlEZXN0dCAgICAgICAgICA9IE1BWF9DT09SRCAocERhdGEtPmlEZXN0dCwgcERhdGEtPmlQYXN0eSArIHBTb3VyY2UtPmlCb3VuZGFyeXQpOworICAgICAgICAgICAgcERhdGEtPmlEZXN0ciAgICAgICAgICA9IE1JTl9DT09SRCAocERhdGEtPmlEZXN0ciwgcERhdGEtPmlQYXN0eCArIHBTb3VyY2UtPmlCb3VuZGFyeXIpOworICAgICAgICAgICAgcERhdGEtPmlEZXN0YiAgICAgICAgICA9IE1JTl9DT09SRCAocERhdGEtPmlEZXN0YiwgcERhdGEtPmlQYXN0eSArIHBTb3VyY2UtPmlCb3VuZGFyeWIpOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKHBEYXRhLT5pRGVzdGwgPCBwU291cmNlLT5pQm91bmRhcnlsKQorICAgICAgICAgICAgICBwRGF0YS0+aVNvdXJjZWwgICAgICA9IHBTb3VyY2UtPmlCb3VuZGFyeWwgLSBwRGF0YS0+aURlc3RsOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBwRGF0YS0+aVNvdXJjZWwgICAgICA9IDA7CisKKyAgICAgICAgICAgIGlmIChwRGF0YS0+aURlc3R0IDwgcFNvdXJjZS0+aUJvdW5kYXJ5dCkKKyAgICAgICAgICAgICAgcERhdGEtPmlTb3VyY2V0ICAgICAgPSBwU291cmNlLT5pQm91bmRhcnl0IC0gcERhdGEtPmlEZXN0dDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgcERhdGEtPmlTb3VyY2V0ICAgICAgPSAwOworCisgICAgICAgICAgICBwRGF0YS0+aURlc3RsICAgICAgICAgID0gTUFYX0NPT1JEIChwRGF0YS0+aURlc3RsLCBwU291cmNlLT5pQm91bmRhcnlsKTsKKyAgICAgICAgICAgIHBEYXRhLT5pRGVzdHQgICAgICAgICAgPSBNQVhfQ09PUkQgKHBEYXRhLT5pRGVzdHQsIHBTb3VyY2UtPmlCb3VuZGFyeXQpOworICAgICAgICAgICAgcERhdGEtPmlEZXN0ciAgICAgICAgICA9IE1JTl9DT09SRCAocERhdGEtPmlEZXN0ciwgcFNvdXJjZS0+aUJvdW5kYXJ5cik7CisgICAgICAgICAgICBwRGF0YS0+aURlc3RiICAgICAgICAgID0gTUlOX0NPT1JEIChwRGF0YS0+aURlc3RiLCBwU291cmNlLT5pQm91bmRhcnliKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAocERhdGEtPmlTb3VyY2VsKSAgICAgICAgIC8qIGluZGVudCBzb3VyY2UgPyAqLworICAgICAgICAgIHsKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyAgICAgICAgICAgICBpZiAoYlRhcmdldFJHQkExNikgICAgICAgIC8qIGFidXNlIHRpbGluZyByb3V0aW5lIHRvIHNoaWZ0IHNvdXJjZS1waXhlbHMgKi8KKyAgICAgICAgICAgICAgIHBEYXRhLT5mVGlsZXJvdyA9IChtbmdfZnB0ciltbmdfdGlsZV9yZ2JhMTY7CisgICAgICAgICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgICAgICAgICBwRGF0YS0+ZlRpbGVyb3cgPSAobW5nX2ZwdHIpbW5nX3RpbGVfcmdiYTg7CisgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW55dGhpbmcgdG8gZGlzcGxheSA/ICovCisgICAgICAgICAgaWYgKChwRGF0YS0+aURlc3RsIDw9IHBEYXRhLT5pRGVzdHIpICYmIChwRGF0YS0+aURlc3R0IDw9IHBEYXRhLT5pRGVzdGIpKQorICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdCB2YXJpYWJsZXMgZm9yIHRoZSBsb29wICovCisgICAgICAgICAgICBpZiAoKHBTb3VyY2UtPmlPcmllbnRhdGlvbiA9PSAyKSB8fCAocFNvdXJjZS0+aU9yaWVudGF0aW9uID09IDYpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpU291cmNlWSAgICAgICAgICAgICA9IChtbmdfaW50MzIpcEJ1Zi0+aUhlaWdodCAtIDEgLSBwRGF0YS0+aVNvdXJjZXQ7CisgICAgICAgICAgICAgIGlTb3VyY2VZaW5jICAgICAgICAgID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlTb3VyY2VZICAgICAgICAgICAgID0gcERhdGEtPmlTb3VyY2V0OworICAgICAgICAgICAgICBpU291cmNlWWluYyAgICAgICAgICA9IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlUYXJnZXRZICAgICAgICAgICAgICAgPSBwRGF0YS0+aURlc3R0OworICAgICAgICAgICAgcERhdGEtPmlDb2wgICAgICAgICAgICA9IHBEYXRhLT5pRGVzdGw7CisKKyAgICAgICAgICAgIGlUYXJnZXRzYW1wbGVzICAgICAgICAgPSBwRGF0YS0+aURlc3RyIC0gcERhdGEtPmlEZXN0bDsKKworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgICAgICAgICAgaWYgKGJUYXJnZXRSR0JBMTYpCisgICAgICAgICAgICAgIGlUYXJnZXRyb3dzaXplICAgICAgID0gKGlUYXJnZXRzYW1wbGVzIDw8IDMpOworICAgICAgICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgICAgICAgIGlUYXJnZXRyb3dzaXplICAgICAgID0gKGlUYXJnZXRzYW1wbGVzIDw8IDIpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgdGVtcG9yYXJ5IHdvcmstYnVmZmVycyAqLworICAgICAgICAgICAgaWYgKGlTb3VyY2Vyb3dzaXplID4gaVRhcmdldHJvd3NpemUpCisgICAgICAgICAgICAgIGlUZW1wcm93c2l6ZSAgICAgICAgID0gaVNvdXJjZXJvd3NpemUgPDwgMTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgaVRlbXByb3dzaXplICAgICAgICAgPSBpVGFyZ2V0cm93c2l6ZSA8PCAxOworICAgICAgICAgICAgTU5HX0FMTE9DIChwRGF0YSwgcERhdGEtPnBSR0JBcm93LCBpVGVtcHJvd3NpemUpOworICAgICAgICAgICAgTU5HX0FMTE9DIChwRGF0YSwgcERhdGEtPnBXb3Jrcm93LCBpVGVtcHJvd3NpemUpOworCisgICAgICAgICAgICB3aGlsZSAoKCFpUmV0Y29kZSkgJiYgKGlUYXJnZXRZIDwgcERhdGEtPmlEZXN0YikpCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgYSByb3cgKi8KKyAgICAgICAgICAgICAgcERhdGEtPmlSb3cgICAgICAgICAgPSBpU291cmNlWTsKKyAgICAgICAgICAgICAgcERhdGEtPmlSb3dzYW1wbGVzICAgPSBpU291cmNlc2FtcGxlczsKKyAgICAgICAgICAgICAgcERhdGEtPmlSb3dzaXplICAgICAgPSBpU291cmNlcm93c2l6ZTsKKyAgICAgICAgICAgICAgcERhdGEtPmJJc1JHQkExNiAgICAgPSBiU291cmNlUkdCQTE2OworICAgICAgICAgICAgICBpUmV0Y29kZSAgICAgICAgICAgICA9ICgobW5nX3JldHJpZXZlcm93KXBEYXRhLT5mUmV0cmlldmVyb3cpIChwRGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzY2FsZSBpdCAoaWYgbmVjZXNzYXJ5KSAqLworICAgICAgICAgICAgICBpZiAoKCFpUmV0Y29kZSkgJiYgKHBEYXRhLT5mU2NhbGVyb3cpKQorICAgICAgICAgICAgICAgIGlSZXRjb2RlICAgICAgICAgICA9ICgobW5nX3NjYWxlcm93KXBEYXRhLT5mU2NhbGVyb3cpIChwRGF0YSk7CisKKyAgICAgICAgICAgICAgcERhdGEtPmJJc1JHQkExNiAgICAgPSBiVGFyZ2V0UkdCQTE2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29sb3IgY29ycmVjdGlvbiAoaWYgbmVjZXNzYXJ5KSAqLworICAgICAgICAgICAgICBpZiAoKCFpUmV0Y29kZSkgJiYgKHBEYXRhLT5mQ29ycmVjdHJvdykpCisgICAgICAgICAgICAgICAgaVJldGNvZGUgICAgICAgICAgID0gKChtbmdfY29ycmVjdHJvdylwRGF0YS0+ZkNvcnJlY3Ryb3cpIChwRGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmbGlwcGluZyAoaWYgbmVjZXNzYXJ5KSAqLworICAgICAgICAgICAgICBpZiAoKCFpUmV0Y29kZSkgJiYgKHBEYXRhLT5mRmxpcHJvdykpCisgICAgICAgICAgICAgICAgaVJldGNvZGUgICAgICAgICAgID0gKChtbmdfZmxpcHJvdylwRGF0YS0+ZkZsaXByb3cpIChwRGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aWxpbmcgKGlmIG5lY2Vzc2FyeSkgKi8KKyAgICAgICAgICAgICAgaWYgKCghaVJldGNvZGUpICYmIChwRGF0YS0+ZlRpbGVyb3cpKQorICAgICAgICAgICAgICAgIGlSZXRjb2RlICAgICAgICAgICA9ICgobW5nX3RpbGVyb3cpcERhdGEtPmZUaWxlcm93KSAocERhdGEpOworCisgICAgICAgICAgICAgIGlmICghaVJldGNvZGUpICAgICAgICAgICAvKiBhbmQgcGFzdGUuLi4uLiAqLworICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcERhdGEtPmlSb3cgICAgICAgID0gaVRhcmdldFk7CisgICAgICAgICAgICAgICAgcERhdGEtPmlSb3dzYW1wbGVzID0gaVRhcmdldHNhbXBsZXM7CisgICAgICAgICAgICAgICAgcERhdGEtPmlSb3dzaXplICAgID0gaVRhcmdldHJvd3NpemU7CisgICAgICAgICAgICAgICAgaVJldGNvZGUgICAgICAgICAgID0gKChtbmdfZGVsdGFyb3cpcERhdGEtPmZEZWx0YXJvdykgKHBEYXRhKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGlTb3VyY2VZICs9IGlTb3VyY2VZaW5jOyAvKiBhbmQgbmV4dCBsaW5lICovCisKKyAgICAgICAgICAgICAgaWYgKGlTb3VyY2VZIDwgMCkKKyAgICAgICAgICAgICAgICBpU291cmNlWSA9IChtbmdfaW50MzIpcEJ1Zi0+aUhlaWdodCAtIDE7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgaWYgKGlTb3VyY2VZID49IChtbmdfaW50MzIpcEJ1Zi0+aUhlaWdodCkKKyAgICAgICAgICAgICAgICBpU291cmNlWSA9IDA7CisKKyAgICAgICAgICAgICAgaVRhcmdldFkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRyb3AgdGhlIHRlbXBvcmFyeSByb3ctYnVmZmVyICovCisgICAgICAgICAgICBNTkdfRlJFRVggKHBEYXRhLCBwRGF0YS0+cFdvcmtyb3csIGlUZW1wcm93c2l6ZSk7CisgICAgICAgICAgICBNTkdfRlJFRVggKHBEYXRhLCBwRGF0YS0+cFJHQkFyb3csIGlUZW1wcm93c2l6ZSk7CisgICAgICAgICAgfQorCisjaWYgZGVmaW5lZChNTkdfRlVMTF9DTVMpICAgICAgICAgICAgICAvKiBjbGVhbnVwIGNtcyBzdHVmZiAqLworICAgICAgICAgIGlmICghaVJldGNvZGUpCisgICAgICAgICAgICBpUmV0Y29kZSA9IG1uZ19jbGVhcl9jbXMgKHBEYXRhKTsKKyNlbmRpZgorICAgICAgICB9CisKKyAgICAgICAgcFNvdXJjZSsrOyAgICAgICAgICAgICAgICAgICAgIC8qIG5lZWVlZXh0ICovCisgICAgICAgIGlYKys7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgcmV0dXJuIGlSZXRjb2RlOworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9ESVNQTEFZQ0FMTFMKKyAgICBpZiAoIWlUYXJnZXRpZCkgICAgICAgICAgICAgICAgICAgIC8qIGRpZCB3ZSBwYXN0ZSBpbnRvIG9iamVjdCAwID8gKi8KKyNlbHNlCisgICAgaWYgKCFwRGF0YS0+aVBBU1R0YXJnZXRpZCkgICAgICAgICAvKiBkaWQgd2UgcGFzdGUgaW50byBvYmplY3QgMCA/ICovCisjZW5kaWYKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRpc3BsYXkgaXQgdGhlbiAhICovCisgICAgICBpUmV0Y29kZSA9IG1uZ19kaXNwbGF5X2ltYWdlIChwRGF0YSwgcFRhcmdldGltZywgTU5HX0ZBTFNFKTsKKyAgICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGFyZ2V0IGlzIHZpc2libGUgJiB2aWV3YWJsZSA/ICovCisgICAgICBpZiAoKHBUYXJnZXRpbWctPmJWaXNpYmxlKSAmJiAocFRhcmdldGltZy0+YlZpZXdhYmxlKSkKKyAgICAgIHsKKyAgICAgICAgaVJldGNvZGUgPSBtbmdfZGlzcGxheV9pbWFnZSAocERhdGEsIHBUYXJnZXRpbWcsIE1OR19GQUxTRSk7CisgICAgICAgIGlmIChpUmV0Y29kZSkKKyAgICAgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICB9CisgICAgfSAgCisgIH0KKworICBpZiAocERhdGEtPmJUaW1lcnNldCkgICAgICAgICAgICAgICAgLyogYnJva2VuID8gKi8KKyAgeworI2lmbmRlZiBNTkdfT1BUSU1JWkVfRElTUExBWUNBTExTCisgICAgcERhdGEtPmlQQVNUaWQgICAgID0gaVRhcmdldGlkOworI2Vsc2UKKyAgICBwRGF0YS0+aVBBU1RpZCAgICAgPSBwRGF0YS0+aVBBU1R0YXJnZXRpZDsKKyNlbmRpZgorICAgIHBEYXRhLT5pQnJlYWtwb2ludCA9IDExOworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX1BBU1QsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmIC8qIE1OR19TS0lQQ0hVTktfUEFTVCAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfUEFTVAorbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfZGlzcGxheV9wYXN0MiAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfcmV0Y29kZSBpUmV0Y29kZTsKKyAgbW5nX2ltYWdlcCAgcFRhcmdldGltZzsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9DRVNTX0RJU1BMQVlfUEFTVCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmIChwRGF0YS0+aVBBU1RpZCkgICAgICAgICAgICAgICAgICAvKiBhIHJlYWwgZGVzdGluYXRpb24gb2JqZWN0ID8gKi8KKyAgICBwVGFyZ2V0aW1nID0gKG1uZ19pbWFnZXApbW5nX2ZpbmRfaW1hZ2VvYmplY3QgKHBEYXRhLCBwRGF0YS0+aVBBU1RpZCk7CisgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvdGhlcndpc2Ugb2JqZWN0IDAgKi8KKyAgICBwVGFyZ2V0aW1nID0gKG1uZ19pbWFnZXApcERhdGEtPnBPYmp6ZXJvOworCisgIGlSZXRjb2RlID0gbW5nX2Rpc3BsYXlfaW1hZ2UgKHBEYXRhLCBwVGFyZ2V0aW1nLCBNTkdfRkFMU0UpOworICBpZiAoaVJldGNvZGUpCisgICAgcmV0dXJuIGlSZXRjb2RlOworCisgIHBEYXRhLT5pQnJlYWtwb2ludCA9IDA7ICAgICAgICAgICAgICAvKiBvbmx5IG9uY2UgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9DRVNTX0RJU1BMQVlfUEFTVCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYgLyogTU5HX1NLSVBDSFVOS19QQVNUICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNlbmRpZiAvKiBNTkdfSU5DTFVERV9ESVNQTEFZX1BST0NTICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqIGVuZCBvZiBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworCmRpZmYgLS1naXQgYS9maWxlcy9Tb3VyY2UvTGliTU5HL2xpYm1uZ19kaXNwbGF5LmggYi9maWxlcy9Tb3VyY2UvTGliTU5HL2xpYm1uZ19kaXNwbGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM5NGRkMgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9MaWJNTkcvbGlibW5nX2Rpc3BsYXkuaApAQCAtMCwwICsxLDM0MyBAQAorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIGxpYm1uZy5oICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIHByb2plY3QgICA6IGxpYm1uZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBmaWxlICAgICAgOiBsaWJtbmdfZGlzcGxheS5oICAgICAgICAgIGNvcHlyaWdodCAoYykgMjAwMC0yMDA3IEcuSnV5biAgICogKi8KKy8qICogdmVyc2lvbiAgIDogMS4wLjEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBwdXJwb3NlICAgOiBEaXNwbGF5IG1hbmFnZW1lbnQgKGRlZmluaXRpb24pICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGF1dGhvciAgICA6IEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogY29tbWVudCAgIDogRGVmaW5pdGlvbiBvZiB0aGUgZGlzcGxheSBtYW5hZ2FtZW50IHJvdXRpbmVzICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBjaGFuZ2VzICAgOiAwLjUuMSAtIDA1LzA4LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjaGFuZ2VkIHN0cmljdC1BTlNJIHN0dWZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMiAtIDA1LzIwLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBKTkcgc3VwcG9ydCBzdHVmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMyAtIDA2LzE2LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjaGFuZ2VkIHByb2dyZXNzaXZlLWRpc3BsYXkgcHJvY2Vzc2luZyAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4zIC0gMDYvMjIvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHN1cHBvcnQgZm9yIGRlbHRhLWltYWdlIHByb2Nlc3NpbmcgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBzdXBwb3J0IGZvciBQUExUIGNodW5rIHByb2Nlc3NpbmcgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMiAtIDA4LzA1LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjaGFuZ2VkIGZpbGUtcHJlZml4ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4zIC0gMDgvMDcvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIEIxMTEzMDAgLSBmaXh1cCBmb3IgaW1wcm92ZWQgcG9ydGFiaWxpdHkgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjMgLSAwOC8yNi8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgTUFHTiBjaHVuayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMyAtIDEwLzE2LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBKREFBIGNodW5rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuNCAtIDExLzI0LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBtb3ZlZCByZXN0b3JlIG9mIG9iamVjdCAwIHRvIGxpYm1uZ19kaXNwbGF5ICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDA4LzE5LzIwMDIgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBCNTk3MTM0IC0gbGlibW5nIHBvbGx1dGVzIHRoZSBsaW5rZXIgbmFtZXNwYWNlICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC41IC0gMDkvMTMvMjAwMiAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIHJlYWQvd3JpdGUgb2YgTUFHTiBjaHVuayAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAwOS8yMC8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgc3VwcG9ydCBmb3IgUEFTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDEwLzA3LzIwMDIgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBwcm9wb3NlZCBjaGFuZ2UgaW4gaGFuZGxpbmcgb2YgVEVSTS0gJiBpZi1kZWxheSAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC41IC0gMTAvMjAvMjAwMiAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIGRpc3BsYXkgb2YgdmlzaWJsZSB0YXJnZXQgb2YgUEFTVCBvcGVyYXRpb24gICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC43IC0gMDMvMjQvMjAwNCAtIEcuUi1QLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHNvbWUgU0tJUENIVU5LIGNvbmRpdGlvbmFscyAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC45IC0gMTIvMTEvMjAwNCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGNvbmRpdGlvbmFsIE1OR19PUFRJTUlaRV9ESVNQTEFZQ0FMTFMgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC4xMCAtIDA0LzA4LzIwMDcgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHN1cHBvcnQgZm9yIG1QTkcgcHJvcG9zYWwgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjEwIC0gMDQvMTIvMjAwNyAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgc3VwcG9ydCBmb3IgQU5HIHByb3Bvc2FsICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZiBkZWZpbmVkKF9fQk9STEFORENfXykgJiYgZGVmaW5lZChNTkdfU1RSSUNUX0FOU0kpCisjcHJhZ21hIG9wdGlvbiAtQSAgICAgICAgICAgICAgICAgICAgICAvKiBmb3JjZSBBTlNJLUMgKi8KKyNlbmRpZgorCisjaWZuZGVmIF9saWJtbmdfZGlzcGxheV9oXworI2RlZmluZSBfbGlibW5nX2Rpc3BsYXlfaF8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19JTkNMVURFX0RJU1BMQVlfUFJPQ1MKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX2Rpc3BsYXlfcHJvZ3Jlc3NpdmVfcmVmcmVzaCAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaUludGVydmFsKTsKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX3Jlc2V0X29ianplcm8gICAgICAgICAobW5nX2RhdGFwICAgICAgcERhdGEpOworCittbmdfcmV0Y29kZSBtbmdfZGlzcGxheV9pbWFnZSAgICAgICAgIChtbmdfZGF0YXAgICAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbWFnZXAgICAgIHBJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgICAgIGJMYXllcmFkdmFuY2VkKTsKKworbW5nX3JldGNvZGUgbW5nX2V4ZWN1dGVfZGVsdGFfaW1hZ2UgICAobW5nX2RhdGFwICAgICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW1hZ2VwICAgICBwVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ltYWdlcCAgICAgcERlbHRhKTsKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfZGlzcGxheSAgICAgICAobW5nX2RhdGFwICAgICAgcERhdGEpOworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX09QVElNSVpFX0ZPT1RQUklOVF9JTklUCitwbmdfaW1ndHlwZSBtbmdfcG5nX2ltZ3R5cGUgICAgICAgICAgIChtbmdfdWludDggICAgICBjb2xvcnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICBiaXRkZXB0aCk7CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfRElTUExBWUNBTExTCisKK21uZ19yZXRjb2RlIG1uZ19wcm9jZXNzX2Rpc3BsYXlfaWhkciAgKG1uZ19kYXRhcCAgICAgIHBEYXRhKTsKKworI2lmZGVmIE1OR19JTkNMVURFX01QTkdfUFJPUE9TQUwKK21uZ19yZXRjb2RlIG1uZ19wcm9jZXNzX2Rpc3BsYXlfbXBuZyAgKG1uZ19kYXRhcCAgICAgIHBEYXRhKTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX0lOQ0xVREVfQU5HX1BST1BPU0FMCittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19kaXNwbGF5X2FuZyAgIChtbmdfZGF0YXAgICAgICBwRGF0YSk7CisjZW5kaWYKKworbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfZGlzcGxheV9pZGF0ICAobW5nX2RhdGFwICAgICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICBpUmF3bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCAgICAgcFJhd2RhdGEpOworCittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19kaXNwbGF5X2llbmQgIChtbmdfZGF0YXAgICAgICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19kaXNwbGF5X21lbmQgIChtbmdfZGF0YXAgICAgICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19kaXNwbGF5X21lbmQyIChtbmdfZGF0YXAgICAgICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19kaXNwbGF5X2RlZmkgIChtbmdfZGF0YXAgICAgICBwRGF0YSk7CisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19CQVNJCittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19kaXNwbGF5X2Jhc2kgIChtbmdfZGF0YXAgICAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgICAgIGlSZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgICBpR3JlZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgICBpQmx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgICAgIGJIYXNhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgICAgIGlBbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgIGlWaWV3YWJsZSk7CisjZW5kaWYKKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX0NMT04KK21uZ19yZXRjb2RlIG1uZ19wcm9jZXNzX2Rpc3BsYXlfY2xvbiAgKG1uZ19kYXRhcCAgICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgaVNvdXJjZWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgaUNsb25laWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICBpQ2xvbmV0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgYkhhc2Rvbm90c2hvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgIGlEb25vdHNob3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICBpQ29uY3JldGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfYm9vbCAgICAgICBiSGFzbG9jYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgIGlMb2NhdGlvbnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgICAgICBpTG9jYXRpb254LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICAgICAgaUxvY2F0aW9ueSk7CittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19kaXNwbGF5X2Nsb24yIChtbmdfZGF0YXAgICAgICBwRGF0YSk7CisjZW5kaWYKKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX0RJU0MKK21uZ19yZXRjb2RlIG1uZ19wcm9jZXNzX2Rpc3BsYXlfZGlzYyAgKG1uZ19kYXRhcCAgICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgaUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNnAgICAgcElkcyk7CisjZW5kaWYKKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX0ZSQU0KK21uZ19yZXRjb2RlIG1uZ19wcm9jZXNzX2Rpc3BsYXlfZnJhbSAgKG1uZ19kYXRhcCAgICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgaUZyYW1lbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgIGlDaGFuZ2VkZWxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgIGlEZWxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgIGlDaGFuZ2V0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgaVRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICBpQ2hhbmdlY2xpcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICBpQ2xpcHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgICAgICBpQ2xpcGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgICAgICBpQ2xpcHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgICAgICBpQ2xpcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgICAgICBpQ2xpcGIpOworbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfZGlzcGxheV9mcmFtMiAobW5nX2RhdGFwICAgICAgcERhdGEpOworI2VuZGlmCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19NT1ZFCittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19kaXNwbGF5X21vdmUgIChtbmdfZGF0YXAgICAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgICAgIGlGcm9taWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgICBpVG9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgIGlNb3ZldHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgICAgIGlNb3ZleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgICAgIGlNb3ZleSk7CisjZW5kaWYKKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX0NMSVAKK21uZ19yZXRjb2RlIG1uZ19wcm9jZXNzX2Rpc3BsYXlfY2xpcCAgKG1uZ19kYXRhcCAgICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgaUZyb21pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgICAgIGlUb2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgaUNsaXB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICAgICAgaUNsaXBsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICAgICAgaUNsaXByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICAgICAgaUNsaXB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICAgICAgaUNsaXBiKTsKKyNlbmRpZgorCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfU0hPVworbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfZGlzcGxheV9zaG93ICAobW5nX2RhdGFwICAgICAgcERhdGEpOworI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfU0FWRQorbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfZGlzcGxheV9zYXZlICAobW5nX2RhdGFwICAgICAgcERhdGEpOworI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfU0VFSworbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfZGlzcGxheV9zZWVrICAobW5nX2RhdGFwICAgICAgcERhdGEpOworI2VuZGlmCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19kaXNwbGF5X2poZHIgIChtbmdfZGF0YXAgICAgICBwRGF0YSk7CisKK21uZ19yZXRjb2RlIG1uZ19wcm9jZXNzX2Rpc3BsYXlfamRhYSAgKG1uZ19kYXRhcCAgICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgaVJhd2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgICAgIHBSYXdkYXRhKTsKKworbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfZGlzcGxheV9qZGF0ICAobW5nX2RhdGFwICAgICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICBpUmF3bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCAgICAgcFJhd2RhdGEpOworCisjZW5kaWYKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfZGlzcGxheV9kaGRyICAobW5nX2RhdGFwICAgICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgICBpT2JqZWN0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICBpSW1hZ2V0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgaURlbHRhdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgIGlCbG9ja3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgaUJsb2NraGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgaUJsb2NreCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgIGlCbG9ja3kpOworCittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19kaXNwbGF5X3Byb20gIChtbmdfZGF0YXAgICAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgIGlCaXRkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgIGlDb2xvcnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICBpRmlsbHR5cGUpOworCittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19kaXNwbGF5X2lwbmcgIChtbmdfZGF0YXAgICAgICBwRGF0YSk7CisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19kaXNwbGF5X2lqbmcgIChtbmdfZGF0YXAgICAgICBwRGF0YSk7CisjZW5kaWYKKworbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfZGlzcGxheV9wcGx0ICAobW5nX2RhdGFwICAgICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICBpVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgIGlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wYWxldHRlOGVwIHBhSW5kZXhlbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCAgICAgcGFBbHBoYWVudHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwICAgICBwYVVzZWRlbnRyaWVzKTsKKyNlbmRpZgorCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfTUFHTgorbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfZGlzcGxheV9tYWduICAobW5nX2RhdGFwICAgICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgICBpRmlyc3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgICAgIGlMYXN0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICBpTWV0aG9kWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgICAgIGlNWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgICAgIGlNWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgICAgIGlNTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgICAgIGlNUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgICAgIGlNVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgICAgIGlNQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgIGlNZXRob2RZKTsKK21uZ19yZXRjb2RlIG1uZ19wcm9jZXNzX2Rpc3BsYXlfbWFnbjIgKG1uZ19kYXRhcCAgICAgIHBEYXRhKTsKKyNlbmRpZgorCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfUEFTVAorbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfZGlzcGxheV9wYXN0ICAobW5nX2RhdGFwICAgICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgICBpVGFyZ2V0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICBpVGFyZ2V0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgICAgIGlUYXJnZXR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICAgICAgaVRhcmdldHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICBpQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcHRyICAgICAgICBwU291cmNlcyk7CittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19kaXNwbGF5X3Bhc3QyIChtbmdfZGF0YXAgICAgICBwRGF0YSk7CisjZW5kaWYKKworI2Vsc2UgLyogTU5HX09QVElNSVpFX0RJU1BMQVlDQUxMUyAqLworCittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19kaXNwbGF5X2loZHIgIChtbmdfZGF0YXAgICAgICBwRGF0YSk7CisjaWZkZWYgTU5HX0lOQ0xVREVfTVBOR19QUk9QT1NBTAorbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfZGlzcGxheV9tcG5nICAobW5nX2RhdGFwICAgICAgcERhdGEpOworI2VuZGlmCittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19kaXNwbGF5X2lkYXQgIChtbmdfZGF0YXAgICAgICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19kaXNwbGF5X2llbmQgIChtbmdfZGF0YXAgICAgICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19kaXNwbGF5X21lbmQgIChtbmdfZGF0YXAgICAgICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19kaXNwbGF5X21lbmQyIChtbmdfZGF0YXAgICAgICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19kaXNwbGF5X2RlZmkgIChtbmdfZGF0YXAgICAgICBwRGF0YSk7CisjaWZuZGVmIE1OR19TS0lQQ0hVTktfQkFTSQorbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfZGlzcGxheV9iYXNpICAobW5nX2RhdGFwICAgICAgcERhdGEpOworI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfQ0xPTgorbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfZGlzcGxheV9jbG9uICAobW5nX2RhdGFwICAgICAgcERhdGEpOworbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfZGlzcGxheV9jbG9uMiAobW5nX2RhdGFwICAgICAgcERhdGEpOworI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfRElTQworbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfZGlzcGxheV9kaXNjICAobW5nX2RhdGFwICAgICAgcERhdGEpOworI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfRlJBTQorbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfZGlzcGxheV9mcmFtICAobW5nX2RhdGFwICAgICAgcERhdGEpOworbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfZGlzcGxheV9mcmFtMiAobW5nX2RhdGFwICAgICAgcERhdGEpOworI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfTU9WRQorbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfZGlzcGxheV9tb3ZlICAobW5nX2RhdGFwICAgICAgcERhdGEpOworI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfQ0xJUAorbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfZGlzcGxheV9jbGlwICAobW5nX2RhdGFwICAgICAgcERhdGEpOworI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfU0hPVworbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfZGlzcGxheV9zaG93ICAobW5nX2RhdGFwICAgICAgcERhdGEpOworI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfU0FWRQorbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfZGlzcGxheV9zYXZlICAobW5nX2RhdGFwICAgICAgcERhdGEpOworI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfU0VFSworbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfZGlzcGxheV9zZWVrICAobW5nX2RhdGFwICAgICAgcERhdGEpOworI2VuZGlmCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19kaXNwbGF5X2poZHIgIChtbmdfZGF0YXAgICAgICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19kaXNwbGF5X2pkYWEgIChtbmdfZGF0YXAgICAgICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19kaXNwbGF5X2pkYXQgIChtbmdfZGF0YXAgICAgICBwRGF0YSk7CisjZW5kaWYKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfZGlzcGxheV9kaGRyICAobW5nX2RhdGFwICAgICAgcERhdGEpOworbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfZGlzcGxheV9wcm9tICAobW5nX2RhdGFwICAgICAgcERhdGEpOworbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfZGlzcGxheV9pcG5nICAobW5nX2RhdGFwICAgICAgcERhdGEpOworI2lmZGVmIE1OR19JTkNMVURFX0pORworbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfZGlzcGxheV9pam5nICAobW5nX2RhdGFwICAgICAgcERhdGEpOworI2VuZGlmCittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19kaXNwbGF5X3BwbHQgIChtbmdfZGF0YXAgICAgICBwRGF0YSk7CisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19NQUdOCittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19kaXNwbGF5X21hZ24gIChtbmdfZGF0YXAgICAgICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19kaXNwbGF5X21hZ24yIChtbmdfZGF0YXAgICAgICBwRGF0YSk7CisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19QQVNUCittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19kaXNwbGF5X3Bhc3QgIChtbmdfZGF0YXAgICAgICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19kaXNwbGF5X3Bhc3QyIChtbmdfZGF0YXAgICAgICBwRGF0YSk7CisjZW5kaWYKKworI2VuZGlmIC8qIE1OR19PUFRJTUlaRV9ESVNQTEFZQ0FMTFMgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2VuZGlmIC8qIE1OR19JTkNMVURFX0RJU1BMQVlfUFJPQ1MgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2VuZGlmIC8qIF9saWJtbmdfZGlzcGxheV9oXyAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiBlbmQgb2YgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCmRpZmYgLS1naXQgYS9maWxlcy9Tb3VyY2UvTGliTU5HL2xpYm1uZ19kaXRoZXIuYyBiL2ZpbGVzL1NvdXJjZS9MaWJNTkcvbGlibW5nX2RpdGhlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMzg1MGMKLS0tIC9kZXYvbnVsbAorKysgYi9maWxlcy9Tb3VyY2UvTGliTU5HL2xpYm1uZ19kaXRoZXIuYwpAQCAtMCwwICsxLDU4IEBACisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gbGlibW5nLmggICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogcHJvamVjdCAgIDogbGlibW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGZpbGUgICAgICA6IGxpYm1uZ19kaXRoZXIuYyAgICAgICAgICAgY29weXJpZ2h0IChjKSAyMDAwLTIwMDQgRy5KdXluICAgKiAqLworLyogKiB2ZXJzaW9uICAgOiAxLjAuOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIHB1cnBvc2UgICA6IERpdGhlcmluZyByb3V0aW5lcyAoaW1wbGVtZW50YXRpb24pICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogYXV0aG9yICAgIDogRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBjb21tZW50ICAgOiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZGl0aGVyaW5nIHJvdXRpbmVzICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGNoYW5nZXMgICA6IDAuNS4xIC0gMDUvMDgvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNoYW5nZWQgc3RyaWN0LUFOU0kgc3R1ZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4yIC0gMDgvMDUvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNoYW5nZWQgZmlsZS1wcmVmaXhlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC41IC0gMDgvMTkvMjAwMiAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIEI1OTcxMzQgLSBsaWJtbmcgcG9sbHV0ZXMgdGhlIGxpbmtlciBuYW1lc3BhY2UgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC45IC0gMTIvMjAvMjAwNCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNsZWFuZWQgdXAgbWFjcm8taW52b2NhdGlvbnMgKHRoYW5rcyB0byBELiBBaXJsaWUpICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaW5jbHVkZSAibGlibW5nLmgiCisjaW5jbHVkZSAibGlibW5nX2RhdGEuaCIKKyNpbmNsdWRlICJsaWJtbmdfZXJyb3IuaCIKKyNpbmNsdWRlICJsaWJtbmdfdHJhY2UuaCIKKyNpZmRlZiBfX0JPUkxBTkRDX18KKyNwcmFnbWEgaGRyc3RvcAorI2VuZGlmCisjaW5jbHVkZSAibGlibW5nX2RpdGhlci5oIgorCisjaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pICYmIGRlZmluZWQoTU5HX1NUUklDVF9BTlNJKQorI3ByYWdtYSBvcHRpb24gLUEgICAgICAgICAgICAgICAgICAgICAgLyogZm9yY2UgQU5TSS1DICovCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX2RpdGhlcl9hX3JvdyAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcFJvdykKK3sKKworCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogZW5kIG9mIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisKKwpkaWZmIC0tZ2l0IGEvZmlsZXMvU291cmNlL0xpYk1ORy9saWJtbmdfZGl0aGVyLmggYi9maWxlcy9Tb3VyY2UvTGliTU5HL2xpYm1uZ19kaXRoZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTIxN2MwCi0tLSAvZGV2L251bGwKKysrIGIvZmlsZXMvU291cmNlL0xpYk1ORy9saWJtbmdfZGl0aGVyLmgKQEAgLTAsMCArMSw0NSBAQAorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIGxpYm1uZy5oICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIHByb2plY3QgICA6IGxpYm1uZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBmaWxlICAgICAgOiBsaWJtbmdfZGl0aGVyLmggICAgICAgICAgIGNvcHlyaWdodCAoYykgMjAwMC0yMDAyIEcuSnV5biAgICogKi8KKy8qICogdmVyc2lvbiAgIDogMS4wLjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBwdXJwb3NlICAgOiBEaXRoZXJpbmcgcm91dGluZXMgKGRlZmluaXRpb24pICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGF1dGhvciAgICA6IEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogY29tbWVudCAgIDogRGVmaW5pdGlvbiBvZiB0aGUgZGl0aGVyaW5nIHJvdXRpbmVzICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBjaGFuZ2VzICAgOiAwLjUuMSAtIDA1LzA4LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjaGFuZ2VkIHN0cmljdC1BTlNJIHN0dWZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMiAtIDA4LzA1LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjaGFuZ2VkIGZpbGUtcHJlZml4ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDA4LzE5LzIwMDIgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBCNTk3MTM0IC0gbGlibW5nIHBvbGx1dGVzIHRoZSBsaW5rZXIgbmFtZXNwYWNlICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmIGRlZmluZWQoX19CT1JMQU5EQ19fKSAmJiBkZWZpbmVkKE1OR19TVFJJQ1RfQU5TSSkKKyNwcmFnbWEgb3B0aW9uIC1BICAgICAgICAgICAgICAgICAgICAgIC8qIGZvcmNlIEFOU0ktQyAqLworI2VuZGlmCisKKyNpZm5kZWYgX2xpYm1uZ19kaXRoZXJfaF8KKyNkZWZpbmUgX2xpYm1uZ19kaXRoZXJfaF8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX2RpdGhlcl9hX3JvdyAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcFJvdyk7CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNlbmRpZiAvKiBfbGlibW5nX2RpdGhlcl9oXyAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiBlbmQgb2YgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCmRpZmYgLS1naXQgYS9maWxlcy9Tb3VyY2UvTGliTU5HL2xpYm1uZ19lcnJvci5jIGIvZmlsZXMvU291cmNlL0xpYk1ORy9saWJtbmdfZXJyb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTRkYTIwCi0tLSAvZGV2L251bGwKKysrIGIvZmlsZXMvU291cmNlL0xpYk1ORy9saWJtbmdfZXJyb3IuYwpAQCAtMCwwICsxLDMyNiBAQAorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIGxpYm1uZy5oICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIHByb2plY3QgICA6IGxpYm1uZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBmaWxlICAgICAgOiBsaWJtbmdfZXJyb3IuYyAgICAgICAgICAgIGNvcHlyaWdodCAoYykgMjAwMC0yMDA3IEcuSnV5biAgICogKi8KKy8qICogdmVyc2lvbiAgIDogMS4wLjEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBwdXJwb3NlICAgOiBFcnJvciByb3V0aW5lcyAoaW1wbGVtZW50YXRpb24pICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGF1dGhvciAgICA6IEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogY29tbWVudCAgIDogaW1wbGVtZW50YXRpb24gb2YgdGhlIGdlbmVyYWwgZXJyb3IgaGFuZGxpbmcgcm91dGluZXMgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBjaGFuZ2VzICAgOiAwLjUuMSAtIDA1LzA4LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjaGFuZ2VkIHN0cmljdC1BTlNJIHN0dWZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMiAtIDA1LzIzLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBlcnJvciB0ZWxsdGFsaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4yIC0gMDUvMzAvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGVycm9yc3RyaW5ncyBmb3IgZGVsdGEtaW1hZ2UgcHJvY2Vzc2luZyAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjIgLSAwNS8zMS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgdXAgcHVuY3R1YXRpb24gKGNvbnRyaWJ1dGVkIGJ5IFRpbSBSb3dsZXkpICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMiAtIDA2LzA2LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBlcnJvcnN0cmluZyBmb3IgZGVsYXllZCBidWZmZXItcHJvY2Vzc2luZyAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMSAtIDA3LzA2LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBNTkdfTkVFRFRJTUVSV0FJVCBlcnJvcnN0cmluZyAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4xIC0gMDcvMTUvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIE5FRURTRUNUSU9OV0FJVCBlcnJvcnN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBtYWNybyArIHJvdXRpbmUgdG8gc2V0IHJldHVybmNvZGUgd2l0aG91dCAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgY2FsbGluZyBlcnJvciBjYWxsYmFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMSAtIDA3LzE5LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBlcnJvcnN0cmluZyBmb3IgdXBkYXRlbW5naGVhZGVyIGlmIG5vdCBhIE1ORyAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMiAtIDA4LzA1LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjaGFuZ2VkIGZpbGUtcHJlZml4ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMyAtIDA4LzA5LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBjaGVjayBmb3Igc2ltcGxpY2l0eS1iaXRzIGluIE1IRFIgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4zIC0gMTAvMTEvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIHByb2Nlc3Npbmcgb2YgdW5rbm93biBjcml0aWNhbCBjaHVua3MgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBzdXBwb3J0IGZvciBuRUVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4zIC0gMTAvMjAvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGVycm9yY29kZSBmb3IgZGVsYXllZCBkZWx0YS1wcm9jZXNzaW5nICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS40IC0gMDEvMTgvMjAwMSAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGVycm9yY29kZSBmb3IgTUFHTiBtZXRob2RzICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC4yIC0gMDYvMjMvMjAwMSAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIG9wdGltaXphdGlvbiBvcHRpb24gZm9yIE1ORy12aWRlbyBwbGF5YmFjayAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC41IC0gMDcvMDQvMjAwMiAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGVycm9yY29kZSBmb3IgZXh0cmVtZSBjaHVuay1zaXplcyAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAwOC8xNS8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY29tcGxldGVkIGRlbHRhLWltYWdlIHN1cHBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDA4LzE5LzIwMDIgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBCNTk3MTM0IC0gbGlibW5nIHBvbGx1dGVzIHRoZSBsaW5rZXIgbmFtZXNwYWNlICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC41IC0gMDkvMTQvMjAwMiAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGV2ZW50IGhhbmRsaW5nIGZvciBkeW5hbWljIE1ORyAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAwOS8xNS8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgTE9PUCBpdGVyYXRpb249MCBzcGVjaWFsIGNhc2UgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDA5LzE5LzIwMDIgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSB3YXJuaW5ncyBhcmUgaWdub3JlZCBieSBkZWZhdWx0IG5vdyEgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC41IC0gMDkvMjAvMjAwMiAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHN1cHBvcnQgZm9yIFBBU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAxMC8wNy8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgY2hlY2sgZm9yIFRFUk0gcGxhY2VtZW50IGR1cmluZyBjcmVhdGUvd3JpdGUgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjYgLSAwNy8wNy8yMDAzIC0gRy4gUi1QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgTU5HX1NLSVBDSFVOS19DSE5LLCBNTkdfTk9fREVMVEFfUE5HIHJlZHVjdGlvbnMuICAgKiAqLworLyogKiAgICAgICAgICAgICAtIHNraXBwZWQgbW9yZSBjb2RlIHdoZW4gTU5HX0lOQ0xVREVfSk5HIGlzIG5vdCBlbmFibGVkLiAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjYgLSAwNy8yOS8yMDAzIC0gRy5SLVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgY29uZGl0aW9uYWwgYXJvdW5kIGV2TlQgY2h1bmsgc3VwcG9ydCAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjcgLSAwMy8yNC8yMDA0IC0gRy5SLVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgdHlwbyBvbiBTS0lQQ0hVTktfZXZOVCAoLT5QQVNUKSAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjkgLSAxMi8yMC8yMDA0IC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2xlYW5lZCB1cCBtYWNyby1pbnZvY2F0aW9ucyAodGhhbmtzIHRvIEQuIEFpcmxpZSkgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjEwIC0gMDQvMDgvMjAwNyAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgc3VwcG9ydCBmb3IgbVBORyBwcm9wb3NhbCAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpbmNsdWRlICJsaWJtbmcuaCIKKyNpbmNsdWRlICJsaWJtbmdfZGF0YS5oIgorI2luY2x1ZGUgImxpYm1uZ19lcnJvci5oIgorI2luY2x1ZGUgImxpYm1uZ190cmFjZS5oIgorI2lmZGVmIF9fQk9STEFORENfXworI3ByYWdtYSBoZHJzdG9wCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19CT1JMQU5EQ19fKSAmJiBkZWZpbmVkKE1OR19TVFJJQ1RfQU5TSSkKKyNwcmFnbWEgb3B0aW9uIC1BICAgICAgICAgICAgICAgICAgICAgIC8qIGZvcmNlIEFOU0ktQyAqLworI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfSU5DTFVERV9FUlJPUl9TVFJJTkdTCitNTkdfTE9DQUwgbW5nX2Vycm9yX2VudHJ5IGNvbnN0IGVycm9yX3RhYmxlIFtdID0KKyAgeworICAgIHtNTkdfTk9FUlJPUiwgICAgICAgICAgIk5vIGVycm9yIn0sCisgICAge01OR19PVVRPRk1FTU9SWSwgICAgICAiT3V0IG9mIG1lbW9yeSJ9LAorICAgIHtNTkdfSU5WQUxJREhBTkRMRSwgICAgIlRoZSBoYW5kbGUgaXMgaW52YWxpZCJ9LAorICAgIHtNTkdfTk9DQUxMQkFDSywgICAgICAgIkEgcmVxdWlyZWQgY2FsbGJhY2sgaXMgbm90IGRlZmluZWQifSwKKyAgICB7TU5HX1VORVhQRUNURURFT0YsICAgICJFbmNvdW50ZXJlZCB1bmV4cGVjdGVkIGVuZC1vZi1maWxlIn0sCisgICAge01OR19aTElCRVJST1IsICAgICAgICAiemxpYiBlbmNvdW50ZXJlZCBhbiBlcnJvciJ9LAorI2lmZGVmIE1OR19JTkNMVURFX0pORworICAgIHtNTkdfSlBFR0VSUk9SLCAgICAgICAgImlqZ3NyYzZiIGVuY291bnRlcmVkIGFuIGVycm9yIn0sCisjZW5kaWYKKyAgICB7TU5HX0xDTVNFUlJPUiwgICAgICAgICJsY21zIGVuY291bnRlcmVkIGFuIGVycm9yIn0sCisgICAge01OR19OT09VVFBVVFBST0ZJTEUsICAiTm8gb3V0cHV0LXByb2ZpbGUgZGVmaW5lZCBmb3IgQ01TIn0sCisgICAge01OR19OT1NSR0JQUk9GSUxFLCAgICAiTm8gc1JHQi1wcm9maWxlIGRlZmluZWQgZm9yIENNUyJ9LAorICAgIHtNTkdfQlVGT1ZFUkZMT1csICAgICAgIkludGVybmFsIGJ1ZmZlci1vdmVyZmxvdyJ9LAorICAgIHtNTkdfRlVOQ1RJT05JTlZBTElELCAgIkZ1bmN0aW9uIGlzIGludmFsaWQgYXQgdGhpcyBwb2ludCJ9LAorICAgIHtNTkdfT1VUUFVURVJST1IsICAgICAgIldyaXRpbmcgd2FzIHVuc3VjY2Vzc2Z1bDsgZGlzayBmdWxsPyJ9LAorICAgIHtNTkdfSlBFR0JVRlRPT1NNQUxMLCAgIkludGVybmFsIGJ1ZmZlciBmb3IgSlBFRyBwcm9jZXNzaW5nIHRvbyBzbWFsbCJ9LAorICAgIHtNTkdfTkVFRE1PUkVEQVRBLCAgICAgIlJlYWRpbmcgc3VzcGVuZGVkOyB3YWl0aW5nIGZvciBJL08gdG8gY2F0Y2ggdXAifSwKKyAgICB7TU5HX05FRURUSU1FUldBSVQsICAgICJUaW1lciBzdXNwZW5zaW9uOyBub3JtYWwgYW5pbWF0aW9uIGRlbGF5In0sCisgICAge01OR19ORUVEU0VDVElPTldBSVQsICAiU0VFSyBzdXNwZW5zaW9uOyBhcHBsaWNhdGlvbiBkZWNpZGVzIn0sCisgICAge01OR19MT09QV0lUSENBQ0hFT0ZGLCAiTE9PUCBlbmNvdW50ZXJlZCB3aGVuIHBsYXliYWNrIGNhY2hlIGlzIHR1cm5lZCBvZmYifSwKKworICAgIHtNTkdfQVBQSU9FUlJPUiwgICAgICAgIkFwcGxpY2F0aW9uIHNpZ25hbGxlZCBJL08gZXJyb3IifSwKKyAgICB7TU5HX0FQUFRJTUVSRVJST1IsICAgICJBcHBsaWNhdGlvbiBzaWduYWxsZWQgdGltaW5nIGVycm9yIn0sCisgICAge01OR19BUFBDTVNFUlJPUiwgICAgICAiQXBwbGljYXRpb24gc2lnbmFsbGVkIENNUyBlcnJvciJ9LAorICAgIHtNTkdfQVBQTUlTQ0VSUk9SLCAgICAgIkFwcGxpY2F0aW9uIHNpZ25hbGxlZCBhbiBlcnJvciJ9LAorICAgIHtNTkdfQVBQVFJBQ0VBQk9SVCwgICAgIkFwcGxpY2F0aW9uIHNpZ25hbGxlZCBlcnJvciBkdXJpbmcgdHJhY2UtY2FsbGJhY2sifSwKKworICAgIHtNTkdfSU5URVJOQUxFUlJPUiwgICAgIkludGVybmFsIGVycm9yIGluIGxpYm1uZyJ9LAorCisgICAge01OR19JTlZBTElEU0lHLCAgICAgICAiVGhlIHNpZ25hdHVyZSBpcyBpbnZhbGlkIn0sCisgICAge01OR19JTlZBTElEQ1JDLCAgICAgICAiVGhlIENSQyBmb3IgdGhpcyBjaHVuayBpcyBpbnZhbGlkIn0sCisgICAge01OR19JTlZBTElETEVOR1RILCAgICAiQ2h1bmstbGVuZ3RoIGlzIGludmFsaWQifSwKKyAgICB7TU5HX1NFUVVFTkNFRVJST1IsICAgICJDaHVuayBvdXQgb2Ygc2VxdWVuY2UifSwKKyAgICB7TU5HX0NIVU5LTk9UQUxMT1dFRCwgICJDaHVuayBub3QgYWxsb3dlZCBhdCB0aGlzIHBvaW50In0sCisgICAge01OR19NVUxUSVBMRUVSUk9SLCAgICAiQ2h1bmsgY2Fubm90IG9jY3VyIG11bHRpcGxlIHRpbWVzIn0sCisgICAge01OR19QTFRFTUlTU0lORywgICAgICAiTWlzc2luZyBQTFRFIGNodW5rIn0sCisgICAge01OR19JREFUTUlTU0lORywgICAgICAiTWlzc2luZyBJREFUIGNodW5rKHMpIn0sCisgICAge01OR19DQU5OT1RCRUVNUFRZLCAgICAiQ2h1bmsgY2Fubm90IGJlIGVtcHR5In0sCisgICAge01OR19HTE9CQUxMRU5HVEhFUlIsICAiR2xvYmFsIGRhdGEgbGVuZ3RoIGludmFsaWQifSwKKyAgICB7TU5HX0lOVkFMSURCSVRERVBUSCwgICJUaGUgYml0X2RlcHRoIGlzIGludmFsaWQifSwKKyAgICB7TU5HX0lOVkFMSURDT0xPUlRZUEUsICJUaGUgY29sb3JfdHlwZSBpcyBpbnZhbGlkIn0sCisgICAge01OR19JTlZBTElEQ09NUFJFU1MsICAiVGhlIGNvbXByZXNzaW9uX21ldGhvZCBpcyBpbnZhbGlkIn0sCisgICAge01OR19JTlZBTElERklMVEVSLCAgICAiVGhlIGZpbHRlcl9tZXRob2Qgb3IgZmlsdGVyX3R5cGUgaXMgaW52YWxpZCJ9LAorICAgIHtNTkdfSU5WQUxJRElOVEVSTEFDRSwgIlRoZSBpbnRlcmxhY2VfbWV0aG9kIGlzIGludmFsaWQifSwKKyAgICB7TU5HX05PVEVOT1VHSElEQVQsICAgICJUaGVyZSBpcyBub3QgZW5vdWdoIGRhdGEgaW4gdGhlIElEQVQgY2h1bmsocykifSwKKyAgICB7TU5HX1BMVEVJTkRFWEVSUk9SLCAgICJQYWxldHRlLWluZGV4IG91dCBvZiBib3VuZHMifSwKKyAgICB7TU5HX05VTExOT1RGT1VORCwgICAgICJOVUxMIHNlcGFyYXRvciBub3QgZm91bmQifSwKKyAgICB7TU5HX0tFWVdPUkROVUxMLCAgICAgICJLZXl3b3JkIGNhbm5vdCBiZSB6ZXJvLWxlbmd0aCJ9LAorICAgIHtNTkdfT0JKRUNUVU5LTk9XTiwgICAgIk9iamVjdCBkb2VzIG5vdCBleGlzdCJ9LAorICAgIHtNTkdfT0JKRUNURVhJU1RTLCAgICAgIk9iamVjdCBhbHJlYWR5IGV4aXN0cyJ9LAorICAgIHtNTkdfVE9PTVVDSElEQVQsICAgICAgIlRvbyBtdWNoIGRhdGEgaW4gSURBVCBjaHVuayhzKSJ9LAorICAgIHtNTkdfSU5WU0FNUExFREVQVEgsICAgIlRoZSBzYW1wbGVfZGVwdGggaXMgaW52YWxpZCJ9LAorICAgIHtNTkdfSU5WT0ZGU0VUU0laRSwgICAgIlRoZSBvZmZzZXRfdHlwZSBpcyBpbnZhbGlkIn0sCisgICAge01OR19JTlZFTlRSWVRZUEUsICAgICAiVGhlIGVudHJ5X3R5cGUgaXMgaW52YWxpZCJ9LAorICAgIHtNTkdfRU5EV0lUSE5VTEwsICAgICAgIkNodW5rIG11c3Qgbm90IGVuZCB3aXRoIE5VTEwgYnl0ZSJ9LAorICAgIHtNTkdfSU5WSU1BR0VUWVBFLCAgICAgIlRoZSBpbWFnZV90eXBlIGlzIGludmFsaWQifSwKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworICAgIHtNTkdfSU5WREVMVEFUWVBFLCAgICAgIlRoZSBkZWx0YV90eXBlIGlzIGludmFsaWQifSwKKyNlbmRpZgorICAgIHtNTkdfSU5WQUxJRElOREVYLCAgICAgIkluZGV4LXZhbHVlIG91dCBvZiBib3VuZHMifSwKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgICB7TU5HX1RPT01VQ0hKREFULCAgICAgICJUb28gbXVjaCBkYXRhIGluIEpEQVQgY2h1bmsocykifSwKKyAgICB7TU5HX0pQRUdQQVJNU0VSUiwgICAgICJKSERSIHBhcmFtZXRlcnMgJiBKRklGLWRhdGEgZG8gbm90IG1hdGNoIn0sCisjZW5kaWYKKyAgICB7TU5HX0lOVkZJTExNRVRIT0QsICAgICJUaGUgZmlsbF9tZXRob2QgaXMgaW52YWxpZCJ9LAorI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisgICAge01OR19PQkpOT1RDT05DUkVURSwgICAiVGFyZ2V0IG9iamVjdCBmb3IgREhEUiBtdXN0IGJlIGNvbmNyZXRlIn0sCisjZW5kaWYKKyAgICB7TU5HX1RBUkdFVE5PQUxQSEEsICAgICJUYXJnZXQgb2JqZWN0IG11c3QgaGF2ZSBhbHBoYS1jaGFubmVsIn0sCisgICAge01OR19NTkdUT09DT01QTEVYLCAgICAiTUhEUiBzaW1wbGljaXR5IGluZGljYXRlcyB1bnN1cHBvcnRlZCBmZWF0dXJlKHMpIn0sCisgICAge01OR19VTktOT1dOQ1JJVElDQUwsICAiVW5rbm93biBjcml0aWNhbCBjaHVuayBlbmNvdW50ZXJlZCJ9LAorI2lmbmRlZiBNTkdfU0tJUENIVU5LX25FRUQKKyAgICB7TU5HX1VOU1VQUE9SVEVETkVFRCwgICJSZXF1ZXN0ZWQgbkVFRCByZXNvdXJjZXMgYXJlIG5vdCBzdXBwb3J0ZWQifSwKKyNlbmRpZgorICAgIHtNTkdfSU5WQUxJRERFTFRBLCAgICAgIlRoZSBkZWx0YSBvcGVyYXRpb24gaXMgaW52YWxpZCAobWlzbWF0Y2hlZCBjb2xvcl90eXBlcz8pIn0sCisgICAge01OR19JTlZBTElETUVUSE9ELCAgICAiTWV0aG9kIGlzIGludmFsaWQifSwKKyAgICB7TU5HX0lNUFJPQkFCTEVMRU5HVEgsICJDaHVua2xlbmd0aCBpcyBpbmNyZWRpYmx5IGxhcmdlIn0sCisgICAge01OR19JTlZBTElEQkxPQ0ssICAgICAiRGVsdGEgYmxvY2sgd2lkdGggYW5kIG9yIGhlaWdodCBpbnZhbGlkIn0sCisgICAge01OR19JTlZBTElERVZFTlQsICAgICAiRXZlbnQgdHlwZSBpcyBpbnZhbGlkIn0sCisgICAge01OR19JTlZBTElETUFTSywgICAgICAiTWFzayB0eXBlIGlzIGludmFsaWQifSwKKyAgICB7TU5HX05PTUFUQ0hJTkdMT09QLCAgICJFTkRMIHdpdGhvdXQgbWF0Y2hpbmcgTE9PUCJ9LAorI2lmbmRlZiBNTkdfU0tJUENIVU5LX2V2TlQKKyAgICB7TU5HX1NFRUtOT1RGT1VORCwgICAgICJldk5UIHBvaW50cyB0byB1bmtub3duIFNFRUsifSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX1BBU1QKKyAgICB7TU5HX09CSk5PVEFCU1RSQUNULCAgICJEZXN0aW5hdGlvbiBvYmplY3QgZm9yIFBBU1QgbXVzdCBiZSBhYnN0cmFjdCJ9LAorI2VuZGlmCisgICAge01OR19URVJNU0VRRVJST1IsICAgICAiVEVSTSBtaXNwbGFjZWQgZHVyaW5nIGNyZWF0aW9uIG9mIE1ORyBzdHJlYW0ifSwKKyAgICB7TU5HX0lOVkFMSURGSUVMRFZBTCwgICJpbnZhbGlkIGZpZWxkdmFsdWUgKGdlbmVyaWMpIn0sCisgICAge01OR19JTlZBTElEV0lEVEgsICAgICAiaW52YWxpZCBmcmFtZS9pbWFnZSB3aWR0aCJ9LAorICAgIHtNTkdfSU5WQUxJREhFSUdIVCwgICAgImludmFsaWQgZnJhbWUvaW1hZ2UgaGVpZ2h0In0sCisKKyAgICB7TU5HX0lOVkFMSURDTlZTVFlMRSwgICJDYW52YXNfc3R5bGUgaXMgaW52YWxpZCJ9LAorICAgIHtNTkdfV1JPTkdDSFVOSywgICAgICAgIkF0dGVtcHQgdG8gYWNjZXNzIHRoZSB3cm9uZyBjaHVuayJ9LAorICAgIHtNTkdfSU5WQUxJREVOVFJZSVgsICAgIkF0dGVtcHQgdG8gYWNjZXNzIGFuIG5vbi1leGlzdGluZyBlbnRyeSJ9LAorICAgIHtNTkdfTk9IRUFERVIsICAgICAgICAgIk5vIHZhbGlkIGhlYWRlci1jaHVuayJ9LAorICAgIHtNTkdfTk9DT1JSQ0hVTkssICAgICAgIlBhcmVudCBjaHVuayBub3QgZm91bmQifSwKKyAgICB7TU5HX05PTUhEUiwgICAgICAgICAgICJObyBNTkcgaGVhZGVyIChNSERSKSBmb3VuZCJ9LAorCisgICAge01OR19JTUFHRVRPT0xBUkdFLCAgICAiSW1hZ2UgaXMgbGFyZ2VyIHRoYW4gZGVmaW5lZCBtYXhpbXVtIn0sCisgICAge01OR19OT1RBTkFOSU1BVElPTiwgICAiSW1hZ2UgaXMgbm90IGFuIGFuaW1hdGlvbiJ9LAorICAgIHtNTkdfRlJBTUVOUlRPT0hJR0gsICAgIkZyYW1lbnIgb3V0IG9mIGJvdW5kcyJ9LAorICAgIHtNTkdfTEFZRVJOUlRPT0hJR0gsICAgIkxheWVybnIgb3V0IG9mIGJvdW5kcyJ9LAorICAgIHtNTkdfUExBWVRJTUVUT09ISUdILCAgIlBsYXl0aW1lIG91dCBvZiBib3VuZHMifSwKKyAgICB7TU5HX0ZOTk9USU1QTEVNRU5URUQsICJGdW5jdGlvbiBub3QgeWV0IGltcGxlbWVudGVkIn0sCisgICAge01OR19JTUFHRUZST1pFTiwgICAgICAiSW1hZ2UgaXMgZnJvemVuIn0sCisKKyAgICB7TU5HX0xDTVNfTk9IQU5ETEUsICAgICJIYW5kbGUgY291bGQgbm90IGJlIGluaXRpYWxpemVkIn0sCisgICAge01OR19MQ01TX05PTUVNLCAgICAgICAiTm8gbWVtb3J5IGZvciBnYW1tYS10YWJsZShzKSJ9LAorICAgIHtNTkdfTENNU19OT1RSQU5TLCAgICAgIlRyYW5zZm9ybWF0aW9uIGNvdWxkIG5vdCBiZSBpbml0aWFsaXplZCJ9CisgIH07CisjZW5kaWYgLyogTU5HX0lOQ0xVREVfRVJST1JfU1RSSU5HUyAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfYm9vbCBtbmdfc3RvcmVfZXJyb3IgKG1uZ19kYXRhcCAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcmV0Y29kZSBpRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19yZXRjb2RlIGlFeHRyYTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19yZXRjb2RlIGlFeHRyYTIpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFQiAocERhdGEsIE1OR19GTl9TVE9SRV9FUlJPUiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmIChwRGF0YSAhPSAwKQorICB7CisgICAgcERhdGEtPmlFcnJvcmNvZGUgPSBpRXJyb3I7ICAgICAgICAvKiBzYXZlIGFsc28gZm9yIGdldGxhc3RlcnJvciAqLworICAgIHBEYXRhLT5pRXJyb3J4MSAgID0gaUV4dHJhMTsKKyAgICBwRGF0YS0+aUVycm9yeDIgICA9IGlFeHRyYTI7CisKKyNpZmRlZiBNTkdfSU5DTFVERV9FUlJPUl9TVFJJTkdTCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBiaW5hcnkgc2VhcmNoIHZhcmlhYmxlcyAqLworICAgICAgbW5nX2ludDMyICAgICAgICBpVG9wLCBpTG93ZXIsIGlVcHBlciwgaU1pZGRsZTsKKyAgICAgIG1uZ19lcnJvcl9lbnRyeXAgcEVudHJ5OyAgICAgICAgIC8qIHBvaW50ZXIgdG8gZm91bmQgZW50cnkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRldGVybWluZSBtYXggaW5kZXggb2YgdGFibGUgKi8KKyAgICAgIGlUb3AgPSAoc2l6ZW9mIChlcnJvcl90YWJsZSkgLyBzaXplb2YgKGVycm9yX3RhYmxlIFswXSkpIC0gMTsKKworICAgICAgaUxvd2VyICA9IDA7ICAgICAgICAgICAgICAgICAgICAgLyogaW5pdGlhbGl6ZSBiaW5hcnkgc2VhcmNoICovCisgICAgICBpTWlkZGxlID0gaVRvcCA+PiAxOyAgICAgICAgICAgICAvKiBzdGFydCBpbiB0aGUgbWlkZGxlICovCisgICAgICBpVXBwZXIgID0gaVRvcDsKKyAgICAgIHBFbnRyeSAgPSAwOyAgICAgICAgICAgICAgICAgICAgIC8qIG5vIGdvb2RzIHlldCEgKi8KKworICAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlIGJpbmFyeSBzZWFyY2ggaXRzZWxmICovCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoZXJyb3JfdGFibGUgW2lNaWRkbGVdLmlFcnJvciA8IGlFcnJvcikKKyAgICAgICAgICAgIGlMb3dlciA9IGlNaWRkbGUgKyAxOworICAgICAgICAgIGVsc2UgaWYgKGVycm9yX3RhYmxlIFtpTWlkZGxlXS5pRXJyb3IgPiBpRXJyb3IpCisgICAgICAgICAgICBpVXBwZXIgPSBpTWlkZGxlIC0gMTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgcEVudHJ5ID0gJmVycm9yX3RhYmxlIFtpTWlkZGxlXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICAgIGlNaWRkbGUgPSAoaUxvd2VyICsgaVVwcGVyKSA+PiAxOworICAgICAgICB9CisgICAgICB3aGlsZSAoaUxvd2VyIDw9IGlVcHBlcik7CisKKyAgICAgIGlmIChwRW50cnkpICAgICAgICAgICAgICAgICAgICAgIC8qIGZvdW5kIGl0ID8gKi8KKyAgICAgICAgcERhdGEtPnpFcnJvcnRleHQgPSBwRW50cnktPnpFcnJvcnRleHQ7CisgICAgICBlbHNlCisgICAgICAgIHBEYXRhLT56RXJyb3J0ZXh0ID0gIlVua25vd24gZXJyb3IiOworICAgICAgfQorI2Vsc2UgLyogTU5HX0lOQ0xVREVfRVJST1JfU1RSSU5HUyAqLworICAgIHBEYXRhLT56RXJyb3J0ZXh0ID0gMDsKKyNlbmRpZiAvKiBNTkdfSU5DTFVERV9FUlJPUl9TVFJJTkdTICovCisKKyAgICBpZiAoaUVycm9yID09IDApICAgICAgICAgICAgICAgICAgIC8qIG5vIGVycm9yIGlzIG5vdCBzZXZlcmUgISAqLworICAgIHsKKyAgICAgIHBEYXRhLT5pU2V2ZXJpdHkgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgc3dpdGNoIChpRXJyb3ImMHgzQzAwKSAgICAgICAgICAgLyogZGV0ZXJtaW5lIHRoZSBzZXZlcml0eSAqLworICAgICAgeworICAgICAgICBjYXNlIDB4MDgwMCA6IHsgcERhdGEtPmlTZXZlcml0eSA9IDU7IGJyZWFrOyB9CisgICAgICAgIGNhc2UgMHgxMDAwIDogeyBwRGF0YS0+aVNldmVyaXR5ID0gMjsgYnJlYWs7IH0KKyAgICAgICAgY2FzZSAweDIwMDAgOiB7IHBEYXRhLT5pU2V2ZXJpdHkgPSAxOyBicmVhazsgfSAgICAgIAorICAgICAgICBkZWZhdWx0ICAgICA6IHsgcERhdGEtPmlTZXZlcml0eSA9IDk7IH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRUIgKHBEYXRhLCBNTkdfRk5fU1RPUkVfRVJST1IsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19UUlVFOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfYm9vbCBtbmdfcHJvY2Vzc19lcnJvciAobW5nX2RhdGFwICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3JldGNvZGUgaUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19yZXRjb2RlIGlFeHRyYTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3JldGNvZGUgaUV4dHJhMikKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VCIChwRGF0YSwgTU5HX0ZOX1BST0NFU1NfRVJST1IsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBtbmdfc3RvcmVfZXJyb3IgKHBEYXRhLCBpRXJyb3IsIGlFeHRyYTEsIGlFeHRyYTIpOworCisgIGlmICgocERhdGEgIT0gTU5HX05VTEwpICYmIChwRGF0YS0+aU1hZ2ljID09IE1OR19NQUdJQykpCisgIHsKKyAgICBpZiAocERhdGEtPmZFcnJvcnByb2MpICAgICAgICAgICAgIC8qIGNhbGxiYWNrIGRlZmluZWQgPyAqLworICAgICAgcmV0dXJuIHBEYXRhLT5mRXJyb3Jwcm9jICgoKG1uZ19oYW5kbGUpcERhdGEpLCBpRXJyb3IsIHBEYXRhLT5pU2V2ZXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pQ2h1bmtuYW1lLCBwRGF0YS0+aUNodW5rc2VxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aUVycm9yeDEsIHBEYXRhLT5pRXJyb3J4MiwgcERhdGEtPnpFcnJvcnRleHQpOworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VCIChwRGF0YSwgTU5HX0ZOX1BST0NFU1NfRVJST1IsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19UUlVFOyAgICAgICAgICAgICAgICAgICAgIC8qIHdhcm5pbmdzIGFyZSBpZ25vcmVkIGJ5IGRlZmF1bHQgISAqLworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiBlbmQgb2YgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9MaWJNTkcvbGlibW5nX2Vycm9yLmggYi9maWxlcy9Tb3VyY2UvTGliTU5HL2xpYm1uZ19lcnJvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0OWZmNzMKLS0tIC9kZXYvbnVsbAorKysgYi9maWxlcy9Tb3VyY2UvTGliTU5HL2xpYm1uZ19lcnJvci5oCkBAIC0wLDAgKzEsMTE5IEBACisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gbGlibW5nLmggICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogcHJvamVjdCAgIDogbGlibW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGZpbGUgICAgICA6IGxpYm1uZ19lcnJvci5oICAgICAgICAgICAgY29weXJpZ2h0IChjKSAyMDAwLTIwMDIgRy5KdXluICAgKiAqLworLyogKiB2ZXJzaW9uICAgOiAxLjAuNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIHB1cnBvc2UgICA6IEVycm9yIGZ1bmN0aW9ucyAoZGVmaW5pdGlvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogYXV0aG9yICAgIDogRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBjb21tZW50ICAgOiBEZWZpbml0aW9uIG9mIHRoZSBnZW5lcmljIGVycm9yLWNvZGVzIGFuZCBmdW5jdGlvbnMgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGNoYW5nZXMgICA6IDAuNS4xIC0gMDUvMDYvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHNvbWUgZXJyb3Jjb2RlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjEgLSAwNS8wOC8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgc29tZSBlcnJvcmNvZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNoYW5nZWQgc3RyaWN0LUFOU0kgc3R1ZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjEgLSAwNS8xMS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgYXBwbGljYXRpb24gZXJyb3Jjb2RlcyAodXNlZCB3aXRoIGNhbGxiYWNrcykgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIG1vdmVkIGNodW5rLWFjY2VzcyBlcnJvcmNvZGVzIHRvIHNldmVyaXR5IDUgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4yIC0gMDUvMjAvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIEpORyBlcnJvcmNvZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjIgLSAwNS8yMy8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgZXJyb3IgdGVsbC10YWxlIGRlZmluaXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMiAtIDA1LzMwLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBlcnJvcmNvZGVzIGZvciBkZWx0YS1pbWFnZSBwcm9jZXNzaW5nICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4yIC0gMDYvMDYvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGVycm9yY29kZSBmb3IgZGVsYXllZCBidWZmZXItcHJvY2Vzc2luZyAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBtb3ZlZCBlcnJvcmNvZGVzIHRvICJsaWJtbmcuaCIgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMSAtIDA3LzE1LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBtYWNybyArIHJvdXRpbmUgdG8gc2V0IHJldHVybmNvZGUgd2l0aG91dCAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgY2FsbGluZyBlcnJvciBjYWxsYmFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjIgLSAwOC8wNS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2hhbmdlZCBmaWxlLXByZWZpeGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAwOC8xOS8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gQjU5NzEzNCAtIGxpYm1uZyBwb2xsdXRlcyB0aGUgbGlua2VyIG5hbWVzcGFjZSAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDA4LzIwLzIwMDIgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBvcHRpb24gZm9yIHNvZnQtaGFuZGxpbmcgb2YgZXJyb3JzICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmIGRlZmluZWQoX19CT1JMQU5EQ19fKSAmJiBkZWZpbmVkKE1OR19TVFJJQ1RfQU5TSSkKKyNwcmFnbWEgb3B0aW9uIC1BICAgICAgICAgICAgICAgICAgICAgIC8qIGZvcmNlIEFOU0ktQyAqLworI2VuZGlmCisKKyNpZm5kZWYgX2xpYm1uZ19lcnJvcl9oXworI2RlZmluZSBfbGlibW5nX2Vycm9yX2hfCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBEZWZhdWx0IGVycm9yIHJvdXRpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfYm9vbCBtbmdfc3RvcmVfZXJyb3IgICAobW5nX2RhdGFwICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3JldGNvZGUgaUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19yZXRjb2RlIGlFeHRyYTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3JldGNvZGUgaUV4dHJhMik7CisKK21uZ19ib29sIG1uZ19wcm9jZXNzX2Vycm9yIChtbmdfZGF0YXAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcmV0Y29kZSBpRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3JldGNvZGUgaUV4dHJhMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcmV0Y29kZSBpRXh0cmEyKTsKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIEVycm9yIGhhbmRsaW5nIG1hY3JvcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfU09GVEVSUk9SUworI2RlZmluZSBNTkdfRVJST1IoRCxDKSAgICAgIHsgaWYgKCFtbmdfcHJvY2Vzc19lcnJvciAoRCwgQywgMCwgMCkpIHJldHVybiBDOyB9CisjZGVmaW5lIE1OR19FUlJPUlooRCxaKSAgICAgeyBpZiAoIW1uZ19wcm9jZXNzX2Vycm9yIChELCBNTkdfWkxJQkVSUk9SLCBaLCAwKSkgcmV0dXJuIE1OR19aTElCRVJST1I7IH0KKyNkZWZpbmUgTU5HX0VSUk9SSihELEopICAgICB7IGlmICghbW5nX3Byb2Nlc3NfZXJyb3IgKEQsIE1OR19KUEVHRVJST1IsIEosIDApKSByZXR1cm4gTU5HX0pQRUdFUlJPUjsgfQorI2RlZmluZSBNTkdfRVJST1JMKEQsTCkgICAgIHsgaWYgKCFtbmdfcHJvY2Vzc19lcnJvciAoRCwgTU5HX0xDTVNFUlJPUiwgTCwgMCkpIHJldHVybiBNTkdfTENNU0VSUk9SOyB9CisjZWxzZQorI2RlZmluZSBNTkdfRVJST1IoRCxDKSAgICAgIHsgbW5nX3Byb2Nlc3NfZXJyb3IgKEQsIEMsIDAsIDApOyByZXR1cm4gQzsgfQorI2RlZmluZSBNTkdfRVJST1JaKEQsWikgICAgIHsgbW5nX3Byb2Nlc3NfZXJyb3IgKEQsIE1OR19aTElCRVJST1IsIFosIDApOyByZXR1cm4gTU5HX1pMSUJFUlJPUjsgfQorI2RlZmluZSBNTkdfRVJST1JKKEQsSikgICAgIHsgbW5nX3Byb2Nlc3NfZXJyb3IgKEQsIE1OR19KUEVHRVJST1IsIEosIDApOyByZXR1cm4gTU5HX0pQRUdFUlJPUjsgfQorI2RlZmluZSBNTkdfRVJST1JMKEQsTCkgICAgIHsgbW5nX3Byb2Nlc3NfZXJyb3IgKEQsIE1OR19MQ01TRVJST1IsIEwsIDApOyByZXR1cm4gTU5HX0xDTVNFUlJPUjsgfQorI2VuZGlmCisKKyNkZWZpbmUgTU5HX1JFVFVSTihELEMpICAgICB7IG1uZ19zdG9yZV9lcnJvciAoRCwgQywgMCwgMCk7IHJldHVybiBDOyB9CisKKyNkZWZpbmUgTU5HX1dBUk5JTkcoRCxDKSAgICB7IGlmICghbW5nX3Byb2Nlc3NfZXJyb3IgKEQsIEMsIDAsIDApKSByZXR1cm4gQzsgfQorCisjZGVmaW5lIE1OR19WQUxJREhBTkRMRShIKSAgeyBpZiAoKEggPT0gMCkgfHwgKCgobW5nX2RhdGFwKUgpLT5pTWFnaWMgIT0gTU5HX01BR0lDKSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTU5HX0lOVkFMSURIQU5ETEU7IH0KKyNkZWZpbmUgTU5HX1ZBTElESEFORExFWChIKSB7IGlmICgoSCA9PSAwKSB8fCAoKChtbmdfZGF0YXApSCktPmlNYWdpYyAhPSBNTkdfTUFHSUMpKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOyB9CisjZGVmaW5lIE1OR19WQUxJRENCKEQsQykgICAgeyBpZiAoISgobW5nX2RhdGFwKUQpLT5DKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1OR19FUlJPUiAoKChtbmdfZGF0YXApRCksIE1OR19OT0NBTExCQUNLKSB9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBFcnJvciBzdHJpbmctdGFibGUgZW50cnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgIG1uZ19yZXRjb2RlIGlFcnJvcjsKKyAgICAgICAgICAgICAgICAgbW5nX3BjaGFyICAgekVycm9ydGV4dDsKKyAgICAgICAgICAgICAgIH0gbW5nX2Vycm9yX2VudHJ5OwordHlwZWRlZiBtbmdfZXJyb3JfZW50cnkgY29uc3QgKiBtbmdfZXJyb3JfZW50cnlwOworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjZW5kaWYgLyogX2xpYm1uZ19lcnJvcl9oXyAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiBlbmQgb2YgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCmRpZmYgLS1naXQgYS9maWxlcy9Tb3VyY2UvTGliTU5HL2xpYm1uZ19maWx0ZXIuYyBiL2ZpbGVzL1NvdXJjZS9MaWJNTkcvbGlibW5nX2ZpbHRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNjlhNzUKLS0tIC9kZXYvbnVsbAorKysgYi9maWxlcy9Tb3VyY2UvTGliTU5HL2xpYm1uZ19maWx0ZXIuYwpAQCAtMCwwICsxLDk3OCBAQAorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIGxpYm1uZy5oICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIHByb2plY3QgICA6IGxpYm1uZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBmaWxlICAgICAgOiBsaWJtbmdfZmlsdGVyLmMgICAgICAgICAgIGNvcHlyaWdodCAoYykgMjAwMC0yMDA0IEcuSnV5biAgICogKi8KKy8qICogdmVyc2lvbiAgIDogMS4wLjkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBwdXJwb3NlICAgOiBGaWx0ZXJpbmcgcm91dGluZXMgKGltcGxlbWVudGF0aW9uKSAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGF1dGhvciAgICA6IEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogY29tbWVudCAgIDogaW1wbGVtZW50YXRpb24gb2YgdGhlIGZpbHRlcmluZyByb3V0aW5lcyAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBjaGFuZ2VzICAgOiAwLjUuMSAtIDA1LzA4LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjaGFuZ2VkIHN0cmljdC1BTlNJIHN0dWZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4xIC0gMDUvMTIvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNoYW5nZWQgdHJhY2UgdG8gbWFjcm8gZm9yIGNhbGxiYWNrIGVycm9yLXJlcG9ydGluZyAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4yIC0gMDgvMDUvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNoYW5nZWQgZmlsZS1wcmVmaXhlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4zIC0gMDkvMDcvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHN1cHBvcnQgZm9yIG5ldyBmaWx0ZXJfdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC41IC0gMDgvMDcvMjAwMiAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHRlc3Qtb3B0aW9uIGZvciBQTkcgZmlsdGVyIG1ldGhvZCAxOTMgKD1ubyBmaWx0ZXIpICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAwOC8xOS8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gQjU5NzEzNCAtIGxpYm1uZyBwb2xsdXRlcyB0aGUgbGlua2VyIG5hbWVzcGFjZSAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjYgLSAwNy8wNy8yMDAzIC0gRy5SLVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gcmV2ZXJzZWQgc29tZSBsb29wcyB0byB1c2UgZGVjcmVtZW50aW5nIGNvdW50ZXIgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjkgLSAxMi8yMC8yMDA0IC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2xlYW5lZCB1cCBtYWNyby1pbnZvY2F0aW9ucyAodGhhbmtzIHRvIEQuIEFpcmxpZSkgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpbmNsdWRlICJsaWJtbmcuaCIKKyNpbmNsdWRlICJsaWJtbmdfZGF0YS5oIgorI2luY2x1ZGUgImxpYm1uZ19lcnJvci5oIgorI2luY2x1ZGUgImxpYm1uZ190cmFjZS5oIgorI2lmZGVmIF9fQk9STEFORENfXworI3ByYWdtYSBoZHJzdG9wCisjZW5kaWYKKyNpbmNsdWRlICJsaWJtbmdfZmlsdGVyLmgiCisKKyNpZiBkZWZpbmVkKF9fQk9STEFORENfXykgJiYgZGVmaW5lZChNTkdfU1RSSUNUX0FOU0kpCisjcHJhZ21hIG9wdGlvbiAtQSAgICAgICAgICAgICAgICAgICAgICAvKiBmb3JjZSBBTlNJLUMgKi8KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX0lOQ0xVREVfRklMVEVSUworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitNTkdfTE9DQUwgbW5nX3JldGNvZGUgZmlsdGVyX3N1YiAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfdWludDMyIGlCcHA7CisgIG1uZ191aW50OHAgcFJhd3g7CisgIG1uZ191aW50OHAgcFJhd3hfcHJldjsKKyAgbW5nX2ludDMyICBpWDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GSUxURVJfU1VCLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaUJwcCAgICAgICA9IHBEYXRhLT5pRmlsdGVyYnBwOworICBwUmF3eCAgICAgID0gcERhdGEtPnBXb3Jrcm93ICsgcERhdGEtPmlQaXhlbG9mcyArIGlCcHA7CisgIHBSYXd4X3ByZXYgPSBwRGF0YS0+cFdvcmtyb3cgKyBwRGF0YS0+aVBpeGVsb2ZzOworCisgIGZvciAoaVggPSBpQnBwOyBpWCA8IHBEYXRhLT5pUm93c2l6ZTsgaVgrKykKKyAgeworICAgICpwUmF3eCA9IChtbmdfdWludDgpKCpwUmF3eCArICpwUmF3eF9wcmV2KTsKKyAgICBwUmF3eCsrOworICAgIHBSYXd4X3ByZXYrKzsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZJTFRFUl9TVUIsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitNTkdfTE9DQUwgbW5nX3JldGNvZGUgZmlsdGVyX3VwIChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ191aW50OHAgcFJhd3g7CisgIG1uZ191aW50OHAgcFByaW9yeDsKKyAgbW5nX2ludDMyICBpWDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GSUxURVJfVVAsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBwUmF3eCAgID0gcERhdGEtPnBXb3Jrcm93ICsgcERhdGEtPmlQaXhlbG9mczsKKyAgcFByaW9yeCA9IHBEYXRhLT5wUHJldnJvdyArIHBEYXRhLT5pUGl4ZWxvZnM7CisKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NpemUgLSAxOyBpWCA+PSAwOyBpWC0tKQorI2Vsc2UKKyAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlSb3dzaXplOyBpWCsrKQorI2VuZGlmCisgIHsKKyAgICAqcFJhd3ggPSAobW5nX3VpbnQ4KSgqcFJhd3ggKyAqcFByaW9yeCk7CisgICAgcFJhd3grKzsKKyAgICBwUHJpb3J4Kys7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GSUxURVJfVVAsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitNTkdfTE9DQUwgbW5nX3JldGNvZGUgZmlsdGVyX2F2ZXJhZ2UgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX2ludDMyICBpQnBwOworICBtbmdfdWludDhwIHBSYXd4OworICBtbmdfdWludDhwIHBSYXd4X3ByZXY7CisgIG1uZ191aW50OHAgcFByaW9yeDsKKyAgbW5nX2ludDMyICBpWDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GSUxURVJfQVZFUkFHRSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlCcHAgICAgICAgPSBwRGF0YS0+aUZpbHRlcmJwcDsKKyAgcFJhd3ggICAgICA9IHBEYXRhLT5wV29ya3JvdyArIHBEYXRhLT5pUGl4ZWxvZnM7CisgIHBQcmlvcnggICAgPSBwRGF0YS0+cFByZXZyb3cgKyBwRGF0YS0+aVBpeGVsb2ZzOworICBwUmF3eF9wcmV2ID0gcERhdGEtPnBXb3Jrcm93ICsgcERhdGEtPmlQaXhlbG9mczsKKworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgZm9yIChpWCA9IGlCcHAgLSAxOyBpWCA+PSAwOyBpWC0tKQorI2Vsc2UKKyAgZm9yIChpWCA9IDA7IGlYIDwgaUJwcDsgaVgrKykKKyNlbmRpZgorICB7CisgICAgKnBSYXd4ID0gKG1uZ191aW50OCkoKnBSYXd4ICsgKCgqcFByaW9yeCkgPj4gMSkpOworICAgIHBSYXd4Kys7CisgICAgcFByaW9yeCsrOworICB9CisKKyAgZm9yIChpWCA9IGlCcHA7IGlYIDwgcERhdGEtPmlSb3dzaXplOyBpWCsrKQorICB7CisgICAgKnBSYXd4ID0gKG1uZ191aW50OCkoKnBSYXd4ICsgKCgqcFJhd3hfcHJldiArICpwUHJpb3J4KSA+PiAxKSk7CisgICAgcFJhd3grKzsKKyAgICBwUHJpb3J4Kys7CisgICAgcFJhd3hfcHJldisrOworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRklMVEVSX0FWRVJBR0UsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitNTkdfTE9DQUwgbW5nX3JldGNvZGUgZmlsdGVyX3BhZXRoIChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ19pbnQzMiAgaUJwcDsKKyAgbW5nX3VpbnQ4cCBwUmF3eDsKKyAgbW5nX3VpbnQ4cCBwUmF3eF9wcmV2OworICBtbmdfdWludDhwIHBQcmlvcng7CisgIG1uZ191aW50OHAgcFByaW9yeF9wcmV2OworICBtbmdfaW50MzIgIGlYOworICBtbmdfdWludDMyIGlBLCBpQiwgaUM7CisgIG1uZ191aW50MzIgaVA7CisgIG1uZ191aW50MzIgaVBhLCBpUGIsIGlQYzsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GSUxURVJfUEFFVEgsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpQnBwICAgICAgICAgPSBwRGF0YS0+aUZpbHRlcmJwcDsKKyAgcFJhd3ggICAgICAgID0gcERhdGEtPnBXb3Jrcm93ICsgcERhdGEtPmlQaXhlbG9mczsKKyAgcFByaW9yeCAgICAgID0gcERhdGEtPnBQcmV2cm93ICsgcERhdGEtPmlQaXhlbG9mczsKKyAgcFJhd3hfcHJldiAgID0gcERhdGEtPnBXb3Jrcm93ICsgcERhdGEtPmlQaXhlbG9mczsKKyAgcFByaW9yeF9wcmV2ID0gcERhdGEtPnBQcmV2cm93ICsgcERhdGEtPmlQaXhlbG9mczsKKworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgZm9yIChpWCA9IGlCcHAgLSAxOyBpWCA+PSAwOyBpWC0tKQorI2Vsc2UKKyAgZm9yIChpWCA9IDA7IGlYIDwgaUJwcDsgaVgrKykKKyNlbmRpZgorICB7CisgICAgKnBSYXd4ID0gKG1uZ191aW50OCkoKnBSYXd4ICsgKnBQcmlvcngpOworCisgICAgcFJhd3grKzsKKyAgICBwUHJpb3J4Kys7CisgIH0KKworICBmb3IgKGlYID0gaUJwcDsgaVggPCBwRGF0YS0+aVJvd3NpemU7IGlYKyspCisgIHsKKyAgICBpQSAgPSAobW5nX3VpbnQzMikqcFJhd3hfcHJldjsKKyAgICBpQiAgPSAobW5nX3VpbnQzMikqcFByaW9yeDsKKyAgICBpQyAgPSAobW5nX3VpbnQzMikqcFByaW9yeF9wcmV2OworICAgIGlQICA9IGlBICsgaUIgLSBpQzsKKyAgICBpUGEgPSBhYnMgKGlQIC0gaUEpOworICAgIGlQYiA9IGFicyAoaVAgLSBpQik7CisgICAgaVBjID0gYWJzIChpUCAtIGlDKTsKKworICAgIGlmICgoaVBhIDw9IGlQYikgJiYgKGlQYSA8PSBpUGMpKQorICAgICAgKnBSYXd4ID0gKG1uZ191aW50OCkoKnBSYXd4ICsgaUEpOworICAgIGVsc2UKKyAgICAgIGlmIChpUGIgPD0gaVBjKQorICAgICAgICAqcFJhd3ggPSAobW5nX3VpbnQ4KSgqcFJhd3ggKyBpQik7CisgICAgICBlbHNlCisgICAgICAgICpwUmF3eCA9IChtbmdfdWludDgpKCpwUmF3eCArIGlDKTsKKworICAgIHBSYXd4Kys7CisgICAgcFByaW9yeCsrOworICAgIHBSYXd4X3ByZXYrKzsKKyAgICBwUHJpb3J4X3ByZXYrKzsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZJTFRFUl9QQUVUSCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19maWx0ZXJfYV9yb3cgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX3JldGNvZGUgaVJldGNvZGU7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRklMVEVSX0FfUk9XLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgc3dpdGNoICgqKHBEYXRhLT5wV29ya3JvdyArIHBEYXRhLT5pRmlsdGVyb2ZzKSkKKyAgeworICAgIGNhc2UgMSAgOiB7CisgICAgICAgICAgICAgICAgaVJldGNvZGUgPSBmaWx0ZXJfc3ViICAgICAocERhdGEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgY2FzZSAyICA6IHsKKyAgICAgICAgICAgICAgICBpUmV0Y29kZSA9IGZpbHRlcl91cCAgICAgIChwRGF0YSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICBjYXNlIDMgIDogeworICAgICAgICAgICAgICAgIGlSZXRjb2RlID0gZmlsdGVyX2F2ZXJhZ2UgKHBEYXRhKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgIGNhc2UgNCAgOiB7CisgICAgICAgICAgICAgICAgaVJldGNvZGUgPSBmaWx0ZXJfcGFldGggICAocERhdGEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisKKyAgICBkZWZhdWx0IDogaVJldGNvZGUgPSBNTkdfSU5WQUxJREZJTFRFUjsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZJTFRFUl9BX1JPVywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gaVJldGNvZGU7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgRklMVEVSMTkyCittbmdfcmV0Y29kZSBtbmdfaW5pdF9yb3dkaWZmZXJpbmcgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX3VpbnQ4cCBwUmF3aSwgcFJhd287CisgIG1uZ19pbnQzMiAgaVg7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSU5JVF9ST1dESUZGRVJJTkcsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAocERhdGEtPmlGaWx0ZXIgPT0gMHhDMCkgICAgICAgICAgLyogaGFzIGxldmVsaW5nIHBhcmFtZXRlcnMgPyAqLworICB7CisgICAgc3dpdGNoIChwRGF0YS0+aUNvbG9ydHlwZSkgICAgICAgICAvKiBzYWx2YWdlIGxldmVsaW5nIHBhcmFtZXRlcnMgKi8KKyAgICB7CisgICAgICBjYXNlIDAgOiB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBncmF5ICovCisgICAgICAgICAgICAgICAgIGlmIChwRGF0YS0+aUJpdGRlcHRoIDw9IDgpCisgICAgICAgICAgICAgICAgICAgcERhdGEtPmlMZXZlbDAgPSAobW5nX3VpbnQxNikqcERhdGEtPnBXb3Jrcm93OworICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgcERhdGEtPmlMZXZlbDAgPSBtbmdfZ2V0X3VpbnQxNiAocERhdGEtPnBXb3Jrcm93KTsKKworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIH0KKyAgICAgIGNhc2UgMiA6IHsgICAgICAgICAgICAgICAgICAgICAgIC8qIHJnYiAqLworICAgICAgICAgICAgICAgICBpZiAocERhdGEtPmlCaXRkZXB0aCA8PSA4KQorICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgcERhdGEtPmlMZXZlbDAgPSAobW5nX3VpbnQxNikqcERhdGEtPnBXb3Jrcm93OworICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pTGV2ZWwxID0gKG1uZ191aW50MTYpKihwRGF0YS0+cFdvcmtyb3crMSk7CisgICAgICAgICAgICAgICAgICAgcERhdGEtPmlMZXZlbDIgPSAobW5nX3VpbnQxNikqKHBEYXRhLT5wV29ya3JvdysyKTsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICBwRGF0YS0+aUxldmVsMCA9IG1uZ19nZXRfdWludDE2IChwRGF0YS0+cFdvcmtyb3cpOworICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pTGV2ZWwxID0gbW5nX2dldF91aW50MTYgKHBEYXRhLT5wV29ya3JvdysyKTsKKyAgICAgICAgICAgICAgICAgICBwRGF0YS0+aUxldmVsMiA9IG1uZ19nZXRfdWludDE2IChwRGF0YS0+cFdvcmtyb3crNCk7CisgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIH0KKyAgICAgIGNhc2UgMyA6IHsgICAgICAgICAgICAgICAgICAgICAgIC8qIGluZGV4ZWQgKi8KKyAgICAgICAgICAgICAgICAgcERhdGEtPmlMZXZlbDAgPSAobW5nX3VpbnQxNikqcERhdGEtPnBXb3Jrcm93OworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIH0KKyAgICAgIGNhc2UgNCA6IHsgICAgICAgICAgICAgICAgICAgICAgIC8qIGdyYXkrYWxwaGEgKi8KKyAgICAgICAgICAgICAgICAgaWYgKHBEYXRhLT5pQml0ZGVwdGggPD0gOCkKKyAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pTGV2ZWwwID0gKG1uZ191aW50MTYpKnBEYXRhLT5wV29ya3JvdzsKKyAgICAgICAgICAgICAgICAgICBwRGF0YS0+aUxldmVsMSA9IChtbmdfdWludDE2KSoocERhdGEtPnBXb3Jrcm93KzEpOworICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pTGV2ZWwwID0gbW5nX2dldF91aW50MTYgKHBEYXRhLT5wV29ya3Jvdyk7CisgICAgICAgICAgICAgICAgICAgcERhdGEtPmlMZXZlbDEgPSBtbmdfZ2V0X3VpbnQxNiAocERhdGEtPnBXb3Jrcm93KzIpOworICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICB9CisgICAgICBjYXNlIDYgOiB7ICAgICAgICAgICAgICAgICAgICAgICAvKiByZ2IrYWxwaGEgKi8KKyAgICAgICAgICAgICAgICAgaWYgKHBEYXRhLT5pQml0ZGVwdGggPD0gOCkKKyAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pTGV2ZWwwID0gKG1uZ191aW50MTYpKnBEYXRhLT5wV29ya3JvdzsKKyAgICAgICAgICAgICAgICAgICBwRGF0YS0+aUxldmVsMSA9IChtbmdfdWludDE2KSoocERhdGEtPnBXb3Jrcm93KzEpOworICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pTGV2ZWwyID0gKG1uZ191aW50MTYpKihwRGF0YS0+cFdvcmtyb3crMik7CisgICAgICAgICAgICAgICAgICAgcERhdGEtPmlMZXZlbDMgPSAobW5nX3VpbnQxNikqKHBEYXRhLT5wV29ya3JvdyszKTsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICBwRGF0YS0+aUxldmVsMCA9IG1uZ19nZXRfdWludDE2IChwRGF0YS0+cFdvcmtyb3cpOworICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pTGV2ZWwxID0gbW5nX2dldF91aW50MTYgKHBEYXRhLT5wV29ya3JvdysyKTsKKyAgICAgICAgICAgICAgICAgICBwRGF0YS0+aUxldmVsMiA9IG1uZ19nZXRfdWludDE2IChwRGF0YS0+cFdvcmtyb3crNCk7CisgICAgICAgICAgICAgICAgICAgcERhdGEtPmlMZXZlbDMgPSBtbmdfZ2V0X3VpbnQxNiAocERhdGEtPnBXb3Jrcm93KzYpOworICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICB9CisgICAgfQorICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaGlmdCB0aGUgZW50aXJlIHJvdyBiYWNrIGluIHBsYWNlICovCisgIHBSYXdpID0gcERhdGEtPnBXb3Jrcm93ICsgcERhdGEtPmlGaWx0ZXJvZnM7CisgIHBSYXdvID0gcERhdGEtPnBXb3Jrcm93OworCisgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2l6ZSArIHBEYXRhLT5pUGl4ZWxvZnMgLSBwRGF0YS0+aUZpbHRlcm9mczsgaVgrKykKKyAgICAqcFJhd28rKyA9ICpwUmF3aSsrOworCisgIHBEYXRhLT5pRmlsdGVyb2ZzID0gMDsgICAgICAgICAgICAgICAvKiBpbmRpY2F0ZSBzbyAhICovCisKKyNpZmRlZiBGSUxURVIxOTMKKyAgaWYgKHBEYXRhLT5pRmlsdGVyID09IDB4QzEpICAgICAgICAgIC8qIG5vIGFkYXB0aXZlIGZpbHRlcmluZyA/ICovCisgICAgcERhdGEtPmlQaXhlbG9mcyA9IHBEYXRhLT5pRmlsdGVyb2ZzOworICBlbHNlCisjZW5kaWYKKyAgICBwRGF0YS0+aVBpeGVsb2ZzID0gcERhdGEtPmlGaWx0ZXJvZnMgKyAxOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfUk9XRElGRkVSSU5HLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX2RpZmZlcl9nMSAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfdWludDhwIHBSYXdpLCBwUmF3bzsKKyAgbW5nX2ludDMyICBpWDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ESUZGRVJfRzEsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAocERhdGEtPmlMZXZlbDAgJiAweDAxKSAgICAgICAgICAgLyogaXMgaXQgdW5ldmVuIGxldmVsID8gKi8KKyAgeworICAgIHBSYXdpID0gcERhdGEtPnBXb3Jrcm93ICsgcERhdGEtPmlQaXhlbG9mczsKKyAgICBwUmF3byA9IHBEYXRhLT5wUHJldnJvdyArIHBEYXRhLT5pUGl4ZWxvZnM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBqdXN0IGludmVydCBldmVyeSBiaXQgKi8KKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgICAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2l6ZSAtIDE7IGlYID49IDA7IGlYLS0pCisjZWxzZQorICAgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2l6ZTsgaVgrKykKKyNlbmRpZgorICAgICAgKnBSYXdvKysgPSAobW5nX3VpbnQ4KSh+KCpwUmF3aSsrKSk7CisKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RJRkZFUl9HMSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19kaWZmZXJfZzIgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX3VpbnQ4cCBwUmF3aSwgcFJhd287CisgIG1uZ19pbnQzMiAgaVg7CisgIG1uZ19pbnQzMiAgaUMsIGlTOworICBtbmdfdWludDggIGlCLCBpTiwgaVE7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRElGRkVSX0cyLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcFJhd2kgPSBwRGF0YS0+cFdvcmtyb3cgKyBwRGF0YS0+aVBpeGVsb2ZzOworICBwUmF3byA9IHBEYXRhLT5wUHJldnJvdyArIHBEYXRhLT5pUGl4ZWxvZnM7CisgIGlDICAgID0gMDsKKyAgaUIgICAgPSAwOworICBpTiAgICA9IDA7CisgIGlTICAgID0gMDsKKworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlcyAtIDE7IGlYID49IDA7IGlYLS0pCisjZWxzZQorICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgeworICAgIGlmICghaUMpCisgICAgeworICAgICAgaUMgPSA0OworICAgICAgaUIgPSAqcFJhd2krKzsKKyAgICAgIGlOID0gMDsKKyAgICAgIGlTID0gODsKKyAgICB9CisKKyAgICBpUyAtPSAyOworICAgIGlRID0gKG1uZ191aW50OCkoKChpQiA+PiBpUykgKyBwRGF0YS0+aUxldmVsMCkgJiAweDAzKTsKKyAgICBpTiA9IChtbmdfdWludDgpKChpTiA8PCAyKSArIGlRKTsKKyAgICBpQy0tOworCisgICAgaWYgKCFpQykKKyAgICAgICpwUmF3bysrID0gaU47CisKKyAgfQorCisgIGlmIChpQykKKyAgICAqcFJhd28gPSAobW5nX3VpbnQ4KShpTiA8PCBpUyk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRElGRkVSX0cyLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX2RpZmZlcl9nNCAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfdWludDhwIHBSYXdpLCBwUmF3bzsKKyAgbW5nX2ludDMyICBpWDsKKyAgbW5nX2ludDMyICBpQywgaVM7CisgIG1uZ191aW50OCAgaUIsIGlOLCBpUTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ESUZGRVJfRzQsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBwUmF3aSA9IHBEYXRhLT5wV29ya3JvdyArIHBEYXRhLT5pUGl4ZWxvZnM7CisgIHBSYXdvID0gcERhdGEtPnBQcmV2cm93ICsgcERhdGEtPmlQaXhlbG9mczsKKyAgaUMgICAgPSAwOworICBpQiAgICA9IDA7CisgIGlOICAgID0gMDsKKyAgaVMgICAgPSAwOworCisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzIC0gMTsgaVggPj0gMDsgaVgtLSkKKyNlbHNlCisgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICB7CisgICAgaWYgKCFpQykKKyAgICB7CisgICAgICBpQyA9IDI7CisgICAgICBpQiA9ICpwUmF3aSsrOworICAgICAgaU4gPSAwOworICAgICAgaVMgPSA4OworICAgIH0KKworICAgIGlTIC09IDQ7CisgICAgaVEgPSAobW5nX3VpbnQ4KSgoKGlCID4+IGlTKSArIHBEYXRhLT5pTGV2ZWwwKSAmIDB4MEYpOworICAgIGlOID0gKG1uZ191aW50OCkoKGlOIDw8IDQpICsgaVEpOworICAgIGlDLS07CisKKyAgICBpZiAoIWlDKQorICAgICAgKnBSYXdvKysgPSBpTjsKKworICB9CisKKyAgaWYgKGlDKQorICAgICpwUmF3byA9IChtbmdfdWludDgpKGlOIDw8IGlTKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ESUZGRVJfRzQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfZGlmZmVyX2c4IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ191aW50OHAgcFJhd2ksIHBSYXdvOworICBtbmdfaW50MzIgIGlYOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RJRkZFUl9HOCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBSYXdpID0gcERhdGEtPnBXb3Jrcm93ICsgcERhdGEtPmlQaXhlbG9mczsKKyAgcFJhd28gPSBwRGF0YS0+cFByZXZyb3cgKyBwRGF0YS0+aVBpeGVsb2ZzOworCisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzIC0gMTsgaVggPj0gMDsgaVgtLSkKKyNlbHNlCisgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICB7CisgICAgKnBSYXdvKysgPSAobW5nX3VpbnQ4KSgoKG1uZ191aW50MTYpKnBSYXdpICsgcERhdGEtPmlMZXZlbDApICYgMHhGRik7CisKKyAgICBwUmF3aSsrOworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRElGRkVSX0c4LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX2RpZmZlcl9nMTYgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX3VpbnQxNnAgcFJhd2ksIHBSYXdvOworICBtbmdfaW50MzIgICBpWDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ESUZGRVJfRzE2LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcFJhd2kgPSAobW5nX3VpbnQxNnApKHBEYXRhLT5wV29ya3JvdyArIHBEYXRhLT5pUGl4ZWxvZnMpOworICBwUmF3byA9IChtbmdfdWludDE2cCkocERhdGEtPnBQcmV2cm93ICsgcERhdGEtPmlQaXhlbG9mcyk7CisKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NhbXBsZXMgLSAxOyBpWCA+PSAwOyBpWC0tKQorI2Vsc2UKKyAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlSb3dzYW1wbGVzOyBpWCsrKQorI2VuZGlmCisgIHsKKyAgICAqcFJhd28rKyA9IChtbmdfdWludDE2KSgoKG1uZ191aW50MzIpKnBSYXdpICsgKG1uZ191aW50MzIpcERhdGEtPmlMZXZlbDApICYgMHhGRkZGKTsKKworICAgIHBSYXdpKys7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ESUZGRVJfRzE2LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX2RpZmZlcl9yZ2I4IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ191aW50OHAgcFJhd2ksIHBSYXdvOworICBtbmdfaW50MzIgIGlYOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RJRkZFUl9SR0I4LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcFJhd2kgPSBwRGF0YS0+cFdvcmtyb3cgKyBwRGF0YS0+aVBpeGVsb2ZzOworICBwUmF3byA9IHBEYXRhLT5wUHJldnJvdyArIHBEYXRhLT5pUGl4ZWxvZnM7CisKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NhbXBsZXMgLSAxOyBpWCA+PSAwOyBpWC0tKQorI2Vsc2UKKyAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlSb3dzYW1wbGVzOyBpWCsrKQorI2VuZGlmCisgIHsKKyAgICAqKHBSYXdvKzEpID0gKG1uZ191aW50OCkoKChtbmdfdWludDE2KSoocFJhd2krMSkgKyBwRGF0YS0+aUxldmVsMSkgJiAweEZGKTsKKyAgICAqcFJhd28gICAgID0gKG1uZ191aW50OCkoKChtbmdfdWludDE2KSpwUmF3aSAgICAgKyBwRGF0YS0+aUxldmVsMCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX3VpbnQxNikqKHBSYXdvKzEpKSAmIDB4RkYpOworICAgICoocFJhd28rMikgPSAobW5nX3VpbnQ4KSgoKG1uZ191aW50MTYpKihwUmF3aSsyKSArIHBEYXRhLT5pTGV2ZWwyICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfdWludDE2KSoocFJhd28rMSkpICYgMHhGRik7CisKKyAgICBwUmF3aSArPSAzOworICAgIHBSYXdvICs9IDM7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ESUZGRVJfUkdCOCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19kaWZmZXJfcmdiMTYgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX3VpbnQxNnAgcFJhd2ksIHBSYXdvOworICBtbmdfaW50MzIgICBpWDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ESUZGRVJfUkdCMTYsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBwUmF3aSA9IChtbmdfdWludDE2cCkocERhdGEtPnBXb3Jrcm93ICsgcERhdGEtPmlQaXhlbG9mcyk7CisgIHBSYXdvID0gKG1uZ191aW50MTZwKShwRGF0YS0+cFByZXZyb3cgKyBwRGF0YS0+aVBpeGVsb2ZzKTsKKworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlcyAtIDE7IGlYID49IDA7IGlYLS0pCisjZWxzZQorICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgeworICAgICoocFJhd28rMSkgPSAobW5nX3VpbnQxNikoKChtbmdfdWludDMyKSoocFJhd2krMSkgKyAobW5nX3VpbnQzMilwRGF0YS0+aUxldmVsMSkgJiAweEZGRkYpOworICAgICpwUmF3byAgICAgPSAobW5nX3VpbnQxNikoKChtbmdfdWludDMyKSpwUmF3aSAgICAgKyAobW5nX3VpbnQzMilwRGF0YS0+aUxldmVsMCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ191aW50MzIpKihwUmF3bysxKSkgJiAweEZGRkYpOworICAgICoocFJhd28rMikgPSAobW5nX3VpbnQxNikoKChtbmdfdWludDMyKSoocFJhd2krMikgKyAobW5nX3VpbnQzMilwRGF0YS0+aUxldmVsMiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ191aW50MzIpKihwUmF3bysxKSkgJiAweEZGRkYpOworCisgICAgcFJhd2kgKz0gMzsKKyAgICBwUmF3byArPSAzOworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRElGRkVSX1JHQjE2LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX2RpZmZlcl9pZHgxIChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ191aW50OHAgcFJhd2ksIHBSYXdvOworICBtbmdfaW50MzIgIGlYOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RJRkZFUl9JRFgxLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKHBEYXRhLT5pTGV2ZWwwICYgMHgwMSkgICAgICAgICAgIC8qIGlzIGl0IHVuZXZlbiBsZXZlbCA/ICovCisgIHsKKyAgICBwUmF3aSA9IHBEYXRhLT5wV29ya3JvdyArIHBEYXRhLT5pUGl4ZWxvZnM7CisgICAgcFJhd28gPSBwRGF0YS0+cFByZXZyb3cgKyBwRGF0YS0+aVBpeGVsb2ZzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoganVzdCBpbnZlcnQgZXZlcnkgYml0ICovCisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICAgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NpemUgLSAxOyBpWCA+PSAwOyBpWC0tKQorI2Vsc2UKKyAgICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NpemU7IGlYKyspCisjZW5kaWYKKyAgICAgICpwUmF3bysrID0gKG1uZ191aW50OCkofigqcFJhd2krKykpOworCisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ESUZGRVJfSURYMSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19kaWZmZXJfaWR4MiAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfdWludDhwIHBSYXdpLCBwUmF3bzsKKyAgbW5nX2ludDMyICBpWDsKKyAgbW5nX2ludDMyICBpQywgaVM7CisgIG1uZ191aW50OCAgaUIsIGlOLCBpUTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ESUZGRVJfSURYMiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBSYXdpID0gcERhdGEtPnBXb3Jrcm93ICsgcERhdGEtPmlQaXhlbG9mczsKKyAgcFJhd28gPSBwRGF0YS0+cFByZXZyb3cgKyBwRGF0YS0+aVBpeGVsb2ZzOworICBpQyAgICA9IDA7CisgIGlCICAgID0gMDsKKyAgaU4gICAgPSAwOworICBpUyAgICA9IDA7CisKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NhbXBsZXMgLSAxOyBpWCA+PSAwOyBpWC0tKQorI2Vsc2UKKyAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlSb3dzYW1wbGVzOyBpWCsrKQorI2VuZGlmCisgIHsKKyAgICBpZiAoIWlDKQorICAgIHsKKyAgICAgIGlDID0gNDsKKyAgICAgIGlCID0gKnBSYXdpKys7CisgICAgICBpTiA9IDA7CisgICAgICBpUyA9IDg7CisgICAgfQorCisgICAgaVMgLT0gMjsKKyAgICBpUSA9IChtbmdfdWludDgpKCgoaUIgPj4gaVMpICsgcERhdGEtPmlMZXZlbDApICYgMHgwMyk7CisgICAgaU4gPSAobW5nX3VpbnQ4KSgoaU4gPDwgMikgKyBpUSk7CisgICAgaUMtLTsKKworICAgIGlmICghaUMpCisgICAgICAqcFJhd28rKyA9IGlOOworCisgIH0KKworICBpZiAoaUMpCisgICAgKnBSYXdvID0gKG1uZ191aW50OCkoaU4gPDwgaVMpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RJRkZFUl9JRFgyLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX2RpZmZlcl9pZHg0IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ191aW50OHAgcFJhd2ksIHBSYXdvOworICBtbmdfaW50MzIgIGlYOworICBtbmdfaW50MzIgIGlDLCBpUzsKKyAgbW5nX3VpbnQ4ICBpQiwgaU4sIGlROworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RJRkZFUl9JRFg0LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcFJhd2kgPSBwRGF0YS0+cFdvcmtyb3cgKyBwRGF0YS0+aVBpeGVsb2ZzOworICBwUmF3byA9IHBEYXRhLT5wUHJldnJvdyArIHBEYXRhLT5pUGl4ZWxvZnM7CisgIGlDICAgID0gMDsKKyAgaUIgICAgPSAwOworICBpTiAgICA9IDA7CisgIGlTICAgID0gMDsKKworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlcyAtIDE7IGlYID49IDA7IGlYLS0pCisjZWxzZQorICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgeworICAgIGlmICghaUMpCisgICAgeworICAgICAgaUMgPSAyOworICAgICAgaUIgPSAqcFJhd2krKzsKKyAgICAgIGlOID0gMDsKKyAgICAgIGlTID0gODsKKyAgICB9CisKKyAgICBpUyAtPSA0OworICAgIGlRID0gKG1uZ191aW50OCkoKChpQiA+PiBpUykgKyBwRGF0YS0+aUxldmVsMCkgJiAweDBGKTsKKyAgICBpTiA9IChtbmdfdWludDgpKChpTiA8PCA0KSArIGlRKTsKKyAgICBpQy0tOworCisgICAgaWYgKCFpQykKKyAgICAgICpwUmF3bysrID0gaU47CisKKyAgfQorCisgIGlmIChpQykKKyAgICAqcFJhd28gPSAobW5nX3VpbnQ4KShpTiA8PCBpUyk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRElGRkVSX0lEWDQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfZGlmZmVyX2lkeDggKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX3VpbnQ4cCBwUmF3aSwgcFJhd287CisgIG1uZ19pbnQzMiAgaVg7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRElGRkVSX0lEWDgsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBwUmF3aSA9IHBEYXRhLT5wV29ya3JvdyArIHBEYXRhLT5pUGl4ZWxvZnM7CisgIHBSYXdvID0gcERhdGEtPnBQcmV2cm93ICsgcERhdGEtPmlQaXhlbG9mczsKKworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlcyAtIDE7IGlYID49IDA7IGlYLS0pCisjZWxzZQorICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgeworICAgICpwUmF3bysrID0gKG1uZ191aW50OCkoKChtbmdfdWludDE2KSpwUmF3aSArIHBEYXRhLT5pTGV2ZWwwKSAmIDB4RkYpOworCisgICAgcFJhd2krKzsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RJRkZFUl9JRFg4LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX2RpZmZlcl9nYTggKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX3VpbnQ4cCBwUmF3aSwgcFJhd287CisgIG1uZ19pbnQzMiAgaVg7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRElGRkVSX0dBOCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBSYXdpID0gcERhdGEtPnBXb3Jrcm93ICsgcERhdGEtPmlQaXhlbG9mczsKKyAgcFJhd28gPSBwRGF0YS0+cFByZXZyb3cgKyBwRGF0YS0+aVBpeGVsb2ZzOworCisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzIC0gMTsgaVggPj0gMDsgaVgtLSkKKyNlbHNlCisgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICB7CisgICAgKnBSYXdvICAgICA9IChtbmdfdWludDgpKCgobW5nX3VpbnQxNikqcFJhd2kgICAgICsgcERhdGEtPmlMZXZlbDApICYgMHhGRik7CisgICAgKihwUmF3bysxKSA9IChtbmdfdWludDgpKCgobW5nX3VpbnQxNikqKHBSYXdpKzEpICsgcERhdGEtPmlMZXZlbDEpICYgMHhGRik7CisKKyAgICBwUmF3aSArPSAyOworICAgIHBSYXdvICs9IDI7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ESUZGRVJfR0E4LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX2RpZmZlcl9nYTE2IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ191aW50MTZwIHBSYXdpLCBwUmF3bzsKKyAgbW5nX2ludDMyICAgaVg7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRElGRkVSX0dBMTYsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBwUmF3aSA9IChtbmdfdWludDE2cCkocERhdGEtPnBXb3Jrcm93ICsgcERhdGEtPmlQaXhlbG9mcyk7CisgIHBSYXdvID0gKG1uZ191aW50MTZwKShwRGF0YS0+cFByZXZyb3cgKyBwRGF0YS0+aVBpeGVsb2ZzKTsKKworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlcyAtIDE7IGlYID49IDA7IGlYLS0pCisjZWxzZQorICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgeworICAgICpwUmF3byAgICAgPSAobW5nX3VpbnQxNikoKChtbmdfdWludDMyKSpwUmF3aSAgICAgKyAobW5nX3VpbnQzMilwRGF0YS0+aUxldmVsMCkgJiAweEZGRkYpOworICAgICoocFJhd28rMSkgPSAobW5nX3VpbnQxNikoKChtbmdfdWludDMyKSoocFJhd2krMSkgKyAobW5nX3VpbnQzMilwRGF0YS0+aUxldmVsMSkgJiAweEZGRkYpOworCisgICAgcFJhd2kgKz0gMjsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RJRkZFUl9HQTE2LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX2RpZmZlcl9yZ2JhOCAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfdWludDhwIHBSYXdpLCBwUmF3bzsKKyAgbW5nX2ludDMyICBpWDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ESUZGRVJfUkdCQTgsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBwUmF3aSA9IHBEYXRhLT5wV29ya3JvdyArIHBEYXRhLT5pUGl4ZWxvZnM7CisgIHBSYXdvID0gcERhdGEtPnBQcmV2cm93ICsgcERhdGEtPmlQaXhlbG9mczsKKworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlcyAtIDE7IGlYID49IDA7IGlYLS0pCisjZWxzZQorICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgeworICAgICoocFJhd28rMSkgPSAobW5nX3VpbnQ4KSgoKG1uZ191aW50MTYpKihwUmF3aSsxKSArIHBEYXRhLT5pTGV2ZWwxKSAmIDB4RkYpOworICAgICpwUmF3byAgICAgPSAobW5nX3VpbnQ4KSgoKG1uZ191aW50MTYpKnBSYXdpICAgICArIHBEYXRhLT5pTGV2ZWwwICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfdWludDE2KSoocFJhd28rMSkpICYgMHhGRik7CisgICAgKihwUmF3bysyKSA9IChtbmdfdWludDgpKCgobW5nX3VpbnQxNikqKHBSYXdpKzIpICsgcERhdGEtPmlMZXZlbDIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ191aW50MTYpKihwUmF3bysxKSkgJiAweEZGKTsKKyAgICAqKHBSYXdvKzMpID0gKG1uZ191aW50OCkoKChtbmdfdWludDE2KSoocFJhd2krMykgKyBwRGF0YS0+aUxldmVsMykgJiAweEZGKTsKKworICAgIHBSYXdpICs9IDQ7CisgICAgcFJhd28gKz0gNDsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RJRkZFUl9SR0JBOCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19kaWZmZXJfcmdiYTE2IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ191aW50MTZwIHBSYXdpLCBwUmF3bzsKKyAgbW5nX2ludDMyICAgaVg7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRElGRkVSX1JHQkExNiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBSYXdpID0gKG1uZ191aW50MTZwKShwRGF0YS0+cFdvcmtyb3cgKyBwRGF0YS0+aVBpeGVsb2ZzKTsKKyAgcFJhd28gPSAobW5nX3VpbnQxNnApKHBEYXRhLT5wUHJldnJvdyArIHBEYXRhLT5pUGl4ZWxvZnMpOworCisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzIC0gMTsgaVggPj0gMDsgaVgtLSkKKyNlbHNlCisgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICB7CisgICAgKihwUmF3bysxKSA9IChtbmdfdWludDE2KSgoKG1uZ191aW50MzIpKihwUmF3aSsxKSArIChtbmdfdWludDMyKXBEYXRhLT5pTGV2ZWwxKSAmIDB4RkZGRik7CisgICAgKnBSYXdvICAgICA9IChtbmdfdWludDE2KSgoKG1uZ191aW50MzIpKnBSYXdpICAgICArIChtbmdfdWludDMyKXBEYXRhLT5pTGV2ZWwwICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX3VpbnQzMikqKHBSYXdvKzEpKSAmIDB4RkZGRik7CisgICAgKihwUmF3bysyKSA9IChtbmdfdWludDE2KSgoKG1uZ191aW50MzIpKihwUmF3aSsyKSArIChtbmdfdWludDMyKXBEYXRhLT5pTGV2ZWwyICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX3VpbnQzMikqKHBSYXdvKzEpKSAmIDB4RkZGRik7CisgICAgKihwUmF3byszKSA9IChtbmdfdWludDE2KSgoKG1uZ191aW50MzIpKihwUmF3aSszKSArIChtbmdfdWludDMyKXBEYXRhLT5pTGV2ZWwzKSAmIDB4RkZGRik7CisKKyAgICBwUmF3aSArPSA0OworICAgIHBSYXdvICs9IDQ7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ESUZGRVJfUkdCQTE2LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2VuZGlmIC8qIEZJTFRFUjE5MiAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjZW5kaWYgLyogTU5HX0lOQ0xVREVfRklMVEVSUyAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiBlbmQgb2YgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9MaWJNTkcvbGlibW5nX2ZpbHRlci5oIGIvZmlsZXMvU291cmNlL0xpYk1ORy9saWJtbmdfZmlsdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFjOWM3ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9MaWJNTkcvbGlibW5nX2ZpbHRlci5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBsaWJtbmcuaCAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBwcm9qZWN0ICAgOiBsaWJtbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogZmlsZSAgICAgIDogbGlibW5nX2ZpbHRlci5oICAgICAgICAgICBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBHLkp1eW4gICAqICovCisvKiAqIHZlcnNpb24gICA6IDEuMC41ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogcHVycG9zZSAgIDogRmlsdGVyaW5nIHJvdXRpbmVzIChkZWZpbml0aW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBhdXRob3IgICAgOiBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGNvbW1lbnQgICA6IERlZmluaXRpb24gb2YgdGhlIGZpbHRlcmluZyByb3V0aW5lcyAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogY2hhbmdlcyAgIDogMC41LjEgLSAwNS8wOC8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2hhbmdlZCBzdHJpY3QtQU5TSSBzdHVmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjIgLSAwOC8wNS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2hhbmdlZCBmaWxlLXByZWZpeGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjMgLSAwOS8wNy8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgc3VwcG9ydCBmb3IgbmV3IGZpbHRlcl90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAwOC8xOS8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gQjU5NzEzNCAtIGxpYm1uZyBwb2xsdXRlcyB0aGUgbGlua2VyIG5hbWVzcGFjZSAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZiBkZWZpbmVkKF9fQk9STEFORENfXykgJiYgZGVmaW5lZChNTkdfU1RSSUNUX0FOU0kpCisjcHJhZ21hIG9wdGlvbiAtQSAgICAgICAgICAgICAgICAgICAgICAvKiBmb3JjZSBBTlNJLUMgKi8KKyNlbmRpZgorCisjaWZuZGVmIF9saWJtbmdfZmlsdGVyX2hfCisjZGVmaW5lIF9saWJtbmdfZmlsdGVyX2hfCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19maWx0ZXJfYV9yb3cgICAgICAgICAobW5nX2RhdGFwIHBEYXRhKTsKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIEZJTFRFUjE5MgorbW5nX3JldGNvZGUgbW5nX2luaXRfcm93ZGlmZmVyaW5nICAgIChtbmdfZGF0YXAgcERhdGEpOworCittbmdfcmV0Y29kZSBtbmdfZGlmZmVyX2cxICAgICAgICAgICAgKG1uZ19kYXRhcCBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfZGlmZmVyX2cyICAgICAgICAgICAgKG1uZ19kYXRhcCBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfZGlmZmVyX2c0ICAgICAgICAgICAgKG1uZ19kYXRhcCBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfZGlmZmVyX2c4ICAgICAgICAgICAgKG1uZ19kYXRhcCBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfZGlmZmVyX2cxNiAgICAgICAgICAgKG1uZ19kYXRhcCBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfZGlmZmVyX3JnYjggICAgICAgICAgKG1uZ19kYXRhcCBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfZGlmZmVyX3JnYjE2ICAgICAgICAgKG1uZ19kYXRhcCBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfZGlmZmVyX2lkeDEgICAgICAgICAgKG1uZ19kYXRhcCBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfZGlmZmVyX2lkeDIgICAgICAgICAgKG1uZ19kYXRhcCBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfZGlmZmVyX2lkeDQgICAgICAgICAgKG1uZ19kYXRhcCBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfZGlmZmVyX2lkeDggICAgICAgICAgKG1uZ19kYXRhcCBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfZGlmZmVyX2dhOCAgICAgICAgICAgKG1uZ19kYXRhcCBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfZGlmZmVyX2dhMTYgICAgICAgICAgKG1uZ19kYXRhcCBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfZGlmZmVyX3JnYmE4ICAgICAgICAgKG1uZ19kYXRhcCBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfZGlmZmVyX3JnYmExNiAgICAgICAgKG1uZ19kYXRhcCBwRGF0YSk7CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2VuZGlmIC8qIF9saWJtbmdfZmlsdGVyX2hfICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqIGVuZCBvZiBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9MaWJNTkcvbGlibW5nX2hsYXBpLmMgYi9maWxlcy9Tb3VyY2UvTGliTU5HL2xpYm1uZ19obGFwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxOTlkNTkKLS0tIC9kZXYvbnVsbAorKysgYi9maWxlcy9Tb3VyY2UvTGliTU5HL2xpYm1uZ19obGFwaS5jCkBAIC0wLDAgKzEsMjk5NSBAQAorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIGxpYm1uZy5oICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIHByb2plY3QgICA6IGxpYm1uZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBmaWxlICAgICAgOiBsaWJtbmdfaGxhcGkuYyAgICAgICAgICAgIGNvcHlyaWdodCAoYykgMjAwMC0yMDA3IEcuSnV5biAgICogKi8KKy8qICogdmVyc2lvbiAgIDogMS4wLjEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBwdXJwb3NlICAgOiBoaWdoLWxldmVsIGFwcGxpY2F0aW9uIEFQSSAoaW1wbGVtZW50YXRpb24pICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGF1dGhvciAgICA6IEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogY29tbWVudCAgIDogaW1wbGVtZW50YXRpb24gb2YgdGhlIGhpZ2gtbGV2ZWwgZnVuY3Rpb24gaW50ZXJmYWNlICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIGZvciBhcHBsaWNhdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogY2hhbmdlcyAgIDogMC41LjEgLSAwNS8wNi8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgaW5pdCBvZiBpUExURWNvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMSAtIDA1LzA4LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjaGFuZ2VkIGNhbGxpbmctY29udmVudGlvbiBkZWZpbml0aW9uICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2hhbmdlZCBzdGF0dXMtaGFuZGxpbmcgb2YgZGlzcGxheS1yb3V0aW5lcyAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHZlcnNpb25pbmctY29udHJvbCByb3V0aW5lcyAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaWxsZWQgdGhlIHdyaXRlIHJvdXRpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2hhbmdlZCBzdHJpY3QtQU5TSSBzdHVmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMSAtIDA1LzExLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBjYWxsYmFjayBlcnJvci1yZXBvcnRpbmcgc3VwcG9ydCAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4xIC0gMDUvMTIvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNoYW5nZWQgdHJhY2UgdG8gbWFjcm8gZm9yIGNhbGxiYWNrIGVycm9yLXJlcG9ydGluZyAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjEgLSAwNS8xMy8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgZU1OR21hIGhhY2sgKHdpbGwgYmUgcmVtb3ZlZCBpbiAxLjAuMCAhISEpICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIFRFUk0gYW5pbWF0aW9uIG9iamVjdCBwb2ludGVyIChlYXNpZXIgcmVmZXJlbmNlKSAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjEgLSAwNS8xNC8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgY2xlYW51cCBvZiBzYXZlZC1kYXRhIChTQVZFL1NFRUsgcHJvY2Vzc2luZykgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMSAtIDA1LzE2LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBtb3ZlZCB0aGUgYWN0dWFsIHdyaXRlX2dyYXBoaWMgZnVuY3Rpb25hbGl0eSBmcm9tIGhlcmUgICAqICovCisvKiAqICAgICAgICAgICAgICAgdG8gaXRzIGFwcHJvcHJpYXRlIGZ1bmN0aW9uIGluIHRoZSBtbmdfd3JpdGUgbW9kdWxlICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjIgLSAwNS8xOS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2xlYW5lZCB1cCBzb21lIGNvZGUgcmVnYXJkaW5nIG1peGVkIHN1cHBvcnQgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIEpORyBzdXBwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjIgLSAwNS8yNC8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gbW92ZWQgaW5pdCBvZiBkZWZhdWx0IHpsaWIgcGFybXMgaGVyZSBmcm9tICJtbmdfemxpYi5jIiAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGluaXQgb2YgZGVmYXVsdCBJSkcgcGFybXMgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjIgLSAwNS8yOS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgaW5jb25zaXN0YW5jeSB3aXRoIGZyZWVpbmcgZ2xvYmFsIGlDQ1AgcHJvZmlsZSAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMiAtIDA1LzMwLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBkZWx0YS1pbWFnZSBmaWVsZCBpbml0aWFsaXphdGlvbiAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4yIC0gMDYvMDYvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGluaXRpYWxpemF0aW9uIG9mIHRoZSBidWZmZXItc3VzcGVuZCBwYXJhbWV0ZXIgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4zIC0gMDYvMTYvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGluaXRpYWxpemF0aW9uIG9mIHVwZGF0ZS1yZWdpb24gZm9yIHJlZnJlc2ggICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBpbml0aWFsaXphdGlvbiBvZiBOZWVkcmVmcmVzaCBwYXJhbWV0ZXIgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4zIC0gMDYvMTcvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGluaXRpYWxpemF0aW9uIG9mIERlbHRhaW1tZWRpYXRlICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjMgLSAwNi8yMS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgaW5pdGlhbGl6YXRpb24gb2YgU3BlZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGluaXRpYWxpemF0aW9uIG9mIEltYWdlbGV2ZWwgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjMgLSAwNi8yNi8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2hhbmdlZCB1c2VyZGF0YSB2YXJpYWJsZSB0byBtbmdfcHRyICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMyAtIDA2LzI5LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaXhlZCBpbml0aWFsaXphdGlvbiByb3V0aW5lIGZvciBuZXcgbW5nX2hhbmRsZSB0eXBlICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMSAtIDA3LzA2LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjaGFuZ2VkIG1uZ19kaXNwbGF5X3Jlc3VtZSB0byBhbGxvdyB0byBiZSBjYWxsZWQgYWZ0ZXIgICAqICovCisvKiAqICAgICAgICAgICAgICAgYSBzdXNwZW5zaW9uIHJldHVybiB3aXRoIE1OR19ORUVETU9SRURBVEEgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHJldHVybmNvZGUgTU5HX05FRURUSU1FUldBSVQgZm9yIHRpbWVyIGJyZWFrcyAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjEgLSAwNy8wNy8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gaW1wbGVtZW50ZWQgc3VwcG9ydCBmb3IgZnJlZXplL3Jlc2V0L3Jlc3VtZSAmIGdvX3h4eHggICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMSAtIDA3LzA4LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBzdXBwb3J0IGZvciBpbXByb3ZlZCB0aW1pbmcgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgc3VwcG9ydCBmb3IgaW1wcm92ZWQgSS9PLXN1c3BlbnNpb24gICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMSAtIDA3LzE0LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjaGFuZ2VkIEVPRiBwcm9jZXNzaW5nIGJlaGF2aW9yICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4xIC0gMDcvMTUvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGNhbGxiYWNrcyBmb3IgU0FWRS9TRUVLIHByb2Nlc3NpbmcgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCB2YXJpYWJsZSBmb3IgTkVFRFNFQ1RJT05XQUlUIGJyZWFrcyAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgdmFyaWFibGUgZm9yIGZyZWV6ZSAmIHJlc2V0IHByb2Nlc3NpbmcgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMSAtIDA3LzE3LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBlcnJvciBjbGVhbnVwIHByb2Nlc3NpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgc3VwcG9ydCBmb3IgbW5nX2Rpc3BsYXlfcmVzZXQoKSAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIHN1c3BlbnNpb24tYnVmZmVyaW5nIGZvciAzMksrIGNodW5rcyAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4yIC0gMDcvMjkvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIHNtYWxsIGJ1Z3MgaW4gZGlzcGxheSBwcm9jZXNzaW5nICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjIgLSAwNy8zMS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgd3JhcHBpbmcgb2Ygc3VzcGVuc2lvbiBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMiAtIDA4LzA0LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBCMTExMDk2IC0gZml4ZWQgbGFyZ2UtYnVmZmVyIHJlYWQtc3VzcGVuc2lvbiAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4yIC0gMDgvMDUvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNoYW5nZWQgZmlsZS1wcmVmaXhlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4zIC0gMDkvMDcvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHN1cHBvcnQgZm9yIG5ldyBmaWx0ZXJfdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjMgLSAwOS8xMC8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgREVGSSBiZWhhdmlvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMyAtIDEwLzExLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBzdXBwb3J0IGZvciBuRUVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4zIC0gMTAvMTYvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIG9wdGlvbmFsIHN1cHBvcnQgZm9yIGJLR0QgZm9yIFBORyBpbWFnZXMgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSByYWlzZWQgaW5pdGlhbCBtYXhpbXVtIGNhbnZhcyBzaXplICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgc3VwcG9ydCBmb3IgSkRBQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMyAtIDEwLzE3LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBjYWxsYmFjayB0byBwcm9jZXNzIG5vbi1jcml0aWNhbCB1bmtub3duIGNodW5rcyAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgc3VwcG9ydCBmb3IgZGVsdGEtaW1hZ2VzIGR1cmluZyByZWFkKCkgLyBkaXNwbGF5KCkgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMyAtIDEwLzE4LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBjbG9zZXN0cmVhbSgpIHByb2Nlc3NpbmcgZm9yIG1uZ19jbGVhbnVwKCkgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4zIC0gMTAvMjcvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIHNlcGFyYXRlIHJlYWQoKSAmIGRpc3BsYXkoKSBwcm9jZXNzaW5nICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS40IC0gMTEvMjAvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIHVud2FudGVkIHJlcGV0aXRpb24gaW4gbW5nX3JlYWRkaXNwbGF5KCkgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjQgLSAxMS8yNC8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gbW92ZWQgcmVzdG9yZSBvZiBvYmplY3QgMCB0byBsaWJtbmdfZGlzcGxheSAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjEgLSAwMi8wOC8yMDAxIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgTUVORCBwcm9jZXNzaW5nIGNhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuMSAtIDAyLzEzLzIwMDEgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaXhlZCBmaXJzdCBGUkFNX01PREU9NCB0aW1pbmcgcHJvYmxlbSAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC4xIC0gMDQvMjEvMjAwMSAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIGJ1ZyB3aXRoIGRpc3BsYXlfcmVzZXQvZGlzcGxheV9yZXN1bWUgKFRoYW5rcyBHISkgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjEgLSAwNC8yMi8yMDAxIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgbWVtb3J5LWxlYWsgKFRoYW5rcyBHcmVnZyEpICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuMSAtIDA0LzIzLzIwMDEgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaXhlZCByZXNldF9ydW5kYXRhIHRvIGRyb3AgYWxsIG9iamVjdHMgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC4xIC0gMDQvMjUvMjAwMSAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIG1vdmVkIG1uZ19jbGVhcl9jbXMgdG8gbGlibW5nX2NtcyAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC4yIC0gMDYvMjMvMjAwMSAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIG9wdGltaXphdGlvbiBvcHRpb24gZm9yIE1ORy12aWRlbyBwbGF5YmFjayAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBwcm9jZXNzdGVybSBjYWxsYmFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC4yIC0gMDYvMjUvMjAwMSAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIG9wdGlvbiB0byB0dXJuIG9mZiBwcm9ncmVzc2l2ZSByZWZyZXNoICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC41IC0gMDcvMDgvMjAwMiAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIEI1Nzg1NzIgLSByZW1vdmVkIGVNTkdtYSBoYWNrICh0aGFua3MgRGltaXRyaSEpICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAwNy8xNi8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gQjU4MTYyNSAtIGxhcmdlIGNodW5rcyBmYWlsIHdpdGggc3VzcGVuc2lvbiByZWFkcyAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDA4LzE5LzIwMDIgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBCNTk3MTM0IC0gbGlibW5nIHBvbGx1dGVzIHRoZSBsaW5rZXIgbmFtZXNwYWNlICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC41IC0gMDkvMTUvMjAwMiAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIExPT1AgaXRlcmF0aW9uPTAgc3BlY2lhbCBjYXNlICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAxMC8wNy8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgYW5vdGhlciBmaXggZm9yIG1pc3BsYWNlZCBURVJNIGNodW5rICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNvbXBsZXRlZCBzdXBwb3J0IGZvciBjb25kaXRpb249MiBpbiBURVJNIGNodW5rICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBiZXRhIHZlcnNpb24gZnVuY3Rpb24gJiBjb25zdGFudCAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC41IC0gMTAvMTEvMjAwMiAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIG1uZ19zdGF0dXNfZHluYW1pYyB0byBzdXBwb3J0cyBmdW5jdGlvbiAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAxMS8wNC8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2hhbmdlZCBGUkFNRUNPVU5UL0xBWUVSQ09VTlQvUExBWVRJTUUgZXJyb3IgdG8gd2FybmluZyAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDExLzA3LzIwMDIgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBzdXBwb3J0IHRvIGdldCB0b3RhbHMgYWZ0ZXIgbW5nX3JlYWQoKSAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC41IC0gMTEvMjkvMjAwMiAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIGdveHh4eHgoKSBzdXBwb3J0IGZvciB6ZXJvIHZhbHVlcyAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC42IC0gMDUvMjUvMjAwMyAtIEcuUi1QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIE1OR19TS0lQQ0hVTktfY0hOSyBmb290cHJpbnQgb3B0aW1pemF0aW9ucyAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjYgLSAwNy8xMS8yMDAzIC0gRy5SLVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgY29uZGl0aW9uYWxzIHpsaWIgYW5kIGpwZWcgcHJvcGVydHkgYWNjZXNzb3JzICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNiAtIDA3LzE0LzIwMDMgLSBHLlItUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBjb25kaXRpb25hbHMgYXJvdW5kICJtbmdfZGlzcGxheV9nbyoiIGFuZCBvdGhlciAgICAqICovCisvKiAqICAgICAgICAgICAgICAgdW51c2VkIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNiAtIDA3LzI5LzIwMDMgLSBHLlItUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBjb25kaXRpb25hbHMgYXJvdW5kIFBBU1QgY2h1bmsgc3VwcG9ydCAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNyAtIDAzLzA3LzIwMDQgLSBHLiBSYW5kZXJzLVBlaHJzb24gICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBwdXQgZ2FtbWEsIGNtcy1yZWxhdGVkIGRlY2xhcmF0aW9ucyBpbnNpZGUgI2lmZGVmICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC43IC0gMDMvMTAvMjAwNCAtIEcuUi1QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGNvbmRpdGlvbmFscyBhcm91bmQgb3BlbnN0cmVhbS9jbG9zZXN0cmVhbSAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjcgLSAwMy8yNC8yMDA0IC0gRy5SLVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgelRYVCAtPiB6VFh0IHR5cG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjggLSAwNC8wMi8yMDA0IC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgQ1JDIGV4aXN0ZW5jZSAmIGNoZWNraW5nIGZsYWdzICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuOCAtIDA0LzEwLzIwMDQgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBkYXRhLXB1c2ggbWVjaGFuaXNtcyBmb3Igc3BlY2lhbGl6ZWQgZGVjb2RlcnMgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC44IC0gMDcvMDYvMjAwNCAtIEcuUi1QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGRlZmVuZCBhZ2FpbnN0IHVzaW5nIHVuZGVmaW5lZCBvcGVuc3RyZWFtIGZ1bmN0aW9uICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjggLSAwOC8wMi8yMDA0IC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgY29uZGl0aW9uYWwgdG8gYWxsb3cgZWFzaWVyIHdyaXRpbmcgb2YgbGFyZ2UgTU5HJ3MgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjkgLSAwOC8xNy8yMDA0IC0gRy5SLVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgbW9yZSBTS0lQQ0hVTksgY29uZGl0aW9uYWxzICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuOSAtIDA5LzI1LzIwMDQgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSByZXBsYWNlZCBNTkdfVFdFQUtfTEFSR0VfRklMRVMgd2l0aCBwZXJtYW5lbnQgc29sdXRpb24gICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC45IC0gMTAvMDMvMjAwNCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGZ1bmN0aW9uIHRvIHJldHJpZXZlIGN1cnJlbnQgRlJBTSBkZWxheSAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjkgLSAxMi8yMC8yMDA0IC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2xlYW5lZCB1cCBtYWNyby1pbnZvY2F0aW9ucyAodGhhbmtzIHRvIEQuIEFpcmxpZSkgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjEwIC0gMDcvMDYvMjAwNSAtIEcuUi1QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgbW9yZSBTS0lQQ0hVTksgY29uZGl0aW9uYWxzICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuMTAgLSAwNC8wOC8yMDA3IC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBzdXBwb3J0IGZvciBtUE5HIHByb3Bvc2FsICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC4xMCAtIDA0LzEyLzIwMDcgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHN1cHBvcnQgZm9yIEFORyBwcm9wb3NhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjEwIC0gMDcvMDYvMjAwNyAtIEcuUi1QIGJ1Z2ZpeCBieSBMdWNhcyBRdWludGFuYSAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2luY2x1ZGUgImxpYm1uZy5oIgorI2luY2x1ZGUgImxpYm1uZ19kYXRhLmgiCisjaW5jbHVkZSAibGlibW5nX2Vycm9yLmgiCisjaW5jbHVkZSAibGlibW5nX3RyYWNlLmgiCisjaWZkZWYgX19CT1JMQU5EQ19fCisjcHJhZ21hIGhkcnN0b3AKKyNlbmRpZgorI2luY2x1ZGUgImxpYm1uZ19vYmplY3RzLmgiCisjaW5jbHVkZSAibGlibW5nX29iamVjdF9wcmMuaCIKKyNpbmNsdWRlICJsaWJtbmdfY2h1bmtzLmgiCisjaW5jbHVkZSAibGlibW5nX21lbW9yeS5oIgorI2luY2x1ZGUgImxpYm1uZ19yZWFkLmgiCisjaW5jbHVkZSAibGlibW5nX3dyaXRlLmgiCisjaW5jbHVkZSAibGlibW5nX2Rpc3BsYXkuaCIKKyNpbmNsdWRlICJsaWJtbmdfemxpYi5oIgorI2luY2x1ZGUgImxpYm1uZ19qcGVnLmgiCisjaW5jbHVkZSAibGlibW5nX2Ntcy5oIgorI2luY2x1ZGUgImxpYm1uZ19waXhlbHMuaCIKKworI2lmIGRlZmluZWQoX19CT1JMQU5EQ19fKSAmJiBkZWZpbmVkKE1OR19TVFJJQ1RfQU5TSSkKKyNwcmFnbWEgb3B0aW9uIC1BICAgICAgICAgICAgICAgICAgICAgIC8qIGZvcmNlIEFOU0ktQyAqLworI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBsb2NhbCByb3V0aW5lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorTU5HX0xPQ0FMIG1uZ19yZXRjb2RlIG1uZ19kcm9wX29iamVjdHMgKG1uZ19kYXRhcCBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfYm9vbCAgYkRyb3BhbmlvYmopCit7CisgIG1uZ19vYmplY3RwICAgICAgIHBPYmplY3Q7CisgIG1uZ19vYmplY3RwICAgICAgIHBOZXh0OworICBtbmdfY2xlYW51cG9iamVjdCBmQ2xlYW51cDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9EUk9QX09CSkVDVFMsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBwT2JqZWN0ID0gcERhdGEtPnBGaXJzdGltZ29iajsgICAgICAgLyogZ2V0IGZpcnN0IHN0b3JlZCBpbWFnZS1vYmplY3QgKGlmIGFueSkgKi8KKworICB3aGlsZSAocE9iamVjdCkgICAgICAgICAgICAgICAgICAgICAgLyogbW9yZSBvYmplY3RzIHRvIGRpc2NhcmQgPyAqLworICB7CisgICAgcE5leHQgPSAoKG1uZ19vYmplY3RfaGVhZGVycClwT2JqZWN0KS0+cE5leHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjYWxsIGFwcHJvcHJpYXRlIGNsZWFudXAgKi8KKyAgICBmQ2xlYW51cCA9ICgobW5nX29iamVjdF9oZWFkZXJwKXBPYmplY3QpLT5mQ2xlYW51cDsKKyAgICBmQ2xlYW51cCAocERhdGEsIHBPYmplY3QpOworCisgICAgcE9iamVjdCA9IHBOZXh0OyAgICAgICAgICAgICAgICAgICAvKiBuZWVlZXh0ICovCisgIH0KKworICBwRGF0YS0+cEZpcnN0aW1nb2JqID0gTU5HX05VTEw7ICAgICAgLyogY2xlYW4gdGhpcyB1cCEhISAqLworICBwRGF0YS0+cExhc3RpbWdvYmogID0gTU5HX05VTEw7CisKKyAgaWYgKGJEcm9wYW5pb2JqKSAgICAgICAgICAgICAgICAgICAgIC8qIGRyb3AgYW5pbWF0aW9uIG9iamVjdHMgPyAqLworICB7CisgICAgcE9iamVjdCA9IHBEYXRhLT5wRmlyc3RhbmlvYmo7ICAgICAvKiBnZXQgZmlyc3Qgc3RvcmVkIGFuaW1hdGlvbi1vYmplY3QgKGlmIGFueSkgKi8KKworICAgIHdoaWxlIChwT2JqZWN0KSAgICAgICAgICAgICAgICAgICAgLyogbW9yZSBvYmplY3RzIHRvIGRpc2NhcmQgPyAqLworICAgIHsKKyAgICAgIHBOZXh0ID0gKChtbmdfb2JqZWN0X2hlYWRlcnApcE9iamVjdCktPnBOZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2FsbCBhcHByb3ByaWF0ZSBjbGVhbnVwICovCisgICAgICBmQ2xlYW51cCA9ICgobW5nX29iamVjdF9oZWFkZXJwKXBPYmplY3QpLT5mQ2xlYW51cDsKKyAgICAgIGZDbGVhbnVwIChwRGF0YSwgcE9iamVjdCk7CisKKyAgICAgIHBPYmplY3QgPSBwTmV4dDsgICAgICAgICAgICAgICAgIC8qIG5lZWVleHQgKi8KKyAgICB9CisKKyAgICBwRGF0YS0+cEZpcnN0YW5pb2JqID0gTU5HX05VTEw7ICAgIC8qIGNsZWFuIHRoaXMgdXAhISEgKi8KKyAgICBwRGF0YS0+cExhc3RhbmlvYmogID0gTU5HX05VTEw7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9EWU5BTUlDTU5HCisgICAgcE9iamVjdCA9IHBEYXRhLT5wRmlyc3RldmVudDsgICAgICAvKiBnZXQgZmlyc3QgZXZlbnQtb2JqZWN0IChpZiBhbnkpICovCisKKyAgICB3aGlsZSAocE9iamVjdCkgICAgICAgICAgICAgICAgICAgIC8qIG1vcmUgb2JqZWN0cyB0byBkaXNjYXJkID8gKi8KKyAgICB7CisgICAgICBwTmV4dCA9ICgobW5nX29iamVjdF9oZWFkZXJwKXBPYmplY3QpLT5wTmV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNhbGwgYXBwcm9wcmlhdGUgY2xlYW51cCAqLworICAgICAgZkNsZWFudXAgPSAoKG1uZ19vYmplY3RfaGVhZGVycClwT2JqZWN0KS0+ZkNsZWFudXA7CisgICAgICBmQ2xlYW51cCAocERhdGEsIHBPYmplY3QpOworCisgICAgICBwT2JqZWN0ID0gcE5leHQ7ICAgICAgICAgICAgICAgICAvKiBuZWVlZXh0ICovCisgICAgfQorCisgICAgcERhdGEtPnBGaXJzdGV2ZW50ID0gTU5HX05VTEw7ICAgICAvKiBjbGVhbiB0aGlzIHVwISEhICovCisgICAgcERhdGEtPnBMYXN0ZXZlbnQgID0gTU5HX05VTEw7CisjZW5kaWYKKyAgfQorCisjaWZkZWYgTU5HX0lOQ0xVREVfTVBOR19QUk9QT1NBTAorICBpZiAocERhdGEtPnBNUE5HKSAgICAgICAgICAgICAgICAgICAgLyogZHJvcCBNUE5HIGRhdGEgKGlmIGFueSkgKi8KKyAgeworICAgIGZDbGVhbnVwID0gKChtbmdfb2JqZWN0X2hlYWRlcnApcERhdGEtPnBNUE5HKS0+ZkNsZWFudXA7CisgICAgZkNsZWFudXAgKHBEYXRhLCBwRGF0YS0+cE1QTkcpOworICAgIHBEYXRhLT5wTVBORyA9IE1OR19OVUxMOworICB9CisjZW5kaWYKKworI2lmZGVmIE1OR19JTkNMVURFX0FOR19QUk9QT1NBTAorICBpZiAocERhdGEtPnBBTkcpICAgICAgICAgICAgICAgICAgICAgLyogZHJvcCBBTkcgZGF0YSAoaWYgYW55KSAqLworICB7CisgICAgZkNsZWFudXAgPSAoKG1uZ19vYmplY3RfaGVhZGVycClwRGF0YS0+cEFORyktPmZDbGVhbnVwOworICAgIGZDbGVhbnVwIChwRGF0YSwgcERhdGEtPnBBTkcpOworICAgIHBEYXRhLT5wQU5HID0gTU5HX05VTEw7CisgIH0KKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RST1BfT0JKRUNUUywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfRElTUExBWSAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorI2lmbmRlZiBNTkdfU0tJUENIVU5LX1NBVkUKK01OR19MT0NBTCBtbmdfcmV0Y29kZSBtbmdfZHJvcF9zYXZlZGF0YSAobW5nX2RhdGFwIHBEYXRhKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9EUk9QX1NBVkVEQVRBLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKHBEYXRhLT5wU2F2ZWRhdGEpICAgICAgICAgICAgICAgIC8qIHNhbml0eSBjaGVjayAqLworICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkcmVzcyBpdCBtb3JlIGRpcmVjdGx5ICovCisgICAgbW5nX3NhdmVkYXRhcCBwU2F2ZSA9IHBEYXRhLT5wU2F2ZWRhdGE7CisKKyAgICBpZiAocFNhdmUtPmlHbG9iYWxQcm9maWxlc2l6ZSkgICAgIC8qIGNsZWFudXAgdGhlIHByb2ZpbGUgPyAqLworICAgICAgTU5HX0ZSRUVYIChwRGF0YSwgcFNhdmUtPnBHbG9iYWxQcm9maWxlLCBwU2F2ZS0+aUdsb2JhbFByb2ZpbGVzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNsZWFudXAgdGhlIHNhdmUgc3RydWN0dXJlICovCisgICAgTU5HX0ZSRUUgKHBEYXRhLCBwRGF0YS0+cFNhdmVkYXRhLCBzaXplb2YgKG1uZ19zYXZlZGF0YSkpOworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRFJPUF9TQVZFREFUQSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCitNTkdfTE9DQUwgbW5nX3JldGNvZGUgbW5nX3Jlc2V0X3J1bmRhdGEgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX2Ryb3BfaW52YWxpZF9vYmplY3RzIChwRGF0YSk7ICAgIC8qIGRyb3AgaW52YWxpZGx5IHN0b3JlZCBvYmplY3RzICovCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfU0FWRQorICBtbmdfZHJvcF9zYXZlZGF0YSAgICAgICAgKHBEYXRhKTsgICAgLyogZHJvcCBzdG9yZWQgc2F2ZWRhdGEgKi8KKyNlbmRpZgorICBtbmdfcmVzZXRfb2JqemVybyAgICAgICAgKHBEYXRhKTsgICAgLyogcmVzZXQgb2JqZWN0IDAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRyb3Agc3RvcmVkIG9iamVjdHMgKGlmIGFueSkgKi8KKyAgbW5nX2Ryb3Bfb2JqZWN0cyAgICAgICAgIChwRGF0YSwgTU5HX0ZBTFNFKTsKKworICBwRGF0YS0+YkZyYW1lZG9uZSAgICAgICAgICAgID0gTU5HX0ZBTFNFOworICBwRGF0YS0+aUZyYW1lc2VxICAgICAgICAgICAgID0gMDsgICAgLyogcmVzZXQgY291bnRlcnMgJiBzdHVmZiAqLworICBwRGF0YS0+aUxheWVyc2VxICAgICAgICAgICAgID0gMDsKKyAgcERhdGEtPmlGcmFtZXRpbWUgICAgICAgICAgICA9IDA7CisKKyAgcERhdGEtPmJTa2lwcGluZyAgICAgICAgICAgICA9IE1OR19GQUxTRTsKKworI2lmZGVmIE1OR19TVVBQT1JUX0RZTkFNSUNNTkcKKyAgcERhdGEtPmJSdW5uaW5nZXZlbnQgICAgICAgICA9IE1OR19GQUxTRTsKKyAgcERhdGEtPmJTdG9wYWZ0ZXJzZWVrICAgICAgICA9IE1OR19GQUxTRTsKKyAgcERhdGEtPmlFdmVudHggICAgICAgICAgICAgICA9IDA7CisgIHBEYXRhLT5pRXZlbnR5ICAgICAgICAgICAgICAgPSAwOworICBwRGF0YS0+cExhc3Rtb3VzZW1vdmUgICAgICAgID0gTU5HX05VTEw7CisjZW5kaWYKKworICBwRGF0YS0+aVJlcXVlc3RmcmFtZSAgICAgICAgID0gMDsKKyAgcERhdGEtPmlSZXF1ZXN0bGF5ZXIgICAgICAgICA9IDA7CisgIHBEYXRhLT5pUmVxdWVzdHRpbWUgICAgICAgICAgPSAwOworICBwRGF0YS0+YlNlYXJjaGluZyAgICAgICAgICAgID0gTU5HX0ZBTFNFOworCisgIHBEYXRhLT5pUnVudGltZSAgICAgICAgICAgICAgPSAwOworICBwRGF0YS0+aVN5bmN0aW1lICAgICAgICAgICAgID0gMDsKKyAgcERhdGEtPmlTdGFydHRpbWUgICAgICAgICAgICA9IDA7CisgIHBEYXRhLT5pRW5kdGltZSAgICAgICAgICAgICAgPSAwOworICBwRGF0YS0+YlJ1bm5pbmcgICAgICAgICAgICAgID0gTU5HX0ZBTFNFOworICBwRGF0YS0+YlRpbWVyc2V0ICAgICAgICAgICAgID0gTU5HX0ZBTFNFOworICBwRGF0YS0+aUJyZWFrcG9pbnQgICAgICAgICAgID0gMDsKKyAgcERhdGEtPmJTZWN0aW9ud2FpdCAgICAgICAgICA9IE1OR19GQUxTRTsKKyAgcERhdGEtPmJGcmVlemluZyAgICAgICAgICAgICA9IE1OR19GQUxTRTsKKyAgcERhdGEtPmJSZXNldHRpbmcgICAgICAgICAgICA9IE1OR19GQUxTRTsKKyAgcERhdGEtPmJOZWVkcmVmcmVzaCAgICAgICAgICA9IE1OR19GQUxTRTsKKyAgcERhdGEtPmJPbmx5Zmlyc3RmcmFtZSAgICAgICA9IE1OR19GQUxTRTsKKyAgcERhdGEtPmlGcmFtZXNhZnRlclRFUk0gICAgICA9IDA7CisKKyAgcERhdGEtPmlJdGVyYXRpb25zICAgICAgICAgICA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdGFydCBvZiBhbmltYXRpb24gb2JqZWN0cyEgKi8KKyAgcERhdGEtPnBDdXJyYW5pb2JqICAgICAgICAgICA9IE1OR19OVUxMOworCisgIHBEYXRhLT5pVXBkYXRlbGVmdCAgICAgICAgICAgPSAwOyAgICAvKiByZXNldCByZWdpb24gKi8KKyAgcERhdGEtPmlVcGRhdGVyaWdodCAgICAgICAgICA9IDA7CisgIHBEYXRhLT5pVXBkYXRldG9wICAgICAgICAgICAgPSAwOworICBwRGF0YS0+aVVwZGF0ZWJvdHRvbSAgICAgICAgID0gMDsKKyAgcERhdGEtPmlQTFRFY291bnQgICAgICAgICAgICA9IDA7ICAgIC8qIHJlc2V0IFBMVEUgZGF0YSAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfREVGSQorICBwRGF0YS0+aURFRklvYmplY3RpZCAgICAgICAgID0gMDsgICAgLyogcmVzZXQgREVGSSBkYXRhICovCisgIHBEYXRhLT5iREVGSWhhc2Rvbm90c2hvdyAgICAgPSBNTkdfRkFMU0U7CisgIHBEYXRhLT5pREVGSWRvbm90c2hvdyAgICAgICAgPSAwOworICBwRGF0YS0+YkRFRkloYXNjb25jcmV0ZSAgICAgID0gTU5HX0ZBTFNFOworICBwRGF0YS0+aURFRkljb25jcmV0ZSAgICAgICAgID0gMDsKKyAgcERhdGEtPmJERUZJaGFzbG9jYSAgICAgICAgICA9IE1OR19GQUxTRTsKKyAgcERhdGEtPmlERUZJbG9jYXggICAgICAgICAgICA9IDA7CisgIHBEYXRhLT5pREVGSWxvY2F5ICAgICAgICAgICAgPSAwOworICBwRGF0YS0+YkRFRkloYXNjbGlwICAgICAgICAgID0gTU5HX0ZBTFNFOworICBwRGF0YS0+aURFRkljbGlwbCAgICAgICAgICAgID0gMDsKKyAgcERhdGEtPmlERUZJY2xpcHIgICAgICAgICAgICA9IDA7CisgIHBEYXRhLT5pREVGSWNsaXB0ICAgICAgICAgICAgPSAwOworICBwRGF0YS0+aURFRkljbGlwYiAgICAgICAgICAgID0gMDsKKyNlbmRpZgorCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfQkFDSworICBwRGF0YS0+aUJBQ0tyZWQgICAgICAgICAgICAgID0gMDsgICAgLyogcmVzZXQgQkFDSyBkYXRhICovCisgIHBEYXRhLT5pQkFDS2dyZWVuICAgICAgICAgICAgPSAwOworICBwRGF0YS0+aUJBQ0tibHVlICAgICAgICAgICAgID0gMDsKKyAgcERhdGEtPmlCQUNLbWFuZGF0b3J5ICAgICAgICA9IDA7CisgIHBEYXRhLT5pQkFDS2ltYWdlaWQgICAgICAgICAgPSAwOworICBwRGF0YS0+aUJBQ0t0aWxlICAgICAgICAgICAgID0gMDsKKyNlbmRpZgorCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfRlJBTQorICBwRGF0YS0+aUZSQU1tb2RlICAgICAgICAgICAgID0gMTsgICAgIC8qIGRlZmF1bHQgZ2xvYmFsIEZSQU0gdmFyaWFibGVzICovCisgIHBEYXRhLT5pRlJBTWRlbGF5ICAgICAgICAgICAgPSAxOworICBwRGF0YS0+aUZSQU10aW1lb3V0ICAgICAgICAgID0gMHg3ZmZmZmZmZmw7CisgIHBEYXRhLT5iRlJBTWNsaXBwaW5nICAgICAgICAgPSBNTkdfRkFMU0U7CisgIHBEYXRhLT5pRlJBTWNsaXBsICAgICAgICAgICAgPSAwOworICBwRGF0YS0+aUZSQU1jbGlwciAgICAgICAgICAgID0gMDsKKyAgcERhdGEtPmlGUkFNY2xpcHQgICAgICAgICAgICA9IDA7CisgIHBEYXRhLT5pRlJBTWNsaXBiICAgICAgICAgICAgPSAwOworCisgIHBEYXRhLT5pRnJhbWVtb2RlICAgICAgICAgICAgPSAxOyAgICAgLyogYWdhaW4gZm9yIHRoZSBjdXJyZW50IGZyYW1lICovCisgIHBEYXRhLT5pRnJhbWVkZWxheSAgICAgICAgICAgPSAxOworICBwRGF0YS0+aUZyYW1ldGltZW91dCAgICAgICAgID0gMHg3ZmZmZmZmZmw7CisgIHBEYXRhLT5iRnJhbWVjbGlwcGluZyAgICAgICAgPSBNTkdfRkFMU0U7CisgIHBEYXRhLT5pRnJhbWVjbGlwbCAgICAgICAgICAgPSAwOworICBwRGF0YS0+aUZyYW1lY2xpcHIgICAgICAgICAgID0gMDsKKyAgcERhdGEtPmlGcmFtZWNsaXB0ICAgICAgICAgICA9IDA7CisgIHBEYXRhLT5pRnJhbWVjbGlwYiAgICAgICAgICAgPSAwOworCisgIHBEYXRhLT5pTmV4dGRlbGF5ICAgICAgICAgICAgPSAxOworI2VuZGlmCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19TSE9XCisgIHBEYXRhLT5pU0hPV21vZGUgICAgICAgICAgICAgPSAwOyAgICAvKiByZXNldCBTSE9XIGRhdGEgKi8KKyAgcERhdGEtPmlTSE9XZnJvbWlkICAgICAgICAgICA9IDA7CisgIHBEYXRhLT5pU0hPV3RvaWQgICAgICAgICAgICAgPSAwOworICBwRGF0YS0+aVNIT1duZXh0aWQgICAgICAgICAgID0gMDsKKyAgcERhdGEtPmlTSE9Xc2tpcCAgICAgICAgICAgICA9IDA7CisjZW5kaWYKKworICBwRGF0YS0+aUdsb2JhbFBMVEVjb3VudCAgICAgID0gMDsgICAgLyogcmVzZXQgZ2xvYmFsIFBMVEUgZGF0YSAqLworCisgIHBEYXRhLT5pR2xvYmFsVFJOU3Jhd2xlbiAgICAgPSAwOyAgICAvKiByZXNldCBnbG9iYWwgdFJOUyBkYXRhICovCisKKyAgcERhdGEtPmlHbG9iYWxHYW1tYSAgICAgICAgICA9IDA7ICAgIC8qIHJlc2V0IGdsb2JhbCBnQU1BIGRhdGEgKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX2NIUk0KKyAgcERhdGEtPmlHbG9iYWxXaGl0ZXBvaW50eCAgICA9IDA7ICAgIC8qIHJlc2V0IGdsb2JhbCBjSFJNIGRhdGEgKi8KKyAgcERhdGEtPmlHbG9iYWxXaGl0ZXBvaW50eSAgICA9IDA7CisgIHBEYXRhLT5pR2xvYmFsUHJpbWFyeXJlZHggICAgPSAwOworICBwRGF0YS0+aUdsb2JhbFByaW1hcnlyZWR5ICAgID0gMDsKKyAgcERhdGEtPmlHbG9iYWxQcmltYXJ5Z3JlZW54ICA9IDA7CisgIHBEYXRhLT5pR2xvYmFsUHJpbWFyeWdyZWVueSAgPSAwOworICBwRGF0YS0+aUdsb2JhbFByaW1hcnlibHVleCAgID0gMDsKKyAgcERhdGEtPmlHbG9iYWxQcmltYXJ5Ymx1ZXkgICA9IDA7CisjZW5kaWYKKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX3NSR0IKKyAgcERhdGEtPmlHbG9iYWxSZW5kaW50ZW50ICAgICA9IDA7ICAgIC8qIHJlc2V0IGdsb2JhbCBzUkdCIGRhdGEgKi8KKyNlbmRpZgorCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfaUNDUAorICBpZiAocERhdGEtPmlHbG9iYWxQcm9maWxlc2l6ZSkgICAgICAgLyogZHJvcCBnbG9iYWwgcHJvZmlsZSAoaWYgYW55KSAqLworICAgIE1OR19GUkVFIChwRGF0YSwgcERhdGEtPnBHbG9iYWxQcm9maWxlLCBwRGF0YS0+aUdsb2JhbFByb2ZpbGVzaXplKTsKKworICBwRGF0YS0+aUdsb2JhbFByb2ZpbGVzaXplICAgID0gMDsgICAgCisjZW5kaWYKKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX2JLR0QKKyAgcERhdGEtPmlHbG9iYWxCS0dEcmVkICAgICAgICA9IDA7ICAgIC8qIHJlc2V0IGdsb2JhbCBiS0dEIGRhdGEgKi8KKyAgcERhdGEtPmlHbG9iYWxCS0dEZ3JlZW4gICAgICA9IDA7CisgIHBEYXRhLT5pR2xvYmFsQktHRGJsdWUgICAgICAgPSAwOworI2VuZGlmCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlc2V0IGRlbHRhLWltYWdlICovCisgIHBEYXRhLT5wRGVsdGFJbWFnZSAgICAgICAgICAgPSBNTkdfTlVMTDsKKyAgcERhdGEtPmlEZWx0YUltYWdldHlwZSAgICAgICA9IDA7CisgIHBEYXRhLT5pRGVsdGF0eXBlICAgICAgICAgICAgPSAwOworICBwRGF0YS0+aURlbHRhQmxvY2t3aWR0aCAgICAgID0gMDsKKyAgcERhdGEtPmlEZWx0YUJsb2NraGVpZ2h0ICAgICA9IDA7CisgIHBEYXRhLT5pRGVsdGFCbG9ja3ggICAgICAgICAgPSAwOworICBwRGF0YS0+aURlbHRhQmxvY2t5ICAgICAgICAgID0gMDsKKyAgcERhdGEtPmJEZWx0YWltbWVkaWF0ZSAgICAgICA9IE1OR19GQUxTRTsKKworICBwRGF0YS0+ZkRlbHRhZ2V0cm93ICAgICAgICAgID0gTU5HX05VTEw7CisgIHBEYXRhLT5mRGVsdGFhZGRyb3cgICAgICAgICAgPSBNTkdfTlVMTDsKKyAgcERhdGEtPmZEZWx0YXJlcGxhY2Vyb3cgICAgICA9IE1OR19OVUxMOworICBwRGF0YS0+ZkRlbHRhcHV0cm93ICAgICAgICAgID0gTU5HX05VTEw7CisKKyAgcERhdGEtPmZQcm9tb3Rlcm93ICAgICAgICAgICA9IE1OR19OVUxMOworICBwRGF0YS0+ZlByb21CaXRkZXB0aCAgICAgICAgID0gTU5HX05VTEw7CisgIHBEYXRhLT5wUHJvbUJ1ZiAgICAgICAgICAgICAgPSBNTkdfTlVMTDsKKyAgcERhdGEtPmlQcm9tQ29sb3J0eXBlICAgICAgICA9IDA7CisgIHBEYXRhLT5pUHJvbUJpdGRlcHRoICAgICAgICAgPSAwOworICBwRGF0YS0+aVByb21GaWxsdHlwZSAgICAgICAgID0gMDsKKyAgcERhdGEtPmlQcm9tV2lkdGggICAgICAgICAgICA9IDA7CisgIHBEYXRhLT5wUHJvbVNyYyAgICAgICAgICAgICAgPSBNTkdfTlVMTDsKKyAgcERhdGEtPnBQcm9tRHN0ICAgICAgICAgICAgICA9IE1OR19OVUxMOworI2VuZGlmCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19NQUdOCisgIHBEYXRhLT5pTUFHTmZyb21pZCAgICAgICAgICAgPSAwOworICBwRGF0YS0+aU1BR050b2lkICAgICAgICAgICAgID0gMDsKKyNlbmRpZgorCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfUEFTVAorICBwRGF0YS0+aVBhc3R4ICAgICAgICAgICAgICAgID0gMDsKKyAgcERhdGEtPmlQYXN0eSAgICAgICAgICAgICAgICA9IDA7CisjZW5kaWYKKworICBwRGF0YS0+cExhc3RzZWVrICAgICAgICAgICAgID0gTU5HX05VTEw7CisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmIC8qIE1OR19TVVBQT1JUX0RJU1BMQVkgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworTU5HX0xPQ0FMIHZvaWQgY2xlYW51cF9lcnJvcnMgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgcERhdGEtPmlFcnJvcmNvZGUgPSBNTkdfTk9FUlJPUjsKKyAgcERhdGEtPmlTZXZlcml0eSAgPSAwOworICBwRGF0YS0+aUVycm9yeDEgICA9IDA7CisgIHBEYXRhLT5pRXJyb3J4MiAgID0gMDsKKyAgcERhdGEtPnpFcnJvcnRleHQgPSBNTkdfTlVMTDsKKworICByZXR1cm47Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9SRUFECitNTkdfTE9DQUwgbW5nX3JldGNvZGUgbWFrZV9wdXNoYnVmZmVyIChtbmdfZGF0YXAgICAgICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcHRyICAgICAgICAgcFB1c2hkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3NpemVfdCAgICAgIGlMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgYlRha2Vvd25lcnNoaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcHVzaGRhdGFwICogcFB1c2gpCit7CisgIG1uZ19wdXNoZGF0YXAgcFRlbXA7CisKKyAgTU5HX0FMTE9DIChwRGF0YSwgcFRlbXAsIHNpemVvZihtbmdfcHVzaGRhdGEpKTsKKworICBwVGVtcC0+cE5leHQgICAgICA9IE1OR19OVUxMOworCisgIGlmIChiVGFrZW93bmVyc2hpcCkgICAgICAgICAgICAgICAgICAvKiBhcmUgd2UgZ29pbmcgdG8gb3duIHRoZSBidWZmZXI/ICovCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGVuIGp1c3QgY29weSB0aGUgcG9pbnRlciAqLworICAgIHBUZW1wLT5wRGF0YSAgICA9IChtbmdfdWludDhwKXBQdXNoZGF0YTsKKyAgfQorICBlbHNlCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvdGhlcndpc2UgY3JlYXRlIG5ldyBidWZmZXIgKi8KKyAgICBNTkdfQUxMT0NYIChwRGF0YSwgcFRlbXAtPnBEYXRhLCBpTGVuZ3RoKTsKKyAgICBpZiAoIXBUZW1wLT5wRGF0YSkgICAgICAgICAgICAgICAgIC8qIHN1Y2NlZWRlZD8gKi8KKyAgICB7CisgICAgICBNTkdfRlJFRVggKHBEYXRhLCBwVGVtcCwgc2l6ZW9mKG1uZ19wdXNoZGF0YSkpOworICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX09VVE9GTUVNT1JZKTsKKyAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgY29weSB0aGUgYnl0ZXMgYWNyb3NzICovCisgICAgTU5HX0NPUFkgKHBUZW1wLT5wRGF0YSwgcFB1c2hkYXRhLCBpTGVuZ3RoKTsKKyAgfQorCisgIHBUZW1wLT5pTGVuZ3RoICAgID0gaUxlbmd0aDsKKyAgcFRlbXAtPmJPd25lZCAgICAgPSBiVGFrZW93bmVyc2hpcDsKKyAgcFRlbXAtPnBEYXRhbmV4dCAgPSBwVGVtcC0+cERhdGE7CisgIHBUZW1wLT5pUmVtYWluaW5nID0gaUxlbmd0aDsKKworICAqcFB1c2ggICAgICAgICAgICA9IHBUZW1wOyAgICAgICAgICAgLyogcmV0dXJuIGl0ICovCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOyAgICAgICAgICAgICAgICAgIC8qIGFuZCBhbGwncyB3ZWxsICovCit9CisjZW5kaWYKKworI2lmZGVmIE1OR19WRVJTSU9OX1FVRVJZX1NVUFBPUlQKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgVmVyc2lvbmluZyBjb250cm9sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcGNoYXIgTU5HX0RFQ0wgbW5nX3ZlcnNpb25fdGV4dCAgICAodm9pZCkKK3sKKyAgcmV0dXJuIE1OR19WRVJTSU9OX1RFWFQ7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ191aW50OCBNTkdfREVDTCBtbmdfdmVyc2lvbl9zbyAgICAgICh2b2lkKQoreworICByZXR1cm4gTU5HX1ZFUlNJT05fU087Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ191aW50OCBNTkdfREVDTCBtbmdfdmVyc2lvbl9kbGwgICAgICh2b2lkKQoreworICByZXR1cm4gTU5HX1ZFUlNJT05fRExMOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfdWludDggTU5HX0RFQ0wgbW5nX3ZlcnNpb25fbWFqb3IgICAodm9pZCkKK3sKKyAgcmV0dXJuIE1OR19WRVJTSU9OX01BSk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfdWludDggTU5HX0RFQ0wgbW5nX3ZlcnNpb25fbWlub3IgICAodm9pZCkKK3sKKyAgcmV0dXJuIE1OR19WRVJTSU9OX01JTk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfdWludDggTU5HX0RFQ0wgbW5nX3ZlcnNpb25fcmVsZWFzZSAodm9pZCkKK3sKKyAgcmV0dXJuIE1OR19WRVJTSU9OX1JFTEVBU0U7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19ib29sIE1OR19ERUNMIG1uZ192ZXJzaW9uX2JldGEgKHZvaWQpCit7CisgIHJldHVybiBNTkdfVkVSU0lPTl9CRVRBOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAnc3VwcG9ydHMnIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfRlVOQ1FVRVJZCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgIG1uZ19wY2hhciAgekZ1bmN0aW9uOworICAgICAgICAgICAgICAgICBtbmdfdWludDggIGlNYWpvcjsgICAgLyogTWFqb3IgPT0gMCBtZWFucyBub3QgaW1wbGVtZW50ZWQgISAqLyAKKyAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICBpTWlub3I7CisgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaVJlbGVhc2U7CisgICAgICAgICAgICAgICB9IG1uZ19mdW5jX2VudHJ5OwordHlwZWRlZiBtbmdfZnVuY19lbnRyeSBjb25zdCAqIG1uZ19mdW5jX2VudHJ5cDsKKworTU5HX0xPQ0FMIG1uZ19mdW5jX2VudHJ5IGNvbnN0IGZ1bmNfdGFibGUgW10gPQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoga2VlcCBpdCBhbHBoYWJldGljYWxseSBzb3J0ZWQgISEhISEgKi8KKyAgICB7Im1uZ19jbGVhbnVwIiwgICAgICAgICAgICAgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfY29weV9jaHVuayIsICAgICAgICAgICAgIDEsIDAsIDV9LAorICAgIHsibW5nX2NyZWF0ZSIsICAgICAgICAgICAgICAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19kaXNwbGF5IiwgICAgICAgICAgICAgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfZGlzcGxheV9mcmVlemUiLCAgICAgICAgIDEsIDAsIDB9LAorI2lmbmRlZiBNTkdfTk9fRElTUExBWV9HT19TVVBQT1JURUQKKyAgICB7Im1uZ19kaXNwbGF5X2dvZnJhbWUiLCAgICAgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfZGlzcGxheV9nb2xheWVyIiwgICAgICAgIDEsIDAsIDB9LAorICAgIHsibW5nX2Rpc3BsYXlfZ290aW1lIiwgICAgICAgICAxLCAwLCAwfSwKKyNlbmRpZgorICAgIHsibW5nX2Rpc3BsYXlfcmVzZXQiLCAgICAgICAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19kaXNwbGF5X3Jlc3VtZSIsICAgICAgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfZ2V0X2FscGhhYml0ZGVwdGgiLCAgICAgIDEsIDAsIDB9LAorICAgIHsibW5nX2dldF9hbHBoYWNvbXByZXNzaW9uIiwgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19nZXRfYWxwaGFkZXB0aCIsICAgICAgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfZ2V0X2FscGhhZmlsdGVyIiwgICAgICAgIDEsIDAsIDB9LAorICAgIHsibW5nX2dldF9hbHBoYWludGVybGFjZSIsICAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19nZXRfYmdjb2xvciIsICAgICAgICAgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfZ2V0X2JpdGRlcHRoIiwgICAgICAgICAgIDEsIDAsIDB9LAorICAgIHsibW5nX2dldF9ia2dkc3R5bGUiLCAgICAgICAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19nZXRfY2FjaGVwbGF5YmFjayIsICAgICAgMSwgMCwgMn0sCisgICAgeyJtbmdfZ2V0X2NhbnZhc3N0eWxlIiwgICAgICAgIDEsIDAsIDB9LAorICAgIHsibW5nX2dldF9jb2xvcnR5cGUiLCAgICAgICAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19nZXRfY29tcHJlc3Npb24iLCAgICAgICAgMSwgMCwgMH0sCisjaWZuZGVmIE1OR19OT19DVVJSRU5UX0lORk8KKyAgICB7Im1uZ19nZXRfY3VycmVudGZyYW1lIiwgICAgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfZ2V0X2N1cnJlbnRsYXllciIsICAgICAgIDEsIDAsIDB9LAorICAgIHsibW5nX2dldF9jdXJyZW50cGxheXRpbWUiLCAgICAxLCAwLCAwfSwKKyNlbmRpZgorICAgIHsibW5nX2dldF9jdXJyZnJhbWRlbGF5IiwgICAgICAxLCAwLCA5fSwKKyNpZm5kZWYgTU5HX05PX0RGTFRfSU5GTworICAgIHsibW5nX2dldF9kZmx0aW1nZ2FtbWEiLCAgICAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19nZXRfZGZsdGltZ2dhbW1haW50IiwgICAgMSwgMCwgMH0sCisjZW5kaWYKKyAgICB7Im1uZ19nZXRfZGlzcGxheWdhbW1hIiwgICAgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfZ2V0X2Rpc3BsYXlnYW1tYWludCIsICAgIDEsIDAsIDB9LAorICAgIHsibW5nX2dldF9kb3Byb2dyZXNzaXZlIiwgICAgICAxLCAwLCAyfSwKKyAgICB7Im1uZ19nZXRfZmlsdGVyIiwgICAgICAgICAgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfZ2V0X2ZyYW1lY291bnQiLCAgICAgICAgIDEsIDAsIDB9LAorICAgIHsibW5nX2dldF9pbWFnZWhlaWdodCIsICAgICAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19nZXRfaW1hZ2VsZXZlbCIsICAgICAgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfZ2V0X2ltYWdldHlwZSIsICAgICAgICAgIDEsIDAsIDB9LAorICAgIHsibW5nX2dldF9pbWFnZXdpZHRoIiwgICAgICAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19nZXRfaW50ZXJsYWNlIiwgICAgICAgICAgMSwgMCwgMH0sCisjaWZkZWYgTU5HX0FDQ0VTU19KUEVHCisgICAgeyJtbmdfZ2V0X2pwZWdfZGN0bWV0aG9kIiwgICAgIDEsIDAsIDB9LAorICAgIHsibW5nX2dldF9qcGVnX21heGpkYXQiLCAgICAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19nZXRfanBlZ19vcHRpbWl6ZWQiLCAgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfZ2V0X2pwZWdfcHJvZ3Jlc3NpdmUiLCAgIDEsIDAsIDB9LAorICAgIHsibW5nX2dldF9qcGVnX3F1YWxpdHkiLCAgICAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19nZXRfanBlZ19zbW9vdGhpbmciLCAgICAgMSwgMCwgMH0sCisjZW5kaWYKKyAgICB7Im1uZ19nZXRfbGFzdGJhY2tjaHVuayIsICAgICAgMSwgMCwgM30sCisgICAgeyJtbmdfZ2V0X2xhc3RzZWVrbmFtZSIsICAgICAgIDEsIDAsIDV9LAorICAgIHsibW5nX2dldF9sYXllcmNvdW50IiwgICAgICAgICAxLCAwLCAwfSwKKyNpZm5kZWYgTU5HX1NLSVBfTUFYQ0FOVkFTCisgICAgeyJtbmdfZ2V0X21heGNhbnZhc2hlaWdodCIsICAgIDEsIDAsIDB9LAorICAgIHsibW5nX2dldF9tYXhjYW52YXN3aWR0aCIsICAgICAxLCAwLCAwfSwKKyNlbmRpZgorICAgIHsibW5nX2dldF9wbGF5dGltZSIsICAgICAgICAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19nZXRfcmVmcmVzaHBhc3MiLCAgICAgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfZ2V0X3J1bnRpbWUiLCAgICAgICAgICAgIDEsIDAsIDB9LAorICAgIHsibW5nX2dldF9zZWN0aW9uYnJlYWtzIiwgICAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19nZXRfc2lndHlwZSIsICAgICAgICAgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfZ2V0X3NpbXBsaWNpdHkiLCAgICAgICAgIDEsIDAsIDB9LAorICAgIHsibW5nX2dldF9zcGVlZCIsICAgICAgICAgICAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19nZXRfc3JnYiIsICAgICAgICAgICAgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfZ2V0X3N0YXJ0dGltZSIsICAgICAgICAgIDEsIDAsIDB9LAorICAgIHsibW5nX2dldF9zdG9yZWNodW5rcyIsICAgICAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19nZXRfc3VzcGVuc2lvbm1vZGUiLCAgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfZ2V0X3RpY2tzIiwgICAgICAgICAgICAgIDEsIDAsIDB9LAorI2lmbmRlZiBNTkdfTk9fQ1VSUkVOVF9JTkZPCisgICAgeyJtbmdfZ2V0X3RvdGFsZnJhbWVzIiwgICAgICAgIDEsIDAsIDV9LAorICAgIHsibW5nX2dldF90b3RhbGxheWVycyIsICAgICAgICAxLCAwLCA1fSwKKyAgICB7Im1uZ19nZXRfdG90YWxwbGF5dGltZSIsICAgICAgMSwgMCwgNX0sCisjZW5kaWYKKyAgICB7Im1uZ19nZXRfdXNlYmtnZCIsICAgICAgICAgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfZ2V0X3VzZXJkYXRhIiwgICAgICAgICAgIDEsIDAsIDB9LAorI2lmIGRlZmluZWQoTU5HX0ZVTExfQ01TKSB8fCBkZWZpbmVkKE1OR19HQU1NQV9PTkxZKSB8fCBkZWZpbmVkKE1OR19BUFBfQ01TKQorICAgIHsibW5nX2dldF92aWV3Z2FtbWEiLCAgICAgICAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19nZXRfdmlld2dhbW1haW50IiwgICAgICAgMSwgMCwgMH0sCisjZW5kaWYKKyNpZmRlZiBNTkdfQUNDRVNTX1pMSUIKKyAgICB7Im1uZ19nZXRfemxpYl9sZXZlbCIsICAgICAgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfZ2V0X3psaWJfbWF4aWRhdCIsICAgICAgIDEsIDAsIDB9LAorICAgIHsibW5nX2dldF96bGliX21lbWxldmVsIiwgICAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19nZXRfemxpYl9tZXRob2QiLCAgICAgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfZ2V0X3psaWJfc3RyYXRlZ3kiLCAgICAgIDEsIDAsIDB9LAorICAgIHsibW5nX2dldF96bGliX3dpbmRvd2JpdHMiLCAgICAxLCAwLCAwfSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfTk9fT1BFTl9DTE9TRV9TVFJFQU0KKyAgICB7Im1uZ19nZXRjYl9jbG9zZXN0cmVhbSIsICAgICAgMSwgMCwgMH0sCisjZW5kaWYKKyAgICB7Im1uZ19nZXRjYl9lcnJvcnByb2MiLCAgICAgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfZ2V0Y2JfZ2V0YWxwaGFsaW5lIiwgICAgIDEsIDAsIDB9LAorICAgIHsibW5nX2dldGNiX2dldGJrZ2RsaW5lIiwgICAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19nZXRjYl9nZXRjYW52YXNsaW5lIiwgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfZ2V0Y2JfZ2V0dGlja2NvdW50IiwgICAgIDEsIDAsIDB9LAorICAgIHsibW5nX2dldGNiX21lbWFsbG9jIiwgICAgICAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19nZXRjYl9tZW1mcmVlIiwgICAgICAgICAgMSwgMCwgMH0sCisjaWZuZGVmIE1OR19OT19PUEVOX0NMT1NFX1NUUkVBTQorICAgIHsibW5nX2dldGNiX29wZW5zdHJlYW0iLCAgICAgICAxLCAwLCAwfSwKKyNlbmRpZgorICAgIHsibW5nX2dldGNiX3Byb2Nlc3Nhcm93IiwgICAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19nZXRjYl9wcm9jZXNzY2hyb21hIiwgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfZ2V0Y2JfcHJvY2Vzc2dhbW1hIiwgICAgIDEsIDAsIDB9LAorICAgIHsibW5nX2dldGNiX3Byb2Nlc3NoZWFkZXIiLCAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19nZXRjYl9wcm9jZXNzaWNjcCIsICAgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfZ2V0Y2JfcHJvY2Vzc21lbmQiLCAgICAgIDEsIDAsIDF9LAorICAgIHsibW5nX2dldGNiX3Byb2Nlc3NuZWVkIiwgICAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19nZXRjYl9wcm9jZXNzc2F2ZSIsICAgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfZ2V0Y2JfcHJvY2Vzc3NlZWsiLCAgICAgIDEsIDAsIDB9LAorICAgIHsibW5nX2dldGNiX3Byb2Nlc3NzcmdiIiwgICAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19nZXRjYl9wcm9jZXNzdGVybSIsICAgICAgMSwgMCwgMn0sCisgICAgeyJtbmdfZ2V0Y2JfcHJvY2Vzc3RleHQiLCAgICAgIDEsIDAsIDB9LAorICAgIHsibW5nX2dldGNiX3Byb2Nlc3N1bmtub3duIiwgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19nZXRjYl9yZWFkZGF0YSIsICAgICAgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfZ2V0Y2JfcmVmcmVzaCIsICAgICAgICAgIDEsIDAsIDB9LAorICAgIHsibW5nX2dldGNiX3JlbGVhc2VkYXRhIiwgICAgICAxLCAwLCA4fSwKKyAgICB7Im1uZ19nZXRjYl9zZXR0aW1lciIsICAgICAgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfZ2V0Y2JfdHJhY2Vwcm9jIiwgICAgICAgIDEsIDAsIDB9LAorICAgIHsibW5nX2dldGNiX3dyaXRlZGF0YSIsICAgICAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19nZXRjaHVua19iYWNrIiwgICAgICAgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfZ2V0Y2h1bmtfYmFzaSIsICAgICAgICAgIDEsIDAsIDB9LAorI2lmbmRlZiBNTkdfU0tJUENIVU5LX2JLR0QKKyAgICB7Im1uZ19nZXRjaHVua19ia2dkIiwgICAgICAgICAgMSwgMCwgMH0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19jSFJNCisgICAgeyJtbmdfZ2V0Y2h1bmtfY2hybSIsICAgICAgICAgIDEsIDAsIDB9LAorI2VuZGlmCisgICAgeyJtbmdfZ2V0Y2h1bmtfY2xpcCIsICAgICAgICAgIDEsIDAsIDB9LAorICAgIHsibW5nX2dldGNodW5rX2Nsb24iLCAgICAgICAgICAxLCAwLCAwfSwKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworI2lmbmRlZiBNTkdfU0tJUENIVU5LX2RCWUsKKyAgICB7Im1uZ19nZXRjaHVua19kYnlrIiwgICAgICAgICAgMSwgMCwgMH0sCisjZW5kaWYKKyNlbmRpZgorICAgIHsibW5nX2dldGNodW5rX2RlZmkiLCAgICAgICAgICAxLCAwLCAwfSwKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworICAgIHsibW5nX2dldGNodW5rX2RoZHIiLCAgICAgICAgICAxLCAwLCAwfSwKKyNlbmRpZgorICAgIHsibW5nX2dldGNodW5rX2Rpc2MiLCAgICAgICAgICAxLCAwLCAwfSwKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworICAgIHsibW5nX2dldGNodW5rX2Ryb3AiLCAgICAgICAgICAxLCAwLCAwfSwKKyNlbmRpZgorICAgIHsibW5nX2dldGNodW5rX2VuZGwiLCAgICAgICAgICAxLCAwLCAwfSwKKyNpZmRlZiBNTkdfSU5DTFVERV9NUE5HX1BST1BPU0FMCisgICAgeyJtbmdfZ2V0Y2h1bmtfbXBuZyIsICAgICAgICAgIDEsIDAsIDEwfSwKKyAgICB7Im1uZ19nZXRjaHVua19tcG5nX2ZyYW1lIiwgICAgMSwgMCwgMTB9LAorI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfZXZOVAorICAgIHsibW5nX2dldGNodW5rX2V2bnQiLCAgICAgICAgICAxLCAwLCA1fSwKKyAgICB7Im1uZ19nZXRjaHVua19ldm50X2VudHJ5IiwgICAgMSwgMCwgNX0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19lWFBJCisgICAgeyJtbmdfZ2V0Y2h1bmtfZXhwaSIsICAgICAgICAgIDEsIDAsIDB9LAorI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfZlBSSQorICAgIHsibW5nX2dldGNodW5rX2ZwcmkiLCAgICAgICAgICAxLCAwLCAwfSwKKyNlbmRpZgorICAgIHsibW5nX2dldGNodW5rX2ZyYW0iLCAgICAgICAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19nZXRjaHVua19nYW1hIiwgICAgICAgICAgMSwgMCwgMH0sCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfaElTVAorICAgIHsibW5nX2dldGNodW5rX2hpc3QiLCAgICAgICAgICAxLCAwLCAwfSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX2lDQ1AKKyAgICB7Im1uZ19nZXRjaHVua19pY2NwIiwgICAgICAgICAgMSwgMCwgMH0sCisjZW5kaWYKKyAgICB7Im1uZ19nZXRjaHVua19pZGF0IiwgICAgICAgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfZ2V0Y2h1bmtfaWVuZCIsICAgICAgICAgIDEsIDAsIDB9LAorICAgIHsibW5nX2dldGNodW5rX2loZHIiLCAgICAgICAgICAxLCAwLCAwfSwKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworI2lmZGVmIE1OR19JTkNMVURFX0pORworICAgIHsibW5nX2dldGNodW5rX2lqbmciLCAgICAgICAgICAxLCAwLCAwfSwKKyNlbmRpZgorICAgIHsibW5nX2dldGNodW5rX2lwbmciLCAgICAgICAgICAxLCAwLCAwfSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX2lUWHQKKyAgICB7Im1uZ19nZXRjaHVua19pdHh0IiwgICAgICAgICAgMSwgMCwgMH0sCisjZW5kaWYKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgICB7Im1uZ19nZXRjaHVua19qZGFhIiwgICAgICAgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfZ2V0Y2h1bmtfamRhdCIsICAgICAgICAgIDEsIDAsIDB9LAorICAgIHsibW5nX2dldGNodW5rX2poZHIiLCAgICAgICAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19nZXRjaHVua19qc2VwIiwgICAgICAgICAgMSwgMCwgMH0sCisjZW5kaWYKKyAgICB7Im1uZ19nZXRjaHVua19sb29wIiwgICAgICAgICAgMSwgMCwgMH0sCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfTUFHTgorICAgIHsibW5nX2dldGNodW5rX21hZ24iLCAgICAgICAgICAxLCAwLCAwfSwKKyNlbmRpZgorICAgIHsibW5nX2dldGNodW5rX21lbmQiLCAgICAgICAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19nZXRjaHVua19taGRyIiwgICAgICAgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfZ2V0Y2h1bmtfbW92ZSIsICAgICAgICAgIDEsIDAsIDB9LAorI2lmbmRlZiBNTkdfU0tJUENIVU5LX25FRUQKKyAgICB7Im1uZ19nZXRjaHVua19uZWVkIiwgICAgICAgICAgMSwgMCwgMH0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19PUkRSCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKKyAgICB7Im1uZ19nZXRjaHVua19vcmRyIiwgICAgICAgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfZ2V0Y2h1bmtfb3Jkcl9lbnRyeSIsICAgIDEsIDAsIDB9LAorI2VuZGlmCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19QQVNUCisgICAgeyJtbmdfZ2V0Y2h1bmtfcGFzdCIsICAgICAgICAgIDEsIDAsIDB9LAorICAgIHsibW5nX2dldGNodW5rX3Bhc3Rfc3JjIiwgICAgICAxLCAwLCAwfSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX3BIWWcKKyAgICB7Im1uZ19nZXRjaHVua19waHlnIiwgICAgICAgICAgMSwgMCwgMH0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19wSFlzCisgICAgeyJtbmdfZ2V0Y2h1bmtfcGh5cyIsICAgICAgICAgIDEsIDAsIDB9LAorI2VuZGlmCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKKyAgICB7Im1uZ19nZXRjaHVua19wbHRlIiwgICAgICAgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfZ2V0Y2h1bmtfcHBsdCIsICAgICAgICAgIDEsIDAsIDB9LAorICAgIHsibW5nX2dldGNodW5rX3BwbHRfZW50cnkiLCAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19nZXRjaHVua19wcm9tIiwgICAgICAgICAgMSwgMCwgMH0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19TQVZFCisgICAgeyJtbmdfZ2V0Y2h1bmtfc2F2ZSIsICAgICAgICAgIDEsIDAsIDB9LAorICAgIHsibW5nX2dldGNodW5rX3NhdmVfZW50cnkiLCAgICAxLCAwLCAwfSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX3NCSVQKKyAgICB7Im1uZ19nZXRjaHVua19zYml0IiwgICAgICAgICAgMSwgMCwgMH0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19TRUVLCisgICAgeyJtbmdfZ2V0Y2h1bmtfc2VlayIsICAgICAgICAgIDEsIDAsIDB9LAorI2VuZGlmCisgICAgeyJtbmdfZ2V0Y2h1bmtfc2hvdyIsICAgICAgICAgIDEsIDAsIDB9LAorI2lmbmRlZiBNTkdfU0tJUENIVU5LX3NQTFQKKyAgICB7Im1uZ19nZXRjaHVua19zcGx0IiwgICAgICAgICAgMSwgMCwgMH0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19zUkdCCisgICAgeyJtbmdfZ2V0Y2h1bmtfc3JnYiIsICAgICAgICAgIDEsIDAsIDB9LAorI2VuZGlmCisgICAgeyJtbmdfZ2V0Y2h1bmtfdGVybSIsICAgICAgICAgIDEsIDAsIDB9LAorI2lmbmRlZiBNTkdfU0tJUENIVU5LX3RFWHQKKyAgICB7Im1uZ19nZXRjaHVua190ZXh0IiwgICAgICAgICAgMSwgMCwgMH0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS190SU1FCisgICAgeyJtbmdfZ2V0Y2h1bmtfdGltZSIsICAgICAgICAgIDEsIDAsIDB9LAorI2VuZGlmCisgICAgeyJtbmdfZ2V0Y2h1bmtfdHJucyIsICAgICAgICAgIDEsIDAsIDB9LAorICAgIHsibW5nX2dldGNodW5rX3Vua293biIsICAgICAgICAxLCAwLCAwfSwKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS196VFh0CisgICAgeyJtbmdfZ2V0Y2h1bmtfenR4dCIsICAgICAgICAgIDEsIDAsIDB9LAorI2VuZGlmCisgICAgeyJtbmdfZ2V0aW1nZGF0YV9jaHVuayIsICAgICAgIDAsIDAsIDB9LAorICAgIHsibW5nX2dldGltZ2RhdGFfY2h1bmtzZXEiLCAgICAwLCAwLCAwfSwKKyAgICB7Im1uZ19nZXRpbWdkYXRhX3NlcSIsICAgICAgICAgMCwgMCwgMH0sCisgICAgeyJtbmdfZ2V0bGFzdGVycm9yIiwgICAgICAgICAgIDEsIDAsIDB9LAorICAgIHsibW5nX2luaXRpYWxpemUiLCAgICAgICAgICAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19pdGVyYXRlX2NodW5rcyIsICAgICAgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfcHV0Y2h1bmtfYmFjayIsICAgICAgICAgIDEsIDAsIDB9LAorI2lmbmRlZiBNTkdfU0tJUENIVU5LX0JBU0kKKyAgICB7Im1uZ19wdXRjaHVua19iYXNpIiwgICAgICAgICAgMSwgMCwgMH0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19iS0dECisgICAgeyJtbmdfcHV0Y2h1bmtfYmtnZCIsICAgICAgICAgIDEsIDAsIDB9LAorI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfY0hSTQorICAgIHsibW5nX3B1dGNodW5rX2Nocm0iLCAgICAgICAgICAxLCAwLCAwfSwKKyNlbmRpZgorICAgIHsibW5nX3B1dGNodW5rX2NsaXAiLCAgICAgICAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19wdXRjaHVua19jbG9uIiwgICAgICAgICAgMSwgMCwgMH0sCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19EQllLCisgICAgeyJtbmdfcHV0Y2h1bmtfZGJ5ayIsICAgICAgICAgIDEsIDAsIDB9LAorI2VuZGlmCisjZW5kaWYKKyAgICB7Im1uZ19wdXRjaHVua19kZWZpIiwgICAgICAgICAgMSwgMCwgMH0sCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKKyAgICB7Im1uZ19wdXRjaHVua19kaGRyIiwgICAgICAgICAgMSwgMCwgMH0sCisjZW5kaWYKKyAgICB7Im1uZ19wdXRjaHVua19kaXNjIiwgICAgICAgICAgMSwgMCwgMH0sCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKKyAgICB7Im1uZ19wdXRjaHVua19kcm9wIiwgICAgICAgICAgMSwgMCwgMH0sCisjZW5kaWYKKyAgICB7Im1uZ19wdXRjaHVua19lbmRsIiwgICAgICAgICAgMSwgMCwgMH0sCisjaWZkZWYgTU5HX0lOQ0xVREVfTVBOR19QUk9QT1NBTAorICAgIHsibW5nX3B1dGNodW5rX21wbmciLCAgICAgICAgICAxLCAwLCAxMH0sCisgICAgeyJtbmdfcHV0Y2h1bmtfbXBuZ19mcmFtZSIsICAgIDEsIDAsIDEwfSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX2V2TlQKKyAgICB7Im1uZ19wdXRjaHVua19ldm50IiwgICAgICAgICAgMSwgMCwgNX0sCisgICAgeyJtbmdfcHV0Y2h1bmtfZXZudF9lbnRyeSIsICAgIDEsIDAsIDV9LAorI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfZVhQSQorICAgIHsibW5nX3B1dGNodW5rX2V4cGkiLCAgICAgICAgICAxLCAwLCAwfSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX2ZQUkkKKyAgICB7Im1uZ19wdXRjaHVua19mcHJpIiwgICAgICAgICAgMSwgMCwgMH0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19GUkFNCisgICAgeyJtbmdfcHV0Y2h1bmtfZnJhbSIsICAgICAgICAgIDEsIDAsIDB9LAorI2VuZGlmCisgICAgeyJtbmdfcHV0Y2h1bmtfZ2FtYSIsICAgICAgICAgIDEsIDAsIDB9LAorI2lmbmRlZiBNTkdfU0tJUENIVU5LX2hJU1QKKyAgICB7Im1uZ19wdXRjaHVua19oaXN0IiwgICAgICAgICAgMSwgMCwgMH0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19pQ0NQCisgICAgeyJtbmdfcHV0Y2h1bmtfaWNjcCIsICAgICAgICAgIDEsIDAsIDB9LAorI2VuZGlmCisgICAgeyJtbmdfcHV0Y2h1bmtfaWRhdCIsICAgICAgICAgIDEsIDAsIDB9LAorICAgIHsibW5nX3B1dGNodW5rX2llbmQiLCAgICAgICAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19wdXRjaHVua19paGRyIiwgICAgICAgICAgMSwgMCwgMH0sCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgICB7Im1uZ19wdXRjaHVua19pam5nIiwgICAgICAgICAgMSwgMCwgMH0sCisjZW5kaWYKKyAgICB7Im1uZ19wdXRjaHVua19pcG5nIiwgICAgICAgICAgMSwgMCwgMH0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19pVFh0CisgICAgeyJtbmdfcHV0Y2h1bmtfaXR4dCIsICAgICAgICAgIDEsIDAsIDB9LAorI2VuZGlmCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisgICAgeyJtbmdfcHV0Y2h1bmtfamRhYSIsICAgICAgICAgIDEsIDAsIDB9LAorICAgIHsibW5nX3B1dGNodW5rX2pkYXQiLCAgICAgICAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19wdXRjaHVua19qaGRyIiwgICAgICAgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfcHV0Y2h1bmtfanNlcCIsICAgICAgICAgIDEsIDAsIDB9LAorI2VuZGlmCisgICAgeyJtbmdfcHV0Y2h1bmtfbG9vcCIsICAgICAgICAgIDEsIDAsIDB9LAorI2lmbmRlZiBNTkdfU0tJUENIVU5LX01BR04KKyAgICB7Im1uZ19wdXRjaHVua19tYWduIiwgICAgICAgICAgMSwgMCwgMH0sCisjZW5kaWYKKyAgICB7Im1uZ19wdXRjaHVua19tZW5kIiwgICAgICAgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfcHV0Y2h1bmtfbWhkciIsICAgICAgICAgIDEsIDAsIDB9LAorICAgIHsibW5nX3B1dGNodW5rX21vdmUiLCAgICAgICAgICAxLCAwLCAwfSwKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19uRUVECisgICAgeyJtbmdfcHV0Y2h1bmtfbmVlZCIsICAgICAgICAgIDEsIDAsIDB9LAorI2VuZGlmCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19PUkRSCisgICAgeyJtbmdfcHV0Y2h1bmtfb3JkciIsICAgICAgICAgIDEsIDAsIDB9LAorICAgIHsibW5nX3B1dGNodW5rX29yZHJfZW50cnkiLCAgICAxLCAwLCAwfSwKKyNlbmRpZgorI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfUEFTVAorICAgIHsibW5nX3B1dGNodW5rX3Bhc3QiLCAgICAgICAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19wdXRjaHVua19wYXN0X3NyYyIsICAgICAgMSwgMCwgMH0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19wSFlnCisgICAgeyJtbmdfcHV0Y2h1bmtfcGh5ZyIsICAgICAgICAgIDEsIDAsIDB9LAorI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfcEhZcworICAgIHsibW5nX3B1dGNodW5rX3BoeXMiLCAgICAgICAgICAxLCAwLCAwfSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisgICAgeyJtbmdfcHV0Y2h1bmtfcGx0ZSIsICAgICAgICAgIDEsIDAsIDB9LAorICAgIHsibW5nX3B1dGNodW5rX3BwbHQiLCAgICAgICAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19wdXRjaHVua19wcGx0X2VudHJ5IiwgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfcHV0Y2h1bmtfcHJvbSIsICAgICAgICAgIDEsIDAsIDB9LAorI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfU0FWRQorICAgIHsibW5nX3B1dGNodW5rX3NhdmUiLCAgICAgICAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19wdXRjaHVua19zYXZlX2VudHJ5IiwgICAgMSwgMCwgMH0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19zQklUCisgICAgeyJtbmdfcHV0Y2h1bmtfc2JpdCIsICAgICAgICAgIDEsIDAsIDB9LAorI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfU0VFSworICAgIHsibW5nX3B1dGNodW5rX3NlZWsiLCAgICAgICAgICAxLCAwLCAwfSwKKyNlbmRpZgorICAgIHsibW5nX3B1dGNodW5rX3Nob3ciLCAgICAgICAgICAxLCAwLCAwfSwKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19zUExUCisgICAgeyJtbmdfcHV0Y2h1bmtfc3BsdCIsICAgICAgICAgIDEsIDAsIDB9LAorI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfc1JHQgorICAgIHsibW5nX3B1dGNodW5rX3NyZ2IiLCAgICAgICAgICAxLCAwLCAwfSwKKyNlbmRpZgorICAgIHsibW5nX3B1dGNodW5rX3Rlcm0iLCAgICAgICAgICAxLCAwLCAwfSwKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS190RVh0CisgICAgeyJtbmdfcHV0Y2h1bmtfdGV4dCIsICAgICAgICAgIDEsIDAsIDB9LAorI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfdElNRQorICAgIHsibW5nX3B1dGNodW5rX3RpbWUiLCAgICAgICAgICAxLCAwLCAwfSwKKyNlbmRpZgorICAgIHsibW5nX3B1dGNodW5rX3RybnMiLCAgICAgICAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19wdXRjaHVua191bmtvd24iLCAgICAgICAgMSwgMCwgMH0sCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfelRYdAorICAgIHsibW5nX3B1dGNodW5rX3p0eHQiLCAgICAgICAgICAxLCAwLCAwfSwKKyNlbmRpZgorICAgIHsibW5nX3B1dGltZ2RhdGFfaWhkciIsICAgICAgICAwLCAwLCAwfSwKKyAgICB7Im1uZ19wdXRpbWdkYXRhX2poZHIiLCAgICAgICAgMCwgMCwgMH0sCisgICAgeyJtbmdfcmVzZXQiLCAgICAgICAgICAgICAgICAgIDEsIDAsIDB9LAorICAgIHsibW5nX3JlYWQiLCAgICAgICAgICAgICAgICAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19yZWFkX3B1c2hjaHVuayIsICAgICAgICAgMSwgMCwgOH0sCisgICAgeyJtbmdfcmVhZF9wdXNoZGF0YSIsICAgICAgICAgIDEsIDAsIDh9LAorICAgIHsibW5nX3JlYWRfcHVzaHNpZyIsICAgICAgICAgICAxLCAwLCA4fSwKKyAgICB7Im1uZ19yZWFkX3Jlc3VtZSIsICAgICAgICAgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfcmVhZGRpc3BsYXkiLCAgICAgICAgICAgIDEsIDAsIDB9LAorICAgIHsibW5nX3NldF9iZ2NvbG9yIiwgICAgICAgICAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19zZXRfYmtnZHN0eWxlIiwgICAgICAgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfc2V0X2NhY2hlcGxheWJhY2siLCAgICAgIDEsIDAsIDJ9LAorICAgIHsibW5nX3NldF9jYW52YXNzdHlsZSIsICAgICAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19zZXRfZGZsdGltZ2dhbW1hIiwgICAgICAgMSwgMCwgMH0sCisjaWZuZGVmIE1OR19OT19ERkxUX0lORk8KKyAgICB7Im1uZ19zZXRfZGZsdGltZ2dhbW1haW50IiwgICAgMSwgMCwgMH0sCisjZW5kaWYKKyAgICB7Im1uZ19zZXRfZGlzcGxheWdhbW1hIiwgICAgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfc2V0X2Rpc3BsYXlnYW1tYWludCIsICAgIDEsIDAsIDB9LAorICAgIHsibW5nX3NldF9kb3Byb2dyZXNzaXZlIiwgICAgICAxLCAwLCAyfSwKKyNpZmRlZiBNTkdfQUNDRVNTX0pQRUcKKyAgICB7Im1uZ19zZXRfanBlZ19kY3RtZXRob2QiLCAgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfc2V0X2pwZWdfbWF4amRhdCIsICAgICAgIDEsIDAsIDB9LAorICAgIHsibW5nX3NldF9qcGVnX29wdGltaXplZCIsICAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19zZXRfanBlZ19wcm9ncmVzc2l2ZSIsICAgMSwgMCwgMH0sCisgICAgeyJtbmdfc2V0X2pwZWdfcXVhbGl0eSIsICAgICAgIDEsIDAsIDB9LAorICAgIHsibW5nX3NldF9qcGVnX3Ntb290aGluZyIsICAgICAxLCAwLCAwfSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUF9NQVhDQU5WQVMKKyAgICB7Im1uZ19zZXRfbWF4Y2FudmFzaGVpZ2h0IiwgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfc2V0X21heGNhbnZhc3NpemUiLCAgICAgIDEsIDAsIDB9LAorICAgIHsibW5nX3NldF9tYXhjYW52YXN3aWR0aCIsICAgICAxLCAwLCAwfSwKKyNlbmRpZgorICAgIHsibW5nX3NldF9vdXRwdXRwcm9maWxlIiwgICAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19zZXRfb3V0cHV0cHJvZmlsZTIiLCAgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfc2V0X291dHB1dHNyZ2IiLCAgICAgICAgIDEsIDAsIDF9LAorICAgIHsibW5nX3NldF9zZWN0aW9uYnJlYWtzIiwgICAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19zZXRfc3BlZWQiLCAgICAgICAgICAgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfc2V0X3NyZ2IiLCAgICAgICAgICAgICAgIDEsIDAsIDB9LAorICAgIHsibW5nX3NldF9zcmdiaW1wbGljaXQiLCAgICAgICAxLCAwLCAxfSwKKyAgICB7Im1uZ19zZXRfc3JnYnByb2ZpbGUiLCAgICAgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfc2V0X3NyZ2Jwcm9maWxlMiIsICAgICAgIDEsIDAsIDB9LAorICAgIHsibW5nX3NldF9zdG9yZWNodW5rcyIsICAgICAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19zZXRfc3VzcGVuc2lvbm1vZGUiLCAgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfc2V0X3VzZWJrZ2QiLCAgICAgICAgICAgIDEsIDAsIDB9LAorICAgIHsibW5nX3NldF91c2VyZGF0YSIsICAgICAgICAgICAxLCAwLCAwfSwKKyNpZiBkZWZpbmVkKE1OR19GVUxMX0NNUykgfHwgZGVmaW5lZChNTkdfR0FNTUFfT05MWSkgfHwgZGVmaW5lZChNTkdfQVBQX0NNUykKKyAgICB7Im1uZ19zZXRfdmlld2dhbW1hIiwgICAgICAgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfc2V0X3ZpZXdnYW1tYWludCIsICAgICAgIDEsIDAsIDB9LAorI2VuZGlmCisjaWZkZWYgTU5HX0FDQ0VTU19aTElCCisgICAgeyJtbmdfc2V0X3psaWJfbGV2ZWwiLCAgICAgICAgIDEsIDAsIDB9LAorICAgIHsibW5nX3NldF96bGliX21heGlkYXQiLCAgICAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19zZXRfemxpYl9tZW1sZXZlbCIsICAgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfc2V0X3psaWJfbWV0aG9kIiwgICAgICAgIDEsIDAsIDB9LAorICAgIHsibW5nX3NldF96bGliX3N0cmF0ZWd5IiwgICAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19zZXRfemxpYl93aW5kb3diaXRzIiwgICAgMSwgMCwgMH0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX05PX09QRU5fQ0xPU0VfU1RSRUFNCisgICAgeyJtbmdfc2V0Y2JfY2xvc2VzdHJlYW0iLCAgICAgIDEsIDAsIDB9LAorI2VuZGlmCisgICAgeyJtbmdfc2V0Y2JfZXJyb3Jwcm9jIiwgICAgICAgIDEsIDAsIDB9LAorICAgIHsibW5nX3NldGNiX2dldGFscGhhbGluZSIsICAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19zZXRjYl9nZXRia2dkbGluZSIsICAgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfc2V0Y2JfZ2V0Y2FudmFzbGluZSIsICAgIDEsIDAsIDB9LAorICAgIHsibW5nX3NldGNiX2dldHRpY2tjb3VudCIsICAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19zZXRjYl9tZW1hbGxvYyIsICAgICAgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfc2V0Y2JfbWVtZnJlZSIsICAgICAgICAgIDEsIDAsIDB9LAorI2lmbmRlZiBNTkdfTk9fT1BFTl9DTE9TRV9TVFJFQU0KKyAgICB7Im1uZ19zZXRjYl9vcGVuc3RyZWFtIiwgICAgICAgMSwgMCwgMH0sCisjZW5kaWYKKyAgICB7Im1uZ19zZXRjYl9wcm9jZXNzYXJvdyIsICAgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfc2V0Y2JfcHJvY2Vzc2Nocm9tYSIsICAgIDEsIDAsIDB9LAorICAgIHsibW5nX3NldGNiX3Byb2Nlc3NnYW1tYSIsICAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19zZXRjYl9wcm9jZXNzaGVhZGVyIiwgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfc2V0Y2JfcHJvY2Vzc2ljY3AiLCAgICAgIDEsIDAsIDB9LAorICAgIHsibW5nX3NldGNiX3Byb2Nlc3NtZW5kIiwgICAgICAxLCAwLCAxfSwKKyAgICB7Im1uZ19zZXRjYl9wcm9jZXNzbmVlZCIsICAgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfc2V0Y2JfcHJvY2Vzc3NhdmUiLCAgICAgIDEsIDAsIDB9LAorICAgIHsibW5nX3NldGNiX3Byb2Nlc3NzZWVrIiwgICAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19zZXRjYl9wcm9jZXNzc3JnYiIsICAgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfc2V0Y2JfcHJvY2Vzc3Rlcm0iLCAgICAgIDEsIDAsIDJ9LAorICAgIHsibW5nX3NldGNiX3Byb2Nlc3N0ZXh0IiwgICAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19zZXRjYl9wcm9jZXNzdW5rbm93biIsICAgMSwgMCwgMH0sCisgICAgeyJtbmdfc2V0Y2JfcmVhZGRhdGEiLCAgICAgICAgIDEsIDAsIDB9LAorICAgIHsibW5nX3NldGNiX3JlZnJlc2giLCAgICAgICAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19zZXRjYl9yZWxlYXNlZGF0YSIsICAgICAgMSwgMCwgOH0sCisgICAgeyJtbmdfc2V0Y2Jfc2V0dGltZXIiLCAgICAgICAgIDEsIDAsIDB9LAorICAgIHsibW5nX3NldGNiX3RyYWNlcHJvYyIsICAgICAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19zZXRjYl93cml0ZWRhdGEiLCAgICAgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfc3RhdHVzX2NyZWF0aW5nIiwgICAgICAgIDEsIDAsIDB9LAorICAgIHsibW5nX3N0YXR1c19kaXNwbGF5aW5nIiwgICAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19zdGF0dXNfZHluYW1pYyIsICAgICAgICAgMSwgMCwgNX0sCisgICAgeyJtbmdfc3RhdHVzX2Vycm9yIiwgICAgICAgICAgIDEsIDAsIDB9LAorICAgIHsibW5nX3N0YXR1c19yZWFkaW5nIiwgICAgICAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19zdGF0dXNfcnVubmluZyIsICAgICAgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfc3RhdHVzX3J1bm5pbmdldmVudCIsICAgIDEsIDAsIDV9LAorICAgIHsibW5nX3N0YXR1c19zdXNwZW5kYnJlYWsiLCAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ19zdGF0dXNfdGltZXJicmVhayIsICAgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfc3RhdHVzX3dyaXRpbmciLCAgICAgICAgIDEsIDAsIDB9LAorICAgIHsibW5nX3N1cHBvcnRzX2Z1bmMiLCAgICAgICAgICAxLCAwLCA1fSwKKyAgICB7Im1uZ190cmFwZXZlbnQiLCAgICAgICAgICAgICAgMSwgMCwgNX0sCisgICAgeyJtbmdfdXBkYXRlbW5naGVhZGVyIiwgICAgICAgIDEsIDAsIDB9LAorICAgIHsibW5nX3VwZGF0ZW1uZ3NpbXBsaWNpdHkiLCAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ192ZXJzaW9uX2JldGEiLCAgICAgICAgICAgMSwgMCwgNX0sCisgICAgeyJtbmdfdmVyc2lvbl9kbGwiLCAgICAgICAgICAgIDEsIDAsIDB9LAorICAgIHsibW5nX3ZlcnNpb25fbWFqb3IiLCAgICAgICAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ192ZXJzaW9uX21pbm9yIiwgICAgICAgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfdmVyc2lvbl9yZWxlYXNlIiwgICAgICAgIDEsIDAsIDB9LAorICAgIHsibW5nX3ZlcnNpb25fc28iLCAgICAgICAgICAgICAxLCAwLCAwfSwKKyAgICB7Im1uZ192ZXJzaW9uX3RleHQiLCAgICAgICAgICAgMSwgMCwgMH0sCisgICAgeyJtbmdfd3JpdGUiLCAgICAgICAgICAgICAgICAgIDEsIDAsIDB9LAorICB9OworCittbmdfYm9vbCBNTkdfREVDTCBtbmdfc3VwcG9ydHNfZnVuYyAobW5nX3BjaGFyICB6RnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4KiBpTWFqb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4KiBpTWlub3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4KiBpUmVsZWFzZSkKK3sKKyAgbW5nX2ludDMyICAgICAgIGlUb3AsIGlMb3dlciwgaVVwcGVyLCBpTWlkZGxlOworICBtbmdfZnVuY19lbnRyeXAgcEVudHJ5OyAgICAgICAgICAvKiBwb2ludGVyIHRvIGZvdW5kIGVudHJ5ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRldGVybWluZSBtYXggaW5kZXggb2YgdGFibGUgKi8KKyAgaVRvcCA9IChzaXplb2YgKGZ1bmNfdGFibGUpIC8gc2l6ZW9mIChmdW5jX3RhYmxlIFswXSkpIC0gMTsKKworICBpTG93ZXIgID0gMDsgICAgICAgICAgICAgICAgICAgICAvKiBpbml0aWFsaXplIGJpbmFyeSBzZWFyY2ggKi8KKyAgaU1pZGRsZSA9IGlUb3AgPj4gMTsgICAgICAgICAgICAgLyogc3RhcnQgaW4gdGhlIG1pZGRsZSAqLworICBpVXBwZXIgID0gaVRvcDsKKyAgcEVudHJ5ICA9IDA7ICAgICAgICAgICAgICAgICAgICAgLyogbm8gZ29vZHMgeWV0ISAqLworCisgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZSBiaW5hcnkgc2VhcmNoIGl0c2VsZiAqLworICAgIHsKKyAgICAgIG1uZ19pbnQzMiBpUnNsdCA9IHN0cmNtcChmdW5jX3RhYmxlIFtpTWlkZGxlXS56RnVuY3Rpb24sIHpGdW5jdGlvbik7CisgICAgICBpZiAoaVJzbHQgPCAwKQorICAgICAgICBpTG93ZXIgPSBpTWlkZGxlICsgMTsKKyAgICAgIGVsc2UgaWYgKGlSc2x0ID4gMCkKKyAgICAgICAgaVVwcGVyID0gaU1pZGRsZSAtIDE7CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHBFbnRyeSA9ICZmdW5jX3RhYmxlIFtpTWlkZGxlXTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9OworCisgICAgICBpTWlkZGxlID0gKGlMb3dlciArIGlVcHBlcikgPj4gMTsKKyAgICB9CisgIHdoaWxlIChpTG93ZXIgPD0gaVVwcGVyKTsKKworICBpZiAocEVudHJ5KSAgICAgICAgICAgICAgICAgICAgICAvKiBmb3VuZCBpdCA/ICovCisgIHsKKyAgICAqaU1ham9yICAgPSBwRW50cnktPmlNYWpvcjsKKyAgICAqaU1pbm9yICAgPSBwRW50cnktPmlNaW5vcjsKKyAgICAqaVJlbGVhc2UgPSBwRW50cnktPmlSZWxlYXNlOworICAgIHJldHVybiBNTkdfVFJVRTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAqaU1ham9yICAgPSAwOworICAgICppTWlub3IgICA9IDA7CisgICAgKmlSZWxlYXNlID0gMDsKKyAgICByZXR1cm4gTU5HX0ZBTFNFOworICB9Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIEhMQVBJIHJvdXRpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19oYW5kbGUgTU5HX0RFQ0wgbW5nX2luaXRpYWxpemUgKG1uZ19wdHIgICAgICAgcFVzZXJkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX21lbWFsbG9jICBmTWVtYWxsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfbWVtZnJlZSAgIGZNZW1mcmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3RyYWNlcHJvYyBmVHJhY2Vwcm9jKQoreworICBtbmdfZGF0YXAgICBwRGF0YTsKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCisgIG1uZ19yZXRjb2RlIGlSZXRjb2RlOworICBtbmdfaW1hZ2VwICBwSW1hZ2U7CisjZW5kaWYKKworI2lmZGVmIE1OR19JTlRFUk5BTF9NRU1NTkdNVCAgICAgICAgICAgLyogYWxsb2NhdGUgdGhlIG1haW4gZGF0YXN0cnVjICovCisgIHBEYXRhID0gKG1uZ19kYXRhcCljYWxsb2MgKDEsIHNpemVvZiAobW5nX2RhdGEpKTsKKyNlbHNlCisgIHBEYXRhID0gKG1uZ19kYXRhcClmTWVtYWxsb2MgKHNpemVvZiAobW5nX2RhdGEpKTsKKyNlbmRpZgorCisgIGlmICghcERhdGEpCisgICAgcmV0dXJuIE1OR19OVUxMOyAgICAgICAgICAgICAgICAgICAvKiBlcnJvcjogb3V0IG9mIG1lbW9yeT8/ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2YWxpZGF0ZSB0aGUgc3RydWN0dXJlICovCisgIHBEYXRhLT5pTWFnaWMgICAgICAgICAgICAgICAgPSBNTkdfTUFHSUM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzYXZlIHVzZXJkYXRhIGZpZWxkICovCisgIHBEYXRhLT5wVXNlcmRhdGEgICAgICAgICAgICAgPSBwVXNlcmRhdGE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZW1lbWJlciB0cmFjZSBjYWxsYmFjayAqLworICBwRGF0YS0+ZlRyYWNlcHJvYyAgICAgICAgICAgID0gZlRyYWNlcHJvYzsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIGlmIChtbmdfdHJhY2UgKHBEYXRhLCBNTkdfRk5fSU5JVElBTElaRSwgTU5HX0xDX0lOSVRJQUxJWkUpKQorICB7CisgICAgTU5HX0ZSRUVYIChwRGF0YSwgcERhdGEsIHNpemVvZiAobW5nX2RhdGEpKTsKKyAgICByZXR1cm4gTU5HX05VTEw7CisgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVmYXVsdCBjYW52YXMgc3R5bGVzIGFyZSA4LWJpdCBSR0IgKi8KKyAgcERhdGEtPmlDYW52YXNzdHlsZSAgICAgICAgICA9IE1OR19DQU5WQVNfUkdCODsKKyAgcERhdGEtPmlCa2dkc3R5bGUgICAgICAgICAgICA9IE1OR19DQU5WQVNfUkdCODsKKworICBwRGF0YS0+aUJHcmVkICAgICAgICAgICAgICAgID0gMDsgIC8qIGJsYWNrICovCisgIHBEYXRhLT5pQkdncmVlbiAgICAgICAgICAgICAgPSAwOworICBwRGF0YS0+aUJHYmx1ZSAgICAgICAgICAgICAgID0gMDsKKworICBwRGF0YS0+YlVzZUJLR0QgICAgICAgICAgICAgID0gTU5HX1RSVUU7CisKKyNpZmRlZiBNTkdfRlVMTF9DTVMKKyAgcERhdGEtPmJJc3NSR0IgICAgICAgICAgICAgICA9IE1OR19UUlVFOworICBwRGF0YS0+aFByb2YxICAgICAgICAgICAgICAgID0gMDsgICAgLyogbm8gcHJvZmlsZXMgeWV0ICovCisgIHBEYXRhLT5oUHJvZjIgICAgICAgICAgICAgICAgPSAwOworICBwRGF0YS0+aFByb2YzICAgICAgICAgICAgICAgID0gMDsKKyAgcERhdGEtPmhUcmFucyAgICAgICAgICAgICAgICA9IDA7CisjZW5kaWYKKworICBwRGF0YS0+ZFZpZXdnYW1tYSAgICAgICAgICAgID0gMS4wOworICBwRGF0YS0+ZERpc3BsYXlnYW1tYSAgICAgICAgID0gMi4yOworICBwRGF0YS0+ZERmbHRpbWdnYW1tYSAgICAgICAgID0gMC40NTQ1NTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXRpYWxseSByZW1lbWJlciBjaHVua3MgKi8KKyAgcERhdGEtPmJTdG9yZWNodW5rcyAgICAgICAgICA9IE1OR19UUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm8gYnJlYWtzIGF0IHNlY3Rpb24tYm9yZGVycyAqLworICBwRGF0YS0+YlNlY3Rpb25icmVha3MgICAgICAgID0gTU5HX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdGlhbGx5IGNhY2hlIHBsYXliYWNrIGluZm8gKi8KKyAgcERhdGEtPmJDYWNoZXBsYXliYWNrICAgICAgICA9IE1OR19UUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJvZ3Jlc3NpdmUgcmVmcmVzaCBmb3IgbGFyZ2UgaW1hZ2VzICovCisgIHBEYXRhLT5iRG9Qcm9ncmVzc2l2ZSAgICAgICAgPSBNTkdfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyYyBleGlzdHM7IHNob3VsZCBjaGVjazsgZXJyb3IgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcml0aWNhbCBjaHVua3M7IHdhcm5pbmcgZm9yIGFuY2lsbGVyeTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlIGNyYyBmb3Igb3V0cHV0ICovCisgIHBEYXRhLT5pQ3JjbW9kZSAgICAgICAgICAgICAgPSBNTkdfQ1JDX0RFRkFVTFQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3JtYWwgYW5pbWF0aW9uLXNwZWVkICEgKi8KKyAgcERhdGEtPmlTcGVlZCAgICAgICAgICAgICAgICA9IG1uZ19zdF9ub3JtYWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0aWFsIGltYWdlIGxpbWl0cyAqLworICBwRGF0YS0+aU1heHdpZHRoICAgICAgICAgICAgID0gMTAwMDA7CisgIHBEYXRhLT5pTWF4aGVpZ2h0ICAgICAgICAgICAgPSAxMDAwMDsKKworI2lmZGVmIE1OR19JTlRFUk5BTF9NRU1NTkdNVCAgICAgICAgICAgLyogaW50ZXJuYWwgbWFuYWdlbWVudCAqLworICBwRGF0YS0+Zk1lbWFsbG9jICAgICAgICAgICAgID0gTU5HX05VTEw7CisgIHBEYXRhLT5mTWVtZnJlZSAgICAgICAgICAgICAgPSBNTkdfTlVMTDsKKyNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGtlZXAgY2FsbGJhY2tzICovCisgIHBEYXRhLT5mTWVtYWxsb2MgICAgICAgICAgICAgPSBmTWVtYWxsb2M7CisgIHBEYXRhLT5mTWVtZnJlZSAgICAgICAgICAgICAgPSBmTWVtZnJlZTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm8gdmFsdWUgKHlldCkgKi8KKyAgcERhdGEtPmZSZWxlYXNlZGF0YSAgICAgICAgICA9IE1OR19OVUxMOyAgICAKKyNpZm5kZWYgTU5HX05PX09QRU5fQ0xPU0VfU1RSRUFNCisgIHBEYXRhLT5mT3BlbnN0cmVhbSAgICAgICAgICAgPSBNTkdfTlVMTDsKKyAgcERhdGEtPmZDbG9zZXN0cmVhbSAgICAgICAgICA9IE1OR19OVUxMOworI2VuZGlmCisgIHBEYXRhLT5mUmVhZGRhdGEgICAgICAgICAgICAgPSBNTkdfTlVMTDsKKyAgcERhdGEtPmZXcml0ZWRhdGEgICAgICAgICAgICA9IE1OR19OVUxMOworICBwRGF0YS0+ZkVycm9ycHJvYyAgICAgICAgICAgID0gTU5HX05VTEw7CisgIHBEYXRhLT5mUHJvY2Vzc2hlYWRlciAgICAgICAgPSBNTkdfTlVMTDsKKyAgcERhdGEtPmZQcm9jZXNzdGV4dCAgICAgICAgICA9IE1OR19OVUxMOworICBwRGF0YS0+ZlByb2Nlc3NzYXZlICAgICAgICAgID0gTU5HX05VTEw7CisgIHBEYXRhLT5mUHJvY2Vzc3NlZWsgICAgICAgICAgPSBNTkdfTlVMTDsKKyAgcERhdGEtPmZQcm9jZXNzbmVlZCAgICAgICAgICA9IE1OR19OVUxMOworICBwRGF0YS0+ZlByb2Nlc3NtZW5kICAgICAgICAgID0gTU5HX05VTEw7CisgIHBEYXRhLT5mUHJvY2Vzc3Vua25vd24gICAgICAgPSBNTkdfTlVMTDsKKyAgcERhdGEtPmZQcm9jZXNzdGVybSAgICAgICAgICA9IE1OR19OVUxMOworICBwRGF0YS0+ZkdldGNhbnZhc2xpbmUgICAgICAgID0gTU5HX05VTEw7CisgIHBEYXRhLT5mR2V0YmtnZGxpbmUgICAgICAgICAgPSBNTkdfTlVMTDsKKyAgcERhdGEtPmZHZXRhbHBoYWxpbmUgICAgICAgICA9IE1OR19OVUxMOworICBwRGF0YS0+ZlJlZnJlc2ggICAgICAgICAgICAgID0gTU5HX05VTEw7CisgIHBEYXRhLT5mR2V0dGlja2NvdW50ICAgICAgICAgPSBNTkdfTlVMTDsKKyAgcERhdGEtPmZTZXR0aW1lciAgICAgICAgICAgICA9IE1OR19OVUxMOworICBwRGF0YS0+ZlByb2Nlc3NnYW1tYSAgICAgICAgID0gTU5HX05VTEw7CisgIHBEYXRhLT5mUHJvY2Vzc2Nocm9tYSAgICAgICAgPSBNTkdfTlVMTDsKKyAgcERhdGEtPmZQcm9jZXNzc3JnYiAgICAgICAgICA9IE1OR19OVUxMOworICBwRGF0YS0+ZlByb2Nlc3NpY2NwICAgICAgICAgID0gTU5HX05VTEw7CisgIHBEYXRhLT5mUHJvY2Vzc2Fyb3cgICAgICAgICAgPSBNTkdfTlVMTDsKKworI2lmIGRlZmluZWQoTU5HX1NVUFBPUlRfRElTUExBWSkgJiYgKGRlZmluZWQoTU5HX0dBTU1BX09OTFkpIHx8IGRlZmluZWQoTU5HX0ZVTExfQ01TKSkKKyAgcERhdGEtPmRMYXN0Z2FtbWEgICAgICAgICAgICA9IDA7ICAgIC8qIGxvb2t1cCB0YWJsZSBuZWVkcyBmaXJzdC10aW1lIGNhbGMgKi8KKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWSAgICAgICAgICAgICAvKiBjcmVhdGUgb2JqZWN0IDAgKi8KKyAgaVJldGNvZGUgPSBtbmdfY3JlYXRlX2ltYWdlb2JqZWN0IChwRGF0YSwgMCwgTU5HX1RSVUUsIE1OR19UUlVFLCBNTkdfVFJVRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCBNTkdfRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgJnBJbWFnZSk7CisKKyAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGRyb3Agb3V0ICovCisgIHsKKyAgICBNTkdfRlJFRVggKHBEYXRhLCBwRGF0YSwgc2l6ZW9mIChtbmdfZGF0YSkpOworICAgIHJldHVybiBNTkdfTlVMTDsKKyAgfQorCisgIHBEYXRhLT5wT2JqemVybyA9IHBJbWFnZTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChNTkdfU1VQUE9SVF9ESVNQTEFZKSAmJiBkZWZpbmVkKE1OR19JTkNMVURFX0xDTVMpCisgIG1uZ2xjbXNfaW5pdGxpYnJhcnkgKCk7ICAgICAgICAgICAgICAvKiBpbml0IGxjbXMgcGFydGljdWxhcnMgKi8KKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfUkVBRAorICBwRGF0YS0+YlN1c3BlbnNpb25tb2RlICAgICAgID0gTU5HX0ZBTFNFOworICBwRGF0YS0+aVN1c3BlbmRidWZzaXplICAgICAgID0gMDsKKyAgcERhdGEtPnBTdXNwZW5kYnVmICAgICAgICAgICA9IE1OR19OVUxMOworICBwRGF0YS0+cFN1c3BlbmRidWZuZXh0ICAgICAgID0gTU5HX05VTEw7CisgIHBEYXRhLT5pU3VzcGVuZGJ1ZmxlZnQgICAgICAgPSAwOworICBwRGF0YS0+aUNodW5rbGVuICAgICAgICAgICAgID0gMDsKKyAgcERhdGEtPnBSZWFkYnVmbmV4dCAgICAgICAgICA9IE1OR19OVUxMOworICBwRGF0YS0+cExhcmdlYnVmbmV4dCAgICAgICAgID0gTU5HX05VTEw7CisKKyAgcERhdGEtPnBGaXJzdHB1c2hjaHVuayAgICAgICA9IE1OR19OVUxMOworICBwRGF0YS0+cExhc3RwdXNoY2h1bmsgICAgICAgID0gTU5HX05VTEw7CisgIHBEYXRhLT5wRmlyc3RwdXNoZGF0YSAgICAgICAgPSBNTkdfTlVMTDsKKyAgcERhdGEtPnBMYXN0cHVzaGRhdGEgICAgICAgICA9IE1OR19OVUxMOworI2VuZGlmCisKKyNpZmRlZiBNTkdfSU5DTFVERV9aTElCCisgIG1uZ3psaWJfaW5pdGlhbGl6ZSAocERhdGEpOyAgICAgICAgICAvKiBpbml0aWFsaXplIHpsaWIgc3RydWN0dXJlcyBhbmQgc3VjaCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVmYXVsdCB6bGliIGNvbXByZXNzaW9uIHBhcmFtZXRlcnMgKi8KKyAgcERhdGEtPmlabGV2ZWwgICAgICAgICAgICAgICA9IE1OR19aTElCX0xFVkVMOworICBwRGF0YS0+aVptZXRob2QgICAgICAgICAgICAgID0gTU5HX1pMSUJfTUVUSE9EOworICBwRGF0YS0+aVp3aW5kb3diaXRzICAgICAgICAgID0gTU5HX1pMSUJfV0lORE9XQklUUzsKKyAgcERhdGEtPmlabWVtbGV2ZWwgICAgICAgICAgICA9IE1OR19aTElCX01FTUxFVkVMOworICBwRGF0YS0+aVpzdHJhdGVneSAgICAgICAgICAgID0gTU5HX1pMSUJfU1RSQVRFR1k7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZhdWx0IG1heGltdW0gSURBVCBkYXRhIHNpemUgKi8KKyAgcERhdGEtPmlNYXhJREFUICAgICAgICAgICAgICA9IE1OR19NQVhfSURBVF9TSVpFOworI2VuZGlmCisKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcgICAgICAgICAgICAgICAgIC8qIGRlZmF1bHQgSUpHIGNvbXByZXNzaW9uIHBhcmFtZXRlcnMgKi8KKyAgcERhdGEtPmVKUEVHZGN0bWV0aG9kICAgICAgICA9IE1OR19KUEVHX0RDVDsKKyAgcERhdGEtPmlKUEVHcXVhbGl0eSAgICAgICAgICA9IE1OR19KUEVHX1FVQUxJVFk7CisgIHBEYXRhLT5pSlBFR3Ntb290aGluZyAgICAgICAgPSBNTkdfSlBFR19TTU9PVEhJTkc7CisgIHBEYXRhLT5iSlBFR2NvbXByZXNzcHJvZ3IgICAgPSBNTkdfSlBFR19QUk9HUkVTU0lWRTsKKyAgcERhdGEtPmJKUEVHY29tcHJlc3NvcHQgICAgICA9IE1OR19KUEVHX09QVElNSVpFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZmF1bHQgbWF4aW11bSBKREFUIGRhdGEgc2l6ZSAqLworICBwRGF0YS0+aU1heEpEQVQgICAgICAgICAgICAgID0gTU5HX01BWF9KREFUX1NJWkU7CisjZW5kaWYKKworICBtbmdfcmVzZXQgKChtbmdfaGFuZGxlKXBEYXRhKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIGlmIChtbmdfdHJhY2UgKHBEYXRhLCBNTkdfRk5fSU5JVElBTElaRSwgTU5HX0xDX0VORCkpCisgIHsKKyAgICBNTkdfRlJFRVggKHBEYXRhLCBwRGF0YSwgc2l6ZW9mIChtbmdfZGF0YSkpOworICAgIHJldHVybiBNTkdfTlVMTDsKKyAgfQorI2VuZGlmCisKKyAgcmV0dXJuIChtbmdfaGFuZGxlKXBEYXRhOyAgICAgICAgICAgIC8qIGlmIHdlIGdldCBoZXJlLCB3ZSdyZSBpbiBidXNpbmVzcyAqLworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfcmVzZXQgKG1uZ19oYW5kbGUgaEhhbmRsZSkKK3sKKyAgbW5nX2RhdGFwIHBEYXRhOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1JFU0VULCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFIChoSGFuZGxlKSAgICAgICAgICAgIC8qIGNoZWNrIHZhbGlkaXR5IGhhbmRsZSAqLworICBwRGF0YSA9ICgobW5nX2RhdGFwKShoSGFuZGxlKSk7ICAgICAgLyogYWRkcmVzcyBtYWluIHN0cnVjdHVyZSAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorI2lmbmRlZiBNTkdfU0tJUENIVU5LX1NBVkUKKyAgbW5nX2Ryb3Bfc2F2ZWRhdGEgKHBEYXRhKTsgICAgICAgICAgIC8qIGNsZWFudXAgc2F2ZWQtZGF0YSBmcm9tIFNBVkUvU0VFSyAqLworI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoTU5HX1NVUFBPUlRfRElTUExBWSkgJiYgZGVmaW5lZChNTkdfRlVMTF9DTVMpCisgIG1uZ19jbGVhcl9jbXMgKHBEYXRhKTsgICAgICAgICAgICAgICAvKiBjbGVhbnVwIGxlZnQtb3ZlciBjbXMgc3R1ZmYgaWYgYW55ICovCisjZW5kaWYKKworI2lmIGRlZmluZWQoTU5HX1NVUFBPUlRfRElTUExBWSkgJiYgZGVmaW5lZChNTkdfSU5DTFVERV9KTkcpCisgIG1uZ2pwZWdfY2xlYW51cCAocERhdGEpOyAgICAgICAgICAgICAvKiBjbGVhbnVwIGpwZWcgc3R1ZmYgKi8KKyNlbmRpZgorCisjaWZkZWYgTU5HX0lOQ0xVREVfWkxJQgorICBpZiAocERhdGEtPmJJbmZsYXRpbmcpICAgICAgICAgICAgICAgLyogaWYgd2UndmUgYmVlbiBpbmZsYXRpbmcgKi8KKyAgeworI2lmZGVmIE1OR19JTkNMVURFX0RJU1BMQVlfUFJPQ1MKKyAgICBtbmdfY2xlYW51cF9yb3dwcm9jIChwRGF0YSk7ICAgICAgIC8qIGNsZWFudXAgcm93LXByb2Nlc3NpbmcsICovCisjZW5kaWYKKyAgICBtbmd6bGliX2luZmxhdGVmcmVlIChwRGF0YSk7ICAgICAgIC8qIGNsZWFudXAgaW5mbGF0ZSEgKi8KKyAgfQorI2VuZGlmIC8qIE1OR19JTkNMVURFX1pMSUIgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1JFQUQKKyAgaWYgKChwRGF0YS0+YlJlYWRpbmcpICYmICghcERhdGEtPmJFT0YpKQorICAgIG1uZ19wcm9jZXNzX2VvZiAocERhdGEpOyAgICAgICAgICAgLyogY2xlYW51cCBhcHAgc3RyZWFtaW5nICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjbGVhbnVwIGRlZmF1bHQgcmVhZCBidWZmZXJzICovCisgIE1OR19GUkVFIChwRGF0YSwgcERhdGEtPnBSZWFkYnVmLCAgICBwRGF0YS0+aVJlYWRidWZzaXplKTsKKyAgTU5HX0ZSRUUgKHBEYXRhLCBwRGF0YS0+cExhcmdlYnVmLCAgIHBEYXRhLT5pTGFyZ2VidWZzaXplKTsKKyAgTU5HX0ZSRUUgKHBEYXRhLCBwRGF0YS0+cFN1c3BlbmRidWYsIHBEYXRhLT5pU3VzcGVuZGJ1ZnNpemUpOworCisgIHdoaWxlIChwRGF0YS0+cEZpcnN0cHVzaGRhdGEpICAgICAgICAvKiByZWxlYXNlIGFueSBwdXNoZWQgZGF0YSAmIGNodW5rcyAqLworICAgIG1uZ19yZWxlYXNlX3B1c2hkYXRhIChwRGF0YSk7CisgIHdoaWxlIChwRGF0YS0+cEZpcnN0cHVzaGNodW5rKQorICAgIG1uZ19yZWxlYXNlX3B1c2hjaHVuayAocERhdGEpOworI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9XUklURSAgICAgICAgICAgICAgIC8qIGNsZWFudXAgZGVmYXVsdCB3cml0ZSBidWZmZXIgKi8KKyAgTU5HX0ZSRUUgKHBEYXRhLCBwRGF0YS0+cFdyaXRlYnVmLCBwRGF0YS0+aVdyaXRlYnVmc2l6ZSk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoTU5HX1NVUFBPUlRfUkVBRCkgfHwgZGVmaW5lZChNTkdfU1VQUE9SVF9XUklURSkKKyAgbW5nX2Ryb3BfY2h1bmtzICAocERhdGEpOyAgICAgICAgICAgIC8qIGRyb3Agc3RvcmVkIGNodW5rcyAoaWYgYW55KSAqLworI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCisgIG1uZ19kcm9wX29iamVjdHMgKHBEYXRhLCBNTkdfVFJVRSk7ICAvKiBkcm9wIHN0b3JlZCBvYmplY3RzIChpZiBhbnkpICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19pQ0NQCisgIGlmIChwRGF0YS0+aUdsb2JhbFByb2ZpbGVzaXplKSAgICAgICAvKiBkcm9wIGdsb2JhbCBwcm9maWxlIChpZiBhbnkpICovCisgICAgTU5HX0ZSRUVYIChwRGF0YSwgcERhdGEtPnBHbG9iYWxQcm9maWxlLCBwRGF0YS0+aUdsb2JhbFByb2ZpbGVzaXplKTsKKyNlbmRpZgorI2VuZGlmCisKKyAgcERhdGEtPmVTaWd0eXBlICAgICAgICAgICAgICA9IG1uZ19pdF91bmtub3duOworICBwRGF0YS0+ZUltYWdldHlwZSAgICAgICAgICAgID0gbW5nX2l0X3Vua25vd247CisgIHBEYXRhLT5pV2lkdGggICAgICAgICAgICAgICAgPSAwOyAgICAvKiB0aGVzZSBhcmUgdW5rbm93biB5ZXQgKi8KKyAgcERhdGEtPmlIZWlnaHQgICAgICAgICAgICAgICA9IDA7CisgIHBEYXRhLT5pVGlja3MgICAgICAgICAgICAgICAgPSAwOworICBwRGF0YS0+aUxheWVyY291bnQgICAgICAgICAgID0gMDsKKyAgcERhdGEtPmlGcmFtZWNvdW50ICAgICAgICAgICA9IDA7CisgIHBEYXRhLT5pUGxheXRpbWUgICAgICAgICAgICAgPSAwOworICBwRGF0YS0+aVNpbXBsaWNpdHkgICAgICAgICAgID0gMDsKKyAgcERhdGEtPmlBbHBoYWRlcHRoICAgICAgICAgICA9IDE2OyAgIC8qIGFzc3VtZSB0aGUgd29yc3QhICovCisKKyAgcERhdGEtPmlJbWFnZWxldmVsICAgICAgICAgICA9IDA7ICAgIC8qIG5vIGltYWdlIGVuY291bnRlcmVkICovCisKKyAgcERhdGEtPmlNYWduaWZ5ICAgICAgICAgICAgICA9IDA7ICAgIC8qIDEtdG8tMSBkaXNwbGF5ICovCisgIHBEYXRhLT5pT2Zmc2V0eCAgICAgICAgICAgICAgPSAwOyAgICAvKiBubyBvZmZzZXRzICovCisgIHBEYXRhLT5pT2Zmc2V0eSAgICAgICAgICAgICAgPSAwOworICBwRGF0YS0+aUNhbnZhc3dpZHRoICAgICAgICAgID0gMDsgICAgLyogbGV0IHRoZSBhcHAgZGVjaWRlIGR1cmluZyBwcm9jZXNzaGVhZGVyICovCisgIHBEYXRhLT5pQ2FudmFzaGVpZ2h0ICAgICAgICAgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc28gZmFyLCBzbyBnb29kICovCisgIHBEYXRhLT5pRXJyb3Jjb2RlICAgICAgICAgICAgPSBNTkdfTk9FUlJPUjsKKyAgcERhdGEtPmlTZXZlcml0eSAgICAgICAgICAgICA9IDA7CisgIHBEYXRhLT5pRXJyb3J4MSAgICAgICAgICAgICAgPSAwOworICBwRGF0YS0+aUVycm9yeDIgICAgICAgICAgICAgID0gMDsKKyAgcERhdGEtPnpFcnJvcnRleHQgICAgICAgICAgICA9IE1OR19OVUxMOworCisjaWYgZGVmaW5lZChNTkdfU1VQUE9SVF9SRUFEKSB8fCBkZWZpbmVkKE1OR19TVVBQT1JUX1dSSVRFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGV0J3MgYXNzdW1lIHRoZSBiZXN0IHNjZW5hcmlvICovCisjaWZuZGVmIE1OR19OT19PTERfVkVSU0lPTlMKKyAgcERhdGEtPmJQcmVEcmFmdDQ4ICAgICAgICAgICA9IE1OR19GQUxTRTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlIHVua25vd24gY2h1bmsgKi8KKyAgcERhdGEtPmlDaHVua25hbWUgICAgICAgICAgICA9IE1OR19VSU5UX0hVSDsKKyAgcERhdGEtPmlDaHVua3NlcSAgICAgICAgICAgICA9IDA7CisgIHBEYXRhLT5wRmlyc3RjaHVuayAgICAgICAgICAgPSBNTkdfTlVMTDsKKyAgcERhdGEtPnBMYXN0Y2h1bmsgICAgICAgICAgICA9IE1OR19OVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm90aGluZyBwcm9jZXNzZWQgeWV0ICovCisgIHBEYXRhLT5iSGFzaGVhZGVyICAgICAgICAgICAgPSBNTkdfRkFMU0U7CisgIHBEYXRhLT5iSGFzTUhEUiAgICAgICAgICAgICAgPSBNTkdfRkFMU0U7CisgIHBEYXRhLT5iSGFzSUhEUiAgICAgICAgICAgICAgPSBNTkdfRkFMU0U7CisgIHBEYXRhLT5iSGFzQkFTSSAgICAgICAgICAgICAgPSBNTkdfRkFMU0U7CisgIHBEYXRhLT5iSGFzREhEUiAgICAgICAgICAgICAgPSBNTkdfRkFMU0U7CisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisgIHBEYXRhLT5iSGFzSkhEUiAgICAgICAgICAgICAgPSBNTkdfRkFMU0U7CisgIHBEYXRhLT5iSGFzSlNFUCAgICAgICAgICAgICAgPSBNTkdfRkFMU0U7CisgIHBEYXRhLT5iSGFzSkRBQSAgICAgICAgICAgICAgPSBNTkdfRkFMU0U7CisgIHBEYXRhLT5iSGFzSkRBVCAgICAgICAgICAgICAgPSBNTkdfRkFMU0U7CisjZW5kaWYKKyAgcERhdGEtPmJIYXNQTFRFICAgICAgICAgICAgICA9IE1OR19GQUxTRTsKKyAgcERhdGEtPmJIYXNUUk5TICAgICAgICAgICAgICA9IE1OR19GQUxTRTsKKyAgcERhdGEtPmJIYXNHQU1BICAgICAgICAgICAgICA9IE1OR19GQUxTRTsKKyAgcERhdGEtPmJIYXNDSFJNICAgICAgICAgICAgICA9IE1OR19GQUxTRTsKKyAgcERhdGEtPmJIYXNTUkdCICAgICAgICAgICAgICA9IE1OR19GQUxTRTsKKyAgcERhdGEtPmJIYXNJQ0NQICAgICAgICAgICAgICA9IE1OR19GQUxTRTsKKyAgcERhdGEtPmJIYXNCS0dEICAgICAgICAgICAgICA9IE1OR19GQUxTRTsKKyAgcERhdGEtPmJIYXNJREFUICAgICAgICAgICAgICA9IE1OR19GQUxTRTsKKworICBwRGF0YS0+Ykhhc1NBVkUgICAgICAgICAgICAgID0gTU5HX0ZBTFNFOworICBwRGF0YS0+Ykhhc0JBQ0sgICAgICAgICAgICAgID0gTU5HX0ZBTFNFOworICBwRGF0YS0+Ykhhc0ZSQU0gICAgICAgICAgICAgID0gTU5HX0ZBTFNFOworICBwRGF0YS0+Ykhhc1RFUk0gICAgICAgICAgICAgID0gTU5HX0ZBTFNFOworICBwRGF0YS0+Ykhhc0xPT1AgICAgICAgICAgICAgID0gTU5HX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlcmUncyBubyBnbG9iYWwgc3R1ZmYgeWV0IGVpdGhlciAqLworICBwRGF0YS0+Ykhhc2dsb2JhbFBMVEUgICAgICAgID0gTU5HX0ZBTFNFOworICBwRGF0YS0+Ykhhc2dsb2JhbFRSTlMgICAgICAgID0gTU5HX0ZBTFNFOworICBwRGF0YS0+Ykhhc2dsb2JhbEdBTUEgICAgICAgID0gTU5HX0ZBTFNFOworICBwRGF0YS0+Ykhhc2dsb2JhbENIUk0gICAgICAgID0gTU5HX0ZBTFNFOworICBwRGF0YS0+Ykhhc2dsb2JhbFNSR0IgICAgICAgID0gTU5HX0ZBTFNFOworICBwRGF0YS0+Ykhhc2dsb2JhbElDQ1AgICAgICAgID0gTU5HX0ZBTFNFOworCisgIHBEYXRhLT5pRGF0YXdpZHRoICAgICAgICAgICAgPSAwOyAgICAvKiBubyBJSERSL0JBU0kvREhEUiBkb25lIHlldCAqLworICBwRGF0YS0+aURhdGFoZWlnaHQgICAgICAgICAgID0gMDsKKyAgcERhdGEtPmlCaXRkZXB0aCAgICAgICAgICAgICA9IDA7CisgIHBEYXRhLT5pQ29sb3J0eXBlICAgICAgICAgICAgPSAwOworICBwRGF0YS0+aUNvbXByZXNzaW9uICAgICAgICAgID0gMDsKKyAgcERhdGEtPmlGaWx0ZXIgICAgICAgICAgICAgICA9IDA7CisgIHBEYXRhLT5pSW50ZXJsYWNlICAgICAgICAgICAgPSAwOworCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisgIHBEYXRhLT5pSkhEUmNvbG9ydHlwZSAgICAgICAgPSAwOyAgICAvKiBubyBKSERSIGRhdGEgKi8KKyAgcERhdGEtPmlKSERSaW1nYml0ZGVwdGggICAgICA9IDA7CisgIHBEYXRhLT5pSkhEUmltZ2NvbXByZXNzaW9uICAgPSAwOworICBwRGF0YS0+aUpIRFJpbWdpbnRlcmxhY2UgICAgID0gMDsKKyAgcERhdGEtPmlKSERSYWxwaGFiaXRkZXB0aCAgICA9IDA7CisgIHBEYXRhLT5pSkhEUmFscGhhY29tcHJlc3Npb24gPSAwOworICBwRGF0YS0+aUpIRFJhbHBoYWZpbHRlciAgICAgID0gMDsKKyAgcERhdGEtPmlKSERSYWxwaGFpbnRlcmxhY2UgICA9IDA7CisjZW5kaWYKKworI2VuZGlmIC8qIE1OR19TVVBQT1JUX1JFQUQgfHwgTU5HX1NVUFBPUlRfV1JJVEUgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1JFQUQgICAgICAgICAgICAgICAgLyogbm8gcmVhZGluZyBkb25lICovCisgIHBEYXRhLT5iUmVhZGluZyAgICAgICAgICAgICAgPSBNTkdfRkFMU0U7CisgIHBEYXRhLT5iSGF2ZXNpZyAgICAgICAgICAgICAgPSBNTkdfRkFMU0U7CisgIHBEYXRhLT5iRU9GICAgICAgICAgICAgICAgICAgPSBNTkdfRkFMU0U7CisgIHBEYXRhLT5pUmVhZGJ1ZnNpemUgICAgICAgICAgPSAwOworICBwRGF0YS0+cFJlYWRidWYgICAgICAgICAgICAgID0gTU5HX05VTEw7CisKKyAgcERhdGEtPmlMYXJnZWJ1ZnNpemUgICAgICAgICA9IDA7CisgIHBEYXRhLT5wTGFyZ2VidWYgICAgICAgICAgICAgPSBNTkdfTlVMTDsKKworICBwRGF0YS0+aVN1c3BlbmR0aW1lICAgICAgICAgID0gMDsKKyAgcERhdGEtPmJTdXNwZW5kZWQgICAgICAgICAgICA9IE1OR19GQUxTRTsKKyAgcERhdGEtPmlTdXNwZW5kcG9pbnQgICAgICAgICA9IDA7CisKKyAgcERhdGEtPnBTdXNwZW5kYnVmbmV4dCAgICAgICA9IHBEYXRhLT5wU3VzcGVuZGJ1ZjsKKyAgcERhdGEtPmlTdXNwZW5kYnVmbGVmdCAgICAgICA9IDA7CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfUkVBRCAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfV1JJVEUgICAgICAgICAgICAgICAvKiBubyBjcmVhdGluZy93cml0aW5nIGRvbmUgKi8KKyAgcERhdGEtPmJDcmVhdGluZyAgICAgICAgICAgICA9IE1OR19GQUxTRTsKKyAgcERhdGEtPmJXcml0aW5nICAgICAgICAgICAgICA9IE1OR19GQUxTRTsKKyAgcERhdGEtPmlGaXJzdGNodW5rYWRkZWQgICAgICA9IDA7CisgIHBEYXRhLT5pV3JpdGVidWZzaXplICAgICAgICAgPSAwOworICBwRGF0YS0+cFdyaXRlYnVmICAgICAgICAgICAgID0gTU5HX05VTEw7CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfV1JJVEUgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX0RJU1BMQVkgICAgICAgICAgICAgLyogZG9uZSBudXR0aW4nIHlldCAqLworICBwRGF0YS0+YkRpc3BsYXlpbmcgICAgICAgICAgID0gTU5HX0ZBTFNFOworICBwRGF0YS0+aUZyYW1lc2VxICAgICAgICAgICAgID0gMDsKKyAgcERhdGEtPmlMYXllcnNlcSAgICAgICAgICAgICA9IDA7CisgIHBEYXRhLT5pRnJhbWV0aW1lICAgICAgICAgICAgPSAwOworCisgIHBEYXRhLT5pVG90YWxsYXllcnMgICAgICAgICAgPSAwOworICBwRGF0YS0+aVRvdGFsZnJhbWVzICAgICAgICAgID0gMDsKKyAgcERhdGEtPmlUb3RhbHBsYXl0aW1lICAgICAgICA9IDA7CisKKyAgcERhdGEtPmJTa2lwcGluZyAgICAgICAgICAgICA9IE1OR19GQUxTRTsKKworI2lmZGVmIE1OR19TVVBQT1JUX0RZTkFNSUNNTkcKKyAgcERhdGEtPmJEeW5hbWljICAgICAgICAgICAgICA9IE1OR19GQUxTRTsKKyAgcERhdGEtPmJSdW5uaW5nZXZlbnQgICAgICAgICA9IE1OR19GQUxTRTsKKyAgcERhdGEtPmJTdG9wYWZ0ZXJzZWVrICAgICAgICA9IE1OR19GQUxTRTsKKyAgcERhdGEtPmlFdmVudHggICAgICAgICAgICAgICA9IDA7CisgIHBEYXRhLT5pRXZlbnR5ICAgICAgICAgICAgICAgPSAwOworICBwRGF0YS0+cExhc3Rtb3VzZW1vdmUgICAgICAgID0gTU5HX05VTEw7CisjZW5kaWYKKworICBwRGF0YS0+aVJlcXVlc3RmcmFtZSAgICAgICAgID0gMDsKKyAgcERhdGEtPmlSZXF1ZXN0bGF5ZXIgICAgICAgICA9IDA7CisgIHBEYXRhLT5pUmVxdWVzdHRpbWUgICAgICAgICAgPSAwOworICBwRGF0YS0+YlNlYXJjaGluZyAgICAgICAgICAgID0gTU5HX0ZBTFNFOworCisgIHBEYXRhLT5iUmVzdG9yZWJrZ2QgICAgICAgICAgPSBNTkdfRkFMU0U7CisKKyAgcERhdGEtPmlSdW50aW1lICAgICAgICAgICAgICA9IDA7CisgIHBEYXRhLT5pU3luY3RpbWUgICAgICAgICAgICAgPSAwOworICBwRGF0YS0+aVN0YXJ0dGltZSAgICAgICAgICAgID0gMDsKKyAgcERhdGEtPmlFbmR0aW1lICAgICAgICAgICAgICA9IDA7CisgIHBEYXRhLT5iUnVubmluZyAgICAgICAgICAgICAgPSBNTkdfRkFMU0U7CisgIHBEYXRhLT5iVGltZXJzZXQgICAgICAgICAgICAgPSBNTkdfRkFMU0U7CisgIHBEYXRhLT5pQnJlYWtwb2ludCAgICAgICAgICAgPSAwOworICBwRGF0YS0+YlNlY3Rpb253YWl0ICAgICAgICAgID0gTU5HX0ZBTFNFOworICBwRGF0YS0+YkZyZWV6aW5nICAgICAgICAgICAgID0gTU5HX0ZBTFNFOworICBwRGF0YS0+YlJlc2V0dGluZyAgICAgICAgICAgID0gTU5HX0ZBTFNFOworICBwRGF0YS0+Yk5lZWRyZWZyZXNoICAgICAgICAgID0gTU5HX0ZBTFNFOworICBwRGF0YS0+Yk1pc3BsYWNlZFRFUk0gICAgICAgID0gTU5HX0ZBTFNFOworICBwRGF0YS0+Yk9ubHlmaXJzdGZyYW1lICAgICAgID0gTU5HX0ZBTFNFOworICBwRGF0YS0+aUZyYW1lc2FmdGVyVEVSTSAgICAgID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZXNlIGRvbid0IGV4aXN0IHlldCAqLworICBwRGF0YS0+cEN1cnJlbnRvYmogICAgICAgICAgID0gTU5HX05VTEw7CisgIHBEYXRhLT5wQ3VycmFuaW9iaiAgICAgICAgICAgPSBNTkdfTlVMTDsKKyAgcERhdGEtPnBUZXJtYW5pb2JqICAgICAgICAgICA9IE1OR19OVUxMOworICBwRGF0YS0+cExhc3RjbG9uZSAgICAgICAgICAgID0gTU5HX05VTEw7CisgIHBEYXRhLT5wU3RvcmVvYmogICAgICAgICAgICAgPSBNTkdfTlVMTDsKKyAgcERhdGEtPnBTdG9yZWJ1ZiAgICAgICAgICAgICA9IE1OR19OVUxMOworICBwRGF0YS0+cFJldHJpZXZlb2JqICAgICAgICAgID0gTU5HX05VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBubyBzYXZlZCBkYXRhICEgKi8KKyAgcERhdGEtPnBTYXZlZGF0YSAgICAgICAgICAgICA9IE1OR19OVUxMOworCisgIHBEYXRhLT5pVXBkYXRlbGVmdCAgICAgICAgICAgPSAwOyAgICAvKiBubyByZWdpb24gdXBkYXRlZCB5ZXQgKi8KKyAgcERhdGEtPmlVcGRhdGVyaWdodCAgICAgICAgICA9IDA7CisgIHBEYXRhLT5pVXBkYXRldG9wICAgICAgICAgICAgPSAwOworICBwRGF0YS0+aVVwZGF0ZWJvdHRvbSAgICAgICAgID0gMDsKKworICBwRGF0YS0+aVBhc3MgICAgICAgICAgICAgICAgID0gLTE7ICAgLyogaW50ZXJsYWNpbmcgc3R1ZmYgYW5kIHRlbXAgYnVmZmVycyAqLworICBwRGF0YS0+aVJvdyAgICAgICAgICAgICAgICAgID0gMDsKKyAgcERhdGEtPmlSb3dpbmMgICAgICAgICAgICAgICA9IDE7CisgIHBEYXRhLT5pQ29sICAgICAgICAgICAgICAgICAgPSAwOworICBwRGF0YS0+aUNvbGluYyAgICAgICAgICAgICAgID0gMTsKKyAgcERhdGEtPmlSb3dzYW1wbGVzICAgICAgICAgICA9IDA7CisgIHBEYXRhLT5pU2FtcGxlbXVsICAgICAgICAgICAgPSAwOworICBwRGF0YS0+aVNhbXBsZW9mcyAgICAgICAgICAgID0gMDsKKyAgcERhdGEtPmlTYW1wbGVkaXYgICAgICAgICAgICA9IDA7CisgIHBEYXRhLT5pUm93c2l6ZSAgICAgICAgICAgICAgPSAwOworICBwRGF0YS0+aVJvd21heCAgICAgICAgICAgICAgID0gMDsKKyAgcERhdGEtPmlGaWx0ZXJvZnMgICAgICAgICAgICA9IDA7CisgIHBEYXRhLT5pUGl4ZWxvZnMgICAgICAgICAgICAgPSAxOworICBwRGF0YS0+aUxldmVsMCAgICAgICAgICAgICAgID0gMDsKKyAgcERhdGEtPmlMZXZlbDEgICAgICAgICAgICAgICA9IDA7CisgIHBEYXRhLT5pTGV2ZWwyICAgICAgICAgICAgICAgPSAwOworICBwRGF0YS0+aUxldmVsMyAgICAgICAgICAgICAgID0gMDsKKyAgcERhdGEtPnBXb3Jrcm93ICAgICAgICAgICAgICA9IE1OR19OVUxMOworICBwRGF0YS0+cFByZXZyb3cgICAgICAgICAgICAgID0gTU5HX05VTEw7CisgIHBEYXRhLT5wUkdCQXJvdyAgICAgICAgICAgICAgPSBNTkdfTlVMTDsKKyAgcERhdGEtPmJJc1JHQkExNiAgICAgICAgICAgICA9IE1OR19UUlVFOworICBwRGF0YS0+YklzT3BhcXVlICAgICAgICAgICAgID0gTU5HX1RSVUU7CisgIHBEYXRhLT5pRmlsdGVyYnBwICAgICAgICAgICAgPSAxOworCisgIHBEYXRhLT5pU291cmNlbCAgICAgICAgICAgICAgPSAwOyAgICAvKiBhbHdheXMgaW5pdGlhbGl6ZWQganVzdCBiZWZvcmUgKi8KKyAgcERhdGEtPmlTb3VyY2VyICAgICAgICAgICAgICA9IDA7ICAgIC8qIGNvbXBvc2l0aW5nIHRoZSBuZXh0IGxheWVyICovCisgIHBEYXRhLT5pU291cmNldCAgICAgICAgICAgICAgPSAwOworICBwRGF0YS0+aVNvdXJjZWIgICAgICAgICAgICAgID0gMDsKKyAgcERhdGEtPmlEZXN0bCAgICAgICAgICAgICAgICA9IDA7CisgIHBEYXRhLT5pRGVzdHIgICAgICAgICAgICAgICAgPSAwOworICBwRGF0YS0+aURlc3R0ICAgICAgICAgICAgICAgID0gMDsKKyAgcERhdGEtPmlEZXN0YiAgICAgICAgICAgICAgICA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsaXN0cyBhcmUgZW1wdHkgKi8KKyAgcERhdGEtPnBGaXJzdGltZ29iaiAgICAgICAgICA9IE1OR19OVUxMOworICBwRGF0YS0+cExhc3RpbWdvYmogICAgICAgICAgID0gTU5HX05VTEw7CisgIHBEYXRhLT5wRmlyc3RhbmlvYmogICAgICAgICAgPSBNTkdfTlVMTDsKKyAgcERhdGEtPnBMYXN0YW5pb2JqICAgICAgICAgICA9IE1OR19OVUxMOworI2lmZGVmIE1OR19TVVBQT1JUX0RZTkFNSUNNTkcKKyAgcERhdGEtPnBGaXJzdGV2ZW50ICAgICAgICAgICA9IE1OR19OVUxMOworICBwRGF0YS0+cExhc3RldmVudCAgICAgICAgICAgID0gTU5HX05VTEw7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vIHByb2Nlc3NpbmcgY2FsbGJhY2tzICovCisgIHBEYXRhLT5mRGlzcGxheXJvdyAgICAgICAgICAgPSBNTkdfTlVMTDsKKyAgcERhdGEtPmZSZXN0YmtnZHJvdyAgICAgICAgICA9IE1OR19OVUxMOworICBwRGF0YS0+ZkNvcnJlY3Ryb3cgICAgICAgICAgID0gTU5HX05VTEw7CisgIHBEYXRhLT5mUmV0cmlldmVyb3cgICAgICAgICAgPSBNTkdfTlVMTDsKKyAgcERhdGEtPmZTdG9yZXJvdyAgICAgICAgICAgICA9IE1OR19OVUxMOworICBwRGF0YS0+ZlByb2Nlc3Nyb3cgICAgICAgICAgID0gTU5HX05VTEw7CisgIHBEYXRhLT5mRGlmZmVycm93ICAgICAgICAgICAgPSBNTkdfTlVMTDsKKyAgcERhdGEtPmZTY2FsZXJvdyAgICAgICAgICAgICA9IE1OR19OVUxMOworICBwRGF0YS0+ZkRlbHRhcm93ICAgICAgICAgICAgID0gTU5HX05VTEw7CisjaWZuZGVmIE1OR19TS0lQQ0hVTktfUEFTVAorICBwRGF0YS0+ZkZsaXByb3cgICAgICAgICAgICAgID0gTU5HX05VTEw7CisgIHBEYXRhLT5mVGlsZXJvdyAgICAgICAgICAgICAgPSBNTkdfTlVMTDsKKyNlbmRpZgorICBwRGF0YS0+ZkluaXRyb3dwcm9jICAgICAgICAgID0gTU5HX05VTEw7CisKKyAgcERhdGEtPmlQTFRFY291bnQgICAgICAgICAgICA9IDA7ICAgIC8qIG5vIFBMVEUgZGF0YSAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfREVGSQorICBwRGF0YS0+aURFRklvYmplY3RpZCAgICAgICAgID0gMDsgICAgLyogbm8gREVGSSBkYXRhICovCisgIHBEYXRhLT5iREVGSWhhc2Rvbm90c2hvdyAgICAgPSBNTkdfRkFMU0U7CisgIHBEYXRhLT5pREVGSWRvbm90c2hvdyAgICAgICAgPSAwOworICBwRGF0YS0+YkRFRkloYXNjb25jcmV0ZSAgICAgID0gTU5HX0ZBTFNFOworICBwRGF0YS0+aURFRkljb25jcmV0ZSAgICAgICAgID0gMDsKKyAgcERhdGEtPmJERUZJaGFzbG9jYSAgICAgICAgICA9IE1OR19GQUxTRTsKKyAgcERhdGEtPmlERUZJbG9jYXggICAgICAgICAgICA9IDA7CisgIHBEYXRhLT5pREVGSWxvY2F5ICAgICAgICAgICAgPSAwOworICBwRGF0YS0+YkRFRkloYXNjbGlwICAgICAgICAgID0gTU5HX0ZBTFNFOworICBwRGF0YS0+aURFRkljbGlwbCAgICAgICAgICAgID0gMDsKKyAgcERhdGEtPmlERUZJY2xpcHIgICAgICAgICAgICA9IDA7CisgIHBEYXRhLT5pREVGSWNsaXB0ICAgICAgICAgICAgPSAwOworICBwRGF0YS0+aURFRkljbGlwYiAgICAgICAgICAgID0gMDsKKyNlbmRpZgorCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfQkFDSworICBwRGF0YS0+aUJBQ0tyZWQgICAgICAgICAgICAgID0gMDsgICAgLyogbm8gQkFDSyBkYXRhICovCisgIHBEYXRhLT5pQkFDS2dyZWVuICAgICAgICAgICAgPSAwOworICBwRGF0YS0+aUJBQ0tibHVlICAgICAgICAgICAgID0gMDsKKyAgcERhdGEtPmlCQUNLbWFuZGF0b3J5ICAgICAgICA9IDA7CisgIHBEYXRhLT5pQkFDS2ltYWdlaWQgICAgICAgICAgPSAwOworICBwRGF0YS0+aUJBQ0t0aWxlICAgICAgICAgICAgID0gMDsKKyNlbmRpZgorCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfRlJBTQorICBwRGF0YS0+aUZSQU1tb2RlICAgICAgICAgICAgID0gMTsgICAgIC8qIGRlZmF1bHQgZ2xvYmFsIEZSQU0gdmFyaWFibGVzICovCisgIHBEYXRhLT5pRlJBTWRlbGF5ICAgICAgICAgICAgPSAxOworICBwRGF0YS0+aUZSQU10aW1lb3V0ICAgICAgICAgID0gMHg3ZmZmZmZmZmw7CisgIHBEYXRhLT5iRlJBTWNsaXBwaW5nICAgICAgICAgPSBNTkdfRkFMU0U7CisgIHBEYXRhLT5pRlJBTWNsaXBsICAgICAgICAgICAgPSAwOworICBwRGF0YS0+aUZSQU1jbGlwciAgICAgICAgICAgID0gMDsKKyAgcERhdGEtPmlGUkFNY2xpcHQgICAgICAgICAgICA9IDA7CisgIHBEYXRhLT5pRlJBTWNsaXBiICAgICAgICAgICAgPSAwOworCisgIHBEYXRhLT5pRnJhbWVtb2RlICAgICAgICAgICAgPSAxOyAgICAgLyogYWdhaW4gZm9yIHRoZSBjdXJyZW50IGZyYW1lICovCisgIHBEYXRhLT5pRnJhbWVkZWxheSAgICAgICAgICAgPSAxOworICBwRGF0YS0+aUZyYW1ldGltZW91dCAgICAgICAgID0gMHg3ZmZmZmZmZmw7CisgIHBEYXRhLT5iRnJhbWVjbGlwcGluZyAgICAgICAgPSBNTkdfRkFMU0U7CisgIHBEYXRhLT5pRnJhbWVjbGlwbCAgICAgICAgICAgPSAwOworICBwRGF0YS0+aUZyYW1lY2xpcHIgICAgICAgICAgID0gMDsKKyAgcERhdGEtPmlGcmFtZWNsaXB0ICAgICAgICAgICA9IDA7CisgIHBEYXRhLT5pRnJhbWVjbGlwYiAgICAgICAgICAgPSAwOworCisgIHBEYXRhLT5pTmV4dGRlbGF5ICAgICAgICAgICAgPSAxOworI2VuZGlmCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19TSE9XCisgIHBEYXRhLT5pU0hPV21vZGUgICAgICAgICAgICAgPSAwOyAgICAvKiBubyBTSE9XIGRhdGEgKi8KKyAgcERhdGEtPmlTSE9XZnJvbWlkICAgICAgICAgICA9IDA7CisgIHBEYXRhLT5pU0hPV3RvaWQgICAgICAgICAgICAgPSAwOworICBwRGF0YS0+aVNIT1duZXh0aWQgICAgICAgICAgID0gMDsKKyAgcERhdGEtPmlTSE9Xc2tpcCAgICAgICAgICAgICA9IDA7CisjZW5kaWYKKworICBwRGF0YS0+aUdsb2JhbFBMVEVjb3VudCAgICAgID0gMDsgICAgLyogbm8gZ2xvYmFsIFBMVEUgZGF0YSAqLworCisgIHBEYXRhLT5pR2xvYmFsVFJOU3Jhd2xlbiAgICAgPSAwOyAgICAvKiBubyBnbG9iYWwgdFJOUyBkYXRhICovCisKKyAgcERhdGEtPmlHbG9iYWxHYW1tYSAgICAgICAgICA9IDA7ICAgIC8qIG5vIGdsb2JhbCBnQU1BIGRhdGEgKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX2NIUk0KKyAgcERhdGEtPmlHbG9iYWxXaGl0ZXBvaW50eCAgICA9IDA7ICAgIC8qIG5vIGdsb2JhbCBjSFJNIGRhdGEgKi8KKyAgcERhdGEtPmlHbG9iYWxXaGl0ZXBvaW50eSAgICA9IDA7CisgIHBEYXRhLT5pR2xvYmFsUHJpbWFyeXJlZHggICAgPSAwOworICBwRGF0YS0+aUdsb2JhbFByaW1hcnlyZWR5ICAgID0gMDsKKyAgcERhdGEtPmlHbG9iYWxQcmltYXJ5Z3JlZW54ICA9IDA7CisgIHBEYXRhLT5pR2xvYmFsUHJpbWFyeWdyZWVueSAgPSAwOworICBwRGF0YS0+aUdsb2JhbFByaW1hcnlibHVleCAgID0gMDsKKyAgcERhdGEtPmlHbG9iYWxQcmltYXJ5Ymx1ZXkgICA9IDA7CisjZW5kaWYKKworICBwRGF0YS0+aUdsb2JhbFJlbmRpbnRlbnQgICAgID0gMDsgICAgLyogbm8gZ2xvYmFsIHNSR0IgZGF0YSAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfaUNDUAorICBwRGF0YS0+aUdsb2JhbFByb2ZpbGVzaXplICAgID0gMDsgICAgLyogbm8gZ2xvYmFsIGlDQ1AgZGF0YSAqLworICBwRGF0YS0+cEdsb2JhbFByb2ZpbGUgICAgICAgID0gTU5HX05VTEw7CisjZW5kaWYKKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX2JLR0QKKyAgcERhdGEtPmlHbG9iYWxCS0dEcmVkICAgICAgICA9IDA7ICAgIC8qIG5vIGdsb2JhbCBiS0dEIGRhdGEgKi8KKyAgcERhdGEtPmlHbG9iYWxCS0dEZ3JlZW4gICAgICA9IDA7CisgIHBEYXRhLT5pR2xvYmFsQktHRGJsdWUgICAgICAgPSAwOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBubyBkZWx0YS1pbWFnZSAqLworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisgIHBEYXRhLT5wRGVsdGFJbWFnZSAgICAgICAgICAgPSBNTkdfTlVMTDsKKyAgcERhdGEtPmlEZWx0YUltYWdldHlwZSAgICAgICA9IDA7CisgIHBEYXRhLT5pRGVsdGF0eXBlICAgICAgICAgICAgPSAwOworICBwRGF0YS0+aURlbHRhQmxvY2t3aWR0aCAgICAgID0gMDsKKyAgcERhdGEtPmlEZWx0YUJsb2NraGVpZ2h0ICAgICA9IDA7CisgIHBEYXRhLT5pRGVsdGFCbG9ja3ggICAgICAgICAgPSAwOworICBwRGF0YS0+aURlbHRhQmxvY2t5ICAgICAgICAgID0gMDsKKyAgcERhdGEtPmJEZWx0YWltbWVkaWF0ZSAgICAgICA9IE1OR19GQUxTRTsKKworICBwRGF0YS0+ZkRlbHRhZ2V0cm93ICAgICAgICAgID0gTU5HX05VTEw7CisgIHBEYXRhLT5mRGVsdGFhZGRyb3cgICAgICAgICAgPSBNTkdfTlVMTDsKKyAgcERhdGEtPmZEZWx0YXJlcGxhY2Vyb3cgICAgICA9IE1OR19OVUxMOworICBwRGF0YS0+ZkRlbHRhcHV0cm93ICAgICAgICAgID0gTU5HX05VTEw7CisKKyAgcERhdGEtPmZQcm9tb3Rlcm93ICAgICAgICAgICA9IE1OR19OVUxMOworICBwRGF0YS0+ZlByb21CaXRkZXB0aCAgICAgICAgID0gTU5HX05VTEw7CisgIHBEYXRhLT5wUHJvbUJ1ZiAgICAgICAgICAgICAgPSBNTkdfTlVMTDsKKyAgcERhdGEtPmlQcm9tQ29sb3J0eXBlICAgICAgICA9IDA7CisgIHBEYXRhLT5pUHJvbUJpdGRlcHRoICAgICAgICAgPSAwOworICBwRGF0YS0+aVByb21GaWxsdHlwZSAgICAgICAgID0gMDsKKyAgcERhdGEtPmlQcm9tV2lkdGggICAgICAgICAgICA9IDA7CisgIHBEYXRhLT5wUHJvbVNyYyAgICAgICAgICAgICAgPSBNTkdfTlVMTDsKKyAgcERhdGEtPnBQcm9tRHN0ICAgICAgICAgICAgICA9IE1OR19OVUxMOworI2VuZGlmCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19NQUdOCisgIHBEYXRhLT5pTUFHTmZyb21pZCAgICAgICAgICAgPSAwOworICBwRGF0YS0+aU1BR050b2lkICAgICAgICAgICAgID0gMDsKKyNlbmRpZgorCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfUEFTVAorICBwRGF0YS0+aVBhc3R4ICAgICAgICAgICAgICAgID0gMDsKKyAgcERhdGEtPmlQYXN0eSAgICAgICAgICAgICAgICA9IDA7CisjZW5kaWYKKworICBwRGF0YS0+cExhc3RzZWVrICAgICAgICAgICAgID0gTU5HX05VTEw7CisjZW5kaWYKKworI2lmZGVmIE1OR19JTkNMVURFX1pMSUIKKyAgcERhdGEtPmJJbmZsYXRpbmcgICAgICAgICAgICA9IDA7ICAgIC8qIG5vIGluZmxhdGluZyBvciBkZWZsYXRpbmcgKi8KKyAgcERhdGEtPmJEZWZsYXRpbmcgICAgICAgICAgICA9IDA7ICAgIC8qIGdvaW5nIG9uIGF0IHRoZSBtb21lbnQgKi8KKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWSAgICAgICAgICAgICAvKiByZXNldCBvYmplY3QgMCAqLworICBtbmdfcmVzZXRfb2JqemVybyAocERhdGEpOworI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fUkVTRVQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfY2xlYW51cCAobW5nX2hhbmRsZSogaEhhbmRsZSkKK3sKKyAgbW5nX2RhdGFwIHBEYXRhOyAgICAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHZhcnMgKi8KKyNpZm5kZWYgTU5HX0lOVEVSTkFMX01FTU1OR01UCisgIG1uZ19tZW1mcmVlIGZGcmVlOworI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKSpoSGFuZGxlKSwgTU5HX0ZOX0NMRUFOVVAsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKCpoSGFuZGxlKSAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhID0gKChtbmdfZGF0YXApKCpoSGFuZGxlKSk7ICAgICAvKiBhbmQgYWRkcmVzcyBtYWluIHN0cnVjdHVyZSAqLworCisgIG1uZ19yZXNldCAoKmhIYW5kbGUpOyAgICAgICAgICAgICAgICAvKiBkbyBhbiBpbXBsaWNpdCByZXNldCB0byBjbGVhbnVwIG1vc3Qgc3R1ZmYgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX0RJU1BMQVkgICAgICAgICAgICAgLyogZHJvcCBvYmplY3QgMCAqLworICBtbmdfZnJlZV9pbWFnZW9iamVjdCAocERhdGEsIChtbmdfaW1hZ2VwKXBEYXRhLT5wT2JqemVybyk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoTU5HX1NVUFBPUlRfRElTUExBWSkgJiYgZGVmaW5lZChNTkdfRlVMTF9DTVMpCisgIGlmIChwRGF0YS0+aFByb2YyKSAgICAgICAgICAgICAgICAgICAvKiBvdXRwdXQgcHJvZmlsZSBkZWZpbmVkID8gKi8KKyAgICBtbmdsY21zX2ZyZWVwcm9maWxlIChwRGF0YS0+aFByb2YyKTsKKworICBpZiAocERhdGEtPmhQcm9mMykgICAgICAgICAgICAgICAgICAgLyogc1JHQiBwcm9maWxlIGRlZmluZWQgPyAqLworICAgIG1uZ2xjbXNfZnJlZXByb2ZpbGUgKHBEYXRhLT5oUHJvZjMpOworI2VuZGlmIAorCisjaWZkZWYgTU5HX0lOQ0xVREVfWkxJQgorICBtbmd6bGliX2NsZWFudXAgKHBEYXRhKTsgICAgICAgICAgICAgLyogY2xlYW51cCB6bGliIHN0dWZmICovCisjZW5kaWYKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApKmhIYW5kbGUpLCBNTkdfRk5fQ0xFQU5VUCwgTU5HX0xDX0NMRUFOVVApCisjZW5kaWYKKworICBwRGF0YS0+aU1hZ2ljID0gMDsgICAgICAgICAgICAgICAgICAgLyogaW52YWxpZGF0ZSB0aGUgYWN0dWFsIG1lbW9yeSAqLworCisjaWZkZWYgTU5HX0lOVEVSTkFMX01FTU1OR01UCisgIGZyZWUgKCh2b2lkICopKmhIYW5kbGUpOyAgICAgICAgICAgICAvKiBjbGVhbnVwIHRoZSBkYXRhLXN0cnVjdHVyZSAqLworI2Vsc2UKKyAgZkZyZWUgPSAoKG1uZ19kYXRhcCkqaEhhbmRsZSktPmZNZW1mcmVlOworICBmRnJlZSAoKG1uZ19wdHIpKmhIYW5kbGUsIHNpemVvZiAobW5nX2RhdGEpKTsKKyNlbmRpZgorCisgICpoSGFuZGxlID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAvKiB3aXBlIHBvaW50ZXIgdG8gaW5oaWJpdCBmdXR1cmUgdXNlICovCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOyAgICAgICAgICAgICAgICAgIC8qIGFuZCB3ZSdyZSBkb25lICovCit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9SRUFECittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfcmVhZCAobW5nX2hhbmRsZSBoSGFuZGxlKQoreworICBtbmdfZGF0YXAgICBwRGF0YTsgICAgICAgICAgICAgICAgICAgLyogbG9jYWwgdmFycyAqLworICBtbmdfcmV0Y29kZSBpUmV0Y29kZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9SRUFELCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFIChoSGFuZGxlKSAgICAgICAgICAgIC8qIGNoZWNrIHZhbGlkaXR5IGhhbmRsZSBhbmQgY2FsbGJhY2tzICovCisgIHBEYXRhID0gKChtbmdfZGF0YXApaEhhbmRsZSk7ICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworCisjaWZuZGVmIE1OR19JTlRFUk5BTF9NRU1NTkdNVAorICBNTkdfVkFMSURDQiAoaEhhbmRsZSwgZk1lbWFsbG9jKQorICBNTkdfVkFMSURDQiAoaEhhbmRsZSwgZk1lbWZyZWUpCisjZW5kaWYKKworI2lmbmRlZiBNTkdfTk9fT1BFTl9DTE9TRV9TVFJFQU0KKyAgTU5HX1ZBTElEQ0IgKGhIYW5kbGUsIGZPcGVuc3RyZWFtKQorICBNTkdfVkFMSURDQiAoaEhhbmRsZSwgZkNsb3Nlc3RyZWFtKQorI2VuZGlmCisgIE1OR19WQUxJRENCIChoSGFuZGxlLCBmUmVhZGRhdGEpCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZICAgICAgICAgICAgIC8qIHZhbGlkIGF0IHRoaXMgcG9pbnQgPyAqLworICBpZiAoKHBEYXRhLT5iUmVhZGluZykgfHwgKHBEYXRhLT5iRGlzcGxheWluZykpCisjZWxzZQorICBpZiAocERhdGEtPmJSZWFkaW5nKQorI2VuZGlmCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0ZVTkNUSU9OSU5WQUxJRCk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9XUklURQorICBpZiAoKHBEYXRhLT5iV3JpdGluZykgfHwgKHBEYXRhLT5iQ3JlYXRpbmcpKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19GVU5DVElPTklOVkFMSUQpOworI2VuZGlmCisKKyAgaWYgKCFwRGF0YS0+YkNhY2hlcGxheWJhY2spICAgICAgICAgIC8qIG11c3Qgc3RvcmUgcGxheWJhY2sgaW5mbyB0byB3b3JrISEgKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfRlVOQ1RJT05JTlZBTElEKTsKKworICBjbGVhbnVwX2Vycm9ycyAocERhdGEpOyAgICAgICAgICAgICAgLyogY2xlYW51cCBwcmV2aW91cyBlcnJvcnMgKi8KKworICBwRGF0YS0+YlJlYWRpbmcgPSBNTkdfVFJVRTsgICAgICAgICAgLyogcmVhZCBvbmx5ISAqLworCisjaWZuZGVmIE1OR19OT19PUEVOX0NMT1NFX1NUUkVBTQorICBpZiAocERhdGEtPmZPcGVuc3RyZWFtICYmICFwRGF0YS0+Zk9wZW5zdHJlYW0gKGhIYW5kbGUpKQorICAgIC8qIG9wZW4gaXQgYW5kIHN0YXJ0IHJlYWRpbmcgKi8KKyAgICBpUmV0Y29kZSA9IE1OR19BUFBJT0VSUk9SOworICBlbHNlCisjZW5kaWYKKyAgICBpUmV0Y29kZSA9IG1uZ19yZWFkX2dyYXBoaWMgKHBEYXRhKTsKKworICBpZiAocERhdGEtPmJFT0YpICAgICAgICAgICAgICAgICAgICAgLyogYWxyZWFkeSBhdCBFT0YgPyAqLworICB7CisgICAgcERhdGEtPmJSZWFkaW5nID0gTU5HX0ZBTFNFOyAgICAgICAvKiB0aGVuIHdlJ3JlIG5vIGxvbmdlciByZWFkaW5nICovCisgICAgCisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorICAgIG1uZ19yZXNldF9ydW5kYXRhIChwRGF0YSk7ICAgICAgICAgLyogcmVzZXQgcnVuZGF0YSAqLworI2VuZGlmCisgIH0KKworICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICByZXR1cm4gaVJldGNvZGU7CisKKyAgaWYgKHBEYXRhLT5iU3VzcGVuZGVkKSAgICAgICAgICAgICAgIC8qIHJlYWQgc3VzcGVuc2lvbiA/ICovCisgIHsKKyAgICAgaVJldGNvZGUgICAgICAgICAgICA9IE1OR19ORUVETU9SRURBVEE7CisgICAgIHBEYXRhLT5pU3VzcGVuZHRpbWUgPSBwRGF0YS0+ZkdldHRpY2tjb3VudCAoKG1uZ19oYW5kbGUpcERhdGEpOworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fUkVBRCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gaVJldGNvZGU7Cit9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfUkVBRCAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfUkVBRAorbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3JlYWRfcHVzaGRhdGEgKG1uZ19oYW5kbGUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcHRyICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19zaXplX3QgaUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfYm9vbCAgIGJUYWtlb3duZXJzaGlwKQoreworICBtbmdfZGF0YXAgICAgIHBNeURhdGE7ICAgICAgICAgICAgICAgLyogbG9jYWwgdmFycyAqLworICBtbmdfcHVzaGRhdGFwIHBQdXNoOworICBtbmdfcmV0Y29kZSAgIGlSZXRjb2RlOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1JFQURfUFVTSERBVEEsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBNeURhdGEgPSAoKG1uZ19kYXRhcCloSGFuZGxlKTsgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIGEgY29udGFpbmluZyBidWZmZXIgKi8KKyAgaVJldGNvZGUgPSBtYWtlX3B1c2hidWZmZXIgKHBNeURhdGEsIHBEYXRhLCBpTGVuZ3RoLCBiVGFrZW93bmVyc2hpcCwgJnBQdXNoKTsKKyAgaWYgKGlSZXRjb2RlKQorICAgIHJldHVybiBpUmV0Y29kZTsKKworICBpZiAocE15RGF0YS0+cExhc3RwdXNoZGF0YSkgICAgICAgICAgLyogYW5kIHVwZGF0ZSB0aGUgYnVmZmVyIGNoYWluICovCisgICAgcE15RGF0YS0+cExhc3RwdXNoZGF0YS0+cE5leHQgPSBwUHVzaDsKKyAgZWxzZQorICAgIHBNeURhdGEtPnBGaXJzdHB1c2hkYXRhID0gcFB1c2g7CisKKyAgcE15RGF0YS0+cExhc3RwdXNoZGF0YSA9IHBQdXNoOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1JFQURfUFVTSERBVEEsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmIC8qIE1OR19TVVBQT1JUX1JFQUQgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1JFQUQKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19yZWFkX3B1c2hzaWcgKG1uZ19oYW5kbGUgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW1ndHlwZSBlU2lndHlwZSkKK3sKKyAgbW5nX2RhdGFwIHBEYXRhOyAgICAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHZhcnMgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9SRUFEX1BVU0hTSUcsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhID0gKChtbmdfZGF0YXApaEhhbmRsZSk7ICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworCisgIGlmIChwRGF0YS0+YkhhdmVzaWcpICAgICAgICAgICAgICAgICAvKiBjYW4gd2UgZXhwZWN0IHRoaXMgY2FsbCA/ICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0ZVTkNUSU9OSU5WQUxJRCk7CisKKyAgcERhdGEtPmVTaWd0eXBlID0gZVNpZ3R5cGU7CisgIHBEYXRhLT5iSGF2ZXNpZyA9IE1OR19UUlVFOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1JFQURfUFVTSFNJRywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfUkVBRCAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfUkVBRAorbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3JlYWRfcHVzaGNodW5rIChtbmdfaGFuZGxlIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wdHIgICAgcENodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfc2l6ZV90IGlMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgYlRha2Vvd25lcnNoaXApCit7CisgIG1uZ19kYXRhcCAgICAgcE15RGF0YTsgICAgICAgICAgICAgICAvKiBsb2NhbCB2YXJzICovCisgIG1uZ19wdXNoZGF0YXAgcFB1c2g7CisgIG1uZ19yZXRjb2RlICAgaVJldGNvZGU7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fUkVBRF9QVVNIQ0hVTkssIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBNeURhdGEgPSAoKG1uZ19kYXRhcCloSGFuZGxlKTsgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIGEgY29udGFpbmluZyBidWZmZXIgKi8KKyAgaVJldGNvZGUgPSBtYWtlX3B1c2hidWZmZXIgKHBNeURhdGEsIHBDaHVuaywgaUxlbmd0aCwgYlRha2Vvd25lcnNoaXAsICZwUHVzaCk7CisgIGlmIChpUmV0Y29kZSkKKyAgICByZXR1cm4gaVJldGNvZGU7CisKKyAgaWYgKHBNeURhdGEtPnBMYXN0cHVzaGNodW5rKSAgICAgICAgIC8qIGFuZCB1cGRhdGUgdGhlIGJ1ZmZlciBjaGFpbiAqLworICAgIHBNeURhdGEtPnBMYXN0cHVzaGNodW5rLT5wTmV4dCA9IHBQdXNoOworICBlbHNlCisgICAgcE15RGF0YS0+cEZpcnN0cHVzaGNodW5rID0gcFB1c2g7CisKKyAgcE15RGF0YS0+cExhc3RwdXNoY2h1bmsgPSBwUHVzaDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9SRUFEX1BVU0hDSFVOSywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfUkVBRCAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfUkVBRAorbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3JlYWRfcmVzdW1lIChtbmdfaGFuZGxlIGhIYW5kbGUpCit7CisgIG1uZ19kYXRhcCAgIHBEYXRhOyAgICAgICAgICAgICAgICAgICAvKiBsb2NhbCB2YXJzICovCisgIG1uZ19yZXRjb2RlIGlSZXRjb2RlOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1JFQURfUkVTVU1FLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFIChoSGFuZGxlKSAgICAgICAgICAgIC8qIGNoZWNrIHZhbGlkaXR5IGhhbmRsZSAqLworICBwRGF0YSA9ICgobW5nX2RhdGFwKWhIYW5kbGUpOyAgICAgICAgLyogYW5kIG1ha2UgaXQgYWRkcmVzc2FibGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNhbiB3ZSBleHBlY3QgdGhpcyBjYWxsID8gKi8KKyAgaWYgKCghcERhdGEtPmJSZWFkaW5nKSB8fCAoIXBEYXRhLT5iU3VzcGVuZGVkKSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfRlVOQ1RJT05JTlZBTElEKTsKKworICBjbGVhbnVwX2Vycm9ycyAocERhdGEpOyAgICAgICAgICAgICAgLyogY2xlYW51cCBwcmV2aW91cyBlcnJvcnMgKi8KKworICBwRGF0YS0+YlN1c3BlbmRlZCA9IE1OR19GQUxTRTsgICAgICAgLyogcmVzZXQgdGhlIGZsYWcgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX0RJU1BMQVkgICAgICAgICAgICAgLyogcmUtc3luY2hyb25pemUgPyAqLworICBpZiAoKHBEYXRhLT5iRGlzcGxheWluZykgJiYgKHBEYXRhLT5iUnVubmluZykpCisgICAgcERhdGEtPmlTeW5jdGltZSAgPSBwRGF0YS0+aVN5bmN0aW1lIC0gcERhdGEtPmlTdXNwZW5kdGltZSArCisgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZkdldHRpY2tjb3VudCAoaEhhbmRsZSk7CisjZW5kaWYKKworICBpUmV0Y29kZSA9IG1uZ19yZWFkX2dyYXBoaWMgKHBEYXRhKTsgLyogY29udGludWUgcmVhZGluZyBub3cgKi8KKworICBpZiAocERhdGEtPmJFT0YpICAgICAgICAgICAgICAgICAgICAgLyogYXQgRU9GID8gKi8KKyAgeworICAgIHBEYXRhLT5iUmVhZGluZyA9IE1OR19GQUxTRTsgICAgICAgLyogdGhlbiB3ZSdyZSBubyBsb25nZXIgcmVhZGluZyAqLworICAgIAorI2lmZGVmIE1OR19TVVBQT1JUX0RJU1BMQVkKKyAgICBtbmdfcmVzZXRfcnVuZGF0YSAocERhdGEpOyAgICAgICAgIC8qIHJlc2V0IHJ1bmRhdGEgKi8KKyNlbmRpZgorICB9CisKKyAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgcmV0dXJuIGlSZXRjb2RlOworCisgIGlmIChwRGF0YS0+YlN1c3BlbmRlZCkgICAgICAgICAgICAgICAvKiByZWFkIHN1c3BlbnNpb24gPyAqLworICB7CisgICAgIGlSZXRjb2RlICAgICAgICAgICAgPSBNTkdfTkVFRE1PUkVEQVRBOworICAgICBwRGF0YS0+aVN1c3BlbmR0aW1lID0gcERhdGEtPmZHZXR0aWNrY291bnQgKChtbmdfaGFuZGxlKXBEYXRhKTsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1JFQURfUkVTVU1FLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBpUmV0Y29kZTsKK30KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9SRUFEICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9XUklURQorbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3dyaXRlIChtbmdfaGFuZGxlIGhIYW5kbGUpCit7CisgIG1uZ19kYXRhcCAgIHBEYXRhOworICBtbmdfcmV0Y29kZSBpUmV0Y29kZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9XUklURSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkgICAgICAgICAgICAvKiBjaGVjayB2YWxpZGl0eSBoYW5kbGUgYW5kIGNhbGxiYWNrcyAqLworICBwRGF0YSA9ICgobW5nX2RhdGFwKWhIYW5kbGUpOyAgICAgICAgLyogYW5kIG1ha2UgaXQgYWRkcmVzc2FibGUgKi8KKworI2lmbmRlZiBNTkdfSU5URVJOQUxfTUVNTU5HTVQKKyAgTU5HX1ZBTElEQ0IgKGhIYW5kbGUsIGZNZW1hbGxvYykKKyAgTU5HX1ZBTElEQ0IgKGhIYW5kbGUsIGZNZW1mcmVlKQorI2VuZGlmCisKKyNpZm5kZWYgTU5HX05PX09QRU5fQ0xPU0VfU1RSRUFNCisgIE1OR19WQUxJRENCIChoSGFuZGxlLCBmT3BlbnN0cmVhbSkKKyAgTU5HX1ZBTElEQ0IgKGhIYW5kbGUsIGZDbG9zZXN0cmVhbSkKKyNlbmRpZgorICBNTkdfVkFMSURDQiAoaEhhbmRsZSwgZldyaXRlZGF0YSkKKworI2lmZGVmIE1OR19TVVBQT1JUX1JFQUQKKyAgaWYgKHBEYXRhLT5iUmVhZGluZykgICAgICAgICAgICAgICAgIC8qIHZhbGlkIGF0IHRoaXMgcG9pbnQgPyAqLworICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19GVU5DVElPTklOVkFMSUQpOworI2VuZGlmCisKKyAgY2xlYW51cF9lcnJvcnMgKHBEYXRhKTsgICAgICAgICAgICAgIC8qIGNsZWFudXAgcHJldmlvdXMgZXJyb3JzICovCisKKyAgaVJldGNvZGUgPSBtbmdfd3JpdGVfZ3JhcGhpYyAocERhdGEpOy8qIGRvIHRoZSB3cml0ZSAqLworCisgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgIHJldHVybiBpUmV0Y29kZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9XUklURSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfV1JJVEUgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1dSSVRFCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfY3JlYXRlIChtbmdfaGFuZGxlIGhIYW5kbGUpCit7CisgIG1uZ19kYXRhcCAgIHBEYXRhOworICBtbmdfcmV0Y29kZSBpUmV0Y29kZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9DUkVBVEUsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlIGFuZCBjYWxsYmFja3MgKi8KKyAgcERhdGEgPSAoKG1uZ19kYXRhcCloSGFuZGxlKTsgICAgICAgIC8qIGFuZCBtYWtlIGl0IGFkZHJlc3NhYmxlICovCisKKyNpZm5kZWYgTU5HX0lOVEVSTkFMX01FTU1OR01UCisgIE1OR19WQUxJRENCIChoSGFuZGxlLCBmTWVtYWxsb2MpCisgIE1OR19WQUxJRENCIChoSGFuZGxlLCBmTWVtZnJlZSkKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfUkVBRAorICBpZiAocERhdGEtPmJSZWFkaW5nKSAgICAgICAgICAgICAgICAgLyogdmFsaWQgYXQgdGhpcyBwb2ludCA/ICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0ZVTkNUSU9OSU5WQUxJRCk7CisjZW5kaWYKKworICBpZiAoKHBEYXRhLT5iV3JpdGluZykgfHwgKHBEYXRhLT5iQ3JlYXRpbmcpKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19GVU5DVElPTklOVkFMSUQpOworCisgIGNsZWFudXBfZXJyb3JzIChwRGF0YSk7ICAgICAgICAgICAgICAvKiBjbGVhbnVwIHByZXZpb3VzIGVycm9ycyAqLworCisgIGlSZXRjb2RlID0gbW5nX3Jlc2V0IChoSGFuZGxlKTsgICAgICAvKiBjbGVhciBhbnkgcHJldmlvdXMgc3R1ZmYgKi8KKworICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICByZXR1cm4gaVJldGNvZGU7CisKKyAgcERhdGEtPmJDcmVhdGluZyA9IE1OR19UUlVFOyAgICAgICAgIC8qIGluZGljYXRlIHdlJ3JlIGNyZWF0aW5nIGEgbmV3IGZpbGUgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9DUkVBVEUsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmIC8qIE1OR19TVVBQT1JUX1dSSVRFICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZiBkZWZpbmVkKE1OR19TVVBQT1JUX0RJU1BMQVkpICYmIGRlZmluZWQoTU5HX1NVUFBPUlRfUkVBRCkKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19yZWFkZGlzcGxheSAobW5nX2hhbmRsZSBoSGFuZGxlKQoreworICBtbmdfZGF0YXAgICBwRGF0YTsgICAgICAgICAgICAgICAgICAgLyogbG9jYWwgdmFycyAqLworICBtbmdfcmV0Y29kZSBpUmV0Y29kZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9SRUFERElTUExBWSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkgICAgICAgICAgICAvKiBjaGVjayB2YWxpZGl0eSBoYW5kbGUgYW5kIGNhbGxiYWNrcyAqLworICBwRGF0YSA9ICgobW5nX2RhdGFwKWhIYW5kbGUpOyAgICAgICAgLyogYW5kIG1ha2UgaXQgYWRkcmVzc2FibGUgKi8KKworI2lmbmRlZiBNTkdfSU5URVJOQUxfTUVNTU5HTVQKKyAgTU5HX1ZBTElEQ0IgKGhIYW5kbGUsIGZNZW1hbGxvYykKKyAgTU5HX1ZBTElEQ0IgKGhIYW5kbGUsIGZNZW1mcmVlKQorI2VuZGlmCisKKyAgTU5HX1ZBTElEQ0IgKGhIYW5kbGUsIGZSZWFkZGF0YSkKKyAgTU5HX1ZBTElEQ0IgKGhIYW5kbGUsIGZHZXRjYW52YXNsaW5lKQorICBNTkdfVkFMSURDQiAoaEhhbmRsZSwgZlJlZnJlc2gpCisgIE1OR19WQUxJRENCIChoSGFuZGxlLCBmR2V0dGlja2NvdW50KQorICBNTkdfVkFMSURDQiAoaEhhbmRsZSwgZlNldHRpbWVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdmFsaWQgYXQgdGhpcyBwb2ludCA/ICovCisgIGlmICgocERhdGEtPmJSZWFkaW5nKSB8fCAocERhdGEtPmJEaXNwbGF5aW5nKSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfRlVOQ1RJT05JTlZBTElEKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1dSSVRFCisgIGlmICgocERhdGEtPmJXcml0aW5nKSB8fCAocERhdGEtPmJDcmVhdGluZykpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0ZVTkNUSU9OSU5WQUxJRCk7CisjZW5kaWYKKworICBjbGVhbnVwX2Vycm9ycyAocERhdGEpOyAgICAgICAgICAgICAgLyogY2xlYW51cCBwcmV2aW91cyBlcnJvcnMgKi8KKworICBwRGF0YS0+YlJlYWRpbmcgICAgICA9IE1OR19UUlVFOyAgICAgLyogcmVhZCAmIGRpc3BsYXkhICovCisgIHBEYXRhLT5iRGlzcGxheWluZyAgID0gTU5HX1RSVUU7CisgIHBEYXRhLT5iUnVubmluZyAgICAgID0gTU5HX1RSVUU7CisgIHBEYXRhLT5pRnJhbWVzZXEgICAgID0gMDsKKyAgcERhdGEtPmlMYXllcnNlcSAgICAgPSAwOworICBwRGF0YS0+aUZyYW1ldGltZSAgICA9IDA7CisgIHBEYXRhLT5pUmVxdWVzdGZyYW1lID0gMDsKKyAgcERhdGEtPmlSZXF1ZXN0bGF5ZXIgPSAwOworICBwRGF0YS0+aVJlcXVlc3R0aW1lICA9IDA7CisgIHBEYXRhLT5iU2VhcmNoaW5nICAgID0gTU5HX0ZBTFNFOworICBwRGF0YS0+aVJ1bnRpbWUgICAgICA9IDA7CisgIHBEYXRhLT5pU3luY3RpbWUgICAgID0gcERhdGEtPmZHZXR0aWNrY291bnQgKGhIYW5kbGUpOworICBwRGF0YS0+aVN1c3BlbmR0aW1lICA9IDA7CisgIHBEYXRhLT5pU3RhcnR0aW1lICAgID0gcERhdGEtPmlTeW5jdGltZTsKKyAgcERhdGEtPmlFbmR0aW1lICAgICAgPSAwOworCisjaWZuZGVmIE1OR19OT19PUEVOX0NMT1NFX1NUUkVBTQorICBpZiAocERhdGEtPmZPcGVuc3RyZWFtICYmICFwRGF0YS0+Zk9wZW5zdHJlYW0gKGhIYW5kbGUpKQorICAgIC8qIG9wZW4gaXQgYW5kIHN0YXJ0IHJlYWRpbmcgKi8KKyAgICBpUmV0Y29kZSA9IE1OR19BUFBJT0VSUk9SOworICBlbHNlCisjZW5kaWYKKyAgICBpUmV0Y29kZSA9IG1uZ19yZWFkX2dyYXBoaWMgKHBEYXRhKTsKKworICBpZiAocERhdGEtPmJFT0YpICAgICAgICAgICAgICAgICAgICAgLyogYWxyZWFkeSBhdCBFT0YgPyAqLworICB7CisgICAgcERhdGEtPmJSZWFkaW5nID0gTU5HX0ZBTFNFOyAgICAgICAvKiB0aGVuIHdlJ3JlIG5vIGxvbmdlciByZWFkaW5nICovCisgICAgbW5nX2Ryb3BfaW52YWxpZF9vYmplY3RzIChwRGF0YSk7ICAvKiBkcm9wIGludmFsaWRseSBzdG9yZWQgb2JqZWN0cyAqLworICB9CisgIAorICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICByZXR1cm4gaVJldGNvZGU7CisKKyAgaWYgKHBEYXRhLT5iU3VzcGVuZGVkKSAgICAgICAgICAgICAgIC8qIHJlYWQgc3VzcGVuc2lvbiA/ICovCisgIHsKKyAgICAgaVJldGNvZGUgICAgICAgICAgICA9IE1OR19ORUVETU9SRURBVEE7CisgICAgIHBEYXRhLT5pU3VzcGVuZHRpbWUgPSBwRGF0YS0+ZkdldHRpY2tjb3VudCAoKG1uZ19oYW5kbGUpcERhdGEpOworICB9CisgIGVsc2UKKyAgaWYgKHBEYXRhLT5iVGltZXJzZXQpICAgICAgICAgICAgICAgIC8qIGluZGljYXRlIHRpbWVyIGJyZWFrID8gKi8KKyAgICBpUmV0Y29kZSA9IE1OR19ORUVEVElNRVJXQUlUOworICBlbHNlCisgIGlmIChwRGF0YS0+YlNlY3Rpb253YWl0KSAgICAgICAgICAgICAvKiBpbmRpY2F0ZSBzZWN0aW9uIGJyZWFrID8gKi8KKyAgICBpUmV0Y29kZSA9IE1OR19ORUVEU0VDVElPTldBSVQ7CisgIGVsc2UKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vIGJyZWFrcyA9IGVuZCBvZiBydW4gKi8KKyAgICBwRGF0YS0+YlJ1bm5pbmcgPSBNTkdfRkFMU0U7CisKKyAgICBpZiAocERhdGEtPmJGcmVlemluZykgICAgICAgICAgICAgIC8qIGR5bmFtaWMgTU5HIHJlYWNoZWQgU0VFSyA/ICovCisgICAgICBwRGF0YS0+YkZyZWV6aW5nID0gTU5HX0ZBTFNFOyAgICAvKiByZXNldCBpdCAhICovCisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9SRUFERElTUExBWSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gaVJldGNvZGU7Cit9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfRElTUExBWSAmJiBNTkdfU1VQUE9SVF9SRUFEICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfZGlzcGxheSAobW5nX2hhbmRsZSBoSGFuZGxlKQoreworICBtbmdfZGF0YXAgICBwRGF0YTsgICAgICAgICAgICAgICAgICAgLyogbG9jYWwgdmFycyAqLworICBtbmdfcmV0Y29kZSBpUmV0Y29kZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9ESVNQTEFZLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFIChoSGFuZGxlKSAgICAgICAgICAgIC8qIGNoZWNrIHZhbGlkaXR5IGhhbmRsZSBhbmQgY2FsbGJhY2tzICovCisgIHBEYXRhID0gKChtbmdfZGF0YXApaEhhbmRsZSk7ICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworCisjaWZuZGVmIE1OR19JTlRFUk5BTF9NRU1NTkdNVAorICBNTkdfVkFMSURDQiAoaEhhbmRsZSwgZk1lbWFsbG9jKQorICBNTkdfVkFMSURDQiAoaEhhbmRsZSwgZk1lbWZyZWUpCisjZW5kaWYKKworICBNTkdfVkFMSURDQiAoaEhhbmRsZSwgZkdldGNhbnZhc2xpbmUpCisgIE1OR19WQUxJRENCIChoSGFuZGxlLCBmUmVmcmVzaCkKKyAgTU5HX1ZBTElEQ0IgKGhIYW5kbGUsIGZHZXR0aWNrY291bnQpCisgIE1OR19WQUxJRENCIChoSGFuZGxlLCBmU2V0dGltZXIpCisKKyAgaWYgKHBEYXRhLT5iRGlzcGxheWluZykgICAgICAgICAgICAgIC8qIHZhbGlkIGF0IHRoaXMgcG9pbnQgPyAqLworICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19GVU5DVElPTklOVkFMSUQpOworICAgIAorI2lmZGVmIE1OR19TVVBQT1JUX1JFQUQKKyAgaWYgKHBEYXRhLT5iUmVhZGluZykKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfRlVOQ1RJT05JTlZBTElEKTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfV1JJVEUKKyAgaWYgKChwRGF0YS0+YldyaXRpbmcpIHx8IChwRGF0YS0+YkNyZWF0aW5nKSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfRlVOQ1RJT05JTlZBTElEKTsKKyNlbmRpZgorCisgIGNsZWFudXBfZXJyb3JzIChwRGF0YSk7ICAgICAgICAgICAgICAvKiBjbGVhbnVwIHByZXZpb3VzIGVycm9ycyAqLworCisgIHBEYXRhLT5iRGlzcGxheWluZyAgID0gTU5HX1RSVUU7ICAgICAvKiBkaXNwbGF5ISAqLworICBwRGF0YS0+YlJ1bm5pbmcgICAgICA9IE1OR19UUlVFOworICBwRGF0YS0+aUZyYW1lc2VxICAgICA9IDA7CisgIHBEYXRhLT5pTGF5ZXJzZXEgICAgID0gMDsKKyAgcERhdGEtPmlGcmFtZXRpbWUgICAgPSAwOworICBwRGF0YS0+aVJlcXVlc3RmcmFtZSA9IDA7CisgIHBEYXRhLT5pUmVxdWVzdGxheWVyID0gMDsKKyAgcERhdGEtPmlSZXF1ZXN0dGltZSAgPSAwOworICBwRGF0YS0+YlNlYXJjaGluZyAgICA9IE1OR19GQUxTRTsKKyAgcERhdGEtPmlSdW50aW1lICAgICAgPSAwOworICBwRGF0YS0+aVN5bmN0aW1lICAgICA9IHBEYXRhLT5mR2V0dGlja2NvdW50IChoSGFuZGxlKTsKKyNpZmRlZiBNTkdfU1VQUE9SVF9SRUFECisgIHBEYXRhLT5pU3VzcGVuZHRpbWUgID0gMDsKKyNlbmRpZiAgCisgIHBEYXRhLT5pU3RhcnR0aW1lICAgID0gcERhdGEtPmlTeW5jdGltZTsKKyAgcERhdGEtPmlFbmR0aW1lICAgICAgPSAwOworICBwRGF0YS0+cEN1cnJhbmlvYmogICA9IHBEYXRhLT5wRmlyc3RhbmlvYmo7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnbyBkbyBpdCAqLworICBpUmV0Y29kZSA9IG1uZ19wcm9jZXNzX2Rpc3BsYXkgKHBEYXRhKTsKKworICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICByZXR1cm4gaVJldGNvZGU7CisKKyAgaWYgKHBEYXRhLT5iVGltZXJzZXQpICAgICAgICAgICAgICAgIC8qIGluZGljYXRlIHRpbWVyIGJyZWFrID8gKi8KKyAgICBpUmV0Y29kZSA9IE1OR19ORUVEVElNRVJXQUlUOworICBlbHNlCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBubyBicmVha3MgPSBlbmQgb2YgcnVuICovCisgICAgcERhdGEtPmJSdW5uaW5nID0gTU5HX0ZBTFNFOworCisgICAgaWYgKHBEYXRhLT5iRnJlZXppbmcpICAgICAgICAgICAgICAvKiBkeW5hbWljIE1ORyByZWFjaGVkIFNFRUsgPyAqLworICAgICAgcERhdGEtPmJGcmVlemluZyA9IE1OR19GQUxTRTsgICAgLyogcmVzZXQgaXQgISAqLworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fRElTUExBWSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gaVJldGNvZGU7Cit9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfRElTUExBWSAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX2Rpc3BsYXlfcmVzdW1lIChtbmdfaGFuZGxlIGhIYW5kbGUpCit7CisgIG1uZ19kYXRhcCAgIHBEYXRhOyAgICAgICAgICAgICAgICAgICAvKiBsb2NhbCB2YXJzICovCisgIG1uZ19yZXRjb2RlIGlSZXRjb2RlOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0RJU1BMQVlfUkVTVU1FLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFIChoSGFuZGxlKSAgICAgICAgICAgIC8qIGNoZWNrIHZhbGlkaXR5IGhhbmRsZSAqLworICBwRGF0YSA9ICgobW5nX2RhdGFwKWhIYW5kbGUpOyAgICAgICAgLyogYW5kIG1ha2UgaXQgYWRkcmVzc2FibGUgKi8KKworICBpZiAoIXBEYXRhLT5iRGlzcGxheWluZykgICAgICAgICAgICAgLyogY2FuIHdlIGV4cGVjdCB0aGlzIGNhbGwgPyAqLworICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19GVU5DVElPTklOVkFMSUQpOworCisgIGNsZWFudXBfZXJyb3JzIChwRGF0YSk7ICAgICAgICAgICAgICAvKiBjbGVhbnVwIHByZXZpb3VzIGVycm9ycyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd2FzIGl0IHJ1bm5pbmcgPyAqLworICBpZiAoKHBEYXRhLT5iUnVubmluZykgfHwgKHBEYXRhLT5iUmVhZGluZykpCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhcmUgd2UgZXhwZWN0aW5nIHRoaXMgY2FsbCA/ICovCisgICAgaWYgKChwRGF0YS0+YlRpbWVyc2V0KSB8fCAocERhdGEtPmJTdXNwZW5kZWQpIHx8IChwRGF0YS0+YlNlY3Rpb253YWl0KSkgCisgICAgeworICAgICAgcERhdGEtPmJUaW1lcnNldCAgICA9IE1OR19GQUxTRTsgLyogcmVzZXQgdGhlIGZsYWdzICovCisgICAgICBwRGF0YS0+YlNlY3Rpb253YWl0ID0gTU5HX0ZBTFNFOworCisjaWZkZWYgTU5HX1NVUFBPUlRfUkVBRAorICAgICAgaWYgKHBEYXRhLT5iUmVhZGluZykgICAgICAgICAgICAgLyogc2V0IGR1cmluZyByZWFkJmRpc3BsYXkgPyAqLworICAgICAgeworICAgICAgICBpZiAocERhdGEtPmJTdXNwZW5kZWQpICAgICAgICAgLyogY2FsY3VsYXRlIHByb3BlciBzeW5jaHJvbml6YXRpb24gKi8KKyAgICAgICAgICBwRGF0YS0+aVN5bmN0aW1lID0gcERhdGEtPmlTeW5jdGltZSAtIHBEYXRhLT5pU3VzcGVuZHRpbWUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZkdldHRpY2tjb3VudCAoaEhhbmRsZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwRGF0YS0+aVN5bmN0aW1lID0gcERhdGEtPmZHZXR0aWNrY291bnQgKGhIYW5kbGUpOworCisgICAgICAgIHBEYXRhLT5iU3VzcGVuZGVkID0gTU5HX0ZBTFNFOyAvKiBub3cgcmVzZXQgdGhpcyBmbGFnICovICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCBjb250aW51ZSByZWFkaW5nICovCisgICAgICAgIGlSZXRjb2RlID0gbW5nX3JlYWRfZ3JhcGhpYyAocERhdGEpOworCisgICAgICAgIGlmIChwRGF0YS0+YkVPRikgICAgICAgICAgICAgICAvKiBhbHJlYWR5IGF0IEVPRiA/ICovCisgICAgICAgIHsKKyAgICAgICAgICBwRGF0YS0+YlJlYWRpbmcgPSBNTkdfRkFMU0U7IC8qIHRoZW4gd2UncmUgbm8gbG9uZ2VyIHJlYWRpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRyb3AgaW52YWxpZGx5IHN0b3JlZCBvYmplY3RzICovCisgICAgICAgICAgbW5nX2Ryb3BfaW52YWxpZF9vYmplY3RzIChwRGF0YSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9SRUFEICovCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzeW5jaHJvbml6ZSB0aW1pbmcgKi8KKyAgICAgICAgcERhdGEtPmlTeW5jdGltZSA9IHBEYXRhLT5mR2V0dGlja2NvdW50IChoSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlc3VtZSBkaXNwbGF5IHByb2Nlc3NpbmcgKi8KKyAgICAgICAgaVJldGNvZGUgPSBtbmdfcHJvY2Vzc19kaXNwbGF5IChwRGF0YSk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfRlVOQ1RJT05JTlZBTElEKTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3luY2hyb25pemUgdGltaW5nICovCisgICAgcERhdGEtPmlTeW5jdGltZSA9IHBEYXRhLT5mR2V0dGlja2NvdW50IChoSGFuZGxlKTsKKyAgICBwRGF0YS0+YlJ1bm5pbmcgID0gTU5HX1RSVUU7ICAgICAgIC8qIGl0J3MgcmVzdGFydGVkIGFnYWluICEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlc3VtZSBkaXNwbGF5IHByb2Nlc3NpbmcgKi8KKyAgICBpUmV0Y29kZSA9IG1uZ19wcm9jZXNzX2Rpc3BsYXkgKHBEYXRhKTsKKyAgfQorCisgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgIHJldHVybiBpUmV0Y29kZTsKKworICBpZiAocERhdGEtPmJTdXNwZW5kZWQpICAgICAgICAgICAgICAgLyogcmVhZCBzdXNwZW5zaW9uID8gKi8KKyAgeworICAgICBpUmV0Y29kZSAgICAgICAgICAgID0gTU5HX05FRURNT1JFREFUQTsKKyAgICAgcERhdGEtPmlTdXNwZW5kdGltZSA9IHBEYXRhLT5mR2V0dGlja2NvdW50ICgobW5nX2hhbmRsZSlwRGF0YSk7CisgIH0KKyAgZWxzZQorICBpZiAocERhdGEtPmJUaW1lcnNldCkgICAgICAgICAgICAgICAgLyogaW5kaWNhdGUgdGltZXIgYnJlYWsgPyAqLworICAgIGlSZXRjb2RlID0gTU5HX05FRURUSU1FUldBSVQ7CisgIGVsc2UKKyAgaWYgKHBEYXRhLT5iU2VjdGlvbndhaXQpICAgICAgICAgICAgIC8qIGluZGljYXRlIHNlY3Rpb24gYnJlYWsgPyAqLworICAgIGlSZXRjb2RlID0gTU5HX05FRURTRUNUSU9OV0FJVDsKKyAgZWxzZQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm8gYnJlYWtzID0gZW5kIG9mIHJ1biAqLworICAgIHBEYXRhLT5iUnVubmluZyA9IE1OR19GQUxTRTsKKworICAgIGlmIChwRGF0YS0+YkZyZWV6aW5nKSAgICAgICAgICAgICAgLyogdHJ5aW5nIHRvIGZyZWV6ZSA/ICovCisgICAgICBwRGF0YS0+YkZyZWV6aW5nID0gTU5HX0ZBTFNFOyAgICAvKiB0aGVuIHdlJ3JlIHRoZXJlICovCisKKyAgICBpZiAocERhdGEtPmJSZXNldHRpbmcpICAgICAgICAgICAgIC8qIHRyeWluZyB0byByZXNldCBhcyB3ZWxsID8gKi8KKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZ1bGwgc3RvcCEhISAqLworICAgICAgcERhdGEtPmJEaXNwbGF5aW5nID0gTU5HX0ZBTFNFOworCisgICAgICBpUmV0Y29kZSA9IG1uZ19yZXNldF9ydW5kYXRhIChwRGF0YSk7CisKKyAgICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICB9CisgIH0KKyAgCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0RJU1BMQVlfUkVTVU1FLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBpUmV0Y29kZTsKK30KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfZGlzcGxheV9mcmVlemUgKG1uZ19oYW5kbGUgaEhhbmRsZSkKK3sKKyAgbW5nX2RhdGFwIHBEYXRhOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0RJU1BMQVlfRlJFRVpFLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFIChoSGFuZGxlKSAgICAgICAgICAgIC8qIGNoZWNrIHZhbGlkaXR5IGhhbmRsZSAqLworICBwRGF0YSA9ICgobW5nX2RhdGFwKWhIYW5kbGUpOyAgICAgICAgLyogYW5kIG1ha2UgaXQgYWRkcmVzc2FibGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNhbiB3ZSBleHBlY3QgdGhpcyBjYWxsID8gKi8KKyAgaWYgKCghcERhdGEtPmJEaXNwbGF5aW5nKSB8fCAocERhdGEtPmJSZWFkaW5nKSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfRlVOQ1RJT05JTlZBTElEKTsKKworICBjbGVhbnVwX2Vycm9ycyAocERhdGEpOyAgICAgICAgICAgICAgLyogY2xlYW51cCBwcmV2aW91cyBlcnJvcnMgKi8KKworICBpZiAocERhdGEtPmJSdW5uaW5nKSAgICAgICAgICAgICAgICAgLyogaXMgaXQgcnVubmluZyA/ICovCisgIHsKKyAgICBtbmdfcmV0Y29kZSBpUmV0Y29kZTsKKworICAgIHBEYXRhLT5iRnJlZXppbmcgPSBNTkdfVFJVRTsgICAgICAgLyogaW5kaWNhdGUgd2UgbmVlZCB0byBmcmVlemUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbnRpbnVlICJub3JtYWwiIHByb2Nlc3NpbmcgKi8KKyAgICBpUmV0Y29kZSA9IG1uZ19kaXNwbGF5X3Jlc3VtZSAoaEhhbmRsZSk7CisKKyAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICByZXR1cm4gaVJldGNvZGU7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9ESVNQTEFZX0ZSRUVaRSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfRElTUExBWSAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX2Rpc3BsYXlfcmVzZXQgKG1uZ19oYW5kbGUgaEhhbmRsZSkKK3sKKyAgbW5nX2RhdGFwICAgcERhdGE7CisgIG1uZ19yZXRjb2RlIGlSZXRjb2RlOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0RJU1BMQVlfUkVTRVQsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhID0gKChtbmdfZGF0YXApaEhhbmRsZSk7ICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2FuIHdlIGV4cGVjdCB0aGlzIGNhbGwgPyAqLworICBpZiAoKCFwRGF0YS0+YkRpc3BsYXlpbmcpIHx8IChwRGF0YS0+YlJlYWRpbmcpKQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19GVU5DVElPTklOVkFMSUQpOworCisgIGlmICghcERhdGEtPmJDYWNoZXBsYXliYWNrKSAgICAgICAgICAvKiBtdXN0IHN0b3JlIHBsYXliYWNrIGluZm8gdG8gd29yayEhICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0ZVTkNUSU9OSU5WQUxJRCk7CisKKyAgY2xlYW51cF9lcnJvcnMgKHBEYXRhKTsgICAgICAgICAgICAgIC8qIGNsZWFudXAgcHJldmlvdXMgZXJyb3JzICovCisKKyAgaWYgKHBEYXRhLT5iUnVubmluZykgICAgICAgICAgICAgICAgIC8qIGlzIGl0IHJ1bm5pbmcgPyAqLworICB7CisgICAgcERhdGEtPmJGcmVlemluZyAgPSBNTkdfVFJVRTsgICAgICAvKiBpbmRpY2F0ZSB3ZSBuZWVkIHRvIGZyZWV6ZSAqLworICAgIHBEYXRhLT5iUmVzZXR0aW5nID0gTU5HX1RSVUU7ICAgICAgLyogaW5kaWNhdGUgd2UncmUgYWJvdXQgdG8gcmVzZXQgdG9vICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb250aW51ZSBub3JtYWwgcHJvY2Vzc2luZyA/ICovCisgICAgaVJldGNvZGUgPSBtbmdfZGlzcGxheV9yZXN1bWUgKGhIYW5kbGUpOworCisgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgcmV0dXJuIGlSZXRjb2RlOworICB9CisgIGVsc2UKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZ1bGwgc3RvcCEhISAqLworICAgIHBEYXRhLT5iRGlzcGxheWluZyA9IE1OR19GQUxTRTsKKworICAgIGlSZXRjb2RlID0gbW5nX3Jlc2V0X3J1bmRhdGEgKHBEYXRhKTsKKworICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0RJU1BMQVlfUkVTRVQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmIC8qIE1OR19TVVBQT1JUX0RJU1BMQVkgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX0RJU1BMQVkKKyNpZm5kZWYgTU5HX05PX0RJU1BMQVlfR09fU1VQUE9SVEVECittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfZGlzcGxheV9nb2ZyYW1lIChtbmdfaGFuZGxlIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlGcmFtZW5yKQoreworICBtbmdfZGF0YXAgICBwRGF0YTsKKyAgbW5nX3JldGNvZGUgaVJldGNvZGU7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fRElTUExBWV9HT0ZSQU1FLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFIChoSGFuZGxlKSAgICAgICAgICAgIC8qIGNoZWNrIHZhbGlkaXR5IGhhbmRsZSAqLworICBwRGF0YSA9ICgobW5nX2RhdGFwKWhIYW5kbGUpOyAgICAgICAgLyogYW5kIG1ha2UgaXQgYWRkcmVzc2FibGUgKi8KKworICBpZiAocERhdGEtPmVJbWFnZXR5cGUgIT0gbW5nX2l0X21uZykgLyogaXMgaXQgYW4gYW5pbWF0aW9uID8gKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfTk9UQU5BTklNQVRJT04pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2FuIHdlIGV4cGVjdCB0aGlzIGNhbGwgPyAqLworICBpZiAoKCFwRGF0YS0+YkRpc3BsYXlpbmcpIHx8IChwRGF0YS0+YlJ1bm5pbmcpKQorICAgIE1OR19FUlJPUiAoKG1uZ19kYXRhcCloSGFuZGxlLCBNTkdfRlVOQ1RJT05JTlZBTElEKTsKKworICBpZiAoIXBEYXRhLT5iQ2FjaGVwbGF5YmFjaykgICAgICAgICAgLyogbXVzdCBzdG9yZSBwbGF5YmFjayBpbmZvIHRvIHdvcmshISAqLworICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19GVU5DVElPTklOVkFMSUQpOworCisgIGlmIChpRnJhbWVuciA+IHBEYXRhLT5pVG90YWxmcmFtZXMpICAvKiBpcyB0aGUgcGFyYW1ldGVyIHdpdGhpbiBib3VuZHMgPyAqLworICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19GUkFNRU5SVE9PSElHSCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3aXRoaW4gTUhEUiBib3VuZHMgPyAqLworICBpZiAoKHBEYXRhLT5pRnJhbWVjb3VudCkgJiYgKGlGcmFtZW5yID4gcERhdGEtPmlGcmFtZWNvdW50KSkKKyAgICBNTkdfV0FSTklORyAocERhdGEsIE1OR19GUkFNRU5SVE9PSElHSCk7CisKKyAgY2xlYW51cF9lcnJvcnMgKHBEYXRhKTsgICAgICAgICAgICAgIC8qIGNsZWFudXAgcHJldmlvdXMgZXJyb3JzICovCisKKyAgaWYgKHBEYXRhLT5pRnJhbWVzZXEgPiBpRnJhbWVucikgICAgIC8qIHNlYXJjaCBmcm9tIGN1cnJlbnQgb3IgZ28gYmFjayB0byBzdGFydCA/ICovCisgIHsKKyAgICBpUmV0Y29kZSA9IG1uZ19yZXNldF9ydW5kYXRhIChwRGF0YSk7CisgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgcmV0dXJuIGlSZXRjb2RlOworICB9CisKKyAgaWYgKGlGcmFtZW5yKQorICB7CisgICAgcERhdGEtPmlSZXF1ZXN0ZnJhbWUgPSBpRnJhbWVucjsgICAvKiBnbyBmaW5kIHRoZSByZXF1ZXN0ZWQgZnJhbWUgdGhlbiAqLworICAgIGlSZXRjb2RlID0gbW5nX3Byb2Nlc3NfZGlzcGxheSAocERhdGEpOworCisgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgcmV0dXJuIGlSZXRjb2RlOworCisgICAgcERhdGEtPmJUaW1lcnNldCA9IE1OR19GQUxTRTsgICAgICAvKiByZXNldCBqdXN0IHRvIGJlIHNhZmUgKi8KKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0RJU1BMQVlfR09GUkFNRSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCisjaWZuZGVmIE1OR19OT19ESVNQTEFZX0dPX1NVUFBPUlRFRAorbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX2Rpc3BsYXlfZ29sYXllciAobW5nX2hhbmRsZSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpTGF5ZXJucikKK3sKKyAgbW5nX2RhdGFwICAgcERhdGE7CisgIG1uZ19yZXRjb2RlIGlSZXRjb2RlOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0RJU1BMQVlfR09MQVlFUiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkgICAgICAgICAgICAvKiBjaGVjayB2YWxpZGl0eSBoYW5kbGUgKi8KKyAgcERhdGEgPSAoKG1uZ19kYXRhcCloSGFuZGxlKTsgICAgICAgIC8qIGFuZCBtYWtlIGl0IGFkZHJlc3NhYmxlICovCisKKyAgaWYgKHBEYXRhLT5lSW1hZ2V0eXBlICE9IG1uZ19pdF9tbmcpIC8qIGlzIGl0IGFuIGFuaW1hdGlvbiA/ICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX05PVEFOQU5JTUFUSU9OKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNhbiB3ZSBleHBlY3QgdGhpcyBjYWxsID8gKi8KKyAgaWYgKCghcERhdGEtPmJEaXNwbGF5aW5nKSB8fCAocERhdGEtPmJSdW5uaW5nKSkKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfRlVOQ1RJT05JTlZBTElEKTsKKworICBpZiAoIXBEYXRhLT5iQ2FjaGVwbGF5YmFjaykgICAgICAgICAgLyogbXVzdCBzdG9yZSBwbGF5YmFjayBpbmZvIHRvIHdvcmshISAqLworICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19GVU5DVElPTklOVkFMSUQpOworCisgIGlmIChpTGF5ZXJuciA+IHBEYXRhLT5pVG90YWxsYXllcnMpICAvKiBpcyB0aGUgcGFyYW1ldGVyIHdpdGhpbiBib3VuZHMgPyAqLworICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19MQVlFUk5SVE9PSElHSCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3aXRoaW4gTUhEUiBib3VuZHMgPyAqLworICBpZiAoKHBEYXRhLT5pTGF5ZXJjb3VudCkgJiYgKGlMYXllcm5yID4gcERhdGEtPmlMYXllcmNvdW50KSkKKyAgICBNTkdfV0FSTklORyAocERhdGEsIE1OR19MQVlFUk5SVE9PSElHSCk7CisKKyAgY2xlYW51cF9lcnJvcnMgKHBEYXRhKTsgICAgICAgICAgICAgIC8qIGNsZWFudXAgcHJldmlvdXMgZXJyb3JzICovCisKKyAgaWYgKHBEYXRhLT5pTGF5ZXJzZXEgPiBpTGF5ZXJucikgICAgIC8qIHNlYXJjaCBmcm9tIGN1cnJlbnQgb3IgZ28gYmFjayB0byBzdGFydCA/ICovCisgIHsKKyAgICBpUmV0Y29kZSA9IG1uZ19yZXNldF9ydW5kYXRhIChwRGF0YSk7CisgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgcmV0dXJuIGlSZXRjb2RlOworICB9CisKKyAgaWYgKGlMYXllcm5yKQorICB7CisgICAgcERhdGEtPmlSZXF1ZXN0bGF5ZXIgPSBpTGF5ZXJucjsgICAvKiBnbyBmaW5kIHRoZSByZXF1ZXN0ZWQgbGF5ZXIgdGhlbiAqLworICAgIGlSZXRjb2RlID0gbW5nX3Byb2Nlc3NfZGlzcGxheSAocERhdGEpOworCisgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgcmV0dXJuIGlSZXRjb2RlOworCisgICAgcERhdGEtPmJUaW1lcnNldCA9IE1OR19GQUxTRTsgICAgICAvKiByZXNldCBqdXN0IHRvIGJlIHNhZmUgKi8KKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0RJU1BMQVlfR09MQVlFUiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCisjaWZuZGVmIE1OR19OT19ESVNQTEFZX0dPX1NVUFBPUlRFRAorbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX2Rpc3BsYXlfZ290aW1lIChtbmdfaGFuZGxlIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaVBsYXl0aW1lKQoreworICBtbmdfZGF0YXAgICBwRGF0YTsKKyAgbW5nX3JldGNvZGUgaVJldGNvZGU7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fRElTUExBWV9HT1RJTUUsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgaGFuZGxlICovCisgIHBEYXRhID0gKChtbmdfZGF0YXApaEhhbmRsZSk7ICAgICAgICAvKiBhbmQgbWFrZSBpdCBhZGRyZXNzYWJsZSAqLworCisgIGlmIChwRGF0YS0+ZUltYWdldHlwZSAhPSBtbmdfaXRfbW5nKSAvKiBpcyBpdCBhbiBhbmltYXRpb24gPyAqLworICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19OT1RBTkFOSU1BVElPTik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjYW4gd2UgZXhwZWN0IHRoaXMgY2FsbCA/ICovCisgIGlmICgoIXBEYXRhLT5iRGlzcGxheWluZykgfHwgKHBEYXRhLT5iUnVubmluZykpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0ZVTkNUSU9OSU5WQUxJRCk7CisKKyAgaWYgKCFwRGF0YS0+YkNhY2hlcGxheWJhY2spICAgICAgICAgIC8qIG11c3Qgc3RvcmUgcGxheWJhY2sgaW5mbyB0byB3b3JrISEgKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfRlVOQ1RJT05JTlZBTElEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlzIHRoZSBwYXJhbWV0ZXIgd2l0aGluIGJvdW5kcyA/ICovCisgIGlmIChpUGxheXRpbWUgPiBwRGF0YS0+aVRvdGFscGxheXRpbWUpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1BMQVlUSU1FVE9PSElHSCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3aXRoaW4gTUhEUiBib3VuZHMgPyAqLworICBpZiAoKHBEYXRhLT5pUGxheXRpbWUpICYmIChpUGxheXRpbWUgPiBwRGF0YS0+aVBsYXl0aW1lKSkKKyAgICBNTkdfV0FSTklORyAocERhdGEsIE1OR19QTEFZVElNRVRPT0hJR0gpOworCisgIGNsZWFudXBfZXJyb3JzIChwRGF0YSk7ICAgICAgICAgICAgICAvKiBjbGVhbnVwIHByZXZpb3VzIGVycm9ycyAqLworCisgIGlmIChwRGF0YS0+aUZyYW1ldGltZSA+IGlQbGF5dGltZSkgICAvKiBzZWFyY2ggZnJvbSBjdXJyZW50IG9yIGdvIGJhY2sgdG8gc3RhcnQgPyAqLworICB7CisgICAgaVJldGNvZGUgPSBtbmdfcmVzZXRfcnVuZGF0YSAocERhdGEpOworICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgfQorCisgIGlmIChpUGxheXRpbWUpCisgIHsKKyAgICBwRGF0YS0+aVJlcXVlc3R0aW1lID0gaVBsYXl0aW1lOyAgIC8qIGdvIGZpbmQgdGhlIHJlcXVlc3RlZCBwbGF5dGltZSB0aGVuICovCisgICAgaVJldGNvZGUgPSBtbmdfcHJvY2Vzc19kaXNwbGF5IChwRGF0YSk7CisKKyAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICByZXR1cm4gaVJldGNvZGU7CisKKyAgICBwRGF0YS0+YlRpbWVyc2V0ID0gTU5HX0ZBTFNFOyAgICAgIC8qIHJlc2V0IGp1c3QgdG8gYmUgc2FmZSAqLworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fRElTUExBWV9HT1RJTUUsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisjZW5kaWYgLyogTU5HX1NVUFBPUlRfRElTUExBWSAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWYgZGVmaW5lZChNTkdfU1VQUE9SVF9ESVNQTEFZKSAmJiBkZWZpbmVkKE1OR19TVVBQT1JUX0RZTkFNSUNNTkcpCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfdHJhcGV2ZW50IChtbmdfaGFuZGxlIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggIGlFdmVudHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpWSkKK3sKKyAgbW5nX2RhdGFwICAgcERhdGE7CisgIG1uZ19ldmVudHAgIHBFdmVudDsKKyAgbW5nX2Jvb2wgICAgYkZvdW5kID0gTU5HX0ZBTFNFOworICBtbmdfcmV0Y29kZSBpUmV0Y29kZTsKKyAgbW5nX2ltYWdlcCAgcEltYWdlOworICBtbmdfdWludDhwICBwUGl4ZWw7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fVFJBUEVWRU5ULCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFIChoSGFuZGxlKSAgICAgICAgICAgIC8qIGNoZWNrIHZhbGlkaXR5IGhhbmRsZSAqLworICBwRGF0YSA9ICgobW5nX2RhdGFwKWhIYW5kbGUpOyAgICAgICAgLyogYW5kIG1ha2UgaXQgYWRkcmVzc2FibGUgKi8KKworICBpZiAocERhdGEtPmVJbWFnZXR5cGUgIT0gbW5nX2l0X21uZykgLyogaXMgaXQgYW4gYW5pbWF0aW9uID8gKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfTk9UQU5BTklNQVRJT04pOworCisgIGlmICghcERhdGEtPmJEaXNwbGF5aW5nKSAgICAgICAgICAgICAvKiBjYW4gd2UgZXhwZWN0IHRoaXMgY2FsbCA/ICovCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0ZVTkNUSU9OSU5WQUxJRCk7CisKKyAgaWYgKCFwRGF0YS0+YkNhY2hlcGxheWJhY2spICAgICAgICAgIC8qIG11c3Qgc3RvcmUgcGxheWJhY2sgaW5mbyB0byB3b3JrISEgKi8KKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfRlVOQ1RJT05JTlZBTElEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxldCdzIGZpbmQgYSBtYXRjaGluZyBldmVudCBvYmplY3QgKi8KKyAgcEV2ZW50ID0gKG1uZ19ldmVudHApcERhdGEtPnBGaXJzdGV2ZW50OworCisgIHdoaWxlICgocEV2ZW50KSAmJiAoIWJGb3VuZCkpCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXRjaGluZyBldmVudHR5cGUgPyAqLworICAgIGlmIChwRXZlbnQtPmlFdmVudHR5cGUgPT0gaUV2ZW50dHlwZSkKKyAgICB7CisgICAgICBzd2l0Y2ggKHBFdmVudC0+aU1hc2t0eXBlKSAgICAgICAvKiBjaGVjayBYL1kgb24gYmFzaXMgb2YgbWFza3R5cGUgKi8KKyAgICAgIHsKKyAgICAgICAgY2FzZSBNTkdfTUFTS19OT05FIDogICAgICAgICAgIC8qIG5vIG1hc2sgaXMgZWFzeSAqLworICAgICAgICAgIHsKKyAgICAgICAgICAgIGJGb3VuZCA9IE1OR19UUlVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgTU5HX01BU0tfQk9YIDogICAgICAgICAgICAvKiBpbnNpZGUgdGhlIGdpdmVuIGJveCA/ICovCisgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByaWdodC0gYW5kIGJvdHRvbS1ib3JkZXIgZG9uJ3QgY291bnQgISAqLworICAgICAgICAgICAgaWYgKChpWCA+PSBwRXZlbnQtPmlMZWZ0KSAmJiAoaVggPCBwRXZlbnQtPmlSaWdodCkgJiYKKyAgICAgICAgICAgICAgICAoaVkgPj0gcEV2ZW50LT5pVG9wKSAmJiAoaVkgPCBwRXZlbnQtPmlCb3R0b20pKQorICAgICAgICAgICAgICBiRm91bmQgPSBNTkdfVFJVRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgY2FzZSBNTkdfTUFTS19PQkpFQ1QgOiAgICAgICAgIC8qIG5vbi16ZXJvIHBpeGVsIGluIHRoZSBpbWFnZSBvYmplY3QgPyAqLworICAgICAgICAgIHsKKyAgICAgICAgICAgIHBJbWFnZSA9IG1uZ19maW5kX2ltYWdlb2JqZWN0IChwRGF0YSwgcEV2ZW50LT5pT2JqZWN0aWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdmFsaWQgaW1hZ2UgPyAqLworICAgICAgICAgICAgaWYgKChwSW1hZ2UpICYmIChwSW1hZ2UtPnBJbWdidWYtPmlCaXRkZXB0aCA8PSA4KSAmJgorICAgICAgICAgICAgICAgICgocEltYWdlLT5wSW1nYnVmLT5pQ29sb3J0eXBlID09IDApIHx8IChwSW1hZ2UtPnBJbWdidWYtPmlDb2xvcnR5cGUgPT0gMykpICYmCisgICAgICAgICAgICAgICAgKChtbmdfaW50MzIpcEltYWdlLT5wSW1nYnVmLT5pV2lkdGggID4gaVgpICYmCisgICAgICAgICAgICAgICAgKChtbmdfaW50MzIpcEltYWdlLT5wSW1nYnVmLT5pSGVpZ2h0ID4gaVkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBwUGl4ZWwgPSBwSW1hZ2UtPnBJbWdidWYtPnBJbWdkYXRhICsgKChwSW1hZ2UtPnBJbWdidWYtPmlXaWR0aCAqIGlZKSArIGlYKTsKKworICAgICAgICAgICAgICBpZiAoKnBQaXhlbCkgICAgICAgICAgICAgLyogbm9uLXplcm8gPyAqLworICAgICAgICAgICAgICAgIGJGb3VuZCA9IE1OR19UUlVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBNTkdfTUFTS19PQkpFQ1RJWCA6ICAgICAgIC8qIHBpeGVsIGluIHRoZSBpbWFnZSBvYmplY3QgbWF0Y2hlcyBpbmRleCA/ICovCisgICAgICAgICAgeworICAgICAgICAgICAgcEltYWdlID0gbW5nX2ZpbmRfaW1hZ2VvYmplY3QgKHBEYXRhLCBwRXZlbnQtPmlPYmplY3RpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2YWxpZCBpbWFnZSA/ICovCisgICAgICAgICAgICBpZiAoKHBJbWFnZSkgJiYgKHBJbWFnZS0+cEltZ2J1Zi0+aUJpdGRlcHRoIDw9IDgpICYmCisgICAgICAgICAgICAgICAgKChwSW1hZ2UtPnBJbWdidWYtPmlDb2xvcnR5cGUgPT0gMCkgfHwgKHBJbWFnZS0+cEltZ2J1Zi0+aUNvbG9ydHlwZSA9PSAzKSkgJiYKKyAgICAgICAgICAgICAgICAoKG1uZ19pbnQzMilwSW1hZ2UtPnBJbWdidWYtPmlXaWR0aCAgPiBpWCkgJiYgKGlYID49IDApICYmCisgICAgICAgICAgICAgICAgKChtbmdfaW50MzIpcEltYWdlLT5wSW1nYnVmLT5pSGVpZ2h0ID4gaVkpICYmIChpWSA+PSAwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcFBpeGVsID0gcEltYWdlLT5wSW1nYnVmLT5wSW1nZGF0YSArICgocEltYWdlLT5wSW1nYnVmLT5pV2lkdGggKiBpWSkgKyBpWCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXRjaGluZyBpbmRleCA/ICovCisgICAgICAgICAgICAgIGlmICgqcFBpeGVsID09IHBFdmVudC0+aUluZGV4KQorICAgICAgICAgICAgICAgIGJGb3VuZCA9IE1OR19UUlVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBNTkdfTUFTS19CT1hPQkpFQ1QgOiAgICAgIC8qIG5vbi16ZXJvIHBpeGVsIGluIHRoZSBpbWFnZSBvYmplY3QgPyAqLworICAgICAgICAgIHsKKyAgICAgICAgICAgIG1uZ19pbnQzMiBpVGVtcHggPSBpWCAtIHBFdmVudC0+aUxlZnQ7CisgICAgICAgICAgICBtbmdfaW50MzIgaVRlbXB5ID0gaVkgLSBwRXZlbnQtPmlUb3A7CisKKyAgICAgICAgICAgIHBJbWFnZSA9IG1uZ19maW5kX2ltYWdlb2JqZWN0IChwRGF0YSwgcEV2ZW50LT5pT2JqZWN0aWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdmFsaWQgaW1hZ2UgPyAqLworICAgICAgICAgICAgaWYgKChwSW1hZ2UpICYmIChwSW1hZ2UtPnBJbWdidWYtPmlCaXRkZXB0aCA8PSA4KSAmJgorICAgICAgICAgICAgICAgICgocEltYWdlLT5wSW1nYnVmLT5pQ29sb3J0eXBlID09IDApIHx8IChwSW1hZ2UtPnBJbWdidWYtPmlDb2xvcnR5cGUgPT0gMykpICYmCisgICAgICAgICAgICAgICAgKGlUZW1weCA8IChtbmdfaW50MzIpcEltYWdlLT5wSW1nYnVmLT5pV2lkdGgpICYmCisgICAgICAgICAgICAgICAgKGlUZW1weCA+PSAwKSAmJiAoaVggPCBwRXZlbnQtPmlSaWdodCkgJiYKKyAgICAgICAgICAgICAgICAoaVRlbXB5IDwgKG1uZ19pbnQzMilwSW1hZ2UtPnBJbWdidWYtPmlIZWlnaHQpICYmCisgICAgICAgICAgICAgICAgKGlUZW1weSA+PSAwKSAmJiAoaVkgPCBwRXZlbnQtPmlCb3R0b20pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBwUGl4ZWwgPSBwSW1hZ2UtPnBJbWdidWYtPnBJbWdkYXRhICsgKChwSW1hZ2UtPnBJbWdidWYtPmlXaWR0aCAqIGlUZW1weSkgKyBpVGVtcHgpOworCisgICAgICAgICAgICAgIGlmICgqcFBpeGVsKSAgICAgICAgICAgICAvKiBub24temVybyA/ICovCisgICAgICAgICAgICAgICAgYkZvdW5kID0gTU5HX1RSVUU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICBjYXNlIE1OR19NQVNLX0JPWE9CSkVDVElYIDogICAgLyogcGl4ZWwgaW4gdGhlIGltYWdlIG9iamVjdCBtYXRjaGVzIGluZGV4ID8gKi8KKyAgICAgICAgICB7CisgICAgICAgICAgICBtbmdfaW50MzIgaVRlbXB4ID0gaVggLSBwRXZlbnQtPmlMZWZ0OworICAgICAgICAgICAgbW5nX2ludDMyIGlUZW1weSA9IGlZIC0gcEV2ZW50LT5pVG9wOworCisgICAgICAgICAgICBwSW1hZ2UgPSBtbmdfZmluZF9pbWFnZW9iamVjdCAocERhdGEsIHBFdmVudC0+aU9iamVjdGlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZhbGlkIGltYWdlID8gKi8KKyAgICAgICAgICAgIGlmICgocEltYWdlKSAmJiAocEltYWdlLT5wSW1nYnVmLT5pQml0ZGVwdGggPD0gOCkgJiYKKyAgICAgICAgICAgICAgICAoKHBJbWFnZS0+cEltZ2J1Zi0+aUNvbG9ydHlwZSA9PSAwKSB8fCAocEltYWdlLT5wSW1nYnVmLT5pQ29sb3J0eXBlID09IDMpKSAmJgorICAgICAgICAgICAgICAgIChpVGVtcHggPCAobW5nX2ludDMyKXBJbWFnZS0+cEltZ2J1Zi0+aVdpZHRoKSAmJgorICAgICAgICAgICAgICAgIChpVGVtcHggPj0gMCkgJiYgKGlYIDwgcEV2ZW50LT5pUmlnaHQpICYmCisgICAgICAgICAgICAgICAgKGlUZW1weSA8IChtbmdfaW50MzIpcEltYWdlLT5wSW1nYnVmLT5pSGVpZ2h0KSAmJgorICAgICAgICAgICAgICAgIChpVGVtcHkgPj0gMCkgJiYgKGlZIDwgcEV2ZW50LT5pQm90dG9tKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcFBpeGVsID0gcEltYWdlLT5wSW1nYnVmLT5wSW1nZGF0YSArICgocEltYWdlLT5wSW1nYnVmLT5pV2lkdGggKiBpVGVtcHkpICsgaVRlbXB4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1hdGNoaW5nIGluZGV4ID8gKi8KKyAgICAgICAgICAgICAgaWYgKCpwUGl4ZWwgPT0gcEV2ZW50LT5pSW5kZXgpCisgICAgICAgICAgICAgICAgYkZvdW5kID0gTU5HX1RSVUU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgfQorICAgIH0KKworICAgIGlmICghYkZvdW5kKSAgICAgICAgICAgICAgICAgICAgICAgLyogdHJ5IHRoZSBuZXh0IG9uZSAqLworICAgICAgcEV2ZW50ID0gKG1uZ19ldmVudHApcEV2ZW50LT5zSGVhZGVyLnBOZXh0OworICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3VuZCBvbmUgdGhhdCdzIG5vdCB0aGUgbGFzdCBtb3VzZW1vdmUgPyAqLworICBpZiAoKHBFdmVudCkgJiYgKChtbmdfb2JqZWN0cClwRXZlbnQgIT0gcERhdGEtPnBMYXN0bW91c2Vtb3ZlKSkKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNhbiB3ZSBzdGFydCBhbiBldmVudCBwcm9jZXNzIG5vdyA/ICovCisgICAgaWYgKCghcERhdGEtPmJSZWFkaW5nKSAmJiAoIXBEYXRhLT5iUnVubmluZykpCisgICAgeworICAgICAgcERhdGEtPmlFdmVudHggPSBpWDsgICAgICAgICAgICAgLyogc2F2ZSBjb29yZGluYXRlcyAqLworICAgICAgcERhdGEtPmlFdmVudHkgPSBpWTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvIGl0IHRoZW4gISAqLworICAgICAgaVJldGNvZGUgPSBwRXZlbnQtPnNIZWFkZXIuZlByb2Nlc3MgKHBEYXRhLCBwRXZlbnQpOworCisgICAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZW1lbWJlciBsYXN0IG1vdXNlbW92ZSBldmVudCAqLworICAgICAgaWYgKHBFdmVudC0+aUV2ZW50dHlwZSA9PSBNTkdfRVZFTlRfTU9VU0VNT1ZFKQorICAgICAgICBwRGF0YS0+cExhc3Rtb3VzZW1vdmUgPSAobW5nX29iamVjdHApcEV2ZW50OworICAgICAgZWxzZQorICAgICAgICBwRGF0YS0+cExhc3Rtb3VzZW1vdmUgPSBNTkdfTlVMTDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKworICAgICAgLyogVE9ETzogc3RvcmUgdW5wcm9jZXNzZWQgZXZlbnRzIG9yIG5vdCA/Pz8gKi8KKworICAgIH0KKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1RSQVBFVkVOVCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX2dldGxhc3RlcnJvciAobW5nX2hhbmRsZSAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50OCogICAgaVNldmVyaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2NodW5raWQqIGlDaHVua25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyKiAgaUNodW5rc2VxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyKiAgIGlFeHRyYTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIqICAgaUV4dHJhMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wY2hhciogICB6RXJyb3J0ZXh0KQoreworICBtbmdfZGF0YXAgcERhdGE7ICAgICAgICAgICAgICAgICAgICAgLyogbG9jYWwgdmFycyAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVExBU1RFUlJPUiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkgICAgICAgICAgICAvKiBjaGVjayB2YWxpZGl0eSBoYW5kbGUgKi8KKyAgcERhdGEgPSAoKG1uZ19kYXRhcCloSGFuZGxlKTsgICAgICAgIC8qIGFuZCBtYWtlIGl0IGFkZHJlc3NhYmxlICovCisKKyAgKmlTZXZlcml0eSAgPSBwRGF0YS0+aVNldmVyaXR5OyAgICAgIC8qIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgZmllbGRzICovCisKKyNpZiBkZWZpbmVkKE1OR19TVVBQT1JUX1JFQUQpIHx8IGRlZmluZWQoTU5HX1NVUFBPUlRfV1JJVEUpCisgICppQ2h1bmtuYW1lID0gcERhdGEtPmlDaHVua25hbWU7CisgICppQ2h1bmtzZXEgID0gcERhdGEtPmlDaHVua3NlcTsKKyNlbHNlCisgICppQ2h1bmtuYW1lID0gTU5HX1VJTlRfSFVIOworICAqaUNodW5rc2VxICA9IDA7CisjZW5kaWYKKworICAqaUV4dHJhMSAgICA9IHBEYXRhLT5pRXJyb3J4MTsKKyAgKmlFeHRyYTIgICAgPSBwRGF0YS0+aUVycm9yeDI7CisgICp6RXJyb3J0ZXh0ID0gcERhdGEtPnpFcnJvcnRleHQ7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUTEFTVEVSUk9SLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBwRGF0YS0+aUVycm9yY29kZTsgICAgICAgICAgICAvKiBhbmQgdGhlIGVycm9yY29kZSAqLworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiBlbmQgb2YgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKwpkaWZmIC0tZ2l0IGEvZmlsZXMvU291cmNlL0xpYk1ORy9saWJtbmdfanBlZy5jIGIvZmlsZXMvU291cmNlL0xpYk1ORy9saWJtbmdfanBlZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNDJlMWQKLS0tIC9kZXYvbnVsbAorKysgYi9maWxlcy9Tb3VyY2UvTGliTU5HL2xpYm1uZ19qcGVnLmMKQEAgLTAsMCArMSwxMDg4IEBACisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gbGlibW5nLmggICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogcHJvamVjdCAgIDogbGlibW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGZpbGUgICAgICA6IGxpYm1uZ19qcGVnLmMgICAgICAgICAgICAgY29weXJpZ2h0IChjKSAyMDAwLTIwMDQgRy5KdXluICAgKiAqLworLyogKiB2ZXJzaW9uICAgOiAxLjAuOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIHB1cnBvc2UgICA6IEpQRUcgbGlicmFyeSBpbnRlcmZhY2UgKGltcGxlbWVudGF0aW9uKSAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogYXV0aG9yICAgIDogRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBjb21tZW50ICAgOiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSlBFRyBsaWJyYXJ5IGludGVyZmFjZSAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGNoYW5nZXMgICA6IDAuNS4xIC0gMDUvMDgvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNoYW5nZWQgc3RyaWN0LUFOU0kgc3R1ZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4yIC0gMDUvMjIvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGltcGxlbWVudGVkIGFsbCB0aGUgSk5HIHJvdXRpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4zIC0gMDYvMTcvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHRyYWNpbmcgb2YgSlBFRyBjYWxscyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjMgLSAwNi8yNC8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgaW5jbHVzaW9uIG9mIElKRyByZWFkL3dyaXRlIGNvZGUgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMyAtIDA2LzI5LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaXhlZCBzb21lIDY0LWJpdCB3YXJuaW5ncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMiAtIDA4LzA1LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjaGFuZ2VkIGZpbGUtcHJlZml4ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMyAtIDEwLzE2LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBzdXBwb3J0IGZvciBKREFBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuMSAtIDA0LzE5LzIwMDEgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBleHBvcnQgb2YgSlBFRyBmdW5jdGlvbnMgZm9yIERMTCAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC4xIC0gMDQvMjIvMjAwMSAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIG1lbW9yeS1sZWFrcyAoVGhhbmtzIEdyZWdnISkgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC40IC0gMDYvMjIvMjAwMiAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIEI1MjYxMzggLSByZXR1cm5lZCBJSkdTUkM2QiBjYWxsaW5nIGNvbnZlbnRpb24gdG8gICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICBkZWZhdWx0IGZvciBNU1ZDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDI0LzAyLzIwMDMgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBCNjgzMTUyIC0gbGlianBlZyBzdXNwZW5zaW9uIG5vdCBhbHdheXMgaG9ub3JlZCBjb3JyZWN0bHkqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNiAtIDAzLzA0LzIwMDMgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaXhlZCBzb21lIGNvbXBpbGVyLXdhcm5pbmdzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuOCAtIDA4LzAxLzIwMDQgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBzdXBwb3J0IGZvciAzK2J5dGUgcGl4ZWxzaXplIGZvciBKUEVHJ3MgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuOSAtIDEyLzIwLzIwMDQgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjbGVhbmVkIHVwIG1hY3JvLWludm9jYXRpb25zICh0aGFua3MgdG8gRC4gQWlybGllKSAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2luY2x1ZGUgImxpYm1uZy5oIgorI2luY2x1ZGUgImxpYm1uZ19kYXRhLmgiCisjaW5jbHVkZSAibGlibW5nX2Vycm9yLmgiCisjaW5jbHVkZSAibGlibW5nX3RyYWNlLmgiCisjaWZkZWYgX19CT1JMQU5EQ19fCisjcHJhZ21hIGhkcnN0b3AKKyNlbmRpZgorI2luY2x1ZGUgImxpYm1uZ19tZW1vcnkuaCIKKyNpbmNsdWRlICJsaWJtbmdfcGl4ZWxzLmgiCisjaW5jbHVkZSAibGlibW5nX2pwZWcuaCIKKworI2lmIGRlZmluZWQoX19CT1JMQU5EQ19fKSAmJiBkZWZpbmVkKE1OR19TVFJJQ1RfQU5TSSkKKyNwcmFnbWEgb3B0aW9uIC1BICAgICAgICAgICAgICAgICAgICAgIC8qIGZvcmNlIEFOU0ktQyAqLworI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZiBkZWZpbmVkKE1OR19JTkNMVURFX0pORykgJiYgZGVmaW5lZChNTkdfSU5DTFVERV9ESVNQTEFZX1BST0NTKQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogTG9jYWwgSUpHIGNhbGxiYWNrIHJvdXRpbmVzIChzb3VyY2UtbWFuYWdlciwgZXJyb3ItbWFuYWdlciBhbmQgc3VjaCkgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19JTkNMVURFX0lKRzZCCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkdfUkVBRAorI2lmZGVmIE1OR19ERUZJTkVfSlBFR19TVERDQUxMCit2b2lkIE1OR19ERUNMIG1uZ19pbml0X3NvdXJjZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKKyNlbHNlCit2b2lkIG1uZ19pbml0X3NvdXJjZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKKyNlbmRpZgoreworICByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm90aGluZyBuZWVkZWQgKi8KK30KKyNlbmRpZiAvKiBNTkdfSU5DTFVERV9KTkdfUkVBRCAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HX1JFQUQKKyNpZmRlZiBNTkdfREVGSU5FX0pQRUdfU1REQ0FMTAorYm9vbGVhbiBNTkdfREVDTCBtbmdfZmlsbF9pbnB1dF9idWZmZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCisjZWxzZQorYm9vbGVhbiBtbmdfZmlsbF9pbnB1dF9idWZmZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCisjZW5kaWYKK3sKKyAgcmV0dXJuIEZBTFNFOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvcmNlIElKRyByb3V0aW5lIHRvIHJldHVybiB0byBjYWxsZXIgKi8KK30KKyNlbmRpZiAvKiBNTkdfSU5DTFVERV9KTkdfUkVBRCAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HX1JFQUQKKyNpZmRlZiBNTkdfREVGSU5FX0pQRUdfU1REQ0FMTAordm9pZCBNTkdfREVDTCBtbmdfc2tpcF9pbnB1dF9kYXRhIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBsb25nIG51bV9ieXRlcykKKyNlbHNlCit2b2lkIG1uZ19za2lwX2lucHV0X2RhdGEgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGxvbmcgbnVtX2J5dGVzKQorI2VuZGlmCit7CisgIGlmIChudW1fYnl0ZXMgPiAwKSAgICAgICAgICAgICAgICAgICAvKiBpZ25vcmUgZm9ueSBjYWxscyAqLworICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkcmVzcyBteSBnZW5lcmljIHN0cnVjdHVyZSAqLworICAgIG1uZ19kYXRhcCBwRGF0YSA9IChtbmdfZGF0YXApY2luZm8tPmNsaWVudF9kYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkcmVzcyBzb3VyY2UgbWFuYWdlciAqLworICAgIG1uZ2pwZWdfc291cmNlcCBwU3JjID0gcERhdGEtPnBKUEVHZGluZm8tPnNyYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByb2JsZW0gc2NlbmFyaW8gPyAqLworICAgIGlmIChwU3JjLT5ieXRlc19pbl9idWZmZXIgPCAoc2l6ZV90KW51bV9ieXRlcykKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRlbGwgdGhlIGJvc3Mgd2UgbmVlZCB0byBza2lwIHNvbWUgZGF0YSEgKi8KKyAgICAgIHBEYXRhLT5pSlBFR3Rvc2tpcCA9IChtbmdfdWludDMyKSgoc2l6ZV90KW51bV9ieXRlcyAtIHBTcmMtPmJ5dGVzX2luX2J1ZmZlcik7CisKKyAgICAgIHBTcmMtPmJ5dGVzX2luX2J1ZmZlciA9IDA7ICAgICAgIC8qIGxldCB0aGUgSlBFRyBsaWIgc3VzcGVuZCAqLworICAgICAgcFNyYy0+bmV4dF9pbnB1dF9ieXRlID0gTU5HX05VTEw7CisgICAgfQorICAgIGVsc2UKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNpbXBseSBhZHZhbmNlIGluIHRoZSBidWZmZXIgKi8KKyAgICAgIHBTcmMtPmJ5dGVzX2luX2J1ZmZlciAtPSBudW1fYnl0ZXM7CisgICAgICBwU3JjLT5uZXh0X2lucHV0X2J5dGUgKz0gbnVtX2J5dGVzOworICAgIH0KKyAgfQorCisgIHJldHVybjsKK30KKyNlbmRpZiAvKiBNTkdfSU5DTFVERV9KTkdfUkVBRCAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HX1JFQUQKKyNpZmRlZiBNTkdfREVGSU5FX0pQRUdfU1REQ0FMTAordm9pZCBNTkdfREVDTCBtbmdfc2tpcF9pbnB1dF9kYXRhMiAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgbG9uZyBudW1fYnl0ZXMpCisjZWxzZQordm9pZCBtbmdfc2tpcF9pbnB1dF9kYXRhMiAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgbG9uZyBudW1fYnl0ZXMpCisjZW5kaWYKK3sKKyAgaWYgKG51bV9ieXRlcyA+IDApICAgICAgICAgICAgICAgICAgIC8qIGlnbm9yZSBmb255IGNhbGxzICovCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGRyZXNzIG15IGdlbmVyaWMgc3RydWN0dXJlICovCisgICAgbW5nX2RhdGFwIHBEYXRhID0gKG1uZ19kYXRhcCljaW5mby0+Y2xpZW50X2RhdGE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGRyZXNzIHNvdXJjZSBtYW5hZ2VyICovCisgICAgbW5nanBlZ19zb3VyY2VwIHBTcmMgPSBwRGF0YS0+cEpQRUdkaW5mbzItPnNyYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByb2JsZW0gc2NlbmFyaW8gPyAqLworICAgIGlmIChwU3JjLT5ieXRlc19pbl9idWZmZXIgPCAoc2l6ZV90KW51bV9ieXRlcykKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRlbGwgdGhlIGJvc3Mgd2UgbmVlZCB0byBza2lwIHNvbWUgZGF0YSEgKi8KKyAgICAgIHBEYXRhLT5pSlBFR3Rvc2tpcDIgPSAobW5nX3VpbnQzMikoKHNpemVfdCludW1fYnl0ZXMgLSBwU3JjLT5ieXRlc19pbl9idWZmZXIpOworCisgICAgICBwU3JjLT5ieXRlc19pbl9idWZmZXIgPSAwOyAgICAgICAvKiBsZXQgdGhlIEpQRUcgbGliIHN1c3BlbmQgKi8KKyAgICAgIHBTcmMtPm5leHRfaW5wdXRfYnl0ZSA9IE1OR19OVUxMOworICAgIH0KKyAgICBlbHNlCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaW1wbHkgYWR2YW5jZSBpbiB0aGUgYnVmZmVyICovCisgICAgICBwU3JjLT5ieXRlc19pbl9idWZmZXIgLT0gbnVtX2J5dGVzOworICAgICAgcFNyYy0+bmV4dF9pbnB1dF9ieXRlICs9IG51bV9ieXRlczsKKyAgICB9CisgIH0KKworICByZXR1cm47Cit9CisjZW5kaWYgLyogTU5HX0lOQ0xVREVfSk5HX1JFQUQgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19JTkNMVURFX0pOR19SRUFECisjaWZkZWYgTU5HX0RFRklORV9KUEVHX1NURENBTEwKK3ZvaWQgTU5HX0RFQ0wgbW5nX3Rlcm1fc291cmNlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQorI2Vsc2UKK3ZvaWQgbW5nX3Rlcm1fc291cmNlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQorI2VuZGlmCit7CisgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3RoaW5nIG5lZWRlZCAqLworfQorI2VuZGlmIC8qIE1OR19JTkNMVURFX0pOR19SRUFEICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfVVNFX1NFVEpNUAorI2lmZGVmIE1OR19ERUZJTkVfSlBFR19TVERDQUxMCit2b2lkIE1OR19ERUNMIG1uZ19lcnJvcl9leGl0IChqX2NvbW1vbl9wdHIgY2luZm8pCisjZWxzZQordm9pZCBtbmdfZXJyb3JfZXhpdCAoal9jb21tb25fcHRyIGNpbmZvKQorI2VuZGlmCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGRyZXNzIG15IGdlbmVyaWMgc3RydWN0dXJlICovCisgIG1uZ19kYXRhcCBwRGF0YSA9IChtbmdfZGF0YXApY2luZm8tPmNsaWVudF9kYXRhOworCisjaWZkZWYgTU5HX0VSUk9SX1RFTExUQUxFICAgICAgICAgICAgICAvKiBmaWxsIHRoZSBtZXNzYWdlIHRleHQgPz8/ICovCisgICgqY2luZm8tPmVyci0+b3V0cHV0X21lc3NhZ2UpIChjaW5mbyk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJldHVybiB0byB0aGUgcG9pbnQgb2Ygbm8gcmV0dXJuLi4uICovCisgIGxvbmdqbXAgKHBEYXRhLT5zRXJyb3JidWYsIGNpbmZvLT5lcnItPm1zZ19jb2RlKTsKK30KKyNlbmRpZiAvKiBNTkdfVVNFX1NFVEpNUCAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX1VTRV9TRVRKTVAKKyNpZmRlZiBNTkdfREVGSU5FX0pQRUdfU1REQ0FMTAordm9pZCBNTkdfREVDTCBtbmdfb3V0cHV0X21lc3NhZ2UgKGpfY29tbW9uX3B0ciBjaW5mbykKKyNlbHNlCit2b2lkIG1uZ19vdXRwdXRfbWVzc2FnZSAoal9jb21tb25fcHRyIGNpbmZvKQorI2VuZGlmCit7CisgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBqdXN0IGRvIG5vdGhpbmcgISAqLworfQorI2VuZGlmIC8qIE1OR19VU0VfU0VUSk1QICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNlbmRpZiAvKiBNTkdfSU5DTFVERV9JSkc2QiAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogR2xvYmFsIEpQRUcgcm91dGluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nanBlZ19pbml0aWFsaXplIChtbmdfZGF0YXAgcERhdGEpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0pQRUdfSU5JVElBTElaRSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWxsb2NhdGUgc3BhY2UgZm9yIEpQRUcgc3RydWN0dXJlcyBpZiBuZWNlc3NhcnkgKi8KKyNpZmRlZiBNTkdfSU5DTFVERV9KTkdfUkVBRAorICBpZiAocERhdGEtPnBKUEVHZGVyciAgID09IE1OR19OVUxMKQorICAgIE1OR19BTExPQyAocERhdGEsIHBEYXRhLT5wSlBFR2RlcnIsICAgc2l6ZW9mIChtbmdqcGVnX2Vycm9yICkpOworICBpZiAocERhdGEtPnBKUEVHZHNyYyAgID09IE1OR19OVUxMKQorICAgIE1OR19BTExPQyAocERhdGEsIHBEYXRhLT5wSlBFR2RzcmMsICAgc2l6ZW9mIChtbmdqcGVnX3NvdXJjZSkpOworICBpZiAocERhdGEtPnBKUEVHZGluZm8gID09IE1OR19OVUxMKQorICAgIE1OR19BTExPQyAocERhdGEsIHBEYXRhLT5wSlBFR2RpbmZvLCAgc2l6ZW9mIChtbmdqcGVnX2RlY29tcCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5hYmxlIHJldmVyc2UgYWRkcmVzc2luZyAqLworICBwRGF0YS0+cEpQRUdkaW5mby0+Y2xpZW50X2RhdGEgID0gcERhdGE7CisKKyAgaWYgKHBEYXRhLT5wSlBFR2RlcnIyICA9PSBNTkdfTlVMTCkKKyAgICBNTkdfQUxMT0MgKHBEYXRhLCBwRGF0YS0+cEpQRUdkZXJyMiwgIHNpemVvZiAobW5nanBlZ19lcnJvciApKTsKKyAgaWYgKHBEYXRhLT5wSlBFR2RzcmMyICA9PSBNTkdfTlVMTCkKKyAgICBNTkdfQUxMT0MgKHBEYXRhLCBwRGF0YS0+cEpQRUdkc3JjMiwgIHNpemVvZiAobW5nanBlZ19zb3VyY2UpKTsKKyAgaWYgKHBEYXRhLT5wSlBFR2RpbmZvMiA9PSBNTkdfTlVMTCkKKyAgICBNTkdfQUxMT0MgKHBEYXRhLCBwRGF0YS0+cEpQRUdkaW5mbzIsIHNpemVvZiAobW5nanBlZ19kZWNvbXApKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuYWJsZSByZXZlcnNlIGFkZHJlc3NpbmcgKi8KKyAgcERhdGEtPnBKUEVHZGluZm8yLT5jbGllbnRfZGF0YSA9IHBEYXRhOworI2VuZGlmCisKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkdfV1JJVEUKKyAgaWYgKHBEYXRhLT5wSlBFR2NlcnIgID09IE1OR19OVUxMKQorICAgIE1OR19BTExPQyAocERhdGEsIHBEYXRhLT5wSlBFR2NlcnIsICBzaXplb2YgKG1uZ2pwZWdfZXJyb3IgKSk7CisgIGlmIChwRGF0YS0+cEpQRUdjaW5mbyA9PSBNTkdfTlVMTCkKKyAgICBNTkdfQUxMT0MgKHBEYXRhLCBwRGF0YS0+cEpQRUdjaW5mbywgc2l6ZW9mIChtbmdqcGVnX2NvbXAgICkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5hYmxlIHJldmVyc2UgYWRkcmVzc2luZyAqLworICBwRGF0YS0+cEpQRUdjaW5mby0+Y2xpZW50X2RhdGEgPSBwRGF0YTsKKyNlbmRpZgorCisgIGlmIChwRGF0YS0+cEpQRUdidWYgICA9PSBNTkdfTlVMTCkgICAvKiBpbml0aWFsaXplIHRlbXBvcmFyeSBidWZmZXJzICovCisgIHsKKyAgICBwRGF0YS0+aUpQRUdidWZtYXggICAgID0gTU5HX0pQRUdfTUFYQlVGOworICAgIE1OR19BTExPQyAocERhdGEsIHBEYXRhLT5wSlBFR2J1ZiwgcERhdGEtPmlKUEVHYnVmbWF4KTsKKyAgfQorCisgIGlmIChwRGF0YS0+cEpQRUdidWYyICA9PSBNTkdfTlVMTCkgCisgIHsKKyAgICBwRGF0YS0+aUpQRUdidWZtYXgyICAgID0gTU5HX0pQRUdfTUFYQlVGOworICAgIE1OR19BTExPQyAocERhdGEsIHBEYXRhLT5wSlBFR2J1ZjIsIHBEYXRhLT5pSlBFR2J1Zm1heDIpOworICB9CisKKyAgcERhdGEtPnBKUEVHY3VycmVudCAgICAgID0gcERhdGEtPnBKUEVHYnVmOworICBwRGF0YS0+aUpQRUdidWZyZW1haW4gICAgPSAwOworICBwRGF0YS0+cEpQRUdyb3cgICAgICAgICAgPSBNTkdfTlVMTDsKKyAgcERhdGEtPmlKUEVHcm93bGVuICAgICAgID0gMDsKKyAgcERhdGEtPmlKUEVHdG9za2lwICAgICAgID0gMDsKKworICBwRGF0YS0+cEpQRUdjdXJyZW50MiAgICAgPSBwRGF0YS0+cEpQRUdidWYyOworICBwRGF0YS0+aUpQRUdidWZyZW1haW4yICAgPSAwOworICBwRGF0YS0+cEpQRUdyb3cyICAgICAgICAgPSBNTkdfTlVMTDsKKyAgcERhdGEtPmlKUEVHcm93bGVuMiAgICAgID0gMDsKKyAgcERhdGEtPmlKUEVHdG9za2lwMiAgICAgID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm90IGRvaW5nIGFueXRoaW5nIHlldCAhICovCisgIHBEYXRhLT5iSlBFR2NvbXByZXNzICAgICA9IE1OR19GQUxTRTsKKyAgCisgIHBEYXRhLT5iSlBFR2RlY29tcHJlc3MgICA9IE1OR19GQUxTRTsKKyAgcERhdGEtPmJKUEVHaGFzaGVhZGVyICAgID0gTU5HX0ZBTFNFOworICBwRGF0YS0+YkpQRUdkZWNvc3RhcnRlZCAgPSBNTkdfRkFMU0U7CisgIHBEYXRhLT5iSlBFR3NjYW5zdGFydGVkICA9IE1OR19GQUxTRTsKKyAgcERhdGEtPmJKUEVHc2NhbmVuZGluZyAgID0gTU5HX0ZBTFNFOworCisgIHBEYXRhLT5iSlBFR2RlY29tcHJlc3MyICA9IE1OR19GQUxTRTsKKyAgcERhdGEtPmJKUEVHaGFzaGVhZGVyMiAgID0gTU5HX0ZBTFNFOworICBwRGF0YS0+YkpQRUdkZWNvc3RhcnRlZDIgPSBNTkdfRkFMU0U7CisgIHBEYXRhLT5iSlBFR3NjYW5zdGFydGVkMiA9IE1OR19GQUxTRTsKKworICBwRGF0YS0+aUpQRUdyb3cgICAgICAgICAgPSAwOyAgICAgICAgLyogemVybyBpbnB1dC9vdXRwdXQgbGluZXMgKi8KKyAgcERhdGEtPmlKUEVHYWxwaGFyb3cgICAgID0gMDsKKyAgcERhdGEtPmlKUEVHcmdicm93ICAgICAgID0gMDsKKyAgcERhdGEtPmlKUEVHZGlzcHJvdyAgICAgID0gMDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9KUEVHX0lOSVRJQUxJWkUsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdqcGVnX2NsZWFudXAgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyNpZiBkZWZpbmVkKE1OR19JTkNMVURFX0lKRzZCKSAmJiBkZWZpbmVkKE1OR19VU0VfU0VUSk1QKQorICBtbmdfcmV0Y29kZSBpUmV0Y29kZTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0pQRUdfQ0xFQU5VUCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX0lOQ0xVREVfSUpHNkIKKyNpZmRlZiBNTkdfVVNFX1NFVEpNUAorICBpUmV0Y29kZSA9IHNldGptcCAocERhdGEtPnNFcnJvcmJ1Zik7Lyogc2V0dXAgbG9jYWwgSlBFRyBlcnJvci1yZWNvdmVyeSAqLworICBpZiAoaVJldGNvZGUgIT0gMCkgICAgICAgICAgICAgICAgICAgLyogZ290IGhlcmUgZnJvbSBsb25nam1wID8gKi8KKyAgICBNTkdfRVJST1JKIChwRGF0YSwgaVJldGNvZGUpOyAgICAgIC8qIHRoZW4gSUpHLWxpYiBpc3N1ZWQgYW4gZXJyb3IgKi8KKyNlbmRpZgorCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HX1JFQUQgICAgICAgICAgICAvKiBzdGlsbCBkZWNvbXByZXNzaW5nIHNvbWV0aGluZyA/ICovCisgIGlmIChwRGF0YS0+YkpQRUdkZWNvbXByZXNzKQorICAgIGpwZWdfZGVzdHJveV9kZWNvbXByZXNzIChwRGF0YS0+cEpQRUdkaW5mbyk7CisgIGlmIChwRGF0YS0+YkpQRUdkZWNvbXByZXNzMikKKyAgICBqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcyAocERhdGEtPnBKUEVHZGluZm8yKTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HX1dSSVRFCisgIGlmIChwRGF0YS0+YkpQRUdjb21wcmVzcykgICAgICAgICAgICAvKiBzdGlsbCBjb21wcmVzc2luZyBzb21ldGhpbmcgPyAqLworICAgIGpwZWdfZGVzdHJveV9jb21wcmVzcyAocERhdGEtPnBKUEVHY2luZm8pOworI2VuZGlmCisKKyNlbmRpZiAvKiBNTkdfSU5DTFVERV9JSkc2QiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2xlYW51cCB0ZW1wb3JhcnkgYnVmZmVycyAqLworICBNTkdfRlJFRSAocERhdGEsIHBEYXRhLT5wSlBFR2J1ZjIsIHBEYXRhLT5pSlBFR2J1Zm1heDIpOworICBNTkdfRlJFRSAocERhdGEsIHBEYXRhLT5wSlBFR2J1ZiwgIHBEYXRhLT5pSlBFR2J1Zm1heCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjbGVhbnVwIHNwYWNlIGZvciBKUEVHIHN0cnVjdHVyZXMgKi8KKyNpZmRlZiBNTkdfSU5DTFVERV9KTkdfV1JJVEUKKyAgTU5HX0ZSRUUgKHBEYXRhLCBwRGF0YS0+cEpQRUdjaW5mbywgIHNpemVvZiAobW5nanBlZ19jb21wICApKTsKKyAgTU5HX0ZSRUUgKHBEYXRhLCBwRGF0YS0+cEpQRUdjZXJyLCAgIHNpemVvZiAobW5nanBlZ19lcnJvciApKTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HX1JFQUQKKyAgTU5HX0ZSRUUgKHBEYXRhLCBwRGF0YS0+cEpQRUdkaW5mbywgIHNpemVvZiAobW5nanBlZ19kZWNvbXApKTsKKyAgTU5HX0ZSRUUgKHBEYXRhLCBwRGF0YS0+cEpQRUdkc3JjLCAgIHNpemVvZiAobW5nanBlZ19zb3VyY2UpKTsKKyAgTU5HX0ZSRUUgKHBEYXRhLCBwRGF0YS0+cEpQRUdkZXJyLCAgIHNpemVvZiAobW5nanBlZ19lcnJvciApKTsKKyAgTU5HX0ZSRUUgKHBEYXRhLCBwRGF0YS0+cEpQRUdkaW5mbzIsIHNpemVvZiAobW5nanBlZ19kZWNvbXApKTsKKyAgTU5HX0ZSRUUgKHBEYXRhLCBwRGF0YS0+cEpQRUdkc3JjMiwgIHNpemVvZiAobW5nanBlZ19zb3VyY2UpKTsKKyAgTU5HX0ZSRUUgKHBEYXRhLCBwRGF0YS0+cEpQRUdkZXJyMiwgIHNpemVvZiAobW5nanBlZ19lcnJvciApKTsKKyNlbmRpZgorCisgIE1OR19GUkVFIChwRGF0YSwgcERhdGEtPnBKUEVHcm93MiwgcERhdGEtPmlKUEVHcm93bGVuMik7CisgIE1OR19GUkVFIChwRGF0YSwgcERhdGEtPnBKUEVHcm93LCAgcERhdGEtPmlKUEVHcm93bGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdoYXRldmVyIHdlIHdlcmUgZG9pbmcgLi4uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSBkb24ndCBhbnltb3JlIC4uLiAqLworICBwRGF0YS0+YkpQRUdjb21wcmVzcyAgICAgPSBNTkdfRkFMU0U7CisKKyAgcERhdGEtPmJKUEVHZGVjb21wcmVzcyAgID0gTU5HX0ZBTFNFOworICBwRGF0YS0+YkpQRUdoYXNoZWFkZXIgICAgPSBNTkdfRkFMU0U7CisgIHBEYXRhLT5iSlBFR2RlY29zdGFydGVkICA9IE1OR19GQUxTRTsKKyAgcERhdGEtPmJKUEVHc2NhbnN0YXJ0ZWQgID0gTU5HX0ZBTFNFOworICBwRGF0YS0+YkpQRUdzY2FuZW5kaW5nICAgPSBNTkdfRkFMU0U7CisKKyAgcERhdGEtPmJKUEVHZGVjb21wcmVzczIgID0gTU5HX0ZBTFNFOworICBwRGF0YS0+YkpQRUdoYXNoZWFkZXIyICAgPSBNTkdfRkFMU0U7CisgIHBEYXRhLT5iSlBFR2RlY29zdGFydGVkMiA9IE1OR19GQUxTRTsKKyAgcERhdGEtPmJKUEVHc2NhbnN0YXJ0ZWQyID0gTU5HX0ZBTFNFOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0pQRUdfQ0xFQU5VUCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBKUEVHIGRlY29tcHJlc3Npb24gcm91dGluZXMgKEpEQVQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HX1JFQUQKK21uZ19yZXRjb2RlIG1uZ2pwZWdfZGVjb21wcmVzc2luaXQgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyNpZiBkZWZpbmVkKE1OR19JTkNMVURFX0lKRzZCKSAmJiBkZWZpbmVkKE1OR19VU0VfU0VUSk1QKQorICBtbmdfcmV0Y29kZSBpUmV0Y29kZTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0pQRUdfREVDT01QUkVTU0lOSVQsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworI2lmZGVmIE1OR19JTkNMVURFX0lKRzZCCisgIC8qIGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgSlBFRyBkZWNvbXByZXNzaW9uIG9iamVjdCAqLworICBwRGF0YS0+cEpQRUdkaW5mby0+ZXJyID0ganBlZ19zdGRfZXJyb3IgKHBEYXRhLT5wSlBFR2RlcnIpOworCisjaWZkZWYgTU5HX1VTRV9TRVRKTVAgICAgICAgICAgICAgICAgICAvKiBzZXR1cCBsb2NhbCBKUEVHIGVycm9yLXJvdXRpbmVzICovCisgIHBEYXRhLT5wSlBFR2RlcnItPmVycm9yX2V4aXQgICAgID0gbW5nX2Vycm9yX2V4aXQ7CisgIHBEYXRhLT5wSlBFR2RlcnItPm91dHB1dF9tZXNzYWdlID0gbW5nX291dHB1dF9tZXNzYWdlOworCisgIGlSZXRjb2RlID0gc2V0am1wIChwRGF0YS0+c0Vycm9yYnVmKTsvKiBzZXR1cCBsb2NhbCBKUEVHIGVycm9yLXJlY292ZXJ5ICovCisgIGlmIChpUmV0Y29kZSAhPSAwKSAgICAgICAgICAgICAgICAgICAvKiBnb3QgaGVyZSBmcm9tIGxvbmdqbXAgPyAqLworICAgIE1OR19FUlJPUkogKHBEYXRhLCBpUmV0Y29kZSk7ICAgICAgLyogdGhlbiBJSkctbGliIGlzc3VlZCBhbiBlcnJvciAqLworI2VuZGlmIC8qIE1OR19VU0VfU0VUSk1QICovCisKKyAgLyogYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBKUEVHIGRlY29tcHJlc3Npb24gb2JqZWN0IChjb250aW51ZWQpICovCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0pQRUdfREVDT01QUkVTU0lOSVQsIE1OR19MQ19KUEVHX0NSRUFURV9ERUNPTVBSRVNTKQorI2VuZGlmCisgIGpwZWdfY3JlYXRlX2RlY29tcHJlc3MgKHBEYXRhLT5wSlBFR2RpbmZvKTsKKworICBwRGF0YS0+YkpQRUdkZWNvbXByZXNzID0gTU5HX1RSVUU7ICAgLyogaW5kaWNhdGUgaXQncyBpbml0aWFsaXplZCAqLworCisgIC8qIHNwZWNpZnkgdGhlIHNvdXJjZSBvZiB0aGUgY29tcHJlc3NlZCBkYXRhIChlZywgYSBmaWxlKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm8sIG5vdCBhIGZpbGU7IHdlIGhhdmUgYnVmZmVyZWQgaW5wdXQgKi8KKyAgcERhdGEtPnBKUEVHZGluZm8tPnNyYyA9IHBEYXRhLT5wSlBFR2RzcmM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1c2UgdGhlIGRlZmF1bHQgaGFuZGxlciAqLworICBwRGF0YS0+cEpQRUdkaW5mby0+c3JjLT5yZXN5bmNfdG9fcmVzdGFydCA9IGpwZWdfcmVzeW5jX3RvX3Jlc3RhcnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXR1cCBsb2NhbCBzb3VyY2Ugcm91dGluZSAmIHBhcm1zICovCisgIHBEYXRhLT5wSlBFR2RpbmZvLT5zcmMtPmluaXRfc291cmNlICAgICAgID0gbW5nX2luaXRfc291cmNlOworICBwRGF0YS0+cEpQRUdkaW5mby0+c3JjLT5maWxsX2lucHV0X2J1ZmZlciA9IG1uZ19maWxsX2lucHV0X2J1ZmZlcjsKKyAgcERhdGEtPnBKUEVHZGluZm8tPnNyYy0+c2tpcF9pbnB1dF9kYXRhICAgPSBtbmdfc2tpcF9pbnB1dF9kYXRhOworICBwRGF0YS0+cEpQRUdkaW5mby0+c3JjLT50ZXJtX3NvdXJjZSAgICAgICA9IG1uZ190ZXJtX3NvdXJjZTsKKyAgcERhdGEtPnBKUEVHZGluZm8tPnNyYy0+bmV4dF9pbnB1dF9ieXRlICAgPSBwRGF0YS0+cEpQRUdjdXJyZW50OworICBwRGF0YS0+cEpQRUdkaW5mby0+c3JjLT5ieXRlc19pbl9idWZmZXIgICA9IHBEYXRhLT5pSlBFR2J1ZnJlbWFpbjsKKworI2VuZGlmIC8qIE1OR19JTkNMVURFX0lKRzZCICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSlBFR19ERUNPTVBSRVNTSU5JVCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYgLyogTU5HX0lOQ0xVREVfSk5HX1JFQUQgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19JTkNMVURFX0pOR19SRUFECittbmdfcmV0Y29kZSBtbmdqcGVnX2RlY29tcHJlc3NkYXRhIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpUmF3c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcFJhd2RhdGEpCit7CisgIG1uZ19yZXRjb2RlIGlSZXRjb2RlOworICBtbmdfdWludDMyICBpUmVtYWluOworICBtbmdfdWludDhwICBwV29yazsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9KUEVHX0RFQ09NUFJFU1NEQVRBLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChNTkdfSU5DTFVERV9JSkc2QikgJiYgZGVmaW5lZChNTkdfVVNFX1NFVEpNUCkKKyAgaVJldGNvZGUgPSBzZXRqbXAgKHBEYXRhLT5zRXJyb3JidWYpOy8qIGluaXRpYWxpemUgbG9jYWwgSlBFRyBlcnJvci1yZWNvdmVyeSAqLworICBpZiAoaVJldGNvZGUgIT0gMCkgICAgICAgICAgICAgICAgICAgLyogZ290IGhlcmUgZnJvbSBsb25nam1wID8gKi8KKyAgICBNTkdfRVJST1JKIChwRGF0YSwgaVJldGNvZGUpOyAgICAgIC8qIHRoZW4gSUpHLWxpYiBpc3N1ZWQgYW4gZXJyb3IgKi8KKyNlbmRpZgorCisgIHBXb3JrICAgPSBwUmF3ZGF0YTsKKyAgaVJlbWFpbiA9IGlSYXdzaXplOworCisgIGlmIChwRGF0YS0+aUpQRUd0b3NraXApICAgICAgICAgICAgICAvKiBKUEVHLWxpYiB0b2xkIHVzIHRvIHNraXAgc29tZSBtb3JlIGRhdGEgPyAqLworICB7CisgICAgaWYgKGlSZW1haW4gPiBwRGF0YS0+aUpQRUd0b3NraXApICAvKiBlbm91Z2ggZGF0YSBpbiB0aGlzIGJ1ZmZlciA/ICovCisgICAgeworICAgICAgaVJlbWFpbiAtPSBwRGF0YS0+aUpQRUd0b3NraXA7ICAgLyogc2tpcCBlbm91Z2ggdG8gYWNjZXNzIHRoZSBuZXh0IGJ5dGUgKi8KKyAgICAgIHBXb3JrICAgKz0gcERhdGEtPmlKUEVHdG9za2lwOworCisgICAgICBwRGF0YS0+aUpQRUd0b3NraXAgPSAwOyAgICAgICAgICAvKiBubyBtb3JlIHRvIHNraXAgdGhlbiAqLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgcERhdGEtPmlKUEVHdG9za2lwIC09IGlSZW1haW47ICAgLyogc2tpcCBhbGwgZGF0YSBpbiB0aGUgYnVmZmVyICovCisgICAgICBpUmVtYWluID0gMDsgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgaW5kaWNhdGUgdGhpcyBhY2NvcmRpbmdseSAqLworICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZSBza2lwIHNldCBjdXJyZW50LXBvaW50ZXIgdG8gTlVMTCAhICovCisgICAgcERhdGEtPnBKUEVHY3VycmVudCA9IHBEYXRhLT5wSlBFR2J1ZjsKKyAgfQorCisgIHdoaWxlIChpUmVtYWluKSAgICAgICAgICAgICAgICAgICAgICAvKiByZXBlYXQgdW50aWwgbm8gbW9yZSBpbnB1dC1ieXRlcyAqLworICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmVlZCB0byBzaGlmdCBhbnl0aGluZyA/ICovCisgICAgaWYgKChwRGF0YS0+cEpQRUdjdXJyZW50ID4gcERhdGEtPnBKUEVHYnVmKSAmJgorICAgICAgICAocERhdGEtPnBKUEVHY3VycmVudCAtIHBEYXRhLT5wSlBFR2J1ZiArIHBEYXRhLT5pSlBFR2J1ZnJlbWFpbiArIGlSZW1haW4gPiBwRGF0YS0+aUpQRUdidWZtYXgpKQorICAgIHsKKyAgICAgIGlmIChwRGF0YS0+aUpQRUdidWZyZW1haW4gPiAwKSAgIC8qIHRoZW4gZG8gc28gKi8KKyAgICAgICAgTU5HX0NPUFkgKHBEYXRhLT5wSlBFR2J1ZiwgcERhdGEtPnBKUEVHY3VycmVudCwgcERhdGEtPmlKUEVHYnVmcmVtYWluKTsKKworICAgICAgcERhdGEtPnBKUEVHY3VycmVudCA9IHBEYXRhLT5wSlBFR2J1ZjsKKyAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkb2VzIHRoZSByZW1haW5pbmcgaW5wdXQgZml0IGludG8gdGhlIGJ1ZmZlciA/ICovCisgICAgaWYgKHBEYXRhLT5pSlBFR2J1ZnJlbWFpbiArIGlSZW1haW4gPD0gcERhdGEtPmlKUEVHYnVmbWF4KQorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW92ZSB0aGUgbG90ICovCisgICAgICBNTkdfQ09QWSAoKHBEYXRhLT5wSlBFR2N1cnJlbnQgKyBwRGF0YS0+aUpQRUdidWZyZW1haW4pLCBwV29yaywgaVJlbWFpbik7CisKKyAgICAgIHBEYXRhLT5pSlBFR2J1ZnJlbWFpbiArPSBpUmVtYWluOy8qIGFkanVzdCByZW1haW5pbmdfYnl0ZXMgY291bnRlciAqLworICAgICAgaVJlbWFpbiA9IDA7ICAgICAgICAgICAgICAgICAgICAgLyogYW5kIGluZGljYXRlIHRoZXJlJ3Mgbm8gaW5wdXQgbGVmdCAqLworICAgIH0KKyAgICBlbHNlCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjYWxjdWxhdGUgd2hhdCBkb2VzIGZpdCAqLworICAgICAgbW5nX3VpbnQzMiBpRml0cyA9IHBEYXRhLT5pSlBFR2J1Zm1heCAtIHBEYXRhLT5pSlBFR2J1ZnJlbWFpbjsKKworICAgICAgaWYgKGlGaXRzIDw9IDApICAgICAgICAgICAgICAgICAgLyogbm8gc3BhY2UgaXMganVzdCBidWdnZXIgJ20gYWxsICovCisgICAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19KUEVHQlVGVE9PU01BTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW92ZSB0aGF0ICovCisgICAgICBNTkdfQ09QWSAoKHBEYXRhLT5wSlBFR2N1cnJlbnQgKyBwRGF0YS0+aUpQRUdidWZyZW1haW4pLCBwV29yaywgaUZpdHMpOworCisgICAgICBwRGF0YS0+aUpQRUdidWZyZW1haW4gKz0gaUZpdHM7ICAvKiBhZGp1c3QgcmVtYWluX2J5dGVzIGNvdW50ZXIgKi8KKyAgICAgIGlSZW1haW4gLT0gaUZpdHM7ICAgICAgICAgICAgICAgIC8qIGFuZCB0aGUgaW5wdXQtcGFybXMgKi8KKyAgICAgIHBXb3JrICAgKz0gaUZpdHM7CisgICAgfQorCisjaWZkZWYgTU5HX0lOQ0xVREVfSUpHNkIKKyAgICBwRGF0YS0+cEpQRUdkaW5mby0+c3JjLT5uZXh0X2lucHV0X2J5dGUgPSBwRGF0YS0+cEpQRUdjdXJyZW50OworICAgIHBEYXRhLT5wSlBFR2RpbmZvLT5zcmMtPmJ5dGVzX2luX2J1ZmZlciA9IHBEYXRhLT5pSlBFR2J1ZnJlbWFpbjsKKworICAgIGlmICghcERhdGEtPmJKUEVHaGFzaGVhZGVyKSAgICAgICAgLyogaGF2ZW4ndCBnb3QgdGhlIGhlYWRlciB5ZXQgPyAqLworICAgIHsKKyAgICAgIC8qIGNhbGwganBlZ19yZWFkX2hlYWRlcigpIHRvIG9idGFpbiBpbWFnZSBpbmZvICovCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgICAgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9KUEVHX0RFQ09NUFJFU1NEQVRBLCBNTkdfTENfSlBFR19SRUFEX0hFQURFUikKKyNlbmRpZgorICAgICAgaWYgKGpwZWdfcmVhZF9oZWFkZXIgKHBEYXRhLT5wSlBFR2RpbmZvLCBUUlVFKSAhPSBKUEVHX1NVU1BFTkRFRCkKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluZGljYXRlIHRoZSBoZWFkZXIncyBva2UgKi8KKyAgICAgICAgcERhdGEtPmJKUEVHaGFzaGVhZGVyID0gTU5HX1RSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZXQncyBkbyBzb21lIHNhbml0eSBjaGVja3MgISAqLworICAgICAgICBpZiAoKHBEYXRhLT5wSlBFR2RpbmZvLT5pbWFnZV93aWR0aCAgIT0gcERhdGEtPmlEYXRhd2lkdGggKSB8fAorICAgICAgICAgICAgKHBEYXRhLT5wSlBFR2RpbmZvLT5pbWFnZV9oZWlnaHQgIT0gcERhdGEtPmlEYXRhaGVpZ2h0KSAgICApCisgICAgICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0pQRUdQQVJNU0VSUik7CisKKyAgICAgICAgaWYgKCAoKHBEYXRhLT5pSkhEUmNvbG9ydHlwZSA9PSBNTkdfQ09MT1JUWVBFX0pQRUdHUkFZICkgfHwKKyAgICAgICAgICAgICAgKHBEYXRhLT5pSkhEUmNvbG9ydHlwZSA9PSBNTkdfQ09MT1JUWVBFX0pQRUdHUkFZQSkgICAgKSAmJgorICAgICAgICAgICAgIChwRGF0YS0+cEpQRUdkaW5mby0+anBlZ19jb2xvcl9zcGFjZSAhPSBKQ1NfR1JBWVNDQUxFICApICAgICkKKyAgICAgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSlBFR1BBUk1TRVJSKTsKKworICAgICAgICBpZiAoICgocERhdGEtPmlKSERSY29sb3J0eXBlID09IE1OR19DT0xPUlRZUEVfSlBFR0NPTE9SICkgfHwKKyAgICAgICAgICAgICAgKHBEYXRhLT5pSkhEUmNvbG9ydHlwZSA9PSBNTkdfQ09MT1JUWVBFX0pQRUdDT0xPUkEpICAgICkgJiYKKyAgICAgICAgICAgICAocERhdGEtPnBKUEVHZGluZm8tPmpwZWdfY29sb3Jfc3BhY2UgIT0gSkNTX1lDYkNyICAgICAgICkgICAgKQorICAgICAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19KUEVHUEFSTVNFUlIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5kaWNhdGUgd2hldGhlciBvciBub3QgaXQncyBwcm9ncmVzc2l2ZSAqLworICAgICAgICBwRGF0YS0+YkpQRUdwcm9ncmVzc2l2ZSA9IChtbmdfYm9vbClqcGVnX2hhc19tdWx0aXBsZV9zY2FucyAocERhdGEtPnBKUEVHZGluZm8pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJvZ3Jlc3NpdmUrYWxwaGEgY2FuJ3QgZGlzcGxheSAib24tdGhlLWZseSIhISAqLworICAgICAgICBpZiAoKHBEYXRhLT5iSlBFR3Byb2dyZXNzaXZlKSAmJgorICAgICAgICAgICAgKChwRGF0YS0+aUpIRFJjb2xvcnR5cGUgPT0gTU5HX0NPTE9SVFlQRV9KUEVHR1JBWUEgKSB8fAorICAgICAgICAgICAgIChwRGF0YS0+aUpIRFJjb2xvcnR5cGUgPT0gTU5HX0NPTE9SVFlQRV9KUEVHQ09MT1JBKSAgICApKQorICAgICAgICAgIHBEYXRhLT5mRGlzcGxheXJvdyA9IE1OR19OVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWxsb2NhdGUgYSByb3cgb2YgSlBFRy1zYW1wbGVzICovCisgICAgICAgIGlmIChwRGF0YS0+cEpQRUdkaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfWUNiQ3IpCisgICAgICAgICAgcERhdGEtPmlKUEVHcm93bGVuID0gcERhdGEtPnBKUEVHZGluZm8tPmltYWdlX3dpZHRoICogUkdCX1BJWEVMU0laRTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHBEYXRhLT5pSlBFR3Jvd2xlbiA9IHBEYXRhLT5wSlBFR2RpbmZvLT5pbWFnZV93aWR0aDsKKworICAgICAgICBNTkdfQUxMT0MgKHBEYXRhLCBwRGF0YS0+cEpQRUdyb3csIHBEYXRhLT5pSlBFR3Jvd2xlbik7CisKKyAgICAgICAgcERhdGEtPmlKUEVHcmdicm93ID0gMDsgICAgICAgIC8qIHF1aXRlIGVtcHR5IHVwIHRvIG5vdyAqLworICAgICAgfQorCisgICAgICBwRGF0YS0+cEpQRUdjdXJyZW50ICAgPSAobW5nX3VpbnQ4cClwRGF0YS0+cEpQRUdkaW5mby0+c3JjLT5uZXh0X2lucHV0X2J5dGU7CisgICAgICBwRGF0YS0+aUpQRUdidWZyZW1haW4gPSAobW5nX3VpbnQzMilwRGF0YS0+cEpQRUdkaW5mby0+c3JjLT5ieXRlc19pbl9idWZmZXI7CisgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVjb21wcmVzcyBub3Qgc3RhcnRlZCA/ICovCisgICAgaWYgKChwRGF0YS0+YkpQRUdoYXNoZWFkZXIpICYmICghcERhdGEtPmJKUEVHZGVjb3N0YXJ0ZWQpKQorICAgIHsKKyAgICAgIC8qIHNldCBwYXJhbWV0ZXJzIGZvciBkZWNvbXByZXNzaW9uICovCisKKyAgICAgIGlmIChwRGF0YS0+YkpQRUdwcm9ncmVzc2l2ZSkgICAgIC8qIHByb2dyZXNzaXZlIGRpc3BsYXkgPyAqLworICAgICAgICBwRGF0YS0+cEpQRUdkaW5mby0+YnVmZmVyZWRfaW1hZ2UgPSBUUlVFOworCisgICAgICAvKiBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoLi4uKTsgKi8KKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICAgICAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0pQRUdfREVDT01QUkVTU0RBVEEsIE1OR19MQ19KUEVHX1NUQVJUX0RFQ09NUFJFU1MpCisjZW5kaWYKKyAgICAgIGlmIChqcGVnX3N0YXJ0X2RlY29tcHJlc3MgKHBEYXRhLT5wSlBFR2RpbmZvKSA9PSBUUlVFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5kaWNhdGUgaXQgc3RhcnRlZCAqLworICAgICAgICBwRGF0YS0+YkpQRUdkZWNvc3RhcnRlZCA9IE1OR19UUlVFOworCisgICAgICBwRGF0YS0+cEpQRUdjdXJyZW50ICAgPSAobW5nX3VpbnQ4cClwRGF0YS0+cEpQRUdkaW5mby0+c3JjLT5uZXh0X2lucHV0X2J5dGU7CisgICAgICBwRGF0YS0+aUpQRUdidWZyZW1haW4gPSAobW5nX3VpbnQzMilwRGF0YS0+cEpQRUdkaW5mby0+c3JjLT5ieXRlc19pbl9idWZmZXI7CisgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJvY2VzcyBzb21lIHNjYW5saW5lcyA/ICovCisgICAgaWYgKChwRGF0YS0+YkpQRUdoYXNoZWFkZXIpICYmIChwRGF0YS0+YkpQRUdkZWNvc3RhcnRlZCkgJiYKKwkgICAgKCghanBlZ19pbnB1dF9jb21wbGV0ZSAocERhdGEtPnBKUEVHZGluZm8pKSB8fAorICAgICAgICAgKHBEYXRhLT5wSlBFR2RpbmZvLT5vdXRwdXRfc2NhbmxpbmUgPCBwRGF0YS0+cEpQRUdkaW5mby0+b3V0cHV0X2hlaWdodCkgfHwKKyAgICAgICAgICgocERhdGEtPmJKUEVHcHJvZ3Jlc3NpdmUpICYmIChwRGF0YS0+YkpQRUdzY2FuZW5kaW5nKSkpKQorICAgIHsKKyAgICAgIG1uZ19pbnQzMiBpTGluZXMgPSAwOworCisgICAgICAvKiBmb3IgKGVhY2ggb3V0cHV0IHBhc3MpICovCisgICAgICBkbworICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkcmVzcyB0aGUgcm93IG91dHB1dCBidWZmZXIgKi8KKyAgICAgICAgSlNBTVBST1cgcFJvdyA9IChKU0FNUFJPVylwRGF0YS0+cEpQRUdyb3c7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXQgbmV3IHBhc3MgPyAqLworICAgICAgICBpZiAoKHBEYXRhLT5iSlBFR3Byb2dyZXNzaXZlKSAmJiAoIXBEYXRhLT5iSlBFR3NjYW5zdGFydGVkKSkKKyAgICAgICAgeworICAgICAgICAgIHBEYXRhLT5iSlBFR3NjYW5zdGFydGVkID0gTU5HX1RSVUU7CisKKyAgICAgICAgICAvKiBhZGp1c3Qgb3V0cHV0IGRlY29tcHJlc3Npb24gcGFyYW1ldGVycyBpZiByZXF1aXJlZCAqLworICAgICAgICAgIC8qIG5vcCAqLworCisgICAgICAgICAgLyogc3RhcnQgYSBuZXcgb3V0cHV0IHBhc3MgKi8KKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICAgICAgICAgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9KUEVHX0RFQ09NUFJFU1NEQVRBLCBNTkdfTENfSlBFR19TVEFSVF9PVVRQVVQpCisjZW5kaWYKKyAgICAgICAgICBqcGVnX3N0YXJ0X291dHB1dCAocERhdGEtPnBKUEVHZGluZm8sIHBEYXRhLT5wSlBFR2RpbmZvLT5pbnB1dF9zY2FuX251bWJlcik7CisKKyAgICAgICAgICBwRGF0YS0+aUpQRUdyb3cgPSAwOyAgICAgICAgIC8qIHN0YXJ0IGF0IHJvdyAwIGluIHRoZSBpbWFnZSBhZ2FpbiAqLworICAgICAgICB9CisKKyAgICAgICAgLyogd2hpbGUgKHNjYW4gbGluZXMgcmVtYWluIHRvIGJlIHJlYWQpICovCisgICAgICAgIGlmICgoIXBEYXRhLT5iSlBFR3Byb2dyZXNzaXZlKSB8fCAoIXBEYXRhLT5iSlBFR3NjYW5lbmRpbmcpKQorICAgICAgICB7CisgICAgICAgICAgZG8KKyAgICAgICAgICB7CisgICAgICAgICAgLyogICBqcGVnX3JlYWRfc2NhbmxpbmVzKC4uLik7ICovCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgICAgICAgICAgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9KUEVHX0RFQ09NUFJFU1NEQVRBLCBNTkdfTENfSlBFR19SRUFEX1NDQU5MSU5FUykKKyNlbmRpZgorICAgICAgICAgICAgaUxpbmVzID0ganBlZ19yZWFkX3NjYW5saW5lcyAocERhdGEtPnBKUEVHZGluZm8sIChKU0FNUEFSUkFZKSZwUm93LCAxKTsKKworICAgICAgICAgICAgcERhdGEtPnBKUEVHY3VycmVudCAgID0gKG1uZ191aW50OHApcERhdGEtPnBKUEVHZGluZm8tPnNyYy0+bmV4dF9pbnB1dF9ieXRlOworICAgICAgICAgICAgcERhdGEtPmlKUEVHYnVmcmVtYWluID0gKG1uZ191aW50MzIpcERhdGEtPnBKUEVHZGluZm8tPnNyYy0+Ynl0ZXNfaW5fYnVmZmVyOworCisgICAgICAgICAgICBpZiAoaUxpbmVzID4gMCkgICAgICAgICAgICAvKiBnb3Qgc29tZXRoaW5nID8gKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKHBEYXRhLT5mU3RvcmVyb3cyKSAgIC8qIHN0b3JlIGluIG9iamVjdCA/ICovCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpUmV0Y29kZSA9ICgobW5nX3N0b3Jlcm93KXBEYXRhLT5mU3RvcmVyb3cyKSAocERhdGEpOworCisgICAgICAgICAgICAgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgICAgICAgICAgIHJldHVybiBpUmV0Y29kZTsKKworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIHdoaWxlICgocERhdGEtPnBKUEVHZGluZm8tPm91dHB1dF9zY2FubGluZSA8IHBEYXRhLT5wSlBFR2RpbmZvLT5vdXRwdXRfaGVpZ2h0KSAmJgorICAgICAgICAgICAgICAgICAoaUxpbmVzID4gMCkpOyAgICAgICAgLyogdW50aWwgZW5kLW9mLWltYWdlIG9yIG5vdCBlbm91Z2ggaW5wdXQtZGF0YSAqLworICAgICAgICB9CisKKyAgICAgICAgLyogdGVybWluYXRlIG91dHB1dCBwYXNzICovCisgICAgICAgIGlmICgocERhdGEtPmJKUEVHcHJvZ3Jlc3NpdmUpICYmCisgICAgICAgICAgICAocERhdGEtPnBKUEVHZGluZm8tPm91dHB1dF9zY2FubGluZSA+PSBwRGF0YS0+cEpQRUdkaW5mby0+b3V0cHV0X2hlaWdodCkpCisgICAgICAgIHsKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICAgICAgICAgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9KUEVHX0RFQ09NUFJFU1NEQVRBLCBNTkdfTENfSlBFR19GSU5JU0hfT1VUUFVUKQorI2VuZGlmCisgICAgICAgICAgaWYgKGpwZWdfZmluaXNoX291dHB1dCAocERhdGEtPnBKUEVHZGluZm8pICE9IEpQRUdfU1VTUEVOREVEKQorICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhpcyBzY2FuIGhhcyBlbmRlZCAqLworICAgICAgICAgICAgcERhdGEtPmJKUEVHc2NhbnN0YXJ0ZWQgPSBNTkdfRkFMU0U7CisgICAgICAgICAgICBwRGF0YS0+YkpQRUdzY2FuZW5kaW5nICA9IE1OR19GQUxTRTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHBEYXRhLT5iSlBFR3NjYW5lbmRpbmcgID0gTU5HX1RSVUU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICB3aGlsZSAoKCFqcGVnX2lucHV0X2NvbXBsZXRlIChwRGF0YS0+cEpQRUdkaW5mbykpICYmCisgICAgICAgICAgICAgKGlMaW5lcyA+IDApICYmICghcERhdGEtPmJKUEVHc2NhbmVuZGluZykpOworICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCBvZiBpbWFnZSA/ICovCisgICAgaWYgKChwRGF0YS0+YkpQRUdoYXNoZWFkZXIpICYmIChwRGF0YS0+YkpQRUdkZWNvc3RhcnRlZCkgJiYKKyAgICAgICAgKCFwRGF0YS0+YkpQRUdzY2FuZW5kaW5nKSAmJiAoanBlZ19pbnB1dF9jb21wbGV0ZSAocERhdGEtPnBKUEVHZGluZm8pKSAmJgorICAgICAgICAocERhdGEtPnBKUEVHZGluZm8tPmlucHV0X3NjYW5fbnVtYmVyID09IHBEYXRhLT5wSlBFR2RpbmZvLT5vdXRwdXRfc2Nhbl9udW1iZXIpKQorICAgIHsKKyAgICAgIC8qIGpwZWdfZmluaXNoX2RlY29tcHJlc3MoLi4uKTsgKi8KKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICAgICAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0pQRUdfREVDT01QUkVTU0RBVEEsIE1OR19MQ19KUEVHX0ZJTklTSF9ERUNPTVBSRVNTKQorI2VuZGlmCisgICAgICBpZiAoanBlZ19maW5pc2hfZGVjb21wcmVzcyAocERhdGEtPnBKUEVHZGluZm8pID09IFRSVUUpCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbmRpY2F0ZSBpdCdzIGRvbmUgKi8KKyAgICAgICAgcERhdGEtPmJKUEVHaGFzaGVhZGVyICAgPSBNTkdfRkFMU0U7CisgICAgICAgIHBEYXRhLT5iSlBFR2RlY29zdGFydGVkID0gTU5HX0ZBTFNFOworICAgICAgICBwRGF0YS0+cEpQRUdjdXJyZW50ICAgICA9IChtbmdfdWludDhwKXBEYXRhLT5wSlBFR2RpbmZvLT5zcmMtPm5leHRfaW5wdXRfYnl0ZTsKKyAgICAgICAgcERhdGEtPmlKUEVHYnVmcmVtYWluICAgPSAobW5nX3VpbnQzMilwRGF0YS0+cEpQRUdkaW5mby0+c3JjLT5ieXRlc19pbl9idWZmZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZW1haW5pbmcgZmx1ZmYgaXMgYW4gZXJyb3IgISAqLworICAgICAgICBpZiAoKHBEYXRhLT5pSlBFR2J1ZnJlbWFpbiA+IDApIHx8IChpUmVtYWluID4gMCkpCisgICAgICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1RPT01VQ0hKREFUKTsKKyAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogTU5HX0lOQ0xVREVfSUpHNkIgKi8KKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0pQRUdfREVDT01QUkVTU0RBVEEsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmIC8qIE1OR19JTkNMVURFX0pOR19SRUFEICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkdfUkVBRAorbW5nX3JldGNvZGUgbW5nanBlZ19kZWNvbXByZXNzZnJlZSAobW5nX2RhdGFwIHBEYXRhKQoreworI2lmIGRlZmluZWQoTU5HX0lOQ0xVREVfSUpHNkIpICYmIGRlZmluZWQoTU5HX1VTRV9TRVRKTVApCisgIG1uZ19yZXRjb2RlIGlSZXRjb2RlOworI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSlBFR19ERUNPTVBSRVNTRlJFRSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX0lOQ0xVREVfSUpHNkIKKyNpZmRlZiBNTkdfVVNFX1NFVEpNUAorICBpUmV0Y29kZSA9IHNldGptcCAocERhdGEtPnNFcnJvcmJ1Zik7Lyogc2V0dXAgbG9jYWwgSlBFRyBlcnJvci1yZWNvdmVyeSAqLworICBpZiAoaVJldGNvZGUgIT0gMCkgICAgICAgICAgICAgICAgICAgLyogZ290IGhlcmUgZnJvbSBsb25nam1wID8gKi8KKyAgICBNTkdfRVJST1JKIChwRGF0YSwgaVJldGNvZGUpOyAgICAgIC8qIHRoZW4gSUpHLWxpYiBpc3N1ZWQgYW4gZXJyb3IgKi8KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZnJlZSB0aGUgcm93IG9mIEpQRUctc2FtcGxlcyovCisgIE1OR19GUkVFIChwRGF0YSwgcERhdGEtPnBKUEVHcm93LCBwRGF0YS0+aUpQRUdyb3dsZW4pOworCisgIC8qIHJlbGVhc2UgdGhlIEpQRUcgZGVjb21wcmVzc2lvbiBvYmplY3QgKi8KKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSlBFR19ERUNPTVBSRVNTRlJFRSwgTU5HX0xDX0pQRUdfREVTVFJPWV9ERUNPTVBSRVNTKQorI2VuZGlmCisgIGpwZWdfZGVzdHJveV9kZWNvbXByZXNzIChwRGF0YS0+cEpQRUdkaW5mbyk7CisKKyAgcERhdGEtPmJKUEVHZGVjb21wcmVzcyA9IE1OR19GQUxTRTsgIC8qIGluZGljYXRlIGl0J3MgZG9uZSAqLworCisjZW5kaWYgLyogTU5HX0lOQ0xVREVfSUpHNkIgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9KUEVHX0RFQ09NUFJFU1NGUkVFLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZiAvKiBNTkdfSU5DTFVERV9KTkdfUkVBRCAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogSlBFRyBkZWNvbXByZXNzaW9uIHJvdXRpbmVzIChKREFBKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19JTkNMVURFX0pOR19SRUFECittbmdfcmV0Y29kZSBtbmdqcGVnX2RlY29tcHJlc3Npbml0MiAobW5nX2RhdGFwIHBEYXRhKQoreworI2lmIGRlZmluZWQoTU5HX0lOQ0xVREVfSUpHNkIpICYmIGRlZmluZWQoTU5HX1VTRV9TRVRKTVApCisgIG1uZ19yZXRjb2RlIGlSZXRjb2RlOworI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSlBFR19ERUNPTVBSRVNTSU5JVCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX0lOQ0xVREVfSUpHNkIKKyAgLyogYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBKUEVHIGRlY29tcHJlc3Npb24gb2JqZWN0ICovCisgIHBEYXRhLT5wSlBFR2RpbmZvMi0+ZXJyID0ganBlZ19zdGRfZXJyb3IgKHBEYXRhLT5wSlBFR2RlcnIyKTsKKworI2lmZGVmIE1OR19VU0VfU0VUSk1QICAgICAgICAgICAgICAgICAgLyogc2V0dXAgbG9jYWwgSlBFRyBlcnJvci1yb3V0aW5lcyAqLworICBwRGF0YS0+cEpQRUdkZXJyMi0+ZXJyb3JfZXhpdCAgICAgPSBtbmdfZXJyb3JfZXhpdDsKKyAgcERhdGEtPnBKUEVHZGVycjItPm91dHB1dF9tZXNzYWdlID0gbW5nX291dHB1dF9tZXNzYWdlOworCisgIGlSZXRjb2RlID0gc2V0am1wIChwRGF0YS0+c0Vycm9yYnVmKTsvKiBzZXR1cCBsb2NhbCBKUEVHIGVycm9yLXJlY292ZXJ5ICovCisgIGlmIChpUmV0Y29kZSAhPSAwKSAgICAgICAgICAgICAgICAgICAvKiBnb3QgaGVyZSBmcm9tIGxvbmdqbXAgPyAqLworICAgIE1OR19FUlJPUkogKHBEYXRhLCBpUmV0Y29kZSk7ICAgICAgLyogdGhlbiBJSkctbGliIGlzc3VlZCBhbiBlcnJvciAqLworI2VuZGlmIC8qIE1OR19VU0VfU0VUSk1QICovCisKKyAgLyogYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBKUEVHIGRlY29tcHJlc3Npb24gb2JqZWN0IChjb250aW51ZWQpICovCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0pQRUdfREVDT01QUkVTU0lOSVQsIE1OR19MQ19KUEVHX0NSRUFURV9ERUNPTVBSRVNTKQorI2VuZGlmCisgIGpwZWdfY3JlYXRlX2RlY29tcHJlc3MgKHBEYXRhLT5wSlBFR2RpbmZvMik7CisKKyAgcERhdGEtPmJKUEVHZGVjb21wcmVzczIgPSBNTkdfVFJVRTsgIC8qIGluZGljYXRlIGl0J3MgaW5pdGlhbGl6ZWQgKi8KKworICAvKiBzcGVjaWZ5IHRoZSBzb3VyY2Ugb2YgdGhlIGNvbXByZXNzZWQgZGF0YSAoZWcsIGEgZmlsZSkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vLCBub3QgYSBmaWxlOyB3ZSBoYXZlIGJ1ZmZlcmVkIGlucHV0ICovCisgIHBEYXRhLT5wSlBFR2RpbmZvMi0+c3JjID0gcERhdGEtPnBKUEVHZHNyYzI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1c2UgdGhlIGRlZmF1bHQgaGFuZGxlciAqLworICBwRGF0YS0+cEpQRUdkaW5mbzItPnNyYy0+cmVzeW5jX3RvX3Jlc3RhcnQgPSBqcGVnX3Jlc3luY190b19yZXN0YXJ0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2V0dXAgbG9jYWwgc291cmNlIHJvdXRpbmUgJiBwYXJtcyAqLworICBwRGF0YS0+cEpQRUdkaW5mbzItPnNyYy0+aW5pdF9zb3VyY2UgICAgICAgPSBtbmdfaW5pdF9zb3VyY2U7CisgIHBEYXRhLT5wSlBFR2RpbmZvMi0+c3JjLT5maWxsX2lucHV0X2J1ZmZlciA9IG1uZ19maWxsX2lucHV0X2J1ZmZlcjsKKyAgcERhdGEtPnBKUEVHZGluZm8yLT5zcmMtPnNraXBfaW5wdXRfZGF0YSAgID0gbW5nX3NraXBfaW5wdXRfZGF0YTI7CisgIHBEYXRhLT5wSlBFR2RpbmZvMi0+c3JjLT50ZXJtX3NvdXJjZSAgICAgICA9IG1uZ190ZXJtX3NvdXJjZTsKKyAgcERhdGEtPnBKUEVHZGluZm8yLT5zcmMtPm5leHRfaW5wdXRfYnl0ZSAgID0gcERhdGEtPnBKUEVHY3VycmVudDI7CisgIHBEYXRhLT5wSlBFR2RpbmZvMi0+c3JjLT5ieXRlc19pbl9idWZmZXIgICA9IHBEYXRhLT5pSlBFR2J1ZnJlbWFpbjI7CisKKyNlbmRpZiAvKiBNTkdfSU5DTFVERV9JSkc2QiAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0pQRUdfREVDT01QUkVTU0lOSVQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmIC8qIE1OR19JTkNMVURFX0pOR19SRUFEICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkdfUkVBRAorbW5nX3JldGNvZGUgbW5nanBlZ19kZWNvbXByZXNzZGF0YTIgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpUmF3c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBSYXdkYXRhKQoreworICBtbmdfcmV0Y29kZSBpUmV0Y29kZTsKKyAgbW5nX3VpbnQzMiAgaVJlbWFpbjsKKyAgbW5nX3VpbnQ4cCAgcFdvcms7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSlBFR19ERUNPTVBSRVNTREFUQSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoTU5HX0lOQ0xVREVfSUpHNkIpICYmIGRlZmluZWQoTU5HX1VTRV9TRVRKTVApCisgIGlSZXRjb2RlID0gc2V0am1wIChwRGF0YS0+c0Vycm9yYnVmKTsvKiBpbml0aWFsaXplIGxvY2FsIEpQRUcgZXJyb3ItcmVjb3ZlcnkgKi8KKyAgaWYgKGlSZXRjb2RlICE9IDApICAgICAgICAgICAgICAgICAgIC8qIGdvdCBoZXJlIGZyb20gbG9uZ2ptcCA/ICovCisgICAgTU5HX0VSUk9SSiAocERhdGEsIGlSZXRjb2RlKTsgICAgICAvKiB0aGVuIElKRy1saWIgaXNzdWVkIGFuIGVycm9yICovCisjZW5kaWYKKworICBwV29yayAgID0gcFJhd2RhdGE7CisgIGlSZW1haW4gPSBpUmF3c2l6ZTsKKworICBpZiAocERhdGEtPmlKUEVHdG9za2lwMikgICAgICAgICAgICAgLyogSlBFRy1saWIgdG9sZCB1cyB0byBza2lwIHNvbWUgbW9yZSBkYXRhID8gKi8KKyAgeworICAgIGlmIChpUmVtYWluID4gcERhdGEtPmlKUEVHdG9za2lwMikgLyogZW5vdWdoIGRhdGEgaW4gdGhpcyBidWZmZXIgPyAqLworICAgIHsKKyAgICAgIGlSZW1haW4gLT0gcERhdGEtPmlKUEVHdG9za2lwMjsgIC8qIHNraXAgZW5vdWdoIHRvIGFjY2VzcyB0aGUgbmV4dCBieXRlICovCisgICAgICBwV29yayAgICs9IHBEYXRhLT5pSlBFR3Rvc2tpcDI7CisKKyAgICAgIHBEYXRhLT5pSlBFR3Rvc2tpcDIgPSAwOyAgICAgICAgIC8qIG5vIG1vcmUgdG8gc2tpcCB0aGVuICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBwRGF0YS0+aUpQRUd0b3NraXAyIC09IGlSZW1haW47ICAvKiBza2lwIGFsbCBkYXRhIGluIHRoZSBidWZmZXIgKi8KKyAgICAgIGlSZW1haW4gPSAwOyAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCBpbmRpY2F0ZSB0aGlzIGFjY29yZGluZ2x5ICovCisgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlIHNraXAgc2V0IGN1cnJlbnQtcG9pbnRlciB0byBOVUxMICEgKi8KKyAgICBwRGF0YS0+cEpQRUdjdXJyZW50MiA9IHBEYXRhLT5wSlBFR2J1ZjI7CisgIH0KKworICB3aGlsZSAoaVJlbWFpbikgICAgICAgICAgICAgICAgICAgICAgLyogcmVwZWF0IHVudGlsIG5vIG1vcmUgaW5wdXQtYnl0ZXMgKi8KKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5lZWQgdG8gc2hpZnQgYW55dGhpbmcgPyAqLworICAgIGlmICgocERhdGEtPnBKUEVHY3VycmVudDIgPiBwRGF0YS0+cEpQRUdidWYyKSAmJgorICAgICAgICAocERhdGEtPnBKUEVHY3VycmVudDIgLSBwRGF0YS0+cEpQRUdidWYyICsgcERhdGEtPmlKUEVHYnVmcmVtYWluMiArIGlSZW1haW4gPiBwRGF0YS0+aUpQRUdidWZtYXgyKSkKKyAgICB7CisgICAgICBpZiAocERhdGEtPmlKUEVHYnVmcmVtYWluMiA+IDApICAvKiB0aGVuIGRvIHNvICovCisgICAgICAgIE1OR19DT1BZIChwRGF0YS0+cEpQRUdidWYyLCBwRGF0YS0+cEpQRUdjdXJyZW50MiwgcERhdGEtPmlKUEVHYnVmcmVtYWluMik7CisKKyAgICAgIHBEYXRhLT5wSlBFR2N1cnJlbnQyID0gcERhdGEtPnBKUEVHYnVmMjsKKyAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkb2VzIHRoZSByZW1haW5pbmcgaW5wdXQgZml0IGludG8gdGhlIGJ1ZmZlciA/ICovCisgICAgaWYgKHBEYXRhLT5pSlBFR2J1ZnJlbWFpbjIgKyBpUmVtYWluIDw9IHBEYXRhLT5pSlBFR2J1Zm1heDIpCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtb3ZlIHRoZSBsb3QgKi8KKyAgICAgIE1OR19DT1BZICgocERhdGEtPnBKUEVHY3VycmVudDIgKyBwRGF0YS0+aUpQRUdidWZyZW1haW4yKSwgcFdvcmssIGlSZW1haW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRqdXN0IHJlbWFpbmluZ19ieXRlcyBjb3VudGVyICovCisgICAgICBwRGF0YS0+aUpQRUdidWZyZW1haW4yICs9IGlSZW1haW47CisgICAgICBpUmVtYWluID0gMDsgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgaW5kaWNhdGUgdGhlcmUncyBubyBpbnB1dCBsZWZ0ICovCisgICAgfQorICAgIGVsc2UKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNhbGN1bGF0ZSB3aGF0IGRvZXMgZml0ICovCisgICAgICBtbmdfdWludDMyIGlGaXRzID0gcERhdGEtPmlKUEVHYnVmbWF4MiAtIHBEYXRhLT5pSlBFR2J1ZnJlbWFpbjI7CisKKyAgICAgIGlmIChpRml0cyA8PSAwKSAgICAgICAgICAgICAgICAgIC8qIG5vIHNwYWNlIGlzIGp1c3QgYnVnZ2VyICdtIGFsbCAqLworICAgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSlBFR0JVRlRPT1NNQUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vdmUgdGhhdCAqLworICAgICAgTU5HX0NPUFkgKChwRGF0YS0+cEpQRUdjdXJyZW50MiArIHBEYXRhLT5pSlBFR2J1ZnJlbWFpbjIpLCBwV29yaywgaUZpdHMpOworCisgICAgICBwRGF0YS0+aUpQRUdidWZyZW1haW4yICs9IGlGaXRzOyAvKiBhZGp1c3QgcmVtYWluX2J5dGVzIGNvdW50ZXIgKi8KKyAgICAgIGlSZW1haW4gLT0gaUZpdHM7ICAgICAgICAgICAgICAgIC8qIGFuZCB0aGUgaW5wdXQtcGFybXMgKi8KKyAgICAgIHBXb3JrICAgKz0gaUZpdHM7CisgICAgfQorCisjaWZkZWYgTU5HX0lOQ0xVREVfSUpHNkIKKyAgICBwRGF0YS0+cEpQRUdkaW5mbzItPnNyYy0+bmV4dF9pbnB1dF9ieXRlID0gcERhdGEtPnBKUEVHY3VycmVudDI7CisgICAgcERhdGEtPnBKUEVHZGluZm8yLT5zcmMtPmJ5dGVzX2luX2J1ZmZlciA9IHBEYXRhLT5pSlBFR2J1ZnJlbWFpbjI7CisKKyAgICBpZiAoIXBEYXRhLT5iSlBFR2hhc2hlYWRlcjIpICAgICAgIC8qIGhhdmVuJ3QgZ290IHRoZSBoZWFkZXIgeWV0ID8gKi8KKyAgICB7CisgICAgICAvKiBjYWxsIGpwZWdfcmVhZF9oZWFkZXIoKSB0byBvYnRhaW4gaW1hZ2UgaW5mbyAqLworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgICAgICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSlBFR19ERUNPTVBSRVNTREFUQSwgTU5HX0xDX0pQRUdfUkVBRF9IRUFERVIpCisjZW5kaWYKKyAgICAgIGlmIChqcGVnX3JlYWRfaGVhZGVyIChwRGF0YS0+cEpQRUdkaW5mbzIsIFRSVUUpICE9IEpQRUdfU1VTUEVOREVEKQorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5kaWNhdGUgdGhlIGhlYWRlcidzIG9rZSAqLworICAgICAgICBwRGF0YS0+YkpQRUdoYXNoZWFkZXIyID0gTU5HX1RSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZXQncyBkbyBzb21lIHNhbml0eSBjaGVja3MgISAqLworICAgICAgICBpZiAoKHBEYXRhLT5wSlBFR2RpbmZvMi0+aW1hZ2Vfd2lkdGggICE9IHBEYXRhLT5pRGF0YXdpZHRoICkgfHwKKyAgICAgICAgICAgIChwRGF0YS0+cEpQRUdkaW5mbzItPmltYWdlX2hlaWdodCAhPSBwRGF0YS0+aURhdGFoZWlnaHQpICAgICkKKyAgICAgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSlBFR1BBUk1TRVJSKTsKKworICAgICAgICBpZiAocERhdGEtPnBKUEVHZGluZm8yLT5qcGVnX2NvbG9yX3NwYWNlICE9IEpDU19HUkFZU0NBTEUpCisgICAgICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0pQRUdQQVJNU0VSUik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbmRpY2F0ZSB3aGV0aGVyIG9yIG5vdCBpdCdzIHByb2dyZXNzaXZlICovCisgICAgICAgIHBEYXRhLT5iSlBFR3Byb2dyZXNzaXZlMiA9IChtbmdfYm9vbClqcGVnX2hhc19tdWx0aXBsZV9zY2FucyAocERhdGEtPnBKUEVHZGluZm8yKTsKKworICAgICAgICBpZiAocERhdGEtPmJKUEVHcHJvZ3Jlc3NpdmUyKSAgLyogcHJvZ3Jlc3NpdmUgYWxwaGFjaGFubmVsIG5vdCBhbGxvd2VkICEhISAqLworICAgICAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19KUEVHUEFSTVNFUlIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWxsb2NhdGUgYSByb3cgb2YgSlBFRy1zYW1wbGVzICovCisgICAgICAgIGlmIChwRGF0YS0+cEpQRUdkaW5mbzItPmpwZWdfY29sb3Jfc3BhY2UgPT0gSkNTX1lDYkNyKQorICAgICAgICAgIHBEYXRhLT5pSlBFR3Jvd2xlbjIgPSBwRGF0YS0+cEpQRUdkaW5mbzItPmltYWdlX3dpZHRoICogUkdCX1BJWEVMU0laRTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHBEYXRhLT5pSlBFR3Jvd2xlbjIgPSBwRGF0YS0+cEpQRUdkaW5mbzItPmltYWdlX3dpZHRoOworCisgICAgICAgIE1OR19BTExPQyAocERhdGEsIHBEYXRhLT5wSlBFR3JvdzIsIHBEYXRhLT5pSlBFR3Jvd2xlbjIpOworCisgICAgICAgIHBEYXRhLT5pSlBFR2FscGhhcm93ID0gMDsgICAgICAvKiBxdWl0ZSBlbXB0eSB1cCB0byBub3cgKi8KKyAgICAgIH0KKworICAgICAgcERhdGEtPnBKUEVHY3VycmVudDIgICA9IChtbmdfdWludDhwKXBEYXRhLT5wSlBFR2RpbmZvMi0+c3JjLT5uZXh0X2lucHV0X2J5dGU7CisgICAgICBwRGF0YS0+aUpQRUdidWZyZW1haW4yID0gKG1uZ191aW50MzIpcERhdGEtPnBKUEVHZGluZm8yLT5zcmMtPmJ5dGVzX2luX2J1ZmZlcjsKKyAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWNvbXByZXNzIG5vdCBzdGFydGVkID8gKi8KKyAgICBpZiAoKHBEYXRhLT5iSlBFR2hhc2hlYWRlcjIpICYmICghcERhdGEtPmJKUEVHZGVjb3N0YXJ0ZWQyKSkKKyAgICB7CisgICAgICAvKiBzZXQgcGFyYW1ldGVycyBmb3IgZGVjb21wcmVzc2lvbiAqLworCisgICAgICBpZiAocERhdGEtPmJKUEVHcHJvZ3Jlc3NpdmUyKSAgICAvKiBwcm9ncmVzc2l2ZSBkaXNwbGF5ID8gKi8KKyAgICAgICAgcERhdGEtPnBKUEVHZGluZm8yLT5idWZmZXJlZF9pbWFnZSA9IFRSVUU7CisKKyAgICAgIC8qIGpwZWdfc3RhcnRfZGVjb21wcmVzcyguLi4pOyAqLworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgICAgICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSlBFR19ERUNPTVBSRVNTREFUQSwgTU5HX0xDX0pQRUdfU1RBUlRfREVDT01QUkVTUykKKyNlbmRpZgorICAgICAgaWYgKGpwZWdfc3RhcnRfZGVjb21wcmVzcyAocERhdGEtPnBKUEVHZGluZm8yKSA9PSBUUlVFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5kaWNhdGUgaXQgc3RhcnRlZCAqLworICAgICAgICBwRGF0YS0+YkpQRUdkZWNvc3RhcnRlZDIgPSBNTkdfVFJVRTsKKworICAgICAgcERhdGEtPnBKUEVHY3VycmVudDIgICA9IChtbmdfdWludDhwKXBEYXRhLT5wSlBFR2RpbmZvMi0+c3JjLT5uZXh0X2lucHV0X2J5dGU7CisgICAgICBwRGF0YS0+aUpQRUdidWZyZW1haW4yID0gKG1uZ191aW50MzIpcERhdGEtPnBKUEVHZGluZm8yLT5zcmMtPmJ5dGVzX2luX2J1ZmZlcjsKKyAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcm9jZXNzIHNvbWUgc2NhbmxpbmVzID8gKi8KKyAgICBpZiAoKHBEYXRhLT5iSlBFR2hhc2hlYWRlcjIpICYmIChwRGF0YS0+YkpQRUdkZWNvc3RhcnRlZDIpICYmCisJICAgICgoIWpwZWdfaW5wdXRfY29tcGxldGUgKHBEYXRhLT5wSlBFR2RpbmZvMikpIHx8CisgICAgICAgICAocERhdGEtPnBKUEVHZGluZm8yLT5vdXRwdXRfc2NhbmxpbmUgPCBwRGF0YS0+cEpQRUdkaW5mbzItPm91dHB1dF9oZWlnaHQpKSkKKyAgICB7CisgICAgICBtbmdfaW50MzIgaUxpbmVzOworCisgICAgICAvKiBmb3IgKGVhY2ggb3V0cHV0IHBhc3MpICovCisgICAgICBkbworICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkcmVzcyB0aGUgcm93IG91dHB1dCBidWZmZXIgKi8KKyAgICAgICAgSlNBTVBST1cgcFJvdyA9IChKU0FNUFJPVylwRGF0YS0+cEpQRUdyb3cyOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0IG5ldyBwYXNzID8gKi8KKyAgICAgICAgaWYgKChwRGF0YS0+YkpQRUdwcm9ncmVzc2l2ZTIpICYmCisgICAgICAgICAgICAoKCFwRGF0YS0+YkpQRUdzY2Fuc3RhcnRlZDIpIHx8CisgICAgICAgICAgICAgKHBEYXRhLT5wSlBFR2RpbmZvMi0+b3V0cHV0X3NjYW5saW5lID49IHBEYXRhLT5wSlBFR2RpbmZvMi0+b3V0cHV0X2hlaWdodCkpKQorICAgICAgICB7CisgICAgICAgICAgcERhdGEtPmJKUEVHc2NhbnN0YXJ0ZWQyID0gTU5HX1RSVUU7CisKKyAgICAgICAgICAvKiBhZGp1c3Qgb3V0cHV0IGRlY29tcHJlc3Npb24gcGFyYW1ldGVycyBpZiByZXF1aXJlZCAqLworICAgICAgICAgIC8qIG5vcCAqLworCisgICAgICAgICAgLyogc3RhcnQgYSBuZXcgb3V0cHV0IHBhc3MgKi8KKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICAgICAgICAgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9KUEVHX0RFQ09NUFJFU1NEQVRBLCBNTkdfTENfSlBFR19TVEFSVF9PVVRQVVQpCisjZW5kaWYKKyAgICAgICAgICBqcGVnX3N0YXJ0X291dHB1dCAocERhdGEtPnBKUEVHZGluZm8yLCBwRGF0YS0+cEpQRUdkaW5mbzItPmlucHV0X3NjYW5fbnVtYmVyKTsKKworICAgICAgICAgIHBEYXRhLT5pSlBFR3JvdyA9IDA7ICAgICAgICAgLyogc3RhcnQgYXQgcm93IDAgaW4gdGhlIGltYWdlIGFnYWluICovCisgICAgICAgIH0KKworICAgICAgICAvKiB3aGlsZSAoc2NhbiBsaW5lcyByZW1haW4gdG8gYmUgcmVhZCkgKi8KKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgIC8qICAganBlZ19yZWFkX3NjYW5saW5lcyguLi4pOyAqLworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgICAgICAgICAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0pQRUdfREVDT01QUkVTU0RBVEEsIE1OR19MQ19KUEVHX1JFQURfU0NBTkxJTkVTKQorI2VuZGlmCisgICAgICAgICAgaUxpbmVzID0ganBlZ19yZWFkX3NjYW5saW5lcyAocERhdGEtPnBKUEVHZGluZm8yLCAoSlNBTVBBUlJBWSkmcFJvdywgMSk7CisKKyAgICAgICAgICBwRGF0YS0+cEpQRUdjdXJyZW50MiAgID0gKG1uZ191aW50OHApcERhdGEtPnBKUEVHZGluZm8yLT5zcmMtPm5leHRfaW5wdXRfYnl0ZTsKKyAgICAgICAgICBwRGF0YS0+aUpQRUdidWZyZW1haW4yID0gKG1uZ191aW50MzIpcERhdGEtPnBKUEVHZGluZm8yLT5zcmMtPmJ5dGVzX2luX2J1ZmZlcjsKKworICAgICAgICAgIGlmIChpTGluZXMgPiAwKSAgICAgICAgICAgICAgLyogZ290IHNvbWV0aGluZyA/ICovCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKHBEYXRhLT5mU3RvcmVyb3czKSAgICAgLyogc3RvcmUgaW4gb2JqZWN0ID8gKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaVJldGNvZGUgPSAoKG1uZ19zdG9yZXJvdylwRGF0YS0+ZlN0b3Jlcm93MykgKHBEYXRhKTsKKworICAgICAgICAgICAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gaVJldGNvZGU7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKChwRGF0YS0+cEpQRUdkaW5mbzItPm91dHB1dF9zY2FubGluZSA8IHBEYXRhLT5wSlBFR2RpbmZvMi0+b3V0cHV0X2hlaWdodCkgJiYKKyAgICAgICAgICAgICAgIChpTGluZXMgPiAwKSk7ICAgICAgICAgIC8qIHVudGlsIGVuZC1vZi1pbWFnZSBvciBub3QgZW5vdWdoIGlucHV0LWRhdGEgKi8KKworICAgICAgICAvKiB0ZXJtaW5hdGUgb3V0cHV0IHBhc3MgKi8KKyAgICAgICAgaWYgKChwRGF0YS0+YkpQRUdwcm9ncmVzc2l2ZTIpICYmCisgICAgICAgICAgICAocERhdGEtPnBKUEVHZGluZm8yLT5vdXRwdXRfc2NhbmxpbmUgPj0gcERhdGEtPnBKUEVHZGluZm8yLT5vdXRwdXRfaGVpZ2h0KSkKKyAgICAgICAgeworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgICAgICAgICAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0pQRUdfREVDT01QUkVTU0RBVEEsIE1OR19MQ19KUEVHX0ZJTklTSF9PVVRQVVQpCisjZW5kaWYKKyAgICAgICAgICBpZiAoanBlZ19maW5pc2hfb3V0cHV0IChwRGF0YS0+cEpQRUdkaW5mbzIpID09IEpQRUdfU1VTUEVOREVEKQorICAgICAgICAgICAganBlZ19maW5pc2hfb3V0cHV0IChwRGF0YS0+cEpQRUdkaW5mbzIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhpcyBzY2FuIGhhcyBlbmRlZCAqLworICAgICAgICAgIHBEYXRhLT5iSlBFR3NjYW5zdGFydGVkMiA9IE1OR19GQUxTRTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgd2hpbGUgKCghanBlZ19pbnB1dF9jb21wbGV0ZSAocERhdGEtPnBKUEVHZGluZm8yKSkgJiYgKGlMaW5lcyA+IDApKTsKKyAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgb2YgaW1hZ2UgPyAqLworICAgIGlmICgocERhdGEtPmJKUEVHaGFzaGVhZGVyMikgJiYgKHBEYXRhLT5iSlBFR2RlY29zdGFydGVkMikgJiYKKyAgICAgICAgKGpwZWdfaW5wdXRfY29tcGxldGUgKHBEYXRhLT5wSlBFR2RpbmZvMikpICYmCisgICAgICAgIChwRGF0YS0+cEpQRUdkaW5mbzItPmlucHV0X3NjYW5fbnVtYmVyID09IHBEYXRhLT5wSlBFR2RpbmZvMi0+b3V0cHV0X3NjYW5fbnVtYmVyKSkKKyAgICB7CisgICAgICAvKiBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzKC4uLik7ICovCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgICAgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9KUEVHX0RFQ09NUFJFU1NEQVRBLCBNTkdfTENfSlBFR19GSU5JU0hfREVDT01QUkVTUykKKyNlbmRpZgorICAgICAgaWYgKGpwZWdfZmluaXNoX2RlY29tcHJlc3MgKHBEYXRhLT5wSlBFR2RpbmZvMikgPT0gVFJVRSkKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluZGljYXRlIGl0J3MgZG9uZSAqLworICAgICAgICBwRGF0YS0+YkpQRUdoYXNoZWFkZXIyICAgPSBNTkdfRkFMU0U7CisgICAgICAgIHBEYXRhLT5iSlBFR2RlY29zdGFydGVkMiA9IE1OR19GQUxTRTsKKyAgICAgICAgcERhdGEtPnBKUEVHY3VycmVudDIgICAgID0gKG1uZ191aW50OHApcERhdGEtPnBKUEVHZGluZm8yLT5zcmMtPm5leHRfaW5wdXRfYnl0ZTsKKyAgICAgICAgcERhdGEtPmlKUEVHYnVmcmVtYWluMiAgID0gKG1uZ191aW50MzIpcERhdGEtPnBKUEVHZGluZm8yLT5zcmMtPmJ5dGVzX2luX2J1ZmZlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlbWFpbmluZyBmbHVmZiBpcyBhbiBlcnJvciAhICovCisgICAgICAgIGlmICgocERhdGEtPmlKUEVHYnVmcmVtYWluMiA+IDApIHx8IChpUmVtYWluID4gMCkpCisgICAgICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1RPT01VQ0hKREFUKTsKKyAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogTU5HX0lOQ0xVREVfSUpHNkIgKi8KKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0pQRUdfREVDT01QUkVTU0RBVEEsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmIC8qIE1OR19JTkNMVURFX0pOR19SRUFEICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkdfUkVBRAorbW5nX3JldGNvZGUgbW5nanBlZ19kZWNvbXByZXNzZnJlZTIgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyNpZiBkZWZpbmVkKE1OR19JTkNMVURFX0lKRzZCKSAmJiBkZWZpbmVkKE1OR19VU0VfU0VUSk1QKQorICBtbmdfcmV0Y29kZSBpUmV0Y29kZTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0pQRUdfREVDT01QUkVTU0ZSRUUsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworI2lmZGVmIE1OR19JTkNMVURFX0lKRzZCCisjaWZkZWYgTU5HX1VTRV9TRVRKTVAKKyAgaVJldGNvZGUgPSBzZXRqbXAgKHBEYXRhLT5zRXJyb3JidWYpOy8qIHNldHVwIGxvY2FsIEpQRUcgZXJyb3ItcmVjb3ZlcnkgKi8KKyAgaWYgKGlSZXRjb2RlICE9IDApICAgICAgICAgICAgICAgICAgIC8qIGdvdCBoZXJlIGZyb20gbG9uZ2ptcCA/ICovCisgICAgTU5HX0VSUk9SSiAocERhdGEsIGlSZXRjb2RlKTsgICAgICAvKiB0aGVuIElKRy1saWIgaXNzdWVkIGFuIGVycm9yICovCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZyZWUgdGhlIHJvdyBvZiBKUEVHLXNhbXBsZXMqLworICBNTkdfRlJFRSAocERhdGEsIHBEYXRhLT5wSlBFR3JvdzIsIHBEYXRhLT5pSlBFR3Jvd2xlbjIpOworCisgIC8qIHJlbGVhc2UgdGhlIEpQRUcgZGVjb21wcmVzc2lvbiBvYmplY3QgKi8KKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSlBFR19ERUNPTVBSRVNTRlJFRSwgTU5HX0xDX0pQRUdfREVTVFJPWV9ERUNPTVBSRVNTKQorI2VuZGlmCisgIGpwZWdfZGVzdHJveV9kZWNvbXByZXNzIChwRGF0YS0+cEpQRUdkaW5mbzIpOworCisgIHBEYXRhLT5iSlBFR2RlY29tcHJlc3MyID0gTU5HX0ZBTFNFOyAvKiBpbmRpY2F0ZSBpdCdzIGRvbmUgKi8KKworI2VuZGlmIC8qIE1OR19JTkNMVURFX0lKRzZCICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSlBFR19ERUNPTVBSRVNTRlJFRSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYgLyogTU5HX0lOQ0xVREVfSk5HX1JFQUQgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2VuZGlmIC8qIE1OR19JTkNMVURFX0pORyAmJiBNTkdfSU5DTFVERV9ESVNQTEFZX1BST0NTICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqIGVuZCBvZiBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKwpkaWZmIC0tZ2l0IGEvZmlsZXMvU291cmNlL0xpYk1ORy9saWJtbmdfanBlZy5oIGIvZmlsZXMvU291cmNlL0xpYk1ORy9saWJtbmdfanBlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNzJhZjkKLS0tIC9kZXYvbnVsbAorKysgYi9maWxlcy9Tb3VyY2UvTGliTU5HL2xpYm1uZ19qcGVnLmgKQEAgLTAsMCArMSw1NyBAQAorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIGxpYm1uZy5oICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIHByb2plY3QgICA6IGxpYm1uZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBmaWxlICAgICAgOiBsaWJtbmdfanBlZy5oICAgICAgICAgICAgIGNvcHlyaWdodCAoYykgMjAwMC0yMDAyIEcuSnV5biAgICogKi8KKy8qICogdmVyc2lvbiAgIDogMS4wLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBwdXJwb3NlICAgOiBKUEVHIGxpYnJhcnkgaW50ZXJmYWNlIChkZWZpbml0aW9uKSAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGF1dGhvciAgICA6IEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogY29tbWVudCAgIDogRGVmaW5pdGlvbiBvZiB0aGUgSlBFRyBsaWJyYXJ5IGludGVyZmFjZSAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBjaGFuZ2VzICAgOiAwLjUuMSAtIDA1LzA4LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjaGFuZ2VkIHN0cmljdC1BTlNJIHN0dWZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMiAtIDA4LzA1LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjaGFuZ2VkIGZpbGUtcHJlZml4ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMyAtIDEwLzE2LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBzdXBwb3J0IGZvciBKREFBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmIGRlZmluZWQoX19CT1JMQU5EQ19fKSAmJiBkZWZpbmVkKE1OR19TVFJJQ1RfQU5TSSkKKyNwcmFnbWEgb3B0aW9uIC1BICAgICAgICAgICAgICAgICAgICAgIC8qIGZvcmNlIEFOU0ktQyAqLworI2VuZGlmCisKKyNpZm5kZWYgX2xpYm1uZ19qcGVnX2hfCisjZGVmaW5lIF9saWJtbmdfanBlZ19oXworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdqcGVnX2luaXRpYWxpemUgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdqcGVnX2NsZWFudXAgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CisKK21uZ19yZXRjb2RlIG1uZ2pwZWdfZGVjb21wcmVzc2luaXQgIChtbmdfZGF0YXAgIHBEYXRhKTsKK21uZ19yZXRjb2RlIG1uZ2pwZWdfZGVjb21wcmVzc2RhdGEgIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaVJhd3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwUmF3ZGF0YSk7CittbmdfcmV0Y29kZSBtbmdqcGVnX2RlY29tcHJlc3NmcmVlICAobW5nX2RhdGFwICBwRGF0YSk7CisKK21uZ19yZXRjb2RlIG1uZ2pwZWdfZGVjb21wcmVzc2luaXQyIChtbmdfZGF0YXAgIHBEYXRhKTsKK21uZ19yZXRjb2RlIG1uZ2pwZWdfZGVjb21wcmVzc2RhdGEyIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaVJhd3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwUmF3ZGF0YSk7CittbmdfcmV0Y29kZSBtbmdqcGVnX2RlY29tcHJlc3NmcmVlMiAobW5nX2RhdGFwICBwRGF0YSk7CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNlbmRpZiAvKiBfbGlibW5nX2pwZWdfaF8gKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogZW5kIG9mIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwpkaWZmIC0tZ2l0IGEvZmlsZXMvU291cmNlL0xpYk1ORy9saWJtbmdfbWVtb3J5LmggYi9maWxlcy9Tb3VyY2UvTGliTU5HL2xpYm1uZ19tZW1vcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTJkMGMxCi0tLSAvZGV2L251bGwKKysrIGIvZmlsZXMvU291cmNlL0xpYk1ORy9saWJtbmdfbWVtb3J5LmgKQEAgLTAsMCArMSw2NCBAQAorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIGxpYm1uZy5oICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIHByb2plY3QgICA6IGxpYm1uZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBmaWxlICAgICAgOiBsaWJtbmdfbWVtb3J5LmggICAgICAgICAgIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEcuSnV5biAgICogKi8KKy8qICogdmVyc2lvbiAgIDogMS4wLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBwdXJwb3NlICAgOiBNZW1vcnkgbWFuYWdlbWVudCAoZGVmaW5pdGlvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGF1dGhvciAgICA6IEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogY29tbWVudCAgIDogRGVmaW5pdGlvbiBvZiBtZW1vcnkgbWFuYWdlbWVudCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBjaGFuZ2VzICAgOiAwLjUuMSAtIDA1LzA4LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjaGFuZ2VkIHN0cmljdC1BTlNJIHN0dWZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMyAtIDA2LzEyLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBzd2FwcGVkIE1OR19DT1BZIHBhcmFtZXRlci1uYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4zIC0gMDYvMjcvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNoYW5nZWQgc2l6ZSBwYXJhbWV0ZXIgdG8gbW5nX3NpemVfdCAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4yIC0gMDgvMDUvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNoYW5nZWQgZmlsZS1wcmVmaXhlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pICYmIGRlZmluZWQoTU5HX1NUUklDVF9BTlNJKQorI3ByYWdtYSBvcHRpb24gLUEgICAgICAgICAgICAgICAgICAgICAgLyogZm9yY2UgQU5TSS1DICovCisjZW5kaWYKKworI2lmbmRlZiBfbGlibW5nX21lbW9yeV9oXworI2RlZmluZSBfbGlibW5nX21lbW9yeV9oXworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogR2VuZXJpYyBtZW1vcnkgbWFuYWdlciBtYWNyb3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19JTlRFUk5BTF9NRU1NTkdNVAorI2RlZmluZSBNTkdfQUxMT0MoSCxQLEwpICB7IFAgPSBjYWxsb2MgKDEsIChtbmdfc2l6ZV90KShMKSk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUCA9PSAwKSB7IE1OR19FUlJPUiAoSCwgTU5HX09VVE9GTUVNT1JZKSB9IH0KKyNkZWZpbmUgTU5HX0FMTE9DWChILFAsTCkgeyBQID0gY2FsbG9jICgxLCAobW5nX3NpemVfdCkoTCkpOyB9CisjZGVmaW5lIE1OR19GUkVFKEgsUCxMKSAgIHsgaWYgKFApIHsgZnJlZSAoUCk7IFAgPSAwOyB9IH0KKyNkZWZpbmUgTU5HX0ZSRUVYKEgsUCxMKSAgeyBpZiAoUCkgZnJlZSAoUCk7IH0KKyNlbHNlCisjZGVmaW5lIE1OR19BTExPQyhILFAsTCkgIHsgUCA9IEgtPmZNZW1hbGxvYyAoKG1uZ19zaXplX3QpKEwpKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChQID09IDApIHsgTU5HX0VSUk9SIChILCBNTkdfT1VUT0ZNRU1PUlkpIH0gfQorI2RlZmluZSBNTkdfQUxMT0NYKEgsUCxMKSB7IFAgPSBILT5mTWVtYWxsb2MgKChtbmdfc2l6ZV90KShMKSk7IH0KKyNkZWZpbmUgTU5HX0ZSRUUoSCxQLEwpICAgeyBpZiAoUCkgeyBILT5mTWVtZnJlZSAoUCwgKG1uZ19zaXplX3QpKEwpKTsgUCA9IDA7IH0gfQorI2RlZmluZSBNTkdfRlJFRVgoSCxQLEwpICB7IGlmIChQKSB7IEgtPmZNZW1mcmVlIChQLCAobW5nX3NpemVfdCkoTCkpOyB9IH0KKyNlbmRpZiAvKiBtbmdfaW50ZXJuYWxfbWVtbW5nbXQgKi8KKworI2RlZmluZSBNTkdfQ09QWShELFMsTCkgICB7IG1lbWNweSAoRCwgUywgKG1uZ19zaXplX3QpKEwpKTsgfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjZW5kaWYgLyogX2xpYm1uZ19tZW1vcnlfaF8gKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogZW5kIG9mIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwpkaWZmIC0tZ2l0IGEvZmlsZXMvU291cmNlL0xpYk1ORy9saWJtbmdfb2JqZWN0X3ByYy5jIGIvZmlsZXMvU291cmNlL0xpYk1ORy9saWJtbmdfb2JqZWN0X3ByYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NjkxZmYKLS0tIC9kZXYvbnVsbAorKysgYi9maWxlcy9Tb3VyY2UvTGliTU5HL2xpYm1uZ19vYmplY3RfcHJjLmMKQEAgLTAsMCArMSw2OTk4IEBACisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gbGlibW5nLmggICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogcHJvamVjdCAgIDogbGlibW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGZpbGUgICAgICA6IGxpYm1uZ19vYmplY3RfcHJjLmMgICAgICAgY29weXJpZ2h0IChjKSAyMDAwLTIwMDcgRy5KdXluICAgKiAqLworLyogKiB2ZXJzaW9uICAgOiAxLjAuMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIHB1cnBvc2UgICA6IE9iamVjdCBwcm9jZXNzaW5nIHJvdXRpbmVzIChpbXBsZW1lbnRhdGlvbikgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogYXV0aG9yICAgIDogRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBjb21tZW50ICAgOiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW50ZXJuYWwgb2JqZWN0IHByb2Nlc3Npbmcgcm91dGluZXMgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGNoYW5nZXMgICA6IDAuNS4xIC0gMDUvMDgvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNoYW5nZWQgc3RyaWN0LUFOU0kgc3R1ZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjEgLSAwNS8xMi8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2hhbmdlZCB0cmFjZSB0byBtYWNybyBmb3IgY2FsbGJhY2sgZXJyb3ItcmVwb3J0aW5nICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjIgLSAwNS8yMC8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgdG8gc3VwcG9ydCBKTkcgb2JqZWN0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMiAtIDA1LzI0LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBzdXBwb3J0IGZvciBnbG9iYWwgY29sb3ItY2h1bmtzIGluIGFuaW1hdGlvbiAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgc3VwcG9ydCBmb3IgZ2xvYmFsIFBMVEUsdFJOUyxiS0dEIGluIGFuaW1hdGlvbiAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIFNBVkUgJiBTRUVLIGFuaW1hdGlvbiBvYmplY3RzICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjIgLSAwNS8yOS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgaW5pdGlhbGl6YXRpb24gb2YgZnJhbWVuci9sYXllcm5yL3BsYXl0aW1lICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNoYW5nZWQgYW5pX29iamVjdCBjcmVhdGUgcm91dGluZXMgbm90IHRvIHJldHVybiB0aGUgICAgICogKi8KKy8qICogICAgICAgICAgICAgICBjcmVhdGVkIG9iamVjdCAod2Fzbid0IG5lY2Vzc2FyeSkgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4yIC0gMDUvMzAvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIG9iamVjdCBwcm9tb3Rpb24gcm91dGluZSAoUFJPTSBoYW5kbGluZykgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBhbmktb2JqZWN0IHJvdXRpbmVzIGZvciBkZWx0YS1pbWFnZSBwcm9jZXNzaW5nICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgY29tcHJlc3Npb24vZmlsdGVyL2ludGVybGFjZSBmaWVsZHMgdG8gICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgIG9iamVjdC1idWZmZXIgZm9yIGRlbHRhLWltYWdlIHByb2Nlc3NpbmcgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4zIC0gMDYvMTcvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNoYW5nZWQgc3VwcG9ydCBmb3IgZGVsdGEtaW1hZ2UgcHJvY2Vzc2luZyAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjMgLSAwNi8yMC8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgc29tZSBzbWFsbCB0aGluZ3MgKGFzIHByZWNhdXRpb24pICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMyAtIDA2LzIxLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBwcm9jZXNzaW5nIG9mIFBMVEUvdFJOUyAmIGNvbG9yLWluZm8gZm9yICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgZGVsdGEtaW1hZ2VzIGluIHRoZSBhbmlfb2JqZWN0cyBjaGFpbiAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMyAtIDA2LzIyLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBzdXBwb3J0IGZvciBQUExUIGNodW5rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMSAtIDA3LzA3LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBzdXBwb3J0IGZvciBmcmVlemUvcmVzdGFydC9yZXN1bWUgJiBnb194eHh4ICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4xIC0gMDcvMTYvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIHN1cHBvcnQgZm9yIG1uZ19kaXNwbGF5KCkgYWZ0ZXIgbW5nX3JlYWQoKSAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4yIC0gMDcvMjkvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIHNtYWxsIGJ1Z3MgaW4gZGlzcGxheSBwcm9jZXNzaW5nICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjIgLSAwOC8wNS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2hhbmdlZCBmaWxlLXByZWZpeGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjMgLSAwOC8wNy8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gQjExMTMwMCAtIGZpeHVwIGZvciBpbXByb3ZlZCBwb3J0YWJpbGl0eSAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMyAtIDA4LzI2LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBNQUdOIGNodW5rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4zIC0gMDkvMTAvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIERFRkkgYmVoYXZpb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjMgLSAxMC8xNy8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgdmFsaWQtZmxhZyB0byBzdG9yZWQgb2JqZWN0cyBmb3IgcmVhZCgpIC8gZGlzcGxheSgpKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHJvdXRpbmUgdG8gZGlzY2FyZCAiaW52YWxpZCIgb2JqZWN0cyAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjMgLSAxMC8xOC8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgZGVsdGEtcHJvY2Vzc2luZyBiZWhhdmlvciAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMyAtIDEwLzE5LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBzdG9yYWdlIGZvciBwaXhlbC0vYWxwaGEtc2FtcGxlZGVwdGggZm9yIGRlbHRhJ3MgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuNCAtICAxLzE4LzIwMDEgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSByZW1vdmVkICJvbGQiIE1BR04gbWV0aG9kcyAzICYgNCAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgIm5ldyIgTUFHTiBtZXRob2RzIDMsIDQgJiA1ICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjUgLSAgMS8yMi8yMDAxIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gQjEyOTY4MSAtIGZpeGVkIGNvbXBpbGVyIHdhcm5pbmdzIFNHSS9Jcml4ICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjIgLSAwNi8yMy8yMDAxIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgb3B0aW1pemF0aW9uIG9wdGlvbiBmb3IgTU5HLXZpZGVvIHBsYXliYWNrICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAwOC8xNS8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY29tcGxldGVkIFBST00gc3VwcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDA4LzE2LzIwMDIgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjb21wbGV0ZWQgTUFHTiBzdXBwb3J0ICgxNi1iaXQgZnVuY3Rpb25zKSAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC41IC0gMDgvMTkvMjAwMiAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIEI1OTcxMzQgLSBsaWJtbmcgcG9sbHV0ZXMgdGhlIGxpbmtlciBuYW1lc3BhY2UgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAwOS8xMy8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgcmVhZC93cml0ZSBvZiBNQUdOIGNodW5rICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDA5LzE1LzIwMDIgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBldmVudCBoYW5kbGluZyBmb3IgZHluYW1pYyBNTkcgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC41IC0gMDkvMjAvMjAwMiAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHN1cHBvcnQgZm9yIFBBU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAwOS8yMy8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgcmVzZXRfb2JqZWN0X2RldGFpbCB0byBjbGVhciBvbGQgYnVmZmVyICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGluLW1lbW9yeSBjb2xvci1jb3JyZWN0aW9uIG9mIGFic3RyYWN0IGltYWdlcyAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAxMC8wNS8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgcHJvYmxlbSB3aXRoIGNsb25lZCBvYmplY3RzIG1hcmtlZCBhcyBpbnZhbGlkICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIHByb2JsZW0gY2xvbmluZyBmcm96ZW4gb2JqZWN0X2J1ZmZlcnMgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAxMC8wNy8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgRElTQyBzdXBwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDExLzA0LzIwMDIgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaXhlZCBnb2ZyYW1lL2dvbGF5ZXIvZ290aW1lIHByb2Nlc3NpbmcgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC41IC0gMTEvMDcvMjAwMiAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIG1hZ25pZmljYXRpb24gYnVnIHdpdGggb2JqZWN0IDAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAwMS8xOS8yMDAzIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gQjY2NDkxMSAtIGZpeGVkIGJ1ZmZlciBvdmVyZmxvdyBkdXJpbmcgaW5pdCAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjYgLSAwNC8xOS8yMDAzIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgcHJvYmxlbSB3aXRoIGluZmluaXRlIGxvb3BzIGR1cmluZyByZWFkZGlzcGxheSgpICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNiAtIDA1LzI1LzIwMDMgLSBHLlItUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBNTkdfU0tJUENIVU5LX2NITksgZm9vdHByaW50IG9wdGltaXphdGlvbnMgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC42IC0gMDYvMDkvMjAwMyAtIEcuIFItUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGNvbmRpdGlvbmFscyBhcm91bmQgOC1iaXQgbWFnbiByb3V0aW5lcyAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjYgLSAwNy8wNy8yMDAzIC0gRy5SLVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgY29uZGl0aW9uYWxzIGFyb3VuZCBzb21lIEpORy1zdXBwb3J0aW5nIGNvZGUgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIHJlbW92ZWQgY29uZGl0aW9uYWxzIGFyb3VuZCA4LWJpdCBtYWduIHJvdXRpbmVzICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBjb25kaXRpb25hbHMgYXJvdW5kIGRlbHRhLXBuZyBhbmQgMTYtYml0IGNvZGUgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC42IC0gMDcvMTQvMjAwMyAtIEcuUi1QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIE1OR19OT19MT09QX1NJR05BTFNfU1VQUE9SVEVEIGNvbmRpdGlvbmFsICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjYgLSAwNy8yOS8yMDAzIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgaW52YWxpZCB0ZXN0IGluIHByb21vdGVfaW1hZ2VvYmplY3QgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNiAtIDA3LzI5LzIwMDMgLSBHLlItUC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBjb25kaXRpb25hbHMgYXJvdW5kIFBBU1QgY2h1bmsgc3VwcG9ydCAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC42IC0gMDgvMTcvMjAwMyAtIEcuUi1QLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGNvbmRpdGlvbmFscyBhcm91bmQgTUFHTiBjaHVuayBzdXBwb3J0ICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC43IC0gMDMvMjEvMjAwNCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIHNvbWUgNjQtYml0IHBsYXRmb3JtIGNvbXBpbGVyIHdhcm5pbmdzICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC45IC0gMTAvMTAvMjAwNCAtIEcuUi1QLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIE1OR19OT18xXzJfNEJJVF9TVVBQT1JUIHN1cHBvcnQgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjkgLSAxMi8wNS8yMDA0IC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgY29uZGl0aW9uYWwgTU5HX09QVElNSVpFX09CSkNMRUFOVVAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuOSAtIDEyLzExLzIwMDQgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBjb25kaXRpb25hbCBNTkdfT1BUSU1JWkVfRElTUExBWUNBTExTICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC45IC0gMTIvMzEvMjAwNCAtIEcuUi1QLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIHdhcm5pbmdzIGFib3V0IHBvc3NpYmxlIHVuaW5pdGlhbGl6ZWQgcG9pbnRlcnMgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjkgLSAwMS8wMi8yMDA1IC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4aW5nIHNvbWUgY29tcGlsZXItd2FybmluZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjEwIC0gMDIvMDcvMjAwNSAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgc29tZSBjb21waWxlci13YXJuaW5ncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuMTAgLSAwNy8zMC8yMDA1IC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaXhlZCBwcm9ibGVtIHdpdGggQ0xPTiBvYmplY3QgZHVyaW5nIHJlYWRkaXNwbGF5KCkgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC4xMCAtIDA0LzA4LzIwMDcgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHN1cHBvcnQgZm9yIG1QTkcgcHJvcG9zYWwgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjEwIC0gMDQvMTIvMjAwNyAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgc3VwcG9ydCBmb3IgQU5HIHByb3Bvc2FsICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpbmNsdWRlICJsaWJtbmcuaCIKKyNpbmNsdWRlICJsaWJtbmdfZGF0YS5oIgorI2luY2x1ZGUgImxpYm1uZ19lcnJvci5oIgorI2luY2x1ZGUgImxpYm1uZ190cmFjZS5oIgorI2lmZGVmIF9fQk9STEFORENfXworI3ByYWdtYSBoZHJzdG9wCisjZW5kaWYKKyNpbmNsdWRlICJsaWJtbmdfbWVtb3J5LmgiCisjaW5jbHVkZSAibGlibW5nX2NodW5rcy5oIgorI2luY2x1ZGUgImxpYm1uZ19vYmplY3RzLmgiCisjaW5jbHVkZSAibGlibW5nX2Rpc3BsYXkuaCIKKyNpbmNsdWRlICJsaWJtbmdfcGl4ZWxzLmgiCisjaW5jbHVkZSAibGlibW5nX29iamVjdF9wcmMuaCIKKyNpbmNsdWRlICJsaWJtbmdfY21zLmgiCisKKyNpZiBkZWZpbmVkKF9fQk9STEFORENfXykgJiYgZGVmaW5lZChNTkdfU1RSSUNUX0FOU0kpCisjcHJhZ21hIG9wdGlvbiAtQSAgICAgICAgICAgICAgICAgICAgICAvKiBmb3JjZSBBTlNJLUMgKi8KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX0lOQ0xVREVfRElTUExBWV9QUk9DUworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogR2VuZXJpYyBvYmplY3Qgcm91dGluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX2Ryb3BfaW52YWxpZF9vYmplY3RzIChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ19vYmplY3RwICAgICAgIHBPYmplY3Q7CisgIG1uZ19vYmplY3RwICAgICAgIHBOZXh0OworICBtbmdfY2xlYW51cG9iamVjdCBmQ2xlYW51cDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9EUk9QX0lOVkFMSURfT0JKRUNUUywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBPYmplY3QgPSBwRGF0YS0+cEZpcnN0aW1nb2JqOyAgICAgICAvKiBnZXQgZmlyc3Qgc3RvcmVkIGltYWdlLW9iamVjdCAoaWYgYW55KSAqLworCisgIHdoaWxlIChwT2JqZWN0KSAgICAgICAgICAgICAgICAgICAgICAvKiBtb3JlIG9iamVjdHMgdG8gY2hlY2sgPyAqLworICB7CisgICAgcE5leHQgPSAoKG1uZ19vYmplY3RfaGVhZGVycClwT2JqZWN0KS0+cE5leHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnZhbGlkID8gKi8KKyAgICBpZiAoISgobW5nX2ltYWdlcClwT2JqZWN0KS0+YlZhbGlkKQorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2FsbCBhcHByb3ByaWF0ZSBjbGVhbnVwICovCisgICAgICBmQ2xlYW51cCA9ICgobW5nX29iamVjdF9oZWFkZXJwKXBPYmplY3QpLT5mQ2xlYW51cDsKKyAgICAgIGZDbGVhbnVwIChwRGF0YSwgcE9iamVjdCk7CisgICAgfQorCisgICAgcE9iamVjdCA9IHBOZXh0OyAgICAgICAgICAgICAgICAgICAvKiBuZWVlZXh0ICovCisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9EUk9QX0lOVkFMSURfT0JKRUNUUywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfT1BUSU1JWkVfT0JKQ0xFQU5VUAorTU5HX0xPQ0FMIG1uZ19yZXRjb2RlIGNyZWF0ZV9vYmpfZ2VuZXJhbCAobW5nX2RhdGFwICAgICAgICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3NpemVfdCAgICAgICAgIGlPYmpzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2NsZWFudXBvYmplY3QgIGZDbGVhbnVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3Byb2Nlc3NvYmplY3QgIGZQcm9jZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3B0ciAgICAgICAgICAgICpwcE9iamVjdCkKK3sKKyAgbW5nX29iamVjdF9oZWFkZXJwIHBXb3JrOworCisgIE1OR19BTExPQyAocERhdGEsIHBXb3JrLCBpT2Jqc2l6ZSk7CisKKyAgcFdvcmstPmZDbGVhbnVwID0gZkNsZWFudXA7CisgIHBXb3JrLT5mUHJvY2VzcyA9IGZQcm9jZXNzOworICBwV29yay0+aU9ianNpemUgPSBpT2Jqc2l6ZTsKKyAgKnBwT2JqZWN0ICAgICAgID0gKG1uZ19wdHIpcFdvcms7CisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitNTkdfTE9DQUwgbW5nX3JldGNvZGUgbW5nX2ZyZWVfb2JqX2dlbmVyYWwgKG1uZ19kYXRhcCAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfb2JqZWN0cCBwT2JqZWN0KQoreworICBNTkdfRlJFRVggKHBEYXRhLCBwT2JqZWN0LCAoKG1uZ19vYmplY3RfaGVhZGVycClwT2JqZWN0KS0+aU9ianNpemUpOworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIEltYWdlLWRhdGEtb2JqZWN0IHJvdXRpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogdGhlc2UgaGFuZGxlIHRoZSAib2JqZWN0IGJ1ZmZlciIgYXMgZGVmaW5lZCBieSB0aGUgTU5HIHNwZWNpZmljYXRpb24gICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX2NyZWF0ZV9pbWFnZWRhdGFvYmplY3QgKG1uZ19kYXRhcCAgICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgICAgIGJDb25jcmV0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfYm9vbCAgICAgICBiVmlld2FibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgaVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgIGlIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgaUJpdGRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgIGlDb2xvcnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgaUNvbXByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgIGlGaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgaUludGVybGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW1hZ2VkYXRhcCAqcHBPYmplY3QpCit7CisgIG1uZ19pbWFnZWRhdGFwIHBJbWFnZWRhdGE7CisgIG1uZ191aW50MzIgaVNhbXBsZXNpemUgPSAwOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0NSRUFURV9JTUdEQVRBT0JKRUNULCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgYSBidWZmZXIgKi8KKyNpZmRlZiBNTkdfT1BUSU1JWkVfT0JKQ0xFQU5VUAorICB7CisgICAgbW5nX3B0ciBwVGVtcDsKKyAgICBtbmdfcmV0Y29kZSBpUmV0Y29kZSA9IGNyZWF0ZV9vYmpfZ2VuZXJhbCAocERhdGEsIHNpemVvZiAobW5nX2ltYWdlZGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfY2xlYW51cG9iamVjdCltbmdfZnJlZV9pbWFnZWRhdGFvYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1OR19OVUxMLCAmcFRlbXApOworICAgIGlmIChpUmV0Y29kZSkKKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICBwSW1hZ2VkYXRhID0gKG1uZ19pbWFnZWRhdGFwKXBUZW1wOworICB9CisjZWxzZQorICBNTkdfQUxMT0MgKHBEYXRhLCBwSW1hZ2VkYXRhLCBzaXplb2YgKG1uZ19pbWFnZWRhdGEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbGwgdGhlIGFwcHJvcHJpYXRlIGZpZWxkcyAqLworICBwSW1hZ2VkYXRhLT5zSGVhZGVyLmZDbGVhbnVwICAgPSAobW5nX2NsZWFudXBvYmplY3QpbW5nX2ZyZWVfaW1hZ2VkYXRhb2JqZWN0OworICBwSW1hZ2VkYXRhLT5zSGVhZGVyLmZQcm9jZXNzICAgPSBNTkdfTlVMTDsKKyNlbmRpZgorICBwSW1hZ2VkYXRhLT5pUmVmY291bnQgICAgICAgICAgPSAxOworICBwSW1hZ2VkYXRhLT5iRnJvemVuICAgICAgICAgICAgPSBNTkdfRkFMU0U7CisgIHBJbWFnZWRhdGEtPmJDb25jcmV0ZSAgICAgICAgICA9IGJDb25jcmV0ZTsKKyAgcEltYWdlZGF0YS0+YlZpZXdhYmxlICAgICAgICAgID0gYlZpZXdhYmxlOworICBwSW1hZ2VkYXRhLT5pV2lkdGggICAgICAgICAgICAgPSBpV2lkdGg7CisgIHBJbWFnZWRhdGEtPmlIZWlnaHQgICAgICAgICAgICA9IGlIZWlnaHQ7CisgIHBJbWFnZWRhdGEtPmlCaXRkZXB0aCAgICAgICAgICA9IGlCaXRkZXB0aDsKKyAgcEltYWdlZGF0YS0+aUNvbG9ydHlwZSAgICAgICAgID0gaUNvbG9ydHlwZTsKKyAgcEltYWdlZGF0YS0+aUNvbXByZXNzaW9uICAgICAgID0gaUNvbXByZXNzaW9uOworICBwSW1hZ2VkYXRhLT5pRmlsdGVyICAgICAgICAgICAgPSBpRmlsdGVyOworICBwSW1hZ2VkYXRhLT5pSW50ZXJsYWNlICAgICAgICAgPSBpSW50ZXJsYWNlOworICBwSW1hZ2VkYXRhLT5iQ29ycmVjdGVkICAgICAgICAgPSBNTkdfRkFMU0U7CisgIHBJbWFnZWRhdGEtPmlBbHBoYWJpdGRlcHRoICAgICA9IDA7CisgIHBJbWFnZWRhdGEtPmlKSERSY29tcHJlc3Npb24gICA9IDA7CisgIHBJbWFnZWRhdGEtPmlKSERSaW50ZXJsYWNlICAgICA9IDA7CisgIHBJbWFnZWRhdGEtPmlQaXhlbHNhbXBsZWRlcHRoICA9IGlCaXRkZXB0aDsKKyAgcEltYWdlZGF0YS0+aUFscGhhc2FtcGxlZGVwdGggID0gaUJpdGRlcHRoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGV0ZXJtaW5lIHNhbXBsZXNpemUgZnJvbSBjb2xvcl90eXBlL2JpdF9kZXB0aCAqLworICBzd2l0Y2ggKGlDb2xvcnR5cGUpICAgICAgICAgICAgICAgICAgLyogZm9yIDwgOC1iaXQgc2FtcGxlcyB3ZSBqdXN0IHJlc2VydmUgOCBiaXRzICovCisgIHsKKyAgICBjYXNlICAwICA6IDsgICAgICAgICAgICAgICAgICAgICAgIC8qIGdyYXkgKi8KKyAgICBjYXNlICA4ICA6IHsgICAgICAgICAgICAgICAgICAgICAgIC8qIEpQRUcgZ3JheSAqLworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgICAgICAgICAgICAgICBpZiAoaUJpdGRlcHRoID4gOCkKKyAgICAgICAgICAgICAgICAgICBpU2FtcGxlc2l6ZSA9IDI7CisgICAgICAgICAgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgIGlTYW1wbGVzaXplID0gMTsKKworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIH0KKyAgICBjYXNlICAyICA6IDsgICAgICAgICAgICAgICAgICAgICAgIC8qIHJnYiAqLworICAgIGNhc2UgMTAgIDogeyAgICAgICAgICAgICAgICAgICAgICAgLyogSlBFRyByZ2IgKi8KKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgaWYgKGlCaXRkZXB0aCA+IDgpCisgICAgICAgICAgICAgICAgICAgaVNhbXBsZXNpemUgPSA2OworICAgICAgICAgICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICBpU2FtcGxlc2l6ZSA9IDM7CisKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICB9CisgICAgY2FzZSAgMyAgOiB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBpbmRleGVkICovCisgICAgICAgICAgICAgICAgIGlTYW1wbGVzaXplID0gMTsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICB9CisgICAgY2FzZSAgNCAgOiA7ICAgICAgICAgICAgICAgICAgICAgICAvKiBncmF5K2FscGhhICovCisgICAgY2FzZSAxMiAgOiB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBKUEVHIGdyYXkrYWxwaGEgKi8KKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgaWYgKGlCaXRkZXB0aCA+IDgpCisgICAgICAgICAgICAgICAgICAgaVNhbXBsZXNpemUgPSA0OworICAgICAgICAgICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICBpU2FtcGxlc2l6ZSA9IDI7CisKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICB9CisgICAgY2FzZSAgNiAgOiA7ICAgICAgICAgICAgICAgICAgICAgICAvKiByZ2IrYWxwaGEgKi8KKyAgICBjYXNlIDE0ICA6IHsgICAgICAgICAgICAgICAgICAgICAgIC8qIEpQRUcgcmdiK2FscGhhICovCisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgIGlmIChpQml0ZGVwdGggPiA4KQorICAgICAgICAgICAgICAgICAgIGlTYW1wbGVzaXplID0gODsKKyAgICAgICAgICAgICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgaVNhbXBsZXNpemUgPSA0OworCisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgfQorICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtYWtlIHN1cmUgd2UgcmVtZW1iZXIgYWxsIHRoaXMgKi8KKyAgcEltYWdlZGF0YS0+aVNhbXBsZXNpemUgID0gaVNhbXBsZXNpemU7CisgIHBJbWFnZWRhdGEtPmlSb3dzaXplICAgICA9IGlTYW1wbGVzaXplICogaVdpZHRoOworICBwSW1hZ2VkYXRhLT5pSW1nZGF0YXNpemUgPSBwSW1hZ2VkYXRhLT5pUm93c2l6ZSAqIGlIZWlnaHQ7CisKKyAgaWYgKHBJbWFnZWRhdGEtPmlJbWdkYXRhc2l6ZSkgICAgICAgIC8qIG5lZWQgYSBidWZmZXIgPyAqLworICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc28gYWxsb2NhdGUgaXQgKi8KKyAgICBNTkdfQUxMT0NYIChwRGF0YSwgcEltYWdlZGF0YS0+cEltZ2RhdGEsIHBJbWFnZWRhdGEtPmlJbWdkYXRhc2l6ZSk7CisKKyAgICBpZiAoIXBJbWFnZWRhdGEtPnBJbWdkYXRhKSAgICAgICAgIC8qIGVub3VnaCBtZW1vcnkgPyAqLworICAgIHsKKyAgICAgIE1OR19GUkVFWCAocERhdGEsIHBJbWFnZWRhdGEsIHNpemVvZiAobW5nX2ltYWdlZGF0YSkpOworICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX09VVE9GTUVNT1JZKTsKKyAgICB9CisgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoZWNrIGdsb2JhbCBzdHVmZiAqLworICBwSW1hZ2VkYXRhLT5iSGFzR0FNQSAgICAgICAgICAgPSBwRGF0YS0+Ykhhc2dsb2JhbEdBTUE7CisjaWZuZGVmIE1OR19TS0lQQ0hVTktfY0hSTQorICBwSW1hZ2VkYXRhLT5iSGFzQ0hSTSAgICAgICAgICAgPSBwRGF0YS0+Ykhhc2dsb2JhbENIUk07CisjZW5kaWYKKyAgcEltYWdlZGF0YS0+Ykhhc1NSR0IgICAgICAgICAgID0gcERhdGEtPmJIYXNnbG9iYWxTUkdCOworI2lmbmRlZiBNTkdfU0tJUENIVU5LX2lDQ1AKKyAgcEltYWdlZGF0YS0+Ykhhc0lDQ1AgICAgICAgICAgID0gcERhdGEtPmJIYXNnbG9iYWxJQ0NQOworI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfYktHRAorICBwSW1hZ2VkYXRhLT5iSGFzQktHRCAgICAgICAgICAgPSBwRGF0YS0+Ykhhc2dsb2JhbEJLR0Q7CisjZW5kaWYKKworICBpZiAocERhdGEtPmJIYXNnbG9iYWxHQU1BKSAgICAgICAgICAgLyogZ2xvYmFsIGdBTUEgcHJlc2VudCA/ICovCisgICAgcEltYWdlZGF0YS0+aUdhbW1hICAgICAgICAgICA9IHBEYXRhLT5pR2xvYmFsR2FtbWE7CisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19jSFJNCisgIGlmIChwRGF0YS0+Ykhhc2dsb2JhbENIUk0pICAgICAgICAgICAvKiBnbG9iYWwgY0hSTSBwcmVzZW50ID8gKi8KKyAgeworICAgIHBJbWFnZWRhdGEtPmlXaGl0ZXBvaW50eCAgICAgPSBwRGF0YS0+aUdsb2JhbFdoaXRlcG9pbnR4OworICAgIHBJbWFnZWRhdGEtPmlXaGl0ZXBvaW50eSAgICAgPSBwRGF0YS0+aUdsb2JhbFdoaXRlcG9pbnR5OworICAgIHBJbWFnZWRhdGEtPmlQcmltYXJ5cmVkeCAgICAgPSBwRGF0YS0+aUdsb2JhbFByaW1hcnlyZWR4OworICAgIHBJbWFnZWRhdGEtPmlQcmltYXJ5cmVkeSAgICAgPSBwRGF0YS0+aUdsb2JhbFByaW1hcnlyZWR5OworICAgIHBJbWFnZWRhdGEtPmlQcmltYXJ5Z3JlZW54ICAgPSBwRGF0YS0+aUdsb2JhbFByaW1hcnlncmVlbng7CisgICAgcEltYWdlZGF0YS0+aVByaW1hcnlncmVlbnkgICA9IHBEYXRhLT5pR2xvYmFsUHJpbWFyeWdyZWVueTsKKyAgICBwSW1hZ2VkYXRhLT5pUHJpbWFyeWJsdWV4ICAgID0gcERhdGEtPmlHbG9iYWxQcmltYXJ5Ymx1ZXg7CisgICAgcEltYWdlZGF0YS0+aVByaW1hcnlibHVleSAgICA9IHBEYXRhLT5pR2xvYmFsUHJpbWFyeWJsdWV5OworICB9CisjZW5kaWYKKworICBpZiAocERhdGEtPmJIYXNnbG9iYWxTUkdCKSAgICAgICAgICAgLyogZ2xiYWwgc1JHQiBwcmVzZW50ID8gKi8KKyAgICBwSW1hZ2VkYXRhLT5pUmVuZGVyaW5naW50ZW50ID0gcERhdGEtPmlHbG9iYWxSZW5kaW50ZW50OworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfaUNDUAorICBpZiAocERhdGEtPmJIYXNnbG9iYWxJQ0NQKSAgICAgICAgICAgLyogZ2xiYWwgaUNDUCBwcmVzZW50ID8gKi8KKyAgeworICAgIHBJbWFnZWRhdGEtPmlQcm9maWxlc2l6ZSAgICAgPSBwRGF0YS0+aUdsb2JhbFByb2ZpbGVzaXplOworCisgICAgaWYgKHBJbWFnZWRhdGEtPmlQcm9maWxlc2l6ZSkKKyAgICB7CisgICAgICBNTkdfQUxMT0NYIChwRGF0YSwgcEltYWdlZGF0YS0+cFByb2ZpbGUsIHBJbWFnZWRhdGEtPmlQcm9maWxlc2l6ZSk7CisKKyAgICAgIGlmICghcEltYWdlZGF0YS0+cFByb2ZpbGUpICAgICAgIC8qIGVub3VnaCBtZW1vcnkgPyAqLworICAgICAgeworICAgICAgICBNTkdfRlJFRVggKHBEYXRhLCBwSW1hZ2VkYXRhLT5wSW1nZGF0YSwgcEltYWdlZGF0YS0+aUltZ2RhdGFzaXplKTsKKyAgICAgICAgTU5HX0ZSRUVYIChwRGF0YSwgcEltYWdlZGF0YSwgc2l6ZW9mIChtbmdfaW1hZ2VkYXRhKSk7CisgICAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19PVVRPRk1FTU9SWSk7CisgICAgICB9CisKKyAgICAgIE1OR19DT1BZICAocEltYWdlZGF0YS0+cFByb2ZpbGUsIHBEYXRhLT5wR2xvYmFsUHJvZmlsZSwgcEltYWdlZGF0YS0+aVByb2ZpbGVzaXplKTsKKyAgICB9CisgIH0KKyNlbmRpZgorCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfYktHRAorICBpZiAocERhdGEtPmJIYXNnbG9iYWxCS0dEKSAgICAgICAgICAgLyogZ2xvYmFsIGJLR0QgcHJlc2VudCA/ICovCisgIHsKKyAgICBwSW1hZ2VkYXRhLT5pQktHRHJlZCAgICAgICAgID0gcERhdGEtPmlHbG9iYWxCS0dEcmVkOworICAgIHBJbWFnZWRhdGEtPmlCS0dEZ3JlZW4gICAgICAgPSBwRGF0YS0+aUdsb2JhbEJLR0RncmVlbjsKKyAgICBwSW1hZ2VkYXRhLT5pQktHRGJsdWUgICAgICAgID0gcERhdGEtPmlHbG9iYWxCS0dEYmx1ZTsKKyAgfQorI2VuZGlmCisKKyAgKnBwT2JqZWN0ID0gcEltYWdlZGF0YTsgICAgICAgICAgICAgIC8qIHJldHVybiBpdCAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0NSRUFURV9JTUdEQVRBT0JKRUNULCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX2ZyZWVfaW1hZ2VkYXRhb2JqZWN0ICAgKG1uZ19kYXRhcCAgICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbWFnZWRhdGFwIHBJbWFnZWRhdGEpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfSU1HREFUQU9CSkVDVCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmIChwSW1hZ2VkYXRhLT5pUmVmY291bnQpICAgICAgICAgICAvKiBkZWNyZWFzZSByZWZlcmVuY2UgY291bnQgKi8KKyAgICBwSW1hZ2VkYXRhLT5pUmVmY291bnQtLTsKKworICBpZiAoIXBJbWFnZWRhdGEtPmlSZWZjb3VudCkgICAgICAgICAgLyogcmVhY2hlZCB6ZXJvID8gKi8KKyAgeworI2lmbmRlZiBNTkdfU0tJUENIVU5LX2lDQ1AKKyAgICBpZiAocEltYWdlZGF0YS0+aVByb2ZpbGVzaXplKSAgICAgIC8qIHN0b3JlZCBhbiBpQ0NQIHByb2ZpbGUgPyAqLworICAgICAgTU5HX0ZSRUVYIChwRGF0YSwgcEltYWdlZGF0YS0+cFByb2ZpbGUsIHBJbWFnZWRhdGEtPmlQcm9maWxlc2l6ZSk7CisjZW5kaWYKKyAgICBpZiAocEltYWdlZGF0YS0+aUltZ2RhdGFzaXplKSAgICAgIC8qIHNhbXBsZS1idWZmZXIgcHJlc2VudCA/ICovCisgICAgICBNTkdfRlJFRVggKHBEYXRhLCBwSW1hZ2VkYXRhLT5wSW1nZGF0YSwgcEltYWdlZGF0YS0+aUltZ2RhdGFzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRyb3AgdGhlIGJ1ZmZlciAqLworICAgIE1OR19GUkVFWCAocERhdGEsIHBJbWFnZWRhdGEsIHNpemVvZiAobW5nX2ltYWdlZGF0YSkpOworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9JTUdEQVRBT0JKRUNULCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX2Nsb25lX2ltYWdlZGF0YW9iamVjdCAgKG1uZ19kYXRhcCAgICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgICAgIGJDb25jcmV0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW1hZ2VkYXRhcCBwU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbWFnZWRhdGFwICpwcENsb25lKQoreworICBtbmdfaW1hZ2VkYXRhcCBwTmV3ZGF0YTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9DTE9ORV9JTUdEQVRBT0JKRUNULCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgYSBidWZmZXIgKi8KKyAgTU5HX0FMTE9DIChwRGF0YSwgcE5ld2RhdGEsIHNpemVvZiAobW5nX2ltYWdlZGF0YSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYmxhdGVudGx5IGNvcHkgdGhlIG9yaWdpbmFsIGJ1ZmZlciAqLworICBNTkdfQ09QWSAocE5ld2RhdGEsIHBTb3VyY2UsIHNpemVvZiAobW5nX2ltYWdlZGF0YSkpOworCisgIHBOZXdkYXRhLT5pUmVmY291bnQgPSAxOyAgICAgICAgICAgICAvKiBvbmx5IHRoZSByZWZlcmVuY2UgY291bnQgKi8KKyAgcE5ld2RhdGEtPmJDb25jcmV0ZSA9IGJDb25jcmV0ZTsgICAgIC8qIGFuZCBjb25jcmV0ZS1mbGFnIGFyZSBkaWZmZXJlbnQgKi8KKyAgcE5ld2RhdGEtPmJGcm96ZW4gICA9IE1OR19GQUxTRTsKKworICBpZiAocE5ld2RhdGEtPmlJbWdkYXRhc2l6ZSkgICAgICAgICAgLyogc2FtcGxlIGJ1ZmZlciBwcmVzZW50ID8gKi8KKyAgeworICAgIE1OR19BTExPQ1ggKHBEYXRhLCBwTmV3ZGF0YS0+cEltZ2RhdGEsIHBOZXdkYXRhLT5pSW1nZGF0YXNpemUpOworCisgICAgaWYgKCFwTmV3ZGF0YS0+cEltZ2RhdGEpICAgICAgICAgICAvKiBub3QgZW5vdWdoIG1lbW9yeSA/ICovCisgICAgeworICAgICAgTU5HX0ZSRUVYIChwRGF0YSwgcE5ld2RhdGEsIHNpemVvZiAobW5nX2ltYWdlZGF0YSkpOworICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX09VVE9GTUVNT1JZKTsKKyAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtYWtlIGEgY29weSAqLworICAgIE1OR19DT1BZIChwTmV3ZGF0YS0+cEltZ2RhdGEsIHBTb3VyY2UtPnBJbWdkYXRhLCBwTmV3ZGF0YS0+aUltZ2RhdGFzaXplKTsKKyAgfQorCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfaUNDUAorICBpZiAocE5ld2RhdGEtPmlQcm9maWxlc2l6ZSkgICAgICAgICAgLyogaUNDUCBwcm9maWxlIHByZXNlbnQgPyAqLworICB7CisgICAgTU5HX0FMTE9DWCAocERhdGEsIHBOZXdkYXRhLT5wUHJvZmlsZSwgcE5ld2RhdGEtPmlQcm9maWxlc2l6ZSk7CisKKyAgICBpZiAoIXBOZXdkYXRhLT5wUHJvZmlsZSkgICAgICAgICAgIC8qIGVub3VnaCBtZW1vcnkgPyAqLworICAgIHsKKyAgICAgIE1OR19GUkVFWCAocERhdGEsIHBOZXdkYXRhLCBzaXplb2YgKG1uZ19pbWFnZWRhdGEpKTsKKyAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19PVVRPRk1FTU9SWSk7CisgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWFrZSBhIGNvcHkgKi8KKyAgICBNTkdfQ09QWSAocE5ld2RhdGEtPnBQcm9maWxlLCBwU291cmNlLT5wUHJvZmlsZSwgcE5ld2RhdGEtPmlQcm9maWxlc2l6ZSk7CisgIH0KKyNlbmRpZgorCisgICpwcENsb25lID0gcE5ld2RhdGE7ICAgICAgICAgICAgICAgICAvKiByZXR1cm4gdGhlIGNsb25lICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQ0xPTkVfSU1HREFUQU9CSkVDVCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBJbWFnZS1vYmplY3Qgcm91dGluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIHRoZXNlIGhhbmRsZSB0aGUgIm9iamVjdCIgYXMgZGVmaW5lZCBieSB0aGUgTU5HIHNwZWNpZmljYXRpb24gICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19jcmVhdGVfaW1hZ2VvYmplY3QgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgYkNvbmNyZXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2Jvb2wgICBiVmlzaWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgYlZpZXdhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggIGlCaXRkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaUNvbG9ydHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaUNvbXByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICBpRmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICBpSW50ZXJsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpUG9zeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaVBvc3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfYm9vbCAgIGJDbGlwcGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpQ2xpcGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlDbGlwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaUNsaXB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpQ2xpcGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW1hZ2VwICpwcE9iamVjdCkKK3sKKyAgbW5nX2ltYWdlcCAgICAgcEltYWdlOworICBtbmdfaW1hZ2VwICAgICBwUHJldiwgcE5leHQ7CisgIG1uZ19yZXRjb2RlICAgIGlSZXRjb2RlOworICBtbmdfaW1hZ2VkYXRhcCBwSW1nYnVmOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0NSRUFURV9JTUdPQkpFQ1QsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCBhIGJ1ZmZlciAqLworICBNTkdfQUxMT0MgKHBEYXRhLCBwSW1hZ2UsIHNpemVvZiAobW5nX2ltYWdlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3cgZ2V0IGEgbmV3ICJvYmplY3QgYnVmZmVyIiAqLworICBpUmV0Y29kZSA9IG1uZ19jcmVhdGVfaW1hZ2VkYXRhb2JqZWN0IChwRGF0YSwgYkNvbmNyZXRlLCBiVmlld2FibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlXaWR0aCwgaUhlaWdodCwgaUJpdGRlcHRoLCBpQ29sb3J0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpQ29tcHJlc3Npb24sIGlGaWx0ZXIsIGlJbnRlcmxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW1nYnVmKTsKKworICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgeworICAgIE1OR19GUkVFWCAocERhdGEsIHBJbWFnZSwgc2l6ZW9mIChtbmdfaW1hZ2UpKTsKKyAgICByZXR1cm4gaVJldGNvZGU7CisgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbGwgdGhlIGFwcHJvcHJpYXRlIGZpZWxkcyAqLworICBwSW1hZ2UtPnNIZWFkZXIuZkNsZWFudXAgPSAobW5nX2NsZWFudXBvYmplY3QpbW5nX2ZyZWVfaW1hZ2VvYmplY3Q7CisgIHBJbWFnZS0+c0hlYWRlci5mUHJvY2VzcyA9IE1OR19OVUxMOworI2lmZGVmIE1OR19PUFRJTUlaRV9PQkpDTEVBTlVQCisgIHBJbWFnZS0+c0hlYWRlci5pT2Jqc2l6ZSA9IHNpemVvZiAobW5nX2ltYWdlKTsKKyNlbmRpZgorICBwSW1hZ2UtPmlJZCAgICAgICAgICAgICAgPSBpSWQ7CisgIHBJbWFnZS0+YkZyb3plbiAgICAgICAgICA9IE1OR19GQUxTRTsKKyAgcEltYWdlLT5iVmlzaWJsZSAgICAgICAgID0gYlZpc2libGU7CisgIHBJbWFnZS0+YlZpZXdhYmxlICAgICAgICA9IGJWaWV3YWJsZTsKKyAgcEltYWdlLT5iVmFsaWQgICAgICAgICAgID0gKG1uZ19ib29sKSgocERhdGEtPmJEaXNwbGF5aW5nKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocERhdGEtPmJSdW5uaW5nKSB8fCAocERhdGEtPmJTZWFyY2hpbmcpKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICghcERhdGEtPmJGcmVlemluZykpOworICBwSW1hZ2UtPmlQb3N4ICAgICAgICAgICAgPSBpUG9zeDsKKyAgcEltYWdlLT5pUG9zeSAgICAgICAgICAgID0gaVBvc3k7CisgIHBJbWFnZS0+YkNsaXBwZWQgICAgICAgICA9IGJDbGlwcGVkOworICBwSW1hZ2UtPmlDbGlwbCAgICAgICAgICAgPSBpQ2xpcGw7CisgIHBJbWFnZS0+aUNsaXByICAgICAgICAgICA9IGlDbGlwcjsKKyAgcEltYWdlLT5pQ2xpcHQgICAgICAgICAgID0gaUNsaXB0OworICBwSW1hZ2UtPmlDbGlwYiAgICAgICAgICAgPSBpQ2xpcGI7CisjaWZuZGVmIE1OR19TS0lQQ0hVTktfTUFHTgorICBwSW1hZ2UtPmlNQUdOX01ldGhvZFggICAgPSAwOworICBwSW1hZ2UtPmlNQUdOX01ldGhvZFkgICAgPSAwOworICBwSW1hZ2UtPmlNQUdOX01YICAgICAgICAgPSAwOworICBwSW1hZ2UtPmlNQUdOX01ZICAgICAgICAgPSAwOworICBwSW1hZ2UtPmlNQUdOX01MICAgICAgICAgPSAwOworICBwSW1hZ2UtPmlNQUdOX01SICAgICAgICAgPSAwOworICBwSW1hZ2UtPmlNQUdOX01UICAgICAgICAgPSAwOworICBwSW1hZ2UtPmlNQUdOX01CICAgICAgICAgPSAwOworI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfUEFTVAorICBwSW1hZ2UtPmlQYXN0eCAgICAgICAgICAgPSAwOworICBwSW1hZ2UtPmlQYXN0eSAgICAgICAgICAgPSAwOworI2VuZGlmCisgIHBJbWFnZS0+cEltZ2J1ZiAgICAgICAgICA9IHBJbWdidWY7CisKKyAgaWYgKGlJZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9ubHkgaWYgbm90IG9iamVjdCAwICEgKi8KKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbmQgcHJldmlvdXMgbG93ZXIgb2JqZWN0LWlkICovCisgICAgcFByZXYgPSAobW5nX2ltYWdlcClwRGF0YS0+cExhc3RpbWdvYmo7CisKKyAgICB3aGlsZSAoKHBQcmV2KSAmJiAocFByZXYtPmlJZCA+IGlJZCkpCisgICAgICBwUHJldiA9IChtbmdfaW1hZ2VwKXBQcmV2LT5zSGVhZGVyLnBQcmV2OworCisgICAgaWYgKHBQcmV2KSAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3VuZCBpdCA/ICovCisgICAgeworICAgICAgcEltYWdlLT5zSGVhZGVyLnBQcmV2ID0gcFByZXY7ICAgLyogdGhhbiBsaW5rIGl0IGluIHBsYWNlICovCisgICAgICBwSW1hZ2UtPnNIZWFkZXIucE5leHQgPSBwUHJldi0+c0hlYWRlci5wTmV4dDsKKyAgICAgIHBQcmV2LT5zSGVhZGVyLnBOZXh0ICA9IHBJbWFnZTsKKyAgICB9CisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiBub3QgZm91bmQsIGl0IGJlY29tZXMgdGhlIGZpcnN0ICEgKi8KKyAgICB7CisgICAgICBwSW1hZ2UtPnNIZWFkZXIucE5leHQgPSBwRGF0YS0+cEZpcnN0aW1nb2JqOworICAgICAgcERhdGEtPnBGaXJzdGltZ29iaiAgID0gcEltYWdlOworICAgIH0KKworICAgIHBOZXh0ICAgICAgICAgICAgICAgICAgID0gKG1uZ19pbWFnZXApcEltYWdlLT5zSGVhZGVyLnBOZXh0OworCisgICAgaWYgKHBOZXh0KQorICAgICAgcE5leHQtPnNIZWFkZXIucFByZXYgID0gcEltYWdlOworICAgIGVsc2UKKyAgICAgIHBEYXRhLT5wTGFzdGltZ29iaiAgICA9IHBJbWFnZTsKKyAgICAKKyAgfSAgCisKKyAgKnBwT2JqZWN0ID0gcEltYWdlOyAgICAgICAgICAgICAgICAgIC8qIGFuZCByZXR1cm4gdGhlIG5ldyBidWZmZXIgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9DUkVBVEVfSU1HT0JKRUNULCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsgICAgICAgICAgICAgICAgICAvKiBva2lkbyAqLworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfZnJlZV9pbWFnZW9iamVjdCAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW1hZ2VwIHBJbWFnZSkKK3sKKyAgbW5nX3JldGNvZGUgICAgaVJldGNvZGU7CisgIG1uZ19pbWFnZXAgICAgIHBQcmV2ICAgPSBwSW1hZ2UtPnNIZWFkZXIucFByZXY7CisgIG1uZ19pbWFnZXAgICAgIHBOZXh0ICAgPSBwSW1hZ2UtPnNIZWFkZXIucE5leHQ7CisgIG1uZ19pbWFnZWRhdGFwIHBJbWdidWYgPSBwSW1hZ2UtPnBJbWdidWY7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9JTUdPQkpFQ1QsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAocEltYWdlLT5pSWQpICAgICAgICAgICAgICAgICAgICAgLyogbm90IGZvciBvYmplY3QgMCAqLworICB7CisgICAgaWYgKHBQcmV2KSAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1bmxpbmsgZnJvbSB0aGUgbGlzdCBmaXJzdCAhICovCisgICAgICBwUHJldi0+c0hlYWRlci5wTmV4dCA9IHBJbWFnZS0+c0hlYWRlci5wTmV4dDsKKyAgICBlbHNlCisgICAgICBwRGF0YS0+cEZpcnN0aW1nb2JqICA9IHBJbWFnZS0+c0hlYWRlci5wTmV4dDsKKworICAgIGlmIChwTmV4dCkKKyAgICAgIHBOZXh0LT5zSGVhZGVyLnBQcmV2ID0gcEltYWdlLT5zSGVhZGVyLnBQcmV2OworICAgIGVsc2UKKyAgICAgIHBEYXRhLT5wTGFzdGltZ29iaiAgID0gcEltYWdlLT5zSGVhZGVyLnBQcmV2OworCisgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVubGluayB0aGUgaW1hZ2UtZGF0YSBidWZmZXIgKi8KKyAgaVJldGNvZGUgPSBtbmdfZnJlZV9pbWFnZWRhdGFvYmplY3QgKHBEYXRhLCBwSW1nYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRyb3AgaXRzIG93biBidWZmZXIgKi8KKyAgTU5HX0ZSRUVYIChwRGF0YSwgcEltYWdlLCBzaXplb2YgKG1uZ19pbWFnZSkpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfSU1HT0JKRUNULCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBpUmV0Y29kZTsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX2ltYWdlcCBtbmdfZmluZF9pbWFnZW9iamVjdCAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaUlkKQoreworICBtbmdfaW1hZ2VwIHBJbWFnZSA9IChtbmdfaW1hZ2VwKXBEYXRhLT5wRmlyc3RpbWdvYmo7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYIChwRGF0YSwgTU5HX0ZOX0ZJTkRfSU1HT0JKRUNULCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsb29rIHVwIHRoZSByaWdodCBpZCAqLworICB3aGlsZSAoKHBJbWFnZSkgJiYgKHBJbWFnZS0+aUlkICE9IGlJZCkpCisgICAgcEltYWdlID0gKG1uZ19pbWFnZXApcEltYWdlLT5zSGVhZGVyLnBOZXh0OworCisjaWZkZWYgTU5HX0lOQ0xVREVfTVBOR19QUk9QT1NBTAorICBpZiAoKCFwSW1hZ2UpICYmIChwRGF0YS0+ZUltYWdldHlwZSA9PSBtbmdfaXRfbXBuZykpCisgICAgcEltYWdlID0gcERhdGEtPnBPYmp6ZXJvOworI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYIChwRGF0YSwgTU5HX0ZOX0ZJTkRfSU1HT0JKRUNULCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBwSW1hZ2U7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19jbG9uZV9pbWFnZW9iamVjdCAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgYlBhcnRpYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgYlZpc2libGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgYkFic3RyYWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfYm9vbCAgIGJIYXNsb2NhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggIGlMb2NhdGlvbnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaUxvY2F0aW9ueCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpTG9jYXRpb255LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW1hZ2VwIHBTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbWFnZXAgKnBwQ2xvbmUpCit7CisgIG1uZ19pbWFnZXAgICAgIHBOZXc7CisgIG1uZ19pbWFnZXAgICAgIHBQcmV2LCBwTmV4dDsKKyAgbW5nX3JldGNvZGUgICAgaVJldGNvZGU7CisgIG1uZ19pbWFnZWRhdGFwIHBJbWdidWY7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQ0xPTkVfSU1HT0JKRUNULCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19NQUdOCisgIGlmICgocFNvdXJjZS0+aUlkKSAmJiAgICAgICAgICAgICAgICAvKiBuZWVkcyBtYWduaWZpY2F0aW9uID8gKi8KKyAgICAgICgocFNvdXJjZS0+aU1BR05fTWV0aG9kWCkgfHwgKHBTb3VyY2UtPmlNQUdOX01ldGhvZFkpKSkKKyAgeworICAgIGlSZXRjb2RlID0gbW5nX21hZ25pZnlfaW1hZ2VvYmplY3QgKHBEYXRhLCBwU291cmNlKTsKKworICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgfQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgYSBidWZmZXIgKi8KKyNpZmRlZiBNTkdfT1BUSU1JWkVfT0JKQ0xFQU5VUAorICB7CisgICAgbW5nX3B0ciAgICAgcFRlbXA7CisgICAgbW5nX3JldGNvZGUgaVJldGNvZGUgPSBjcmVhdGVfb2JqX2dlbmVyYWwgKHBEYXRhLCBzaXplb2YgKG1uZ19pbWFnZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfY2xlYW51cG9iamVjdCltbmdfZnJlZV9pbWFnZW9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU5HX05VTEwsICZwVGVtcCk7CisgICAgaWYgKGlSZXRjb2RlKQorICAgICAgcmV0dXJuIGlSZXRjb2RlOworICAgIHBOZXcgPSAobW5nX2ltYWdlcClwVGVtcDsKKyAgfQorI2Vsc2UKKyAgTU5HX0FMTE9DIChwRGF0YSwgcE5ldywgc2l6ZW9mIChtbmdfaW1hZ2UpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbGwgb3IgY29weSB0aGUgYXBwcm9wcmlhdGUgZmllbGRzICovCisgIHBOZXctPnNIZWFkZXIuZkNsZWFudXAgPSAobW5nX2NsZWFudXBvYmplY3QpbW5nX2ZyZWVfaW1hZ2VvYmplY3Q7CisgIHBOZXctPnNIZWFkZXIuZlByb2Nlc3MgPSBNTkdfTlVMTDsKKyNlbmRpZgorICBwTmV3LT5pSWQgICAgICAgICAgICAgID0gaUlkOworICBwTmV3LT5iRnJvemVuICAgICAgICAgID0gTU5HX0ZBTFNFOworICBwTmV3LT5iVmlzaWJsZSAgICAgICAgID0gYlZpc2libGU7CisgIHBOZXctPmJWaWV3YWJsZSAgICAgICAgPSBwU291cmNlLT5iVmlld2FibGU7CisgIHBOZXctPmJWYWxpZCAgICAgICAgICAgPSBNTkdfVFJVRTsKKworICBpZiAoYkhhc2xvY2EpICAgICAgICAgICAgICAgICAgICAgICAgLyogbG9jYXRpb24gaW5mbyBhdmFpbGFibGUgPyAqLworICB7CisgICAgaWYgKGlMb2NhdGlvbnR5cGUgPT0gMCkgICAgICAgICAgICAvKiBhYnNvbHV0ZSBwb3NpdGlvbiA/ICovCisgICAgeworICAgICAgcE5ldy0+aVBvc3ggICAgICAgID0gaUxvY2F0aW9ueDsKKyAgICAgIHBOZXctPmlQb3N5ICAgICAgICA9IGlMb2NhdGlvbnk7CisgICAgfQorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVsYXRpdmUgKi8KKyAgICB7CisgICAgICBwTmV3LT5pUG9zeCAgICAgICAgPSBwU291cmNlLT5pUG9zeCArIGlMb2NhdGlvbng7CisgICAgICBwTmV3LT5pUG9zeSAgICAgICAgPSBwU291cmNlLT5pUG9zeSArIGlMb2NhdGlvbnk7CisgICAgfQorICB9CisgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3B5IGZyb20gc291cmNlICovCisgIHsKKyAgICBwTmV3LT5pUG9zeCAgICAgICAgICA9IHBTb3VyY2UtPmlQb3N4OworICAgIHBOZXctPmlQb3N5ICAgICAgICAgID0gcFNvdXJjZS0+aVBvc3k7CisgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvcHkgY2xpcHBpbmcgaW5mbyAqLworICBwTmV3LT5iQ2xpcHBlZCAgICAgICAgID0gcFNvdXJjZS0+YkNsaXBwZWQ7CisgIHBOZXctPmlDbGlwbCAgICAgICAgICAgPSBwU291cmNlLT5pQ2xpcGw7CisgIHBOZXctPmlDbGlwciAgICAgICAgICAgPSBwU291cmNlLT5pQ2xpcHI7CisgIHBOZXctPmlDbGlwdCAgICAgICAgICAgPSBwU291cmNlLT5pQ2xpcHQ7CisgIHBOZXctPmlDbGlwYiAgICAgICAgICAgPSBwU291cmNlLT5pQ2xpcGI7CisjaWZuZGVmIE1OR19TS0lQQ0hVTktfTUFHTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29weSBtYWduaWZpY2F0aW9uIGluZm8gKi8KKy8qICBwTmV3LT5pTUFHTl9NZXRob2RYICAgID0gcFNvdXJjZS0+aU1BR05fTWV0aG9kWDsgICAgIExFVCdTIE5PVCAhISEhISEKKyAgcE5ldy0+aU1BR05fTWV0aG9kWSAgICA9IHBTb3VyY2UtPmlNQUdOX01ldGhvZFk7CisgIHBOZXctPmlNQUdOX01YICAgICAgICAgPSBwU291cmNlLT5pTUFHTl9NWDsKKyAgcE5ldy0+aU1BR05fTVkgICAgICAgICA9IHBTb3VyY2UtPmlNQUdOX01ZOworICBwTmV3LT5pTUFHTl9NTCAgICAgICAgID0gcFNvdXJjZS0+aU1BR05fTUw7CisgIHBOZXctPmlNQUdOX01SICAgICAgICAgPSBwU291cmNlLT5pTUFHTl9NUjsKKyAgcE5ldy0+aU1BR05fTVQgICAgICAgICA9IHBTb3VyY2UtPmlNQUdOX01UOworICBwTmV3LT5pTUFHTl9NQiAgICAgICAgID0gcFNvdXJjZS0+aU1BR05fTUI7ICovCisjZW5kaWYKKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX1BBU1QKKyAgcE5ldy0+aVBhc3R4ICAgICAgICAgICA9IDA7ICAgICAgICAgIC8qIGluaXRpYWxpemUgUEFTVCBpbmZvICovCisgIHBOZXctPmlQYXN0eSAgICAgICAgICAgPSAwOworI2VuZGlmCisKKyAgaWYgKGlJZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdCBmb3Igb2JqZWN0IDAgKi8KKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbmQgcHJldmlvdXMgbG93ZXIgb2JqZWN0LWlkICovCisgICAgcFByZXYgPSAobW5nX2ltYWdlcClwRGF0YS0+cExhc3RpbWdvYmo7CisgICAgd2hpbGUgKChwUHJldikgJiYgKHBQcmV2LT5pSWQgPiBpSWQpKQorICAgICAgcFByZXYgPSAobW5nX2ltYWdlcClwUHJldi0+c0hlYWRlci5wUHJldjsKKworICAgIGlmIChwUHJldikgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm91bmQgaXQgPyAqLworICAgIHsKKyAgICAgIHBOZXctPnNIZWFkZXIucFByZXYgID0gcFByZXY7ICAgIC8qIHRoYW4gbGluayBpdCBpbiBwbGFjZSAqLworICAgICAgcE5ldy0+c0hlYWRlci5wTmV4dCAgPSBwUHJldi0+c0hlYWRlci5wTmV4dDsKKyAgICAgIHBQcmV2LT5zSGVhZGVyLnBOZXh0ID0gcE5ldzsKKyAgICB9CisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiBub3QgZm91bmQsIGl0IGJlY29tZXMgdGhlIGZpcnN0ICEgKi8KKyAgICB7CisgICAgICBwTmV3LT5zSGVhZGVyLnBOZXh0ICA9IHBEYXRhLT5wRmlyc3RpbWdvYmo7CisgICAgICBwRGF0YS0+cEZpcnN0aW1nb2JqICA9IHBOZXc7CisgICAgfQorCisgICAgcE5leHQgICAgICAgICAgICAgICAgICA9IChtbmdfaW1hZ2VwKXBOZXctPnNIZWFkZXIucE5leHQ7CisKKyAgICBpZiAocE5leHQpCisgICAgICBwTmV4dC0+c0hlYWRlci5wUHJldiA9IHBOZXc7CisgICAgZWxzZQorICAgICAgcERhdGEtPnBMYXN0aW1nb2JqICAgPSBwTmV3OworCisgIH0KKworICBpZiAoYlBhcnRpYWwpICAgICAgICAgICAgICAgICAgICAgICAgLyogcGFydGlhbCBjbG9uZSA/ICovCisgIHsKKyAgICBwTmV3LT5wSW1nYnVmID0gcFNvdXJjZS0+cEltZ2J1ZjsgIC8qIHVzZSB0aGUgc2FtZSBvYmplY3QgYnVmZmVyICovCisgICAgcE5ldy0+cEltZ2J1Zi0+aVJlZmNvdW50Kys7ICAgICAgICAvKiBhbmQgaW5jcmVhc2UgdGhlIHJlZmVyZW5jZSBjb3VudCAqLworICB9CisgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgYSBmdWxsIGNsb25lICEgKi8KKyAgeworICAgIG1uZ19ib29sIGJDb25jcmV0ZSA9IE1OR19GQUxTRTsgICAgLyogaXQncyBhYnN0cmFjdCBieSBkZWZhdWx0ICg/KSAqLworCisgICAgaWYgKCFiQWJzdHJhY3QpICAgICAgICAgICAgICAgICAgICAvKiBkZXRlcm1pbmUgY29uY3JldGVuZXNzIGZyb20gc291cmNlID8gKi8KKyAgICAgIGJDb25jcmV0ZSA9IHBTb3VyY2UtPnBJbWdidWYtPmJDb25jcmV0ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSBhIGZ1bGwgY2xvbmUgISAqLworICAgIGlSZXRjb2RlID0gbW5nX2Nsb25lX2ltYWdlZGF0YW9iamVjdCAocERhdGEsIGJDb25jcmV0ZSwgcFNvdXJjZS0+cEltZ2J1ZiwgJnBJbWdidWYpOworCisgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgIHsKKyAgICAgIE1OR19GUkVFWCAocERhdGEsIHBOZXcsIHNpemVvZiAobW5nX2ltYWdlKSk7CisgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgfQorCisgICAgcE5ldy0+cEltZ2J1ZiA9IHBJbWdidWY7ICAgICAgICAgICAvKiBhbmQgcmVtZW1iZXIgaXQgKi8KKyAgfQorCisgICpwcENsb25lID0gcE5ldzsgICAgICAgICAgICAgICAgICAgICAvKiByZXR1cm4gaXQgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9DTE9ORV9JTUdPQkpFQ1QsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfcmVudW1faW1hZ2VvYmplY3QgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbWFnZXAgcFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgYlZpc2libGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgYkFic3RyYWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfYm9vbCAgIGJIYXNsb2NhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggIGlMb2NhdGlvbnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaUxvY2F0aW9ueCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpTG9jYXRpb255KQoreworICBtbmdfaW1hZ2VwIHBQcmV2LCBwTmV4dDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9SRU5VTV9JTUdPQkpFQ1QsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBwU291cmNlLT5iVmlzaWJsZSAgPSBiVmlzaWJsZTsgICAgICAgLyogc3RvcmUgdGhlIG5ldyB2aXNpYmlsaXR5ICovCisKKyAgaWYgKGJIYXNsb2NhKSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxvY2F0aW9uIGluZm8gYXZhaWxhYmxlID8gKi8KKyAgeworICAgIGlmIChpTG9jYXRpb250eXBlID09IDApICAgICAgICAgICAgLyogYWJzb2x1dGUgcG9zaXRpb24gPyAqLworICAgIHsKKyAgICAgIHBTb3VyY2UtPmlQb3N4ID0gaUxvY2F0aW9ueDsKKyAgICAgIHBTb3VyY2UtPmlQb3N5ID0gaUxvY2F0aW9ueTsKKyAgICB9CisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWxhdGl2ZSAqLworICAgIHsKKyAgICAgIHBTb3VyY2UtPmlQb3N4ID0gcFNvdXJjZS0+aVBvc3ggKyBpTG9jYXRpb254OworICAgICAgcFNvdXJjZS0+aVBvc3kgPSBwU291cmNlLT5pUG9zeSArIGlMb2NhdGlvbnk7CisgICAgfQorICB9CisKKyAgaWYgKGlJZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdCBmb3Igb2JqZWN0IDAgKi8KKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbmQgcHJldmlvdXMgbG93ZXIgb2JqZWN0LWlkICovCisgICAgcFByZXYgPSAobW5nX2ltYWdlcClwRGF0YS0+cExhc3RpbWdvYmo7CisgICAgd2hpbGUgKChwUHJldikgJiYgKHBQcmV2LT5pSWQgPiBpSWQpKQorICAgICAgcFByZXYgPSAobW5nX2ltYWdlcClwUHJldi0+c0hlYWRlci5wUHJldjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRpZmZlcmVudCBmcm9tIGN1cnJlbnQgPyAqLworICAgIGlmIChwUHJldiAhPSAobW5nX2ltYWdlcClwU291cmNlLT5zSGVhZGVyLnBQcmV2KQorICAgIHsKKyAgICAgIGlmIChwU291cmNlLT5zSGVhZGVyLnBQcmV2KSAgICAgIC8qIHVubGluayBmcm9tIGN1cnJlbnQgcG9zaXRpb24gISEgKi8KKyAgICAgICAgKChtbmdfaW1hZ2VwKXBTb3VyY2UtPnNIZWFkZXIucFByZXYpLT5zSGVhZGVyLnBOZXh0ID0gcFNvdXJjZS0+c0hlYWRlci5wTmV4dDsKKyAgICAgIGVsc2UKKyAgICAgICAgcERhdGEtPnBGaXJzdGltZ29iaiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gcFNvdXJjZS0+c0hlYWRlci5wTmV4dDsKKworICAgICAgaWYgKHBTb3VyY2UtPnNIZWFkZXIucE5leHQpCisgICAgICAgICgobW5nX2ltYWdlcClwU291cmNlLT5zSGVhZGVyLnBOZXh0KS0+c0hlYWRlci5wUHJldiA9IHBTb3VyY2UtPnNIZWFkZXIucFByZXY7CisgICAgICBlbHNlCisgICAgICAgIHBEYXRhLT5wTGFzdGltZ29iaiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHBTb3VyY2UtPnNIZWFkZXIucFByZXY7CisKKyAgICAgIGlmIChwUHJldikgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvdW5kIHRoZSBwcmV2aW91cyA/ICovCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGFuIGxpbmsgaXQgaW4gcGxhY2UgKi8KKyAgICAgICAgcFNvdXJjZS0+c0hlYWRlci5wUHJldiA9IHBQcmV2OworICAgICAgICBwU291cmNlLT5zSGVhZGVyLnBOZXh0ID0gcFByZXYtPnNIZWFkZXIucE5leHQ7CisgICAgICAgIHBQcmV2LT5zSGVhZGVyLnBOZXh0ICAgPSBwU291cmNlOworICAgICAgfQorICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgbm90IGZvdW5kLCBpdCBiZWNvbWVzIHRoZSBmaXJzdCAhICovCisgICAgICB7CisgICAgICAgIHBTb3VyY2UtPnNIZWFkZXIucE5leHQgPSBwRGF0YS0+cEZpcnN0aW1nb2JqOworICAgICAgICBwRGF0YS0+cEZpcnN0aW1nb2JqICAgID0gcFNvdXJjZTsKKyAgICAgIH0KKworICAgICAgcE5leHQgICAgICAgICAgICAgICAgICAgID0gKG1uZ19pbWFnZXApcFNvdXJjZS0+c0hlYWRlci5wTmV4dDsKKworICAgICAgaWYgKHBOZXh0KQorICAgICAgICBwTmV4dC0+c0hlYWRlci5wUHJldiAgID0gcFNvdXJjZTsKKyAgICAgIGVsc2UKKyAgICAgICAgcERhdGEtPnBMYXN0aW1nb2JqICAgICA9IHBTb3VyY2U7CisKKyAgICB9CisgIH0KKworICBwU291cmNlLT5pSWQgPSBpSWQ7ICAgICAgICAgICAgICAgICAgLyogbm93IHNldCB0aGUgbmV3IGlkISAqLworCisgIGlmIChiQWJzdHJhY3QpICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3JjZSBpdCB0byBhYnN0cmFjdCA/ICovCisgICAgcFNvdXJjZS0+cEltZ2J1Zi0+YkNvbmNyZXRlID0gTU5HX0ZBTFNFOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1JFTlVNX0lNR09CSkVDVCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19yZXNldF9vYmplY3RfZGV0YWlscyAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ltYWdlcCBwSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaUJpdGRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggIGlDb2xvcnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaUNvbXByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggIGlGaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaUludGVybGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2Jvb2wgICBiUmVzZXRhbGwpCit7CisgIG1uZ19pbWFnZWRhdGFwIHBCdWYgID0gcEltYWdlLT5wSW1nYnVmOworICBtbmdfdWludDMyICAgICBpU2FtcGxlc2l6ZSA9IDA7CisgIG1uZ191aW50MzIgICAgIGlSb3dzaXplOworICBtbmdfdWludDMyICAgICBpSW1nZGF0YXNpemU7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVTRVRfT0JKRUNUREVUQUlMUywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBCdWYtPmlXaWR0aCAgICAgICAgID0gaVdpZHRoOyAgICAgICAvKiBzZXQgYnVmZmVyIGNoYXJhY3RlcmlzdGljcyAqLworICBwQnVmLT5pSGVpZ2h0ICAgICAgICA9IGlIZWlnaHQ7CisgIHBCdWYtPmlCaXRkZXB0aCAgICAgID0gaUJpdGRlcHRoOworICBwQnVmLT5pQ29sb3J0eXBlICAgICA9IGlDb2xvcnR5cGU7CisgIHBCdWYtPmlDb21wcmVzc2lvbiAgID0gaUNvbXByZXNzaW9uOworICBwQnVmLT5pRmlsdGVyICAgICAgICA9IGlGaWx0ZXI7CisgIHBCdWYtPmlJbnRlcmxhY2UgICAgID0gaUludGVybGFjZTsKKyAgcEJ1Zi0+YkNvcnJlY3RlZCAgICAgPSBNTkdfRkFMU0U7CisgIHBCdWYtPmlBbHBoYWJpdGRlcHRoID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRldGVybWluZSBzYW1wbGVzaXplIGZyb20gY29sb3JfdHlwZS9iaXRfZGVwdGggKi8KKyAgc3dpdGNoIChpQ29sb3J0eXBlKSAgICAgICAgICAgICAgICAgIC8qIGZvciA8IDgtYml0IHNhbXBsZXMgd2UganVzdCByZXNlcnZlIDggYml0cyAqLworICB7CisgICAgY2FzZSAgMCAgOiA7ICAgICAgICAgICAgICAgICAgICAgICAvKiBncmF5ICovCisgICAgY2FzZSAgOCAgOiB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBKUEVHIGdyYXkgKi8KKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgaWYgKGlCaXRkZXB0aCA+IDgpCisgICAgICAgICAgICAgICAgICAgaVNhbXBsZXNpemUgPSAyOworICAgICAgICAgICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICBpU2FtcGxlc2l6ZSA9IDE7CisKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICB9CisgICAgY2FzZSAgMiAgOiA7ICAgICAgICAgICAgICAgICAgICAgICAvKiByZ2IgKi8KKyAgICBjYXNlIDEwICA6IHsgICAgICAgICAgICAgICAgICAgICAgIC8qIEpQRUcgcmdiICovCisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgIGlmIChpQml0ZGVwdGggPiA4KQorICAgICAgICAgICAgICAgICAgIGlTYW1wbGVzaXplID0gNjsKKyAgICAgICAgICAgICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgaVNhbXBsZXNpemUgPSAzOworCisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgfQorICAgIGNhc2UgIDMgIDogeyAgICAgICAgICAgICAgICAgICAgICAgLyogaW5kZXhlZCAqLworICAgICAgICAgICAgICAgICBpU2FtcGxlc2l6ZSA9IDE7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgfQorICAgIGNhc2UgIDQgIDogOyAgICAgICAgICAgICAgICAgICAgICAgLyogZ3JheSthbHBoYSAqLworICAgIGNhc2UgMTIgIDogeyAgICAgICAgICAgICAgICAgICAgICAgLyogSlBFRyBncmF5K2FscGhhICovCisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgIGlmIChpQml0ZGVwdGggPiA4KQorICAgICAgICAgICAgICAgICAgIGlTYW1wbGVzaXplID0gNDsKKyAgICAgICAgICAgICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgaVNhbXBsZXNpemUgPSAyOworCisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgfQorICAgIGNhc2UgIDYgIDogOyAgICAgICAgICAgICAgICAgICAgICAgLyogcmdiK2FscGhhICovCisgICAgY2FzZSAxNCAgOiB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBKUEVHIHJnYithbHBoYSAqLworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgICAgICAgICAgICAgICBpZiAoaUJpdGRlcHRoID4gOCkKKyAgICAgICAgICAgICAgICAgICBpU2FtcGxlc2l6ZSA9IDg7CisgICAgICAgICAgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgIGlTYW1wbGVzaXplID0gNDsKKworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIH0KKyAgfQorCisgIGlSb3dzaXplICAgICA9IGlTYW1wbGVzaXplICogaVdpZHRoOworICBpSW1nZGF0YXNpemUgPSBpUm93c2l6ZSAgICAqIGlIZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBidWZmZXIgc2l6ZSBjaGFuZ2VkID8gKi8KKyAgaWYgKGlJbWdkYXRhc2l6ZSAhPSBwQnVmLT5pSW1nZGF0YXNpemUpCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkcm9wIHRoZSBvbGQgb25lICovCisgICAgTU5HX0ZSRUUgKHBEYXRhLCBwQnVmLT5wSW1nZGF0YSwgcEJ1Zi0+aUltZ2RhdGFzaXplKTsKKworICAgIGlmIChpSW1nZGF0YXNpemUpICAgICAgICAgICAgICAgICAgLyogYWxsb2NhdGUgbmV3IHNhbXBsZS1idWZmZXIgPyAqLworICAgICAgTU5HX0FMTE9DIChwRGF0YSwgcEJ1Zi0+cEltZ2RhdGEsIGlJbWdkYXRhc2l6ZSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgaWYgKGlJbWdkYXRhc2l6ZSkgICAgICAgICAgICAgICAgICAvKiBjbGVhciBvbGQgYnVmZmVyICovCisgICAgeworICAgICAgbW5nX3VpbnQ4cCBwVGVtcCA9IHBCdWYtPnBJbWdkYXRhOworICAgICAgbW5nX3VpbnQzMiBpWDsKKyAgICAgIAorICAgICAgZm9yIChpWCA9IDA7IGlYIDwgKGlJbWdkYXRhc2l6ZSAmIChtbmdfdWludDMyKSh+M0wpKTsgaVggKz0gNCkKKyAgICAgIHsKKyAgICAgICAgKigobW5nX3VpbnQzMnApcFRlbXApID0gMHgwMDAwMDAwMGw7CisgICAgICAgIHBUZW1wICs9IDQ7CisgICAgICB9CisKKyAgICAgIHdoaWxlIChwVGVtcCA8IChwQnVmLT5wSW1nZGF0YSArIGlJbWdkYXRhc2l6ZSkpCisgICAgICB7CisgICAgICAgICpwVGVtcCA9IDA7CisgICAgICAgIHBUZW1wKys7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcEJ1Zi0+aVNhbXBsZXNpemUgID0gaVNhbXBsZXNpemU7ICAgIC8qIHJlbWVtYmVyIG5ldyBzaXplcyAqLworICBwQnVmLT5pUm93c2l6ZSAgICAgPSBpUm93c2l6ZTsKKyAgcEJ1Zi0+aUltZ2RhdGFzaXplID0gaUltZ2RhdGFzaXplOworCisgIGlmICghcEJ1Zi0+aVBpeGVsc2FtcGxlZGVwdGgpICAgICAgICAvKiBzZXQgZGVsdGEgc2FtcGxlZGVwdGhzIGlmIGVtcHR5ICovCisgICAgcEJ1Zi0+aVBpeGVsc2FtcGxlZGVwdGggPSBpQml0ZGVwdGg7CisgIGlmICghcEJ1Zi0+aUFscGhhc2FtcGxlZGVwdGgpCisgICAgcEJ1Zi0+aUFscGhhc2FtcGxlZGVwdGggPSBpQml0ZGVwdGg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkaW1lbnNpb24gc2V0IGFuZCBjbGlwcGluZyBub3QgPyAqLworICBpZiAoKGlXaWR0aCkgJiYgKGlIZWlnaHQpICYmICghcEltYWdlLT5iQ2xpcHBlZCkpCisgIHsKKyAgICBwSW1hZ2UtPmlDbGlwbCAgID0gMDsgICAgICAgICAgICAgIC8qIHNldCBjbGlwcGluZyB0byBkaW1lbnNpb24gYnkgZGVmYXVsdCAqLworICAgIHBJbWFnZS0+aUNsaXByICAgPSBpV2lkdGg7CisgICAgcEltYWdlLT5pQ2xpcHQgICA9IDA7CisgICAgcEltYWdlLT5pQ2xpcGIgICA9IGlIZWlnaHQ7CisgIH0KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX01BR04KKyAgaWYgKHBJbWFnZS0+aUlkKSAgICAgICAgICAgICAgICAgICAgIC8qIHJlc2V0IG1hZ25pZmljYXRpb24gaW5mbyA/ICovCisgIHsKKyAgICBwSW1hZ2UtPmlNQUdOX01ldGhvZFggPSAwOworICAgIHBJbWFnZS0+aU1BR05fTWV0aG9kWSA9IDA7CisgICAgcEltYWdlLT5pTUFHTl9NWCAgICAgID0gMDsKKyAgICBwSW1hZ2UtPmlNQUdOX01ZICAgICAgPSAwOworICAgIHBJbWFnZS0+aU1BR05fTUwgICAgICA9IDA7CisgICAgcEltYWdlLT5pTUFHTl9NUiAgICAgID0gMDsKKyAgICBwSW1hZ2UtPmlNQUdOX01UICAgICAgPSAwOworICAgIHBJbWFnZS0+aU1BR05fTUIgICAgICA9IDA7CisgIH0KKyNlbmRpZgorCisgIGlmIChiUmVzZXRhbGwpICAgICAgICAgICAgICAgICAgICAgICAvKiByZXNldCB0aGUgb3RoZXIgY2hhcmFjdGVyaXN0aWNzID8gKi8KKyAgeworI2lmbmRlZiBNTkdfU0tJUENIVU5LX1BBU1QKKyAgICBwSW1hZ2UtPmlQYXN0eCA9IDA7CisgICAgcEltYWdlLT5pUGFzdHkgPSAwOworI2VuZGlmCisKKyAgICBwQnVmLT5iSGFzUExURSA9IE1OR19GQUxTRTsKKyAgICBwQnVmLT5iSGFzVFJOUyA9IE1OR19GQUxTRTsKKyAgICBwQnVmLT5iSGFzR0FNQSA9IHBEYXRhLT5iSGFzZ2xvYmFsR0FNQTsKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19jSFJNCisgICAgcEJ1Zi0+Ykhhc0NIUk0gPSBwRGF0YS0+Ykhhc2dsb2JhbENIUk07CisjZW5kaWYKKyAgICBwQnVmLT5iSGFzU1JHQiA9IHBEYXRhLT5iSGFzZ2xvYmFsU1JHQjsKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19pQ0NQCisgICAgcEJ1Zi0+Ykhhc0lDQ1AgPSBwRGF0YS0+Ykhhc2dsb2JhbElDQ1A7CisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19iS0dECisgICAgcEJ1Zi0+Ykhhc0JLR0QgPSBwRGF0YS0+Ykhhc2dsb2JhbEJLR0Q7CisjZW5kaWYKKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX2lDQ1AKKyAgICBpZiAocEJ1Zi0+aVByb2ZpbGVzaXplKSAgICAgICAgICAgIC8qIGRyb3AgcG9zc2libHkgb2xkIElDQyBwcm9maWxlICovCisgICAgeworICAgICAgTU5HX0ZSRUUgKHBEYXRhLCBwQnVmLT5wUHJvZmlsZSwgcEJ1Zi0+aVByb2ZpbGVzaXplKTsKKyAgICAgIHBCdWYtPmlQcm9maWxlc2l6ZSAgICAgPSAwOworICAgIH0gIAorI2VuZGlmCisKKyAgICBpZiAocERhdGEtPmJIYXNnbG9iYWxHQU1BKSAgICAgICAgIC8qIGdsb2JhbCBnQU1BIHByZXNlbnQgPyAqLworICAgICAgcEJ1Zi0+aUdhbW1hICAgICAgICAgICA9IHBEYXRhLT5pR2xvYmFsR2FtbWE7CisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19jSFJNCisgICAgaWYgKHBEYXRhLT5iSGFzZ2xvYmFsQ0hSTSkgICAgICAgICAvKiBnbG9iYWwgY0hSTSBwcmVzZW50ID8gKi8KKyAgICB7CisgICAgICBwQnVmLT5pV2hpdGVwb2ludHggICAgID0gcERhdGEtPmlHbG9iYWxXaGl0ZXBvaW50eDsKKyAgICAgIHBCdWYtPmlXaGl0ZXBvaW50eSAgICAgPSBwRGF0YS0+aUdsb2JhbFdoaXRlcG9pbnR5OworICAgICAgcEJ1Zi0+aVByaW1hcnlyZWR4ICAgICA9IHBEYXRhLT5pR2xvYmFsUHJpbWFyeXJlZHg7CisgICAgICBwQnVmLT5pUHJpbWFyeXJlZHkgICAgID0gcERhdGEtPmlHbG9iYWxQcmltYXJ5cmVkeTsKKyAgICAgIHBCdWYtPmlQcmltYXJ5Z3JlZW54ICAgPSBwRGF0YS0+aUdsb2JhbFByaW1hcnlncmVlbng7CisgICAgICBwQnVmLT5pUHJpbWFyeWdyZWVueSAgID0gcERhdGEtPmlHbG9iYWxQcmltYXJ5Z3JlZW55OworICAgICAgcEJ1Zi0+aVByaW1hcnlibHVleCAgICA9IHBEYXRhLT5pR2xvYmFsUHJpbWFyeWJsdWV4OworICAgICAgcEJ1Zi0+aVByaW1hcnlibHVleSAgICA9IHBEYXRhLT5pR2xvYmFsUHJpbWFyeWJsdWV5OworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKHBEYXRhLT5iSGFzZ2xvYmFsU1JHQikgICAgICAgICAgIC8qIGdsb2JhbCBzUkdCIHByZXNlbnQgPyAqLworICAgICAgcEJ1Zi0+aVJlbmRlcmluZ2ludGVudCA9IHBEYXRhLT5pR2xvYmFsUmVuZGludGVudDsKKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX2lDQ1AKKyAgICBpZiAocERhdGEtPmJIYXNnbG9iYWxJQ0NQKSAgICAgICAgICAgLyogZ2xvYmFsIGlDQ1AgcHJlc2VudCA/ICovCisgICAgeworICAgICAgaWYgKHBEYXRhLT5pR2xvYmFsUHJvZmlsZXNpemUpCisgICAgICB7CisgICAgICAgIE1OR19BTExPQyAocERhdGEsIHBCdWYtPnBQcm9maWxlLCBwRGF0YS0+aUdsb2JhbFByb2ZpbGVzaXplKTsKKyAgICAgICAgTU5HX0NPUFkgIChwQnVmLT5wUHJvZmlsZSwgcERhdGEtPnBHbG9iYWxQcm9maWxlLCBwRGF0YS0+aUdsb2JhbFByb2ZpbGVzaXplKTsKKyAgICAgIH0KKworICAgICAgcEJ1Zi0+aVByb2ZpbGVzaXplICAgICA9IHBEYXRhLT5pR2xvYmFsUHJvZmlsZXNpemU7CisgICAgfQorI2VuZGlmCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19iS0dECisgICAgaWYgKHBEYXRhLT5iSGFzZ2xvYmFsQktHRCkgICAgICAgICAgIC8qIGdsb2JhbCBiS0dEIHByZXNlbnQgPyAqLworICAgIHsKKyAgICAgIHBCdWYtPmlCS0dEcmVkICAgICAgICAgPSBwRGF0YS0+aUdsb2JhbEJLR0RyZWQ7CisgICAgICBwQnVmLT5pQktHRGdyZWVuICAgICAgID0gcERhdGEtPmlHbG9iYWxCS0dEZ3JlZW47CisgICAgICBwQnVmLT5pQktHRGJsdWUgICAgICAgID0gcERhdGEtPmlHbG9iYWxCS0dEYmx1ZTsKKyAgICB9CisjZW5kaWYKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1JFU0VUX09CSkVDVERFVEFJTFMsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWYgIWRlZmluZWQoTU5HX05PX0RFTFRBX1BORykgfHwgIWRlZmluZWQoTU5HX1NLSVBDSFVOS19QQVNUKSB8fCAhZGVmaW5lZChNTkdfU0tJUENIVU5LX01BR04pCittbmdfcmV0Y29kZSBtbmdfcHJvbW90ZV9pbWFnZW9iamVjdCAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW1hZ2VwIHBJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggIGlCaXRkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggIGlDb2xvcnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICBpRmlsbHR5cGUpCit7CisgIG1uZ19yZXRjb2RlICAgIGlSZXRjb2RlICAgICAgID0gTU5HX05PRVJST1I7CisgIG1uZ19pbWFnZWRhdGFwIHBCdWYgICAgICAgICAgID0gcEltYWdlLT5wSW1nYnVmOworICBtbmdfdWludDMyICAgICBpVyAgICAgICAgICAgICA9IHBCdWYtPmlXaWR0aDsKKyAgbW5nX3VpbnQzMiAgICAgaUggICAgICAgICAgICAgPSBwQnVmLT5pSGVpZ2h0OworICBtbmdfdWludDhwICAgICBwTmV3YnVmOworICBtbmdfdWludDMyICAgICBpTmV3YnVmc2l6ZTsKKyAgbW5nX3VpbnQzMiAgICAgaU5ld3Jvd3NpemU7CisgIG1uZ191aW50MzIgICAgIGlOZXdzYW1wbGVzaXplID0gcEJ1Zi0+aVNhbXBsZXNpemU7CisgIG1uZ191aW50MzIgICAgIGlZOworICBtbmdfdWludDggICAgICBpVGVtcGRlcHRoOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST01PVEVfSU1HT0JKRUNULCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyNpZmRlZiBNTkdfTk9fMV8yXzRCSVRfU1VQUE9SVAorICBpZiAoaUJpdGRlcHRoIDwgOCkKKyAgICBpQml0ZGVwdGg9ODsKKyAgaWYgKHBCdWYtPmlCaXRkZXB0aCA8IDgpCisgICAgcEJ1Zi0+aUJpdGRlcHRoPTg7CisjZW5kaWYKKyNpZmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICBpZiAoaUJpdGRlcHRoID4gOCkKKyAgICBpQml0ZGVwdGg9ODsKKyAgaWYgKHBCdWYtPmlCaXRkZXB0aCA+IDgpCisgICAgcEJ1Zi0+aUJpdGRlcHRoPTg7CisjZW5kaWYKKworICBwRGF0YS0+ZlByb21vdGVyb3cgICAgPSBNTkdfTlVMTDsgICAgLyogaW5pdCBwcm9tb3Rpb24gZmllbGRzICovCisgIHBEYXRhLT5mUHJvbUJpdGRlcHRoICA9IE1OR19OVUxMOworICBwRGF0YS0+aVByb21Db2xvcnR5cGUgPSBpQ29sb3J0eXBlOworICBwRGF0YS0+aVByb21CaXRkZXB0aCAgPSBpQml0ZGVwdGg7CisgIHBEYXRhLT5pUHJvbUZpbGx0eXBlICA9IGlGaWxsdHlwZTsKKworICBpZiAoaUJpdGRlcHRoICE9IHBCdWYtPmlCaXRkZXB0aCkgICAgLyogZGV0ZXJtaW5lIGJpdGRlcHRoIHByb21vdGlvbiAqLworICB7CisgICAgaWYgKHBCdWYtPmlDb2xvcnR5cGUgPT0gTU5HX0NPTE9SVFlQRV9JTkRFWEVEKQorICAgICAgaVRlbXBkZXB0aCA9IDg7CisgICAgZWxzZQorICAgICAgaVRlbXBkZXB0aCA9IHBCdWYtPmlCaXRkZXB0aDsKKworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisgICAgaWYgKGlGaWxsdHlwZSA9PSBNTkdfRklMTE1FVEhPRF9aRVJPRklMTCkKKyAgICB7CisgICAgICBzd2l0Y2ggKGlUZW1wZGVwdGgpCisgICAgICB7CisjaWZuZGVmIE1OR19OT18xXzJfNEJJVF9TVVBQT1JUCisgICAgICAgIGNhc2UgMSA6IHsKKyAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGlCaXRkZXB0aCkKKyAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBjYXNlICAyIDogeyBwRGF0YS0+ZlByb21CaXRkZXB0aCA9IChtbmdfZnB0ciltbmdfcHJvbW90ZV96ZXJvZmlsbF8xXzI7ICBicmVhazsgfQorICAgICAgICAgICAgICAgICAgICAgY2FzZSAgNCA6IHsgcERhdGEtPmZQcm9tQml0ZGVwdGggPSAobW5nX2ZwdHIpbW5nX3Byb21vdGVfemVyb2ZpbGxfMV80OyAgYnJlYWs7IH0KKyAgICAgICAgICAgICAgICAgICAgIGNhc2UgIDggOiB7IHBEYXRhLT5mUHJvbUJpdGRlcHRoID0gKG1uZ19mcHRyKW1uZ19wcm9tb3RlX3plcm9maWxsXzFfODsgIGJyZWFrOyB9CisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2IDogeyBwRGF0YS0+ZlByb21CaXRkZXB0aCA9IChtbmdfZnB0ciltbmdfcHJvbW90ZV96ZXJvZmlsbF8xXzE2OyBicmVhazsgfQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICB9CisgICAgICAgIGNhc2UgMiA6IHsKKyAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGlCaXRkZXB0aCkKKyAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBjYXNlICA0IDogeyBwRGF0YS0+ZlByb21CaXRkZXB0aCA9IChtbmdfZnB0ciltbmdfcHJvbW90ZV96ZXJvZmlsbF8yXzQ7ICBicmVhazsgfQorICAgICAgICAgICAgICAgICAgICAgY2FzZSAgOCA6IHsgcERhdGEtPmZQcm9tQml0ZGVwdGggPSAobW5nX2ZwdHIpbW5nX3Byb21vdGVfemVyb2ZpbGxfMl84OyAgYnJlYWs7IH0KKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTYgOiB7IHBEYXRhLT5mUHJvbUJpdGRlcHRoID0gKG1uZ19mcHRyKW1uZ19wcm9tb3RlX3plcm9maWxsXzJfMTY7IGJyZWFrOyB9CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSA0IDogeworICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoaUJpdGRlcHRoKQorICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIGNhc2UgIDggOiB7IHBEYXRhLT5mUHJvbUJpdGRlcHRoID0gKG1uZ19mcHRyKW1uZ19wcm9tb3RlX3plcm9maWxsXzRfODsgIGJyZWFrOyB9CisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2IDogeyBwRGF0YS0+ZlByb21CaXRkZXB0aCA9IChtbmdfZnB0ciltbmdfcHJvbW90ZV96ZXJvZmlsbF80XzE2OyBicmVhazsgfQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogTU5HX05PXzFfMl80QklUX1NVUFBPUlQgKi8KKyAgICAgICAgY2FzZSA4IDogeworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgIGlmIChpQml0ZGVwdGggPT0gMTYpCisgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZlByb21CaXRkZXB0aCA9IChtbmdfZnB0ciltbmdfcHJvbW90ZV96ZXJvZmlsbF84XzE2OworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgeworICAgICAgc3dpdGNoIChpVGVtcGRlcHRoKQorICAgICAgeworI2lmbmRlZiBNTkdfTk9fMV8yXzRCSVRfU1VQUE9SVAorICAgICAgICBjYXNlIDEgOiB7CisgICAgICAgICAgICAgICAgICAgc3dpdGNoIChpQml0ZGVwdGgpCisgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgY2FzZSAgMiA6IHsgcERhdGEtPmZQcm9tQml0ZGVwdGggPSAobW5nX2ZwdHIpbW5nX3Byb21vdGVfcmVwbGljYXRlXzFfMjsgIGJyZWFrOyB9CisgICAgICAgICAgICAgICAgICAgICBjYXNlICA0IDogeyBwRGF0YS0+ZlByb21CaXRkZXB0aCA9IChtbmdfZnB0ciltbmdfcHJvbW90ZV9yZXBsaWNhdGVfMV80OyAgYnJlYWs7IH0KKyAgICAgICAgICAgICAgICAgICAgIGNhc2UgIDggOiB7IHBEYXRhLT5mUHJvbUJpdGRlcHRoID0gKG1uZ19mcHRyKW1uZ19wcm9tb3RlX3JlcGxpY2F0ZV8xXzg7ICBicmVhazsgfQorI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNiA6IHsgcERhdGEtPmZQcm9tQml0ZGVwdGggPSAobW5nX2ZwdHIpbW5nX3Byb21vdGVfcmVwbGljYXRlXzFfMTY7IGJyZWFrOyB9CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSAyIDogeworICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoaUJpdGRlcHRoKQorICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIGNhc2UgIDQgOiB7IHBEYXRhLT5mUHJvbUJpdGRlcHRoID0gKG1uZ19mcHRyKW1uZ19wcm9tb3RlX3JlcGxpY2F0ZV8yXzQ7ICBicmVhazsgfQorICAgICAgICAgICAgICAgICAgICAgY2FzZSAgOCA6IHsgcERhdGEtPmZQcm9tQml0ZGVwdGggPSAobW5nX2ZwdHIpbW5nX3Byb21vdGVfcmVwbGljYXRlXzJfODsgIGJyZWFrOyB9CisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2IDogeyBwRGF0YS0+ZlByb21CaXRkZXB0aCA9IChtbmdfZnB0ciltbmdfcHJvbW90ZV9yZXBsaWNhdGVfMl8xNjsgYnJlYWs7IH0KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICBjYXNlIDQgOiB7CisgICAgICAgICAgICAgICAgICAgc3dpdGNoIChpQml0ZGVwdGgpCisgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgY2FzZSAgOCA6IHsgcERhdGEtPmZQcm9tQml0ZGVwdGggPSAobW5nX2ZwdHIpbW5nX3Byb21vdGVfcmVwbGljYXRlXzRfODsgIGJyZWFrOyB9CisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2IDogeyBwRGF0YS0+ZlByb21CaXRkZXB0aCA9IChtbmdfZnB0ciltbmdfcHJvbW90ZV9yZXBsaWNhdGVfNF8xNjsgYnJlYWs7IH0KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIE1OR19OT18xXzJfNEJJVF9TVVBQT1JUICovCisgICAgICAgIGNhc2UgOCA6IHsKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICBpZiAoaUJpdGRlcHRoID09IDE2KQorICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmZQcm9tQml0ZGVwdGggPSAobW5nX2ZwdHIpbW5nX3Byb21vdGVfcmVwbGljYXRlXzhfMTY7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZyAtPiBnICovCisgIGlmICgocEJ1Zi0+aUNvbG9ydHlwZSA9PSBNTkdfQ09MT1JUWVBFX0dSQVkpICYmCisgICAgICAoaUNvbG9ydHlwZSA9PSBNTkdfQ09MT1JUWVBFX0dSQVkpKQorICB7CisgICAgaWYgKHBCdWYtPmlCaXRkZXB0aCA8PSA4KSAgICAgICAgICAvKiBzb3VyY2UgPD0gOCBiaXRzICovCisgICAgeworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgICAgaWYgKGlCaXRkZXB0aCA9PSAxNikKKyAgICAgICAgcERhdGEtPmZQcm9tb3Rlcm93ID0gKG1uZ19mcHRyKW1uZ19wcm9tb3RlX2c4X2cxNjsKKyAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICBwRGF0YS0+ZlByb21vdGVyb3cgPSAobW5nX2ZwdHIpbW5nX3Byb21vdGVfZzhfZzg7CisgICAgfQorCisgICAgaU5ld3NhbXBsZXNpemUgPSAxOworCisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgaWYgKGlCaXRkZXB0aCA9PSAxNikgICAgICAgICAgICAgICAvKiAxNi1iaXQgd2lkZSA/ICovCisgICAgICBpTmV3c2FtcGxlc2l6ZSA9IDI7CisjZW5kaWYKKyAgfQorICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZyAtPiBnYSAqLworICBpZiAoKHBCdWYtPmlDb2xvcnR5cGUgPT0gTU5HX0NPTE9SVFlQRV9HUkFZKSAmJgorICAgICAgKGlDb2xvcnR5cGUgPT0gTU5HX0NPTE9SVFlQRV9HUkFZQSkpCisgIHsKKyAgICBpZiAocEJ1Zi0+aUJpdGRlcHRoIDw9IDgpICAgICAgICAgIC8qIHNvdXJjZSA8PSA4IGJpdHMgKi8KKyAgICB7CisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgICBpZiAoaUJpdGRlcHRoID09IDE2KQorICAgICAgICBwRGF0YS0+ZlByb21vdGVyb3cgPSAobW5nX2ZwdHIpbW5nX3Byb21vdGVfZzhfZ2ExNjsKKyAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICBwRGF0YS0+ZlByb21vdGVyb3cgPSAobW5nX2ZwdHIpbW5nX3Byb21vdGVfZzhfZ2E4OworICAgIH0KKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNvdXJjZSA9IDE2IGJpdHMgKi8KKyAgICAgIHBEYXRhLT5mUHJvbW90ZXJvdyA9IChtbmdfZnB0ciltbmdfcHJvbW90ZV9nMTZfZ2ExNjsKKyNlbmRpZgorCisgICAgaU5ld3NhbXBsZXNpemUgPSAyOworCisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgaWYgKGlCaXRkZXB0aCA9PSAxNikgICAgICAgICAgICAgICAvKiAxNi1iaXQgd2lkZSA/ICovCisgICAgICBpTmV3c2FtcGxlc2l6ZSA9IDQ7CisjZW5kaWYKKyAgfQorICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZyAtPiByZ2IgKi8KKyAgaWYgKChwQnVmLT5pQ29sb3J0eXBlID09IE1OR19DT0xPUlRZUEVfR1JBWSkgJiYKKyAgICAgIChpQ29sb3J0eXBlID09IE1OR19DT0xPUlRZUEVfUkdCKSkKKyAgeworICAgIGlmIChwQnVmLT5pQml0ZGVwdGggPD0gOCkgICAgICAgICAgLyogc291cmNlIDw9IDggYml0cyAqLworICAgIHsKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyAgICAgIGlmIChpQml0ZGVwdGggPT0gMTYpCisgICAgICAgIHBEYXRhLT5mUHJvbW90ZXJvdyA9IChtbmdfZnB0ciltbmdfcHJvbW90ZV9nOF9yZ2IxNjsKKyAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICBwRGF0YS0+ZlByb21vdGVyb3cgPSAobW5nX2ZwdHIpbW5nX3Byb21vdGVfZzhfcmdiODsKKyAgICB9CisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzb3VyY2UgPSAxNiBiaXRzICovCisgICAgICBwRGF0YS0+ZlByb21vdGVyb3cgPSAobW5nX2ZwdHIpbW5nX3Byb21vdGVfZzE2X3JnYjE2OworI2VuZGlmCisKKyAgICBpTmV3c2FtcGxlc2l6ZSA9IDM7CisKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyAgICBpZiAoaUJpdGRlcHRoID09IDE2KSAgICAgICAgICAgICAgIC8qIDE2LWJpdCB3aWRlID8gKi8KKyAgICAgIGlOZXdzYW1wbGVzaXplID0gNjsKKyNlbmRpZgorICB9CisgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnIC0+IHJnYmEgKi8KKyAgaWYgKChwQnVmLT5pQ29sb3J0eXBlID09IE1OR19DT0xPUlRZUEVfR1JBWSkgJiYKKyAgICAgIChpQ29sb3J0eXBlID09IE1OR19DT0xPUlRZUEVfUkdCQSkpCisgIHsKKyAgICBpZiAocEJ1Zi0+aUJpdGRlcHRoIDw9IDgpICAgICAgICAgIC8qIHNvdXJjZSA8PSA4IGJpdHMgKi8KKyAgICB7CisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgICBpZiAoaUJpdGRlcHRoID09IDE2KQorICAgICAgICBwRGF0YS0+ZlByb21vdGVyb3cgPSAobW5nX2ZwdHIpbW5nX3Byb21vdGVfZzhfcmdiYTE2OworICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgIHBEYXRhLT5mUHJvbW90ZXJvdyA9IChtbmdfZnB0ciltbmdfcHJvbW90ZV9nOF9yZ2JhODsKKyAgICB9CisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzb3VyY2UgPSAxNiBiaXRzICovCisgICAgICBwRGF0YS0+ZlByb21vdGVyb3cgPSAobW5nX2ZwdHIpbW5nX3Byb21vdGVfZzE2X3JnYmExNjsKKyNlbmRpZgorCisgICAgaU5ld3NhbXBsZXNpemUgPSA0OworCisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgaWYgKGlCaXRkZXB0aCA9PSAxNikgICAgICAgICAgICAgICAvKiAxNi1iaXQgd2lkZSA/ICovCisgICAgICBpTmV3c2FtcGxlc2l6ZSA9IDg7CisjZW5kaWYKKyAgfQorICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2EgLT4gZ2EgKi8KKyAgaWYgKChwQnVmLT5pQ29sb3J0eXBlID09IE1OR19DT0xPUlRZUEVfR1JBWUEpICYmCisgICAgICAoaUNvbG9ydHlwZSA9PSBNTkdfQ09MT1JUWVBFX0dSQVlBKSkKKyAgeworICAgIGlOZXdzYW1wbGVzaXplID0gMjsKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyAgICBpZiAocEJ1Zi0+aUJpdGRlcHRoIDw9IDgpICAgICAgICAgIC8qIHNvdXJjZSA8PSA4IGJpdHMgKi8KKyAgICAgIGlmIChpQml0ZGVwdGggPT0gMTYpCisgICAgICAgIHBEYXRhLT5mUHJvbW90ZXJvdyA9IChtbmdfZnB0ciltbmdfcHJvbW90ZV9nYThfZ2ExNjsKKyAgICBpZiAoaUJpdGRlcHRoID09IDE2KQorICAgICAgaU5ld3NhbXBsZXNpemUgPSA0OworI2VuZGlmCisgIH0KKyAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdhIC0+IHJnYmEgKi8KKyAgaWYgKChwQnVmLT5pQ29sb3J0eXBlID09IE1OR19DT0xPUlRZUEVfR1JBWUEpICYmCisgICAgICAoaUNvbG9ydHlwZSA9PSBNTkdfQ09MT1JUWVBFX1JHQkEpKQorICB7CisgICAgaWYgKHBCdWYtPmlCaXRkZXB0aCA8PSA4KSAgICAgICAgICAvKiBzb3VyY2UgPD0gOCBiaXRzICovCisgICAgeworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgICAgaWYgKGlCaXRkZXB0aCA9PSAxNikKKyAgICAgICAgcERhdGEtPmZQcm9tb3Rlcm93ID0gKG1uZ19mcHRyKW1uZ19wcm9tb3RlX2dhOF9yZ2JhMTY7CisgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgcERhdGEtPmZQcm9tb3Rlcm93ID0gKG1uZ19mcHRyKW1uZ19wcm9tb3RlX2dhOF9yZ2JhODsKKyAgICB9CisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzb3VyY2UgPSAxNiBiaXRzICovCisgICAgICBwRGF0YS0+ZlByb21vdGVyb3cgPSAobW5nX2ZwdHIpbW5nX3Byb21vdGVfZ2ExNl9yZ2JhMTY7CisjZW5kaWYKKworICAgIGlOZXdzYW1wbGVzaXplID0gNDsKKworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgIGlmIChpQml0ZGVwdGggPT0gMTYpICAgICAgICAgICAgICAgLyogMTYtYml0IHdpZGUgPyAqLworICAgICAgaU5ld3NhbXBsZXNpemUgPSA4OworI2VuZGlmCisgIH0KKyAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJnYiAtPiByZ2IgKi8KKyAgaWYgKChwQnVmLT5pQ29sb3J0eXBlID09IE1OR19DT0xPUlRZUEVfUkdCKSAmJgorICAgICAgKGlDb2xvcnR5cGUgPT0gTU5HX0NPTE9SVFlQRV9SR0IpKQorICB7CisgICAgaU5ld3NhbXBsZXNpemUgPSAzOworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgIGlmIChwQnVmLT5pQml0ZGVwdGggPD0gOCkgICAgICAgICAgLyogc291cmNlIDw9IDggYml0cyAqLworICAgICAgaWYgKGlCaXRkZXB0aCA9PSAxNikKKyAgICAgICAgcERhdGEtPmZQcm9tb3Rlcm93ID0gKG1uZ19mcHRyKW1uZ19wcm9tb3RlX3JnYjhfcmdiMTY7CisgICAgaWYgKGlCaXRkZXB0aCA9PSAxNikKKyAgICAgIGlOZXdzYW1wbGVzaXplID0gNjsKKyNlbmRpZgorICB9CisgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZ2IgLT4gcmdiYSAqLworICBpZiAoKHBCdWYtPmlDb2xvcnR5cGUgPT0gTU5HX0NPTE9SVFlQRV9SR0IpICYmCisgICAgICAoaUNvbG9ydHlwZSA9PSBNTkdfQ09MT1JUWVBFX1JHQkEpKQorICB7CisgICAgaWYgKHBCdWYtPmlCaXRkZXB0aCA8PSA4KSAgICAgICAgICAvKiBzb3VyY2UgPD0gOCBiaXRzICovCisgICAgeworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgICAgaWYgKGlCaXRkZXB0aCA9PSAxNikKKyAgICAgICAgcERhdGEtPmZQcm9tb3Rlcm93ID0gKG1uZ19mcHRyKW1uZ19wcm9tb3RlX3JnYjhfcmdiYTE2OworICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgIHBEYXRhLT5mUHJvbW90ZXJvdyA9IChtbmdfZnB0ciltbmdfcHJvbW90ZV9yZ2I4X3JnYmE4OworICAgIH0KKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNvdXJjZSA9IDE2IGJpdHMgKi8KKyAgICAgIHBEYXRhLT5mUHJvbW90ZXJvdyA9IChtbmdfZnB0ciltbmdfcHJvbW90ZV9yZ2IxNl9yZ2JhMTY7CisjZW5kaWYKKworICAgIGlOZXdzYW1wbGVzaXplID0gNDsKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyAgICBpZiAoaUJpdGRlcHRoID09IDE2KSAgICAgICAgICAgICAgIC8qIDE2LWJpdCB3aWRlID8gKi8KKyAgICAgIGlOZXdzYW1wbGVzaXplID0gODsKKyNlbmRpZgorICB9CisgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbmRleGVkIC0+IHJnYiAqLworICBpZiAoKHBCdWYtPmlDb2xvcnR5cGUgPT0gTU5HX0NPTE9SVFlQRV9JTkRFWEVEKSAmJgorICAgICAgKGlDb2xvcnR5cGUgPT0gTU5HX0NPTE9SVFlQRV9SR0IpKQorICB7CisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgaWYgKGlCaXRkZXB0aCA9PSAxNikKKyAgICAgIHBEYXRhLT5mUHJvbW90ZXJvdyA9IChtbmdfZnB0ciltbmdfcHJvbW90ZV9pZHg4X3JnYjE2OworICAgIGVsc2UKKyNlbmRpZgorICAgICAgcERhdGEtPmZQcm9tb3Rlcm93ID0gKG1uZ19mcHRyKW1uZ19wcm9tb3RlX2lkeDhfcmdiODsKKworICAgIGlOZXdzYW1wbGVzaXplID0gMzsKKworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgIGlmIChpQml0ZGVwdGggPT0gMTYpICAgICAgICAgICAgICAgLyogMTYtYml0IHdpZGUgPyAqLworICAgICAgaU5ld3NhbXBsZXNpemUgPSA2OworI2VuZGlmCisgIH0KKyAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluZGV4ZWQgLT4gcmdiYSAqLworICBpZiAoKHBCdWYtPmlDb2xvcnR5cGUgPT0gTU5HX0NPTE9SVFlQRV9JTkRFWEVEKSAmJgorICAgICAgKGlDb2xvcnR5cGUgPT0gTU5HX0NPTE9SVFlQRV9SR0JBKSkKKyAgeworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgIGlmIChpQml0ZGVwdGggPT0gMTYpCisgICAgICBwRGF0YS0+ZlByb21vdGVyb3cgPSAobW5nX2ZwdHIpbW5nX3Byb21vdGVfaWR4OF9yZ2JhMTY7CisgICAgZWxzZQorI2VuZGlmCisgICAgICBwRGF0YS0+ZlByb21vdGVyb3cgPSAobW5nX2ZwdHIpbW5nX3Byb21vdGVfaWR4OF9yZ2JhODsKKworICAgIGlOZXdzYW1wbGVzaXplID0gNDsKKworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgIGlmIChpQml0ZGVwdGggPT0gMTYpICAgICAgICAgICAgICAgLyogMTYtYml0IHdpZGUgPyAqLworICAgICAgaU5ld3NhbXBsZXNpemUgPSA4OworI2VuZGlmCisgIH0KKyAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJnYmEgLT4gcmdiYSAqLworICBpZiAoKHBCdWYtPmlDb2xvcnR5cGUgPT0gTU5HX0NPTE9SVFlQRV9SR0JBKSAmJgorICAgICAgKGlDb2xvcnR5cGUgPT0gTU5HX0NPTE9SVFlQRV9SR0JBKSkKKyAgeworICAgIGlOZXdzYW1wbGVzaXplID0gNDsKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyAgICBpZiAocEJ1Zi0+aUJpdGRlcHRoIDw9IDgpICAgICAgICAgIC8qIHNvdXJjZSA8PSA4IGJpdHMgKi8KKyAgICB7CisgICAgICBpZiAoaUJpdGRlcHRoID09IDE2KQorICAgICAgICBwRGF0YS0+ZlByb21vdGVyb3cgPSAobW5nX2ZwdHIpbW5nX3Byb21vdGVfcmdiYThfcmdiYTE2OworICAgIH0KKyAgICBpZiAoaUJpdGRlcHRoID09IDE2KSAgICAgICAgICAgICAgIC8qIDE2LWJpdCB3aWRlID8gKi8KKyAgICAgIGlOZXdzYW1wbGVzaXplID0gODsKKyNlbmRpZgorICB9CisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBKUEVHIGcgLT4gZyAqLworICBpZiAoKHBCdWYtPmlDb2xvcnR5cGUgPT0gTU5HX0NPTE9SVFlQRV9KUEVHR1JBWSkgJiYKKyAgICAgIChpQ29sb3J0eXBlID09IE1OR19DT0xPUlRZUEVfSlBFR0dSQVkpKQorICB7CisgICAgaWYgKHBCdWYtPmlCaXRkZXB0aCA8PSA4KSAgICAgICAgICAvKiBzb3VyY2UgPD0gOCBiaXRzICovCisgICAgeworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgICAgaWYgKGlCaXRkZXB0aCA9PSAxNikKKyAgICAgICAgcERhdGEtPmZQcm9tb3Rlcm93ID0gKG1uZ19mcHRyKW1uZ19wcm9tb3RlX2c4X2cxNjsKKyAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICBwRGF0YS0+ZlByb21vdGVyb3cgPSAobW5nX2ZwdHIpbW5nX3Byb21vdGVfZzhfZzg7CisgICAgfQorCisgICAgaU5ld3NhbXBsZXNpemUgPSAxOworCisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgaWYgKGlCaXRkZXB0aCA9PSAxNikgICAgICAgICAgICAgICAvKiAxNi1iaXQgd2lkZSA/ICovCisgICAgICBpTmV3c2FtcGxlc2l6ZSA9IDI7CisjZW5kaWYKKyAgfQorICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSlBFRyBnIC0+IGdhICovCisgIGlmICgocEJ1Zi0+aUNvbG9ydHlwZSA9PSBNTkdfQ09MT1JUWVBFX0pQRUdHUkFZKSAmJgorICAgICAgKGlDb2xvcnR5cGUgPT0gTU5HX0NPTE9SVFlQRV9KUEVHR1JBWUEpKQorICB7CisgICAgaWYgKHBCdWYtPmlCaXRkZXB0aCA8PSA4KSAgICAgICAgICAvKiBzb3VyY2UgPD0gOCBiaXRzICovCisgICAgeworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgICAgaWYgKGlCaXRkZXB0aCA9PSAxNikKKyAgICAgICAgcERhdGEtPmZQcm9tb3Rlcm93ID0gKG1uZ19mcHRyKW1uZ19wcm9tb3RlX2c4X2dhMTY7CisgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgcERhdGEtPmZQcm9tb3Rlcm93ID0gKG1uZ19mcHRyKW1uZ19wcm9tb3RlX2c4X2dhODsKKyAgICB9CisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzb3VyY2UgPSAxNiBiaXRzICovCisgICAgICBwRGF0YS0+ZlByb21vdGVyb3cgPSAobW5nX2ZwdHIpbW5nX3Byb21vdGVfZzE2X2dhMTY7CisjZW5kaWYKKworICAgIGlOZXdzYW1wbGVzaXplID0gMjsKKworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgIGlmIChpQml0ZGVwdGggPT0gMTYpICAgICAgICAgICAgICAgLyogMTYtYml0IHdpZGUgPyAqLworICAgICAgaU5ld3NhbXBsZXNpemUgPSA0OworI2VuZGlmCisgIH0KKyAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEpQRUcgZyAtPiByZ2IgKi8KKyAgaWYgKChwQnVmLT5pQ29sb3J0eXBlID09IE1OR19DT0xPUlRZUEVfSlBFR0dSQVkpICYmCisgICAgICAoaUNvbG9ydHlwZSA9PSBNTkdfQ09MT1JUWVBFX0pQRUdDT0xPUikpCisgIHsKKyAgICBpZiAocEJ1Zi0+aUJpdGRlcHRoIDw9IDgpICAgICAgICAgIC8qIHNvdXJjZSA8PSA4IGJpdHMgKi8KKyAgICB7CisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgICBpZiAoaUJpdGRlcHRoID09IDE2KQorICAgICAgICBwRGF0YS0+ZlByb21vdGVyb3cgPSAobW5nX2ZwdHIpbW5nX3Byb21vdGVfZzhfcmdiMTY7CisgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgcERhdGEtPmZQcm9tb3Rlcm93ID0gKG1uZ19mcHRyKW1uZ19wcm9tb3RlX2c4X3JnYjg7CisgICAgfQorI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc291cmNlID0gMTYgYml0cyAqLworICAgICAgcERhdGEtPmZQcm9tb3Rlcm93ID0gKG1uZ19mcHRyKW1uZ19wcm9tb3RlX2cxNl9yZ2IxNjsKKyNlbmRpZgorCisgICAgaU5ld3NhbXBsZXNpemUgPSAzOworCisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgaWYgKGlCaXRkZXB0aCA9PSAxNikgICAgICAgICAgICAgICAvKiAxNi1iaXQgd2lkZSA/ICovCisgICAgICBpTmV3c2FtcGxlc2l6ZSA9IDY7CisjZW5kaWYKKyAgfQorICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSlBFRyBnIC0+IHJnYmEgKi8KKyAgaWYgKChwQnVmLT5pQ29sb3J0eXBlID09IE1OR19DT0xPUlRZUEVfSlBFR0dSQVkpICYmCisgICAgICAoaUNvbG9ydHlwZSA9PSBNTkdfQ09MT1JUWVBFX0pQRUdDT0xPUkEpKQorICB7CisgICAgaWYgKHBCdWYtPmlCaXRkZXB0aCA8PSA4KSAgICAgICAgICAvKiBzb3VyY2UgPD0gOCBiaXRzICovCisgICAgeworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgICAgaWYgKGlCaXRkZXB0aCA9PSAxNikKKyAgICAgICAgcERhdGEtPmZQcm9tb3Rlcm93ID0gKG1uZ19mcHRyKW1uZ19wcm9tb3RlX2c4X3JnYmExNjsKKyAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICBwRGF0YS0+ZlByb21vdGVyb3cgPSAobW5nX2ZwdHIpbW5nX3Byb21vdGVfZzhfcmdiYTg7CisgICAgfQorI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc291cmNlID0gMTYgYml0cyAqLworICAgICAgcERhdGEtPmZQcm9tb3Rlcm93ID0gKG1uZ19mcHRyKW1uZ19wcm9tb3RlX2cxNl9yZ2JhMTY7CisjZW5kaWYKKworICAgIGlOZXdzYW1wbGVzaXplID0gNDsKKworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgIGlmIChpQml0ZGVwdGggPT0gMTYpICAgICAgICAgICAgICAgLyogMTYtYml0IHdpZGUgPyAqLworICAgICAgaU5ld3NhbXBsZXNpemUgPSA4OworI2VuZGlmCisgIH0KKyAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEpQRUcgZ2EgLT4gZ2EgKi8KKyAgaWYgKChwQnVmLT5pQ29sb3J0eXBlID09IE1OR19DT0xPUlRZUEVfSlBFR0dSQVlBKSAmJgorICAgICAgKGlDb2xvcnR5cGUgPT0gTU5HX0NPTE9SVFlQRV9KUEVHR1JBWUEpKQorICB7CisgICAgaU5ld3NhbXBsZXNpemUgPSAyOworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgIGlmIChwQnVmLT5pQml0ZGVwdGggPD0gOCkgICAgICAgICAgLyogc291cmNlIDw9IDggYml0cyAqLworICAgICAgaWYgKGlCaXRkZXB0aCA9PSAxNikKKyAgICAgICAgcERhdGEtPmZQcm9tb3Rlcm93ID0gKG1uZ19mcHRyKW1uZ19wcm9tb3RlX2dhOF9nYTE2OworICAgIGlmIChpQml0ZGVwdGggPT0gMTYpCisgICAgICBpTmV3c2FtcGxlc2l6ZSA9IDQ7CisjZW5kaWYKKworICB9CisgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBKUEVHIGdhIC0+IHJnYmEgKi8KKyAgaWYgKChwQnVmLT5pQ29sb3J0eXBlID09IE1OR19DT0xPUlRZUEVfSlBFR0dSQVlBKSAmJgorICAgICAgKGlDb2xvcnR5cGUgPT0gTU5HX0NPTE9SVFlQRV9KUEVHQ09MT1JBKSkKKyAgeworICAgIGlmIChwQnVmLT5pQml0ZGVwdGggPD0gOCkgICAgICAgICAgLyogc291cmNlIDw9IDggYml0cyAqLworICAgIHsKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyAgICAgIGlmIChpQml0ZGVwdGggPT0gMTYpCisgICAgICAgIHBEYXRhLT5mUHJvbW90ZXJvdyA9IChtbmdfZnB0ciltbmdfcHJvbW90ZV9nYThfcmdiYTE2OworICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgIHBEYXRhLT5mUHJvbW90ZXJvdyA9IChtbmdfZnB0ciltbmdfcHJvbW90ZV9nYThfcmdiYTg7CisgICAgfQorI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc291cmNlID0gMTYgYml0cyAqLworICAgICAgcERhdGEtPmZQcm9tb3Rlcm93ID0gKG1uZ19mcHRyKW1uZ19wcm9tb3RlX2dhMTZfcmdiYTE2OworI2VuZGlmCisKKyAgICBpTmV3c2FtcGxlc2l6ZSA9IDQ7CisKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyAgICBpZiAoaUJpdGRlcHRoID09IDE2KSAgICAgICAgICAgICAgIC8qIDE2LWJpdCB3aWRlID8gKi8KKyAgICAgIGlOZXdzYW1wbGVzaXplID0gODsKKyNlbmRpZgorICB9CisgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBKUEVHIHJnYiAtPiByZ2IgKi8KKyAgaWYgKChwQnVmLT5pQ29sb3J0eXBlID09IE1OR19DT0xPUlRZUEVfSlBFR0NPTE9SKSAmJgorICAgICAgKGlDb2xvcnR5cGUgPT0gTU5HX0NPTE9SVFlQRV9KUEVHQ09MT1IpKQorICB7CisgICAgaU5ld3NhbXBsZXNpemUgPSAzOworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgIGlmIChwQnVmLT5pQml0ZGVwdGggPD0gOCkgICAgICAgICAgLyogc291cmNlIDw9IDggYml0cyAqLworICAgICAgaWYgKGlCaXRkZXB0aCA9PSAxNikKKyAgICAgICAgcERhdGEtPmZQcm9tb3Rlcm93ID0gKG1uZ19mcHRyKW1uZ19wcm9tb3RlX3JnYjhfcmdiMTY7CisgICAgaWYgKGlCaXRkZXB0aCA9PSAxNikKKyAgICAgIGlOZXdzYW1wbGVzaXplID0gNjsKKyNlbmRpZgorCisgIH0KKyAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEpQRUcgcmdiIC0+IHJnYmEgKi8KKyAgaWYgKChwQnVmLT5pQ29sb3J0eXBlID09IE1OR19DT0xPUlRZUEVfSlBFR0NPTE9SKSAmJgorICAgICAgKGlDb2xvcnR5cGUgPT0gTU5HX0NPTE9SVFlQRV9KUEVHQ09MT1JBKSkKKyAgeworICAgIGlmIChwQnVmLT5pQml0ZGVwdGggPD0gOCkgICAgICAgICAgLyogc291cmNlIDw9IDggYml0cyAqLworICAgIHsKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyAgICAgIGlmIChpQml0ZGVwdGggPT0gMTYpCisgICAgICAgIHBEYXRhLT5mUHJvbW90ZXJvdyA9IChtbmdfZnB0ciltbmdfcHJvbW90ZV9yZ2I4X3JnYmExNjsKKyAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICBwRGF0YS0+ZlByb21vdGVyb3cgPSAobW5nX2ZwdHIpbW5nX3Byb21vdGVfcmdiOF9yZ2JhODsKKyAgICB9CisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzb3VyY2UgPSAxNiBiaXRzICovCisgICAgICBwRGF0YS0+ZlByb21vdGVyb3cgPSAobW5nX2ZwdHIpbW5nX3Byb21vdGVfcmdiMTZfcmdiYTE2OworI2VuZGlmCisKKyAgICBpTmV3c2FtcGxlc2l6ZSA9IDQ7CisKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyAgICBpZiAoaUJpdGRlcHRoID09IDE2KSAgICAgICAgICAgICAgIC8qIDE2LWJpdCB3aWRlID8gKi8KKyAgICAgIGlOZXdzYW1wbGVzaXplID0gODsKKyNlbmRpZgorICB9CisgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBKUEVHIHJnYmEgLT4gcmdiYSAqLworICBpZiAoKHBCdWYtPmlDb2xvcnR5cGUgPT0gTU5HX0NPTE9SVFlQRV9KUEVHQ09MT1JBKSAmJgorICAgICAgKGlDb2xvcnR5cGUgPT0gTU5HX0NPTE9SVFlQRV9KUEVHQ09MT1JBKSkKKyAgeworICAgIGlOZXdzYW1wbGVzaXplID0gNDsKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyAgICBpZiAocEJ1Zi0+aUJpdGRlcHRoIDw9IDgpICAgICAgICAgIC8qIHNvdXJjZSA8PSA4IGJpdHMgKi8KKyAgICAgIGlmIChpQml0ZGVwdGggPT0gMTYpCisgICAgICAgIHBEYXRhLT5mUHJvbW90ZXJvdyA9IChtbmdfZnB0ciltbmdfcHJvbW90ZV9yZ2JhOF9yZ2JhMTY7CisgICAgaWYgKGlCaXRkZXB0aCA9PSAxNikKKyAgICAgIGlOZXdzYW1wbGVzaXplID0gODsKKyNlbmRpZgorICB9CisjZW5kaWYgLyogSk5HICovCisKKyAgLyogZm91bmQgYSBwcm9wZXIgcHJvbW90aW9uID8gKi8KKyAgaWYgKHBEYXRhLT5mUHJvbW90ZXJvdykKKyAgeworICAgIHBEYXRhLT5wUHJvbUJ1ZiAgICA9IChtbmdfcHRyKXBCdWY7CisgICAgcERhdGEtPmlQcm9tV2lkdGggID0gcEJ1Zi0+aVdpZHRoOworICAgIGlOZXdyb3dzaXplICAgICAgICA9IGlXICogaU5ld3NhbXBsZXNpemU7CisgICAgaU5ld2J1ZnNpemUgICAgICAgID0gaUggKiBpTmV3cm93c2l6ZTsKKworICAgIE1OR19BTExPQyAocERhdGEsIHBOZXdidWYsIGlOZXdidWZzaXplKTsKKworICAgIHBEYXRhLT5wUHJvbVNyYyAgICA9IChtbmdfcHRyKXBCdWYtPnBJbWdkYXRhOworICAgIHBEYXRhLT5wUHJvbURzdCAgICA9IChtbmdfcHRyKXBOZXdidWY7CisgICAgaVkgICAgICAgICAgICAgICAgID0gMDsKKworICAgIHdoaWxlICgoIWlSZXRjb2RlKSAmJiAoaVkgPCBpSCkpCisgICAgeworICAgICAgaVJldGNvZGUgICAgICAgICA9ICgobW5nX3Byb21vdGVyb3cpcERhdGEtPmZQcm9tb3Rlcm93KSAocERhdGEpOworICAgICAgcERhdGEtPnBQcm9tU3JjICA9IChtbmdfdWludDhwKXBEYXRhLT5wUHJvbVNyYyArIHBCdWYtPmlSb3dzaXplOworICAgICAgcERhdGEtPnBQcm9tRHN0ICA9IChtbmdfdWludDhwKXBEYXRhLT5wUHJvbURzdCArIGlOZXdyb3dzaXplOworLyogICAgICBwRGF0YS0+cFByb21TcmMgID0gKG1uZ19wdHIpKChtbmdfdWludDMyKXBEYXRhLT5wUHJvbVNyYyArIHBCdWYtPmlSb3dzaXplKTsgKi8KKy8qICAgICAgcERhdGEtPnBQcm9tRHN0ICA9IChtbmdfcHRyKSgobW5nX3VpbnQzMilwRGF0YS0+cFByb21Ec3QgKyBpTmV3cm93c2l6ZSk7ICovCisgICAgICBpWSsrOworICAgIH0KKworICAgIE1OR19GUkVFWCAocERhdGEsIHBCdWYtPnBJbWdkYXRhLCBwQnVmLT5pSW1nZGF0YXNpemUpOworCisgICAgcEJ1Zi0+aUJpdGRlcHRoICAgID0gaUJpdGRlcHRoOworICAgIHBCdWYtPmlDb2xvcnR5cGUgICA9IGlDb2xvcnR5cGU7CisgICAgcEJ1Zi0+aVNhbXBsZXNpemUgID0gaU5ld3NhbXBsZXNpemU7CisgICAgcEJ1Zi0+aVJvd3NpemUgICAgID0gaU5ld3Jvd3NpemU7CisgICAgcEJ1Zi0+aUltZ2RhdGFzaXplID0gaU5ld2J1ZnNpemU7CisgICAgcEJ1Zi0+cEltZ2RhdGEgICAgID0gcE5ld2J1ZjsKKyAgICBwQnVmLT5iSGFzUExURSAgICAgPSBNTkdfRkFMU0U7CisgICAgcEJ1Zi0+aVBMVEVjb3VudCAgID0gMDsKKyAgICBwQnVmLT5iSGFzVFJOUyAgICAgPSBNTkdfRkFMU0U7CisgICAgcEJ1Zi0+aVRSTlNjb3VudCAgID0gMDsKKworICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST01PVEVfSU1HT0JKRUNULCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfTUFHTgorbW5nX3JldGNvZGUgbW5nX21hZ25pZnlfaW1hZ2VvYmplY3QgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ltYWdlcCBwSW1hZ2UpCit7CisgIG1uZ191aW50OHAgICAgIHBOZXdkYXRhOworICBtbmdfdWludDhwICAgICBwU3JjbGluZTE7CisgIG1uZ191aW50OHAgICAgIHBTcmNsaW5lMjsKKyAgbW5nX3VpbnQ4cCAgICAgcFRlbXBsaW5lOworICBtbmdfdWludDhwICAgICBwRHN0bGluZTsKKyAgbW5nX3VpbnQzMiAgICAgaU5ld3Jvd3NpemU7CisgIG1uZ191aW50MzIgICAgIGlOZXdzaXplOworICBtbmdfdWludDMyICAgICBpWTsKKyAgbW5nX2ludDMyICAgICAgaVMsIGlNOworICBtbmdfcmV0Y29kZSAgICBpUmV0Y29kZTsKKworICBtbmdfaW1hZ2VkYXRhcCBwQnVmICAgICAgPSBwSW1hZ2UtPnBJbWdidWY7CisgIG1uZ191aW50MzIgICAgIGlOZXdXICAgICA9IHBCdWYtPmlXaWR0aDsKKyAgbW5nX3VpbnQzMiAgICAgaU5ld0ggICAgID0gcEJ1Zi0+aUhlaWdodDsKKyAgbW5nX21hZ25pZnlfeCAgZk1hZ25pZnlYID0gTU5HX05VTEw7CisgIG1uZ19tYWduaWZ5X3kgIGZNYWduaWZ5WSA9IE1OR19OVUxMOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX01BR05JRllfSU1HT0JKRUNULCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKHBCdWYtPmlDb2xvcnR5cGUgPT0gTU5HX0NPTE9SVFlQRV9JTkRFWEVEKSAgICAgICAgICAgLyogaW5kZXhlZCBjb2xvciA/ICovCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb25jcmV0ZSBidWZmZXIgPyAqLworICAgIGlmICgocEJ1Zi0+YkNvbmNyZXRlKSAmJiAocEltYWdlLT5pSWQpKQorICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURDT0xPUlRZUEUpOworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9GT09UUFJJTlRfTUFHTgorICAgIGlmIChwQnVmLT5pVFJOU2NvdW50KSAgICAgICAgICAgICAgLyogd2l0aCB0cmFuc3BhcmVuY3kgPyAqLworICAgICAgaVJldGNvZGUgPSBtbmdfcHJvbW90ZV9pbWFnZW9iamVjdCAocERhdGEsIHBJbWFnZSwgOCwgNiwgMCk7CisgICAgZWxzZQorICAgICAgaVJldGNvZGUgPSBtbmdfcHJvbW90ZV9pbWFnZW9iamVjdCAocERhdGEsIHBJbWFnZSwgOCwgMiwgMCk7CisKKyAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICByZXR1cm4gaVJldGNvZGU7CisjZW5kaWYKKyAgfQorCisjaWZkZWYgTU5HX09QVElNSVpFX0ZPT1RQUklOVF9NQUdOCisgIC8qIFByb21vdGUgZXZlcnl0aGluZyB0byBSR0JBLCB1c2luZyBmaWxsIG1ldGhvZCAwIChMQlIpICovCisgIGlSZXRjb2RlID0gbW5nX3Byb21vdGVfaW1hZ2VvYmplY3QgKHBEYXRhLCBwSW1hZ2UsIDgsIDYsIDApOyAgICAgICAgICAgCisgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICByZXR1cm4gaVJldGNvZGU7CisjZW5kaWYKKworICBpZiAocEltYWdlLT5pTUFHTl9NZXRob2RYKSAgICAgICAgICAgLyogZGV0ZXJtaW5lIG5ldyB3aWR0aCAqLworICB7CisgICAgaWYgKHBJbWFnZS0+aU1BR05fTWV0aG9kWCA9PSAxKQorICAgIHsKKyAgICAgIGlOZXdXICAgPSBwSW1hZ2UtPmlNQUdOX01MOworICAgICAgaWYgKHBCdWYtPmlXaWR0aCAgPiAxKQorICAgICAgICBpTmV3VyA9IGlOZXdXICsgcEltYWdlLT5pTUFHTl9NUjsKKyAgICAgIGlmIChwQnVmLT5pV2lkdGggID4gMikKKyAgICAgICAgaU5ld1cgPSBpTmV3VyArIChwQnVmLT5pV2lkdGggIC0gMikgKiAocEltYWdlLT5pTUFHTl9NWCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBpTmV3VyAgID0gcEJ1Zi0+aVdpZHRoICArIHBJbWFnZS0+aU1BR05fTUwgLSAxOworICAgICAgaWYgKHBCdWYtPmlXaWR0aCAgPiAyKQorICAgICAgICBpTmV3VyA9IGlOZXdXICsgcEltYWdlLT5pTUFHTl9NUiAtIDE7CisgICAgICBpZiAocEJ1Zi0+aVdpZHRoICA+IDMpCisgICAgICAgIGlOZXdXID0gaU5ld1cgKyAocEJ1Zi0+aVdpZHRoICAtIDMpICogKHBJbWFnZS0+aU1BR05fTVggLSAxKTsKKyAgICB9CisgIH0KKworICBpZiAocEltYWdlLT5pTUFHTl9NZXRob2RZKSAgICAgICAgICAgLyogZGV0ZXJtaW5lIG5ldyBoZWlnaHQgKi8KKyAgeworICAgIGlmIChwSW1hZ2UtPmlNQUdOX01ldGhvZFkgPT0gMSkKKyAgICB7CisgICAgICBpTmV3SCAgID0gcEltYWdlLT5pTUFHTl9NVDsKKyAgICAgIGlmIChwQnVmLT5pSGVpZ2h0ID4gMSkKKyAgICAgICAgaU5ld0ggPSBpTmV3SCArIHBJbWFnZS0+aU1BR05fTUw7CisgICAgICBpZiAocEJ1Zi0+aUhlaWdodCA+IDIpCisgICAgICAgIGlOZXdIID0gaU5ld0ggKyAocEJ1Zi0+aUhlaWdodCAtIDIpICogKHBJbWFnZS0+aU1BR05fTVkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaU5ld0ggICA9IHBCdWYtPmlIZWlnaHQgKyBwSW1hZ2UtPmlNQUdOX01UIC0gMTsKKyAgICAgIGlmIChwQnVmLT5pSGVpZ2h0ID4gMikKKyAgICAgICAgaU5ld0ggPSBpTmV3SCArIHBJbWFnZS0+aU1BR05fTUIgLSAxOworICAgICAgaWYgKHBCdWYtPmlIZWlnaHQgPiAzKQorICAgICAgICBpTmV3SCA9IGlOZXdIICsgKHBCdWYtPmlIZWlnaHQgLSAzKSAqIChwSW1hZ2UtPmlNQUdOX01ZIC0gMSk7CisgICAgfQorICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgbmV3IGJ1ZmZlciAqLworICBpTmV3cm93c2l6ZSAgPSBpTmV3VyAqIHBCdWYtPmlTYW1wbGVzaXplOworICBpTmV3c2l6ZSAgICAgPSBpTmV3SCAqIGlOZXdyb3dzaXplOworCisgIE1OR19BTExPQyAocERhdGEsIHBOZXdkYXRhLCBpTmV3c2l6ZSk7CisKKyAgc3dpdGNoIChwQnVmLT5pQ29sb3J0eXBlKSAgICAgICAgICAgIC8qIGRldGVybWluZSBtYWduaWZpY2F0aW9uIHJvdXRpbmVzICovCisgIHsKKyNpZm5kZWYgTU5HX09QVElNSVpFX0ZPT1RQUklOVF9NQUdOCisgICAgY2FzZSAgMCA6IDsKKyAgICBjYXNlICA4IDogeworICAgICAgICAgICAgICAgIGlmIChwQnVmLT5pQml0ZGVwdGggPD0gOCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBJbWFnZS0+aU1BR05fTWV0aG9kWCkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxICA6IHsgZk1hZ25pZnlYID0gbW5nX21hZ25pZnlfZzhfeDE7IGJyZWFrOyB9CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMiAgOiB7IGZNYWduaWZ5WCA9IG1uZ19tYWduaWZ5X2c4X3gyOyBicmVhazsgfQorICAgICAgICAgICAgICAgICAgICBjYXNlIDMgIDogeyBmTWFnbmlmeVggPSBtbmdfbWFnbmlmeV9nOF94MzsgYnJlYWs7IH0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0ICA6IHsgZk1hZ25pZnlYID0gbW5nX21hZ25pZnlfZzhfeDI7IGJyZWFrOyB9CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNSAgOiB7IGZNYWduaWZ5WCA9IG1uZ19tYWduaWZ5X2c4X3gzOyBicmVhazsgfQorICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBJbWFnZS0+aU1BR05fTWV0aG9kWSkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxICA6IHsgZk1hZ25pZnlZID0gbW5nX21hZ25pZnlfZzhfeTE7IGJyZWFrOyB9CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMiAgOiB7IGZNYWduaWZ5WSA9IG1uZ19tYWduaWZ5X2c4X3kyOyBicmVhazsgfQorICAgICAgICAgICAgICAgICAgICBjYXNlIDMgIDogeyBmTWFnbmlmeVkgPSBtbmdfbWFnbmlmeV9nOF95MzsgYnJlYWs7IH0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0ICA6IHsgZk1hZ25pZnlZID0gbW5nX21hZ25pZnlfZzhfeTI7IGJyZWFrOyB9CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNSAgOiB7IGZNYWduaWZ5WSA9IG1uZ19tYWduaWZ5X2c4X3kzOyBicmVhazsgfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgc3dpdGNoIChwSW1hZ2UtPmlNQUdOX01ldGhvZFgpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMSAgOiB7IGZNYWduaWZ5WCA9IG1uZ19tYWduaWZ5X2cxNl94MTsgYnJlYWs7IH0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyICA6IHsgZk1hZ25pZnlYID0gbW5nX21hZ25pZnlfZzE2X3gyOyBicmVhazsgfQorICAgICAgICAgICAgICAgICAgICBjYXNlIDMgIDogeyBmTWFnbmlmeVggPSBtbmdfbWFnbmlmeV9nMTZfeDM7IGJyZWFrOyB9CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNCAgOiB7IGZNYWduaWZ5WCA9IG1uZ19tYWduaWZ5X2cxNl94MjsgYnJlYWs7IH0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1ICA6IHsgZk1hZ25pZnlYID0gbW5nX21hZ25pZnlfZzE2X3gzOyBicmVhazsgfQorICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBJbWFnZS0+aU1BR05fTWV0aG9kWSkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxICA6IHsgZk1hZ25pZnlZID0gbW5nX21hZ25pZnlfZzE2X3kxOyBicmVhazsgfQorICAgICAgICAgICAgICAgICAgICBjYXNlIDIgIDogeyBmTWFnbmlmeVkgPSBtbmdfbWFnbmlmeV9nMTZfeTI7IGJyZWFrOyB9CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMyAgOiB7IGZNYWduaWZ5WSA9IG1uZ19tYWduaWZ5X2cxNl95MzsgYnJlYWs7IH0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0ICA6IHsgZk1hZ25pZnlZID0gbW5nX21hZ25pZnlfZzE2X3kyOyBicmVhazsgfQorICAgICAgICAgICAgICAgICAgICBjYXNlIDUgIDogeyBmTWFnbmlmeVkgPSBtbmdfbWFnbmlmeV9nMTZfeTM7IGJyZWFrOyB9CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgY2FzZSAgMiA6IDsKKyAgICBjYXNlIDEwIDogeworICAgICAgICAgICAgICAgIGlmIChwQnVmLT5pQml0ZGVwdGggPD0gOCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBJbWFnZS0+aU1BR05fTWV0aG9kWCkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxICA6IHsgZk1hZ25pZnlYID0gbW5nX21hZ25pZnlfcmdiOF94MTsgYnJlYWs7IH0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyICA6IHsgZk1hZ25pZnlYID0gbW5nX21hZ25pZnlfcmdiOF94MjsgYnJlYWs7IH0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzICA6IHsgZk1hZ25pZnlYID0gbW5nX21hZ25pZnlfcmdiOF94MzsgYnJlYWs7IH0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0ICA6IHsgZk1hZ25pZnlYID0gbW5nX21hZ25pZnlfcmdiOF94MjsgYnJlYWs7IH0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1ICA6IHsgZk1hZ25pZnlYID0gbW5nX21hZ25pZnlfcmdiOF94MzsgYnJlYWs7IH0KKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgc3dpdGNoIChwSW1hZ2UtPmlNQUdOX01ldGhvZFkpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMSAgOiB7IGZNYWduaWZ5WSA9IG1uZ19tYWduaWZ5X3JnYjhfeTE7IGJyZWFrOyB9CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMiAgOiB7IGZNYWduaWZ5WSA9IG1uZ19tYWduaWZ5X3JnYjhfeTI7IGJyZWFrOyB9CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMyAgOiB7IGZNYWduaWZ5WSA9IG1uZ19tYWduaWZ5X3JnYjhfeTM7IGJyZWFrOyB9CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNCAgOiB7IGZNYWduaWZ5WSA9IG1uZ19tYWduaWZ5X3JnYjhfeTI7IGJyZWFrOyB9CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNSAgOiB7IGZNYWduaWZ5WSA9IG1uZ19tYWduaWZ5X3JnYjhfeTM7IGJyZWFrOyB9CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBJbWFnZS0+aU1BR05fTWV0aG9kWCkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxICA6IHsgZk1hZ25pZnlYID0gbW5nX21hZ25pZnlfcmdiMTZfeDE7IGJyZWFrOyB9CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMiAgOiB7IGZNYWduaWZ5WCA9IG1uZ19tYWduaWZ5X3JnYjE2X3gyOyBicmVhazsgfQorICAgICAgICAgICAgICAgICAgICBjYXNlIDMgIDogeyBmTWFnbmlmeVggPSBtbmdfbWFnbmlmeV9yZ2IxNl94MzsgYnJlYWs7IH0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0ICA6IHsgZk1hZ25pZnlYID0gbW5nX21hZ25pZnlfcmdiMTZfeDI7IGJyZWFrOyB9CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNSAgOiB7IGZNYWduaWZ5WCA9IG1uZ19tYWduaWZ5X3JnYjE2X3gzOyBicmVhazsgfQorICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBJbWFnZS0+aU1BR05fTWV0aG9kWSkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxICA6IHsgZk1hZ25pZnlZID0gbW5nX21hZ25pZnlfcmdiMTZfeTE7IGJyZWFrOyB9CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMiAgOiB7IGZNYWduaWZ5WSA9IG1uZ19tYWduaWZ5X3JnYjE2X3kyOyBicmVhazsgfQorICAgICAgICAgICAgICAgICAgICBjYXNlIDMgIDogeyBmTWFnbmlmeVkgPSBtbmdfbWFnbmlmeV9yZ2IxNl95MzsgYnJlYWs7IH0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0ICA6IHsgZk1hZ25pZnlZID0gbW5nX21hZ25pZnlfcmdiMTZfeTI7IGJyZWFrOyB9CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNSAgOiB7IGZNYWduaWZ5WSA9IG1uZ19tYWduaWZ5X3JnYjE2X3kzOyBicmVhazsgfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKworICAgIGNhc2UgIDQgOiA7CisgICAgY2FzZSAxMiA6IHsKKyAgICAgICAgICAgICAgICBpZiAocEJ1Zi0+aUJpdGRlcHRoIDw9IDgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgc3dpdGNoIChwSW1hZ2UtPmlNQUdOX01ldGhvZFgpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMSAgOiB7IGZNYWduaWZ5WCA9IG1uZ19tYWduaWZ5X2dhOF94MTsgYnJlYWs7IH0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyICA6IHsgZk1hZ25pZnlYID0gbW5nX21hZ25pZnlfZ2E4X3gyOyBicmVhazsgfQorICAgICAgICAgICAgICAgICAgICBjYXNlIDMgIDogeyBmTWFnbmlmeVggPSBtbmdfbWFnbmlmeV9nYThfeDM7IGJyZWFrOyB9CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNCAgOiB7IGZNYWduaWZ5WCA9IG1uZ19tYWduaWZ5X2dhOF94NDsgYnJlYWs7IH0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1ICA6IHsgZk1hZ25pZnlYID0gbW5nX21hZ25pZnlfZ2E4X3g1OyBicmVhazsgfQorICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBJbWFnZS0+aU1BR05fTWV0aG9kWSkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxICA6IHsgZk1hZ25pZnlZID0gbW5nX21hZ25pZnlfZ2E4X3kxOyBicmVhazsgfQorICAgICAgICAgICAgICAgICAgICBjYXNlIDIgIDogeyBmTWFnbmlmeVkgPSBtbmdfbWFnbmlmeV9nYThfeTI7IGJyZWFrOyB9CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMyAgOiB7IGZNYWduaWZ5WSA9IG1uZ19tYWduaWZ5X2dhOF95MzsgYnJlYWs7IH0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0ICA6IHsgZk1hZ25pZnlZID0gbW5nX21hZ25pZnlfZ2E4X3k0OyBicmVhazsgfQorICAgICAgICAgICAgICAgICAgICBjYXNlIDUgIDogeyBmTWFnbmlmeVkgPSBtbmdfbWFnbmlmeV9nYThfeTU7IGJyZWFrOyB9CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBJbWFnZS0+aU1BR05fTWV0aG9kWCkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxICA6IHsgZk1hZ25pZnlYID0gbW5nX21hZ25pZnlfZ2ExNl94MTsgYnJlYWs7IH0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyICA6IHsgZk1hZ25pZnlYID0gbW5nX21hZ25pZnlfZ2ExNl94MjsgYnJlYWs7IH0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzICA6IHsgZk1hZ25pZnlYID0gbW5nX21hZ25pZnlfZ2ExNl94MzsgYnJlYWs7IH0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0ICA6IHsgZk1hZ25pZnlYID0gbW5nX21hZ25pZnlfZ2ExNl94NDsgYnJlYWs7IH0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1ICA6IHsgZk1hZ25pZnlYID0gbW5nX21hZ25pZnlfZ2ExNl94NTsgYnJlYWs7IH0KKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgc3dpdGNoIChwSW1hZ2UtPmlNQUdOX01ldGhvZFkpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMSAgOiB7IGZNYWduaWZ5WSA9IG1uZ19tYWduaWZ5X2dhMTZfeTE7IGJyZWFrOyB9CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMiAgOiB7IGZNYWduaWZ5WSA9IG1uZ19tYWduaWZ5X2dhMTZfeTI7IGJyZWFrOyB9CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMyAgOiB7IGZNYWduaWZ5WSA9IG1uZ19tYWduaWZ5X2dhMTZfeTM7IGJyZWFrOyB9CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNCAgOiB7IGZNYWduaWZ5WSA9IG1uZ19tYWduaWZ5X2dhMTZfeTQ7IGJyZWFrOyB9CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNSAgOiB7IGZNYWduaWZ5WSA9IG1uZ19tYWduaWZ5X2dhMTZfeTU7IGJyZWFrOyB9CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICBjYXNlICA2IDogOworICAgIGNhc2UgMTQgOiB7CisgICAgICAgICAgICAgICAgaWYgKHBCdWYtPmlCaXRkZXB0aCA8PSA4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHN3aXRjaCAocEltYWdlLT5pTUFHTl9NZXRob2RYKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDEgIDogeyBmTWFnbmlmeVggPSBtbmdfbWFnbmlmeV9yZ2JhOF94MTsgYnJlYWs7IH0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyICA6IHsgZk1hZ25pZnlYID0gbW5nX21hZ25pZnlfcmdiYThfeDI7IGJyZWFrOyB9CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMyAgOiB7IGZNYWduaWZ5WCA9IG1uZ19tYWduaWZ5X3JnYmE4X3gzOyBicmVhazsgfQorICAgICAgICAgICAgICAgICAgICBjYXNlIDQgIDogeyBmTWFnbmlmeVggPSBtbmdfbWFnbmlmeV9yZ2JhOF94NDsgYnJlYWs7IH0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1ICA6IHsgZk1hZ25pZnlYID0gbW5nX21hZ25pZnlfcmdiYThfeDU7IGJyZWFrOyB9CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIHN3aXRjaCAocEltYWdlLT5pTUFHTl9NZXRob2RZKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDEgIDogeyBmTWFnbmlmeVkgPSBtbmdfbWFnbmlmeV9yZ2JhOF95MTsgYnJlYWs7IH0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyICA6IHsgZk1hZ25pZnlZID0gbW5nX21hZ25pZnlfcmdiYThfeTI7IGJyZWFrOyB9CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMyAgOiB7IGZNYWduaWZ5WSA9IG1uZ19tYWduaWZ5X3JnYmE4X3kzOyBicmVhazsgfQorICAgICAgICAgICAgICAgICAgICBjYXNlIDQgIDogeyBmTWFnbmlmeVkgPSBtbmdfbWFnbmlmeV9yZ2JhOF95NDsgYnJlYWs7IH0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1ICA6IHsgZk1hZ25pZnlZID0gbW5nX21hZ25pZnlfcmdiYThfeTU7IGJyZWFrOyB9CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorI2lmbmRlZiBNTkdfT1BUSU1JWkVfRk9PVFBSSU5UX01BR04KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgc3dpdGNoIChwSW1hZ2UtPmlNQUdOX01ldGhvZFgpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMSAgOiB7IGZNYWduaWZ5WCA9IG1uZ19tYWduaWZ5X3JnYmExNl94MTsgYnJlYWs7IH0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyICA6IHsgZk1hZ25pZnlYID0gbW5nX21hZ25pZnlfcmdiYTE2X3gyOyBicmVhazsgfQorICAgICAgICAgICAgICAgICAgICBjYXNlIDMgIDogeyBmTWFnbmlmeVggPSBtbmdfbWFnbmlmeV9yZ2JhMTZfeDM7IGJyZWFrOyB9CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNCAgOiB7IGZNYWduaWZ5WCA9IG1uZ19tYWduaWZ5X3JnYmExNl94NDsgYnJlYWs7IH0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1ICA6IHsgZk1hZ25pZnlYID0gbW5nX21hZ25pZnlfcmdiYTE2X3g1OyBicmVhazsgfQorICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBJbWFnZS0+aU1BR05fTWV0aG9kWSkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxICA6IHsgZk1hZ25pZnlZID0gbW5nX21hZ25pZnlfcmdiYTE2X3kxOyBicmVhazsgfQorICAgICAgICAgICAgICAgICAgICBjYXNlIDIgIDogeyBmTWFnbmlmeVkgPSBtbmdfbWFnbmlmeV9yZ2JhMTZfeTI7IGJyZWFrOyB9CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMyAgOiB7IGZNYWduaWZ5WSA9IG1uZ19tYWduaWZ5X3JnYmExNl95MzsgYnJlYWs7IH0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0ICA6IHsgZk1hZ25pZnlZID0gbW5nX21hZ25pZnlfcmdiYTE2X3k0OyBicmVhazsgfQorICAgICAgICAgICAgICAgICAgICBjYXNlIDUgIDogeyBmTWFnbmlmeVkgPSBtbmdfbWFnbmlmeV9yZ2JhMTZfeTU7IGJyZWFrOyB9CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisjZW5kaWYKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICB9CisKKyAgcFNyY2xpbmUxID0gcEJ1Zi0+cEltZ2RhdGE7ICAgICAgICAgIC8qIGluaXRpYWxpemUgcm93LWxvb3AgdmFyaWFibGVzICovCisgIHBEc3RsaW5lICA9IHBOZXdkYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWxsb2NhdGUgdGVtcG9yYXJ5IHJvdyAqLworICBNTkdfQUxMT0MgKHBEYXRhLCBwVGVtcGxpbmUsIGlOZXdyb3dzaXplKTsKKworICBmb3IgKGlZID0gMDsgaVkgPCBwQnVmLT5pSGVpZ2h0OyBpWSsrKQorICB7CisgICAgcFNyY2xpbmUyID0gcFNyY2xpbmUxICsgcEJ1Zi0+aVJvd3NpemU7CisKKyAgICBpZiAoZk1hZ25pZnlYKSAgICAgICAgICAgICAgICAgICAgIC8qIG1hZ25pZnlpbmcgaW4gWC1kaXJlY3Rpb24gPyAqLworICAgIHsKKyAgICAgIGlSZXRjb2RlID0gZk1hZ25pZnlYIChwRGF0YSwgcEltYWdlLT5pTUFHTl9NWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2UtPmlNQUdOX01MLCBwSW1hZ2UtPmlNQUdOX01SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCdWYtPmlXaWR0aCwgcFNyY2xpbmUxLCBwRHN0bGluZSk7CisKKyAgICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICB7CisgICAgICAgIE1OR19GUkVFWCAocERhdGEsIHBUZW1wbGluZSwgaU5ld3Jvd3NpemUpOworICAgICAgICBNTkdfRlJFRVggKHBEYXRhLCBwTmV3ZGF0YSwgIGlOZXdzaXplKTsKKyAgICAgICAgcmV0dXJuIGlSZXRjb2RlOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgTU5HX0NPUFkgKHBEc3RsaW5lLCBwU3JjbGluZTEsIGlOZXdyb3dzaXplKTsKKyAgICB9CisKKyAgICBwRHN0bGluZSArPSBpTmV3cm93c2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1hZ25pZnlpbmcgaW4gWS1kaXJlY3Rpb24gPyAqLworICAgIGlmICgoZk1hZ25pZnlZKSAmJgorICAgICAgICAoKGlZIDwgcEJ1Zi0+aUhlaWdodCAtIDEpIHx8IChwQnVmLT5pSGVpZ2h0ID09IDEpIHx8IChwSW1hZ2UtPmlNQUdOX01ldGhvZFkgPT0gMSkpKQorICAgIHsKKyAgICAgIGlmIChpWSA9PSAwKSAgICAgICAgICAgICAgICAgICAgIC8qIGZpcnN0IGludGVydmFsID8gKi8KKyAgICAgIHsKKyAgICAgICAgaWYgKHBCdWYtPmlIZWlnaHQgPT0gMSkgICAgICAgIC8qIHNpbmdsZSByb3cgPyAqLworICAgICAgICAgIHBTcmNsaW5lMiA9IE1OR19OVUxMOworCisgICAgICAgIGlNID0gKG1uZ19pbnQzMilwSW1hZ2UtPmlNQUdOX01UOworICAgICAgfQorICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGFzdCBpbnRlcnZhbCA/ICovCisgICAgICBpZiAoKChwSW1hZ2UtPmlNQUdOX01ldGhvZFkgPT0gMSkgJiYgKGlZID09IChwQnVmLT5pSGVpZ2h0IC0gMSkpKSB8fAorICAgICAgICAgICgocEltYWdlLT5pTUFHTl9NZXRob2RZICE9IDEpICYmIChpWSA9PSAocEJ1Zi0+aUhlaWdodCAtIDIpKSkgICAgKQorICAgICAgICBpTSA9IChtbmdfaW50MzIpcEltYWdlLT5pTUFHTl9NQjsKKyAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1pZGRsZSBpbnRlcnZhbCAqLworICAgICAgICBpTSA9IChtbmdfaW50MzIpcEltYWdlLT5pTUFHTl9NWTsKKworICAgICAgZm9yIChpUyA9IDE7IGlTIDwgaU07IGlTKyspCisgICAgICB7CisgICAgICAgIGlSZXRjb2RlID0gZk1hZ25pZnlZIChwRGF0YSwgaVMsIGlNLCBwQnVmLT5pV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjbGluZTEsIHBTcmNsaW5lMiwgcFRlbXBsaW5lKTsKKworICAgICAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgICAgeworICAgICAgICAgIE1OR19GUkVFWCAocERhdGEsIHBUZW1wbGluZSwgaU5ld3Jvd3NpemUpOworICAgICAgICAgIE1OR19GUkVFWCAocERhdGEsIHBOZXdkYXRhLCAgaU5ld3NpemUpOworICAgICAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmTWFnbmlmeVgpICAgICAgICAgICAgICAgICAgIC8qIG1hZ25pZnlpbmcgaW4gWC1kaXJlY3Rpb24gPyAqLworICAgICAgICB7CisgICAgICAgICAgaVJldGNvZGUgPSBmTWFnbmlmeVggKHBEYXRhLCBwSW1hZ2UtPmlNQUdOX01YLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2UtPmlNQUdOX01MLCBwSW1hZ2UtPmlNQUdOX01SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnVmLT5pV2lkdGgsIHBUZW1wbGluZSwgcERzdGxpbmUpOworCisgICAgICAgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICAgICAgeworICAgICAgICAgICAgTU5HX0ZSRUVYIChwRGF0YSwgcFRlbXBsaW5lLCBpTmV3cm93c2l6ZSk7CisgICAgICAgICAgICBNTkdfRlJFRVggKHBEYXRhLCBwTmV3ZGF0YSwgIGlOZXdzaXplKTsKKyAgICAgICAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgTU5HX0NPUFkgKHBEc3RsaW5lLCBwVGVtcGxpbmUsIGlOZXdyb3dzaXplKTsKKyAgICAgICAgfQorCisgICAgICAgIHBEc3RsaW5lICArPSBpTmV3cm93c2l6ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwU3JjbGluZTEgKz0gcEJ1Zi0+aVJvd3NpemU7CisgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRyb3AgdGVtcG9yYXJ5IHJvdyAqLworICBNTkdfRlJFRVggKHBEYXRhLCBwVGVtcGxpbmUsIGlOZXdyb3dzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRyb3Agb2xkIHBpeGVsLWRhdGEgKi8KKyAgTU5HX0ZSRUVYIChwRGF0YSwgcEJ1Zi0+cEltZ2RhdGEsIHBCdWYtPmlJbWdkYXRhc2l6ZSk7CisKKyAgcEJ1Zi0+cEltZ2RhdGEgICAgID0gcE5ld2RhdGE7ICAgICAgIC8qIHNhdmUgbmV3IGJ1ZmZlciBkaW1lbnNpb25zICovCisgIHBCdWYtPmlSb3dzaXplICAgICA9IGlOZXdyb3dzaXplOworICBwQnVmLT5pSW1nZGF0YXNpemUgPSBpTmV3c2l6ZTsKKyAgcEJ1Zi0+aVdpZHRoICAgICAgID0gaU5ld1c7CisgIHBCdWYtPmlIZWlnaHQgICAgICA9IGlOZXdIOworCisgIGlmIChwSW1hZ2UtPmlJZCkgICAgICAgICAgICAgICAgICAgICAvKiByZWFsIG9iamVjdCA/ICovCisgIHsKKyAgICBwSW1hZ2UtPmlNQUdOX01ldGhvZFggPSAwOyAgICAgICAgIC8qIGl0J3MgZG9uZTsgZG9uJ3QgZG8gaXQgYWdhaW4gISEhICovCisgICAgcEltYWdlLT5pTUFHTl9NZXRob2RZID0gMDsKKyAgICBwSW1hZ2UtPmlNQUdOX01YICAgICAgPSAwOworICAgIHBJbWFnZS0+aU1BR05fTVkgICAgICA9IDA7CisgICAgcEltYWdlLT5pTUFHTl9NTCAgICAgID0gMDsKKyAgICBwSW1hZ2UtPmlNQUdOX01SICAgICAgPSAwOworICAgIHBJbWFnZS0+aU1BR05fTVQgICAgICA9IDA7CisgICAgcEltYWdlLT5pTUFHTl9NQiAgICAgID0gMDsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX01BR05JRllfSU1HT0JKRUNULCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfY29sb3Jjb3JyZWN0X29iamVjdCAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW1hZ2VwIHBJbWFnZSkKK3sKKyAgbW5nX2ltYWdlZGF0YXAgcEJ1ZiA9IHBJbWFnZS0+cEltZ2J1ZjsKKyAgbW5nX3JldGNvZGUgICAgaVJldGNvZGU7CisgIG1uZ191aW50MzIgICAgIGlZOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0NPTE9SQ09SUkVDVF9PQkpFQ1QsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworI2lmZGVmIE1OR19JTkNMVURFX0pORworICBpZiAoKHBCdWYtPmlCaXRkZXB0aCA8IDgpIHx8ICAgICAgICAgLyogd2UgbmVlZCA4LSBvciAxNi1iaXQgUkdCQSAhISEgKi8KKyAgICAgICgocEJ1Zi0+aUNvbG9ydHlwZSAhPSBNTkdfQ09MT1JUWVBFX1JHQkEgICAgICApICYmCisgICAgICAgKHBCdWYtPmlDb2xvcnR5cGUgIT0gTU5HX0NPTE9SVFlQRV9KUEVHQ09MT1JBKSAgICApKQorI2Vsc2UKKyAgaWYgKHBCdWYtPmlCaXRkZXB0aCA8IDgpICAgICAgICAgLyogd2UgbmVlZCA4LSBvciAxNi1iaXQgUkdCQSAhISEgKi8KKyNlbmRpZgorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19PQkpOT1RBQlNUUkFDVCk7CisKKyAgaWYgKCFwQnVmLT5iQ29ycmVjdGVkKSAgICAgICAgICAgICAgIC8qIG9ubHkgaWYgbm90IGFscmVhZHkgZG9uZSAhICovCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzbyB0aGUgcm93IHJvdXRpbmVzIG5vdyB0byBmaW5kIGl0ICovCisgICAgcERhdGEtPnBSZXRyaWV2ZW9iaiAgID0gKG1uZ19vYmplY3RwKXBJbWFnZTsKKyAgICBwRGF0YS0+cFN0b3Jlb2JqICAgICAgPSAobW5nX29iamVjdHApcEltYWdlOworICAgIHBEYXRhLT5wU3RvcmVidWYgICAgICA9IChtbmdfb2JqZWN0cClwSW1hZ2UtPnBJbWdidWY7CisKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyAgICBpZiAocEJ1Zi0+aUJpdGRlcHRoID4gOCkKKyAgICB7CisgICAgICBwRGF0YS0+ZlJldHJpZXZlcm93ID0gKG1uZ19mcHRyKW1uZ19yZXRyaWV2ZV9yZ2JhMTY7CisgICAgICBwRGF0YS0+ZlN0b3Jlcm93ICAgID0gKG1uZ19mcHRyKW1uZ19zdG9yZV9yZ2JhMTY7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgIHsKKyAgICAgIHBEYXRhLT5mUmV0cmlldmVyb3cgPSAobW5nX2ZwdHIpbW5nX3JldHJpZXZlX3JnYmE4OworICAgICAgcERhdGEtPmZTdG9yZXJvdyAgICA9IChtbmdfZnB0ciltbmdfc3RvcmVfcmdiYTg7CisgICAgfQorCisgICAgcERhdGEtPmJJc09wYXF1ZSAgICAgID0gTU5HX0ZBTFNFOworCisgICAgcERhdGEtPmlQYXNzICAgICAgICAgID0gLTE7ICAgICAgICAvKiB0aGVzZSBhcmUgdGhlIG9iamVjdCdzIGRpbWVuc2lvbnMgbm93ICovCisgICAgcERhdGEtPmlSb3cgICAgICAgICAgID0gMDsKKyAgICBwRGF0YS0+aVJvd2luYyAgICAgICAgPSAxOworICAgIHBEYXRhLT5pQ29sICAgICAgICAgICA9IDA7CisgICAgcERhdGEtPmlDb2xpbmMgICAgICAgID0gMTsKKyAgICBwRGF0YS0+aVJvd3NhbXBsZXMgICAgPSBwQnVmLT5pV2lkdGg7CisgICAgcERhdGEtPmlSb3dzaXplICAgICAgID0gcERhdGEtPmlSb3dzYW1wbGVzIDw8IDI7CisgICAgcERhdGEtPmlQaXhlbG9mcyAgICAgID0gMDsKKyAgICBwRGF0YS0+YklzUkdCQTE2ICAgICAgPSBNTkdfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGp1c3QgZm9yIDE2LWJpdCBvYmplY3QgPyAqLworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgIGlmIChwQnVmLT5pQml0ZGVwdGggPiA4KQorICAgIHsKKyAgICAgIHBEYXRhLT5iSXNSR0JBMTYgICAgPSBNTkdfVFJVRTsKKyAgICAgIHBEYXRhLT5pUm93c2l6ZSAgICAgPSBwRGF0YS0+aVJvd3NhbXBsZXMgPDwgMzsKKyAgICB9CisjZW5kaWYKKworICAgIHBEYXRhLT5mQ29ycmVjdHJvdyAgICA9IE1OR19OVUxMOyAgLyogZGVmYXVsdCBubyBjb2xvci1jb3JyZWN0aW9uICovCisKKyNpZmRlZiBNTkdfTk9fQ01TCisgICAgaVJldGNvZGUgPSBNTkdfTk9FUlJPUjsKKyNlbHNlCisjaWYgZGVmaW5lZChNTkdfRlVMTF9DTVMpICAgICAgICAgICAgICAvKiBkZXRlcm1pbmUgY29sb3ItbWFuYWdlbWVudCByb3V0aW5lICovCisgICAgaVJldGNvZGUgPSBtbmdfaW5pdF9mdWxsX2NtcyAgIChwRGF0YSwgTU5HX0ZBTFNFLCBNTkdfRkFMU0UsIE1OR19UUlVFKTsKKyNlbGlmIGRlZmluZWQoTU5HX0dBTU1BX09OTFkpCisgICAgaVJldGNvZGUgPSBtbmdfaW5pdF9nYW1tYV9vbmx5IChwRGF0YSwgTU5HX0ZBTFNFLCBNTkdfRkFMU0UsIE1OR19UUlVFKTsKKyNlbGlmIGRlZmluZWQoTU5HX0FQUF9DTVMpCisgICAgaVJldGNvZGUgPSBtbmdfaW5pdF9hcHBfY21zICAgIChwRGF0YSwgTU5HX0ZBTFNFLCBNTkdfRkFMU0UsIE1OR19UUlVFKTsKKyNlbmRpZgorICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKyNlbmRpZiAvKiBNTkdfTk9fQ01TICovCisKKyAgICBpZiAocERhdGEtPmZDb3JyZWN0cm93KSAgICAgICAgICAgIC8qIHJlYWxseSBjb3JyZWN0IHNvbWV0aGluZyA/ICovCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgYSB0ZW1wb3Jhcnkgcm93LWJ1ZmZlciAqLworICAgICAgTU5HX0FMTE9DIChwRGF0YSwgcERhdGEtPnBSR0JBcm93LCBwRGF0YS0+aVJvd3NpemUpOworCisgICAgICBwRGF0YS0+cFdvcmtyb3cgPSBwRGF0YS0+cFJHQkFyb3c7CisgICAgICBpWSAgICAgICAgICAgICAgPSAwOyAgICAgICAgICAgICAvKiBzdGFydCBmcm9tIHRoZSB0b3AgKi8KKworICAgICAgd2hpbGUgKCghaVJldGNvZGUpICYmIChpWSA8IHBCdWYtPmlIZWlnaHQpKQorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0IGEgcm93ICovCisgICAgICAgIGlSZXRjb2RlID0gKChtbmdfcmV0cmlldmVyb3cpcERhdGEtPmZSZXRyaWV2ZXJvdykgKHBEYXRhKTsKKworICAgICAgICBpZiAoIWlSZXRjb2RlKSAgICAgICAgICAgICAgICAgLyogY29sb3IgY29ycmVjdCBpdCAqLworICAgICAgICAgIGlSZXRjb2RlID0gKChtbmdfY29ycmVjdHJvdylwRGF0YS0+ZkNvcnJlY3Ryb3cpIChwRGF0YSk7CisKKyAgICAgICAgaWYgKCFpUmV0Y29kZSkgICAgICAgICAgICAgICAgIC8qIHN0b3JlIGl0IGJhY2sgISAqLworICAgICAgICAgIGlSZXRjb2RlID0gKChtbmdfc3RvcmVyb3cpcERhdGEtPmZTdG9yZXJvdykgKHBEYXRhKTsKKworICAgICAgICBpZiAoIWlSZXRjb2RlKSAgICAgICAgICAgICAgICAgLyogYWRqdXN0IHZhcmlhYmxlcyBmb3IgbmV4dCByb3cgKi8KKyAgICAgICAgICBpUmV0Y29kZSA9IG1uZ19uZXh0X3JvdyAocERhdGEpOworCisgICAgICAgIGlZKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgbmV4dCBsaW5lICovCisgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkcm9wIHRoZSB0ZW1wb3Jhcnkgcm93LWJ1ZmZlciAqLworICAgICAgTU5HX0ZSRUVYIChwRGF0YSwgcERhdGEtPnBSR0JBcm93LCBwRGF0YS0+aVJvd3NpemUpOworCisgICAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgICByZXR1cm4gaVJldGNvZGU7CisKKyNpZiBkZWZpbmVkKE1OR19GVUxMX0NNUykgICAgICAgICAgICAgIC8qIGNsZWFudXAgY21zIHN0dWZmICovCisgICAgICBpUmV0Y29kZSA9IG1uZ19jbGVhcl9jbXMgKHBEYXRhKTsKKworICAgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgICAgcmV0dXJuIGlSZXRjb2RlOworI2VuZGlmCisgICAgfQorCisgICAgcEJ1Zi0+YkNvcnJlY3RlZCA9IE1OR19UUlVFOyAgICAgICAvKiBsZXQncyBub3QgZ28gdGhyb3VnaCB0aGF0IGFnYWluICEgKi8KKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0NPTE9SQ09SUkVDVF9PQkpFQ1QsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogQW5pbWF0aW9uLW9iamVjdCByb3V0aW5lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiB0aGVzZSBoYW5kbGUgdGhlIGFuaW1hdGlvbiBvYmplY3RzIHVzZWQgdG8gcmUtcnVuIHBhcnRzIG9mIGEgTU5HLiAgICAgICogKi8KKy8qICogZWcuIGR1cmluZyBMT09QIG9yIFRFUk0gcHJvY2Vzc2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKwordm9pZCBtbmdfYWRkX2FuaV9vYmplY3QgKG1uZ19kYXRhcCAgICAgICAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfb2JqZWN0X2hlYWRlcnAgcE9iamVjdCkKK3sKKyAgbW5nX29iamVjdF9oZWFkZXJwIHBMYXN0ID0gKG1uZ19vYmplY3RfaGVhZGVycClwRGF0YS0+cExhc3RhbmlvYmo7CisKKyAgaWYgKHBMYXN0KSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxpbmsgaXQgYXMgbGFzdCBpbiB0aGUgY2hhaW4gKi8KKyAgeworICAgIHBPYmplY3QtPnBQcmV2ICAgICAgPSBwTGFzdDsKKyAgICBwTGFzdC0+cE5leHQgICAgICAgID0gcE9iamVjdDsKKyAgfQorICBlbHNlCisgIHsKKyAgICBwT2JqZWN0LT5wUHJldiAgICAgID0gTU5HX05VTEw7ICAgIC8qIGJlIG9uIHRoZSBzYWZlIHNpZGUgKi8KKyAgICBwRGF0YS0+cEZpcnN0YW5pb2JqID0gcE9iamVjdDsKKyAgfQorCisgIHBPYmplY3QtPnBOZXh0ICAgICAgICA9IE1OR19OVUxMOyAgICAvKiBiZSBvbiB0aGUgc2FmZSBzaWRlICovCisgIHBEYXRhLT5wTGFzdGFuaW9iaiAgICA9IHBPYmplY3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBrZWVwIHRyYWNrIGZvciBqdW1waW5nICovCisgIHBPYmplY3QtPmlGcmFtZW5yICAgICA9IHBEYXRhLT5pRnJhbWVzZXE7CisgIHBPYmplY3QtPmlMYXllcm5yICAgICA9IHBEYXRhLT5pTGF5ZXJzZXE7CisgIHBPYmplY3QtPmlQbGF5dGltZSAgICA9IHBEYXRhLT5pRnJhbWV0aW1lOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2F2ZSByZXN0YXJ0IG9iamVjdCA/ICovCisgIGlmICgocERhdGEtPmJEaXNwbGF5aW5nKSAmJiAoIXBEYXRhLT5iUnVubmluZykgJiYgKCFwRGF0YS0+cEN1cnJhbmlvYmopKQorICAgIHBEYXRhLT5wQ3VycmFuaW9iaiAgPSBwT2JqZWN0OworCisgIHJldHVybjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19jcmVhdGVfYW5pX2ltYWdlIChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ19hbmlfaW1hZ2VwIHBJbWFnZTsKKyAgbW5nX2ltYWdlcCAgICAgcEN1cnJlbnQ7CisgIG1uZ19yZXRjb2RlICAgIGlSZXRjb2RlOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0NSRUFURV9BTklfSU1BR0UsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAocERhdGEtPmJDYWNoZXBsYXliYWNrKSAgICAgICAgICAgLyogY2FjaGluZyBwbGF5YmFjayBpbmZvID8gKi8KKyAgeworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisgICAgaWYgKHBEYXRhLT5iSGFzREhEUikgICAgICAgICAgICAgICAvKiBwcm9jZXNzaW5nIGRlbHRhLWltYWdlID8gKi8KKyAgICAgIHBDdXJyZW50ID0gKG1uZ19pbWFnZXApcERhdGEtPnBPYmp6ZXJvOworICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0IHRoZSBjdXJyZW50IG9iamVjdCAqLworI2VuZGlmCisgICAgICBwQ3VycmVudCA9IChtbmdfaW1hZ2VwKXBEYXRhLT5wQ3VycmVudG9iajsKKworICAgIGlmICghcEN1cnJlbnQpICAgICAgICAgICAgICAgICAgICAgLyogb3RoZXJ3aXNlIG9iamVjdCAwICovCisgICAgICBwQ3VycmVudCA9IChtbmdfaW1hZ2VwKXBEYXRhLT5wT2JqemVybzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdyBqdXN0IGNsb25lIHRoZSBvYmplY3QgISEhICovCisgICAgaVJldGNvZGUgID0gbW5nX2Nsb25lX2ltYWdlb2JqZWN0IChwRGF0YSwgMCwgTU5HX0ZBTFNFLCBwQ3VycmVudC0+YlZpc2libGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTkdfRkFMU0UsIE1OR19GQUxTRSwgMCwgMCwgMCwgcEN1cnJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEltYWdlKTsKKworICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKworICAgIHBJbWFnZS0+c0hlYWRlci5mQ2xlYW51cCA9IG1uZ19mcmVlX2FuaV9pbWFnZTsKKyAgICBwSW1hZ2UtPnNIZWFkZXIuZlByb2Nlc3MgPSBtbmdfcHJvY2Vzc19hbmlfaW1hZ2U7CisKKyAgICBtbmdfYWRkX2FuaV9vYmplY3QgKHBEYXRhLCAobW5nX29iamVjdF9oZWFkZXJwKXBJbWFnZSk7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9DUkVBVEVfQU5JX0lNQUdFLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsgICAgICAgICAgICAgICAgICAvKiBva2lkbyAqLworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfZnJlZV9hbmlfaW1hZ2UgKG1uZ19kYXRhcCAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfb2JqZWN0cCBwT2JqZWN0KQoreworICBtbmdfYW5pX2ltYWdlcCBwSW1hZ2UgPSAobW5nX2FuaV9pbWFnZXApcE9iamVjdDsKKyAgbW5nX2ltYWdlZGF0YXAgcEltZ2J1ZiA9IHBJbWFnZS0+cEltZ2J1ZjsKKyAgbW5nX3JldGNvZGUgICAgaVJldGNvZGU7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9BTklfSU1BR0UsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVubGluayB0aGUgaW1hZ2UtZGF0YSBidWZmZXIgKi8KKyAgaVJldGNvZGUgPSBtbmdfZnJlZV9pbWFnZWRhdGFvYmplY3QgKHBEYXRhLCBwSW1nYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRyb3AgaXRzIG93biBidWZmZXIgKi8KKyAgTU5HX0ZSRUVYIChwRGF0YSwgcEltYWdlLCBzaXplb2YgKG1uZ19hbmlfaW1hZ2UpKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX0FOSV9JTUFHRSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gaVJldGNvZGU7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19wcm9jZXNzX2FuaV9pbWFnZSAobW5nX2RhdGFwICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19vYmplY3RwIHBPYmplY3QpCit7CisgIG1uZ19yZXRjb2RlICAgIGlSZXRjb2RlID0gTU5HX05PRVJST1I7CisgIG1uZ19hbmlfaW1hZ2VwIHBJbWFnZSAgID0gKG1uZ19pbWFnZXApcE9iamVjdDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9DRVNTX0FOSV9JTUFHRSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKKyAgaWYgKHBEYXRhLT5iSGFzREhEUikgICAgICAgICAgICAgICAgIC8qIHByb2Nlc3NpbmcgZGVsdGEtaW1hZ2UgPyAqLworICB7CisgICAgbW5nX2ltYWdlcCBwRGVsdGEgPSAobW5nX2ltYWdlcClwRGF0YS0+cERlbHRhSW1hZ2U7CisKKyAgICBpZiAoIXBEYXRhLT5pQnJlYWtwb2ludCkgICAgICAgICAgIC8qIG9ubHkgZXhlY3V0ZSBpZiBub3QgYnJva2VuIGJlZm9yZSAqLworICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWFrZSBzdXJlIHRvIHByb2Nlc3MgcGl4ZWxzIGFzIHdlbGwgKi8KKyAgICAgIHBEYXRhLT5iRGVsdGFpbW1lZGlhdGUgPSBNTkdfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBleGVjdXRlIHRoZSBkZWx0YSBwcm9jZXNzICovCisgICAgICBpUmV0Y29kZSA9IG1uZ19leGVjdXRlX2RlbHRhX2ltYWdlIChwRGF0YSwgcERlbHRhLCAobW5nX2ltYWdlcClwT2JqZWN0KTsKKworICAgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgICAgcmV0dXJuIGlSZXRjb2RlOworICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdyBnbyBhbmQgc2hvb3QgaXQgb2ZmIChpZiByZXF1aXJlZCkgKi8KKyAgICBpZiAoKHBEZWx0YS0+YlZpc2libGUpICYmIChwRGVsdGEtPmJWaWV3YWJsZSkpCisgICAgICBpUmV0Y29kZSA9IG1uZ19kaXNwbGF5X2ltYWdlIChwRGF0YSwgcERlbHRhLCBNTkdfRkFMU0UpOworCisgICAgaWYgKCFwRGF0YS0+YlRpbWVyc2V0KQorICAgICAgcERhdGEtPmJIYXNESERSID0gTU5HX0ZBTFNFOyAgICAgLyogdGhpcyBpbWFnZSBzaWduaWZpZXMgSUVORCAhISAqLworCisgIH0KKyAgZWxzZQorI2VuZGlmCisgIGlmIChwRGF0YS0+cEN1cnJlbnRvYmopICAgICAgICAgICAgICAvKiBhY3RpdmUgb2JqZWN0ID8gKi8KKyAgeworICAgIG1uZ19pbWFnZXAgICAgIHBDdXJyZW50ID0gKG1uZ19pbWFnZXApcERhdGEtPnBDdXJyZW50b2JqOworICAgIG1uZ19pbWFnZWRhdGFwIHBCdWYgICAgID0gcEN1cnJlbnQtPnBJbWdidWY7CisKKyAgICBpZiAoIXBEYXRhLT5pQnJlYWtwb2ludCkgICAgICAgICAgIC8qIGRvbid0IGNvcHkgaXQgYWdhaW4gISAqLworICAgIHsKKyAgICAgIGlmIChwQnVmLT5pSW1nZGF0YXNpemUpICAgICAgICAgIC8qIGJ1ZmZlciBwcmVzZW50IGluIGFjdGl2ZSBvYmplY3QgPyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlbiBkcm9wIGl0ICovCisgICAgICAgIE1OR19GUkVFIChwRGF0YSwgcEJ1Zi0+cEltZ2RhdGEsIHBCdWYtPmlJbWdkYXRhc2l6ZSk7CisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19pQ0NQCisgICAgICBpZiAocEJ1Zi0+aVByb2ZpbGVzaXplKSAgICAgICAgICAvKiBpQ0NQIHByb2ZpbGUgcHJlc2VudCA/ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGVuIGRyb3AgaXQgKi8KKyAgICAgICAgTU5HX0ZSRUUgKHBEYXRhLCBwQnVmLT5wUHJvZmlsZSwgcEJ1Zi0+aVByb2ZpbGVzaXplKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm93IGJsYXRlbnRseSBjb3B5IHRoZSBhbmltYXRpb24gYnVmZmVyICovCisgICAgICBNTkdfQ09QWSAocEJ1ZiwgcEltYWdlLT5wSW1nYnVmLCBzaXplb2YgKG1uZ19pbWFnZWRhdGEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvcHkgdmlld2FiaWxpdHkgKi8KKyAgICAgIHBDdXJyZW50LT5iVmlld2FibGUgPSBwSW1hZ2UtPmJWaWV3YWJsZTsKKworICAgICAgaWYgKHBCdWYtPmlJbWdkYXRhc2l6ZSkgICAgICAgICAgLyogc2FtcGxlIGJ1ZmZlciBwcmVzZW50ID8gKi8KKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZW4gbWFrZSBhIGNvcHkgKi8KKyAgICAgICAgTU5HX0FMTE9DIChwRGF0YSwgcEJ1Zi0+cEltZ2RhdGEsIHBCdWYtPmlJbWdkYXRhc2l6ZSk7CisgICAgICAgIE1OR19DT1BZIChwQnVmLT5wSW1nZGF0YSwgcEltYWdlLT5wSW1nYnVmLT5wSW1nZGF0YSwgcEJ1Zi0+aUltZ2RhdGFzaXplKTsKKyAgICAgIH0KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX2lDQ1AKKyAgICAgIGlmIChwQnVmLT5pUHJvZmlsZXNpemUpICAgICAgICAgIC8qIGlDQ1AgcHJvZmlsZSBwcmVzZW50ID8gKi8KKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZW4gbWFrZSBhIGNvcHkgKi8KKyAgICAgICAgTU5HX0FMTE9DIChwRGF0YSwgcEJ1Zi0+cFByb2ZpbGUsIHBCdWYtPmlQcm9maWxlc2l6ZSk7CisgICAgICAgIE1OR19DT1BZIChwQnVmLT5wUHJvZmlsZSwgcEltYWdlLT5wSW1nYnVmLT5wUHJvZmlsZSwgcEJ1Zi0+aVByb2ZpbGVzaXplKTsKKyAgICAgIH0KKyNlbmRpZgorICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdyBnbyBhbmQgc2hvb3QgaXQgb2ZmIChpZiByZXF1aXJlZCkgKi8KKyAgICBpZiAoKHBDdXJyZW50LT5iVmlzaWJsZSkgJiYgKHBDdXJyZW50LT5iVmlld2FibGUpKQorICAgICAgaVJldGNvZGUgPSBtbmdfZGlzcGxheV9pbWFnZSAocERhdGEsIHBDdXJyZW50LCBNTkdfRkFMU0UpOworICB9CisgIGVsc2UKKyAgeworICAgIG1uZ19pbWFnZXAgICAgIHBPYmp6ZXJvID0gKG1uZ19pbWFnZXApcERhdGEtPnBPYmp6ZXJvOworICAgIG1uZ19pbWFnZWRhdGFwIHBCdWYgICAgID0gcE9ianplcm8tPnBJbWdidWY7CisKKyAgICBpZiAoIXBEYXRhLT5pQnJlYWtwb2ludCkgICAgICAgICAgIC8qIGRvbid0IGNvcHkgaXQgYWdhaW4gISAqLworICAgIHsKKyAgICAgIGlmIChwQnVmLT5pSW1nZGF0YXNpemUpICAgICAgICAgIC8qIGJ1ZmZlciBwcmVzZW50IGluIGFjdGl2ZSBvYmplY3QgPyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlbiBkcm9wIGl0ICovCisgICAgICAgIE1OR19GUkVFIChwRGF0YSwgcEJ1Zi0+cEltZ2RhdGEsIHBCdWYtPmlJbWdkYXRhc2l6ZSk7CisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19pQ0NQCisgICAgICBpZiAocEJ1Zi0+aVByb2ZpbGVzaXplKSAgICAgICAgICAvKiBpQ0NQIHByb2ZpbGUgcHJlc2VudCA/ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGVuIGRyb3AgaXQgKi8KKyAgICAgICAgTU5HX0ZSRUUgKHBEYXRhLCBwQnVmLT5wUHJvZmlsZSwgcEJ1Zi0+aVByb2ZpbGVzaXplKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm93IGJsYXRlbnRseSBjb3B5IHRoZSBhbmltYXRpb24gYnVmZmVyICovCisgICAgICBNTkdfQ09QWSAocEJ1ZiwgcEltYWdlLT5wSW1nYnVmLCBzaXplb2YgKG1uZ19pbWFnZWRhdGEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvcHkgdmlld2FiaWxpdHkgKi8KKyAgICAgIHBPYmp6ZXJvLT5iVmlld2FibGUgPSBwSW1hZ2UtPmJWaWV3YWJsZTsKKworICAgICAgaWYgKHBCdWYtPmlJbWdkYXRhc2l6ZSkgICAgICAgICAgLyogc2FtcGxlIGJ1ZmZlciBwcmVzZW50ID8gKi8KKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZW4gbWFrZSBhIGNvcHkgKi8KKyAgICAgICAgTU5HX0FMTE9DIChwRGF0YSwgcEJ1Zi0+cEltZ2RhdGEsIHBCdWYtPmlJbWdkYXRhc2l6ZSk7CisgICAgICAgIE1OR19DT1BZIChwQnVmLT5wSW1nZGF0YSwgcEltYWdlLT5wSW1nYnVmLT5wSW1nZGF0YSwgcEJ1Zi0+aUltZ2RhdGFzaXplKTsKKyAgICAgIH0KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX2lDQ1AKKyAgICAgIGlmIChwQnVmLT5pUHJvZmlsZXNpemUpICAgICAgICAgIC8qIGlDQ1AgcHJvZmlsZSBwcmVzZW50ID8gKi8KKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZW4gbWFrZSBhIGNvcHkgKi8KKyAgICAgICAgTU5HX0FMTE9DIChwRGF0YSwgcEJ1Zi0+cFByb2ZpbGUsIHBCdWYtPmlQcm9maWxlc2l6ZSk7CisgICAgICAgIE1OR19DT1BZIChwQnVmLT5wUHJvZmlsZSwgcEltYWdlLT5wSW1nYnVmLT5wUHJvZmlsZSwgcEJ1Zi0+aVByb2ZpbGVzaXplKTsKKyAgICAgIH0KKyNlbmRpZgorICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdyBnbyBhbmQgc2hvdyBpdCAqLworICAgIGlSZXRjb2RlID0gbW5nX2Rpc3BsYXlfaW1hZ2UgKHBEYXRhLCBwT2JqemVybywgTU5HX0ZBTFNFKTsKKyAgfQorCisgIGlmICghaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgICAvKiBhbGwncyB3ZWxsID8gKi8KKyAgeworICAgIGlmIChwRGF0YS0+YlRpbWVyc2V0KSAgICAgICAgICAgICAgLyogdGltZXIgYnJlYWsgPyAqLworICAgICAgcERhdGEtPmlCcmVha3BvaW50ID0gOTk7ICAgICAgICAgLyogZmljdGl2ZSBudW1iZXI7IG5vIG1vcmUgcHJvY2Vzc2luZyBuZWVkZWQhICovCisgICAgZWxzZQorICAgICAgcERhdGEtPmlCcmVha3BvaW50ID0gMDsgICAgICAgICAgLyogZWxzZSBjbGVhciBpdCAqLworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19BTklfSU1BR0UsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIGlSZXRjb2RlOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKK21uZ19yZXRjb2RlIG1uZ19jcmVhdGVfYW5pX3BsdGUgKG1uZ19kYXRhcCAgICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgaUVudHJ5Y291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcGFsZXR0ZThlcCBwYUVudHJpZXMpCisjZWxzZQorbW5nX3JldGNvZGUgbW5nX2NyZWF0ZV9hbmlfcGx0ZSAobW5nX2RhdGFwICAgICAgcERhdGEpCisjZW5kaWYKK3sKKyAgbW5nX2FuaV9wbHRlcCBwUExURTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9DUkVBVEVfQU5JX1BMVEUsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAocERhdGEtPmJDYWNoZXBsYXliYWNrKSAgICAgICAgICAgLyogY2FjaGluZyBwbGF5YmFjayBpbmZvID8gKi8KKyAgeworI2lmZGVmIE1OR19PUFRJTUlaRV9PQkpDTEVBTlVQCisgICAgbW5nX3B0ciAgICAgcFRlbXA7CisgICAgbW5nX3JldGNvZGUgaVJldGNvZGUgPSBjcmVhdGVfb2JqX2dlbmVyYWwgKHBEYXRhLCBzaXplb2YgKG1uZ19hbmlfcGx0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19mcmVlX29ial9nZW5lcmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcHJvY2Vzc19hbmlfcGx0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBUZW1wKTsKKyAgICBpZiAoaVJldGNvZGUpCisgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgcFBMVEUgPSAobW5nX2FuaV9wbHRlcClwVGVtcDsKKyNlbHNlCisgICAgTU5HX0FMTE9DIChwRGF0YSwgcFBMVEUsIHNpemVvZiAobW5nX2FuaV9wbHRlKSk7CisKKyAgICBwUExURS0+c0hlYWRlci5mQ2xlYW51cCA9IG1uZ19mcmVlX2FuaV9wbHRlOworICAgIHBQTFRFLT5zSGVhZGVyLmZQcm9jZXNzID0gbW5nX3Byb2Nlc3NfYW5pX3BsdGU7CisjZW5kaWYKKworICAgIG1uZ19hZGRfYW5pX29iamVjdCAocERhdGEsIChtbmdfb2JqZWN0X2hlYWRlcnApcFBMVEUpOworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorICAgIHBQTFRFLT5pRW50cnljb3VudCA9IGlFbnRyeWNvdW50OworICAgIE1OR19DT1BZIChwUExURS0+YUVudHJpZXMsIHBhRW50cmllcywgc2l6ZW9mIChwUExURS0+YUVudHJpZXMpKTsKKyNlbHNlCisgICAgcFBMVEUtPmlFbnRyeWNvdW50ID0gcERhdGEtPmlHbG9iYWxQTFRFY291bnQ7CisgICAgTU5HX0NPUFkgKHBQTFRFLT5hRW50cmllcywgcERhdGEtPmFHbG9iYWxQTFRFZW50cmllcywgc2l6ZW9mIChwUExURS0+YUVudHJpZXMpKTsKKyNlbmRpZgorICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQ1JFQVRFX0FOSV9QTFRFLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfT0JKQ0xFQU5VUAorbW5nX3JldGNvZGUgbW5nX2ZyZWVfYW5pX3BsdGUgKG1uZ19kYXRhcCAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19vYmplY3RwIHBPYmplY3QpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfQU5JX1BMVEUsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfRlJFRVggKHBEYXRhLCBwT2JqZWN0LCBzaXplb2YgKG1uZ19hbmlfcGx0ZSkpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfQU5JX1BMVEUsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19wcm9jZXNzX2FuaV9wbHRlIChtbmdfZGF0YXAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfb2JqZWN0cCBwT2JqZWN0KQoreworICBtbmdfYW5pX3BsdGVwIHBQTFRFID0gKG1uZ19hbmlfcGx0ZXApcE9iamVjdDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9DRVNTX0FOSV9QTFRFLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcERhdGEtPmJIYXNnbG9iYWxQTFRFICAgPSBNTkdfVFJVRTsKKyAgcERhdGEtPmlHbG9iYWxQTFRFY291bnQgPSBwUExURS0+aUVudHJ5Y291bnQ7CisKKyAgTU5HX0NPUFkgKHBEYXRhLT5hR2xvYmFsUExURWVudHJpZXMsIHBQTFRFLT5hRW50cmllcywgc2l6ZW9mIChwUExURS0+YUVudHJpZXMpKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9DRVNTX0FOSV9QTFRFLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCittbmdfcmV0Y29kZSBtbmdfY3JlYXRlX2FuaV90cm5zIChtbmdfZGF0YXAgICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgaVJhd2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgICBwUmF3ZGF0YSkKKyNlbHNlCittbmdfcmV0Y29kZSBtbmdfY3JlYXRlX2FuaV90cm5zIChtbmdfZGF0YXAgICAgcERhdGEpCisjZW5kaWYKK3sKKyAgbW5nX2FuaV90cm5zcCBwVFJOUzsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9DUkVBVEVfQU5JX1RSTlMsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAocERhdGEtPmJDYWNoZXBsYXliYWNrKSAgICAgICAgICAgLyogY2FjaGluZyBwbGF5YmFjayBpbmZvID8gKi8KKyAgeworI2lmZGVmIE1OR19PUFRJTUlaRV9PQkpDTEVBTlVQCisgICAgbW5nX3B0ciAgICAgcFRlbXA7CisgICAgbW5nX3JldGNvZGUgaVJldGNvZGUgPSBjcmVhdGVfb2JqX2dlbmVyYWwgKHBEYXRhLCBzaXplb2YgKG1uZ19hbmlfdHJucyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19mcmVlX29ial9nZW5lcmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcHJvY2Vzc19hbmlfdHJucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBUZW1wKTsKKyAgICBpZiAoaVJldGNvZGUpCisgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgcFRSTlMgPSAobW5nX2FuaV90cm5zcClwVGVtcDsKKyNlbHNlCisgICAgTU5HX0FMTE9DIChwRGF0YSwgcFRSTlMsIHNpemVvZiAobW5nX2FuaV90cm5zKSk7CisKKyAgICBwVFJOUy0+c0hlYWRlci5mQ2xlYW51cCA9IG1uZ19mcmVlX2FuaV90cm5zOworICAgIHBUUk5TLT5zSGVhZGVyLmZQcm9jZXNzID0gbW5nX3Byb2Nlc3NfYW5pX3RybnM7CisjZW5kaWYKKworICAgIG1uZ19hZGRfYW5pX29iamVjdCAocERhdGEsIChtbmdfb2JqZWN0X2hlYWRlcnApcFRSTlMpOworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorICAgIHBUUk5TLT5pUmF3bGVuID0gaVJhd2xlbjsKKyAgICBNTkdfQ09QWSAocFRSTlMtPmFSYXdkYXRhLCBwUmF3ZGF0YSwgc2l6ZW9mIChwVFJOUy0+YVJhd2RhdGEpKTsKKyNlbHNlCisgICAgcFRSTlMtPmlSYXdsZW4gPSBwRGF0YS0+aUdsb2JhbFRSTlNyYXdsZW47CisgICAgTU5HX0NPUFkgKHBUUk5TLT5hUmF3ZGF0YSwgcERhdGEtPmFHbG9iYWxUUk5TcmF3ZGF0YSwgc2l6ZW9mIChwVFJOUy0+YVJhd2RhdGEpKTsKKyNlbmRpZgorICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQ1JFQVRFX0FOSV9UUk5TLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfT0JKQ0xFQU5VUAorbW5nX3JldGNvZGUgbW5nX2ZyZWVfYW5pX3RybnMgKG1uZ19kYXRhcCAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19vYmplY3RwIHBPYmplY3QpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfQU5JX1RSTlMsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfRlJFRVggKHBEYXRhLCBwT2JqZWN0LCBzaXplb2YgKG1uZ19hbmlfdHJucykpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfQU5JX1RSTlMsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19wcm9jZXNzX2FuaV90cm5zIChtbmdfZGF0YXAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfb2JqZWN0cCBwT2JqZWN0KQoreworICBtbmdfYW5pX3RybnNwIHBUUk5TID0gKG1uZ19hbmlfdHJuc3ApcE9iamVjdDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9DRVNTX0FOSV9UUk5TLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcERhdGEtPmJIYXNnbG9iYWxUUk5TICAgID0gTU5HX1RSVUU7CisgIHBEYXRhLT5pR2xvYmFsVFJOU3Jhd2xlbiA9IHBUUk5TLT5pUmF3bGVuOworCisgIE1OR19DT1BZIChwRGF0YS0+YUdsb2JhbFRSTlNyYXdkYXRhLCBwVFJOUy0+YVJhd2RhdGEsIHNpemVvZiAocFRSTlMtPmFSYXdkYXRhKSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19BTklfVFJOUywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfZ0FNQQorI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKK21uZ19yZXRjb2RlIG1uZ19jcmVhdGVfYW5pX2dhbWEgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfYm9vbCAgIGJFbXB0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaUdhbW1hKQorI2Vsc2UKK21uZ19yZXRjb2RlIG1uZ19jcmVhdGVfYW5pX2dhbWEgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfY2h1bmtwIHBDaHVuaykKKyNlbmRpZgoreworICBtbmdfYW5pX2dhbWFwIHBHQU1BOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0NSRUFURV9BTklfR0FNQSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmIChwRGF0YS0+YkNhY2hlcGxheWJhY2spICAgICAgICAgICAvKiBjYWNoaW5nIHBsYXliYWNrIGluZm8gPyAqLworICB7CisjaWZkZWYgTU5HX09QVElNSVpFX09CSkNMRUFOVVAKKyAgICBtbmdfcHRyICAgICBwVGVtcDsKKyAgICBtbmdfcmV0Y29kZSBpUmV0Y29kZSA9IGNyZWF0ZV9vYmpfZ2VuZXJhbCAocERhdGEsIHNpemVvZiAobW5nX2FuaV9nYW1hKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ZyZWVfb2JqX2dlbmVyYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wcm9jZXNzX2FuaV9nYW1hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFRlbXApOworICAgIGlmIChpUmV0Y29kZSkKKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICBwR0FNQSA9IChtbmdfYW5pX2dhbWFwKXBUZW1wOworI2Vsc2UKKyAgICBNTkdfQUxMT0MgKHBEYXRhLCBwR0FNQSwgc2l6ZW9mIChtbmdfYW5pX2dhbWEpKTsKKworICAgIHBHQU1BLT5zSGVhZGVyLmZDbGVhbnVwID0gbW5nX2ZyZWVfYW5pX2dhbWE7CisgICAgcEdBTUEtPnNIZWFkZXIuZlByb2Nlc3MgPSBtbmdfcHJvY2Vzc19hbmlfZ2FtYTsKKyNlbmRpZgorCisgICAgbW5nX2FkZF9hbmlfb2JqZWN0IChwRGF0YSwgKG1uZ19vYmplY3RfaGVhZGVycClwR0FNQSk7CisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisgICAgcEdBTUEtPmJFbXB0eSA9IGJFbXB0eTsKKyAgICBwR0FNQS0+aUdhbW1hID0gaUdhbW1hOworI2Vsc2UKKyAgICBwR0FNQS0+YkVtcHR5ID0gKChtbmdfZ2FtYXApcENodW5rKS0+YkVtcHR5OworICAgIHBHQU1BLT5pR2FtbWEgPSAoKG1uZ19nYW1hcClwQ2h1bmspLT5pR2FtbWE7CisjZW5kaWYKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0NSRUFURV9BTklfR0FNQSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX09CSkNMRUFOVVAKK21uZ19yZXRjb2RlIG1uZ19mcmVlX2FuaV9nYW1hIChtbmdfZGF0YXAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfb2JqZWN0cCBwT2JqZWN0KQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX0FOSV9HQU1BLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX0ZSRUVYIChwRGF0YSwgcE9iamVjdCwgc2l6ZW9mIChtbmdfYW5pX2dhbWEpKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX0FOSV9HQU1BLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19hbmlfZ2FtYSAobW5nX2RhdGFwICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX29iamVjdHAgcE9iamVjdCkKK3sKKyAgbW5nX2FuaV9nYW1hcCBwR0FNQSA9IChtbmdfYW5pX2dhbWFwKXBPYmplY3Q7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19BTklfR0FNQSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmIChwR0FNQS0+YkVtcHR5KSAgICAgICAgICAgICAgICAgICAvKiBlbXB0eSBjaHVuayA/ICovCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjbGVhciBnbG9iYWwgZ0FNQSAqLworICAgIHBEYXRhLT5iSGFzZ2xvYmFsR0FNQSA9IE1OR19GQUxTRTsKKyAgICBwRGF0YS0+aUdsb2JhbEdhbW1hICAgPSAwOworICB9CisgIGVsc2UKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNldCBnbG9iYWwgZ0FNQSAqLworICAgIHBEYXRhLT5iSGFzZ2xvYmFsR0FNQSA9IE1OR19UUlVFOworICAgIHBEYXRhLT5pR2xvYmFsR2FtbWEgICA9IHBHQU1BLT5pR2FtbWE7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9DRVNTX0FOSV9HQU1BLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX2NIUk0KKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCittbmdfcmV0Y29kZSBtbmdfY3JlYXRlX2FuaV9jaHJtIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2Jvb2wgICBiRW1wdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlXaGl0ZXBvaW50eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaVdoaXRlcG9pbnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpUmVkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaVJlZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlHcmVlbngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlHcmVlbnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlCbHVleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaUJsdWV5KQorI2Vsc2UKK21uZ19yZXRjb2RlIG1uZ19jcmVhdGVfYW5pX2Nocm0gKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfY2h1bmtwIHBDaHVuaykKKyNlbmRpZgoreworICBtbmdfcHRyICAgICAgIHBUZW1wOworICBtbmdfYW5pX2Nocm1wIHBDSFJNOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0NSRUFURV9BTklfQ0hSTSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmIChwRGF0YS0+YkNhY2hlcGxheWJhY2spICAgICAgICAgICAvKiBjYWNoaW5nIHBsYXliYWNrIGluZm8gPyAqLworICB7CisjaWZkZWYgTU5HX09QVElNSVpFX09CSkNMRUFOVVAKKyAgICBtbmdfcmV0Y29kZSBpUmV0Y29kZSA9IGNyZWF0ZV9vYmpfZ2VuZXJhbCAocERhdGEsIHNpemVvZiAobW5nX2FuaV9jaHJtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ZyZWVfb2JqX2dlbmVyYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wcm9jZXNzX2FuaV9jaHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFRlbXApOworICAgIGlmIChpUmV0Y29kZSkKKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICBwQ0hSTSA9IChtbmdfYW5pX2Nocm1wKXBUZW1wOworI2Vsc2UKKyAgICBNTkdfQUxMT0MgKHBEYXRhLCBwQ0hSTSwgc2l6ZW9mIChtbmdfYW5pX2Nocm0pKTsKKworICAgIHBDSFJNLT5zSGVhZGVyLmZDbGVhbnVwID0gbW5nX2ZyZWVfYW5pX2Nocm07CisgICAgcENIUk0tPnNIZWFkZXIuZlByb2Nlc3MgPSBtbmdfcHJvY2Vzc19hbmlfY2hybTsKKyNlbmRpZgorCisgICAgbW5nX2FkZF9hbmlfb2JqZWN0IChwRGF0YSwgKG1uZ19vYmplY3RfaGVhZGVycClwQ0hSTSk7CisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisgICAgcENIUk0tPmJFbXB0eSAgICAgICA9IGJFbXB0eTsKKyAgICBwQ0hSTS0+aVdoaXRlcG9pbnR4ID0gaVdoaXRlcG9pbnR4OworICAgIHBDSFJNLT5pV2hpdGVwb2ludHkgPSBpV2hpdGVwb2ludHk7CisgICAgcENIUk0tPmlSZWR4ICAgICAgICA9IGlSZWR4OworICAgIHBDSFJNLT5pUmVkeSAgICAgICAgPSBpUmVkeTsKKyAgICBwQ0hSTS0+aUdyZWVueCAgICAgID0gaUdyZWVueDsKKyAgICBwQ0hSTS0+aUdyZWVueSAgICAgID0gaUdyZWVueTsKKyAgICBwQ0hSTS0+aUJsdWV4ICAgICAgID0gaUJsdWV4OworICAgIHBDSFJNLT5pQmx1ZXkgICAgICAgPSBpQmx1ZXk7CisjZWxzZQorICAgIHBDSFJNLT5iRW1wdHkgICAgICAgPSAoKG1uZ19jaHJtcClwQ2h1bmspLT5iRW1wdHk7CisgICAgcENIUk0tPmlXaGl0ZXBvaW50eCA9ICgobW5nX2Nocm1wKXBDaHVuayktPmlXaGl0ZXBvaW50eDsKKyAgICBwQ0hSTS0+aVdoaXRlcG9pbnR5ID0gKChtbmdfY2hybXApcENodW5rKS0+aVdoaXRlcG9pbnR5OworICAgIHBDSFJNLT5pUmVkeCAgICAgICAgPSAoKG1uZ19jaHJtcClwQ2h1bmspLT5pUmVkeDsKKyAgICBwQ0hSTS0+aVJlZHkgICAgICAgID0gKChtbmdfY2hybXApcENodW5rKS0+aVJlZHk7CisgICAgcENIUk0tPmlHcmVlbnggICAgICA9ICgobW5nX2Nocm1wKXBDaHVuayktPmlHcmVlbng7CisgICAgcENIUk0tPmlHcmVlbnkgICAgICA9ICgobW5nX2Nocm1wKXBDaHVuayktPmlHcmVlbnk7CisgICAgcENIUk0tPmlCbHVleCAgICAgICA9ICgobW5nX2Nocm1wKXBDaHVuayktPmlCbHVleDsKKyAgICBwQ0hSTS0+aUJsdWV5ICAgICAgID0gKChtbmdfY2hybXApcENodW5rKS0+aUJsdWV5OworI2VuZGlmCisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9DUkVBVEVfQU5JX0NIUk0sIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9PQkpDTEVBTlVQCittbmdfcmV0Y29kZSBtbmdfZnJlZV9hbmlfY2hybSAobW5nX2RhdGFwICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX29iamVjdHAgcE9iamVjdCkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9BTklfQ0hSTSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19GUkVFWCAocERhdGEsIHBPYmplY3QsIHNpemVvZiAobW5nX2FuaV9jaHJtKSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9BTklfQ0hSTSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfYW5pX2Nocm0gKG1uZ19kYXRhcCAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19vYmplY3RwIHBPYmplY3QpCit7CisgIG1uZ19hbmlfY2hybXAgcENIUk0gPSAobW5nX2FuaV9jaHJtcClwT2JqZWN0OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST0NFU1NfQU5JX0NIUk0sIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAocENIUk0tPmJFbXB0eSkgICAgICAgICAgICAgICAgICAgLyogZW1wdHkgY2h1bmsgPyAqLworICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2xlYXIgZ2xvYmFsIGNIUk0gKi8KKyAgICBwRGF0YS0+Ykhhc2dsb2JhbENIUk0gICAgICAgPSBNTkdfRkFMU0U7CisgICAgcERhdGEtPmlHbG9iYWxXaGl0ZXBvaW50eCAgID0gMDsKKyAgICBwRGF0YS0+aUdsb2JhbFdoaXRlcG9pbnR5ICAgPSAwOworICAgIHBEYXRhLT5pR2xvYmFsUHJpbWFyeXJlZHggICA9IDA7CisgICAgcERhdGEtPmlHbG9iYWxQcmltYXJ5cmVkeSAgID0gMDsKKyAgICBwRGF0YS0+aUdsb2JhbFByaW1hcnlncmVlbnggPSAwOworICAgIHBEYXRhLT5pR2xvYmFsUHJpbWFyeWdyZWVueSA9IDA7CisgICAgcERhdGEtPmlHbG9iYWxQcmltYXJ5Ymx1ZXggID0gMDsKKyAgICBwRGF0YS0+aUdsb2JhbFByaW1hcnlibHVleSAgPSAwOworICB9CisgIGVsc2UKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNldCBnbG9iYWwgY0hSTSAqLworICAgIHBEYXRhLT5iSGFzZ2xvYmFsQ0hSTSAgICAgICA9IE1OR19UUlVFOworICAgIHBEYXRhLT5pR2xvYmFsV2hpdGVwb2ludHggICA9IHBDSFJNLT5pV2hpdGVwb2ludHg7CisgICAgcERhdGEtPmlHbG9iYWxXaGl0ZXBvaW50eSAgID0gcENIUk0tPmlXaGl0ZXBvaW50eTsKKyAgICBwRGF0YS0+aUdsb2JhbFByaW1hcnlyZWR4ICAgPSBwQ0hSTS0+aVJlZHg7CisgICAgcERhdGEtPmlHbG9iYWxQcmltYXJ5cmVkeSAgID0gcENIUk0tPmlSZWR5OworICAgIHBEYXRhLT5pR2xvYmFsUHJpbWFyeWdyZWVueCA9IHBDSFJNLT5pR3JlZW54OworICAgIHBEYXRhLT5pR2xvYmFsUHJpbWFyeWdyZWVueSA9IHBDSFJNLT5pR3JlZW55OworICAgIHBEYXRhLT5pR2xvYmFsUHJpbWFyeWJsdWV4ICA9IHBDSFJNLT5pQmx1ZXg7CisgICAgcERhdGEtPmlHbG9iYWxQcmltYXJ5Ymx1ZXkgID0gcENIUk0tPmlCbHVleTsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST0NFU1NfQU5JX0NIUk0sIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfc1JHQgorI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKK21uZ19yZXRjb2RlIG1uZ19jcmVhdGVfYW5pX3NyZ2IgKG1uZ19kYXRhcCBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICBiRW1wdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggaVJlbmRlcmluZ2ludGVudCkKKyNlbHNlCittbmdfcmV0Y29kZSBtbmdfY3JlYXRlX2FuaV9zcmdiIChtbmdfZGF0YXAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfY2h1bmtwIHBDaHVuaykKKyNlbmRpZgoreworICBtbmdfYW5pX3NyZ2JwIHBTUkdCOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0NSRUFURV9BTklfU1JHQiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmIChwRGF0YS0+YkNhY2hlcGxheWJhY2spICAgICAgICAgICAvKiBjYWNoaW5nIHBsYXliYWNrIGluZm8gPyAqLworICB7CisjaWZkZWYgTU5HX09QVElNSVpFX09CSkNMRUFOVVAKKyAgICBtbmdfcHRyICAgICBwVGVtcDsKKyAgICBtbmdfcmV0Y29kZSBpUmV0Y29kZSA9IGNyZWF0ZV9vYmpfZ2VuZXJhbCAocERhdGEsIHNpemVvZiAobW5nX2FuaV9zcmdiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ZyZWVfb2JqX2dlbmVyYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wcm9jZXNzX2FuaV9zcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFRlbXApOworICAgIGlmIChpUmV0Y29kZSkKKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICBwU1JHQiA9IChtbmdfYW5pX3NyZ2JwKXBUZW1wOworI2Vsc2UKKyAgICBNTkdfQUxMT0MgKHBEYXRhLCBwU1JHQiwgc2l6ZW9mIChtbmdfYW5pX3NyZ2IpKTsKKworICAgIHBTUkdCLT5zSGVhZGVyLmZDbGVhbnVwID0gbW5nX2ZyZWVfYW5pX3NyZ2I7CisgICAgcFNSR0ItPnNIZWFkZXIuZlByb2Nlc3MgPSBtbmdfcHJvY2Vzc19hbmlfc3JnYjsKKyNlbmRpZgorCisgICAgbW5nX2FkZF9hbmlfb2JqZWN0IChwRGF0YSwgKG1uZ19vYmplY3RfaGVhZGVycClwU1JHQik7CisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisgICAgcFNSR0ItPmJFbXB0eSAgICAgICAgICAgPSBiRW1wdHk7CisgICAgcFNSR0ItPmlSZW5kZXJpbmdpbnRlbnQgPSBpUmVuZGVyaW5naW50ZW50OworI2Vsc2UKKyAgICBwU1JHQi0+YkVtcHR5ICAgICAgICAgICA9ICgobW5nX3NyZ2JwKXBDaHVuayktPmJFbXB0eTsKKyAgICBwU1JHQi0+aVJlbmRlcmluZ2ludGVudCA9ICgobW5nX3NyZ2JwKXBDaHVuayktPmlSZW5kZXJpbmdpbnRlbnQ7CisjZW5kaWYKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0NSRUFURV9BTklfU1JHQiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX09CSkNMRUFOVVAKK21uZ19yZXRjb2RlIG1uZ19mcmVlX2FuaV9zcmdiIChtbmdfZGF0YXAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfb2JqZWN0cCBwT2JqZWN0KQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX0FOSV9TUkdCLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX0ZSRUVYIChwRGF0YSwgcE9iamVjdCwgc2l6ZW9mIChtbmdfYW5pX3NyZ2IpKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX0FOSV9TUkdCLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19hbmlfc3JnYiAobW5nX2RhdGFwICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX29iamVjdHAgcE9iamVjdCkKK3sKKyAgbW5nX2FuaV9zcmdicCBwU1JHQiA9IChtbmdfYW5pX3NyZ2JwKXBPYmplY3Q7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19BTklfU1JHQiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmIChwU1JHQi0+YkVtcHR5KSAgICAgICAgICAgICAgICAgICAvKiBlbXB0eSBjaHVuayA/ICovCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjbGVhciBnbG9iYWwgc1JHQiAqLworICAgIHBEYXRhLT5iSGFzZ2xvYmFsU1JHQiAgICA9IE1OR19GQUxTRTsKKyAgICBwRGF0YS0+aUdsb2JhbFJlbmRpbnRlbnQgPSAwOworICB9CisgIGVsc2UKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNldCBnbG9iYWwgc1JHQiAqLworICAgIHBEYXRhLT5iSGFzZ2xvYmFsU1JHQiAgICA9IE1OR19UUlVFOworICAgIHBEYXRhLT5pR2xvYmFsUmVuZGludGVudCA9IHBTUkdCLT5pUmVuZGVyaW5naW50ZW50OworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19BTklfU1JHQiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19pQ0NQCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorbW5nX3JldGNvZGUgbW5nX2NyZWF0ZV9hbmlfaWNjcCAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgYkVtcHR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpUHJvZmlsZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcHRyICAgIHBQcm9maWxlKQorI2Vsc2UKK21uZ19yZXRjb2RlIG1uZ19jcmVhdGVfYW5pX2ljY3AgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfY2h1bmtwIHBDaHVuaykKKyNlbmRpZgoreworICBtbmdfcHRyICAgICAgIHBUZW1wOworICBtbmdfYW5pX2ljY3BwIHBJQ0NQOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0NSRUFURV9BTklfSUNDUCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmIChwRGF0YS0+YkNhY2hlcGxheWJhY2spICAgICAgICAgICAvKiBjYWNoaW5nIHBsYXliYWNrIGluZm8gPyAqLworICB7CisjaWZkZWYgTU5HX09QVElNSVpFX09CSkNMRUFOVVAKKyAgICBtbmdfcmV0Y29kZSBpUmV0Y29kZSA9IGNyZWF0ZV9vYmpfZ2VuZXJhbCAocERhdGEsIHNpemVvZiAobW5nX2FuaV9pY2NwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ZyZWVfYW5pX2ljY3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wcm9jZXNzX2FuaV9pY2NwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFRlbXApOworICAgIGlmIChpUmV0Y29kZSkKKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICBwSUNDUCA9IChtbmdfYW5pX2ljY3BwKXBUZW1wOworI2Vsc2UKKyAgICBNTkdfQUxMT0MgKHBEYXRhLCBwSUNDUCwgc2l6ZW9mIChtbmdfYW5pX2ljY3ApKTsKKworICAgIHBJQ0NQLT5zSGVhZGVyLmZDbGVhbnVwID0gbW5nX2ZyZWVfYW5pX2ljY3A7CisgICAgcElDQ1AtPnNIZWFkZXIuZlByb2Nlc3MgPSBtbmdfcHJvY2Vzc19hbmlfaWNjcDsKKyNlbmRpZgorCisgICAgbW5nX2FkZF9hbmlfb2JqZWN0IChwRGF0YSwgKG1uZ19vYmplY3RfaGVhZGVycClwSUNDUCk7CisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisgICAgcElDQ1AtPmJFbXB0eSAgICAgICA9IGJFbXB0eTsKKyAgICBwSUNDUC0+aVByb2ZpbGVzaXplID0gaVByb2ZpbGVzaXplOworCisgICAgaWYgKGlQcm9maWxlc2l6ZSkKKyAgICB7CisgICAgICBNTkdfQUxMT0MgKHBEYXRhLCBwSUNDUC0+cFByb2ZpbGUsIGlQcm9maWxlc2l6ZSk7CisgICAgICBNTkdfQ09QWSAocElDQ1AtPnBQcm9maWxlLCBwUHJvZmlsZSwgaVByb2ZpbGVzaXplKTsKKyAgICB9CisjZWxzZQorICAgIHBJQ0NQLT5iRW1wdHkgICAgICAgPSAoKG1uZ19pY2NwcClwQ2h1bmspLT5iRW1wdHk7CisgICAgcElDQ1AtPmlQcm9maWxlc2l6ZSA9ICgobW5nX2ljY3BwKXBDaHVuayktPmlQcm9maWxlc2l6ZTsKKworICAgIGlmIChwSUNDUC0+aVByb2ZpbGVzaXplKQorICAgIHsKKyAgICAgIE1OR19BTExPQyAocERhdGEsIHBJQ0NQLT5wUHJvZmlsZSwgcElDQ1AtPmlQcm9maWxlc2l6ZSk7CisgICAgICBNTkdfQ09QWSAocElDQ1AtPnBQcm9maWxlLCAoKG1uZ19pY2NwcClwQ2h1bmspLT5wUHJvZmlsZSwgcElDQ1AtPmlQcm9maWxlc2l6ZSk7CisgICAgfQorI2VuZGlmCisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9DUkVBVEVfQU5JX0lDQ1AsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfZnJlZV9hbmlfaWNjcCAobW5nX2RhdGFwICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX29iamVjdHAgcE9iamVjdCkKK3sKKyAgbW5nX2FuaV9pY2NwcCBwSUNDUCA9IChtbmdfYW5pX2ljY3BwKXBPYmplY3Q7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9BTklfSUNDUCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmIChwSUNDUC0+aVByb2ZpbGVzaXplKQorICAgIE1OR19GUkVFWCAocERhdGEsIHBJQ0NQLT5wUHJvZmlsZSwgcElDQ1AtPmlQcm9maWxlc2l6ZSk7CisKKyNpZm5kZWYgTU5HX09QVElNSVpFX09CSkNMRUFOVVAKKyAgTU5HX0ZSRUVYIChwRGF0YSwgcE9iamVjdCwgc2l6ZW9mIChtbmdfYW5pX2ljY3ApKTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfQU5JX0lDQ1AsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX09CSkNMRUFOVVAKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworI2Vsc2UKKyAgcmV0dXJuIG1uZ19mcmVlX29ial9nZW5lcmFsKHBEYXRhLCBwT2JqZWN0KTsKKyNlbmRpZgorfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19hbmlfaWNjcCAobW5nX2RhdGFwICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX29iamVjdHAgcE9iamVjdCkKK3sKKyAgbW5nX2FuaV9pY2NwcCBwSUNDUCA9IChtbmdfYW5pX2ljY3BwKXBPYmplY3Q7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19BTklfSUNDUCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmIChwSUNDUC0+YkVtcHR5KSAgICAgICAgICAgICAgICAgICAvKiBlbXB0eSBjaHVuayA/ICovCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjbGVhciBnbG9iYWwgaUNDUCAqLworICAgIHBEYXRhLT5iSGFzZ2xvYmFsSUNDUCA9IE1OR19GQUxTRTsKKworICAgIGlmIChwRGF0YS0+aUdsb2JhbFByb2ZpbGVzaXplKQorICAgICAgTU5HX0ZSRUVYIChwRGF0YSwgcERhdGEtPnBHbG9iYWxQcm9maWxlLCBwRGF0YS0+aUdsb2JhbFByb2ZpbGVzaXplKTsKKworICAgIHBEYXRhLT5pR2xvYmFsUHJvZmlsZXNpemUgPSAwOworICAgIHBEYXRhLT5wR2xvYmFsUHJvZmlsZSAgICAgPSBNTkdfTlVMTDsKKyAgfQorICBlbHNlCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXQgZ2xvYmFsIGlDQ1AgKi8KKyAgICBwRGF0YS0+Ykhhc2dsb2JhbElDQ1AgICAgID0gTU5HX1RSVUU7CisgICAgcERhdGEtPmlHbG9iYWxQcm9maWxlc2l6ZSA9IHBJQ0NQLT5pUHJvZmlsZXNpemU7CisKKyAgICBpZiAocElDQ1AtPmlQcm9maWxlc2l6ZSkKKyAgICB7CisgICAgICBNTkdfQUxMT0MgKHBEYXRhLCBwRGF0YS0+cEdsb2JhbFByb2ZpbGUsIHBJQ0NQLT5pUHJvZmlsZXNpemUpOworICAgICAgTU5HX0NPUFkgKHBEYXRhLT5wR2xvYmFsUHJvZmlsZSwgcElDQ1AtPnBQcm9maWxlLCBwSUNDUC0+aVByb2ZpbGVzaXplKTsKKyAgICB9CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9DRVNTX0FOSV9JQ0NQLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX2JLR0QKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCittbmdfcmV0Y29kZSBtbmdfY3JlYXRlX2FuaV9ia2dkIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpUmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpR3JlZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlCbHVlKQorI2Vsc2UKK21uZ19yZXRjb2RlIG1uZ19jcmVhdGVfYW5pX2JrZ2QgKG1uZ19kYXRhcCAgcERhdGEpCisjZW5kaWYKK3sKKyAgbW5nX3B0ciAgICAgICBwVGVtcDsKKyAgbW5nX2FuaV9ia2dkcCBwQktHRDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9DUkVBVEVfQU5JX0JLR0QsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAocERhdGEtPmJDYWNoZXBsYXliYWNrKSAgICAgICAgICAgLyogY2FjaGluZyBwbGF5YmFjayBpbmZvID8gKi8KKyAgeworI2lmZGVmIE1OR19PUFRJTUlaRV9PQkpDTEVBTlVQCisgICAgbW5nX3JldGNvZGUgaVJldGNvZGUgPSBjcmVhdGVfb2JqX2dlbmVyYWwgKHBEYXRhLCBzaXplb2YgKG1uZ19hbmlfYmtnZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19mcmVlX29ial9nZW5lcmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcHJvY2Vzc19hbmlfYmtnZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBUZW1wKTsKKyAgICBpZiAoaVJldGNvZGUpCisgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgcEJLR0QgPSAobW5nX2FuaV9ia2dkcClwVGVtcDsKKyNlbHNlCisgICAgTU5HX0FMTE9DIChwRGF0YSwgcEJLR0QsIHNpemVvZiAobW5nX2FuaV9ia2dkKSk7CisKKyAgICBwQktHRC0+c0hlYWRlci5mQ2xlYW51cCA9IG1uZ19mcmVlX2FuaV9ia2dkOworICAgIHBCS0dELT5zSGVhZGVyLmZQcm9jZXNzID0gbW5nX3Byb2Nlc3NfYW5pX2JrZ2Q7CisjZW5kaWYKKworICAgIG1uZ19hZGRfYW5pX29iamVjdCAocERhdGEsIChtbmdfb2JqZWN0X2hlYWRlcnApcEJLR0QpOworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorICAgIHBCS0dELT5pUmVkICAgPSBpUmVkOworICAgIHBCS0dELT5pR3JlZW4gPSBpR3JlZW47CisgICAgcEJLR0QtPmlCbHVlICA9IGlCbHVlOworI2Vsc2UKKyAgICBwQktHRC0+aVJlZCAgID0gcERhdGEtPmlHbG9iYWxCS0dEcmVkOworICAgIHBCS0dELT5pR3JlZW4gPSBwRGF0YS0+aUdsb2JhbEJLR0RncmVlbjsKKyAgICBwQktHRC0+aUJsdWUgID0gcERhdGEtPmlHbG9iYWxCS0dEYmx1ZTsKKyNlbmRpZgorICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQ1JFQVRFX0FOSV9CS0dELCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfT0JKQ0xFQU5VUAorbW5nX3JldGNvZGUgbW5nX2ZyZWVfYW5pX2JrZ2QgKG1uZ19kYXRhcCAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19vYmplY3RwIHBPYmplY3QpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfQU5JX0JLR0QsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfRlJFRVggKHBEYXRhLCBwT2JqZWN0LCBzaXplb2YgKG1uZ19hbmlfYmtnZCkpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfQU5JX0JLR0QsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19wcm9jZXNzX2FuaV9ia2dkIChtbmdfZGF0YXAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfb2JqZWN0cCBwT2JqZWN0KQoreworICBtbmdfYW5pX2JrZ2RwIHBCS0dEID0gKG1uZ19hbmlfYmtnZHApcE9iamVjdDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9DRVNTX0FOSV9CS0dELCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcERhdGEtPmJIYXNnbG9iYWxCS0dEICAgPSBNTkdfVFJVRTsKKyAgcERhdGEtPmlHbG9iYWxCS0dEcmVkICAgPSBwQktHRC0+aVJlZDsKKyAgcERhdGEtPmlHbG9iYWxCS0dEZ3JlZW4gPSBwQktHRC0+aUdyZWVuOworICBwRGF0YS0+aUdsb2JhbEJLR0RibHVlICA9IHBCS0dELT5pQmx1ZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9DRVNTX0FOSV9CS0dELCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX0xPT1AKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCittbmdfcmV0Y29kZSBtbmdfY3JlYXRlX2FuaV9sb29wIChtbmdfZGF0YXAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgIGlMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgIGlSZXBlYXRjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgIGlUZXJtY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgIGlJdGVybWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgaUl0ZXJtYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICBpQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMycCBwU2lnbmFscykKKyNlbHNlCittbmdfcmV0Y29kZSBtbmdfY3JlYXRlX2FuaV9sb29wIChtbmdfZGF0YXAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19jaHVua3AgIHBDaHVuaykKKyNlbmRpZgoreworICBtbmdfYW5pX2xvb3BwIHBMT09QOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0NSRUFURV9BTklfTE9PUCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmIChwRGF0YS0+YkNhY2hlcGxheWJhY2spICAgICAgICAgICAvKiBjYWNoaW5nIHBsYXliYWNrIGluZm8gPyAqLworICB7CisjaWZkZWYgTU5HX09QVElNSVpFX09CSkNMRUFOVVAKKyAgICBtbmdfcHRyICAgICBwVGVtcDsKKyAgICBtbmdfcmV0Y29kZSBpUmV0Y29kZSA9IGNyZWF0ZV9vYmpfZ2VuZXJhbCAocERhdGEsIHNpemVvZiAobW5nX2FuaV9sb29wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ZyZWVfYW5pX2xvb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wcm9jZXNzX2FuaV9sb29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFRlbXApOworICAgIGlmIChpUmV0Y29kZSkKKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICBwTE9PUCA9IChtbmdfYW5pX2xvb3BwKXBUZW1wOworI2Vsc2UKKyAgICBNTkdfQUxMT0MgKHBEYXRhLCBwTE9PUCwgc2l6ZW9mIChtbmdfYW5pX2xvb3ApKTsKKworICAgIHBMT09QLT5zSGVhZGVyLmZDbGVhbnVwID0gbW5nX2ZyZWVfYW5pX2xvb3A7CisgICAgcExPT1AtPnNIZWFkZXIuZlByb2Nlc3MgPSBtbmdfcHJvY2Vzc19hbmlfbG9vcDsKKyNlbmRpZgorCisgICAgbW5nX2FkZF9hbmlfb2JqZWN0IChwRGF0YSwgKG1uZ19vYmplY3RfaGVhZGVycClwTE9PUCk7CisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisgICAgcExPT1AtPmlMZXZlbCAgICAgICA9IGlMZXZlbDsKKyAgICBwTE9PUC0+aVJlcGVhdGNvdW50ID0gaVJlcGVhdGNvdW50OworICAgIHBMT09QLT5pVGVybWNvbmQgICAgPSBpVGVybWNvbmQ7CisgICAgcExPT1AtPmlJdGVybWluICAgICA9IGlJdGVybWluOworICAgIHBMT09QLT5pSXRlcm1heCAgICAgPSBpSXRlcm1heDsKKyAgICBwTE9PUC0+aUNvdW50ICAgICAgID0gaUNvdW50OworCisjaWZuZGVmIE1OR19OT19MT09QX1NJR05BTFNfU1VQUE9SVEVECisgICAgaWYgKGlDb3VudCkKKyAgICB7CisgICAgICBNTkdfQUxMT0MgKHBEYXRhLCBwTE9PUC0+cFNpZ25hbHMsIChpQ291bnQgPDwgMSkpOworICAgICAgTU5HX0NPUFkgKHBMT09QLT5wU2lnbmFscywgcFNpZ25hbHMsIChpQ291bnQgPDwgMSkpOworICAgIH0KKyNlbmRpZgorI2Vsc2UgLyogTU5HX09QVElNSVpFX0NIVU5LUkVBREVSICovCisgICAgcExPT1AtPmlMZXZlbCAgICAgICA9ICgobW5nX2xvb3BwKXBDaHVuayktPmlMZXZlbDsKKyAgICBwTE9PUC0+aVJlcGVhdGNvdW50ID0gKChtbmdfbG9vcHApcENodW5rKS0+aVJlcGVhdDsKKyAgICBwTE9PUC0+aVRlcm1jb25kICAgID0gKChtbmdfbG9vcHApcENodW5rKS0+aVRlcm1pbmF0aW9uOworICAgIHBMT09QLT5pSXRlcm1pbiAgICAgPSAoKG1uZ19sb29wcClwQ2h1bmspLT5pSXRlcm1pbjsKKyAgICBwTE9PUC0+aUl0ZXJtYXggICAgID0gKChtbmdfbG9vcHApcENodW5rKS0+aUl0ZXJtYXg7CisgICAgcExPT1AtPmlDb3VudCAgICAgICA9ICgobW5nX2xvb3BwKXBDaHVuayktPmlDb3VudDsKKworI2lmbmRlZiBNTkdfTk9fTE9PUF9TSUdOQUxTX1NVUFBPUlRFRAorICAgIGlmIChwTE9PUC0+aUNvdW50KQorICAgIHsKKyAgICAgIE1OR19BTExPQyAocERhdGEsIHBMT09QLT5wU2lnbmFscywgKHBMT09QLT5pQ291bnQgPDwgMSkpOworICAgICAgTU5HX0NPUFkgKHBMT09QLT5wU2lnbmFscywgKChtbmdfbG9vcHApcENodW5rKS0+cFNpZ25hbHMsIChwTE9PUC0+aUNvdW50IDw8IDEpKTsKKyAgICB9CisjZW5kaWYKKyNlbmRpZiAvKiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcnVubmluZyBjb3VudGVyIHN0YXJ0cyB3aXRoIHJlcGVhdF9jb3VudCAqLworICAgIHBMT09QLT5pUnVubmluZ2NvdW50ID0gcExPT1AtPmlSZXBlYXRjb3VudDsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0NSRUFURV9BTklfTE9PUCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19mcmVlX2FuaV9sb29wIChtbmdfZGF0YXAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfb2JqZWN0cCBwT2JqZWN0KQoreworI2lmbmRlZiBNTkdfTk9fTE9PUF9TSUdOQUxTX1NVUFBPUlRFRAorICBtbmdfYW5pX2xvb3BwIHBMT09QID0gKG1uZ19hbmlfbG9vcHApcE9iamVjdDsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfQU5JX0xPT1AsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworI2lmbmRlZiBNTkdfTk9fTE9PUF9TSUdOQUxTX1NVUFBPUlRFRAorICBpZiAocExPT1AtPmlDb3VudCkgICAgICAgICAgICAgICAgICAgLyogZHJvcCBzaWduYWwgYnVmZmVyID8gKi8KKyAgICBNTkdfRlJFRVggKHBEYXRhLCBwTE9PUC0+cFNpZ25hbHMsIChwTE9PUC0+aUNvdW50IDw8IDEpKTsKKyNlbmRpZgorCisjaWZuZGVmIE1OR19PUFRJTUlaRV9PQkpDTEVBTlVQCisgIE1OR19GUkVFWCAocERhdGEsIHBPYmplY3QsIHNpemVvZiAobW5nX2FuaV9sb29wKSk7CisjZW5kaWYKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX0FOSV9MT09QLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisjaWZuZGVmIE1OR19PUFRJTUlaRV9PQkpDTEVBTlVQCisgIHJldHVybiBNTkdfTk9FUlJPUjsKKyNlbHNlCisgIHJldHVybiBtbmdfZnJlZV9vYmpfZ2VuZXJhbChwRGF0YSwgcE9iamVjdCk7CisjZW5kaWYKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfYW5pX2xvb3AgKG1uZ19kYXRhcCAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19vYmplY3RwIHBPYmplY3QpCit7CisgIG1uZ19hbmlfbG9vcHAgcExPT1AgPSAobW5nX2FuaV9sb29wcClwT2JqZWN0OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST0NFU1NfQU5JX0xPT1AsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGp1c3QgcmVzZXQgdGhlIHJ1bm5pbmcgY291bnRlciAqLworICBwTE9PUC0+aVJ1bm5pbmdjb3VudCA9IHBMT09QLT5pUmVwZWF0Y291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpdGVyYXRpb249MCBtZWFucyB3ZSdyZSBza2lwcGluZyAhICovCisgIGlmICgoIXBEYXRhLT5iU2tpcHBpbmcpICYmIChwTE9PUC0+aVJlcGVhdGNvdW50ID09IDApKQorICAgIHBEYXRhLT5iU2tpcHBpbmcgPSBNTkdfVFJVRTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9DRVNTX0FOSV9MT09QLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19jcmVhdGVfYW5pX2VuZGwgKG1uZ19kYXRhcCBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCBpTGV2ZWwpCit7CisgIG1uZ19hbmlfZW5kbHAgcEVOREw7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQ1JFQVRFX0FOSV9FTkRMLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKHBEYXRhLT5iQ2FjaGVwbGF5YmFjaykgICAgICAgICAgIC8qIGNhY2hpbmcgcGxheWJhY2sgaW5mbyA/ICovCisgIHsKKyAgICBtbmdfcmV0Y29kZSBpUmV0Y29kZTsKKyNpZmRlZiBNTkdfT1BUSU1JWkVfT0JKQ0xFQU5VUAorICAgIG1uZ19wdHIgICAgIHBUZW1wOworICAgIGlSZXRjb2RlID0gY3JlYXRlX29ial9nZW5lcmFsIChwRGF0YSwgc2l6ZW9mIChtbmdfYW5pX2VuZGwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfZnJlZV9vYmpfZ2VuZXJhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3Byb2Nlc3NfYW5pX2VuZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwVGVtcCk7CisgICAgaWYgKGlSZXRjb2RlKQorICAgICAgcmV0dXJuIGlSZXRjb2RlOworICAgIHBFTkRMID0gKG1uZ19hbmlfZW5kbHApcFRlbXA7CisjZWxzZQorICAgIE1OR19BTExPQyAocERhdGEsIHBFTkRMLCBzaXplb2YgKG1uZ19hbmlfZW5kbCkpOworCisgICAgcEVOREwtPnNIZWFkZXIuZkNsZWFudXAgPSBtbmdfZnJlZV9hbmlfZW5kbDsKKyAgICBwRU5ETC0+c0hlYWRlci5mUHJvY2VzcyA9IG1uZ19wcm9jZXNzX2FuaV9lbmRsOworI2VuZGlmCisKKyAgICBtbmdfYWRkX2FuaV9vYmplY3QgKHBEYXRhLCAobW5nX29iamVjdF9oZWFkZXJwKXBFTkRMKTsKKworICAgIHBFTkRMLT5pTGV2ZWwgPSBpTGV2ZWw7CisKKyAgICBpUmV0Y29kZSA9IG1uZ19wcm9jZXNzX2FuaV9lbmRsIChwRGF0YSwgKG1uZ19vYmplY3RwKXBFTkRMKTsKKyAgICBpZiAoaVJldGNvZGUpCisgICAgICByZXR1cm4gaVJldGNvZGU7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9DUkVBVEVfQU5JX0VOREwsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9PQkpDTEVBTlVQCittbmdfcmV0Y29kZSBtbmdfZnJlZV9hbmlfZW5kbCAobW5nX2RhdGFwICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX29iamVjdHAgcE9iamVjdCkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9BTklfRU5ETCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19GUkVFWCAocERhdGEsIHBPYmplY3QsIHNpemVvZiAobW5nX2FuaV9lbmRsKSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9BTklfRU5ETCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfYW5pX2VuZGwgKG1uZ19kYXRhcCAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19vYmplY3RwIHBPYmplY3QpCit7CisgIG1uZ19hbmlfZW5kbHAgcEVOREwgPSAobW5nX2FuaV9lbmRscClwT2JqZWN0OworICBtbmdfYW5pX2xvb3BwIHBMT09QOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST0NFU1NfQU5JX0VOREwsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAoKChwRGF0YS0+YkRpc3BsYXlpbmcpICYmICgocERhdGEtPmJSdW5uaW5nKSB8fCAocERhdGEtPmJTZWFyY2hpbmcpKSkgfHwKKyAgICAgIChwRGF0YS0+YlJlYWRpbmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgeworICAgIHBMT09QID0gcEVOREwtPnBMT09QOyAgICAgICAgICAgICAgLyogZGV0ZXJtaW5lIG1hdGNoaW5nIExPT1AgKi8KKworICAgIGlmICghcExPT1ApICAgICAgICAgICAgICAgICAgICAgICAgLyogaGF2ZW4ndCBnb3QgaXQgeWV0ID8gKi8KKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdvIGFuZCBsb29rIGJhY2sgaW4gdGhlIGxpc3QgKi8KKyAgICAgIHBMT09QID0gKG1uZ19hbmlfbG9vcHApcEVOREwtPnNIZWFkZXIucFByZXY7CisKKyAgICAgIHdoaWxlICgocExPT1ApICYmCisgICAgICAgICAgICAgKChwTE9PUC0+c0hlYWRlci5mQ2xlYW51cCAhPSBtbmdfZnJlZV9hbmlfbG9vcCkgfHwKKyAgICAgICAgICAgICAgKHBMT09QLT5pTGV2ZWwgICAgICAgICAgICE9IHBFTkRMLT5pTGV2ZWwpICAgICAgICApKQorICAgICAgICBwTE9PUCA9IHBMT09QLT5zSGVhZGVyLnBQcmV2OworICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdvdCBpdCBub3cgPyAqLworICAgIGlmICgocExPT1ApICYmIChwTE9PUC0+aUxldmVsID09IHBFTkRMLT5pTGV2ZWwpKQorICAgIHsKKyAgICAgIHBFTkRMLT5wTE9PUCA9IHBMT09QOyAgICAgICAgICAgIC8qIHNhdmUgZm9yIG5leHQgdGltZSAhICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWNyZWFzZSBydW5uaW5nIGNvdW50ZXIgPyAqLworICAgICAgaWYgKChwTE9PUC0+aVJ1bm5pbmdjb3VudCkgJiYgKHBMT09QLT5pUnVubmluZ2NvdW50IDwgMHg3ZmZmZmZmZkwpKQorICAgICAgICBwTE9PUC0+aVJ1bm5pbmdjb3VudC0tOworCisgICAgICBpZiAoKCFwRGF0YS0+YkRpc3BsYXlpbmcpICYmIChwRGF0YS0+YlJlYWRpbmcpICYmCisgICAgICAgICAgKHBMT09QLT5pUnVubmluZ2NvdW50ID49IDB4N2ZmZmZmZmZMKSkKKyAgICAgIHsKKyAgICAgICAgcERhdGEtPmlUb3RhbGZyYW1lcyAgID0gMHg3ZmZmZmZmZkw7CisgICAgICAgIHBEYXRhLT5pVG90YWxsYXllcnMgICA9IDB4N2ZmZmZmZmZMOworICAgICAgICBwRGF0YS0+aVRvdGFscGxheXRpbWUgPSAweDdmZmZmZmZmTDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogVE9ETzogd2UncmUgY2hlYXRpbmcgb3V0IG9uIHRoZSB0ZXJtaW5hdGlvbl9jb25kaXRpb24sCisgICAgICAgICAgIGl0ZXJhdGlvbl9taW4sIGl0ZXJhdGlvbl9tYXggYW5kIHBvc3NpYmxlIHNpZ25hbHM7CisgICAgICAgICAgIHRoZSBjb2RlIGlzIGp1c3Qgbm90IHJlYWR5IGZvciB0aGF0IGNhbiBvZiB3b3Jtcy4uLi4gKi8KKworICAgICAgICBpZiAoIXBMT09QLT5pUnVubmluZ2NvdW50KSAgICAgLyogcmVhY2hlZCB6ZXJvID8gKi8KKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdhcyB0aGlzIHRoZSBvdXRlciBMT09QID8gKi8KKyAgICAgICAgICBpZiAocERhdGEtPnBGaXJzdGFuaW9iaiA9PSAobW5nX29iamVjdHApcExPT1ApICAvKiBUT0RPOiBUSElTIElTIFdST05HISEgKi8KKyAgICAgICAgICAgIHBEYXRhLT5iSGFzTE9PUCA9IE1OR19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBpZiAocERhdGEtPnBDdXJyYW5pb2JqKSAgICAgIC8qIHdhcyB3ZSBwcm9jZXNzaW5nIG9iamVjdHMgPyAqLworICAgICAgICAgICAgcERhdGEtPnBDdXJyYW5pb2JqID0gcExPT1A7LyogdGhlbiByZXN0YXJ0IHdpdGggTE9PUCAqLworICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgLyogZWxzZSByZXN0YXJ0IGJlaGluZCBMT09QICEhISAqLworICAgICAgICAgICAgcERhdGEtPnBDdXJyYW5pb2JqID0gcExPT1AtPnNIZWFkZXIucE5leHQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvZXMgdGhpcyBtYXRjaCBhICdza2lwcGluZycgTE9PUD8gKi8KKyAgICAgIGlmICgocERhdGEtPmJTa2lwcGluZykgJiYgKHBMT09QLT5pUmVwZWF0Y291bnQgPT0gMCkpCisgICAgICAgIHBEYXRhLT5iU2tpcHBpbmcgPSBNTkdfRkFMU0U7CisgICAgfQorICAgIGVsc2UKKyAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19OT01BVENISU5HTE9PUCk7CisKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST0NFU1NfQU5JX0VOREwsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19ERUZJCittbmdfcmV0Y29kZSBtbmdfY3JlYXRlX2FuaV9kZWZpIChtbmdfZGF0YXAgcERhdGEpCit7ICAgICAgICAgICAgICAgCisgIG1uZ19hbmlfZGVmaXAgcERFRkk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQ1JFQVRFX0FOSV9ERUZJLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKHBEYXRhLT5iQ2FjaGVwbGF5YmFjaykgICAgICAgICAgIC8qIGNhY2hpbmcgcGxheWJhY2sgaW5mbyA/ICovCisgIHsKKyNpZmRlZiBNTkdfT1BUSU1JWkVfT0JKQ0xFQU5VUAorICAgIG1uZ19wdHIgICAgIHBUZW1wOworICAgIG1uZ19yZXRjb2RlIGlSZXRjb2RlID0gY3JlYXRlX29ial9nZW5lcmFsIChwRGF0YSwgc2l6ZW9mIChtbmdfYW5pX2RlZmkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfZnJlZV9vYmpfZ2VuZXJhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3Byb2Nlc3NfYW5pX2RlZmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwVGVtcCk7CisgICAgaWYgKGlSZXRjb2RlKQorICAgICAgcmV0dXJuIGlSZXRjb2RlOworICAgIHBERUZJID0gKG1uZ19hbmlfZGVmaXApcFRlbXA7CisjZWxzZQorICAgIE1OR19BTExPQyAocERhdGEsIHBERUZJLCBzaXplb2YgKG1uZ19hbmlfZGVmaSkpOworCisgICAgcERFRkktPnNIZWFkZXIuZkNsZWFudXAgPSBtbmdfZnJlZV9hbmlfZGVmaTsKKyAgICBwREVGSS0+c0hlYWRlci5mUHJvY2VzcyA9IG1uZ19wcm9jZXNzX2FuaV9kZWZpOworI2VuZGlmCisKKyAgICBtbmdfYWRkX2FuaV9vYmplY3QgKHBEYXRhLCAobW5nX29iamVjdF9oZWFkZXJwKXBERUZJKTsKKworICAgIHBERUZJLT5pSWQgICAgICAgICAgICAgID0gcERhdGEtPmlERUZJb2JqZWN0aWQ7CisgICAgcERFRkktPmJIYXNkb25vdHNob3cgICAgPSBwRGF0YS0+YkRFRkloYXNkb25vdHNob3c7CisgICAgcERFRkktPmlEb25vdHNob3cgICAgICAgPSBwRGF0YS0+aURFRklkb25vdHNob3c7CisgICAgcERFRkktPmJIYXNjb25jcmV0ZSAgICAgPSBwRGF0YS0+YkRFRkloYXNjb25jcmV0ZTsKKyAgICBwREVGSS0+aUNvbmNyZXRlICAgICAgICA9IHBEYXRhLT5pREVGSWNvbmNyZXRlOworICAgIHBERUZJLT5iSGFzbG9jYSAgICAgICAgID0gcERhdGEtPmJERUZJaGFzbG9jYTsKKyAgICBwREVGSS0+aUxvY2F4ICAgICAgICAgICA9IHBEYXRhLT5pREVGSWxvY2F4OworICAgIHBERUZJLT5pTG9jYXkgICAgICAgICAgID0gcERhdGEtPmlERUZJbG9jYXk7CisgICAgcERFRkktPmJIYXNjbGlwICAgICAgICAgPSBwRGF0YS0+YkRFRkloYXNjbGlwOworICAgIHBERUZJLT5pQ2xpcGwgICAgICAgICAgID0gcERhdGEtPmlERUZJY2xpcGw7CisgICAgcERFRkktPmlDbGlwciAgICAgICAgICAgPSBwRGF0YS0+aURFRkljbGlwcjsKKyAgICBwREVGSS0+aUNsaXB0ICAgICAgICAgICA9IHBEYXRhLT5pREVGSWNsaXB0OworICAgIHBERUZJLT5pQ2xpcGIgICAgICAgICAgID0gcERhdGEtPmlERUZJY2xpcGI7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9DUkVBVEVfQU5JX0RFRkksIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9PQkpDTEVBTlVQCittbmdfcmV0Y29kZSBtbmdfZnJlZV9hbmlfZGVmaSAobW5nX2RhdGFwICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX29iamVjdHAgcE9iamVjdCkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9BTklfREVGSSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19GUkVFWCAocERhdGEsIHBPYmplY3QsIHNpemVvZiAobW5nX2FuaV9kZWZpKSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9BTklfREVGSSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfYW5pX2RlZmkgKG1uZ19kYXRhcCAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19vYmplY3RwIHBPYmplY3QpCit7CisgIG1uZ19hbmlfZGVmaXAgcERFRkkgPSAobW5nX2FuaV9kZWZpcClwT2JqZWN0OworICBtbmdfcmV0Y29kZSAgIGlSZXRjb2RlOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST0NFU1NfQU5JX0RFRkksIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBwRGF0YS0+aURFRklvYmplY3RpZCAgICAgPSBwREVGSS0+aUlkOworICBwRGF0YS0+YkRFRkloYXNkb25vdHNob3cgPSBwREVGSS0+Ykhhc2Rvbm90c2hvdzsKKyAgcERhdGEtPmlERUZJZG9ub3RzaG93ICAgID0gcERFRkktPmlEb25vdHNob3c7CisgIHBEYXRhLT5iREVGSWhhc2NvbmNyZXRlICA9IHBERUZJLT5iSGFzY29uY3JldGU7CisgIHBEYXRhLT5pREVGSWNvbmNyZXRlICAgICA9IHBERUZJLT5pQ29uY3JldGU7CisgIHBEYXRhLT5iREVGSWhhc2xvY2EgICAgICA9IHBERUZJLT5iSGFzbG9jYTsKKyAgcERhdGEtPmlERUZJbG9jYXggICAgICAgID0gcERFRkktPmlMb2NheDsKKyAgcERhdGEtPmlERUZJbG9jYXkgICAgICAgID0gcERFRkktPmlMb2NheTsKKyAgcERhdGEtPmJERUZJaGFzY2xpcCAgICAgID0gcERFRkktPmJIYXNjbGlwOworICBwRGF0YS0+aURFRkljbGlwbCAgICAgICAgPSBwREVGSS0+aUNsaXBsOworICBwRGF0YS0+aURFRkljbGlwciAgICAgICAgPSBwREVGSS0+aUNsaXByOworICBwRGF0YS0+aURFRkljbGlwdCAgICAgICAgPSBwREVGSS0+aUNsaXB0OworICBwRGF0YS0+aURFRkljbGlwYiAgICAgICAgPSBwREVGSS0+aUNsaXBiOworCisgIGlSZXRjb2RlID0gbW5nX3Byb2Nlc3NfZGlzcGxheV9kZWZpIChwRGF0YSk7CisKKyAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgcmV0dXJuIGlSZXRjb2RlOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST0NFU1NfQU5JX0RFRkksIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfQkFTSQorI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKK21uZ19yZXRjb2RlIG1uZ19jcmVhdGVfYW5pX2Jhc2kgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlSZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlHcmVlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaUJsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfYm9vbCAgIGJIYXNhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaUFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICBpVmlld2FibGUpCisjZWxzZQorbW5nX3JldGNvZGUgbW5nX2NyZWF0ZV9hbmlfYmFzaSAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19jaHVua3AgcENodW5rKQorI2VuZGlmCit7CisgIG1uZ19hbmlfYmFzaXAgcEJBU0k7CisgIG1uZ19yZXRjb2RlICAgaVJldGNvZGU7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQ1JFQVRFX0FOSV9CQVNJLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKHBEYXRhLT5iQ2FjaGVwbGF5YmFjaykgICAgICAgICAgIC8qIGNhY2hpbmcgcGxheWJhY2sgaW5mbyA/ICovCisgIHsKKyNpZmRlZiBNTkdfT1BUSU1JWkVfT0JKQ0xFQU5VUAorICAgIG1uZ19wdHIgcFRlbXA7CisgICAgaVJldGNvZGUgPSBjcmVhdGVfb2JqX2dlbmVyYWwgKHBEYXRhLCBzaXplb2YgKG1uZ19hbmlfYmFzaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19mcmVlX29ial9nZW5lcmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcHJvY2Vzc19hbmlfYmFzaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBUZW1wKTsKKyAgICBpZiAoaVJldGNvZGUpCisgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgcEJBU0kgPSAobW5nX2FuaV9iYXNpcClwVGVtcDsKKyNlbHNlCisgICAgTU5HX0FMTE9DIChwRGF0YSwgcEJBU0ksIHNpemVvZiAobW5nX2FuaV9iYXNpKSk7CisKKyAgICBwQkFTSS0+c0hlYWRlci5mQ2xlYW51cCA9IG1uZ19mcmVlX2FuaV9iYXNpOworICAgIHBCQVNJLT5zSGVhZGVyLmZQcm9jZXNzID0gbW5nX3Byb2Nlc3NfYW5pX2Jhc2k7CisjZW5kaWYKKworICAgIG1uZ19hZGRfYW5pX29iamVjdCAocERhdGEsIChtbmdfb2JqZWN0X2hlYWRlcnApcEJBU0kpOworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorICAgIHBCQVNJLT5pUmVkICAgICAgPSBpUmVkOworICAgIHBCQVNJLT5pR3JlZW4gICAgPSBpR3JlZW47CisgICAgcEJBU0ktPmlCbHVlICAgICA9IGlCbHVlOworICAgIHBCQVNJLT5iSGFzYWxwaGEgPSBiSGFzYWxwaGE7CisgICAgcEJBU0ktPmlBbHBoYSAgICA9IGlBbHBoYTsKKyAgICBwQkFTSS0+aVZpZXdhYmxlID0gaVZpZXdhYmxlOworI2Vsc2UKKyAgICBwQkFTSS0+aVJlZCAgICAgID0gKChtbmdfYmFzaXApcENodW5rKS0+aVJlZDsKKyAgICBwQkFTSS0+aUdyZWVuICAgID0gKChtbmdfYmFzaXApcENodW5rKS0+aUdyZWVuOworICAgIHBCQVNJLT5pQmx1ZSAgICAgPSAoKG1uZ19iYXNpcClwQ2h1bmspLT5pQmx1ZTsKKyAgICBwQkFTSS0+Ykhhc2FscGhhID0gKChtbmdfYmFzaXApcENodW5rKS0+Ykhhc2FscGhhOworICAgIHBCQVNJLT5pQWxwaGEgICAgPSAoKG1uZ19iYXNpcClwQ2h1bmspLT5pQWxwaGE7CisgICAgcEJBU0ktPmlWaWV3YWJsZSA9ICgobW5nX2Jhc2lwKXBDaHVuayktPmlWaWV3YWJsZTsKKyNlbmRpZgorICB9CisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0RJU1BMQVlDQUxMUworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyAgaVJldGNvZGUgPSBtbmdfcHJvY2Vzc19kaXNwbGF5X2Jhc2kgKHBEYXRhLCBpUmVkLCBpR3JlZW4sIGlCbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkhhc2FscGhhLCBpQWxwaGEsIGlWaWV3YWJsZSk7CisjZWxzZQorICBpUmV0Y29kZSA9IG1uZ19wcm9jZXNzX2Rpc3BsYXlfYmFzaSAocERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG1uZ19iYXNpcClwQ2h1bmspLT5pUmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChtbmdfYmFzaXApcENodW5rKS0+aUdyZWVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChtbmdfYmFzaXApcENodW5rKS0+aUJsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG1uZ19iYXNpcClwQ2h1bmspLT5iSGFzYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG1uZ19iYXNpcClwQ2h1bmspLT5pQWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG1uZ19iYXNpcClwQ2h1bmspLT5pVmlld2FibGUpOworI2VuZGlmCisjZWxzZQorI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyAgcERhdGEtPmlCQVNJcmVkICAgICAgPSBpUmVkOworICBwRGF0YS0+aUJBU0lncmVlbiAgICA9IGlHcmVlbjsKKyAgcERhdGEtPmlCQVNJYmx1ZSAgICAgPSBpQmx1ZTsKKyAgcERhdGEtPmJCQVNJaGFzYWxwaGEgPSBiSGFzYWxwaGE7CisgIHBEYXRhLT5pQkFTSWFscGhhICAgID0gaUFscGhhOworICBwRGF0YS0+aUJBU0l2aWV3YWJsZSA9IGlWaWV3YWJsZTsKKyNlbHNlCisgIHBEYXRhLT5pQkFTSXJlZCAgICAgID0gKChtbmdfYmFzaXApcENodW5rKS0+aVJlZDsKKyAgcERhdGEtPmlCQVNJZ3JlZW4gICAgPSAoKG1uZ19iYXNpcClwQ2h1bmspLT5pR3JlZW47CisgIHBEYXRhLT5pQkFTSWJsdWUgICAgID0gKChtbmdfYmFzaXApcENodW5rKS0+aUJsdWU7CisgIHBEYXRhLT5iQkFTSWhhc2FscGhhID0gKChtbmdfYmFzaXApcENodW5rKS0+Ykhhc2FscGhhOworICBwRGF0YS0+aUJBU0lhbHBoYSAgICA9ICgobW5nX2Jhc2lwKXBDaHVuayktPmlBbHBoYTsKKyAgcERhdGEtPmlCQVNJdmlld2FibGUgPSAoKG1uZ19iYXNpcClwQ2h1bmspLT5pVmlld2FibGU7CisjZW5kaWYKKworICBpUmV0Y29kZSA9IG1uZ19wcm9jZXNzX2Rpc3BsYXlfYmFzaSAocERhdGEpOworI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQ1JFQVRFX0FOSV9CQVNJLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBpUmV0Y29kZTsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfT0JKQ0xFQU5VUAorbW5nX3JldGNvZGUgbW5nX2ZyZWVfYW5pX2Jhc2kgKG1uZ19kYXRhcCAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19vYmplY3RwIHBPYmplY3QpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfQU5JX0JBU0ksIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfRlJFRVggKHBEYXRhLCBwT2JqZWN0LCBzaXplb2YgKG1uZ19hbmlfYmFzaSkpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfQU5JX0JBU0ksIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19wcm9jZXNzX2FuaV9iYXNpIChtbmdfZGF0YXAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfb2JqZWN0cCBwT2JqZWN0KQoreworICBtbmdfYW5pX2Jhc2lwIHBCQVNJID0gKG1uZ19hbmlfYmFzaXApcE9iamVjdDsKKyAgbW5nX3JldGNvZGUgICBpUmV0Y29kZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9DRVNTX0FOSV9CQVNJLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0RJU1BMQVlDQUxMUworICBpUmV0Y29kZSA9IG1uZ19wcm9jZXNzX2Rpc3BsYXlfYmFzaSAocERhdGEsIHBCQVNJLT5pUmVkLCBwQkFTSS0+aUdyZWVuLCBwQkFTSS0+aUJsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQkFTSS0+Ykhhc2FscGhhLCBwQkFTSS0+aUFscGhhLCBwQkFTSS0+aVZpZXdhYmxlKTsKKyNlbHNlCisgIHBEYXRhLT5pQkFTSXJlZCAgICAgID0gcEJBU0ktPmlSZWQ7CisgIHBEYXRhLT5pQkFTSWdyZWVuICAgID0gcEJBU0ktPmlHcmVlbjsKKyAgcERhdGEtPmlCQVNJYmx1ZSAgICAgPSBwQkFTSS0+aUJsdWU7CisgIHBEYXRhLT5iQkFTSWhhc2FscGhhID0gcEJBU0ktPmJIYXNhbHBoYTsKKyAgcERhdGEtPmlCQVNJYWxwaGEgICAgPSBwQkFTSS0+aUFscGhhOworICBwRGF0YS0+aUJBU0l2aWV3YWJsZSA9IHBCQVNJLT5pVmlld2FibGU7CisKKyAgaVJldGNvZGUgPSBtbmdfcHJvY2Vzc19kaXNwbGF5X2Jhc2kgKHBEYXRhKTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST0NFU1NfQU5JX0JBU0ksIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIGlSZXRjb2RlOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19DTE9OCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorbW5nX3JldGNvZGUgbW5nX2NyZWF0ZV9hbmlfY2xvbiAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaVNvdXJjZWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpQ2xvbmVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaUNsb25ldHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgYkhhc2Rvbm90c2hvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaURvbm90c2hvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaUNvbmNyZXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2Jvb2wgICBiSGFzbG9jYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaUxvY2F0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpTG9jYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlMb2NheSkKKyNlbHNlCittbmdfcmV0Y29kZSBtbmdfY3JlYXRlX2FuaV9jbG9uIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2NodW5rcCBwQ2h1bmspCisjZW5kaWYKK3sKKyAgbW5nX2FuaV9jbG9ucCBwQ0xPTjsKKyAgbW5nX3JldGNvZGUgICBpUmV0Y29kZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9DUkVBVEVfQU5JX0NMT04sIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAocERhdGEtPmJDYWNoZXBsYXliYWNrKSAgICAgICAgICAgLyogY2FjaGluZyBwbGF5YmFjayBpbmZvID8gKi8KKyAgeworI2lmZGVmIE1OR19PUFRJTUlaRV9PQkpDTEVBTlVQCisgICAgbW5nX3B0ciBwVGVtcDsKKyAgICBpUmV0Y29kZSA9IGNyZWF0ZV9vYmpfZ2VuZXJhbCAocERhdGEsIHNpemVvZiAobW5nX2FuaV9jbG9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ZyZWVfb2JqX2dlbmVyYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wcm9jZXNzX2FuaV9jbG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFRlbXApOworICAgIGlmIChpUmV0Y29kZSkKKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICBwQ0xPTiA9IChtbmdfYW5pX2Nsb25wKXBUZW1wOworI2Vsc2UKKyAgICBNTkdfQUxMT0MgKHBEYXRhLCBwQ0xPTiwgc2l6ZW9mIChtbmdfYW5pX2Nsb24pKTsKKworICAgIHBDTE9OLT5zSGVhZGVyLmZDbGVhbnVwID0gbW5nX2ZyZWVfYW5pX2Nsb247CisgICAgcENMT04tPnNIZWFkZXIuZlByb2Nlc3MgPSBtbmdfcHJvY2Vzc19hbmlfY2xvbjsKKyNlbmRpZgorCisgICAgbW5nX2FkZF9hbmlfb2JqZWN0IChwRGF0YSwgKG1uZ19vYmplY3RfaGVhZGVycClwQ0xPTik7CisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisgICAgcENMT04tPmlTb3VyY2VpZCAgICAgPSBpU291cmNlaWQ7CisgICAgcENMT04tPmlDbG9uZWlkICAgICAgPSBpQ2xvbmVpZDsKKyAgICBwQ0xPTi0+aUNsb25ldHlwZSAgICA9IGlDbG9uZXR5cGU7CisgICAgcENMT04tPmJIYXNkb25vdHNob3cgPSBiSGFzZG9ub3RzaG93OworICAgIHBDTE9OLT5pRG9ub3RzaG93ICAgID0gaURvbm90c2hvdzsKKyAgICBwQ0xPTi0+aUNvbmNyZXRlICAgICA9IGlDb25jcmV0ZTsKKyAgICBwQ0xPTi0+Ykhhc2xvY2EgICAgICA9IGJIYXNsb2NhOworICAgIHBDTE9OLT5pTG9jYXR5cGUgICAgID0gaUxvY2F0eXBlOworICAgIHBDTE9OLT5pTG9jYXggICAgICAgID0gaUxvY2F4OworICAgIHBDTE9OLT5pTG9jYXkgICAgICAgID0gaUxvY2F5OworI2Vsc2UKKyAgICBwQ0xPTi0+aVNvdXJjZWlkICAgICA9ICgobW5nX2Nsb25wKXBDaHVuayktPmlTb3VyY2VpZDsKKyAgICBwQ0xPTi0+aUNsb25laWQgICAgICA9ICgobW5nX2Nsb25wKXBDaHVuayktPmlDbG9uZWlkOworICAgIHBDTE9OLT5pQ2xvbmV0eXBlICAgID0gKChtbmdfY2xvbnApcENodW5rKS0+aUNsb25ldHlwZTsKKyAgICBwQ0xPTi0+Ykhhc2Rvbm90c2hvdyA9ICgobW5nX2Nsb25wKXBDaHVuayktPmJIYXNkb25vdHNob3c7CisgICAgcENMT04tPmlEb25vdHNob3cgICAgPSAoKG1uZ19jbG9ucClwQ2h1bmspLT5pRG9ub3RzaG93OworICAgIHBDTE9OLT5pQ29uY3JldGUgICAgID0gKChtbmdfY2xvbnApcENodW5rKS0+aUNvbmNyZXRlOworICAgIHBDTE9OLT5iSGFzbG9jYSAgICAgID0gKChtbmdfY2xvbnApcENodW5rKS0+Ykhhc2xvY2E7CisgICAgcENMT04tPmlMb2NhdHlwZSAgICAgPSAoKG1uZ19jbG9ucClwQ2h1bmspLT5pTG9jYXRpb250eXBlOworICAgIHBDTE9OLT5pTG9jYXggICAgICAgID0gKChtbmdfY2xvbnApcENodW5rKS0+aUxvY2F0aW9ueDsKKyAgICBwQ0xPTi0+aUxvY2F5ICAgICAgICA9ICgobW5nX2Nsb25wKXBDaHVuayktPmlMb2NhdGlvbnk7CisjZW5kaWYKKyAgfQorCisjaWZuZGVmIE1OR19PUFRJTUlaRV9ESVNQTEFZQ0FMTFMKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisgIGlSZXRjb2RlID0gbW5nX3Byb2Nlc3NfZGlzcGxheV9jbG9uIChwRGF0YSwgaVNvdXJjZWlkLCBpQ2xvbmVpZCwgaUNsb25ldHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJIYXNkb25vdHNob3csIGlEb25vdHNob3csIGlDb25jcmV0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJIYXNsb2NhLCBpTG9jYXR5cGUsIGlMb2NheCwgaUxvY2F5KTsKKyNlbHNlCisgIGlSZXRjb2RlID0gbW5nX3Byb2Nlc3NfZGlzcGxheV9jbG9uIChwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobW5nX2Nsb25wKXBDaHVuayktPmlTb3VyY2VpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobW5nX2Nsb25wKXBDaHVuayktPmlDbG9uZWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChtbmdfY2xvbnApcENodW5rKS0+aUNsb25ldHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobW5nX2Nsb25wKXBDaHVuayktPmJIYXNkb25vdHNob3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG1uZ19jbG9ucClwQ2h1bmspLT5pRG9ub3RzaG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChtbmdfY2xvbnApcENodW5rKS0+aUNvbmNyZXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChtbmdfY2xvbnApcENodW5rKS0+Ykhhc2xvY2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG1uZ19jbG9ucClwQ2h1bmspLT5pTG9jYXRpb250eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChtbmdfY2xvbnApcENodW5rKS0+aUxvY2F0aW9ueCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobW5nX2Nsb25wKXBDaHVuayktPmlMb2NhdGlvbnkpOworI2VuZGlmCisjZWxzZQorI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyAgcERhdGEtPmlDTE9Oc291cmNlaWQgICAgID0gaVNvdXJjZWlkOworICBwRGF0YS0+aUNMT05jbG9uZWlkICAgICAgPSBpQ2xvbmVpZDsKKyAgcERhdGEtPmlDTE9OY2xvbmV0eXBlICAgID0gaUNsb25ldHlwZTsKKyAgcERhdGEtPmJDTE9OaGFzZG9ub3RzaG93ID0gYkhhc2Rvbm90c2hvdzsKKyAgcERhdGEtPmlDTE9OZG9ub3RzaG93ICAgID0gaURvbm90c2hvdzsKKyAgcERhdGEtPmlDTE9OY29uY3JldGUgICAgID0gaUNvbmNyZXRlOworICBwRGF0YS0+YkNMT05oYXNsb2NhICAgICAgPSBiSGFzbG9jYTsKKyAgcERhdGEtPmlDTE9ObG9jYXRpb250eXBlID0gaUxvY2F0eXBlOworICBwRGF0YS0+aUNMT05sb2NhdGlvbnggICAgPSBpTG9jYXg7CisgIHBEYXRhLT5pQ0xPTmxvY2F0aW9ueSAgICA9IGlMb2NheTsKKyNlbHNlCisgIHBEYXRhLT5pQ0xPTnNvdXJjZWlkICAgICA9ICgobW5nX2Nsb25wKXBDaHVuayktPmlTb3VyY2VpZDsKKyAgcERhdGEtPmlDTE9OY2xvbmVpZCAgICAgID0gKChtbmdfY2xvbnApcENodW5rKS0+aUNsb25laWQ7CisgIHBEYXRhLT5pQ0xPTmNsb25ldHlwZSAgICA9ICgobW5nX2Nsb25wKXBDaHVuayktPmlDbG9uZXR5cGU7CisgIHBEYXRhLT5iQ0xPTmhhc2Rvbm90c2hvdyA9ICgobW5nX2Nsb25wKXBDaHVuayktPmJIYXNkb25vdHNob3c7CisgIHBEYXRhLT5pQ0xPTmRvbm90c2hvdyAgICA9ICgobW5nX2Nsb25wKXBDaHVuayktPmlEb25vdHNob3c7CisgIHBEYXRhLT5pQ0xPTmNvbmNyZXRlICAgICA9ICgobW5nX2Nsb25wKXBDaHVuayktPmlDb25jcmV0ZTsKKyAgcERhdGEtPmJDTE9OaGFzbG9jYSAgICAgID0gKChtbmdfY2xvbnApcENodW5rKS0+Ykhhc2xvY2E7CisgIHBEYXRhLT5pQ0xPTmxvY2F0aW9udHlwZSA9ICgobW5nX2Nsb25wKXBDaHVuayktPmlMb2NhdGlvbnR5cGU7CisgIHBEYXRhLT5pQ0xPTmxvY2F0aW9ueCAgICA9ICgobW5nX2Nsb25wKXBDaHVuayktPmlMb2NhdGlvbng7CisgIHBEYXRhLT5pQ0xPTmxvY2F0aW9ueSAgICA9ICgobW5nX2Nsb25wKXBDaHVuayktPmlMb2NhdGlvbnk7CisjZW5kaWYKKworICBpUmV0Y29kZSA9IG1uZ19wcm9jZXNzX2Rpc3BsYXlfY2xvbiAocERhdGEpOworI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQ1JFQVRFX0FOSV9DTE9OLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBpUmV0Y29kZTsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfT0JKQ0xFQU5VUAorbW5nX3JldGNvZGUgbW5nX2ZyZWVfYW5pX2Nsb24gKG1uZ19kYXRhcCAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19vYmplY3RwIHBPYmplY3QpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfQU5JX0NMT04sIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfRlJFRVggKHBEYXRhLCBwT2JqZWN0LCBzaXplb2YgKG1uZ19hbmlfY2xvbikpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfQU5JX0NMT04sIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19wcm9jZXNzX2FuaV9jbG9uIChtbmdfZGF0YXAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfb2JqZWN0cCBwT2JqZWN0KQoreworICBtbmdfYW5pX2Nsb25wIHBDTE9OID0gKG1uZ19hbmlfY2xvbnApcE9iamVjdDsKKyAgbW5nX3JldGNvZGUgICBpUmV0Y29kZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9DRVNTX0FOSV9DTE9OLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0RJU1BMQVlDQUxMUworICBpUmV0Y29kZSA9IG1uZ19wcm9jZXNzX2Rpc3BsYXlfY2xvbiAocERhdGEsIHBDTE9OLT5pU291cmNlaWQsIHBDTE9OLT5pQ2xvbmVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDTE9OLT5pQ2xvbmV0eXBlLCBwQ0xPTi0+Ykhhc2Rvbm90c2hvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDTE9OLT5pRG9ub3RzaG93LCBwQ0xPTi0+aUNvbmNyZXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENMT04tPmJIYXNsb2NhLCBwQ0xPTi0+aUxvY2F0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENMT04tPmlMb2NheCwgcENMT04tPmlMb2NheSk7CisjZWxzZQorICBwRGF0YS0+aUNMT05jbG9uZWlkICAgICAgPSBwQ0xPTi0+aUNsb25laWQ7CisgIHBEYXRhLT5pQ0xPTnNvdXJjZWlkICAgICA9IHBDTE9OLT5pU291cmNlaWQ7CisgIHBEYXRhLT5pQ0xPTmNsb25ldHlwZSAgICA9IHBDTE9OLT5pQ2xvbmV0eXBlOworICBwRGF0YS0+YkNMT05oYXNkb25vdHNob3cgPSBwQ0xPTi0+Ykhhc2Rvbm90c2hvdzsKKyAgcERhdGEtPmlDTE9OZG9ub3RzaG93ICAgID0gcENMT04tPmlEb25vdHNob3c7CisgIHBEYXRhLT5pQ0xPTmNvbmNyZXRlICAgICA9IHBDTE9OLT5pQ29uY3JldGU7CisgIHBEYXRhLT5iQ0xPTmhhc2xvY2EgICAgICA9IHBDTE9OLT5iSGFzbG9jYTsKKyAgcERhdGEtPmlDTE9ObG9jYXRpb250eXBlID0gcENMT04tPmlMb2NhdHlwZTsKKyAgcERhdGEtPmlDTE9ObG9jYXRpb254ICAgID0gcENMT04tPmlMb2NheDsKKyAgcERhdGEtPmlDTE9ObG9jYXRpb255ICAgID0gcENMT04tPmlMb2NheTsKKworICBpUmV0Y29kZSA9IG1uZ19wcm9jZXNzX2Rpc3BsYXlfY2xvbiAocERhdGEpOworI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19BTklfQ0xPTiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gaVJldGNvZGU7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX0JBQ0sKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCittbmdfcmV0Y29kZSBtbmdfY3JlYXRlX2FuaV9iYWNrIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpUmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpR3JlZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlCbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICBpTWFuZGF0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpSW1hZ2VpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaVRpbGUpCisjZWxzZQorbW5nX3JldGNvZGUgbW5nX2NyZWF0ZV9hbmlfYmFjayAobW5nX2RhdGFwICBwRGF0YSkKKyNlbmRpZgoreworICBtbmdfYW5pX2JhY2twIHBCQUNLOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0NSRUFURV9BTklfQkFDSywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmIChwRGF0YS0+YkNhY2hlcGxheWJhY2spICAgICAgICAgICAvKiBjYWNoaW5nIHBsYXliYWNrIGluZm8gPyAqLworICB7CisjaWZkZWYgTU5HX09QVElNSVpFX09CSkNMRUFOVVAKKyAgICBtbmdfcHRyICAgICBwVGVtcDsKKyAgICBtbmdfcmV0Y29kZSBpUmV0Y29kZSA9IGNyZWF0ZV9vYmpfZ2VuZXJhbCAocERhdGEsIHNpemVvZiAobW5nX2FuaV9iYWNrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ZyZWVfb2JqX2dlbmVyYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wcm9jZXNzX2FuaV9iYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFRlbXApOworICAgIGlmIChpUmV0Y29kZSkKKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICBwQkFDSyA9IChtbmdfYW5pX2JhY2twKXBUZW1wOworI2Vsc2UKKyAgICBNTkdfQUxMT0MgKHBEYXRhLCBwQkFDSywgc2l6ZW9mIChtbmdfYW5pX2JhY2spKTsKKworICAgIHBCQUNLLT5zSGVhZGVyLmZDbGVhbnVwID0gbW5nX2ZyZWVfYW5pX2JhY2s7CisgICAgcEJBQ0stPnNIZWFkZXIuZlByb2Nlc3MgPSBtbmdfcHJvY2Vzc19hbmlfYmFjazsKKyNlbmRpZgorCisgICAgbW5nX2FkZF9hbmlfb2JqZWN0IChwRGF0YSwgKG1uZ19vYmplY3RfaGVhZGVycClwQkFDSyk7CisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisgICAgcEJBQ0stPmlSZWQgICAgICAgPSBpUmVkOworICAgIHBCQUNLLT5pR3JlZW4gICAgID0gaUdyZWVuOworICAgIHBCQUNLLT5pQmx1ZSAgICAgID0gaUJsdWU7CisgICAgcEJBQ0stPmlNYW5kYXRvcnkgPSBpTWFuZGF0b3J5OworICAgIHBCQUNLLT5pSW1hZ2VpZCAgID0gaUltYWdlaWQ7CisgICAgcEJBQ0stPmlUaWxlICAgICAgPSBpVGlsZTsKKyNlbHNlCisgICAgcEJBQ0stPmlSZWQgICAgICAgPSBwRGF0YS0+aUJBQ0tyZWQ7ICAgICAgCisgICAgcEJBQ0stPmlHcmVlbiAgICAgPSBwRGF0YS0+aUJBQ0tncmVlbjsKKyAgICBwQkFDSy0+aUJsdWUgICAgICA9IHBEYXRhLT5pQkFDS2JsdWU7CisgICAgcEJBQ0stPmlNYW5kYXRvcnkgPSBwRGF0YS0+aUJBQ0ttYW5kYXRvcnk7CisgICAgcEJBQ0stPmlJbWFnZWlkICAgPSBwRGF0YS0+aUJBQ0tpbWFnZWlkOworICAgIHBCQUNLLT5pVGlsZSAgICAgID0gcERhdGEtPmlCQUNLdGlsZTsKKyNlbmRpZgorICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQ1JFQVRFX0FOSV9CQUNLLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfT0JKQ0xFQU5VUAorbW5nX3JldGNvZGUgbW5nX2ZyZWVfYW5pX2JhY2sgKG1uZ19kYXRhcCAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19vYmplY3RwIHBPYmplY3QpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfQU5JX0JBQ0ssIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfRlJFRVggKHBEYXRhLCBwT2JqZWN0LCBzaXplb2YgKG1uZ19hbmlfYmFjaykpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfQU5JX0JBQ0ssIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19wcm9jZXNzX2FuaV9iYWNrIChtbmdfZGF0YXAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfb2JqZWN0cCBwT2JqZWN0KQoreworICBtbmdfYW5pX2JhY2twIHBCQUNLID0gKG1uZ19hbmlfYmFja3ApcE9iamVjdDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9DRVNTX0FOSV9CQUNLLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcERhdGEtPmlCQUNLcmVkICAgICAgID0gcEJBQ0stPmlSZWQ7CisgIHBEYXRhLT5pQkFDS2dyZWVuICAgICA9IHBCQUNLLT5pR3JlZW47CisgIHBEYXRhLT5pQkFDS2JsdWUgICAgICA9IHBCQUNLLT5pQmx1ZTsKKyAgcERhdGEtPmlCQUNLbWFuZGF0b3J5ID0gcEJBQ0stPmlNYW5kYXRvcnk7CisgIHBEYXRhLT5pQkFDS2ltYWdlaWQgICA9IHBCQUNLLT5pSW1hZ2VpZDsKKyAgcERhdGEtPmlCQUNLdGlsZSAgICAgID0gcEJBQ0stPmlUaWxlOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST0NFU1NfQU5JX0JBQ0ssIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19GUkFNCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorbW5nX3JldGNvZGUgbW5nX2NyZWF0ZV9hbmlfZnJhbSAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaUZyYW1lbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaUNoYW5nZWRlbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpRGVsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggIGlDaGFuZ2V0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpVGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaUNoYW5nZWNsaXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICBpQ2xpcHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlDbGlwbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaUNsaXByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpQ2xpcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlDbGlwYikKKyNlbHNlCittbmdfcmV0Y29kZSBtbmdfY3JlYXRlX2FuaV9mcmFtIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2NodW5rcCBwQ2h1bmspCisjZW5kaWYKK3sKKyAgbW5nX2FuaV9mcmFtcCBwRlJBTTsKKyAgbW5nX3JldGNvZGUgICBpUmV0Y29kZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9DUkVBVEVfQU5JX0ZSQU0sIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAocERhdGEtPmJDYWNoZXBsYXliYWNrKSAgICAgICAgICAgLyogY2FjaGluZyBwbGF5YmFjayBpbmZvID8gKi8KKyAgeworI2lmZGVmIE1OR19PUFRJTUlaRV9PQkpDTEVBTlVQCisgICAgbW5nX3B0ciBwVGVtcDsKKyAgICBpUmV0Y29kZSA9IGNyZWF0ZV9vYmpfZ2VuZXJhbCAocERhdGEsIHNpemVvZiAobW5nX2FuaV9mcmFtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ZyZWVfb2JqX2dlbmVyYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wcm9jZXNzX2FuaV9mcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFRlbXApOworICAgIGlmIChpUmV0Y29kZSkKKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICBwRlJBTSA9IChtbmdfYW5pX2ZyYW1wKXBUZW1wOworI2Vsc2UKKyAgICBNTkdfQUxMT0MgKHBEYXRhLCBwRlJBTSwgc2l6ZW9mIChtbmdfYW5pX2ZyYW0pKTsKKworICAgIHBGUkFNLT5zSGVhZGVyLmZDbGVhbnVwID0gbW5nX2ZyZWVfYW5pX2ZyYW07CisgICAgcEZSQU0tPnNIZWFkZXIuZlByb2Nlc3MgPSBtbmdfcHJvY2Vzc19hbmlfZnJhbTsKKyNlbmRpZgorCisgICAgbW5nX2FkZF9hbmlfb2JqZWN0IChwRGF0YSwgKG1uZ19vYmplY3RfaGVhZGVycClwRlJBTSk7CisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisgICAgcEZSQU0tPmlGcmFtZW1vZGUgICAgICA9IGlGcmFtZW1vZGU7CisgICAgcEZSQU0tPmlDaGFuZ2VkZWxheSAgICA9IGlDaGFuZ2VkZWxheTsKKyAgICBwRlJBTS0+aURlbGF5ICAgICAgICAgID0gaURlbGF5OworICAgIHBGUkFNLT5pQ2hhbmdldGltZW91dCAgPSBpQ2hhbmdldGltZW91dDsKKyAgICBwRlJBTS0+aVRpbWVvdXQgICAgICAgID0gaVRpbWVvdXQ7CisgICAgcEZSQU0tPmlDaGFuZ2VjbGlwcGluZyA9IGlDaGFuZ2VjbGlwcGluZzsKKyAgICBwRlJBTS0+aUNsaXB0eXBlICAgICAgID0gaUNsaXB0eXBlOworICAgIHBGUkFNLT5pQ2xpcGwgICAgICAgICAgPSBpQ2xpcGw7CisgICAgcEZSQU0tPmlDbGlwciAgICAgICAgICA9IGlDbGlwcjsKKyAgICBwRlJBTS0+aUNsaXB0ICAgICAgICAgID0gaUNsaXB0OworICAgIHBGUkFNLT5pQ2xpcGIgICAgICAgICAgPSBpQ2xpcGI7CisjZWxzZQorICAgIHBGUkFNLT5pRnJhbWVtb2RlICAgICAgPSAoKG1uZ19mcmFtcClwQ2h1bmspLT5pTW9kZTsKKyAgICBwRlJBTS0+aUNoYW5nZWRlbGF5ICAgID0gKChtbmdfZnJhbXApcENodW5rKS0+aUNoYW5nZWRlbGF5OworICAgIHBGUkFNLT5pRGVsYXkgICAgICAgICAgPSAoKG1uZ19mcmFtcClwQ2h1bmspLT5pRGVsYXk7CisgICAgcEZSQU0tPmlDaGFuZ2V0aW1lb3V0ICA9ICgobW5nX2ZyYW1wKXBDaHVuayktPmlDaGFuZ2V0aW1lb3V0OworICAgIHBGUkFNLT5pVGltZW91dCAgICAgICAgPSAoKG1uZ19mcmFtcClwQ2h1bmspLT5pVGltZW91dDsKKyAgICBwRlJBTS0+aUNoYW5nZWNsaXBwaW5nID0gKChtbmdfZnJhbXApcENodW5rKS0+aUNoYW5nZWNsaXBwaW5nOworICAgIHBGUkFNLT5pQ2xpcHR5cGUgICAgICAgPSAoKG1uZ19mcmFtcClwQ2h1bmspLT5pQm91bmRhcnl0eXBlOworICAgIHBGUkFNLT5pQ2xpcGwgICAgICAgICAgPSAoKG1uZ19mcmFtcClwQ2h1bmspLT5pQm91bmRhcnlsOworICAgIHBGUkFNLT5pQ2xpcHIgICAgICAgICAgPSAoKG1uZ19mcmFtcClwQ2h1bmspLT5pQm91bmRhcnlyOworICAgIHBGUkFNLT5pQ2xpcHQgICAgICAgICAgPSAoKG1uZ19mcmFtcClwQ2h1bmspLT5pQm91bmRhcnl0OworICAgIHBGUkFNLT5pQ2xpcGIgICAgICAgICAgPSAoKG1uZ19mcmFtcClwQ2h1bmspLT5pQm91bmRhcnliOworI2VuZGlmCisgIH0KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfRElTUExBWUNBTExTCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorICBpUmV0Y29kZSA9IG1uZ19wcm9jZXNzX2Rpc3BsYXlfZnJhbSAocERhdGEsIGlGcmFtZW1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpQ2hhbmdlZGVsYXksIGlEZWxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlDaGFuZ2V0aW1lb3V0LCBpVGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlDaGFuZ2VjbGlwcGluZywgaUNsaXB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUNsaXBsLCBpQ2xpcHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpQ2xpcHQsIGlDbGlwYik7CisjZWxzZQorICBpUmV0Y29kZSA9IG1uZ19wcm9jZXNzX2Rpc3BsYXlfZnJhbSAocERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG1uZ19mcmFtcClwQ2h1bmspLT5pTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobW5nX2ZyYW1wKXBDaHVuayktPmlDaGFuZ2VkZWxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobW5nX2ZyYW1wKXBDaHVuayktPmlEZWxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobW5nX2ZyYW1wKXBDaHVuayktPmlDaGFuZ2V0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChtbmdfZnJhbXApcENodW5rKS0+aVRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG1uZ19mcmFtcClwQ2h1bmspLT5pQ2hhbmdlY2xpcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG1uZ19mcmFtcClwQ2h1bmspLT5pQm91bmRhcnl0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChtbmdfZnJhbXApcENodW5rKS0+aUJvdW5kYXJ5bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobW5nX2ZyYW1wKXBDaHVuayktPmlCb3VuZGFyeXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG1uZ19mcmFtcClwQ2h1bmspLT5pQm91bmRhcnl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChtbmdfZnJhbXApcENodW5rKS0+aUJvdW5kYXJ5Yik7CisjZW5kaWYKKyNlbHNlCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorICBwRGF0YS0+aVRlbXBGcmFtZW1vZGUgICAgICA9IGlGcmFtZW1vZGU7CisgIHBEYXRhLT5pVGVtcENoYW5nZWRlbGF5ICAgID0gaUNoYW5nZWRlbGF5OworICBwRGF0YS0+aVRlbXBEZWxheSAgICAgICAgICA9IGlEZWxheTsKKyAgcERhdGEtPmlUZW1wQ2hhbmdldGltZW91dCAgPSBpQ2hhbmdldGltZW91dDsKKyAgcERhdGEtPmlUZW1wVGltZW91dCAgICAgICAgPSBpVGltZW91dDsKKyAgcERhdGEtPmlUZW1wQ2hhbmdlY2xpcHBpbmcgPSBpQ2hhbmdlY2xpcHBpbmc7CisgIHBEYXRhLT5pVGVtcENsaXB0eXBlICAgICAgID0gaUNsaXB0eXBlOworICBwRGF0YS0+aVRlbXBDbGlwbCAgICAgICAgICA9IGlDbGlwbDsKKyAgcERhdGEtPmlUZW1wQ2xpcHIgICAgICAgICAgPSBpQ2xpcHI7CisgIHBEYXRhLT5pVGVtcENsaXB0ICAgICAgICAgID0gaUNsaXB0OworICBwRGF0YS0+aVRlbXBDbGlwYiAgICAgICAgICA9IGlDbGlwYjsKKyNlbHNlCisgIHBEYXRhLT5pVGVtcEZyYW1lbW9kZSAgICAgID0gKChtbmdfZnJhbXApcENodW5rKS0+aU1vZGU7CisgIHBEYXRhLT5pVGVtcENoYW5nZWRlbGF5ICAgID0gKChtbmdfZnJhbXApcENodW5rKS0+aUNoYW5nZWRlbGF5OworICBwRGF0YS0+aVRlbXBEZWxheSAgICAgICAgICA9ICgobW5nX2ZyYW1wKXBDaHVuayktPmlEZWxheTsKKyAgcERhdGEtPmlUZW1wQ2hhbmdldGltZW91dCAgPSAoKG1uZ19mcmFtcClwQ2h1bmspLT5pQ2hhbmdldGltZW91dDsKKyAgcERhdGEtPmlUZW1wVGltZW91dCAgICAgICAgPSAoKG1uZ19mcmFtcClwQ2h1bmspLT5pVGltZW91dDsKKyAgcERhdGEtPmlUZW1wQ2hhbmdlY2xpcHBpbmcgPSAoKG1uZ19mcmFtcClwQ2h1bmspLT5pQ2hhbmdlY2xpcHBpbmc7CisgIHBEYXRhLT5pVGVtcENsaXB0eXBlICAgICAgID0gKChtbmdfZnJhbXApcENodW5rKS0+aUJvdW5kYXJ5dHlwZTsKKyAgcERhdGEtPmlUZW1wQ2xpcGwgICAgICAgICAgPSAoKG1uZ19mcmFtcClwQ2h1bmspLT5pQm91bmRhcnlsOworICBwRGF0YS0+aVRlbXBDbGlwciAgICAgICAgICA9ICgobW5nX2ZyYW1wKXBDaHVuayktPmlCb3VuZGFyeXI7CisgIHBEYXRhLT5pVGVtcENsaXB0ICAgICAgICAgID0gKChtbmdfZnJhbXApcENodW5rKS0+aUJvdW5kYXJ5dDsKKyAgcERhdGEtPmlUZW1wQ2xpcGIgICAgICAgICAgPSAoKG1uZ19mcmFtcClwQ2h1bmspLT5pQm91bmRhcnliOworI2VuZGlmCisKKyAgaVJldGNvZGUgPSBtbmdfcHJvY2Vzc19kaXNwbGF5X2ZyYW0gKHBEYXRhKTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0NSRUFURV9BTklfRlJBTSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gaVJldGNvZGU7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX09CSkNMRUFOVVAKK21uZ19yZXRjb2RlIG1uZ19mcmVlX2FuaV9mcmFtIChtbmdfZGF0YXAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfb2JqZWN0cCBwT2JqZWN0KQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX0FOSV9GUkFNLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX0ZSRUVYIChwRGF0YSwgcE9iamVjdCwgc2l6ZW9mIChtbmdfYW5pX2ZyYW0pKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX0FOSV9GUkFNLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19hbmlfZnJhbSAobW5nX2RhdGFwICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX29iamVjdHAgcE9iamVjdCkKK3sKKyAgbW5nX2FuaV9mcmFtcCBwRlJBTSA9IChtbmdfYW5pX2ZyYW1wKXBPYmplY3Q7CisgIG1uZ19yZXRjb2RlICAgaVJldGNvZGU7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19BTklfRlJBTSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmIChwRGF0YS0+aUJyZWFrcG9pbnQpICAgICAgICAgICAgICAvKiBwcmV2aW91c2x5IGJyb2tlbiA/ICovCisgIHsKKyAgICBpUmV0Y29kZSAgICAgICAgICAgPSBtbmdfcHJvY2Vzc19kaXNwbGF5X2ZyYW0yIChwRGF0YSk7CisgICAgcERhdGEtPmlCcmVha3BvaW50ID0gMDsgICAgICAgICAgICAvKiBub3QgYWdhaW4gKi8KKyAgfQorICBlbHNlCisgIHsKKyNpZm5kZWYgTU5HX09QVElNSVpFX0RJU1BMQVlDQUxMUworICAgIGlSZXRjb2RlID0gbW5nX3Byb2Nlc3NfZGlzcGxheV9mcmFtIChwRGF0YSwgcEZSQU0tPmlGcmFtZW1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGUkFNLT5pQ2hhbmdlZGVsYXksIHBGUkFNLT5pRGVsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGUkFNLT5pQ2hhbmdldGltZW91dCwgcEZSQU0tPmlUaW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRlJBTS0+aUNoYW5nZWNsaXBwaW5nLCBwRlJBTS0+aUNsaXB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRlJBTS0+aUNsaXBsLCBwRlJBTS0+aUNsaXByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRlJBTS0+aUNsaXB0LCBwRlJBTS0+aUNsaXBiKTsKKyNlbHNlCisgICAgcERhdGEtPmlUZW1wRnJhbWVtb2RlICAgICAgPSBwRlJBTS0+aUZyYW1lbW9kZTsKKyAgICBwRGF0YS0+aVRlbXBDaGFuZ2VkZWxheSAgICA9IHBGUkFNLT5pQ2hhbmdlZGVsYXk7CisgICAgcERhdGEtPmlUZW1wRGVsYXkgICAgICAgICAgPSBwRlJBTS0+aURlbGF5OworICAgIHBEYXRhLT5pVGVtcENoYW5nZXRpbWVvdXQgID0gcEZSQU0tPmlDaGFuZ2V0aW1lb3V0OworICAgIHBEYXRhLT5pVGVtcFRpbWVvdXQgICAgICAgID0gcEZSQU0tPmlUaW1lb3V0OworICAgIHBEYXRhLT5pVGVtcENoYW5nZWNsaXBwaW5nID0gcEZSQU0tPmlDaGFuZ2VjbGlwcGluZzsKKyAgICBwRGF0YS0+aVRlbXBDbGlwdHlwZSAgICAgICA9IHBGUkFNLT5pQ2xpcHR5cGU7CisgICAgcERhdGEtPmlUZW1wQ2xpcGwgICAgICAgICAgPSBwRlJBTS0+aUNsaXBsOworICAgIHBEYXRhLT5pVGVtcENsaXByICAgICAgICAgID0gcEZSQU0tPmlDbGlwcjsKKyAgICBwRGF0YS0+aVRlbXBDbGlwdCAgICAgICAgICA9IHBGUkFNLT5pQ2xpcHQ7CisgICAgcERhdGEtPmlUZW1wQ2xpcGIgICAgICAgICAgPSBwRlJBTS0+aUNsaXBiOworCisgICAgaVJldGNvZGUgPSBtbmdfcHJvY2Vzc19kaXNwbGF5X2ZyYW0gKHBEYXRhKTsKKyNlbmRpZgorICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19BTklfRlJBTSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gaVJldGNvZGU7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX01PVkUKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCittbmdfcmV0Y29kZSBtbmdfY3JlYXRlX2FuaV9tb3ZlIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpRmlyc3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaUxhc3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlMb2NheCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaUxvY2F5KQorI2Vsc2UKK21uZ19yZXRjb2RlIG1uZ19jcmVhdGVfYW5pX21vdmUgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfY2h1bmtwIHBDaHVuaykKKyNlbmRpZgoreworICBtbmdfYW5pX21vdmVwIHBNT1ZFOworICBtbmdfcmV0Y29kZSAgIGlSZXRjb2RlOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0NSRUFURV9BTklfTU9WRSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmIChwRGF0YS0+YkNhY2hlcGxheWJhY2spICAgICAgICAgICAvKiBjYWNoaW5nIHBsYXliYWNrIGluZm8gPyAqLworICB7CisjaWZkZWYgTU5HX09QVElNSVpFX09CSkNMRUFOVVAKKyAgICBtbmdfcHRyIHBUZW1wOworICAgIGlSZXRjb2RlID0gY3JlYXRlX29ial9nZW5lcmFsIChwRGF0YSwgc2l6ZW9mIChtbmdfYW5pX21vdmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfZnJlZV9vYmpfZ2VuZXJhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3Byb2Nlc3NfYW5pX21vdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwVGVtcCk7CisgICAgaWYgKGlSZXRjb2RlKQorICAgICAgcmV0dXJuIGlSZXRjb2RlOworICAgIHBNT1ZFID0gKG1uZ19hbmlfbW92ZXApcFRlbXA7CisjZWxzZQorICAgIE1OR19BTExPQyAocERhdGEsIHBNT1ZFLCBzaXplb2YgKG1uZ19hbmlfbW92ZSkpOworCisgICAgcE1PVkUtPnNIZWFkZXIuZkNsZWFudXAgPSBtbmdfZnJlZV9hbmlfbW92ZTsKKyAgICBwTU9WRS0+c0hlYWRlci5mUHJvY2VzcyA9IG1uZ19wcm9jZXNzX2FuaV9tb3ZlOworI2VuZGlmCisKKyAgICBtbmdfYWRkX2FuaV9vYmplY3QgKHBEYXRhLCAobW5nX29iamVjdF9oZWFkZXJwKXBNT1ZFKTsKKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyAgICBwTU9WRS0+aUZpcnN0aWQgPSBpRmlyc3RpZDsKKyAgICBwTU9WRS0+aUxhc3RpZCAgPSBpTGFzdGlkOworICAgIHBNT1ZFLT5pVHlwZSAgICA9IGlUeXBlOworICAgIHBNT1ZFLT5pTG9jYXggICA9IGlMb2NheDsKKyAgICBwTU9WRS0+aUxvY2F5ICAgPSBpTG9jYXk7CisjZWxzZQorICAgIHBNT1ZFLT5pRmlyc3RpZCA9ICgobW5nX21vdmVwKXBDaHVuayktPmlGaXJzdGlkOworICAgIHBNT1ZFLT5pTGFzdGlkICA9ICgobW5nX21vdmVwKXBDaHVuayktPmlMYXN0aWQ7CisgICAgcE1PVkUtPmlUeXBlICAgID0gKChtbmdfbW92ZXApcENodW5rKS0+aU1vdmV0eXBlOworICAgIHBNT1ZFLT5pTG9jYXggICA9ICgobW5nX21vdmVwKXBDaHVuayktPmlNb3ZleDsKKyAgICBwTU9WRS0+aUxvY2F5ICAgPSAoKG1uZ19tb3ZlcClwQ2h1bmspLT5pTW92ZXk7CisjZW5kaWYKKyAgfQorCisjaWZuZGVmIE1OR19PUFRJTUlaRV9ESVNQTEFZQ0FMTFMKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisgIGlSZXRjb2RlID0gbW5nX3Byb2Nlc3NfZGlzcGxheV9tb3ZlIChwRGF0YSwgaUZpcnN0aWQsIGlMYXN0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpVHlwZSwgaUxvY2F4LCBpTG9jYXkpOworI2Vsc2UKKyAgaVJldGNvZGUgPSBtbmdfcHJvY2Vzc19kaXNwbGF5X21vdmUgKHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChtbmdfbW92ZXApcENodW5rKS0+aUZpcnN0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG1uZ19tb3ZlcClwQ2h1bmspLT5pTGFzdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChtbmdfbW92ZXApcENodW5rKS0+aU1vdmV0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChtbmdfbW92ZXApcENodW5rKS0+aU1vdmV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChtbmdfbW92ZXApcENodW5rKS0+aU1vdmV5KTsKKyNlbmRpZgorI2Vsc2UKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisgIHBEYXRhLT5pTU9WRWZyb21pZCAgID0gaUZpcnN0aWQ7CisgIHBEYXRhLT5pTU9WRXRvaWQgICAgID0gaUxhc3RpZDsKKyAgcERhdGEtPmlNT1ZFbW92ZXR5cGUgPSBpVHlwZTsKKyAgcERhdGEtPmlNT1ZFbW92ZXggICAgPSBpTG9jYXg7CisgIHBEYXRhLT5pTU9WRW1vdmV5ICAgID0gaUxvY2F5OworI2Vsc2UKKyAgcERhdGEtPmlNT1ZFZnJvbWlkICAgPSAoKG1uZ19tb3ZlcClwQ2h1bmspLT5pRmlyc3RpZDsKKyAgcERhdGEtPmlNT1ZFdG9pZCAgICAgPSAoKG1uZ19tb3ZlcClwQ2h1bmspLT5pTGFzdGlkOworICBwRGF0YS0+aU1PVkVtb3ZldHlwZSA9ICgobW5nX21vdmVwKXBDaHVuayktPmlNb3ZldHlwZTsKKyAgcERhdGEtPmlNT1ZFbW92ZXggICAgPSAoKG1uZ19tb3ZlcClwQ2h1bmspLT5pTW92ZXg7CisgIHBEYXRhLT5pTU9WRW1vdmV5ICAgID0gKChtbmdfbW92ZXApcENodW5rKS0+aU1vdmV5OworI2VuZGlmCisKKyAgaVJldGNvZGUgPSBtbmdfcHJvY2Vzc19kaXNwbGF5X21vdmUgKHBEYXRhKTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0NSRUFURV9BTklfTU9WRSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gaVJldGNvZGU7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX09CSkNMRUFOVVAKK21uZ19yZXRjb2RlIG1uZ19mcmVlX2FuaV9tb3ZlIChtbmdfZGF0YXAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfb2JqZWN0cCBwT2JqZWN0KQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX0FOSV9NT1ZFLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX0ZSRUVYIChwRGF0YSwgcE9iamVjdCwgc2l6ZW9mIChtbmdfYW5pX21vdmUpKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX0FOSV9NT1ZFLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19hbmlfbW92ZSAobW5nX2RhdGFwICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX29iamVjdHAgcE9iamVjdCkKK3sKKyAgbW5nX3JldGNvZGUgICBpUmV0Y29kZTsKKyAgbW5nX2FuaV9tb3ZlcCBwTU9WRSA9IChtbmdfYW5pX21vdmVwKXBPYmplY3Q7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19BTklfTU9WRSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmUtcHJvY2VzcyB0aGUgTU9WRSBjaHVuayAqLworI2lmbmRlZiBNTkdfT1BUSU1JWkVfRElTUExBWUNBTExTCisgIGlSZXRjb2RlID0gbW5nX3Byb2Nlc3NfZGlzcGxheV9tb3ZlIChwRGF0YSwgcE1PVkUtPmlGaXJzdGlkLCBwTU9WRS0+aUxhc3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNT1ZFLT5pVHlwZSwgcE1PVkUtPmlMb2NheCwgcE1PVkUtPmlMb2NheSk7CisjZWxzZQorICBwRGF0YS0+aU1PVkVmcm9taWQgICA9IHBNT1ZFLT5pRmlyc3RpZDsKKyAgcERhdGEtPmlNT1ZFdG9pZCAgICAgPSBwTU9WRS0+aUxhc3RpZDsKKyAgcERhdGEtPmlNT1ZFbW92ZXR5cGUgPSBwTU9WRS0+aVR5cGU7CisgIHBEYXRhLT5pTU9WRW1vdmV4ICAgID0gcE1PVkUtPmlMb2NheDsKKyAgcERhdGEtPmlNT1ZFbW92ZXkgICAgPSBwTU9WRS0+aUxvY2F5OworCisgIGlSZXRjb2RlID0gbW5nX3Byb2Nlc3NfZGlzcGxheV9tb3ZlIChwRGF0YSk7CisjZW5kaWYKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9DRVNTX0FOSV9NT1ZFLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBpUmV0Y29kZTsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfQ0xJUAorI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKK21uZ19yZXRjb2RlIG1uZ19jcmVhdGVfYW5pX2NsaXAgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlGaXJzdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTGFzdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICBpVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaUNsaXBsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpQ2xpcHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlDbGlwdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaUNsaXBiKQorI2Vsc2UKK21uZ19yZXRjb2RlIG1uZ19jcmVhdGVfYW5pX2NsaXAgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfY2h1bmtwIHBDaHVuaykKKyNlbmRpZgoreworICBtbmdfYW5pX2NsaXBwIHBDTElQOworICBtbmdfcmV0Y29kZSAgIGlSZXRjb2RlOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0NSRUFURV9BTklfQ0xJUCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmIChwRGF0YS0+YkNhY2hlcGxheWJhY2spICAgICAgICAgICAvKiBjYWNoaW5nIHBsYXliYWNrIGluZm8gPyAqLworICB7CisjaWZkZWYgTU5HX09QVElNSVpFX09CSkNMRUFOVVAKKyAgICBtbmdfcHRyIHBUZW1wOworICAgIGlSZXRjb2RlID0gY3JlYXRlX29ial9nZW5lcmFsIChwRGF0YSwgc2l6ZW9mIChtbmdfYW5pX2NsaXApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfZnJlZV9vYmpfZ2VuZXJhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3Byb2Nlc3NfYW5pX2NsaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwVGVtcCk7CisgICAgaWYgKGlSZXRjb2RlKQorICAgICAgcmV0dXJuIGlSZXRjb2RlOworICAgIHBDTElQID0gKG1uZ19hbmlfY2xpcHApcFRlbXA7CisjZWxzZQorICAgIE1OR19BTExPQyAocERhdGEsIHBDTElQLCBzaXplb2YgKG1uZ19hbmlfY2xpcCkpOworCisgICAgcENMSVAtPnNIZWFkZXIuZkNsZWFudXAgPSBtbmdfZnJlZV9hbmlfY2xpcDsKKyAgICBwQ0xJUC0+c0hlYWRlci5mUHJvY2VzcyA9IG1uZ19wcm9jZXNzX2FuaV9jbGlwOworI2VuZGlmCisKKyAgICBtbmdfYWRkX2FuaV9vYmplY3QgKHBEYXRhLCAobW5nX29iamVjdF9oZWFkZXJwKXBDTElQKTsKKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyAgICBwQ0xJUC0+aUZpcnN0aWQgPSBpRmlyc3RpZDsKKyAgICBwQ0xJUC0+aUxhc3RpZCAgPSBpTGFzdGlkOworICAgIHBDTElQLT5pVHlwZSAgICA9IGlUeXBlOworICAgIHBDTElQLT5pQ2xpcGwgICA9IGlDbGlwbDsKKyAgICBwQ0xJUC0+aUNsaXByICAgPSBpQ2xpcHI7CisgICAgcENMSVAtPmlDbGlwdCAgID0gaUNsaXB0OworICAgIHBDTElQLT5pQ2xpcGIgICA9IGlDbGlwYjsKKyNlbHNlCisgICAgcENMSVAtPmlGaXJzdGlkID0gKChtbmdfY2xpcHApcENodW5rKS0+aUZpcnN0aWQ7CisgICAgcENMSVAtPmlMYXN0aWQgID0gKChtbmdfY2xpcHApcENodW5rKS0+aUxhc3RpZDsKKyAgICBwQ0xJUC0+aVR5cGUgICAgPSAoKG1uZ19jbGlwcClwQ2h1bmspLT5pQ2xpcHR5cGU7CisgICAgcENMSVAtPmlDbGlwbCAgID0gKChtbmdfY2xpcHApcENodW5rKS0+aUNsaXBsOworICAgIHBDTElQLT5pQ2xpcHIgICA9ICgobW5nX2NsaXBwKXBDaHVuayktPmlDbGlwcjsKKyAgICBwQ0xJUC0+aUNsaXB0ICAgPSAoKG1uZ19jbGlwcClwQ2h1bmspLT5pQ2xpcHQ7CisgICAgcENMSVAtPmlDbGlwYiAgID0gKChtbmdfY2xpcHApcENodW5rKS0+aUNsaXBiOworI2VuZGlmCisgIH0KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfRElTUExBWUNBTExTCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorICBpUmV0Y29kZSA9IG1uZ19wcm9jZXNzX2Rpc3BsYXlfY2xpcCAocERhdGEsIGlGaXJzdGlkLCBpTGFzdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVR5cGUsIGlDbGlwbCwgaUNsaXByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUNsaXB0LCBpQ2xpcGIpOworI2Vsc2UKKyAgaVJldGNvZGUgPSBtbmdfcHJvY2Vzc19kaXNwbGF5X2NsaXAgKHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChtbmdfY2xpcHApcENodW5rKS0+aUZpcnN0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG1uZ19jbGlwcClwQ2h1bmspLT5pTGFzdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChtbmdfY2xpcHApcENodW5rKS0+aUNsaXB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChtbmdfY2xpcHApcENodW5rKS0+aUNsaXBsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChtbmdfY2xpcHApcENodW5rKS0+aUNsaXByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChtbmdfY2xpcHApcENodW5rKS0+aUNsaXB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChtbmdfY2xpcHApcENodW5rKS0+aUNsaXBiKTsKKyNlbmRpZgorI2Vsc2UKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisgIHBEYXRhLT5pQ0xJUGZyb21pZCAgID0gaUZpcnN0aWQ7CisgIHBEYXRhLT5pQ0xJUHRvaWQgICAgID0gaUxhc3RpZDsKKyAgcERhdGEtPmlDTElQY2xpcHR5cGUgPSBpVHlwZTsKKyAgcERhdGEtPmlDTElQY2xpcGwgICAgPSBpQ2xpcGw7CisgIHBEYXRhLT5pQ0xJUGNsaXByICAgID0gaUNsaXByOworICBwRGF0YS0+aUNMSVBjbGlwdCAgICA9IGlDbGlwdDsKKyAgcERhdGEtPmlDTElQY2xpcGIgICAgPSBpQ2xpcGI7CisjZWxzZQorICBwRGF0YS0+aUNMSVBmcm9taWQgICA9ICgobW5nX2NsaXBwKXBDaHVuayktPmlGaXJzdGlkOworICBwRGF0YS0+aUNMSVB0b2lkICAgICA9ICgobW5nX2NsaXBwKXBDaHVuayktPmlMYXN0aWQ7CisgIHBEYXRhLT5pQ0xJUGNsaXB0eXBlID0gKChtbmdfY2xpcHApcENodW5rKS0+aUNsaXB0eXBlOworICBwRGF0YS0+aUNMSVBjbGlwbCAgICA9ICgobW5nX2NsaXBwKXBDaHVuayktPmlDbGlwbDsKKyAgcERhdGEtPmlDTElQY2xpcHIgICAgPSAoKG1uZ19jbGlwcClwQ2h1bmspLT5pQ2xpcHI7CisgIHBEYXRhLT5pQ0xJUGNsaXB0ICAgID0gKChtbmdfY2xpcHApcENodW5rKS0+aUNsaXB0OworICBwRGF0YS0+aUNMSVBjbGlwYiAgICA9ICgobW5nX2NsaXBwKXBDaHVuayktPmlDbGlwYjsKKyNlbmRpZgorCisgIGlSZXRjb2RlID0gbW5nX3Byb2Nlc3NfZGlzcGxheV9jbGlwIChwRGF0YSk7CisjZW5kaWYKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9DUkVBVEVfQU5JX0NMSVAsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIGlSZXRjb2RlOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9PQkpDTEVBTlVQCittbmdfcmV0Y29kZSBtbmdfZnJlZV9hbmlfY2xpcCAobW5nX2RhdGFwICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX29iamVjdHAgcE9iamVjdCkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9BTklfQ0xJUCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19GUkVFWCAocERhdGEsIHBPYmplY3QsIHNpemVvZiAobW5nX2FuaV9jbGlwKSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9BTklfQ0xJUCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfYW5pX2NsaXAgKG1uZ19kYXRhcCAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19vYmplY3RwIHBPYmplY3QpCit7CisgIG1uZ19yZXRjb2RlICAgaVJldGNvZGU7CisgIG1uZ19hbmlfY2xpcHAgcENMSVAgPSAobW5nX2FuaV9jbGlwcClwT2JqZWN0OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST0NFU1NfQU5JX0NMSVAsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlLXByb2Nlc3MgdGhlIENMSVAgY2h1bmsgKi8KKyNpZm5kZWYgTU5HX09QVElNSVpFX0RJU1BMQVlDQUxMUworICBpUmV0Y29kZSA9IG1uZ19wcm9jZXNzX2Rpc3BsYXlfY2xpcCAocERhdGEsIHBDTElQLT5pRmlyc3RpZCwgcENMSVAtPmlMYXN0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ0xJUC0+aVR5cGUsIHBDTElQLT5pQ2xpcGwsIHBDTElQLT5pQ2xpcHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ0xJUC0+aUNsaXB0LCBwQ0xJUC0+aUNsaXBiKTsKKyNlbHNlCisgIHBEYXRhLT5pQ0xJUGZyb21pZCAgID0gcENMSVAtPmlGaXJzdGlkOworICBwRGF0YS0+aUNMSVB0b2lkICAgICA9IHBDTElQLT5pTGFzdGlkOworICBwRGF0YS0+aUNMSVBjbGlwdHlwZSA9IHBDTElQLT5pVHlwZTsKKyAgcERhdGEtPmlDTElQY2xpcGwgICAgPSBwQ0xJUC0+aUNsaXBsOworICBwRGF0YS0+aUNMSVBjbGlwciAgICA9IHBDTElQLT5pQ2xpcHI7CisgIHBEYXRhLT5pQ0xJUGNsaXB0ICAgID0gcENMSVAtPmlDbGlwdDsKKyAgcERhdGEtPmlDTElQY2xpcGIgICAgPSBwQ0xJUC0+aUNsaXBiOworCisgIGlSZXRjb2RlID0gbW5nX3Byb2Nlc3NfZGlzcGxheV9jbGlwIChwRGF0YSk7CisjZW5kaWYKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9DRVNTX0FOSV9DTElQLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBpUmV0Y29kZTsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfU0hPVworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKK21uZ19yZXRjb2RlIG1uZ19jcmVhdGVfYW5pX3Nob3cgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlGaXJzdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTGFzdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICBpTW9kZSkKKyNlbHNlCittbmdfcmV0Y29kZSBtbmdfY3JlYXRlX2FuaV9zaG93IChtbmdfZGF0YXAgIHBEYXRhKQorI2VuZGlmCit7CisgIG1uZ19hbmlfc2hvd3AgcFNIT1c7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQ1JFQVRFX0FOSV9TSE9XLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKHBEYXRhLT5iQ2FjaGVwbGF5YmFjaykgICAgICAgICAgIC8qIGNhY2hpbmcgcGxheWJhY2sgaW5mbyA/ICovCisgIHsKKyNpZmRlZiBNTkdfT1BUSU1JWkVfT0JKQ0xFQU5VUAorICAgIG1uZ19wdHIgICAgIHBUZW1wOworICAgIG1uZ19yZXRjb2RlIGlSZXRjb2RlID0gY3JlYXRlX29ial9nZW5lcmFsIChwRGF0YSwgc2l6ZW9mIChtbmdfYW5pX3Nob3cpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfZnJlZV9vYmpfZ2VuZXJhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3Byb2Nlc3NfYW5pX3Nob3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwVGVtcCk7CisgICAgaWYgKGlSZXRjb2RlKQorICAgICAgcmV0dXJuIGlSZXRjb2RlOworICAgIHBTSE9XID0gKG1uZ19hbmlfc2hvd3ApcFRlbXA7CisjZWxzZQorICAgIE1OR19BTExPQyAocERhdGEsIHBTSE9XLCBzaXplb2YgKG1uZ19hbmlfc2hvdykpOworCisgICAgcFNIT1ctPnNIZWFkZXIuZkNsZWFudXAgPSBtbmdfZnJlZV9hbmlfc2hvdzsKKyAgICBwU0hPVy0+c0hlYWRlci5mUHJvY2VzcyA9IG1uZ19wcm9jZXNzX2FuaV9zaG93OworI2VuZGlmCisKKyAgICBtbmdfYWRkX2FuaV9vYmplY3QgKHBEYXRhLCAobW5nX29iamVjdF9oZWFkZXJwKXBTSE9XKTsKKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyAgICBwU0hPVy0+aUZpcnN0aWQgPSBpRmlyc3RpZDsKKyAgICBwU0hPVy0+aUxhc3RpZCAgPSBpTGFzdGlkOworICAgIHBTSE9XLT5pTW9kZSAgICA9IGlNb2RlOworI2Vsc2UKKyAgICBwU0hPVy0+aUZpcnN0aWQgPSBwRGF0YS0+aVNIT1dmcm9taWQ7CisgICAgcFNIT1ctPmlMYXN0aWQgID0gcERhdGEtPmlTSE9XdG9pZDsKKyAgICBwU0hPVy0+aU1vZGUgICAgPSBwRGF0YS0+aVNIT1dtb2RlOworI2VuZGlmCisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9DUkVBVEVfQU5JX1NIT1csIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9PQkpDTEVBTlVQCittbmdfcmV0Y29kZSBtbmdfZnJlZV9hbmlfc2hvdyAobW5nX2RhdGFwICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX29iamVjdHAgcE9iamVjdCkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9BTklfU0hPVywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19GUkVFWCAocERhdGEsIHBPYmplY3QsIHNpemVvZiAobW5nX2FuaV9zaG93KSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9BTklfU0hPVywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfYW5pX3Nob3cgKG1uZ19kYXRhcCAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19vYmplY3RwIHBPYmplY3QpCit7CisgIG1uZ19yZXRjb2RlICAgaVJldGNvZGU7CisgIG1uZ19hbmlfc2hvd3AgcFNIT1cgPSAobW5nX2FuaV9zaG93cClwT2JqZWN0OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST0NFU1NfQU5JX1NIT1csIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAocERhdGEtPmlCcmVha3BvaW50KSAgICAgICAgICAgICAgLyogcmV0dXJuaW5nIGZyb20gYnJlYWtwb2ludCA/ICovCisgIHsKKyAgICBpUmV0Y29kZSAgICAgICAgICAgPSBtbmdfcHJvY2Vzc19kaXNwbGF5X3Nob3cgKHBEYXRhKTsKKyAgfQorICBlbHNlCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAicmUtcnVuIiBTSE9XIGNodW5rICovCisgICAgcERhdGEtPmlTSE9XbW9kZSAgID0gcFNIT1ctPmlNb2RlOworICAgIHBEYXRhLT5pU0hPV2Zyb21pZCA9IHBTSE9XLT5pRmlyc3RpZDsKKyAgICBwRGF0YS0+aVNIT1d0b2lkICAgPSBwU0hPVy0+aUxhc3RpZDsKKworICAgIGlSZXRjb2RlICAgICAgICAgICA9IG1uZ19wcm9jZXNzX2Rpc3BsYXlfc2hvdyAocERhdGEpOworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19BTklfU0hPVywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gaVJldGNvZGU7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX1RFUk0KKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCittbmdfcmV0Y29kZSBtbmdfY3JlYXRlX2FuaV90ZXJtIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICBpVGVybWFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaUl0ZXJhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlEZWxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaUl0ZXJtYXgpCisjZWxzZQorbW5nX3JldGNvZGUgbW5nX2NyZWF0ZV9hbmlfdGVybSAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19jaHVua3AgcENodW5rKQorI2VuZGlmCit7CisgIG1uZ19hbmlfdGVybXAgcFRFUk07CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQ1JFQVRFX0FOSV9URVJNLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKHBEYXRhLT5iQ2FjaGVwbGF5YmFjaykgICAgICAgICAgIC8qIGNhY2hpbmcgcGxheWJhY2sgaW5mbyA/ICovCisgIHsKKyNpZmRlZiBNTkdfT1BUSU1JWkVfT0JKQ0xFQU5VUAorICAgIG1uZ19wdHIgICAgIHBUZW1wOworICAgIG1uZ19yZXRjb2RlIGlSZXRjb2RlID0gY3JlYXRlX29ial9nZW5lcmFsIChwRGF0YSwgc2l6ZW9mIChtbmdfYW5pX3Rlcm0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfZnJlZV9vYmpfZ2VuZXJhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3Byb2Nlc3NfYW5pX3Rlcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwVGVtcCk7CisgICAgaWYgKGlSZXRjb2RlKQorICAgICAgcmV0dXJuIGlSZXRjb2RlOworICAgIHBURVJNID0gKG1uZ19hbmlfdGVybXApcFRlbXA7CisjZWxzZQorICAgIE1OR19BTExPQyAocERhdGEsIHBURVJNLCBzaXplb2YgKG1uZ19hbmlfdGVybSkpOworCisgICAgcFRFUk0tPnNIZWFkZXIuZkNsZWFudXAgPSBtbmdfZnJlZV9hbmlfdGVybTsKKyAgICBwVEVSTS0+c0hlYWRlci5mUHJvY2VzcyA9IG1uZ19wcm9jZXNzX2FuaV90ZXJtOworI2VuZGlmCisKKyAgICBtbmdfYWRkX2FuaV9vYmplY3QgKHBEYXRhLCAobW5nX29iamVjdF9oZWFkZXJwKXBURVJNKTsKKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyAgICBwVEVSTS0+aVRlcm1hY3Rpb24gPSBpVGVybWFjdGlvbjsKKyAgICBwVEVSTS0+aUl0ZXJhY3Rpb24gPSBpSXRlcmFjdGlvbjsKKyAgICBwVEVSTS0+aURlbGF5ICAgICAgPSBpRGVsYXk7CisgICAgcFRFUk0tPmlJdGVybWF4ICAgID0gaUl0ZXJtYXg7CisjZWxzZQorICAgIHBURVJNLT5pVGVybWFjdGlvbiA9ICgobW5nX3Rlcm1wKXBDaHVuayktPmlUZXJtYWN0aW9uOworICAgIHBURVJNLT5pSXRlcmFjdGlvbiA9ICgobW5nX3Rlcm1wKXBDaHVuayktPmlJdGVyYWN0aW9uOworICAgIHBURVJNLT5pRGVsYXkgICAgICA9ICgobW5nX3Rlcm1wKXBDaHVuayktPmlEZWxheTsKKyAgICBwVEVSTS0+aUl0ZXJtYXggICAgPSAoKG1uZ190ZXJtcClwQ2h1bmspLT5pSXRlcm1heDsKKyNlbmRpZgorICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQ1JFQVRFX0FOSV9URVJNLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfT0JKQ0xFQU5VUAorbW5nX3JldGNvZGUgbW5nX2ZyZWVfYW5pX3Rlcm0gKG1uZ19kYXRhcCAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19vYmplY3RwIHBPYmplY3QpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfQU5JX1RFUk0sIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfRlJFRVggKHBEYXRhLCBwT2JqZWN0LCBzaXplb2YgKG1uZ19hbmlfdGVybSkpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfQU5JX1RFUk0sIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19wcm9jZXNzX2FuaV90ZXJtIChtbmdfZGF0YXAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfb2JqZWN0cCBwT2JqZWN0KQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9DRVNTX0FOSV9URVJNLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgLyogZHVtbXk6IG5vIGFjdGlvbiByZXF1aXJlZCEgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9DRVNTX0FOSV9URVJNLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfU0FWRQorbW5nX3JldGNvZGUgbW5nX2NyZWF0ZV9hbmlfc2F2ZSAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfcHRyICAgICAgIHBUZW1wOworICBtbmdfYW5pX3NhdmVwIHBTQVZFOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0NSRUFURV9BTklfU0FWRSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmIChwRGF0YS0+YkNhY2hlcGxheWJhY2spICAgICAgICAgICAvKiBjYWNoaW5nIHBsYXliYWNrIGluZm8gPyAqLworICB7CisjaWZkZWYgTU5HX09QVElNSVpFX09CSkNMRUFOVVAKKyAgICBtbmdfcmV0Y29kZSBpUmV0Y29kZSA9IGNyZWF0ZV9vYmpfZ2VuZXJhbCAocERhdGEsIHNpemVvZiAobW5nX2FuaV9zYXZlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ZyZWVfb2JqX2dlbmVyYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wcm9jZXNzX2FuaV9zYXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFRlbXApOworICAgIGlmIChpUmV0Y29kZSkKKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICBwU0FWRSA9IChtbmdfYW5pX3NhdmVwKXBUZW1wOworI2Vsc2UKKyAgICBNTkdfQUxMT0MgKHBEYXRhLCBwU0FWRSwgc2l6ZW9mIChtbmdfYW5pX3NhdmUpKTsKKworICAgIHBTQVZFLT5zSGVhZGVyLmZDbGVhbnVwID0gbW5nX2ZyZWVfYW5pX3NhdmU7CisgICAgcFNBVkUtPnNIZWFkZXIuZlByb2Nlc3MgPSBtbmdfcHJvY2Vzc19hbmlfc2F2ZTsKKyNlbmRpZgorCisgICAgbW5nX2FkZF9hbmlfb2JqZWN0IChwRGF0YSwgKG1uZ19vYmplY3RfaGVhZGVycClwU0FWRSk7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9DUkVBVEVfQU5JX1NBVkUsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9PQkpDTEVBTlVQCittbmdfcmV0Y29kZSBtbmdfZnJlZV9hbmlfc2F2ZSAobW5nX2RhdGFwICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX29iamVjdHAgcE9iamVjdCkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9BTklfU0FWRSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19GUkVFWCAocERhdGEsIHBPYmplY3QsIHNpemVvZiAobW5nX2FuaV9zYXZlKSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9BTklfU0FWRSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfYW5pX3NhdmUgKG1uZ19kYXRhcCAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19vYmplY3RwIHBPYmplY3QpCit7CisgIG1uZ19yZXRjb2RlIGlSZXRjb2RlOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST0NFU1NfQU5JX1NBVkUsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpUmV0Y29kZSA9IG1uZ19wcm9jZXNzX2Rpc3BsYXlfc2F2ZSAocERhdGEpOworCisgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgIHJldHVybiBpUmV0Y29kZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9DRVNTX0FOSV9TQVZFLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX1NFRUsKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCittbmdfcmV0Y29kZSBtbmdfY3JlYXRlX2FuaV9zZWVrIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpU2VnbWVudG5hbWVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3BjaGFyICB6U2VnbWVudG5hbWUpCisjZWxzZQorbW5nX3JldGNvZGUgbW5nX2NyZWF0ZV9hbmlfc2VlayAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19jaHVua3AgcENodW5rKQorI2VuZGlmCit7CisgIG1uZ19wdHIgICAgICAgcFRlbXA7CisgIG1uZ19hbmlfc2Vla3AgcFNFRUs7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQ1JFQVRFX0FOSV9TRUVLLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKHBEYXRhLT5iQ2FjaGVwbGF5YmFjaykgICAgICAgICAgIC8qIGNhY2hpbmcgcGxheWJhY2sgaW5mbyA/ICovCisgIHsKKyNpZmRlZiBNTkdfT1BUSU1JWkVfT0JKQ0xFQU5VUAorICAgIG1uZ19yZXRjb2RlIGlSZXRjb2RlID0gY3JlYXRlX29ial9nZW5lcmFsIChwRGF0YSwgc2l6ZW9mIChtbmdfYW5pX3NlZWspLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfZnJlZV9hbmlfc2VlaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3Byb2Nlc3NfYW5pX3NlZWssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwVGVtcCk7CisgICAgaWYgKGlSZXRjb2RlKQorICAgICAgcmV0dXJuIGlSZXRjb2RlOworICAgIHBTRUVLID0gKG1uZ19hbmlfc2Vla3ApcFRlbXA7CisjZWxzZQorICAgIE1OR19BTExPQyAocERhdGEsIHBTRUVLLCBzaXplb2YgKG1uZ19hbmlfc2VlaykpOworCisgICAgcFNFRUstPnNIZWFkZXIuZkNsZWFudXAgPSBtbmdfZnJlZV9hbmlfc2VlazsKKyAgICBwU0VFSy0+c0hlYWRlci5mUHJvY2VzcyA9IG1uZ19wcm9jZXNzX2FuaV9zZWVrOworI2VuZGlmCisKKyAgICBtbmdfYWRkX2FuaV9vYmplY3QgKHBEYXRhLCAobW5nX29iamVjdF9oZWFkZXJwKXBTRUVLKTsKKworICAgIHBEYXRhLT5wTGFzdHNlZWsgPSAobW5nX29iamVjdHApcFNFRUs7CisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisgICAgcFNFRUstPmlTZWdtZW50bmFtZXNpemUgPSBpU2VnbWVudG5hbWVzaXplOworICAgIGlmIChpU2VnbWVudG5hbWVzaXplKQorICAgIHsKKyAgICAgIE1OR19BTExPQyAocERhdGEsIHBTRUVLLT56U2VnbWVudG5hbWUsIGlTZWdtZW50bmFtZXNpemUgKyAxKTsKKyAgICAgIE1OR19DT1BZIChwU0VFSy0+elNlZ21lbnRuYW1lLCB6U2VnbWVudG5hbWUsIGlTZWdtZW50bmFtZXNpemUpOworICAgIH0KKyNlbHNlCisgICAgcFNFRUstPmlTZWdtZW50bmFtZXNpemUgPSAoKG1uZ19zZWVrcClwQ2h1bmspLT5pTmFtZXNpemU7CisgICAgaWYgKHBTRUVLLT5pU2VnbWVudG5hbWVzaXplKQorICAgIHsKKyAgICAgIE1OR19BTExPQyAocERhdGEsIHBTRUVLLT56U2VnbWVudG5hbWUsIHBTRUVLLT5pU2VnbWVudG5hbWVzaXplICsgMSk7CisgICAgICBNTkdfQ09QWSAocFNFRUstPnpTZWdtZW50bmFtZSwgKChtbmdfc2Vla3ApcENodW5rKS0+ek5hbWUsIHBTRUVLLT5pU2VnbWVudG5hbWVzaXplKTsKKyAgICB9CisjZW5kaWYKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0NSRUFURV9BTklfU0VFSywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19mcmVlX2FuaV9zZWVrIChtbmdfZGF0YXAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfb2JqZWN0cCBwT2JqZWN0KQoreworICBtbmdfYW5pX3NlZWtwIHBTRUVLID0gKG1uZ19hbmlfc2Vla3ApcE9iamVjdDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX0FOSV9TRUVLLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKHBTRUVLLT5pU2VnbWVudG5hbWVzaXplKQorICAgIE1OR19GUkVFWCAocERhdGEsIHBTRUVLLT56U2VnbWVudG5hbWUsIHBTRUVLLT5pU2VnbWVudG5hbWVzaXplICsgMSk7CisKKyNpZm5kZWYgTU5HX09QVElNSVpFX09CSkNMRUFOVVAKKyAgTU5HX0ZSRUVYIChwRGF0YSwgcE9iamVjdCwgc2l6ZW9mIChtbmdfYW5pX3NlZWspKTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfQU5JX1NFRUssIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX09CSkNMRUFOVVAKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworI2Vsc2UKKyAgcmV0dXJuIG1uZ19mcmVlX29ial9nZW5lcmFsKHBEYXRhLCBwT2JqZWN0KTsKKyNlbmRpZgorfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19hbmlfc2VlayAobW5nX2RhdGFwICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX29iamVjdHAgcE9iamVjdCkKK3sKKyAgbW5nX2FuaV9zZWVrcCBwU0VFSyA9IChtbmdfYW5pX3NlZWtwKXBPYmplY3Q7CisgIG1uZ19yZXRjb2RlICAgaVJldGNvZGU7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19BTklfU0VFSywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfRFlOQU1JQ01ORworICBpZiAoIXBEYXRhLT5iU3RvcGFmdGVyc2VlaykgICAgICAgICAgLyogY2FuIHdlIHJlYWxseSBwcm9jZXNzIHRoaXMgb25lID8gKi8KKyNlbmRpZiAgCisgIHsKKyAgICBwRGF0YS0+cExhc3RzZWVrID0gcE9iamVjdDsKKworICAgIGlmIChwRGF0YS0+ZlByb2Nlc3NzZWVrKSAgICAgICAgICAgLyogaW5mb3JtIHRoZSBhcHAgPyAqLworICAgIHsKKyAgICAgIG1uZ19ib29sICBiT2tlOworICAgICAgbW5nX3BjaGFyIHpOYW1lOworCisgICAgICBNTkdfQUxMT0MgKHBEYXRhLCB6TmFtZSwgcFNFRUstPmlTZWdtZW50bmFtZXNpemUgKyAxKTsKKworICAgICAgaWYgKHBTRUVLLT5pU2VnbWVudG5hbWVzaXplKQorICAgICAgICBNTkdfQ09QWSAoek5hbWUsIHBTRUVLLT56U2VnbWVudG5hbWUsIHBTRUVLLT5pU2VnbWVudG5hbWVzaXplKTsKKworICAgICAgYk9rZSA9IHBEYXRhLT5mUHJvY2Vzc3NlZWsgKChtbmdfaGFuZGxlKXBEYXRhLCB6TmFtZSk7CisKKyAgICAgIE1OR19GUkVFWCAocERhdGEsIHpOYW1lLCBwU0VFSy0+aVNlZ21lbnRuYW1lc2l6ZSArIDEpOworCisgICAgICBpZiAoIWJPa2UpCisgICAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19BUFBNSVNDRVJST1IpOworICAgIH0KKyAgfQorCisgIGlSZXRjb2RlID0gbW5nX3Byb2Nlc3NfZGlzcGxheV9zZWVrIChwRGF0YSk7CisKKyAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgcmV0dXJuIGlSZXRjb2RlOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST0NFU1NfQU5JX1NFRUssIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKK21uZ19yZXRjb2RlIG1uZ19jcmVhdGVfYW5pX2RoZHIgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlPYmplY3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaUltYWdldHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaURlbHRhdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaUJsb2Nrd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlCbG9ja2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaUJsb2NreCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaUJsb2NreSkKKyNlbHNlCittbmdfcmV0Y29kZSBtbmdfY3JlYXRlX2FuaV9kaGRyIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2NodW5rcCBwQ2h1bmspCisjZW5kaWYKK3sKKyAgbW5nX2FuaV9kaGRycCBwREhEUjsKKyAgbW5nX3JldGNvZGUgICBpUmV0Y29kZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9DUkVBVEVfQU5JX0RIRFIsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAocERhdGEtPmJDYWNoZXBsYXliYWNrKSAgICAgICAgICAgLyogY2FjaGluZyBwbGF5YmFjayBpbmZvID8gKi8KKyAgeworI2lmZGVmIE1OR19PUFRJTUlaRV9PQkpDTEVBTlVQCisgICAgbW5nX3B0ciBwVGVtcDsKKyAgICBpUmV0Y29kZSA9IGNyZWF0ZV9vYmpfZ2VuZXJhbCAocERhdGEsIHNpemVvZiAobW5nX2FuaV9kaGRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ZyZWVfb2JqX2dlbmVyYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wcm9jZXNzX2FuaV9kaGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFRlbXApOworICAgIGlmIChpUmV0Y29kZSkKKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICBwREhEUiA9IChtbmdfYW5pX2RoZHJwKXBUZW1wOworI2Vsc2UKKyAgICBNTkdfQUxMT0MgKHBEYXRhLCBwREhEUiwgc2l6ZW9mIChtbmdfYW5pX2RoZHIpKTsKKworICAgIHBESERSLT5zSGVhZGVyLmZDbGVhbnVwID0gbW5nX2ZyZWVfYW5pX2RoZHI7CisgICAgcERIRFItPnNIZWFkZXIuZlByb2Nlc3MgPSBtbmdfcHJvY2Vzc19hbmlfZGhkcjsKKyNlbmRpZgorCisgICAgbW5nX2FkZF9hbmlfb2JqZWN0IChwRGF0YSwgKG1uZ19vYmplY3RfaGVhZGVycClwREhEUik7CisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisgICAgcERIRFItPmlPYmplY3RpZCAgICA9IGlPYmplY3RpZDsKKyAgICBwREhEUi0+aUltYWdldHlwZSAgID0gaUltYWdldHlwZTsKKyAgICBwREhEUi0+aURlbHRhdHlwZSAgID0gaURlbHRhdHlwZTsKKyAgICBwREhEUi0+aUJsb2Nrd2lkdGggID0gaUJsb2Nrd2lkdGg7CisgICAgcERIRFItPmlCbG9ja2hlaWdodCA9IGlCbG9ja2hlaWdodDsKKyAgICBwREhEUi0+aUJsb2NreCAgICAgID0gaUJsb2NreDsKKyAgICBwREhEUi0+aUJsb2NreSAgICAgID0gaUJsb2NreTsKKyNlbHNlCisgICAgcERIRFItPmlPYmplY3RpZCAgICA9ICgobW5nX2RoZHJwKXBDaHVuayktPmlPYmplY3RpZDsKKyAgICBwREhEUi0+aUltYWdldHlwZSAgID0gKChtbmdfZGhkcnApcENodW5rKS0+aUltYWdldHlwZTsKKyAgICBwREhEUi0+aURlbHRhdHlwZSAgID0gKChtbmdfZGhkcnApcENodW5rKS0+aURlbHRhdHlwZTsKKyAgICBwREhEUi0+aUJsb2Nrd2lkdGggID0gKChtbmdfZGhkcnApcENodW5rKS0+aUJsb2Nrd2lkdGg7CisgICAgcERIRFItPmlCbG9ja2hlaWdodCA9ICgobW5nX2RoZHJwKXBDaHVuayktPmlCbG9ja2hlaWdodDsKKyAgICBwREhEUi0+aUJsb2NreCAgICAgID0gKChtbmdfZGhkcnApcENodW5rKS0+aUJsb2NreDsKKyAgICBwREhEUi0+aUJsb2NreSAgICAgID0gKChtbmdfZGhkcnApcENodW5rKS0+aUJsb2NreTsKKyNlbmRpZgorICB9CisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0RJU1BMQVlDQUxMUworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyAgaVJldGNvZGUgPSBtbmdfcHJvY2Vzc19kaXNwbGF5X2RoZHIgKHBEYXRhLCBpT2JqZWN0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpSW1hZ2V0eXBlLCBpRGVsdGF0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUJsb2Nrd2lkdGgsIGlCbG9ja2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlCbG9ja3gsIGlCbG9ja3kpOworI2Vsc2UKKyAgaVJldGNvZGUgPSBtbmdfcHJvY2Vzc19kaXNwbGF5X2RoZHIgKHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChtbmdfZGhkcnApcENodW5rKS0+aU9iamVjdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChtbmdfZGhkcnApcENodW5rKS0+aUltYWdldHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobW5nX2RoZHJwKXBDaHVuayktPmlEZWx0YXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG1uZ19kaGRycClwQ2h1bmspLT5pQmxvY2t3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobW5nX2RoZHJwKXBDaHVuayktPmlCbG9ja2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobW5nX2RoZHJwKXBDaHVuayktPmlCbG9ja3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG1uZ19kaGRycClwQ2h1bmspLT5pQmxvY2t5KTsKKyNlbmRpZgorI2Vsc2UKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisgIHBEYXRhLT5pREhEUm9iamVjdGlkICAgID0gaU9iamVjdGlkOworICBwRGF0YS0+aURIRFJpbWFnZXR5cGUgICA9IGlJbWFnZXR5cGU7CisgIHBEYXRhLT5pREhEUmRlbHRhdHlwZSAgID0gaURlbHRhdHlwZTsKKyAgcERhdGEtPmlESERSYmxvY2t3aWR0aCAgPSBpQmxvY2t3aWR0aDsKKyAgcERhdGEtPmlESERSYmxvY2toZWlnaHQgPSBpQmxvY2toZWlnaHQ7CisgIHBEYXRhLT5pREhEUmJsb2NreCAgICAgID0gaUJsb2NreDsKKyAgcERhdGEtPmlESERSYmxvY2t5ICAgICAgPSBpQmxvY2t5OworI2Vsc2UKKyAgcERhdGEtPmlESERSb2JqZWN0aWQgICAgPSAoKG1uZ19kaGRycClwQ2h1bmspLT5pT2JqZWN0aWQ7CisgIHBEYXRhLT5pREhEUmltYWdldHlwZSAgID0gKChtbmdfZGhkcnApcENodW5rKS0+aUltYWdldHlwZTsKKyAgcERhdGEtPmlESERSZGVsdGF0eXBlICAgPSAoKG1uZ19kaGRycClwQ2h1bmspLT5pRGVsdGF0eXBlOworICBwRGF0YS0+aURIRFJibG9ja3dpZHRoICA9ICgobW5nX2RoZHJwKXBDaHVuayktPmlCbG9ja3dpZHRoOworICBwRGF0YS0+aURIRFJibG9ja2hlaWdodCA9ICgobW5nX2RoZHJwKXBDaHVuayktPmlCbG9ja2hlaWdodDsKKyAgcERhdGEtPmlESERSYmxvY2t4ICAgICAgPSAoKG1uZ19kaGRycClwQ2h1bmspLT5pQmxvY2t4OworICBwRGF0YS0+aURIRFJibG9ja3kgICAgICA9ICgobW5nX2RoZHJwKXBDaHVuayktPmlCbG9ja3k7CisjZW5kaWYKKworICBpUmV0Y29kZSA9IG1uZ19wcm9jZXNzX2Rpc3BsYXlfZGhkciAocERhdGEpOworI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQ1JFQVRFX0FOSV9ESERSLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBpUmV0Y29kZTsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfT0JKQ0xFQU5VUAorbW5nX3JldGNvZGUgbW5nX2ZyZWVfYW5pX2RoZHIgKG1uZ19kYXRhcCAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19vYmplY3RwIHBPYmplY3QpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfQU5JX0RIRFIsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfRlJFRVggKHBEYXRhLCBwT2JqZWN0LCBzaXplb2YgKG1uZ19hbmlfZGhkcikpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfQU5JX0RIRFIsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19wcm9jZXNzX2FuaV9kaGRyIChtbmdfZGF0YXAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfb2JqZWN0cCBwT2JqZWN0KQoreworICBtbmdfYW5pX2RoZHJwIHBESERSID0gKG1uZ19hbmlfZGhkcnApcE9iamVjdDsKKyAgbW5nX3JldGNvZGUgICBpUmV0Y29kZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9DRVNTX0FOSV9ESERSLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcERhdGEtPmJIYXNESERSID0gTU5HX1RSVUU7ICAgICAgICAgIC8qIGxldCBldmVyeW9uZSBrbm93IHdlJ3JlIGluc2lkZSBhIERIRFIgKi8KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfRElTUExBWUNBTExTCisgIGlSZXRjb2RlID0gbW5nX3Byb2Nlc3NfZGlzcGxheV9kaGRyIChwRGF0YSwgcERIRFItPmlPYmplY3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBESERSLT5pSW1hZ2V0eXBlLCBwREhEUi0+aURlbHRhdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBESERSLT5pQmxvY2t3aWR0aCwgcERIRFItPmlCbG9ja2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBESERSLT5pQmxvY2t4LCBwREhEUi0+aUJsb2NreSk7CisjZWxzZQorICBwRGF0YS0+aURIRFJvYmplY3RpZCAgICA9IHBESERSLT5pT2JqZWN0aWQ7CisgIHBEYXRhLT5pREhEUmltYWdldHlwZSAgID0gcERIRFItPmlJbWFnZXR5cGU7CisgIHBEYXRhLT5pREhEUmRlbHRhdHlwZSAgID0gcERIRFItPmlEZWx0YXR5cGU7CisgIHBEYXRhLT5pREhEUmJsb2Nrd2lkdGggID0gcERIRFItPmlCbG9ja3dpZHRoOworICBwRGF0YS0+aURIRFJibG9ja2hlaWdodCA9IHBESERSLT5pQmxvY2toZWlnaHQ7CisgIHBEYXRhLT5pREhEUmJsb2NreCAgICAgID0gcERIRFItPmlCbG9ja3g7CisgIHBEYXRhLT5pREhEUmJsb2NreSAgICAgID0gcERIRFItPmlCbG9ja3k7CisKKyAgaVJldGNvZGUgPSBtbmdfcHJvY2Vzc19kaXNwbGF5X2RoZHIgKHBEYXRhKTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST0NFU1NfQU5JX0RIRFIsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIGlSZXRjb2RlOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKK21uZ19yZXRjb2RlIG1uZ19jcmVhdGVfYW5pX3Byb20gKG1uZ19kYXRhcCBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCBpQml0ZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggaUNvbG9ydHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCBpRmlsbHR5cGUpCisjZWxzZQorbW5nX3JldGNvZGUgbW5nX2NyZWF0ZV9hbmlfcHJvbSAobW5nX2RhdGFwIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2NodW5rcCBwQ2h1bmspCisjZW5kaWYKK3sKKyAgbW5nX2FuaV9wcm9tcCBwUFJPTT1OVUxMOworICBtbmdfcmV0Y29kZSAgIGlSZXRjb2RlOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0NSRUFURV9BTklfUFJPTSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmIChwRGF0YS0+YkNhY2hlcGxheWJhY2spICAgICAgICAgICAvKiBjYWNoaW5nIHBsYXliYWNrIGluZm8gPyAqLworICB7CisjaWZkZWYgTU5HX09QVElNSVpFX09CSkNMRUFOVVAKKyAgICBtbmdfcHRyIHBUZW1wOworICAgIGlSZXRjb2RlID0gY3JlYXRlX29ial9nZW5lcmFsIChwRGF0YSwgc2l6ZW9mIChtbmdfYW5pX3Byb20pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfZnJlZV9vYmpfZ2VuZXJhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3Byb2Nlc3NfYW5pX3Byb20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwVGVtcCk7CisgICAgaWYgKGlSZXRjb2RlKQorICAgICAgcmV0dXJuIGlSZXRjb2RlOworICAgIHBQUk9NID0gKG1uZ19hbmlfcHJvbXApcFRlbXA7CisjZWxzZQorICAgIE1OR19BTExPQyAocERhdGEsIHBQUk9NLCBzaXplb2YgKG1uZ19hbmlfcHJvbSkpOworCisgICAgcFBST00tPnNIZWFkZXIuZkNsZWFudXAgPSBtbmdfZnJlZV9hbmlfcHJvbTsKKyAgICBwUFJPTS0+c0hlYWRlci5mUHJvY2VzcyA9IG1uZ19wcm9jZXNzX2FuaV9wcm9tOworI2VuZGlmCisKKyAgICBtbmdfYWRkX2FuaV9vYmplY3QgKHBEYXRhLCAobW5nX29iamVjdF9oZWFkZXJwKXBQUk9NKTsKKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyAgICBwUFJPTS0+aUJpdGRlcHRoICA9IGlCaXRkZXB0aDsKKyAgICBwUFJPTS0+aUNvbG9ydHlwZSA9IGlDb2xvcnR5cGU7CisgICAgcFBST00tPmlGaWxsdHlwZSAgPSBpRmlsbHR5cGU7CisjZWxzZQorICAgIHBQUk9NLT5pQml0ZGVwdGggID0gKChtbmdfcHJvbXApcENodW5rKS0+aVNhbXBsZWRlcHRoOworICAgIHBQUk9NLT5pQ29sb3J0eXBlID0gKChtbmdfcHJvbXApcENodW5rKS0+aUNvbG9ydHlwZTsKKyAgICBwUFJPTS0+aUZpbGx0eXBlICA9ICgobW5nX3Byb21wKXBDaHVuayktPmlGaWxsdHlwZTsKKyNlbmRpZgorICB9CisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0RJU1BMQVlDQUxMUworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyAgaVJldGNvZGUgPSBtbmdfcHJvY2Vzc19kaXNwbGF5X3Byb20gKHBEYXRhLCBpQml0ZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpQ29sb3J0eXBlLCBpRmlsbHR5cGUpOworI2Vsc2UKKyAgaVJldGNvZGUgPSBtbmdfcHJvY2Vzc19kaXNwbGF5X3Byb20gKHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChtbmdfcHJvbXApcENodW5rKS0+aVNhbXBsZWRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChtbmdfcHJvbXApcENodW5rKS0+aUNvbG9ydHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobW5nX3Byb21wKXBDaHVuayktPmlGaWxsdHlwZSk7CisjZW5kaWYKKyNlbHNlCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorICBwRGF0YS0+aVBST01iaXRkZXB0aCAgPSBpQml0ZGVwdGg7CisgIHBEYXRhLT5pUFJPTWNvbG9ydHlwZSA9IGlDb2xvcnR5cGU7CisgIHBEYXRhLT5pUFJPTWZpbGx0eXBlICA9IGlGaWxsdHlwZTsKKyNlbHNlCisgIHBEYXRhLT5pUFJPTWJpdGRlcHRoICA9ICgobW5nX3Byb21wKXBDaHVuayktPmlTYW1wbGVkZXB0aDsKKyAgcERhdGEtPmlQUk9NY29sb3J0eXBlID0gKChtbmdfcHJvbXApcENodW5rKS0+aUNvbG9ydHlwZTsKKyAgcERhdGEtPmlQUk9NZmlsbHR5cGUgID0gKChtbmdfcHJvbXApcENodW5rKS0+aUZpbGx0eXBlOworI2VuZGlmCisKKyAgaVJldGNvZGUgPSBtbmdfcHJvY2Vzc19kaXNwbGF5X3Byb20gKHBEYXRhKTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0NSRUFURV9BTklfUFJPTSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gaVJldGNvZGU7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX09CSkNMRUFOVVAKK21uZ19yZXRjb2RlIG1uZ19mcmVlX2FuaV9wcm9tIChtbmdfZGF0YXAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfb2JqZWN0cCBwT2JqZWN0KQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX0FOSV9QUk9NLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX0ZSRUVYIChwRGF0YSwgcE9iamVjdCwgc2l6ZW9mIChtbmdfYW5pX3Byb20pKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX0FOSV9QUk9NLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19hbmlfcHJvbSAobW5nX2RhdGFwICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX29iamVjdHAgcE9iamVjdCkKK3sKKyAgbW5nX2FuaV9wcm9tcCBwUFJPTSA9IChtbmdfYW5pX3Byb21wKXBPYmplY3Q7CisgIG1uZ19yZXRjb2RlIGlSZXRjb2RlOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST0NFU1NfQU5JX1BST00sIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfRElTUExBWUNBTExTCisgIGlSZXRjb2RlID0gbW5nX3Byb2Nlc3NfZGlzcGxheV9wcm9tIChwRGF0YSwgcFBST00tPmlCaXRkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQUk9NLT5pQ29sb3J0eXBlLCBwUFJPTS0+aUZpbGx0eXBlKTsKKyNlbHNlCisgIHBEYXRhLT5pUFJPTWJpdGRlcHRoICA9IHBQUk9NLT5pQml0ZGVwdGg7CisgIHBEYXRhLT5pUFJPTWNvbG9ydHlwZSA9IHBQUk9NLT5pQ29sb3J0eXBlOworICBwRGF0YS0+aVBST01maWxsdHlwZSAgPSBwUFJPTS0+aUZpbGx0eXBlOworCisgIGlSZXRjb2RlID0gbW5nX3Byb2Nlc3NfZGlzcGxheV9wcm9tIChwRGF0YSk7CisjZW5kaWYKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9DRVNTX0FOSV9QUk9NLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBpUmV0Y29kZTsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKK21uZ19yZXRjb2RlIG1uZ19jcmVhdGVfYW5pX2lwbmcgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX2FuaV9pcG5ncCBwSVBORzsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9DUkVBVEVfQU5JX0lQTkcsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAocERhdGEtPmJDYWNoZXBsYXliYWNrKSAgICAgICAgICAgLyogY2FjaGluZyBwbGF5YmFjayBpbmZvID8gKi8KKyAgeworI2lmZGVmIE1OR19PUFRJTUlaRV9PQkpDTEVBTlVQCisgICAgbW5nX3B0ciAgICAgcFRlbXA7CisgICAgbW5nX3JldGNvZGUgaVJldGNvZGUgPSBjcmVhdGVfb2JqX2dlbmVyYWwgKHBEYXRhLCBzaXplb2YgKG1uZ19hbmlfaXBuZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19mcmVlX29ial9nZW5lcmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcHJvY2Vzc19hbmlfaXBuZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBUZW1wKTsKKyAgICBpZiAoaVJldGNvZGUpCisgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgcElQTkcgPSAobW5nX2FuaV9pcG5ncClwVGVtcDsKKyNlbHNlCisgICAgTU5HX0FMTE9DIChwRGF0YSwgcElQTkcsIHNpemVvZiAobW5nX2FuaV9pcG5nKSk7CisKKyAgICBwSVBORy0+c0hlYWRlci5mQ2xlYW51cCA9IG1uZ19mcmVlX2FuaV9pcG5nOworICAgIHBJUE5HLT5zSGVhZGVyLmZQcm9jZXNzID0gbW5nX3Byb2Nlc3NfYW5pX2lwbmc7CisjZW5kaWYKKworICAgIG1uZ19hZGRfYW5pX29iamVjdCAocERhdGEsIChtbmdfb2JqZWN0X2hlYWRlcnApcElQTkcpOworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQ1JFQVRFX0FOSV9JUE5HLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfT0JKQ0xFQU5VUAorbW5nX3JldGNvZGUgbW5nX2ZyZWVfYW5pX2lwbmcgKG1uZ19kYXRhcCAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19vYmplY3RwIHBPYmplY3QpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfQU5JX0lQTkcsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfRlJFRVggKHBEYXRhLCBwT2JqZWN0LCBzaXplb2YgKG1uZ19hbmlfaXBuZykpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfQU5JX0lQTkcsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19wcm9jZXNzX2FuaV9pcG5nIChtbmdfZGF0YXAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfb2JqZWN0cCBwT2JqZWN0KQoreworICBtbmdfcmV0Y29kZSBpUmV0Y29kZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9DRVNTX0FOSV9JUE5HLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaVJldGNvZGUgPSBtbmdfcHJvY2Vzc19kaXNwbGF5X2lwbmcgKHBEYXRhKTsKKworICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICByZXR1cm4gaVJldGNvZGU7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19BTklfSVBORywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCittbmdfcmV0Y29kZSBtbmdfY3JlYXRlX2FuaV9pam5nIChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ19hbmlfaWpuZ3AgcElKTkc7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQ1JFQVRFX0FOSV9JSk5HLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKHBEYXRhLT5iQ2FjaGVwbGF5YmFjaykgICAgICAgICAgIC8qIGNhY2hpbmcgcGxheWJhY2sgaW5mbyA/ICovCisgIHsKKyNpZmRlZiBNTkdfT1BUSU1JWkVfT0JKQ0xFQU5VUAorICAgIG1uZ19wdHIgICAgIHBUZW1wOworICAgIG1uZ19yZXRjb2RlIGlSZXRjb2RlID0gY3JlYXRlX29ial9nZW5lcmFsIChwRGF0YSwgc2l6ZW9mIChtbmdfYW5pX2lqbmcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfZnJlZV9vYmpfZ2VuZXJhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3Byb2Nlc3NfYW5pX2lqbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwVGVtcCk7CisgICAgaWYgKGlSZXRjb2RlKQorICAgICAgcmV0dXJuIGlSZXRjb2RlOworICAgIHBJSk5HID0gKG1uZ19hbmlfaWpuZ3ApcFRlbXA7CisjZWxzZQorICAgIE1OR19BTExPQyAocERhdGEsIHBJSk5HLCBzaXplb2YgKG1uZ19hbmlfaWpuZykpOworCisgICAgcElKTkctPnNIZWFkZXIuZkNsZWFudXAgPSBtbmdfZnJlZV9hbmlfaWpuZzsKKyAgICBwSUpORy0+c0hlYWRlci5mUHJvY2VzcyA9IG1uZ19wcm9jZXNzX2FuaV9pam5nOworI2VuZGlmCisKKyAgICBtbmdfYWRkX2FuaV9vYmplY3QgKHBEYXRhLCAobW5nX29iamVjdF9oZWFkZXJwKXBJSk5HKTsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0NSRUFURV9BTklfSUpORywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX09CSkNMRUFOVVAKK21uZ19yZXRjb2RlIG1uZ19mcmVlX2FuaV9pam5nIChtbmdfZGF0YXAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfb2JqZWN0cCBwT2JqZWN0KQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX0FOSV9JSk5HLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX0ZSRUVYIChwRGF0YSwgcE9iamVjdCwgc2l6ZW9mIChtbmdfYW5pX2lqbmcpKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX0FOSV9JSk5HLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19hbmlfaWpuZyAobW5nX2RhdGFwICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX29iamVjdHAgcE9iamVjdCkKK3sKKyAgbW5nX3JldGNvZGUgaVJldGNvZGU7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19BTklfSUpORywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlSZXRjb2RlID0gbW5nX3Byb2Nlc3NfZGlzcGxheV9pam5nIChwRGF0YSk7CisKKyAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgcmV0dXJuIGlSZXRjb2RlOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST0NFU1NfQU5JX0lKTkcsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCittbmdfcmV0Y29kZSBtbmdfY3JlYXRlX2FuaV9wcGx0IChtbmdfZGF0YXAgICAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgIGlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgaUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3BhbGV0dGU4ZXAgcGFJbmRleGVudHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwICAgICBwYUFscGhhZW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgICAgIHBhVXNlZGVudHJpZXMpCit7CisgIG1uZ19hbmlfcHBsdHAgcFBQTFQ7CisgIG1uZ19yZXRjb2RlICAgaVJldGNvZGU7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQ1JFQVRFX0FOSV9QUExULCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKHBEYXRhLT5iQ2FjaGVwbGF5YmFjaykgICAgICAgICAgIC8qIGNhY2hpbmcgcGxheWJhY2sgaW5mbyA/ICovCisgIHsKKyNpZmRlZiBNTkdfT1BUSU1JWkVfT0JKQ0xFQU5VUAorICAgIG1uZ19wdHIgcFRlbXA7CisgICAgaVJldGNvZGUgPSBjcmVhdGVfb2JqX2dlbmVyYWwgKHBEYXRhLCBzaXplb2YgKG1uZ19hbmlfcHBsdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19mcmVlX29ial9nZW5lcmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcHJvY2Vzc19hbmlfcHBsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBUZW1wKTsKKyAgICBpZiAoaVJldGNvZGUpCisgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgcFBQTFQgPSAobW5nX2FuaV9wcGx0cClwVGVtcDsKKyNlbHNlCisgICAgTU5HX0FMTE9DIChwRGF0YSwgcFBQTFQsIHNpemVvZiAobW5nX2FuaV9wcGx0KSk7CisKKyAgICBwUFBMVC0+c0hlYWRlci5mQ2xlYW51cCA9IG1uZ19mcmVlX2FuaV9wcGx0OworICAgIHBQUExULT5zSGVhZGVyLmZQcm9jZXNzID0gbW5nX3Byb2Nlc3NfYW5pX3BwbHQ7CisjZW5kaWYKKworICAgIHBQUExULT5pVHlwZSAgICAgICAgICAgID0gaVR5cGU7CisgICAgcFBQTFQtPmlDb3VudCAgICAgICAgICAgPSBpQ291bnQ7CisKKyAgICBNTkdfQ09QWSAocFBQTFQtPmFJbmRleGVudHJpZXMsIHBhSW5kZXhlbnRyaWVzLCBzaXplb2YgKHBQUExULT5hSW5kZXhlbnRyaWVzKSk7CisgICAgTU5HX0NPUFkgKHBQUExULT5hQWxwaGFlbnRyaWVzLCBwYUFscGhhZW50cmllcywgc2l6ZW9mIChwUFBMVC0+YUFscGhhZW50cmllcykpOworICAgIE1OR19DT1BZIChwUFBMVC0+YVVzZWRlbnRyaWVzLCAgcGFVc2VkZW50cmllcywgIHNpemVvZiAocFBQTFQtPmFVc2VkZW50cmllcyApKTsKKworICAgIG1uZ19hZGRfYW5pX29iamVjdCAocERhdGEsIChtbmdfb2JqZWN0X2hlYWRlcnApcFBQTFQpOworICB9CisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0RJU1BMQVlDQUxMUworICBpUmV0Y29kZSA9IG1uZ19wcm9jZXNzX2Rpc3BsYXlfcHBsdCAocERhdGEsIGlUeXBlLCBpQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYUluZGV4ZW50cmllcywgcGFBbHBoYWVudHJpZXMsIHBhVXNlZGVudHJpZXMpOworI2Vsc2UKKyAgcERhdGEtPmlQUExUdHlwZSAgICAgICAgICA9IGlUeXBlOworICBwRGF0YS0+aVBQTFRjb3VudCAgICAgICAgID0gaUNvdW50OworICBwRGF0YS0+cGFQUExUaW5kZXhlbnRyaWVzID0gcGFJbmRleGVudHJpZXM7CisgIHBEYXRhLT5wYVBQTFRhbHBoYWVudHJpZXMgPSBwYUFscGhhZW50cmllczsKKyAgcERhdGEtPnBhUFBMVHVzZWRlbnRyaWVzICA9IHBhVXNlZGVudHJpZXM7CisKKyAgaVJldGNvZGUgPSBtbmdfcHJvY2Vzc19kaXNwbGF5X3BwbHQgKHBEYXRhKTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0NSRUFURV9BTklfUFBMVCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gaVJldGNvZGU7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX09CSkNMRUFOVVAKK21uZ19yZXRjb2RlIG1uZ19mcmVlX2FuaV9wcGx0IChtbmdfZGF0YXAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfb2JqZWN0cCBwT2JqZWN0KQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX0FOSV9QUExULCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX0ZSRUVYIChwRGF0YSwgcE9iamVjdCwgc2l6ZW9mIChtbmdfYW5pX3BwbHQpKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX0FOSV9QUExULCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19hbmlfcHBsdCAobW5nX2RhdGFwICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX29iamVjdHAgcE9iamVjdCkKK3sKKyAgbW5nX2FuaV9wcGx0cCBwUFBMVCA9IChtbmdfYW5pX3BwbHRwKXBPYmplY3Q7CisgIG1uZ19yZXRjb2RlIGlSZXRjb2RlOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST0NFU1NfQU5JX1BQTFQsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfRElTUExBWUNBTExTCisgIGlSZXRjb2RlID0gbW5nX3Byb2Nlc3NfZGlzcGxheV9wcGx0IChwRGF0YSwgcFBQTFQtPmlUeXBlLCBwUFBMVC0+aUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBQTFQtPmFJbmRleGVudHJpZXMsIHBQUExULT5hQWxwaGFlbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBQTFQtPmFVc2VkZW50cmllcyk7CisjZWxzZQorICBwRGF0YS0+aVBQTFR0eXBlICAgICAgICAgID0gcFBQTFQtPmlUeXBlOworICBwRGF0YS0+aVBQTFRjb3VudCAgICAgICAgID0gcFBQTFQtPmlDb3VudDsKKyAgcERhdGEtPnBhUFBMVGluZGV4ZW50cmllcyA9ICZwUFBMVC0+YUluZGV4ZW50cmllczsKKyAgcERhdGEtPnBhUFBMVGFscGhhZW50cmllcyA9ICZwUFBMVC0+YUFscGhhZW50cmllczsKKyAgcERhdGEtPnBhUFBMVHVzZWRlbnRyaWVzICA9ICZwUFBMVC0+YVVzZWRlbnRyaWVzOworCisgIGlSZXRjb2RlID0gbW5nX3Byb2Nlc3NfZGlzcGxheV9wcGx0IChwRGF0YSk7CisjZW5kaWYKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9DRVNTX0FOSV9QUExULCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBpUmV0Y29kZTsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfTUFHTgorI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKK21uZ19yZXRjb2RlIG1uZ19jcmVhdGVfYW5pX21hZ24gKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlGaXJzdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTGFzdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICBpTWV0aG9kWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1YLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTVksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaU1ldGhvZFkpCisjZWxzZQorbW5nX3JldGNvZGUgbW5nX2NyZWF0ZV9hbmlfbWFnbiAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19jaHVua3AgcENodW5rKQorI2VuZGlmCit7CisgIG1uZ19hbmlfbWFnbnAgcE1BR049TlVMTDsKKyAgbW5nX3JldGNvZGUgICBpUmV0Y29kZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9DUkVBVEVfQU5JX01BR04sIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAocERhdGEtPmJDYWNoZXBsYXliYWNrKSAgICAgICAgICAgLyogY2FjaGluZyBwbGF5YmFjayBpbmZvID8gKi8KKyAgeworI2lmZGVmIE1OR19PUFRJTUlaRV9PQkpDTEVBTlVQCisgICAgbW5nX3B0ciBwVGVtcDsKKyAgICBpUmV0Y29kZSA9IGNyZWF0ZV9vYmpfZ2VuZXJhbCAocERhdGEsIHNpemVvZiAobW5nX2FuaV9tYWduKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ZyZWVfb2JqX2dlbmVyYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wcm9jZXNzX2FuaV9tYWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFRlbXApOworICAgIGlmIChpUmV0Y29kZSkKKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICBwTUFHTiA9IChtbmdfYW5pX21hZ25wKXBUZW1wOworI2Vsc2UKKyAgICBNTkdfQUxMT0MgKHBEYXRhLCBwTUFHTiwgc2l6ZW9mIChtbmdfYW5pX21hZ24pKTsKKworICAgIHBNQUdOLT5zSGVhZGVyLmZDbGVhbnVwID0gbW5nX2ZyZWVfYW5pX21hZ247CisgICAgcE1BR04tPnNIZWFkZXIuZlByb2Nlc3MgPSBtbmdfcHJvY2Vzc19hbmlfbWFnbjsKKyNlbmRpZgorCisgICAgbW5nX2FkZF9hbmlfb2JqZWN0IChwRGF0YSwgKG1uZ19vYmplY3RfaGVhZGVycClwTUFHTik7CisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisgICAgcE1BR04tPmlGaXJzdGlkID0gaUZpcnN0aWQ7CisgICAgcE1BR04tPmlMYXN0aWQgID0gaUxhc3RpZDsKKyAgICBwTUFHTi0+aU1ldGhvZFggPSBpTWV0aG9kWDsKKyAgICBwTUFHTi0+aU1YICAgICAgPSBpTVg7CisgICAgcE1BR04tPmlNWSAgICAgID0gaU1ZOworICAgIHBNQUdOLT5pTUwgICAgICA9IGlNTDsKKyAgICBwTUFHTi0+aU1SICAgICAgPSBpTVI7CisgICAgcE1BR04tPmlNVCAgICAgID0gaU1UOworICAgIHBNQUdOLT5pTUIgICAgICA9IGlNQjsKKyAgICBwTUFHTi0+aU1ldGhvZFkgPSBpTWV0aG9kWTsKKyNlbHNlCisgICAgcE1BR04tPmlGaXJzdGlkID0gKChtbmdfbWFnbnApcENodW5rKS0+aUZpcnN0aWQ7CisgICAgcE1BR04tPmlMYXN0aWQgID0gKChtbmdfbWFnbnApcENodW5rKS0+aUxhc3RpZDsKKyAgICBwTUFHTi0+aU1ldGhvZFggPSAoKG1uZ19tYWducClwQ2h1bmspLT5pTWV0aG9kWDsKKyAgICBwTUFHTi0+aU1YICAgICAgPSAoKG1uZ19tYWducClwQ2h1bmspLT5pTVg7CisgICAgcE1BR04tPmlNWSAgICAgID0gKChtbmdfbWFnbnApcENodW5rKS0+aU1ZOworICAgIHBNQUdOLT5pTUwgICAgICA9ICgobW5nX21hZ25wKXBDaHVuayktPmlNTDsKKyAgICBwTUFHTi0+aU1SICAgICAgPSAoKG1uZ19tYWducClwQ2h1bmspLT5pTVI7CisgICAgcE1BR04tPmlNVCAgICAgID0gKChtbmdfbWFnbnApcENodW5rKS0+aU1UOworICAgIHBNQUdOLT5pTUIgICAgICA9ICgobW5nX21hZ25wKXBDaHVuayktPmlNQjsKKyAgICBwTUFHTi0+aU1ldGhvZFkgPSAoKG1uZ19tYWducClwQ2h1bmspLT5pTWV0aG9kWTsKKyNlbmRpZgorICB9CisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0RJU1BMQVlDQUxMUworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyAgaVJldGNvZGUgPSBtbmdfcHJvY2Vzc19kaXNwbGF5X21hZ24gKHBEYXRhLCBwTUFHTi0+aUZpcnN0aWQsIHBNQUdOLT5pTGFzdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1BR04tPmlNZXRob2RYLCBwTUFHTi0+aU1YLCBwTUFHTi0+aU1ZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1BR04tPmlNTCwgcE1BR04tPmlNUiwgcE1BR04tPmlNVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNQUdOLT5pTUIsIHBNQUdOLT5pTWV0aG9kWSk7CisjZWxzZQorICBpUmV0Y29kZSA9IG1uZ19wcm9jZXNzX2Rpc3BsYXlfbWFnbiAocERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG1uZ19tYWducClwQ2h1bmspLT5pRmlyc3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobW5nX21hZ25wKXBDaHVuayktPmlMYXN0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG1uZ19tYWducClwQ2h1bmspLT5pTWV0aG9kWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobW5nX21hZ25wKXBDaHVuayktPmlNWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobW5nX21hZ25wKXBDaHVuayktPmlNWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobW5nX21hZ25wKXBDaHVuayktPmlNTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobW5nX21hZ25wKXBDaHVuayktPmlNUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobW5nX21hZ25wKXBDaHVuayktPmlNVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobW5nX21hZ25wKXBDaHVuayktPmlNQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobW5nX21hZ25wKXBDaHVuayktPmlNZXRob2RZKTsKKyNlbmRpZgorI2Vsc2UKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisgIHBEYXRhLT5pTUFHTmZpcnN0aWQgPSBpRmlyc3RpZDsKKyAgcERhdGEtPmlNQUdObGFzdGlkICA9IGlMYXN0aWQ7CisgIHBEYXRhLT5pTUFHTm1ldGhvZFggPSBpTWV0aG9kWDsKKyAgcERhdGEtPmlNQUdObVggICAgICA9IGlNWDsKKyAgcERhdGEtPmlNQUdObVkgICAgICA9IGlNWTsKKyAgcERhdGEtPmlNQUdObUwgICAgICA9IGlNTDsKKyAgcERhdGEtPmlNQUdObVIgICAgICA9IGlNUjsKKyAgcERhdGEtPmlNQUdObVQgICAgICA9IGlNVDsKKyAgcERhdGEtPmlNQUdObUIgICAgICA9IGlNQjsKKyAgcERhdGEtPmlNQUdObWV0aG9kWSA9IGlNZXRob2RZOworI2Vsc2UKKyAgcERhdGEtPmlNQUdOZmlyc3RpZCA9ICgobW5nX21hZ25wKXBDaHVuayktPmlGaXJzdGlkOworICBwRGF0YS0+aU1BR05sYXN0aWQgID0gKChtbmdfbWFnbnApcENodW5rKS0+aUxhc3RpZDsKKyAgcERhdGEtPmlNQUdObWV0aG9kWCA9ICgobW5nX21hZ25wKXBDaHVuayktPmlNZXRob2RYOworICBwRGF0YS0+aU1BR05tWCAgICAgID0gKChtbmdfbWFnbnApcENodW5rKS0+aU1YOworICBwRGF0YS0+aU1BR05tWSAgICAgID0gKChtbmdfbWFnbnApcENodW5rKS0+aU1ZOworICBwRGF0YS0+aU1BR05tTCAgICAgID0gKChtbmdfbWFnbnApcENodW5rKS0+aU1MOworICBwRGF0YS0+aU1BR05tUiAgICAgID0gKChtbmdfbWFnbnApcENodW5rKS0+aU1SOworICBwRGF0YS0+aU1BR05tVCAgICAgID0gKChtbmdfbWFnbnApcENodW5rKS0+aU1UOworICBwRGF0YS0+aU1BR05tQiAgICAgID0gKChtbmdfbWFnbnApcENodW5rKS0+aU1COworICBwRGF0YS0+aU1BR05tZXRob2RZID0gKChtbmdfbWFnbnApcENodW5rKS0+aU1ldGhvZFk7CisjZW5kaWYKKworICBpUmV0Y29kZSA9IG1uZ19wcm9jZXNzX2Rpc3BsYXlfbWFnbiAocERhdGEpOworI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQ1JFQVRFX0FOSV9NQUdOLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBpUmV0Y29kZTsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfT0JKQ0xFQU5VUAorbW5nX3JldGNvZGUgbW5nX2ZyZWVfYW5pX21hZ24gKG1uZ19kYXRhcCAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19vYmplY3RwIHBPYmplY3QpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfQU5JX01BR04sIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfRlJFRVggKHBEYXRhLCBwT2JqZWN0LCBzaXplb2YgKG1uZ19hbmlfbWFnbikpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfQU5JX01BR04sIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19wcm9jZXNzX2FuaV9tYWduIChtbmdfZGF0YXAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfb2JqZWN0cCBwT2JqZWN0KQoreworICBtbmdfYW5pX21hZ25wIHBNQUdOID0gKG1uZ19hbmlfbWFnbnApcE9iamVjdDsKKyAgbW5nX3JldGNvZGUgaVJldGNvZGU7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19BTklfTUFHTiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisjaWZuZGVmIE1OR19PUFRJTUlaRV9ESVNQTEFZQ0FMTFMKKyAgaVJldGNvZGUgPSBtbmdfcHJvY2Vzc19kaXNwbGF5X21hZ24gKHBEYXRhLCBwTUFHTi0+aUZpcnN0aWQsIHBNQUdOLT5pTGFzdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1BR04tPmlNZXRob2RYLCBwTUFHTi0+aU1YLCBwTUFHTi0+aU1ZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1BR04tPmlNTCwgcE1BR04tPmlNUiwgcE1BR04tPmlNVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNQUdOLT5pTUIsIHBNQUdOLT5pTWV0aG9kWSk7CisjZWxzZQorICBwRGF0YS0+aU1BR05maXJzdGlkID0gcE1BR04tPmlGaXJzdGlkOworICBwRGF0YS0+aU1BR05sYXN0aWQgID0gcE1BR04tPmlMYXN0aWQ7CisgIHBEYXRhLT5pTUFHTm1ldGhvZFggPSBwTUFHTi0+aU1ldGhvZFg7CisgIHBEYXRhLT5pTUFHTm1YICAgICAgPSBwTUFHTi0+aU1YOworICBwRGF0YS0+aU1BR05tWSAgICAgID0gcE1BR04tPmlNWTsKKyAgcERhdGEtPmlNQUdObUwgICAgICA9IHBNQUdOLT5pTUw7CisgIHBEYXRhLT5pTUFHTm1SICAgICAgPSBwTUFHTi0+aU1SOworICBwRGF0YS0+aU1BR05tVCAgICAgID0gcE1BR04tPmlNVDsKKyAgcERhdGEtPmlNQUdObUIgICAgICA9IHBNQUdOLT5pTUI7CisgIHBEYXRhLT5pTUFHTm1ldGhvZFkgPSBwTUFHTi0+aU1ldGhvZFk7CisKKyAgaVJldGNvZGUgPSBtbmdfcHJvY2Vzc19kaXNwbGF5X21hZ24gKHBEYXRhKTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST0NFU1NfQU5JX01BR04sIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIGlSZXRjb2RlOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19QQVNUCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorbW5nX3JldGNvZGUgbW5nX2NyZWF0ZV9hbmlfcGFzdCAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaVRhcmdldGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICBpVGFyZ2V0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaVRhcmdldHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlUYXJnZXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcHRyICAgIHBTb3VyY2VzKQorI2Vsc2UKK21uZ19yZXRjb2RlIG1uZ19jcmVhdGVfYW5pX3Bhc3QgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfY2h1bmtwIHBDaHVuaykKKyNlbmRpZgoreworICBtbmdfYW5pX3Bhc3RwIHBQQVNUOworICBtbmdfcmV0Y29kZSAgIGlSZXRjb2RlOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0NSRUFURV9BTklfUEFTVCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmIChwRGF0YS0+YkNhY2hlcGxheWJhY2spICAgICAgICAgICAvKiBjYWNoaW5nIHBsYXliYWNrIGluZm8gPyAqLworICB7CisjaWZkZWYgTU5HX09QVElNSVpFX09CSkNMRUFOVVAKKyAgICBtbmdfcHRyIHBUZW1wOworICAgIGlSZXRjb2RlID0gY3JlYXRlX29ial9nZW5lcmFsIChwRGF0YSwgc2l6ZW9mIChtbmdfYW5pX3Bhc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfZnJlZV9hbmlfcGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3Byb2Nlc3NfYW5pX3Bhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwVGVtcCk7CisgICAgaWYgKGlSZXRjb2RlKQorICAgICAgcmV0dXJuIGlSZXRjb2RlOworICAgIHBQQVNUID0gKG1uZ19hbmlfcGFzdHApcFRlbXA7CisjZWxzZQorICAgIE1OR19BTExPQyAocERhdGEsIHBQQVNULCBzaXplb2YgKG1uZ19hbmlfcGFzdCkpOworCisgICAgcFBBU1QtPnNIZWFkZXIuZkNsZWFudXAgPSBtbmdfZnJlZV9hbmlfcGFzdDsKKyAgICBwUEFTVC0+c0hlYWRlci5mUHJvY2VzcyA9IG1uZ19wcm9jZXNzX2FuaV9wYXN0OworI2VuZGlmCisKKyAgICBtbmdfYWRkX2FuaV9vYmplY3QgKHBEYXRhLCAobW5nX29iamVjdF9oZWFkZXJwKXBQQVNUKTsKKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyAgICBwUEFTVC0+aVRhcmdldGlkICAgPSBpVGFyZ2V0aWQ7CisgICAgcFBBU1QtPmlUYXJnZXR0eXBlID0gaVRhcmdldHR5cGU7CisgICAgcFBBU1QtPmlUYXJnZXR4ICAgID0gaVRhcmdldHg7CisgICAgcFBBU1QtPmlUYXJnZXR5ICAgID0gaVRhcmdldHk7CisgICAgcFBBU1QtPmlDb3VudCAgICAgID0gaUNvdW50OworCisgICAgaWYgKGlDb3VudCkKKyAgICB7CisgICAgICBNTkdfQUxMT0MgKHBEYXRhLCBwUEFTVC0+cFNvdXJjZXMsIChpQ291bnQgKiBzaXplb2YgKG1uZ19wYXN0X3NvdXJjZSkpKTsKKyAgICAgIE1OR19DT1BZIChwUEFTVC0+cFNvdXJjZXMsIHBTb3VyY2VzLCAoaUNvdW50ICogc2l6ZW9mIChtbmdfcGFzdF9zb3VyY2UpKSk7CisgICAgfQorI2Vsc2UKKyAgICBwUEFTVC0+aVRhcmdldGlkICAgPSAoKG1uZ19wYXN0cClwQ2h1bmspLT5pRGVzdGlkOworICAgIHBQQVNULT5pVGFyZ2V0dHlwZSA9ICgobW5nX3Bhc3RwKXBDaHVuayktPmlUYXJnZXR0eXBlOworICAgIHBQQVNULT5pVGFyZ2V0eCAgICA9ICgobW5nX3Bhc3RwKXBDaHVuayktPmlUYXJnZXR4OworICAgIHBQQVNULT5pVGFyZ2V0eSAgICA9ICgobW5nX3Bhc3RwKXBDaHVuayktPmlUYXJnZXR5OworICAgIHBQQVNULT5pQ291bnQgICAgICA9ICgobW5nX3Bhc3RwKXBDaHVuayktPmlDb3VudDsKKworICAgIGlmIChwUEFTVC0+aUNvdW50KQorICAgIHsKKyAgICAgIG1uZ19zaXplX3QgaVNpemUgPSAobW5nX3NpemVfdCkocFBBU1QtPmlDb3VudCAqIHNpemVvZiAobW5nX3Bhc3Rfc291cmNlKSk7CisgICAgICBNTkdfQUxMT0MgKHBEYXRhLCBwUEFTVC0+cFNvdXJjZXMsIGlTaXplKTsKKyAgICAgIE1OR19DT1BZIChwUEFTVC0+cFNvdXJjZXMsICgobW5nX3Bhc3RwKXBDaHVuayktPnBTb3VyY2VzLCBpU2l6ZSk7CisgICAgfQorI2VuZGlmCisgIH0KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfRElTUExBWUNBTExTCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorICBpUmV0Y29kZSA9IG1uZ19wcm9jZXNzX2Rpc3BsYXlfcGFzdCAocERhdGEsIGlUYXJnZXRpZCwgaVRhcmdldHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpVGFyZ2V0eCwgaVRhcmdldHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpQ291bnQsIHBTb3VyY2VzKTsKKyNlbHNlCisgIGlSZXRjb2RlID0gbW5nX3Byb2Nlc3NfZGlzcGxheV9wYXN0IChwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobW5nX3Bhc3RwKXBDaHVuayktPmlEZXN0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG1uZ19wYXN0cClwQ2h1bmspLT5pVGFyZ2V0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobW5nX3Bhc3RwKXBDaHVuayktPmlUYXJnZXR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChtbmdfcGFzdHApcENodW5rKS0+aVRhcmdldHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG1uZ19wYXN0cClwQ2h1bmspLT5pQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG1uZ19wYXN0cClwQ2h1bmspLT5wU291cmNlcyk7CisjZW5kaWYKKyNlbHNlCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorICBwRGF0YS0+aVBBU1R0YXJnZXRpZCAgID0gaVRhcmdldGlkOworICBwRGF0YS0+aVBBU1R0YXJnZXR0eXBlID0gaVRhcmdldHR5cGU7CisgIHBEYXRhLT5pUEFTVHRhcmdldHggICAgPSBpVGFyZ2V0eDsKKyAgcERhdGEtPmlQQVNUdGFyZ2V0eSAgICA9IGlUYXJnZXR5OworICBwRGF0YS0+aVBBU1Rjb3VudCAgICAgID0gaUNvdW50OworICBwRGF0YS0+cFBBU1Rzb3VyY2VzICAgID0gcFNvdXJjZXM7CisjZWxzZQorICBwRGF0YS0+aVBBU1R0YXJnZXRpZCAgID0gKChtbmdfcGFzdHApcENodW5rKS0+aURlc3RpZDsKKyAgcERhdGEtPmlQQVNUdGFyZ2V0dHlwZSA9ICgobW5nX3Bhc3RwKXBDaHVuayktPmlUYXJnZXR0eXBlOworICBwRGF0YS0+aVBBU1R0YXJnZXR4ICAgID0gKChtbmdfcGFzdHApcENodW5rKS0+aVRhcmdldHg7CisgIHBEYXRhLT5pUEFTVHRhcmdldHkgICAgPSAoKG1uZ19wYXN0cClwQ2h1bmspLT5pVGFyZ2V0eTsKKyAgcERhdGEtPmlQQVNUY291bnQgICAgICA9ICgobW5nX3Bhc3RwKXBDaHVuayktPmlDb3VudDsKKyAgcERhdGEtPnBQQVNUc291cmNlcyAgICA9ICgobW5nX3Bhc3RwKXBDaHVuayktPnBTb3VyY2VzOworI2VuZGlmCisKKyAgaVJldGNvZGUgPSBtbmdfcHJvY2Vzc19kaXNwbGF5X3Bhc3QgKHBEYXRhKTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0NSRUFURV9BTklfUEFTVCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gaVJldGNvZGU7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX1BBU1QKK21uZ19yZXRjb2RlIG1uZ19mcmVlX2FuaV9wYXN0IChtbmdfZGF0YXAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfb2JqZWN0cCBwT2JqZWN0KQoreworICBtbmdfYW5pX3Bhc3RwIHBQQVNUID0gKG1uZ19hbmlfcGFzdHApcE9iamVjdDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX0FOSV9QQVNULCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKHBQQVNULT5pQ291bnQpCisgICAgTU5HX0ZSRUVYIChwRGF0YSwgcFBBU1QtPnBTb3VyY2VzLCAocFBBU1QtPmlDb3VudCAqIHNpemVvZiAobW5nX3Bhc3Rfc291cmNlKSkpOworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9PQkpDTEVBTlVQCisgIE1OR19GUkVFWCAocERhdGEsIHBPYmplY3QsIHNpemVvZiAobW5nX2FuaV9wYXN0KSk7CisjZW5kaWYKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX0FOSV9QQVNULCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisjaWZuZGVmIE1OR19PUFRJTUlaRV9PQkpDTEVBTlVQCisgIHJldHVybiBNTkdfTk9FUlJPUjsKKyNlbHNlCisgIHJldHVybiBtbmdfZnJlZV9vYmpfZ2VuZXJhbChwRGF0YSwgcE9iamVjdCk7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfUEFTVAorbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfYW5pX3Bhc3QgKG1uZ19kYXRhcCAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19vYmplY3RwIHBPYmplY3QpCit7CisgIG1uZ19hbmlfcGFzdHAgcFBBU1QgPSAobW5nX2FuaV9wYXN0cClwT2JqZWN0OworICBtbmdfcmV0Y29kZSBpUmV0Y29kZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9DRVNTX0FOSV9QQVNULCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0RJU1BMQVlDQUxMUworICBpUmV0Y29kZSA9IG1uZ19wcm9jZXNzX2Rpc3BsYXlfcGFzdCAocERhdGEsIHBQQVNULT5pVGFyZ2V0aWQsIHBQQVNULT5pVGFyZ2V0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQQVNULT5pVGFyZ2V0eCwgcFBBU1QtPmlUYXJnZXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBBU1QtPmlDb3VudCwgcFBBU1QtPnBTb3VyY2VzKTsKKyNlbHNlCisgIHBEYXRhLT5pUEFTVHRhcmdldGlkICAgPSBwUEFTVC0+aVRhcmdldGlkOworICBwRGF0YS0+aVBBU1R0YXJnZXR0eXBlID0gcFBBU1QtPmlUYXJnZXR0eXBlOworICBwRGF0YS0+aVBBU1R0YXJnZXR4ICAgID0gcFBBU1QtPmlUYXJnZXR4OworICBwRGF0YS0+aVBBU1R0YXJnZXR5ICAgID0gcFBBU1QtPmlUYXJnZXR5OworICBwRGF0YS0+aVBBU1Rjb3VudCAgICAgID0gcFBBU1QtPmlDb3VudDsKKyAgcERhdGEtPnBQQVNUc291cmNlcyAgICA9IHBQQVNULT5wU291cmNlczsKKworICBpUmV0Y29kZSA9IG1uZ19wcm9jZXNzX2Rpc3BsYXlfcGFzdCAocERhdGEpOworI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19BTklfUEFTVCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gaVJldGNvZGU7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX0RJU0MKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCittbmdfcmV0Y29kZSBtbmdfY3JlYXRlX2FuaV9kaXNjIChtbmdfZGF0YXAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgIGlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTZwIHBJZHMpCisjZWxzZQorbW5nX3JldGNvZGUgbW5nX2NyZWF0ZV9hbmlfZGlzYyAobW5nX2RhdGFwICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfY2h1bmtwICBwQ2h1bmspCisjZW5kaWYKK3sKKyAgbW5nX2FuaV9kaXNjcCBwRElTQzsKKyAgbW5nX3JldGNvZGUgICBpUmV0Y29kZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9DUkVBVEVfQU5JX0RJU0MsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAocERhdGEtPmJDYWNoZXBsYXliYWNrKSAgICAgICAgICAgLyogY2FjaGluZyBwbGF5YmFjayBpbmZvID8gKi8KKyAgeworI2lmZGVmIE1OR19PUFRJTUlaRV9PQkpDTEVBTlVQCisgICAgbW5nX3B0ciBwVGVtcDsKKyAgICBpUmV0Y29kZSA9IGNyZWF0ZV9vYmpfZ2VuZXJhbCAocERhdGEsIHNpemVvZiAobW5nX2FuaV9kaXNjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ZyZWVfYW5pX2Rpc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wcm9jZXNzX2FuaV9kaXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFRlbXApOworICAgIGlmIChpUmV0Y29kZSkKKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICBwRElTQyA9IChtbmdfYW5pX2Rpc2NwKXBUZW1wOworI2Vsc2UKKyAgICBNTkdfQUxMT0MgKHBEYXRhLCBwRElTQywgc2l6ZW9mIChtbmdfYW5pX2Rpc2MpKTsKKworICAgIHBESVNDLT5zSGVhZGVyLmZDbGVhbnVwID0gbW5nX2ZyZWVfYW5pX2Rpc2M7CisgICAgcERJU0MtPnNIZWFkZXIuZlByb2Nlc3MgPSBtbmdfcHJvY2Vzc19hbmlfZGlzYzsKKyNlbmRpZgorCisgICAgbW5nX2FkZF9hbmlfb2JqZWN0IChwRGF0YSwgKG1uZ19vYmplY3RfaGVhZGVycClwRElTQyk7CisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisgICAgcERJU0MtPmlDb3VudCA9IGlDb3VudDsKKworICAgIGlmIChpQ291bnQpCisgICAgeworICAgICAgTU5HX0FMTE9DIChwRGF0YSwgcERJU0MtPnBJZHMsIChpQ291bnQgPDwgMSkpOworICAgICAgTU5HX0NPUFkgKHBESVNDLT5wSWRzLCBwSWRzLCAoaUNvdW50IDw8IDEpKTsKKyAgICB9CisjZWxzZQorICAgIHBESVNDLT5pQ291bnQgPSAoKG1uZ19kaXNjcClwQ2h1bmspLT5pQ291bnQ7CisKKyAgICBpZiAocERJU0MtPmlDb3VudCkKKyAgICB7CisgICAgICBtbmdfc2l6ZV90IGlTaXplID0gKG1uZ19zaXplX3QpKHBESVNDLT5pQ291bnQgPDwgMSk7CisgICAgICBNTkdfQUxMT0MgKHBEYXRhLCBwRElTQy0+cElkcywgaVNpemUpOworICAgICAgTU5HX0NPUFkgKHBESVNDLT5wSWRzLCAoKG1uZ19kaXNjcClwQ2h1bmspLT5wT2JqZWN0aWRzLCBpU2l6ZSk7CisgICAgfQorI2VuZGlmCisgIH0KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfRElTUExBWUNBTExTCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorICBpUmV0Y29kZSA9IG1uZ19wcm9jZXNzX2Rpc3BsYXlfZGlzYyAocERhdGEsIGlDb3VudCwgcElkcyk7CisjZWxzZQorICBpUmV0Y29kZSA9IG1uZ19wcm9jZXNzX2Rpc3BsYXlfZGlzYyAocERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG1uZ19kaXNjcClwQ2h1bmspLT5pQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG1uZ19kaXNjcClwQ2h1bmspLT5wT2JqZWN0aWRzKTsKKyNlbmRpZgorI2Vsc2UKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisgIHBEYXRhLT5pRElTQ2NvdW50ID0gaUNvdW50OworICBwRGF0YS0+cERJU0NpZHMgICA9IHBJZHM7CisjZWxzZQorICBwRGF0YS0+aURJU0Njb3VudCA9ICgobW5nX2Rpc2NwKXBDaHVuayktPmlDb3VudDsKKyAgcERhdGEtPnBESVNDaWRzICAgPSAoKG1uZ19kaXNjcClwQ2h1bmspLT5wT2JqZWN0aWRzOworI2VuZGlmCisKKyAgaVJldGNvZGUgPSBtbmdfcHJvY2Vzc19kaXNwbGF5X2Rpc2MgKHBEYXRhKTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0NSRUFURV9BTklfRElTQywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19mcmVlX2FuaV9kaXNjIChtbmdfZGF0YXAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfb2JqZWN0cCBwT2JqZWN0KQoreworICBtbmdfYW5pX2Rpc2NwIHBESVNDID0gKG1uZ19hbmlfZGlzY3ApcE9iamVjdDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX0FOSV9ESVNDLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKHBESVNDLT5pQ291bnQpCisgICAgTU5HX0ZSRUVYIChwRGF0YSwgcERJU0MtPnBJZHMsIChwRElTQy0+aUNvdW50IDw8IDEpKTsKKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfT0JKQ0xFQU5VUAorICBNTkdfRlJFRVggKHBEYXRhLCBwT2JqZWN0LCBzaXplb2YgKG1uZ19hbmlfZGlzYykpOworI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9BTklfRElTQywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfT0JKQ0xFQU5VUAorICByZXR1cm4gTU5HX05PRVJST1I7CisjZWxzZQorICByZXR1cm4gbW5nX2ZyZWVfb2JqX2dlbmVyYWwocERhdGEsIHBPYmplY3QpOworI2VuZGlmCit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19wcm9jZXNzX2FuaV9kaXNjIChtbmdfZGF0YXAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfb2JqZWN0cCBwT2JqZWN0KQoreworICBtbmdfYW5pX2Rpc2NwIHBESVNDID0gKG1uZ19hbmlfZGlzY3ApcE9iamVjdDsKKyAgbW5nX3JldGNvZGUgaVJldGNvZGU7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19BTklfRElTQywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisjaWZuZGVmIE1OR19PUFRJTUlaRV9ESVNQTEFZQ0FMTFMKKyAgaVJldGNvZGUgPSBtbmdfcHJvY2Vzc19kaXNwbGF5X2Rpc2MgKHBEYXRhLCBwRElTQy0+aUNvdW50LCBwRElTQy0+cElkcyk7CisjZWxzZQorICBwRGF0YS0+aURJU0Njb3VudCA9IHBESVNDLT5pQ291bnQ7CisgIHBEYXRhLT5wRElTQ2lkcyAgID0gcERJU0MtPnBJZHM7CisKKyAgaVJldGNvZGUgPSBtbmdfcHJvY2Vzc19kaXNwbGF5X2Rpc2MgKHBEYXRhKTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST0NFU1NfQU5JX0RJU0MsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIGlSZXRjb2RlOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfRFlOQU1JQ01ORworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorbW5nX3JldGNvZGUgbW5nX2NyZWF0ZV9ldmVudCAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaUV2ZW50dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaU1hc2t0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpTGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaVJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpVG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpQm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpT2JqZWN0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggIGlJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaVNlZ21lbnRuYW1lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wY2hhciAgelNlZ21lbnRuYW1lKQorI2Vsc2UKK21uZ19yZXRjb2RlIG1uZ19jcmVhdGVfZXZlbnQgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcHRyICAgIHBFbnRyeSkKKyNlbmRpZgoreworICBtbmdfZXZlbnRwIHBFdmVudDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9DUkVBVEVfRVZFTlQsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAocERhdGEtPmJDYWNoZXBsYXliYWNrKSAgICAgICAgICAgLyogY2FjaGluZyBwbGF5YmFjayBpbmZvID8gKi8KKyAgeworICAgIG1uZ19vYmplY3RfaGVhZGVycCBwTGFzdDsKKworI2lmZGVmIE1OR19PUFRJTUlaRV9PQkpDTEVBTlVQCisgICAgbW5nX3B0ciAgICAgcFRlbXA7CisgICAgbW5nX3JldGNvZGUgaVJldGNvZGUgPSBjcmVhdGVfb2JqX2dlbmVyYWwgKHBEYXRhLCBzaXplb2YgKG1uZ19ldmVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19mcmVlX2V2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcHJvY2Vzc19ldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBUZW1wKTsKKyAgICBpZiAoaVJldGNvZGUpCisgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgcEV2ZW50ID0gKG1uZ19ldmVudHApcFRlbXA7CisjZWxzZQorICAgIE1OR19BTExPQyAocERhdGEsIHBFdmVudCwgc2l6ZW9mIChtbmdfZXZlbnQpKTsKKworICAgIHBFdmVudC0+c0hlYWRlci5mQ2xlYW51cCA9IG1uZ19mcmVlX2V2ZW50OworICAgIHBFdmVudC0+c0hlYWRlci5mUHJvY2VzcyA9IG1uZ19wcm9jZXNzX2V2ZW50OworI2VuZGlmCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisgICAgcEV2ZW50LT5pRXZlbnR0eXBlICAgICAgID0gaUV2ZW50dHlwZTsKKyAgICBwRXZlbnQtPmlNYXNrdHlwZSAgICAgICAgPSBpTWFza3R5cGU7CisgICAgcEV2ZW50LT5pTGVmdCAgICAgICAgICAgID0gaUxlZnQ7CisgICAgcEV2ZW50LT5pUmlnaHQgICAgICAgICAgID0gaVJpZ2h0OworICAgIHBFdmVudC0+aVRvcCAgICAgICAgICAgICA9IGlUb3A7CisgICAgcEV2ZW50LT5pQm90dG9tICAgICAgICAgID0gaUJvdHRvbTsKKyAgICBwRXZlbnQtPmlPYmplY3RpZCAgICAgICAgPSBpT2JqZWN0aWQ7CisgICAgcEV2ZW50LT5pSW5kZXggICAgICAgICAgID0gaUluZGV4OworICAgIHBFdmVudC0+aVNlZ21lbnRuYW1lc2l6ZSA9IGlTZWdtZW50bmFtZXNpemU7CisKKyAgICBpZiAoaVNlZ21lbnRuYW1lc2l6ZSkKKyAgICB7CisgICAgICBNTkdfQUxMT0MgKHBEYXRhLCBwRXZlbnQtPnpTZWdtZW50bmFtZSwgaVNlZ21lbnRuYW1lc2l6ZSsxKTsKKyAgICAgIE1OR19DT1BZIChwRXZlbnQtPnpTZWdtZW50bmFtZSwgelNlZ21lbnRuYW1lLCBpU2VnbWVudG5hbWVzaXplKTsKKyAgICB9CisjZWxzZQorICAgIHBFdmVudC0+aUV2ZW50dHlwZSAgICAgICA9ICgobW5nX2V2bnRfZW50cnlwKXBFbnRyeSktPmlFdmVudHR5cGU7CisgICAgcEV2ZW50LT5pTWFza3R5cGUgICAgICAgID0gKChtbmdfZXZudF9lbnRyeXApcEVudHJ5KS0+aU1hc2t0eXBlOworICAgIHBFdmVudC0+aUxlZnQgICAgICAgICAgICA9ICgobW5nX2V2bnRfZW50cnlwKXBFbnRyeSktPmlMZWZ0OworICAgIHBFdmVudC0+aVJpZ2h0ICAgICAgICAgICA9ICgobW5nX2V2bnRfZW50cnlwKXBFbnRyeSktPmlSaWdodDsKKyAgICBwRXZlbnQtPmlUb3AgICAgICAgICAgICAgPSAoKG1uZ19ldm50X2VudHJ5cClwRW50cnkpLT5pVG9wOworICAgIHBFdmVudC0+aUJvdHRvbSAgICAgICAgICA9ICgobW5nX2V2bnRfZW50cnlwKXBFbnRyeSktPmlCb3R0b207CisgICAgcEV2ZW50LT5pT2JqZWN0aWQgICAgICAgID0gKChtbmdfZXZudF9lbnRyeXApcEVudHJ5KS0+aU9iamVjdGlkOworICAgIHBFdmVudC0+aUluZGV4ICAgICAgICAgICA9ICgobW5nX2V2bnRfZW50cnlwKXBFbnRyeSktPmlJbmRleDsKKyAgICBwRXZlbnQtPmlTZWdtZW50bmFtZXNpemUgPSAoKG1uZ19ldm50X2VudHJ5cClwRW50cnkpLT5pU2VnbWVudG5hbWVzaXplOworCisgICAgaWYgKHBFdmVudC0+aVNlZ21lbnRuYW1lc2l6ZSkKKyAgICB7CisgICAgICBNTkdfQUxMT0MgKHBEYXRhLCBwRXZlbnQtPnpTZWdtZW50bmFtZSwgcEV2ZW50LT5pU2VnbWVudG5hbWVzaXplKzEpOworICAgICAgTU5HX0NPUFkgKHBFdmVudC0+elNlZ21lbnRuYW1lLCAoKG1uZ19ldm50X2VudHJ5cClwRW50cnkpLT56U2VnbWVudG5hbWUsIHBFdmVudC0+aVNlZ21lbnRuYW1lc2l6ZSk7CisgICAgfQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaXh1cCB0aGUgZG91YmxlLWxpbmtlZCBsaXN0ICovCisgICAgcExhc3QgICAgICAgICAgICAgICAgICAgID0gKG1uZ19vYmplY3RfaGVhZGVycClwRGF0YS0+cExhc3RldmVudDsKKworICAgIGlmIChwTGFzdCkgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGluayBpdCBhcyBsYXN0IGluIHRoZSBjaGFpbiAqLworICAgIHsKKyAgICAgIHBFdmVudC0+c0hlYWRlci5wUHJldiAgPSBwTGFzdDsKKyAgICAgIHBMYXN0LT5wTmV4dCAgICAgICAgICAgPSBwRXZlbnQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBwRGF0YS0+cEZpcnN0ZXZlbnQgICAgID0gcEV2ZW50OworICAgIH0KKworICAgIHBEYXRhLT5wTGFzdGV2ZW50ICAgICAgICA9IHBFdmVudDsKKyAgICBwRGF0YS0+YkR5bmFtaWMgICAgICAgICAgPSBNTkdfVFJVRTsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0NSRUFURV9FVkVOVCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19mcmVlX2V2ZW50IChtbmdfZGF0YXAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfb2JqZWN0cCBwT2JqZWN0KQoreworICBtbmdfZXZlbnRwIHBFdmVudCA9IChtbmdfZXZlbnRwKXBPYmplY3Q7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9FVkVOVCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmIChwRXZlbnQtPmlTZWdtZW50bmFtZXNpemUpCisgICAgTU5HX0ZSRUVYIChwRGF0YSwgcEV2ZW50LT56U2VnbWVudG5hbWUsIHBFdmVudC0+aVNlZ21lbnRuYW1lc2l6ZSArIDEpOworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9PQkpDTEVBTlVQCisgIE1OR19GUkVFWCAocERhdGEsIHBFdmVudCwgc2l6ZW9mIChtbmdfZXZlbnQpKTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfRVZFTlQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX09CSkNMRUFOVVAKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworI2Vsc2UKKyAgcmV0dXJuIG1uZ19mcmVlX29ial9nZW5lcmFsKHBEYXRhLCBwT2JqZWN0KTsKKyNlbmRpZgorfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19ldmVudCAobW5nX2RhdGFwICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX29iamVjdHAgcE9iamVjdCkKK3sKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19TRUVLCisgIG1uZ19ldmVudHAgICAgICAgICBwRXZlbnQgID0gKG1uZ19ldmVudHApcE9iamVjdDsKKyAgbW5nX29iamVjdF9oZWFkZXJwIHBBbmk7CisgIG1uZ19ib29sICAgICAgICAgICBiRm91bmQgPSBNTkdfRkFMU0U7CisjZW5kaWYKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9DRVNTX0VWRU5ULCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19TRUVLCisgIGlmICghcEV2ZW50LT5wU0VFSykgICAgICAgICAgICAgICAgICAvKiBuZWVkIHRvIGZpbmQgU0VFSyBmaXJzdCA/ICovCisgIHsKKyAgICBwQW5pID0gKG1uZ19vYmplY3RfaGVhZGVycClwRGF0YS0+cEZpcnN0YW5pb2JqOworCisgICAgd2hpbGUgKChwQW5pKSAmJiAoIWJGb3VuZCkpCisgICAgeworICAgICAgaWYgKChwQW5pLT5mQ2xlYW51cCA9PSBtbmdfZnJlZV9hbmlfc2VlaykgJiYKKyAgICAgICAgICAoc3RyY21wKHBFdmVudC0+elNlZ21lbnRuYW1lLCAoKG1uZ19hbmlfc2Vla3ApcEFuaSktPnpTZWdtZW50bmFtZSkgPT0gMCkpCisgICAgICAgIGJGb3VuZCA9IE1OR19UUlVFOworICAgICAgZWxzZQorICAgICAgICBwQW5pID0gKG1uZ19vYmplY3RfaGVhZGVycClwQW5pLT5wTmV4dDsKKyAgICB9CisKKyAgICBpZiAocEFuaSkKKyAgICAgIHBFdmVudC0+cFNFRUsgPSAobW5nX2FuaV9zZWVrcClwQW5pOworICB9CisKKyAgaWYgKHBFdmVudC0+cFNFRUspICAgICAgICAgICAgICAgICAgIC8qIGFueXRoaW5nIHRvIGRvID8gKi8KKyAgeworICAgIHBFdmVudC0+aUxhc3R4ID0gcERhdGEtPmlFdmVudHg7CisgICAgcEV2ZW50LT5pTGFzdHkgPSBwRGF0YS0+aUV2ZW50eTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxldCdzIHN0YXJ0IGZyb20gdGhpcyBTRUVLIHRoZW4gKi8KKyAgICBwRGF0YS0+cEN1cnJhbmlvYmogICA9IChtbmdfb2JqZWN0cClwRXZlbnQtPnBTRUVLOworICAgIHBEYXRhLT5iUnVubmluZ2V2ZW50ID0gTU5HX1RSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3YWtlLXVwIHRoZSBhcHAgISAqLworICAgIGlmICghcERhdGEtPmZTZXR0aW1lciAoKG1uZ19oYW5kbGUpcERhdGEsIDUpKQorICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0FQUFRJTUVSRVJST1IpOworCisgIH0KKyAgZWxzZQorICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19TRUVLTk9URk9VTkQpOworI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19FVkVOVCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9EWU5BTUlDTU5HICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX0lOQ0xVREVfTVBOR19QUk9QT1NBTAorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorbW5nX3JldGNvZGUgbW5nX2NyZWF0ZV9tcG5nX29iaiAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaUZyYW1ld2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlGcmFtZWhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU51bXBsYXlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpVGlja3NwZXJzZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlGcmFtZXNzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3B0ciAgICBwRnJhbWVzKQorI2Vsc2UKK21uZ19yZXRjb2RlIG1uZ19jcmVhdGVfbXBuZ19vYmogKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcHRyICAgIHBFbnRyeSkKKyNlbmRpZgoreworICBtbmdfbXBuZ19vYmpwIHBNUE5HOworICBtbmdfcHRyICAgICAgIHBUZW1wOworICBtbmdfcmV0Y29kZSAgIGlSZXRjb2RlOworICBtbmdfdWludDhwICAgIHBGcmFtZTsKKyAgbW5nX2ludDMyICAgICBpQ250LCBpTWF4OworICBtbmdfdWludDMyICAgIGlYLCBpWSwgaVdpZHRoLCBpSGVpZ2h0OworICBtbmdfaW50MzIgICAgIGlYb2Zmc2V0LCBpWW9mZnNldDsKKyAgbW5nX3VpbnQxNiAgICBpVGlja3M7CisgIG1uZ191aW50MTYgICAgaURlbGF5OworICBtbmdfYm9vbCAgICAgIGJOZXdmcmFtZTsKKyAgbW5nX2FuaV9sb29wcCBwTE9PUDsKKyAgbW5nX2FuaV9lbmRscCBwRU5ETDsKKyAgbW5nX2FuaV9mcmFtcCBwRlJBTTsKKyAgbW5nX2FuaV9tb3ZlcCBwTU9WRTsKKyAgbW5nX2FuaV9jbGlwcCBwQ0xJUDsKKyAgbW5nX2FuaV9zaG93cCBwU0hPVzsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9DUkVBVEVfTVBOR19PQkosIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworI2lmZGVmIE1OR19PUFRJTUlaRV9PQkpDTEVBTlVQCisgIGlSZXRjb2RlID0gY3JlYXRlX29ial9nZW5lcmFsIChwRGF0YSwgc2l6ZW9mIChtbmdfbXBuZ19vYmopLCBtbmdfZnJlZV9tcG5nX29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wcm9jZXNzX21wbmdfb2JqLCAmcFRlbXApOworICBpZiAoaVJldGNvZGUpCisgICAgcmV0dXJuIGlSZXRjb2RlOworICBwTVBORyA9IChtbmdfbXBuZ19vYmpwKXBUZW1wOworI2Vsc2UKKyAgTU5HX0FMTE9DIChwRGF0YSwgcE1QTkcsIHNpemVvZiAobW5nX21wbmdfb2JqKSk7CisKKyAgcE1QTkctPnNIZWFkZXIuZkNsZWFudXAgPSBtbmdfZnJlZV9tcG5nX29iajsKKyAgcE1QTkctPnNIZWFkZXIuZlByb2Nlc3MgPSBtbmdfcHJvY2Vzc19tcG5nX29iajsKKyNlbmRpZgorCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorICBwTVBORy0+aUZyYW1ld2lkdGggID0gaUZyYW1ld2lkdGg7CisgIHBNUE5HLT5pRnJhbWVoZWlnaHQgPSBpRnJhbWVoZWlnaHQ7CisgIHBNUE5HLT5pTnVtcGxheXMgICAgPSBpTnVtcGxheXM7CisgIHBNUE5HLT5pVGlja3NwZXJzZWMgPSBpVGlja3NwZXJzZWM7CisgIHBNUE5HLT5pRnJhbWVzc2l6ZSAgPSBpRnJhbWVzc2l6ZTsKKworICBpZiAoaUZyYW1lc3NpemUpCisgIHsKKyAgICBNTkdfQUxMT0MgKHBEYXRhLCBwTVBORy0+cEZyYW1lcywgaUZyYW1lc3NpemUpOworICAgIE1OR19DT1BZIChwTVBORy0+cEZyYW1lcywgcEZyYW1lcywgaUZyYW1lc3NpemUpOworICB9CisjZWxzZQorICBwTVBORy0+aUZyYW1ld2lkdGggID0gKChtbmdfbXBuZ3ApcEVudHJ5KS0+aUZyYW1ld2lkdGg7CisgIHBNUE5HLT5pRnJhbWVoZWlnaHQgPSAoKG1uZ19tcG5ncClwRW50cnkpLT5pRnJhbWVoZWlnaHQ7CisgIHBNUE5HLT5pTnVtcGxheXMgICAgPSAoKG1uZ19tcG5ncClwRW50cnkpLT5pTnVtcGxheXM7CisgIHBNUE5HLT5pVGlja3NwZXJzZWMgPSAoKG1uZ19tcG5ncClwRW50cnkpLT5pVGlja3NwZXJzZWM7CisgIHBNUE5HLT5pRnJhbWVzc2l6ZSAgPSAoKG1uZ19tcG5ncClwRW50cnkpLT5pRnJhbWVzc2l6ZTsKKworICBpZiAocE1QTkctPmlGcmFtZXNzaXplKQorICB7CisgICAgTU5HX0FMTE9DIChwRGF0YSwgcE1QTkctPnBGcmFtZXMsIHBNUE5HLT5pRnJhbWVzc2l6ZSk7CisgICAgTU5HX0NPUFkgKHBNUE5HLT5wRnJhbWVzLCAoKG1uZ19tcG5ncClwRW50cnkpLT5wRnJhbWVzLCBwTVBORy0+aUZyYW1lc3NpemUpOworICB9CisjZW5kaWYKKworICBwRGF0YS0+cE1QTkcgICAgICA9IHBNUE5HOworICBwRGF0YS0+ZUltYWdldHlwZSA9IG1uZ19pdF9tcG5nOworCisgIGlSZXRjb2RlID0gbW5nX3Byb2Nlc3NfZGlzcGxheV9tcG5nIChwRGF0YSk7CisgIGlmIChpUmV0Y29kZSkKKyAgICByZXR1cm4gaVJldGNvZGU7CisKKyAgLyogbm93IGxldCdzIGNyZWF0ZSB0aGUgTU5HIGFuaW1hdGlvbiBkaXJlY3RpdmVzIGZyb20gdGhpcyAqLworCisgIHBGcmFtZSA9IChtbmdfdWludDhwKXBNUE5HLT5wRnJhbWVzOworICBpTWF4ICAgPSBwTVBORy0+aUZyYW1lc3NpemUgLyAyNjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNldCB1cCBNTkcgaW1wZXJzb25hdGlvbiAqLworICBwRGF0YS0+aVRpY2tzICAgICAgPSBwTVBORy0+aVRpY2tzcGVyc2VjOworICBwRGF0YS0+aUxheWVyY291bnQgPSBpTWF4OworCisgIGlmIChwTVBORy0+aU51bXBsYXlzICE9IDEpICAgICAgICAgICAvKiBjcmVhdGUgYSBMT09QL0VOREwgcGFpciA/ICovCisgIHsKKyNpZmRlZiBNTkdfT1BUSU1JWkVfT0JKQ0xFQU5VUAorICAgIGlSZXRjb2RlID0gY3JlYXRlX29ial9nZW5lcmFsIChwRGF0YSwgc2l6ZW9mIChtbmdfYW5pX2xvb3ApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfZnJlZV9hbmlfbG9vcCwgbW5nX3Byb2Nlc3NfYW5pX2xvb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoKG1uZ19wdHIpcExPT1ApKTsKKyAgICBpZiAoaVJldGNvZGUpCisgICAgICByZXR1cm4gaVJldGNvZGU7CisjZWxzZQorICAgIE1OR19BTExPQyAocERhdGEsIHBMT09QLCBzaXplb2YgKG1uZ19hbmlfbG9vcCkpOworCisgICAgcExPT1AtPnNIZWFkZXIuZkNsZWFudXAgPSBtbmdfZnJlZV9hbmlfbG9vcDsKKyAgICBwTE9PUC0+c0hlYWRlci5mUHJvY2VzcyA9IG1uZ19wcm9jZXNzX2FuaV9sb29wOworI2VuZGlmCisKKyAgICBwTE9PUC0+aUxldmVsID0gMTsKKyAgICBpZiAocE1QTkctPmlOdW1wbGF5cykKKyAgICAgIHBMT09QLT5pUmVwZWF0Y291bnQgPSBwTVBORy0+aU51bXBsYXlzOworICAgIGVsc2UKKyAgICAgIHBMT09QLT5pUmVwZWF0Y291bnQgPSAweEZGRkZGRkZGbDsKKworICAgIG1uZ19hZGRfYW5pX29iamVjdCAocERhdGEsIChtbmdfb2JqZWN0X2hlYWRlcnApcExPT1ApOworICB9CisKKyAgYk5ld2ZyYW1lID0gTU5HX1RSVUU7ICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSB0aGUgZnJhbWUgZGlzcGxheSBvYmplY3RzICovCisKKyAgZm9yIChpQ250ID0gMDsgaUNudCA8IGlNYXg7IGlDbnQrKykKKyAgeworICAgIGlYICAgICAgID0gbW5nX2dldF91aW50MzIgKHBGcmFtZSk7CisgICAgaVkgICAgICAgPSBtbmdfZ2V0X3VpbnQzMiAocEZyYW1lKzQpOworICAgIGlXaWR0aCAgID0gbW5nX2dldF91aW50MzIgKHBGcmFtZSs4KTsKKyAgICBpSGVpZ2h0ICA9IG1uZ19nZXRfdWludDMyIChwRnJhbWUrMTIpOworICAgIGlYb2Zmc2V0ID0gbW5nX2dldF9pbnQzMiAgKHBGcmFtZSsxNik7CisgICAgaVlvZmZzZXQgPSBtbmdfZ2V0X2ludDMyICAocEZyYW1lKzIwKTsKKyAgICBpVGlja3MgICA9IG1uZ19nZXRfdWludDE2IChwRnJhbWUrMjQpOworCisgICAgaURlbGF5ID0gaVRpY2tzOworICAgIGlmICghaURlbGF5KQorICAgIHsKKyAgICAgIG1uZ191aW50OHAgcFRlbXAgPSBwRnJhbWUrMjY7CisgICAgICBtbmdfaW50MzIgIGlUZW1wID0gaUNudCsxOworCisgICAgICB3aGlsZSAoKGlUZW1wIDwgaU1heCkgJiYgKCFpRGVsYXkpKQorICAgICAgeworICAgICAgICBpRGVsYXkgPSBtbmdfZ2V0X3VpbnQxNiAocFRlbXArMjQpOworICAgICAgICBwVGVtcCArPSAyNjsKKyAgICAgICAgaVRlbXArKzsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYk5ld2ZyYW1lKQorICAgIHsKKyNpZmRlZiBNTkdfT1BUSU1JWkVfT0JKQ0xFQU5VUAorICAgICAgaVJldGNvZGUgPSBjcmVhdGVfb2JqX2dlbmVyYWwgKHBEYXRhLCBzaXplb2YgKG1uZ19hbmlfZnJhbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ZyZWVfb2JqX2dlbmVyYWwsIG1uZ19wcm9jZXNzX2FuaV9mcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoKG1uZ19wdHIpcEZSQU0pKTsKKyAgICAgIGlmIChpUmV0Y29kZSkKKyAgICAgICAgcmV0dXJuIGlSZXRjb2RlOworI2Vsc2UKKyAgICAgIE1OR19BTExPQyAocERhdGEsIHBGUkFNLCBzaXplb2YgKG1uZ19hbmlfZnJhbSkpOworCisgICAgICBwRlJBTS0+c0hlYWRlci5mQ2xlYW51cCA9IG1uZ19mcmVlX2FuaV9mcmFtOworICAgICAgcEZSQU0tPnNIZWFkZXIuZlByb2Nlc3MgPSBtbmdfcHJvY2Vzc19hbmlfZnJhbTsKKyNlbmRpZgorCisgICAgICBwRlJBTS0+aUZyYW1lbW9kZSAgID0gNDsKKyAgICAgIHBGUkFNLT5pQ2hhbmdlZGVsYXkgPSAxOworICAgICAgcEZSQU0tPmlEZWxheSAgICAgICA9IGlEZWxheTsKKworICAgICAgbW5nX2FkZF9hbmlfb2JqZWN0IChwRGF0YSwgKG1uZ19vYmplY3RfaGVhZGVycClwRlJBTSk7CisgICAgfQorCisjaWZkZWYgTU5HX09QVElNSVpFX09CSkNMRUFOVVAKKyAgICBpUmV0Y29kZSA9IGNyZWF0ZV9vYmpfZ2VuZXJhbCAocERhdGEsIHNpemVvZiAobW5nX2FuaV9tb3ZlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ZyZWVfb2JqX2dlbmVyYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wcm9jZXNzX2FuaV9tb3ZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKChtbmdfcHRyKXBNT1ZFKSk7CisgICAgaWYgKGlSZXRjb2RlKQorICAgICAgcmV0dXJuIGlSZXRjb2RlOworI2Vsc2UKKyAgICBNTkdfQUxMT0MgKHBEYXRhLCBwTU9WRSwgc2l6ZW9mIChtbmdfYW5pX21vdmUpKTsKKworICAgIHBNT1ZFLT5zSGVhZGVyLmZDbGVhbnVwID0gbW5nX2ZyZWVfYW5pX21vdmU7CisgICAgcE1PVkUtPnNIZWFkZXIuZlByb2Nlc3MgPSBtbmdfcHJvY2Vzc19hbmlfbW92ZTsKKyNlbmRpZgorCisgICAgcE1PVkUtPmlMb2NheCAgID0gaVhvZmZzZXQgLSAobW5nX2ludDMyKWlYOworICAgIHBNT1ZFLT5pTG9jYXkgICA9IGlZb2Zmc2V0IC0gKG1uZ19pbnQzMilpWTsKKworICAgIG1uZ19hZGRfYW5pX29iamVjdCAocERhdGEsIChtbmdfb2JqZWN0X2hlYWRlcnApcE1PVkUpOworCisjaWZkZWYgTU5HX09QVElNSVpFX09CSkNMRUFOVVAKKyAgICBpUmV0Y29kZSA9IGNyZWF0ZV9vYmpfZ2VuZXJhbCAocERhdGEsIHNpemVvZiAobW5nX2FuaV9jbGlwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ZyZWVfb2JqX2dlbmVyYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wcm9jZXNzX2FuaV9jbGlwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKChtbmdfcHRyKXBDTElQKSk7CisgICAgaWYgKGlSZXRjb2RlKQorICAgICAgcmV0dXJuIGlSZXRjb2RlOworI2Vsc2UKKyAgICBNTkdfQUxMT0MgKHBEYXRhLCBwQ0xJUCwgc2l6ZW9mIChtbmdfYW5pX2NsaXApKTsKKworICAgIHBDTElQLT5zSGVhZGVyLmZDbGVhbnVwID0gbW5nX2ZyZWVfYW5pX2NsaXA7CisgICAgcENMSVAtPnNIZWFkZXIuZlByb2Nlc3MgPSBtbmdfcHJvY2Vzc19hbmlfY2xpcDsKKyNlbmRpZgorCisgICAgcENMSVAtPmlDbGlwbCA9IGlYb2Zmc2V0OworICAgIHBDTElQLT5pQ2xpcHIgPSBpWG9mZnNldCArIChtbmdfaW50MzIpaVdpZHRoOworICAgIHBDTElQLT5pQ2xpcHQgPSBpWW9mZnNldDsKKyAgICBwQ0xJUC0+aUNsaXBiID0gaVlvZmZzZXQgKyAobW5nX2ludDMyKWlIZWlnaHQ7CisKKyAgICBtbmdfYWRkX2FuaV9vYmplY3QgKHBEYXRhLCAobW5nX29iamVjdF9oZWFkZXJwKXBDTElQKTsKKworI2lmZGVmIE1OR19PUFRJTUlaRV9PQkpDTEVBTlVQCisgICAgaVJldGNvZGUgPSBjcmVhdGVfb2JqX2dlbmVyYWwgKHBEYXRhLCBzaXplb2YgKG1uZ19hbmlfc2hvdyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19mcmVlX29ial9nZW5lcmFsLCBtbmdfcHJvY2Vzc19hbmlfc2hvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJigobW5nX3B0cilwU0hPVykpOworICAgIGlmIChpUmV0Y29kZSkKKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKyNlbHNlCisgICAgTU5HX0FMTE9DIChwRGF0YSwgcFNIT1csIHNpemVvZiAobW5nX2FuaV9zaG93KSk7CisKKyAgICBwU0hPVy0+c0hlYWRlci5mQ2xlYW51cCA9IG1uZ19mcmVlX2FuaV9zaG93OworICAgIHBTSE9XLT5zSGVhZGVyLmZQcm9jZXNzID0gbW5nX3Byb2Nlc3NfYW5pX3Nob3c7CisjZW5kaWYKKworICAgIG1uZ19hZGRfYW5pX29iamVjdCAocERhdGEsIChtbmdfb2JqZWN0X2hlYWRlcnApcFNIT1cpOworCisgICAgYk5ld2ZyYW1lID0gKG1uZ19ib29sKWlUaWNrczsKKyAgICBwRnJhbWUgKz0gMjY7CisgIH0KKworICBpZiAocE1QTkctPmlOdW1wbGF5cyAhPSAxKSAgICAgICAgICAgLyogY3JlYXRlIGEgTE9PUC9FTkRMIHBhaXIgPyAqLworICB7CisjaWZkZWYgTU5HX09QVElNSVpFX09CSkNMRUFOVVAKKyAgICBpUmV0Y29kZSA9IGNyZWF0ZV9vYmpfZ2VuZXJhbCAocERhdGEsIHNpemVvZiAobW5nX2FuaV9lbmRsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ZyZWVfb2JqX2dlbmVyYWwsIG1uZ19wcm9jZXNzX2FuaV9lbmRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKChtbmdfcHRyKXBFTkRMKSk7CisgICAgaWYgKGlSZXRjb2RlKQorICAgICAgcmV0dXJuIGlSZXRjb2RlOworI2Vsc2UKKyAgICBNTkdfQUxMT0MgKHBEYXRhLCBwRU5ETCwgc2l6ZW9mIChtbmdfYW5pX2VuZGwpKTsKKworICAgIHBFTkRMLT5zSGVhZGVyLmZDbGVhbnVwID0gbW5nX2ZyZWVfYW5pX2VuZGw7CisgICAgcEVOREwtPnNIZWFkZXIuZlByb2Nlc3MgPSBtbmdfcHJvY2Vzc19hbmlfZW5kbDsKKyNlbmRpZgorCisgICAgcEVOREwtPmlMZXZlbCA9IDE7CisKKyAgICBtbmdfYWRkX2FuaV9vYmplY3QgKHBEYXRhLCAobW5nX29iamVjdF9oZWFkZXJwKXBFTkRMKTsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0NSRUFURV9NUE5HX09CSiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19mcmVlX21wbmdfb2JqIChtbmdfZGF0YXAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfb2JqZWN0cCBwT2JqZWN0KQoreworICBtbmdfbXBuZ19vYmpwIHBNUE5HID0gKG1uZ19tcG5nX29ianApcE9iamVjdDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9GUkVFX01QTkdfT0JKLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKHBNUE5HLT5pRnJhbWVzc2l6ZSkKKyAgICBNTkdfRlJFRVggKHBEYXRhLCBwTVBORy0+cEZyYW1lcywgcE1QTkctPmlGcmFtZXNzaXplKTsKKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfT0JKQ0xFQU5VUAorICBNTkdfRlJFRVggKHBEYXRhLCBwTVBORywgc2l6ZW9mIChtbmdfbXBuZ19vYmopKTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfTVBOR19PQkosIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX09CSkNMRUFOVVAKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworI2Vsc2UKKyAgcmV0dXJuIG1uZ19mcmVlX29ial9nZW5lcmFsKHBEYXRhLCBwT2JqZWN0KTsKKyNlbmRpZgorfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19tcG5nX29iaiAobW5nX2RhdGFwICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX29iamVjdHAgcE9iamVjdCkKK3sKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjZW5kaWYgLyogTU5HX0lOQ0xVREVfTVBOR19QUk9QT1NBTCAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19JTkNMVURFX0FOR19QUk9QT1NBTAorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorbW5nX3JldGNvZGUgbW5nX2NyZWF0ZV9hbmdfb2JqIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlOdW1mcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaVRpY2tzcGVyc2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlOdW1wbGF5cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpVGlsZXdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlUaWxlaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggIGlJbnRlcmxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaVN0aWxsdXNlZCkKKyNlbHNlCittbmdfcmV0Y29kZSBtbmdfY3JlYXRlX2FuZ19vYmogKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wdHIgICAgcEVudHJ5KQorI2VuZGlmCit7CisgIG1uZ19hbmdfb2JqcCAgcEFORzsKKyAgbW5nX3B0ciAgICAgICBwVGVtcDsKKyAgbW5nX3JldGNvZGUgICBpUmV0Y29kZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9DUkVBVEVfQU5HX09CSiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX09QVElNSVpFX09CSkNMRUFOVVAKKyAgaVJldGNvZGUgPSBjcmVhdGVfb2JqX2dlbmVyYWwgKHBEYXRhLCBzaXplb2YgKG1uZ19hbmdfb2JqKSwgbW5nX2ZyZWVfYW5nX29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wcm9jZXNzX2FuZ19vYmosICZwVGVtcCk7CisgIGlmIChpUmV0Y29kZSkKKyAgICByZXR1cm4gaVJldGNvZGU7CisgIHBBTkcgPSAobW5nX2FuZ19vYmpwKXBUZW1wOworI2Vsc2UKKyAgTU5HX0FMTE9DIChwRGF0YSwgcEFORywgc2l6ZW9mIChtbmdfYW5nX29iaikpOworCisgIHBBTkctPnNIZWFkZXIuZkNsZWFudXAgPSBtbmdfZnJlZV9hbmdfb2JqOworICBwQU5HLT5zSGVhZGVyLmZQcm9jZXNzID0gbW5nX3Byb2Nlc3NfYW5nX29iajsKKyNlbmRpZgorCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorICBwQU5HLT5pTnVtZnJhbWVzICAgPSBpTnVtZnJhbWVzOworICBwQU5HLT5pVGlja3NwZXJzZWMgPSBpVGlja3NwZXJzZWM7CisgIHBBTkctPmlOdW1wbGF5cyAgICA9IGlOdW1wbGF5czsKKyAgcEFORy0+aVRpbGV3aWR0aCAgID0gaVRpbGV3aWR0aDsKKyAgcEFORy0+aVRpbGVoZWlnaHQgID0gaVRpbGVoZWlnaHQ7CisgIHBBTkctPmlJbnRlcmxhY2UgICA9IGlJbnRlcmxhY2U7CisgIHBBTkctPmlTdGlsbHVzZWQgICA9IGlTdGlsbHVzZWQ7CisjZWxzZQorICBwQU5HLT5pTnVtZnJhbWVzICAgPSAoKG1uZ19haGRycClwRW50cnkpLT5pTnVtZnJhbWVzOworICBwQU5HLT5pVGlja3NwZXJzZWMgPSAoKG1uZ19haGRycClwRW50cnkpLT5pVGlja3NwZXJzZWM7CisgIHBBTkctPmlOdW1wbGF5cyAgICA9ICgobW5nX2FoZHJwKXBFbnRyeSktPmlOdW1wbGF5czsKKyAgcEFORy0+aVRpbGV3aWR0aCAgID0gKChtbmdfYWhkcnApcEVudHJ5KS0+aVRpbGV3aWR0aDsKKyAgcEFORy0+aVRpbGVoZWlnaHQgID0gKChtbmdfYWhkcnApcEVudHJ5KS0+aVRpbGVoZWlnaHQ7CisgIHBBTkctPmlJbnRlcmxhY2UgICA9ICgobW5nX2FoZHJwKXBFbnRyeSktPmlJbnRlcmxhY2U7CisgIHBBTkctPmlTdGlsbHVzZWQgICA9ICgobW5nX2FoZHJwKXBFbnRyeSktPmlTdGlsbHVzZWQ7CisjZW5kaWYKKworICBwRGF0YS0+cEFORyAgICAgICA9IHBBTkc7CisgIHBEYXRhLT5lSW1hZ2V0eXBlID0gbW5nX2l0X2FuZzsKKworICBpUmV0Y29kZSA9IG1uZ19wcm9jZXNzX2Rpc3BsYXlfYW5nIChwRGF0YSk7CisgIGlmIChpUmV0Y29kZSkKKyAgICByZXR1cm4gaVJldGNvZGU7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQ1JFQVRFX0FOR19PQkosIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfZnJlZV9hbmdfb2JqIChtbmdfZGF0YXAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19vYmplY3RwIHBPYmplY3QpCit7CisgIG1uZ19hbmdfb2JqcCBwQU5HID0gKG1uZ19hbmdfb2JqcClwT2JqZWN0OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZSRUVfQU5HX09CSiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmIChwQU5HLT5pVGlsZXNzaXplKQorICAgIE1OR19GUkVFWCAocERhdGEsIHBBTkctPnBUaWxlcywgcEFORy0+aVRpbGVzc2l6ZSk7CisKKyNpZm5kZWYgTU5HX09QVElNSVpFX09CSkNMRUFOVVAKKyAgTU5HX0ZSRUVYIChwRGF0YSwgcEFORywgc2l6ZW9mIChtbmdfYW5nX29iaikpOworI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRlJFRV9BTkdfT0JKLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisjaWZuZGVmIE1OR19PUFRJTUlaRV9PQkpDTEVBTlVQCisgIHJldHVybiBNTkdfTk9FUlJPUjsKKyNlbHNlCisgIHJldHVybiBtbmdfZnJlZV9vYmpfZ2VuZXJhbChwRGF0YSwgcE9iamVjdCk7CisjZW5kaWYKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfYW5nX29iaiAobW5nX2RhdGFwICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfb2JqZWN0cCBwT2JqZWN0KQoreworICBtbmdfYW5nX29ianAgIHBBTkcgID0gKG1uZ19hbmdfb2JqcClwT2JqZWN0OworICBtbmdfdWludDhwICAgIHBUaWxlID0gKG1uZ191aW50OHApcEFORy0+cFRpbGVzOworICBtbmdfcmV0Y29kZSAgIGlSZXRjb2RlOworICBtbmdfaW50MzIgICAgIGlDbnQsIGlNYXg7CisgIG1uZ191aW50MzIgICAgaVRpY2tzOworICBtbmdfaW50MzIgICAgIGlYb2Zmc2V0LCBpWW9mZnNldDsKKyAgbW5nX3VpbnQ4ICAgICBpU291cmNlOworICBtbmdfYW5pX2xvb3BwIHBMT09QOworICBtbmdfYW5pX2VuZGxwIHBFTkRMOworICBtbmdfYW5pX2ZyYW1wIHBGUkFNOworICBtbmdfYW5pX21vdmVwIHBNT1ZFOworICBtbmdfYW5pX3Nob3dwIHBTSE9XOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST0NFU1NfQU5HX09CSiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIC8qIGxldCdzIGNyZWF0ZSB0aGUgTU5HIGFuaW1hdGlvbiBkaXJlY3RpdmVzIGZyb20gdGhpcyAqLworCisgIGlNYXggPSBwQU5HLT5pTnVtZnJhbWVzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2V0IHVwIE1ORyBpbXBlcnNvbmF0aW9uICovCisgIHBEYXRhLT5pVGlja3MgICAgICA9IHBBTkctPmlUaWNrc3BlcnNlYzsKKyAgcERhdGEtPmlMYXllcmNvdW50ID0gaU1heDsKKworICBpZiAocEFORy0+aU51bXBsYXlzICE9IDEpICAgICAgICAgICAgLyogY3JlYXRlIGEgTE9PUC9FTkRMIHBhaXIgPyAqLworICB7CisjaWZkZWYgTU5HX09QVElNSVpFX09CSkNMRUFOVVAKKyAgICBpUmV0Y29kZSA9IGNyZWF0ZV9vYmpfZ2VuZXJhbCAocERhdGEsIHNpemVvZiAobW5nX2FuaV9sb29wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ZyZWVfYW5pX2xvb3AsIG1uZ19wcm9jZXNzX2FuaV9sb29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKChtbmdfcHRyKXBMT09QKSk7CisgICAgaWYgKGlSZXRjb2RlKQorICAgICAgcmV0dXJuIGlSZXRjb2RlOworI2Vsc2UKKyAgICBNTkdfQUxMT0MgKHBEYXRhLCBwTE9PUCwgc2l6ZW9mIChtbmdfYW5pX2xvb3ApKTsKKworICAgIHBMT09QLT5zSGVhZGVyLmZDbGVhbnVwID0gbW5nX2ZyZWVfYW5pX2xvb3A7CisgICAgcExPT1AtPnNIZWFkZXIuZlByb2Nlc3MgPSBtbmdfcHJvY2Vzc19hbmlfbG9vcDsKKyNlbmRpZgorCisgICAgcExPT1AtPmlMZXZlbCA9IDE7CisgICAgaWYgKHBBTkctPmlOdW1wbGF5cykKKyAgICAgIHBMT09QLT5pUmVwZWF0Y291bnQgPSBwQU5HLT5pTnVtcGxheXM7CisgICAgZWxzZQorICAgICAgcExPT1AtPmlSZXBlYXRjb3VudCA9IDB4RkZGRkZGRkZsOworCisgICAgbW5nX2FkZF9hbmlfb2JqZWN0IChwRGF0YSwgKG1uZ19vYmplY3RfaGVhZGVycClwTE9PUCk7CisgIH0KKworICBmb3IgKGlDbnQgPSAwOyBpQ250IDwgaU1heDsgaUNudCsrKQorICB7CisgICAgaVRpY2tzICAgPSBtbmdfZ2V0X3VpbnQzMiAocFRpbGUpOworICAgIGlYb2Zmc2V0ID0gbW5nX2dldF9pbnQzMiAgKHBUaWxlKzQpOworICAgIGlZb2Zmc2V0ID0gbW5nX2dldF9pbnQzMiAgKHBUaWxlKzgpOworICAgIGlTb3VyY2UgID0gKihwVGlsZSsxMik7CisKKyNpZmRlZiBNTkdfT1BUSU1JWkVfT0JKQ0xFQU5VUAorICAgIGlSZXRjb2RlID0gY3JlYXRlX29ial9nZW5lcmFsIChwRGF0YSwgc2l6ZW9mIChtbmdfYW5pX2ZyYW0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfZnJlZV9vYmpfZ2VuZXJhbCwgbW5nX3Byb2Nlc3NfYW5pX2ZyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoKG1uZ19wdHIpcEZSQU0pKTsKKyAgICBpZiAoaVJldGNvZGUpCisgICAgICByZXR1cm4gaVJldGNvZGU7CisjZWxzZQorICAgIE1OR19BTExPQyAocERhdGEsIHBGUkFNLCBzaXplb2YgKG1uZ19hbmlfZnJhbSkpOworCisgICAgcEZSQU0tPnNIZWFkZXIuZkNsZWFudXAgPSBtbmdfZnJlZV9hbmlfZnJhbTsKKyAgICBwRlJBTS0+c0hlYWRlci5mUHJvY2VzcyA9IG1uZ19wcm9jZXNzX2FuaV9mcmFtOworI2VuZGlmCisKKyAgICBwRlJBTS0+aUZyYW1lbW9kZSAgID0gNDsKKyAgICBwRlJBTS0+aUNoYW5nZWRlbGF5ID0gMTsKKyAgICBwRlJBTS0+aURlbGF5ICAgICAgID0gaVRpY2tzOworCisgICAgbW5nX2FkZF9hbmlfb2JqZWN0IChwRGF0YSwgKG1uZ19vYmplY3RfaGVhZGVycClwRlJBTSk7CisKKyAgICBpZiAoIWlTb3VyY2UpCisgICAgeworI2lmZGVmIE1OR19PUFRJTUlaRV9PQkpDTEVBTlVQCisgICAgICBpUmV0Y29kZSA9IGNyZWF0ZV9vYmpfZ2VuZXJhbCAocERhdGEsIHNpemVvZiAobW5nX2FuaV9tb3ZlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfZnJlZV9vYmpfZ2VuZXJhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcHJvY2Vzc19hbmlfbW92ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKChtbmdfcHRyKXBNT1ZFKSk7CisgICAgICBpZiAoaVJldGNvZGUpCisgICAgICAgIHJldHVybiBpUmV0Y29kZTsKKyNlbHNlCisgICAgICBNTkdfQUxMT0MgKHBEYXRhLCBwTU9WRSwgc2l6ZW9mIChtbmdfYW5pX21vdmUpKTsKKworICAgICAgcE1PVkUtPnNIZWFkZXIuZkNsZWFudXAgPSBtbmdfZnJlZV9hbmlfbW92ZTsKKyAgICAgIHBNT1ZFLT5zSGVhZGVyLmZQcm9jZXNzID0gbW5nX3Byb2Nlc3NfYW5pX21vdmU7CisjZW5kaWYKKworICAgICAgcE1PVkUtPmlGaXJzdGlkID0gMTsKKyAgICAgIHBNT1ZFLT5pTGFzdGlkICA9IDE7CisgICAgICBwTU9WRS0+aUxvY2F4ICAgPSAtaVhvZmZzZXQ7CisgICAgICBwTU9WRS0+aUxvY2F5ICAgPSAtaVlvZmZzZXQ7CisKKyAgICAgIG1uZ19hZGRfYW5pX29iamVjdCAocERhdGEsIChtbmdfb2JqZWN0X2hlYWRlcnApcE1PVkUpOworICAgIH0KKworI2lmZGVmIE1OR19PUFRJTUlaRV9PQkpDTEVBTlVQCisgICAgaVJldGNvZGUgPSBjcmVhdGVfb2JqX2dlbmVyYWwgKHBEYXRhLCBzaXplb2YgKG1uZ19hbmlfc2hvdyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19mcmVlX29ial9nZW5lcmFsLCBtbmdfcHJvY2Vzc19hbmlfc2hvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJigobW5nX3B0cilwU0hPVykpOworICAgIGlmIChpUmV0Y29kZSkKKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKyNlbHNlCisgICAgTU5HX0FMTE9DIChwRGF0YSwgcFNIT1csIHNpemVvZiAobW5nX2FuaV9zaG93KSk7CisKKyAgICBwU0hPVy0+c0hlYWRlci5mQ2xlYW51cCA9IG1uZ19mcmVlX2FuaV9zaG93OworICAgIHBTSE9XLT5zSGVhZGVyLmZQcm9jZXNzID0gbW5nX3Byb2Nlc3NfYW5pX3Nob3c7CisjZW5kaWYKKworICAgIGlmIChpU291cmNlKQorICAgICAgcFNIT1ctPmlGaXJzdGlkID0gMDsKKyAgICBlbHNlCisgICAgICBwU0hPVy0+aUZpcnN0aWQgPSAxOworICAgIHBTSE9XLT5pTGFzdGlkICAgID0gcFNIT1ctPmlGaXJzdGlkOworCisgICAgbW5nX2FkZF9hbmlfb2JqZWN0IChwRGF0YSwgKG1uZ19vYmplY3RfaGVhZGVycClwU0hPVyk7CisKKyAgICBwVGlsZSArPSBzaXplb2YobW5nX2FkYXRfdGlsZSk7CisgIH0KKworICBpZiAocEFORy0+aU51bXBsYXlzICE9IDEpICAgICAgICAgICAgLyogY3JlYXRlIGEgTE9PUC9FTkRMIHBhaXIgPyAqLworICB7CisjaWZkZWYgTU5HX09QVElNSVpFX09CSkNMRUFOVVAKKyAgICBpUmV0Y29kZSA9IGNyZWF0ZV9vYmpfZ2VuZXJhbCAocERhdGEsIHNpemVvZiAobW5nX2FuaV9lbmRsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ZyZWVfb2JqX2dlbmVyYWwsIG1uZ19wcm9jZXNzX2FuaV9lbmRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKChtbmdfcHRyKXBFTkRMKSk7CisgICAgaWYgKGlSZXRjb2RlKQorICAgICAgcmV0dXJuIGlSZXRjb2RlOworI2Vsc2UKKyAgICBNTkdfQUxMT0MgKHBEYXRhLCBwRU5ETCwgc2l6ZW9mIChtbmdfYW5pX2VuZGwpKTsKKworICAgIHBFTkRMLT5zSGVhZGVyLmZDbGVhbnVwID0gbW5nX2ZyZWVfYW5pX2VuZGw7CisgICAgcEVOREwtPnNIZWFkZXIuZlByb2Nlc3MgPSBtbmdfcHJvY2Vzc19hbmlfZW5kbDsKKyNlbmRpZgorCisgICAgcEVOREwtPmlMZXZlbCA9IDE7CisKKyAgICBtbmdfYWRkX2FuaV9vYmplY3QgKHBEYXRhLCAobW5nX29iamVjdF9oZWFkZXJwKXBFTkRMKTsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST0NFU1NfQU5HX09CSiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNlbmRpZiAvKiBNTkdfSU5DTFVERV9BTkdfUFJPUE9TQUwgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2VuZGlmIC8qIE1OR19JTkNMVURFX0RJU1BMQVlfUFJPQ1MgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogZW5kIG9mIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCmRpZmYgLS1naXQgYS9maWxlcy9Tb3VyY2UvTGliTU5HL2xpYm1uZ19vYmplY3RfcHJjLmggYi9maWxlcy9Tb3VyY2UvTGliTU5HL2xpYm1uZ19vYmplY3RfcHJjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZkMjBjOAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9MaWJNTkcvbGlibW5nX29iamVjdF9wcmMuaApAQCAtMCwwICsxLDY5MCBAQAorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIGxpYm1uZy5oICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIHByb2plY3QgICA6IGxpYm1uZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBmaWxlICAgICAgOiBsaWJtbmdfb2JqZWN0X3ByYy5oICAgICAgIGNvcHlyaWdodCAoYykgMjAwMC0yMDA3IEcuSnV5biAgICogKi8KKy8qICogdmVyc2lvbiAgIDogMS4wLjEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBwdXJwb3NlICAgOiBPYmplY3QgcHJvY2Vzc2luZyByb3V0aW5lcyAoZGVmaW5pdGlvbikgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGF1dGhvciAgICA6IEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogY29tbWVudCAgIDogRGVmaW5pdGlvbiBvZiB0aGUgaW50ZXJuYWwgb2JqZWN0IHByb2Nlc3Npbmcgcm91dGluZXMgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBjaGFuZ2VzICAgOiAwLjUuMSAtIDA1LzA4LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjaGFuZ2VkIHN0cmljdC1BTlNJIHN0dWZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMiAtIDA1LzI0LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBzdXBwb3J0IGZvciBnbG9iYWwgY29sb3ItY2h1bmtzIGluIGFuaW1hdGlvbiAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgc3VwcG9ydCBmb3IgZ2xvYmFsIFBMVEUsdFJOUyxiS0dEIGluIGFuaW1hdGlvbiAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIFNBVkUgJiBTRUVLIGFuaW1hdGlvbiBvYmplY3RzICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjIgLSAwNS8yOS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2hhbmdlZCBhbmlfb2JqZWN0IGNyZWF0ZSByb3V0aW5lcyBub3QgdG8gcmV0dXJuIHRoZSAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgIGNyZWF0ZWQgb2JqZWN0ICh3YXNuJ3QgbmVjZXNzYXJ5KSAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBjb21wcmVzc2lvbi9maWx0ZXIvaW50ZXJsYWNlIGZpZWxkcyB0byAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgb2JqZWN0LWJ1ZmZlciBmb3IgZGVsdGEtaW1hZ2UgcHJvY2Vzc2luZyAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjMgLSAwNi8yMi8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgc3VwcG9ydCBmb3IgUFBMVCBjaHVuayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjIgLSAwOC8wNS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2hhbmdlZCBmaWxlLXByZWZpeGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjMgLSAwOC8yNi8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgTUFHTiBjaHVuayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMyAtIDEwLzE3LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCByb3V0aW5lIHRvIGRpc2NhcmQgImludmFsaWQiIG9iamVjdHMgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDA4LzE5LzIwMDIgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBCNTk3MTM0IC0gbGlibW5nIHBvbGx1dGVzIHRoZSBsaW5rZXIgbmFtZXNwYWNlICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC41IC0gMDkvMTMvMjAwMiAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIHJlYWQvd3JpdGUgb2YgTUFHTiBjaHVuayAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAwOS8xNS8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgZXZlbnQgaGFuZGxpbmcgZm9yIGR5bmFtaWMgTU5HICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDA5LzIwLzIwMDIgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBzdXBwb3J0IGZvciBQQVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC41IC0gMDkvMjMvMjAwMiAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGluLW1lbW9yeSBjb2xvci1jb3JyZWN0aW9uIG9mIGFic3RyYWN0IGltYWdlcyAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAxMC8wNy8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgRElTQyBzdXBwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjYgLSAwNy8wNy8yMDAzIC0gRy5SLVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgY29uZGl0aW9uYWxzIGFyb3VuZCBEZWx0YS1QTkcgY29kZSAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIFNLSVBDSFVOSyBmZWF0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjYgLSAwNy8yOS8yMDAzIC0gRy5SLVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgY29uZGl0aW9uYWxzIGFyb3VuZCBQQVNUIGNodW5rIHN1cHBvcnQgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjcgLSAwMy8yNC8yMDA0IC0gRy5SLVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgbW9yZSBTS0lQQ0hVTksgY29uZGl0aW9uYWxzICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjkgLSAxMi8wNS8yMDA0IC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgY29uZGl0aW9uYWwgTU5HX09QVElNSVpFX09CSkNMRUFOVVAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjEwIC0gMDQvMDgvMjAwNyAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgc3VwcG9ydCBmb3IgbVBORyBwcm9wb3NhbCAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuMTAgLSAwNC8xMi8yMDA3IC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBzdXBwb3J0IGZvciBBTkcgcHJvcG9zYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmIGRlZmluZWQoX19CT1JMQU5EQ19fKSAmJiBkZWZpbmVkKE1OR19TVFJJQ1RfQU5TSSkKKyNwcmFnbWEgb3B0aW9uIC1BICAgICAgICAgICAgICAgICAgICAgIC8qIGZvcmNlIEFOU0ktQyAqLworI2VuZGlmCisKKyNpZm5kZWYgX2xpYm1uZ19vYmplY3RfcHJjX2hfCisjZGVmaW5lIF9saWJtbmdfb2JqZWN0X3ByY19oXworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX0lOQ0xVREVfRElTUExBWV9QUk9DUworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfZHJvcF9pbnZhbGlkX29iamVjdHMgICAobW5nX2RhdGFwICAgICAgcERhdGEpOworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfY3JlYXRlX2ltYWdlZGF0YW9iamVjdCAobW5nX2RhdGFwICAgICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgYkNvbmNyZXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgICAgIGJWaWV3YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgaUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICBpQml0ZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgaUNvbG9ydHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICBpQ29tcHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgaUZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICBpSW50ZXJsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbWFnZWRhdGFwICpwcE9iamVjdCk7CisKK21uZ19yZXRjb2RlIG1uZ19mcmVlX2ltYWdlZGF0YW9iamVjdCAgIChtbmdfZGF0YXAgICAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW1hZ2VkYXRhcCBwSW1hZ2VkYXRhKTsKKworbW5nX3JldGNvZGUgbW5nX2Nsb25lX2ltYWdlZGF0YW9iamVjdCAgKG1uZ19kYXRhcCAgICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgICAgIGJDb25jcmV0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW1hZ2VkYXRhcCBwU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbWFnZWRhdGFwICpwcENsb25lKTsKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX2NyZWF0ZV9pbWFnZW9iamVjdCAgIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2Jvb2wgICBiQ29uY3JldGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgYlZpc2libGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgYlZpZXdhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggIGlCaXRkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICBpQ29sb3J0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggIGlDb21wcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICBpRmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggIGlJbnRlcmxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaVBvc3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaVBvc3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgYkNsaXBwZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaUNsaXBsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlDbGlwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpQ2xpcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaUNsaXBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW1hZ2VwICpwcE9iamVjdCk7CisKK21uZ19yZXRjb2RlIG1uZ19mcmVlX2ltYWdlb2JqZWN0ICAgICAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ltYWdlcCBwSW1hZ2UpOworCittbmdfaW1hZ2VwICBtbmdfZmluZF9pbWFnZW9iamVjdCAgICAgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaUlkKTsKKworbW5nX3JldGNvZGUgbW5nX2Nsb25lX2ltYWdlb2JqZWN0ICAgIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2Jvb2wgICBiUGFydGlhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2Jvb2wgICBiVmlzaWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2Jvb2wgICBiQWJzdHJhY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgYkhhc2xvY2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaUxvY2F0aW9udHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpTG9jYXRpb254LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlMb2NhdGlvbnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbWFnZXAgcFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ltYWdlcCAqcHBDbG9uZSk7CisKK21uZ19yZXRjb2RlIG1uZ19yZW51bV9pbWFnZW9iamVjdCAgICAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ltYWdlcCBwU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2Jvb2wgICBiVmlzaWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2Jvb2wgICBiQWJzdHJhY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgYkhhc2xvY2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaUxvY2F0aW9udHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpTG9jYXRpb254LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlMb2NhdGlvbnkpOworCittbmdfcmV0Y29kZSBtbmdfcmVzZXRfb2JqZWN0X2RldGFpbHMgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbWFnZXAgcEltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggIGlCaXRkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICBpQ29sb3J0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggIGlDb21wcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICBpRmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggIGlJbnRlcmxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgYlJlc2V0YWxsKTsKKworbW5nX3JldGNvZGUgbW5nX3Byb21vdGVfaW1hZ2VvYmplY3QgIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW1hZ2VwIHBJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICBpQml0ZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgaUNvbG9ydHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICBpRmlsbHR5cGUpOworCittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9pbWFnZW9iamVjdCAgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbWFnZXAgcEltYWdlKTsKKworbW5nX3JldGNvZGUgbW5nX2NvbG9yY29ycmVjdF9vYmplY3QgIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW1hZ2VwIHBJbWFnZSk7CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19jcmVhdGVfYW5pX2ltYWdlICAobW5nX2RhdGFwICAgICAgcERhdGEpOworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorCittbmdfcmV0Y29kZSBtbmdfY3JlYXRlX2FuaV9wbHRlICAgKG1uZ19kYXRhcCAgICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICBpRW50cnljb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3BhbGV0dGU4ZXAgcGFFbnRyaWVzKTsKKworbW5nX3JldGNvZGUgbW5nX2NyZWF0ZV9hbmlfdHJucyAgIChtbmdfZGF0YXAgICAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgaVJhd2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCAgICAgcFJhd2RhdGEpOworCittbmdfcmV0Y29kZSBtbmdfY3JlYXRlX2FuaV9nYW1hICAgKG1uZ19kYXRhcCAgICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfYm9vbCAgICAgICBiRW1wdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgIGlHYW1tYSk7CisKK21uZ19yZXRjb2RlIG1uZ19jcmVhdGVfYW5pX2Nocm0gICAobW5nX2RhdGFwICAgICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgICAgIGJFbXB0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgaVdoaXRlcG9pbnR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICBpV2hpdGVwb2ludHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgIGlSZWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICBpUmVkeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgaUdyZWVueCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgaUdyZWVueSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgaUJsdWV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICBpQmx1ZXkpOworCittbmdfcmV0Y29kZSBtbmdfY3JlYXRlX2FuaV9zcmdiICAgKG1uZ19kYXRhcCAgICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfYm9vbCAgICAgICBiRW1wdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgIGlSZW5kZXJpbmdpbmVudCk7CisKK21uZ19yZXRjb2RlIG1uZ19jcmVhdGVfYW5pX2ljY3AgICAobW5nX2RhdGFwICAgICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgICAgIGJFbXB0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgaVByb2ZpbGVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcHRyICAgICAgICBwUHJvZmlsZSk7CisKK21uZ19yZXRjb2RlIG1uZ19jcmVhdGVfYW5pX2JrZ2QgICAobW5nX2RhdGFwICAgICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgICAgIGlSZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgICAgIGlHcmVlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgaUJsdWUpOworCittbmdfcmV0Y29kZSBtbmdfY3JlYXRlX2FuaV9sb29wICAgKG1uZ19kYXRhcCAgICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICBpTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgIGlSZXBlYXRjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgaVRlcm1jb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICBpSXRlcm1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgaUl0ZXJtYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgIGlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMnAgICAgcFNpZ25hbHMpOworCittbmdfcmV0Y29kZSBtbmdfY3JlYXRlX2FuaV9lbmRsICAgKG1uZ19kYXRhcCAgICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICBpTGV2ZWwpOworCittbmdfcmV0Y29kZSBtbmdfY3JlYXRlX2FuaV9kZWZpICAgKG1uZ19kYXRhcCAgICAgIHBEYXRhKTsKKworbW5nX3JldGNvZGUgbW5nX2NyZWF0ZV9hbmlfYmFzaSAgIChtbmdfZGF0YXAgICAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgaVJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgaUdyZWVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgICBpQmx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgYkhhc2FscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgICBpQWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgIGlWaWV3YWJsZSk7CisKK21uZ19yZXRjb2RlIG1uZ19jcmVhdGVfYW5pX2Nsb24gICAobW5nX2RhdGFwICAgICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgICAgIGlTb3VyY2VpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgaUNsb25laWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgIGlDbG9uZXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgICAgIGJIYXNkb25vdHNob3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgIGlEb25vdHNob3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgIGlDb25jcmV0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgYkhhc2xvY2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgIGlMb2NhdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICAgICAgaUxvY2F4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgICAgICBpTG9jYXkpOworCittbmdfcmV0Y29kZSBtbmdfY3JlYXRlX2FuaV9iYWNrICAgKG1uZ19kYXRhcCAgICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgICBpUmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgICBpR3JlZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgICAgIGlCbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICBpTWFuZGF0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgICBpSW1hZ2VpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgaVRpbGUpOworCittbmdfcmV0Y29kZSBtbmdfY3JlYXRlX2FuaV9mcmFtICAgKG1uZ19kYXRhcCAgICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICBpRnJhbWVtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICBpQ2hhbmdlZGVsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgIGlEZWxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgaUNoYW5nZXRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgIGlUaW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICBpQ2hhbmdlY2xpcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgIGlDbGlwdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICAgICAgaUNsaXBsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgICAgICBpQ2xpcHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgICAgIGlDbGlwdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICAgICAgaUNsaXBiKTsKKworbW5nX3JldGNvZGUgbW5nX2NyZWF0ZV9hbmlfbW92ZSAgIChtbmdfZGF0YXAgICAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgaUZpcnN0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgICAgIGlMYXN0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgIGlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgICAgICBpTG9jYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgICAgIGlMb2NheSk7CisKK21uZ19yZXRjb2RlIG1uZ19jcmVhdGVfYW5pX2NsaXAgICAobW5nX2RhdGFwICAgICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgICAgIGlGaXJzdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgICBpTGFzdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICBpVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICAgICAgaUNsaXBsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgICAgICBpQ2xpcHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgICAgIGlDbGlwdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICAgICAgaUNsaXBiKTsKKworbW5nX3JldGNvZGUgbW5nX2NyZWF0ZV9hbmlfc2hvdyAgIChtbmdfZGF0YXAgICAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgaUZpcnN0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgICAgIGlMYXN0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgIGlNb2RlKTsKKworbW5nX3JldGNvZGUgbW5nX2NyZWF0ZV9hbmlfdGVybSAgIChtbmdfZGF0YXAgICAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgaVRlcm1hY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgIGlJdGVyYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICBpRGVsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgIGlJdGVybWF4KTsKKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX1NBVkUKK21uZ19yZXRjb2RlIG1uZ19jcmVhdGVfYW5pX3NhdmUgICAobW5nX2RhdGFwICAgICAgcERhdGEpOworI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfU0VFSworbW5nX3JldGNvZGUgbW5nX2NyZWF0ZV9hbmlfc2VlayAgIChtbmdfZGF0YXAgICAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgaVNlZ21lbnRuYW1lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3BjaGFyICAgICAgelNlZ21lbnRuYW1lKTsKKyNlbmRpZgorI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCittbmdfcmV0Y29kZSBtbmdfY3JlYXRlX2FuaV9kaGRyICAgKG1uZ19kYXRhcCAgICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgICBpT2JqZWN0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgIGlJbWFnZXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgIGlEZWx0YXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgIGlCbG9ja3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICBpQmxvY2toZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgIGlCbG9ja3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgIGlCbG9ja3kpOworCittbmdfcmV0Y29kZSBtbmdfY3JlYXRlX2FuaV9wcm9tICAgKG1uZ19kYXRhcCAgICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICBpQml0ZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgIGlDb2xvcnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgIGlGaWxsdHlwZSk7CisKK21uZ19yZXRjb2RlIG1uZ19jcmVhdGVfYW5pX2lwbmcgICAobW5nX2RhdGFwICAgICAgcERhdGEpOworbW5nX3JldGNvZGUgbW5nX2NyZWF0ZV9hbmlfaWpuZyAgIChtbmdfZGF0YXAgICAgICBwRGF0YSk7CisKK21uZ19yZXRjb2RlIG1uZ19jcmVhdGVfYW5pX3BwbHQgICAobW5nX2RhdGFwICAgICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgIGlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICBpQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wYWxldHRlOGVwIHBhSW5kZXhlbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwICAgICBwYUFscGhhZW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCAgICAgcGFVc2VkZW50cmllcyk7CisjZW5kaWYKKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX01BR04KK21uZ19yZXRjb2RlIG1uZ19jcmVhdGVfYW5pX21hZ24gICAobW5nX2RhdGFwICAgICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgICAgIGlGaXJzdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgICBpTGFzdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgICBpTWV0aG9kWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgaU1YLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgICBpTVksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgICAgIGlNTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgaU1SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgICBpTVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgICAgIGlNQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgaU1ldGhvZFkpOworI2VuZGlmCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19QQVNUCittbmdfcmV0Y29kZSBtbmdfY3JlYXRlX2FuaV9wYXN0ICAgKG1uZ19kYXRhcCAgICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgICBpVGFyZ2V0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgIGlUYXJnZXR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgICAgICBpVGFyZ2V0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICAgICAgaVRhcmdldHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgIGlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3B0ciAgICAgICAgcFNvdXJjZXMpOworI2VuZGlmCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19ESVNDCittbmdfcmV0Y29kZSBtbmdfY3JlYXRlX2FuaV9kaXNjICAgKG1uZ19kYXRhcCAgICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgICBpQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTZwICAgIHBJZHMpOworI2VuZGlmCisKKyNlbHNlIC8qIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUiAqLworCittbmdfcmV0Y29kZSBtbmdfY3JlYXRlX2FuaV9wbHRlICAgKG1uZ19kYXRhcCAgICAgIHBEYXRhKTsKK21uZ19yZXRjb2RlIG1uZ19jcmVhdGVfYW5pX3RybnMgICAobW5nX2RhdGFwICAgICAgcERhdGEpOworbW5nX3JldGNvZGUgbW5nX2NyZWF0ZV9hbmlfZ2FtYSAgIChtbmdfZGF0YXAgICAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2NodW5rcCAgICAgcENodW5rKTsKK21uZ19yZXRjb2RlIG1uZ19jcmVhdGVfYW5pX2Nocm0gICAobW5nX2RhdGFwICAgICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19jaHVua3AgICAgIHBDaHVuayk7CittbmdfcmV0Y29kZSBtbmdfY3JlYXRlX2FuaV9zcmdiICAgKG1uZ19kYXRhcCAgICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfY2h1bmtwICAgICBwQ2h1bmspOworbW5nX3JldGNvZGUgbW5nX2NyZWF0ZV9hbmlfaWNjcCAgIChtbmdfZGF0YXAgICAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2NodW5rcCAgICAgcENodW5rKTsKK21uZ19yZXRjb2RlIG1uZ19jcmVhdGVfYW5pX2JrZ2QgICAobW5nX2RhdGFwICAgICAgcERhdGEpOworbW5nX3JldGNvZGUgbW5nX2NyZWF0ZV9hbmlfbG9vcCAgIChtbmdfZGF0YXAgICAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2NodW5rcCAgICAgcENodW5rKTsKK21uZ19yZXRjb2RlIG1uZ19jcmVhdGVfYW5pX2VuZGwgICAobW5nX2RhdGFwICAgICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICAgIGlMZXZlbCk7CittbmdfcmV0Y29kZSBtbmdfY3JlYXRlX2FuaV9kZWZpICAgKG1uZ19kYXRhcCAgICAgIHBEYXRhKTsKK21uZ19yZXRjb2RlIG1uZ19jcmVhdGVfYW5pX2Jhc2kgICAobW5nX2RhdGFwICAgICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19jaHVua3AgICAgIHBDaHVuayk7CittbmdfcmV0Y29kZSBtbmdfY3JlYXRlX2FuaV9jbG9uICAgKG1uZ19kYXRhcCAgICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfY2h1bmtwICAgICBwQ2h1bmspOworbW5nX3JldGNvZGUgbW5nX2NyZWF0ZV9hbmlfYmFjayAgIChtbmdfZGF0YXAgICAgICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfY3JlYXRlX2FuaV9mcmFtICAgKG1uZ19kYXRhcCAgICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfY2h1bmtwICAgICBwQ2h1bmspOworbW5nX3JldGNvZGUgbW5nX2NyZWF0ZV9hbmlfbW92ZSAgIChtbmdfZGF0YXAgICAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2NodW5rcCAgICAgcENodW5rKTsKK21uZ19yZXRjb2RlIG1uZ19jcmVhdGVfYW5pX2NsaXAgICAobW5nX2RhdGFwICAgICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19jaHVua3AgICAgIHBDaHVuayk7CittbmdfcmV0Y29kZSBtbmdfY3JlYXRlX2FuaV9zaG93ICAgKG1uZ19kYXRhcCAgICAgIHBEYXRhKTsKK21uZ19yZXRjb2RlIG1uZ19jcmVhdGVfYW5pX3Rlcm0gICAobW5nX2RhdGFwICAgICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19jaHVua3AgICAgIHBDaHVuayk7CisjaWZuZGVmIE1OR19TS0lQQ0hVTktfU0FWRQorbW5nX3JldGNvZGUgbW5nX2NyZWF0ZV9hbmlfc2F2ZSAgIChtbmdfZGF0YXAgICAgICBwRGF0YSk7CisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19TRUVLCittbmdfcmV0Y29kZSBtbmdfY3JlYXRlX2FuaV9zZWVrICAgKG1uZ19kYXRhcCAgICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfY2h1bmtwICAgICBwQ2h1bmspOworI2VuZGlmCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKK21uZ19yZXRjb2RlIG1uZ19jcmVhdGVfYW5pX2RoZHIgICAobW5nX2RhdGFwICAgICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19jaHVua3AgICAgIHBDaHVuayk7CittbmdfcmV0Y29kZSBtbmdfY3JlYXRlX2FuaV9wcm9tICAgKG1uZ19kYXRhcCAgICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfY2h1bmtwICAgICBwQ2h1bmspOworbW5nX3JldGNvZGUgbW5nX2NyZWF0ZV9hbmlfaXBuZyAgIChtbmdfZGF0YXAgICAgICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfY3JlYXRlX2FuaV9pam5nICAgKG1uZ19kYXRhcCAgICAgIHBEYXRhKTsKKworbW5nX3JldGNvZGUgbW5nX2NyZWF0ZV9hbmlfcHBsdCAgIChtbmdfZGF0YXAgICAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgaVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICAgIGlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3BhbGV0dGU4ZXAgcGFJbmRleGVudHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgICAgIHBhQWxwaGFlbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwICAgICBwYVVzZWRlbnRyaWVzKTsKKyNlbmRpZgorCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfTUFHTgorbW5nX3JldGNvZGUgbW5nX2NyZWF0ZV9hbmlfbWFnbiAgIChtbmdfZGF0YXAgICAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2NodW5rcCAgICAgcENodW5rKTsKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX1BBU1QKK21uZ19yZXRjb2RlIG1uZ19jcmVhdGVfYW5pX3Bhc3QgICAobW5nX2RhdGFwICAgICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19jaHVua3AgICAgIHBDaHVuayk7CisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19ESVNDCittbmdfcmV0Y29kZSBtbmdfY3JlYXRlX2FuaV9kaXNjICAgKG1uZ19kYXRhcCAgICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfY2h1bmtwICAgICBwQ2h1bmspOworI2VuZGlmCisKKyNlbmRpZiAvKiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX2ZyZWVfYW5pX2ltYWdlICAgIChtbmdfZGF0YXAgICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19vYmplY3RwICBwT2JqZWN0KTsKKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfT0JKQ0xFQU5VUAorCittbmdfcmV0Y29kZSBtbmdfZnJlZV9hbmlfcGx0ZSAgICAgKG1uZ19kYXRhcCAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX29iamVjdHAgIHBPYmplY3QpOworbW5nX3JldGNvZGUgbW5nX2ZyZWVfYW5pX3RybnMgICAgIChtbmdfZGF0YXAgICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19vYmplY3RwICBwT2JqZWN0KTsKK21uZ19yZXRjb2RlIG1uZ19mcmVlX2FuaV9nYW1hICAgICAobW5nX2RhdGFwICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfb2JqZWN0cCAgcE9iamVjdCk7CisjaWZuZGVmIE1OR19TS0lQQ0hVTktfY0hSTQorbW5nX3JldGNvZGUgbW5nX2ZyZWVfYW5pX2Nocm0gICAgIChtbmdfZGF0YXAgICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19vYmplY3RwICBwT2JqZWN0KTsKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX3NSR0IKK21uZ19yZXRjb2RlIG1uZ19mcmVlX2FuaV9zcmdiICAgICAobW5nX2RhdGFwICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfb2JqZWN0cCAgcE9iamVjdCk7CisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19iS0dECittbmdfcmV0Y29kZSBtbmdfZnJlZV9hbmlfYmtnZCAgICAgKG1uZ19kYXRhcCAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX29iamVjdHAgIHBPYmplY3QpOworI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfTE9PUAorbW5nX3JldGNvZGUgbW5nX2ZyZWVfYW5pX2VuZGwgICAgIChtbmdfZGF0YXAgICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19vYmplY3RwICBwT2JqZWN0KTsKKyNlbmRpZgorbW5nX3JldGNvZGUgbW5nX2ZyZWVfYW5pX2RlZmkgICAgIChtbmdfZGF0YXAgICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19vYmplY3RwICBwT2JqZWN0KTsKK21uZ19yZXRjb2RlIG1uZ19mcmVlX2FuaV9iYXNpICAgICAobW5nX2RhdGFwICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfb2JqZWN0cCAgcE9iamVjdCk7CittbmdfcmV0Y29kZSBtbmdfZnJlZV9hbmlfY2xvbiAgICAgKG1uZ19kYXRhcCAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX29iamVjdHAgIHBPYmplY3QpOworbW5nX3JldGNvZGUgbW5nX2ZyZWVfYW5pX2JhY2sgICAgIChtbmdfZGF0YXAgICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19vYmplY3RwICBwT2JqZWN0KTsKK21uZ19yZXRjb2RlIG1uZ19mcmVlX2FuaV9mcmFtICAgICAobW5nX2RhdGFwICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfb2JqZWN0cCAgcE9iamVjdCk7CittbmdfcmV0Y29kZSBtbmdfZnJlZV9hbmlfbW92ZSAgICAgKG1uZ19kYXRhcCAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX29iamVjdHAgIHBPYmplY3QpOworbW5nX3JldGNvZGUgbW5nX2ZyZWVfYW5pX2NsaXAgICAgIChtbmdfZGF0YXAgICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19vYmplY3RwICBwT2JqZWN0KTsKK21uZ19yZXRjb2RlIG1uZ19mcmVlX2FuaV9zaG93ICAgICAobW5nX2RhdGFwICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfb2JqZWN0cCAgcE9iamVjdCk7CittbmdfcmV0Y29kZSBtbmdfZnJlZV9hbmlfdGVybSAgICAgKG1uZ19kYXRhcCAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX29iamVjdHAgIHBPYmplY3QpOworI2lmbmRlZiBNTkdfU0tJUENIVU5LX1NBVkUKK21uZ19yZXRjb2RlIG1uZ19mcmVlX2FuaV9zYXZlICAgICAobW5nX2RhdGFwICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfb2JqZWN0cCAgcE9iamVjdCk7CisjZW5kaWYKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworbW5nX3JldGNvZGUgbW5nX2ZyZWVfYW5pX2RoZHIgICAgIChtbmdfZGF0YXAgICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19vYmplY3RwICBwT2JqZWN0KTsKK21uZ19yZXRjb2RlIG1uZ19mcmVlX2FuaV9wcm9tICAgICAobW5nX2RhdGFwICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfb2JqZWN0cCAgcE9iamVjdCk7CittbmdfcmV0Y29kZSBtbmdfZnJlZV9hbmlfaXBuZyAgICAgKG1uZ19kYXRhcCAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX29iamVjdHAgIHBPYmplY3QpOworbW5nX3JldGNvZGUgbW5nX2ZyZWVfYW5pX2lqbmcgICAgIChtbmdfZGF0YXAgICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19vYmplY3RwICBwT2JqZWN0KTsKK21uZ19yZXRjb2RlIG1uZ19mcmVlX2FuaV9wcGx0ICAgICAobW5nX2RhdGFwICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfb2JqZWN0cCAgcE9iamVjdCk7CisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19NQUdOCittbmdfcmV0Y29kZSBtbmdfZnJlZV9hbmlfbWFnbiAgICAgKG1uZ19kYXRhcCAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX29iamVjdHAgIHBPYmplY3QpOworI2VuZGlmCisKKyNlbmRpZiAvKiBNTkdfT1BUSU1JWkVfT0JKQ0xFQU5VUCAqLworCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19pQ0NQCittbmdfcmV0Y29kZSBtbmdfZnJlZV9hbmlfaWNjcCAgICAgKG1uZ19kYXRhcCAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX29iamVjdHAgIHBPYmplY3QpOworI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfTE9PUAorbW5nX3JldGNvZGUgbW5nX2ZyZWVfYW5pX2xvb3AgICAgIChtbmdfZGF0YXAgICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19vYmplY3RwICBwT2JqZWN0KTsKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX1NBVkUKK21uZ19yZXRjb2RlIG1uZ19mcmVlX2FuaV9zZWVrICAgICAobW5nX2RhdGFwICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfb2JqZWN0cCAgcE9iamVjdCk7CisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19QQVNUCittbmdfcmV0Y29kZSBtbmdfZnJlZV9hbmlfcGFzdCAgICAgKG1uZ19kYXRhcCAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX29iamVjdHAgIHBPYmplY3QpOworI2VuZGlmCittbmdfcmV0Y29kZSBtbmdfZnJlZV9hbmlfZGlzYyAgICAgKG1uZ19kYXRhcCAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX29iamVjdHAgIHBPYmplY3QpOworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19hbmlfaW1hZ2UgKG1uZ19kYXRhcCAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX29iamVjdHAgIHBPYmplY3QpOworCittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19hbmlfcGx0ZSAgKG1uZ19kYXRhcCAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX29iamVjdHAgIHBPYmplY3QpOworbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfYW5pX3RybnMgIChtbmdfZGF0YXAgICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19vYmplY3RwICBwT2JqZWN0KTsKK21uZ19yZXRjb2RlIG1uZ19wcm9jZXNzX2FuaV9nYW1hICAobW5nX2RhdGFwICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfb2JqZWN0cCAgcE9iamVjdCk7CisjaWZuZGVmIE1OR19TS0lQQ0hVTktfY0hSTQorbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfYW5pX2Nocm0gIChtbmdfZGF0YXAgICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19vYmplY3RwICBwT2JqZWN0KTsKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX3NSR0IKK21uZ19yZXRjb2RlIG1uZ19wcm9jZXNzX2FuaV9zcmdiICAobW5nX2RhdGFwICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfb2JqZWN0cCAgcE9iamVjdCk7CisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19pQ0NQCittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19hbmlfaWNjcCAgKG1uZ19kYXRhcCAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX29iamVjdHAgIHBPYmplY3QpOworI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfYktHRAorbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfYW5pX2JrZ2QgIChtbmdfZGF0YXAgICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19vYmplY3RwICBwT2JqZWN0KTsKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX0xPT1AKK21uZ19yZXRjb2RlIG1uZ19wcm9jZXNzX2FuaV9sb29wICAobW5nX2RhdGFwICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfb2JqZWN0cCAgcE9iamVjdCk7CittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19hbmlfZW5kbCAgKG1uZ19kYXRhcCAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX29iamVjdHAgIHBPYmplY3QpOworI2VuZGlmCittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19hbmlfZGVmaSAgKG1uZ19kYXRhcCAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX29iamVjdHAgIHBPYmplY3QpOworbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfYW5pX2Jhc2kgIChtbmdfZGF0YXAgICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19vYmplY3RwICBwT2JqZWN0KTsKK21uZ19yZXRjb2RlIG1uZ19wcm9jZXNzX2FuaV9jbG9uICAobW5nX2RhdGFwICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfb2JqZWN0cCAgcE9iamVjdCk7CittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19hbmlfYmFjayAgKG1uZ19kYXRhcCAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX29iamVjdHAgIHBPYmplY3QpOworbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfYW5pX2ZyYW0gIChtbmdfZGF0YXAgICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19vYmplY3RwICBwT2JqZWN0KTsKK21uZ19yZXRjb2RlIG1uZ19wcm9jZXNzX2FuaV9tb3ZlICAobW5nX2RhdGFwICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfb2JqZWN0cCAgcE9iamVjdCk7CittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19hbmlfY2xpcCAgKG1uZ19kYXRhcCAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX29iamVjdHAgIHBPYmplY3QpOworbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfYW5pX3Nob3cgIChtbmdfZGF0YXAgICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19vYmplY3RwICBwT2JqZWN0KTsKK21uZ19yZXRjb2RlIG1uZ19wcm9jZXNzX2FuaV90ZXJtICAobW5nX2RhdGFwICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfb2JqZWN0cCAgcE9iamVjdCk7CisjaWZuZGVmIE1OR19TS0lQQ0hVTktfU0FWRQorbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfYW5pX3NhdmUgIChtbmdfZGF0YXAgICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19vYmplY3RwICBwT2JqZWN0KTsKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX1NFRUsKK21uZ19yZXRjb2RlIG1uZ19wcm9jZXNzX2FuaV9zZWVrICAobW5nX2RhdGFwICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfb2JqZWN0cCAgcE9iamVjdCk7CisjZW5kaWYKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfYW5pX2RoZHIgIChtbmdfZGF0YXAgICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19vYmplY3RwICBwT2JqZWN0KTsKK21uZ19yZXRjb2RlIG1uZ19wcm9jZXNzX2FuaV9wcm9tICAobW5nX2RhdGFwICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfb2JqZWN0cCAgcE9iamVjdCk7CittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19hbmlfaXBuZyAgKG1uZ19kYXRhcCAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX29iamVjdHAgIHBPYmplY3QpOworbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfYW5pX2lqbmcgIChtbmdfZGF0YXAgICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19vYmplY3RwICBwT2JqZWN0KTsKK21uZ19yZXRjb2RlIG1uZ19wcm9jZXNzX2FuaV9wcGx0ICAobW5nX2RhdGFwICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfb2JqZWN0cCAgcE9iamVjdCk7CisjZW5kaWYKK21uZ19yZXRjb2RlIG1uZ19wcm9jZXNzX2FuaV9tYWduICAobW5nX2RhdGFwICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfb2JqZWN0cCAgcE9iamVjdCk7CisjaWZuZGVmIE1OR19TS0lQQ0hVTktfUEFTVAorbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfYW5pX3Bhc3QgIChtbmdfZGF0YXAgICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19vYmplY3RwICBwT2JqZWN0KTsKKyNlbmRpZgorbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfYW5pX2Rpc2MgIChtbmdfZGF0YXAgICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19vYmplY3RwICBwT2JqZWN0KTsKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX0RZTkFNSUNNTkcKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCittbmdfcmV0Y29kZSBtbmdfY3JlYXRlX2V2ZW50ICAgICAgKG1uZ19kYXRhcCAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgIGlFdmVudHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICBpTWFza3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgICBpTGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICAgIGlSaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICAgIGlUb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgICBpQm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2ICAgaU9iamVjdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICAgaUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgaVNlZ21lbnRuYW1lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3BjaGFyICAgIHpTZWdtZW50bmFtZSk7CisjZWxzZQorbW5nX3JldGNvZGUgbW5nX2NyZWF0ZV9ldmVudCAgICAgIChtbmdfZGF0YXAgICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wdHIgICAgICBwRW50cnkpOworI2VuZGlmCittbmdfcmV0Y29kZSBtbmdfZnJlZV9ldmVudCAgICAgICAgKG1uZ19kYXRhcCAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX29iamVjdHAgIHBPYmplY3QpOworbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfZXZlbnQgICAgIChtbmdfZGF0YXAgICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19vYmplY3RwICBwT2JqZWN0KTsKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX0lOQ0xVREVfTVBOR19QUk9QT1NBTAorI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKK21uZ19yZXRjb2RlIG1uZ19jcmVhdGVfbXBuZ19vYmogICAobW5nX2RhdGFwICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgaUZyYW1ld2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICBpRnJhbWVoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgICBpTnVtcGxheXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgICBpVGlja3NwZXJzZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICBpRnJhbWVzc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3B0ciAgICAgIHBGcmFtZXMpOworI2Vsc2UKK21uZ19yZXRjb2RlIG1uZ19jcmVhdGVfbXBuZ19vYmogICAobW5nX2RhdGFwICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcHRyICAgICAgcEVudHJ5KTsKKyNlbmRpZgorbW5nX3JldGNvZGUgbW5nX2ZyZWVfbXBuZ19vYmogICAgIChtbmdfZGF0YXAgICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19vYmplY3RwICBwT2JqZWN0KTsKK21uZ19yZXRjb2RlIG1uZ19wcm9jZXNzX21wbmdfb2JqICAobW5nX2RhdGFwICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfb2JqZWN0cCAgcE9iamVjdCk7CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19JTkNMVURFX0FOR19QUk9QT1NBTAorI2lmbmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKK21uZ19yZXRjb2RlIG1uZ19jcmVhdGVfYW5nX29iaiAgICAobW5nX2RhdGFwICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgaU51bWZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgIGlUaWNrc3BlcnNlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgIGlOdW1wbGF5cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgIGlUaWxld2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgICBpVGlsZWhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgIGlJbnRlcmxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgICBpU3RpbGx1c2VkKTsKKyNlbHNlCittbmdfcmV0Y29kZSBtbmdfY3JlYXRlX2FuZ19vYmogICAgKG1uZ19kYXRhcCAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3B0ciAgICAgIHBFbnRyeSk7CisjZW5kaWYKK21uZ19yZXRjb2RlIG1uZ19mcmVlX2FuZ19vYmogICAgICAobW5nX2RhdGFwICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfb2JqZWN0cCAgcE9iamVjdCk7CittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19hbmdfb2JqICAgKG1uZ19kYXRhcCAgICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX29iamVjdHAgIHBPYmplY3QpOworI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNlbmRpZiAvKiBNTkdfSU5DTFVERV9ESVNQTEFZX1BST0NTICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNlbmRpZiAvKiBfbGlibW5nX29iamVjdF9wcmNfaF8gKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogZW5kIG9mIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwpkaWZmIC0tZ2l0IGEvZmlsZXMvU291cmNlL0xpYk1ORy9saWJtbmdfb2JqZWN0cy5oIGIvZmlsZXMvU291cmNlL0xpYk1ORy9saWJtbmdfb2JqZWN0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1M2U2YjQKLS0tIC9kZXYvbnVsbAorKysgYi9maWxlcy9Tb3VyY2UvTGliTU5HL2xpYm1uZ19vYmplY3RzLmgKQEAgLTAsMCArMSw2MzUgQEAKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBsaWJtbmcuaCAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBwcm9qZWN0ICAgOiBsaWJtbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogZmlsZSAgICAgIDogbGlibW5nX29iamVjdHMuaCAgICAgICAgICBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwNyBHLkp1eW4gICAqICovCisvKiAqIHZlcnNpb24gICA6IDEuMC4xMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogcHVycG9zZSAgIDogSW50ZXJuYWwgb2JqZWN0IHN0cnVjdHVyZXMgKGRlZmluaXRpb24pICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBhdXRob3IgICAgOiBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGNvbW1lbnQgICA6IERlZmluaXRpb24gb2YgdGhlIGludGVybmFsIG9iamVjdCBzdHJ1Y3R1cmVzICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogY2hhbmdlcyAgIDogMC41LjEgLSAwNS8wOC8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2hhbmdlZCBzdHJpY3QtQU5TSSBzdHVmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjIgLSAwNS8yMy8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2hhbmdlZCBpbmNsdXNpb24gdG8gRElTUExBWV9QUk9DUyAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMiAtIDA1LzI0LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBnbG9iYWwgY29sb3ItY2h1bmtzIGZvciBhbmltYXRpb25zICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgZ2xvYmFsIFBMVEUsdFJOUyxiS0dEIGNodW5rcyBmb3IgYW5pbWF0aW9uICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIFNBVkUgJiBTRUVLIGFuaW1hdGlvbiBvYmplY3RzICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjIgLSAwNS8yOS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgZnJhbWVuci9sYXllcm5yL3BsYXl0aW1lIHRvIG9iamVjdCBoZWFkZXIgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMiAtIDA1LzMwLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBhbmktb2JqZWN0cyBmb3IgZGVsdGEtaW1hZ2UgcHJvY2Vzc2luZyAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgY29tcHJlc3Npb24vZmlsdGVyL2ludGVybGFjZSBmaWVsZHMgdG8gICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgIG9iamVjdC1idWZmZXIgZm9yIGRlbHRhLWltYWdlIHByb2Nlc3NpbmcgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4zIC0gMDYvMTcvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNoYW5nZWQgZGVmaW5pdGlvbiBvZiBhVFJOU2VudHJpZXMgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjMgLSAwNi8yMi8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgZGVmaW5pdGlvbiBmb3IgUFBMVCBhbmltYXRpb24tcHJvY2Vzc2luZyAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjIgLSAwOC8wNS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2hhbmdlZCBmaWxlLXByZWZpeGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjMgLSAwOC8yNi8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgTUFHTiBjaHVuayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMyAtIDA5LzEwLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaXhlZCBERUZJIGJlaGF2aW9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4zIC0gMTAvMTYvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHN1cHBvcnQgZm9yIGRlbHRhLUpORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjMgLSAxMC8xNy8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgdmFsaWQtZmxhZyB0byBzdG9yZWQgb2JqZWN0cyBmb3IgcmVhZCgpIC8gZGlzcGxheSgpKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMyAtIDEwLzE5LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBzdG9yYWdlIGZvciBwaXhlbC0vYWxwaGEtc2FtcGxlZGVwdGggZm9yIGRlbHRhJ3MgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDA5LzEzLzIwMDIgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaXhlZCByZWFkL3dyaXRlIG9mIE1BR04gY2h1bmsgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC41IC0gMDkvMTUvMjAwMiAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGV2ZW50IGhhbmRsaW5nIGZvciBkeW5hbWljIE1ORyAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAwOS8yMC8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgc3VwcG9ydCBmb3IgUEFTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDA5LzIzLzIwMDIgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBpbi1tZW1vcnkgY29sb3ItY29ycmVjdGlvbiBvZiBhYnN0cmFjdCBpbWFnZXMgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC41IC0gMTAvMDcvMjAwMiAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIERJU0Mgc3VwcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC42IC0gMTAvMDcvMjAwMyAtIEcuUi1QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIFNLSVBDSFVOSyBjb25kaXRpb25hbHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC43IC0gMDMvMjQvMjAwNCAtIEcuUi1QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIG1vcmUgU0tJUENIVU5LIGNvbmRpdGlvbmFscyAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC45IC0gMTIvMDUvMjAwNCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGNvbmRpdGlvbmFsIE1OR19PUFRJTUlaRV9PQkpDTEVBTlVQICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC4xMCAtIDA0LzA4LzIwMDcgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHN1cHBvcnQgZm9yIG1QTkcgcHJvcG9zYWwgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjEwIC0gMDQvMTIvMjAwNyAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgc3VwcG9ydCBmb3IgQU5HIHByb3Bvc2FsICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZiBkZWZpbmVkKF9fQk9STEFORENfXykgJiYgZGVmaW5lZChNTkdfU1RSSUNUX0FOU0kpCisjcHJhZ21hIG9wdGlvbiAtQSAgICAgICAgICAgICAgICAgICAgICAvKiBmb3JjZSBBTlNJLUMgKi8KKyNlbmRpZgorCisjaWZuZGVmIF9saWJtbmdfb2JqZWN0c19oXworI2RlZmluZSBfbGlibW5nX29iamVjdHNfaF8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19JTkNMVURFX0RJU1BMQVlfUFJPQ1MKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKwordHlwZWRlZiBtbmdfcmV0Y29kZSAoKm1uZ19jbGVhbnVwb2JqZWN0KSAobW5nX2RhdGFwICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX29iamVjdHAgIHBIZWFkZXIpOworCit0eXBlZGVmIG1uZ19yZXRjb2RlICgqbW5nX3Byb2Nlc3NvYmplY3QpIChtbmdfZGF0YXAgICAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfb2JqZWN0cCAgcEhlYWRlcik7CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgICAgbW5nX2NsZWFudXBvYmplY3QgZkNsZWFudXA7CisgICAgICAgICAgIG1uZ19wcm9jZXNzb2JqZWN0IGZQcm9jZXNzOworICAgICAgICAgICBtbmdfb2JqZWN0cCAgICAgICBwTmV4dDsgICAgICAgICAgICAgIC8qIGZvciBkb3VibGUtbGlua2VkIGxpc3QgKi8KKyAgICAgICAgICAgbW5nX29iamVjdHAgICAgICAgcFByZXY7CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlGcmFtZW5yOworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpTGF5ZXJucjsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaVBsYXl0aW1lOworI2lmZGVmIE1OR19PUFRJTUlaRV9PQkpDTEVBTlVQCisgICAgICAgICAgIG1uZ19zaXplX3QgICAgICAgIGlPYmpzaXplOyAgICAgICAgICAgICAgICAgICAgCisjZW5kaWYKKyAgICAgICAgfSBtbmdfb2JqZWN0X2hlYWRlcjsKK3R5cGVkZWYgbW5nX29iamVjdF9oZWFkZXIgKiBtbmdfb2JqZWN0X2hlYWRlcnA7CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNTkcgc3BlY2lmaWNhdGlvbiAib2JqZWN0LWJ1ZmZlciIgKi8KKyAgICAgICAgICAgbW5nX29iamVjdF9oZWFkZXIgc0hlYWRlcjsgICAgICAgICAgICAvKiBkZWZhdWx0IGhlYWRlciAoRE8gTk9UIFJFTU9WRSkgKi8KKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaVJlZmNvdW50OyAgICAgICAgICAvKiByZWZlcmVuY2UgY291bnRlciAqLworICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICBiRnJvemVuOyAgICAgICAgICAgIC8qIGZyb3plbiBmbGFnICovCisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJDb25jcmV0ZTsgICAgICAgICAgLyogY29uY3JldGUgZmxhZyAqLworICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICBiVmlld2FibGU7ICAgICAgICAgIC8qIHZpZXdhYmxlIGZsYWcgKi8KKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaVdpZHRoOyAgICAgICAgICAgICAvKiBpbWFnZSBzcGVjaWZpY3MgKi8KKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaUhlaWdodDsKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaUJpdGRlcHRoOworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpQ29sb3J0eXBlOworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpQ29tcHJlc3Npb247CisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlGaWx0ZXI7CisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlJbnRlcmxhY2U7CisKKyAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICAgYkNvcnJlY3RlZDsgICAgICAgICAvKiBpbmRpY2F0ZXMgaWYgYW4gYWJzdHJhY3QgaW1hZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXMgYWxyZWFkeSBiZWVuIGNvbG9yLWNvcnJlY3RlZCAqLworICAgICAgICAgICAKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaUFscGhhYml0ZGVwdGg7ICAgICAvKiB1c2VkIG9ubHkgZm9yIEpORyBpbWFnZXMgKi8KKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaUpIRFJjb21wcmVzc2lvbjsKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaUpIRFJpbnRlcmxhY2U7CisKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaVBpeGVsc2FtcGxlZGVwdGg7ICAvKiB1c2VkIHdpdGggZGVsdGEtaW1hZ2VzICovCisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlBbHBoYXNhbXBsZWRlcHRoOworCisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJIYXNQTFRFOyAgICAgICAgICAgLyogUExURSBjaHVuayBwcmVzZW50ICovCisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJIYXNUUk5TOyAgICAgICAgICAgLyogdFJOUyBjaHVuayBwcmVzZW50ICovCisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJIYXNHQU1BOyAgICAgICAgICAgLyogZ0FNQSBjaHVuayBwcmVzZW50ICovCisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJIYXNDSFJNOyAgICAgICAgICAgLyogY0hSTSBjaHVuayBwcmVzZW50ICovCisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJIYXNTUkdCOyAgICAgICAgICAgLyogc1JHQiBjaHVuayBwcmVzZW50ICovCisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJIYXNJQ0NQOyAgICAgICAgICAgLyogaUNDUCBjaHVuayBwcmVzZW50ICovCisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJIYXNCS0dEOyAgICAgICAgICAgLyogYktHRCBjaHVuayBwcmVzZW50ICovCisKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaVBMVEVjb3VudDsgICAgICAgICAvKiBQTFRFIGZpZWxkcyAqLworICAgICAgICAgICBtbmdfcmdicGFsdGFiICAgICBhUExURWVudHJpZXM7CisKKyAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAgaVRSTlNncmF5OyAgICAgICAgICAvKiB0Uk5TIGZpZWxkcyAqLworICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICBpVFJOU3JlZDsKKyAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAgaVRSTlNncmVlbjsKKyAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAgaVRSTlNibHVlOworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpVFJOU2NvdW50OworICAgICAgICAgICBtbmdfdWludDhhcnIgICAgICBhVFJOU2VudHJpZXM7CisKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaUdhbW1hOyAgICAgICAgICAgICAvKiBnQU1BIGZpZWxkcyAqLworCisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlXaGl0ZXBvaW50eDsgICAgICAgLyogY0hSTSBmaWVsZHMgKi8KKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaVdoaXRlcG9pbnR5OworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpUHJpbWFyeXJlZHg7CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlQcmltYXJ5cmVkeTsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaVByaW1hcnlncmVlbng7CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlQcmltYXJ5Z3JlZW55OworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpUHJpbWFyeWJsdWV4OworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpUHJpbWFyeWJsdWV5OworCisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlSZW5kZXJpbmdpbnRlbnQ7ICAgLyogc1JHQiBmaWVsZHMgKi8KKworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpUHJvZmlsZXNpemU7ICAgICAgIC8qIGlDQ1AgZmllbGRzICovCisgICAgICAgICAgIG1uZ19wdHIgICAgICAgICAgIHBQcm9maWxlOworCisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlCS0dEaW5kZXg7ICAgICAgICAgLyogYktHRCBmaWVsZHMgKi8KKyAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAgaUJLR0RncmF5OworICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICBpQktHRHJlZDsKKyAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAgaUJLR0RncmVlbjsKKyAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAgaUJLR0RibHVlOworCisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlTYW1wbGVzaXplOyAgICAgICAgLyogc2l6ZSBvZiBhIHNhbXBsZSAqLworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpUm93c2l6ZTsgICAgICAgICAgIC8qIHNpemUgb2YgYSByb3cgb2Ygc2FtcGxlcyAqLworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpSW1nZGF0YXNpemU7ICAgICAgIC8qIHNpemUgb2YgdGhlIHNhbXBsZSBkYXRhIGJ1ZmZlciAqLworICAgICAgICAgICBtbmdfdWludDhwICAgICAgICBwSW1nZGF0YTsgICAgICAgICAgIC8qIGFjdHVhbCBzYW1wbGUgZGF0YSBidWZmZXIgKi8KKworICAgICAgICAgfSBtbmdfaW1hZ2VkYXRhOwordHlwZWRlZiBtbmdfaW1hZ2VkYXRhICogbW5nX2ltYWdlZGF0YXA7CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNTkcgc3BlY2lmaWNhdGlvbiAib2JqZWN0IiAqLworICAgICAgICAgICBtbmdfb2JqZWN0X2hlYWRlciBzSGVhZGVyOyAgICAgICAgICAgIC8qIGRlZmF1bHQgaGVhZGVyIChETyBOT1QgUkVNT1ZFKSAqLworICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICBpSWQ7ICAgICAgICAgICAgICAgIC8qIG9iamVjdC1pZCAqLworICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICBiRnJvemVuOyAgICAgICAgICAgIC8qIGZyb3plbiBmbGFnICovCisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJWaXNpYmxlOyAgICAgICAgICAgLyogcG90ZW50aWFsIHZpc2liaWxpdHkgZmxhZyAqLworICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICBiVmlld2FibGU7ICAgICAgICAgIC8qIHZpZXdhYmxlIGZsYWcgKi8KKyAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICAgYlZhbGlkOyAgICAgICAgICAgICAvKiBtYXJrcyBpbnZhbGlkIHdoZW4gb25seSByZWFkaW5nICovCisgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgIGlQb3N4OyAgICAgICAgICAgICAgLyogbG9jYXRpb24gZmllbGRzICovCisgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgIGlQb3N5OworICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICBiQ2xpcHBlZDsgICAgICAgICAgIC8qIGNsaXBwaW5nIGZpZWxkcyAqLworICAgICAgICAgICBtbmdfaW50MzIgICAgICAgICBpQ2xpcGw7CisgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgIGlDbGlwcjsKKyAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAgaUNsaXB0OworICAgICAgICAgICBtbmdfaW50MzIgICAgICAgICBpQ2xpcGI7CisjaWZuZGVmIE1OR19TS0lQQ0hVTktfTUFHTgorICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpTUFHTl9NZXRob2RYOyAgICAgIC8qIG1hZ25pZmljYXRpb24gKE1BR04pICovCisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlNQUdOX01ldGhvZFk7CisgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgIGlNQUdOX01YOworICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICBpTUFHTl9NWTsKKyAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAgaU1BR05fTUw7CisgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgIGlNQUdOX01SOworICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICBpTUFHTl9NVDsKKyAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAgaU1BR05fTUI7CisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19QQVNUCisgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgIGlQYXN0eDsgICAgICAgICAgICAgLyogdGFyZ2V0IHgveSBmcm9tIHByZXZpb3VzIFBBU1QgKi8KKyAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAgaVBhc3R5OworI2VuZGlmCisgICAgICAgICAgIG1uZ19pbWFnZWRhdGFwICAgIHBJbWdidWY7ICAgICAgICAgICAgLyogdGhlIGltYWdlLWRhdGEgYnVmZmVyICovCisgICAgICAgIH0gbW5nX2ltYWdlOwordHlwZWRlZiBtbmdfaW1hZ2UgKiBtbmdfaW1hZ2VwOworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIm9uLXRoZS1mbHkiIGltYWdlICg9IG9iamVjdCAwKSAqLyAgICAgICAKK3R5cGVkZWYgbW5nX2ltYWdlIG1uZ19hbmlfaW1hZ2U7ICAgICAgICAgICAgICAgICAvKiBsZXQncyAoYWIpdXNlIHRoZSBnZW5lcmFsICJvYmplY3QiICovCit0eXBlZGVmIG1uZ19hbmlfaW1hZ2UgKiBtbmdfYW5pX2ltYWdlcDsgICAgICAgICAgLyogdGhhdCdzIGFjdHVhbHkgY3J1Y2lhbCwgc28gZG9uJ3QgY2hhbmdlIGl0ISAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCit0eXBlZGVmIHN0cnVjdCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2xvYmFsIFBMVEUgb2JqZWN0ICovCisgICAgICAgICAgIG1uZ19vYmplY3RfaGVhZGVyIHNIZWFkZXI7ICAgICAgICAgICAgLyogZGVmYXVsdCBoZWFkZXIgKERPIE5PVCBSRU1PVkUpICovCisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlFbnRyeWNvdW50OworICAgICAgICAgICBtbmdfcmdicGFsdGFiICAgICBhRW50cmllczsKKyAgICAgICAgfSBtbmdfYW5pX3BsdGU7Cit0eXBlZGVmIG1uZ19hbmlfcGx0ZSAqIG1uZ19hbmlfcGx0ZXA7CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnbG9iYWwgdFJOUyBvYmplY3QgKi8KKyAgICAgICAgICAgbW5nX29iamVjdF9oZWFkZXIgc0hlYWRlcjsgICAgICAgICAgICAvKiBkZWZhdWx0IGhlYWRlciAoRE8gTk9UIFJFTU9WRSkgKi8KKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaVJhd2xlbjsKKyAgICAgICAgICAgbW5nX3VpbnQ4YXJyICAgICAgYVJhd2RhdGE7CisgICAgICAgIH0gbW5nX2FuaV90cm5zOwordHlwZWRlZiBtbmdfYW5pX3RybnMgKiBtbmdfYW5pX3RybnNwOworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCit0eXBlZGVmIHN0cnVjdCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2xvYmFsIGdBTUEgb2JqZWN0ICovCisgICAgICAgICAgIG1uZ19vYmplY3RfaGVhZGVyIHNIZWFkZXI7ICAgICAgICAgICAgLyogZGVmYXVsdCBoZWFkZXIgKERPIE5PVCBSRU1PVkUpICovCisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJFbXB0eTsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaUdhbW1hOworICAgICAgICB9IG1uZ19hbmlfZ2FtYTsKK3R5cGVkZWYgbW5nX2FuaV9nYW1hICogbW5nX2FuaV9nYW1hcDsKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX2NIUk0KK3R5cGVkZWYgc3RydWN0IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnbG9iYWwgY0hSTSBvYmplY3QgKi8KKyAgICAgICAgICAgbW5nX29iamVjdF9oZWFkZXIgc0hlYWRlcjsgICAgICAgICAgICAvKiBkZWZhdWx0IGhlYWRlciAoRE8gTk9UIFJFTU9WRSkgKi8KKyAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICAgYkVtcHR5OworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpV2hpdGVwb2ludHg7CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlXaGl0ZXBvaW50eTsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaVJlZHg7CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlSZWR5OworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpR3JlZW54OworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpR3JlZW55OworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpQmx1ZXg7CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlCbHVleTsKKyAgICAgICAgfSBtbmdfYW5pX2Nocm07Cit0eXBlZGVmIG1uZ19hbmlfY2hybSAqIG1uZ19hbmlfY2hybXA7CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKwordHlwZWRlZiBzdHJ1Y3QgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdsb2JhbCBzUkdCIG9iamVjdCAqLworICAgICAgICAgICBtbmdfb2JqZWN0X2hlYWRlciBzSGVhZGVyOyAgICAgICAgICAgIC8qIGRlZmF1bHQgaGVhZGVyIChETyBOT1QgUkVNT1ZFKSAqLworICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICBiRW1wdHk7CisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlSZW5kZXJpbmdpbnRlbnQ7CisgICAgICAgIH0gbW5nX2FuaV9zcmdiOwordHlwZWRlZiBtbmdfYW5pX3NyZ2IgKiBtbmdfYW5pX3NyZ2JwOworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfaUNDUAordHlwZWRlZiBzdHJ1Y3QgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdsb2JhbCBpQ0NQIG9iamVjdCAqLworICAgICAgICAgICBtbmdfb2JqZWN0X2hlYWRlciBzSGVhZGVyOyAgICAgICAgICAgIC8qIGRlZmF1bHQgaGVhZGVyIChETyBOT1QgUkVNT1ZFKSAqLworICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICBiRW1wdHk7CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlQcm9maWxlc2l6ZTsKKyAgICAgICAgICAgbW5nX3B0ciAgICAgICAgICAgcFByb2ZpbGU7CisgICAgICAgIH0gbW5nX2FuaV9pY2NwOwordHlwZWRlZiBtbmdfYW5pX2ljY3AgKiBtbmdfYW5pX2ljY3BwOworI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnbG9iYWwgYktHRCBvYmplY3QgKi8KKyAgICAgICAgICAgbW5nX29iamVjdF9oZWFkZXIgc0hlYWRlcjsgICAgICAgICAgICAvKiBkZWZhdWx0IGhlYWRlciAoRE8gTk9UIFJFTU9WRSkgKi8KKyAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAgaVJlZDsKKyAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAgaUdyZWVuOworICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICBpQmx1ZTsKKyAgICAgICAgfSBtbmdfYW5pX2JrZ2Q7Cit0eXBlZGVmIG1uZ19hbmlfYmtnZCAqIG1uZ19hbmlfYmtnZHA7CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMT09QIG9iamVjdCAqLworICAgICAgICAgICBtbmdfb2JqZWN0X2hlYWRlciBzSGVhZGVyOyAgICAgICAgICAgIC8qIGRlZmF1bHQgaGVhZGVyIChETyBOT1QgUkVNT1ZFKSAqLworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpTGV2ZWw7CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlSZXBlYXRjb3VudDsKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaVRlcm1jb25kOworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpSXRlcm1pbjsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaUl0ZXJtYXg7CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlDb3VudDsKKyAgICAgICAgICAgbW5nX3VpbnQzMnAgICAgICAgcFNpZ25hbHM7CisKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaVJ1bm5pbmdjb3VudDsgICAgICAvKiBydW5uaW5nIGNvdW50ZXIgKi8KKyAgICAgICAgfSBtbmdfYW5pX2xvb3A7Cit0eXBlZGVmIG1uZ19hbmlfbG9vcCAqIG1uZ19hbmlfbG9vcHA7CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFTkRMIG9iamVjdCAqLworICAgICAgICAgICBtbmdfb2JqZWN0X2hlYWRlciBzSGVhZGVyOyAgICAgICAgICAgIC8qIGRlZmF1bHQgaGVhZGVyIChETyBOT1QgUkVNT1ZFKSAqLworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpTGV2ZWw7CisKKyAgICAgICAgICAgbW5nX2FuaV9sb29wcCAgICAgcExPT1A7ICAgICAgICAgICAgICAvKiBtYXRjaGluZyBMT09QICovCisgICAgICAgIH0gbW5nX2FuaV9lbmRsOwordHlwZWRlZiBtbmdfYW5pX2VuZGwgKiBtbmdfYW5pX2VuZGxwOworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCit0eXBlZGVmIHN0cnVjdCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogREVGSSBvYmplY3QgKi8KKyAgICAgICAgICAgbW5nX29iamVjdF9oZWFkZXIgc0hlYWRlcjsgICAgICAgICAgICAvKiBkZWZhdWx0IGhlYWRlciAoRE8gTk9UIFJFTU9WRSkgKi8KKyAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAgaUlkOyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICAgYkhhc2Rvbm90c2hvdzsKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaURvbm90c2hvdzsKKyAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICAgYkhhc2NvbmNyZXRlOworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpQ29uY3JldGU7CisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJIYXNsb2NhOyAgICAgICAgICAgCisgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgIGlMb2NheDsKKyAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAgaUxvY2F5OworICAgICAgICAgICBtbmdfYm9vbCAgICAgICAgICBiSGFzY2xpcDsKKyAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAgaUNsaXBsOworICAgICAgICAgICBtbmdfaW50MzIgICAgICAgICBpQ2xpcHI7CisgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgIGlDbGlwdDsKKyAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAgaUNsaXBiOworICAgICAgICB9IG1uZ19hbmlfZGVmaTsKK3R5cGVkZWYgbW5nX2FuaV9kZWZpICogbW5nX2FuaV9kZWZpcDsKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKwordHlwZWRlZiBzdHJ1Y3QgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJBU0kgb2JqZWN0ICovCisgICAgICAgICAgIG1uZ19vYmplY3RfaGVhZGVyIHNIZWFkZXI7ICAgICAgICAgICAgLyogZGVmYXVsdCBoZWFkZXIgKERPIE5PVCBSRU1PVkUpICovCisgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgIGlSZWQ7ICAgICAgICAgICAgICAgCisgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgIGlHcmVlbjsgICAgICAgICAgICAgCisgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgIGlCbHVlOyAgICAgICAgICAgICAgCisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJIYXNhbHBoYTsgICAgICAgICAgICAgCisgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgIGlBbHBoYTsKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaVZpZXdhYmxlOworICAgICAgICB9IG1uZ19hbmlfYmFzaTsKK3R5cGVkZWYgbW5nX2FuaV9iYXNpICogbW5nX2FuaV9iYXNpcDsKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKwordHlwZWRlZiBzdHJ1Y3QgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENMT04gb2JqZWN0ICovCisgICAgICAgICAgIG1uZ19vYmplY3RfaGVhZGVyIHNIZWFkZXI7ICAgICAgICAgICAgLyogZGVmYXVsdCBoZWFkZXIgKERPIE5PVCBSRU1PVkUpICovCisgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgIGlDbG9uZWlkOworICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICBpU291cmNlaWQ7CisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlDbG9uZXR5cGU7CisgICAgICAgICAgIG1uZ19ib29sICAgICAgICAgIGJIYXNkb25vdHNob3c7CisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlEb25vdHNob3c7CisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlDb25jcmV0ZTsKKyAgICAgICAgICAgbW5nX2Jvb2wgICAgICAgICAgYkhhc2xvY2E7CisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlMb2NhdHlwZTsKKyAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAgaUxvY2F4OworICAgICAgICAgICBtbmdfaW50MzIgICAgICAgICBpTG9jYXk7CisgICAgICAgIH0gbW5nX2FuaV9jbG9uOwordHlwZWRlZiBtbmdfYW5pX2Nsb24gKiBtbmdfYW5pX2Nsb25wOworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCit0eXBlZGVmIHN0cnVjdCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQkFDSyBvYmplY3QgKi8KKyAgICAgICAgICAgbW5nX29iamVjdF9oZWFkZXIgc0hlYWRlcjsgICAgICAgICAgICAvKiBkZWZhdWx0IGhlYWRlciAoRE8gTk9UIFJFTU9WRSkgKi8KKyAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAgaVJlZDsKKyAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAgaUdyZWVuOworICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICBpQmx1ZTsKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaU1hbmRhdG9yeTsKKyAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAgaUltYWdlaWQ7CisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlUaWxlOworICAgICAgICB9IG1uZ19hbmlfYmFjazsKK3R5cGVkZWYgbW5nX2FuaV9iYWNrICogbW5nX2FuaV9iYWNrcDsKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKwordHlwZWRlZiBzdHJ1Y3QgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZSQU0gb2JqZWN0ICovCisgICAgICAgICAgIG1uZ19vYmplY3RfaGVhZGVyIHNIZWFkZXI7ICAgICAgICAgICAgLyogZGVmYXVsdCBoZWFkZXIgKERPIE5PVCBSRU1PVkUpICovCisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlGcmFtZW1vZGU7CisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlDaGFuZ2VkZWxheTsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaURlbGF5OworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpQ2hhbmdldGltZW91dDsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaVRpbWVvdXQ7CisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlDaGFuZ2VjbGlwcGluZzsKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaUNsaXB0eXBlOworICAgICAgICAgICBtbmdfaW50MzIgICAgICAgICBpQ2xpcGw7CisgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgIGlDbGlwcjsKKyAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAgaUNsaXB0OworICAgICAgICAgICBtbmdfaW50MzIgICAgICAgICBpQ2xpcGI7CisgICAgICAgIH0gbW5nX2FuaV9mcmFtOwordHlwZWRlZiBtbmdfYW5pX2ZyYW0gKiBtbmdfYW5pX2ZyYW1wOworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCit0eXBlZGVmIHN0cnVjdCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTU9WRSBvYmplY3QgKi8KKyAgICAgICAgICAgbW5nX29iamVjdF9oZWFkZXIgc0hlYWRlcjsgICAgICAgICAgICAvKiBkZWZhdWx0IGhlYWRlciAoRE8gTk9UIFJFTU9WRSkgKi8KKyAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAgaUZpcnN0aWQ7ICAgICAgICAgICAKKyAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAgaUxhc3RpZDsgICAgICAgICAgICAKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaVR5cGU7ICAgICAgICAgICAgICAKKyAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAgaUxvY2F4OyAgICAgICAgICAgICAKKyAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAgaUxvY2F5OworICAgICAgICB9IG1uZ19hbmlfbW92ZTsKK3R5cGVkZWYgbW5nX2FuaV9tb3ZlICogbW5nX2FuaV9tb3ZlcDsKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKwordHlwZWRlZiBzdHJ1Y3QgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENMSVAgb2JqZWN0ICovCisgICAgICAgICAgIG1uZ19vYmplY3RfaGVhZGVyIHNIZWFkZXI7ICAgICAgICAgICAgLyogZGVmYXVsdCBoZWFkZXIgKERPIE5PVCBSRU1PVkUpICovCisgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgIGlGaXJzdGlkOyAgICAgICAgICAgCisgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgIGlMYXN0aWQ7ICAgICAgICAgICAgCisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlUeXBlOyAgICAgICAgICAgICAgCisgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgIGlDbGlwbDsgICAgICAgICAgICAgCisgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgIGlDbGlwcjsgICAgICAgICAgICAgCisgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgIGlDbGlwdDsgICAgICAgICAgICAgCisgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgIGlDbGlwYjsKKyAgICAgICAgfSBtbmdfYW5pX2NsaXA7Cit0eXBlZGVmIG1uZ19hbmlfY2xpcCAqIG1uZ19hbmlfY2xpcHA7CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTSE9XIG9iamVjdCAqLworICAgICAgICAgICBtbmdfb2JqZWN0X2hlYWRlciBzSGVhZGVyOyAgICAgICAgICAgIC8qIGRlZmF1bHQgaGVhZGVyIChETyBOT1QgUkVNT1ZFKSAqLworICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICBpRmlyc3RpZDsgICAgICAgICAgIAorICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICBpTGFzdGlkOyAgICAgICAgICAgIAorICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpTW9kZTsKKyAgICAgICAgfSBtbmdfYW5pX3Nob3c7Cit0eXBlZGVmIG1uZ19hbmlfc2hvdyAqIG1uZ19hbmlfc2hvd3A7CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBURVJNIG9iamVjdCAqLworICAgICAgICAgICBtbmdfb2JqZWN0X2hlYWRlciBzSGVhZGVyOyAgICAgICAgICAgIC8qIGRlZmF1bHQgaGVhZGVyIChETyBOT1QgUkVNT1ZFKSAqLworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpVGVybWFjdGlvbjsgICAgICAgIAorICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpSXRlcmFjdGlvbjsgICAgICAgIAorICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpRGVsYXk7ICAgICAgICAgICAgIAorICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpSXRlcm1heDsKKyAgICAgICAgfSBtbmdfYW5pX3Rlcm07Cit0eXBlZGVmIG1uZ19hbmlfdGVybSAqIG1uZ19hbmlfdGVybXA7CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTQVZFIG9iamVjdCAqLworICAgICAgICAgICBtbmdfb2JqZWN0X2hlYWRlciBzSGVhZGVyOyAgICAgICAgICAgIC8qIGRlZmF1bHQgaGVhZGVyIChETyBOT1QgUkVNT1ZFKSAqLworICAgICAgICB9IG1uZ19hbmlfc2F2ZTsKK3R5cGVkZWYgbW5nX2FuaV9zYXZlICogbW5nX2FuaV9zYXZlcDsKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKwordHlwZWRlZiBzdHJ1Y3QgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNFRUsgb2JqZWN0ICovCisgICAgICAgICAgIG1uZ19vYmplY3RfaGVhZGVyIHNIZWFkZXI7ICAgICAgICAgICAgLyogZGVmYXVsdCBoZWFkZXIgKERPIE5PVCBSRU1PVkUpICovCisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlTZWdtZW50bmFtZXNpemU7CisgICAgICAgICAgIG1uZ19wY2hhciAgICAgICAgIHpTZWdtZW50bmFtZTsKKyAgICAgICAgfSBtbmdfYW5pX3NlZWs7Cit0eXBlZGVmIG1uZ19hbmlfc2VlayAqIG1uZ19hbmlfc2Vla3A7CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBESERSIG9iamVjdCAqLworICAgICAgICAgICBtbmdfb2JqZWN0X2hlYWRlciBzSGVhZGVyOyAgICAgICAgICAgIC8qIGRlZmF1bHQgaGVhZGVyIChETyBOT1QgUkVNT1ZFKSAqLworICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICBpT2JqZWN0aWQ7CisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlJbWFnZXR5cGU7CisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlEZWx0YXR5cGU7CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlCbG9ja3dpZHRoOworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpQmxvY2toZWlnaHQ7CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlCbG9ja3g7CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlCbG9ja3k7CisgICAgICAgIH0gbW5nX2FuaV9kaGRyOwordHlwZWRlZiBtbmdfYW5pX2RoZHIgKiBtbmdfYW5pX2RoZHJwOworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCit0eXBlZGVmIHN0cnVjdCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUFJPTSBvYmplY3QgKi8KKyAgICAgICAgICAgbW5nX29iamVjdF9oZWFkZXIgc0hlYWRlcjsgICAgICAgICAgICAvKiBkZWZhdWx0IGhlYWRlciAoRE8gTk9UIFJFTU9WRSkgKi8KKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaUJpdGRlcHRoOworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpQ29sb3J0eXBlOworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpRmlsbHR5cGU7CisgICAgICAgIH0gbW5nX2FuaV9wcm9tOwordHlwZWRlZiBtbmdfYW5pX3Byb20gKiBtbmdfYW5pX3Byb21wOworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCit0eXBlZGVmIHN0cnVjdCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSVBORyBvYmplY3QgKi8KKyAgICAgICAgICAgbW5nX29iamVjdF9oZWFkZXIgc0hlYWRlcjsgICAgICAgICAgICAvKiBkZWZhdWx0IGhlYWRlciAoRE8gTk9UIFJFTU9WRSkgKi8KKyAgICAgICAgfSBtbmdfYW5pX2lwbmc7Cit0eXBlZGVmIG1uZ19hbmlfaXBuZyAqIG1uZ19hbmlfaXBuZ3A7CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJSk5HIG9iamVjdCAqLworICAgICAgICAgICBtbmdfb2JqZWN0X2hlYWRlciBzSGVhZGVyOyAgICAgICAgICAgIC8qIGRlZmF1bHQgaGVhZGVyIChETyBOT1QgUkVNT1ZFKSAqLworICAgICAgICB9IG1uZ19hbmlfaWpuZzsKK3R5cGVkZWYgbW5nX2FuaV9pam5nICogbW5nX2FuaV9pam5ncDsKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKwordHlwZWRlZiBzdHJ1Y3QgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBQTFQgb2JqZWN0ICovCisgICAgICAgICAgIG1uZ19vYmplY3RfaGVhZGVyIHNIZWFkZXI7ICAgICAgICAgICAgLyogZGVmYXVsdCBoZWFkZXIgKERPIE5PVCBSRU1PVkUpICovCisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlUeXBlOworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpQ291bnQ7CisgICAgICAgICAgIG1uZ19yZ2JwYWx0YWIgICAgIGFJbmRleGVudHJpZXM7CisgICAgICAgICAgIG1uZ191aW50OGFyciAgICAgIGFBbHBoYWVudHJpZXM7CisgICAgICAgICAgIG1uZ191aW50OGFyciAgICAgIGFVc2VkZW50cmllczsKKyAgICAgICAgfSBtbmdfYW5pX3BwbHQ7Cit0eXBlZGVmIG1uZ19hbmlfcHBsdCAqIG1uZ19hbmlfcHBsdHA7CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX01BR04KK3R5cGVkZWYgc3RydWN0IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNQUdOIG9iamVjdCAqLworICAgICAgICAgICBtbmdfb2JqZWN0X2hlYWRlciBzSGVhZGVyOyAgICAgICAgICAgIC8qIGRlZmF1bHQgaGVhZGVyIChETyBOT1QgUkVNT1ZFKSAqLworICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICBpRmlyc3RpZDsKKyAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAgaUxhc3RpZDsKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaU1ldGhvZFg7CisgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgIGlNWDsKKyAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAgaU1ZOworICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICBpTUw7CisgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgIGlNUjsKKyAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAgaU1UOworICAgICAgICAgICBtbmdfdWludDE2ICAgICAgICBpTUI7CisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlNZXRob2RZOworICAgICAgICB9IG1uZ19hbmlfbWFnbjsKK3R5cGVkZWYgbW5nX2FuaV9tYWduICogbW5nX2FuaV9tYWducDsKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfUEFTVAordHlwZWRlZiBzdHJ1Y3QgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBBU1Qgb2JqZWN0ICovCisgICAgICAgICAgIG1uZ19vYmplY3RfaGVhZGVyIHNIZWFkZXI7ICAgICAgICAgICAgLyogZGVmYXVsdCBoZWFkZXIgKERPIE5PVCBSRU1PVkUpICovCisgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgIGlUYXJnZXRpZDsKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaVRhcmdldHR5cGU7CisgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgIGlUYXJnZXR4OworICAgICAgICAgICBtbmdfaW50MzIgICAgICAgICBpVGFyZ2V0eTsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaUNvdW50OworICAgICAgICAgICBtbmdfcHRyICAgICAgICAgICBwU291cmNlczsKKyAgICAgICAgfSBtbmdfYW5pX3Bhc3Q7Cit0eXBlZGVmIG1uZ19hbmlfcGFzdCAqIG1uZ19hbmlfcGFzdHA7CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX0RJU0MKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBESVNDIG9iamVjdCAqLworICAgICAgICAgICBtbmdfb2JqZWN0X2hlYWRlciBzSGVhZGVyOyAgICAgICAgICAgIC8qIGRlZmF1bHQgaGVhZGVyIChETyBOT1QgUkVNT1ZFKSAqLworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpQ291bnQ7CisgICAgICAgICAgIG1uZ191aW50MTZwICAgICAgIHBJZHM7CisgICAgICAgIH0gbW5nX2FuaV9kaXNjOwordHlwZWRlZiBtbmdfYW5pX2Rpc2MgKiBtbmdfYW5pX2Rpc2NwOworI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9EWU5BTUlDTU5HCit0eXBlZGVmIHN0cnVjdCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZXZlbnQgb2JqZWN0ICovCisgICAgICAgICAgIG1uZ19vYmplY3RfaGVhZGVyIHNIZWFkZXI7ICAgICAgICAgICAgLyogZGVmYXVsdCBoZWFkZXIgKERPIE5PVCBSRU1PVkUpICovCisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlFdmVudHR5cGU7CisgICAgICAgICAgIG1uZ191aW50OCAgICAgICAgIGlNYXNrdHlwZTsKKyAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAgaUxlZnQ7CisgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgIGlSaWdodDsKKyAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAgaVRvcDsKKyAgICAgICAgICAgbW5nX2ludDMyICAgICAgICAgaUJvdHRvbTsKKyAgICAgICAgICAgbW5nX3VpbnQxNiAgICAgICAgaU9iamVjdGlkOworICAgICAgICAgICBtbmdfdWludDggICAgICAgICBpSW5kZXg7CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlTZWdtZW50bmFtZXNpemU7CisgICAgICAgICAgIG1uZ19wY2hhciAgICAgICAgIHpTZWdtZW50bmFtZTsKKworICAgICAgICAgICBtbmdfYW5pX3NlZWtwICAgICBwU0VFSzsgICAgICAgICAgICAgIC8qIFNFRUsgYW5pIG9iamVjdCAqLworICAgICAgICAgICBtbmdfaW50MzIgICAgICAgICBpTGFzdHg7ICAgICAgICAgICAgIC8qIGxhc3QgWC9ZIGNvb3JkaW5hdGVzICovCisgICAgICAgICAgIG1uZ19pbnQzMiAgICAgICAgIGlMYXN0eTsKKyAgICAgICAgfSBtbmdfZXZlbnQ7Cit0eXBlZGVmIG1uZ19ldmVudCAqIG1uZ19ldmVudHA7CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19JTkNMVURFX01QTkdfUFJPUE9TQUwKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtUE5HIG9iamVjdCAqLworICAgICAgICAgICBtbmdfb2JqZWN0X2hlYWRlciBzSGVhZGVyOyAgICAgICAgICAgIC8qIGRlZmF1bHQgaGVhZGVyIChETyBOT1QgUkVNT1ZFKSAqLworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpRnJhbWV3aWR0aDsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaUZyYW1laGVpZ2h0OworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpTnVtcGxheXM7CisgICAgICAgICAgIG1uZ191aW50MTYgICAgICAgIGlUaWNrc3BlcnNlYzsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaUZyYW1lc3NpemU7CisgICAgICAgICAgIG1uZ19wdHIgICAgICAgICAgIHBGcmFtZXM7CisgICAgICAgIH0gbW5nX21wbmdfb2JqOwordHlwZWRlZiBtbmdfbXBuZ19vYmogKiBtbmdfbXBuZ19vYmpwOworI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfSU5DTFVERV9BTkdfUFJPUE9TQUwKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBTkcgb2JqZWN0ICovCisgICAgICAgICAgIG1uZ19vYmplY3RfaGVhZGVyIHNIZWFkZXI7ICAgICAgICAgICAgLyogZGVmYXVsdCBoZWFkZXIgKERPIE5PVCBSRU1PVkUpICovCisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlOdW1mcmFtZXM7CisgICAgICAgICAgIG1uZ191aW50MzIgICAgICAgIGlUaWNrc3BlcnNlYzsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaU51bXBsYXlzOworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpVGlsZXdpZHRoOworICAgICAgICAgICBtbmdfdWludDMyICAgICAgICBpVGlsZWhlaWdodDsKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaUludGVybGFjZTsKKyAgICAgICAgICAgbW5nX3VpbnQ4ICAgICAgICAgaVN0aWxsdXNlZDsKKyAgICAgICAgICAgbW5nX3VpbnQzMiAgICAgICAgaVRpbGVzc2l6ZTsKKyAgICAgICAgICAgbW5nX3B0ciAgICAgICAgICAgcFRpbGVzOworICAgICAgICB9IG1uZ19hbmdfb2JqOwordHlwZWRlZiBtbmdfYW5nX29iaiAqIG1uZ19hbmdfb2JqcDsKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjZW5kaWYgLyogTU5HX0lOQ0xVREVfRElTUExBWV9QUk9DUyAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjZW5kaWYgLyogX2xpYm1uZ19vYmplY3RzX2hfICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqIGVuZCBvZiBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9MaWJNTkcvbGlibW5nX3BpeGVscy5jIGIvZmlsZXMvU291cmNlL0xpYk1ORy9saWJtbmdfcGl4ZWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U1NjM3YgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9MaWJNTkcvbGlibW5nX3BpeGVscy5jCkBAIC0wLDAgKzEsMjQ2MTAgQEAKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBsaWJtbmcuaCAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBwcm9qZWN0ICAgOiBsaWJtbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogZmlsZSAgICAgIDogbGlibW5nX3BpeGVscy5jICAgICAgICAgICBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBHLkp1eW4gICAqICovCisvKiAqIHZlcnNpb24gICA6IDEuMC4xMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogcHVycG9zZSAgIDogUGl4ZWwtcm93IG1hbmFnZW1lbnQgcm91dGluZXMgKGltcGxlbWVudGF0aW9uKSAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBhdXRob3IgICAgOiBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGNvbW1lbnQgICA6IGltcGxlbWVudGF0aW9uIG9mIHRoZSBwaXhlbC1yb3cgbWFuYWdlbWVudCByb3V0aW5lcyAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgdGhlIGR1YWwgYWxwaGEtY29tcG9zaW5nIGZvciBSR0JBL0JHUkEvZXRjIG91dHB1dC1jYW52YXMnICAqICovCisvKiAqICAgICAgICAgICAgIGlzIGJhc2VkIG9uIHRoZSBOb3RlIG9uIENvbXBvc2l0aW5nIGNoYXB0ZXIgb2YgdGhlICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICBET0gtMyBkcmFmdCwgbm90ZWQgdG8gbWUgYnkgQWRhbSBNLiBDb3N0ZWxsbyAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGNoYW5nZXMgICA6IDAuNS4xIC0gMDUvMDgvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNoYW5nZWQgc3RyaWN0LUFOU0kgc3R1ZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjEgLSAwNS8xMS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgY2FsbGJhY2sgZXJyb3ItcmVwb3J0aW5nIHN1cHBvcnQgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMSAtIDA1LzEyLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjaGFuZ2VkIHRyYWNlIHRvIG1hY3JvIGZvciBjYWxsYmFjayBlcnJvci1yZXBvcnRpbmcgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMiAtIDA1LzIyLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBKTkcgc3VwcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4yIC0gMDUvMzAvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIG1pbm9yIGJ1Z3MgMTYtYml0IHBpeGVsLWhhbmRsaW5nICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBkZWx0YS1pbWFnZSByb3ctcHJvY2Vzc2luZyByb3V0aW5lcyAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4yIC0gMDYvMDIvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIGVuZGlhbiBzdXBwb3J0IChob3BlZnVsbHkpICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjIgLSAwNi8wMy8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgbWFrZXVwIGZvciBMaW51eCBnY2MgY29tcGlsZSAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMiAtIDA2LzA1LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBpbXBsZW1lbnRlZCBhcHAgYmtnZCByZXN0b3JlIHJvdXRpbmVzICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gaW1wbGVtZW50ZWQgUkdCQTgsIEFSR0I4LCBCR1JBOCAmIEFCR1I4IGRpc3BsYXkgcm91dGluZXMgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHN1cHBvcnQgZm9yIFJHQjhfQTggY2FudmFzc3R5bGUgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjIgLSAwNi8wOS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgYWxwaGEtaGFuZGxpbmcgZm9yIGFscGhhIGNhbnZhc3N0eWxlcyAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjMgLSAwNi8xNi8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2hhbmdlZCBwcm9ncmVzc2l2ZS1kaXNwbGF5IHByb2Nlc3NpbmcgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMyAtIDA2LzE3LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjaGFuZ2VkIHRvIHN1cHBvcnQgZGVsdGEtaW1hZ2VzICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gb3B0aW1pemVkIHNvbWUgc3RvcmVfeHh4IHJvdXRpbmVzICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMyAtIDA2LzIwLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaXhlZCBuYXN0eSBidWcgd2l0aCBlbWJlZGRlZCBQTkcgYWZ0ZXIgZGVsdGEtaW1hZ2UgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4zIC0gMDYvMjQvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIHByb2JsZW0gd2l0aCAxNi1iaXQgR0EgZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjMgLSAwNi8yNS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgcHJvYmxlbSB3aXRoIGNoZWFwIHRyYW5zcGFyZW5jeSBmb3IgNC1iaXQgZ3JheSAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIGRpc3BsYXlfeHh4eCByb3V0aW5lcyBmb3IgaW50ZXJsYWNlZCBpbWFnZXMgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjMgLSAwNi8yOC8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgY29tcGlsZXItd2FybmluZyBmb3Igbm9uLWluaXRpYWxpemVkIGlCIHZhcmlhYmxlICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjEgLSAwNy8wNS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgbWFuZGF0b3J5IEJBQ0sgY29sb3IgdG8gYmUgb3BhcXVlICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjIgLSAwNy8zMS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gQjExMDU0NyAtIGZpeGVkIGJ1ZyBpbiBpbnRlcmxhY2UgY29kZSAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMiAtIDA4LzA1LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjaGFuZ2VkIGZpbGUtcHJlZml4ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMyAtIDA4LzIwLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaXhlZCBhcHAtc3VwcGxpZWQgYmFja2dyb3VuZCByZXN0b3JlICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4zIC0gMDgvMjYvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIE1BR04gY2h1bmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjMgLSAwOS8wNy8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgc3VwcG9ydCBmb3IgbmV3IGZpbHRlcl90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMyAtIDA5LzMwLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaXhlZCBNQUdOIHJvdW5kaW5nIGVycm9ycyAodGhhbmtzIE1hdHRoaWFzISkgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4zIC0gMTAvMTAvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIGFscGhhLWJsZW5kaW5nIGZvciBSR0JBIGNhbnZhc3N0eWxlICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjMgLSAxMC8xMS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgYWxwaGEtYmxlbmRpbmcgZm9yIG90aGVyIGFscGhhLWNhbnZhc3N0eWxlcyAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMyAtIDEwLzE2LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBvcHRpb25hbCBzdXBwb3J0IGZvciBiS0dEIGZvciBQTkcgaW1hZ2VzICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgc3VwcG9ydCBmb3IgSkRBQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMyAtIDEwLzE3LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaXhlZCBzdXBwb3J0IGZvciBiS0dEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4zIC0gMTAvMTkvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGltcGxlbWVudGVkIGRlbGF5ZWQgZGVsdGEtcHJvY2Vzc2luZyAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjMgLSAxMC8yOC8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgdFJOUyBwcm9jZXNzaW5nIGZvciBncmF5LWltYWdlIDwgOC1iaXRzICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjQgLSAxMi8xNi8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgbWl4dXAgb2YgZGF0YS0gJiBmdW5jdGlvbi1wb2ludGVycyAodGhhbmtzIERpbWl0cmkpKiAqLworLyogKiAgICAgICAgICAgICAwLjkuNCAtICAxLzE4LzIwMDEgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSByZW1vdmVkICJvbGQiIE1BR04gbWV0aG9kcyAzICYgNCAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgIm5ldyIgTUFHTiBtZXRob2RzIDMsIDQgJiA1ICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIHJlbW92ZWQgdGVzdCBmaWx0ZXItbWV0aG9kcyAxICYgNjUgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC4xIC0gMDQvMjEvMjAwMSAtIEcuSnV5biAoY29kZSBieSBHLktlbGx5KSAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIEJHUkE4IGNhbnZhcyB3aXRoIHByZW11bHRpcGxpZWQgYWxwaGEgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjEgLSAwNC8yNS8yMDAxIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gbW92ZWQgbW5nX2NsZWFyX2NtcyB0byBsaWJtbmdfY21zICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjIgLSAwNi8yNS8yMDAxIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgb3B0aW9uIHRvIHR1cm4gb2ZmIHByb2dyZXNzaXZlIHJlZnJlc2ggICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjQgLSAxMS8wNC8yMDAxIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgcG9zc2libGUgY29tcGlsZS1wcm9ibGVtIGluIGNsZWFudXBfcm93cHJvYyAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNCAtIDA2LzIyLzIwMDIgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBCNTU4MjEyIC0gb2ZmIGJ5IG9uZSBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gTU5HIHN1YmltYWdlIGFscGhhIGNvbXBvc2l0ZSB3cm9uZyBmb3IgcmdiYTggaW1hZ2VzICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAwOC8wNy8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgdGVzdC1vcHRpb24gZm9yIFBORyBmaWx0ZXIgbWV0aG9kIDE5MyAoPW5vIGZpbHRlcikgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDA4LzE1LzIwMDIgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjb21wbGV0ZWQgUFJPTSBzdXBwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY29tcGxldGVkIGRlbHRhLWltYWdlIHN1cHBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDA4LzE2LzIwMDIgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjb21wbGV0ZWQgTUFHTiBzdXBwb3J0ICgxNi1iaXQgZnVuY3Rpb25zKSAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC41IC0gMDgvMTkvMjAwMiAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIEI1OTcxMzQgLSBsaWJtbmcgcG9sbHV0ZXMgdGhlIGxpbmtlciBuYW1lc3BhY2UgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAwOS8xOS8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gb3B0aW1pemVkIHJlc3RvcmUtYmFja2dyb3VuZCBmb3IgYktHRCBjYXNlcyAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDA5LzIwLzIwMDIgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaW5pc2hlZCBzdXBwb3J0IGZvciBCQUNLIGltYWdlICYgdGlsaW5nICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC41IC0gMDkvMjIvMjAwMiAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGJncng4IGNhbnZhcyAoZmlsbGVyIGJ5dGUpICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAwOS8yMy8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgY29tcG9zZSBvdmVyL3VuZGVyIHJvdXRpbmVzIGZvciBQQVNUIHByb2Nlc3NpbmcgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGZsaXAgJiB0aWxlIHJvdXRpbmVzIGZvciBQQVNUIHByb2Nlc3NpbmcgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC42IC0gMDMvMDkvMjAwMyAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGhpZGluZyAxMi1iaXQgSlBFRyBzdHVmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjYgLSAwNS8xMS8yMDAzIC0gR2xlbm4gUlAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgc2l6ZS1vcHRpbWl6YXRpb24gQ09NUE9TRSByb3V0aW5lIHVzYWdlICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNiAtIDA1LzExLzIwMDMgLSBHLiBKdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBjb25kaXRpb25hbHMgYXJvdW5kIGNhbnZhcyB1cGRhdGUgcm91dGluZXMgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC42IC0gMDUvMjUvMjAwMyAtIEdsZW5uIFJQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHNpemUtb3B0aW1pemF0aW9uIERJVjI1NUI4IHJvdXRpbmUgdXNhZ2UgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjYgLSAwNi8wOS8yMDAzIC0gRy4gUi1QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgY29uZGl0aW9uYWxzIGFyb3VuZCA4LWJpdCBtYWduIHJvdXRpbmVzICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNiAtIDA3LzA3LzIwMDMgLSBHLiBSLVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSByZW1vdmVkIGNvbmRpdGlvbmFscyBhcm91bmQgOC1iaXQgbWFnbiByb3V0aW5lcyAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgTU5HX05PXzE2QklUX1NVUFBPUlQgYW5kIE1OR19OT19ERUxUQV9QTkcgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgIGNvbmRpdGlvbmFscyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSByZXZlcnNlZCBtYW55IGxvb3BzIHRvIHVzZSBkZWNyZW1lbnRpbmcgY291bnRlciAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY29tYmluZWQgaW5pdCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNvbnZlcnRlZCBzb21lIHN3aXRjaGVzIHRvIGFycmF5IHJlZmVyZW5jZXMgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjYgLSAwNy8yOS8yMDAzIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgZHVwbGljYXRlIGZvci1sb29wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNiAtIDA3LzI5LzIwMDMgLSBHLlItUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBTS0lQQ0hVTksgY29uZGl0aW9uYWxzIGFyb3VuZCBQQVNUIGNodW5rIHN1cHBvcnQgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgIkZPT1RQUklOVF9DT01QT1NFSVYiIHR5cG8gKG5vdyAiRk9PVFBSSU5UX0RJViIpICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNiAtIDA4LzE3LzIwMDMgLSBHLlItUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBtb3JlIGNvbmRpdGlvbmFscyBhcm91bmQgInByb21vdGUiIGZ1bmN0aW9ucyAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNyAtIDExLzI3LzIwMDMgLSBSLkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBDQU5WQVNfUkdCNTY1IGFuZCBDQU5WQVNfQkdSNTY1ICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC43IC0gMTIvMDYvMjAwMyAtIFIuQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIENBTlZBU19SR0JBNTY1IGFuZCBDQU5WQVNfQkdSQTU2NSAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjcgLSAwMS8yNS8yMDA0IC0gSi5TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgcHJlbXVsdGlwbGllZCBhbHBoYSBjYW52YXMnIGZvciBSR0JBLCBBUkdCLCBBQkdSICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNyAtIDAzLzA4LzIwMDQgLSBHLlItUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBtb3JlIGNvbmRpdGlvbmFscyBhcm91bmQgMTYtYml0LXN1cHBvcnRpbmcgY29kZSAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC43IC0gMDMvMDkvMjAwNCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIGJ1ZyBpbiBwcm9tb3RlX2c4X2c4IHdpdGggMTZiaXQgc3VwcG9ydCBvZmYgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjcgLSAwMy8wOS8yMDA0IC0gRy5SLVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gbW9yZSBvcHRpbWl6YXRpb25zIHdpdGggMTZiaXQgc3VwcG9ydCBvZmYgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNyAtIDAzLzEwLzIwMDQgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaXhlZCBzb21lIHdhcm5pbmdzIGZvciAxNmJpdCBvcHRpbWl6YXRpb25zICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC43IC0gMDMvMjEvMjAwNCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIHNvbWUgNjQtYml0IHBsYXRmb3JtIGNvbXBpbGVyIHdhcm5pbmdzICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC44IC0gMDYvMjAvMjAwNCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIHNvbWUgc3BlZWQgb3B0aW1pemF0aW9ucyAodGhhbmtzIHRvIEpvaG4gU3RpbGVzKSAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjggLSAwOC8wMS8yMDA0IC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgc3VwcG9ydCBmb3IgMytieXRlIHBpeGVsc2l6ZSBmb3IgSlBFRydzICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjkgLSAxMC8xMC8yMDA0IC0gRy5SLVAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgTU5HX05PXzFfMl80QklUX1NVUFBPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuOSAtIDEwLzE0LzIwMDQgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBiZ3I1NjVfYTggY2FudmFzLXN0eWxlICh0aGFua3MgdG8gSi4gRWx2YW5kZXIpICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC45IC0gMTIvMDUvMjAwNCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIExJVFRMRUVORElBTi9CSUdFTkRJQU4gZml4dHVyZXMgKHRoYW5rcyBKLlN0aWxlcykgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaXhlZCBNTkdfTk9fMV8yXzRCSVRfU1VQUE9SVCBmb3IgVEJCTjFHMDQuUE5HICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC45IC0gMTIvMzEvMjAwNCAtIEcuUi1QLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIHdhcm5pbmdzIGFib3V0IEMrKyBzdHlsZSAoLy8pIGNvbW1lbnRzICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC4xMCAtIDA3LzA2LzIwMDUgLSBHLlItUC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIE1PUkUgTU5HX05PXzFfMl80QklUX1NVUFBPUlQgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjEwIC0gMTAvMDYvMjAwNSAtIEcuUi1QLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWxsb2MgbW9yZSBtZW1vcnkgZm9yIE1OR19OT18xXzJfNEJJVF9TVVBQT1JUICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuMTAgLSAxMi8wNy8yMDA1IC0gRy5SLVAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBvcHRpbWl6ZWQgZm9vdHByaW50IG9mIDE2Yml0IHN1cHBvcnQgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC4xMCAtIDAzLzA3LzIwMDYgLSAodGhhbmtzIHRvIFcuIE1hbnRoZXkpICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIENBTlZBU19SR0I1NTUgYW5kIENBTlZBU19CR1I1NTUgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaW5jbHVkZSAibGlibW5nLmgiCisjaW5jbHVkZSAibGlibW5nX2RhdGEuaCIKKyNpbmNsdWRlICJsaWJtbmdfZXJyb3IuaCIKKyNpbmNsdWRlICJsaWJtbmdfdHJhY2UuaCIKKyNpZmRlZiBfX0JPUkxBTkRDX18KKyNwcmFnbWEgaGRyc3RvcAorI2VuZGlmCisjaW5jbHVkZSAibGlibW5nX29iamVjdHMuaCIKKyNpbmNsdWRlICJsaWJtbmdfb2JqZWN0X3ByYy5oIgorI2luY2x1ZGUgImxpYm1uZ19tZW1vcnkuaCIKKyNpbmNsdWRlICJsaWJtbmdfY21zLmgiCisjaW5jbHVkZSAibGlibW5nX2ZpbHRlci5oIgorI2luY2x1ZGUgImxpYm1uZ19waXhlbHMuaCIKKworI2lmIGRlZmluZWQoX19CT1JMQU5EQ19fKSAmJiBkZWZpbmVkKE1OR19TVFJJQ1RfQU5TSSkKKyNwcmFnbWEgb3B0aW9uIC1BICAgICAgICAgICAgICAgICAgICAgIC8qIGZvcmNlIEFOU0ktQyAqLworI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfSU5DTFVERV9ESVNQTEFZX1BST0NTCisKKy8qIFRPRE86IG1hZ25pZmljYXRpb24gJiBjYW52YXMtcG9zaXRpb25pbmcvLWNsaXBwaW5nICovCisKKy8qIFRPRE86IG1ham9yIG9wdGltaXphdGlvbiBvZiBwaXhlbC1sb29wcyBieSB1c2luZyBhc3NlbWJsZXIgKD8pICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBJbnRlcmxhY2UgdGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitNTkdfTE9DQUwgbW5nX3VpbnQzMiBjb25zdCBpbnRlcmxhY2Vfcm93ICAgICAgWzddID0geyAwLCAwLCA0LCAwLCAyLCAwLCAxIH07CitNTkdfTE9DQUwgbW5nX3VpbnQzMiBjb25zdCBpbnRlcmxhY2Vfcm93c2tpcCAgWzddID0geyA4LCA4LCA4LCA0LCA0LCAyLCAyIH07CitNTkdfTE9DQUwgbW5nX3VpbnQzMiBjb25zdCBpbnRlcmxhY2VfY29sICAgICAgWzddID0geyAwLCA0LCAwLCAyLCAwLCAxLCAwIH07CitNTkdfTE9DQUwgbW5nX3VpbnQzMiBjb25zdCBpbnRlcmxhY2VfY29sc2tpcCAgWzddID0geyA4LCA4LCA0LCA0LCAyLCAyLCAxIH07CitNTkdfTE9DQUwgbW5nX3VpbnQzMiBjb25zdCBpbnRlcmxhY2Vfcm91bmRvZmYgWzddID0geyA3LCA3LCAzLCAzLCAxLCAxLCAwIH07CitNTkdfTE9DQUwgbW5nX3VpbnQzMiBjb25zdCBpbnRlcmxhY2VfZGl2aWRlciAgWzddID0geyAzLCAzLCAyLCAyLCAxLCAxLCAwIH07CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBBbHBoYSBjb21wb3NpbmcgbWFjcm9zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogdGhlIGNvZGUgYmVsb3cgaXMgc2xpZ2h0bHkgbW9kaWZpZWQgZnJvbSB0aGUgbGlicG5nIHBhY2thZ2UgICAgICAgICAgICAqICovCisvKiAqIHRoZSBvcmlnaW5hbCB3YXMgbGFzdCBvcHRpbWl6ZWQgYnkgR3JlZyBSb2Vsb2ZzICYgTWFyayBBZGxlciAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNkZWZpbmUgTU5HX0NPTVBPU0U4KFJFVCxGRyxBTFBIQSxCRykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBtbmdfdWludDE2IGlIID0gKG1uZ191aW50MTYpKChtbmdfdWludDE2KShGRykgKiAobW5nX3VpbnQxNikoQUxQSEEpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICsgKG1uZ191aW50MTYpKEJHKSoobW5nX3VpbnQxNikoMjU1IC0gICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ191aW50MTYpKEFMUEhBKSkgKyAobW5nX3VpbnQxNikxMjgpOyAgICAgICAgIFwKKyAgICAgICAoUkVUKSA9IChtbmdfdWludDgpKChpSCArIChpSCA+PiA4KSkgPj4gOCk7IH0KKworI2RlZmluZSBNTkdfQ09NUE9TRTE2KFJFVCxGRyxBTFBIQSxCRykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIG1uZ191aW50MzIgaUggPSAobW5nX3VpbnQzMikoKG1uZ191aW50MzIpKEZHKSAqIChtbmdfdWludDMyKShBTFBIQSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgKyAobW5nX3VpbnQzMikoQkcpKihtbmdfdWludDMyKSg2NTUzNUwgLSAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX3VpbnQzMikoQUxQSEEpKSArIChtbmdfdWludDMyKTMyNzY4TCk7ICAgICAgXAorICAgICAgIChSRVQpID0gKG1uZ191aW50MTYpKChpSCArIChpSCA+PiAxNikpID4+IDE2KTsgfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogQWxwaGEgYmxlbmRpbmcgbWFjcm9zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIHRoaXMgY29kZSBpcyBiYXNlZCBvbiBBZGFtIENvc3RlbGxvJ3MgIk5vdGUgb24gQ29tcG9zaXRpbmciIGZyb20gdGhlICAgKiAqLworLyogKiBtbmctbGlzdCB3aGljaCBnaXZlcyB0aGUgZm9sbG93aW5nIGZvcm11bGE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIHRvcCBwaXhlbCAgICAgICA9IChSdCwgR3QsIEJ0LCBBdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBib3R0b20gcGl4ZWwgICAgPSAoUmIsIEdiLCBCYiwgQWIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogY29tcG9zaXRlIHBpeGVsID0gKFJjLCBHYywgQmMsIEFjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBhbGwgdmFsdWVzIGluIHRoZSByYW5nZSAwLi4xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIEFjID0gMSAtICgxIC0gQXQpKDEgLSBBYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBzID0gQXQgLyBBYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogdCA9ICgxIC0gQXQpIEFiIC8gQWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIFJjID0gcyBSdCArIHQgUmIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBHYyA9IHMgR3QgKyB0IEdiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogQmMgPSBzIEJ0ICsgdCBCYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAoSSBqdXN0IGhvcGUgSSBjb2RlZCBpdCBjb3JyZWN0bHkgaW4gaW50ZWdlciBhcml0aG1ldGljLi4uKSAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjZGVmaW5lIE1OR19CTEVORDgoUlQsIEdULCBCVCwgQVQsIFJCLCBHQiwgQkIsIEFCLCBSQywgR0MsIEJDLCBBQykgeyAgICAgICAgIFwKKyAgICAgICBtbmdfdWludDMyIFMsIFQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIChBQykgPSAobW5nX3VpbnQ4KSgobW5nX3VpbnQzMikyNTUgLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICgoKChtbmdfdWludDMyKTI1NSAtIChtbmdfdWludDMyKShBVCkpICogICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG1uZ191aW50MzIpMjU1IC0gKG1uZ191aW50MzIpKEFCKSkgICApID4+IDgpKTsgXAorICAgICAgIFMgICAgPSAobW5nX3VpbnQzMikoKChtbmdfdWludDMyKShBVCkgPDwgOCkgLyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX3VpbnQzMikoQUMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBUICAgID0gKG1uZ191aW50MzIpKCgobW5nX3VpbnQzMikyNTUgLSAobW5nX3VpbnQzMikoQVQpKSAqICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfdWludDMyKShBQikgLyAobW5nX3VpbnQzMikoQUMpKTsgICAgICAgICAgICBcCisgICAgICAgKFJDKSA9IChtbmdfdWludDgpKChTICogKG1uZ191aW50MzIpKFJUKSArICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgKiAobW5nX3VpbnQzMikoUkIpICsgKG1uZ191aW50MzIpMTI3KSA+PiA4KTsgICAgXAorICAgICAgIChHQykgPSAobW5nX3VpbnQ4KSgoUyAqIChtbmdfdWludDMyKShHVCkgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUICogKG1uZ191aW50MzIpKEdCKSArIChtbmdfdWludDMyKTEyNykgPj4gOCk7ICAgIFwKKyAgICAgICAoQkMpID0gKG1uZ191aW50OCkoKFMgKiAobW5nX3VpbnQzMikoQlQpICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVCAqIChtbmdfdWludDMyKShCQikgKyAobW5nX3VpbnQzMikxMjcpID4+IDgpOyB9CisKKyNkZWZpbmUgTU5HX0JMRU5EMTYoUlQsIEdULCBCVCwgQVQsIFJCLCBHQiwgQkIsIEFCLCBSQywgR0MsIEJDLCBBQykgeyAgICAgICAgICAgIFwKKyAgICAgICBtbmdfdWludDMyIFMsIFQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAoQUMpID0gKG1uZ191aW50MTYpKChtbmdfdWludDMyKTY1NTM1IC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKChtbmdfdWludDMyKTY1NTM1IC0gKG1uZ191aW50MzIpKEFUKSkgKiAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChtbmdfdWludDMyKTY1NTM1IC0gKG1uZ191aW50MzIpKEFCKSkgICApID4+IDE2KSk7IFwKKyAgICAgICBTICAgID0gKG1uZ191aW50MzIpKCgobW5nX3VpbnQzMikoQVQpIDw8IDE2KSAvICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX3VpbnQzMikoQUMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBUICAgID0gKG1uZ191aW50MzIpKCgobW5nX3VpbnQzMik2NTUzNSAtIChtbmdfdWludDMyKShBVCkpICogICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX3VpbnQzMikoQUIpIC8gKG1uZ191aW50MzIpKEFDKSk7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAoUkMpID0gKG1uZ191aW50MTYpKChTICogKG1uZ191aW50MzIpKFJUKSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUICogKG1uZ191aW50MzIpKFJCKSArIChtbmdfdWludDMyKTMyNzY3KSA+PiAxNik7ICAgIFwKKyAgICAgICAoR0MpID0gKG1uZ191aW50MTYpKChTICogKG1uZ191aW50MzIpKEdUKSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUICogKG1uZ191aW50MzIpKEdCKSArIChtbmdfdWludDMyKTMyNzY3KSA+PiAxNik7ICAgIFwKKyAgICAgICAoQkMpID0gKG1uZ191aW50MTYpKChTICogKG1uZ191aW50MzIpKEJUKSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUICogKG1uZ191aW50MzIpKEJCKSArIChtbmdfdWludDMyKTMyNzY3KSA+PiAxNik7IH0KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworLyogbm90ZSBhIGdvb2Qgb3B0aW1pemluZyBjb21waWxlciB3aWxsIG9wdGltaXplIHRoaXMgKi8KKyNkZWZpbmUgRElWMjU1QjgoeCkgKG1uZ191aW50OCkoKCh4KSArIDEyNykgLyAyNTUpCisjZGVmaW5lIERJVjI1NUIxNih4KSAobW5nX3VpbnQxNikoKCh4KSArIDMyNzY3KSAvIDY1NTM1KQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogUHJvZ3Jlc3NpdmUgZGlzcGxheSBjaGVjayAtIGNoZWNrcyB0byBzZWUgaWYgcHJvZ3Jlc3NpdmUgZGlzcGxheSBpcyAgICAqICovCisvKiAqIGluIG9yZGVyICYgaW5kaWNhdGVzIHNvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogVGhlIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGEgY2FsbCB0byBvbmUgb2YgdGhlIGRpc3BsYXlfeHh4IHJvdXRpbmVzICAqICovCisvKiAqIGlmIGFwcHJvcHJpYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogVGhlIHJlZnJlc2ggaXMgd2FycmVudGVkIGluIHRoZSByZWFkX2NodW5rIHJvdXRpbmUgKG1uZ19yZWFkLmMpICAgICAgICAqICovCisvKiAqIGFuZCBvbmx5IGR1cmluZyByZWFkJmRpc3BsYXkgcHJvY2Vzc2luZywgc2luY2UgdGhlcmUncyBub3QgbXVjaCBwb2ludCAgKiAqLworLyogKiBkb2luZyBpdCBmcm9tIG1lbW9yeSEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfZGlzcGxheV9wcm9ncmVzc2l2ZV9jaGVjayAobW5nX2RhdGFwIHBEYXRhKQoreworICBpZiAoKHBEYXRhLT5iRG9Qcm9ncmVzc2l2ZSkgJiYgICAgICAgLyogbmVlZCBwcm9ncmVzc2l2ZSBkaXNwbGF5PyAqLworICAgICAgKChwRGF0YS0+ZUltYWdldHlwZSAhPSBtbmdfaXRfbW5nKSB8fCAocERhdGEtPmlEYXRhaGVpZ2h0ID4gMzAwKSkgJiYKKyAgICAgIChwRGF0YS0+aURlc3RiIC0gcERhdGEtPmlEZXN0dCA+IDUwKSAmJiAoIXBEYXRhLT5wQ3VycmFuaW9iaikpCisgIHsKKyAgICBtbmdfaW50MzIgaUMgPSBwRGF0YS0+aVJvdyArIHBEYXRhLT5pRGVzdHQgLSBwRGF0YS0+aVNvdXJjZXQ7CisKKyAgICBpZiAoaUMgJSAyMCA9PSAwKSAgICAgICAgICAgICAgICAgIC8qIGV2ZXJ5IDIwdGggbGluZSAqLworICAgICAgcERhdGEtPmJOZWVkcmVmcmVzaCA9IE1OR19UUlVFOworCisgIH0KKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBEaXNwbGF5IHJvdXRpbmVzIC0gY29udmVydCByb3dkYXRhICh3aGljaCBpcyBhbHJlYWR5IGNvbG9yLWNvcnJlY3RlZCkgICogKi8KKy8qICogdG8gdGhlIG91dHB1dCBjYW52YXMsIHJlc3BlY3RpbmcgdGhlIG9wYWNpdHkgaW5mb3JtYXRpb24gICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworTU5HX0xPQ0FMIHZvaWQgY2hlY2tfdXBkYXRlX3JlZ2lvbiAobW5nX2RhdGFwIHBEYXRhKQoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGV0ZXJtaW5lIGFjdHVhbCBjYW52YXMgcm93ICovCisgIG1uZ19pbnQzMiBpUm93ID0gcERhdGEtPmlSb3cgKyBwRGF0YS0+aURlc3R0IC0gcERhdGEtPmlTb3VyY2V0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2hlY2sgZm9yIGNoYW5nZSBpbiB1cGRhdGUtcmVnaW9uICovCisgIGlmICgocERhdGEtPmlEZXN0bCA8IChtbmdfaW50MzIpcERhdGEtPmlVcGRhdGVsZWZ0KSB8fCAocERhdGEtPmlVcGRhdGVyaWdodCA9PSAwKSkKKyAgICBwRGF0YS0+aVVwZGF0ZWxlZnQgICA9IHBEYXRhLT5pRGVzdGw7CisKKyAgaWYgKHBEYXRhLT5pRGVzdHIgPiAobW5nX2ludDMyKXBEYXRhLT5pVXBkYXRlcmlnaHQpCisgICAgcERhdGEtPmlVcGRhdGVyaWdodCAgPSBwRGF0YS0+aURlc3RyOworCisgIGlmICgoaVJvdyA8IChtbmdfaW50MzIpcERhdGEtPmlVcGRhdGV0b3ApIHx8IChwRGF0YS0+aVVwZGF0ZWJvdHRvbSA9PSAwKSkKKyAgICBwRGF0YS0+aVVwZGF0ZXRvcCAgICA9IGlSb3c7CisKKyAgaWYgKGlSb3crMSA+IChtbmdfaW50MzIpcERhdGEtPmlVcGRhdGVib3R0b20pCisgICAgcERhdGEtPmlVcGRhdGVib3R0b20gPSBpUm93KzE7CisKKyAgcmV0dXJuOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0FOVkFTX1JHQjgKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyNpZm5kZWYgTU5HX09QVElNSVpFX0ZPT1RQUklOVF9DT01QT1NFCittbmdfcmV0Y29kZSBtbmdfZGlzcGxheV9yZ2I4IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ191aW50OHAgcFNjYW5saW5lOworICBtbmdfdWludDhwIHBEYXRhbGluZTsKKyAgbW5nX2ludDMyICBpWDsKKyAgbW5nX3VpbnQxNiBpQTE2OworICBtbmdfdWludDE2IGlGR3IxNiwgaUZHZzE2LCBpRkdiMTY7CisgIG1uZ191aW50MTYgaUJHcjE2LCBpQkdnMTYsIGlCR2IxNjsKKyAgbW5nX3VpbnQ4ICBpQTg7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRElTUExBWV9SR0I4LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2aWV3YWJsZSByb3cgPyAqLworICBpZiAoKHBEYXRhLT5pUm93ID49IHBEYXRhLT5pU291cmNldCkgJiYgKHBEYXRhLT5pUm93IDwgcERhdGEtPmlTb3VyY2ViKSkKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHJlc3MgZGVzdGluYXRpb24gcm93ICovCisgICAgcFNjYW5saW5lID0gKG1uZ191aW50OHApcERhdGEtPmZHZXRjYW52YXNsaW5lICgoKG1uZ19oYW5kbGUpcERhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlSb3cgKyBwRGF0YS0+aURlc3R0IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pU291cmNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGp1c3QgZGVzdGluYXRpb24gcm93IHN0YXJ0aW5nLXBvaW50ICovCisgICAgcFNjYW5saW5lID0gcFNjYW5saW5lICsgKHBEYXRhLT5pQ29sICogMykgKyAocERhdGEtPmlEZXN0bCAqIDMpOworICAgIHBEYXRhbGluZSA9IHBEYXRhLT5wUkdCQXJvdzsgICAgICAgLyogYWRkcmVzcyBzb3VyY2Ugcm93ICovCisKKyAgICBpZiAocERhdGEtPmJJc1JHQkExNikgICAgICAgICAgICAgIC8qIGFkanVzdCBzb3VyY2Ugcm93IHN0YXJ0aW5nLXBvaW50ICovCisgICAgICBwRGF0YWxpbmUgPSBwRGF0YWxpbmUgKyAoKHBEYXRhLT5pU291cmNlbCAvIHBEYXRhLT5pQ29saW5jKSA8PCAzKTsKKyAgICBlbHNlCisgICAgICBwRGF0YWxpbmUgPSBwRGF0YWxpbmUgKyAoKHBEYXRhLT5pU291cmNlbCAvIHBEYXRhLT5pQ29saW5jKSA8PCAyKTsKKworICAgIGlmIChwRGF0YS0+YklzT3BhcXVlKSAgICAgICAgICAgICAgLyogZm9yZ2V0IGFib3V0IHRyYW5zcGFyZW5jeSA/ICovCisgICAgeworICAgICAgaWYgKHBEYXRhLT5iSXNSR0JBMTYpICAgICAgICAgICAgLyogMTYtYml0IGlucHV0IHJvdyA/ICovCisgICAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzY2FsZSBkb3duIGJ5IGRyb3BwaW5nIHRoZSBMU0IgKi8KKyAgICAgICAgICAqcFNjYW5saW5lICAgICA9ICpwRGF0YWxpbmU7CisgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAqKHBEYXRhbGluZSsyKTsKKyAgICAgICAgICAqKHBTY2FubGluZSsyKSA9ICoocERhdGFsaW5lKzQpOworCisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyAqIDMpOworICAgICAgICAgIHBEYXRhbGluZSArPSA4OworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3B5IHRoZSB2YWx1ZXMgKi8KKyAgICAgICAgICAqcFNjYW5saW5lICAgICA9ICpwRGF0YWxpbmU7CisgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAqKHBEYXRhbGluZSsxKTsKKyAgICAgICAgICAqKHBTY2FubGluZSsyKSA9ICoocERhdGFsaW5lKzIpOworCisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyAqIDMpOworICAgICAgICAgIHBEYXRhbGluZSArPSA0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBpZiAocERhdGEtPmJJc1JHQkExNikgICAgICAgICAgICAvKiAxNi1iaXQgaW5wdXQgcm93ID8gKi8KKyAgICAgIHsKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pQ29sOyBpWCA8IHBEYXRhLT5pU291cmNlcjsKKyAgICAgICAgICAgICBpWCArPSBwRGF0YS0+aUNvbGluYykKKyAgICAgICAgeworICAgICAgICAgIGlBMTYgPSBtbmdfZ2V0X3VpbnQxNiAocERhdGFsaW5lKzYpOworCisgICAgICAgICAgaWYgKGlBMTYpICAgICAgICAgICAgICAgICAgICAvKiBhbnkgb3BhY2l0eSBhdCBhbGwgPyAqLworICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpQTE2ID09IDB4RkZGRikgICAgICAgIC8qIGZ1bGx5IG9wYXF1ZSA/ICovCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzY2FsZSBkb3duIGJ5IGRyb3BwaW5nIHRoZSBMU0IgKi8KKyAgICAgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAqcERhdGFsaW5lOworICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9ICoocERhdGFsaW5lKzIpOworICAgICAgICAgICAgICAqKHBTY2FubGluZSsyKSA9ICoocERhdGFsaW5lKzQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0IHRoZSBwcm9wZXIgdmFsdWVzICovCisgICAgICAgICAgICAgIGlGR3IxNiA9IG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUgICk7CisgICAgICAgICAgICAgIGlGR2cxNiA9IG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUrMik7CisgICAgICAgICAgICAgIGlGR2IxNiA9IG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUrNCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzY2FsZSBiYWNrZ3JvdW5kIHVwICovCisgICAgICAgICAgICAgIGlCR3IxNiA9IChtbmdfdWludDE2KSgqcFNjYW5saW5lICAgICk7CisgICAgICAgICAgICAgIGlCR2cxNiA9IChtbmdfdWludDE2KSgqKHBTY2FubGluZSsxKSk7CisgICAgICAgICAgICAgIGlCR2IxNiA9IChtbmdfdWludDE2KSgqKHBTY2FubGluZSsyKSk7CisgICAgICAgICAgICAgIGlCR3IxNiA9IChtbmdfdWludDE2KSgobW5nX3VpbnQzMilpQkdyMTYgPDwgOCkgfCBpQkdyMTY7CisgICAgICAgICAgICAgIGlCR2cxNiA9IChtbmdfdWludDE2KSgobW5nX3VpbnQzMilpQkdnMTYgPDwgOCkgfCBpQkdnMTY7CisgICAgICAgICAgICAgIGlCR2IxNiA9IChtbmdfdWludDE2KSgobW5nX3VpbnQzMilpQkdiMTYgPDwgOCkgfCBpQkdiMTY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3cgY29tcG9zZSAqLworICAgICAgICAgICAgICBNTkdfQ09NUE9TRTE2KGlGR3IxNiwgaUZHcjE2LCBpQTE2LCBpQkdyMTYpOworICAgICAgICAgICAgICBNTkdfQ09NUE9TRTE2KGlGR2cxNiwgaUZHZzE2LCBpQTE2LCBpQkdnMTYpOworICAgICAgICAgICAgICBNTkdfQ09NUE9TRTE2KGlGR2IxNiwgaUZHYjE2LCBpQTE2LCBpQkdiMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHJldHVybiB0aGUgY29tcG9zZWQgdmFsdWVzICovCisgICAgICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKG1uZ191aW50OCkoaUZHcjE2ID4+IDgpOworICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9IChtbmdfdWludDgpKGlGR2cxNiA+PiA4KTsKKyAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMikgPSAobW5nX3VpbnQ4KShpRkdiMTYgPj4gOCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyAqIDMpOworICAgICAgICAgIHBEYXRhbGluZSArPSA4OworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsKKyAgICAgICAgICBpQTggPSAqKHBEYXRhbGluZSszKTsgICAgICAgIC8qIGdldCBhbHBoYSB2YWx1ZSAqLworCisgICAgICAgICAgaWYgKGlBOCkgICAgICAgICAgICAgICAgICAgICAvKiBhbnkgb3BhY2l0eSBhdCBhbGwgPyAqLworICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpQTggPT0gMHhGRikgICAgICAgICAgIC8qIGZ1bGx5IG9wYXF1ZSA/ICovCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGVuIHNpbXBseSBjb3B5IHRoZSB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAqcERhdGFsaW5lOworICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9ICoocERhdGFsaW5lKzEpOworICAgICAgICAgICAgICAqKHBTY2FubGluZSsyKSA9ICoocERhdGFsaW5lKzIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZG8gYWxwaGEgY29tcG9zaW5nICovCisgICAgICAgICAgICAgIE1OR19DT01QT1NFOCAoKnBTY2FubGluZSwgICAgICpwRGF0YWxpbmUsICAgICBpQTgsICpwU2NhbmxpbmUgICAgKTsKKyAgICAgICAgICAgICAgTU5HX0NPTVBPU0U4ICgqKHBTY2FubGluZSsxKSwgKihwRGF0YWxpbmUrMSksIGlBOCwgKihwU2NhbmxpbmUrMSkpOworICAgICAgICAgICAgICBNTkdfQ09NUE9TRTggKCoocFNjYW5saW5lKzIpLCAqKHBEYXRhbGluZSsyKSwgaUE4LCAqKHBTY2FubGluZSsyKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyAqIDMpOworICAgICAgICAgIHBEYXRhbGluZSArPSA0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgY2hlY2tfdXBkYXRlX3JlZ2lvbiAocERhdGEpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RJU1BMQVlfUkdCOCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZWxzZSAvKiBNTkdfT1BUSU1JWkVfRk9PVFBSSU5UX0NPTVBPU0UgKi8KK21uZ19yZXRjb2RlIG1uZ19kaXNwbGF5X3JnYjggKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX3VpbnQ4cCBwU2NhbmxpbmU7CisgIG1uZ191aW50OHAgcERhdGFsaW5lOworICBtbmdfaW50MzIgIGlYOworICBtbmdfdWludDE2IGlBMTY7CisgIG1uZ191aW50MTYgaUZHZzE2OworICBtbmdfdWludDE2IGlCR2cxNjsKKyAgbW5nX3VpbnQ4ICBpQTg7CisgIG1uZ191aW50OCAgaUJwczsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ESVNQTEFZX1JHQjgsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpQnBzPShtbmdfdWludDgpKHBEYXRhLT5iSXNSR0JBMTYgPyAyOjEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdmlld2FibGUgcm93ID8gKi8KKyAgaWYgKChwRGF0YS0+aVJvdyA+PSBwRGF0YS0+aVNvdXJjZXQpICYmIChwRGF0YS0+aVJvdyA8IHBEYXRhLT5pU291cmNlYikpCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGRyZXNzIGRlc3RpbmF0aW9uIHJvdyAqLworICAgIHBTY2FubGluZSA9IChtbmdfdWludDhwKXBEYXRhLT5mR2V0Y2FudmFzbGluZSAoKChtbmdfaGFuZGxlKXBEYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pUm93ICsgcERhdGEtPmlEZXN0dCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aVNvdXJjZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRqdXN0IGRlc3RpbmF0aW9uIHJvdyBzdGFydGluZy1wb2ludCAqLworICAgIHBTY2FubGluZSA9IHBTY2FubGluZSArIChwRGF0YS0+aUNvbCAqIDMpICsgKHBEYXRhLT5pRGVzdGwgKiAzKTsKKyAgICBwRGF0YWxpbmUgPSBwRGF0YS0+cFJHQkFyb3c7ICAgICAgIC8qIGFkZHJlc3Mgc291cmNlIHJvdyAqLworCisgICAgLyogYWRqdXN0IHNvdXJjZSByb3cgc3RhcnRpbmctcG9pbnQgKi8KKyAgICBwRGF0YWxpbmUgPSBwRGF0YWxpbmUgKyAoKHBEYXRhLT5pU291cmNlbCAvIHBEYXRhLT5pQ29saW5jKSA8PCAoaUJwcysxKSk7CisKKyAgICBpZiAocERhdGEtPmJJc09wYXF1ZSkgICAgICAgICAgICAgIC8qIGZvcmdldCBhYm91dCB0cmFuc3BhcmVuY3kgPyAqLworICAgIHsKKyAgICAgIHsKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pQ29sOyBpWCA8IHBEYXRhLT5pU291cmNlcjsKKyAgICAgICAgICAgICBpWCArPSBwRGF0YS0+aUNvbGluYykKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjYWxlIGRvd24gYnkgZHJvcHBpbmcgdGhlIExTQiAqLworICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKnBEYXRhbGluZTsKKyAgICAgICAgICAqKHBTY2FubGluZSsxKSA9ICoocERhdGFsaW5lK2lCcHMpOworICAgICAgICAgICoocFNjYW5saW5lKzIpID0gKihwRGF0YWxpbmUrMippQnBzKTsKKworICAgICAgICAgIHBTY2FubGluZSArPSAocERhdGEtPmlDb2xpbmMgKiAzKTsKKyAgICAgICAgICBwRGF0YWxpbmUgKz0gNCppQnBzOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBpZiAocERhdGEtPmJJc1JHQkExNikgICAgICAgICAgICAvKiAxNi1iaXQgaW5wdXQgcm93ID8gKi8KKyAgICAgIHsKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pQ29sOyBpWCA8IHBEYXRhLT5pU291cmNlcjsKKyAgICAgICAgICAgICBpWCArPSBwRGF0YS0+aUNvbGluYykKKyAgICAgICAgeworICAgICAgICAgIGlBMTYgPSBtbmdfZ2V0X3VpbnQxNiAocERhdGFsaW5lKzYpOworCisgICAgICAgICAgaWYgKGlBMTYpICAgICAgICAgICAgICAgICAgICAvKiBhbnkgb3BhY2l0eSBhdCBhbGwgPyAqLworICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpQTE2ID09IDB4RkZGRikgICAgICAgIC8qIGZ1bGx5IG9wYXF1ZSA/ICovCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzY2FsZSBkb3duIGJ5IGRyb3BwaW5nIHRoZSBMU0IgKi8KKyAgICAgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAqcERhdGFsaW5lOworICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9ICoocERhdGFsaW5lKzIpOworICAgICAgICAgICAgICAqKHBTY2FubGluZSsyKSA9ICoocERhdGFsaW5lKzQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0IHRoZSBwcm9wZXIgdmFsdWVzICovCisgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICBmb3IgKGk9MjsgaSA+PSAwOyBpLS0pCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpRkdnMTYgPSBtbmdfZ2V0X3VpbnQxNiAocERhdGFsaW5lK2kraSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjYWxlIGJhY2tncm91bmQgdXAgKi8KKyAgICAgICAgICAgICAgICBpQkdnMTYgPSAobW5nX3VpbnQxNikoKihwU2NhbmxpbmUraSkpOworICAgICAgICAgICAgICAgIGlCR2cxNiA9IChtbmdfdWludDE2KSgobW5nX3VpbnQzMilpQkdnMTYgPDwgOCkgfCBpQkdnMTY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdyBjb21wb3NlICovCisgICAgICAgICAgICAgICAgTU5HX0NPTVBPU0UxNihpRkdnMTYsIGlGR2cxNiwgaUExNiwgaUJHZzE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHJldHVybiB0aGUgY29tcG9zZWQgdmFsdWVzICovCisgICAgICAgICAgICAgICAgKihwU2NhbmxpbmUraSkgPSAobW5nX3VpbnQ4KShpRkdnMTYgPj4gOCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jICogMyk7CisgICAgICAgICAgcERhdGFsaW5lICs9IDg7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pQ29sOyBpWCA8IHBEYXRhLT5pU291cmNlcjsKKyAgICAgICAgICAgICBpWCArPSBwRGF0YS0+aUNvbGluYykKKyAgICAgICAgeworICAgICAgICAgIGlBOCA9ICoocERhdGFsaW5lKzMpOyAgICAgICAgLyogZ2V0IGFscGhhIHZhbHVlICovCisKKyAgICAgICAgICBpZiAoaUE4KSAgICAgICAgICAgICAgICAgICAgIC8qIGFueSBvcGFjaXR5IGF0IGFsbCA/ICovCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKGlBOCA9PSAweEZGKSAgICAgICAgICAgLyogZnVsbHkgb3BhcXVlID8gKi8KKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZW4gc2ltcGx5IGNvcHkgdGhlIHZhbHVlcyAqLworICAgICAgICAgICAgICAqcFNjYW5saW5lICAgICA9ICpwRGF0YWxpbmU7CisgICAgICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKihwRGF0YWxpbmUrMSk7CisgICAgICAgICAgICAgICoocFNjYW5saW5lKzIpID0gKihwRGF0YWxpbmUrMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkbyBhbHBoYSBjb21wb3NpbmcgKi8KKyAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgIGZvciAoaT0yOyBpID49IDA7IGktLSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICBNTkdfQ09NUE9TRTggKCoocFNjYW5saW5lK2kpLCAqKHBEYXRhbGluZStpKSwgaUE4LCAqKHBTY2FubGluZStpKSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jICogMyk7CisgICAgICAgICAgcERhdGFsaW5lICs9IDQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBjaGVja191cGRhdGVfcmVnaW9uIChwRGF0YSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRElTUExBWV9SR0I4LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZiAvKiBNTkdfT1BUSU1JWkVfRk9PVFBSSU5UX0NPTVBPU0UgKi8KKyNlbHNlIC8qIE1OR19OT18xNkJJVF9TVVBQT1JUICovCittbmdfcmV0Y29kZSBtbmdfZGlzcGxheV9yZ2I4IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ191aW50OHAgcFNjYW5saW5lOworICBtbmdfdWludDhwIHBEYXRhbGluZTsKKyAgbW5nX2ludDMyICBpWDsKKyAgbW5nX3VpbnQ4ICBpQTg7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRElTUExBWV9SR0I4LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2aWV3YWJsZSByb3cgPyAqLworICBpZiAoKHBEYXRhLT5pUm93ID49IHBEYXRhLT5pU291cmNldCkgJiYgKHBEYXRhLT5pUm93IDwgcERhdGEtPmlTb3VyY2ViKSkKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHJlc3MgZGVzdGluYXRpb24gcm93ICovCisgICAgcFNjYW5saW5lID0gKG1uZ191aW50OHApcERhdGEtPmZHZXRjYW52YXNsaW5lICgoKG1uZ19oYW5kbGUpcERhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlSb3cgKyBwRGF0YS0+aURlc3R0IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pU291cmNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGp1c3QgZGVzdGluYXRpb24gcm93IHN0YXJ0aW5nLXBvaW50ICovCisgICAgcFNjYW5saW5lID0gcFNjYW5saW5lICsgKHBEYXRhLT5pQ29sICogMykgKyAocERhdGEtPmlEZXN0bCAqIDMpOworICAgIHBEYXRhbGluZSA9IHBEYXRhLT5wUkdCQXJvdzsgICAgICAgLyogYWRkcmVzcyBzb3VyY2Ugcm93ICovCisKKyAgICAgIHBEYXRhbGluZSA9IHBEYXRhbGluZSArICgocERhdGEtPmlTb3VyY2VsIC8gcERhdGEtPmlDb2xpbmMpIDw8IDIpOworCisgICAgaWYgKHBEYXRhLT5iSXNPcGFxdWUpICAgICAgICAgICAgICAvKiBmb3JnZXQgYWJvdXQgdHJhbnNwYXJlbmN5ID8gKi8KKyAgICB7CisgICAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3B5IHRoZSB2YWx1ZXMgKi8KKyAgICAgICAgICAqcFNjYW5saW5lICAgICA9ICpwRGF0YWxpbmU7CisgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAqKHBEYXRhbGluZSsxKTsKKyAgICAgICAgICAqKHBTY2FubGluZSsyKSA9ICoocERhdGFsaW5lKzIpOworCisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyAqIDMpOworICAgICAgICAgIHBEYXRhbGluZSArPSA0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsKKyAgICAgICAgICBpQTggPSAqKHBEYXRhbGluZSszKTsgICAgICAgIC8qIGdldCBhbHBoYSB2YWx1ZSAqLworCisgICAgICAgICAgaWYgKGlBOCkgICAgICAgICAgICAgICAgICAgICAvKiBhbnkgb3BhY2l0eSBhdCBhbGwgPyAqLworICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpQTggPT0gMHhGRikgICAgICAgICAgIC8qIGZ1bGx5IG9wYXF1ZSA/ICovCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGVuIHNpbXBseSBjb3B5IHRoZSB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAqcERhdGFsaW5lOworICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9ICoocERhdGFsaW5lKzEpOworICAgICAgICAgICAgICAqKHBTY2FubGluZSsyKSA9ICoocERhdGFsaW5lKzIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZG8gYWxwaGEgY29tcG9zaW5nICovCisjaWZkZWYgTU5HX09QVElNSVpFX0ZPT1RQUklOVF9DT01QT1NFCisgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICBmb3IgKGk9MjsgaSA+PSAwOyBpLS0pCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgTU5HX0NPTVBPU0U4ICgqKHBTY2FubGluZStpKSwgKihwRGF0YWxpbmUraSksIGlBOCwgKihwU2NhbmxpbmUraSkpOworICAgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgICBNTkdfQ09NUE9TRTggKCpwU2NhbmxpbmUsICAgICAqcERhdGFsaW5lLCAgICAgaUE4LCAqcFNjYW5saW5lICAgICk7CisgICAgICAgICAgICAgIE1OR19DT01QT1NFOCAoKihwU2NhbmxpbmUrMSksICoocERhdGFsaW5lKzEpLCBpQTgsICoocFNjYW5saW5lKzEpKTsKKyAgICAgICAgICAgICAgTU5HX0NPTVBPU0U4ICgqKHBTY2FubGluZSsyKSwgKihwRGF0YWxpbmUrMiksIGlBOCwgKihwU2NhbmxpbmUrMikpOworI2VuZGlmCisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyAqIDMpOworICAgICAgICAgIHBEYXRhbGluZSArPSA0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgY2hlY2tfdXBkYXRlX3JlZ2lvbiAocERhdGEpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RJU1BMQVlfUkdCOCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYgLyogTU5HX05PXzE2QklUX1NVUFBPUlQgKi8KKyNlbmRpZiAvKiBNTkdfU0tJUENBTlZBU19SR0I4ICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDQU5WQVNfUkdCQTgKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyNpZm5kZWYgTU5HX09QVElNSVpFX0ZPT1RQUklOVF9DT01QT1NFCittbmdfcmV0Y29kZSBtbmdfZGlzcGxheV9yZ2JhOCAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfdWludDhwIHBTY2FubGluZTsKKyAgbW5nX3VpbnQ4cCBwRGF0YWxpbmU7CisgIG1uZ19pbnQzMiAgaVg7CisgIG1uZ191aW50OCAgaUZHYTgsIGlCR2E4LCBpQ2E4OworICBtbmdfdWludDE2IGlGR2ExNiwgaUJHYTE2LCBpQ2ExNjsKKyAgbW5nX3VpbnQxNiBpRkdyMTYsIGlGR2cxNiwgaUZHYjE2OworICBtbmdfdWludDE2IGlCR3IxNiwgaUJHZzE2LCBpQkdiMTY7CisgIG1uZ191aW50MTYgaUNyMTYsIGlDZzE2LCBpQ2IxNjsKKyAgbW5nX3VpbnQ4ICBpQ3I4LCBpQ2c4LCBpQ2I4OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RJU1BMQVlfUkdCQTgsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZpZXdhYmxlIHJvdyA/ICovCisgIGlmICgocERhdGEtPmlSb3cgPj0gcERhdGEtPmlTb3VyY2V0KSAmJiAocERhdGEtPmlSb3cgPCBwRGF0YS0+aVNvdXJjZWIpKQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkcmVzcyBkZXN0aW5hdGlvbiByb3cgKi8KKyAgICBwU2NhbmxpbmUgPSAobW5nX3VpbnQ4cClwRGF0YS0+ZkdldGNhbnZhc2xpbmUgKCgobW5nX2hhbmRsZSlwRGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aVJvdyArIHBEYXRhLT5pRGVzdHQgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlTb3VyY2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkanVzdCBkZXN0aW5hdGlvbiByb3cgc3RhcnRpbmctcG9pbnQgKi8KKyAgICBwU2NhbmxpbmUgPSBwU2NhbmxpbmUgKyAocERhdGEtPmlDb2wgPDwgMikgKyAocERhdGEtPmlEZXN0bCA8PCAyKTsKKyAgICBwRGF0YWxpbmUgPSBwRGF0YS0+cFJHQkFyb3c7ICAgICAgIC8qIGFkZHJlc3Mgc291cmNlIHJvdyAqLworCisgICAgaWYgKHBEYXRhLT5iSXNSR0JBMTYpICAgICAgICAgICAgICAvKiBhZGp1c3Qgc291cmNlIHJvdyBzdGFydGluZy1wb2ludCAqLworICAgICAgcERhdGFsaW5lID0gcERhdGFsaW5lICsgKChwRGF0YS0+aVNvdXJjZWwgLyBwRGF0YS0+aUNvbGluYykgPDwgMyk7CisgICAgZWxzZQorICAgICAgcERhdGFsaW5lID0gcERhdGFsaW5lICsgKChwRGF0YS0+aVNvdXJjZWwgLyBwRGF0YS0+aUNvbGluYykgPDwgMik7CisKKyAgICBpZiAocERhdGEtPmJJc09wYXF1ZSkgICAgICAgICAgICAgIC8qIGZvcmdldCBhYm91dCB0cmFuc3BhcmVuY3kgPyAqLworICAgIHsKKyAgICAgIGlmIChwRGF0YS0+YklzUkdCQTE2KSAgICAgICAgICAgIC8qIDE2LWJpdCBpbnB1dCByb3cgPyAqLworICAgICAgeworICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlTb3VyY2VsICsgcERhdGEtPmlDb2w7IGlYIDwgcERhdGEtPmlTb3VyY2VyOworICAgICAgICAgICAgIGlYICs9IHBEYXRhLT5pQ29saW5jKQorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbGUgZG93biBieSBkcm9wcGluZyB0aGUgTFNCICovCisgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAqcERhdGFsaW5lOworICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKihwRGF0YWxpbmUrMik7CisgICAgICAgICAgKihwU2NhbmxpbmUrMikgPSAqKHBEYXRhbGluZSs0KTsKKyAgICAgICAgICAqKHBTY2FubGluZSszKSA9ICoocERhdGFsaW5lKzYpOworCisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyA8PCAyKTsKKyAgICAgICAgICBwRGF0YWxpbmUgKz0gODsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlTb3VyY2VsICsgcERhdGEtPmlDb2w7IGlYIDwgcERhdGEtPmlTb3VyY2VyOworICAgICAgICAgICAgIGlYICs9IHBEYXRhLT5pQ29saW5jKQorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29weSB0aGUgdmFsdWVzICovCisgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAqcERhdGFsaW5lOworICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKihwRGF0YWxpbmUrMSk7CisgICAgICAgICAgKihwU2NhbmxpbmUrMikgPSAqKHBEYXRhbGluZSsyKTsKKyAgICAgICAgICAqKHBTY2FubGluZSszKSA9ICoocERhdGFsaW5lKzMpOworCisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyA8PCAyKTsKKyAgICAgICAgICBwRGF0YWxpbmUgKz0gNDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaWYgKHBEYXRhLT5iSXNSR0JBMTYpICAgICAgICAgICAgLyogMTYtYml0IGlucHV0IHJvdyA/ICovCisgICAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgYWxwaGEgdmFsdWVzICovCisgICAgICAgICAgaUZHYTE2ID0gbW5nX2dldF91aW50MTYgKHBEYXRhbGluZSs2KTsKKyAgICAgICAgICBpQkdhMTYgPSAobW5nX3VpbnQxNikoKihwU2NhbmxpbmUrMykpOworICAgICAgICAgIGlCR2ExNiA9IChtbmdfdWludDE2KShpQkdhMTYgPDwgOCkgfCBpQkdhMTY7CisKKyAgICAgICAgICBpZiAoaUZHYTE2KSAgICAgICAgICAgICAgICAgIC8qIGFueSBvcGFjaXR5IGF0IGFsbCA/ICovCisgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmdWxseSBvcGFxdWUgb3IgYmFja2dyb3VuZCBmdWxseSB0cmFuc3BhcmVudCA/ICovCisgICAgICAgICAgICBpZiAoKGlGR2ExNiA9PSAweEZGRkYpIHx8IChpQkdhMTYgPT0gMCkpCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwbGFpbiBjb3B5IGl0ICovCisgICAgICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKnBEYXRhbGluZTsKKyAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAqKHBEYXRhbGluZSsyKTsKKyAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMikgPSAqKHBEYXRhbGluZSs0KTsKKyAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMykgPSAqKHBEYXRhbGluZSs2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKGlCR2ExNiA9PSAweEZGRkYpICAgIC8qIGJhY2tncm91bmQgZnVsbHkgb3BhcXVlID8gKi8KKyAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCB0aGUgcHJvcGVyIHZhbHVlcyAqLworICAgICAgICAgICAgICAgIGlGR3IxNiA9IG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUgICk7CisgICAgICAgICAgICAgICAgaUZHZzE2ID0gbW5nX2dldF91aW50MTYgKHBEYXRhbGluZSsyKTsKKyAgICAgICAgICAgICAgICBpRkdiMTYgPSBtbmdfZ2V0X3VpbnQxNiAocERhdGFsaW5lKzQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbGUgYmFja2dyb3VuZCB1cCAqLworICAgICAgICAgICAgICAgIGlCR3IxNiA9IChtbmdfdWludDE2KSgqcFNjYW5saW5lICAgICk7CisgICAgICAgICAgICAgICAgaUJHZzE2ID0gKG1uZ191aW50MTYpKCoocFNjYW5saW5lKzEpKTsKKyAgICAgICAgICAgICAgICBpQkdiMTYgPSAobW5nX3VpbnQxNikoKihwU2NhbmxpbmUrMikpOworICAgICAgICAgICAgICAgIGlCR3IxNiA9IChtbmdfdWludDE2KSgobW5nX3VpbnQzMilpQkdyMTYgPDwgOCkgfCBpQkdyMTY7CisgICAgICAgICAgICAgICAgaUJHZzE2ID0gKG1uZ191aW50MTYpKChtbmdfdWludDMyKWlCR2cxNiA8PCA4KSB8IGlCR2cxNjsKKyAgICAgICAgICAgICAgICBpQkdiMTYgPSAobW5nX3VpbnQxNikoKG1uZ191aW50MzIpaUJHYjE2IDw8IDgpIHwgaUJHYjE2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm93IGNvbXBvc2UgKi8KKyAgICAgICAgICAgICAgICBNTkdfQ09NUE9TRTE2KGlGR3IxNiwgaUZHcjE2LCBpRkdhMTYsIGlCR3IxNik7CisgICAgICAgICAgICAgICAgTU5HX0NPTVBPU0UxNihpRkdnMTYsIGlGR2cxNiwgaUZHYTE2LCBpQkdnMTYpOworICAgICAgICAgICAgICAgIE1OR19DT01QT1NFMTYoaUZHYjE2LCBpRkdiMTYsIGlGR2ExNiwgaUJHYjE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCByZXR1cm4gdGhlIGNvbXBvc2VkIHZhbHVlcyAqLworICAgICAgICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKG1uZ191aW50OCkoaUZHcjE2ID4+IDgpOworICAgICAgICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKG1uZ191aW50OCkoaUZHZzE2ID4+IDgpOworICAgICAgICAgICAgICAgICoocFNjYW5saW5lKzIpID0gKG1uZ191aW50OCkoaUZHYjE2ID4+IDgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWxwaGEgcmVtYWlucyBmdWxseSBvcGFxdWUgISEhICovCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbGUgYmFja2dyb3VuZCB1cCAqLworICAgICAgICAgICAgICAgIGlCR3IxNiA9IChtbmdfdWludDE2KSgqcFNjYW5saW5lICAgICk7CisgICAgICAgICAgICAgICAgaUJHZzE2ID0gKG1uZ191aW50MTYpKCoocFNjYW5saW5lKzEpKTsKKyAgICAgICAgICAgICAgICBpQkdiMTYgPSAobW5nX3VpbnQxNikoKihwU2NhbmxpbmUrMikpOworICAgICAgICAgICAgICAgIGlCR3IxNiA9IChtbmdfdWludDE2KSgobW5nX3VpbnQzMilpQkdyMTYgPDwgOCkgfCBpQkdyMTY7CisgICAgICAgICAgICAgICAgaUJHZzE2ID0gKG1uZ191aW50MTYpKChtbmdfdWludDMyKWlCR2cxNiA8PCA4KSB8IGlCR2cxNjsKKyAgICAgICAgICAgICAgICBpQkdiMTYgPSAobW5nX3VpbnQxNikoKG1uZ191aW50MzIpaUJHYjE2IDw8IDgpIHwgaUJHYjE2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGV0J3MgYmxlbmQgKi8KKyAgICAgICAgICAgICAgICBNTkdfQkxFTkQxNiAobW5nX2dldF91aW50MTYgKHBEYXRhbGluZSAgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2dldF91aW50MTYgKHBEYXRhbGluZSsyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2dldF91aW50MTYgKHBEYXRhbGluZSs0KSwgaUZHYTE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpQkdyMTYsIGlCR2cxNiwgaUJHYjE2LCBpQkdhMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlDcjE2LCAgaUNnMTYsICBpQ2IxNiwgIGlDYTE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCByZXR1cm4gdGhlIGNvbXBvc2VkIHZhbHVlcyAqLworICAgICAgICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKG1uZ191aW50OCkoaUNyMTYgPj4gOCk7CisgICAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAobW5nX3VpbnQ4KShpQ2cxNiA+PiA4KTsKKyAgICAgICAgICAgICAgICAqKHBTY2FubGluZSsyKSA9IChtbmdfdWludDgpKGlDYjE2ID4+IDgpOworICAgICAgICAgICAgICAgICoocFNjYW5saW5lKzMpID0gKG1uZ191aW50OCkoaUNhMTYgPj4gOCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jIDw8IDIpOworICAgICAgICAgIHBEYXRhbGluZSArPSA4OworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsKKyAgICAgICAgICBpRkdhOCA9ICoocERhdGFsaW5lKzMpOyAgICAgIC8qIGdldCBhbHBoYSB2YWx1ZXMgKi8KKyAgICAgICAgICBpQkdhOCA9ICoocFNjYW5saW5lKzMpOworCisgICAgICAgICAgaWYgKGlGR2E4KSAgICAgICAgICAgICAgICAgICAvKiBhbnkgb3BhY2l0eSBhdCBhbGwgPyAqLworICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZnVsbHkgb3BhcXVlIG9yIGJhY2tncm91bmQgZnVsbHkgdHJhbnNwYXJlbnQgPyAqLworICAgICAgICAgICAgaWYgKChpRkdhOCA9PSAweEZGKSB8fCAoaUJHYTggPT0gMCkpCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGVuIHNpbXBseSBjb3B5IHRoZSB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAqcERhdGFsaW5lOworICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9ICoocERhdGFsaW5lKzEpOworICAgICAgICAgICAgICAqKHBTY2FubGluZSsyKSA9ICoocERhdGFsaW5lKzIpOworICAgICAgICAgICAgICAqKHBTY2FubGluZSszKSA9ICoocERhdGFsaW5lKzMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoaUJHYTggPT0gMHhGRikgICAgICAgLyogYmFja2dyb3VuZCBmdWxseSBvcGFxdWUgPyAqLworICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogZG8gYWxwaGEgY29tcG9zaW5nICovCisgICAgICAgICAgICAgICAgTU5HX0NPTVBPU0U4ICgqcFNjYW5saW5lLCAgICAgKnBEYXRhbGluZSwgICAgIGlGR2E4LCAqcFNjYW5saW5lICAgICk7CisgICAgICAgICAgICAgICAgTU5HX0NPTVBPU0U4ICgqKHBTY2FubGluZSsxKSwgKihwRGF0YWxpbmUrMSksIGlGR2E4LCAqKHBTY2FubGluZSsxKSk7CisgICAgICAgICAgICAgICAgTU5HX0NPTVBPU0U4ICgqKHBTY2FubGluZSsyKSwgKihwRGF0YWxpbmUrMiksIGlGR2E4LCAqKHBTY2FubGluZSsyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbHBoYSByZW1haW5zIGZ1bGx5IG9wYXF1ZSAhISEgKi8KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3cgYmxlbmQgKi8KKyAgICAgICAgICAgICAgICBNTkdfQkxFTkQ4ICgqcERhdGFsaW5lLCAqKHBEYXRhbGluZSsxKSwgKihwRGF0YWxpbmUrMiksIGlGR2E4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwU2NhbmxpbmUsICoocFNjYW5saW5lKzEpLCAqKHBTY2FubGluZSsyKSwgaUJHYTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUNyOCwgaUNnOCwgaUNiOCwgaUNhOCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgcmV0dXJuIHRoZSBjb21wb3NlZCB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgICAqcFNjYW5saW5lICAgICA9IGlDcjg7CisgICAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSBpQ2c4OworICAgICAgICAgICAgICAgICoocFNjYW5saW5lKzIpID0gaUNiODsKKyAgICAgICAgICAgICAgICAqKHBTY2FubGluZSszKSA9IGlDYTg7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jIDw8IDIpOworICAgICAgICAgIHBEYXRhbGluZSArPSA0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgY2hlY2tfdXBkYXRlX3JlZ2lvbiAocERhdGEpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RJU1BMQVlfUkdCQTgsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2Vsc2UgLyogTU5HX09QVElNSVpFX0ZPT1RQUklOVF9DT01QT1NFICovCittbmdfcmV0Y29kZSBtbmdfZGlzcGxheV9yZ2JhOCAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfdWludDhwIHBTY2FubGluZTsKKyAgbW5nX3VpbnQ4cCBwRGF0YWxpbmU7CisgIG1uZ19pbnQzMiAgaVg7CisgIG1uZ191aW50OCAgaUZHYTgsIGlCR2E4LCBpQ2E4OworICBtbmdfdWludDE2IGlGR2ExNiwgaUJHYTE2LCBpQ2ExNjsKKyAgbW5nX3VpbnQxNiBpRkdnMTY7CisgIG1uZ191aW50MTYgaUJHcjE2LCBpQkdnMTYsIGlCR2IxNjsKKyAgbW5nX3VpbnQxNiBpQ3IxNiwgaUNnMTYsIGlDYjE2OworICBtbmdfdWludDggIGlDcjgsIGlDZzgsIGlDYjg7CisgIG1uZ191aW50OCAgaUJwczsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ESVNQTEFZX1JHQkE4LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaUJwcz0obW5nX3VpbnQ4KShwRGF0YS0+YklzUkdCQTE2ID8gMjoxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZpZXdhYmxlIHJvdyA/ICovCisgIGlmICgocERhdGEtPmlSb3cgPj0gcERhdGEtPmlTb3VyY2V0KSAmJiAocERhdGEtPmlSb3cgPCBwRGF0YS0+aVNvdXJjZWIpKQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkcmVzcyBkZXN0aW5hdGlvbiByb3cgKi8KKyAgICBwU2NhbmxpbmUgPSAobW5nX3VpbnQ4cClwRGF0YS0+ZkdldGNhbnZhc2xpbmUgKCgobW5nX2hhbmRsZSlwRGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aVJvdyArIHBEYXRhLT5pRGVzdHQgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlTb3VyY2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkanVzdCBkZXN0aW5hdGlvbiByb3cgc3RhcnRpbmctcG9pbnQgKi8KKyAgICBwU2NhbmxpbmUgPSBwU2NhbmxpbmUgKyAocERhdGEtPmlDb2wgPDwgMikgKyAocERhdGEtPmlEZXN0bCA8PCAyKTsKKyAgICBwRGF0YWxpbmUgPSBwRGF0YS0+cFJHQkFyb3c7ICAgICAgIC8qIGFkZHJlc3Mgc291cmNlIHJvdyAqLworCisgICAgLyogYWRqdXN0IHNvdXJjZSByb3cgc3RhcnRpbmctcG9pbnQgKi8KKyAgICBwRGF0YWxpbmUgPSBwRGF0YWxpbmUgKyAoKHBEYXRhLT5pU291cmNlbCAvIHBEYXRhLT5pQ29saW5jKSA8PCAoaUJwcysxKSk7CisKKyAgICBpZiAocERhdGEtPmJJc09wYXF1ZSkgICAgICAgICAgICAgIC8qIGZvcmdldCBhYm91dCB0cmFuc3BhcmVuY3kgPyAqLworICAgIHsKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pQ29sOyBpWCA8IHBEYXRhLT5pU291cmNlcjsKKyAgICAgICAgICAgICBpWCArPSBwRGF0YS0+aUNvbGluYykKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjYWxlIGRvd24gYnkgZHJvcHBpbmcgdGhlIExTQiAqLworICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKnBEYXRhbGluZTsKKyAgICAgICAgICAqKHBTY2FubGluZSsxKSA9ICoocERhdGFsaW5lK2lCcHMpOworICAgICAgICAgICoocFNjYW5saW5lKzIpID0gKihwRGF0YWxpbmUrMippQnBzKTsKKyAgICAgICAgICAqKHBTY2FubGluZSszKSA9ICoocERhdGFsaW5lKzMqaUJwcyk7CisKKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jIDw8IDIpOworICAgICAgICAgIHBEYXRhbGluZSArPSA0KmlCcHM7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGlmIChwRGF0YS0+YklzUkdCQTE2KSAgICAgICAgICAgIC8qIDE2LWJpdCBpbnB1dCByb3cgPyAqLworICAgICAgeworICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlTb3VyY2VsICsgcERhdGEtPmlDb2w7IGlYIDwgcERhdGEtPmlTb3VyY2VyOworICAgICAgICAgICAgIGlYICs9IHBEYXRhLT5pQ29saW5jKQorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0IGFscGhhIHZhbHVlcyAqLworICAgICAgICAgIGlGR2ExNiA9IG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUrNik7CisgICAgICAgICAgaUJHYTE2ID0gKG1uZ191aW50MTYpKCoocFNjYW5saW5lKzMpKTsKKyAgICAgICAgICBpQkdhMTYgPSAobW5nX3VpbnQxNikoaUJHYTE2IDw8IDgpIHwgaUJHYTE2OworCisgICAgICAgICAgaWYgKGlGR2ExNikgICAgICAgICAgICAgICAgICAvKiBhbnkgb3BhY2l0eSBhdCBhbGwgPyAqLworICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZnVsbHkgb3BhcXVlIG9yIGJhY2tncm91bmQgZnVsbHkgdHJhbnNwYXJlbnQgPyAqLworICAgICAgICAgICAgaWYgKChpRkdhMTYgPT0gMHhGRkZGKSB8fCAoaUJHYTE2ID09IDApKQorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGxhaW4gY29weSBpdCAqLworICAgICAgICAgICAgICAqcFNjYW5saW5lICAgICA9ICpwRGF0YWxpbmU7CisgICAgICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKihwRGF0YWxpbmUrMik7CisgICAgICAgICAgICAgICoocFNjYW5saW5lKzIpID0gKihwRGF0YWxpbmUrNCk7CisgICAgICAgICAgICAgICoocFNjYW5saW5lKzMpID0gKihwRGF0YWxpbmUrNik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChpQkdhMTYgPT0gMHhGRkZGKSAgICAvKiBiYWNrZ3JvdW5kIGZ1bGx5IG9wYXF1ZSA/ICovCisgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgdGhlIHByb3BlciB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgIGZvciAoaT0yOyBpID49IDA7IGktLSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlGR2cxNiA9IG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUraStpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjYWxlIGJhY2tncm91bmQgdXAgKi8KKyAgICAgICAgICAgICAgICBpQkdnMTYgPSAobW5nX3VpbnQxNikoKihwU2NhbmxpbmUraSkpOworICAgICAgICAgICAgICAgIGlCR2cxNiA9IChtbmdfdWludDE2KSgobW5nX3VpbnQzMilpQkdnMTYgPDwgOCkgfCBpQkdnMTY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3cgY29tcG9zZSAqLworICAgICAgICAgICAgICAgIE1OR19DT01QT1NFMTYoaUZHZzE2LCBpRkdnMTYsIGlGR2ExNiwgaUJHZzE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCByZXR1cm4gdGhlIGNvbXBvc2VkIHZhbHVlcyAqLworICAgICAgICAgICAgICAgICoocFNjYW5saW5lK2kpID0gKG1uZ191aW50OCkoaUZHZzE2ID4+IDgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWxwaGEgcmVtYWlucyBmdWxseSBvcGFxdWUgISEhICovCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBzY2FsZSBiYWNrZ3JvdW5kIHVwICovCisgICAgICAgICAgICAgICAgaUJHcjE2ID0gKG1uZ191aW50MTYpKCpwU2NhbmxpbmUgICAgKTsKKyAgICAgICAgICAgICAgICBpQkdnMTYgPSAobW5nX3VpbnQxNikoKihwU2NhbmxpbmUrMSkpOworICAgICAgICAgICAgICAgIGlCR2IxNiA9IChtbmdfdWludDE2KSgqKHBTY2FubGluZSsyKSk7CisgICAgICAgICAgICAgICAgaUJHcjE2ID0gKG1uZ191aW50MTYpKChtbmdfdWludDMyKWlCR3IxNiA8PCA4KSB8IGlCR3IxNjsKKyAgICAgICAgICAgICAgICBpQkdnMTYgPSAobW5nX3VpbnQxNikoKG1uZ191aW50MzIpaUJHZzE2IDw8IDgpIHwgaUJHZzE2OworICAgICAgICAgICAgICAgIGlCR2IxNiA9IChtbmdfdWludDE2KSgobW5nX3VpbnQzMilpQkdiMTYgPDwgOCkgfCBpQkdiMTY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZXQncyBibGVuZCAqLworICAgICAgICAgICAgICAgIE1OR19CTEVORDE2IChtbmdfZ2V0X3VpbnQxNiAocERhdGFsaW5lICApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfZ2V0X3VpbnQxNiAocERhdGFsaW5lKzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfZ2V0X3VpbnQxNiAocERhdGFsaW5lKzQpLCBpRkdhMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlCR3IxNiwgaUJHZzE2LCBpQkdiMTYsIGlCR2ExNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUNyMTYsICBpQ2cxNiwgIGlDYjE2LCAgaUNhMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHJldHVybiB0aGUgY29tcG9zZWQgdmFsdWVzICovCisgICAgICAgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAobW5nX3VpbnQ4KShpQ3IxNiA+PiA4KTsKKyAgICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9IChtbmdfdWludDgpKGlDZzE2ID4+IDgpOworICAgICAgICAgICAgICAgICoocFNjYW5saW5lKzIpID0gKG1uZ191aW50OCkoaUNiMTYgPj4gOCk7CisgICAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMykgPSAobW5nX3VpbnQ4KShpQ2ExNiA+PiA4KTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIHBTY2FubGluZSArPSAocERhdGEtPmlDb2xpbmMgPDwgMik7CisgICAgICAgICAgcERhdGFsaW5lICs9IDg7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pQ29sOyBpWCA8IHBEYXRhLT5pU291cmNlcjsKKyAgICAgICAgICAgICBpWCArPSBwRGF0YS0+aUNvbGluYykKKyAgICAgICAgeworICAgICAgICAgIGlGR2E4ID0gKihwRGF0YWxpbmUrMyk7ICAgICAgLyogZ2V0IGFscGhhIHZhbHVlcyAqLworICAgICAgICAgIGlCR2E4ID0gKihwU2NhbmxpbmUrMyk7CisKKyAgICAgICAgICBpZiAoaUZHYTgpICAgICAgICAgICAgICAgICAgIC8qIGFueSBvcGFjaXR5IGF0IGFsbCA/ICovCisgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmdWxseSBvcGFxdWUgb3IgYmFja2dyb3VuZCBmdWxseSB0cmFuc3BhcmVudCA/ICovCisgICAgICAgICAgICBpZiAoKGlGR2E4ID09IDB4RkYpIHx8IChpQkdhOCA9PSAwKSkKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZW4gc2ltcGx5IGNvcHkgdGhlIHZhbHVlcyAqLworICAgICAgICAgICAgICAqcFNjYW5saW5lICAgICA9ICpwRGF0YWxpbmU7CisgICAgICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKihwRGF0YWxpbmUrMSk7CisgICAgICAgICAgICAgICoocFNjYW5saW5lKzIpID0gKihwRGF0YWxpbmUrMik7CisgICAgICAgICAgICAgICoocFNjYW5saW5lKzMpID0gKihwRGF0YWxpbmUrMyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChpQkdhOCA9PSAweEZGKSAgICAgICAvKiBiYWNrZ3JvdW5kIGZ1bGx5IG9wYXF1ZSA/ICovCisgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBkbyBhbHBoYSBjb21wb3NpbmcgKi8KKyAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgIGZvciAoaT0yOyBpID49IDA7IGktLSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICBNTkdfQ09NUE9TRTggKCoocFNjYW5saW5lK2kpLCAqKHBEYXRhbGluZStpKSwgaUZHYTgsICoocFNjYW5saW5lK2kpKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWxwaGEgcmVtYWlucyBmdWxseSBvcGFxdWUgISEhICovCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogbm93IGJsZW5kICovCisgICAgICAgICAgICAgICAgTU5HX0JMRU5EOCAoKnBEYXRhbGluZSwgKihwRGF0YWxpbmUrMSksICoocERhdGFsaW5lKzIpLCBpRkdhOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcFNjYW5saW5lLCAqKHBTY2FubGluZSsxKSwgKihwU2NhbmxpbmUrMiksIGlCR2E4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlDcjgsIGlDZzgsIGlDYjgsIGlDYTgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHJldHVybiB0aGUgY29tcG9zZWQgdmFsdWVzICovCisgICAgICAgICAgICAgICAgKnBTY2FubGluZSAgICAgPSBpQ3I4OworICAgICAgICAgICAgICAgICoocFNjYW5saW5lKzEpID0gaUNnODsKKyAgICAgICAgICAgICAgICAqKHBTY2FubGluZSsyKSA9IGlDYjg7CisgICAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMykgPSBpQ2E4OworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyA8PCAyKTsKKyAgICAgICAgICBwRGF0YWxpbmUgKz0gNDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIGNoZWNrX3VwZGF0ZV9yZWdpb24gKHBEYXRhKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ESVNQTEFZX1JHQkE4LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZiAvKiBNTkdfT1BUSU1JWkVfRk9PVFBSSU5UX0NPTVBPU0UgKi8KKyNlbHNlIC8qIE1OR19OT18xNkJJVF9TVVBQT1JUICovCittbmdfcmV0Y29kZSBtbmdfZGlzcGxheV9yZ2JhOCAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfdWludDhwIHBTY2FubGluZTsKKyAgbW5nX3VpbnQ4cCBwRGF0YWxpbmU7CisgIG1uZ19pbnQzMiAgaVg7CisgIG1uZ191aW50OCAgaUZHYTgsIGlCR2E4LCBpQ2E4OworICBtbmdfdWludDggIGlDcjgsIGlDZzgsIGlDYjg7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRElTUExBWV9SR0JBOCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdmlld2FibGUgcm93ID8gKi8KKyAgaWYgKChwRGF0YS0+aVJvdyA+PSBwRGF0YS0+aVNvdXJjZXQpICYmIChwRGF0YS0+aVJvdyA8IHBEYXRhLT5pU291cmNlYikpCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGRyZXNzIGRlc3RpbmF0aW9uIHJvdyAqLworICAgIHBTY2FubGluZSA9IChtbmdfdWludDhwKXBEYXRhLT5mR2V0Y2FudmFzbGluZSAoKChtbmdfaGFuZGxlKXBEYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pUm93ICsgcERhdGEtPmlEZXN0dCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aVNvdXJjZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRqdXN0IGRlc3RpbmF0aW9uIHJvdyBzdGFydGluZy1wb2ludCAqLworICAgIHBTY2FubGluZSA9IHBTY2FubGluZSArIChwRGF0YS0+aUNvbCA8PCAyKSArIChwRGF0YS0+aURlc3RsIDw8IDIpOworICAgIHBEYXRhbGluZSA9IHBEYXRhLT5wUkdCQXJvdzsgICAgICAgLyogYWRkcmVzcyBzb3VyY2Ugcm93ICovCisKKyAgICAgIHBEYXRhbGluZSA9IHBEYXRhbGluZSArICgocERhdGEtPmlTb3VyY2VsIC8gcERhdGEtPmlDb2xpbmMpIDw8IDIpOworCisgICAgaWYgKHBEYXRhLT5iSXNPcGFxdWUpICAgICAgICAgICAgICAvKiBmb3JnZXQgYWJvdXQgdHJhbnNwYXJlbmN5ID8gKi8KKyAgICB7CisgICAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3B5IHRoZSB2YWx1ZXMgKi8KKyAgICAgICAgICAqcFNjYW5saW5lICAgICA9ICpwRGF0YWxpbmU7CisgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAqKHBEYXRhbGluZSsxKTsKKyAgICAgICAgICAqKHBTY2FubGluZSsyKSA9ICoocERhdGFsaW5lKzIpOworICAgICAgICAgICoocFNjYW5saW5lKzMpID0gKihwRGF0YWxpbmUrMyk7CisKKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jIDw8IDIpOworICAgICAgICAgIHBEYXRhbGluZSArPSA0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsKKyAgICAgICAgICBpRkdhOCA9ICoocERhdGFsaW5lKzMpOyAgICAgIC8qIGdldCBhbHBoYSB2YWx1ZXMgKi8KKyAgICAgICAgICBpQkdhOCA9ICoocFNjYW5saW5lKzMpOworCisgICAgICAgICAgaWYgKGlGR2E4KSAgICAgICAgICAgICAgICAgICAvKiBhbnkgb3BhY2l0eSBhdCBhbGwgPyAqLworICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZnVsbHkgb3BhcXVlIG9yIGJhY2tncm91bmQgZnVsbHkgdHJhbnNwYXJlbnQgPyAqLworICAgICAgICAgICAgaWYgKChpRkdhOCA9PSAweEZGKSB8fCAoaUJHYTggPT0gMCkpCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGVuIHNpbXBseSBjb3B5IHRoZSB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAqcERhdGFsaW5lOworICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9ICoocERhdGFsaW5lKzEpOworICAgICAgICAgICAgICAqKHBTY2FubGluZSsyKSA9ICoocERhdGFsaW5lKzIpOworICAgICAgICAgICAgICAqKHBTY2FubGluZSszKSA9ICoocERhdGFsaW5lKzMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoaUJHYTggPT0gMHhGRikgICAgICAgLyogYmFja2dyb3VuZCBmdWxseSBvcGFxdWUgPyAqLworICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogZG8gYWxwaGEgY29tcG9zaW5nICovCisjaWZkZWYgTU5HX09QVElNSVpFX0ZPT1RQUklOVF9DT01QT1NFCisgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICBmb3IgKGk9MjsgaSA+PSAwOyBpLS0pCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgTU5HX0NPTVBPU0U4ICgqKHBTY2FubGluZStpKSwgKihwRGF0YWxpbmUraSksIGlGR2E4LCAqKHBTY2FubGluZStpKSk7CisgICAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICAgICAgTU5HX0NPTVBPU0U4ICgqcFNjYW5saW5lLCAgICAgKnBEYXRhbGluZSwgICAgIGlGR2E4LCAqcFNjYW5saW5lICAgICk7CisgICAgICAgICAgICAgICAgTU5HX0NPTVBPU0U4ICgqKHBTY2FubGluZSsxKSwgKihwRGF0YWxpbmUrMSksIGlGR2E4LCAqKHBTY2FubGluZSsxKSk7CisgICAgICAgICAgICAgICAgTU5HX0NPTVBPU0U4ICgqKHBTY2FubGluZSsyKSwgKihwRGF0YWxpbmUrMiksIGlGR2E4LCAqKHBTY2FubGluZSsyKSk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFscGhhIHJlbWFpbnMgZnVsbHkgb3BhcXVlICEhISAqLworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdyBibGVuZCAqLworICAgICAgICAgICAgICAgIE1OR19CTEVORDggKCpwRGF0YWxpbmUsICoocERhdGFsaW5lKzEpLCAqKHBEYXRhbGluZSsyKSwgaUZHYTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBTY2FubGluZSwgKihwU2NhbmxpbmUrMSksICoocFNjYW5saW5lKzIpLCBpQkdhOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpQ3I4LCBpQ2c4LCBpQ2I4LCBpQ2E4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCByZXR1cm4gdGhlIGNvbXBvc2VkIHZhbHVlcyAqLworICAgICAgICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gaUNyODsKKyAgICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9IGlDZzg7CisgICAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMikgPSBpQ2I4OworICAgICAgICAgICAgICAgICoocFNjYW5saW5lKzMpID0gaUNhODsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIHBTY2FubGluZSArPSAocERhdGEtPmlDb2xpbmMgPDwgMik7CisgICAgICAgICAgcERhdGFsaW5lICs9IDQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBjaGVja191cGRhdGVfcmVnaW9uIChwRGF0YSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRElTUExBWV9SR0JBOCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYgLyogTU5HX05PXzE2QklUX1NVUFBPUlQgKi8KKyNlbmRpZiAvKiBNTkdfU0tJUENBTlZBU19SR0JBOCAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0FOVkFTX1JHQkE4X1BNCisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisjaWZuZGVmIE1OR19PUFRJTUlaRV9GT09UUFJJTlRfQ09NUE9TRQorbW5nX3JldGNvZGUgbW5nX2Rpc3BsYXlfcmdiYThfcG0gKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX3VpbnQ4cCBwU2NhbmxpbmU7CisgIG1uZ191aW50OHAgcERhdGFsaW5lOworICBtbmdfaW50MzIgIGlYOworICBtbmdfdWludDMyIHMsIHQ7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRElTUExBWV9SR0JBOF9QTSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdmlld2FibGUgcm93ID8gKi8KKyAgaWYgKChwRGF0YS0+aVJvdyA+PSBwRGF0YS0+aVNvdXJjZXQpICYmIChwRGF0YS0+aVJvdyA8IHBEYXRhLT5pU291cmNlYikpCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGRyZXNzIGRlc3RpbmF0aW9uIHJvdyAqLworICAgIHBTY2FubGluZSA9IChtbmdfdWludDhwKXBEYXRhLT5mR2V0Y2FudmFzbGluZSAoKChtbmdfaGFuZGxlKXBEYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pUm93ICsgcERhdGEtPmlEZXN0dCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aVNvdXJjZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRqdXN0IGRlc3RpbmF0aW9uIHJvdyBzdGFydGluZy1wb2ludCAqLworICAgIHBTY2FubGluZSA9IHBTY2FubGluZSArIChwRGF0YS0+aUNvbCA8PCAyKSArIChwRGF0YS0+aURlc3RsIDw8IDIpOworICAgIHBEYXRhbGluZSA9IHBEYXRhLT5wUkdCQXJvdzsgICAgICAgLyogYWRkcmVzcyBzb3VyY2Ugcm93ICovCisKKyAgICBpZiAocERhdGEtPmJJc1JHQkExNikgICAgICAgICAgICAgIC8qIGFkanVzdCBzb3VyY2Ugcm93IHN0YXJ0aW5nLXBvaW50ICovCisgICAgICBwRGF0YWxpbmUgPSBwRGF0YWxpbmUgKyAoKHBEYXRhLT5pU291cmNlbCAvIHBEYXRhLT5pQ29saW5jKSA8PCAzKTsKKyAgICBlbHNlCisgICAgICBwRGF0YWxpbmUgPSBwRGF0YWxpbmUgKyAoKHBEYXRhLT5pU291cmNlbCAvIHBEYXRhLT5pQ29saW5jKSA8PCAyKTsKKworICAgIGlmIChwRGF0YS0+YklzT3BhcXVlKSAgICAgICAgICAgICAgLyogZm9yZ2V0IGFib3V0IHRyYW5zcGFyZW5jeSA/ICovCisgICAgeworICAgICAgaWYgKHBEYXRhLT5iSXNSR0JBMTYpICAgICAgICAgICAgLyogMTYtYml0IGlucHV0IHJvdyA/ICovCisgICAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzY2FsZSBkb3duIGJ5IGRyb3BwaW5nIHRoZSBMU0IgKi8KKwkJICBpZiAoKHMgPSBwRGF0YWxpbmVbNl0pID09IDApCisJCQkqKG1uZ191aW50MzIqKSBwU2NhbmxpbmUgPSAwOyAvKiBzZXQgYWxsIGNvbXBvbmVudHMgPSAwICovCisJCSAgZWxzZQorCQkgIHsKKwkJCWlmIChzID09IDI1NSkKKwkJCXsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzBdID0gcERhdGFsaW5lWzBdOworICAgICAgICAgICAgICBwU2NhbmxpbmVbMV0gPSBwRGF0YWxpbmVbMl07CisJCSAgICAgIHBTY2FubGluZVsyXSA9IHBEYXRhbGluZVs0XTsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzNdID0gMjU1OworCQkJfQorCQkJZWxzZQorCQkJeworI2lmZGVmIE1OR19PUFRJTUlaRV9GT09UUFJJTlRfRElWCisgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICBmb3IgKGk9MjsgaSA+PSAwOyBpLS0pCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwU2NhbmxpbmVbMi1pXSA9IERJVjI1NUI4KHMgKiBwRGF0YWxpbmVbNC1pLWldKTsKKyAgICAgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzBdID0gRElWMjU1QjgocyAqIHBEYXRhbGluZVswXSk7CisgICAgICAgICAgICAgIHBTY2FubGluZVsxXSA9IERJVjI1NUI4KHMgKiBwRGF0YWxpbmVbMl0pOworICAgICAgICAgICAgICBwU2NhbmxpbmVbMl0gPSBESVYyNTVCOChzICogcERhdGFsaW5lWzRdKTsKKyNlbmRpZgorICAgICAgICAgICAgICBwU2NhbmxpbmVbM10gPSAobW5nX3VpbnQ4KXM7CisJCQl9CisJCSAgfQorICAgICAgICAgIHBTY2FubGluZSArPSAocERhdGEtPmlDb2xpbmMgPDwgMik7CisgICAgICAgICAgcERhdGFsaW5lICs9IDg7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pQ29sOyBpWCA8IHBEYXRhLT5pU291cmNlcjsKKyAgICAgICAgICAgICBpWCArPSBwRGF0YS0+aUNvbGluYykKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvcHkgdGhlIHZhbHVlcyBhbmQgcHJlbXVsdGlwbHkgKi8KKwkJICBpZiAoKHMgPSBwRGF0YWxpbmVbM10pID09IDApCisJCQkqKG1uZ191aW50MzIqKSBwU2NhbmxpbmUgPSAwOyAvKiBzZXQgYWxsIGNvbXBvbmVudHMgPSAwICovCisJCSAgZWxzZQorCQkgIHsKKwkJCWlmIChzID09IDI1NSkKKwkJCXsKKyNpZmRlZiBNTkdfQklHRU5ESUFOX1NVUFBPUlRFRAorICAgICAgICAgICAgICAqKG1uZ191aW50MzIqKXBTY2FubGluZSA9ICgqKG1uZ191aW50MzIqKXBEYXRhbGluZSkgfCAweDAwMDAwMEZGOworI2Vsc2UKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzBdID0gcERhdGFsaW5lWzBdOworICAgICAgICAgICAgICBwU2NhbmxpbmVbMV0gPSBwRGF0YWxpbmVbMV07CisJCSAgICAgIHBTY2FubGluZVsyXSA9IHBEYXRhbGluZVsyXTsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzNdID0gMjU1OworI2VuZGlmCisJCQl9CisJCQllbHNlCisJCQl7CisjaWZkZWYgTU5HX09QVElNSVpFX0ZPT1RQUklOVF9ESVYKKyAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgIGZvciAoaT0yOyBpID49IDA7IGktLSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBTY2FubGluZVsyLWldID0gRElWMjU1QjgocyAqIHBEYXRhbGluZVsyLWldKTsKKyAgICAgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzBdID0gRElWMjU1QjgocyAqIHBEYXRhbGluZVswXSk7CisgICAgICAgICAgICAgIHBTY2FubGluZVsxXSA9IERJVjI1NUI4KHMgKiBwRGF0YWxpbmVbMV0pOworCQkgICAgICBwU2NhbmxpbmVbMl0gPSBESVYyNTVCOChzICogcERhdGFsaW5lWzJdKTsKKyNlbmRpZgorICAgICAgICAgICAgICBwU2NhbmxpbmVbM10gPSAobW5nX3VpbnQ4KXM7CisJCQl9CisJCSAgfQorCisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyA8PCAyKTsKKyAgICAgICAgICBwRGF0YWxpbmUgKz0gNDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaWYgKHBEYXRhLT5iSXNSR0JBMTYpICAgICAgICAgICAgLyogMTYtYml0IGlucHV0IHJvdyA/ICovCisgICAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgYWxwaGEgdmFsdWVzICovCisgICAgICAgICAgaWYgKChzID0gcERhdGFsaW5lWzZdKSAhPSAwKSAgICAgICAvKiBhbnkgb3BhY2l0eSBhdCBhbGwgPyAqLworICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZnVsbHkgb3BhcXVlIG9yIGJhY2tncm91bmQgZnVsbHkgdHJhbnNwYXJlbnQgPyAqLworICAgICAgICAgICAgaWYgKHMgPT0gMjU1KQorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGxhaW4gY29weSBpdCAqLworICAgICAgICAgICAgICBwU2NhbmxpbmVbMF0gPSBwRGF0YWxpbmVbMF07CisgICAgICAgICAgICAgIHBTY2FubGluZVsxXSA9IHBEYXRhbGluZVsyXTsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzJdID0gcERhdGFsaW5lWzRdOworICAgICAgICAgICAgICBwU2NhbmxpbmVbM10gPSAyNTU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3cgYmxlbmQgKHByZW11bHRpcGxpZWQpICovCisJCQkgIHQgPSAyNTUgLSBzOworI2lmZGVmIE1OR19PUFRJTUlaRV9GT09UUFJJTlRfRElWCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICBmb3IgKGk9MjsgaSA+PSAwOyBpLS0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcFNjYW5saW5lWzItaV0gPSBESVYyNTVCOChzICogcERhdGFsaW5lWzQtaS1pXSArIHQgKgorICAgICAgICAgICAgICAgICAgICAgcFNjYW5saW5lWzItaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzBdID0gRElWMjU1QjgocyAqIHBEYXRhbGluZVswXSArIHQgKiBwU2NhbmxpbmVbMF0pOworICAgICAgICAgICAgICBwU2NhbmxpbmVbMV0gPSBESVYyNTVCOChzICogcERhdGFsaW5lWzJdICsgdCAqIHBTY2FubGluZVsxXSk7CisJCQkgIHBTY2FubGluZVsyXSA9IERJVjI1NUI4KHMgKiBwRGF0YWxpbmVbNF0gKyB0ICogcFNjYW5saW5lWzJdKTsKKyNlbmRpZgorICAgICAgICAgICAgICBwU2NhbmxpbmVbM10gPSAobW5nX3VpbnQ4KSgyNTUgLSBESVYyNTVCOCh0ICogKDI1NSAtIHBTY2FubGluZVszXSkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jIDw8IDIpOworICAgICAgICAgIHBEYXRhbGluZSArPSA4OworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKHMgPSBwRGF0YWxpbmVbM10pICE9IDApIC8qIGFueSBvcGFjaXR5IGF0IGFsbCA/ICovCisgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmdWxseSBvcGFxdWUgPyAqLworICAgICAgICAgICAgaWYgKHMgPT0gMjU1KQorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlbiBzaW1wbHkgY29weSB0aGUgdmFsdWVzICovCisjaWZkZWYgTU5HX0JJR0VORElBTl9TVVBQT1JURUQKKyAgICAgICAgICAgICAgKihtbmdfdWludDMyKilwU2NhbmxpbmUgPSAoKihtbmdfdWludDMyKilwRGF0YWxpbmUpIHwgMHgwMDAwMDBGRjsKKyNlbHNlCisgICAgICAgICAgICAgIHBTY2FubGluZVswXSA9IHBEYXRhbGluZVswXTsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzFdID0gcERhdGFsaW5lWzFdOworICAgICAgICAgICAgICBwU2NhbmxpbmVbMl0gPSBwRGF0YWxpbmVbMl07CisgICAgICAgICAgICAgIHBTY2FubGluZVszXSA9IDI1NTsKKyNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm93IGJsZW5kIChwcmVtdWx0aXBsaWVkKSAqLworCQkJICB0ID0gMjU1IC0gczsKKyNpZmRlZiBNTkdfT1BUSU1JWkVfRk9PVFBSSU5UX0RJVgorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgICAgZm9yIChpPTI7IGkgPj0gMDsgaS0tKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHBTY2FubGluZVsyLWldID0gRElWMjU1QjgocyAqIHBEYXRhbGluZVsyLWldICsgdCAqCisgICAgICAgICAgICAgICAgICAgICBwU2NhbmxpbmVbMi1pXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgICBwU2NhbmxpbmVbMF0gPSBESVYyNTVCOChzICogcERhdGFsaW5lWzBdICsgdCAqIHBTY2FubGluZVswXSk7CisgICAgICAgICAgICAgIHBTY2FubGluZVsxXSA9IERJVjI1NUI4KHMgKiBwRGF0YWxpbmVbMV0gKyB0ICogcFNjYW5saW5lWzFdKTsKKwkJCSAgcFNjYW5saW5lWzJdID0gRElWMjU1QjgocyAqIHBEYXRhbGluZVsyXSArIHQgKiBwU2NhbmxpbmVbMl0pOworI2VuZGlmCisgICAgICAgICAgICAgIHBTY2FubGluZVszXSA9IChtbmdfdWludDgpKDI1NSAtIERJVjI1NUI4KHQgKiAoMjU1IC0gcFNjYW5saW5lWzNdKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIHBTY2FubGluZSArPSAocERhdGEtPmlDb2xpbmMgPDwgMik7CisgICAgICAgICAgcERhdGFsaW5lICs9IDQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBjaGVja191cGRhdGVfcmVnaW9uIChwRGF0YSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRElTUExBWV9SR0JBOF9QTSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZWxzZSAvKiBNTkdfT1BUSU1JWkVfRk9PVFBSSU5UX0NPTVBPU0UgKi8KK21uZ19yZXRjb2RlIG1uZ19kaXNwbGF5X3JnYmE4X3BtIChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ191aW50OHAgcFNjYW5saW5lOworICBtbmdfdWludDhwIHBEYXRhbGluZTsKKyAgbW5nX2ludDMyICBpWDsKKyAgbW5nX3VpbnQzMiBzLCB0OworICBtbmdfdWludDggIGlCcHM7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRElTUExBWV9SR0JBOF9QTSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgCisgIGlCcHM9KG1uZ191aW50OCkocERhdGEtPmJJc1JHQkExNiA/IDI6MSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2aWV3YWJsZSByb3cgPyAqLworICBpZiAoKHBEYXRhLT5pUm93ID49IHBEYXRhLT5pU291cmNldCkgJiYgKHBEYXRhLT5pUm93IDwgcERhdGEtPmlTb3VyY2ViKSkKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHJlc3MgZGVzdGluYXRpb24gcm93ICovCisgICAgcFNjYW5saW5lID0gKG1uZ191aW50OHApcERhdGEtPmZHZXRjYW52YXNsaW5lICgoKG1uZ19oYW5kbGUpcERhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlSb3cgKyBwRGF0YS0+aURlc3R0IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pU291cmNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGp1c3QgZGVzdGluYXRpb24gcm93IHN0YXJ0aW5nLXBvaW50ICovCisgICAgcFNjYW5saW5lID0gcFNjYW5saW5lICsgKHBEYXRhLT5pQ29sIDw8IDIpICsgKHBEYXRhLT5pRGVzdGwgPDwgMik7CisgICAgcERhdGFsaW5lID0gcERhdGEtPnBSR0JBcm93OyAgICAgICAvKiBhZGRyZXNzIHNvdXJjZSByb3cgKi8KKworICAgIC8qIGFkanVzdCBzb3VyY2Ugcm93IHN0YXJ0aW5nLXBvaW50ICovCisgICAgcERhdGFsaW5lID0gcERhdGFsaW5lICsgKChwRGF0YS0+aVNvdXJjZWwgLyBwRGF0YS0+aUNvbGluYykgPDwgKGlCcHMrMSkpOworCisgICAgaWYgKHBEYXRhLT5iSXNPcGFxdWUpICAgICAgICAgICAgICAvKiBmb3JnZXQgYWJvdXQgdHJhbnNwYXJlbmN5ID8gKi8KKyAgICB7CisgICAgICBpZiAocERhdGEtPmJJc1JHQkExNikgICAgICAgICAgICAvKiAxNi1iaXQgaW5wdXQgcm93ID8gKi8KKyAgICAgIHsKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pQ29sOyBpWCA8IHBEYXRhLT5pU291cmNlcjsKKyAgICAgICAgICAgICBpWCArPSBwRGF0YS0+aUNvbGluYykKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjYWxlIGRvd24gYnkgZHJvcHBpbmcgdGhlIExTQiAqLworCQkgIGlmICgocyA9IHBEYXRhbGluZVs2XSkgPT0gMCkKKwkJCSoobW5nX3VpbnQzMiopIHBTY2FubGluZSA9IDA7IC8qIHNldCBhbGwgY29tcG9uZW50cyA9IDAgKi8KKwkJICBlbHNlCisJCSAgeworCQkJaWYgKHMgPT0gMjU1KQorCQkJeworICAgICAgICAgICAgICBwU2NhbmxpbmVbMF0gPSBwRGF0YWxpbmVbMF07CisgICAgICAgICAgICAgIHBTY2FubGluZVsxXSA9IHBEYXRhbGluZVsyXTsKKwkJICAgICAgcFNjYW5saW5lWzJdID0gcERhdGFsaW5lWzRdOworICAgICAgICAgICAgICBwU2NhbmxpbmVbM10gPSAyNTU7CisJCQl9CisJCQllbHNlCisJCQl7CisjaWZkZWYgTU5HX09QVElNSVpFX0ZPT1RQUklOVF9ESVYKKyAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgIGZvciAoaT0yOyBpID49IDA7IGktLSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBTY2FubGluZVsyLWldID0gRElWMjU1QjgocyAqIHBEYXRhbGluZVs0LWktaV0pOworICAgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgICBwU2NhbmxpbmVbMF0gPSBESVYyNTVCOChzICogcERhdGFsaW5lWzBdKTsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzFdID0gRElWMjU1QjgocyAqIHBEYXRhbGluZVsyXSk7CisgICAgICAgICAgICAgIHBTY2FubGluZVsyXSA9IERJVjI1NUI4KHMgKiBwRGF0YWxpbmVbNF0pOworI2VuZGlmCisgICAgICAgICAgICAgIHBTY2FubGluZVszXSA9IChtbmdfdWludDgpczsKKwkJCX0KKwkJICB9CisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyA8PCAyKTsKKyAgICAgICAgICBwRGF0YWxpbmUgKz0gODsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlTb3VyY2VsICsgcERhdGEtPmlDb2w7IGlYIDwgcERhdGEtPmlTb3VyY2VyOworICAgICAgICAgICAgIGlYICs9IHBEYXRhLT5pQ29saW5jKQorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29weSB0aGUgdmFsdWVzIGFuZCBwcmVtdWx0aXBseSAqLworCQkgIGlmICgocyA9IHBEYXRhbGluZVszXSkgPT0gMCkKKwkJCSoobW5nX3VpbnQzMiopIHBTY2FubGluZSA9IDA7IC8qIHNldCBhbGwgY29tcG9uZW50cyA9IDAgKi8KKwkJICBlbHNlCisJCSAgeworCQkJaWYgKHMgPT0gMjU1KQorCQkJeworI2lmZGVmIE1OR19CSUdFTkRJQU5fU1VQUE9SVEVECisgICAgICAgICAgICAgICoobW5nX3VpbnQzMiopcFNjYW5saW5lID0gKCoobW5nX3VpbnQzMiopcERhdGFsaW5lKSB8IDB4MDAwMDAwRkY7CisjZWxzZQorICAgICAgICAgICAgICBwU2NhbmxpbmVbMF0gPSBwRGF0YWxpbmVbMF07CisgICAgICAgICAgICAgIHBTY2FubGluZVsxXSA9IHBEYXRhbGluZVsxXTsKKwkJICAgICAgcFNjYW5saW5lWzJdID0gcERhdGFsaW5lWzJdOworICAgICAgICAgICAgICBwU2NhbmxpbmVbM10gPSAyNTU7CisjZW5kaWYKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKyNpZmRlZiBNTkdfT1BUSU1JWkVfRk9PVFBSSU5UX0RJVgorICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgZm9yIChpPTI7IGkgPj0gMDsgaS0tKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcFNjYW5saW5lWzItaV0gPSBESVYyNTVCOChzICogcERhdGFsaW5lWzItaV0pOworICAgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgICBwU2NhbmxpbmVbMF0gPSBESVYyNTVCOChzICogcERhdGFsaW5lWzBdKTsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzFdID0gRElWMjU1QjgocyAqIHBEYXRhbGluZVsxXSk7CisJCSAgICAgIHBTY2FubGluZVsyXSA9IERJVjI1NUI4KHMgKiBwRGF0YWxpbmVbMl0pOworI2VuZGlmCisgICAgICAgICAgICAgIHBTY2FubGluZVszXSA9IChtbmdfdWludDgpczsKKwkJCX0KKwkJICB9CisKKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jIDw8IDIpOworICAgICAgICAgIHBEYXRhbGluZSArPSA0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBpZiAocERhdGEtPmJJc1JHQkExNikgICAgICAgICAgICAvKiAxNi1iaXQgaW5wdXQgcm93ID8gKi8KKyAgICAgIHsKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pQ29sOyBpWCA8IHBEYXRhLT5pU291cmNlcjsKKyAgICAgICAgICAgICBpWCArPSBwRGF0YS0+aUNvbGluYykKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCBhbHBoYSB2YWx1ZXMgKi8KKyAgICAgICAgICBpZiAoKHMgPSBwRGF0YWxpbmVbNl0pICE9IDApICAgICAgIC8qIGFueSBvcGFjaXR5IGF0IGFsbCA/ICovCisgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmdWxseSBvcGFxdWUgb3IgYmFja2dyb3VuZCBmdWxseSB0cmFuc3BhcmVudCA/ICovCisgICAgICAgICAgICBpZiAocyA9PSAyNTUpCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwbGFpbiBjb3B5IGl0ICovCisgICAgICAgICAgICAgIHBTY2FubGluZVswXSA9IHBEYXRhbGluZVswXTsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzFdID0gcERhdGFsaW5lWzJdOworICAgICAgICAgICAgICBwU2NhbmxpbmVbMl0gPSBwRGF0YWxpbmVbNF07CisgICAgICAgICAgICAgIHBTY2FubGluZVszXSA9IDI1NTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdyBibGVuZCAocHJlbXVsdGlwbGllZCkgKi8KKwkJCSAgdCA9IDI1NSAtIHM7CisjaWZkZWYgTU5HX09QVElNSVpFX0ZPT1RQUklOVF9ESVYKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgIGZvciAoaT0yOyBpID49IDA7IGktLSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBwU2NhbmxpbmVbMi1pXSA9IERJVjI1NUI4KHMgKiBwRGF0YWxpbmVbNC1pLWldICsgdCAqCisgICAgICAgICAgICAgICAgICAgICBwU2NhbmxpbmVbMi1pXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgICBwU2NhbmxpbmVbMF0gPSBESVYyNTVCOChzICogcERhdGFsaW5lWzBdICsgdCAqIHBTY2FubGluZVswXSk7CisgICAgICAgICAgICAgIHBTY2FubGluZVsxXSA9IERJVjI1NUI4KHMgKiBwRGF0YWxpbmVbMl0gKyB0ICogcFNjYW5saW5lWzFdKTsKKwkJCSAgcFNjYW5saW5lWzJdID0gRElWMjU1QjgocyAqIHBEYXRhbGluZVs0XSArIHQgKiBwU2NhbmxpbmVbMl0pOworI2VuZGlmCisgICAgICAgICAgICAgIHBTY2FubGluZVszXSA9IChtbmdfdWludDgpKDI1NSAtIERJVjI1NUI4KHQgKiAoMjU1IC0gcFNjYW5saW5lWzNdKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIHBTY2FubGluZSArPSAocERhdGEtPmlDb2xpbmMgPDwgMik7CisgICAgICAgICAgcERhdGFsaW5lICs9IDg7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pQ29sOyBpWCA8IHBEYXRhLT5pU291cmNlcjsKKyAgICAgICAgICAgICBpWCArPSBwRGF0YS0+aUNvbGluYykKKyAgICAgICAgeworICAgICAgICAgIGlmICgocyA9IHBEYXRhbGluZVszXSkgIT0gMCkgLyogYW55IG9wYWNpdHkgYXQgYWxsID8gKi8KKyAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZ1bGx5IG9wYXF1ZSA/ICovCisgICAgICAgICAgICBpZiAocyA9PSAyNTUpCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGVuIHNpbXBseSBjb3B5IHRoZSB2YWx1ZXMgKi8KKyNpZmRlZiBNTkdfQklHRU5ESUFOX1NVUFBPUlRFRAorICAgICAgICAgICAgICAqKG1uZ191aW50MzIqKXBTY2FubGluZSA9ICgqKG1uZ191aW50MzIqKXBEYXRhbGluZSkgfCAweDAwMDAwMEZGOworI2Vsc2UKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzBdID0gcERhdGFsaW5lWzBdOworICAgICAgICAgICAgICBwU2NhbmxpbmVbMV0gPSBwRGF0YWxpbmVbMV07CisgICAgICAgICAgICAgIHBTY2FubGluZVsyXSA9IHBEYXRhbGluZVsyXTsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzNdID0gMjU1OworI2VuZGlmCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3cgYmxlbmQgKHByZW11bHRpcGxpZWQpICovCisJCQkgIHQgPSAyNTUgLSBzOworI2lmZGVmIE1OR19PUFRJTUlaRV9GT09UUFJJTlRfRElWCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICBmb3IgKGk9MjsgaSA+PSAwOyBpLS0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcFNjYW5saW5lWzItaV0gPSBESVYyNTVCOChzICogcERhdGFsaW5lWzItaV0gKyB0ICoKKyAgICAgICAgICAgICAgICAgICAgIHBTY2FubGluZVsyLWldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICAgIHBTY2FubGluZVswXSA9IERJVjI1NUI4KHMgKiBwRGF0YWxpbmVbMF0gKyB0ICogcFNjYW5saW5lWzBdKTsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzFdID0gRElWMjU1QjgocyAqIHBEYXRhbGluZVsxXSArIHQgKiBwU2NhbmxpbmVbMV0pOworCQkJICBwU2NhbmxpbmVbMl0gPSBESVYyNTVCOChzICogcERhdGFsaW5lWzJdICsgdCAqIHBTY2FubGluZVsyXSk7CisjZW5kaWYKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzNdID0gKG1uZ191aW50OCkoMjU1IC0gRElWMjU1QjgodCAqICgyNTUgLSBwU2NhbmxpbmVbM10pKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyA8PCAyKTsKKyAgICAgICAgICBwRGF0YWxpbmUgKz0gNDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIGNoZWNrX3VwZGF0ZV9yZWdpb24gKHBEYXRhKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ESVNQTEFZX1JHQkE4X1BNLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZiAvKiBNTkdfT1BUSU1JWkVfRk9PVFBSSU5UX0NPTVBPU0UgKi8KKyNlbHNlIC8qIE1OR19OT18xNkJJVF9TVVBQT1JUICovCittbmdfcmV0Y29kZSBtbmdfZGlzcGxheV9yZ2JhOF9wbSAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfdWludDhwIHBTY2FubGluZTsKKyAgbW5nX3VpbnQ4cCBwRGF0YWxpbmU7CisgIG1uZ19pbnQzMiAgaVg7CisgIG1uZ191aW50MzIgcywgdDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ESVNQTEFZX1JHQkE4X1BNLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2aWV3YWJsZSByb3cgPyAqLworICBpZiAoKHBEYXRhLT5pUm93ID49IHBEYXRhLT5pU291cmNldCkgJiYgKHBEYXRhLT5pUm93IDwgcERhdGEtPmlTb3VyY2ViKSkKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHJlc3MgZGVzdGluYXRpb24gcm93ICovCisgICAgcFNjYW5saW5lID0gKG1uZ191aW50OHApcERhdGEtPmZHZXRjYW52YXNsaW5lICgoKG1uZ19oYW5kbGUpcERhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlSb3cgKyBwRGF0YS0+aURlc3R0IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pU291cmNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGp1c3QgZGVzdGluYXRpb24gcm93IHN0YXJ0aW5nLXBvaW50ICovCisgICAgcFNjYW5saW5lID0gcFNjYW5saW5lICsgKHBEYXRhLT5pQ29sIDw8IDIpICsgKHBEYXRhLT5pRGVzdGwgPDwgMik7CisgICAgcERhdGFsaW5lID0gcERhdGEtPnBSR0JBcm93OyAgICAgICAvKiBhZGRyZXNzIHNvdXJjZSByb3cgKi8KKworICAgICAgcERhdGFsaW5lID0gcERhdGFsaW5lICsgKChwRGF0YS0+aVNvdXJjZWwgLyBwRGF0YS0+aUNvbGluYykgPDwgMik7CisKKyAgICBpZiAocERhdGEtPmJJc09wYXF1ZSkgICAgICAgICAgICAgIC8qIGZvcmdldCBhYm91dCB0cmFuc3BhcmVuY3kgPyAqLworICAgIHsKKyAgICAgIHsKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pQ29sOyBpWCA8IHBEYXRhLT5pU291cmNlcjsKKyAgICAgICAgICAgICBpWCArPSBwRGF0YS0+aUNvbGluYykKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvcHkgdGhlIHZhbHVlcyBhbmQgcHJlbXVsdGlwbHkgKi8KKwkJICBpZiAoKHMgPSBwRGF0YWxpbmVbM10pID09IDApCisJCQkqKG1uZ191aW50MzIqKSBwU2NhbmxpbmUgPSAwOyAvKiBzZXQgYWxsIGNvbXBvbmVudHMgPSAwICovCisJCSAgZWxzZQorCQkgIHsKKwkJCWlmIChzID09IDI1NSkKKwkJCXsKKyNpZmRlZiBNTkdfQklHRU5ESUFOX1NVUFBPUlRFRAorICAgICAgICAgICAgICAqKG1uZ191aW50MzIqKXBTY2FubGluZSA9ICgqKG1uZ191aW50MzIqKXBEYXRhbGluZSkgfCAweDAwMDAwMEZGOworI2Vsc2UKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzBdID0gcERhdGFsaW5lWzBdOworICAgICAgICAgICAgICBwU2NhbmxpbmVbMV0gPSBwRGF0YWxpbmVbMV07CisJCSAgICAgIHBTY2FubGluZVsyXSA9IHBEYXRhbGluZVsyXTsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzNdID0gMjU1OworI2VuZGlmCisJCQl9CisJCQllbHNlCisJCQl7CisjaWZkZWYgTU5HX09QVElNSVpFX0ZPT1RQUklOVF9ESVYKKyAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgIGZvciAoaT0yOyBpID49IDA7IGktLSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBTY2FubGluZVsyLWldID0gRElWMjU1QjgocyAqIHBEYXRhbGluZVsyLWldKTsKKyAgICAgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzBdID0gRElWMjU1QjgocyAqIHBEYXRhbGluZVswXSk7CisgICAgICAgICAgICAgIHBTY2FubGluZVsxXSA9IERJVjI1NUI4KHMgKiBwRGF0YWxpbmVbMV0pOworCQkgICAgICBwU2NhbmxpbmVbMl0gPSBESVYyNTVCOChzICogcERhdGFsaW5lWzJdKTsKKyNlbmRpZgorICAgICAgICAgICAgICBwU2NhbmxpbmVbM10gPSAobW5nX3VpbnQ4KXM7CisJCQl9CisJCSAgfQorCisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyA8PCAyKTsKKyAgICAgICAgICBwRGF0YWxpbmUgKz0gNDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgeworICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlTb3VyY2VsICsgcERhdGEtPmlDb2w7IGlYIDwgcERhdGEtPmlTb3VyY2VyOworICAgICAgICAgICAgIGlYICs9IHBEYXRhLT5pQ29saW5jKQorICAgICAgICB7CisgICAgICAgICAgaWYgKChzID0gcERhdGFsaW5lWzNdKSAhPSAwKSAvKiBhbnkgb3BhY2l0eSBhdCBhbGwgPyAqLworICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZnVsbHkgb3BhcXVlID8gKi8KKyAgICAgICAgICAgIGlmIChzID09IDI1NSkKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZW4gc2ltcGx5IGNvcHkgdGhlIHZhbHVlcyAqLworI2lmZGVmIE1OR19CSUdFTkRJQU5fU1VQUE9SVEVECisgICAgICAgICAgICAgICoobW5nX3VpbnQzMiopcFNjYW5saW5lID0gKCoobW5nX3VpbnQzMiopcERhdGFsaW5lKSB8IDB4MDAwMDAwRkY7CisjZWxzZQorICAgICAgICAgICAgICBwU2NhbmxpbmVbMF0gPSBwRGF0YWxpbmVbMF07CisgICAgICAgICAgICAgIHBTY2FubGluZVsxXSA9IHBEYXRhbGluZVsxXTsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzJdID0gcERhdGFsaW5lWzJdOworICAgICAgICAgICAgICBwU2NhbmxpbmVbM10gPSAyNTU7CisjZW5kaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdyBibGVuZCAocHJlbXVsdGlwbGllZCkgKi8KKwkJCSAgdCA9IDI1NSAtIHM7CisjaWZkZWYgTU5HX09QVElNSVpFX0ZPT1RQUklOVF9ESVYKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgIGZvciAoaT0yOyBpID49IDA7IGktLSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBwU2NhbmxpbmVbMi1pXSA9IERJVjI1NUI4KHMgKiBwRGF0YWxpbmVbMi1pXSArIHQgKgorICAgICAgICAgICAgICAgICAgICAgcFNjYW5saW5lWzItaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzBdID0gRElWMjU1QjgocyAqIHBEYXRhbGluZVswXSArIHQgKiBwU2NhbmxpbmVbMF0pOworICAgICAgICAgICAgICBwU2NhbmxpbmVbMV0gPSBESVYyNTVCOChzICogcERhdGFsaW5lWzFdICsgdCAqIHBTY2FubGluZVsxXSk7CisJCQkgIHBTY2FubGluZVsyXSA9IERJVjI1NUI4KHMgKiBwRGF0YWxpbmVbMl0gKyB0ICogcFNjYW5saW5lWzJdKTsKKyNlbmRpZgorICAgICAgICAgICAgICBwU2NhbmxpbmVbM10gPSAobW5nX3VpbnQ4KSgyNTUgLSBESVYyNTVCOCh0ICogKDI1NSAtIHBTY2FubGluZVszXSkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jIDw8IDIpOworICAgICAgICAgIHBEYXRhbGluZSArPSA0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgY2hlY2tfdXBkYXRlX3JlZ2lvbiAocERhdGEpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RJU1BMQVlfUkdCQThfUE0sIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmIC8qIE1OR19OT18xNkJJVF9TVVBQT1JUICovCisjZW5kaWYgLyogTU5HX1NLSVBDQU5WQVNfUkdCQThfUE0gKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENBTlZBU19BUkdCOAorI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorI2lmbmRlZiBNTkdfT1BUSU1JWkVfRk9PVFBSSU5UX0NPTVBPU0UKK21uZ19yZXRjb2RlIG1uZ19kaXNwbGF5X2FyZ2I4IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ191aW50OHAgcFNjYW5saW5lOworICBtbmdfdWludDhwIHBEYXRhbGluZTsKKyAgbW5nX2ludDMyICBpWDsKKyAgbW5nX3VpbnQ4ICBpRkdhOCwgaUJHYTgsIGlDYTg7CisgIG1uZ191aW50MTYgaUZHYTE2LCBpQkdhMTYsIGlDYTE2OworICBtbmdfdWludDE2IGlGR3IxNiwgaUZHZzE2LCBpRkdiMTY7CisgIG1uZ191aW50MTYgaUJHcjE2LCBpQkdnMTYsIGlCR2IxNjsKKyAgbW5nX3VpbnQxNiBpQ3IxNiwgaUNnMTYsIGlDYjE2OworICBtbmdfdWludDggIGlDcjgsIGlDZzgsIGlDYjg7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRElTUExBWV9BUkdCOCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2aWV3YWJsZSByb3cgPyAqLworICBpZiAoKHBEYXRhLT5pUm93ID49IHBEYXRhLT5pU291cmNldCkgJiYgKHBEYXRhLT5pUm93IDwgcERhdGEtPmlTb3VyY2ViKSkKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHJlc3MgZGVzdGluYXRpb24gcm93ICovCisgICAgcFNjYW5saW5lID0gKG1uZ191aW50OHApcERhdGEtPmZHZXRjYW52YXNsaW5lICgoKG1uZ19oYW5kbGUpcERhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlSb3cgKyBwRGF0YS0+aURlc3R0IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pU291cmNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGp1c3QgZGVzdGluYXRpb24gcm93IHN0YXJ0aW5nLXBvaW50ICovCisgICAgcFNjYW5saW5lID0gcFNjYW5saW5lICsgKHBEYXRhLT5pQ29sIDw8IDIpICsgKHBEYXRhLT5pRGVzdGwgPDwgMik7CisgICAgcERhdGFsaW5lID0gcERhdGEtPnBSR0JBcm93OyAgICAgICAvKiBhZGRyZXNzIHNvdXJjZSByb3cgKi8KKworICAgIGlmIChwRGF0YS0+YklzUkdCQTE2KSAgICAgICAgICAgICAgLyogYWRqdXN0IHNvdXJjZSByb3cgc3RhcnRpbmctcG9pbnQgKi8KKyAgICAgIHBEYXRhbGluZSA9IHBEYXRhbGluZSArICgocERhdGEtPmlTb3VyY2VsIC8gcERhdGEtPmlDb2xpbmMpIDw8IDMpOworICAgIGVsc2UKKyAgICAgIHBEYXRhbGluZSA9IHBEYXRhbGluZSArICgocERhdGEtPmlTb3VyY2VsIC8gcERhdGEtPmlDb2xpbmMpIDw8IDIpOworCisgICAgaWYgKHBEYXRhLT5iSXNPcGFxdWUpICAgICAgICAgICAgICAvKiBmb3JnZXQgYWJvdXQgdHJhbnNwYXJlbmN5ID8gKi8KKyAgICB7CisgICAgICBpZiAocERhdGEtPmJJc1JHQkExNikgICAgICAgICAgICAvKiAxNi1iaXQgaW5wdXQgcm93ID8gKi8KKyAgICAgIHsKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pQ29sOyBpWCA8IHBEYXRhLT5pU291cmNlcjsKKyAgICAgICAgICAgICBpWCArPSBwRGF0YS0+aUNvbGluYykKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjYWxlIGRvd24gYnkgZHJvcHBpbmcgdGhlIExTQiAqLworICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKihwRGF0YWxpbmUrNik7CisgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAqcERhdGFsaW5lOworICAgICAgICAgICoocFNjYW5saW5lKzIpID0gKihwRGF0YWxpbmUrMik7CisgICAgICAgICAgKihwU2NhbmxpbmUrMykgPSAqKHBEYXRhbGluZSs0KTsKKworICAgICAgICAgIHBTY2FubGluZSArPSAocERhdGEtPmlDb2xpbmMgPDwgMik7CisgICAgICAgICAgcERhdGFsaW5lICs9IDg7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pQ29sOyBpWCA8IHBEYXRhLT5pU291cmNlcjsKKyAgICAgICAgICAgICBpWCArPSBwRGF0YS0+aUNvbGluYykKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvcHkgdGhlIHZhbHVlcyAqLworICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKihwRGF0YWxpbmUrMyk7CisgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAqcERhdGFsaW5lOworICAgICAgICAgICoocFNjYW5saW5lKzIpID0gKihwRGF0YWxpbmUrMSk7CisgICAgICAgICAgKihwU2NhbmxpbmUrMykgPSAqKHBEYXRhbGluZSsyKTsKKworICAgICAgICAgIHBTY2FubGluZSArPSAocERhdGEtPmlDb2xpbmMgPDwgMik7CisgICAgICAgICAgcERhdGFsaW5lICs9IDQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGlmIChwRGF0YS0+YklzUkdCQTE2KSAgICAgICAgICAgIC8qIDE2LWJpdCBpbnB1dCByb3cgPyAqLworICAgICAgeworICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlTb3VyY2VsICsgcERhdGEtPmlDb2w7IGlYIDwgcERhdGEtPmlTb3VyY2VyOworICAgICAgICAgICAgIGlYICs9IHBEYXRhLT5pQ29saW5jKQorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0IGFscGhhIHZhbHVlcyAqLworICAgICAgICAgIGlGR2ExNiA9IG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUrNik7CisgICAgICAgICAgaUJHYTE2ID0gKG1uZ191aW50MTYpKCpwU2NhbmxpbmUpOworICAgICAgICAgIGlCR2ExNiA9IChtbmdfdWludDE2KShpQkdhMTYgPDwgOCkgfCBpQkdhMTY7CisKKyAgICAgICAgICBpZiAoaUZHYTE2KSAgICAgICAgICAgICAgICAgIC8qIGFueSBvcGFjaXR5IGF0IGFsbCA/ICovCisgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmdWxseSBvcGFxdWUgb3IgYmFja2dyb3VuZCBmdWxseSB0cmFuc3BhcmVudCA/ICovCisgICAgICAgICAgICBpZiAoKGlGR2ExNiA9PSAweEZGRkYpIHx8IChpQkdhMTYgPT0gMCkpCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwbGFpbiBjb3B5IGl0ICovCisgICAgICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKihwRGF0YWxpbmUrNik7CisgICAgICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKnBEYXRhbGluZTsKKyAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMikgPSAqKHBEYXRhbGluZSsyKTsKKyAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMykgPSAqKHBEYXRhbGluZSs0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKGlCR2ExNiA9PSAweEZGRkYpICAgIC8qIGJhY2tncm91bmQgZnVsbHkgb3BhcXVlID8gKi8KKyAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCB0aGUgcHJvcGVyIHZhbHVlcyAqLworICAgICAgICAgICAgICAgIGlGR3IxNiA9IG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUgICk7CisgICAgICAgICAgICAgICAgaUZHZzE2ID0gbW5nX2dldF91aW50MTYgKHBEYXRhbGluZSsyKTsKKyAgICAgICAgICAgICAgICBpRkdiMTYgPSBtbmdfZ2V0X3VpbnQxNiAocERhdGFsaW5lKzQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbGUgYmFja2dyb3VuZCB1cCAqLworICAgICAgICAgICAgICAgIGlCR3IxNiA9IChtbmdfdWludDE2KSgqKHBTY2FubGluZSsxKSk7CisgICAgICAgICAgICAgICAgaUJHZzE2ID0gKG1uZ191aW50MTYpKCoocFNjYW5saW5lKzIpKTsKKyAgICAgICAgICAgICAgICBpQkdiMTYgPSAobW5nX3VpbnQxNikoKihwU2NhbmxpbmUrMykpOworICAgICAgICAgICAgICAgIGlCR3IxNiA9IChtbmdfdWludDE2KSgobW5nX3VpbnQzMilpQkdyMTYgPDwgOCkgfCBpQkdyMTY7CisgICAgICAgICAgICAgICAgaUJHZzE2ID0gKG1uZ191aW50MTYpKChtbmdfdWludDMyKWlCR2cxNiA8PCA4KSB8IGlCR2cxNjsKKyAgICAgICAgICAgICAgICBpQkdiMTYgPSAobW5nX3VpbnQxNikoKG1uZ191aW50MzIpaUJHYjE2IDw8IDgpIHwgaUJHYjE2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm93IGNvbXBvc2UgKi8KKyAgICAgICAgICAgICAgICBNTkdfQ09NUE9TRTE2KGlGR3IxNiwgaUZHcjE2LCBpRkdhMTYsIGlCR3IxNik7CisgICAgICAgICAgICAgICAgTU5HX0NPTVBPU0UxNihpRkdnMTYsIGlGR2cxNiwgaUZHYTE2LCBpQkdnMTYpOworICAgICAgICAgICAgICAgIE1OR19DT01QT1NFMTYoaUZHYjE2LCBpRkdiMTYsIGlGR2ExNiwgaUJHYjE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCByZXR1cm4gdGhlIGNvbXBvc2VkIHZhbHVlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWxwaGEgcmVtYWlucyBmdWxseSBvcGFxdWUgISEhICovCisgICAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAobW5nX3VpbnQ4KShpRkdyMTYgPj4gOCk7CisgICAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMikgPSAobW5nX3VpbnQ4KShpRkdnMTYgPj4gOCk7CisgICAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMykgPSAobW5nX3VpbnQ4KShpRkdiMTYgPj4gOCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbGUgYmFja2dyb3VuZCB1cCAqLworICAgICAgICAgICAgICAgIGlCR3IxNiA9IChtbmdfdWludDE2KSgqKHBTY2FubGluZSsxKSk7CisgICAgICAgICAgICAgICAgaUJHZzE2ID0gKG1uZ191aW50MTYpKCoocFNjYW5saW5lKzIpKTsKKyAgICAgICAgICAgICAgICBpQkdiMTYgPSAobW5nX3VpbnQxNikoKihwU2NhbmxpbmUrMykpOworICAgICAgICAgICAgICAgIGlCR3IxNiA9IChtbmdfdWludDE2KSgobW5nX3VpbnQzMilpQkdyMTYgPDwgOCkgfCBpQkdyMTY7CisgICAgICAgICAgICAgICAgaUJHZzE2ID0gKG1uZ191aW50MTYpKChtbmdfdWludDMyKWlCR2cxNiA8PCA4KSB8IGlCR2cxNjsKKyAgICAgICAgICAgICAgICBpQkdiMTYgPSAobW5nX3VpbnQxNikoKG1uZ191aW50MzIpaUJHYjE2IDw8IDgpIHwgaUJHYjE2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGV0J3MgYmxlbmQgKi8KKyAgICAgICAgICAgICAgICBNTkdfQkxFTkQxNiAobW5nX2dldF91aW50MTYgKHBEYXRhbGluZSAgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2dldF91aW50MTYgKHBEYXRhbGluZSsyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2dldF91aW50MTYgKHBEYXRhbGluZSs0KSwgaUZHYTE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpQkdyMTYsIGlCR2cxNiwgaUJHYjE2LCBpQkdhMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlDcjE2LCAgaUNnMTYsICBpQ2IxNiwgIGlDYTE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCByZXR1cm4gdGhlIGNvbXBvc2VkIHZhbHVlcyAqLworICAgICAgICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKG1uZ191aW50OCkoaUNhMTYgPj4gOCk7CisgICAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAobW5nX3VpbnQ4KShpQ3IxNiA+PiA4KTsKKyAgICAgICAgICAgICAgICAqKHBTY2FubGluZSsyKSA9IChtbmdfdWludDgpKGlDZzE2ID4+IDgpOworICAgICAgICAgICAgICAgICoocFNjYW5saW5lKzMpID0gKG1uZ191aW50OCkoaUNiMTYgPj4gOCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jIDw8IDIpOworICAgICAgICAgIHBEYXRhbGluZSArPSA4OworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsKKyAgICAgICAgICBpRkdhOCA9ICoocERhdGFsaW5lKzMpOyAgICAgIC8qIGdldCBhbHBoYSB2YWx1ZXMgKi8KKyAgICAgICAgICBpQkdhOCA9ICpwU2NhbmxpbmU7CisKKyAgICAgICAgICBpZiAoaUZHYTgpICAgICAgICAgICAgICAgICAgIC8qIGFueSBvcGFjaXR5IGF0IGFsbCA/ICovCisgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmdWxseSBvcGFxdWUgb3IgYmFja2dyb3VuZCBmdWxseSB0cmFuc3BhcmVudCA/ICovCisgICAgICAgICAgICBpZiAoKGlGR2E4ID09IDB4RkYpIHx8IChpQkdhOCA9PSAwKSkKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZW4gc2ltcGx5IGNvcHkgdGhlIHZhbHVlcyAqLworICAgICAgICAgICAgICAqcFNjYW5saW5lICAgICA9ICoocERhdGFsaW5lKzMpOworICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9ICpwRGF0YWxpbmU7CisgICAgICAgICAgICAgICoocFNjYW5saW5lKzIpID0gKihwRGF0YWxpbmUrMSk7CisgICAgICAgICAgICAgICoocFNjYW5saW5lKzMpID0gKihwRGF0YWxpbmUrMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChpQkdhOCA9PSAweEZGKSAgICAgICAvKiBiYWNrZ3JvdW5kIGZ1bGx5IG9wYXF1ZSA/ICovCisgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBkbyBzaW1wbGUgYWxwaGEgY29tcG9zaW5nICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbHBoYSBpdHNlbGYgcmVtYWlucyBmdWxseSBvcGFxdWUgISEhICovCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogbm93IGJsZW5kICovCisgICAgICAgICAgICAgICAgTU5HX0JMRU5EOCAoKnBEYXRhbGluZSwgICAgICoocERhdGFsaW5lKzEpLCAqKHBEYXRhbGluZSsyKSwgaUZHYTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMSksICoocFNjYW5saW5lKzIpLCAqKHBTY2FubGluZSszKSwgaUJHYTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUNyOCwgaUNnOCwgaUNiOCwgaUNhOCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgcmV0dXJuIHRoZSBjb21wb3NlZCB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgICAqcFNjYW5saW5lICAgICA9IGlDYTg7CisgICAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSBpQ3I4OworICAgICAgICAgICAgICAgICoocFNjYW5saW5lKzIpID0gaUNnODsKKyAgICAgICAgICAgICAgICAqKHBTY2FubGluZSszKSA9IGlDYjg7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jIDw8IDIpOworICAgICAgICAgIHBEYXRhbGluZSArPSA0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgY2hlY2tfdXBkYXRlX3JlZ2lvbiAocERhdGEpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RJU1BMQVlfQVJHQjgsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2Vsc2UgLyogTU5HX09QVElNSVpFX0ZPT1RQUklOVF9DT01QT1NFICovCittbmdfcmV0Y29kZSBtbmdfZGlzcGxheV9hcmdiOCAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfdWludDhwIHBTY2FubGluZTsKKyAgbW5nX3VpbnQ4cCBwRGF0YWxpbmU7CisgIG1uZ19pbnQzMiAgaVg7CisgIG1uZ191aW50OCAgaUZHYTgsIGlCR2E4LCBpQ2E4OworICBtbmdfdWludDE2IGlGR2ExNiwgaUJHYTE2LCBpQ2ExNjsKKyAgbW5nX3VpbnQxNiBpRkdnMTY7CisgIG1uZ191aW50MTYgaUJHcjE2LCBpQkdnMTYsIGlCR2IxNjsKKyAgbW5nX3VpbnQxNiBpQ3IxNiwgaUNnMTYsIGlDYjE2OworICBtbmdfdWludDggIGlDcjgsIGlDZzgsIGlDYjg7CisgIG1uZ191aW50OCAgaUJwczsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ESVNQTEFZX0FSR0I4LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaUJwcz0obW5nX3VpbnQ4KShwRGF0YS0+YklzUkdCQTE2ID8gMjoxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZpZXdhYmxlIHJvdyA/ICovCisgIGlmICgocERhdGEtPmlSb3cgPj0gcERhdGEtPmlTb3VyY2V0KSAmJiAocERhdGEtPmlSb3cgPCBwRGF0YS0+aVNvdXJjZWIpKQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkcmVzcyBkZXN0aW5hdGlvbiByb3cgKi8KKyAgICBwU2NhbmxpbmUgPSAobW5nX3VpbnQ4cClwRGF0YS0+ZkdldGNhbnZhc2xpbmUgKCgobW5nX2hhbmRsZSlwRGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aVJvdyArIHBEYXRhLT5pRGVzdHQgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlTb3VyY2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkanVzdCBkZXN0aW5hdGlvbiByb3cgc3RhcnRpbmctcG9pbnQgKi8KKyAgICBwU2NhbmxpbmUgPSBwU2NhbmxpbmUgKyAocERhdGEtPmlDb2wgPDwgMikgKyAocERhdGEtPmlEZXN0bCA8PCAyKTsKKyAgICBwRGF0YWxpbmUgPSBwRGF0YS0+cFJHQkFyb3c7ICAgICAgIC8qIGFkZHJlc3Mgc291cmNlIHJvdyAqLworCisgICAgLyogYWRqdXN0IHNvdXJjZSByb3cgc3RhcnRpbmctcG9pbnQgKi8KKyAgICBwRGF0YWxpbmUgPSBwRGF0YWxpbmUgKyAoKHBEYXRhLT5pU291cmNlbCAvIHBEYXRhLT5pQ29saW5jKSA8PCAoaUJwcysxKSk7CisKKyAgICBpZiAocERhdGEtPmJJc09wYXF1ZSkgICAgICAgICAgICAgIC8qIGZvcmdldCBhYm91dCB0cmFuc3BhcmVuY3kgPyAqLworICAgIHsKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pQ29sOyBpWCA8IHBEYXRhLT5pU291cmNlcjsKKyAgICAgICAgICAgICBpWCArPSBwRGF0YS0+aUNvbGluYykKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjYWxlIGRvd24gYnkgZHJvcHBpbmcgdGhlIExTQiAqLworICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKihwRGF0YWxpbmUrMyppQnBzKTsKKyAgICAgICAgICAqKHBTY2FubGluZSsxKSA9ICpwRGF0YWxpbmU7CisgICAgICAgICAgKihwU2NhbmxpbmUrMikgPSAqKHBEYXRhbGluZStpQnBzKTsKKyAgICAgICAgICAqKHBTY2FubGluZSszKSA9ICoocERhdGFsaW5lKzIqaUJwcyk7CisKKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jIDw8IDIpOworICAgICAgICAgIHBEYXRhbGluZSArPSA0KmlCcHM7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGlmIChwRGF0YS0+YklzUkdCQTE2KSAgICAgICAgICAgIC8qIDE2LWJpdCBpbnB1dCByb3cgPyAqLworICAgICAgeworICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlTb3VyY2VsICsgcERhdGEtPmlDb2w7IGlYIDwgcERhdGEtPmlTb3VyY2VyOworICAgICAgICAgICAgIGlYICs9IHBEYXRhLT5pQ29saW5jKQorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0IGFscGhhIHZhbHVlcyAqLworICAgICAgICAgIGlGR2ExNiA9IG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUrNik7CisgICAgICAgICAgaUJHYTE2ID0gKG1uZ191aW50MTYpKCpwU2NhbmxpbmUpOworICAgICAgICAgIGlCR2ExNiA9IChtbmdfdWludDE2KShpQkdhMTYgPDwgOCkgfCBpQkdhMTY7CisKKyAgICAgICAgICBpZiAoaUZHYTE2KSAgICAgICAgICAgICAgICAgIC8qIGFueSBvcGFjaXR5IGF0IGFsbCA/ICovCisgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmdWxseSBvcGFxdWUgb3IgYmFja2dyb3VuZCBmdWxseSB0cmFuc3BhcmVudCA/ICovCisgICAgICAgICAgICBpZiAoKGlGR2ExNiA9PSAweEZGRkYpIHx8IChpQkdhMTYgPT0gMCkpCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwbGFpbiBjb3B5IGl0ICovCisgICAgICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKihwRGF0YWxpbmUrNik7CisgICAgICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKnBEYXRhbGluZTsKKyAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMikgPSAqKHBEYXRhbGluZSsyKTsKKyAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMykgPSAqKHBEYXRhbGluZSs0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKGlCR2ExNiA9PSAweEZGRkYpICAgIC8qIGJhY2tncm91bmQgZnVsbHkgb3BhcXVlID8gKi8KKyAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCB0aGUgcHJvcGVyIHZhbHVlcyAqLworICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgZm9yIChpPTI7IGkgPj0gMDsgaS0tKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaUZHZzE2ID0gbW5nX2dldF91aW50MTYgKHBEYXRhbGluZStpK2kpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbGUgYmFja2dyb3VuZCB1cCAqLworICAgICAgICAgICAgICAgIGlCR2cxNiA9IChtbmdfdWludDE2KSgqKHBTY2FubGluZStpKzEpKTsKKyAgICAgICAgICAgICAgICBpQkdnMTYgPSAobW5nX3VpbnQxNikoKG1uZ191aW50MzIpaUJHZzE2IDw8IDgpIHwgaUJHZzE2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm93IGNvbXBvc2UgKi8KKyAgICAgICAgICAgICAgICBNTkdfQ09NUE9TRTE2KGlGR2cxNiwgaUZHZzE2LCBpRkdhMTYsIGlCR2cxNik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgcmV0dXJuIHRoZSBjb21wb3NlZCB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFscGhhIHJlbWFpbnMgZnVsbHkgb3BhcXVlICEhISAqLworICAgICAgICAgICAgICAgICoocFNjYW5saW5lK2krMSkgPSAobW5nX3VpbnQ4KShpRkdnMTYgPj4gOCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBzY2FsZSBiYWNrZ3JvdW5kIHVwICovCisgICAgICAgICAgICAgICAgaUJHcjE2ID0gKG1uZ191aW50MTYpKCoocFNjYW5saW5lKzEpKTsKKyAgICAgICAgICAgICAgICBpQkdnMTYgPSAobW5nX3VpbnQxNikoKihwU2NhbmxpbmUrMikpOworICAgICAgICAgICAgICAgIGlCR2IxNiA9IChtbmdfdWludDE2KSgqKHBTY2FubGluZSszKSk7CisgICAgICAgICAgICAgICAgaUJHcjE2ID0gKG1uZ191aW50MTYpKChtbmdfdWludDMyKWlCR3IxNiA8PCA4KSB8IGlCR3IxNjsKKyAgICAgICAgICAgICAgICBpQkdnMTYgPSAobW5nX3VpbnQxNikoKG1uZ191aW50MzIpaUJHZzE2IDw8IDgpIHwgaUJHZzE2OworICAgICAgICAgICAgICAgIGlCR2IxNiA9IChtbmdfdWludDE2KSgobW5nX3VpbnQzMilpQkdiMTYgPDwgOCkgfCBpQkdiMTY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZXQncyBibGVuZCAqLworICAgICAgICAgICAgICAgIE1OR19CTEVORDE2IChtbmdfZ2V0X3VpbnQxNiAocERhdGFsaW5lICApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfZ2V0X3VpbnQxNiAocERhdGFsaW5lKzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfZ2V0X3VpbnQxNiAocERhdGFsaW5lKzQpLCBpRkdhMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlCR3IxNiwgaUJHZzE2LCBpQkdiMTYsIGlCR2ExNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUNyMTYsICBpQ2cxNiwgIGlDYjE2LCAgaUNhMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHJldHVybiB0aGUgY29tcG9zZWQgdmFsdWVzICovCisgICAgICAgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAobW5nX3VpbnQ4KShpQ2ExNiA+PiA4KTsKKyAgICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9IChtbmdfdWludDgpKGlDcjE2ID4+IDgpOworICAgICAgICAgICAgICAgICoocFNjYW5saW5lKzIpID0gKG1uZ191aW50OCkoaUNnMTYgPj4gOCk7CisgICAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMykgPSAobW5nX3VpbnQ4KShpQ2IxNiA+PiA4KTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIHBTY2FubGluZSArPSAocERhdGEtPmlDb2xpbmMgPDwgMik7CisgICAgICAgICAgcERhdGFsaW5lICs9IDg7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pQ29sOyBpWCA8IHBEYXRhLT5pU291cmNlcjsKKyAgICAgICAgICAgICBpWCArPSBwRGF0YS0+aUNvbGluYykKKyAgICAgICAgeworICAgICAgICAgIGlGR2E4ID0gKihwRGF0YWxpbmUrMyk7ICAgICAgLyogZ2V0IGFscGhhIHZhbHVlcyAqLworICAgICAgICAgIGlCR2E4ID0gKnBTY2FubGluZTsKKworICAgICAgICAgIGlmIChpRkdhOCkgICAgICAgICAgICAgICAgICAgLyogYW55IG9wYWNpdHkgYXQgYWxsID8gKi8KKyAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZ1bGx5IG9wYXF1ZSBvciBiYWNrZ3JvdW5kIGZ1bGx5IHRyYW5zcGFyZW50ID8gKi8KKyAgICAgICAgICAgIGlmICgoaUZHYTggPT0gMHhGRikgfHwgKGlCR2E4ID09IDApKQorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlbiBzaW1wbHkgY29weSB0aGUgdmFsdWVzICovCisgICAgICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKihwRGF0YWxpbmUrMyk7CisgICAgICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKnBEYXRhbGluZTsKKyAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMikgPSAqKHBEYXRhbGluZSsxKTsKKyAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMykgPSAqKHBEYXRhbGluZSsyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKGlCR2E4ID09IDB4RkYpICAgICAgIC8qIGJhY2tncm91bmQgZnVsbHkgb3BhcXVlID8gKi8KKyAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvIHNpbXBsZSBhbHBoYSBjb21wb3NpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFscGhhIGl0c2VsZiByZW1haW5zIGZ1bGx5IG9wYXF1ZSAhISEgKi8KKyAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgIGZvciAoaT0yOyBpID49IDA7IGktLSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICBNTkdfQ09NUE9TRTggKCoocFNjYW5saW5lK2krMSksICoocERhdGFsaW5lK2kpLCBpRkdhOCwgKihwU2NhbmxpbmUraSsxKSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3cgYmxlbmQgKi8KKyAgICAgICAgICAgICAgICBNTkdfQkxFTkQ4ICgqcERhdGFsaW5lLCAgICAgKihwRGF0YWxpbmUrMSksICoocERhdGFsaW5lKzIpLCBpRkdhOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSwgKihwU2NhbmxpbmUrMiksICoocFNjYW5saW5lKzMpLCBpQkdhOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpQ3I4LCBpQ2c4LCBpQ2I4LCBpQ2E4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCByZXR1cm4gdGhlIGNvbXBvc2VkIHZhbHVlcyAqLworICAgICAgICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gaUNhODsKKyAgICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9IGlDcjg7CisgICAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMikgPSBpQ2c4OworICAgICAgICAgICAgICAgICoocFNjYW5saW5lKzMpID0gaUNiODsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIHBTY2FubGluZSArPSAocERhdGEtPmlDb2xpbmMgPDwgMik7CisgICAgICAgICAgcERhdGFsaW5lICs9IDQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBjaGVja191cGRhdGVfcmVnaW9uIChwRGF0YSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRElTUExBWV9BUkdCOCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYgLyogTU5HX09QVElNSVpFX0ZPT1RQUklOVF9DT01QT1NFICovCisjZWxzZSAvKiBNTkdfTk9fMTZCSVRfU1VQUE9SVCAqLworbW5nX3JldGNvZGUgbW5nX2Rpc3BsYXlfYXJnYjggKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX3VpbnQ4cCBwU2NhbmxpbmU7CisgIG1uZ191aW50OHAgcERhdGFsaW5lOworICBtbmdfaW50MzIgIGlYOworICBtbmdfdWludDggIGlGR2E4LCBpQkdhOCwgaUNhODsKKyAgbW5nX3VpbnQ4ICBpQ3I4LCBpQ2c4LCBpQ2I4OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RJU1BMQVlfQVJHQjgsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdmlld2FibGUgcm93ID8gKi8KKyAgaWYgKChwRGF0YS0+aVJvdyA+PSBwRGF0YS0+aVNvdXJjZXQpICYmIChwRGF0YS0+aVJvdyA8IHBEYXRhLT5pU291cmNlYikpCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGRyZXNzIGRlc3RpbmF0aW9uIHJvdyAqLworICAgIHBTY2FubGluZSA9IChtbmdfdWludDhwKXBEYXRhLT5mR2V0Y2FudmFzbGluZSAoKChtbmdfaGFuZGxlKXBEYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pUm93ICsgcERhdGEtPmlEZXN0dCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aVNvdXJjZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRqdXN0IGRlc3RpbmF0aW9uIHJvdyBzdGFydGluZy1wb2ludCAqLworICAgIHBTY2FubGluZSA9IHBTY2FubGluZSArIChwRGF0YS0+aUNvbCA8PCAyKSArIChwRGF0YS0+aURlc3RsIDw8IDIpOworICAgIHBEYXRhbGluZSA9IHBEYXRhLT5wUkdCQXJvdzsgICAgICAgLyogYWRkcmVzcyBzb3VyY2Ugcm93ICovCisKKyAgICAgIHBEYXRhbGluZSA9IHBEYXRhbGluZSArICgocERhdGEtPmlTb3VyY2VsIC8gcERhdGEtPmlDb2xpbmMpIDw8IDIpOworCisgICAgaWYgKHBEYXRhLT5iSXNPcGFxdWUpICAgICAgICAgICAgICAvKiBmb3JnZXQgYWJvdXQgdHJhbnNwYXJlbmN5ID8gKi8KKyAgICB7CisgICAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3B5IHRoZSB2YWx1ZXMgKi8KKyAgICAgICAgICAqcFNjYW5saW5lICAgICA9ICoocERhdGFsaW5lKzMpOworICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKnBEYXRhbGluZTsKKyAgICAgICAgICAqKHBTY2FubGluZSsyKSA9ICoocERhdGFsaW5lKzEpOworICAgICAgICAgICoocFNjYW5saW5lKzMpID0gKihwRGF0YWxpbmUrMik7CisKKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jIDw8IDIpOworICAgICAgICAgIHBEYXRhbGluZSArPSA0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsKKyAgICAgICAgICBpRkdhOCA9ICoocERhdGFsaW5lKzMpOyAgICAgIC8qIGdldCBhbHBoYSB2YWx1ZXMgKi8KKyAgICAgICAgICBpQkdhOCA9ICpwU2NhbmxpbmU7CisKKyAgICAgICAgICBpZiAoaUZHYTgpICAgICAgICAgICAgICAgICAgIC8qIGFueSBvcGFjaXR5IGF0IGFsbCA/ICovCisgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmdWxseSBvcGFxdWUgb3IgYmFja2dyb3VuZCBmdWxseSB0cmFuc3BhcmVudCA/ICovCisgICAgICAgICAgICBpZiAoKGlGR2E4ID09IDB4RkYpIHx8IChpQkdhOCA9PSAwKSkKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZW4gc2ltcGx5IGNvcHkgdGhlIHZhbHVlcyAqLworICAgICAgICAgICAgICAqcFNjYW5saW5lICAgICA9ICoocERhdGFsaW5lKzMpOworICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9ICpwRGF0YWxpbmU7CisgICAgICAgICAgICAgICoocFNjYW5saW5lKzIpID0gKihwRGF0YWxpbmUrMSk7CisgICAgICAgICAgICAgICoocFNjYW5saW5lKzMpID0gKihwRGF0YWxpbmUrMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChpQkdhOCA9PSAweEZGKSAgICAgICAvKiBiYWNrZ3JvdW5kIGZ1bGx5IG9wYXF1ZSA/ICovCisgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBkbyBzaW1wbGUgYWxwaGEgY29tcG9zaW5nICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbHBoYSBpdHNlbGYgcmVtYWlucyBmdWxseSBvcGFxdWUgISEhICovCisjaWZkZWYgTU5HX09QVElNSVpFX0ZPT1RQUklOVF9DT01QT1NFCisgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICBmb3IgKGk9MjsgaSA+PSAwOyBpLS0pCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgTU5HX0NPTVBPU0U4ICgqKHBTY2FubGluZStpKzEpLCAqKHBEYXRhbGluZStpKSwgaUZHYTgsICoocFNjYW5saW5lK2krMSkpOworICAgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgICAgIE1OR19DT01QT1NFOCAoKihwU2NhbmxpbmUrMSksICpwRGF0YWxpbmUsICAgICBpRkdhOCwgKihwU2NhbmxpbmUrMSkpOworICAgICAgICAgICAgICAgIE1OR19DT01QT1NFOCAoKihwU2NhbmxpbmUrMiksICoocERhdGFsaW5lKzEpLCBpRkdhOCwgKihwU2NhbmxpbmUrMikpOworICAgICAgICAgICAgICAgIE1OR19DT01QT1NFOCAoKihwU2NhbmxpbmUrMyksICoocERhdGFsaW5lKzIpLCBpRkdhOCwgKihwU2NhbmxpbmUrMykpOworI2VuZGlmCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogbm93IGJsZW5kICovCisgICAgICAgICAgICAgICAgTU5HX0JMRU5EOCAoKnBEYXRhbGluZSwgICAgICoocERhdGFsaW5lKzEpLCAqKHBEYXRhbGluZSsyKSwgaUZHYTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMSksICoocFNjYW5saW5lKzIpLCAqKHBTY2FubGluZSszKSwgaUJHYTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUNyOCwgaUNnOCwgaUNiOCwgaUNhOCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgcmV0dXJuIHRoZSBjb21wb3NlZCB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgICAqcFNjYW5saW5lICAgICA9IGlDYTg7CisgICAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSBpQ3I4OworICAgICAgICAgICAgICAgICoocFNjYW5saW5lKzIpID0gaUNnODsKKyAgICAgICAgICAgICAgICAqKHBTY2FubGluZSszKSA9IGlDYjg7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jIDw8IDIpOworICAgICAgICAgIHBEYXRhbGluZSArPSA0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgY2hlY2tfdXBkYXRlX3JlZ2lvbiAocERhdGEpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RJU1BMQVlfQVJHQjgsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmIC8qIE1OR19OT18xNkJJVF9TVVBQT1JUICovCisjZW5kaWYgLyogTU5HX1NLSVBDQU5WQVNfQVJHQjggKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENBTlZBU19BUkdCOF9QTQorI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorI2lmbmRlZiBNTkdfT1BUSU1JWkVfRk9PVFBSSU5UX0NPTVBPU0UKK21uZ19yZXRjb2RlIG1uZ19kaXNwbGF5X2FyZ2I4X3BtIChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ191aW50OHAgcFNjYW5saW5lOworICBtbmdfdWludDhwIHBEYXRhbGluZTsKKyAgbW5nX2ludDMyICBpWDsKKyAgbW5nX3VpbnQzMiBzLCB0OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RJU1BMQVlfQVJHQjhfUE0sIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZpZXdhYmxlIHJvdyA/ICovCisgIGlmICgocERhdGEtPmlSb3cgPj0gcERhdGEtPmlTb3VyY2V0KSAmJiAocERhdGEtPmlSb3cgPCBwRGF0YS0+aVNvdXJjZWIpKQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkcmVzcyBkZXN0aW5hdGlvbiByb3cgKi8KKyAgICBwU2NhbmxpbmUgPSAobW5nX3VpbnQ4cClwRGF0YS0+ZkdldGNhbnZhc2xpbmUgKCgobW5nX2hhbmRsZSlwRGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aVJvdyArIHBEYXRhLT5pRGVzdHQgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlTb3VyY2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkanVzdCBkZXN0aW5hdGlvbiByb3cgc3RhcnRpbmctcG9pbnQgKi8KKyAgICBwU2NhbmxpbmUgPSBwU2NhbmxpbmUgKyAocERhdGEtPmlDb2wgPDwgMikgKyAocERhdGEtPmlEZXN0bCA8PCAyKTsKKyAgICBwRGF0YWxpbmUgPSBwRGF0YS0+cFJHQkFyb3c7ICAgICAgIC8qIGFkZHJlc3Mgc291cmNlIHJvdyAqLworCisgICAgaWYgKHBEYXRhLT5iSXNSR0JBMTYpICAgICAgICAgICAgICAvKiBhZGp1c3Qgc291cmNlIHJvdyBzdGFydGluZy1wb2ludCAqLworICAgICAgcERhdGFsaW5lID0gcERhdGFsaW5lICsgKChwRGF0YS0+aVNvdXJjZWwgLyBwRGF0YS0+aUNvbGluYykgPDwgMyk7CisgICAgZWxzZQorICAgICAgcERhdGFsaW5lID0gcERhdGFsaW5lICsgKChwRGF0YS0+aVNvdXJjZWwgLyBwRGF0YS0+aUNvbGluYykgPDwgMik7CisKKyAgICBpZiAocERhdGEtPmJJc09wYXF1ZSkgICAgICAgICAgICAgIC8qIGZvcmdldCBhYm91dCB0cmFuc3BhcmVuY3kgPyAqLworICAgIHsKKyAgICAgIGlmIChwRGF0YS0+YklzUkdCQTE2KSAgICAgICAgICAgIC8qIDE2LWJpdCBpbnB1dCByb3cgPyAqLworICAgICAgeworICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlTb3VyY2VsICsgcERhdGEtPmlDb2w7IGlYIDwgcERhdGEtPmlTb3VyY2VyOworICAgICAgICAgICAgIGlYICs9IHBEYXRhLT5pQ29saW5jKQorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbGUgZG93biBieSBkcm9wcGluZyB0aGUgTFNCICovCisJCSAgaWYgKChzID0gcERhdGFsaW5lWzZdKSA9PSAwKQorCQkJKihtbmdfdWludDMyKikgcFNjYW5saW5lID0gMDsgLyogc2V0IGFsbCBjb21wb25lbnRzID0gMCAqLworCQkgIGVsc2UKKwkJICB7CisJCQlpZiAocyA9PSAyNTUpCisJCQl7CisgICAgICAgICAgICAgIHBTY2FubGluZVswXSA9IDI1NTsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzFdID0gcERhdGFsaW5lWzBdOworICAgICAgICAgICAgICBwU2NhbmxpbmVbMl0gPSBwRGF0YWxpbmVbMl07CisJCSAgICAgIHBTY2FubGluZVszXSA9IHBEYXRhbGluZVs0XTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzBdID0gKG1uZ191aW50OClzOworI2lmZGVmIE1OR19PUFRJTUlaRV9GT09UUFJJTlRfRElWCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICBmb3IgKGk9MjsgaSA+PSAwOyBpLS0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcFNjYW5saW5lWzMtaV0gPSBESVYyNTVCOChzICogcERhdGFsaW5lWzQtaS1pXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgICBwU2NhbmxpbmVbMV0gPSBESVYyNTVCOChzICogcERhdGFsaW5lWzBdKTsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzJdID0gRElWMjU1QjgocyAqIHBEYXRhbGluZVsyXSk7CisgICAgICAgICAgICAgIHBTY2FubGluZVszXSA9IERJVjI1NUI4KHMgKiBwRGF0YWxpbmVbNF0pOworI2VuZGlmCisJCQl9CisJCSAgfQorICAgICAgICAgIHBTY2FubGluZSArPSAocERhdGEtPmlDb2xpbmMgPDwgMik7CisgICAgICAgICAgcERhdGFsaW5lICs9IDg7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pQ29sOyBpWCA8IHBEYXRhLT5pU291cmNlcjsKKyAgICAgICAgICAgICBpWCArPSBwRGF0YS0+aUNvbGluYykKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvcHkgdGhlIHZhbHVlcyBhbmQgcHJlbXVsdGlwbHkgKi8KKwkJICBpZiAoKHMgPSBwRGF0YWxpbmVbM10pID09IDApCisJCQkqKG1uZ191aW50MzIqKSBwU2NhbmxpbmUgPSAwOyAvKiBzZXQgYWxsIGNvbXBvbmVudHMgPSAwICovCisJCSAgZWxzZQorCQkgIHsKKwkJCWlmIChzID09IDI1NSkKKwkJCXsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzBdID0gMjU1OworICAgICAgICAgICAgICBwU2NhbmxpbmVbMV0gPSBwRGF0YWxpbmVbMF07CisgICAgICAgICAgICAgIHBTY2FubGluZVsyXSA9IHBEYXRhbGluZVsxXTsKKwkJICAgICAgcFNjYW5saW5lWzNdID0gcERhdGFsaW5lWzJdOworCQkJfQorCQkJZWxzZQorCQkJeworICAgICAgICAgICAgICBwU2NhbmxpbmVbMF0gPSAobW5nX3VpbnQ4KXM7CisjaWZkZWYgTU5HX09QVElNSVpFX0ZPT1RQUklOVF9ESVYKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgIGZvciAoaT0yOyBpID49IDA7IGktLSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBwU2NhbmxpbmVbMy1pXSA9IERJVjI1NUI4KHMgKiBwRGF0YWxpbmVbMi1pXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgICBwU2NhbmxpbmVbMV0gPSBESVYyNTVCOChzICogcERhdGFsaW5lWzBdKTsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzJdID0gRElWMjU1QjgocyAqIHBEYXRhbGluZVsxXSk7CisJCSAgICAgIHBTY2FubGluZVszXSA9IERJVjI1NUI4KHMgKiBwRGF0YWxpbmVbMl0pOworI2VuZGlmCisJCQl9CisJCSAgfQorCisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyA8PCAyKTsKKyAgICAgICAgICBwRGF0YWxpbmUgKz0gNDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaWYgKHBEYXRhLT5iSXNSR0JBMTYpICAgICAgICAgICAgLyogMTYtYml0IGlucHV0IHJvdyA/ICovCisgICAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgYWxwaGEgdmFsdWVzICovCisgICAgICAgICAgaWYgKChzID0gcERhdGFsaW5lWzZdKSAhPSAwKSAgICAgICAvKiBhbnkgb3BhY2l0eSBhdCBhbGwgPyAqLworICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZnVsbHkgb3BhcXVlIG9yIGJhY2tncm91bmQgZnVsbHkgdHJhbnNwYXJlbnQgPyAqLworICAgICAgICAgICAgaWYgKHMgPT0gMjU1KQorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGxhaW4gY29weSBpdCAqLworICAgICAgICAgICAgICBwU2NhbmxpbmVbMF0gPSAyNTU7CisgICAgICAgICAgICAgIHBTY2FubGluZVsxXSA9IHBEYXRhbGluZVswXTsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzJdID0gcERhdGFsaW5lWzJdOworICAgICAgICAgICAgICBwU2NhbmxpbmVbM10gPSBwRGF0YWxpbmVbNF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3cgYmxlbmQgKHByZW11bHRpcGxpZWQpICovCisJCQkgIHQgPSAyNTUgLSBzOworICAgICAgICAgICAgICBwU2NhbmxpbmVbMF0gPSAobW5nX3VpbnQ4KSgyNTUgLSBESVYyNTVCOCh0ICogKDI1NSAtIHBTY2FubGluZVswXSkpKTsKKyNpZmRlZiBNTkdfT1BUSU1JWkVfRk9PVFBSSU5UX0RJVgorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgICAgZm9yIChpPTI7IGkgPj0gMDsgaS0tKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHBTY2FubGluZVszLWldID0gRElWMjU1QjgocyAqIHBEYXRhbGluZVs0LWktaV0gKyB0ICoKKyAgICAgICAgICAgICAgICAgICAgIHBTY2FubGluZVszLWldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICAgIHBTY2FubGluZVsxXSA9IERJVjI1NUI4KHMgKiBwRGF0YWxpbmVbMF0gKyB0ICogcFNjYW5saW5lWzFdKTsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzJdID0gRElWMjU1QjgocyAqIHBEYXRhbGluZVsyXSArIHQgKiBwU2NhbmxpbmVbMl0pOworCQkJICBwU2NhbmxpbmVbM10gPSBESVYyNTVCOChzICogcERhdGFsaW5lWzRdICsgdCAqIHBTY2FubGluZVszXSk7CisjZW5kaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jIDw8IDIpOworICAgICAgICAgIHBEYXRhbGluZSArPSA4OworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKHMgPSBwRGF0YWxpbmVbM10pICE9IDApICAgICAgIC8qIGFueSBvcGFjaXR5IGF0IGFsbCA/ICovCisgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmdWxseSBvcGFxdWUgPyAqLworICAgICAgICAgICAgaWYgKHMgPT0gMjU1KQorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlbiBzaW1wbHkgY29weSB0aGUgdmFsdWVzICovCisgICAgICAgICAgICAgIHBTY2FubGluZVswXSA9IDI1NTsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzFdID0gcERhdGFsaW5lWzBdOworICAgICAgICAgICAgICBwU2NhbmxpbmVbMl0gPSBwRGF0YWxpbmVbMV07CisgICAgICAgICAgICAgIHBTY2FubGluZVszXSA9IHBEYXRhbGluZVsyXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdyBibGVuZCAocHJlbXVsdGlwbGllZCkgKi8KKwkJCSAgdCA9IDI1NSAtIHM7CisgICAgICAgICAgICAgIHBTY2FubGluZVswXSA9IChtbmdfdWludDgpKDI1NSAtIERJVjI1NUI4KHQgKiAoMjU1IC0gcFNjYW5saW5lWzBdKSkpOworI2lmZGVmIE1OR19PUFRJTUlaRV9GT09UUFJJTlRfRElWCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICBmb3IgKGk9MjsgaSA+PSAwOyBpLS0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcFNjYW5saW5lWzMtaV0gPSBESVYyNTVCOChzICogcERhdGFsaW5lWzItaV0gKyB0ICoKKyAgICAgICAgICAgICAgICAgICAgIHBTY2FubGluZVszLWldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICAgIHBTY2FubGluZVsxXSA9IERJVjI1NUI4KHMgKiBwRGF0YWxpbmVbMF0gKyB0ICogcFNjYW5saW5lWzFdKTsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzJdID0gRElWMjU1QjgocyAqIHBEYXRhbGluZVsxXSArIHQgKiBwU2NhbmxpbmVbMl0pOworCQkJICBwU2NhbmxpbmVbM10gPSBESVYyNTVCOChzICogcERhdGFsaW5lWzJdICsgdCAqIHBTY2FubGluZVszXSk7CisjZW5kaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jIDw8IDIpOworICAgICAgICAgIHBEYXRhbGluZSArPSA0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgY2hlY2tfdXBkYXRlX3JlZ2lvbiAocERhdGEpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RJU1BMQVlfQVJHQjhfUE0sIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2Vsc2UgLyogTU5HX09QVElNSVpFX0ZPT1RQUklOVF9DT01QT1NFICovCittbmdfcmV0Y29kZSBtbmdfZGlzcGxheV9hcmdiOF9wbSAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfdWludDhwIHBTY2FubGluZTsKKyAgbW5nX3VpbnQ4cCBwRGF0YWxpbmU7CisgIG1uZ19pbnQzMiAgaVg7CisgIG1uZ191aW50MzIgcywgdDsKKyAgbW5nX3VpbnQ4ICBpQnBzOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RJU1BMQVlfQVJHQjhfUE0sIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpQnBzPShtbmdfdWludDgpKHBEYXRhLT5iSXNSR0JBMTYgPyAyOjEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdmlld2FibGUgcm93ID8gKi8KKyAgaWYgKChwRGF0YS0+aVJvdyA+PSBwRGF0YS0+aVNvdXJjZXQpICYmIChwRGF0YS0+aVJvdyA8IHBEYXRhLT5pU291cmNlYikpCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGRyZXNzIGRlc3RpbmF0aW9uIHJvdyAqLworICAgIHBTY2FubGluZSA9IChtbmdfdWludDhwKXBEYXRhLT5mR2V0Y2FudmFzbGluZSAoKChtbmdfaGFuZGxlKXBEYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pUm93ICsgcERhdGEtPmlEZXN0dCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aVNvdXJjZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRqdXN0IGRlc3RpbmF0aW9uIHJvdyBzdGFydGluZy1wb2ludCAqLworICAgIHBTY2FubGluZSA9IHBTY2FubGluZSArIChwRGF0YS0+aUNvbCA8PCAyKSArIChwRGF0YS0+aURlc3RsIDw8IDIpOworICAgIHBEYXRhbGluZSA9IHBEYXRhLT5wUkdCQXJvdzsgICAgICAgLyogYWRkcmVzcyBzb3VyY2Ugcm93ICovCisKKyAgICAvKiBhZGp1c3Qgc291cmNlIHJvdyBzdGFydGluZy1wb2ludCAqLworICAgIHBEYXRhbGluZSA9IHBEYXRhbGluZSArICgocERhdGEtPmlTb3VyY2VsIC8gcERhdGEtPmlDb2xpbmMpIDw8IChpQnBzKzEpKTsKKworICAgIGlmIChwRGF0YS0+YklzT3BhcXVlKSAgICAgICAgICAgICAgLyogZm9yZ2V0IGFib3V0IHRyYW5zcGFyZW5jeSA/ICovCisgICAgeworICAgICAgaWYgKHBEYXRhLT5iSXNSR0JBMTYpICAgICAgICAgICAgLyogMTYtYml0IGlucHV0IHJvdyA/ICovCisgICAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzY2FsZSBkb3duIGJ5IGRyb3BwaW5nIHRoZSBMU0IgKi8KKwkJICBpZiAoKHMgPSBwRGF0YWxpbmVbNl0pID09IDApCisJCQkqKG1uZ191aW50MzIqKSBwU2NhbmxpbmUgPSAwOyAvKiBzZXQgYWxsIGNvbXBvbmVudHMgPSAwICovCisJCSAgZWxzZQorCQkgIHsKKwkJCWlmIChzID09IDI1NSkKKwkJCXsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzBdID0gMjU1OworICAgICAgICAgICAgICBwU2NhbmxpbmVbMV0gPSBwRGF0YWxpbmVbMF07CisgICAgICAgICAgICAgIHBTY2FubGluZVsyXSA9IHBEYXRhbGluZVsyXTsKKwkJICAgICAgcFNjYW5saW5lWzNdID0gcERhdGFsaW5lWzRdOworCQkJfQorCQkJZWxzZQorCQkJeworICAgICAgICAgICAgICBwU2NhbmxpbmVbMF0gPSAobW5nX3VpbnQ4KXM7CisjaWZkZWYgTU5HX09QVElNSVpFX0ZPT1RQUklOVF9ESVYKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgIGZvciAoaT0yOyBpID49IDA7IGktLSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBwU2NhbmxpbmVbMy1pXSA9IERJVjI1NUI4KHMgKiBwRGF0YWxpbmVbNC1pLWldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICAgIHBTY2FubGluZVsxXSA9IERJVjI1NUI4KHMgKiBwRGF0YWxpbmVbMF0pOworICAgICAgICAgICAgICBwU2NhbmxpbmVbMl0gPSBESVYyNTVCOChzICogcERhdGFsaW5lWzJdKTsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzNdID0gRElWMjU1QjgocyAqIHBEYXRhbGluZVs0XSk7CisjZW5kaWYKKwkJCX0KKwkJICB9CisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyA8PCAyKTsKKyAgICAgICAgICBwRGF0YWxpbmUgKz0gODsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlTb3VyY2VsICsgcERhdGEtPmlDb2w7IGlYIDwgcERhdGEtPmlTb3VyY2VyOworICAgICAgICAgICAgIGlYICs9IHBEYXRhLT5pQ29saW5jKQorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29weSB0aGUgdmFsdWVzIGFuZCBwcmVtdWx0aXBseSAqLworCQkgIGlmICgocyA9IHBEYXRhbGluZVszXSkgPT0gMCkKKwkJCSoobW5nX3VpbnQzMiopIHBTY2FubGluZSA9IDA7IC8qIHNldCBhbGwgY29tcG9uZW50cyA9IDAgKi8KKwkJICBlbHNlCisJCSAgeworCQkJaWYgKHMgPT0gMjU1KQorCQkJeworICAgICAgICAgICAgICBwU2NhbmxpbmVbMF0gPSAyNTU7CisgICAgICAgICAgICAgIHBTY2FubGluZVsxXSA9IHBEYXRhbGluZVswXTsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzJdID0gcERhdGFsaW5lWzFdOworCQkgICAgICBwU2NhbmxpbmVbM10gPSBwRGF0YWxpbmVbMl07CisJCQl9CisJCQllbHNlCisJCQl7CisgICAgICAgICAgICAgIHBTY2FubGluZVswXSA9IChtbmdfdWludDgpczsKKyNpZmRlZiBNTkdfT1BUSU1JWkVfRk9PVFBSSU5UX0RJVgorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgICAgZm9yIChpPTI7IGkgPj0gMDsgaS0tKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHBTY2FubGluZVszLWldID0gRElWMjU1QjgocyAqIHBEYXRhbGluZVsyLWldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICAgIHBTY2FubGluZVsxXSA9IERJVjI1NUI4KHMgKiBwRGF0YWxpbmVbMF0pOworICAgICAgICAgICAgICBwU2NhbmxpbmVbMl0gPSBESVYyNTVCOChzICogcERhdGFsaW5lWzFdKTsKKwkJICAgICAgcFNjYW5saW5lWzNdID0gRElWMjU1QjgocyAqIHBEYXRhbGluZVsyXSk7CisjZW5kaWYKKwkJCX0KKwkJICB9CisKKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jIDw8IDIpOworICAgICAgICAgIHBEYXRhbGluZSArPSA0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBpZiAocERhdGEtPmJJc1JHQkExNikgICAgICAgICAgICAvKiAxNi1iaXQgaW5wdXQgcm93ID8gKi8KKyAgICAgIHsKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pQ29sOyBpWCA8IHBEYXRhLT5pU291cmNlcjsKKyAgICAgICAgICAgICBpWCArPSBwRGF0YS0+aUNvbGluYykKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCBhbHBoYSB2YWx1ZXMgKi8KKyAgICAgICAgICBpZiAoKHMgPSBwRGF0YWxpbmVbNl0pICE9IDApICAgICAgIC8qIGFueSBvcGFjaXR5IGF0IGFsbCA/ICovCisgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmdWxseSBvcGFxdWUgb3IgYmFja2dyb3VuZCBmdWxseSB0cmFuc3BhcmVudCA/ICovCisgICAgICAgICAgICBpZiAocyA9PSAyNTUpCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwbGFpbiBjb3B5IGl0ICovCisgICAgICAgICAgICAgIHBTY2FubGluZVswXSA9IDI1NTsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzFdID0gcERhdGFsaW5lWzBdOworICAgICAgICAgICAgICBwU2NhbmxpbmVbMl0gPSBwRGF0YWxpbmVbMl07CisgICAgICAgICAgICAgIHBTY2FubGluZVszXSA9IHBEYXRhbGluZVs0XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdyBibGVuZCAocHJlbXVsdGlwbGllZCkgKi8KKwkJCSAgdCA9IDI1NSAtIHM7CisgICAgICAgICAgICAgIHBTY2FubGluZVswXSA9IChtbmdfdWludDgpKDI1NSAtIERJVjI1NUI4KHQgKiAoMjU1IC0gcFNjYW5saW5lWzBdKSkpOworI2lmZGVmIE1OR19PUFRJTUlaRV9GT09UUFJJTlRfRElWCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICBmb3IgKGk9MjsgaSA+PSAwOyBpLS0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcFNjYW5saW5lWzMtaV0gPSBESVYyNTVCOChzICogcERhdGFsaW5lWzQtaS1pXSArIHQgKgorICAgICAgICAgICAgICAgICAgICAgcFNjYW5saW5lWzMtaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzFdID0gRElWMjU1QjgocyAqIHBEYXRhbGluZVswXSArIHQgKiBwU2NhbmxpbmVbMV0pOworICAgICAgICAgICAgICBwU2NhbmxpbmVbMl0gPSBESVYyNTVCOChzICogcERhdGFsaW5lWzJdICsgdCAqIHBTY2FubGluZVsyXSk7CisJCQkgIHBTY2FubGluZVszXSA9IERJVjI1NUI4KHMgKiBwRGF0YWxpbmVbNF0gKyB0ICogcFNjYW5saW5lWzNdKTsKKyNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIHBTY2FubGluZSArPSAocERhdGEtPmlDb2xpbmMgPDwgMik7CisgICAgICAgICAgcERhdGFsaW5lICs9IDg7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pQ29sOyBpWCA8IHBEYXRhLT5pU291cmNlcjsKKyAgICAgICAgICAgICBpWCArPSBwRGF0YS0+aUNvbGluYykKKyAgICAgICAgeworICAgICAgICAgIGlmICgocyA9IHBEYXRhbGluZVszXSkgIT0gMCkgICAgICAgLyogYW55IG9wYWNpdHkgYXQgYWxsID8gKi8KKyAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZ1bGx5IG9wYXF1ZSA/ICovCisgICAgICAgICAgICBpZiAocyA9PSAyNTUpCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGVuIHNpbXBseSBjb3B5IHRoZSB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgcFNjYW5saW5lWzBdID0gMjU1OworICAgICAgICAgICAgICBwU2NhbmxpbmVbMV0gPSBwRGF0YWxpbmVbMF07CisgICAgICAgICAgICAgIHBTY2FubGluZVsyXSA9IHBEYXRhbGluZVsxXTsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzNdID0gcERhdGFsaW5lWzJdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm93IGJsZW5kIChwcmVtdWx0aXBsaWVkKSAqLworCQkJICB0ID0gMjU1IC0gczsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzBdID0gKG1uZ191aW50OCkoMjU1IC0gRElWMjU1QjgodCAqICgyNTUgLSBwU2NhbmxpbmVbMF0pKSk7CisjaWZkZWYgTU5HX09QVElNSVpFX0ZPT1RQUklOVF9ESVYKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgIGZvciAoaT0yOyBpID49IDA7IGktLSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBwU2NhbmxpbmVbMy1pXSA9IERJVjI1NUI4KHMgKiBwRGF0YWxpbmVbMi1pXSArIHQgKgorICAgICAgICAgICAgICAgICAgICAgcFNjYW5saW5lWzMtaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzFdID0gRElWMjU1QjgocyAqIHBEYXRhbGluZVswXSArIHQgKiBwU2NhbmxpbmVbMV0pOworICAgICAgICAgICAgICBwU2NhbmxpbmVbMl0gPSBESVYyNTVCOChzICogcERhdGFsaW5lWzFdICsgdCAqIHBTY2FubGluZVsyXSk7CisJCQkgIHBTY2FubGluZVszXSA9IERJVjI1NUI4KHMgKiBwRGF0YWxpbmVbMl0gKyB0ICogcFNjYW5saW5lWzNdKTsKKyNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIHBTY2FubGluZSArPSAocERhdGEtPmlDb2xpbmMgPDwgMik7CisgICAgICAgICAgcERhdGFsaW5lICs9IDQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBjaGVja191cGRhdGVfcmVnaW9uIChwRGF0YSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRElTUExBWV9BUkdCOF9QTSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYgLyogTU5HX09QVElNSVpFX0ZPT1RQUklOVF9DT01QT1NFICovCisjZWxzZSAvKiBNTkdfTk9fMTZCSVRfU1VQUE9SVCAqLworbW5nX3JldGNvZGUgbW5nX2Rpc3BsYXlfYXJnYjhfcG0gKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX3VpbnQ4cCBwU2NhbmxpbmU7CisgIG1uZ191aW50OHAgcERhdGFsaW5lOworICBtbmdfaW50MzIgIGlYOworICBtbmdfdWludDMyIHMsIHQ7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRElTUExBWV9BUkdCOF9QTSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdmlld2FibGUgcm93ID8gKi8KKyAgaWYgKChwRGF0YS0+aVJvdyA+PSBwRGF0YS0+aVNvdXJjZXQpICYmIChwRGF0YS0+aVJvdyA8IHBEYXRhLT5pU291cmNlYikpCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGRyZXNzIGRlc3RpbmF0aW9uIHJvdyAqLworICAgIHBTY2FubGluZSA9IChtbmdfdWludDhwKXBEYXRhLT5mR2V0Y2FudmFzbGluZSAoKChtbmdfaGFuZGxlKXBEYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pUm93ICsgcERhdGEtPmlEZXN0dCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aVNvdXJjZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRqdXN0IGRlc3RpbmF0aW9uIHJvdyBzdGFydGluZy1wb2ludCAqLworICAgIHBTY2FubGluZSA9IHBTY2FubGluZSArIChwRGF0YS0+aUNvbCA8PCAyKSArIChwRGF0YS0+aURlc3RsIDw8IDIpOworICAgIHBEYXRhbGluZSA9IHBEYXRhLT5wUkdCQXJvdzsgICAgICAgLyogYWRkcmVzcyBzb3VyY2Ugcm93ICovCisKKyAgICAgIHBEYXRhbGluZSA9IHBEYXRhbGluZSArICgocERhdGEtPmlTb3VyY2VsIC8gcERhdGEtPmlDb2xpbmMpIDw8IDIpOworCisgICAgaWYgKHBEYXRhLT5iSXNPcGFxdWUpICAgICAgICAgICAgICAvKiBmb3JnZXQgYWJvdXQgdHJhbnNwYXJlbmN5ID8gKi8KKyAgICB7CisgICAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3B5IHRoZSB2YWx1ZXMgYW5kIHByZW11bHRpcGx5ICovCisJCSAgaWYgKChzID0gcERhdGFsaW5lWzNdKSA9PSAwKQorCQkJKihtbmdfdWludDMyKikgcFNjYW5saW5lID0gMDsgLyogc2V0IGFsbCBjb21wb25lbnRzID0gMCAqLworCQkgIGVsc2UKKwkJICB7CisJCQlpZiAocyA9PSAyNTUpCisJCQl7CisgICAgICAgICAgICAgIHBTY2FubGluZVswXSA9IDI1NTsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzFdID0gcERhdGFsaW5lWzBdOworICAgICAgICAgICAgICBwU2NhbmxpbmVbMl0gPSBwRGF0YWxpbmVbMV07CisJCSAgICAgIHBTY2FubGluZVszXSA9IHBEYXRhbGluZVsyXTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzBdID0gKG1uZ191aW50OClzOworI2lmZGVmIE1OR19PUFRJTUlaRV9GT09UUFJJTlRfRElWCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICBmb3IgKGk9MjsgaSA+PSAwOyBpLS0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcFNjYW5saW5lWzMtaV0gPSBESVYyNTVCOChzICogcERhdGFsaW5lWzItaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzFdID0gRElWMjU1QjgocyAqIHBEYXRhbGluZVswXSk7CisgICAgICAgICAgICAgIHBTY2FubGluZVsyXSA9IERJVjI1NUI4KHMgKiBwRGF0YWxpbmVbMV0pOworCQkgICAgICBwU2NhbmxpbmVbM10gPSBESVYyNTVCOChzICogcERhdGFsaW5lWzJdKTsKKyNlbmRpZgorCQkJfQorCQkgIH0KKworICAgICAgICAgIHBTY2FubGluZSArPSAocERhdGEtPmlDb2xpbmMgPDwgMik7CisgICAgICAgICAgcERhdGFsaW5lICs9IDQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHsKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pQ29sOyBpWCA8IHBEYXRhLT5pU291cmNlcjsKKyAgICAgICAgICAgICBpWCArPSBwRGF0YS0+aUNvbGluYykKKyAgICAgICAgeworICAgICAgICAgIGlmICgocyA9IHBEYXRhbGluZVszXSkgIT0gMCkgICAgICAgLyogYW55IG9wYWNpdHkgYXQgYWxsID8gKi8KKyAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZ1bGx5IG9wYXF1ZSA/ICovCisgICAgICAgICAgICBpZiAocyA9PSAyNTUpCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGVuIHNpbXBseSBjb3B5IHRoZSB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgcFNjYW5saW5lWzBdID0gMjU1OworICAgICAgICAgICAgICBwU2NhbmxpbmVbMV0gPSBwRGF0YWxpbmVbMF07CisgICAgICAgICAgICAgIHBTY2FubGluZVsyXSA9IHBEYXRhbGluZVsxXTsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzNdID0gcERhdGFsaW5lWzJdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm93IGJsZW5kIChwcmVtdWx0aXBsaWVkKSAqLworCQkJICB0ID0gMjU1IC0gczsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzBdID0gKG1uZ191aW50OCkoMjU1IC0gRElWMjU1QjgodCAqICgyNTUgLSBwU2NhbmxpbmVbMF0pKSk7CisjaWZkZWYgTU5HX09QVElNSVpFX0ZPT1RQUklOVF9ESVYKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgIGZvciAoaT0yOyBpID49IDA7IGktLSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBwU2NhbmxpbmVbMy1pXSA9IERJVjI1NUI4KHMgKiBwRGF0YWxpbmVbMi1pXSArIHQgKgorICAgICAgICAgICAgICAgICAgICAgcFNjYW5saW5lWzMtaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzFdID0gRElWMjU1QjgocyAqIHBEYXRhbGluZVswXSArIHQgKiBwU2NhbmxpbmVbMV0pOworICAgICAgICAgICAgICBwU2NhbmxpbmVbMl0gPSBESVYyNTVCOChzICogcERhdGFsaW5lWzFdICsgdCAqIHBTY2FubGluZVsyXSk7CisJCQkgIHBTY2FubGluZVszXSA9IERJVjI1NUI4KHMgKiBwRGF0YWxpbmVbMl0gKyB0ICogcFNjYW5saW5lWzNdKTsKKyNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIHBTY2FubGluZSArPSAocERhdGEtPmlDb2xpbmMgPDwgMik7CisgICAgICAgICAgcERhdGFsaW5lICs9IDQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBjaGVja191cGRhdGVfcmVnaW9uIChwRGF0YSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRElTUExBWV9BUkdCOF9QTSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYgLyogTU5HX05PXzE2QklUX1NVUFBPUlQgKi8KKyNlbmRpZiAvKiBNTkdfU0tJUENBTlZBU19BUkdCOF9QTSAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0FOVkFTX1JHQjhfQTgKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyNpZm5kZWYgTU5HX09QVElNSVpFX0ZPT1RQUklOVF9DT01QT1NFCittbmdfcmV0Y29kZSBtbmdfZGlzcGxheV9yZ2I4X2E4IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ191aW50OHAgcFNjYW5saW5lOworICBtbmdfdWludDhwIHBBbHBoYWxpbmU7CisgIG1uZ191aW50OHAgcERhdGFsaW5lOworICBtbmdfaW50MzIgIGlYOworICBtbmdfdWludDggIGlGR2E4LCBpQkdhOCwgaUNhODsKKyAgbW5nX3VpbnQxNiBpRkdhMTYsIGlCR2ExNiwgaUNhMTY7CisgIG1uZ191aW50MTYgaUZHcjE2LCBpRkdnMTYsIGlGR2IxNjsKKyAgbW5nX3VpbnQxNiBpQkdyMTYsIGlCR2cxNiwgaUJHYjE2OworICBtbmdfdWludDE2IGlDcjE2LCBpQ2cxNiwgaUNiMTY7CisgIG1uZ191aW50OCAgaUNyOCwgaUNnOCwgaUNiODsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ESVNQTEFZX1JHQjhfQTgsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZpZXdhYmxlIHJvdyA/ICovCisgIGlmICgocERhdGEtPmlSb3cgPj0gcERhdGEtPmlTb3VyY2V0KSAmJiAocERhdGEtPmlSb3cgPCBwRGF0YS0+aVNvdXJjZWIpKQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkcmVzcyBkZXN0aW5hdGlvbiByb3dzICovCisgICAgcFNjYW5saW5lICA9IChtbmdfdWludDhwKXBEYXRhLT5mR2V0Y2FudmFzbGluZSAoKChtbmdfaGFuZGxlKXBEYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aVJvdyArIHBEYXRhLT5pRGVzdHQgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pU291cmNldCk7CisgICAgcEFscGhhbGluZSA9IChtbmdfdWludDhwKXBEYXRhLT5mR2V0YWxwaGFsaW5lICAoKChtbmdfaGFuZGxlKXBEYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aVJvdyArIHBEYXRhLT5pRGVzdHQgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pU291cmNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGp1c3QgZGVzdGluYXRpb24gcm93cyBzdGFydGluZy1wb2ludCAqLworICAgIHBTY2FubGluZSAgPSBwU2NhbmxpbmUgICsgKHBEYXRhLT5pQ29sICogMykgKyAocERhdGEtPmlEZXN0bCAqIDMpOworICAgIHBBbHBoYWxpbmUgPSBwQWxwaGFsaW5lICsgcERhdGEtPmlDb2wgKyBwRGF0YS0+aURlc3RsOworCisgICAgcERhdGFsaW5lICA9IHBEYXRhLT5wUkdCQXJvdzsgICAgICAvKiBhZGRyZXNzIHNvdXJjZSByb3cgKi8KKworICAgIGlmIChwRGF0YS0+YklzUkdCQTE2KSAgICAgICAgICAgICAgLyogYWRqdXN0IHNvdXJjZSByb3cgc3RhcnRpbmctcG9pbnQgKi8KKyAgICAgIHBEYXRhbGluZSA9IHBEYXRhbGluZSArICgocERhdGEtPmlTb3VyY2VsIC8gcERhdGEtPmlDb2xpbmMpIDw8IDMpOworICAgIGVsc2UKKyAgICAgIHBEYXRhbGluZSA9IHBEYXRhbGluZSArICgocERhdGEtPmlTb3VyY2VsIC8gcERhdGEtPmlDb2xpbmMpIDw8IDIpOworCisgICAgaWYgKHBEYXRhLT5iSXNPcGFxdWUpICAgICAgICAgICAgICAvKiBmb3JnZXQgYWJvdXQgdHJhbnNwYXJlbmN5ID8gKi8KKyAgICB7CisgICAgICBpZiAocERhdGEtPmJJc1JHQkExNikgICAgICAgICAgICAvKiAxNi1iaXQgaW5wdXQgcm93ID8gKi8KKyAgICAgIHsKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pQ29sOyBpWCA8IHBEYXRhLT5pU291cmNlcjsKKyAgICAgICAgICAgICBpWCArPSBwRGF0YS0+aUNvbGluYykKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjYWxlIGRvd24gYnkgZHJvcHBpbmcgdGhlIExTQiAqLworICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKnBEYXRhbGluZTsKKyAgICAgICAgICAqKHBTY2FubGluZSsxKSA9ICoocERhdGFsaW5lKzIpOworICAgICAgICAgICoocFNjYW5saW5lKzIpID0gKihwRGF0YWxpbmUrNCk7CisgICAgICAgICAgKnBBbHBoYWxpbmUgICAgPSAqKHBEYXRhbGluZSs2KTsKKworICAgICAgICAgIHBTY2FubGluZSAgKz0gKHBEYXRhLT5pQ29saW5jICogMyk7CisgICAgICAgICAgcEFscGhhbGluZSArPSBwRGF0YS0+aUNvbGluYzsKKyAgICAgICAgICBwRGF0YWxpbmUgICs9IDg7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pQ29sOyBpWCA8IHBEYXRhLT5pU291cmNlcjsKKyAgICAgICAgICAgICBpWCArPSBwRGF0YS0+aUNvbGluYykKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvcHkgdGhlIHZhbHVlcyAqLworICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKnBEYXRhbGluZTsKKyAgICAgICAgICAqKHBTY2FubGluZSsxKSA9ICoocERhdGFsaW5lKzEpOworICAgICAgICAgICoocFNjYW5saW5lKzIpID0gKihwRGF0YWxpbmUrMik7CisgICAgICAgICAgKnBBbHBoYWxpbmUgICAgPSAqKHBEYXRhbGluZSszKTsKKworICAgICAgICAgIHBTY2FubGluZSAgKz0gKHBEYXRhLT5pQ29saW5jICogMyk7CisgICAgICAgICAgcEFscGhhbGluZSArPSBwRGF0YS0+aUNvbGluYzsKKyAgICAgICAgICBwRGF0YWxpbmUgICs9IDQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGlmIChwRGF0YS0+YklzUkdCQTE2KSAgICAgICAgICAgIC8qIDE2LWJpdCBpbnB1dCByb3cgPyAqLworICAgICAgeworICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlTb3VyY2VsICsgcERhdGEtPmlDb2w7IGlYIDwgcERhdGEtPmlTb3VyY2VyOworICAgICAgICAgICAgIGlYICs9IHBEYXRhLT5pQ29saW5jKQorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0IGFscGhhIHZhbHVlcyAqLworICAgICAgICAgIGlGR2ExNiA9IG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUrNik7CisgICAgICAgICAgaUJHYTE2ID0gKG1uZ191aW50MTYpKCpwQWxwaGFsaW5lKTsKKyAgICAgICAgICBpQkdhMTYgPSAobW5nX3VpbnQxNikoaUJHYTE2IDw8IDgpIHwgaUJHYTE2OworCisgICAgICAgICAgaWYgKGlGR2ExNikgICAgICAgICAgICAgICAgICAvKiBhbnkgb3BhY2l0eSBhdCBhbGwgPyAqLworICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZnVsbHkgb3BhcXVlIG9yIGJhY2tncm91bmQgZnVsbHkgdHJhbnNwYXJlbnQgPyAqLworICAgICAgICAgICAgaWYgKChpRkdhMTYgPT0gMHhGRkZGKSB8fCAoaUJHYTE2ID09IDApKQorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGxhaW4gY29weSBpdCAqLworICAgICAgICAgICAgICAqcFNjYW5saW5lICAgICA9ICpwRGF0YWxpbmU7CisgICAgICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKihwRGF0YWxpbmUrMik7CisgICAgICAgICAgICAgICoocFNjYW5saW5lKzIpID0gKihwRGF0YWxpbmUrNCk7CisgICAgICAgICAgICAgICpwQWxwaGFsaW5lICAgID0gKihwRGF0YWxpbmUrNik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChpQkdhMTYgPT0gMHhGRkZGKSAgICAvKiBiYWNrZ3JvdW5kIGZ1bGx5IG9wYXF1ZSA/ICovCisgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgdGhlIHByb3BlciB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgICBpRkdyMTYgPSBtbmdfZ2V0X3VpbnQxNiAocERhdGFsaW5lICApOworICAgICAgICAgICAgICAgIGlGR2cxNiA9IG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUrMik7CisgICAgICAgICAgICAgICAgaUZHYjE2ID0gbW5nX2dldF91aW50MTYgKHBEYXRhbGluZSs0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjYWxlIGJhY2tncm91bmQgdXAgKi8KKyAgICAgICAgICAgICAgICBpQkdyMTYgPSAobW5nX3VpbnQxNikoKnBTY2FubGluZSAgICApOworICAgICAgICAgICAgICAgIGlCR2cxNiA9IChtbmdfdWludDE2KSgqKHBTY2FubGluZSsxKSk7CisgICAgICAgICAgICAgICAgaUJHYjE2ID0gKG1uZ191aW50MTYpKCoocFNjYW5saW5lKzIpKTsKKyAgICAgICAgICAgICAgICBpQkdyMTYgPSAobW5nX3VpbnQxNikoKG1uZ191aW50MzIpaUJHcjE2IDw8IDgpIHwgaUJHcjE2OworICAgICAgICAgICAgICAgIGlCR2cxNiA9IChtbmdfdWludDE2KSgobW5nX3VpbnQzMilpQkdnMTYgPDwgOCkgfCBpQkdnMTY7CisgICAgICAgICAgICAgICAgaUJHYjE2ID0gKG1uZ191aW50MTYpKChtbmdfdWludDMyKWlCR2IxNiA8PCA4KSB8IGlCR2IxNjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdyBjb21wb3NlICovCisgICAgICAgICAgICAgICAgTU5HX0NPTVBPU0UxNihpRkdyMTYsIGlGR3IxNiwgaUZHYTE2LCBpQkdyMTYpOworICAgICAgICAgICAgICAgIE1OR19DT01QT1NFMTYoaUZHZzE2LCBpRkdnMTYsIGlGR2ExNiwgaUJHZzE2KTsKKyAgICAgICAgICAgICAgICBNTkdfQ09NUE9TRTE2KGlGR2IxNiwgaUZHYjE2LCBpRkdhMTYsIGlCR2IxNik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgcmV0dXJuIHRoZSBjb21wb3NlZCB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgICAqcFNjYW5saW5lICAgICA9IChtbmdfdWludDgpKGlGR3IxNiA+PiA4KTsKKyAgICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9IChtbmdfdWludDgpKGlGR2cxNiA+PiA4KTsKKyAgICAgICAgICAgICAgICAqKHBTY2FubGluZSsyKSA9IChtbmdfdWludDgpKGlGR2IxNiA+PiA4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFscGhhIHJlbWFpbnMgZnVsbHkgb3BhcXVlICEhISAqLworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjYWxlIGJhY2tncm91bmQgdXAgKi8KKyAgICAgICAgICAgICAgICBpQkdyMTYgPSAobW5nX3VpbnQxNikoKnBTY2FubGluZSAgICApOworICAgICAgICAgICAgICAgIGlCR2cxNiA9IChtbmdfdWludDE2KSgqKHBTY2FubGluZSsxKSk7CisgICAgICAgICAgICAgICAgaUJHYjE2ID0gKG1uZ191aW50MTYpKCoocFNjYW5saW5lKzIpKTsKKyAgICAgICAgICAgICAgICBpQkdyMTYgPSAobW5nX3VpbnQxNikoKG1uZ191aW50MzIpaUJHcjE2IDw8IDgpIHwgaUJHcjE2OworICAgICAgICAgICAgICAgIGlCR2cxNiA9IChtbmdfdWludDE2KSgobW5nX3VpbnQzMilpQkdnMTYgPDwgOCkgfCBpQkdnMTY7CisgICAgICAgICAgICAgICAgaUJHYjE2ID0gKG1uZ191aW50MTYpKChtbmdfdWludDMyKWlCR2IxNiA8PCA4KSB8IGlCR2IxNjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxldCdzIGJsZW5kICovCisgICAgICAgICAgICAgICAgTU5HX0JMRU5EMTYgKG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUgICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUrMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUrNCksIGlGR2ExNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUJHcjE2LCBpQkdnMTYsIGlCR2IxNiwgaUJHYTE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpQ3IxNiwgIGlDZzE2LCAgaUNiMTYsICBpQ2ExNik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgcmV0dXJuIHRoZSBjb21wb3NlZCB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgICAqcFNjYW5saW5lICAgICA9IChtbmdfdWludDgpKGlDcjE2ID4+IDgpOworICAgICAgICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKG1uZ191aW50OCkoaUNnMTYgPj4gOCk7CisgICAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMikgPSAobW5nX3VpbnQ4KShpQ2IxNiA+PiA4KTsKKyAgICAgICAgICAgICAgICAqcEFscGhhbGluZSAgICA9IChtbmdfdWludDgpKGlDYTE2ID4+IDgpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgcFNjYW5saW5lICArPSAocERhdGEtPmlDb2xpbmMgKiAzKTsKKyAgICAgICAgICBwQWxwaGFsaW5lICs9IHBEYXRhLT5pQ29saW5jOworICAgICAgICAgIHBEYXRhbGluZSAgKz0gODsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlTb3VyY2VsICsgcERhdGEtPmlDb2w7IGlYIDwgcERhdGEtPmlTb3VyY2VyOworICAgICAgICAgICAgIGlYICs9IHBEYXRhLT5pQ29saW5jKQorICAgICAgICB7CisgICAgICAgICAgaUZHYTggPSAqKHBEYXRhbGluZSszKTsgICAgICAvKiBnZXQgYWxwaGEgdmFsdWVzICovCisgICAgICAgICAgaUJHYTggPSAqcEFscGhhbGluZTsKKworICAgICAgICAgIGlmIChpRkdhOCkgICAgICAgICAgICAgICAgICAgLyogYW55IG9wYWNpdHkgYXQgYWxsID8gKi8KKyAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZ1bGx5IG9wYXF1ZSBvciBiYWNrZ3JvdW5kIGZ1bGx5IHRyYW5zcGFyZW50ID8gKi8KKyAgICAgICAgICAgIGlmICgoaUZHYTggPT0gMHhGRikgfHwgKGlCR2E4ID09IDApKQorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlbiBzaW1wbHkgY29weSB0aGUgdmFsdWVzICovCisgICAgICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKnBEYXRhbGluZTsKKyAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAqKHBEYXRhbGluZSsxKTsKKyAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMikgPSAqKHBEYXRhbGluZSsyKTsKKyAgICAgICAgICAgICAgKnBBbHBoYWxpbmUgICAgPSAqKHBEYXRhbGluZSszKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKGlCR2E4ID09IDB4RkYpICAgICAgIC8qIGJhY2tncm91bmQgZnVsbHkgb3BhcXVlID8gKi8KKyAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvIGFscGhhIGNvbXBvc2luZyAqLworICAgICAgICAgICAgICAgIE1OR19DT01QT1NFOCAoKnBTY2FubGluZSwgICAgICpwRGF0YWxpbmUsICAgICBpRkdhOCwgKnBTY2FubGluZSAgICApOworICAgICAgICAgICAgICAgIE1OR19DT01QT1NFOCAoKihwU2NhbmxpbmUrMSksICoocERhdGFsaW5lKzEpLCBpRkdhOCwgKihwU2NhbmxpbmUrMSkpOworICAgICAgICAgICAgICAgIE1OR19DT01QT1NFOCAoKihwU2NhbmxpbmUrMiksICoocERhdGFsaW5lKzIpLCBpRkdhOCwgKihwU2NhbmxpbmUrMikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWxwaGEgcmVtYWlucyBmdWxseSBvcGFxdWUgISEhICovCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogbm93IGJsZW5kICovCisgICAgICAgICAgICAgICAgTU5HX0JMRU5EOCAoKnBEYXRhbGluZSwgKihwRGF0YWxpbmUrMSksICoocERhdGFsaW5lKzIpLCBpRkdhOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcFNjYW5saW5lLCAqKHBTY2FubGluZSsxKSwgKihwU2NhbmxpbmUrMiksIGlCR2E4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlDcjgsIGlDZzgsIGlDYjgsIGlDYTgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHJldHVybiB0aGUgY29tcG9zZWQgdmFsdWVzICovCisgICAgICAgICAgICAgICAgKnBTY2FubGluZSAgICAgPSBpQ3I4OworICAgICAgICAgICAgICAgICoocFNjYW5saW5lKzEpID0gaUNnODsKKyAgICAgICAgICAgICAgICAqKHBTY2FubGluZSsyKSA9IGlDYjg7CisgICAgICAgICAgICAgICAgKnBBbHBoYWxpbmUgICAgPSBpQ2E4OworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgcFNjYW5saW5lICArPSAocERhdGEtPmlDb2xpbmMgKiAzKTsKKyAgICAgICAgICBwQWxwaGFsaW5lICs9IHBEYXRhLT5pQ29saW5jOworICAgICAgICAgIHBEYXRhbGluZSAgKz0gNDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIGNoZWNrX3VwZGF0ZV9yZWdpb24gKHBEYXRhKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ESVNQTEFZX1JHQjhfQTgsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2Vsc2UgLyogTU5HX09QVElNSVpFX0ZPT1RQUklOVF9DT01QT1NFICovCittbmdfcmV0Y29kZSBtbmdfZGlzcGxheV9yZ2I4X2E4IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ191aW50OHAgcFNjYW5saW5lOworICBtbmdfdWludDhwIHBBbHBoYWxpbmU7CisgIG1uZ191aW50OHAgcERhdGFsaW5lOworICBtbmdfaW50MzIgIGlYOworICBtbmdfdWludDggIGlGR2E4LCBpQkdhOCwgaUNhODsKKyAgbW5nX3VpbnQxNiBpRkdhMTYsIGlCR2ExNiwgaUNhMTY7CisgIG1uZ191aW50MTYgaUZHZzE2OworICBtbmdfdWludDE2IGlCR3IxNiwgaUJHZzE2LCBpQkdiMTY7CisgIG1uZ191aW50MTYgaUNyMTYsIGlDZzE2LCBpQ2IxNjsKKyAgbW5nX3VpbnQ4ICBpQ3I4LCBpQ2c4LCBpQ2I4OworICBtbmdfdWludDggIGlCcHM7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRElTUExBWV9SR0I4X0E4LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaUJwcz0obW5nX3VpbnQ4KShwRGF0YS0+YklzUkdCQTE2ID8gMjoxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZpZXdhYmxlIHJvdyA/ICovCisgIGlmICgocERhdGEtPmlSb3cgPj0gcERhdGEtPmlTb3VyY2V0KSAmJiAocERhdGEtPmlSb3cgPCBwRGF0YS0+aVNvdXJjZWIpKQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkcmVzcyBkZXN0aW5hdGlvbiByb3dzICovCisgICAgcFNjYW5saW5lICA9IChtbmdfdWludDhwKXBEYXRhLT5mR2V0Y2FudmFzbGluZSAoKChtbmdfaGFuZGxlKXBEYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aVJvdyArIHBEYXRhLT5pRGVzdHQgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pU291cmNldCk7CisgICAgcEFscGhhbGluZSA9IChtbmdfdWludDhwKXBEYXRhLT5mR2V0YWxwaGFsaW5lICAoKChtbmdfaGFuZGxlKXBEYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aVJvdyArIHBEYXRhLT5pRGVzdHQgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pU291cmNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGp1c3QgZGVzdGluYXRpb24gcm93cyBzdGFydGluZy1wb2ludCAqLworICAgIHBTY2FubGluZSAgPSBwU2NhbmxpbmUgICsgKHBEYXRhLT5pQ29sICogMykgKyAocERhdGEtPmlEZXN0bCAqIDMpOworICAgIHBBbHBoYWxpbmUgPSBwQWxwaGFsaW5lICsgcERhdGEtPmlDb2wgKyBwRGF0YS0+aURlc3RsOworCisgICAgcERhdGFsaW5lICA9IHBEYXRhLT5wUkdCQXJvdzsgICAgICAvKiBhZGRyZXNzIHNvdXJjZSByb3cgKi8KKworICAgIC8qIGFkanVzdCBzb3VyY2Ugcm93IHN0YXJ0aW5nLXBvaW50ICovCisgICAgcERhdGFsaW5lID0gcERhdGFsaW5lICsgKChwRGF0YS0+aVNvdXJjZWwgLyBwRGF0YS0+aUNvbGluYykgPDwgKGlCcHMrMSkpOworCisgICAgaWYgKHBEYXRhLT5iSXNPcGFxdWUpICAgICAgICAgICAgICAvKiBmb3JnZXQgYWJvdXQgdHJhbnNwYXJlbmN5ID8gKi8KKyAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzY2FsZSBkb3duIGJ5IGRyb3BwaW5nIHRoZSBMU0IgKi8KKyAgICAgICAgICAqcFNjYW5saW5lICAgICA9ICpwRGF0YWxpbmU7CisgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAqKHBEYXRhbGluZStpQnBzKTsKKyAgICAgICAgICAqKHBTY2FubGluZSsyKSA9ICoocERhdGFsaW5lKzIqaUJwcyk7CisgICAgICAgICAgKnBBbHBoYWxpbmUgICAgPSAqKHBEYXRhbGluZSszKmlCcHMpOworCisgICAgICAgICAgcFNjYW5saW5lICArPSAocERhdGEtPmlDb2xpbmMgKiAzKTsKKyAgICAgICAgICBwQWxwaGFsaW5lICs9IHBEYXRhLT5pQ29saW5jOworICAgICAgICAgIHBEYXRhbGluZSAgKz0gNCppQnBzOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBpZiAocERhdGEtPmJJc1JHQkExNikgICAgICAgICAgICAvKiAxNi1iaXQgaW5wdXQgcm93ID8gKi8KKyAgICAgIHsKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pQ29sOyBpWCA8IHBEYXRhLT5pU291cmNlcjsKKyAgICAgICAgICAgICBpWCArPSBwRGF0YS0+aUNvbGluYykKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCBhbHBoYSB2YWx1ZXMgKi8KKyAgICAgICAgICBpRkdhMTYgPSBtbmdfZ2V0X3VpbnQxNiAocERhdGFsaW5lKzYpOworICAgICAgICAgIGlCR2ExNiA9IChtbmdfdWludDE2KSgqcEFscGhhbGluZSk7CisgICAgICAgICAgaUJHYTE2ID0gKG1uZ191aW50MTYpKGlCR2ExNiA8PCA4KSB8IGlCR2ExNjsKKworICAgICAgICAgIGlmIChpRkdhMTYpICAgICAgICAgICAgICAgICAgLyogYW55IG9wYWNpdHkgYXQgYWxsID8gKi8KKyAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZ1bGx5IG9wYXF1ZSBvciBiYWNrZ3JvdW5kIGZ1bGx5IHRyYW5zcGFyZW50ID8gKi8KKyAgICAgICAgICAgIGlmICgoaUZHYTE2ID09IDB4RkZGRikgfHwgKGlCR2ExNiA9PSAwKSkKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBsYWluIGNvcHkgaXQgKi8KKyAgICAgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAqcERhdGFsaW5lOworICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9ICoocERhdGFsaW5lKzIpOworICAgICAgICAgICAgICAqKHBTY2FubGluZSsyKSA9ICoocERhdGFsaW5lKzQpOworICAgICAgICAgICAgICAqcEFscGhhbGluZSAgICA9ICoocERhdGFsaW5lKzYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoaUJHYTE2ID09IDB4RkZGRikgICAgLyogYmFja2dyb3VuZCBmdWxseSBvcGFxdWUgPyAqLworICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0IHRoZSBwcm9wZXIgdmFsdWVzICovCisgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICBmb3IgKGk9MjsgaSA+PSAwOyBpLS0pCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpRkdnMTYgPSBtbmdfZ2V0X3VpbnQxNiAocERhdGFsaW5lK2kraSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzY2FsZSBiYWNrZ3JvdW5kIHVwICovCisgICAgICAgICAgICAgICAgaUJHZzE2ID0gKG1uZ191aW50MTYpKCoocFNjYW5saW5lK2kpKTsKKyAgICAgICAgICAgICAgICBpQkdnMTYgPSAobW5nX3VpbnQxNikoKG1uZ191aW50MzIpaUJHZzE2IDw8IDgpIHwgaUJHZzE2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm93IGNvbXBvc2UgKi8KKyAgICAgICAgICAgICAgICBNTkdfQ09NUE9TRTE2KGlGR2cxNiwgaUZHZzE2LCBpRkdhMTYsIGlCR2cxNik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgcmV0dXJuIHRoZSBjb21wb3NlZCB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgICAqKHBTY2FubGluZStpKSA9IChtbmdfdWludDgpKGlGR2cxNiA+PiA4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFscGhhIHJlbWFpbnMgZnVsbHkgb3BhcXVlICEhISAqLworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbGUgYmFja2dyb3VuZCB1cCAqLworICAgICAgICAgICAgICAgIGlCR3IxNiA9IChtbmdfdWludDE2KSgqcFNjYW5saW5lICAgICk7CisgICAgICAgICAgICAgICAgaUJHZzE2ID0gKG1uZ191aW50MTYpKCoocFNjYW5saW5lKzEpKTsKKyAgICAgICAgICAgICAgICBpQkdiMTYgPSAobW5nX3VpbnQxNikoKihwU2NhbmxpbmUrMikpOworICAgICAgICAgICAgICAgIGlCR3IxNiA9IChtbmdfdWludDE2KSgobW5nX3VpbnQzMilpQkdyMTYgPDwgOCkgfCBpQkdyMTY7CisgICAgICAgICAgICAgICAgaUJHZzE2ID0gKG1uZ191aW50MTYpKChtbmdfdWludDMyKWlCR2cxNiA8PCA4KSB8IGlCR2cxNjsKKyAgICAgICAgICAgICAgICBpQkdiMTYgPSAobW5nX3VpbnQxNikoKG1uZ191aW50MzIpaUJHYjE2IDw8IDgpIHwgaUJHYjE2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGV0J3MgYmxlbmQgKi8KKyAgICAgICAgICAgICAgICBNTkdfQkxFTkQxNiAobW5nX2dldF91aW50MTYgKHBEYXRhbGluZSAgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2dldF91aW50MTYgKHBEYXRhbGluZSsyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2dldF91aW50MTYgKHBEYXRhbGluZSs0KSwgaUZHYTE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpQkdyMTYsIGlCR2cxNiwgaUJHYjE2LCBpQkdhMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlDcjE2LCAgaUNnMTYsICBpQ2IxNiwgIGlDYTE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCByZXR1cm4gdGhlIGNvbXBvc2VkIHZhbHVlcyAqLworICAgICAgICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKG1uZ191aW50OCkoaUNyMTYgPj4gOCk7CisgICAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAobW5nX3VpbnQ4KShpQ2cxNiA+PiA4KTsKKyAgICAgICAgICAgICAgICAqKHBTY2FubGluZSsyKSA9IChtbmdfdWludDgpKGlDYjE2ID4+IDgpOworICAgICAgICAgICAgICAgICpwQWxwaGFsaW5lICAgID0gKG1uZ191aW50OCkoaUNhMTYgPj4gOCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBwU2NhbmxpbmUgICs9IChwRGF0YS0+aUNvbGluYyAqIDMpOworICAgICAgICAgIHBBbHBoYWxpbmUgKz0gcERhdGEtPmlDb2xpbmM7CisgICAgICAgICAgcERhdGFsaW5lICArPSA4OworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsKKyAgICAgICAgICBpRkdhOCA9ICoocERhdGFsaW5lKzMpOyAgICAgIC8qIGdldCBhbHBoYSB2YWx1ZXMgKi8KKyAgICAgICAgICBpQkdhOCA9ICpwQWxwaGFsaW5lOworCisgICAgICAgICAgaWYgKGlGR2E4KSAgICAgICAgICAgICAgICAgICAvKiBhbnkgb3BhY2l0eSBhdCBhbGwgPyAqLworICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZnVsbHkgb3BhcXVlIG9yIGJhY2tncm91bmQgZnVsbHkgdHJhbnNwYXJlbnQgPyAqLworICAgICAgICAgICAgaWYgKChpRkdhOCA9PSAweEZGKSB8fCAoaUJHYTggPT0gMCkpCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGVuIHNpbXBseSBjb3B5IHRoZSB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAqcERhdGFsaW5lOworICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9ICoocERhdGFsaW5lKzEpOworICAgICAgICAgICAgICAqKHBTY2FubGluZSsyKSA9ICoocERhdGFsaW5lKzIpOworICAgICAgICAgICAgICAqcEFscGhhbGluZSAgICA9ICoocERhdGFsaW5lKzMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoaUJHYTggPT0gMHhGRikgICAgICAgLyogYmFja2dyb3VuZCBmdWxseSBvcGFxdWUgPyAqLworICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogZG8gYWxwaGEgY29tcG9zaW5nICovCisgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICBmb3IgKGk9MjsgaSA+PSAwOyBpLS0pCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgTU5HX0NPTVBPU0U4ICgqKHBTY2FubGluZStpKSwgKihwRGF0YWxpbmUraSksIGlGR2E4LCAqKHBTY2FubGluZStpKSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFscGhhIHJlbWFpbnMgZnVsbHkgb3BhcXVlICEhISAqLworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdyBibGVuZCAqLworICAgICAgICAgICAgICAgIE1OR19CTEVORDggKCpwRGF0YWxpbmUsICoocERhdGFsaW5lKzEpLCAqKHBEYXRhbGluZSsyKSwgaUZHYTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBTY2FubGluZSwgKihwU2NhbmxpbmUrMSksICoocFNjYW5saW5lKzIpLCBpQkdhOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpQ3I4LCBpQ2c4LCBpQ2I4LCBpQ2E4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCByZXR1cm4gdGhlIGNvbXBvc2VkIHZhbHVlcyAqLworICAgICAgICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gaUNyODsKKyAgICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9IGlDZzg7CisgICAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMikgPSBpQ2I4OworICAgICAgICAgICAgICAgICpwQWxwaGFsaW5lICAgID0gaUNhODsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIHBTY2FubGluZSAgKz0gKHBEYXRhLT5pQ29saW5jICogMyk7CisgICAgICAgICAgcEFscGhhbGluZSArPSBwRGF0YS0+aUNvbGluYzsKKyAgICAgICAgICBwRGF0YWxpbmUgICs9IDQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBjaGVja191cGRhdGVfcmVnaW9uIChwRGF0YSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRElTUExBWV9SR0I4X0E4LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZiAvKiBNTkdfT1BUSU1JWkVfRk9PVFBSSU5UX0NPTVBPU0UgKi8KKyNlbHNlIC8qIE1OR19OT18xNkJJVF9TVVBQT1JUICovCittbmdfcmV0Y29kZSBtbmdfZGlzcGxheV9yZ2I4X2E4IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ191aW50OHAgcFNjYW5saW5lOworICBtbmdfdWludDhwIHBBbHBoYWxpbmU7CisgIG1uZ191aW50OHAgcERhdGFsaW5lOworICBtbmdfaW50MzIgIGlYOworICBtbmdfdWludDggIGlGR2E4LCBpQkdhOCwgaUNhODsKKyAgbW5nX3VpbnQ4ICBpQ3I4LCBpQ2c4LCBpQ2I4OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RJU1BMQVlfUkdCOF9BOCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdmlld2FibGUgcm93ID8gKi8KKyAgaWYgKChwRGF0YS0+aVJvdyA+PSBwRGF0YS0+aVNvdXJjZXQpICYmIChwRGF0YS0+aVJvdyA8IHBEYXRhLT5pU291cmNlYikpCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGRyZXNzIGRlc3RpbmF0aW9uIHJvd3MgKi8KKyAgICBwU2NhbmxpbmUgID0gKG1uZ191aW50OHApcERhdGEtPmZHZXRjYW52YXNsaW5lICgoKG1uZ19oYW5kbGUpcERhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pUm93ICsgcERhdGEtPmlEZXN0dCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlTb3VyY2V0KTsKKyAgICBwQWxwaGFsaW5lID0gKG1uZ191aW50OHApcERhdGEtPmZHZXRhbHBoYWxpbmUgICgoKG1uZ19oYW5kbGUpcERhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pUm93ICsgcERhdGEtPmlEZXN0dCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlTb3VyY2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkanVzdCBkZXN0aW5hdGlvbiByb3dzIHN0YXJ0aW5nLXBvaW50ICovCisgICAgcFNjYW5saW5lICA9IHBTY2FubGluZSAgKyAocERhdGEtPmlDb2wgKiAzKSArIChwRGF0YS0+aURlc3RsICogMyk7CisgICAgcEFscGhhbGluZSA9IHBBbHBoYWxpbmUgKyBwRGF0YS0+aUNvbCArIHBEYXRhLT5pRGVzdGw7CisKKyAgICBwRGF0YWxpbmUgID0gcERhdGEtPnBSR0JBcm93OyAgICAgIC8qIGFkZHJlc3Mgc291cmNlIHJvdyAqLworCisgICAgICBwRGF0YWxpbmUgPSBwRGF0YWxpbmUgKyAoKHBEYXRhLT5pU291cmNlbCAvIHBEYXRhLT5pQ29saW5jKSA8PCAyKTsKKworICAgIGlmIChwRGF0YS0+YklzT3BhcXVlKSAgICAgICAgICAgICAgLyogZm9yZ2V0IGFib3V0IHRyYW5zcGFyZW5jeSA/ICovCisgICAgeworICAgICAgeworICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlTb3VyY2VsICsgcERhdGEtPmlDb2w7IGlYIDwgcERhdGEtPmlTb3VyY2VyOworICAgICAgICAgICAgIGlYICs9IHBEYXRhLT5pQ29saW5jKQorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29weSB0aGUgdmFsdWVzICovCisgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAqcERhdGFsaW5lOworICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKihwRGF0YWxpbmUrMSk7CisgICAgICAgICAgKihwU2NhbmxpbmUrMikgPSAqKHBEYXRhbGluZSsyKTsKKyAgICAgICAgICAqcEFscGhhbGluZSAgICA9ICoocERhdGFsaW5lKzMpOworCisgICAgICAgICAgcFNjYW5saW5lICArPSAocERhdGEtPmlDb2xpbmMgKiAzKTsKKyAgICAgICAgICBwQWxwaGFsaW5lICs9IHBEYXRhLT5pQ29saW5jOworICAgICAgICAgIHBEYXRhbGluZSAgKz0gNDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgeworICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlTb3VyY2VsICsgcERhdGEtPmlDb2w7IGlYIDwgcERhdGEtPmlTb3VyY2VyOworICAgICAgICAgICAgIGlYICs9IHBEYXRhLT5pQ29saW5jKQorICAgICAgICB7CisgICAgICAgICAgaUZHYTggPSAqKHBEYXRhbGluZSszKTsgICAgICAvKiBnZXQgYWxwaGEgdmFsdWVzICovCisgICAgICAgICAgaUJHYTggPSAqcEFscGhhbGluZTsKKworICAgICAgICAgIGlmIChpRkdhOCkgICAgICAgICAgICAgICAgICAgLyogYW55IG9wYWNpdHkgYXQgYWxsID8gKi8KKyAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZ1bGx5IG9wYXF1ZSBvciBiYWNrZ3JvdW5kIGZ1bGx5IHRyYW5zcGFyZW50ID8gKi8KKyAgICAgICAgICAgIGlmICgoaUZHYTggPT0gMHhGRikgfHwgKGlCR2E4ID09IDApKQorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlbiBzaW1wbHkgY29weSB0aGUgdmFsdWVzICovCisgICAgICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKnBEYXRhbGluZTsKKyAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAqKHBEYXRhbGluZSsxKTsKKyAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMikgPSAqKHBEYXRhbGluZSsyKTsKKyAgICAgICAgICAgICAgKnBBbHBoYWxpbmUgICAgPSAqKHBEYXRhbGluZSszKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKGlCR2E4ID09IDB4RkYpICAgICAgIC8qIGJhY2tncm91bmQgZnVsbHkgb3BhcXVlID8gKi8KKyAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvIGFscGhhIGNvbXBvc2luZyAqLworI2lmZGVmIE1OR19PUFRJTUlaRV9GT09UUFJJTlRfQ09NUE9TRQorICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgZm9yIChpPTI7IGkgPj0gMDsgaS0tKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgIE1OR19DT01QT1NFOCAoKihwU2NhbmxpbmUraSksICoocERhdGFsaW5lK2kpLCBpRkdhOCwgKihwU2NhbmxpbmUraSkpOworICAgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgICAgIE1OR19DT01QT1NFOCAoKnBTY2FubGluZSwgICAgICpwRGF0YWxpbmUsICAgICBpRkdhOCwgKnBTY2FubGluZSAgICApOworICAgICAgICAgICAgICAgIE1OR19DT01QT1NFOCAoKihwU2NhbmxpbmUrMSksICoocERhdGFsaW5lKzEpLCBpRkdhOCwgKihwU2NhbmxpbmUrMSkpOworICAgICAgICAgICAgICAgIE1OR19DT01QT1NFOCAoKihwU2NhbmxpbmUrMiksICoocERhdGFsaW5lKzIpLCBpRkdhOCwgKihwU2NhbmxpbmUrMikpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbHBoYSByZW1haW5zIGZ1bGx5IG9wYXF1ZSAhISEgKi8KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3cgYmxlbmQgKi8KKyAgICAgICAgICAgICAgICBNTkdfQkxFTkQ4ICgqcERhdGFsaW5lLCAqKHBEYXRhbGluZSsxKSwgKihwRGF0YWxpbmUrMiksIGlGR2E4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwU2NhbmxpbmUsICoocFNjYW5saW5lKzEpLCAqKHBTY2FubGluZSsyKSwgaUJHYTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUNyOCwgaUNnOCwgaUNiOCwgaUNhOCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgcmV0dXJuIHRoZSBjb21wb3NlZCB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgICAqcFNjYW5saW5lICAgICA9IGlDcjg7CisgICAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSBpQ2c4OworICAgICAgICAgICAgICAgICoocFNjYW5saW5lKzIpID0gaUNiODsKKyAgICAgICAgICAgICAgICAqcEFscGhhbGluZSAgICA9IGlDYTg7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBwU2NhbmxpbmUgICs9IChwRGF0YS0+aUNvbGluYyAqIDMpOworICAgICAgICAgIHBBbHBoYWxpbmUgKz0gcERhdGEtPmlDb2xpbmM7CisgICAgICAgICAgcERhdGFsaW5lICArPSA0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgY2hlY2tfdXBkYXRlX3JlZ2lvbiAocERhdGEpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RJU1BMQVlfUkdCOF9BOCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYgLyogTU5HX05PXzE2QklUX1NVUFBPUlQgKi8KKyNlbmRpZiAvKiBNTkdfU0tJUENBTlZBU19SR0I4X0E4ICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDQU5WQVNfQkdSOAorI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorI2lmbmRlZiBNTkdfT1BUSU1JWkVfRk9PVFBSSU5UX0NPTVBPU0UKK21uZ19yZXRjb2RlIG1uZ19kaXNwbGF5X2JncjggKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX3VpbnQ4cCBwU2NhbmxpbmU7CisgIG1uZ191aW50OHAgcERhdGFsaW5lOworICBtbmdfaW50MzIgIGlYOworICBtbmdfdWludDE2IGlBMTY7CisgIG1uZ191aW50MTYgaUZHcjE2LCBpRkdnMTYsIGlGR2IxNjsKKyAgbW5nX3VpbnQxNiBpQkdyMTYsIGlCR2cxNiwgaUJHYjE2OworICBtbmdfdWludDggIGlBODsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ESVNQTEFZX0JHUjgsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZpZXdhYmxlIHJvdyA/ICovCisgIGlmICgocERhdGEtPmlSb3cgPj0gcERhdGEtPmlTb3VyY2V0KSAmJiAocERhdGEtPmlSb3cgPCBwRGF0YS0+aVNvdXJjZWIpKQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkcmVzcyBkZXN0aW5hdGlvbiByb3cgKi8KKyAgICBwU2NhbmxpbmUgPSAobW5nX3VpbnQ4cClwRGF0YS0+ZkdldGNhbnZhc2xpbmUgKCgobW5nX2hhbmRsZSlwRGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aVJvdyArIHBEYXRhLT5pRGVzdHQgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlTb3VyY2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkanVzdCBkZXN0aW5hdGlvbiByb3cgc3RhcnRpbmctcG9pbnQgKi8KKyAgICBwU2NhbmxpbmUgPSBwU2NhbmxpbmUgKyAocERhdGEtPmlDb2wgKiAzKSArIChwRGF0YS0+aURlc3RsICogMyk7CisgICAgcERhdGFsaW5lID0gcERhdGEtPnBSR0JBcm93OyAgICAgICAvKiBhZGRyZXNzIHNvdXJjZSByb3cgKi8KKworICAgIGlmIChwRGF0YS0+YklzUkdCQTE2KSAgICAgICAgICAgICAgLyogYWRqdXN0IHNvdXJjZSByb3cgc3RhcnRpbmctcG9pbnQgKi8KKyAgICAgIHBEYXRhbGluZSA9IHBEYXRhbGluZSArIChwRGF0YS0+aVNvdXJjZWwgLyBwRGF0YS0+aUNvbGluYykgKiA4OworICAgIGVsc2UKKyAgICAgIHBEYXRhbGluZSA9IHBEYXRhbGluZSArIChwRGF0YS0+aVNvdXJjZWwgLyBwRGF0YS0+aUNvbGluYykgKiA0OworCisgICAgaWYgKHBEYXRhLT5iSXNPcGFxdWUpICAgICAgICAgICAgICAvKiBmb3JnZXQgYWJvdXQgdHJhbnNwYXJlbmN5ID8gKi8KKyAgICB7CisgICAgICBpZiAocERhdGEtPmJJc1JHQkExNikgICAgICAgICAgICAvKiAxNi1iaXQgaW5wdXQgcm93ID8gKi8KKyAgICAgIHsKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pQ29sOyBpWCA8IHBEYXRhLT5pU291cmNlcjsKKyAgICAgICAgICAgICBpWCArPSBwRGF0YS0+aUNvbGluYykKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjYWxlIGRvd24gYnkgZHJvcHBpbmcgdGhlIExTQiAqLworICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKihwRGF0YWxpbmUrNCk7CisgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAqKHBEYXRhbGluZSsyKTsKKyAgICAgICAgICAqKHBTY2FubGluZSsyKSA9ICpwRGF0YWxpbmU7CisKKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jICogMyk7CisgICAgICAgICAgcERhdGFsaW5lICs9IDg7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pQ29sOyBpWCA8IHBEYXRhLT5pU291cmNlcjsKKyAgICAgICAgICAgICBpWCArPSBwRGF0YS0+aUNvbGluYykKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvcHkgdGhlIHZhbHVlcyAqLworICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKihwRGF0YWxpbmUrMik7CisgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAqKHBEYXRhbGluZSsxKTsKKyAgICAgICAgICAqKHBTY2FubGluZSsyKSA9ICpwRGF0YWxpbmU7CisKKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jICogMyk7CisgICAgICAgICAgcERhdGFsaW5lICs9IDQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGlmIChwRGF0YS0+YklzUkdCQTE2KSAgICAgICAgICAgIC8qIDE2LWJpdCBpbnB1dCByb3cgPyAqLworICAgICAgeworICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlTb3VyY2VsICsgcERhdGEtPmlDb2w7IGlYIDwgcERhdGEtPmlTb3VyY2VyOworICAgICAgICAgICAgIGlYICs9IHBEYXRhLT5pQ29saW5jKQorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0IGFscGhhIHZhbHVlICovCisgICAgICAgICAgaUExNiA9IG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUrNik7CisKKyAgICAgICAgICBpZiAoaUExNikgICAgICAgICAgICAgICAgICAgIC8qIGFueSBvcGFjaXR5IGF0IGFsbCA/ICovCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKGlBMTYgPT0gMHhGRkZGKSAgICAgICAgLyogZnVsbHkgb3BhcXVlID8gKi8KKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjYWxlIGRvd24gYnkgZHJvcHBpbmcgdGhlIExTQiAqLworICAgICAgICAgICAgICAqcFNjYW5saW5lICAgICA9ICoocERhdGFsaW5lKzQpOworICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9ICoocERhdGFsaW5lKzIpOworICAgICAgICAgICAgICAqKHBTY2FubGluZSsyKSA9ICpwRGF0YWxpbmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgdGhlIHByb3BlciB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgaUZHcjE2ID0gbW5nX2dldF91aW50MTYgKHBEYXRhbGluZSAgKTsKKyAgICAgICAgICAgICAgaUZHZzE2ID0gbW5nX2dldF91aW50MTYgKHBEYXRhbGluZSsyKTsKKyAgICAgICAgICAgICAgaUZHYjE2ID0gbW5nX2dldF91aW50MTYgKHBEYXRhbGluZSs0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjYWxlIGJhY2tncm91bmQgdXAgKi8KKyAgICAgICAgICAgICAgaUJHcjE2ID0gKG1uZ191aW50MTYpKCoocFNjYW5saW5lKzIpKTsKKyAgICAgICAgICAgICAgaUJHZzE2ID0gKG1uZ191aW50MTYpKCoocFNjYW5saW5lKzEpKTsKKyAgICAgICAgICAgICAgaUJHYjE2ID0gKG1uZ191aW50MTYpKCpwU2NhbmxpbmUgICAgKTsKKyAgICAgICAgICAgICAgaUJHcjE2ID0gKG1uZ191aW50MTYpKChtbmdfdWludDMyKWlCR3IxNiA8PCA4KSB8IGlCR3IxNjsKKyAgICAgICAgICAgICAgaUJHZzE2ID0gKG1uZ191aW50MTYpKChtbmdfdWludDMyKWlCR2cxNiA8PCA4KSB8IGlCR2cxNjsKKyAgICAgICAgICAgICAgaUJHYjE2ID0gKG1uZ191aW50MTYpKChtbmdfdWludDMyKWlCR2IxNiA8PCA4KSB8IGlCR2IxNjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdyBjb21wb3NlICovCisgICAgICAgICAgICAgIE1OR19DT01QT1NFMTYoaUZHcjE2LCBpRkdyMTYsIGlBMTYsIGlCR3IxNik7CisgICAgICAgICAgICAgIE1OR19DT01QT1NFMTYoaUZHZzE2LCBpRkdnMTYsIGlBMTYsIGlCR2cxNik7CisgICAgICAgICAgICAgIE1OR19DT01QT1NFMTYoaUZHYjE2LCBpRkdiMTYsIGlBMTYsIGlCR2IxNik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgcmV0dXJuIHRoZSBjb21wb3NlZCB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAobW5nX3VpbnQ4KShpRkdiMTYgPj4gOCk7CisgICAgICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKG1uZ191aW50OCkoaUZHZzE2ID4+IDgpOworICAgICAgICAgICAgICAqKHBTY2FubGluZSsyKSA9IChtbmdfdWludDgpKGlGR3IxNiA+PiA4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jICogMyk7CisgICAgICAgICAgcERhdGFsaW5lICs9IDg7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pQ29sOyBpWCA8IHBEYXRhLT5pU291cmNlcjsKKyAgICAgICAgICAgICBpWCArPSBwRGF0YS0+aUNvbGluYykKKyAgICAgICAgeworICAgICAgICAgIGlBOCA9ICoocERhdGFsaW5lKzMpOyAgICAgICAgLyogZ2V0IGFscGhhIHZhbHVlICovCisKKyAgICAgICAgICBpZiAoaUE4KSAgICAgICAgICAgICAgICAgICAgIC8qIGFueSBvcGFjaXR5IGF0IGFsbCA/ICovCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKGlBOCA9PSAweEZGKSAgICAgICAgICAgLyogZnVsbHkgb3BhcXVlID8gKi8KKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZW4gc2ltcGx5IGNvcHkgdGhlIHZhbHVlcyAqLworICAgICAgICAgICAgICAqcFNjYW5saW5lICAgICA9ICoocERhdGFsaW5lKzIpOworICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9ICoocERhdGFsaW5lKzEpOworICAgICAgICAgICAgICAqKHBTY2FubGluZSsyKSA9ICpwRGF0YWxpbmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkbyBhbHBoYSBjb21wb3NpbmcgKi8KKyAgICAgICAgICAgICAgTU5HX0NPTVBPU0U4ICgqcFNjYW5saW5lLCAgICAgKihwRGF0YWxpbmUrMiksIGlBOCwgKnBTY2FubGluZSAgICApOworICAgICAgICAgICAgICBNTkdfQ09NUE9TRTggKCoocFNjYW5saW5lKzEpLCAqKHBEYXRhbGluZSsxKSwgaUE4LCAqKHBTY2FubGluZSsxKSk7CisgICAgICAgICAgICAgIE1OR19DT01QT1NFOCAoKihwU2NhbmxpbmUrMiksICpwRGF0YWxpbmUsICAgICBpQTgsICoocFNjYW5saW5lKzIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jICogMyk7CisgICAgICAgICAgcERhdGFsaW5lICs9IDQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBjaGVja191cGRhdGVfcmVnaW9uIChwRGF0YSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRElTUExBWV9CR1I4LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbHNlIC8qIE1OR19PUFRJTUlaRV9GT09UUFJJTlRfQ09NUE9TRSAqLworbW5nX3JldGNvZGUgbW5nX2Rpc3BsYXlfYmdyOCAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfdWludDhwIHBTY2FubGluZTsKKyAgbW5nX3VpbnQ4cCBwRGF0YWxpbmU7CisgIG1uZ19pbnQzMiAgaVg7CisgIG1uZ191aW50MTYgaUExNjsKKyAgbW5nX3VpbnQxNiBpRkdnMTY7CisgIG1uZ191aW50MTYgaUJHZzE2OworICBtbmdfdWludDggIGlBODsKKyAgbW5nX3VpbnQ4ICBpQnBzOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RJU1BMQVlfQkdSOCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlCcHM9KG1uZ191aW50OCkocERhdGEtPmJJc1JHQkExNiA/IDI6MSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2aWV3YWJsZSByb3cgPyAqLworICBpZiAoKHBEYXRhLT5pUm93ID49IHBEYXRhLT5pU291cmNldCkgJiYgKHBEYXRhLT5pUm93IDwgcERhdGEtPmlTb3VyY2ViKSkKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHJlc3MgZGVzdGluYXRpb24gcm93ICovCisgICAgcFNjYW5saW5lID0gKG1uZ191aW50OHApcERhdGEtPmZHZXRjYW52YXNsaW5lICgoKG1uZ19oYW5kbGUpcERhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlSb3cgKyBwRGF0YS0+aURlc3R0IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pU291cmNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGp1c3QgZGVzdGluYXRpb24gcm93IHN0YXJ0aW5nLXBvaW50ICovCisgICAgcFNjYW5saW5lID0gcFNjYW5saW5lICsgKHBEYXRhLT5pQ29sICogMykgKyAocERhdGEtPmlEZXN0bCAqIDMpOworICAgIHBEYXRhbGluZSA9IHBEYXRhLT5wUkdCQXJvdzsgICAgICAgLyogYWRkcmVzcyBzb3VyY2Ugcm93ICovCisKKyAgICAvKiBhZGp1c3Qgc291cmNlIHJvdyBzdGFydGluZy1wb2ludCAqLworICAgIHBEYXRhbGluZSA9IHBEYXRhbGluZSArICgocERhdGEtPmlTb3VyY2VsIC8gcERhdGEtPmlDb2xpbmMpIDw8IChpQnBzKzEpKTsKKworICAgIGlmIChwRGF0YS0+YklzT3BhcXVlKSAgICAgICAgICAgICAgLyogZm9yZ2V0IGFib3V0IHRyYW5zcGFyZW5jeSA/ICovCisgICAgeworICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlTb3VyY2VsICsgcERhdGEtPmlDb2w7IGlYIDwgcERhdGEtPmlTb3VyY2VyOworICAgICAgICAgICAgIGlYICs9IHBEYXRhLT5pQ29saW5jKQorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbGUgZG93biBieSBkcm9wcGluZyB0aGUgTFNCICovCisgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAqKHBEYXRhbGluZSsyKmlCcHMpOworICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKihwRGF0YWxpbmUraUJwcyk7CisgICAgICAgICAgKihwU2NhbmxpbmUrMikgPSAqcERhdGFsaW5lOworCisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyAqIDMpOworICAgICAgICAgIHBEYXRhbGluZSArPSA0KmlCcHM7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGlmIChwRGF0YS0+YklzUkdCQTE2KSAgICAgICAgICAgIC8qIDE2LWJpdCBpbnB1dCByb3cgPyAqLworICAgICAgeworICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlTb3VyY2VsICsgcERhdGEtPmlDb2w7IGlYIDwgcERhdGEtPmlTb3VyY2VyOworICAgICAgICAgICAgIGlYICs9IHBEYXRhLT5pQ29saW5jKQorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0IGFscGhhIHZhbHVlICovCisgICAgICAgICAgaUExNiA9IG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUrNik7CisKKyAgICAgICAgICBpZiAoaUExNikgICAgICAgICAgICAgICAgICAgIC8qIGFueSBvcGFjaXR5IGF0IGFsbCA/ICovCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKGlBMTYgPT0gMHhGRkZGKSAgICAgICAgLyogZnVsbHkgb3BhcXVlID8gKi8KKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjYWxlIGRvd24gYnkgZHJvcHBpbmcgdGhlIExTQiAqLworICAgICAgICAgICAgICAqcFNjYW5saW5lICAgICA9ICoocERhdGFsaW5lKzQpOworICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9ICoocERhdGFsaW5lKzIpOworICAgICAgICAgICAgICAqKHBTY2FubGluZSsyKSA9ICpwRGF0YWxpbmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgdGhlIHByb3BlciB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgIGZvciAoaT0yOyBpID49IDA7IGktLSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICBpRkdnMTYgPSBtbmdfZ2V0X3VpbnQxNiAocERhdGFsaW5lK2kraSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzY2FsZSBiYWNrZ3JvdW5kIHVwICovCisgICAgICAgICAgICAgIGlCR2cxNiA9IChtbmdfdWludDE2KSgqKHBTY2FubGluZSsyLWkpKTsKKyAgICAgICAgICAgICAgaUJHZzE2ID0gKG1uZ191aW50MTYpKChtbmdfdWludDMyKWlCR2cxNiA8PCA4KSB8IGlCR2cxNjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdyBjb21wb3NlICovCisgICAgICAgICAgICAgIE1OR19DT01QT1NFMTYoaUZHZzE2LCBpRkdnMTYsIGlBMTYsIGlCR2cxNik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgcmV0dXJuIHRoZSBjb21wb3NlZCB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMi1pKSA9IChtbmdfdWludDgpKGlGR2cxNiA+PiA4KTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIHBTY2FubGluZSArPSAocERhdGEtPmlDb2xpbmMgKiAzKTsKKyAgICAgICAgICBwRGF0YWxpbmUgKz0gODsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlTb3VyY2VsICsgcERhdGEtPmlDb2w7IGlYIDwgcERhdGEtPmlTb3VyY2VyOworICAgICAgICAgICAgIGlYICs9IHBEYXRhLT5pQ29saW5jKQorICAgICAgICB7CisgICAgICAgICAgaUE4ID0gKihwRGF0YWxpbmUrMyk7ICAgICAgICAvKiBnZXQgYWxwaGEgdmFsdWUgKi8KKworICAgICAgICAgIGlmIChpQTgpICAgICAgICAgICAgICAgICAgICAgLyogYW55IG9wYWNpdHkgYXQgYWxsID8gKi8KKyAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoaUE4ID09IDB4RkYpICAgICAgICAgICAvKiBmdWxseSBvcGFxdWUgPyAqLworICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlbiBzaW1wbHkgY29weSB0aGUgdmFsdWVzICovCisgICAgICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKihwRGF0YWxpbmUrMik7CisgICAgICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKihwRGF0YWxpbmUrMSk7CisgICAgICAgICAgICAgICoocFNjYW5saW5lKzIpID0gKnBEYXRhbGluZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvIGFscGhhIGNvbXBvc2luZyAqLworICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgZm9yIChpPTI7IGkgPj0gMDsgaS0tKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgIE1OR19DT01QT1NFOCAoKihwU2NhbmxpbmUraSksICoocERhdGFsaW5lKzItaSksIGlBOCwgKihwU2NhbmxpbmUraSkpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyAqIDMpOworICAgICAgICAgIHBEYXRhbGluZSArPSA0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgY2hlY2tfdXBkYXRlX3JlZ2lvbiAocERhdGEpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RJU1BMQVlfQkdSOCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYgLyogTU5HX09QVElNSVpFX0ZPT1RQUklOVF9DT01QT1NFICovCisjZWxzZSAvKiBNTkdfTk9fMTZCSVRfU1VQUE9SVCAqLworbW5nX3JldGNvZGUgbW5nX2Rpc3BsYXlfYmdyOCAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfdWludDhwIHBTY2FubGluZTsKKyAgbW5nX3VpbnQ4cCBwRGF0YWxpbmU7CisgIG1uZ19pbnQzMiAgaVg7CisgIG1uZ191aW50OCAgaUE4OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RJU1BMQVlfQkdSOCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdmlld2FibGUgcm93ID8gKi8KKyAgaWYgKChwRGF0YS0+aVJvdyA+PSBwRGF0YS0+aVNvdXJjZXQpICYmIChwRGF0YS0+aVJvdyA8IHBEYXRhLT5pU291cmNlYikpCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGRyZXNzIGRlc3RpbmF0aW9uIHJvdyAqLworICAgIHBTY2FubGluZSA9IChtbmdfdWludDhwKXBEYXRhLT5mR2V0Y2FudmFzbGluZSAoKChtbmdfaGFuZGxlKXBEYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pUm93ICsgcERhdGEtPmlEZXN0dCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aVNvdXJjZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRqdXN0IGRlc3RpbmF0aW9uIHJvdyBzdGFydGluZy1wb2ludCAqLworICAgIHBTY2FubGluZSA9IHBTY2FubGluZSArIChwRGF0YS0+aUNvbCAqIDMpICsgKHBEYXRhLT5pRGVzdGwgKiAzKTsKKyAgICBwRGF0YWxpbmUgPSBwRGF0YS0+cFJHQkFyb3c7ICAgICAgIC8qIGFkZHJlc3Mgc291cmNlIHJvdyAqLworCisgICAgICBwRGF0YWxpbmUgPSBwRGF0YWxpbmUgKyAocERhdGEtPmlTb3VyY2VsIC8gcERhdGEtPmlDb2xpbmMpICogNDsKKworICAgIGlmIChwRGF0YS0+YklzT3BhcXVlKSAgICAgICAgICAgICAgLyogZm9yZ2V0IGFib3V0IHRyYW5zcGFyZW5jeSA/ICovCisgICAgeworICAgICAgeworICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlTb3VyY2VsICsgcERhdGEtPmlDb2w7IGlYIDwgcERhdGEtPmlTb3VyY2VyOworICAgICAgICAgICAgIGlYICs9IHBEYXRhLT5pQ29saW5jKQorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29weSB0aGUgdmFsdWVzICovCisgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAqKHBEYXRhbGluZSsyKTsKKyAgICAgICAgICAqKHBTY2FubGluZSsxKSA9ICoocERhdGFsaW5lKzEpOworICAgICAgICAgICoocFNjYW5saW5lKzIpID0gKnBEYXRhbGluZTsKKworICAgICAgICAgIHBTY2FubGluZSArPSAocERhdGEtPmlDb2xpbmMgKiAzKTsKKyAgICAgICAgICBwRGF0YWxpbmUgKz0gNDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgeworICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlTb3VyY2VsICsgcERhdGEtPmlDb2w7IGlYIDwgcERhdGEtPmlTb3VyY2VyOworICAgICAgICAgICAgIGlYICs9IHBEYXRhLT5pQ29saW5jKQorICAgICAgICB7CisgICAgICAgICAgaUE4ID0gKihwRGF0YWxpbmUrMyk7ICAgICAgICAvKiBnZXQgYWxwaGEgdmFsdWUgKi8KKworICAgICAgICAgIGlmIChpQTgpICAgICAgICAgICAgICAgICAgICAgLyogYW55IG9wYWNpdHkgYXQgYWxsID8gKi8KKyAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoaUE4ID09IDB4RkYpICAgICAgICAgICAvKiBmdWxseSBvcGFxdWUgPyAqLworICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlbiBzaW1wbHkgY29weSB0aGUgdmFsdWVzICovCisgICAgICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKihwRGF0YWxpbmUrMik7CisgICAgICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKihwRGF0YWxpbmUrMSk7CisgICAgICAgICAgICAgICoocFNjYW5saW5lKzIpID0gKnBEYXRhbGluZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvIGFscGhhIGNvbXBvc2luZyAqLworI2lmZGVmIE1OR19PUFRJTUlaRV9GT09UUFJJTlRfQ09NUE9TRQorICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgZm9yIChpPTI7IGkgPj0gMDsgaS0tKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgIE1OR19DT01QT1NFOCAoKihwU2NhbmxpbmUraSksICoocERhdGFsaW5lKzItaSksIGlBOCwgKihwU2NhbmxpbmUraSkpOworICAgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgICBNTkdfQ09NUE9TRTggKCpwU2NhbmxpbmUsICAgICAqKHBEYXRhbGluZSsyKSwgaUE4LCAqcFNjYW5saW5lICAgICk7CisgICAgICAgICAgICAgIE1OR19DT01QT1NFOCAoKihwU2NhbmxpbmUrMSksICoocERhdGFsaW5lKzEpLCBpQTgsICoocFNjYW5saW5lKzEpKTsKKyAgICAgICAgICAgICAgTU5HX0NPTVBPU0U4ICgqKHBTY2FubGluZSsyKSwgKnBEYXRhbGluZSwgICAgIGlBOCwgKihwU2NhbmxpbmUrMikpOworI2VuZGlmCisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyAqIDMpOworICAgICAgICAgIHBEYXRhbGluZSArPSA0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgY2hlY2tfdXBkYXRlX3JlZ2lvbiAocERhdGEpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RJU1BMQVlfQkdSOCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYgLyogTU5HX05PXzE2QklUX1NVUFBPUlQgKi8KKyNlbmRpZiAvKiBNTkdfU0tJUENBTlZBU19CR1I4ICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDQU5WQVNfQkdSWDgKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyNpZm5kZWYgTU5HX09QVElNSVpFX0ZPT1RQUklOVF9DT01QT1NFCittbmdfcmV0Y29kZSBtbmdfZGlzcGxheV9iZ3J4OCAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfdWludDhwIHBTY2FubGluZTsKKyAgbW5nX3VpbnQ4cCBwRGF0YWxpbmU7CisgIG1uZ19pbnQzMiAgaVg7CisgIG1uZ191aW50MTYgaUExNjsKKyAgbW5nX3VpbnQxNiBpRkdyMTYsIGlGR2cxNiwgaUZHYjE2OworICBtbmdfdWludDE2IGlCR3IxNiwgaUJHZzE2LCBpQkdiMTY7CisgIG1uZ191aW50OCAgaUE4OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RJU1BMQVlfQkdSWDgsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZpZXdhYmxlIHJvdyA/ICovCisgIGlmICgocERhdGEtPmlSb3cgPj0gcERhdGEtPmlTb3VyY2V0KSAmJiAocERhdGEtPmlSb3cgPCBwRGF0YS0+aVNvdXJjZWIpKQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkcmVzcyBkZXN0aW5hdGlvbiByb3cgKi8KKyAgICBwU2NhbmxpbmUgPSAobW5nX3VpbnQ4cClwRGF0YS0+ZkdldGNhbnZhc2xpbmUgKCgobW5nX2hhbmRsZSlwRGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aVJvdyArIHBEYXRhLT5pRGVzdHQgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlTb3VyY2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkanVzdCBkZXN0aW5hdGlvbiByb3cgc3RhcnRpbmctcG9pbnQgKi8KKyAgICBwU2NhbmxpbmUgPSBwU2NhbmxpbmUgKyAocERhdGEtPmlDb2wgPDwgMikgKyAocERhdGEtPmlEZXN0bCA8PCAyKTsKKyAgICBwRGF0YWxpbmUgPSBwRGF0YS0+cFJHQkFyb3c7ICAgICAgIC8qIGFkZHJlc3Mgc291cmNlIHJvdyAqLworCisgICAgaWYgKHBEYXRhLT5iSXNSR0JBMTYpICAgICAgICAgICAgICAvKiBhZGp1c3Qgc291cmNlIHJvdyBzdGFydGluZy1wb2ludCAqLworICAgICAgcERhdGFsaW5lID0gcERhdGFsaW5lICsgKHBEYXRhLT5pU291cmNlbCAvIHBEYXRhLT5pQ29saW5jKSAqIDg7CisgICAgZWxzZQorICAgICAgcERhdGFsaW5lID0gcERhdGFsaW5lICsgKHBEYXRhLT5pU291cmNlbCAvIHBEYXRhLT5pQ29saW5jKSAqIDQ7CisKKyAgICBpZiAocERhdGEtPmJJc09wYXF1ZSkgICAgICAgICAgICAgIC8qIGZvcmdldCBhYm91dCB0cmFuc3BhcmVuY3kgPyAqLworICAgIHsKKyAgICAgIGlmIChwRGF0YS0+YklzUkdCQTE2KSAgICAgICAgICAgIC8qIDE2LWJpdCBpbnB1dCByb3cgPyAqLworICAgICAgeworICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlTb3VyY2VsICsgcERhdGEtPmlDb2w7IGlYIDwgcERhdGEtPmlTb3VyY2VyOworICAgICAgICAgICAgIGlYICs9IHBEYXRhLT5pQ29saW5jKQorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbGUgZG93biBieSBkcm9wcGluZyB0aGUgTFNCICovCisgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAqKHBEYXRhbGluZSs0KTsKKyAgICAgICAgICAqKHBTY2FubGluZSsxKSA9ICoocERhdGFsaW5lKzIpOworICAgICAgICAgICoocFNjYW5saW5lKzIpID0gKnBEYXRhbGluZTsKKyAgICAgICAgICAqKHBTY2FubGluZSszKSA9IDB4RkY7ICAgICAgIC8qIGZpbGxlciBieXRlICovCisKKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jIDw8IDIpOworICAgICAgICAgIHBEYXRhbGluZSArPSA4OworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3B5IHRoZSB2YWx1ZXMgKi8KKyAgICAgICAgICAqcFNjYW5saW5lICAgICA9ICoocERhdGFsaW5lKzIpOworICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKihwRGF0YWxpbmUrMSk7CisgICAgICAgICAgKihwU2NhbmxpbmUrMikgPSAqcERhdGFsaW5lOworICAgICAgICAgICoocFNjYW5saW5lKzMpID0gMHhGRjsgICAgICAgLyogZmlsbGVyIGJ5dGUgKi8KKworICAgICAgICAgIHBTY2FubGluZSArPSAocERhdGEtPmlDb2xpbmMgPDwgMik7CisgICAgICAgICAgcERhdGFsaW5lICs9IDQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGlmIChwRGF0YS0+YklzUkdCQTE2KSAgICAgICAgICAgIC8qIDE2LWJpdCBpbnB1dCByb3cgPyAqLworICAgICAgeworICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlTb3VyY2VsICsgcERhdGEtPmlDb2w7IGlYIDwgcERhdGEtPmlTb3VyY2VyOworICAgICAgICAgICAgIGlYICs9IHBEYXRhLT5pQ29saW5jKQorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0IGFscGhhIHZhbHVlICovCisgICAgICAgICAgaUExNiA9IG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUrNik7CisKKyAgICAgICAgICBpZiAoaUExNikgICAgICAgICAgICAgICAgICAgIC8qIGFueSBvcGFjaXR5IGF0IGFsbCA/ICovCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKGlBMTYgPT0gMHhGRkZGKSAgICAgICAgLyogZnVsbHkgb3BhcXVlID8gKi8KKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjYWxlIGRvd24gYnkgZHJvcHBpbmcgdGhlIExTQiAqLworICAgICAgICAgICAgICAqcFNjYW5saW5lICAgICA9ICoocERhdGFsaW5lKzQpOworICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9ICoocERhdGFsaW5lKzIpOworICAgICAgICAgICAgICAqKHBTY2FubGluZSsyKSA9ICpwRGF0YWxpbmU7CisgICAgICAgICAgICAgICoocFNjYW5saW5lKzMpID0gMHhGRjsgICAvKiBmaWxsZXIgYnl0ZSAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0IHRoZSBwcm9wZXIgdmFsdWVzICovCisgICAgICAgICAgICAgIGlGR3IxNiA9IG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUgICk7CisgICAgICAgICAgICAgIGlGR2cxNiA9IG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUrMik7CisgICAgICAgICAgICAgIGlGR2IxNiA9IG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUrNCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzY2FsZSBiYWNrZ3JvdW5kIHVwICovCisgICAgICAgICAgICAgIGlCR3IxNiA9IChtbmdfdWludDE2KSgqKHBTY2FubGluZSsyKSk7CisgICAgICAgICAgICAgIGlCR2cxNiA9IChtbmdfdWludDE2KSgqKHBTY2FubGluZSsxKSk7CisgICAgICAgICAgICAgIGlCR2IxNiA9IChtbmdfdWludDE2KSgqcFNjYW5saW5lICAgICk7CisgICAgICAgICAgICAgIGlCR3IxNiA9IChtbmdfdWludDE2KSgobW5nX3VpbnQzMilpQkdyMTYgPDwgOCkgfCBpQkdyMTY7CisgICAgICAgICAgICAgIGlCR2cxNiA9IChtbmdfdWludDE2KSgobW5nX3VpbnQzMilpQkdnMTYgPDwgOCkgfCBpQkdnMTY7CisgICAgICAgICAgICAgIGlCR2IxNiA9IChtbmdfdWludDE2KSgobW5nX3VpbnQzMilpQkdiMTYgPDwgOCkgfCBpQkdiMTY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3cgY29tcG9zZSAqLworICAgICAgICAgICAgICBNTkdfQ09NUE9TRTE2KGlGR3IxNiwgaUZHcjE2LCBpQTE2LCBpQkdyMTYpOworICAgICAgICAgICAgICBNTkdfQ09NUE9TRTE2KGlGR2cxNiwgaUZHZzE2LCBpQTE2LCBpQkdnMTYpOworICAgICAgICAgICAgICBNTkdfQ09NUE9TRTE2KGlGR2IxNiwgaUZHYjE2LCBpQTE2LCBpQkdiMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHJldHVybiB0aGUgY29tcG9zZWQgdmFsdWVzICovCisgICAgICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKG1uZ191aW50OCkoaUZHYjE2ID4+IDgpOworICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9IChtbmdfdWludDgpKGlGR2cxNiA+PiA4KTsKKyAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMikgPSAobW5nX3VpbnQ4KShpRkdyMTYgPj4gOCk7CisgICAgICAgICAgICAgICoocFNjYW5saW5lKzMpID0gMHhGRjsgICAvKiBmaWxsZXIgYnl0ZSAqLworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIHBTY2FubGluZSArPSAocERhdGEtPmlDb2xpbmMgPDwgMik7CisgICAgICAgICAgcERhdGFsaW5lICs9IDg7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pQ29sOyBpWCA8IHBEYXRhLT5pU291cmNlcjsKKyAgICAgICAgICAgICBpWCArPSBwRGF0YS0+aUNvbGluYykKKyAgICAgICAgeworICAgICAgICAgIGlBOCA9ICoocERhdGFsaW5lKzMpOyAgICAgICAgLyogZ2V0IGFscGhhIHZhbHVlICovCisKKyAgICAgICAgICBpZiAoaUE4KSAgICAgICAgICAgICAgICAgICAgIC8qIGFueSBvcGFjaXR5IGF0IGFsbCA/ICovCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKGlBOCA9PSAweEZGKSAgICAgICAgICAgLyogZnVsbHkgb3BhcXVlID8gKi8KKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZW4gc2ltcGx5IGNvcHkgdGhlIHZhbHVlcyAqLworICAgICAgICAgICAgICAqcFNjYW5saW5lICAgICA9ICoocERhdGFsaW5lKzIpOworICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9ICoocERhdGFsaW5lKzEpOworICAgICAgICAgICAgICAqKHBTY2FubGluZSsyKSA9ICpwRGF0YWxpbmU7CisgICAgICAgICAgICAgICoocFNjYW5saW5lKzMpID0gMHhGRjsgICAvKiBmaWxsZXIgYnl0ZSAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZG8gYWxwaGEgY29tcG9zaW5nICovCisgICAgICAgICAgICAgIE1OR19DT01QT1NFOCAoKnBTY2FubGluZSwgICAgICoocERhdGFsaW5lKzIpLCBpQTgsICpwU2NhbmxpbmUgICAgKTsKKyAgICAgICAgICAgICAgTU5HX0NPTVBPU0U4ICgqKHBTY2FubGluZSsxKSwgKihwRGF0YWxpbmUrMSksIGlBOCwgKihwU2NhbmxpbmUrMSkpOworICAgICAgICAgICAgICBNTkdfQ09NUE9TRTggKCoocFNjYW5saW5lKzIpLCAqcERhdGFsaW5lLCAgICAgaUE4LCAqKHBTY2FubGluZSsyKSk7CisgICAgICAgICAgICAgICoocFNjYW5saW5lKzMpID0gMHhGRjsgICAvKiBmaWxsZXIgYnl0ZSAqLworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIHBTY2FubGluZSArPSAocERhdGEtPmlDb2xpbmMgPDwgMik7CisgICAgICAgICAgcERhdGFsaW5lICs9IDQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBjaGVja191cGRhdGVfcmVnaW9uIChwRGF0YSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRElTUExBWV9CR1JYOCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZWxzZSAvKiBNTkdfT1BUSU1JWkVfRk9PVFBSSU5UX0NPTVBPU0UgKi8KK21uZ19yZXRjb2RlIG1uZ19kaXNwbGF5X2Jncng4IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ191aW50OHAgcFNjYW5saW5lOworICBtbmdfdWludDhwIHBEYXRhbGluZTsKKyAgbW5nX2ludDMyICBpWDsKKyAgbW5nX3VpbnQxNiBpQTE2OworICBtbmdfdWludDE2IGlGR2cxNjsKKyAgbW5nX3VpbnQxNiBpQkdnMTY7CisgIG1uZ191aW50OCAgaUE4OworICBtbmdfdWludDggIGlCcHM7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRElTUExBWV9CR1JYOCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlCcHM9KG1uZ191aW50OCkocERhdGEtPmJJc1JHQkExNiA/IDI6MSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2aWV3YWJsZSByb3cgPyAqLworICBpZiAoKHBEYXRhLT5pUm93ID49IHBEYXRhLT5pU291cmNldCkgJiYgKHBEYXRhLT5pUm93IDwgcERhdGEtPmlTb3VyY2ViKSkKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHJlc3MgZGVzdGluYXRpb24gcm93ICovCisgICAgcFNjYW5saW5lID0gKG1uZ191aW50OHApcERhdGEtPmZHZXRjYW52YXNsaW5lICgoKG1uZ19oYW5kbGUpcERhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlSb3cgKyBwRGF0YS0+aURlc3R0IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pU291cmNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGp1c3QgZGVzdGluYXRpb24gcm93IHN0YXJ0aW5nLXBvaW50ICovCisgICAgcFNjYW5saW5lID0gcFNjYW5saW5lICsgKHBEYXRhLT5pQ29sIDw8IDIpICsgKHBEYXRhLT5pRGVzdGwgPDwgMik7CisgICAgcERhdGFsaW5lID0gcERhdGEtPnBSR0JBcm93OyAgICAgICAvKiBhZGRyZXNzIHNvdXJjZSByb3cgKi8KKworICAgIC8qIGFkanVzdCBzb3VyY2Ugcm93IHN0YXJ0aW5nLXBvaW50ICovCisgICAgcERhdGFsaW5lID0gcERhdGFsaW5lICsgKChwRGF0YS0+aVNvdXJjZWwgLyBwRGF0YS0+aUNvbGluYykgPDwgKGlCcHMrMSkpOworCisgICAgaWYgKHBEYXRhLT5iSXNPcGFxdWUpICAgICAgICAgICAgICAvKiBmb3JnZXQgYWJvdXQgdHJhbnNwYXJlbmN5ID8gKi8KKyAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzY2FsZSBkb3duIGJ5IGRyb3BwaW5nIHRoZSBMU0IgKi8KKyAgICAgICAgICAqcFNjYW5saW5lICAgICA9ICoocERhdGFsaW5lKzIqaUJwcyk7CisgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAqKHBEYXRhbGluZStpQnBzKTsKKyAgICAgICAgICAqKHBTY2FubGluZSsyKSA9ICpwRGF0YWxpbmU7CisgICAgICAgICAgKihwU2NhbmxpbmUrMykgPSAweEZGOyAgICAgICAvKiBmaWxsZXIgYnl0ZSAqLworCisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyA8PCAyKTsKKyAgICAgICAgICBwRGF0YWxpbmUgKz0gNCppQnBzOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBpZiAocERhdGEtPmJJc1JHQkExNikgICAgICAgICAgICAvKiAxNi1iaXQgaW5wdXQgcm93ID8gKi8KKyAgICAgIHsKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pQ29sOyBpWCA8IHBEYXRhLT5pU291cmNlcjsKKyAgICAgICAgICAgICBpWCArPSBwRGF0YS0+aUNvbGluYykKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCBhbHBoYSB2YWx1ZSAqLworICAgICAgICAgIGlBMTYgPSBtbmdfZ2V0X3VpbnQxNiAocERhdGFsaW5lKzYpOworCisgICAgICAgICAgaWYgKGlBMTYpICAgICAgICAgICAgICAgICAgICAvKiBhbnkgb3BhY2l0eSBhdCBhbGwgPyAqLworICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpQTE2ID09IDB4RkZGRikgICAgICAgIC8qIGZ1bGx5IG9wYXF1ZSA/ICovCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzY2FsZSBkb3duIGJ5IGRyb3BwaW5nIHRoZSBMU0IgKi8KKyAgICAgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAqKHBEYXRhbGluZSs0KTsKKyAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAqKHBEYXRhbGluZSsyKTsKKyAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMikgPSAqcERhdGFsaW5lOworICAgICAgICAgICAgICAqKHBTY2FubGluZSszKSA9IDB4RkY7ICAgLyogZmlsbGVyIGJ5dGUgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCB0aGUgcHJvcGVyIHZhbHVlcyAqLworICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgZm9yIChpPTI7IGkgPj0gMDsgaS0tKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlGR2cxNiA9IG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUraStpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjYWxlIGJhY2tncm91bmQgdXAgKi8KKyAgICAgICAgICAgICAgaUJHZzE2ID0gKG1uZ191aW50MTYpKCoocFNjYW5saW5lKzItaSkpOworICAgICAgICAgICAgICBpQkdnMTYgPSAobW5nX3VpbnQxNikoKG1uZ191aW50MzIpaUJHZzE2IDw8IDgpIHwgaUJHZzE2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm93IGNvbXBvc2UgKi8KKyAgICAgICAgICAgICAgTU5HX0NPTVBPU0UxNihpRkdnMTYsIGlGR2cxNiwgaUExNiwgaUJHZzE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCByZXR1cm4gdGhlIGNvbXBvc2VkIHZhbHVlcyAqLworICAgICAgICAgICAgICAqKHBTY2FubGluZSsyLWkpID0gKG1uZ191aW50OCkoaUZHZzE2ID4+IDgpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICoocFNjYW5saW5lKzMpID0gMHhGRjsgICAvKiBmaWxsZXIgYnl0ZSAqLworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIHBTY2FubGluZSArPSAocERhdGEtPmlDb2xpbmMgPDwgMik7CisgICAgICAgICAgcERhdGFsaW5lICs9IDg7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pQ29sOyBpWCA8IHBEYXRhLT5pU291cmNlcjsKKyAgICAgICAgICAgICBpWCArPSBwRGF0YS0+aUNvbGluYykKKyAgICAgICAgeworICAgICAgICAgIGlBOCA9ICoocERhdGFsaW5lKzMpOyAgICAgICAgLyogZ2V0IGFscGhhIHZhbHVlICovCisKKyAgICAgICAgICBpZiAoaUE4KSAgICAgICAgICAgICAgICAgICAgIC8qIGFueSBvcGFjaXR5IGF0IGFsbCA/ICovCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKGlBOCA9PSAweEZGKSAgICAgICAgICAgLyogZnVsbHkgb3BhcXVlID8gKi8KKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZW4gc2ltcGx5IGNvcHkgdGhlIHZhbHVlcyAqLworICAgICAgICAgICAgICAqcFNjYW5saW5lICAgICA9ICoocERhdGFsaW5lKzIpOworICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9ICoocERhdGFsaW5lKzEpOworICAgICAgICAgICAgICAqKHBTY2FubGluZSsyKSA9ICpwRGF0YWxpbmU7CisgICAgICAgICAgICAgICoocFNjYW5saW5lKzMpID0gMHhGRjsgICAvKiBmaWxsZXIgYnl0ZSAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZG8gYWxwaGEgY29tcG9zaW5nICovCisgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICBmb3IgKGk9MjsgaSA+PSAwOyBpLS0pCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgTU5HX0NPTVBPU0U4ICgqKHBTY2FubGluZStpKSwgKihwRGF0YWxpbmUrMi1pKSwgaUE4LCAqKHBTY2FubGluZStpKSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMykgPSAweEZGOyAgIC8qIGZpbGxlciBieXRlICovCisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyA8PCAyKTsKKyAgICAgICAgICBwRGF0YWxpbmUgKz0gNDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIGNoZWNrX3VwZGF0ZV9yZWdpb24gKHBEYXRhKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ESVNQTEFZX0JHUlg4LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZiAvKiBNTkdfT1BUSU1JWkVfRk9PVFBSSU5UX0NPTVBPU0UgKi8KKyNlbHNlIC8qIE1OR19OT18xNkJJVF9TVVBQT1JUICovCittbmdfcmV0Y29kZSBtbmdfZGlzcGxheV9iZ3J4OCAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfdWludDhwIHBTY2FubGluZTsKKyAgbW5nX3VpbnQ4cCBwRGF0YWxpbmU7CisgIG1uZ19pbnQzMiAgaVg7CisgIG1uZ191aW50OCAgaUE4OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RJU1BMQVlfQkdSWDgsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZpZXdhYmxlIHJvdyA/ICovCisgIGlmICgocERhdGEtPmlSb3cgPj0gcERhdGEtPmlTb3VyY2V0KSAmJiAocERhdGEtPmlSb3cgPCBwRGF0YS0+aVNvdXJjZWIpKQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkcmVzcyBkZXN0aW5hdGlvbiByb3cgKi8KKyAgICBwU2NhbmxpbmUgPSAobW5nX3VpbnQ4cClwRGF0YS0+ZkdldGNhbnZhc2xpbmUgKCgobW5nX2hhbmRsZSlwRGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aVJvdyArIHBEYXRhLT5pRGVzdHQgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlTb3VyY2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkanVzdCBkZXN0aW5hdGlvbiByb3cgc3RhcnRpbmctcG9pbnQgKi8KKyAgICBwU2NhbmxpbmUgPSBwU2NhbmxpbmUgKyAocERhdGEtPmlDb2wgPDwgMikgKyAocERhdGEtPmlEZXN0bCA8PCAyKTsKKyAgICBwRGF0YWxpbmUgPSBwRGF0YS0+cFJHQkFyb3c7ICAgICAgIC8qIGFkZHJlc3Mgc291cmNlIHJvdyAqLworCisgICAgICBwRGF0YWxpbmUgPSBwRGF0YWxpbmUgKyAocERhdGEtPmlTb3VyY2VsIC8gcERhdGEtPmlDb2xpbmMpICogNDsKKworICAgIGlmIChwRGF0YS0+YklzT3BhcXVlKSAgICAgICAgICAgICAgLyogZm9yZ2V0IGFib3V0IHRyYW5zcGFyZW5jeSA/ICovCisgICAgeworICAgICAgeworICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlTb3VyY2VsICsgcERhdGEtPmlDb2w7IGlYIDwgcERhdGEtPmlTb3VyY2VyOworICAgICAgICAgICAgIGlYICs9IHBEYXRhLT5pQ29saW5jKQorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29weSB0aGUgdmFsdWVzICovCisgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAqKHBEYXRhbGluZSsyKTsKKyAgICAgICAgICAqKHBTY2FubGluZSsxKSA9ICoocERhdGFsaW5lKzEpOworICAgICAgICAgICoocFNjYW5saW5lKzIpID0gKnBEYXRhbGluZTsKKyAgICAgICAgICAqKHBTY2FubGluZSszKSA9IDB4RkY7ICAgICAgIC8qIGZpbGxlciBieXRlICovCisKKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jIDw8IDIpOworICAgICAgICAgIHBEYXRhbGluZSArPSA0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsKKyAgICAgICAgICBpQTggPSAqKHBEYXRhbGluZSszKTsgICAgICAgIC8qIGdldCBhbHBoYSB2YWx1ZSAqLworCisgICAgICAgICAgaWYgKGlBOCkgICAgICAgICAgICAgICAgICAgICAvKiBhbnkgb3BhY2l0eSBhdCBhbGwgPyAqLworICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpQTggPT0gMHhGRikgICAgICAgICAgIC8qIGZ1bGx5IG9wYXF1ZSA/ICovCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGVuIHNpbXBseSBjb3B5IHRoZSB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAqKHBEYXRhbGluZSsyKTsKKyAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAqKHBEYXRhbGluZSsxKTsKKyAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMikgPSAqcERhdGFsaW5lOworICAgICAgICAgICAgICAqKHBTY2FubGluZSszKSA9IDB4RkY7ICAgLyogZmlsbGVyIGJ5dGUgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvIGFscGhhIGNvbXBvc2luZyAqLworI2lmZGVmIE1OR19PUFRJTUlaRV9GT09UUFJJTlRfQ09NUE9TRQorICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgZm9yIChpPTI7IGkgPj0gMDsgaS0tKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgIE1OR19DT01QT1NFOCAoKihwU2NhbmxpbmUraSksICoocERhdGFsaW5lKzItaSksIGlBOCwgKihwU2NhbmxpbmUraSkpOworICAgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgICBNTkdfQ09NUE9TRTggKCpwU2NhbmxpbmUsICAgICAqKHBEYXRhbGluZSsyKSwgaUE4LCAqcFNjYW5saW5lICAgICk7CisgICAgICAgICAgICAgIE1OR19DT01QT1NFOCAoKihwU2NhbmxpbmUrMSksICoocERhdGFsaW5lKzEpLCBpQTgsICoocFNjYW5saW5lKzEpKTsKKyAgICAgICAgICAgICAgTU5HX0NPTVBPU0U4ICgqKHBTY2FubGluZSsyKSwgKnBEYXRhbGluZSwgICAgIGlBOCwgKihwU2NhbmxpbmUrMikpOworI2VuZGlmCisgICAgICAgICAgICAgICoocFNjYW5saW5lKzMpID0gMHhGRjsgICAvKiBmaWxsZXIgYnl0ZSAqLworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIHBTY2FubGluZSArPSAocERhdGEtPmlDb2xpbmMgPDwgMik7CisgICAgICAgICAgcERhdGFsaW5lICs9IDQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBjaGVja191cGRhdGVfcmVnaW9uIChwRGF0YSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRElTUExBWV9CR1JYOCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYgLyogTU5HX05PXzE2QklUX1NVUFBPUlQgKi8KKyNlbmRpZiAvKiBNTkdfU0tJUENBTlZBU19CR1JYOCAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0FOVkFTX0JHUkE4CisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisjaWZuZGVmIE1OR19PUFRJTUlaRV9GT09UUFJJTlRfQ09NUE9TRQorbW5nX3JldGNvZGUgbW5nX2Rpc3BsYXlfYmdyYTggKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX3VpbnQ4cCBwU2NhbmxpbmU7CisgIG1uZ191aW50OHAgcERhdGFsaW5lOworICBtbmdfaW50MzIgIGlYOworICBtbmdfdWludDggIGlGR2E4LCBpQkdhOCwgaUNhODsKKyAgbW5nX3VpbnQxNiBpRkdhMTYsIGlCR2ExNiwgaUNhMTY7CisgIG1uZ191aW50MTYgaUZHcjE2LCBpRkdnMTYsIGlGR2IxNjsKKyAgbW5nX3VpbnQxNiBpQkdyMTYsIGlCR2cxNiwgaUJHYjE2OworICBtbmdfdWludDE2IGlDcjE2LCBpQ2cxNiwgaUNiMTY7CisgIG1uZ191aW50OCAgaUNyOCwgaUNnOCwgaUNiODsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ESVNQTEFZX0JHUkE4LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2aWV3YWJsZSByb3cgPyAqLworICBpZiAoKHBEYXRhLT5pUm93ID49IHBEYXRhLT5pU291cmNldCkgJiYgKHBEYXRhLT5pUm93IDwgcERhdGEtPmlTb3VyY2ViKSkKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHJlc3MgZGVzdGluYXRpb24gcm93ICovCisgICAgcFNjYW5saW5lID0gKG1uZ191aW50OHApcERhdGEtPmZHZXRjYW52YXNsaW5lICgoKG1uZ19oYW5kbGUpcERhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlSb3cgKyBwRGF0YS0+aURlc3R0IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pU291cmNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGp1c3QgZGVzdGluYXRpb24gcm93IHN0YXJ0aW5nLXBvaW50ICovCisgICAgcFNjYW5saW5lID0gcFNjYW5saW5lICsgKHBEYXRhLT5pQ29sIDw8IDIpICsgKHBEYXRhLT5pRGVzdGwgPDwgMik7CisgICAgcERhdGFsaW5lID0gcERhdGEtPnBSR0JBcm93OyAgICAgICAvKiBhZGRyZXNzIHNvdXJjZSByb3cgKi8KKworICAgIGlmIChwRGF0YS0+YklzUkdCQTE2KSAgICAgICAgICAgICAgLyogYWRqdXN0IHNvdXJjZSByb3cgc3RhcnRpbmctcG9pbnQgKi8KKyAgICAgIHBEYXRhbGluZSA9IHBEYXRhbGluZSArICgocERhdGEtPmlTb3VyY2VsIC8gcERhdGEtPmlDb2xpbmMpIDw8IDMpOworICAgIGVsc2UKKyAgICAgIHBEYXRhbGluZSA9IHBEYXRhbGluZSArICgocERhdGEtPmlTb3VyY2VsIC8gcERhdGEtPmlDb2xpbmMpIDw8IDIpOworCisgICAgaWYgKHBEYXRhLT5iSXNPcGFxdWUpICAgICAgICAgICAgICAvKiBmb3JnZXQgYWJvdXQgdHJhbnNwYXJlbmN5ID8gKi8KKyAgICB7CisgICAgICBpZiAocERhdGEtPmJJc1JHQkExNikgICAgICAgICAgICAvKiAxNi1iaXQgaW5wdXQgcm93ID8gKi8KKyAgICAgIHsKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pQ29sOyBpWCA8IHBEYXRhLT5pU291cmNlcjsKKyAgICAgICAgICAgICBpWCArPSBwRGF0YS0+aUNvbGluYykKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjYWxlIGRvd24gYnkgZHJvcHBpbmcgdGhlIExTQiAqLworICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKihwRGF0YWxpbmUrNCk7CisgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAqKHBEYXRhbGluZSsyKTsKKyAgICAgICAgICAqKHBTY2FubGluZSsyKSA9ICpwRGF0YWxpbmU7CisgICAgICAgICAgKihwU2NhbmxpbmUrMykgPSAqKHBEYXRhbGluZSs2KTsKKworICAgICAgICAgIHBTY2FubGluZSArPSAocERhdGEtPmlDb2xpbmMgPDwgMik7CisgICAgICAgICAgcERhdGFsaW5lICs9IDg7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pQ29sOyBpWCA8IHBEYXRhLT5pU291cmNlcjsKKyAgICAgICAgICAgICBpWCArPSBwRGF0YS0+aUNvbGluYykKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvcHkgdGhlIHZhbHVlcyAqLworICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKihwRGF0YWxpbmUrMik7CisgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAqKHBEYXRhbGluZSsxKTsKKyAgICAgICAgICAqKHBTY2FubGluZSsyKSA9ICpwRGF0YWxpbmU7CisgICAgICAgICAgKihwU2NhbmxpbmUrMykgPSAqKHBEYXRhbGluZSszKTsKKworICAgICAgICAgIHBTY2FubGluZSArPSAocERhdGEtPmlDb2xpbmMgPDwgMik7CisgICAgICAgICAgcERhdGFsaW5lICs9IDQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGlmIChwRGF0YS0+YklzUkdCQTE2KSAgICAgICAgICAgIC8qIDE2LWJpdCBpbnB1dCByb3cgPyAqLworICAgICAgeworICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlTb3VyY2VsICsgcERhdGEtPmlDb2w7IGlYIDwgcERhdGEtPmlTb3VyY2VyOworICAgICAgICAgICAgIGlYICs9IHBEYXRhLT5pQ29saW5jKQorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0IGFscGhhIHZhbHVlcyAqLworICAgICAgICAgIGlGR2ExNiA9IG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUrNik7CisgICAgICAgICAgaUJHYTE2ID0gKG1uZ191aW50MTYpKCoocFNjYW5saW5lKzMpKTsKKyAgICAgICAgICBpQkdhMTYgPSAobW5nX3VpbnQxNikoaUJHYTE2IDw8IDgpIHwgaUJHYTE2OworCisgICAgICAgICAgaWYgKGlGR2ExNikgICAgICAgICAgICAgICAgICAvKiBhbnkgb3BhY2l0eSBhdCBhbGwgPyAqLworICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZnVsbHkgb3BhcXVlIG9yIGJhY2tncm91bmQgZnVsbHkgdHJhbnNwYXJlbnQgPyAqLworICAgICAgICAgICAgaWYgKChpRkdhMTYgPT0gMHhGRkZGKSB8fCAoaUJHYTE2ID09IDApKQorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGxhaW4gY29weSBpdCAqLworICAgICAgICAgICAgICAqcFNjYW5saW5lICAgICA9ICoocERhdGFsaW5lKzQpOworICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9ICoocERhdGFsaW5lKzIpOworICAgICAgICAgICAgICAqKHBTY2FubGluZSsyKSA9ICpwRGF0YWxpbmU7CisgICAgICAgICAgICAgICoocFNjYW5saW5lKzMpID0gKihwRGF0YWxpbmUrNik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChpQkdhMTYgPT0gMHhGRkZGKSAgICAvKiBiYWNrZ3JvdW5kIGZ1bGx5IG9wYXF1ZSA/ICovCisgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgdGhlIHByb3BlciB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgICBpRkdyMTYgPSBtbmdfZ2V0X3VpbnQxNiAocERhdGFsaW5lICApOworICAgICAgICAgICAgICAgIGlGR2cxNiA9IG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUrMik7CisgICAgICAgICAgICAgICAgaUZHYjE2ID0gbW5nX2dldF91aW50MTYgKHBEYXRhbGluZSs0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjYWxlIGJhY2tncm91bmQgdXAgKi8KKyAgICAgICAgICAgICAgICBpQkdyMTYgPSAobW5nX3VpbnQxNikoKihwU2NhbmxpbmUrMikpOworICAgICAgICAgICAgICAgIGlCR2cxNiA9IChtbmdfdWludDE2KSgqKHBTY2FubGluZSsxKSk7CisgICAgICAgICAgICAgICAgaUJHYjE2ID0gKG1uZ191aW50MTYpKCpwU2NhbmxpbmUgICAgKTsKKyAgICAgICAgICAgICAgICBpQkdyMTYgPSAobW5nX3VpbnQxNikoKG1uZ191aW50MzIpaUJHcjE2IDw8IDgpIHwgaUJHcjE2OworICAgICAgICAgICAgICAgIGlCR2cxNiA9IChtbmdfdWludDE2KSgobW5nX3VpbnQzMilpQkdnMTYgPDwgOCkgfCBpQkdnMTY7CisgICAgICAgICAgICAgICAgaUJHYjE2ID0gKG1uZ191aW50MTYpKChtbmdfdWludDMyKWlCR2IxNiA8PCA4KSB8IGlCR2IxNjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdyBjb21wb3NlICovCisgICAgICAgICAgICAgICAgTU5HX0NPTVBPU0UxNihpRkdyMTYsIGlGR3IxNiwgaUZHYTE2LCBpQkdyMTYpOworICAgICAgICAgICAgICAgIE1OR19DT01QT1NFMTYoaUZHZzE2LCBpRkdnMTYsIGlGR2ExNiwgaUJHZzE2KTsKKyAgICAgICAgICAgICAgICBNTkdfQ09NUE9TRTE2KGlGR2IxNiwgaUZHYjE2LCBpRkdhMTYsIGlCR2IxNik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgcmV0dXJuIHRoZSBjb21wb3NlZCB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgICAqcFNjYW5saW5lICAgICA9IChtbmdfdWludDgpKGlGR2IxNiA+PiA4KTsKKyAgICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9IChtbmdfdWludDgpKGlGR2cxNiA+PiA4KTsKKyAgICAgICAgICAgICAgICAqKHBTY2FubGluZSsyKSA9IChtbmdfdWludDgpKGlGR3IxNiA+PiA4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFscGhhIHJlbWFpbnMgZnVsbHkgb3BhcXVlICEhISAqLworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjYWxlIGJhY2tncm91bmQgdXAgKi8KKyAgICAgICAgICAgICAgICBpQkdyMTYgPSAobW5nX3VpbnQxNikoKihwU2NhbmxpbmUrMikpOworICAgICAgICAgICAgICAgIGlCR2cxNiA9IChtbmdfdWludDE2KSgqKHBTY2FubGluZSsxKSk7CisgICAgICAgICAgICAgICAgaUJHYjE2ID0gKG1uZ191aW50MTYpKCpwU2NhbmxpbmUgICAgKTsKKyAgICAgICAgICAgICAgICBpQkdyMTYgPSAobW5nX3VpbnQxNikoKG1uZ191aW50MzIpaUJHcjE2IDw8IDgpIHwgaUJHcjE2OworICAgICAgICAgICAgICAgIGlCR2cxNiA9IChtbmdfdWludDE2KSgobW5nX3VpbnQzMilpQkdnMTYgPDwgOCkgfCBpQkdnMTY7CisgICAgICAgICAgICAgICAgaUJHYjE2ID0gKG1uZ191aW50MTYpKChtbmdfdWludDMyKWlCR2IxNiA8PCA4KSB8IGlCR2IxNjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxldCdzIGJsZW5kICovCisgICAgICAgICAgICAgICAgTU5HX0JMRU5EMTYgKG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUgICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUrMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUrNCksIGlGR2ExNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUJHcjE2LCBpQkdnMTYsIGlCR2IxNiwgaUJHYTE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpQ3IxNiwgIGlDZzE2LCAgaUNiMTYsICBpQ2ExNik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgcmV0dXJuIHRoZSBjb21wb3NlZCB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgICAqcFNjYW5saW5lICAgICA9IChtbmdfdWludDgpKGlDYjE2ID4+IDgpOworICAgICAgICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKG1uZ191aW50OCkoaUNnMTYgPj4gOCk7CisgICAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMikgPSAobW5nX3VpbnQ4KShpQ3IxNiA+PiA4KTsKKyAgICAgICAgICAgICAgICAqKHBTY2FubGluZSszKSA9IChtbmdfdWludDgpKGlDYTE2ID4+IDgpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyA8PCAyKTsKKyAgICAgICAgICBwRGF0YWxpbmUgKz0gODsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlTb3VyY2VsICsgcERhdGEtPmlDb2w7IGlYIDwgcERhdGEtPmlTb3VyY2VyOworICAgICAgICAgICAgIGlYICs9IHBEYXRhLT5pQ29saW5jKQorICAgICAgICB7CisgICAgICAgICAgaUZHYTggPSAqKHBEYXRhbGluZSszKTsgICAgICAvKiBnZXQgYWxwaGEgdmFsdWVzICovCisgICAgICAgICAgaUJHYTggPSAqKHBTY2FubGluZSszKTsKKworICAgICAgICAgIGlmIChpRkdhOCkgICAgICAgICAgICAgICAgICAgLyogYW55IG9wYWNpdHkgYXQgYWxsID8gKi8KKyAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZ1bGx5IG9wYXF1ZSBvciBiYWNrZ3JvdW5kIGZ1bGx5IHRyYW5zcGFyZW50ID8gKi8KKyAgICAgICAgICAgIGlmICgoaUZHYTggPT0gMHhGRikgfHwgKGlCR2E4ID09IDApKQorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlbiBzaW1wbHkgY29weSB0aGUgdmFsdWVzICovCisgICAgICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKihwRGF0YWxpbmUrMik7CisgICAgICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKihwRGF0YWxpbmUrMSk7CisgICAgICAgICAgICAgICoocFNjYW5saW5lKzIpID0gKnBEYXRhbGluZTsKKyAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMykgPSAqKHBEYXRhbGluZSszKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKGlCR2E4ID09IDB4RkYpICAgICAgIC8qIGJhY2tncm91bmQgZnVsbHkgb3BhcXVlID8gKi8KKyAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvIGFscGhhIGNvbXBvc2luZyAqLworICAgICAgICAgICAgICAgIE1OR19DT01QT1NFOCAoKnBTY2FubGluZSwgICAgICoocERhdGFsaW5lKzIpLCBpRkdhOCwgKnBTY2FubGluZSAgICApOworICAgICAgICAgICAgICAgIE1OR19DT01QT1NFOCAoKihwU2NhbmxpbmUrMSksICoocERhdGFsaW5lKzEpLCBpRkdhOCwgKihwU2NhbmxpbmUrMSkpOworICAgICAgICAgICAgICAgIE1OR19DT01QT1NFOCAoKihwU2NhbmxpbmUrMiksICpwRGF0YWxpbmUsICAgICBpRkdhOCwgKihwU2NhbmxpbmUrMikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWxwaGEgcmVtYWlucyBmdWxseSBvcGFxdWUgISEhICovCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogbm93IGJsZW5kICovCisgICAgICAgICAgICAgICAgTU5HX0JMRU5EOCAoKnBEYXRhbGluZSwgICAgICoocERhdGFsaW5lKzEpLCAqKHBEYXRhbGluZSsyKSwgaUZHYTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMiksICoocFNjYW5saW5lKzEpLCAqcFNjYW5saW5lLCAgICAgaUJHYTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUNyOCwgaUNnOCwgaUNiOCwgaUNhOCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgcmV0dXJuIHRoZSBjb21wb3NlZCB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgICAqcFNjYW5saW5lICAgICA9IGlDYjg7CisgICAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSBpQ2c4OworICAgICAgICAgICAgICAgICoocFNjYW5saW5lKzIpID0gaUNyODsKKyAgICAgICAgICAgICAgICAqKHBTY2FubGluZSszKSA9IGlDYTg7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jIDw8IDIpOworICAgICAgICAgIHBEYXRhbGluZSArPSA0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgY2hlY2tfdXBkYXRlX3JlZ2lvbiAocERhdGEpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RJU1BMQVlfQkdSQTgsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2Vsc2UgLyogTU5HX09QVElNSVpFX0ZPT1RQUklOVF9DT01QT1NFICovCittbmdfcmV0Y29kZSBtbmdfZGlzcGxheV9iZ3JhOCAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfdWludDhwIHBTY2FubGluZTsKKyAgbW5nX3VpbnQ4cCBwRGF0YWxpbmU7CisgIG1uZ19pbnQzMiAgaVg7CisgIG1uZ191aW50OCAgaUZHYTgsIGlCR2E4LCBpQ2E4OworICBtbmdfdWludDE2IGlGR2ExNiwgaUJHYTE2LCBpQ2ExNjsKKyAgbW5nX3VpbnQxNiBpRkdnMTY7CisgIG1uZ191aW50MTYgaUJHcjE2LCBpQkdnMTYsIGlCR2IxNjsKKyAgbW5nX3VpbnQxNiBpQ3IxNiwgaUNnMTYsIGlDYjE2OworICBtbmdfdWludDggIGlDcjgsIGlDZzgsIGlDYjg7CisgIG1uZ191aW50OCAgaUJwczsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ESVNQTEFZX0JHUkE4LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaUJwcz0obW5nX3VpbnQ4KShwRGF0YS0+YklzUkdCQTE2ID8gMjoxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZpZXdhYmxlIHJvdyA/ICovCisgIGlmICgocERhdGEtPmlSb3cgPj0gcERhdGEtPmlTb3VyY2V0KSAmJiAocERhdGEtPmlSb3cgPCBwRGF0YS0+aVNvdXJjZWIpKQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkcmVzcyBkZXN0aW5hdGlvbiByb3cgKi8KKyAgICBwU2NhbmxpbmUgPSAobW5nX3VpbnQ4cClwRGF0YS0+ZkdldGNhbnZhc2xpbmUgKCgobW5nX2hhbmRsZSlwRGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aVJvdyArIHBEYXRhLT5pRGVzdHQgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlTb3VyY2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkanVzdCBkZXN0aW5hdGlvbiByb3cgc3RhcnRpbmctcG9pbnQgKi8KKyAgICBwU2NhbmxpbmUgPSBwU2NhbmxpbmUgKyAocERhdGEtPmlDb2wgPDwgMikgKyAocERhdGEtPmlEZXN0bCA8PCAyKTsKKyAgICBwRGF0YWxpbmUgPSBwRGF0YS0+cFJHQkFyb3c7ICAgICAgIC8qIGFkZHJlc3Mgc291cmNlIHJvdyAqLworCisgICAgLyogYWRqdXN0IHNvdXJjZSByb3cgc3RhcnRpbmctcG9pbnQgKi8KKyAgICBwRGF0YWxpbmUgPSBwRGF0YWxpbmUgKyAoKHBEYXRhLT5pU291cmNlbCAvIHBEYXRhLT5pQ29saW5jKSA8PCAoaUJwcysxKSk7CisKKyAgICBpZiAocERhdGEtPmJJc09wYXF1ZSkgICAgICAgICAgICAgIC8qIGZvcmdldCBhYm91dCB0cmFuc3BhcmVuY3kgPyAqLworICAgIHsKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pQ29sOyBpWCA8IHBEYXRhLT5pU291cmNlcjsKKyAgICAgICAgICAgICBpWCArPSBwRGF0YS0+aUNvbGluYykKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjYWxlIGRvd24gYnkgZHJvcHBpbmcgdGhlIExTQiAqLworICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKihwRGF0YWxpbmUrMippQnBzKTsKKyAgICAgICAgICAqKHBTY2FubGluZSsxKSA9ICoocERhdGFsaW5lK2lCcHMpOworICAgICAgICAgICoocFNjYW5saW5lKzIpID0gKnBEYXRhbGluZTsKKyAgICAgICAgICAqKHBTY2FubGluZSszKSA9ICoocERhdGFsaW5lKzMqaUJwcyk7CisKKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jIDw8IDIpOworICAgICAgICAgIHBEYXRhbGluZSArPSA0KmlCcHM7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGlmIChwRGF0YS0+YklzUkdCQTE2KSAgICAgICAgICAgIC8qIDE2LWJpdCBpbnB1dCByb3cgPyAqLworICAgICAgeworICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlTb3VyY2VsICsgcERhdGEtPmlDb2w7IGlYIDwgcERhdGEtPmlTb3VyY2VyOworICAgICAgICAgICAgIGlYICs9IHBEYXRhLT5pQ29saW5jKQorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0IGFscGhhIHZhbHVlcyAqLworICAgICAgICAgIGlGR2ExNiA9IG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUrNik7CisgICAgICAgICAgaUJHYTE2ID0gKG1uZ191aW50MTYpKCoocFNjYW5saW5lKzMpKTsKKyAgICAgICAgICBpQkdhMTYgPSAobW5nX3VpbnQxNikoaUJHYTE2IDw8IDgpIHwgaUJHYTE2OworCisgICAgICAgICAgaWYgKGlGR2ExNikgICAgICAgICAgICAgICAgICAvKiBhbnkgb3BhY2l0eSBhdCBhbGwgPyAqLworICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZnVsbHkgb3BhcXVlIG9yIGJhY2tncm91bmQgZnVsbHkgdHJhbnNwYXJlbnQgPyAqLworICAgICAgICAgICAgaWYgKChpRkdhMTYgPT0gMHhGRkZGKSB8fCAoaUJHYTE2ID09IDApKQorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGxhaW4gY29weSBpdCAqLworICAgICAgICAgICAgICAqcFNjYW5saW5lICAgICA9ICoocERhdGFsaW5lKzQpOworICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9ICoocERhdGFsaW5lKzIpOworICAgICAgICAgICAgICAqKHBTY2FubGluZSsyKSA9ICpwRGF0YWxpbmU7CisgICAgICAgICAgICAgICoocFNjYW5saW5lKzMpID0gKihwRGF0YWxpbmUrNik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChpQkdhMTYgPT0gMHhGRkZGKSAgICAvKiBiYWNrZ3JvdW5kIGZ1bGx5IG9wYXF1ZSA/ICovCisgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgdGhlIHByb3BlciB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgIGZvciAoaT0yOyBpID49IDA7IGktLSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlGR2cxNiA9IG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUraStpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjYWxlIGJhY2tncm91bmQgdXAgKi8KKyAgICAgICAgICAgICAgICBpQkdnMTYgPSAobW5nX3VpbnQxNikoKihwU2NhbmxpbmUrMi1pKSk7CisgICAgICAgICAgICAgICAgaUJHZzE2ID0gKG1uZ191aW50MTYpKChtbmdfdWludDMyKWlCR2cxNiA8PCA4KSB8IGlCR2cxNjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdyBjb21wb3NlICovCisgICAgICAgICAgICAgICAgTU5HX0NPTVBPU0UxNihpRkdnMTYsIGlGR2cxNiwgaUZHYTE2LCBpQkdnMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHJldHVybiB0aGUgY29tcG9zZWQgdmFsdWVzICovCisgICAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMi1pKSA9IChtbmdfdWludDgpKGlGR2cxNiA+PiA4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFscGhhIHJlbWFpbnMgZnVsbHkgb3BhcXVlICEhISAqLworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbGUgYmFja2dyb3VuZCB1cCAqLworICAgICAgICAgICAgICAgIGlCR3IxNiA9IChtbmdfdWludDE2KSgqKHBTY2FubGluZSsyKSk7CisgICAgICAgICAgICAgICAgaUJHZzE2ID0gKG1uZ191aW50MTYpKCoocFNjYW5saW5lKzEpKTsKKyAgICAgICAgICAgICAgICBpQkdiMTYgPSAobW5nX3VpbnQxNikoKnBTY2FubGluZSAgICApOworICAgICAgICAgICAgICAgIGlCR3IxNiA9IChtbmdfdWludDE2KSgobW5nX3VpbnQzMilpQkdyMTYgPDwgOCkgfCBpQkdyMTY7CisgICAgICAgICAgICAgICAgaUJHZzE2ID0gKG1uZ191aW50MTYpKChtbmdfdWludDMyKWlCR2cxNiA8PCA4KSB8IGlCR2cxNjsKKyAgICAgICAgICAgICAgICBpQkdiMTYgPSAobW5nX3VpbnQxNikoKG1uZ191aW50MzIpaUJHYjE2IDw8IDgpIHwgaUJHYjE2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGV0J3MgYmxlbmQgKi8KKyAgICAgICAgICAgICAgICBNTkdfQkxFTkQxNiAobW5nX2dldF91aW50MTYgKHBEYXRhbGluZSAgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2dldF91aW50MTYgKHBEYXRhbGluZSsyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2dldF91aW50MTYgKHBEYXRhbGluZSs0KSwgaUZHYTE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpQkdyMTYsIGlCR2cxNiwgaUJHYjE2LCBpQkdhMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlDcjE2LCAgaUNnMTYsICBpQ2IxNiwgIGlDYTE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCByZXR1cm4gdGhlIGNvbXBvc2VkIHZhbHVlcyAqLworICAgICAgICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKG1uZ191aW50OCkoaUNiMTYgPj4gOCk7CisgICAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAobW5nX3VpbnQ4KShpQ2cxNiA+PiA4KTsKKyAgICAgICAgICAgICAgICAqKHBTY2FubGluZSsyKSA9IChtbmdfdWludDgpKGlDcjE2ID4+IDgpOworICAgICAgICAgICAgICAgICoocFNjYW5saW5lKzMpID0gKG1uZ191aW50OCkoaUNhMTYgPj4gOCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jIDw8IDIpOworICAgICAgICAgIHBEYXRhbGluZSArPSA4OworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsKKyAgICAgICAgICBpRkdhOCA9ICoocERhdGFsaW5lKzMpOyAgICAgIC8qIGdldCBhbHBoYSB2YWx1ZXMgKi8KKyAgICAgICAgICBpQkdhOCA9ICoocFNjYW5saW5lKzMpOworCisgICAgICAgICAgaWYgKGlGR2E4KSAgICAgICAgICAgICAgICAgICAvKiBhbnkgb3BhY2l0eSBhdCBhbGwgPyAqLworICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZnVsbHkgb3BhcXVlIG9yIGJhY2tncm91bmQgZnVsbHkgdHJhbnNwYXJlbnQgPyAqLworICAgICAgICAgICAgaWYgKChpRkdhOCA9PSAweEZGKSB8fCAoaUJHYTggPT0gMCkpCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGVuIHNpbXBseSBjb3B5IHRoZSB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAqKHBEYXRhbGluZSsyKTsKKyAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAqKHBEYXRhbGluZSsxKTsKKyAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMikgPSAqcERhdGFsaW5lOworICAgICAgICAgICAgICAqKHBTY2FubGluZSszKSA9ICoocERhdGFsaW5lKzMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoaUJHYTggPT0gMHhGRikgICAgICAgLyogYmFja2dyb3VuZCBmdWxseSBvcGFxdWUgPyAqLworICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogZG8gYWxwaGEgY29tcG9zaW5nICovCisgICAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgICAgZm9yIChpPTI7IGkgPj0gMDsgaS0tKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNTkdfQ09NUE9TRTggKCoocFNjYW5saW5lK2kpLCAqKHBEYXRhbGluZSsyLWkpLCBpRkdhOCwgKihwU2NhbmxpbmUraSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFscGhhIHJlbWFpbnMgZnVsbHkgb3BhcXVlICEhISAqLworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdyBibGVuZCAqLworICAgICAgICAgICAgICAgIE1OR19CTEVORDggKCpwRGF0YWxpbmUsICAgICAqKHBEYXRhbGluZSsxKSwgKihwRGF0YWxpbmUrMiksIGlGR2E4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocFNjYW5saW5lKzIpLCAqKHBTY2FubGluZSsxKSwgKnBTY2FubGluZSwgICAgIGlCR2E4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlDcjgsIGlDZzgsIGlDYjgsIGlDYTgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHJldHVybiB0aGUgY29tcG9zZWQgdmFsdWVzICovCisgICAgICAgICAgICAgICAgKnBTY2FubGluZSAgICAgPSBpQ2I4OworICAgICAgICAgICAgICAgICoocFNjYW5saW5lKzEpID0gaUNnODsKKyAgICAgICAgICAgICAgICAqKHBTY2FubGluZSsyKSA9IGlDcjg7CisgICAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMykgPSBpQ2E4OworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyA8PCAyKTsKKyAgICAgICAgICBwRGF0YWxpbmUgKz0gNDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIGNoZWNrX3VwZGF0ZV9yZWdpb24gKHBEYXRhKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ESVNQTEFZX0JHUkE4LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZiAvKiBNTkdfT1BUSU1JWkVfRk9PVFBSSU5UX0NPTVBPU0UgKi8KKyNlbHNlIC8qIE1OR19OT18xNkJJVF9TVVBQT1JUICovCittbmdfcmV0Y29kZSBtbmdfZGlzcGxheV9iZ3JhOCAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfdWludDhwIHBTY2FubGluZTsKKyAgbW5nX3VpbnQ4cCBwRGF0YWxpbmU7CisgIG1uZ19pbnQzMiAgaVg7CisgIG1uZ191aW50OCAgaUZHYTgsIGlCR2E4LCBpQ2E4OworICBtbmdfdWludDggIGlDcjgsIGlDZzgsIGlDYjg7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRElTUExBWV9CR1JBOCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdmlld2FibGUgcm93ID8gKi8KKyAgaWYgKChwRGF0YS0+aVJvdyA+PSBwRGF0YS0+aVNvdXJjZXQpICYmIChwRGF0YS0+aVJvdyA8IHBEYXRhLT5pU291cmNlYikpCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGRyZXNzIGRlc3RpbmF0aW9uIHJvdyAqLworICAgIHBTY2FubGluZSA9IChtbmdfdWludDhwKXBEYXRhLT5mR2V0Y2FudmFzbGluZSAoKChtbmdfaGFuZGxlKXBEYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pUm93ICsgcERhdGEtPmlEZXN0dCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aVNvdXJjZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRqdXN0IGRlc3RpbmF0aW9uIHJvdyBzdGFydGluZy1wb2ludCAqLworICAgIHBTY2FubGluZSA9IHBTY2FubGluZSArIChwRGF0YS0+aUNvbCA8PCAyKSArIChwRGF0YS0+aURlc3RsIDw8IDIpOworICAgIHBEYXRhbGluZSA9IHBEYXRhLT5wUkdCQXJvdzsgICAgICAgLyogYWRkcmVzcyBzb3VyY2Ugcm93ICovCisKKyAgICAgIHBEYXRhbGluZSA9IHBEYXRhbGluZSArICgocERhdGEtPmlTb3VyY2VsIC8gcERhdGEtPmlDb2xpbmMpIDw8IDIpOworCisgICAgaWYgKHBEYXRhLT5iSXNPcGFxdWUpICAgICAgICAgICAgICAvKiBmb3JnZXQgYWJvdXQgdHJhbnNwYXJlbmN5ID8gKi8KKyAgICB7CisgICAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3B5IHRoZSB2YWx1ZXMgKi8KKyAgICAgICAgICAqcFNjYW5saW5lICAgICA9ICoocERhdGFsaW5lKzIpOworICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKihwRGF0YWxpbmUrMSk7CisgICAgICAgICAgKihwU2NhbmxpbmUrMikgPSAqcERhdGFsaW5lOworICAgICAgICAgICoocFNjYW5saW5lKzMpID0gKihwRGF0YWxpbmUrMyk7CisKKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jIDw8IDIpOworICAgICAgICAgIHBEYXRhbGluZSArPSA0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsKKyAgICAgICAgICBpRkdhOCA9ICoocERhdGFsaW5lKzMpOyAgICAgIC8qIGdldCBhbHBoYSB2YWx1ZXMgKi8KKyAgICAgICAgICBpQkdhOCA9ICoocFNjYW5saW5lKzMpOworCisgICAgICAgICAgaWYgKGlGR2E4KSAgICAgICAgICAgICAgICAgICAvKiBhbnkgb3BhY2l0eSBhdCBhbGwgPyAqLworICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZnVsbHkgb3BhcXVlIG9yIGJhY2tncm91bmQgZnVsbHkgdHJhbnNwYXJlbnQgPyAqLworICAgICAgICAgICAgaWYgKChpRkdhOCA9PSAweEZGKSB8fCAoaUJHYTggPT0gMCkpCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGVuIHNpbXBseSBjb3B5IHRoZSB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAqKHBEYXRhbGluZSsyKTsKKyAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAqKHBEYXRhbGluZSsxKTsKKyAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMikgPSAqcERhdGFsaW5lOworICAgICAgICAgICAgICAqKHBTY2FubGluZSszKSA9ICoocERhdGFsaW5lKzMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoaUJHYTggPT0gMHhGRikgICAgICAgLyogYmFja2dyb3VuZCBmdWxseSBvcGFxdWUgPyAqLworICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogZG8gYWxwaGEgY29tcG9zaW5nICovCisjaWZkZWYgTU5HX09QVElNSVpFX0ZPT1RQUklOVF9DT01QT1NFCisgICAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgICAgZm9yIChpPTI7IGkgPj0gMDsgaS0tKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNTkdfQ09NUE9TRTggKCoocFNjYW5saW5lK2kpLCAqKHBEYXRhbGluZSsyLWkpLCBpRkdhOCwgKihwU2NhbmxpbmUraSkpOworICAgICAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICAgICAgTU5HX0NPTVBPU0U4ICgqcFNjYW5saW5lLCAgICAgKihwRGF0YWxpbmUrMiksIGlGR2E4LCAqcFNjYW5saW5lICAgICk7CisgICAgICAgICAgICAgICAgTU5HX0NPTVBPU0U4ICgqKHBTY2FubGluZSsxKSwgKihwRGF0YWxpbmUrMSksIGlGR2E4LCAqKHBTY2FubGluZSsxKSk7CisgICAgICAgICAgICAgICAgTU5HX0NPTVBPU0U4ICgqKHBTY2FubGluZSsyKSwgKnBEYXRhbGluZSwgICAgIGlGR2E4LCAqKHBTY2FubGluZSsyKSk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFscGhhIHJlbWFpbnMgZnVsbHkgb3BhcXVlICEhISAqLworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdyBibGVuZCAqLworICAgICAgICAgICAgICAgIE1OR19CTEVORDggKCpwRGF0YWxpbmUsICAgICAqKHBEYXRhbGluZSsxKSwgKihwRGF0YWxpbmUrMiksIGlGR2E4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocFNjYW5saW5lKzIpLCAqKHBTY2FubGluZSsxKSwgKnBTY2FubGluZSwgICAgIGlCR2E4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlDcjgsIGlDZzgsIGlDYjgsIGlDYTgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHJldHVybiB0aGUgY29tcG9zZWQgdmFsdWVzICovCisgICAgICAgICAgICAgICAgKnBTY2FubGluZSAgICAgPSBpQ2I4OworICAgICAgICAgICAgICAgICoocFNjYW5saW5lKzEpID0gaUNnODsKKyAgICAgICAgICAgICAgICAqKHBTY2FubGluZSsyKSA9IGlDcjg7CisgICAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMykgPSBpQ2E4OworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyA8PCAyKTsKKyAgICAgICAgICBwRGF0YWxpbmUgKz0gNDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIGNoZWNrX3VwZGF0ZV9yZWdpb24gKHBEYXRhKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ESVNQTEFZX0JHUkE4LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZiAvKiBNTkdfTk9fMTZCSVRfU1VQUE9SVCAqLworI2VuZGlmIC8qIE1OR19TS0lQQ0FOVkFTX0JHUkE4ICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDQU5WQVNfQkdSQThfUE0KKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyNpZm5kZWYgTU5HX09QVElNSVpFX0ZPT1RQUklOVF9DT01QT1NFCittbmdfcmV0Y29kZSBtbmdfZGlzcGxheV9iZ3JhOF9wbSAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfdWludDhwIHBTY2FubGluZTsKKyAgbW5nX3VpbnQ4cCBwRGF0YWxpbmU7CisgIG1uZ19pbnQzMiAgaVg7CisgIG1uZ191aW50MzIgcywgdDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ESVNQTEFZX0JHUkE4UE0sIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZpZXdhYmxlIHJvdyA/ICovCisgIGlmICgocERhdGEtPmlSb3cgPj0gcERhdGEtPmlTb3VyY2V0KSAmJiAocERhdGEtPmlSb3cgPCBwRGF0YS0+aVNvdXJjZWIpKQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkcmVzcyBkZXN0aW5hdGlvbiByb3cgKi8KKyAgICBwU2NhbmxpbmUgPSAobW5nX3VpbnQ4cClwRGF0YS0+ZkdldGNhbnZhc2xpbmUgKCgobW5nX2hhbmRsZSlwRGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aVJvdyArIHBEYXRhLT5pRGVzdHQgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlTb3VyY2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkanVzdCBkZXN0aW5hdGlvbiByb3cgc3RhcnRpbmctcG9pbnQgKi8KKyAgICBwU2NhbmxpbmUgPSBwU2NhbmxpbmUgKyAocERhdGEtPmlDb2wgPDwgMikgKyAocERhdGEtPmlEZXN0bCA8PCAyKTsKKyAgICBwRGF0YWxpbmUgPSBwRGF0YS0+cFJHQkFyb3c7ICAgICAgIC8qIGFkZHJlc3Mgc291cmNlIHJvdyAqLworCisgICAgaWYgKHBEYXRhLT5iSXNSR0JBMTYpICAgICAgICAgICAgICAvKiBhZGp1c3Qgc291cmNlIHJvdyBzdGFydGluZy1wb2ludCAqLworICAgICAgcERhdGFsaW5lID0gcERhdGFsaW5lICsgKChwRGF0YS0+aVNvdXJjZWwgLyBwRGF0YS0+aUNvbGluYykgPDwgMyk7CisgICAgZWxzZQorICAgICAgcERhdGFsaW5lID0gcERhdGFsaW5lICsgKChwRGF0YS0+aVNvdXJjZWwgLyBwRGF0YS0+aUNvbGluYykgPDwgMik7CisKKyAgICBpZiAocERhdGEtPmJJc09wYXF1ZSkgICAgICAgICAgICAgIC8qIGZvcmdldCBhYm91dCB0cmFuc3BhcmVuY3kgPyAqLworICAgIHsKKyAgICAgIGlmIChwRGF0YS0+YklzUkdCQTE2KSAgICAgICAgICAgIC8qIDE2LWJpdCBpbnB1dCByb3cgPyAqLworICAgICAgeworICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlTb3VyY2VsICsgcERhdGEtPmlDb2w7IGlYIDwgcERhdGEtPmlTb3VyY2VyOworICAgICAgICAgICAgIGlYICs9IHBEYXRhLT5pQ29saW5jKQorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbGUgZG93biBieSBkcm9wcGluZyB0aGUgTFNCICovCisgICAgICAgICAgaWYgKChzID0gcERhdGFsaW5lWzZdKSA9PSAwKQorICAgICAgICAgICAgKihtbmdfdWludDMyKikgcFNjYW5saW5lID0gMDsgLyogc2V0IGFsbCBjb21wb25lbnRzID0gMCAqLworICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICBpZiAocyA9PSAyNTUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHBTY2FubGluZVswXSA9IHBEYXRhbGluZVs0XTsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzFdID0gcERhdGFsaW5lWzJdOworICAgICAgICAgICAgICBwU2NhbmxpbmVbMl0gPSBwRGF0YWxpbmVbMF07CisgICAgICAgICAgICAgIHBTY2FubGluZVszXSA9IDI1NTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzBdID0gRElWMjU1QjgocyAqIHBEYXRhbGluZVs0XSk7CisgICAgICAgICAgICAgIHBTY2FubGluZVsxXSA9IERJVjI1NUI4KHMgKiBwRGF0YWxpbmVbMl0pOworICAgICAgICAgICAgICBwU2NhbmxpbmVbMl0gPSBESVYyNTVCOChzICogcERhdGFsaW5lWzBdKTsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzNdID0gKG1uZ191aW50OClzOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jIDw8IDIpOworICAgICAgICAgIHBEYXRhbGluZSArPSA4OworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3B5IHRoZSB2YWx1ZXMgYW5kIHByZW11bHRpcGx5ICovCisgICAgICAgICAgaWYgKChzID0gcERhdGFsaW5lWzNdKSA9PSAwKQorICAgICAgICAgICAgKihtbmdfdWludDMyKikgcFNjYW5saW5lID0gMDsgLyogc2V0IGFsbCBjb21wb25lbnRzID0gMCAqLworICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICBpZiAocyA9PSAyNTUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHBTY2FubGluZVswXSA9IHBEYXRhbGluZVsyXTsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzFdID0gcERhdGFsaW5lWzFdOworICAgICAgICAgICAgICBwU2NhbmxpbmVbMl0gPSBwRGF0YWxpbmVbMF07CisgICAgICAgICAgICAgIHBTY2FubGluZVszXSA9IDI1NTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzBdID0gRElWMjU1QjgocyAqIHBEYXRhbGluZVsyXSk7CisgICAgICAgICAgICAgIHBTY2FubGluZVsxXSA9IERJVjI1NUI4KHMgKiBwRGF0YWxpbmVbMV0pOworICAgICAgICAgICAgICBwU2NhbmxpbmVbMl0gPSBESVYyNTVCOChzICogcERhdGFsaW5lWzBdKTsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzNdID0gKG1uZ191aW50OClzOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIHBTY2FubGluZSArPSAocERhdGEtPmlDb2xpbmMgPDwgMik7CisgICAgICAgICAgcERhdGFsaW5lICs9IDQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGlmIChwRGF0YS0+YklzUkdCQTE2KSAgICAgICAgICAgIC8qIDE2LWJpdCBpbnB1dCByb3cgPyAqLworICAgICAgeworICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlTb3VyY2VsICsgcERhdGEtPmlDb2w7IGlYIDwgcERhdGEtPmlTb3VyY2VyOworICAgICAgICAgICAgIGlYICs9IHBEYXRhLT5pQ29saW5jKQorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0IGFscGhhIHZhbHVlcyAqLworICAgICAgICAgIGlmICgocyA9IHBEYXRhbGluZVs2XSkgIT0gMCkgICAgICAgLyogYW55IG9wYWNpdHkgYXQgYWxsID8gKi8KKyAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZ1bGx5IG9wYXF1ZSBvciBiYWNrZ3JvdW5kIGZ1bGx5IHRyYW5zcGFyZW50ID8gKi8KKyAgICAgICAgICAgIGlmIChzID09IDI1NSkKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBsYWluIGNvcHkgaXQgKi8KKyAgICAgICAgICAgICAgcFNjYW5saW5lWzBdID0gcERhdGFsaW5lWzRdOworICAgICAgICAgICAgICBwU2NhbmxpbmVbMV0gPSBwRGF0YWxpbmVbMl07CisgICAgICAgICAgICAgIHBTY2FubGluZVsyXSA9IHBEYXRhbGluZVswXTsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzNdID0gMjU1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm93IGJsZW5kIChwcmVtdWx0aXBsaWVkKSAqLworICAgICAgICAgICAgICB0ID0gMjU1IC0gczsKKyNpZmRlZiBNTkdfT1BUSU1JWkVfRk9PVFBSSU5UX0RJVgorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgICAgZm9yIChpPTI7IGkgPj0gMDsgaS0tKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHBTY2FubGluZVtpXSA9IERJVjI1NUI4KHMgKiBwRGF0YWxpbmVbNC1pLWldICsgdCAqCisgICAgICAgICAgICAgICAgICAgICBwU2NhbmxpbmVbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzBdID0gRElWMjU1QjgocyAqIHBEYXRhbGluZVs0XSArIHQgKiBwU2NhbmxpbmVbMF0pOworICAgICAgICAgICAgICBwU2NhbmxpbmVbMV0gPSBESVYyNTVCOChzICogcERhdGFsaW5lWzJdICsgdCAqIHBTY2FubGluZVsxXSk7CisgICAgICAgICAgICAgIHBTY2FubGluZVsyXSA9IERJVjI1NUI4KHMgKiBwRGF0YWxpbmVbMF0gKyB0ICogcFNjYW5saW5lWzJdKTsKKyNlbmRpZgorICAgICAgICAgICAgICBwU2NhbmxpbmVbM10gPSAobW5nX3VpbnQ4KSgyNTUgLSBESVYyNTVCOCh0ICogKDI1NSAtIHBTY2FubGluZVszXSkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jIDw8IDIpOworICAgICAgICAgIHBEYXRhbGluZSArPSA4OworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKHMgPSBwRGF0YWxpbmVbM10pICE9IDApICAgICAgIC8qIGFueSBvcGFjaXR5IGF0IGFsbCA/ICovCisgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmdWxseSBvcGFxdWUgPyAqLworICAgICAgICAgICAgaWYgKHMgPT0gMjU1KQorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlbiBzaW1wbHkgY29weSB0aGUgdmFsdWVzICovCisgICAgICAgICAgICAgIHBTY2FubGluZVswXSA9IHBEYXRhbGluZVsyXTsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzFdID0gcERhdGFsaW5lWzFdOworICAgICAgICAgICAgICBwU2NhbmxpbmVbMl0gPSBwRGF0YWxpbmVbMF07CisgICAgICAgICAgICAgIHBTY2FubGluZVszXSA9IDI1NTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdyBibGVuZCAocHJlbXVsdGlwbGllZCkgKi8KKyAgICAgICAgICAgICAgdCA9IDI1NSAtIHM7CisjaWZkZWYgTU5HX09QVElNSVpFX0ZPT1RQUklOVF9ESVYKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgIGZvciAoaT0yOyBpID49IDA7IGktLSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBwU2NhbmxpbmVbaV0gPSBESVYyNTVCOChzICogcERhdGFsaW5lWzItaV0gKyB0ICoKKyAgICAgICAgICAgICAgICAgICAgIHBTY2FubGluZVtpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgICBwU2NhbmxpbmVbMF0gPSBESVYyNTVCOChzICogcERhdGFsaW5lWzJdICsgdCAqIHBTY2FubGluZVswXSk7CisgICAgICAgICAgICAgIHBTY2FubGluZVsxXSA9IERJVjI1NUI4KHMgKiBwRGF0YWxpbmVbMV0gKyB0ICogcFNjYW5saW5lWzFdKTsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzJdID0gRElWMjU1QjgocyAqIHBEYXRhbGluZVswXSArIHQgKiBwU2NhbmxpbmVbMl0pOworI2VuZGlmCisgICAgICAgICAgICAgIHBTY2FubGluZVszXSA9IChtbmdfdWludDgpKDI1NSAtIERJVjI1NUI4KHQgKiAoMjU1IC0gcFNjYW5saW5lWzNdKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIHBTY2FubGluZSArPSAocERhdGEtPmlDb2xpbmMgPDwgMik7CisgICAgICAgICAgcERhdGFsaW5lICs9IDQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBjaGVja191cGRhdGVfcmVnaW9uIChwRGF0YSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRElTUExBWV9CR1JBOFBNLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbHNlIC8qIE1OR19PUFRJTUlaRV9GT09UUFJJTlRfQ09NUE9TRSAqLworbW5nX3JldGNvZGUgbW5nX2Rpc3BsYXlfYmdyYThfcG0gKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX3VpbnQ4cCBwU2NhbmxpbmU7CisgIG1uZ191aW50OHAgcERhdGFsaW5lOworICBtbmdfaW50MzIgIGlYOworICBtbmdfdWludDMyIHMsIHQ7CisgIG1uZ191aW50OCAgaUJwczsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ESVNQTEFZX0JHUkE4UE0sIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpQnBzPShtbmdfdWludDgpKHBEYXRhLT5iSXNSR0JBMTYgPyAyOjEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdmlld2FibGUgcm93ID8gKi8KKyAgaWYgKChwRGF0YS0+aVJvdyA+PSBwRGF0YS0+aVNvdXJjZXQpICYmIChwRGF0YS0+aVJvdyA8IHBEYXRhLT5pU291cmNlYikpCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGRyZXNzIGRlc3RpbmF0aW9uIHJvdyAqLworICAgIHBTY2FubGluZSA9IChtbmdfdWludDhwKXBEYXRhLT5mR2V0Y2FudmFzbGluZSAoKChtbmdfaGFuZGxlKXBEYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pUm93ICsgcERhdGEtPmlEZXN0dCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aVNvdXJjZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRqdXN0IGRlc3RpbmF0aW9uIHJvdyBzdGFydGluZy1wb2ludCAqLworICAgIHBTY2FubGluZSA9IHBTY2FubGluZSArIChwRGF0YS0+aUNvbCA8PCAyKSArIChwRGF0YS0+aURlc3RsIDw8IDIpOworICAgIHBEYXRhbGluZSA9IHBEYXRhLT5wUkdCQXJvdzsgICAgICAgLyogYWRkcmVzcyBzb3VyY2Ugcm93ICovCisKKyAgICAvKiBhZGp1c3Qgc291cmNlIHJvdyBzdGFydGluZy1wb2ludCAqLworICAgIHBEYXRhbGluZSA9IHBEYXRhbGluZSArICgocERhdGEtPmlTb3VyY2VsIC8gcERhdGEtPmlDb2xpbmMpIDw8IChpQnBzKzEpKTsKKworICAgIGlmIChwRGF0YS0+YklzT3BhcXVlKSAgICAgICAgICAgICAgLyogZm9yZ2V0IGFib3V0IHRyYW5zcGFyZW5jeSA/ICovCisgICAgeworICAgICAgaWYgKHBEYXRhLT5iSXNSR0JBMTYpICAgICAgICAgICAgLyogMTYtYml0IGlucHV0IHJvdyA/ICovCisgICAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzY2FsZSBkb3duIGJ5IGRyb3BwaW5nIHRoZSBMU0IgKi8KKyAgICAgICAgICBpZiAoKHMgPSBwRGF0YWxpbmVbNl0pID09IDApCisgICAgICAgICAgICAqKG1uZ191aW50MzIqKSBwU2NhbmxpbmUgPSAwOyAvKiBzZXQgYWxsIGNvbXBvbmVudHMgPSAwICovCisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzID09IDI1NSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzBdID0gcERhdGFsaW5lWzRdOworICAgICAgICAgICAgICBwU2NhbmxpbmVbMV0gPSBwRGF0YWxpbmVbMl07CisgICAgICAgICAgICAgIHBTY2FubGluZVsyXSA9IHBEYXRhbGluZVswXTsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzNdID0gMjU1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworI2lmZGVmIE1OR19PUFRJTUlaRV9GT09UUFJJTlRfRElWCisgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICBmb3IgKGk9MjsgaSA+PSAwOyBpLS0pCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwU2NhbmxpbmVbaV0gPSBESVYyNTVCOChzICogcERhdGFsaW5lWzQtaS1pXSk7CisgICAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICAgIHBTY2FubGluZVswXSA9IERJVjI1NUI4KHMgKiBwRGF0YWxpbmVbNF0pOworICAgICAgICAgICAgICBwU2NhbmxpbmVbMV0gPSBESVYyNTVCOChzICogcERhdGFsaW5lWzJdKTsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzJdID0gRElWMjU1QjgocyAqIHBEYXRhbGluZVswXSk7CisjZW5kaWYKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzNdID0gKG1uZ191aW50OClzOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jIDw8IDIpOworICAgICAgICAgIHBEYXRhbGluZSArPSA4OworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3B5IHRoZSB2YWx1ZXMgYW5kIHByZW11bHRpcGx5ICovCisgICAgICAgICAgaWYgKChzID0gcERhdGFsaW5lWzNdKSA9PSAwKQorICAgICAgICAgICAgKihtbmdfdWludDMyKikgcFNjYW5saW5lID0gMDsgLyogc2V0IGFsbCBjb21wb25lbnRzID0gMCAqLworICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICBpZiAocyA9PSAyNTUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHBTY2FubGluZVswXSA9IHBEYXRhbGluZVsyXTsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzFdID0gcERhdGFsaW5lWzFdOworICAgICAgICAgICAgICBwU2NhbmxpbmVbMl0gPSBwRGF0YWxpbmVbMF07CisgICAgICAgICAgICAgIHBTY2FubGluZVszXSA9IDI1NTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyNpZmRlZiBNTkdfT1BUSU1JWkVfRk9PVFBSSU5UX0RJVgorICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgZm9yIChpPTI7IGkgPj0gMDsgaS0tKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcFNjYW5saW5lW2ldID0gRElWMjU1QjgocyAqIHBEYXRhbGluZVsyLWldKTsKKyAgICAgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzBdID0gRElWMjU1QjgocyAqIHBEYXRhbGluZVsyXSk7CisgICAgICAgICAgICAgIHBTY2FubGluZVsxXSA9IERJVjI1NUI4KHMgKiBwRGF0YWxpbmVbMV0pOworICAgICAgICAgICAgICBwU2NhbmxpbmVbMl0gPSBESVYyNTVCOChzICogcERhdGFsaW5lWzBdKTsKKyNlbmRpZgorICAgICAgICAgICAgICBwU2NhbmxpbmVbM10gPSAobW5nX3VpbnQ4KXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyA8PCAyKTsKKyAgICAgICAgICBwRGF0YWxpbmUgKz0gNDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaWYgKHBEYXRhLT5iSXNSR0JBMTYpICAgICAgICAgICAgLyogMTYtYml0IGlucHV0IHJvdyA/ICovCisgICAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgYWxwaGEgdmFsdWVzICovCisgICAgICAgICAgaWYgKChzID0gcERhdGFsaW5lWzZdKSAhPSAwKSAgICAgICAvKiBhbnkgb3BhY2l0eSBhdCBhbGwgPyAqLworICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZnVsbHkgb3BhcXVlIG9yIGJhY2tncm91bmQgZnVsbHkgdHJhbnNwYXJlbnQgPyAqLworICAgICAgICAgICAgaWYgKHMgPT0gMjU1KQorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGxhaW4gY29weSBpdCAqLworICAgICAgICAgICAgICBwU2NhbmxpbmVbMF0gPSBwRGF0YWxpbmVbNF07CisgICAgICAgICAgICAgIHBTY2FubGluZVsxXSA9IHBEYXRhbGluZVsyXTsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzJdID0gcERhdGFsaW5lWzBdOworICAgICAgICAgICAgICBwU2NhbmxpbmVbM10gPSAyNTU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3cgYmxlbmQgKHByZW11bHRpcGxpZWQpICovCisgICAgICAgICAgICAgIHQgPSAyNTUgLSBzOworI2lmZGVmIE1OR19PUFRJTUlaRV9GT09UUFJJTlRfRElWCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICBmb3IgKGk9MjsgaSA+PSAwOyBpLS0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcFNjYW5saW5lW2ldID0gRElWMjU1QjgocyAqIHBEYXRhbGluZVs0LWktaV0gKyB0ICoKKyAgICAgICAgICAgICAgICAgICAgIHBTY2FubGluZVtpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgICBwU2NhbmxpbmVbMF0gPSBESVYyNTVCOChzICogcERhdGFsaW5lWzRdICsgdCAqIHBTY2FubGluZVswXSk7CisgICAgICAgICAgICAgIHBTY2FubGluZVsxXSA9IERJVjI1NUI4KHMgKiBwRGF0YWxpbmVbMl0gKyB0ICogcFNjYW5saW5lWzFdKTsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzJdID0gRElWMjU1QjgocyAqIHBEYXRhbGluZVswXSArIHQgKiBwU2NhbmxpbmVbMl0pOworI2VuZGlmCisgICAgICAgICAgICAgIHBTY2FubGluZVszXSA9IChtbmdfdWludDgpKDI1NSAtIERJVjI1NUI4KHQgKiAoMjU1IC0gcFNjYW5saW5lWzNdKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIHBTY2FubGluZSArPSAocERhdGEtPmlDb2xpbmMgPDwgMik7CisgICAgICAgICAgcERhdGFsaW5lICs9IDg7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pQ29sOyBpWCA8IHBEYXRhLT5pU291cmNlcjsKKyAgICAgICAgICAgICBpWCArPSBwRGF0YS0+aUNvbGluYykKKyAgICAgICAgeworICAgICAgICAgIGlmICgocyA9IHBEYXRhbGluZVszXSkgIT0gMCkgICAgICAgLyogYW55IG9wYWNpdHkgYXQgYWxsID8gKi8KKyAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZ1bGx5IG9wYXF1ZSA/ICovCisgICAgICAgICAgICBpZiAocyA9PSAyNTUpCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGVuIHNpbXBseSBjb3B5IHRoZSB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgcFNjYW5saW5lWzBdID0gcERhdGFsaW5lWzJdOworICAgICAgICAgICAgICBwU2NhbmxpbmVbMV0gPSBwRGF0YWxpbmVbMV07CisgICAgICAgICAgICAgIHBTY2FubGluZVsyXSA9IHBEYXRhbGluZVswXTsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzNdID0gMjU1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm93IGJsZW5kIChwcmVtdWx0aXBsaWVkKSAqLworICAgICAgICAgICAgICB0ID0gMjU1IC0gczsKKyNpZmRlZiBNTkdfT1BUSU1JWkVfRk9PVFBSSU5UX0RJVgorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgICAgZm9yIChpPTI7IGkgPj0gMDsgaS0tKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHBTY2FubGluZVtpXSA9IERJVjI1NUI4KHMgKiBwRGF0YWxpbmVbMi1pXSArIHQgKgorICAgICAgICAgICAgICAgICAgICAgcFNjYW5saW5lW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICAgIHBTY2FubGluZVswXSA9IERJVjI1NUI4KHMgKiBwRGF0YWxpbmVbMl0gKyB0ICogcFNjYW5saW5lWzBdKTsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzFdID0gRElWMjU1QjgocyAqIHBEYXRhbGluZVsxXSArIHQgKiBwU2NhbmxpbmVbMV0pOworICAgICAgICAgICAgICBwU2NhbmxpbmVbMl0gPSBESVYyNTVCOChzICogcERhdGFsaW5lWzBdICsgdCAqIHBTY2FubGluZVsyXSk7CisjZW5kaWYKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzNdID0gKG1uZ191aW50OCkoMjU1IC0gRElWMjU1QjgodCAqICgyNTUgLSBwU2NhbmxpbmVbM10pKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyA8PCAyKTsKKyAgICAgICAgICBwRGF0YWxpbmUgKz0gNDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIGNoZWNrX3VwZGF0ZV9yZWdpb24gKHBEYXRhKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ESVNQTEFZX0JHUkE4UE0sIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmIC8qIE1OR19PUFRJTUlaRV9GT09UUFJJTlRfQ09NUE9TRSAqLworI2Vsc2UgLyogTU5HX05PXzE2QklUX1NVUFBPUlQgKi8KK21uZ19yZXRjb2RlIG1uZ19kaXNwbGF5X2JncmE4X3BtIChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ191aW50OHAgcFNjYW5saW5lOworICBtbmdfdWludDhwIHBEYXRhbGluZTsKKyAgbW5nX2ludDMyICBpWDsKKyAgbW5nX3VpbnQzMiBzLCB0OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RJU1BMQVlfQkdSQThQTSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdmlld2FibGUgcm93ID8gKi8KKyAgaWYgKChwRGF0YS0+aVJvdyA+PSBwRGF0YS0+aVNvdXJjZXQpICYmIChwRGF0YS0+aVJvdyA8IHBEYXRhLT5pU291cmNlYikpCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGRyZXNzIGRlc3RpbmF0aW9uIHJvdyAqLworICAgIHBTY2FubGluZSA9IChtbmdfdWludDhwKXBEYXRhLT5mR2V0Y2FudmFzbGluZSAoKChtbmdfaGFuZGxlKXBEYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pUm93ICsgcERhdGEtPmlEZXN0dCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aVNvdXJjZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRqdXN0IGRlc3RpbmF0aW9uIHJvdyBzdGFydGluZy1wb2ludCAqLworICAgIHBTY2FubGluZSA9IHBTY2FubGluZSArIChwRGF0YS0+aUNvbCA8PCAyKSArIChwRGF0YS0+aURlc3RsIDw8IDIpOworICAgIHBEYXRhbGluZSA9IHBEYXRhLT5wUkdCQXJvdzsgICAgICAgLyogYWRkcmVzcyBzb3VyY2Ugcm93ICovCisKKyAgICAgIHBEYXRhbGluZSA9IHBEYXRhbGluZSArICgocERhdGEtPmlTb3VyY2VsIC8gcERhdGEtPmlDb2xpbmMpIDw8IDIpOworCisgICAgaWYgKHBEYXRhLT5iSXNPcGFxdWUpICAgICAgICAgICAgICAvKiBmb3JnZXQgYWJvdXQgdHJhbnNwYXJlbmN5ID8gKi8KKyAgICB7CisgICAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3B5IHRoZSB2YWx1ZXMgYW5kIHByZW11bHRpcGx5ICovCisgICAgICAgICAgaWYgKChzID0gcERhdGFsaW5lWzNdKSA9PSAwKQorICAgICAgICAgICAgKihtbmdfdWludDMyKikgcFNjYW5saW5lID0gMDsgLyogc2V0IGFsbCBjb21wb25lbnRzID0gMCAqLworICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICBpZiAocyA9PSAyNTUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHBTY2FubGluZVswXSA9IHBEYXRhbGluZVsyXTsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzFdID0gcERhdGFsaW5lWzFdOworICAgICAgICAgICAgICBwU2NhbmxpbmVbMl0gPSBwRGF0YWxpbmVbMF07CisgICAgICAgICAgICAgIHBTY2FubGluZVszXSA9IDI1NTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyNpZmRlZiBNTkdfT1BUSU1JWkVfRk9PVFBSSU5UX0RJVgorICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgZm9yIChpPTI7IGkgPj0gMDsgaS0tKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcFNjYW5saW5lW2ldID0gRElWMjU1QjgocyAqIHBEYXRhbGluZVsyLWldKTsKKyAgICAgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzBdID0gRElWMjU1QjgocyAqIHBEYXRhbGluZVsyXSk7CisgICAgICAgICAgICAgIHBTY2FubGluZVsxXSA9IERJVjI1NUI4KHMgKiBwRGF0YWxpbmVbMV0pOworICAgICAgICAgICAgICBwU2NhbmxpbmVbMl0gPSBESVYyNTVCOChzICogcERhdGFsaW5lWzBdKTsKKyNlbmRpZgorICAgICAgICAgICAgICBwU2NhbmxpbmVbM10gPSAobW5nX3VpbnQ4KXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyA8PCAyKTsKKyAgICAgICAgICBwRGF0YWxpbmUgKz0gNDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgeworICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlTb3VyY2VsICsgcERhdGEtPmlDb2w7IGlYIDwgcERhdGEtPmlTb3VyY2VyOworICAgICAgICAgICAgIGlYICs9IHBEYXRhLT5pQ29saW5jKQorICAgICAgICB7CisgICAgICAgICAgaWYgKChzID0gcERhdGFsaW5lWzNdKSAhPSAwKSAgICAgICAvKiBhbnkgb3BhY2l0eSBhdCBhbGwgPyAqLworICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZnVsbHkgb3BhcXVlID8gKi8KKyAgICAgICAgICAgIGlmIChzID09IDI1NSkKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZW4gc2ltcGx5IGNvcHkgdGhlIHZhbHVlcyAqLworICAgICAgICAgICAgICBwU2NhbmxpbmVbMF0gPSBwRGF0YWxpbmVbMl07CisgICAgICAgICAgICAgIHBTY2FubGluZVsxXSA9IHBEYXRhbGluZVsxXTsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzJdID0gcERhdGFsaW5lWzBdOworICAgICAgICAgICAgICBwU2NhbmxpbmVbM10gPSAyNTU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3cgYmxlbmQgKHByZW11bHRpcGxpZWQpICovCisgICAgICAgICAgICAgIHQgPSAyNTUgLSBzOworI2lmZGVmIE1OR19PUFRJTUlaRV9GT09UUFJJTlRfRElWCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICBmb3IgKGk9MjsgaSA+PSAwOyBpLS0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcFNjYW5saW5lW2ldID0gRElWMjU1QjgocyAqIHBEYXRhbGluZVsyLWldICsgdCAqCisgICAgICAgICAgICAgICAgICAgICBwU2NhbmxpbmVbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzBdID0gRElWMjU1QjgocyAqIHBEYXRhbGluZVsyXSArIHQgKiBwU2NhbmxpbmVbMF0pOworICAgICAgICAgICAgICBwU2NhbmxpbmVbMV0gPSBESVYyNTVCOChzICogcERhdGFsaW5lWzFdICsgdCAqIHBTY2FubGluZVsxXSk7CisgICAgICAgICAgICAgIHBTY2FubGluZVsyXSA9IERJVjI1NUI4KHMgKiBwRGF0YWxpbmVbMF0gKyB0ICogcFNjYW5saW5lWzJdKTsKKyNlbmRpZgorICAgICAgICAgICAgICBwU2NhbmxpbmVbM10gPSAobW5nX3VpbnQ4KSgyNTUgLSBESVYyNTVCOCh0ICogKDI1NSAtIHBTY2FubGluZVszXSkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jIDw8IDIpOworICAgICAgICAgIHBEYXRhbGluZSArPSA0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgY2hlY2tfdXBkYXRlX3JlZ2lvbiAocERhdGEpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RJU1BMQVlfQkdSQThQTSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYgLyogTU5HX05PXzE2QklUX1NVUFBPUlQgKi8KKyNlbmRpZiAvKiBNTkdfU0tJUENBTlZBU19CR1JBOF9QTSAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0FOVkFTX0FCR1I4CisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisjaWZuZGVmIE1OR19PUFRJTUlaRV9GT09UUFJJTlRfQ09NUE9TRQorbW5nX3JldGNvZGUgbW5nX2Rpc3BsYXlfYWJncjggKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX3VpbnQ4cCBwU2NhbmxpbmU7CisgIG1uZ191aW50OHAgcERhdGFsaW5lOworICBtbmdfaW50MzIgIGlYOworICBtbmdfdWludDggIGlGR2E4LCBpQkdhOCwgaUNhODsKKyAgbW5nX3VpbnQxNiBpRkdhMTYsIGlCR2ExNiwgaUNhMTY7CisgIG1uZ191aW50MTYgaUZHcjE2LCBpRkdnMTYsIGlGR2IxNjsKKyAgbW5nX3VpbnQxNiBpQkdyMTYsIGlCR2cxNiwgaUJHYjE2OworICBtbmdfdWludDE2IGlDcjE2LCBpQ2cxNiwgaUNiMTY7CisgIG1uZ191aW50OCAgaUNyOCwgaUNnOCwgaUNiODsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ESVNQTEFZX0FCR1I4LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2aWV3YWJsZSByb3cgPyAqLworICBpZiAoKHBEYXRhLT5pUm93ID49IHBEYXRhLT5pU291cmNldCkgJiYgKHBEYXRhLT5pUm93IDwgcERhdGEtPmlTb3VyY2ViKSkKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHJlc3MgZGVzdGluYXRpb24gcm93ICovCisgICAgcFNjYW5saW5lID0gKG1uZ191aW50OHApcERhdGEtPmZHZXRjYW52YXNsaW5lICgoKG1uZ19oYW5kbGUpcERhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlSb3cgKyBwRGF0YS0+aURlc3R0IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pU291cmNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGp1c3QgZGVzdGluYXRpb24gcm93IHN0YXJ0aW5nLXBvaW50ICovCisgICAgcFNjYW5saW5lID0gcFNjYW5saW5lICsgKHBEYXRhLT5pQ29sIDw8IDIpICsgKHBEYXRhLT5pRGVzdGwgPDwgMik7CisgICAgcERhdGFsaW5lID0gcERhdGEtPnBSR0JBcm93OyAgICAgICAvKiBhZGRyZXNzIHNvdXJjZSByb3cgKi8KKworICAgIGlmIChwRGF0YS0+YklzUkdCQTE2KSAgICAgICAgICAgICAgLyogYWRqdXN0IHNvdXJjZSByb3cgc3RhcnRpbmctcG9pbnQgKi8KKyAgICAgIHBEYXRhbGluZSA9IHBEYXRhbGluZSArICgocERhdGEtPmlTb3VyY2VsIC8gcERhdGEtPmlDb2xpbmMpIDw8IDMpOworICAgIGVsc2UKKyAgICAgIHBEYXRhbGluZSA9IHBEYXRhbGluZSArICgocERhdGEtPmlTb3VyY2VsIC8gcERhdGEtPmlDb2xpbmMpIDw8IDIpOworCisgICAgaWYgKHBEYXRhLT5iSXNPcGFxdWUpICAgICAgICAgICAgICAvKiBmb3JnZXQgYWJvdXQgdHJhbnNwYXJlbmN5ID8gKi8KKyAgICB7CisgICAgICBpZiAocERhdGEtPmJJc1JHQkExNikgICAgICAgICAgICAvKiAxNi1iaXQgaW5wdXQgcm93ID8gKi8KKyAgICAgIHsKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pQ29sOyBpWCA8IHBEYXRhLT5pU291cmNlcjsKKyAgICAgICAgICAgICBpWCArPSBwRGF0YS0+aUNvbGluYykKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjYWxlIGRvd24gYnkgZHJvcHBpbmcgdGhlIExTQiAqLworICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKihwRGF0YWxpbmUrNik7CisgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAqKHBEYXRhbGluZSs0KTsKKyAgICAgICAgICAqKHBTY2FubGluZSsyKSA9ICoocERhdGFsaW5lKzIpOworICAgICAgICAgICoocFNjYW5saW5lKzMpID0gKnBEYXRhbGluZTsKKworICAgICAgICAgIHBTY2FubGluZSArPSAocERhdGEtPmlDb2xpbmMgPDwgMik7CisgICAgICAgICAgcERhdGFsaW5lICs9IDg7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pQ29sOyBpWCA8IHBEYXRhLT5pU291cmNlcjsKKyAgICAgICAgICAgICBpWCArPSBwRGF0YS0+aUNvbGluYykKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvcHkgdGhlIHZhbHVlcyAqLworICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKihwRGF0YWxpbmUrMyk7CisgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAqKHBEYXRhbGluZSsyKTsKKyAgICAgICAgICAqKHBTY2FubGluZSsyKSA9ICoocERhdGFsaW5lKzEpOworICAgICAgICAgICoocFNjYW5saW5lKzMpID0gKnBEYXRhbGluZTsKKworICAgICAgICAgIHBTY2FubGluZSArPSAocERhdGEtPmlDb2xpbmMgPDwgMik7CisgICAgICAgICAgcERhdGFsaW5lICs9IDQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGlmIChwRGF0YS0+YklzUkdCQTE2KSAgICAgICAgICAgIC8qIDE2LWJpdCBpbnB1dCByb3cgPyAqLworICAgICAgeworICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlTb3VyY2VsICsgcERhdGEtPmlDb2w7IGlYIDwgcERhdGEtPmlTb3VyY2VyOworICAgICAgICAgICAgIGlYICs9IHBEYXRhLT5pQ29saW5jKQorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0IGFscGhhIHZhbHVlcyAqLworICAgICAgICAgIGlGR2ExNiA9IG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUrNik7CisgICAgICAgICAgaUJHYTE2ID0gKG1uZ191aW50MTYpKCpwU2NhbmxpbmUpOworICAgICAgICAgIGlCR2ExNiA9IChtbmdfdWludDE2KShpQkdhMTYgPDwgOCkgfCBpQkdhMTY7CisKKyAgICAgICAgICBpZiAoaUZHYTE2KSAgICAgICAgICAgICAgICAgIC8qIGFueSBvcGFjaXR5IGF0IGFsbCA/ICovCisgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmdWxseSBvcGFxdWUgb3IgYmFja2dyb3VuZCBmdWxseSB0cmFuc3BhcmVudCA/ICovCisgICAgICAgICAgICBpZiAoKGlGR2ExNiA9PSAweEZGRkYpIHx8IChpQkdhMTYgPT0gMCkpCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwbGFpbiBjb3B5IGl0ICovCisgICAgICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKihwRGF0YWxpbmUrNik7CisgICAgICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKihwRGF0YWxpbmUrNCk7CisgICAgICAgICAgICAgICoocFNjYW5saW5lKzIpID0gKihwRGF0YWxpbmUrMik7CisgICAgICAgICAgICAgICoocFNjYW5saW5lKzMpID0gKnBEYXRhbGluZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKGlCR2ExNiA9PSAweEZGRkYpICAgIC8qIGJhY2tncm91bmQgZnVsbHkgb3BhcXVlID8gKi8KKyAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCB0aGUgcHJvcGVyIHZhbHVlcyAqLworICAgICAgICAgICAgICAgIGlGR3IxNiA9IG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUgICk7CisgICAgICAgICAgICAgICAgaUZHZzE2ID0gbW5nX2dldF91aW50MTYgKHBEYXRhbGluZSsyKTsKKyAgICAgICAgICAgICAgICBpRkdiMTYgPSBtbmdfZ2V0X3VpbnQxNiAocERhdGFsaW5lKzQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbGUgYmFja2dyb3VuZCB1cCAqLworICAgICAgICAgICAgICAgIGlCR3IxNiA9IChtbmdfdWludDE2KSgqKHBTY2FubGluZSszKSk7CisgICAgICAgICAgICAgICAgaUJHZzE2ID0gKG1uZ191aW50MTYpKCoocFNjYW5saW5lKzIpKTsKKyAgICAgICAgICAgICAgICBpQkdiMTYgPSAobW5nX3VpbnQxNikoKihwU2NhbmxpbmUrMSkpOworICAgICAgICAgICAgICAgIGlCR3IxNiA9IChtbmdfdWludDE2KSgobW5nX3VpbnQzMilpQkdyMTYgPDwgOCkgfCBpQkdyMTY7CisgICAgICAgICAgICAgICAgaUJHZzE2ID0gKG1uZ191aW50MTYpKChtbmdfdWludDMyKWlCR2cxNiA8PCA4KSB8IGlCR2cxNjsKKyAgICAgICAgICAgICAgICBpQkdiMTYgPSAobW5nX3VpbnQxNikoKG1uZ191aW50MzIpaUJHYjE2IDw8IDgpIHwgaUJHYjE2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm93IGNvbXBvc2UgKi8KKyAgICAgICAgICAgICAgICBNTkdfQ09NUE9TRTE2KGlGR3IxNiwgaUZHcjE2LCBpRkdhMTYsIGlCR3IxNik7CisgICAgICAgICAgICAgICAgTU5HX0NPTVBPU0UxNihpRkdnMTYsIGlGR2cxNiwgaUZHYTE2LCBpQkdnMTYpOworICAgICAgICAgICAgICAgIE1OR19DT01QT1NFMTYoaUZHYjE2LCBpRkdiMTYsIGlGR2ExNiwgaUJHYjE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCByZXR1cm4gdGhlIGNvbXBvc2VkIHZhbHVlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWxwaGEgaXRzZWxmIHJlbWFpbnMgZnVsbHkgb3BhcXVlICEhISAqLworICAgICAgICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKG1uZ191aW50OCkoaUZHYjE2ID4+IDgpOworICAgICAgICAgICAgICAgICoocFNjYW5saW5lKzIpID0gKG1uZ191aW50OCkoaUZHZzE2ID4+IDgpOworICAgICAgICAgICAgICAgICoocFNjYW5saW5lKzMpID0gKG1uZ191aW50OCkoaUZHcjE2ID4+IDgpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjYWxlIGJhY2tncm91bmQgdXAgKi8KKyAgICAgICAgICAgICAgICBpQkdyMTYgPSAobW5nX3VpbnQxNikoKihwU2NhbmxpbmUrMykpOworICAgICAgICAgICAgICAgIGlCR2cxNiA9IChtbmdfdWludDE2KSgqKHBTY2FubGluZSsyKSk7CisgICAgICAgICAgICAgICAgaUJHYjE2ID0gKG1uZ191aW50MTYpKCoocFNjYW5saW5lKzEpKTsKKyAgICAgICAgICAgICAgICBpQkdyMTYgPSAobW5nX3VpbnQxNikoKG1uZ191aW50MzIpaUJHcjE2IDw8IDgpIHwgaUJHcjE2OworICAgICAgICAgICAgICAgIGlCR2cxNiA9IChtbmdfdWludDE2KSgobW5nX3VpbnQzMilpQkdnMTYgPDwgOCkgfCBpQkdnMTY7CisgICAgICAgICAgICAgICAgaUJHYjE2ID0gKG1uZ191aW50MTYpKChtbmdfdWludDMyKWlCR2IxNiA8PCA4KSB8IGlCR2IxNjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxldCdzIGJsZW5kICovCisgICAgICAgICAgICAgICAgTU5HX0JMRU5EMTYgKG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUgICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUrMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUrNCksIGlGR2ExNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUJHcjE2LCBpQkdnMTYsIGlCR2IxNiwgaUJHYTE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpQ3IxNiwgIGlDZzE2LCAgaUNiMTYsICBpQ2ExNik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgcmV0dXJuIHRoZSBjb21wb3NlZCB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgICAqcFNjYW5saW5lICAgICA9IChtbmdfdWludDgpKGlDYTE2ID4+IDgpOworICAgICAgICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKG1uZ191aW50OCkoaUNiMTYgPj4gOCk7CisgICAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMikgPSAobW5nX3VpbnQ4KShpQ2cxNiA+PiA4KTsKKyAgICAgICAgICAgICAgICAqKHBTY2FubGluZSszKSA9IChtbmdfdWludDgpKGlDcjE2ID4+IDgpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyA8PCAyKTsKKyAgICAgICAgICBwRGF0YWxpbmUgKz0gODsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlTb3VyY2VsICsgcERhdGEtPmlDb2w7IGlYIDwgcERhdGEtPmlTb3VyY2VyOworICAgICAgICAgICAgIGlYICs9IHBEYXRhLT5pQ29saW5jKQorICAgICAgICB7CisgICAgICAgICAgaUZHYTggPSAqKHBEYXRhbGluZSszKTsgICAgICAvKiBnZXQgYWxwaGEgdmFsdWVzICovCisgICAgICAgICAgaUJHYTggPSAqcFNjYW5saW5lOworCisgICAgICAgICAgaWYgKGlGR2E4KSAgICAgICAgICAgICAgICAgICAvKiBhbnkgb3BhY2l0eSBhdCBhbGwgPyAqLworICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZnVsbHkgb3BhcXVlIG9yIGJhY2tncm91bmQgZnVsbHkgdHJhbnNwYXJlbnQgPyAqLworICAgICAgICAgICAgaWYgKChpRkdhOCA9PSAweEZGKSB8fCAoaUJHYTggPT0gMCkpCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGVuIHNpbXBseSBjb3B5IHRoZSB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAqKHBEYXRhbGluZSszKTsKKyAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAqKHBEYXRhbGluZSsyKTsKKyAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMikgPSAqKHBEYXRhbGluZSsxKTsKKyAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMykgPSAqcERhdGFsaW5lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoaUJHYTggPT0gMHhGRikgICAgICAgLyogYmFja2dyb3VuZCBmdWxseSBvcGFxdWUgPyAqLworICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogZG8gc2ltcGxlIGFscGhhIGNvbXBvc2luZyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWxwaGEgaXRzZWxmIHJlbWFpbnMgZnVsbHkgb3BhcXVlICEhISAqLworICAgICAgICAgICAgICAgIE1OR19DT01QT1NFOCAoKihwU2NhbmxpbmUrMSksICoocERhdGFsaW5lKzIpLCBpRkdhOCwgKihwU2NhbmxpbmUrMSkpOworICAgICAgICAgICAgICAgIE1OR19DT01QT1NFOCAoKihwU2NhbmxpbmUrMiksICoocERhdGFsaW5lKzEpLCBpRkdhOCwgKihwU2NhbmxpbmUrMikpOworICAgICAgICAgICAgICAgIE1OR19DT01QT1NFOCAoKihwU2NhbmxpbmUrMyksICpwRGF0YWxpbmUsICAgICBpRkdhOCwgKihwU2NhbmxpbmUrMykpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdyBibGVuZCAqLworICAgICAgICAgICAgICAgIE1OR19CTEVORDggKCpwRGF0YWxpbmUsICAgICAqKHBEYXRhbGluZSsxKSwgKihwRGF0YWxpbmUrMiksIGlGR2E4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocFNjYW5saW5lKzMpLCAqKHBTY2FubGluZSsyKSwgKihwU2NhbmxpbmUrMSksIGlCR2E4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlDcjgsIGlDZzgsIGlDYjgsIGlDYTgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHJldHVybiB0aGUgY29tcG9zZWQgdmFsdWVzICovCisgICAgICAgICAgICAgICAgKnBTY2FubGluZSAgICAgPSBpQ2E4OworICAgICAgICAgICAgICAgICoocFNjYW5saW5lKzEpID0gaUNiODsKKyAgICAgICAgICAgICAgICAqKHBTY2FubGluZSsyKSA9IGlDZzg7CisgICAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMykgPSBpQ3I4OworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyA8PCAyKTsKKyAgICAgICAgICBwRGF0YWxpbmUgKz0gNDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIGNoZWNrX3VwZGF0ZV9yZWdpb24gKHBEYXRhKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ESVNQTEFZX0FCR1I4LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbHNlIC8qIE1OR19PUFRJTUlaRV9GT09UUFJJTlRfQ09NUE9TRSAqLworbW5nX3JldGNvZGUgbW5nX2Rpc3BsYXlfYWJncjggKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX3VpbnQ4cCBwU2NhbmxpbmU7CisgIG1uZ191aW50OHAgcERhdGFsaW5lOworICBtbmdfaW50MzIgIGlYOworICBtbmdfdWludDggIGlGR2E4LCBpQkdhOCwgaUNhODsKKyAgbW5nX3VpbnQxNiBpRkdhMTYsIGlCR2ExNiwgaUNhMTY7CisgIG1uZ191aW50MTYgaUZHZzE2OworICBtbmdfdWludDE2IGlCR3IxNiwgaUJHZzE2LCBpQkdiMTY7CisgIG1uZ191aW50MTYgaUNyMTYsIGlDZzE2LCBpQ2IxNjsKKyAgbW5nX3VpbnQ4ICBpQ3I4LCBpQ2c4LCBpQ2I4OworICBtbmdfdWludDggIGlCcHM7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRElTUExBWV9BQkdSOCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlCcHM9KG1uZ191aW50OCkocERhdGEtPmJJc1JHQkExNiA/IDI6MSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2aWV3YWJsZSByb3cgPyAqLworICBpZiAoKHBEYXRhLT5pUm93ID49IHBEYXRhLT5pU291cmNldCkgJiYgKHBEYXRhLT5pUm93IDwgcERhdGEtPmlTb3VyY2ViKSkKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHJlc3MgZGVzdGluYXRpb24gcm93ICovCisgICAgcFNjYW5saW5lID0gKG1uZ191aW50OHApcERhdGEtPmZHZXRjYW52YXNsaW5lICgoKG1uZ19oYW5kbGUpcERhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlSb3cgKyBwRGF0YS0+aURlc3R0IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pU291cmNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGp1c3QgZGVzdGluYXRpb24gcm93IHN0YXJ0aW5nLXBvaW50ICovCisgICAgcFNjYW5saW5lID0gcFNjYW5saW5lICsgKHBEYXRhLT5pQ29sIDw8IDIpICsgKHBEYXRhLT5pRGVzdGwgPDwgMik7CisgICAgcERhdGFsaW5lID0gcERhdGEtPnBSR0JBcm93OyAgICAgICAvKiBhZGRyZXNzIHNvdXJjZSByb3cgKi8KKworICAgIC8qIGFkanVzdCBzb3VyY2Ugcm93IHN0YXJ0aW5nLXBvaW50ICovCisgICAgcERhdGFsaW5lID0gcERhdGFsaW5lICsgKChwRGF0YS0+aVNvdXJjZWwgLyBwRGF0YS0+aUNvbGluYykgPDwgKGlCcHMrMSkpOworCisgICAgaWYgKHBEYXRhLT5iSXNPcGFxdWUpICAgICAgICAgICAgICAvKiBmb3JnZXQgYWJvdXQgdHJhbnNwYXJlbmN5ID8gKi8KKyAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzY2FsZSBkb3duIGJ5IGRyb3BwaW5nIHRoZSBMU0IgKi8KKyAgICAgICAgICAqcFNjYW5saW5lICAgICA9ICoocERhdGFsaW5lKzMqaUJwcyk7CisgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAqKHBEYXRhbGluZSsyKmlCcHMpOworICAgICAgICAgICoocFNjYW5saW5lKzIpID0gKihwRGF0YWxpbmUraUJwcyk7CisgICAgICAgICAgKihwU2NhbmxpbmUrMykgPSAqcERhdGFsaW5lOworCisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyA8PCAyKTsKKyAgICAgICAgICBwRGF0YWxpbmUgKz0gNCppQnBzOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBpZiAocERhdGEtPmJJc1JHQkExNikgICAgICAgICAgICAvKiAxNi1iaXQgaW5wdXQgcm93ID8gKi8KKyAgICAgIHsKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pQ29sOyBpWCA8IHBEYXRhLT5pU291cmNlcjsKKyAgICAgICAgICAgICBpWCArPSBwRGF0YS0+aUNvbGluYykKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCBhbHBoYSB2YWx1ZXMgKi8KKyAgICAgICAgICBpRkdhMTYgPSBtbmdfZ2V0X3VpbnQxNiAocERhdGFsaW5lKzYpOworICAgICAgICAgIGlCR2ExNiA9IChtbmdfdWludDE2KSgqcFNjYW5saW5lKTsKKyAgICAgICAgICBpQkdhMTYgPSAobW5nX3VpbnQxNikoaUJHYTE2IDw8IDgpIHwgaUJHYTE2OworCisgICAgICAgICAgaWYgKGlGR2ExNikgICAgICAgICAgICAgICAgICAvKiBhbnkgb3BhY2l0eSBhdCBhbGwgPyAqLworICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZnVsbHkgb3BhcXVlIG9yIGJhY2tncm91bmQgZnVsbHkgdHJhbnNwYXJlbnQgPyAqLworICAgICAgICAgICAgaWYgKChpRkdhMTYgPT0gMHhGRkZGKSB8fCAoaUJHYTE2ID09IDApKQorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGxhaW4gY29weSBpdCAqLworICAgICAgICAgICAgICAqcFNjYW5saW5lICAgICA9ICoocERhdGFsaW5lKzYpOworICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9ICoocERhdGFsaW5lKzQpOworICAgICAgICAgICAgICAqKHBTY2FubGluZSsyKSA9ICoocERhdGFsaW5lKzIpOworICAgICAgICAgICAgICAqKHBTY2FubGluZSszKSA9ICpwRGF0YWxpbmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChpQkdhMTYgPT0gMHhGRkZGKSAgICAvKiBiYWNrZ3JvdW5kIGZ1bGx5IG9wYXF1ZSA/ICovCisgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgdGhlIHByb3BlciB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgIGZvciAoaT0yOyBpID49IDA7IGktLSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlGR2cxNiA9IG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUraStpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjYWxlIGJhY2tncm91bmQgdXAgKi8KKyAgICAgICAgICAgICAgICBpQkdnMTYgPSAobW5nX3VpbnQxNikoKihwU2NhbmxpbmUrMy1pKSk7CisgICAgICAgICAgICAgICAgaUJHZzE2ID0gKG1uZ191aW50MTYpKChtbmdfdWludDMyKWlCR2cxNiA8PCA4KSB8IGlCR2cxNjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdyBjb21wb3NlICovCisgICAgICAgICAgICAgICAgTU5HX0NPTVBPU0UxNihpRkdnMTYsIGlGR2cxNiwgaUZHYTE2LCBpQkdnMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHJldHVybiB0aGUgY29tcG9zZWQgdmFsdWVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbHBoYSBpdHNlbGYgcmVtYWlucyBmdWxseSBvcGFxdWUgISEhICovCisgICAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMy1pKSA9IChtbmdfdWludDgpKGlGR2cxNiA+PiA4KTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjYWxlIGJhY2tncm91bmQgdXAgKi8KKyAgICAgICAgICAgICAgICBpQkdyMTYgPSAobW5nX3VpbnQxNikoKihwU2NhbmxpbmUrMykpOworICAgICAgICAgICAgICAgIGlCR2cxNiA9IChtbmdfdWludDE2KSgqKHBTY2FubGluZSsyKSk7CisgICAgICAgICAgICAgICAgaUJHYjE2ID0gKG1uZ191aW50MTYpKCoocFNjYW5saW5lKzEpKTsKKyAgICAgICAgICAgICAgICBpQkdyMTYgPSAobW5nX3VpbnQxNikoKG1uZ191aW50MzIpaUJHcjE2IDw8IDgpIHwgaUJHcjE2OworICAgICAgICAgICAgICAgIGlCR2cxNiA9IChtbmdfdWludDE2KSgobW5nX3VpbnQzMilpQkdnMTYgPDwgOCkgfCBpQkdnMTY7CisgICAgICAgICAgICAgICAgaUJHYjE2ID0gKG1uZ191aW50MTYpKChtbmdfdWludDMyKWlCR2IxNiA8PCA4KSB8IGlCR2IxNjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxldCdzIGJsZW5kICovCisgICAgICAgICAgICAgICAgTU5HX0JMRU5EMTYgKG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUgICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUrMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUrNCksIGlGR2ExNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUJHcjE2LCBpQkdnMTYsIGlCR2IxNiwgaUJHYTE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpQ3IxNiwgIGlDZzE2LCAgaUNiMTYsICBpQ2ExNik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgcmV0dXJuIHRoZSBjb21wb3NlZCB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgICAqcFNjYW5saW5lICAgICA9IChtbmdfdWludDgpKGlDYTE2ID4+IDgpOworICAgICAgICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKG1uZ191aW50OCkoaUNiMTYgPj4gOCk7CisgICAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMikgPSAobW5nX3VpbnQ4KShpQ2cxNiA+PiA4KTsKKyAgICAgICAgICAgICAgICAqKHBTY2FubGluZSszKSA9IChtbmdfdWludDgpKGlDcjE2ID4+IDgpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyA8PCAyKTsKKyAgICAgICAgICBwRGF0YWxpbmUgKz0gODsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlTb3VyY2VsICsgcERhdGEtPmlDb2w7IGlYIDwgcERhdGEtPmlTb3VyY2VyOworICAgICAgICAgICAgIGlYICs9IHBEYXRhLT5pQ29saW5jKQorICAgICAgICB7CisgICAgICAgICAgaUZHYTggPSAqKHBEYXRhbGluZSszKTsgICAgICAvKiBnZXQgYWxwaGEgdmFsdWVzICovCisgICAgICAgICAgaUJHYTggPSAqcFNjYW5saW5lOworCisgICAgICAgICAgaWYgKGlGR2E4KSAgICAgICAgICAgICAgICAgICAvKiBhbnkgb3BhY2l0eSBhdCBhbGwgPyAqLworICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZnVsbHkgb3BhcXVlIG9yIGJhY2tncm91bmQgZnVsbHkgdHJhbnNwYXJlbnQgPyAqLworICAgICAgICAgICAgaWYgKChpRkdhOCA9PSAweEZGKSB8fCAoaUJHYTggPT0gMCkpCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGVuIHNpbXBseSBjb3B5IHRoZSB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAqKHBEYXRhbGluZSszKTsKKyAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAqKHBEYXRhbGluZSsyKTsKKyAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMikgPSAqKHBEYXRhbGluZSsxKTsKKyAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMykgPSAqcERhdGFsaW5lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoaUJHYTggPT0gMHhGRikgICAgICAgLyogYmFja2dyb3VuZCBmdWxseSBvcGFxdWUgPyAqLworICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogZG8gc2ltcGxlIGFscGhhIGNvbXBvc2luZyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWxwaGEgaXRzZWxmIHJlbWFpbnMgZnVsbHkgb3BhcXVlICEhISAqLworICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgIGZvciAoaT0yOyBpID49IDA7IGktLSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTU5HX0NPTVBPU0U4ICgqKHBTY2FubGluZStpKzEpLCAqKHBEYXRhbGluZSsyLWkpLCBpRkdhOCwgKihwU2NhbmxpbmUraSsxKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdyBibGVuZCAqLworICAgICAgICAgICAgICAgIE1OR19CTEVORDggKCpwRGF0YWxpbmUsICAgICAqKHBEYXRhbGluZSsxKSwgKihwRGF0YWxpbmUrMiksIGlGR2E4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocFNjYW5saW5lKzMpLCAqKHBTY2FubGluZSsyKSwgKihwU2NhbmxpbmUrMSksIGlCR2E4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlDcjgsIGlDZzgsIGlDYjgsIGlDYTgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHJldHVybiB0aGUgY29tcG9zZWQgdmFsdWVzICovCisgICAgICAgICAgICAgICAgKnBTY2FubGluZSAgICAgPSBpQ2E4OworICAgICAgICAgICAgICAgICoocFNjYW5saW5lKzEpID0gaUNiODsKKyAgICAgICAgICAgICAgICAqKHBTY2FubGluZSsyKSA9IGlDZzg7CisgICAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMykgPSBpQ3I4OworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyA8PCAyKTsKKyAgICAgICAgICBwRGF0YWxpbmUgKz0gNDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIGNoZWNrX3VwZGF0ZV9yZWdpb24gKHBEYXRhKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ESVNQTEFZX0FCR1I4LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZiAvKiBNTkdfT1BUSU1JWkVfRk9PVFBSSU5UX0NPTVBPU0UgKi8KKyNlbHNlIC8qIE1OR19OT18xNkJJVF9TVVBQT1JUICovCittbmdfcmV0Y29kZSBtbmdfZGlzcGxheV9hYmdyOCAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfdWludDhwIHBTY2FubGluZTsKKyAgbW5nX3VpbnQ4cCBwRGF0YWxpbmU7CisgIG1uZ19pbnQzMiAgaVg7CisgIG1uZ191aW50OCAgaUZHYTgsIGlCR2E4LCBpQ2E4OworICBtbmdfdWludDggIGlDcjgsIGlDZzgsIGlDYjg7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRElTUExBWV9BQkdSOCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdmlld2FibGUgcm93ID8gKi8KKyAgaWYgKChwRGF0YS0+aVJvdyA+PSBwRGF0YS0+aVNvdXJjZXQpICYmIChwRGF0YS0+aVJvdyA8IHBEYXRhLT5pU291cmNlYikpCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGRyZXNzIGRlc3RpbmF0aW9uIHJvdyAqLworICAgIHBTY2FubGluZSA9IChtbmdfdWludDhwKXBEYXRhLT5mR2V0Y2FudmFzbGluZSAoKChtbmdfaGFuZGxlKXBEYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pUm93ICsgcERhdGEtPmlEZXN0dCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aVNvdXJjZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRqdXN0IGRlc3RpbmF0aW9uIHJvdyBzdGFydGluZy1wb2ludCAqLworICAgIHBTY2FubGluZSA9IHBTY2FubGluZSArIChwRGF0YS0+aUNvbCA8PCAyKSArIChwRGF0YS0+aURlc3RsIDw8IDIpOworICAgIHBEYXRhbGluZSA9IHBEYXRhLT5wUkdCQXJvdzsgICAgICAgLyogYWRkcmVzcyBzb3VyY2Ugcm93ICovCisKKyAgICAgIHBEYXRhbGluZSA9IHBEYXRhbGluZSArICgocERhdGEtPmlTb3VyY2VsIC8gcERhdGEtPmlDb2xpbmMpIDw8IDIpOworCisgICAgaWYgKHBEYXRhLT5iSXNPcGFxdWUpICAgICAgICAgICAgICAvKiBmb3JnZXQgYWJvdXQgdHJhbnNwYXJlbmN5ID8gKi8KKyAgICB7CisgICAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3B5IHRoZSB2YWx1ZXMgKi8KKyAgICAgICAgICAqcFNjYW5saW5lICAgICA9ICoocERhdGFsaW5lKzMpOworICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKihwRGF0YWxpbmUrMik7CisgICAgICAgICAgKihwU2NhbmxpbmUrMikgPSAqKHBEYXRhbGluZSsxKTsKKyAgICAgICAgICAqKHBTY2FubGluZSszKSA9ICpwRGF0YWxpbmU7CisKKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jIDw8IDIpOworICAgICAgICAgIHBEYXRhbGluZSArPSA0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsKKyAgICAgICAgICBpRkdhOCA9ICoocERhdGFsaW5lKzMpOyAgICAgIC8qIGdldCBhbHBoYSB2YWx1ZXMgKi8KKyAgICAgICAgICBpQkdhOCA9ICpwU2NhbmxpbmU7CisKKyAgICAgICAgICBpZiAoaUZHYTgpICAgICAgICAgICAgICAgICAgIC8qIGFueSBvcGFjaXR5IGF0IGFsbCA/ICovCisgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmdWxseSBvcGFxdWUgb3IgYmFja2dyb3VuZCBmdWxseSB0cmFuc3BhcmVudCA/ICovCisgICAgICAgICAgICBpZiAoKGlGR2E4ID09IDB4RkYpIHx8IChpQkdhOCA9PSAwKSkKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZW4gc2ltcGx5IGNvcHkgdGhlIHZhbHVlcyAqLworICAgICAgICAgICAgICAqcFNjYW5saW5lICAgICA9ICoocERhdGFsaW5lKzMpOworICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9ICoocERhdGFsaW5lKzIpOworICAgICAgICAgICAgICAqKHBTY2FubGluZSsyKSA9ICoocERhdGFsaW5lKzEpOworICAgICAgICAgICAgICAqKHBTY2FubGluZSszKSA9ICpwRGF0YWxpbmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChpQkdhOCA9PSAweEZGKSAgICAgICAvKiBiYWNrZ3JvdW5kIGZ1bGx5IG9wYXF1ZSA/ICovCisgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBkbyBzaW1wbGUgYWxwaGEgY29tcG9zaW5nICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbHBoYSBpdHNlbGYgcmVtYWlucyBmdWxseSBvcGFxdWUgISEhICovCisjaWZkZWYgTU5HX09QVElNSVpFX0ZPT1RQUklOVF9DT01QT1NFCisgICAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgICAgZm9yIChpPTI7IGkgPj0gMDsgaS0tKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNTkdfQ09NUE9TRTggKCoocFNjYW5saW5lK2krMSksICoocERhdGFsaW5lKzItaSksIGlGR2E4LCAqKHBTY2FubGluZStpKzEpKTsKKyAgICAgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgICAgIE1OR19DT01QT1NFOCAoKihwU2NhbmxpbmUrMSksICoocERhdGFsaW5lKzIpLCBpRkdhOCwgKihwU2NhbmxpbmUrMSkpOworICAgICAgICAgICAgICAgIE1OR19DT01QT1NFOCAoKihwU2NhbmxpbmUrMiksICoocERhdGFsaW5lKzEpLCBpRkdhOCwgKihwU2NhbmxpbmUrMikpOworICAgICAgICAgICAgICAgIE1OR19DT01QT1NFOCAoKihwU2NhbmxpbmUrMyksICpwRGF0YWxpbmUsICAgICBpRkdhOCwgKihwU2NhbmxpbmUrMykpOworI2VuZGlmCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogbm93IGJsZW5kICovCisgICAgICAgICAgICAgICAgTU5HX0JMRU5EOCAoKnBEYXRhbGluZSwgICAgICoocERhdGFsaW5lKzEpLCAqKHBEYXRhbGluZSsyKSwgaUZHYTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMyksICoocFNjYW5saW5lKzIpLCAqKHBTY2FubGluZSsxKSwgaUJHYTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUNyOCwgaUNnOCwgaUNiOCwgaUNhOCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgcmV0dXJuIHRoZSBjb21wb3NlZCB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgICAqcFNjYW5saW5lICAgICA9IGlDYTg7CisgICAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSBpQ2I4OworICAgICAgICAgICAgICAgICoocFNjYW5saW5lKzIpID0gaUNnODsKKyAgICAgICAgICAgICAgICAqKHBTY2FubGluZSszKSA9IGlDcjg7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jIDw8IDIpOworICAgICAgICAgIHBEYXRhbGluZSArPSA0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgY2hlY2tfdXBkYXRlX3JlZ2lvbiAocERhdGEpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RJU1BMQVlfQUJHUjgsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmIC8qIE1OR19OT18xNkJJVF9TVVBQT1JUICovCisjZW5kaWYgLyogTU5HX1NLSVBDQU5WQVNfQUJHUjggKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENBTlZBU19BQkdSOF9QTQorI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorI2lmbmRlZiBNTkdfT1BUSU1JWkVfRk9PVFBSSU5UX0NPTVBPU0UKK21uZ19yZXRjb2RlIG1uZ19kaXNwbGF5X2FiZ3I4X3BtIChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ191aW50OHAgcFNjYW5saW5lOworICBtbmdfdWludDhwIHBEYXRhbGluZTsKKyAgbW5nX2ludDMyICBpWDsKKyAgbW5nX3VpbnQzMiBzLCB0OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RJU1BMQVlfQUJHUjhfUE0sIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZpZXdhYmxlIHJvdyA/ICovCisgIGlmICgocERhdGEtPmlSb3cgPj0gcERhdGEtPmlTb3VyY2V0KSAmJiAocERhdGEtPmlSb3cgPCBwRGF0YS0+aVNvdXJjZWIpKQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkcmVzcyBkZXN0aW5hdGlvbiByb3cgKi8KKyAgICBwU2NhbmxpbmUgPSAobW5nX3VpbnQ4cClwRGF0YS0+ZkdldGNhbnZhc2xpbmUgKCgobW5nX2hhbmRsZSlwRGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aVJvdyArIHBEYXRhLT5pRGVzdHQgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlTb3VyY2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkanVzdCBkZXN0aW5hdGlvbiByb3cgc3RhcnRpbmctcG9pbnQgKi8KKyAgICBwU2NhbmxpbmUgPSBwU2NhbmxpbmUgKyAocERhdGEtPmlDb2wgPDwgMikgKyAocERhdGEtPmlEZXN0bCA8PCAyKTsKKyAgICBwRGF0YWxpbmUgPSBwRGF0YS0+cFJHQkFyb3c7ICAgICAgIC8qIGFkZHJlc3Mgc291cmNlIHJvdyAqLworCisgICAgaWYgKHBEYXRhLT5iSXNSR0JBMTYpICAgICAgICAgICAgICAvKiBhZGp1c3Qgc291cmNlIHJvdyBzdGFydGluZy1wb2ludCAqLworICAgICAgcERhdGFsaW5lID0gcERhdGFsaW5lICsgKChwRGF0YS0+aVNvdXJjZWwgLyBwRGF0YS0+aUNvbGluYykgPDwgMyk7CisgICAgZWxzZQorICAgICAgcERhdGFsaW5lID0gcERhdGFsaW5lICsgKChwRGF0YS0+aVNvdXJjZWwgLyBwRGF0YS0+aUNvbGluYykgPDwgMik7CisKKyAgICBpZiAocERhdGEtPmJJc09wYXF1ZSkgICAgICAgICAgICAgIC8qIGZvcmdldCBhYm91dCB0cmFuc3BhcmVuY3kgPyAqLworICAgIHsKKyAgICAgIGlmIChwRGF0YS0+YklzUkdCQTE2KSAgICAgICAgICAgIC8qIDE2LWJpdCBpbnB1dCByb3cgPyAqLworICAgICAgeworICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlTb3VyY2VsICsgcERhdGEtPmlDb2w7IGlYIDwgcERhdGEtPmlTb3VyY2VyOworICAgICAgICAgICAgIGlYICs9IHBEYXRhLT5pQ29saW5jKQorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbGUgZG93biBieSBkcm9wcGluZyB0aGUgTFNCICovCisJCSAgaWYgKChzID0gcERhdGFsaW5lWzZdKSA9PSAwKQorCQkJKihtbmdfdWludDMyKikgcFNjYW5saW5lID0gMDsgLyogc2V0IGFsbCBjb21wb25lbnRzID0gMCAqLworCQkgIGVsc2UKKwkJICB7CisJCQlpZiAocyA9PSAyNTUpCisJCQl7CisgICAgICAgICAgICAgIHBTY2FubGluZVswXSA9IDI1NTsKKwkJICAgICAgcFNjYW5saW5lWzFdID0gcERhdGFsaW5lWzRdOworICAgICAgICAgICAgICBwU2NhbmxpbmVbMl0gPSBwRGF0YWxpbmVbMl07CisgICAgICAgICAgICAgIHBTY2FubGluZVszXSA9IHBEYXRhbGluZVswXTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzBdID0gKG1uZ191aW50OClzOworI2lmZGVmIE1OR19PUFRJTUlaRV9GT09UUFJJTlRfRElWCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICBmb3IgKGk9MjsgaSA+PSAwOyBpLS0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcFNjYW5saW5lW2krMV0gPSBESVYyNTVCOChzICogcERhdGFsaW5lWzQtaS1pXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgICBwU2NhbmxpbmVbMV0gPSBESVYyNTVCOChzICogcERhdGFsaW5lWzRdKTsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzJdID0gRElWMjU1QjgocyAqIHBEYXRhbGluZVsyXSk7CisgICAgICAgICAgICAgIHBTY2FubGluZVszXSA9IERJVjI1NUI4KHMgKiBwRGF0YWxpbmVbMF0pOworI2VuZGlmCisJCQl9CisJCSAgfQorICAgICAgICAgIHBTY2FubGluZSArPSAocERhdGEtPmlDb2xpbmMgPDwgMik7CisgICAgICAgICAgcERhdGFsaW5lICs9IDg7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pQ29sOyBpWCA8IHBEYXRhLT5pU291cmNlcjsKKyAgICAgICAgICAgICBpWCArPSBwRGF0YS0+aUNvbGluYykKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvcHkgdGhlIHZhbHVlcyBhbmQgcHJlbXVsdGlwbHkgKi8KKwkJICBpZiAoKHMgPSBwRGF0YWxpbmVbM10pID09IDApCisJCQkqKG1uZ191aW50MzIqKSBwU2NhbmxpbmUgPSAwOyAvKiBzZXQgYWxsIGNvbXBvbmVudHMgPSAwICovCisJCSAgZWxzZQorCQkgIHsKKwkJCWlmIChzID09IDI1NSkKKwkJCXsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzBdID0gMjU1OworCQkgICAgICBwU2NhbmxpbmVbMV0gPSBwRGF0YWxpbmVbMl07CisgICAgICAgICAgICAgIHBTY2FubGluZVsyXSA9IHBEYXRhbGluZVsxXTsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzNdID0gcERhdGFsaW5lWzBdOworCQkJfQorCQkJZWxzZQorCQkJeworICAgICAgICAgICAgICBwU2NhbmxpbmVbMF0gPSAobW5nX3VpbnQ4KXM7CisjaWZkZWYgTU5HX09QVElNSVpFX0ZPT1RQUklOVF9ESVYKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgIGZvciAoaT0yOyBpID49IDA7IGktLSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBwU2NhbmxpbmVbaSsxXSA9IERJVjI1NUI4KHMgKiBwRGF0YWxpbmVbMi1pXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgICBwU2NhbmxpbmVbMV0gPSBESVYyNTVCOChzICogcERhdGFsaW5lWzJdKTsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzJdID0gRElWMjU1QjgocyAqIHBEYXRhbGluZVsxXSk7CisJCSAgICAgIHBTY2FubGluZVszXSA9IERJVjI1NUI4KHMgKiBwRGF0YWxpbmVbMF0pOworI2VuZGlmCisJCQl9CisJCSAgfQorCisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyA8PCAyKTsKKyAgICAgICAgICBwRGF0YWxpbmUgKz0gNDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaWYgKHBEYXRhLT5iSXNSR0JBMTYpICAgICAgICAgICAgLyogMTYtYml0IGlucHV0IHJvdyA/ICovCisgICAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgYWxwaGEgdmFsdWVzICovCisgICAgICAgICAgaWYgKChzID0gcERhdGFsaW5lWzZdKSAhPSAwKSAgICAgICAvKiBhbnkgb3BhY2l0eSBhdCBhbGwgPyAqLworICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZnVsbHkgb3BhcXVlIG9yIGJhY2tncm91bmQgZnVsbHkgdHJhbnNwYXJlbnQgPyAqLworICAgICAgICAgICAgaWYgKHMgPT0gMjU1KQorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGxhaW4gY29weSBpdCAqLworICAgICAgICAgICAgICBwU2NhbmxpbmVbMF0gPSAyNTU7CisgICAgICAgICAgICAgIHBTY2FubGluZVsxXSA9IHBEYXRhbGluZVs0XTsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzJdID0gcERhdGFsaW5lWzJdOworICAgICAgICAgICAgICBwU2NhbmxpbmVbM10gPSBwRGF0YWxpbmVbMF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3cgYmxlbmQgKHByZW11bHRpcGxpZWQpICovCisJCQkgIHQgPSAyNTUgLSBzOworICAgICAgICAgICAgICBwU2NhbmxpbmVbMF0gPSAobW5nX3VpbnQ4KSgyNTUgLSBESVYyNTVCOCh0ICogKDI1NSAtIHBTY2FubGluZVswXSkpKTsKKyNpZmRlZiBNTkdfT1BUSU1JWkVfRk9PVFBSSU5UX0RJVgorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgICAgZm9yIChpPTI7IGkgPj0gMDsgaS0tKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHBTY2FubGluZVtpKzFdID0gRElWMjU1QjgocyAqIHBEYXRhbGluZVs0LWktaV0gKyB0ICoKKyAgICAgICAgICAgICAgICAgICAgIHBTY2FubGluZVtpKzFdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyNlbHNlCisJCQkgIHBTY2FubGluZVsxXSA9IERJVjI1NUI4KHMgKiBwRGF0YWxpbmVbNF0gKyB0ICogcFNjYW5saW5lWzFdKTsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzJdID0gRElWMjU1QjgocyAqIHBEYXRhbGluZVsyXSArIHQgKiBwU2NhbmxpbmVbMl0pOworICAgICAgICAgICAgICBwU2NhbmxpbmVbM10gPSBESVYyNTVCOChzICogcERhdGFsaW5lWzBdICsgdCAqIHBTY2FubGluZVszXSk7CisjZW5kaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jIDw8IDIpOworICAgICAgICAgIHBEYXRhbGluZSArPSA4OworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKHMgPSBwRGF0YWxpbmVbM10pICE9IDApICAgICAgIC8qIGFueSBvcGFjaXR5IGF0IGFsbCA/ICovCisgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmdWxseSBvcGFxdWUgPyAqLworICAgICAgICAgICAgaWYgKHMgPT0gMjU1KQorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlbiBzaW1wbHkgY29weSB0aGUgdmFsdWVzICovCisgICAgICAgICAgICAgIHBTY2FubGluZVswXSA9IDI1NTsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzFdID0gcERhdGFsaW5lWzJdOworICAgICAgICAgICAgICBwU2NhbmxpbmVbMl0gPSBwRGF0YWxpbmVbMV07CisgICAgICAgICAgICAgIHBTY2FubGluZVszXSA9IHBEYXRhbGluZVswXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdyBibGVuZCAocHJlbXVsdGlwbGllZCkgKi8KKwkJCSAgdCA9IDI1NSAtIHM7CisgICAgICAgICAgICAgIHBTY2FubGluZVswXSA9IChtbmdfdWludDgpKDI1NSAtIERJVjI1NUI4KHQgKiAoMjU1IC0gcFNjYW5saW5lWzBdKSkpOworI2lmZGVmIE1OR19PUFRJTUlaRV9GT09UUFJJTlRfRElWCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICBmb3IgKGk9MjsgaSA+PSAwOyBpLS0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcFNjYW5saW5lW2krMV0gPSBESVYyNTVCOChzICogcERhdGFsaW5lWzItaV0gKyB0ICoKKyAgICAgICAgICAgICAgICAgICAgIHBTY2FubGluZVtpKzFdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyNlbHNlCisJCQkgIHBTY2FubGluZVsxXSA9IERJVjI1NUI4KHMgKiBwRGF0YWxpbmVbMl0gKyB0ICogcFNjYW5saW5lWzFdKTsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzJdID0gRElWMjU1QjgocyAqIHBEYXRhbGluZVsxXSArIHQgKiBwU2NhbmxpbmVbMl0pOworICAgICAgICAgICAgICBwU2NhbmxpbmVbM10gPSBESVYyNTVCOChzICogcERhdGFsaW5lWzBdICsgdCAqIHBTY2FubGluZVszXSk7CisjZW5kaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jIDw8IDIpOworICAgICAgICAgIHBEYXRhbGluZSArPSA0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgY2hlY2tfdXBkYXRlX3JlZ2lvbiAocERhdGEpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RJU1BMQVlfQUJHUjhfUE0sIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2Vsc2UgLyogTU5HX09QVElNSVpFX0ZPT1RQUklOVF9DT01QT1NFICovCittbmdfcmV0Y29kZSBtbmdfZGlzcGxheV9hYmdyOF9wbSAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfdWludDhwIHBTY2FubGluZTsKKyAgbW5nX3VpbnQ4cCBwRGF0YWxpbmU7CisgIG1uZ19pbnQzMiAgaVg7CisgIG1uZ191aW50MzIgcywgdDsKKyAgbW5nX3VpbnQ4ICBpQnBzOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RJU1BMQVlfQUJHUjhfUE0sIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpQnBzPShtbmdfdWludDgpKHBEYXRhLT5iSXNSR0JBMTYgPyAyOjEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdmlld2FibGUgcm93ID8gKi8KKyAgaWYgKChwRGF0YS0+aVJvdyA+PSBwRGF0YS0+aVNvdXJjZXQpICYmIChwRGF0YS0+aVJvdyA8IHBEYXRhLT5pU291cmNlYikpCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGRyZXNzIGRlc3RpbmF0aW9uIHJvdyAqLworICAgIHBTY2FubGluZSA9IChtbmdfdWludDhwKXBEYXRhLT5mR2V0Y2FudmFzbGluZSAoKChtbmdfaGFuZGxlKXBEYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pUm93ICsgcERhdGEtPmlEZXN0dCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aVNvdXJjZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRqdXN0IGRlc3RpbmF0aW9uIHJvdyBzdGFydGluZy1wb2ludCAqLworICAgIHBTY2FubGluZSA9IHBTY2FubGluZSArIChwRGF0YS0+aUNvbCA8PCAyKSArIChwRGF0YS0+aURlc3RsIDw8IDIpOworICAgIHBEYXRhbGluZSA9IHBEYXRhLT5wUkdCQXJvdzsgICAgICAgLyogYWRkcmVzcyBzb3VyY2Ugcm93ICovCisKKyAgICAvKiBhZGp1c3Qgc291cmNlIHJvdyBzdGFydGluZy1wb2ludCAqLworICAgIHBEYXRhbGluZSA9IHBEYXRhbGluZSArICgocERhdGEtPmlTb3VyY2VsIC8gcERhdGEtPmlDb2xpbmMpIDw8IChpQnBzKzEpKTsKKworICAgIGlmIChwRGF0YS0+YklzT3BhcXVlKSAgICAgICAgICAgICAgLyogZm9yZ2V0IGFib3V0IHRyYW5zcGFyZW5jeSA/ICovCisgICAgeworICAgICAgaWYgKHBEYXRhLT5iSXNSR0JBMTYpICAgICAgICAgICAgLyogMTYtYml0IGlucHV0IHJvdyA/ICovCisgICAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzY2FsZSBkb3duIGJ5IGRyb3BwaW5nIHRoZSBMU0IgKi8KKwkJICBpZiAoKHMgPSBwRGF0YWxpbmVbNl0pID09IDApCisJCQkqKG1uZ191aW50MzIqKSBwU2NhbmxpbmUgPSAwOyAvKiBzZXQgYWxsIGNvbXBvbmVudHMgPSAwICovCisJCSAgZWxzZQorCQkgIHsKKwkJCWlmIChzID09IDI1NSkKKwkJCXsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzBdID0gMjU1OworCQkgICAgICBwU2NhbmxpbmVbMV0gPSBwRGF0YWxpbmVbNF07CisgICAgICAgICAgICAgIHBTY2FubGluZVsyXSA9IHBEYXRhbGluZVsyXTsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzNdID0gcERhdGFsaW5lWzBdOworCQkJfQorCQkJZWxzZQorCQkJeworICAgICAgICAgICAgICBwU2NhbmxpbmVbMF0gPSAobW5nX3VpbnQ4KXM7CisjaWZkZWYgTU5HX09QVElNSVpFX0ZPT1RQUklOVF9ESVYKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgIGZvciAoaT0yOyBpID49IDA7IGktLSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBwU2NhbmxpbmVbaSsxXSA9IERJVjI1NUI4KHMgKiBwRGF0YWxpbmVbNC1pLWldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICAgIHBTY2FubGluZVsxXSA9IERJVjI1NUI4KHMgKiBwRGF0YWxpbmVbNF0pOworICAgICAgICAgICAgICBwU2NhbmxpbmVbMl0gPSBESVYyNTVCOChzICogcERhdGFsaW5lWzJdKTsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzNdID0gRElWMjU1QjgocyAqIHBEYXRhbGluZVswXSk7CisjZW5kaWYKKwkJCX0KKwkJICB9CisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyA8PCAyKTsKKyAgICAgICAgICBwRGF0YWxpbmUgKz0gODsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlTb3VyY2VsICsgcERhdGEtPmlDb2w7IGlYIDwgcERhdGEtPmlTb3VyY2VyOworICAgICAgICAgICAgIGlYICs9IHBEYXRhLT5pQ29saW5jKQorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29weSB0aGUgdmFsdWVzIGFuZCBwcmVtdWx0aXBseSAqLworCQkgIGlmICgocyA9IHBEYXRhbGluZVszXSkgPT0gMCkKKwkJCSoobW5nX3VpbnQzMiopIHBTY2FubGluZSA9IDA7IC8qIHNldCBhbGwgY29tcG9uZW50cyA9IDAgKi8KKwkJICBlbHNlCisJCSAgeworCQkJaWYgKHMgPT0gMjU1KQorCQkJeworICAgICAgICAgICAgICBwU2NhbmxpbmVbMF0gPSAyNTU7CisJCSAgICAgIHBTY2FubGluZVsxXSA9IHBEYXRhbGluZVsyXTsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzJdID0gcERhdGFsaW5lWzFdOworICAgICAgICAgICAgICBwU2NhbmxpbmVbM10gPSBwRGF0YWxpbmVbMF07CisJCQl9CisJCQllbHNlCisJCQl7CisgICAgICAgICAgICAgIHBTY2FubGluZVswXSA9IChtbmdfdWludDgpczsKKyNpZmRlZiBNTkdfT1BUSU1JWkVfRk9PVFBSSU5UX0RJVgorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgICAgZm9yIChpPTI7IGkgPj0gMDsgaS0tKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHBTY2FubGluZVtpKzFdID0gRElWMjU1QjgocyAqIHBEYXRhbGluZVsyLWldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICAgIHBTY2FubGluZVsxXSA9IERJVjI1NUI4KHMgKiBwRGF0YWxpbmVbMl0pOworICAgICAgICAgICAgICBwU2NhbmxpbmVbMl0gPSBESVYyNTVCOChzICogcERhdGFsaW5lWzFdKTsKKwkJICAgICAgcFNjYW5saW5lWzNdID0gRElWMjU1QjgocyAqIHBEYXRhbGluZVswXSk7CisjZW5kaWYKKwkJCX0KKwkJICB9CisKKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jIDw8IDIpOworICAgICAgICAgIHBEYXRhbGluZSArPSA0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBpZiAocERhdGEtPmJJc1JHQkExNikgICAgICAgICAgICAvKiAxNi1iaXQgaW5wdXQgcm93ID8gKi8KKyAgICAgIHsKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pQ29sOyBpWCA8IHBEYXRhLT5pU291cmNlcjsKKyAgICAgICAgICAgICBpWCArPSBwRGF0YS0+aUNvbGluYykKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCBhbHBoYSB2YWx1ZXMgKi8KKyAgICAgICAgICBpZiAoKHMgPSBwRGF0YWxpbmVbNl0pICE9IDApICAgICAgIC8qIGFueSBvcGFjaXR5IGF0IGFsbCA/ICovCisgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmdWxseSBvcGFxdWUgb3IgYmFja2dyb3VuZCBmdWxseSB0cmFuc3BhcmVudCA/ICovCisgICAgICAgICAgICBpZiAocyA9PSAyNTUpCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwbGFpbiBjb3B5IGl0ICovCisgICAgICAgICAgICAgIHBTY2FubGluZVswXSA9IDI1NTsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzFdID0gcERhdGFsaW5lWzRdOworICAgICAgICAgICAgICBwU2NhbmxpbmVbMl0gPSBwRGF0YWxpbmVbMl07CisgICAgICAgICAgICAgIHBTY2FubGluZVszXSA9IHBEYXRhbGluZVswXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdyBibGVuZCAocHJlbXVsdGlwbGllZCkgKi8KKwkJCSAgdCA9IDI1NSAtIHM7CisgICAgICAgICAgICAgIHBTY2FubGluZVswXSA9IChtbmdfdWludDgpKDI1NSAtIERJVjI1NUI4KHQgKiAoMjU1IC0gcFNjYW5saW5lWzBdKSkpOworI2lmZGVmIE1OR19PUFRJTUlaRV9GT09UUFJJTlRfRElWCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICBmb3IgKGk9MjsgaSA+PSAwOyBpLS0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcFNjYW5saW5lW2krMV0gPSBESVYyNTVCOChzICogcERhdGFsaW5lWzQtaS1pXSArIHQgKgorICAgICAgICAgICAgICAgICAgICAgcFNjYW5saW5lW2krMV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorI2Vsc2UKKwkJCSAgcFNjYW5saW5lWzFdID0gRElWMjU1QjgocyAqIHBEYXRhbGluZVs0XSArIHQgKiBwU2NhbmxpbmVbMV0pOworICAgICAgICAgICAgICBwU2NhbmxpbmVbMl0gPSBESVYyNTVCOChzICogcERhdGFsaW5lWzJdICsgdCAqIHBTY2FubGluZVsyXSk7CisgICAgICAgICAgICAgIHBTY2FubGluZVszXSA9IERJVjI1NUI4KHMgKiBwRGF0YWxpbmVbMF0gKyB0ICogcFNjYW5saW5lWzNdKTsKKyNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIHBTY2FubGluZSArPSAocERhdGEtPmlDb2xpbmMgPDwgMik7CisgICAgICAgICAgcERhdGFsaW5lICs9IDg7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pQ29sOyBpWCA8IHBEYXRhLT5pU291cmNlcjsKKyAgICAgICAgICAgICBpWCArPSBwRGF0YS0+aUNvbGluYykKKyAgICAgICAgeworICAgICAgICAgIGlmICgocyA9IHBEYXRhbGluZVszXSkgIT0gMCkgICAgICAgLyogYW55IG9wYWNpdHkgYXQgYWxsID8gKi8KKyAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZ1bGx5IG9wYXF1ZSA/ICovCisgICAgICAgICAgICBpZiAocyA9PSAyNTUpCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGVuIHNpbXBseSBjb3B5IHRoZSB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgcFNjYW5saW5lWzBdID0gMjU1OworICAgICAgICAgICAgICBwU2NhbmxpbmVbMV0gPSBwRGF0YWxpbmVbMl07CisgICAgICAgICAgICAgIHBTY2FubGluZVsyXSA9IHBEYXRhbGluZVsxXTsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzNdID0gcERhdGFsaW5lWzBdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm93IGJsZW5kIChwcmVtdWx0aXBsaWVkKSAqLworCQkJICB0ID0gMjU1IC0gczsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzBdID0gKG1uZ191aW50OCkoMjU1IC0gRElWMjU1QjgodCAqICgyNTUgLSBwU2NhbmxpbmVbMF0pKSk7CisjaWZkZWYgTU5HX09QVElNSVpFX0ZPT1RQUklOVF9ESVYKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgIGZvciAoaT0yOyBpID49IDA7IGktLSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBwU2NhbmxpbmVbaSsxXSA9IERJVjI1NUI4KHMgKiBwRGF0YWxpbmVbMi1pXSArIHQgKgorICAgICAgICAgICAgICAgICAgICAgcFNjYW5saW5lW2krMV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorI2Vsc2UKKwkJCSAgcFNjYW5saW5lWzFdID0gRElWMjU1QjgocyAqIHBEYXRhbGluZVsyXSArIHQgKiBwU2NhbmxpbmVbMV0pOworICAgICAgICAgICAgICBwU2NhbmxpbmVbMl0gPSBESVYyNTVCOChzICogcERhdGFsaW5lWzFdICsgdCAqIHBTY2FubGluZVsyXSk7CisgICAgICAgICAgICAgIHBTY2FubGluZVszXSA9IERJVjI1NUI4KHMgKiBwRGF0YWxpbmVbMF0gKyB0ICogcFNjYW5saW5lWzNdKTsKKyNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIHBTY2FubGluZSArPSAocERhdGEtPmlDb2xpbmMgPDwgMik7CisgICAgICAgICAgcERhdGFsaW5lICs9IDQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBjaGVja191cGRhdGVfcmVnaW9uIChwRGF0YSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRElTUExBWV9BQkdSOF9QTSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYgLyogTU5HX09QVElNSVpFX0ZPT1RQUklOVF9DT01QT1NFICovCisjZWxzZSAvKiBNTkdfTk9fMTZCSVRfU1VQUE9SVCAqLworbW5nX3JldGNvZGUgbW5nX2Rpc3BsYXlfYWJncjhfcG0gKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX3VpbnQ4cCBwU2NhbmxpbmU7CisgIG1uZ191aW50OHAgcERhdGFsaW5lOworICBtbmdfaW50MzIgIGlYOworICBtbmdfdWludDMyIHMsIHQ7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRElTUExBWV9BQkdSOF9QTSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdmlld2FibGUgcm93ID8gKi8KKyAgaWYgKChwRGF0YS0+aVJvdyA+PSBwRGF0YS0+aVNvdXJjZXQpICYmIChwRGF0YS0+aVJvdyA8IHBEYXRhLT5pU291cmNlYikpCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGRyZXNzIGRlc3RpbmF0aW9uIHJvdyAqLworICAgIHBTY2FubGluZSA9IChtbmdfdWludDhwKXBEYXRhLT5mR2V0Y2FudmFzbGluZSAoKChtbmdfaGFuZGxlKXBEYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pUm93ICsgcERhdGEtPmlEZXN0dCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aVNvdXJjZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRqdXN0IGRlc3RpbmF0aW9uIHJvdyBzdGFydGluZy1wb2ludCAqLworICAgIHBTY2FubGluZSA9IHBTY2FubGluZSArIChwRGF0YS0+aUNvbCA8PCAyKSArIChwRGF0YS0+aURlc3RsIDw8IDIpOworICAgIHBEYXRhbGluZSA9IHBEYXRhLT5wUkdCQXJvdzsgICAgICAgLyogYWRkcmVzcyBzb3VyY2Ugcm93ICovCisKKyAgICAgIHBEYXRhbGluZSA9IHBEYXRhbGluZSArICgocERhdGEtPmlTb3VyY2VsIC8gcERhdGEtPmlDb2xpbmMpIDw8IDIpOworCisgICAgaWYgKHBEYXRhLT5iSXNPcGFxdWUpICAgICAgICAgICAgICAvKiBmb3JnZXQgYWJvdXQgdHJhbnNwYXJlbmN5ID8gKi8KKyAgICB7CisgICAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3B5IHRoZSB2YWx1ZXMgYW5kIHByZW11bHRpcGx5ICovCisJCSAgaWYgKChzID0gcERhdGFsaW5lWzNdKSA9PSAwKQorCQkJKihtbmdfdWludDMyKikgcFNjYW5saW5lID0gMDsgLyogc2V0IGFsbCBjb21wb25lbnRzID0gMCAqLworCQkgIGVsc2UKKwkJICB7CisJCQlpZiAocyA9PSAyNTUpCisJCQl7CisgICAgICAgICAgICAgIHBTY2FubGluZVswXSA9IDI1NTsKKwkJICAgICAgcFNjYW5saW5lWzFdID0gcERhdGFsaW5lWzJdOworICAgICAgICAgICAgICBwU2NhbmxpbmVbMl0gPSBwRGF0YWxpbmVbMV07CisgICAgICAgICAgICAgIHBTY2FubGluZVszXSA9IHBEYXRhbGluZVswXTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzBdID0gKG1uZ191aW50OClzOworI2lmZGVmIE1OR19PUFRJTUlaRV9GT09UUFJJTlRfRElWCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICBmb3IgKGk9MjsgaSA+PSAwOyBpLS0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcFNjYW5saW5lW2krMV0gPSBESVYyNTVCOChzICogcERhdGFsaW5lWzItaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzFdID0gRElWMjU1QjgocyAqIHBEYXRhbGluZVsyXSk7CisgICAgICAgICAgICAgIHBTY2FubGluZVsyXSA9IERJVjI1NUI4KHMgKiBwRGF0YWxpbmVbMV0pOworCQkgICAgICBwU2NhbmxpbmVbM10gPSBESVYyNTVCOChzICogcERhdGFsaW5lWzBdKTsKKyNlbmRpZgorCQkJfQorCQkgIH0KKworICAgICAgICAgIHBTY2FubGluZSArPSAocERhdGEtPmlDb2xpbmMgPDwgMik7CisgICAgICAgICAgcERhdGFsaW5lICs9IDQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHsKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pQ29sOyBpWCA8IHBEYXRhLT5pU291cmNlcjsKKyAgICAgICAgICAgICBpWCArPSBwRGF0YS0+aUNvbGluYykKKyAgICAgICAgeworICAgICAgICAgIGlmICgocyA9IHBEYXRhbGluZVszXSkgIT0gMCkgICAgICAgLyogYW55IG9wYWNpdHkgYXQgYWxsID8gKi8KKyAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZ1bGx5IG9wYXF1ZSA/ICovCisgICAgICAgICAgICBpZiAocyA9PSAyNTUpCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGVuIHNpbXBseSBjb3B5IHRoZSB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgcFNjYW5saW5lWzBdID0gMjU1OworICAgICAgICAgICAgICBwU2NhbmxpbmVbMV0gPSBwRGF0YWxpbmVbMl07CisgICAgICAgICAgICAgIHBTY2FubGluZVsyXSA9IHBEYXRhbGluZVsxXTsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzNdID0gcERhdGFsaW5lWzBdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm93IGJsZW5kIChwcmVtdWx0aXBsaWVkKSAqLworCQkJICB0ID0gMjU1IC0gczsKKyAgICAgICAgICAgICAgcFNjYW5saW5lWzBdID0gKG1uZ191aW50OCkoMjU1IC0gRElWMjU1QjgodCAqICgyNTUgLSBwU2NhbmxpbmVbMF0pKSk7CisjaWZkZWYgTU5HX09QVElNSVpFX0ZPT1RQUklOVF9ESVYKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgIGZvciAoaT0yOyBpID49IDA7IGktLSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBwU2NhbmxpbmVbaSsxXSA9IERJVjI1NUI4KHMgKiBwRGF0YWxpbmVbMi1pXSArIHQgKgorICAgICAgICAgICAgICAgICAgICAgcFNjYW5saW5lW2krMV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorI2Vsc2UKKwkJCSAgcFNjYW5saW5lWzFdID0gRElWMjU1QjgocyAqIHBEYXRhbGluZVsyXSArIHQgKiBwU2NhbmxpbmVbMV0pOworICAgICAgICAgICAgICBwU2NhbmxpbmVbMl0gPSBESVYyNTVCOChzICogcERhdGFsaW5lWzFdICsgdCAqIHBTY2FubGluZVsyXSk7CisgICAgICAgICAgICAgIHBTY2FubGluZVszXSA9IERJVjI1NUI4KHMgKiBwRGF0YWxpbmVbMF0gKyB0ICogcFNjYW5saW5lWzNdKTsKKyNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIHBTY2FubGluZSArPSAocERhdGEtPmlDb2xpbmMgPDwgMik7CisgICAgICAgICAgcERhdGFsaW5lICs9IDQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBjaGVja191cGRhdGVfcmVnaW9uIChwRGF0YSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRElTUExBWV9BQkdSOF9QTSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYgLyogTU5HX05PXzE2QklUX1NVUFBPUlQgKi8KKyNlbmRpZiAvKiBNTkdfU0tJUENBTlZBU19BQkdSOF9QTSAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0FOVkFTX0JHUjU2NQorI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorI2lmbmRlZiBNTkdfT1BUSU1JWkVfRk9PVFBSSU5UX0NPTVBPU0UKK21uZ19yZXRjb2RlIG1uZ19kaXNwbGF5X2JncjU2NSAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfdWludDhwIHBTY2FubGluZTsKKyAgbW5nX3VpbnQ4cCBwRGF0YWxpbmU7CisgIG1uZ19pbnQzMiAgaVg7CisgIG1uZ191aW50MTYgaUExNjsKKyAgbW5nX3VpbnQxNiBpRkdyMTYsIGlGR2cxNiwgaUZHYjE2OworICBtbmdfdWludDE2IGlCR3IxNiwgaUJHZzE2LCBpQkdiMTY7CisgIG1uZ191aW50OCAgaUE4OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RJU1BMQVlfQkdSNTY1LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2aWV3YWJsZSByb3cgPyAqLworICBpZiAoKHBEYXRhLT5pUm93ID49IHBEYXRhLT5pU291cmNldCkgJiYgKHBEYXRhLT5pUm93IDwgcERhdGEtPmlTb3VyY2ViKSkKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHJlc3MgZGVzdGluYXRpb24gcm93ICovCisgICAgcFNjYW5saW5lID0gKG1uZ191aW50OHApcERhdGEtPmZHZXRjYW52YXNsaW5lICgoKG1uZ19oYW5kbGUpcERhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlSb3cgKyBwRGF0YS0+aURlc3R0IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pU291cmNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGp1c3QgZGVzdGluYXRpb24gcm93IHN0YXJ0aW5nLXBvaW50ICovCisgICAgcFNjYW5saW5lID0gcFNjYW5saW5lICsgKHBEYXRhLT5pQ29sICogMikgKyAocERhdGEtPmlEZXN0bCAqIDIpOworICAgIHBEYXRhbGluZSA9IHBEYXRhLT5wUkdCQXJvdzsgICAgICAgLyogYWRkcmVzcyBzb3VyY2Ugcm93ICovCisKKyAgICBpZiAocERhdGEtPmJJc1JHQkExNikgICAgICAgICAgICAgIC8qIGFkanVzdCBzb3VyY2Ugcm93IHN0YXJ0aW5nLXBvaW50ICovCisgICAgICBwRGF0YWxpbmUgPSBwRGF0YWxpbmUgKyAoKHBEYXRhLT5pU291cmNlbCAvIHBEYXRhLT5pQ29saW5jKSA8PCAzKTsKKyAgICBlbHNlCisgICAgICBwRGF0YWxpbmUgPSBwRGF0YWxpbmUgKyAoKHBEYXRhLT5pU291cmNlbCAvIHBEYXRhLT5pQ29saW5jKSA8PCAyKTsKKworICAgIGlmIChwRGF0YS0+YklzT3BhcXVlKSAgICAgICAgICAgICAgLyogZm9yZ2V0IGFib3V0IHRyYW5zcGFyZW5jeSA/ICovCisgICAgeworICAgICAgaWYgKHBEYXRhLT5iSXNSR0JBMTYpICAgICAgICAgICAgLyogMTYtYml0IGlucHV0IHJvdyA/ICovCisgICAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzY2FsZSBkb3duIGJ5IGRyb3BwaW5nIHRoZSBMU0IgKi8KKyAgICAgICAgICAqKHBTY2FubGluZSsxKSA9IChtbmdfdWludDgpKCAoICgqKHBEYXRhbGluZSkpJjB4RjggKSB8ICggICAoKihwRGF0YWxpbmUrMik+PjUpICAgICAgICkgKTsKKyAgICAgICAgICAqcFNjYW5saW5lICAgICA9IChtbmdfdWludDgpKCAoICgqKHBEYXRhbGluZSs0KSkgPj4zKSB8ICggICAoKihwRGF0YWxpbmUrMikmMHhGQykgPDwgMykgKTsKKworICAgICAgICAgIHBTY2FubGluZSArPSAocERhdGEtPmlDb2xpbmMgKiAyKTsKKyAgICAgICAgICBwRGF0YWxpbmUgKz0gODsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlTb3VyY2VsICsgcERhdGEtPmlDb2w7IGlYIDwgcERhdGEtPmlTb3VyY2VyOworICAgICAgICAgICAgIGlYICs9IHBEYXRhLT5pQ29saW5jKQorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29weSB0aGUgdmFsdWVzICovCisgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAobW5nX3VpbnQ4KSggKCAoKihwRGF0YWxpbmUpKSYweEY4ICkgIHwgICggKCoocERhdGFsaW5lKzEpPj41ICAgKSAgICAgKSApOworICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKG1uZ191aW50OCkoICggICoocERhdGFsaW5lKzIpID4+MyApICB8ICAoICgqKHBEYXRhbGluZSsxKSYweEZDICkgPDwgMykgKTsKKworCisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyAqIDIpOworICAgICAgICAgIHBEYXRhbGluZSArPSA0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBpZiAocERhdGEtPmJJc1JHQkExNikgICAgICAgICAgICAvKiAxNi1iaXQgaW5wdXQgcm93ID8gKi8KKyAgICAgIHsKKworICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlTb3VyY2VsICsgcERhdGEtPmlDb2w7IGlYIDwgcERhdGEtPmlTb3VyY2VyOworICAgICAgICAgICAgIGlYICs9IHBEYXRhLT5pQ29saW5jKQorICAgICAgICB7CisgICAgICAgICAgaUExNiA9IG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUrNik7CisKKyAgICAgICAgICBpZiAoaUExNikgICAgICAgICAgICAgICAgICAgIC8qIGFueSBvcGFjaXR5IGF0IGFsbCA/ICovCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKGlBMTYgPT0gMHhGRkZGKSAgICAgICAgLyogZnVsbHkgb3BhcXVlID8gKi8KKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjYWxlIGRvd24gYnkgZHJvcHBpbmcgdGhlIExTQiAqLworICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9IChtbmdfdWludDgpKCAoKihwRGF0YWxpbmUpKSYweEY4ICkgIHwgIChtbmdfdWludDgpKCAoKihwRGF0YWxpbmUrMik+PjUgICkgICAgICk7CisgICAgICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKG1uZ191aW50OCkoICgqKHBEYXRhbGluZSs0KSkgPj4zKSAgfCAgKG1uZ191aW50OCkoICgqKHBEYXRhbGluZSsyKSYweEZDKSA8PCAzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCB0aGUgcHJvcGVyIHZhbHVlcyAqLworICAgICAgICAgICAgICBpRkdyMTYgPSBtbmdfZ2V0X3VpbnQxNiAocERhdGFsaW5lICApOworICAgICAgICAgICAgICBpRkdnMTYgPSBtbmdfZ2V0X3VpbnQxNiAocERhdGFsaW5lKzIpOworICAgICAgICAgICAgICBpRkdiMTYgPSBtbmdfZ2V0X3VpbnQxNiAocERhdGFsaW5lKzQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbGUgYmFja2dyb3VuZCB1cCAqLworCisgICAgICAgICAgICAgIGlCR2IxNiA9IChtbmdfdWludDE2KSggKCoocFNjYW5saW5lKzEpKSAmIDB4RjggKTsKKyAgICAgICAgICAgICAgaUJHZzE2ID0gKG1uZ191aW50MTYpKCAoKihwU2NhbmxpbmUrMSkgPDwgNSkgIHwgICgoKCoocFNjYW5saW5lICApKSAmIDB4RTApID4+MyApICk7CisgICAgICAgICAgICAgIGlCR3IxNiA9IChtbmdfdWludDE2KSggKCoocFNjYW5saW5lICApKSA8PCAzICAgKTsKKworICAgICAgICAgICAgICBpQkdyMTYgPSAobW5nX3VpbnQxNikoKG1uZ191aW50MzIpaUJHcjE2IDw8IDgpIHwgaUJHcjE2OworICAgICAgICAgICAgICBpQkdnMTYgPSAobW5nX3VpbnQxNikoKG1uZ191aW50MzIpaUJHZzE2IDw8IDgpIHwgaUJHZzE2OworICAgICAgICAgICAgICBpQkdiMTYgPSAobW5nX3VpbnQxNikoKG1uZ191aW50MzIpaUJHYjE2IDw8IDgpIHwgaUJHYjE2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm93IGNvbXBvc2UgKi8KKyAgICAgICAgICAgICAgTU5HX0NPTVBPU0UxNihpRkdyMTYsIGlGR3IxNiwgaUExNiwgaUJHcjE2KTsKKyAgICAgICAgICAgICAgTU5HX0NPTVBPU0UxNihpRkdnMTYsIGlGR2cxNiwgaUExNiwgaUJHZzE2KTsKKyAgICAgICAgICAgICAgTU5HX0NPTVBPU0UxNihpRkdiMTYsIGlGR2IxNiwgaUExNiwgaUJHYjE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCByZXR1cm4gdGhlIGNvbXBvc2VkIHZhbHVlcyAqLworICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9IChtbmdfdWludDgpICggKCAoaUZHcjE2ID4+IDgpJjB4RjggKSAgfCAgKCAobW5nX3VpbnQ4KShpRkdnMTY+PjgpID4+IDUpICAgICAgKTsKKyAgICAgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAobW5nX3VpbnQ4KSAoICggKGlGR2IxNj4+MTEpICAgICAgICkgIHwgICgoKG1uZ191aW50OCkoaUZHZzE2Pj44KSYweEZDKSA8PCAzKSApOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIHBTY2FubGluZSArPSAocERhdGEtPmlDb2xpbmMgKiAyKTsKKyAgICAgICAgICBwRGF0YWxpbmUgKz0gODsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlTb3VyY2VsICsgcERhdGEtPmlDb2w7IGlYIDwgcERhdGEtPmlTb3VyY2VyOworICAgICAgICAgICAgIGlYICs9IHBEYXRhLT5pQ29saW5jKQorICAgICAgICB7CisgICAgICAgICAgaUE4ID0gKihwRGF0YWxpbmUrMyk7ICAgICAgICAvKiBnZXQgYWxwaGEgdmFsdWUgKi8KKworICAgICAgICAgIGlmIChpQTgpICAgICAgICAgICAgICAgICAgICAgLyogYW55IG9wYWNpdHkgYXQgYWxsID8gKi8KKyAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoaUE4ID09IDB4RkYpICAgICAgICAgICAvKiBmdWxseSBvcGFxdWUgPyAqLworICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlbiBzaW1wbHkgY29weSB0aGUgdmFsdWVzICovCisgICAgICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKG1uZ191aW50OCkoICggICgqKHBEYXRhbGluZSkpICYweEY4ICkgIHwgICAoKihwRGF0YWxpbmUrMSkgPj41ICkgICAgICAgKTsKKyAgICAgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAobW5nX3VpbnQ4KSggKCAoKCoocERhdGFsaW5lKzIpKT4+MykgKSAgfCAgKCgqKHBEYXRhbGluZSsxKSYweEZDKSA8PCAzKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZG8gYWxwaGEgY29tcG9zaW5nICovCisgICAgICAgICAgICAgIG1uZ191aW50OCBpUmVkLCBpR3JlZW4sIGlCbHVlOworCisgICAgICAgICAgICAgIGlSZWQgICA9IChtbmdfdWludDgpICggICoocFNjYW5saW5lKzEpICYgMHhGOCApOworICAgICAgICAgICAgICBpR3JlZW4gPSAobW5nX3VpbnQ4KSAoICgqKHBTY2FubGluZSsxKSA8PCA1KSAgfCAgKCAoKCpwU2NhbmxpbmUpICYgMHhFMCk+PjMgKSApOworICAgICAgICAgICAgICBpQmx1ZSAgPSAobW5nX3VpbnQ4KSAoICgqcFNjYW5saW5lIDw8IDMpICk7CisKKyAgICAgICAgICAgICAgTU5HX0NPTVBPU0U4IChpUmVkLCAgICAgKnBEYXRhbGluZSwgICAgIGlBOCwgaVJlZCAgICApOworICAgICAgICAgICAgICBNTkdfQ09NUE9TRTggKGlHcmVlbiwgICAqKHBEYXRhbGluZSsxKSwgaUE4LCBpR3JlZW4gICk7CisgICAgICAgICAgICAgIE1OR19DT01QT1NFOCAoaUJsdWUsICAgICoocERhdGFsaW5lKzIpLCBpQTgsIGlCbHVlICAgKTsKKworICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9IChtbmdfdWludDgpICggKCBpUmVkICAmIDB4RjggKSAgfCAgIChpR3JlZW4+PjUpICk7CisgICAgICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKG1uZ191aW50OCkgKCAoIGlCbHVlID4+ICAzICApICB8ICggKGlHcmVlbiAmIDB4RkMpIDw8IDMpICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyAqIDIpOworICAgICAgICAgIHBEYXRhbGluZSArPSA0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgY2hlY2tfdXBkYXRlX3JlZ2lvbiAocERhdGEpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RJU1BMQVlfQkdSNTY1LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbHNlIC8qIE1OR19PUFRJTUlaRV9GT09UUFJJTlRfQ09NUE9TRSAqLworbW5nX3JldGNvZGUgbW5nX2Rpc3BsYXlfYmdyNTY1IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ191aW50OHAgcFNjYW5saW5lOworICBtbmdfdWludDhwIHBEYXRhbGluZTsKKyAgbW5nX2ludDMyICBpWDsKKyAgbW5nX3VpbnQxNiBpQTE2OworICBtbmdfdWludDE2IGlGR3IxNiwgaUZHZzE2LCBpRkdiMTY7CisgIG1uZ191aW50MTYgaUJHcjE2LCBpQkdnMTYsIGlCR2IxNjsKKyAgbW5nX3VpbnQ4ICBpQTg7CisgIG1uZ191aW50OCAgaUJwczsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ESVNQTEFZX0JHUjU2NSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlCcHM9KG1uZ191aW50OCkocERhdGEtPmJJc1JHQkExNiA/IDI6MSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2aWV3YWJsZSByb3cgPyAqLworICBpZiAoKHBEYXRhLT5pUm93ID49IHBEYXRhLT5pU291cmNldCkgJiYgKHBEYXRhLT5pUm93IDwgcERhdGEtPmlTb3VyY2ViKSkKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHJlc3MgZGVzdGluYXRpb24gcm93ICovCisgICAgcFNjYW5saW5lID0gKG1uZ191aW50OHApcERhdGEtPmZHZXRjYW52YXNsaW5lICgoKG1uZ19oYW5kbGUpcERhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlSb3cgKyBwRGF0YS0+aURlc3R0IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pU291cmNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGp1c3QgZGVzdGluYXRpb24gcm93IHN0YXJ0aW5nLXBvaW50ICovCisgICAgcFNjYW5saW5lID0gcFNjYW5saW5lICsgKHBEYXRhLT5pQ29sICogMikgKyAocERhdGEtPmlEZXN0bCAqIDIpOworICAgIHBEYXRhbGluZSA9IHBEYXRhLT5wUkdCQXJvdzsgICAgICAgLyogYWRkcmVzcyBzb3VyY2Ugcm93ICovCisKKyAgICAvKiBhZGp1c3Qgc291cmNlIHJvdyBzdGFydGluZy1wb2ludCAqLworICAgIHBEYXRhbGluZSA9IHBEYXRhbGluZSArICgocERhdGEtPmlTb3VyY2VsIC8gcERhdGEtPmlDb2xpbmMpIDw8IChpQnBzKzEpKTsKKworICAgIGlmIChwRGF0YS0+YklzT3BhcXVlKSAgICAgICAgICAgICAgLyogZm9yZ2V0IGFib3V0IHRyYW5zcGFyZW5jeSA/ICovCisgICAgeworICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlTb3VyY2VsICsgcERhdGEtPmlDb2w7IGlYIDwgcERhdGEtPmlTb3VyY2VyOworICAgICAgICAgICAgIGlYICs9IHBEYXRhLT5pQ29saW5jKQorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbGUgZG93biBieSBkcm9wcGluZyB0aGUgTFNCICovCisgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAobW5nX3VpbnQ4KSggKCAoKihwRGF0YWxpbmUpKSYweEY4ICkgfAorICAgICAgICAgICAoICAgKCoocERhdGFsaW5lK2lCcHMpPj41KSAgICAgICApICk7CisgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAobW5nX3VpbnQ4KSggKCAoKihwRGF0YWxpbmUrMippQnBzKSkgPj4zKSB8CisgICAgICAgICAgICggICAoKihwRGF0YWxpbmUraUJwcykmMHhGQykgPDwgMykgKTsKKworICAgICAgICAgIHBTY2FubGluZSArPSAocERhdGEtPmlDb2xpbmMgKiAyKTsKKyAgICAgICAgICBwRGF0YWxpbmUgKz0gNCppQnBzOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBpZiAocERhdGEtPmJJc1JHQkExNikgICAgICAgICAgICAvKiAxNi1iaXQgaW5wdXQgcm93ID8gKi8KKyAgICAgIHsKKworICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlTb3VyY2VsICsgcERhdGEtPmlDb2w7IGlYIDwgcERhdGEtPmlTb3VyY2VyOworICAgICAgICAgICAgIGlYICs9IHBEYXRhLT5pQ29saW5jKQorICAgICAgICB7CisgICAgICAgICAgaUExNiA9IG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUrNik7CisKKyAgICAgICAgICBpZiAoaUExNikgICAgICAgICAgICAgICAgICAgIC8qIGFueSBvcGFjaXR5IGF0IGFsbCA/ICovCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKGlBMTYgPT0gMHhGRkZGKSAgICAgICAgLyogZnVsbHkgb3BhcXVlID8gKi8KKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjYWxlIGRvd24gYnkgZHJvcHBpbmcgdGhlIExTQiAqLworICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9IChtbmdfdWludDgpKCAoKihwRGF0YWxpbmUpKSYweEY4ICkgIHwgIChtbmdfdWludDgpKCAoKihwRGF0YWxpbmUrMik+PjUgICkgICAgICk7CisgICAgICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKG1uZ191aW50OCkoICgqKHBEYXRhbGluZSs0KSkgPj4zKSAgfCAgKG1uZ191aW50OCkoICgqKHBEYXRhbGluZSsyKSYweEZDKSA8PCAzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCB0aGUgcHJvcGVyIHZhbHVlcyAqLworICAgICAgICAgICAgICBpRkdyMTYgPSBtbmdfZ2V0X3VpbnQxNiAocERhdGFsaW5lICApOworICAgICAgICAgICAgICBpRkdnMTYgPSBtbmdfZ2V0X3VpbnQxNiAocERhdGFsaW5lKzIpOworICAgICAgICAgICAgICBpRkdiMTYgPSBtbmdfZ2V0X3VpbnQxNiAocERhdGFsaW5lKzQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbGUgYmFja2dyb3VuZCB1cCAqLworCisgICAgICAgICAgICAgIGlCR2IxNiA9IChtbmdfdWludDE2KSggKCoocFNjYW5saW5lKzEpKSAmIDB4RjggKTsKKyAgICAgICAgICAgICAgaUJHZzE2ID0gKG1uZ191aW50MTYpKCAoKihwU2NhbmxpbmUrMSkgPDwgNSkgIHwgICgoKCoocFNjYW5saW5lICApKSAmIDB4RTApID4+MyApICk7CisgICAgICAgICAgICAgIGlCR3IxNiA9IChtbmdfdWludDE2KSggKCoocFNjYW5saW5lICApKSA8PCAzICAgKTsKKworICAgICAgICAgICAgICBpQkdyMTYgPSAobW5nX3VpbnQxNikoKG1uZ191aW50MzIpaUJHcjE2IDw8IDgpIHwgaUJHcjE2OworICAgICAgICAgICAgICBpQkdnMTYgPSAobW5nX3VpbnQxNikoKG1uZ191aW50MzIpaUJHZzE2IDw8IDgpIHwgaUJHZzE2OworICAgICAgICAgICAgICBpQkdiMTYgPSAobW5nX3VpbnQxNikoKG1uZ191aW50MzIpaUJHYjE2IDw8IDgpIHwgaUJHYjE2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm93IGNvbXBvc2UgKi8KKyAgICAgICAgICAgICAgTU5HX0NPTVBPU0UxNihpRkdyMTYsIGlGR3IxNiwgaUExNiwgaUJHcjE2KTsKKyAgICAgICAgICAgICAgTU5HX0NPTVBPU0UxNihpRkdnMTYsIGlGR2cxNiwgaUExNiwgaUJHZzE2KTsKKyAgICAgICAgICAgICAgTU5HX0NPTVBPU0UxNihpRkdiMTYsIGlGR2IxNiwgaUExNiwgaUJHYjE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCByZXR1cm4gdGhlIGNvbXBvc2VkIHZhbHVlcyAqLworICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9IChtbmdfdWludDgpICggKCAoaUZHcjE2ID4+IDgpJjB4RjggKSAgfCAgKCAobW5nX3VpbnQ4KShpRkdnMTY+PjgpID4+IDUpICAgICAgKTsKKyAgICAgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAobW5nX3VpbnQ4KSAoICggKGlGR2IxNj4+MTEpICAgICAgICkgIHwgICgoKG1uZ191aW50OCkoaUZHZzE2Pj44KSYweEZDKSA8PCAzKSApOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIHBTY2FubGluZSArPSAocERhdGEtPmlDb2xpbmMgKiAyKTsKKyAgICAgICAgICBwRGF0YWxpbmUgKz0gODsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlTb3VyY2VsICsgcERhdGEtPmlDb2w7IGlYIDwgcERhdGEtPmlTb3VyY2VyOworICAgICAgICAgICAgIGlYICs9IHBEYXRhLT5pQ29saW5jKQorICAgICAgICB7CisgICAgICAgICAgaUE4ID0gKihwRGF0YWxpbmUrMyk7ICAgICAgICAvKiBnZXQgYWxwaGEgdmFsdWUgKi8KKworICAgICAgICAgIGlmIChpQTgpICAgICAgICAgICAgICAgICAgICAgLyogYW55IG9wYWNpdHkgYXQgYWxsID8gKi8KKyAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoaUE4ID09IDB4RkYpICAgICAgICAgICAvKiBmdWxseSBvcGFxdWUgPyAqLworICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlbiBzaW1wbHkgY29weSB0aGUgdmFsdWVzICovCisgICAgICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKG1uZ191aW50OCkoICggICgqKHBEYXRhbGluZSkpICYweEY4ICkgIHwgICAoKihwRGF0YWxpbmUrMSkgPj41ICkgICAgICAgKTsKKyAgICAgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAobW5nX3VpbnQ4KSggKCAoKCoocERhdGFsaW5lKzIpKT4+MykgKSAgfCAgKCgqKHBEYXRhbGluZSsxKSYweEZDKSA8PCAzKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZG8gYWxwaGEgY29tcG9zaW5nICovCisgICAgICAgICAgICAgIG1uZ191aW50OCBpUmVkLCBpR3JlZW4sIGlCbHVlOworCisgICAgICAgICAgICAgIGlSZWQgICA9IChtbmdfdWludDgpICggICoocFNjYW5saW5lKzEpICYgMHhGOCApOworICAgICAgICAgICAgICBpR3JlZW4gPSAobW5nX3VpbnQ4KSAoICgqKHBTY2FubGluZSsxKSA8PCA1KSAgfCAgKCAoKCpwU2NhbmxpbmUpICYgMHhFMCk+PjMgKSApOworICAgICAgICAgICAgICBpQmx1ZSAgPSAobW5nX3VpbnQ4KSAoICgqcFNjYW5saW5lIDw8IDMpICk7CisKKyAgICAgICAgICAgICAgTU5HX0NPTVBPU0U4IChpUmVkLCAgICAgKnBEYXRhbGluZSwgICAgIGlBOCwgaVJlZCAgICApOworICAgICAgICAgICAgICBNTkdfQ09NUE9TRTggKGlHcmVlbiwgICAqKHBEYXRhbGluZSsxKSwgaUE4LCBpR3JlZW4gICk7CisgICAgICAgICAgICAgIE1OR19DT01QT1NFOCAoaUJsdWUsICAgICoocERhdGFsaW5lKzIpLCBpQTgsIGlCbHVlICAgKTsKKworICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9IChtbmdfdWludDgpICggKCBpUmVkICAmIDB4RjggKSAgfCAgIChpR3JlZW4+PjUpICk7CisgICAgICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKG1uZ191aW50OCkgKCAoIGlCbHVlID4+ICAzICApICB8ICggKGlHcmVlbiAmIDB4RkMpIDw8IDMpICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyAqIDIpOworICAgICAgICAgIHBEYXRhbGluZSArPSA0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgY2hlY2tfdXBkYXRlX3JlZ2lvbiAocERhdGEpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RJU1BMQVlfQkdSNTY1LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZiAvKiBNTkdfT1BUSU1JWkVfRk9PVFBSSU5UX0NPTVBPU0UgKi8KKyNlbHNlIC8qIE1OR19OT18xNkJJVF9TVVBQT1JUICovCittbmdfcmV0Y29kZSBtbmdfZGlzcGxheV9iZ3I1NjUgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX3VpbnQ4cCBwU2NhbmxpbmU7CisgIG1uZ191aW50OHAgcERhdGFsaW5lOworICBtbmdfaW50MzIgIGlYOworICBtbmdfdWludDggIGlBODsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ESVNQTEFZX0JHUjU2NSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdmlld2FibGUgcm93ID8gKi8KKyAgaWYgKChwRGF0YS0+aVJvdyA+PSBwRGF0YS0+aVNvdXJjZXQpICYmIChwRGF0YS0+aVJvdyA8IHBEYXRhLT5pU291cmNlYikpCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGRyZXNzIGRlc3RpbmF0aW9uIHJvdyAqLworICAgIHBTY2FubGluZSA9IChtbmdfdWludDhwKXBEYXRhLT5mR2V0Y2FudmFzbGluZSAoKChtbmdfaGFuZGxlKXBEYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pUm93ICsgcERhdGEtPmlEZXN0dCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aVNvdXJjZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRqdXN0IGRlc3RpbmF0aW9uIHJvdyBzdGFydGluZy1wb2ludCAqLworICAgIHBTY2FubGluZSA9IHBTY2FubGluZSArIChwRGF0YS0+aUNvbCAqIDIpICsgKHBEYXRhLT5pRGVzdGwgKiAyKTsKKyAgICBwRGF0YWxpbmUgPSBwRGF0YS0+cFJHQkFyb3c7ICAgICAgIC8qIGFkZHJlc3Mgc291cmNlIHJvdyAqLworCisgICAgICBwRGF0YWxpbmUgPSBwRGF0YWxpbmUgKyAoKHBEYXRhLT5pU291cmNlbCAvIHBEYXRhLT5pQ29saW5jKSA8PCAyKTsKKworICAgIGlmIChwRGF0YS0+YklzT3BhcXVlKSAgICAgICAgICAgICAgLyogZm9yZ2V0IGFib3V0IHRyYW5zcGFyZW5jeSA/ICovCisgICAgeworICAgICAgeworICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlTb3VyY2VsICsgcERhdGEtPmlDb2w7IGlYIDwgcERhdGEtPmlTb3VyY2VyOworICAgICAgICAgICAgIGlYICs9IHBEYXRhLT5pQ29saW5jKQorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29weSB0aGUgdmFsdWVzICovCisgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAobW5nX3VpbnQ4KSggKCAoKihwRGF0YWxpbmUpKSYweEY4ICkgIHwgICggKCoocERhdGFsaW5lKzEpPj41ICAgKSAgICAgKSApOworICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKG1uZ191aW50OCkoICggICoocERhdGFsaW5lKzIpID4+MyApICB8ICAoICgqKHBEYXRhbGluZSsxKSYweEZDICkgPDwgMykgKTsKKworCisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyAqIDIpOworICAgICAgICAgIHBEYXRhbGluZSArPSA0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsKKyAgICAgICAgICBpQTggPSAqKHBEYXRhbGluZSszKTsgICAgICAgIC8qIGdldCBhbHBoYSB2YWx1ZSAqLworCisgICAgICAgICAgaWYgKGlBOCkgICAgICAgICAgICAgICAgICAgICAvKiBhbnkgb3BhY2l0eSBhdCBhbGwgPyAqLworICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpQTggPT0gMHhGRikgICAgICAgICAgIC8qIGZ1bGx5IG9wYXF1ZSA/ICovCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGVuIHNpbXBseSBjb3B5IHRoZSB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAobW5nX3VpbnQ4KSggKCAgKCoocERhdGFsaW5lKSkgJjB4RjggKSAgfCAgICgqKHBEYXRhbGluZSsxKSA+PjUgKSAgICAgICApOworICAgICAgICAgICAgICAqcFNjYW5saW5lICAgICA9IChtbmdfdWludDgpKCAoICgoKihwRGF0YWxpbmUrMikpPj4zKSApICB8ICAoKCoocERhdGFsaW5lKzEpJjB4RkMpIDw8IDMpICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkbyBhbHBoYSBjb21wb3NpbmcgKi8KKyAgICAgICAgICAgICAgbW5nX3VpbnQ4IGlSZWQsIGlHcmVlbiwgaUJsdWU7CisKKyAgICAgICAgICAgICAgaVJlZCAgID0gKG1uZ191aW50OCkgKCAgKihwU2NhbmxpbmUrMSkgJiAweEY4ICk7CisgICAgICAgICAgICAgIGlHcmVlbiA9IChtbmdfdWludDgpICggKCoocFNjYW5saW5lKzEpIDw8IDUpICB8ICAoICgoKnBTY2FubGluZSkgJiAweEUwKT4+MyApICk7CisgICAgICAgICAgICAgIGlCbHVlICA9IChtbmdfdWludDgpICggKCpwU2NhbmxpbmUgPDwgMykgKTsKKworICAgICAgICAgICAgICBNTkdfQ09NUE9TRTggKGlSZWQsICAgICAqcERhdGFsaW5lLCAgICAgaUE4LCBpUmVkICAgICk7CisgICAgICAgICAgICAgIE1OR19DT01QT1NFOCAoaUdyZWVuLCAgICoocERhdGFsaW5lKzEpLCBpQTgsIGlHcmVlbiAgKTsKKyAgICAgICAgICAgICAgTU5HX0NPTVBPU0U4IChpQmx1ZSwgICAgKihwRGF0YWxpbmUrMiksIGlBOCwgaUJsdWUgICApOworCisgICAgICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKG1uZ191aW50OCkgKCAoIGlSZWQgICYgMHhGOCApICB8ICAgKGlHcmVlbj4+NSkgKTsKKyAgICAgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAobW5nX3VpbnQ4KSAoICggaUJsdWUgPj4gIDMgICkgIHwgKCAoaUdyZWVuICYgMHhGQykgPDwgMykgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jICogMik7CisgICAgICAgICAgcERhdGFsaW5lICs9IDQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBjaGVja191cGRhdGVfcmVnaW9uIChwRGF0YSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRElTUExBWV9CR1I1NjUsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmIC8qIE1OR19OT18xNkJJVF9TVVBQT1JUICovCisjZW5kaWYgLyogTU5HX1NLSVBDQU5WQVNfQkdSNTY1ICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDQU5WQVNfUkdCNTY1CisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisjaWZuZGVmIE1OR19PUFRJTUlaRV9GT09UUFJJTlRfQ09NUE9TRQorbW5nX3JldGNvZGUgbW5nX2Rpc3BsYXlfcmdiNTY1IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ191aW50OHAgcFNjYW5saW5lOworICBtbmdfdWludDhwIHBEYXRhbGluZTsKKyAgbW5nX2ludDMyICBpWDsKKyAgbW5nX3VpbnQxNiBpQTE2OworICBtbmdfdWludDE2IGlGR3IxNiwgaUZHZzE2LCBpRkdiMTY7CisgIG1uZ191aW50MTYgaUJHcjE2LCBpQkdnMTYsIGlCR2IxNjsKKyAgbW5nX3VpbnQ4ICBpQTg7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRElTUExBWV9SR0I1NjUsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZpZXdhYmxlIHJvdyA/ICovCisgIGlmICgocERhdGEtPmlSb3cgPj0gcERhdGEtPmlTb3VyY2V0KSAmJiAocERhdGEtPmlSb3cgPCBwRGF0YS0+aVNvdXJjZWIpKQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkcmVzcyBkZXN0aW5hdGlvbiByb3cgKi8KKyAgICBwU2NhbmxpbmUgPSAobW5nX3VpbnQ4cClwRGF0YS0+ZkdldGNhbnZhc2xpbmUgKCgobW5nX2hhbmRsZSlwRGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aVJvdyArIHBEYXRhLT5pRGVzdHQgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlTb3VyY2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkanVzdCBkZXN0aW5hdGlvbiByb3cgc3RhcnRpbmctcG9pbnQgKi8KKyAgICBwU2NhbmxpbmUgPSBwU2NhbmxpbmUgKyAocERhdGEtPmlDb2wgKiAyKSArIChwRGF0YS0+aURlc3RsICogMik7CisgICAgcERhdGFsaW5lID0gcERhdGEtPnBSR0JBcm93OyAgICAgICAvKiBhZGRyZXNzIHNvdXJjZSByb3cgKi8KKworICAgIGlmIChwRGF0YS0+YklzUkdCQTE2KSAgICAgICAgICAgICAgLyogYWRqdXN0IHNvdXJjZSByb3cgc3RhcnRpbmctcG9pbnQgKi8KKyAgICAgIHBEYXRhbGluZSA9IHBEYXRhbGluZSArICgocERhdGEtPmlTb3VyY2VsIC8gcERhdGEtPmlDb2xpbmMpIDw8IDMpOworICAgIGVsc2UKKyAgICAgIHBEYXRhbGluZSA9IHBEYXRhbGluZSArICgocERhdGEtPmlTb3VyY2VsIC8gcERhdGEtPmlDb2xpbmMpIDw8IDIpOworCisgICAgaWYgKHBEYXRhLT5iSXNPcGFxdWUpICAgICAgICAgICAgICAvKiBmb3JnZXQgYWJvdXQgdHJhbnNwYXJlbmN5ID8gKi8KKyAgICB7CisgICAgICBpZiAocERhdGEtPmJJc1JHQkExNikgICAgICAgICAgICAvKiAxNi1iaXQgaW5wdXQgcm93ID8gKi8KKyAgICAgIHsKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pQ29sOyBpWCA8IHBEYXRhLT5pU291cmNlcjsKKyAgICAgICAgICAgICBpWCArPSBwRGF0YS0+aUNvbGluYykKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjYWxlIGRvd24gYnkgZHJvcHBpbmcgdGhlIExTQiAqLworICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKG1uZ191aW50OCkoICggKCAqKHBEYXRhbGluZSs0KSkgJiAweEY4KSAgfCAgICgqKHBEYXRhbGluZSsyKSA+PiA1ICApICAgICAgICk7CisgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAobW5nX3VpbnQ4KSggKCAoICoocERhdGFsaW5lICApKSA+PiAzICApICB8ICAoKCoocERhdGFsaW5lKzIpICYgMHhGQykgPDwgMykgKTsKKworICAgICAgICAgIHBTY2FubGluZSArPSAocERhdGEtPmlDb2xpbmMgKiAyKTsKKyAgICAgICAgICBwRGF0YWxpbmUgKz0gODsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlTb3VyY2VsICsgcERhdGEtPmlDb2w7IGlYIDwgcERhdGEtPmlTb3VyY2VyOworICAgICAgICAgICAgIGlYICs9IHBEYXRhLT5pQ29saW5jKQorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29weSB0aGUgdmFsdWVzICovCisgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAobW5nX3VpbnQ4KSggKCAoKihwRGF0YWxpbmUrMikpICYgMHhGOCkgIHwgICAoKihwRGF0YWxpbmUrMSkgPj4gNSAgICAgICAgKSApOworICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKG1uZ191aW50OCkoICggICoocERhdGFsaW5lICApICA+PiAzICApICB8ICAoKCoocERhdGFsaW5lKzEpICYgMHhGQykgPDwgMykgKTsKKworICAgICAgICAgIHBTY2FubGluZSArPSAocERhdGEtPmlDb2xpbmMgKiAyKTsKKyAgICAgICAgICBwRGF0YWxpbmUgKz0gNDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaWYgKHBEYXRhLT5iSXNSR0JBMTYpICAgICAgICAgICAgLyogMTYtYml0IGlucHV0IHJvdyA/ICovCisgICAgICB7CisKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pQ29sOyBpWCA8IHBEYXRhLT5pU291cmNlcjsKKyAgICAgICAgICAgICBpWCArPSBwRGF0YS0+aUNvbGluYykKKyAgICAgICAgeworICAgICAgICAgIGlBMTYgPSBtbmdfZ2V0X3VpbnQxNiAocERhdGFsaW5lKzYpOworCisgICAgICAgICAgaWYgKGlBMTYpICAgICAgICAgICAgICAgICAgICAvKiBhbnkgb3BhY2l0eSBhdCBhbGwgPyAqLworICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpQTE2ID09IDB4RkZGRikgICAgICAgIC8qIGZ1bGx5IG9wYXF1ZSA/ICovCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzY2FsZSBkb3duIGJ5IGRyb3BwaW5nIHRoZSBMU0IgKi8KKyAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAobW5nX3VpbnQ4KSggKCAoKihwRGF0YWxpbmUrNCkpICYgMHhGOCkgIHwgICAoKihwRGF0YWxpbmUrMik+PjUpICk7CisgICAgICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKG1uZ191aW50OCkoICggKCoocERhdGFsaW5lICApKSA+PiAzICApICB8ICAoKCoocERhdGFsaW5lKzIpJjB4RkMpIDw8IDMpICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgdGhlIHByb3BlciB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgaUZHcjE2ID0gbW5nX2dldF91aW50MTYgKHBEYXRhbGluZSAgKTsKKyAgICAgICAgICAgICAgaUZHZzE2ID0gbW5nX2dldF91aW50MTYgKHBEYXRhbGluZSsyKTsKKyAgICAgICAgICAgICAgaUZHYjE2ID0gbW5nX2dldF91aW50MTYgKHBEYXRhbGluZSs0KTsKKworCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbGUgYmFja2dyb3VuZCB1cCAqLworICAgICAgICAgICAgICBpQkdyMTYgPSAobW5nX3VpbnQ4KSggICoocFNjYW5saW5lKzEpICYgMHhGOCApOworICAgICAgICAgICAgICBpQkdnMTYgPSAobW5nX3VpbnQ4KSggKCoocFNjYW5saW5lKzEpIDw8IDUpICB8ICAoICgoKnBTY2FubGluZSkgJiAweEUwKSA+PiAzICkgKTsKKyAgICAgICAgICAgICAgaUJHYjE2ID0gKG1uZ191aW50OCkoICAqKHBTY2FubGluZSAgKSA8PCAzICAgKTsKKworICAgICAgICAgICAgICBpQkdyMTYgPSAobW5nX3VpbnQxNikoKG1uZ191aW50MzIpaUJHcjE2IDw8IDgpIHwgaUJHcjE2OworICAgICAgICAgICAgICBpQkdnMTYgPSAobW5nX3VpbnQxNikoKG1uZ191aW50MzIpaUJHZzE2IDw8IDgpIHwgaUJHZzE2OworICAgICAgICAgICAgICBpQkdiMTYgPSAobW5nX3VpbnQxNikoKG1uZ191aW50MzIpaUJHYjE2IDw8IDgpIHwgaUJHYjE2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm93IGNvbXBvc2UgKi8KKyAgICAgICAgICAgICAgTU5HX0NPTVBPU0UxNihpRkdyMTYsIGlGR3IxNiwgaUExNiwgaUJHcjE2KTsKKyAgICAgICAgICAgICAgTU5HX0NPTVBPU0UxNihpRkdnMTYsIGlGR2cxNiwgaUExNiwgaUJHZzE2KTsKKyAgICAgICAgICAgICAgTU5HX0NPTVBPU0UxNihpRkdiMTYsIGlGR2IxNiwgaUExNiwgaUJHYjE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCByZXR1cm4gdGhlIGNvbXBvc2VkIHZhbHVlcyAqLworICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9IChtbmdfdWludDgpKCAobW5nX3VpbnQ4KSgoaUZHYjE2ID4+IDgpICYweEY4KSB8ICAgKCAgIChtbmdfdWludDgpKGlGR2cxNiA+PiA4KSA+PiA1ICApICAgICAgICApOworICAgICAgICAgICAgICAqcFNjYW5saW5lICAgICA9IChtbmdfdWludDgpKCAobW5nX3VpbnQ4KSAoaUZHcjE2ID4+MTEpICAgICAgICB8ICAgKCAoIChtbmdfdWludDgpKGlGR2cxNiA+PiA4KSAmIDB4RkMpIDw8IDMpICApOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIHBTY2FubGluZSArPSAocERhdGEtPmlDb2xpbmMgKiAyKTsKKyAgICAgICAgICBwRGF0YWxpbmUgKz0gODsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlTb3VyY2VsICsgcERhdGEtPmlDb2w7IGlYIDwgcERhdGEtPmlTb3VyY2VyOworICAgICAgICAgICAgIGlYICs9IHBEYXRhLT5pQ29saW5jKQorICAgICAgICB7CisgICAgICAgICAgaUE4ID0gKihwRGF0YWxpbmUrMyk7ICAgICAgICAvKiBnZXQgYWxwaGEgdmFsdWUgKi8KKworICAgICAgICAgIGlmIChpQTgpICAgICAgICAgICAgICAgICAgICAgLyogYW55IG9wYWNpdHkgYXQgYWxsID8gKi8KKyAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoaUE4ID09IDB4RkYpICAgICAgICAgICAvKiBmdWxseSBvcGFxdWUgPyAqLworICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlbiBzaW1wbHkgY29weSB0aGUgdmFsdWVzICovCisgICAgICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKG1uZ191aW50OCkoICggKCoocERhdGFsaW5lKzIpKSAmIDB4RjgpICB8ICAoICAqKHBEYXRhbGluZSsxKSA+PiA1ICAgICAgICAgKSApOworICAgICAgICAgICAgICAqcFNjYW5saW5lICAgICA9IChtbmdfdWludDgpKCAoICgqKHBEYXRhbGluZSAgKSkgPj4gMyAgKSAgfCAgKCAoKihwRGF0YWxpbmUrMSkgJiAweEZDKSA8PCAzICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvIGFscGhhIGNvbXBvc2luZyAqLworICAgICAgICAgICAgICBtbmdfdWludDggaVJlZCwgaUdyZWVuLCBpQmx1ZTsKKworICAgICAgICAgICAgICBpUmVkICAgPSAobW5nX3VpbnQ4KSggICAqKHBTY2FubGluZSsxKSAmIDB4RjgpOworICAgICAgICAgICAgICBpR3JlZW4gPSAobW5nX3VpbnQ4KSggKCAqKHBTY2FubGluZSsxKSA8PCA1ICApICB8ICAoICggKCpwU2NhbmxpbmUpJjB4RTApPj4zICkgKTsKKyAgICAgICAgICAgICAgaUJsdWUgID0gKG1uZ191aW50OCkoICAgKihwU2NhbmxpbmUgICkgPDwgMyApOworCisgICAgICAgICAgICAgIE1OR19DT01QT1NFOCAoaVJlZCwgICAgICoocERhdGFsaW5lKzIpLCBpQTgsIGlSZWQgICAgKTsKKyAgICAgICAgICAgICAgTU5HX0NPTVBPU0U4IChpR3JlZW4sICAgKihwRGF0YWxpbmUrMSksIGlBOCwgaUdyZWVuICApOworICAgICAgICAgICAgICBNTkdfQ09NUE9TRTggKGlCbHVlLCAgICAqKHBEYXRhbGluZSswKSwgaUE4LCBpQmx1ZSAgICk7CisKKyAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAobW5nX3VpbnQ4KSggKCBpUmVkICYgMHhGOCkgIHwgICggIGlHcmVlbiA+PiA1ICAgICAgICApICk7CisgICAgICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKG1uZ191aW50OCkoIChpQmx1ZSA+PiAzICApICB8ICAoIChpR3JlZW4gJiAweEZDKSA8PCAzKSApOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIHBTY2FubGluZSArPSAocERhdGEtPmlDb2xpbmMgKiAyKTsKKyAgICAgICAgICBwRGF0YWxpbmUgKz0gNDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIGNoZWNrX3VwZGF0ZV9yZWdpb24gKHBEYXRhKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ESVNQTEFZX1JHQjU2NSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZWxzZSAvKiBNTkdfT1BUSU1JWkVfRk9PVFBSSU5UX0NPTVBPU0UgKi8KK21uZ19yZXRjb2RlIG1uZ19kaXNwbGF5X3JnYjU2NSAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfdWludDhwIHBTY2FubGluZTsKKyAgbW5nX3VpbnQ4cCBwRGF0YWxpbmU7CisgIG1uZ19pbnQzMiAgaVg7CisgIG1uZ191aW50MTYgaUExNjsKKyAgbW5nX3VpbnQxNiBpRkdyMTYsIGlGR2cxNiwgaUZHYjE2OworICBtbmdfdWludDE2IGlCR3IxNiwgaUJHZzE2LCBpQkdiMTY7CisgIG1uZ191aW50OCAgaUE4OworICBtbmdfdWludDggIGlCcHM7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRElTUExBWV9SR0I1NjUsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpQnBzPShtbmdfdWludDgpKHBEYXRhLT5iSXNSR0JBMTYgPyAyOjEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdmlld2FibGUgcm93ID8gKi8KKyAgaWYgKChwRGF0YS0+aVJvdyA+PSBwRGF0YS0+aVNvdXJjZXQpICYmIChwRGF0YS0+aVJvdyA8IHBEYXRhLT5pU291cmNlYikpCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGRyZXNzIGRlc3RpbmF0aW9uIHJvdyAqLworICAgIHBTY2FubGluZSA9IChtbmdfdWludDhwKXBEYXRhLT5mR2V0Y2FudmFzbGluZSAoKChtbmdfaGFuZGxlKXBEYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pUm93ICsgcERhdGEtPmlEZXN0dCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aVNvdXJjZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRqdXN0IGRlc3RpbmF0aW9uIHJvdyBzdGFydGluZy1wb2ludCAqLworICAgIHBTY2FubGluZSA9IHBTY2FubGluZSArIChwRGF0YS0+aUNvbCAqIDIpICsgKHBEYXRhLT5pRGVzdGwgKiAyKTsKKyAgICBwRGF0YWxpbmUgPSBwRGF0YS0+cFJHQkFyb3c7ICAgICAgIC8qIGFkZHJlc3Mgc291cmNlIHJvdyAqLworCisgICAgLyogYWRqdXN0IHNvdXJjZSByb3cgc3RhcnRpbmctcG9pbnQgKi8KKyAgICBwRGF0YWxpbmUgPSBwRGF0YWxpbmUgKyAoKHBEYXRhLT5pU291cmNlbCAvIHBEYXRhLT5pQ29saW5jKSA8PCAoaUJwcysxKSk7CisKKyAgICBpZiAocERhdGEtPmJJc09wYXF1ZSkgICAgICAgICAgICAgIC8qIGZvcmdldCBhYm91dCB0cmFuc3BhcmVuY3kgPyAqLworICAgIHsKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pQ29sOyBpWCA8IHBEYXRhLT5pU291cmNlcjsKKyAgICAgICAgICAgICBpWCArPSBwRGF0YS0+aUNvbGluYykKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjYWxlIGRvd24gYnkgZHJvcHBpbmcgdGhlIExTQiAqLworICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKG1uZ191aW50OCkoICggKCAqKHBEYXRhbGluZSsyKmlCcHMpKSAmIDB4RjgpICB8CisgICAgICAgICAgICAgICgqKHBEYXRhbGluZStpQnBzKSA+PiA1ICApICAgICAgICk7CisgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAobW5nX3VpbnQ4KSggKCAoICoocERhdGFsaW5lICApKSA+PiAzICApICB8CisgICAgICAgICAgICAgKCgqKHBEYXRhbGluZStpQnBzKSAmIDB4RkMpIDw8IDMpICk7CisKKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jICogMik7CisgICAgICAgICAgcERhdGFsaW5lICs9IDQqaUJwczsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaWYgKHBEYXRhLT5iSXNSR0JBMTYpICAgICAgICAgICAgLyogMTYtYml0IGlucHV0IHJvdyA/ICovCisgICAgICB7CisKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pQ29sOyBpWCA8IHBEYXRhLT5pU291cmNlcjsKKyAgICAgICAgICAgICBpWCArPSBwRGF0YS0+aUNvbGluYykKKyAgICAgICAgeworICAgICAgICAgIGlBMTYgPSBtbmdfZ2V0X3VpbnQxNiAocERhdGFsaW5lKzYpOworCisgICAgICAgICAgaWYgKGlBMTYpICAgICAgICAgICAgICAgICAgICAvKiBhbnkgb3BhY2l0eSBhdCBhbGwgPyAqLworICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpQTE2ID09IDB4RkZGRikgICAgICAgIC8qIGZ1bGx5IG9wYXF1ZSA/ICovCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzY2FsZSBkb3duIGJ5IGRyb3BwaW5nIHRoZSBMU0IgKi8KKyAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAobW5nX3VpbnQ4KSggKCAoKihwRGF0YWxpbmUrNCkpICYgMHhGOCkgIHwgICAoKihwRGF0YWxpbmUrMik+PjUpICk7CisgICAgICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKG1uZ191aW50OCkoICggKCoocERhdGFsaW5lICApKSA+PiAzICApICB8ICAoKCoocERhdGFsaW5lKzIpJjB4RkMpIDw8IDMpICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgdGhlIHByb3BlciB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgaUZHcjE2ID0gbW5nX2dldF91aW50MTYgKHBEYXRhbGluZSAgKTsKKyAgICAgICAgICAgICAgaUZHZzE2ID0gbW5nX2dldF91aW50MTYgKHBEYXRhbGluZSsyKTsKKyAgICAgICAgICAgICAgaUZHYjE2ID0gbW5nX2dldF91aW50MTYgKHBEYXRhbGluZSs0KTsKKworCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbGUgYmFja2dyb3VuZCB1cCAqLworICAgICAgICAgICAgICBpQkdyMTYgPSAobW5nX3VpbnQ4KSggICoocFNjYW5saW5lKzEpICYgMHhGOCApOworICAgICAgICAgICAgICBpQkdnMTYgPSAobW5nX3VpbnQ4KSggKCoocFNjYW5saW5lKzEpIDw8IDUpICB8ICAoICgoKnBTY2FubGluZSkgJiAweEUwKSA+PiAzICkgKTsKKyAgICAgICAgICAgICAgaUJHYjE2ID0gKG1uZ191aW50OCkoICAqKHBTY2FubGluZSAgKSA8PCAzICAgKTsKKworICAgICAgICAgICAgICBpQkdyMTYgPSAobW5nX3VpbnQxNikoKG1uZ191aW50MzIpaUJHcjE2IDw8IDgpIHwgaUJHcjE2OworICAgICAgICAgICAgICBpQkdnMTYgPSAobW5nX3VpbnQxNikoKG1uZ191aW50MzIpaUJHZzE2IDw8IDgpIHwgaUJHZzE2OworICAgICAgICAgICAgICBpQkdiMTYgPSAobW5nX3VpbnQxNikoKG1uZ191aW50MzIpaUJHYjE2IDw8IDgpIHwgaUJHYjE2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm93IGNvbXBvc2UgKi8KKyAgICAgICAgICAgICAgTU5HX0NPTVBPU0UxNihpRkdyMTYsIGlGR3IxNiwgaUExNiwgaUJHcjE2KTsKKyAgICAgICAgICAgICAgTU5HX0NPTVBPU0UxNihpRkdnMTYsIGlGR2cxNiwgaUExNiwgaUJHZzE2KTsKKyAgICAgICAgICAgICAgTU5HX0NPTVBPU0UxNihpRkdiMTYsIGlGR2IxNiwgaUExNiwgaUJHYjE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCByZXR1cm4gdGhlIGNvbXBvc2VkIHZhbHVlcyAqLworICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9IChtbmdfdWludDgpKCAobW5nX3VpbnQ4KSgoaUZHYjE2ID4+IDgpICYweEY4KSB8ICAgKCAgIChtbmdfdWludDgpKGlGR2cxNiA+PiA4KSA+PiA1ICApICAgICAgICApOworICAgICAgICAgICAgICAqcFNjYW5saW5lICAgICA9IChtbmdfdWludDgpKCAobW5nX3VpbnQ4KSAoaUZHcjE2ID4+MTEpICAgICAgICB8ICAgKCAoIChtbmdfdWludDgpKGlGR2cxNiA+PiA4KSAmIDB4RkMpIDw8IDMpICApOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIHBTY2FubGluZSArPSAocERhdGEtPmlDb2xpbmMgKiAyKTsKKyAgICAgICAgICBwRGF0YWxpbmUgKz0gODsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlTb3VyY2VsICsgcERhdGEtPmlDb2w7IGlYIDwgcERhdGEtPmlTb3VyY2VyOworICAgICAgICAgICAgIGlYICs9IHBEYXRhLT5pQ29saW5jKQorICAgICAgICB7CisgICAgICAgICAgaUE4ID0gKihwRGF0YWxpbmUrMyk7ICAgICAgICAvKiBnZXQgYWxwaGEgdmFsdWUgKi8KKworICAgICAgICAgIGlmIChpQTgpICAgICAgICAgICAgICAgICAgICAgLyogYW55IG9wYWNpdHkgYXQgYWxsID8gKi8KKyAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoaUE4ID09IDB4RkYpICAgICAgICAgICAvKiBmdWxseSBvcGFxdWUgPyAqLworICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlbiBzaW1wbHkgY29weSB0aGUgdmFsdWVzICovCisgICAgICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKG1uZ191aW50OCkoICggKCoocERhdGFsaW5lKzIpKSAmIDB4RjgpICB8ICAoICAqKHBEYXRhbGluZSsxKSA+PiA1ICAgICAgICAgKSApOworICAgICAgICAgICAgICAqcFNjYW5saW5lICAgICA9IChtbmdfdWludDgpKCAoICgqKHBEYXRhbGluZSAgKSkgPj4gMyAgKSAgfCAgKCAoKihwRGF0YWxpbmUrMSkgJiAweEZDKSA8PCAzICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvIGFscGhhIGNvbXBvc2luZyAqLworICAgICAgICAgICAgICBtbmdfdWludDggaVJlZCwgaUdyZWVuLCBpQmx1ZTsKKworICAgICAgICAgICAgICBpUmVkICAgPSAobW5nX3VpbnQ4KSggICAqKHBTY2FubGluZSsxKSAmIDB4RjgpOworICAgICAgICAgICAgICBpR3JlZW4gPSAobW5nX3VpbnQ4KSggKCAqKHBTY2FubGluZSsxKSA8PCA1ICApICB8ICAoICggKCpwU2NhbmxpbmUpJjB4RTApPj4zICkgKTsKKyAgICAgICAgICAgICAgaUJsdWUgID0gKG1uZ191aW50OCkoICAgKihwU2NhbmxpbmUgICkgPDwgMyApOworCisgICAgICAgICAgICAgIE1OR19DT01QT1NFOCAoaVJlZCwgICAgICoocERhdGFsaW5lKzIpLCBpQTgsIGlSZWQgICAgKTsKKyAgICAgICAgICAgICAgTU5HX0NPTVBPU0U4IChpR3JlZW4sICAgKihwRGF0YWxpbmUrMSksIGlBOCwgaUdyZWVuICApOworICAgICAgICAgICAgICBNTkdfQ09NUE9TRTggKGlCbHVlLCAgICAqKHBEYXRhbGluZSswKSwgaUE4LCBpQmx1ZSAgICk7CisKKyAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAobW5nX3VpbnQ4KSggKCBpUmVkICYgMHhGOCkgIHwgICggIGlHcmVlbiA+PiA1ICAgICAgICApICk7CisgICAgICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKG1uZ191aW50OCkoIChpQmx1ZSA+PiAzICApICB8ICAoIChpR3JlZW4gJiAweEZDKSA8PCAzKSApOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIHBTY2FubGluZSArPSAocERhdGEtPmlDb2xpbmMgKiAyKTsKKyAgICAgICAgICBwRGF0YWxpbmUgKz0gNDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIGNoZWNrX3VwZGF0ZV9yZWdpb24gKHBEYXRhKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ESVNQTEFZX1JHQjU2NSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYgLyogTU5HX09QVElNSVpFX0ZPT1RQUklOVF9DT01QT1NFICovCisjZWxzZSAvKiBNTkdfTk9fMTZCSVRfU1VQUE9SVCAqLworbW5nX3JldGNvZGUgbW5nX2Rpc3BsYXlfcmdiNTY1IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ191aW50OHAgcFNjYW5saW5lOworICBtbmdfdWludDhwIHBEYXRhbGluZTsKKyAgbW5nX2ludDMyICBpWDsKKyAgbW5nX3VpbnQ4ICBpQTg7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRElTUExBWV9SR0I1NjUsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZpZXdhYmxlIHJvdyA/ICovCisgIGlmICgocERhdGEtPmlSb3cgPj0gcERhdGEtPmlTb3VyY2V0KSAmJiAocERhdGEtPmlSb3cgPCBwRGF0YS0+aVNvdXJjZWIpKQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkcmVzcyBkZXN0aW5hdGlvbiByb3cgKi8KKyAgICBwU2NhbmxpbmUgPSAobW5nX3VpbnQ4cClwRGF0YS0+ZkdldGNhbnZhc2xpbmUgKCgobW5nX2hhbmRsZSlwRGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aVJvdyArIHBEYXRhLT5pRGVzdHQgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlTb3VyY2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkanVzdCBkZXN0aW5hdGlvbiByb3cgc3RhcnRpbmctcG9pbnQgKi8KKyAgICBwU2NhbmxpbmUgPSBwU2NhbmxpbmUgKyAocERhdGEtPmlDb2wgKiAyKSArIChwRGF0YS0+aURlc3RsICogMik7CisgICAgcERhdGFsaW5lID0gcERhdGEtPnBSR0JBcm93OyAgICAgICAvKiBhZGRyZXNzIHNvdXJjZSByb3cgKi8KKworICAgICAgcERhdGFsaW5lID0gcERhdGFsaW5lICsgKChwRGF0YS0+aVNvdXJjZWwgLyBwRGF0YS0+aUNvbGluYykgPDwgMik7CisKKyAgICBpZiAocERhdGEtPmJJc09wYXF1ZSkgICAgICAgICAgICAgIC8qIGZvcmdldCBhYm91dCB0cmFuc3BhcmVuY3kgPyAqLworICAgIHsKKyAgICAgIHsKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pQ29sOyBpWCA8IHBEYXRhLT5pU291cmNlcjsKKyAgICAgICAgICAgICBpWCArPSBwRGF0YS0+aUNvbGluYykKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvcHkgdGhlIHZhbHVlcyAqLworICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKG1uZ191aW50OCkoICggKCoocERhdGFsaW5lKzIpKSAmIDB4RjgpICB8ICAgKCoocERhdGFsaW5lKzEpID4+IDUgICAgICAgICkgKTsKKyAgICAgICAgICAqcFNjYW5saW5lICAgICA9IChtbmdfdWludDgpKCAoICAqKHBEYXRhbGluZSAgKSAgPj4gMyAgKSAgfCAgKCgqKHBEYXRhbGluZSsxKSAmIDB4RkMpIDw8IDMpICk7CisKKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jICogMik7CisgICAgICAgICAgcERhdGFsaW5lICs9IDQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHsKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pQ29sOyBpWCA8IHBEYXRhLT5pU291cmNlcjsKKyAgICAgICAgICAgICBpWCArPSBwRGF0YS0+aUNvbGluYykKKyAgICAgICAgeworICAgICAgICAgIGlBOCA9ICoocERhdGFsaW5lKzMpOyAgICAgICAgLyogZ2V0IGFscGhhIHZhbHVlICovCisKKyAgICAgICAgICBpZiAoaUE4KSAgICAgICAgICAgICAgICAgICAgIC8qIGFueSBvcGFjaXR5IGF0IGFsbCA/ICovCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKGlBOCA9PSAweEZGKSAgICAgICAgICAgLyogZnVsbHkgb3BhcXVlID8gKi8KKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZW4gc2ltcGx5IGNvcHkgdGhlIHZhbHVlcyAqLworICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9IChtbmdfdWludDgpKCAoICgqKHBEYXRhbGluZSsyKSkgJiAweEY4KSAgfCAgKCAgKihwRGF0YWxpbmUrMSkgPj4gNSAgICAgICAgICkgKTsKKyAgICAgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAobW5nX3VpbnQ4KSggKCAoKihwRGF0YWxpbmUgICkpID4+IDMgICkgIHwgICggKCoocERhdGFsaW5lKzEpICYgMHhGQykgPDwgMyApICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkbyBhbHBoYSBjb21wb3NpbmcgKi8KKyAgICAgICAgICAgICAgbW5nX3VpbnQ4IGlSZWQsIGlHcmVlbiwgaUJsdWU7CisKKyAgICAgICAgICAgICAgaVJlZCAgID0gKG1uZ191aW50OCkoICAgKihwU2NhbmxpbmUrMSkgJiAweEY4KTsKKyAgICAgICAgICAgICAgaUdyZWVuID0gKG1uZ191aW50OCkoICggKihwU2NhbmxpbmUrMSkgPDwgNSAgKSAgfCAgKCAoICgqcFNjYW5saW5lKSYweEUwKT4+MyApICk7CisgICAgICAgICAgICAgIGlCbHVlICA9IChtbmdfdWludDgpKCAgICoocFNjYW5saW5lICApIDw8IDMgKTsKKworICAgICAgICAgICAgICBNTkdfQ09NUE9TRTggKGlSZWQsICAgICAqKHBEYXRhbGluZSsyKSwgaUE4LCBpUmVkICAgICk7CisgICAgICAgICAgICAgIE1OR19DT01QT1NFOCAoaUdyZWVuLCAgICoocERhdGFsaW5lKzEpLCBpQTgsIGlHcmVlbiAgKTsKKyAgICAgICAgICAgICAgTU5HX0NPTVBPU0U4IChpQmx1ZSwgICAgKihwRGF0YWxpbmUrMCksIGlBOCwgaUJsdWUgICApOworCisgICAgICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKG1uZ191aW50OCkoICggaVJlZCAmIDB4RjgpICB8ICAoICBpR3JlZW4gPj4gNSAgICAgICAgKSApOworICAgICAgICAgICAgICAqcFNjYW5saW5lICAgICA9IChtbmdfdWludDgpKCAoaUJsdWUgPj4gMyAgKSAgfCAgKCAoaUdyZWVuICYgMHhGQykgPDwgMykgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jICogMik7CisgICAgICAgICAgcERhdGFsaW5lICs9IDQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBjaGVja191cGRhdGVfcmVnaW9uIChwRGF0YSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRElTUExBWV9SR0I1NjUsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmIC8qIE1OR19OT18xNkJJVF9TVVBQT1JUICovCisjZW5kaWYgLyogTU5HX1NLSVBDQU5WQVNfUkdCNTY1ICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDQU5WQVNfQkdSQTU2NQorI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorI2lmbmRlZiBNTkdfT1BUSU1JWkVfRk9PVFBSSU5UX0NPTVBPU0UKK21uZ19yZXRjb2RlIG1uZ19kaXNwbGF5X2JncmE1NjUgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX3VpbnQ4cCBwU2NhbmxpbmU7CisgIG1uZ191aW50OHAgcERhdGFsaW5lOworICBtbmdfaW50MzIgIGlYOworICBtbmdfdWludDggIGlGR2E4LCBpQkdhOCwgaUNhODsKKyAgbW5nX3VpbnQxNiBpRkdhMTYsIGlCR2ExNiwgaUNhMTY7CisgIG1uZ191aW50MTYgaUZHcjE2LCBpRkdnMTYsIGlGR2IxNjsKKyAgbW5nX3VpbnQxNiBpQkdyMTYsIGlCR2cxNiwgaUJHYjE2OworICBtbmdfdWludDE2IGlDcjE2LCBpQ2cxNiwgaUNiMTY7CisgIG1uZ191aW50OCAgaUNyOCwgaUNnOCwgaUNiODsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ESVNQTEFZX0JHUkE1NjUsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZpZXdhYmxlIHJvdyA/ICovCisgIGlmICgocERhdGEtPmlSb3cgPj0gcERhdGEtPmlTb3VyY2V0KSAmJiAocERhdGEtPmlSb3cgPCBwRGF0YS0+aVNvdXJjZWIpKQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkcmVzcyBkZXN0aW5hdGlvbiByb3cgKi8KKyAgICBwU2NhbmxpbmUgPSAobW5nX3VpbnQ4cClwRGF0YS0+ZkdldGNhbnZhc2xpbmUgKCgobW5nX2hhbmRsZSlwRGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aVJvdyArIHBEYXRhLT5pRGVzdHQgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlTb3VyY2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkanVzdCBkZXN0aW5hdGlvbiByb3cgc3RhcnRpbmctcG9pbnQgKi8KKyAgICBwU2NhbmxpbmUgPSBwU2NhbmxpbmUgKyAocERhdGEtPmlDb2wgPDwgMikgKyAocERhdGEtPmlEZXN0bCAqIDMpOworICAgIHBEYXRhbGluZSA9IHBEYXRhLT5wUkdCQXJvdzsgICAgICAgLyogYWRkcmVzcyBzb3VyY2Ugcm93ICovCisKKyAgICBpZiAocERhdGEtPmJJc1JHQkExNikgICAgICAgICAgICAgIC8qIGFkanVzdCBzb3VyY2Ugcm93IHN0YXJ0aW5nLXBvaW50ICovCisgICAgICBwRGF0YWxpbmUgPSBwRGF0YWxpbmUgKyAoKHBEYXRhLT5pU291cmNlbCAvIHBEYXRhLT5pQ29saW5jKSA8PCAzKTsKKyAgICBlbHNlCisgICAgICBwRGF0YWxpbmUgPSBwRGF0YWxpbmUgKyAoKHBEYXRhLT5pU291cmNlbCAvIHBEYXRhLT5pQ29saW5jKSA8PCAyKTsKKworICAgIGlmIChwRGF0YS0+YklzT3BhcXVlKSAgICAgICAgICAgICAgLyogZm9yZ2V0IGFib3V0IHRyYW5zcGFyZW5jeSA/ICovCisgICAgeworICAgICAgaWYgKHBEYXRhLT5iSXNSR0JBMTYpICAgICAgICAgICAgLyogMTYtYml0IGlucHV0IHJvdyA/ICovCisgICAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzY2FsZSBkb3duIGJ5IGRyb3BwaW5nIHRoZSBMU0IgKi8KKyAgICAgICAgICAqKHBTY2FubGluZSsxKSA9IChtbmdfdWludDgpKCAoICgqKHBEYXRhbGluZSkpJjB4RjggKSB8ICggICAoKihwRGF0YWxpbmUrMik+PjUpICAgICAgICkgKTsKKyAgICAgICAgICAqcFNjYW5saW5lICAgICA9IChtbmdfdWludDgpKCAoICgqKHBEYXRhbGluZSs0KSkgPj4zKSB8ICggICAoKihwRGF0YWxpbmUrMikmMHhGQykgPDwgMykgKTsKKyAgICAgICAgICAqKHBTY2FubGluZSsyKSA9ICoocERhdGFsaW5lKzYpOworCisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyAqIDMpOworICAgICAgICAgIHBEYXRhbGluZSArPSA4OworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3B5IHRoZSB2YWx1ZXMgKi8KKyAgICAgICAgICAqKHBTY2FubGluZSsxKSA9IChtbmdfdWludDgpKCAoICgqKHBEYXRhbGluZSkpJjB4RjggKSAgfCAgKCAoKihwRGF0YWxpbmUrMSk+PjUgICApICAgICApICk7CisgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAobW5nX3VpbnQ4KSggKCAgKihwRGF0YWxpbmUrMikgPj4zICkgIHwgICggKCoocERhdGFsaW5lKzEpJjB4RkMgKSA8PCAzKSApOworICAgICAgICAgICoocFNjYW5saW5lKzIpID0gKihwRGF0YWxpbmUrMyk7CisKKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jICogMyk7CisgICAgICAgICAgcERhdGFsaW5lICs9IDQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGlmIChwRGF0YS0+YklzUkdCQTE2KSAgICAgICAgICAgIC8qIDE2LWJpdCBpbnB1dCByb3cgPyAqLworICAgICAgeworICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlTb3VyY2VsICsgcERhdGEtPmlDb2w7IGlYIDwgcERhdGEtPmlTb3VyY2VyOworICAgICAgICAgICAgIGlYICs9IHBEYXRhLT5pQ29saW5jKQorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0IGFscGhhIHZhbHVlcyAqLworICAgICAgICAgIGlGR2ExNiA9IG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUrNik7CisgICAgICAgICAgaUJHYTE2ID0gKG1uZ191aW50MTYpKCoocFNjYW5saW5lKzIpKTsKKyAgICAgICAgICBpQkdhMTYgPSAobW5nX3VpbnQxNikoaUJHYTE2IDw8IDgpIHwgaUJHYTE2OworCisgICAgICAgICAgaWYgKGlGR2ExNikgICAgICAgICAgICAgICAgICAvKiBhbnkgb3BhY2l0eSBhdCBhbGwgPyAqLworICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZnVsbHkgb3BhcXVlIG9yIGJhY2tncm91bmQgZnVsbHkgdHJhbnNwYXJlbnQgPyAqLworICAgICAgICAgICAgaWYgKChpRkdhMTYgPT0gMHhGRkZGKSB8fCAoaUJHYTE2ID09IDApKQorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGxhaW4gY29weSBpdCAqLworICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9IChtbmdfdWludDgpKCAoKihwRGF0YWxpbmUpKSYweEY4ICkgIHwgIChtbmdfdWludDgpKCAoKihwRGF0YWxpbmUrMik+PjUgICkgICAgICk7CisgICAgICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKG1uZ191aW50OCkoICgqKHBEYXRhbGluZSs0KSkgPj4zKSAgfCAgKG1uZ191aW50OCkoICgqKHBEYXRhbGluZSsyKSYweEZDKSA8PCAzKTsKKwkJCSAgKihwU2NhbmxpbmUrMikgPSAqKHBEYXRhbGluZSs2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKGlCR2ExNiA9PSAweEZGRkYpICAgIC8qIGJhY2tncm91bmQgZnVsbHkgb3BhcXVlID8gKi8KKyAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCB0aGUgcHJvcGVyIHZhbHVlcyAqLworICAgICAgICAgICAgICAgIGlGR3IxNiA9IG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUgICk7CisgICAgICAgICAgICAgICAgaUZHZzE2ID0gbW5nX2dldF91aW50MTYgKHBEYXRhbGluZSsyKTsKKyAgICAgICAgICAgICAgICBpRkdiMTYgPSBtbmdfZ2V0X3VpbnQxNiAocERhdGFsaW5lKzQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbGUgYmFja2dyb3VuZCB1cCAqLworICAgICAgICAgICAgICAgIGlCR2IxNiA9IChtbmdfdWludDE2KSggKCoocFNjYW5saW5lKzEpKSAmIDB4RjggKTsKKyAgICAgICAgICAgICAgICBpQkdnMTYgPSAobW5nX3VpbnQxNikoICgqKHBTY2FubGluZSsxKSA8PCA1KSAgfCAgKCgoKihwU2NhbmxpbmUgICkpICYgMHhFMCkgPj4zICkgKTsKKyAgICAgICAgICAgICAgICBpQkdyMTYgPSAobW5nX3VpbnQxNikoICgqKHBTY2FubGluZSAgKSkgPDwgMyAgICk7CisKKwkJCQlpQkdyMTYgPSAobW5nX3VpbnQxNikoKG1uZ191aW50MzIpaUJHcjE2IDw8IDgpIHwgaUJHcjE2OworICAgICAgICAgICAgICAgIGlCR2cxNiA9IChtbmdfdWludDE2KSgobW5nX3VpbnQzMilpQkdnMTYgPDwgOCkgfCBpQkdnMTY7CisgICAgICAgICAgICAgICAgaUJHYjE2ID0gKG1uZ191aW50MTYpKChtbmdfdWludDMyKWlCR2IxNiA8PCA4KSB8IGlCR2IxNjsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm93IGNvbXBvc2UgKi8KKyAgICAgICAgICAgICAgICBNTkdfQ09NUE9TRTE2KGlGR3IxNiwgaUZHcjE2LCBpRkdhMTYsIGlCR3IxNik7CisgICAgICAgICAgICAgICAgTU5HX0NPTVBPU0UxNihpRkdnMTYsIGlGR2cxNiwgaUZHYTE2LCBpQkdnMTYpOworICAgICAgICAgICAgICAgIE1OR19DT01QT1NFMTYoaUZHYjE2LCBpRkdiMTYsIGlGR2ExNiwgaUJHYjE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCByZXR1cm4gdGhlIGNvbXBvc2VkIHZhbHVlcyAqLworICAgICAgICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKG1uZ191aW50OCkgKCAoIChpRkdyMTYgPj4gOCkmMHhGOCApICB8ICAoIChtbmdfdWludDgpKGlGR2cxNj4+OCkgPj4gNSkgICAgICApOworICAgICAgICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKG1uZ191aW50OCkgKCAoIChpRkdiMTY+PjExKSAgICAgICApICB8ICAoKChtbmdfdWludDgpKGlGR2cxNj4+OCkmMHhGQykgPDwgMykgKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBzY2FsZSBiYWNrZ3JvdW5kIHVwICovCisgICAgICAgICAgICAgICAgaUJHYjE2ID0gKG1uZ191aW50MTYpKCAoKihwU2NhbmxpbmUrMSkpICYgMHhGOCApOworICAgICAgICAgICAgICAgIGlCR2cxNiA9IChtbmdfdWludDE2KSggKCoocFNjYW5saW5lKzEpIDw8IDUpICB8ICAoKCgqKHBTY2FubGluZSAgKSkgJiAweEUwKSA+PjMgKSApOworICAgICAgICAgICAgICAgIGlCR3IxNiA9IChtbmdfdWludDE2KSggKCoocFNjYW5saW5lICApKSA8PCAzICAgKTsKKworCQkJCWlCR3IxNiA9IChtbmdfdWludDE2KSgobW5nX3VpbnQzMilpQkdyMTYgPDwgOCkgfCBpQkdyMTY7CisgICAgICAgICAgICAgICAgaUJHZzE2ID0gKG1uZ191aW50MTYpKChtbmdfdWludDMyKWlCR2cxNiA8PCA4KSB8IGlCR2cxNjsKKyAgICAgICAgICAgICAgICBpQkdiMTYgPSAobW5nX3VpbnQxNikoKG1uZ191aW50MzIpaUJHYjE2IDw8IDgpIHwgaUJHYjE2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGV0J3MgYmxlbmQgKi8KKyAgICAgICAgICAgICAgICBNTkdfQkxFTkQxNiAobW5nX2dldF91aW50MTYgKHBEYXRhbGluZSAgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2dldF91aW50MTYgKHBEYXRhbGluZSsyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2dldF91aW50MTYgKHBEYXRhbGluZSs0KSwgaUZHYTE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpQkdyMTYsIGlCR2cxNiwgaUJHYjE2LCBpQkdhMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlDcjE2LCAgaUNnMTYsICBpQ2IxNiwgIGlDYTE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCByZXR1cm4gdGhlIGNvbXBvc2VkIHZhbHVlcyAqLworICAgICAgICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKG1uZ191aW50OCkgKCAoIChpQ3IxNiA+PiAgOCkgJiAweEY4ICkgIHwgICggKG1uZ191aW50OCkoaUNnMTYgPj4gOCkgPj4gNSAgKSAgICAgICApOworICAgICAgICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKG1uZ191aW50OCkgKCAoIChpQ2IxNiA+PiAxMSkgICAgICAgICkgIHwgICgoKG1uZ191aW50OCkoaUNnMTYgPj4gOCkgJiAweEZDKSA8PCAzKSApOworICAgICAgICAgICAgICAgICoocFNjYW5saW5lKzIpID0gKG1uZ191aW50OCkoaUNhMTYgPj4gOCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jICogMyk7CisgICAgICAgICAgcERhdGFsaW5lICs9IDg7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pQ29sOyBpWCA8IHBEYXRhLT5pU291cmNlcjsKKyAgICAgICAgICAgICBpWCArPSBwRGF0YS0+aUNvbGluYykKKyAgICAgICAgeworICAgICAgICAgIGlGR2E4ID0gKihwRGF0YWxpbmUrMyk7ICAgICAgLyogZ2V0IGFscGhhIHZhbHVlcyAqLworICAgICAgICAgIGlCR2E4ID0gKihwU2NhbmxpbmUrMik7CisKKyAgICAgICAgICBpZiAoaUZHYTgpICAgICAgICAgICAgICAgICAgIC8qIGFueSBvcGFjaXR5IGF0IGFsbCA/ICovCisgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmdWxseSBvcGFxdWUgb3IgYmFja2dyb3VuZCBmdWxseSB0cmFuc3BhcmVudCA/ICovCisgICAgICAgICAgICBpZiAoKGlGR2E4ID09IDB4RkYpIHx8IChpQkdhOCA9PSAwKSkKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZW4gc2ltcGx5IGNvcHkgdGhlIHZhbHVlcyAqLworICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9IChtbmdfdWludDgpKCAoICAoKihwRGF0YWxpbmUpKSAmMHhGOCApICB8ICAgKCoocERhdGFsaW5lKzEpID4+NSApICAgICAgICk7CisgICAgICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKG1uZ191aW50OCkoICggKCgqKHBEYXRhbGluZSsyKSk+PjMpICkgIHwgICgoKihwRGF0YWxpbmUrMSkmMHhGQykgPDwgMykgKTsKKyAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMikgPSAqKHBEYXRhbGluZSszKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgbW5nX3VpbnQ4IGlSZWQsIGlHcmVlbiwgaUJsdWU7CisKKyAgICAgICAgICAgICAgaVJlZCAgID0gKG1uZ191aW50OCkgKCAgKihwU2NhbmxpbmUrMSkgJiAweEY4ICk7CisgICAgICAgICAgICAgIGlHcmVlbiA9IChtbmdfdWludDgpICggKCoocFNjYW5saW5lKzEpIDw8IDUpICB8ICAoICgoKnBTY2FubGluZSkgJiAweEUwKT4+MyApICk7CisgICAgICAgICAgICAgIGlCbHVlICA9IChtbmdfdWludDgpICggKCpwU2NhbmxpbmUgPDwgMykgKTsKKworICAgICAgICAgICAgICBpZiAoaUJHYTggPT0gMHhGRikgICAgICAgLyogYmFja2dyb3VuZCBmdWxseSBvcGFxdWUgPyAqLworICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogZG8gYWxwaGEgY29tcG9zaW5nICovCisgICAgICAgICAgICAgICAgTU5HX0NPTVBPU0U4IChpUmVkLCAgICpwRGF0YWxpbmUsICAgICBpRkdhOCwgaVJlZCAgICk7CisgICAgICAgICAgICAgICAgTU5HX0NPTVBPU0U4IChpR3JlZW4sICoocERhdGFsaW5lKzEpLCBpRkdhOCwgaUdyZWVuICk7CisgICAgICAgICAgICAgICAgTU5HX0NPTVBPU0U4IChpQmx1ZSwgICoocERhdGFsaW5lKzIpLCBpRkdhOCwgaUJsdWUgICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbHBoYSByZW1haW5zIGZ1bGx5IG9wYXF1ZSAhISEgKi8KKyAgICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9IChtbmdfdWludDgpICggKCBpUmVkICAmIDB4RjggKSAgfCAgIChpR3JlZW4+PjUpICk7CisgICAgICAgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAobW5nX3VpbnQ4KSAoICggaUJsdWUgPj4gIDMgICkgIHwgKCAoaUdyZWVuICYgMHhGQykgPDwgMykgKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3cgYmxlbmQgKi8KKyAgICAgICAgICAgICAgICBNTkdfQkxFTkQ4ICgqcERhdGFsaW5lLCAqKHBEYXRhbGluZSsxKSwgKihwRGF0YWxpbmUrMiksIGlGR2E4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlSZWQgICAgICAsIGlHcmVlbiAgICAgICAgLCBpQmx1ZSAgICAgICAgICwgaUJHYTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUNyOCwgaUNnOCwgaUNiOCwgaUNhOCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgcmV0dXJuIHRoZSBjb21wb3NlZCB2YWx1ZXMgKi8KKworCisgICAgICAgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAobW5nX3VpbnQ4KSAoICggaUNiOCA+PiAgMyAgKSAgfCAoIChpQ2c4ICYgMHhGQykgPDwgMykgKTsKKyAgICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9IChtbmdfdWludDgpICggKCBpQ3I4ICAmIDB4RjggKSAgfCAgIChpQ2c4Pj41KSApOworCQkJCSoocFNjYW5saW5lKzIpID0gKG1uZ191aW50OCkgaUNhODsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIHBTY2FubGluZSArPSAocERhdGEtPmlDb2xpbmMgKjMpOworICAgICAgICAgIHBEYXRhbGluZSArPSA0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgY2hlY2tfdXBkYXRlX3JlZ2lvbiAocERhdGEpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RJU1BMQVlfQkdSQTU2NSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZWxzZSAvKiBNTkdfT1BUSU1JWkVfRk9PVFBSSU5UX0NPTVBPU0UgKi8KK21uZ19yZXRjb2RlIG1uZ19kaXNwbGF5X2JncmE1NjUgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX3VpbnQ4cCBwU2NhbmxpbmU7CisgIG1uZ191aW50OHAgcERhdGFsaW5lOworICBtbmdfaW50MzIgIGlYOworICBtbmdfdWludDggIGlGR2E4LCBpQkdhOCwgaUNhODsKKyAgbW5nX3VpbnQxNiBpRkdhMTYsIGlCR2ExNiwgaUNhMTY7CisgIG1uZ191aW50MTYgaUZHcjE2LCBpRkdnMTYsIGlGR2IxNjsKKyAgbW5nX3VpbnQxNiBpQkdyMTYsIGlCR2cxNiwgaUJHYjE2OworICBtbmdfdWludDE2IGlDcjE2LCBpQ2cxNiwgaUNiMTY7CisgIG1uZ191aW50OCAgaUNyOCwgaUNnOCwgaUNiODsKKyAgbW5nX3VpbnQ4ICBpQnBzOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RJU1BMQVlfQkdSQTU2NSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlCcHM9KG1uZ191aW50OCkocERhdGEtPmJJc1JHQkExNiA/IDI6MSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2aWV3YWJsZSByb3cgPyAqLworICBpZiAoKHBEYXRhLT5pUm93ID49IHBEYXRhLT5pU291cmNldCkgJiYgKHBEYXRhLT5pUm93IDwgcERhdGEtPmlTb3VyY2ViKSkKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHJlc3MgZGVzdGluYXRpb24gcm93ICovCisgICAgcFNjYW5saW5lID0gKG1uZ191aW50OHApcERhdGEtPmZHZXRjYW52YXNsaW5lICgoKG1uZ19oYW5kbGUpcERhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlSb3cgKyBwRGF0YS0+aURlc3R0IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pU291cmNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGp1c3QgZGVzdGluYXRpb24gcm93IHN0YXJ0aW5nLXBvaW50ICovCisgICAgcFNjYW5saW5lID0gcFNjYW5saW5lICsgKHBEYXRhLT5pQ29sIDw8IDIpICsgKHBEYXRhLT5pRGVzdGwgKiAzKTsKKyAgICBwRGF0YWxpbmUgPSBwRGF0YS0+cFJHQkFyb3c7ICAgICAgIC8qIGFkZHJlc3Mgc291cmNlIHJvdyAqLworCisgICAgLyogYWRqdXN0IHNvdXJjZSByb3cgc3RhcnRpbmctcG9pbnQgKi8KKyAgICBwRGF0YWxpbmUgPSBwRGF0YWxpbmUgKyAoKHBEYXRhLT5pU291cmNlbCAvIHBEYXRhLT5pQ29saW5jKSA8PCAoaUJwcysxKSk7CisKKyAgICBpZiAocERhdGEtPmJJc09wYXF1ZSkgICAgICAgICAgICAgIC8qIGZvcmdldCBhYm91dCB0cmFuc3BhcmVuY3kgPyAqLworICAgIHsKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pQ29sOyBpWCA8IHBEYXRhLT5pU291cmNlcjsKKyAgICAgICAgICAgICBpWCArPSBwRGF0YS0+aUNvbGluYykKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjYWxlIGRvd24gYnkgZHJvcHBpbmcgdGhlIExTQiAqLworICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKG1uZ191aW50OCkoICggKCoocERhdGFsaW5lKSkmMHhGOCApIHwKKyAgICAgICAgICAgICAgKCAgICgqKHBEYXRhbGluZStpQnBzKT4+NSkgICAgICAgKSApOworICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKG1uZ191aW50OCkoICggKCoocERhdGFsaW5lKzIqaUJwcykpID4+MykgfAorICAgICAgICAgICAgICAoICAgKCoocERhdGFsaW5lK2lCcHMpJjB4RkMpIDw8IDMpICk7CisgICAgICAgICAgKihwU2NhbmxpbmUrMikgPSAqKHBEYXRhbGluZSszKmlCcHMpOworCisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyAqIDMpOworICAgICAgICAgIHBEYXRhbGluZSArPSA0KmlCcHM7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGlmIChwRGF0YS0+YklzUkdCQTE2KSAgICAgICAgICAgIC8qIDE2LWJpdCBpbnB1dCByb3cgPyAqLworICAgICAgeworICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlTb3VyY2VsICsgcERhdGEtPmlDb2w7IGlYIDwgcERhdGEtPmlTb3VyY2VyOworICAgICAgICAgICAgIGlYICs9IHBEYXRhLT5pQ29saW5jKQorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0IGFscGhhIHZhbHVlcyAqLworICAgICAgICAgIGlGR2ExNiA9IG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUrNik7CisgICAgICAgICAgaUJHYTE2ID0gKG1uZ191aW50MTYpKCoocFNjYW5saW5lKzIpKTsKKyAgICAgICAgICBpQkdhMTYgPSAobW5nX3VpbnQxNikoaUJHYTE2IDw8IDgpIHwgaUJHYTE2OworCisgICAgICAgICAgaWYgKGlGR2ExNikgICAgICAgICAgICAgICAgICAvKiBhbnkgb3BhY2l0eSBhdCBhbGwgPyAqLworICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZnVsbHkgb3BhcXVlIG9yIGJhY2tncm91bmQgZnVsbHkgdHJhbnNwYXJlbnQgPyAqLworICAgICAgICAgICAgaWYgKChpRkdhMTYgPT0gMHhGRkZGKSB8fCAoaUJHYTE2ID09IDApKQorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGxhaW4gY29weSBpdCAqLworICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9IChtbmdfdWludDgpKCAoKihwRGF0YWxpbmUpKSYweEY4ICkgIHwgIChtbmdfdWludDgpKCAoKihwRGF0YWxpbmUrMik+PjUgICkgICAgICk7CisgICAgICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKG1uZ191aW50OCkoICgqKHBEYXRhbGluZSs0KSkgPj4zKSAgfCAgKG1uZ191aW50OCkoICgqKHBEYXRhbGluZSsyKSYweEZDKSA8PCAzKTsKKwkJCSAgKihwU2NhbmxpbmUrMikgPSAqKHBEYXRhbGluZSs2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKGlCR2ExNiA9PSAweEZGRkYpICAgIC8qIGJhY2tncm91bmQgZnVsbHkgb3BhcXVlID8gKi8KKyAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCB0aGUgcHJvcGVyIHZhbHVlcyAqLworICAgICAgICAgICAgICAgIGlGR3IxNiA9IG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUgICk7CisgICAgICAgICAgICAgICAgaUZHZzE2ID0gbW5nX2dldF91aW50MTYgKHBEYXRhbGluZSsyKTsKKyAgICAgICAgICAgICAgICBpRkdiMTYgPSBtbmdfZ2V0X3VpbnQxNiAocERhdGFsaW5lKzQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbGUgYmFja2dyb3VuZCB1cCAqLworICAgICAgICAgICAgICAgIGlCR2IxNiA9IChtbmdfdWludDE2KSggKCoocFNjYW5saW5lKzEpKSAmIDB4RjggKTsKKyAgICAgICAgICAgICAgICBpQkdnMTYgPSAobW5nX3VpbnQxNikoICgqKHBTY2FubGluZSsxKSA8PCA1KSAgfCAgKCgoKihwU2NhbmxpbmUgICkpICYgMHhFMCkgPj4zICkgKTsKKyAgICAgICAgICAgICAgICBpQkdyMTYgPSAobW5nX3VpbnQxNikoICgqKHBTY2FubGluZSAgKSkgPDwgMyAgICk7CisKKwkJCQlpQkdyMTYgPSAobW5nX3VpbnQxNikoKG1uZ191aW50MzIpaUJHcjE2IDw8IDgpIHwgaUJHcjE2OworICAgICAgICAgICAgICAgIGlCR2cxNiA9IChtbmdfdWludDE2KSgobW5nX3VpbnQzMilpQkdnMTYgPDwgOCkgfCBpQkdnMTY7CisgICAgICAgICAgICAgICAgaUJHYjE2ID0gKG1uZ191aW50MTYpKChtbmdfdWludDMyKWlCR2IxNiA8PCA4KSB8IGlCR2IxNjsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm93IGNvbXBvc2UgKi8KKyAgICAgICAgICAgICAgICBNTkdfQ09NUE9TRTE2KGlGR3IxNiwgaUZHcjE2LCBpRkdhMTYsIGlCR3IxNik7CisgICAgICAgICAgICAgICAgTU5HX0NPTVBPU0UxNihpRkdnMTYsIGlGR2cxNiwgaUZHYTE2LCBpQkdnMTYpOworICAgICAgICAgICAgICAgIE1OR19DT01QT1NFMTYoaUZHYjE2LCBpRkdiMTYsIGlGR2ExNiwgaUJHYjE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCByZXR1cm4gdGhlIGNvbXBvc2VkIHZhbHVlcyAqLworICAgICAgICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKG1uZ191aW50OCkgKCAoIChpRkdyMTYgPj4gOCkmMHhGOCApICB8ICAoIChtbmdfdWludDgpKGlGR2cxNj4+OCkgPj4gNSkgICAgICApOworICAgICAgICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKG1uZ191aW50OCkgKCAoIChpRkdiMTY+PjExKSAgICAgICApICB8ICAoKChtbmdfdWludDgpKGlGR2cxNj4+OCkmMHhGQykgPDwgMykgKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBzY2FsZSBiYWNrZ3JvdW5kIHVwICovCisgICAgICAgICAgICAgICAgaUJHYjE2ID0gKG1uZ191aW50MTYpKCAoKihwU2NhbmxpbmUrMSkpICYgMHhGOCApOworICAgICAgICAgICAgICAgIGlCR2cxNiA9IChtbmdfdWludDE2KSggKCoocFNjYW5saW5lKzEpIDw8IDUpICB8ICAoKCgqKHBTY2FubGluZSAgKSkgJiAweEUwKSA+PjMgKSApOworICAgICAgICAgICAgICAgIGlCR3IxNiA9IChtbmdfdWludDE2KSggKCoocFNjYW5saW5lICApKSA8PCAzICAgKTsKKworCQkJCWlCR3IxNiA9IChtbmdfdWludDE2KSgobW5nX3VpbnQzMilpQkdyMTYgPDwgOCkgfCBpQkdyMTY7CisgICAgICAgICAgICAgICAgaUJHZzE2ID0gKG1uZ191aW50MTYpKChtbmdfdWludDMyKWlCR2cxNiA8PCA4KSB8IGlCR2cxNjsKKyAgICAgICAgICAgICAgICBpQkdiMTYgPSAobW5nX3VpbnQxNikoKG1uZ191aW50MzIpaUJHYjE2IDw8IDgpIHwgaUJHYjE2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGV0J3MgYmxlbmQgKi8KKyAgICAgICAgICAgICAgICBNTkdfQkxFTkQxNiAobW5nX2dldF91aW50MTYgKHBEYXRhbGluZSAgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2dldF91aW50MTYgKHBEYXRhbGluZSsyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2dldF91aW50MTYgKHBEYXRhbGluZSs0KSwgaUZHYTE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpQkdyMTYsIGlCR2cxNiwgaUJHYjE2LCBpQkdhMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlDcjE2LCAgaUNnMTYsICBpQ2IxNiwgIGlDYTE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCByZXR1cm4gdGhlIGNvbXBvc2VkIHZhbHVlcyAqLworICAgICAgICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKG1uZ191aW50OCkgKCAoIChpQ3IxNiA+PiAgOCkgJiAweEY4ICkgIHwgICggKG1uZ191aW50OCkoaUNnMTYgPj4gOCkgPj4gNSAgKSAgICAgICApOworICAgICAgICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKG1uZ191aW50OCkgKCAoIChpQ2IxNiA+PiAxMSkgICAgICAgICkgIHwgICgoKG1uZ191aW50OCkoaUNnMTYgPj4gOCkgJiAweEZDKSA8PCAzKSApOworICAgICAgICAgICAgICAgICoocFNjYW5saW5lKzIpID0gKG1uZ191aW50OCkoaUNhMTYgPj4gOCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jICogMyk7CisgICAgICAgICAgcERhdGFsaW5lICs9IDg7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pQ29sOyBpWCA8IHBEYXRhLT5pU291cmNlcjsKKyAgICAgICAgICAgICBpWCArPSBwRGF0YS0+aUNvbGluYykKKyAgICAgICAgeworICAgICAgICAgIGlGR2E4ID0gKihwRGF0YWxpbmUrMyk7ICAgICAgLyogZ2V0IGFscGhhIHZhbHVlcyAqLworICAgICAgICAgIGlCR2E4ID0gKihwU2NhbmxpbmUrMik7CisKKyAgICAgICAgICBpZiAoaUZHYTgpICAgICAgICAgICAgICAgICAgIC8qIGFueSBvcGFjaXR5IGF0IGFsbCA/ICovCisgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmdWxseSBvcGFxdWUgb3IgYmFja2dyb3VuZCBmdWxseSB0cmFuc3BhcmVudCA/ICovCisgICAgICAgICAgICBpZiAoKGlGR2E4ID09IDB4RkYpIHx8IChpQkdhOCA9PSAwKSkKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZW4gc2ltcGx5IGNvcHkgdGhlIHZhbHVlcyAqLworICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9IChtbmdfdWludDgpKCAoICAoKihwRGF0YWxpbmUpKSAmMHhGOCApICB8ICAgKCoocERhdGFsaW5lKzEpID4+NSApICAgICAgICk7CisgICAgICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKG1uZ191aW50OCkoICggKCgqKHBEYXRhbGluZSsyKSk+PjMpICkgIHwgICgoKihwRGF0YWxpbmUrMSkmMHhGQykgPDwgMykgKTsKKyAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMikgPSAqKHBEYXRhbGluZSszKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgbW5nX3VpbnQ4IGlSZWQsIGlHcmVlbiwgaUJsdWU7CisKKyAgICAgICAgICAgICAgaVJlZCAgID0gKG1uZ191aW50OCkgKCAgKihwU2NhbmxpbmUrMSkgJiAweEY4ICk7CisgICAgICAgICAgICAgIGlHcmVlbiA9IChtbmdfdWludDgpICggKCoocFNjYW5saW5lKzEpIDw8IDUpICB8ICAoICgoKnBTY2FubGluZSkgJiAweEUwKT4+MyApICk7CisgICAgICAgICAgICAgIGlCbHVlICA9IChtbmdfdWludDgpICggKCpwU2NhbmxpbmUgPDwgMykgKTsKKworICAgICAgICAgICAgICBpZiAoaUJHYTggPT0gMHhGRikgICAgICAgLyogYmFja2dyb3VuZCBmdWxseSBvcGFxdWUgPyAqLworICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogZG8gYWxwaGEgY29tcG9zaW5nICovCisgICAgICAgICAgICAgICAgTU5HX0NPTVBPU0U4IChpUmVkLCAgICpwRGF0YWxpbmUsICAgICBpRkdhOCwgaVJlZCAgICk7CisgICAgICAgICAgICAgICAgTU5HX0NPTVBPU0U4IChpR3JlZW4sICoocERhdGFsaW5lKzEpLCBpRkdhOCwgaUdyZWVuICk7CisgICAgICAgICAgICAgICAgTU5HX0NPTVBPU0U4IChpQmx1ZSwgICoocERhdGFsaW5lKzIpLCBpRkdhOCwgaUJsdWUgICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbHBoYSByZW1haW5zIGZ1bGx5IG9wYXF1ZSAhISEgKi8KKyAgICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9IChtbmdfdWludDgpICggKCBpUmVkICAmIDB4RjggKSAgfCAgIChpR3JlZW4+PjUpICk7CisgICAgICAgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAobW5nX3VpbnQ4KSAoICggaUJsdWUgPj4gIDMgICkgIHwgKCAoaUdyZWVuICYgMHhGQykgPDwgMykgKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3cgYmxlbmQgKi8KKyAgICAgICAgICAgICAgICBNTkdfQkxFTkQ4ICgqcERhdGFsaW5lLCAqKHBEYXRhbGluZSsxKSwgKihwRGF0YWxpbmUrMiksIGlGR2E4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlSZWQgICAgICAsIGlHcmVlbiAgICAgICAgLCBpQmx1ZSAgICAgICAgICwgaUJHYTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUNyOCwgaUNnOCwgaUNiOCwgaUNhOCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgcmV0dXJuIHRoZSBjb21wb3NlZCB2YWx1ZXMgKi8KKworCisgICAgICAgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAobW5nX3VpbnQ4KSAoICggaUNiOCA+PiAgMyAgKSAgfCAoIChpQ2c4ICYgMHhGQykgPDwgMykgKTsKKyAgICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9IChtbmdfdWludDgpICggKCBpQ3I4ICAmIDB4RjggKSAgfCAgIChpQ2c4Pj41KSApOworCQkJCSoocFNjYW5saW5lKzIpID0gKG1uZ191aW50OCkgaUNhODsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIHBTY2FubGluZSArPSAocERhdGEtPmlDb2xpbmMgKjMpOworICAgICAgICAgIHBEYXRhbGluZSArPSA0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgY2hlY2tfdXBkYXRlX3JlZ2lvbiAocERhdGEpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RJU1BMQVlfQkdSQTU2NSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYgLyogTU5HX09QVElNSVpFX0ZPT1RQUklOVF9DT01QT1NFICovCisjZWxzZSAvKiBNTkdfTk9fMTZCSVRfU1VQUE9SVCAqLworbW5nX3JldGNvZGUgbW5nX2Rpc3BsYXlfYmdyYTU2NSAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfdWludDhwIHBTY2FubGluZTsKKyAgbW5nX3VpbnQ4cCBwRGF0YWxpbmU7CisgIG1uZ19pbnQzMiAgaVg7CisgIG1uZ191aW50OCAgaUZHYTgsIGlCR2E4LCBpQ2E4OworICBtbmdfdWludDggIGlDcjgsIGlDZzgsIGlDYjg7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRElTUExBWV9CR1JBNTY1LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2aWV3YWJsZSByb3cgPyAqLworICBpZiAoKHBEYXRhLT5pUm93ID49IHBEYXRhLT5pU291cmNldCkgJiYgKHBEYXRhLT5pUm93IDwgcERhdGEtPmlTb3VyY2ViKSkKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHJlc3MgZGVzdGluYXRpb24gcm93ICovCisgICAgcFNjYW5saW5lID0gKG1uZ191aW50OHApcERhdGEtPmZHZXRjYW52YXNsaW5lICgoKG1uZ19oYW5kbGUpcERhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlSb3cgKyBwRGF0YS0+aURlc3R0IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pU291cmNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGp1c3QgZGVzdGluYXRpb24gcm93IHN0YXJ0aW5nLXBvaW50ICovCisgICAgcFNjYW5saW5lID0gcFNjYW5saW5lICsgKHBEYXRhLT5pQ29sIDw8IDIpICsgKHBEYXRhLT5pRGVzdGwgKiAzKTsKKyAgICBwRGF0YWxpbmUgPSBwRGF0YS0+cFJHQkFyb3c7ICAgICAgIC8qIGFkZHJlc3Mgc291cmNlIHJvdyAqLworCisgICAgICBwRGF0YWxpbmUgPSBwRGF0YWxpbmUgKyAoKHBEYXRhLT5pU291cmNlbCAvIHBEYXRhLT5pQ29saW5jKSA8PCAyKTsKKworICAgIGlmIChwRGF0YS0+YklzT3BhcXVlKSAgICAgICAgICAgICAgLyogZm9yZ2V0IGFib3V0IHRyYW5zcGFyZW5jeSA/ICovCisgICAgeworICAgICAgeworICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlTb3VyY2VsICsgcERhdGEtPmlDb2w7IGlYIDwgcERhdGEtPmlTb3VyY2VyOworICAgICAgICAgICAgIGlYICs9IHBEYXRhLT5pQ29saW5jKQorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29weSB0aGUgdmFsdWVzICovCisgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAobW5nX3VpbnQ4KSggKCAoKihwRGF0YWxpbmUpKSYweEY4ICkgIHwgICggKCoocERhdGFsaW5lKzEpPj41ICAgKSAgICAgKSApOworICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKG1uZ191aW50OCkoICggICoocERhdGFsaW5lKzIpID4+MyApICB8ICAoICgqKHBEYXRhbGluZSsxKSYweEZDICkgPDwgMykgKTsKKyAgICAgICAgICAqKHBTY2FubGluZSsyKSA9ICoocERhdGFsaW5lKzMpOworCisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyAqIDMpOworICAgICAgICAgIHBEYXRhbGluZSArPSA0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsKKyAgICAgICAgICBpRkdhOCA9ICoocERhdGFsaW5lKzMpOyAgICAgIC8qIGdldCBhbHBoYSB2YWx1ZXMgKi8KKyAgICAgICAgICBpQkdhOCA9ICoocFNjYW5saW5lKzIpOworCisgICAgICAgICAgaWYgKGlGR2E4KSAgICAgICAgICAgICAgICAgICAvKiBhbnkgb3BhY2l0eSBhdCBhbGwgPyAqLworICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZnVsbHkgb3BhcXVlIG9yIGJhY2tncm91bmQgZnVsbHkgdHJhbnNwYXJlbnQgPyAqLworICAgICAgICAgICAgaWYgKChpRkdhOCA9PSAweEZGKSB8fCAoaUJHYTggPT0gMCkpCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGVuIHNpbXBseSBjb3B5IHRoZSB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAobW5nX3VpbnQ4KSggKCAgKCoocERhdGFsaW5lKSkgJjB4RjggKSAgfCAgICgqKHBEYXRhbGluZSsxKSA+PjUgKSAgICAgICApOworICAgICAgICAgICAgICAqcFNjYW5saW5lICAgICA9IChtbmdfdWludDgpKCAoICgoKihwRGF0YWxpbmUrMikpPj4zKSApICB8ICAoKCoocERhdGFsaW5lKzEpJjB4RkMpIDw8IDMpICk7CisgICAgICAgICAgICAgICoocFNjYW5saW5lKzIpID0gKihwRGF0YWxpbmUrMyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIG1uZ191aW50OCBpUmVkLCBpR3JlZW4sIGlCbHVlOworCisgICAgICAgICAgICAgIGlSZWQgICA9IChtbmdfdWludDgpICggICoocFNjYW5saW5lKzEpICYgMHhGOCApOworICAgICAgICAgICAgICBpR3JlZW4gPSAobW5nX3VpbnQ4KSAoICgqKHBTY2FubGluZSsxKSA8PCA1KSAgfCAgKCAoKCpwU2NhbmxpbmUpICYgMHhFMCk+PjMgKSApOworICAgICAgICAgICAgICBpQmx1ZSAgPSAobW5nX3VpbnQ4KSAoICgqcFNjYW5saW5lIDw8IDMpICk7CisKKyAgICAgICAgICAgICAgaWYgKGlCR2E4ID09IDB4RkYpICAgICAgIC8qIGJhY2tncm91bmQgZnVsbHkgb3BhcXVlID8gKi8KKyAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvIGFscGhhIGNvbXBvc2luZyAqLworICAgICAgICAgICAgICAgIE1OR19DT01QT1NFOCAoaVJlZCwgICAqcERhdGFsaW5lLCAgICAgaUZHYTgsIGlSZWQgICApOworICAgICAgICAgICAgICAgIE1OR19DT01QT1NFOCAoaUdyZWVuLCAqKHBEYXRhbGluZSsxKSwgaUZHYTgsIGlHcmVlbiApOworICAgICAgICAgICAgICAgIE1OR19DT01QT1NFOCAoaUJsdWUsICAqKHBEYXRhbGluZSsyKSwgaUZHYTgsIGlCbHVlICApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWxwaGEgcmVtYWlucyBmdWxseSBvcGFxdWUgISEhICovCisgICAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAobW5nX3VpbnQ4KSAoICggaVJlZCAgJiAweEY4ICkgIHwgICAoaUdyZWVuPj41KSApOworICAgICAgICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKG1uZ191aW50OCkgKCAoIGlCbHVlID4+ICAzICApICB8ICggKGlHcmVlbiAmIDB4RkMpIDw8IDMpICk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogbm93IGJsZW5kICovCisgICAgICAgICAgICAgICAgTU5HX0JMRU5EOCAoKnBEYXRhbGluZSwgKihwRGF0YWxpbmUrMSksICoocERhdGFsaW5lKzIpLCBpRkdhOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpUmVkICAgICAgLCBpR3JlZW4gICAgICAgICwgaUJsdWUgICAgICAgICAsIGlCR2E4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlDcjgsIGlDZzgsIGlDYjgsIGlDYTgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHJldHVybiB0aGUgY29tcG9zZWQgdmFsdWVzICovCisKKworICAgICAgICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKG1uZ191aW50OCkgKCAoIGlDYjggPj4gIDMgICkgIHwgKCAoaUNnOCAmIDB4RkMpIDw8IDMpICk7CisgICAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAobW5nX3VpbnQ4KSAoICggaUNyOCAgJiAweEY4ICkgIHwgICAoaUNnOD4+NSkgKTsKKwkJCQkqKHBTY2FubGluZSsyKSA9IChtbmdfdWludDgpIGlDYTg7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jICozKTsKKyAgICAgICAgICBwRGF0YWxpbmUgKz0gNDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIGNoZWNrX3VwZGF0ZV9yZWdpb24gKHBEYXRhKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ESVNQTEFZX0JHUkE1NjUsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmIC8qIE1OR19OT18xNkJJVF9TVVBQT1JUICovCisjZW5kaWYgLyogTU5HX1NLSVBDQU5WQVNfQkdSQTU2NSAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0FOVkFTX1JHQkE1NjUKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyNpZm5kZWYgTU5HX09QVElNSVpFX0ZPT1RQUklOVF9DT01QT1NFCittbmdfcmV0Y29kZSBtbmdfZGlzcGxheV9yZ2JhNTY1IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ191aW50OHAgcFNjYW5saW5lOworICBtbmdfdWludDhwIHBEYXRhbGluZTsKKyAgbW5nX2ludDMyICBpWDsKKyAgbW5nX3VpbnQ4ICBpRkdhOCwgaUJHYTgsIGlDYTg7CisgIG1uZ191aW50MTYgaUZHYTE2LCBpQkdhMTYsIGlDYTE2OworICBtbmdfdWludDE2IGlGR3IxNiwgaUZHZzE2LCBpRkdiMTY7CisgIG1uZ191aW50MTYgaUJHcjE2LCBpQkdnMTYsIGlCR2IxNjsKKyAgbW5nX3VpbnQxNiBpQ3IxNiwgaUNnMTYsIGlDYjE2OworICBtbmdfdWludDggIGlDcjgsIGlDZzgsIGlDYjg7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRElTUExBWV9SR0JBNTY1LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2aWV3YWJsZSByb3cgPyAqLworICBpZiAoKHBEYXRhLT5pUm93ID49IHBEYXRhLT5pU291cmNldCkgJiYgKHBEYXRhLT5pUm93IDwgcERhdGEtPmlTb3VyY2ViKSkKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHJlc3MgZGVzdGluYXRpb24gcm93ICovCisgICAgcFNjYW5saW5lID0gKG1uZ191aW50OHApcERhdGEtPmZHZXRjYW52YXNsaW5lICgoKG1uZ19oYW5kbGUpcERhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlSb3cgKyBwRGF0YS0+aURlc3R0IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pU291cmNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGp1c3QgZGVzdGluYXRpb24gcm93IHN0YXJ0aW5nLXBvaW50ICovCisgICAgcFNjYW5saW5lID0gcFNjYW5saW5lICsgKHBEYXRhLT5pQ29sIDw8IDIpICsgKHBEYXRhLT5pRGVzdGwgKiAzKTsKKyAgICBwRGF0YWxpbmUgPSBwRGF0YS0+cFJHQkFyb3c7ICAgICAgIC8qIGFkZHJlc3Mgc291cmNlIHJvdyAqLworCisgICAgaWYgKHBEYXRhLT5iSXNSR0JBMTYpICAgICAgICAgICAgICAvKiBhZGp1c3Qgc291cmNlIHJvdyBzdGFydGluZy1wb2ludCAqLworICAgICAgcERhdGFsaW5lID0gcERhdGFsaW5lICsgKChwRGF0YS0+aVNvdXJjZWwgLyBwRGF0YS0+aUNvbGluYykgPDwgMyk7CisgICAgZWxzZQorICAgICAgcERhdGFsaW5lID0gcERhdGFsaW5lICsgKChwRGF0YS0+aVNvdXJjZWwgLyBwRGF0YS0+aUNvbGluYykgPDwgMik7CisKKyAgICBpZiAocERhdGEtPmJJc09wYXF1ZSkgICAgICAgICAgICAgIC8qIGZvcmdldCBhYm91dCB0cmFuc3BhcmVuY3kgPyAqLworICAgIHsKKyAgICAgIGlmIChwRGF0YS0+YklzUkdCQTE2KSAgICAgICAgICAgIC8qIDE2LWJpdCBpbnB1dCByb3cgPyAqLworICAgICAgeworICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlTb3VyY2VsICsgcERhdGEtPmlDb2w7IGlYIDwgcERhdGEtPmlTb3VyY2VyOworICAgICAgICAgICAgIGlYICs9IHBEYXRhLT5pQ29saW5jKQorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbGUgZG93biBieSBkcm9wcGluZyB0aGUgTFNCICovCisgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAobW5nX3VpbnQ4KSggKCAoKihwRGF0YWxpbmUrNCkpJjB4RjggKSB8ICggICAoKihwRGF0YWxpbmUrMik+PjUpICAgICAgICkgKTsKKyAgICAgICAgICAqcFNjYW5saW5lICAgICA9IChtbmdfdWludDgpKCAoICgqKHBEYXRhbGluZSkpID4+MykgfCAoICAgKCoocERhdGFsaW5lKzIpJjB4RkMpIDw8IDMpICk7CisgICAgICAgICAgKihwU2NhbmxpbmUrMikgPSAqKHBEYXRhbGluZSs2KTsKKworICAgICAgICAgIHBTY2FubGluZSArPSAocERhdGEtPmlDb2xpbmMgKiAzKTsKKyAgICAgICAgICBwRGF0YWxpbmUgKz0gODsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlTb3VyY2VsICsgcERhdGEtPmlDb2w7IGlYIDwgcERhdGEtPmlTb3VyY2VyOworICAgICAgICAgICAgIGlYICs9IHBEYXRhLT5pQ29saW5jKQorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29weSB0aGUgdmFsdWVzICovCisgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAobW5nX3VpbnQ4KSggKCAoKihwRGF0YWxpbmUrMikpJjB4RjggKSAgfCAgKCAoKihwRGF0YWxpbmUrMSk+PjUgICApICAgICApICk7CisgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAobW5nX3VpbnQ4KSggKCAgKihwRGF0YWxpbmUpID4+MyApICB8ICAoICgqKHBEYXRhbGluZSsxKSYweEZDICkgPDwgMykgKTsKKyAgICAgICAgICAqKHBTY2FubGluZSsyKSA9ICoocERhdGFsaW5lKzMpOworCisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyAqIDMpOworICAgICAgICAgIHBEYXRhbGluZSArPSA0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBpZiAocERhdGEtPmJJc1JHQkExNikgICAgICAgICAgICAvKiAxNi1iaXQgaW5wdXQgcm93ID8gKi8KKyAgICAgIHsKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pQ29sOyBpWCA8IHBEYXRhLT5pU291cmNlcjsKKyAgICAgICAgICAgICBpWCArPSBwRGF0YS0+aUNvbGluYykKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCBhbHBoYSB2YWx1ZXMgKi8KKyAgICAgICAgICBpRkdhMTYgPSBtbmdfZ2V0X3VpbnQxNiAocERhdGFsaW5lKzYpOworICAgICAgICAgIGlCR2ExNiA9IChtbmdfdWludDE2KSgqKHBTY2FubGluZSsyKSk7CisgICAgICAgICAgaUJHYTE2ID0gKG1uZ191aW50MTYpKGlCR2ExNiA8PCA4KSB8IGlCR2ExNjsKKworICAgICAgICAgIGlmIChpRkdhMTYpICAgICAgICAgICAgICAgICAgLyogYW55IG9wYWNpdHkgYXQgYWxsID8gKi8KKyAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZ1bGx5IG9wYXF1ZSBvciBiYWNrZ3JvdW5kIGZ1bGx5IHRyYW5zcGFyZW50ID8gKi8KKyAgICAgICAgICAgIGlmICgoaUZHYTE2ID09IDB4RkZGRikgfHwgKGlCR2ExNiA9PSAwKSkKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBsYWluIGNvcHkgaXQgKi8KKyAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAobW5nX3VpbnQ4KSggKCoocERhdGFsaW5lKzQpKSYweEY4ICkgIHwgIChtbmdfdWludDgpKCAoKihwRGF0YWxpbmUrMik+PjUgICkgICAgICk7CisgICAgICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKG1uZ191aW50OCkoICgqKHBEYXRhbGluZSkpID4+MykgIHwgIChtbmdfdWludDgpKCAoKihwRGF0YWxpbmUrMikmMHhGQykgPDwgMyk7CisJCQkgICoocFNjYW5saW5lKzIpID0gKihwRGF0YWxpbmUrNik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChpQkdhMTYgPT0gMHhGRkZGKSAgICAvKiBiYWNrZ3JvdW5kIGZ1bGx5IG9wYXF1ZSA/ICovCisgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgdGhlIHByb3BlciB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgICBpRkdyMTYgPSBtbmdfZ2V0X3VpbnQxNiAocERhdGFsaW5lICApOworICAgICAgICAgICAgICAgIGlGR2cxNiA9IG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUrMik7CisgICAgICAgICAgICAgICAgaUZHYjE2ID0gbW5nX2dldF91aW50MTYgKHBEYXRhbGluZSs0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjYWxlIGJhY2tncm91bmQgdXAgKi8KKyAgICAgICAgICAgICAgICBpQkdyMTYgPSAobW5nX3VpbnQxNikoICgqKHBTY2FubGluZSsxKSkgJiAweEY4ICk7CisgICAgICAgICAgICAgICAgaUJHZzE2ID0gKG1uZ191aW50MTYpKCAoKihwU2NhbmxpbmUrMSkgPDwgNSkgIHwgICgoKCoocFNjYW5saW5lICApKSAmIDB4RTApID4+MyApICk7CisgICAgICAgICAgICAgICAgaUJHYjE2ID0gKG1uZ191aW50MTYpKCAoKihwU2NhbmxpbmUgICkpIDw8IDMgICApOworCisJCQkJaUJHcjE2ID0gKG1uZ191aW50MTYpKChtbmdfdWludDMyKWlCR3IxNiA8PCA4KSB8IGlCR3IxNjsKKyAgICAgICAgICAgICAgICBpQkdnMTYgPSAobW5nX3VpbnQxNikoKG1uZ191aW50MzIpaUJHZzE2IDw8IDgpIHwgaUJHZzE2OworICAgICAgICAgICAgICAgIGlCR2IxNiA9IChtbmdfdWludDE2KSgobW5nX3VpbnQzMilpQkdiMTYgPDwgOCkgfCBpQkdiMTY7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdyBjb21wb3NlICovCisgICAgICAgICAgICAgICAgTU5HX0NPTVBPU0UxNihpRkdyMTYsIGlGR3IxNiwgaUZHYTE2LCBpQkdyMTYpOworICAgICAgICAgICAgICAgIE1OR19DT01QT1NFMTYoaUZHZzE2LCBpRkdnMTYsIGlGR2ExNiwgaUJHZzE2KTsKKyAgICAgICAgICAgICAgICBNTkdfQ09NUE9TRTE2KGlGR2IxNiwgaUZHYjE2LCBpRkdhMTYsIGlCR2IxNik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgcmV0dXJuIHRoZSBjb21wb3NlZCB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9IChtbmdfdWludDgpICggKCAoaUZHYjE2ID4+IDgpJjB4RjggKSAgfCAgKCAobW5nX3VpbnQ4KShpRkdnMTY+PjgpID4+IDUpICAgICAgKTsKKyAgICAgICAgICAgICAgICAqcFNjYW5saW5lICAgICA9IChtbmdfdWludDgpICggKCAoaUZHcjE2Pj4xMSkgICAgICAgKSAgfCAgKCgobW5nX3VpbnQ4KShpRkdnMTY+PjgpJjB4RkMpIDw8IDMpICk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbGUgYmFja2dyb3VuZCB1cCAqLworICAgICAgICAgICAgICAgIGlCR3IxNiA9IChtbmdfdWludDE2KSggKCoocFNjYW5saW5lKzEpKSAmIDB4RjggKTsKKyAgICAgICAgICAgICAgICBpQkdnMTYgPSAobW5nX3VpbnQxNikoICgqKHBTY2FubGluZSsxKSA8PCA1KSAgfCAgKCgoKihwU2NhbmxpbmUgICkpICYgMHhFMCkgPj4zICkgKTsKKyAgICAgICAgICAgICAgICBpQkdiMTYgPSAobW5nX3VpbnQxNikoICgqKHBTY2FubGluZSAgKSkgPDwgMyAgICk7CisKKwkJCQlpQkdyMTYgPSAobW5nX3VpbnQxNikoKG1uZ191aW50MzIpaUJHcjE2IDw8IDgpIHwgaUJHcjE2OworICAgICAgICAgICAgICAgIGlCR2cxNiA9IChtbmdfdWludDE2KSgobW5nX3VpbnQzMilpQkdnMTYgPDwgOCkgfCBpQkdnMTY7CisgICAgICAgICAgICAgICAgaUJHYjE2ID0gKG1uZ191aW50MTYpKChtbmdfdWludDMyKWlCR2IxNiA8PCA4KSB8IGlCR2IxNjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxldCdzIGJsZW5kICovCisgICAgICAgICAgICAgICAgTU5HX0JMRU5EMTYgKG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUgICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUrMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUrNCksIGlGR2ExNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUJHcjE2LCBpQkdnMTYsIGlCR2IxNiwgaUJHYTE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpQ3IxNiwgIGlDZzE2LCAgaUNiMTYsICBpQ2ExNik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgcmV0dXJuIHRoZSBjb21wb3NlZCB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9IChtbmdfdWludDgpICggKCAoaUNiMTYgPj4gIDgpICYgMHhGOCApICB8ICAoIChtbmdfdWludDgpKGlDZzE2ID4+IDgpID4+IDUgICkgICAgICAgKTsKKyAgICAgICAgICAgICAgICAqcFNjYW5saW5lICAgICA9IChtbmdfdWludDgpICggKCAoaUNyMTYgPj4gMTEpICAgICAgICApICB8ICAoKChtbmdfdWludDgpKGlDZzE2ID4+IDgpICYgMHhGQykgPDwgMykgKTsKKyAgICAgICAgICAgICAgICAqKHBTY2FubGluZSsyKSA9IChtbmdfdWludDgpKGlDYTE2ID4+IDgpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyAqIDMpOworICAgICAgICAgIHBEYXRhbGluZSArPSA4OworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsKKyAgICAgICAgICBpRkdhOCA9ICoocERhdGFsaW5lKzMpOyAgICAgIC8qIGdldCBhbHBoYSB2YWx1ZXMgKi8KKyAgICAgICAgICBpQkdhOCA9ICoocFNjYW5saW5lKzIpOworCisgICAgICAgICAgaWYgKGlGR2E4KSAgICAgICAgICAgICAgICAgICAvKiBhbnkgb3BhY2l0eSBhdCBhbGwgPyAqLworICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZnVsbHkgb3BhcXVlIG9yIGJhY2tncm91bmQgZnVsbHkgdHJhbnNwYXJlbnQgPyAqLworICAgICAgICAgICAgaWYgKChpRkdhOCA9PSAweEZGKSB8fCAoaUJHYTggPT0gMCkpCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGVuIHNpbXBseSBjb3B5IHRoZSB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAobW5nX3VpbnQ4KSggKCAgKCoocERhdGFsaW5lKzIpKSAmMHhGOCApICB8ICAgKCoocERhdGFsaW5lKzEpID4+NSApICAgICAgICk7CisgICAgICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKG1uZ191aW50OCkoICggKCgqKHBEYXRhbGluZSkpPj4zKSApICB8ICAoKCoocERhdGFsaW5lKzEpJjB4RkMpIDw8IDMpICk7CisgICAgICAgICAgICAgICoocFNjYW5saW5lKzIpID0gKihwRGF0YWxpbmUrMyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIG1uZ191aW50OCBpUmVkLCBpR3JlZW4sIGlCbHVlOworCisgICAgICAgICAgICAgIGlCbHVlICAgPSAobW5nX3VpbnQ4KSAoICAqKHBTY2FubGluZSsxKSAmIDB4RjggKTsKKyAgICAgICAgICAgICAgaUdyZWVuID0gKG1uZ191aW50OCkgKCAoKihwU2NhbmxpbmUrMSkgPDwgNSkgIHwgICggKCgqcFNjYW5saW5lKSAmIDB4RTApPj4zICkgKTsKKyAgICAgICAgICAgICAgaVJlZCAgPSAobW5nX3VpbnQ4KSAoICgqcFNjYW5saW5lIDw8IDMpICk7CisKKyAgICAgICAgICAgICAgaWYgKGlCR2E4ID09IDB4RkYpICAgICAgIC8qIGJhY2tncm91bmQgZnVsbHkgb3BhcXVlID8gKi8KKyAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvIGFscGhhIGNvbXBvc2luZyAqLworICAgICAgICAgICAgICAgIE1OR19DT01QT1NFOCAoaVJlZCwgICAqcERhdGFsaW5lLCAgICAgaUZHYTgsIGlSZWQgICApOworICAgICAgICAgICAgICAgIE1OR19DT01QT1NFOCAoaUdyZWVuLCAqKHBEYXRhbGluZSsxKSwgaUZHYTgsIGlHcmVlbiApOworICAgICAgICAgICAgICAgIE1OR19DT01QT1NFOCAoaUJsdWUsICAqKHBEYXRhbGluZSsyKSwgaUZHYTgsIGlCbHVlICApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWxwaGEgcmVtYWlucyBmdWxseSBvcGFxdWUgISEhICovCisgICAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAobW5nX3VpbnQ4KSAoICggaUJsdWUgICYgMHhGOCApICB8ICAgKGlHcmVlbj4+NSkgKTsKKyAgICAgICAgICAgICAgICAqcFNjYW5saW5lICAgICA9IChtbmdfdWludDgpICggKCBpUmVkID4+ICAzICApICB8ICggKGlHcmVlbiAmIDB4RkMpIDw8IDMpICk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogbm93IGJsZW5kICovCisgICAgICAgICAgICAgICAgTU5HX0JMRU5EOCAoKnBEYXRhbGluZSwgKihwRGF0YWxpbmUrMSksICoocERhdGFsaW5lKzIpLCBpRkdhOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpUmVkICAgICAgLCBpR3JlZW4gICAgICAgICwgaUJsdWUgICAgICAgICAsIGlCR2E4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlDcjgsIGlDZzgsIGlDYjgsIGlDYTgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHJldHVybiB0aGUgY29tcG9zZWQgdmFsdWVzICovCisKKworICAgICAgICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKG1uZ191aW50OCkgKCAoIGlDcjggPj4gIDMgICkgIHwgKCAoaUNnOCAmIDB4RkMpIDw8IDMpICk7CisgICAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAobW5nX3VpbnQ4KSAoICggaUNiOCAgJiAweEY4ICkgIHwgICAoaUNnOD4+NSkgKTsKKwkJCQkqKHBTY2FubGluZSsyKSA9IChtbmdfdWludDgpIGlDYTg7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jICozKTsKKyAgICAgICAgICBwRGF0YWxpbmUgKz0gNDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIGNoZWNrX3VwZGF0ZV9yZWdpb24gKHBEYXRhKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ESVNQTEFZX1JHQkE1NjUsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2Vsc2UgLyogTU5HX09QVElNSVpFX0ZPT1RQUklOVF9DT01QT1NFICovCittbmdfcmV0Y29kZSBtbmdfZGlzcGxheV9yZ2JhNTY1IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ191aW50OHAgcFNjYW5saW5lOworICBtbmdfdWludDhwIHBEYXRhbGluZTsKKyAgbW5nX2ludDMyICBpWDsKKyAgbW5nX3VpbnQ4ICBpRkdhOCwgaUJHYTgsIGlDYTg7CisgIG1uZ191aW50MTYgaUZHYTE2LCBpQkdhMTYsIGlDYTE2OworICBtbmdfdWludDE2IGlGR3IxNiwgaUZHZzE2LCBpRkdiMTY7CisgIG1uZ191aW50MTYgaUJHcjE2LCBpQkdnMTYsIGlCR2IxNjsKKyAgbW5nX3VpbnQxNiBpQ3IxNiwgaUNnMTYsIGlDYjE2OworICBtbmdfdWludDggIGlDcjgsIGlDZzgsIGlDYjg7CisgIG1uZ191aW50OCAgaUJwczsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ESVNQTEFZX1JHQkE1NjUsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpQnBzPShtbmdfdWludDgpKHBEYXRhLT5iSXNSR0JBMTYgPyAyOjEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdmlld2FibGUgcm93ID8gKi8KKyAgaWYgKChwRGF0YS0+aVJvdyA+PSBwRGF0YS0+aVNvdXJjZXQpICYmIChwRGF0YS0+aVJvdyA8IHBEYXRhLT5pU291cmNlYikpCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGRyZXNzIGRlc3RpbmF0aW9uIHJvdyAqLworICAgIHBTY2FubGluZSA9IChtbmdfdWludDhwKXBEYXRhLT5mR2V0Y2FudmFzbGluZSAoKChtbmdfaGFuZGxlKXBEYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pUm93ICsgcERhdGEtPmlEZXN0dCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aVNvdXJjZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRqdXN0IGRlc3RpbmF0aW9uIHJvdyBzdGFydGluZy1wb2ludCAqLworICAgIHBTY2FubGluZSA9IHBTY2FubGluZSArIChwRGF0YS0+aUNvbCA8PCAyKSArIChwRGF0YS0+aURlc3RsICogMyk7CisgICAgcERhdGFsaW5lID0gcERhdGEtPnBSR0JBcm93OyAgICAgICAvKiBhZGRyZXNzIHNvdXJjZSByb3cgKi8KKworICAgIC8qIGFkanVzdCBzb3VyY2Ugcm93IHN0YXJ0aW5nLXBvaW50ICovCisgICAgcERhdGFsaW5lID0gcERhdGFsaW5lICsgKChwRGF0YS0+aVNvdXJjZWwgLyBwRGF0YS0+aUNvbGluYykgPDwgKGlCcHMrMSkpOworCisgICAgaWYgKHBEYXRhLT5iSXNPcGFxdWUpICAgICAgICAgICAgICAvKiBmb3JnZXQgYWJvdXQgdHJhbnNwYXJlbmN5ID8gKi8KKyAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzY2FsZSBkb3duIGJ5IGRyb3BwaW5nIHRoZSBMU0IgKi8KKyAgICAgICAgICAqKHBTY2FubGluZSsxKSA9IChtbmdfdWludDgpKCAoICgqKHBEYXRhbGluZSsyKmlCcHMpKSYweEY4ICkgfAorICAgICAgICAgICAgICggICAoKihwRGF0YWxpbmUraUJwcyk+PjUpICAgICAgICkgKTsKKyAgICAgICAgICAqcFNjYW5saW5lICAgICA9IChtbmdfdWludDgpKCAoICgqKHBEYXRhbGluZSkpID4+MykgfAorICAgICAgICAgICAgICggICAoKihwRGF0YWxpbmUraUJwcykmMHhGQykgPDwgMykgKTsKKyAgICAgICAgICAqKHBTY2FubGluZSsyKSA9ICoocERhdGFsaW5lKzMqaUJwcyk7CisKKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jICogMyk7CisgICAgICAgICAgcERhdGFsaW5lICs9IDQqaUJwczsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaWYgKHBEYXRhLT5iSXNSR0JBMTYpICAgICAgICAgICAgLyogMTYtYml0IGlucHV0IHJvdyA/ICovCisgICAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgYWxwaGEgdmFsdWVzICovCisgICAgICAgICAgaUZHYTE2ID0gbW5nX2dldF91aW50MTYgKHBEYXRhbGluZSs2KTsKKyAgICAgICAgICBpQkdhMTYgPSAobW5nX3VpbnQxNikoKihwU2NhbmxpbmUrMikpOworICAgICAgICAgIGlCR2ExNiA9IChtbmdfdWludDE2KShpQkdhMTYgPDwgOCkgfCBpQkdhMTY7CisKKyAgICAgICAgICBpZiAoaUZHYTE2KSAgICAgICAgICAgICAgICAgIC8qIGFueSBvcGFjaXR5IGF0IGFsbCA/ICovCisgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmdWxseSBvcGFxdWUgb3IgYmFja2dyb3VuZCBmdWxseSB0cmFuc3BhcmVudCA/ICovCisgICAgICAgICAgICBpZiAoKGlGR2ExNiA9PSAweEZGRkYpIHx8IChpQkdhMTYgPT0gMCkpCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwbGFpbiBjb3B5IGl0ICovCisgICAgICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKG1uZ191aW50OCkoICgqKHBEYXRhbGluZSs0KSkmMHhGOCApICB8ICAobW5nX3VpbnQ4KSggKCoocERhdGFsaW5lKzIpPj41ICApICAgICApOworICAgICAgICAgICAgICAqcFNjYW5saW5lICAgICA9IChtbmdfdWludDgpKCAoKihwRGF0YWxpbmUpKSA+PjMpICB8ICAobW5nX3VpbnQ4KSggKCoocERhdGFsaW5lKzIpJjB4RkMpIDw8IDMpOworCQkJICAqKHBTY2FubGluZSsyKSA9ICoocERhdGFsaW5lKzYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoaUJHYTE2ID09IDB4RkZGRikgICAgLyogYmFja2dyb3VuZCBmdWxseSBvcGFxdWUgPyAqLworICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0IHRoZSBwcm9wZXIgdmFsdWVzICovCisgICAgICAgICAgICAgICAgaUZHcjE2ID0gbW5nX2dldF91aW50MTYgKHBEYXRhbGluZSAgKTsKKyAgICAgICAgICAgICAgICBpRkdnMTYgPSBtbmdfZ2V0X3VpbnQxNiAocERhdGFsaW5lKzIpOworICAgICAgICAgICAgICAgIGlGR2IxNiA9IG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUrNCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzY2FsZSBiYWNrZ3JvdW5kIHVwICovCisgICAgICAgICAgICAgICAgaUJHcjE2ID0gKG1uZ191aW50MTYpKCAoKihwU2NhbmxpbmUrMSkpICYgMHhGOCApOworICAgICAgICAgICAgICAgIGlCR2cxNiA9IChtbmdfdWludDE2KSggKCoocFNjYW5saW5lKzEpIDw8IDUpICB8ICAoKCgqKHBTY2FubGluZSAgKSkgJiAweEUwKSA+PjMgKSApOworICAgICAgICAgICAgICAgIGlCR2IxNiA9IChtbmdfdWludDE2KSggKCoocFNjYW5saW5lICApKSA8PCAzICAgKTsKKworCQkJCWlCR3IxNiA9IChtbmdfdWludDE2KSgobW5nX3VpbnQzMilpQkdyMTYgPDwgOCkgfCBpQkdyMTY7CisgICAgICAgICAgICAgICAgaUJHZzE2ID0gKG1uZ191aW50MTYpKChtbmdfdWludDMyKWlCR2cxNiA8PCA4KSB8IGlCR2cxNjsKKyAgICAgICAgICAgICAgICBpQkdiMTYgPSAobW5nX3VpbnQxNikoKG1uZ191aW50MzIpaUJHYjE2IDw8IDgpIHwgaUJHYjE2OworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3cgY29tcG9zZSAqLworICAgICAgICAgICAgICAgIE1OR19DT01QT1NFMTYoaUZHcjE2LCBpRkdyMTYsIGlGR2ExNiwgaUJHcjE2KTsKKyAgICAgICAgICAgICAgICBNTkdfQ09NUE9TRTE2KGlGR2cxNiwgaUZHZzE2LCBpRkdhMTYsIGlCR2cxNik7CisgICAgICAgICAgICAgICAgTU5HX0NPTVBPU0UxNihpRkdiMTYsIGlGR2IxNiwgaUZHYTE2LCBpQkdiMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHJldHVybiB0aGUgY29tcG9zZWQgdmFsdWVzICovCisgICAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAobW5nX3VpbnQ4KSAoICggKGlGR2IxNiA+PiA4KSYweEY4ICkgIHwgICggKG1uZ191aW50OCkoaUZHZzE2Pj44KSA+PiA1KSAgICAgICk7CisgICAgICAgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAobW5nX3VpbnQ4KSAoICggKGlGR3IxNj4+MTEpICAgICAgICkgIHwgICgoKG1uZ191aW50OCkoaUZHZzE2Pj44KSYweEZDKSA8PCAzKSApOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjYWxlIGJhY2tncm91bmQgdXAgKi8KKyAgICAgICAgICAgICAgICBpQkdyMTYgPSAobW5nX3VpbnQxNikoICgqKHBTY2FubGluZSsxKSkgJiAweEY4ICk7CisgICAgICAgICAgICAgICAgaUJHZzE2ID0gKG1uZ191aW50MTYpKCAoKihwU2NhbmxpbmUrMSkgPDwgNSkgIHwgICgoKCoocFNjYW5saW5lICApKSAmIDB4RTApID4+MyApICk7CisgICAgICAgICAgICAgICAgaUJHYjE2ID0gKG1uZ191aW50MTYpKCAoKihwU2NhbmxpbmUgICkpIDw8IDMgICApOworCisJCQkJaUJHcjE2ID0gKG1uZ191aW50MTYpKChtbmdfdWludDMyKWlCR3IxNiA8PCA4KSB8IGlCR3IxNjsKKyAgICAgICAgICAgICAgICBpQkdnMTYgPSAobW5nX3VpbnQxNikoKG1uZ191aW50MzIpaUJHZzE2IDw8IDgpIHwgaUJHZzE2OworICAgICAgICAgICAgICAgIGlCR2IxNiA9IChtbmdfdWludDE2KSgobW5nX3VpbnQzMilpQkdiMTYgPDwgOCkgfCBpQkdiMTY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZXQncyBibGVuZCAqLworICAgICAgICAgICAgICAgIE1OR19CTEVORDE2IChtbmdfZ2V0X3VpbnQxNiAocERhdGFsaW5lICApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfZ2V0X3VpbnQxNiAocERhdGFsaW5lKzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfZ2V0X3VpbnQxNiAocERhdGFsaW5lKzQpLCBpRkdhMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlCR3IxNiwgaUJHZzE2LCBpQkdiMTYsIGlCR2ExNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUNyMTYsICBpQ2cxNiwgIGlDYjE2LCAgaUNhMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHJldHVybiB0aGUgY29tcG9zZWQgdmFsdWVzICovCisgICAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAobW5nX3VpbnQ4KSAoICggKGlDYjE2ID4+ICA4KSAmIDB4RjggKSAgfCAgKCAobW5nX3VpbnQ4KShpQ2cxNiA+PiA4KSA+PiA1ICApICAgICAgICk7CisgICAgICAgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAobW5nX3VpbnQ4KSAoICggKGlDcjE2ID4+IDExKSAgICAgICAgKSAgfCAgKCgobW5nX3VpbnQ4KShpQ2cxNiA+PiA4KSAmIDB4RkMpIDw8IDMpICk7CisgICAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMikgPSAobW5nX3VpbnQ4KShpQ2ExNiA+PiA4KTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIHBTY2FubGluZSArPSAocERhdGEtPmlDb2xpbmMgKiAzKTsKKyAgICAgICAgICBwRGF0YWxpbmUgKz0gODsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlTb3VyY2VsICsgcERhdGEtPmlDb2w7IGlYIDwgcERhdGEtPmlTb3VyY2VyOworICAgICAgICAgICAgIGlYICs9IHBEYXRhLT5pQ29saW5jKQorICAgICAgICB7CisgICAgICAgICAgaUZHYTggPSAqKHBEYXRhbGluZSszKTsgICAgICAvKiBnZXQgYWxwaGEgdmFsdWVzICovCisgICAgICAgICAgaUJHYTggPSAqKHBTY2FubGluZSsyKTsKKworICAgICAgICAgIGlmIChpRkdhOCkgICAgICAgICAgICAgICAgICAgLyogYW55IG9wYWNpdHkgYXQgYWxsID8gKi8KKyAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZ1bGx5IG9wYXF1ZSBvciBiYWNrZ3JvdW5kIGZ1bGx5IHRyYW5zcGFyZW50ID8gKi8KKyAgICAgICAgICAgIGlmICgoaUZHYTggPT0gMHhGRikgfHwgKGlCR2E4ID09IDApKQorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlbiBzaW1wbHkgY29weSB0aGUgdmFsdWVzICovCisgICAgICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKG1uZ191aW50OCkoICggICgqKHBEYXRhbGluZSsyKSkgJjB4RjggKSAgfCAgICgqKHBEYXRhbGluZSsxKSA+PjUgKSAgICAgICApOworICAgICAgICAgICAgICAqcFNjYW5saW5lICAgICA9IChtbmdfdWludDgpKCAoICgoKihwRGF0YWxpbmUpKT4+MykgKSAgfCAgKCgqKHBEYXRhbGluZSsxKSYweEZDKSA8PCAzKSApOworICAgICAgICAgICAgICAqKHBTY2FubGluZSsyKSA9ICoocERhdGFsaW5lKzMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBtbmdfdWludDggaVJlZCwgaUdyZWVuLCBpQmx1ZTsKKworICAgICAgICAgICAgICBpQmx1ZSAgID0gKG1uZ191aW50OCkgKCAgKihwU2NhbmxpbmUrMSkgJiAweEY4ICk7CisgICAgICAgICAgICAgIGlHcmVlbiA9IChtbmdfdWludDgpICggKCoocFNjYW5saW5lKzEpIDw8IDUpICB8ICAoICgoKnBTY2FubGluZSkgJiAweEUwKT4+MyApICk7CisgICAgICAgICAgICAgIGlSZWQgID0gKG1uZ191aW50OCkgKCAoKnBTY2FubGluZSA8PCAzKSApOworCisgICAgICAgICAgICAgIGlmIChpQkdhOCA9PSAweEZGKSAgICAgICAvKiBiYWNrZ3JvdW5kIGZ1bGx5IG9wYXF1ZSA/ICovCisgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBkbyBhbHBoYSBjb21wb3NpbmcgKi8KKyAgICAgICAgICAgICAgICBNTkdfQ09NUE9TRTggKGlSZWQsICAgKnBEYXRhbGluZSwgICAgIGlGR2E4LCBpUmVkICAgKTsKKyAgICAgICAgICAgICAgICBNTkdfQ09NUE9TRTggKGlHcmVlbiwgKihwRGF0YWxpbmUrMSksIGlGR2E4LCBpR3JlZW4gKTsKKyAgICAgICAgICAgICAgICBNTkdfQ09NUE9TRTggKGlCbHVlLCAgKihwRGF0YWxpbmUrMiksIGlGR2E4LCBpQmx1ZSAgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFscGhhIHJlbWFpbnMgZnVsbHkgb3BhcXVlICEhISAqLworICAgICAgICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKG1uZ191aW50OCkgKCAoIGlCbHVlICAmIDB4RjggKSAgfCAgIChpR3JlZW4+PjUpICk7CisgICAgICAgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAobW5nX3VpbnQ4KSAoICggaVJlZCA+PiAgMyAgKSAgfCAoIChpR3JlZW4gJiAweEZDKSA8PCAzKSApOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdyBibGVuZCAqLworICAgICAgICAgICAgICAgIE1OR19CTEVORDggKCpwRGF0YWxpbmUsICoocERhdGFsaW5lKzEpLCAqKHBEYXRhbGluZSsyKSwgaUZHYTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVJlZCAgICAgICwgaUdyZWVuICAgICAgICAsIGlCbHVlICAgICAgICAgLCBpQkdhOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpQ3I4LCBpQ2c4LCBpQ2I4LCBpQ2E4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCByZXR1cm4gdGhlIGNvbXBvc2VkIHZhbHVlcyAqLworCisKKyAgICAgICAgICAgICAgICAqcFNjYW5saW5lICAgICA9IChtbmdfdWludDgpICggKCBpQ3I4ID4+ICAzICApICB8ICggKGlDZzggJiAweEZDKSA8PCAzKSApOworICAgICAgICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKG1uZ191aW50OCkgKCAoIGlDYjggICYgMHhGOCApICB8ICAgKGlDZzg+PjUpICk7CisJCQkJKihwU2NhbmxpbmUrMikgPSAobW5nX3VpbnQ4KSBpQ2E4OworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyAqMyk7CisgICAgICAgICAgcERhdGFsaW5lICs9IDQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBjaGVja191cGRhdGVfcmVnaW9uIChwRGF0YSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRElTUExBWV9SR0JBNTY1LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZiAvKiBNTkdfT1BUSU1JWkVfRk9PVFBSSU5UX0NPTVBPU0UgKi8KKyNlbHNlIC8qIE1OR19OT18xNkJJVF9TVVBQT1JUICovCittbmdfcmV0Y29kZSBtbmdfZGlzcGxheV9yZ2JhNTY1IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ191aW50OHAgcFNjYW5saW5lOworICBtbmdfdWludDhwIHBEYXRhbGluZTsKKyAgbW5nX2ludDMyICBpWDsKKyAgbW5nX3VpbnQ4ICBpRkdhOCwgaUJHYTgsIGlDYTg7CisgIG1uZ191aW50OCAgaUNyOCwgaUNnOCwgaUNiODsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ESVNQTEFZX1JHQkE1NjUsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZpZXdhYmxlIHJvdyA/ICovCisgIGlmICgocERhdGEtPmlSb3cgPj0gcERhdGEtPmlTb3VyY2V0KSAmJiAocERhdGEtPmlSb3cgPCBwRGF0YS0+aVNvdXJjZWIpKQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkcmVzcyBkZXN0aW5hdGlvbiByb3cgKi8KKyAgICBwU2NhbmxpbmUgPSAobW5nX3VpbnQ4cClwRGF0YS0+ZkdldGNhbnZhc2xpbmUgKCgobW5nX2hhbmRsZSlwRGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aVJvdyArIHBEYXRhLT5pRGVzdHQgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlTb3VyY2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkanVzdCBkZXN0aW5hdGlvbiByb3cgc3RhcnRpbmctcG9pbnQgKi8KKyAgICBwU2NhbmxpbmUgPSBwU2NhbmxpbmUgKyAocERhdGEtPmlDb2wgPDwgMikgKyAocERhdGEtPmlEZXN0bCAqIDMpOworICAgIHBEYXRhbGluZSA9IHBEYXRhLT5wUkdCQXJvdzsgICAgICAgLyogYWRkcmVzcyBzb3VyY2Ugcm93ICovCisKKyAgICAgIHBEYXRhbGluZSA9IHBEYXRhbGluZSArICgocERhdGEtPmlTb3VyY2VsIC8gcERhdGEtPmlDb2xpbmMpIDw8IDIpOworCisgICAgaWYgKHBEYXRhLT5iSXNPcGFxdWUpICAgICAgICAgICAgICAvKiBmb3JnZXQgYWJvdXQgdHJhbnNwYXJlbmN5ID8gKi8KKyAgICB7CisgICAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3B5IHRoZSB2YWx1ZXMgKi8KKyAgICAgICAgICAqKHBTY2FubGluZSsxKSA9IChtbmdfdWludDgpKCAoICgqKHBEYXRhbGluZSsyKSkmMHhGOCApICB8ICAoICgqKHBEYXRhbGluZSsxKT4+NSAgICkgICAgICkgKTsKKyAgICAgICAgICAqcFNjYW5saW5lICAgICA9IChtbmdfdWludDgpKCAoICAqKHBEYXRhbGluZSkgPj4zICkgIHwgICggKCoocERhdGFsaW5lKzEpJjB4RkMgKSA8PCAzKSApOworICAgICAgICAgICoocFNjYW5saW5lKzIpID0gKihwRGF0YWxpbmUrMyk7CisKKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jICogMyk7CisgICAgICAgICAgcERhdGFsaW5lICs9IDQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHsKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pQ29sOyBpWCA8IHBEYXRhLT5pU291cmNlcjsKKyAgICAgICAgICAgICBpWCArPSBwRGF0YS0+aUNvbGluYykKKyAgICAgICAgeworICAgICAgICAgIGlGR2E4ID0gKihwRGF0YWxpbmUrMyk7ICAgICAgLyogZ2V0IGFscGhhIHZhbHVlcyAqLworICAgICAgICAgIGlCR2E4ID0gKihwU2NhbmxpbmUrMik7CisKKyAgICAgICAgICBpZiAoaUZHYTgpICAgICAgICAgICAgICAgICAgIC8qIGFueSBvcGFjaXR5IGF0IGFsbCA/ICovCisgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmdWxseSBvcGFxdWUgb3IgYmFja2dyb3VuZCBmdWxseSB0cmFuc3BhcmVudCA/ICovCisgICAgICAgICAgICBpZiAoKGlGR2E4ID09IDB4RkYpIHx8IChpQkdhOCA9PSAwKSkKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZW4gc2ltcGx5IGNvcHkgdGhlIHZhbHVlcyAqLworICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9IChtbmdfdWludDgpKCAoICAoKihwRGF0YWxpbmUrMikpICYweEY4ICkgIHwgICAoKihwRGF0YWxpbmUrMSkgPj41ICkgICAgICAgKTsKKyAgICAgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAobW5nX3VpbnQ4KSggKCAoKCoocERhdGFsaW5lKSk+PjMpICkgIHwgICgoKihwRGF0YWxpbmUrMSkmMHhGQykgPDwgMykgKTsKKyAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMikgPSAqKHBEYXRhbGluZSszKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgbW5nX3VpbnQ4IGlSZWQsIGlHcmVlbiwgaUJsdWU7CisKKyAgICAgICAgICAgICAgaUJsdWUgICA9IChtbmdfdWludDgpICggICoocFNjYW5saW5lKzEpICYgMHhGOCApOworICAgICAgICAgICAgICBpR3JlZW4gPSAobW5nX3VpbnQ4KSAoICgqKHBTY2FubGluZSsxKSA8PCA1KSAgfCAgKCAoKCpwU2NhbmxpbmUpICYgMHhFMCk+PjMgKSApOworICAgICAgICAgICAgICBpUmVkICA9IChtbmdfdWludDgpICggKCpwU2NhbmxpbmUgPDwgMykgKTsKKworICAgICAgICAgICAgICBpZiAoaUJHYTggPT0gMHhGRikgICAgICAgLyogYmFja2dyb3VuZCBmdWxseSBvcGFxdWUgPyAqLworICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogZG8gYWxwaGEgY29tcG9zaW5nICovCisgICAgICAgICAgICAgICAgTU5HX0NPTVBPU0U4IChpUmVkLCAgICpwRGF0YWxpbmUsICAgICBpRkdhOCwgaVJlZCAgICk7CisgICAgICAgICAgICAgICAgTU5HX0NPTVBPU0U4IChpR3JlZW4sICoocERhdGFsaW5lKzEpLCBpRkdhOCwgaUdyZWVuICk7CisgICAgICAgICAgICAgICAgTU5HX0NPTVBPU0U4IChpQmx1ZSwgICoocERhdGFsaW5lKzIpLCBpRkdhOCwgaUJsdWUgICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbHBoYSByZW1haW5zIGZ1bGx5IG9wYXF1ZSAhISEgKi8KKyAgICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9IChtbmdfdWludDgpICggKCBpQmx1ZSAgJiAweEY4ICkgIHwgICAoaUdyZWVuPj41KSApOworICAgICAgICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKG1uZ191aW50OCkgKCAoIGlSZWQgPj4gIDMgICkgIHwgKCAoaUdyZWVuICYgMHhGQykgPDwgMykgKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3cgYmxlbmQgKi8KKyAgICAgICAgICAgICAgICBNTkdfQkxFTkQ4ICgqcERhdGFsaW5lLCAqKHBEYXRhbGluZSsxKSwgKihwRGF0YWxpbmUrMiksIGlGR2E4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlSZWQgICAgICAsIGlHcmVlbiAgICAgICAgLCBpQmx1ZSAgICAgICAgICwgaUJHYTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUNyOCwgaUNnOCwgaUNiOCwgaUNhOCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgcmV0dXJuIHRoZSBjb21wb3NlZCB2YWx1ZXMgKi8KKworCisgICAgICAgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAobW5nX3VpbnQ4KSAoICggaUNyOCA+PiAgMyAgKSAgfCAoIChpQ2c4ICYgMHhGQykgPDwgMykgKTsKKyAgICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9IChtbmdfdWludDgpICggKCBpQ2I4ICAmIDB4RjggKSAgfCAgIChpQ2c4Pj41KSApOworCQkJCSoocFNjYW5saW5lKzIpID0gKG1uZ191aW50OCkgaUNhODsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIHBTY2FubGluZSArPSAocERhdGEtPmlDb2xpbmMgKjMpOworICAgICAgICAgIHBEYXRhbGluZSArPSA0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgY2hlY2tfdXBkYXRlX3JlZ2lvbiAocERhdGEpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RJU1BMQVlfUkdCQTU2NSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYgLyogTU5HX05PXzE2QklUX1NVUFBPUlQgKi8KKyNlbmRpZiAvKiBNTkdfU0tJUENBTlZBU19SR0JBNTY1ICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDQU5WQVNfQkdSNTY1X0E4CisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisjaWZuZGVmIE1OR19PUFRJTUlaRV9GT09UUFJJTlRfQ09NUE9TRQorbW5nX3JldGNvZGUgbW5nX2Rpc3BsYXlfYmdyNTY1X2E4IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ191aW50OHAgcFNjYW5saW5lOworICBtbmdfdWludDhwIHBBbHBoYWxpbmU7CisgIG1uZ191aW50OHAgcERhdGFsaW5lOworICBtbmdfaW50MzIgIGlYOworICBtbmdfdWludDE2IGlBMTY7CisgIG1uZ191aW50MTYgaUZHcjE2LCBpRkdnMTYsIGlGR2IxNjsKKyAgbW5nX3VpbnQxNiBpQkdyMTYsIGlCR2cxNiwgaUJHYjE2LCBpQkdhMTY7CisgIG1uZ191aW50MTYgaUNyMTYsICBpQ2cxNiwgIGlDYjE2LCAgaUNhMTY7CisgIG1uZ191aW50OCAgaUE4LCBpQkdhOCwgaUNhODsKKyAgbW5nX3VpbnQ4ICBpQ3I4LCBpQ2c4LCBpQ2I4OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RJU1BMQVlfQkdSNTY1X0E4LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2aWV3YWJsZSByb3cgPyAqLworICBpZiAoKHBEYXRhLT5pUm93ID49IHBEYXRhLT5pU291cmNldCkgJiYgKHBEYXRhLT5pUm93IDwgcERhdGEtPmlTb3VyY2ViKSkKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHJlc3MgZGVzdGluYXRpb24gcm93ICovCisgICAgcFNjYW5saW5lID0gKG1uZ191aW50OHApcERhdGEtPmZHZXRjYW52YXNsaW5lICgoKG1uZ19oYW5kbGUpcERhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlSb3cgKyBwRGF0YS0+aURlc3R0IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pU291cmNldCk7CisgICAgcEFscGhhbGluZSA9IChtbmdfdWludDhwKXBEYXRhLT5mR2V0YWxwaGFsaW5lICAoKChtbmdfaGFuZGxlKXBEYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aVJvdyArIHBEYXRhLT5pRGVzdHQgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pU291cmNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGp1c3QgZGVzdGluYXRpb24gcm93CitzdGFydGluZy1wb2ludCAqLworICAgIHBTY2FubGluZSA9IHBTY2FubGluZSArIChwRGF0YS0+aUNvbCAqIDIpICsgKHBEYXRhLT5pRGVzdGwgKiAyKTsKKyAgICBwQWxwaGFsaW5lID0gcEFscGhhbGluZSArIHBEYXRhLT5pQ29sICsgcERhdGEtPmlEZXN0bDsKKyAgICBwRGF0YWxpbmUgPSBwRGF0YS0+cFJHQkFyb3c7ICAgICAgIC8qIGFkZHJlc3Mgc291cmNlIHJvdyAqLworCisgICAgaWYgKHBEYXRhLT5iSXNSR0JBMTYpICAgICAgIC8qIGFkanVzdCBzb3VyY2Ugcm93IHN0YXJ0aW5nLXBvaW50ICovCisgICAgICBwRGF0YWxpbmUgPSBwRGF0YWxpbmUgKyAoKHBEYXRhLT5pU291cmNlbCAvIHBEYXRhLT5pQ29saW5jKSA8PCAzKTsKKyAgICBlbHNlCisgICAgICBwRGF0YWxpbmUgPSBwRGF0YWxpbmUgKyAoKHBEYXRhLT5pU291cmNlbCAvIHBEYXRhLT5pQ29saW5jKSA8PCAyKTsKKworICAgIGlmIChwRGF0YS0+YklzT3BhcXVlKSAgICAgICAgICAgICAgLyogZm9yZ2V0IGFib3V0IHRyYW5zcGFyZW5jeSA/ICovCisgICAgeworICAgICAgaWYgKHBEYXRhLT5iSXNSR0JBMTYpICAgICAgICAgICAgLyogMTYtYml0IGlucHV0IHJvdyA/ICovCisgICAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzY2FsZSBkb3duIGJ5IGRyb3BwaW5nIHRoZSBMU0IgKi8KKyAgICAgICAgICAqKHBTY2FubGluZSsxKSA9IChtbmdfdWludDgpKCAoICgqKHBEYXRhbGluZSkpJjB4RjggKSB8ICgoKihwRGF0YWxpbmUrMik+PjUpICAgICAgICkgKTsKKyAgICAgICAgICAqcFNjYW5saW5lICAgICA9IChtbmdfdWludDgpKCAoICgqKHBEYXRhbGluZSs0KSkgPj4zKSB8ICgoKihwRGF0YWxpbmUrMikmMHhGQykgPDwgMykgKTsKKyAgICAgICAgICAqcEFscGhhbGluZSAgICA9IChtbmdfdWludDgpKCoocERhdGFsaW5lKzYpKTsKKworICAgICAgICAgIHBTY2FubGluZSArPSAocERhdGEtPmlDb2xpbmMgKiAyKTsKKyAgICAgICAgICBwQWxwaGFsaW5lICs9IHBEYXRhLT5pQ29saW5jOworICAgICAgICAgIHBEYXRhbGluZSArPSA4OworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3B5IHRoZSB2YWx1ZXMgKi8KKyAgICAgICAgICAqKHBTY2FubGluZSsxKSA9IChtbmdfdWludDgpKCAoICgqKHBEYXRhbGluZSkpJjB4RjggKSAgfCAgKCgqKHBEYXRhbGluZSsxKT4+NSAgICkgICAgICkgKTsKKyAgICAgICAgICAqcFNjYW5saW5lICAgICA9IChtbmdfdWludDgpKCAoICAqKHBEYXRhbGluZSsyKSA+PjMgKSAgfCAgKCgqKHBEYXRhbGluZSsxKSYweEZDICkgPDwgMykgKTsKKyAgICAgICAgICAqcEFscGhhbGluZSAgICA9IChtbmdfdWludDgpKCoocERhdGFsaW5lKzMpKTsKKworICAgICAgICAgIHBTY2FubGluZSArPSAocERhdGEtPmlDb2xpbmMgKiAyKTsKKyAgICAgICAgICBwQWxwaGFsaW5lICs9IHBEYXRhLT5pQ29saW5jOworICAgICAgICAgIHBEYXRhbGluZSArPSA0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UgLyogTm90IGZ1bGx5IG9wYXF1ZSAqLworICAgIHsKKyAgICAgIGlmIChwRGF0YS0+YklzUkdCQTE2KSAgICAgICAgICAgIC8qIDE2LWJpdCBpbnB1dCByb3cgPyAqLworICAgICAgeworCisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsKKyAgICAgICAgICBpQTE2ID0gbW5nX2dldF91aW50MTYgKHBEYXRhbGluZSs2KTsKKyAgICAgICAgICBpQkdhMTYgPSAobW5nX3VpbnQxNikoKnBBbHBoYWxpbmUpOworICAgICAgICAgIGlCR2ExNiA9IChtbmdfdWludDE2KShpQkdhMTYgPDwgOCkgfCBpQkdhMTY7CisKKyAgICAgICAgICBpZiAoaUExNikgICAgICAgICAgICAgICAgICAgIC8qIGFueSBvcGFjaXR5IGF0IGFsbCA/ICovCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKChpQTE2ID09IDB4RkZGRikgfHwgKGlCR2ExNiA9PSAwKSkgICAgICAgLyogZnVsbHkgb3BhcXVlIG9yIGJhY2tncm91bmQgZnVsbHkgdHJhbnNwYXJlbnQgPyAqLworICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbGUgZG93biBieSBkcm9wcGluZyB0aGUgTFNCICovCisgICAgICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKG1uZ191aW50OCkoICgqKHBEYXRhbGluZSkpJjB4RjggKSAgfCAobW5nX3VpbnQ4KSggKCoocERhdGFsaW5lKzIpPj41ICApICAgICApOworICAgICAgICAgICAgICAqcFNjYW5saW5lICAgICA9IChtbmdfdWludDgpKCAoKihwRGF0YWxpbmUrNCkpID4+MykgIHwgKG1uZ191aW50OCkoICgqKHBEYXRhbGluZSsyKSYweEZDKSA8PCAzKTsKKyAgICAgICAgICAgICAgKnBBbHBoYWxpbmUgICAgPSAqKHBEYXRhbGluZSs2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKGlCR2ExNiA9PSAweEZGRkYpICAgIC8qIGJhY2tncm91bmQgZnVsbHkgb3BhcXVlID8gKi8KKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCB0aGUgcHJvcGVyIHZhbHVlcyAqLworICAgICAgICAgICAgICAgIGlGR3IxNiA9IG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUgICk7CisgICAgICAgICAgICAgICAgaUZHZzE2ID0gbW5nX2dldF91aW50MTYgKHBEYXRhbGluZSsyKTsKKyAgICAgICAgICAgICAgICBpRkdiMTYgPSBtbmdfZ2V0X3VpbnQxNiAocERhdGFsaW5lKzQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzY2FsZSBiYWNrZ3JvdW5kIHVwICovCisKKyAgICAgICAgICAgICAgICBpQkdiMTYgPSAobW5nX3VpbnQxNikoICgqKHBTY2FubGluZSsxKSkgJiAweEY4ICk7CisgICAgICAgICAgICAgICAgaUJHZzE2ID0gKG1uZ191aW50MTYpKCAoKihwU2NhbmxpbmUrMSkgPDwgNSkgIHwgKCgoKihwU2NhbmxpbmUgICkpICYgMHhFMCkgPj4zICkgKTsKKyAgICAgICAgICAgICAgICBpQkdyMTYgPSAobW5nX3VpbnQxNikoICgqKHBTY2FubGluZSAgKSkgPDwgMyAgICk7CisKKyAgICAgICAgICAgICAgICBpQkdyMTYgPSAobW5nX3VpbnQxNikoKG1uZ191aW50MzIpaUJHcjE2IDw8IDgpIHwgaUJHcjE2OworICAgICAgICAgICAgICAgIGlCR2cxNiA9IChtbmdfdWludDE2KSgobW5nX3VpbnQzMilpQkdnMTYgPDwgOCkgfCBpQkdnMTY7CisgICAgICAgICAgICAgICAgaUJHYjE2ID0gKG1uZ191aW50MTYpKChtbmdfdWludDMyKWlCR2IxNiA8PCA4KSB8IGlCR2IxNjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm93IGNvbXBvc2UgKi8KKyAgICAgICAgICAgICAgICBNTkdfQ09NUE9TRTE2KGlGR3IxNiwgaUZHcjE2LCBpQTE2LCBpQkdyMTYpOworICAgICAgICAgICAgICAgIE1OR19DT01QT1NFMTYoaUZHZzE2LCBpRkdnMTYsIGlBMTYsIGlCR2cxNik7CisgICAgICAgICAgICAgICAgTU5HX0NPTVBPU0UxNihpRkdiMTYsIGlGR2IxNiwgaUExNiwgaUJHYjE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHJldHVybiB0aGUgY29tcG9zZWQgdmFsdWVzICovCisgICAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAobW5nX3VpbnQ4KSAoICggKGlGR3IxNiA+PiA4KSYweEY4ICkgIHwgKCAobW5nX3VpbnQ4KShpRkdnMTY+PjgpID4+IDUpICAgICAgICk7CisgICAgICAgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAobW5nX3VpbnQ4KSAoICggKGlGR2IxNj4+MTEpICAgICAgICkgIHwgKCgobW5nX3VpbnQ4KShpRkdnMTY+PjgpJjB4RkMpIDw8IDMpICk7CisgICAgICAgICAgICAgICAgKnBBbHBoYWxpbmUgICAgPSAobW5nX3VpbnQ4KShpQTE2Pj44KTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlIC8qIGJhY2tncm91bmQgaXMgbm90IGZ1bGx5IG9wYXF1ZSAqLworICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjYWxlIGJhY2tncm91bmQgdXAgKi8KKyAgICAgICAgICAgICAgICBpQkdiMTYgPSAobW5nX3VpbnQxNikoICgqKHBTY2FubGluZSsxKSkgJiAweEY4ICk7CisgICAgICAgICAgICAgICAgaUJHZzE2ID0gKG1uZ191aW50MTYpKCAoKihwU2NhbmxpbmUrMSkgPDwgNSkgIHwgKCgoKihwU2NhbmxpbmUgICkpICYgMHhFMCkgPj4zICkgKTsKKyAgICAgICAgICAgICAgICBpQkdyMTYgPSAobW5nX3VpbnQxNikoICgqKHBTY2FubGluZSAgKSkgPDwgMyAgICk7CisKKyAgICAgICAgICAgICAgICBpQkdyMTYgPSAobW5nX3VpbnQxNikoKG1uZ191aW50MzIpaUJHcjE2IDw8IDgpIHwgaUJHcjE2OworICAgICAgICAgICAgICAgIGlCR2cxNiA9IChtbmdfdWludDE2KSgobW5nX3VpbnQzMilpQkdnMTYgPDwgOCkgfCBpQkdnMTY7CisgICAgICAgICAgICAgICAgaUJHYjE2ID0gKG1uZ191aW50MTYpKChtbmdfdWludDMyKWlCR2IxNiA8PCA4KSB8IGlCR2IxNjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxldCdzIGJsZW5kICovCisgICAgICAgICAgICAgICAgTU5HX0JMRU5EMTYgKG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUgICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUrMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUrNCksIGlBMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlCR3IxNiwgaUJHZzE2LCBpQkdiMTYsIGlCR2ExNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUNyMTYsICBpQ2cxNiwgIGlDYjE2LCAgaUNhMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHJldHVybiB0aGUgY29tcG9zZWQgdmFsdWVzICovCisgICAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAobW5nX3VpbnQ4KSAoICggKGlDcjE2ID4+IDgpJjB4RjggKSAgfCAoIChtbmdfdWludDgpKGlDZzE2Pj44KSA+PiA1KSAgICAgICApOworICAgICAgICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKG1uZ191aW50OCkgKCAoIChpQ2IxNj4+MTEpICAgICAgICkgIHwgKCgobW5nX3VpbnQ4KShpQ2cxNj4+OCkmMHhGQykgPDwgMykgKTsKKyAgICAgICAgICAgICAgICAqcEFscGhhbGluZSAgICA9IChtbmdfdWludDgpKGlDYTE2ID4+IDgpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyAqIDIpOworICAgICAgICAgIHBBbHBoYWxpbmUgKz0gcERhdGEtPmlDb2xpbmM7CisgICAgICAgICAgcERhdGFsaW5lICs9IDg7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pQ29sOyBpWCA8IHBEYXRhLT5pU291cmNlcjsKK2lYICs9IHBEYXRhLT5pQ29saW5jKQorICAgICAgICB7CisgICAgICAgICAgaUE4ID0gKihwRGF0YWxpbmUrMyk7ICAgICAgICAvKiBnZXQgYWxwaGEgdmFsdWUgKi8KKyAgICAgICAgICBpQkdhOCA9ICpwQWxwaGFsaW5lOworCisgICAgICAgICAgaWYgKGlBOCkgICAgICAgICAgICAgICAgICAgICAvKiBhbnkgb3BhY2l0eSBhdCBhbGwgPyAqLworICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZnVsbHkgb3BhcXVlIG9yIGJhY2tncm91bmQgZnVsbHkgdHJhbnNwYXJlbnQgPyAqLworICAgICAgICAgICAgaWYgKChpQTggPT0gMHhGRikgfHwgKGlCR2E4ID09IDApKQorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlbiBzaW1wbHkgY29weSB0aGUgdmFsdWVzICovCisgICAgICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKG1uZ191aW50OCkoICggICgqKHBEYXRhbGluZSkpICYweEY4ICkgIHwgKCoocERhdGFsaW5lKzEpID4+NSApICAgICAgICApOworICAgICAgICAgICAgICAqcFNjYW5saW5lICAgICA9IChtbmdfdWludDgpKCAoICgoKihwRGF0YWxpbmUrMikpPj4zKSApICB8ICgoKihwRGF0YWxpbmUrMSkmMHhGQykgPDwgMykgKTsKKyAgICAgICAgICAgICAgKnBBbHBoYWxpbmUgICAgPSAqKHBEYXRhbGluZSszKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKGlCR2E4ID09IDB4RkYpICAgICAgIC8qIGJhY2tncm91bmQgZnVsbHkgb3BhcXVlID8gKi8KKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIGRvIGFscGhhIGNvbXBvc2luZyAqLworICAgICAgICAgICAgICAgIG1uZ191aW50OCBpUmVkLCBpR3JlZW4sIGlCbHVlOworCisgICAgICAgICAgICAgICAgaVJlZCAgID0gKG1uZ191aW50OCkgKCAgKihwU2NhbmxpbmUrMSkgJiAweEY4ICk7CisgICAgICAgICAgICAgICAgaUdyZWVuID0gKG1uZ191aW50OCkgKCAoKihwU2NhbmxpbmUrMSkgPDwgNSkgIHwgICgoKCpwU2NhbmxpbmUpICYgMHhFMCk+PjMgKSApOworICAgICAgICAgICAgICAgIGlCbHVlICA9IChtbmdfdWludDgpICggKCpwU2NhbmxpbmUgPDwgMykgKTsKKworICAgICAgICAgICAgICAgIE1OR19DT01QT1NFOCAoaVJlZCwgICAgICpwRGF0YWxpbmUsICAgICBpQTgsIGlSZWQgICAgKTsKKyAgICAgICAgICAgICAgICBNTkdfQ09NUE9TRTggKGlHcmVlbiwgICAqKHBEYXRhbGluZSsxKSwgaUE4LCBpR3JlZW4gICk7CisgICAgICAgICAgICAgICAgTU5HX0NPTVBPU0U4IChpQmx1ZSwgICAgKihwRGF0YWxpbmUrMiksIGlBOCwgaUJsdWUgICApOworCisgICAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAobW5nX3VpbnQ4KSAoICggaVJlZCAgJiAweEY4ICkgIHwgKGlHcmVlbj4+NSkgKTsKKyAgICAgICAgICAgICAgICAqcFNjYW5saW5lICAgICA9IChtbmdfdWludDgpICggKCBpQmx1ZSA+PiAgMyAgKSAgfCAoKGlHcmVlbiAmIDB4RkMpIDw8IDMpICk7CisgICAgICAgICAgICAgICAgKnBBbHBoYWxpbmUgICAgPSBpQTg7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZSAvKiBiYWNrZ3JvdW5kIG5vdCBmdWxseSBvcGFxdWUgKi8KKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1OR19CTEVORDggKCpwRGF0YWxpbmUsICoocERhdGFsaW5lKzEpLCAqKHBEYXRhbGluZSsyKSwgaUE4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwU2NhbmxpbmUsICoocFNjYW5saW5lKzEpLCAqKHBTY2FubGluZSsyKSwgaUJHYTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUNyOCwgaUNnOCwgaUNiOCwgaUNhOCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgcmV0dXJuIHRoZSBjb21wb3NlZCB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9IChtbmdfdWludDgpICggKCBpQ3I4ICAmIDB4RjggKSAgfCAoaUNnOD4+NSkgKTsKKyAgICAgICAgICAgICAgICAqcFNjYW5saW5lICAgICA9IChtbmdfdWludDgpICggKCBpQ2I4ID4+ICAzICApICB8ICgoaUNnOCAmIDB4RkMpIDw8IDMpICk7CisgICAgICAgICAgICAgICAgKnBBbHBoYWxpbmUgICAgPSBpQ2E4OworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyAqIDIpOworICAgICAgICAgIHBBbHBoYWxpbmUgKz0gcERhdGEtPmlDb2xpbmM7CisgICAgICAgICAgcERhdGFsaW5lICs9IDQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBjaGVja191cGRhdGVfcmVnaW9uIChwRGF0YSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRElTUExBWV9CR1I1NjVfQTgsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2Vsc2UgLyogTU5HX09QVElNSVpFX0ZPT1RQUklOVF9DT01QT1NFICovCittbmdfcmV0Y29kZSBtbmdfZGlzcGxheV9iZ3I1NjVfYTggKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX3VpbnQ4cCBwU2NhbmxpbmU7CisgIG1uZ191aW50OHAgcEFscGhhbGluZTsKKyAgbW5nX3VpbnQ4cCBwRGF0YWxpbmU7CisgIG1uZ19pbnQzMiAgaVg7CisgIG1uZ191aW50MTYgaUExNjsKKyAgbW5nX3VpbnQxNiBpRkdyMTYsIGlGR2cxNiwgaUZHYjE2OworICBtbmdfdWludDE2IGlCR3IxNiwgaUJHZzE2LCBpQkdiMTYsIGlCR2ExNjsKKyAgbW5nX3VpbnQxNiBpQ3IxNiwgIGlDZzE2LCAgaUNiMTYsICBpQ2ExNjsKKyAgbW5nX3VpbnQ4ICBpQTgsIGlCR2E4LCBpQ2E4OworICBtbmdfdWludDggIGlDcjgsIGlDZzgsIGlDYjg7CisgIG1uZ191aW50OCAgaUJwczsKKworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RJU1BMQVlfQkdSNTY1X0E4LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaUJwcz0obW5nX3VpbnQ4KShwRGF0YS0+YklzUkdCQTE2ID8gMjoxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZpZXdhYmxlIHJvdyA/ICovCisgIGlmICgocERhdGEtPmlSb3cgPj0gcERhdGEtPmlTb3VyY2V0KSAmJiAocERhdGEtPmlSb3cgPCBwRGF0YS0+aVNvdXJjZWIpKQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkcmVzcyBkZXN0aW5hdGlvbiByb3cgKi8KKyAgICBwU2NhbmxpbmUgPSAobW5nX3VpbnQ4cClwRGF0YS0+ZkdldGNhbnZhc2xpbmUgKCgobW5nX2hhbmRsZSlwRGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aVJvdyArIHBEYXRhLT5pRGVzdHQgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlTb3VyY2V0KTsKKyAgICBwQWxwaGFsaW5lID0gKG1uZ191aW50OHApcERhdGEtPmZHZXRhbHBoYWxpbmUgICgoKG1uZ19oYW5kbGUpcERhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pUm93ICsgcERhdGEtPmlEZXN0dCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlTb3VyY2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkanVzdCBkZXN0aW5hdGlvbiByb3cKK3N0YXJ0aW5nLXBvaW50ICovCisgICAgcFNjYW5saW5lID0gcFNjYW5saW5lICsgKHBEYXRhLT5pQ29sICogMikgKyAocERhdGEtPmlEZXN0bCAqIDIpOworICAgIHBBbHBoYWxpbmUgPSBwQWxwaGFsaW5lICsgcERhdGEtPmlDb2wgKyBwRGF0YS0+aURlc3RsOworICAgIHBEYXRhbGluZSA9IHBEYXRhLT5wUkdCQXJvdzsgICAgICAgLyogYWRkcmVzcyBzb3VyY2Ugcm93ICovCisKKyAgICAvKiBhZGp1c3Qgc291cmNlIHJvdyBzdGFydGluZy1wb2ludCAqLworICAgIHBEYXRhbGluZSA9IHBEYXRhbGluZSArICgocERhdGEtPmlTb3VyY2VsIC8gcERhdGEtPmlDb2xpbmMpIDw8IChpQnBzKzEpKTsKKworICAgIGlmIChwRGF0YS0+YklzT3BhcXVlKSAgICAgICAgICAgICAgLyogZm9yZ2V0IGFib3V0IHRyYW5zcGFyZW5jeSA/ICovCisgICAgeworICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlTb3VyY2VsICsgcERhdGEtPmlDb2w7IGlYIDwgcERhdGEtPmlTb3VyY2VyOworICAgICAgICAgICAgIGlYICs9IHBEYXRhLT5pQ29saW5jKQorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbGUgZG93biBieSBkcm9wcGluZyB0aGUgTFNCICovCisgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAobW5nX3VpbnQ4KSggKCAoKihwRGF0YWxpbmUpKSYweEY4ICkgfAorICAgICAgICAgICAgICAoKCoocERhdGFsaW5lK2lCcHMpPj41KSAgICAgICApICk7CisgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAobW5nX3VpbnQ4KSggKCAoKihwRGF0YWxpbmUrMippQnBzKSkgPj4zKSB8CisgICAgICAgICAgICAgICgoKihwRGF0YWxpbmUraUJwcykmMHhGQykgPDwgMykgKTsKKyAgICAgICAgICAqcEFscGhhbGluZSAgICA9IChtbmdfdWludDgpKCoocERhdGFsaW5lKzYpKTsKKworICAgICAgICAgIHBTY2FubGluZSArPSAocERhdGEtPmlDb2xpbmMgKiAyKTsKKyAgICAgICAgICBwQWxwaGFsaW5lICs9IHBEYXRhLT5pQ29saW5jOworICAgICAgICAgIHBEYXRhbGluZSArPSA4OworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgLyogTm90IGZ1bGx5IG9wYXF1ZSAqLworICAgIHsKKyAgICAgIGlmIChwRGF0YS0+YklzUkdCQTE2KSAgICAgICAgICAgIC8qIDE2LWJpdCBpbnB1dCByb3cgPyAqLworICAgICAgeworCisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsKKyAgICAgICAgICBpQTE2ID0gbW5nX2dldF91aW50MTYgKHBEYXRhbGluZSs2KTsKKyAgICAgICAgICBpQkdhMTYgPSAobW5nX3VpbnQxNikoKnBBbHBoYWxpbmUpOworICAgICAgICAgIGlCR2ExNiA9IChtbmdfdWludDE2KShpQkdhMTYgPDwgOCkgfCBpQkdhMTY7CisKKyAgICAgICAgICBpZiAoaUExNikgICAgICAgICAgICAgICAgICAgIC8qIGFueSBvcGFjaXR5IGF0IGFsbCA/ICovCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKChpQTE2ID09IDB4RkZGRikgfHwgKGlCR2ExNiA9PSAwKSkgICAgICAgLyogZnVsbHkgb3BhcXVlIG9yIGJhY2tncm91bmQgZnVsbHkgdHJhbnNwYXJlbnQgPyAqLworICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbGUgZG93biBieSBkcm9wcGluZyB0aGUgTFNCICovCisgICAgICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKG1uZ191aW50OCkoICgqKHBEYXRhbGluZSkpJjB4RjggKSAgfCAobW5nX3VpbnQ4KSggKCoocERhdGFsaW5lKzIpPj41ICApICAgICApOworICAgICAgICAgICAgICAqcFNjYW5saW5lICAgICA9IChtbmdfdWludDgpKCAoKihwRGF0YWxpbmUrNCkpID4+MykgIHwgKG1uZ191aW50OCkoICgqKHBEYXRhbGluZSsyKSYweEZDKSA8PCAzKTsKKyAgICAgICAgICAgICAgKnBBbHBoYWxpbmUgICAgPSAqKHBEYXRhbGluZSs2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKGlCR2ExNiA9PSAweEZGRkYpICAgIC8qIGJhY2tncm91bmQgZnVsbHkgb3BhcXVlID8gKi8KKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCB0aGUgcHJvcGVyIHZhbHVlcyAqLworICAgICAgICAgICAgICAgIGlGR3IxNiA9IG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUgICk7CisgICAgICAgICAgICAgICAgaUZHZzE2ID0gbW5nX2dldF91aW50MTYgKHBEYXRhbGluZSsyKTsKKyAgICAgICAgICAgICAgICBpRkdiMTYgPSBtbmdfZ2V0X3VpbnQxNiAocERhdGFsaW5lKzQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzY2FsZSBiYWNrZ3JvdW5kIHVwICovCisKKyAgICAgICAgICAgICAgICBpQkdiMTYgPSAobW5nX3VpbnQxNikoICgqKHBTY2FubGluZSsxKSkgJiAweEY4ICk7CisgICAgICAgICAgICAgICAgaUJHZzE2ID0gKG1uZ191aW50MTYpKCAoKihwU2NhbmxpbmUrMSkgPDwgNSkgIHwgKCgoKihwU2NhbmxpbmUgICkpICYgMHhFMCkgPj4zICkgKTsKKyAgICAgICAgICAgICAgICBpQkdyMTYgPSAobW5nX3VpbnQxNikoICgqKHBTY2FubGluZSAgKSkgPDwgMyAgICk7CisKKyAgICAgICAgICAgICAgICBpQkdyMTYgPSAobW5nX3VpbnQxNikoKG1uZ191aW50MzIpaUJHcjE2IDw8IDgpIHwgaUJHcjE2OworICAgICAgICAgICAgICAgIGlCR2cxNiA9IChtbmdfdWludDE2KSgobW5nX3VpbnQzMilpQkdnMTYgPDwgOCkgfCBpQkdnMTY7CisgICAgICAgICAgICAgICAgaUJHYjE2ID0gKG1uZ191aW50MTYpKChtbmdfdWludDMyKWlCR2IxNiA8PCA4KSB8IGlCR2IxNjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm93IGNvbXBvc2UgKi8KKyAgICAgICAgICAgICAgICBNTkdfQ09NUE9TRTE2KGlGR3IxNiwgaUZHcjE2LCBpQTE2LCBpQkdyMTYpOworICAgICAgICAgICAgICAgIE1OR19DT01QT1NFMTYoaUZHZzE2LCBpRkdnMTYsIGlBMTYsIGlCR2cxNik7CisgICAgICAgICAgICAgICAgTU5HX0NPTVBPU0UxNihpRkdiMTYsIGlGR2IxNiwgaUExNiwgaUJHYjE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHJldHVybiB0aGUgY29tcG9zZWQgdmFsdWVzICovCisgICAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAobW5nX3VpbnQ4KSAoICggKGlGR3IxNiA+PiA4KSYweEY4ICkgIHwgKCAobW5nX3VpbnQ4KShpRkdnMTY+PjgpID4+IDUpICAgICAgICk7CisgICAgICAgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAobW5nX3VpbnQ4KSAoICggKGlGR2IxNj4+MTEpICAgICAgICkgIHwgKCgobW5nX3VpbnQ4KShpRkdnMTY+PjgpJjB4RkMpIDw8IDMpICk7CisgICAgICAgICAgICAgICAgKnBBbHBoYWxpbmUgICAgPSAobW5nX3VpbnQ4KShpQTE2Pj44KTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlIC8qIGJhY2tncm91bmQgaXMgbm90IGZ1bGx5IG9wYXF1ZSAqLworICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjYWxlIGJhY2tncm91bmQgdXAgKi8KKyAgICAgICAgICAgICAgICBpQkdiMTYgPSAobW5nX3VpbnQxNikoICgqKHBTY2FubGluZSsxKSkgJiAweEY4ICk7CisgICAgICAgICAgICAgICAgaUJHZzE2ID0gKG1uZ191aW50MTYpKCAoKihwU2NhbmxpbmUrMSkgPDwgNSkgIHwgKCgoKihwU2NhbmxpbmUgICkpICYgMHhFMCkgPj4zICkgKTsKKyAgICAgICAgICAgICAgICBpQkdyMTYgPSAobW5nX3VpbnQxNikoICgqKHBTY2FubGluZSAgKSkgPDwgMyAgICk7CisKKyAgICAgICAgICAgICAgICBpQkdyMTYgPSAobW5nX3VpbnQxNikoKG1uZ191aW50MzIpaUJHcjE2IDw8IDgpIHwgaUJHcjE2OworICAgICAgICAgICAgICAgIGlCR2cxNiA9IChtbmdfdWludDE2KSgobW5nX3VpbnQzMilpQkdnMTYgPDwgOCkgfCBpQkdnMTY7CisgICAgICAgICAgICAgICAgaUJHYjE2ID0gKG1uZ191aW50MTYpKChtbmdfdWludDMyKWlCR2IxNiA8PCA4KSB8IGlCR2IxNjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxldCdzIGJsZW5kICovCisgICAgICAgICAgICAgICAgTU5HX0JMRU5EMTYgKG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUgICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUrMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19nZXRfdWludDE2IChwRGF0YWxpbmUrNCksIGlBMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlCR3IxNiwgaUJHZzE2LCBpQkdiMTYsIGlCR2ExNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUNyMTYsICBpQ2cxNiwgIGlDYjE2LCAgaUNhMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHJldHVybiB0aGUgY29tcG9zZWQgdmFsdWVzICovCisgICAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAobW5nX3VpbnQ4KSAoICggKGlDcjE2ID4+IDgpJjB4RjggKSAgfCAoIChtbmdfdWludDgpKGlDZzE2Pj44KSA+PiA1KSAgICAgICApOworICAgICAgICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKG1uZ191aW50OCkgKCAoIChpQ2IxNj4+MTEpICAgICAgICkgIHwgKCgobW5nX3VpbnQ4KShpQ2cxNj4+OCkmMHhGQykgPDwgMykgKTsKKyAgICAgICAgICAgICAgICAqcEFscGhhbGluZSAgICA9IChtbmdfdWludDgpKGlDYTE2ID4+IDgpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyAqIDIpOworICAgICAgICAgIHBBbHBoYWxpbmUgKz0gcERhdGEtPmlDb2xpbmM7CisgICAgICAgICAgcERhdGFsaW5lICs9IDg7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pQ29sOyBpWCA8IHBEYXRhLT5pU291cmNlcjsKK2lYICs9IHBEYXRhLT5pQ29saW5jKQorICAgICAgICB7CisgICAgICAgICAgaUE4ID0gKihwRGF0YWxpbmUrMyk7ICAgICAgICAvKiBnZXQgYWxwaGEgdmFsdWUgKi8KKyAgICAgICAgICBpQkdhOCA9ICpwQWxwaGFsaW5lOworCisgICAgICAgICAgaWYgKGlBOCkgICAgICAgICAgICAgICAgICAgICAvKiBhbnkgb3BhY2l0eSBhdCBhbGwgPyAqLworICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZnVsbHkgb3BhcXVlIG9yIGJhY2tncm91bmQgZnVsbHkgdHJhbnNwYXJlbnQgPyAqLworICAgICAgICAgICAgaWYgKChpQTggPT0gMHhGRikgfHwgKGlCR2E4ID09IDApKQorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlbiBzaW1wbHkgY29weSB0aGUgdmFsdWVzICovCisgICAgICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKG1uZ191aW50OCkoICggICgqKHBEYXRhbGluZSkpICYweEY4ICkgIHwgKCoocERhdGFsaW5lKzEpID4+NSApICAgICAgICApOworICAgICAgICAgICAgICAqcFNjYW5saW5lICAgICA9IChtbmdfdWludDgpKCAoICgoKihwRGF0YWxpbmUrMikpPj4zKSApICB8ICgoKihwRGF0YWxpbmUrMSkmMHhGQykgPDwgMykgKTsKKyAgICAgICAgICAgICAgKnBBbHBoYWxpbmUgICAgPSAqKHBEYXRhbGluZSszKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKGlCR2E4ID09IDB4RkYpICAgICAgIC8qIGJhY2tncm91bmQgZnVsbHkgb3BhcXVlID8gKi8KKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIGRvIGFscGhhIGNvbXBvc2luZyAqLworICAgICAgICAgICAgICAgIG1uZ191aW50OCBpUmVkLCBpR3JlZW4sIGlCbHVlOworCisgICAgICAgICAgICAgICAgaVJlZCAgID0gKG1uZ191aW50OCkgKCAgKihwU2NhbmxpbmUrMSkgJiAweEY4ICk7CisgICAgICAgICAgICAgICAgaUdyZWVuID0gKG1uZ191aW50OCkgKCAoKihwU2NhbmxpbmUrMSkgPDwgNSkgIHwgICgoKCpwU2NhbmxpbmUpICYgMHhFMCk+PjMgKSApOworICAgICAgICAgICAgICAgIGlCbHVlICA9IChtbmdfdWludDgpICggKCpwU2NhbmxpbmUgPDwgMykgKTsKKworICAgICAgICAgICAgICAgIE1OR19DT01QT1NFOCAoaVJlZCwgICAgICpwRGF0YWxpbmUsICAgICBpQTgsIGlSZWQgICAgKTsKKyAgICAgICAgICAgICAgICBNTkdfQ09NUE9TRTggKGlHcmVlbiwgICAqKHBEYXRhbGluZSsxKSwgaUE4LCBpR3JlZW4gICk7CisgICAgICAgICAgICAgICAgTU5HX0NPTVBPU0U4IChpQmx1ZSwgICAgKihwRGF0YWxpbmUrMiksIGlBOCwgaUJsdWUgICApOworCisgICAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAobW5nX3VpbnQ4KSAoICggaVJlZCAgJiAweEY4ICkgIHwgKGlHcmVlbj4+NSkgKTsKKyAgICAgICAgICAgICAgICAqcFNjYW5saW5lICAgICA9IChtbmdfdWludDgpICggKCBpQmx1ZSA+PiAgMyAgKSAgfCAoKGlHcmVlbiAmIDB4RkMpIDw8IDMpICk7CisgICAgICAgICAgICAgICAgKnBBbHBoYWxpbmUgICAgPSBpQTg7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZSAvKiBiYWNrZ3JvdW5kIG5vdCBmdWxseSBvcGFxdWUgKi8KKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1OR19CTEVORDggKCpwRGF0YWxpbmUsICoocERhdGFsaW5lKzEpLCAqKHBEYXRhbGluZSsyKSwgaUE4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwU2NhbmxpbmUsICoocFNjYW5saW5lKzEpLCAqKHBTY2FubGluZSsyKSwgaUJHYTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUNyOCwgaUNnOCwgaUNiOCwgaUNhOCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgcmV0dXJuIHRoZSBjb21wb3NlZCB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9IChtbmdfdWludDgpICggKCBpQ3I4ICAmIDB4RjggKSAgfCAoaUNnOD4+NSkgKTsKKyAgICAgICAgICAgICAgICAqcFNjYW5saW5lICAgICA9IChtbmdfdWludDgpICggKCBpQ2I4ID4+ICAzICApICB8ICgoaUNnOCAmIDB4RkMpIDw8IDMpICk7CisgICAgICAgICAgICAgICAgKnBBbHBoYWxpbmUgICAgPSBpQ2E4OworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyAqIDIpOworICAgICAgICAgIHBBbHBoYWxpbmUgKz0gcERhdGEtPmlDb2xpbmM7CisgICAgICAgICAgcERhdGFsaW5lICs9IDQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBjaGVja191cGRhdGVfcmVnaW9uIChwRGF0YSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRElTUExBWV9CR1I1NjVfQTgsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmIC8qIE1OR19PUFRJTUlaRV9GT09UUFJJTlRfQ09NUE9TRSAqLworI2Vsc2UgLyogTU5HX05PXzE2QklUX1NVUFBPUlQgKi8KK21uZ19yZXRjb2RlIG1uZ19kaXNwbGF5X2JncjU2NV9hOCAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfdWludDhwIHBTY2FubGluZTsKKyAgbW5nX3VpbnQ4cCBwQWxwaGFsaW5lOworICBtbmdfdWludDhwIHBEYXRhbGluZTsKKyAgbW5nX2ludDMyICBpWDsKKyAgbW5nX3VpbnQ4ICBpQTgsIGlCR2E4LCBpQ2E4OworICBtbmdfdWludDggIGlDcjgsIGlDZzgsIGlDYjg7CisKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ESVNQTEFZX0JHUjU2NV9BOCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdmlld2FibGUgcm93ID8gKi8KKyAgaWYgKChwRGF0YS0+aVJvdyA+PSBwRGF0YS0+aVNvdXJjZXQpICYmIChwRGF0YS0+aVJvdyA8IHBEYXRhLT5pU291cmNlYikpCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGRyZXNzIGRlc3RpbmF0aW9uIHJvdyAqLworICAgIHBTY2FubGluZSA9IChtbmdfdWludDhwKXBEYXRhLT5mR2V0Y2FudmFzbGluZSAoKChtbmdfaGFuZGxlKXBEYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pUm93ICsgcERhdGEtPmlEZXN0dCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aVNvdXJjZXQpOworICAgIHBBbHBoYWxpbmUgPSAobW5nX3VpbnQ4cClwRGF0YS0+ZkdldGFscGhhbGluZSAgKCgobW5nX2hhbmRsZSlwRGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlSb3cgKyBwRGF0YS0+aURlc3R0IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aVNvdXJjZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRqdXN0IGRlc3RpbmF0aW9uIHJvdworc3RhcnRpbmctcG9pbnQgKi8KKyAgICBwU2NhbmxpbmUgPSBwU2NhbmxpbmUgKyAocERhdGEtPmlDb2wgKiAyKSArIChwRGF0YS0+aURlc3RsICogMik7CisgICAgcEFscGhhbGluZSA9IHBBbHBoYWxpbmUgKyBwRGF0YS0+aUNvbCArIHBEYXRhLT5pRGVzdGw7CisgICAgcERhdGFsaW5lID0gcERhdGEtPnBSR0JBcm93OyAgICAgICAvKiBhZGRyZXNzIHNvdXJjZSByb3cgKi8KKworICAgICAgcERhdGFsaW5lID0gcERhdGFsaW5lICsgKChwRGF0YS0+aVNvdXJjZWwgLyBwRGF0YS0+aUNvbGluYykgPDwgMik7CisKKyAgICBpZiAocERhdGEtPmJJc09wYXF1ZSkgICAgICAgICAgICAgIC8qIGZvcmdldCBhYm91dCB0cmFuc3BhcmVuY3kgPyAqLworICAgIHsKKyAgICAgIHsKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pQ29sOyBpWCA8IHBEYXRhLT5pU291cmNlcjsKKyAgICAgICAgICAgICBpWCArPSBwRGF0YS0+aUNvbGluYykKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvcHkgdGhlIHZhbHVlcyAqLworICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKG1uZ191aW50OCkoICggKCoocERhdGFsaW5lKSkmMHhGOCApICB8ICAoKCoocERhdGFsaW5lKzEpPj41ICAgKSAgICAgKSApOworICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKG1uZ191aW50OCkoICggICoocERhdGFsaW5lKzIpID4+MyApICB8ICAoKCoocERhdGFsaW5lKzEpJjB4RkMgKSA8PCAzKSApOworICAgICAgICAgICpwQWxwaGFsaW5lICAgID0gKG1uZ191aW50OCkoKihwRGF0YWxpbmUrMykpOworCisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyAqIDIpOworICAgICAgICAgIHBBbHBoYWxpbmUgKz0gcERhdGEtPmlDb2xpbmM7CisgICAgICAgICAgcERhdGFsaW5lICs9IDQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSAvKiBOb3QgZnVsbHkgb3BhcXVlICovCisgICAgeworICAgICAgeworICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlTb3VyY2VsICsgcERhdGEtPmlDb2w7IGlYIDwgcERhdGEtPmlTb3VyY2VyOworaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsKKyAgICAgICAgICBpQTggPSAqKHBEYXRhbGluZSszKTsgICAgICAgIC8qIGdldCBhbHBoYSB2YWx1ZSAqLworICAgICAgICAgIGlCR2E4ID0gKnBBbHBoYWxpbmU7CisKKyAgICAgICAgICBpZiAoaUE4KSAgICAgICAgICAgICAgICAgICAgIC8qIGFueSBvcGFjaXR5IGF0IGFsbCA/ICovCisgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmdWxseSBvcGFxdWUgb3IgYmFja2dyb3VuZCBmdWxseSB0cmFuc3BhcmVudCA/ICovCisgICAgICAgICAgICBpZiAoKGlBOCA9PSAweEZGKSB8fCAoaUJHYTggPT0gMCkpCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGVuIHNpbXBseSBjb3B5IHRoZSB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAobW5nX3VpbnQ4KSggKCAgKCoocERhdGFsaW5lKSkgJjB4RjggKSAgfCAoKihwRGF0YWxpbmUrMSkgPj41ICkgICAgICAgICk7CisgICAgICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKG1uZ191aW50OCkoICggKCgqKHBEYXRhbGluZSsyKSk+PjMpICkgIHwgKCgqKHBEYXRhbGluZSsxKSYweEZDKSA8PCAzKSApOworICAgICAgICAgICAgICAqcEFscGhhbGluZSAgICA9ICoocERhdGFsaW5lKzMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoaUJHYTggPT0gMHhGRikgICAgICAgLyogYmFja2dyb3VuZCBmdWxseSBvcGFxdWUgPyAqLworICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogZG8gYWxwaGEgY29tcG9zaW5nICovCisgICAgICAgICAgICAgICAgbW5nX3VpbnQ4IGlSZWQsIGlHcmVlbiwgaUJsdWU7CisKKyAgICAgICAgICAgICAgICBpUmVkICAgPSAobW5nX3VpbnQ4KSAoICAqKHBTY2FubGluZSsxKSAmIDB4RjggKTsKKyAgICAgICAgICAgICAgICBpR3JlZW4gPSAobW5nX3VpbnQ4KSAoICgqKHBTY2FubGluZSsxKSA8PCA1KSAgfCAgKCgoKnBTY2FubGluZSkgJiAweEUwKT4+MyApICk7CisgICAgICAgICAgICAgICAgaUJsdWUgID0gKG1uZ191aW50OCkgKCAoKnBTY2FubGluZSA8PCAzKSApOworCisgICAgICAgICAgICAgICAgTU5HX0NPTVBPU0U4IChpUmVkLCAgICAgKnBEYXRhbGluZSwgICAgIGlBOCwgaVJlZCAgICApOworICAgICAgICAgICAgICAgIE1OR19DT01QT1NFOCAoaUdyZWVuLCAgICoocERhdGFsaW5lKzEpLCBpQTgsIGlHcmVlbiAgKTsKKyAgICAgICAgICAgICAgICBNTkdfQ09NUE9TRTggKGlCbHVlLCAgICAqKHBEYXRhbGluZSsyKSwgaUE4LCBpQmx1ZSAgICk7CisKKyAgICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9IChtbmdfdWludDgpICggKCBpUmVkICAmIDB4RjggKSAgfCAoaUdyZWVuPj41KSApOworICAgICAgICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKG1uZ191aW50OCkgKCAoIGlCbHVlID4+ICAzICApICB8ICgoaUdyZWVuICYgMHhGQykgPDwgMykgKTsKKyAgICAgICAgICAgICAgICAqcEFscGhhbGluZSAgICA9IGlBODsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlIC8qIGJhY2tncm91bmQgbm90IGZ1bGx5IG9wYXF1ZSAqLworICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTU5HX0JMRU5EOCAoKnBEYXRhbGluZSwgKihwRGF0YWxpbmUrMSksICoocERhdGFsaW5lKzIpLCBpQTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBTY2FubGluZSwgKihwU2NhbmxpbmUrMSksICoocFNjYW5saW5lKzIpLCBpQkdhOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpQ3I4LCBpQ2c4LCBpQ2I4LCBpQ2E4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCByZXR1cm4gdGhlIGNvbXBvc2VkIHZhbHVlcyAqLworICAgICAgICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKG1uZ191aW50OCkgKCAoIGlDcjggICYgMHhGOCApICB8IChpQ2c4Pj41KSApOworICAgICAgICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKG1uZ191aW50OCkgKCAoIGlDYjggPj4gIDMgICkgIHwgKChpQ2c4ICYgMHhGQykgPDwgMykgKTsKKyAgICAgICAgICAgICAgICAqcEFscGhhbGluZSAgICA9IGlDYTg7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jICogMik7CisgICAgICAgICAgcEFscGhhbGluZSArPSBwRGF0YS0+aUNvbGluYzsKKyAgICAgICAgICBwRGF0YWxpbmUgKz0gNDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIGNoZWNrX3VwZGF0ZV9yZWdpb24gKHBEYXRhKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ESVNQTEFZX0JHUjU2NV9BOCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYgLyogTU5HX05PXzE2QklUX1NVUFBPUlQgKi8KKyNlbmRpZiAvKiBNTkdfU0tJUENBTlZBU19CR1I1NjVfQTggKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENBTlZBU19SR0I1NTUKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyNpZm5kZWYgTU5HX09QVElNSVpFX0ZPT1RQUklOVF9DT01QT1NFCittbmdfcmV0Y29kZSBtbmdfZGlzcGxheV9yZ2I1NTUgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX3VpbnQ4cCBwU2NhbmxpbmU7CisgIG1uZ191aW50OHAgcERhdGFsaW5lOworICBtbmdfaW50MzIgIGlYOworICBtbmdfdWludDE2IGlBMTY7CisgIG1uZ191aW50MTYgaUZHcjE2LCBpRkdnMTYsIGlGR2IxNjsKKyAgbW5nX3VpbnQxNiBpQkdyMTYsIGlCR2cxNiwgaUJHYjE2OworICBtbmdfdWludDggIGlBODsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ESVNQTEFZX1JHQjU1NSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdmlld2FibGUgcm93ID8gKi8KKyAgaWYgKChwRGF0YS0+aVJvdyA+PSBwRGF0YS0+aVNvdXJjZXQpICYmIChwRGF0YS0+aVJvdyA8IHBEYXRhLT5pU291cmNlYikpCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGRyZXNzIGRlc3RpbmF0aW9uIHJvdyAqLworICAgIHBTY2FubGluZSA9IChtbmdfdWludDhwKXBEYXRhLT5mR2V0Y2FudmFzbGluZSAoKChtbmdfaGFuZGxlKXBEYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pUm93ICsgcERhdGEtPmlEZXN0dCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aVNvdXJjZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRqdXN0IGRlc3RpbmF0aW9uIHJvdyBzdGFydGluZy1wb2ludCAqLworICAgIHBTY2FubGluZSA9IHBTY2FubGluZSArIChwRGF0YS0+aUNvbCAqIDIpICsgKHBEYXRhLT5pRGVzdGwgKiAyKTsKKyAgICBwRGF0YWxpbmUgPSBwRGF0YS0+cFJHQkFyb3c7ICAgICAgIC8qIGFkZHJlc3Mgc291cmNlIHJvdyAqLworCisgICAgaWYgKHBEYXRhLT5iSXNSR0JBMTYpICAgICAgICAgICAgICAvKiBhZGp1c3Qgc291cmNlIHJvdyBzdGFydGluZy1wb2ludCAqLworICAgICAgcERhdGFsaW5lID0gcERhdGFsaW5lICsgKChwRGF0YS0+aVNvdXJjZWwgLyBwRGF0YS0+aUNvbGluYykgPDwgMyk7CisgICAgZWxzZQorICAgICAgcERhdGFsaW5lID0gcERhdGFsaW5lICsgKChwRGF0YS0+aVNvdXJjZWwgLyBwRGF0YS0+aUNvbGluYykgPDwgMik7CisKKyAgICBpZiAocERhdGEtPmJJc09wYXF1ZSkgICAgICAgICAgICAgIC8qIGZvcmdldCBhYm91dCB0cmFuc3BhcmVuY3kgPyAqLworICAgIHsKKyAgICAgIGlmIChwRGF0YS0+YklzUkdCQTE2KSAgICAgICAgICAgIC8qIDE2LWJpdCBpbnB1dCByb3cgPyAqLworICAgICAgeworICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlTb3VyY2VsICsgcERhdGEtPmlDb2w7IGlYIDwgcERhdGEtPmlTb3VyY2VyOworICAgICAgICAgICAgIGlYICs9IHBEYXRhLT5pQ29saW5jKQorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbGUgZG93biBieSBkcm9wcGluZyB0aGUgTFNCICovCisgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAobW5nX3VpbnQ4KSggKCgqKHBEYXRhbGluZSs0KSAmIDB4RjgpID4+IDEgKSB8ICAoKihwRGF0YWxpbmUrMikgICAgICAgICA+PiA2ICkgKTsKKyAgICAgICAgICAqcFNjYW5saW5lICAgICA9IChtbmdfdWludDgpKCAoICoocERhdGFsaW5lICApICAgICAgICAgPj4gMyApIHwgKCgqKHBEYXRhbGluZSsyKSAmIDB4RjgpIDw8IDIgKSApOworCisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyAqIDIpOworICAgICAgICAgIHBEYXRhbGluZSArPSA4OworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3B5IHRoZSB2YWx1ZXMgKi8KKyAgICAgICAgICAqKHBTY2FubGluZSsxKSA9IChtbmdfdWludDgpKCAoKCoocERhdGFsaW5lKzIpICYgMHhGOCkgPj4gMSApIHwgICgqKHBEYXRhbGluZSsxKSAgICAgICAgID4+IDYgKSApOworICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKG1uZ191aW50OCkoICggKihwRGF0YWxpbmUgICkgICAgICAgICA+PiAzICkgfCAoKCoocERhdGFsaW5lKzEpICYgMHhGOCkgPDwgMiApICk7CisKKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jICogMik7CisgICAgICAgICAgcERhdGFsaW5lICs9IDQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGlmIChwRGF0YS0+YklzUkdCQTE2KSAgICAgICAgICAgIC8qIDE2LWJpdCBpbnB1dCByb3cgPyAqLworICAgICAgeworCisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsKKyAgICAgICAgICBpQTE2ID0gbW5nX2dldF91aW50MTYgKHBEYXRhbGluZSs2KTsKKworICAgICAgICAgIGlmIChpQTE2KSAgICAgICAgICAgICAgICAgICAgLyogYW55IG9wYWNpdHkgYXQgYWxsID8gKi8KKyAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoaUExNiA9PSAweEZGRkYpICAgICAgICAvKiBmdWxseSBvcGFxdWUgPyAqLworICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbGUgZG93biBieSBkcm9wcGluZyB0aGUgTFNCICovCisgICAgICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKG1uZ191aW50OCkoICgoKihwRGF0YWxpbmUrNCkgJiAweEY4KSA+PiAxICkgfCAgKCoocERhdGFsaW5lKzIpICAgICAgICAgPj4gNiApICk7CisgICAgICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKG1uZ191aW50OCkoICggKihwRGF0YWxpbmUgICkgICAgICAgICA+PiAzICkgfCAoKCoocERhdGFsaW5lKzIpICYgMHhGOCkgPDwgMiApICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgdGhlIHByb3BlciB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgaUZHcjE2ID0gbW5nX2dldF91aW50MTYgKHBEYXRhbGluZSAgKTsKKyAgICAgICAgICAgICAgaUZHZzE2ID0gbW5nX2dldF91aW50MTYgKHBEYXRhbGluZSsyKTsKKyAgICAgICAgICAgICAgaUZHYjE2ID0gbW5nX2dldF91aW50MTYgKHBEYXRhbGluZSs0KTsKKworCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbGUgYmFja2dyb3VuZCB1cCAqLworICAgICAgICAgICAgICBpQkdyMTYgPSAobW5nX3VpbnQ4KSggKCoocFNjYW5saW5lKzEpICYgMHhGOCkgPDwgMSApOworICAgICAgICAgICAgICBpQkdnMTYgPSAobW5nX3VpbnQ4KSggKCoocFNjYW5saW5lKzEpICAgICAgICAgPDwgNiApICB8ICAoICgoKnBTY2FubGluZSkgJiAweEUwKSA+PiAyICkgKTsKKyAgICAgICAgICAgICAgaUJHYjE2ID0gKG1uZ191aW50OCkoICAqKHBTY2FubGluZSAgKSAgICAgICAgIDw8IDMgKTsKKworICAgICAgICAgICAgICBpQkdyMTYgPSAobW5nX3VpbnQxNikoKG1uZ191aW50MzIpaUJHcjE2IDw8IDgpIHwgaUJHcjE2OworICAgICAgICAgICAgICBpQkdnMTYgPSAobW5nX3VpbnQxNikoKG1uZ191aW50MzIpaUJHZzE2IDw8IDgpIHwgaUJHZzE2OworICAgICAgICAgICAgICBpQkdiMTYgPSAobW5nX3VpbnQxNikoKG1uZ191aW50MzIpaUJHYjE2IDw8IDgpIHwgaUJHYjE2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm93IGNvbXBvc2UgKi8KKyAgICAgICAgICAgICAgTU5HX0NPTVBPU0UxNihpRkdyMTYsIGlGR3IxNiwgaUExNiwgaUJHcjE2KTsKKyAgICAgICAgICAgICAgTU5HX0NPTVBPU0UxNihpRkdnMTYsIGlGR2cxNiwgaUExNiwgaUJHZzE2KTsKKyAgICAgICAgICAgICAgTU5HX0NPTVBPU0UxNihpRkdiMTYsIGlGR2IxNiwgaUExNiwgaUJHYjE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCByZXR1cm4gdGhlIGNvbXBvc2VkIHZhbHVlcyAqLworICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9IChtbmdfdWludDgpKCAobW5nX3VpbnQ4KSgoKGlGR2IxNiA+PiA4KSAmIDB4RjgpID4+IDEgKSB8ICggICAobW5nX3VpbnQ4KShpRkdnMTYgPj4gOCkgICAgICAgICA+PiA2ICkgKTsKKyAgICAgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAobW5nX3VpbnQ4KSggKG1uZ191aW50OCkgKChpRkdyMTYgPj4xMSkgICAgICAgICA+PiAzICkgfCAoICggKG1uZ191aW50OCkoaUZHZzE2ID4+IDgpICYgMHhGOCkgPDwgMiApICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyAqIDIpOworICAgICAgICAgIHBEYXRhbGluZSArPSA4OworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsKKyAgICAgICAgICBpQTggPSAqKHBEYXRhbGluZSszKTsgICAgICAgIC8qIGdldCBhbHBoYSB2YWx1ZSAqLworCisgICAgICAgICAgaWYgKGlBOCkgICAgICAgICAgICAgICAgICAgICAvKiBhbnkgb3BhY2l0eSBhdCBhbGwgPyAqLworICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpQTggPT0gMHhGRikgICAgICAgICAgIC8qIGZ1bGx5IG9wYXF1ZSA/ICovCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGVuIHNpbXBseSBjb3B5IHRoZSB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAobW5nX3VpbnQ4KSggKCgqKHBEYXRhbGluZSsyKSAmIDB4RjgpID4+IDEgKSB8ICAoKihwRGF0YWxpbmUrMSkgICAgICAgICA+PiA2ICkgKTsKKyAgICAgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAobW5nX3VpbnQ4KSggKCAqKHBEYXRhbGluZSAgKSAgICAgICAgID4+IDMgKSB8ICgoKihwRGF0YWxpbmUrMSkgJiAweEY4KSA8PCAyICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvIGFscGhhIGNvbXBvc2luZyAqLworICAgICAgICAgICAgICBtbmdfdWludDggaVJlZCwgaUdyZWVuLCBpQmx1ZTsKKworICAgICAgICAgICAgICBpUmVkICAgPSAobW5nX3VpbnQ4KSggKCoocFNjYW5saW5lKzEpICYgMHhGOCkgPDwgMSApOworICAgICAgICAgICAgICBpR3JlZW4gPSAobW5nX3VpbnQ4KSggKCoocFNjYW5saW5lKzEpICAgICAgICAgPDwgNiApICB8ICAoICgoKnBTY2FubGluZSkgJiAweEUwKSA+PiAyICkgKTsKKyAgICAgICAgICAgICAgaUJsdWUgID0gKG1uZ191aW50OCkoICAqKHBTY2FubGluZSAgKSAgICAgICAgIDw8IDMgKTsKKworICAgICAgICAgICAgICBNTkdfQ09NUE9TRTggKGlSZWQsICAgICAqKHBEYXRhbGluZSsyKSwgaUE4LCBpUmVkICAgICk7CisgICAgICAgICAgICAgIE1OR19DT01QT1NFOCAoaUdyZWVuLCAgICoocERhdGFsaW5lKzEpLCBpQTgsIGlHcmVlbiAgKTsKKyAgICAgICAgICAgICAgTU5HX0NPTVBPU0U4IChpQmx1ZSwgICAgKihwRGF0YWxpbmUrMCksIGlBOCwgaUJsdWUgICApOworCisgICAgICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKG1uZ191aW50OCkoICggKGlSZWQgJiAweEY4KSA+PiAxICkgIHwgICggIGlHcmVlbiAgICAgICAgID4+IDYgKSApOworICAgICAgICAgICAgICAqcFNjYW5saW5lICAgICA9IChtbmdfdWludDgpKCAgIChpQmx1ZSAgICAgICAgPj4gMyApICB8ICAoIChpR3JlZW4gJiAweEY4KSA8PCAyICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jICogMik7CisgICAgICAgICAgcERhdGFsaW5lICs9IDQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBjaGVja191cGRhdGVfcmVnaW9uIChwRGF0YSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRElTUExBWV9SR0I1NTUsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2Vsc2UgLyogTU5HX09QVElNSVpFX0ZPT1RQUklOVF9DT01QT1NFICovCittbmdfcmV0Y29kZSBtbmdfZGlzcGxheV9yZ2I1NTUgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX3VpbnQ4cCBwU2NhbmxpbmU7CisgIG1uZ191aW50OHAgcERhdGFsaW5lOworICBtbmdfaW50MzIgIGlYOworICBtbmdfdWludDE2IGlBMTY7CisgIG1uZ191aW50MTYgaUZHcjE2LCBpRkdnMTYsIGlGR2IxNjsKKyAgbW5nX3VpbnQxNiBpQkdyMTYsIGlCR2cxNiwgaUJHYjE2OworICBtbmdfdWludDggIGlBODsKKyAgbW5nX3VpbnQ4ICBpQnBzOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RJU1BMQVlfUkdCNTU1LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaUJwcz0obW5nX3VpbnQ4KShwRGF0YS0+YklzUkdCQTE2ID8gMjoxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZpZXdhYmxlIHJvdyA/ICovCisgIGlmICgocERhdGEtPmlSb3cgPj0gcERhdGEtPmlTb3VyY2V0KSAmJiAocERhdGEtPmlSb3cgPCBwRGF0YS0+aVNvdXJjZWIpKQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkcmVzcyBkZXN0aW5hdGlvbiByb3cgKi8KKyAgICBwU2NhbmxpbmUgPSAobW5nX3VpbnQ4cClwRGF0YS0+ZkdldGNhbnZhc2xpbmUgKCgobW5nX2hhbmRsZSlwRGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aVJvdyArIHBEYXRhLT5pRGVzdHQgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlTb3VyY2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkanVzdCBkZXN0aW5hdGlvbiByb3cgc3RhcnRpbmctcG9pbnQgKi8KKyAgICBwU2NhbmxpbmUgPSBwU2NhbmxpbmUgKyAocERhdGEtPmlDb2wgKiAyKSArIChwRGF0YS0+aURlc3RsICogMik7CisgICAgcERhdGFsaW5lID0gcERhdGEtPnBSR0JBcm93OyAgICAgICAvKiBhZGRyZXNzIHNvdXJjZSByb3cgKi8KKworICAgIC8qIGFkanVzdCBzb3VyY2Ugcm93IHN0YXJ0aW5nLXBvaW50ICovCisgICAgcERhdGFsaW5lID0gcERhdGFsaW5lICsgKChwRGF0YS0+aVNvdXJjZWwgLyBwRGF0YS0+aUNvbGluYykgPDwgKGlCcHMrMSkpOworCisgICAgaWYgKHBEYXRhLT5iSXNPcGFxdWUpICAgICAgICAgICAgICAvKiBmb3JnZXQgYWJvdXQgdHJhbnNwYXJlbmN5ID8gKi8KKyAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzY2FsZSBkb3duIGJ5IGRyb3BwaW5nIHRoZSBMU0IgKi8KKyAgICAgICAgICAqKHBTY2FubGluZSsxKSA9IChtbmdfdWludDgpKCAoKCoocERhdGFsaW5lKzIqaUJwcykgJiAweEY4KSA+PiAxICkgfCAgKCoocERhdGFsaW5lK2lCcHMpICAgICAgICAgPj4gNiApICk7CisgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAobW5nX3VpbnQ4KSggKCAqKHBEYXRhbGluZSAgICAgICApICAgICAgICAgPj4gMyApIHwgKCgqKHBEYXRhbGluZStpQnBzKSAmIDB4RjgpIDw8IDIgKSApOworCisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyAqIDIpOworICAgICAgICAgIHBEYXRhbGluZSArPSA0KmlCcHM7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGlmIChwRGF0YS0+YklzUkdCQTE2KSAgICAgICAgICAgIC8qIDE2LWJpdCBpbnB1dCByb3cgPyAqLworICAgICAgeworCisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsKKyAgICAgICAgICBpQTE2ID0gbW5nX2dldF91aW50MTYgKHBEYXRhbGluZSs2KTsKKworICAgICAgICAgIGlmIChpQTE2KSAgICAgICAgICAgICAgICAgICAgLyogYW55IG9wYWNpdHkgYXQgYWxsID8gKi8KKyAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoaUExNiA9PSAweEZGRkYpICAgICAgICAvKiBmdWxseSBvcGFxdWUgPyAqLworICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbGUgZG93biBieSBkcm9wcGluZyB0aGUgTFNCICovCisgICAgICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKG1uZ191aW50OCkoICgoKihwRGF0YWxpbmUrNCkgJiAweEY4KSA+PiAxICkgfCAgKCoocERhdGFsaW5lKzIpICAgICAgICAgPj4gNiApICk7CisgICAgICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKG1uZ191aW50OCkoICggKihwRGF0YWxpbmUgICkgICAgICAgICA+PiAzICkgfCAoKCoocERhdGFsaW5lKzIpICYgMHhGOCkgPDwgMiApICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgdGhlIHByb3BlciB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgaUZHcjE2ID0gbW5nX2dldF91aW50MTYgKHBEYXRhbGluZSAgKTsKKyAgICAgICAgICAgICAgaUZHZzE2ID0gbW5nX2dldF91aW50MTYgKHBEYXRhbGluZSsyKTsKKyAgICAgICAgICAgICAgaUZHYjE2ID0gbW5nX2dldF91aW50MTYgKHBEYXRhbGluZSs0KTsKKworCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbGUgYmFja2dyb3VuZCB1cCAqLworICAgICAgICAgICAgICBpQkdyMTYgPSAobW5nX3VpbnQ4KSggKCoocFNjYW5saW5lKzEpICYgMHhGOCkgPDwgMSApOworICAgICAgICAgICAgICBpQkdnMTYgPSAobW5nX3VpbnQ4KSggKCoocFNjYW5saW5lKzEpICAgICAgICAgPDwgNiApICB8ICAoICgoKnBTY2FubGluZSkgJiAweEUwKSA+PiAyICkgKTsKKyAgICAgICAgICAgICAgaUJHYjE2ID0gKG1uZ191aW50OCkoICAqKHBTY2FubGluZSAgKSAgICAgICAgIDw8IDMgKTsKKworICAgICAgICAgICAgICBpQkdyMTYgPSAobW5nX3VpbnQxNikoKG1uZ191aW50MzIpaUJHcjE2IDw8IDgpIHwgaUJHcjE2OworICAgICAgICAgICAgICBpQkdnMTYgPSAobW5nX3VpbnQxNikoKG1uZ191aW50MzIpaUJHZzE2IDw8IDgpIHwgaUJHZzE2OworICAgICAgICAgICAgICBpQkdiMTYgPSAobW5nX3VpbnQxNikoKG1uZ191aW50MzIpaUJHYjE2IDw8IDgpIHwgaUJHYjE2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm93IGNvbXBvc2UgKi8KKyAgICAgICAgICAgICAgTU5HX0NPTVBPU0UxNihpRkdyMTYsIGlGR3IxNiwgaUExNiwgaUJHcjE2KTsKKyAgICAgICAgICAgICAgTU5HX0NPTVBPU0UxNihpRkdnMTYsIGlGR2cxNiwgaUExNiwgaUJHZzE2KTsKKyAgICAgICAgICAgICAgTU5HX0NPTVBPU0UxNihpRkdiMTYsIGlGR2IxNiwgaUExNiwgaUJHYjE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCByZXR1cm4gdGhlIGNvbXBvc2VkIHZhbHVlcyAqLworICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9IChtbmdfdWludDgpKCAobW5nX3VpbnQ4KSgoKGlGR2IxNiA+PiA4KSAmIDB4RjgpID4+IDEgKSB8ICggICAobW5nX3VpbnQ4KShpRkdnMTYgPj4gOCkgICAgICAgICA+PiA2ICkgKTsKKyAgICAgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAobW5nX3VpbnQ4KSggKG1uZ191aW50OCkgKChpRkdyMTYgPj4xMSkgICAgICAgICA+PiAzICkgfCAoICggKG1uZ191aW50OCkoaUZHZzE2ID4+IDgpICYgMHhGOCkgPDwgMiApICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyAqIDIpOworICAgICAgICAgIHBEYXRhbGluZSArPSA4OworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsKKyAgICAgICAgICBpQTggPSAqKHBEYXRhbGluZSszKTsgICAgICAgIC8qIGdldCBhbHBoYSB2YWx1ZSAqLworCisgICAgICAgICAgaWYgKGlBOCkgICAgICAgICAgICAgICAgICAgICAvKiBhbnkgb3BhY2l0eSBhdCBhbGwgPyAqLworICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpQTggPT0gMHhGRikgICAgICAgICAgIC8qIGZ1bGx5IG9wYXF1ZSA/ICovCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGVuIHNpbXBseSBjb3B5IHRoZSB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAobW5nX3VpbnQ4KSggKCgqKHBEYXRhbGluZSsyKSAmIDB4RjgpID4+IDEgKSB8ICAoKihwRGF0YWxpbmUrMSkgICAgICAgICA+PiA2ICkgKTsKKyAgICAgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAobW5nX3VpbnQ4KSggKCAqKHBEYXRhbGluZSAgKSAgICAgICAgID4+IDMgKSB8ICgoKihwRGF0YWxpbmUrMSkgJiAweEY4KSA8PCAyICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvIGFscGhhIGNvbXBvc2luZyAqLworICAgICAgICAgICAgICBtbmdfdWludDggaVJlZCwgaUdyZWVuLCBpQmx1ZTsKKworICAgICAgICAgICAgICBpUmVkICAgPSAobW5nX3VpbnQ4KSggKCoocFNjYW5saW5lKzEpICYgMHhGOCkgPDwgMSApOworICAgICAgICAgICAgICBpR3JlZW4gPSAobW5nX3VpbnQ4KSggKCoocFNjYW5saW5lKzEpICAgICAgICAgPDwgNiApICB8ICAoICgoKnBTY2FubGluZSkgJiAweEUwKSA+PiAyICkgKTsKKyAgICAgICAgICAgICAgaUJsdWUgID0gKG1uZ191aW50OCkoICAqKHBTY2FubGluZSAgKSAgICAgICAgIDw8IDMgKTsKKworICAgICAgICAgICAgICBNTkdfQ09NUE9TRTggKGlSZWQsICAgICAqKHBEYXRhbGluZSsyKSwgaUE4LCBpUmVkICAgICk7CisgICAgICAgICAgICAgIE1OR19DT01QT1NFOCAoaUdyZWVuLCAgICoocERhdGFsaW5lKzEpLCBpQTgsIGlHcmVlbiAgKTsKKyAgICAgICAgICAgICAgTU5HX0NPTVBPU0U4IChpQmx1ZSwgICAgKihwRGF0YWxpbmUrMCksIGlBOCwgaUJsdWUgICApOworCisgICAgICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKG1uZ191aW50OCkoICggKGlSZWQgJiAweEY4KSA+PiAxICkgIHwgICggIGlHcmVlbiAgICAgICAgID4+IDYgKSApOworICAgICAgICAgICAgICAqcFNjYW5saW5lICAgICA9IChtbmdfdWludDgpKCAgIChpQmx1ZSAgICAgICAgPj4gMyApICB8ICAoIChpR3JlZW4gJiAweEY4KSA8PCAyICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jICogMik7CisgICAgICAgICAgcERhdGFsaW5lICs9IDQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBjaGVja191cGRhdGVfcmVnaW9uIChwRGF0YSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRElTUExBWV9SR0I1NTUsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmIC8qIE1OR19PUFRJTUlaRV9GT09UUFJJTlRfQ09NUE9TRSAqLworI2Vsc2UgLyogTU5HX05PXzE2QklUX1NVUFBPUlQgKi8KK21uZ19yZXRjb2RlIG1uZ19kaXNwbGF5X3JnYjU1NSAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfdWludDhwIHBTY2FubGluZTsKKyAgbW5nX3VpbnQ4cCBwRGF0YWxpbmU7CisgIG1uZ19pbnQzMiAgaVg7CisgIG1uZ191aW50OCAgaUE4OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RJU1BMQVlfUkdCNTU1LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2aWV3YWJsZSByb3cgPyAqLworICBpZiAoKHBEYXRhLT5pUm93ID49IHBEYXRhLT5pU291cmNldCkgJiYgKHBEYXRhLT5pUm93IDwgcERhdGEtPmlTb3VyY2ViKSkKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHJlc3MgZGVzdGluYXRpb24gcm93ICovCisgICAgcFNjYW5saW5lID0gKG1uZ191aW50OHApcERhdGEtPmZHZXRjYW52YXNsaW5lICgoKG1uZ19oYW5kbGUpcERhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlSb3cgKyBwRGF0YS0+aURlc3R0IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pU291cmNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGp1c3QgZGVzdGluYXRpb24gcm93IHN0YXJ0aW5nLXBvaW50ICovCisgICAgcFNjYW5saW5lID0gcFNjYW5saW5lICsgKHBEYXRhLT5pQ29sICogMikgKyAocERhdGEtPmlEZXN0bCAqIDIpOworICAgIHBEYXRhbGluZSA9IHBEYXRhLT5wUkdCQXJvdzsgICAgICAgLyogYWRkcmVzcyBzb3VyY2Ugcm93ICovCisKKyAgICAgIHBEYXRhbGluZSA9IHBEYXRhbGluZSArICgocERhdGEtPmlTb3VyY2VsIC8gcERhdGEtPmlDb2xpbmMpIDw8IDIpOworCisgICAgaWYgKHBEYXRhLT5iSXNPcGFxdWUpICAgICAgICAgICAgICAvKiBmb3JnZXQgYWJvdXQgdHJhbnNwYXJlbmN5ID8gKi8KKyAgICB7CisgICAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3B5IHRoZSB2YWx1ZXMgKi8KKyAgICAgICAgICAqKHBTY2FubGluZSsxKSA9IChtbmdfdWludDgpKCAoKCoocERhdGFsaW5lKzIpICYgMHhGOCkgPj4gMSApIHwgICgqKHBEYXRhbGluZSsxKSAgICAgICAgID4+IDYgKSApOworICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKG1uZ191aW50OCkoICggKihwRGF0YWxpbmUgICkgICAgICAgICA+PiAzICkgfCAoKCoocERhdGFsaW5lKzEpICYgMHhGOCkgPDwgMiApICk7CisKKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jICogMik7CisgICAgICAgICAgcERhdGFsaW5lICs9IDQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHsKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pQ29sOyBpWCA8IHBEYXRhLT5pU291cmNlcjsKKyAgICAgICAgICAgICBpWCArPSBwRGF0YS0+aUNvbGluYykKKyAgICAgICAgeworICAgICAgICAgIGlBOCA9ICoocERhdGFsaW5lKzMpOyAgICAgICAgLyogZ2V0IGFscGhhIHZhbHVlICovCisKKyAgICAgICAgICBpZiAoaUE4KSAgICAgICAgICAgICAgICAgICAgIC8qIGFueSBvcGFjaXR5IGF0IGFsbCA/ICovCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKGlBOCA9PSAweEZGKSAgICAgICAgICAgLyogZnVsbHkgb3BhcXVlID8gKi8KKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZW4gc2ltcGx5IGNvcHkgdGhlIHZhbHVlcyAqLworICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9IChtbmdfdWludDgpKCAoKCoocERhdGFsaW5lKzIpICYgMHhGOCkgPj4gMSApIHwgICgqKHBEYXRhbGluZSsxKSAgICAgICAgID4+IDYgKSApOworICAgICAgICAgICAgICAqcFNjYW5saW5lICAgICA9IChtbmdfdWludDgpKCAoICoocERhdGFsaW5lICApICAgICAgICAgPj4gMyApIHwgKCgqKHBEYXRhbGluZSsxKSAmIDB4RjgpIDw8IDIgKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZG8gYWxwaGEgY29tcG9zaW5nICovCisgICAgICAgICAgICAgIG1uZ191aW50OCBpUmVkLCBpR3JlZW4sIGlCbHVlOworCisgICAgICAgICAgICAgIGlSZWQgICA9IChtbmdfdWludDgpKCAoKihwU2NhbmxpbmUrMSkgJiAweEY4KSA8PCAxICk7CisgICAgICAgICAgICAgIGlHcmVlbiA9IChtbmdfdWludDgpKCAoKihwU2NhbmxpbmUrMSkgICAgICAgICA8PCA2ICkgIHwgICggKCgqcFNjYW5saW5lKSAmIDB4RTApID4+IDIgKSApOworICAgICAgICAgICAgICBpQmx1ZSAgPSAobW5nX3VpbnQ4KSggICoocFNjYW5saW5lICApICAgICAgICAgPDwgMyApOworCisgICAgICAgICAgICAgIE1OR19DT01QT1NFOCAoaVJlZCwgICAgICoocERhdGFsaW5lKzIpLCBpQTgsIGlSZWQgICAgKTsKKyAgICAgICAgICAgICAgTU5HX0NPTVBPU0U4IChpR3JlZW4sICAgKihwRGF0YWxpbmUrMSksIGlBOCwgaUdyZWVuICApOworICAgICAgICAgICAgICBNTkdfQ09NUE9TRTggKGlCbHVlLCAgICAqKHBEYXRhbGluZSswKSwgaUE4LCBpQmx1ZSAgICk7CisKKyAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAobW5nX3VpbnQ4KSggKCAoaVJlZCAmIDB4RjgpID4+IDEgKSAgfCAgKCAgaUdyZWVuICAgICAgICAgPj4gNiApICk7CisgICAgICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKG1uZ191aW50OCkoICAgKGlCbHVlICAgICAgICA+PiAzICkgIHwgICggKGlHcmVlbiAmIDB4RjgpIDw8IDIgKSApOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIHBTY2FubGluZSArPSAocERhdGEtPmlDb2xpbmMgKiAyKTsKKyAgICAgICAgICBwRGF0YWxpbmUgKz0gNDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIGNoZWNrX3VwZGF0ZV9yZWdpb24gKHBEYXRhKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ESVNQTEFZX1JHQjU1NSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYgLyogTU5HX05PXzE2QklUX1NVUFBPUlQgKi8KKyNlbmRpZiAvKiBNTkdfU0tJUENBTlZBU19SR0I1NTUgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENBTlZBU19CR1I1NTUKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyNpZm5kZWYgTU5HX09QVElNSVpFX0ZPT1RQUklOVF9DT01QT1NFCittbmdfcmV0Y29kZSBtbmdfZGlzcGxheV9iZ3I1NTUgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX3VpbnQ4cCBwU2NhbmxpbmU7CisgIG1uZ191aW50OHAgcERhdGFsaW5lOworICBtbmdfaW50MzIgIGlYOworICBtbmdfdWludDE2IGlBMTY7CisgIG1uZ191aW50MTYgaUZHcjE2LCBpRkdnMTYsIGlGR2IxNjsKKyAgbW5nX3VpbnQxNiBpQkdyMTYsIGlCR2cxNiwgaUJHYjE2OworICBtbmdfdWludDggIGlBODsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ESVNQTEFZX0JHUjU1NSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdmlld2FibGUgcm93ID8gKi8KKyAgaWYgKChwRGF0YS0+aVJvdyA+PSBwRGF0YS0+aVNvdXJjZXQpICYmIChwRGF0YS0+aVJvdyA8IHBEYXRhLT5pU291cmNlYikpCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGRyZXNzIGRlc3RpbmF0aW9uIHJvdyAqLworICAgIHBTY2FubGluZSA9IChtbmdfdWludDhwKXBEYXRhLT5mR2V0Y2FudmFzbGluZSAoKChtbmdfaGFuZGxlKXBEYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pUm93ICsgcERhdGEtPmlEZXN0dCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aVNvdXJjZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRqdXN0IGRlc3RpbmF0aW9uIHJvdyBzdGFydGluZy1wb2ludCAqLworICAgIHBTY2FubGluZSA9IHBTY2FubGluZSArIChwRGF0YS0+aUNvbCAqIDIpICsgKHBEYXRhLT5pRGVzdGwgKiAyKTsKKyAgICBwRGF0YWxpbmUgPSBwRGF0YS0+cFJHQkFyb3c7ICAgICAgIC8qIGFkZHJlc3Mgc291cmNlIHJvdyAqLworCisgICAgaWYgKHBEYXRhLT5iSXNSR0JBMTYpICAgICAgICAgICAgICAvKiBhZGp1c3Qgc291cmNlIHJvdyBzdGFydGluZy1wb2ludCAqLworICAgICAgcERhdGFsaW5lID0gcERhdGFsaW5lICsgKChwRGF0YS0+aVNvdXJjZWwgLyBwRGF0YS0+aUNvbGluYykgPDwgMyk7CisgICAgZWxzZQorICAgICAgcERhdGFsaW5lID0gcERhdGFsaW5lICsgKChwRGF0YS0+aVNvdXJjZWwgLyBwRGF0YS0+aUNvbGluYykgPDwgMik7CisKKyAgICBpZiAocERhdGEtPmJJc09wYXF1ZSkgICAgICAgICAgICAgIC8qIGZvcmdldCBhYm91dCB0cmFuc3BhcmVuY3kgPyAqLworICAgIHsKKyAgICAgIGlmIChwRGF0YS0+YklzUkdCQTE2KSAgICAgICAgICAgIC8qIDE2LWJpdCBpbnB1dCByb3cgPyAqLworICAgICAgeworICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlTb3VyY2VsICsgcERhdGEtPmlDb2w7IGlYIDwgcERhdGEtPmlTb3VyY2VyOworICAgICAgICAgICAgIGlYICs9IHBEYXRhLT5pQ29saW5jKQorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbGUgZG93biBieSBkcm9wcGluZyB0aGUgTFNCICovCisgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAobW5nX3VpbnQ4KSggKCgqKHBEYXRhbGluZSAgKSAmIDB4RjgpID4+IDEgKSB8ICAoKihwRGF0YWxpbmUrMikgICAgICAgICA+PiA2ICkgKTsKKyAgICAgICAgICAqcFNjYW5saW5lICAgICA9IChtbmdfdWludDgpKCAoICoocERhdGFsaW5lKzQpICAgICAgICAgPj4gMyApIHwgKCgqKHBEYXRhbGluZSsyKSAmIDB4RjgpIDw8IDIgKSApOworCisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyAqIDIpOworICAgICAgICAgIHBEYXRhbGluZSArPSA4OworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3B5IHRoZSB2YWx1ZXMgKi8KKyAgICAgICAgICAqKHBTY2FubGluZSsxKSA9IChtbmdfdWludDgpKCAoKCoocERhdGFsaW5lICApICYgMHhGOCkgPj4gMSApIHwgICgqKHBEYXRhbGluZSsxKSAgICAgICAgID4+IDYgKSApOworICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKG1uZ191aW50OCkoICggKihwRGF0YWxpbmUrMikgICAgICAgICA+PiAzICkgfCAoKCoocERhdGFsaW5lKzEpICYgMHhGOCkgPDwgMiApICk7CisKKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jICogMik7CisgICAgICAgICAgcERhdGFsaW5lICs9IDQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGlmIChwRGF0YS0+YklzUkdCQTE2KSAgICAgICAgICAgIC8qIDE2LWJpdCBpbnB1dCByb3cgPyAqLworICAgICAgeworCisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsKKyAgICAgICAgICBpQTE2ID0gbW5nX2dldF91aW50MTYgKHBEYXRhbGluZSs2KTsKKworICAgICAgICAgIGlmIChpQTE2KSAgICAgICAgICAgICAgICAgICAgLyogYW55IG9wYWNpdHkgYXQgYWxsID8gKi8KKyAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoaUExNiA9PSAweEZGRkYpICAgICAgICAvKiBmdWxseSBvcGFxdWUgPyAqLworICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbGUgZG93biBieSBkcm9wcGluZyB0aGUgTFNCICovCisgICAgICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKG1uZ191aW50OCkoICgoKihwRGF0YWxpbmUgICkgJiAweEY4KSA+PiAxICkgfCAgKCoocERhdGFsaW5lKzIpICAgICAgICAgPj4gNiApICk7CisgICAgICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKG1uZ191aW50OCkoICggKihwRGF0YWxpbmUrNCkgICAgICAgICA+PiAzICkgfCAoKCoocERhdGFsaW5lKzIpICYgMHhGOCkgPDwgMiApICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgdGhlIHByb3BlciB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgaUZHcjE2ID0gbW5nX2dldF91aW50MTYgKHBEYXRhbGluZSAgKTsKKyAgICAgICAgICAgICAgaUZHZzE2ID0gbW5nX2dldF91aW50MTYgKHBEYXRhbGluZSsyKTsKKyAgICAgICAgICAgICAgaUZHYjE2ID0gbW5nX2dldF91aW50MTYgKHBEYXRhbGluZSs0KTsKKworCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbGUgYmFja2dyb3VuZCB1cCAqLworICAgICAgICAgICAgICBpQkdiMTYgPSAobW5nX3VpbnQ4KSggKCoocFNjYW5saW5lKzEpICYgMHhGOCkgPDwgMSApOworICAgICAgICAgICAgICBpQkdnMTYgPSAobW5nX3VpbnQ4KSggKCoocFNjYW5saW5lKzEpICAgICAgICAgPDwgNiApICB8ICAoICgoKnBTY2FubGluZSkgJiAweEUwKSA+PiAyICkgKTsKKyAgICAgICAgICAgICAgaUJHcjE2ID0gKG1uZ191aW50OCkoICAqKHBTY2FubGluZSAgKSAgICAgICAgIDw8IDMgKTsKKworICAgICAgICAgICAgICBpQkdyMTYgPSAobW5nX3VpbnQxNikoKG1uZ191aW50MzIpaUJHcjE2IDw8IDgpIHwgaUJHcjE2OworICAgICAgICAgICAgICBpQkdnMTYgPSAobW5nX3VpbnQxNikoKG1uZ191aW50MzIpaUJHZzE2IDw8IDgpIHwgaUJHZzE2OworICAgICAgICAgICAgICBpQkdiMTYgPSAobW5nX3VpbnQxNikoKG1uZ191aW50MzIpaUJHYjE2IDw8IDgpIHwgaUJHYjE2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm93IGNvbXBvc2UgKi8KKyAgICAgICAgICAgICAgTU5HX0NPTVBPU0UxNihpRkdyMTYsIGlGR3IxNiwgaUExNiwgaUJHcjE2KTsKKyAgICAgICAgICAgICAgTU5HX0NPTVBPU0UxNihpRkdnMTYsIGlGR2cxNiwgaUExNiwgaUJHZzE2KTsKKyAgICAgICAgICAgICAgTU5HX0NPTVBPU0UxNihpRkdiMTYsIGlGR2IxNiwgaUExNiwgaUJHYjE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCByZXR1cm4gdGhlIGNvbXBvc2VkIHZhbHVlcyAqLworICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9IChtbmdfdWludDgpKCAobW5nX3VpbnQ4KSgoKGlGR3IxNiA+PiA4KSAmIDB4RjgpID4+IDEgKSB8ICggICAobW5nX3VpbnQ4KShpRkdnMTYgPj4gOCkgICAgICAgICA+PiA2ICkgKTsKKyAgICAgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAobW5nX3VpbnQ4KSggKG1uZ191aW50OCkgKChpRkdiMTYgPj4xMSkgICAgICAgICA+PiAzICkgfCAoICggKG1uZ191aW50OCkoaUZHZzE2ID4+IDgpICYgMHhGOCkgPDwgMiApICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyAqIDIpOworICAgICAgICAgIHBEYXRhbGluZSArPSA4OworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsKKyAgICAgICAgICBpQTggPSAqKHBEYXRhbGluZSszKTsgICAgICAgIC8qIGdldCBhbHBoYSB2YWx1ZSAqLworCisgICAgICAgICAgaWYgKGlBOCkgICAgICAgICAgICAgICAgICAgICAvKiBhbnkgb3BhY2l0eSBhdCBhbGwgPyAqLworICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpQTggPT0gMHhGRikgICAgICAgICAgIC8qIGZ1bGx5IG9wYXF1ZSA/ICovCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGVuIHNpbXBseSBjb3B5IHRoZSB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAobW5nX3VpbnQ4KSggKCgqKHBEYXRhbGluZSAgKSAmIDB4RjgpID4+IDEgKSB8ICAoKihwRGF0YWxpbmUrMSkgICAgICAgICA+PiA2ICkgKTsKKyAgICAgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAobW5nX3VpbnQ4KSggKCAqKHBEYXRhbGluZSsyKSAgICAgICAgID4+IDMgKSB8ICgoKihwRGF0YWxpbmUrMSkgJiAweEY4KSA8PCAyICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvIGFscGhhIGNvbXBvc2luZyAqLworICAgICAgICAgICAgICBtbmdfdWludDggaVJlZCwgaUdyZWVuLCBpQmx1ZTsKKworICAgICAgICAgICAgICBpUmVkICAgPSAobW5nX3VpbnQ4KSggKCoocFNjYW5saW5lKzEpICYgMHhGOCkgPDwgMSApOworICAgICAgICAgICAgICBpR3JlZW4gPSAobW5nX3VpbnQ4KSggKCoocFNjYW5saW5lKzEpICAgICAgICAgPDwgNiApICB8ICAoICgoKnBTY2FubGluZSkgJiAweEUwKSA+PiAyICkgKTsKKyAgICAgICAgICAgICAgaUJsdWUgID0gKG1uZ191aW50OCkoICAqKHBTY2FubGluZSAgKSAgICAgICAgIDw8IDMgKTsKKworICAgICAgICAgICAgICBNTkdfQ09NUE9TRTggKGlSZWQsICAgICAqKHBEYXRhbGluZSswKSwgaUE4LCBpUmVkICAgICk7CisgICAgICAgICAgICAgIE1OR19DT01QT1NFOCAoaUdyZWVuLCAgICoocERhdGFsaW5lKzEpLCBpQTgsIGlHcmVlbiAgKTsKKyAgICAgICAgICAgICAgTU5HX0NPTVBPU0U4IChpQmx1ZSwgICAgKihwRGF0YWxpbmUrMiksIGlBOCwgaUJsdWUgICApOworCisgICAgICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKG1uZ191aW50OCkoICggKGlSZWQgJiAweEY4KSA+PiAxICkgIHwgICggIGlHcmVlbiAgICAgICAgID4+IDYgKSApOworICAgICAgICAgICAgICAqcFNjYW5saW5lICAgICA9IChtbmdfdWludDgpKCAgIChpQmx1ZSAgICAgICAgPj4gMyApICB8ICAoIChpR3JlZW4gJiAweEY4KSA8PCAyICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jICogMik7CisgICAgICAgICAgcERhdGFsaW5lICs9IDQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBjaGVja191cGRhdGVfcmVnaW9uIChwRGF0YSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRElTUExBWV9CR1I1NTUsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2Vsc2UgLyogTU5HX09QVElNSVpFX0ZPT1RQUklOVF9DT01QT1NFICovCittbmdfcmV0Y29kZSBtbmdfZGlzcGxheV9iZ3I1NTUgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX3VpbnQ4cCBwU2NhbmxpbmU7CisgIG1uZ191aW50OHAgcERhdGFsaW5lOworICBtbmdfaW50MzIgIGlYOworICBtbmdfdWludDE2IGlBMTY7CisgIG1uZ191aW50MTYgaUZHcjE2LCBpRkdnMTYsIGlGR2IxNjsKKyAgbW5nX3VpbnQxNiBpQkdyMTYsIGlCR2cxNiwgaUJHYjE2OworICBtbmdfdWludDggIGlBODsKKyAgbW5nX3VpbnQ4ICBpQnBzOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RJU1BMQVlfQkdSNTU1LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaUJwcz0obW5nX3VpbnQ4KShwRGF0YS0+YklzUkdCQTE2ID8gMjoxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZpZXdhYmxlIHJvdyA/ICovCisgIGlmICgocERhdGEtPmlSb3cgPj0gcERhdGEtPmlTb3VyY2V0KSAmJiAocERhdGEtPmlSb3cgPCBwRGF0YS0+aVNvdXJjZWIpKQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkcmVzcyBkZXN0aW5hdGlvbiByb3cgKi8KKyAgICBwU2NhbmxpbmUgPSAobW5nX3VpbnQ4cClwRGF0YS0+ZkdldGNhbnZhc2xpbmUgKCgobW5nX2hhbmRsZSlwRGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+aVJvdyArIHBEYXRhLT5pRGVzdHQgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlTb3VyY2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkanVzdCBkZXN0aW5hdGlvbiByb3cgc3RhcnRpbmctcG9pbnQgKi8KKyAgICBwU2NhbmxpbmUgPSBwU2NhbmxpbmUgKyAocERhdGEtPmlDb2wgKiAyKSArIChwRGF0YS0+aURlc3RsICogMik7CisgICAgcERhdGFsaW5lID0gcERhdGEtPnBSR0JBcm93OyAgICAgICAvKiBhZGRyZXNzIHNvdXJjZSByb3cgKi8KKworICAgIC8qIGFkanVzdCBzb3VyY2Ugcm93IHN0YXJ0aW5nLXBvaW50ICovCisgICAgcERhdGFsaW5lID0gcERhdGFsaW5lICsgKChwRGF0YS0+aVNvdXJjZWwgLyBwRGF0YS0+aUNvbGluYykgPDwgKGlCcHMrMSkpOworCisgICAgaWYgKHBEYXRhLT5iSXNPcGFxdWUpICAgICAgICAgICAgICAvKiBmb3JnZXQgYWJvdXQgdHJhbnNwYXJlbmN5ID8gKi8KKyAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzY2FsZSBkb3duIGJ5IGRyb3BwaW5nIHRoZSBMU0IgKi8KKyAgICAgICAgICAqKHBTY2FubGluZSsxKSA9IChtbmdfdWludDgpKCAoKCoocERhdGFsaW5lICAgICAgICkgJiAweEY4KSA+PiAxICkgfCAgKCoocERhdGFsaW5lK2lCcHMpICAgICAgICAgPj4gNiApICk7CisgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAobW5nX3VpbnQ4KSggKCAqKHBEYXRhbGluZSsyKmlCcHMpICAgICAgICAgPj4gMyApIHwgKCgqKHBEYXRhbGluZStpQnBzKSAmIDB4RjgpIDw8IDIgKSApOworCisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyAqIDIpOworICAgICAgICAgIHBEYXRhbGluZSArPSA0KmlCcHM7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGlmIChwRGF0YS0+YklzUkdCQTE2KSAgICAgICAgICAgIC8qIDE2LWJpdCBpbnB1dCByb3cgPyAqLworICAgICAgeworCisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsKKyAgICAgICAgICBpQTE2ID0gbW5nX2dldF91aW50MTYgKHBEYXRhbGluZSs2KTsKKworICAgICAgICAgIGlmIChpQTE2KSAgICAgICAgICAgICAgICAgICAgLyogYW55IG9wYWNpdHkgYXQgYWxsID8gKi8KKyAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoaUExNiA9PSAweEZGRkYpICAgICAgICAvKiBmdWxseSBvcGFxdWUgPyAqLworICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbGUgZG93biBieSBkcm9wcGluZyB0aGUgTFNCICovCisgICAgICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKG1uZ191aW50OCkoICgoKihwRGF0YWxpbmUgICkgJiAweEY4KSA+PiAxICkgfCAgKCoocERhdGFsaW5lKzIpICAgICAgICAgPj4gNiApICk7CisgICAgICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKG1uZ191aW50OCkoICggKihwRGF0YWxpbmUrNCkgICAgICAgICA+PiAzICkgfCAoKCoocERhdGFsaW5lKzIpICYgMHhGOCkgPDwgMiApICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgdGhlIHByb3BlciB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgaUZHcjE2ID0gbW5nX2dldF91aW50MTYgKHBEYXRhbGluZSAgKTsKKyAgICAgICAgICAgICAgaUZHZzE2ID0gbW5nX2dldF91aW50MTYgKHBEYXRhbGluZSsyKTsKKyAgICAgICAgICAgICAgaUZHYjE2ID0gbW5nX2dldF91aW50MTYgKHBEYXRhbGluZSs0KTsKKworCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbGUgYmFja2dyb3VuZCB1cCAqLworICAgICAgICAgICAgICBpQkdiMTYgPSAobW5nX3VpbnQ4KSggKCoocFNjYW5saW5lKzEpICYgMHhGOCkgPDwgMSApOworICAgICAgICAgICAgICBpQkdnMTYgPSAobW5nX3VpbnQ4KSggKCoocFNjYW5saW5lKzEpICAgICAgICAgPDwgNiApICB8ICAoICgoKnBTY2FubGluZSkgJiAweEUwKSA+PiAyICkgKTsKKyAgICAgICAgICAgICAgaUJHcjE2ID0gKG1uZ191aW50OCkoICAqKHBTY2FubGluZSAgKSAgICAgICAgIDw8IDMgKTsKKworICAgICAgICAgICAgICBpQkdyMTYgPSAobW5nX3VpbnQxNikoKG1uZ191aW50MzIpaUJHcjE2IDw8IDgpIHwgaUJHcjE2OworICAgICAgICAgICAgICBpQkdnMTYgPSAobW5nX3VpbnQxNikoKG1uZ191aW50MzIpaUJHZzE2IDw8IDgpIHwgaUJHZzE2OworICAgICAgICAgICAgICBpQkdiMTYgPSAobW5nX3VpbnQxNikoKG1uZ191aW50MzIpaUJHYjE2IDw8IDgpIHwgaUJHYjE2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm93IGNvbXBvc2UgKi8KKyAgICAgICAgICAgICAgTU5HX0NPTVBPU0UxNihpRkdyMTYsIGlGR3IxNiwgaUExNiwgaUJHcjE2KTsKKyAgICAgICAgICAgICAgTU5HX0NPTVBPU0UxNihpRkdnMTYsIGlGR2cxNiwgaUExNiwgaUJHZzE2KTsKKyAgICAgICAgICAgICAgTU5HX0NPTVBPU0UxNihpRkdiMTYsIGlGR2IxNiwgaUExNiwgaUJHYjE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCByZXR1cm4gdGhlIGNvbXBvc2VkIHZhbHVlcyAqLworICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9IChtbmdfdWludDgpKCAobW5nX3VpbnQ4KSgoKGlGR3IxNiA+PiA4KSAmIDB4RjgpID4+IDEgKSB8ICggICAobW5nX3VpbnQ4KShpRkdnMTYgPj4gOCkgICAgICAgICA+PiA2ICkgKTsKKyAgICAgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAobW5nX3VpbnQ4KSggKG1uZ191aW50OCkgKChpRkdiMTYgPj4xMSkgICAgICAgICA+PiAzICkgfCAoICggKG1uZ191aW50OCkoaUZHZzE2ID4+IDgpICYgMHhGOCkgPDwgMiApICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgcFNjYW5saW5lICs9IChwRGF0YS0+aUNvbGluYyAqIDIpOworICAgICAgICAgIHBEYXRhbGluZSArPSA4OworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsKKyAgICAgICAgICBpQTggPSAqKHBEYXRhbGluZSszKTsgICAgICAgIC8qIGdldCBhbHBoYSB2YWx1ZSAqLworCisgICAgICAgICAgaWYgKGlBOCkgICAgICAgICAgICAgICAgICAgICAvKiBhbnkgb3BhY2l0eSBhdCBhbGwgPyAqLworICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpQTggPT0gMHhGRikgICAgICAgICAgIC8qIGZ1bGx5IG9wYXF1ZSA/ICovCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGVuIHNpbXBseSBjb3B5IHRoZSB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAobW5nX3VpbnQ4KSggKCgqKHBEYXRhbGluZSAgKSAmIDB4RjgpID4+IDEgKSB8ICAoKihwRGF0YWxpbmUrMSkgICAgICAgICA+PiA2ICkgKTsKKyAgICAgICAgICAgICAgKnBTY2FubGluZSAgICAgPSAobW5nX3VpbnQ4KSggKCAqKHBEYXRhbGluZSsyKSAgICAgICAgID4+IDMgKSB8ICgoKihwRGF0YWxpbmUrMSkgJiAweEY4KSA8PCAyICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvIGFscGhhIGNvbXBvc2luZyAqLworICAgICAgICAgICAgICBtbmdfdWludDggaVJlZCwgaUdyZWVuLCBpQmx1ZTsKKworICAgICAgICAgICAgICBpUmVkICAgPSAobW5nX3VpbnQ4KSggKCoocFNjYW5saW5lKzEpICYgMHhGOCkgPDwgMSApOworICAgICAgICAgICAgICBpR3JlZW4gPSAobW5nX3VpbnQ4KSggKCoocFNjYW5saW5lKzEpICAgICAgICAgPDwgNiApICB8ICAoICgoKnBTY2FubGluZSkgJiAweEUwKSA+PiAyICkgKTsKKyAgICAgICAgICAgICAgaUJsdWUgID0gKG1uZ191aW50OCkoICAqKHBTY2FubGluZSAgKSAgICAgICAgIDw8IDMgKTsKKworICAgICAgICAgICAgICBNTkdfQ09NUE9TRTggKGlSZWQsICAgICAqKHBEYXRhbGluZSswKSwgaUE4LCBpUmVkICAgICk7CisgICAgICAgICAgICAgIE1OR19DT01QT1NFOCAoaUdyZWVuLCAgICoocERhdGFsaW5lKzEpLCBpQTgsIGlHcmVlbiAgKTsKKyAgICAgICAgICAgICAgTU5HX0NPTVBPU0U4IChpQmx1ZSwgICAgKihwRGF0YWxpbmUrMiksIGlBOCwgaUJsdWUgICApOworCisgICAgICAgICAgICAgICoocFNjYW5saW5lKzEpID0gKG1uZ191aW50OCkoICggKGlSZWQgJiAweEY4KSA+PiAxICkgIHwgICggIGlHcmVlbiAgICAgICAgID4+IDYgKSApOworICAgICAgICAgICAgICAqcFNjYW5saW5lICAgICA9IChtbmdfdWludDgpKCAgIChpQmx1ZSAgICAgICAgPj4gMyApICB8ICAoIChpR3JlZW4gJiAweEY4KSA8PCAyICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jICogMik7CisgICAgICAgICAgcERhdGFsaW5lICs9IDQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBjaGVja191cGRhdGVfcmVnaW9uIChwRGF0YSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRElTUExBWV9CR1I1NTUsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmIC8qIE1OR19PUFRJTUlaRV9GT09UUFJJTlRfQ09NUE9TRSAqLworI2Vsc2UgLyogTU5HX05PXzE2QklUX1NVUFBPUlQgKi8KK21uZ19yZXRjb2RlIG1uZ19kaXNwbGF5X2JncjU1NSAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfdWludDhwIHBTY2FubGluZTsKKyAgbW5nX3VpbnQ4cCBwRGF0YWxpbmU7CisgIG1uZ19pbnQzMiAgaVg7CisgIG1uZ191aW50OCAgaUE4OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RJU1BMQVlfQkdSNTU1LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2aWV3YWJsZSByb3cgPyAqLworICBpZiAoKHBEYXRhLT5pUm93ID49IHBEYXRhLT5pU291cmNldCkgJiYgKHBEYXRhLT5pUm93IDwgcERhdGEtPmlTb3VyY2ViKSkKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHJlc3MgZGVzdGluYXRpb24gcm93ICovCisgICAgcFNjYW5saW5lID0gKG1uZ191aW50OHApcERhdGEtPmZHZXRjYW52YXNsaW5lICgoKG1uZ19oYW5kbGUpcERhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlSb3cgKyBwRGF0YS0+aURlc3R0IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pU291cmNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGp1c3QgZGVzdGluYXRpb24gcm93IHN0YXJ0aW5nLXBvaW50ICovCisgICAgcFNjYW5saW5lID0gcFNjYW5saW5lICsgKHBEYXRhLT5pQ29sICogMikgKyAocERhdGEtPmlEZXN0bCAqIDIpOworICAgIHBEYXRhbGluZSA9IHBEYXRhLT5wUkdCQXJvdzsgICAgICAgLyogYWRkcmVzcyBzb3VyY2Ugcm93ICovCisKKyAgICAgIHBEYXRhbGluZSA9IHBEYXRhbGluZSArICgocERhdGEtPmlTb3VyY2VsIC8gcERhdGEtPmlDb2xpbmMpIDw8IDIpOworCisgICAgaWYgKHBEYXRhLT5iSXNPcGFxdWUpICAgICAgICAgICAgICAvKiBmb3JnZXQgYWJvdXQgdHJhbnNwYXJlbmN5ID8gKi8KKyAgICB7CisgICAgICB7CisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVNvdXJjZWwgKyBwRGF0YS0+aUNvbDsgaVggPCBwRGF0YS0+aVNvdXJjZXI7CisgICAgICAgICAgICAgaVggKz0gcERhdGEtPmlDb2xpbmMpCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3B5IHRoZSB2YWx1ZXMgKi8KKyAgICAgICAgICAqKHBTY2FubGluZSsxKSA9IChtbmdfdWludDgpKCAoKCoocERhdGFsaW5lICApICYgMHhGOCkgPj4gMSApIHwgICgqKHBEYXRhbGluZSsxKSAgICAgICAgID4+IDYgKSApOworICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKG1uZ191aW50OCkoICggKihwRGF0YWxpbmUrMikgICAgICAgICA+PiAzICkgfCAoKCoocERhdGFsaW5lKzEpICYgMHhGOCkgPDwgMiApICk7CisKKyAgICAgICAgICBwU2NhbmxpbmUgKz0gKHBEYXRhLT5pQ29saW5jICogMik7CisgICAgICAgICAgcERhdGFsaW5lICs9IDQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHsKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pU291cmNlbCArIHBEYXRhLT5pQ29sOyBpWCA8IHBEYXRhLT5pU291cmNlcjsKKyAgICAgICAgICAgICBpWCArPSBwRGF0YS0+aUNvbGluYykKKyAgICAgICAgeworICAgICAgICAgIGlBOCA9ICoocERhdGFsaW5lKzMpOyAgICAgICAgLyogZ2V0IGFscGhhIHZhbHVlICovCisKKyAgICAgICAgICBpZiAoaUE4KSAgICAgICAgICAgICAgICAgICAgIC8qIGFueSBvcGFjaXR5IGF0IGFsbCA/ICovCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKGlBOCA9PSAweEZGKSAgICAgICAgICAgLyogZnVsbHkgb3BhcXVlID8gKi8KKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZW4gc2ltcGx5IGNvcHkgdGhlIHZhbHVlcyAqLworICAgICAgICAgICAgICAqKHBTY2FubGluZSsxKSA9IChtbmdfdWludDgpKCAoKCoocERhdGFsaW5lICApICYgMHhGOCkgPj4gMSApIHwgICgqKHBEYXRhbGluZSsxKSAgICAgICAgID4+IDYgKSApOworICAgICAgICAgICAgICAqcFNjYW5saW5lICAgICA9IChtbmdfdWludDgpKCAoICoocERhdGFsaW5lKzIpICAgICAgICAgPj4gMyApIHwgKCgqKHBEYXRhbGluZSsxKSAmIDB4RjgpIDw8IDIgKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZG8gYWxwaGEgY29tcG9zaW5nICovCisgICAgICAgICAgICAgIG1uZ191aW50OCBpUmVkLCBpR3JlZW4sIGlCbHVlOworCisgICAgICAgICAgICAgIGlSZWQgICA9IChtbmdfdWludDgpKCAoKihwU2NhbmxpbmUrMSkgJiAweEY4KSA8PCAxICk7CisgICAgICAgICAgICAgIGlHcmVlbiA9IChtbmdfdWludDgpKCAoKihwU2NhbmxpbmUrMSkgICAgICAgICA8PCA2ICkgIHwgICggKCgqcFNjYW5saW5lKSAmIDB4RTApID4+IDIgKSApOworICAgICAgICAgICAgICBpQmx1ZSAgPSAobW5nX3VpbnQ4KSggICoocFNjYW5saW5lICApICAgICAgICAgPDwgMyApOworCisgICAgICAgICAgICAgIE1OR19DT01QT1NFOCAoaVJlZCwgICAgICoocERhdGFsaW5lKzApLCBpQTgsIGlSZWQgICAgKTsKKyAgICAgICAgICAgICAgTU5HX0NPTVBPU0U4IChpR3JlZW4sICAgKihwRGF0YWxpbmUrMSksIGlBOCwgaUdyZWVuICApOworICAgICAgICAgICAgICBNTkdfQ09NUE9TRTggKGlCbHVlLCAgICAqKHBEYXRhbGluZSsyKSwgaUE4LCBpQmx1ZSAgICk7CisKKyAgICAgICAgICAgICAgKihwU2NhbmxpbmUrMSkgPSAobW5nX3VpbnQ4KSggKCAoaVJlZCAmIDB4RjgpID4+IDEgKSAgfCAgKCAgaUdyZWVuICAgICAgICAgPj4gNiApICk7CisgICAgICAgICAgICAgICpwU2NhbmxpbmUgICAgID0gKG1uZ191aW50OCkoICAgKGlCbHVlICAgICAgICA+PiAzICkgIHwgICggKGlHcmVlbiAmIDB4RjgpIDw8IDIgKSApOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIHBTY2FubGluZSArPSAocERhdGEtPmlDb2xpbmMgKiAyKTsKKyAgICAgICAgICBwRGF0YWxpbmUgKz0gNDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIGNoZWNrX3VwZGF0ZV9yZWdpb24gKHBEYXRhKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ESVNQTEFZX0JHUjU1NSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYgLyogTU5HX05PXzE2QklUX1NVUFBPUlQgKi8KKyNlbmRpZiAvKiBNTkdfU0tJUENBTlZBU19CR1I1NTUgKi8KKworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfQkFDSworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIEJhY2tncm91bmQgcmVzdG9yZSByb3V0aW5lcyAtIHJlc3RvcmUgdGhlIGJhY2tncm91bmQgd2l0aCBpbmZvIGZyb20gICAgKiAqLworLyogKiB0aGUgQkFDSyBhbmQvb3IgYktHRCBjaHVuayBvciB0aGUgYXBwJ3MgYmFja2dyb3VuZCBjYW52YXMgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfcmVzdG9yZV9ia2dkX2JhY2tpbWFnZSAobW5nX2RhdGFwIHBEYXRhKQoreworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2F2ZSBzb21lIHN0dWZmICovCisgIG1uZ191aW50OHAgIHBSR0JBcm93ICAgID0gcERhdGEtPnBSR0JBcm93OworICBtbmdfaW50MzIgICBpUm93ICAgICAgICA9IHBEYXRhLT5pUm93OworICBtbmdfaW50MzIgICBpUm93c2FtcGxlcyA9IHBEYXRhLT5pUm93c2FtcGxlczsKKworICBtbmdfcmV0Y29kZSBpUmV0Y29kZTsgICAgICAgICAgICAgICAgLyogd29yayB2YXJpYWJsZXMgKi8KKyAgbW5nX3VpbnQ4cCAgcFRlbXA7CisgIG1uZ191aW50OHAgIHBXb3JrICAgICAgID0gcFJHQkFyb3c7CisgIG1uZ191aW50MzIgIGlYOworICBtbmdfaW50MzIgICBpWjsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9SRVNUT1JFX0JBQ0tJTUFHRSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGV0ZXJtaW5lIHJvdyB0byByZXRyaWV2ZSAqLworICBwRGF0YS0+aVJvdyAgICAgICAgPSBwRGF0YS0+aURlc3R0ICsgaVJvdyArIHBEYXRhLT5pQmFja2ltZ29mZnN5OworCisgIHdoaWxlIChwRGF0YS0+aVJvdyA+PSAobW5nX2ludDMyKXBEYXRhLT5pQmFja2ltZ2hlaWdodCkKKyAgICBwRGF0YS0+aVJvdyAtPSAobW5nX2ludDMyKXBEYXRhLT5pQmFja2ltZ2hlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNldCB3aWR0aCB0byB0aGF0IG9mIGJhY2tncm91bmQgaW1hZ2UgKi8KKyAgcERhdGEtPmlSb3dzYW1wbGVzID0gcERhdGEtPmlCYWNraW1nd2lkdGg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZXRyaWV2ZSBpbnRvIGFsdGVybmF0ZSBidWZmZXIgISAqLworICBwRGF0YS0+cFJHQkFyb3cgICAgPSBwRGF0YS0+cFByZXZyb3c7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgaXQgdGhlbiAqLworICBpUmV0Y29kZSA9ICgobW5nX3JldHJpZXZlcm93KXBEYXRhLT5mUmV0cmlldmVyb3cpIChwRGF0YSk7CisKKyAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yOyBiYWlsIG91dCAqLworICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdlIGdvdCB0aGUgZnVsbCByb3c7IGJ1dCBub3cgbmVlZCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUgaXQgaW50byB0aGUgcHJvcGVyIGxvY2F0aW9uICovCisgIGlYID0gcERhdGEtPmlEZXN0bCAtIHBEYXRhLT5pQmFja2ltZ29mZnN4OworCisgIHdoaWxlIChpWCA+PSBwRGF0YS0+aUJhY2tpbWd3aWR0aCkKKyAgICBpWCAtPSBwRGF0YS0+aUJhY2tpbWd3aWR0aDsKKworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICBpZiAocERhdGEtPmJJc1JHQkExNikgICAgICAgICAgICAgICAgLyogMTYtYml0IGJ1ZmZlciA/ICovCisgIHsKKyAgICBwVGVtcCA9IHBEYXRhLT5wUHJldnJvdyArIChpWCA8PCAzKTsKKworICAgIGZvciAoaVogPSAocERhdGEtPmlEZXN0ciAtIHBEYXRhLT5pRGVzdGwpOyBpWiA+IDA7IGlaLS0pCisgICAgeworICAgICAgTU5HX0NPUFkgKHBXb3JrLCBwVGVtcCwgOCk7CisKKyAgICAgIHBXb3JrICs9IDg7CisgICAgICBwVGVtcCArPSA4OworICAgICAgaVgrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlYWNoZWQgZW5kIG9mIGJrZ2QtaW1hZ2UgbGluZSA/ICovCisgICAgICBpZiAoaVggPj0gcERhdGEtPmlCYWNraW1nd2lkdGgpCisgICAgICB7CisgICAgICAgIGlYICAgID0gMDsKKyAgICAgICAgcFRlbXAgPSBwRGF0YS0+cFByZXZyb3c7CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UKKyNlbmRpZgorICB7CisgICAgcFRlbXAgPSBwRGF0YS0+cFByZXZyb3cgKyAoaVggPDwgMik7CisKKyAgICBmb3IgKGlaID0gKHBEYXRhLT5pRGVzdHIgLSBwRGF0YS0+aURlc3RsKTsgaVogPiAwOyBpWi0tKQorICAgIHsKKyAgICAgIE1OR19DT1BZIChwV29yaywgcFRlbXAsIDQpOworCisgICAgICBwV29yayArPSA0OworICAgICAgcFRlbXAgKz0gNDsKKyAgICAgIGlYKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWFjaGVkIGVuZCBvZiBia2dkLWltYWdlIGxpbmUgPyAqLworICAgICAgaWYgKGlYID49IHBEYXRhLT5pQmFja2ltZ3dpZHRoKQorICAgICAgeworICAgICAgICBpWCAgICA9IDA7CisgICAgICAgIHBUZW1wID0gcERhdGEtPnBQcmV2cm93OworICAgICAgfQorICAgIH0KKyAgfQorCisgIHBEYXRhLT5wUkdCQXJvdyAgICA9IHBSR0JBcm93OyAgICAgICAvKiByZXN0b3JlIG9yaWdpbmFsIHZhbHVlcyAqLworICBwRGF0YS0+aVJvdyAgICAgICAgPSBpUm93OworICBwRGF0YS0+aVJvd3NhbXBsZXMgPSBpUm93c2FtcGxlczsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9SRVNUT1JFX0JBQ0tJTUFHRSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX3Jlc3RvcmVfYmtnZF9iYWNrY29sb3IgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX2ludDMyICAgaVg7CisgIG1uZ191aW50MzJwIHBXb3JrMzIgPSAobW5nX3VpbnQzMnApcERhdGEtPnBSR0JBcm93OworICBtbmdfdWludDMyICBpV3JpdGU7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVTVE9SRV9CQUNLQ09MT1IsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworI2lmZGVmIE1OR19CSUdFTkRJQU5fU1VQUE9SVEVECisgIC8qIGZhc3Qgd2F5IGZvciBiaWcgZW5kaWFuICovCisgIGlXcml0ZSA9ICgoKG1uZ191aW50OCkocERhdGEtPmlCQUNLcmVkICAgPj4gOCkpIDw8IDI0KSB8CisJCSAgICgoKG1uZ191aW50OCkocERhdGEtPmlCQUNLZ3JlZW4gPj4gOCkpIDw8IDE2KSB8CisJCSAgICgoKG1uZ191aW50OCkocERhdGEtPmlCQUNLYmx1ZSAgPj4gOCkpIDw8ICA4KSB8CisgICAgICAgICAgICggMHhGRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyNlbGlmIGRlZmluZWQoTU5HX0xJVFRMRUVORElBTl9TVVBQT1JURUQpCisgIC8qIGZhc3Qgd2F5IGZvciBsaXR0bGUgZW5kaWFuICovCisgIGlXcml0ZSA9ICggMHhGRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IDI0KSB8CisgICAgICAgICAgICgoKG1uZ191aW50OCkocERhdGEtPmlCQUNLYmx1ZSAgPj4gOCkpIDw8IDE2KSB8CisJCSAgICgoKG1uZ191aW50OCkocERhdGEtPmlCQUNLZ3JlZW4gPj4gOCkpIDw8ICA4KSB8CisJCSAgICgoKG1uZ191aW50OCkocERhdGEtPmlCQUNLcmVkICAgPj4gOCkpICAgICAgKTsKKyNlbHNlCisgIC8qIGdlbmVyaWMgd2F5LCB3b3JrcyBvbiBhbGwgcGxhdGZvcm1zICovCisgIC8qIHB1dCB0aGUgZGF0YSBpbiBtZW1vcnkgaW4gdGhlIGNvcnJlY3Qgb3JkZXIgKi8KKyAgeworICAgIG1uZ191aW50OCBhQnl0ZXNbNF07CisgICAgYUJ5dGVzWzBdID0gKG1uZ191aW50OCkocERhdGEtPmlCQUNLcmVkICAgPj4gOCk7CisgICAgYUJ5dGVzWzFdID0gKG1uZ191aW50OCkocERhdGEtPmlCQUNLZ3JlZW4gPj4gOCk7CisgICAgYUJ5dGVzWzJdID0gKG1uZ191aW50OCkocERhdGEtPmlCQUNLYmx1ZSAgPj4gOCk7CisgICAgYUJ5dGVzWzNdID0gMHhGRjsKKyAgICAvKiBsb2FkIHRoYXQgZGF0YSBpbnRvIGEgcmVnaXN0ZXIgKi8KKyAgICBpV3JpdGUgPSAqKG1uZ191aW50MzIqKSBhQnl0ZXM7CisgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb2s7IGRyb3AgdGhlIGJhY2tncm91bmQtY29sb3IgaW4gdGhlcmUgKi8KKyAgZm9yIChpWCA9IChwRGF0YS0+aVNvdXJjZXIgLSBwRGF0YS0+aVNvdXJjZWwpOyBpWCA+IDA7IGlYLS0pCisgICAgKnBXb3JrMzIrKyA9IGlXcml0ZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9SRVNUT1JFX0JBQ0tDT0xPUiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19iS0dECittbmdfcmV0Y29kZSBtbmdfcmVzdG9yZV9ia2dkX2JrZ2QgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX2ludDMyICAgICAgaVg7CisgIG1uZ191aW50OHAgICAgIHBXb3JrICAgPSBwRGF0YS0+cFJHQkFyb3c7CisgIG1uZ19pbWFnZXAgICAgIHBJbWFnZSAgPSAobW5nX2ltYWdlcClwRGF0YS0+cEN1cnJlbnRvYmo7CisgIG1uZ19pbWFnZWRhdGFwIHBCdWYgICAgPSBwSW1hZ2UtPnBJbWdidWY7CisgIG1uZ191aW50OCAgICAgIGlSZWQgICAgPSAwOworICBtbmdfdWludDggICAgICBpR3JlZW4gID0gMDsKKyAgbW5nX3VpbnQ4ICAgICAgaUJsdWUgICA9IDA7CisgIG1uZ191aW50MzJwICAgIHBXb3JrMzIgPSAobW5nX3VpbnQzMnApcFdvcms7CisgIG1uZ191aW50MzIgICAgIGlXcml0ZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9SRVNUT1JFX0JLR0QsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBzd2l0Y2ggKHBCdWYtPmlDb2xvcnR5cGUpCisgIHsKKyAgICBjYXNlIDAgOiA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdyYXkgdHlwZXMgKi8KKyAgICBjYXNlIDQgOiB7CisgICAgICAgICAgICAgICBtbmdfdWludDggaUdyYXk7CisKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyAgICAgICAgICAgICAgIGlmIChwQnVmLT5pQml0ZGVwdGggPiA4KQorICAgICAgICAgICAgICAgICBpR3JheSA9IChtbmdfdWludDgpKHBCdWYtPmlCS0dEZ3JheSA+PiA4KTsKKyAgICAgICAgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgICAgeworI2lmbmRlZiBNTkdfTk9fMV8yXzRCSVRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAvKiBMQlIgc2NhbGluZyAqLworICAgICAgICAgICAgICAgICBtbmdfdWludDggbXVsdGlwbGllcltdPXswLDI1NSw4NSwwLDE3LDAsMCwwLDF9OworICAgICAgICAgICAgICAgICBpR3JheSA9IChtbmdfdWludDgpKG11bHRpcGxpZXJbcEJ1Zi0+aUJpdGRlcHRoXSAqIHBCdWYtPmlCS0dEZ3JheSk7CisjZWxzZQorICAgICAgICAgICAgICAgICBpR3JheSA9IChtbmdfdWludDgpcEJ1Zi0+aUJLR0RncmF5OworI2VuZGlmCisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgIGlSZWQgICA9IGlHcmF5OworICAgICAgICAgICAgICAgaUdyZWVuID0gaUdyYXk7CisgICAgICAgICAgICAgICBpQmx1ZSAgPSBpR3JheTsKKworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgfQorCisgICAgY2FzZSAzIDogeyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbmRleGVkIHR5cGUgKi8KKyAgICAgICAgICAgICAgIGlSZWQgICA9IHBCdWYtPmFQTFRFZW50cmllcyBbcEJ1Zi0+aUJLR0RpbmRleF0uaVJlZDsKKyAgICAgICAgICAgICAgIGlHcmVlbiA9IHBCdWYtPmFQTFRFZW50cmllcyBbcEJ1Zi0+aUJLR0RpbmRleF0uaUdyZWVuOworICAgICAgICAgICAgICAgaUJsdWUgID0gcEJ1Zi0+YVBMVEVlbnRyaWVzIFtwQnVmLT5pQktHRGluZGV4XS5pQmx1ZTsKKworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgfQorCisgICAgY2FzZSAyIDogOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZ2IgdHlwZXMgKi8KKyAgICBjYXNlIDYgOiB7CisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgICAgICAgICAgICBpZiAocEJ1Zi0+aUJpdGRlcHRoID4gOCkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgaVJlZCAgID0gKG1uZ191aW50OCkocEJ1Zi0+aUJLR0RyZWQgICA+PiA4KTsKKyAgICAgICAgICAgICAgICAgaUdyZWVuID0gKG1uZ191aW50OCkocEJ1Zi0+aUJLR0RncmVlbiA+PiA4KTsKKyAgICAgICAgICAgICAgICAgaUJsdWUgID0gKG1uZ191aW50OCkocEJ1Zi0+aUJLR0RibHVlICA+PiA4KTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICBpUmVkICAgPSAobW5nX3VpbnQ4KShwQnVmLT5pQktHRHJlZCAgKTsKKyAgICAgICAgICAgICAgICAgaUdyZWVuID0gKG1uZ191aW50OCkocEJ1Zi0+aUJLR0RncmVlbik7CisgICAgICAgICAgICAgICAgIGlCbHVlICA9IChtbmdfdWludDgpKHBCdWYtPmlCS0dEYmx1ZSApOworICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICB9CisgIH0KKworI2lmZGVmIE1OR19CSUdFTkRJQU5fU1VQUE9SVEVECisgIC8qIGZhc3Qgd2F5IGZvciBiaWcgZW5kaWFuICovCisgIGlXcml0ZSA9IChpUmVkICAgPDwgMjQpIHwKKwkJICAgKGlHcmVlbiA8PCAxNikgfAorCQkgICAoaUJsdWUgIDw8ICA4KTsKKyNlbGlmIGRlZmluZWQoTU5HX0xJVFRMRUVORElBTl9TVVBQT1JURUQpCisgIC8qIGZhc3Qgd2F5IGZvciBsaXR0bGUgZW5kaWFuICovCisgIGlXcml0ZSA9IChpQmx1ZSAgPDwgMTYpIHwKKwkJICAgKGlHcmVlbiA8PCAgOCkgfAorCQkgICAoaVJlZCAgICAgICAgKTsKKyNlbHNlCisgIC8qIGdlbmVyaWMgd2F5LCB3b3JrcyBvbiBhbGwgcGxhdGZvcm1zICovCisgIC8qIHB1dCB0aGUgZGF0YSBpbiBtZW1vcnkgaW4gdGhlIGNvcnJlY3Qgb3JkZXIgKi8KKyAgeworICAgIG1uZ191aW50OCBhQnl0ZXNbNF07CisgICAgYUJ5dGVzWzBdID0gKG1uZ191aW50OCkoaVJlZCk7CisgICAgYUJ5dGVzWzFdID0gKG1uZ191aW50OCkoaUdyZWVuKTsKKyAgICBhQnl0ZXNbMl0gPSAobW5nX3VpbnQ4KShpQmx1ZSk7CisgICAgYUJ5dGVzWzNdID0gMHgwMDsKKyAgICAvKiBsb2FkIHRoYXQgZGF0YSBpbnRvIGEgcmVnaXN0ZXIgKi8KKyAgICBpV3JpdGUgPSAqKG1uZ191aW50MzIqKSBhQnl0ZXM7CisgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb2s7IGRyb3AgaXQgaW4gdGhlcmUgKi8KKyAgZm9yIChpWCA9IChwRGF0YS0+aVNvdXJjZXIgLSBwRGF0YS0+aVNvdXJjZWwpOyBpWCA+IDA7IGlYLS0pCisgICAgKnBXb3JrMzIrKyA9IGlXcml0ZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9SRVNUT1JFX0JLR0QsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19yZXN0b3JlX2JrZ2RfYmdjb2xvciAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfaW50MzIgICBpWDsKKyAgbW5nX3VpbnQzMnAgcFdvcmszMiA9IChtbmdfdWludDMycClwRGF0YS0+cFJHQkFyb3c7CisgIG1uZ191aW50MzIgIGlXcml0ZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9SRVNUT1JFX0JHQ09MT1IsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworI2lmZGVmIE1OR19CSUdFTkRJQU5fU1VQUE9SVEVECisgIC8qIGZhc3Qgd2F5IGZvciBiaWcgZW5kaWFuICovCisgIGlXcml0ZSA9ICgoKG1uZ191aW50OCkocERhdGEtPmlCR3JlZCAgID4+IDgpKSA8PCAyNCkgfAorCQkgICAoKChtbmdfdWludDgpKHBEYXRhLT5pQkdncmVlbiA+PiA4KSkgPDwgMTYpIHwKKwkJICAgKCgobW5nX3VpbnQ4KShwRGF0YS0+aUJHYmx1ZSAgPj4gOCkpIDw8ICA4KTsKKyNlbGlmIGRlZmluZWQoTU5HX0xJVFRMRUVORElBTl9TVVBQT1JURUQpCisgIC8qIGZhc3Qgd2F5IGZvciBsaXR0bGUgZW5kaWFuICovCisgIGlXcml0ZSA9ICgoKG1uZ191aW50OCkocERhdGEtPmlCR2JsdWUgID4+IDgpKSA8PCAxNikgfAorCQkgICAoKChtbmdfdWludDgpKHBEYXRhLT5pQkdncmVlbiA+PiA4KSkgPDwgIDgpIHwKKwkJICAgKCgobW5nX3VpbnQ4KShwRGF0YS0+aUJHcmVkICAgPj4gOCkpICAgICAgKTsKKyNlbHNlCisgIC8qIGdlbmVyaWMgd2F5LCB3b3JrcyBvbiBhbGwgcGxhdGZvcm1zICovCisgIC8qIHB1dCB0aGUgZGF0YSBpbiBtZW1vcnkgaW4gdGhlIGNvcnJlY3Qgb3JkZXIgKi8KKyAgeworICAgIG1uZ191aW50OCBhQnl0ZXNbNF07CisgICAgYUJ5dGVzWzBdID0gKG1uZ191aW50OCkocERhdGEtPmlCR3JlZCAgID4+IDgpOworICAgIGFCeXRlc1sxXSA9IChtbmdfdWludDgpKHBEYXRhLT5pQkdncmVlbiA+PiA4KTsKKyAgICBhQnl0ZXNbMl0gPSAobW5nX3VpbnQ4KShwRGF0YS0+aUJHYmx1ZSAgPj4gOCk7CisgICAgYUJ5dGVzWzNdID0gMHgwMDsKKyAgICAvKiBsb2FkIHRoYXQgZGF0YSBpbnRvIGEgcmVnaXN0ZXIgKi8KKyAgICBpV3JpdGUgPSAqKG1uZ191aW50MzIqKSBhQnl0ZXM7CisgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb2s7IGRyb3AgdGhlIGJhY2tncm91bmQtY29sb3IgaW4gdGhlcmUgKi8KKyAgZm9yIChpWCA9IChwRGF0YS0+aVNvdXJjZXIgLSBwRGF0YS0+aVNvdXJjZWwpOyBpWCA+IDA7IGlYLS0pCisgICAgKnBXb3JrMzIrKyA9IGlXcml0ZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9SRVNUT1JFX0JHQ09MT1IsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0FOVkFTX1JHQjgKK21uZ19yZXRjb2RlIG1uZ19yZXN0b3JlX2JrZ2RfcmdiOCAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfaW50MzIgIGlYOworICBtbmdfdWludDhwIHBCa2dkOworICBtbmdfdWludDhwIHBXb3JrID0gcERhdGEtPnBSR0JBcm93OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1JFU1RPUkVfUkdCOCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmIChwRGF0YS0+ZkdldGJrZ2RsaW5lKSAgICAgICAgICAgICAvKiBjYW4gd2UgYWNjZXNzIHRoZSBiYWNrZ3JvdW5kID8gKi8KKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBvaW50IHRvIHRoZSByaWdodCBwaXhlbCB0aGVuICovCisgICAgcEJrZ2QgPSAobW5nX3VpbnQ4cClwRGF0YS0+ZkdldGJrZ2RsaW5lICgobW5nX2hhbmRsZSlwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pUm93ICsgcERhdGEtPmlEZXN0dCkgKworICAgICAgICAgICAgKDMgKiBwRGF0YS0+aURlc3RsKTsKKworICAgIGZvciAoaVggPSAocERhdGEtPmlTb3VyY2VyIC0gcERhdGEtPmlTb3VyY2VsKTsgaVggPiAwOyBpWC0tKQorICAgIHsKKyAgICAgICpwV29yayAgICAgPSAqcEJrZ2Q7ICAgICAgICAgICAgIC8qIG9rOyBjb3B5IHRoZSBwaXhlbCAqLworICAgICAgKihwV29yaysxKSA9ICoocEJrZ2QrMSk7CisgICAgICAqKHBXb3JrKzIpID0gKihwQmtnZCsyKTsKKyAgICAgICoocFdvcmsrMykgPSAweDAwOyAgICAgICAgICAgICAgIC8qIHRyYW5zcGFyYW50IGZvciBhbHBoYS1jYW52YXNzZXMgKi8KKworICAgICAgcFdvcmsgKz0gNDsKKyAgICAgIHBCa2dkICs9IDM7CisgICAgfQorICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVTVE9SRV9SR0I4LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZiAvKiBNTkdfU0tJUENBTlZBU19SR0I4ICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDQU5WQVNfQkdSOAorbW5nX3JldGNvZGUgbW5nX3Jlc3RvcmVfYmtnZF9iZ3I4IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ19pbnQzMiAgaVg7CisgIG1uZ191aW50OHAgcEJrZ2Q7CisgIG1uZ191aW50OHAgcFdvcmsgPSBwRGF0YS0+cFJHQkFyb3c7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVTVE9SRV9CR1I4LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKHBEYXRhLT5mR2V0YmtnZGxpbmUpICAgICAgICAgICAgIC8qIGNhbiB3ZSBhY2Nlc3MgdGhlIGJhY2tncm91bmQgPyAqLworICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcG9pbnQgdG8gdGhlIHJpZ2h0IHBpeGVsIHRoZW4gKi8KKyAgICBwQmtnZCA9IChtbmdfdWludDhwKXBEYXRhLT5mR2V0YmtnZGxpbmUgKChtbmdfaGFuZGxlKXBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlSb3cgKyBwRGF0YS0+aURlc3R0KSArCisgICAgICAgICAgICAoMyAqIHBEYXRhLT5pRGVzdGwpOworCisgICAgZm9yIChpWCA9IChwRGF0YS0+aVNvdXJjZXIgLSBwRGF0YS0+aVNvdXJjZWwpOyBpWCA+IDA7IGlYLS0pCisgICAgeworICAgICAgKnBXb3JrICAgICA9ICoocEJrZ2QrMik7ICAgICAgICAgLyogb2s7IGNvcHkgdGhlIHBpeGVsICovCisgICAgICAqKHBXb3JrKzEpID0gKihwQmtnZCsxKTsKKyAgICAgICoocFdvcmsrMikgPSAqcEJrZ2Q7CisgICAgICAqKHBXb3JrKzMpID0gMHgwMDsgICAgICAgICAgICAgICAvKiB0cmFuc3BhcmFudCBmb3IgYWxwaGEtY2FudmFzc2VzICovCisKKyAgICAgIHBXb3JrICs9IDQ7CisgICAgICBwQmtnZCArPSAzOworICAgIH0KKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1JFU1RPUkVfQkdSOCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYgLyogTU5HX1NLSVBDQU5WQVNfQkdSOCAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0FOVkFTX0JHUlg4CittbmdfcmV0Y29kZSBtbmdfcmVzdG9yZV9ia2dkX2Jncng4IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ19pbnQzMiAgaVg7CisgIG1uZ191aW50OHAgcEJrZ2Q7CisgIG1uZ191aW50OHAgcFdvcmsgPSBwRGF0YS0+cFJHQkFyb3c7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVTVE9SRV9CR1JYOCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmIChwRGF0YS0+ZkdldGJrZ2RsaW5lKSAgICAgICAgICAgICAvKiBjYW4gd2UgYWNjZXNzIHRoZSBiYWNrZ3JvdW5kID8gKi8KKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBvaW50IHRvIHRoZSByaWdodCBwaXhlbCB0aGVuICovCisgICAgcEJrZ2QgPSAobW5nX3VpbnQ4cClwRGF0YS0+ZkdldGJrZ2RsaW5lICgobW5nX2hhbmRsZSlwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pUm93ICsgcERhdGEtPmlEZXN0dCkgKworICAgICAgICAgICAgKDMgKiBwRGF0YS0+aURlc3RsKTsKKworICAgIGZvciAoaVggPSAocERhdGEtPmlTb3VyY2VyIC0gcERhdGEtPmlTb3VyY2VsKTsgaVggPiAwOyBpWC0tKQorICAgIHsKKyAgICAgICpwV29yayAgICAgPSAqKHBCa2dkKzIpOyAgICAgICAgIC8qIG9rOyBjb3B5IHRoZSBwaXhlbCAqLworICAgICAgKihwV29yaysxKSA9ICoocEJrZ2QrMSk7CisgICAgICAqKHBXb3JrKzIpID0gKnBCa2dkOworICAgICAgKihwV29yayszKSA9IDB4MDA7ICAgICAgICAgICAgICAgLyogdHJhbnNwYXJhbnQgZm9yIGFscGhhLWNhbnZhc3NlcyAqLworCisgICAgICBwV29yayArPSA0OworICAgICAgcEJrZ2QgKz0gNDsKKyAgICB9CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9SRVNUT1JFX0JHUlg4LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZiAvKiBNTkdfU0tJUENBTlZBU19CR1JYOCAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0FOVkFTX0JHUjU2NQorbW5nX3JldGNvZGUgbW5nX3Jlc3RvcmVfYmtnZF9iZ3I1NjUgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX2ludDMyICBpWDsKKyAgbW5nX3VpbnQ4cCBwQmtnZDsKKyAgbW5nX3VpbnQ4cCBwV29yayA9IHBEYXRhLT5wUkdCQXJvdzsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9SRVNUT1JFX0JHUjU2NSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmIChwRGF0YS0+ZkdldGJrZ2RsaW5lKSAgICAgICAgICAgICAvKiBjYW4gd2UgYWNjZXNzIHRoZSBiYWNrZ3JvdW5kID8gKi8KKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBvaW50IHRvIHRoZSByaWdodCBwaXhlbCB0aGVuICovCisgICAgcEJrZ2QgPSAobW5nX3VpbnQ4cClwRGF0YS0+ZkdldGJrZ2RsaW5lICgobW5nX2hhbmRsZSlwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5pUm93ICsgcERhdGEtPmlEZXN0dCkgKworICAgICAgICAgICAgKDMgKiBwRGF0YS0+aURlc3RsKTsKKworICAgIGZvciAoaVggPSAocERhdGEtPmlTb3VyY2VyIC0gcERhdGEtPmlTb3VyY2VsKTsgaVggPiAwOyBpWC0tKQorICAgIHsKKyAgICAgICpwV29yayAgICAgPSAobW5nX3VpbnQ4KSggICoocEJrZ2QrMSkgJiAweEY4KTsgICAgICAgICAgICAgLyogb2s7IGNvcHkgdGhlIHBpeGVsICovCisgICAgICAqKHBXb3JrKzEpID0gKG1uZ191aW50OCkoICgqKHBCa2dkKzEpIDw8IDUgKSAgfCAgKCAoKCpwQmtnZCkmMHhFMCk+PjMgKSApOworICAgICAgKihwV29yaysyKSA9IChtbmdfdWludDgpKCAgKihwQmtnZCkgPDwgMyApOworICAgICAgKihwV29yayszKSA9IDB4MDA7ICAgICAgICAgICAgICAgLyogdHJhbnNwYXJhbnQgZm9yIGFscGhhLWNhbnZhc3NlcyAqLworCisgICAgICBwV29yayArPSA0OworICAgICAgcEJrZ2QgKz0gMjsKKyAgICB9CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9SRVNUT1JFX0JHUjU2NSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYgLyogTU5HX1NLSVBDQU5WQVNfQkdSNTY1ICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDQU5WQVNfUkdCNTY1CittbmdfcmV0Y29kZSBtbmdfcmVzdG9yZV9ia2dkX3JnYjU2NSAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfaW50MzIgIGlYOworICBtbmdfdWludDhwIHBCa2dkOworICBtbmdfdWludDhwIHBXb3JrID0gcERhdGEtPnBSR0JBcm93OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1JFU1RPUkVfUkdCNTY1LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKHBEYXRhLT5mR2V0YmtnZGxpbmUpICAgICAgICAgICAgIC8qIGNhbiB3ZSBhY2Nlc3MgdGhlIGJhY2tncm91bmQgPyAqLworICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcG9pbnQgdG8gdGhlIHJpZ2h0IHBpeGVsIHRoZW4gKi8KKyAgICBwQmtnZCA9IChtbmdfdWludDhwKXBEYXRhLT5mR2V0YmtnZGxpbmUgKChtbmdfaGFuZGxlKXBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlSb3cgKyBwRGF0YS0+aURlc3R0KSArCisgICAgICAgICAgICAoMyAqIHBEYXRhLT5pRGVzdGwpOworCisgICAgZm9yIChpWCA9IChwRGF0YS0+aVNvdXJjZXIgLSBwRGF0YS0+aVNvdXJjZWwpOyBpWCA+IDA7IGlYLS0pCisgICAgeworICAgICAgKnBXb3JrICAgICA9IChtbmdfdWludDgpKCAgKihwQmtnZCkmMHhGOCk7ICAgICAgICAgICAgIC8qIG9rOyBjb3B5IHRoZSBwaXhlbCAqLworICAgICAgKihwV29yaysxKSA9IChtbmdfdWludDgpKCAoKihwQmtnZCsxKSA8PCA1KSAgfCAgKCAoKCpwQmtnZCkmMHhFMCk+PjMgKSApOworICAgICAgKihwV29yaysyKSA9IChtbmdfdWludDgpKCAgKihwQmtnZCsxKSA8PCAzKTsKKyAgICAgICoocFdvcmsrMykgPSAweDAwOyAgICAgICAgICAgICAgIC8qIHRyYW5zcGFyYW50IGZvciBhbHBoYS1jYW52YXNzZXMgKi8KKworICAgICAgcFdvcmsgKz0gNDsKKyAgICAgIHBCa2dkICs9IDI7CisgICAgfQorICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVTVE9SRV9SR0I1NjUsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmIC8qIE1OR19TS0lQQ0FOVkFTX1JCQjU2NSAqLworCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBSb3cgcmV0cmlldmFsIHJvdXRpbmVzIC0gcmV0cmlldmUgcHJvY2Vzc2VkICYgdW5jb21wcmVzc2VkIHJvdy1kYXRhICAgICogKi8KKy8qICogZnJvbSB0aGUgY3VycmVudCAib2JqZWN0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworLyogVE9ETzogYSBzZXJpb3VzIG9wdGltaXphdGlvbiBpcyB0byByZXRyaWV2ZSBvbmx5IHRob3NlIHBpeGVscyB0aGF0IHdpbGwKKyAgICAgICAgIGFjdHVhbGx5IGJlIGRpc3BsYXllZDsgdGhpcyB3b3VsZCByZXF1aXJlIGNoYW5nZXMgaW4KKyAgICAgICAgIHRoZSAiZGlzcGxheV9pbWFnZSIgcm91dGluZSAoaW4gbW5nX2Rpc3BsYXkuYykgJgorICAgICAgICAgYWxsIHRoZSAicmV0cmlldmVfeHh4IiByb3V0aW5lcyBiZWxvdyAmCisgICAgICAgICB0aGUgImRpc3BsYXlfeHh4IiByb3V0aW5lcyBhYm92ZSAhISEhIQorICAgICAgICAgTk9URSB0aGF0ICJjb3JyZWN0X3h4eCIgcm91dGluZXMgd291bGQgbm90IHJlcXVpcmUgbW9kaWZpY2F0aW9uICovCisKK21uZ19yZXRjb2RlIG1uZ19yZXRyaWV2ZV9nOCAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfaW1hZ2VkYXRhcCBwQnVmID0gKChtbmdfaW1hZ2VwKXBEYXRhLT5wUmV0cmlldmVvYmopLT5wSW1nYnVmOworICBtbmdfdWludDhwICAgICBwV29ya3JvdzsKKyAgbW5nX3VpbnQ4cCAgICAgcFJHQkFyb3c7CisgIG1uZ19pbnQzMiAgICAgIGlYOworICBtbmdfdWludDggICAgICBpRzsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9SRVRSSUVWRV9HOCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBSR0JBcm93ID0gcERhdGEtPnBSR0JBcm93OyAgICAgICAgICAvKiB0ZW1wb3Jhcnkgd29yayBwb2ludGVycyAqLworICBwV29ya3JvdyA9IHBCdWYtPnBJbWdkYXRhICsgKHBEYXRhLT5pUm93ICogcEJ1Zi0+aVJvd3NpemUpOworCisgIGlmIChwQnVmLT5iSGFzVFJOUykgICAgICAgICAgICAgICAgICAvKiB0Uk5TIGluIGJ1ZmZlciA/ICovCisgIHsKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgICAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgICB7CisgICAgICBpRyA9ICpwV29ya3JvdzsgICAgICAgICAgICAgICAgICAvKiBnZXQgdGhlIGdyYXktdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlzIGl0IHRyYW5zcGFyZW50ID8gKi8KKyAgICAgIGlmICgobW5nX3VpbnQxNilpRyA9PSBwQnVmLT5pVFJOU2dyYXkpCisgICAgICB7CisgICAgICAgICpwUkdCQXJvdyAgICAgPSAweDAwOyAgICAgICAgICAvKiBudXR0aW4gdG8gZGlzcGxheSAqLworICAgICAgICAqKHBSR0JBcm93KzEpID0gMHgwMDsKKyAgICAgICAgKihwUkdCQXJvdysyKSA9IDB4MDA7CisgICAgICAgICoocFJHQkFyb3crMykgPSAweDAwOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworI2lmbmRlZiBNTkdfTk9fMV8yXzRCSVRfU1VQUE9SVAorICAgICAgICBtbmdfdWludDggbXVsdGlwbGllcltdPXswLDI1NSw4NSwwLDE3LDAsMCwwLDF9OworICAgICAgICBpRyA9IChtbmdfdWludDgpKGlHICogbXVsdGlwbGllcltwQnVmLT5pQml0ZGVwdGhdKTsKKyNlbmRpZgorCisgICAgICAgICpwUkdCQXJvdyAgICAgPSBpRzsgICAgICAgICAgICAvKiBwdXQgaW4gaW50ZXJtZWRpYXRlIHJvdyAqLworICAgICAgICAqKHBSR0JBcm93KzEpID0gaUc7CisgICAgICAgICoocFJHQkFyb3crMikgPSBpRzsKKyAgICAgICAgKihwUkdCQXJvdyszKSA9IDB4RkY7CisgICAgICB9CisKKyAgICAgIHBXb3Jrcm93Kys7ICAgICAgICAgICAgICAgICAgICAgIC8qIG5leHQgcGl4ZWwgKi8KKyAgICAgIHBSR0JBcm93ICs9IDQ7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICAgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICAgIHsKKyNpZm5kZWYgTU5HX05PXzFfMl80QklUX1NVUFBPUlQKKyAgICAgIG1uZ191aW50OCBtdWx0aXBsaWVyW109ezAsMjU1LDg1LDAsMTcsMCwwLDAsMX07ICAgLyogTEJSIHNjYWxpbmcgKi8KKyAgICAgIGlHID0gKG1uZ191aW50OCkobXVsdGlwbGllcltwQnVmLT5pQml0ZGVwdGhdICogKnBXb3Jrcm93KTsKKyNlbHNlCisgICAgICBpRyA9ICpwV29ya3JvdzsgICAgICAgICAgICAgICAgICAvKiBnZXQgdGhlIGdyYXktdmFsdWUgKi8KKyNlbmRpZgorCisgICAgICAqcFJHQkFyb3cgICAgID0gaUc7ICAgICAgICAgICAgICAvKiBwdXQgaW4gaW50ZXJtZWRpYXRlIHJvdyAqLworICAgICAgKihwUkdCQXJvdysxKSA9IGlHOworICAgICAgKihwUkdCQXJvdysyKSA9IGlHOworICAgICAgKihwUkdCQXJvdyszKSA9IDB4RkY7CisKKyAgICAgIHBXb3Jrcm93Kys7ICAgICAgICAgICAgICAgICAgICAgIC8qIG5leHQgcGl4ZWwgKi8KKyAgICAgIHBSR0JBcm93ICs9IDQ7CisgICAgfQorICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVUUklFVkVfRzgsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCittbmdfcmV0Y29kZSBtbmdfcmV0cmlldmVfZzE2IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ19pbWFnZWRhdGFwIHBCdWYgPSAoKG1uZ19pbWFnZXApcERhdGEtPnBSZXRyaWV2ZW9iaiktPnBJbWdidWY7CisgIG1uZ191aW50OHAgICAgIHBXb3Jrcm93OworICBtbmdfdWludDhwICAgICBwUkdCQXJvdzsKKyAgbW5nX2ludDMyICAgICAgaVg7CisgIG1uZ191aW50MTYgICAgIGlHOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1JFVFJJRVZFX0cxNiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGVtcG9yYXJ5IHdvcmsgcG9pbnRlcnMgKi8KKyAgcFJHQkFyb3cgPSBwRGF0YS0+cFJHQkFyb3c7CisgIHBXb3Jrcm93ID0gcEJ1Zi0+cEltZ2RhdGEgKyAocERhdGEtPmlSb3cgKiBwQnVmLT5pUm93c2l6ZSk7CisKKyAgaWYgKHBCdWYtPmJIYXNUUk5TKSAgICAgICAgICAgICAgICAgIC8qIHRSTlMgaW4gYnVmZmVyID8gKi8KKyAgeworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICAgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICAgIHsKKyAgICAgIGlHID0gbW5nX2dldF91aW50MTYgKHBXb3Jrcm93KTsgIC8qIGdldCB0aGUgZ3JheS12YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaXMgaXQgdHJhbnNwYXJlbnQgPyAqLworICAgICAgaWYgKGlHID09IHBCdWYtPmlUUk5TZ3JheSkKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51dHRpbiB0byBkaXNwbGF5ICovCisgICAgICAgIG1uZ19wdXRfdWludDE2IChwUkdCQXJvdywgICAweDAwMDApOworICAgICAgICBtbmdfcHV0X3VpbnQxNiAocFJHQkFyb3crMiwgMHgwMDAwKTsKKyAgICAgICAgbW5nX3B1dF91aW50MTYgKHBSR0JBcm93KzQsIDB4MDAwMCk7CisgICAgICAgIG1uZ19wdXRfdWludDE2IChwUkdCQXJvdys2LCAweDAwMDApOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHV0IGluIGludGVybWVkaWF0ZSByb3cgKi8KKyAgICAgICAgbW5nX3B1dF91aW50MTYgKHBSR0JBcm93LCAgIGlHKTsKKyAgICAgICAgbW5nX3B1dF91aW50MTYgKHBSR0JBcm93KzIsIGlHKTsKKyAgICAgICAgbW5nX3B1dF91aW50MTYgKHBSR0JBcm93KzQsIGlHKTsKKyAgICAgICAgbW5nX3B1dF91aW50MTYgKHBSR0JBcm93KzYsIDB4RkZGRik7CisgICAgICB9CisKKyAgICAgIHBXb3Jrcm93ICs9IDI7ICAgICAgICAgICAgICAgICAgIC8qIG5leHQgcGl4ZWwgKi8KKyAgICAgIHBSR0JBcm93ICs9IDg7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICAgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICAgIHsKKyAgICAgIGlHID0gbW5nX2dldF91aW50MTYgKHBXb3Jrcm93KTsgIC8qIGdldCB0aGUgZ3JheS12YWx1ZSAqLworCisgICAgICBtbmdfcHV0X3VpbnQxNiAocFJHQkFyb3csICAgaUcpOyAvKiBhbmQgcHV0IGluIGludGVybWVkaWF0ZSByb3cgKi8KKyAgICAgIG1uZ19wdXRfdWludDE2IChwUkdCQXJvdysyLCBpRyk7CisgICAgICBtbmdfcHV0X3VpbnQxNiAocFJHQkFyb3crNCwgaUcpOworICAgICAgbW5nX3B1dF91aW50MTYgKHBSR0JBcm93KzYsIDB4RkZGRik7CisKKyAgICAgIHBXb3Jrcm93ICs9IDI7ICAgICAgICAgICAgICAgICAgLyogbmV4dCBwaXhlbCAqLworICAgICAgcFJHQkFyb3cgKz0gODsKKyAgICB9CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9SRVRSSUVWRV9HMTYsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19yZXRyaWV2ZV9yZ2I4IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ19pbWFnZWRhdGFwIHBCdWYgPSAoKG1uZ19pbWFnZXApcERhdGEtPnBSZXRyaWV2ZW9iaiktPnBJbWdidWY7CisgIG1uZ191aW50OHAgICAgIHBXb3Jrcm93OworICBtbmdfdWludDhwICAgICBwUkdCQXJvdzsKKyAgbW5nX2ludDMyICAgICAgaVg7CisgIG1uZ191aW50OCAgICAgIGlSLCBpRywgaUI7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVUUklFVkVfUkdCOCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBSR0JBcm93ID0gcERhdGEtPnBSR0JBcm93OyAgICAgICAgICAvKiB0ZW1wb3Jhcnkgd29yayBwb2ludGVycyAqLworICBwV29ya3JvdyA9IHBCdWYtPnBJbWdkYXRhICsgKHBEYXRhLT5pUm93ICogcEJ1Zi0+aVJvd3NpemUpOworCisgIGlmIChwQnVmLT5iSGFzVFJOUykgICAgICAgICAgICAgICAgICAvKiB0Uk5TIGluIGJ1ZmZlciA/ICovCisgIHsKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgICAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgICB7CisgICAgICBpUiA9ICpwV29ya3JvdzsgICAgICAgICAgICAgICAgICAvKiBnZXQgdGhlIHJnYi12YWx1ZXMgKi8KKyAgICAgIGlHID0gKihwV29ya3JvdysxKTsKKyAgICAgIGlCID0gKihwV29ya3JvdysyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlzIGl0IHRyYW5zcGFyZW50ID8gKi8KKyAgICAgIGlmICgoKG1uZ191aW50MTYpaVIgPT0gcEJ1Zi0+aVRSTlNyZWQgICkgJiYKKyAgICAgICAgICAoKG1uZ191aW50MTYpaUcgPT0gcEJ1Zi0+aVRSTlNncmVlbikgJiYKKyAgICAgICAgICAoKG1uZ191aW50MTYpaUIgPT0gcEJ1Zi0+aVRSTlNibHVlICkgICAgKQorICAgICAgeworICAgICAgICAqcFJHQkFyb3cgICAgID0gMHgwMDsgICAgICAgICAgLyogbm90aGluZyB0byBkaXNwbGF5ICovCisgICAgICAgICoocFJHQkFyb3crMSkgPSAweDAwOworICAgICAgICAqKHBSR0JBcm93KzIpID0gMHgwMDsKKyAgICAgICAgKihwUkdCQXJvdyszKSA9IDB4MDA7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICpwUkdCQXJvdyAgICAgPSBpUjsgICAgICAgICAgICAvKiBwdXQgaW4gaW50ZXJtZWRpYXRlIHJvdyAqLworICAgICAgICAqKHBSR0JBcm93KzEpID0gaUc7CisgICAgICAgICoocFJHQkFyb3crMikgPSBpQjsKKyAgICAgICAgKihwUkdCQXJvdyszKSA9IDB4RkY7CisgICAgICB9CisKKyAgICAgIHBXb3Jrcm93ICs9IDM7ICAgICAgICAgICAgICAgICAgIC8qIG5leHQgcGl4ZWwgKi8KKyAgICAgIHBSR0JBcm93ICs9IDQ7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICAgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICAgIHsKKyAgICAgICpwUkdCQXJvdyAgICAgPSAqcFdvcmtyb3c7ICAgICAgIC8qIGp1c3QgY29weSB0aGUgcGl4ZWwgKi8KKyAgICAgICoocFJHQkFyb3crMSkgPSAqKHBXb3Jrcm93KzEpOworICAgICAgKihwUkdCQXJvdysyKSA9ICoocFdvcmtyb3crMik7CisgICAgICAqKHBSR0JBcm93KzMpID0gMHhGRjsKKworICAgICAgcFdvcmtyb3cgKz0gMzsgICAgICAgICAgICAgICAgICAgLyogbmV4dCBwaXhlbCAqLworICAgICAgcFJHQkFyb3cgKz0gNDsKKyAgICB9CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9SRVRSSUVWRV9SR0I4LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorbW5nX3JldGNvZGUgbW5nX3JldHJpZXZlX3JnYjE2IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ19pbWFnZWRhdGFwIHBCdWYgPSAoKG1uZ19pbWFnZXApcERhdGEtPnBSZXRyaWV2ZW9iaiktPnBJbWdidWY7CisgIG1uZ191aW50OHAgICAgIHBXb3Jrcm93OworICBtbmdfdWludDhwICAgICBwUkdCQXJvdzsKKyAgbW5nX2ludDMyICAgICAgaVg7CisgIG1uZ191aW50MTYgICAgIGlSLCBpRywgaUI7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVUUklFVkVfUkdCMTYsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRlbXBvcmFyeSB3b3JrIHBvaW50ZXJzICovCisgIHBSR0JBcm93ID0gcERhdGEtPnBSR0JBcm93OworICBwV29ya3JvdyA9IHBCdWYtPnBJbWdkYXRhICsgKHBEYXRhLT5pUm93ICogcEJ1Zi0+aVJvd3NpemUpOworCisgIGlmIChwQnVmLT5iSGFzVFJOUykgICAgICAgICAgICAgICAgICAvKiB0Uk5TIGluIGJ1ZmZlciA/ICovCisgIHsKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgICAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgICB7CisgICAgICBpUiA9IG1uZ19nZXRfdWludDE2IChwV29ya3Jvdyk7ICAvKiBnZXQgdGhlIHJnYi12YWx1ZXMgKi8KKyAgICAgIGlHID0gbW5nX2dldF91aW50MTYgKHBXb3Jrcm93KzIpOworICAgICAgaUIgPSBtbmdfZ2V0X3VpbnQxNiAocFdvcmtyb3crNCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpcyBpdCB0cmFuc3BhcmVudCA/ICovCisgICAgICBpZiAoKGlSID09IHBCdWYtPmlUUk5TcmVkICApICYmCisgICAgICAgICAgKGlHID09IHBCdWYtPmlUUk5TZ3JlZW4pICYmCisgICAgICAgICAgKGlCID09IHBCdWYtPmlUUk5TYmx1ZSApICAgICkKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdGhpbmcgdG8gZGlzcGxheSAqLworICAgICAgICBtbmdfcHV0X3VpbnQxNiAocFJHQkFyb3csICAgMHgwMDAwKTsKKyAgICAgICAgbW5nX3B1dF91aW50MTYgKHBSR0JBcm93KzIsIDB4MDAwMCk7CisgICAgICAgIG1uZ19wdXRfdWludDE2IChwUkdCQXJvdys0LCAweDAwMDApOworICAgICAgICBtbmdfcHV0X3VpbnQxNiAocFJHQkFyb3crNiwgMHgwMDAwKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHB1dCBpbiBpbnRlcm1lZGlhdGUgcm93ICovCisgICAgICAgIG1uZ19wdXRfdWludDE2IChwUkdCQXJvdywgICBpUik7CisgICAgICAgIG1uZ19wdXRfdWludDE2IChwUkdCQXJvdysyLCBpRyk7CisgICAgICAgIG1uZ19wdXRfdWludDE2IChwUkdCQXJvdys0LCBpQik7CisgICAgICAgIG1uZ19wdXRfdWludDE2IChwUkdCQXJvdys2LCAweEZGRkYpOworICAgICAgfQorCisgICAgICBwV29ya3JvdyArPSA2OyAgICAgICAgICAgICAgICAgICAvKiBuZXh0IHBpeGVsICovCisgICAgICBwUkdCQXJvdyArPSA4OworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgICAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGp1c3QgY29weSB0aGUgcGl4ZWwgKi8KKyAgICAgIG1uZ19wdXRfdWludDE2IChwUkdCQXJvdywgICBtbmdfZ2V0X3VpbnQxNiAocFdvcmtyb3cgICkpOworICAgICAgbW5nX3B1dF91aW50MTYgKHBSR0JBcm93KzIsIG1uZ19nZXRfdWludDE2IChwV29ya3JvdysyKSk7CisgICAgICBtbmdfcHV0X3VpbnQxNiAocFJHQkFyb3crNCwgbW5nX2dldF91aW50MTYgKHBXb3Jrcm93KzQpKTsKKyAgICAgIG1uZ19wdXRfdWludDE2IChwUkdCQXJvdys2LCAweEZGRkYpOworCisgICAgICBwV29ya3JvdyArPSA2OyAgICAgICAgICAgICAgICAgICAvKiBuZXh0IHBpeGVsICovCisgICAgICBwUkdCQXJvdyArPSA4OworICAgIH0KKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1JFVFJJRVZFX1JHQjE2LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfcmV0cmlldmVfaWR4OCAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfaW1hZ2VkYXRhcCBwQnVmID0gKChtbmdfaW1hZ2VwKXBEYXRhLT5wUmV0cmlldmVvYmopLT5wSW1nYnVmOworICBtbmdfdWludDhwICAgICBwV29ya3JvdzsKKyAgbW5nX3VpbnQ4cCAgICAgcFJHQkFyb3c7CisgIG1uZ19pbnQzMiAgICAgIGlYOworICBtbmdfdWludDggICAgICBpUTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9SRVRSSUVWRV9JRFg4LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcFJHQkFyb3cgPSBwRGF0YS0+cFJHQkFyb3c7ICAgICAgICAgIC8qIHRlbXBvcmFyeSB3b3JrIHBvaW50ZXJzICovCisgIHBXb3Jrcm93ID0gcEJ1Zi0+cEltZ2RhdGEgKyAocERhdGEtPmlSb3cgKiBwQnVmLT5pUm93c2l6ZSk7CisKKyAgaWYgKHBCdWYtPmJIYXNUUk5TKSAgICAgICAgICAgICAgICAgIC8qIHRSTlMgaW4gYnVmZmVyID8gKi8KKyAgeworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICAgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICAgIHsKKyAgICAgIGlRID0gKnBXb3Jrcm93OyAgICAgICAgICAgICAgICAgIC8qIGdldCB0aGUgaW5kZXggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlzIGl0IHZhbGlkID8gKi8KKyAgICAgIGlmICgobW5nX3VpbnQzMilpUSA8IHBCdWYtPmlQTFRFY291bnQpCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwdXQgaW4gaW50ZXJtZWRpYXRlIHJvdyAqLworICAgICAgICAqcFJHQkFyb3cgICAgID0gcEJ1Zi0+YVBMVEVlbnRyaWVzIFtpUV0uaVJlZDsKKyAgICAgICAgKihwUkdCQXJvdysxKSA9IHBCdWYtPmFQTFRFZW50cmllcyBbaVFdLmlHcmVlbjsKKyAgICAgICAgKihwUkdCQXJvdysyKSA9IHBCdWYtPmFQTFRFZW50cmllcyBbaVFdLmlCbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHJhbnNwYXJlbmN5IGZvciB0aGlzIGluZGV4ID8gKi8KKyAgICAgICAgaWYgKChtbmdfdWludDMyKWlRIDwgcEJ1Zi0+aVRSTlNjb3VudCkKKyAgICAgICAgICAqKHBSR0JBcm93KzMpID0gcEJ1Zi0+YVRSTlNlbnRyaWVzIFtpUV07CisgICAgICAgIGVsc2UKKyAgICAgICAgICAqKHBSR0JBcm93KzMpID0gMHhGRjsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1BMVEVJTkRFWEVSUk9SKTsKKworICAgICAgcFdvcmtyb3crKzsgICAgICAgICAgICAgICAgICAgICAgLyogbmV4dCBwaXhlbCAqLworICAgICAgcFJHQkFyb3cgKz0gNDsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICAgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgICAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlSb3dzYW1wbGVzOyBpWCsrKQorI2VuZGlmCisgICAgeworICAgICAgaVEgPSAqcFdvcmtyb3c7ICAgICAgICAgICAgICAgICAgLyogZ2V0IHRoZSBpbmRleCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaXMgaXQgdmFsaWQgPyAqLworICAgICAgaWYgKChtbmdfdWludDMyKWlRIDwgcEJ1Zi0+aVBMVEVjb3VudCkKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHB1dCBpbiBpbnRlcm1lZGlhdGUgcm93ICovCisgICAgICAgICpwUkdCQXJvdyAgICAgPSBwQnVmLT5hUExURWVudHJpZXMgW2lRXS5pUmVkOworICAgICAgICAqKHBSR0JBcm93KzEpID0gcEJ1Zi0+YVBMVEVlbnRyaWVzIFtpUV0uaUdyZWVuOworICAgICAgICAqKHBSR0JBcm93KzIpID0gcEJ1Zi0+YVBMVEVlbnRyaWVzIFtpUV0uaUJsdWU7CisgICAgICAgICoocFJHQkFyb3crMykgPSAweEZGOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfUExURUlOREVYRVJST1IpOworCisgICAgICBwV29ya3JvdysrOyAgICAgICAgICAgICAgICAgICAgICAvKiBuZXh0IHBpeGVsICovCisgICAgICBwUkdCQXJvdyArPSA0OworICAgIH0KKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1JFVFJJRVZFX0lEWDgsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfcmV0cmlldmVfZ2E4IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ19pbWFnZWRhdGFwIHBCdWYgPSAoKG1uZ19pbWFnZXApcERhdGEtPnBSZXRyaWV2ZW9iaiktPnBJbWdidWY7CisgIG1uZ191aW50OHAgICAgIHBXb3Jrcm93OworICBtbmdfdWludDhwICAgICBwUkdCQXJvdzsKKyAgbW5nX2ludDMyICAgICAgaVg7CisgIG1uZ191aW50OCAgICAgIGlHOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1JFVFJJRVZFX0dBOCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBSR0JBcm93ID0gcERhdGEtPnBSR0JBcm93OyAgICAgICAgICAvKiB0ZW1wb3Jhcnkgd29yayBwb2ludGVycyAqLworICBwV29ya3JvdyA9IHBCdWYtPnBJbWdkYXRhICsgKHBEYXRhLT5pUm93ICogcEJ1Zi0+aVJvd3NpemUpOworCisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgeworICAgIGlHID0gKnBXb3Jrcm93OyAgICAgICAgICAgICAgICAgICAgLyogZ2V0IHRoZSBncmF5LXZhbHVlICovCisgICAgKnBSR0JBcm93ICAgICA9IGlHOyAgICAgICAgICAgICAgICAvKiBwdXQgaW4gaW50ZXJtZWRpYXRlIHJvdyAqLworICAgICoocFJHQkFyb3crMSkgPSBpRzsKKyAgICAqKHBSR0JBcm93KzIpID0gaUc7CisgICAgKihwUkdCQXJvdyszKSA9ICoocFdvcmtyb3crMSk7CisKKyAgICBwV29ya3JvdyArPSAyOyAgICAgICAgICAgICAgICAgICAgIC8qIG5leHQgcGl4ZWwgKi8KKyAgICBwUkdCQXJvdyArPSA0OworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVUUklFVkVfR0E4LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorbW5nX3JldGNvZGUgbW5nX3JldHJpZXZlX2dhMTYgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX2ltYWdlZGF0YXAgcEJ1ZiA9ICgobW5nX2ltYWdlcClwRGF0YS0+cFJldHJpZXZlb2JqKS0+cEltZ2J1ZjsKKyAgbW5nX3VpbnQ4cCAgICAgcFdvcmtyb3c7CisgIG1uZ191aW50OHAgICAgIHBSR0JBcm93OworICBtbmdfaW50MzIgICAgICBpWDsKKyAgbW5nX3VpbnQxNiAgICAgaUc7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVUUklFVkVfR0ExNiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGVtcG9yYXJ5IHdvcmsgcG9pbnRlcnMgKi8KKyAgcFJHQkFyb3cgPSBwRGF0YS0+cFJHQkFyb3c7CisgIHBXb3Jrcm93ID0gcEJ1Zi0+cEltZ2RhdGEgKyAocERhdGEtPmlSb3cgKiBwQnVmLT5pUm93c2l6ZSk7CisKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICB7CisgICAgaUcgPSBtbmdfZ2V0X3VpbnQxNiAocFdvcmtyb3cpOyAgICAvKiBnZXQgdGhlIGdyYXktdmFsdWUgKi8KKworICAgIG1uZ19wdXRfdWludDE2IChwUkdCQXJvdywgICBpRyk7ICAgLyogYW5kIHB1dCBpbiBpbnRlcm1lZGlhdGUgcm93ICovCisgICAgbW5nX3B1dF91aW50MTYgKHBSR0JBcm93KzIsIGlHKTsKKyAgICBtbmdfcHV0X3VpbnQxNiAocFJHQkFyb3crNCwgaUcpOworICAgIG1uZ19wdXRfdWludDE2IChwUkdCQXJvdys2LCBtbmdfZ2V0X3VpbnQxNiAocFdvcmtyb3crMikpOworCisgICAgcFdvcmtyb3cgKz0gNDsgICAgICAgICAgICAgICAgICAgICAvKiBuZXh0IHBpeGVsICovCisgICAgcFJHQkFyb3cgKz0gODsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1JFVFJJRVZFX0dBMTYsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19yZXRyaWV2ZV9yZ2JhOCAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfaW1hZ2VkYXRhcCBwQnVmID0gKChtbmdfaW1hZ2VwKXBEYXRhLT5wUmV0cmlldmVvYmopLT5wSW1nYnVmOworICBtbmdfdWludDhwICAgICBwV29ya3JvdzsKKyAgbW5nX3VpbnQ4cCAgICAgcFJHQkFyb3c7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVUUklFVkVfUkdCQTgsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBwUkdCQXJvdyA9IHBEYXRhLT5wUkdCQXJvdzsgICAgICAgICAgLyogdGVtcG9yYXJ5IHdvcmsgcG9pbnRlcnMgKi8KKyAgcFdvcmtyb3cgPSBwQnVmLT5wSW1nZGF0YSArIChwRGF0YS0+aVJvdyAqIHBCdWYtPmlSb3dzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNhbid0IGJlIGVhc2llciB0aGFuIHRoaXMgISAqLworICBNTkdfQ09QWSAocFJHQkFyb3csIHBXb3Jrcm93LCBwQnVmLT5pUm93c2l6ZSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVUUklFVkVfUkdCQTgsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCittbmdfcmV0Y29kZSBtbmdfcmV0cmlldmVfcmdiYTE2IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ19pbWFnZWRhdGFwIHBCdWYgPSAoKG1uZ19pbWFnZXApcERhdGEtPnBSZXRyaWV2ZW9iaiktPnBJbWdidWY7CisgIG1uZ191aW50OHAgICAgIHBXb3Jrcm93OworICBtbmdfdWludDhwICAgICBwUkdCQXJvdzsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9SRVRSSUVWRV9SR0JBMTYsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRlbXBvcmFyeSB3b3JrIHBvaW50ZXJzICovCisgIHBSR0JBcm93ID0gcERhdGEtPnBSR0JBcm93OworICBwV29ya3JvdyA9IHBCdWYtPnBJbWdkYXRhICsgKHBEYXRhLT5pUm93ICogcEJ1Zi0+aVJvd3NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2FuJ3QgYmUgZWFzaWVyIHRoYW4gdGhpcyAhICovCisgIE1OR19DT1BZIChwUkdCQXJvdywgcFdvcmtyb3csIHBCdWYtPmlSb3dzaXplKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9SRVRSSUVWRV9SR0JBMTYsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBSb3cgc3RvcmFnZSByb3V0aW5lcyAtIHN0b3JlIHByb2Nlc3NlZCAmIHVuY29tcHJlc3NlZCByb3ctZGF0YSAgICAgICAgICogKi8KKy8qICogaW50byB0aGUgY3VycmVudCAib2JqZWN0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fMV8yXzRCSVRfU1VQUE9SVAorbW5nX3JldGNvZGUgbW5nX3N0b3JlX2cxIChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ19pbWFnZWRhdGFwIHBCdWYgPSAobW5nX2ltYWdlZGF0YXApcERhdGEtPnBTdG9yZWJ1ZjsKKyAgbW5nX3VpbnQ4cCAgICAgcFdvcmtyb3c7CisgIG1uZ191aW50OHAgICAgIHBPdXRyb3c7CisgIG1uZ19pbnQzMiAgICAgIGlYOworICBtbmdfdWludDggICAgICBpQjsKKyAgbW5nX3VpbnQ4ICAgICAgaU07CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fU1RPUkVfRzEsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRlbXBvcmFyeSB3b3JrIHBvaW50ZXJzICovCisgIHBXb3Jrcm93ID0gcERhdGEtPnBXb3Jrcm93ICsgcERhdGEtPmlQaXhlbG9mczsKKyAgcE91dHJvdyAgPSBwQnVmLT5wSW1nZGF0YSArIChwRGF0YS0+aVJvdyAqIHBCdWYtPmlSb3dzaXplICAgKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocERhdGEtPmlDb2wgKiBwQnVmLT5pU2FtcGxlc2l6ZSk7CisgIGlNICAgICAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdGFydCBhdCBwaXhlbCAwICovCisgIGlCICAgICAgID0gMDsKKworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlSb3dzYW1wbGVzOyBpWCsrKQorI2VuZGlmCisgIHsKKyAgICBpZiAoIWlNKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1hc2sgdW5kZXJmbG93ID8gKi8KKyAgICB7CisgICAgICBpQiA9ICpwV29ya3JvdzsgICAgICAgICAgICAgICAgICAvKiBnZXQgbmV4dCBpbnB1dC1ieXRlICovCisgICAgICBwV29ya3JvdysrOworICAgICAgaU0gPSAweDgwOworICAgIH0KKworICAgIGlmIChpQiAmIGlNKSAgICAgICAgICAgICAgICAgICAgICAgLyogaXMgaXQgd2hpdGUgPyAqLworICAgICAgKnBPdXRyb3cgPSAweDAxOyAgICAgICAgICAgICAgICAgLyogd2hpdGUgKi8KKyAgICBlbHNlCisgICAgICAqcE91dHJvdyA9IDB4MDA7ICAgICAgICAgICAgICAgICAvKiBibGFjayAqLworCisgICAgcE91dHJvdyArPSBwRGF0YS0+aUNvbGluYzsgICAgICAgICAvKiBuZXh0IHBpeGVsICovCisgICAgaU0gPj49ICAxOworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fU1RPUkVfRzEsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfc3RvcmVfZzIgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX2ltYWdlZGF0YXAgcEJ1ZiA9IChtbmdfaW1hZ2VkYXRhcClwRGF0YS0+cFN0b3JlYnVmOworICBtbmdfdWludDhwICAgICBwV29ya3JvdzsKKyAgbW5nX3VpbnQ4cCAgICAgcE91dHJvdzsKKyAgbW5nX2ludDMyICAgICAgaVg7CisgIG1uZ191aW50OCAgICAgIGlCOworICBtbmdfdWludDggICAgICBpTTsKKyAgbW5nX3VpbnQzMiAgICAgaVM7CisgIG1uZ191aW50OCAgICAgIGlROworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1NUT1JFX0cyLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0ZW1wb3Jhcnkgd29yayBwb2ludGVycyAqLworICBwV29ya3JvdyA9IHBEYXRhLT5wV29ya3JvdyArIHBEYXRhLT5pUGl4ZWxvZnM7CisgIHBPdXRyb3cgID0gcEJ1Zi0+cEltZ2RhdGEgKyAocERhdGEtPmlSb3cgKiBwQnVmLT5pUm93c2l6ZSAgICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBEYXRhLT5pQ29sICogcEJ1Zi0+aVNhbXBsZXNpemUpOworICBpTSAgICAgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RhcnQgYXQgcGl4ZWwgMCAqLworICBpQiAgICAgICA9IDA7CisgIGlTICAgICAgID0gMDsKKworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlSb3dzYW1wbGVzOyBpWCsrKQorI2VuZGlmCisgIHsKKyAgICBpZiAoIWlNKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1hc2sgdW5kZXJmbG93ID8gKi8KKyAgICB7CisgICAgICBpQiA9ICpwV29ya3JvdzsgICAgICAgICAgICAgICAgICAvKiBnZXQgbmV4dCBpbnB1dC1ieXRlICovCisgICAgICBwV29ya3JvdysrOworICAgICAgaU0gPSAweEMwOworICAgICAgaVMgPSA2OworICAgIH0KKworICAgIGlRID0gKG1uZ191aW50OCkoKGlCICYgaU0pID4+IGlTKTsgLyogZ2V0IHRoZSBncmF5IGxldmVsICovCisgICAgKnBPdXRyb3cgPSBpUTsgICAgICAgICAgICAgICAgICAgICAvKiBwdXQgaW4gb2JqZWN0IGJ1ZmZlciAqLworCisgICAgcE91dHJvdyArPSBwRGF0YS0+aUNvbGluYzsgICAgICAgICAvKiBuZXh0IHBpeGVsICovCisgICAgaU0gPj49ICAyOworICAgIGlTIC09IDI7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9TVE9SRV9HMiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19zdG9yZV9nNCAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfaW1hZ2VkYXRhcCBwQnVmID0gKG1uZ19pbWFnZWRhdGFwKXBEYXRhLT5wU3RvcmVidWY7CisgIG1uZ191aW50OHAgICAgIHBXb3Jrcm93OworICBtbmdfdWludDhwICAgICBwT3V0cm93OworICBtbmdfaW50MzIgICAgICBpWDsKKyAgbW5nX3VpbnQ4ICAgICAgaUI7CisgIG1uZ191aW50OCAgICAgIGlNOworICBtbmdfdWludDMyICAgICBpUzsKKyAgbW5nX3VpbnQ4ICAgICAgaVE7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fU1RPUkVfRzQsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRlbXBvcmFyeSB3b3JrIHBvaW50ZXJzICovCisgIHBXb3Jrcm93ID0gcERhdGEtPnBXb3Jrcm93ICsgcERhdGEtPmlQaXhlbG9mczsKKyAgcE91dHJvdyAgPSBwQnVmLT5wSW1nZGF0YSArIChwRGF0YS0+aVJvdyAqIHBCdWYtPmlSb3dzaXplICAgKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocERhdGEtPmlDb2wgKiBwQnVmLT5pU2FtcGxlc2l6ZSk7CisgIGlNICAgICAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdGFydCBhdCBwaXhlbCAwICovCisgIGlCICAgICAgID0gMDsKKyAgaVMgICAgICAgPSAwOworCisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgeworICAgIGlmICghaU0pICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWFzayB1bmRlcmZsb3cgPyAqLworICAgIHsKKyAgICAgIGlCID0gKnBXb3Jrcm93OyAgICAgICAgICAgICAgICAgIC8qIGdldCBuZXh0IGlucHV0LWJ5dGUgKi8KKyAgICAgIHBXb3Jrcm93Kys7CisgICAgICBpTSA9IDB4RjA7CisgICAgICBpUyA9IDQ7CisgICAgfQorCisgICAgaVEgPSAobW5nX3VpbnQ4KSgoaUIgJiBpTSkgPj4gaVMpOyAvKiBnZXQgdGhlIGdyYXkgbGV2ZWwgKi8KKyAgICAqcE91dHJvdyA9IGlROyAgICAgICAgICAgICAgICAgICAgIC8qIHB1dCBpbiBvYmplY3QgYnVmZmVyICovCisKKyAgICBwT3V0cm93ICs9IHBEYXRhLT5pQ29saW5jOyAgICAgICAgIC8qIG5leHQgcGl4ZWwgKi8KKyAgICBpTSA+Pj0gIDQ7CisgICAgaVMgLT0gNDsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1NUT1JFX0c0LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfc3RvcmVfZzggKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX2ltYWdlZGF0YXAgcEJ1ZiA9IChtbmdfaW1hZ2VkYXRhcClwRGF0YS0+cFN0b3JlYnVmOworICBtbmdfdWludDhwICAgICBwV29ya3JvdzsKKyAgbW5nX3VpbnQ4cCAgICAgcE91dHJvdzsKKyAgbW5nX2ludDMyICAgICAgaVg7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fU1RPUkVfRzgsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRlbXBvcmFyeSB3b3JrIHBvaW50ZXJzICovCisgIHBXb3Jrcm93ID0gcERhdGEtPnBXb3Jrcm93ICsgcERhdGEtPmlQaXhlbG9mczsKKyAgcE91dHJvdyAgPSBwQnVmLT5wSW1nZGF0YSArIChwRGF0YS0+aVJvdyAqIHBCdWYtPmlSb3dzaXplICAgKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocERhdGEtPmlDb2wgKiBwQnVmLT5pU2FtcGxlc2l6ZSk7CisKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICB7CisgICAgKnBPdXRyb3cgPSAqcFdvcmtyb3c7ICAgICAgICAgICAgICAvKiBwdXQgaW4gb2JqZWN0IGJ1ZmZlciAqLworCisgICAgcE91dHJvdyArPSBwRGF0YS0+aUNvbGluYzsgICAgICAgICAvKiBuZXh0IHBpeGVsICovCisgICAgcFdvcmtyb3crKzsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1NUT1JFX0c4LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorbW5nX3JldGNvZGUgbW5nX3N0b3JlX2cxNiAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfaW1hZ2VkYXRhcCBwQnVmID0gKG1uZ19pbWFnZWRhdGFwKXBEYXRhLT5wU3RvcmVidWY7CisgIG1uZ191aW50OHAgICAgIHBXb3Jrcm93OworICBtbmdfdWludDhwICAgICBwT3V0cm93OworICBtbmdfaW50MzIgICAgICBpWDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9TVE9SRV9HMTYsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRlbXBvcmFyeSB3b3JrIHBvaW50ZXJzICovCisgIHBXb3Jrcm93ID0gcERhdGEtPnBXb3Jrcm93ICsgcERhdGEtPmlQaXhlbG9mczsKKyAgcE91dHJvdyAgPSBwQnVmLT5wSW1nZGF0YSArIChwRGF0YS0+aVJvdyAqIHBCdWYtPmlSb3dzaXplICAgKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocERhdGEtPmlDb2wgKiBwQnVmLT5pU2FtcGxlc2l6ZSk7CisKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29weSBpbnRvIG9iamVjdCBidWZmZXIgKi8KKyAgICBtbmdfcHV0X3VpbnQxNiAocE91dHJvdywgbW5nX2dldF91aW50MTYgKHBXb3Jrcm93KSk7CisKKyAgICBwT3V0cm93ICArPSAocERhdGEtPmlDb2xpbmMgPDwgMSk7IC8qIG5leHQgcGl4ZWwgKi8KKyAgICBwV29ya3JvdyArPSAyOworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fU1RPUkVfRzE2LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfc3RvcmVfcmdiOCAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfaW1hZ2VkYXRhcCBwQnVmID0gKG1uZ19pbWFnZWRhdGFwKXBEYXRhLT5wU3RvcmVidWY7CisgIG1uZ191aW50OHAgICAgIHBXb3Jrcm93OworICBtbmdfdWludDhwICAgICBwT3V0cm93OworICBtbmdfaW50MzIgICAgICBpWDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9TVE9SRV9SR0I4LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0ZW1wb3Jhcnkgd29yayBwb2ludGVycyAqLworICBwV29ya3JvdyA9IHBEYXRhLT5wV29ya3JvdyArIHBEYXRhLT5pUGl4ZWxvZnM7CisgIHBPdXRyb3cgID0gcEJ1Zi0+cEltZ2RhdGEgKyAocERhdGEtPmlSb3cgKiBwQnVmLT5pUm93c2l6ZSAgICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBEYXRhLT5pQ29sICogcEJ1Zi0+aVNhbXBsZXNpemUpOworCisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgeworICAgICpwT3V0cm93ICAgICA9ICpwV29ya3JvdzsgICAgICAgICAgLyogY29weSB0aGUgUkdCIGJ5dGVzICovCisgICAgKihwT3V0cm93KzEpID0gKihwV29ya3JvdysxKTsKKyAgICAqKHBPdXRyb3crMikgPSAqKHBXb3Jrcm93KzIpOworCisgICAgcFdvcmtyb3cgKz0gMzsgICAgICAgICAgICAgICAgICAgICAvKiBuZXh0IHBpeGVsICovCisgICAgcE91dHJvdyAgKz0gKHBEYXRhLT5pQ29saW5jICogMyk7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9TVE9SRV9SR0I4LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorbW5nX3JldGNvZGUgbW5nX3N0b3JlX3JnYjE2IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ19pbWFnZWRhdGFwIHBCdWYgPSAobW5nX2ltYWdlZGF0YXApcERhdGEtPnBTdG9yZWJ1ZjsKKyAgbW5nX3VpbnQ4cCAgICAgcFdvcmtyb3c7CisgIG1uZ191aW50OHAgICAgIHBPdXRyb3c7CisgIG1uZ19pbnQzMiAgICAgIGlYOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1NUT1JFX1JHQjE2LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0ZW1wb3Jhcnkgd29yayBwb2ludGVycyAqLworICBwV29ya3JvdyA9IHBEYXRhLT5wV29ya3JvdyArIHBEYXRhLT5pUGl4ZWxvZnM7CisgIHBPdXRyb3cgID0gcEJ1Zi0+cEltZ2RhdGEgKyAocERhdGEtPmlSb3cgKiBwQnVmLT5pUm93c2l6ZSAgICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBEYXRhLT5pQ29sICogcEJ1Zi0+aVNhbXBsZXNpemUpOworCisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgeworICAgIE1OR19DT1BZIChwT3V0cm93LCBwV29ya3JvdywgNik7ICAgLyogY29weSB0aGUgUkdCIGJ5dGVzICovCisKKyAgICBwV29ya3JvdyArPSA2OyAgICAgICAgICAgICAgICAgICAgIC8qIG5leHQgcGl4ZWwgKi8KKyAgICBwT3V0cm93ICArPSAocERhdGEtPmlDb2xpbmMgKiA2KTsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1NUT1JFX1JHQjE2LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19OT18xXzJfNEJJVF9TVVBQT1JUCittbmdfcmV0Y29kZSBtbmdfc3RvcmVfaWR4MSAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfaW1hZ2VkYXRhcCBwQnVmID0gKG1uZ19pbWFnZWRhdGFwKXBEYXRhLT5wU3RvcmVidWY7CisgIG1uZ191aW50OHAgICAgIHBXb3Jrcm93OworICBtbmdfdWludDhwICAgICBwT3V0cm93OworICBtbmdfaW50MzIgICAgICBpWDsKKyAgbW5nX3VpbnQ4ICAgICAgaUI7CisgIG1uZ191aW50OCAgICAgIGlNOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1NUT1JFX0lEWDEsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRlbXBvcmFyeSB3b3JrIHBvaW50ZXJzICovCisgIHBXb3Jrcm93ID0gcERhdGEtPnBXb3Jrcm93ICsgcERhdGEtPmlQaXhlbG9mczsKKyAgcE91dHJvdyAgPSBwQnVmLT5wSW1nZGF0YSArIChwRGF0YS0+aVJvdyAqIHBCdWYtPmlSb3dzaXplICAgKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocERhdGEtPmlDb2wgKiBwQnVmLT5pU2FtcGxlc2l6ZSk7CisgIGlNICAgICAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdGFydCBhdCBwaXhlbCAwICovCisgIGlCICAgICAgID0gMDsKKworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlSb3dzYW1wbGVzOyBpWCsrKQorI2VuZGlmCisgIHsKKyAgICBpZiAoIWlNKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1hc2sgdW5kZXJmbG93ID8gKi8KKyAgICB7CisgICAgICBpQiA9ICpwV29ya3JvdzsgICAgICAgICAgICAgICAgICAvKiBnZXQgbmV4dCBpbnB1dC1ieXRlICovCisgICAgICBwV29ya3JvdysrOworICAgICAgaU0gPSAweDgwOworICAgIH0KKworICAgIGlmIChpQiAmIGlNKSAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmUgdGhlIGluZGV4ICovCisgICAgICAqcE91dHJvdyA9IDB4MDE7CisgICAgZWxzZQorICAgICAgKnBPdXRyb3cgPSAweDAwOworCisgICAgcE91dHJvdyArPSBwRGF0YS0+aUNvbGluYzsgICAgICAgICAvKiBuZXh0IHBpeGVsICovCisgICAgaU0gPj49ICAxOworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fU1RPUkVfSURYMSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19zdG9yZV9pZHgyIChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ19pbWFnZWRhdGFwIHBCdWYgPSAobW5nX2ltYWdlZGF0YXApcERhdGEtPnBTdG9yZWJ1ZjsKKyAgbW5nX3VpbnQ4cCAgICAgcFdvcmtyb3c7CisgIG1uZ191aW50OHAgICAgIHBPdXRyb3c7CisgIG1uZ19pbnQzMiAgICAgIGlYOworICBtbmdfdWludDggICAgICBpQjsKKyAgbW5nX3VpbnQ4ICAgICAgaU07CisgIG1uZ191aW50MzIgICAgIGlTOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1NUT1JFX0lEWDIsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRlbXBvcmFyeSB3b3JrIHBvaW50ZXJzICovCisgIHBXb3Jrcm93ID0gcERhdGEtPnBXb3Jrcm93ICsgcERhdGEtPmlQaXhlbG9mczsKKyAgcE91dHJvdyAgPSBwQnVmLT5wSW1nZGF0YSArIChwRGF0YS0+aVJvdyAqIHBCdWYtPmlSb3dzaXplICAgKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocERhdGEtPmlDb2wgKiBwQnVmLT5pU2FtcGxlc2l6ZSk7CisgIGlNICAgICAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdGFydCBhdCBwaXhlbCAwICovCisgIGlCICAgICAgID0gMDsKKyAgaVMgICAgICAgPSAwOworCisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgeworICAgIGlmICghaU0pICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWFzayB1bmRlcmZsb3cgPyAqLworICAgIHsKKyAgICAgIGlCID0gKnBXb3Jrcm93OyAgICAgICAgICAgICAgICAgIC8qIGdldCBuZXh0IGlucHV0LWJ5dGUgKi8KKyAgICAgIHBXb3Jrcm93Kys7CisgICAgICBpTSA9IDB4QzA7CisgICAgICBpUyA9IDY7CisgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmUgdGhlIGluZGV4ICovCisgICAgKnBPdXRyb3cgPSAobW5nX3VpbnQ4KSgoaUIgJiBpTSkgPj4gaVMpOworCisgICAgcE91dHJvdyArPSBwRGF0YS0+aUNvbGluYzsgICAgICAgICAvKiBuZXh0IHBpeGVsICovCisgICAgaU0gPj49ICAyOworICAgIGlTIC09IDI7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9TVE9SRV9JRFgyLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX3N0b3JlX2lkeDQgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX2ltYWdlZGF0YXAgcEJ1ZiA9IChtbmdfaW1hZ2VkYXRhcClwRGF0YS0+cFN0b3JlYnVmOworICBtbmdfdWludDhwICAgICBwV29ya3JvdzsKKyAgbW5nX3VpbnQ4cCAgICAgcE91dHJvdzsKKyAgbW5nX2ludDMyICAgICAgaVg7CisgIG1uZ191aW50OCAgICAgIGlCOworICBtbmdfdWludDggICAgICBpTTsKKyAgbW5nX3VpbnQzMiAgICAgaVM7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fU1RPUkVfSURYNCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGVtcG9yYXJ5IHdvcmsgcG9pbnRlcnMgKi8KKyAgcFdvcmtyb3cgPSBwRGF0YS0+cFdvcmtyb3cgKyBwRGF0YS0+aVBpeGVsb2ZzOworICBwT3V0cm93ICA9IHBCdWYtPnBJbWdkYXRhICsgKHBEYXRhLT5pUm93ICogcEJ1Zi0+aVJvd3NpemUgICApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwRGF0YS0+aUNvbCAqIHBCdWYtPmlTYW1wbGVzaXplKTsKKyAgaU0gICAgICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0IGF0IHBpeGVsIDAgKi8KKyAgaUIgICAgICAgPSAwOworICBpUyAgICAgICA9IDA7CisKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICB7CisgICAgaWYgKCFpTSkgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXNrIHVuZGVyZmxvdyA/ICovCisgICAgeworICAgICAgaUIgPSAqcFdvcmtyb3c7ICAgICAgICAgICAgICAgICAgLyogZ2V0IG5leHQgaW5wdXQtYnl0ZSAqLworICAgICAgcFdvcmtyb3crKzsKKyAgICAgIGlNID0gMHhGMDsKKyAgICAgIGlTID0gNDsKKyAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZSB0aGUgaW5kZXggKi8KKyAgICAqcE91dHJvdyA9IChtbmdfdWludDgpKChpQiAmIGlNKSA+PiBpUyk7CisKKyAgICBwT3V0cm93ICs9IHBEYXRhLT5pQ29saW5jOyAgICAgICAgIC8qIG5leHQgcGl4ZWwgKi8KKyAgICBpTSA+Pj0gIDQ7CisgICAgaVMgLT0gNDsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1NUT1JFX0lEWDQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19zdG9yZV9pZHg4IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ19pbWFnZWRhdGFwIHBCdWYgPSAobW5nX2ltYWdlZGF0YXApcERhdGEtPnBTdG9yZWJ1ZjsKKyAgbW5nX3VpbnQ4cCAgICAgcFdvcmtyb3c7CisgIG1uZ191aW50OHAgICAgIHBPdXRyb3c7CisgIG1uZ19pbnQzMiAgICAgIGlYOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1NUT1JFX0lEWDgsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRlbXBvcmFyeSB3b3JrIHBvaW50ZXJzICovCisgIHBXb3Jrcm93ID0gcERhdGEtPnBXb3Jrcm93ICsgcERhdGEtPmlQaXhlbG9mczsKKyAgcE91dHJvdyAgPSBwQnVmLT5wSW1nZGF0YSArIChwRGF0YS0+aVJvdyAqIHBCdWYtPmlSb3dzaXplICAgKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocERhdGEtPmlDb2wgKiBwQnVmLT5pU2FtcGxlc2l6ZSk7CisKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICB7CisgICAgKnBPdXRyb3cgPSAqcFdvcmtyb3c7ICAgICAgICAgICAgICAvKiBwdXQgaW4gb2JqZWN0IGJ1ZmZlciAqLworCisgICAgcE91dHJvdyArPSBwRGF0YS0+aUNvbGluYzsgICAgICAgICAvKiBuZXh0IHBpeGVsICovCisgICAgcFdvcmtyb3crKzsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1NUT1JFX0lEWDgsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfc3RvcmVfZ2E4IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ19pbWFnZWRhdGFwIHBCdWYgPSAobW5nX2ltYWdlZGF0YXApcERhdGEtPnBTdG9yZWJ1ZjsKKyAgbW5nX3VpbnQ4cCAgICAgcFdvcmtyb3c7CisgIG1uZ191aW50OHAgICAgIHBPdXRyb3c7CisgIG1uZ19pbnQzMiAgICAgIGlYOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1NUT1JFX0dBOCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGVtcG9yYXJ5IHdvcmsgcG9pbnRlcnMgKi8KKyAgcFdvcmtyb3cgPSBwRGF0YS0+cFdvcmtyb3cgKyBwRGF0YS0+aVBpeGVsb2ZzOworICBwT3V0cm93ICA9IHBCdWYtPnBJbWdkYXRhICsgKHBEYXRhLT5pUm93ICogcEJ1Zi0+aVJvd3NpemUgICApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwRGF0YS0+aUNvbCAqIHBCdWYtPmlTYW1wbGVzaXplKTsKKworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlSb3dzYW1wbGVzOyBpWCsrKQorI2VuZGlmCisgIHsKKyAgICAqcE91dHJvdyAgICAgPSAqcFdvcmtyb3c7ICAgICAgICAgIC8qIGNvcHkgdGhlIEdBIGJ5dGVzICovCisgICAgKihwT3V0cm93KzEpID0gKihwV29ya3JvdysxKTsKKworICAgIHBXb3Jrcm93ICs9IDI7ICAgICAgICAgICAgICAgICAgICAgLyogbmV4dCBwaXhlbCAqLworICAgIHBPdXRyb3cgICs9IChwRGF0YS0+aUNvbGluYyA8PCAxKTsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1NUT1JFX0dBOCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKK21uZ19yZXRjb2RlIG1uZ19zdG9yZV9nYTE2IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ19pbWFnZWRhdGFwIHBCdWYgPSAobW5nX2ltYWdlZGF0YXApcERhdGEtPnBTdG9yZWJ1ZjsKKyAgbW5nX3VpbnQ4cCAgICAgcFdvcmtyb3c7CisgIG1uZ191aW50OHAgICAgIHBPdXRyb3c7CisgIG1uZ19pbnQzMiAgICAgIGlYOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1NUT1JFX0dBMTYsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRlbXBvcmFyeSB3b3JrIHBvaW50ZXJzICovCisgIHBXb3Jrcm93ID0gcERhdGEtPnBXb3Jrcm93ICsgcERhdGEtPmlQaXhlbG9mczsKKyAgcE91dHJvdyAgPSBwQnVmLT5wSW1nZGF0YSArIChwRGF0YS0+aVJvdyAqIHBCdWYtPmlSb3dzaXplICAgKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocERhdGEtPmlDb2wgKiBwQnVmLT5pU2FtcGxlc2l6ZSk7CisKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICB7CisgICAgTU5HX0NPUFkgKHBPdXRyb3csIHBXb3Jrcm93LCA0KTsgICAvKiBjb3B5IHRoZSBHQSBieXRlcyAqLworCisgICAgcFdvcmtyb3cgKz0gNDsgICAgICAgICAgICAgICAgICAgICAvKiBuZXh0IHBpeGVsICovCisgICAgcE91dHJvdyAgKz0gKHBEYXRhLT5pQ29saW5jIDw8IDIpOworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fU1RPUkVfR0ExNiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX3N0b3JlX3JnYmE4IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ19pbWFnZWRhdGFwIHBCdWYgPSAobW5nX2ltYWdlZGF0YXApcERhdGEtPnBTdG9yZWJ1ZjsKKyAgbW5nX3VpbnQ4cCAgICAgcFdvcmtyb3c7CisgIG1uZ191aW50OHAgICAgIHBPdXRyb3c7CisgIG1uZ19pbnQzMiAgICAgIGlYOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1NUT1JFX1JHQkE4LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0ZW1wb3Jhcnkgd29yayBwb2ludGVycyAqLworICBwV29ya3JvdyA9IHBEYXRhLT5wV29ya3JvdyArIHBEYXRhLT5pUGl4ZWxvZnM7CisgIHBPdXRyb3cgID0gcEJ1Zi0+cEltZ2RhdGEgKyAocERhdGEtPmlSb3cgKiBwQnVmLT5pUm93c2l6ZSAgICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBEYXRhLT5pQ29sICogcEJ1Zi0+aVNhbXBsZXNpemUpOworCisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgeworICAgICpwT3V0cm93ICAgICA9ICpwV29ya3JvdzsgICAgICAgICAgLyogY29weSB0aGUgUkdCQSBieXRlcyAqLworICAgICoocE91dHJvdysxKSA9ICoocFdvcmtyb3crMSk7CisgICAgKihwT3V0cm93KzIpID0gKihwV29ya3JvdysyKTsKKyAgICAqKHBPdXRyb3crMykgPSAqKHBXb3Jrcm93KzMpOworCisgICAgcFdvcmtyb3cgKz0gNDsgICAgICAgICAgICAgICAgICAgICAvKiBuZXh0IHBpeGVsICovCisgICAgcE91dHJvdyAgKz0gKHBEYXRhLT5pQ29saW5jIDw8IDIpOworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fU1RPUkVfUkdCQTgsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCittbmdfcmV0Y29kZSBtbmdfc3RvcmVfcmdiYTE2IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ19pbWFnZWRhdGFwIHBCdWYgPSAobW5nX2ltYWdlZGF0YXApcERhdGEtPnBTdG9yZWJ1ZjsKKyAgbW5nX3VpbnQ4cCAgICAgcFdvcmtyb3c7CisgIG1uZ191aW50OHAgICAgIHBPdXRyb3c7CisgIG1uZ19pbnQzMiAgICAgIGlYOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1NUT1JFX1JHQkExNiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGVtcG9yYXJ5IHdvcmsgcG9pbnRlcnMgKi8KKyAgcFdvcmtyb3cgPSBwRGF0YS0+cFdvcmtyb3cgKyBwRGF0YS0+aVBpeGVsb2ZzOworICBwT3V0cm93ICA9IHBCdWYtPnBJbWdkYXRhICsgKHBEYXRhLT5pUm93ICogcEJ1Zi0+aVJvd3NpemUgICApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwRGF0YS0+aUNvbCAqIHBCdWYtPmlTYW1wbGVzaXplKTsKKworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlSb3dzYW1wbGVzOyBpWCsrKQorI2VuZGlmCisgIHsKKyAgICBNTkdfQ09QWSAocE91dHJvdywgcFdvcmtyb3csIDgpOyAgIC8qIGNvcHkgdGhlIFJHQkEgYnl0ZXMgKi8KKworICAgIHBXb3Jrcm93ICs9IDg7ICAgICAgICAgICAgICAgICAgICAgLyogbmV4dCBwaXhlbCAqLworICAgIHBPdXRyb3cgICs9IChwRGF0YS0+aUNvbGluYyA8PCAzKTsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1NUT1JFX1JHQkExNiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIFJvdyBzdG9yYWdlIHJvdXRpbmVzIChKUEVHKSAtIHN0b3JlIHByb2Nlc3NlZCAmIHVuY29tcHJlc3NlZCByb3ctZGF0YSAgKiAqLworLyogKiBpbnRvIHRoZSBjdXJyZW50ICJvYmplY3QiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19zdG9yZV9qcGVnX2c4IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ19pbWFnZWRhdGFwIHBCdWYgPSAobW5nX2ltYWdlZGF0YXApcERhdGEtPnBTdG9yZWJ1ZjsKKyAgbW5nX3VpbnQ4cCAgICAgcFdvcmtyb3c7CisgIG1uZ191aW50OHAgICAgIHBPdXRyb3c7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fU1RPUkVfSlBFR19HOCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBXb3Jrcm93ID0gcERhdGEtPnBKUEVHcm93OyAgICAgICAgICAvKiB0ZW1wb3Jhcnkgd29yayBwb2ludGVycyAqLworICBwT3V0cm93ICA9IHBCdWYtPnBJbWdkYXRhICsgKHBEYXRhLT5pSlBFR3JvdyAqIHBCdWYtPmlSb3dzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVhc3kgYXMgcGllIC4uLiAqLworICBNTkdfQ09QWSAocE91dHJvdywgcFdvcmtyb3csIHBEYXRhLT5pUm93c2FtcGxlcyk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fU1RPUkVfSlBFR19HOCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gbW5nX25leHRfanBlZ19yb3cgKHBEYXRhKTsgICAgLyogd2UndmUgZ290IG9uZSBtb3JlIHJvdyBvZiBncmF5LXNhbXBsZXMgKi8KK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX3N0b3JlX2pwZWdfcmdiOCAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfaW1hZ2VkYXRhcCBwQnVmID0gKG1uZ19pbWFnZWRhdGFwKXBEYXRhLT5wU3RvcmVidWY7CisgIG1uZ191aW50OHAgICAgIHBXb3Jrcm93OworICBtbmdfdWludDhwICAgICBwT3V0cm93OworI2lmIFJHQl9QSVhFTFNJWkUgIT0gMworICBtbmdfaW50MzIgICAgICBpWDsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1NUT1JFX0pQRUdfUkdCOCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBXb3Jrcm93ID0gcERhdGEtPnBKUEVHcm93OyAgICAgICAgICAvKiB0ZW1wb3Jhcnkgd29yayBwb2ludGVycyAqLworICBwT3V0cm93ICA9IHBCdWYtPnBJbWdkYXRhICsgKHBEYXRhLT5pSlBFR3JvdyAqIHBCdWYtPmlSb3dzaXplKTsKKworI2lmIFJHQl9QSVhFTFNJWkUgPT0gMworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZWFzeSBhcyBwaWUgLi4uICovCisgIE1OR19DT1BZIChwT3V0cm93LCBwV29ya3JvdywgcERhdGEtPmlSb3dzYW1wbGVzICogMyk7CisjZWxzZQorI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlSb3dzYW1wbGVzOyBpWCsrKQorI2VuZGlmCisgIHsKKyAgICAqcE91dHJvdyAgICAgPSAqcFdvcmtyb3c7ICAgICAgICAgIC8qIGNvcHkgcGl4ZWwgaW50byBvYmplY3QgYnVmZmVyICovCisgICAgKihwT3V0cm93KzEpID0gKihwV29ya3JvdysxKTsKKyAgICAqKHBPdXRyb3crMikgPSAqKHBXb3Jrcm93KzIpOworCisgICAgcE91dHJvdyAgKz0gMzsgICAgICAgICAgICAgICAgICAgICAvKiBuZXh0IHBpeGVsICovCisgICAgcFdvcmtyb3cgKz0gUkdCX1BJWEVMU0laRTsKKyAgfQorI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fU1RPUkVfSlBFR19SR0I4LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBtbmdfbmV4dF9qcGVnX3JvdyAocERhdGEpOyAgICAvKiB3ZSd2ZSBnb3Qgb25lIG1vcmUgcm93IG9mIHJnYi1zYW1wbGVzICovCit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19zdG9yZV9qcGVnX2dhOCAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfaW1hZ2VkYXRhcCBwQnVmID0gKG1uZ19pbWFnZWRhdGFwKXBEYXRhLT5wU3RvcmVidWY7CisgIG1uZ191aW50OHAgICAgIHBXb3Jrcm93OworICBtbmdfdWludDhwICAgICBwT3V0cm93OworICBtbmdfaW50MzIgICAgICBpWDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9TVE9SRV9KUEVHX0dBOCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBXb3Jrcm93ID0gcERhdGEtPnBKUEVHcm93OyAgICAgICAgICAvKiB0ZW1wb3Jhcnkgd29yayBwb2ludGVycyAqLworICBwT3V0cm93ICA9IHBCdWYtPnBJbWdkYXRhICsgKHBEYXRhLT5pSlBFR3JvdyAqIHBCdWYtPmlSb3dzaXplKTsKKworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlSb3dzYW1wbGVzOyBpWCsrKQorI2VuZGlmCisgIHsKKyAgICAqcE91dHJvdyA9ICpwV29ya3JvdzsgICAgICAgICAgICAgIC8qIGNvcHkgaW50byBvYmplY3QgYnVmZmVyICovCisKKyAgICBwT3V0cm93ICs9IDI7ICAgICAgICAgICAgICAgICAgICAgIC8qIG5leHQgcGl4ZWwgKi8KKyAgICBwV29ya3JvdysrOworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fU1RPUkVfSlBFR19HQTgsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIG1uZ19uZXh0X2pwZWdfcm93IChwRGF0YSk7ICAgIC8qIHdlJ3ZlIGdvdCBvbmUgbW9yZSByb3cgb2YgZ3JheS1zYW1wbGVzICovCit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19zdG9yZV9qcGVnX3JnYmE4IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ19pbWFnZWRhdGFwIHBCdWYgPSAobW5nX2ltYWdlZGF0YXApcERhdGEtPnBTdG9yZWJ1ZjsKKyAgbW5nX3VpbnQ4cCAgICAgcFdvcmtyb3c7CisgIG1uZ191aW50OHAgICAgIHBPdXRyb3c7CisgIG1uZ19pbnQzMiAgICAgIGlYOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1NUT1JFX0pQRUdfUkdCQTgsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBwV29ya3JvdyA9IHBEYXRhLT5wSlBFR3JvdzsgICAgICAgICAgLyogdGVtcG9yYXJ5IHdvcmsgcG9pbnRlcnMgKi8KKyAgcE91dHJvdyAgPSBwQnVmLT5wSW1nZGF0YSArIChwRGF0YS0+aUpQRUdyb3cgKiBwQnVmLT5pUm93c2l6ZSk7CisKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICB7CisgICAgKnBPdXRyb3cgICAgID0gKnBXb3Jrcm93OyAgICAgICAgICAvKiBjb3B5IHBpeGVsIGludG8gb2JqZWN0IGJ1ZmZlciAqLworICAgICoocE91dHJvdysxKSA9ICoocFdvcmtyb3crMSk7CisgICAgKihwT3V0cm93KzIpID0gKihwV29ya3JvdysyKTsKKworICAgIHBPdXRyb3cgICs9IDQ7ICAgICAgICAgICAgICAgICAgICAgLyogbmV4dCBwaXhlbCAqLworICAgIHBXb3Jrcm93ICs9IFJHQl9QSVhFTFNJWkU7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9TVE9SRV9KUEVHX1JHQkE4LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBtbmdfbmV4dF9qcGVnX3JvdyAocERhdGEpOyAgICAvKiB3ZSd2ZSBnb3Qgb25lIG1vcmUgcm93IG9mIHJnYi1zYW1wbGVzICovCit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19zdG9yZV9qcGVnX2c4X2FscGhhIChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ19pbWFnZWRhdGFwIHBCdWYgPSAobW5nX2ltYWdlZGF0YXApcERhdGEtPnBTdG9yZWJ1ZjsKKyAgbW5nX3VpbnQ4cCAgICAgcFdvcmtyb3c7CisgIG1uZ191aW50OHAgICAgIHBPdXRyb3c7CisgIG1uZ19pbnQzMiAgICAgIGlYOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1NUT1JFX0pQRUdfRzhfQUxQSEEsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRlbXBvcmFyeSB3b3JrIHBvaW50ZXJzICovCisgIHBXb3Jrcm93ID0gcERhdGEtPnBKUEVHcm93MjsKKyAgcE91dHJvdyAgPSBwQnVmLT5wSW1nZGF0YSArIChwRGF0YS0+aUpQRUdhbHBoYXJvdyAqIHBCdWYtPmlSb3dzaXplKSArIDE7CisKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICB7CisgICAgKnBPdXRyb3cgPSAqcFdvcmtyb3c7ICAgICAgICAgICAgICAvKiBwdXQgaW4gb2JqZWN0IGJ1ZmZlciAqLworCisgICAgcE91dHJvdyArPSAyOyAgICAgICAgICAgICAgICAgICAgICAvKiBuZXh0IHBpeGVsICovCisgICAgcFdvcmtyb3crKzsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1NUT1JFX0pQRUdfRzhfQUxQSEEsIE1OR19MQ19FTkQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSd2ZSBnb3Qgb25lIG1vcmUgcm93IG9mIGFscGhhLXNhbXBsZXMgKi8KKyAgcmV0dXJuIG1uZ19uZXh0X2pwZWdfYWxwaGFyb3cgKHBEYXRhKTsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX3N0b3JlX2pwZWdfcmdiOF9hbHBoYSAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfaW1hZ2VkYXRhcCBwQnVmID0gKG1uZ19pbWFnZWRhdGFwKXBEYXRhLT5wU3RvcmVidWY7CisgIG1uZ191aW50OHAgICAgIHBXb3Jrcm93OworICBtbmdfdWludDhwICAgICBwT3V0cm93OworICBtbmdfaW50MzIgICAgICBpWDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9TVE9SRV9KUEVHX1JHQjhfQUxQSEEsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRlbXBvcmFyeSB3b3JrIHBvaW50ZXJzICovCisgIHBXb3Jrcm93ID0gcERhdGEtPnBKUEVHcm93MjsKKyAgcE91dHJvdyAgPSBwQnVmLT5wSW1nZGF0YSArIChwRGF0YS0+aUpQRUdhbHBoYXJvdyAqIHBCdWYtPmlSb3dzaXplKSArIDM7CisKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICB7CisgICAgKnBPdXRyb3cgPSAqcFdvcmtyb3c7ICAgICAgICAgICAgICAvKiBwdXQgaW4gb2JqZWN0IGJ1ZmZlciAqLworCisgICAgcE91dHJvdyArPSA0OyAgICAgICAgICAgICAgICAgICAgICAvKiBuZXh0IHBpeGVsICovCisgICAgcFdvcmtyb3crKzsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1NUT1JFX0pQRUdfUkdCOF9BTFBIQSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdlJ3ZlIGdvdCBvbmUgbW9yZSByb3cgb2YgYWxwaGEtc2FtcGxlcyAqLworICByZXR1cm4gbW5nX25leHRfanBlZ19hbHBoYXJvdyAocERhdGEpOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19OT18xXzJfNEJJVF9TVVBQT1JUCittbmdfcmV0Y29kZSBtbmdfc3RvcmVfanBlZ19nOF9hMSAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfaW1hZ2VkYXRhcCBwQnVmID0gKG1uZ19pbWFnZWRhdGFwKXBEYXRhLT5wU3RvcmVidWY7CisgIG1uZ191aW50OHAgICAgIHBXb3Jrcm93OworICBtbmdfdWludDhwICAgICBwT3V0cm93OworICBtbmdfaW50MzIgICAgICBpWDsKKyAgbW5nX3VpbnQ4ICAgICAgaUI7CisgIG1uZ191aW50OCAgICAgIGlNOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1NUT1JFX0pQRUdfRzhfQTEsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRlbXBvcmFyeSB3b3JrIHBvaW50ZXJzICovCisgIHBXb3Jrcm93ID0gcERhdGEtPnBXb3Jrcm93ICsgcERhdGEtPmlQaXhlbG9mczsKKyAgcE91dHJvdyAgPSBwQnVmLT5wSW1nZGF0YSArIChwRGF0YS0+aVJvdyAqIHBCdWYtPmlSb3dzaXplICAgKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocERhdGEtPmlDb2wgKiBwQnVmLT5pU2FtcGxlc2l6ZSkgKyAxOworICBpTSAgICAgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RhcnQgYXQgcGl4ZWwgMCAqLworICBpQiAgICAgICA9IDA7CisKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICB7CisgICAgaWYgKCFpTSkgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXNrIHVuZGVyZmxvdyA/ICovCisgICAgeworICAgICAgaUIgPSAqcFdvcmtyb3c7ICAgICAgICAgICAgICAgICAgLyogZ2V0IG5leHQgaW5wdXQtYnl0ZSAqLworICAgICAgcFdvcmtyb3crKzsKKyAgICAgIGlNID0gMHg4MDsKKyAgICB9CisKKyAgICBpZiAoaUIgJiBpTSkgICAgICAgICAgICAgICAgICAgICAgIC8qIGlzIGl0IG9wYXF1ZSA/ICovCisgICAgICAqcE91dHJvdyA9IDB4RkY7ICAgICAgICAgICAgICAgICAvKiBvcGFxdWUgKi8KKyAgICBlbHNlCisgICAgICAqcE91dHJvdyA9IDB4MDA7ICAgICAgICAgICAgICAgICAvKiB0cmFuc3BhcmVudCAqLworCisgICAgcE91dHJvdyArPSAyOyAgICAgICAgICAgICAgICAgICAgICAvKiBuZXh0IHBpeGVsICovCisgICAgaU0gPj49ICAxOworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fU1RPUkVfSlBFR19HOF9BMSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdlJ3ZlIGdvdCBvbmUgbW9yZSByb3cgb2YgYWxwaGEtc2FtcGxlcyAqLworICByZXR1cm4gbW5nX25leHRfanBlZ19hbHBoYXJvdyAocERhdGEpOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfc3RvcmVfanBlZ19nOF9hMiAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfaW1hZ2VkYXRhcCBwQnVmID0gKG1uZ19pbWFnZWRhdGFwKXBEYXRhLT5wU3RvcmVidWY7CisgIG1uZ191aW50OHAgICAgIHBXb3Jrcm93OworICBtbmdfdWludDhwICAgICBwT3V0cm93OworICBtbmdfaW50MzIgICAgICBpWDsKKyAgbW5nX3VpbnQ4ICAgICAgaUI7CisgIG1uZ191aW50OCAgICAgIGlNOworICBtbmdfdWludDMyICAgICBpUzsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9TVE9SRV9KUEVHX0c4X0EyLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0ZW1wb3Jhcnkgd29yayBwb2ludGVycyAqLworICBwV29ya3JvdyA9IHBEYXRhLT5wV29ya3JvdyArIHBEYXRhLT5pUGl4ZWxvZnM7CisgIHBPdXRyb3cgID0gcEJ1Zi0+cEltZ2RhdGEgKyAocERhdGEtPmlSb3cgKiBwQnVmLT5pUm93c2l6ZSAgICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBEYXRhLT5pQ29sICogcEJ1Zi0+aVNhbXBsZXNpemUpICsgMTsKKyAgaU0gICAgICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0IGF0IHBpeGVsIDAgKi8KKyAgaUIgICAgICAgPSAwOworICBpUyAgICAgICA9IDA7CisKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICB7CisgICAgaWYgKCFpTSkgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXNrIHVuZGVyZmxvdyA/ICovCisgICAgeworICAgICAgaUIgPSAqcFdvcmtyb3c7ICAgICAgICAgICAgICAgICAgLyogZ2V0IG5leHQgaW5wdXQtYnl0ZSAqLworICAgICAgcFdvcmtyb3crKzsKKyAgICAgIGlNID0gMHhDMDsKKyAgICAgIGlTID0gNjsKKyAgICB9CisKKyNpZmRlZiBNTkdfT1BUSU1JWkVfRk9PVFBSSU5UX1NXSVRDSAorICAgIHsKKyAgICAgIGNvbnN0IG1uZ191aW50OCAgYWxwaGFfbGV2ZWxbNF0gPSB7IDB4MDAsIDB4NTUsIDB4QUEsIDB4RkZ9OworICAgICAgICAqcE91dHJvdyA9IGFscGhhX2xldmVsWygoaUIgJiBpTSkgPj4gaVMpXSA7CisgICAgfQorI2Vsc2UKKyAgICBzd2l0Y2ggKChpQiAmIGlNKSA+PiBpUykgICAgICAgICAgIC8qIGRldGVybWluZSB0aGUgYWxwaGEgbGV2ZWwgKi8KKyAgICB7CisgICAgICBjYXNlIDB4MDMgOiB7ICpwT3V0cm93ID0gMHhGRjsgYnJlYWs7IH0KKyAgICAgIGNhc2UgMHgwMiA6IHsgKnBPdXRyb3cgPSAweEFBOyBicmVhazsgfQorICAgICAgY2FzZSAweDAxIDogeyAqcE91dHJvdyA9IDB4NTU7IGJyZWFrOyB9CisgICAgICBkZWZhdWx0ICAgOiB7ICpwT3V0cm93ID0gMHgwMDsgfQorICAgIH0KKyNlbmRpZgorCisgICAgcE91dHJvdyArPSAyOyAgICAgICAgICAgICAgICAgICAgICAvKiBuZXh0IHBpeGVsICovCisgICAgaU0gPj49ICAyOworICAgIGlTIC09IDI7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9TVE9SRV9KUEVHX0c4X0EyLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd2UndmUgZ290IG9uZSBtb3JlIHJvdyBvZiBhbHBoYS1zYW1wbGVzICovCisgIHJldHVybiBtbmdfbmV4dF9qcGVnX2FscGhhcm93IChwRGF0YSk7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19zdG9yZV9qcGVnX2c4X2E0IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ19pbWFnZWRhdGFwIHBCdWYgPSAobW5nX2ltYWdlZGF0YXApcERhdGEtPnBTdG9yZWJ1ZjsKKyAgbW5nX3VpbnQ4cCAgICAgcFdvcmtyb3c7CisgIG1uZ191aW50OHAgICAgIHBPdXRyb3c7CisgIG1uZ19pbnQzMiAgICAgIGlYOworICBtbmdfdWludDggICAgICBpQjsKKyAgbW5nX3VpbnQ4ICAgICAgaU07CisgIG1uZ191aW50MzIgICAgIGlTOworICBtbmdfdWludDggICAgICBpUTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9TVE9SRV9KUEVHX0c4X0E0LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0ZW1wb3Jhcnkgd29yayBwb2ludGVycyAqLworICBwV29ya3JvdyA9IHBEYXRhLT5wV29ya3JvdyArIHBEYXRhLT5pUGl4ZWxvZnM7CisgIHBPdXRyb3cgID0gcEJ1Zi0+cEltZ2RhdGEgKyAocERhdGEtPmlSb3cgKiBwQnVmLT5pUm93c2l6ZSAgICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBEYXRhLT5pQ29sICogcEJ1Zi0+aVNhbXBsZXNpemUpICsgMTsKKyAgaU0gICAgICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0IGF0IHBpeGVsIDAgKi8KKyAgaUIgICAgICAgPSAwOworICBpUyAgICAgICA9IDA7CisKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICB7CisgICAgaWYgKCFpTSkgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXNrIHVuZGVyZmxvdyA/ICovCisgICAgeworICAgICAgaUIgPSAqcFdvcmtyb3c7ICAgICAgICAgICAgICAgICAgLyogZ2V0IG5leHQgaW5wdXQtYnl0ZSAqLworICAgICAgcFdvcmtyb3crKzsKKyAgICAgIGlNID0gMHhGMDsKKyAgICAgIGlTID0gNDsKKyAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgdGhlIGFscGhhIGxldmVsICovCisgICAgaVEgPSAobW5nX3VpbnQ4KSgoaUIgJiBpTSkgPj4gaVMpOworICAgIGlRID0gKG1uZ191aW50OCkoaVEgKyAoaVEgPDwgNCkpOyAgLyogZXhwYW5kIHRvIDgtYml0IGJ5IHJlcGxpY2F0aW9uICovCisKKyAgICAqcE91dHJvdyA9IGlROyAgICAgICAgICAgICAgICAgICAgIC8qIHB1dCBpbiBvYmplY3QgYnVmZmVyICovCisKKyAgICBwT3V0cm93ICs9IDI7ICAgICAgICAgICAgICAgICAgICAgIC8qIG5leHQgcGl4ZWwgKi8KKyAgICBpTSA+Pj0gIDQ7CisgICAgaVMgLT0gNDsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1NUT1JFX0pQRUdfRzhfQTQsIE1OR19MQ19FTkQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSd2ZSBnb3Qgb25lIG1vcmUgcm93IG9mIGFscGhhLXNhbXBsZXMgKi8KKyAgcmV0dXJuIG1uZ19uZXh0X2pwZWdfYWxwaGFyb3cgKHBEYXRhKTsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfc3RvcmVfanBlZ19nOF9hOCAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfaW1hZ2VkYXRhcCBwQnVmID0gKG1uZ19pbWFnZWRhdGFwKXBEYXRhLT5wU3RvcmVidWY7CisgIG1uZ191aW50OHAgICAgIHBXb3Jrcm93OworICBtbmdfdWludDhwICAgICBwT3V0cm93OworICBtbmdfaW50MzIgICAgICBpWDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9TVE9SRV9KUEVHX0c4X0E4LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0ZW1wb3Jhcnkgd29yayBwb2ludGVycyAqLworICBwV29ya3JvdyA9IHBEYXRhLT5wV29ya3JvdyArIHBEYXRhLT5pUGl4ZWxvZnM7CisgIHBPdXRyb3cgID0gcEJ1Zi0+cEltZ2RhdGEgKyAocERhdGEtPmlSb3cgKiBwQnVmLT5pUm93c2l6ZSAgICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBEYXRhLT5pQ29sICogcEJ1Zi0+aVNhbXBsZXNpemUpICsgMTsKKworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlSb3dzYW1wbGVzOyBpWCsrKQorI2VuZGlmCisgIHsKKyAgICAqcE91dHJvdyA9ICpwV29ya3JvdzsgICAgICAgICAgICAgIC8qIHB1dCBpbiBvYmplY3QgYnVmZmVyICovCisKKyAgICBwT3V0cm93ICs9IDI7ICAgICAgICAgICAgICAgICAgICAgIC8qIG5leHQgcGl4ZWwgKi8KKyAgICBwV29ya3JvdysrOworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fU1RPUkVfSlBFR19HOF9BOCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdlJ3ZlIGdvdCBvbmUgbW9yZSByb3cgb2YgYWxwaGEtc2FtcGxlcyAqLworICByZXR1cm4gbW5nX25leHRfanBlZ19hbHBoYXJvdyAocERhdGEpOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCittbmdfcmV0Y29kZSBtbmdfc3RvcmVfanBlZ19nOF9hMTYgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX2ltYWdlZGF0YXAgcEJ1ZiA9IChtbmdfaW1hZ2VkYXRhcClwRGF0YS0+cFN0b3JlYnVmOworICBtbmdfdWludDhwICAgICBwV29ya3JvdzsKKyAgbW5nX3VpbnQ4cCAgICAgcE91dHJvdzsKKyAgbW5nX2ludDMyICAgICAgaVg7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fU1RPUkVfSlBFR19HOF9BMTYsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRlbXBvcmFyeSB3b3JrIHBvaW50ZXJzICovCisgIHBXb3Jrcm93ID0gcERhdGEtPnBXb3Jrcm93ICsgcERhdGEtPmlQaXhlbG9mczsKKyAgcE91dHJvdyAgPSBwQnVmLT5wSW1nZGF0YSArIChwRGF0YS0+aVJvdyAqIHBCdWYtPmlSb3dzaXplICAgKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocERhdGEtPmlDb2wgKiBwQnVmLT5pU2FtcGxlc2l6ZSkgKyAxOworCisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgeworICAgICpwT3V0cm93ID0gKnBXb3Jrcm93OyAgICAgICAgICAgICAgLyogb25seSBoaWdoLW9yZGVyIGJ5dGUhICovCisKKyAgICBwT3V0cm93ICArPSAyOyAgICAgICAgICAgICAgICAgICAgIC8qIG5leHQgcGl4ZWwgKi8KKyAgICBwV29ya3JvdyArPSAyOworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fU1RPUkVfSlBFR19HOF9BMTYsIE1OR19MQ19FTkQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSd2ZSBnb3Qgb25lIG1vcmUgcm93IG9mIGFscGhhLXNhbXBsZXMgKi8KKyAgcmV0dXJuIG1uZ19uZXh0X2pwZWdfYWxwaGFyb3cgKHBEYXRhKTsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19OT18xXzJfNEJJVF9TVVBQT1JUCittbmdfcmV0Y29kZSBtbmdfc3RvcmVfanBlZ19yZ2I4X2ExIChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ19pbWFnZWRhdGFwIHBCdWYgPSAobW5nX2ltYWdlZGF0YXApcERhdGEtPnBTdG9yZWJ1ZjsKKyAgbW5nX3VpbnQ4cCAgICAgcFdvcmtyb3c7CisgIG1uZ191aW50OHAgICAgIHBPdXRyb3c7CisgIG1uZ19pbnQzMiAgICAgIGlYOworICBtbmdfdWludDggICAgICBpQjsKKyAgbW5nX3VpbnQ4ICAgICAgaU07CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fU1RPUkVfSlBFR19SR0I4X0ExLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0ZW1wb3Jhcnkgd29yayBwb2ludGVycyAqLworICBwV29ya3JvdyA9IHBEYXRhLT5wV29ya3JvdyArIHBEYXRhLT5pUGl4ZWxvZnM7CisgIHBPdXRyb3cgID0gcEJ1Zi0+cEltZ2RhdGEgKyAocERhdGEtPmlSb3cgKiBwQnVmLT5pUm93c2l6ZSAgICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBEYXRhLT5pQ29sICogcEJ1Zi0+aVNhbXBsZXNpemUpICsgMzsKKyAgaU0gICAgICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0IGF0IHBpeGVsIDAgKi8KKyAgaUIgICAgICAgPSAwOworCisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgeworICAgIGlmICghaU0pICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWFzayB1bmRlcmZsb3cgPyAqLworICAgIHsKKyAgICAgIGlCID0gKnBXb3Jrcm93OyAgICAgICAgICAgICAgICAgIC8qIGdldCBuZXh0IGlucHV0LWJ5dGUgKi8KKyAgICAgIHBXb3Jrcm93Kys7CisgICAgICBpTSA9IDB4ODA7CisgICAgfQorCisgICAgaWYgKGlCICYgaU0pICAgICAgICAgICAgICAgICAgICAgICAvKiBpcyBpdCBvcGFxdWUgPyAqLworICAgICAgKnBPdXRyb3cgPSAweEZGOyAgICAgICAgICAgICAgICAgLyogb3BhcXVlICovCisgICAgZWxzZQorICAgICAgKnBPdXRyb3cgPSAweDAwOyAgICAgICAgICAgICAgICAgLyogdHJhbnNwYXJlbnQgKi8KKworICAgIHBPdXRyb3cgKz0gNDsgICAgICAgICAgICAgICAgICAgICAgLyogbmV4dCBwaXhlbCAqLworICAgIGlNID4+PSAgMTsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1NUT1JFX0pQRUdfUkdCOF9BMSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdlJ3ZlIGdvdCBvbmUgbW9yZSByb3cgb2YgYWxwaGEtc2FtcGxlcyAqLworICByZXR1cm4gbW5nX25leHRfanBlZ19hbHBoYXJvdyAocERhdGEpOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfc3RvcmVfanBlZ19yZ2I4X2EyIChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ19pbWFnZWRhdGFwIHBCdWYgPSAobW5nX2ltYWdlZGF0YXApcERhdGEtPnBTdG9yZWJ1ZjsKKyAgbW5nX3VpbnQ4cCAgICAgcFdvcmtyb3c7CisgIG1uZ191aW50OHAgICAgIHBPdXRyb3c7CisgIG1uZ19pbnQzMiAgICAgIGlYOworICBtbmdfdWludDggICAgICBpQjsKKyAgbW5nX3VpbnQ4ICAgICAgaU07CisgIG1uZ191aW50MzIgICAgIGlTOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1NUT1JFX0pQRUdfUkdCOF9BMiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGVtcG9yYXJ5IHdvcmsgcG9pbnRlcnMgKi8KKyAgcFdvcmtyb3cgPSBwRGF0YS0+cFdvcmtyb3cgKyBwRGF0YS0+aVBpeGVsb2ZzOworICBwT3V0cm93ICA9IHBCdWYtPnBJbWdkYXRhICsgKHBEYXRhLT5pUm93ICogcEJ1Zi0+aVJvd3NpemUgICApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwRGF0YS0+aUNvbCAqIHBCdWYtPmlTYW1wbGVzaXplKSArIDM7CisgIGlNICAgICAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdGFydCBhdCBwaXhlbCAwICovCisgIGlCICAgICAgID0gMDsKKyAgaVMgICAgICAgPSAwOworCisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgeworICAgIGlmICghaU0pICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWFzayB1bmRlcmZsb3cgPyAqLworICAgIHsKKyAgICAgIGlCID0gKnBXb3Jrcm93OyAgICAgICAgICAgICAgICAgIC8qIGdldCBuZXh0IGlucHV0LWJ5dGUgKi8KKyAgICAgIHBXb3Jrcm93Kys7CisgICAgICBpTSA9IDB4QzA7CisgICAgICBpUyA9IDY7CisgICAgfQorCisjaWZkZWYgTU5HX09QVElNSVpFX0ZPT1RQUklOVF9TV0lUQ0gKKyAgICB7CisgICAgICBjb25zdCBtbmdfdWludDggIGFscGhhX2xldmVsWzRdID0geyAweDAwLCAweDU1LCAweEFBLCAweEZGfTsKKyAgICAgICpwT3V0cm93ID0gYWxwaGFfbGV2ZWxbKChpQiAmIGlNKSA+PiBpUyldIDsKKyAgICB9CisjZWxzZQorICAgIHN3aXRjaCAoKGlCICYgaU0pID4+IGlTKSAgICAgICAgICAgLyogZGV0ZXJtaW5lIHRoZSBhbHBoYSBsZXZlbCAqLworICAgIHsKKyAgICAgIGNhc2UgMHgwMyA6IHsgKnBPdXRyb3cgPSAweEZGOyBicmVhazsgfQorICAgICAgY2FzZSAweDAyIDogeyAqcE91dHJvdyA9IDB4QUE7IGJyZWFrOyB9CisgICAgICBjYXNlIDB4MDEgOiB7ICpwT3V0cm93ID0gMHg1NTsgYnJlYWs7IH0KKyAgICAgIGRlZmF1bHQgICA6IHsgKnBPdXRyb3cgPSAweDAwOyB9CisgICAgfQorI2VuZGlmCisKKyAgICBwT3V0cm93ICs9IDQ7ICAgICAgICAgICAgICAgICAgICAgIC8qIG5leHQgcGl4ZWwgKi8KKyAgICBpTSA+Pj0gIDI7CisgICAgaVMgLT0gMjsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1NUT1JFX0pQRUdfUkdCOF9BMiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdlJ3ZlIGdvdCBvbmUgbW9yZSByb3cgb2YgYWxwaGEtc2FtcGxlcyAqLworICByZXR1cm4gbW5nX25leHRfanBlZ19hbHBoYXJvdyAocERhdGEpOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfc3RvcmVfanBlZ19yZ2I4X2E0IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ19pbWFnZWRhdGFwIHBCdWYgPSAobW5nX2ltYWdlZGF0YXApcERhdGEtPnBTdG9yZWJ1ZjsKKyAgbW5nX3VpbnQ4cCAgICAgcFdvcmtyb3c7CisgIG1uZ191aW50OHAgICAgIHBPdXRyb3c7CisgIG1uZ19pbnQzMiAgICAgIGlYOworICBtbmdfdWludDggICAgICBpQjsKKyAgbW5nX3VpbnQ4ICAgICAgaU07CisgIG1uZ191aW50MzIgICAgIGlTOworICBtbmdfdWludDggICAgICBpUTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9TVE9SRV9KUEVHX1JHQjhfQTQsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRlbXBvcmFyeSB3b3JrIHBvaW50ZXJzICovCisgIHBXb3Jrcm93ID0gcERhdGEtPnBXb3Jrcm93ICsgcERhdGEtPmlQaXhlbG9mczsKKyAgcE91dHJvdyAgPSBwQnVmLT5wSW1nZGF0YSArIChwRGF0YS0+aVJvdyAqIHBCdWYtPmlSb3dzaXplICAgKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocERhdGEtPmlDb2wgKiBwQnVmLT5pU2FtcGxlc2l6ZSkgKyAzOworICBpTSAgICAgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RhcnQgYXQgcGl4ZWwgMCAqLworICBpQiAgICAgICA9IDA7CisgIGlTICAgICAgID0gMDsKKworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlSb3dzYW1wbGVzOyBpWCsrKQorI2VuZGlmCisgIHsKKyAgICBpZiAoIWlNKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1hc2sgdW5kZXJmbG93ID8gKi8KKyAgICB7CisgICAgICBpQiA9ICpwV29ya3JvdzsgICAgICAgICAgICAgICAgICAvKiBnZXQgbmV4dCBpbnB1dC1ieXRlICovCisgICAgICBwV29ya3JvdysrOworICAgICAgaU0gPSAweEYwOworICAgICAgaVMgPSA0OworICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCB0aGUgYWxwaGEgbGV2ZWwgKi8KKyAgICBpUSA9IChtbmdfdWludDgpKChpQiAmIGlNKSA+PiBpUyk7CisgICAgaVEgPSAobW5nX3VpbnQ4KShpUSArIChpUSA8PCA0KSk7ICAvKiBleHBhbmQgdG8gOC1iaXQgYnkgcmVwbGljYXRpb24gKi8KKworICAgICpwT3V0cm93ID0gaVE7ICAgICAgICAgICAgICAgICAgICAgLyogcHV0IGluIG9iamVjdCBidWZmZXIgKi8KKworICAgIHBPdXRyb3cgKz0gNDsgICAgICAgICAgICAgICAgICAgICAgLyogbmV4dCBwaXhlbCAqLworICAgIGlNID4+PSAgNDsKKyAgICBpUyAtPSA0OworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fU1RPUkVfSlBFR19SR0I4X0E0LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd2UndmUgZ290IG9uZSBtb3JlIHJvdyBvZiBhbHBoYS1zYW1wbGVzICovCisgIHJldHVybiBtbmdfbmV4dF9qcGVnX2FscGhhcm93IChwRGF0YSk7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX3N0b3JlX2pwZWdfcmdiOF9hOCAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfaW1hZ2VkYXRhcCBwQnVmID0gKG1uZ19pbWFnZWRhdGFwKXBEYXRhLT5wU3RvcmVidWY7CisgIG1uZ191aW50OHAgICAgIHBXb3Jrcm93OworICBtbmdfdWludDhwICAgICBwT3V0cm93OworICBtbmdfaW50MzIgICAgICBpWDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9TVE9SRV9KUEVHX1JHQjhfQTgsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRlbXBvcmFyeSB3b3JrIHBvaW50ZXJzICovCisgIHBXb3Jrcm93ID0gcERhdGEtPnBXb3Jrcm93ICsgcERhdGEtPmlQaXhlbG9mczsKKyAgcE91dHJvdyAgPSBwQnVmLT5wSW1nZGF0YSArIChwRGF0YS0+aVJvdyAqIHBCdWYtPmlSb3dzaXplICAgKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocERhdGEtPmlDb2wgKiBwQnVmLT5pU2FtcGxlc2l6ZSkgKyAzOworCisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgeworICAgICpwT3V0cm93ID0gKnBXb3Jrcm93OyAgICAgICAgICAgICAgLyogcHV0IGluIGJ1ZmZlciAqLworCisgICAgcE91dHJvdyArPSA0OyAgICAgICAgICAgICAgICAgICAgICAvKiBuZXh0IHBpeGVsICovCisgICAgcFdvcmtyb3crKzsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1NUT1JFX0pQRUdfUkdCOF9BOCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdlJ3ZlIGdvdCBvbmUgbW9yZSByb3cgb2YgYWxwaGEtc2FtcGxlcyAqLworICByZXR1cm4gbW5nX25leHRfanBlZ19hbHBoYXJvdyAocERhdGEpOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCittbmdfcmV0Y29kZSBtbmdfc3RvcmVfanBlZ19yZ2I4X2ExNiAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfaW1hZ2VkYXRhcCBwQnVmID0gKG1uZ19pbWFnZWRhdGFwKXBEYXRhLT5wU3RvcmVidWY7CisgIG1uZ191aW50OHAgICAgIHBXb3Jrcm93OworICBtbmdfdWludDhwICAgICBwT3V0cm93OworICBtbmdfaW50MzIgICAgICBpWDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9TVE9SRV9KUEVHX1JHQjhfQTE2LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0ZW1wb3Jhcnkgd29yayBwb2ludGVycyAqLworICBwV29ya3JvdyA9IHBEYXRhLT5wV29ya3JvdyArIHBEYXRhLT5pUGl4ZWxvZnM7CisgIHBPdXRyb3cgID0gcEJ1Zi0+cEltZ2RhdGEgKyAocERhdGEtPmlSb3cgKiBwQnVmLT5pUm93c2l6ZSAgICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBEYXRhLT5pQ29sICogcEJ1Zi0+aVNhbXBsZXNpemUpICsgMzsKKworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlSb3dzYW1wbGVzOyBpWCsrKQorI2VuZGlmCisgIHsKKyAgICAqcE91dHJvdyA9ICpwV29ya3JvdzsgICAgICAgICAgICAgIC8qIG9ubHkgaGlnaC1vcmRlciBieXRlICovCisKKyAgICBwT3V0cm93ICArPSA0OyAgICAgICAgICAgICAgICAgICAgIC8qIG5leHQgcGl4ZWwgKi8KKyAgICBwV29ya3JvdyArPSAyOworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fU1RPUkVfSlBFR19SR0I4X0ExNiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdlJ3ZlIGdvdCBvbmUgbW9yZSByb3cgb2YgYWxwaGEtc2FtcGxlcyAqLworICByZXR1cm4gbW5nX25leHRfanBlZ19hbHBoYXJvdyAocERhdGEpOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9KUEVHMTIKK21uZ19yZXRjb2RlIG1uZ19zdG9yZV9qcGVnX2cxMl9hMSAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfaW1hZ2VkYXRhcCBwQnVmID0gKG1uZ19pbWFnZWRhdGFwKXBEYXRhLT5wU3RvcmVidWY7CisgIG1uZ191aW50OHAgICAgIHBXb3Jrcm93OworICBtbmdfdWludDhwICAgICBwT3V0cm93OworICBtbmdfaW50MzIgICAgICBpWDsKKyAgbW5nX3VpbnQ4ICAgICAgaUI7CisgIG1uZ191aW50OCAgICAgIGlNOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1NUT1JFX0pQRUdfRzEyX0ExLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0ZW1wb3Jhcnkgd29yayBwb2ludGVycyAqLworICBwV29ya3JvdyA9IHBEYXRhLT5wV29ya3JvdyArIHBEYXRhLT5pUGl4ZWxvZnM7CisgIHBPdXRyb3cgID0gcEJ1Zi0+cEltZ2RhdGEgKyAocERhdGEtPmlSb3cgKiBwQnVmLT5pUm93c2l6ZSAgICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBEYXRhLT5pQ29sICogcEJ1Zi0+aVNhbXBsZXNpemUpICsgMjsKKyAgaU0gICAgICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0IGF0IHBpeGVsIDAgKi8KKyAgaUIgICAgICAgPSAwOworCisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgeworICAgIGlmICghaU0pICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWFzayB1bmRlcmZsb3cgPyAqLworICAgIHsKKyAgICAgIGlCID0gKnBXb3Jrcm93OyAgICAgICAgICAgICAgICAgIC8qIGdldCBuZXh0IGlucHV0LWJ5dGUgKi8KKyAgICAgIHBXb3Jrcm93Kys7CisgICAgICBpTSA9IDB4ODA7CisgICAgfQorCisgICAgaWYgKGlCICYgaU0pICAgICAgICAgICAgICAgICAgICAgICAvKiBvcGFxdWUgPyAqLworICAgICAgbW5nX3B1dF91aW50MTYgKHBPdXRyb3csIDB4RkZGRik7Lyogb3BhcXVlICovCisgICAgZWxzZQorICAgICAgbW5nX3B1dF91aW50MTYgKHBPdXRyb3csIDB4MDAwMCk7LyogdHJhbnNwYXJlbnQgKi8KKworICAgIHBPdXRyb3cgKz0gNDsgICAgICAgICAgICAgICAgICAgICAgLyogbmV4dCBwaXhlbCAqLworICAgIGlNID4+PSAgMTsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1NUT1JFX0pQRUdfRzEyX0ExLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd2UndmUgZ290IG9uZSBtb3JlIHJvdyBvZiBhbHBoYS1zYW1wbGVzICovCisgIHJldHVybiBtbmdfbmV4dF9qcGVnX2FscGhhcm93IChwRGF0YSk7Cit9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfSlBFRzEyICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9KUEVHMTIKK21uZ19yZXRjb2RlIG1uZ19zdG9yZV9qcGVnX2cxMl9hMiAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfaW1hZ2VkYXRhcCBwQnVmID0gKG1uZ19pbWFnZWRhdGFwKXBEYXRhLT5wU3RvcmVidWY7CisgIG1uZ191aW50OHAgICAgIHBXb3Jrcm93OworICBtbmdfdWludDhwICAgICBwT3V0cm93OworICBtbmdfaW50MzIgICAgICBpWDsKKyAgbW5nX3VpbnQ4ICAgICAgaUI7CisgIG1uZ191aW50OCAgICAgIGlNOworICBtbmdfdWludDMyICAgICBpUzsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9TVE9SRV9KUEVHX0cxMl9BMiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGVtcG9yYXJ5IHdvcmsgcG9pbnRlcnMgKi8KKyAgcFdvcmtyb3cgPSBwRGF0YS0+cFdvcmtyb3cgKyBwRGF0YS0+aVBpeGVsb2ZzOworICBwT3V0cm93ICA9IHBCdWYtPnBJbWdkYXRhICsgKHBEYXRhLT5pUm93ICogcEJ1Zi0+aVJvd3NpemUgICApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwRGF0YS0+aUNvbCAqIHBCdWYtPmlTYW1wbGVzaXplKSArIDI7CisgIGlNICAgICAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdGFydCBhdCBwaXhlbCAwICovCisgIGlCICAgICAgID0gMDsKKyAgaVMgICAgICAgPSAwOworCisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgeworICAgIGlmICghaU0pICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWFzayB1bmRlcmZsb3cgPyAqLworICAgIHsKKyAgICAgIGlCID0gKnBXb3Jrcm93OyAgICAgICAgICAgICAgICAgIC8qIGdldCBuZXh0IGlucHV0LWJ5dGUgKi8KKyAgICAgIHBXb3Jrcm93Kys7CisgICAgICBpTSA9IDB4QzA7CisgICAgICBpUyA9IDY7CisgICAgfQorCisjaWZkZWYgTU5HX09QVElNSVpFX0ZPT1RQUklOVF9TV0lUQ0gKKyAgICB7CisgICAgICBjb25zdCBtbmdfdWludDE2ICBncmF5X2xldmVsWzRdID0geyAweDAwMDAsIDB4NTU1NSwgMHhBQUFBLCAweEZGRkZ9OworICAgICAgbW5nX3B1dF91aW50MTYgKHBPdXRyb3csIGdyYXlfbGV2ZWxbKChpQiAmIGlNKSA+PiBpUyldKSA7CisgICAgfQorI2Vsc2UKKyAgICBzd2l0Y2ggKChpQiAmIGlNKSA+PiBpUykgICAgICAgICAgIC8qIGRldGVybWluZSB0aGUgZ3JheSBsZXZlbCAqLworICAgIHsKKyAgICAgIGNhc2UgMHgwMyA6IHsgbW5nX3B1dF91aW50MTYgKHBPdXRyb3csIDB4RkZGRik7IGJyZWFrOyB9CisgICAgICBjYXNlIDB4MDIgOiB7IG1uZ19wdXRfdWludDE2IChwT3V0cm93LCAweEFBQUEpOyBicmVhazsgfQorICAgICAgY2FzZSAweDAxIDogeyBtbmdfcHV0X3VpbnQxNiAocE91dHJvdywgMHg1NTU1KTsgYnJlYWs7IH0KKyAgICAgIGRlZmF1bHQgICA6IHsgbW5nX3B1dF91aW50MTYgKHBPdXRyb3csIDB4MDAwMCk7IH0KKyAgICB9CisjZW5kaWYKKworICAgIHBPdXRyb3cgKz0gNDsgICAgICAgICAgICAgICAgICAgICAgLyogbmV4dCBwaXhlbCAqLworICAgIGlNID4+PSAgMjsKKyAgICBpUyAtPSAyOworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fU1RPUkVfSlBFR19HMTJfQTIsIE1OR19MQ19FTkQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSd2ZSBnb3Qgb25lIG1vcmUgcm93IG9mIGFscGhhLXNhbXBsZXMgKi8KKyAgcmV0dXJuIG1uZ19uZXh0X2pwZWdfYWxwaGFyb3cgKHBEYXRhKTsKK30KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9KUEVHMTIgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX0pQRUcxMgorbW5nX3JldGNvZGUgbW5nX3N0b3JlX2pwZWdfZzEyX2E0IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ19pbWFnZWRhdGFwIHBCdWYgPSAobW5nX2ltYWdlZGF0YXApcERhdGEtPnBTdG9yZWJ1ZjsKKyAgbW5nX3VpbnQ4cCAgICAgcFdvcmtyb3c7CisgIG1uZ191aW50OHAgICAgIHBPdXRyb3c7CisgIG1uZ19pbnQzMiAgICAgIGlYOworICBtbmdfdWludDggICAgICBpQjsKKyAgbW5nX3VpbnQ4ICAgICAgaU07CisgIG1uZ191aW50MzIgICAgIGlTOworICBtbmdfdWludDE2ICAgICBpUTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9TVE9SRV9KUEVHX0cxMl9BNCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGVtcG9yYXJ5IHdvcmsgcG9pbnRlcnMgKi8KKyAgcFdvcmtyb3cgPSBwRGF0YS0+cFdvcmtyb3cgKyBwRGF0YS0+aVBpeGVsb2ZzOworICBwT3V0cm93ICA9IHBCdWYtPnBJbWdkYXRhICsgKHBEYXRhLT5pUm93ICogcEJ1Zi0+aVJvd3NpemUgICApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwRGF0YS0+aUNvbCAqIHBCdWYtPmlTYW1wbGVzaXplKSArIDI7CisgIGlNICAgICAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdGFydCBhdCBwaXhlbCAwICovCisgIGlCICAgICAgID0gMDsKKyAgaVMgICAgICAgPSAwOworCisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgeworICAgIGlmICghaU0pICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWFzayB1bmRlcmZsb3cgPyAqLworICAgIHsKKyAgICAgIGlCID0gKnBXb3Jrcm93OyAgICAgICAgICAgICAgICAgIC8qIGdldCBuZXh0IGlucHV0LWJ5dGUgKi8KKyAgICAgIHBXb3Jrcm93Kys7CisgICAgICBpTSA9IDB4RjA7CisgICAgICBpUyA9IDQ7CisgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0IHRoZSBncmF5IGxldmVsICovCisgICAgaVEgPSAobW5nX3VpbnQxNikoKGlCICYgaU0pID4+IGlTKTsKKyAgICBpUSA9IChtbmdfdWludDE2KShpUSArIChpUSA8PCA0KSk7IC8qIGV4cGFuZCB0byAxNi1iaXQgYnkgcmVwbGljYXRpb24gKi8KKyAgICBpUSA9IChtbmdfdWludDE2KShpUSArIChpUSA8PCA4KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwdXQgaW4gb2JqZWN0IGJ1ZmZlciAqLworICAgIG1uZ19wdXRfdWludDE2IChwT3V0cm93LCBpUSk7CisKKyAgICBwT3V0cm93ICs9IDQ7ICAgICAgICAgICAgICAgICAgICAgIC8qIG5leHQgcGl4ZWwgKi8KKyAgICBpTSA+Pj0gIDQ7CisgICAgaVMgLT0gNDsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1NUT1JFX0pQRUdfRzEyX0E0LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd2UndmUgZ290IG9uZSBtb3JlIHJvdyBvZiBhbHBoYS1zYW1wbGVzICovCisgIHJldHVybiBtbmdfbmV4dF9qcGVnX2FscGhhcm93IChwRGF0YSk7Cit9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfSlBFRzEyICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9KUEVHMTIKK21uZ19yZXRjb2RlIG1uZ19zdG9yZV9qcGVnX2cxMl9hOCAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfaW1hZ2VkYXRhcCBwQnVmID0gKG1uZ19pbWFnZWRhdGFwKXBEYXRhLT5wU3RvcmVidWY7CisgIG1uZ191aW50OHAgICAgIHBXb3Jrcm93OworICBtbmdfdWludDhwICAgICBwT3V0cm93OworICBtbmdfaW50MzIgICAgICBpWDsKKyAgbW5nX3VpbnQxNiAgICAgaVc7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fU1RPUkVfSlBFR19HMTJfQTgsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRlbXBvcmFyeSB3b3JrIHBvaW50ZXJzICovCisgIHBXb3Jrcm93ID0gcERhdGEtPnBXb3Jrcm93ICsgcERhdGEtPmlQaXhlbG9mczsKKyAgcE91dHJvdyAgPSBwQnVmLT5wSW1nZGF0YSArIChwRGF0YS0+aVJvdyAqIHBCdWYtPmlSb3dzaXplICAgKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocERhdGEtPmlDb2wgKiBwQnVmLT5pU2FtcGxlc2l6ZSkgKyAyOworCisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgeworICAgIGlXID0gKG1uZ191aW50MTYpKCpwV29ya3Jvdyk7ICAgICAgLyogZ2V0IGlucHV0IGJ5dGUgKi8KKyAgICBpVyA9IChtbmdfdWludDE2KShpVyArIChpVyA8PCA4KSk7IC8qIGV4cGFuZCB0byAxNi1iaXQgYnkgcmVwbGljYXRpb24gKi8KKworICAgIG1uZ19wdXRfdWludDE2IChwT3V0cm93LCBpVyk7ICAgICAgLyogcHV0IGluIG9iamVjdCBidWZmZXIgKi8KKworICAgIHBPdXRyb3cgKz0gNDsgICAgICAgICAgICAgICAgICAgICAgLyogbmV4dCBwaXhlbCAqLworICAgIHBXb3Jrcm93Kys7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9TVE9SRV9KUEVHX0cxMl9BOCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdlJ3ZlIGdvdCBvbmUgbW9yZSByb3cgb2YgYWxwaGEtc2FtcGxlcyAqLworICByZXR1cm4gbW5nX25leHRfanBlZ19hbHBoYXJvdyAocERhdGEpOworfQorI2VuZGlmIC8qIE1OR19TVVBQT1JUX0pQRUcxMiAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfSlBFRzEyCisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCittbmdfcmV0Y29kZSBtbmdfc3RvcmVfanBlZ19nMTJfYTE2IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ19pbWFnZWRhdGFwIHBCdWYgPSAobW5nX2ltYWdlZGF0YXApcERhdGEtPnBTdG9yZWJ1ZjsKKyAgbW5nX3VpbnQ4cCAgICAgcFdvcmtyb3c7CisgIG1uZ191aW50OHAgICAgIHBPdXRyb3c7CisgIG1uZ19pbnQzMiAgICAgIGlYOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1NUT1JFX0pQRUdfRzEyX0ExNiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGVtcG9yYXJ5IHdvcmsgcG9pbnRlcnMgKi8KKyAgcFdvcmtyb3cgPSBwRGF0YS0+cFdvcmtyb3cgKyBwRGF0YS0+aVBpeGVsb2ZzOworICBwT3V0cm93ICA9IHBCdWYtPnBJbWdkYXRhICsgKHBEYXRhLT5pUm93ICogcEJ1Zi0+aVJvd3NpemUgICApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwRGF0YS0+aUNvbCAqIHBCdWYtPmlTYW1wbGVzaXplKSArIDI7CisKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29weSBpdCAqLworICAgIG1uZ19wdXRfdWludDE2IChwT3V0cm93LCBtbmdfZ2V0X3VpbnQxNiAocFdvcmtyb3cpKTsKKworICAgIHBPdXRyb3cgICs9IDQ7ICAgICAgICAgICAgICAgICAgICAgLyogbmV4dCBwaXhlbCAqLworICAgIHBXb3Jrcm93ICs9IDI7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9TVE9SRV9KUEVHX0cxMl9BMTYsIE1OR19MQ19FTkQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSd2ZSBnb3Qgb25lIG1vcmUgcm93IG9mIGFscGhhLXNhbXBsZXMgKi8KKyAgcmV0dXJuIG1uZ19uZXh0X2pwZWdfYWxwaGFyb3cgKHBEYXRhKTsKK30KKyNlbmRpZgorI2VuZGlmIC8qIE1OR19TVVBQT1JUX0pQRUcxMiAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjZW5kaWYgLyogTU5HX0lOQ0xVREVfSk5HICovCisKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIERlbHRhLWltYWdlIHJvdyByb3V0aW5lcyAtIGFwcGx5IHRoZSBwcm9jZXNzZWQgJiB1bmNvbXByZXNzZWQgcm93LWRhdGEgKiAqLworLyogKiBvbnRvIHRoZSB0YXJnZXQgIm9iamVjdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19OT18xXzJfNEJJVF9TVVBQT1JUCittbmdfcmV0Y29kZSBtbmdfZGVsdGFfZzEgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX2ltYWdlZGF0YXAgcEJ1ZiA9ICgobW5nX2ltYWdlcClwRGF0YS0+cERlbHRhSW1hZ2UpLT5wSW1nYnVmOworICBtbmdfdWludDhwICAgICBwV29ya3JvdzsKKyAgbW5nX3VpbnQ4cCAgICAgcE91dHJvdzsKKyAgbW5nX2ludDMyICAgICAgaVg7CisgIG1uZ191aW50OCAgICAgIGlCOworICBtbmdfdWludDggICAgICBpTTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ERUxUQV9HMSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGVtcG9yYXJ5IHdvcmsgcG9pbnRlcnMgKi8KKyAgcFdvcmtyb3cgPSBwRGF0YS0+cFdvcmtyb3cgKyBwRGF0YS0+aVBpeGVsb2ZzOworICBwT3V0cm93ICA9IHBCdWYtPnBJbWdkYXRhICsgKHBEYXRhLT5pUm93ICAgICAgICAgKiBwQnVmLT5pUm93c2l6ZSAgICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBEYXRhLT5pRGVsdGFCbG9ja3kgKiBwQnVmLT5pUm93c2l6ZSAgICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBEYXRhLT5pQ29sICAgICAgICAgKiBwQnVmLT5pU2FtcGxlc2l6ZSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBEYXRhLT5pRGVsdGFCbG9ja3ggKiBwQnVmLT5pU2FtcGxlc2l6ZSk7CisgIGlNICAgICAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdGFydCBhdCBwaXhlbCAwICovCisgIGlCICAgICAgID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBpeGVsIHJlcGxhY2UgPyAqLworICBpZiAocERhdGEtPmlEZWx0YXR5cGUgPT0gTU5HX0RFTFRBVFlQRV9CTE9DS1BJWEVMUkVQTEFDRSkKKyAgeworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICAgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICAgIHsKKyAgICAgIGlmICghaU0pICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1hc2sgdW5kZXJmbG93ID8gKi8KKyAgICAgIHsKKyAgICAgICAgaUIgPSAqcFdvcmtyb3c7ICAgICAgICAgICAgICAgIC8qIGdldCBuZXh0IGlucHV0LWJ5dGUgKi8KKyAgICAgICAgcFdvcmtyb3crKzsKKyAgICAgICAgaU0gPSAweDgwOworICAgICAgfQorCisgICAgICBpZiAoaUIgJiBpTSkgICAgICAgICAgICAgICAgICAgICAvKiBpcyBpdCB3aGl0ZSA/ICovCisgICAgICAgICpwT3V0cm93ID0gMHhGRjsgICAgICAgICAgICAgICAvKiB3aGl0ZSAqLworICAgICAgZWxzZQorICAgICAgICAqcE91dHJvdyA9IDB4MDA7ICAgICAgICAgICAgICAgLyogYmxhY2sgKi8KKworICAgICAgcE91dHJvdyArPSBwRGF0YS0+aUNvbGluYzsgICAgICAgLyogbmV4dCBwaXhlbCAqLworICAgICAgaU0gPj49ICAxOworICAgIH0KKyAgfQorICBlbHNlCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwaXhlbCBhZGQgISAqLworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICAgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICAgIHsKKyAgICAgIGlmICghaU0pICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1hc2sgdW5kZXJmbG93ID8gKi8KKyAgICAgIHsKKyAgICAgICAgaUIgPSAqcFdvcmtyb3c7ICAgICAgICAgICAgICAgIC8qIGdldCBuZXh0IGlucHV0LWJ5dGUgKi8KKyAgICAgICAgcFdvcmtyb3crKzsKKyAgICAgICAgaU0gPSAweDgwOworICAgICAgfQorCisgICAgICBpZiAoaUIgJiBpTSkgICAgICAgICAgICAgICAgICAgICAvKiBpbnZlcnQgaWYgaXQgaXMgd2hpdGUgPyAqLworICAgICAgICAqcE91dHJvdyA9IChtbmdfdWludDgpKCpwT3V0cm93IF4gMHhGRik7CisKKyAgICAgIHBPdXRyb3cgKz0gcERhdGEtPmlDb2xpbmM7ICAgICAgIC8qIG5leHQgcGl4ZWwgKi8KKyAgICAgIGlNID4+PSAgMTsKKyAgICB9CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ERUxUQV9HMSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gbW5nX3N0b3JlX2cxIChwRGF0YSk7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19kZWx0YV9nMiAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfaW1hZ2VkYXRhcCBwQnVmID0gKChtbmdfaW1hZ2VwKXBEYXRhLT5wRGVsdGFJbWFnZSktPnBJbWdidWY7CisgIG1uZ191aW50OHAgICAgIHBXb3Jrcm93OworICBtbmdfdWludDhwICAgICBwT3V0cm93OworICBtbmdfaW50MzIgICAgICBpWDsKKyAgbW5nX3VpbnQ4ICAgICAgaUI7CisgIG1uZ191aW50OCAgICAgIGlNOworICBtbmdfdWludDMyICAgICBpUzsKKyNpZmRlZiBNTkdfT1BUSU1JWkVfRk9PVFBSSU5UX1NXSVRDSAorICBjb25zdCBtbmdfdWludDggIGxldmVsWzRdID0geyAweDAwLCAweDU1LCAweEFBLCAweEZGfTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RFTFRBX0cyLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0ZW1wb3Jhcnkgd29yayBwb2ludGVycyAqLworICBwV29ya3JvdyA9IHBEYXRhLT5wV29ya3JvdyArIHBEYXRhLT5pUGl4ZWxvZnM7CisgIHBPdXRyb3cgID0gcEJ1Zi0+cEltZ2RhdGEgKyAocERhdGEtPmlSb3cgICAgICAgICAqIHBCdWYtPmlSb3dzaXplICAgKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocERhdGEtPmlEZWx0YUJsb2NreSAqIHBCdWYtPmlSb3dzaXplICAgKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocERhdGEtPmlDb2wgICAgICAgICAqIHBCdWYtPmlTYW1wbGVzaXplKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocERhdGEtPmlEZWx0YUJsb2NreCAqIHBCdWYtPmlTYW1wbGVzaXplKTsKKyAgaU0gICAgICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0IGF0IHBpeGVsIDAgKi8KKyAgaUIgICAgICAgPSAwOworICBpUyAgICAgICA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwaXhlbCByZXBsYWNlID8gKi8KKyAgaWYgKHBEYXRhLT5pRGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfQkxPQ0tQSVhFTFJFUExBQ0UpCisgIHsKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgICAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgICB7CisgICAgICBpZiAoIWlNKSAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXNrIHVuZGVyZmxvdyA/ICovCisgICAgICB7CisgICAgICAgIGlCID0gKnBXb3Jrcm93OyAgICAgICAgICAgICAgICAvKiBnZXQgbmV4dCBpbnB1dC1ieXRlICovCisgICAgICAgIHBXb3Jrcm93Kys7CisgICAgICAgIGlNID0gMHhDMDsKKyAgICAgICAgaVMgPSA2OworICAgICAgfQorCisjaWZkZWYgTU5HX09QVElNSVpFX0ZPT1RQUklOVF9TV0lUQ0gKKyAgICAqcE91dHJvdyA9IGxldmVsWygoaUIgJiBpTSkgPj4gaVMpXSA7CisjZWxzZQorICAgIHN3aXRjaCAoKGlCICYgaU0pID4+IGlTKSAgICAgICAgICAgLyogZGV0ZXJtaW5lIHRoZSBhbHBoYSBsZXZlbCAqLworICAgIHsKKyAgICAgIGNhc2UgMHgwMyA6IHsgKnBPdXRyb3cgPSAweEZGOyBicmVhazsgfQorICAgICAgY2FzZSAweDAyIDogeyAqcE91dHJvdyA9IDB4QUE7IGJyZWFrOyB9CisgICAgICBjYXNlIDB4MDEgOiB7ICpwT3V0cm93ID0gMHg1NTsgYnJlYWs7IH0KKyAgICAgIGRlZmF1bHQgICA6IHsgKnBPdXRyb3cgPSAweDAwOyB9CisgICAgfQorI2VuZGlmCisKKyAgICAgIHBPdXRyb3cgKz0gcERhdGEtPmlDb2xpbmM7ICAgICAgIC8qIG5leHQgcGl4ZWwgKi8KKyAgICAgIGlNID4+PSAgMjsKKyAgICAgIGlTIC09IDI7CisgICAgfQorICB9CisgIGVsc2UKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBpeGVsIGFkZCAhICovCisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICAgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgICAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlSb3dzYW1wbGVzOyBpWCsrKQorI2VuZGlmCisgICAgeworICAgICAgaWYgKCFpTSkgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWFzayB1bmRlcmZsb3cgPyAqLworICAgICAgeworICAgICAgICBpQiA9ICpwV29ya3JvdzsgICAgICAgICAgICAgICAgLyogZ2V0IG5leHQgaW5wdXQtYnl0ZSAqLworICAgICAgICBwV29ya3JvdysrOworICAgICAgICBpTSA9IDB4QzA7CisgICAgICAgIGlTID0gNjsKKyAgICAgIH0KKworI2lmZGVmIE1OR19PUFRJTUlaRV9GT09UUFJJTlRfU1dJVENICisgICAgICAqcE91dHJvdyA9IGxldmVsWygoKnBPdXRyb3cgPj4gNikgKyAoKGlCICYgaU0pID4+IGlTKSkgJiAweDAzXSA7CisjZWxzZQorICAgICAgc3dpdGNoICgoKCpwT3V0cm93ID4+IDYpICsgKChpQiAmIGlNKSA+PiBpUykpICYgMHgwMykKKyAgICAgIHsKKyAgICAgICAgY2FzZSAweDAzIDogeyAqcE91dHJvdyA9IDB4RkY7IGJyZWFrOyB9CisgICAgICAgIGNhc2UgMHgwMiA6IHsgKnBPdXRyb3cgPSAweEFBOyBicmVhazsgfQorICAgICAgICBjYXNlIDB4MDEgOiB7ICpwT3V0cm93ID0gMHg1NTsgYnJlYWs7IH0KKyAgICAgICAgZGVmYXVsdCAgIDogeyAqcE91dHJvdyA9IDB4MDA7IH0KKyAgICAgIH0KKyNlbmRpZgorCisgICAgICBwT3V0cm93ICs9IHBEYXRhLT5pQ29saW5jOyAgICAgICAvKiBuZXh0IHBpeGVsICovCisgICAgICBpTSA+Pj0gIDI7CisgICAgICBpUyAtPSAyOworICAgIH0KKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RFTFRBX0cyLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBtbmdfc3RvcmVfZzIgKHBEYXRhKTsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX2RlbHRhX2c0IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ19pbWFnZWRhdGFwIHBCdWYgPSAoKG1uZ19pbWFnZXApcERhdGEtPnBEZWx0YUltYWdlKS0+cEltZ2J1ZjsKKyAgbW5nX3VpbnQ4cCAgICAgcFdvcmtyb3c7CisgIG1uZ191aW50OHAgICAgIHBPdXRyb3c7CisgIG1uZ19pbnQzMiAgICAgIGlYOworICBtbmdfdWludDggICAgICBpQjsKKyAgbW5nX3VpbnQ4ICAgICAgaU07CisgIG1uZ191aW50MzIgICAgIGlTOworICBtbmdfdWludDggICAgICBpUTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ERUxUQV9HNCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGVtcG9yYXJ5IHdvcmsgcG9pbnRlcnMgKi8KKyAgcFdvcmtyb3cgPSBwRGF0YS0+cFdvcmtyb3cgKyBwRGF0YS0+aVBpeGVsb2ZzOworICBwT3V0cm93ICA9IHBCdWYtPnBJbWdkYXRhICsgKHBEYXRhLT5pUm93ICAgICAgICAgKiBwQnVmLT5pUm93c2l6ZSAgICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBEYXRhLT5pRGVsdGFCbG9ja3kgKiBwQnVmLT5pUm93c2l6ZSAgICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBEYXRhLT5pQ29sICAgICAgICAgKiBwQnVmLT5pU2FtcGxlc2l6ZSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBEYXRhLT5pRGVsdGFCbG9ja3ggKiBwQnVmLT5pU2FtcGxlc2l6ZSk7CisgIGlNICAgICAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdGFydCBhdCBwaXhlbCAwICovCisgIGlCICAgICAgID0gMDsKKyAgaVMgICAgICAgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGl4ZWwgcmVwbGFjZSA/ICovCisgIGlmIChwRGF0YS0+aURlbHRhdHlwZSA9PSBNTkdfREVMVEFUWVBFX0JMT0NLUElYRUxSRVBMQUNFKQorICB7CisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICAgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgICAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlSb3dzYW1wbGVzOyBpWCsrKQorI2VuZGlmCisgICAgeworICAgICAgaWYgKCFpTSkgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWFzayB1bmRlcmZsb3cgPyAqLworICAgICAgeworICAgICAgICBpQiA9ICpwV29ya3JvdzsgICAgICAgICAgICAgICAgLyogZ2V0IG5leHQgaW5wdXQtYnl0ZSAqLworICAgICAgICBwV29ya3JvdysrOworICAgICAgICBpTSA9IDB4RjA7CisgICAgICAgIGlTID0gNDsKKyAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCB0aGUgZ3JheSBsZXZlbCAqLworICAgICAgaVEgPSAobW5nX3VpbnQ4KSgoaUIgJiBpTSkgPj4gaVMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZXhwYW5kIHRvIDgtYml0IGJ5IHJlcGxpY2F0aW9uICovCisgICAgICBpUSA9IChtbmdfdWludDgpKGlRICsgKGlRIDw8IDQpKTsKKworICAgICAgKnBPdXRyb3cgPSBpUTsgICAgICAgICAgICAgICAgICAgLyogcHV0IGluIG9iamVjdCBidWZmZXIgKi8KKworICAgICAgcE91dHJvdyArPSBwRGF0YS0+aUNvbGluYzsgICAgICAgLyogbmV4dCBwaXhlbCAqLworICAgICAgaU0gPj49ICA0OworICAgICAgaVMgLT0gNDsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGl4ZWwgYWRkICEgKi8KKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgICAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgICB7CisgICAgICBpZiAoIWlNKSAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXNrIHVuZGVyZmxvdyA/ICovCisgICAgICB7CisgICAgICAgIGlCID0gKnBXb3Jrcm93OyAgICAgICAgICAgICAgICAvKiBnZXQgbmV4dCBpbnB1dC1ieXRlICovCisgICAgICAgIHBXb3Jrcm93Kys7CisgICAgICAgIGlNID0gMHhGMDsKKyAgICAgICAgaVMgPSA0OworICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0IHRoZSBncmF5IGxldmVsICovCisgICAgICBpUSA9IChtbmdfdWludDgpKCgoKnBPdXRyb3cgPj4gNCkgKyAoKGlCICYgaU0pID4+IGlTKSkgJiAweDBGKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGV4cGFuZCB0byA4LWJpdCBieSByZXBsaWNhdGlvbiAqLworICAgICAgaVEgPSAobW5nX3VpbnQ4KShpUSArIChpUSA8PCA0KSk7CisKKyAgICAgICpwT3V0cm93ID0gaVE7ICAgICAgICAgICAgICAgICAgIC8qIHB1dCBpbiBvYmplY3QgYnVmZmVyICovCisKKyAgICAgIHBPdXRyb3cgKz0gcERhdGEtPmlDb2xpbmM7ICAgICAgIC8qIG5leHQgcGl4ZWwgKi8KKyAgICAgIGlNID4+PSAgNDsKKyAgICAgIGlTIC09IDQ7CisgICAgfQorICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fREVMVEFfRzQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIG1uZ19zdG9yZV9nNCAocERhdGEpOworfQorI2VuZGlmIC8qIE1OR19OT18xXzJfNEJJVF9TVVBQT1JUICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19kZWx0YV9nOCAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfaW1hZ2VkYXRhcCBwQnVmID0gKChtbmdfaW1hZ2VwKXBEYXRhLT5wRGVsdGFJbWFnZSktPnBJbWdidWY7CisgIG1uZ191aW50OHAgICAgIHBXb3Jrcm93OworICBtbmdfdWludDhwICAgICBwT3V0cm93OworICBtbmdfaW50MzIgICAgICBpWDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ERUxUQV9HOCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGVtcG9yYXJ5IHdvcmsgcG9pbnRlcnMgKi8KKyAgcFdvcmtyb3cgPSBwRGF0YS0+cFdvcmtyb3cgKyBwRGF0YS0+aVBpeGVsb2ZzOworICBwT3V0cm93ICA9IHBCdWYtPnBJbWdkYXRhICsgKHBEYXRhLT5pUm93ICAgICAgICAgKiBwQnVmLT5pUm93c2l6ZSAgICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBEYXRhLT5pRGVsdGFCbG9ja3kgKiBwQnVmLT5pUm93c2l6ZSAgICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBEYXRhLT5pQ29sICAgICAgICAgKiBwQnVmLT5pU2FtcGxlc2l6ZSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBEYXRhLT5pRGVsdGFCbG9ja3ggKiBwQnVmLT5pU2FtcGxlc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwaXhlbCByZXBsYWNlID8gKi8KKyAgaWYgKHBEYXRhLT5pRGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfQkxPQ0tQSVhFTFJFUExBQ0UpCisgIHsKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgICAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgICB7CisgICAgICAqcE91dHJvdyA9ICpwV29ya3JvdzsgICAgICAgICAgICAvKiBwdXQgaW4gb2JqZWN0IGJ1ZmZlciAqLworCisgICAgICBwT3V0cm93ICs9IHBEYXRhLT5pQ29saW5jOyAgICAgICAvKiBuZXh0IHBpeGVsICovCisgICAgICBwV29ya3JvdysrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwaXhlbCBhZGQgISAqLworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICAgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkIHRvIG9iamVjdCBidWZmZXIgKi8KKyAgICAgICpwT3V0cm93ID0gKG1uZ191aW50OCkoKnBPdXRyb3cgKyAqcFdvcmtyb3cpOworCisgICAgICBwT3V0cm93ICs9IHBEYXRhLT5pQ29saW5jOyAgICAgICAvKiBuZXh0IHBpeGVsICovCisgICAgICBwV29ya3JvdysrOworICAgIH0KKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RFTFRBX0c4LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBtbmdfc3RvcmVfZzggKHBEYXRhKTsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorbW5nX3JldGNvZGUgbW5nX2RlbHRhX2cxNiAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfaW1hZ2VkYXRhcCBwQnVmID0gKChtbmdfaW1hZ2VwKXBEYXRhLT5wRGVsdGFJbWFnZSktPnBJbWdidWY7CisgIG1uZ191aW50OHAgICAgIHBXb3Jrcm93OworICBtbmdfdWludDhwICAgICBwT3V0cm93OworICBtbmdfaW50MzIgICAgICBpWDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ERUxUQV9HMTYsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRlbXBvcmFyeSB3b3JrIHBvaW50ZXJzICovCisgIHBXb3Jrcm93ID0gcERhdGEtPnBXb3Jrcm93ICsgcERhdGEtPmlQaXhlbG9mczsKKyAgcE91dHJvdyAgPSBwQnVmLT5wSW1nZGF0YSArIChwRGF0YS0+aVJvdyAgICAgICAgICogcEJ1Zi0+aVJvd3NpemUgICApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwRGF0YS0+aURlbHRhQmxvY2t5ICogcEJ1Zi0+aVJvd3NpemUgICApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwRGF0YS0+aUNvbCAgICAgICAgICogcEJ1Zi0+aVNhbXBsZXNpemUpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwRGF0YS0+aURlbHRhQmxvY2t4ICogcEJ1Zi0+aVNhbXBsZXNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGl4ZWwgcmVwbGFjZSA/ICovCisgIGlmIChwRGF0YS0+aURlbHRhdHlwZSA9PSBNTkdfREVMVEFUWVBFX0JMT0NLUElYRUxSRVBMQUNFKQorICB7CisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICAgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgICAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlSb3dzYW1wbGVzOyBpWCsrKQorI2VuZGlmCisgICAgeworICAgICAgKnBPdXRyb3cgICAgID0gKnBXb3Jrcm93OyAgICAgICAgLyogcHV0IGluIG9iamVjdCBidWZmZXIgKi8KKyAgICAgICoocE91dHJvdysxKSA9ICoocFdvcmtyb3crMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuZXh0IHBpeGVsICovCisgICAgICBwT3V0cm93ICArPSAocERhdGEtPmlDb2xpbmMgPDwgMSk7CisgICAgICBwV29ya3JvdyArPSAyOworICAgIH0KKyAgfQorICBlbHNlCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwaXhlbCBhZGQgISAqLworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICAgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkIHRvIG9iamVjdCBidWZmZXIgKi8KKyAgICAgIG1uZ19wdXRfdWludDE2IChwT3V0cm93LCAobW5nX3VpbnQxNikobW5nX2dldF91aW50MTYgKHBPdXRyb3cgKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19nZXRfdWludDE2IChwV29ya3JvdykgICApKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5leHQgcGl4ZWwgKi8KKyAgICAgIHBPdXRyb3cgICs9IChwRGF0YS0+aUNvbGluYyA8PCAxKTsKKyAgICAgIHBXb3Jrcm93ICs9IDI7CisgICAgfQorICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fREVMVEFfRzE2LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBtbmdfc3RvcmVfZzE2IChwRGF0YSk7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX2RlbHRhX3JnYjggKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX2ltYWdlZGF0YXAgcEJ1ZiA9ICgobW5nX2ltYWdlcClwRGF0YS0+cERlbHRhSW1hZ2UpLT5wSW1nYnVmOworICBtbmdfdWludDhwICAgICBwV29ya3JvdzsKKyAgbW5nX3VpbnQ4cCAgICAgcE91dHJvdzsKKyAgbW5nX2ludDMyICAgICAgaVg7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fREVMVEFfUkdCOCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGVtcG9yYXJ5IHdvcmsgcG9pbnRlcnMgKi8KKyAgcFdvcmtyb3cgPSBwRGF0YS0+cFdvcmtyb3cgKyBwRGF0YS0+aVBpeGVsb2ZzOworICBwT3V0cm93ICA9IHBCdWYtPnBJbWdkYXRhICsgKHBEYXRhLT5pUm93ICAgICAgICAgKiBwQnVmLT5pUm93c2l6ZSAgICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBEYXRhLT5pRGVsdGFCbG9ja3kgKiBwQnVmLT5pUm93c2l6ZSAgICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBEYXRhLT5pQ29sICAgICAgICAgKiBwQnVmLT5pU2FtcGxlc2l6ZSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBEYXRhLT5pRGVsdGFCbG9ja3ggKiBwQnVmLT5pU2FtcGxlc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwaXhlbCByZXBsYWNlID8gKi8KKyAgaWYgKHBEYXRhLT5pRGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfQkxPQ0tQSVhFTFJFUExBQ0UpCisgIHsKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgICAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgICB7CisgICAgICAqcE91dHJvdyAgICAgPSAqcFdvcmtyb3c7ICAgICAgICAvKiBwdXQgaW4gb2JqZWN0IGJ1ZmZlciAqLworICAgICAgKihwT3V0cm93KzEpID0gKihwV29ya3JvdysxKTsKKyAgICAgICoocE91dHJvdysyKSA9ICoocFdvcmtyb3crMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuZXh0IHBpeGVsICovCisgICAgICBwT3V0cm93ICArPSAocERhdGEtPmlDb2xpbmMgKiAzKTsKKyAgICAgIHBXb3Jrcm93ICs9IDM7CisgICAgfQorICB9CisgIGVsc2UKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBpeGVsIGFkZCAhICovCisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICAgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgICAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlSb3dzYW1wbGVzOyBpWCsrKQorI2VuZGlmCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGQgdG8gb2JqZWN0IGJ1ZmZlciAqLworICAgICAgKnBPdXRyb3cgICAgID0gKG1uZ191aW50OCkoKnBPdXRyb3cgICAgICsgKnBXb3Jrcm93ICAgICk7CisgICAgICAqKHBPdXRyb3crMSkgPSAobW5nX3VpbnQ4KSgqKHBPdXRyb3crMSkgKyAqKHBXb3Jrcm93KzEpKTsKKyAgICAgICoocE91dHJvdysyKSA9IChtbmdfdWludDgpKCoocE91dHJvdysyKSArICoocFdvcmtyb3crMikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmV4dCBwaXhlbCAqLworICAgICAgcE91dHJvdyAgKz0gKHBEYXRhLT5pQ29saW5jICogMyk7CisgICAgICBwV29ya3JvdyArPSAzOworICAgIH0KKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RFTFRBX1JHQjgsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIG1uZ19zdG9yZV9yZ2I4IChwRGF0YSk7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKK21uZ19yZXRjb2RlIG1uZ19kZWx0YV9yZ2IxNiAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfaW1hZ2VkYXRhcCBwQnVmID0gKChtbmdfaW1hZ2VwKXBEYXRhLT5wRGVsdGFJbWFnZSktPnBJbWdidWY7CisgIG1uZ191aW50OHAgICAgIHBXb3Jrcm93OworICBtbmdfdWludDhwICAgICBwT3V0cm93OworICBtbmdfaW50MzIgICAgICBpWDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ERUxUQV9SR0IxNiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGVtcG9yYXJ5IHdvcmsgcG9pbnRlcnMgKi8KKyAgcFdvcmtyb3cgPSBwRGF0YS0+cFdvcmtyb3cgKyBwRGF0YS0+aVBpeGVsb2ZzOworICBwT3V0cm93ICA9IHBCdWYtPnBJbWdkYXRhICsgKHBEYXRhLT5pUm93ICAgICAgICAgKiBwQnVmLT5pUm93c2l6ZSAgICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBEYXRhLT5pRGVsdGFCbG9ja3kgKiBwQnVmLT5pUm93c2l6ZSAgICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBEYXRhLT5pQ29sICAgICAgICAgKiBwQnVmLT5pU2FtcGxlc2l6ZSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBEYXRhLT5pRGVsdGFCbG9ja3ggKiBwQnVmLT5pU2FtcGxlc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwaXhlbCByZXBsYWNlID8gKi8KKyAgaWYgKHBEYXRhLT5pRGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfQkxPQ0tQSVhFTFJFUExBQ0UpCisgIHsKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgICAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgICB7CisgICAgICAqcE91dHJvdyAgICAgPSAqcFdvcmtyb3c7ICAgICAgICAvKiBwdXQgaW4gb2JqZWN0IGJ1ZmZlciAqLworICAgICAgKihwT3V0cm93KzEpID0gKihwV29ya3JvdysxKTsKKyAgICAgICoocE91dHJvdysyKSA9ICoocFdvcmtyb3crMik7CisgICAgICAqKHBPdXRyb3crMykgPSAqKHBXb3Jrcm93KzMpOworICAgICAgKihwT3V0cm93KzQpID0gKihwV29ya3Jvdys0KTsKKyAgICAgICoocE91dHJvdys1KSA9ICoocFdvcmtyb3crNSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuZXh0IHBpeGVsICovCisgICAgICBwT3V0cm93ICArPSAocERhdGEtPmlDb2xpbmMgKiA2KTsKKyAgICAgIHBXb3Jrcm93ICs9IDY7CisgICAgfQorICB9CisgIGVsc2UKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBpeGVsIGFkZCAhICovCisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICAgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgICAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlSb3dzYW1wbGVzOyBpWCsrKQorI2VuZGlmCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGQgdG8gb2JqZWN0IGJ1ZmZlciAqLworICAgICAgbW5nX3B1dF91aW50MTYgKHBPdXRyb3csICAgKG1uZ191aW50MTYpKG1uZ19nZXRfdWludDE2IChwT3V0cm93ICAgKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2dldF91aW50MTYgKHBXb3Jrcm93ICApICAgKSk7CisgICAgICBtbmdfcHV0X3VpbnQxNiAocE91dHJvdysyLCAobW5nX3VpbnQxNikobW5nX2dldF91aW50MTYgKHBPdXRyb3crMiApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfZ2V0X3VpbnQxNiAocFdvcmtyb3crMikgICApKTsKKyAgICAgIG1uZ19wdXRfdWludDE2IChwT3V0cm93KzQsIChtbmdfdWludDE2KShtbmdfZ2V0X3VpbnQxNiAocE91dHJvdys0ICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19nZXRfdWludDE2IChwV29ya3Jvdys0KSAgICkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmV4dCBwaXhlbCAqLworICAgICAgcE91dHJvdyAgKz0gKHBEYXRhLT5pQ29saW5jICogNik7CisgICAgICBwV29ya3JvdyArPSA2OworICAgIH0KKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RFTFRBX1JHQjE2LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBtbmdfc3RvcmVfcmdiMTYgKHBEYXRhKTsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19OT18xXzJfNEJJVF9TVVBQT1JUCittbmdfcmV0Y29kZSBtbmdfZGVsdGFfaWR4MSAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfaW1hZ2VkYXRhcCBwQnVmID0gKChtbmdfaW1hZ2VwKXBEYXRhLT5wRGVsdGFJbWFnZSktPnBJbWdidWY7CisgIG1uZ191aW50OHAgICAgIHBXb3Jrcm93OworICBtbmdfdWludDhwICAgICBwT3V0cm93OworICBtbmdfaW50MzIgICAgICBpWDsKKyAgbW5nX3VpbnQ4ICAgICAgaUI7CisgIG1uZ191aW50OCAgICAgIGlNOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RFTFRBX0lEWDEsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRlbXBvcmFyeSB3b3JrIHBvaW50ZXJzICovCisgIHBXb3Jrcm93ID0gcERhdGEtPnBXb3Jrcm93ICsgcERhdGEtPmlQaXhlbG9mczsKKyAgcE91dHJvdyAgPSBwQnVmLT5wSW1nZGF0YSArIChwRGF0YS0+aVJvdyAgICAgICAgICogcEJ1Zi0+aVJvd3NpemUgICApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwRGF0YS0+aURlbHRhQmxvY2t5ICogcEJ1Zi0+aVJvd3NpemUgICApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwRGF0YS0+aUNvbCAgICAgICAgICogcEJ1Zi0+aVNhbXBsZXNpemUpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwRGF0YS0+aURlbHRhQmxvY2t4ICogcEJ1Zi0+aVNhbXBsZXNpemUpOworICBpTSAgICAgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RhcnQgYXQgcGl4ZWwgMCAqLworICBpQiAgICAgICA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwaXhlbCByZXBsYWNlID8gKi8KKyAgaWYgKHBEYXRhLT5pRGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfQkxPQ0tQSVhFTFJFUExBQ0UpCisgIHsKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgICAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgICB7CisgICAgICBpZiAoIWlNKSAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXNrIHVuZGVyZmxvdyA/ICovCisgICAgICB7CisgICAgICAgIGlCID0gKnBXb3Jrcm93OyAgICAgICAgICAgICAgICAvKiBnZXQgbmV4dCBpbnB1dC1ieXRlICovCisgICAgICAgIHBXb3Jrcm93Kys7CisgICAgICAgIGlNID0gMHg4MDsKKyAgICAgIH0KKworICAgICAgaWYgKGlCICYgaU0pICAgICAgICAgICAgICAgICAgICAgLyogcHV0IHRoZSByaWdodCBpbmRleCB2YWx1ZSAqLworICAgICAgICAqcE91dHJvdyA9IDE7CisgICAgICBlbHNlCisgICAgICAgICpwT3V0cm93ID0gMDsKKworICAgICAgcE91dHJvdyArPSBwRGF0YS0+aUNvbGluYzsgICAgICAgLyogbmV4dCBwaXhlbCAqLworICAgICAgaU0gPj49ICAxOworICAgIH0KKyAgfQorICBlbHNlCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwaXhlbCBhZGQgISAqLworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICAgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICAgIHsKKyAgICAgIGlmICghaU0pICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1hc2sgdW5kZXJmbG93ID8gKi8KKyAgICAgIHsKKyAgICAgICAgaUIgPSAqcFdvcmtyb3c7ICAgICAgICAgICAgICAgIC8qIGdldCBuZXh0IGlucHV0LWJ5dGUgKi8KKyAgICAgICAgcFdvcmtyb3crKzsKKyAgICAgICAgaU0gPSAweDgwOworICAgICAgfQorCisgICAgICBpZiAoaUIgJiBpTSkgICAgICAgICAgICAgICAgICAgICAvKiBpbnZlcnQgaWYgaXQgaXMgbm9uLXplcm8gaW5kZXggKi8KKyAgICAgICAgKnBPdXRyb3cgPSAobW5nX3VpbnQ4KSgqcE91dHJvdyBeIDB4MDEpOworCisgICAgICBwT3V0cm93ICs9IHBEYXRhLT5pQ29saW5jOyAgICAgICAvKiBuZXh0IHBpeGVsICovCisgICAgICBpTSA+Pj0gIDE7CisgICAgfQorICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fREVMVEFfSURYMSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gbW5nX3N0b3JlX2lkeDEgKHBEYXRhKTsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX2RlbHRhX2lkeDIgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX2ltYWdlZGF0YXAgcEJ1ZiA9ICgobW5nX2ltYWdlcClwRGF0YS0+cERlbHRhSW1hZ2UpLT5wSW1nYnVmOworICBtbmdfdWludDhwICAgICBwV29ya3JvdzsKKyAgbW5nX3VpbnQ4cCAgICAgcE91dHJvdzsKKyAgbW5nX2ludDMyICAgICAgaVg7CisgIG1uZ191aW50OCAgICAgIGlCOworICBtbmdfdWludDggICAgICBpTTsKKyAgbW5nX3VpbnQzMiAgICAgaVM7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fREVMVEFfSURYMiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGVtcG9yYXJ5IHdvcmsgcG9pbnRlcnMgKi8KKyAgcFdvcmtyb3cgPSBwRGF0YS0+cFdvcmtyb3cgKyBwRGF0YS0+aVBpeGVsb2ZzOworICBwT3V0cm93ICA9IHBCdWYtPnBJbWdkYXRhICsgKHBEYXRhLT5pUm93ICAgICAgICAgKiBwQnVmLT5pUm93c2l6ZSAgICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBEYXRhLT5pRGVsdGFCbG9ja3kgKiBwQnVmLT5pUm93c2l6ZSAgICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBEYXRhLT5pQ29sICAgICAgICAgKiBwQnVmLT5pU2FtcGxlc2l6ZSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBEYXRhLT5pRGVsdGFCbG9ja3ggKiBwQnVmLT5pU2FtcGxlc2l6ZSk7CisgIGlNICAgICAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdGFydCBhdCBwaXhlbCAwICovCisgIGlCICAgICAgID0gMDsKKyAgaVMgICAgICAgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGl4ZWwgcmVwbGFjZSA/ICovCisgIGlmIChwRGF0YS0+aURlbHRhdHlwZSA9PSBNTkdfREVMVEFUWVBFX0JMT0NLUElYRUxSRVBMQUNFKQorICB7CisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICAgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgICAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlSb3dzYW1wbGVzOyBpWCsrKQorI2VuZGlmCisgICAgeworICAgICAgaWYgKCFpTSkgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWFzayB1bmRlcmZsb3cgPyAqLworICAgICAgeworICAgICAgICBpQiA9ICpwV29ya3JvdzsgICAgICAgICAgICAgICAgLyogZ2V0IG5leHQgaW5wdXQtYnl0ZSAqLworICAgICAgICBwV29ya3JvdysrOworICAgICAgICBpTSA9IDB4QzA7CisgICAgICAgIGlTID0gNjsKKyAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHB1dCB0aGUgaW5kZXggKi8KKyAgICAgICpwT3V0cm93ID0gKG1uZ191aW50OCkoKGlCICYgaU0pID4+IGlTKTsKKworICAgICAgcE91dHJvdyArPSBwRGF0YS0+aUNvbGluYzsgICAgICAgLyogbmV4dCBwaXhlbCAqLworICAgICAgaU0gPj49ICAyOworICAgICAgaVMgLT0gMjsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGl4ZWwgYWRkICEgKi8KKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgICAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgICB7CisgICAgICBpZiAoIWlNKSAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXNrIHVuZGVyZmxvdyA/ICovCisgICAgICB7CisgICAgICAgIGlCID0gKnBXb3Jrcm93OyAgICAgICAgICAgICAgICAvKiBnZXQgbmV4dCBpbnB1dC1ieXRlICovCisgICAgICAgIHBXb3Jrcm93Kys7CisgICAgICAgIGlNID0gMHhDMDsKKyAgICAgICAgaVMgPSA2OworICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2FsY3VsYXRlIHRoZSBpbmRleCAqLworICAgICAgKnBPdXRyb3cgPSAobW5nX3VpbnQ4KSgoKnBPdXRyb3cgKyAoKGlCICYgaU0pID4+IGlTKSkgJiAweDAzKTsKKworICAgICAgcE91dHJvdyArPSBwRGF0YS0+aUNvbGluYzsgICAgICAgLyogbmV4dCBwaXhlbCAqLworICAgICAgaU0gPj49ICAyOworICAgICAgaVMgLT0gMjsKKyAgICB9CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ERUxUQV9JRFgyLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBtbmdfc3RvcmVfaWR4MiAocERhdGEpOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfZGVsdGFfaWR4NCAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfaW1hZ2VkYXRhcCBwQnVmID0gKChtbmdfaW1hZ2VwKXBEYXRhLT5wRGVsdGFJbWFnZSktPnBJbWdidWY7CisgIG1uZ191aW50OHAgICAgIHBXb3Jrcm93OworICBtbmdfdWludDhwICAgICBwT3V0cm93OworICBtbmdfaW50MzIgICAgICBpWDsKKyAgbW5nX3VpbnQ4ICAgICAgaUI7CisgIG1uZ191aW50OCAgICAgIGlNOworICBtbmdfdWludDMyICAgICBpUzsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ERUxUQV9JRFg0LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0ZW1wb3Jhcnkgd29yayBwb2ludGVycyAqLworICBwV29ya3JvdyA9IHBEYXRhLT5wV29ya3JvdyArIHBEYXRhLT5pUGl4ZWxvZnM7CisgIHBPdXRyb3cgID0gcEJ1Zi0+cEltZ2RhdGEgKyAocERhdGEtPmlSb3cgICAgICAgICAqIHBCdWYtPmlSb3dzaXplICAgKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocERhdGEtPmlEZWx0YUJsb2NreSAqIHBCdWYtPmlSb3dzaXplICAgKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocERhdGEtPmlDb2wgICAgICAgICAqIHBCdWYtPmlTYW1wbGVzaXplKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocERhdGEtPmlEZWx0YUJsb2NreCAqIHBCdWYtPmlTYW1wbGVzaXplKTsKKyAgaU0gICAgICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0IGF0IHBpeGVsIDAgKi8KKyAgaUIgICAgICAgPSAwOworICBpUyAgICAgICA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwaXhlbCByZXBsYWNlID8gKi8KKyAgaWYgKHBEYXRhLT5pRGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfQkxPQ0tQSVhFTFJFUExBQ0UpCisgIHsKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgICAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgICB7CisgICAgICBpZiAoIWlNKSAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXNrIHVuZGVyZmxvdyA/ICovCisgICAgICB7CisgICAgICAgIGlCID0gKnBXb3Jrcm93OyAgICAgICAgICAgICAgICAvKiBnZXQgbmV4dCBpbnB1dC1ieXRlICovCisgICAgICAgIHBXb3Jrcm93Kys7CisgICAgICAgIGlNID0gMHhGMDsKKyAgICAgICAgaVMgPSA0OworICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHV0IHRoZSBpbmRleCAqLworICAgICAgKnBPdXRyb3cgPSAobW5nX3VpbnQ4KSgoaUIgJiBpTSkgPj4gaVMpOworCisgICAgICBwT3V0cm93ICs9IHBEYXRhLT5pQ29saW5jOyAgICAgICAvKiBuZXh0IHBpeGVsICovCisgICAgICBpTSA+Pj0gIDQ7CisgICAgICBpUyAtPSA0OworICAgIH0KKyAgfQorICBlbHNlCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwaXhlbCBhZGQgISAqLworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICAgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICAgIHsKKyAgICAgIGlmICghaU0pICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1hc2sgdW5kZXJmbG93ID8gKi8KKyAgICAgIHsKKyAgICAgICAgaUIgPSAqcFdvcmtyb3c7ICAgICAgICAgICAgICAgIC8qIGdldCBuZXh0IGlucHV0LWJ5dGUgKi8KKyAgICAgICAgcFdvcmtyb3crKzsKKyAgICAgICAgaU0gPSAweEYwOworICAgICAgICBpUyA9IDQ7CisgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjYWxjdWxhdGUgdGhlIGluZGV4ICovCisgICAgICAqcE91dHJvdyA9IChtbmdfdWludDgpKCgqcE91dHJvdyArICgoaUIgJiBpTSkgPj4gaVMpKSAmIDB4MEYpOworCisgICAgICBwT3V0cm93ICs9IHBEYXRhLT5pQ29saW5jOyAgICAgICAvKiBuZXh0IHBpeGVsICovCisgICAgICBpTSA+Pj0gIDQ7CisgICAgICBpUyAtPSA0OworICAgIH0KKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RFTFRBX0lEWDQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIG1uZ19zdG9yZV9pZHg0IChwRGF0YSk7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX2RlbHRhX2lkeDggKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX2ltYWdlZGF0YXAgcEJ1ZiA9ICgobW5nX2ltYWdlcClwRGF0YS0+cERlbHRhSW1hZ2UpLT5wSW1nYnVmOworICBtbmdfdWludDhwICAgICBwV29ya3JvdzsKKyAgbW5nX3VpbnQ4cCAgICAgcE91dHJvdzsKKyAgbW5nX2ludDMyICAgICAgaVg7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fREVMVEFfSURYOCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGVtcG9yYXJ5IHdvcmsgcG9pbnRlcnMgKi8KKyAgcFdvcmtyb3cgPSBwRGF0YS0+cFdvcmtyb3cgKyBwRGF0YS0+aVBpeGVsb2ZzOworICBwT3V0cm93ICA9IHBCdWYtPnBJbWdkYXRhICsgKHBEYXRhLT5pUm93ICAgICAgICAgKiBwQnVmLT5pUm93c2l6ZSAgICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBEYXRhLT5pRGVsdGFCbG9ja3kgKiBwQnVmLT5pUm93c2l6ZSAgICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBEYXRhLT5pQ29sICAgICAgICAgKiBwQnVmLT5pU2FtcGxlc2l6ZSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBEYXRhLT5pRGVsdGFCbG9ja3ggKiBwQnVmLT5pU2FtcGxlc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwaXhlbCByZXBsYWNlID8gKi8KKyAgaWYgKHBEYXRhLT5pRGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfQkxPQ0tQSVhFTFJFUExBQ0UpCisgIHsKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgICAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgICB7CisgICAgICAqcE91dHJvdyA9ICpwV29ya3JvdzsgICAgICAgICAgICAvKiBwdXQgaW4gb2JqZWN0IGJ1ZmZlciAqLworCisgICAgICBwT3V0cm93ICs9IHBEYXRhLT5pQ29saW5jOyAgICAgICAvKiBuZXh0IHBpeGVsICovCisgICAgICBwV29ya3JvdysrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwaXhlbCBhZGQgISAqLworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICAgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkIHRvIG9iamVjdCBidWZmZXIgKi8KKyAgICAgICpwT3V0cm93ID0gKG1uZ191aW50OCkoKnBPdXRyb3cgKyAqcFdvcmtyb3cpOworCisgICAgICBwT3V0cm93ICs9IHBEYXRhLT5pQ29saW5jOyAgICAgICAvKiBuZXh0IHBpeGVsICovCisgICAgICBwV29ya3JvdysrOworICAgIH0KKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RFTFRBX0lEWDgsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIG1uZ19zdG9yZV9pZHg4IChwRGF0YSk7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19kZWx0YV9nYTggKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX2ltYWdlZGF0YXAgcEJ1ZiA9ICgobW5nX2ltYWdlcClwRGF0YS0+cERlbHRhSW1hZ2UpLT5wSW1nYnVmOworICBtbmdfdWludDhwICAgICBwV29ya3JvdzsKKyAgbW5nX3VpbnQ4cCAgICAgcE91dHJvdzsKKyAgbW5nX2ludDMyICAgICAgaVg7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fREVMVEFfR0E4LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0ZW1wb3Jhcnkgd29yayBwb2ludGVycyAqLworICBwV29ya3JvdyA9IHBEYXRhLT5wV29ya3JvdyArIHBEYXRhLT5pUGl4ZWxvZnM7CisgIHBPdXRyb3cgID0gcEJ1Zi0+cEltZ2RhdGEgKyAocERhdGEtPmlSb3cgICAgICAgICAqIHBCdWYtPmlSb3dzaXplICAgKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocERhdGEtPmlEZWx0YUJsb2NreSAqIHBCdWYtPmlSb3dzaXplICAgKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocERhdGEtPmlDb2wgICAgICAgICAqIHBCdWYtPmlTYW1wbGVzaXplKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocERhdGEtPmlEZWx0YUJsb2NreCAqIHBCdWYtPmlTYW1wbGVzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBpeGVsIHJlcGxhY2UgPyAqLworICBpZiAocERhdGEtPmlEZWx0YXR5cGUgPT0gTU5HX0RFTFRBVFlQRV9CTE9DS1BJWEVMUkVQTEFDRSkKKyAgeworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICAgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICAgIHsKKyAgICAgICpwT3V0cm93ICAgICA9ICpwV29ya3JvdzsgICAgICAgIC8qIHB1dCBpbiBvYmplY3QgYnVmZmVyICovCisgICAgICAqKHBPdXRyb3crMSkgPSAqKHBXb3Jrcm93KzEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmV4dCBwaXhlbCAqLworICAgICAgcE91dHJvdyAgKz0gKHBEYXRhLT5pQ29saW5jIDw8IDEpOworICAgICAgcFdvcmtyb3cgKz0gMjsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGl4ZWwgYWRkICEgKi8KKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgICAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZCB0byBvYmplY3QgYnVmZmVyICovCisgICAgICAqcE91dHJvdyAgICAgPSAobW5nX3VpbnQ4KSgqcE91dHJvdyAgICAgKyAqcFdvcmtyb3cgICAgKTsKKyAgICAgICoocE91dHJvdysxKSA9IChtbmdfdWludDgpKCoocE91dHJvdysxKSArICoocFdvcmtyb3crMSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmV4dCBwaXhlbCAqLworICAgICAgcE91dHJvdyAgKz0gKHBEYXRhLT5pQ29saW5jIDw8IDEpOworICAgICAgcFdvcmtyb3cgKz0gMjsKKyAgICB9CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ERUxUQV9HQTgsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIG1uZ19zdG9yZV9nYTggKHBEYXRhKTsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorbW5nX3JldGNvZGUgbW5nX2RlbHRhX2dhMTYgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX2ltYWdlZGF0YXAgcEJ1ZiA9ICgobW5nX2ltYWdlcClwRGF0YS0+cERlbHRhSW1hZ2UpLT5wSW1nYnVmOworICBtbmdfdWludDhwICAgICBwV29ya3JvdzsKKyAgbW5nX3VpbnQ4cCAgICAgcE91dHJvdzsKKyAgbW5nX2ludDMyICAgICAgaVg7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fREVMVEFfR0ExNiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGVtcG9yYXJ5IHdvcmsgcG9pbnRlcnMgKi8KKyAgcFdvcmtyb3cgPSBwRGF0YS0+cFdvcmtyb3cgKyBwRGF0YS0+aVBpeGVsb2ZzOworICBwT3V0cm93ICA9IHBCdWYtPnBJbWdkYXRhICsgKHBEYXRhLT5pUm93ICAgICAgICAgKiBwQnVmLT5pUm93c2l6ZSAgICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBEYXRhLT5pRGVsdGFCbG9ja3kgKiBwQnVmLT5pUm93c2l6ZSAgICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBEYXRhLT5pQ29sICAgICAgICAgKiBwQnVmLT5pU2FtcGxlc2l6ZSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBEYXRhLT5pRGVsdGFCbG9ja3ggKiBwQnVmLT5pU2FtcGxlc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwaXhlbCByZXBsYWNlID8gKi8KKyAgaWYgKHBEYXRhLT5pRGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfQkxPQ0tQSVhFTFJFUExBQ0UpCisgIHsKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgICAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgICB7CisgICAgICAqcE91dHJvdyAgICAgPSAqcFdvcmtyb3c7ICAgICAgICAvKiBwdXQgaW4gb2JqZWN0IGJ1ZmZlciAqLworICAgICAgKihwT3V0cm93KzEpID0gKihwV29ya3JvdysxKTsKKyAgICAgICoocE91dHJvdysyKSA9ICoocFdvcmtyb3crMik7CisgICAgICAqKHBPdXRyb3crMykgPSAqKHBXb3Jrcm93KzMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmV4dCBwaXhlbCAqLworICAgICAgcE91dHJvdyAgKz0gKHBEYXRhLT5pQ29saW5jIDw8IDIpOworICAgICAgcFdvcmtyb3cgKz0gNDsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGl4ZWwgYWRkICEgKi8KKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgICAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZCB0byBvYmplY3QgYnVmZmVyICovCisgICAgICBtbmdfcHV0X3VpbnQxNiAocE91dHJvdywgICAobW5nX3VpbnQxNikobW5nX2dldF91aW50MTYgKHBPdXRyb3cgICApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfZ2V0X3VpbnQxNiAocFdvcmtyb3cgICkgICApKTsKKyAgICAgIG1uZ19wdXRfdWludDE2IChwT3V0cm93KzIsIChtbmdfdWludDE2KShtbmdfZ2V0X3VpbnQxNiAocE91dHJvdysyICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19nZXRfdWludDE2IChwV29ya3JvdysyKSAgICkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmV4dCBwaXhlbCAqLworICAgICAgcE91dHJvdyAgKz0gKHBEYXRhLT5pQ29saW5jIDw8IDIpOworICAgICAgcFdvcmtyb3cgKz0gNDsKKyAgICB9CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ERUxUQV9HQTE2LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBtbmdfc3RvcmVfZ2ExNiAocERhdGEpOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19kZWx0YV9yZ2JhOCAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfaW1hZ2VkYXRhcCBwQnVmID0gKChtbmdfaW1hZ2VwKXBEYXRhLT5wRGVsdGFJbWFnZSktPnBJbWdidWY7CisgIG1uZ191aW50OHAgICAgIHBXb3Jrcm93OworICBtbmdfdWludDhwICAgICBwT3V0cm93OworICBtbmdfaW50MzIgICAgICBpWDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ERUxUQV9SR0JBOCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGVtcG9yYXJ5IHdvcmsgcG9pbnRlcnMgKi8KKyAgcFdvcmtyb3cgPSBwRGF0YS0+cFdvcmtyb3cgKyBwRGF0YS0+aVBpeGVsb2ZzOworICBwT3V0cm93ICA9IHBCdWYtPnBJbWdkYXRhICsgKHBEYXRhLT5pUm93ICAgICAgICAgKiBwQnVmLT5pUm93c2l6ZSAgICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBEYXRhLT5pRGVsdGFCbG9ja3kgKiBwQnVmLT5pUm93c2l6ZSAgICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBEYXRhLT5pQ29sICAgICAgICAgKiBwQnVmLT5pU2FtcGxlc2l6ZSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBEYXRhLT5pRGVsdGFCbG9ja3ggKiBwQnVmLT5pU2FtcGxlc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwaXhlbCByZXBsYWNlID8gKi8KKyAgaWYgKHBEYXRhLT5pRGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfQkxPQ0tQSVhFTFJFUExBQ0UpCisgIHsKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgICAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgICB7CisgICAgICAqcE91dHJvdyAgICAgPSAqcFdvcmtyb3c7ICAgICAgICAvKiBwdXQgaW4gb2JqZWN0IGJ1ZmZlciAqLworICAgICAgKihwT3V0cm93KzEpID0gKihwV29ya3JvdysxKTsKKyAgICAgICoocE91dHJvdysyKSA9ICoocFdvcmtyb3crMik7CisgICAgICAqKHBPdXRyb3crMykgPSAqKHBXb3Jrcm93KzMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmV4dCBwaXhlbCAqLworICAgICAgcE91dHJvdyAgKz0gKHBEYXRhLT5pQ29saW5jIDw8IDIpOworICAgICAgcFdvcmtyb3cgKz0gNDsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGl4ZWwgYWRkICEgKi8KKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgICAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZCB0byBvYmplY3QgYnVmZmVyICovCisgICAgICAqcE91dHJvdyAgICAgPSAobW5nX3VpbnQ4KSgqcE91dHJvdyAgICAgKyAqcFdvcmtyb3cgICAgKTsKKyAgICAgICoocE91dHJvdysxKSA9IChtbmdfdWludDgpKCoocE91dHJvdysxKSArICoocFdvcmtyb3crMSkpOworICAgICAgKihwT3V0cm93KzIpID0gKG1uZ191aW50OCkoKihwT3V0cm93KzIpICsgKihwV29ya3JvdysyKSk7CisgICAgICAqKHBPdXRyb3crMykgPSAobW5nX3VpbnQ4KSgqKHBPdXRyb3crMykgKyAqKHBXb3Jrcm93KzMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5leHQgcGl4ZWwgKi8KKyAgICAgIHBPdXRyb3cgICs9IChwRGF0YS0+aUNvbGluYyA8PCAyKTsKKyAgICAgIHBXb3Jrcm93ICs9IDQ7CisgICAgfQorICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fREVMVEFfUkdCQTgsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIG1uZ19zdG9yZV9yZ2JhOCAocERhdGEpOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCittbmdfcmV0Y29kZSBtbmdfZGVsdGFfcmdiYTE2IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ19pbWFnZWRhdGFwIHBCdWYgPSAoKG1uZ19pbWFnZXApcERhdGEtPnBEZWx0YUltYWdlKS0+cEltZ2J1ZjsKKyAgbW5nX3VpbnQ4cCAgICAgcFdvcmtyb3c7CisgIG1uZ191aW50OHAgICAgIHBPdXRyb3c7CisgIG1uZ19pbnQzMiAgICAgIGlYOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RFTFRBX1JHQkExNiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGVtcG9yYXJ5IHdvcmsgcG9pbnRlcnMgKi8KKyAgcFdvcmtyb3cgPSBwRGF0YS0+cFdvcmtyb3cgKyBwRGF0YS0+aVBpeGVsb2ZzOworICBwT3V0cm93ICA9IHBCdWYtPnBJbWdkYXRhICsgKHBEYXRhLT5pUm93ICAgICAgICAgKiBwQnVmLT5pUm93c2l6ZSAgICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBEYXRhLT5pRGVsdGFCbG9ja3kgKiBwQnVmLT5pUm93c2l6ZSAgICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBEYXRhLT5pQ29sICAgICAgICAgKiBwQnVmLT5pU2FtcGxlc2l6ZSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBEYXRhLT5pRGVsdGFCbG9ja3ggKiBwQnVmLT5pU2FtcGxlc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwaXhlbCByZXBsYWNlID8gKi8KKyAgaWYgKHBEYXRhLT5pRGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfQkxPQ0tQSVhFTFJFUExBQ0UpCisgIHsKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgICAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgICB7CisgICAgICBNTkdfQ09QWSAocE91dHJvdywgcFdvcmtyb3csIDgpOyAvKiBwdXQgaW4gb2JqZWN0IGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmV4dCBwaXhlbCAqLworICAgICAgcE91dHJvdyAgKz0gKHBEYXRhLT5pQ29saW5jIDw8IDMpOworICAgICAgcFdvcmtyb3cgKz0gODsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGl4ZWwgYWRkICEgKi8KKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgICAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZCB0byBvYmplY3QgYnVmZmVyICovCisgICAgICBtbmdfcHV0X3VpbnQxNiAocE91dHJvdywgICAobW5nX3VpbnQxNikobW5nX2dldF91aW50MTYgKHBPdXRyb3cgICApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfZ2V0X3VpbnQxNiAocFdvcmtyb3cgICkgICApKTsKKyAgICAgIG1uZ19wdXRfdWludDE2IChwT3V0cm93KzIsIChtbmdfdWludDE2KShtbmdfZ2V0X3VpbnQxNiAocE91dHJvdysyICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19nZXRfdWludDE2IChwV29ya3JvdysyKSAgICkpOworICAgICAgbW5nX3B1dF91aW50MTYgKHBPdXRyb3crNCwgKG1uZ191aW50MTYpKG1uZ19nZXRfdWludDE2IChwT3V0cm93KzQgKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2dldF91aW50MTYgKHBXb3Jrcm93KzQpICAgKSk7CisgICAgICBtbmdfcHV0X3VpbnQxNiAocE91dHJvdys2LCAobW5nX3VpbnQxNikobW5nX2dldF91aW50MTYgKHBPdXRyb3crNiApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfZ2V0X3VpbnQxNiAocFdvcmtyb3crNikgICApKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5leHQgcGl4ZWwgKi8KKyAgICAgIHBPdXRyb3cgICs9IChwRGF0YS0+aUNvbGluYyA8PCAzKTsKKyAgICAgIHBXb3Jrcm93ICs9IDg7CisgICAgfQorICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fREVMVEFfUkdCQTE2LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBtbmdfc3RvcmVfcmdiYTE2IChwRGF0YSk7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIERlbHRhLWltYWdlIHJvdyByb3V0aW5lcyAtIGFwcGx5IHRoZSBzb3VyY2Ugcm93IG9udG8gdGhlIHRhcmdldCAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PXzFfMl80QklUX1NVUFBPUlQKK21uZ19yZXRjb2RlIG1uZ19kZWx0YV9nMV9nMSAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfaW1hZ2VkYXRhcCBwQnVmID0gKChtbmdfaW1hZ2VwKXBEYXRhLT5wU3RvcmVvYmopLT5wSW1nYnVmOworICBtbmdfdWludDhwICAgICBwV29ya3JvdzsKKyAgbW5nX3VpbnQ4cCAgICAgcE91dHJvdzsKKyAgbW5nX2ludDMyICAgICAgaVg7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fREVMVEFfRzFfRzEsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBwV29ya3JvdyA9IHBEYXRhLT5wUkdCQXJvdzsKKyAgcE91dHJvdyAgPSBwQnVmLT5wSW1nZGF0YSArIChwRGF0YS0+aVJvdyAqIHBCdWYtPmlSb3dzaXplICAgKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocERhdGEtPmlDb2wgKiBwQnVmLT5pU2FtcGxlc2l6ZSk7CisKKyAgaWYgKChwRGF0YS0+aURlbHRhdHlwZSA9PSBNTkdfREVMVEFUWVBFX1JFUExBQ0UgICAgICAgICAgKSB8fAorICAgICAgKHBEYXRhLT5pRGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfQkxPQ0tQSVhFTFJFUExBQ0UpICAgICkKKyAgeworICAgIE1OR19DT1BZIChwT3V0cm93LCBwV29ya3JvdywgcERhdGEtPmlSb3dzYW1wbGVzKTsKKyAgfQorICBlbHNlCisgIGlmIChwRGF0YS0+aURlbHRhdHlwZSA9PSBNTkdfREVMVEFUWVBFX0JMT0NLUElYRUxBREQpCisgIHsKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgICAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgICB7CisgICAgICAqcE91dHJvdyA9IChtbmdfdWludDgpKCgobW5nX3VpbnQxNikqcE91dHJvdyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX3VpbnQxNikqcFdvcmtyb3cpICYgMHgwMSk7CisKKyAgICAgIHBPdXRyb3crKzsKKyAgICAgIHBXb3Jrcm93Kys7CisgICAgfQorICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fREVMVEFfRzFfRzEsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfZGVsdGFfZzJfZzIgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX2ltYWdlZGF0YXAgcEJ1ZiA9ICgobW5nX2ltYWdlcClwRGF0YS0+cFN0b3Jlb2JqKS0+cEltZ2J1ZjsKKyAgbW5nX3VpbnQ4cCAgICAgcFdvcmtyb3c7CisgIG1uZ191aW50OHAgICAgIHBPdXRyb3c7CisgIG1uZ19pbnQzMiAgICAgIGlYOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RFTFRBX0cyX0cyLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcFdvcmtyb3cgPSBwRGF0YS0+cFJHQkFyb3c7CisgIHBPdXRyb3cgID0gcEJ1Zi0+cEltZ2RhdGEgKyAocERhdGEtPmlSb3cgKiBwQnVmLT5pUm93c2l6ZSAgICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBEYXRhLT5pQ29sICogcEJ1Zi0+aVNhbXBsZXNpemUpOworCisgIGlmICgocERhdGEtPmlEZWx0YXR5cGUgPT0gTU5HX0RFTFRBVFlQRV9SRVBMQUNFICAgICAgICAgICkgfHwKKyAgICAgIChwRGF0YS0+aURlbHRhdHlwZSA9PSBNTkdfREVMVEFUWVBFX0JMT0NLUElYRUxSRVBMQUNFKSAgICApCisgIHsKKyAgICBNTkdfQ09QWSAocE91dHJvdywgcFdvcmtyb3csIHBEYXRhLT5pUm93c2FtcGxlcyk7CisgIH0KKyAgZWxzZQorICBpZiAocERhdGEtPmlEZWx0YXR5cGUgPT0gTU5HX0RFTFRBVFlQRV9CTE9DS1BJWEVMQUREKQorICB7CisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICAgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgICAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlSb3dzYW1wbGVzOyBpWCsrKQorI2VuZGlmCisgICAgeworICAgICAgKnBPdXRyb3cgPSAobW5nX3VpbnQ4KSgoKG1uZ191aW50MTYpKnBPdXRyb3cgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ191aW50MTYpKnBXb3Jrcm93KSAmIDB4MDMpOworCisgICAgICBwT3V0cm93Kys7CisgICAgICBwV29ya3JvdysrOworICAgIH0KKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RFTFRBX0cyX0cyLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX2RlbHRhX2c0X2c0IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ19pbWFnZWRhdGFwIHBCdWYgPSAoKG1uZ19pbWFnZXApcERhdGEtPnBTdG9yZW9iaiktPnBJbWdidWY7CisgIG1uZ191aW50OHAgICAgIHBXb3Jrcm93OworICBtbmdfdWludDhwICAgICBwT3V0cm93OworICBtbmdfaW50MzIgICAgICBpWDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ERUxUQV9HNF9HNCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBXb3Jrcm93ID0gcERhdGEtPnBSR0JBcm93OworICBwT3V0cm93ICA9IHBCdWYtPnBJbWdkYXRhICsgKHBEYXRhLT5pUm93ICogcEJ1Zi0+aVJvd3NpemUgICApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwRGF0YS0+aUNvbCAqIHBCdWYtPmlTYW1wbGVzaXplKTsKKworICBpZiAoKHBEYXRhLT5pRGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfUkVQTEFDRSAgICAgICAgICApIHx8CisgICAgICAocERhdGEtPmlEZWx0YXR5cGUgPT0gTU5HX0RFTFRBVFlQRV9CTE9DS1BJWEVMUkVQTEFDRSkgICAgKQorICB7CisgICAgTU5HX0NPUFkgKHBPdXRyb3csIHBXb3Jrcm93LCBwRGF0YS0+aVJvd3NhbXBsZXMpOworICB9CisgIGVsc2UKKyAgaWYgKHBEYXRhLT5pRGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfQkxPQ0tQSVhFTEFERCkKKyAgeworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICAgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICAgIHsKKyAgICAgICpwT3V0cm93ID0gKG1uZ191aW50OCkoKChtbmdfdWludDE2KSpwT3V0cm93ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfdWludDE2KSpwV29ya3JvdykgJiAweDBGKTsKKworICAgICAgcE91dHJvdysrOworICAgICAgcFdvcmtyb3crKzsKKyAgICB9CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ERUxUQV9HNF9HNCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX2RlbHRhX2c4X2c4IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ19pbWFnZWRhdGFwIHBCdWYgPSAoKG1uZ19pbWFnZXApcERhdGEtPnBTdG9yZW9iaiktPnBJbWdidWY7CisgIG1uZ191aW50OHAgICAgIHBXb3Jrcm93OworICBtbmdfdWludDhwICAgICBwT3V0cm93OworICBtbmdfaW50MzIgICAgICBpWDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ERUxUQV9HOF9HOCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBXb3Jrcm93ID0gcERhdGEtPnBSR0JBcm93OworICBwT3V0cm93ICA9IHBCdWYtPnBJbWdkYXRhICsgKHBEYXRhLT5pUm93ICogcEJ1Zi0+aVJvd3NpemUgICApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwRGF0YS0+aUNvbCAqIHBCdWYtPmlTYW1wbGVzaXplKTsKKworICBpZiAoKHBEYXRhLT5pRGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfUkVQTEFDRSAgICAgICAgICApIHx8CisgICAgICAocERhdGEtPmlEZWx0YXR5cGUgPT0gTU5HX0RFTFRBVFlQRV9CTE9DS1BJWEVMUkVQTEFDRSkgICAgKQorICB7CisgICAgTU5HX0NPUFkgKHBPdXRyb3csIHBXb3Jrcm93LCBwRGF0YS0+aVJvd3NhbXBsZXMpOworICB9CisgIGVsc2UKKyAgaWYgKHBEYXRhLT5pRGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfQkxPQ0tQSVhFTEFERCkKKyAgeworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICAgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICAgIHsKKyAgICAgICpwT3V0cm93ID0gKG1uZ191aW50OCkoKChtbmdfdWludDE2KSpwT3V0cm93ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfdWludDE2KSpwV29ya3JvdykgJiAweEZGKTsKKworICAgICAgcE91dHJvdysrOworICAgICAgcFdvcmtyb3crKzsKKyAgICB9CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ERUxUQV9HOF9HOCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKK21uZ19yZXRjb2RlIG1uZ19kZWx0YV9nMTZfZzE2IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ19pbWFnZWRhdGFwIHBCdWYgPSAoKG1uZ19pbWFnZXApcERhdGEtPnBTdG9yZW9iaiktPnBJbWdidWY7CisgIG1uZ191aW50OHAgICAgIHBXb3Jrcm93OworICBtbmdfdWludDhwICAgICBwT3V0cm93OworICBtbmdfaW50MzIgICAgICBpWDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ERUxUQV9HMTZfRzE2LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcFdvcmtyb3cgPSBwRGF0YS0+cFJHQkFyb3c7CisgIHBPdXRyb3cgID0gcEJ1Zi0+cEltZ2RhdGEgKyAocERhdGEtPmlSb3cgKiBwQnVmLT5pUm93c2l6ZSAgICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBEYXRhLT5pQ29sICogcEJ1Zi0+aVNhbXBsZXNpemUpOworCisgIGlmICgocERhdGEtPmlEZWx0YXR5cGUgPT0gTU5HX0RFTFRBVFlQRV9SRVBMQUNFICAgICAgICAgICkgfHwKKyAgICAgIChwRGF0YS0+aURlbHRhdHlwZSA9PSBNTkdfREVMVEFUWVBFX0JMT0NLUElYRUxSRVBMQUNFKSAgICApCisgIHsKKyAgICBNTkdfQ09QWSAocE91dHJvdywgcFdvcmtyb3csIChwRGF0YS0+aVJvd3NhbXBsZXMgPDwgMSkpOworICB9CisgIGVsc2UKKyAgaWYgKHBEYXRhLT5pRGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfQkxPQ0tQSVhFTEFERCkKKyAgeworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICAgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICAgIHsKKyAgICAgIG1uZ19wdXRfdWludDE2IChwT3V0cm93LCAobW5nX3VpbnQxNikoKG1uZ19nZXRfdWludDE2IChwT3V0cm93KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfZ2V0X3VpbnQxNiAocFdvcmtyb3cpKSAmIDB4RkZGRikpOworCisgICAgICBwT3V0cm93ICArPSAyOworICAgICAgcFdvcmtyb3cgKz0gMjsKKyAgICB9CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ERUxUQV9HMTZfRzE2LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorI2VuZGlmIC8qIE1OR19OT19ERUxUQV9QTkcgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX2RlbHRhX3JnYjhfcmdiOCAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfaW1hZ2VkYXRhcCBwQnVmID0gKChtbmdfaW1hZ2VwKXBEYXRhLT5wU3RvcmVvYmopLT5wSW1nYnVmOworICBtbmdfdWludDhwICAgICBwV29ya3JvdzsKKyAgbW5nX3VpbnQ4cCAgICAgcE91dHJvdzsKKyAgbW5nX2ludDMyICAgICAgaVg7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fREVMVEFfUkdCOF9SR0I4LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcFdvcmtyb3cgPSBwRGF0YS0+cFJHQkFyb3c7CisgIHBPdXRyb3cgID0gcEJ1Zi0+cEltZ2RhdGEgKyAocERhdGEtPmlSb3cgKiBwQnVmLT5pUm93c2l6ZSAgICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBEYXRhLT5pQ29sICogcEJ1Zi0+aVNhbXBsZXNpemUpOworCisgIGlmICgocERhdGEtPmlEZWx0YXR5cGUgPT0gTU5HX0RFTFRBVFlQRV9SRVBMQUNFICAgICAgICAgICkgfHwKKyAgICAgIChwRGF0YS0+aURlbHRhdHlwZSA9PSBNTkdfREVMVEFUWVBFX0JMT0NLUElYRUxSRVBMQUNFKSAgICApCisgIHsKKyAgICBNTkdfQ09QWSAocE91dHJvdywgcFdvcmtyb3csIHBEYXRhLT5pUm93c2FtcGxlcyAqIDMpOworICB9CisgIGVsc2UKKyAgaWYgKHBEYXRhLT5pRGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfQkxPQ0tQSVhFTEFERCkKKyAgeworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzKjM7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgICAgZm9yIChpWCA9IDA7IGlYIDwgKHBEYXRhLT5pUm93c2FtcGxlcyAqIDMpOyBpWCsrKQorI2VuZGlmCisgICAgeworICAgICAgKnBPdXRyb3cgPSAobW5nX3VpbnQ4KSgoKG1uZ191aW50MTYpKnBPdXRyb3cgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ191aW50MTYpKnBXb3Jrcm93KSAmIDB4RkYpOworCisgICAgICBwT3V0cm93Kys7CisgICAgICBwV29ya3JvdysrOworICAgIH0KKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RFTFRBX1JHQjhfUkdCOCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKK21uZ19yZXRjb2RlIG1uZ19kZWx0YV9yZ2IxNl9yZ2IxNiAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfaW1hZ2VkYXRhcCBwQnVmID0gKChtbmdfaW1hZ2VwKXBEYXRhLT5wU3RvcmVvYmopLT5wSW1nYnVmOworICBtbmdfdWludDhwICAgICBwV29ya3JvdzsKKyAgbW5nX3VpbnQ4cCAgICAgcE91dHJvdzsKKyAgbW5nX2ludDMyICAgICAgaVg7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fREVMVEFfUkdCMTZfUkdCMTYsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBwV29ya3JvdyA9IHBEYXRhLT5wUkdCQXJvdzsKKyAgcE91dHJvdyAgPSBwQnVmLT5wSW1nZGF0YSArIChwRGF0YS0+aVJvdyAqIHBCdWYtPmlSb3dzaXplICAgKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocERhdGEtPmlDb2wgKiBwQnVmLT5pU2FtcGxlc2l6ZSk7CisKKyAgaWYgKChwRGF0YS0+aURlbHRhdHlwZSA9PSBNTkdfREVMVEFUWVBFX1JFUExBQ0UgICAgICAgICAgKSB8fAorICAgICAgKHBEYXRhLT5pRGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfQkxPQ0tQSVhFTFJFUExBQ0UpICAgICkKKyAgeworICAgIE1OR19DT1BZIChwT3V0cm93LCBwV29ya3JvdywgKHBEYXRhLT5pUm93c2FtcGxlcyAqIDYpKTsKKyAgfQorICBlbHNlCisgIGlmIChwRGF0YS0+aURlbHRhdHlwZSA9PSBNTkdfREVMVEFUWVBFX0JMT0NLUElYRUxBREQpCisgIHsKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgICAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgICB7CisgICAgICBtbmdfcHV0X3VpbnQxNiAocE91dHJvdywgICAobW5nX3VpbnQxNikoKG1uZ19nZXRfdWludDE2IChwT3V0cm93ICApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2dldF91aW50MTYgKHBXb3Jrcm93ICApKSAmIDB4RkZGRikpOworICAgICAgbW5nX3B1dF91aW50MTYgKHBPdXRyb3crMiwgKG1uZ191aW50MTYpKChtbmdfZ2V0X3VpbnQxNiAocE91dHJvdysyKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19nZXRfdWludDE2IChwV29ya3JvdysyKSkgJiAweEZGRkYpKTsKKyAgICAgIG1uZ19wdXRfdWludDE2IChwT3V0cm93KzQsIChtbmdfdWludDE2KSgobW5nX2dldF91aW50MTYgKHBPdXRyb3crNCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfZ2V0X3VpbnQxNiAocFdvcmtyb3crNCkpICYgMHhGRkZGKSk7CisKKyAgICAgIHBPdXRyb3cgICs9IDY7CisgICAgICBwV29ya3JvdyArPSA2OworICAgIH0KKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RFTFRBX1JHQjE2X1JHQjE2LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKK21uZ19yZXRjb2RlIG1uZ19kZWx0YV9nYThfZ2E4IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ19pbWFnZWRhdGFwIHBCdWYgPSAoKG1uZ19pbWFnZXApcERhdGEtPnBTdG9yZW9iaiktPnBJbWdidWY7CisgIG1uZ191aW50OHAgICAgIHBXb3Jrcm93OworICBtbmdfdWludDhwICAgICBwT3V0cm93OworICBtbmdfaW50MzIgICAgICBpWDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ERUxUQV9HQThfR0E4LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcFdvcmtyb3cgPSBwRGF0YS0+cFJHQkFyb3c7CisgIHBPdXRyb3cgID0gcEJ1Zi0+cEltZ2RhdGEgKyAocERhdGEtPmlSb3cgKiBwQnVmLT5pUm93c2l6ZSAgICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBEYXRhLT5pQ29sICogcEJ1Zi0+aVNhbXBsZXNpemUpOworCisgIGlmICgocERhdGEtPmlEZWx0YXR5cGUgPT0gTU5HX0RFTFRBVFlQRV9SRVBMQUNFICAgICAgICAgICkgfHwKKyAgICAgIChwRGF0YS0+aURlbHRhdHlwZSA9PSBNTkdfREVMVEFUWVBFX0JMT0NLUElYRUxSRVBMQUNFKSAgICApCisgIHsKKyAgICBNTkdfQ09QWSAocE91dHJvdywgcFdvcmtyb3csIHBEYXRhLT5pUm93c2FtcGxlcyA8PCAxKTsKKyAgfQorICBlbHNlCisgIGlmIChwRGF0YS0+aURlbHRhdHlwZSA9PSBNTkdfREVMVEFUWVBFX0JMT0NLUElYRUxBREQpCisgIHsKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgICAgZm9yIChpWCA9IChwRGF0YS0+aVJvd3NhbXBsZXM8PDEpOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICAgIGZvciAoaVggPSAwOyBpWCA8IChwRGF0YS0+aVJvd3NhbXBsZXMgPDwgMSk7IGlYKyspCisjZW5kaWYKKyAgICB7CisgICAgICAqcE91dHJvdyA9IChtbmdfdWludDgpKCgobW5nX3VpbnQxNikqcE91dHJvdyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX3VpbnQxNikqcFdvcmtyb3cpICYgMHhGRik7CisKKyAgICAgIHBPdXRyb3crKzsKKyAgICAgIHBXb3Jrcm93Kys7CisgICAgfQorICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fREVMVEFfR0E4X0dBOCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19kZWx0YV9nYThfZzggKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX2ltYWdlZGF0YXAgcEJ1ZiA9ICgobW5nX2ltYWdlcClwRGF0YS0+cFN0b3Jlb2JqKS0+cEltZ2J1ZjsKKyAgbW5nX3VpbnQ4cCAgICAgcFdvcmtyb3c7CisgIG1uZ191aW50OHAgICAgIHBPdXRyb3c7CisgIG1uZ19pbnQzMiAgICAgIGlYOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RFTFRBX0dBOF9HOCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBXb3Jrcm93ID0gcERhdGEtPnBSR0JBcm93OworICBwT3V0cm93ICA9IHBCdWYtPnBJbWdkYXRhICsgKHBEYXRhLT5pUm93ICogcEJ1Zi0+aVJvd3NpemUgICApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwRGF0YS0+aUNvbCAqIHBCdWYtPmlTYW1wbGVzaXplKTsKKworICBpZiAocERhdGEtPmlEZWx0YXR5cGUgPT0gTU5HX0RFTFRBVFlQRV9CTE9DS0NPTE9SUkVQTEFDRSkKKyAgeworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICAgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICAgIHsKKyAgICAgICpwT3V0cm93ID0gKnBXb3Jrcm93OworCisgICAgICBwT3V0cm93ICs9IDI7CisgICAgICBwV29ya3JvdysrOworICAgIH0KKyAgfQorICBlbHNlCisgIGlmIChwRGF0YS0+aURlbHRhdHlwZSA9PSBNTkdfREVMVEFUWVBFX0JMT0NLQ09MT1JBREQpCisgIHsKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgICAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgICB7CisgICAgICAqcE91dHJvdyA9IChtbmdfdWludDgpKCgobW5nX3VpbnQxNikqcE91dHJvdyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX3VpbnQxNikqcFdvcmtyb3cpICYgMHhGRik7CisKKyAgICAgIHBPdXRyb3cgKz0gMjsKKyAgICAgIHBXb3Jrcm93Kys7CisgICAgfQorICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fREVMVEFfR0E4X0c4LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX2RlbHRhX2dhOF9hOCAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfaW1hZ2VkYXRhcCBwQnVmID0gKChtbmdfaW1hZ2VwKXBEYXRhLT5wU3RvcmVvYmopLT5wSW1nYnVmOworICBtbmdfdWludDhwICAgICBwV29ya3JvdzsKKyAgbW5nX3VpbnQ4cCAgICAgcE91dHJvdzsKKyAgbW5nX2ludDMyICAgICAgaVg7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fREVMVEFfR0E4X0E4LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcFdvcmtyb3cgPSBwRGF0YS0+cFJHQkFyb3c7CisgIHBPdXRyb3cgID0gcEJ1Zi0+cEltZ2RhdGEgKyAocERhdGEtPmlSb3cgKiBwQnVmLT5pUm93c2l6ZSAgICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBEYXRhLT5pQ29sICogcEJ1Zi0+aVNhbXBsZXNpemUpICsgMTsKKworICBpZiAocERhdGEtPmlEZWx0YXR5cGUgPT0gTU5HX0RFTFRBVFlQRV9CTE9DS0FMUEhBUkVQTEFDRSkKKyAgeworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICAgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICAgIHsKKyAgICAgICpwT3V0cm93ID0gKnBXb3Jrcm93OworCisgICAgICBwT3V0cm93ICs9IDI7CisgICAgICBwV29ya3JvdysrOworICAgIH0KKyAgfQorICBlbHNlCisgIGlmIChwRGF0YS0+aURlbHRhdHlwZSA9PSBNTkdfREVMVEFUWVBFX0JMT0NLQUxQSEFBREQpCisgIHsKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgICAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgICB7CisgICAgICAqcE91dHJvdyA9IChtbmdfdWludDgpKCgobW5nX3VpbnQxNikqcE91dHJvdyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX3VpbnQxNikqcFdvcmtyb3cpICYgMHhGRik7CisKKyAgICAgIHBPdXRyb3cgKz0gMjsKKyAgICAgIHBXb3Jrcm93Kys7CisgICAgfQorICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fREVMVEFfR0E4X0E4LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorbW5nX3JldGNvZGUgbW5nX2RlbHRhX2dhMTZfZ2ExNiAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfaW1hZ2VkYXRhcCBwQnVmID0gKChtbmdfaW1hZ2VwKXBEYXRhLT5wU3RvcmVvYmopLT5wSW1nYnVmOworICBtbmdfdWludDhwICAgICBwV29ya3JvdzsKKyAgbW5nX3VpbnQ4cCAgICAgcE91dHJvdzsKKyAgbW5nX2ludDMyICAgICAgaVg7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fREVMVEFfR0ExNl9HQTE2LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcFdvcmtyb3cgPSBwRGF0YS0+cFJHQkFyb3c7CisgIHBPdXRyb3cgID0gcEJ1Zi0+cEltZ2RhdGEgKyAocERhdGEtPmlSb3cgKiBwQnVmLT5pUm93c2l6ZSAgICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBEYXRhLT5pQ29sICogcEJ1Zi0+aVNhbXBsZXNpemUpOworCisgIGlmICgocERhdGEtPmlEZWx0YXR5cGUgPT0gTU5HX0RFTFRBVFlQRV9SRVBMQUNFICAgICAgICAgICkgfHwKKyAgICAgIChwRGF0YS0+aURlbHRhdHlwZSA9PSBNTkdfREVMVEFUWVBFX0JMT0NLUElYRUxSRVBMQUNFKSAgICApCisgIHsKKyAgICBNTkdfQ09QWSAocE91dHJvdywgcFdvcmtyb3csIChwRGF0YS0+aVJvd3NhbXBsZXMgPDwgMikpOworICB9CisgIGVsc2UKKyAgaWYgKHBEYXRhLT5pRGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfQkxPQ0tQSVhFTEFERCkKKyAgeworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICAgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICAgIHsKKyAgICAgIG1uZ19wdXRfdWludDE2IChwT3V0cm93LCAgIChtbmdfdWludDE2KSgobW5nX2dldF91aW50MTYgKHBPdXRyb3cgICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfZ2V0X3VpbnQxNiAocFdvcmtyb3cgICkpICYgMHhGRkZGKSk7CisgICAgICBtbmdfcHV0X3VpbnQxNiAocE91dHJvdysyLCAobW5nX3VpbnQxNikoKG1uZ19nZXRfdWludDE2IChwT3V0cm93KzIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2dldF91aW50MTYgKHBXb3Jrcm93KzIpKSAmIDB4RkZGRikpOworCisgICAgICBwT3V0cm93ICArPSA0OworICAgICAgcFdvcmtyb3cgKz0gNDsKKyAgICB9CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ERUxUQV9HQTE2X0dBMTYsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKK21uZ19yZXRjb2RlIG1uZ19kZWx0YV9nYTE2X2cxNiAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfaW1hZ2VkYXRhcCBwQnVmID0gKChtbmdfaW1hZ2VwKXBEYXRhLT5wU3RvcmVvYmopLT5wSW1nYnVmOworICBtbmdfdWludDhwICAgICBwV29ya3JvdzsKKyAgbW5nX3VpbnQ4cCAgICAgcE91dHJvdzsKKyAgbW5nX2ludDMyICAgICAgaVg7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fREVMVEFfR0ExNl9HMTYsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBwV29ya3JvdyA9IHBEYXRhLT5wUkdCQXJvdzsKKyAgcE91dHJvdyAgPSBwQnVmLT5wSW1nZGF0YSArIChwRGF0YS0+aVJvdyAqIHBCdWYtPmlSb3dzaXplICAgKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocERhdGEtPmlDb2wgKiBwQnVmLT5pU2FtcGxlc2l6ZSk7CisKKyAgaWYgKHBEYXRhLT5pRGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfQkxPQ0tDT0xPUlJFUExBQ0UpCisgIHsKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgICAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgICB7CisgICAgICBtbmdfcHV0X3VpbnQxNiAocE91dHJvdywgbW5nX2dldF91aW50MTYgKHBXb3Jrcm93KSk7CisKKyAgICAgIHBPdXRyb3cgICs9IDQ7CisgICAgICBwV29ya3JvdyArPSAyOworICAgIH0KKyAgfQorICBlbHNlCisgIGlmIChwRGF0YS0+aURlbHRhdHlwZSA9PSBNTkdfREVMVEFUWVBFX0JMT0NLQ09MT1JBREQpCisgIHsKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgICAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgICB7CisgICAgICBtbmdfcHV0X3VpbnQxNiAocE91dHJvdywgKG1uZ191aW50MTYpKChtbmdfZ2V0X3VpbnQxNiAocE91dHJvdykgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2dldF91aW50MTYgKHBXb3Jrcm93KSkgJiAweEZGRkYpKTsKKworICAgICAgcE91dHJvdyAgKz0gNDsKKyAgICAgIHBXb3Jrcm93ICs9IDI7CisgICAgfQorICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fREVMVEFfR0ExNl9HMTYsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKK21uZ19yZXRjb2RlIG1uZ19kZWx0YV9nYTE2X2ExNiAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfaW1hZ2VkYXRhcCBwQnVmID0gKChtbmdfaW1hZ2VwKXBEYXRhLT5wU3RvcmVvYmopLT5wSW1nYnVmOworICBtbmdfdWludDhwICAgICBwV29ya3JvdzsKKyAgbW5nX3VpbnQ4cCAgICAgcE91dHJvdzsKKyAgbW5nX2ludDMyICAgICAgaVg7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fREVMVEFfR0ExNl9BMTYsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBwV29ya3JvdyA9IHBEYXRhLT5wUkdCQXJvdzsKKyAgcE91dHJvdyAgPSBwQnVmLT5wSW1nZGF0YSArIChwRGF0YS0+aVJvdyAqIHBCdWYtPmlSb3dzaXplICAgKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocERhdGEtPmlDb2wgKiBwQnVmLT5pU2FtcGxlc2l6ZSk7CisKKyAgaWYgKHBEYXRhLT5pRGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfQkxPQ0tBTFBIQVJFUExBQ0UpCisgIHsKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgICAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgICB7CisgICAgICBtbmdfcHV0X3VpbnQxNiAocE91dHJvdysyLCBtbmdfZ2V0X3VpbnQxNiAocFdvcmtyb3cpKTsKKworICAgICAgcE91dHJvdyAgKz0gNDsKKyAgICAgIHBXb3Jrcm93ICs9IDI7CisgICAgfQorICB9CisgIGVsc2UKKyAgaWYgKHBEYXRhLT5pRGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfQkxPQ0tBTFBIQUFERCkKKyAgeworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICAgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICAgIHsKKyAgICAgIG1uZ19wdXRfdWludDE2IChwT3V0cm93KzIsIChtbmdfdWludDE2KSgobW5nX2dldF91aW50MTYgKHBPdXRyb3crMikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfZ2V0X3VpbnQxNiAocFdvcmtyb3cpKSAmIDB4RkZGRikpOworCisgICAgICBwT3V0cm93ICArPSA0OworICAgICAgcFdvcmtyb3cgKz0gMjsKKyAgICB9CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ERUxUQV9HQTE2X0ExNiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKyNlbmRpZiAvKiBNTkdfTk9fREVMVEFfUE5HICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19kZWx0YV9yZ2JhOF9yZ2JhOCAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfaW1hZ2VkYXRhcCBwQnVmID0gKChtbmdfaW1hZ2VwKXBEYXRhLT5wU3RvcmVvYmopLT5wSW1nYnVmOworICBtbmdfdWludDhwICAgICBwV29ya3JvdzsKKyAgbW5nX3VpbnQ4cCAgICAgcE91dHJvdzsKKyAgbW5nX2ludDMyICAgICAgaVg7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fREVMVEFfUkdCQThfUkdCQTgsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBwV29ya3JvdyA9IHBEYXRhLT5wUkdCQXJvdzsKKyAgcE91dHJvdyAgPSBwQnVmLT5wSW1nZGF0YSArIChwRGF0YS0+aVJvdyAqIHBCdWYtPmlSb3dzaXplICAgKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocERhdGEtPmlDb2wgKiBwQnVmLT5pU2FtcGxlc2l6ZSk7CisKKyAgaWYgKChwRGF0YS0+aURlbHRhdHlwZSA9PSBNTkdfREVMVEFUWVBFX1JFUExBQ0UgICAgICAgICAgKSB8fAorICAgICAgKHBEYXRhLT5pRGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfQkxPQ0tQSVhFTFJFUExBQ0UpICAgICkKKyAgeworICAgIE1OR19DT1BZIChwT3V0cm93LCBwV29ya3JvdywgcERhdGEtPmlSb3dzYW1wbGVzIDw8IDIpOworICB9CisgIGVsc2UKKyAgaWYgKHBEYXRhLT5pRGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfQkxPQ0tQSVhFTEFERCkKKyAgeworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgICBmb3IgKGlYID0gKHBEYXRhLT5pUm93c2FtcGxlcyA8PCAyKTsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgICBmb3IgKGlYID0gMDsgaVggPCAocERhdGEtPmlSb3dzYW1wbGVzIDw8IDIpOyBpWCsrKQorI2VuZGlmCisgICAgeworICAgICAgKnBPdXRyb3cgPSAobW5nX3VpbnQ4KSgoKG1uZ191aW50MTYpKnBPdXRyb3cgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ191aW50MTYpKnBXb3Jrcm93KSAmIDB4RkYpOworCisgICAgICBwT3V0cm93Kys7CisgICAgICBwV29ya3JvdysrOworICAgIH0KKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RFTFRBX1JHQkE4X1JHQkE4LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCittbmdfcmV0Y29kZSBtbmdfZGVsdGFfcmdiYThfcmdiOCAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfaW1hZ2VkYXRhcCBwQnVmID0gKChtbmdfaW1hZ2VwKXBEYXRhLT5wU3RvcmVvYmopLT5wSW1nYnVmOworICBtbmdfdWludDhwICAgICBwV29ya3JvdzsKKyAgbW5nX3VpbnQ4cCAgICAgcE91dHJvdzsKKyAgbW5nX2ludDMyICAgICAgaVg7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fREVMVEFfUkdCQThfUkdCOCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBXb3Jrcm93ID0gcERhdGEtPnBSR0JBcm93OworICBwT3V0cm93ICA9IHBCdWYtPnBJbWdkYXRhICsgKHBEYXRhLT5pUm93ICogcEJ1Zi0+aVJvd3NpemUgICApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwRGF0YS0+aUNvbCAqIHBCdWYtPmlTYW1wbGVzaXplKTsKKworICBpZiAocERhdGEtPmlEZWx0YXR5cGUgPT0gTU5HX0RFTFRBVFlQRV9CTE9DS0NPTE9SUkVQTEFDRSkKKyAgeworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICAgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICAgIHsKKyAgICAgICpwT3V0cm93ICAgICA9ICpwV29ya3JvdzsKKyAgICAgICoocE91dHJvdysxKSA9ICoocFdvcmtyb3crMSk7CisgICAgICAqKHBPdXRyb3crMikgPSAqKHBXb3Jrcm93KzIpOworCisgICAgICBwT3V0cm93ICArPSA0OworICAgICAgcFdvcmtyb3cgKz0gMzsKKyAgICB9CisgIH0KKyAgZWxzZQorICBpZiAocERhdGEtPmlEZWx0YXR5cGUgPT0gTU5HX0RFTFRBVFlQRV9CTE9DS0NPTE9SQUREKQorICB7CisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICAgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgICAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlSb3dzYW1wbGVzOyBpWCsrKQorI2VuZGlmCisgICAgeworICAgICAgKnBPdXRyb3cgICAgID0gKG1uZ191aW50OCkoKChtbmdfdWludDE2KSpwT3V0cm93ICAgICArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ191aW50MTYpKnBXb3Jrcm93ICAgICkgJiAweEZGKTsKKyAgICAgICoocE91dHJvdysxKSA9IChtbmdfdWludDgpKCgobW5nX3VpbnQxNikqKHBPdXRyb3crMSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfdWludDE2KSoocFdvcmtyb3crMSkpICYgMHhGRik7CisgICAgICAqKHBPdXRyb3crMikgPSAobW5nX3VpbnQ4KSgoKG1uZ191aW50MTYpKihwT3V0cm93KzIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX3VpbnQxNikqKHBXb3Jrcm93KzIpKSAmIDB4RkYpOworCisgICAgICBwT3V0cm93ICArPSA0OworICAgICAgcFdvcmtyb3cgKz0gMzsKKyAgICB9CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ERUxUQV9SR0JBOF9SR0I4LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX2RlbHRhX3JnYmE4X2E4IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ19pbWFnZWRhdGFwIHBCdWYgPSAoKG1uZ19pbWFnZXApcERhdGEtPnBTdG9yZW9iaiktPnBJbWdidWY7CisgIG1uZ191aW50OHAgICAgIHBXb3Jrcm93OworICBtbmdfdWludDhwICAgICBwT3V0cm93OworICBtbmdfaW50MzIgICAgICBpWDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ERUxUQV9SR0JBOF9BOCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBXb3Jrcm93ID0gcERhdGEtPnBSR0JBcm93OworICBwT3V0cm93ICA9IHBCdWYtPnBJbWdkYXRhICsgKHBEYXRhLT5pUm93ICogcEJ1Zi0+aVJvd3NpemUgICApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwRGF0YS0+aUNvbCAqIHBCdWYtPmlTYW1wbGVzaXplKSArIDM7CisKKyAgaWYgKHBEYXRhLT5pRGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfQkxPQ0tBTFBIQVJFUExBQ0UpCisgIHsKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgICAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgICB7CisgICAgICAqcE91dHJvdyA9ICpwV29ya3JvdzsKKworICAgICAgcE91dHJvdyArPSA0OworICAgICAgcFdvcmtyb3crKzsKKyAgICB9CisgIH0KKyAgZWxzZQorICBpZiAocERhdGEtPmlEZWx0YXR5cGUgPT0gTU5HX0RFTFRBVFlQRV9CTE9DS0FMUEhBQUREKQorICB7CisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICAgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgICAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlSb3dzYW1wbGVzOyBpWCsrKQorI2VuZGlmCisgICAgeworICAgICAgKnBPdXRyb3cgPSAobW5nX3VpbnQ4KSgoKG1uZ191aW50MTYpKnBPdXRyb3cgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ191aW50MTYpKnBXb3Jrcm93KSAmIDB4RkYpOworCisgICAgICBwT3V0cm93ICs9IDQ7CisgICAgICBwV29ya3JvdysrOworICAgIH0KKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RFTFRBX1JHQkE4X0E4LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZiAvKiBNTkdfTk9fREVMVEFfUE5HICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKK21uZ19yZXRjb2RlIG1uZ19kZWx0YV9yZ2JhMTZfcmdiYTE2IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ19pbWFnZWRhdGFwIHBCdWYgPSAoKG1uZ19pbWFnZXApcERhdGEtPnBTdG9yZW9iaiktPnBJbWdidWY7CisgIG1uZ191aW50OHAgICAgIHBXb3Jrcm93OworICBtbmdfdWludDhwICAgICBwT3V0cm93OworICBtbmdfaW50MzIgICAgICBpWDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ERUxUQV9SR0JBMTZfUkdCQTE2LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcFdvcmtyb3cgPSBwRGF0YS0+cFJHQkFyb3c7CisgIHBPdXRyb3cgID0gcEJ1Zi0+cEltZ2RhdGEgKyAocERhdGEtPmlSb3cgKiBwQnVmLT5pUm93c2l6ZSAgICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBEYXRhLT5pQ29sICogcEJ1Zi0+aVNhbXBsZXNpemUpOworCisgIGlmICgocERhdGEtPmlEZWx0YXR5cGUgPT0gTU5HX0RFTFRBVFlQRV9SRVBMQUNFICAgICAgICAgICkgfHwKKyAgICAgIChwRGF0YS0+aURlbHRhdHlwZSA9PSBNTkdfREVMVEFUWVBFX0JMT0NLUElYRUxSRVBMQUNFKSAgICApCisgIHsKKyAgICBNTkdfQ09QWSAocE91dHJvdywgcFdvcmtyb3csIChwRGF0YS0+aVJvd3NhbXBsZXMgPDwgMykpOworICB9CisgIGVsc2UKKyAgaWYgKHBEYXRhLT5pRGVsdGF0eXBlID09IE1OR19ERUxUQVRZUEVfQkxPQ0tQSVhFTEFERCkKKyAgeworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICAgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICAgIHsKKyAgICAgIG1uZ19wdXRfdWludDE2IChwT3V0cm93LCAgIChtbmdfdWludDE2KSgobW5nX2dldF91aW50MTYgKHBPdXRyb3cgICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfZ2V0X3VpbnQxNiAocFdvcmtyb3cgICkpICYgMHhGRkZGKSk7CisgICAgICBtbmdfcHV0X3VpbnQxNiAocE91dHJvdysyLCAobW5nX3VpbnQxNikoKG1uZ19nZXRfdWludDE2IChwT3V0cm93KzIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2dldF91aW50MTYgKHBXb3Jrcm93KzIpKSAmIDB4RkZGRikpOworICAgICAgbW5nX3B1dF91aW50MTYgKHBPdXRyb3crNCwgKG1uZ191aW50MTYpKChtbmdfZ2V0X3VpbnQxNiAocE91dHJvdys0KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19nZXRfdWludDE2IChwV29ya3Jvdys0KSkgJiAweEZGRkYpKTsKKyAgICAgIG1uZ19wdXRfdWludDE2IChwT3V0cm93KzYsIChtbmdfdWludDE2KSgobW5nX2dldF91aW50MTYgKHBPdXRyb3crNikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfZ2V0X3VpbnQxNiAocFdvcmtyb3crNikpICYgMHhGRkZGKSk7CisKKyAgICAgIHBPdXRyb3cgICs9IDg7CisgICAgICBwV29ya3JvdyArPSA4OworICAgIH0KKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RFTFRBX1JHQkExNl9SR0JBMTYsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorbW5nX3JldGNvZGUgbW5nX2RlbHRhX3JnYmExNl9yZ2IxNiAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfaW1hZ2VkYXRhcCBwQnVmID0gKChtbmdfaW1hZ2VwKXBEYXRhLT5wU3RvcmVvYmopLT5wSW1nYnVmOworICBtbmdfdWludDhwICAgICBwV29ya3JvdzsKKyAgbW5nX3VpbnQ4cCAgICAgcE91dHJvdzsKKyAgbW5nX2ludDMyICAgICAgaVg7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fREVMVEFfUkdCQTE2X1JHQjE2LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcFdvcmtyb3cgPSBwRGF0YS0+cFJHQkFyb3c7CisgIHBPdXRyb3cgID0gcEJ1Zi0+cEltZ2RhdGEgKyAocERhdGEtPmlSb3cgKiBwQnVmLT5pUm93c2l6ZSAgICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBEYXRhLT5pQ29sICogcEJ1Zi0+aVNhbXBsZXNpemUpOworCisgIGlmIChwRGF0YS0+aURlbHRhdHlwZSA9PSBNTkdfREVMVEFUWVBFX0JMT0NLQ09MT1JSRVBMQUNFKQorICB7CisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICAgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgICAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlSb3dzYW1wbGVzOyBpWCsrKQorI2VuZGlmCisgICAgeworICAgICAgbW5nX3B1dF91aW50MTYgKHBPdXRyb3csICAgbW5nX2dldF91aW50MTYgKHBXb3Jrcm93ICApKTsKKyAgICAgIG1uZ19wdXRfdWludDE2IChwT3V0cm93KzIsIG1uZ19nZXRfdWludDE2IChwV29ya3JvdysyKSk7CisgICAgICBtbmdfcHV0X3VpbnQxNiAocE91dHJvdys0LCBtbmdfZ2V0X3VpbnQxNiAocFdvcmtyb3crNCkpOworCisgICAgICBwT3V0cm93ICArPSA4OworICAgICAgcFdvcmtyb3cgKz0gNjsKKyAgICB9CisgIH0KKyAgZWxzZQorICBpZiAocERhdGEtPmlEZWx0YXR5cGUgPT0gTU5HX0RFTFRBVFlQRV9CTE9DS0NPTE9SQUREKQorICB7CisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICAgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgICAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlSb3dzYW1wbGVzOyBpWCsrKQorI2VuZGlmCisgICAgeworICAgICAgbW5nX3B1dF91aW50MTYgKHBPdXRyb3csICAgKG1uZ191aW50MTYpKChtbmdfZ2V0X3VpbnQxNiAocE91dHJvdyAgKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19nZXRfdWludDE2IChwV29ya3JvdyAgKSkgJiAweEZGRkYpKTsKKyAgICAgIG1uZ19wdXRfdWludDE2IChwT3V0cm93KzIsIChtbmdfdWludDE2KSgobW5nX2dldF91aW50MTYgKHBPdXRyb3crMikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfZ2V0X3VpbnQxNiAocFdvcmtyb3crMikpICYgMHhGRkZGKSk7CisgICAgICBtbmdfcHV0X3VpbnQxNiAocE91dHJvdys0LCAobW5nX3VpbnQxNikoKG1uZ19nZXRfdWludDE2IChwT3V0cm93KzQpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2dldF91aW50MTYgKHBXb3Jrcm93KzQpKSAmIDB4RkZGRikpOworCisgICAgICBwT3V0cm93ICArPSA4OworICAgICAgcFdvcmtyb3cgKz0gNjsKKyAgICB9CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ERUxUQV9SR0JBMTZfUkdCMTYsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKK21uZ19yZXRjb2RlIG1uZ19kZWx0YV9yZ2JhMTZfYTE2IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ19pbWFnZWRhdGFwIHBCdWYgPSAoKG1uZ19pbWFnZXApcERhdGEtPnBTdG9yZW9iaiktPnBJbWdidWY7CisgIG1uZ191aW50OHAgICAgIHBXb3Jrcm93OworICBtbmdfdWludDhwICAgICBwT3V0cm93OworICBtbmdfaW50MzIgICAgICBpWDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ERUxUQV9SR0JBMTZfQTE2LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcFdvcmtyb3cgPSBwRGF0YS0+cFJHQkFyb3c7CisgIHBPdXRyb3cgID0gcEJ1Zi0+cEltZ2RhdGEgKyAocERhdGEtPmlSb3cgKiBwQnVmLT5pUm93c2l6ZSAgICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBEYXRhLT5pQ29sICogcEJ1Zi0+aVNhbXBsZXNpemUpOworCisgIGlmIChwRGF0YS0+aURlbHRhdHlwZSA9PSBNTkdfREVMVEFUWVBFX0JMT0NLQUxQSEFSRVBMQUNFKQorICB7CisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICAgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgICAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlSb3dzYW1wbGVzOyBpWCsrKQorI2VuZGlmCisgICAgeworICAgICAgbW5nX3B1dF91aW50MTYgKHBPdXRyb3crNiwgbW5nX2dldF91aW50MTYgKHBXb3Jrcm93KSk7CisKKyAgICAgIHBPdXRyb3cgICs9IDg7CisgICAgICBwV29ya3JvdyArPSAyOworICAgIH0KKyAgfQorICBlbHNlCisgIGlmIChwRGF0YS0+aURlbHRhdHlwZSA9PSBNTkdfREVMVEFUWVBFX0JMT0NLQUxQSEFBREQpCisgIHsKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgICAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgICB7CisgICAgICBtbmdfcHV0X3VpbnQxNiAocE91dHJvdys2LCAobW5nX3VpbnQxNikoKG1uZ19nZXRfdWludDE2IChwT3V0cm93KzYpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2dldF91aW50MTYgKHBXb3Jrcm93KSkgJiAweEZGRkYpKTsKKworICAgICAgcE91dHJvdyAgKz0gODsKKyAgICAgIHBXb3Jrcm93ICs9IDI7CisgICAgfQorICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fREVMVEFfUkdCQTE2X0ExNiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKyNlbmRpZiAvKiBNTkdfTk9fREVMVEFfUE5HICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBEZWx0YS1pbWFnZSByb3cgcm91dGluZXMgLSBzY2FsZSB0aGUgZGVsdGEgdG8gYml0ZGVwdGggb2YgdGFyZ2V0ICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKKyNpZm5kZWYgTU5HX05PXzFfMl80QklUX1NVUFBPUlQKK21uZ19yZXRjb2RlIG1uZ19zY2FsZV9nMV9nMiAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfdWludDhwIHBXb3Jrcm93ID0gcERhdGEtPnBSR0JBcm93OworICBtbmdfaW50MzIgIGlYOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1NDQUxFX0cxX0cyLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICB7CisgICAgKnBXb3Jrcm93ID0gKG1uZ191aW50OCkoKnBXb3Jrcm93IDw8IDEpOworICAgIHBXb3Jrcm93Kys7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9TQ0FMRV9HMV9HMiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19zY2FsZV9nMV9nNCAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfdWludDhwIHBXb3Jrcm93ID0gcERhdGEtPnBSR0JBcm93OworICBtbmdfaW50MzIgIGlYOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1NDQUxFX0cxX0c0LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICB7CisgICAgKnBXb3Jrcm93ID0gKG1uZ191aW50OCkoKnBXb3Jrcm93IDw8IDMpOworICAgIHBXb3Jrcm93Kys7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9TQ0FMRV9HMV9HNCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19zY2FsZV9nMV9nOCAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfdWludDhwIHBXb3Jrcm93ID0gcERhdGEtPnBSR0JBcm93OworICBtbmdfaW50MzIgIGlYOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1NDQUxFX0cxX0c4LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICB7CisgICAgKnBXb3Jrcm93ID0gKG1uZ191aW50OCkoKnBXb3Jrcm93IDw8IDcpOworICAgIHBXb3Jrcm93Kys7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9TQ0FMRV9HMV9HOCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKK21uZ19yZXRjb2RlIG1uZ19zY2FsZV9nMV9nMTYgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX3VpbnQ4cCBwV29ya3JvdyA9IHBEYXRhLT5wUkdCQXJvdzsKKyAgbW5nX3VpbnQ4cCBwT3V0cm93ICA9IHBEYXRhLT5wUkdCQXJvdzsKKyAgbW5nX2ludDMyICBpWDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9TQ0FMRV9HMV9HMTYsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBwV29ya3JvdyA9IHBXb3Jrcm93ICsgKHBEYXRhLT5pUm93c2FtcGxlcyAtIDEpOworICBwT3V0cm93ICA9IHBPdXRyb3cgICsgKChwRGF0YS0+aVJvd3NhbXBsZXMgLSAxKSA8PCAxKTsKKy8qICBwV29ya3JvdyA9IChtbmdfdWludDhwKSgobW5nX3VpbnQzMilwV29ya3JvdyArIHBEYXRhLT5pUm93c2FtcGxlcyAtIDEpOyAqLworLyogIHBPdXRyb3cgID0gKG1uZ191aW50OHApKChtbmdfdWludDMyKXBPdXRyb3cgICsgKChwRGF0YS0+aVJvd3NhbXBsZXMgLSAxKSA8PCAxKSk7ICovCisKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICB7CisgICAgKihwT3V0cm93KzEpID0gMDsKKyAgICAqcE91dHJvdyAgICAgPSAobW5nX3VpbnQ4KSgqcFdvcmtyb3cgPDwgNyk7CisKKyAgICBwV29ya3Jvdy0tOworICAgIHBPdXRyb3cgLT0gMjsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1NDQUxFX0cxX0cxNiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX3NjYWxlX2cyX2c0IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ191aW50OHAgcFdvcmtyb3cgPSBwRGF0YS0+cFJHQkFyb3c7CisgIG1uZ19pbnQzMiAgaVg7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fU0NBTEVfRzJfRzQsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlSb3dzYW1wbGVzOyBpWCsrKQorI2VuZGlmCisgIHsKKyAgICAqcFdvcmtyb3cgPSAobW5nX3VpbnQ4KSgqcFdvcmtyb3cgPDwgMik7CisgICAgcFdvcmtyb3crKzsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1NDQUxFX0cyX0c0LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX3NjYWxlX2cyX2c4IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ191aW50OHAgcFdvcmtyb3cgPSBwRGF0YS0+cFJHQkFyb3c7CisgIG1uZ19pbnQzMiAgaVg7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fU0NBTEVfRzJfRzgsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlSb3dzYW1wbGVzOyBpWCsrKQorI2VuZGlmCisgIHsKKyAgICAqcFdvcmtyb3cgPSAobW5nX3VpbnQ4KSgqcFdvcmtyb3cgPDwgNik7CisgICAgcFdvcmtyb3crKzsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1NDQUxFX0cyX0c4LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorbW5nX3JldGNvZGUgbW5nX3NjYWxlX2cyX2cxNiAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfdWludDhwIHBXb3Jrcm93ID0gcERhdGEtPnBSR0JBcm93OworICBtbmdfdWludDhwIHBPdXRyb3cgID0gcERhdGEtPnBSR0JBcm93OworICBtbmdfaW50MzIgIGlYOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1NDQUxFX0cyX0cxNiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBXb3Jrcm93ID0gcFdvcmtyb3cgKyAocERhdGEtPmlSb3dzYW1wbGVzIC0gMSk7CisgIHBPdXRyb3cgID0gcE91dHJvdyAgKyAoKHBEYXRhLT5pUm93c2FtcGxlcyAtIDEpIDw8IDEpOworLyogIHBXb3Jrcm93ID0gKG1uZ191aW50OHApKChtbmdfdWludDMyKXBXb3Jrcm93ICsgcERhdGEtPmlSb3dzYW1wbGVzIC0gMSk7ICovCisvKiAgcE91dHJvdyAgPSAobW5nX3VpbnQ4cCkoKG1uZ191aW50MzIpcE91dHJvdyAgKyAoKHBEYXRhLT5pUm93c2FtcGxlcyAtIDEpIDw8IDEpKTsgKi8KKworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlSb3dzYW1wbGVzOyBpWCsrKQorI2VuZGlmCisgIHsKKyAgICAqKHBPdXRyb3crMSkgPSAwOworICAgICpwT3V0cm93ICAgICA9IChtbmdfdWludDgpKCpwV29ya3JvdyA8PCA2KTsKKworICAgIHBXb3Jrcm93LS07CisgICAgcE91dHJvdyAtPSAyOworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fU0NBTEVfRzJfRzE2LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfc2NhbGVfZzRfZzggKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX3VpbnQ4cCBwV29ya3JvdyA9IHBEYXRhLT5wUkdCQXJvdzsKKyAgbW5nX2ludDMyICBpWDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9TQ0FMRV9HNF9HOCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgeworICAgICpwV29ya3JvdyA9IChtbmdfdWludDgpKCpwV29ya3JvdyA8PCA0KTsKKyAgICBwV29ya3JvdysrOworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fU0NBTEVfRzRfRzgsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCittbmdfcmV0Y29kZSBtbmdfc2NhbGVfZzRfZzE2IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ191aW50OHAgcFdvcmtyb3cgPSBwRGF0YS0+cFJHQkFyb3c7CisgIG1uZ191aW50OHAgcE91dHJvdyAgPSBwRGF0YS0+cFJHQkFyb3c7CisgIG1uZ19pbnQzMiAgaVg7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fU0NBTEVfRzRfRzE2LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcFdvcmtyb3cgPSBwV29ya3JvdyArIChwRGF0YS0+aVJvd3NhbXBsZXMgLSAxKTsKKyAgcE91dHJvdyAgPSBwT3V0cm93ICArICgocERhdGEtPmlSb3dzYW1wbGVzIC0gMSkgPDwgMSk7CisvKiAgcFdvcmtyb3cgPSAobW5nX3VpbnQ4cCkoKG1uZ191aW50MzIpcFdvcmtyb3cgKyBwRGF0YS0+aVJvd3NhbXBsZXMgLSAxKTsgKi8KKy8qICBwT3V0cm93ICA9IChtbmdfdWludDhwKSgobW5nX3VpbnQzMilwT3V0cm93ICArICgocERhdGEtPmlSb3dzYW1wbGVzIC0gMSkgPDwgMSkpOyAqLworCisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgeworICAgICoocE91dHJvdysxKSA9IDA7CisgICAgKnBPdXRyb3cgICAgID0gKG1uZ191aW50OCkoKnBXb3Jrcm93IDw8IDQpOworCisgICAgcFdvcmtyb3ctLTsKKyAgICBwT3V0cm93IC09IDI7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9TQ0FMRV9HNF9HMTYsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisjZW5kaWYgLyogTU5HX05PXzFfMl80QklUX1NVUFBPUlQgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorbW5nX3JldGNvZGUgbW5nX3NjYWxlX2c4X2cxNiAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfdWludDhwIHBXb3Jrcm93ID0gcERhdGEtPnBSR0JBcm93OworICBtbmdfdWludDhwIHBPdXRyb3cgID0gcERhdGEtPnBSR0JBcm93OworICBtbmdfaW50MzIgIGlYOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1NDQUxFX0c4X0cxNiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBXb3Jrcm93ID0gcFdvcmtyb3cgKyAocERhdGEtPmlSb3dzYW1wbGVzIC0gMSk7CisgIHBPdXRyb3cgID0gcE91dHJvdyAgKyAoKHBEYXRhLT5pUm93c2FtcGxlcyAtIDEpIDw8IDEpOworLyogIHBXb3Jrcm93ID0gKG1uZ191aW50OHApKChtbmdfdWludDMyKXBXb3Jrcm93ICsgcERhdGEtPmlSb3dzYW1wbGVzIC0gMSk7ICovCisvKiAgcE91dHJvdyAgPSAobW5nX3VpbnQ4cCkoKG1uZ191aW50MzIpcE91dHJvdyAgKyAoKHBEYXRhLT5pUm93c2FtcGxlcyAtIDEpIDw8IDEpKTsgKi8KKworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlSb3dzYW1wbGVzOyBpWCsrKQorI2VuZGlmCisgIHsKKyAgICAqKHBPdXRyb3crMSkgPSAwOworICAgICpwT3V0cm93ICAgICA9ICpwV29ya3JvdzsKKworICAgIHBXb3Jrcm93LS07CisgICAgcE91dHJvdyAtPSAyOworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fU0NBTEVfRzhfRzE2LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCittbmdfcmV0Y29kZSBtbmdfc2NhbGVfZ2E4X2dhMTYgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX3VpbnQ4cCBwV29ya3JvdyA9IHBEYXRhLT5wUkdCQXJvdzsKKyAgbW5nX3VpbnQ4cCBwT3V0cm93ICA9IHBEYXRhLT5wUkdCQXJvdzsKKyAgbW5nX2ludDMyICBpWDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9TQ0FMRV9HQThfR0ExNiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBXb3Jrcm93ID0gcFdvcmtyb3cgKyAoKHBEYXRhLT5pUm93c2FtcGxlcyAtIDEpIDw8IDEpOworICBwT3V0cm93ICA9IHBPdXRyb3cgICsgKChwRGF0YS0+aVJvd3NhbXBsZXMgLSAxKSA8PCAyKTsKKy8qICBwV29ya3JvdyA9IChtbmdfdWludDhwKSgobW5nX3VpbnQzMilwV29ya3JvdyArICgocERhdGEtPmlSb3dzYW1wbGVzIC0gMSkgPDwgMSkpOyAqLworLyogIHBPdXRyb3cgID0gKG1uZ191aW50OHApKChtbmdfdWludDMyKXBPdXRyb3cgICsgKChwRGF0YS0+aVJvd3NhbXBsZXMgLSAxKSA8PCAyKSk7ICovCisKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICB7CisgICAgKihwT3V0cm93KzMpID0gMDsKKyAgICAqKHBPdXRyb3crMikgPSAqKHBXb3Jrcm93KzEpOworICAgICoocE91dHJvdysxKSA9IDA7CisgICAgKnBPdXRyb3cgICAgID0gKnBXb3Jrcm93OworCisgICAgcFdvcmtyb3cgLT0gMjsKKyAgICBwT3V0cm93ICAtPSA0OworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fU0NBTEVfR0E4X0dBMTYsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKK21uZ19yZXRjb2RlIG1uZ19zY2FsZV9yZ2I4X3JnYjE2IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ191aW50OHAgcFdvcmtyb3cgPSBwRGF0YS0+cFJHQkFyb3c7CisgIG1uZ191aW50OHAgcE91dHJvdyAgPSBwRGF0YS0+cFJHQkFyb3c7CisgIG1uZ19pbnQzMiAgaVg7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fU0NBTEVfUkdCOF9SR0IxNiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBXb3Jrcm93ID0gcFdvcmtyb3cgKyAoMyAqIChwRGF0YS0+aVJvd3NhbXBsZXMgLSAxKSk7CisgIHBPdXRyb3cgID0gcE91dHJvdyAgKyAoNiAqIChwRGF0YS0+aVJvd3NhbXBsZXMgLSAxKSk7CisvKiAgcFdvcmtyb3cgPSAobW5nX3VpbnQ4cCkoKG1uZ191aW50MzIpcFdvcmtyb3cgKyAzICogKHBEYXRhLT5pUm93c2FtcGxlcyAtIDEpKTsgKi8KKy8qICBwT3V0cm93ICA9IChtbmdfdWludDhwKSgobW5nX3VpbnQzMilwT3V0cm93ICArIDYgKiAocERhdGEtPmlSb3dzYW1wbGVzIC0gMSkpOyAqLworCisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgeworICAgICoocE91dHJvdys1KSA9IDA7CisgICAgKihwT3V0cm93KzQpID0gKihwV29ya3JvdysyKTsKKyAgICAqKHBPdXRyb3crMykgPSAwOworICAgICoocE91dHJvdysyKSA9ICoocFdvcmtyb3crMSk7CisgICAgKihwT3V0cm93KzEpID0gMDsKKyAgICAqcE91dHJvdyAgICAgPSAqcFdvcmtyb3c7CisKKyAgICBwV29ya3JvdyAtPSAzOworICAgIHBPdXRyb3cgIC09IDY7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9TQ0FMRV9SR0I4X1JHQjE2LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCittbmdfcmV0Y29kZSBtbmdfc2NhbGVfcmdiYThfcmdiYTE2IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ191aW50OHAgcFdvcmtyb3cgPSBwRGF0YS0+cFJHQkFyb3c7CisgIG1uZ191aW50OHAgcE91dHJvdyAgPSBwRGF0YS0+cFJHQkFyb3c7CisgIG1uZ19pbnQzMiAgaVg7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fU0NBTEVfUkdCQThfUkdCQTE2LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcFdvcmtyb3cgPSBwV29ya3JvdyArICgocERhdGEtPmlSb3dzYW1wbGVzIC0gMSkgPDwgMik7CisgIHBPdXRyb3cgID0gcE91dHJvdyAgKyAoKHBEYXRhLT5pUm93c2FtcGxlcyAtIDEpIDw8IDMpOworLyogIHBXb3Jrcm93ID0gKG1uZ191aW50OHApKChtbmdfdWludDMyKXBXb3Jrcm93ICsgKChwRGF0YS0+aVJvd3NhbXBsZXMgLSAxKSA8PCAyKSk7ICovCisvKiAgcE91dHJvdyAgPSAobW5nX3VpbnQ4cCkoKG1uZ191aW50MzIpcE91dHJvdyAgKyAoKHBEYXRhLT5pUm93c2FtcGxlcyAtIDEpIDw8IDMpKTsgKi8KKworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlSb3dzYW1wbGVzOyBpWCsrKQorI2VuZGlmCisgIHsKKyAgICAqKHBPdXRyb3crNykgPSAwOworICAgICoocE91dHJvdys2KSA9ICoocFdvcmtyb3crMyk7CisgICAgKihwT3V0cm93KzUpID0gMDsKKyAgICAqKHBPdXRyb3crNCkgPSAqKHBXb3Jrcm93KzIpOworICAgICoocE91dHJvdyszKSA9IDA7CisgICAgKihwT3V0cm93KzIpID0gKihwV29ya3JvdysxKTsKKyAgICAqKHBPdXRyb3crMSkgPSAwOworICAgICpwT3V0cm93ICAgICA9ICpwV29ya3JvdzsKKworICAgIHBXb3Jrcm93IC09IDQ7CisgICAgcE91dHJvdyAgLT0gODsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1NDQUxFX1JHQkE4X1JHQkExNiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fMV8yXzRCSVRfU1VQUE9SVAorbW5nX3JldGNvZGUgbW5nX3NjYWxlX2cyX2cxIChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ191aW50OHAgcFdvcmtyb3cgPSBwRGF0YS0+cFJHQkFyb3c7CisgIG1uZ19pbnQzMiAgaVg7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fU0NBTEVfRzJfRzEsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlSb3dzYW1wbGVzOyBpWCsrKQorI2VuZGlmCisgIHsKKyAgICAqcFdvcmtyb3cgPSAobW5nX3VpbnQ4KSgqcFdvcmtyb3cgPj4gMSk7CisgICAgcFdvcmtyb3crKzsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1NDQUxFX0cyX0cxLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX3NjYWxlX2c0X2cxIChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ191aW50OHAgcFdvcmtyb3cgPSBwRGF0YS0+cFJHQkFyb3c7CisgIG1uZ19pbnQzMiAgaVg7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fU0NBTEVfRzRfRzEsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlSb3dzYW1wbGVzOyBpWCsrKQorI2VuZGlmCisgIHsKKyAgICAqcFdvcmtyb3cgPSAobW5nX3VpbnQ4KSgqcFdvcmtyb3cgPj4gMyk7CisgICAgcFdvcmtyb3crKzsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1NDQUxFX0c0X0cxLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX3NjYWxlX2c4X2cxIChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ191aW50OHAgcFdvcmtyb3cgPSBwRGF0YS0+cFJHQkFyb3c7CisgIG1uZ19pbnQzMiAgaVg7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fU0NBTEVfRzhfRzEsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlSb3dzYW1wbGVzOyBpWCsrKQorI2VuZGlmCisgIHsKKyAgICAqcFdvcmtyb3cgPSAobW5nX3VpbnQ4KSgqcFdvcmtyb3cgPj4gNyk7CisgICAgcFdvcmtyb3crKzsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1NDQUxFX0c4X0cxLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorbW5nX3JldGNvZGUgbW5nX3NjYWxlX2cxNl9nMSAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfdWludDhwIHBXb3Jrcm93ID0gcERhdGEtPnBSR0JBcm93OworICBtbmdfdWludDhwIHBPdXRyb3cgID0gcERhdGEtPnBSR0JBcm93OworICBtbmdfaW50MzIgIGlYOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1NDQUxFX0cxNl9HMSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgeworICAgICpwT3V0cm93ID0gKG1uZ191aW50OCkobW5nX2dldF91aW50MTYgKHBXb3Jrcm93KSA+PiAxNSk7CisgICAgcE91dHJvdysrOworICAgIHBXb3Jrcm93ICs9IDI7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9TQ0FMRV9HMTZfRzEsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19zY2FsZV9nNF9nMiAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfdWludDhwIHBXb3Jrcm93ID0gcERhdGEtPnBSR0JBcm93OworICBtbmdfaW50MzIgIGlYOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1NDQUxFX0c0X0cyLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICB7CisgICAgKnBXb3Jrcm93ID0gKG1uZ191aW50OCkoKnBXb3Jrcm93ID4+IDIpOworICAgIHBXb3Jrcm93Kys7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9TQ0FMRV9HNF9HMiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19zY2FsZV9nOF9nMiAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfdWludDhwIHBXb3Jrcm93ID0gcERhdGEtPnBSR0JBcm93OworICBtbmdfaW50MzIgIGlYOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1NDQUxFX0c4X0cyLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICB7CisgICAgKnBXb3Jrcm93ID0gKG1uZ191aW50OCkoKnBXb3Jrcm93ID4+IDYpOworICAgIHBXb3Jrcm93Kys7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9TQ0FMRV9HOF9HMiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKK21uZ19yZXRjb2RlIG1uZ19zY2FsZV9nMTZfZzIgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX3VpbnQ4cCBwV29ya3JvdyA9IHBEYXRhLT5wUkdCQXJvdzsKKyAgbW5nX3VpbnQ4cCBwT3V0cm93ICA9IHBEYXRhLT5wUkdCQXJvdzsKKyAgbW5nX2ludDMyICBpWDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9TQ0FMRV9HMTZfRzIsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlSb3dzYW1wbGVzOyBpWCsrKQorI2VuZGlmCisgIHsKKyAgICAqcE91dHJvdyA9IChtbmdfdWludDgpKG1uZ19nZXRfdWludDE2IChwV29ya3JvdykgPj4gMTQpOworICAgIHBPdXRyb3crKzsKKyAgICBwV29ya3JvdyArPSAyOworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fU0NBTEVfRzE2X0cyLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfc2NhbGVfZzhfZzQgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX3VpbnQ4cCBwV29ya3JvdyA9IHBEYXRhLT5wUkdCQXJvdzsKKyAgbW5nX2ludDMyICBpWDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9TQ0FMRV9HOF9HNCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgeworICAgICpwV29ya3JvdyA9IChtbmdfdWludDgpKCpwV29ya3JvdyA+PiA0KTsKKyAgICBwV29ya3JvdysrOworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fU0NBTEVfRzhfRzQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCittbmdfcmV0Y29kZSBtbmdfc2NhbGVfZzE2X2c0IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ191aW50OHAgcFdvcmtyb3cgPSBwRGF0YS0+cFJHQkFyb3c7CisgIG1uZ191aW50OHAgcE91dHJvdyAgPSBwRGF0YS0+cFJHQkFyb3c7CisgIG1uZ19pbnQzMiAgaVg7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fU0NBTEVfRzE2X0c0LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICB7CisgICAgKnBPdXRyb3cgPSAobW5nX3VpbnQ4KShtbmdfZ2V0X3VpbnQxNiAocFdvcmtyb3cpID4+IDEyKTsKKyAgICBwT3V0cm93Kys7CisgICAgcFdvcmtyb3cgKz0gMjsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1NDQUxFX0cxNl9HNCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKyNlbmRpZiAvKiBOT18xXzJfNEJJVF9TVVBQT1JUICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19zY2FsZV9nMTZfZzggKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX3VpbnQ4cCBwV29ya3JvdyA9IHBEYXRhLT5wUkdCQXJvdzsKKyAgbW5nX3VpbnQ4cCBwT3V0cm93ICA9IHBEYXRhLT5wUkdCQXJvdzsKKyAgbW5nX2ludDMyICBpWDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9TQ0FMRV9HMTZfRzgsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlSb3dzYW1wbGVzOyBpWCsrKQorI2VuZGlmCisgIHsKKyAgICAqcE91dHJvdyA9IChtbmdfdWludDgpKG1uZ19nZXRfdWludDE2IChwV29ya3JvdykgPj4gOCk7CisgICAgcE91dHJvdysrOworICAgIHBXb3Jrcm93ICs9IDI7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9TQ0FMRV9HMTZfRzgsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfc2NhbGVfZ2ExNl9nYTggKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX3VpbnQ4cCBwV29ya3JvdyA9IHBEYXRhLT5wUkdCQXJvdzsKKyAgbW5nX3VpbnQ4cCBwT3V0cm93ICA9IHBEYXRhLT5wUkdCQXJvdzsKKyAgbW5nX2ludDMyICBpWDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9TQ0FMRV9HQTE2X0dBOCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgeworICAgICpwT3V0cm93ID0gKG1uZ191aW50OCkobW5nX2dldF91aW50MTYgKHBXb3Jrcm93KSA+PiA4KTsKKyAgICBwT3V0cm93Kys7CisgICAgcFdvcmtyb3cgKz0gMjsKKyAgICAqcE91dHJvdyA9IChtbmdfdWludDgpKG1uZ19nZXRfdWludDE2IChwV29ya3JvdykgPj4gOCk7CisgICAgcE91dHJvdysrOworICAgIHBXb3Jrcm93ICs9IDI7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9TQ0FMRV9HQTE2X0dBOCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19zY2FsZV9yZ2IxNl9yZ2I4IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ191aW50OHAgcFdvcmtyb3cgPSBwRGF0YS0+cFJHQkFyb3c7CisgIG1uZ191aW50OHAgcE91dHJvdyAgPSBwRGF0YS0+cFJHQkFyb3c7CisgIG1uZ19pbnQzMiAgaVg7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fU0NBTEVfUkdCMTZfUkdCOCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgeworICAgICpwT3V0cm93ID0gKG1uZ191aW50OCkobW5nX2dldF91aW50MTYgKHBXb3Jrcm93KSA+PiA4KTsKKyAgICBwT3V0cm93Kys7CisgICAgcFdvcmtyb3cgKz0gMjsKKyAgICAqcE91dHJvdyA9IChtbmdfdWludDgpKG1uZ19nZXRfdWludDE2IChwV29ya3JvdykgPj4gOCk7CisgICAgcE91dHJvdysrOworICAgIHBXb3Jrcm93ICs9IDI7CisgICAgKnBPdXRyb3cgPSAobW5nX3VpbnQ4KShtbmdfZ2V0X3VpbnQxNiAocFdvcmtyb3cpID4+IDgpOworICAgIHBPdXRyb3crKzsKKyAgICBwV29ya3JvdyArPSAyOworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fU0NBTEVfUkdCMTZfUkdCOCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19zY2FsZV9yZ2JhMTZfcmdiYTggKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX3VpbnQ4cCBwV29ya3JvdyA9IHBEYXRhLT5wUkdCQXJvdzsKKyAgbW5nX3VpbnQ4cCBwT3V0cm93ICA9IHBEYXRhLT5wUkdCQXJvdzsKKyAgbW5nX2ludDMyICBpWDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9TQ0FMRV9SR0JBMTZfUkdCQTgsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlSb3dzYW1wbGVzOyBpWCsrKQorI2VuZGlmCisgIHsKKyAgICAqcE91dHJvdyA9IChtbmdfdWludDgpKG1uZ19nZXRfdWludDE2IChwV29ya3JvdykgPj4gOCk7CisgICAgcE91dHJvdysrOworICAgIHBXb3Jrcm93ICs9IDI7CisgICAgKnBPdXRyb3cgPSAobW5nX3VpbnQ4KShtbmdfZ2V0X3VpbnQxNiAocFdvcmtyb3cpID4+IDgpOworICAgIHBPdXRyb3crKzsKKyAgICBwV29ya3JvdyArPSAyOworICAgICpwT3V0cm93ID0gKG1uZ191aW50OCkobW5nX2dldF91aW50MTYgKHBXb3Jrcm93KSA+PiA4KTsKKyAgICBwT3V0cm93Kys7CisgICAgcFdvcmtyb3cgKz0gMjsKKyAgICAqcE91dHJvdyA9IChtbmdfdWludDgpKG1uZ19nZXRfdWludDE2IChwV29ya3JvdykgPj4gOCk7CisgICAgcE91dHJvdysrOworICAgIHBXb3Jrcm93ICs9IDI7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9TQ0FMRV9SR0JBMTZfUkdCQTgsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBEZWx0YS1pbWFnZSBiaXQgcm91dGluZXMgLSBwcm9tb3RlIGJpdF9kZXB0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19OT18xXzJfNEJJVF9TVVBQT1JUCittbmdfdWludDggbW5nX3Byb21vdGVfcmVwbGljYXRlXzFfMiAobW5nX3VpbnQ4IGlCKQoreworICByZXR1cm4gKG1uZ191aW50OCkoKGlCIDw8IDEpIHwgaUIpOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfdWludDggbW5nX3Byb21vdGVfcmVwbGljYXRlXzFfNCAobW5nX3VpbnQ4IGlCKQoreworICBpQiA9IChtbmdfdWludDgpKChpQiA8PCAxKSArIGlCKTsKKyAgcmV0dXJuIChtbmdfdWludDgpKChpQiA8PCAyKSArIGlCKTsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3VpbnQ4IG1uZ19wcm9tb3RlX3JlcGxpY2F0ZV8xXzggKG1uZ191aW50OCBpQikKK3sKKyAgaUIgPSAobW5nX3VpbnQ4KSgoaUIgPDwgMSkgKyBpQik7CisgIGlCID0gKG1uZ191aW50OCkoKGlCIDw8IDIpICsgaUIpOworICByZXR1cm4gKG1uZ191aW50OCkoKGlCIDw8IDQpICsgaUIpOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCittbmdfdWludDE2IG1uZ19wcm9tb3RlX3JlcGxpY2F0ZV8xXzE2IChtbmdfdWludDggaUIpCit7CisgIGlCID0gKG1uZ191aW50OCkoKGlCIDw8IDEpICsgaUIpOworICBpQiA9IChtbmdfdWludDgpKChpQiA8PCAyKSArIGlCKTsKKyAgaUIgPSAobW5nX3VpbnQ4KSgoaUIgPDwgNCkgKyBpQik7CisgIHJldHVybiAobW5nX3VpbnQxNikoKChtbmdfdWludDE2KWlCIDw8IDgpICsgKG1uZ191aW50MTYpaUIpOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ191aW50OCBtbmdfcHJvbW90ZV9yZXBsaWNhdGVfMl80IChtbmdfdWludDggaUIpCit7CisgIHJldHVybiAobW5nX3VpbnQ4KSgoaUIgPDwgMikgKyBpQik7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ191aW50OCBtbmdfcHJvbW90ZV9yZXBsaWNhdGVfMl84IChtbmdfdWludDggaUIpCit7CisgIGlCID0gKG1uZ191aW50OCkoKGlCIDw8IDIpICsgaUIpOworICByZXR1cm4gKG1uZ191aW50OCkoKGlCIDw8IDQpICsgaUIpOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCittbmdfdWludDE2IG1uZ19wcm9tb3RlX3JlcGxpY2F0ZV8yXzE2IChtbmdfdWludDggaUIpCit7CisgIGlCID0gKG1uZ191aW50OCkoKGlCIDw8IDIpICsgaUIpOworICBpQiA9IChtbmdfdWludDgpKChpQiA8PCA0KSArIGlCKTsKKyAgcmV0dXJuIChtbmdfdWludDE2KSgoKG1uZ191aW50MTYpaUIgPDwgOCkgKyAobW5nX3VpbnQxNilpQik7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3VpbnQ4IG1uZ19wcm9tb3RlX3JlcGxpY2F0ZV80XzggKG1uZ191aW50OCBpQikKK3sKKyAgcmV0dXJuIChtbmdfdWludDgpKChpQiA8PCA0KSArIGlCKTsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorbW5nX3VpbnQxNiBtbmdfcHJvbW90ZV9yZXBsaWNhdGVfNF8xNiAobW5nX3VpbnQ4IGlCKQoreworICBpQiA9IChtbmdfdWludDgpKChpQiA8PCA0KSArIGlCKTsKKyAgcmV0dXJuIChtbmdfdWludDE2KSgoKG1uZ191aW50MTYpaUIgPDwgOCkgKyAobW5nX3VpbnQxNilpQik7Cit9CisjZW5kaWYKKyNlbmRpZiAvKiBOT18xXzJfNEJJVF9TVVBQT1JUICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKK21uZ191aW50MTYgbW5nX3Byb21vdGVfcmVwbGljYXRlXzhfMTYgKG1uZ191aW50OCBpQikKK3sKKyAgcmV0dXJuIChtbmdfdWludDE2KSgoKG1uZ191aW50MTYpaUIgPDwgOCkgKyAobW5nX3VpbnQxNilpQik7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmICFkZWZpbmVkKE1OR19OT19ERUxUQV9QTkcpCisjaWZuZGVmIE1OR19OT18xXzJfNEJJVF9TVVBQT1JUCittbmdfdWludDggbW5nX3Byb21vdGVfemVyb2ZpbGxfMV8yIChtbmdfdWludDggaUIpCit7CisgIHJldHVybiAobW5nX3VpbnQ4KShpQiA8PCAxKTsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3VpbnQ4IG1uZ19wcm9tb3RlX3plcm9maWxsXzFfNCAobW5nX3VpbnQ4IGlCKQoreworICByZXR1cm4gKG1uZ191aW50OCkoaUIgPDwgMyk7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ191aW50OCBtbmdfcHJvbW90ZV96ZXJvZmlsbF8xXzggKG1uZ191aW50OCBpQikKK3sKKyAgcmV0dXJuIChtbmdfdWludDgpKGlCIDw8IDcpOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCittbmdfdWludDE2IG1uZ19wcm9tb3RlX3plcm9maWxsXzFfMTYgKG1uZ191aW50OCBpQikKK3sKKyAgcmV0dXJuIChtbmdfdWludDE2KSgobW5nX3VpbnQxNilpQiA8PCAxNSk7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3VpbnQ4IG1uZ19wcm9tb3RlX3plcm9maWxsXzJfNCAobW5nX3VpbnQ4IGlCKQoreworICByZXR1cm4gKG1uZ191aW50OCkoaUIgPDwgMik7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ191aW50OCBtbmdfcHJvbW90ZV96ZXJvZmlsbF8yXzggKG1uZ191aW50OCBpQikKK3sKKyAgcmV0dXJuIChtbmdfdWludDgpKGlCIDw8IDYpOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCittbmdfdWludDE2IG1uZ19wcm9tb3RlX3plcm9maWxsXzJfMTYgKG1uZ191aW50OCBpQikKK3sKKyAgcmV0dXJuIChtbmdfdWludDE2KSgobW5nX3VpbnQxNilpQiA8PCAxNCk7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3VpbnQ4IG1uZ19wcm9tb3RlX3plcm9maWxsXzRfOCAobW5nX3VpbnQ4IGlCKQoreworICByZXR1cm4gKG1uZ191aW50OCkoaUIgPDwgNCk7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKK21uZ191aW50MTYgbW5nX3Byb21vdGVfemVyb2ZpbGxfNF8xNiAobW5nX3VpbnQ4IGlCKQoreworICByZXR1cm4gKG1uZ191aW50MTYpKChtbmdfdWludDE2KWlCIDw8IDEyKTsKK30KKyNlbmRpZgorI2VuZGlmIC8qIE1OR19OT18xXzJfNEJJVF9TVVBQT1JUICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKK21uZ191aW50MTYgbW5nX3Byb21vdGVfemVyb2ZpbGxfOF8xNiAobW5nX3VpbnQ4IGlCKQoreworICByZXR1cm4gKG1uZ191aW50MTYpKChtbmdfdWludDE2KWlCIDw8IDgpOworfQorI2VuZGlmCisjZW5kaWYgLyogTU5HX05PX0RFTFRBX1BORyAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogRGVsdGEtaW1hZ2Ugcm93IHJvdXRpbmVzIC0gcHJvbW90ZSBjb2xvcl90eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmICFkZWZpbmVkKE1OR19OT19ERUxUQV9QTkcpIHx8ICFkZWZpbmVkKE1OR19TS0lQQ0hVTktfUEFTVCkgfHwgIWRlZmluZWQoTU5HX1NLSVBDSFVOS19NQUdOKQorbW5nX3JldGNvZGUgbW5nX3Byb21vdGVfZzhfZzggKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX3VpbnQ4cCBwU3JjbGluZSA9IChtbmdfdWludDhwKXBEYXRhLT5wUHJvbVNyYzsKKyAgbW5nX3VpbnQ4cCBwRHN0bGluZSA9IChtbmdfdWludDhwKXBEYXRhLT5wUHJvbURzdDsKKyAgbW5nX3VpbnQzMiBpWDsKKyAgbW5nX3VpbnQ4ICBpQjsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9NT1RFX0c4X0c4LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgIGZvciAoaVggPSBwRGF0YS0+aVByb21XaWR0aDsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlQcm9tV2lkdGg7IGlYKyspCisjZW5kaWYKKyAgeworICAgIGlCID0gKnBTcmNsaW5lOworICAgIGlmIChwRGF0YS0+ZlByb21CaXRkZXB0aCkgICAgICAvKiBiaXRkZXB0aCBwcm9tb3RlZCA/ICovCisgICAgICBpQiA9ICgobW5nX2JpdGRlcHRoXzgpcERhdGEtPmZQcm9tQml0ZGVwdGgpIChpQik7CisgICAgKnBEc3RsaW5lID0gaUI7CisKKyAgICBwU3JjbGluZSsrOworICAgIHBEc3RsaW5lKys7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9NT1RFX0c4X0c4LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorbW5nX3JldGNvZGUgbW5nX3Byb21vdGVfZzhfZzE2IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ191aW50OHAgcFNyY2xpbmUgPSAobW5nX3VpbnQ4cClwRGF0YS0+cFByb21TcmM7CisgIG1uZ191aW50OHAgcERzdGxpbmUgPSAobW5nX3VpbnQ4cClwRGF0YS0+cFByb21Ec3Q7CisgIG1uZ191aW50MzIgaVg7CisgIG1uZ191aW50MTYgaVc7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPTU9URV9HOF9HMTYsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgZm9yIChpWCA9IHBEYXRhLT5pUHJvbVdpZHRoOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVByb21XaWR0aDsgaVgrKykKKyNlbmRpZgorICB7CisgICAgaVcgPSAoKG1uZ19iaXRkZXB0aF8xNilwRGF0YS0+ZlByb21CaXRkZXB0aCkgKCpwU3JjbGluZSk7CisKKyAgICAqcERzdGxpbmUgICAgID0gKG1uZ191aW50OCkoaVcgPj4gOCk7CisgICAgKihwRHN0bGluZSsxKSA9IChtbmdfdWludDgpKGlXICYmIDB4RkYpOworCisgICAgcFNyY2xpbmUrKzsKKyAgICBwRHN0bGluZSArPSAyOworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPTU9URV9HOF9HMTYsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfcHJvbW90ZV9nMTZfZzE2IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ191aW50MTZwIHBTcmNsaW5lID0gKG1uZ191aW50MTZwKXBEYXRhLT5wUHJvbVNyYzsKKyAgbW5nX3VpbnQxNnAgcERzdGxpbmUgPSAobW5nX3VpbnQxNnApcERhdGEtPnBQcm9tRHN0OworICBtbmdfdWludDMyICBpWDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9NT1RFX0cxNl9HMTYsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgZm9yIChpWCA9IHBEYXRhLT5pUHJvbVdpZHRoOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVByb21XaWR0aDsgaVgrKykKKyNlbmRpZgorICB7CisgICAgKnBEc3RsaW5lID0gKnBTcmNsaW5lOworICAgIHBTcmNsaW5lKys7CisgICAgcERzdGxpbmUrKzsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST01PVEVfRzE2X0cxNiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX3Byb21vdGVfZzhfZ2E4IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ19pbWFnZWRhdGFwIHBCdWYgICAgID0gKG1uZ19pbWFnZWRhdGFwKXBEYXRhLT5wUHJvbUJ1ZjsKKyAgbW5nX3VpbnQ4cCAgICAgcFNyY2xpbmUgPSAobW5nX3VpbnQ4cClwRGF0YS0+cFByb21TcmM7CisgIG1uZ191aW50OHAgICAgIHBEc3RsaW5lID0gKG1uZ191aW50OHApcERhdGEtPnBQcm9tRHN0OworICBtbmdfdWludDMyICAgICBpWDsKKyAgbW5nX3VpbnQ4ICAgICAgaUI7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPTU9URV9HOF9HQTgsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgZm9yIChpWCA9IHBEYXRhLT5pUHJvbVdpZHRoOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVByb21XaWR0aDsgaVgrKykKKyNlbmRpZgorICB7CisgICAgaUIgPSAqcFNyY2xpbmU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vIGNoZWFwIHRyYW5zcGFyZW5jeSA/ICovCisgICAgaWYgKCghcEJ1Zi0+Ykhhc1RSTlMpIHx8ICgobW5nX3VpbnQxNilpQiAhPSBwQnVmLT5pVFJOU2dyYXkpKQorICAgICAgKihwRHN0bGluZSsxKSA9IDB4RkY7CisKKyAgICBpZiAocERhdGEtPmZQcm9tQml0ZGVwdGgpICAgICAgLyogYml0ZGVwdGggcHJvbW90ZWQgPyAqLworICAgICAgaUIgPSAoKG1uZ19iaXRkZXB0aF84KXBEYXRhLT5mUHJvbUJpdGRlcHRoKSAoaUIpOworCisgICAgKnBEc3RsaW5lID0gaUI7CisKKyAgICBwU3JjbGluZSsrOworICAgIHBEc3RsaW5lICs9IDI7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9NT1RFX0c4X0dBOCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKK21uZ19yZXRjb2RlIG1uZ19wcm9tb3RlX2c4X2dhMTYgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX2ltYWdlZGF0YXAgcEJ1ZiAgICAgPSAobW5nX2ltYWdlZGF0YXApcERhdGEtPnBQcm9tQnVmOworICBtbmdfdWludDhwICAgICBwU3JjbGluZSA9IChtbmdfdWludDhwKXBEYXRhLT5wUHJvbVNyYzsKKyAgbW5nX3VpbnQ4cCAgICAgcERzdGxpbmUgPSAobW5nX3VpbnQ4cClwRGF0YS0+cFByb21Ec3Q7CisgIG1uZ191aW50MzIgICAgIGlYOworICBtbmdfdWludDggICAgICBpQjsKKyAgbW5nX3VpbnQxNiAgICAgaVc7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPTU9URV9HOF9HQTE2LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgIGZvciAoaVggPSBwRGF0YS0+aVByb21XaWR0aDsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlQcm9tV2lkdGg7IGlYKyspCisjZW5kaWYKKyAgeworICAgIGlCID0gKnBTcmNsaW5lOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBubyBjaGVhcCB0cmFuc3BhcmVuY3kgPyAqLworICAgIGlmICgoIXBCdWYtPmJIYXNUUk5TKSB8fCAoKG1uZ191aW50MTYpaUIgIT0gcEJ1Zi0+aVRSTlNncmF5KSkKKyAgICB7CisgICAgICAqKHBEc3RsaW5lKzIpID0gMHhGRjsKKyAgICAgICoocERzdGxpbmUrMykgPSAweEZGOworICAgIH0KKworICAgIGlXID0gKChtbmdfYml0ZGVwdGhfMTYpcERhdGEtPmZQcm9tQml0ZGVwdGgpIChpQik7CisKKyAgICAqcERzdGxpbmUgICAgID0gKG1uZ191aW50OCkoaVcgPj4gOCk7CisgICAgKihwRHN0bGluZSsxKSA9IChtbmdfdWludDgpKGlXICYmIDB4RkYpOworCisgICAgcFNyY2xpbmUrKzsKKyAgICBwRHN0bGluZSArPSA0OworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPTU9URV9HOF9HQTE2LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCittbmdfcmV0Y29kZSBtbmdfcHJvbW90ZV9nMTZfZ2ExNiAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfaW1hZ2VkYXRhcCBwQnVmICAgICA9IChtbmdfaW1hZ2VkYXRhcClwRGF0YS0+cFByb21CdWY7CisgIG1uZ191aW50MTZwICAgIHBTcmNsaW5lID0gKG1uZ191aW50MTZwKXBEYXRhLT5wUHJvbVNyYzsKKyAgbW5nX3VpbnQxNnAgICAgcERzdGxpbmUgPSAobW5nX3VpbnQxNnApcERhdGEtPnBQcm9tRHN0OworICBtbmdfdWludDMyICAgICBpWDsKKyAgbW5nX3VpbnQxNiAgICAgaVc7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPTU9URV9HMTZfR0ExNiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICBmb3IgKGlYID0gcERhdGEtPmlQcm9tV2lkdGg7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUHJvbVdpZHRoOyBpWCsrKQorI2VuZGlmCisgIHsKKyAgICBpVyA9ICpwU3JjbGluZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm8gY2hlYXAgdHJhbnNwYXJlbmN5ID8gKi8KKyAgICBpZiAoKCFwQnVmLT5iSGFzVFJOUykgfHwgKChtbmdfdWludDE2KWlXICE9IHBCdWYtPmlUUk5TZ3JheSkpCisgICAgICAqKHBEc3RsaW5lKzEpID0gMHhGRkZGOworCisgICAgKnBEc3RsaW5lID0gaVc7CisKKyAgICBwU3JjbGluZSsrOworICAgIHBEc3RsaW5lICs9IDI7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9NT1RFX0cxNl9HQTE2LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfcHJvbW90ZV9nOF9yZ2I4IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ191aW50OHAgcFNyY2xpbmUgPSAobW5nX3VpbnQ4cClwRGF0YS0+cFByb21TcmM7CisgIG1uZ191aW50OHAgcERzdGxpbmUgPSAobW5nX3VpbnQ4cClwRGF0YS0+cFByb21Ec3Q7CisgIG1uZ191aW50MzIgaVg7CisgIG1uZ191aW50OCAgaUI7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPTU9URV9HOF9SR0I4LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgIGZvciAoaVggPSBwRGF0YS0+aVByb21XaWR0aDsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlQcm9tV2lkdGg7IGlYKyspCisjZW5kaWYKKyAgeworICAgIGlCID0gKnBTcmNsaW5lOworCisgICAgaWYgKHBEYXRhLT5mUHJvbUJpdGRlcHRoKSAgICAgIC8qIGJpdGRlcHRoIHByb21vdGVkID8gKi8KKyAgICAgIGlCID0gKChtbmdfYml0ZGVwdGhfOClwRGF0YS0+ZlByb21CaXRkZXB0aCkgKGlCKTsKKworICAgICpwRHN0bGluZSAgICAgPSBpQjsKKyAgICAqKHBEc3RsaW5lKzEpID0gaUI7CisgICAgKihwRHN0bGluZSsyKSA9IGlCOworCisgICAgcFNyY2xpbmUrKzsKKyAgICBwRHN0bGluZSArPSAzOworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPTU9URV9HOF9SR0I4LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorbW5nX3JldGNvZGUgbW5nX3Byb21vdGVfZzhfcmdiMTYgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX3VpbnQ4cCBwU3JjbGluZSA9IChtbmdfdWludDhwKXBEYXRhLT5wUHJvbVNyYzsKKyAgbW5nX3VpbnQ4cCBwRHN0bGluZSA9IChtbmdfdWludDhwKXBEYXRhLT5wUHJvbURzdDsKKyAgbW5nX3VpbnQzMiBpWDsKKyAgbW5nX3VpbnQ4ICBpQjsKKyAgbW5nX3VpbnQxNiBpVzsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9NT1RFX0c4X1JHQjE2LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgIGZvciAoaVggPSBwRGF0YS0+aVByb21XaWR0aDsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlQcm9tV2lkdGg7IGlYKyspCisjZW5kaWYKKyAgeworICAgIGlCID0gKnBTcmNsaW5lOworICAgIGlXID0gKChtbmdfYml0ZGVwdGhfMTYpcERhdGEtPmZQcm9tQml0ZGVwdGgpIChpQik7CisKKyAgICBpQiAgICAgICAgICAgID0gKG1uZ191aW50OCkoaVcgPj4gOCk7CisgICAgKnBEc3RsaW5lICAgICA9IGlCOworICAgICoocERzdGxpbmUrMikgPSBpQjsKKyAgICAqKHBEc3RsaW5lKzQpID0gaUI7CisgICAgaUIgICAgICAgICAgICA9IChtbmdfdWludDgpKGlXICYmIDB4RkYpOworICAgICoocERzdGxpbmUrMSkgPSBpQjsKKyAgICAqKHBEc3RsaW5lKzMpID0gaUI7CisgICAgKihwRHN0bGluZSs1KSA9IGlCOworCisgICAgcFNyY2xpbmUrKzsKKyAgICBwRHN0bGluZSArPSA2OworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPTU9URV9HOF9SR0IxNiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorbW5nX3JldGNvZGUgbW5nX3Byb21vdGVfZzE2X3JnYjE2IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ191aW50MTZwIHBTcmNsaW5lID0gKG1uZ191aW50MTZwKXBEYXRhLT5wUHJvbVNyYzsKKyAgbW5nX3VpbnQxNnAgcERzdGxpbmUgPSAobW5nX3VpbnQxNnApcERhdGEtPnBQcm9tRHN0OworICBtbmdfdWludDMyICBpWDsKKyAgbW5nX3VpbnQxNiAgaVc7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPTU9URV9HMTZfUkdCMTYsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgZm9yIChpWCA9IHBEYXRhLT5pUHJvbVdpZHRoOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVByb21XaWR0aDsgaVgrKykKKyNlbmRpZgorICB7CisgICAgaVcgPSAqcFNyY2xpbmU7CisKKyAgICAqcERzdGxpbmUgICAgID0gaVc7CisgICAgKihwRHN0bGluZSsxKSA9IGlXOworICAgICoocERzdGxpbmUrMikgPSBpVzsKKworICAgIHBTcmNsaW5lKys7CisgICAgcERzdGxpbmUgKz0gMzsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST01PVEVfRzE2X1JHQjE2LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfcHJvbW90ZV9nOF9yZ2JhOCAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfaW1hZ2VkYXRhcCBwQnVmICAgICA9IChtbmdfaW1hZ2VkYXRhcClwRGF0YS0+cFByb21CdWY7CisgIG1uZ191aW50OHAgICAgIHBTcmNsaW5lID0gKG1uZ191aW50OHApcERhdGEtPnBQcm9tU3JjOworICBtbmdfdWludDhwICAgICBwRHN0bGluZSA9IChtbmdfdWludDhwKXBEYXRhLT5wUHJvbURzdDsKKyAgbW5nX3VpbnQzMiAgICAgaVg7CisgIG1uZ191aW50OCAgICAgIGlCOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST01PVEVfRzhfUkdCQTgsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgZm9yIChpWCA9IHBEYXRhLT5pUHJvbVdpZHRoOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVByb21XaWR0aDsgaVgrKykKKyNlbmRpZgorICB7CisgICAgaUIgPSAqcFNyY2xpbmU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vIGNoZWFwIHRyYW5zcGFyZW5jeSA/ICovCisgICAgaWYgKCghcEJ1Zi0+Ykhhc1RSTlMpIHx8ICgobW5nX3VpbnQxNilpQiAhPSBwQnVmLT5pVFJOU2dyYXkpKQorICAgICAgKihwRHN0bGluZSszKSA9IDB4RkY7CisKKyAgICBpZiAocERhdGEtPmZQcm9tQml0ZGVwdGgpICAgICAgLyogYml0ZGVwdGggcHJvbW90ZWQgPyAqLworICAgICAgaUIgPSAoKG1uZ19iaXRkZXB0aF84KXBEYXRhLT5mUHJvbUJpdGRlcHRoKSAoaUIpOworCisgICAgKnBEc3RsaW5lICAgICA9IGlCOworICAgICoocERzdGxpbmUrMSkgPSBpQjsKKyAgICAqKHBEc3RsaW5lKzIpID0gaUI7CisKKyAgICBwU3JjbGluZSsrOworICAgIHBEc3RsaW5lICs9IDQ7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9NT1RFX0c4X1JHQkE4LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorbW5nX3JldGNvZGUgbW5nX3Byb21vdGVfZzhfcmdiYTE2IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ19pbWFnZWRhdGFwIHBCdWYgICAgID0gKG1uZ19pbWFnZWRhdGFwKXBEYXRhLT5wUHJvbUJ1ZjsKKyAgbW5nX3VpbnQ4cCAgICAgcFNyY2xpbmUgPSAobW5nX3VpbnQ4cClwRGF0YS0+cFByb21TcmM7CisgIG1uZ191aW50OHAgICAgIHBEc3RsaW5lID0gKG1uZ191aW50OHApcERhdGEtPnBQcm9tRHN0OworICBtbmdfdWludDMyICAgICBpWDsKKyAgbW5nX3VpbnQ4ICAgICAgaUI7CisgIG1uZ191aW50MTYgICAgIGlXOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST01PVEVfRzhfUkdCQTE2LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgIGZvciAoaVggPSBwRGF0YS0+aVByb21XaWR0aDsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlQcm9tV2lkdGg7IGlYKyspCisjZW5kaWYKKyAgeworICAgIGlCID0gKnBTcmNsaW5lOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBubyBjaGVhcCB0cmFuc3BhcmVuY3kgPyAqLworICAgIGlmICgoIXBCdWYtPmJIYXNUUk5TKSB8fCAoKG1uZ191aW50MTYpaUIgIT0gcEJ1Zi0+aVRSTlNncmF5KSkKKyAgICB7CisgICAgICAqKHBEc3RsaW5lKzYpID0gMHhGRjsKKyAgICAgICoocERzdGxpbmUrNykgPSAweEZGOworICAgIH0KKworICAgIGlXICAgICAgICAgICAgPSAoKG1uZ19iaXRkZXB0aF8xNilwRGF0YS0+ZlByb21CaXRkZXB0aCkgKGlCKTsKKworICAgIGlCICAgICAgICAgICAgPSAobW5nX3VpbnQ4KShpVyA+PiA4KTsKKyAgICAqcERzdGxpbmUgICAgID0gaUI7CisgICAgKihwRHN0bGluZSsyKSA9IGlCOworICAgICoocERzdGxpbmUrNCkgPSBpQjsKKyAgICBpQiAgICAgICAgICAgID0gKG1uZ191aW50OCkoaVcgJiYgMHhGRik7CisgICAgKihwRHN0bGluZSsxKSA9IGlCOworICAgICoocERzdGxpbmUrMykgPSBpQjsKKyAgICAqKHBEc3RsaW5lKzUpID0gaUI7OworCisgICAgcFNyY2xpbmUrKzsKKyAgICBwRHN0bGluZSArPSA4OworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPTU9URV9HOF9SR0JBMTYsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKK21uZ19yZXRjb2RlIG1uZ19wcm9tb3RlX2cxNl9yZ2JhMTYgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX2ltYWdlZGF0YXAgcEJ1ZiAgICAgPSAobW5nX2ltYWdlZGF0YXApcERhdGEtPnBQcm9tQnVmOworICBtbmdfdWludDE2cCAgICBwU3JjbGluZSA9IChtbmdfdWludDE2cClwRGF0YS0+cFByb21TcmM7CisgIG1uZ191aW50MTZwICAgIHBEc3RsaW5lID0gKG1uZ191aW50MTZwKXBEYXRhLT5wUHJvbURzdDsKKyAgbW5nX3VpbnQzMiAgICAgaVg7CisgIG1uZ191aW50MTYgICAgIGlXOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST01PVEVfRzE2X1JHQkExNiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICBmb3IgKGlYID0gcERhdGEtPmlQcm9tV2lkdGg7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUHJvbVdpZHRoOyBpWCsrKQorI2VuZGlmCisgIHsKKyAgICBpVyA9ICpwU3JjbGluZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm8gY2hlYXAgdHJhbnNwYXJlbmN5ID8gKi8KKyAgICBpZiAoKCFwQnVmLT5iSGFzVFJOUykgfHwgKGlXICE9IHBCdWYtPmlUUk5TZ3JheSkpCisgICAgICAqKHBEc3RsaW5lKzMpID0gMHhGRkZGOworCisgICAgKnBEc3RsaW5lICAgICA9IGlXOworICAgICoocERzdGxpbmUrMSkgPSBpVzsKKyAgICAqKHBEc3RsaW5lKzIpID0gaVc7CisKKyAgICBwU3JjbGluZSsrOworICAgIHBEc3RsaW5lICs9IDQ7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9NT1RFX0cxNl9SR0JBMTYsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKK21uZ19yZXRjb2RlIG1uZ19wcm9tb3RlX2dhOF9nYTE2IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ191aW50OHAgcFNyY2xpbmUgPSAobW5nX3VpbnQ4cClwRGF0YS0+cFByb21TcmM7CisgIG1uZ191aW50OHAgcERzdGxpbmUgPSAobW5nX3VpbnQ4cClwRGF0YS0+cFByb21Ec3Q7CisgIG1uZ191aW50MzIgaVg7CisgIG1uZ191aW50MTYgaVc7CisgIG1uZ191aW50MTYgaUE7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPTU9URV9HQThfR0ExNiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICBmb3IgKGlYID0gcERhdGEtPmlQcm9tV2lkdGg7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUHJvbVdpZHRoOyBpWCsrKQorI2VuZGlmCisgIHsKKyAgICBpVyA9ICgobW5nX2JpdGRlcHRoXzE2KXBEYXRhLT5mUHJvbUJpdGRlcHRoKSAoKnBTcmNsaW5lKTsKKyAgICBpQSA9ICgobW5nX2JpdGRlcHRoXzE2KXBEYXRhLT5mUHJvbUJpdGRlcHRoKSAoKihwU3JjbGluZSsxKSk7CisKKyAgICAqcERzdGxpbmUgICAgID0gKG1uZ191aW50OCkoaVcgPj4gOCk7CisgICAgKihwRHN0bGluZSsxKSA9IChtbmdfdWludDgpKGlXICYmIDB4RkYpOworICAgICoocERzdGxpbmUrMikgPSAobW5nX3VpbnQ4KShpQSA+PiA4KTsKKyAgICAqKHBEc3RsaW5lKzMpID0gKG1uZ191aW50OCkoaUEgJiYgMHhGRik7CisKKyAgICBwU3JjbGluZSArPSAyOworICAgIHBEc3RsaW5lICs9IDQ7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9NT1RFX0dBOF9HQTE2LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfcHJvbW90ZV9nYThfcmdiYTggKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX3VpbnQ4cCAgICAgcFNyY2xpbmUgPSAobW5nX3VpbnQ4cClwRGF0YS0+cFByb21TcmM7CisgIG1uZ191aW50OHAgICAgIHBEc3RsaW5lID0gKG1uZ191aW50OHApcERhdGEtPnBQcm9tRHN0OworICBtbmdfdWludDMyICAgICBpWDsKKyAgbW5nX3VpbnQ4ICAgICAgaUI7CisgIG1uZ191aW50OCAgICAgIGlBOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST01PVEVfR0E4X1JHQkE4LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgIGZvciAoaVggPSBwRGF0YS0+aVByb21XaWR0aDsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlQcm9tV2lkdGg7IGlYKyspCisjZW5kaWYKKyAgeworICAgIGlCID0gKnBTcmNsaW5lOworICAgIGlBID0gKihwU3JjbGluZSsxKTsKKworICAgICpwRHN0bGluZSAgICAgPSBpQjsKKyAgICAqKHBEc3RsaW5lKzEpID0gaUI7CisgICAgKihwRHN0bGluZSsyKSA9IGlCOworICAgICoocERzdGxpbmUrMykgPSBpQTsKKworICAgIHBTcmNsaW5lICs9IDI7CisgICAgcERzdGxpbmUgKz0gNDsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST01PVEVfR0E4X1JHQkE4LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorbW5nX3JldGNvZGUgbW5nX3Byb21vdGVfZ2E4X3JnYmExNiAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfdWludDhwIHBTcmNsaW5lID0gKG1uZ191aW50OHApcERhdGEtPnBQcm9tU3JjOworICBtbmdfdWludDhwIHBEc3RsaW5lID0gKG1uZ191aW50OHApcERhdGEtPnBQcm9tRHN0OworICBtbmdfdWludDMyIGlYOworICBtbmdfdWludDggIGlCOworICBtbmdfdWludDE2IGlXOworICBtbmdfdWludDE2IGlBOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST01PVEVfR0E4X1JHQkExNiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICBmb3IgKGlYID0gcERhdGEtPmlQcm9tV2lkdGg7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUHJvbVdpZHRoOyBpWCsrKQorI2VuZGlmCisgIHsKKyAgICBpVyA9ICgobW5nX2JpdGRlcHRoXzE2KXBEYXRhLT5mUHJvbUJpdGRlcHRoKSAoKnBTcmNsaW5lKTsKKyAgICBpQSA9ICgobW5nX2JpdGRlcHRoXzE2KXBEYXRhLT5mUHJvbUJpdGRlcHRoKSAoKihwU3JjbGluZSsxKSk7CisKKyAgICBpQiAgICAgICAgICAgID0gKG1uZ191aW50OCkoaVcgPj4gOCk7CisgICAgKnBEc3RsaW5lICAgICA9IGlCOworICAgICoocERzdGxpbmUrMikgPSBpQjsKKyAgICAqKHBEc3RsaW5lKzQpID0gaUI7CisgICAgaUIgICAgICAgICAgICA9IChtbmdfdWludDgpKGlXICYmIDB4RkYpOworICAgICoocERzdGxpbmUrMSkgPSBpQjsKKyAgICAqKHBEc3RsaW5lKzMpID0gaUI7CisgICAgKihwRHN0bGluZSs1KSA9IGlCOworICAgICoocERzdGxpbmUrNikgPSAobW5nX3VpbnQ4KShpQSA+PiA4KTsKKyAgICAqKHBEc3RsaW5lKzcpID0gKG1uZ191aW50OCkoaUEgJiYgMHhGRik7CisKKyAgICBwU3JjbGluZSArPSAyOworICAgIHBEc3RsaW5lICs9IDg7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9NT1RFX0dBOF9SR0JBMTYsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKK21uZ19yZXRjb2RlIG1uZ19wcm9tb3RlX2dhMTZfcmdiYTE2IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ191aW50MTZwIHBTcmNsaW5lID0gKG1uZ191aW50MTZwKXBEYXRhLT5wUHJvbVNyYzsKKyAgbW5nX3VpbnQxNnAgcERzdGxpbmUgPSAobW5nX3VpbnQxNnApcERhdGEtPnBQcm9tRHN0OworICBtbmdfdWludDMyIGlYOworICBtbmdfdWludDE2IGlXOworICBtbmdfdWludDE2IGlBOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST01PVEVfR0ExNl9SR0JBMTYsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgZm9yIChpWCA9IHBEYXRhLT5pUHJvbVdpZHRoOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVByb21XaWR0aDsgaVgrKykKKyNlbmRpZgorICB7CisgICAgaVcgPSAqcFNyY2xpbmU7CisgICAgaUEgPSAqKHBTcmNsaW5lKzEpOworCisgICAgKnBEc3RsaW5lICAgICA9IGlXOworICAgICoocERzdGxpbmUrMSkgPSBpVzsKKyAgICAqKHBEc3RsaW5lKzIpID0gaVc7CisgICAgKihwRHN0bGluZSszKSA9IGlBOworCisgICAgcFNyY2xpbmUgKz0gMjsKKyAgICBwRHN0bGluZSArPSA0OworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPTU9URV9HQTE2X1JHQkExNiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorbW5nX3JldGNvZGUgbW5nX3Byb21vdGVfcmdiOF9yZ2IxNiAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfdWludDhwIHBTcmNsaW5lID0gKG1uZ191aW50OHApcERhdGEtPnBQcm9tU3JjOworICBtbmdfdWludDhwIHBEc3RsaW5lID0gKG1uZ191aW50OHApcERhdGEtPnBQcm9tRHN0OworICBtbmdfdWludDMyIGlYOworICBtbmdfdWludDE2IGlSOworICBtbmdfdWludDE2IGlHOworICBtbmdfdWludDE2IGlCOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST01PVEVfUkdCOF9SR0IxNiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICBmb3IgKGlYID0gcERhdGEtPmlQcm9tV2lkdGg7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUHJvbVdpZHRoOyBpWCsrKQorI2VuZGlmCisgIHsKKyAgICBpUiAgICAgICAgICAgID0gKChtbmdfYml0ZGVwdGhfMTYpcERhdGEtPmZQcm9tQml0ZGVwdGgpICgqcFNyY2xpbmUpOworICAgIGlHICAgICAgICAgICAgPSAoKG1uZ19iaXRkZXB0aF8xNilwRGF0YS0+ZlByb21CaXRkZXB0aCkgKCoocFNyY2xpbmUrMSkpOworICAgIGlCICAgICAgICAgICAgPSAoKG1uZ19iaXRkZXB0aF8xNilwRGF0YS0+ZlByb21CaXRkZXB0aCkgKCoocFNyY2xpbmUrMikpOworCisgICAgKnBEc3RsaW5lICAgICA9IChtbmdfdWludDgpKGlSID4+IDgpOworICAgICoocERzdGxpbmUrMSkgPSAobW5nX3VpbnQ4KShpUiAmJiAweEZGKTsKKyAgICAqKHBEc3RsaW5lKzIpID0gKG1uZ191aW50OCkoaUcgPj4gOCk7CisgICAgKihwRHN0bGluZSszKSA9IChtbmdfdWludDgpKGlHICYmIDB4RkYpOworICAgICoocERzdGxpbmUrNCkgPSAobW5nX3VpbnQ4KShpQiA+PiA4KTsKKyAgICAqKHBEc3RsaW5lKzUpID0gKG1uZ191aW50OCkoaUIgJiYgMHhGRik7CisKKyAgICBwU3JjbGluZSArPSAzOworICAgIHBEc3RsaW5lICs9IDY7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9NT1RFX1JHQjhfUkdCMTYsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19wcm9tb3RlX3JnYjhfcmdiYTggKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX2ltYWdlZGF0YXAgcEJ1ZiAgICAgPSAobW5nX2ltYWdlZGF0YXApcERhdGEtPnBQcm9tQnVmOworICBtbmdfdWludDhwICAgICBwU3JjbGluZSA9IChtbmdfdWludDhwKXBEYXRhLT5wUHJvbVNyYzsKKyAgbW5nX3VpbnQ4cCAgICAgcERzdGxpbmUgPSAobW5nX3VpbnQ4cClwRGF0YS0+cFByb21Ec3Q7CisgIG1uZ191aW50MzIgICAgIGlYOworICBtbmdfdWludDggICAgICBpUjsKKyAgbW5nX3VpbnQ4ICAgICAgaUc7CisgIG1uZ191aW50OCAgICAgIGlCOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST01PVEVfUkdCOF9SR0JBOCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICBmb3IgKGlYID0gcERhdGEtPmlQcm9tV2lkdGg7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUHJvbVdpZHRoOyBpWCsrKQorI2VuZGlmCisgIHsKKyAgICBpUiA9ICpwU3JjbGluZTsKKyAgICBpRyA9ICoocFNyY2xpbmUrMSk7CisgICAgaUIgPSAqKHBTcmNsaW5lKzIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBubyBjaGVhcCB0cmFuc3BhcmVuY3kgPyAqLworICAgIGlmICgoIXBCdWYtPmJIYXNUUk5TKSB8fCAoKG1uZ191aW50MTYpaVIgIT0gcEJ1Zi0+aVRSTlNyZWQpIHx8CisgICAgICAgICgobW5nX3VpbnQxNilpRyAhPSBwQnVmLT5pVFJOU2dyZWVuKSB8fCAoKG1uZ191aW50MTYpaUIgIT0gcEJ1Zi0+aVRSTlNibHVlKSkKKyAgICAgICoocERzdGxpbmUrMykgPSAweEZGOworCisgICAgKnBEc3RsaW5lICAgICA9IGlSOworICAgICoocERzdGxpbmUrMSkgPSBpRzsKKyAgICAqKHBEc3RsaW5lKzIpID0gaUI7CisKKyAgICBwU3JjbGluZSArPSAzOworICAgIHBEc3RsaW5lICs9IDQ7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9NT1RFX1JHQjhfUkdCQTgsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCittbmdfcmV0Y29kZSBtbmdfcHJvbW90ZV9yZ2I4X3JnYmExNiAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfaW1hZ2VkYXRhcCBwQnVmICAgICA9IChtbmdfaW1hZ2VkYXRhcClwRGF0YS0+cFByb21CdWY7CisgIG1uZ191aW50OHAgICAgIHBTcmNsaW5lID0gKG1uZ191aW50OHApcERhdGEtPnBQcm9tU3JjOworICBtbmdfdWludDhwICAgICBwRHN0bGluZSA9IChtbmdfdWludDhwKXBEYXRhLT5wUHJvbURzdDsKKyAgbW5nX3VpbnQzMiAgICAgaVg7CisgIG1uZ191aW50OCAgICAgIGlSOworICBtbmdfdWludDggICAgICBpRzsKKyAgbW5nX3VpbnQ4ICAgICAgaUI7CisgIG1uZ191aW50MTYgICAgIGlSdzsKKyAgbW5nX3VpbnQxNiAgICAgaUd3OworICBtbmdfdWludDE2ICAgICBpQnc7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPTU9URV9SR0I4X1JHQkExNiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICBmb3IgKGlYID0gcERhdGEtPmlQcm9tV2lkdGg7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUHJvbVdpZHRoOyBpWCsrKQorI2VuZGlmCisgIHsKKyAgICBpUiA9ICpwU3JjbGluZTsKKyAgICBpRyA9ICoocFNyY2xpbmUrMSk7CisgICAgaUIgPSAqKHBTcmNsaW5lKzIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBubyBjaGVhcCB0cmFuc3BhcmVuY3kgPyAqLworICAgIGlmICgoIXBCdWYtPmJIYXNUUk5TKSB8fCAoKG1uZ191aW50MTYpaVIgIT0gcEJ1Zi0+aVRSTlNyZWQpIHx8CisgICAgICAgICgobW5nX3VpbnQxNilpRyAhPSBwQnVmLT5pVFJOU2dyZWVuKSB8fCAoKG1uZ191aW50MTYpaUIgIT0gcEJ1Zi0+aVRSTlNibHVlKSkKKyAgICB7CisgICAgICAqKHBEc3RsaW5lKzYpID0gMHhGRjsKKyAgICAgICoocERzdGxpbmUrNykgPSAweEZGOworICAgIH0KKworICAgIGlSdyAgICAgICAgICAgPSAoKG1uZ19iaXRkZXB0aF8xNilwRGF0YS0+ZlByb21CaXRkZXB0aCkgKGlSKTsKKyAgICBpR3cgICAgICAgICAgID0gKChtbmdfYml0ZGVwdGhfMTYpcERhdGEtPmZQcm9tQml0ZGVwdGgpIChpRyk7CisgICAgaUJ3ICAgICAgICAgICA9ICgobW5nX2JpdGRlcHRoXzE2KXBEYXRhLT5mUHJvbUJpdGRlcHRoKSAoaUIpOworCisgICAgKnBEc3RsaW5lICAgICA9IChtbmdfdWludDgpKGlSdyA+PiA4KTsKKyAgICAqKHBEc3RsaW5lKzEpID0gKG1uZ191aW50OCkoaVJ3ICYmIDB4RkYpOworICAgICoocERzdGxpbmUrMikgPSAobW5nX3VpbnQ4KShpR3cgPj4gOCk7CisgICAgKihwRHN0bGluZSszKSA9IChtbmdfdWludDgpKGlHdyAmJiAweEZGKTsKKyAgICAqKHBEc3RsaW5lKzQpID0gKG1uZ191aW50OCkoaUJ3ID4+IDgpOworICAgICoocERzdGxpbmUrNSkgPSAobW5nX3VpbnQ4KShpQncgJiYgMHhGRik7CisKKyAgICBwU3JjbGluZSArPSAzOworICAgIHBEc3RsaW5lICs9IDg7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9NT1RFX1JHQjhfUkdCQTE2LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCittbmdfcmV0Y29kZSBtbmdfcHJvbW90ZV9yZ2IxNl9yZ2JhMTYgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX2ltYWdlZGF0YXAgcEJ1ZiAgICAgPSAobW5nX2ltYWdlZGF0YXApcERhdGEtPnBQcm9tQnVmOworICBtbmdfdWludDE2cCAgICBwU3JjbGluZSA9IChtbmdfdWludDE2cClwRGF0YS0+cFByb21TcmM7CisgIG1uZ191aW50MTZwICAgIHBEc3RsaW5lID0gKG1uZ191aW50MTZwKXBEYXRhLT5wUHJvbURzdDsKKyAgbW5nX3VpbnQzMiAgICAgaVg7CisgIG1uZ191aW50MTYgICAgIGlSOworICBtbmdfdWludDE2ICAgICBpRzsKKyAgbW5nX3VpbnQxNiAgICAgaUI7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPTU9URV9SR0IxNl9SR0JBMTYsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgZm9yIChpWCA9IHBEYXRhLT5pUHJvbVdpZHRoOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVByb21XaWR0aDsgaVgrKykKKyNlbmRpZgorICB7CisgICAgaVIgPSAqcFNyY2xpbmU7CisgICAgaUcgPSAqKHBTcmNsaW5lKzEpOworICAgIGlCID0gKihwU3JjbGluZSsyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm8gY2hlYXAgdHJhbnNwYXJlbmN5ID8gKi8KKyAgICBpZiAoKCFwQnVmLT5iSGFzVFJOUykgfHwgKGlSICE9IHBCdWYtPmlUUk5TcmVkKSB8fAorICAgICAgICAoaUcgIT0gcEJ1Zi0+aVRSTlNncmVlbikgfHwgKGlCICE9IHBCdWYtPmlUUk5TYmx1ZSkpCisgICAgICAqKHBEc3RsaW5lKzMpID0gMHhGRkZGOworCisgICAgKnBEc3RsaW5lICAgICA9IGlSOworICAgICoocERzdGxpbmUrMSkgPSBpRzsKKyAgICAqKHBEc3RsaW5lKzIpID0gaUI7CisKKyAgICBwU3JjbGluZSArPSAzOworICAgIHBEc3RsaW5lICs9IDQ7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9NT1RFX1JHQjE2X1JHQkExNiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX3Byb21vdGVfaWR4OF9yZ2I4IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ19pbWFnZWRhdGFwIHBCdWYgICAgID0gKG1uZ19pbWFnZWRhdGFwKXBEYXRhLT5wUHJvbUJ1ZjsKKyAgbW5nX3VpbnQ4cCAgICAgcFNyY2xpbmUgPSAobW5nX3VpbnQ4cClwRGF0YS0+cFByb21TcmM7CisgIG1uZ191aW50OHAgICAgIHBEc3RsaW5lID0gKG1uZ191aW50OHApcERhdGEtPnBQcm9tRHN0OworICBtbmdfdWludDMyICAgICBpWDsKKyAgbW5nX3VpbnQ4ICAgICAgaUI7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPTU9URV9JRFg4X1JHQjgsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgZm9yIChpWCA9IHBEYXRhLT5pUHJvbVdpZHRoOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVByb21XaWR0aDsgaVgrKykKKyNlbmRpZgorICB7CisgICAgaUIgPSAqcFNyY2xpbmU7CisKKyAgICBpZiAoKG1uZ191aW50MzIpaUIgPCBwQnVmLT5pUExURWNvdW50KQorICAgIHsKKyAgICAgICpwRHN0bGluZSAgICAgPSBwQnVmLT5hUExURWVudHJpZXMgW2lCXS5pUmVkOworICAgICAgKihwRHN0bGluZSsxKSA9IHBCdWYtPmFQTFRFZW50cmllcyBbaUJdLmlHcmVlbjsKKyAgICAgICoocERzdGxpbmUrMikgPSBwQnVmLT5hUExURWVudHJpZXMgW2lCXS5pQmx1ZTsKKyAgICB9CisKKyAgICBwU3JjbGluZSsrOworICAgIHBEc3RsaW5lICs9IDM7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9NT1RFX0lEWDhfUkdCOCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKK21uZ19yZXRjb2RlIG1uZ19wcm9tb3RlX2lkeDhfcmdiMTYgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX2ltYWdlZGF0YXAgcEJ1ZiAgICAgPSAobW5nX2ltYWdlZGF0YXApcERhdGEtPnBQcm9tQnVmOworICBtbmdfdWludDhwICAgICBwU3JjbGluZSA9IChtbmdfdWludDhwKXBEYXRhLT5wUHJvbVNyYzsKKyAgbW5nX3VpbnQ4cCAgICAgcERzdGxpbmUgPSAobW5nX3VpbnQ4cClwRGF0YS0+cFByb21Ec3Q7CisgIG1uZ191aW50MzIgICAgIGlYOworICBtbmdfdWludDggICAgICBpTjsKKyAgbW5nX3VpbnQxNiAgICAgaVI7CisgIG1uZ191aW50MTYgICAgIGlHOworICBtbmdfdWludDE2ICAgICBpQjsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9NT1RFX0lEWDhfUkdCMTYsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgZm9yIChpWCA9IHBEYXRhLT5pUHJvbVdpZHRoOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVByb21XaWR0aDsgaVgrKykKKyNlbmRpZgorICB7CisgICAgaU4gPSAqcFNyY2xpbmU7CisKKyAgICBpZiAoKG1uZ191aW50MzIpaU4gPCBwQnVmLT5pUExURWNvdW50KQorICAgIHsKKyAgICAgIGlSICAgICAgICAgICAgICA9ICgobW5nX2JpdGRlcHRoXzE2KXBEYXRhLT5mUHJvbUJpdGRlcHRoKSAocEJ1Zi0+YVBMVEVlbnRyaWVzIFtpTl0uaVJlZCk7CisgICAgICBpRyAgICAgICAgICAgICAgPSAoKG1uZ19iaXRkZXB0aF8xNilwRGF0YS0+ZlByb21CaXRkZXB0aCkgKHBCdWYtPmFQTFRFZW50cmllcyBbaU5dLmlHcmVlbik7CisgICAgICBpQiAgICAgICAgICAgICAgPSAoKG1uZ19iaXRkZXB0aF8xNilwRGF0YS0+ZlByb21CaXRkZXB0aCkgKHBCdWYtPmFQTFRFZW50cmllcyBbaU5dLmlCbHVlKTsKKyAgICAgICpwRHN0bGluZSAgICAgICA9IChtbmdfdWludDgpKGlSID4+IDgpOworICAgICAgKihwRHN0bGluZSsxKSAgID0gKG1uZ191aW50OCkoaVIgJiYgMHhGRik7CisgICAgICAqKHBEc3RsaW5lKzIpICAgPSAobW5nX3VpbnQ4KShpRyA+PiA4KTsKKyAgICAgICoocERzdGxpbmUrMykgICA9IChtbmdfdWludDgpKGlHICYmIDB4RkYpOworICAgICAgKihwRHN0bGluZSs0KSAgID0gKG1uZ191aW50OCkoaUIgPj4gOCk7CisgICAgICAqKHBEc3RsaW5lKzUpICAgPSAobW5nX3VpbnQ4KShpQiAmJiAweEZGKTsKKyAgICB9CisKKyAgICBwU3JjbGluZSsrOworICAgIHBEc3RsaW5lICs9IDY7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9NT1RFX0lEWDhfUkdCMTYsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19wcm9tb3RlX2lkeDhfcmdiYTggKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX2ltYWdlZGF0YXAgcEJ1ZiAgICAgPSAobW5nX2ltYWdlZGF0YXApcERhdGEtPnBQcm9tQnVmOworICBtbmdfdWludDhwICAgICBwU3JjbGluZSA9IChtbmdfdWludDhwKXBEYXRhLT5wUHJvbVNyYzsKKyAgbW5nX3VpbnQ4cCAgICAgcERzdGxpbmUgPSAobW5nX3VpbnQ4cClwRGF0YS0+cFByb21Ec3Q7CisgIG1uZ191aW50MzIgICAgIGlYOworICBtbmdfdWludDggICAgICBpQjsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9NT1RFX0lEWDhfUkdCQTgsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgZm9yIChpWCA9IHBEYXRhLT5pUHJvbVdpZHRoOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVByb21XaWR0aDsgaVgrKykKKyNlbmRpZgorICB7CisgICAgaUIgPSAqcFNyY2xpbmU7CisKKyAgICBpZiAoKG1uZ191aW50MzIpaUIgPCBwQnVmLT5pUExURWNvdW50KQorICAgIHsKKyAgICAgICpwRHN0bGluZSAgICAgICA9IHBCdWYtPmFQTFRFZW50cmllcyBbaUJdLmlSZWQ7CisgICAgICAqKHBEc3RsaW5lKzEpICAgPSBwQnVmLT5hUExURWVudHJpZXMgW2lCXS5pR3JlZW47CisgICAgICAqKHBEc3RsaW5lKzIpICAgPSBwQnVmLT5hUExURWVudHJpZXMgW2lCXS5pQmx1ZTsKKworICAgICAgaWYgKChwQnVmLT5iSGFzVFJOUykgJiYgKChtbmdfdWludDMyKWlCIDwgcEJ1Zi0+aVRSTlNjb3VudCkpCisgICAgICAgICoocERzdGxpbmUrMykgPSBwQnVmLT5hVFJOU2VudHJpZXMgW2lCXTsKKyAgICAgIGVsc2UKKyAgICAgICAgKihwRHN0bGluZSszKSA9IDB4RkY7CisgICAgfQorCisgICAgcFNyY2xpbmUrKzsKKyAgICBwRHN0bGluZSArPSA0OworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPTU9URV9JRFg4X1JHQkE4LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorbW5nX3JldGNvZGUgbW5nX3Byb21vdGVfaWR4OF9yZ2JhMTYgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX2ltYWdlZGF0YXAgcEJ1ZiAgICAgPSAobW5nX2ltYWdlZGF0YXApcERhdGEtPnBQcm9tQnVmOworICBtbmdfdWludDhwICAgICBwU3JjbGluZSA9IChtbmdfdWludDhwKXBEYXRhLT5wUHJvbVNyYzsKKyAgbW5nX3VpbnQ4cCAgICAgcERzdGxpbmUgPSAobW5nX3VpbnQ4cClwRGF0YS0+cFByb21Ec3Q7CisgIG1uZ191aW50MzIgICAgIGlYOworICBtbmdfdWludDggICAgICBpTjsKKyAgbW5nX3VpbnQxNiAgICAgaVI7CisgIG1uZ191aW50MTYgICAgIGlHOworICBtbmdfdWludDE2ICAgICBpQjsKKyAgbW5nX3VpbnQxNiAgICAgaUE7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPTU9URV9JRFg4X1JHQkExNiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICBmb3IgKGlYID0gcERhdGEtPmlQcm9tV2lkdGg7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUHJvbVdpZHRoOyBpWCsrKQorI2VuZGlmCisgIHsKKyAgICBpTiA9ICpwU3JjbGluZTsKKworICAgIGlmICgobW5nX3VpbnQzMilpTiA8IHBCdWYtPmlQTFRFY291bnQpCisgICAgeworICAgICAgaVIgICAgICAgICAgICA9ICgobW5nX2JpdGRlcHRoXzE2KXBEYXRhLT5mUHJvbUJpdGRlcHRoKSAocEJ1Zi0+YVBMVEVlbnRyaWVzIFtpTl0uaVJlZCk7CisgICAgICBpRyAgICAgICAgICAgID0gKChtbmdfYml0ZGVwdGhfMTYpcERhdGEtPmZQcm9tQml0ZGVwdGgpIChwQnVmLT5hUExURWVudHJpZXMgW2lOXS5pR3JlZW4pOworICAgICAgaUIgICAgICAgICAgICA9ICgobW5nX2JpdGRlcHRoXzE2KXBEYXRhLT5mUHJvbUJpdGRlcHRoKSAocEJ1Zi0+YVBMVEVlbnRyaWVzIFtpTl0uaUJsdWUpOworCisgICAgICBpZiAoKHBCdWYtPmJIYXNUUk5TKSAmJiAoKG1uZ191aW50MzIpaU4gPCBwQnVmLT5pVFJOU2NvdW50KSkKKyAgICAgICAgaUEgICAgICAgICAgPSAoKG1uZ19iaXRkZXB0aF8xNilwRGF0YS0+ZlByb21CaXRkZXB0aCkgKHBCdWYtPmFUUk5TZW50cmllcyBbaU5dKTsKKyAgICAgIGVsc2UKKyAgICAgICAgaUEgICAgICAgICAgPSAweEZGRkY7CisKKyAgICAgICpwRHN0bGluZSAgICAgPSAobW5nX3VpbnQ4KShpUiA+PiA4KTsKKyAgICAgICoocERzdGxpbmUrMSkgPSAobW5nX3VpbnQ4KShpUiAmJiAweEZGKTsKKyAgICAgICoocERzdGxpbmUrMikgPSAobW5nX3VpbnQ4KShpRyA+PiA4KTsKKyAgICAgICoocERzdGxpbmUrMykgPSAobW5nX3VpbnQ4KShpRyAmJiAweEZGKTsKKyAgICAgICoocERzdGxpbmUrNCkgPSAobW5nX3VpbnQ4KShpQiA+PiA4KTsKKyAgICAgICoocERzdGxpbmUrNSkgPSAobW5nX3VpbnQ4KShpQiAmJiAweEZGKTsKKyAgICAgICoocERzdGxpbmUrNikgPSAobW5nX3VpbnQ4KShpQSA+PiA4KTsKKyAgICAgICoocERzdGxpbmUrNykgPSAobW5nX3VpbnQ4KShpQSAmJiAweEZGKTsKKyAgICB9CisKKyAgICBwU3JjbGluZSsrOworICAgIHBEc3RsaW5lICs9IDg7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9NT1RFX0lEWDhfUkdCQTE2LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX3Byb21vdGVfcmdiYThfcmdiYTE2IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ191aW50OHAgcFNyY2xpbmUgPSAobW5nX3VpbnQ4cClwRGF0YS0+cFByb21TcmM7CisgIG1uZ191aW50OHAgcERzdGxpbmUgPSAobW5nX3VpbnQ4cClwRGF0YS0+cFByb21Ec3Q7CisgIG1uZ191aW50MzIgaVg7CisgIG1uZ191aW50MTYgaVI7CisgIG1uZ191aW50MTYgaUc7CisgIG1uZ191aW50MTYgaUI7CisgIG1uZ191aW50MTYgaUE7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPTU9URV9SR0JBOF9SR0JBMTYsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgZm9yIChpWCA9IHBEYXRhLT5pUHJvbVdpZHRoOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVByb21XaWR0aDsgaVgrKykKKyNlbmRpZgorICB7CisgICAgaVIgICAgICAgICAgICA9ICgobW5nX2JpdGRlcHRoXzE2KXBEYXRhLT5mUHJvbUJpdGRlcHRoKSAoKnBTcmNsaW5lKTsKKyAgICBpRyAgICAgICAgICAgID0gKChtbmdfYml0ZGVwdGhfMTYpcERhdGEtPmZQcm9tQml0ZGVwdGgpICgqKHBTcmNsaW5lKzEpKTsKKyAgICBpQiAgICAgICAgICAgID0gKChtbmdfYml0ZGVwdGhfMTYpcERhdGEtPmZQcm9tQml0ZGVwdGgpICgqKHBTcmNsaW5lKzIpKTsKKyAgICBpQSAgICAgICAgICAgID0gKChtbmdfYml0ZGVwdGhfMTYpcERhdGEtPmZQcm9tQml0ZGVwdGgpICgqKHBTcmNsaW5lKzMpKTsKKworICAgICpwRHN0bGluZSAgICAgPSAobW5nX3VpbnQ4KShpUiA+PiA4KTsKKyAgICAqKHBEc3RsaW5lKzEpID0gKG1uZ191aW50OCkoaVIgJiYgMHhGRik7CisgICAgKihwRHN0bGluZSsyKSA9IChtbmdfdWludDgpKGlHID4+IDgpOworICAgICoocERzdGxpbmUrMykgPSAobW5nX3VpbnQ4KShpRyAmJiAweEZGKTsKKyAgICAqKHBEc3RsaW5lKzQpID0gKG1uZ191aW50OCkoaUIgPj4gOCk7CisgICAgKihwRHN0bGluZSs1KSA9IChtbmdfdWludDgpKGlCICYmIDB4RkYpOworICAgICoocERzdGxpbmUrNikgPSAobW5nX3VpbnQ4KShpQSA+PiA4KTsKKyAgICAqKHBEc3RsaW5lKzcpID0gKG1uZ191aW50OCkoaUEgJiYgMHhGRik7CisKKyAgICBwU3JjbGluZSArPSA0OworICAgIHBEc3RsaW5lICs9IDg7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9NT1RFX1JHQkE4X1JHQkExNiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKyNlbmRpZiAvKiAhZGVmaW5lZChNTkdfTk9fREVMVEFfUE5HKSB8fCAhZGVmaW5lZChNTkdfU0tJUENIVU5LX1BBU1QpIHx8ICFkZWZpbmVkKE1OR19TS0lQQ0hVTktfTUFHTikgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIFJvdyBwcm9jZXNzaW5nIHJvdXRpbmVzIC0gY29udmVydCB1bmNvbXByZXNzZWQgZGF0YSBmcm9tIHpsaWIgdG8gICAgICAgKiAqLworLyogKiBtYW5hZ2FibGUgcm93LWRhdGEgd2hpY2ggc2VydmVzIGFzIGlucHV0IHRvIHRoZSBjb2xvci1tYW5hZ2VtZW50ICAgICAgICogKi8KKy8qICogcm91dGluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fMV8yXzRCSVRfU1VQUE9SVAorbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfZzEgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX3VpbnQ4cCAgICAgcFdvcmtyb3c7CisgIG1uZ191aW50OHAgICAgIHBSR0JBcm93OworICBtbmdfaW50MzIgICAgICBpWDsKKyAgbW5nX3VpbnQ4ICAgICAgaUI7CisgIG1uZ191aW50OCAgICAgIGlNOworICBtbmdfaW1hZ2VkYXRhcCBwQnVmID0gKG1uZ19pbWFnZWRhdGFwKXBEYXRhLT5wU3RvcmVidWY7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19HMSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmICghcEJ1ZikgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBubyBvYmplY3Q/IHRoZW4gdXNlIG9iaiAwICovCisgICAgcEJ1ZiA9ICgobW5nX2ltYWdlcClwRGF0YS0+cE9ianplcm8pLT5wSW1nYnVmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGVtcG9yYXJ5IHdvcmsgcG9pbnRlcnMgKi8KKyAgcFdvcmtyb3cgPSBwRGF0YS0+cFdvcmtyb3cgKyBwRGF0YS0+aVBpeGVsb2ZzOworICBwUkdCQXJvdyA9IHBEYXRhLT5wUkdCQXJvdzsKKyAgaU0gICAgICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0IGF0IHBpeGVsIDAgKi8KKyAgaUIgICAgICAgPSAwOworCisgIGlmIChwQnVmLT5iSGFzVFJOUykgICAgICAgICAgICAgICAgICAvKiB0Uk5TIGVuY291bnRlcmVkID8gKi8KKyAgeworICAgIGlmIChwQnVmLT5pVFJOU2dyYXkpICAgICAgICAgICAgICAgLyogd2hpdGUgdHJhbnNwYXJlbnQgPyAqLworICAgIHsKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgICAgICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICAgICAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlSb3dzYW1wbGVzOyBpWCsrKQorI2VuZGlmCisgICAgICB7CisgICAgICAgIGlmICghaU0pICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXNrIHVuZGVyZmxvdyA/ICovCisgICAgICAgIHsKKyAgICAgICAgICBpQiA9ICpwV29ya3JvdzsgICAgICAgICAgICAgIC8qIGdldCBuZXh0IGlucHV0LWJ5dGUgKi8KKyAgICAgICAgICBwV29ya3JvdysrOworICAgICAgICAgIGlNID0gMHg4MDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpQiAmIGlNKSAgICAgICAgICAgICAgICAgICAvKiBpcyBpdCB3aGl0ZSA/ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cmFuc3BhcmVudCAhICovCisgICAgICAgICAgbW5nX3B1dF91aW50MzIgKHBSR0JBcm93LCAweDAwMDAwMDAwKTsKKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9wYXF1ZSBibGFjayAqLworICAgICAgICAgIG1uZ19wdXRfdWludDMyIChwUkdCQXJvdywgMHgwMDAwMDBGRik7CisKKyAgICAgICAgcFJHQkFyb3cgKz0gNDsgICAgICAgICAgICAgICAgIC8qIG5leHQgcGl4ZWwgKi8KKyAgICAgICAgaU0gPj49ICAxOworICAgICAgfQorICAgIH0KKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJsYWNrIHRyYW5zcGFyZW50ICovCisgICAgeworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgICAgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgICAgICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgICAgIHsKKyAgICAgICAgaWYgKCFpTSkgICAgICAgICAgICAgICAgICAgICAgIC8qIG1hc2sgdW5kZXJmbG93ID8gKi8KKyAgICAgICAgeworICAgICAgICAgIGlCID0gKnBXb3Jrcm93OyAgICAgICAgICAgICAgLyogZ2V0IG5leHQgaW5wdXQtYnl0ZSAqLworICAgICAgICAgIHBXb3Jrcm93Kys7CisgICAgICAgICAgaU0gPSAweDgwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGlCICYgaU0pICAgICAgICAgICAgICAgICAgIC8qIGlzIGl0IHdoaXRlID8gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9wYXF1ZSB3aGl0ZSAqLworICAgICAgICAgIG1uZ19wdXRfdWludDMyIChwUkdCQXJvdywgMHhGRkZGRkZGRik7CisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cmFuc3BhcmVudCAqLworICAgICAgICAgIG1uZ19wdXRfdWludDMyIChwUkdCQXJvdywgMHgwMDAwMDAwMCk7CisKKyAgICAgICAgcFJHQkFyb3cgKz0gNDsgICAgICAgICAgICAgICAgIC8qIG5leHQgcGl4ZWwgKi8KKyAgICAgICAgaU0gPj49ICAxOworICAgICAgfQorICAgIH0KKworICAgIHBEYXRhLT5iSXNPcGFxdWUgPSBNTkdfRkFMU0U7ICAgICAgLyogaXQncyBub3QgZnVsbHkgb3BhcXVlICovCisgIH0KKyAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vIHRyYW5zcGFyZW5jeSAqLworICB7CisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICAgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgICAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlSb3dzYW1wbGVzOyBpWCsrKQorI2VuZGlmCisgICAgeworICAgICAgaWYgKCFpTSkgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWFzayB1bmRlcmZsb3cgPyAqLworICAgICAgeworICAgICAgICBpQiA9ICpwV29ya3JvdzsgICAgICAgICAgICAgICAgLyogZ2V0IG5leHQgaW5wdXQtYnl0ZSAqLworICAgICAgICBwV29ya3JvdysrOworICAgICAgICBpTSA9IDB4ODA7CisgICAgICB9CisKKyAgICAgIGlmIChpQiAmIGlNKSAgICAgICAgICAgICAgICAgICAgIC8qIGlzIGl0IHdoaXRlID8gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9wYXF1ZSB3aGl0ZSAqLworICAgICAgICBtbmdfcHV0X3VpbnQzMiAocFJHQkFyb3csIDB4RkZGRkZGRkYpOworICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3BhcXVlIGJsYWNrICovCisgICAgICAgIG1uZ19wdXRfdWludDMyIChwUkdCQXJvdywgMHgwMDAwMDBGRik7CisKKyAgICAgIHBSR0JBcm93ICs9IDQ7ICAgICAgICAgICAgICAgICAgIC8qIG5leHQgcGl4ZWwgKi8KKyAgICAgIGlNID4+PSAgMTsKKyAgICB9CisKKyAgICBwRGF0YS0+YklzT3BhcXVlID0gTU5HX1RSVUU7ICAgICAgIC8qIGl0J3MgZnVsbHkgb3BhcXVlICovCisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9DRVNTX0cxLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfZzIgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX3VpbnQ4cCAgICAgcFdvcmtyb3c7CisgIG1uZ191aW50OHAgICAgIHBSR0JBcm93OworICBtbmdfaW50MzIgICAgICBpWDsKKyAgbW5nX3VpbnQ4ICAgICAgaUI7CisgIG1uZ191aW50OCAgICAgIGlNOworICBtbmdfdWludDMyICAgICBpUzsKKyAgbW5nX3VpbnQ4ICAgICAgaVE7CisgIG1uZ19pbWFnZWRhdGFwIHBCdWYgPSAobW5nX2ltYWdlZGF0YXApcERhdGEtPnBTdG9yZWJ1ZjsKKyNpZmRlZiBNTkdfT1BUSU1JWkVfRk9PVFBSSU5UX1NXSVRDSAorICBjb25zdCBtbmdfdWludDMyICBsZXZlbFs0XSA9IHsgMHgwMDAwMDBGRiwgMHg1NTU1NTVGRiwKKyAgICAgICAgICAweEFBQUFBQUZGLCAweEZGRkZGRkZGfTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST0NFU1NfRzIsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAoIXBCdWYpICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm8gb2JqZWN0PyB0aGVuIHVzZSBvYmogMCAqLworICAgIHBCdWYgPSAoKG1uZ19pbWFnZXApcERhdGEtPnBPYmp6ZXJvKS0+cEltZ2J1ZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRlbXBvcmFyeSB3b3JrIHBvaW50ZXJzICovCisgIHBXb3Jrcm93ID0gcERhdGEtPnBXb3Jrcm93ICsgcERhdGEtPmlQaXhlbG9mczsKKyAgcFJHQkFyb3cgPSBwRGF0YS0+cFJHQkFyb3c7CisgIGlNICAgICAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdGFydCBhdCBwaXhlbCAwICovCisgIGlCICAgICAgID0gMDsKKyAgaVMgICAgICAgPSAwOworCisgIGlmIChwQnVmLT5iSGFzVFJOUykgICAgICAgICAgICAgICAgICAvKiB0Uk5TIGVuY291bnRlcmVkID8gKi8KKyAgeworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICAgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICAgIHsKKyAgICAgIGlmICghaU0pICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1hc2sgdW5kZXJmbG93ID8gKi8KKyAgICAgIHsKKyAgICAgICAgaUIgPSAqcFdvcmtyb3c7ICAgICAgICAgICAgICAgIC8qIGdldCBuZXh0IGlucHV0LWJ5dGUgKi8KKyAgICAgICAgcFdvcmtyb3crKzsKKyAgICAgICAgaU0gPSAweEMwOworICAgICAgICBpUyA9IDY7CisgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZXRlcm1pbmUgZ3JheSBsZXZlbCAqLworICAgICAgaVEgPSAobW5nX3VpbnQ4KSgoaUIgJiBpTSkgPj4gaVMpOworCisgICAgICBpZiAoaVEgPT0gcEJ1Zi0+aVRSTlNncmF5KSAgICAgICAvKiB0cmFuc3BhcmVudCA/ICovCisgICAgICAgIG1uZ19wdXRfdWludDMyIChwUkdCQXJvdywgMHgwMDAwMDAwMCk7CisgICAgICBlbHNlCisgICAgICB7CisjaWZkZWYgTU5HX09QVElNSVpFX0ZPT1RQUklOVF9TV0lUQ0gKKyAgICAgICAgbW5nX3B1dF91aW50MzIgKHBSR0JBcm93LCBsZXZlbFtpUV0pOworI2Vsc2UKKyAgICAgICAgc3dpdGNoIChpUSkgICAgICAgICAgICAgICAgICAgIC8qIGRldGVybWluZSB0aGUgZ3JheSBsZXZlbCAqLworICAgICAgICB7CisgICAgICAgICAgY2FzZSAweDAzIDogeyBtbmdfcHV0X3VpbnQzMiAocFJHQkFyb3csIDB4RkZGRkZGRkYpOyBicmVhazsgfQorICAgICAgICAgIGNhc2UgMHgwMiA6IHsgbW5nX3B1dF91aW50MzIgKHBSR0JBcm93LCAweEFBQUFBQUZGKTsgYnJlYWs7IH0KKyAgICAgICAgICBjYXNlIDB4MDEgOiB7IG1uZ19wdXRfdWludDMyIChwUkdCQXJvdywgMHg1NTU1NTVGRik7IGJyZWFrOyB9CisgICAgICAgICAgZGVmYXVsdCAgIDogeyBtbmdfcHV0X3VpbnQzMiAocFJHQkFyb3csIDB4MDAwMDAwRkYpOyB9CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgfQorCisgICAgICBwUkdCQXJvdyArPSA0OyAgICAgICAgICAgICAgICAgICAvKiBuZXh0IHBpeGVsICovCisgICAgICBpTSA+Pj0gIDI7CisgICAgICBpUyAtPSAyOworICAgIH0KKworICAgIHBEYXRhLT5iSXNPcGFxdWUgPSBNTkdfRkFMU0U7ICAgICAgLyogaXQncyBub3QgZnVsbHkgb3BhcXVlICovCisgIH0KKyAgZWxzZQorICB7CisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICAgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgICAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlSb3dzYW1wbGVzOyBpWCsrKQorI2VuZGlmCisgICAgeworICAgICAgaWYgKCFpTSkgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWFzayB1bmRlcmZsb3cgPyAqLworICAgICAgeworICAgICAgICBpQiA9ICpwV29ya3JvdzsgICAgICAgICAgICAgICAgLyogZ2V0IG5leHQgaW5wdXQtYnl0ZSAqLworICAgICAgICBwV29ya3JvdysrOworICAgICAgICBpTSA9IDB4QzA7CisgICAgICAgIGlTID0gNjsKKyAgICAgIH0KKworI2lmZGVmIE1OR19PUFRJTUlaRV9GT09UUFJJTlRfU1dJVENICisgICAgICBtbmdfcHV0X3VpbnQzMiAocFJHQkFyb3csIGxldmVsWygoaUIgJiBpTSkgPj4gaVMpXSApOworI2Vsc2UKKyAgICAgIHN3aXRjaCAoKGlCICYgaU0pID4+IGlTKSAgICAgICAgIC8qIGRldGVybWluZSB0aGUgZ3JheSBsZXZlbCAqLworICAgICAgeworICAgICAgICBjYXNlIDB4MDMgOiB7IG1uZ19wdXRfdWludDMyIChwUkdCQXJvdywgMHhGRkZGRkZGRik7IGJyZWFrOyB9CisgICAgICAgIGNhc2UgMHgwMiA6IHsgbW5nX3B1dF91aW50MzIgKHBSR0JBcm93LCAweEFBQUFBQUZGKTsgYnJlYWs7IH0KKyAgICAgICAgY2FzZSAweDAxIDogeyBtbmdfcHV0X3VpbnQzMiAocFJHQkFyb3csIDB4NTU1NTU1RkYpOyBicmVhazsgfQorICAgICAgICBkZWZhdWx0ICAgOiB7IG1uZ19wdXRfdWludDMyIChwUkdCQXJvdywgMHgwMDAwMDBGRik7IH0KKyAgICAgIH0KKyNlbmRpZgorCisgICAgICBwUkdCQXJvdyArPSA0OyAgICAgICAgICAgICAgICAgICAvKiBuZXh0IHBpeGVsICovCisgICAgICBpTSA+Pj0gIDI7CisgICAgICBpUyAtPSAyOworICAgIH0KKworICAgIHBEYXRhLT5iSXNPcGFxdWUgPSBNTkdfVFJVRTsgICAgICAgLyogaXQncyBmdWxseSBvcGFxdWUgKi8KKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST0NFU1NfRzIsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19nNCAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfdWludDhwICAgICBwV29ya3JvdzsKKyAgbW5nX3VpbnQ4cCAgICAgcFJHQkFyb3c7CisgIG1uZ19pbnQzMiAgICAgIGlYOworICBtbmdfdWludDggICAgICBpQjsKKyAgbW5nX3VpbnQ4ICAgICAgaU07CisgIG1uZ191aW50MzIgICAgIGlTOworICBtbmdfdWludDggICAgICBpUTsKKyAgbW5nX2ltYWdlZGF0YXAgcEJ1ZiA9IChtbmdfaW1hZ2VkYXRhcClwRGF0YS0+cFN0b3JlYnVmOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST0NFU1NfRzQsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAoIXBCdWYpICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm8gb2JqZWN0PyB0aGVuIHVzZSBvYmogMCAqLworICAgIHBCdWYgPSAoKG1uZ19pbWFnZXApcERhdGEtPnBPYmp6ZXJvKS0+cEltZ2J1ZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRlbXBvcmFyeSB3b3JrIHBvaW50ZXJzICovCisgIHBXb3Jrcm93ID0gcERhdGEtPnBXb3Jrcm93ICsgcERhdGEtPmlQaXhlbG9mczsKKyAgcFJHQkFyb3cgPSBwRGF0YS0+cFJHQkFyb3c7CisgIGlNICAgICAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdGFydCBhdCBwaXhlbCAwICovCisgIGlCICAgICAgID0gMDsKKyAgaVMgICAgICAgPSAwOworCisgIGlmIChwQnVmLT5iSGFzVFJOUykgICAgICAgICAgICAgICAgICAvKiB0Uk5TIGVuY291bnRlcmVkID8gKi8KKyAgeworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICAgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICAgIHsKKyAgICAgIGlmICghaU0pICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1hc2sgdW5kZXJmbG93ID8gKi8KKyAgICAgIHsKKyAgICAgICAgaUIgPSAqcFdvcmtyb3c7ICAgICAgICAgICAgICAgIC8qIGdldCBuZXh0IGlucHV0LWJ5dGUgKi8KKyAgICAgICAgcFdvcmtyb3crKzsKKyAgICAgICAgaU0gPSAweEYwOworICAgICAgICBpUyA9IDQ7CisgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgdGhlIGdyYXkgbGV2ZWwgKi8KKyAgICAgIGlRID0gKG1uZ191aW50OCkoKGlCICYgaU0pID4+IGlTKTsKKworICAgICAgaWYgKGlRID09IHBCdWYtPmlUUk5TZ3JheSkgICAgICAgLyogdHJhbnNwYXJlbnQgPyAqLworICAgICAgeworICAgICAgICAqcFJHQkFyb3cgICAgID0gMDsgICAgICAgICAgICAgLyogcHV0IGluIGludGVybWVkaWF0ZSByb3cgKi8KKyAgICAgICAgKihwUkdCQXJvdysxKSA9IDA7CisgICAgICAgICoocFJHQkFyb3crMikgPSAwOworICAgICAgICAqKHBSR0JBcm93KzMpID0gMDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGV4cGFuZCB0byA4LWJpdCBieSByZXBsaWNhdGlvbiAqLworICAgICAgICBpUSA9IChtbmdfdWludDgpKGlRICsgKGlRIDw8IDQpKTsKKworICAgICAgICAqcFJHQkFyb3cgICAgID0gaVE7ICAgICAgICAgICAgLyogcHV0IGluIGludGVybWVkaWF0ZSByb3cgKi8KKyAgICAgICAgKihwUkdCQXJvdysxKSA9IGlROworICAgICAgICAqKHBSR0JBcm93KzIpID0gaVE7CisgICAgICAgICoocFJHQkFyb3crMykgPSAweEZGOworICAgICAgfQorCisgICAgICBwUkdCQXJvdyArPSA0OyAgICAgICAgICAgICAgICAgICAvKiBuZXh0IHBpeGVsICovCisgICAgICBpTSA+Pj0gIDQ7CisgICAgICBpUyAtPSA0OworICAgIH0KKworICAgIHBEYXRhLT5iSXNPcGFxdWUgPSBNTkdfRkFMU0U7ICAgICAgLyogaXQncyBub3QgZnVsbHkgb3BhcXVlICovCisgIH0KKyAgZWxzZQorICB7CisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICAgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgICAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlSb3dzYW1wbGVzOyBpWCsrKQorI2VuZGlmCisgICAgeworICAgICAgaWYgKCFpTSkgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWFzayB1bmRlcmZsb3cgPyAqLworICAgICAgeworICAgICAgICBpQiA9ICpwV29ya3JvdzsgICAgICAgICAgICAgICAgLyogZ2V0IG5leHQgaW5wdXQtYnl0ZSAqLworICAgICAgICBwV29ya3JvdysrOworICAgICAgICBpTSA9IDB4RjA7CisgICAgICAgIGlTID0gNDsKKyAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCB0aGUgZ3JheSBsZXZlbCAqLworICAgICAgaVEgPSAobW5nX3VpbnQ4KSgoaUIgJiBpTSkgPj4gaVMpOworICAgICAgaVEgPSAobW5nX3VpbnQ4KShpUSArIChpUSA8PCA0KSk7LyogZXhwYW5kIHRvIDgtYml0IGJ5IHJlcGxpY2F0aW9uICovCisKKyAgICAgICpwUkdCQXJvdyAgICAgPSBpUTsgICAgICAgICAgICAgIC8qIHB1dCBpbiBpbnRlcm1lZGlhdGUgcm93ICovCisgICAgICAqKHBSR0JBcm93KzEpID0gaVE7CisgICAgICAqKHBSR0JBcm93KzIpID0gaVE7CisgICAgICAqKHBSR0JBcm93KzMpID0gMHhGRjsKKworICAgICAgcFJHQkFyb3cgKz0gNDsgICAgICAgICAgICAgICAgICAgLyogbmV4dCBwaXhlbCAqLworICAgICAgaU0gPj49ICA0OworICAgICAgaVMgLT0gNDsKKyAgICB9CisKKyAgICBwRGF0YS0+YklzT3BhcXVlID0gTU5HX1RSVUU7ICAgICAgIC8qIGl0J3MgZnVsbHkgb3BhcXVlICovCisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9DRVNTX0c0LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZiAvKiBNTkdfTk9fMV8yXzRCSVRfU1VQUE9SVCAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19nOCAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfdWludDhwICAgICBwV29ya3JvdzsKKyAgbW5nX3VpbnQ4cCAgICAgcFJHQkFyb3c7CisgIG1uZ19pbnQzMiAgICAgIGlYOworICBtbmdfdWludDggICAgICBpQjsKKyAgbW5nX2ltYWdlZGF0YXAgcEJ1ZiA9IChtbmdfaW1hZ2VkYXRhcClwRGF0YS0+cFN0b3JlYnVmOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST0NFU1NfRzgsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAoIXBCdWYpICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm8gb2JqZWN0PyB0aGVuIHVzZSBvYmogMCAqLworICAgIHBCdWYgPSAoKG1uZ19pbWFnZXApcERhdGEtPnBPYmp6ZXJvKS0+cEltZ2J1ZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRlbXBvcmFyeSB3b3JrIHBvaW50ZXJzICovCisgIHBXb3Jrcm93ID0gcERhdGEtPnBXb3Jrcm93ICsgcERhdGEtPmlQaXhlbG9mczsKKyAgcFJHQkFyb3cgPSBwRGF0YS0+cFJHQkFyb3c7CisKKyAgaWYgKHBCdWYtPmJIYXNUUk5TKSAgICAgICAgICAgICAgICAgIC8qIHRSTlMgZW5jb3VudGVyZWQgPyAqLworICB7CisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICAgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgICAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlSb3dzYW1wbGVzOyBpWCsrKQorI2VuZGlmCisgICAgeworICAgICAgaUIgPSAqcFdvcmtyb3c7ICAgICAgICAgICAgICAgICAgLyogZ2V0IG5leHQgaW5wdXQtYnl0ZSAqLworCisgICAgICBpZiAoaUIgPT0gcEJ1Zi0+aVRSTlNncmF5KSAgICAgICAvKiB0cmFuc3BhcmVudCA/ICovCisgICAgICB7CisgICAgICAgICpwUkdCQXJvdyAgICAgPSAwOyAgICAgICAgICAgICAvKiBwdXQgaW4gaW50ZXJtZWRpYXRlIHJvdyAqLworICAgICAgICAqKHBSR0JBcm93KzEpID0gMDsKKyAgICAgICAgKihwUkdCQXJvdysyKSA9IDA7CisgICAgICAgICoocFJHQkFyb3crMykgPSAwOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAqcFJHQkFyb3cgICAgID0gaUI7ICAgICAgICAgICAgLyogcHV0IGluIGludGVybWVkaWF0ZSByb3cgKi8KKyAgICAgICAgKihwUkdCQXJvdysxKSA9IGlCOworICAgICAgICAqKHBSR0JBcm93KzIpID0gaUI7CisgICAgICAgICoocFJHQkFyb3crMykgPSAweEZGOworICAgICAgfQorCisgICAgICBwUkdCQXJvdyArPSA0OyAgICAgICAgICAgICAgICAgICAvKiBuZXh0IHBpeGVsICovCisgICAgICBwV29ya3JvdysrOworICAgIH0KKworICAgIHBEYXRhLT5iSXNPcGFxdWUgPSBNTkdfRkFMU0U7ICAgICAgLyogaXQncyBub3QgZnVsbHkgb3BhcXVlICovCisgIH0KKyAgZWxzZQorICB7CisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICAgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgICAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlSb3dzYW1wbGVzOyBpWCsrKQorI2VuZGlmCisgICAgeworICAgICAgaUIgPSAqcFdvcmtyb3c7ICAgICAgICAgICAgICAgICAgLyogZ2V0IG5leHQgaW5wdXQtYnl0ZSAqLworCisgICAgICAqcFJHQkFyb3cgICAgID0gaUI7ICAgICAgICAgICAgICAvKiBwdXQgaW4gaW50ZXJtZWRpYXRlIHJvdyAqLworICAgICAgKihwUkdCQXJvdysxKSA9IGlCOworICAgICAgKihwUkdCQXJvdysyKSA9IGlCOworICAgICAgKihwUkdCQXJvdyszKSA9IDB4RkY7CisKKyAgICAgIHBSR0JBcm93ICs9IDQ7ICAgICAgICAgICAgICAgICAgIC8qIG5leHQgcGl4ZWwgKi8KKyAgICAgIHBXb3Jrcm93Kys7CisgICAgfQorCisgICAgcERhdGEtPmJJc09wYXF1ZSA9IE1OR19UUlVFOyAgICAgICAvKiBpdCdzIGZ1bGx5IG9wYXF1ZSAqLworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19HOCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKK21uZ19yZXRjb2RlIG1uZ19wcm9jZXNzX2cxNiAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfdWludDhwICAgICBwV29ya3JvdzsKKyAgbW5nX3VpbnQ4cCAgICAgcFJHQkFyb3c7CisgIG1uZ19pbnQzMiAgICAgIGlYOworICBtbmdfdWludDE2ICAgICBpVzsKKyAgbW5nX2ltYWdlZGF0YXAgcEJ1ZiA9IChtbmdfaW1hZ2VkYXRhcClwRGF0YS0+cFN0b3JlYnVmOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST0NFU1NfRzE2LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKCFwQnVmKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vIG9iamVjdD8gdGhlbiB1c2Ugb2JqIDAgKi8KKyAgICBwQnVmID0gKChtbmdfaW1hZ2VwKXBEYXRhLT5wT2JqemVybyktPnBJbWdidWY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0ZW1wb3Jhcnkgd29yayBwb2ludGVycyAqLworICBwV29ya3JvdyA9IHBEYXRhLT5wV29ya3JvdyArIHBEYXRhLT5pUGl4ZWxvZnM7CisgIHBSR0JBcm93ID0gcERhdGEtPnBSR0JBcm93OworCisgIGlmIChwQnVmLT5iSGFzVFJOUykgICAgICAgICAgICAgICAgICAvKiB0Uk5TIGVuY291bnRlcmVkID8gKi8KKyAgeworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICAgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICAgIHsKKyAgICAgIGlXID0gbW5nX2dldF91aW50MTYgKHBXb3Jrcm93KTsgIC8qIGdldCBpbnB1dCAqLworCisgICAgICBpZiAoaVcgPT0gcEJ1Zi0+aVRSTlNncmF5KSAgICAgICAvKiB0cmFuc3BhcmVudCA/ICovCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwdXQgaW4gaW50ZXJtZWRpYXRlIHJvdyAqLworICAgICAgICBtbmdfcHV0X3VpbnQxNiAocFJHQkFyb3csICAgMCk7CisgICAgICAgIG1uZ19wdXRfdWludDE2IChwUkdCQXJvdysyLCAwKTsKKyAgICAgICAgbW5nX3B1dF91aW50MTYgKHBSR0JBcm93KzQsIDApOworICAgICAgICBtbmdfcHV0X3VpbnQxNiAocFJHQkFyb3crNiwgMCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwdXQgaW4gaW50ZXJtZWRpYXRlIHJvdyAqLworICAgICAgICBtbmdfcHV0X3VpbnQxNiAocFJHQkFyb3csICAgaVcpOworICAgICAgICBtbmdfcHV0X3VpbnQxNiAocFJHQkFyb3crMiwgaVcpOworICAgICAgICBtbmdfcHV0X3VpbnQxNiAocFJHQkFyb3crNCwgaVcpOworICAgICAgICBtbmdfcHV0X3VpbnQxNiAocFJHQkFyb3crNiwgMHhGRkZGKTsKKyAgICAgIH0KKworICAgICAgcFJHQkFyb3cgKz0gODsgICAgICAgICAgICAgICAgICAgLyogbmV4dCBwaXhlbCAqLworICAgICAgcFdvcmtyb3cgKz0gMjsKKyAgICB9CisKKyAgICBwRGF0YS0+YklzT3BhcXVlID0gTU5HX0ZBTFNFOyAgICAgIC8qIGl0J3Mgbm90IGZ1bGx5IG9wYXF1ZSAqLworICB9CisgIGVsc2UKKyAgeworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICAgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICAgIHsKKyAgICAgIGlXID0gbW5nX2dldF91aW50MTYgKHBXb3Jrcm93KTsgIC8qIGdldCBpbnB1dCAqLworCisgICAgICBtbmdfcHV0X3VpbnQxNiAocFJHQkFyb3csICAgaVcpOyAvKiBhbmQgcHV0IGluIGludGVybWVkaWF0ZSByb3cgKi8KKyAgICAgIG1uZ19wdXRfdWludDE2IChwUkdCQXJvdysyLCBpVyk7CisgICAgICBtbmdfcHV0X3VpbnQxNiAocFJHQkFyb3crNCwgaVcpOworICAgICAgbW5nX3B1dF91aW50MTYgKHBSR0JBcm93KzYsIDB4RkZGRik7CisKKyAgICAgIHBSR0JBcm93ICs9IDg7ICAgICAgICAgICAgICAgICAgIC8qIG5leHQgcGl4ZWwgKi8KKyAgICAgIHBXb3Jrcm93ICs9IDI7CisgICAgfQorCisgICAgcERhdGEtPmJJc09wYXF1ZSA9IE1OR19UUlVFOyAgICAgICAvKiBpdCdzIGZ1bGx5IG9wYXF1ZSAqLworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19HMTYsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19wcm9jZXNzX3JnYjggKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX3VpbnQ4cCAgICAgcFdvcmtyb3c7CisgIG1uZ191aW50OHAgICAgIHBSR0JBcm93OworICBtbmdfaW50MzIgICAgICBpWDsKKyAgbW5nX3VpbnQ4ICAgICAgaVIsIGlHLCBpQjsKKyAgbW5nX2ltYWdlZGF0YXAgcEJ1ZiA9IChtbmdfaW1hZ2VkYXRhcClwRGF0YS0+cFN0b3JlYnVmOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST0NFU1NfUkdCOCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmICghcEJ1ZikgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBubyBvYmplY3Q/IHRoZW4gdXNlIG9iaiAwICovCisgICAgcEJ1ZiA9ICgobW5nX2ltYWdlcClwRGF0YS0+cE9ianplcm8pLT5wSW1nYnVmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGVtcG9yYXJ5IHdvcmsgcG9pbnRlcnMgKi8KKyAgcFdvcmtyb3cgPSBwRGF0YS0+cFdvcmtyb3cgKyBwRGF0YS0+aVBpeGVsb2ZzOworICBwUkdCQXJvdyA9IHBEYXRhLT5wUkdCQXJvdzsKKworICBpZiAocEJ1Zi0+Ykhhc1RSTlMpICAgICAgICAgICAgICAgICAgLyogdFJOUyBlbmNvdW50ZXJlZCA/ICovCisgIHsKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgICAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgICB7CisgICAgICBpUiA9ICpwV29ya3JvdzsgICAgICAgICAgICAgICAgICAvKiBnZXQgdGhlIFJHQiB2YWx1ZXMgKi8KKyAgICAgIGlHID0gKihwV29ya3JvdysxKTsKKyAgICAgIGlCID0gKihwV29ya3JvdysyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRyYW5zcGFyZW50ID8gKi8KKyAgICAgIGlmICgoaVIgPT0gcEJ1Zi0+aVRSTlNyZWQpICYmIChpRyA9PSBwQnVmLT5pVFJOU2dyZWVuKSAmJgorICAgICAgICAgIChpQiA9PSBwQnVmLT5pVFJOU2JsdWUpKQorICAgICAgeworICAgICAgICAqcFJHQkFyb3cgICAgID0gMDsgICAgICAgICAgICAgLyogdGhpcyBwaXhlbCBpcyB0cmFuc3BhcmVudCAhICovCisgICAgICAgICoocFJHQkFyb3crMSkgPSAwOworICAgICAgICAqKHBSR0JBcm93KzIpID0gMDsKKyAgICAgICAgKihwUkdCQXJvdyszKSA9IDA7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICpwUkdCQXJvdyAgICAgPSBpUjsgICAgICAgICAgICAvKiBjb3B5IHRoZSBSR0IgdmFsdWVzICovCisgICAgICAgICoocFJHQkFyb3crMSkgPSBpRzsKKyAgICAgICAgKihwUkdCQXJvdysyKSA9IGlCOworICAgICAgICAqKHBSR0JBcm93KzMpID0gMHhGRjsgICAgICAgICAgLyogdGhpcyBvbmUgaXNuJ3QgdHJhbnNwYXJlbnQgKi8KKyAgICAgIH0KKworICAgICAgcFdvcmtyb3cgKz0gMzsgICAgICAgICAgICAgICAgICAgLyogbmV4dCBwaXhlbCAqLworICAgICAgcFJHQkFyb3cgKz0gNDsKKyAgICB9CisKKyAgICBwRGF0YS0+YklzT3BhcXVlID0gTU5HX0ZBTFNFOyAgICAgIC8qIGl0J3Mgbm90IGZ1bGx5IG9wYXF1ZSAqLworICB9CisgIGVsc2UKKyAgeworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICAgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICAgIHsKKyAgICAgICpwUkdCQXJvdyAgICAgPSAqcFdvcmtyb3c7ICAgICAgIC8qIGNvcHkgdGhlIFJHQiBieXRlcyAqLworICAgICAgKihwUkdCQXJvdysxKSA9ICoocFdvcmtyb3crMSk7CisgICAgICAqKHBSR0JBcm93KzIpID0gKihwV29ya3JvdysyKTsKKyAgICAgICoocFJHQkFyb3crMykgPSAweEZGOyAgICAgICAgICAgIC8qIG5vIGFscGhhOyBzbyBhbHdheXMgZnVsbHkgb3BhcXVlICovCisKKyAgICAgIHBXb3Jrcm93ICs9IDM7ICAgICAgICAgICAgICAgICAgIC8qIG5leHQgcGl4ZWwgKi8KKyAgICAgIHBSR0JBcm93ICs9IDQ7CisgICAgfQorCisgICAgcERhdGEtPmJJc09wYXF1ZSA9IE1OR19UUlVFOyAgICAgICAvKiBpdCdzIGZ1bGx5IG9wYXF1ZSAqLworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19SR0I4LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfcmdiMTYgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX3VpbnQ4cCAgICAgcFdvcmtyb3c7CisgIG1uZ191aW50OHAgICAgIHBSR0JBcm93OworICBtbmdfaW50MzIgICAgICBpWDsKKyAgbW5nX3VpbnQxNiAgICAgaVIsIGlHLCBpQjsKKyAgbW5nX2ltYWdlZGF0YXAgcEJ1ZiA9IChtbmdfaW1hZ2VkYXRhcClwRGF0YS0+cFN0b3JlYnVmOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST0NFU1NfUkdCMTYsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAoIXBCdWYpICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm8gb2JqZWN0PyB0aGVuIHVzZSBvYmogMCAqLworICAgIHBCdWYgPSAoKG1uZ19pbWFnZXApcERhdGEtPnBPYmp6ZXJvKS0+cEltZ2J1ZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRlbXBvcmFyeSB3b3JrIHBvaW50ZXJzICovCisgIHBXb3Jrcm93ID0gcERhdGEtPnBXb3Jrcm93ICsgcERhdGEtPmlQaXhlbG9mczsKKyAgcFJHQkFyb3cgPSBwRGF0YS0+cFJHQkFyb3c7CisKKyAgaWYgKHBCdWYtPmJIYXNUUk5TKSAgICAgICAgICAgICAgICAgIC8qIHRSTlMgZW5jb3VudGVyZWQgPyAqLworICB7CisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICAgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgICAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlSb3dzYW1wbGVzOyBpWCsrKQorI2VuZGlmCisgICAgeworICAgICAgaVIgPSBtbmdfZ2V0X3VpbnQxNiAocFdvcmtyb3cpOyAgLyogZ2V0IHRoZSBSR0IgdmFsdWVzICovCisgICAgICBpRyA9IG1uZ19nZXRfdWludDE2IChwV29ya3JvdysyKTsKKyAgICAgIGlCID0gbW5nX2dldF91aW50MTYgKHBXb3Jrcm93KzQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHJhbnNwYXJlbnQgPyAqLworICAgICAgaWYgKChpUiA9PSBwQnVmLT5pVFJOU3JlZCkgJiYgKGlHID09IHBCdWYtPmlUUk5TZ3JlZW4pICYmCisgICAgICAgICAgKGlCID09IHBCdWYtPmlUUk5TYmx1ZSkpCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cmFuc3BhcmVudCB0aGVuICovCisgICAgICAgIG1uZ19wdXRfdWludDE2IChwUkdCQXJvdywgICAwKTsKKyAgICAgICAgbW5nX3B1dF91aW50MTYgKHBSR0JBcm93KzIsIDApOworICAgICAgICBtbmdfcHV0X3VpbnQxNiAocFJHQkFyb3crNCwgMCk7CisgICAgICAgIG1uZ19wdXRfdWludDE2IChwUkdCQXJvdys2LCAwKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHB1dCBpbiBpbnRlcm1lZGlhdGUgcm93ICovCisgICAgICAgIG1uZ19wdXRfdWludDE2IChwUkdCQXJvdywgICBpUik7CisgICAgICAgIG1uZ19wdXRfdWludDE2IChwUkdCQXJvdysyLCBpRyk7CisgICAgICAgIG1uZ19wdXRfdWludDE2IChwUkdCQXJvdys0LCBpQik7CisgICAgICAgIG1uZ19wdXRfdWludDE2IChwUkdCQXJvdys2LCAweEZGRkYpOworICAgICAgfQorCisgICAgICBwV29ya3JvdyArPSA2OyAgICAgICAgICAgICAgICAgICAvKiBuZXh0IHBpeGVsICovCisgICAgICBwUkdCQXJvdyArPSA4OworICAgIH0KKworICAgIHBEYXRhLT5iSXNPcGFxdWUgPSBNTkdfRkFMU0U7ICAgICAgLyogaXQncyBub3QgZnVsbHkgb3BhcXVlICovCisgIH0KKyAgZWxzZQorICB7CisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICAgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgICAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlSb3dzYW1wbGVzOyBpWCsrKQorI2VuZGlmCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3B5IHRoZSBSR0IgdmFsdWVzICovCisgICAgICBtbmdfcHV0X3VpbnQxNiAocFJHQkFyb3csICAgbW5nX2dldF91aW50MTYgKHBXb3Jrcm93ICApKTsKKyAgICAgIG1uZ19wdXRfdWludDE2IChwUkdCQXJvdysyLCBtbmdfZ2V0X3VpbnQxNiAocFdvcmtyb3crMikpOworICAgICAgbW5nX3B1dF91aW50MTYgKHBSR0JBcm93KzQsIG1uZ19nZXRfdWludDE2IChwV29ya3Jvdys0KSk7CisgICAgICBtbmdfcHV0X3VpbnQxNiAocFJHQkFyb3crNiwgMHhGRkZGKTsKKworICAgICAgcFdvcmtyb3cgKz0gNjsgICAgICAgICAgICAgICAgICAgLyogbmV4dCBwaXhlbCAqLworICAgICAgcFJHQkFyb3cgKz0gODsKKyAgICB9CisKKyAgICBwRGF0YS0+YklzT3BhcXVlID0gTU5HX1RSVUU7ICAgICAgIC8qIGl0J3MgZnVsbHkgb3BhcXVlICovCisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9DRVNTX1JHQjE2LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19OT18xXzJfNEJJVF9TVVBQT1JUCittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19pZHgxIChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ191aW50OHAgICAgIHBXb3Jrcm93OworICBtbmdfdWludDhwICAgICBwUkdCQXJvdzsKKyAgbW5nX2ludDMyICAgICAgaVg7CisgIG1uZ191aW50OCAgICAgIGlCOworICBtbmdfdWludDggICAgICBpTTsKKyAgbW5nX3VpbnQzMiAgICAgaVM7CisgIG1uZ191aW50OCAgICAgIGlROworICBtbmdfaW1hZ2VkYXRhcCBwQnVmID0gKG1uZ19pbWFnZWRhdGFwKXBEYXRhLT5wU3RvcmVidWY7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19JRFgxLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKCFwQnVmKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vIG9iamVjdD8gdGhlbiB1c2Ugb2JqIDAgKi8KKyAgICBwQnVmID0gKChtbmdfaW1hZ2VwKXBEYXRhLT5wT2JqemVybyktPnBJbWdidWY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0ZW1wb3Jhcnkgd29yayBwb2ludGVycyAqLworICBwV29ya3JvdyA9IHBEYXRhLT5wV29ya3JvdyArIHBEYXRhLT5pUGl4ZWxvZnM7CisgIHBSR0JBcm93ID0gcERhdGEtPnBSR0JBcm93OworICBpTSAgICAgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RhcnQgYXQgcGl4ZWwgMCAqLworICBpQiAgICAgICA9IDA7CisgIGlTICAgICAgID0gMDsKKworICBpZiAocEJ1Zi0+Ykhhc1RSTlMpICAgICAgICAgICAgICAgICAgLyogdFJOUyBlbmNvdW50ZXJlZCA/ICovCisgIHsKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgICAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgICB7CisgICAgICBpZiAoIWlNKSAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXNrIHVuZGVyZmxvdyA/ICovCisgICAgICB7CisgICAgICAgIGlCID0gKnBXb3Jrcm93OyAgICAgICAgICAgICAgICAvKiBnZXQgbmV4dCBpbnB1dC1ieXRlICovCisgICAgICAgIHBXb3Jrcm93Kys7CisgICAgICAgIGlNID0gMHg4MDsKKyAgICAgICAgaVMgPSA3OworICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0IHRoZSBpbmRleCAqLworICAgICAgaVEgPSAobW5nX3VpbnQ4KSgoaUIgJiBpTSkgPj4gaVMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5kZXggdmFsaWQgPyAqLworICAgICAgaWYgKChtbmdfdWludDMyKWlRIDwgcEJ1Zi0+aVBMVEVjb3VudCkKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHB1dCBpbiBpbnRlcm1lZGlhdGUgcm93ICovCisgICAgICAgICpwUkdCQXJvdyAgICAgPSBwQnVmLT5hUExURWVudHJpZXMgW2lRXS5pUmVkOworICAgICAgICAqKHBSR0JBcm93KzEpID0gcEJ1Zi0+YVBMVEVlbnRyaWVzIFtpUV0uaUdyZWVuOworICAgICAgICAqKHBSR0JBcm93KzIpID0gcEJ1Zi0+YVBMVEVlbnRyaWVzIFtpUV0uaUJsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cmFuc3BhcmVuY3kgZm9yIHRoaXMgaW5kZXggPyAqLworICAgICAgICBpZiAoKG1uZ191aW50MzIpaVEgPCBwQnVmLT5pVFJOU2NvdW50KQorICAgICAgICAgICoocFJHQkFyb3crMykgPSBwQnVmLT5hVFJOU2VudHJpZXMgW2lRXTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICoocFJHQkFyb3crMykgPSAweEZGOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfUExURUlOREVYRVJST1IpOworCisgICAgICBwUkdCQXJvdyArPSA0OyAgICAgICAgICAgICAgICAgICAvKiBuZXh0IHBpeGVsICovCisgICAgICBpTSA+Pj0gIDE7CisgICAgICBpUyAtPSAxOworICAgIH0KKworICAgIHBEYXRhLT5iSXNPcGFxdWUgPSBNTkdfRkFMU0U7ICAgICAgLyogaXQncyBub3QgZnVsbHkgb3BhcXVlICovCisgIH0KKyAgZWxzZQorICB7CisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICAgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgICAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlSb3dzYW1wbGVzOyBpWCsrKQorI2VuZGlmCisgICAgeworICAgICAgaWYgKCFpTSkgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWFzayB1bmRlcmZsb3cgPyAqLworICAgICAgeworICAgICAgICBpQiA9ICpwV29ya3JvdzsgICAgICAgICAgICAgICAgLyogZ2V0IG5leHQgaW5wdXQtYnl0ZSAqLworICAgICAgICBwV29ya3JvdysrOworICAgICAgICBpTSA9IDB4ODA7CisgICAgICAgIGlTID0gNzsKKyAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCB0aGUgaW5kZXggKi8KKyAgICAgIGlRID0gKG1uZ191aW50OCkoKGlCICYgaU0pID4+IGlTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluZGV4IHZhbGlkID8gKi8KKyAgICAgIGlmICgobW5nX3VpbnQzMilpUSA8IHBCdWYtPmlQTFRFY291bnQpCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwdXQgaW4gaW50ZXJtZWRpYXRlIHJvdyAqLworICAgICAgICAqcFJHQkFyb3cgICAgID0gcEJ1Zi0+YVBMVEVlbnRyaWVzIFtpUV0uaVJlZDsKKyAgICAgICAgKihwUkdCQXJvdysxKSA9IHBCdWYtPmFQTFRFZW50cmllcyBbaVFdLmlHcmVlbjsKKyAgICAgICAgKihwUkdCQXJvdysyKSA9IHBCdWYtPmFQTFRFZW50cmllcyBbaVFdLmlCbHVlOworICAgICAgICAqKHBSR0JBcm93KzMpID0gMHhGRjsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1BMVEVJTkRFWEVSUk9SKTsKKworICAgICAgcFJHQkFyb3cgKz0gNDsgICAgICAgICAgICAgICAgICAgLyogbmV4dCBwaXhlbCAqLworICAgICAgaU0gPj49ICAxOworICAgICAgaVMgLT0gMTsKKyAgICB9CisKKyAgICBwRGF0YS0+YklzT3BhcXVlID0gTU5HX1RSVUU7ICAgICAgIC8qIGl0J3MgZnVsbHkgb3BhcXVlICovCisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9DRVNTX0lEWDEsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19pZHgyIChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ191aW50OHAgICAgIHBXb3Jrcm93OworICBtbmdfdWludDhwICAgICBwUkdCQXJvdzsKKyAgbW5nX2ludDMyICAgICAgaVg7CisgIG1uZ191aW50OCAgICAgIGlCOworICBtbmdfdWludDggICAgICBpTTsKKyAgbW5nX3VpbnQzMiAgICAgaVM7CisgIG1uZ191aW50OCAgICAgIGlROworICBtbmdfaW1hZ2VkYXRhcCBwQnVmID0gKG1uZ19pbWFnZWRhdGFwKXBEYXRhLT5wU3RvcmVidWY7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19JRFgyLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKCFwQnVmKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vIG9iamVjdD8gdGhlbiB1c2Ugb2JqIDAgKi8KKyAgICBwQnVmID0gKChtbmdfaW1hZ2VwKXBEYXRhLT5wT2JqemVybyktPnBJbWdidWY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0ZW1wb3Jhcnkgd29yayBwb2ludGVycyAqLworICBwV29ya3JvdyA9IHBEYXRhLT5wV29ya3JvdyArIHBEYXRhLT5pUGl4ZWxvZnM7CisgIHBSR0JBcm93ID0gcERhdGEtPnBSR0JBcm93OworICBpTSAgICAgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RhcnQgYXQgcGl4ZWwgMCAqLworICBpQiAgICAgICA9IDA7CisgIGlTICAgICAgID0gMDsKKworICBpZiAocEJ1Zi0+Ykhhc1RSTlMpICAgICAgICAgICAgICAgICAgLyogdFJOUyBlbmNvdW50ZXJlZCA/ICovCisgIHsKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgICAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgICB7CisgICAgICBpZiAoIWlNKSAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXNrIHVuZGVyZmxvdyA/ICovCisgICAgICB7CisgICAgICAgIGlCID0gKnBXb3Jrcm93OyAgICAgICAgICAgICAgICAvKiBnZXQgbmV4dCBpbnB1dC1ieXRlICovCisgICAgICAgIHBXb3Jrcm93Kys7CisgICAgICAgIGlNID0gMHhDMDsKKyAgICAgICAgaVMgPSA2OworICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0IHRoZSBpbmRleCAqLworICAgICAgaVEgPSAobW5nX3VpbnQ4KSgoaUIgJiBpTSkgPj4gaVMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5kZXggdmFsaWQgPyAqLworICAgICAgaWYgKChtbmdfdWludDMyKWlRIDwgcEJ1Zi0+aVBMVEVjb3VudCkKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHB1dCBpbiBpbnRlcm1lZGlhdGUgcm93ICovCisgICAgICAgICpwUkdCQXJvdyAgICAgPSBwQnVmLT5hUExURWVudHJpZXMgW2lRXS5pUmVkOworICAgICAgICAqKHBSR0JBcm93KzEpID0gcEJ1Zi0+YVBMVEVlbnRyaWVzIFtpUV0uaUdyZWVuOworICAgICAgICAqKHBSR0JBcm93KzIpID0gcEJ1Zi0+YVBMVEVlbnRyaWVzIFtpUV0uaUJsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cmFuc3BhcmVuY3kgZm9yIHRoaXMgaW5kZXggPyAqLworICAgICAgICBpZiAoKG1uZ191aW50MzIpaVEgPCBwQnVmLT5pVFJOU2NvdW50KQorICAgICAgICAgICoocFJHQkFyb3crMykgPSBwQnVmLT5hVFJOU2VudHJpZXMgW2lRXTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICoocFJHQkFyb3crMykgPSAweEZGOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfUExURUlOREVYRVJST1IpOworCisgICAgICBwUkdCQXJvdyArPSA0OyAgICAgICAgICAgICAgICAgICAvKiBuZXh0IHBpeGVsICovCisgICAgICBpTSA+Pj0gIDI7CisgICAgICBpUyAtPSAyOworICAgIH0KKworICAgIHBEYXRhLT5iSXNPcGFxdWUgPSBNTkdfRkFMU0U7ICAgICAgLyogaXQncyBub3QgZnVsbHkgb3BhcXVlICovCisgIH0KKyAgZWxzZQorICB7CisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICAgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgICAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlSb3dzYW1wbGVzOyBpWCsrKQorI2VuZGlmCisgICAgeworICAgICAgaWYgKCFpTSkgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWFzayB1bmRlcmZsb3cgPyAqLworICAgICAgeworICAgICAgICBpQiA9ICpwV29ya3JvdzsgICAgICAgICAgICAgICAgLyogZ2V0IG5leHQgaW5wdXQtYnl0ZSAqLworICAgICAgICBwV29ya3JvdysrOworICAgICAgICBpTSA9IDB4QzA7CisgICAgICAgIGlTID0gNjsKKyAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCB0aGUgaW5kZXggKi8KKyAgICAgIGlRID0gKG1uZ191aW50OCkoKGlCICYgaU0pID4+IGlTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluZGV4IHZhbGlkID8gKi8KKyAgICAgIGlmICgobW5nX3VpbnQzMilpUSA8IHBCdWYtPmlQTFRFY291bnQpCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwdXQgaW4gaW50ZXJtZWRpYXRlIHJvdyAqLworICAgICAgICAqcFJHQkFyb3cgICAgID0gcEJ1Zi0+YVBMVEVlbnRyaWVzIFtpUV0uaVJlZDsKKyAgICAgICAgKihwUkdCQXJvdysxKSA9IHBCdWYtPmFQTFRFZW50cmllcyBbaVFdLmlHcmVlbjsKKyAgICAgICAgKihwUkdCQXJvdysyKSA9IHBCdWYtPmFQTFRFZW50cmllcyBbaVFdLmlCbHVlOworICAgICAgICAqKHBSR0JBcm93KzMpID0gMHhGRjsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1BMVEVJTkRFWEVSUk9SKTsKKworICAgICAgcFJHQkFyb3cgKz0gNDsgICAgICAgICAgICAgICAgICAgLyogbmV4dCBwaXhlbCAqLworICAgICAgaU0gPj49ICAyOworICAgICAgaVMgLT0gMjsKKyAgICB9CisKKyAgICBwRGF0YS0+YklzT3BhcXVlID0gTU5HX1RSVUU7ICAgICAgIC8qIGl0J3MgZnVsbHkgb3BhcXVlICovCisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9DRVNTX0lEWDIsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19pZHg0IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ191aW50OHAgICAgIHBXb3Jrcm93OworICBtbmdfdWludDhwICAgICBwUkdCQXJvdzsKKyAgbW5nX2ludDMyICAgICAgaVg7CisgIG1uZ191aW50OCAgICAgIGlCOworICBtbmdfdWludDggICAgICBpTTsKKyAgbW5nX3VpbnQzMiAgICAgaVM7CisgIG1uZ191aW50OCAgICAgIGlROworICBtbmdfaW1hZ2VkYXRhcCBwQnVmID0gKG1uZ19pbWFnZWRhdGFwKXBEYXRhLT5wU3RvcmVidWY7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19JRFg0LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKCFwQnVmKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vIG9iamVjdD8gdGhlbiB1c2Ugb2JqIDAgKi8KKyAgICBwQnVmID0gKChtbmdfaW1hZ2VwKXBEYXRhLT5wT2JqemVybyktPnBJbWdidWY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0ZW1wb3Jhcnkgd29yayBwb2ludGVycyAqLworICBwV29ya3JvdyA9IHBEYXRhLT5wV29ya3JvdyArIHBEYXRhLT5pUGl4ZWxvZnM7CisgIHBSR0JBcm93ID0gcERhdGEtPnBSR0JBcm93OworICBpTSAgICAgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RhcnQgYXQgcGl4ZWwgMCAqLworICBpQiAgICAgICA9IDA7CisgIGlTICAgICAgID0gMDsKKworICBpZiAocEJ1Zi0+Ykhhc1RSTlMpICAgICAgICAgICAgICAgICAgLyogdFJOUyBlbmNvdW50ZXJlZCA/ICovCisgIHsKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgICAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgICB7CisgICAgICBpZiAoIWlNKSAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXNrIHVuZGVyZmxvdyA/ICovCisgICAgICB7CisgICAgICAgIGlCID0gcFdvcmtyb3cgWzBdOyAgICAgICAgICAgICAvKiBnZXQgbmV4dCBpbnB1dC1ieXRlICovCisgICAgICAgIHBXb3Jrcm93Kys7CisgICAgICAgIGlNID0gMHhGMDsKKyAgICAgICAgaVMgPSA0OworICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0IHRoZSBpbmRleCAqLworICAgICAgaVEgPSAobW5nX3VpbnQ4KSgoaUIgJiBpTSkgPj4gaVMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5kZXggdmFsaWQgPyAqLworICAgICAgaWYgKChtbmdfdWludDMyKWlRIDwgcEJ1Zi0+aVBMVEVjb3VudCkKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHB1dCBpbiBpbnRlcm1lZGlhdGUgcm93ICovCisgICAgICAgIHBSR0JBcm93IFswXSA9IHBCdWYtPmFQTFRFZW50cmllcyBbaVFdLmlSZWQ7CisgICAgICAgIHBSR0JBcm93IFsxXSA9IHBCdWYtPmFQTFRFZW50cmllcyBbaVFdLmlHcmVlbjsKKyAgICAgICAgcFJHQkFyb3cgWzJdID0gcEJ1Zi0+YVBMVEVlbnRyaWVzIFtpUV0uaUJsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cmFuc3BhcmVuY3kgZm9yIHRoaXMgaW5kZXggPyAqLworICAgICAgICBpZiAoKG1uZ191aW50MzIpaVEgPCBwQnVmLT5pVFJOU2NvdW50KQorICAgICAgICAgIHBSR0JBcm93IFszXSA9IHBCdWYtPmFUUk5TZW50cmllcyBbaVFdOworICAgICAgICBlbHNlCisgICAgICAgICAgcFJHQkFyb3cgWzNdID0gMHhGRjsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1BMVEVJTkRFWEVSUk9SKTsKKworICAgICAgcFJHQkFyb3cgKz0gNDsgICAgICAgICAgICAgICAgICAgLyogbmV4dCBwaXhlbCAqLworICAgICAgaU0gPj49ICA0OworICAgICAgaVMgLT0gNDsKKyAgICB9CisKKyAgICBwRGF0YS0+YklzT3BhcXVlID0gTU5HX0ZBTFNFOyAgICAgIC8qIGl0J3Mgbm90IGZ1bGx5IG9wYXF1ZSAqLworICB9CisgIGVsc2UKKyAgeworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICAgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICAgIHsKKyAgICAgIGlmICghaU0pICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1hc2sgdW5kZXJmbG93ID8gKi8KKyAgICAgIHsKKyAgICAgICAgaUIgPSBwV29ya3JvdyBbMF07ICAgICAgICAgICAgIC8qIGdldCBuZXh0IGlucHV0LWJ5dGUgKi8KKyAgICAgICAgcFdvcmtyb3crKzsKKyAgICAgICAgaU0gPSAweEYwOworICAgICAgICBpUyA9IDQ7CisgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgdGhlIGluZGV4ICovCisgICAgICBpUSA9IChtbmdfdWludDgpKChpQiAmIGlNKSA+PiBpUyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbmRleCB2YWxpZCA/ICovCisgICAgICBpZiAoKG1uZ191aW50MzIpaVEgPCBwQnVmLT5pUExURWNvdW50KQorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHV0IGluIGludGVybWVkaWF0ZSByb3cgKi8KKyAgICAgICAgcFJHQkFyb3cgWzBdID0gcEJ1Zi0+YVBMVEVlbnRyaWVzIFtpUV0uaVJlZDsKKyAgICAgICAgcFJHQkFyb3cgWzFdID0gcEJ1Zi0+YVBMVEVlbnRyaWVzIFtpUV0uaUdyZWVuOworICAgICAgICBwUkdCQXJvdyBbMl0gPSBwQnVmLT5hUExURWVudHJpZXMgW2lRXS5pQmx1ZTsKKyAgICAgICAgcFJHQkFyb3cgWzNdID0gMHhGRjsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1BMVEVJTkRFWEVSUk9SKTsKKworICAgICAgcFJHQkFyb3cgKz0gNDsgICAgICAgICAgICAgICAgICAgLyogbmV4dCBwaXhlbCAqLworICAgICAgaU0gPj49ICA0OworICAgICAgaVMgLT0gNDsKKyAgICB9CisKKyAgICBwRGF0YS0+YklzT3BhcXVlID0gTU5HX1RSVUU7ICAgICAgIC8qIGl0J3MgZnVsbHkgb3BhcXVlICovCisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9DRVNTX0lEWDQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmIC8qIE1OR19OT18xXzJfNEJJVF9TVVBQT1JUICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19wcm9jZXNzX2lkeDggKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX3VpbnQ4cCAgICAgcFdvcmtyb3c7CisgIG1uZ191aW50OHAgICAgIHBSR0JBcm93OworICBtbmdfaW50MzIgICAgICBpWDsKKyAgbW5nX3VpbnQ4ICAgICAgaVE7CisgIG1uZ19pbWFnZWRhdGFwIHBCdWYgPSAobW5nX2ltYWdlZGF0YXApcERhdGEtPnBTdG9yZWJ1ZjsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9DRVNTX0lEWDgsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAoIXBCdWYpICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm8gb2JqZWN0PyB0aGVuIHVzZSBvYmogMCAqLworICAgIHBCdWYgPSAoKG1uZ19pbWFnZXApcERhdGEtPnBPYmp6ZXJvKS0+cEltZ2J1ZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRlbXBvcmFyeSB3b3JrIHBvaW50ZXJzICovCisgIHBXb3Jrcm93ID0gcERhdGEtPnBXb3Jrcm93ICsgcERhdGEtPmlQaXhlbG9mczsKKyAgcFJHQkFyb3cgPSBwRGF0YS0+cFJHQkFyb3c7CisKKyAgaWYgKHBCdWYtPmJIYXNUUk5TKSAgICAgICAgICAgICAgICAgIC8qIHRSTlMgZW5jb3VudGVyZWQgPyAqLworICB7CisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICAgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgICAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlSb3dzYW1wbGVzOyBpWCsrKQorI2VuZGlmCisgICAgeworICAgICAgaVEgPSAqcFdvcmtyb3c7ICAgICAgICAgICAgICAgICAgLyogZ2V0IGlucHV0IGJ5dGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluZGV4IHZhbGlkID8gKi8KKyAgICAgIGlmICgobW5nX3VpbnQzMilpUSA8IHBCdWYtPmlQTFRFY291bnQpCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwdXQgaW4gaW50ZXJtZWRpYXRlIHJvdyAqLworICAgICAgICBwUkdCQXJvdyBbMF0gPSBwQnVmLT5hUExURWVudHJpZXMgW2lRXS5pUmVkOworICAgICAgICBwUkdCQXJvdyBbMV0gPSBwQnVmLT5hUExURWVudHJpZXMgW2lRXS5pR3JlZW47CisgICAgICAgIHBSR0JBcm93IFsyXSA9IHBCdWYtPmFQTFRFZW50cmllcyBbaVFdLmlCbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHJhbnNwYXJlbmN5IGZvciB0aGlzIGluZGV4ID8gKi8KKyAgICAgICAgaWYgKChtbmdfdWludDMyKWlRIDwgcEJ1Zi0+aVRSTlNjb3VudCkKKyAgICAgICAgICBwUkdCQXJvdyBbM10gPSBwQnVmLT5hVFJOU2VudHJpZXMgW2lRXTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHBSR0JBcm93IFszXSA9IDB4RkY7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19QTFRFSU5ERVhFUlJPUik7CisKKyAgICAgIHBSR0JBcm93ICs9IDQ7ICAgICAgICAgICAgICAgICAgIC8qIG5leHQgcGl4ZWwgKi8KKyAgICAgIHBXb3Jrcm93Kys7CisgICAgfQorCisgICAgcERhdGEtPmJJc09wYXF1ZSA9IE1OR19GQUxTRTsgICAgICAvKiBpdCdzIG5vdCBmdWxseSBvcGFxdWUgKi8KKyAgfQorICBlbHNlCisgIHsKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgICAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgICB7CisgICAgICBpUSA9ICpwV29ya3JvdzsgICAgICAgICAgICAgICAgICAvKiBnZXQgaW5wdXQgYnl0ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5kZXggdmFsaWQgPyAqLworICAgICAgaWYgKChtbmdfdWludDMyKWlRIDwgcEJ1Zi0+aVBMVEVjb3VudCkKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHB1dCBpbiBpbnRlcm1lZGlhdGUgcm93ICovCisgICAgICAgIHBSR0JBcm93IFswXSA9IHBCdWYtPmFQTFRFZW50cmllcyBbaVFdLmlSZWQ7CisgICAgICAgIHBSR0JBcm93IFsxXSA9IHBCdWYtPmFQTFRFZW50cmllcyBbaVFdLmlHcmVlbjsKKyAgICAgICAgcFJHQkFyb3cgWzJdID0gcEJ1Zi0+YVBMVEVlbnRyaWVzIFtpUV0uaUJsdWU7CisgICAgICAgIHBSR0JBcm93IFszXSA9IDB4RkY7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19QTFRFSU5ERVhFUlJPUik7CisKKyAgICAgIHBSR0JBcm93ICs9IDQ7ICAgICAgICAgICAgICAgICAgIC8qIG5leHQgcGl4ZWwgKi8KKyAgICAgIHBXb3Jrcm93Kys7CisgICAgfQorCisgICAgcERhdGEtPmJJc09wYXF1ZSA9IE1OR19UUlVFOyAgICAgICAvKiBpdCdzIGZ1bGx5IG9wYXF1ZSAqLworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19JRFg4LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfZ2E4IChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ191aW50OHAgcFdvcmtyb3c7CisgIG1uZ191aW50OHAgcFJHQkFyb3c7CisgIG1uZ19pbnQzMiAgaVg7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19HQTgsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRlbXBvcmFyeSB3b3JrIHBvaW50ZXJzICovCisgIHBXb3Jrcm93ID0gcERhdGEtPnBXb3Jrcm93ICsgcERhdGEtPmlQaXhlbG9mczsKKyAgcFJHQkFyb3cgPSBwRGF0YS0+cFJHQkFyb3c7CisKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICB7CisgICAgKnBSR0JBcm93ICAgICA9ICpwV29ya3JvdzsgICAgICAgICAvKiBjb3B5IHRoZSBncmF5IHZhbHVlICovCisgICAgKihwUkdCQXJvdysxKSA9ICpwV29ya3JvdzsKKyAgICAqKHBSR0JBcm93KzIpID0gKnBXb3Jrcm93OworICAgICoocFJHQkFyb3crMykgPSAqKHBXb3Jrcm93KzEpOyAgICAgLyogY29weSB0aGUgYWxwaGEgdmFsdWUgKi8KKworICAgIHBXb3Jrcm93ICs9IDI7ICAgICAgICAgICAgICAgICAgICAgLyogbmV4dCBwaXhlbCAqLworICAgIHBSR0JBcm93ICs9IDQ7CisgIH0KKworICBwRGF0YS0+YklzT3BhcXVlID0gTU5HX0ZBTFNFOyAgICAgICAgLyogaXQncyBkZWZpbml0ZWx5IG5vdCBmdWxseSBvcGFxdWUgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9DRVNTX0dBOCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKK21uZ19yZXRjb2RlIG1uZ19wcm9jZXNzX2dhMTYgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX3VpbnQ4cCAgcFdvcmtyb3c7CisgIG1uZ191aW50OHAgIHBSR0JBcm93OworICBtbmdfaW50MzIgIGlYOworICBtbmdfdWludDE2IGlXOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST0NFU1NfR0ExNiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGVtcG9yYXJ5IHdvcmsgcG9pbnRlcnMgKi8KKyAgcFdvcmtyb3cgPSBwRGF0YS0+cFdvcmtyb3cgKyBwRGF0YS0+aVBpeGVsb2ZzOworICBwUkdCQXJvdyA9IHBEYXRhLT5wUkdCQXJvdzsKKworI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2FtcGxlczsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlSb3dzYW1wbGVzOyBpWCsrKQorI2VuZGlmCisgIHsKKyAgICBpVyA9IG1uZ19nZXRfdWludDE2IChwV29ya3Jvdyk7ICAgIC8qIGNvcHkgdGhlIGdyYXkgdmFsdWUgKi8KKyAgICBtbmdfcHV0X3VpbnQxNiAocFJHQkFyb3csICAgaVcpOworICAgIG1uZ19wdXRfdWludDE2IChwUkdCQXJvdysyLCBpVyk7CisgICAgbW5nX3B1dF91aW50MTYgKHBSR0JBcm93KzQsIGlXKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvcHkgdGhlIGFscGhhIHZhbHVlICovCisgICAgbW5nX3B1dF91aW50MTYgKHBSR0JBcm93KzYsIG1uZ19nZXRfdWludDE2IChwV29ya3JvdysyKSk7CisKKyAgICBwV29ya3JvdyArPSA0OyAgICAgICAgICAgICAgICAgICAgIC8qIG5leHQgcGl4ZWwgKi8KKyAgICBwUkdCQXJvdyArPSA4OworICB9CisKKyAgcERhdGEtPmJJc09wYXF1ZSA9IE1OR19GQUxTRTsgICAgICAgIC8qIGl0J3MgZGVmaW5pdGVseSBub3QgZnVsbHkgb3BhcXVlICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19HQTE2LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19yZ2JhOCAobW5nX2RhdGFwIHBEYXRhKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9QUk9DRVNTX1JHQkE4LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGlzIGlzIHRoZSBlYXNpZXN0IHRyYW5zZm9ybSAqLworICBNTkdfQ09QWSAocERhdGEtPnBSR0JBcm93LCBwRGF0YS0+cFdvcmtyb3cgKyBwRGF0YS0+aVBpeGVsb2ZzLCBwRGF0YS0+aVJvd3NpemUpOworCisgIHBEYXRhLT5iSXNPcGFxdWUgPSBNTkdfRkFMU0U7ICAgICAgICAvKiBpdCdzIGRlZmluaXRlbHkgbm90IGZ1bGx5IG9wYXF1ZSAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST0NFU1NfUkdCQTgsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19yZ2JhMTYgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19SR0JBMTYsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoaXMgaXMgdGhlIGVhc2llc3QgdHJhbnNmb3JtICovCisgIE1OR19DT1BZIChwRGF0YS0+cFJHQkFyb3csIHBEYXRhLT5wV29ya3JvdyArIHBEYXRhLT5pUGl4ZWxvZnMsIHBEYXRhLT5pUm93c2l6ZSk7CisKKyAgcERhdGEtPmJJc09wYXF1ZSA9IE1OR19GQUxTRTsgICAgICAgIC8qIGl0J3MgZGVmaW5pdGVseSBub3QgZnVsbHkgb3BhcXVlICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19SR0JBMTYsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBSb3cgcHJvY2Vzc2luZyBpbml0aWFsaXphdGlvbiByb3V0aW5lcyAtIHNldCB1cCB0aGUgdmFyaWFibGVzIG5lZWRlZCAgICogKi8KKy8qICogdG8gcHJvY2VzcyB1bmNvbXByZXNzZWQgcm93LWRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfRk9PVFBSSU5UX0lOSVQKKyNpZm5kZWYgTU5HX05PXzFfMl80QklUX1NVUFBPUlQKK21uZ19yZXRjb2RlIG1uZ19pbml0X2cxX25pICAgICAobW5nX2RhdGFwIHBEYXRhKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX0cxX05JLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKHBEYXRhLT5mRGlzcGxheXJvdykKKyAgICBwRGF0YS0+ZlByb2Nlc3Nyb3cgPSAobW5nX2ZwdHIpbW5nX3Byb2Nlc3NfZzE7CisKKyAgaWYgKHBEYXRhLT5wU3RvcmVvYmopICAgICAgICAgICAgICAgIC8qIHN0b3JlIGluIG9iamVjdCB0b28gPyAqLworICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW1tZWRpYXRlIGRlbHRhID8gKi8KKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworICAgIGlmICgocERhdGEtPmJIYXNESERSKSAmJiAocERhdGEtPmJEZWx0YWltbWVkaWF0ZSkpCisgICAgICBwRGF0YS0+ZlN0b3Jlcm93ID0gKG1uZ19mcHRyKW1uZ19kZWx0YV9nMTsKKyAgICBlbHNlCisjZW5kaWYKKyAgICAgIHBEYXRhLT5mU3RvcmVyb3cgPSAobW5nX2ZwdHIpbW5nX3N0b3JlX2cxOworICB9CisKKyNpZmRlZiBGSUxURVIxOTIgICAgICAgICAgICAgICAgICAgICAgIC8qIGxldmVsaW5nICYgZGlmZmVyaW5nID8gKi8KKyAgaWYgKHBEYXRhLT5pRmlsdGVyID09IE1OR19GSUxURVJfRElGRkVSSU5HKQorICAgIHBEYXRhLT5mRGlmZmVycm93ICA9IChtbmdfZnB0ciltbmdfZGlmZmVyX2cxOworI2VuZGlmCisKKyAgcERhdGEtPmlQYXNzICAgICAgID0gLTE7CisgIHBEYXRhLT5pUm93ICAgICAgICA9IDA7CisgIHBEYXRhLT5pUm93aW5jICAgICA9IDE7CisgIHBEYXRhLT5pQ29sICAgICAgICA9IDA7CisgIHBEYXRhLT5pQ29saW5jICAgICA9IDE7CisgIHBEYXRhLT5pUm93c2FtcGxlcyA9IHBEYXRhLT5pRGF0YXdpZHRoOworICBwRGF0YS0+aVNhbXBsZW11bCAgPSAxOworICBwRGF0YS0+aVNhbXBsZW9mcyAgPSA3OworICBwRGF0YS0+aVNhbXBsZWRpdiAgPSAzOworICBwRGF0YS0+aVJvd3NpemUgICAgPSAocERhdGEtPmlSb3dzYW1wbGVzICsgNykgPj4gMzsKKyAgcERhdGEtPmlSb3dtYXggICAgID0gcERhdGEtPmlSb3dzaXplICsgcERhdGEtPmlQaXhlbG9mczsKKyAgcERhdGEtPmlGaWx0ZXJicHAgID0gMTsKKyAgcERhdGEtPmJJc1JHQkExNiAgID0gTU5HX0ZBTFNFOyAgICAgIC8qIGludGVybWVkaWF0ZSByb3cgaXMgOC1iaXQgZGVlcCAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfRzFfTkksIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIG1uZ19pbml0X3Jvd3Byb2MgKHBEYXRhKTsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX2luaXRfZzFfaSAgICAgIChtbmdfZGF0YXAgcERhdGEpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfRzFfSSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmIChwRGF0YS0+ZkRpc3BsYXlyb3cpCisgICAgcERhdGEtPmZQcm9jZXNzcm93ID0gKG1uZ19mcHRyKW1uZ19wcm9jZXNzX2cxOworCisgIGlmIChwRGF0YS0+cFN0b3Jlb2JqKSAgICAgICAgICAgICAgICAvKiBzdG9yZSBpbiBvYmplY3QgdG9vID8gKi8KKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGltbWVkaWF0ZSBkZWx0YSA/ICovCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKKyAgICBpZiAoKHBEYXRhLT5iSGFzREhEUikgJiYgKHBEYXRhLT5iRGVsdGFpbW1lZGlhdGUpKQorICAgICAgcERhdGEtPmZTdG9yZXJvdyA9IChtbmdfZnB0ciltbmdfZGVsdGFfZzE7CisgICAgZWxzZQorI2VuZGlmCisgICAgICBwRGF0YS0+ZlN0b3Jlcm93ID0gKG1uZ19mcHRyKW1uZ19zdG9yZV9nMTsKKyAgfQorCisjaWZkZWYgRklMVEVSMTkyICAgICAgICAgICAgICAgICAgICAgICAvKiBsZXZlbGluZyAmIGRpZmZlcmluZyA/ICovCisgIGlmIChwRGF0YS0+aUZpbHRlciA9PSBNTkdfRklMVEVSX0RJRkZFUklORykKKyAgICBwRGF0YS0+ZkRpZmZlcnJvdyAgPSAobW5nX2ZwdHIpbW5nX2RpZmZlcl9nMTsKKyNlbmRpZgorCisgIHBEYXRhLT5pUGFzcyAgICAgICA9IDA7ICAgICAgICAgICAgICAvKiBmcm9tIDAuLjY7IGlzIDEuLjcgaW4gc3BlY2lmaWNhdGlvbnMgKi8KKyAgcERhdGEtPmlSb3cgICAgICAgID0gaW50ZXJsYWNlX3JvdyAgICAgWzBdOworICBwRGF0YS0+aVJvd2luYyAgICAgPSBpbnRlcmxhY2Vfcm93c2tpcCBbMF07CisgIHBEYXRhLT5pQ29sICAgICAgICA9IGludGVybGFjZV9jb2wgICAgIFswXTsKKyAgcERhdGEtPmlDb2xpbmMgICAgID0gaW50ZXJsYWNlX2NvbHNraXAgWzBdOworICBwRGF0YS0+aVJvd3NhbXBsZXMgPSAocERhdGEtPmlEYXRhd2lkdGggKyBpbnRlcmxhY2Vfcm91bmRvZmYgWzBdKSA+PiBpbnRlcmxhY2VfZGl2aWRlciBbMF07CisgIHBEYXRhLT5pU2FtcGxlbXVsICA9IDE7CisgIHBEYXRhLT5pU2FtcGxlb2ZzICA9IDc7CisgIHBEYXRhLT5pU2FtcGxlZGl2ICA9IDM7CisgIHBEYXRhLT5pUm93c2l6ZSAgICA9ICgocERhdGEtPmlSb3dzYW1wbGVzICsgNykgPj4gMyk7CisgIHBEYXRhLT5pUm93bWF4ICAgICA9ICgocERhdGEtPmlEYXRhd2lkdGggKyA3KSA+PiAzKSArIHBEYXRhLT5pUGl4ZWxvZnM7CisgIHBEYXRhLT5pRmlsdGVyYnBwICA9IDE7CisgIHBEYXRhLT5iSXNSR0JBMTYgICA9IE1OR19GQUxTRTsgICAgICAvKiBpbnRlcm1lZGlhdGUgcm93IGlzIDgtYml0IGRlZXAgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX0cxX0ksIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIG1uZ19pbml0X3Jvd3Byb2MgKHBEYXRhKTsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX2luaXRfZzJfbmkgICAgIChtbmdfZGF0YXAgcERhdGEpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfRzJfTkksIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAocERhdGEtPmZEaXNwbGF5cm93KQorICAgIHBEYXRhLT5mUHJvY2Vzc3JvdyA9IChtbmdfZnB0ciltbmdfcHJvY2Vzc19nMjsKKworICBpZiAocERhdGEtPnBTdG9yZW9iaikgICAgICAgICAgICAgICAgLyogc3RvcmUgaW4gb2JqZWN0IHRvbyA/ICovCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbW1lZGlhdGUgZGVsdGEgPyAqLworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisgICAgaWYgKChwRGF0YS0+Ykhhc0RIRFIpICYmIChwRGF0YS0+YkRlbHRhaW1tZWRpYXRlKSkKKyAgICAgIHBEYXRhLT5mU3RvcmVyb3cgPSAobW5nX2ZwdHIpbW5nX2RlbHRhX2cyOworICAgIGVsc2UKKyNlbmRpZgorICAgICAgcERhdGEtPmZTdG9yZXJvdyA9IChtbmdfZnB0ciltbmdfc3RvcmVfZzI7CisgIH0KKworI2lmZGVmIEZJTFRFUjE5MiAgICAgICAgICAgICAgICAgICAgICAgLyogbGV2ZWxpbmcgJiBkaWZmZXJpbmcgPyAqLworICBpZiAocERhdGEtPmlGaWx0ZXIgPT0gTU5HX0ZJTFRFUl9ESUZGRVJJTkcpCisgICAgcERhdGEtPmZEaWZmZXJyb3cgID0gKG1uZ19mcHRyKW1uZ19kaWZmZXJfZzI7CisjZW5kaWYKKworICBwRGF0YS0+aVBhc3MgICAgICAgPSAtMTsKKyAgcERhdGEtPmlSb3cgICAgICAgID0gMDsKKyAgcERhdGEtPmlSb3dpbmMgICAgID0gMTsKKyAgcERhdGEtPmlDb2wgICAgICAgID0gMDsKKyAgcERhdGEtPmlDb2xpbmMgICAgID0gMTsKKyAgcERhdGEtPmlSb3dzYW1wbGVzID0gcERhdGEtPmlEYXRhd2lkdGg7CisgIHBEYXRhLT5pU2FtcGxlbXVsICA9IDE7CisgIHBEYXRhLT5pU2FtcGxlb2ZzICA9IDM7CisgIHBEYXRhLT5pU2FtcGxlZGl2ICA9IDI7CisgIHBEYXRhLT5pUm93c2l6ZSAgICA9IChwRGF0YS0+aVJvd3NhbXBsZXMgKyAzKSA+PiAyOworICBwRGF0YS0+aVJvd21heCAgICAgPSBwRGF0YS0+aVJvd3NpemUgKyBwRGF0YS0+aVBpeGVsb2ZzOworICBwRGF0YS0+aUZpbHRlcmJwcCAgPSAxOworICBwRGF0YS0+YklzUkdCQTE2ICAgPSBNTkdfRkFMU0U7ICAgICAgLyogaW50ZXJtZWRpYXRlIHJvdyBpcyA4LWJpdCBkZWVwICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSU5JVF9HMl9OSSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gbW5nX2luaXRfcm93cHJvYyAocERhdGEpOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfaW5pdF9nMl9pICAgICAgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSU5JVF9HMl9JLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKHBEYXRhLT5mRGlzcGxheXJvdykKKyAgICBwRGF0YS0+ZlByb2Nlc3Nyb3cgPSAobW5nX2ZwdHIpbW5nX3Byb2Nlc3NfZzI7CisKKyAgaWYgKHBEYXRhLT5wU3RvcmVvYmopICAgICAgICAgICAgICAgIC8qIHN0b3JlIGluIG9iamVjdCB0b28gPyAqLworICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW1tZWRpYXRlIGRlbHRhID8gKi8KKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworICAgIGlmICgocERhdGEtPmJIYXNESERSKSAmJiAocERhdGEtPmJEZWx0YWltbWVkaWF0ZSkpCisgICAgICBwRGF0YS0+ZlN0b3Jlcm93ID0gKG1uZ19mcHRyKW1uZ19kZWx0YV9nMjsKKyAgICBlbHNlCisjZW5kaWYKKyAgICAgIHBEYXRhLT5mU3RvcmVyb3cgPSAobW5nX2ZwdHIpbW5nX3N0b3JlX2cyOworICB9CisKKyNpZmRlZiBGSUxURVIxOTIgICAgICAgICAgICAgICAgICAgICAgIC8qIGxldmVsaW5nICYgZGlmZmVyaW5nID8gKi8KKyAgaWYgKHBEYXRhLT5pRmlsdGVyID09IE1OR19GSUxURVJfRElGRkVSSU5HKQorICAgIHBEYXRhLT5mRGlmZmVycm93ICA9IChtbmdfZnB0ciltbmdfZGlmZmVyX2cyOworI2VuZGlmCisKKyAgcERhdGEtPmlQYXNzICAgICAgID0gMDsgICAgICAgICAgICAgIC8qIGZyb20gMC4uNjsgaXMgMS4uNyBpbiBzcGVjaWZpY2F0aW9ucyAqLworICBwRGF0YS0+aVJvdyAgICAgICAgPSBpbnRlcmxhY2Vfcm93ICAgICBbMF07CisgIHBEYXRhLT5pUm93aW5jICAgICA9IGludGVybGFjZV9yb3dza2lwIFswXTsKKyAgcERhdGEtPmlDb2wgICAgICAgID0gaW50ZXJsYWNlX2NvbCAgICAgWzBdOworICBwRGF0YS0+aUNvbGluYyAgICAgPSBpbnRlcmxhY2VfY29sc2tpcCBbMF07CisgIHBEYXRhLT5pUm93c2FtcGxlcyA9IChwRGF0YS0+aURhdGF3aWR0aCArIGludGVybGFjZV9yb3VuZG9mZiBbMF0pID4+IGludGVybGFjZV9kaXZpZGVyIFswXTsKKyAgcERhdGEtPmlTYW1wbGVtdWwgID0gMTsKKyAgcERhdGEtPmlTYW1wbGVvZnMgID0gMzsKKyAgcERhdGEtPmlTYW1wbGVkaXYgID0gMjsKKyAgcERhdGEtPmlSb3dzaXplICAgID0gKChwRGF0YS0+aVJvd3NhbXBsZXMgKyAzKSA+PiAyKTsKKyAgcERhdGEtPmlSb3dtYXggICAgID0gKChwRGF0YS0+aURhdGF3aWR0aCArIDMpID4+IDIpICsgcERhdGEtPmlQaXhlbG9mczsKKyAgcERhdGEtPmlGaWx0ZXJicHAgID0gMTsKKyAgcERhdGEtPmJJc1JHQkExNiAgID0gTU5HX0ZBTFNFOyAgICAgIC8qIGludGVybWVkaWF0ZSByb3cgaXMgOC1iaXQgZGVlcCAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfRzJfSSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gbW5nX2luaXRfcm93cHJvYyAocERhdGEpOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfaW5pdF9nNF9uaSAgICAgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSU5JVF9HNF9OSSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmIChwRGF0YS0+ZkRpc3BsYXlyb3cpCisgICAgcERhdGEtPmZQcm9jZXNzcm93ID0gKG1uZ19mcHRyKW1uZ19wcm9jZXNzX2c0OworCisgIGlmIChwRGF0YS0+cFN0b3Jlb2JqKSAgICAgICAgICAgICAgICAvKiBzdG9yZSBpbiBvYmplY3QgdG9vID8gKi8KKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGltbWVkaWF0ZSBkZWx0YSA/ICovCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKKyAgICBpZiAoKHBEYXRhLT5iSGFzREhEUikgJiYgKHBEYXRhLT5iRGVsdGFpbW1lZGlhdGUpKQorICAgICAgcERhdGEtPmZTdG9yZXJvdyA9IChtbmdfZnB0ciltbmdfZGVsdGFfZzQ7CisgICAgZWxzZQorI2VuZGlmCisgICAgICBwRGF0YS0+ZlN0b3Jlcm93ID0gKG1uZ19mcHRyKW1uZ19zdG9yZV9nNDsKKyAgfQorCisjaWZkZWYgRklMVEVSMTkyICAgICAgICAgICAgICAgICAgICAgICAvKiBsZXZlbGluZyAmIGRpZmZlcmluZyA/ICovCisgIGlmIChwRGF0YS0+aUZpbHRlciA9PSBNTkdfRklMVEVSX0RJRkZFUklORykKKyAgICBwRGF0YS0+ZkRpZmZlcnJvdyAgPSAobW5nX2ZwdHIpbW5nX2RpZmZlcl9nNDsKKyNlbmRpZgorCisgIHBEYXRhLT5pUGFzcyAgICAgICA9IC0xOworICBwRGF0YS0+aVJvdyAgICAgICAgPSAwOworICBwRGF0YS0+aVJvd2luYyAgICAgPSAxOworICBwRGF0YS0+aUNvbCAgICAgICAgPSAwOworICBwRGF0YS0+aUNvbGluYyAgICAgPSAxOworICBwRGF0YS0+aVJvd3NhbXBsZXMgPSBwRGF0YS0+aURhdGF3aWR0aDsKKyAgcERhdGEtPmlTYW1wbGVtdWwgID0gMTsKKyAgcERhdGEtPmlTYW1wbGVvZnMgID0gMTsKKyAgcERhdGEtPmlTYW1wbGVkaXYgID0gMTsKKyAgcERhdGEtPmlSb3dzaXplICAgID0gKHBEYXRhLT5pUm93c2FtcGxlcyArIDEpID4+IDE7CisgIHBEYXRhLT5pUm93bWF4ICAgICA9IHBEYXRhLT5pUm93c2l6ZSArIHBEYXRhLT5pUGl4ZWxvZnM7CisgIHBEYXRhLT5pRmlsdGVyYnBwICA9IDE7CisgIHBEYXRhLT5iSXNSR0JBMTYgICA9IE1OR19GQUxTRTsgICAgICAvKiBpbnRlcm1lZGlhdGUgcm93IGlzIDgtYml0IGRlZXAgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX0c0X05JLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBtbmdfaW5pdF9yb3dwcm9jIChwRGF0YSk7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19pbml0X2c0X2kgICAgICAobW5nX2RhdGFwIHBEYXRhKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX0c0X0ksIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAocERhdGEtPmZEaXNwbGF5cm93KQorICAgIHBEYXRhLT5mUHJvY2Vzc3JvdyA9IChtbmdfZnB0ciltbmdfcHJvY2Vzc19nNDsKKworICBpZiAocERhdGEtPnBTdG9yZW9iaikgICAgICAgICAgICAgICAgLyogc3RvcmUgaW4gb2JqZWN0IHRvbyA/ICovCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbW1lZGlhdGUgZGVsdGEgPyAqLworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisgICAgaWYgKChwRGF0YS0+Ykhhc0RIRFIpICYmIChwRGF0YS0+YkRlbHRhaW1tZWRpYXRlKSkKKyAgICAgIHBEYXRhLT5mU3RvcmVyb3cgPSAobW5nX2ZwdHIpbW5nX2RlbHRhX2c0OworICAgIGVsc2UKKyNlbmRpZgorICAgICAgcERhdGEtPmZTdG9yZXJvdyA9IChtbmdfZnB0ciltbmdfc3RvcmVfZzQ7CisgIH0KKworI2lmZGVmIEZJTFRFUjE5MiAgICAgICAgICAgICAgICAgICAgICAgLyogbGV2ZWxpbmcgJiBkaWZmZXJpbmcgPyAqLworICBpZiAocERhdGEtPmlGaWx0ZXIgPT0gTU5HX0ZJTFRFUl9ESUZGRVJJTkcpCisgICAgcERhdGEtPmZEaWZmZXJyb3cgID0gKG1uZ19mcHRyKW1uZ19kaWZmZXJfZzQ7CisjZW5kaWYKKworICBwRGF0YS0+aVBhc3MgICAgICAgPSAwOyAgICAgICAgICAgICAgLyogZnJvbSAwLi42OyBpcyAxLi43IGluIHNwZWNpZmljYXRpb25zICovCisgIHBEYXRhLT5pUm93ICAgICAgICA9IGludGVybGFjZV9yb3cgICAgIFswXTsKKyAgcERhdGEtPmlSb3dpbmMgICAgID0gaW50ZXJsYWNlX3Jvd3NraXAgWzBdOworICBwRGF0YS0+aUNvbCAgICAgICAgPSBpbnRlcmxhY2VfY29sICAgICBbMF07CisgIHBEYXRhLT5pQ29saW5jICAgICA9IGludGVybGFjZV9jb2xza2lwIFswXTsKKyAgcERhdGEtPmlSb3dzYW1wbGVzID0gKHBEYXRhLT5pRGF0YXdpZHRoICsgaW50ZXJsYWNlX3JvdW5kb2ZmIFswXSkgPj4gaW50ZXJsYWNlX2RpdmlkZXIgWzBdOworICBwRGF0YS0+aVNhbXBsZW11bCAgPSAxOworICBwRGF0YS0+aVNhbXBsZW9mcyAgPSAxOworICBwRGF0YS0+aVNhbXBsZWRpdiAgPSAxOworICBwRGF0YS0+aVJvd3NpemUgICAgPSAoKHBEYXRhLT5pUm93c2FtcGxlcyArIDEpID4+IDEpOworICBwRGF0YS0+aVJvd21heCAgICAgPSAoKHBEYXRhLT5pRGF0YXdpZHRoICsgMSkgPj4gMSkgKyBwRGF0YS0+aVBpeGVsb2ZzOworICBwRGF0YS0+aUZpbHRlcmJwcCAgPSAxOworICBwRGF0YS0+YklzUkdCQTE2ICAgPSBNTkdfRkFMU0U7ICAgICAgLyogaW50ZXJtZWRpYXRlIHJvdyBpcyA4LWJpdCBkZWVwICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSU5JVF9HNF9JLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBtbmdfaW5pdF9yb3dwcm9jIChwRGF0YSk7Cit9CisjZW5kaWYgLyogTU5HX05PXzFfMl80QklUX1NVUFBPUlQgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX2luaXRfZzhfbmkgICAgIChtbmdfZGF0YXAgcERhdGEpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfRzhfTkksIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAocERhdGEtPmZEaXNwbGF5cm93KQorICAgIHBEYXRhLT5mUHJvY2Vzc3JvdyA9IChtbmdfZnB0ciltbmdfcHJvY2Vzc19nODsKKworICBpZiAocERhdGEtPnBTdG9yZW9iaikgICAgICAgICAgICAgICAgLyogc3RvcmUgaW4gb2JqZWN0IHRvbyA/ICovCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbW1lZGlhdGUgZGVsdGEgPyAqLworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisgICAgaWYgKChwRGF0YS0+Ykhhc0RIRFIpICYmIChwRGF0YS0+YkRlbHRhaW1tZWRpYXRlKSkKKyAgICAgIHBEYXRhLT5mU3RvcmVyb3cgPSAobW5nX2ZwdHIpbW5nX2RlbHRhX2c4OworICAgIGVsc2UKKyNlbmRpZgorICAgICAgcERhdGEtPmZTdG9yZXJvdyA9IChtbmdfZnB0ciltbmdfc3RvcmVfZzg7CisgIH0KKworI2lmZGVmIEZJTFRFUjE5MiAgICAgICAgICAgICAgICAgICAgICAgLyogbGV2ZWxpbmcgJiBkaWZmZXJpbmcgPyAqLworICBpZiAocERhdGEtPmlGaWx0ZXIgPT0gTU5HX0ZJTFRFUl9ESUZGRVJJTkcpCisgICAgcERhdGEtPmZEaWZmZXJyb3cgID0gKG1uZ19mcHRyKW1uZ19kaWZmZXJfZzg7CisjZW5kaWYKKworICBwRGF0YS0+aVBhc3MgICAgICAgPSAtMTsKKyAgcERhdGEtPmlSb3cgICAgICAgID0gMDsKKyAgcERhdGEtPmlSb3dpbmMgICAgID0gMTsKKyAgcERhdGEtPmlDb2wgICAgICAgID0gMDsKKyAgcERhdGEtPmlDb2xpbmMgICAgID0gMTsKKyAgcERhdGEtPmlSb3dzYW1wbGVzID0gcERhdGEtPmlEYXRhd2lkdGg7CisgIHBEYXRhLT5pU2FtcGxlbXVsICA9IDE7CisgIHBEYXRhLT5pU2FtcGxlb2ZzICA9IDA7CisgIHBEYXRhLT5pU2FtcGxlZGl2ICA9IDA7CisgIHBEYXRhLT5pUm93c2l6ZSAgICA9IHBEYXRhLT5pUm93c2FtcGxlczsKKyAgcERhdGEtPmlSb3dtYXggICAgID0gcERhdGEtPmlSb3dzaXplICsgcERhdGEtPmlQaXhlbG9mczsKKyAgcERhdGEtPmlGaWx0ZXJicHAgID0gMTsKKyAgcERhdGEtPmJJc1JHQkExNiAgID0gTU5HX0ZBTFNFOyAgICAgIC8qIGludGVybWVkaWF0ZSByb3cgaXMgOC1iaXQgZGVlcCAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfRzhfTkksIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIG1uZ19pbml0X3Jvd3Byb2MgKHBEYXRhKTsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX2luaXRfZzhfaSAgICAgIChtbmdfZGF0YXAgcERhdGEpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfRzhfSSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmIChwRGF0YS0+ZkRpc3BsYXlyb3cpCisgICAgcERhdGEtPmZQcm9jZXNzcm93ID0gKG1uZ19mcHRyKW1uZ19wcm9jZXNzX2c4OworCisgIGlmIChwRGF0YS0+cFN0b3Jlb2JqKSAgICAgICAgICAgICAgICAvKiBzdG9yZSBpbiBvYmplY3QgdG9vID8gKi8KKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGltbWVkaWF0ZSBkZWx0YSA/ICovCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKKyAgICBpZiAoKHBEYXRhLT5iSGFzREhEUikgJiYgKHBEYXRhLT5iRGVsdGFpbW1lZGlhdGUpKQorICAgICAgcERhdGEtPmZTdG9yZXJvdyA9IChtbmdfZnB0ciltbmdfZGVsdGFfZzg7CisgICAgZWxzZQorI2VuZGlmCisgICAgICBwRGF0YS0+ZlN0b3Jlcm93ID0gKG1uZ19mcHRyKW1uZ19zdG9yZV9nODsKKyAgfQorCisjaWZkZWYgRklMVEVSMTkyICAgICAgICAgICAgICAgICAgICAgICAvKiBsZXZlbGluZyAmIGRpZmZlcmluZyA/ICovCisgIGlmIChwRGF0YS0+aUZpbHRlciA9PSBNTkdfRklMVEVSX0RJRkZFUklORykKKyAgICBwRGF0YS0+ZkRpZmZlcnJvdyAgPSAobW5nX2ZwdHIpbW5nX2RpZmZlcl9nODsKKyNlbmRpZgorCisgIHBEYXRhLT5pUGFzcyAgICAgICA9IDA7ICAgICAgICAgICAgICAvKiBmcm9tIDAuLjY7IGlzIDEuLjcgaW4gc3BlY2lmaWNhdGlvbnMgKi8KKyAgcERhdGEtPmlSb3cgICAgICAgID0gaW50ZXJsYWNlX3JvdyAgICAgWzBdOworICBwRGF0YS0+aVJvd2luYyAgICAgPSBpbnRlcmxhY2Vfcm93c2tpcCBbMF07CisgIHBEYXRhLT5pQ29sICAgICAgICA9IGludGVybGFjZV9jb2wgICAgIFswXTsKKyAgcERhdGEtPmlDb2xpbmMgICAgID0gaW50ZXJsYWNlX2NvbHNraXAgWzBdOworICBwRGF0YS0+aVJvd3NhbXBsZXMgPSAocERhdGEtPmlEYXRhd2lkdGggKyBpbnRlcmxhY2Vfcm91bmRvZmYgWzBdKSA+PiBpbnRlcmxhY2VfZGl2aWRlciBbMF07CisgIHBEYXRhLT5pU2FtcGxlbXVsICA9IDE7CisgIHBEYXRhLT5pU2FtcGxlb2ZzICA9IDA7CisgIHBEYXRhLT5pU2FtcGxlZGl2ICA9IDA7CisgIHBEYXRhLT5pUm93c2l6ZSAgICA9IHBEYXRhLT5pUm93c2FtcGxlczsKKyAgcERhdGEtPmlSb3dtYXggICAgID0gcERhdGEtPmlEYXRhd2lkdGggKyBwRGF0YS0+aVBpeGVsb2ZzOworICBwRGF0YS0+aUZpbHRlcmJwcCAgPSAxOworICBwRGF0YS0+YklzUkdCQTE2ICAgPSBNTkdfRkFMU0U7ICAgICAgLyogaW50ZXJtZWRpYXRlIHJvdyBpcyA4LWJpdCBkZWVwICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSU5JVF9HOF9JLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBtbmdfaW5pdF9yb3dwcm9jIChwRGF0YSk7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKK21uZ19yZXRjb2RlIG1uZ19pbml0X2cxNl9uaSAgICAobW5nX2RhdGFwIHBEYXRhKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX0cxNl9OSSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmIChwRGF0YS0+ZkRpc3BsYXlyb3cpCisgICAgcERhdGEtPmZQcm9jZXNzcm93ID0gKG1uZ19mcHRyKW1uZ19wcm9jZXNzX2cxNjsKKworICBpZiAocERhdGEtPnBTdG9yZW9iaikgICAgICAgICAgICAgICAgLyogc3RvcmUgaW4gb2JqZWN0IHRvbyA/ICovCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbW1lZGlhdGUgZGVsdGEgPyAqLworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisgICAgaWYgKChwRGF0YS0+Ykhhc0RIRFIpICYmIChwRGF0YS0+YkRlbHRhaW1tZWRpYXRlKSkKKyAgICAgIHBEYXRhLT5mU3RvcmVyb3cgPSAobW5nX2ZwdHIpbW5nX2RlbHRhX2cxNjsKKyAgICBlbHNlCisjZW5kaWYKKyAgICAgIHBEYXRhLT5mU3RvcmVyb3cgPSAobW5nX2ZwdHIpbW5nX3N0b3JlX2cxNjsKKyAgfQorCisjaWZkZWYgRklMVEVSMTkyICAgICAgICAgICAgICAgICAgICAgICAvKiBsZXZlbGluZyAmIGRpZmZlcmluZyA/ICovCisgIGlmIChwRGF0YS0+aUZpbHRlciA9PSBNTkdfRklMVEVSX0RJRkZFUklORykKKyAgICBwRGF0YS0+ZkRpZmZlcnJvdyAgPSAobW5nX2ZwdHIpbW5nX2RpZmZlcl9nMTY7CisjZW5kaWYKKworICBwRGF0YS0+aVBhc3MgICAgICAgPSAtMTsKKyAgcERhdGEtPmlSb3cgICAgICAgID0gMDsKKyAgcERhdGEtPmlSb3dpbmMgICAgID0gMTsKKyAgcERhdGEtPmlDb2wgICAgICAgID0gMDsKKyAgcERhdGEtPmlDb2xpbmMgICAgID0gMTsKKyAgcERhdGEtPmlSb3dzYW1wbGVzID0gcERhdGEtPmlEYXRhd2lkdGg7CisgIHBEYXRhLT5pU2FtcGxlbXVsICA9IDI7CisgIHBEYXRhLT5pU2FtcGxlb2ZzICA9IDA7CisgIHBEYXRhLT5pU2FtcGxlZGl2ICA9IDA7CisgIHBEYXRhLT5pUm93c2l6ZSAgICA9IHBEYXRhLT5pUm93c2FtcGxlcyA8PCAxOworICBwRGF0YS0+aVJvd21heCAgICAgPSBwRGF0YS0+aVJvd3NpemUgKyBwRGF0YS0+aVBpeGVsb2ZzOworICBwRGF0YS0+aUZpbHRlcmJwcCAgPSAyOworICBwRGF0YS0+YklzUkdCQTE2ICAgPSBNTkdfVFJVRTsgICAgICAgLyogaW50ZXJtZWRpYXRlIHJvdyBpcyAxNi1iaXQgZGVlcCAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfRzE2X05JLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBtbmdfaW5pdF9yb3dwcm9jIChwRGF0YSk7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorbW5nX3JldGNvZGUgbW5nX2luaXRfZzE2X2kgICAgIChtbmdfZGF0YXAgcERhdGEpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfRzE2X0ksIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAocERhdGEtPmZEaXNwbGF5cm93KQorICAgIHBEYXRhLT5mUHJvY2Vzc3JvdyA9IChtbmdfZnB0ciltbmdfcHJvY2Vzc19nMTY7CisKKyAgaWYgKHBEYXRhLT5wU3RvcmVvYmopICAgICAgICAgICAgICAgIC8qIHN0b3JlIGluIG9iamVjdCB0b28gPyAqLworICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW1tZWRpYXRlIGRlbHRhID8gKi8KKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworICAgIGlmICgocERhdGEtPmJIYXNESERSKSAmJiAocERhdGEtPmJEZWx0YWltbWVkaWF0ZSkpCisgICAgICBwRGF0YS0+ZlN0b3Jlcm93ID0gKG1uZ19mcHRyKW1uZ19kZWx0YV9nMTY7CisgICAgZWxzZQorI2VuZGlmCisgICAgICBwRGF0YS0+ZlN0b3Jlcm93ID0gKG1uZ19mcHRyKW1uZ19zdG9yZV9nMTY7CisgIH0KKworI2lmZGVmIEZJTFRFUjE5MiAgICAgICAgICAgICAgICAgICAgICAgLyogbGV2ZWxpbmcgJiBkaWZmZXJpbmcgPyAqLworICBpZiAocERhdGEtPmlGaWx0ZXIgPT0gTU5HX0ZJTFRFUl9ESUZGRVJJTkcpCisgICAgcERhdGEtPmZEaWZmZXJyb3cgID0gKG1uZ19mcHRyKW1uZ19kaWZmZXJfZzE2OworI2VuZGlmCisKKyAgcERhdGEtPmlQYXNzICAgICAgID0gMDsgICAgICAgICAgICAgIC8qIGZyb20gMC4uNjsgaXMgMS4uNyBpbiBzcGVjaWZpY2F0aW9ucyAqLworICBwRGF0YS0+aVJvdyAgICAgICAgPSBpbnRlcmxhY2Vfcm93ICAgICBbMF07CisgIHBEYXRhLT5pUm93aW5jICAgICA9IGludGVybGFjZV9yb3dza2lwIFswXTsKKyAgcERhdGEtPmlDb2wgICAgICAgID0gaW50ZXJsYWNlX2NvbCAgICAgWzBdOworICBwRGF0YS0+aUNvbGluYyAgICAgPSBpbnRlcmxhY2VfY29sc2tpcCBbMF07CisgIHBEYXRhLT5pUm93c2FtcGxlcyA9IChwRGF0YS0+aURhdGF3aWR0aCArIGludGVybGFjZV9yb3VuZG9mZiBbMF0pID4+IGludGVybGFjZV9kaXZpZGVyIFswXTsKKyAgcERhdGEtPmlTYW1wbGVtdWwgID0gMjsKKyAgcERhdGEtPmlTYW1wbGVvZnMgID0gMDsKKyAgcERhdGEtPmlTYW1wbGVkaXYgID0gMDsKKyAgcERhdGEtPmlSb3dzaXplICAgID0gcERhdGEtPmlSb3dzYW1wbGVzIDw8IDE7CisgIHBEYXRhLT5pUm93bWF4ICAgICA9IChwRGF0YS0+aURhdGF3aWR0aCA8PCAxKSArIHBEYXRhLT5pUGl4ZWxvZnM7CisgIHBEYXRhLT5pRmlsdGVyYnBwICA9IDI7CisgIHBEYXRhLT5iSXNSR0JBMTYgICA9IE1OR19UUlVFOyAgICAgICAvKiBpbnRlcm1lZGlhdGUgcm93IGlzIDE2LWJpdCBkZWVwICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSU5JVF9HMTZfSSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gbW5nX2luaXRfcm93cHJvYyAocERhdGEpOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19pbml0X3JnYjhfbmkgICAobW5nX2RhdGFwIHBEYXRhKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX1JHQjhfTkksIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAocERhdGEtPmZEaXNwbGF5cm93KQorICAgIHBEYXRhLT5mUHJvY2Vzc3JvdyA9IChtbmdfZnB0ciltbmdfcHJvY2Vzc19yZ2I4OworCisgIGlmIChwRGF0YS0+cFN0b3Jlb2JqKSAgICAgICAgICAgICAgICAvKiBzdG9yZSBpbiBvYmplY3QgdG9vID8gKi8KKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGltbWVkaWF0ZSBkZWx0YSA/ICovCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKKyAgICBpZiAoKHBEYXRhLT5iSGFzREhEUikgJiYgKHBEYXRhLT5iRGVsdGFpbW1lZGlhdGUpKQorICAgICAgcERhdGEtPmZTdG9yZXJvdyA9IChtbmdfZnB0ciltbmdfZGVsdGFfcmdiODsKKyAgICBlbHNlCisjZW5kaWYKKyAgICAgIHBEYXRhLT5mU3RvcmVyb3cgPSAobW5nX2ZwdHIpbW5nX3N0b3JlX3JnYjg7CisgIH0KKworI2lmZGVmIEZJTFRFUjE5MiAgICAgICAgICAgICAgICAgICAgICAgLyogbGV2ZWxpbmcgJiBkaWZmZXJpbmcgPyAqLworICBpZiAocERhdGEtPmlGaWx0ZXIgPT0gTU5HX0ZJTFRFUl9ESUZGRVJJTkcpCisgICAgcERhdGEtPmZEaWZmZXJyb3cgID0gKG1uZ19mcHRyKW1uZ19kaWZmZXJfcmdiODsKKyNlbmRpZgorCisgIHBEYXRhLT5pUGFzcyAgICAgICA9IC0xOworICBwRGF0YS0+aVJvdyAgICAgICAgPSAwOworICBwRGF0YS0+aVJvd2luYyAgICAgPSAxOworICBwRGF0YS0+aUNvbCAgICAgICAgPSAwOworICBwRGF0YS0+aUNvbGluYyAgICAgPSAxOworICBwRGF0YS0+aVJvd3NhbXBsZXMgPSBwRGF0YS0+aURhdGF3aWR0aDsKKyAgcERhdGEtPmlTYW1wbGVtdWwgID0gMzsKKyAgcERhdGEtPmlTYW1wbGVvZnMgID0gMDsKKyAgcERhdGEtPmlTYW1wbGVkaXYgID0gMDsKKyAgcERhdGEtPmlSb3dzaXplICAgID0gcERhdGEtPmlSb3dzYW1wbGVzICogMzsKKyAgcERhdGEtPmlSb3dtYXggICAgID0gcERhdGEtPmlSb3dzaXplICsgcERhdGEtPmlQaXhlbG9mczsKKyAgcERhdGEtPmlGaWx0ZXJicHAgID0gMzsKKyAgcERhdGEtPmJJc1JHQkExNiAgID0gTU5HX0ZBTFNFOyAgICAgIC8qIGludGVybWVkaWF0ZSByb3cgaXMgOC1iaXQgZGVlcCAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfUkdCOF9OSSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gbW5nX2luaXRfcm93cHJvYyAocERhdGEpOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfaW5pdF9yZ2I4X2kgICAgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSU5JVF9SR0I4X0ksIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAocERhdGEtPmZEaXNwbGF5cm93KQorICAgIHBEYXRhLT5mUHJvY2Vzc3JvdyA9IChtbmdfZnB0ciltbmdfcHJvY2Vzc19yZ2I4OworCisgIGlmIChwRGF0YS0+cFN0b3Jlb2JqKSAgICAgICAgICAgICAgICAvKiBzdG9yZSBpbiBvYmplY3QgdG9vID8gKi8KKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGltbWVkaWF0ZSBkZWx0YSA/ICovCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKKyAgICBpZiAoKHBEYXRhLT5iSGFzREhEUikgJiYgKHBEYXRhLT5iRGVsdGFpbW1lZGlhdGUpKQorICAgICAgcERhdGEtPmZTdG9yZXJvdyA9IChtbmdfZnB0ciltbmdfZGVsdGFfcmdiODsKKyAgICBlbHNlCisjZW5kaWYKKyAgICAgIHBEYXRhLT5mU3RvcmVyb3cgPSAobW5nX2ZwdHIpbW5nX3N0b3JlX3JnYjg7CisgIH0KKworI2lmZGVmIEZJTFRFUjE5MiAgICAgICAgICAgICAgICAgICAgICAgLyogbGV2ZWxpbmcgJiBkaWZmZXJpbmcgPyAqLworICBpZiAocERhdGEtPmlGaWx0ZXIgPT0gTU5HX0ZJTFRFUl9ESUZGRVJJTkcpCisgICAgcERhdGEtPmZEaWZmZXJyb3cgID0gKG1uZ19mcHRyKW1uZ19kaWZmZXJfcmdiODsKKyNlbmRpZgorCisgIHBEYXRhLT5pUGFzcyAgICAgICA9IDA7ICAgICAgICAgICAgICAvKiBmcm9tIDAuLjY7IGlzIDEuLjcgaW4gc3BlY2lmaWNhdGlvbnMgKi8KKyAgcERhdGEtPmlSb3cgICAgICAgID0gaW50ZXJsYWNlX3JvdyAgICAgWzBdOworICBwRGF0YS0+aVJvd2luYyAgICAgPSBpbnRlcmxhY2Vfcm93c2tpcCBbMF07CisgIHBEYXRhLT5pQ29sICAgICAgICA9IGludGVybGFjZV9jb2wgICAgIFswXTsKKyAgcERhdGEtPmlDb2xpbmMgICAgID0gaW50ZXJsYWNlX2NvbHNraXAgWzBdOworICBwRGF0YS0+aVJvd3NhbXBsZXMgPSAocERhdGEtPmlEYXRhd2lkdGggKyBpbnRlcmxhY2Vfcm91bmRvZmYgWzBdKSA+PiBpbnRlcmxhY2VfZGl2aWRlciBbMF07CisgIHBEYXRhLT5pU2FtcGxlbXVsICA9IDM7CisgIHBEYXRhLT5pU2FtcGxlb2ZzICA9IDA7CisgIHBEYXRhLT5pU2FtcGxlZGl2ICA9IDA7CisgIHBEYXRhLT5pUm93c2l6ZSAgICA9IHBEYXRhLT5pUm93c2FtcGxlcyAqIDM7CisgIHBEYXRhLT5pUm93bWF4ICAgICA9IChwRGF0YS0+aURhdGF3aWR0aCAqIDMpICsgcERhdGEtPmlQaXhlbG9mczsKKyAgcERhdGEtPmlGaWx0ZXJicHAgID0gMzsKKyAgcERhdGEtPmJJc1JHQkExNiAgID0gTU5HX0ZBTFNFOyAgICAgIC8qIGludGVybWVkaWF0ZSByb3cgaXMgOC1iaXQgZGVlcCAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfUkdCOF9JLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBtbmdfaW5pdF9yb3dwcm9jIChwRGF0YSk7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKK21uZ19yZXRjb2RlIG1uZ19pbml0X3JnYjE2X25pICAobW5nX2RhdGFwIHBEYXRhKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX1JHQjE2X05JLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKHBEYXRhLT5mRGlzcGxheXJvdykKKyAgICBwRGF0YS0+ZlByb2Nlc3Nyb3cgPSAobW5nX2ZwdHIpbW5nX3Byb2Nlc3NfcmdiMTY7CisKKyAgaWYgKHBEYXRhLT5wU3RvcmVvYmopICAgICAgICAgICAgICAgIC8qIHN0b3JlIGluIG9iamVjdCB0b28gPyAqLworICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW1tZWRpYXRlIGRlbHRhID8gKi8KKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworICAgIGlmICgocERhdGEtPmJIYXNESERSKSAmJiAocERhdGEtPmJEZWx0YWltbWVkaWF0ZSkpCisgICAgICBwRGF0YS0+ZlN0b3Jlcm93ID0gKG1uZ19mcHRyKW1uZ19kZWx0YV9yZ2IxNjsKKyAgICBlbHNlCisjZW5kaWYKKyAgICAgIHBEYXRhLT5mU3RvcmVyb3cgPSAobW5nX2ZwdHIpbW5nX3N0b3JlX3JnYjE2OworICB9CisKKyNpZmRlZiBGSUxURVIxOTIgICAgICAgICAgICAgICAgICAgICAgIC8qIGxldmVsaW5nICYgZGlmZmVyaW5nID8gKi8KKyAgaWYgKHBEYXRhLT5pRmlsdGVyID09IE1OR19GSUxURVJfRElGRkVSSU5HKQorICAgIHBEYXRhLT5mRGlmZmVycm93ICA9IChtbmdfZnB0ciltbmdfZGlmZmVyX3JnYjE2OworI2VuZGlmCisKKyAgcERhdGEtPmlQYXNzICAgICAgID0gLTE7CisgIHBEYXRhLT5pUm93ICAgICAgICA9IDA7CisgIHBEYXRhLT5pUm93aW5jICAgICA9IDE7CisgIHBEYXRhLT5pQ29sICAgICAgICA9IDA7CisgIHBEYXRhLT5pQ29saW5jICAgICA9IDE7CisgIHBEYXRhLT5pUm93c2FtcGxlcyA9IHBEYXRhLT5pRGF0YXdpZHRoOworICBwRGF0YS0+aVNhbXBsZW11bCAgPSA2OworICBwRGF0YS0+aVNhbXBsZW9mcyAgPSAwOworICBwRGF0YS0+aVNhbXBsZWRpdiAgPSAwOworICBwRGF0YS0+aVJvd3NpemUgICAgPSBwRGF0YS0+aVJvd3NhbXBsZXMgKiA2OworICBwRGF0YS0+aVJvd21heCAgICAgPSBwRGF0YS0+aVJvd3NpemUgKyBwRGF0YS0+aVBpeGVsb2ZzOworICBwRGF0YS0+aUZpbHRlcmJwcCAgPSA2OworICBwRGF0YS0+YklzUkdCQTE2ICAgPSBNTkdfVFJVRTsgICAgICAgLyogaW50ZXJtZWRpYXRlIHJvdyBpcyAxNi1iaXQgZGVlcCAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfUkdCMTZfTkksIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIG1uZ19pbml0X3Jvd3Byb2MgKHBEYXRhKTsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCittbmdfcmV0Y29kZSBtbmdfaW5pdF9yZ2IxNl9pICAgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSU5JVF9SR0IxNl9JLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKHBEYXRhLT5mRGlzcGxheXJvdykKKyAgICBwRGF0YS0+ZlByb2Nlc3Nyb3cgPSAobW5nX2ZwdHIpbW5nX3Byb2Nlc3NfcmdiMTY7CisKKyAgaWYgKHBEYXRhLT5wU3RvcmVvYmopICAgICAgICAgICAgICAgIC8qIHN0b3JlIGluIG9iamVjdCB0b28gPyAqLworICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW1tZWRpYXRlIGRlbHRhID8gKi8KKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworICAgIGlmICgocERhdGEtPmJIYXNESERSKSAmJiAocERhdGEtPmJEZWx0YWltbWVkaWF0ZSkpCisgICAgICBwRGF0YS0+ZlN0b3Jlcm93ID0gKG1uZ19mcHRyKW1uZ19kZWx0YV9yZ2IxNjsKKyAgICBlbHNlCisjZW5kaWYKKyAgICAgIHBEYXRhLT5mU3RvcmVyb3cgPSAobW5nX2ZwdHIpbW5nX3N0b3JlX3JnYjE2OworICB9CisKKyNpZmRlZiBGSUxURVIxOTIgICAgICAgICAgICAgICAgICAgICAgIC8qIGxldmVsaW5nICYgZGlmZmVyaW5nID8gKi8KKyAgaWYgKHBEYXRhLT5pRmlsdGVyID09IE1OR19GSUxURVJfRElGRkVSSU5HKQorICAgIHBEYXRhLT5mRGlmZmVycm93ICA9IChtbmdfZnB0ciltbmdfZGlmZmVyX3JnYjE2OworI2VuZGlmCisKKyAgcERhdGEtPmlQYXNzICAgICAgID0gMDsgICAgICAgICAgICAgIC8qIGZyb20gMC4uNjsgaXMgMS4uNyBpbiBzcGVjaWZpY2F0aW9ucyAqLworICBwRGF0YS0+aVJvdyAgICAgICAgPSBpbnRlcmxhY2Vfcm93ICAgICBbMF07CisgIHBEYXRhLT5pUm93aW5jICAgICA9IGludGVybGFjZV9yb3dza2lwIFswXTsKKyAgcERhdGEtPmlDb2wgICAgICAgID0gaW50ZXJsYWNlX2NvbCAgICAgWzBdOworICBwRGF0YS0+aUNvbGluYyAgICAgPSBpbnRlcmxhY2VfY29sc2tpcCBbMF07CisgIHBEYXRhLT5pUm93c2FtcGxlcyA9IChwRGF0YS0+aURhdGF3aWR0aCArIGludGVybGFjZV9yb3VuZG9mZiBbMF0pID4+IGludGVybGFjZV9kaXZpZGVyIFswXTsKKyAgcERhdGEtPmlTYW1wbGVtdWwgID0gNjsKKyAgcERhdGEtPmlTYW1wbGVvZnMgID0gMDsKKyAgcERhdGEtPmlTYW1wbGVkaXYgID0gMDsKKyAgcERhdGEtPmlSb3dzaXplICAgID0gcERhdGEtPmlSb3dzYW1wbGVzICogNjsKKyAgcERhdGEtPmlSb3dtYXggICAgID0gKHBEYXRhLT5pRGF0YXdpZHRoICogNikgKyBwRGF0YS0+aVBpeGVsb2ZzOworICBwRGF0YS0+aUZpbHRlcmJwcCAgPSA2OworICBwRGF0YS0+YklzUkdCQTE2ICAgPSBNTkdfVFJVRTsgICAgICAgLyogaW50ZXJtZWRpYXRlIHJvdyBpcyAxNi1iaXQgZGVlcCAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfUkdCMTZfSSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gbW5nX2luaXRfcm93cHJvYyAocERhdGEpOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PXzFfMl80QklUX1NVUFBPUlQKK21uZ19yZXRjb2RlIG1uZ19pbml0X2lkeDFfbmkgICAobW5nX2RhdGFwIHBEYXRhKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX0lEWDFfTkksIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAocERhdGEtPmZEaXNwbGF5cm93KQorICAgIHBEYXRhLT5mUHJvY2Vzc3JvdyA9IChtbmdfZnB0ciltbmdfcHJvY2Vzc19pZHgxOworCisgIGlmIChwRGF0YS0+cFN0b3Jlb2JqKSAgICAgICAgICAgICAgICAvKiBzdG9yZSBpbiBvYmplY3QgdG9vID8gKi8KKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGltbWVkaWF0ZSBkZWx0YSA/ICovCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKKyAgICBpZiAoKHBEYXRhLT5iSGFzREhEUikgJiYgKHBEYXRhLT5iRGVsdGFpbW1lZGlhdGUpKQorICAgICAgcERhdGEtPmZTdG9yZXJvdyA9IChtbmdfZnB0ciltbmdfZGVsdGFfaWR4MTsKKyAgICBlbHNlCisjZW5kaWYKKyAgICAgIHBEYXRhLT5mU3RvcmVyb3cgPSAobW5nX2ZwdHIpbW5nX3N0b3JlX2lkeDE7CisgIH0KKworI2lmZGVmIEZJTFRFUjE5MiAgICAgICAgICAgICAgICAgICAgICAgLyogbGV2ZWxpbmcgJiBkaWZmZXJpbmcgPyAqLworICBpZiAocERhdGEtPmlGaWx0ZXIgPT0gTU5HX0ZJTFRFUl9ESUZGRVJJTkcpCisgICAgcERhdGEtPmZEaWZmZXJyb3cgID0gKG1uZ19mcHRyKW1uZ19kaWZmZXJfaWR4MTsKKyNlbmRpZgorCisgIHBEYXRhLT5pUGFzcyAgICAgICA9IC0xOworICBwRGF0YS0+aVJvdyAgICAgICAgPSAwOworICBwRGF0YS0+aVJvd2luYyAgICAgPSAxOworICBwRGF0YS0+aUNvbCAgICAgICAgPSAwOworICBwRGF0YS0+aUNvbGluYyAgICAgPSAxOworICBwRGF0YS0+aVJvd3NhbXBsZXMgPSBwRGF0YS0+aURhdGF3aWR0aDsKKyAgcERhdGEtPmlTYW1wbGVtdWwgID0gMTsKKyAgcERhdGEtPmlTYW1wbGVvZnMgID0gNzsKKyAgcERhdGEtPmlTYW1wbGVkaXYgID0gMzsKKyAgcERhdGEtPmlSb3dzaXplICAgID0gKHBEYXRhLT5pUm93c2FtcGxlcyArIDcpID4+IDM7CisgIHBEYXRhLT5pUm93bWF4ICAgICA9IHBEYXRhLT5pUm93c2l6ZSArIHBEYXRhLT5pUGl4ZWxvZnM7CisgIHBEYXRhLT5pRmlsdGVyYnBwICA9IDE7CisgIHBEYXRhLT5iSXNSR0JBMTYgICA9IE1OR19GQUxTRTsgICAgICAvKiBpbnRlcm1lZGlhdGUgcm93IGlzIDgtYml0IGRlZXAgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX0lEWDFfTkksIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIG1uZ19pbml0X3Jvd3Byb2MgKHBEYXRhKTsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX2luaXRfaWR4MV9pICAgIChtbmdfZGF0YXAgcERhdGEpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfSURYMV9JLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKHBEYXRhLT5mRGlzcGxheXJvdykKKyAgICBwRGF0YS0+ZlByb2Nlc3Nyb3cgPSAobW5nX2ZwdHIpbW5nX3Byb2Nlc3NfaWR4MTsKKworICBpZiAocERhdGEtPnBTdG9yZW9iaikgICAgICAgICAgICAgICAgLyogc3RvcmUgaW4gb2JqZWN0IHRvbyA/ICovCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbW1lZGlhdGUgZGVsdGEgPyAqLworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisgICAgaWYgKChwRGF0YS0+Ykhhc0RIRFIpICYmIChwRGF0YS0+YkRlbHRhaW1tZWRpYXRlKSkKKyAgICAgIHBEYXRhLT5mU3RvcmVyb3cgPSAobW5nX2ZwdHIpbW5nX2RlbHRhX2lkeDE7CisgICAgZWxzZQorI2VuZGlmCisgICAgICBwRGF0YS0+ZlN0b3Jlcm93ID0gKG1uZ19mcHRyKW1uZ19zdG9yZV9pZHgxOworICB9CisKKyNpZmRlZiBGSUxURVIxOTIgICAgICAgICAgICAgICAgICAgICAgIC8qIGxldmVsaW5nICYgZGlmZmVyaW5nID8gKi8KKyAgaWYgKHBEYXRhLT5pRmlsdGVyID09IE1OR19GSUxURVJfRElGRkVSSU5HKQorICAgIHBEYXRhLT5mRGlmZmVycm93ICA9IChtbmdfZnB0ciltbmdfZGlmZmVyX2lkeDE7CisjZW5kaWYKKworICBwRGF0YS0+aVBhc3MgICAgICAgPSAwOyAgICAgICAgICAgICAgLyogZnJvbSAwLi42OyBpcyAxLi43IGluIHNwZWNpZmljYXRpb25zICovCisgIHBEYXRhLT5pUm93ICAgICAgICA9IGludGVybGFjZV9yb3cgICAgIFswXTsKKyAgcERhdGEtPmlSb3dpbmMgICAgID0gaW50ZXJsYWNlX3Jvd3NraXAgWzBdOworICBwRGF0YS0+aUNvbCAgICAgICAgPSBpbnRlcmxhY2VfY29sICAgICBbMF07CisgIHBEYXRhLT5pQ29saW5jICAgICA9IGludGVybGFjZV9jb2xza2lwIFswXTsKKyAgcERhdGEtPmlSb3dzYW1wbGVzID0gKHBEYXRhLT5pRGF0YXdpZHRoICsgaW50ZXJsYWNlX3JvdW5kb2ZmIFswXSkgPj4gaW50ZXJsYWNlX2RpdmlkZXIgWzBdOworICBwRGF0YS0+aVNhbXBsZW11bCAgPSAxOworICBwRGF0YS0+aVNhbXBsZW9mcyAgPSA3OworICBwRGF0YS0+aVNhbXBsZWRpdiAgPSAzOworICBwRGF0YS0+aVJvd3NpemUgICAgPSAocERhdGEtPmlSb3dzYW1wbGVzICsgNykgPj4gMzsKKyAgcERhdGEtPmlSb3dtYXggICAgID0gKChwRGF0YS0+aURhdGF3aWR0aCArIDcpID4+IDMpICsgcERhdGEtPmlQaXhlbG9mczsKKyAgcERhdGEtPmlGaWx0ZXJicHAgID0gMTsKKyAgcERhdGEtPmJJc1JHQkExNiAgID0gTU5HX0ZBTFNFOyAgICAgIC8qIGludGVybWVkaWF0ZSByb3cgaXMgOC1iaXQgZGVlcCAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfSURYMV9JLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBtbmdfaW5pdF9yb3dwcm9jIChwRGF0YSk7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19pbml0X2lkeDJfbmkgICAobW5nX2RhdGFwIHBEYXRhKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX0lEWDJfTkksIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAocERhdGEtPmZEaXNwbGF5cm93KQorICAgIHBEYXRhLT5mUHJvY2Vzc3JvdyA9IChtbmdfZnB0ciltbmdfcHJvY2Vzc19pZHgyOworCisgIGlmIChwRGF0YS0+cFN0b3Jlb2JqKSAgICAgICAgICAgICAgICAvKiBzdG9yZSBpbiBvYmplY3QgdG9vID8gKi8KKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGltbWVkaWF0ZSBkZWx0YSA/ICovCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKKyAgICBpZiAoKHBEYXRhLT5iSGFzREhEUikgJiYgKHBEYXRhLT5iRGVsdGFpbW1lZGlhdGUpKQorICAgICAgcERhdGEtPmZTdG9yZXJvdyA9IChtbmdfZnB0ciltbmdfZGVsdGFfaWR4MjsKKyAgICBlbHNlCisjZW5kaWYKKyAgICAgIHBEYXRhLT5mU3RvcmVyb3cgPSAobW5nX2ZwdHIpbW5nX3N0b3JlX2lkeDI7CisgIH0KKworI2lmZGVmIEZJTFRFUjE5MiAgICAgICAgICAgICAgICAgICAgICAgLyogbGV2ZWxpbmcgJiBkaWZmZXJpbmcgPyAqLworICBpZiAocERhdGEtPmlGaWx0ZXIgPT0gTU5HX0ZJTFRFUl9ESUZGRVJJTkcpCisgICAgcERhdGEtPmZEaWZmZXJyb3cgID0gKG1uZ19mcHRyKW1uZ19kaWZmZXJfaWR4MjsKKyNlbmRpZgorCisgIHBEYXRhLT5pUGFzcyAgICAgICA9IC0xOworICBwRGF0YS0+aVJvdyAgICAgICAgPSAwOworICBwRGF0YS0+aVJvd2luYyAgICAgPSAxOworICBwRGF0YS0+aUNvbCAgICAgICAgPSAwOworICBwRGF0YS0+aUNvbGluYyAgICAgPSAxOworICBwRGF0YS0+aVJvd3NhbXBsZXMgPSBwRGF0YS0+aURhdGF3aWR0aDsKKyAgcERhdGEtPmlTYW1wbGVtdWwgID0gMTsKKyAgcERhdGEtPmlTYW1wbGVvZnMgID0gMzsKKyAgcERhdGEtPmlTYW1wbGVkaXYgID0gMjsKKyAgcERhdGEtPmlSb3dzaXplICAgID0gKHBEYXRhLT5pUm93c2FtcGxlcyArIDMpID4+IDI7CisgIHBEYXRhLT5pUm93bWF4ICAgICA9IHBEYXRhLT5pUm93c2l6ZSArIHBEYXRhLT5pUGl4ZWxvZnM7CisgIHBEYXRhLT5pRmlsdGVyYnBwICA9IDE7CisgIHBEYXRhLT5iSXNSR0JBMTYgICA9IE1OR19GQUxTRTsgICAgICAvKiBpbnRlcm1lZGlhdGUgcm93IGlzIDgtYml0IGRlZXAgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX0lEWDJfTkksIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIG1uZ19pbml0X3Jvd3Byb2MgKHBEYXRhKTsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX2luaXRfaWR4Ml9pICAgIChtbmdfZGF0YXAgcERhdGEpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfSURYMl9JLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKHBEYXRhLT5mRGlzcGxheXJvdykKKyAgICBwRGF0YS0+ZlByb2Nlc3Nyb3cgPSAobW5nX2ZwdHIpbW5nX3Byb2Nlc3NfaWR4MjsKKworICBpZiAocERhdGEtPnBTdG9yZW9iaikgICAgICAgICAgICAgICAgLyogc3RvcmUgaW4gb2JqZWN0IHRvbyA/ICovCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbW1lZGlhdGUgZGVsdGEgPyAqLworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisgICAgaWYgKChwRGF0YS0+Ykhhc0RIRFIpICYmIChwRGF0YS0+YkRlbHRhaW1tZWRpYXRlKSkKKyAgICAgIHBEYXRhLT5mU3RvcmVyb3cgPSAobW5nX2ZwdHIpbW5nX2RlbHRhX2lkeDI7CisgICAgZWxzZQorI2VuZGlmCisgICAgICBwRGF0YS0+ZlN0b3Jlcm93ID0gKG1uZ19mcHRyKW1uZ19zdG9yZV9pZHgyOworICB9CisKKyNpZmRlZiBGSUxURVIxOTIgICAgICAgICAgICAgICAgICAgICAgIC8qIGxldmVsaW5nICYgZGlmZmVyaW5nID8gKi8KKyAgaWYgKHBEYXRhLT5pRmlsdGVyID09IE1OR19GSUxURVJfRElGRkVSSU5HKQorICAgIHBEYXRhLT5mRGlmZmVycm93ICA9IChtbmdfZnB0ciltbmdfZGlmZmVyX2lkeDI7CisjZW5kaWYKKworICBwRGF0YS0+aVBhc3MgICAgICAgPSAwOyAgICAgICAgICAgICAgLyogZnJvbSAwLi42OyBpcyAxLi43IGluIHNwZWNpZmljYXRpb25zICovCisgIHBEYXRhLT5pUm93ICAgICAgICA9IGludGVybGFjZV9yb3cgICAgIFswXTsKKyAgcERhdGEtPmlSb3dpbmMgICAgID0gaW50ZXJsYWNlX3Jvd3NraXAgWzBdOworICBwRGF0YS0+aUNvbCAgICAgICAgPSBpbnRlcmxhY2VfY29sICAgICBbMF07CisgIHBEYXRhLT5pQ29saW5jICAgICA9IGludGVybGFjZV9jb2xza2lwIFswXTsKKyAgcERhdGEtPmlSb3dzYW1wbGVzID0gKHBEYXRhLT5pRGF0YXdpZHRoICsgaW50ZXJsYWNlX3JvdW5kb2ZmIFswXSkgPj4gaW50ZXJsYWNlX2RpdmlkZXIgWzBdOworICBwRGF0YS0+aVNhbXBsZW11bCAgPSAxOworICBwRGF0YS0+aVNhbXBsZW9mcyAgPSAzOworICBwRGF0YS0+aVNhbXBsZWRpdiAgPSAyOworICBwRGF0YS0+aVJvd3NpemUgICAgPSAocERhdGEtPmlSb3dzYW1wbGVzICsgMykgPj4gMjsKKyAgcERhdGEtPmlSb3dtYXggICAgID0gKChwRGF0YS0+aURhdGF3aWR0aCArIDMpID4+IDIpICsgcERhdGEtPmlQaXhlbG9mczsKKyAgcERhdGEtPmlGaWx0ZXJicHAgID0gMTsKKyAgcERhdGEtPmJJc1JHQkExNiAgID0gTU5HX0ZBTFNFOyAgICAgIC8qIGludGVybWVkaWF0ZSByb3cgaXMgOC1iaXQgZGVlcCAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfSURYMl9JLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBtbmdfaW5pdF9yb3dwcm9jIChwRGF0YSk7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19pbml0X2lkeDRfbmkgICAobW5nX2RhdGFwIHBEYXRhKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX0lEWDRfTkksIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAocERhdGEtPmZEaXNwbGF5cm93KQorICAgIHBEYXRhLT5mUHJvY2Vzc3JvdyA9IChtbmdfZnB0ciltbmdfcHJvY2Vzc19pZHg0OworCisgIGlmIChwRGF0YS0+cFN0b3Jlb2JqKSAgICAgICAgICAgICAgICAvKiBzdG9yZSBpbiBvYmplY3QgdG9vID8gKi8KKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGltbWVkaWF0ZSBkZWx0YSA/ICovCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKKyAgICBpZiAoKHBEYXRhLT5iSGFzREhEUikgJiYgKHBEYXRhLT5iRGVsdGFpbW1lZGlhdGUpKQorICAgICAgcERhdGEtPmZTdG9yZXJvdyA9IChtbmdfZnB0ciltbmdfZGVsdGFfaWR4NDsKKyAgICBlbHNlCisjZW5kaWYKKyAgICAgIHBEYXRhLT5mU3RvcmVyb3cgPSAobW5nX2ZwdHIpbW5nX3N0b3JlX2lkeDQ7CisgIH0KKworI2lmZGVmIEZJTFRFUjE5MiAgICAgICAgICAgICAgICAgICAgICAgLyogbGV2ZWxpbmcgJiBkaWZmZXJpbmcgPyAqLworICBpZiAocERhdGEtPmlGaWx0ZXIgPT0gTU5HX0ZJTFRFUl9ESUZGRVJJTkcpCisgICAgcERhdGEtPmZEaWZmZXJyb3cgID0gKG1uZ19mcHRyKW1uZ19kaWZmZXJfaWR4NDsKKyNlbmRpZgorCisgIHBEYXRhLT5pUGFzcyAgICAgICA9IC0xOworICBwRGF0YS0+aVJvdyAgICAgICAgPSAwOworICBwRGF0YS0+aVJvd2luYyAgICAgPSAxOworICBwRGF0YS0+aUNvbCAgICAgICAgPSAwOworICBwRGF0YS0+aUNvbGluYyAgICAgPSAxOworICBwRGF0YS0+aVJvd3NhbXBsZXMgPSBwRGF0YS0+aURhdGF3aWR0aDsKKyAgcERhdGEtPmlTYW1wbGVtdWwgID0gMTsKKyAgcERhdGEtPmlTYW1wbGVvZnMgID0gMTsKKyAgcERhdGEtPmlTYW1wbGVkaXYgID0gMTsKKyAgcERhdGEtPmlSb3dzaXplICAgID0gKHBEYXRhLT5pUm93c2FtcGxlcyArIDEpID4+IDE7CisgIHBEYXRhLT5pUm93bWF4ICAgICA9IHBEYXRhLT5pUm93c2l6ZSArIHBEYXRhLT5pUGl4ZWxvZnM7CisgIHBEYXRhLT5pRmlsdGVyYnBwICA9IDE7CisgIHBEYXRhLT5iSXNSR0JBMTYgICA9IE1OR19GQUxTRTsgICAgICAvKiBpbnRlcm1lZGlhdGUgcm93IGlzIDgtYml0IGRlZXAgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX0lEWDRfTkksIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIG1uZ19pbml0X3Jvd3Byb2MgKHBEYXRhKTsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX2luaXRfaWR4NF9pICAgIChtbmdfZGF0YXAgcERhdGEpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfSURYNF9JLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKHBEYXRhLT5mRGlzcGxheXJvdykKKyAgICBwRGF0YS0+ZlByb2Nlc3Nyb3cgPSAobW5nX2ZwdHIpbW5nX3Byb2Nlc3NfaWR4NDsKKworICBpZiAocERhdGEtPnBTdG9yZW9iaikgICAgICAgICAgICAgICAgLyogc3RvcmUgaW4gb2JqZWN0IHRvbyA/ICovCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbW1lZGlhdGUgZGVsdGEgPyAqLworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisgICAgaWYgKChwRGF0YS0+Ykhhc0RIRFIpICYmIChwRGF0YS0+YkRlbHRhaW1tZWRpYXRlKSkKKyAgICAgIHBEYXRhLT5mU3RvcmVyb3cgPSAobW5nX2ZwdHIpbW5nX2RlbHRhX2lkeDQ7CisgICAgZWxzZQorI2VuZGlmCisgICAgICBwRGF0YS0+ZlN0b3Jlcm93ID0gKG1uZ19mcHRyKW1uZ19zdG9yZV9pZHg0OworICB9CisKKyNpZmRlZiBGSUxURVIxOTIgICAgICAgICAgICAgICAgICAgICAgIC8qIGxldmVsaW5nICYgZGlmZmVyaW5nID8gKi8KKyAgaWYgKHBEYXRhLT5pRmlsdGVyID09IE1OR19GSUxURVJfRElGRkVSSU5HKQorICAgIHBEYXRhLT5mRGlmZmVycm93ICA9IChtbmdfZnB0ciltbmdfZGlmZmVyX2lkeDQ7CisjZW5kaWYKKworICBwRGF0YS0+aVBhc3MgICAgICAgPSAwOyAgICAgICAgICAgICAgLyogZnJvbSAwLi42OyBpcyAxLi43IGluIHNwZWNpZmljYXRpb25zICovCisgIHBEYXRhLT5pUm93ICAgICAgICA9IGludGVybGFjZV9yb3cgICAgIFswXTsKKyAgcERhdGEtPmlSb3dpbmMgICAgID0gaW50ZXJsYWNlX3Jvd3NraXAgWzBdOworICBwRGF0YS0+aUNvbCAgICAgICAgPSBpbnRlcmxhY2VfY29sICAgICBbMF07CisgIHBEYXRhLT5pQ29saW5jICAgICA9IGludGVybGFjZV9jb2xza2lwIFswXTsKKyAgcERhdGEtPmlSb3dzYW1wbGVzID0gKHBEYXRhLT5pRGF0YXdpZHRoICsgaW50ZXJsYWNlX3JvdW5kb2ZmIFswXSkgPj4gaW50ZXJsYWNlX2RpdmlkZXIgWzBdOworICBwRGF0YS0+aVNhbXBsZW11bCAgPSAxOworICBwRGF0YS0+aVNhbXBsZW9mcyAgPSAxOworICBwRGF0YS0+aVNhbXBsZWRpdiAgPSAxOworICBwRGF0YS0+aVJvd3NpemUgICAgPSAocERhdGEtPmlSb3dzYW1wbGVzICsgMSkgPj4gMTsKKyAgcERhdGEtPmlSb3dtYXggICAgID0gKChwRGF0YS0+aURhdGF3aWR0aCArIDEpID4+IDEpICsgcERhdGEtPmlQaXhlbG9mczsKKyAgcERhdGEtPmlGaWx0ZXJicHAgID0gMTsKKyAgcERhdGEtPmJJc1JHQkExNiAgID0gTU5HX0ZBTFNFOyAgICAgIC8qIGludGVybWVkaWF0ZSByb3cgaXMgOC1iaXQgZGVlcCAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfSURYNF9JLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBtbmdfaW5pdF9yb3dwcm9jIChwRGF0YSk7Cit9CisjZW5kaWYgLyogTU5HX05PXzFfMl80QklUX1NVUFBPUlQgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX2luaXRfaWR4OF9uaSAgIChtbmdfZGF0YXAgcERhdGEpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfSURYOF9OSSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmIChwRGF0YS0+ZkRpc3BsYXlyb3cpCisgICAgcERhdGEtPmZQcm9jZXNzcm93ID0gKG1uZ19mcHRyKW1uZ19wcm9jZXNzX2lkeDg7CisKKyAgaWYgKHBEYXRhLT5wU3RvcmVvYmopICAgICAgICAgICAgICAgIC8qIHN0b3JlIGluIG9iamVjdCB0b28gPyAqLworICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW1tZWRpYXRlIGRlbHRhID8gKi8KKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworICAgIGlmICgocERhdGEtPmJIYXNESERSKSAmJiAocERhdGEtPmJEZWx0YWltbWVkaWF0ZSkpCisgICAgICBwRGF0YS0+ZlN0b3Jlcm93ID0gKG1uZ19mcHRyKW1uZ19kZWx0YV9pZHg4OworICAgIGVsc2UKKyNlbmRpZgorICAgICAgcERhdGEtPmZTdG9yZXJvdyA9IChtbmdfZnB0ciltbmdfc3RvcmVfaWR4ODsKKyAgfQorCisjaWZkZWYgRklMVEVSMTkyICAgICAgICAgICAgICAgICAgICAgICAvKiBsZXZlbGluZyAmIGRpZmZlcmluZyA/ICovCisgIGlmIChwRGF0YS0+aUZpbHRlciA9PSBNTkdfRklMVEVSX0RJRkZFUklORykKKyAgICBwRGF0YS0+ZkRpZmZlcnJvdyAgPSAobW5nX2ZwdHIpbW5nX2RpZmZlcl9pZHg4OworI2VuZGlmCisKKyAgcERhdGEtPmlQYXNzICAgICAgID0gLTE7CisgIHBEYXRhLT5pUm93ICAgICAgICA9IDA7CisgIHBEYXRhLT5pUm93aW5jICAgICA9IDE7CisgIHBEYXRhLT5pQ29sICAgICAgICA9IDA7CisgIHBEYXRhLT5pQ29saW5jICAgICA9IDE7CisgIHBEYXRhLT5pUm93c2FtcGxlcyA9IHBEYXRhLT5pRGF0YXdpZHRoOworICBwRGF0YS0+aVNhbXBsZW11bCAgPSAxOworICBwRGF0YS0+aVNhbXBsZW9mcyAgPSAwOworICBwRGF0YS0+aVNhbXBsZWRpdiAgPSAwOworICBwRGF0YS0+aVJvd3NpemUgICAgPSBwRGF0YS0+aVJvd3NhbXBsZXM7CisgIHBEYXRhLT5pUm93bWF4ICAgICA9IHBEYXRhLT5pUm93c2l6ZSArIHBEYXRhLT5pUGl4ZWxvZnM7CisgIHBEYXRhLT5pRmlsdGVyYnBwICA9IDE7CisgIHBEYXRhLT5iSXNSR0JBMTYgICA9IE1OR19GQUxTRTsgICAgICAvKiBpbnRlcm1lZGlhdGUgcm93IGlzIDgtYml0IGRlZXAgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX0lEWDhfTkksIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIG1uZ19pbml0X3Jvd3Byb2MgKHBEYXRhKTsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX2luaXRfaWR4OF9pICAgIChtbmdfZGF0YXAgcERhdGEpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfSURYOF9JLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKHBEYXRhLT5mRGlzcGxheXJvdykKKyAgICBwRGF0YS0+ZlByb2Nlc3Nyb3cgPSAobW5nX2ZwdHIpbW5nX3Byb2Nlc3NfaWR4ODsKKworICBpZiAocERhdGEtPnBTdG9yZW9iaikgICAgICAgICAgICAgICAgLyogc3RvcmUgaW4gb2JqZWN0IHRvbyA/ICovCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbW1lZGlhdGUgZGVsdGEgPyAqLworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisgICAgaWYgKChwRGF0YS0+Ykhhc0RIRFIpICYmIChwRGF0YS0+YkRlbHRhaW1tZWRpYXRlKSkKKyAgICAgIHBEYXRhLT5mU3RvcmVyb3cgPSAobW5nX2ZwdHIpbW5nX2RlbHRhX2lkeDg7CisgICAgZWxzZQorI2VuZGlmCisgICAgICBwRGF0YS0+ZlN0b3Jlcm93ID0gKG1uZ19mcHRyKW1uZ19zdG9yZV9pZHg4OworICB9CisKKyNpZmRlZiBGSUxURVIxOTIgICAgICAgICAgICAgICAgICAgICAgIC8qIGxldmVsaW5nICYgZGlmZmVyaW5nID8gKi8KKyAgaWYgKHBEYXRhLT5pRmlsdGVyID09IE1OR19GSUxURVJfRElGRkVSSU5HKQorICAgIHBEYXRhLT5mRGlmZmVycm93ICA9IChtbmdfZnB0ciltbmdfZGlmZmVyX2lkeDg7CisjZW5kaWYKKworICBwRGF0YS0+aVBhc3MgICAgICAgPSAwOyAgICAgICAgICAgICAgLyogZnJvbSAwLi42OyBpcyAxLi43IGluIHNwZWNpZmljYXRpb25zICovCisgIHBEYXRhLT5pUm93ICAgICAgICA9IGludGVybGFjZV9yb3cgICAgIFswXTsKKyAgcERhdGEtPmlSb3dpbmMgICAgID0gaW50ZXJsYWNlX3Jvd3NraXAgWzBdOworICBwRGF0YS0+aUNvbCAgICAgICAgPSBpbnRlcmxhY2VfY29sICAgICBbMF07CisgIHBEYXRhLT5pQ29saW5jICAgICA9IGludGVybGFjZV9jb2xza2lwIFswXTsKKyAgcERhdGEtPmlSb3dzYW1wbGVzID0gKHBEYXRhLT5pRGF0YXdpZHRoICsgaW50ZXJsYWNlX3JvdW5kb2ZmIFswXSkgPj4gaW50ZXJsYWNlX2RpdmlkZXIgWzBdOworICBwRGF0YS0+aVNhbXBsZW11bCAgPSAxOworICBwRGF0YS0+aVNhbXBsZW9mcyAgPSAwOworICBwRGF0YS0+aVNhbXBsZWRpdiAgPSAwOworICBwRGF0YS0+aVJvd3NpemUgICAgPSBwRGF0YS0+aVJvd3NhbXBsZXM7CisgIHBEYXRhLT5pUm93bWF4ICAgICA9IHBEYXRhLT5pRGF0YXdpZHRoICsgcERhdGEtPmlQaXhlbG9mczsKKyAgcERhdGEtPmlGaWx0ZXJicHAgID0gMTsKKyAgcERhdGEtPmJJc1JHQkExNiAgID0gTU5HX0ZBTFNFOyAgICAgIC8qIGludGVybWVkaWF0ZSByb3cgaXMgOC1iaXQgZGVlcCAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfSURYOF9JLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBtbmdfaW5pdF9yb3dwcm9jIChwRGF0YSk7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19pbml0X2dhOF9uaSAgICAobW5nX2RhdGFwIHBEYXRhKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX0dBOF9OSSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmIChwRGF0YS0+ZkRpc3BsYXlyb3cpCisgICAgcERhdGEtPmZQcm9jZXNzcm93ID0gKG1uZ19mcHRyKW1uZ19wcm9jZXNzX2dhODsKKworICBpZiAocERhdGEtPnBTdG9yZW9iaikgICAgICAgICAgICAgICAgLyogc3RvcmUgaW4gb2JqZWN0IHRvbyA/ICovCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbW1lZGlhdGUgZGVsdGEgPyAqLworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisgICAgaWYgKChwRGF0YS0+Ykhhc0RIRFIpICYmIChwRGF0YS0+YkRlbHRhaW1tZWRpYXRlKSkKKyAgICAgIHBEYXRhLT5mU3RvcmVyb3cgPSAobW5nX2ZwdHIpbW5nX2RlbHRhX2dhODsKKyAgICBlbHNlCisjZW5kaWYKKyAgICAgIHBEYXRhLT5mU3RvcmVyb3cgPSAobW5nX2ZwdHIpbW5nX3N0b3JlX2dhODsKKyAgfQorCisjaWZkZWYgRklMVEVSMTkyICAgICAgICAgICAgICAgICAgICAgICAvKiBsZXZlbGluZyAmIGRpZmZlcmluZyA/ICovCisgIGlmIChwRGF0YS0+aUZpbHRlciA9PSBNTkdfRklMVEVSX0RJRkZFUklORykKKyAgICBwRGF0YS0+ZkRpZmZlcnJvdyAgPSAobW5nX2ZwdHIpbW5nX2RpZmZlcl9nYTg7CisjZW5kaWYKKworICBwRGF0YS0+aVBhc3MgICAgICAgPSAtMTsKKyAgcERhdGEtPmlSb3cgICAgICAgID0gMDsKKyAgcERhdGEtPmlSb3dpbmMgICAgID0gMTsKKyAgcERhdGEtPmlDb2wgICAgICAgID0gMDsKKyAgcERhdGEtPmlDb2xpbmMgICAgID0gMTsKKyAgcERhdGEtPmlSb3dzYW1wbGVzID0gcERhdGEtPmlEYXRhd2lkdGg7CisgIHBEYXRhLT5pU2FtcGxlbXVsICA9IDI7CisgIHBEYXRhLT5pU2FtcGxlb2ZzICA9IDA7CisgIHBEYXRhLT5pU2FtcGxlZGl2ICA9IDA7CisgIHBEYXRhLT5pUm93c2l6ZSAgICA9IHBEYXRhLT5pUm93c2FtcGxlcyA8PCAxOworICBwRGF0YS0+aVJvd21heCAgICAgPSBwRGF0YS0+aVJvd3NpemUgKyBwRGF0YS0+aVBpeGVsb2ZzOworICBwRGF0YS0+aUZpbHRlcmJwcCAgPSAyOworICBwRGF0YS0+YklzUkdCQTE2ICAgPSBNTkdfRkFMU0U7ICAgICAgLyogaW50ZXJtZWRpYXRlIHJvdyBpcyA4LWJpdCBkZWVwICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSU5JVF9HQThfTkksIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIG1uZ19pbml0X3Jvd3Byb2MgKHBEYXRhKTsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX2luaXRfZ2E4X2kgICAgIChtbmdfZGF0YXAgcERhdGEpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfR0E4X0ksIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAocERhdGEtPmZEaXNwbGF5cm93KQorICAgIHBEYXRhLT5mUHJvY2Vzc3JvdyA9IChtbmdfZnB0ciltbmdfcHJvY2Vzc19nYTg7CisKKyAgaWYgKHBEYXRhLT5wU3RvcmVvYmopICAgICAgICAgICAgICAgIC8qIHN0b3JlIGluIG9iamVjdCB0b28gPyAqLworICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW1tZWRpYXRlIGRlbHRhID8gKi8KKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworICAgIGlmICgocERhdGEtPmJIYXNESERSKSAmJiAocERhdGEtPmJEZWx0YWltbWVkaWF0ZSkpCisgICAgICBwRGF0YS0+ZlN0b3Jlcm93ID0gKG1uZ19mcHRyKW1uZ19kZWx0YV9nYTg7CisgICAgZWxzZQorI2VuZGlmCisgICAgICBwRGF0YS0+ZlN0b3Jlcm93ID0gKG1uZ19mcHRyKW1uZ19zdG9yZV9nYTg7CisgIH0KKworI2lmZGVmIEZJTFRFUjE5MiAgICAgICAgICAgICAgICAgICAgICAgLyogbGV2ZWxpbmcgJiBkaWZmZXJpbmcgPyAqLworICBpZiAocERhdGEtPmlGaWx0ZXIgPT0gTU5HX0ZJTFRFUl9ESUZGRVJJTkcpCisgICAgcERhdGEtPmZEaWZmZXJyb3cgID0gKG1uZ19mcHRyKW1uZ19kaWZmZXJfZ2E4OworI2VuZGlmCisKKyAgcERhdGEtPmlQYXNzICAgICAgID0gMDsgICAgICAgICAgICAgIC8qIGZyb20gMC4uNjsgaXMgMS4uNyBpbiBzcGVjaWZpY2F0aW9ucyAqLworICBwRGF0YS0+aVJvdyAgICAgICAgPSBpbnRlcmxhY2Vfcm93ICAgICBbMF07CisgIHBEYXRhLT5pUm93aW5jICAgICA9IGludGVybGFjZV9yb3dza2lwIFswXTsKKyAgcERhdGEtPmlDb2wgICAgICAgID0gaW50ZXJsYWNlX2NvbCAgICAgWzBdOworICBwRGF0YS0+aUNvbGluYyAgICAgPSBpbnRlcmxhY2VfY29sc2tpcCBbMF07CisgIHBEYXRhLT5pUm93c2FtcGxlcyA9IChwRGF0YS0+aURhdGF3aWR0aCArIGludGVybGFjZV9yb3VuZG9mZiBbMF0pID4+IGludGVybGFjZV9kaXZpZGVyIFswXTsKKyAgcERhdGEtPmlTYW1wbGVtdWwgID0gMjsKKyAgcERhdGEtPmlTYW1wbGVvZnMgID0gMDsKKyAgcERhdGEtPmlTYW1wbGVkaXYgID0gMDsKKyAgcERhdGEtPmlSb3dzaXplICAgID0gcERhdGEtPmlSb3dzYW1wbGVzIDw8IDE7CisgIHBEYXRhLT5pUm93bWF4ICAgICA9IChwRGF0YS0+aURhdGF3aWR0aCA8PCAxKSArIHBEYXRhLT5pUGl4ZWxvZnM7CisgIHBEYXRhLT5pRmlsdGVyYnBwICA9IDI7CisgIHBEYXRhLT5iSXNSR0JBMTYgICA9IE1OR19GQUxTRTsgICAgICAvKiBpbnRlcm1lZGlhdGUgcm93IGlzIDgtYml0IGRlZXAgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX0dBOF9JLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBtbmdfaW5pdF9yb3dwcm9jIChwRGF0YSk7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKK21uZ19yZXRjb2RlIG1uZ19pbml0X2dhMTZfbmkgICAobW5nX2RhdGFwIHBEYXRhKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX0dBMTZfTkksIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAocERhdGEtPmZEaXNwbGF5cm93KQorICAgIHBEYXRhLT5mUHJvY2Vzc3JvdyA9IChtbmdfZnB0ciltbmdfcHJvY2Vzc19nYTE2OworCisgIGlmIChwRGF0YS0+cFN0b3Jlb2JqKSAgICAgICAgICAgICAgICAvKiBzdG9yZSBpbiBvYmplY3QgdG9vID8gKi8KKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGltbWVkaWF0ZSBkZWx0YSA/ICovCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKKyAgICBpZiAoKHBEYXRhLT5iSGFzREhEUikgJiYgKHBEYXRhLT5iRGVsdGFpbW1lZGlhdGUpKQorICAgICAgcERhdGEtPmZTdG9yZXJvdyA9IChtbmdfZnB0ciltbmdfZGVsdGFfZ2ExNjsKKyAgICBlbHNlCisjZW5kaWYKKyAgICAgIHBEYXRhLT5mU3RvcmVyb3cgPSAobW5nX2ZwdHIpbW5nX3N0b3JlX2dhMTY7CisgIH0KKworI2lmZGVmIEZJTFRFUjE5MiAgICAgICAgICAgICAgICAgICAgICAgLyogbGV2ZWxpbmcgJiBkaWZmZXJpbmcgPyAqLworICBpZiAocERhdGEtPmlGaWx0ZXIgPT0gTU5HX0ZJTFRFUl9ESUZGRVJJTkcpCisgICAgcERhdGEtPmZEaWZmZXJyb3cgID0gKG1uZ19mcHRyKW1uZ19kaWZmZXJfZ2ExNjsKKyNlbmRpZgorCisgIHBEYXRhLT5pUGFzcyAgICAgICA9IC0xOworICBwRGF0YS0+aVJvdyAgICAgICAgPSAwOworICBwRGF0YS0+aVJvd2luYyAgICAgPSAxOworICBwRGF0YS0+aUNvbCAgICAgICAgPSAwOworICBwRGF0YS0+aUNvbGluYyAgICAgPSAxOworICBwRGF0YS0+aVJvd3NhbXBsZXMgPSBwRGF0YS0+aURhdGF3aWR0aDsKKyAgcERhdGEtPmlTYW1wbGVtdWwgID0gNDsKKyAgcERhdGEtPmlTYW1wbGVvZnMgID0gMDsKKyAgcERhdGEtPmlTYW1wbGVkaXYgID0gMDsKKyAgcERhdGEtPmlSb3dzaXplICAgID0gcERhdGEtPmlSb3dzYW1wbGVzIDw8IDI7CisgIHBEYXRhLT5pUm93bWF4ICAgICA9IHBEYXRhLT5pUm93c2l6ZSArIHBEYXRhLT5pUGl4ZWxvZnM7CisgIHBEYXRhLT5pRmlsdGVyYnBwICA9IDQ7CisgIHBEYXRhLT5iSXNSR0JBMTYgICA9IE1OR19UUlVFOyAgICAgICAvKiBpbnRlcm1lZGlhdGUgcm93IGlzIDE2LWJpdCBkZWVwICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSU5JVF9HQTE2X05JLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBtbmdfaW5pdF9yb3dwcm9jIChwRGF0YSk7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorbW5nX3JldGNvZGUgbW5nX2luaXRfZ2ExNl9pICAgIChtbmdfZGF0YXAgcERhdGEpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfR0ExNl9JLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKHBEYXRhLT5mRGlzcGxheXJvdykKKyAgICBwRGF0YS0+ZlByb2Nlc3Nyb3cgPSAobW5nX2ZwdHIpbW5nX3Byb2Nlc3NfZ2ExNjsKKworICBpZiAocERhdGEtPnBTdG9yZW9iaikgICAgICAgICAgICAgICAgLyogc3RvcmUgaW4gb2JqZWN0IHRvbyA/ICovCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbW1lZGlhdGUgZGVsdGEgPyAqLworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisgICAgaWYgKChwRGF0YS0+Ykhhc0RIRFIpICYmIChwRGF0YS0+YkRlbHRhaW1tZWRpYXRlKSkKKyAgICAgIHBEYXRhLT5mU3RvcmVyb3cgPSAobW5nX2ZwdHIpbW5nX2RlbHRhX2dhMTY7CisgICAgZWxzZQorI2VuZGlmCisgICAgICBwRGF0YS0+ZlN0b3Jlcm93ID0gKG1uZ19mcHRyKW1uZ19zdG9yZV9nYTE2OworICB9CisKKyNpZmRlZiBGSUxURVIxOTIgICAgICAgICAgICAgICAgICAgICAgIC8qIGxldmVsaW5nICYgZGlmZmVyaW5nID8gKi8KKyAgaWYgKHBEYXRhLT5pRmlsdGVyID09IE1OR19GSUxURVJfRElGRkVSSU5HKQorICAgIHBEYXRhLT5mRGlmZmVycm93ICA9IChtbmdfZnB0ciltbmdfZGlmZmVyX2dhMTY7CisjZW5kaWYKKworICBwRGF0YS0+aVBhc3MgICAgICAgPSAwOyAgICAgICAgICAgICAgLyogZnJvbSAwLi42OyBpcyAxLi43IGluIHNwZWNpZmljYXRpb25zICovCisgIHBEYXRhLT5pUm93ICAgICAgICA9IGludGVybGFjZV9yb3cgICAgIFswXTsKKyAgcERhdGEtPmlSb3dpbmMgICAgID0gaW50ZXJsYWNlX3Jvd3NraXAgWzBdOworICBwRGF0YS0+aUNvbCAgICAgICAgPSBpbnRlcmxhY2VfY29sICAgICBbMF07CisgIHBEYXRhLT5pQ29saW5jICAgICA9IGludGVybGFjZV9jb2xza2lwIFswXTsKKyAgcERhdGEtPmlSb3dzYW1wbGVzID0gKHBEYXRhLT5pRGF0YXdpZHRoICsgaW50ZXJsYWNlX3JvdW5kb2ZmIFswXSkgPj4gaW50ZXJsYWNlX2RpdmlkZXIgWzBdOworICBwRGF0YS0+aVNhbXBsZW11bCAgPSA0OworICBwRGF0YS0+aVNhbXBsZW9mcyAgPSAwOworICBwRGF0YS0+aVNhbXBsZWRpdiAgPSAwOworICBwRGF0YS0+aVJvd3NpemUgICAgPSBwRGF0YS0+aVJvd3NhbXBsZXMgPDwgMjsKKyAgcERhdGEtPmlSb3dtYXggICAgID0gKHBEYXRhLT5pRGF0YXdpZHRoIDw8IDIpICsgcERhdGEtPmlQaXhlbG9mczsKKyAgcERhdGEtPmlGaWx0ZXJicHAgID0gNDsKKyAgcERhdGEtPmJJc1JHQkExNiAgID0gTU5HX1RSVUU7ICAgICAgIC8qIGludGVybWVkaWF0ZSByb3cgaXMgMTYtYml0IGRlZXAgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX0dBMTZfSSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gbW5nX2luaXRfcm93cHJvYyAocERhdGEpOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19pbml0X3JnYmE4X25pICAobW5nX2RhdGFwIHBEYXRhKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX1JHQkE4X05JLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKHBEYXRhLT5mRGlzcGxheXJvdykKKyAgICBwRGF0YS0+ZlByb2Nlc3Nyb3cgPSAobW5nX2ZwdHIpbW5nX3Byb2Nlc3NfcmdiYTg7CisKKyAgaWYgKHBEYXRhLT5wU3RvcmVvYmopICAgICAgICAgICAgICAgIC8qIHN0b3JlIGluIG9iamVjdCB0b28gPyAqLworICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW1tZWRpYXRlIGRlbHRhID8gKi8KKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworICAgIGlmICgocERhdGEtPmJIYXNESERSKSAmJiAocERhdGEtPmJEZWx0YWltbWVkaWF0ZSkpCisgICAgICBwRGF0YS0+ZlN0b3Jlcm93ID0gKG1uZ19mcHRyKW1uZ19kZWx0YV9yZ2JhODsKKyAgICBlbHNlCisjZW5kaWYKKyAgICAgIHBEYXRhLT5mU3RvcmVyb3cgPSAobW5nX2ZwdHIpbW5nX3N0b3JlX3JnYmE4OworICB9CisKKyNpZmRlZiBGSUxURVIxOTIgICAgICAgICAgICAgICAgICAgICAgIC8qIGxldmVsaW5nICYgZGlmZmVyaW5nID8gKi8KKyAgaWYgKHBEYXRhLT5pRmlsdGVyID09IE1OR19GSUxURVJfRElGRkVSSU5HKQorICAgIHBEYXRhLT5mRGlmZmVycm93ICA9IChtbmdfZnB0ciltbmdfZGlmZmVyX3JnYmE4OworI2VuZGlmCisKKyAgcERhdGEtPmlQYXNzICAgICAgID0gLTE7CisgIHBEYXRhLT5pUm93ICAgICAgICA9IDA7CisgIHBEYXRhLT5pUm93aW5jICAgICA9IDE7CisgIHBEYXRhLT5pQ29sICAgICAgICA9IDA7CisgIHBEYXRhLT5pQ29saW5jICAgICA9IDE7CisgIHBEYXRhLT5pUm93c2FtcGxlcyA9IHBEYXRhLT5pRGF0YXdpZHRoOworICBwRGF0YS0+aVNhbXBsZW11bCAgPSA0OworICBwRGF0YS0+aVNhbXBsZW9mcyAgPSAwOworICBwRGF0YS0+aVNhbXBsZWRpdiAgPSAwOworICBwRGF0YS0+aVJvd3NpemUgICAgPSBwRGF0YS0+aVJvd3NhbXBsZXMgPDwgMjsKKyAgcERhdGEtPmlSb3dtYXggICAgID0gcERhdGEtPmlSb3dzaXplICsgcERhdGEtPmlQaXhlbG9mczsKKyAgcERhdGEtPmlGaWx0ZXJicHAgID0gNDsKKyAgcERhdGEtPmJJc1JHQkExNiAgID0gTU5HX0ZBTFNFOyAgICAgIC8qIGludGVybWVkaWF0ZSByb3cgaXMgOC1iaXQgZGVlcCAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfUkdCQThfTkksIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIG1uZ19pbml0X3Jvd3Byb2MgKHBEYXRhKTsKK30KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19pbml0X3JnYmE4X2kgICAobW5nX2RhdGFwIHBEYXRhKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX1JHQkE4X0ksIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAocERhdGEtPmZEaXNwbGF5cm93KQorICAgIHBEYXRhLT5mUHJvY2Vzc3JvdyA9IChtbmdfZnB0ciltbmdfcHJvY2Vzc19yZ2JhODsKKworICBpZiAocERhdGEtPnBTdG9yZW9iaikgICAgICAgICAgICAgICAgLyogc3RvcmUgaW4gb2JqZWN0IHRvbyA/ICovCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbW1lZGlhdGUgZGVsdGEgPyAqLworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisgICAgaWYgKChwRGF0YS0+Ykhhc0RIRFIpICYmIChwRGF0YS0+YkRlbHRhaW1tZWRpYXRlKSkKKyAgICAgIHBEYXRhLT5mU3RvcmVyb3cgPSAobW5nX2ZwdHIpbW5nX2RlbHRhX3JnYmE4OworICAgIGVsc2UKKyNlbmRpZgorICAgICAgcERhdGEtPmZTdG9yZXJvdyA9IChtbmdfZnB0ciltbmdfc3RvcmVfcmdiYTg7CisgIH0KKworI2lmZGVmIEZJTFRFUjE5MiAgICAgICAgICAgICAgICAgICAgICAgLyogbGV2ZWxpbmcgJiBkaWZmZXJpbmcgPyAqLworICBpZiAocERhdGEtPmlGaWx0ZXIgPT0gTU5HX0ZJTFRFUl9ESUZGRVJJTkcpCisgICAgcERhdGEtPmZEaWZmZXJyb3cgID0gKG1uZ19mcHRyKW1uZ19kaWZmZXJfcmdiYTg7CisjZW5kaWYKKworICBwRGF0YS0+aVBhc3MgICAgICAgPSAwOyAgICAgICAgICAgICAgLyogZnJvbSAwLi42OyBpcyAxLi43IGluIHNwZWNpZmljYXRpb25zICovCisgIHBEYXRhLT5pUm93ICAgICAgICA9IGludGVybGFjZV9yb3cgICAgIFswXTsKKyAgcERhdGEtPmlSb3dpbmMgICAgID0gaW50ZXJsYWNlX3Jvd3NraXAgWzBdOworICBwRGF0YS0+aUNvbCAgICAgICAgPSBpbnRlcmxhY2VfY29sICAgICBbMF07CisgIHBEYXRhLT5pQ29saW5jICAgICA9IGludGVybGFjZV9jb2xza2lwIFswXTsKKyAgcERhdGEtPmlSb3dzYW1wbGVzID0gKHBEYXRhLT5pRGF0YXdpZHRoICsgaW50ZXJsYWNlX3JvdW5kb2ZmIFswXSkgPj4gaW50ZXJsYWNlX2RpdmlkZXIgWzBdOworICBwRGF0YS0+aVNhbXBsZW11bCAgPSA0OworICBwRGF0YS0+aVNhbXBsZW9mcyAgPSAwOworICBwRGF0YS0+aVNhbXBsZWRpdiAgPSAwOworICBwRGF0YS0+aVJvd3NpemUgICAgPSBwRGF0YS0+aVJvd3NhbXBsZXMgPDwgMjsKKyAgcERhdGEtPmlSb3dtYXggICAgID0gKHBEYXRhLT5pRGF0YXdpZHRoIDw8IDIpICsgcERhdGEtPmlQaXhlbG9mczsKKyAgcERhdGEtPmlGaWx0ZXJicHAgID0gNDsKKyAgcERhdGEtPmJJc1JHQkExNiAgID0gTU5HX0ZBTFNFOyAgICAgIC8qIGludGVybWVkaWF0ZSByb3cgaXMgOC1iaXQgZGVlcCAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfUkdCQThfSSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gbW5nX2luaXRfcm93cHJvYyAocERhdGEpOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCittbmdfcmV0Y29kZSBtbmdfaW5pdF9yZ2JhMTZfbmkgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSU5JVF9SR0JBMTZfTkksIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAocERhdGEtPmZEaXNwbGF5cm93KQorICAgIHBEYXRhLT5mUHJvY2Vzc3JvdyA9IChtbmdfZnB0ciltbmdfcHJvY2Vzc19yZ2JhMTY7CisKKyAgaWYgKHBEYXRhLT5wU3RvcmVvYmopICAgICAgICAgICAgICAgIC8qIHN0b3JlIGluIG9iamVjdCB0b28gPyAqLworICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW1tZWRpYXRlIGRlbHRhID8gKi8KKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworICAgIGlmICgocERhdGEtPmJIYXNESERSKSAmJiAocERhdGEtPmJEZWx0YWltbWVkaWF0ZSkpCisgICAgICBwRGF0YS0+ZlN0b3Jlcm93ID0gKG1uZ19mcHRyKW1uZ19kZWx0YV9yZ2JhMTY7CisgICAgZWxzZQorI2VuZGlmCisgICAgICBwRGF0YS0+ZlN0b3Jlcm93ID0gKG1uZ19mcHRyKW1uZ19zdG9yZV9yZ2JhMTY7CisgIH0KKworI2lmZGVmIEZJTFRFUjE5MiAgICAgICAgICAgICAgICAgICAgICAgLyogbGV2ZWxpbmcgJiBkaWZmZXJpbmcgPyAqLworICBpZiAocERhdGEtPmlGaWx0ZXIgPT0gTU5HX0ZJTFRFUl9ESUZGRVJJTkcpCisgICAgcERhdGEtPmZEaWZmZXJyb3cgID0gKG1uZ19mcHRyKW1uZ19kaWZmZXJfcmdiYTE2OworI2VuZGlmCisKKyAgcERhdGEtPmlQYXNzICAgICAgID0gLTE7CisgIHBEYXRhLT5pUm93ICAgICAgICA9IDA7CisgIHBEYXRhLT5pUm93aW5jICAgICA9IDE7CisgIHBEYXRhLT5pQ29sICAgICAgICA9IDA7CisgIHBEYXRhLT5pQ29saW5jICAgICA9IDE7CisgIHBEYXRhLT5pUm93c2FtcGxlcyA9IHBEYXRhLT5pRGF0YXdpZHRoOworICBwRGF0YS0+aVNhbXBsZW11bCAgPSA4OworICBwRGF0YS0+aVNhbXBsZW9mcyAgPSAwOworICBwRGF0YS0+aVNhbXBsZWRpdiAgPSAwOworICBwRGF0YS0+aVJvd3NpemUgICAgPSBwRGF0YS0+aVJvd3NhbXBsZXMgPDwgMzsKKyAgcERhdGEtPmlSb3dtYXggICAgID0gcERhdGEtPmlSb3dzaXplICsgcERhdGEtPmlQaXhlbG9mczsKKyAgcERhdGEtPmlGaWx0ZXJicHAgID0gODsKKyAgcERhdGEtPmJJc1JHQkExNiAgID0gTU5HX1RSVUU7ICAgICAgIC8qIGludGVybWVkaWF0ZSByb3cgaXMgMTYtYml0IGRlZXAgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX1JHQkExNl9OSSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gbW5nX2luaXRfcm93cHJvYyAocERhdGEpOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKK21uZ19yZXRjb2RlIG1uZ19pbml0X3JnYmExNl9pICAobW5nX2RhdGFwIHBEYXRhKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX1JHQkExNl9JLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKHBEYXRhLT5mRGlzcGxheXJvdykKKyAgICBwRGF0YS0+ZlByb2Nlc3Nyb3cgPSAobW5nX2ZwdHIpbW5nX3Byb2Nlc3NfcmdiYTE2OworCisgIGlmIChwRGF0YS0+cFN0b3Jlb2JqKSAgICAgICAgICAgICAgICAvKiBzdG9yZSBpbiBvYmplY3QgdG9vID8gKi8KKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGltbWVkaWF0ZSBkZWx0YSA/ICovCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKKyAgICBpZiAoKHBEYXRhLT5iSGFzREhEUikgJiYgKHBEYXRhLT5iRGVsdGFpbW1lZGlhdGUpKQorICAgICAgcERhdGEtPmZTdG9yZXJvdyA9IChtbmdfZnB0ciltbmdfZGVsdGFfcmdiYTE2OworICAgIGVsc2UKKyNlbmRpZgorICAgICAgcERhdGEtPmZTdG9yZXJvdyA9IChtbmdfZnB0ciltbmdfc3RvcmVfcmdiYTE2OworICB9CisKKyNpZmRlZiBGSUxURVIxOTIgICAgICAgICAgICAgICAgICAgICAgIC8qIGxldmVsaW5nICYgZGlmZmVyaW5nID8gKi8KKyAgaWYgKHBEYXRhLT5pRmlsdGVyID09IE1OR19GSUxURVJfRElGRkVSSU5HKQorICAgIHBEYXRhLT5mRGlmZmVycm93ICA9IChtbmdfZnB0ciltbmdfZGlmZmVyX3JnYmExNjsKKyNlbmRpZgorCisgIHBEYXRhLT5pUGFzcyAgICAgICA9IDA7ICAgICAgICAgICAgICAvKiBmcm9tIDAuLjY7ICgxLi43IGluIHNwZWNpZmljYXRpb24pICovCisgIHBEYXRhLT5pUm93ICAgICAgICA9IGludGVybGFjZV9yb3cgICAgIFswXTsKKyAgcERhdGEtPmlSb3dpbmMgICAgID0gaW50ZXJsYWNlX3Jvd3NraXAgWzBdOworICBwRGF0YS0+aUNvbCAgICAgICAgPSBpbnRlcmxhY2VfY29sICAgICBbMF07CisgIHBEYXRhLT5pQ29saW5jICAgICA9IGludGVybGFjZV9jb2xza2lwIFswXTsKKyAgcERhdGEtPmlSb3dzYW1wbGVzID0gKHBEYXRhLT5pRGF0YXdpZHRoICsgaW50ZXJsYWNlX3JvdW5kb2ZmIFswXSkgPj4gaW50ZXJsYWNlX2RpdmlkZXIgWzBdOworICBwRGF0YS0+aVNhbXBsZW11bCAgPSA4OworICBwRGF0YS0+aVNhbXBsZW9mcyAgPSAwOworICBwRGF0YS0+aVNhbXBsZWRpdiAgPSAwOworICBwRGF0YS0+aVJvd3NpemUgICAgPSBwRGF0YS0+aVJvd3NhbXBsZXMgPDwgMzsKKyAgcERhdGEtPmlSb3dtYXggICAgID0gKHBEYXRhLT5pRGF0YXdpZHRoIDw8IDMpICsgcERhdGEtPmlQaXhlbG9mczsKKyAgcERhdGEtPmlGaWx0ZXJicHAgID0gODsKKyAgcERhdGEtPmJJc1JHQkExNiAgID0gTU5HX1RSVUU7ICAgICAgIC8qIGludGVybWVkaWF0ZSByb3cgaXMgMTYtYml0IGRlZXAgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX1JHQkExNl9JLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBtbmdfaW5pdF9yb3dwcm9jIChwRGF0YSk7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIFJvdyBwcm9jZXNzaW5nIGluaXRpYWxpemF0aW9uIHJvdXRpbmVzIChKUEVHKSAtIHNldCB1cCB0aGUgdmFyaWFibGVzICAgKiAqLworLyogKiBuZWVkZWQgdG8gcHJvY2VzcyB1bmNvbXByZXNzZWQgcm93LWRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PXzFfMl80QklUX1NVUFBPUlQKK21uZ19yZXRjb2RlIG1uZ19pbml0X2pwZWdfYTFfbmkgICAgIChtbmdfZGF0YXAgcERhdGEpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfSlBFR19BMV9OSSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmIChwRGF0YS0+cFN0b3Jlb2JqKSAgICAgICAgICAgICAgICAvKiBzdG9yZSBpbiBvYmplY3QgdG9vID8gKi8KKyAgeworICAgIGlmIChwRGF0YS0+aUpIRFJpbWdiaXRkZXB0aCA9PSA4KQorICAgIHsKKyAgICAgIHN3aXRjaCAocERhdGEtPmlKSERSY29sb3J0eXBlKQorICAgICAgeworICAgICAgICBjYXNlIDEyIDogeyBwRGF0YS0+ZlN0b3Jlcm93ID0gKG1uZ19mcHRyKW1uZ19zdG9yZV9qcGVnX2c4X2ExOyAgIGJyZWFrOyB9CisgICAgICAgIGNhc2UgMTQgOiB7IHBEYXRhLT5mU3RvcmVyb3cgPSAobW5nX2ZwdHIpbW5nX3N0b3JlX2pwZWdfcmdiOF9hMTsgYnJlYWs7IH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBUT0RPOiBiaXRkZXB0aCAxMiAmIDIwICovCisKKyAgfQorCisjaWZkZWYgRklMVEVSMTkyICAgICAgICAgICAgICAgICAgICAgICAvKiBsZXZlbGluZyAmIGRpZmZlcmluZyA/ICovCisgIGlmIChwRGF0YS0+aUZpbHRlciA9PSBNTkdfRklMVEVSX0RJRkZFUklORykKKyAgICBwRGF0YS0+ZkRpZmZlcnJvdyAgPSAobW5nX2ZwdHIpbW5nX2RpZmZlcl9nMTsKKyNlbmRpZgorCisgIHBEYXRhLT5pUGFzcyAgICAgICA9IC0xOworICBwRGF0YS0+aVJvdyAgICAgICAgPSAwOworICBwRGF0YS0+aVJvd2luYyAgICAgPSAxOworICBwRGF0YS0+aUNvbCAgICAgICAgPSAwOworICBwRGF0YS0+aUNvbGluYyAgICAgPSAxOworICBwRGF0YS0+aVJvd3NhbXBsZXMgPSBwRGF0YS0+aURhdGF3aWR0aDsKKyAgcERhdGEtPmlTYW1wbGVtdWwgID0gMTsKKyAgcERhdGEtPmlTYW1wbGVvZnMgID0gNzsKKyAgcERhdGEtPmlTYW1wbGVkaXYgID0gMzsKKyAgcERhdGEtPmlSb3dzaXplICAgID0gKHBEYXRhLT5pUm93c2FtcGxlcyArIDcpID4+IDM7CisgIHBEYXRhLT5pUm93bWF4ICAgICA9IHBEYXRhLT5pUm93c2l6ZSArIHBEYXRhLT5pUGl4ZWxvZnM7CisgIHBEYXRhLT5pRmlsdGVyYnBwICA9IDE7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSU5JVF9KUEVHX0ExX05JLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBtbmdfaW5pdF9yb3dwcm9jIChwRGF0YSk7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19pbml0X2pwZWdfYTJfbmkgICAgIChtbmdfZGF0YXAgcERhdGEpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfSlBFR19BMl9OSSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmIChwRGF0YS0+cFN0b3Jlb2JqKSAgICAgICAgICAgICAgICAvKiBzdG9yZSBpbiBvYmplY3QgdG9vID8gKi8KKyAgeworICAgIGlmIChwRGF0YS0+aUpIRFJpbWdiaXRkZXB0aCA9PSA4KQorICAgIHsKKyAgICAgIHN3aXRjaCAocERhdGEtPmlKSERSY29sb3J0eXBlKQorICAgICAgeworICAgICAgICBjYXNlIDEyIDogeyBwRGF0YS0+ZlN0b3Jlcm93ID0gKG1uZ19mcHRyKW1uZ19zdG9yZV9qcGVnX2c4X2EyOyAgIGJyZWFrOyB9CisgICAgICAgIGNhc2UgMTQgOiB7IHBEYXRhLT5mU3RvcmVyb3cgPSAobW5nX2ZwdHIpbW5nX3N0b3JlX2pwZWdfcmdiOF9hMjsgYnJlYWs7IH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBUT0RPOiBiaXRkZXB0aCAxMiAmIDIwICovCisKKyAgfQorCisjaWZkZWYgRklMVEVSMTkyICAgICAgICAgICAgICAgICAgICAgICAvKiBsZXZlbGluZyAmIGRpZmZlcmluZyA/ICovCisgIGlmIChwRGF0YS0+aUZpbHRlciA9PSBNTkdfRklMVEVSX0RJRkZFUklORykKKyAgICBwRGF0YS0+ZkRpZmZlcnJvdyAgPSAobW5nX2ZwdHIpbW5nX2RpZmZlcl9nMjsKKyNlbmRpZgorCisgIHBEYXRhLT5pUGFzcyAgICAgICA9IC0xOworICBwRGF0YS0+aVJvdyAgICAgICAgPSAwOworICBwRGF0YS0+aVJvd2luYyAgICAgPSAxOworICBwRGF0YS0+aUNvbCAgICAgICAgPSAwOworICBwRGF0YS0+aUNvbGluYyAgICAgPSAxOworICBwRGF0YS0+aVJvd3NhbXBsZXMgPSBwRGF0YS0+aURhdGF3aWR0aDsKKyAgcERhdGEtPmlTYW1wbGVtdWwgID0gMTsKKyAgcERhdGEtPmlTYW1wbGVvZnMgID0gMzsKKyAgcERhdGEtPmlTYW1wbGVkaXYgID0gMjsKKyAgcERhdGEtPmlSb3dzaXplICAgID0gKHBEYXRhLT5pUm93c2FtcGxlcyArIDMpID4+IDI7CisgIHBEYXRhLT5pUm93bWF4ICAgICA9IHBEYXRhLT5pUm93c2l6ZSArIHBEYXRhLT5pUGl4ZWxvZnM7CisgIHBEYXRhLT5pRmlsdGVyYnBwICA9IDE7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSU5JVF9KUEVHX0EyX05JLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBtbmdfaW5pdF9yb3dwcm9jIChwRGF0YSk7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19pbml0X2pwZWdfYTRfbmkgICAgIChtbmdfZGF0YXAgcERhdGEpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfSlBFR19BNF9OSSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmIChwRGF0YS0+cFN0b3Jlb2JqKSAgICAgICAgICAgICAgICAvKiBzdG9yZSBpbiBvYmplY3QgdG9vID8gKi8KKyAgeworICAgIGlmIChwRGF0YS0+aUpIRFJpbWdiaXRkZXB0aCA9PSA4KQorICAgIHsKKyAgICAgIHN3aXRjaCAocERhdGEtPmlKSERSY29sb3J0eXBlKQorICAgICAgeworICAgICAgICBjYXNlIDEyIDogeyBwRGF0YS0+ZlN0b3Jlcm93ID0gKG1uZ19mcHRyKW1uZ19zdG9yZV9qcGVnX2c4X2E0OyAgIGJyZWFrOyB9CisgICAgICAgIGNhc2UgMTQgOiB7IHBEYXRhLT5mU3RvcmVyb3cgPSAobW5nX2ZwdHIpbW5nX3N0b3JlX2pwZWdfcmdiOF9hNDsgYnJlYWs7IH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBUT0RPOiBiaXRkZXB0aCAxMiAmIDIwICovCisKKyAgfQorCisjaWZkZWYgRklMVEVSMTkyICAgICAgICAgICAgICAgICAgICAgICAvKiBsZXZlbGluZyAmIGRpZmZlcmluZyA/ICovCisgIGlmIChwRGF0YS0+aUZpbHRlciA9PSBNTkdfRklMVEVSX0RJRkZFUklORykKKyAgICBwRGF0YS0+ZkRpZmZlcnJvdyAgPSAobW5nX2ZwdHIpbW5nX2RpZmZlcl9nNDsKKyNlbmRpZgorCisgIHBEYXRhLT5pUGFzcyAgICAgICA9IC0xOworICBwRGF0YS0+aVJvdyAgICAgICAgPSAwOworICBwRGF0YS0+aVJvd2luYyAgICAgPSAxOworICBwRGF0YS0+aUNvbCAgICAgICAgPSAwOworICBwRGF0YS0+aUNvbGluYyAgICAgPSAxOworICBwRGF0YS0+aVJvd3NhbXBsZXMgPSBwRGF0YS0+aURhdGF3aWR0aDsKKyAgcERhdGEtPmlTYW1wbGVtdWwgID0gMTsKKyAgcERhdGEtPmlTYW1wbGVvZnMgID0gMTsKKyAgcERhdGEtPmlTYW1wbGVkaXYgID0gMTsKKyAgcERhdGEtPmlSb3dzaXplICAgID0gKHBEYXRhLT5pUm93c2FtcGxlcyArIDEpID4+IDE7CisgIHBEYXRhLT5pUm93bWF4ICAgICA9IHBEYXRhLT5pUm93c2l6ZSArIHBEYXRhLT5pUGl4ZWxvZnM7CisgIHBEYXRhLT5pRmlsdGVyYnBwICA9IDE7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSU5JVF9KUEVHX0E0X05JLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBtbmdfaW5pdF9yb3dwcm9jIChwRGF0YSk7Cit9CisjZW5kaWYgLyogTU5HX05PXzFfMl80QklUX1NVUFBPUlQgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX2luaXRfanBlZ19hOF9uaSAgICAgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSU5JVF9KUEVHX0E4X05JLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKHBEYXRhLT5wU3RvcmVvYmopICAgICAgICAgICAgICAgIC8qIHN0b3JlIGluIG9iamVjdCB0b28gPyAqLworICB7CisgICAgaWYgKHBEYXRhLT5pSkhEUmltZ2JpdGRlcHRoID09IDgpCisgICAgeworICAgICAgc3dpdGNoIChwRGF0YS0+aUpIRFJjb2xvcnR5cGUpCisgICAgICB7CisgICAgICAgIGNhc2UgMTIgOiB7IHBEYXRhLT5mU3RvcmVyb3cgPSAobW5nX2ZwdHIpbW5nX3N0b3JlX2pwZWdfZzhfYTg7ICAgYnJlYWs7IH0KKyAgICAgICAgY2FzZSAxNCA6IHsgcERhdGEtPmZTdG9yZXJvdyA9IChtbmdfZnB0ciltbmdfc3RvcmVfanBlZ19yZ2I4X2E4OyBicmVhazsgfQorICAgICAgfQorICAgIH0KKworICAgIC8qIFRPRE86IGJpdGRlcHRoIDEyICYgMjAgKi8KKworICB9CisKKyNpZmRlZiBGSUxURVIxOTIgICAgICAgICAgICAgICAgICAgICAgIC8qIGxldmVsaW5nICYgZGlmZmVyaW5nID8gKi8KKyAgaWYgKHBEYXRhLT5pRmlsdGVyID09IE1OR19GSUxURVJfRElGRkVSSU5HKQorICAgIHBEYXRhLT5mRGlmZmVycm93ICA9IChtbmdfZnB0ciltbmdfZGlmZmVyX2c4OworI2VuZGlmCisKKyAgcERhdGEtPmlQYXNzICAgICAgID0gLTE7CisgIHBEYXRhLT5pUm93ICAgICAgICA9IDA7CisgIHBEYXRhLT5pUm93aW5jICAgICA9IDE7CisgIHBEYXRhLT5pQ29sICAgICAgICA9IDA7CisgIHBEYXRhLT5pQ29saW5jICAgICA9IDE7CisgIHBEYXRhLT5pUm93c2FtcGxlcyA9IHBEYXRhLT5pRGF0YXdpZHRoOworICBwRGF0YS0+aVNhbXBsZW11bCAgPSAxOworICBwRGF0YS0+aVNhbXBsZW9mcyAgPSAwOworICBwRGF0YS0+aVNhbXBsZWRpdiAgPSAwOworICBwRGF0YS0+aVJvd3NpemUgICAgPSBwRGF0YS0+aVJvd3NhbXBsZXM7CisgIHBEYXRhLT5pUm93bWF4ICAgICA9IHBEYXRhLT5pUm93c2l6ZSArIHBEYXRhLT5pUGl4ZWxvZnM7CisgIHBEYXRhLT5pRmlsdGVyYnBwICA9IDE7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fSU5JVF9KUEVHX0E4X05JLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBtbmdfaW5pdF9yb3dwcm9jIChwRGF0YSk7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKK21uZ19yZXRjb2RlIG1uZ19pbml0X2pwZWdfYTE2X25pICAgIChtbmdfZGF0YXAgcERhdGEpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfSlBFR19BMTZfTkksIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAocERhdGEtPnBTdG9yZW9iaikgICAgICAgICAgICAgICAgLyogc3RvcmUgaW4gb2JqZWN0IHRvbyA/ICovCisgIHsKKyAgICBpZiAocERhdGEtPmlKSERSaW1nYml0ZGVwdGggPT0gOCkKKyAgICB7CisgICAgICBzd2l0Y2ggKHBEYXRhLT5pSkhEUmNvbG9ydHlwZSkKKyAgICAgIHsKKyAgICAgICAgY2FzZSAxMiA6IHsgcERhdGEtPmZTdG9yZXJvdyA9IChtbmdfZnB0ciltbmdfc3RvcmVfanBlZ19nOF9hMTY7ICAgYnJlYWs7IH0KKyAgICAgICAgY2FzZSAxNCA6IHsgcERhdGEtPmZTdG9yZXJvdyA9IChtbmdfZnB0ciltbmdfc3RvcmVfanBlZ19yZ2I4X2ExNjsgYnJlYWs7IH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBUT0RPOiBiaXRkZXB0aCAxMiAmIDIwICovCisKKyAgfQorCisjaWZkZWYgRklMVEVSMTkyICAgICAgICAgICAgICAgICAgICAgICAvKiBsZXZlbGluZyAmIGRpZmZlcmluZyA/ICovCisgIGlmIChwRGF0YS0+aUZpbHRlciA9PSBNTkdfRklMVEVSX0RJRkZFUklORykKKyAgICBwRGF0YS0+ZkRpZmZlcnJvdyAgPSAobW5nX2ZwdHIpbW5nX2RpZmZlcl9nMTY7CisjZW5kaWYKKworICBwRGF0YS0+aVBhc3MgICAgICAgPSAtMTsKKyAgcERhdGEtPmlSb3cgICAgICAgID0gMDsKKyAgcERhdGEtPmlSb3dpbmMgICAgID0gMTsKKyAgcERhdGEtPmlDb2wgICAgICAgID0gMDsKKyAgcERhdGEtPmlDb2xpbmMgICAgID0gMTsKKyAgcERhdGEtPmlSb3dzYW1wbGVzID0gcERhdGEtPmlEYXRhd2lkdGg7CisgIHBEYXRhLT5pU2FtcGxlbXVsICA9IDI7CisgIHBEYXRhLT5pU2FtcGxlb2ZzICA9IDA7CisgIHBEYXRhLT5pU2FtcGxlZGl2ICA9IDA7CisgIHBEYXRhLT5pUm93c2l6ZSAgICA9IHBEYXRhLT5pUm93c2FtcGxlcyA8PCAxOworICBwRGF0YS0+aVJvd21heCAgICAgPSBwRGF0YS0+aVJvd3NpemUgKyBwRGF0YS0+aVBpeGVsb2ZzOworICBwRGF0YS0+aUZpbHRlcmJwcCAgPSAyOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfSlBFR19BMTZfTkksIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIG1uZ19pbml0X3Jvd3Byb2MgKHBEYXRhKTsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjZW5kaWYgLyogTU5HX0lOQ0xVREVfSk5HICovCisjZW5kaWYgLyogTU5HX09QVElNSVpFX0ZPT1RQUklOVF9JTklUICovCisKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIEdlbmVyaWMgcm93IHByb2Nlc3NpbmcgaW5pdGlhbGl6YXRpb24gJiBjbGVhbnVwIHJvdXRpbmVzICAgICAgICAgICAgICAgKiAqLworLyogKiAtIGluaXRpYWxpemUgdGhlIGJ1ZmZlcnMgdXNlZCBieSB0aGUgcm93IHByb2Nlc3Npbmcgcm91dGluZXMgICAgICAgICAgICogKi8KKy8qICogLSBjbGVhbnVwIHRoZSBidWZmZXJzIHVzZWQgYnkgdGhlIHJvdyBwcm9jZXNzaW5nIHJvdXRpbmVzICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX2luaXRfcm93cHJvYyAobW5nX2RhdGFwIHBEYXRhKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9JTklUX1JPV1BST0MsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworI2lmZGVmIE1OR19PUFRJTUlaRV9GT09UUFJJTlRfSU5JVAorICBpZiAocERhdGEtPmVQbmdfaW1ndHlwZSAhPSBwbmdfbm9uZSkKKyAgeworICBpZiAocERhdGEtPmZEaXNwbGF5cm93KQorICAgIHN3aXRjaCAocERhdGEtPmVQbmdfaW1ndHlwZSkKKyAgICB7CisjaWZuZGVmIE1OR19OT18xXzJfNEJJVF9TVVBQT1JUCisgICAgY2FzZSBwbmdfZzE6CisgICAgICBwRGF0YS0+ZlByb2Nlc3Nyb3cgPSAobW5nX2ZwdHIpbW5nX3Byb2Nlc3NfZzE7CisgICAgICBicmVhazsKKyAgICBjYXNlIHBuZ19nMjoKKyAgICAgIHBEYXRhLT5mUHJvY2Vzc3JvdyA9IChtbmdfZnB0ciltbmdfcHJvY2Vzc19nMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgcG5nX2c0OgorICAgICAgcERhdGEtPmZQcm9jZXNzcm93ID0gKG1uZ19mcHRyKW1uZ19wcm9jZXNzX2c0OworICAgICAgYnJlYWs7CisjZW5kaWYgLyogTU5HX05PXzFfMl80QklUX1NVUFBPUlQgKi8KKyAgICBjYXNlIHBuZ19nODoKKyAgICAgIHBEYXRhLT5mUHJvY2Vzc3JvdyA9IChtbmdfZnB0ciltbmdfcHJvY2Vzc19nODsKKyAgICAgIGJyZWFrOworI2lmbmRlZiBNTkdfTk9fMV8yXzRCSVRfU1VQUE9SVAorICAgIGNhc2UgcG5nX2lkeDE6CisgICAgICBwRGF0YS0+ZlByb2Nlc3Nyb3cgPSAobW5nX2ZwdHIpbW5nX3Byb2Nlc3NfaWR4MTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgcG5nX2lkeDI6CisgICAgICBwRGF0YS0+ZlByb2Nlc3Nyb3cgPSAobW5nX2ZwdHIpbW5nX3Byb2Nlc3NfaWR4MjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgcG5nX2lkeDQ6CisgICAgICBwRGF0YS0+ZlByb2Nlc3Nyb3cgPSAobW5nX2ZwdHIpbW5nX3Byb2Nlc3NfaWR4NDsKKyAgICAgIGJyZWFrOworI2VuZGlmIC8qIE1OR19OT18xXzJfNEJJVF9TVVBQT1JUICovCisgICAgY2FzZSBwbmdfaWR4ODoKKyAgICAgIHBEYXRhLT5mUHJvY2Vzc3JvdyA9IChtbmdfZnB0ciltbmdfcHJvY2Vzc19pZHg4OworICAgICAgYnJlYWs7CisgICAgY2FzZSBwbmdfZ2E4OgorICAgICAgcERhdGEtPmZQcm9jZXNzcm93ID0gKG1uZ19mcHRyKW1uZ19wcm9jZXNzX2dhODsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgcG5nX3JnYjg6CisgICAgICBwRGF0YS0+ZlByb2Nlc3Nyb3cgPSAobW5nX2ZwdHIpbW5nX3Byb2Nlc3NfcmdiODsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgcG5nX3JnYmE4OgorICAgICAgcERhdGEtPmZQcm9jZXNzcm93ID0gKG1uZ19mcHRyKW1uZ19wcm9jZXNzX3JnYmE4OworICAgICAgYnJlYWs7CisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgY2FzZSBwbmdfZzE2OgorICAgICAgcERhdGEtPmZQcm9jZXNzcm93ID0gKG1uZ19mcHRyKW1uZ19wcm9jZXNzX2cxNjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgcG5nX2dhMTY6CisgICAgICBwRGF0YS0+ZlByb2Nlc3Nyb3cgPSAobW5nX2ZwdHIpbW5nX3Byb2Nlc3NfZ2ExNjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgcG5nX3JnYjE2OgorICAgICAgcERhdGEtPmZQcm9jZXNzcm93ID0gKG1uZ19mcHRyKW1uZ19wcm9jZXNzX3JnYjE2OworICAgICAgYnJlYWs7CisgICAgY2FzZSBwbmdfcmdiYTE2OgorICAgICAgcERhdGEtPmZQcm9jZXNzcm93ID0gKG1uZ19mcHRyKW1uZ19wcm9jZXNzX3JnYmExNjsKKyAgICAgIGJyZWFrOworI2VuZGlmCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KKworICBpZiAocERhdGEtPnBTdG9yZW9iaikgICAgICAgICAgICAgICAgLyogc3RvcmUgaW4gb2JqZWN0IHRvbyA/ICovCisgIHsKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworICBpZiAoKHBEYXRhLT5iSGFzREhEUikgJiYgKHBEYXRhLT5iRGVsdGFpbW1lZGlhdGUpKQorICAgIHN3aXRjaCAocERhdGEtPmVQbmdfaW1ndHlwZSkKKyAgICB7CisjaWZuZGVmIE1OR19OT18xXzJfNEJJVF9TVVBQT1JUCisgICAgY2FzZSBwbmdfZzE6CisgICAgICBwRGF0YS0+ZlN0b3Jlcm93ID0gKG1uZ19mcHRyKW1uZ19kZWx0YV9nMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgcG5nX2cyOgorICAgICAgcERhdGEtPmZTdG9yZXJvdyA9IChtbmdfZnB0ciltbmdfZGVsdGFfZzI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHBuZ19nNDoKKyAgICAgIHBEYXRhLT5mU3RvcmVyb3cgPSAobW5nX2ZwdHIpbW5nX2RlbHRhX2c0OworICAgICAgYnJlYWs7CisjZW5kaWYgLyogTU5HX05PXzFfMl80QklUX1NVUFBPUlQgKi8KKyAgICBjYXNlIHBuZ19nODoKKyAgICAgIHBEYXRhLT5mU3RvcmVyb3cgPSAobW5nX2ZwdHIpbW5nX2RlbHRhX2c4OworICAgICAgYnJlYWs7CisjaWZuZGVmIE1OR19OT18xXzJfNEJJVF9TVVBQT1JUCisgICAgY2FzZSBwbmdfaWR4MToKKyAgICAgIHBEYXRhLT5mU3RvcmVyb3cgPSAobW5nX2ZwdHIpbW5nX2RlbHRhX2lkeDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIHBuZ19pZHgyOgorICAgICAgcERhdGEtPmZTdG9yZXJvdyA9IChtbmdfZnB0ciltbmdfZGVsdGFfaWR4MjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgcG5nX2lkeDQ6CisgICAgICBwRGF0YS0+ZlN0b3Jlcm93ID0gKG1uZ19mcHRyKW1uZ19kZWx0YV9pZHg0OworICAgICAgYnJlYWs7CisjZW5kaWYgLyogTU5HX05PXzFfMl80QklUX1NVUFBPUlQgKi8KKyAgICBjYXNlIHBuZ19pZHg4OgorICAgICAgcERhdGEtPmZTdG9yZXJvdyA9IChtbmdfZnB0ciltbmdfZGVsdGFfaWR4ODsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgcG5nX2dhODoKKyAgICAgIHBEYXRhLT5mU3RvcmVyb3cgPSAobW5nX2ZwdHIpbW5nX2RlbHRhX2dhODsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgcG5nX3JnYjg6CisgICAgICBwRGF0YS0+ZlN0b3Jlcm93ID0gKG1uZ19mcHRyKW1uZ19kZWx0YV9yZ2I4OworICAgICAgYnJlYWs7CisgICAgY2FzZSBwbmdfcmdiYTg6CisgICAgICBwRGF0YS0+ZlN0b3Jlcm93ID0gKG1uZ19mcHRyKW1uZ19kZWx0YV9yZ2JhODsKKyAgICAgIGJyZWFrOworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgIGNhc2UgcG5nX2cxNjoKKyAgICAgIHBEYXRhLT5mU3RvcmVyb3cgPSAobW5nX2ZwdHIpbW5nX2RlbHRhX2cxNjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgcG5nX2dhMTY6CisgICAgICBwRGF0YS0+ZlN0b3Jlcm93ID0gKG1uZ19mcHRyKW1uZ19kZWx0YV9nYTE2OworICAgICAgYnJlYWs7CisgICAgY2FzZSBwbmdfcmdiMTY6CisgICAgICBwRGF0YS0+ZlN0b3Jlcm93ID0gKG1uZ19mcHRyKW1uZ19kZWx0YV9yZ2IxNjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgcG5nX3JnYmExNjoKKyAgICAgIHBEYXRhLT5mU3RvcmVyb3cgPSAobW5nX2ZwdHIpbW5nX2RlbHRhX3JnYmExNjsKKyAgICAgIGJyZWFrOworI2VuZGlmCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KKyAgZWxzZQorI2VuZGlmICAvKiBNTkdfTk9fREVMVEFfUE5HICovCisgICAgc3dpdGNoIChwRGF0YS0+ZVBuZ19pbWd0eXBlKQorICAgIHsKKyNpZm5kZWYgTU5HX05PXzFfMl80QklUX1NVUFBPUlQKKyAgICBjYXNlIHBuZ19nMToKKyAgICAgIHBEYXRhLT5mU3RvcmVyb3cgPSAobW5nX2ZwdHIpbW5nX3N0b3JlX2cxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBwbmdfZzI6CisgICAgICBwRGF0YS0+ZlN0b3Jlcm93ID0gKG1uZ19mcHRyKW1uZ19zdG9yZV9nMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgcG5nX2c0OgorICAgICAgcERhdGEtPmZTdG9yZXJvdyA9IChtbmdfZnB0ciltbmdfc3RvcmVfZzQ7CisgICAgICBicmVhazsKKyNlbmRpZiAvKiBNTkdfTk9fMV8yXzRCSVRfU1VQUE9SVCAqLworICAgIGNhc2UgcG5nX2c4OgorICAgICAgcERhdGEtPmZTdG9yZXJvdyA9IChtbmdfZnB0ciltbmdfc3RvcmVfZzg7CisgICAgICBicmVhazsKKyNpZm5kZWYgTU5HX05PXzFfMl80QklUX1NVUFBPUlQKKyAgICBjYXNlIHBuZ19pZHgxOgorICAgICAgcERhdGEtPmZTdG9yZXJvdyA9IChtbmdfZnB0ciltbmdfc3RvcmVfaWR4MTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgcG5nX2lkeDI6CisgICAgICBwRGF0YS0+ZlN0b3Jlcm93ID0gKG1uZ19mcHRyKW1uZ19zdG9yZV9pZHgyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBwbmdfaWR4NDoKKyAgICAgIHBEYXRhLT5mU3RvcmVyb3cgPSAobW5nX2ZwdHIpbW5nX3N0b3JlX2lkeDQ7CisgICAgICBicmVhazsKKyNlbmRpZiAvKiBNTkdfTk9fMV8yXzRCSVRfU1VQUE9SVCAqLworICAgIGNhc2UgcG5nX2lkeDg6CisgICAgICBwRGF0YS0+ZlN0b3Jlcm93ID0gKG1uZ19mcHRyKW1uZ19zdG9yZV9pZHg4OworICAgICAgYnJlYWs7CisgICAgY2FzZSBwbmdfZ2E4OgorICAgICAgcERhdGEtPmZTdG9yZXJvdyA9IChtbmdfZnB0ciltbmdfc3RvcmVfZ2E4OworICAgICAgYnJlYWs7CisgICAgY2FzZSBwbmdfcmdiODoKKyAgICAgIHBEYXRhLT5mU3RvcmVyb3cgPSAobW5nX2ZwdHIpbW5nX3N0b3JlX3JnYjg7CisgICAgICBicmVhazsKKyAgICBjYXNlIHBuZ19yZ2JhODoKKyAgICAgIHBEYXRhLT5mU3RvcmVyb3cgPSAobW5nX2ZwdHIpbW5nX3N0b3JlX3JnYmE4OworICAgICAgYnJlYWs7CisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgY2FzZSBwbmdfZzE2OgorICAgICAgcERhdGEtPmZTdG9yZXJvdyA9IChtbmdfZnB0ciltbmdfc3RvcmVfZzE2OworICAgICAgYnJlYWs7CisgICAgY2FzZSBwbmdfZ2ExNjoKKyAgICAgIHBEYXRhLT5mU3RvcmVyb3cgPSAobW5nX2ZwdHIpbW5nX3N0b3JlX2dhMTY7CisgICAgICBicmVhazsKKyAgICBjYXNlIHBuZ19yZ2IxNjoKKyAgICAgIHBEYXRhLT5mU3RvcmVyb3cgPSAobW5nX2ZwdHIpbW5nX3N0b3JlX3JnYjE2OworICAgICAgYnJlYWs7CisgICAgY2FzZSBwbmdfcmdiYTE2OgorICAgICAgcERhdGEtPmZTdG9yZXJvdyA9IChtbmdfZnB0ciltbmdfc3RvcmVfcmdiYTE2OworICAgICAgYnJlYWs7CisjZW5kaWYKKworI2lmZGVmIE1OR19JTkNMVURFX0pORworI2lmbmRlZiBNTkdfTk9fMV8yXzRCSVRfU1VQUE9SVAorICAgIGNhc2UgcG5nX2pwZWdfYTE6CisvKiAgaWYgKHBEYXRhLT5pSkhEUmltZ2JpdGRlcHRoID09IDgpICovCisgICAgICB7CisgICAgICAgIHN3aXRjaCAocERhdGEtPmlKSERSY29sb3J0eXBlKQorICAgICAgICB7CisgICAgICAgIGNhc2UgMTIgOgorICAgICAgICAgIHsgcERhdGEtPmZTdG9yZXJvdyA9IChtbmdfZnB0ciltbmdfc3RvcmVfanBlZ19nOF9hMTsgICBicmVhazsgfQorICAgICAgICBjYXNlIDE0IDoKKyAgICAgICAgICB7IHBEYXRhLT5mU3RvcmVyb3cgPSAobW5nX2ZwdHIpbW5nX3N0b3JlX2pwZWdfcmdiOF9hMTsgYnJlYWs7IH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgLyogVE9ETzogYml0ZGVwdGggMTIgJiAyMCAqLworICAgICAgYnJlYWs7CisgICAgY2FzZSBwbmdfanBlZ19hMjoKKy8qICBpZiAocERhdGEtPmlKSERSaW1nYml0ZGVwdGggPT0gOCkgKi8KKyAgICAgIHsKKyAgICAgICAgc3dpdGNoIChwRGF0YS0+aUpIRFJjb2xvcnR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICBjYXNlIDEyIDoKKyAgICAgICAgICAgIHsgcERhdGEtPmZTdG9yZXJvdyA9IChtbmdfZnB0ciltbmdfc3RvcmVfanBlZ19nOF9hMjsgICBicmVhazsgfQorICAgICAgICAgIGNhc2UgMTQgOgorICAgICAgICAgICAgeyBwRGF0YS0+ZlN0b3Jlcm93ID0gKG1uZ19mcHRyKW1uZ19zdG9yZV9qcGVnX3JnYjhfYTI7IGJyZWFrOyB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgICAgLyogVE9ETzogYml0ZGVwdGggMTIgJiAyMCAqLworICAgIGNhc2UgcG5nX2pwZWdfYTQ6CisvKiAgaWYgKHBEYXRhLT5pSkhEUmltZ2JpdGRlcHRoID09IDgpICovCisgICAgICB7CisgICAgICAgIHN3aXRjaCAocERhdGEtPmlKSERSY29sb3J0eXBlKQorICAgICAgICB7CisgICAgICAgICAgY2FzZSAxMiA6CisgICAgICAgICAgIHsgcERhdGEtPmZTdG9yZXJvdyA9IChtbmdfZnB0ciltbmdfc3RvcmVfanBlZ19nOF9hNDsgICBicmVhazsgfQorICAgICAgICAgIGNhc2UgMTQgOgorICAgICAgICAgICB7IHBEYXRhLT5mU3RvcmVyb3cgPSAobW5nX2ZwdHIpbW5nX3N0b3JlX2pwZWdfcmdiOF9hNDsgYnJlYWs7IH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisjZW5kaWYgLyogTU5HX05PXzFfMl80QklUX1NVUFBPUlQgKi8KKyAgICAgIC8qIFRPRE86IGJpdGRlcHRoIDEyICYgMjAgKi8KKyAgICBjYXNlIHBuZ19qcGVnX2E4OgorLyogIGlmIChwRGF0YS0+aUpIRFJpbWdiaXRkZXB0aCA9PSA4KSAqLworICAgICAgeworICAgICAgICBzd2l0Y2ggKHBEYXRhLT5pSkhEUmNvbG9ydHlwZSkKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgMTIgOgorICAgICAgICAgICAgeyBwRGF0YS0+ZlN0b3Jlcm93ID0gKG1uZ19mcHRyKW1uZ19zdG9yZV9qcGVnX2c4X2E4OyAgIGJyZWFrOyB9CisgICAgICAgICAgY2FzZSAxNCA6CisgICAgICAgICAgICB7IHBEYXRhLT5mU3RvcmVyb3cgPSAobW5nX2ZwdHIpbW5nX3N0b3JlX2pwZWdfcmdiOF9hODsgYnJlYWs7IH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgICAvKiBUT0RPOiBiaXRkZXB0aCAxMiAmIDIwICovCisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgY2FzZSBwbmdfanBlZ19hMTY6CisvKiAgaWYgKHBEYXRhLT5pSkhEUmltZ2JpdGRlcHRoID09IDgpICovCisgICAgICB7CisgICAgICAgIHN3aXRjaCAocERhdGEtPmlKSERSY29sb3J0eXBlKQorICAgICAgICB7CisgICAgICAgICAgY2FzZSAxMiA6CisgICAgICAgICAgICB7IHBEYXRhLT5mU3RvcmVyb3cgPSAobW5nX2ZwdHIpbW5nX3N0b3JlX2pwZWdfZzhfYTE2OyAgIGJyZWFrOyB9CisgICAgICAgICAgY2FzZSAxNCA6CisgICAgICAgICAgICB7IHBEYXRhLT5mU3RvcmVyb3cgPSAobW5nX2ZwdHIpbW5nX3N0b3JlX2pwZWdfcmdiOF9hMTY7IGJyZWFrOyB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgICAgLyogVE9ETzogYml0ZGVwdGggMTIgJiAyMCAqLworI2VuZGlmCisjZW5kaWYgLyogTU5HX0lOQ0xVREVfSk5HICovCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisjaWZkZWYgRklMVEVSMTkyICAgICAgICAgICAgICAgICAgICAgICAvKiBsZXZlbGluZyAmIGRpZmZlcmluZyA/ICovCisgIGlmIChwRGF0YS0+aUZpbHRlciA9PSBNTkdfRklMVEVSX0RJRkZFUklORykKKyAgc3dpdGNoIChwRGF0YS0+ZVBuZ19pbWd0eXBlKQorICB7CisjaWZuZGVmIE1OR19OT18xXzJfNEJJVF9TVVBQT1JUCisgICAgY2FzZSBwbmdfZzE6CisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisgICAgY2FzZSBwbmdfanBlZ19hMToKKyNlbmRpZgorICAgICAgcERhdGEtPmZEaWZmZXJyb3cgID0gKG1uZ19mcHRyKW1uZ19kaWZmZXJfZzE7CisgICAgICBicmVhazsKKyAgICBjYXNlIHBuZ19nMjoKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgICBjYXNlIHBuZ19qcGVnX2EyOgorI2VuZGlmCisgICAgICBwRGF0YS0+ZkRpZmZlcnJvdyAgPSAobW5nX2ZwdHIpbW5nX2RpZmZlcl9nMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgcG5nX2c0OgorI2lmZGVmIE1OR19JTkNMVURFX0pORworICAgIGNhc2UgcG5nX2pwZWdfYTQ6CisjZW5kaWYKKyAgICAgIHBEYXRhLT5mRGlmZmVycm93ICA9IChtbmdfZnB0ciltbmdfZGlmZmVyX2c0OworICAgICAgYnJlYWs7CisjZW5kaWYgLyogTU5HX05PXzFfMl80QklUX1NVUFBPUlQgKi8KKyAgICBjYXNlIHBuZ19nODoKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgICBjYXNlIHBuZ19qcGVnX2E4OgorI2VuZGlmCisgICAgICBwRGF0YS0+ZkRpZmZlcnJvdyAgPSAobW5nX2ZwdHIpbW5nX2RpZmZlcl9nODsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgcG5nX3JnYjg6CisgICAgICBwRGF0YS0+ZkRpZmZlcnJvdyAgPSAobW5nX2ZwdHIpbW5nX2RpZmZlcl9yZ2I4OworICAgICAgYnJlYWs7CisjaWZuZGVmIE1OR19OT18xXzJfNEJJVF9TVVBQT1JUCisgICAgY2FzZSBwbmdfaWR4MToKKyAgICAgIHBEYXRhLT5mRGlmZmVycm93ICA9IChtbmdfZnB0ciltbmdfZGlmZmVyX2lkeDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIHBuZ19pZHgyOgorICAgICAgcERhdGEtPmZEaWZmZXJyb3cgID0gKG1uZ19mcHRyKW1uZ19kaWZmZXJfaWR4MjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgcG5nX2lkeDQ6CisgICAgICBwRGF0YS0+ZkRpZmZlcnJvdyAgPSAobW5nX2ZwdHIpbW5nX2RpZmZlcl9pZHg0OworICAgICAgYnJlYWs7CisjZW5kaWYgLyogTU5HX05PXzFfMl80QklUX1NVUFBPUlQgKi8KKyAgICBjYXNlIHBuZ19pZHg4OgorICAgICAgcERhdGEtPmZEaWZmZXJyb3cgID0gKG1uZ19mcHRyKW1uZ19kaWZmZXJfaWR4ODsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgcG5nX2dhODoKKyAgICAgIHBEYXRhLT5mRGlmZmVycm93ICA9IChtbmdfZnB0ciltbmdfZGlmZmVyX2dhODsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgcG5nX3JnYjg6CisgICAgICBwRGF0YS0+ZkRpZmZlcnJvdyAgPSAobW5nX2ZwdHIpbW5nX2RpZmZlcl9yZ2I4OworICAgICAgYnJlYWs7CisgICAgY2FzZSBwbmdfcmdiYTg6CisgICAgICBwRGF0YS0+ZkRpZmZlcnJvdyAgPSAobW5nX2ZwdHIpbW5nX2RpZmZlcl9yZ2JhODsKKyAgICAgIGJyZWFrOworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgIGNhc2UgcG5nX2cxNjoKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgICBjYXNlIHBuZ19qcGVnX2ExNjoKKyNlbmRpZgorICAgICAgcERhdGEtPmZEaWZmZXJyb3cgID0gKG1uZ19mcHRyKW1uZ19kaWZmZXJfZzE2OworICAgICAgYnJlYWs7CisgICAgY2FzZSBwbmdfZ2ExNjoKKyAgICAgIHBEYXRhLT5mRGlmZmVycm93ICA9IChtbmdfZnB0ciltbmdfZGlmZmVyX2dhMTY7CisgICAgICBicmVhazsKKyAgICBjYXNlIHBuZ19yZ2IxNjoKKyAgICAgIHBEYXRhLT5mRGlmZmVycm93ICA9IChtbmdfZnB0ciltbmdfZGlmZmVyX3JnYjE2OworICAgICAgYnJlYWs7CisgICAgY2FzZSBwbmdfcmdiYTE2OgorICAgICAgcERhdGEtPmZEaWZmZXJyb3cgID0gKG1uZ19mcHRyKW1uZ19kaWZmZXJfcmdiYTE2OworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyNlbmRpZgorCisgIHN3aXRjaCAocERhdGEtPmVQbmdfaW1ndHlwZSkKKyAgeworI2lmbmRlZiBNTkdfTk9fMV8yXzRCSVRfU1VQUE9SVAorICAgIGNhc2UgcG5nX2cxOgorICAgIGNhc2UgcG5nX2lkeDE6CisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisgICAgY2FzZSBwbmdfanBlZ19hMToKKyNlbmRpZgorICAgICAgICBwRGF0YS0+aVNhbXBsZW11bCAgPSAxOworICAgICAgICBwRGF0YS0+aVNhbXBsZW9mcyAgPSA3OworICAgICAgICBwRGF0YS0+aVNhbXBsZWRpdiAgPSAzOworICAgICAgICBwRGF0YS0+aUZpbHRlcmJwcCAgPSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIHBuZ19nMjoKKyAgICBjYXNlIHBuZ19pZHgyOgorI2lmZGVmIE1OR19JTkNMVURFX0pORworICAgIGNhc2UgcG5nX2pwZWdfYTI6CisjZW5kaWYKKyAgICAgICAgcERhdGEtPmlTYW1wbGVtdWwgID0gMTsKKyAgICAgICAgcERhdGEtPmlTYW1wbGVvZnMgID0gMzsKKyAgICAgICAgcERhdGEtPmlTYW1wbGVkaXYgID0gMjsKKyAgICAgICAgcERhdGEtPmlGaWx0ZXJicHAgID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBwbmdfZzQ6CisgICAgY2FzZSBwbmdfaWR4NDoKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgICBjYXNlIHBuZ19qcGVnX2E0OgorI2VuZGlmCisgICAgICAgIHBEYXRhLT5pU2FtcGxlbXVsICA9IDE7CisgICAgICAgIHBEYXRhLT5pU2FtcGxlb2ZzICA9IDE7CisgICAgICAgIHBEYXRhLT5pU2FtcGxlZGl2ICA9IDE7CisgICAgICAgIHBEYXRhLT5pRmlsdGVyYnBwICA9IDE7CisgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIE1OR19OT18xXzJfNEJJVF9TVVBQT1JUICovCisgICAgY2FzZSBwbmdfZzg6CisgICAgY2FzZSBwbmdfaWR4ODoKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgICBjYXNlIHBuZ19qcGVnX2E4OgorI2VuZGlmCisgICAgICAgIHBEYXRhLT5pU2FtcGxlbXVsICA9IDE7CisgICAgICAgIHBEYXRhLT5pU2FtcGxlb2ZzICA9IDA7CisgICAgICAgIHBEYXRhLT5pU2FtcGxlZGl2ICA9IDA7CisgICAgICAgIHBEYXRhLT5pRmlsdGVyYnBwICA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgcG5nX2dhODoKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyAgICBjYXNlIHBuZ19nMTY6CisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisgICAgY2FzZSBwbmdfanBlZ19hMTY6CisjZW5kaWYKKyNlbmRpZgorICAgICAgICBwRGF0YS0+aVNhbXBsZW11bCAgPSAyOworICAgICAgICBwRGF0YS0+aVNhbXBsZW9mcyAgPSAwOworICAgICAgICBwRGF0YS0+aVNhbXBsZWRpdiAgPSAwOworICAgICAgICBwRGF0YS0+aUZpbHRlcmJwcCAgPSAyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIHBuZ19yZ2I4OgorICAgICAgICBwRGF0YS0+aVNhbXBsZW11bCAgPSAzOworICAgICAgICBwRGF0YS0+aVNhbXBsZW9mcyAgPSAwOworICAgICAgICBwRGF0YS0+aVNhbXBsZWRpdiAgPSAwOworICAgICAgICBwRGF0YS0+aUZpbHRlcmJwcCAgPSAzOworICAgICAgICBicmVhazsKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyAgICBjYXNlIHBuZ19nYTE2OgorI2VuZGlmCisgICAgY2FzZSBwbmdfcmdiYTg6CisgICAgICAgIHBEYXRhLT5pU2FtcGxlbXVsICA9IDQ7CisgICAgICAgIHBEYXRhLT5pU2FtcGxlb2ZzICA9IDA7CisgICAgICAgIHBEYXRhLT5pU2FtcGxlZGl2ICA9IDA7CisgICAgICAgIHBEYXRhLT5pRmlsdGVyYnBwICA9IDQ7CisgICAgICAgIGJyZWFrOworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgIGNhc2UgcG5nX3JnYjE2OgorICAgICAgICBwRGF0YS0+aVNhbXBsZW11bCAgPSA2OworICAgICAgICBwRGF0YS0+aVNhbXBsZW9mcyAgPSAwOworICAgICAgICBwRGF0YS0+aVNhbXBsZWRpdiAgPSAwOworICAgICAgICBwRGF0YS0+aUZpbHRlcmJwcCAgPSA2OworICAgICAgICBicmVhazsKKyAgICBjYXNlIHBuZ19yZ2JhMTY6CisgICAgICAgIHBEYXRhLT5pU2FtcGxlbXVsICA9IDg7CisgICAgICAgIHBEYXRhLT5pU2FtcGxlb2ZzICA9IDA7CisgICAgICAgIHBEYXRhLT5pU2FtcGxlZGl2ICA9IDA7CisgICAgICAgIHBEYXRhLT5pRmlsdGVyYnBwICA9IDg7CisgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgIH0KKworICBpZiAocERhdGEtPmlJbnRlcmxhY2UpICAgICAgICAgICAgICAgLyogbm9uaW50ZXJsYWNlZCAqLworICB7CisgICAgcERhdGEtPmlQYXNzICAgICAgID0gMDsgICAgICAvKiBmcm9tIDAuLjY7ICgxLi43IGluIHNwZWNpZmljYXRpb24pICovCisgICAgcERhdGEtPmlSb3cgICAgICAgID0gaW50ZXJsYWNlX3JvdyAgICAgWzBdOworICAgIHBEYXRhLT5pUm93aW5jICAgICA9IGludGVybGFjZV9yb3dza2lwIFswXTsKKyAgICBwRGF0YS0+aUNvbCAgICAgICAgPSBpbnRlcmxhY2VfY29sICAgICBbMF07CisgICAgcERhdGEtPmlDb2xpbmMgICAgID0gaW50ZXJsYWNlX2NvbHNraXAgWzBdOworICAgIHBEYXRhLT5pUm93c2FtcGxlcyA9IChwRGF0YS0+aURhdGF3aWR0aCArIGludGVybGFjZV9yb3VuZG9mZiBbMF0pID4+CisgICAgICAgaW50ZXJsYWNlX2RpdmlkZXIgWzBdOworICAgIHBEYXRhLT5pUm93bWF4ICAgICA9ICgocERhdGEtPmlEYXRhd2lkdGggKiBwRGF0YS0+aVNhbXBsZW11bCArCisgICAgICAgcERhdGEtPmlTYW1wbGVvZnMpID4+IHBEYXRhLT5pU2FtcGxlZGl2KSArIHBEYXRhLT5pUGl4ZWxvZnM7CisgIH0KKyAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGludGVybGFjZWQgKi8KKyAgeworICAgIHBEYXRhLT5pUGFzcyAgICAgICA9IC0xOworICAgIHBEYXRhLT5pUm93ICAgICAgICA9IDA7CisgICAgcERhdGEtPmlSb3dpbmMgICAgID0gMTsKKyAgICBwRGF0YS0+aUNvbCAgICAgICAgPSAwOworICAgIHBEYXRhLT5pQ29saW5jICAgICA9IDE7CisgICAgcERhdGEtPmlSb3dzYW1wbGVzID0gcERhdGEtPmlEYXRhd2lkdGg7CisgIH0KKyAgaWYgKHBEYXRhLT5pU2FtcGxlZGl2ID4gMCkKKyAgICAgcERhdGEtPmlSb3dzaXplICAgID0gKHBEYXRhLT5pUm93c2FtcGxlcyArIHBEYXRhLT5pU2FtcGxlb2ZzKSA+PgorICAgICAgICAgcERhdGEtPmlTYW1wbGVkaXY7CisgIGVsc2UKKyAgICAgcERhdGEtPmlSb3dzaXplICAgID0gKHBEYXRhLT5pUm93c2FtcGxlcyAqIHBEYXRhLT5pU2FtcGxlbXVsKTsKKworICBpZiAoIXBEYXRhLT5pSW50ZXJsYWNlKSAgICAgICAgICAgICAgIC8qIG5vbmludGVybGFjZWQgKi8KKyAgICAgcERhdGEtPmlSb3dtYXggICAgID0gcERhdGEtPmlSb3dzaXplICsgcERhdGEtPmlQaXhlbG9mczsKKworI2lmZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgIHBEYXRhLT5iSXNSR0JBMTYgPSBNTkdfRkFMU0U7CisjZWxzZQorICBzd2l0Y2ggKHBEYXRhLT5lUG5nX2ltZ3R5cGUpCisgIHsKKyAgICBjYXNlIHBuZ19nMTY6CisgICAgY2FzZSBwbmdfZ2ExNjoKKyAgICBjYXNlIHBuZ19yZ2IxNjoKKyAgICBjYXNlIHBuZ19yZ2JhMTY6CisgICAgICAgcERhdGEtPmJJc1JHQkExNiA9IE1OR19UUlVFOworICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgcERhdGEtPmJJc1JHQkExNiA9IE1OR19GQUxTRTsKKyAgICAgICBicmVhazsKKyAgfQorI2VuZGlmCisKKyAgfQorI2VuZGlmIC8qIE1OR19PUFRJTUlaRV9GT09UUFJJTlRfSU5JVCAqLworCisgIGlmIChwRGF0YS0+cFN0b3Jlb2JqKSAgICAgICAgICAgICAgICAvKiBzdG9yYWdlIG9iamVjdCBzZWxlY3RlZCA/ICovCisgIHsKKyAgICBwRGF0YS0+cFN0b3JlYnVmID0gKChtbmdfaW1hZ2VwKXBEYXRhLT5wU3RvcmVvYmopLT5wSW1nYnVmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHNvIGl0IGJlY29tZXMgdmlld2FibGUgISAqLworICAgICgobW5nX2ltYWdlcClwRGF0YS0+cFN0b3Jlb2JqKS0+YlZpZXdhYmxlICAgICA9IE1OR19UUlVFOworICAgICgobW5nX2ltYWdlZGF0YXApcERhdGEtPnBTdG9yZWJ1ZiktPmJWaWV3YWJsZSA9IE1OR19UUlVFOworICB9CisKKyAgLyogYWxsb2NhdGUgdGhlIGJ1ZmZlcnM7IHRoZSBpbmRpdmlkdWFsIGluaXQgcm91dGluZXMgaGF2ZSBhbHJlYWR5CisgICAgIGNhbGN1bGF0ZWQgdGhlIHJlcXVpcmVkIG1heGltdW0gc2l6ZTsgZXhjZXB0IGluIHRoZSBjYXNlIG9mIGEgSk5HCisgICAgIHdpdGhvdXQgYWxwaGEhISEgKi8KKyAgaWYgKHBEYXRhLT5pUm93bWF4KQorICB7CisjaWYgZGVmaW5lZChNTkdfTk9fMTZCSVRfU1VQUE9SVCkgfHwgZGVmaW5lZCAoTU5HX05PXzFfMl80QklUX1NVUFBPUlQpCisgICAgbW5nX3VpbnQ4IGlSb3dhZGQgPSAwOworI2lmZGVmIE1OR19OT18xXzJfNEJJVF9TVVBQT1JUCisgICAgaWYgKHBEYXRhLT5pUE5HZGVwdGggPCA4KQorICAgICAgIGlSb3dhZGQ9KHBEYXRhLT5pUE5HZGVwdGgqcERhdGEtPmlSb3dtYXgrNykvODsKKyNlbmRpZgorI2lmZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisgICAgaWYgKHBEYXRhLT5pUE5HZGVwdGggPiA4KQorICAgICAgIGlSb3dhZGQ9cERhdGEtPmlSb3dtYXg7CisjZW5kaWYKKyAgICBNTkdfQUxMT0MgKHBEYXRhLCBwRGF0YS0+cFdvcmtyb3csIHBEYXRhLT5pUm93bWF4K2lSb3dhZGQpOworICAgIE1OR19BTExPQyAocERhdGEsIHBEYXRhLT5wUHJldnJvdywgcERhdGEtPmlSb3dtYXgraVJvd2FkZCk7CisjZWxzZQorICAgIE1OR19BTExPQyAocERhdGEsIHBEYXRhLT5wV29ya3JvdywgcERhdGEtPmlSb3dtYXgpOworICAgIE1OR19BTExPQyAocERhdGEsIHBEYXRhLT5wUHJldnJvdywgcERhdGEtPmlSb3dtYXgpOworI2VuZGlmCisgIH0KKworICAvKiBhbGxvY2F0ZSBhbiBSR0JBMTYgcm93IGZvciBpbnRlcm1lZGlhdGUgcHJvY2Vzc2luZyAqLworICBNTkdfQUxMT0MgKHBEYXRhLCBwRGF0YS0+cFJHQkFyb3csIChwRGF0YS0+aURhdGF3aWR0aCA8PCAzKSk7CisKKyNpZm5kZWYgTU5HX05PX0NNUworICBpZiAocERhdGEtPmZEaXNwbGF5cm93KSAgICAgICAgICAgICAgLyogZGlzcGxheSAib24tdGhlLWZseSIgPyAqLworICB7CisjaWYgZGVmaW5lZChNTkdfRlVMTF9DTVMpICAgICAgICAgICAgICAvKiBkZXRlcm1pbmUgY29sb3ItbWFuYWdlbWVudCBpbml0aWFsaXphdGlvbiAqLworICAgIG1uZ19yZXRjb2RlIGlSZXRjb2RlID0gbW5nX2luaXRfZnVsbF9jbXMgICAocERhdGEsIE1OR19UUlVFLCBNTkdfVFJVRSwgTU5HX0ZBTFNFKTsKKyNlbGlmIGRlZmluZWQoTU5HX0dBTU1BX09OTFkpCisgICAgbW5nX3JldGNvZGUgaVJldGNvZGUgPSBtbmdfaW5pdF9nYW1tYV9vbmx5IChwRGF0YSwgTU5HX1RSVUUsIE1OR19UUlVFLCBNTkdfRkFMU0UpOworI2VsaWYgZGVmaW5lZChNTkdfQVBQX0NNUykKKyAgICBtbmdfcmV0Y29kZSBpUmV0Y29kZSA9IG1uZ19pbml0X2FwcF9jbXMgICAgKHBEYXRhLCBNTkdfVFJVRSwgTU5HX1RSVUUsIE1OR19GQUxTRSk7CisjZW5kaWYKKyAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICByZXR1cm4gaVJldGNvZGU7CisgIH0KKyNlbmRpZiAvKiAhTU5HX05PX0NNUyAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0lOSVRfUk9XUFJPQywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19uZXh0X3JvdyAobW5nX2RhdGFwIHBEYXRhKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ORVhUX1JPVywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBEYXRhLT5pUm93ICs9IHBEYXRhLT5pUm93aW5jOyAgICAgICAvKiBpbmNyZWFzZSB0aGUgcm93IGNvdW50ZXIgKi8KKworICBpZiAocERhdGEtPmlQYXNzID49IDApICAgICAgICAgICAgICAgLyogaW50ZXJsYWNlZCA/ICovCisgIHsKKyAgICB3aGlsZSAoKHBEYXRhLT5pUGFzcyA8IDcpICYmICAgICAgIC8qIHdlbnQgJ291dHNpZGUnIHRoZSBpbWFnZSA/ICovCisgICAgICAgICAgICgocERhdGEtPmlSb3cgPj0gKG1uZ19pbnQzMilwRGF0YS0+aURhdGFoZWlnaHQpIHx8CisgICAgICAgICAgICAocERhdGEtPmlDb2wgPj0gKG1uZ19pbnQzMilwRGF0YS0+aURhdGF3aWR0aCApICAgICkpCisgICAgeworICAgICAgcERhdGEtPmlQYXNzKys7ICAgICAgICAgICAgICAgICAgLyogbmV4dCBwYXNzICEgKi8KKworICAgICAgaWYgKHBEYXRhLT5pUGFzcyA8IDcpICAgICAgICAgICAgLyogdGhlcmUncyBvbmx5IDcgcGFzc2VzICEgKi8KKyAgICAgIHsKKyAgICAgICAgcERhdGEtPmlSb3cgICAgICAgID0gaW50ZXJsYWNlX3JvdyAgICAgW3BEYXRhLT5pUGFzc107CisgICAgICAgIHBEYXRhLT5pUm93aW5jICAgICA9IGludGVybGFjZV9yb3dza2lwIFtwRGF0YS0+aVBhc3NdOworICAgICAgICBwRGF0YS0+aUNvbCAgICAgICAgPSBpbnRlcmxhY2VfY29sICAgICBbcERhdGEtPmlQYXNzXTsKKyAgICAgICAgcERhdGEtPmlDb2xpbmMgICAgID0gaW50ZXJsYWNlX2NvbHNraXAgW3BEYXRhLT5pUGFzc107CisgICAgICAgIHBEYXRhLT5pUm93c2FtcGxlcyA9IChwRGF0YS0+aURhdGF3aWR0aCAtIHBEYXRhLT5pQ29sICsgaW50ZXJsYWNlX3JvdW5kb2ZmIFtwRGF0YS0+aVBhc3NdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gaW50ZXJsYWNlX2RpdmlkZXIgW3BEYXRhLT5pUGFzc107CisKKyAgICAgICAgaWYgKHBEYXRhLT5pU2FtcGxlbXVsID4gMSkgICAgIC8qIHJlY2FsY3VsYXRlIHJvdyBkaW1lbnNpb24gKi8KKyAgICAgICAgICBwRGF0YS0+aVJvd3NpemUgID0gcERhdGEtPmlSb3dzYW1wbGVzICogcERhdGEtPmlTYW1wbGVtdWw7CisgICAgICAgIGVsc2UKKyAgICAgICAgaWYgKHBEYXRhLT5pU2FtcGxlZGl2ID4gMCkKKyAgICAgICAgICBwRGF0YS0+aVJvd3NpemUgID0gKHBEYXRhLT5pUm93c2FtcGxlcyArIHBEYXRhLT5pU2FtcGxlb2ZzKSA+PiBwRGF0YS0+aVNhbXBsZWRpdjsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHBEYXRhLT5pUm93c2l6ZSAgPSBwRGF0YS0+aVJvd3NhbXBsZXM7CisKKyAgICAgIH0KKworICAgICAgaWYgKChwRGF0YS0+aVBhc3MgPCA3KSAmJiAgICAgICAgLyogcmVzZXQgcHJldmlvdXMgcm93IHRvIHplcm9lcyA/ICovCisgICAgICAgICAgKHBEYXRhLT5pUm93ICA8IChtbmdfaW50MzIpcERhdGEtPmlEYXRhaGVpZ2h0KSAmJgorICAgICAgICAgIChwRGF0YS0+aUNvbCAgPCAobW5nX2ludDMyKXBEYXRhLT5pRGF0YXdpZHRoICkgICAgKQorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWFraW5nIHN1cmUgdGhlIGZpbHRlcnMgd2lsbCB3b3JrIHByb3Blcmx5ISAqLworICAgICAgICBtbmdfaW50MzIgIGlYOworICAgICAgICBtbmdfdWludDhwIHBUZW1wID0gcERhdGEtPnBQcmV2cm93OworCisjaWZkZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVBOR211bHQqcERhdGEtPmlSb3dzaXplOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICAgICAgICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVBOR211bHQqcERhdGEtPmlSb3dzaXplOyBpWCsrKQorI2VuZGlmCisjZWxzZQorI2lmZGVmIE1OR19ERUNSRU1FTlRfTE9PUFMKKyAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2l6ZTsgaVggPiAwOyBpWC0tKQorI2Vsc2UKKyAgICAgICAgZm9yIChpWCA9IDA7IGlYIDwgcERhdGEtPmlSb3dzaXplOyBpWCsrKQorI2VuZGlmCisjZW5kaWYKKyAgICAgICAgeworICAgICAgICAgICpwVGVtcCA9IDA7CisgICAgICAgICAgcFRlbXArKzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX05FWFRfUk9XLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX2NsZWFudXBfcm93cHJvYyAobW5nX2RhdGFwIHBEYXRhKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9DTEVBTlVQX1JPV1BST0MsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworI2lmZGVmIE1OR19JTkNMVURFX0xDTVMgICAgICAgICAgICAgICAgLyogY2xlYW51cCBjbXMgcHJvZmlsZS90cmFuc2Zvcm0gKi8KKyAgeworICAgIG1uZ19yZXRjb2RlIGlSZXRjb2RlID0gbW5nX2NsZWFyX2NtcyAocERhdGEpOworICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgfQorI2VuZGlmIC8qIE1OR19JTkNMVURFX0xDTVMgKi8KKworICBpZiAocERhdGEtPnBSR0JBcm93KSAgICAgICAgICAgICAgICAgLyogY2xlYW51cCBidWZmZXIgZm9yIGludGVybWVkaWF0ZSByb3cgKi8KKyAgICBNTkdfRlJFRVggKHBEYXRhLCBwRGF0YS0+cFJHQkFyb3csIChwRGF0YS0+aURhdGF3aWR0aCA8PCAzKSk7CisgIGlmIChwRGF0YS0+cFByZXZyb3cpICAgICAgICAgICAgICAgICAvKiBjbGVhbnVwIGJ1ZmZlciBmb3IgcHJldmlvdXMgcm93ICovCisgICAgTU5HX0ZSRUVYIChwRGF0YSwgcERhdGEtPnBQcmV2cm93LCBwRGF0YS0+aVJvd21heCk7CisgIGlmIChwRGF0YS0+cFdvcmtyb3cpICAgICAgICAgICAgICAgICAvKiBjbGVhbnVwIGJ1ZmZlciBmb3Igd29ya2luZyByb3cgKi8KKyAgICBNTkdfRlJFRVggKHBEYXRhLCBwRGF0YS0+cFdvcmtyb3csIHBEYXRhLT5pUm93bWF4KTsKKworICBwRGF0YS0+cFdvcmtyb3cgPSBNTkdfTlVMTDsgICAgICAgICAgLyogcHJvcG9nYXRlIHVuaW5pdGlhbGl6ZWQgYnVmZmVycyAqLworICBwRGF0YS0+cFByZXZyb3cgPSBNTkdfTlVMTDsKKyAgcERhdGEtPnBSR0JBcm93ID0gTU5HX05VTEw7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQ0xFQU5VUF9ST1dQUk9DLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsgICAgICAgICAgICAgICAgICAvKiB3b29oaWlpICovCit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBHZW5lcmljIHJvdyBwcm9jZXNzaW5nIHJvdXRpbmVzIGZvciBKTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19kaXNwbGF5X2pwZWdfcm93cyAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfcmV0Y29kZSBpUmV0Y29kZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ESVNQTEFZX0pQRUdfUk9XUywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW55IGNvbXBsZXRlZCByb3dzID8gKi8KKyAgaWYgKChwRGF0YS0+aUpQRUdyb3cgICAgICA+IHBEYXRhLT5pSlBFR2Rpc3Byb3cpICYmCisgICAgICAocERhdGEtPmlKUEVHYWxwaGFyb3cgPiBwRGF0YS0+aUpQRUdkaXNwcm93KSAgICApCisgIHsKKyAgICBtbmdfdWludDMyIGlYLCBpTWF4OworICAgIG1uZ191aW50MzIgaVNhdmVyb3cgPSBwRGF0YS0+aVJvdzsgLyogc2F2ZSBhbHBoYSBkZWNvbXByZXNzaW9uIHJvdy1jb3VudCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGV0ZXJtaW5lIHRoZSBoaWdoZXN0IGNvbXBsZXRlKCEpIHJvdyAqLworICAgIGlmIChwRGF0YS0+aUpQRUdyb3cgPiBwRGF0YS0+aUpQRUdhbHBoYXJvdykKKyAgICAgIGlNYXggPSBwRGF0YS0+aUpQRUdhbHBoYXJvdzsKKyAgICBlbHNlCisgICAgICBpTWF4ID0gcERhdGEtPmlKUEVHcm93OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGlzcGxheSB0aGUgcm93cyAqLworICAgIGZvciAoaVggPSBwRGF0YS0+aUpQRUdkaXNwcm93OyBpWCA8IGlNYXg7IGlYKyspCisgICAgeworICAgICAgcERhdGEtPmlSb3cgPSBpWDsgICAgICAgICAgICAgICAgLyogbWFrZSBzdXJlIHdlIGFsbCBrbm93IHdoaWNoIHJvdyB0byBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1ha2V1cCBhbiBpbnRlcm1lZGlhdGUgcm93IGZyb20gdGhlIGJ1ZmZlciAqLworICAgICAgaVJldGNvZGUgPSAoKG1uZ19yZXRyaWV2ZXJvdylwRGF0YS0+ZlJldHJpZXZlcm93KSAocERhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29sb3ItY29ycmVjdCBpdCBpZiBuZWNlc3NhcnkgKi8KKyAgICAgIGlmICgoIWlSZXRjb2RlKSAmJiAocERhdGEtPmZDb3JyZWN0cm93KSkKKyAgICAgICAgaVJldGNvZGUgPSAoKG1uZ19jb3JyZWN0cm93KXBEYXRhLT5mQ29ycmVjdHJvdykgKHBEYXRhKTsKKworICAgICAgaWYgKCFpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgLyogYW5kIGRpc3BsYXkgaXQgKi8KKyAgICAgIHsKKyAgICAgICAgaVJldGNvZGUgPSAoKG1uZ19kaXNwbGF5cm93KXBEYXRhLT5mRGlzcGxheXJvdykgKHBEYXRhKTsKKworICAgICAgICBpZiAoIWlSZXRjb2RlKSAgICAgICAgICAgICAgICAgLyogY2hlY2sgcHJvZ3Jlc3NpdmUgZGlzcGxheSByZWZyZXNoICovCisgICAgICAgICAgaVJldGNvZGUgPSBtbmdfZGlzcGxheV9wcm9ncmVzc2l2ZV9jaGVjayAocERhdGEpOworICAgICAgfQorCisgICAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgfQorCisgICAgcERhdGEtPmlKUEVHZGlzcHJvdyA9IGlNYXg7ICAgICAgICAvKiBrZWVwIHRyYWNrIG9mIHRoZSBsYXN0IGRpc3BsYXllZCByb3cgKi8KKyAgICBwRGF0YS0+aVJvdyAgICAgICAgID0gaVNhdmVyb3c7ICAgIC8qIHJlc3RvcmUgYWxwaGEgZGVjb21wcmVzc2lvbiByb3ctY291bnQgKi8KKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RJU1BMQVlfSlBFR19ST1dTLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX25leHRfanBlZ19hbHBoYXJvdyAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfcmV0Y29kZSBpUmV0Y29kZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9ORVhUX0pQRUdfQUxQSEFST1csIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBwRGF0YS0+aUpQRUdhbHBoYXJvdysrOyAgICAgICAgICAgICAgLyogY291bnQgdGhlIHJvdyAqLworCisgIGlmIChwRGF0YS0+ZkRpc3BsYXlyb3cpICAgICAgICAgICAgICAvKiBkaXNwbGF5ICJvbi10aGUtZmx5IiA/ICovCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cnkgdG8gZGlzcGxheSB3aGF0IHlvdSBjYW4gKi8KKyAgICBpUmV0Y29kZSA9IG1uZ19kaXNwbGF5X2pwZWdfcm93cyAocERhdGEpOworCisgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgcmV0dXJuIGlSZXRjb2RlOworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fTkVYVF9KUEVHX0FMUEhBUk9XLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX25leHRfanBlZ19yb3cgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX3JldGNvZGUgaVJldGNvZGU7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fTkVYVF9KUEVHX1JPVywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBEYXRhLT5pSlBFR3JvdysrOyAgICAgICAgICAgICAgICAgICAvKiBpbmNyZWFzZSB0aGUgcm93LWNvdW50ZXIgKi8KKworICBpZiAocERhdGEtPmZEaXNwbGF5cm93KSAgICAgICAgICAgICAgLyogZGlzcGxheSAib24tdGhlLWZseSIgPyAqLworICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaGFzIGFscGhhIGNoYW5uZWwgPyAqLworICAgIGlmICgocERhdGEtPmlKSERSY29sb3J0eXBlID09IE1OR19DT0xPUlRZUEVfSlBFR0dSQVlBICkgfHwKKyAgICAgICAgKHBEYXRhLT5pSkhEUmNvbG9ydHlwZSA9PSBNTkdfQ09MT1JUWVBFX0pQRUdDT0xPUkEpICAgICkKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRyeSB0byBkaXNwbGF5IHdoYXQgeW91IGNhbiAqLworICAgICAgaVJldGNvZGUgPSBtbmdfZGlzcGxheV9qcGVnX3Jvd3MgKHBEYXRhKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWFrZSBzdXJlIHdlIGFsbCBrbm93IHdoaWNoIHJvdyB0byBoYW5kbGUgKi8KKyAgICAgIHBEYXRhLT5pUm93ID0gcERhdGEtPmlKUEVHcm93IC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1ha2V1cCBhbiBpbnRlcm1lZGlhdGUgcm93IGZyb20gdGhlIGJ1ZmZlciAqLworICAgICAgaVJldGNvZGUgPSAoKG1uZ19yZXRyaWV2ZXJvdylwRGF0YS0+ZlJldHJpZXZlcm93KSAocERhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29sb3ItY29ycmVjdCBpdCBpZiBuZWNlc3NhcnkgKi8KKyAgICAgIGlmICgoIWlSZXRjb2RlKSAmJiAocERhdGEtPmZDb3JyZWN0cm93KSkKKyAgICAgICAgaVJldGNvZGUgPSAoKG1uZ19jb3JyZWN0cm93KXBEYXRhLT5mQ29ycmVjdHJvdykgKHBEYXRhKTsKKworICAgICAgaWYgKCFpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgLyogYW5kIGRpc3BsYXkgaXQgKi8KKyAgICAgIHsKKyAgICAgICAgaVJldGNvZGUgPSAoKG1uZ19kaXNwbGF5cm93KXBEYXRhLT5mRGlzcGxheXJvdykgKHBEYXRhKTsKKworICAgICAgICBpZiAoIWlSZXRjb2RlKSAgICAgICAgICAgICAgICAgLyogY2hlY2sgcHJvZ3Jlc3NpdmUgZGlzcGxheSByZWZyZXNoICovCisgICAgICAgICAgaVJldGNvZGUgPSBtbmdfZGlzcGxheV9wcm9ncmVzc2l2ZV9jaGVjayAocERhdGEpOworICAgICAgfQorICAgIH0KKworICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdXJwYXNzZWQgbGFzdCBmaWxsZWQgcm93ID8gKi8KKyAgaWYgKHBEYXRhLT5pSlBFR3JvdyA+IHBEYXRhLT5pSlBFR3JnYnJvdykKKyAgICBwRGF0YS0+aUpQRUdyZ2Jyb3cgPSBwRGF0YS0+aUpQRUdyb3c7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fTkVYVF9KUEVHX1JPVywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNlbmRpZiAvKiBNTkdfSU5DTFVERV9KTkcgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfU0tJUENIVU5LX01BR04KKyNpZm5kZWYgTU5HX09QVElNSVpFX0ZPT1RQUklOVF9NQUdOCisjaWZuZGVmIE1OR19OT19HUkFZX1NVUFBPUlQKK21uZ19yZXRjb2RlIG1uZ19tYWduaWZ5X2c4X3gxIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1YLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcFNyY2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSkKK3sKKyAgbW5nX3VpbnQzMiBpWCwgaVMsIGlNOworICBtbmdfdWludDhwIHBUZW1wc3JjMTsKKyAgbW5nX3VpbnQ4cCBwVGVtcGRzdDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9NQUdOSUZZX0c4X1gxLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcFRlbXBzcmMxID0gcFNyY2xpbmU7ICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpemUgcGl4ZWwtbG9vcCAqLworICBwVGVtcGRzdCAgPSBwRHN0bGluZTsKKworICBmb3IgKGlYID0gMDsgaVggPCBpV2lkdGg7IGlYKyspCisgIHsKKyAgICAqcFRlbXBkc3QgPSAqcFRlbXBzcmMxOyAgICAgICAgICAgIC8qIGNvcHkgb3JpZ2luYWwgc291cmNlIHBpeGVsICovCisgICAgcFRlbXBkc3QrKzsKKworICAgIGlmIChpWCA9PSAwKSAgICAgICAgICAgICAgICAgICAgICAgLyogZmlyc3QgaW50ZXJ2YWwgPyAqLworICAgICAgaU0gPSBpTUw7CisgICAgZWxzZQorICAgIGlmIChpWCA9PSAoaVdpZHRoIC0gMSkpICAgICAgICAgICAgLyogbGFzdCBpbnRlcnZhbCA/ICovCisgICAgICBpTSA9IGlNUjsKKyAgICBlbHNlCisgICAgICBpTSA9IGlNWDsKKworICAgIGZvciAoaVMgPSAxOyBpUyA8IGlNOyBpUysrKSAgICAgICAgLyogZmlsbCBpbnRlcnZhbCAqLworICAgIHsKKyAgICAgICpwVGVtcGRzdCA9ICpwVGVtcHNyYzE7ICAgICAgICAgIC8qIGNvcHkgb3JpZ2luYWwgc291cmNlIHBpeGVsICovCisgICAgICBwVGVtcGRzdCsrOworICAgIH0KKworICAgIHBUZW1wc3JjMSsrOworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fTUFHTklGWV9HOF9YMSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19tYWduaWZ5X2c4X3gyIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1YLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcFNyY2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSkKK3sKKyAgbW5nX3VpbnQzMiBpWDsKKyAgbW5nX2ludDMyICBpUywgaU07CisgIG1uZ191aW50OHAgcFRlbXBzcmMxOworICBtbmdfdWludDhwIHBUZW1wc3JjMjsKKyAgbW5nX3VpbnQ4cCBwVGVtcGRzdDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9NQUdOSUZZX0c4X1gyLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcFRlbXBzcmMxID0gcFNyY2xpbmU7ICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpemUgcGl4ZWwtbG9vcCAqLworICBwVGVtcGRzdCAgPSBwRHN0bGluZTsKKworICBmb3IgKGlYID0gMDsgaVggPCBpV2lkdGg7IGlYKyspCisgIHsKKyAgICBwVGVtcHNyYzIgPSBwVGVtcHNyYzEgKyAxOworCisgICAgKnBUZW1wZHN0ID0gKnBUZW1wc3JjMTsgICAgICAgICAgICAvKiBjb3B5IG9yaWdpbmFsIHNvdXJjZSBwaXhlbCAqLworICAgIHBUZW1wZHN0Kys7CisKKyAgICBpZiAoaVggPT0gMCkgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpcnN0IGludGVydmFsID8gKi8KKyAgICB7CisgICAgICBpZiAoaVdpZHRoID09IDEpICAgICAgICAgICAgICAgICAvKiBzaW5nbGUgcGl4ZWwgPyAqLworICAgICAgICBwVGVtcHNyYzIgPSBNTkdfTlVMTDsKKworICAgICAgaU0gPSBpTUw7CisgICAgfQorICAgIGVsc2UKKyAgICBpZiAoaVggPT0gKGlXaWR0aCAtIDIpKSAgICAgICAgICAgIC8qIGxhc3QgaW50ZXJ2YWwgPyAqLworICAgICAgaU0gPSBpTVI7CisgICAgZWxzZQorICAgICAgaU0gPSBpTVg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaWxsIGludGVydmFsID8gKi8KKyAgICBpZiAoKGlYIDwgaVdpZHRoIC0gMSkgfHwgKGlXaWR0aCA9PSAxKSkKKyAgICB7CisgICAgICBpZiAocFRlbXBzcmMyKSAgICAgICAgICAgICAgICAgICAvKiBkbyB3ZSBoYXZlIHRoZSBzZWNvbmQgcGl4ZWwgPyAqLworICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaXMgaXQgc2FtZSBhcyBmaXJzdCA/ICovCisgICAgICAgIGlmICgqcFRlbXBzcmMxID09ICpwVGVtcHNyYzIpCisgICAgICAgIHsKKyAgICAgICAgICBmb3IgKGlTID0gMTsgaVMgPCBpTTsgaVMrKykgIC8qIHRoZW4ganVzdCByZXBlYXQgdGhlIGZpcnN0ICovCisgICAgICAgICAgeworICAgICAgICAgICAgKnBUZW1wZHN0ID0gKnBUZW1wc3JjMTsKKyAgICAgICAgICAgIHBUZW1wZHN0Kys7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGZvciAoaVMgPSAxOyBpUyA8IGlNOyBpUysrKSAgLyogY2FsY3VsYXRlIHRoZSBkaXN0YW5jZXMgKi8KKyAgICAgICAgICB7CisgICAgICAgICAgICAqcFRlbXBkc3QgPSAobW5nX3VpbnQ4KSgoKDIgKiBpUyAqICggKG1uZ19pbnQzMikoKnBUZW1wc3JjMikgICAgIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX2ludDMyKSgqcFRlbXBzcmMxKSAgICAgKSArIGlNKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlNICogMikpICsgKG1uZ19pbnQzMikoKnBUZW1wc3JjMSkgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIHBUZW1wZHN0Kys7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGZvciAoaVMgPSAxOyBpUyA8IGlNOyBpUysrKQorICAgICAgICB7CisgICAgICAgICAgKnBUZW1wZHN0ID0gKnBUZW1wc3JjMTsgICAgICAvKiByZXBlYXQgZmlyc3Qgc291cmNlIHBpeGVsICovCisgICAgICAgICAgcFRlbXBkc3QrKzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHBUZW1wc3JjMSsrOworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fTUFHTklGWV9HOF9YMiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19tYWduaWZ5X2c4X3gzIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1YLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcFNyY2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSkKK3sKKyAgbW5nX3VpbnQzMiBpWDsKKyAgbW5nX2ludDMyICBpUywgaU0sIGlIOworICBtbmdfdWludDhwIHBUZW1wc3JjMTsKKyAgbW5nX3VpbnQ4cCBwVGVtcHNyYzI7CisgIG1uZ191aW50OHAgcFRlbXBkc3Q7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fTUFHTklGWV9HOF9YMywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBUZW1wc3JjMSA9IHBTcmNsaW5lOyAgICAgICAgICAgICAgICAvKiBpbml0aWFsaXplIHBpeGVsLWxvb3AgKi8KKyAgcFRlbXBkc3QgID0gcERzdGxpbmU7CisKKyAgZm9yIChpWCA9IDA7IGlYIDwgaVdpZHRoOyBpWCsrKQorICB7CisgICAgcFRlbXBzcmMyID0gcFRlbXBzcmMxICsgMTsKKworICAgICpwVGVtcGRzdCA9ICpwVGVtcHNyYzE7ICAgICAgICAgICAgLyogY29weSBvcmlnaW5hbCBzb3VyY2UgcGl4ZWwgKi8KKyAgICBwVGVtcGRzdCsrOworCisgICAgaWYgKGlYID09IDApICAgICAgICAgICAgICAgICAgICAgICAvKiBmaXJzdCBpbnRlcnZhbCA/ICovCisgICAgeworICAgICAgaWYgKGlXaWR0aCA9PSAxKSAgICAgICAgICAgICAgICAgLyogc2luZ2xlIHBpeGVsID8gKi8KKyAgICAgICAgcFRlbXBzcmMyID0gTU5HX05VTEw7CisKKyAgICAgIGlNID0gaU1MOworICAgIH0KKyAgICBlbHNlCisgICAgaWYgKGlYID09IChpV2lkdGggLSAyKSkgICAgICAgICAgICAvKiBsYXN0IGludGVydmFsID8gKi8KKyAgICAgIGlNID0gaU1SOworICAgIGVsc2UKKyAgICAgIGlNID0gaU1YOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmlsbCBpbnRlcnZhbCA/ICovCisgICAgaWYgKChpWCA8IGlXaWR0aCAtIDEpIHx8IChpV2lkdGggPT0gMSkpCisgICAgeworICAgICAgaWYgKHBUZW1wc3JjMikgICAgICAgICAgICAgICAgICAgLyogZG8gd2UgaGF2ZSB0aGUgc2Vjb25kIHBpeGVsID8gKi8KKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlzIGl0IHNhbWUgYXMgZmlyc3QgPyAqLworICAgICAgICBpZiAoKnBUZW1wc3JjMSA9PSAqcFRlbXBzcmMyKQorICAgICAgICB7CisgICAgICAgICAgZm9yIChpUyA9IDE7IGlTIDwgaU07IGlTKyspICAvKiB0aGVuIGp1c3QgcmVwZWF0IHRoZSBmaXJzdCAqLworICAgICAgICAgIHsKKyAgICAgICAgICAgICpwVGVtcGRzdCA9ICpwVGVtcHNyYzE7CisgICAgICAgICAgICBwVGVtcGRzdCsrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBpSCA9IChpTSsxKSAvIDI7ICAgICAgICAgICAgIC8qIGNhbGN1bGF0ZSBoYWxmd2F5IHBvaW50ICovCisKKyAgICAgICAgICBmb3IgKGlTID0gMTsgaVMgPCBpSDsgaVMrKykgIC8qIHJlcGxpY2F0ZSBmaXJzdCBoYWxmICovCisgICAgICAgICAgeworICAgICAgICAgICAgKnBUZW1wZHN0ID0gKnBUZW1wc3JjMTsKKyAgICAgICAgICAgIHBUZW1wZHN0Kys7CisgICAgICAgICAgfQorCisgICAgICAgICAgZm9yIChpUyA9IGlIOyBpUyA8IGlNOyBpUysrKSAvKiByZXBsaWNhdGUgc2Vjb25kIGhhbGYgKi8KKyAgICAgICAgICB7CisgICAgICAgICAgICAqcFRlbXBkc3QgPSAqcFRlbXBzcmMyOworICAgICAgICAgICAgcFRlbXBkc3QrKzsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZm9yIChpUyA9IDE7IGlTIDwgaU07IGlTKyspCisgICAgICAgIHsKKyAgICAgICAgICAqcFRlbXBkc3QgPSAqcFRlbXBzcmMxOyAgICAgIC8qIHJlcGVhdCBmaXJzdCBzb3VyY2UgcGl4ZWwgKi8KKyAgICAgICAgICBwVGVtcGRzdCsrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcFRlbXBzcmMxKys7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9NQUdOSUZZX0c4X1gzLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZiAvKiBNTkdfTk9fR1JBWV9TVVBQT1JUICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19tYWduaWZ5X3JnYjhfeDEgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcFNyY2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBEc3RsaW5lKQoreworICBtbmdfdWludDMyIGlYLCBpUywgaU07CisgIG1uZ191aW50OHAgcFRlbXBzcmMxOworICBtbmdfdWludDhwIHBUZW1wZHN0OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX01BR05JRllfUkdCOF9YMSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBUZW1wc3JjMSA9IHBTcmNsaW5lOyAgICAgICAgICAgICAgICAvKiBpbml0aWFsaXplIHBpeGVsLWxvb3AgKi8KKyAgcFRlbXBkc3QgID0gcERzdGxpbmU7CisKKyAgZm9yIChpWCA9IDA7IGlYIDwgaVdpZHRoOyBpWCsrKQorICB7CisgICAgKnBUZW1wZHN0ID0gKnBUZW1wc3JjMTsgICAgICAgICAgICAvKiBjb3B5IG9yaWdpbmFsIHNvdXJjZSBwaXhlbCAqLworICAgIHBUZW1wZHN0Kys7CisgICAgKnBUZW1wZHN0ID0gKihwVGVtcHNyYzErMSk7CisgICAgcFRlbXBkc3QrKzsKKyAgICAqcFRlbXBkc3QgPSAqKHBUZW1wc3JjMSsyKTsKKyAgICBwVGVtcGRzdCsrOworCisgICAgaWYgKGlYID09IDApICAgICAgICAgICAgICAgICAgICAgICAvKiBmaXJzdCBpbnRlcnZhbCA/ICovCisgICAgICBpTSA9IGlNTDsKKyAgICBlbHNlCisgICAgaWYgKGlYID09IChpV2lkdGggLSAxKSkgICAgICAgICAgICAvKiBsYXN0IGludGVydmFsID8gKi8KKyAgICAgIGlNID0gaU1SOworICAgIGVsc2UKKyAgICAgIGlNID0gaU1YOworCisgICAgZm9yIChpUyA9IDE7IGlTIDwgaU07IGlTKyspICAgICAgICAvKiBmaWxsIGludGVydmFsICovCisgICAgeworICAgICAgKnBUZW1wZHN0ID0gKnBUZW1wc3JjMTsgICAgICAgICAgLyogY29weSBvcmlnaW5hbCBzb3VyY2UgcGl4ZWwgKi8KKyAgICAgIHBUZW1wZHN0Kys7CisgICAgICAqcFRlbXBkc3QgPSAqKHBUZW1wc3JjMSsxKTsKKyAgICAgIHBUZW1wZHN0Kys7CisgICAgICAqcFRlbXBkc3QgPSAqKHBUZW1wc3JjMSsyKTsKKyAgICAgIHBUZW1wZHN0Kys7CisgICAgfQorCisgICAgcFRlbXBzcmMxICs9IDM7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9NQUdOSUZZX1JHQjhfWDEsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9yZ2I4X3gyIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBTcmNsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSkKK3sKKyAgbW5nX3VpbnQzMiBpWDsKKyAgbW5nX2ludDMyICBpUywgaU07CisgIG1uZ191aW50OHAgcFRlbXBzcmMxOworICBtbmdfdWludDhwIHBUZW1wc3JjMjsKKyAgbW5nX3VpbnQ4cCBwVGVtcGRzdDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9NQUdOSUZZX1JHQjhfWDIsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBwVGVtcHNyYzEgPSBwU3JjbGluZTsgICAgICAgICAgICAgICAgLyogaW5pdGlhbGl6ZSBwaXhlbC1sb29wICovCisgIHBUZW1wZHN0ICA9IHBEc3RsaW5lOworCisgIGZvciAoaVggPSAwOyBpWCA8IGlXaWR0aDsgaVgrKykKKyAgeworICAgIHBUZW1wc3JjMiA9IHBUZW1wc3JjMSArIDM7CisKKyAgICAqcFRlbXBkc3QgPSAqcFRlbXBzcmMxOyAgICAgICAgICAgIC8qIGNvcHkgb3JpZ2luYWwgc291cmNlIHBpeGVsICovCisgICAgcFRlbXBkc3QrKzsKKyAgICAqcFRlbXBkc3QgPSAqKHBUZW1wc3JjMSsxKTsKKyAgICBwVGVtcGRzdCsrOworICAgICpwVGVtcGRzdCA9ICoocFRlbXBzcmMxKzIpOworICAgIHBUZW1wZHN0Kys7CisKKyAgICBpZiAoaVggPT0gMCkgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpcnN0IGludGVydmFsID8gKi8KKyAgICB7CisgICAgICBpZiAoaVdpZHRoID09IDEpICAgICAgICAgICAgICAgICAvKiBzaW5nbGUgcGl4ZWwgPyAqLworICAgICAgICBwVGVtcHNyYzIgPSBNTkdfTlVMTDsKKworICAgICAgaU0gPSAobW5nX2ludDMyKWlNTDsKKyAgICB9CisgICAgZWxzZQorICAgIGlmIChpWCA9PSAoaVdpZHRoIC0gMikpICAgICAgICAgICAgLyogbGFzdCBpbnRlcnZhbCA/ICovCisgICAgICBpTSA9IChtbmdfaW50MzIpaU1SOworICAgIGVsc2UKKyAgICAgIGlNID0gKG1uZ19pbnQzMilpTVg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaWxsIGludGVydmFsID8gKi8KKyAgICBpZiAoKGlYIDwgaVdpZHRoIC0gMSkgfHwgKGlXaWR0aCA9PSAxKSkKKyAgICB7CisgICAgICBpZiAocFRlbXBzcmMyKSAgICAgICAgICAgICAgICAgICAvKiBkbyB3ZSBoYXZlIHRoZSBzZWNvbmQgcGl4ZWwgPyAqLworICAgICAgeworICAgICAgICBmb3IgKGlTID0gMTsgaVMgPCBpTTsgaVMrKykKKyAgICAgICAgeworICAgICAgICAgIGlmICgqcFRlbXBzcmMxID09ICpwVGVtcHNyYzIpCisgICAgICAgICAgICAqcFRlbXBkc3QgPSAqcFRlbXBzcmMxOyAgICAvKiBqdXN0IHJlcGVhdCB0aGUgZmlyc3QgKi8KKyAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNhbGN1bGF0ZSB0aGUgZGlzdGFuY2UgKi8KKyAgICAgICAgICAgICpwVGVtcGRzdCA9IChtbmdfdWludDgpKCgoMiAqIGlTICogKCAobW5nX2ludDMyKSgqcFRlbXBzcmMyKSAgICAgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfaW50MzIpKCpwVGVtcHNyYzEpICAgICApICsgaU0pIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaU0gKiAyKSkgKyAobW5nX2ludDMyKSgqcFRlbXBzcmMxKSAgICAgICAgICAgICApOworCisgICAgICAgICAgcFRlbXBkc3QrKzsKKworICAgICAgICAgIGlmICgqKHBUZW1wc3JjMSsxKSA9PSAqKHBUZW1wc3JjMisxKSkKKyAgICAgICAgICAgICpwVGVtcGRzdCA9ICoocFRlbXBzcmMxKzEpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpwVGVtcGRzdCA9IChtbmdfdWludDgpKCgoMiAqIGlTICogKCAobW5nX2ludDMyKSgqKHBUZW1wc3JjMisxKSkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfaW50MzIpKCoocFRlbXBzcmMxKzEpKSApICsgaU0pIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaU0gKiAyKSkgKyAobW5nX2ludDMyKSgqKHBUZW1wc3JjMSsxKSkgICAgICAgICApOworCisgICAgICAgICAgcFRlbXBkc3QrKzsKKworICAgICAgICAgIGlmICgqKHBUZW1wc3JjMSsyKSA9PSAqKHBUZW1wc3JjMisyKSkKKyAgICAgICAgICAgICpwVGVtcGRzdCA9ICoocFRlbXBzcmMxKzIpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpwVGVtcGRzdCA9IChtbmdfdWludDgpKCgoMiAqIGlTICogKCAobW5nX2ludDMyKSgqKHBUZW1wc3JjMisyKSkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfaW50MzIpKCoocFRlbXBzcmMxKzIpKSApICsgaU0pIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaU0gKiAyKSkgKyAobW5nX2ludDMyKSgqKHBUZW1wc3JjMSsyKSkgICAgICAgICApOworCisgICAgICAgICAgcFRlbXBkc3QrKzsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBmb3IgKGlTID0gMTsgaVMgPCBpTTsgaVMrKykKKyAgICAgICAgeworICAgICAgICAgICpwVGVtcGRzdCA9ICpwVGVtcHNyYzE7ICAgICAgLyogcmVwZWF0IGZpcnN0IHNvdXJjZSBwaXhlbCAqLworICAgICAgICAgIHBUZW1wZHN0Kys7CisgICAgICAgICAgKnBUZW1wZHN0ID0gKihwVGVtcHNyYzErMSk7CisgICAgICAgICAgcFRlbXBkc3QrKzsKKyAgICAgICAgICAqcFRlbXBkc3QgPSAqKHBUZW1wc3JjMSsyKTsKKyAgICAgICAgICBwVGVtcGRzdCsrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcFRlbXBzcmMxICs9IDM7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9NQUdOSUZZX1JHQjhfWDIsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9yZ2I4X3gzIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBTcmNsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSkKK3sKKyAgbW5nX3VpbnQzMiBpWDsKKyAgbW5nX2ludDMyICBpUywgaU0sIGlIOworICBtbmdfdWludDhwIHBUZW1wc3JjMTsKKyAgbW5nX3VpbnQ4cCBwVGVtcHNyYzI7CisgIG1uZ191aW50OHAgcFRlbXBkc3Q7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fTUFHTklGWV9SR0I4X1gzLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcFRlbXBzcmMxID0gcFNyY2xpbmU7ICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpemUgcGl4ZWwtbG9vcCAqLworICBwVGVtcGRzdCAgPSBwRHN0bGluZTsKKworICBmb3IgKGlYID0gMDsgaVggPCBpV2lkdGg7IGlYKyspCisgIHsKKyAgICBwVGVtcHNyYzIgPSBwVGVtcHNyYzEgKyAzOworCisgICAgKnBUZW1wZHN0ID0gKnBUZW1wc3JjMTsgICAgICAgICAgICAvKiBjb3B5IG9yaWdpbmFsIHNvdXJjZSBwaXhlbCAqLworICAgIHBUZW1wZHN0Kys7CisgICAgKnBUZW1wZHN0ID0gKihwVGVtcHNyYzErMSk7CisgICAgcFRlbXBkc3QrKzsKKyAgICAqcFRlbXBkc3QgPSAqKHBUZW1wc3JjMSsyKTsKKyAgICBwVGVtcGRzdCsrOworCisgICAgaWYgKGlYID09IDApICAgICAgICAgICAgICAgICAgICAgICAvKiBmaXJzdCBpbnRlcnZhbCA/ICovCisgICAgeworICAgICAgaWYgKGlXaWR0aCA9PSAxKSAgICAgICAgICAgICAgICAgLyogc2luZ2xlIHBpeGVsID8gKi8KKyAgICAgICAgcFRlbXBzcmMyID0gTU5HX05VTEw7CisKKyAgICAgIGlNID0gKG1uZ19pbnQzMilpTUw7CisgICAgfQorICAgIGVsc2UKKyAgICBpZiAoaVggPT0gKGlXaWR0aCAtIDIpKSAgICAgICAgICAgIC8qIGxhc3QgaW50ZXJ2YWwgPyAqLworICAgICAgaU0gPSAobW5nX2ludDMyKWlNUjsKKyAgICBlbHNlCisgICAgICBpTSA9IChtbmdfaW50MzIpaU1YOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmlsbCBpbnRlcnZhbCA/ICovCisgICAgaWYgKChpWCA8IGlXaWR0aCAtIDEpIHx8IChpV2lkdGggPT0gMSkpCisgICAgeworICAgICAgaWYgKHBUZW1wc3JjMikgICAgICAgICAgICAgICAgICAgLyogZG8gd2UgaGF2ZSB0aGUgc2Vjb25kIHBpeGVsID8gKi8KKyAgICAgIHsKKyAgICAgICAgaUggPSAoaU0rMSkgLyAyOyAgICAgICAgICAgICAgIC8qIGNhbGN1bGF0ZSBoYWxmd2F5IHBvaW50ICovCisKKyAgICAgICAgZm9yIChpUyA9IDE7IGlTIDwgaUg7IGlTKyspICAgIC8qIHJlcGxpY2F0ZSBmaXJzdCBoYWxmICovCisgICAgICAgIHsKKyAgICAgICAgICAqcFRlbXBkc3QgICAgID0gKnBUZW1wc3JjMTsKKyAgICAgICAgICAqKHBUZW1wZHN0KzEpID0gKihwVGVtcHNyYzErMSk7CisgICAgICAgICAgKihwVGVtcGRzdCsyKSA9ICoocFRlbXBzcmMxKzIpOworCisgICAgICAgICAgcFRlbXBkc3QgKz0gMzsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaVMgPSBpSDsgaVMgPCBpTTsgaVMrKykgICAgLyogcmVwbGljYXRlIHNlY29uZCBoYWxmICovCisgICAgICAgIHsKKyAgICAgICAgICAqcFRlbXBkc3QgICAgID0gKnBUZW1wc3JjMjsKKyAgICAgICAgICAqKHBUZW1wZHN0KzEpID0gKihwVGVtcHNyYzIrMSk7CisgICAgICAgICAgKihwVGVtcGRzdCsyKSA9ICoocFRlbXBzcmMyKzIpOworCisgICAgICAgICAgcFRlbXBkc3QgKz0gMzsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBmb3IgKGlTID0gMTsgaVMgPCBpTTsgaVMrKykKKyAgICAgICAgeworICAgICAgICAgICpwVGVtcGRzdCA9ICpwVGVtcHNyYzE7ICAgICAgLyogcmVwZWF0IGZpcnN0IHNvdXJjZSBwaXhlbCAqLworICAgICAgICAgIHBUZW1wZHN0Kys7CisgICAgICAgICAgKnBUZW1wZHN0ID0gKihwVGVtcHNyYzErMSk7CisgICAgICAgICAgcFRlbXBkc3QrKzsKKyAgICAgICAgICAqcFRlbXBkc3QgPSAqKHBUZW1wc3JjMSsyKTsKKyAgICAgICAgICBwVGVtcGRzdCsrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcFRlbXBzcmMxICs9IDM7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9NQUdOSUZZX1JHQjhfWDMsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19OT19HUkFZX1NVUFBPUlQKK21uZ19yZXRjb2RlIG1uZ19tYWduaWZ5X2dhOF94MSAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcFNyY2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcERzdGxpbmUpCit7CisgIG1uZ191aW50MzIgaVgsIGlTLCBpTTsKKyAgbW5nX3VpbnQ4cCBwVGVtcHNyYzE7CisgIG1uZ191aW50OHAgcFRlbXBkc3Q7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fTUFHTklGWV9HQThfWDEsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBwVGVtcHNyYzEgPSBwU3JjbGluZTsgICAgICAgICAgICAgICAgLyogaW5pdGlhbGl6ZSBwaXhlbC1sb29wICovCisgIHBUZW1wZHN0ICA9IHBEc3RsaW5lOworCisgIGZvciAoaVggPSAwOyBpWCA8IGlXaWR0aDsgaVgrKykKKyAgeworICAgICpwVGVtcGRzdCA9ICpwVGVtcHNyYzE7ICAgICAgICAgICAgLyogY29weSBvcmlnaW5hbCBzb3VyY2UgcGl4ZWwgKi8KKyAgICBwVGVtcGRzdCsrOworICAgICpwVGVtcGRzdCA9ICoocFRlbXBzcmMxKzEpOworICAgIHBUZW1wZHN0Kys7CisKKyAgICBpZiAoaVggPT0gMCkgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpcnN0IGludGVydmFsID8gKi8KKyAgICAgIGlNID0gaU1MOworICAgIGVsc2UKKyAgICBpZiAoaVggPT0gKGlXaWR0aCAtIDEpKSAgICAgICAgICAgIC8qIGxhc3QgaW50ZXJ2YWwgPyAqLworICAgICAgaU0gPSBpTVI7CisgICAgZWxzZQorICAgICAgaU0gPSBpTVg7CisKKyAgICBmb3IgKGlTID0gMTsgaVMgPCBpTTsgaVMrKykgICAgICAgIC8qIGZpbGwgaW50ZXJ2YWwgKi8KKyAgICB7CisgICAgICAqcFRlbXBkc3QgPSAqcFRlbXBzcmMxOyAgICAgICAgICAvKiBjb3B5IG9yaWdpbmFsIHNvdXJjZSBwaXhlbCAqLworICAgICAgcFRlbXBkc3QrKzsKKyAgICAgICpwVGVtcGRzdCA9ICoocFRlbXBzcmMxKzEpOworICAgICAgcFRlbXBkc3QrKzsKKyAgICB9CisKKyAgICBwVGVtcHNyYzEgKz0gMjsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX01BR05JRllfR0E4X1gxLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX21hZ25pZnlfZ2E4X3gyIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSkKK3sKKyAgbW5nX3VpbnQzMiBpWDsKKyAgbW5nX2ludDMyICBpUywgaU07CisgIG1uZ191aW50OHAgcFRlbXBzcmMxOworICBtbmdfdWludDhwIHBUZW1wc3JjMjsKKyAgbW5nX3VpbnQ4cCBwVGVtcGRzdDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9NQUdOSUZZX0dBOF9YMiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBUZW1wc3JjMSA9IHBTcmNsaW5lOyAgICAgICAgICAgICAgICAvKiBpbml0aWFsaXplIHBpeGVsLWxvb3AgKi8KKyAgcFRlbXBkc3QgID0gcERzdGxpbmU7CisKKyAgZm9yIChpWCA9IDA7IGlYIDwgaVdpZHRoOyBpWCsrKQorICB7CisgICAgcFRlbXBzcmMyID0gcFRlbXBzcmMxICsgMjsKKworICAgICpwVGVtcGRzdCA9ICpwVGVtcHNyYzE7ICAgICAgICAgICAgLyogY29weSBvcmlnaW5hbCBzb3VyY2UgcGl4ZWwgKi8KKyAgICBwVGVtcGRzdCsrOworICAgICpwVGVtcGRzdCA9ICoocFRlbXBzcmMxKzEpOworICAgIHBUZW1wZHN0Kys7CisKKyAgICBpZiAoaVggPT0gMCkgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpcnN0IGludGVydmFsID8gKi8KKyAgICB7CisgICAgICBpZiAoaVdpZHRoID09IDEpICAgICAgICAgICAgICAgICAvKiBzaW5nbGUgcGl4ZWwgPyAqLworICAgICAgICBwVGVtcHNyYzIgPSBNTkdfTlVMTDsKKworICAgICAgaU0gPSBpTUw7CisgICAgfQorICAgIGVsc2UKKyAgICBpZiAoaVggPT0gKGlXaWR0aCAtIDIpKSAgICAgICAgICAgIC8qIGxhc3QgaW50ZXJ2YWwgPyAqLworICAgICAgaU0gPSBpTVI7CisgICAgZWxzZQorICAgICAgaU0gPSBpTVg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaWxsIGludGVydmFsID8gKi8KKyAgICBpZiAoKGlYIDwgaVdpZHRoIC0gMSkgfHwgKGlXaWR0aCA9PSAxKSkKKyAgICB7CisgICAgICBpZiAocFRlbXBzcmMyKSAgICAgICAgICAgICAgICAgICAvKiBkbyB3ZSBoYXZlIHRoZSBzZWNvbmQgcGl4ZWwgPyAqLworICAgICAgeworICAgICAgICBmb3IgKGlTID0gMTsgaVMgPCBpTTsgaVMrKykKKyAgICAgICAgeworICAgICAgICAgIGlmICgqcFRlbXBzcmMxID09ICpwVGVtcHNyYzIpCisgICAgICAgICAgICAqcFRlbXBkc3QgPSAqcFRlbXBzcmMxOyAgICAvKiBqdXN0IHJlcGVhdCB0aGUgZmlyc3QgKi8KKyAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNhbGN1bGF0ZSB0aGUgZGlzdGFuY2UgKi8KKyAgICAgICAgICAgICpwVGVtcGRzdCA9IChtbmdfdWludDgpKCgoMiAqIGlTICogKCAobW5nX2ludDMyKSgqcFRlbXBzcmMyKSAgICAgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfaW50MzIpKCpwVGVtcHNyYzEpICAgICApICsgaU0pIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaU0gKiAyKSkgKyAobW5nX2ludDMyKSgqcFRlbXBzcmMxKSAgICAgICAgICAgICApOworCisgICAgICAgICAgcFRlbXBkc3QrKzsKKworICAgICAgICAgIGlmICgqKHBUZW1wc3JjMSsxKSA9PSAqKHBUZW1wc3JjMisxKSkKKyAgICAgICAgICAgICpwVGVtcGRzdCA9ICoocFRlbXBzcmMxKzEpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpwVGVtcGRzdCA9IChtbmdfdWludDgpKCgoMiAqIGlTICogKCAobW5nX2ludDMyKSgqKHBUZW1wc3JjMisxKSkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfaW50MzIpKCoocFRlbXBzcmMxKzEpKSApICsgaU0pIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaU0gKiAyKSkgKyAobW5nX2ludDMyKSgqKHBUZW1wc3JjMSsxKSkgICAgICAgICApOworCisgICAgICAgICAgcFRlbXBkc3QrKzsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBmb3IgKGlTID0gMTsgaVMgPCBpTTsgaVMrKykKKyAgICAgICAgeworICAgICAgICAgICpwVGVtcGRzdCA9ICpwVGVtcHNyYzE7ICAgICAgLyogcmVwZWF0IGZpcnN0IHNvdXJjZSBwaXhlbCAqLworICAgICAgICAgIHBUZW1wZHN0Kys7CisgICAgICAgICAgKnBUZW1wZHN0ID0gKihwVGVtcHNyYzErMSk7CisgICAgICAgICAgcFRlbXBkc3QrKzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHBUZW1wc3JjMSArPSAyOworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fTUFHTklGWV9HQThfWDIsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9nYThfeDMgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1YLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBTcmNsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBEc3RsaW5lKQoreworICBtbmdfdWludDMyIGlYOworICBtbmdfaW50MzIgIGlTLCBpTSwgaUg7CisgIG1uZ191aW50OHAgcFRlbXBzcmMxOworICBtbmdfdWludDhwIHBUZW1wc3JjMjsKKyAgbW5nX3VpbnQ4cCBwVGVtcGRzdDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9NQUdOSUZZX0dBOF9YMywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBUZW1wc3JjMSA9IHBTcmNsaW5lOyAgICAgICAgICAgICAgICAvKiBpbml0aWFsaXplIHBpeGVsLWxvb3AgKi8KKyAgcFRlbXBkc3QgID0gcERzdGxpbmU7CisKKyAgZm9yIChpWCA9IDA7IGlYIDwgaVdpZHRoOyBpWCsrKQorICB7CisgICAgcFRlbXBzcmMyID0gcFRlbXBzcmMxICsgMjsKKworICAgICpwVGVtcGRzdCA9ICpwVGVtcHNyYzE7ICAgICAgICAgICAgLyogY29weSBvcmlnaW5hbCBzb3VyY2UgcGl4ZWwgKi8KKyAgICBwVGVtcGRzdCsrOworICAgICpwVGVtcGRzdCA9ICoocFRlbXBzcmMxKzEpOworICAgIHBUZW1wZHN0Kys7CisKKyAgICBpZiAoaVggPT0gMCkgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpcnN0IGludGVydmFsID8gKi8KKyAgICB7CisgICAgICBpZiAoaVdpZHRoID09IDEpICAgICAgICAgICAgICAgICAvKiBzaW5nbGUgcGl4ZWwgPyAqLworICAgICAgICBwVGVtcHNyYzIgPSBNTkdfTlVMTDsKKworICAgICAgaU0gPSBpTUw7CisgICAgfQorICAgIGVsc2UKKyAgICBpZiAoaVggPT0gKGlXaWR0aCAtIDIpKSAgICAgICAgICAgIC8qIGxhc3QgaW50ZXJ2YWwgPyAqLworICAgICAgaU0gPSBpTVI7CisgICAgZWxzZQorICAgICAgaU0gPSBpTVg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaWxsIGludGVydmFsID8gKi8KKyAgICBpZiAoKGlYIDwgaVdpZHRoIC0gMSkgfHwgKGlXaWR0aCA9PSAxKSkKKyAgICB7CisgICAgICBpZiAocFRlbXBzcmMyKSAgICAgICAgICAgICAgICAgICAvKiBkbyB3ZSBoYXZlIHRoZSBzZWNvbmQgcGl4ZWwgPyAqLworICAgICAgeworICAgICAgICBpSCA9IChpTSsxKSAvIDI7ICAgICAgICAgICAgICAgLyogY2FsY3VsYXRlIGhhbGZ3YXkgcG9pbnQgKi8KKworICAgICAgICBmb3IgKGlTID0gMTsgaVMgPCBpSDsgaVMrKykgICAgLyogcmVwbGljYXRlIGZpcnN0IGhhbGYgKi8KKyAgICAgICAgeworICAgICAgICAgICpwVGVtcGRzdCAgICAgPSAqcFRlbXBzcmMxOworICAgICAgICAgICoocFRlbXBkc3QrMSkgPSAqKHBUZW1wc3JjMSsxKTsKKworICAgICAgICAgIHBUZW1wZHN0ICs9IDI7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGlTID0gaUg7IGlTIDwgaU07IGlTKyspICAgLyogcmVwbGljYXRlIHNlY29uZCBoYWxmICovCisgICAgICAgIHsKKyAgICAgICAgICAqcFRlbXBkc3QgICAgID0gKnBUZW1wc3JjMjsKKyAgICAgICAgICAqKHBUZW1wZHN0KzEpID0gKihwVGVtcHNyYzIrMSk7CisKKyAgICAgICAgICBwVGVtcGRzdCArPSAyOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGZvciAoaVMgPSAxOyBpUyA8IGlNOyBpUysrKQorICAgICAgICB7CisgICAgICAgICAgKnBUZW1wZHN0ID0gKnBUZW1wc3JjMTsgICAgICAvKiByZXBlYXQgZmlyc3Qgc291cmNlIHBpeGVsICovCisgICAgICAgICAgcFRlbXBkc3QrKzsKKyAgICAgICAgICAqcFRlbXBkc3QgPSAqKHBUZW1wc3JjMSsxKTsKKyAgICAgICAgICBwVGVtcGRzdCsrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcFRlbXBzcmMxICs9IDI7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9NQUdOSUZZX0dBOF9YMywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19tYWduaWZ5X2dhOF94NCAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcFNyY2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcERzdGxpbmUpCit7CisgIG1uZ191aW50MzIgaVg7CisgIG1uZ19pbnQzMiAgaVMsIGlNLCBpSDsKKyAgbW5nX3VpbnQ4cCBwVGVtcHNyYzE7CisgIG1uZ191aW50OHAgcFRlbXBzcmMyOworICBtbmdfdWludDhwIHBUZW1wZHN0OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX01BR05JRllfR0E4X1g0LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcFRlbXBzcmMxID0gcFNyY2xpbmU7ICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpemUgcGl4ZWwtbG9vcCAqLworICBwVGVtcGRzdCAgPSBwRHN0bGluZTsKKworICBmb3IgKGlYID0gMDsgaVggPCBpV2lkdGg7IGlYKyspCisgIHsKKyAgICBwVGVtcHNyYzIgPSBwVGVtcHNyYzEgKyAyOworCisgICAgKnBUZW1wZHN0ID0gKnBUZW1wc3JjMTsgICAgICAgICAgICAvKiBjb3B5IG9yaWdpbmFsIHNvdXJjZSBwaXhlbCAqLworICAgIHBUZW1wZHN0Kys7CisgICAgKnBUZW1wZHN0ID0gKihwVGVtcHNyYzErMSk7CisgICAgcFRlbXBkc3QrKzsKKworICAgIGlmIChpWCA9PSAwKSAgICAgICAgICAgICAgICAgICAgICAgLyogZmlyc3QgaW50ZXJ2YWwgPyAqLworICAgIHsKKyAgICAgIGlmIChpV2lkdGggPT0gMSkgICAgICAgICAgICAgICAgIC8qIHNpbmdsZSBwaXhlbCA/ICovCisgICAgICAgIHBUZW1wc3JjMiA9IE1OR19OVUxMOworCisgICAgICBpTSA9IGlNTDsKKyAgICB9CisgICAgZWxzZQorICAgIGlmIChpWCA9PSAoaVdpZHRoIC0gMikpICAgICAgICAgICAgLyogbGFzdCBpbnRlcnZhbCA/ICovCisgICAgICBpTSA9IGlNUjsKKyAgICBlbHNlCisgICAgICBpTSA9IGlNWDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbGwgaW50ZXJ2YWwgPyAqLworICAgIGlmICgoaVggPCBpV2lkdGggLSAxKSB8fCAoaVdpZHRoID09IDEpKQorICAgIHsKKyAgICAgIGlmIChwVGVtcHNyYzIpICAgICAgICAgICAgICAgICAgIC8qIGRvIHdlIGhhdmUgdGhlIHNlY29uZCBwaXhlbCA/ICovCisgICAgICB7CisgICAgICAgIGlIID0gKGlNKzEpIC8gMjsgICAgICAgICAgICAgICAvKiBjYWxjdWxhdGUgaGFsZndheSBwb2ludCAqLworCisgICAgICAgIGZvciAoaVMgPSAxOyBpUyA8IGlIOyBpUysrKSAgICAvKiBmaXJzdCBoYWxmICovCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKnBUZW1wc3JjMSA9PSAqcFRlbXBzcmMyKQorICAgICAgICAgICAgKnBUZW1wZHN0ID0gKnBUZW1wc3JjMTsgICAgLyoganVzdCByZXBlYXQgdGhlIGZpcnN0ICovCisgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjYWxjdWxhdGUgdGhlIGRpc3RhbmNlICovCisgICAgICAgICAgICAqcFRlbXBkc3QgPSAobW5nX3VpbnQ4KSgoKDIgKiBpUyAqICggKG1uZ19pbnQzMikoKnBUZW1wc3JjMikgICAgIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX2ludDMyKSgqcFRlbXBzcmMxKSAgICAgKSArIGlNKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlNICogMikpICsgKG1uZ19pbnQzMikoKnBUZW1wc3JjMSkgICAgICAgICAgICAgKTsKKworICAgICAgICAgIHBUZW1wZHN0Kys7CisKKyAgICAgICAgICAqcFRlbXBkc3QgPSAqKHBUZW1wc3JjMSsxKTsgIC8qIHJlcGxpY2F0ZSBhbHBoYSBmcm9tIGxlZnQgKi8KKworICAgICAgICAgIHBUZW1wZHN0Kys7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGlTID0gaUg7IGlTIDwgaU07IGlTKyspICAgLyogc2Vjb25kIGhhbGYgKi8KKyAgICAgICAgeworICAgICAgICAgIGlmICgqcFRlbXBzcmMxID09ICpwVGVtcHNyYzIpCisgICAgICAgICAgICAqcFRlbXBkc3QgPSAqcFRlbXBzcmMxOyAgICAvKiBqdXN0IHJlcGVhdCB0aGUgZmlyc3QgKi8KKyAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNhbGN1bGF0ZSB0aGUgZGlzdGFuY2UgKi8KKyAgICAgICAgICAgICpwVGVtcGRzdCA9IChtbmdfdWludDgpKCgoMiAqIGlTICogKCAobW5nX2ludDMyKSgqcFRlbXBzcmMyKSAgICAgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfaW50MzIpKCpwVGVtcHNyYzEpICAgICApICsgaU0pIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaU0gKiAyKSkgKyAobW5nX2ludDMyKSgqcFRlbXBzcmMxKSAgICAgICAgICAgICApOworCisgICAgICAgICAgcFRlbXBkc3QrKzsKKworICAgICAgICAgICpwVGVtcGRzdCA9ICoocFRlbXBzcmMyKzEpOyAgLyogcmVwbGljYXRlIGFscGhhIGZyb20gcmlnaHQgKi8KKworICAgICAgICAgIHBUZW1wZHN0Kys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZm9yIChpUyA9IDE7IGlTIDwgaU07IGlTKyspCisgICAgICAgIHsKKyAgICAgICAgICAqcFRlbXBkc3QgPSAqcFRlbXBzcmMxOyAgICAgIC8qIHJlcGVhdCBmaXJzdCBzb3VyY2UgcGl4ZWwgKi8KKyAgICAgICAgICBwVGVtcGRzdCsrOworICAgICAgICAgICpwVGVtcGRzdCA9ICoocFRlbXBzcmMxKzEpOworICAgICAgICAgIHBUZW1wZHN0Kys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBwVGVtcHNyYzEgKz0gMjsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX01BR05JRllfR0E4X1g0LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX21hZ25pZnlfZ2E4X3g1IChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSkKK3sKKyAgbW5nX3VpbnQzMiBpWDsKKyAgbW5nX2ludDMyICBpUywgaU0sIGlIOworICBtbmdfdWludDhwIHBUZW1wc3JjMTsKKyAgbW5nX3VpbnQ4cCBwVGVtcHNyYzI7CisgIG1uZ191aW50OHAgcFRlbXBkc3Q7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fTUFHTklGWV9HQThfWDUsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBwVGVtcHNyYzEgPSBwU3JjbGluZTsgICAgICAgICAgICAgICAgLyogaW5pdGlhbGl6ZSBwaXhlbC1sb29wICovCisgIHBUZW1wZHN0ICA9IHBEc3RsaW5lOworCisgIGZvciAoaVggPSAwOyBpWCA8IGlXaWR0aDsgaVgrKykKKyAgeworICAgIHBUZW1wc3JjMiA9IHBUZW1wc3JjMSArIDI7CisKKyAgICAqcFRlbXBkc3QgPSAqcFRlbXBzcmMxOyAgICAgICAgICAgIC8qIGNvcHkgb3JpZ2luYWwgc291cmNlIHBpeGVsICovCisgICAgcFRlbXBkc3QrKzsKKyAgICAqcFRlbXBkc3QgPSAqKHBUZW1wc3JjMSsxKTsKKyAgICBwVGVtcGRzdCsrOworCisgICAgaWYgKGlYID09IDApICAgICAgICAgICAgICAgICAgICAgICAvKiBmaXJzdCBpbnRlcnZhbCA/ICovCisgICAgeworICAgICAgaWYgKGlXaWR0aCA9PSAxKSAgICAgICAgICAgICAgICAgLyogc2luZ2xlIHBpeGVsID8gKi8KKyAgICAgICAgcFRlbXBzcmMyID0gTU5HX05VTEw7CisKKyAgICAgIGlNID0gaU1MOworICAgIH0KKyAgICBlbHNlCisgICAgaWYgKGlYID09IChpV2lkdGggLSAyKSkgICAgICAgICAgICAvKiBsYXN0IGludGVydmFsID8gKi8KKyAgICAgIGlNID0gaU1SOworICAgIGVsc2UKKyAgICAgIGlNID0gaU1YOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmlsbCBpbnRlcnZhbCA/ICovCisgICAgaWYgKChpWCA8IGlXaWR0aCAtIDEpIHx8IChpV2lkdGggPT0gMSkpCisgICAgeworICAgICAgaWYgKHBUZW1wc3JjMikgICAgICAgICAgICAgICAgICAgLyogZG8gd2UgaGF2ZSB0aGUgc2Vjb25kIHBpeGVsID8gKi8KKyAgICAgIHsKKyAgICAgICAgaUggPSAoaU0rMSkgLyAyOyAgICAgICAgICAgICAgIC8qIGNhbGN1bGF0ZSBoYWxmd2F5IHBvaW50ICovCisKKyAgICAgICAgZm9yIChpUyA9IDE7IGlTIDwgaUg7IGlTKyspICAgIC8qIGZpcnN0IGhhbGYgKi8KKyAgICAgICAgeworICAgICAgICAgICpwVGVtcGRzdCA9ICpwVGVtcHNyYzE7ICAgICAgLyogcmVwbGljYXRlIGdyYXkgZnJvbSBsZWZ0ICovCisKKyAgICAgICAgICBwVGVtcGRzdCsrOworCisgICAgICAgICAgaWYgKCoocFRlbXBzcmMxKzEpID09ICoocFRlbXBzcmMyKzEpKQorICAgICAgICAgICAgKnBUZW1wZHN0ID0gKihwVGVtcHNyYzErMSk7LyoganVzdCByZXBlYXQgdGhlIGZpcnN0ICovCisgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjYWxjdWxhdGUgdGhlIGRpc3RhbmNlICovCisgICAgICAgICAgICAqcFRlbXBkc3QgPSAobW5nX3VpbnQ4KSgoKDIgKiBpUyAqICggKG1uZ19pbnQzMikoKihwVGVtcHNyYzIrMSkpICAgICAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ19pbnQzMikoKihwVGVtcHNyYzErMSkpICAgICApICsgaU0pIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaU0gKiAyKSkgKyAobW5nX2ludDMyKSgqKHBUZW1wc3JjMSsxKSkgICAgICAgICAgICAgKTsKKworICAgICAgICAgIHBUZW1wZHN0Kys7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGlTID0gaUg7IGlTIDwgaU07IGlTKyspICAgLyogc2Vjb25kIGhhbGYgKi8KKyAgICAgICAgeworICAgICAgICAgICpwVGVtcGRzdCA9ICpwVGVtcHNyYzI7ICAgICAgLyogcmVwbGljYXRlIGdyYXkgZnJvbSByaWdodCAqLworCisgICAgICAgICAgcFRlbXBkc3QrKzsKKworICAgICAgICAgIGlmICgqKHBUZW1wc3JjMSsxKSA9PSAqKHBUZW1wc3JjMisxKSkKKyAgICAgICAgICAgICpwVGVtcGRzdCA9ICoocFRlbXBzcmMxKzEpOy8qIGp1c3QgcmVwZWF0IHRoZSBmaXJzdCAqLworICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2FsY3VsYXRlIHRoZSBkaXN0YW5jZSAqLworICAgICAgICAgICAgKnBUZW1wZHN0ID0gKG1uZ191aW50OCkoKCgyICogaVMgKiAoIChtbmdfaW50MzIpKCoocFRlbXBzcmMyKzEpKSAgICAgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfaW50MzIpKCoocFRlbXBzcmMxKzEpKSAgICAgKSArIGlNKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlNICogMikpICsgKG1uZ19pbnQzMikoKihwVGVtcHNyYzErMSkpICAgICAgICAgICAgICk7CisKKyAgICAgICAgICBwVGVtcGRzdCsrOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGZvciAoaVMgPSAxOyBpUyA8IGlNOyBpUysrKQorICAgICAgICB7CisgICAgICAgICAgKnBUZW1wZHN0ID0gKnBUZW1wc3JjMTsgICAgICAvKiByZXBlYXQgZmlyc3Qgc291cmNlIHBpeGVsICovCisgICAgICAgICAgcFRlbXBkc3QrKzsKKyAgICAgICAgICAqcFRlbXBkc3QgPSAqKHBUZW1wc3JjMSsxKTsKKyAgICAgICAgICBwVGVtcGRzdCsrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcFRlbXBzcmMxICs9IDI7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9NQUdOSUZZX0dBOF9YNSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYgLyogTU5HX05PX0dSQVlfU1VQUE9SVCAqLworI2VuZGlmIC8qIE1OR19PUFRJTUlaRV9GT09UUFJJTlRfTUFHTiAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9yZ2JhOF94MSAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBTcmNsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcERzdGxpbmUpCit7CisgIG1uZ191aW50MzIgaVgsIGlTLCBpTTsKKyAgbW5nX3VpbnQ4cCBwVGVtcHNyYzE7CisgIG1uZ191aW50OHAgcFRlbXBkc3Q7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fTUFHTklGWV9SR0JBOF9YMSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBUZW1wc3JjMSA9IHBTcmNsaW5lOyAgICAgICAgICAgICAgICAvKiBpbml0aWFsaXplIHBpeGVsLWxvb3AgKi8KKyAgcFRlbXBkc3QgID0gcERzdGxpbmU7CisKKyAgZm9yIChpWCA9IDA7IGlYIDwgaVdpZHRoOyBpWCsrKQorICB7CisgICAgKnBUZW1wZHN0ID0gKnBUZW1wc3JjMTsgICAgICAgICAgICAvKiBjb3B5IG9yaWdpbmFsIHNvdXJjZSBwaXhlbCAqLworICAgIHBUZW1wZHN0Kys7CisgICAgKnBUZW1wZHN0ID0gKihwVGVtcHNyYzErMSk7CisgICAgcFRlbXBkc3QrKzsKKyAgICAqcFRlbXBkc3QgPSAqKHBUZW1wc3JjMSsyKTsKKyAgICBwVGVtcGRzdCsrOworICAgICpwVGVtcGRzdCA9ICoocFRlbXBzcmMxKzMpOworICAgIHBUZW1wZHN0Kys7CisKKyAgICBpZiAoaVggPT0gMCkgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpcnN0IGludGVydmFsID8gKi8KKyAgICAgIGlNID0gaU1MOworICAgIGVsc2UKKyAgICBpZiAoaVggPT0gKGlXaWR0aCAtIDEpKSAgICAgICAgICAgIC8qIGxhc3QgaW50ZXJ2YWwgPyAqLworICAgICAgaU0gPSBpTVI7CisgICAgZWxzZQorICAgICAgaU0gPSBpTVg7CisKKyAgICBmb3IgKGlTID0gMTsgaVMgPCBpTTsgaVMrKykgICAgICAgIC8qIGZpbGwgaW50ZXJ2YWwgKi8KKyAgICB7CisgICAgICAqcFRlbXBkc3QgPSAqcFRlbXBzcmMxOyAgICAgICAgICAvKiBjb3B5IG9yaWdpbmFsIHNvdXJjZSBwaXhlbCAqLworICAgICAgcFRlbXBkc3QrKzsKKyAgICAgICpwVGVtcGRzdCA9ICoocFRlbXBzcmMxKzEpOworICAgICAgcFRlbXBkc3QrKzsKKyAgICAgICpwVGVtcGRzdCA9ICoocFRlbXBzcmMxKzIpOworICAgICAgcFRlbXBkc3QrKzsKKyAgICAgICpwVGVtcGRzdCA9ICoocFRlbXBzcmMxKzMpOworICAgICAgcFRlbXBkc3QrKzsKKyAgICB9CisKKyAgICBwVGVtcHNyYzEgKz0gNDsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX01BR05JRllfUkdCQThfWDEsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9yZ2JhOF94MiAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBTcmNsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcERzdGxpbmUpCit7CisgIG1uZ191aW50MzIgaVg7CisgIG1uZ19pbnQzMiAgaVMsIGlNOworICBtbmdfdWludDhwIHBUZW1wc3JjMTsKKyAgbW5nX3VpbnQ4cCBwVGVtcHNyYzI7CisgIG1uZ191aW50OHAgcFRlbXBkc3Q7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fTUFHTklGWV9SR0JBOF9YMiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBUZW1wc3JjMSA9IHBTcmNsaW5lOyAgICAgICAgICAgICAgICAvKiBpbml0aWFsaXplIHBpeGVsLWxvb3AgKi8KKyAgcFRlbXBkc3QgID0gcERzdGxpbmU7CisKKyAgZm9yIChpWCA9IDA7IGlYIDwgaVdpZHRoOyBpWCsrKQorICB7CisgICAgcFRlbXBzcmMyID0gcFRlbXBzcmMxICsgNDsKKworICAgICpwVGVtcGRzdCA9ICpwVGVtcHNyYzE7ICAgICAgICAgICAgLyogY29weSBvcmlnaW5hbCBzb3VyY2UgcGl4ZWwgKi8KKyAgICBwVGVtcGRzdCsrOworICAgICpwVGVtcGRzdCA9ICoocFRlbXBzcmMxKzEpOworICAgIHBUZW1wZHN0Kys7CisgICAgKnBUZW1wZHN0ID0gKihwVGVtcHNyYzErMik7CisgICAgcFRlbXBkc3QrKzsKKyAgICAqcFRlbXBkc3QgPSAqKHBUZW1wc3JjMSszKTsKKyAgICBwVGVtcGRzdCsrOworCisgICAgaWYgKGlYID09IDApICAgICAgICAgICAgICAgICAgICAgICAvKiBmaXJzdCBpbnRlcnZhbCA/ICovCisgICAgeworICAgICAgaWYgKGlXaWR0aCA9PSAxKSAgICAgICAgICAgICAgICAgLyogc2luZ2xlIHBpeGVsID8gKi8KKyAgICAgICAgcFRlbXBzcmMyID0gTU5HX05VTEw7CisKKyAgICAgIGlNID0gKG1uZ19pbnQzMilpTUw7CisgICAgfQorICAgIGVsc2UKKyAgICBpZiAoaVggPT0gKGlXaWR0aCAtIDIpKSAgICAgICAgICAgIC8qIGxhc3QgaW50ZXJ2YWwgPyAqLworICAgICAgaU0gPSAobW5nX2ludDMyKWlNUjsKKyAgICBlbHNlCisgICAgICBpTSA9IChtbmdfaW50MzIpaU1YOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmlsbCBpbnRlcnZhbCA/ICovCisgICAgaWYgKChpWCA8IGlXaWR0aCAtIDEpIHx8IChpV2lkdGggPT0gMSkpCisgICAgeworICAgICAgaWYgKHBUZW1wc3JjMikgICAgICAgICAgICAgICAgICAgLyogZG8gd2UgaGF2ZSB0aGUgc2Vjb25kIHBpeGVsID8gKi8KKyAgICAgIHsKKyAgICAgICAgZm9yIChpUyA9IDE7IGlTIDwgaU07IGlTKyspCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKnBUZW1wc3JjMSA9PSAqcFRlbXBzcmMyKQorICAgICAgICAgICAgKnBUZW1wZHN0ID0gKnBUZW1wc3JjMTsgICAgLyoganVzdCByZXBlYXQgdGhlIGZpcnN0ICovCisgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjYWxjdWxhdGUgdGhlIGRpc3RhbmNlICovCisgICAgICAgICAgICAqcFRlbXBkc3QgPSAobW5nX3VpbnQ4KSgoKDIgKiBpUyAqICggKG1uZ19pbnQzMikoKnBUZW1wc3JjMikgICAgIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX2ludDMyKSgqcFRlbXBzcmMxKSAgICAgKSArIGlNKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlNICogMikpICsgKG1uZ19pbnQzMikoKnBUZW1wc3JjMSkgICAgICAgICAgICAgKTsKKworICAgICAgICAgIHBUZW1wZHN0Kys7CisKKyAgICAgICAgICBpZiAoKihwVGVtcHNyYzErMSkgPT0gKihwVGVtcHNyYzIrMSkpCisgICAgICAgICAgICAqcFRlbXBkc3QgPSAqKHBUZW1wc3JjMSsxKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICAqcFRlbXBkc3QgPSAobW5nX3VpbnQ4KSgoKDIgKiBpUyAqICggKG1uZ19pbnQzMikoKihwVGVtcHNyYzIrMSkpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX2ludDMyKSgqKHBUZW1wc3JjMSsxKSkgKSArIGlNKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlNICogMikpICsgKG1uZ19pbnQzMikoKihwVGVtcHNyYzErMSkpICAgICAgICAgKTsKKworICAgICAgICAgIHBUZW1wZHN0Kys7CisKKyAgICAgICAgICBpZiAoKihwVGVtcHNyYzErMikgPT0gKihwVGVtcHNyYzIrMikpCisgICAgICAgICAgICAqcFRlbXBkc3QgPSAqKHBUZW1wc3JjMSsyKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICAqcFRlbXBkc3QgPSAobW5nX3VpbnQ4KSgoKDIgKiBpUyAqICggKG1uZ19pbnQzMikoKihwVGVtcHNyYzIrMikpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX2ludDMyKSgqKHBUZW1wc3JjMSsyKSkgKSArIGlNKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlNICogMikpICsgKG1uZ19pbnQzMikoKihwVGVtcHNyYzErMikpICAgICAgICAgKTsKKworICAgICAgICAgIHBUZW1wZHN0Kys7CisKKyAgICAgICAgICBpZiAoKihwVGVtcHNyYzErMykgPT0gKihwVGVtcHNyYzIrMykpCisgICAgICAgICAgICAqcFRlbXBkc3QgPSAqKHBUZW1wc3JjMSszKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICAqcFRlbXBkc3QgPSAobW5nX3VpbnQ4KSgoKDIgKiBpUyAqICggKG1uZ19pbnQzMikoKihwVGVtcHNyYzIrMykpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX2ludDMyKSgqKHBUZW1wc3JjMSszKSkgKSArIGlNKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlNICogMikpICsgKG1uZ19pbnQzMikoKihwVGVtcHNyYzErMykpICAgICAgICAgKTsKKworICAgICAgICAgIHBUZW1wZHN0Kys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZm9yIChpUyA9IDE7IGlTIDwgaU07IGlTKyspCisgICAgICAgIHsKKyAgICAgICAgICAqcFRlbXBkc3QgPSAqcFRlbXBzcmMxOyAgICAgIC8qIHJlcGVhdCBmaXJzdCBzb3VyY2UgcGl4ZWwgKi8KKyAgICAgICAgICBwVGVtcGRzdCsrOworICAgICAgICAgICpwVGVtcGRzdCA9ICoocFRlbXBzcmMxKzEpOworICAgICAgICAgIHBUZW1wZHN0Kys7CisgICAgICAgICAgKnBUZW1wZHN0ID0gKihwVGVtcHNyYzErMik7CisgICAgICAgICAgcFRlbXBkc3QrKzsKKyAgICAgICAgICAqcFRlbXBkc3QgPSAqKHBUZW1wc3JjMSszKTsKKyAgICAgICAgICBwVGVtcGRzdCsrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcFRlbXBzcmMxICs9IDQ7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9NQUdOSUZZX1JHQkE4X1gyLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX21hZ25pZnlfcmdiYThfeDMgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBEc3RsaW5lKQoreworICBtbmdfdWludDMyIGlYOworICBtbmdfaW50MzIgIGlTLCBpTSwgaUg7CisgIG1uZ191aW50OHAgcFRlbXBzcmMxOworICBtbmdfdWludDhwIHBUZW1wc3JjMjsKKyAgbW5nX3VpbnQ4cCBwVGVtcGRzdDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9NQUdOSUZZX1JHQkE4X1gzLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcFRlbXBzcmMxID0gcFNyY2xpbmU7ICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpemUgcGl4ZWwtbG9vcCAqLworICBwVGVtcGRzdCAgPSBwRHN0bGluZTsKKworICBmb3IgKGlYID0gMDsgaVggPCBpV2lkdGg7IGlYKyspCisgIHsKKyAgICBwVGVtcHNyYzIgPSBwVGVtcHNyYzEgKyA0OworCisgICAgKnBUZW1wZHN0ID0gKnBUZW1wc3JjMTsgICAgICAgICAgICAvKiBjb3B5IG9yaWdpbmFsIHNvdXJjZSBwaXhlbCAqLworICAgIHBUZW1wZHN0Kys7CisgICAgKnBUZW1wZHN0ID0gKihwVGVtcHNyYzErMSk7CisgICAgcFRlbXBkc3QrKzsKKyAgICAqcFRlbXBkc3QgPSAqKHBUZW1wc3JjMSsyKTsKKyAgICBwVGVtcGRzdCsrOworICAgICpwVGVtcGRzdCA9ICoocFRlbXBzcmMxKzMpOworICAgIHBUZW1wZHN0Kys7CisKKyAgICBpZiAoaVggPT0gMCkgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpcnN0IGludGVydmFsID8gKi8KKyAgICB7CisgICAgICBpZiAoaVdpZHRoID09IDEpICAgICAgICAgICAgICAgICAvKiBzaW5nbGUgcGl4ZWwgPyAqLworICAgICAgICBwVGVtcHNyYzIgPSBNTkdfTlVMTDsKKworICAgICAgaU0gPSAobW5nX2ludDMyKWlNTDsKKyAgICB9CisgICAgZWxzZQorICAgIGlmIChpWCA9PSAoaVdpZHRoIC0gMikpICAgICAgICAgICAgLyogbGFzdCBpbnRlcnZhbCA/ICovCisgICAgICBpTSA9IChtbmdfaW50MzIpaU1SOworICAgIGVsc2UKKyAgICAgIGlNID0gKG1uZ19pbnQzMilpTVg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaWxsIGludGVydmFsID8gKi8KKyAgICBpZiAoKGlYIDwgaVdpZHRoIC0gMSkgfHwgKGlXaWR0aCA9PSAxKSkKKyAgICB7CisgICAgICBpZiAocFRlbXBzcmMyKSAgICAgICAgICAgICAgICAgICAvKiBkbyB3ZSBoYXZlIHRoZSBzZWNvbmQgcGl4ZWwgPyAqLworICAgICAgeworICAgICAgICBpSCA9IChpTSsxKSAvIDI7ICAgICAgICAgICAgICAgLyogY2FsY3VsYXRlIGhhbGZ3YXkgcG9pbnQgKi8KKworICAgICAgICBmb3IgKGlTID0gMTsgaVMgPCBpSDsgaVMrKykgICAgLyogcmVwbGljYXRlIGZpcnN0IGhhbGYgKi8KKyAgICAgICAgeworICAgICAgICAgICpwVGVtcGRzdCAgICAgPSAqcFRlbXBzcmMxOworICAgICAgICAgICoocFRlbXBkc3QrMSkgPSAqKHBUZW1wc3JjMSsxKTsKKyAgICAgICAgICAqKHBUZW1wZHN0KzIpID0gKihwVGVtcHNyYzErMik7CisgICAgICAgICAgKihwVGVtcGRzdCszKSA9ICoocFRlbXBzcmMxKzMpOworCisgICAgICAgICAgcFRlbXBkc3QgKz0gNDsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaVMgPSBpSDsgaVMgPCBpTTsgaVMrKykgICAvKiByZXBsaWNhdGUgc2Vjb25kIGhhbGYgKi8KKyAgICAgICAgeworICAgICAgICAgICpwVGVtcGRzdCAgICAgPSAqcFRlbXBzcmMyOworICAgICAgICAgICoocFRlbXBkc3QrMSkgPSAqKHBUZW1wc3JjMisxKTsKKyAgICAgICAgICAqKHBUZW1wZHN0KzIpID0gKihwVGVtcHNyYzIrMik7CisgICAgICAgICAgKihwVGVtcGRzdCszKSA9ICoocFRlbXBzcmMyKzMpOworCisgICAgICAgICAgcFRlbXBkc3QgKz0gNDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBmb3IgKGlTID0gMTsgaVMgPCBpTTsgaVMrKykKKyAgICAgICAgeworICAgICAgICAgICpwVGVtcGRzdCA9ICpwVGVtcHNyYzE7ICAgICAgLyogcmVwZWF0IGZpcnN0IHNvdXJjZSBwaXhlbCAqLworICAgICAgICAgIHBUZW1wZHN0Kys7CisgICAgICAgICAgKnBUZW1wZHN0ID0gKihwVGVtcHNyYzErMSk7CisgICAgICAgICAgcFRlbXBkc3QrKzsKKyAgICAgICAgICAqcFRlbXBkc3QgPSAqKHBUZW1wc3JjMSsyKTsKKyAgICAgICAgICBwVGVtcGRzdCsrOworICAgICAgICAgICpwVGVtcGRzdCA9ICoocFRlbXBzcmMxKzMpOworICAgICAgICAgIHBUZW1wZHN0Kys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBwVGVtcHNyYzEgKz0gNDsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX01BR05JRllfUkdCQThfWDMsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9yZ2JhOF94NCAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBTcmNsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcERzdGxpbmUpCit7CisgIG1uZ191aW50MzIgaVg7CisgIG1uZ19pbnQzMiAgaVMsIGlNLCBpSDsKKyAgbW5nX3VpbnQ4cCBwVGVtcHNyYzE7CisgIG1uZ191aW50OHAgcFRlbXBzcmMyOworICBtbmdfdWludDhwIHBUZW1wZHN0OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX01BR05JRllfUkdCQThfWDQsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBwVGVtcHNyYzEgPSBwU3JjbGluZTsgICAgICAgICAgICAgICAgLyogaW5pdGlhbGl6ZSBwaXhlbC1sb29wICovCisgIHBUZW1wZHN0ICA9IHBEc3RsaW5lOworCisgIGZvciAoaVggPSAwOyBpWCA8IGlXaWR0aDsgaVgrKykKKyAgeworICAgIHBUZW1wc3JjMiA9IHBUZW1wc3JjMSArIDQ7CisKKyAgICAqcFRlbXBkc3QgPSAqcFRlbXBzcmMxOyAgICAgICAgICAgIC8qIGNvcHkgb3JpZ2luYWwgc291cmNlIHBpeGVsICovCisgICAgcFRlbXBkc3QrKzsKKyAgICAqcFRlbXBkc3QgPSAqKHBUZW1wc3JjMSsxKTsKKyAgICBwVGVtcGRzdCsrOworICAgICpwVGVtcGRzdCA9ICoocFRlbXBzcmMxKzIpOworICAgIHBUZW1wZHN0Kys7CisgICAgKnBUZW1wZHN0ID0gKihwVGVtcHNyYzErMyk7CisgICAgcFRlbXBkc3QrKzsKKworICAgIGlmIChpWCA9PSAwKSAgICAgICAgICAgICAgICAgICAgICAgLyogZmlyc3QgaW50ZXJ2YWwgPyAqLworICAgIHsKKyAgICAgIGlmIChpV2lkdGggPT0gMSkgICAgICAgICAgICAgICAgIC8qIHNpbmdsZSBwaXhlbCA/ICovCisgICAgICAgIHBUZW1wc3JjMiA9IE1OR19OVUxMOworCisgICAgICBpTSA9IChtbmdfaW50MzIpaU1MOworICAgIH0KKyAgICBlbHNlCisgICAgaWYgKGlYID09IChpV2lkdGggLSAyKSkgICAgICAgICAgICAvKiBsYXN0IGludGVydmFsID8gKi8KKyAgICAgIGlNID0gKG1uZ19pbnQzMilpTVI7CisgICAgZWxzZQorICAgICAgaU0gPSAobW5nX2ludDMyKWlNWDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbGwgaW50ZXJ2YWwgPyAqLworICAgIGlmICgoaVggPCBpV2lkdGggLSAxKSB8fCAoaVdpZHRoID09IDEpKQorICAgIHsKKyAgICAgIGlmIChwVGVtcHNyYzIpICAgICAgICAgICAgICAgICAgIC8qIGRvIHdlIGhhdmUgdGhlIHNlY29uZCBwaXhlbCA/ICovCisgICAgICB7CisgICAgICAgIGlIID0gKGlNKzEpIC8gMjsgICAgICAgICAgICAgICAvKiBjYWxjdWxhdGUgaGFsZndheSBwb2ludCAqLworCisgICAgICAgIGZvciAoaVMgPSAxOyBpUyA8IGlIOyBpUysrKSAgICAvKiBmaXJzdCBoYWxmICovCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKnBUZW1wc3JjMSA9PSAqcFRlbXBzcmMyKQorICAgICAgICAgICAgKnBUZW1wZHN0ID0gKnBUZW1wc3JjMTsgICAgLyoganVzdCByZXBlYXQgdGhlIGZpcnN0ICovCisgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjYWxjdWxhdGUgdGhlIGRpc3RhbmNlICovCisgICAgICAgICAgICAqcFRlbXBkc3QgPSAobW5nX3VpbnQ4KSgoKDIgKiBpUyAqICggKG1uZ19pbnQzMikoKnBUZW1wc3JjMikgICAgIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX2ludDMyKSgqcFRlbXBzcmMxKSAgICAgKSArIGlNKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlNICogMikpICsgKG1uZ19pbnQzMikoKnBUZW1wc3JjMSkgICAgICAgICAgICAgKTsKKworICAgICAgICAgIHBUZW1wZHN0Kys7CisKKyAgICAgICAgICBpZiAoKihwVGVtcHNyYzErMSkgPT0gKihwVGVtcHNyYzIrMSkpCisgICAgICAgICAgICAqcFRlbXBkc3QgPSAqKHBUZW1wc3JjMSsxKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICAqcFRlbXBkc3QgPSAobW5nX3VpbnQ4KSgoKDIgKiBpUyAqICggKG1uZ19pbnQzMikoKihwVGVtcHNyYzIrMSkpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX2ludDMyKSgqKHBUZW1wc3JjMSsxKSkgKSArIGlNKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlNICogMikpICsgKG1uZ19pbnQzMikoKihwVGVtcHNyYzErMSkpICAgICAgICAgKTsKKworICAgICAgICAgIHBUZW1wZHN0Kys7CisKKyAgICAgICAgICBpZiAoKihwVGVtcHNyYzErMikgPT0gKihwVGVtcHNyYzIrMikpCisgICAgICAgICAgICAqcFRlbXBkc3QgPSAqKHBUZW1wc3JjMSsyKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICAqcFRlbXBkc3QgPSAobW5nX3VpbnQ4KSgoKDIgKiBpUyAqICggKG1uZ19pbnQzMikoKihwVGVtcHNyYzIrMikpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX2ludDMyKSgqKHBUZW1wc3JjMSsyKSkgKSArIGlNKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlNICogMikpICsgKG1uZ19pbnQzMikoKihwVGVtcHNyYzErMikpICAgICAgICAgKTsKKworICAgICAgICAgIHBUZW1wZHN0Kys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZXBsaWNhdGUgYWxwaGEgZnJvbSBsZWZ0ICovCisgICAgICAgICAgKnBUZW1wZHN0ICAgICA9ICoocFRlbXBzcmMxKzMpOworCisgICAgICAgICAgcFRlbXBkc3QrKzsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaVMgPSBpSDsgaVMgPCBpTTsgaVMrKykgICAvKiBzZWNvbmQgaGFsZiAqLworICAgICAgICB7CisgICAgICAgICAgaWYgKCpwVGVtcHNyYzEgPT0gKnBUZW1wc3JjMikKKyAgICAgICAgICAgICpwVGVtcGRzdCA9ICpwVGVtcHNyYzE7ICAgIC8qIGp1c3QgcmVwZWF0IHRoZSBmaXJzdCAqLworICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2FsY3VsYXRlIHRoZSBkaXN0YW5jZSAqLworICAgICAgICAgICAgKnBUZW1wZHN0ID0gKG1uZ191aW50OCkoKCgyICogaVMgKiAoIChtbmdfaW50MzIpKCpwVGVtcHNyYzIpICAgICAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ19pbnQzMikoKnBUZW1wc3JjMSkgICAgICkgKyBpTSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpTSAqIDIpKSArIChtbmdfaW50MzIpKCpwVGVtcHNyYzEpICAgICAgICAgICAgICk7CisKKyAgICAgICAgICBwVGVtcGRzdCsrOworCisgICAgICAgICAgaWYgKCoocFRlbXBzcmMxKzEpID09ICoocFRlbXBzcmMyKzEpKQorICAgICAgICAgICAgKnBUZW1wZHN0ID0gKihwVGVtcHNyYzErMSk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgKnBUZW1wZHN0ID0gKG1uZ191aW50OCkoKCgyICogaVMgKiAoIChtbmdfaW50MzIpKCoocFRlbXBzcmMyKzEpKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ19pbnQzMikoKihwVGVtcHNyYzErMSkpICkgKyBpTSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpTSAqIDIpKSArIChtbmdfaW50MzIpKCoocFRlbXBzcmMxKzEpKSAgICAgICAgICk7CisKKyAgICAgICAgICBwVGVtcGRzdCsrOworCisgICAgICAgICAgaWYgKCoocFRlbXBzcmMxKzIpID09ICoocFRlbXBzcmMyKzIpKQorICAgICAgICAgICAgKnBUZW1wZHN0ID0gKihwVGVtcHNyYzErMik7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgKnBUZW1wZHN0ID0gKG1uZ191aW50OCkoKCgyICogaVMgKiAoIChtbmdfaW50MzIpKCoocFRlbXBzcmMyKzIpKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ19pbnQzMikoKihwVGVtcHNyYzErMikpICkgKyBpTSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpTSAqIDIpKSArIChtbmdfaW50MzIpKCoocFRlbXBzcmMxKzIpKSAgICAgICAgICk7CisKKyAgICAgICAgICBwVGVtcGRzdCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVwbGljYXRlIGFscGhhIGZyb20gcmlnaHQgKi8KKyAgICAgICAgICAqcFRlbXBkc3QgICAgID0gKihwVGVtcHNyYzIrMyk7CisKKyAgICAgICAgICBwVGVtcGRzdCsrOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGZvciAoaVMgPSAxOyBpUyA8IGlNOyBpUysrKQorICAgICAgICB7CisgICAgICAgICAgKnBUZW1wZHN0ID0gKnBUZW1wc3JjMTsgICAgICAvKiByZXBlYXQgZmlyc3Qgc291cmNlIHBpeGVsICovCisgICAgICAgICAgcFRlbXBkc3QrKzsKKyAgICAgICAgICAqcFRlbXBkc3QgPSAqKHBUZW1wc3JjMSsxKTsKKyAgICAgICAgICBwVGVtcGRzdCsrOworICAgICAgICAgICpwVGVtcGRzdCA9ICoocFRlbXBzcmMxKzIpOworICAgICAgICAgIHBUZW1wZHN0Kys7CisgICAgICAgICAgKnBUZW1wZHN0ID0gKihwVGVtcHNyYzErMyk7CisgICAgICAgICAgcFRlbXBkc3QrKzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHBUZW1wc3JjMSArPSA0OworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fTUFHTklGWV9SR0JBOF9YNCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19tYWduaWZ5X3JnYmE4X3g1IChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1YLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcFNyY2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSkKK3sKKyAgbW5nX3VpbnQzMiBpWDsKKyAgbW5nX2ludDMyICBpUywgaU0sIGlIOworICBtbmdfdWludDhwIHBUZW1wc3JjMTsKKyAgbW5nX3VpbnQ4cCBwVGVtcHNyYzI7CisgIG1uZ191aW50OHAgcFRlbXBkc3Q7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fTUFHTklGWV9SR0JBOF9YNSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBUZW1wc3JjMSA9IHBTcmNsaW5lOyAgICAgICAgICAgICAgICAvKiBpbml0aWFsaXplIHBpeGVsLWxvb3AgKi8KKyAgcFRlbXBkc3QgID0gcERzdGxpbmU7CisKKyAgZm9yIChpWCA9IDA7IGlYIDwgaVdpZHRoOyBpWCsrKQorICB7CisgICAgcFRlbXBzcmMyID0gcFRlbXBzcmMxICsgNDsKKworICAgICpwVGVtcGRzdCA9ICpwVGVtcHNyYzE7ICAgICAgICAgICAgLyogY29weSBvcmlnaW5hbCBzb3VyY2UgcGl4ZWwgKi8KKyAgICBwVGVtcGRzdCsrOworICAgICpwVGVtcGRzdCA9ICoocFRlbXBzcmMxKzEpOworICAgIHBUZW1wZHN0Kys7CisgICAgKnBUZW1wZHN0ID0gKihwVGVtcHNyYzErMik7CisgICAgcFRlbXBkc3QrKzsKKyAgICAqcFRlbXBkc3QgPSAqKHBUZW1wc3JjMSszKTsKKyAgICBwVGVtcGRzdCsrOworCisgICAgaWYgKGlYID09IDApICAgICAgICAgICAgICAgICAgICAgICAvKiBmaXJzdCBpbnRlcnZhbCA/ICovCisgICAgeworICAgICAgaWYgKGlXaWR0aCA9PSAxKSAgICAgICAgICAgICAgICAgLyogc2luZ2xlIHBpeGVsID8gKi8KKyAgICAgICAgcFRlbXBzcmMyID0gTU5HX05VTEw7CisKKyAgICAgIGlNID0gKG1uZ19pbnQzMilpTUw7CisgICAgfQorICAgIGVsc2UKKyAgICBpZiAoaVggPT0gKGlXaWR0aCAtIDIpKSAgICAgICAgICAgIC8qIGxhc3QgaW50ZXJ2YWwgPyAqLworICAgICAgaU0gPSAobW5nX2ludDMyKWlNUjsKKyAgICBlbHNlCisgICAgICBpTSA9IChtbmdfaW50MzIpaU1YOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmlsbCBpbnRlcnZhbCA/ICovCisgICAgaWYgKChpWCA8IGlXaWR0aCAtIDEpIHx8IChpV2lkdGggPT0gMSkpCisgICAgeworICAgICAgaWYgKHBUZW1wc3JjMikgICAgICAgICAgICAgICAgICAgLyogZG8gd2UgaGF2ZSB0aGUgc2Vjb25kIHBpeGVsID8gKi8KKyAgICAgIHsKKyAgICAgICAgaUggPSAoaU0rMSkgLyAyOyAgICAgICAgICAgICAgIC8qIGNhbGN1bGF0ZSBoYWxmd2F5IHBvaW50ICovCisKKyAgICAgICAgZm9yIChpUyA9IDE7IGlTIDwgaUg7IGlTKyspICAgIC8qIGZpcnN0IGhhbGYgKi8KKyAgICAgICAgeworICAgICAgICAgICpwVGVtcGRzdCAgICAgPSAqcFRlbXBzcmMxOyAgLyogcmVwbGljYXRlIGNvbG9yIGZyb20gbGVmdCAqLworICAgICAgICAgICoocFRlbXBkc3QrMSkgPSAqKHBUZW1wc3JjMSsxKTsKKyAgICAgICAgICAqKHBUZW1wZHN0KzIpID0gKihwVGVtcHNyYzErMik7CisKKyAgICAgICAgICBpZiAoKihwVGVtcHNyYzErMykgPT0gKihwVGVtcHNyYzIrMykpCisgICAgICAgICAgICAqKHBUZW1wZHN0KzMpID0gKihwVGVtcHNyYzErMyk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgKihwVGVtcGRzdCszKSA9IChtbmdfdWludDgpKCgoMiAqIGlTICogKCAobW5nX2ludDMyKSgqKHBUZW1wc3JjMiszKSkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ19pbnQzMikoKihwVGVtcHNyYzErMykpICkgKyBpTSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlNICogMikpICsgKG1uZ19pbnQzMikoKihwVGVtcHNyYzErMykpICAgICAgICAgKTsKKworICAgICAgICAgIHBUZW1wZHN0ICs9IDQ7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGlTID0gaUg7IGlTIDwgaU07IGlTKyspICAgLyogc2Vjb25kIGhhbGYgKi8KKyAgICAgICAgeworICAgICAgICAgICpwVGVtcGRzdCAgICAgPSAqcFRlbXBzcmMyOyAgLyogcmVwbGljYXRlIGNvbG9yIGZyb20gcmlnaHQgKi8KKyAgICAgICAgICAqKHBUZW1wZHN0KzEpID0gKihwVGVtcHNyYzIrMSk7CisgICAgICAgICAgKihwVGVtcGRzdCsyKSA9ICoocFRlbXBzcmMyKzIpOworCisgICAgICAgICAgaWYgKCoocFRlbXBzcmMxKzMpID09ICoocFRlbXBzcmMyKzMpKQorICAgICAgICAgICAgKihwVGVtcGRzdCszKSA9ICoocFRlbXBzcmMxKzMpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICoocFRlbXBkc3QrMykgPSAobW5nX3VpbnQ4KSgoKDIgKiBpUyAqICggKG1uZ19pbnQzMikoKihwVGVtcHNyYzIrMykpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfaW50MzIpKCoocFRlbXBzcmMxKzMpKSApICsgaU0pIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpTSAqIDIpKSArIChtbmdfaW50MzIpKCoocFRlbXBzcmMxKzMpKSAgICAgICAgICk7CisKKyAgICAgICAgICBwVGVtcGRzdCArPSA0OworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGZvciAoaVMgPSAxOyBpUyA8IGlNOyBpUysrKQorICAgICAgICB7CisgICAgICAgICAgKnBUZW1wZHN0ID0gKnBUZW1wc3JjMTsgICAgICAvKiByZXBlYXQgZmlyc3Qgc291cmNlIHBpeGVsICovCisgICAgICAgICAgcFRlbXBkc3QrKzsKKyAgICAgICAgICAqcFRlbXBkc3QgPSAqKHBUZW1wc3JjMSsxKTsKKyAgICAgICAgICBwVGVtcGRzdCsrOworICAgICAgICAgICpwVGVtcGRzdCA9ICoocFRlbXBzcmMxKzIpOworICAgICAgICAgIHBUZW1wZHN0Kys7CisgICAgICAgICAgKnBUZW1wZHN0ID0gKihwVGVtcHNyYzErMyk7CisgICAgICAgICAgcFRlbXBkc3QrKzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHBUZW1wc3JjMSArPSA0OworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fTUFHTklGWV9SR0JBOF9YNCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0ZPT1RQUklOVF9NQUdOCisjaWZuZGVmIE1OR19OT19HUkFZX1NVUFBPUlQKK21uZ19yZXRjb2RlIG1uZ19tYWduaWZ5X2c4X3kxIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBTcmNsaW5lMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBTcmNsaW5lMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBEc3RsaW5lKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9NQUdOSUZZX0c4X1kxLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX0NPUFkgKHBEc3RsaW5lLCBwU3JjbGluZTEsIGlXaWR0aCk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fTUFHTklGWV9HOF9ZMSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9nOF95MiAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSkKK3sKKyAgbW5nX3VpbnQzMiBpWDsKKyAgbW5nX3VpbnQ4cCBwVGVtcHNyYzE7CisgIG1uZ191aW50OHAgcFRlbXBzcmMyOworICBtbmdfdWludDhwIHBUZW1wZHN0OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX01BR05JRllfRzhfWTIsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBwVGVtcHNyYzEgPSBwU3JjbGluZTE7ICAgICAgICAgICAgICAgLyogaW5pdGlhbGl6ZSBwaXhlbC1sb29wICovCisgIHBUZW1wc3JjMiA9IHBTcmNsaW5lMjsKKyAgcFRlbXBkc3QgID0gcERzdGxpbmU7CisKKyAgaWYgKHBUZW1wc3JjMikgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvIHdlIGhhdmUgYSBzZWNvbmQgbGluZSA/ICovCisgIHsKKyAgICBmb3IgKGlYID0gMDsgaVggPCBpV2lkdGg7IGlYKyspCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjYWxjdWxhdGUgdGhlIGRpc3RhbmNlcyAqLworICAgICAgaWYgKCpwVGVtcHNyYzEgPT0gKnBUZW1wc3JjMikKKyAgICAgICAgKnBUZW1wZHN0ID0gKnBUZW1wc3JjMTsKKyAgICAgIGVsc2UKKyAgICAgICAgKnBUZW1wZHN0ID0gKG1uZ191aW50OCkoICggKDIgKiBpUyAqICggKG1uZ19pbnQzMikoKnBUZW1wc3JjMikgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX2ludDMyKSgqcFRlbXBzcmMxKSApICsgaU0pIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlNICogMikgKSArIChtbmdfaW50MzIpKCpwVGVtcHNyYzEpICk7CisKKyAgICAgIHBUZW1wZHN0Kys7CisgICAgICBwVGVtcHNyYzErKzsKKyAgICAgIHBUZW1wc3JjMisrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBqdXN0IHJlcGVhdCB0aGUgZW50aXJlIGxpbmUgKi8KKyAgICBNTkdfQ09QWSAocFRlbXBkc3QsIHBUZW1wc3JjMSwgaVdpZHRoKTsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX01BR05JRllfRzhfWTIsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9nOF95MyAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fTUFHTklGWV9HOF9ZMywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmIChwU3JjbGluZTIpICAgICAgICAgICAgICAgICAgICAgICAvKiBkbyB3ZSBoYXZlIGEgc2Vjb25kIGxpbmUgPyAqLworICB7CisgICAgaWYgKGlTIDwgKGlNKzEpIC8gMikgICAgICAgICAgICAgICAvKiB0b3AgaGFsZiA/ICovCisgICAgICBNTkdfQ09QWSAocERzdGxpbmUsIHBTcmNsaW5lMSwgaVdpZHRoKQorICAgIGVsc2UKKyAgICAgIE1OR19DT1BZIChwRHN0bGluZSwgcFNyY2xpbmUyLCBpV2lkdGgpOworICB9CisgIGVsc2UKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGp1c3QgcmVwZWF0IHRoZSBlbnRpcmUgbGluZSAqLworICAgIE1OR19DT1BZIChwRHN0bGluZSwgcFNyY2xpbmUxLCBpV2lkdGgpOworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fTUFHTklGWV9HOF9ZMywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYgLyogTU5HX05PX0dSQVlfU1VQUE9SVCAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9yZ2I4X3kxIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcFNyY2xpbmUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBEc3RsaW5lKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9NQUdOSUZZX1JHQjhfWTEsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfQ09QWSAocERzdGxpbmUsIHBTcmNsaW5lMSwgaVdpZHRoICogMyk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fTUFHTklGWV9SR0I4X1kxLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX21hZ25pZnlfcmdiOF95MiAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBTcmNsaW5lMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcFNyY2xpbmUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSkKK3sKKyAgbW5nX3VpbnQzMiBpWDsKKyAgbW5nX3VpbnQ4cCBwVGVtcHNyYzE7CisgIG1uZ191aW50OHAgcFRlbXBzcmMyOworICBtbmdfdWludDhwIHBUZW1wZHN0OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX01BR05JRllfUkdCOF9ZMiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBUZW1wc3JjMSA9IHBTcmNsaW5lMTsgICAgICAgICAgICAgICAvKiBpbml0aWFsaXplIHBpeGVsLWxvb3AgKi8KKyAgcFRlbXBzcmMyID0gcFNyY2xpbmUyOworICBwVGVtcGRzdCAgPSBwRHN0bGluZTsKKworICBpZiAocFRlbXBzcmMyKSAgICAgICAgICAgICAgICAgICAgICAgLyogZG8gd2UgaGF2ZSBhIHNlY29uZCBsaW5lID8gKi8KKyAgeworICAgIGZvciAoaVggPSAwOyBpWCA8IGlXaWR0aDsgaVgrKykKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNhbGN1bGF0ZSB0aGUgZGlzdGFuY2VzICovCisgICAgICBpZiAoKnBUZW1wc3JjMSA9PSAqcFRlbXBzcmMyKQorICAgICAgICAqcFRlbXBkc3QgPSAqcFRlbXBzcmMxOworICAgICAgZWxzZQorICAgICAgICAqcFRlbXBkc3QgPSAobW5nX3VpbnQ4KSggKCAoMiAqIGlTICogKCAobW5nX2ludDMyKSgqcFRlbXBzcmMyKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfaW50MzIpKCpwVGVtcHNyYzEpICkgKyBpTSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaU0gKiAyKSApICsgKG1uZ19pbnQzMikoKnBUZW1wc3JjMSkgKTsKKworICAgICAgcFRlbXBkc3QrKzsKKyAgICAgIHBUZW1wc3JjMSsrOworICAgICAgcFRlbXBzcmMyKys7CisKKyAgICAgIGlmICgqcFRlbXBzcmMxID09ICpwVGVtcHNyYzIpCisgICAgICAgICpwVGVtcGRzdCA9ICpwVGVtcHNyYzE7CisgICAgICBlbHNlCisgICAgICAgICpwVGVtcGRzdCA9IChtbmdfdWludDgpKCAoICgyICogaVMgKiAoIChtbmdfaW50MzIpKCpwVGVtcHNyYzIpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ19pbnQzMikoKnBUZW1wc3JjMSkgKSArIGlNKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpTSAqIDIpICkgKyAobW5nX2ludDMyKSgqcFRlbXBzcmMxKSApOworCisgICAgICBwVGVtcGRzdCsrOworICAgICAgcFRlbXBzcmMxKys7CisgICAgICBwVGVtcHNyYzIrKzsKKworICAgICAgaWYgKCpwVGVtcHNyYzEgPT0gKnBUZW1wc3JjMikKKyAgICAgICAgKnBUZW1wZHN0ID0gKnBUZW1wc3JjMTsKKyAgICAgIGVsc2UKKyAgICAgICAgKnBUZW1wZHN0ID0gKG1uZ191aW50OCkoICggKDIgKiBpUyAqICggKG1uZ19pbnQzMikoKnBUZW1wc3JjMikgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX2ludDMyKSgqcFRlbXBzcmMxKSApICsgaU0pIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlNICogMikgKSArIChtbmdfaW50MzIpKCpwVGVtcHNyYzEpICk7CisKKyAgICAgIHBUZW1wZHN0Kys7CisgICAgICBwVGVtcHNyYzErKzsKKyAgICAgIHBUZW1wc3JjMisrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBqdXN0IHJlcGVhdCB0aGUgZW50aXJlIGxpbmUgKi8KKyAgICBNTkdfQ09QWSAocFRlbXBkc3QsIHBUZW1wc3JjMSwgaVdpZHRoICogMyk7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9NQUdOSUZZX1JHQjhfWTIsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9yZ2I4X3kzIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcFNyY2xpbmUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBEc3RsaW5lKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9NQUdOSUZZX1JHQjhfWTMsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAocFNyY2xpbmUyKSAgICAgICAgICAgICAgICAgICAgICAgLyogZG8gd2UgaGF2ZSBhIHNlY29uZCBsaW5lID8gKi8KKyAgeworICAgIGlmIChpUyA8IChpTSsxKSAvIDIpICAgICAgICAgICAgICAgLyogdG9wIGhhbGYgPyAqLworICAgICAgTU5HX0NPUFkgKHBEc3RsaW5lLCBwU3JjbGluZTEsIGlXaWR0aCAqIDMpCisgICAgZWxzZQorICAgICAgTU5HX0NPUFkgKHBEc3RsaW5lLCBwU3JjbGluZTIsIGlXaWR0aCAqIDMpOworICB9CisgIGVsc2UKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGp1c3QgcmVwZWF0IHRoZSBlbnRpcmUgbGluZSAqLworICAgIE1OR19DT1BZIChwRHN0bGluZSwgcFNyY2xpbmUxLCBpV2lkdGggKiAzKTsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX01BR05JRllfUkdCOF9ZMywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PX0dSQVlfU1VQUE9SVAorbW5nX3JldGNvZGUgbW5nX21hZ25pZnlfZ2E4X3kxIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcFNyY2xpbmUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBEc3RsaW5lKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9NQUdOSUZZX0dBOF9ZMSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19DT1BZIChwRHN0bGluZSwgcFNyY2xpbmUxLCBpV2lkdGggPDwgMSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fTUFHTklGWV9HQThfWTEsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9nYThfeTIgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBTcmNsaW5lMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcERzdGxpbmUpCit7CisgIG1uZ191aW50MzIgaVg7CisgIG1uZ191aW50OHAgcFRlbXBzcmMxOworICBtbmdfdWludDhwIHBUZW1wc3JjMjsKKyAgbW5nX3VpbnQ4cCBwVGVtcGRzdDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9NQUdOSUZZX0dBOF9ZMiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBUZW1wc3JjMSA9IHBTcmNsaW5lMTsgICAgICAgICAgICAgICAvKiBpbml0aWFsaXplIHBpeGVsLWxvb3AgKi8KKyAgcFRlbXBzcmMyID0gcFNyY2xpbmUyOworICBwVGVtcGRzdCAgPSBwRHN0bGluZTsKKworICBpZiAocFRlbXBzcmMyKSAgICAgICAgICAgICAgICAgICAgICAgLyogZG8gd2UgaGF2ZSBhIHNlY29uZCBsaW5lID8gKi8KKyAgeworICAgIGZvciAoaVggPSAwOyBpWCA8IGlXaWR0aDsgaVgrKykKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNhbGN1bGF0ZSB0aGUgZGlzdGFuY2VzICovCisgICAgICBpZiAoKnBUZW1wc3JjMSA9PSAqcFRlbXBzcmMyKQorICAgICAgICAqcFRlbXBkc3QgPSAqcFRlbXBzcmMxOworICAgICAgZWxzZQorICAgICAgICAqcFRlbXBkc3QgPSAobW5nX3VpbnQ4KSggKCAoMiAqIGlTICogKCAobW5nX2ludDMyKSgqcFRlbXBzcmMyKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfaW50MzIpKCpwVGVtcHNyYzEpICkgKyBpTSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaU0gKiAyKSApICsgKG1uZ19pbnQzMikoKnBUZW1wc3JjMSkgKTsKKworICAgICAgcFRlbXBkc3QrKzsKKyAgICAgIHBUZW1wc3JjMSsrOworICAgICAgcFRlbXBzcmMyKys7CisKKyAgICAgIGlmICgqcFRlbXBzcmMxID09ICpwVGVtcHNyYzIpCisgICAgICAgICpwVGVtcGRzdCA9ICpwVGVtcHNyYzE7CisgICAgICBlbHNlCisgICAgICAgICpwVGVtcGRzdCA9IChtbmdfdWludDgpKCAoICgyICogaVMgKiAoIChtbmdfaW50MzIpKCpwVGVtcHNyYzIpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ19pbnQzMikoKnBUZW1wc3JjMSkgKSArIGlNKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpTSAqIDIpICkgKyAobW5nX2ludDMyKSgqcFRlbXBzcmMxKSApOworCisgICAgICBwVGVtcGRzdCsrOworICAgICAgcFRlbXBzcmMxKys7CisgICAgICBwVGVtcHNyYzIrKzsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoganVzdCByZXBlYXQgdGhlIGVudGlyZSBsaW5lICovCisgICAgTU5HX0NPUFkgKHBUZW1wZHN0LCBwVGVtcHNyYzEsIGlXaWR0aCA8PCAxKTsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX01BR05JRllfR0E4X1kyLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX21hZ25pZnlfZ2E4X3kzIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcFNyY2xpbmUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBEc3RsaW5lKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9NQUdOSUZZX0dBOF9ZMywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmIChwU3JjbGluZTIpICAgICAgICAgICAgICAgICAgICAgICAvKiBkbyB3ZSBoYXZlIGEgc2Vjb25kIGxpbmUgPyAqLworICB7CisgICAgaWYgKGlTIDwgKGlNKzEpIC8gMikgICAgICAgICAgICAgICAvKiB0b3AgaGFsZiA/ICovCisgICAgICBNTkdfQ09QWSAocERzdGxpbmUsIHBTcmNsaW5lMSwgaVdpZHRoIDw8IDEpCisgICAgZWxzZQorICAgICAgTU5HX0NPUFkgKHBEc3RsaW5lLCBwU3JjbGluZTIsIGlXaWR0aCA8PCAxKTsKKyAgfQorICBlbHNlCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBqdXN0IHJlcGVhdCB0aGUgZW50aXJlIGxpbmUgKi8KKyAgICBNTkdfQ09QWSAocERzdGxpbmUsIHBTcmNsaW5lMSwgaVdpZHRoIDw8IDEpOworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fTUFHTklGWV9HQThfWTIsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9nYThfeTQgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBTcmNsaW5lMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcERzdGxpbmUpCit7CisgIG1uZ191aW50MzIgaVg7CisgIG1uZ191aW50OHAgcFRlbXBzcmMxOworICBtbmdfdWludDhwIHBUZW1wc3JjMjsKKyAgbW5nX3VpbnQ4cCBwVGVtcGRzdDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9NQUdOSUZZX0dBOF9ZNCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBUZW1wc3JjMSA9IHBTcmNsaW5lMTsgICAgICAgICAgICAgICAvKiBpbml0aWFsaXplIHBpeGVsLWxvb3AgKi8KKyAgcFRlbXBzcmMyID0gcFNyY2xpbmUyOworICBwVGVtcGRzdCAgPSBwRHN0bGluZTsKKworICBpZiAocFRlbXBzcmMyKSAgICAgICAgICAgICAgICAgICAgICAgLyogZG8gd2UgaGF2ZSBhIHNlY29uZCBsaW5lID8gKi8KKyAgeworICAgIGlmIChpUyA8IChpTSsxKSAvIDIpICAgICAgICAgICAgICAgLyogdG9wIGhhbGYgPyAqLworICAgIHsKKyAgICAgIGZvciAoaVggPSAwOyBpWCA8IGlXaWR0aDsgaVgrKykKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNhbGN1bGF0ZSB0aGUgZGlzdGFuY2VzICovCisgICAgICAgIGlmICgqcFRlbXBzcmMxID09ICpwVGVtcHNyYzIpCisgICAgICAgICAgKnBUZW1wZHN0ID0gKnBUZW1wc3JjMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICpwVGVtcGRzdCA9IChtbmdfdWludDgpKCAoICgyICogaVMgKiAoIChtbmdfaW50MzIpKCpwVGVtcHNyYzIpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX2ludDMyKSgqcFRlbXBzcmMxKSApICsgaU0pIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaU0gKiAyKSApICsgKG1uZ19pbnQzMikoKnBUZW1wc3JjMSkgKTsKKworICAgICAgICBwVGVtcGRzdCsrOworICAgICAgICBwVGVtcHNyYzErKzsKKyAgICAgICAgcFRlbXBzcmMyICs9IDI7CisKKyAgICAgICAgKnBUZW1wZHN0KysgPSAqcFRlbXBzcmMxKys7ICAgIC8qIHJlcGxpY2F0ZSBhbHBoYSBmcm9tIHRvcCAqLworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgZm9yIChpWCA9IDA7IGlYIDwgaVdpZHRoOyBpWCsrKQorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2FsY3VsYXRlIHRoZSBkaXN0YW5jZXMgKi8KKyAgICAgICAgaWYgKCpwVGVtcHNyYzEgPT0gKnBUZW1wc3JjMikKKyAgICAgICAgICAqcFRlbXBkc3QgPSAqcFRlbXBzcmMxOworICAgICAgICBlbHNlCisgICAgICAgICAgKnBUZW1wZHN0ID0gKG1uZ191aW50OCkoICggKDIgKiBpUyAqICggKG1uZ19pbnQzMikoKnBUZW1wc3JjMikgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfaW50MzIpKCpwVGVtcHNyYzEpICkgKyBpTSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpTSAqIDIpICkgKyAobW5nX2ludDMyKSgqcFRlbXBzcmMxKSApOworCisgICAgICAgIHBUZW1wZHN0Kys7CisgICAgICAgIHBUZW1wc3JjMSArPSAyOworICAgICAgICBwVGVtcHNyYzIrKzsKKworICAgICAgICAqcFRlbXBkc3QrKyA9ICpwVGVtcHNyYzIrKzsgICAgLyogcmVwbGljYXRlIGFscGhhIGZyb20gYm90dG9tICovCisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGp1c3QgcmVwZWF0IHRoZSBlbnRpcmUgbGluZSAqLworICAgIE1OR19DT1BZIChwVGVtcGRzdCwgcFRlbXBzcmMxLCBpV2lkdGggPDwgMSk7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9NQUdOSUZZX0dBOF9ZNCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19tYWduaWZ5X2dhOF95NSAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcFNyY2xpbmUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBTcmNsaW5lMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSkKK3sKKyAgbW5nX3VpbnQzMiBpWDsKKyAgbW5nX3VpbnQ4cCBwVGVtcHNyYzE7CisgIG1uZ191aW50OHAgcFRlbXBzcmMyOworICBtbmdfdWludDhwIHBUZW1wZHN0OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX01BR05JRllfR0E4X1k1LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcFRlbXBzcmMxID0gcFNyY2xpbmUxOyAgICAgICAgICAgICAgIC8qIGluaXRpYWxpemUgcGl4ZWwtbG9vcCAqLworICBwVGVtcHNyYzIgPSBwU3JjbGluZTI7CisgIHBUZW1wZHN0ICA9IHBEc3RsaW5lOworCisgIGlmIChwVGVtcHNyYzIpICAgICAgICAgICAgICAgICAgICAgICAvKiBkbyB3ZSBoYXZlIGEgc2Vjb25kIGxpbmUgPyAqLworICB7CisgICAgaWYgKGlTIDwgKGlNKzEpIC8gMikgICAgICAgICAgICAgICAvKiB0b3AgaGFsZiA/ICovCisgICAgeworICAgICAgZm9yIChpWCA9IDA7IGlYIDwgaVdpZHRoOyBpWCsrKQorICAgICAgeworICAgICAgICAqcFRlbXBkc3QgPSAqcFRlbXBzcmMxOyAgICAgICAgLyogcmVwbGljYXRlIGdyYXkgZnJvbSB0b3AgKi8KKworICAgICAgICBwVGVtcGRzdCsrOworICAgICAgICBwVGVtcHNyYzErKzsKKyAgICAgICAgcFRlbXBzcmMyKys7CisKKyAgICAgICAgaWYgKCpwVGVtcHNyYzEgPT0gKnBUZW1wc3JjMikgIC8qIGNhbGN1bGF0ZSB0aGUgZGlzdGFuY2VzICovCisgICAgICAgICAgKnBUZW1wZHN0ID0gKnBUZW1wc3JjMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICpwVGVtcGRzdCA9IChtbmdfdWludDgpKCAoICgyICogaVMgKiAoIChtbmdfaW50MzIpKCpwVGVtcHNyYzIpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX2ludDMyKSgqcFRlbXBzcmMxKSApICsgaU0pIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaU0gKiAyKSApICsgKG1uZ19pbnQzMikoKnBUZW1wc3JjMSkgKTsKKworICAgICAgICBwVGVtcGRzdCsrOworICAgICAgICBwVGVtcHNyYzErKzsKKyAgICAgICAgcFRlbXBzcmMyKys7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBmb3IgKGlYID0gMDsgaVggPCBpV2lkdGg7IGlYKyspCisgICAgICB7CisgICAgICAgICpwVGVtcGRzdCA9ICpwVGVtcHNyYzI7ICAgICAgICAvKiByZXBsaWNhdGUgZ3JheSBmcm9tIGJvdHRvbSAqLworCisgICAgICAgIHBUZW1wZHN0Kys7CisgICAgICAgIHBUZW1wc3JjMSsrOworICAgICAgICBwVGVtcHNyYzIrKzsKKworICAgICAgICBpZiAoKnBUZW1wc3JjMSA9PSAqcFRlbXBzcmMyKSAgLyogY2FsY3VsYXRlIHRoZSBkaXN0YW5jZXMgKi8KKyAgICAgICAgICAqcFRlbXBkc3QgPSAqcFRlbXBzcmMxOworICAgICAgICBlbHNlCisgICAgICAgICAgKnBUZW1wZHN0ID0gKG1uZ191aW50OCkoICggKDIgKiBpUyAqICggKG1uZ19pbnQzMikoKnBUZW1wc3JjMikgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfaW50MzIpKCpwVGVtcHNyYzEpICkgKyBpTSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpTSAqIDIpICkgKyAobW5nX2ludDMyKSgqcFRlbXBzcmMxKSApOworCisgICAgICAgIHBUZW1wZHN0Kys7CisgICAgICAgIHBUZW1wc3JjMSsrOworICAgICAgICBwVGVtcHNyYzIrKzsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoganVzdCByZXBlYXQgdGhlIGVudGlyZSBsaW5lICovCisgICAgTU5HX0NPUFkgKHBUZW1wZHN0LCBwVGVtcHNyYzEsIGlXaWR0aCA8PCAxKTsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX01BR05JRllfR0E4X1k1LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZiAvKiBNTkdfTk9fR1JBWV9TVVBQT1JUICovCisjZW5kaWYgLyogTU5HX09QVElNSVpFX0ZPT1RQUklOVF9NQUdOICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19tYWduaWZ5X3JnYmE4X3kxIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBTcmNsaW5lMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBTcmNsaW5lMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBEc3RsaW5lKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9NQUdOSUZZX1JHQkE4X1kxLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX0NPUFkgKHBEc3RsaW5lLCBwU3JjbGluZTEsIGlXaWR0aCA8PCAyKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9NQUdOSUZZX1JHQkE4X1kxLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX21hZ25pZnlfcmdiYThfeTIgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcFNyY2xpbmUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcFNyY2xpbmUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcERzdGxpbmUpCit7CisgIG1uZ191aW50MzIgaVg7CisgIG1uZ191aW50OHAgcFRlbXBzcmMxOworICBtbmdfdWludDhwIHBUZW1wc3JjMjsKKyAgbW5nX3VpbnQ4cCBwVGVtcGRzdDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9NQUdOSUZZX1JHQkE4X1kyLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcFRlbXBzcmMxID0gcFNyY2xpbmUxOyAgICAgICAgICAgICAgIC8qIGluaXRpYWxpemUgcGl4ZWwtbG9vcCAqLworICBwVGVtcHNyYzIgPSBwU3JjbGluZTI7CisgIHBUZW1wZHN0ICA9IHBEc3RsaW5lOworCisgIGlmIChwVGVtcHNyYzIpICAgICAgICAgICAgICAgICAgICAgICAvKiBkbyB3ZSBoYXZlIGEgc2Vjb25kIGxpbmUgPyAqLworICB7CisgICAgZm9yIChpWCA9IDA7IGlYIDwgaVdpZHRoOyBpWCsrKQorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2FsY3VsYXRlIHRoZSBkaXN0YW5jZXMgKi8KKyAgICAgIGlmICgqcFRlbXBzcmMxID09ICpwVGVtcHNyYzIpCisgICAgICAgICpwVGVtcGRzdCA9ICpwVGVtcHNyYzE7CisgICAgICBlbHNlCisgICAgICAgICpwVGVtcGRzdCA9IChtbmdfdWludDgpKCAoICgyICogaVMgKiAoIChtbmdfaW50MzIpKCpwVGVtcHNyYzIpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ19pbnQzMikoKnBUZW1wc3JjMSkgKSArIGlNKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpTSAqIDIpICkgKyAobW5nX2ludDMyKSgqcFRlbXBzcmMxKSApOworCisgICAgICBwVGVtcGRzdCsrOworICAgICAgcFRlbXBzcmMxKys7CisgICAgICBwVGVtcHNyYzIrKzsKKworICAgICAgaWYgKCpwVGVtcHNyYzEgPT0gKnBUZW1wc3JjMikKKyAgICAgICAgKnBUZW1wZHN0ID0gKnBUZW1wc3JjMTsKKyAgICAgIGVsc2UKKyAgICAgICAgKnBUZW1wZHN0ID0gKG1uZ191aW50OCkoICggKDIgKiBpUyAqICggKG1uZ19pbnQzMikoKnBUZW1wc3JjMikgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX2ludDMyKSgqcFRlbXBzcmMxKSApICsgaU0pIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlNICogMikgKSArIChtbmdfaW50MzIpKCpwVGVtcHNyYzEpICk7CisKKyAgICAgIHBUZW1wZHN0Kys7CisgICAgICBwVGVtcHNyYzErKzsKKyAgICAgIHBUZW1wc3JjMisrOworCisgICAgICBpZiAoKnBUZW1wc3JjMSA9PSAqcFRlbXBzcmMyKQorICAgICAgICAqcFRlbXBkc3QgPSAqcFRlbXBzcmMxOworICAgICAgZWxzZQorICAgICAgICAqcFRlbXBkc3QgPSAobW5nX3VpbnQ4KSggKCAoMiAqIGlTICogKCAobW5nX2ludDMyKSgqcFRlbXBzcmMyKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfaW50MzIpKCpwVGVtcHNyYzEpICkgKyBpTSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaU0gKiAyKSApICsgKG1uZ19pbnQzMikoKnBUZW1wc3JjMSkgKTsKKworICAgICAgcFRlbXBkc3QrKzsKKyAgICAgIHBUZW1wc3JjMSsrOworICAgICAgcFRlbXBzcmMyKys7CisKKyAgICAgIGlmICgqcFRlbXBzcmMxID09ICpwVGVtcHNyYzIpCisgICAgICAgICpwVGVtcGRzdCA9ICpwVGVtcHNyYzE7CisgICAgICBlbHNlCisgICAgICAgICpwVGVtcGRzdCA9IChtbmdfdWludDgpKCAoICgyICogaVMgKiAoIChtbmdfaW50MzIpKCpwVGVtcHNyYzIpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ19pbnQzMikoKnBUZW1wc3JjMSkgKSArIGlNKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpTSAqIDIpICkgKyAobW5nX2ludDMyKSgqcFRlbXBzcmMxKSApOworCisgICAgICBwVGVtcGRzdCsrOworICAgICAgcFRlbXBzcmMxKys7CisgICAgICBwVGVtcHNyYzIrKzsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoganVzdCByZXBlYXQgdGhlIGVudGlyZSBsaW5lICovCisgICAgTU5HX0NPUFkgKHBUZW1wZHN0LCBwVGVtcHNyYzEsIGlXaWR0aCA8PCAyKTsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX01BR05JRllfUkdCQThfWTIsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9yZ2JhOF95MyAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fTUFHTklGWV9SR0JBOF9ZMywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmIChwU3JjbGluZTIpICAgICAgICAgICAgICAgICAgICAgICAvKiBkbyB3ZSBoYXZlIGEgc2Vjb25kIGxpbmUgPyAqLworICB7CisgICAgaWYgKGlTIDwgKGlNKzEpIC8gMikgICAgICAgICAgICAgICAvKiB0b3AgaGFsZiA/ICovCisgICAgICBNTkdfQ09QWSAocERzdGxpbmUsIHBTcmNsaW5lMSwgaVdpZHRoIDw8IDIpCisgICAgZWxzZQorICAgICAgTU5HX0NPUFkgKHBEc3RsaW5lLCBwU3JjbGluZTIsIGlXaWR0aCA8PCAyKTsKKyAgfQorICBlbHNlCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBqdXN0IHJlcGVhdCB0aGUgZW50aXJlIGxpbmUgKi8KKyAgICBNTkdfQ09QWSAocERzdGxpbmUsIHBTcmNsaW5lMSwgaVdpZHRoIDw8IDIpOworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fTUFHTklGWV9SR0JBOF9ZMiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19tYWduaWZ5X3JnYmE4X3k0IChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBTcmNsaW5lMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBTcmNsaW5lMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBEc3RsaW5lKQoreworICBtbmdfdWludDMyIGlYOworICBtbmdfdWludDhwIHBUZW1wc3JjMTsKKyAgbW5nX3VpbnQ4cCBwVGVtcHNyYzI7CisgIG1uZ191aW50OHAgcFRlbXBkc3Q7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fTUFHTklGWV9SR0JBOF9ZNCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBUZW1wc3JjMSA9IHBTcmNsaW5lMTsgICAgICAgICAgICAgICAvKiBpbml0aWFsaXplIHBpeGVsLWxvb3AgKi8KKyAgcFRlbXBzcmMyID0gcFNyY2xpbmUyOworICBwVGVtcGRzdCAgPSBwRHN0bGluZTsKKworICBpZiAocFRlbXBzcmMyKSAgICAgICAgICAgICAgICAgICAgICAgLyogZG8gd2UgaGF2ZSBhIHNlY29uZCBsaW5lID8gKi8KKyAgeworICAgIGlmIChpUyA8IChpTSsxKSAvIDIpICAgICAgICAgICAgICAgLyogdG9wIGhhbGYgPyAqLworICAgIHsKKyAgICAgIGZvciAoaVggPSAwOyBpWCA8IGlXaWR0aDsgaVgrKykKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNhbGN1bGF0ZSB0aGUgZGlzdGFuY2VzICovCisgICAgICAgIGlmICgqcFRlbXBzcmMxID09ICpwVGVtcHNyYzIpCisgICAgICAgICAgKnBUZW1wZHN0ID0gKnBUZW1wc3JjMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICpwVGVtcGRzdCA9IChtbmdfdWludDgpKCAoICgyICogaVMgKiAoIChtbmdfaW50MzIpKCpwVGVtcHNyYzIpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX2ludDMyKSgqcFRlbXBzcmMxKSApICsgaU0pIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaU0gKiAyKSApICsgKG1uZ19pbnQzMikoKnBUZW1wc3JjMSkgKTsKKworICAgICAgICBwVGVtcGRzdCsrOworICAgICAgICBwVGVtcHNyYzErKzsKKyAgICAgICAgcFRlbXBzcmMyKys7CisKKyAgICAgICAgaWYgKCpwVGVtcHNyYzEgPT0gKnBUZW1wc3JjMikKKyAgICAgICAgICAqcFRlbXBkc3QgPSAqcFRlbXBzcmMxOworICAgICAgICBlbHNlCisgICAgICAgICAgKnBUZW1wZHN0ID0gKG1uZ191aW50OCkoICggKDIgKiBpUyAqICggKG1uZ19pbnQzMikoKnBUZW1wc3JjMikgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfaW50MzIpKCpwVGVtcHNyYzEpICkgKyBpTSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpTSAqIDIpICkgKyAobW5nX2ludDMyKSgqcFRlbXBzcmMxKSApOworCisgICAgICAgIHBUZW1wZHN0Kys7CisgICAgICAgIHBUZW1wc3JjMSsrOworICAgICAgICBwVGVtcHNyYzIrKzsKKworICAgICAgICBpZiAoKnBUZW1wc3JjMSA9PSAqcFRlbXBzcmMyKQorICAgICAgICAgICpwVGVtcGRzdCA9ICpwVGVtcHNyYzE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAqcFRlbXBkc3QgPSAobW5nX3VpbnQ4KSggKCAoMiAqIGlTICogKCAobW5nX2ludDMyKSgqcFRlbXBzcmMyKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ19pbnQzMikoKnBUZW1wc3JjMSkgKSArIGlNKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlNICogMikgKSArIChtbmdfaW50MzIpKCpwVGVtcHNyYzEpICk7CisKKyAgICAgICAgcFRlbXBkc3QrKzsKKyAgICAgICAgcFRlbXBzcmMxKys7CisgICAgICAgIHBUZW1wc3JjMiArPSAyOworCisgICAgICAgICpwVGVtcGRzdCsrID0gKnBUZW1wc3JjMSsrOyAgICAvKiByZXBsaWNhdGUgYWxwaGEgZnJvbSB0b3AgKi8KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGZvciAoaVggPSAwOyBpWCA8IGlXaWR0aDsgaVgrKykKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNhbGN1bGF0ZSB0aGUgZGlzdGFuY2VzICovCisgICAgICAgIGlmICgqcFRlbXBzcmMxID09ICpwVGVtcHNyYzIpCisgICAgICAgICAgKnBUZW1wZHN0ID0gKnBUZW1wc3JjMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICpwVGVtcGRzdCA9IChtbmdfdWludDgpKCAoICgyICogaVMgKiAoIChtbmdfaW50MzIpKCpwVGVtcHNyYzIpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX2ludDMyKSgqcFRlbXBzcmMxKSApICsgaU0pIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaU0gKiAyKSApICsgKG1uZ19pbnQzMikoKnBUZW1wc3JjMSkgKTsKKworICAgICAgICBwVGVtcGRzdCsrOworICAgICAgICBwVGVtcHNyYzErKzsKKyAgICAgICAgcFRlbXBzcmMyKys7CisKKyAgICAgICAgaWYgKCpwVGVtcHNyYzEgPT0gKnBUZW1wc3JjMikKKyAgICAgICAgICAqcFRlbXBkc3QgPSAqcFRlbXBzcmMxOworICAgICAgICBlbHNlCisgICAgICAgICAgKnBUZW1wZHN0ID0gKG1uZ191aW50OCkoICggKDIgKiBpUyAqICggKG1uZ19pbnQzMikoKnBUZW1wc3JjMikgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfaW50MzIpKCpwVGVtcHNyYzEpICkgKyBpTSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpTSAqIDIpICkgKyAobW5nX2ludDMyKSgqcFRlbXBzcmMxKSApOworCisgICAgICAgIHBUZW1wZHN0Kys7CisgICAgICAgIHBUZW1wc3JjMSsrOworICAgICAgICBwVGVtcHNyYzIrKzsKKworICAgICAgICBpZiAoKnBUZW1wc3JjMSA9PSAqcFRlbXBzcmMyKQorICAgICAgICAgICpwVGVtcGRzdCA9ICpwVGVtcHNyYzE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAqcFRlbXBkc3QgPSAobW5nX3VpbnQ4KSggKCAoMiAqIGlTICogKCAobW5nX2ludDMyKSgqcFRlbXBzcmMyKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ19pbnQzMikoKnBUZW1wc3JjMSkgKSArIGlNKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlNICogMikgKSArIChtbmdfaW50MzIpKCpwVGVtcHNyYzEpICk7CisKKyAgICAgICAgcFRlbXBkc3QrKzsKKyAgICAgICAgcFRlbXBzcmMxICs9IDI7CisgICAgICAgIHBUZW1wc3JjMisrOworCisgICAgICAgICpwVGVtcGRzdCsrID0gKnBUZW1wc3JjMisrOyAgICAvKiByZXBsaWNhdGUgYWxwaGEgZnJvbSBib3R0b20gKi8KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoganVzdCByZXBlYXQgdGhlIGVudGlyZSBsaW5lICovCisgICAgTU5HX0NPUFkgKHBUZW1wZHN0LCBwVGVtcHNyYzEsIGlXaWR0aCA8PCAyKTsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX01BR05JRllfUkdCQThfWTQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9yZ2JhOF95NSAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSkKK3sKKyAgbW5nX3VpbnQzMiBpWDsKKyAgbW5nX3VpbnQ4cCBwVGVtcHNyYzE7CisgIG1uZ191aW50OHAgcFRlbXBzcmMyOworICBtbmdfdWludDhwIHBUZW1wZHN0OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX01BR05JRllfUkdCQThfWTUsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBwVGVtcHNyYzEgPSBwU3JjbGluZTE7ICAgICAgICAgICAgICAgLyogaW5pdGlhbGl6ZSBwaXhlbC1sb29wICovCisgIHBUZW1wc3JjMiA9IHBTcmNsaW5lMjsKKyAgcFRlbXBkc3QgID0gcERzdGxpbmU7CisKKyAgaWYgKHBUZW1wc3JjMikgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvIHdlIGhhdmUgYSBzZWNvbmQgbGluZSA/ICovCisgIHsKKyAgICBpZiAoaVMgPCAoaU0rMSkgLyAyKSAgICAgICAgICAgICAgIC8qIHRvcCBoYWxmID8gKi8KKyAgICB7CisgICAgICBmb3IgKGlYID0gMDsgaVggPCBpV2lkdGg7IGlYKyspCisgICAgICB7CisgICAgICAgICpwVGVtcGRzdCsrID0gKnBUZW1wc3JjMSsrOyAgICAvKiByZXBsaWNhdGUgY29sb3IgZnJvbSB0b3AgKi8KKyAgICAgICAgKnBUZW1wZHN0KysgPSAqcFRlbXBzcmMxKys7CisgICAgICAgICpwVGVtcGRzdCsrID0gKnBUZW1wc3JjMSsrOworCisgICAgICAgIHBUZW1wc3JjMiArPSAzOworCisgICAgICAgIGlmICgqcFRlbXBzcmMxID09ICpwVGVtcHNyYzIpICAvKiBjYWxjdWxhdGUgdGhlIGRpc3RhbmNlcyAqLworICAgICAgICAgICpwVGVtcGRzdCA9ICpwVGVtcHNyYzE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAqcFRlbXBkc3QgPSAobW5nX3VpbnQ4KSggKCAoMiAqIGlTICogKCAobW5nX2ludDMyKSgqcFRlbXBzcmMyKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ19pbnQzMikoKnBUZW1wc3JjMSkgKSArIGlNKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlNICogMikgKSArIChtbmdfaW50MzIpKCpwVGVtcHNyYzEpICk7CisKKyAgICAgICAgcFRlbXBkc3QrKzsKKyAgICAgICAgcFRlbXBzcmMxKys7CisgICAgICAgIHBUZW1wc3JjMisrOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgZm9yIChpWCA9IDA7IGlYIDwgaVdpZHRoOyBpWCsrKQorICAgICAgeworICAgICAgICAqcFRlbXBkc3QrKyA9ICpwVGVtcHNyYzIrKzsgICAgLyogcmVwbGljYXRlIGNvbG9yIGZyb20gYm90dG9tICovCisgICAgICAgICpwVGVtcGRzdCsrID0gKnBUZW1wc3JjMisrOworICAgICAgICAqcFRlbXBkc3QrKyA9ICpwVGVtcHNyYzIrKzsKKworICAgICAgICBwVGVtcHNyYzEgKz0gMzsKKworICAgICAgICBpZiAoKnBUZW1wc3JjMSA9PSAqcFRlbXBzcmMyKSAgLyogY2FsY3VsYXRlIHRoZSBkaXN0YW5jZXMgKi8KKyAgICAgICAgICAqcFRlbXBkc3QgPSAqcFRlbXBzcmMxOworICAgICAgICBlbHNlCisgICAgICAgICAgKnBUZW1wZHN0ID0gKG1uZ191aW50OCkoICggKDIgKiBpUyAqICggKG1uZ19pbnQzMikoKnBUZW1wc3JjMikgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfaW50MzIpKCpwVGVtcHNyYzEpICkgKyBpTSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpTSAqIDIpICkgKyAobW5nX2ludDMyKSgqcFRlbXBzcmMxKSApOworCisgICAgICAgIHBUZW1wZHN0Kys7CisgICAgICAgIHBUZW1wc3JjMSsrOworICAgICAgICBwVGVtcHNyYzIrKzsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoganVzdCByZXBlYXQgdGhlIGVudGlyZSBsaW5lICovCisgICAgTU5HX0NPUFkgKHBUZW1wZHN0LCBwVGVtcHNyYzEsIGlXaWR0aCA8PCAyKTsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX01BR05JRllfUkdCQThfWTUsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9GT09UUFJJTlRfTUFHTgorI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorI2lmbmRlZiBNTkdfTk9fR1JBWV9TVVBQT1JUCittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9nMTZfeDEgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1YLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBTcmNsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBEc3RsaW5lKQoreworICBtbmdfdWludDMyICBpWCwgaVMsIGlNOworICBtbmdfdWludDE2cCBwVGVtcHNyYzE7CisgIG1uZ191aW50MTZwIHBUZW1wZHN0OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX01BR05JRllfRzE2X1gxLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcFRlbXBzcmMxID0gKG1uZ191aW50MTZwKXBTcmNsaW5lOyAgIC8qIGluaXRpYWxpemUgcGl4ZWwtbG9vcCAqLworICBwVGVtcGRzdCAgPSAobW5nX3VpbnQxNnApcERzdGxpbmU7CisKKyAgZm9yIChpWCA9IDA7IGlYIDwgaVdpZHRoOyBpWCsrKQorICB7CisgICAgKnBUZW1wZHN0ID0gKnBUZW1wc3JjMTsgICAgICAgICAgICAvKiBjb3B5IG9yaWdpbmFsIHNvdXJjZSBwaXhlbCAqLworICAgIHBUZW1wZHN0Kys7CisKKyAgICBpZiAoaVggPT0gMCkgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpcnN0IGludGVydmFsID8gKi8KKyAgICAgIGlNID0gaU1MOworICAgIGVsc2UKKyAgICBpZiAoaVggPT0gKGlXaWR0aCAtIDEpKSAgICAgICAgICAgIC8qIGxhc3QgaW50ZXJ2YWwgPyAqLworICAgICAgaU0gPSBpTVI7CisgICAgZWxzZQorICAgICAgaU0gPSBpTVg7CisKKyAgICBmb3IgKGlTID0gMTsgaVMgPCBpTTsgaVMrKykgICAgICAgIC8qIGZpbGwgaW50ZXJ2YWwgKi8KKyAgICB7CisgICAgICAqcFRlbXBkc3QgPSAqcFRlbXBzcmMxOyAgICAgICAgICAvKiBjb3B5IG9yaWdpbmFsIHNvdXJjZSBwaXhlbCAqLworICAgICAgcFRlbXBkc3QrKzsKKyAgICB9CisKKyAgICBwVGVtcHNyYzErKzsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX01BR05JRllfRzE2X1gxLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX21hZ25pZnlfZzE2X3gyIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSkKK3sKKyAgbW5nX3VpbnQzMiAgaVg7CisgIG1uZ19pbnQzMiAgIGlTLCBpTTsKKyAgbW5nX3VpbnQxNnAgcFRlbXBzcmMxOworICBtbmdfdWludDE2cCBwVGVtcHNyYzI7CisgIG1uZ191aW50MTZwIHBUZW1wZHN0OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX01BR05JRllfRzE2X1gyLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcFRlbXBzcmMxID0gKG1uZ191aW50MTZwKXBTcmNsaW5lOyAgIC8qIGluaXRpYWxpemUgcGl4ZWwtbG9vcCAqLworICBwVGVtcGRzdCAgPSAobW5nX3VpbnQxNnApcERzdGxpbmU7CisKKyAgZm9yIChpWCA9IDA7IGlYIDwgaVdpZHRoOyBpWCsrKQorICB7CisgICAgcFRlbXBzcmMyID0gcFRlbXBzcmMxICsgMTsKKworICAgICpwVGVtcGRzdCA9ICpwVGVtcHNyYzE7ICAgICAgICAgICAgLyogY29weSBvcmlnaW5hbCBzb3VyY2UgcGl4ZWwgKi8KKyAgICBwVGVtcGRzdCsrOworCisgICAgaWYgKGlYID09IDApICAgICAgICAgICAgICAgICAgICAgICAvKiBmaXJzdCBpbnRlcnZhbCA/ICovCisgICAgeworICAgICAgaWYgKGlXaWR0aCA9PSAxKSAgICAgICAgICAgICAgICAgLyogc2luZ2xlIHBpeGVsID8gKi8KKyAgICAgICAgcFRlbXBzcmMyID0gTU5HX05VTEw7CisKKyAgICAgIGlNID0gaU1MOworICAgIH0KKyAgICBlbHNlCisgICAgaWYgKGlYID09IChpV2lkdGggLSAyKSkgICAgICAgICAgICAvKiBsYXN0IGludGVydmFsID8gKi8KKyAgICAgIGlNID0gaU1SOworICAgIGVsc2UKKyAgICAgIGlNID0gaU1YOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmlsbCBpbnRlcnZhbCA/ICovCisgICAgaWYgKChpWCA8IGlXaWR0aCAtIDEpIHx8IChpV2lkdGggPT0gMSkpCisgICAgeworICAgICAgaWYgKHBUZW1wc3JjMikgICAgICAgICAgICAgICAgICAgLyogZG8gd2UgaGF2ZSB0aGUgc2Vjb25kIHBpeGVsID8gKi8KKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlzIGl0IHNhbWUgYXMgZmlyc3QgPyAqLworICAgICAgICBpZiAoKnBUZW1wc3JjMSA9PSAqcFRlbXBzcmMyKQorICAgICAgICB7CisgICAgICAgICAgZm9yIChpUyA9IDE7IGlTIDwgaU07IGlTKyspICAvKiB0aGVuIGp1c3QgcmVwZWF0IHRoZSBmaXJzdCAqLworICAgICAgICAgIHsKKyAgICAgICAgICAgICpwVGVtcGRzdCA9ICpwVGVtcHNyYzE7CisgICAgICAgICAgICBwVGVtcGRzdCsrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBmb3IgKGlTID0gMTsgaVMgPCBpTTsgaVMrKykgIC8qIGNhbGN1bGF0ZSB0aGUgZGlzdGFuY2VzICovCisgICAgICAgICAgeworICAgICAgICAgICAgbW5nX3B1dF91aW50MTYgKChtbmdfdWludDhwKXBUZW1wZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfdWludDE2KSgoKDIgKiBpUyAqICggKG1uZ19pbnQzMikobW5nX2dldF91aW50MTYgKChtbmdfdWludDhwKXBUZW1wc3JjMikpICAgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ19pbnQzMikobW5nX2dldF91aW50MTYgKChtbmdfdWludDhwKXBUZW1wc3JjMSkpICkgKyBpTSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlNICogMikpICsgKG1uZ19pbnQzMikobW5nX2dldF91aW50MTYgKChtbmdfdWludDhwKXBUZW1wc3JjMSkpICAgICAgICAgICkpOworICAgICAgICAgICAgcFRlbXBkc3QrKzsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZm9yIChpUyA9IDE7IGlTIDwgaU07IGlTKyspCisgICAgICAgIHsKKyAgICAgICAgICAqcFRlbXBkc3QgPSAqcFRlbXBzcmMxOyAgICAgIC8qIHJlcGVhdCBmaXJzdCBzb3VyY2UgcGl4ZWwgKi8KKyAgICAgICAgICBwVGVtcGRzdCsrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcFRlbXBzcmMxKys7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9NQUdOSUZZX0cxNl9YMiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19tYWduaWZ5X2cxNl94MyAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcFNyY2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcERzdGxpbmUpCit7CisgIG1uZ191aW50MzIgIGlYOworICBtbmdfaW50MzIgICBpUywgaU0sIGlIOworICBtbmdfdWludDE2cCBwVGVtcHNyYzE7CisgIG1uZ191aW50MTZwIHBUZW1wc3JjMjsKKyAgbW5nX3VpbnQxNnAgcFRlbXBkc3Q7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fTUFHTklGWV9HMTZfWDMsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBwVGVtcHNyYzEgPSAobW5nX3VpbnQxNnApcFNyY2xpbmU7ICAgLyogaW5pdGlhbGl6ZSBwaXhlbC1sb29wICovCisgIHBUZW1wZHN0ICA9IChtbmdfdWludDE2cClwRHN0bGluZTsKKworICBmb3IgKGlYID0gMDsgaVggPCBpV2lkdGg7IGlYKyspCisgIHsKKyAgICBwVGVtcHNyYzIgPSBwVGVtcHNyYzEgKyAxOworCisgICAgKnBUZW1wZHN0ID0gKnBUZW1wc3JjMTsgICAgICAgICAgICAvKiBjb3B5IG9yaWdpbmFsIHNvdXJjZSBwaXhlbCAqLworICAgIHBUZW1wZHN0Kys7CisKKyAgICBpZiAoaVggPT0gMCkgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpcnN0IGludGVydmFsID8gKi8KKyAgICB7CisgICAgICBpZiAoaVdpZHRoID09IDEpICAgICAgICAgICAgICAgICAvKiBzaW5nbGUgcGl4ZWwgPyAqLworICAgICAgICBwVGVtcHNyYzIgPSBNTkdfTlVMTDsKKworICAgICAgaU0gPSBpTUw7CisgICAgfQorICAgIGVsc2UKKyAgICBpZiAoaVggPT0gKGlXaWR0aCAtIDIpKSAgICAgICAgICAgIC8qIGxhc3QgaW50ZXJ2YWwgPyAqLworICAgICAgaU0gPSBpTVI7CisgICAgZWxzZQorICAgICAgaU0gPSBpTVg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaWxsIGludGVydmFsID8gKi8KKyAgICBpZiAoKGlYIDwgaVdpZHRoIC0gMSkgfHwgKGlXaWR0aCA9PSAxKSkKKyAgICB7CisgICAgICBpZiAocFRlbXBzcmMyKSAgICAgICAgICAgICAgICAgICAvKiBkbyB3ZSBoYXZlIHRoZSBzZWNvbmQgcGl4ZWwgPyAqLworICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaXMgaXQgc2FtZSBhcyBmaXJzdCA/ICovCisgICAgICAgIGlmICgqcFRlbXBzcmMxID09ICpwVGVtcHNyYzIpCisgICAgICAgIHsKKyAgICAgICAgICBmb3IgKGlTID0gMTsgaVMgPCBpTTsgaVMrKykgIC8qIHRoZW4ganVzdCByZXBlYXQgdGhlIGZpcnN0ICovCisgICAgICAgICAgeworICAgICAgICAgICAgKnBUZW1wZHN0ID0gKnBUZW1wc3JjMTsKKyAgICAgICAgICAgIHBUZW1wZHN0Kys7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGlIID0gKGlNKzEpIC8gMjsgICAgICAgICAgICAgLyogY2FsY3VsYXRlIGhhbGZ3YXkgcG9pbnQgKi8KKworICAgICAgICAgIGZvciAoaVMgPSAxOyBpUyA8IGlIOyBpUysrKSAgLyogcmVwbGljYXRlIGZpcnN0IGhhbGYgKi8KKyAgICAgICAgICB7CisgICAgICAgICAgICAqcFRlbXBkc3QgPSAqcFRlbXBzcmMxOworICAgICAgICAgICAgcFRlbXBkc3QrKzsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBmb3IgKGlTID0gaUg7IGlTIDwgaU07IGlTKyspIC8qIHJlcGxpY2F0ZSBzZWNvbmQgaGFsZiAqLworICAgICAgICAgIHsKKyAgICAgICAgICAgICpwVGVtcGRzdCA9ICpwVGVtcHNyYzI7CisgICAgICAgICAgICBwVGVtcGRzdCsrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBmb3IgKGlTID0gMTsgaVMgPCBpTTsgaVMrKykKKyAgICAgICAgeworICAgICAgICAgICpwVGVtcGRzdCA9ICpwVGVtcHNyYzE7ICAgICAgLyogcmVwZWF0IGZpcnN0IHNvdXJjZSBwaXhlbCAqLworICAgICAgICAgIHBUZW1wZHN0Kys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBwVGVtcHNyYzErKzsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX01BR05JRllfRzE2X1gzLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZiAvKiBNTkdfTk9fR1JBWV9TVVBQT1JUICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19tYWduaWZ5X3JnYjE2X3gxIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1YLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcFNyY2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSkKK3sKKyAgbW5nX3VpbnQzMiAgaVgsIGlTLCBpTTsKKyAgbW5nX3VpbnQxNnAgcFRlbXBzcmMxOworICBtbmdfdWludDE2cCBwVGVtcGRzdDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9NQUdOSUZZX1JHQjE2X1gxLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcFRlbXBzcmMxID0gKG1uZ191aW50MTZwKXBTcmNsaW5lOyAgIC8qIGluaXRpYWxpemUgcGl4ZWwtbG9vcCAqLworICBwVGVtcGRzdCAgPSAobW5nX3VpbnQxNnApcERzdGxpbmU7CisKKyAgZm9yIChpWCA9IDA7IGlYIDwgaVdpZHRoOyBpWCsrKQorICB7CisgICAgKnBUZW1wZHN0ID0gKnBUZW1wc3JjMTsgICAgICAgICAgICAvKiBjb3B5IG9yaWdpbmFsIHNvdXJjZSBwaXhlbCAqLworICAgIHBUZW1wZHN0Kys7CisgICAgKnBUZW1wZHN0ID0gKihwVGVtcHNyYzErMSk7CisgICAgcFRlbXBkc3QrKzsKKyAgICAqcFRlbXBkc3QgPSAqKHBUZW1wc3JjMSsyKTsKKyAgICBwVGVtcGRzdCsrOworCisgICAgaWYgKGlYID09IDApICAgICAgICAgICAgICAgICAgICAgICAvKiBmaXJzdCBpbnRlcnZhbCA/ICovCisgICAgICBpTSA9IGlNTDsKKyAgICBlbHNlCisgICAgaWYgKGlYID09IChpV2lkdGggLSAxKSkgICAgICAgICAgICAvKiBsYXN0IGludGVydmFsID8gKi8KKyAgICAgIGlNID0gaU1SOworICAgIGVsc2UKKyAgICAgIGlNID0gaU1YOworCisgICAgZm9yIChpUyA9IDE7IGlTIDwgaU07IGlTKyspICAgICAgICAvKiBmaWxsIGludGVydmFsICovCisgICAgeworICAgICAgKnBUZW1wZHN0ID0gKnBUZW1wc3JjMTsgICAgICAgICAgLyogY29weSBvcmlnaW5hbCBzb3VyY2UgcGl4ZWwgKi8KKyAgICAgIHBUZW1wZHN0Kys7CisgICAgICAqcFRlbXBkc3QgPSAqKHBUZW1wc3JjMSsxKTsKKyAgICAgIHBUZW1wZHN0Kys7CisgICAgICAqcFRlbXBkc3QgPSAqKHBUZW1wc3JjMSsyKTsKKyAgICAgIHBUZW1wZHN0Kys7CisgICAgfQorCisgICAgcFRlbXBzcmMxICs9IDM7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9NQUdOSUZZX1JHQjE2X1gxLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX21hZ25pZnlfcmdiMTZfeDIgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBEc3RsaW5lKQoreworICBtbmdfdWludDMyICBpWDsKKyAgbW5nX2ludDMyICAgaVMsIGlNOworICBtbmdfdWludDE2cCBwVGVtcHNyYzE7CisgIG1uZ191aW50MTZwIHBUZW1wc3JjMjsKKyAgbW5nX3VpbnQxNnAgcFRlbXBkc3Q7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fTUFHTklGWV9SR0IxNl9YMiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBUZW1wc3JjMSA9IChtbmdfdWludDE2cClwU3JjbGluZTsgICAvKiBpbml0aWFsaXplIHBpeGVsLWxvb3AgKi8KKyAgcFRlbXBkc3QgID0gKG1uZ191aW50MTZwKXBEc3RsaW5lOworCisgIGZvciAoaVggPSAwOyBpWCA8IGlXaWR0aDsgaVgrKykKKyAgeworICAgIHBUZW1wc3JjMiA9IHBUZW1wc3JjMSArIDM7CisKKyAgICAqcFRlbXBkc3QgPSAqcFRlbXBzcmMxOyAgICAgICAgICAgIC8qIGNvcHkgb3JpZ2luYWwgc291cmNlIHBpeGVsICovCisgICAgcFRlbXBkc3QrKzsKKyAgICAqcFRlbXBkc3QgPSAqKHBUZW1wc3JjMSsxKTsKKyAgICBwVGVtcGRzdCsrOworICAgICpwVGVtcGRzdCA9ICoocFRlbXBzcmMxKzIpOworICAgIHBUZW1wZHN0Kys7CisKKyAgICBpZiAoaVggPT0gMCkgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpcnN0IGludGVydmFsID8gKi8KKyAgICB7CisgICAgICBpZiAoaVdpZHRoID09IDEpICAgICAgICAgICAgICAgICAvKiBzaW5nbGUgcGl4ZWwgPyAqLworICAgICAgICBwVGVtcHNyYzIgPSBNTkdfTlVMTDsKKworICAgICAgaU0gPSAobW5nX2ludDMyKWlNTDsKKyAgICB9CisgICAgZWxzZQorICAgIGlmIChpWCA9PSAoaVdpZHRoIC0gMikpICAgICAgICAgICAgLyogbGFzdCBpbnRlcnZhbCA/ICovCisgICAgICBpTSA9IChtbmdfaW50MzIpaU1SOworICAgIGVsc2UKKyAgICAgIGlNID0gKG1uZ19pbnQzMilpTVg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaWxsIGludGVydmFsID8gKi8KKyAgICBpZiAoKGlYIDwgaVdpZHRoIC0gMSkgfHwgKGlXaWR0aCA9PSAxKSkKKyAgICB7CisgICAgICBpZiAocFRlbXBzcmMyKSAgICAgICAgICAgICAgICAgICAvKiBkbyB3ZSBoYXZlIHRoZSBzZWNvbmQgcGl4ZWwgPyAqLworICAgICAgeworICAgICAgICBmb3IgKGlTID0gMTsgaVMgPCBpTTsgaVMrKykKKyAgICAgICAgeworICAgICAgICAgIGlmICgqcFRlbXBzcmMxID09ICpwVGVtcHNyYzIpCisgICAgICAgICAgICAqcFRlbXBkc3QgPSAqcFRlbXBzcmMxOyAgICAvKiBqdXN0IHJlcGVhdCB0aGUgZmlyc3QgKi8KKyAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNhbGN1bGF0ZSB0aGUgZGlzdGFuY2UgKi8KKyAgICAgICAgICAgIG1uZ19wdXRfdWludDE2ICgobW5nX3VpbnQ4cClwVGVtcGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX3VpbnQxNikoKCgyICogaVMgKiAoIChtbmdfaW50MzIpKG1uZ19nZXRfdWludDE2ICgobW5nX3VpbnQ4cClwVGVtcHNyYzIpKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX2ludDMyKShtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApcFRlbXBzcmMxKSkgKSArIGlNKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaU0gKiAyKSkgKyAobW5nX2ludDMyKShtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApcFRlbXBzcmMxKSkgICAgICAgICApICk7CisKKyAgICAgICAgICBwVGVtcGRzdCsrOworCisgICAgICAgICAgaWYgKCoocFRlbXBzcmMxKzEpID09ICoocFRlbXBzcmMyKzEpKQorICAgICAgICAgICAgKnBUZW1wZHN0ID0gKihwVGVtcHNyYzErMSk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgbW5nX3B1dF91aW50MTYgKChtbmdfdWludDhwKXBUZW1wZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfdWludDE2KSgoKDIgKiBpUyAqICggKG1uZ19pbnQzMikobW5nX2dldF91aW50MTYgKChtbmdfdWludDhwKShwVGVtcHNyYzIrMSkpKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX2ludDMyKShtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApKHBUZW1wc3JjMSsxKSkpICkgKyBpTSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlNICogMikpICsgKG1uZ19pbnQzMikobW5nX2dldF91aW50MTYgKChtbmdfdWludDhwKShwVGVtcHNyYzErMSkpKSAgICAgICAgICkgKTsKKworICAgICAgICAgIHBUZW1wZHN0Kys7CisKKyAgICAgICAgICBpZiAoKihwVGVtcHNyYzErMikgPT0gKihwVGVtcHNyYzIrMikpCisgICAgICAgICAgICAqcFRlbXBkc3QgPSAqKHBUZW1wc3JjMSsyKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBtbmdfcHV0X3VpbnQxNiAoKG1uZ191aW50OHApcFRlbXBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ191aW50MTYpKCgoMiAqIGlTICogKCAobW5nX2ludDMyKShtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApKHBUZW1wc3JjMisyKSkpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfaW50MzIpKG1uZ19nZXRfdWludDE2ICgobW5nX3VpbnQ4cCkocFRlbXBzcmMxKzIpKSkgKSArIGlNKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaU0gKiAyKSkgKyAobW5nX2ludDMyKShtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApKHBUZW1wc3JjMSsyKSkpICAgICAgICAgKSApOworCisgICAgICAgICAgcFRlbXBkc3QrKzsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBmb3IgKGlTID0gMTsgaVMgPCBpTTsgaVMrKykKKyAgICAgICAgeworICAgICAgICAgICpwVGVtcGRzdCA9ICpwVGVtcHNyYzE7ICAgICAgLyogcmVwZWF0IGZpcnN0IHNvdXJjZSBwaXhlbCAqLworICAgICAgICAgIHBUZW1wZHN0Kys7CisgICAgICAgICAgKnBUZW1wZHN0ID0gKihwVGVtcHNyYzErMSk7CisgICAgICAgICAgcFRlbXBkc3QrKzsKKyAgICAgICAgICAqcFRlbXBkc3QgPSAqKHBUZW1wc3JjMSsyKTsKKyAgICAgICAgICBwVGVtcGRzdCsrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcFRlbXBzcmMxICs9IDM7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9NQUdOSUZZX1JHQjE2X1gyLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX21hZ25pZnlfcmdiMTZfeDMgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBEc3RsaW5lKQoreworICBtbmdfdWludDMyICBpWDsKKyAgbW5nX2ludDMyICAgaVMsIGlNLCBpSDsKKyAgbW5nX3VpbnQxNnAgcFRlbXBzcmMxOworICBtbmdfdWludDE2cCBwVGVtcHNyYzI7CisgIG1uZ191aW50MTZwIHBUZW1wZHN0OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX01BR05JRllfUkdCMTZfWDMsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBwVGVtcHNyYzEgPSAobW5nX3VpbnQxNnApcFNyY2xpbmU7ICAgLyogaW5pdGlhbGl6ZSBwaXhlbC1sb29wICovCisgIHBUZW1wZHN0ICA9IChtbmdfdWludDE2cClwRHN0bGluZTsKKworICBmb3IgKGlYID0gMDsgaVggPCBpV2lkdGg7IGlYKyspCisgIHsKKyAgICBwVGVtcHNyYzIgPSBwVGVtcHNyYzEgKyAzOworCisgICAgKnBUZW1wZHN0ID0gKnBUZW1wc3JjMTsgICAgICAgICAgICAvKiBjb3B5IG9yaWdpbmFsIHNvdXJjZSBwaXhlbCAqLworICAgIHBUZW1wZHN0Kys7CisgICAgKnBUZW1wZHN0ID0gKihwVGVtcHNyYzErMSk7CisgICAgcFRlbXBkc3QrKzsKKyAgICAqcFRlbXBkc3QgPSAqKHBUZW1wc3JjMSsyKTsKKyAgICBwVGVtcGRzdCsrOworCisgICAgaWYgKGlYID09IDApICAgICAgICAgICAgICAgICAgICAgICAvKiBmaXJzdCBpbnRlcnZhbCA/ICovCisgICAgeworICAgICAgaWYgKGlXaWR0aCA9PSAxKSAgICAgICAgICAgICAgICAgLyogc2luZ2xlIHBpeGVsID8gKi8KKyAgICAgICAgcFRlbXBzcmMyID0gTU5HX05VTEw7CisKKyAgICAgIGlNID0gKG1uZ19pbnQzMilpTUw7CisgICAgfQorICAgIGVsc2UKKyAgICBpZiAoaVggPT0gKGlXaWR0aCAtIDIpKSAgICAgICAgICAgIC8qIGxhc3QgaW50ZXJ2YWwgPyAqLworICAgICAgaU0gPSAobW5nX2ludDMyKWlNUjsKKyAgICBlbHNlCisgICAgICBpTSA9IChtbmdfaW50MzIpaU1YOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmlsbCBpbnRlcnZhbCA/ICovCisgICAgaWYgKChpWCA8IGlXaWR0aCAtIDEpIHx8IChpV2lkdGggPT0gMSkpCisgICAgeworICAgICAgaWYgKHBUZW1wc3JjMikgICAgICAgICAgICAgICAgICAgLyogZG8gd2UgaGF2ZSB0aGUgc2Vjb25kIHBpeGVsID8gKi8KKyAgICAgIHsKKyAgICAgICAgaUggPSAoaU0rMSkgLyAyOyAgICAgICAgICAgICAgIC8qIGNhbGN1bGF0ZSBoYWxmd2F5IHBvaW50ICovCisKKyAgICAgICAgZm9yIChpUyA9IDE7IGlTIDwgaUg7IGlTKyspICAgIC8qIHJlcGxpY2F0ZSBmaXJzdCBoYWxmICovCisgICAgICAgIHsKKyAgICAgICAgICAqcFRlbXBkc3QgICAgID0gKnBUZW1wc3JjMTsKKyAgICAgICAgICAqKHBUZW1wZHN0KzEpID0gKihwVGVtcHNyYzErMSk7CisgICAgICAgICAgKihwVGVtcGRzdCsyKSA9ICoocFRlbXBzcmMxKzIpOworCisgICAgICAgICAgcFRlbXBkc3QgKz0gMzsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaVMgPSBpSDsgaVMgPCBpTTsgaVMrKykgICAgLyogcmVwbGljYXRlIHNlY29uZCBoYWxmICovCisgICAgICAgIHsKKyAgICAgICAgICAqcFRlbXBkc3QgICAgID0gKnBUZW1wc3JjMjsKKyAgICAgICAgICAqKHBUZW1wZHN0KzEpID0gKihwVGVtcHNyYzIrMSk7CisgICAgICAgICAgKihwVGVtcGRzdCsyKSA9ICoocFRlbXBzcmMyKzIpOworCisgICAgICAgICAgcFRlbXBkc3QgKz0gMzsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBmb3IgKGlTID0gMTsgaVMgPCBpTTsgaVMrKykKKyAgICAgICAgeworICAgICAgICAgICpwVGVtcGRzdCA9ICpwVGVtcHNyYzE7ICAgICAgLyogcmVwZWF0IGZpcnN0IHNvdXJjZSBwaXhlbCAqLworICAgICAgICAgIHBUZW1wZHN0Kys7CisgICAgICAgICAgKnBUZW1wZHN0ID0gKihwVGVtcHNyYzErMSk7CisgICAgICAgICAgcFRlbXBkc3QrKzsKKyAgICAgICAgICAqcFRlbXBkc3QgPSAqKHBUZW1wc3JjMSsyKTsKKyAgICAgICAgICBwVGVtcGRzdCsrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcFRlbXBzcmMxICs9IDM7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9NQUdOSUZZX1JHQjE2X1gzLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fR1JBWV9TVVBQT1JUCittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9nYTE2X3gxIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBTcmNsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSkKK3sKKyAgbW5nX3VpbnQzMiAgaVgsIGlTLCBpTTsKKyAgbW5nX3VpbnQxNnAgcFRlbXBzcmMxOworICBtbmdfdWludDE2cCBwVGVtcGRzdDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9NQUdOSUZZX0dBMTZfWDEsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBwVGVtcHNyYzEgPSAobW5nX3VpbnQxNnApIHBTcmNsaW5lOyAgLyogaW5pdGlhbGl6ZSBwaXhlbC1sb29wICovCisgIHBUZW1wZHN0ICA9IChtbmdfdWludDE2cClwRHN0bGluZTsKKworICBmb3IgKGlYID0gMDsgaVggPCBpV2lkdGg7IGlYKyspCisgIHsKKyAgICAqcFRlbXBkc3QgPSAqcFRlbXBzcmMxOyAgICAgICAgICAgIC8qIGNvcHkgb3JpZ2luYWwgc291cmNlIHBpeGVsICovCisgICAgcFRlbXBkc3QrKzsKKyAgICAqcFRlbXBkc3QgPSAqKHBUZW1wc3JjMSsxKTsKKyAgICBwVGVtcGRzdCsrOworCisgICAgaWYgKGlYID09IDApICAgICAgICAgICAgICAgICAgICAgICAvKiBmaXJzdCBpbnRlcnZhbCA/ICovCisgICAgICBpTSA9IGlNTDsKKyAgICBlbHNlCisgICAgaWYgKGlYID09IChpV2lkdGggLSAxKSkgICAgICAgICAgICAvKiBsYXN0IGludGVydmFsID8gKi8KKyAgICAgIGlNID0gaU1SOworICAgIGVsc2UKKyAgICAgIGlNID0gaU1YOworCisgICAgZm9yIChpUyA9IDE7IGlTIDwgaU07IGlTKyspICAgICAgICAvKiBmaWxsIGludGVydmFsICovCisgICAgeworICAgICAgKnBUZW1wZHN0ID0gKnBUZW1wc3JjMTsgICAgICAgICAgLyogY29weSBvcmlnaW5hbCBzb3VyY2UgcGl4ZWwgKi8KKyAgICAgIHBUZW1wZHN0Kys7CisgICAgICAqcFRlbXBkc3QgPSAqKHBUZW1wc3JjMSsxKTsKKyAgICAgIHBUZW1wZHN0Kys7CisgICAgfQorCisgICAgcFRlbXBzcmMxICs9IDI7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9NQUdOSUZZX0dBMTZfWDEsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9nYTE2X3gyIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBTcmNsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSkKK3sKKyAgbW5nX3VpbnQzMiAgaVg7CisgIG1uZ19pbnQzMiAgIGlTLCBpTTsKKyAgbW5nX3VpbnQxNnAgcFRlbXBzcmMxOworICBtbmdfdWludDE2cCBwVGVtcHNyYzI7CisgIG1uZ191aW50MTZwIHBUZW1wZHN0OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX01BR05JRllfR0ExNl9YMiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBUZW1wc3JjMSA9IChtbmdfdWludDE2cClwU3JjbGluZTsgICAvKiBpbml0aWFsaXplIHBpeGVsLWxvb3AgKi8KKyAgcFRlbXBkc3QgID0gKG1uZ191aW50MTZwKXBEc3RsaW5lOworCisgIGZvciAoaVggPSAwOyBpWCA8IGlXaWR0aDsgaVgrKykKKyAgeworICAgIHBUZW1wc3JjMiA9IHBUZW1wc3JjMSArIDI7CisKKyAgICAqcFRlbXBkc3QgPSAqcFRlbXBzcmMxOyAgICAgICAgICAgIC8qIGNvcHkgb3JpZ2luYWwgc291cmNlIHBpeGVsICovCisgICAgcFRlbXBkc3QrKzsKKyAgICAqcFRlbXBkc3QgPSAqKHBUZW1wc3JjMSsxKTsKKyAgICBwVGVtcGRzdCsrOworCisgICAgaWYgKGlYID09IDApICAgICAgICAgICAgICAgICAgICAgICAvKiBmaXJzdCBpbnRlcnZhbCA/ICovCisgICAgeworICAgICAgaWYgKGlXaWR0aCA9PSAxKSAgICAgICAgICAgICAgICAgLyogc2luZ2xlIHBpeGVsID8gKi8KKyAgICAgICAgcFRlbXBzcmMyID0gTU5HX05VTEw7CisKKyAgICAgIGlNID0gaU1MOworICAgIH0KKyAgICBlbHNlCisgICAgaWYgKGlYID09IChpV2lkdGggLSAyKSkgICAgICAgICAgICAvKiBsYXN0IGludGVydmFsID8gKi8KKyAgICAgIGlNID0gaU1SOworICAgIGVsc2UKKyAgICAgIGlNID0gaU1YOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmlsbCBpbnRlcnZhbCA/ICovCisgICAgaWYgKChpWCA8IGlXaWR0aCAtIDEpIHx8IChpV2lkdGggPT0gMSkpCisgICAgeworICAgICAgaWYgKHBUZW1wc3JjMikgICAgICAgICAgICAgICAgICAgLyogZG8gd2UgaGF2ZSB0aGUgc2Vjb25kIHBpeGVsID8gKi8KKyAgICAgIHsKKyAgICAgICAgZm9yIChpUyA9IDE7IGlTIDwgaU07IGlTKyspCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKnBUZW1wc3JjMSA9PSAqcFRlbXBzcmMyKQorICAgICAgICAgICAgKnBUZW1wZHN0ID0gKnBUZW1wc3JjMTsgICAgLyoganVzdCByZXBlYXQgdGhlIGZpcnN0ICovCisgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjYWxjdWxhdGUgdGhlIGRpc3RhbmNlICovCisgICAgICAgICAgICBtbmdfcHV0X3VpbnQxNiAoKG1uZ191aW50OHApcFRlbXBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ191aW50MTYpKCgoMiAqIGlTICogKCAobW5nX2ludDMyKShtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApcFRlbXBzcmMyKSkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ19pbnQzMikobW5nX2dldF91aW50MTYgKChtbmdfdWludDhwKXBUZW1wc3JjMSkpICkgKyBpTSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlNICogMikpICsgKG1uZ19pbnQzMikobW5nX2dldF91aW50MTYgKChtbmdfdWludDhwKXBUZW1wc3JjMSkpICAgICAgICAgKSApOworCisgICAgICAgICAgcFRlbXBkc3QrKzsKKworICAgICAgICAgIGlmICgqKHBUZW1wc3JjMSsxKSA9PSAqKHBUZW1wc3JjMisxKSkKKyAgICAgICAgICAgICpwVGVtcGRzdCA9ICoocFRlbXBzcmMxKzEpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1uZ19wdXRfdWludDE2ICgobW5nX3VpbnQ4cClwVGVtcGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX3VpbnQxNikoKCgyICogaVMgKiAoIChtbmdfaW50MzIpKG1uZ19nZXRfdWludDE2ICgobW5nX3VpbnQ4cCkocFRlbXBzcmMyKzEpKSkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ19pbnQzMikobW5nX2dldF91aW50MTYgKChtbmdfdWludDhwKShwVGVtcHNyYzErMSkpKSApICsgaU0pIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpTSAqIDIpKSArIChtbmdfaW50MzIpKG1uZ19nZXRfdWludDE2ICgobW5nX3VpbnQ4cCkocFRlbXBzcmMxKzEpKSkgICAgICAgICApICk7CisKKyAgICAgICAgICBwVGVtcGRzdCsrOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGZvciAoaVMgPSAxOyBpUyA8IGlNOyBpUysrKQorICAgICAgICB7CisgICAgICAgICAgKnBUZW1wZHN0ID0gKnBUZW1wc3JjMTsgICAgICAvKiByZXBlYXQgZmlyc3Qgc291cmNlIHBpeGVsICovCisgICAgICAgICAgcFRlbXBkc3QrKzsKKyAgICAgICAgICAqcFRlbXBkc3QgPSAqKHBUZW1wc3JjMSsxKTsKKyAgICAgICAgICBwVGVtcGRzdCsrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcFRlbXBzcmMxICs9IDI7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9NQUdOSUZZX0dBMTZfWDIsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9nYTE2X3gzIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBTcmNsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSkKK3sKKyAgbW5nX3VpbnQzMiAgaVg7CisgIG1uZ19pbnQzMiAgIGlTLCBpTSwgaUg7CisgIG1uZ191aW50MTZwIHBUZW1wc3JjMTsKKyAgbW5nX3VpbnQxNnAgcFRlbXBzcmMyOworICBtbmdfdWludDE2cCBwVGVtcGRzdDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9NQUdOSUZZX0dBMTZfWDMsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBwVGVtcHNyYzEgPSAobW5nX3VpbnQxNnApcFNyY2xpbmU7ICAgLyogaW5pdGlhbGl6ZSBwaXhlbC1sb29wICovCisgIHBUZW1wZHN0ICA9IChtbmdfdWludDE2cClwRHN0bGluZTsKKworICBmb3IgKGlYID0gMDsgaVggPCBpV2lkdGg7IGlYKyspCisgIHsKKyAgICBwVGVtcHNyYzIgPSBwVGVtcHNyYzEgKyAyOworCisgICAgKnBUZW1wZHN0ID0gKnBUZW1wc3JjMTsgICAgICAgICAgICAvKiBjb3B5IG9yaWdpbmFsIHNvdXJjZSBwaXhlbCAqLworICAgIHBUZW1wZHN0Kys7CisgICAgKnBUZW1wZHN0ID0gKihwVGVtcHNyYzErMSk7CisgICAgcFRlbXBkc3QrKzsKKworICAgIGlmIChpWCA9PSAwKSAgICAgICAgICAgICAgICAgICAgICAgLyogZmlyc3QgaW50ZXJ2YWwgPyAqLworICAgIHsKKyAgICAgIGlmIChpV2lkdGggPT0gMSkgICAgICAgICAgICAgICAgIC8qIHNpbmdsZSBwaXhlbCA/ICovCisgICAgICAgIHBUZW1wc3JjMiA9IE1OR19OVUxMOworCisgICAgICBpTSA9IGlNTDsKKyAgICB9CisgICAgZWxzZQorICAgIGlmIChpWCA9PSAoaVdpZHRoIC0gMikpICAgICAgICAgICAgLyogbGFzdCBpbnRlcnZhbCA/ICovCisgICAgICBpTSA9IGlNUjsKKyAgICBlbHNlCisgICAgICBpTSA9IGlNWDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbGwgaW50ZXJ2YWwgPyAqLworICAgIGlmICgoaVggPCBpV2lkdGggLSAxKSB8fCAoaVdpZHRoID09IDEpKQorICAgIHsKKyAgICAgIGlmIChwVGVtcHNyYzIpICAgICAgICAgICAgICAgICAgIC8qIGRvIHdlIGhhdmUgdGhlIHNlY29uZCBwaXhlbCA/ICovCisgICAgICB7CisgICAgICAgIGlIID0gKGlNKzEpIC8gMjsgICAgICAgICAgICAgICAvKiBjYWxjdWxhdGUgaGFsZndheSBwb2ludCAqLworCisgICAgICAgIGZvciAoaVMgPSAxOyBpUyA8IGlIOyBpUysrKSAgICAvKiByZXBsaWNhdGUgZmlyc3QgaGFsZiAqLworICAgICAgICB7CisgICAgICAgICAgKnBUZW1wZHN0ICAgICA9ICpwVGVtcHNyYzE7CisgICAgICAgICAgKihwVGVtcGRzdCsxKSA9ICoocFRlbXBzcmMxKzEpOworCisgICAgICAgICAgcFRlbXBkc3QgKz0gMjsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaVMgPSBpSDsgaVMgPCBpTTsgaVMrKykgICAvKiByZXBsaWNhdGUgc2Vjb25kIGhhbGYgKi8KKyAgICAgICAgeworICAgICAgICAgICpwVGVtcGRzdCAgICAgPSAqcFRlbXBzcmMyOworICAgICAgICAgICoocFRlbXBkc3QrMSkgPSAqKHBUZW1wc3JjMisxKTsKKworICAgICAgICAgIHBUZW1wZHN0ICs9IDI7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZm9yIChpUyA9IDE7IGlTIDwgaU07IGlTKyspCisgICAgICAgIHsKKyAgICAgICAgICAqcFRlbXBkc3QgPSAqcFRlbXBzcmMxOyAgICAgIC8qIHJlcGVhdCBmaXJzdCBzb3VyY2UgcGl4ZWwgKi8KKyAgICAgICAgICBwVGVtcGRzdCsrOworICAgICAgICAgICpwVGVtcGRzdCA9ICoocFRlbXBzcmMxKzEpOworICAgICAgICAgIHBUZW1wZHN0Kys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBwVGVtcHNyYzEgKz0gMjsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX01BR05JRllfR0ExNl9YMywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19tYWduaWZ5X2dhMTZfeDQgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcFNyY2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBEc3RsaW5lKQoreworICBtbmdfdWludDMyICBpWDsKKyAgbW5nX2ludDMyICAgaVMsIGlNLCBpSDsKKyAgbW5nX3VpbnQxNnAgcFRlbXBzcmMxOworICBtbmdfdWludDE2cCBwVGVtcHNyYzI7CisgIG1uZ191aW50MTZwIHBUZW1wZHN0OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX01BR05JRllfR0ExNl9YNCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBUZW1wc3JjMSA9IChtbmdfdWludDE2cClwU3JjbGluZTsgICAvKiBpbml0aWFsaXplIHBpeGVsLWxvb3AgKi8KKyAgcFRlbXBkc3QgID0gKG1uZ191aW50MTZwKXBEc3RsaW5lOworCisgIGZvciAoaVggPSAwOyBpWCA8IGlXaWR0aDsgaVgrKykKKyAgeworICAgIHBUZW1wc3JjMiA9IHBUZW1wc3JjMSArIDI7CisKKyAgICAqcFRlbXBkc3QgPSAqcFRlbXBzcmMxOyAgICAgICAgICAgIC8qIGNvcHkgb3JpZ2luYWwgc291cmNlIHBpeGVsICovCisgICAgcFRlbXBkc3QrKzsKKyAgICAqcFRlbXBkc3QgPSAqKHBUZW1wc3JjMSsxKTsKKyAgICBwVGVtcGRzdCsrOworCisgICAgaWYgKGlYID09IDApICAgICAgICAgICAgICAgICAgICAgICAvKiBmaXJzdCBpbnRlcnZhbCA/ICovCisgICAgeworICAgICAgaWYgKGlXaWR0aCA9PSAxKSAgICAgICAgICAgICAgICAgLyogc2luZ2xlIHBpeGVsID8gKi8KKyAgICAgICAgcFRlbXBzcmMyID0gTU5HX05VTEw7CisKKyAgICAgIGlNID0gaU1MOworICAgIH0KKyAgICBlbHNlCisgICAgaWYgKGlYID09IChpV2lkdGggLSAyKSkgICAgICAgICAgICAvKiBsYXN0IGludGVydmFsID8gKi8KKyAgICAgIGlNID0gaU1SOworICAgIGVsc2UKKyAgICAgIGlNID0gaU1YOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmlsbCBpbnRlcnZhbCA/ICovCisgICAgaWYgKChpWCA8IGlXaWR0aCAtIDEpIHx8IChpV2lkdGggPT0gMSkpCisgICAgeworICAgICAgaWYgKHBUZW1wc3JjMikgICAgICAgICAgICAgICAgICAgLyogZG8gd2UgaGF2ZSB0aGUgc2Vjb25kIHBpeGVsID8gKi8KKyAgICAgIHsKKyAgICAgICAgaUggPSAoaU0rMSkgLyAyOyAgICAgICAgICAgICAgIC8qIGNhbGN1bGF0ZSBoYWxmd2F5IHBvaW50ICovCisKKyAgICAgICAgZm9yIChpUyA9IDE7IGlTIDwgaUg7IGlTKyspICAgIC8qIGZpcnN0IGhhbGYgKi8KKyAgICAgICAgeworICAgICAgICAgIGlmICgqcFRlbXBzcmMxID09ICpwVGVtcHNyYzIpCisgICAgICAgICAgICAqcFRlbXBkc3QgPSAqcFRlbXBzcmMxOyAgICAvKiBqdXN0IHJlcGVhdCB0aGUgZmlyc3QgKi8KKyAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNhbGN1bGF0ZSB0aGUgZGlzdGFuY2UgKi8KKyAgICAgICAgICAgIG1uZ19wdXRfdWludDE2ICgobW5nX3VpbnQ4cClwVGVtcGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX3VpbnQxNikoKCgyICogaVMgKiAoIChtbmdfaW50MzIpKG1uZ19nZXRfdWludDE2ICgobW5nX3VpbnQ4cClwVGVtcHNyYzIpKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX2ludDMyKShtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApcFRlbXBzcmMxKSkgKSArIGlNKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaU0gKiAyKSkgKyAobW5nX2ludDMyKShtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApcFRlbXBzcmMxKSkgICAgICAgICApICk7CisKKyAgICAgICAgICBwVGVtcGRzdCsrOworCisgICAgICAgICAgKnBUZW1wZHN0ID0gKihwVGVtcHNyYzErMSk7ICAvKiByZXBsaWNhdGUgYWxwaGEgZnJvbSBsZWZ0ICovCisKKyAgICAgICAgICBwVGVtcGRzdCsrOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpUyA9IGlIOyBpUyA8IGlNOyBpUysrKSAgIC8qIHNlY29uZCBoYWxmICovCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKnBUZW1wc3JjMSA9PSAqcFRlbXBzcmMyKQorICAgICAgICAgICAgKnBUZW1wZHN0ID0gKnBUZW1wc3JjMTsgICAgLyoganVzdCByZXBlYXQgdGhlIGZpcnN0ICovCisgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjYWxjdWxhdGUgdGhlIGRpc3RhbmNlICovCisgICAgICAgICAgICBtbmdfcHV0X3VpbnQxNiAoKG1uZ191aW50OHApcFRlbXBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ191aW50MTYpKCgoMiAqIGlTICogKCAobW5nX2ludDMyKShtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApcFRlbXBzcmMyKSkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ19pbnQzMikobW5nX2dldF91aW50MTYgKChtbmdfdWludDhwKXBUZW1wc3JjMSkpICkgKyBpTSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlNICogMikpICsgKG1uZ19pbnQzMikobW5nX2dldF91aW50MTYgKChtbmdfdWludDhwKXBUZW1wc3JjMSkpICAgICAgICAgKSApOworCisgICAgICAgICAgcFRlbXBkc3QrKzsKKworICAgICAgICAgICpwVGVtcGRzdCA9ICoocFRlbXBzcmMyKzEpOyAgLyogcmVwbGljYXRlIGFscGhhIGZyb20gcmlnaHQgKi8KKworICAgICAgICAgIHBUZW1wZHN0Kys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZm9yIChpUyA9IDE7IGlTIDwgaU07IGlTKyspCisgICAgICAgIHsKKyAgICAgICAgICAqcFRlbXBkc3QgPSAqcFRlbXBzcmMxOyAgICAgIC8qIHJlcGVhdCBmaXJzdCBzb3VyY2UgcGl4ZWwgKi8KKyAgICAgICAgICBwVGVtcGRzdCsrOworICAgICAgICAgICpwVGVtcGRzdCA9ICoocFRlbXBzcmMxKzEpOworICAgICAgICAgIHBUZW1wZHN0Kys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBwVGVtcHNyYzEgKz0gMjsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX01BR05JRllfR0ExNl9YNCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19tYWduaWZ5X2dhMTZfeDUgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcFNyY2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBEc3RsaW5lKQoreworICBtbmdfdWludDMyICBpWDsKKyAgbW5nX2ludDMyICAgaVMsIGlNLCBpSDsKKyAgbW5nX3VpbnQxNnAgcFRlbXBzcmMxOworICBtbmdfdWludDE2cCBwVGVtcHNyYzI7CisgIG1uZ191aW50MTZwIHBUZW1wZHN0OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX01BR05JRllfR0ExNl9YNSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBUZW1wc3JjMSA9IChtbmdfdWludDE2cClwU3JjbGluZTsgICAvKiBpbml0aWFsaXplIHBpeGVsLWxvb3AgKi8KKyAgcFRlbXBkc3QgID0gKG1uZ191aW50MTZwKXBEc3RsaW5lOworCisgIGZvciAoaVggPSAwOyBpWCA8IGlXaWR0aDsgaVgrKykKKyAgeworICAgIHBUZW1wc3JjMiA9IHBUZW1wc3JjMSArIDI7CisKKyAgICAqcFRlbXBkc3QgPSAqcFRlbXBzcmMxOyAgICAgICAgICAgIC8qIGNvcHkgb3JpZ2luYWwgc291cmNlIHBpeGVsICovCisgICAgcFRlbXBkc3QrKzsKKyAgICAqcFRlbXBkc3QgPSAqKHBUZW1wc3JjMSsxKTsKKyAgICBwVGVtcGRzdCsrOworCisgICAgaWYgKGlYID09IDApICAgICAgICAgICAgICAgICAgICAgICAvKiBmaXJzdCBpbnRlcnZhbCA/ICovCisgICAgeworICAgICAgaWYgKGlXaWR0aCA9PSAxKSAgICAgICAgICAgICAgICAgLyogc2luZ2xlIHBpeGVsID8gKi8KKyAgICAgICAgcFRlbXBzcmMyID0gTU5HX05VTEw7CisKKyAgICAgIGlNID0gaU1MOworICAgIH0KKyAgICBlbHNlCisgICAgaWYgKGlYID09IChpV2lkdGggLSAyKSkgICAgICAgICAgICAvKiBsYXN0IGludGVydmFsID8gKi8KKyAgICAgIGlNID0gaU1SOworICAgIGVsc2UKKyAgICAgIGlNID0gaU1YOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmlsbCBpbnRlcnZhbCA/ICovCisgICAgaWYgKChpWCA8IGlXaWR0aCAtIDEpIHx8IChpV2lkdGggPT0gMSkpCisgICAgeworICAgICAgaWYgKHBUZW1wc3JjMikgICAgICAgICAgICAgICAgICAgLyogZG8gd2UgaGF2ZSB0aGUgc2Vjb25kIHBpeGVsID8gKi8KKyAgICAgIHsKKyAgICAgICAgaUggPSAoaU0rMSkgLyAyOyAgICAgICAgICAgICAgIC8qIGNhbGN1bGF0ZSBoYWxmd2F5IHBvaW50ICovCisKKyAgICAgICAgZm9yIChpUyA9IDE7IGlTIDwgaUg7IGlTKyspICAgIC8qIGZpcnN0IGhhbGYgKi8KKyAgICAgICAgeworICAgICAgICAgICpwVGVtcGRzdCA9ICpwVGVtcHNyYzE7ICAgICAgLyogcmVwbGljYXRlIGdyYXkgZnJvbSBsZWZ0ICovCisKKyAgICAgICAgICBwVGVtcGRzdCsrOworCisgICAgICAgICAgaWYgKCoocFRlbXBzcmMxKzEpID09ICoocFRlbXBzcmMyKzEpKQorICAgICAgICAgICAgKnBUZW1wZHN0ID0gKihwVGVtcHNyYzErMSk7LyoganVzdCByZXBlYXQgdGhlIGZpcnN0ICovCisgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjYWxjdWxhdGUgdGhlIGRpc3RhbmNlICovCisgICAgICAgICAgICBtbmdfcHV0X3VpbnQxNiAoKG1uZ191aW50OHApcFRlbXBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ191aW50MTYpKCgoMiAqIGlTICogKCAobW5nX2ludDMyKShtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApKHBUZW1wc3JjMisxKSkpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfaW50MzIpKG1uZ19nZXRfdWludDE2ICgobW5nX3VpbnQ4cCkocFRlbXBzcmMxKzEpKSkgKSArIGlNKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaU0gKiAyKSkgKyAobW5nX2ludDMyKShtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApKHBUZW1wc3JjMSsxKSkpICAgICAgICAgKSApOworCisgICAgICAgICAgcFRlbXBkc3QrKzsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaVMgPSBpSDsgaVMgPCBpTTsgaVMrKykgICAvKiBzZWNvbmQgaGFsZiAqLworICAgICAgICB7CisgICAgICAgICAgKnBUZW1wZHN0ID0gKnBUZW1wc3JjMjsgICAgICAvKiByZXBsaWNhdGUgZ3JheSBmcm9tIHJpZ2h0ICovCisKKyAgICAgICAgICBwVGVtcGRzdCsrOworCisgICAgICAgICAgaWYgKCoocFRlbXBzcmMxKzEpID09ICoocFRlbXBzcmMyKzEpKQorICAgICAgICAgICAgKnBUZW1wZHN0ID0gKihwVGVtcHNyYzErMSk7LyoganVzdCByZXBlYXQgdGhlIGZpcnN0ICovCisgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjYWxjdWxhdGUgdGhlIGRpc3RhbmNlICovCisgICAgICAgICAgICBtbmdfcHV0X3VpbnQxNiAoKG1uZ191aW50OHApcFRlbXBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ191aW50MTYpKCgoMiAqIGlTICogKCAobW5nX2ludDMyKShtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApKHBUZW1wc3JjMisxKSkpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfaW50MzIpKG1uZ19nZXRfdWludDE2ICgobW5nX3VpbnQ4cCkocFRlbXBzcmMxKzEpKSkgKSArIGlNKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaU0gKiAyKSkgKyAobW5nX2ludDMyKShtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApKHBUZW1wc3JjMSsxKSkpICAgICAgICAgKSApOworCisgICAgICAgICAgcFRlbXBkc3QrKzsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBmb3IgKGlTID0gMTsgaVMgPCBpTTsgaVMrKykKKyAgICAgICAgeworICAgICAgICAgICpwVGVtcGRzdCA9ICpwVGVtcHNyYzE7ICAgICAgLyogcmVwZWF0IGZpcnN0IHNvdXJjZSBwaXhlbCAqLworICAgICAgICAgIHBUZW1wZHN0Kys7CisgICAgICAgICAgKnBUZW1wZHN0ID0gKihwVGVtcHNyYzErMSk7CisgICAgICAgICAgcFRlbXBkc3QrKzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHBUZW1wc3JjMSArPSAyOworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fTUFHTklGWV9HQTE2X1g1LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZiAvKiBNTkdfTk9fR1JBWV9TVVBQT1JUICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19tYWduaWZ5X3JnYmExNl94MSAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcFNyY2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcERzdGxpbmUpCit7CisgIG1uZ191aW50MzIgIGlYLCBpUywgaU07CisgIG1uZ191aW50MTZwIHBUZW1wc3JjMTsKKyAgbW5nX3VpbnQxNnAgcFRlbXBkc3Q7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fTUFHTklGWV9SR0JBMTZfWDEsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBwVGVtcHNyYzEgPSAobW5nX3VpbnQxNnApcFNyY2xpbmU7ICAgLyogaW5pdGlhbGl6ZSBwaXhlbC1sb29wICovCisgIHBUZW1wZHN0ICA9IChtbmdfdWludDE2cClwRHN0bGluZTsKKworICBmb3IgKGlYID0gMDsgaVggPCBpV2lkdGg7IGlYKyspCisgIHsKKyAgICAqcFRlbXBkc3QgPSAqcFRlbXBzcmMxOyAgICAgICAgICAgIC8qIGNvcHkgb3JpZ2luYWwgc291cmNlIHBpeGVsICovCisgICAgcFRlbXBkc3QrKzsKKyAgICAqcFRlbXBkc3QgPSAqKHBUZW1wc3JjMSsxKTsKKyAgICBwVGVtcGRzdCsrOworICAgICpwVGVtcGRzdCA9ICoocFRlbXBzcmMxKzIpOworICAgIHBUZW1wZHN0Kys7CisgICAgKnBUZW1wZHN0ID0gKihwVGVtcHNyYzErMyk7CisgICAgcFRlbXBkc3QrKzsKKworICAgIGlmIChpWCA9PSAwKSAgICAgICAgICAgICAgICAgICAgICAgLyogZmlyc3QgaW50ZXJ2YWwgPyAqLworICAgICAgaU0gPSBpTUw7CisgICAgZWxzZQorICAgIGlmIChpWCA9PSAoaVdpZHRoIC0gMSkpICAgICAgICAgICAgLyogbGFzdCBpbnRlcnZhbCA/ICovCisgICAgICBpTSA9IGlNUjsKKyAgICBlbHNlCisgICAgICBpTSA9IGlNWDsKKworICAgIGZvciAoaVMgPSAxOyBpUyA8IGlNOyBpUysrKSAgICAgICAgLyogZmlsbCBpbnRlcnZhbCAqLworICAgIHsKKyAgICAgICpwVGVtcGRzdCA9ICpwVGVtcHNyYzE7ICAgICAgICAgIC8qIGNvcHkgb3JpZ2luYWwgc291cmNlIHBpeGVsICovCisgICAgICBwVGVtcGRzdCsrOworICAgICAgKnBUZW1wZHN0ID0gKihwVGVtcHNyYzErMSk7CisgICAgICBwVGVtcGRzdCsrOworICAgICAgKnBUZW1wZHN0ID0gKihwVGVtcHNyYzErMik7CisgICAgICBwVGVtcGRzdCsrOworICAgICAgKnBUZW1wZHN0ID0gKihwVGVtcHNyYzErMyk7CisgICAgICBwVGVtcGRzdCsrOworICAgIH0KKworICAgIHBUZW1wc3JjMSArPSA0OworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fTUFHTklGWV9SR0JBMTZfWDEsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9yZ2JhMTZfeDIgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1YLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBTcmNsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBEc3RsaW5lKQoreworICBtbmdfdWludDMyICBpWDsKKyAgbW5nX2ludDMyICAgaVMsIGlNOworICBtbmdfdWludDE2cCBwVGVtcHNyYzE7CisgIG1uZ191aW50MTZwIHBUZW1wc3JjMjsKKyAgbW5nX3VpbnQxNnAgcFRlbXBkc3Q7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fTUFHTklGWV9SR0JBMTZfWDIsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBwVGVtcHNyYzEgPSAobW5nX3VpbnQxNnApcFNyY2xpbmU7ICAgLyogaW5pdGlhbGl6ZSBwaXhlbC1sb29wICovCisgIHBUZW1wZHN0ICA9IChtbmdfdWludDE2cClwRHN0bGluZTsKKworICBmb3IgKGlYID0gMDsgaVggPCBpV2lkdGg7IGlYKyspCisgIHsKKyAgICBwVGVtcHNyYzIgPSBwVGVtcHNyYzEgKyA0OworCisgICAgKnBUZW1wZHN0ID0gKnBUZW1wc3JjMTsgICAgICAgICAgICAvKiBjb3B5IG9yaWdpbmFsIHNvdXJjZSBwaXhlbCAqLworICAgIHBUZW1wZHN0Kys7CisgICAgKnBUZW1wZHN0ID0gKihwVGVtcHNyYzErMSk7CisgICAgcFRlbXBkc3QrKzsKKyAgICAqcFRlbXBkc3QgPSAqKHBUZW1wc3JjMSsyKTsKKyAgICBwVGVtcGRzdCsrOworICAgICpwVGVtcGRzdCA9ICoocFRlbXBzcmMxKzMpOworICAgIHBUZW1wZHN0Kys7CisKKyAgICBpZiAoaVggPT0gMCkgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpcnN0IGludGVydmFsID8gKi8KKyAgICB7CisgICAgICBpZiAoaVdpZHRoID09IDEpICAgICAgICAgICAgICAgICAvKiBzaW5nbGUgcGl4ZWwgPyAqLworICAgICAgICBwVGVtcHNyYzIgPSBNTkdfTlVMTDsKKworICAgICAgaU0gPSAobW5nX2ludDMyKWlNTDsKKyAgICB9CisgICAgZWxzZQorICAgIGlmIChpWCA9PSAoaVdpZHRoIC0gMikpICAgICAgICAgICAgLyogbGFzdCBpbnRlcnZhbCA/ICovCisgICAgICBpTSA9IChtbmdfaW50MzIpaU1SOworICAgIGVsc2UKKyAgICAgIGlNID0gKG1uZ19pbnQzMilpTVg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaWxsIGludGVydmFsID8gKi8KKyAgICBpZiAoKGlYIDwgaVdpZHRoIC0gMSkgfHwgKGlXaWR0aCA9PSAxKSkKKyAgICB7CisgICAgICBpZiAocFRlbXBzcmMyKSAgICAgICAgICAgICAgICAgICAvKiBkbyB3ZSBoYXZlIHRoZSBzZWNvbmQgcGl4ZWwgPyAqLworICAgICAgeworICAgICAgICBmb3IgKGlTID0gMTsgaVMgPCBpTTsgaVMrKykKKyAgICAgICAgeworICAgICAgICAgIGlmICgqcFRlbXBzcmMxID09ICpwVGVtcHNyYzIpCisgICAgICAgICAgICAqcFRlbXBkc3QgPSAqcFRlbXBzcmMxOyAgICAvKiBqdXN0IHJlcGVhdCB0aGUgZmlyc3QgKi8KKyAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNhbGN1bGF0ZSB0aGUgZGlzdGFuY2UgKi8KKyAgICAgICAgICAgIG1uZ19wdXRfdWludDE2ICgobW5nX3VpbnQ4cClwVGVtcGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX3VpbnQxNikoKCgyICogaVMgKiAoIChtbmdfaW50MzIpKG1uZ19nZXRfdWludDE2ICgobW5nX3VpbnQ4cClwVGVtcHNyYzIpKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX2ludDMyKShtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApcFRlbXBzcmMxKSkgKSArIGlNKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaU0gKiAyKSkgKyAobW5nX2ludDMyKShtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApcFRlbXBzcmMxKSkgICAgICAgICApICk7CisKKyAgICAgICAgICBwVGVtcGRzdCsrOworCisgICAgICAgICAgaWYgKCoocFRlbXBzcmMxKzEpID09ICoocFRlbXBzcmMyKzEpKQorICAgICAgICAgICAgKnBUZW1wZHN0ID0gKihwVGVtcHNyYzErMSk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgbW5nX3B1dF91aW50MTYgKChtbmdfdWludDhwKXBUZW1wZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfdWludDE2KSgoKDIgKiBpUyAqICggKG1uZ19pbnQzMikobW5nX2dldF91aW50MTYgKChtbmdfdWludDhwKShwVGVtcHNyYzIrMSkpKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX2ludDMyKShtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApKHBUZW1wc3JjMSsxKSkpICkgKyBpTSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlNICogMikpICsgKG1uZ19pbnQzMikobW5nX2dldF91aW50MTYgKChtbmdfdWludDhwKShwVGVtcHNyYzErMSkpKSAgICAgICAgICkgKTsKKworICAgICAgICAgIHBUZW1wZHN0Kys7CisKKyAgICAgICAgICBpZiAoKihwVGVtcHNyYzErMikgPT0gKihwVGVtcHNyYzIrMikpCisgICAgICAgICAgICAqcFRlbXBkc3QgPSAqKHBUZW1wc3JjMSsyKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBtbmdfcHV0X3VpbnQxNiAoKG1uZ191aW50OHApcFRlbXBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ191aW50MTYpKCgoMiAqIGlTICogKCAobW5nX2ludDMyKShtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApKHBUZW1wc3JjMisyKSkpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfaW50MzIpKG1uZ19nZXRfdWludDE2ICgobW5nX3VpbnQ4cCkocFRlbXBzcmMxKzIpKSkgKSArIGlNKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaU0gKiAyKSkgKyAobW5nX2ludDMyKShtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApKHBUZW1wc3JjMSsyKSkpICAgICAgICAgKSApOworCisgICAgICAgICAgcFRlbXBkc3QrKzsKKworICAgICAgICAgIGlmICgqKHBUZW1wc3JjMSszKSA9PSAqKHBUZW1wc3JjMiszKSkKKyAgICAgICAgICAgICpwVGVtcGRzdCA9ICoocFRlbXBzcmMxKzMpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1uZ19wdXRfdWludDE2ICgobW5nX3VpbnQ4cClwVGVtcGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX3VpbnQxNikoKCgyICogaVMgKiAoIChtbmdfaW50MzIpKG1uZ19nZXRfdWludDE2ICgobW5nX3VpbnQ4cCkocFRlbXBzcmMyKzMpKSkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ19pbnQzMikobW5nX2dldF91aW50MTYgKChtbmdfdWludDhwKShwVGVtcHNyYzErMykpKSApICsgaU0pIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpTSAqIDIpKSArIChtbmdfaW50MzIpKG1uZ19nZXRfdWludDE2ICgobW5nX3VpbnQ4cCkocFRlbXBzcmMxKzMpKSkgICAgICAgICApICk7CisKKyAgICAgICAgICBwVGVtcGRzdCsrOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGZvciAoaVMgPSAxOyBpUyA8IGlNOyBpUysrKQorICAgICAgICB7CisgICAgICAgICAgKnBUZW1wZHN0ID0gKnBUZW1wc3JjMTsgICAgICAvKiByZXBlYXQgZmlyc3Qgc291cmNlIHBpeGVsICovCisgICAgICAgICAgcFRlbXBkc3QrKzsKKyAgICAgICAgICAqcFRlbXBkc3QgPSAqKHBUZW1wc3JjMSsxKTsKKyAgICAgICAgICBwVGVtcGRzdCsrOworICAgICAgICAgICpwVGVtcGRzdCA9ICoocFRlbXBzcmMxKzIpOworICAgICAgICAgIHBUZW1wZHN0Kys7CisgICAgICAgICAgKnBUZW1wZHN0ID0gKihwVGVtcHNyYzErMyk7CisgICAgICAgICAgcFRlbXBkc3QrKzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHBUZW1wc3JjMSArPSA0OworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fTUFHTklGWV9SR0JBMTZfWDIsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9yZ2JhMTZfeDMgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1YLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBTcmNsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBEc3RsaW5lKQoreworICBtbmdfdWludDMyICBpWDsKKyAgbW5nX2ludDMyICAgaVMsIGlNLCBpSDsKKyAgbW5nX3VpbnQxNnAgcFRlbXBzcmMxOworICBtbmdfdWludDE2cCBwVGVtcHNyYzI7CisgIG1uZ191aW50MTZwIHBUZW1wZHN0OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX01BR05JRllfUkdCQTE2X1gzLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcFRlbXBzcmMxID0gKG1uZ191aW50MTZwKXBTcmNsaW5lOyAgIC8qIGluaXRpYWxpemUgcGl4ZWwtbG9vcCAqLworICBwVGVtcGRzdCAgPSAobW5nX3VpbnQxNnApcERzdGxpbmU7CisKKyAgZm9yIChpWCA9IDA7IGlYIDwgaVdpZHRoOyBpWCsrKQorICB7CisgICAgcFRlbXBzcmMyID0gcFRlbXBzcmMxICsgNDsKKworICAgICpwVGVtcGRzdCA9ICpwVGVtcHNyYzE7ICAgICAgICAgICAgLyogY29weSBvcmlnaW5hbCBzb3VyY2UgcGl4ZWwgKi8KKyAgICBwVGVtcGRzdCsrOworICAgICpwVGVtcGRzdCA9ICoocFRlbXBzcmMxKzEpOworICAgIHBUZW1wZHN0Kys7CisgICAgKnBUZW1wZHN0ID0gKihwVGVtcHNyYzErMik7CisgICAgcFRlbXBkc3QrKzsKKyAgICAqcFRlbXBkc3QgPSAqKHBUZW1wc3JjMSszKTsKKyAgICBwVGVtcGRzdCsrOworCisgICAgaWYgKGlYID09IDApICAgICAgICAgICAgICAgICAgICAgICAvKiBmaXJzdCBpbnRlcnZhbCA/ICovCisgICAgeworICAgICAgaWYgKGlXaWR0aCA9PSAxKSAgICAgICAgICAgICAgICAgLyogc2luZ2xlIHBpeGVsID8gKi8KKyAgICAgICAgcFRlbXBzcmMyID0gTU5HX05VTEw7CisKKyAgICAgIGlNID0gKG1uZ19pbnQzMilpTUw7CisgICAgfQorICAgIGVsc2UKKyAgICBpZiAoaVggPT0gKGlXaWR0aCAtIDIpKSAgICAgICAgICAgIC8qIGxhc3QgaW50ZXJ2YWwgPyAqLworICAgICAgaU0gPSAobW5nX2ludDMyKWlNUjsKKyAgICBlbHNlCisgICAgICBpTSA9IChtbmdfaW50MzIpaU1YOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmlsbCBpbnRlcnZhbCA/ICovCisgICAgaWYgKChpWCA8IGlXaWR0aCAtIDEpIHx8IChpV2lkdGggPT0gMSkpCisgICAgeworICAgICAgaWYgKHBUZW1wc3JjMikgICAgICAgICAgICAgICAgICAgLyogZG8gd2UgaGF2ZSB0aGUgc2Vjb25kIHBpeGVsID8gKi8KKyAgICAgIHsKKyAgICAgICAgaUggPSAoaU0rMSkgLyAyOyAgICAgICAgICAgICAgIC8qIGNhbGN1bGF0ZSBoYWxmd2F5IHBvaW50ICovCisKKyAgICAgICAgZm9yIChpUyA9IDE7IGlTIDwgaUg7IGlTKyspICAgIC8qIHJlcGxpY2F0ZSBmaXJzdCBoYWxmICovCisgICAgICAgIHsKKyAgICAgICAgICAqcFRlbXBkc3QgICAgID0gKnBUZW1wc3JjMTsKKyAgICAgICAgICAqKHBUZW1wZHN0KzEpID0gKihwVGVtcHNyYzErMSk7CisgICAgICAgICAgKihwVGVtcGRzdCsyKSA9ICoocFRlbXBzcmMxKzIpOworICAgICAgICAgICoocFRlbXBkc3QrMykgPSAqKHBUZW1wc3JjMSszKTsKKworICAgICAgICAgIHBUZW1wZHN0ICs9IDQ7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGlTID0gaUg7IGlTIDwgaU07IGlTKyspICAgLyogcmVwbGljYXRlIHNlY29uZCBoYWxmICovCisgICAgICAgIHsKKyAgICAgICAgICAqcFRlbXBkc3QgICAgID0gKnBUZW1wc3JjMjsKKyAgICAgICAgICAqKHBUZW1wZHN0KzEpID0gKihwVGVtcHNyYzIrMSk7CisgICAgICAgICAgKihwVGVtcGRzdCsyKSA9ICoocFRlbXBzcmMyKzIpOworICAgICAgICAgICoocFRlbXBkc3QrMykgPSAqKHBUZW1wc3JjMiszKTsKKworICAgICAgICAgIHBUZW1wZHN0ICs9IDQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZm9yIChpUyA9IDE7IGlTIDwgaU07IGlTKyspCisgICAgICAgIHsKKyAgICAgICAgICAqcFRlbXBkc3QgPSAqcFRlbXBzcmMxOyAgICAgIC8qIHJlcGVhdCBmaXJzdCBzb3VyY2UgcGl4ZWwgKi8KKyAgICAgICAgICBwVGVtcGRzdCsrOworICAgICAgICAgICpwVGVtcGRzdCA9ICoocFRlbXBzcmMxKzEpOworICAgICAgICAgIHBUZW1wZHN0Kys7CisgICAgICAgICAgKnBUZW1wZHN0ID0gKihwVGVtcHNyYzErMik7CisgICAgICAgICAgcFRlbXBkc3QrKzsKKyAgICAgICAgICAqcFRlbXBkc3QgPSAqKHBUZW1wc3JjMSszKTsKKyAgICAgICAgICBwVGVtcGRzdCsrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcFRlbXBzcmMxICs9IDQ7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9NQUdOSUZZX1JHQkExNl9YMywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19tYWduaWZ5X3JnYmExNl94NCAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcFNyY2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcERzdGxpbmUpCit7CisgIG1uZ191aW50MzIgIGlYOworICBtbmdfaW50MzIgICBpUywgaU0sIGlIOworICBtbmdfdWludDE2cCBwVGVtcHNyYzE7CisgIG1uZ191aW50MTZwIHBUZW1wc3JjMjsKKyAgbW5nX3VpbnQxNnAgcFRlbXBkc3Q7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fTUFHTklGWV9SR0JBMTZfWDQsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBwVGVtcHNyYzEgPSAobW5nX3VpbnQxNnApcFNyY2xpbmU7ICAgLyogaW5pdGlhbGl6ZSBwaXhlbC1sb29wICovCisgIHBUZW1wZHN0ICA9IChtbmdfdWludDE2cClwRHN0bGluZTsKKworICBmb3IgKGlYID0gMDsgaVggPCBpV2lkdGg7IGlYKyspCisgIHsKKyAgICBwVGVtcHNyYzIgPSBwVGVtcHNyYzEgKyA0OworCisgICAgKnBUZW1wZHN0ID0gKnBUZW1wc3JjMTsgICAgICAgICAgICAvKiBjb3B5IG9yaWdpbmFsIHNvdXJjZSBwaXhlbCAqLworICAgIHBUZW1wZHN0Kys7CisgICAgKnBUZW1wZHN0ID0gKihwVGVtcHNyYzErMSk7CisgICAgcFRlbXBkc3QrKzsKKyAgICAqcFRlbXBkc3QgPSAqKHBUZW1wc3JjMSsyKTsKKyAgICBwVGVtcGRzdCsrOworICAgICpwVGVtcGRzdCA9ICoocFRlbXBzcmMxKzMpOworICAgIHBUZW1wZHN0Kys7CisKKyAgICBpZiAoaVggPT0gMCkgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpcnN0IGludGVydmFsID8gKi8KKyAgICB7CisgICAgICBpZiAoaVdpZHRoID09IDEpICAgICAgICAgICAgICAgICAvKiBzaW5nbGUgcGl4ZWwgPyAqLworICAgICAgICBwVGVtcHNyYzIgPSBNTkdfTlVMTDsKKworICAgICAgaU0gPSAobW5nX2ludDMyKWlNTDsKKyAgICB9CisgICAgZWxzZQorICAgIGlmIChpWCA9PSAoaVdpZHRoIC0gMikpICAgICAgICAgICAgLyogbGFzdCBpbnRlcnZhbCA/ICovCisgICAgICBpTSA9IChtbmdfaW50MzIpaU1SOworICAgIGVsc2UKKyAgICAgIGlNID0gKG1uZ19pbnQzMilpTVg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaWxsIGludGVydmFsID8gKi8KKyAgICBpZiAoKGlYIDwgaVdpZHRoIC0gMSkgfHwgKGlXaWR0aCA9PSAxKSkKKyAgICB7CisgICAgICBpZiAocFRlbXBzcmMyKSAgICAgICAgICAgICAgICAgICAvKiBkbyB3ZSBoYXZlIHRoZSBzZWNvbmQgcGl4ZWwgPyAqLworICAgICAgeworICAgICAgICBpSCA9IChpTSsxKSAvIDI7ICAgICAgICAgICAgICAgLyogY2FsY3VsYXRlIGhhbGZ3YXkgcG9pbnQgKi8KKworICAgICAgICBmb3IgKGlTID0gMTsgaVMgPCBpSDsgaVMrKykgICAgLyogZmlyc3QgaGFsZiAqLworICAgICAgICB7CisgICAgICAgICAgaWYgKCpwVGVtcHNyYzEgPT0gKnBUZW1wc3JjMikKKyAgICAgICAgICAgICpwVGVtcGRzdCA9ICpwVGVtcHNyYzE7ICAgIC8qIGp1c3QgcmVwZWF0IHRoZSBmaXJzdCAqLworICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2FsY3VsYXRlIHRoZSBkaXN0YW5jZSAqLworICAgICAgICAgICAgbW5nX3B1dF91aW50MTYgKChtbmdfdWludDhwKXBUZW1wZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfdWludDE2KSgoKDIgKiBpUyAqICggKG1uZ19pbnQzMikobW5nX2dldF91aW50MTYgKChtbmdfdWludDhwKXBUZW1wc3JjMikpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfaW50MzIpKG1uZ19nZXRfdWludDE2ICgobW5nX3VpbnQ4cClwVGVtcHNyYzEpKSApICsgaU0pIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpTSAqIDIpKSArIChtbmdfaW50MzIpKG1uZ19nZXRfdWludDE2ICgobW5nX3VpbnQ4cClwVGVtcHNyYzEpKSAgICAgICAgICkgKTsKKworICAgICAgICAgIHBUZW1wZHN0Kys7CisKKyAgICAgICAgICBpZiAoKihwVGVtcHNyYzErMSkgPT0gKihwVGVtcHNyYzIrMSkpCisgICAgICAgICAgICAqcFRlbXBkc3QgPSAqKHBUZW1wc3JjMSsxKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBtbmdfcHV0X3VpbnQxNiAoKG1uZ191aW50OHApcFRlbXBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ191aW50MTYpKCgoMiAqIGlTICogKCAobW5nX2ludDMyKShtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApKHBUZW1wc3JjMisxKSkpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfaW50MzIpKG1uZ19nZXRfdWludDE2ICgobW5nX3VpbnQ4cCkocFRlbXBzcmMxKzEpKSkgKSArIGlNKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaU0gKiAyKSkgKyAobW5nX2ludDMyKShtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApKHBUZW1wc3JjMSsxKSkpICAgICAgICAgKSApOworCisgICAgICAgICAgcFRlbXBkc3QrKzsKKworICAgICAgICAgIGlmICgqKHBUZW1wc3JjMSsyKSA9PSAqKHBUZW1wc3JjMisyKSkKKyAgICAgICAgICAgICpwVGVtcGRzdCA9ICoocFRlbXBzcmMxKzIpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1uZ19wdXRfdWludDE2ICgobW5nX3VpbnQ4cClwVGVtcGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX3VpbnQxNikoKCgyICogaVMgKiAoIChtbmdfaW50MzIpKG1uZ19nZXRfdWludDE2ICgobW5nX3VpbnQ4cCkocFRlbXBzcmMyKzIpKSkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ19pbnQzMikobW5nX2dldF91aW50MTYgKChtbmdfdWludDhwKShwVGVtcHNyYzErMikpKSApICsgaU0pIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpTSAqIDIpKSArIChtbmdfaW50MzIpKG1uZ19nZXRfdWludDE2ICgobW5nX3VpbnQ4cCkocFRlbXBzcmMxKzIpKSkgICAgICAgICApICk7CisKKyAgICAgICAgICBwVGVtcGRzdCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVwbGljYXRlIGFscGhhIGZyb20gbGVmdCAqLworICAgICAgICAgICpwVGVtcGRzdCAgICAgPSAqKHBUZW1wc3JjMSszKTsKKworICAgICAgICAgIHBUZW1wZHN0Kys7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGlTID0gaUg7IGlTIDwgaU07IGlTKyspICAgLyogc2Vjb25kIGhhbGYgKi8KKyAgICAgICAgeworICAgICAgICAgIGlmICgqcFRlbXBzcmMxID09ICpwVGVtcHNyYzIpCisgICAgICAgICAgICAqcFRlbXBkc3QgPSAqcFRlbXBzcmMxOyAgICAvKiBqdXN0IHJlcGVhdCB0aGUgZmlyc3QgKi8KKyAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNhbGN1bGF0ZSB0aGUgZGlzdGFuY2UgKi8KKyAgICAgICAgICAgIG1uZ19wdXRfdWludDE2ICgobW5nX3VpbnQ4cClwVGVtcGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX3VpbnQxNikoKCgyICogaVMgKiAoIChtbmdfaW50MzIpKG1uZ19nZXRfdWludDE2ICgobW5nX3VpbnQ4cClwVGVtcHNyYzIpKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX2ludDMyKShtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApcFRlbXBzcmMxKSkgKSArIGlNKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaU0gKiAyKSkgKyAobW5nX2ludDMyKShtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApcFRlbXBzcmMxKSkgICAgICAgICApICk7CisKKyAgICAgICAgICBwVGVtcGRzdCsrOworCisgICAgICAgICAgaWYgKCoocFRlbXBzcmMxKzEpID09ICoocFRlbXBzcmMyKzEpKQorICAgICAgICAgICAgKnBUZW1wZHN0ID0gKihwVGVtcHNyYzErMSk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgbW5nX3B1dF91aW50MTYgKChtbmdfdWludDhwKXBUZW1wZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfdWludDE2KSgoKDIgKiBpUyAqICggKG1uZ19pbnQzMikobW5nX2dldF91aW50MTYgKChtbmdfdWludDhwKShwVGVtcHNyYzIrMSkpKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX2ludDMyKShtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApKHBUZW1wc3JjMSsxKSkpICkgKyBpTSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlNICogMikpICsgKG1uZ19pbnQzMikobW5nX2dldF91aW50MTYgKChtbmdfdWludDhwKShwVGVtcHNyYzErMSkpKSAgICAgICAgICkgKTsKKworICAgICAgICAgIHBUZW1wZHN0Kys7CisKKyAgICAgICAgICBpZiAoKihwVGVtcHNyYzErMikgPT0gKihwVGVtcHNyYzIrMikpCisgICAgICAgICAgICAqcFRlbXBkc3QgPSAqKHBUZW1wc3JjMSsyKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBtbmdfcHV0X3VpbnQxNiAoKG1uZ191aW50OHApcFRlbXBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ191aW50MTYpKCgoMiAqIGlTICogKCAobW5nX2ludDMyKShtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApKHBUZW1wc3JjMisyKSkpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfaW50MzIpKG1uZ19nZXRfdWludDE2ICgobW5nX3VpbnQ4cCkocFRlbXBzcmMxKzIpKSkgKSArIGlNKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaU0gKiAyKSkgKyAobW5nX2ludDMyKShtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApKHBUZW1wc3JjMSsyKSkpICAgICAgICAgKSApOworCisgICAgICAgICAgcFRlbXBkc3QrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlcGxpY2F0ZSBhbHBoYSBmcm9tIHJpZ2h0ICovCisgICAgICAgICAgKnBUZW1wZHN0ICAgICA9ICoocFRlbXBzcmMyKzMpOworCisgICAgICAgICAgcFRlbXBkc3QrKzsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBmb3IgKGlTID0gMTsgaVMgPCBpTTsgaVMrKykKKyAgICAgICAgeworICAgICAgICAgICpwVGVtcGRzdCA9ICpwVGVtcHNyYzE7ICAgICAgLyogcmVwZWF0IGZpcnN0IHNvdXJjZSBwaXhlbCAqLworICAgICAgICAgIHBUZW1wZHN0Kys7CisgICAgICAgICAgKnBUZW1wZHN0ID0gKihwVGVtcHNyYzErMSk7CisgICAgICAgICAgcFRlbXBkc3QrKzsKKyAgICAgICAgICAqcFRlbXBkc3QgPSAqKHBUZW1wc3JjMSsyKTsKKyAgICAgICAgICBwVGVtcGRzdCsrOworICAgICAgICAgICpwVGVtcGRzdCA9ICoocFRlbXBzcmMxKzMpOworICAgICAgICAgIHBUZW1wZHN0Kys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBwVGVtcHNyYzEgKz0gNDsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX01BR05JRllfUkdCQTE2X1g0LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX21hZ25pZnlfcmdiYTE2X3g1IChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSkKK3sKKyAgbW5nX3VpbnQzMiAgaVg7CisgIG1uZ19pbnQzMiAgIGlTLCBpTSwgaUg7CisgIG1uZ191aW50MTZwIHBUZW1wc3JjMTsKKyAgbW5nX3VpbnQxNnAgcFRlbXBzcmMyOworICBtbmdfdWludDE2cCBwVGVtcGRzdDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9NQUdOSUZZX1JHQkExNl9YNSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBUZW1wc3JjMSA9IChtbmdfdWludDE2cClwU3JjbGluZTsgICAvKiBpbml0aWFsaXplIHBpeGVsLWxvb3AgKi8KKyAgcFRlbXBkc3QgID0gKG1uZ191aW50MTZwKXBEc3RsaW5lOworCisgIGZvciAoaVggPSAwOyBpWCA8IGlXaWR0aDsgaVgrKykKKyAgeworICAgIHBUZW1wc3JjMiA9IHBUZW1wc3JjMSArIDQ7CisKKyAgICAqcFRlbXBkc3QgPSAqcFRlbXBzcmMxOyAgICAgICAgICAgIC8qIGNvcHkgb3JpZ2luYWwgc291cmNlIHBpeGVsICovCisgICAgcFRlbXBkc3QrKzsKKyAgICAqcFRlbXBkc3QgPSAqKHBUZW1wc3JjMSsxKTsKKyAgICBwVGVtcGRzdCsrOworICAgICpwVGVtcGRzdCA9ICoocFRlbXBzcmMxKzIpOworICAgIHBUZW1wZHN0Kys7CisgICAgKnBUZW1wZHN0ID0gKihwVGVtcHNyYzErMyk7CisgICAgcFRlbXBkc3QrKzsKKworICAgIGlmIChpWCA9PSAwKSAgICAgICAgICAgICAgICAgICAgICAgLyogZmlyc3QgaW50ZXJ2YWwgPyAqLworICAgIHsKKyAgICAgIGlmIChpV2lkdGggPT0gMSkgICAgICAgICAgICAgICAgIC8qIHNpbmdsZSBwaXhlbCA/ICovCisgICAgICAgIHBUZW1wc3JjMiA9IE1OR19OVUxMOworCisgICAgICBpTSA9IChtbmdfaW50MzIpaU1MOworICAgIH0KKyAgICBlbHNlCisgICAgaWYgKGlYID09IChpV2lkdGggLSAyKSkgICAgICAgICAgICAvKiBsYXN0IGludGVydmFsID8gKi8KKyAgICAgIGlNID0gKG1uZ19pbnQzMilpTVI7CisgICAgZWxzZQorICAgICAgaU0gPSAobW5nX2ludDMyKWlNWDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbGwgaW50ZXJ2YWwgPyAqLworICAgIGlmICgoaVggPCBpV2lkdGggLSAxKSB8fCAoaVdpZHRoID09IDEpKQorICAgIHsKKyAgICAgIGlmIChwVGVtcHNyYzIpICAgICAgICAgICAgICAgICAgIC8qIGRvIHdlIGhhdmUgdGhlIHNlY29uZCBwaXhlbCA/ICovCisgICAgICB7CisgICAgICAgIGlIID0gKGlNKzEpIC8gMjsgICAgICAgICAgICAgICAvKiBjYWxjdWxhdGUgaGFsZndheSBwb2ludCAqLworCisgICAgICAgIGZvciAoaVMgPSAxOyBpUyA8IGlIOyBpUysrKSAgICAvKiBmaXJzdCBoYWxmICovCisgICAgICAgIHsKKyAgICAgICAgICAqcFRlbXBkc3QgICAgID0gKnBUZW1wc3JjMTsgIC8qIHJlcGxpY2F0ZSBjb2xvciBmcm9tIGxlZnQgKi8KKyAgICAgICAgICAqKHBUZW1wZHN0KzEpID0gKihwVGVtcHNyYzErMSk7CisgICAgICAgICAgKihwVGVtcGRzdCsyKSA9ICoocFRlbXBzcmMxKzIpOworCisgICAgICAgICAgaWYgKCoocFRlbXBzcmMxKzMpID09ICoocFRlbXBzcmMyKzMpKQorICAgICAgICAgICAgKihwVGVtcGRzdCszKSA9ICoocFRlbXBzcmMxKzMpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1uZ19wdXRfdWludDE2ICgobW5nX3VpbnQ4cCkocFRlbXBkc3QrMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ191aW50MTYpKCgoMiAqIGlTICogKCAobW5nX2ludDMyKShtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApKHBUZW1wc3JjMiszKSkpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfaW50MzIpKG1uZ19nZXRfdWludDE2ICgobW5nX3VpbnQ4cCkocFRlbXBzcmMxKzMpKSkgKSArIGlNKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaU0gKiAyKSkgKyAobW5nX2ludDMyKShtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApKHBUZW1wc3JjMSszKSkpICAgICAgICAgKSApOworCisgICAgICAgICAgcFRlbXBkc3QgKz0gNDsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaVMgPSBpSDsgaVMgPCBpTTsgaVMrKykgICAvKiBzZWNvbmQgaGFsZiAqLworICAgICAgICB7CisgICAgICAgICAgKnBUZW1wZHN0ICAgICA9ICpwVGVtcHNyYzI7ICAvKiByZXBsaWNhdGUgY29sb3IgZnJvbSByaWdodCAqLworICAgICAgICAgICoocFRlbXBkc3QrMSkgPSAqKHBUZW1wc3JjMisxKTsKKyAgICAgICAgICAqKHBUZW1wZHN0KzIpID0gKihwVGVtcHNyYzIrMik7CisKKyAgICAgICAgICBpZiAoKihwVGVtcHNyYzErMykgPT0gKihwVGVtcHNyYzIrMykpCisgICAgICAgICAgICAqKHBUZW1wZHN0KzMpID0gKihwVGVtcHNyYzErMyk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgbW5nX3B1dF91aW50MTYgKChtbmdfdWludDhwKShwVGVtcGRzdCszKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX3VpbnQxNikoKCgyICogaVMgKiAoIChtbmdfaW50MzIpKG1uZ19nZXRfdWludDE2ICgobW5nX3VpbnQ4cCkocFRlbXBzcmMyKzMpKSkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ19pbnQzMikobW5nX2dldF91aW50MTYgKChtbmdfdWludDhwKShwVGVtcHNyYzErMykpKSApICsgaU0pIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpTSAqIDIpKSArIChtbmdfaW50MzIpKG1uZ19nZXRfdWludDE2ICgobW5nX3VpbnQ4cCkocFRlbXBzcmMxKzMpKSkgICAgICAgICApICk7CisKKyAgICAgICAgICBwVGVtcGRzdCArPSA0OworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGZvciAoaVMgPSAxOyBpUyA8IGlNOyBpUysrKQorICAgICAgICB7CisgICAgICAgICAgKnBUZW1wZHN0ID0gKnBUZW1wc3JjMTsgICAgICAvKiByZXBlYXQgZmlyc3Qgc291cmNlIHBpeGVsICovCisgICAgICAgICAgcFRlbXBkc3QrKzsKKyAgICAgICAgICAqcFRlbXBkc3QgPSAqKHBUZW1wc3JjMSsxKTsKKyAgICAgICAgICBwVGVtcGRzdCsrOworICAgICAgICAgICpwVGVtcGRzdCA9ICoocFRlbXBzcmMxKzIpOworICAgICAgICAgIHBUZW1wZHN0Kys7CisgICAgICAgICAgKnBUZW1wZHN0ID0gKihwVGVtcHNyYzErMyk7CisgICAgICAgICAgcFRlbXBkc3QrKzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHBUZW1wc3JjMSArPSA0OworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fTUFHTklGWV9SR0JBMTZfWDQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19OT19HUkFZX1NVUFBPUlQKK21uZ19yZXRjb2RlIG1uZ19tYWduaWZ5X2cxNl95MSAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcFNyY2xpbmUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBTcmNsaW5lMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fTUFHTklGWV9HMTZfWTEsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfQ09QWSAocERzdGxpbmUsIHBTcmNsaW5lMSwgKGlXaWR0aCA8PCAxKSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fTUFHTklGWV9HMTZfWTEsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9nMTZfeTIgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBTcmNsaW5lMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcERzdGxpbmUpCit7CisgIG1uZ191aW50MzIgIGlYOworICBtbmdfdWludDE2cCBwVGVtcHNyYzE7CisgIG1uZ191aW50MTZwIHBUZW1wc3JjMjsKKyAgbW5nX3VpbnQxNnAgcFRlbXBkc3Q7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fTUFHTklGWV9HMTZfWTIsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBwVGVtcHNyYzEgPSAobW5nX3VpbnQxNnApcFNyY2xpbmUxOyAgLyogaW5pdGlhbGl6ZSBwaXhlbC1sb29wICovCisgIHBUZW1wc3JjMiA9IChtbmdfdWludDE2cClwU3JjbGluZTI7CisgIHBUZW1wZHN0ICA9IChtbmdfdWludDE2cClwRHN0bGluZTsKKworICBpZiAocFRlbXBzcmMyKSAgICAgICAgICAgICAgICAgICAgICAgLyogZG8gd2UgaGF2ZSBhIHNlY29uZCBsaW5lID8gKi8KKyAgeworICAgIGZvciAoaVggPSAwOyBpWCA8IGlXaWR0aDsgaVgrKykKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNhbGN1bGF0ZSB0aGUgZGlzdGFuY2VzICovCisgICAgICBpZiAoKnBUZW1wc3JjMSA9PSAqcFRlbXBzcmMyKQorICAgICAgICAqcFRlbXBkc3QgPSAqcFRlbXBzcmMxOworICAgICAgZWxzZQorICAgICAgICBtbmdfcHV0X3VpbnQxNiAoKG1uZ191aW50OHApcFRlbXBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAobW5nX3VpbnQxNikoICggKDIgKiBpUyAqICggKG1uZ19pbnQzMikobW5nX2dldF91aW50MTYgKChtbmdfdWludDhwKXBUZW1wc3JjMikpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX2ludDMyKShtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApcFRlbXBzcmMxKSkgKSArIGlNKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlNICogMikpICsgKG1uZ19pbnQzMikobW5nX2dldF91aW50MTYgKChtbmdfdWludDhwKXBUZW1wc3JjMSkpICAgICAgICAgKSApOworCisgICAgICBwVGVtcGRzdCsrOworICAgICAgcFRlbXBzcmMxKys7CisgICAgICBwVGVtcHNyYzIrKzsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoganVzdCByZXBlYXQgdGhlIGVudGlyZSBsaW5lICovCisgICAgTU5HX0NPUFkgKHBUZW1wZHN0LCBwVGVtcHNyYzEsIChpV2lkdGggPDwgMSkpOworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fTUFHTklGWV9HMTZfWTIsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9nMTZfeTMgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBTcmNsaW5lMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcERzdGxpbmUpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX01BR05JRllfRzE2X1kzLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKHBTcmNsaW5lMikgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvIHdlIGhhdmUgYSBzZWNvbmQgbGluZSA/ICovCisgIHsKKyAgICBpZiAoaVMgPCAoaU0rMSkgLyAyKSAgICAgICAgICAgICAgIC8qIHRvcCBoYWxmID8gKi8KKyAgICAgIE1OR19DT1BZIChwRHN0bGluZSwgcFNyY2xpbmUxLCAoaVdpZHRoIDw8IDEpKQorICAgIGVsc2UKKyAgICAgIE1OR19DT1BZIChwRHN0bGluZSwgcFNyY2xpbmUyLCAoaVdpZHRoIDw8IDEpKTsKKyAgfQorICBlbHNlCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBqdXN0IHJlcGVhdCB0aGUgZW50aXJlIGxpbmUgKi8KKyAgICBNTkdfQ09QWSAocERzdGxpbmUsIHBTcmNsaW5lMSwgKGlXaWR0aCA8PCAxKSk7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9NQUdOSUZZX0cxNl9ZMywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYgLyogTU5HX05PX0dSQVlfU1VQUE9SVCAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9yZ2IxNl95MSAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fTUFHTklGWV9SR0IxNl9ZMSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19DT1BZIChwRHN0bGluZSwgcFNyY2xpbmUxLCBpV2lkdGggKiA2KTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9NQUdOSUZZX1JHQjE2X1kxLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX21hZ25pZnlfcmdiMTZfeTIgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcFNyY2xpbmUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcFNyY2xpbmUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcERzdGxpbmUpCit7CisgIG1uZ191aW50MzIgIGlYOworICBtbmdfdWludDE2cCBwVGVtcHNyYzE7CisgIG1uZ191aW50MTZwIHBUZW1wc3JjMjsKKyAgbW5nX3VpbnQxNnAgcFRlbXBkc3Q7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fTUFHTklGWV9SR0IxNl9ZMiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBUZW1wc3JjMSA9IChtbmdfdWludDE2cClwU3JjbGluZTE7ICAvKiBpbml0aWFsaXplIHBpeGVsLWxvb3AgKi8KKyAgcFRlbXBzcmMyID0gKG1uZ191aW50MTZwKXBTcmNsaW5lMjsKKyAgcFRlbXBkc3QgID0gKG1uZ191aW50MTZwKXBEc3RsaW5lOworCisgIGlmIChwVGVtcHNyYzIpICAgICAgICAgICAgICAgICAgICAgICAvKiBkbyB3ZSBoYXZlIGEgc2Vjb25kIGxpbmUgPyAqLworICB7CisgICAgZm9yIChpWCA9IDA7IGlYIDwgaVdpZHRoOyBpWCsrKQorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2FsY3VsYXRlIHRoZSBkaXN0YW5jZXMgKi8KKyAgICAgIGlmICgqcFRlbXBzcmMxID09ICpwVGVtcHNyYzIpCisgICAgICAgICpwVGVtcGRzdCA9ICpwVGVtcHNyYzE7CisgICAgICBlbHNlCisgICAgICAgIG1uZ19wdXRfdWludDE2ICgobW5nX3VpbnQ4cClwVGVtcGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfdWludDE2KSggKCAoMiAqIGlTICogKCAobW5nX2ludDMyKShtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApcFRlbXBzcmMyKSkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfaW50MzIpKG1uZ19nZXRfdWludDE2ICgobW5nX3VpbnQ4cClwVGVtcHNyYzEpKSApICsgaU0pIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaU0gKiAyKSkgKyAobW5nX2ludDMyKShtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApcFRlbXBzcmMxKSkgICAgICAgICApICk7CisKKyAgICAgIHBUZW1wZHN0Kys7CisgICAgICBwVGVtcHNyYzErKzsKKyAgICAgIHBUZW1wc3JjMisrOworCisgICAgICBpZiAoKnBUZW1wc3JjMSA9PSAqcFRlbXBzcmMyKQorICAgICAgICAqcFRlbXBkc3QgPSAqcFRlbXBzcmMxOworICAgICAgZWxzZQorICAgICAgICBtbmdfcHV0X3VpbnQxNiAoKG1uZ191aW50OHApcFRlbXBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAobW5nX3VpbnQxNikoICggKDIgKiBpUyAqICggKG1uZ19pbnQzMikobW5nX2dldF91aW50MTYgKChtbmdfdWludDhwKXBUZW1wc3JjMikpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX2ludDMyKShtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApcFRlbXBzcmMxKSkgKSArIGlNKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlNICogMikpICsgKG1uZ19pbnQzMikobW5nX2dldF91aW50MTYgKChtbmdfdWludDhwKXBUZW1wc3JjMSkpICAgICAgICAgKSApOworCisgICAgICBwVGVtcGRzdCsrOworICAgICAgcFRlbXBzcmMxKys7CisgICAgICBwVGVtcHNyYzIrKzsKKworICAgICAgaWYgKCpwVGVtcHNyYzEgPT0gKnBUZW1wc3JjMikKKyAgICAgICAgKnBUZW1wZHN0ID0gKnBUZW1wc3JjMTsKKyAgICAgIGVsc2UKKyAgICAgICAgbW5nX3B1dF91aW50MTYgKChtbmdfdWludDhwKXBUZW1wZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ191aW50MTYpKCAoICgyICogaVMgKiAoIChtbmdfaW50MzIpKG1uZ19nZXRfdWludDE2ICgobW5nX3VpbnQ4cClwVGVtcHNyYzIpKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ19pbnQzMikobW5nX2dldF91aW50MTYgKChtbmdfdWludDhwKXBUZW1wc3JjMSkpICkgKyBpTSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpTSAqIDIpKSArIChtbmdfaW50MzIpKG1uZ19nZXRfdWludDE2ICgobW5nX3VpbnQ4cClwVGVtcHNyYzEpKSAgICAgICAgICkgKTsKKworICAgICAgcFRlbXBkc3QrKzsKKyAgICAgIHBUZW1wc3JjMSsrOworICAgICAgcFRlbXBzcmMyKys7CisgICAgfQorICB9CisgIGVsc2UKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGp1c3QgcmVwZWF0IHRoZSBlbnRpcmUgbGluZSAqLworICAgIE1OR19DT1BZIChwVGVtcGRzdCwgcFRlbXBzcmMxLCBpV2lkdGggKiA2KTsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX01BR05JRllfUkdCMTZfWTIsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9yZ2IxNl95MyAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fTUFHTklGWV9SR0IxNl9ZMywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmIChwU3JjbGluZTIpICAgICAgICAgICAgICAgICAgICAgICAvKiBkbyB3ZSBoYXZlIGEgc2Vjb25kIGxpbmUgPyAqLworICB7CisgICAgaWYgKGlTIDwgKGlNKzEpIC8gMikgICAgICAgICAgICAgICAvKiB0b3AgaGFsZiA/ICovCisgICAgICBNTkdfQ09QWSAocERzdGxpbmUsIHBTcmNsaW5lMSwgaVdpZHRoICogNikKKyAgICBlbHNlCisgICAgICBNTkdfQ09QWSAocERzdGxpbmUsIHBTcmNsaW5lMiwgaVdpZHRoICogNik7CisgIH0KKyAgZWxzZQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoganVzdCByZXBlYXQgdGhlIGVudGlyZSBsaW5lICovCisgICAgTU5HX0NPUFkgKHBEc3RsaW5lLCBwU3JjbGluZTEsIGlXaWR0aCAqIDYpOworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fTUFHTklGWV9SR0IxNl9ZMywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PX0dSQVlfU1VQUE9SVAorbW5nX3JldGNvZGUgbW5nX21hZ25pZnlfZ2ExNl95MSAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBTcmNsaW5lMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcFNyY2xpbmUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fTUFHTklGWV9HQTE2X1kxLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX0NPUFkgKHBEc3RsaW5lLCBwU3JjbGluZTEsIChpV2lkdGggPDwgMikpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX01BR05JRllfR0ExNl9ZMSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19tYWduaWZ5X2dhMTZfeTIgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBTcmNsaW5lMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcERzdGxpbmUpCit7CisgIG1uZ191aW50MzIgIGlYOworICBtbmdfdWludDE2cCBwVGVtcHNyYzE7CisgIG1uZ191aW50MTZwIHBUZW1wc3JjMjsKKyAgbW5nX3VpbnQxNnAgcFRlbXBkc3Q7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fTUFHTklGWV9HQTE2X1kyLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcFRlbXBzcmMxID0gKG1uZ191aW50MTZwKXBTcmNsaW5lMTsgIC8qIGluaXRpYWxpemUgcGl4ZWwtbG9vcCAqLworICBwVGVtcHNyYzIgPSAobW5nX3VpbnQxNnApcFNyY2xpbmUyOworICBwVGVtcGRzdCAgPSAobW5nX3VpbnQxNnApcERzdGxpbmU7CisKKyAgaWYgKHBUZW1wc3JjMikgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvIHdlIGhhdmUgYSBzZWNvbmQgbGluZSA/ICovCisgIHsKKyAgICBmb3IgKGlYID0gMDsgaVggPCBpV2lkdGg7IGlYKyspCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjYWxjdWxhdGUgdGhlIGRpc3RhbmNlcyAqLworICAgICAgaWYgKCpwVGVtcHNyYzEgPT0gKnBUZW1wc3JjMikKKyAgICAgICAgKnBUZW1wZHN0ID0gKnBUZW1wc3JjMTsKKyAgICAgIGVsc2UKKyAgICAgICAgbW5nX3B1dF91aW50MTYgKChtbmdfdWludDhwKXBUZW1wZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ191aW50MTYpKCAoICgyICogaVMgKiAoIChtbmdfaW50MzIpKG1uZ19nZXRfdWludDE2ICgobW5nX3VpbnQ4cClwVGVtcHNyYzIpKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ19pbnQzMikobW5nX2dldF91aW50MTYgKChtbmdfdWludDhwKXBUZW1wc3JjMSkpICkgKyBpTSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpTSAqIDIpKSArIChtbmdfaW50MzIpKG1uZ19nZXRfdWludDE2ICgobW5nX3VpbnQ4cClwVGVtcHNyYzEpKSAgICAgICAgICkgKTsKKworICAgICAgcFRlbXBkc3QrKzsKKyAgICAgIHBUZW1wc3JjMSsrOworICAgICAgcFRlbXBzcmMyKys7CisKKyAgICAgIGlmICgqcFRlbXBzcmMxID09ICpwVGVtcHNyYzIpCisgICAgICAgICpwVGVtcGRzdCA9ICpwVGVtcHNyYzE7CisgICAgICBlbHNlCisgICAgICAgIG1uZ19wdXRfdWludDE2ICgobW5nX3VpbnQ4cClwVGVtcGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfdWludDE2KSggKCAoMiAqIGlTICogKCAobW5nX2ludDMyKShtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApcFRlbXBzcmMyKSkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfaW50MzIpKG1uZ19nZXRfdWludDE2ICgobW5nX3VpbnQ4cClwVGVtcHNyYzEpKSApICsgaU0pIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaU0gKiAyKSkgKyAobW5nX2ludDMyKShtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApcFRlbXBzcmMxKSkgICAgICAgICApICk7CisKKyAgICAgIHBUZW1wZHN0Kys7CisgICAgICBwVGVtcHNyYzErKzsKKyAgICAgIHBUZW1wc3JjMisrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBqdXN0IHJlcGVhdCB0aGUgZW50aXJlIGxpbmUgKi8KKyAgICBNTkdfQ09QWSAocFRlbXBkc3QsIHBUZW1wc3JjMSwgKGlXaWR0aCA8PCAyKSk7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9NQUdOSUZZX0dBMTZfWTIsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9nYTE2X3kzIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcFNyY2xpbmUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBEc3RsaW5lKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9NQUdOSUZZX0dBMTZfWTMsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAocFNyY2xpbmUyKSAgICAgICAgICAgICAgICAgICAgICAgLyogZG8gd2UgaGF2ZSBhIHNlY29uZCBsaW5lID8gKi8KKyAgeworICAgIGlmIChpUyA8IChpTSsxKSAvIDIpICAgICAgICAgICAgICAgLyogdG9wIGhhbGYgPyAqLworICAgICAgTU5HX0NPUFkgKHBEc3RsaW5lLCBwU3JjbGluZTEsIChpV2lkdGggPDwgMikpCisgICAgZWxzZQorICAgICAgTU5HX0NPUFkgKHBEc3RsaW5lLCBwU3JjbGluZTIsIChpV2lkdGggPDwgMikpOworICB9CisgIGVsc2UKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGp1c3QgcmVwZWF0IHRoZSBlbnRpcmUgbGluZSAqLworICAgIE1OR19DT1BZIChwRHN0bGluZSwgcFNyY2xpbmUxLCAoaVdpZHRoIDw8IDIpKTsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX01BR05JRllfR0ExNl9ZMiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19tYWduaWZ5X2dhMTZfeTQgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBTcmNsaW5lMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcERzdGxpbmUpCit7CisgIG1uZ191aW50MzIgIGlYOworICBtbmdfdWludDE2cCBwVGVtcHNyYzE7CisgIG1uZ191aW50MTZwIHBUZW1wc3JjMjsKKyAgbW5nX3VpbnQxNnAgcFRlbXBkc3Q7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fTUFHTklGWV9HQTE2X1k0LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcFRlbXBzcmMxID0gKG1uZ191aW50MTZwKXBTcmNsaW5lMTsgIC8qIGluaXRpYWxpemUgcGl4ZWwtbG9vcCAqLworICBwVGVtcHNyYzIgPSAobW5nX3VpbnQxNnApcFNyY2xpbmUyOworICBwVGVtcGRzdCAgPSAobW5nX3VpbnQxNnApcERzdGxpbmU7CisKKyAgaWYgKHBUZW1wc3JjMikgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvIHdlIGhhdmUgYSBzZWNvbmQgbGluZSA/ICovCisgIHsKKyAgICBpZiAoaVMgPCAoaU0rMSkgLyAyKSAgICAgICAgICAgICAgIC8qIHRvcCBoYWxmID8gKi8KKyAgICB7CisgICAgICBmb3IgKGlYID0gMDsgaVggPCBpV2lkdGg7IGlYKyspCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjYWxjdWxhdGUgdGhlIGRpc3RhbmNlcyAqLworICAgICAgICBpZiAoKnBUZW1wc3JjMSA9PSAqcFRlbXBzcmMyKQorICAgICAgICAgICpwVGVtcGRzdCA9ICpwVGVtcHNyYzE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBtbmdfcHV0X3VpbnQxNiAoKG1uZ191aW50OHApcFRlbXBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfdWludDE2KSggKCAoMiAqIGlTICogKCAobW5nX2ludDMyKShtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApcFRlbXBzcmMyKSkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ19pbnQzMikobW5nX2dldF91aW50MTYgKChtbmdfdWludDhwKXBUZW1wc3JjMSkpICkgKyBpTSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlNICogMikpICsgKG1uZ19pbnQzMikobW5nX2dldF91aW50MTYgKChtbmdfdWludDhwKXBUZW1wc3JjMSkpICAgICAgICAgKSApOworCisgICAgICAgIHBUZW1wZHN0Kys7CisgICAgICAgIHBUZW1wc3JjMSsrOworICAgICAgICBwVGVtcHNyYzIgKz0gMjsKKworICAgICAgICAqcFRlbXBkc3QrKyA9ICpwVGVtcHNyYzErKzsgICAgLyogcmVwbGljYXRlIGFscGhhIGZyb20gdG9wICovCisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgZm9yIChpWCA9IDA7IGlYIDwgaVdpZHRoOyBpWCsrKQorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2FsY3VsYXRlIHRoZSBkaXN0YW5jZXMgKi8KKyAgICAgICAgaWYgKCpwVGVtcHNyYzEgPT0gKnBUZW1wc3JjMikKKyAgICAgICAgICAqcFRlbXBkc3QgPSAqcFRlbXBzcmMxOworICAgICAgICBlbHNlCisgICAgICAgICAgbW5nX3B1dF91aW50MTYgKChtbmdfdWludDhwKXBUZW1wZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX3VpbnQxNikoICggKDIgKiBpUyAqICggKG1uZ19pbnQzMikobW5nX2dldF91aW50MTYgKChtbmdfdWludDhwKXBUZW1wc3JjMikpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfaW50MzIpKG1uZ19nZXRfdWludDE2ICgobW5nX3VpbnQ4cClwVGVtcHNyYzEpKSApICsgaU0pIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpTSAqIDIpKSArIChtbmdfaW50MzIpKG1uZ19nZXRfdWludDE2ICgobW5nX3VpbnQ4cClwVGVtcHNyYzEpKSAgICAgICAgICkgKTsKKworICAgICAgICBwVGVtcGRzdCsrOworICAgICAgICBwVGVtcHNyYzEgKz0gMjsKKyAgICAgICAgcFRlbXBzcmMyKys7CisKKyAgICAgICAgKnBUZW1wZHN0KysgPSAqcFRlbXBzcmMyKys7ICAgIC8qIHJlcGxpY2F0ZSBhbHBoYSBmcm9tIGJvdHRvbSAqLworICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBqdXN0IHJlcGVhdCB0aGUgZW50aXJlIGxpbmUgKi8KKyAgICBNTkdfQ09QWSAocFRlbXBkc3QsIHBUZW1wc3JjMSwgKGlXaWR0aCA8PCAyKSk7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9NQUdOSUZZX0dBMTZfWTQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9nYTE2X3k1IChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcFNyY2xpbmUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBEc3RsaW5lKQoreworICBtbmdfdWludDMyICBpWDsKKyAgbW5nX3VpbnQxNnAgcFRlbXBzcmMxOworICBtbmdfdWludDE2cCBwVGVtcHNyYzI7CisgIG1uZ191aW50MTZwIHBUZW1wZHN0OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX01BR05JRllfR0ExNl9ZNSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBUZW1wc3JjMSA9IChtbmdfdWludDE2cClwU3JjbGluZTE7ICAvKiBpbml0aWFsaXplIHBpeGVsLWxvb3AgKi8KKyAgcFRlbXBzcmMyID0gKG1uZ191aW50MTZwKXBTcmNsaW5lMjsKKyAgcFRlbXBkc3QgID0gKG1uZ191aW50MTZwKXBEc3RsaW5lOworCisgIGlmIChwVGVtcHNyYzIpICAgICAgICAgICAgICAgICAgICAgICAvKiBkbyB3ZSBoYXZlIGEgc2Vjb25kIGxpbmUgPyAqLworICB7CisgICAgaWYgKGlTIDwgKGlNKzEpIC8gMikgICAgICAgICAgICAgICAvKiB0b3AgaGFsZiA/ICovCisgICAgeworICAgICAgZm9yIChpWCA9IDA7IGlYIDwgaVdpZHRoOyBpWCsrKQorICAgICAgeworICAgICAgICAqcFRlbXBkc3QgPSAqcFRlbXBzcmMxOyAgICAgICAgLyogcmVwbGljYXRlIGdyYXkgZnJvbSB0b3AgKi8KKworICAgICAgICBwVGVtcGRzdCsrOworICAgICAgICBwVGVtcHNyYzErKzsKKyAgICAgICAgcFRlbXBzcmMyKys7CisKKyAgICAgICAgaWYgKCpwVGVtcHNyYzEgPT0gKnBUZW1wc3JjMikgIC8qIGNhbGN1bGF0ZSB0aGUgZGlzdGFuY2VzICovCisgICAgICAgICAgKnBUZW1wZHN0ID0gKnBUZW1wc3JjMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIG1uZ19wdXRfdWludDE2ICgobW5nX3VpbnQ4cClwVGVtcGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ191aW50MTYpKCAoICgyICogaVMgKiAoIChtbmdfaW50MzIpKG1uZ19nZXRfdWludDE2ICgobW5nX3VpbnQ4cClwVGVtcHNyYzIpKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX2ludDMyKShtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApcFRlbXBzcmMxKSkgKSArIGlNKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaU0gKiAyKSkgKyAobW5nX2ludDMyKShtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApcFRlbXBzcmMxKSkgICAgICAgICApICk7CisKKyAgICAgICAgcFRlbXBkc3QrKzsKKyAgICAgICAgcFRlbXBzcmMxKys7CisgICAgICAgIHBUZW1wc3JjMisrOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgZm9yIChpWCA9IDA7IGlYIDwgaVdpZHRoOyBpWCsrKQorICAgICAgeworICAgICAgICAqcFRlbXBkc3QgPSAqcFRlbXBzcmMyOyAgICAgICAgLyogcmVwbGljYXRlIGdyYXkgZnJvbSBib3R0b20gKi8KKworICAgICAgICBwVGVtcGRzdCsrOworICAgICAgICBwVGVtcHNyYzErKzsKKyAgICAgICAgcFRlbXBzcmMyKys7CisKKyAgICAgICAgaWYgKCpwVGVtcHNyYzEgPT0gKnBUZW1wc3JjMikgIC8qIGNhbGN1bGF0ZSB0aGUgZGlzdGFuY2VzICovCisgICAgICAgICAgKnBUZW1wZHN0ID0gKnBUZW1wc3JjMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIG1uZ19wdXRfdWludDE2ICgobW5nX3VpbnQ4cClwVGVtcGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ191aW50MTYpKCAoICgyICogaVMgKiAoIChtbmdfaW50MzIpKG1uZ19nZXRfdWludDE2ICgobW5nX3VpbnQ4cClwVGVtcHNyYzIpKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX2ludDMyKShtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApcFRlbXBzcmMxKSkgKSArIGlNKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaU0gKiAyKSkgKyAobW5nX2ludDMyKShtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApcFRlbXBzcmMxKSkgICAgICAgICApICk7CisKKyAgICAgICAgcFRlbXBkc3QrKzsKKyAgICAgICAgcFRlbXBzcmMxKys7CisgICAgICAgIHBUZW1wc3JjMisrOworICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBqdXN0IHJlcGVhdCB0aGUgZW50aXJlIGxpbmUgKi8KKyAgICBNTkdfQ09QWSAocFRlbXBkc3QsIHBUZW1wc3JjMSwgKGlXaWR0aCA8PCAyKSk7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9NQUdOSUZZX0dBMTZfWTUsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmIC8qIE1OR19OT19HUkFZX1NVUFBPUlQgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX21hZ25pZnlfcmdiYTE2X3kxIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcFNyY2xpbmUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBEc3RsaW5lKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9NQUdOSUZZX1JHQkExNl9ZMSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19DT1BZIChwRHN0bGluZSwgcFNyY2xpbmUxLCAoaVdpZHRoIDw8IDMpKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9NQUdOSUZZX1JHQkExNl9ZMSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19tYWduaWZ5X3JnYmExNl95MiAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcFNyY2xpbmUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBTcmNsaW5lMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSkKK3sKKyAgbW5nX3VpbnQzMiAgaVg7CisgIG1uZ191aW50MTZwIHBUZW1wc3JjMTsKKyAgbW5nX3VpbnQxNnAgcFRlbXBzcmMyOworICBtbmdfdWludDE2cCBwVGVtcGRzdDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9NQUdOSUZZX1JHQkExNl9ZMiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBUZW1wc3JjMSA9IChtbmdfdWludDE2cClwU3JjbGluZTE7ICAvKiBpbml0aWFsaXplIHBpeGVsLWxvb3AgKi8KKyAgcFRlbXBzcmMyID0gKG1uZ191aW50MTZwKXBTcmNsaW5lMjsKKyAgcFRlbXBkc3QgID0gKG1uZ191aW50MTZwKXBEc3RsaW5lOworCisgIGlmIChwVGVtcHNyYzIpICAgICAgICAgICAgICAgICAgICAgICAvKiBkbyB3ZSBoYXZlIGEgc2Vjb25kIGxpbmUgPyAqLworICB7CisgICAgZm9yIChpWCA9IDA7IGlYIDwgaVdpZHRoOyBpWCsrKQorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2FsY3VsYXRlIHRoZSBkaXN0YW5jZXMgKi8KKyAgICAgIGlmICgqcFRlbXBzcmMxID09ICpwVGVtcHNyYzIpCisgICAgICAgICpwVGVtcGRzdCA9ICpwVGVtcHNyYzE7CisgICAgICBlbHNlCisgICAgICAgIG1uZ19wdXRfdWludDE2ICgobW5nX3VpbnQ4cClwVGVtcGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfdWludDE2KSggKCAoMiAqIGlTICogKCAobW5nX2ludDMyKShtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApcFRlbXBzcmMyKSkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfaW50MzIpKG1uZ19nZXRfdWludDE2ICgobW5nX3VpbnQ4cClwVGVtcHNyYzEpKSApICsgaU0pIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaU0gKiAyKSkgKyAobW5nX2ludDMyKShtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApcFRlbXBzcmMxKSkgICAgICAgICApICk7CisKKyAgICAgIHBUZW1wZHN0Kys7CisgICAgICBwVGVtcHNyYzErKzsKKyAgICAgIHBUZW1wc3JjMisrOworCisgICAgICBpZiAoKnBUZW1wc3JjMSA9PSAqcFRlbXBzcmMyKQorICAgICAgICAqcFRlbXBkc3QgPSAqcFRlbXBzcmMxOworICAgICAgZWxzZQorICAgICAgICBtbmdfcHV0X3VpbnQxNiAoKG1uZ191aW50OHApcFRlbXBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAobW5nX3VpbnQxNikoICggKDIgKiBpUyAqICggKG1uZ19pbnQzMikobW5nX2dldF91aW50MTYgKChtbmdfdWludDhwKXBUZW1wc3JjMikpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX2ludDMyKShtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApcFRlbXBzcmMxKSkgKSArIGlNKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlNICogMikpICsgKG1uZ19pbnQzMikobW5nX2dldF91aW50MTYgKChtbmdfdWludDhwKXBUZW1wc3JjMSkpICAgICAgICAgKSApOworCisgICAgICBwVGVtcGRzdCsrOworICAgICAgcFRlbXBzcmMxKys7CisgICAgICBwVGVtcHNyYzIrKzsKKworICAgICAgaWYgKCpwVGVtcHNyYzEgPT0gKnBUZW1wc3JjMikKKyAgICAgICAgKnBUZW1wZHN0ID0gKnBUZW1wc3JjMTsKKyAgICAgIGVsc2UKKyAgICAgICAgbW5nX3B1dF91aW50MTYgKChtbmdfdWludDhwKXBUZW1wZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ191aW50MTYpKCAoICgyICogaVMgKiAoIChtbmdfaW50MzIpKG1uZ19nZXRfdWludDE2ICgobW5nX3VpbnQ4cClwVGVtcHNyYzIpKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ19pbnQzMikobW5nX2dldF91aW50MTYgKChtbmdfdWludDhwKXBUZW1wc3JjMSkpICkgKyBpTSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpTSAqIDIpKSArIChtbmdfaW50MzIpKG1uZ19nZXRfdWludDE2ICgobW5nX3VpbnQ4cClwVGVtcHNyYzEpKSAgICAgICAgICkgKTsKKworICAgICAgcFRlbXBkc3QrKzsKKyAgICAgIHBUZW1wc3JjMSsrOworICAgICAgcFRlbXBzcmMyKys7CisKKyAgICAgIGlmICgqcFRlbXBzcmMxID09ICpwVGVtcHNyYzIpCisgICAgICAgICpwVGVtcGRzdCA9ICpwVGVtcHNyYzE7CisgICAgICBlbHNlCisgICAgICAgIG1uZ19wdXRfdWludDE2ICgobW5nX3VpbnQ4cClwVGVtcGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfdWludDE2KSggKCAoMiAqIGlTICogKCAobW5nX2ludDMyKShtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApcFRlbXBzcmMyKSkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfaW50MzIpKG1uZ19nZXRfdWludDE2ICgobW5nX3VpbnQ4cClwVGVtcHNyYzEpKSApICsgaU0pIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaU0gKiAyKSkgKyAobW5nX2ludDMyKShtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApcFRlbXBzcmMxKSkgICAgICAgICApICk7CisKKyAgICAgIHBUZW1wZHN0Kys7CisgICAgICBwVGVtcHNyYzErKzsKKyAgICAgIHBUZW1wc3JjMisrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBqdXN0IHJlcGVhdCB0aGUgZW50aXJlIGxpbmUgKi8KKyAgICBNTkdfQ09QWSAocFRlbXBkc3QsIHBUZW1wc3JjMSwgKGlXaWR0aCA8PCAzKSk7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9NQUdOSUZZX1JHQkExNl9ZMiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19tYWduaWZ5X3JnYmExNl95MyAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcFNyY2xpbmUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBTcmNsaW5lMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fTUFHTklGWV9SR0JBMTZfWTMsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAocFNyY2xpbmUyKSAgICAgICAgICAgICAgICAgICAgICAgLyogZG8gd2UgaGF2ZSBhIHNlY29uZCBsaW5lID8gKi8KKyAgeworICAgIGlmIChpUyA8IChpTSsxKSAvIDIpICAgICAgICAgICAgICAgLyogdG9wIGhhbGYgPyAqLworICAgICAgTU5HX0NPUFkgKHBEc3RsaW5lLCBwU3JjbGluZTEsIChpV2lkdGggPDwgMykpCisgICAgZWxzZQorICAgICAgTU5HX0NPUFkgKHBEc3RsaW5lLCBwU3JjbGluZTIsIChpV2lkdGggPDwgMykpOworICB9CisgIGVsc2UKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGp1c3QgcmVwZWF0IHRoZSBlbnRpcmUgbGluZSAqLworICAgIE1OR19DT1BZIChwRHN0bGluZSwgcFNyY2xpbmUxLCAoaVdpZHRoIDw8IDMpKTsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX01BR05JRllfUkdCQTE2X1kyLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX21hZ25pZnlfcmdiYTE2X3k0IChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcFNyY2xpbmUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBEc3RsaW5lKQoreworICBtbmdfdWludDMyICBpWDsKKyAgbW5nX3VpbnQxNnAgcFRlbXBzcmMxOworICBtbmdfdWludDE2cCBwVGVtcHNyYzI7CisgIG1uZ191aW50MTZwIHBUZW1wZHN0OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX01BR05JRllfUkdCQTE2X1k0LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcFRlbXBzcmMxID0gKG1uZ191aW50MTZwKXBTcmNsaW5lMTsgIC8qIGluaXRpYWxpemUgcGl4ZWwtbG9vcCAqLworICBwVGVtcHNyYzIgPSAobW5nX3VpbnQxNnApcFNyY2xpbmUyOworICBwVGVtcGRzdCAgPSAobW5nX3VpbnQxNnApcERzdGxpbmU7CisKKyAgaWYgKHBUZW1wc3JjMikgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvIHdlIGhhdmUgYSBzZWNvbmQgbGluZSA/ICovCisgIHsKKyAgICBpZiAoaVMgPCAoaU0rMSkgLyAyKSAgICAgICAgICAgICAgIC8qIHRvcCBoYWxmID8gKi8KKyAgICB7CisgICAgICBmb3IgKGlYID0gMDsgaVggPCBpV2lkdGg7IGlYKyspCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjYWxjdWxhdGUgdGhlIGRpc3RhbmNlcyAqLworICAgICAgICBpZiAoKnBUZW1wc3JjMSA9PSAqcFRlbXBzcmMyKQorICAgICAgICAgICpwVGVtcGRzdCA9ICpwVGVtcHNyYzE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBtbmdfcHV0X3VpbnQxNiAoKG1uZ191aW50OHApcFRlbXBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfdWludDE2KSggKCAoMiAqIGlTICogKCAobW5nX2ludDMyKShtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApcFRlbXBzcmMyKSkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ19pbnQzMikobW5nX2dldF91aW50MTYgKChtbmdfdWludDhwKXBUZW1wc3JjMSkpICkgKyBpTSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlNICogMikpICsgKG1uZ19pbnQzMikobW5nX2dldF91aW50MTYgKChtbmdfdWludDhwKXBUZW1wc3JjMSkpICAgICAgICAgKSApOworCisgICAgICAgIHBUZW1wZHN0Kys7CisgICAgICAgIHBUZW1wc3JjMSsrOworICAgICAgICBwVGVtcHNyYzIrKzsKKworICAgICAgICBpZiAoKnBUZW1wc3JjMSA9PSAqcFRlbXBzcmMyKQorICAgICAgICAgICpwVGVtcGRzdCA9ICpwVGVtcHNyYzE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBtbmdfcHV0X3VpbnQxNiAoKG1uZ191aW50OHApcFRlbXBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfdWludDE2KSggKCAoMiAqIGlTICogKCAobW5nX2ludDMyKShtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApcFRlbXBzcmMyKSkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ19pbnQzMikobW5nX2dldF91aW50MTYgKChtbmdfdWludDhwKXBUZW1wc3JjMSkpICkgKyBpTSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlNICogMikpICsgKG1uZ19pbnQzMikobW5nX2dldF91aW50MTYgKChtbmdfdWludDhwKXBUZW1wc3JjMSkpICAgICAgICAgKSApOworCisgICAgICAgIHBUZW1wZHN0Kys7CisgICAgICAgIHBUZW1wc3JjMSsrOworICAgICAgICBwVGVtcHNyYzIrKzsKKworICAgICAgICBpZiAoKnBUZW1wc3JjMSA9PSAqcFRlbXBzcmMyKQorICAgICAgICAgICpwVGVtcGRzdCA9ICpwVGVtcHNyYzE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBtbmdfcHV0X3VpbnQxNiAoKG1uZ191aW50OHApcFRlbXBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfdWludDE2KSggKCAoMiAqIGlTICogKCAobW5nX2ludDMyKShtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApcFRlbXBzcmMyKSkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ19pbnQzMikobW5nX2dldF91aW50MTYgKChtbmdfdWludDhwKXBUZW1wc3JjMSkpICkgKyBpTSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlNICogMikpICsgKG1uZ19pbnQzMikobW5nX2dldF91aW50MTYgKChtbmdfdWludDhwKXBUZW1wc3JjMSkpICAgICAgICAgKSApOworCisgICAgICAgIHBUZW1wZHN0Kys7CisgICAgICAgIHBUZW1wc3JjMSsrOworICAgICAgICBwVGVtcHNyYzIgKz0gMjsKKworICAgICAgICAqcFRlbXBkc3QrKyA9ICpwVGVtcHNyYzErKzsgICAgLyogcmVwbGljYXRlIGFscGhhIGZyb20gdG9wICovCisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBmb3IgKGlYID0gMDsgaVggPCBpV2lkdGg7IGlYKyspCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjYWxjdWxhdGUgdGhlIGRpc3RhbmNlcyAqLworICAgICAgICBpZiAoKnBUZW1wc3JjMSA9PSAqcFRlbXBzcmMyKQorICAgICAgICAgICpwVGVtcGRzdCA9ICpwVGVtcHNyYzE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBtbmdfcHV0X3VpbnQxNiAoKG1uZ191aW50OHApcFRlbXBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfdWludDE2KSggKCAoMiAqIGlTICogKCAobW5nX2ludDMyKShtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApcFRlbXBzcmMyKSkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ19pbnQzMikobW5nX2dldF91aW50MTYgKChtbmdfdWludDhwKXBUZW1wc3JjMSkpICkgKyBpTSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlNICogMikpICsgKG1uZ19pbnQzMikobW5nX2dldF91aW50MTYgKChtbmdfdWludDhwKXBUZW1wc3JjMSkpICAgICAgICAgKSApOworCisgICAgICAgIHBUZW1wZHN0Kys7CisgICAgICAgIHBUZW1wc3JjMSsrOworICAgICAgICBwVGVtcHNyYzIrKzsKKworICAgICAgICBpZiAoKnBUZW1wc3JjMSA9PSAqcFRlbXBzcmMyKQorICAgICAgICAgICpwVGVtcGRzdCA9ICpwVGVtcHNyYzE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBtbmdfcHV0X3VpbnQxNiAoKG1uZ191aW50OHApcFRlbXBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfdWludDE2KSggKCAoMiAqIGlTICogKCAobW5nX2ludDMyKShtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApcFRlbXBzcmMyKSkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ19pbnQzMikobW5nX2dldF91aW50MTYgKChtbmdfdWludDhwKXBUZW1wc3JjMSkpICkgKyBpTSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlNICogMikpICsgKG1uZ19pbnQzMikobW5nX2dldF91aW50MTYgKChtbmdfdWludDhwKXBUZW1wc3JjMSkpICAgICAgICAgKSApOworCisgICAgICAgIHBUZW1wZHN0Kys7CisgICAgICAgIHBUZW1wc3JjMSsrOworICAgICAgICBwVGVtcHNyYzIrKzsKKworICAgICAgICBpZiAoKnBUZW1wc3JjMSA9PSAqcFRlbXBzcmMyKQorICAgICAgICAgICpwVGVtcGRzdCA9ICpwVGVtcHNyYzE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBtbmdfcHV0X3VpbnQxNiAoKG1uZ191aW50OHApcFRlbXBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfdWludDE2KSggKCAoMiAqIGlTICogKCAobW5nX2ludDMyKShtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApcFRlbXBzcmMyKSkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ19pbnQzMikobW5nX2dldF91aW50MTYgKChtbmdfdWludDhwKXBUZW1wc3JjMSkpICkgKyBpTSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlNICogMikpICsgKG1uZ19pbnQzMikobW5nX2dldF91aW50MTYgKChtbmdfdWludDhwKXBUZW1wc3JjMSkpICAgICAgICAgKSApOworCisgICAgICAgIHBUZW1wZHN0Kys7CisgICAgICAgIHBUZW1wc3JjMSArPSAyOworICAgICAgICBwVGVtcHNyYzIrKzsKKworICAgICAgICAqcFRlbXBkc3QrKyA9ICpwVGVtcHNyYzIrKzsgICAgLyogcmVwbGljYXRlIGFscGhhIGZyb20gYm90dG9tICovCisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGp1c3QgcmVwZWF0IHRoZSBlbnRpcmUgbGluZSAqLworICAgIE1OR19DT1BZIChwVGVtcGRzdCwgcFRlbXBzcmMxLCAoaVdpZHRoIDw8IDMpKTsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX01BR05JRllfUkdCQTE2X1k0LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX21hZ25pZnlfcmdiYTE2X3k1IChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcFNyY2xpbmUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBEc3RsaW5lKQoreworICBtbmdfdWludDMyICBpWDsKKyAgbW5nX3VpbnQxNnAgcFRlbXBzcmMxOworICBtbmdfdWludDE2cCBwVGVtcHNyYzI7CisgIG1uZ191aW50MTZwIHBUZW1wZHN0OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX01BR05JRllfUkdCQTE2X1k1LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcFRlbXBzcmMxID0gKG1uZ191aW50MTZwKXBTcmNsaW5lMTsgIC8qIGluaXRpYWxpemUgcGl4ZWwtbG9vcCAqLworICBwVGVtcHNyYzIgPSAobW5nX3VpbnQxNnApcFNyY2xpbmUyOworICBwVGVtcGRzdCAgPSAobW5nX3VpbnQxNnApcERzdGxpbmU7CisKKyAgaWYgKHBUZW1wc3JjMikgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvIHdlIGhhdmUgYSBzZWNvbmQgbGluZSA/ICovCisgIHsKKyAgICBpZiAoaVMgPCAoaU0rMSkgLyAyKSAgICAgICAgICAgICAgIC8qIHRvcCBoYWxmID8gKi8KKyAgICB7CisgICAgICBmb3IgKGlYID0gMDsgaVggPCBpV2lkdGg7IGlYKyspCisgICAgICB7CisgICAgICAgICpwVGVtcGRzdCsrID0gKnBUZW1wc3JjMSsrOyAgICAvKiByZXBsaWNhdGUgY29sb3IgZnJvbSB0b3AgKi8KKyAgICAgICAgKnBUZW1wZHN0KysgPSAqcFRlbXBzcmMxKys7CisgICAgICAgICpwVGVtcGRzdCsrID0gKnBUZW1wc3JjMSsrOworCisgICAgICAgIHBUZW1wc3JjMiArPSAzOworCisgICAgICAgIGlmICgqcFRlbXBzcmMxID09ICpwVGVtcHNyYzIpICAvKiBjYWxjdWxhdGUgdGhlIGRpc3RhbmNlcyAqLworICAgICAgICAgICpwVGVtcGRzdCA9ICpwVGVtcHNyYzE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBtbmdfcHV0X3VpbnQxNiAoKG1uZ191aW50OHApcFRlbXBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChtbmdfdWludDE2KSggKCAoMiAqIGlTICogKCAobW5nX2ludDMyKShtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApcFRlbXBzcmMyKSkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ19pbnQzMikobW5nX2dldF91aW50MTYgKChtbmdfdWludDhwKXBUZW1wc3JjMSkpICkgKyBpTSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlNICogMikpICsgKG1uZ19pbnQzMikobW5nX2dldF91aW50MTYgKChtbmdfdWludDhwKXBUZW1wc3JjMSkpICAgICAgICAgKSApOworCisgICAgICAgIHBUZW1wZHN0Kys7CisgICAgICAgIHBUZW1wc3JjMSsrOworICAgICAgICBwVGVtcHNyYzIrKzsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGZvciAoaVggPSAwOyBpWCA8IGlXaWR0aDsgaVgrKykKKyAgICAgIHsKKyAgICAgICAgKnBUZW1wZHN0KysgPSAqcFRlbXBzcmMyKys7ICAgIC8qIHJlcGxpY2F0ZSBjb2xvciBmcm9tIGJvdHRvbSAqLworICAgICAgICAqcFRlbXBkc3QrKyA9ICpwVGVtcHNyYzIrKzsKKyAgICAgICAgKnBUZW1wZHN0KysgPSAqcFRlbXBzcmMyKys7CisKKyAgICAgICAgcFRlbXBzcmMxICs9IDM7CisKKyAgICAgICAgaWYgKCpwVGVtcHNyYzEgPT0gKnBUZW1wc3JjMikgIC8qIGNhbGN1bGF0ZSB0aGUgZGlzdGFuY2VzICovCisgICAgICAgICAgKnBUZW1wZHN0ID0gKnBUZW1wc3JjMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIG1uZ19wdXRfdWludDE2ICgobW5nX3VpbnQ4cClwVGVtcGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKG1uZ191aW50MTYpKCAoICgyICogaVMgKiAoIChtbmdfaW50MzIpKG1uZ19nZXRfdWludDE2ICgobW5nX3VpbnQ4cClwVGVtcHNyYzIpKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW5nX2ludDMyKShtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApcFRlbXBzcmMxKSkgKSArIGlNKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaU0gKiAyKSkgKyAobW5nX2ludDMyKShtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApcFRlbXBzcmMxKSkgICAgICAgICApICk7CisKKyAgICAgICAgcFRlbXBkc3QrKzsKKyAgICAgICAgcFRlbXBzcmMxKys7CisgICAgICAgIHBUZW1wc3JjMisrOworICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBqdXN0IHJlcGVhdCB0aGUgZW50aXJlIGxpbmUgKi8KKyAgICBNTkdfQ09QWSAocFRlbXBkc3QsIHBUZW1wc3JjMSwgKGlXaWR0aCA8PCAzKSk7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9NQUdOSUZZX1JHQkExNl9ZNSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYgLyogTU5HX05PXzE2QklUX1NVUFBPUlQgKi8KKyNlbmRpZiAvKiBNTkdfT1BUSU1JWkVfRk9PVFBSSU5UX01BR04gKi8KKyNlbmRpZiAvKiBNTkdfU0tJUENIVU5LX01BR04gKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIFBBU1QgY29tcG9zaXRpb24gcm91dGluZXMgLSBjb21wb3NlIG92ZXIvdW5kZXIgd2l0aCBhIHRhcmdldCBvYmplY3QgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19QQVNUCittbmdfcmV0Y29kZSBtbmdfY29tcG9zZW92ZXJfcmdiYTggKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX2ltYWdlZGF0YXAgcEJ1ZiA9ICgobW5nX2ltYWdlcClwRGF0YS0+cFN0b3Jlb2JqKS0+cEltZ2J1ZjsKKyAgbW5nX3VpbnQ4cCAgICAgcFdvcmtyb3c7CisgIG1uZ191aW50OHAgICAgIHBPdXRyb3c7CisgIG1uZ19pbnQzMiAgICAgIGlYOworICBtbmdfdWludDggICAgICBpRkdhOCwgaUJHYTg7CisgIG1uZ191aW50OCAgICAgIGlDcjgsIGlDZzgsIGlDYjgsIGlDYTg7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQ09NUE9TRU9WRVJfUkdCQTgsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBwV29ya3JvdyA9IHBEYXRhLT5wUkdCQXJvdzsKKyAgcE91dHJvdyAgPSBwQnVmLT5wSW1nZGF0YSArIChwRGF0YS0+aVJvdyAqIHBCdWYtPmlSb3dzaXplICAgKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocERhdGEtPmlDb2wgKiBwQnVmLT5pU2FtcGxlc2l6ZSk7CisKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICB7CisgICAgaUZHYTggPSAqKHBXb3Jrcm93KzMpOyAgICAgICAvKiBnZXQgYWxwaGEgdmFsdWVzICovCisgICAgaUJHYTggPSAqKHBPdXRyb3crMyk7CisKKyAgICBpZiAoaUZHYTgpICAgICAgICAgICAgICAgICAgIC8qIGFueSBvcGFjaXR5IGF0IGFsbCA/ICovCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmdWxseSBvcGFxdWUgb3IgYmFja2dyb3VuZCBmdWxseSB0cmFuc3BhcmVudCA/ICovCisgICAgICBpZiAoKGlGR2E4ID09IDB4RkYpIHx8IChpQkdhOCA9PSAwKSkKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZW4gc2ltcGx5IGNvcHkgdGhlIHZhbHVlcyAqLworICAgICAgICAqcE91dHJvdyAgICAgPSAqcFdvcmtyb3c7CisgICAgICAgICoocE91dHJvdysxKSA9ICoocFdvcmtyb3crMSk7CisgICAgICAgICoocE91dHJvdysyKSA9ICoocFdvcmtyb3crMik7CisgICAgICAgICoocE91dHJvdyszKSA9IGlGR2E4OworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBpZiAoaUJHYTggPT0gMHhGRikgICAgICAgLyogYmFja2dyb3VuZCBmdWxseSBvcGFxdWUgPyAqLworICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogZG8gYWxwaGEgY29tcG9zaW5nICovCisjaWZkZWYgTU5HX09QVElNSVpFX0ZPT1RQUklOVF9DT01QT1NFCisgICAgICAgICAgaW50IGk7CisgICAgICAgICAgZm9yIChpPTI7IGkgPj0gMDsgaS0tKQorICAgICAgICAgIHsKKyAgICAgICAgICBNTkdfQ09NUE9TRTggKCoocE91dHJvdytpKSwgKihwV29ya3JvdytpKSwgaUZHYTgsICoocE91dHJvdytpKSk7CisgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICBNTkdfQ09NUE9TRTggKCpwT3V0cm93LCAgICAgKnBXb3Jrcm93LCAgICAgaUZHYTgsICpwT3V0cm93ICAgICk7CisgICAgICAgICAgTU5HX0NPTVBPU0U4ICgqKHBPdXRyb3crMSksICoocFdvcmtyb3crMSksIGlGR2E4LCAqKHBPdXRyb3crMSkpOworICAgICAgICAgIE1OR19DT01QT1NFOCAoKihwT3V0cm93KzIpLCAqKHBXb3Jrcm93KzIpLCBpRkdhOCwgKihwT3V0cm93KzIpKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWxwaGEgcmVtYWlucyBmdWxseSBvcGFxdWUgISEhICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogaGVyZSB3ZSdsbCBoYXZlIHRvIGJsZW5kICovCisgICAgICAgICAgTU5HX0JMRU5EOCAoKnBXb3Jrcm93LCAqKHBXb3Jrcm93KzEpLCAqKHBXb3Jrcm93KzIpLCBpRkdhOCwKKyAgICAgICAgICAgICAgICAgICAgICAqcE91dHJvdywgKihwT3V0cm93KzEpLCAqKHBPdXRyb3crMiksIGlCR2E4LAorICAgICAgICAgICAgICAgICAgICAgIGlDcjgsIGlDZzgsIGlDYjgsIGlDYTgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHJldHVybiB0aGUgY29tcG9zZWQgdmFsdWVzICovCisgICAgICAgICAgKnBPdXRyb3cgICAgID0gaUNyODsKKyAgICAgICAgICAqKHBPdXRyb3crMSkgPSBpQ2c4OworICAgICAgICAgICoocE91dHJvdysyKSA9IGlDYjg7CisgICAgICAgICAgKihwT3V0cm93KzMpID0gaUNhODsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHBPdXRyb3cgICs9IDQ7CisgICAgcFdvcmtyb3cgKz0gNDsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0NPTVBPU0VPVkVSX1JHQkE4LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorbW5nX3JldGNvZGUgbW5nX2NvbXBvc2VvdmVyX3JnYmExNiAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfaW1hZ2VkYXRhcCBwQnVmID0gKChtbmdfaW1hZ2VwKXBEYXRhLT5wU3RvcmVvYmopLT5wSW1nYnVmOworICBtbmdfdWludDE2cCAgICBwV29ya3JvdzsKKyAgbW5nX3VpbnQxNnAgICAgcE91dHJvdzsKKyAgbW5nX2ludDMyICAgICAgaVg7CisgIG1uZ191aW50MTYgICAgIGlGR2ExNiwgaUZHcjE2LCBpRkdnMTYsIGlGR2IxNjsKKyAgbW5nX3VpbnQxNiAgICAgaUJHYTE2LCBpQkdyMTYsIGlCR2cxNiwgaUJHYjE2OworICBtbmdfdWludDE2ICAgICBpQ3IxNiwgaUNnMTYsIGlDYjE2LCBpQ2ExNjsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9DT01QT1NFT1ZFUl9SR0JBMTYsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBwV29ya3JvdyA9IChtbmdfdWludDE2cClwRGF0YS0+cFJHQkFyb3c7CisgIHBPdXRyb3cgID0gKG1uZ191aW50MTZwKShwQnVmLT5wSW1nZGF0YSArIChwRGF0YS0+aVJvdyAqIHBCdWYtPmlSb3dzaXplICAgKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwRGF0YS0+aUNvbCAqIHBCdWYtPmlTYW1wbGVzaXplKSk7CisKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0IGFscGhhIHZhbHVlcyAqLworICAgIGlGR2ExNiA9IG1uZ19nZXRfdWludDE2ICgobW5nX3VpbnQ4cCkocFdvcmtyb3crMykpOworICAgIGlCR2ExNiA9IG1uZ19nZXRfdWludDE2ICgobW5nX3VpbnQ4cCkocE91dHJvdyszKSk7CisKKyAgICBpZiAoaUZHYTE2KSAgICAgICAgICAgICAgICAgIC8qIGFueSBvcGFjaXR5IGF0IGFsbCA/ICovCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmdWxseSBvcGFxdWUgb3IgYmFja2dyb3VuZCBmdWxseSB0cmFuc3BhcmVudCA/ICovCisgICAgICBpZiAoKGlGR2ExNiA9PSAweEZGRkYpIHx8IChpQkdhMTYgPT0gMCkpCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGVuIHNpbXBseSBjb3B5IHRoZSB2YWx1ZXMgKi8KKyAgICAgICAgKnBPdXRyb3cgICAgID0gKnBXb3Jrcm93OworICAgICAgICAqKHBPdXRyb3crMSkgPSAqKHBXb3Jrcm93KzEpOworICAgICAgICAqKHBPdXRyb3crMikgPSAqKHBXb3Jrcm93KzIpOworICAgICAgICAqKHBPdXRyb3crMykgPSAqKHBXb3Jrcm93KzMpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0IGNvbG9yIHZhbHVlcyAqLworICAgICAgICBpRkdyMTYgPSBtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApcFdvcmtyb3cpOworICAgICAgICBpRkdnMTYgPSBtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApKHBXb3Jrcm93KzEpKTsKKyAgICAgICAgaUZHYjE2ID0gbW5nX2dldF91aW50MTYgKChtbmdfdWludDhwKShwV29ya3JvdysyKSk7CisgICAgICAgIGlCR3IxNiA9IG1uZ19nZXRfdWludDE2ICgobW5nX3VpbnQ4cClwT3V0cm93KTsKKyAgICAgICAgaUJHZzE2ID0gbW5nX2dldF91aW50MTYgKChtbmdfdWludDhwKShwT3V0cm93KzEpKTsKKyAgICAgICAgaUJHYjE2ID0gbW5nX2dldF91aW50MTYgKChtbmdfdWludDhwKShwT3V0cm93KzIpKTsKKworICAgICAgICBpZiAoaUJHYTE2ID09IDB4RkZGRikgICAgLyogYmFja2dyb3VuZCBmdWxseSBvcGFxdWUgPyAqLworICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogZG8gYWxwaGEgY29tcG9zaW5nICovCisgICAgICAgICAgTU5HX0NPTVBPU0UxNiAoaUZHcjE2LCBpRkdyMTYsIGlGR2ExNiwgaUJHcjE2KTsKKyAgICAgICAgICBNTkdfQ09NUE9TRTE2IChpRkdnMTYsIGlGR2cxNiwgaUZHYTE2LCBpQkdnMTYpOworICAgICAgICAgIE1OR19DT01QT1NFMTYgKGlGR2IxNiwgaUZHYjE2LCBpRkdhMTYsIGlCR2IxNik7CisKKyAgICAgICAgICBtbmdfcHV0X3VpbnQxNiAoKG1uZ191aW50OHApcE91dHJvdywgICAgIGlGR3IxNik7CisgICAgICAgICAgbW5nX3B1dF91aW50MTYgKChtbmdfdWludDhwKShwT3V0cm93KzEpLCBpRkdnMTYpOworICAgICAgICAgIG1uZ19wdXRfdWludDE2ICgobW5nX3VpbnQ4cCkocE91dHJvdysyKSwgaUZHYjE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFscGhhIHJlbWFpbnMgZnVsbHkgb3BhcXVlICEhISAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhlcmUgd2UnbGwgaGF2ZSB0byBibGVuZCAqLworICAgICAgICAgIE1OR19CTEVORDE2IChpRkdyMTYsIGlGR2cxNiwgaUZHYjE2LCBpRkdhMTYsCisgICAgICAgICAgICAgICAgICAgICAgIGlCR3IxNiwgaUJHZzE2LCBpQkdiMTYsIGlCR2ExNiwKKyAgICAgICAgICAgICAgICAgICAgICAgaUNyMTYsICBpQ2cxNiwgIGlDYjE2LCAgaUNhMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHJldHVybiB0aGUgY29tcG9zZWQgdmFsdWVzICovCisgICAgICAgICAgbW5nX3B1dF91aW50MTYgKChtbmdfdWludDhwKXBPdXRyb3csICAgICBpQ3IxNik7CisgICAgICAgICAgbW5nX3B1dF91aW50MTYgKChtbmdfdWludDhwKShwT3V0cm93KzEpLCBpQ2cxNik7CisgICAgICAgICAgbW5nX3B1dF91aW50MTYgKChtbmdfdWludDhwKShwT3V0cm93KzIpLCBpQ2IxNik7CisgICAgICAgICAgbW5nX3B1dF91aW50MTYgKChtbmdfdWludDhwKShwT3V0cm93KzMpLCBpQ2ExNik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBwT3V0cm93ICArPSA0OworICAgIHBXb3Jrcm93ICs9IDQ7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9DT01QT1NFT1ZFUl9SR0JBMTYsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19jb21wb3NldW5kZXJfcmdiYTggKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX2ltYWdlZGF0YXAgcEJ1ZiA9ICgobW5nX2ltYWdlcClwRGF0YS0+cFN0b3Jlb2JqKS0+cEltZ2J1ZjsKKyAgbW5nX3VpbnQ4cCAgICAgcFdvcmtyb3c7CisgIG1uZ191aW50OHAgICAgIHBPdXRyb3c7CisgIG1uZ19pbnQzMiAgICAgIGlYOworICBtbmdfdWludDggICAgICBpRkdhOCwgaUJHYTg7CisgIG1uZ191aW50OCAgICAgIGlDcjgsIGlDZzgsIGlDYjgsIGlDYTg7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fQ09NUE9TRVVOREVSX1JHQkE4LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcFdvcmtyb3cgPSBwRGF0YS0+cFJHQkFyb3c7CisgIHBPdXRyb3cgID0gcEJ1Zi0+cEltZ2RhdGEgKyAocERhdGEtPmlSb3cgKiBwQnVmLT5pUm93c2l6ZSAgICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBEYXRhLT5pQ29sICogcEJ1Zi0+aVNhbXBsZXNpemUpOworCisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgeworICAgIGlGR2E4ID0gKihwT3V0cm93KzMpOyAgICAgICAgLyogZ2V0IGFscGhhIHZhbHVlcyAqLworICAgIGlCR2E4ID0gKihwV29ya3JvdyszKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFueXRoaW5nIHRvIGRvIGF0IGFsbCA/ICovCisgICAgaWYgKChpQkdhOCkgJiYgKGlGR2E4ICE9IDB4RkYpKQorICAgIHsKKyAgICAgIGlmIChpQkdhOCA9PSAweEZGKSAgICAgICAgIC8qIGJhY2tncm91bmQgZnVsbHkgb3BhcXVlID8gKi8KKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvIGFscGhhIGNvbXBvc2luZyAqLworI2lmZGVmIE1OR19PUFRJTUlaRV9GT09UUFJJTlRfQ09NUE9TRQorICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yIChpPTI7IGkgPj0gMDsgaS0tKQorICAgICAgICB7CisgICAgICAgIE1OR19DT01QT1NFOCAoKihwT3V0cm93K2kpLCAqKHBPdXRyb3craSksIGlGR2E4LCAqKHBXb3Jrcm93K2kpKTsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgTU5HX0NPTVBPU0U4ICgqcE91dHJvdywgICAgICpwT3V0cm93LCAgICAgaUZHYTgsICpwV29ya3JvdyAgICApOworICAgICAgICBNTkdfQ09NUE9TRTggKCoocE91dHJvdysxKSwgKihwT3V0cm93KzEpLCBpRkdhOCwgKihwV29ya3JvdysxKSk7CisgICAgICAgIE1OR19DT01QT1NFOCAoKihwT3V0cm93KzIpLCAqKHBPdXRyb3crMiksIGlGR2E4LCAqKHBXb3Jrcm93KzIpKTsKKyNlbmRpZgorICAgICAgICAqKHBPdXRyb3crMykgPSAweEZGOyAgICAgLyogYWxwaGEgYmVjb21lcyBmdWxseSBvcGFxdWUgISEhICovCisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBoZXJlIHdlJ2xsIGhhdmUgdG8gYmxlbmQgKi8KKyAgICAgICAgTU5HX0JMRU5EOCAoKnBPdXRyb3csICoocE91dHJvdysxKSwgKihwT3V0cm93KzIpLCBpRkdhOCwKKyAgICAgICAgICAgICAgICAgICAgKnBXb3Jrcm93LCAqKHBXb3Jrcm93KzEpLCAqKHBXb3Jrcm93KzIpLCBpQkdhOCwKKyAgICAgICAgICAgICAgICAgICAgaUNyOCwgaUNnOCwgaUNiOCwgaUNhOCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgcmV0dXJuIHRoZSBjb21wb3NlZCB2YWx1ZXMgKi8KKyAgICAgICAgKnBPdXRyb3cgICAgID0gaUNyODsKKyAgICAgICAgKihwT3V0cm93KzEpID0gaUNnODsKKyAgICAgICAgKihwT3V0cm93KzIpID0gaUNiODsKKyAgICAgICAgKihwT3V0cm93KzMpID0gaUNhODsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwT3V0cm93ICArPSA0OworICAgIHBXb3Jrcm93ICs9IDQ7CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9DT01QT1NFVU5ERVJfUkdCQTgsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCittbmdfcmV0Y29kZSBtbmdfY29tcG9zZXVuZGVyX3JnYmExNiAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfaW1hZ2VkYXRhcCBwQnVmID0gKChtbmdfaW1hZ2VwKXBEYXRhLT5wU3RvcmVvYmopLT5wSW1nYnVmOworICBtbmdfdWludDE2cCAgICBwV29ya3JvdzsKKyAgbW5nX3VpbnQxNnAgICAgcE91dHJvdzsKKyAgbW5nX2ludDMyICAgICAgaVg7CisgIG1uZ191aW50MTYgICAgIGlGR2ExNiwgaUZHcjE2LCBpRkdnMTYsIGlGR2IxNjsKKyAgbW5nX3VpbnQxNiAgICAgaUJHYTE2LCBpQkdyMTYsIGlCR2cxNiwgaUJHYjE2OworICBtbmdfdWludDE2ICAgICBpQ3IxNiwgaUNnMTYsIGlDYjE2LCBpQ2ExNjsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9DT01QT1NFVU5ERVJfUkdCQTE2LCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcFdvcmtyb3cgPSAobW5nX3VpbnQxNnApcERhdGEtPnBSR0JBcm93OworICBwT3V0cm93ICA9IChtbmdfdWludDE2cCkocEJ1Zi0+cEltZ2RhdGEgKyAocERhdGEtPmlSb3cgKiBwQnVmLT5pUm93c2l6ZSAgICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocERhdGEtPmlDb2wgKiBwQnVmLT5pU2FtcGxlc2l6ZSkpOworCisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCBhbHBoYSB2YWx1ZXMgKi8KKyAgICBpRkdhMTYgPSBtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApKHBPdXRyb3crMykpOworICAgIGlCR2ExNiA9IG1uZ19nZXRfdWludDE2ICgobW5nX3VpbnQ4cCkocFdvcmtyb3crMykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW55dGhpbmcgdG8gZG8gYXQgYWxsID8gKi8KKyAgICBpZiAoKGlCR2ExNikgJiYgKGlGR2ExNiAhPSAweEZGRkYpKQorICAgIHsKKyAgICAgIGlGR3IxNiA9IG1uZ19nZXRfdWludDE2ICgobW5nX3VpbnQ4cClwT3V0cm93KTsKKyAgICAgIGlGR2cxNiA9IG1uZ19nZXRfdWludDE2ICgobW5nX3VpbnQ4cCkocE91dHJvdysxKSk7CisgICAgICBpRkdiMTYgPSBtbmdfZ2V0X3VpbnQxNiAoKG1uZ191aW50OHApKHBPdXRyb3crMikpOworICAgICAgaUJHcjE2ID0gbW5nX2dldF91aW50MTYgKChtbmdfdWludDhwKXBXb3Jrcm93KTsKKyAgICAgIGlCR2cxNiA9IG1uZ19nZXRfdWludDE2ICgobW5nX3VpbnQ4cCkocFdvcmtyb3crMSkpOworICAgICAgaUJHYjE2ID0gbW5nX2dldF91aW50MTYgKChtbmdfdWludDhwKShwV29ya3JvdysyKSk7CisKKyAgICAgIGlmIChpQkdhMTYgPT0gMHhGRkZGKSAgICAgIC8qIGJhY2tncm91bmQgZnVsbHkgb3BhcXVlID8gKi8KKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvIGFscGhhIGNvbXBvc2luZyAqLworICAgICAgICBNTkdfQ09NUE9TRTE2IChpRkdyMTYsIGlGR3IxNiwgaUZHYTE2LCBpQkdyMTYpOworICAgICAgICBNTkdfQ09NUE9TRTE2IChpRkdnMTYsIGlGR2cxNiwgaUZHYTE2LCBpQkdnMTYpOworICAgICAgICBNTkdfQ09NUE9TRTE2IChpRkdiMTYsIGlGR2IxNiwgaUZHYTE2LCBpQkdiMTYpOworCisgICAgICAgIG1uZ19wdXRfdWludDE2ICgobW5nX3VpbnQ4cClwT3V0cm93LCAgICAgaUZHcjE2KTsKKyAgICAgICAgbW5nX3B1dF91aW50MTYgKChtbmdfdWludDhwKShwT3V0cm93KzEpLCBpRkdnMTYpOworICAgICAgICBtbmdfcHV0X3VpbnQxNiAoKG1uZ191aW50OHApKHBPdXRyb3crMiksIGlGR2IxNik7CisgICAgICAgICoocE91dHJvdyszKSA9IDB4RkZGRjsgICAvKiBhbHBoYSBiZWNvbWVzIGZ1bGx5IG9wYXF1ZSAhISEgKi8KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhlcmUgd2UnbGwgaGF2ZSB0byBibGVuZCAqLworICAgICAgICBNTkdfQkxFTkQxNiAoaUZHcjE2LCBpRkdnMTYsIGlGR2IxNiwgaUZHYTE2LAorICAgICAgICAgICAgICAgICAgICAgaUJHcjE2LCBpQkdnMTYsIGlCR2IxNiwgaUJHYTE2LAorICAgICAgICAgICAgICAgICAgICAgaUNyMTYsICBpQ2cxNiwgIGlDYjE2LCAgaUNhMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHJldHVybiB0aGUgY29tcG9zZWQgdmFsdWVzICovCisgICAgICAgIG1uZ19wdXRfdWludDE2ICgobW5nX3VpbnQ4cClwT3V0cm93LCAgICAgaUNyMTYpOworICAgICAgICBtbmdfcHV0X3VpbnQxNiAoKG1uZ191aW50OHApKHBPdXRyb3crMSksIGlDZzE2KTsKKyAgICAgICAgbW5nX3B1dF91aW50MTYgKChtbmdfdWludDhwKShwT3V0cm93KzIpLCBpQ2IxNik7CisgICAgICAgIG1uZ19wdXRfdWludDE2ICgobW5nX3VpbnQ4cCkocE91dHJvdyszKSwgaUNhMTYpOworICAgICAgfQorICAgIH0KKworICAgIHBPdXRyb3cgICs9IDQ7CisgICAgcFdvcmtyb3cgKz0gNDsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0NPTVBPU0VVTkRFUl9SR0JBMTYsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIFBBU1QgZmxpcCAmIHRpbGUgcm91dGluZXMgLSBmbGlwIG9yIHRpbGUgYSByb3cgb2YgcGl4ZWxzICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19QQVNUCittbmdfcmV0Y29kZSBtbmdfZmxpcF9yZ2JhOCAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfdWludDMycCBwV29ya3JvdzsKKyAgbW5nX3VpbnQzMnAgcE91dHJvdzsKKyAgbW5nX2ludDMyICAgaVg7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRkxJUF9SR0JBOCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2V0dXAgdGVtcCBwb2ludGVycyAqLworICBwV29ya3JvdyAgICAgICAgPSAobW5nX3VpbnQzMnApcERhdGEtPnBSR0JBcm93ICsgcERhdGEtPmlSb3dzYW1wbGVzIC0gMTsKKyAgcE91dHJvdyAgICAgICAgID0gKG1uZ191aW50MzJwKXBEYXRhLT5wV29ya3JvdzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN3YXAgb3JpZ2luYWwgYnVmZmVycyAqLworICBwRGF0YS0+cFdvcmtyb3cgPSBwRGF0YS0+cFJHQkFyb3c7CisgIHBEYXRhLT5wUkdCQXJvdyA9IChtbmdfdWludDhwKXBPdXRyb3c7CisKKyNpZmRlZiBNTkdfREVDUkVNRU5UX0xPT1BTCisgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYID4gMDsgaVgtLSkKKyNlbHNlCisgIGZvciAoaVggPSAwOyBpWCA8IHBEYXRhLT5pUm93c2FtcGxlczsgaVgrKykKKyNlbmRpZgorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGV0J3MgZmxpcCAqLworICAgICpwT3V0cm93ID0gKnBXb3Jrcm93OworICAgIHBPdXRyb3crKzsKKyAgICBwV29ya3Jvdy0tOworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRkxJUF9SR0JBOCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKK21uZ19yZXRjb2RlIG1uZ19mbGlwX3JnYmExNiAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfdWludDMycCBwV29ya3JvdzsKKyAgbW5nX3VpbnQzMnAgcE91dHJvdzsKKyAgbW5nX2ludDMyICAgaVg7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fRkxJUF9SR0JBMTYsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNldHVwIHRlbXAgcG9pbnRlcnMgKi8KKyAgcFdvcmtyb3cgICAgICAgID0gKG1uZ191aW50MzJwKXBEYXRhLT5wUkdCQXJvdyArICgocERhdGEtPmlSb3dzYW1wbGVzIC0gMSkgPDwgMSk7CisgIHBPdXRyb3cgICAgICAgICA9IChtbmdfdWludDMycClwRGF0YS0+cFdvcmtyb3c7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzd2FwIG9yaWdpbmFsIGJ1ZmZlcnMgKi8KKyAgcERhdGEtPnBXb3Jrcm93ID0gcERhdGEtPnBSR0JBcm93OworICBwRGF0YS0+cFJHQkFyb3cgPSAobW5nX3VpbnQ4cClwT3V0cm93OworCisjaWZkZWYgTU5HX0RFQ1JFTUVOVF9MT09QUworICBmb3IgKGlYID0gcERhdGEtPmlSb3dzYW1wbGVzOyBpWCA+IDA7IGlYLS0pCisjZWxzZQorICBmb3IgKGlYID0gMDsgaVggPCBwRGF0YS0+aVJvd3NhbXBsZXM7IGlYKyspCisjZW5kaWYKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxldCdzIGZsaXAgKi8KKyAgICAqcE91dHJvdyAgICAgICA9ICpwV29ya3JvdzsKKyAgICAqKHBPdXRyb3cgKyAxKSA9ICoocFdvcmtyb3cgKyAxKTsKKworICAgIHBPdXRyb3cgICs9IDI7CisgICAgcFdvcmtyb3cgLT0gMjsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0ZMSVBfUkdCQTE2LCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfdGlsZV9yZ2JhOCAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfdWludDMycCBwV29ya3JvdzsKKyAgbW5nX3VpbnQzMnAgcE91dHJvdzsKKyAgbW5nX2ludDMyICAgaVg7CisgIG1uZ191aW50MzIgIGlaLCBpTWF4OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1RJTEVfUkdCQTgsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpWiAgICAgICAgICAgICAgPSBwRGF0YS0+aVNvdXJjZWw7ICAgLyogaW5kZW50ID8gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdoYXQncyBvdXIgc291cmNlLWxlbmd0aCAqLworICBpTWF4ICAgICAgICAgICAgPSAoKG1uZ19pbWFnZXApcERhdGEtPnBSZXRyaWV2ZW9iaiktPnBJbWdidWYtPmlXaWR0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNldHVwIHRlbXAgcG9pbnRlcnMgKi8KKyAgcFdvcmtyb3cgICAgICAgID0gKG1uZ191aW50MzJwKXBEYXRhLT5wUkdCQXJvdyArIGlaOworICBwT3V0cm93ICAgICAgICAgPSAobW5nX3VpbnQzMnApcERhdGEtPnBXb3Jrcm93OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3dhcCBvcmlnaW5hbCBidWZmZXJzICovCisgIHBEYXRhLT5wV29ya3JvdyA9IHBEYXRhLT5wUkdCQXJvdzsKKyAgcERhdGEtPnBSR0JBcm93ID0gKG1uZ191aW50OHApcE91dHJvdzsKKworICBmb3IgKGlYID0gcERhdGEtPmlEZXN0bDsgaVggPCBwRGF0YS0+aURlc3RyOyBpWCsrKQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGlpaWlsZSAqLworICAgICpwT3V0cm93ID0gKnBXb3Jrcm93OworCisgICAgcFdvcmtyb3crKzsKKyAgICBwT3V0cm93Kys7CisgICAgaVorKzsKKworICAgIGlmIChpWiA+PSBpTWF4KSAgICAgICAgICAgICAgICAgICAgLyogZW5kIG9mIHNvdXJjZSA/ICovCisgICAgeworICAgICAgaVogICAgICAgPSAwOworICAgICAgcFdvcmtyb3cgPSAobW5nX3VpbnQzMnApcERhdGEtPnBXb3Jrcm93OworICAgIH0KKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1RJTEVfUkdCQTgsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCittbmdfcmV0Y29kZSBtbmdfdGlsZV9yZ2JhMTYgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX3VpbnQzMnAgcFdvcmtyb3c7CisgIG1uZ191aW50MzJwIHBPdXRyb3c7CisgIG1uZ19pbnQzMiAgIGlYOworICBtbmdfdWludDMyICBpWiwgaU1heDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9USUxFX1JHQkExNiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlaICAgICAgICAgICAgICA9IHBEYXRhLT5pU291cmNlbDsgICAvKiBpbmRlbnQgPyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd2hhdCdzIG91ciBzb3VyY2UtbGVuZ3RoICovCisgIGlNYXggICAgICAgICAgICA9ICgobW5nX2ltYWdlcClwRGF0YS0+cFJldHJpZXZlb2JqKS0+cEltZ2J1Zi0+aVdpZHRoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2V0dXAgdGVtcCBwb2ludGVycyAqLworICBwV29ya3JvdyAgICAgICAgPSAobW5nX3VpbnQzMnApcERhdGEtPnBSR0JBcm93ICsgKGlaIDw8IDEpOworICBwT3V0cm93ICAgICAgICAgPSAobW5nX3VpbnQzMnApcERhdGEtPnBXb3Jrcm93OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3dhcCBvcmlnaW5hbCBidWZmZXJzICovCisgIHBEYXRhLT5wV29ya3JvdyA9IHBEYXRhLT5wUkdCQXJvdzsKKyAgcERhdGEtPnBSR0JBcm93ID0gKG1uZ191aW50OHApcE91dHJvdzsKKworICBmb3IgKGlYID0gcERhdGEtPmlEZXN0bDsgaVggPCBwRGF0YS0+aURlc3RyOyBpWCsrKQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGlpaWlsZSAqLworICAgICpwT3V0cm93ICAgICAgID0gKnBXb3Jrcm93OworICAgICoocE91dHJvdyArIDEpID0gKihwV29ya3JvdyArIDEpOworCisgICAgcFdvcmtyb3cgKz0gMjsKKyAgICBwT3V0cm93ICArPSAyOworICAgIGlaKys7CisKKyAgICBpZiAoaVogPj0gaU1heCkgICAgICAgICAgICAgICAgICAgIC8qIGVuZCBvZiBzb3VyY2UgPyAqLworICAgIHsKKyAgICAgIGlaICAgICAgID0gMDsKKyAgICAgIHBXb3Jrcm93ID0gKG1uZ191aW50MzJwKXBEYXRhLT5wV29ya3JvdzsKKyAgICB9CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9USUxFX1JHQkExNiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKyNlbmRpZiAvKiBNTkdfU0tJUENIVU5LX1BBU1QgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2VuZGlmIC8qIE1OR19JTkNMVURFX0RJU1BMQVlfUFJPQ1MgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogZW5kIG9mIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwpkaWZmIC0tZ2l0IGEvZmlsZXMvU291cmNlL0xpYk1ORy9saWJtbmdfcGl4ZWxzLmggYi9maWxlcy9Tb3VyY2UvTGliTU5HL2xpYm1uZ19waXhlbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTAyODFlCi0tLSAvZGV2L251bGwKKysrIGIvZmlsZXMvU291cmNlL0xpYk1ORy9saWJtbmdfcGl4ZWxzLmgKQEAgLTAsMCArMSwxMTQ3IEBACisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gbGlibW5nLmggICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogcHJvamVjdCAgIDogbGlibW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGZpbGUgICAgICA6IGxpYm1uZ19waXhlbHMuaCAgICAgICAgICAgY29weXJpZ2h0IChjKSAyMDAwLTIwMDYgRy5KdXluICAgKiAqLworLyogKiB2ZXJzaW9uICAgOiAxLjAuMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIHB1cnBvc2UgICA6IFBpeGVsLXJvdyBtYW5hZ2VtZW50IHJvdXRpbmVzIChkZWZpbml0aW9uKSAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogYXV0aG9yICAgIDogRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBjb21tZW50ICAgOiBEZWZpbml0aW9uIG9mIHRoZSBwaXhlbC1yb3cgbWFuYWdlbWVudCByb3V0aW5lcyAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGNoYW5nZXMgICA6IDAuNS4xIC0gMDUvMDgvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNoYW5nZWQgc3RyaWN0LUFOU0kgc3R1ZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4yIC0gMDUvMjIvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHNvbWUgSk5HIGRlZmluaXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBkZWx0YS1pbWFnZSByb3ctcHJvY2Vzc2luZyByb3V0aW5lcyAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4yIC0gMDYvMDUvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHN1cHBvcnQgZm9yIFJHQjhfQTggY2FudmFzc3R5bGUgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4zIC0gMDYvMTYvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNoYW5nZWQgcHJvZ3Jlc3NpdmUtZGlzcGxheSBwcm9jZXNzaW5nICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4yIC0gMDgvMDUvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNoYW5nZWQgZmlsZS1wcmVmaXhlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4zIC0gMDgvMjYvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIE1BR04gc3VwcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjMgLSAwOS8wNy8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgc3VwcG9ydCBmb3IgbmV3IGZpbHRlcl90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMyAtIDEwLzE2LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBvcHRpb25hbCBzdXBwb3J0IGZvciBiS0dEIGZvciBQTkcgaW1hZ2VzICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgc3VwcG9ydCBmb3IgSkRBQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMyAtIDEwLzE5LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBpbXBsZW1lbnRlZCBkZWxheWVkIGRlbHRhLXByb2Nlc3NpbmcgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuNCAtICAxLzE4LzIwMDEgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCAibmV3IiBNQUdOIG1ldGhvZHMgMywgNCAmIDUgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuMSAtIDA0LzIxLzIwMDEgLSBHLkp1eW4gKGNvZGUgYnkgRy5LZWxseSkgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBCR1JBOCBjYW52YXMgd2l0aCBwcmVtdWx0aXBsaWVkIGFscGhhICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDA4LzE1LzIwMDIgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjb21wbGV0ZWQgUFJPTSBzdXBwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY29tcGxldGVkIGRlbHRhLWltYWdlIHN1cHBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDA4LzE2LzIwMDIgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjb21wbGV0ZWQgTUFHTiBzdXBwb3J0ICgxNi1iaXQgZnVuY3Rpb25zKSAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC41IC0gMDgvMTkvMjAwMiAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIEI1OTcxMzQgLSBsaWJtbmcgcG9sbHV0ZXMgdGhlIGxpbmtlciBuYW1lc3BhY2UgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAwOS8yMi8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgYmdyeDggY2FudmFzIChmaWxsZXIgYnl0ZSkgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDA5LzIzLzIwMDIgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBjb21wb3NlIG92ZXIvdW5kZXIgcm91dGluZXMgZm9yIFBBU1QgcHJvY2Vzc2luZyAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgZmxpcCAmIHRpbGUgcm91dGluZXMgZm9yIFBBU1QgcHJvY2Vzc2luZyAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjYgLSAwMy8wOS8yMDAzIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gaGlkaW5nIDEyLWJpdCBKUEVHIHN0dWZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNiAtIDA1LzExLzIwMDMgLSBHLiBKdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBjb25kaXRpb25hbHMgYXJvdW5kIGNhbnZhcyB1cGRhdGUgcm91dGluZXMgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC42IC0gMDYvMDkvMjAwMyAtIEcuIFItUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGNvbmRpdGlvbmFscyBhcm91bmQgOC1iaXQgbWFnbiByb3V0aW5lcyAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjYgLSAwNy8wNy8yMDAzIC0gRy4gUi1QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gcmVtb3ZlZCBjb25kaXRpb25hbHMgYXJvdW5kIDgtYml0IG1hZ24gcm91dGluZXMgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGNvbmRpdGlvbmFscyBhcm91bmQgMTYtYml0IGFuZCBkZWx0YS1QTkcgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICBzdXBwb3J0aW5nIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC42IC0gMDcvMjkvMjAwMyAtIEcuUi1QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIFNLSVBDSFVOSyBjb25kaXRpb25hbHMgYXJvdW5kIFBBU1QgY2h1bmsgc3VwcG9ydCAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjYgLSAwOC8xOC8yMDAzIC0gRy5SLVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgY29uZGl0aW9uYWxzIGFyb3VuZCAxLCAyLCBhbmQgNC1iaXQgcHJvdG90eXBlcyAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjcgLSAxMS8yNy8yMDAzIC0gUi5BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgQ0FOVkFTX1JHQjU2NSBhbmQgQ0FOVkFTX0JHUjU2NSAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNyAtIDEyLzA2LzIwMDMgLSBSLkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBDQU5WQVNfUkdCQTU2NSBhbmQgQ0FOVkFTX0JHUkE1NjUgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC43IC0gMDEvMjUvMjAwNCAtIEouUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHByZW11bHRpcGxpZWQgYWxwaGEgY2FudmFzJyBmb3IgUkdCQSwgQVJHQiwgQUJHUiAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC45IC0gMTAvMTAvMjAwNCAtIEcuUi1QLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIE1OR19OT18xXzJfNEJJVF9TVVBQT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjkgLSAxMC8xNC8yMDA0IC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgYmdyNTY1X2E4IGNhbnZhcy1zdHlsZSAodGhhbmtzIHRvIEouIEVsdmFuZGVyKSAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjEwIC0gMDMvMDcvMjAwNiAtICh0aGFua3MgdG8gVy4gTWFudGhleSkgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgQ0FOVkFTX1JHQjU1NSBhbmQgQ0FOVkFTX0JHUjU1NSAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZiBkZWZpbmVkKF9fQk9STEFORENfXykgJiYgZGVmaW5lZChNTkdfU1RSSUNUX0FOU0kpCisjcHJhZ21hIG9wdGlvbiAtQSAgICAgICAgICAgICAgICAgICAgICAvKiBmb3JjZSBBTlNJLUMgKi8KKyNlbmRpZgorCisjaWZuZGVmIF9saWJtbmdfcGl4ZWxzX2hfCisjZGVmaW5lIF9saWJtbmdfcGl4ZWxzX2hfCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBQcm9ncmVzc2l2ZSBkaXNwbGF5IGNoZWNrIC0gY2hlY2tzIHRvIHNlZSBpZiBwcm9ncmVzc2l2ZSBkaXNwbGF5IGlzICAgICogKi8KKy8qICogaW4gb3JkZXIgJiBpbmRpY2F0ZXMgc28gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBUaGUgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgYSBjYWxsIHRvIG9uZSBvZiB0aGUgZGlzcGxheV94eHggcm91dGluZXMgICogKi8KKy8qICogaWYgYXBwcm9wcmlhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBUaGUgcmVmcmVzaCBpcyB3YXJyZW50ZWQgaW4gdGhlIHJlYWRfY2h1bmsgcm91dGluZSAobW5nX3JlYWQuYykgICAgICAgICogKi8KKy8qICogYW5kIG9ubHkgZHVyaW5nIHJlYWQmZGlzcGxheSBwcm9jZXNzaW5nLCBzaW5jZSB0aGVyZSdzIG5vdCBtdWNoIHBvaW50ICAqICovCisvKiAqIGRvaW5nIGl0IGZyb20gbWVtb3J5ISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19kaXNwbGF5X3Byb2dyZXNzaXZlX2NoZWNrIChtbmdfZGF0YXAgcERhdGEpOworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogRGlzcGxheSByb3V0aW5lcyAtIGNvbnZlcnQgcm93ZGF0YSAod2hpY2ggaXMgYWxyZWFkeSBjb2xvci1jb3JyZWN0ZWQpICAqICovCisvKiAqIHRvIHRoZSBvdXRwdXQgY2FudmFzLCByZXNwZWN0aW5nIGFueSB0cmFuc3BhcmVuY3kgaW5mb3JtYXRpb24gICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBDQU5WQVNfUkdCOAorbW5nX3JldGNvZGUgbW5nX2Rpc3BsYXlfcmdiOCAgICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0FOVkFTX1JHQkE4CittbmdfcmV0Y29kZSBtbmdfZGlzcGxheV9yZ2JhOCAgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDQU5WQVNfUkdCQThfUE0KK21uZ19yZXRjb2RlIG1uZ19kaXNwbGF5X3JnYmE4X3BtICAgICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENBTlZBU19BUkdCOAorbW5nX3JldGNvZGUgbW5nX2Rpc3BsYXlfYXJnYjggICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0FOVkFTX0FSR0I4X1BNCittbmdfcmV0Y29kZSBtbmdfZGlzcGxheV9hcmdiOF9wbSAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDQU5WQVNfUkdCOF9BOAorbW5nX3JldGNvZGUgbW5nX2Rpc3BsYXlfcmdiOF9hOCAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0FOVkFTX0JHUjgKK21uZ19yZXRjb2RlIG1uZ19kaXNwbGF5X2JncjggICAgICAgICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENBTlZBU19CR1JYOAorbW5nX3JldGNvZGUgbW5nX2Rpc3BsYXlfYmdyeDggICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0FOVkFTX0JHUkE4CittbmdfcmV0Y29kZSBtbmdfZGlzcGxheV9iZ3JhOCAgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDQU5WQVNfQkdSQThfUE0KK21uZ19yZXRjb2RlIG1uZ19kaXNwbGF5X2JncmE4X3BtICAgICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENBTlZBU19BQkdSOAorbW5nX3JldGNvZGUgbW5nX2Rpc3BsYXlfYWJncjggICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0FOVkFTX0FCR1I4X1BNCittbmdfcmV0Y29kZSBtbmdfZGlzcGxheV9hYmdyOF9wbSAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDQU5WQVNfUkdCNTY1CittbmdfcmV0Y29kZSBtbmdfZGlzcGxheV9yZ2I1NjUgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDQU5WQVNfUkdCQTU2NQorbW5nX3JldGNvZGUgbW5nX2Rpc3BsYXlfcmdiYTU2NSAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0FOVkFTX0JHUjU2NQorbW5nX3JldGNvZGUgbW5nX2Rpc3BsYXlfYmdyNTY1ICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0FOVkFTX0JHUkE1NjUKK21uZ19yZXRjb2RlIG1uZ19kaXNwbGF5X2JncmE1NjUgICAgICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENBTlZBU19CR1I1NjVfQTgKK21uZ19yZXRjb2RlIG1uZ19kaXNwbGF5X2JncjU2NV9hOCAgICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENBTlZBU19SR0I1NTUKK21uZ19yZXRjb2RlIG1uZ19kaXNwbGF5X3JnYjU1NSAgICAgICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENBTlZBU19CR1I1NTUKK21uZ19yZXRjb2RlIG1uZ19kaXNwbGF5X2JncjU1NSAgICAgICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogQmFja2dyb3VuZCByZXN0b3JlIHJvdXRpbmVzIC0gcmVzdG9yZSB0aGUgYmFja2dyb3VuZCB3aXRoIGluZm8gZnJvbSAgICAqICovCisvKiAqIHRoZSBCQUNLIGFuZC9vciBiS0dEIGNodW5rIGFuZC9vciB0aGUgYXBwJ3MgYmFja2dyb3VuZCBjYW52YXMgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19yZXN0b3JlX2JrZ2RfYmFja2ltYWdlIChtbmdfZGF0YXAgIHBEYXRhKTsKK21uZ19yZXRjb2RlIG1uZ19yZXN0b3JlX2JrZ2RfYmFja2NvbG9yIChtbmdfZGF0YXAgIHBEYXRhKTsKK21uZ19yZXRjb2RlIG1uZ19yZXN0b3JlX2JrZ2RfYmtnZCAgICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKK21uZ19yZXRjb2RlIG1uZ19yZXN0b3JlX2JrZ2RfYmdjb2xvciAgIChtbmdfZGF0YXAgIHBEYXRhKTsKKyNpZm5kZWYgTU5HX1NLSVBDQU5WQVNfUkdCOAorbW5nX3JldGNvZGUgbW5nX3Jlc3RvcmVfYmtnZF9yZ2I4ICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0FOVkFTX0JHUjgKK21uZ19yZXRjb2RlIG1uZ19yZXN0b3JlX2JrZ2RfYmdyOCAgICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENBTlZBU19CR1JYOAorbW5nX3JldGNvZGUgbW5nX3Jlc3RvcmVfYmtnZF9iZ3J4OCAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0FOVkFTX1JHQjU2NQorbW5nX3JldGNvZGUgbW5nX3Jlc3RvcmVfYmtnZF9yZ2I1NjUgICAgKG1uZ19kYXRhcCAgcERhdGEpOworI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0FOVkFTX0JHUjU2NQorbW5nX3JldGNvZGUgbW5nX3Jlc3RvcmVfYmtnZF9iZ3I1NjUgICAgKG1uZ19kYXRhcCAgcERhdGEpOworI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBSb3cgcmV0cmlldmFsIHJvdXRpbmVzIC0gcmV0cmlldmUgcHJvY2Vzc2VkICYgdW5jb21wcmVzc2VkIHJvdy1kYXRhICAgICogKi8KKy8qICogZnJvbSB0aGUgY3VycmVudCAib2JqZWN0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX3JldHJpZXZlX2c4ICAgICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworbW5nX3JldGNvZGUgbW5nX3JldHJpZXZlX3JnYjggICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworbW5nX3JldGNvZGUgbW5nX3JldHJpZXZlX2lkeDggICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworbW5nX3JldGNvZGUgbW5nX3JldHJpZXZlX2dhOCAgICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworbW5nX3JldGNvZGUgbW5nX3JldHJpZXZlX3JnYmE4ICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorbW5nX3JldGNvZGUgbW5nX3JldHJpZXZlX2cxNiAgICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworbW5nX3JldGNvZGUgbW5nX3JldHJpZXZlX2dhMTYgICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworbW5nX3JldGNvZGUgbW5nX3JldHJpZXZlX3JnYjE2ICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworbW5nX3JldGNvZGUgbW5nX3JldHJpZXZlX3JnYmExNiAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBSb3cgc3RvcmFnZSByb3V0aW5lcyAtIHN0b3JlIHByb2Nlc3NlZCAmIHVuY29tcHJlc3NlZCByb3ctZGF0YSAgICAgICAgICogKi8KKy8qICogaW50byB0aGUgY3VycmVudCAib2JqZWN0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fMV8yXzRCSVRfU1VQUE9SVAorbW5nX3JldGNvZGUgbW5nX3N0b3JlX2cxICAgICAgICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworbW5nX3JldGNvZGUgbW5nX3N0b3JlX2cyICAgICAgICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworbW5nX3JldGNvZGUgbW5nX3N0b3JlX2c0ICAgICAgICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworbW5nX3JldGNvZGUgbW5nX3N0b3JlX2lkeDEgICAgICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworbW5nX3JldGNvZGUgbW5nX3N0b3JlX2lkeDIgICAgICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworbW5nX3JldGNvZGUgbW5nX3N0b3JlX2lkeDQgICAgICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworI2VuZGlmCittbmdfcmV0Y29kZSBtbmdfc3RvcmVfaWR4OCAgICAgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfc3RvcmVfcmdiOCAgICAgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfc3RvcmVfZzggICAgICAgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfc3RvcmVfZ2E4ICAgICAgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfc3RvcmVfcmdiYTggICAgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCittbmdfcmV0Y29kZSBtbmdfc3RvcmVfZzE2ICAgICAgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfc3RvcmVfZ2ExNiAgICAgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfc3RvcmVfcmdiMTYgICAgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfc3RvcmVfcmdiYTE2ICAgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIFJvdyBzdG9yYWdlIHJvdXRpbmVzIChKUEVHKSAtIHN0b3JlIHByb2Nlc3NlZCAmIHVuY29tcHJlc3NlZCByb3ctZGF0YSAgKiAqLworLyogKiBpbnRvIHRoZSBjdXJyZW50ICJvYmplY3QiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCittbmdfcmV0Y29kZSBtbmdfc3RvcmVfanBlZ19nOCAgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfc3RvcmVfanBlZ19yZ2I4ICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfc3RvcmVfanBlZ19nYTggICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfc3RvcmVfanBlZ19yZ2JhOCAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9KUEVHMTIKK21uZ19yZXRjb2RlIG1uZ19zdG9yZV9qcGVnX2cxMiAgICAgICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKK21uZ19yZXRjb2RlIG1uZ19zdG9yZV9qcGVnX3JnYjEyICAgICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKK21uZ19yZXRjb2RlIG1uZ19zdG9yZV9qcGVnX2dhMTIgICAgICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKK21uZ19yZXRjb2RlIG1uZ19zdG9yZV9qcGVnX3JnYmExMiAgICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKKyNlbmRpZgorCittbmdfcmV0Y29kZSBtbmdfc3RvcmVfanBlZ19nOF9hbHBoYSAgICAobW5nX2RhdGFwICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfc3RvcmVfanBlZ19yZ2I4X2FscGhhICAobW5nX2RhdGFwICBwRGF0YSk7CisKKyNpZm5kZWYgTU5HX05PXzFfMl80QklUX1NVUFBPUlQKK21uZ19yZXRjb2RlIG1uZ19zdG9yZV9qcGVnX2c4X2ExICAgICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKK21uZ19yZXRjb2RlIG1uZ19zdG9yZV9qcGVnX2c4X2EyICAgICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKK21uZ19yZXRjb2RlIG1uZ19zdG9yZV9qcGVnX2c4X2E0ICAgICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKKyNlbmRpZgorbW5nX3JldGNvZGUgbW5nX3N0b3JlX2pwZWdfZzhfYTggICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorbW5nX3JldGNvZGUgbW5nX3N0b3JlX2pwZWdfZzhfYTE2ICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworI2VuZGlmCisKKyNpZm5kZWYgTU5HX05PXzFfMl80QklUX1NVUFBPUlQKK21uZ19yZXRjb2RlIG1uZ19zdG9yZV9qcGVnX3JnYjhfYTEgICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKK21uZ19yZXRjb2RlIG1uZ19zdG9yZV9qcGVnX3JnYjhfYTIgICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKK21uZ19yZXRjb2RlIG1uZ19zdG9yZV9qcGVnX3JnYjhfYTQgICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKKyNlbmRpZgorbW5nX3JldGNvZGUgbW5nX3N0b3JlX2pwZWdfcmdiOF9hOCAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorbW5nX3JldGNvZGUgbW5nX3N0b3JlX2pwZWdfcmdiOF9hMTYgICAgKG1uZ19kYXRhcCAgcERhdGEpOworI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9KUEVHMTIKKyNpZm5kZWYgTU5HX05PXzFfMl80QklUX1NVUFBPUlQKK21uZ19yZXRjb2RlIG1uZ19zdG9yZV9qcGVnX2cxMl9hMSAgICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKK21uZ19yZXRjb2RlIG1uZ19zdG9yZV9qcGVnX2cxMl9hMiAgICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKK21uZ19yZXRjb2RlIG1uZ19zdG9yZV9qcGVnX2cxMl9hNCAgICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKKyNlbmRpZgorbW5nX3JldGNvZGUgbW5nX3N0b3JlX2pwZWdfZzEyX2E4ICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorbW5nX3JldGNvZGUgbW5nX3N0b3JlX2pwZWdfZzEyX2ExNiAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworI2VuZGlmCisKKyNpZm5kZWYgTU5HX05PXzFfMl80QklUX1NVUFBPUlQKK21uZ19yZXRjb2RlIG1uZ19zdG9yZV9qcGVnX3JnYjEyX2ExICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKK21uZ19yZXRjb2RlIG1uZ19zdG9yZV9qcGVnX3JnYjEyX2EyICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKK21uZ19yZXRjb2RlIG1uZ19zdG9yZV9qcGVnX3JnYjEyX2E0ICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKKyNlbmRpZgorbW5nX3JldGNvZGUgbW5nX3N0b3JlX2pwZWdfcmdiMTJfYTggICAgKG1uZ19kYXRhcCAgcERhdGEpOworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorbW5nX3JldGNvZGUgbW5nX3N0b3JlX2pwZWdfcmdiMTJfYTE2ICAgKG1uZ19kYXRhcCAgcERhdGEpOworI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogRGVsdGEtaW1hZ2Ugcm93IHJvdXRpbmVzIC0gYXBwbHkgdGhlIHByb2Nlc3NlZCAmIHVuY29tcHJlc3NlZCByb3ctZGF0YSAqICovCisvKiAqIG9udG8gdGhlIHRhcmdldCAib2JqZWN0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworI2lmbmRlZiBNTkdfTk9fMV8yXzRCSVRfU1VQUE9SVAorbW5nX3JldGNvZGUgbW5nX2RlbHRhX2cxICAgICAgICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworbW5nX3JldGNvZGUgbW5nX2RlbHRhX2cyICAgICAgICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworbW5nX3JldGNvZGUgbW5nX2RlbHRhX2c0ICAgICAgICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworI2VuZGlmCittbmdfcmV0Y29kZSBtbmdfZGVsdGFfZzggICAgICAgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfZGVsdGFfZzE2ICAgICAgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfZGVsdGFfcmdiOCAgICAgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCittbmdfcmV0Y29kZSBtbmdfZGVsdGFfcmdiMTYgICAgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CisjZW5kaWYKKyNpZm5kZWYgTU5HX05PXzFfMl80QklUX1NVUFBPUlQKK21uZ19yZXRjb2RlIG1uZ19kZWx0YV9pZHgxICAgICAgICAgICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKK21uZ19yZXRjb2RlIG1uZ19kZWx0YV9pZHgyICAgICAgICAgICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKK21uZ19yZXRjb2RlIG1uZ19kZWx0YV9pZHg0ICAgICAgICAgICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKKyNlbmRpZgorbW5nX3JldGNvZGUgbW5nX2RlbHRhX2lkeDggICAgICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworbW5nX3JldGNvZGUgbW5nX2RlbHRhX2dhOCAgICAgICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworbW5nX3JldGNvZGUgbW5nX2RlbHRhX3JnYmE4ICAgICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorbW5nX3JldGNvZGUgbW5nX2RlbHRhX2dhMTYgICAgICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworbW5nX3JldGNvZGUgbW5nX2RlbHRhX3JnYmExNiAgICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBEZWx0YS1pbWFnZSByb3cgcm91dGluZXMgLSBhcHBseSB0aGUgc291cmNlIHJvdyBvbnRvIHRoZSB0YXJnZXQgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19OT18xXzJfNEJJVF9TVVBQT1JUCittbmdfcmV0Y29kZSBtbmdfZGVsdGFfZzFfZzEgICAgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfZGVsdGFfZzJfZzIgICAgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfZGVsdGFfZzRfZzQgICAgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CisjZW5kaWYKK21uZ19yZXRjb2RlIG1uZ19kZWx0YV9nOF9nOCAgICAgICAgICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKK21uZ19yZXRjb2RlIG1uZ19kZWx0YV9nMTZfZzE2ICAgICAgICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKKyNlbmRpZgorbW5nX3JldGNvZGUgbW5nX2RlbHRhX2dhOF9nYTggICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworbW5nX3JldGNvZGUgbW5nX2RlbHRhX2dhOF9nOCAgICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworbW5nX3JldGNvZGUgbW5nX2RlbHRhX2dhOF9hOCAgICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworbW5nX3JldGNvZGUgbW5nX2RlbHRhX3JnYmE4X3JnYjggICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworbW5nX3JldGNvZGUgbW5nX2RlbHRhX3JnYmE4X2E4ICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorbW5nX3JldGNvZGUgbW5nX2RlbHRhX2dhMTZfZ2ExNiAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworbW5nX3JldGNvZGUgbW5nX2RlbHRhX2dhMTZfZzE2ICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworbW5nX3JldGNvZGUgbW5nX2RlbHRhX2dhMTZfYTE2ICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworbW5nX3JldGNvZGUgbW5nX2RlbHRhX3JnYmExNl9hMTYgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworbW5nX3JldGNvZGUgbW5nX2RlbHRhX3JnYmExNl9yZ2IxNiAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworI2VuZGlmCisjZW5kaWYgLyogTU5HX05PX0RFTFRBX1BORyAqLworbW5nX3JldGNvZGUgbW5nX2RlbHRhX3JnYjhfcmdiOCAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOyAvKiBVc2VkIGZvciBQQVNUICovCittbmdfcmV0Y29kZSBtbmdfZGVsdGFfcmdiYThfcmdiYTggICAgICAobW5nX2RhdGFwICBwRGF0YSk7CisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCittbmdfcmV0Y29kZSBtbmdfZGVsdGFfcmdiMTZfcmdiMTYgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfZGVsdGFfcmdiYTE2X3JnYmExNiAgICAobW5nX2RhdGFwICBwRGF0YSk7CisjZW5kaWYKKworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogRGVsdGEtaW1hZ2Ugcm93IHJvdXRpbmVzIC0gc2NhbGUgdGhlIGRlbHRhIHRvIGJpdGRlcHRoIG9mIHRhcmdldCAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fMV8yXzRCSVRfU1VQUE9SVAorbW5nX3JldGNvZGUgbW5nX3NjYWxlX2cxX2cyICAgICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworbW5nX3JldGNvZGUgbW5nX3NjYWxlX2cxX2c0ICAgICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworbW5nX3JldGNvZGUgbW5nX3NjYWxlX2cxX2c4ICAgICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworbW5nX3JldGNvZGUgbW5nX3NjYWxlX2cyX2c0ICAgICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworbW5nX3JldGNvZGUgbW5nX3NjYWxlX2cyX2c4ICAgICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworbW5nX3JldGNvZGUgbW5nX3NjYWxlX2c0X2c4ICAgICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworI2VuZGlmCisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCisjaWZuZGVmIE1OR19OT18xXzJfNEJJVF9TVVBQT1JUCittbmdfcmV0Y29kZSBtbmdfc2NhbGVfZzFfZzE2ICAgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfc2NhbGVfZzJfZzE2ICAgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfc2NhbGVfZzRfZzE2ICAgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CisjZW5kaWYKK21uZ19yZXRjb2RlIG1uZ19zY2FsZV9nOF9nMTYgICAgICAgICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKK21uZ19yZXRjb2RlIG1uZ19zY2FsZV9nYThfZ2ExNiAgICAgICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKK21uZ19yZXRjb2RlIG1uZ19zY2FsZV9yZ2I4X3JnYjE2ICAgICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKK21uZ19yZXRjb2RlIG1uZ19zY2FsZV9yZ2JhOF9yZ2JhMTYgICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKKyNlbmRpZgorCisjaWZuZGVmIE1OR19OT18xXzJfNEJJVF9TVVBQT1JUCittbmdfcmV0Y29kZSBtbmdfc2NhbGVfZzJfZzEgICAgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfc2NhbGVfZzRfZzEgICAgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfc2NhbGVfZzhfZzEgICAgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfc2NhbGVfZzRfZzIgICAgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfc2NhbGVfZzhfZzIgICAgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfc2NhbGVfZzhfZzQgICAgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CisjZW5kaWYKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyNpZm5kZWYgTU5HX05PXzFfMl80QklUX1NVUFBPUlQKK21uZ19yZXRjb2RlIG1uZ19zY2FsZV9nMTZfZzEgICAgICAgICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKK21uZ19yZXRjb2RlIG1uZ19zY2FsZV9nMTZfZzIgICAgICAgICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKK21uZ19yZXRjb2RlIG1uZ19zY2FsZV9nMTZfZzQgICAgICAgICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKKyNlbmRpZgorbW5nX3JldGNvZGUgbW5nX3NjYWxlX2cxNl9nOCAgICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworbW5nX3JldGNvZGUgbW5nX3NjYWxlX2dhMTZfZ2E4ICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworbW5nX3JldGNvZGUgbW5nX3NjYWxlX3JnYjE2X3JnYjggICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworbW5nX3JldGNvZGUgbW5nX3NjYWxlX3JnYmExNl9yZ2JhOCAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworI2VuZGlmCisjZW5kaWYgLyogTU5HX05PX0RFTFRBX1BORyAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogRGVsdGEtaW1hZ2UgYml0IHJvdXRpbmVzIC0gcHJvbW90ZSBiaXRfZGVwdGggICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3VpbnQ4ICAgbW5nX3Byb21vdGVfcmVwbGljYXRlXzFfMiAgKG1uZ191aW50OCAgaUIpOworbW5nX3VpbnQ4ICAgbW5nX3Byb21vdGVfcmVwbGljYXRlXzFfNCAgKG1uZ191aW50OCAgaUIpOworbW5nX3VpbnQ4ICAgbW5nX3Byb21vdGVfcmVwbGljYXRlXzFfOCAgKG1uZ191aW50OCAgaUIpOworbW5nX3VpbnQ4ICAgbW5nX3Byb21vdGVfcmVwbGljYXRlXzJfNCAgKG1uZ191aW50OCAgaUIpOworbW5nX3VpbnQ4ICAgbW5nX3Byb21vdGVfcmVwbGljYXRlXzJfOCAgKG1uZ191aW50OCAgaUIpOworbW5nX3VpbnQ4ICAgbW5nX3Byb21vdGVfcmVwbGljYXRlXzRfOCAgKG1uZ191aW50OCAgaUIpOworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorbW5nX3VpbnQxNiAgbW5nX3Byb21vdGVfcmVwbGljYXRlXzFfMTYgKG1uZ191aW50OCAgaUIpOworbW5nX3VpbnQxNiAgbW5nX3Byb21vdGVfcmVwbGljYXRlXzJfMTYgKG1uZ191aW50OCAgaUIpOworbW5nX3VpbnQxNiAgbW5nX3Byb21vdGVfcmVwbGljYXRlXzRfMTYgKG1uZ191aW50OCAgaUIpOworbW5nX3VpbnQxNiAgbW5nX3Byb21vdGVfcmVwbGljYXRlXzhfMTYgKG1uZ191aW50OCAgaUIpOworI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworbW5nX3VpbnQ4ICAgbW5nX3Byb21vdGVfemVyb2ZpbGxfMV8yICAgKG1uZ191aW50OCAgaUIpOworbW5nX3VpbnQ4ICAgbW5nX3Byb21vdGVfemVyb2ZpbGxfMV80ICAgKG1uZ191aW50OCAgaUIpOworbW5nX3VpbnQ4ICAgbW5nX3Byb21vdGVfemVyb2ZpbGxfMV84ICAgKG1uZ191aW50OCAgaUIpOworbW5nX3VpbnQ4ICAgbW5nX3Byb21vdGVfemVyb2ZpbGxfMl80ICAgKG1uZ191aW50OCAgaUIpOworbW5nX3VpbnQ4ICAgbW5nX3Byb21vdGVfemVyb2ZpbGxfMl84ICAgKG1uZ191aW50OCAgaUIpOworbW5nX3VpbnQ4ICAgbW5nX3Byb21vdGVfemVyb2ZpbGxfNF84ICAgKG1uZ191aW50OCAgaUIpOworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorbW5nX3VpbnQxNiAgbW5nX3Byb21vdGVfemVyb2ZpbGxfMV8xNiAgKG1uZ191aW50OCAgaUIpOworbW5nX3VpbnQxNiAgbW5nX3Byb21vdGVfemVyb2ZpbGxfMl8xNiAgKG1uZ191aW50OCAgaUIpOworbW5nX3VpbnQxNiAgbW5nX3Byb21vdGVfemVyb2ZpbGxfNF8xNiAgKG1uZ191aW50OCAgaUIpOworbW5nX3VpbnQxNiAgbW5nX3Byb21vdGVfemVyb2ZpbGxfOF8xNiAgKG1uZ191aW50OCAgaUIpOworI2VuZGlmCisjZW5kaWYgLyogTU5HX05PX0RFTFRBX1BORyAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogRGVsdGEtaW1hZ2Ugcm93IHJvdXRpbmVzIC0gcHJvbW90ZSBjb2xvcl90eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX3Byb21vdGVfZzhfZzggICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorbW5nX3JldGNvZGUgbW5nX3Byb21vdGVfZzhfZzE2ICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworbW5nX3JldGNvZGUgbW5nX3Byb21vdGVfZzE2X2cxNiAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworI2VuZGlmCisKK21uZ19yZXRjb2RlIG1uZ19wcm9tb3RlX2c4X2dhOCAgICAgICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKK21uZ19yZXRjb2RlIG1uZ19wcm9tb3RlX2c4X2dhMTYgICAgICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKK21uZ19yZXRjb2RlIG1uZ19wcm9tb3RlX2cxNl9nYTE2ICAgICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKKyNlbmRpZgorCittbmdfcmV0Y29kZSBtbmdfcHJvbW90ZV9nOF9yZ2I4ICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCittbmdfcmV0Y29kZSBtbmdfcHJvbW90ZV9nOF9yZ2IxNiAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfcHJvbW90ZV9nMTZfcmdiMTYgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CisjZW5kaWYKKworbW5nX3JldGNvZGUgbW5nX3Byb21vdGVfZzhfcmdiYTggICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorbW5nX3JldGNvZGUgbW5nX3Byb21vdGVfZzhfcmdiYTE2ICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworbW5nX3JldGNvZGUgbW5nX3Byb21vdGVfZzE2X3JnYmExNiAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworCittbmdfcmV0Y29kZSBtbmdfcHJvbW90ZV9nYThfZ2ExNiAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CisjZW5kaWYKKworbW5nX3JldGNvZGUgbW5nX3Byb21vdGVfZ2E4X3JnYmE4ICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorbW5nX3JldGNvZGUgbW5nX3Byb21vdGVfZ2E4X3JnYmExNiAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworbW5nX3JldGNvZGUgbW5nX3Byb21vdGVfZ2ExNl9yZ2JhMTYgICAgKG1uZ19kYXRhcCAgcERhdGEpOworI2VuZGlmCisKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKK21uZ19yZXRjb2RlIG1uZ19wcm9tb3RlX3JnYjhfcmdiMTYgICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKKyNlbmRpZgorCittbmdfcmV0Y29kZSBtbmdfcHJvbW90ZV9yZ2I4X3JnYmE4ICAgICAobW5nX2RhdGFwICBwRGF0YSk7CisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCittbmdfcmV0Y29kZSBtbmdfcHJvbW90ZV9yZ2I4X3JnYmExNiAgICAobW5nX2RhdGFwICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfcHJvbW90ZV9yZ2IxNl9yZ2JhMTYgICAobW5nX2RhdGFwICBwRGF0YSk7CisjZW5kaWYKKworbW5nX3JldGNvZGUgbW5nX3Byb21vdGVfaWR4OF9yZ2I4ICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorbW5nX3JldGNvZGUgbW5nX3Byb21vdGVfaWR4OF9yZ2IxNiAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworI2VuZGlmCisKK21uZ19yZXRjb2RlIG1uZ19wcm9tb3RlX2lkeDhfcmdiYTggICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKK21uZ19yZXRjb2RlIG1uZ19wcm9tb3RlX2lkeDhfcmdiYTE2ICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKKworbW5nX3JldGNvZGUgbW5nX3Byb21vdGVfcmdiYThfcmdiYTE2ICAgKG1uZ19kYXRhcCAgcERhdGEpOworI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBSb3cgcHJvY2Vzc2luZyByb3V0aW5lcyAtIGNvbnZlcnQgdW5jb21wcmVzc2VkIGRhdGEgZnJvbSB6bGliIHRvICAgICAgICogKi8KKy8qICogbWFuYWdhYmxlIHJvdy1kYXRhIHdoaWNoIHNlcnZlcyBhcyBpbnB1dCB0byB0aGUgY29sb3ItbWFuYWdlbWVudCAgICAgICAqICovCisvKiAqIHJvdXRpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PXzFfMl80QklUX1NVUFBPUlQKK21uZ19yZXRjb2RlIG1uZ19wcm9jZXNzX2cxICAgICAgICAgICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKK21uZ19yZXRjb2RlIG1uZ19wcm9jZXNzX2cyICAgICAgICAgICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKK21uZ19yZXRjb2RlIG1uZ19wcm9jZXNzX2c0ICAgICAgICAgICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKKyNlbmRpZgorbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfZzggICAgICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfcmdiOCAgICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworI2lmbmRlZiBNTkdfTk9fMV8yXzRCSVRfU1VQUE9SVAorbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfaWR4MSAgICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfaWR4MiAgICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworbW5nX3JldGNvZGUgbW5nX3Byb2Nlc3NfaWR4NCAgICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworI2VuZGlmCittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19pZHg4ICAgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19nYTggICAgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19yZ2JhOCAgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19nMTYgICAgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19nYTE2ICAgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19yZ2IxNiAgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19yZ2JhMTYgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIFJvdyBwcm9jZXNzaW5nIGluaXRpYWxpemF0aW9uIHJvdXRpbmVzIC0gc2V0IHVwIHRoZSB2YXJpYWJsZXMgbmVlZGVkICAgKiAqLworLyogKiB0byBwcm9jZXNzIHVuY29tcHJlc3NlZCByb3ctZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19PUFRJTUlaRV9GT09UUFJJTlRfSU5JVAorI2lmbmRlZiBNTkdfTk9fMV8yXzRCSVRfU1VQUE9SVAorbW5nX3JldGNvZGUgbW5nX2luaXRfZzFfaSAgICAgICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworbW5nX3JldGNvZGUgbW5nX2luaXRfZzJfaSAgICAgICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworbW5nX3JldGNvZGUgbW5nX2luaXRfZzRfaSAgICAgICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworI2VuZGlmCittbmdfcmV0Y29kZSBtbmdfaW5pdF9nOF9pICAgICAgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfaW5pdF9yZ2I4X2kgICAgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CisjaWZuZGVmIE1OR19OT18xXzJfNEJJVF9TVVBQT1JUCittbmdfcmV0Y29kZSBtbmdfaW5pdF9pZHgxX2kgICAgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfaW5pdF9pZHgyX2kgICAgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfaW5pdF9pZHg0X2kgICAgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CisjZW5kaWYKK21uZ19yZXRjb2RlIG1uZ19pbml0X2lkeDhfaSAgICAgICAgICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKK21uZ19yZXRjb2RlIG1uZ19pbml0X2dhOF9pICAgICAgICAgICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKK21uZ19yZXRjb2RlIG1uZ19pbml0X3JnYmE4X2kgICAgICAgICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKKyNpZm5kZWYgTU5HX05PXzFfMl80QklUX1NVUFBPUlQKK21uZ19yZXRjb2RlIG1uZ19pbml0X2cxX25pICAgICAgICAgICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKK21uZ19yZXRjb2RlIG1uZ19pbml0X2cyX25pICAgICAgICAgICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKK21uZ19yZXRjb2RlIG1uZ19pbml0X2c0X25pICAgICAgICAgICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKKyNlbmRpZgorbW5nX3JldGNvZGUgbW5nX2luaXRfZzhfbmkgICAgICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworbW5nX3JldGNvZGUgbW5nX2luaXRfcmdiOF9uaSAgICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworI2lmbmRlZiBNTkdfTk9fMV8yXzRCSVRfU1VQUE9SVAorbW5nX3JldGNvZGUgbW5nX2luaXRfaWR4MV9uaSAgICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworbW5nX3JldGNvZGUgbW5nX2luaXRfaWR4Ml9uaSAgICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworbW5nX3JldGNvZGUgbW5nX2luaXRfaWR4NF9uaSAgICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworI2VuZGlmCittbmdfcmV0Y29kZSBtbmdfaW5pdF9pZHg4X25pICAgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfaW5pdF9nYThfbmkgICAgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfaW5pdF9yZ2JhOF9uaSAgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CisjaWZuZGVmIE1OR19OT18xNkJJVF9TVVBQT1JUCittbmdfcmV0Y29kZSBtbmdfaW5pdF9nMTZfaSAgICAgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfaW5pdF9yZ2IxNl9pICAgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfaW5pdF9nYTE2X2kgICAgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfaW5pdF9yZ2JhMTZfaSAgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfaW5pdF9nMTZfbmkgICAgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfaW5pdF9yZ2IxNl9uaSAgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfaW5pdF9nYTE2X25pICAgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfaW5pdF9yZ2JhMTZfbmkgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CisjZW5kaWYKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogUm93IHByb2Nlc3NpbmcgaW5pdGlhbGl6YXRpb24gcm91dGluZXMgKEpQRUcpIC0gc2V0IHVwIHRoZSB2YXJpYWJsZXMgICAqICovCisvKiAqIG5lZWRlZCB0byBwcm9jZXNzIHVuY29tcHJlc3NlZCByb3ctZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0ZPT1RQUklOVF9JTklUCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisjaWZuZGVmIE1OR19OT18xXzJfNEJJVF9TVVBQT1JUCittbmdfcmV0Y29kZSBtbmdfaW5pdF9qcGVnX2ExX25pICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfaW5pdF9qcGVnX2EyX25pICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmdfaW5pdF9qcGVnX2E0X25pICAgICAgICAobW5nX2RhdGFwICBwRGF0YSk7CisjZW5kaWYKK21uZ19yZXRjb2RlIG1uZ19pbml0X2pwZWdfYThfbmkgICAgICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKK21uZ19yZXRjb2RlIG1uZ19pbml0X2pwZWdfYTE2X25pICAgICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIEdlbmVyYWwgcm93IHByb2Nlc3Npbmcgcm91dGluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19pbml0X3Jvd3Byb2MgICAgICAgICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKK21uZ19yZXRjb2RlIG1uZ19uZXh0X3JvdyAgICAgICAgICAgICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKK21uZ19yZXRjb2RlIG1uZ19uZXh0X2pwZWdfYWxwaGFyb3cgICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKK21uZ19yZXRjb2RlIG1uZ19uZXh0X2pwZWdfcm93ICAgICAgICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKKyNlbmRpZgorbW5nX3JldGNvZGUgbW5nX2NsZWFudXBfcm93cHJvYyAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogTWFnbmlmaWNhdGlvbiByb3cgcm91dGluZXMgLSBhcHBseSBtYWduaWZpY2F0aW9uIHRyYW5zZm9ybXMgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfT1BUSU1JWkVfRk9PVFBSSU5UX01BR04KK21uZ19yZXRjb2RlIG1uZ19tYWduaWZ5X2c4X3gxICAgICAgICAgIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1YLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcFNyY2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSk7CittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9nOF94MiAgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBTcmNsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcERzdGxpbmUpOworbW5nX3JldGNvZGUgbW5nX21hZ25pZnlfZzhfeDMgICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBEc3RsaW5lKTsKK21uZ19yZXRjb2RlIG1uZ19tYWduaWZ5X3JnYjhfeDEgICAgICAgIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1YLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcFNyY2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSk7CittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9yZ2I4X3gyICAgICAgICAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBTcmNsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcERzdGxpbmUpOworbW5nX3JldGNvZGUgbW5nX21hZ25pZnlfcmdiOF94MyAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBEc3RsaW5lKTsKK21uZ19yZXRjb2RlIG1uZ19tYWduaWZ5X2dhOF94MSAgICAgICAgIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1YLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcFNyY2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSk7CittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9nYThfeDIgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBTcmNsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcERzdGxpbmUpOworbW5nX3JldGNvZGUgbW5nX21hZ25pZnlfZ2E4X3gzICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBEc3RsaW5lKTsKK21uZ19yZXRjb2RlIG1uZ19tYWduaWZ5X2dhOF94NCAgICAgICAgIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1YLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcFNyY2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSk7CittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9nYThfeDUgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBTcmNsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcERzdGxpbmUpOworI2VuZGlmCittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9yZ2JhOF94MSAgICAgICAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBTcmNsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcERzdGxpbmUpOworbW5nX3JldGNvZGUgbW5nX21hZ25pZnlfcmdiYThfeDIgICAgICAgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBEc3RsaW5lKTsKK21uZ19yZXRjb2RlIG1uZ19tYWduaWZ5X3JnYmE4X3gzICAgICAgIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1YLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcFNyY2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSk7CittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9yZ2JhOF94NCAgICAgICAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBTcmNsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcERzdGxpbmUpOworbW5nX3JldGNvZGUgbW5nX21hZ25pZnlfcmdiYThfeDUgICAgICAgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBEc3RsaW5lKTsKKyNpZm5kZWYgTU5HX09QVElNSVpFX0ZPT1RQUklOVF9NQUdOCittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9nOF95MSAgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSk7CittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9nOF95MiAgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSk7CittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9nOF95MyAgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSk7CittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9yZ2I4X3kxICAgICAgICAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSk7CittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9yZ2I4X3kyICAgICAgICAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSk7CittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9yZ2I4X3kzICAgICAgICAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSk7CittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9nYThfeTEgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSk7CittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9nYThfeTIgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSk7CittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9nYThfeTMgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSk7CittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9nYThfeTQgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSk7CittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9nYThfeTUgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSk7CisjZW5kaWYKK21uZ19yZXRjb2RlIG1uZ19tYWduaWZ5X3JnYmE4X3kxICAgICAgIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBTcmNsaW5lMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBTcmNsaW5lMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBEc3RsaW5lKTsKK21uZ19yZXRjb2RlIG1uZ19tYWduaWZ5X3JnYmE4X3kyICAgICAgIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBTcmNsaW5lMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBTcmNsaW5lMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBEc3RsaW5lKTsKK21uZ19yZXRjb2RlIG1uZ19tYWduaWZ5X3JnYmE4X3kzICAgICAgIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBTcmNsaW5lMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBTcmNsaW5lMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBEc3RsaW5lKTsKK21uZ19yZXRjb2RlIG1uZ19tYWduaWZ5X3JnYmE4X3k0ICAgICAgIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBTcmNsaW5lMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBTcmNsaW5lMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBEc3RsaW5lKTsKK21uZ19yZXRjb2RlIG1uZ19tYWduaWZ5X3JnYmE4X3k1ICAgICAgIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICBpTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBTcmNsaW5lMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBTcmNsaW5lMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBEc3RsaW5lKTsKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyNpZm5kZWYgTU5HX09QVElNSVpFX0ZPT1RQUklOVF9NQUdOCittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9nMTZfeDEgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBTcmNsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcERzdGxpbmUpOworbW5nX3JldGNvZGUgbW5nX21hZ25pZnlfZzE2X3gyICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBEc3RsaW5lKTsKK21uZ19yZXRjb2RlIG1uZ19tYWduaWZ5X2cxNl94MyAgICAgICAgIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1YLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcFNyY2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSk7CittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9yZ2IxNl94MSAgICAgICAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBTcmNsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcERzdGxpbmUpOworbW5nX3JldGNvZGUgbW5nX21hZ25pZnlfcmdiMTZfeDIgICAgICAgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBEc3RsaW5lKTsKK21uZ19yZXRjb2RlIG1uZ19tYWduaWZ5X3JnYjE2X3gzICAgICAgIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1YLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcFNyY2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSk7CittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9nYTE2X3gxICAgICAgICAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBTcmNsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcERzdGxpbmUpOworbW5nX3JldGNvZGUgbW5nX21hZ25pZnlfZ2ExNl94MiAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBEc3RsaW5lKTsKK21uZ19yZXRjb2RlIG1uZ19tYWduaWZ5X2dhMTZfeDMgICAgICAgIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1YLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcFNyY2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSk7CittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9nYTE2X3g0ICAgICAgICAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBTcmNsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcERzdGxpbmUpOworbW5nX3JldGNvZGUgbW5nX21hZ25pZnlfZ2ExNl94NSAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBEc3RsaW5lKTsKK21uZ19yZXRjb2RlIG1uZ19tYWduaWZ5X3JnYmExNl94MSAgICAgIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1YLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcFNyY2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSk7CittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9yZ2JhMTZfeDIgICAgICAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBTcmNsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcERzdGxpbmUpOworbW5nX3JldGNvZGUgbW5nX21hZ25pZnlfcmdiYTE2X3gzICAgICAgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpTVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBEc3RsaW5lKTsKK21uZ19yZXRjb2RlIG1uZ19tYWduaWZ5X3JnYmExNl94NCAgICAgIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1YLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaU1SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcFNyY2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSk7CittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9yZ2JhMTZfeDUgICAgICAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2IGlNUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBTcmNsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcERzdGxpbmUpOworCittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9nMTZfeTEgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSk7CittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9nMTZfeTIgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSk7CittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9nMTZfeTMgICAgICAgICAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSk7CittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9yZ2IxNl95MSAgICAgICAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSk7CittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9yZ2IxNl95MiAgICAgICAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSk7CittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9yZ2IxNl95MyAgICAgICAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSk7CittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9nYTE2X3kxICAgICAgICAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSk7CittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9nYTE2X3kyICAgICAgICAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSk7CittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9nYTE2X3kzICAgICAgICAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSk7CittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9nYTE2X3k0ICAgICAgICAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSk7CittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9nYTE2X3k1ICAgICAgICAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSk7CittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9yZ2JhMTZfeTEgICAgICAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSk7CittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9yZ2JhMTZfeTIgICAgICAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSk7CittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9yZ2JhMTZfeTMgICAgICAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSk7CittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9yZ2JhMTZfeTQgICAgICAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSk7CittbmdfcmV0Y29kZSBtbmdfbWFnbmlmeV9yZ2JhMTZfeTUgICAgICAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjbGluZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwRHN0bGluZSk7CisjZW5kaWYKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogUEFTVCBjb21wb3NpdGlvbiByb3V0aW5lcyAtIGNvbXBvc2Ugb3Zlci91bmRlciB3aXRoIGEgdGFyZ2V0IG9iamVjdCAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX2NvbXBvc2VvdmVyX3JnYmE4ICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworI2lmbmRlZiBNTkdfU0tJUENIVU5LX1BBU1QKK21uZ19yZXRjb2RlIG1uZ19jb21wb3NldW5kZXJfcmdiYTggICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKKyNpZm5kZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKK21uZ19yZXRjb2RlIG1uZ19jb21wb3Nlb3Zlcl9yZ2JhMTYgICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKK21uZ19yZXRjb2RlIG1uZ19jb21wb3NldW5kZXJfcmdiYTE2ICAgIChtbmdfZGF0YXAgIHBEYXRhKTsKKyNlbmRpZgorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBQQVNUIGZsaXAgJiB0aWxlIHJvdXRpbmVzIC0gZmxpcCBvciB0aWxlIGEgcm93IG9mIHBpeGVscyAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfUEFTVAorbW5nX3JldGNvZGUgbW5nX2ZsaXBfcmdiYTggICAgICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworbW5nX3JldGNvZGUgbW5nX3RpbGVfcmdiYTggICAgICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorbW5nX3JldGNvZGUgbW5nX2ZsaXBfcmdiYTE2ICAgICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworbW5nX3JldGNvZGUgbW5nX3RpbGVfcmdiYTE2ICAgICAgICAgICAgKG1uZ19kYXRhcCAgcERhdGEpOworI2VuZGlmCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2VuZGlmIC8qIF9saWJtbmdfcGl4ZWxzX2hfICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqIGVuZCBvZiBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9MaWJNTkcvbGlibW5nX3Byb3BfeHMuYyBiL2ZpbGVzL1NvdXJjZS9MaWJNTkcvbGlibW5nX3Byb3BfeHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGU0MTZkCi0tLSAvZGV2L251bGwKKysrIGIvZmlsZXMvU291cmNlL0xpYk1ORy9saWJtbmdfcHJvcF94cy5jCkBAIC0wLDAgKzEsMjc5OSBAQAorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIGxpYm1uZy5oICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIHByb2plY3QgICA6IGxpYm1uZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBmaWxlICAgICAgOiBsaWJtbmdfcHJvcF94cy5jICAgICAgICAgIGNvcHlyaWdodCAoYykgMjAwMC0yMDA2IEcuSnV5biAgICogKi8KKy8qICogdmVyc2lvbiAgIDogMS4wLjEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBwdXJwb3NlICAgOiBwcm9wZXJ0eSBnZXQvc2V0IGludGVyZmFjZSAoaW1wbGVtZW50YXRpb24pICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGF1dGhvciAgICA6IEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogY29tbWVudCAgIDogaW1wbGVtZW50YXRpb24gb2YgdGhlIHByb3BlcnR5IGdldC9zZXQgZnVuY3Rpb25zICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBjaGFuZ2VzICAgOiAwLjUuMSAtIDA1LzA4LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaXhlZCBjYWxsaW5nIGNvbnZlbnRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2hhbmdlZCBzdHJpY3QtQU5TSSBzdHVmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMSAtIDA1LzExLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBzZXRfb3V0cHV0cHJvZmlsZTIgJiBzZXRfc3JnYnByb2ZpbGUyICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4xIC0gMDUvMTIvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNoYW5nZWQgdHJhY2UgdG8gbWFjcm8gZm9yIGNhbGxiYWNrIGVycm9yLXJlcG9ydGluZyAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4yIC0gMDUvMjMvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNoYW5nZWQgaW5jbHVzaW9uIG9mIGNtcy1yb3V0aW5lcyAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjIgLSAwNS8yNC8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgc3VwcG9ydCBmb3IgZ2V0L3NldCBkZWZhdWx0IHpsaWIvSUpHIHBhcm1zICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMiAtIDA1LzMxLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaXhlZCB1cCBwdW5jdHVhdGlvbiAoY29udHJpYnV0aW9uIGJ5IFRpbSBSb3dsZXkpICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4yIC0gMDYvMDUvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHN1cHBvcnQgZm9yIFJHQjhfQTggY2FudmFzc3R5bGUgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4zIC0gMDYvMjEvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGdldC9zZXQgZm9yIHNwZWVkdHlwZSB0byBmYWNpbGl0YXRlIHRlc3RpbmcgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBnZXQgZm9yIGltYWdlbGV2ZWwgZHVyaW5nIHByb2Nlc3N0ZXh0IGNhbGxiYWNrICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4zIC0gMDYvMjYvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNoYW5nZWQgdXNlcmRhdGEgdmFyaWFibGUgdG8gbW5nX3B0ciAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjMgLSAwNi8yOS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgaW5jb21wYXRpYmxlIHJldHVybi10eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjEgLSAwNy8wOC8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgZ2V0IHJvdXRpbmVzIGZvciBpbnRlcm5hbCBkaXNwbGF5IHZhcmlhYmxlcyAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGdldC9zZXQgcm91dGluZXMgZm9yIHN1c3BlbnNpb25tb2RlIHZhcmlhYmxlICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjEgLSAwNy8xNS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgZ2V0L3NldCByb3V0aW5lcyBmb3Igc2VjdGlvbmJyZWFrIHZhcmlhYmxlICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjIgLSAwNy8zMS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgc3RhdHVzX3h4eHggZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMiAtIDA4LzA1LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjaGFuZ2VkIGZpbGUtcHJlZml4ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMyAtIDEwLzEwLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBzdXBwb3J0IGZvciBhbHBoYS1kZXB0aCBwcmVkaWN0aW9uICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4zIC0gMTAvMTYvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGZ1bmN0aW9ucyB0byByZXRyaWV2ZSBQTkcvSk5HIHNwZWNpZmljIGhlYWRlci1pbmZvICogKi8KKy8qICogICAgICAgICAgICAgMC45LjMgLSAxMC8yMC8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgZ2V0L3NldCBmb3IgYktHRCBwcmVmZXJlbmNlIHNldHRpbmcgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMyAtIDEwLzIxLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBnZXQgZnVuY3Rpb24gZm9yIGludGVybGFjZS9wcm9ncmVzc2l2ZSBkaXNwbGF5ICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuMSAtIDA0LzIxLzIwMDEgLSBHLkp1eW4gKGNvZGUgYnkgRy5LZWxseSkgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBCR1JBOCBjYW52YXMgd2l0aCBwcmVtdWx0aXBsaWVkIGFscGhhICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC4xIC0gMDUvMDIvMjAwMSAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkICJkZWZhdWx0IiBzUkdCIGdlbmVyYXRpb24gKFRoYW5rcyBNYXJ0aSEpICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC4yIC0gMDYvMjMvMjAwMSAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIG9wdGltaXphdGlvbiBvcHRpb24gZm9yIE1ORy12aWRlbyBwbGF5YmFjayAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjIgLSAwNi8yNS8yMDAxIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgb3B0aW9uIHRvIHR1cm4gb2ZmIHByb2dyZXNzaXZlIHJlZnJlc2ggICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjMgLSAwOC8wNi8yMDAxIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgZ2V0IGZ1bmN0aW9uIGZvciBsYXN0IHByb2Nlc3NlZCBCQUNLIGNodW5rICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjQgLSAwNi8yMi8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gQjQ5NTQ0MiAtIGludmFsaWQgcmV0dXJudmFsdWUgaW4gbW5nX2dldF9zdXNwZW5zaW9ubW9kZSAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAwOS8xNC8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgZXZlbnQgaGFuZGxpbmcgZm9yIGR5bmFtaWMgTU5HICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDA5LzIyLzIwMDIgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBiZ3J4OCBjYW52YXMgKGZpbGxlciBieXRlKSAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC41IC0gMTEvMDcvMjAwMiAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHN1cHBvcnQgdG8gZ2V0IHRvdGFscyBhZnRlciBtbmdfcmVhZCgpICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC42IC0gMDUvMTEvMjAwMyAtIEcuIEp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGNvbmRpdGlvbmFscyBhcm91bmQgY2FudmFzIHVwZGF0ZSByb3V0aW5lcyAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjYgLSAwNy8wNy8yMDAzIC0gRy5SLVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgY29uZGl0aW9uYWxzIGFyb3VuZCBzb21lIEpORy1zdXBwb3J0aW5nIGNvZGUgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNiAtIDA3LzExLzIwMDMgLSBHLlItUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBjb25kaXRpb25hbHMgemxpYiBhbmQganBlZyBwcm9wZXJ0eSBhY2Nlc3NvcnMgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC42IC0gMDcvMTQvMjAwMyAtIEcuUi1QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGNvbmRpdGlvbmFscyBhcm91bmQgdmFyaW91cyB1bnVzZWQgZnVuY3Rpb25zICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC43IC0gMTEvMjcvMjAwMyAtIFIuQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIENBTlZBU19SR0I1NjUgYW5kIENBTlZBU19CR1I1NjUgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjcgLSAxMi8wNi8yMDAzIC0gUi5BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgQ0FOVkFTX1JHQkE1NjUgYW5kIENBTlZBU19CR1JBNTY1ICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNyAtIDAxLzI1LzIwMDQgLSBKLlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBwcmVtdWx0aXBsaWVkIGFscGhhIGNhbnZhcycgZm9yIFJHQkEsIEFSR0IsIEFCR1IgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC43IC0gMDMvMDcvMjAwNCAtIEcuUi1QLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIHB1dCBnYW1tYSwgY21zLXJlbGF0ZWQgZnVuY3Rpb25zIGluc2lkZSAjaWZkZWYgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC44IC0gMDQvMDIvMjAwNCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIENSQyBleGlzdGVuY2UgJiBjaGVja2luZyBmbGFncyAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC45IC0gMDkvMTgvMjAwNCAtIEcuUi1QLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHNvbWUgTU5HX1NVUFBPUlRfV1JJVEUgY29uZGl0aW9uYWxzICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjkgLSAxMC8wMy8yMDA0IC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgZnVuY3Rpb24gdG8gcmV0cmlldmUgY3VycmVudCBGUkFNIGRlbGF5ICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuOSAtIDEwLzE0LzIwMDQgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBiZ3I1NjVfYTggY2FudmFzLXN0eWxlICh0aGFua3MgdG8gSi4gRWx2YW5kZXIpICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC45IC0gMTIvMjAvMjAwNCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNsZWFuZWQgdXAgbWFjcm8taW52b2NhdGlvbnMgKHRoYW5rcyB0byBELiBBaXJsaWUpICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC4xMCAtIDAzLzA3LzIwMDYgLSAodGhhbmtzIHRvIFcuIE1hbnRoZXkpICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIENBTlZBU19SR0I1NTUgYW5kIENBTlZBU19CR1I1NTUgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaW5jbHVkZSAibGlibW5nLmgiCisjaW5jbHVkZSAibGlibW5nX2RhdGEuaCIKKyNpbmNsdWRlICJsaWJtbmdfZXJyb3IuaCIKKyNpbmNsdWRlICJsaWJtbmdfdHJhY2UuaCIKKyNpZmRlZiBfX0JPUkxBTkRDX18KKyNwcmFnbWEgaGRyc3RvcAorI2VuZGlmCisjaW5jbHVkZSAibGlibW5nX29iamVjdHMuaCIKKyNpbmNsdWRlICJsaWJtbmdfbWVtb3J5LmgiCisjaW5jbHVkZSAibGlibW5nX2Ntcy5oIgorCisjaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pICYmIGRlZmluZWQoTU5HX1NUUklDVF9BTlNJKQorI3ByYWdtYSBvcHRpb24gLUEgICAgICAgICAgICAgICAgICAgICAgLyogZm9yY2UgQU5TSS1DICovCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICBQcm9wZXJ0eSBzZXQgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19zZXRfdXNlcmRhdGEgKG1uZ19oYW5kbGUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wdHIgICAgcFVzZXJkYXRhKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9TRVRfVVNFUkRBVEEsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpCisgICgobW5nX2RhdGFwKWhIYW5kbGUpLT5wVXNlcmRhdGEgPSBwVXNlcmRhdGE7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU0VUX1VTRVJEQVRBLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3NldF9jYW52YXNzdHlsZSAobW5nX2hhbmRsZSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpU3R5bGUpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1NFVF9DQU5WQVNTVFlMRSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkKKworICBzd2l0Y2ggKGlTdHlsZSkKKyAgeworI2lmbmRlZiBNTkdfU0tJUENBTlZBU19SR0I4CisgICAgY2FzZSBNTkdfQ0FOVkFTX1JHQjggICAgOiBicmVhazsKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENBTlZBU19SR0JBOAorICAgIGNhc2UgTU5HX0NBTlZBU19SR0JBOCAgIDogYnJlYWs7CisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDQU5WQVNfUkdCQThfUE0KKyAgICBjYXNlIE1OR19DQU5WQVNfUkdCQThfUE06IGJyZWFrOworI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0FOVkFTX0FSR0I4CisgICAgY2FzZSBNTkdfQ0FOVkFTX0FSR0I4ICAgOiBicmVhazsKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENBTlZBU19BUkdCOF9QTQorICAgIGNhc2UgTU5HX0NBTlZBU19BUkdCOF9QTTogYnJlYWs7CisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDQU5WQVNfUkdCOF9BOAorICAgIGNhc2UgTU5HX0NBTlZBU19SR0I4X0E4IDogYnJlYWs7CisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDQU5WQVNfQkdSOAorICAgIGNhc2UgTU5HX0NBTlZBU19CR1I4ICAgIDogYnJlYWs7CisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDQU5WQVNfQkdSWDgKKyAgICBjYXNlIE1OR19DQU5WQVNfQkdSWDggICA6IGJyZWFrOworI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0FOVkFTX0JHUkE4CisgICAgY2FzZSBNTkdfQ0FOVkFTX0JHUkE4ICAgOiBicmVhazsKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENBTlZBU19CR1JBOF9QTQorICAgIGNhc2UgTU5HX0NBTlZBU19CR1JBOF9QTTogYnJlYWs7CisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDQU5WQVNfQUJHUjgKKyAgICBjYXNlIE1OR19DQU5WQVNfQUJHUjggICA6IGJyZWFrOworI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0FOVkFTX0FCR1I4X1BNCisgICAgY2FzZSBNTkdfQ0FOVkFTX0FCR1I4X1BNOiBicmVhazsKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENBTlZBU19SR0I1NjUKKyAgICBjYXNlIE1OR19DQU5WQVNfUkdCNTY1ICA6IGJyZWFrOworI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0FOVkFTX1JHQkE1NjUKKyAgICBjYXNlIE1OR19DQU5WQVNfUkdCQTU2NSA6IGJyZWFrOworI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0FOVkFTX0JHUjU2NQorICAgIGNhc2UgTU5HX0NBTlZBU19CR1I1NjUgIDogYnJlYWs7CisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDQU5WQVNfQkdSQTU2NQorICAgIGNhc2UgTU5HX0NBTlZBU19CR1JBNTY1IDogYnJlYWs7CisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDQU5WQVNfQkdSNTY1X0E4CisgICAgY2FzZSBNTkdfQ0FOVkFTX0JHUjU2NV9BOCA6IGJyZWFrOworI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0FOVkFTX1JHQjU1NQorICAgIGNhc2UgTU5HX0NBTlZBU19SR0I1NTUgIDogYnJlYWs7CisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDQU5WQVNfQkdSNTU1CisgICAgY2FzZSBNTkdfQ0FOVkFTX0JHUjU1NSAgOiBicmVhazsKKyNlbmRpZgorLyogICAgY2FzZSBNTkdfQ0FOVkFTX1JHQjE2ICAgOiBicmVhazsgKi8KKy8qICAgIGNhc2UgTU5HX0NBTlZBU19SR0JBMTYgIDogYnJlYWs7ICovCisvKiAgICBjYXNlIE1OR19DQU5WQVNfQVJHQjE2ICA6IGJyZWFrOyAqLworLyogICAgY2FzZSBNTkdfQ0FOVkFTX0JHUjE2ICAgOiBicmVhazsgKi8KKy8qICAgIGNhc2UgTU5HX0NBTlZBU19CR1JBMTYgIDogYnJlYWs7ICovCisvKiAgICBjYXNlIE1OR19DQU5WQVNfQUJHUjE2ICA6IGJyZWFrOyAqLworLyogICAgY2FzZSBNTkdfQ0FOVkFTX0lOREVYOCAgOiBicmVhazsgKi8KKy8qICAgIGNhc2UgTU5HX0NBTlZBU19JTkRFWEE4IDogYnJlYWs7ICovCisvKiAgICBjYXNlIE1OR19DQU5WQVNfQUlOREVYOCA6IGJyZWFrOyAqLworLyogICAgY2FzZSBNTkdfQ0FOVkFTX0dSQVk4ICAgOiBicmVhazsgKi8KKy8qICAgIGNhc2UgTU5HX0NBTlZBU19HUkFZMTYgIDogYnJlYWs7ICovCisvKiAgICBjYXNlIE1OR19DQU5WQVNfR1JBWUE4ICA6IGJyZWFrOyAqLworLyogICAgY2FzZSBNTkdfQ0FOVkFTX0dSQVlBMTYgOiBicmVhazsgKi8KKy8qICAgIGNhc2UgTU5HX0NBTlZBU19BR1JBWTggIDogYnJlYWs7ICovCisvKiAgICBjYXNlIE1OR19DQU5WQVNfQUdSQVkxNiA6IGJyZWFrOyAqLworLyogICAgY2FzZSBNTkdfQ0FOVkFTX0RYMTUgICAgOiBicmVhazsgKi8KKy8qICAgIGNhc2UgTU5HX0NBTlZBU19EWDE2ICAgIDogYnJlYWs7ICovCisgICAgZGVmYXVsdCAgICAgICAgICAgICAgICAgOiB7IE1OR19FUlJPUiAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19JTlZBTElEQ05WU1RZTEUpIH07CisgIH0KKworICAoKG1uZ19kYXRhcCloSGFuZGxlKS0+aUNhbnZhc3N0eWxlID0gaVN0eWxlOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1NFVF9DQU5WQVNTVFlMRSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19zZXRfYmtnZHN0eWxlIChtbmdfaGFuZGxlIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpU3R5bGUpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1NFVF9CS0dEU1RZTEUsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpCisKKyAgc3dpdGNoIChpU3R5bGUpICAgICAgICAgICAgICAgICAgICAgIC8qIGFscGhhLW1vZGVzIG5vdCBzdXBwb3J0ZWQgKi8KKyAgeworI2lmbmRlZiBNTkdfU0tJUENBTlZBU19SR0I4CisgICAgY2FzZSBNTkdfQ0FOVkFTX1JHQjggICAgOiBicmVhazsKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENBTlZBU19CR1I4CisgICAgY2FzZSBNTkdfQ0FOVkFTX0JHUjggICAgOiBicmVhazsKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENBTlZBU19CR1JYOAorICAgIGNhc2UgTU5HX0NBTlZBU19CR1JYOCAgIDogYnJlYWs7CisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDQU5WQVNfUkdCNTY1CisgICAgY2FzZSBNTkdfQ0FOVkFTX1JHQjU2NSAgOiBicmVhazsKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENBTlZBU19CR1I1NjUKKyAgICBjYXNlIE1OR19DQU5WQVNfQkdSNTY1ICA6IGJyZWFrOworI2VuZGlmCisvKiAgICBjYXNlIE1OR19DQU5WQVNfUkdCMTYgICA6IGJyZWFrOyAqLworLyogICAgY2FzZSBNTkdfQ0FOVkFTX0JHUjE2ICAgOiBicmVhazsgKi8KKy8qICAgIGNhc2UgTU5HX0NBTlZBU19JTkRFWDggIDogYnJlYWs7ICovCisvKiAgICBjYXNlIE1OR19DQU5WQVNfR1JBWTggICA6IGJyZWFrOyAqLworLyogICAgY2FzZSBNTkdfQ0FOVkFTX0dSQVkxNiAgOiBicmVhazsgKi8KKy8qICAgIGNhc2UgTU5HX0NBTlZBU19EWDE1ICAgIDogYnJlYWs7ICovCisvKiAgICBjYXNlIE1OR19DQU5WQVNfRFgxNiAgICA6IGJyZWFrOyAqLworICAgIGRlZmF1bHQgICAgICAgICAgICAgICAgIDogTU5HX0VSUk9SICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0lOVkFMSURDTlZTVFlMRSk7CisgIH0KKworICAoKG1uZ19kYXRhcCloSGFuZGxlKS0+aUJrZ2RzdHlsZSA9IGlTdHlsZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9TRVRfQktHRFNUWUxFLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3NldF9iZ2NvbG9yIChtbmdfaGFuZGxlIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaVJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiBpR3JlZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYgaUJsdWUpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1NFVF9CR0NPTE9SLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFIChoSGFuZGxlKQorICAoKG1uZ19kYXRhcCloSGFuZGxlKS0+aUJHcmVkICAgPSBpUmVkOworICAoKG1uZ19kYXRhcCloSGFuZGxlKS0+aUJHZ3JlZW4gPSBpR3JlZW47CisgICgobW5nX2RhdGFwKWhIYW5kbGUpLT5pQkdibHVlICA9IGlCbHVlOworICAoKG1uZ19kYXRhcCloSGFuZGxlKS0+YlVzZUJLR0QgPSBNTkdfRkFMU0U7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU0VUX0JHQ09MT1IsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfc2V0X3VzZWJrZ2QgKG1uZ19oYW5kbGUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2Jvb2wgICBiVXNlQktHRCkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU0VUX1VTRUJLR0QsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpCisgICgobW5nX2RhdGFwKWhIYW5kbGUpLT5iVXNlQktHRCA9IGJVc2VCS0dEOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1NFVF9VU0VCS0dELCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3NldF9zdG9yZWNodW5rcyAobW5nX2hhbmRsZSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2Jvb2wgICBiU3RvcmVjaHVua3MpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1NFVF9TVE9SRUNIVU5LUywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkKKyAgKChtbmdfZGF0YXApaEhhbmRsZSktPmJTdG9yZWNodW5rcyA9IGJTdG9yZWNodW5rczsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9TRVRfU1RPUkVDSFVOS1MsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfc2V0X3NlY3Rpb25icmVha3MgKG1uZ19oYW5kbGUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2Jvb2wgICBiU2VjdGlvbmJyZWFrcykKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU0VUX1NFQ1RJT05CUkVBS1MsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpCisgICgobW5nX2RhdGFwKWhIYW5kbGUpLT5iU2VjdGlvbmJyZWFrcyA9IGJTZWN0aW9uYnJlYWtzOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1NFVF9TRUNUSU9OQlJFQUtTLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3NldF9jYWNoZXBsYXliYWNrIChtbmdfaGFuZGxlIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgYkNhY2hlcGxheWJhY2spCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1NFVF9DQUNIRVBMQVlCQUNLLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFIChoSGFuZGxlKQorCisgIGlmICgoKG1uZ19kYXRhcCloSGFuZGxlKS0+Ykhhc2hlYWRlcikKKyAgICBNTkdfRVJST1IgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRlVOQ1RJT05JTlZBTElEKTsKKworICAoKG1uZ19kYXRhcCloSGFuZGxlKS0+YkNhY2hlcGxheWJhY2sgPSBiQ2FjaGVwbGF5YmFjazsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9TRVRfQ0FDSEVQTEFZQkFDSywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19zZXRfZG9wcm9ncmVzc2l2ZSAobW5nX2hhbmRsZSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfYm9vbCAgIGJEb1Byb2dyZXNzaXZlKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9TRVRfRE9QUk9HUkVTU0lWRSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkKKworICAoKG1uZ19kYXRhcCloSGFuZGxlKS0+YkRvUHJvZ3Jlc3NpdmUgPSBiRG9Qcm9ncmVzc2l2ZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9TRVRfRE9QUk9HUkVTU0lWRSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19zZXRfY3JjbW9kZSAobW5nX2hhbmRsZSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlDcmNtb2RlKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9TRVRfQ1JDTU9ERSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkKKworICAoKG1uZ19kYXRhcCloSGFuZGxlKS0+aUNyY21vZGUgPSBpQ3JjbW9kZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9TRVRfQ1JDTU9ERSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfc2V0X3NyZ2IgKG1uZ19oYW5kbGUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2Jvb2wgICBiSXNzUkdCKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9TRVRfU1JHQiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkKKyAgKChtbmdfZGF0YXApaEhhbmRsZSktPmJJc3NSR0IgPSBiSXNzUkdCOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1NFVF9TUkdCLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfaUNDUAorbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3NldF9vdXRwdXRwcm9maWxlIChtbmdfaGFuZGxlIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wY2hhciAgekZpbGVuYW1lKQoreworI2lmZGVmIE1OR19JTkNMVURFX0xDTVMKKyAgbW5nX2RhdGFwIHBEYXRhOworI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU0VUX09VVFBVVFBST0ZJTEUsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworI2lmZGVmIE1OR19JTkNMVURFX0xDTVMKKyAgTU5HX1ZBTElESEFORExFIChoSGFuZGxlKQorCisgIHBEYXRhID0gKG1uZ19kYXRhcCloSGFuZGxlOyAgICAgICAgICAvKiBhZGRyZXNzIHRoZSBzdHJ1Y3R1cmUgKi8KKworICBpZiAocERhdGEtPmhQcm9mMikgICAgICAgICAgICAgICAgICAgLyogcHJldmlvdXNseSBkZWZpbmVkID8gKi8KKyAgICBtbmdsY21zX2ZyZWVwcm9maWxlIChwRGF0YS0+aFByb2YyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFsbG9jYXRlIG5ldyBDTVMgcHJvZmlsZSBoYW5kbGUgKi8KKyAgcERhdGEtPmhQcm9mMiA9IG1uZ2xjbXNfY3JlYXRlZmlsZXByb2ZpbGUgKHpGaWxlbmFtZSk7CisKKyAgaWYgKCFwRGF0YS0+aFByb2YyKSAgICAgICAgICAgICAgICAgIC8qIGhhbmRsZSBlcnJvciA/ICovCisgICAgTU5HX0VSUk9STCAocERhdGEsIE1OR19MQ01TX05PSEFORExFKTsKKyNlbmRpZiAvKiBNTkdfSU5DTFVERV9MQ01TICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU0VUX09VVFBVVFBST0ZJTEUsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisjZW5kaWYgLyogTU5HX1NVUFBPUlRfRElTUExBWSAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorI2lmbmRlZiBNTkdfU0tJUENIVU5LX2lDQ1AKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19zZXRfb3V0cHV0cHJvZmlsZTIgKG1uZ19oYW5kbGUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaVByb2ZpbGVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3B0ciAgICBwUHJvZmlsZSkKK3sKKyNpZmRlZiBNTkdfSU5DTFVERV9MQ01TCisgIG1uZ19kYXRhcCBwRGF0YTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1NFVF9PVVRQVVRQUk9GSUxFMiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX0lOQ0xVREVfTENNUworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpCisKKyAgcERhdGEgPSAobW5nX2RhdGFwKWhIYW5kbGU7ICAgICAgICAgIC8qIGFkZHJlc3MgdGhlIHN0cnVjdHVyZSAqLworCisgIGlmIChwRGF0YS0+aFByb2YyKSAgICAgICAgICAgICAgICAgICAvKiBwcmV2aW91c2x5IGRlZmluZWQgPyAqLworICAgIG1uZ2xjbXNfZnJlZXByb2ZpbGUgKHBEYXRhLT5oUHJvZjIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWxsb2NhdGUgbmV3IENNUyBwcm9maWxlIGhhbmRsZSAqLworICBwRGF0YS0+aFByb2YyID0gbW5nbGNtc19jcmVhdGVtZW1wcm9maWxlIChpUHJvZmlsZXNpemUsIHBQcm9maWxlKTsKKworICBpZiAoIXBEYXRhLT5oUHJvZjIpICAgICAgICAgICAgICAgICAgLyogaGFuZGxlIGVycm9yID8gKi8KKyAgICBNTkdfRVJST1JMIChwRGF0YSwgTU5HX0xDTVNfTk9IQU5ETEUpOworI2VuZGlmIC8qIE1OR19JTkNMVURFX0xDTVMgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9TRVRfT1VUUFVUUFJPRklMRTIsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisjZW5kaWYgLyogTU5HX1NVUFBPUlRfRElTUExBWSAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfc2V0X291dHB1dHNyZ2IgKG1uZ19oYW5kbGUgaEhhbmRsZSkKK3sKKyNpZmRlZiBNTkdfSU5DTFVERV9MQ01TCisgIG1uZ19kYXRhcCBwRGF0YTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1NFVF9PVVRQVVRTUkdCLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyNpZmRlZiBNTkdfSU5DTFVERV9MQ01TCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkKKworICBwRGF0YSA9IChtbmdfZGF0YXApaEhhbmRsZTsgICAgICAgICAgLyogYWRkcmVzcyB0aGUgc3RydWN0dXJlICovCisKKyAgaWYgKHBEYXRhLT5oUHJvZjIpICAgICAgICAgICAgICAgICAgIC8qIHByZXZpb3VzbHkgZGVmaW5lZCA/ICovCisgICAgbW5nbGNtc19mcmVlcHJvZmlsZSAocERhdGEtPmhQcm9mMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbGxvY2F0ZSBuZXcgQ01TIHByb2ZpbGUgaGFuZGxlICovCisgIHBEYXRhLT5oUHJvZjIgPSBtbmdsY21zX2NyZWF0ZXNyZ2Jwcm9maWxlICgpOworCisgIGlmICghcERhdGEtPmhQcm9mMikgICAgICAgICAgICAgICAgICAvKiBoYW5kbGUgZXJyb3IgPyAqLworICAgIE1OR19FUlJPUkwgKHBEYXRhLCBNTkdfTENNU19OT0hBTkRMRSk7CisjZW5kaWYgLyogTU5HX0lOQ0xVREVfTENNUyAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1NFVF9PVVRQVVRTUkdCLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX0RJU1BMQVkKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19zZXRfc3JnYnByb2ZpbGUgKG1uZ19oYW5kbGUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wY2hhciAgekZpbGVuYW1lKQoreworI2lmZGVmIE1OR19JTkNMVURFX0xDTVMKKyAgbW5nX2RhdGFwIHBEYXRhOworI2VuZGlmCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU0VUX1NSR0JQUk9GSUxFMiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX0lOQ0xVREVfTENNUworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpCisKKyAgcERhdGEgPSAobW5nX2RhdGFwKWhIYW5kbGU7ICAgICAgICAgIC8qIGFkZHJlc3MgdGhlIHN0cnVjdHVyZSAqLworCisgIGlmIChwRGF0YS0+aFByb2YzKSAgICAgICAgICAgICAgICAgICAvKiBwcmV2aW91c2x5IGRlZmluZWQgPyAqLworICAgIG1uZ2xjbXNfZnJlZXByb2ZpbGUgKHBEYXRhLT5oUHJvZjMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWxsb2NhdGUgbmV3IENNUyBwcm9maWxlIGhhbmRsZSAqLworICBwRGF0YS0+aFByb2YzID0gbW5nbGNtc19jcmVhdGVmaWxlcHJvZmlsZSAoekZpbGVuYW1lKTsKKworICBpZiAoIXBEYXRhLT5oUHJvZjMpICAgICAgICAgICAgICAgICAgLyogaGFuZGxlIGVycm9yID8gKi8KKyAgICBNTkdfRVJST1JMIChwRGF0YSwgTU5HX0xDTVNfTk9IQU5ETEUpOworI2VuZGlmIC8qIE1OR19JTkNMVURFX0xDTVMgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9TRVRfU1JHQlBST0ZJTEUyLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfc2V0X3NyZ2Jwcm9maWxlMiAobW5nX2hhbmRsZSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaVByb2ZpbGVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wdHIgICAgcFByb2ZpbGUpCit7CisjaWZkZWYgTU5HX0lOQ0xVREVfTENNUworICBtbmdfZGF0YXAgcERhdGE7CisjZW5kaWYKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9TRVRfU1JHQlBST0ZJTEUsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworI2lmZGVmIE1OR19JTkNMVURFX0xDTVMKKyAgTU5HX1ZBTElESEFORExFIChoSGFuZGxlKQorCisgIHBEYXRhID0gKG1uZ19kYXRhcCloSGFuZGxlOyAgICAgICAgICAvKiBhZGRyZXNzIHRoZSBzdHJ1Y3R1cmUgKi8KKworICBpZiAocERhdGEtPmhQcm9mMykgICAgICAgICAgICAgICAgICAgLyogcHJldmlvdXNseSBkZWZpbmVkID8gKi8KKyAgICBtbmdsY21zX2ZyZWVwcm9maWxlIChwRGF0YS0+aFByb2YzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFsbG9jYXRlIG5ldyBDTVMgcHJvZmlsZSBoYW5kbGUgKi8KKyAgcERhdGEtPmhQcm9mMyA9IG1uZ2xjbXNfY3JlYXRlbWVtcHJvZmlsZSAoaVByb2ZpbGVzaXplLCBwUHJvZmlsZSk7CisKKyAgaWYgKCFwRGF0YS0+aFByb2YzKSAgICAgICAgICAgICAgICAgIC8qIGhhbmRsZSBlcnJvciA/ICovCisgICAgTU5HX0VSUk9STCAocERhdGEsIE1OR19MQ01TX05PSEFORExFKTsKKyNlbmRpZiAvKiBNTkdfSU5DTFVERV9MQ01TICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU0VUX1NSR0JQUk9GSUxFLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19zZXRfc3JnYmltcGxpY2l0IChtbmdfaGFuZGxlIGhIYW5kbGUpCit7CisjaWZkZWYgTU5HX0lOQ0xVREVfTENNUworICBtbmdfZGF0YXAgcERhdGE7CisjZW5kaWYKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9TRVRfU1JHQklNUExJQ0lULCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyNpZmRlZiBNTkdfSU5DTFVERV9MQ01TCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkKKworICBwRGF0YSA9IChtbmdfZGF0YXApaEhhbmRsZTsgICAgICAgICAgLyogYWRkcmVzcyB0aGUgc3RydWN0dXJlICovCisKKyAgaWYgKHBEYXRhLT5oUHJvZjMpICAgICAgICAgICAgICAgICAgIC8qIHByZXZpb3VzbHkgZGVmaW5lZCA/ICovCisgICAgbW5nbGNtc19mcmVlcHJvZmlsZSAocERhdGEtPmhQcm9mMyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbGxvY2F0ZSBuZXcgQ01TIHByb2ZpbGUgaGFuZGxlICovCisgIHBEYXRhLT5oUHJvZjMgPSBtbmdsY21zX2NyZWF0ZXNyZ2Jwcm9maWxlICgpOworCisgIGlmICghcERhdGEtPmhQcm9mMykgICAgICAgICAgICAgICAgICAvKiBoYW5kbGUgZXJyb3IgPyAqLworICAgIE1OR19FUlJPUkwgKHBEYXRhLCBNTkdfTENNU19OT0hBTkRMRSk7CisjZW5kaWYgLyogTU5HX0lOQ0xVREVfTENNUyAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1NFVF9TUkdCSU1QTElDSVQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWYgZGVmaW5lZChNTkdfRlVMTF9DTVMpIHx8IGRlZmluZWQoTU5HX0dBTU1BX09OTFkpIHx8IGRlZmluZWQoTU5HX0FQUF9DTVMpCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfc2V0X3ZpZXdnYW1tYSAobW5nX2hhbmRsZSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19mbG9hdCAgZEdhbW1hKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9TRVRfVklFV0dBTU1BLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFIChoSGFuZGxlKQorICAoKG1uZ19kYXRhcCloSGFuZGxlKS0+ZFZpZXdnYW1tYSA9IGRHYW1tYTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9TRVRfVklFV0dBTU1BLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfc2V0X2Rpc3BsYXlnYW1tYSAobW5nX2hhbmRsZSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19mbG9hdCAgZEdhbW1hKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9TRVRfRElTUExBWUdBTU1BLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFIChoSGFuZGxlKQorICAoKG1uZ19kYXRhcCloSGFuZGxlKS0+ZERpc3BsYXlnYW1tYSA9IGRHYW1tYTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9TRVRfRElTUExBWUdBTU1BLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3NldF9kZmx0aW1nZ2FtbWEgKG1uZ19oYW5kbGUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfZmxvYXQgIGRHYW1tYSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU0VUX0RGTFRJTUdHQU1NQSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkKKyAgKChtbmdfZGF0YXApaEhhbmRsZSktPmREZmx0aW1nZ2FtbWEgPSBkR2FtbWE7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU0VUX0RGTFRJTUdHQU1NQSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZiBkZWZpbmVkKE1OR19GVUxMX0NNUykgfHwgZGVmaW5lZChNTkdfR0FNTUFfT05MWSkgfHwgZGVmaW5lZChNTkdfQVBQX0NNUykKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19zZXRfdmlld2dhbW1haW50IChtbmdfaGFuZGxlIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpR2FtbWEpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1NFVF9WSUVXR0FNTUEsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpCisgICgobW5nX2RhdGFwKWhIYW5kbGUpLT5kVmlld2dhbW1hID0gKG1uZ19mbG9hdClpR2FtbWEgLyAxMDAwMDA7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU0VUX1ZJRVdHQU1NQSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3NldF9kaXNwbGF5Z2FtbWFpbnQgKG1uZ19oYW5kbGUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlHYW1tYSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU0VUX0RJU1BMQVlHQU1NQSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkKKyAgKChtbmdfZGF0YXApaEhhbmRsZSktPmREaXNwbGF5Z2FtbWEgPSAobW5nX2Zsb2F0KWlHYW1tYSAvIDEwMDAwMDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9TRVRfRElTUExBWUdBTU1BLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fREZMVF9JTkZPCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfc2V0X2RmbHRpbWdnYW1tYWludCAobW5nX2hhbmRsZSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaUdhbW1hKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9TRVRfREZMVElNR0dBTU1BLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFIChoSGFuZGxlKQorICAoKG1uZ19kYXRhcCloSGFuZGxlKS0+ZERmbHRpbWdnYW1tYSA9IChtbmdfZmxvYXQpaUdhbW1hIC8gMTAwMDAwOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1NFVF9ERkxUSU1HR0FNTUEsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX1NLSVBfTUFYQ0FOVkFTCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfc2V0X21heGNhbnZhc3dpZHRoIChtbmdfaGFuZGxlIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlNYXh3aWR0aCkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU0VUX01BWENBTlZBU1dJRFRILCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFIChoSGFuZGxlKQorICAoKG1uZ19kYXRhcCloSGFuZGxlKS0+aU1heHdpZHRoID0gaU1heHdpZHRoOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1NFVF9NQVhDQU5WQVNXSURUSCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19zZXRfbWF4Y2FudmFzaGVpZ2h0IChtbmdfaGFuZGxlIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpTWF4aGVpZ2h0KQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9TRVRfTUFYQ0FOVkFTSEVJR0hULCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFIChoSGFuZGxlKQorICAoKG1uZ19kYXRhcCloSGFuZGxlKS0+aU1heGhlaWdodCA9IGlNYXhoZWlnaHQ7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU0VUX01BWENBTlZBU0hFSUdIVCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19zZXRfbWF4Y2FudmFzc2l6ZSAobW5nX2hhbmRsZSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlNYXh3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpTWF4aGVpZ2h0KQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9TRVRfTUFYQ0FOVkFTU0laRSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkKKyAgKChtbmdfZGF0YXApaEhhbmRsZSktPmlNYXh3aWR0aCAgPSBpTWF4d2lkdGg7CisgICgobW5nX2RhdGFwKWhIYW5kbGUpLT5pTWF4aGVpZ2h0ID0gaU1heGhlaWdodDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9TRVRfTUFYQ0FOVkFTU0laRSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19JTkNMVURFX1pMSUIKKyNpZmRlZiBNTkdfQUNDRVNTX1pMSUIKKyNpZmRlZiBNTkdfU1VQUE9SVF9XUklURQorbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3NldF96bGliX2xldmVsIChtbmdfaGFuZGxlIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaVpsZXZlbCkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU0VUX1pMSUJfTEVWRUwsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpCisgICgobW5nX2RhdGFwKWhIYW5kbGUpLT5pWmxldmVsID0gaVpsZXZlbDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9TRVRfWkxJQl9MRVZFTCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfV1JJVEUgKi8KKyNlbmRpZiAvKiBNTkdfQUNDRVNTX1pMSUIgKi8KKyNlbmRpZiAvKiBNTkdfSU5DTFVERV9aTElCICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfSU5DTFVERV9aTElCCisjaWZkZWYgTU5HX0FDQ0VTU19aTElCCisjaWZkZWYgTU5HX1NVUFBPUlRfV1JJVEUKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19zZXRfemxpYl9tZXRob2QgKG1uZ19oYW5kbGUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaVptZXRob2QpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1NFVF9aTElCX01FVEhPRCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkKKyAgKChtbmdfZGF0YXApaEhhbmRsZSktPmlabWV0aG9kID0gaVptZXRob2Q7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU0VUX1pMSUJfTUVUSE9ELCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9XUklURSAqLworI2VuZGlmIC8qIE1OR19BQ0NFU1NfWkxJQiAqLworI2VuZGlmIC8qIE1OR19JTkNMVURFX1pMSUIgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19JTkNMVURFX1pMSUIKKyNpZmRlZiBNTkdfQUNDRVNTX1pMSUIKKyNpZmRlZiBNTkdfU1VQUE9SVF9XUklURQorbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3NldF96bGliX3dpbmRvd2JpdHMgKG1uZ19oYW5kbGUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlad2luZG93Yml0cykKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU0VUX1pMSUJfV0lORE9XQklUUywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkKKyAgKChtbmdfZGF0YXApaEhhbmRsZSktPmlad2luZG93Yml0cyA9IGlad2luZG93Yml0czsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9TRVRfWkxJQl9XSU5ET1dCSVRTLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9XUklURSAqLworI2VuZGlmIC8qIE1OR19BQ0NFU1NfWkxJQiAqLworI2VuZGlmIC8qIE1OR19JTkNMVURFX1pMSUIgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19JTkNMVURFX1pMSUIKKyNpZmRlZiBNTkdfQUNDRVNTX1pMSUIKKyNpZmRlZiBNTkdfU1VQUE9SVF9XUklURQorbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3NldF96bGliX21lbWxldmVsIChtbmdfaGFuZGxlIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaVptZW1sZXZlbCkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU0VUX1pMSUJfTUVNTEVWRUwsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpCisgICgobW5nX2RhdGFwKWhIYW5kbGUpLT5pWm1lbWxldmVsID0gaVptZW1sZXZlbDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9TRVRfWkxJQl9NRU1MRVZFTCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfV1JJVEUgKi8KKyNlbmRpZiAvKiBNTkdfQUNDRVNTX1pMSUIgKi8KKyNlbmRpZiAvKiBNTkdfSU5DTFVERV9aTElCICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfSU5DTFVERV9aTElCCisjaWZkZWYgTU5HX0FDQ0VTU19aTElCCisjaWZkZWYgTU5HX1NVUFBPUlRfV1JJVEUKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19zZXRfemxpYl9zdHJhdGVneSAobW5nX2hhbmRsZSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlac3RyYXRlZ3kpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1NFVF9aTElCX1NUUkFURUdZLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFIChoSGFuZGxlKQorICAoKG1uZ19kYXRhcCloSGFuZGxlKS0+aVpzdHJhdGVneSA9IGlac3RyYXRlZ3k7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU0VUX1pMSUJfU1RSQVRFR1ksIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmIC8qIE1OR19TVVBQT1JUX1dSSVRFICovCisjZW5kaWYgLyogTU5HX0FDQ0VTU19aTElCICovCisjZW5kaWYgLyogTU5HX0lOQ0xVREVfWkxJQiAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX0lOQ0xVREVfWkxJQgorI2lmZGVmIE1OR19BQ0NFU1NfWkxJQgorI2lmZGVmIE1OR19TVVBQT1JUX1dSSVRFCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfc2V0X3psaWJfbWF4aWRhdCAobW5nX2hhbmRsZSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaU1heElEQVQpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1NFVF9aTElCX01BWElEQVQsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpCisgICgobW5nX2RhdGFwKWhIYW5kbGUpLT5pTWF4SURBVCA9IGlNYXhJREFUOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1NFVF9aTElCX01BWElEQVQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmIC8qIE1OR19TVVBQT1JUX1dSSVRFICovCisjZW5kaWYgLyogTU5HX0FDQ0VTU19aTElCICovCisjZW5kaWYgLyogTU5HX0lOQ0xVREVfWkxJQiAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisjaWZkZWYgTU5HX0FDQ0VTU19KUEVHCisjaWZkZWYgTU5HX1NVUFBPUlRfV1JJVEUKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19zZXRfanBlZ19kY3RtZXRob2QgKG1uZ19oYW5kbGUgICAgICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdqcGVnX2RjdG1ldGhvZCBlSlBFR2RjdG1ldGhvZCkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU0VUX0pQRUdfRENUTUVUSE9ELCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFIChoSGFuZGxlKQorICAoKG1uZ19kYXRhcCloSGFuZGxlKS0+ZUpQRUdkY3RtZXRob2QgPSBlSlBFR2RjdG1ldGhvZDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9TRVRfSlBFR19EQ1RNRVRIT0QsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmIE1OR19TVVBQT1JUX1dSSVRFCisjZW5kaWYgLyogTU5HX0FDQ0VTU19KUEVHICovCisjZW5kaWYgLyogTU5HX0lOQ0xVREVfSk5HICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyNpZmRlZiBNTkdfQUNDRVNTX0pQRUcKKyNpZmRlZiBNTkdfU1VQUE9SVF9XUklURQorbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX3NldF9qcGVnX3F1YWxpdHkgKG1uZ19oYW5kbGUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgIGlKUEVHcXVhbGl0eSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU0VUX0pQRUdfUVVBTElUWSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkKKyAgKChtbmdfZGF0YXApaEhhbmRsZSktPmlKUEVHcXVhbGl0eSA9IGlKUEVHcXVhbGl0eTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9TRVRfSlBFR19RVUFMSVRZLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9XUklURSAqLworI2VuZGlmIC8qIE1OR19BQ0NFU1NfSlBFRyAqLworI2VuZGlmIC8qIE1OR19JTkNMVURFX0pORyAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisjaWZkZWYgTU5HX0FDQ0VTU19KUEVHCisjaWZkZWYgTU5HX1NVUFBPUlRfV1JJVEUKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19zZXRfanBlZ19zbW9vdGhpbmcgKG1uZ19oYW5kbGUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgaUpQRUdzbW9vdGhpbmcpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1NFVF9KUEVHX1NNT09USElORywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkKKyAgKChtbmdfZGF0YXApaEhhbmRsZSktPmlKUEVHc21vb3RoaW5nID0gaUpQRUdzbW9vdGhpbmc7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU0VUX0pQRUdfU01PT1RISU5HLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9XUklURSAqLworI2VuZGlmIC8qIE1OR19BQ0NFU1NfSlBFRyAqLworI2VuZGlmIC8qIE1OR19JTkNMVURFX0pORyAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisjaWZkZWYgTU5HX0FDQ0VTU19KUEVHCisjaWZkZWYgTU5HX1NVUFBPUlRfV1JJVEUKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19zZXRfanBlZ19wcm9ncmVzc2l2ZSAobW5nX2hhbmRsZSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfYm9vbCAgIGJKUEVHcHJvZ3Jlc3NpdmUpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1NFVF9KUEVHX1BST0dSRVNTSVZFLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFIChoSGFuZGxlKQorICAoKG1uZ19kYXRhcCloSGFuZGxlKS0+YkpQRUdjb21wcmVzc3Byb2dyID0gYkpQRUdwcm9ncmVzc2l2ZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9TRVRfSlBFR19QUk9HUkVTU0lWRSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfV1JJVEUgKi8KKyNlbmRpZiAvKiBNTkdfQUNDRVNTX0pQRUcgKi8KKyNlbmRpZiAvKiBNTkdfSU5DTFVERV9KTkcgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19JTkNMVURFX0pORworI2lmZGVmIE1OR19BQ0NFU1NfSlBFRworI2lmZGVmIE1OR19TVVBQT1JUX1dSSVRFCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfc2V0X2pwZWdfb3B0aW1pemVkIChtbmdfaGFuZGxlIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfYm9vbCAgIGJKUEVHb3B0aW1pemVkKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9TRVRfSlBFR19PUFRJTUlaRUQsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpCisgICgobW5nX2RhdGFwKWhIYW5kbGUpLT5iSlBFR2NvbXByZXNzb3B0ID0gYkpQRUdvcHRpbWl6ZWQ7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU0VUX0pQRUdfT1BUSU1JWkVELCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9XUklURSAqLworI2VuZGlmIC8qIE1OR19BQ0NFU1NfSlBFRyAqLworI2VuZGlmIC8qIE1OR19JTkNMVURFX0pORyAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisjaWZkZWYgTU5HX0FDQ0VTU19KUEVHCisjaWZkZWYgTU5HX1NVUFBPUlRfV1JJVEUKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19zZXRfanBlZ19tYXhqZGF0IChtbmdfaGFuZGxlIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpTWF4SkRBVCkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU0VUX0pQRUdfTUFYSkRBVCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkKKyAgKChtbmdfZGF0YXApaEhhbmRsZSktPmlNYXhKREFUID0gaU1heEpEQVQ7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU0VUX0pQRUdfTUFYSkRBVCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfV1JJVEUgKi8KKyNlbmRpZiAvKiBNTkdfQUNDRVNTX0pQRUcgKi8KKyNlbmRpZiAvKiBNTkdfSU5DTFVERV9KTkcgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1JFQUQKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19zZXRfc3VzcGVuc2lvbm1vZGUgKG1uZ19oYW5kbGUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgYlN1c3BlbnNpb25tb2RlKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9TRVRfU1VTUEVOU0lPTk1PREUsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEUgKGhIYW5kbGUpCisKKyAgaWYgKCgobW5nX2RhdGFwKWhIYW5kbGUpLT5iUmVhZGluZykgIC8qIHdlIG11c3QgTk9UIGJlIHJlYWRpbmcgISEhICovCisgICAgTU5HX0VSUk9SICgobW5nX2RhdGFwKWhIYW5kbGUsIE1OR19GVU5DVElPTklOVkFMSUQpOworCisgICgobW5nX2RhdGFwKWhIYW5kbGUpLT5iU3VzcGVuc2lvbm1vZGUgPSBiU3VzcGVuc2lvbm1vZGU7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU0VUX1NVU1BFTlNJT05NT0RFLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9SRUFEICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCittbmdfcmV0Y29kZSBNTkdfREVDTCBtbmdfc2V0X3NwZWVkIChtbmdfaGFuZGxlICAgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfc3BlZWR0eXBlIGlTcGVlZCkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU0VUX1NQRUVELCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFIChoSGFuZGxlKQorICAoKG1uZ19kYXRhcCloSGFuZGxlKS0+aVNwZWVkID0gaVNwZWVkOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1NFVF9TUEVFRCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfRElTUExBWSAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogIFByb3BlcnR5IGdldCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3B0ciBNTkdfREVDTCBtbmdfZ2V0X3VzZXJkYXRhIChtbmdfaGFuZGxlIGhIYW5kbGUpCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vIHRyYWNpbmcgaW4gaGVyZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBjYWxscyAqLworICBNTkdfVkFMSURIQU5ETEVYIChoSGFuZGxlKQorICByZXR1cm4gKChtbmdfZGF0YXApaEhhbmRsZSktPnBVc2VyZGF0YTsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX2ltZ3R5cGUgTU5HX0RFQ0wgbW5nX2dldF9zaWd0eXBlIChtbmdfaGFuZGxlIGhIYW5kbGUpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRfU0lHVFlQRSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmICgoaEhhbmRsZSA9PSAwKSB8fCAoKChtbmdfZGF0YXApaEhhbmRsZSktPmlNYWdpYyAhPSBNTkdfTUFHSUMpKQorICAgIHJldHVybiBtbmdfaXRfdW5rbm93bjsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUX1NJR1RZUEUsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuICgobW5nX2RhdGFwKWhIYW5kbGUpLT5lU2lndHlwZTsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX2ltZ3R5cGUgTU5HX0RFQ0wgbW5nX2dldF9pbWFnZXR5cGUgKG1uZ19oYW5kbGUgaEhhbmRsZSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVF9JTUFHRVRZUEUsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAoKGhIYW5kbGUgPT0gMCkgfHwgKCgobW5nX2RhdGFwKWhIYW5kbGUpLT5pTWFnaWMgIT0gTU5HX01BR0lDKSkKKyAgICByZXR1cm4gbW5nX2l0X3Vua25vd247CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVF9JTUFHRVRZUEUsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuICgobW5nX2RhdGFwKWhIYW5kbGUpLT5lSW1hZ2V0eXBlOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfdWludDMyIE1OR19ERUNMIG1uZ19nZXRfaW1hZ2V3aWR0aCAobW5nX2hhbmRsZSBoSGFuZGxlKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUX0lNQUdFV0lEVEgsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEVYIChoSGFuZGxlKQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRfSU1BR0VXSURUSCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gKChtbmdfZGF0YXApaEhhbmRsZSktPmlXaWR0aDsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3VpbnQzMiBNTkdfREVDTCBtbmdfZ2V0X2ltYWdlaGVpZ2h0IChtbmdfaGFuZGxlIGhIYW5kbGUpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRfSU1BR0VXSURUSCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRVggKGhIYW5kbGUpCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVF9JTUFHRUhFSUdIVCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gKChtbmdfZGF0YXApaEhhbmRsZSktPmlIZWlnaHQ7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ191aW50MzIgTU5HX0RFQ0wgbW5nX2dldF90aWNrcyAobW5nX2hhbmRsZSBoSGFuZGxlKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUX1RJQ0tTLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFWCAoaEhhbmRsZSkKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUX1RJQ0tTLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiAoKG1uZ19kYXRhcCloSGFuZGxlKS0+aVRpY2tzOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfdWludDMyIE1OR19ERUNMIG1uZ19nZXRfZnJhbWVjb3VudCAobW5nX2hhbmRsZSBoSGFuZGxlKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUX0ZSQU1FQ09VTlQsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEVYIChoSGFuZGxlKQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRfRlJBTUVDT1VOVCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gKChtbmdfZGF0YXApaEhhbmRsZSktPmlGcmFtZWNvdW50OworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfdWludDMyIE1OR19ERUNMIG1uZ19nZXRfbGF5ZXJjb3VudCAobW5nX2hhbmRsZSBoSGFuZGxlKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUX0xBWUVSQ09VTlQsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEVYIChoSGFuZGxlKQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRfTEFZRVJDT1VOVCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gKChtbmdfZGF0YXApaEhhbmRsZSktPmlMYXllcmNvdW50OworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfdWludDMyIE1OR19ERUNMIG1uZ19nZXRfcGxheXRpbWUgKG1uZ19oYW5kbGUgaEhhbmRsZSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVF9QTEFZVElNRSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRVggKGhIYW5kbGUpCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVF9QTEFZVElNRSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gKChtbmdfZGF0YXApaEhhbmRsZSktPmlQbGF5dGltZTsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3VpbnQzMiBNTkdfREVDTCBtbmdfZ2V0X3NpbXBsaWNpdHkgKG1uZ19oYW5kbGUgaEhhbmRsZSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVF9TSU1QTElDSVRZLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFWCAoaEhhbmRsZSkKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUX1NJTVBMSUNJVFksIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuICgobW5nX2RhdGFwKWhIYW5kbGUpLT5pU2ltcGxpY2l0eTsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3VpbnQ4IE1OR19ERUNMIG1uZ19nZXRfYml0ZGVwdGggKG1uZ19oYW5kbGUgaEhhbmRsZSkKK3sKKyAgbW5nX3VpbnQ4IGlSc2x0OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRfQklUREVQVEgsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEVYIChoSGFuZGxlKQorCisgIGlmICgoKG1uZ19kYXRhcCloSGFuZGxlKS0+ZUltYWdldHlwZSA9PSBtbmdfaXRfcG5nKQorICAgIGlSc2x0ID0gKChtbmdfZGF0YXApaEhhbmRsZSktPmlCaXRkZXB0aDsKKyAgZWxzZQorI2lmZGVmIE1OR19JTkNMVURFX0pORworICBpZiAoKChtbmdfZGF0YXApaEhhbmRsZSktPmVJbWFnZXR5cGUgPT0gbW5nX2l0X2puZykKKyAgICBpUnNsdCA9ICgobW5nX2RhdGFwKWhIYW5kbGUpLT5pSkhEUmltZ2JpdGRlcHRoOworICBlbHNlCisjZW5kaWYKKyAgICBpUnNsdCA9IDA7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVF9CSVRERVBUSCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gaVJzbHQ7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ191aW50OCBNTkdfREVDTCBtbmdfZ2V0X2NvbG9ydHlwZSAobW5nX2hhbmRsZSBoSGFuZGxlKQoreworICBtbmdfdWludDggaVJzbHQ7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVF9DT0xPUlRZUEUsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEVYIChoSGFuZGxlKQorCisgIGlmICgoKG1uZ19kYXRhcCloSGFuZGxlKS0+ZUltYWdldHlwZSA9PSBtbmdfaXRfcG5nKQorICAgIGlSc2x0ID0gKChtbmdfZGF0YXApaEhhbmRsZSktPmlDb2xvcnR5cGU7CisgIGVsc2UKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgaWYgKCgobW5nX2RhdGFwKWhIYW5kbGUpLT5lSW1hZ2V0eXBlID09IG1uZ19pdF9qbmcpCisgICAgaVJzbHQgPSAoKG1uZ19kYXRhcCloSGFuZGxlKS0+aUpIRFJjb2xvcnR5cGU7CisgIGVsc2UKKyNlbmRpZgorICAgIGlSc2x0ID0gMDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUX0NPTE9SVFlQRSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gaVJzbHQ7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ191aW50OCBNTkdfREVDTCBtbmdfZ2V0X2NvbXByZXNzaW9uIChtbmdfaGFuZGxlIGhIYW5kbGUpCit7CisgIG1uZ191aW50OCBpUnNsdDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUX0NPTVBSRVNTSU9OLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFWCAoaEhhbmRsZSkKKworICBpZiAoKChtbmdfZGF0YXApaEhhbmRsZSktPmVJbWFnZXR5cGUgPT0gbW5nX2l0X3BuZykKKyAgICBpUnNsdCA9ICgobW5nX2RhdGFwKWhIYW5kbGUpLT5pQ29tcHJlc3Npb247CisgIGVsc2UKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgaWYgKCgobW5nX2RhdGFwKWhIYW5kbGUpLT5lSW1hZ2V0eXBlID09IG1uZ19pdF9qbmcpCisgICAgaVJzbHQgPSAoKG1uZ19kYXRhcCloSGFuZGxlKS0+aUpIRFJpbWdjb21wcmVzc2lvbjsKKyAgZWxzZQorI2VuZGlmCisgICAgaVJzbHQgPSAwOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRfQ09NUFJFU1NJT04sIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIGlSc2x0OworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfdWludDggTU5HX0RFQ0wgbW5nX2dldF9maWx0ZXIgKG1uZ19oYW5kbGUgaEhhbmRsZSkKK3sKKyAgbW5nX3VpbnQ4IGlSc2x0OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRfRklMVEVSLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFWCAoaEhhbmRsZSkKKworICBpZiAoKChtbmdfZGF0YXApaEhhbmRsZSktPmVJbWFnZXR5cGUgPT0gbW5nX2l0X3BuZykKKyAgICBpUnNsdCA9ICgobW5nX2RhdGFwKWhIYW5kbGUpLT5pRmlsdGVyOworICBlbHNlCisgICAgaVJzbHQgPSAwOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRfRklMVEVSLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBpUnNsdDsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3VpbnQ4IE1OR19ERUNMIG1uZ19nZXRfaW50ZXJsYWNlIChtbmdfaGFuZGxlIGhIYW5kbGUpCit7CisgIG1uZ191aW50OCBpUnNsdDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUX0lOVEVSTEFDRSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRVggKGhIYW5kbGUpCisKKyAgaWYgKCgobW5nX2RhdGFwKWhIYW5kbGUpLT5lSW1hZ2V0eXBlID09IG1uZ19pdF9wbmcpCisgICAgaVJzbHQgPSAoKG1uZ19kYXRhcCloSGFuZGxlKS0+aUludGVybGFjZTsKKyAgZWxzZQorI2lmZGVmIE1OR19JTkNMVURFX0pORworICBpZiAoKChtbmdfZGF0YXApaEhhbmRsZSktPmVJbWFnZXR5cGUgPT0gbW5nX2l0X2puZykKKyAgICBpUnNsdCA9ICgobW5nX2RhdGFwKWhIYW5kbGUpLT5pSkhEUmltZ2ludGVybGFjZTsKKyAgZWxzZQorI2VuZGlmCisgICAgaVJzbHQgPSAwOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRfSU5URVJMQUNFLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBpUnNsdDsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3VpbnQ4IE1OR19ERUNMIG1uZ19nZXRfYWxwaGFiaXRkZXB0aCAobW5nX2hhbmRsZSBoSGFuZGxlKQoreworICBtbmdfdWludDggaVJzbHQ7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVF9BTFBIQUJJVERFUFRILCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFWCAoaEhhbmRsZSkKKworI2lmZGVmIE1OR19JTkNMVURFX0pORworICBpZiAoKChtbmdfZGF0YXApaEhhbmRsZSktPmVJbWFnZXR5cGUgPT0gbW5nX2l0X2puZykKKyAgICBpUnNsdCA9ICgobW5nX2RhdGFwKWhIYW5kbGUpLT5pSkhEUmFscGhhYml0ZGVwdGg7CisgIGVsc2UKKyNlbmRpZgorICAgIGlSc2x0ID0gMDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUX0FMUEhBQklUREVQVEgsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIGlSc2x0OworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorbW5nX3VpbnQ4IE1OR19ERUNMIG1uZ19nZXRfcmVmcmVzaHBhc3MgKG1uZ19oYW5kbGUgaEhhbmRsZSkKK3sKKyAgbW5nX3VpbnQ4IGlSc2x0OworICBtbmdfZGF0YXAgcERhdGE7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVF9SRUZSRVNIUEFTUywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRVggKGhIYW5kbGUpCisKKyAgcERhdGEgPSAobW5nX2RhdGFwKWhIYW5kbGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3IgUE5HIHdlIGtub3cgdGhlIGV4YWN0IHBhc3MgKi8KKyAgaWYgKChwRGF0YS0+ZUltYWdldHlwZSA9PSBtbmdfaXRfcG5nKSAmJiAocERhdGEtPmlQYXNzID49IDApKQorICAgIGlSc2x0ID0gcERhdGEtPmlQYXNzOworI2lmZGVmIE1OR19JTkNMVURFX0pORworICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm9yIEpORyB3ZSdsbCBmYWtlIGl0Li4uICovCisgIGlmICgocERhdGEtPmVJbWFnZXR5cGUgPT0gbW5nX2l0X2puZykgJiYKKyAgICAgIChwRGF0YS0+YkpQRUdoYXNoZWFkZXIpICYmIChwRGF0YS0+YkpQRUdkZWNvc3RhcnRlZCkgJiYKKyAgICAgIChwRGF0YS0+YkpQRUdwcm9ncmVzc2l2ZSkpCisgIHsKKyAgICBpZiAocERhdGEtPnBKUEVHZGluZm8tPmlucHV0X3NjYW5fbnVtYmVyIDw9IDEpCisgICAgICBpUnNsdCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAvKiBmaXJzdCBwYXNzIChJIHRoaW5rLi4uKSAqLworICAgIGVsc2UKKyAgICBpZiAoanBlZ19pbnB1dF9jb21wbGV0ZSAocERhdGEtPnBKUEVHZGluZm8pKQorICAgICAgaVJzbHQgPSA3OyAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgY29tcGxldGU7IGFrYSBmaW5hbCBwYXNzICovCisgICAgZWxzZQorICAgICAgaVJzbHQgPSAzOyAgICAgICAgICAgICAgICAgICAgICAgLyogYW55dGhpbmcgYmV0d2VlbiAwIGFuZCA3IHdpbGwgZG8gKi8KKworICB9CisjZW5kaWYKKyAgZWxzZQorICAgIGlSc2x0ID0gMDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUX1JFRlJFU0hQQVNTLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBpUnNsdDsKK30KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCittbmdfdWludDggTU5HX0RFQ0wgbW5nX2dldF9hbHBoYWNvbXByZXNzaW9uIChtbmdfaGFuZGxlIGhIYW5kbGUpCit7CisgIG1uZ191aW50OCBpUnNsdDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUX0FMUEhBQ09NUFJFU1NJT04sIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEVYIChoSGFuZGxlKQorCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisgIGlmICgoKG1uZ19kYXRhcCloSGFuZGxlKS0+ZUltYWdldHlwZSA9PSBtbmdfaXRfam5nKQorICAgIGlSc2x0ID0gKChtbmdfZGF0YXApaEhhbmRsZSktPmlKSERSYWxwaGFjb21wcmVzc2lvbjsKKyAgZWxzZQorI2VuZGlmCisgICAgaVJzbHQgPSAwOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRfQUxQSEFDT01QUkVTU0lPTiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gaVJzbHQ7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ191aW50OCBNTkdfREVDTCBtbmdfZ2V0X2FscGhhZmlsdGVyIChtbmdfaGFuZGxlIGhIYW5kbGUpCit7CisgIG1uZ191aW50OCBpUnNsdDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUX0FMUEhBRklMVEVSLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFWCAoaEhhbmRsZSkKKworI2lmZGVmIE1OR19JTkNMVURFX0pORworICBpZiAoKChtbmdfZGF0YXApaEhhbmRsZSktPmVJbWFnZXR5cGUgPT0gbW5nX2l0X2puZykKKyAgICBpUnNsdCA9ICgobW5nX2RhdGFwKWhIYW5kbGUpLT5pSkhEUmFscGhhZmlsdGVyOworICBlbHNlCisjZW5kaWYKKyAgICBpUnNsdCA9IDA7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVF9BTFBIQUZJTFRFUiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gaVJzbHQ7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ191aW50OCBNTkdfREVDTCBtbmdfZ2V0X2FscGhhaW50ZXJsYWNlIChtbmdfaGFuZGxlIGhIYW5kbGUpCit7CisgIG1uZ191aW50OCBpUnNsdDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUX0FMUEhBSU5URVJMQUNFLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFWCAoaEhhbmRsZSkKKworI2lmZGVmIE1OR19JTkNMVURFX0pORworICBpZiAoKChtbmdfZGF0YXApaEhhbmRsZSktPmVJbWFnZXR5cGUgPT0gbW5nX2l0X2puZykKKyAgICBpUnNsdCA9ICgobW5nX2RhdGFwKWhIYW5kbGUpLT5pSkhEUmFscGhhaW50ZXJsYWNlOworICBlbHNlCisjZW5kaWYKKyAgICBpUnNsdCA9IDA7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVF9BTFBIQUlOVEVSTEFDRSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gaVJzbHQ7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ191aW50OCBNTkdfREVDTCBtbmdfZ2V0X2FscGhhZGVwdGggKG1uZ19oYW5kbGUgaEhhbmRsZSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVF9BTFBIQURFUFRILCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFWCAoaEhhbmRsZSkKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUX0FMUEhBREVQVEgsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuICgobW5nX2RhdGFwKWhIYW5kbGUpLT5pQWxwaGFkZXB0aDsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3VpbnQzMiBNTkdfREVDTCBtbmdfZ2V0X2NhbnZhc3N0eWxlIChtbmdfaGFuZGxlIGhIYW5kbGUpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRfQ0FOVkFTU1RZTEUsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEVYIChoSGFuZGxlKQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRfQ0FOVkFTU1RZTEUsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuICgobW5nX2RhdGFwKWhIYW5kbGUpLT5pQ2FudmFzc3R5bGU7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ191aW50MzIgTU5HX0RFQ0wgbW5nX2dldF9ia2dkc3R5bGUgKG1uZ19oYW5kbGUgaEhhbmRsZSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVF9CS0dEU1RZTEUsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEVYIChoSGFuZGxlKQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRfQktHRFNUWUxFLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiAoKG1uZ19kYXRhcCloSGFuZGxlKS0+aUJrZ2RzdHlsZTsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX2dldF9iZ2NvbG9yIChtbmdfaGFuZGxlICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2KiBpUmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2KiBpR3JlZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MTYqIGlCbHVlKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRfQkdDT0xPUiwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkKKyAgKmlSZWQgICA9ICgobW5nX2RhdGFwKWhIYW5kbGUpLT5pQkdyZWQ7CisgICppR3JlZW4gPSAoKG1uZ19kYXRhcCloSGFuZGxlKS0+aUJHZ3JlZW47CisgICppQmx1ZSAgPSAoKG1uZ19kYXRhcCloSGFuZGxlKS0+aUJHYmx1ZTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRfQkdDT0xPUiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19ib29sIE1OR19ERUNMIG1uZ19nZXRfdXNlYmtnZCAobW5nX2hhbmRsZSBoSGFuZGxlKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRUIgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUX1VTRUJLR0QsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEVYIChoSGFuZGxlKQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFQiAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRfVVNFQktHRCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gKChtbmdfZGF0YXApaEhhbmRsZSktPmJVc2VCS0dEOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfYm9vbCBNTkdfREVDTCBtbmdfZ2V0X3N0b3JlY2h1bmtzIChtbmdfaGFuZGxlIGhIYW5kbGUpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFQiAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRfU1RPUkVDSFVOS1MsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEVYIChoSGFuZGxlKQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFQiAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRfU1RPUkVDSFVOS1MsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuICgobW5nX2RhdGFwKWhIYW5kbGUpLT5iU3RvcmVjaHVua3M7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19ib29sIE1OR19ERUNMIG1uZ19nZXRfc2VjdGlvbmJyZWFrcyAobW5nX2hhbmRsZSBoSGFuZGxlKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRUIgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUX1NFQ1RJT05CUkVBS1MsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEVYIChoSGFuZGxlKQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFQiAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRfU0VDVElPTkJSRUFLUywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gKChtbmdfZGF0YXApaEhhbmRsZSktPmJTZWN0aW9uYnJlYWtzOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfYm9vbCBNTkdfREVDTCBtbmdfZ2V0X2NhY2hlcGxheWJhY2sgKG1uZ19oYW5kbGUgaEhhbmRsZSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VCICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVF9DQUNIRVBMQVlCQUNLLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFWCAoaEhhbmRsZSkKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRUIgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUX0NBQ0hFUExBWUJBQ0ssIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuICgobW5nX2RhdGFwKWhIYW5kbGUpLT5iQ2FjaGVwbGF5YmFjazsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX2Jvb2wgTU5HX0RFQ0wgbW5nX2dldF9kb3Byb2dyZXNzaXZlIChtbmdfaGFuZGxlIGhIYW5kbGUpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFQiAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRfRE9QUk9HUkVTU0lWRSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRVggKGhIYW5kbGUpCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VCICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVF9ET1BST0dSRVNTSVZFLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiAoKG1uZ19kYXRhcCloSGFuZGxlKS0+YkRvUHJvZ3Jlc3NpdmU7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ191aW50MzIgTU5HX0RFQ0wgbW5nX2dldF9jcmNtb2RlIChtbmdfaGFuZGxlIGhIYW5kbGUpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFQiAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRfQ1JDTU9ERSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRVggKGhIYW5kbGUpCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VCICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVF9DUkNNT0RFLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiAoKG1uZ19kYXRhcCloSGFuZGxlKS0+aUNyY21vZGU7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCittbmdfYm9vbCBNTkdfREVDTCBtbmdfZ2V0X3NyZ2IgKG1uZ19oYW5kbGUgaEhhbmRsZSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VCICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVF9TUkdCLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFWCAoaEhhbmRsZSkKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRUIgKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUX1NSR0IsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuICgobW5nX2RhdGFwKWhIYW5kbGUpLT5iSXNzUkdCOworfQorI2VuZGlmIC8qIE1OR19TVVBQT1JUX0RJU1BMQVkgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmIGRlZmluZWQoTU5HX0ZVTExfQ01TKSB8fCBkZWZpbmVkKE1OR19HQU1NQV9PTkxZKSB8fCBkZWZpbmVkKE1OR19BUFBfQ01TKQorbW5nX2Zsb2F0IE1OR19ERUNMIG1uZ19nZXRfdmlld2dhbW1hIChtbmdfaGFuZGxlIGhIYW5kbGUpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRfVklFV0dBTU1BLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFWCAoaEhhbmRsZSkKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUX1ZJRVdHQU1NQSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gKChtbmdfZGF0YXApaEhhbmRsZSktPmRWaWV3Z2FtbWE7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmIGRlZmluZWQoTU5HX0ZVTExfQ01TKSB8fCBkZWZpbmVkKE1OR19HQU1NQV9PTkxZKSB8fCBkZWZpbmVkKE1OR19BUFBfQ01TKQorbW5nX2Zsb2F0IE1OR19ERUNMIG1uZ19nZXRfZGlzcGxheWdhbW1hIChtbmdfaGFuZGxlIGhIYW5kbGUpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRfRElTUExBWUdBTU1BLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFWCAoaEhhbmRsZSkKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUX0RJU1BMQVlHQU1NQSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gKChtbmdfZGF0YXApaEhhbmRsZSktPmREaXNwbGF5Z2FtbWE7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmbmRlZiBNTkdfTk9fREZMVF9JTkZPCisjaWYgZGVmaW5lZChNTkdfRlVMTF9DTVMpIHx8IGRlZmluZWQoTU5HX0dBTU1BX09OTFkpIHx8IGRlZmluZWQoTU5HX0FQUF9DTVMpCittbmdfZmxvYXQgTU5HX0RFQ0wgbW5nX2dldF9kZmx0aW1nZ2FtbWEgKG1uZ19oYW5kbGUgaEhhbmRsZSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVF9ERkxUSU1HR0FNTUEsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEVYIChoSGFuZGxlKQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRfREZMVElNR0dBTU1BLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiAoKG1uZ19kYXRhcCloSGFuZGxlKS0+ZERmbHRpbWdnYW1tYTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZiBkZWZpbmVkKE1OR19GVUxMX0NNUykgfHwgZGVmaW5lZChNTkdfR0FNTUFfT05MWSkgfHwgZGVmaW5lZChNTkdfQVBQX0NNUykKK21uZ191aW50MzIgTU5HX0RFQ0wgbW5nX2dldF92aWV3Z2FtbWFpbnQgKG1uZ19oYW5kbGUgaEhhbmRsZSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVF9WSUVXR0FNTUEsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEVYIChoSGFuZGxlKQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRfVklFV0dBTU1BLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiAobW5nX3VpbnQzMikoKChtbmdfZGF0YXApaEhhbmRsZSktPmRWaWV3Z2FtbWEgKiAxMDAwMDApOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZiBkZWZpbmVkKE1OR19GVUxMX0NNUykgfHwgZGVmaW5lZChNTkdfR0FNTUFfT05MWSkgfHwgZGVmaW5lZChNTkdfQVBQX0NNUykKK21uZ191aW50MzIgTU5HX0RFQ0wgbW5nX2dldF9kaXNwbGF5Z2FtbWFpbnQgKG1uZ19oYW5kbGUgaEhhbmRsZSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVF9ESVNQTEFZR0FNTUEsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEVYIChoSGFuZGxlKQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRfRElTUExBWUdBTU1BLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiAobW5nX3VpbnQzMikoKChtbmdfZGF0YXApaEhhbmRsZSktPmREaXNwbGF5Z2FtbWEgKiAxMDAwMDApOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTU5HX05PX0RGTFRfSU5GTworI2lmIGRlZmluZWQoTU5HX0ZVTExfQ01TKSB8fCBkZWZpbmVkKE1OR19HQU1NQV9PTkxZKSB8fCBkZWZpbmVkKE1OR19BUFBfQ01TKQorbW5nX3VpbnQzMiBNTkdfREVDTCBtbmdfZ2V0X2RmbHRpbWdnYW1tYWludCAobW5nX2hhbmRsZSBoSGFuZGxlKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUX0RGTFRJTUdHQU1NQSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRVggKGhIYW5kbGUpCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVF9ERkxUSU1HR0FNTUEsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIChtbmdfdWludDMyKSgoKG1uZ19kYXRhcCloSGFuZGxlKS0+ZERmbHRpbWdnYW1tYSAqIDEwMDAwMCk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIE1OR19TS0lQX01BWENBTlZBUworbW5nX3VpbnQzMiBNTkdfREVDTCBtbmdfZ2V0X21heGNhbnZhc3dpZHRoIChtbmdfaGFuZGxlIGhIYW5kbGUpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRfTUFYQ0FOVkFTV0lEVEgsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEVYIChoSGFuZGxlKQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRfTUFYQ0FOVkFTV0lEVEgsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuICgobW5nX2RhdGFwKWhIYW5kbGUpLT5pTWF4d2lkdGg7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ191aW50MzIgTU5HX0RFQ0wgbW5nX2dldF9tYXhjYW52YXNoZWlnaHQgKG1uZ19oYW5kbGUgaEhhbmRsZSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVF9NQVhDQU5WQVNIRUlHSFQsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEVYIChoSGFuZGxlKQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRfTUFYQ0FOVkFTSEVJR0hULCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiAoKG1uZ19kYXRhcCloSGFuZGxlKS0+aU1heGhlaWdodDsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX0lOQ0xVREVfWkxJQgorI2lmZGVmIE1OR19BQ0NFU1NfWkxJQgorbW5nX2ludDMyIE1OR19ERUNMIG1uZ19nZXRfemxpYl9sZXZlbCAobW5nX2hhbmRsZSBoSGFuZGxlKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUX1pMSUJfTEVWRUwsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEVYIChoSGFuZGxlKQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRfWkxJQl9MRVZFTCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gKChtbmdfZGF0YXApaEhhbmRsZSktPmlabGV2ZWw7Cit9CisjZW5kaWYgLyogTU5HX0FDQ0VTU19aTElCICovCisjZW5kaWYgLyogTU5HX0lOQ0xVREVfWkxJQiAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2lmZGVmIE1OR19JTkNMVURFX1pMSUIKKyNpZmRlZiBNTkdfQUNDRVNTX1pMSUIKK21uZ19pbnQzMiBNTkdfREVDTCBtbmdfZ2V0X3psaWJfbWV0aG9kIChtbmdfaGFuZGxlIGhIYW5kbGUpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRfWkxJQl9NRVRIT0QsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEVYIChoSGFuZGxlKQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRfWkxJQl9NRVRIT0QsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuICgobW5nX2RhdGFwKWhIYW5kbGUpLT5pWm1ldGhvZDsKK30KKworI2VuZGlmIC8qIE1OR19BQ0NFU1NfWkxJQiAqLworI2VuZGlmIC8qIE1OR19JTkNMVURFX1pMSUIgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19JTkNMVURFX1pMSUIKKyNpZmRlZiBNTkdfQUNDRVNTX1pMSUIKK21uZ19pbnQzMiBNTkdfREVDTCBtbmdfZ2V0X3psaWJfd2luZG93Yml0cyAobW5nX2hhbmRsZSBoSGFuZGxlKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUX1pMSUJfV0lORE9XQklUUywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRVggKGhIYW5kbGUpCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVF9aTElCX1dJTkRPV0JJVFMsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuICgobW5nX2RhdGFwKWhIYW5kbGUpLT5pWndpbmRvd2JpdHM7Cit9CisjZW5kaWYgLyogTU5HX0FDQ0VTU19aTElCICovCisjZW5kaWYgLyogTU5HX0lOQ0xVREVfWkxJQiAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX0lOQ0xVREVfWkxJQgorI2lmZGVmIE1OR19BQ0NFU1NfWkxJQgorbW5nX2ludDMyIE1OR19ERUNMIG1uZ19nZXRfemxpYl9tZW1sZXZlbCAobW5nX2hhbmRsZSBoSGFuZGxlKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUX1pMSUJfTUVNTEVWRUwsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEVYIChoSGFuZGxlKQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRfWkxJQl9NRU1MRVZFTCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gKChtbmdfZGF0YXApaEhhbmRsZSktPmlabWVtbGV2ZWw7Cit9CisjZW5kaWYgLyogTU5HX0FDQ0VTU19aTElCICovCisjZW5kaWYgLyogTU5HX0lOQ0xVREVfWkxJQiAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX0lOQ0xVREVfWkxJQgorI2lmZGVmIE1OR19BQ0NFU1NfWkxJQgorbW5nX2ludDMyIE1OR19ERUNMIG1uZ19nZXRfemxpYl9zdHJhdGVneSAobW5nX2hhbmRsZSBoSGFuZGxlKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUX1pMSUJfU1RSQVRFR1ksIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEVYIChoSGFuZGxlKQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRfWkxJQl9TVFJBVEVHWSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gKChtbmdfZGF0YXApaEhhbmRsZSktPmlac3RyYXRlZ3k7Cit9CisjZW5kaWYgLyogTU5HX0FDQ0VTU19aTElCICovCisjZW5kaWYgLyogTU5HX0lOQ0xVREVfWkxJQiAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX0lOQ0xVREVfWkxJQgorI2lmZGVmIE1OR19BQ0NFU1NfWkxJQgorbW5nX3VpbnQzMiBNTkdfREVDTCBtbmdfZ2V0X3psaWJfbWF4aWRhdCAobW5nX2hhbmRsZSBoSGFuZGxlKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUX1pMSUJfTUFYSURBVCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRVggKGhIYW5kbGUpCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVF9aTElCX01BWElEQVQsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuICgobW5nX2RhdGFwKWhIYW5kbGUpLT5pTWF4SURBVDsKK30KKyNlbmRpZiAvKiBNTkdfQUNDRVNTX1pMSUIgKi8KKyNlbmRpZiAvKiBNTkdfSU5DTFVERV9aTElCICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyNpZmRlZiBNTkdfQUNDRVNTX0pQRUcKK21uZ2pwZWdfZGN0bWV0aG9kIE1OR19ERUNMIG1uZ19nZXRfanBlZ19kY3RtZXRob2QgKG1uZ19oYW5kbGUgaEhhbmRsZSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVF9KUEVHX0RDVE1FVEhPRCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmICgoaEhhbmRsZSA9PSAwKSB8fCAoKChtbmdfZGF0YXApaEhhbmRsZSktPmlNYWdpYyAhPSBNTkdfTUFHSUMpKQorICAgIHJldHVybiBKRENUX0lTTE9XOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRfSlBFR19EQ1RNRVRIT0QsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuICgobW5nX2RhdGFwKWhIYW5kbGUpLT5lSlBFR2RjdG1ldGhvZDsKK30KKyNlbmRpZiAvKiBNTkdfQUNDRVNTX0pQRUcgKi8KKyNlbmRpZiAvKiBNTkdfSU5DTFVERV9KTkcgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19JTkNMVURFX0pORworI2lmZGVmIE1OR19BQ0NFU1NfSlBFRworbW5nX2ludDMyIE1OR19ERUNMIG1uZ19nZXRfanBlZ19xdWFsaXR5IChtbmdfaGFuZGxlIGhIYW5kbGUpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRfSlBFR19RVUFMSVRZLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFWCAoaEhhbmRsZSkKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUX0pQRUdfUVVBTElUWSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gKChtbmdfZGF0YXApaEhhbmRsZSktPmlKUEVHcXVhbGl0eTsKK30KKyNlbmRpZiAvKiBNTkdfQUNDRVNTX0pQRUcgKi8KKyNlbmRpZiAvKiBNTkdfSU5DTFVERV9KTkcgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19JTkNMVURFX0pORworI2lmZGVmIE1OR19BQ0NFU1NfSlBFRworbW5nX2ludDMyIE1OR19ERUNMIG1uZ19nZXRfanBlZ19zbW9vdGhpbmcgKG1uZ19oYW5kbGUgaEhhbmRsZSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVF9KUEVHX1NNT09USElORywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRVggKGhIYW5kbGUpCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVF9KUEVHX1NNT09USElORywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gKChtbmdfZGF0YXApaEhhbmRsZSktPmlKUEVHc21vb3RoaW5nOworfQorI2VuZGlmIC8qIE1OR19BQ0NFU1NfSlBFRyAqLworI2VuZGlmIC8qIE1OR19JTkNMVURFX0pORyAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisjaWZkZWYgTU5HX0FDQ0VTU19KUEVHCittbmdfYm9vbCBNTkdfREVDTCBtbmdfZ2V0X2pwZWdfcHJvZ3Jlc3NpdmUgKG1uZ19oYW5kbGUgaEhhbmRsZSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVF9KUEVHX1BST0dSRVNTSVZFLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFWCAoaEhhbmRsZSkKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUX0pQRUdfUFJPR1JFU1NJVkUsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuICgobW5nX2RhdGFwKWhIYW5kbGUpLT5iSlBFR2NvbXByZXNzcHJvZ3I7Cit9CisjZW5kaWYgLyogTU5HX0FDQ0VTU19KUEVHICovCisjZW5kaWYgLyogTU5HX0lOQ0xVREVfSk5HICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyNpZmRlZiBNTkdfQUNDRVNTX0pQRUcKK21uZ19ib29sIE1OR19ERUNMIG1uZ19nZXRfanBlZ19vcHRpbWl6ZWQgKG1uZ19oYW5kbGUgaEhhbmRsZSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVF9KUEVHX09QVElNSVpFRCwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRVggKGhIYW5kbGUpCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVF9KUEVHX09QVElNSVpFRCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gKChtbmdfZGF0YXApaEhhbmRsZSktPmJKUEVHY29tcHJlc3NvcHQ7Cit9CisjZW5kaWYgLyogTU5HX0FDQ0VTU19KUEVHICovCisjZW5kaWYgLyogTU5HX0lOQ0xVREVfSk5HICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyNpZmRlZiBNTkdfQUNDRVNTX0pQRUcKK21uZ191aW50MzIgTU5HX0RFQ0wgbW5nX2dldF9qcGVnX21heGpkYXQgKG1uZ19oYW5kbGUgaEhhbmRsZSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVF9KUEVHX01BWEpEQVQsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBNTkdfVkFMSURIQU5ETEVYIChoSGFuZGxlKQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRfSlBFR19NQVhKREFULCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiAoKG1uZ19kYXRhcCloSGFuZGxlKS0+aU1heEpEQVQ7Cit9CisjZW5kaWYgLyogTU5HX0FDQ0VTU19KUEVHICovCisjZW5kaWYgLyogTU5HX0lOQ0xVREVfSk5HICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9SRUFECittbmdfYm9vbCBNTkdfREVDTCBtbmdfZ2V0X3N1c3BlbnNpb25tb2RlIChtbmdfaGFuZGxlIGhIYW5kbGUpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRfU1VTUEVOU0lPTk1PREUsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAoKGhIYW5kbGUgPT0gMCkgfHwgKCgobW5nX2RhdGFwKWhIYW5kbGUpLT5pTWFnaWMgIT0gTU5HX01BR0lDKSkKKyAgICByZXR1cm4gTU5HX0ZBTFNFOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRfU1VTUEVOU0lPTk1PREUsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuICgobW5nX2RhdGFwKWhIYW5kbGUpLT5iU3VzcGVuc2lvbm1vZGU7Cit9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfUkVBRCAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorbW5nX3NwZWVkdHlwZSBNTkdfREVDTCBtbmdfZ2V0X3NwZWVkIChtbmdfaGFuZGxlIGhIYW5kbGUpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRfU1BFRUQsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAoKGhIYW5kbGUgPT0gMCkgfHwgKCgobW5nX2RhdGFwKWhIYW5kbGUpLT5pTWFnaWMgIT0gTU5HX01BR0lDKSkKKyAgICByZXR1cm4gbW5nX3N0X25vcm1hbDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUX1NQRUVELCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiAoKG1uZ19kYXRhcCloSGFuZGxlKS0+aVNwZWVkOworfQorI2VuZGlmIC8qIE1OR19TVVBQT1JUX0RJU1BMQVkgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3VpbnQzMiBNTkdfREVDTCBtbmdfZ2V0X2ltYWdlbGV2ZWwgKG1uZ19oYW5kbGUgaEhhbmRsZSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVF9JTUFHRUxFVkVMLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFWCAoaEhhbmRsZSkKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUX0lNQUdFTEVWRUwsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuICgobW5nX2RhdGFwKWhIYW5kbGUpLT5pSW1hZ2VsZXZlbDsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX0RJU1BMQVkKK21uZ19yZXRjb2RlIE1OR19ERUNMIG1uZ19nZXRfbGFzdGJhY2tjaHVuayAobW5nX2hhbmRsZSAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiogaVJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQxNiogaUdyZWVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDE2KiBpQmx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4KiAgaU1hbmRhdG9yeSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVF9MQVNUQkFDS0NIVU5LLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFIChoSGFuZGxlKQorCisgIGlmICgoKG1uZ19kYXRhcCloSGFuZGxlKS0+ZUltYWdldHlwZSAhPSBtbmdfaXRfbW5nKQorICAgIE1OR19FUlJPUiAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GVU5DVElPTklOVkFMSUQpOworCisgICppUmVkICAgICAgID0gKChtbmdfZGF0YXApaEhhbmRsZSktPmlCQUNLcmVkOworICAqaUdyZWVuICAgICA9ICgobW5nX2RhdGFwKWhIYW5kbGUpLT5pQkFDS2dyZWVuOworICAqaUJsdWUgICAgICA9ICgobW5nX2RhdGFwKWhIYW5kbGUpLT5pQkFDS2JsdWU7CisgICppTWFuZGF0b3J5ID0gKChtbmdfZGF0YXApaEhhbmRsZSktPmlCQUNLbWFuZGF0b3J5OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRfTEFTVEJBQ0tDSFVOSywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisjZW5kaWYgLyogTU5HX1NVUFBPUlRfRElTUExBWSAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorbW5nX3JldGNvZGUgTU5HX0RFQ0wgbW5nX2dldF9sYXN0c2Vla25hbWUgKG1uZ19oYW5kbGUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcGNoYXIgIHpTZWdtZW50bmFtZSkKK3sKKyAgbW5nX2RhdGFwIHBEYXRhOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRfTEFTVFNFRUtOQU1FLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgTU5HX1ZBTElESEFORExFIChoSGFuZGxlKQorCisgIHBEYXRhID0gKG1uZ19kYXRhcCloSGFuZGxlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb25seSBhbGxvd2VkIGZvciBNTkcgISAqLworICBpZiAocERhdGEtPmVJbWFnZXR5cGUgIT0gbW5nX2l0X21uZykKKyAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfRlVOQ1RJT05JTlZBTElEKTsKKworICBpZiAocERhdGEtPnBMYXN0c2VlaykgICAgICAgICAgICAgICAgLyogaXMgdGhlcmUgYSBsYXN0IFNFRUsgPyAqLworICB7CisgICAgbW5nX2FuaV9zZWVrcCBwU0VFSyA9IChtbmdfYW5pX3NlZWtwKXBEYXRhLT5wTGFzdHNlZWs7CisKKyAgICBpZiAocFNFRUstPmlTZWdtZW50bmFtZXNpemUpICAgICAgIC8qIGNvcHkgdGhlIG5hbWUgaWYgdGhlcmUgaXMgb25lICovCisgICAgICBNTkdfQ09QWSAoelNlZ21lbnRuYW1lLCBwU0VFSy0+elNlZ21lbnRuYW1lLCBwU0VFSy0+aVNlZ21lbnRuYW1lc2l6ZSk7CisKKyAgICAqKCgobW5nX3VpbnQ4cCl6U2VnbWVudG5hbWUpICsgcFNFRUstPmlTZWdtZW50bmFtZXNpemUpID0gMDsKKyAgfQorICBlbHNlCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZXR1cm4gYW4gZW1wdHkgc3RyaW5nICovCisgICAgKigobW5nX3VpbnQ4cCl6U2VnbWVudG5hbWUpID0gMDsKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRfTEFTVFNFRUtOQU1FLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCittbmdfdWludDMyIE1OR19ERUNMIG1uZ19nZXRfY3VycmZyYW1kZWxheSAobW5nX2hhbmRsZSBoSGFuZGxlKQoreworICBtbmdfZGF0YXAgIHBEYXRhOworICBtbmdfdWludDMyIGlSc2x0OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRfQ1VSUkZSQU1ERUxBWSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIE1OR19WQUxJREhBTkRMRSAoaEhhbmRsZSkKKworICBwRGF0YSA9IChtbmdfZGF0YXApaEhhbmRsZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9ubHkgYWxsb3dlZCBmb3IgTU5HICEgKi8KKyAgaWYgKHBEYXRhLT5lSW1hZ2V0eXBlICE9IG1uZ19pdF9tbmcpCisgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0ZVTkNUSU9OSU5WQUxJRCk7CisKKyAgaVJzbHQgPSBwRGF0YS0+aUZyYW1lZGVsYXk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVF9DVVJSRlJBTURFTEFZLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBpUnNsdDsKK30KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCittbmdfdWludDMyIE1OR19ERUNMIG1uZ19nZXRfc3RhcnR0aW1lIChtbmdfaGFuZGxlIGhIYW5kbGUpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRfU1RBUlRUSU1FLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKChoSGFuZGxlID09IDApIHx8ICgoKG1uZ19kYXRhcCloSGFuZGxlKS0+aU1hZ2ljICE9IE1OR19NQUdJQykpCisgICAgcmV0dXJuIG1uZ19zdF9ub3JtYWw7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVF9TVEFSVFRJTUUsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuICgobW5nX2RhdGFwKWhIYW5kbGUpLT5pU3RhcnR0aW1lOworfQorI2VuZGlmIC8qIE1OR19TVVBQT1JUX0RJU1BMQVkgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX0RJU1BMQVkKK21uZ191aW50MzIgTU5HX0RFQ0wgbW5nX2dldF9ydW50aW1lIChtbmdfaGFuZGxlIGhIYW5kbGUpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRfUlVOVElNRSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmICgoaEhhbmRsZSA9PSAwKSB8fCAoKChtbmdfZGF0YXApaEhhbmRsZSktPmlNYWdpYyAhPSBNTkdfTUFHSUMpKQorICAgIHJldHVybiBtbmdfc3Rfbm9ybWFsOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRfUlVOVElNRSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gKChtbmdfZGF0YXApaEhhbmRsZSktPmlSdW50aW1lOworfQorI2VuZGlmIC8qIE1OR19TVVBQT1JUX0RJU1BMQVkgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX0RJU1BMQVkKKyNpZm5kZWYgTU5HX05PX0NVUlJFTlRfSU5GTworbW5nX3VpbnQzMiBNTkdfREVDTCBtbmdfZ2V0X2N1cnJlbnRmcmFtZSAobW5nX2hhbmRsZSBoSGFuZGxlKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUX0NVUlJFTlRGUkFNRSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmICgoaEhhbmRsZSA9PSAwKSB8fCAoKChtbmdfZGF0YXApaEhhbmRsZSktPmlNYWdpYyAhPSBNTkdfTUFHSUMpKQorICAgIHJldHVybiBtbmdfc3Rfbm9ybWFsOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRfQ1VSUkVOVEZSQU1FLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiAoKG1uZ19kYXRhcCloSGFuZGxlKS0+aUZyYW1lc2VxOworfQorI2VuZGlmCisjZW5kaWYgLyogTU5HX1NVUFBPUlRfRElTUExBWSAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorI2lmbmRlZiBNTkdfTk9fQ1VSUkVOVF9JTkZPCittbmdfdWludDMyIE1OR19ERUNMIG1uZ19nZXRfY3VycmVudGxheWVyIChtbmdfaGFuZGxlIGhIYW5kbGUpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRfQ1VSUkVOVExBWUVSLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKChoSGFuZGxlID09IDApIHx8ICgoKG1uZ19kYXRhcCloSGFuZGxlKS0+aU1hZ2ljICE9IE1OR19NQUdJQykpCisgICAgcmV0dXJuIG1uZ19zdF9ub3JtYWw7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVF9DVVJSRU5UTEFZRVIsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuICgobW5nX2RhdGFwKWhIYW5kbGUpLT5pTGF5ZXJzZXE7Cit9CisjZW5kaWYKKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCisjaWZuZGVmIE1OR19OT19DVVJSRU5UX0lORk8KK21uZ191aW50MzIgTU5HX0RFQ0wgbW5nX2dldF9jdXJyZW50cGxheXRpbWUgKG1uZ19oYW5kbGUgaEhhbmRsZSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVF9DVVJSRU5UUExBWVRJTUUsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAoKGhIYW5kbGUgPT0gMCkgfHwgKCgobW5nX2RhdGFwKWhIYW5kbGUpLT5pTWFnaWMgIT0gTU5HX01BR0lDKSkKKyAgICByZXR1cm4gbW5nX3N0X25vcm1hbDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUX0NVUlJFTlRQTEFZVElNRSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gKChtbmdfZGF0YXApaEhhbmRsZSktPmlGcmFtZXRpbWU7Cit9CisjZW5kaWYKKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCisjaWZuZGVmIE1OR19OT19DVVJSRU5UX0lORk8KK21uZ191aW50MzIgTU5HX0RFQ0wgbW5nX2dldF90b3RhbGZyYW1lcyAobW5nX2hhbmRsZSBoSGFuZGxlKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUX1RPVEFMRlJBTUVTLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKChoSGFuZGxlID09IDApIHx8ICgoKG1uZ19kYXRhcCloSGFuZGxlKS0+aU1hZ2ljICE9IE1OR19NQUdJQykpCisgICAgcmV0dXJuIG1uZ19zdF9ub3JtYWw7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX0dFVF9UT1RBTEZSQU1FUywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gKChtbmdfZGF0YXApaEhhbmRsZSktPmlUb3RhbGZyYW1lczsKK30KKyNlbmRpZgorI2VuZGlmIC8qIE1OR19TVVBQT1JUX0RJU1BMQVkgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX0RJU1BMQVkKKyNpZm5kZWYgTU5HX05PX0NVUlJFTlRfSU5GTworbW5nX3VpbnQzMiBNTkdfREVDTCBtbmdfZ2V0X3RvdGFsbGF5ZXJzIChtbmdfaGFuZGxlIGhIYW5kbGUpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9HRVRfVE9UQUxMQVlFUlMsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAoKGhIYW5kbGUgPT0gMCkgfHwgKCgobW5nX2RhdGFwKWhIYW5kbGUpLT5pTWFnaWMgIT0gTU5HX01BR0lDKSkKKyAgICByZXR1cm4gbW5nX3N0X25vcm1hbDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUX1RPVEFMTEFZRVJTLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiAoKG1uZ19kYXRhcCloSGFuZGxlKS0+aVRvdGFsbGF5ZXJzOworfQorI2VuZGlmCisjZW5kaWYgLyogTU5HX1NVUFBPUlRfRElTUExBWSAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorI2lmbmRlZiBNTkdfTk9fQ1VSUkVOVF9JTkZPCittbmdfdWludDMyIE1OR19ERUNMIG1uZ19nZXRfdG90YWxwbGF5dGltZSAobW5nX2hhbmRsZSBoSGFuZGxlKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUX1RPVEFMUExBWVRJTUUsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAoKGhIYW5kbGUgPT0gMCkgfHwgKCgobW5nX2RhdGFwKWhIYW5kbGUpLT5pTWFnaWMgIT0gTU5HX01BR0lDKSkKKyAgICByZXR1cm4gbW5nX3N0X25vcm1hbDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fR0VUX1RPVEFMUExBWVRJTUUsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuICgobW5nX2RhdGFwKWhIYW5kbGUpLT5pVG90YWxwbGF5dGltZTsKK30KKyNlbmRpZgorI2VuZGlmIC8qIE1OR19TVVBQT1JUX0RJU1BMQVkgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX2Jvb2wgTU5HX0RFQ0wgbW5nX3N0YXR1c19lcnJvciAobW5nX2hhbmRsZSBoSGFuZGxlKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU1RBVFVTX0VSUk9SLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKChoSGFuZGxlID09IDApIHx8ICgoKG1uZ19kYXRhcCloSGFuZGxlKS0+aU1hZ2ljICE9IE1OR19NQUdJQykpCisgICAgcmV0dXJuIE1OR19GQUxTRTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU1RBVFVTX0VSUk9SLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiAobW5nX2Jvb2wpKChtbmdfZGF0YXApaEhhbmRsZSktPmlFcnJvcmNvZGU7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9SRUFECittbmdfYm9vbCBNTkdfREVDTCBtbmdfc3RhdHVzX3JlYWRpbmcgKG1uZ19oYW5kbGUgaEhhbmRsZSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1NUQVRVU19SRUFESU5HLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKChoSGFuZGxlID09IDApIHx8ICgoKG1uZ19kYXRhcCloSGFuZGxlKS0+aU1hZ2ljICE9IE1OR19NQUdJQykpCisgICAgcmV0dXJuIE1OR19GQUxTRTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU1RBVFVTX1JFQURJTkcsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuICgobW5nX2RhdGFwKWhIYW5kbGUpLT5iUmVhZGluZzsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfUkVBRAorbW5nX2Jvb2wgTU5HX0RFQ0wgbW5nX3N0YXR1c19zdXNwZW5kYnJlYWsgKG1uZ19oYW5kbGUgaEhhbmRsZSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1NUQVRVU19TVVNQRU5EQlJFQUssIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAoKGhIYW5kbGUgPT0gMCkgfHwgKCgobW5nX2RhdGFwKWhIYW5kbGUpLT5pTWFnaWMgIT0gTU5HX01BR0lDKSkKKyAgICByZXR1cm4gTU5HX0ZBTFNFOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9TVEFUVVNfU1VTUEVOREJSRUFLLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiAoKG1uZ19kYXRhcCloSGFuZGxlKS0+YlN1c3BlbmRlZDsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfV1JJVEUKK21uZ19ib29sIE1OR19ERUNMIG1uZ19zdGF0dXNfY3JlYXRpbmcgKG1uZ19oYW5kbGUgaEhhbmRsZSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1NUQVRVU19DUkVBVElORywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmICgoaEhhbmRsZSA9PSAwKSB8fCAoKChtbmdfZGF0YXApaEhhbmRsZSktPmlNYWdpYyAhPSBNTkdfTUFHSUMpKQorICAgIHJldHVybiBNTkdfRkFMU0U7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1NUQVRVU19DUkVBVElORywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gKChtbmdfZGF0YXApaEhhbmRsZSktPmJDcmVhdGluZzsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfV1JJVEUKK21uZ19ib29sIE1OR19ERUNMIG1uZ19zdGF0dXNfd3JpdGluZyAobW5nX2hhbmRsZSBoSGFuZGxlKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU1RBVFVTX1dSSVRJTkcsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAoKGhIYW5kbGUgPT0gMCkgfHwgKCgobW5nX2RhdGFwKWhIYW5kbGUpLT5pTWFnaWMgIT0gTU5HX01BR0lDKSkKKyAgICByZXR1cm4gTU5HX0ZBTFNFOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9TVEFUVVNfV1JJVElORywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gKChtbmdfZGF0YXApaEhhbmRsZSktPmJXcml0aW5nOworfQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCittbmdfYm9vbCBNTkdfREVDTCBtbmdfc3RhdHVzX2Rpc3BsYXlpbmcgKG1uZ19oYW5kbGUgaEhhbmRsZSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1NUQVRVU19ESVNQTEFZSU5HLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKChoSGFuZGxlID09IDApIHx8ICgoKG1uZ19kYXRhcCloSGFuZGxlKS0+aU1hZ2ljICE9IE1OR19NQUdJQykpCisgICAgcmV0dXJuIE1OR19GQUxTRTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU1RBVFVTX0RJU1BMQVlJTkcsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuICgobW5nX2RhdGFwKWhIYW5kbGUpLT5iRGlzcGxheWluZzsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorbW5nX2Jvb2wgTU5HX0RFQ0wgbW5nX3N0YXR1c19ydW5uaW5nIChtbmdfaGFuZGxlIGhIYW5kbGUpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9TVEFUVVNfUlVOTklORywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmICgoaEhhbmRsZSA9PSAwKSB8fCAoKChtbmdfZGF0YXApaEhhbmRsZSktPmlNYWdpYyAhPSBNTkdfTUFHSUMpKQorICAgIHJldHVybiBNTkdfRkFMU0U7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1NUQVRVU19SVU5OSU5HLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiAoKG1uZ19kYXRhcCloSGFuZGxlKS0+YlJ1bm5pbmc7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX0RJU1BMQVkKK21uZ19ib29sIE1OR19ERUNMIG1uZ19zdGF0dXNfdGltZXJicmVhayAobW5nX2hhbmRsZSBoSGFuZGxlKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU1RBVFVTX1RJTUVSQlJFQUssIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBpZiAoKGhIYW5kbGUgPT0gMCkgfHwgKCgobW5nX2RhdGFwKWhIYW5kbGUpLT5pTWFnaWMgIT0gTU5HX01BR0lDKSkKKyAgICByZXR1cm4gTU5HX0ZBTFNFOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9TVEFUVVNfVElNRVJCUkVBSywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gKChtbmdfZGF0YXApaEhhbmRsZSktPmJUaW1lcnNldDsKK30KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfRFlOQU1JQ01ORworbW5nX2Jvb2wgTU5HX0RFQ0wgbW5nX3N0YXR1c19keW5hbWljIChtbmdfaGFuZGxlIGhIYW5kbGUpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9TVEFUVVNfRFlOQU1JQywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmICgoaEhhbmRsZSA9PSAwKSB8fCAoKChtbmdfZGF0YXApaEhhbmRsZSktPmlNYWdpYyAhPSBNTkdfTUFHSUMpKQorICAgIHJldHVybiBNTkdfRkFMU0U7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0VYICgoKG1uZ19kYXRhcCloSGFuZGxlKSwgTU5HX0ZOX1NUQVRVU19EWU5BTUlDLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiAoKG1uZ19kYXRhcCloSGFuZGxlKS0+YkR5bmFtaWM7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX0RZTkFNSUNNTkcKK21uZ19ib29sIE1OR19ERUNMIG1uZ19zdGF0dXNfcnVubmluZ2V2ZW50IChtbmdfaGFuZGxlIGhIYW5kbGUpCit7CisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFWCAoKChtbmdfZGF0YXApaEhhbmRsZSksIE1OR19GTl9TVEFUVVNfUlVOTklOR0VWRU5ULCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKChoSGFuZGxlID09IDApIHx8ICgoKG1uZ19kYXRhcCloSGFuZGxlKS0+aU1hZ2ljICE9IE1OR19NQUdJQykpCisgICAgcmV0dXJuIE1OR19GQUxTRTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRVggKCgobW5nX2RhdGFwKWhIYW5kbGUpLCBNTkdfRk5fU1RBVFVTX1JVTk5JTkdFVkVOVCwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gKChtbmdfZGF0YXApaEhhbmRsZSktPmJSdW5uaW5nZXZlbnQ7Cit9CisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogZW5kIG9mIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCmRpZmYgLS1naXQgYS9maWxlcy9Tb3VyY2UvTGliTU5HL2xpYm1uZ19yZWFkLmMgYi9maWxlcy9Tb3VyY2UvTGliTU5HL2xpYm1uZ19yZWFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkyMmUxOQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9MaWJNTkcvbGlibW5nX3JlYWQuYwpAQCAtMCwwICsxLDEzNjkgQEAKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBsaWJtbmcuaCAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBwcm9qZWN0ICAgOiBsaWJtbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogZmlsZSAgICAgIDogbGlibW5nX3JlYWQuYyAgICAgICAgICAgICBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwNyBHLkp1eW4gICAqICovCisvKiAqIHZlcnNpb24gICA6IDEuMC4xMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogcHVycG9zZSAgIDogUmVhZCBsb2dpYyAoaW1wbGVtZW50YXRpb24pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBhdXRob3IgICAgOiBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGNvbW1lbnQgICA6IGltcGxlbWVudGF0aW9uIG9mIHRoZSBoaWdoLWxldmVsIHJlYWQgbG9naWMgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogY2hhbmdlcyAgIDogMC41LjEgLSAwNS8wOC8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2hhbmdlZCBzdHJpY3QtQU5TSSBzdHVmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMSAtIDA1LzExLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBjYWxsYmFjayBlcnJvci1yZXBvcnRpbmcgc3VwcG9ydCAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4xIC0gMDUvMTIvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNoYW5nZWQgdHJhY2UgdG8gbWFjcm8gZm9yIGNhbGxiYWNrIGVycm9yLXJlcG9ydGluZyAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4yIC0gMDUvMTkvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNsZWFuZWQgdXAgc29tZSBjb2RlIHJlZ2FyZGluZyBtaXhlZCBzdXBwb3J0ICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjIgLSAwNS8yMC8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgc3VwcG9ydCBmb3IgSk5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMiAtIDA1LzMxLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaXhlZCB1cCBwdW5jdHVhdGlvbiAoY29udHJpYnV0aW9uIGJ5IFRpbSBSb3dsZXkpICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMyAtIDA2LzE2LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjaGFuZ2VkIHByb2dyZXNzaXZlLWRpc3BsYXkgcHJvY2Vzc2luZyAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMSAtIDA3LzA4LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjaGFuZ2VkIHJlYWQtcHJvY2Vzc2luZyBmb3IgaW1wcm92ZWQgSS9PLXN1c3BlbnNpb24gICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4xIC0gMDcvMTQvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNoYW5nZWQgRU9GIHByb2Nlc3NpbmcgYmVoYXZpb3IgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjEgLSAwNy8xNC8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2hhbmdlZCBkZWZhdWx0IHJlYWRidWZmZXIgc2l6ZSBmcm9tIDEwMjQgdG8gNDIwMCAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjIgLSAwNy8yNy8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gQjExMDMyMCAtIGZpeGVkIEdDQyB3YXJuaW5nIGFib3V0IG1peC1zaXplZCBwb2ludGVyIG1hdGggKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMiAtIDA3LzMxLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBCMTEwNTQ2IC0gZml4ZWQgZm9yIGltcHJvcGVybHkgcmV0dXJuaW5nIFVORVhQRUNURURFT0YgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4yIC0gMDgvMDQvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIEIxMTEwOTYgLSBmaXhlZCBsYXJnZS1idWZmZXIgcmVhZC1zdXNwZW5zaW9uICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjIgLSAwOC8wNS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2hhbmdlZCBmaWxlLXByZWZpeGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjMgLSAwOC8yNi8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgTUFHTiBjaHVuayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMyAtIDEwLzExLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSByZW1vdmVkIHRlc3QtTWFHTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4zIC0gMTAvMTYvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHN1cHBvcnQgZm9yIEpEQUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS41IC0gMDEvMjMvMjAwMSAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIHRpbWluZy1wcm9ibGVtIHdpdGggc3dpdGNoaW5nIGZyYW1pbmdfbW9kZXMgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC40IC0gMDYvMjIvMjAwMiAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIEI0OTU0NDMgLSBpbmNvcnJlY3Qgc3VzcGVuZCBjaGVjayBpbiByZWFkX2RhdGFidWZmZXIgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC41IC0gMDcvMDQvMjAwMiAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGVycm9yY29kZSBmb3IgZXh0cmVtZSBjaHVuay1zaXplcyAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAwNy8wOC8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gQjU3ODU3MiAtIHJlbW92ZWQgZU1OR21hIGhhY2sgKHRoYW5rcyBEaW1pdHJpISkgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDA3LzE2LzIwMDIgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBCNTgxNjI1IC0gbGFyZ2UgY2h1bmtzIGZhaWwgd2l0aCBzdXNwZW5zaW9uIHJlYWRzICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC41IC0gMDgvMTkvMjAwMiAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIEI1OTcxMzQgLSBsaWJtbmcgcG9sbHV0ZXMgdGhlIGxpbmtlciBuYW1lc3BhY2UgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBITEFQSSBmdW5jdGlvbiB0byBjb3B5IGNodW5rcyAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC41IC0gMDkvMTYvMjAwMiAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGV2ZW50IGhhbmRsaW5nIGZvciBkeW5hbWljIE1ORyAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC42IC0gMDUvMjUvMjAwMyAtIEcuUi1QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIE1OR19TS0lQQ0hVTktfY0hOSyBmb290cHJpbnQgb3B0aW1pemF0aW9ucyAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjYgLSAwNy8wNy8yMDAzIC0gRy5SLVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgTU5HX05PX0RFTFRBX1BORyByZWR1Y3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIHNraXAgYWRkaXRpb25hbCBjb2RlIHdoZW4gTU5HX0lOQ0xVREVfSk5HIGlzIG5vdCBlbmFibGVkICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjYgLSAwNy8yOS8yMDAzIC0gRy5SLVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgY29uZGl0aW9uYWxzIGFyb3VuZCBQQVNUIGNodW5rIHN1cHBvcnQgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNiAtIDA4LzE3LzIwMDMgLSBHLlItUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBjb25kaXRpb25hbHMgYXJvdW5kIG5vbi1WTEMgY2h1bmsgc3VwcG9ydCAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNyAtIDAzLzEwLzIwMDQgLSBHLlItUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBjb25kaXRpb25hbHMgYXJvdW5kIG9wZW5zdHJlYW0vY2xvc2VzdHJlYW0gICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuOCAtIDA0LzA4LzIwMDQgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBDUkMgZXhpc3RlbmNlICYgY2hlY2tpbmcgZmxhZ3MgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC44IC0gMDQvMTEvMjAwNCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGRhdGEtcHVzaCBtZWNoYW5pc21zIGZvciBzcGVjaWFsaXplZCBkZWNvZGVycyAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjggLSAwNy8wNi8yMDA0IC0gRy5SLVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZGVmZW5kIGFnYWluc3QgdXNpbmcgdW5kZWZpbmVkIGNsb3Nlc3RyZWFtIGZ1bmN0aW9uICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuOCAtIDA3LzI4LzIwMDQgLSBHLlItUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBjaGVjayBmb3IgZXh0cmVtZSBjaHVuay1sZW5ndGhzICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuOSAtIDA5LzE2LzIwMDQgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaXhlZCBjaHVuayBwdXNoaW5nIG1lY2hhbmlzbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC45IC0gMTIvMDUvMjAwNCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGNvbmRpdGlvbmFsIE1OR19PUFRJTUlaRV9DSFVOS0lOSVRGUkVFICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjkgLSAxMi8wNi8yMDA0IC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgY29uZGl0aW9uYWwgTU5HX09QVElNSVpFX0NIVU5LQVNTSUdOICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGNvbmRpdGlvbmFsIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUiAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjkgLSAxMi8yMC8yMDA0IC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2xlYW5lZCB1cCBtYWNyby1pbnZvY2F0aW9ucyAodGhhbmtzIHRvIEQuIEFpcmxpZSkgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuOSAtIDEyLzMxLzIwMDQgLSBHLlItUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSByZW1vdmVkIHN0cmF5IGNoYXJhY3RlcnMgZnJvbSAjaWZkZWYgZGlyZWN0aXZlICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuMTAgLSAwNC8wOC8yMDA3IC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBzdXBwb3J0IGZvciBtUE5HIHByb3Bvc2FsICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2luY2x1ZGUgImxpYm1uZy5oIgorI2luY2x1ZGUgImxpYm1uZ19kYXRhLmgiCisjaW5jbHVkZSAibGlibW5nX2Vycm9yLmgiCisjaW5jbHVkZSAibGlibW5nX3RyYWNlLmgiCisjaWZkZWYgX19CT1JMQU5EQ19fCisjcHJhZ21hIGhkcnN0b3AKKyNlbmRpZgorI2luY2x1ZGUgImxpYm1uZ19tZW1vcnkuaCIKKyNpbmNsdWRlICJsaWJtbmdfb2JqZWN0cy5oIgorI2luY2x1ZGUgImxpYm1uZ19vYmplY3RfcHJjLmgiCisjaW5jbHVkZSAibGlibW5nX2NodW5rcy5oIgorI2lmZGVmIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUgorI2luY2x1ZGUgImxpYm1uZ19jaHVua19kZXNjci5oIgorI2VuZGlmCisjaW5jbHVkZSAibGlibW5nX2NodW5rX3ByYy5oIgorI2luY2x1ZGUgImxpYm1uZ19jaHVua19pby5oIgorI2luY2x1ZGUgImxpYm1uZ19kaXNwbGF5LmgiCisjaW5jbHVkZSAibGlibW5nX3JlYWQuaCIKKworI2lmIGRlZmluZWQoX19CT1JMQU5EQ19fKSAmJiBkZWZpbmVkKE1OR19TVFJJQ1RfQU5TSSkKKyNwcmFnbWEgb3B0aW9uIC1BICAgICAgICAgICAgICAgICAgICAgIC8qIGZvcmNlIEFOU0ktQyAqLworI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfSU5DTFVERV9SRUFEX1BST0NTCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19wcm9jZXNzX2VvZiAobW5nX2RhdGFwIHBEYXRhKQoreworICBpZiAoIXBEYXRhLT5iRU9GKSAgICAgICAgICAgICAgICAgICAgLyogaGF2ZW4ndCBjbG9zZWQgdGhlIHN0cmVhbSB5ZXQgPyAqLworICB7CisgICAgcERhdGEtPmJFT0YgPSBNTkdfVFJVRTsgICAgICAgICAgICAvKiBub3cgd2UgZG8hICovCisKKyNpZm5kZWYgTU5HX05PX09QRU5fQ0xPU0VfU1RSRUFNCisgICAgaWYgKHBEYXRhLT5mQ2xvc2VzdHJlYW0gJiYgIXBEYXRhLT5mQ2xvc2VzdHJlYW0gKChtbmdfaGFuZGxlKXBEYXRhKSkKKyAgICB7CisgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfQVBQSU9FUlJPUik7CisgICAgfQorI2VuZGlmCisgIH0KKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19yZWxlYXNlX3B1c2hkYXRhIChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ19wdXNoZGF0YXAgcEZpcnN0ICA9IHBEYXRhLT5wRmlyc3RwdXNoZGF0YTsKKyAgbW5nX3B1c2hkYXRhcCBwTmV4dCAgID0gcEZpcnN0LT5wTmV4dDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9SRUxFQVNFX1BVU0hEQVRBLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcERhdGEtPnBGaXJzdHB1c2hkYXRhID0gcE5leHQ7ICAgICAgIC8qIG5leHQgYmVjb21lcyB0aGUgZmlyc3QgKi8KKworICBpZiAoIXBOZXh0KSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm8gbmV4dD8gPT4gbm8gbGFzdCEgKi8KKyAgICBwRGF0YS0+cExhc3RwdXNoZGF0YSA9IE1OR19OVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYnVmZmVyIG93bmVkIGFuZCByZWxlYXNlIGNhbGxiYWNrIGRlZmluZWQ/ICovCisgIGlmICgocEZpcnN0LT5iT3duZWQpICYmIChwRGF0YS0+ZlJlbGVhc2VkYXRhKSkKKyAgICBwRGF0YS0+ZlJlbGVhc2VkYXRhICgobW5nX2hhbmRsZSlwRGF0YSwgcEZpcnN0LT5wRGF0YSwgcEZpcnN0LT5pTGVuZ3RoKTsKKyAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG90aGVyd2lzZSB1c2UgaW50ZXJuYWwgZnJlZSBtZWNoYW5pc20gKi8KKyAgICBNTkdfRlJFRVggKHBEYXRhLCBwRmlyc3QtPnBEYXRhLCBwRmlyc3QtPmlMZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIGZyZWUgaXQgKi8KKyAgTU5HX0ZSRUVYIChwRGF0YSwgcEZpcnN0LCBzaXplb2YobW5nX3B1c2hkYXRhKSk7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVMRUFTRV9QVVNIREFUQSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19yZWxlYXNlX3B1c2hjaHVuayAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfcHVzaGRhdGFwIHBGaXJzdCAgPSBwRGF0YS0+cEZpcnN0cHVzaGNodW5rOworICBtbmdfcHVzaGRhdGFwIHBOZXh0ICAgPSBwRmlyc3QtPnBOZXh0OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1JFTEVBU0VfUFVTSENIVU5LLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcERhdGEtPnBGaXJzdHB1c2hjaHVuayA9IHBOZXh0OyAgICAgIC8qIG5leHQgYmVjb21lcyB0aGUgZmlyc3QgKi8KKworICBpZiAoIXBOZXh0KSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm8gbmV4dD8gPT4gbm8gbGFzdCEgKi8KKyAgICBwRGF0YS0+cExhc3RwdXNoY2h1bmsgPSBNTkdfTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1ZmZlciBvd25lZCBhbmQgcmVsZWFzZSBjYWxsYmFjayBkZWZpbmVkPyAqLworICBpZiAoKHBGaXJzdC0+Yk93bmVkKSAmJiAocERhdGEtPmZSZWxlYXNlZGF0YSkpCisgICAgcERhdGEtPmZSZWxlYXNlZGF0YSAoKG1uZ19oYW5kbGUpcERhdGEsIHBGaXJzdC0+cERhdGEsIHBGaXJzdC0+aUxlbmd0aCk7CisgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvdGhlcndpc2UgdXNlIGludGVybmFsIGZyZWUgbWVjaGFuaXNtICovCisgICAgTU5HX0ZSRUVYIChwRGF0YSwgcEZpcnN0LT5wRGF0YSwgcEZpcnN0LT5pTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCBmcmVlIGl0ICovCisgIE1OR19GUkVFWCAocERhdGEsIHBGaXJzdCwgc2l6ZW9mKG1uZ19wdXNoZGF0YSkpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1JFTEVBU0VfUFVTSENIVU5LLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworTU5HX0xPQ0FMIG1uZ19yZXRjb2RlIHJlYWRfZGF0YSAobW5nX2RhdGFwICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCAgIHBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgaVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICogaVJlYWQpCit7CisgIG1uZ19yZXRjb2RlICAgaVJldGNvZGU7CisgIG1uZ191aW50MzIgICAgaVRlbXBzaXplID0gaVNpemU7CisgIG1uZ191aW50OHAgICAgcFRlbXBidWYgID0gcEJ1ZjsKKyAgbW5nX3B1c2hkYXRhcCBwUHVzaCAgICAgPSBwRGF0YS0+cEZpcnN0cHVzaGRhdGE7CisgIG1uZ191aW50MzIgICAgaVB1c2hzaXplID0gMDsKKyAgKmlSZWFkICAgICAgICAgICAgICAgICAgPSAwOyAgICAgICAgIC8qIG5vdGhpbmcgeWV0ICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVBRF9EQVRBLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgd2hpbGUgKHBQdXNoKSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNhbGN1bGF0ZSBzaXplIG9mIHB1c2hlZCBkYXRhICovCisgIHsKKyAgICBpUHVzaHNpemUgKz0gcFB1c2gtPmlSZW1haW5pbmc7CisgICAgcFB1c2ggICAgICA9IHBQdXNoLT5wTmV4dDsKKyAgfQorCisgIGlmIChpVGVtcHNpemUgPD0gaVB1c2hzaXplKSAgICAgICAgICAvKiBnb3QgZW5vdWdoIHB1c2ggZGF0YT8gKi8KKyAgeworICAgIHdoaWxlIChpVGVtcHNpemUpCisgICAgeworICAgICAgcFB1c2ggPSBwRGF0YS0+cEZpcnN0cHVzaGRhdGE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbm91Z2ggZGF0YSByZW1haW5pbmcgaW4gdGhpcyBidWZmZXI/ICovCisgICAgICBpZiAocFB1c2gtPmlSZW1haW5pbmcgPD0gaVRlbXBzaXplKQorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm86IHRoZW4gY29weSB3aGF0IHdlJ3ZlIGdvdCAqLworICAgICAgICBNTkdfQ09QWSAocFRlbXBidWYsIHBQdXNoLT5wRGF0YW5leHQsIHBQdXNoLT5pUmVtYWluaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vdmUgcG9pbnRlcnMgJiBsZW5ndGhzICovCisgICAgICAgIHBUZW1wYnVmICArPSBwUHVzaC0+aVJlbWFpbmluZzsKKyAgICAgICAgKmlSZWFkICAgICs9IHBQdXNoLT5pUmVtYWluaW5nOworICAgICAgICBpVGVtcHNpemUgLT0gcFB1c2gtPmlSZW1haW5pbmc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWxlYXNlIHRoZSBkZXBsZXRlZCBidWZmZXIgKi8KKyAgICAgICAgaVJldGNvZGUgPSBtbmdfcmVsZWFzZV9wdXNoZGF0YSAocERhdGEpOworICAgICAgICBpZiAoaVJldGNvZGUpCisgICAgICAgICAgcmV0dXJuIGlSZXRjb2RlOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29weSB0aGUgbmVlZGVkIGJ5dGVzICovCisgICAgICAgIE1OR19DT1BZIChwVGVtcGJ1ZiwgcFB1c2gtPnBEYXRhbmV4dCwgaVRlbXBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vdmUgcG9pbnRlcnMgJiBsZW5ndGhzICovCisgICAgICAgIHBQdXNoLT5pUmVtYWluaW5nIC09IGlUZW1wc2l6ZTsKKyAgICAgICAgcFB1c2gtPnBEYXRhbmV4dCAgKz0gaVRlbXBzaXplOworICAgICAgICBwVGVtcGJ1ZiAgICAgICAgICArPSBpVGVtcHNpemU7CisgICAgICAgICppUmVhZCAgICAgICAgICAgICs9IGlUZW1wc2l6ZTsKKyAgICAgICAgaVRlbXBzaXplICAgICAgICAgPSAwOyAgICAgICAgIC8qIGFsbCBkb25lISEhICovCisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIG1uZ191aW50MzIgaVRlbXByZWFkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCBpdCBmcm9tIHRoZSBhcHAgdGhlbiAqLworICAgIGlmICghcERhdGEtPmZSZWFkZGF0YSAoKChtbmdfaGFuZGxlKXBEYXRhKSwgcFRlbXBidWYsIGlUZW1wc2l6ZSwgJmlUZW1wcmVhZCkpCisgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfQVBQSU9FUlJPUik7CisKKyAgICAqaVJlYWQgKz0gaVRlbXByZWFkOworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVBRF9EQVRBLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworTU5HX0xPQ0FMIG1uZ19yZXRjb2RlIHJlYWRfZGF0YWJ1ZmZlciAobW5nX2RhdGFwICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCAgIHBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwICogcEJ1Zm5leHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICAgaVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICogaVJlYWQpCit7CisgIG1uZ19yZXRjb2RlIGlSZXRjb2RlOworICAKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVBRF9EQVRBQlVGRkVSLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKHBEYXRhLT5iU3VzcGVuc2lvbm1vZGUpCisgIHsKKyAgICBtbmdfdWludDhwIHBUZW1wOworICAgIG1uZ191aW50MzIgaVRlbXA7CisKKyAgICAqaVJlYWQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxldCdzIGJlIG5lZ2F0aXZlIGFib3V0IHRoZSBvdXRjb21lICovCisKKyAgICBpZiAoIXBEYXRhLT5wU3VzcGVuZGJ1ZikgICAgICAgICAgIC8qIG5lZWQgdG8gY3JlYXRlIGEgc3VzcGVuc2lvbiBidWZmZXIgPyAqLworICAgIHsKKyAgICAgIHBEYXRhLT5pU3VzcGVuZGJ1ZnNpemUgPSBNTkdfU1VTUEVOREJVRkZFUlNJWkU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzbywgY3JlYXRlIGl0ICovCisgICAgICBNTkdfQUxMT0MgKHBEYXRhLCBwRGF0YS0+cFN1c3BlbmRidWYsIHBEYXRhLT5pU3VzcGVuZGJ1ZnNpemUpOworCisgICAgICBwRGF0YS0+aVN1c3BlbmRidWZsZWZ0ID0gMDsgICAgICAvKiBtYWtlIHN1cmUgdG8gZmlsbCBpdCBmaXJzdCB0aW1lICovCisgICAgICBwRGF0YS0+cFN1c3BlbmRidWZuZXh0ID0gcERhdGEtPnBTdXNwZW5kYnVmOworICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vcmUgdGhhbiBvdXIgYnVmZmVyIGNhbiBob2xkID8gKi8KKyAgICBpZiAoaVNpemUgPiBwRGF0YS0+aVN1c3BlbmRidWZzaXplKQorICAgIHsKKyAgICAgIG1uZ191aW50MzIgaVJlbWFpbjsKKworICAgICAgaWYgKCEqcEJ1Zm5leHQpICAgICAgICAgICAgICAgICAgLyogZmlyc3QgdGltZSA/ICovCisgICAgICB7CisgICAgICAgIGlmIChwRGF0YS0+aVN1c3BlbmRidWZsZWZ0KSAgICAvKiBkbyB3ZSBoYXZlIHNvbWUgZGF0YSBsZWZ0ID8gKi8KKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZW4gY29weSBpdCAqLworICAgICAgICAgIE1OR19DT1BZIChwQnVmLCBwRGF0YS0+cFN1c3BlbmRidWZuZXh0LCBwRGF0YS0+aVN1c3BlbmRidWZsZWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpeHVwIHZhcmlhYmxlcyAqLworICAgICAgICAgICpwQnVmbmV4dCAgICAgICAgICAgICAgPSBwQnVmICsgcERhdGEtPmlTdXNwZW5kYnVmbGVmdDsKKyAgICAgICAgICBwRGF0YS0+cFN1c3BlbmRidWZuZXh0ID0gcERhdGEtPnBTdXNwZW5kYnVmOworICAgICAgICAgIHBEYXRhLT5pU3VzcGVuZGJ1ZmxlZnQgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICpwQnVmbmV4dCAgICAgICAgICAgICAgPSBwQnVmOworICAgICAgICB9CisgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjYWxjdWxhdGUgaG93IG11Y2ggdG8gZ2V0ICovCisgICAgICBpUmVtYWluID0gaVNpemUgLSAobW5nX3VpbnQzMikoKnBCdWZuZXh0IC0gcEJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZXQncyBnbyBnZXQgaXQgKi8KKyAgICAgIGlSZXRjb2RlID0gcmVhZF9kYXRhIChwRGF0YSwgKnBCdWZuZXh0LCBpUmVtYWluLCAmaVRlbXApOworICAgICAgaWYgKGlSZXRjb2RlKQorICAgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaXJzdCByZWFkIGFmdGVyIHN1c3BlbnNpb24gcmV0dXJuIDAgbWVhbnMgRU9GICovCisgICAgICBpZiAoKHBEYXRhLT5pU3VzcGVuZHBvaW50KSAmJiAoaVRlbXAgPT0gMCkpCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGF0IG1ha2VzIGl0IGZpbmFsICovCisgICAgICAgIG1uZ19yZXRjb2RlIGlSZXRjb2RlID0gbW5nX3Byb2Nlc3NfZW9mIChwRGF0YSk7CisgICAgICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluZGljYXRlIHRoZSBzb3VyY2UgaXMgZGVwbGV0ZWQgKi8KKyAgICAgICAgKmlSZWFkID0gaVNpemUgLSBpUmVtYWluICsgaVRlbXA7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGlmIChpVGVtcCA8IGlSZW1haW4pICAgICAgICAgICAvKiBzdXNwZW5zaW9uIHJlcXVpcmVkID8gKi8KKyAgICAgICAgeworICAgICAgICAgICpwQnVmbmV4dCAgICAgICAgID0gKnBCdWZuZXh0ICsgaVRlbXA7CisgICAgICAgICAgcERhdGEtPmJTdXNwZW5kZWQgPSBNTkdfVFJVRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAqaVJlYWQgPSBpU2l6ZTsgICAgICAgICAgICAgIC8qIGdvdCBpdCBhbGwgbm93ICEgKi8KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuZWVkIHRvIHJlYWQgc29tZSBtb3JlID8gKi8KKyAgICAgIHdoaWxlICgoIXBEYXRhLT5iU3VzcGVuZGVkKSAmJiAoIXBEYXRhLT5iRU9GKSAmJiAoaVNpemUgPiBwRGF0YS0+aVN1c3BlbmRidWZsZWZ0KSkKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdCBlbm91Z2ggc3BhY2UgbGVmdCBpbiBidWZmZXIgPyAqLworICAgICAgICBpZiAocERhdGEtPmlTdXNwZW5kYnVmc2l6ZSAtIHBEYXRhLT5pU3VzcGVuZGJ1ZmxlZnQgLQorICAgICAgICAgICAgKG1uZ191aW50MzIpKHBEYXRhLT5wU3VzcGVuZGJ1Zm5leHQgLSBwRGF0YS0+cFN1c3BlbmRidWYpIDwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTkdfU1VTUEVORFJFUVVFU1RTSVpFKQorICAgICAgICB7CisgICAgICAgICAgaWYgKHBEYXRhLT5pU3VzcGVuZGJ1ZmxlZnQpICAvKiB0aGVuIGxldHMgc2hpZnQgKGlmIHRoZXJlJ3MgYW55dGhpbmcgbGVmdCkgKi8KKyAgICAgICAgICAgIE1OR19DT1BZIChwRGF0YS0+cFN1c3BlbmRidWYsIHBEYXRhLT5wU3VzcGVuZGJ1Zm5leHQsIHBEYXRhLT5pU3VzcGVuZGJ1ZmxlZnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRqdXN0IHJ1bm5pbmcgcG9pbnRlciAqLworICAgICAgICAgIHBEYXRhLT5wU3VzcGVuZGJ1Zm5leHQgPSBwRGF0YS0+cFN1c3BlbmRidWY7CisgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0aWxsIG5vdCBlbm91Z2ggcm9vbSA/ICovCisgICAgICAgIGlmIChwRGF0YS0+aVN1c3BlbmRidWZzaXplIC0gcERhdGEtPmlTdXNwZW5kYnVmbGVmdCA8IE1OR19TVVNQRU5EUkVRVUVTVFNJWkUpCisgICAgICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVEVSTkFMRVJST1IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm93IHJlYWQgc29tZSBtb3JlIGRhdGEgKi8KKyAgICAgICAgcFRlbXAgPSBwRGF0YS0+cFN1c3BlbmRidWZuZXh0ICsgcERhdGEtPmlTdXNwZW5kYnVmbGVmdDsKKworICAgICAgICBpUmV0Y29kZSA9IHJlYWRfZGF0YSAocERhdGEsIHBUZW1wLCBNTkdfU1VTUEVORFJFUVVFU1RTSVpFLCAmaVRlbXApOworICAgICAgICBpZiAoaVJldGNvZGUpCisgICAgICAgICAgcmV0dXJuIGlSZXRjb2RlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRqdXN0IGZpbGwtY291bnRlciAqLworICAgICAgICBwRGF0YS0+aVN1c3BlbmRidWZsZWZ0ICs9IGlUZW1wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmlyc3QgcmVhZCBhZnRlciBzdXNwZW5zaW9uIHJldHVybmluZyAwIG1lYW5zIEVPRiAqLworICAgICAgICBpZiAoKHBEYXRhLT5pU3VzcGVuZHBvaW50KSAmJiAoaVRlbXAgPT0gMCkpCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGF0IG1ha2VzIGl0IGZpbmFsICovCisgICAgICAgICAgbW5nX3JldGNvZGUgaVJldGNvZGUgPSBtbmdfcHJvY2Vzc19lb2YgKHBEYXRhKTsKKyAgICAgICAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICAgICAgICByZXR1cm4gaVJldGNvZGU7CisKKyAgICAgICAgICBpZiAocERhdGEtPmlTdXNwZW5kYnVmbGVmdCkgIC8qIHJldHVybiB0aGUgbGVmdG92ZXIgc2NyYXBzICovCisgICAgICAgICAgICBNTkdfQ09QWSAocEJ1ZiwgcERhdGEtPnBTdXNwZW5kYnVmbmV4dCwgcERhdGEtPmlTdXNwZW5kYnVmbGVmdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgaW5kaWNhdGUgc28gKi8KKyAgICAgICAgICAqaVJlYWQgPSBwRGF0YS0+aVN1c3BlbmRidWZsZWZ0OworICAgICAgICAgIHBEYXRhLT5wU3VzcGVuZGJ1Zm5leHQgPSBwRGF0YS0+cFN1c3BlbmRidWY7CisgICAgICAgICAgcERhdGEtPmlTdXNwZW5kYnVmbGVmdCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3VzcGVuc2lvbiByZXF1aXJlZCA/ICovCisgICAgICAgICAgaWYgKChpU2l6ZSA+IHBEYXRhLT5pU3VzcGVuZGJ1ZmxlZnQpICYmIChpVGVtcCA8IE1OR19TVVNQRU5EUkVRVUVTVFNJWkUpKQorICAgICAgICAgICAgcERhdGEtPmJTdXNwZW5kZWQgPSBNTkdfVFJVRTsKKworICAgICAgICB9CisKKyAgICAgICAgcERhdGEtPmlTdXNwZW5kcG9pbnQgPSAwOyAgICAgIC8qIHJlc2V0IGl0IGhlcmUgaW4gY2FzZSB3ZSBsb29wIGJhY2sgKi8KKyAgICAgIH0KKworICAgICAgaWYgKCghcERhdGEtPmJTdXNwZW5kZWQpICYmICghcERhdGEtPmJFT0YpKQorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIHRoZSBkYXRhICEgKi8KKyAgICAgICAgTU5HX0NPUFkgKHBCdWYsIHBEYXRhLT5wU3VzcGVuZGJ1Zm5leHQsIGlTaXplKTsKKworICAgICAgICAqaVJlYWQgPSBpU2l6ZTsgICAgICAgICAgICAgICAgLyogcmV0dXJuZWQgaXQgYWxsICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGp1c3Qgc3VzcGVuc2lvbi1idWZmZXIgdmFyaWFibGVzICovCisgICAgICAgIHBEYXRhLT5wU3VzcGVuZGJ1Zm5leHQgKz0gaVNpemU7CisgICAgICAgIHBEYXRhLT5pU3VzcGVuZGJ1ZmxlZnQgLT0gaVNpemU7CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIGlSZXRjb2RlID0gcmVhZF9kYXRhIChwRGF0YSwgKG1uZ19wdHIpcEJ1ZiwgaVNpemUsIGlSZWFkKTsKKyAgICBpZiAoaVJldGNvZGUpCisgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgaWYgKCppUmVhZCA9PSAwKSAgICAgICAgICAgICAgICAgICAvKiBzdXNwZW5zaW9uIHJlcXVpcmVkID8gKi8KKyAgICAgIHBEYXRhLT5iU3VzcGVuZGVkID0gTU5HX1RSVUU7CisgIH0KKworICBwRGF0YS0+aVN1c3BlbmRwb2ludCA9IDA7ICAgICAgICAgICAgLyogc2FmZWx5IHJlc2V0IGl0IGhlcmUgISAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1JFQURfREFUQUJVRkZFUiwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK01OR19MT0NBTCBtbmdfcmV0Y29kZSBwcm9jZXNzX3Jhd19jaHVuayAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlCdWZsZW4pCit7CisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisgIC8qIHRoZSB0YWJsZS1pZGVhICYgYmluYXJ5IHNlYXJjaCBjb2RlIHdhcyBhZGFwdGVkIGZyb20KKyAgICAgbGlicG5nIDEuMS4wIChwbmdyZWFkLmMpICovCisgIC8qIE5PVEUxOiB0aGUgdGFibGUgbXVzdCByZW1haW4gc29ydGVkIGJ5IGNodW5rbmFtZSwgb3RoZXJ3aXNlIHRoZSBiaW5hcnkKKyAgICAgc2VhcmNoIHdpbGwgYnJlYWsgISEhIChwcy4gd2F0Y2ggdXBwZXItL2xvd2VyLWNhc2UgY2h1bmtuYW1lcyAhISkgKi8KKyAgLyogTk9URTI6IHRoZSBsYXlvdXQgbXVzdCByZW1haW4gZXF1YWwgdG8gdGhlIGhlYWRlciBwYXJ0IG9mIGFsbCB0aGUKKyAgICAgY2h1bmstc3RydWN0dXJlcyAoeWVzLCB0aGF0IG1lYW5zIGV2ZW4gdGhlIHBOZXh0IGFuZCBwUHJldiBmaWVsZHM7CisgICAgIGl0J3Mgd2FzdGluZyBhIGJpdCBvZiBzcGFjZSwgYnV0IGhleSwgdGhlIGNvZGUgaXMgYSBsb3QgZWFzaWVyKSAqLworCisjaWZkZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKyAgbW5nX2NodW5rX2hlYWRlciBtbmdfY2h1bmtfdW5rbm93biA9IHtNTkdfVUlOVF9IVUgsIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX3Vua25vd24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3JlYWRfdW5rbm93biwgbW5nX3dyaXRlX3Vua25vd24sIG1uZ19hc3NpZ25fdW5rbm93biwgMCwgMCwgc2l6ZW9mKG1uZ191bmtub3duX2NodW5rKX07CisjZWxzZQorICBtbmdfY2h1bmtfaGVhZGVyIG1uZ19jaHVua191bmtub3duID0ge01OR19VSU5UX0hVSCwgbW5nX2luaXRfdW5rbm93biwgbW5nX2ZyZWVfdW5rbm93biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcmVhZF91bmtub3duLCBtbmdfd3JpdGVfdW5rbm93biwgbW5nX2Fzc2lnbl91bmtub3duLCAwLCAwfTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUKKworICBtbmdfY2h1bmtfaGVhZGVyIG1uZ19jaHVua190YWJsZSBbXSA9CisgIHsKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19CQUNLCisgICAge01OR19VSU5UX0JBQ0ssIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX2dlbmVyYWwsIG1uZ19yZWFkX2JhY2ssIG1uZ193cml0ZV9iYWNrLCBtbmdfYXNzaWduX2dlbmVyYWwsIDAsIDAsIHNpemVvZihtbmdfYmFjayl9LAorI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfQkFTSQorICAgIHtNTkdfVUlOVF9CQVNJLCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9nZW5lcmFsLCBtbmdfcmVhZF9iYXNpLCBtbmdfd3JpdGVfYmFzaSwgbW5nX2Fzc2lnbl9nZW5lcmFsLCAwLCAwLCBzaXplb2YobW5nX2Jhc2kpfSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX0NMSVAKKyAgICB7TU5HX1VJTlRfQ0xJUCwgbW5nX2luaXRfZ2VuZXJhbCwgbW5nX2ZyZWVfZ2VuZXJhbCwgbW5nX3JlYWRfY2xpcCwgbW5nX3dyaXRlX2NsaXAsIG1uZ19hc3NpZ25fZ2VuZXJhbCwgMCwgMCwgc2l6ZW9mKG1uZ19jbGlwKX0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19DTE9OCisgICAge01OR19VSU5UX0NMT04sIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX2dlbmVyYWwsIG1uZ19yZWFkX2Nsb24sIG1uZ193cml0ZV9jbG9uLCBtbmdfYXNzaWduX2dlbmVyYWwsIDAsIDAsIHNpemVvZihtbmdfY2xvbil9LAorI2VuZGlmCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19EQllLCisgICAge01OR19VSU5UX0RCWUssIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX2RieWssICAgIG1uZ19yZWFkX2RieWssIG1uZ193cml0ZV9kYnlrLCBtbmdfYXNzaWduX2RieWssICAgIDAsIDAsIHNpemVvZihtbmdfZGJ5ayl9LAorI2VuZGlmCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19ERUZJCisgICAge01OR19VSU5UX0RFRkksIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX2dlbmVyYWwsIG1uZ19yZWFkX2RlZmksIG1uZ193cml0ZV9kZWZpLCBtbmdfYXNzaWduX2dlbmVyYWwsIDAsIDAsIHNpemVvZihtbmdfZGVmaSl9LAorI2VuZGlmCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKKyAgICB7TU5HX1VJTlRfREhEUiwgbW5nX2luaXRfZ2VuZXJhbCwgbW5nX2ZyZWVfZ2VuZXJhbCwgbW5nX3JlYWRfZGhkciwgbW5nX3dyaXRlX2RoZHIsIG1uZ19hc3NpZ25fZ2VuZXJhbCwgMCwgMCwgc2l6ZW9mKG1uZ19kaGRyKX0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19ESVNDCisgICAge01OR19VSU5UX0RJU0MsIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX2Rpc2MsICAgIG1uZ19yZWFkX2Rpc2MsIG1uZ193cml0ZV9kaXNjLCBtbmdfYXNzaWduX2Rpc2MsICAgIDAsIDAsIHNpemVvZihtbmdfZGlzYyl9LAorI2VuZGlmCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19EUk9QCisgICAge01OR19VSU5UX0RST1AsIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX2Ryb3AsICAgIG1uZ19yZWFkX2Ryb3AsIG1uZ193cml0ZV9kcm9wLCBtbmdfYXNzaWduX2Ryb3AsICAgIDAsIDAsIHNpemVvZihtbmdfZHJvcCl9LAorI2VuZGlmCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19MT09QCisgICAge01OR19VSU5UX0VOREwsIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX2dlbmVyYWwsIG1uZ19yZWFkX2VuZGwsIG1uZ193cml0ZV9lbmRsLCBtbmdfYXNzaWduX2dlbmVyYWwsIDAsIDAsIHNpemVvZihtbmdfZW5kbCl9LAorI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfRlJBTQorICAgIHtNTkdfVUlOVF9GUkFNLCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9mcmFtLCAgICBtbmdfcmVhZF9mcmFtLCBtbmdfd3JpdGVfZnJhbSwgbW5nX2Fzc2lnbl9mcmFtLCAgICAwLCAwLCBzaXplb2YobW5nX2ZyYW0pfSwKKyNlbmRpZgorICAgIHtNTkdfVUlOVF9JREFULCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9pZGF0LCAgICBtbmdfcmVhZF9pZGF0LCBtbmdfd3JpdGVfaWRhdCwgbW5nX2Fzc2lnbl9pZGF0LCAgICAwLCAwLCBzaXplb2YobW5nX2lkYXQpfSwgIC8qIDEyLXRoIGVsZW1lbnQhICovCisgICAge01OR19VSU5UX0lFTkQsIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX2dlbmVyYWwsIG1uZ19yZWFkX2llbmQsIG1uZ193cml0ZV9pZW5kLCBtbmdfYXNzaWduX2dlbmVyYWwsIDAsIDAsIHNpemVvZihtbmdfaWVuZCl9LAorICAgIHtNTkdfVUlOVF9JSERSLCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9nZW5lcmFsLCBtbmdfcmVhZF9paGRyLCBtbmdfd3JpdGVfaWhkciwgbW5nX2Fzc2lnbl9nZW5lcmFsLCAwLCAwLCBzaXplb2YobW5nX2loZHIpfSwKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworI2lmZGVmIE1OR19JTkNMVURFX0pORworICAgIHtNTkdfVUlOVF9JSk5HLCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9nZW5lcmFsLCBtbmdfcmVhZF9pam5nLCBtbmdfd3JpdGVfaWpuZywgbW5nX2Fzc2lnbl9nZW5lcmFsLCAwLCAwLCBzaXplb2YobW5nX2lqbmcpfSwKKyNlbmRpZgorICAgIHtNTkdfVUlOVF9JUE5HLCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9nZW5lcmFsLCBtbmdfcmVhZF9pcG5nLCBtbmdfd3JpdGVfaXBuZywgbW5nX2Fzc2lnbl9nZW5lcmFsLCAwLCAwLCBzaXplb2YobW5nX2lwbmcpfSwKKyNlbmRpZgorI2lmZGVmIE1OR19JTkNMVURFX0pORworICAgIHtNTkdfVUlOVF9KREFBLCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9qZGFhLCAgICBtbmdfcmVhZF9qZGFhLCBtbmdfd3JpdGVfamRhYSwgbW5nX2Fzc2lnbl9qZGFhLCAgICAwLCAwLCBzaXplb2YobW5nX2pkYWEpfSwKKyAgICB7TU5HX1VJTlRfSkRBVCwgbW5nX2luaXRfZ2VuZXJhbCwgbW5nX2ZyZWVfamRhdCwgICAgbW5nX3JlYWRfamRhdCwgbW5nX3dyaXRlX2pkYXQsIG1uZ19hc3NpZ25famRhdCwgICAgMCwgMCwgc2l6ZW9mKG1uZ19qZGF0KX0sCisgICAge01OR19VSU5UX0pIRFIsIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX2dlbmVyYWwsIG1uZ19yZWFkX2poZHIsIG1uZ193cml0ZV9qaGRyLCBtbmdfYXNzaWduX2dlbmVyYWwsIDAsIDAsIHNpemVvZihtbmdfamhkcil9LAorICAgIHtNTkdfVUlOVF9KU0VQLCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9nZW5lcmFsLCBtbmdfcmVhZF9qc2VwLCBtbmdfd3JpdGVfanNlcCwgbW5nX2Fzc2lnbl9nZW5lcmFsLCAwLCAwLCBzaXplb2YobW5nX2pzZXApfSwKKyAgICB7TU5HX1VJTlRfSmRBQSwgbW5nX2luaXRfZ2VuZXJhbCwgbW5nX2ZyZWVfamRhYSwgICAgbW5nX3JlYWRfamRhYSwgbW5nX3dyaXRlX2pkYWEsIG1uZ19hc3NpZ25famRhYSwgICAgMCwgMCwgc2l6ZW9mKG1uZ19qZGFhKX0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19MT09QCisgICAge01OR19VSU5UX0xPT1AsIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX2xvb3AsICAgIG1uZ19yZWFkX2xvb3AsIG1uZ193cml0ZV9sb29wLCBtbmdfYXNzaWduX2xvb3AsICAgIDAsIDAsIHNpemVvZihtbmdfbG9vcCl9LAorI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfTUFHTgorICAgIHtNTkdfVUlOVF9NQUdOLCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9nZW5lcmFsLCBtbmdfcmVhZF9tYWduLCBtbmdfd3JpdGVfbWFnbiwgbW5nX2Fzc2lnbl9nZW5lcmFsLCAwLCAwLCBzaXplb2YobW5nX21hZ24pfSwKKyNlbmRpZgorICAgIHtNTkdfVUlOVF9NRU5ELCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9nZW5lcmFsLCBtbmdfcmVhZF9tZW5kLCBtbmdfd3JpdGVfbWVuZCwgbW5nX2Fzc2lnbl9nZW5lcmFsLCAwLCAwLCBzaXplb2YobW5nX21lbmQpfSwKKyAgICB7TU5HX1VJTlRfTUhEUiwgbW5nX2luaXRfZ2VuZXJhbCwgbW5nX2ZyZWVfZ2VuZXJhbCwgbW5nX3JlYWRfbWhkciwgbW5nX3dyaXRlX21oZHIsIG1uZ19hc3NpZ25fZ2VuZXJhbCwgMCwgMCwgc2l6ZW9mKG1uZ19taGRyKX0sCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfTU9WRQorICAgIHtNTkdfVUlOVF9NT1ZFLCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9nZW5lcmFsLCBtbmdfcmVhZF9tb3ZlLCBtbmdfd3JpdGVfbW92ZSwgbW5nX2Fzc2lnbl9nZW5lcmFsLCAwLCAwLCBzaXplb2YobW5nX21vdmUpfSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfT1JEUgorICAgIHtNTkdfVUlOVF9PUkRSLCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9vcmRyLCAgICBtbmdfcmVhZF9vcmRyLCBtbmdfd3JpdGVfb3JkciwgbW5nX2Fzc2lnbl9vcmRyLCAgICAwLCAwLCBzaXplb2YobW5nX29yZHIpfSwKKyNlbmRpZgorI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfUEFTVAorICAgIHtNTkdfVUlOVF9QQVNULCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9wYXN0LCAgICBtbmdfcmVhZF9wYXN0LCBtbmdfd3JpdGVfcGFzdCwgbW5nX2Fzc2lnbl9wYXN0LCAgICAwLCAwLCBzaXplb2YobW5nX3Bhc3QpfSwKKyNlbmRpZgorICAgIHtNTkdfVUlOVF9QTFRFLCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9nZW5lcmFsLCBtbmdfcmVhZF9wbHRlLCBtbmdfd3JpdGVfcGx0ZSwgbW5nX2Fzc2lnbl9nZW5lcmFsLCAwLCAwLCBzaXplb2YobW5nX3BsdGUpfSwKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworICAgIHtNTkdfVUlOVF9QUExULCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9nZW5lcmFsLCBtbmdfcmVhZF9wcGx0LCBtbmdfd3JpdGVfcHBsdCwgbW5nX2Fzc2lnbl9nZW5lcmFsLCAwLCAwLCBzaXplb2YobW5nX3BwbHQpfSwKKyAgICB7TU5HX1VJTlRfUFJPTSwgbW5nX2luaXRfZ2VuZXJhbCwgbW5nX2ZyZWVfZ2VuZXJhbCwgbW5nX3JlYWRfcHJvbSwgbW5nX3dyaXRlX3Byb20sIG1uZ19hc3NpZ25fZ2VuZXJhbCwgMCwgMCwgc2l6ZW9mKG1uZ19wcm9tKX0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19TQVZFCisgICAge01OR19VSU5UX1NBVkUsIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX3NhdmUsICAgIG1uZ19yZWFkX3NhdmUsIG1uZ193cml0ZV9zYXZlLCBtbmdfYXNzaWduX3NhdmUsICAgIDAsIDAsIHNpemVvZihtbmdfc2F2ZSl9LAorI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfU0VFSworICAgIHtNTkdfVUlOVF9TRUVLLCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9zZWVrLCAgICBtbmdfcmVhZF9zZWVrLCBtbmdfd3JpdGVfc2VlaywgbW5nX2Fzc2lnbl9zZWVrLCAgICAwLCAwLCBzaXplb2YobW5nX3NlZWspfSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX1NIT1cKKyAgICB7TU5HX1VJTlRfU0hPVywgbW5nX2luaXRfZ2VuZXJhbCwgbW5nX2ZyZWVfZ2VuZXJhbCwgbW5nX3JlYWRfc2hvdywgbW5nX3dyaXRlX3Nob3csIG1uZ19hc3NpZ25fZ2VuZXJhbCwgMCwgMCwgc2l6ZW9mKG1uZ19zaG93KX0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19URVJNCisgICAge01OR19VSU5UX1RFUk0sIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX2dlbmVyYWwsIG1uZ19yZWFkX3Rlcm0sIG1uZ193cml0ZV90ZXJtLCBtbmdfYXNzaWduX2dlbmVyYWwsIDAsIDAsIHNpemVvZihtbmdfdGVybSl9LAorI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfYktHRAorICAgIHtNTkdfVUlOVF9iS0dELCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9nZW5lcmFsLCBtbmdfcmVhZF9ia2dkLCBtbmdfd3JpdGVfYmtnZCwgbW5nX2Fzc2lnbl9nZW5lcmFsLCAwLCAwLCBzaXplb2YobW5nX2JrZ2QpfSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX2NIUk0KKyAgICB7TU5HX1VJTlRfY0hSTSwgbW5nX2luaXRfZ2VuZXJhbCwgbW5nX2ZyZWVfZ2VuZXJhbCwgbW5nX3JlYWRfY2hybSwgbW5nX3dyaXRlX2Nocm0sIG1uZ19hc3NpZ25fZ2VuZXJhbCwgMCwgMCwgc2l6ZW9mKG1uZ19jaHJtKX0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19lWFBJCisgICAge01OR19VSU5UX2VYUEksIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX2V4cGksICAgIG1uZ19yZWFkX2V4cGksIG1uZ193cml0ZV9leHBpLCBtbmdfYXNzaWduX2V4cGksICAgIDAsIDAsIHNpemVvZihtbmdfZXhwaSl9LAorI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfZXZOVAorICAgIHtNTkdfVUlOVF9ldk5ULCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9ldm50LCAgICBtbmdfcmVhZF9ldm50LCBtbmdfd3JpdGVfZXZudCwgbW5nX2Fzc2lnbl9ldm50LCAgICAwLCAwLCBzaXplb2YobW5nX2V2bnQpfSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX2ZQUkkKKyAgICB7TU5HX1VJTlRfZlBSSSwgbW5nX2luaXRfZ2VuZXJhbCwgbW5nX2ZyZWVfZ2VuZXJhbCwgbW5nX3JlYWRfZnByaSwgbW5nX3dyaXRlX2ZwcmksIG1uZ19hc3NpZ25fZ2VuZXJhbCwgMCwgMCwgc2l6ZW9mKG1uZ19mcHJpKX0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19nQU1BCisgICAge01OR19VSU5UX2dBTUEsIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX2dlbmVyYWwsIG1uZ19yZWFkX2dhbWEsIG1uZ193cml0ZV9nYW1hLCBtbmdfYXNzaWduX2dlbmVyYWwsIDAsIDAsIHNpemVvZihtbmdfZ2FtYSl9LAorI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfaElTVAorICAgIHtNTkdfVUlOVF9oSVNULCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9nZW5lcmFsLCBtbmdfcmVhZF9oaXN0LCBtbmdfd3JpdGVfaGlzdCwgbW5nX2Fzc2lnbl9nZW5lcmFsLCAwLCAwLCBzaXplb2YobW5nX2hpc3QpfSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX2lDQ1AKKyAgICB7TU5HX1VJTlRfaUNDUCwgbW5nX2luaXRfZ2VuZXJhbCwgbW5nX2ZyZWVfaWNjcCwgICAgbW5nX3JlYWRfaWNjcCwgbW5nX3dyaXRlX2ljY3AsIG1uZ19hc3NpZ25faWNjcCwgICAgMCwgMCwgc2l6ZW9mKG1uZ19pY2NwKX0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19pVFh0CisgICAge01OR19VSU5UX2lUWHQsIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX2l0eHQsICAgIG1uZ19yZWFkX2l0eHQsIG1uZ193cml0ZV9pdHh0LCBtbmdfYXNzaWduX2l0eHQsICAgIDAsIDAsIHNpemVvZihtbmdfaXR4dCl9LAorI2VuZGlmCisjaWZkZWYgTU5HX0lOQ0xVREVfTVBOR19QUk9QT1NBTAorICAgIHtNTkdfVUlOVF9tcE5HLCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9tcG5nLCAgICBtbmdfcmVhZF9tcG5nLCBtbmdfd3JpdGVfbXBuZywgbW5nX2Fzc2lnbl9tcG5nLCAgICAwLCAwLCBzaXplb2YobW5nX21wbmcpfSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX25FRUQKKyAgICB7TU5HX1VJTlRfbkVFRCwgbW5nX2luaXRfZ2VuZXJhbCwgbW5nX2ZyZWVfbmVlZCwgICAgbW5nX3JlYWRfbmVlZCwgbW5nX3dyaXRlX25lZWQsIG1uZ19hc3NpZ25fbmVlZCwgICAgMCwgMCwgc2l6ZW9mKG1uZ19uZWVkKX0sCisjZW5kaWYKKy8qIFRPRE86ICAgICB7TU5HX1VJTlRfb0ZGcywgMCwgMCwgMCwgMCwgMCwgMH0sICAqLworLyogVE9ETzogICAgIHtNTkdfVUlOVF9wQ0FMLCAwLCAwLCAwLCAwLCAwLCAwfSwgICovCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfcEhZZworICAgIHtNTkdfVUlOVF9wSFlnLCBtbmdfaW5pdF9nZW5lcmFsLCBtbmdfZnJlZV9nZW5lcmFsLCBtbmdfcmVhZF9waHlnLCBtbmdfd3JpdGVfcGh5ZywgbW5nX2Fzc2lnbl9nZW5lcmFsLCAwLCAwLCBzaXplb2YobW5nX3BoeWcpfSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX3BIWXMKKyAgICB7TU5HX1VJTlRfcEhZcywgbW5nX2luaXRfZ2VuZXJhbCwgbW5nX2ZyZWVfZ2VuZXJhbCwgbW5nX3JlYWRfcGh5cywgbW5nX3dyaXRlX3BoeXMsIG1uZ19hc3NpZ25fZ2VuZXJhbCwgMCwgMCwgc2l6ZW9mKG1uZ19waHlzKX0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19zQklUCisgICAge01OR19VSU5UX3NCSVQsIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX2dlbmVyYWwsIG1uZ19yZWFkX3NiaXQsIG1uZ193cml0ZV9zYml0LCBtbmdfYXNzaWduX2dlbmVyYWwsIDAsIDAsIHNpemVvZihtbmdfc2JpdCl9LAorI2VuZGlmCisvKiBUT0RPOiAgICAge01OR19VSU5UX3NDQUwsIDAsIDAsIDAsIDAsIDAsIDB9LCAgKi8KKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19zUExUCisgICAge01OR19VSU5UX3NQTFQsIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX3NwbHQsICAgIG1uZ19yZWFkX3NwbHQsIG1uZ193cml0ZV9zcGx0LCBtbmdfYXNzaWduX3NwbHQsICAgIDAsIDAsIHNpemVvZihtbmdfc3BsdCl9LAorI2VuZGlmCisgICAge01OR19VSU5UX3NSR0IsIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX2dlbmVyYWwsIG1uZ19yZWFkX3NyZ2IsIG1uZ193cml0ZV9zcmdiLCBtbmdfYXNzaWduX2dlbmVyYWwsIDAsIDAsIHNpemVvZihtbmdfc3JnYil9LAorI2lmbmRlZiBNTkdfU0tJUENIVU5LX3RFWHQKKyAgICB7TU5HX1VJTlRfdEVYdCwgbW5nX2luaXRfZ2VuZXJhbCwgbW5nX2ZyZWVfdGV4dCwgICAgbW5nX3JlYWRfdGV4dCwgbW5nX3dyaXRlX3RleHQsIG1uZ19hc3NpZ25fdGV4dCwgICAgMCwgMCwgc2l6ZW9mKG1uZ190ZXh0KX0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS190SU1FCisgICAge01OR19VSU5UX3RJTUUsIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX2dlbmVyYWwsIG1uZ19yZWFkX3RpbWUsIG1uZ193cml0ZV90aW1lLCBtbmdfYXNzaWduX2dlbmVyYWwsIDAsIDAsIHNpemVvZihtbmdfdGltZSl9LAorI2VuZGlmCisgICAge01OR19VSU5UX3RSTlMsIG1uZ19pbml0X2dlbmVyYWwsIG1uZ19mcmVlX2dlbmVyYWwsIG1uZ19yZWFkX3RybnMsIG1uZ193cml0ZV90cm5zLCBtbmdfYXNzaWduX2dlbmVyYWwsIDAsIDAsIHNpemVvZihtbmdfdHJucyl9LAorI2lmbmRlZiBNTkdfU0tJUENIVU5LX3pUWHQKKyAgICB7TU5HX1VJTlRfelRYdCwgbW5nX2luaXRfZ2VuZXJhbCwgbW5nX2ZyZWVfenR4dCwgICAgbW5nX3JlYWRfenR4dCwgbW5nX3dyaXRlX3p0eHQsIG1uZ19hc3NpZ25fenR4dCwgICAgMCwgMCwgc2l6ZW9mKG1uZ196dHh0KX0sCisjZW5kaWYKKyAgfTsKKworI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAvKiBNTkdfT1BUSU1JWkVfQ0hVTktJTklURlJFRSAqLworCisgIG1uZ19jaHVua19oZWFkZXIgbW5nX2NodW5rX3RhYmxlIFtdID0KKyAgeworI2lmbmRlZiBNTkdfU0tJUENIVU5LX0JBQ0sKKyAgICB7TU5HX1VJTlRfQkFDSywgbW5nX2luaXRfYmFjaywgbW5nX2ZyZWVfYmFjaywgbW5nX3JlYWRfYmFjaywgbW5nX3dyaXRlX2JhY2ssIG1uZ19hc3NpZ25fYmFjaywgMCwgMH0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19CQVNJCisgICAge01OR19VSU5UX0JBU0ksIG1uZ19pbml0X2Jhc2ksIG1uZ19mcmVlX2Jhc2ksIG1uZ19yZWFkX2Jhc2ksIG1uZ193cml0ZV9iYXNpLCBtbmdfYXNzaWduX2Jhc2ksIDAsIDB9LAorI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfQ0xJUAorICAgIHtNTkdfVUlOVF9DTElQLCBtbmdfaW5pdF9jbGlwLCBtbmdfZnJlZV9jbGlwLCBtbmdfcmVhZF9jbGlwLCBtbmdfd3JpdGVfY2xpcCwgbW5nX2Fzc2lnbl9jbGlwLCAwLCAwfSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX0NMT04KKyAgICB7TU5HX1VJTlRfQ0xPTiwgbW5nX2luaXRfY2xvbiwgbW5nX2ZyZWVfY2xvbiwgbW5nX3JlYWRfY2xvbiwgbW5nX3dyaXRlX2Nsb24sIG1uZ19hc3NpZ25fY2xvbiwgMCwgMH0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworI2lmbmRlZiBNTkdfU0tJUENIVU5LX0RCWUsKKyAgICB7TU5HX1VJTlRfREJZSywgbW5nX2luaXRfZGJ5aywgbW5nX2ZyZWVfZGJ5aywgbW5nX3JlYWRfZGJ5aywgbW5nX3dyaXRlX2RieWssIG1uZ19hc3NpZ25fZGJ5aywgMCwgMH0sCisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX0RFRkkKKyAgICB7TU5HX1VJTlRfREVGSSwgbW5nX2luaXRfZGVmaSwgbW5nX2ZyZWVfZGVmaSwgbW5nX3JlYWRfZGVmaSwgbW5nX3dyaXRlX2RlZmksIG1uZ19hc3NpZ25fZGVmaSwgMCwgMH0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworICAgIHtNTkdfVUlOVF9ESERSLCBtbmdfaW5pdF9kaGRyLCBtbmdfZnJlZV9kaGRyLCBtbmdfcmVhZF9kaGRyLCBtbmdfd3JpdGVfZGhkciwgbW5nX2Fzc2lnbl9kaGRyLCAwLCAwfSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX0RJU0MKKyAgICB7TU5HX1VJTlRfRElTQywgbW5nX2luaXRfZGlzYywgbW5nX2ZyZWVfZGlzYywgbW5nX3JlYWRfZGlzYywgbW5nX3dyaXRlX2Rpc2MsIG1uZ19hc3NpZ25fZGlzYywgMCwgMH0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworI2lmbmRlZiBNTkdfU0tJUENIVU5LX0RST1AKKyAgICB7TU5HX1VJTlRfRFJPUCwgbW5nX2luaXRfZHJvcCwgbW5nX2ZyZWVfZHJvcCwgbW5nX3JlYWRfZHJvcCwgbW5nX3dyaXRlX2Ryb3AsIG1uZ19hc3NpZ25fZHJvcCwgMCwgMH0sCisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX0xPT1AKKyAgICB7TU5HX1VJTlRfRU5ETCwgbW5nX2luaXRfZW5kbCwgbW5nX2ZyZWVfZW5kbCwgbW5nX3JlYWRfZW5kbCwgbW5nX3dyaXRlX2VuZGwsIG1uZ19hc3NpZ25fZW5kbCwgMCwgMH0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19GUkFNCisgICAge01OR19VSU5UX0ZSQU0sIG1uZ19pbml0X2ZyYW0sIG1uZ19mcmVlX2ZyYW0sIG1uZ19yZWFkX2ZyYW0sIG1uZ193cml0ZV9mcmFtLCBtbmdfYXNzaWduX2ZyYW0sIDAsIDB9LAorI2VuZGlmCisgICAge01OR19VSU5UX0lEQVQsIG1uZ19pbml0X2lkYXQsIG1uZ19mcmVlX2lkYXQsIG1uZ19yZWFkX2lkYXQsIG1uZ193cml0ZV9pZGF0LCBtbmdfYXNzaWduX2lkYXQsIDAsIDB9LCAgLyogMTItdGggZWxlbWVudCEgKi8KKyAgICB7TU5HX1VJTlRfSUVORCwgbW5nX2luaXRfaWVuZCwgbW5nX2ZyZWVfaWVuZCwgbW5nX3JlYWRfaWVuZCwgbW5nX3dyaXRlX2llbmQsIG1uZ19hc3NpZ25faWVuZCwgMCwgMH0sCisgICAge01OR19VSU5UX0lIRFIsIG1uZ19pbml0X2loZHIsIG1uZ19mcmVlX2loZHIsIG1uZ19yZWFkX2loZHIsIG1uZ193cml0ZV9paGRyLCBtbmdfYXNzaWduX2loZHIsIDAsIDB9LAorI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisgICAge01OR19VSU5UX0lKTkcsIG1uZ19pbml0X2lqbmcsIG1uZ19mcmVlX2lqbmcsIG1uZ19yZWFkX2lqbmcsIG1uZ193cml0ZV9pam5nLCBtbmdfYXNzaWduX2lqbmcsIDAsIDB9LAorI2VuZGlmCisgICAge01OR19VSU5UX0lQTkcsIG1uZ19pbml0X2lwbmcsIG1uZ19mcmVlX2lwbmcsIG1uZ19yZWFkX2lwbmcsIG1uZ193cml0ZV9pcG5nLCBtbmdfYXNzaWduX2lwbmcsIDAsIDB9LAorI2VuZGlmCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisgICAge01OR19VSU5UX0pEQUEsIG1uZ19pbml0X2pkYWEsIG1uZ19mcmVlX2pkYWEsIG1uZ19yZWFkX2pkYWEsIG1uZ193cml0ZV9qZGFhLCBtbmdfYXNzaWduX2pkYWEsIDAsIDB9LAorICAgIHtNTkdfVUlOVF9KREFULCBtbmdfaW5pdF9qZGF0LCBtbmdfZnJlZV9qZGF0LCBtbmdfcmVhZF9qZGF0LCBtbmdfd3JpdGVfamRhdCwgbW5nX2Fzc2lnbl9qZGF0LCAwLCAwfSwKKyAgICB7TU5HX1VJTlRfSkhEUiwgbW5nX2luaXRfamhkciwgbW5nX2ZyZWVfamhkciwgbW5nX3JlYWRfamhkciwgbW5nX3dyaXRlX2poZHIsIG1uZ19hc3NpZ25famhkciwgMCwgMH0sCisgICAge01OR19VSU5UX0pTRVAsIG1uZ19pbml0X2pzZXAsIG1uZ19mcmVlX2pzZXAsIG1uZ19yZWFkX2pzZXAsIG1uZ193cml0ZV9qc2VwLCBtbmdfYXNzaWduX2pzZXAsIDAsIDB9LAorICAgIHtNTkdfVUlOVF9KZEFBLCBtbmdfaW5pdF9qZGFhLCBtbmdfZnJlZV9qZGFhLCBtbmdfcmVhZF9qZGFhLCBtbmdfd3JpdGVfamRhYSwgbW5nX2Fzc2lnbl9qZGFhLCAwLCAwfSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX0xPT1AKKyAgICB7TU5HX1VJTlRfTE9PUCwgbW5nX2luaXRfbG9vcCwgbW5nX2ZyZWVfbG9vcCwgbW5nX3JlYWRfbG9vcCwgbW5nX3dyaXRlX2xvb3AsIG1uZ19hc3NpZ25fbG9vcCwgMCwgMH0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19NQUdOCisgICAge01OR19VSU5UX01BR04sIG1uZ19pbml0X21hZ24sIG1uZ19mcmVlX21hZ24sIG1uZ19yZWFkX21hZ24sIG1uZ193cml0ZV9tYWduLCBtbmdfYXNzaWduX21hZ24sIDAsIDB9LAorI2VuZGlmCisgICAge01OR19VSU5UX01FTkQsIG1uZ19pbml0X21lbmQsIG1uZ19mcmVlX21lbmQsIG1uZ19yZWFkX21lbmQsIG1uZ193cml0ZV9tZW5kLCBtbmdfYXNzaWduX21lbmQsIDAsIDB9LAorICAgIHtNTkdfVUlOVF9NSERSLCBtbmdfaW5pdF9taGRyLCBtbmdfZnJlZV9taGRyLCBtbmdfcmVhZF9taGRyLCBtbmdfd3JpdGVfbWhkciwgbW5nX2Fzc2lnbl9taGRyLCAwLCAwfSwKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19NT1ZFCisgICAge01OR19VSU5UX01PVkUsIG1uZ19pbml0X21vdmUsIG1uZ19mcmVlX21vdmUsIG1uZ19yZWFkX21vdmUsIG1uZ193cml0ZV9tb3ZlLCBtbmdfYXNzaWduX21vdmUsIDAsIDB9LAorI2VuZGlmCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19PUkRSCisgICAge01OR19VSU5UX09SRFIsIG1uZ19pbml0X29yZHIsIG1uZ19mcmVlX29yZHIsIG1uZ19yZWFkX29yZHIsIG1uZ193cml0ZV9vcmRyLCBtbmdfYXNzaWduX29yZHIsIDAsIDB9LAorI2VuZGlmCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19QQVNUCisgICAge01OR19VSU5UX1BBU1QsIG1uZ19pbml0X3Bhc3QsIG1uZ19mcmVlX3Bhc3QsIG1uZ19yZWFkX3Bhc3QsIG1uZ193cml0ZV9wYXN0LCBtbmdfYXNzaWduX3Bhc3QsIDAsIDB9LAorI2VuZGlmCisgICAge01OR19VSU5UX1BMVEUsIG1uZ19pbml0X3BsdGUsIG1uZ19mcmVlX3BsdGUsIG1uZ19yZWFkX3BsdGUsIG1uZ193cml0ZV9wbHRlLCBtbmdfYXNzaWduX3BsdGUsIDAsIDB9LAorI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisgICAge01OR19VSU5UX1BQTFQsIG1uZ19pbml0X3BwbHQsIG1uZ19mcmVlX3BwbHQsIG1uZ19yZWFkX3BwbHQsIG1uZ193cml0ZV9wcGx0LCBtbmdfYXNzaWduX3BwbHQsIDAsIDB9LAorICAgIHtNTkdfVUlOVF9QUk9NLCBtbmdfaW5pdF9wcm9tLCBtbmdfZnJlZV9wcm9tLCBtbmdfcmVhZF9wcm9tLCBtbmdfd3JpdGVfcHJvbSwgbW5nX2Fzc2lnbl9wcm9tLCAwLCAwfSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX1NBVkUKKyAgICB7TU5HX1VJTlRfU0FWRSwgbW5nX2luaXRfc2F2ZSwgbW5nX2ZyZWVfc2F2ZSwgbW5nX3JlYWRfc2F2ZSwgbW5nX3dyaXRlX3NhdmUsIG1uZ19hc3NpZ25fc2F2ZSwgMCwgMH0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19TRUVLCisgICAge01OR19VSU5UX1NFRUssIG1uZ19pbml0X3NlZWssIG1uZ19mcmVlX3NlZWssIG1uZ19yZWFkX3NlZWssIG1uZ193cml0ZV9zZWVrLCBtbmdfYXNzaWduX3NlZWssIDAsIDB9LAorI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfU0hPVworICAgIHtNTkdfVUlOVF9TSE9XLCBtbmdfaW5pdF9zaG93LCBtbmdfZnJlZV9zaG93LCBtbmdfcmVhZF9zaG93LCBtbmdfd3JpdGVfc2hvdywgbW5nX2Fzc2lnbl9zaG93LCAwLCAwfSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX1RFUk0KKyAgICB7TU5HX1VJTlRfVEVSTSwgbW5nX2luaXRfdGVybSwgbW5nX2ZyZWVfdGVybSwgbW5nX3JlYWRfdGVybSwgbW5nX3dyaXRlX3Rlcm0sIG1uZ19hc3NpZ25fdGVybSwgMCwgMH0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19iS0dECisgICAge01OR19VSU5UX2JLR0QsIG1uZ19pbml0X2JrZ2QsIG1uZ19mcmVlX2JrZ2QsIG1uZ19yZWFkX2JrZ2QsIG1uZ193cml0ZV9ia2dkLCBtbmdfYXNzaWduX2JrZ2QsIDAsIDB9LAorI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfY0hSTQorICAgIHtNTkdfVUlOVF9jSFJNLCBtbmdfaW5pdF9jaHJtLCBtbmdfZnJlZV9jaHJtLCBtbmdfcmVhZF9jaHJtLCBtbmdfd3JpdGVfY2hybSwgbW5nX2Fzc2lnbl9jaHJtLCAwLCAwfSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX2VYUEkKKyAgICB7TU5HX1VJTlRfZVhQSSwgbW5nX2luaXRfZXhwaSwgbW5nX2ZyZWVfZXhwaSwgbW5nX3JlYWRfZXhwaSwgbW5nX3dyaXRlX2V4cGksIG1uZ19hc3NpZ25fZXhwaSwgMCwgMH0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19ldk5UCisgICAge01OR19VSU5UX2V2TlQsIG1uZ19pbml0X2V2bnQsIG1uZ19mcmVlX2V2bnQsIG1uZ19yZWFkX2V2bnQsIG1uZ193cml0ZV9ldm50LCBtbmdfYXNzaWduX2V2bnQsIDAsIDB9LAorI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfZlBSSQorICAgIHtNTkdfVUlOVF9mUFJJLCBtbmdfaW5pdF9mcHJpLCBtbmdfZnJlZV9mcHJpLCBtbmdfcmVhZF9mcHJpLCBtbmdfd3JpdGVfZnByaSwgbW5nX2Fzc2lnbl9mcHJpLCAwLCAwfSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX2dBTUEKKyAgICB7TU5HX1VJTlRfZ0FNQSwgbW5nX2luaXRfZ2FtYSwgbW5nX2ZyZWVfZ2FtYSwgbW5nX3JlYWRfZ2FtYSwgbW5nX3dyaXRlX2dhbWEsIG1uZ19hc3NpZ25fZ2FtYSwgMCwgMH0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19oSVNUCisgICAge01OR19VSU5UX2hJU1QsIG1uZ19pbml0X2hpc3QsIG1uZ19mcmVlX2hpc3QsIG1uZ19yZWFkX2hpc3QsIG1uZ193cml0ZV9oaXN0LCBtbmdfYXNzaWduX2hpc3QsIDAsIDB9LAorI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfaUNDUAorICAgIHtNTkdfVUlOVF9pQ0NQLCBtbmdfaW5pdF9pY2NwLCBtbmdfZnJlZV9pY2NwLCBtbmdfcmVhZF9pY2NwLCBtbmdfd3JpdGVfaWNjcCwgbW5nX2Fzc2lnbl9pY2NwLCAwLCAwfSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX2lUWHQKKyAgICB7TU5HX1VJTlRfaVRYdCwgbW5nX2luaXRfaXR4dCwgbW5nX2ZyZWVfaXR4dCwgbW5nX3JlYWRfaXR4dCwgbW5nX3dyaXRlX2l0eHQsIG1uZ19hc3NpZ25faXR4dCwgMCwgMH0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19uRUVECisgICAge01OR19VSU5UX25FRUQsIG1uZ19pbml0X25lZWQsIG1uZ19mcmVlX25lZWQsIG1uZ19yZWFkX25lZWQsIG1uZ193cml0ZV9uZWVkLCBtbmdfYXNzaWduX25lZWQsIDAsIDB9LAorI2VuZGlmCisvKiBUT0RPOiAgICAge01OR19VSU5UX29GRnMsIDAsIDAsIDAsIDAsIDAsIDB9LCAgKi8KKy8qIFRPRE86ICAgICB7TU5HX1VJTlRfcENBTCwgMCwgMCwgMCwgMCwgMCwgMH0sICAqLworI2lmbmRlZiBNTkdfU0tJUENIVU5LX3BIWWcKKyAgICB7TU5HX1VJTlRfcEhZZywgbW5nX2luaXRfcGh5ZywgbW5nX2ZyZWVfcGh5ZywgbW5nX3JlYWRfcGh5ZywgbW5nX3dyaXRlX3BoeWcsIG1uZ19hc3NpZ25fcGh5ZywgMCwgMH0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19wSFlzCisgICAge01OR19VSU5UX3BIWXMsIG1uZ19pbml0X3BoeXMsIG1uZ19mcmVlX3BoeXMsIG1uZ19yZWFkX3BoeXMsIG1uZ193cml0ZV9waHlzLCBtbmdfYXNzaWduX3BoeXMsIDAsIDB9LAorI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfc0JJVAorICAgIHtNTkdfVUlOVF9zQklULCBtbmdfaW5pdF9zYml0LCBtbmdfZnJlZV9zYml0LCBtbmdfcmVhZF9zYml0LCBtbmdfd3JpdGVfc2JpdCwgbW5nX2Fzc2lnbl9zYml0LCAwLCAwfSwKKyNlbmRpZgorLyogVE9ETzogICAgIHtNTkdfVUlOVF9zQ0FMLCAwLCAwLCAwLCAwLCAwLCAwfSwgICovCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfc1BMVAorICAgIHtNTkdfVUlOVF9zUExULCBtbmdfaW5pdF9zcGx0LCBtbmdfZnJlZV9zcGx0LCBtbmdfcmVhZF9zcGx0LCBtbmdfd3JpdGVfc3BsdCwgbW5nX2Fzc2lnbl9zcGx0LCAwLCAwfSwKKyNlbmRpZgorICAgIHtNTkdfVUlOVF9zUkdCLCBtbmdfaW5pdF9zcmdiLCBtbmdfZnJlZV9zcmdiLCBtbmdfcmVhZF9zcmdiLCBtbmdfd3JpdGVfc3JnYiwgbW5nX2Fzc2lnbl9zcmdiLCAwLCAwfSwKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS190RVh0CisgICAge01OR19VSU5UX3RFWHQsIG1uZ19pbml0X3RleHQsIG1uZ19mcmVlX3RleHQsIG1uZ19yZWFkX3RleHQsIG1uZ193cml0ZV90ZXh0LCBtbmdfYXNzaWduX3RleHQsIDAsIDB9LAorI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfdElNRQorICAgIHtNTkdfVUlOVF90SU1FLCBtbmdfaW5pdF90aW1lLCBtbmdfZnJlZV90aW1lLCBtbmdfcmVhZF90aW1lLCBtbmdfd3JpdGVfdGltZSwgbW5nX2Fzc2lnbl90aW1lLCAwLCAwfSwKKyNlbmRpZgorICAgIHtNTkdfVUlOVF90Uk5TLCBtbmdfaW5pdF90cm5zLCBtbmdfZnJlZV90cm5zLCBtbmdfcmVhZF90cm5zLCBtbmdfd3JpdGVfdHJucywgbW5nX2Fzc2lnbl90cm5zLCAwLCAwfSwKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS196VFh0CisgICAge01OR19VSU5UX3pUWHQsIG1uZ19pbml0X3p0eHQsIG1uZ19mcmVlX3p0eHQsIG1uZ19yZWFkX3p0eHQsIG1uZ193cml0ZV96dHh0LCBtbmdfYXNzaWduX3p0eHQsIDAsIDB9LAorI2VuZGlmCisgIH07CisKKyNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgLyogTU5HX09QVElNSVpFX0NIVU5LSU5JVEZSRUUgKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYmluYXJ5IHNlYXJjaCB2YXJpYWJsZXMgKi8KKyAgbW5nX2ludDMyICAgICAgICAgaVRvcCwgaUxvd2VyLCBpVXBwZXIsIGlNaWRkbGU7CisgIG1uZ19jaHVua19oZWFkZXJwIHBFbnRyeTsgICAgICAgICAgICAvKiBwb2ludGVyIHRvIGZvdW5kIGVudHJ5ICovCisjZWxzZQorICBtbmdfY2h1bmtfaGVhZGVyICBzRW50cnk7ICAgICAgICAgICAgLyogdGVtcCBjaHVuay1oZWFkZXIgKi8KKyNlbmRpZiAvKiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIgKi8KKworICBtbmdfY2h1bmtpZCAgICAgICBpQ2h1bmtuYW1lOyAgICAgICAgLyogdGhlIGNodW5rJ3MgdGFnICovCisgIG1uZ19jaHVua3AgICAgICAgIHBDaHVuazsgICAgICAgICAgICAvKiBjaHVuayBzdHJ1Y3R1cmUgKGlmICNkZWZpbmUgTU5HX1NUT1JFX0NIVU5LUykgKi8KKyAgbW5nX3JldGNvZGUgICAgICAgaVJldGNvZGU7ICAgICAgICAgIC8qIHRlbXBvcmFyeSBlcnJvci1jb2RlICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUFJPQ0VTU19SQVdfQ0hVTkssIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlc2V0IHRpbWVyIGluZGljYXRvciBvbiByZWFkLWN5Y2xlICovCisgIGlmICgocERhdGEtPmJSZWFkaW5nKSAmJiAoIXBEYXRhLT5iRGlzcGxheWluZykpCisgICAgcERhdGEtPmJUaW1lcnNldCA9IE1OR19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCB0aGUgY2h1bmtuYW1lICovCisgIGlDaHVua25hbWUgPSAobW5nX2NodW5raWQpKG1uZ19nZXRfdWludDMyIChwQnVmKSk7CisKKyAgcEJ1ZiArPSBzaXplb2YgKG1uZ19jaHVua2lkKTsgICAgICAgIC8qIGFkanVzdCB0aGUgYnVmZmVyICovCisgIGlCdWZsZW4gLT0gc2l6ZW9mIChtbmdfY2h1bmtpZCk7CisgIHBDaHVuayA9IDA7CisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZXRlcm1pbmUgbWF4IGluZGV4IG9mIHRhYmxlICovCisgIGlUb3AgPSAoc2l6ZW9mIChtbmdfY2h1bmtfdGFibGUpIC8gc2l6ZW9mIChtbmdfY2h1bmtfdGFibGUgWzBdKSkgLSAxOworCisgIC8qIGJpbmFyeSBzZWFyY2g7IHdpdGggNTQgY2h1bmtzLCB3b3JzdC1jYXNlIGlzIDcgY29tcGFyaXNvbnMgKi8KKyAgaUxvd2VyICA9IDA7CisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKKyAgaU1pZGRsZSA9IDExOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0IHdpdGggdGhlIElEQVQgZW50cnkgKi8KKyNlbHNlCisgIGlNaWRkbGUgPSA4OworI2VuZGlmCisgIGlVcHBlciAgPSBpVG9wOworICBwRW50cnkgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm8gZ29vZHMgeWV0ISAqLworCisgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGUgYmluYXJ5IHNlYXJjaCBpdHNlbGYgKi8KKyAgICB7CisgICAgICBpZiAobW5nX2NodW5rX3RhYmxlIFtpTWlkZGxlXS5pQ2h1bmtuYW1lIDwgaUNodW5rbmFtZSkKKyAgICAgICAgaUxvd2VyID0gaU1pZGRsZSArIDE7CisgICAgICBlbHNlIGlmIChtbmdfY2h1bmtfdGFibGUgW2lNaWRkbGVdLmlDaHVua25hbWUgPiBpQ2h1bmtuYW1lKQorICAgICAgICBpVXBwZXIgPSBpTWlkZGxlIC0gMTsKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgcEVudHJ5ID0gJm1uZ19jaHVua190YWJsZSBbaU1pZGRsZV07CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBpTWlkZGxlID0gKGlMb3dlciArIGlVcHBlcikgPj4gMTsKKyAgICB9CisgIHdoaWxlIChpTG93ZXIgPD0gaVVwcGVyKTsKKworICBpZiAoIXBFbnRyeSkgICAgICAgICAgICAgICAgICAgICAgICAgLyogdW5rbm93biBjaHVuayA/ICovCisgICAgcEVudHJ5ID0gJm1uZ19jaHVua191bmtub3duOyAgICAgICAvKiBtYWtlIGl0IHNvISAqLworCisjZWxzZSAvKiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIgKi8KKworICBtbmdfZ2V0X2NodW5raGVhZGVyIChpQ2h1bmtuYW1lLCAmc0VudHJ5KTsKKworI2VuZGlmIC8qIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUiAqLworCisgIHBEYXRhLT5pQ2h1bmtuYW1lID0gaUNodW5rbmFtZTsgICAgICAvKiBrZWVwIHRyYWNrIG9mIHdoZXJlIHdlIGFyZSAqLworICBwRGF0YS0+aUNodW5rc2VxKys7CisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisgIGlmIChwRW50cnktPmZSZWFkKSAgICAgICAgICAgICAgICAgICAvKiByZWFkLWNhbGxiYWNrIGF2YWlsYWJsZSA/ICovCisgIHsKKyAgICBpUmV0Y29kZSA9IHBFbnRyeS0+ZlJlYWQgKHBEYXRhLCBwRW50cnksIGlCdWZsZW4sIChtbmdfcHRyKXBCdWYsICZwQ2h1bmspOworCisgICAgaWYgKCFpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAvKiBldmVyeXRoaW5nIG9rZSA/ICovCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZW1lbWJlciB1bmtub3duIGNodW5rJ3MgaWQgKi8KKyAgICAgIGlmICgocENodW5rKSAmJiAocEVudHJ5LT5pQ2h1bmtuYW1lID09IE1OR19VSU5UX0hVSCkpCisgICAgICAgICgobW5nX2NodW5rX2hlYWRlcnApcENodW5rKS0+aUNodW5rbmFtZSA9IGlDaHVua25hbWU7CisgICAgfQorICB9CisjZWxzZSAvKiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIgKi8KKyAgaWYgKHNFbnRyeS5mUmVhZCkgICAgICAgICAgICAgICAgICAgIC8qIHJlYWQtY2FsbGJhY2sgYXZhaWxhYmxlID8gKi8KKyAgeworICAgIGlSZXRjb2RlID0gc0VudHJ5LmZSZWFkIChwRGF0YSwgJnNFbnRyeSwgaUJ1ZmxlbiwgKG1uZ19wdHIpcEJ1ZiwgJnBDaHVuayk7CisKKyNpZm5kZWYgTU5HX09QVElNSVpFX0NIVU5LUkVBREVSCisgICAgaWYgKCFpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgICAvKiBldmVyeXRoaW5nIG9rZSA/ICovCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZW1lbWJlciB1bmtub3duIGNodW5rJ3MgaWQgKi8KKyAgICAgIGlmICgocENodW5rKSAmJiAoc0VudHJ5LmlDaHVua25hbWUgPT0gTU5HX1VJTlRfSFVIKSkKKyAgICAgICAgKChtbmdfY2h1bmtfaGVhZGVycClwQ2h1bmspLT5pQ2h1bmtuYW1lID0gaUNodW5rbmFtZTsKKyAgICB9CisjZW5kaWYKKyAgfQorI2VuZGlmIC8qIE1OR19PUFRJTUlaRV9DSFVOS1JFQURFUiAqLworICBlbHNlCisgICAgaVJldGNvZGUgPSBNTkdfTk9FUlJPUjsKKworICBpZiAocENodW5rKSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmUgdGhpcyBjaHVuayA/ICovCisgICAgbW5nX2FkZF9jaHVuayAocERhdGEsIHBDaHVuayk7ICAgICAvKiBkbyBpdCAqLworCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HICAgICAgICAgICAgICAgICAvKiBpbXBsaWNpdCBFT0YgPyAqLworICBpZiAoKCFwRGF0YS0+Ykhhc01IRFIpICYmICghcERhdGEtPmJIYXNJSERSKSAmJiAoIXBEYXRhLT5iSGFzSkhEUikpCisjZWxzZQorICBpZiAoKCFwRGF0YS0+Ykhhc01IRFIpICYmICghcERhdGEtPmJIYXNJSERSKSkKKyNlbmRpZgorICAgIGlSZXRjb2RlID0gbW5nX3Byb2Nlc3NfZW9mIChwRGF0YSk7LyogdGhlbiBkbyBzb21lIEVPRiBwcm9jZXNzaW5nICovCisKKyAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgcmV0dXJuIGlSZXRjb2RlOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1BST0NFU1NfUkFXX0NIVU5LLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworTU5HX0xPQ0FMIG1uZ19yZXRjb2RlIGNoZWNrX2NodW5rX2NyYyAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaUJ1ZmxlbikKK3sKKyAgbW5nX3VpbnQzMiAgaUNyYzsgICAgICAgICAgICAgICAgICAgIC8qIGNhbGN1bGF0ZWQgQ1JDICovCisgIG1uZ19ib29sICAgIGJEaXNjYXJkID0gTU5HX0ZBTFNFOworICBtbmdfcmV0Y29kZSBpUmV0Y29kZSA9IE1OR19OT0VSUk9SOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1JFQURfQ0hVTktfQ1JDLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKHBEYXRhLT5pQ3JjbW9kZSAmIE1OR19DUkNfSU5QVVQpIC8qIGNyYyBpbmNsdWRlZCA/ICovCisgIHsKKyAgICBtbmdfYm9vbCBiQ3JpdGljYWwgPSAobW5nX2Jvb2wpKCgqcEJ1ZiAmIDB4MjApID09IDApOworICAgIG1uZ191aW50MzIgaUwgPSBpQnVmbGVuIC0gKG1uZ191aW50MzIpKHNpemVvZiAoaUNyYykpOworCisgICAgaWYgKCgoYkNyaXRpY2FsICkgJiYgKHBEYXRhLT5pQ3JjbW9kZSAmIE1OR19DUkNfQ1JJVElDQUwgKSkgfHwKKyAgICAgICAgKCghYkNyaXRpY2FsKSAmJiAocERhdGEtPmlDcmNtb2RlICYgTU5HX0NSQ19BTkNJTExBUlkpKSkKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNhbGN1bGF0ZSB0aGUgY3JjICovCisgICAgICBpQ3JjID0gbW5nX2NyYyAocERhdGEsIHBCdWYsIGlMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCBjaGVjayBpdCAqLworICAgICAgaWYgKCEoaUNyYyA9PSBtbmdfZ2V0X3VpbnQzMiAocEJ1ZiArIGlMKSkpCisgICAgICB7CisgICAgICAgIG1uZ19ib29sIGJXYXJuaW5nID0gTU5HX0ZBTFNFOworICAgICAgICBtbmdfYm9vbCBiRXJyb3IgICA9IE1OR19GQUxTRTsKKworICAgICAgICBpZiAoYkNyaXRpY2FsKQorICAgICAgICB7CisgICAgICAgICAgc3dpdGNoIChwRGF0YS0+aUNyY21vZGUgJiBNTkdfQ1JDX0NSSVRJQ0FMKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgTU5HX0NSQ19DUklUSUNBTF9XQVJOSU5HICA6IHsgYldhcm5pbmcgPSBNTkdfVFJVRTsgYnJlYWs7IH0KKyAgICAgICAgICAgIGNhc2UgTU5HX0NSQ19DUklUSUNBTF9FUlJPUiAgICA6IHsgYkVycm9yICAgPSBNTkdfVFJVRTsgYnJlYWs7IH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgc3dpdGNoIChwRGF0YS0+aUNyY21vZGUgJiBNTkdfQ1JDX0FOQ0lMTEFSWSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIE1OR19DUkNfQU5DSUxMQVJZX0RJU0NBUkQgOiB7IGJEaXNjYXJkID0gTU5HX1RSVUU7IGJyZWFrOyB9CisgICAgICAgICAgICBjYXNlIE1OR19DUkNfQU5DSUxMQVJZX1dBUk5JTkcgOiB7IGJXYXJuaW5nID0gTU5HX1RSVUU7IGJyZWFrOyB9CisgICAgICAgICAgICBjYXNlIE1OR19DUkNfQU5DSUxMQVJZX0VSUk9SICAgOiB7IGJFcnJvciAgID0gTU5HX1RSVUU7IGJyZWFrOyB9CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGJXYXJuaW5nKQorICAgICAgICAgIE1OR19XQVJOSU5HIChwRGF0YSwgTU5HX0lOVkFMSURDUkMpOworICAgICAgICBpZiAoYkVycm9yKQorICAgICAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19JTlZBTElEQ1JDKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWJEaXNjYXJkKSAgICAgICAgICAgICAgICAgICAgIC8qIHN0aWxsIHByb2Nlc3NpbmcgPyAqLworICAgICAgaVJldGNvZGUgPSBwcm9jZXNzX3Jhd19jaHVuayAocERhdGEsIHBCdWYsIGlMKTsKKyAgfQorICBlbHNlCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBubyBjcmMgPT4gc3RyYWlnaHQgb250byBwcm9jZXNzaW5nICovCisgICAgaVJldGNvZGUgPSBwcm9jZXNzX3Jhd19jaHVuayAocERhdGEsIHBCdWYsIGlCdWZsZW4pOworICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVBRF9DSFVOS19DUkMsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIGlSZXRjb2RlOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitNTkdfTE9DQUwgbW5nX3JldGNvZGUgcmVhZF9jaHVuayAobW5nX2RhdGFwICBwRGF0YSkKK3sKKyAgbW5nX3VpbnQzMiAgaUJ1Zm1heCAgID0gcERhdGEtPmlSZWFkYnVmc2l6ZTsKKyAgbW5nX3VpbnQ4cCAgcEJ1ZiAgICAgID0gcERhdGEtPnBSZWFkYnVmOworICBtbmdfdWludDMyICBpQnVmbGVuICAgPSAwOyAgICAgICAgICAgLyogbnVtYmVyIG9mIGJ5dGVzIHJlcXVlc3RlZCAqLworICBtbmdfdWludDMyICBpUmVhZCAgICAgPSAwOyAgICAgICAgICAgLyogbnVtYmVyIG9mIGJ5dGVzIHJlYWQgKi8KKyAgbW5nX3JldGNvZGUgaVJldGNvZGUgID0gTU5HX05PRVJST1I7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fUkVBRF9DSFVOSywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorICBpZiAocERhdGEtPnBDdXJyYW5pb2JqKSAgICAgICAgICAgICAgLyogcHJvY2Vzc2luZyBhbiBhbmltYXRpb24gb2JqZWN0ID8gKi8KKyAgeworICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJvY2VzcyBpdCB0aGVuICovCisgICAgeworICAgICAgaVJldGNvZGUgPSAoKG1uZ19vYmplY3RfaGVhZGVycClwRGF0YS0+cEN1cnJhbmlvYmopLT5mUHJvY2VzcyAocERhdGEsIHBEYXRhLT5wQ3VycmFuaW9iaik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWZyZXNoIG5lZWRlZCA/ICovCisvKiAgICAgIGlmICgoIWlSZXRjb2RlKSAmJiAoIXBEYXRhLT5iVGltZXJzZXQpICYmIChwRGF0YS0+Yk5lZWRyZWZyZXNoKSkKKyAgICAgICAgaVJldGNvZGUgPSBkaXNwbGF5X3Byb2dyZXNzaXZlX3JlZnJlc2ggKHBEYXRhLCAxKTsgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNhbiB3ZSBhZHZhbmNlIHRvIG5leHQgb2JqZWN0ID8gKi8KKyAgICAgIGlmICgoIWlSZXRjb2RlKSAmJiAocERhdGEtPnBDdXJyYW5pb2JqKSAmJgorICAgICAgICAgICghcERhdGEtPmJUaW1lcnNldCkgJiYgKCFwRGF0YS0+YlNlY3Rpb253YWl0KSkKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlc2V0IHRpbWVyIGluZGljYXRvciBvbiByZWFkLWN5Y2xlICovCisgICAgICAgIGlmICgocERhdGEtPmJSZWFkaW5nKSAmJiAoIXBEYXRhLT5iRGlzcGxheWluZykpCisgICAgICAgICAgcERhdGEtPmJUaW1lcnNldCA9IE1OR19GQUxTRTsKKworICAgICAgICBwRGF0YS0+cEN1cnJhbmlvYmogPSAoKG1uZ19vYmplY3RfaGVhZGVycClwRGF0YS0+cEN1cnJhbmlvYmopLT5wTmV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRFUk0gcHJvY2Vzc2luZyB0byBiZSBkb25lID8gKi8KKyAgICAgICAgaWYgKCghcERhdGEtPnBDdXJyYW5pb2JqKSAmJiAocERhdGEtPmJIYXNURVJNKSAmJiAoIXBEYXRhLT5iSGFzTUhEUikpCisgICAgICAgICAgaVJldGNvZGUgPSBtbmdfcHJvY2Vzc19kaXNwbGF5X21lbmQgKHBEYXRhKTsKKyAgICAgIH0KKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVudGlsIGVycm9yIG9yIGEgYnJlYWsgb3Igbm8gbW9yZSBvYmplY3RzICovCisgICAgd2hpbGUgKCghaVJldGNvZGUpICYmIChwRGF0YS0+cEN1cnJhbmlvYmopICYmCisgICAgICAgICAgICghcERhdGEtPmJUaW1lcnNldCkgJiYgKCFwRGF0YS0+YlNlY3Rpb253YWl0KSAmJiAoIXBEYXRhLT5iRnJlZXppbmcpKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBpZiAocERhdGEtPmlCcmVha3BvaW50KSAgICAgICAgICAgIC8qIGRvIHdlIG5lZWQgdG8gZmluaXNoIHNvbWV0aGluZyBmaXJzdCA/ICovCisgICAgeworICAgICAgc3dpdGNoIChwRGF0YS0+aUJyZWFrcG9pbnQpICAgICAgLyogcmV0dXJuIHRvIGJyb2tlbiBkaXNwbGF5IHJvdXRpbmUgKi8KKyAgICAgIHsKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19GUkFNCisgICAgICAgIGNhc2UgIDEgOiB7IGlSZXRjb2RlID0gbW5nX3Byb2Nlc3NfZGlzcGxheV9mcmFtMiAocERhdGEpOyBicmVhazsgfQorI2VuZGlmCisgICAgICAgIGNhc2UgIDIgOiB7IGlSZXRjb2RlID0gbW5nX3Byb2Nlc3NfZGlzcGxheV9paGRyICAocERhdGEpOyBicmVhazsgfQorI2lmbmRlZiBNTkdfU0tJUENIVU5LX1NIT1cKKyAgICAgICAgY2FzZSAgMyA6IDsgICAgICAgICAgICAgICAgICAgICAvKiBzYW1lIGFzIDQgISEhICovCisgICAgICAgIGNhc2UgIDQgOiB7IGlSZXRjb2RlID0gbW5nX3Byb2Nlc3NfZGlzcGxheV9zaG93ICAocERhdGEpOyBicmVhazsgfQorI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfQ0xPTgorICAgICAgICBjYXNlICA1IDogeyBpUmV0Y29kZSA9IG1uZ19wcm9jZXNzX2Rpc3BsYXlfY2xvbjIgKHBEYXRhKTsgYnJlYWs7IH0KKyNlbmRpZgorI2lmZGVmIE1OR19JTkNMVURFX0pORworICAgICAgICBjYXNlICA3IDogeyBpUmV0Y29kZSA9IG1uZ19wcm9jZXNzX2Rpc3BsYXlfamhkciAgKHBEYXRhKTsgYnJlYWs7IH0KKyNlbmRpZgorICAgICAgICBjYXNlICA2IDogOyAgICAgICAgICAgICAgICAgICAgIC8qIHNhbWUgYXMgOCAhISEgKi8KKyAgICAgICAgY2FzZSAgOCA6IHsgaVJldGNvZGUgPSBtbmdfcHJvY2Vzc19kaXNwbGF5X2llbmQgIChwRGF0YSk7IGJyZWFrOyB9CisjaWZuZGVmIE1OR19TS0lQQ0hVTktfTUFHTgorICAgICAgICBjYXNlICA5IDogeyBpUmV0Y29kZSA9IG1uZ19wcm9jZXNzX2Rpc3BsYXlfbWFnbjIgKHBEYXRhKTsgYnJlYWs7IH0KKyNlbmRpZgorICAgICAgICBjYXNlIDEwIDogeyBpUmV0Y29kZSA9IG1uZ19wcm9jZXNzX2Rpc3BsYXlfbWVuZDIgKHBEYXRhKTsgYnJlYWs7IH0KKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19QQVNUCisgICAgICAgIGNhc2UgMTEgOiB7IGlSZXRjb2RlID0gbW5nX3Byb2Nlc3NfZGlzcGxheV9wYXN0MiAocERhdGEpOyBicmVhazsgfQorI2VuZGlmCisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgcmV0dXJuIGlSZXRjb2RlOworCisjZW5kaWYgLyogTU5HX1NVUFBPUlRfRElTUExBWSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2FuIHdlIGNvbnRpbnVlIHByb2Nlc3Npbmcgbm93LCBvciBkbyB3ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmVlZCB0byB3YWl0IGZvciB0aGUgdGltZXIgdG8gZmluaXNoIChhZ2FpbikgPyAqLworI2lmZGVmIE1OR19TVVBQT1JUX0RJU1BMQVkKKyAgaWYgKCghcERhdGEtPmJUaW1lcnNldCkgJiYgKCFwRGF0YS0+YlNlY3Rpb253YWl0KSAmJiAoIXBEYXRhLT5iRU9GKSkKKyNlbHNlCisgIGlmICghcERhdGEtPmJFT0YpCisjZW5kaWYKKyAgeworI2lmZGVmIE1OR19TVVBQT1JUX0RJU1BMQVkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZyZWV6aW5nIGluIHByb2dyZXNzID8gKi8KKyAgICBpZiAoKHBEYXRhLT5iRnJlZXppbmcpICYmIChwRGF0YS0+aVN1c3BlbmRwb2ludCA9PSAwKSkKKyAgICAgIHBEYXRhLT5iUnVubmluZyA9IE1OR19GQUxTRTsgICAgIC8qIHRoZW4gdGhpcyBpcyB0aGUgcmlnaHQgbW9tZW50IHRvIGRvIGl0ICovCisjZW5kaWYKKworICAgIGlmIChwRGF0YS0+aVN1c3BlbmRwb2ludCA8PSAyKQorICAgIHsKKyAgICAgIGlCdWZsZW4gID0gc2l6ZW9mIChtbmdfdWludDMyKTsgIC8qIHJlYWQgbGVuZ3RoICovCisgICAgICBpUmV0Y29kZSA9IHJlYWRfZGF0YWJ1ZmZlciAocERhdGEsIHBCdWYsICZwRGF0YS0+cFJlYWRidWZuZXh0LCBpQnVmbGVuLCAmaVJlYWQpOworCisgICAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAvKiBiYWlsIG9uIGVycm9ycyAqLworICAgICAgICByZXR1cm4gaVJldGNvZGU7CisKKyAgICAgIGlmIChwRGF0YS0+YlN1c3BlbmRlZCkgICAgICAgICAgIC8qIHN1c3BlbmRlZCA/ICovCisgICAgICAgIHBEYXRhLT5pU3VzcGVuZHBvaW50ID0gMjsKKyAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNhdmUgdGhlIGxlbmd0aCAqLworICAgICAgeworICAgICAgICBwRGF0YS0+aUNodW5rbGVuID0gbW5nX2dldF91aW50MzIgKHBCdWYpOworICAgICAgICBpZiAocERhdGEtPmlDaHVua2xlbiA+IDB4N2ZmZmZmZikKKyAgICAgICAgICAgcmV0dXJuIE1OR19JTlZBTElETEVOR1RIOworICAgICAgfQorCisgICAgfQorCisgICAgaWYgKCFwRGF0YS0+YlN1c3BlbmRlZCkgICAgICAgICAgICAvKiBzdGlsbCBnb2luZyA/ICovCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcmV2aW91c2x5IHN1c3BlbmRlZCBvciBub3QgZW9mID8gKi8KKyAgICAgIGlmICgocERhdGEtPmlTdXNwZW5kcG9pbnQgPiAyKSB8fCAoaVJlYWQgPT0gaUJ1ZmxlbikpCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZXRlcm1pbmUgbGVuZ3RoIGNodW5rbmFtZSArIGRhdGEgKCsgY3JjKSAqLworICAgICAgICBpZiAocERhdGEtPmlDcmNtb2RlICYgTU5HX0NSQ19JTlBVVCkKKyAgICAgICAgICBpQnVmbGVuID0gcERhdGEtPmlDaHVua2xlbiArIChtbmdfdWludDMyKShzaXplb2YgKG1uZ19jaHVua2lkKSArIHNpemVvZiAobW5nX3VpbnQzMikpOworICAgICAgICBlbHNlCisgICAgICAgICAgaUJ1ZmxlbiA9IHBEYXRhLT5pQ2h1bmtsZW4gKyAobW5nX3VpbnQzMikoc2l6ZW9mIChtbmdfY2h1bmtpZCkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkbyB3ZSBoYXZlIGVub3VnaCBkYXRhIGluIHRoZSBjdXJyZW50IHB1c2ggYnVmZmVyID8gKi8KKyAgICAgICAgaWYgKChwRGF0YS0+cEZpcnN0cHVzaGRhdGEpICYmIChpQnVmbGVuIDw9IHBEYXRhLT5wRmlyc3RwdXNoZGF0YS0+aVJlbWFpbmluZykpCisgICAgICAgIHsKKyAgICAgICAgICBtbmdfcHVzaGRhdGFwIHBQdXNoICA9IHBEYXRhLT5wRmlyc3RwdXNoZGF0YTsKKyAgICAgICAgICBwQnVmICAgICAgICAgICAgICAgICA9IHBQdXNoLT5wRGF0YW5leHQ7CisgICAgICAgICAgcFB1c2gtPnBEYXRhbmV4dCAgICArPSBpQnVmbGVuOworICAgICAgICAgIHBQdXNoLT5pUmVtYWluaW5nICAgLT0gaUJ1ZmxlbjsKKyAgICAgICAgICBwRGF0YS0+aVN1c3BlbmRwb2ludCA9IDA7ICAgIC8qIHNhZmVseSByZXNldCB0aGlzIGhlcmUgISAqLworCisgICAgICAgICAgaVJldGNvZGUgPSBjaGVja19jaHVua19jcmMgKHBEYXRhLCBwQnVmLCBpQnVmbGVuKTsKKyAgICAgICAgICBpZiAoaVJldGNvZGUpCisgICAgICAgICAgICByZXR1cm4gaVJldGNvZGU7CisKKyAgICAgICAgICBpZiAoIXBQdXNoLT5pUmVtYWluaW5nKSAgICAgIC8qIGJ1ZmZlciBkZXBsZXRlZD8gdGhlbiByZWxlYXNlIGl0ICovCisgICAgICAgICAgICBpUmV0Y29kZSA9IG1uZ19yZWxlYXNlX3B1c2hkYXRhIChwRGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgaWYgKGlCdWZsZW4gPCBpQnVmbWF4KSAgICAgICAvKiBkb2VzIGl0IGZpdCBpbiBkZWZhdWx0IGJ1ZmZlciA/ICovCisgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3RlIHRoYXQgd2UgZG9uJ3QgdXNlIHRoZSBmdWxsIHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoZXJlJ3MgYWx3YXlzIGEgemVyby1ieXRlIGF0IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyeSBlbmQgISEhICovCisgICAgICAgICAgICBpUmV0Y29kZSA9IHJlYWRfZGF0YWJ1ZmZlciAocERhdGEsIHBCdWYsICZwRGF0YS0+cFJlYWRidWZuZXh0LCBpQnVmbGVuLCAmaVJlYWQpOworICAgICAgICAgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgLyogYmFpbCBvbiBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgcmV0dXJuIGlSZXRjb2RlOworCisgICAgICAgICAgICBpZiAocERhdGEtPmJTdXNwZW5kZWQpICAgICAvKiBzdXNwZW5kZWQgPyAqLworICAgICAgICAgICAgICBwRGF0YS0+aVN1c3BlbmRwb2ludCA9IDM7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChpUmVhZCAhPSBpQnVmbGVuKSAgICAvKiBkaWQgd2UgZ2V0IGFsbCB0aGUgZGF0YSA/ICovCisgICAgICAgICAgICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1VORVhQRUNURURFT0YpOworICAgICAgICAgICAgICBpUmV0Y29kZSA9IGNoZWNrX2NodW5rX2NyYyAocERhdGEsIHBCdWYsIGlCdWZsZW4pOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKGlCdWZsZW4gPiAxNjc3NzIxNikgICAgLyogaXMgdGhlIGxlbmd0aCBpbmNyZWRpYmxlPyAqLworICAgICAgICAgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU1QUk9CQUJMRUxFTkdUSCk7CisKKyAgICAgICAgICAgIGlmICghcERhdGEtPmlTdXNwZW5kcG9pbnQpIC8qIGNyZWF0ZSBhZGRpdGlvbmFsIGxhcmdlIGJ1ZmZlciA/ICovCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZ2FpbiByZXNlcnZlIHNwYWNlIGZvciB0aGUgbGFzdCB6ZXJvLWJ5dGUgKi8KKyAgICAgICAgICAgICAgcERhdGEtPmlMYXJnZWJ1ZnNpemUgPSBpQnVmbGVuICsgMTsKKyAgICAgICAgICAgICAgcERhdGEtPnBMYXJnZWJ1Zm5leHQgPSBNTkdfTlVMTDsKKyAgICAgICAgICAgICAgTU5HX0FMTE9DIChwRGF0YSwgcERhdGEtPnBMYXJnZWJ1ZiwgcERhdGEtPmlMYXJnZWJ1ZnNpemUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpUmV0Y29kZSA9IHJlYWRfZGF0YWJ1ZmZlciAocERhdGEsIHBEYXRhLT5wTGFyZ2VidWYsICZwRGF0YS0+cExhcmdlYnVmbmV4dCwgaUJ1ZmxlbiwgJmlSZWFkKTsKKyAgICAgICAgICAgIGlmIChpUmV0Y29kZSkKKyAgICAgICAgICAgICAgcmV0dXJuIGlSZXRjb2RlOworCisgICAgICAgICAgICBpZiAocERhdGEtPmJTdXNwZW5kZWQpICAgICAvKiBzdXNwZW5kZWQgPyAqLworICAgICAgICAgICAgICBwRGF0YS0+aVN1c3BlbmRwb2ludCA9IDQ7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChpUmVhZCAhPSBpQnVmbGVuKSAgICAvKiBkaWQgd2UgZ2V0IGFsbCB0aGUgZGF0YSA/ICovCisgICAgICAgICAgICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX1VORVhQRUNURURFT0YpOworICAgICAgICAgICAgICBpUmV0Y29kZSA9IGNoZWNrX2NodW5rX2NyYyAocERhdGEsIHBEYXRhLT5wTGFyZ2VidWYsIGlCdWZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2xlYW51cCBhZGRpdGlvbmFsIGxhcmdlIGJ1ZmZlciAqLworICAgICAgICAgICAgICBNTkdfRlJFRSAocERhdGEsIHBEYXRhLT5wTGFyZ2VidWYsIHBEYXRhLT5pTGFyZ2VidWZzaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgICAgICByZXR1cm4gaVJldGNvZGU7CisKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoYXQncyBmaW5hbCAqLworICAgICAgICBpUmV0Y29kZSA9IG1uZ19wcm9jZXNzX2VvZiAocERhdGEpOworCisgICAgICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgICAgIHJldHVybiBpUmV0Y29kZTsKKworICAgICAgICBpZiAoKGlSZWFkICE9IDApIHx8ICAgICAgICAgICAgLyogZGlkIHdlIGdldCBhbiB1bmV4cGVjdGVkIGVvZiA/ICovCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisgICAgICAgICAgICAocERhdGEtPmJIYXNJSERSIHx8IHBEYXRhLT5iSGFzTUhEUiB8fCBwRGF0YS0+Ykhhc0pIRFIpKQorI2Vsc2UKKyAgICAgICAgICAgIChwRGF0YS0+Ykhhc0lIRFIgfHwgcERhdGEtPmJIYXNNSERSKSkKKyNlbmRpZgorICAgICAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19VTkVYUEVDVEVERU9GKTsKKyAgICAgIH0gCisgICAgfQorICB9CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZICAgICAgICAgICAgIC8qIHJlZnJlc2ggbmVlZGVkID8gKi8KKyAgaWYgKCghcERhdGEtPmJUaW1lcnNldCkgJiYgKCFwRGF0YS0+YlN1c3BlbmRlZCkgJiYgKHBEYXRhLT5iTmVlZHJlZnJlc2gpKQorICB7CisgICAgaVJldGNvZGUgPSBtbmdfZGlzcGxheV9wcm9ncmVzc2l2ZV9yZWZyZXNoIChwRGF0YSwgMSk7CisKKyAgICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICByZXR1cm4gaVJldGNvZGU7CisgIH0KKyNlbmRpZgorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1JFQURfQ0hVTkssIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitNTkdfTE9DQUwgbW5nX3JldGNvZGUgcHJvY2Vzc19wdXNoZWRjaHVuayAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfcHVzaGRhdGFwIHBQdXNoOworICBtbmdfcmV0Y29kZSAgIGlSZXRjb2RlID0gTU5HX05PRVJST1I7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCisgIGlmIChwRGF0YS0+cEN1cnJhbmlvYmopICAgICAgICAgICAgICAvKiBwcm9jZXNzaW5nIGFuIGFuaW1hdGlvbiBvYmplY3QgPyAqLworICB7CisgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcm9jZXNzIGl0IHRoZW4gKi8KKyAgICB7CisgICAgICBpUmV0Y29kZSA9ICgobW5nX29iamVjdF9oZWFkZXJwKXBEYXRhLT5wQ3VycmFuaW9iaiktPmZQcm9jZXNzIChwRGF0YSwgcERhdGEtPnBDdXJyYW5pb2JqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlZnJlc2ggbmVlZGVkID8gKi8KKy8qICAgICAgaWYgKCghaVJldGNvZGUpICYmICghcERhdGEtPmJUaW1lcnNldCkgJiYgKHBEYXRhLT5iTmVlZHJlZnJlc2gpKQorICAgICAgICBpUmV0Y29kZSA9IGRpc3BsYXlfcHJvZ3Jlc3NpdmVfcmVmcmVzaCAocERhdGEsIDEpOyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2FuIHdlIGFkdmFuY2UgdG8gbmV4dCBvYmplY3QgPyAqLworICAgICAgaWYgKCghaVJldGNvZGUpICYmIChwRGF0YS0+cEN1cnJhbmlvYmopICYmCisgICAgICAgICAgKCFwRGF0YS0+YlRpbWVyc2V0KSAmJiAoIXBEYXRhLT5iU2VjdGlvbndhaXQpKQorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVzZXQgdGltZXIgaW5kaWNhdG9yIG9uIHJlYWQtY3ljbGUgKi8KKyAgICAgICAgaWYgKChwRGF0YS0+YlJlYWRpbmcpICYmICghcERhdGEtPmJEaXNwbGF5aW5nKSkKKyAgICAgICAgICBwRGF0YS0+YlRpbWVyc2V0ID0gTU5HX0ZBTFNFOworCisgICAgICAgIHBEYXRhLT5wQ3VycmFuaW9iaiA9ICgobW5nX29iamVjdF9oZWFkZXJwKXBEYXRhLT5wQ3VycmFuaW9iaiktPnBOZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVEVSTSBwcm9jZXNzaW5nIHRvIGJlIGRvbmUgPyAqLworICAgICAgICBpZiAoKCFwRGF0YS0+cEN1cnJhbmlvYmopICYmIChwRGF0YS0+Ykhhc1RFUk0pICYmICghcERhdGEtPmJIYXNNSERSKSkKKyAgICAgICAgICBpUmV0Y29kZSA9IG1uZ19wcm9jZXNzX2Rpc3BsYXlfbWVuZCAocERhdGEpOworICAgICAgfQorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdW50aWwgZXJyb3Igb3IgYSBicmVhayBvciBubyBtb3JlIG9iamVjdHMgKi8KKyAgICB3aGlsZSAoKCFpUmV0Y29kZSkgJiYgKHBEYXRhLT5wQ3VycmFuaW9iaikgJiYKKyAgICAgICAgICAgKCFwRGF0YS0+YlRpbWVyc2V0KSAmJiAoIXBEYXRhLT5iU2VjdGlvbndhaXQpICYmICghcERhdGEtPmJGcmVlemluZykpOworICB9CisgIGVsc2UKKyAgeworICAgIGlmIChwRGF0YS0+aUJyZWFrcG9pbnQpICAgICAgICAgICAgLyogZG8gd2UgbmVlZCB0byBmaW5pc2ggc29tZXRoaW5nIGZpcnN0ID8gKi8KKyAgICB7CisgICAgICBzd2l0Y2ggKHBEYXRhLT5pQnJlYWtwb2ludCkgICAgICAvKiByZXR1cm4gdG8gYnJva2VuIGRpc3BsYXkgcm91dGluZSAqLworICAgICAgeworI2lmbmRlZiBNTkdfU0tJUENIVU5LX0ZSQU0KKyAgICAgICAgY2FzZSAgMSA6IHsgaVJldGNvZGUgPSBtbmdfcHJvY2Vzc19kaXNwbGF5X2ZyYW0yIChwRGF0YSk7IGJyZWFrOyB9CisjZW5kaWYKKyAgICAgICAgY2FzZSAgMiA6IHsgaVJldGNvZGUgPSBtbmdfcHJvY2Vzc19kaXNwbGF5X2loZHIgIChwRGF0YSk7IGJyZWFrOyB9CisjaWZuZGVmIE1OR19TS0lQQ0hVTktfU0hPVworICAgICAgICBjYXNlICAzIDogOyAgICAgICAgICAgICAgICAgICAgIC8qIHNhbWUgYXMgNCAhISEgKi8KKyAgICAgICAgY2FzZSAgNCA6IHsgaVJldGNvZGUgPSBtbmdfcHJvY2Vzc19kaXNwbGF5X3Nob3cgIChwRGF0YSk7IGJyZWFrOyB9CisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19DTE9OCisgICAgICAgIGNhc2UgIDUgOiB7IGlSZXRjb2RlID0gbW5nX3Byb2Nlc3NfZGlzcGxheV9jbG9uMiAocERhdGEpOyBicmVhazsgfQorI2VuZGlmCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisgICAgICAgIGNhc2UgIDcgOiB7IGlSZXRjb2RlID0gbW5nX3Byb2Nlc3NfZGlzcGxheV9qaGRyICAocERhdGEpOyBicmVhazsgfQorI2VuZGlmCisgICAgICAgIGNhc2UgIDYgOiA7ICAgICAgICAgICAgICAgICAgICAgLyogc2FtZSBhcyA4ICEhISAqLworICAgICAgICBjYXNlICA4IDogeyBpUmV0Y29kZSA9IG1uZ19wcm9jZXNzX2Rpc3BsYXlfaWVuZCAgKHBEYXRhKTsgYnJlYWs7IH0KKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19NQUdOCisgICAgICAgIGNhc2UgIDkgOiB7IGlSZXRjb2RlID0gbW5nX3Byb2Nlc3NfZGlzcGxheV9tYWduMiAocERhdGEpOyBicmVhazsgfQorI2VuZGlmCisgICAgICAgIGNhc2UgMTAgOiB7IGlSZXRjb2RlID0gbW5nX3Byb2Nlc3NfZGlzcGxheV9tZW5kMiAocERhdGEpOyBicmVhazsgfQorI2lmbmRlZiBNTkdfU0tJUENIVU5LX1BBU1QKKyAgICAgICAgY2FzZSAxMSA6IHsgaVJldGNvZGUgPSBtbmdfcHJvY2Vzc19kaXNwbGF5X3Bhc3QyIChwRGF0YSk7IGJyZWFrOyB9CisjZW5kaWYKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoaVJldGNvZGUpICAgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICByZXR1cm4gaVJldGNvZGU7CisKKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9ESVNQTEFZICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjYW4gd2UgY29udGludWUgcHJvY2Vzc2luZyBub3csIG9yIGRvIHdlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuZWVkIHRvIHdhaXQgZm9yIHRoZSB0aW1lciB0byBmaW5pc2ggKGFnYWluKSA/ICovCisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWQorICBpZiAoKCFwRGF0YS0+YlRpbWVyc2V0KSAmJiAoIXBEYXRhLT5iU2VjdGlvbndhaXQpICYmICghcERhdGEtPmJFT0YpKQorI2Vsc2UKKyAgaWYgKCFwRGF0YS0+YkVPRikKKyNlbmRpZgorICB7CisgICAgcERhdGEtPmlTdXNwZW5kcG9pbnQgPSAwOyAgICAgICAgICAgIC8qIHNhZmVseSByZXNldCBpdCBoZXJlICEgKi8KKyAgICBwUHVzaCA9IHBEYXRhLT5wRmlyc3RwdXNoY2h1bms7CisKKyAgICBpUmV0Y29kZSA9IHByb2Nlc3NfcmF3X2NodW5rIChwRGF0YSwgcFB1c2gtPnBEYXRhLCBwUHVzaC0+aUxlbmd0aCk7CisgICAgaWYgKGlSZXRjb2RlKQorICAgICAgcmV0dXJuIGlSZXRjb2RlOworCisjaWZkZWYgTU5HX1NVUFBPUlRfRElTUExBWSAgICAgICAgICAgICAvKiByZWZyZXNoIG5lZWRlZCA/ICovCisgICAgaWYgKCghcERhdGEtPmJUaW1lcnNldCkgJiYgKCFwRGF0YS0+YlN1c3BlbmRlZCkgJiYgKHBEYXRhLT5iTmVlZHJlZnJlc2gpKQorICAgIHsKKyAgICAgIGlSZXRjb2RlID0gbW5nX2Rpc3BsYXlfcHJvZ3Jlc3NpdmVfcmVmcmVzaCAocERhdGEsIDEpOworICAgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgICAgICByZXR1cm4gaVJldGNvZGU7CisgICAgfQorI2VuZGlmCisgIH0KKworICByZXR1cm4gbW5nX3JlbGVhc2VfcHVzaGNodW5rIChwRGF0YSk7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ19yZWFkX2dyYXBoaWMgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgbW5nX3VpbnQzMiAgaUJ1ZmxlbjsgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBieXRlcyByZXF1ZXN0ZWQgKi8KKyAgbW5nX3VpbnQzMiAgaVJlYWQ7ICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBieXRlcyByZWFkICovCisgIG1uZ19yZXRjb2RlIGlSZXRjb2RlOyAgICAgICAgICAgICAgICAvKiB0ZW1wb3JhcnkgZXJyb3ItY29kZSAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1JFQURfR1JBUEhJQywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlmICghcERhdGEtPnBSZWFkYnVmKSAgICAgICAgICAgICAgICAvKiBidWZmZXIgYWxsb2NhdGVkID8gKi8KKyAgeworICAgIHBEYXRhLT5pUmVhZGJ1ZnNpemUgPSA0MjAwOyAgICAgICAgLyogYWxsb2NhdGUgYSBkZWZhdWx0IHJlYWQgYnVmZmVyICovCisgICAgTU5HX0FMTE9DIChwRGF0YSwgcERhdGEtPnBSZWFkYnVmLCBwRGF0YS0+aVJlYWRidWZzaXplKTsKKyAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaGF2ZW4ndCBwcm9jZXNzZWQgdGhlIHNpZ25hdHVyZSA/ICovCisgIGlmICgoIXBEYXRhLT5iSGF2ZXNpZykgfHwgKHBEYXRhLT5pU3VzcGVuZHBvaW50ID09IDEpKQorICB7CisgICAgaUJ1ZmxlbiA9IDIgKiBzaXplb2YgKG1uZ191aW50MzIpOyAvKiByZWFkIHNpZ25hdHVyZSAqLworCisgICAgaVJldGNvZGUgPSByZWFkX2RhdGFidWZmZXIgKHBEYXRhLCBwRGF0YS0+cFJlYWRidWYsICZwRGF0YS0+cFJlYWRidWZuZXh0LCBpQnVmbGVuLCAmaVJlYWQpOworCisgICAgaWYgKGlSZXRjb2RlKQorICAgICAgcmV0dXJuIGlSZXRjb2RlOworCisgICAgaWYgKHBEYXRhLT5iU3VzcGVuZGVkKSAgICAgICAgICAgICAvKiBpbnB1dCBzdXNwZW5zaW9uID8gKi8KKyAgICAgIHBEYXRhLT5pU3VzcGVuZHBvaW50ID0gMTsKKyAgICBlbHNlCisgICAgeworICAgICAgaWYgKGlSZWFkICE9IGlCdWZsZW4pICAgICAgICAgICAgLyogZnVsbCBzaWduYXR1cmUgcmVjZWl2ZWQgPyAqLworICAgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfVU5FWFBFQ1RFREVPRik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpcyBpdCBhIHZhbGlkIHNpZ25hdHVyZSA/ICovCisgICAgICBpZiAobW5nX2dldF91aW50MzIgKHBEYXRhLT5wUmVhZGJ1ZikgPT0gUE5HX1NJRykKKyAgICAgICAgcERhdGEtPmVTaWd0eXBlID0gbW5nX2l0X3BuZzsKKyAgICAgIGVsc2UKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgICAgIGlmIChtbmdfZ2V0X3VpbnQzMiAocERhdGEtPnBSZWFkYnVmKSA9PSBKTkdfU0lHKQorICAgICAgICBwRGF0YS0+ZVNpZ3R5cGUgPSBtbmdfaXRfam5nOworICAgICAgZWxzZQorI2VuZGlmCisgICAgICBpZiAobW5nX2dldF91aW50MzIgKHBEYXRhLT5wUmVhZGJ1ZikgPT0gTU5HX1NJRykKKyAgICAgICAgcERhdGEtPmVTaWd0eXBlID0gbW5nX2l0X21uZzsKKyAgICAgIGVsc2UKKyAgICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0lOVkFMSURTSUcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWxsIG9mIGl0ID8gKi8KKyAgICAgIGlmIChtbmdfZ2V0X3VpbnQzMiAocERhdGEtPnBSZWFkYnVmKzQpICE9IFBPU1RfU0lHKQorICAgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfSU5WQUxJRFNJRyk7CisKKyAgICAgIHBEYXRhLT5iSGF2ZXNpZyA9IE1OR19UUlVFOworICAgIH0KKyAgfQorCisgIGlmICghcERhdGEtPmJTdXNwZW5kZWQpICAgICAgICAgICAgICAvKiBzdGlsbCBnb2luZyA/ICovCisgIHsKKyAgICBkbworICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVzZXQgdGltZXIgZHVyaW5nIG1uZ19yZWFkKCkgPyAqLworICAgICAgaWYgKChwRGF0YS0+YlJlYWRpbmcpICYmICghcERhdGEtPmJEaXNwbGF5aW5nKSkKKyAgICAgICAgcERhdGEtPmJUaW1lcnNldCA9IE1OR19GQUxTRTsKKworICAgICAgaWYgKHBEYXRhLT5wRmlyc3RwdXNoY2h1bmspICAgICAgLyogY2h1bmtzIHB1c2hlZCA/ICovCisgICAgICAgIGlSZXRjb2RlID0gcHJvY2Vzc19wdXNoZWRjaHVuayAocERhdGEpOyAvKiBwcm9jZXNzIHRoZSBwdXNoZWQgY2h1bmsgKi8KKyAgICAgIGVsc2UKKyAgICAgICAgaVJldGNvZGUgPSByZWFkX2NodW5rIChwRGF0YSk7IC8qIHJlYWQgJiBwcm9jZXNzIGEgY2h1bmsgKi8KKworICAgICAgaWYgKGlSZXRjb2RlKSAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICAgICAgcmV0dXJuIGlSZXRjb2RlOworICAgIH0KKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZICAgICAgICAgICAgIC8qIHVudGlsIEVPRiBvciBhIGJyZWFrLXJlcXVlc3QgKi8KKyAgICB3aGlsZSAoKCghcERhdGEtPmJFT0YpIHx8IChwRGF0YS0+cEN1cnJhbmlvYmopKSAmJgorICAgICAgICAgICAoIXBEYXRhLT5iU3VzcGVuZGVkKSAmJiAoIXBEYXRhLT5iU2VjdGlvbndhaXQpICYmCisgICAgICAgICAgICgoIXBEYXRhLT5iVGltZXJzZXQpIHx8ICgocERhdGEtPmJSZWFkaW5nKSAmJiAoIXBEYXRhLT5iRGlzcGxheWluZykpKSk7CisjZWxzZQorICAgIHdoaWxlICgoIXBEYXRhLT5iRU9GKSAmJiAoIXBEYXRhLT5iU3VzcGVuZGVkKSk7CisjZW5kaWYKKyAgfQorCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1JFQURfR1JBUEhJQywgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNlbmRpZiAvKiBNTkdfSU5DTFVERV9SRUFEX1BST0NTICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqIGVuZCBvZiBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKwpkaWZmIC0tZ2l0IGEvZmlsZXMvU291cmNlL0xpYk1ORy9saWJtbmdfcmVhZC5oIGIvZmlsZXMvU291cmNlL0xpYk1ORy9saWJtbmdfcmVhZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExOWNjM2UKLS0tIC9kZXYvbnVsbAorKysgYi9maWxlcy9Tb3VyY2UvTGliTU5HL2xpYm1uZ19yZWFkLmgKQEAgLTAsMCArMSw1MyBAQAorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIHByb2plY3QgICA6IGxpYm1uZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBmaWxlICAgICAgOiBsaWJtbmdfcmVhZC5oICAgICAgICAgICAgIGNvcHlyaWdodCAoYykgMjAwMC0yMDA0IEcuSnV5biAgICogKi8KKy8qICogdmVyc2lvbiAgIDogMS4wLjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBwdXJwb3NlICAgOiBSZWFkIG1hbmFnZW1lbnQgKGRlZmluaXRpb24pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGF1dGhvciAgICA6IEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogY29tbWVudCAgIDogRGVmaW5pdGlvbiBvZiB0aGUgcmVhZCBtYW5hZ2VtZW50IHJvdXRpbmVzICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBjaGFuZ2VzICAgOiAwLjUuMSAtIDA1LzA4LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjaGFuZ2VkIHN0cmljdC1BTlNJIHN0dWZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMiAtIDA4LzA1LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjaGFuZ2VkIGZpbGUtcHJlZml4ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMyAtIDEwLzE4LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBjbG9zZXN0cmVhbSgpIHByb2Nlc3NpbmcgZm9yIG1uZ19jbGVhbnVwKCkgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDA4LzE5LzIwMDIgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBCNTk3MTM0IC0gbGlibW5nIHBvbGx1dGVzIHRoZSBsaW5rZXIgbmFtZXNwYWNlICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuOCAtIDA0LzEyLzIwMDQgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBkYXRhLXB1c2ggbWVjaGFuaXNtcyBmb3Igc3BlY2lhbGl6ZWQgZGVjb2RlcnMgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmIGRlZmluZWQoX19CT1JMQU5EQ19fKSAmJiBkZWZpbmVkKE1OR19TVFJJQ1RfQU5TSSkKKyNwcmFnbWEgb3B0aW9uIC1BICAgICAgICAgICAgICAgICAgICAgIC8qIGZvcmNlIEFOU0ktQyAqLworI2VuZGlmCisKKyNpZm5kZWYgX2xpYm1uZ19yZWFkX2hfCisjZGVmaW5lIF9saWJtbmdfcmVhZF9oXworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfcHJvY2Vzc19lb2YgICAgICAgKG1uZ19kYXRhcCBwRGF0YSk7CisKK21uZ19yZXRjb2RlIG1uZ19yZWxlYXNlX3B1c2hkYXRhICAobW5nX2RhdGFwIHBEYXRhKTsKKworbW5nX3JldGNvZGUgbW5nX3JlbGVhc2VfcHVzaGNodW5rIChtbmdfZGF0YXAgcERhdGEpOworCittbmdfcmV0Y29kZSBtbmdfcmVhZF9ncmFwaGljICAgICAgKG1uZ19kYXRhcCBwRGF0YSk7CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNlbmRpZiAvKiBfbGlibW5nX3JlYWRfaF8gKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogZW5kIG9mIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwpkaWZmIC0tZ2l0IGEvZmlsZXMvU291cmNlL0xpYk1ORy9saWJtbmdfdHJhY2UuYyBiL2ZpbGVzL1NvdXJjZS9MaWJNTkcvbGlibW5nX3RyYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZhMmNhYgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9MaWJNTkcvbGlibW5nX3RyYWNlLmMKQEAgLTAsMCArMSwxNjgzIEBACisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gbGlibW5nLmggICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogcHJvamVjdCAgIDogbGlibW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGZpbGUgICAgICA6IGxpYm1uZ190cmFjZS5jICAgICAgICAgICAgY29weXJpZ2h0IChjKSAyMDAwLTIwMDcgRy5KdXluICAgKiAqLworLyogKiB2ZXJzaW9uICAgOiAxLjAuMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIHB1cnBvc2UgICA6IFRyYWNlIGZ1bmN0aW9ucyAoaW1wbGVtZW50YXRpb24pICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogYXV0aG9yICAgIDogRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBjb21tZW50ICAgOiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdHJhY2UgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGNoYW5nZXMgICA6IDAuNS4xIC0gMDUvMDgvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNoYW5nZWQgc3RyaWN0LUFOU0kgc3R1ZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjEgLSAwNS8xMi8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgY2FsbGJhY2sgZXJyb3ItcmVwb3J0aW5nIHN1cHBvcnQgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjIgLSAwNS8yMy8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgdHJhY2UgdGVsbHRhbGUgcmVwb3J0aW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMiAtIDA1LzI0LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCB0cmFjZXN0cmluZ3MgZm9yIGdsb2JhbCBhbmltYXRpb24gY29sb3ItY2h1bmtzICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgdHJhY2VzdHJpbmdzIGZvciBnZXQvc2V0IG9mIGRlZmF1bHQgWkxJQi9JSkcgcGFybXMgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHRyYWNlc3RyaW5ncyBmb3IgZ2xvYmFsIFBMVEUsdFJOUyxiS0dEICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjIgLSAwNS8zMC8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgdHJhY2VzdHJpbmdzIGZvciBpbWFnZS1vYmplY3QgcHJvbW90aW9uICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHRyYWNlc3RyaW5ncyBmb3IgZGVsdGEtaW1hZ2UgcHJvY2Vzc2luZyAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjIgLSAwNi8wMi8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgdHJhY2VzdHJpbmdzIGZvciBnZXRhbHBoYWxpbmUgY2FsbGJhY2sgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMiAtIDA2LzA1LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCB0cmFjZXN0cmluZyBmb3IgUkdCOF9BOCBjYW52YXNzdHlsZSAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4yIC0gMDYvMDYvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHRyYWNlc3RyaW5nIGZvciBtbmdfcmVhZF9yZXN1bWUgSExBUEkgZnVuY3Rpb24gICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4zIC0gMDYvMjEvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHRyYWNlc3RyaW5ncyBmb3IgZ2V0L3NldCBzcGVlZHR5cGUgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCB0cmFjZXN0cmluZyBmb3IgZ2V0IGltYWdlbGV2ZWwgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4zIC0gMDYvMjIvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHRyYWNlc3RyaW5nIGZvciBkZWx0YS1pbWFnZSBwcm9jZXNzaW5nICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCB0cmFjZXN0cmluZ3MgZm9yIFBQTFQgY2h1bmsgcHJvY2Vzc2luZyAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMSAtIDA3LzA3LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCB0cmFjZWNvZGVzIGZvciBzcGVjaWFsIGRpc3BsYXkgcHJvY2Vzc2luZyAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4xIC0gMDcvMDgvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHRyYWNlc3RyaW5nIGZvciBnZXQvc2V0IHN1c3BlbnNpb25tb2RlICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCB0cmFjZXN0cmluZ3MgZm9yIGdldC9zZXQgZGlzcGxheSB2YXJpYWJsZXMgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgdHJhY2Vjb2RlIGZvciByZWFkX2RhdGFidWZmZXIgKEkvTy1zdXNwZW5zaW9uKSAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMSAtIDA3LzE1LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCB0cmFjZXN0cmluZ3MgZm9yIFNBVkUvU0VFSyBjYWxsYmFja3MgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgdHJhY2VzdHJpbmdzIGZvciBnZXQvc2V0IHNlY3Rpb25icmVha3MgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHRyYWNlc3RyaW5nIGZvciBzcGVjaWFsIGVycm9yIHJvdXRpbmUgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjEgLSAwNy8xOS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgdHJhY2VzdHJpbmcgZm9yIHVwZGF0ZW1uZ2hlYWRlciAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjIgLSAwNy8zMS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgdHJhY2VzdHJpbmdzIGZvciBzdGF0dXNfeHh4eHggZnVuY3Rpb25zICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMiAtIDA4LzA1LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjaGFuZ2VkIGZpbGUtcHJlZml4ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgdHJhY2VzdHJpbmcgZm9yIHVwZGF0ZW1uZ3NpbXBsaWNpdHkgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjMgLSAwOC8yNi8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgTUFHTiBjaHVuayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMyAtIDA5LzA3LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBzdXBwb3J0IGZvciBuZXcgZmlsdGVyX3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4zIC0gMTAvMTAvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHN1cHBvcnQgZm9yIGFscGhhLWRlcHRoIHByZWRpY3Rpb24gICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjMgLSAxMC8xMS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgSkRBQSBjaHVuayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHN1cHBvcnQgZm9yIG5FRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjMgLSAxMC8xNi8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgZnVuY3Rpb25zIHRvIHJldHJpZXZlIFBORy9KTkcgc3BlY2lmaWMgaGVhZGVyLWluZm8gKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIG9wdGlvbmFsIHN1cHBvcnQgZm9yIGJLR0QgZm9yIFBORyBpbWFnZXMgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjMgLSAxMC8xNy8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgY2FsbGJhY2sgdG8gcHJvY2VzcyBub24tY3JpdGljYWwgdW5rbm93biBjaHVua3MgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHJvdXRpbmUgdG8gZGlzY2FyZCAiaW52YWxpZCIgb2JqZWN0cyAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjMgLSAxMC8xOS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gaW1wbGVtZW50ZWQgZGVsYXllZCBkZWx0YS1wcm9jZXNzaW5nICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMyAtIDEwLzIwLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBnZXQvc2V0IGZvciBiS0dEIHByZWZlcmVuY2Ugc2V0dGluZyAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4zIC0gMTAvMjEvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGdldCBmdW5jdGlvbiBmb3IgaW50ZXJsYWNlL3Byb2dyZXNzaXZlIGRpc3BsYXkgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS40IC0gIDEvMTgvMjAwMSAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkICJuZXciIE1BR04gbWV0aG9kcyAzLCA0ICYgNSAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC4xIC0gMDIvMDgvMjAwMSAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIE1FTkQgcHJvY2Vzc2luZyBjYWxsYmFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjEgLSAwNC8yMS8yMDAxIC0gRy5KdXluIChjb2RlIGJ5IEcuS2VsbHkpICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgQkdSQTggY2FudmFzIHdpdGggcHJlbXVsdGlwbGllZCBhbHBoYSAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuMSAtIDA1LzAyLzIwMDEgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCAiZGVmYXVsdCIgc1JHQiBnZW5lcmF0aW9uIChUaGFua3MgTWFydGkhKSAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuMiAtIDA2LzIzLzIwMDEgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBvcHRpbWl6YXRpb24gb3B0aW9uIGZvciBNTkctdmlkZW8gcGxheWJhY2sgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgcHJvY2Vzc3Rlcm0gY2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuMiAtIDA2LzI1LzIwMDEgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBvcHRpb24gdG8gdHVybiBvZmYgcHJvZ3Jlc3NpdmUgcmVmcmVzaCAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuMyAtIDA4LzA2LzIwMDEgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBnZXQgZnVuY3Rpb24gZm9yIGxhc3QgcHJvY2Vzc2VkIEJBQ0sgY2h1bmsgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDA4LzE1LzIwMDIgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjb21wbGV0ZWQgUFJPTSBzdXBwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY29tcGxldGVkIGRlbHRhLWltYWdlIHN1cHBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDA4LzE5LzIwMDIgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBCNTk3MTM0IC0gbGlibW5nIHBvbGx1dGVzIHRoZSBsaW5rZXIgbmFtZXNwYWNlICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgSExBUEkgZnVuY3Rpb24gdG8gY29weSBjaHVua3MgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDA5LzE0LzIwMDIgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBldmVudCBoYW5kbGluZyBmb3IgZHluYW1pYyBNTkcgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC41IC0gMDkvMjAvMjAwMiAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHN1cHBvcnQgZm9yIFBBU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAwOS8yMi8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgYmdyeDggY2FudmFzIChmaWxsZXIgYnl0ZSkgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDA5LzIzLzIwMDIgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBpbi1tZW1vcnkgY29sb3ItY29ycmVjdGlvbiBvZiBhYnN0cmFjdCBpbWFnZXMgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgY29tcG9zZSBvdmVyL3VuZGVyIHJvdXRpbmVzIGZvciBQQVNUIHByb2Nlc3NpbmcgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGZsaXAgJiB0aWxlIHJvdXRpbmVzIGZvciBQQVNUIHByb2Nlc3NpbmcgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAxMC8wOS8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgdHJhY2UtY29uc3RhbnRzIGZvciBQQVNUIGNodW5rICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDExLzA3LzIwMDIgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBzdXBwb3J0IHRvIGdldCB0b3RhbHMgYWZ0ZXIgbW5nX3JlYWQoKSAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNiAtIDA3LzA3LzIwMDMgLSBHLlItUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBjb25kaXRpb25hbHMgYXJvdW5kIEpORyBhbmQgRGVsdGEtUE5HIGNvZGUgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC42IC0gMDcvMTQvMjAwMyAtIEcuUi1QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGNvbmRpdGlvbmFscyBhcm91bmQgdmFyaW91cyB1bnVzZWQgZnVuY3Rpb25zICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjYgLSAwNy8yOS8yMDAzIC0gRy5SLVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgY29uZGl0aW9uYWxzIGFyb3VuZCBQQVNUIGNodW5rIHN1cHBvcnQgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjcgLSAxMS8yNy8yMDAzIC0gUi5BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgQ0FOVkFTX1JHQjU2NSBhbmQgQ0FOVkFTX0JHUjU2NSAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNyAtIDAxLzI1LzIwMDQgLSBKLlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBwcmVtdWx0aXBsaWVkIGFscGhhIGNhbnZhcycgZm9yIFJHQkEsIEFSR0IsIEFCR1IgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC43IC0gMDMvMDcvMjAwNCAtIEcuIFJhbmRlcnMtUGVocnNvbiAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIHB1dCBnYW1tYSwgY21zLXJlbGF0ZWQgZGVjbGFyYXRpb25zIGluc2lkZSAjaWZkZWYgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjcgLSAwMy8xMC8yMDA0IC0gRy5SLVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgY29uZGl0aW9uYWxzIGFyb3VuZCBvcGVuc3RyZWFtL2Nsb3Nlc3RyZWFtICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjggLSAwNC8wMi8yMDA0IC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgQ1JDIGV4aXN0ZW5jZSAmIGNoZWNraW5nIGZsYWdzICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuOCAtIDA0LzExLzIwMDQgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBkYXRhLXB1c2ggbWVjaGFuaXNtcyBmb3Igc3BlY2lhbGl6ZWQgZGVjb2RlcnMgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuOSAtIDEwLzAzLzIwMDQgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBmdW5jdGlvbiB0byByZXRyaWV2ZSBjdXJyZW50IEZSQU0gZGVsYXkgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC45IC0gMTAvMTQvMjAwNCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGJncjU2NV9hOCBjYW52YXMtc3R5bGUgKHRoYW5rcyB0byBKLiBFbHZhbmRlcikgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC4xMCAtIDA0LzA4LzIwMDcgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHN1cHBvcnQgZm9yIG1QTkcgcHJvcG9zYWwgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjEwIC0gMDcvMDYvMjAwNyAtIEcuUi1QIGJ1Z2ZpeCBieSBMdWNhcyBRdWludGFuYSAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2luY2x1ZGUgImxpYm1uZy5oIgorI2luY2x1ZGUgImxpYm1uZ19kYXRhLmgiCisjaW5jbHVkZSAibGlibW5nX2Vycm9yLmgiCisjaW5jbHVkZSAibGlibW5nX3RyYWNlLmgiCisjaWZkZWYgX19CT1JMQU5EQ19fCisjcHJhZ21hIGhkcnN0b3AKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pICYmIGRlZmluZWQoTU5HX1NUUklDVF9BTlNJKQorI3ByYWdtYSBvcHRpb24gLUEgICAgICAgICAgICAgICAgICAgICAgLyogZm9yY2UgQU5TSS1DICovCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19JTkNMVURFX1RSQUNFX1BST0NTCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfSU5DTFVERV9UUkFDRV9TVFJJTkdTCitNTkdfTE9DQUwgbW5nX3RyYWNlX2VudHJ5IGNvbnN0IHRyYWNlX3RhYmxlIFtdID0KKyAgeworICAgIHtNTkdfRk5fSU5JVElBTElaRSwgICAgICAgICAgICAgICAgImluaXRpYWxpemUifSwKKyAgICB7TU5HX0ZOX1JFU0VULCAgICAgICAgICAgICAgICAgICAgICJyZXNldCJ9LAorICAgIHtNTkdfRk5fQ0xFQU5VUCwgICAgICAgICAgICAgICAgICAgImNsZWFudXAifSwKKyAgICB7TU5HX0ZOX1JFQUQsICAgICAgICAgICAgICAgICAgICAgICJyZWFkIn0sCisgICAge01OR19GTl9XUklURSwgICAgICAgICAgICAgICAgICAgICAid3JpdGUifSwKKyAgICB7TU5HX0ZOX0NSRUFURSwgICAgICAgICAgICAgICAgICAgICJjcmVhdGUifSwKKyAgICB7TU5HX0ZOX1JFQURESVNQTEFZLCAgICAgICAgICAgICAgICJyZWFkZGlzcGxheSJ9LAorICAgIHtNTkdfRk5fRElTUExBWSwgICAgICAgICAgICAgICAgICAgImRpc3BsYXkifSwKKyAgICB7TU5HX0ZOX0RJU1BMQVlfUkVTVU1FLCAgICAgICAgICAgICJkaXNwbGF5X3Jlc3VtZSJ9LAorICAgIHtNTkdfRk5fRElTUExBWV9GUkVFWkUsICAgICAgICAgICAgImRpc3BsYXlfZnJlZXplIn0sCisgICAge01OR19GTl9ESVNQTEFZX1JFU0VULCAgICAgICAgICAgICAiZGlzcGxheV9yZXNldCJ9LAorI2lmbmRlZiBNTkdfTk9fRElTUExBWV9HT19TVVBQT1JURUQKKyAgICB7TU5HX0ZOX0RJU1BMQVlfR09GUkFNRSwgICAgICAgICAgICJkaXNwbGF5X2dvZnJhbWUifSwKKyAgICB7TU5HX0ZOX0RJU1BMQVlfR09MQVlFUiwgICAgICAgICAgICJkaXNwbGF5X2dvbGF5ZXIifSwKKyAgICB7TU5HX0ZOX0RJU1BMQVlfR09USU1FLCAgICAgICAgICAgICJkaXNwbGF5X2dvdGltZSJ9LAorI2VuZGlmCisgICAge01OR19GTl9HRVRMQVNURVJST1IsICAgICAgICAgICAgICAiZ2V0bGFzdGVycm9yIn0sCisgICAge01OR19GTl9SRUFEX1JFU1VNRSwgICAgICAgICAgICAgICAicmVhZF9yZXN1bWUifSwKKyAgICB7TU5HX0ZOX1RSQVBFVkVOVCwgICAgICAgICAgICAgICAgICJ0cmFwZXZlbnQifSwKKyAgICB7TU5HX0ZOX1JFQURfUFVTSERBVEEsICAgICAgICAgICAgICJyZWFkX3B1c2hkYXRhIn0sCisgICAge01OR19GTl9SRUFEX1BVU0hTSUcsICAgICAgICAgICAgICAicmVhZF9wdXNoc2lnIn0sCisgICAge01OR19GTl9SRUFEX1BVU0hDSFVOSywgICAgICAgICAgICAicmVhZF9wdXNoY2h1bmsifSwKKworICAgIHtNTkdfRk5fU0VUQ0JfTUVNQUxMT0MsICAgICAgICAgICAgInNldGNiX21lbWFsbG9jIn0sCisgICAge01OR19GTl9TRVRDQl9NRU1GUkVFLCAgICAgICAgICAgICAic2V0Y2JfbWVtZnJlZSJ9LAorICAgIHtNTkdfRk5fU0VUQ0JfUkVBRERBVEEsICAgICAgICAgICAgInNldGNiX3JlYWRkYXRhIn0sCisgICAge01OR19GTl9TRVRDQl9XUklURURBVEEsICAgICAgICAgICAic2V0Y2Jfd3JpdGVkYXRhIn0sCisgICAge01OR19GTl9TRVRDQl9FUlJPUlBST0MsICAgICAgICAgICAic2V0Y2JfZXJyb3Jwcm9jIn0sCisgICAge01OR19GTl9TRVRDQl9UUkFDRVBST0MsICAgICAgICAgICAic2V0Y2JfdHJhY2Vwcm9jIn0sCisgICAge01OR19GTl9TRVRDQl9QUk9DRVNTSEVBREVSLCAgICAgICAic2V0Y2JfcHJvY2Vzc2hlYWRlciJ9LAorICAgIHtNTkdfRk5fU0VUQ0JfUFJPQ0VTU1RFWFQsICAgICAgICAgInNldGNiX3Byb2Nlc3N0ZXh0In0sCisgICAge01OR19GTl9TRVRDQl9HRVRDQU5WQVNMSU5FLCAgICAgICAic2V0Y2JfZ2V0Y2FudmFzbGluZSJ9LAorICAgIHtNTkdfRk5fU0VUQ0JfR0VUQktHRExJTkUsICAgICAgICAgInNldGNiX2dldGJrZ2RsaW5lIn0sCisgICAge01OR19GTl9TRVRDQl9SRUZSRVNILCAgICAgICAgICAgICAic2V0Y2JfcmVmcmVzaCJ9LAorICAgIHtNTkdfRk5fU0VUQ0JfR0VUVElDS0NPVU5ULCAgICAgICAgInNldGNiX2dldHRpY2tjb3VudCJ9LAorICAgIHtNTkdfRk5fU0VUQ0JfU0VUVElNRVIsICAgICAgICAgICAgInNldGNiX3NldHRpbWVyIn0sCisgICAge01OR19GTl9TRVRDQl9QUk9DRVNTR0FNTUEsICAgICAgICAic2V0Y2JfcHJvY2Vzc2dhbW1hIn0sCisgICAge01OR19GTl9TRVRDQl9QUk9DRVNTQ0hST01BLCAgICAgICAic2V0Y2JfcHJvY2Vzc2Nocm9tYSJ9LAorICAgIHtNTkdfRk5fU0VUQ0JfUFJPQ0VTU1NSR0IsICAgICAgICAgInNldGNiX3Byb2Nlc3NzcmdiIn0sCisgICAge01OR19GTl9TRVRDQl9QUk9DRVNTSUNDUCwgICAgICAgICAic2V0Y2JfcHJvY2Vzc2ljY3AifSwKKyAgICB7TU5HX0ZOX1NFVENCX1BST0NFU1NBUk9XLCAgICAgICAgICJzZXRjYl9wcm9jZXNzYXJvdyJ9LAorI2lmbmRlZiBNTkdfTk9fT1BFTl9DTE9TRV9TVFJFQU0KKyAgICB7TU5HX0ZOX1NFVENCX09QRU5TVFJFQU0sICAgICAgICAgICJzZXRjYl9vcGVuc3RyZWFtIn0sCisgICAge01OR19GTl9TRVRDQl9DTE9TRVNUUkVBTSwgICAgICAgICAic2V0Y2JfY2xvc2VzdHJlYW0ifSwKKyNlbmRpZgorICAgIHtNTkdfRk5fU0VUQ0JfR0VUQUxQSEFMSU5FLCAgICAgICAgInNldGNiX2dldGFscGhhbGluZSJ9LAorICAgIHtNTkdfRk5fU0VUQ0JfUFJPQ0VTU1NBVkUsICAgICAgICAgInNldGNiX3Byb2Nlc3NzYXZlIn0sCisgICAge01OR19GTl9TRVRDQl9QUk9DRVNTU0VFSywgICAgICAgICAic2V0Y2JfcHJvY2Vzc3NlZWsifSwKKyAgICB7TU5HX0ZOX1NFVENCX1BST0NFU1NORUVELCAgICAgICAgICJzZXRjYl9wcm9jZXNzbmVlZCJ9LAorICAgIHtNTkdfRk5fU0VUQ0JfUFJPQ0VTU1VOS05PV04sICAgICAgInNldGNiX3Byb2Nlc3N1bmtub3duIn0sCisgICAge01OR19GTl9TRVRDQl9QUk9DRVNTTUVORCwgICAgICAgICAic2V0Y2JfcHJvY2Vzc21lbmQifSwKKyAgICB7TU5HX0ZOX1NFVENCX1BST0NFU1NURVJNLCAgICAgICAgICJzZXRjYl9wcm9jZXNzdGVybSJ9LAorICAgIHtNTkdfRk5fU0VUQ0JfUkVMRUFTRURBVEEsICAgICAgICAgInNldGNiX3JlbGVhc2VkYXRhIn0sCisKKyAgICB7TU5HX0ZOX0dFVENCX01FTUFMTE9DLCAgICAgICAgICAgICJnZXRjYl9tZW1hbGxvYyJ9LAorICAgIHtNTkdfRk5fR0VUQ0JfTUVNRlJFRSwgICAgICAgICAgICAgImdldGNiX21lbWZyZWUifSwKKyAgICB7TU5HX0ZOX0dFVENCX1JFQUREQVRBLCAgICAgICAgICAgICJnZXRjYl9yZWFkZGF0YSwifSwKKyAgICB7TU5HX0ZOX0dFVENCX1dSSVRFREFUQSwgICAgICAgICAgICJnZXRjYl93cml0ZWRhdGEifSwKKyAgICB7TU5HX0ZOX0dFVENCX0VSUk9SUFJPQywgICAgICAgICAgICJnZXRjYl9lcnJvcnByb2MifSwKKyAgICB7TU5HX0ZOX0dFVENCX1RSQUNFUFJPQywgICAgICAgICAgICJnZXRjYl90cmFjZXByb2MifSwKKyAgICB7TU5HX0ZOX0dFVENCX1BST0NFU1NIRUFERVIsICAgICAgICJnZXRjYl9wcm9jZXNzaGVhZGVyIn0sCisgICAge01OR19GTl9HRVRDQl9QUk9DRVNTVEVYVCwgICAgICAgICAiZ2V0Y2JfcHJvY2Vzc3RleHQifSwKKyAgICB7TU5HX0ZOX0dFVENCX0dFVENBTlZBU0xJTkUsICAgICAgICJnZXRjYl9nZXRjYW52YXNsaW5lIn0sCisgICAge01OR19GTl9HRVRDQl9HRVRCS0dETElORSwgICAgICAgICAiZ2V0Y2JfZ2V0YmtnZGxpbmUifSwKKyAgICB7TU5HX0ZOX0dFVENCX1JFRlJFU0gsICAgICAgICAgICAgICJnZXRjYl9yZWZyZXNoIn0sCisgICAge01OR19GTl9HRVRDQl9HRVRUSUNLQ09VTlQsICAgICAgICAiZ2V0Y2JfZ2V0dGlja2NvdW50In0sCisgICAge01OR19GTl9HRVRDQl9TRVRUSU1FUiwgICAgICAgICAgICAiZ2V0Y2Jfc2V0dGltZXIifSwKKyAgICB7TU5HX0ZOX0dFVENCX1BST0NFU1NHQU1NQSwgICAgICAgICJnZXRjYl9wcm9jZXNzZ2FtbWEifSwKKyAgICB7TU5HX0ZOX0dFVENCX1BST0NFU1NDSFJPTUEsICAgICAgICJnZXRjYl9wcm9jZXNzY2hyb21hIn0sCisgICAge01OR19GTl9HRVRDQl9QUk9DRVNTU1JHQiwgICAgICAgICAiZ2V0Y2JfcHJvY2Vzc3NyZ2IifSwKKyAgICB7TU5HX0ZOX0dFVENCX1BST0NFU1NJQ0NQLCAgICAgICAgICJnZXRjYl9wcm9jZXNzaWNjcCJ9LAorICAgIHtNTkdfRk5fR0VUQ0JfUFJPQ0VTU0FST1csICAgICAgICAgImdldGNiX3Byb2Nlc3Nhcm93In0sCisjaWZuZGVmIE1OR19OT19PUEVOX0NMT1NFX1NUUkVBTQorICAgIHtNTkdfRk5fR0VUQ0JfT1BFTlNUUkVBTSwgICAgICAgICAgImdldGNiX29wZW5zdHJlYW0ifSwKKyAgICB7TU5HX0ZOX0dFVENCX0NMT1NFU1RSRUFNLCAgICAgICAgICJnZXRjYl9jbG9zZXN0cmVhbSJ9LAorI2VuZGlmCisgICAge01OR19GTl9HRVRDQl9HRVRBTFBIQUxJTkUsICAgICAgICAiZ2V0Y2JfZ2V0YWxwaGFsaW5lIn0sCisgICAge01OR19GTl9HRVRDQl9QUk9DRVNTU0FWRSwgICAgICAgICAiZ2V0Y2JfcHJvY2Vzc3NhdmUifSwKKyAgICB7TU5HX0ZOX0dFVENCX1BST0NFU1NTRUVLLCAgICAgICAgICJnZXRjYl9wcm9jZXNzc2VlayJ9LAorICAgIHtNTkdfRk5fR0VUQ0JfUFJPQ0VTU05FRUQsICAgICAgICAgImdldGNiX3Byb2Nlc3NuZWVkIn0sCisgICAge01OR19GTl9HRVRDQl9QUk9DRVNTVU5LTk9XTiwgICAgICAiZ2V0Y2JfcHJvY2Vzc3Vua25vd24ifSwKKyAgICB7TU5HX0ZOX0dFVENCX1BST0NFU1NNRU5ELCAgICAgICAgICJnZXRjYl9wcm9jZXNzbWVuZCJ9LAorICAgIHtNTkdfRk5fR0VUQ0JfUFJPQ0VTU1RFUk0sICAgICAgICAgImdldGNiX3Byb2Nlc3N0ZXJtIn0sCisgICAge01OR19GTl9HRVRDQl9SRUxFQVNFREFUQSwgICAgICAgICAiZ2V0Y2JfcmVsZWFzZWRhdGEifSwKKworICAgIHtNTkdfRk5fU0VUX1VTRVJEQVRBLCAgICAgICAgICAgICAgInNldF91c2VyZGF0YSJ9LAorICAgIHtNTkdfRk5fU0VUX0NBTlZBU1NUWUxFLCAgICAgICAgICAgInNldF9jYW52YXNzdHlsZSJ9LAorICAgIHtNTkdfRk5fU0VUX0JLR0RTVFlMRSwgICAgICAgICAgICAgInNldF9ia2dkc3R5bGUifSwKKyAgICB7TU5HX0ZOX1NFVF9CR0NPTE9SLCAgICAgICAgICAgICAgICJzZXRfYmdjb2xvciJ9LAorICAgIHtNTkdfRk5fU0VUX1NUT1JFQ0hVTktTLCAgICAgICAgICAgInNldF9zdG9yZWNodW5rcyJ9LAorI2lmIGRlZmluZWQoTU5HX0ZVTExfQ01TKSB8fCBkZWZpbmVkKE1OR19HQU1NQV9PTkxZKSB8fCBkZWZpbmVkKE1OR19BUFBfQ01TKQorICAgIHtNTkdfRk5fU0VUX1ZJRVdHQU1NQSwgICAgICAgICAgICAgInNldF92aWV3Z2FtbWEifSwKKyNpZm5kZWYgTU5HX05PX0RGTFRfSU5GTworICAgIHtNTkdfRk5fU0VUX0RJU1BMQVlHQU1NQSwgICAgICAgICAgInNldF9kaXNwbGF5Z2FtbWEifSwKKyNlbmRpZgorICAgIHtNTkdfRk5fU0VUX0RGTFRJTUdHQU1NQSwgICAgICAgICAgInNldF9kZmx0aW1nZ2FtbWEifSwKKyNlbmRpZgorICAgIHtNTkdfRk5fU0VUX1NSR0IsICAgICAgICAgICAgICAgICAgInNldF9zcmdiIn0sCisgICAge01OR19GTl9TRVRfT1VUUFVUUFJPRklMRSwgICAgICAgICAic2V0X291dHB1dHByb2ZpbGUifSwKKyAgICB7TU5HX0ZOX1NFVF9TUkdCUFJPRklMRSwgICAgICAgICAgICJzZXRfc3JnYnByb2ZpbGUifSwKKyNpZm5kZWYgTU5HX1NLSVBfTUFYQ0FOVkFTCisgICAge01OR19GTl9TRVRfTUFYQ0FOVkFTV0lEVEgsICAgICAgICAic2V0X21heGNhbnZhc3dpZHRoIn0sCisgICAge01OR19GTl9TRVRfTUFYQ0FOVkFTSEVJR0hULCAgICAgICAic2V0X21heGNhbnZhc2hlaWdodCJ9LAorICAgIHtNTkdfRk5fU0VUX01BWENBTlZBU1NJWkUsICAgICAgICAgInNldF9tYXhjYW52YXNzaXplIn0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX05PX0FDQ0VTU19aTElCCisgICAge01OR19GTl9TRVRfWkxJQl9MRVZFTCwgICAgICAgICAgICAic2V0X3psaWJfbGV2ZWwifSwKKyAgICB7TU5HX0ZOX1NFVF9aTElCX01FVEhPRCwgICAgICAgICAgICJzZXRfemxpYl9tZXRob2QifSwKKyAgICB7TU5HX0ZOX1NFVF9aTElCX1dJTkRPV0JJVFMsICAgICAgICJzZXRfemxpYl93aW5kb3diaXRzIn0sCisgICAge01OR19GTl9TRVRfWkxJQl9NRU1MRVZFTCwgICAgICAgICAic2V0X3psaWJfbWVtbGV2ZWwifSwKKyAgICB7TU5HX0ZOX1NFVF9aTElCX1NUUkFURUdZLCAgICAgICAgICJzZXRfemxpYl9zdHJhdGVneSJ9LAorICAgIHtNTkdfRk5fU0VUX1pMSUJfTUFYSURBVCwgICAgICAgICAgInNldF96bGliX21heGlkYXQifSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfTk9fQUNDRVNTX0pQRUcKKyAgICB7TU5HX0ZOX1NFVF9KUEVHX0RDVE1FVEhPRCwgICAgICAgICJzZXRfanBlZ19kY3RtZXRob2QifSwKKyAgICB7TU5HX0ZOX1NFVF9KUEVHX1FVQUxJVFksICAgICAgICAgICJzZXRfanBlZ19xdWFsaXR5In0sCisgICAge01OR19GTl9TRVRfSlBFR19TTU9PVEhJTkcsICAgICAgICAic2V0X2pwZWdfc21vb3RoaW5nIn0sCisgICAge01OR19GTl9TRVRfSlBFR19QUk9HUkVTU0lWRSwgICAgICAic2V0X2pwZWdfcHJvZ3Jlc3NpdmUifSwKKyAgICB7TU5HX0ZOX1NFVF9KUEVHX09QVElNSVpFRCwgICAgICAgICJzZXRfanBlZ19vcHRpbWl6ZWQifSwKKyAgICB7TU5HX0ZOX1NFVF9KUEVHX01BWEpEQVQsICAgICAgICAgICJzZXRfanBlZ19tYXhqZGF0In0sCisjZW5kaWYKKyAgICB7TU5HX0ZOX1NFVF9TUEVFRCwgICAgICAgICAgICAgICAgICJzZXRfc3BlZWQifSwKKyAgICB7TU5HX0ZOX1NFVF9TVVNQRU5TSU9OTU9ERSwgICAgICAgICJzZXRfc3VzcGVuc2lvbm1vZGUifSwKKyAgICB7TU5HX0ZOX1NFVF9TRUNUSU9OQlJFQUtTLCAgICAgICAgICJzZXRfc2VjdGlvbmJyZWFrcyJ9LAorICAgIHtNTkdfRk5fU0VUX1VTRUJLR0QsICAgICAgICAgICAgICAgInNldF91c2Via2dkIn0sCisgICAge01OR19GTl9TRVRfT1VUUFVUUFJPRklMRTIsICAgICAgICAic2V0X291dHB1dHByb2ZpbGUyIn0sCisgICAge01OR19GTl9TRVRfU1JHQlBST0ZJTEUyLCAgICAgICAgICAic2V0X3NyZ2Jwcm9maWxlMiJ9LAorICAgIHtNTkdfRk5fU0VUX09VVFBVVFNSR0IsICAgICAgICAgICAgInNldF9vdXRwdXRzcmdiIn0sCisgICAge01OR19GTl9TRVRfU1JHQklNUExJQ0lULCAgICAgICAgICAic2V0X3NyZ2JpbXBsaWNpdCJ9LAorICAgIHtNTkdfRk5fU0VUX0NBQ0hFUExBWUJBQ0ssICAgICAgICAgInNldF9jYWNoZXBsYXliYWNrIn0sCisgICAge01OR19GTl9TRVRfRE9QUk9HUkVTU0lWRSwgICAgICAgICAic2V0X2RvcHJvZ3Jlc3NpdmUifSwKKyAgICB7TU5HX0ZOX1NFVF9DUkNNT0RFLCAgICAgICAgICAgICAgICJzZXRfY3JjbW9kZSJ9LAorCisgICAge01OR19GTl9HRVRfVVNFUkRBVEEsICAgICAgICAgICAgICAiZ2V0X3VzZXJkYXRhIn0sCisgICAge01OR19GTl9HRVRfU0lHVFlQRSwgICAgICAgICAgICAgICAiZ2V0X3NpZ3R5cGUifSwKKyAgICB7TU5HX0ZOX0dFVF9JTUFHRVRZUEUsICAgICAgICAgICAgICJnZXRfaW1hZ2V0eXBlIn0sCisgICAge01OR19GTl9HRVRfSU1BR0VXSURUSCwgICAgICAgICAgICAiZ2V0X2ltYWdld2lkdGgifSwKKyAgICB7TU5HX0ZOX0dFVF9JTUFHRUhFSUdIVCwgICAgICAgICAgICJnZXRfaW1hZ2VoZWlnaHQifSwKKyAgICB7TU5HX0ZOX0dFVF9USUNLUywgICAgICAgICAgICAgICAgICJnZXRfdGlja3MifSwKKyAgICB7TU5HX0ZOX0dFVF9GUkFNRUNPVU5ULCAgICAgICAgICAgICJnZXRfZnJhbWVjb3VudCJ9LAorICAgIHtNTkdfRk5fR0VUX0xBWUVSQ09VTlQsICAgICAgICAgICAgImdldF9sYXllcmNvdW50In0sCisgICAge01OR19GTl9HRVRfUExBWVRJTUUsICAgICAgICAgICAgICAiZ2V0X3BsYXl0aW1lIn0sCisgICAge01OR19GTl9HRVRfU0lNUExJQ0lUWSwgICAgICAgICAgICAiZ2V0X3NpbXBsaWNpdHkifSwKKyAgICB7TU5HX0ZOX0dFVF9DQU5WQVNTVFlMRSwgICAgICAgICAgICJnZXRfY2FudmFzc3R5bGUifSwKKyAgICB7TU5HX0ZOX0dFVF9CS0dEU1RZTEUsICAgICAgICAgICAgICJnZXRfYmtnZHN0eWxlIn0sCisgICAge01OR19GTl9HRVRfQkdDT0xPUiwgICAgICAgICAgICAgICAiZ2V0X2JnY29sb3IifSwKKyAgICB7TU5HX0ZOX0dFVF9TVE9SRUNIVU5LUywgICAgICAgICAgICJnZXRfc3RvcmVjaHVua3MifSwKKyNpZiBkZWZpbmVkKE1OR19GVUxMX0NNUykgfHwgZGVmaW5lZChNTkdfR0FNTUFfT05MWSkgfHwgZGVmaW5lZChNTkdfQVBQX0NNUykKKyAgICB7TU5HX0ZOX0dFVF9WSUVXR0FNTUEsICAgICAgICAgICAgICJnZXRfdmlld2dhbW1hIn0sCisgICAge01OR19GTl9HRVRfRElTUExBWUdBTU1BLCAgICAgICAgICAiZ2V0X2Rpc3BsYXlnYW1tYSJ9LAorI2lmbmRlZiBNTkdfTk9fREZMVF9JTkZPCisgICAge01OR19GTl9HRVRfREZMVElNR0dBTU1BLCAgICAgICAgICAiZ2V0X2RmbHRpbWdnYW1tYSJ9LAorI2VuZGlmCisjZW5kaWYKKyAgICB7TU5HX0ZOX0dFVF9TUkdCLCAgICAgICAgICAgICAgICAgICJnZXRfc3JnYiJ9LAorI2lmbmRlZiBNTkdfU0tJUF9NQVhDQU5WQVMKKyAgICB7TU5HX0ZOX0dFVF9NQVhDQU5WQVNXSURUSCwgICAgICAgICJnZXRfbWF4Y2FudmFzd2lkdGgifSwKKyAgICB7TU5HX0ZOX0dFVF9NQVhDQU5WQVNIRUlHSFQsICAgICAgICJnZXRfbWF4Y2FudmFzaGVpZ2h0In0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX05PX0FDQ0VTU19aTElCCisgICAge01OR19GTl9HRVRfWkxJQl9MRVZFTCwgICAgICAgICAgICAiZ2V0X3psaWJfbGV2ZWwifSwKKyAgICB7TU5HX0ZOX0dFVF9aTElCX01FVEhPRCwgICAgICAgICAgICJnZXRfemxpYl9tZXRob2QifSwKKyAgICB7TU5HX0ZOX0dFVF9aTElCX1dJTkRPV0JJVFMsICAgICAgICJnZXRfemxpYl93aW5kb3diaXRzIn0sCisgICAge01OR19GTl9HRVRfWkxJQl9NRU1MRVZFTCwgICAgICAgICAiZ2V0X3psaWJfbWVtbGV2ZWwifSwKKyAgICB7TU5HX0ZOX0dFVF9aTElCX1NUUkFURUdZLCAgICAgICAgICJnZXRfemxpYl9zdHJhdGVneSJ9LAorICAgIHtNTkdfRk5fR0VUX1pMSUJfTUFYSURBVCwgICAgICAgICAgImdldF96bGliX21heGlkYXQifSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfTk9fQUNDRVNTX0pQRUcKKyAgICB7TU5HX0ZOX0dFVF9KUEVHX0RDVE1FVEhPRCwgICAgICAgICJnZXRfanBlZ19kY3RtZXRob2QifSwKKyAgICB7TU5HX0ZOX0dFVF9KUEVHX1FVQUxJVFksICAgICAgICAgICJnZXRfanBlZ19xdWFsaXR5In0sCisgICAge01OR19GTl9HRVRfSlBFR19TTU9PVEhJTkcsICAgICAgICAiZ2V0X2pwZWdfc21vb3RoaW5nIn0sCisgICAge01OR19GTl9HRVRfSlBFR19QUk9HUkVTU0lWRSwgICAgICAiZ2V0X2pwZWdfcHJvZ3Jlc3NpdmUifSwKKyAgICB7TU5HX0ZOX0dFVF9KUEVHX09QVElNSVpFRCwgICAgICAgICJnZXRfanBlZ19vcHRpbWl6ZWQifSwKKyAgICB7TU5HX0ZOX0dFVF9KUEVHX01BWEpEQVQsICAgICAgICAgICJnZXRfanBlZ19tYXhqZGF0In0sCisjZW5kaWYKKyAgICB7TU5HX0ZOX0dFVF9TUEVFRCwgICAgICAgICAgICAgICAgICJnZXRfc3BlZWQifSwKKyAgICB7TU5HX0ZOX0dFVF9JTUFHRUxFVkVMLCAgICAgICAgICAgICJnZXRfaW1hZ2VsZXZlbCJ9LAorICAgIHtNTkdfRk5fR0VUX1NVU1BFTlNJT05NT0RFLCAgICAgICAgImdldF9zcGVlZCJ9LAorICAgIHtNTkdfRk5fR0VUX1NUQVJUVElNRSwgICAgICAgICAgICAgImdldF9zdGFydHRpbWUifSwKKyAgICB7TU5HX0ZOX0dFVF9SVU5USU1FLCAgICAgICAgICAgICAgICJnZXRfcnVudGltZSJ9LAorI2lmbmRlZiBNTkdfTk9fQ1VSUkVOVF9JTkZPCisgICAge01OR19GTl9HRVRfQ1VSUkVOVEZSQU1FLCAgICAgICAgICAiZ2V0X2N1cnJlbnRmcmFtZSJ9LAorICAgIHtNTkdfRk5fR0VUX0NVUlJFTlRMQVlFUiwgICAgICAgICAgImdldF9jdXJyZW50bGF5ZXIifSwKKyAgICB7TU5HX0ZOX0dFVF9DVVJSRU5UUExBWVRJTUUsICAgICAgICJnZXRfY3VycmVudHBsYXl0aW1lIn0sCisjZW5kaWYKKyAgICB7TU5HX0ZOX0dFVF9TRUNUSU9OQlJFQUtTLCAgICAgICAgICJnZXRfc2VjdGlvbmJyZWFrcyJ9LAorICAgIHtNTkdfRk5fR0VUX0FMUEhBREVQVEgsICAgICAgICAgICAgImdldF9hbHBoYWRlcHRoIn0sCisgICAge01OR19GTl9HRVRfQklUREVQVEgsICAgICAgICAgICAgICAiZ2V0X2JpdGRlcHRoIn0sCisgICAge01OR19GTl9HRVRfQ09MT1JUWVBFLCAgICAgICAgICAgICAiZ2V0X2NvbG9ydHlwZSJ9LAorICAgIHtNTkdfRk5fR0VUX0NPTVBSRVNTSU9OLCAgICAgICAgICAgImdldF9jb21wcmVzc2lvbiJ9LAorICAgIHtNTkdfRk5fR0VUX0ZJTFRFUiwgICAgICAgICAgICAgICAgImdldF9maWx0ZXIifSwKKyAgICB7TU5HX0ZOX0dFVF9JTlRFUkxBQ0UsICAgICAgICAgICAgICJnZXRfaW50ZXJsYWNlIn0sCisgICAge01OR19GTl9HRVRfQUxQSEFCSVRERVBUSCwgICAgICAgICAiZ2V0X2FscGhhYml0ZGVwdGgifSwKKyAgICB7TU5HX0ZOX0dFVF9BTFBIQUNPTVBSRVNTSU9OLCAgICAgICJnZXRfYWxwaGFjb21wcmVzc2lvbiJ9LAorICAgIHtNTkdfRk5fR0VUX0FMUEhBRklMVEVSLCAgICAgICAgICAgImdldF9hbHBoYWZpbHRlciJ9LAorICAgIHtNTkdfRk5fR0VUX0FMUEhBSU5URVJMQUNFLCAgICAgICAgImdldF9hbHBoYWludGVybGFjZSJ9LAorICAgIHtNTkdfRk5fR0VUX1VTRUJLR0QsICAgICAgICAgICAgICAgImdldF91c2Via2dkIn0sCisgICAge01OR19GTl9HRVRfUkVGUkVTSFBBU1MsICAgICAgICAgICAiZ2V0X3JlZnJlc2hwYXNzIn0sCisgICAge01OR19GTl9HRVRfQ0FDSEVQTEFZQkFDSywgICAgICAgICAiZ2V0X2NhY2hlcGxheWJhY2sifSwKKyAgICB7TU5HX0ZOX0dFVF9ET1BST0dSRVNTSVZFLCAgICAgICAgICJnZXRfZG9wcm9ncmVzc2l2ZSJ9LAorICAgIHtNTkdfRk5fR0VUX0xBU1RCQUNLQ0hVTkssICAgICAgICAgImdldF9sYXN0YmFja2NodW5rIn0sCisgICAge01OR19GTl9HRVRfTEFTVFNFRUtOQU1FLCAgICAgICAgICAiZ2V0X2xhc3RzZWVrbmFtZSJ9LAorI2lmbmRlZiBNTkdfTk9fQ1VSUkVOVF9JTkZPCisgICAge01OR19GTl9HRVRfVE9UQUxGUkFNRVMsICAgICAgICAgICAiZ2V0X3RvdGFsZnJhbWVzIn0sCisgICAge01OR19GTl9HRVRfVE9UQUxMQVlFUlMsICAgICAgICAgICAiZ2V0X3RvdGFsbGF5ZXJzIn0sCisgICAge01OR19GTl9HRVRfVE9UQUxQTEFZVElNRSwgICAgICAgICAiZ2V0X3RvdGFscGxheXRpbWUifSwKKyNlbmRpZgorICAgIHtNTkdfRk5fR0VUX0NSQ01PREUsICAgICAgICAgICAgICAgImdldF9jcmNtb2RlIn0sCisgICAge01OR19GTl9HRVRfQ1VSUkZSQU1ERUxBWSwgICAgICAgICAiZ2V0X2N1cnJmcmFtZGVsYXkifSwKKworICAgIHtNTkdfRk5fU1RBVFVTX0VSUk9SLCAgICAgICAgICAgICAgInN0YXR1c19lcnJvciJ9LAorICAgIHtNTkdfRk5fU1RBVFVTX1JFQURJTkcsICAgICAgICAgICAgInN0YXR1c19yZWFkaW5nIn0sCisgICAge01OR19GTl9TVEFUVVNfU1VTUEVOREJSRUFLLCAgICAgICAic3RhdHVzX3N1c3BlbmRicmVhayJ9LAorICAgIHtNTkdfRk5fU1RBVFVTX0NSRUFUSU5HLCAgICAgICAgICAgInN0YXR1c19jcmVhdGluZyJ9LAorICAgIHtNTkdfRk5fU1RBVFVTX1dSSVRJTkcsICAgICAgICAgICAgInN0YXR1c193cml0aW5nIn0sCisgICAge01OR19GTl9TVEFUVVNfRElTUExBWUlORywgICAgICAgICAic3RhdHVzX2Rpc3BsYXlpbmcifSwKKyAgICB7TU5HX0ZOX1NUQVRVU19SVU5OSU5HLCAgICAgICAgICAgICJzdGF0dXNfcnVubmluZyJ9LAorICAgIHtNTkdfRk5fU1RBVFVTX1RJTUVSQlJFQUssICAgICAgICAgInN0YXR1c190aW1lcmJyZWFrIn0sCisgICAge01OR19GTl9TVEFUVVNfRFlOQU1JQywgICAgICAgICAgICAic3RhdHVzX2R5bmFtaWMifSwKKyAgICB7TU5HX0ZOX1NUQVRVU19SVU5OSU5HRVZFTlQsICAgICAgICJzdGF0dXNfcnVubmluZ2V2ZW50In0sCisKKyAgICB7TU5HX0ZOX0lURVJBVEVfQ0hVTktTLCAgICAgICAgICAgICJpdGVyYXRlX2NodW5rcyJ9LAorICAgIHtNTkdfRk5fQ09QWV9DSFVOSywgICAgICAgICAgICAgICAgImNvcHlfY2h1bmsifSwKKworICAgIHtNTkdfRk5fR0VUQ0hVTktfSUhEUiwgICAgICAgICAgICAgImdldGNodW5rX2loZHIifSwKKyAgICB7TU5HX0ZOX0dFVENIVU5LX1BMVEUsICAgICAgICAgICAgICJnZXRjaHVua19wbHRlIn0sCisgICAge01OR19GTl9HRVRDSFVOS19JREFULCAgICAgICAgICAgICAiZ2V0Y2h1bmtfaWRhdCJ9LAorICAgIHtNTkdfRk5fR0VUQ0hVTktfSUVORCwgICAgICAgICAgICAgImdldGNodW5rX2llbmQifSwKKyAgICB7TU5HX0ZOX0dFVENIVU5LX1RSTlMsICAgICAgICAgICAgICJnZXRjaHVua190cm5zIn0sCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfZ0FNQQorICAgIHtNTkdfRk5fR0VUQ0hVTktfR0FNQSwgICAgICAgICAgICAgImdldGNodW5rX2dhbWEifSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX2NIUk0KKyAgICB7TU5HX0ZOX0dFVENIVU5LX0NIUk0sICAgICAgICAgICAgICJnZXRjaHVua19jaHJtIn0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19zUkdCCisgICAge01OR19GTl9HRVRDSFVOS19TUkdCLCAgICAgICAgICAgICAiZ2V0Y2h1bmtfc3JnYiJ9LAorI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfaUNDUAorICAgIHtNTkdfRk5fR0VUQ0hVTktfSUNDUCwgICAgICAgICAgICAgImdldGNodW5rX2ljY3AifSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX3RFWHQKKyAgICB7TU5HX0ZOX0dFVENIVU5LX1RFWFQsICAgICAgICAgICAgICJnZXRjaHVua190ZXh0In0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS196VFh0CisgICAge01OR19GTl9HRVRDSFVOS19aVFhULCAgICAgICAgICAgICAiZ2V0Y2h1bmtfenR4dCJ9LAorI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfaVRYdAorICAgIHtNTkdfRk5fR0VUQ0hVTktfSVRYVCwgICAgICAgICAgICAgImdldGNodW5rX2l0eHQifSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX2JLR0QKKyAgICB7TU5HX0ZOX0dFVENIVU5LX0JLR0QsICAgICAgICAgICAgICJnZXRjaHVua19ia2dkIn0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19wSFlzCisgICAge01OR19GTl9HRVRDSFVOS19QSFlTLCAgICAgICAgICAgICAiZ2V0Y2h1bmtfcGh5cyJ9LAorI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfc0JJVAorICAgIHtNTkdfRk5fR0VUQ0hVTktfU0JJVCwgICAgICAgICAgICAgImdldGNodW5rX3NiaXQifSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX3NQTFQKKyAgICB7TU5HX0ZOX0dFVENIVU5LX1NQTFQsICAgICAgICAgICAgICJnZXRjaHVua19zcGx0In0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19oSVNUCisgICAge01OR19GTl9HRVRDSFVOS19ISVNULCAgICAgICAgICAgICAiZ2V0Y2h1bmtfaGlzdCJ9LAorI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfdElNRQorICAgIHtNTkdfRk5fR0VUQ0hVTktfVElNRSwgICAgICAgICAgICAgImdldGNodW5rX3RpbWUifSwKKyNlbmRpZgorICAgIHtNTkdfRk5fR0VUQ0hVTktfTUhEUiwgICAgICAgICAgICAgImdldGNodW5rX21oZHIifSwKKyAgICB7TU5HX0ZOX0dFVENIVU5LX01FTkQsICAgICAgICAgICAgICJnZXRjaHVua19tZW5kIn0sCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfTE9PUAorICAgIHtNTkdfRk5fR0VUQ0hVTktfTE9PUCwgICAgICAgICAgICAgImdldGNodW5rX2xvb3AifSwKKyAgICB7TU5HX0ZOX0dFVENIVU5LX0VOREwsICAgICAgICAgICAgICJnZXRjaHVua19lbmRsIn0sCisjZW5kaWYKKyAgICB7TU5HX0ZOX0dFVENIVU5LX0RFRkksICAgICAgICAgICAgICJnZXRjaHVua19kZWZpIn0sCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfQkFTSQorICAgIHtNTkdfRk5fR0VUQ0hVTktfQkFTSSwgICAgICAgICAgICAgImdldGNodW5rX2Jhc2kifSwKKyNlbmRpZgorICAgIHtNTkdfRk5fR0VUQ0hVTktfQ0xPTiwgICAgICAgICAgICAgImdldGNodW5rX2Nsb24ifSwKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19QQVNUCisgICAge01OR19GTl9HRVRDSFVOS19QQVNULCAgICAgICAgICAgICAiZ2V0Y2h1bmtfcGFzdCJ9LAorI2VuZGlmCisgICAge01OR19GTl9HRVRDSFVOS19ESVNDLCAgICAgICAgICAgICAiZ2V0Y2h1bmtfZGlzYyJ9LAorICAgIHtNTkdfRk5fR0VUQ0hVTktfQkFDSywgICAgICAgICAgICAgImdldGNodW5rX2JhY2sifSwKKyAgICB7TU5HX0ZOX0dFVENIVU5LX0ZSQU0sICAgICAgICAgICAgICJnZXRjaHVua19mcmFtIn0sCisgICAge01OR19GTl9HRVRDSFVOS19NT1ZFLCAgICAgICAgICAgICAiZ2V0Y2h1bmtfbW92ZSJ9LAorICAgIHtNTkdfRk5fR0VUQ0hVTktfQ0xJUCwgICAgICAgICAgICAgImdldGNodW5rX2NsaXAifSwKKyAgICB7TU5HX0ZOX0dFVENIVU5LX1NIT1csICAgICAgICAgICAgICJnZXRjaHVua19zaG93In0sCisgICAge01OR19GTl9HRVRDSFVOS19URVJNLCAgICAgICAgICAgICAiZ2V0Y2h1bmtfdGVybSJ9LAorI2lmbmRlZiBNTkdfU0tJUENIVU5LX1NBVkUKKyAgICB7TU5HX0ZOX0dFVENIVU5LX1NBVkUsICAgICAgICAgICAgICJnZXRjaHVua19zYXZlIn0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19TRUVLCisgICAge01OR19GTl9HRVRDSFVOS19TRUVLLCAgICAgICAgICAgICAiZ2V0Y2h1bmtfc2VlayJ9LAorI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfZVhQSQorICAgIHtNTkdfRk5fR0VUQ0hVTktfRVhQSSwgICAgICAgICAgICAgImdldGNodW5rX2V4cGkifSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX2ZQUkkKKyAgICB7TU5HX0ZOX0dFVENIVU5LX0ZQUkksICAgICAgICAgICAgICJnZXRjaHVua19mcHJpIn0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19uRUVECisgICAge01OR19GTl9HRVRDSFVOS19ORUVELCAgICAgICAgICAgICAiZ2V0Y2h1bmtfbmVlZCJ9LAorI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfcEhZZworICAgIHtNTkdfRk5fR0VUQ0hVTktfUEhZRywgICAgICAgICAgICAgImdldGNodW5rX3BoeWcifSwKKyNlbmRpZgorI2lmZGVmIE1OR19JTkNMVURFX0pORworICAgIHtNTkdfRk5fR0VUQ0hVTktfSkhEUiwgICAgICAgICAgICAgImdldGNodW5rX2poZHIifSwKKyAgICB7TU5HX0ZOX0dFVENIVU5LX0pEQVQsICAgICAgICAgICAgICJnZXRjaHVua19qZGF0In0sCisgICAge01OR19GTl9HRVRDSFVOS19KU0VQLCAgICAgICAgICAgICAiZ2V0Y2h1bmtfanNlcCJ9LAorI2VuZGlmCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKKyAgICB7TU5HX0ZOX0dFVENIVU5LX0RIRFIsICAgICAgICAgICAgICJnZXRjaHVua19kaGRyIn0sCisgICAge01OR19GTl9HRVRDSFVOS19QUk9NLCAgICAgICAgICAgICAiZ2V0Y2h1bmtfcHJvbSJ9LAorICAgIHtNTkdfRk5fR0VUQ0hVTktfSVBORywgICAgICAgICAgICAgImdldGNodW5rX2lwbmcifSwKKyAgICB7TU5HX0ZOX0dFVENIVU5LX1BQTFQsICAgICAgICAgICAgICJnZXRjaHVua19wcGx0In0sCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisgICAge01OR19GTl9HRVRDSFVOS19JSk5HLCAgICAgICAgICAgICAiZ2V0Y2h1bmtfaWpuZyJ9LAorI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfRFJPUAorICAgIHtNTkdfRk5fR0VUQ0hVTktfRFJPUCwgICAgICAgICAgICAgImdldGNodW5rX2Ryb3AifSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX0RCWUsKKyAgICB7TU5HX0ZOX0dFVENIVU5LX0RCWUssICAgICAgICAgICAgICJnZXRjaHVua19kYnlrIn0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19PUkRSCisgICAge01OR19GTl9HRVRDSFVOS19PUkRSLCAgICAgICAgICAgICAiZ2V0Y2h1bmtfb3JkciJ9LAorI2VuZGlmCisjZW5kaWYKKyAgICB7TU5HX0ZOX0dFVENIVU5LX1VOS05PV04sICAgICAgICAgICJnZXRjaHVua191bmtub3duIn0sCisgICAge01OR19GTl9HRVRDSFVOS19NQUdOLCAgICAgICAgICAgICAiZ2V0Y2h1bmtfbWFnbiJ9LAorI2lmZGVmIE1OR19JTkNMVURFX0pORworICAgIHtNTkdfRk5fR0VUQ0hVTktfSkRBQSwgICAgICAgICAgICAgImdldGNodW5rX2pkYWEifSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX2V2TlQKKyAgICB7TU5HX0ZOX0dFVENIVU5LX0VWTlQsICAgICAgICAgICAgICJnZXRjaHVua19ldm50In0sCisjZW5kaWYKKyNpZmRlZiBNTkdfSU5DTFVERV9NUE5HX1BST1BPU0FMCisgICAge01OR19GTl9HRVRDSFVOS19NUE5HLCAgICAgICAgICAgICAiZ2V0Y2h1bmtfbXBuZyJ9LAorI2VuZGlmCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19QQVNUCisgICAge01OR19GTl9HRVRDSFVOS19QQVNUX1NSQywgICAgICAgICAiZ2V0Y2h1bmtfcGFzdF9zcmMifSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX1NBVkUKKyAgICB7TU5HX0ZOX0dFVENIVU5LX1NBVkVfRU5UUlksICAgICAgICJnZXRjaHVua19zYXZlX2VudHJ5In0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworICAgIHtNTkdfRk5fR0VUQ0hVTktfUFBMVF9FTlRSWSwgICAgICAgImdldGNodW5rX3BwbHRfZW50cnkifSwKKyAgICB7TU5HX0ZOX0dFVENIVU5LX09SRFJfRU5UUlksICAgICAgICJnZXRjaHVua19vcmRyX2VudHJ5In0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19ldk5UCisgICAge01OR19GTl9HRVRDSFVOS19FVk5UX0VOVFJZLCAgICAgICAiZ2V0Y2h1bmtfZXZudF9lbnRyeSJ9LAorI2VuZGlmCisjaWZkZWYgTU5HX0lOQ0xVREVfTVBOR19QUk9QT1NBTAorICAgIHtNTkdfRk5fR0VUQ0hVTktfTVBOR19GUkFNRSwgICAgICAgImdldGNodW5rX21wbmdfZnJhbWUifSwKKyNlbmRpZgorCisgICAge01OR19GTl9QVVRDSFVOS19JSERSLCAgICAgICAgICAgICAicHV0Y2h1bmtfaWhkciJ9LAorICAgIHtNTkdfRk5fUFVUQ0hVTktfUExURSwgICAgICAgICAgICAgInB1dGNodW5rX3BsdGUifSwKKyAgICB7TU5HX0ZOX1BVVENIVU5LX0lEQVQsICAgICAgICAgICAgICJwdXRjaHVua19pZGF0In0sCisgICAge01OR19GTl9QVVRDSFVOS19JRU5ELCAgICAgICAgICAgICAicHV0Y2h1bmtfaWVuZCJ9LAorICAgIHtNTkdfRk5fUFVUQ0hVTktfVFJOUywgICAgICAgICAgICAgInB1dGNodW5rX3RybnMifSwKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19nQU1BCisgICAge01OR19GTl9QVVRDSFVOS19HQU1BLCAgICAgICAgICAgICAicHV0Y2h1bmtfZ2FtYSJ9LAorI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfY0hSTQorICAgIHtNTkdfRk5fUFVUQ0hVTktfQ0hSTSwgICAgICAgICAgICAgInB1dGNodW5rX2Nocm0ifSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX3NSR0IKKyAgICB7TU5HX0ZOX1BVVENIVU5LX1NSR0IsICAgICAgICAgICAgICJwdXRjaHVua19zcmdiIn0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19pQ0NQCisgICAge01OR19GTl9QVVRDSFVOS19JQ0NQLCAgICAgICAgICAgICAicHV0Y2h1bmtfaWNjcCJ9LAorI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfdEVYdAorICAgIHtNTkdfRk5fUFVUQ0hVTktfVEVYVCwgICAgICAgICAgICAgInB1dGNodW5rX3RleHQifSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX3pUWHQKKyAgICB7TU5HX0ZOX1BVVENIVU5LX1pUWFQsICAgICAgICAgICAgICJwdXRjaHVua196dHh0In0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19pVFh0CisgICAge01OR19GTl9QVVRDSFVOS19JVFhULCAgICAgICAgICAgICAicHV0Y2h1bmtfaXR4dCJ9LAorI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfYktHRAorICAgIHtNTkdfRk5fUFVUQ0hVTktfQktHRCwgICAgICAgICAgICAgInB1dGNodW5rX2JrZ2QifSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX3BIWXMKKyAgICB7TU5HX0ZOX1BVVENIVU5LX1BIWVMsICAgICAgICAgICAgICJwdXRjaHVua19waHlzIn0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19zQklUCisgICAge01OR19GTl9QVVRDSFVOS19TQklULCAgICAgICAgICAgICAicHV0Y2h1bmtfc2JpdCJ9LAorI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfc1BMVAorICAgIHtNTkdfRk5fUFVUQ0hVTktfU1BMVCwgICAgICAgICAgICAgInB1dGNodW5rX3NwbHQifSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX2hJU1QKKyAgICB7TU5HX0ZOX1BVVENIVU5LX0hJU1QsICAgICAgICAgICAgICJwdXRjaHVua19oaXN0In0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS190SU1FCisgICAge01OR19GTl9QVVRDSFVOS19USU1FLCAgICAgICAgICAgICAicHV0Y2h1bmtfdGltZSJ9LAorI2VuZGlmCisgICAge01OR19GTl9QVVRDSFVOS19NSERSLCAgICAgICAgICAgICAicHV0Y2h1bmtfbWhkciJ9LAorICAgIHtNTkdfRk5fUFVUQ0hVTktfTUVORCwgICAgICAgICAgICAgInB1dGNodW5rX21lbmQifSwKKyAgICB7TU5HX0ZOX1BVVENIVU5LX0xPT1AsICAgICAgICAgICAgICJwdXRjaHVua19sb29wIn0sCisgICAge01OR19GTl9QVVRDSFVOS19FTkRMLCAgICAgICAgICAgICAicHV0Y2h1bmtfZW5kbCJ9LAorICAgIHtNTkdfRk5fUFVUQ0hVTktfREVGSSwgICAgICAgICAgICAgInB1dGNodW5rX2RlZmkifSwKKyAgICB7TU5HX0ZOX1BVVENIVU5LX0JBU0ksICAgICAgICAgICAgICJwdXRjaHVua19iYXNpIn0sCisgICAge01OR19GTl9QVVRDSFVOS19DTE9OLCAgICAgICAgICAgICAicHV0Y2h1bmtfY2xvbiJ9LAorI2lmbmRlZiBNTkdfU0tJUENIVU5LX1BBU1QKKyAgICB7TU5HX0ZOX1BVVENIVU5LX1BBU1QsICAgICAgICAgICAgICJwdXRjaHVua19wYXN0In0sCisjZW5kaWYKKyAgICB7TU5HX0ZOX1BVVENIVU5LX0RJU0MsICAgICAgICAgICAgICJwdXRjaHVua19kaXNjIn0sCisgICAge01OR19GTl9QVVRDSFVOS19CQUNLLCAgICAgICAgICAgICAicHV0Y2h1bmtfYmFjayJ9LAorICAgIHtNTkdfRk5fUFVUQ0hVTktfRlJBTSwgICAgICAgICAgICAgInB1dGNodW5rX2ZyYW0ifSwKKyAgICB7TU5HX0ZOX1BVVENIVU5LX01PVkUsICAgICAgICAgICAgICJwdXRjaHVua19tb3ZlIn0sCisgICAge01OR19GTl9QVVRDSFVOS19DTElQLCAgICAgICAgICAgICAicHV0Y2h1bmtfY2xpcCJ9LAorICAgIHtNTkdfRk5fUFVUQ0hVTktfU0hPVywgICAgICAgICAgICAgInB1dGNodW5rX3Nob3cifSwKKyAgICB7TU5HX0ZOX1BVVENIVU5LX1RFUk0sICAgICAgICAgICAgICJwdXRjaHVua190ZXJtIn0sCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfU0FWRQorICAgIHtNTkdfRk5fUFVUQ0hVTktfU0FWRSwgICAgICAgICAgICAgInB1dGNodW5rX3NhdmUifSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX1NFRUsKKyAgICB7TU5HX0ZOX1BVVENIVU5LX1NFRUssICAgICAgICAgICAgICJwdXRjaHVua19zZWVrIn0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19lWFBJCisgICAge01OR19GTl9QVVRDSFVOS19FWFBJLCAgICAgICAgICAgICAicHV0Y2h1bmtfZXhwaSJ9LAorI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfZlBSSQorICAgIHtNTkdfRk5fUFVUQ0hVTktfRlBSSSwgICAgICAgICAgICAgInB1dGNodW5rX2ZwcmkifSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX25FRUQKKyAgICB7TU5HX0ZOX1BVVENIVU5LX05FRUQsICAgICAgICAgICAgICJwdXRjaHVua19uZWVkIn0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19wSFlnCisgICAge01OR19GTl9QVVRDSFVOS19QSFlHLCAgICAgICAgICAgICAicHV0Y2h1bmtfcGh5ZyJ9LAorI2VuZGlmCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisgICAge01OR19GTl9QVVRDSFVOS19KSERSLCAgICAgICAgICAgICAicHV0Y2h1bmtfamhkciJ9LAorICAgIHtNTkdfRk5fUFVUQ0hVTktfSkRBVCwgICAgICAgICAgICAgInB1dGNodW5rX2pkYXQifSwKKyAgICB7TU5HX0ZOX1BVVENIVU5LX0pTRVAsICAgICAgICAgICAgICJwdXRjaHVua19qc2VwIn0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworICAgIHtNTkdfRk5fUFVUQ0hVTktfREhEUiwgICAgICAgICAgICAgInB1dGNodW5rX2RoZHIifSwKKyAgICB7TU5HX0ZOX1BVVENIVU5LX1BST00sICAgICAgICAgICAgICJwdXRjaHVua19wcm9tIn0sCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisgICAge01OR19GTl9QVVRDSFVOS19JUE5HLCAgICAgICAgICAgICAicHV0Y2h1bmtfaXBuZyJ9LAorI2VuZGlmCisgICAge01OR19GTl9QVVRDSFVOS19QUExULCAgICAgICAgICAgICAicHV0Y2h1bmtfcHBsdCJ9LAorICAgIHtNTkdfRk5fUFVUQ0hVTktfSUpORywgICAgICAgICAgICAgInB1dGNodW5rX2lqbmcifSwKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19EUk9QCisgICAge01OR19GTl9QVVRDSFVOS19EUk9QLCAgICAgICAgICAgICAicHV0Y2h1bmtfZHJvcCJ9LAorI2VuZGlmCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfREJZSworICAgIHtNTkdfRk5fUFVUQ0hVTktfREJZSywgICAgICAgICAgICAgInB1dGNodW5rX2RieWsifSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX09SRFIKKyAgICB7TU5HX0ZOX1BVVENIVU5LX09SRFIsICAgICAgICAgICAgICJwdXRjaHVua19vcmRyIn0sCisjZW5kaWYKKyNlbmRpZgorICAgIHtNTkdfRk5fUFVUQ0hVTktfVU5LTk9XTiwgICAgICAgICAgInB1dGNodW5rX3Vua25vd24ifSwKKyAgICB7TU5HX0ZOX1BVVENIVU5LX01BR04sICAgICAgICAgICAgICJwdXRjaHVua19tYWduIn0sCisgICAge01OR19GTl9QVVRDSFVOS19KREFBLCAgICAgICAgICAgICAicHV0Y2h1bmtfamRhYSJ9LAorI2lmbmRlZiBNTkdfU0tJUENIVU5LX2V2TlQKKyAgICB7TU5HX0ZOX1BVVENIVU5LX0VWTlQsICAgICAgICAgICAgICJwdXRjaHVua19ldm50In0sCisjZW5kaWYKKyNpZmRlZiBNTkdfSU5DTFVERV9NUE5HX1BST1BPU0FMCisgICAge01OR19GTl9QVVRDSFVOS19NUE5HLCAgICAgICAgICAgICAicHV0Y2h1bmtfbXBuZyJ9LAorI2VuZGlmCisKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19QQVNUCisgICAge01OR19GTl9QVVRDSFVOS19QQVNUX1NSQywgICAgICAgICAicHV0Y2h1bmtfcGFzdF9zcmMifSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfU0tJUENIVU5LX1NBVkUKKyAgICB7TU5HX0ZOX1BVVENIVU5LX1NBVkVfRU5UUlksICAgICAgICJwdXRjaHVua19zYXZlX2VudHJ5In0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworICAgIHtNTkdfRk5fUFVUQ0hVTktfUFBMVF9FTlRSWSwgICAgICAgInB1dGNodW5rX3BwbHRfZW50cnkifSwKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19PUkRSCisgICAge01OR19GTl9QVVRDSFVOS19PUkRSX0VOVFJZLCAgICAgICAicHV0Y2h1bmtfb3Jkcl9lbnRyeSJ9LAorI2VuZGlmCisjZW5kaWYKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19ldk5UCisgICAge01OR19GTl9QVVRDSFVOS19FVk5UX0VOVFJZLCAgICAgICAicHV0Y2h1bmtfZXZudF9lbnRyeSJ9LAorI2VuZGlmCisjaWZkZWYgTU5HX0lOQ0xVREVfTVBOR19QUk9QT1NBTAorICAgIHtNTkdfRk5fUFVUQ0hVTktfTVBOR19GUkFNRSwgICAgICAgInB1dGNodW5rX21wbmdfZnJhbWUifSwKKyNlbmRpZgorCisgICAge01OR19GTl9HRVRJTUdEQVRBX1NFUSwgICAgICAgICAgICAiZ2V0aW1nZGF0YV9zZXEifSwKKyAgICB7TU5HX0ZOX0dFVElNR0RBVEFfQ0hVTktTRVEsICAgICAgICJnZXRpbWdkYXRhX2NodW5rc2VxIn0sCisgICAge01OR19GTl9HRVRJTUdEQVRBX0NIVU5LLCAgICAgICAgICAiZ2V0aW1nZGF0YV9jaHVuayJ9LAorCisgICAge01OR19GTl9QVVRJTUdEQVRBX0lIRFIsICAgICAgICAgICAicHV0aW1nZGF0YV9paGRyIn0sCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisgICAge01OR19GTl9QVVRJTUdEQVRBX0pIRFIsICAgICAgICAgICAicHV0aW1nZGF0YV9qaGRyIn0sCisgICAge01OR19GTl9QVVRJTUdEQVRBX0JBU0ksICAgICAgICAgICAicHV0aW1nZGF0YV9iYXNpIn0sCisgICAge01OR19GTl9QVVRJTUdEQVRBX0RIRFIsICAgICAgICAgICAicHV0aW1nZGF0YV9kaGRyIn0sCisjZW5kaWYKKworICAgIHtNTkdfRk5fVVBEQVRFTU5HSEVBREVSLCAgICAgICAgICAgInVwZGF0ZW1uZ2hlYWRlciJ9LAorICAgIHtNTkdfRk5fVVBEQVRFTU5HU0lNUExJQ0lUWSwgICAgICAgInVwZGF0ZW1uZ3NpbXBsaWNpdHkifSwKKworICAgIHtNTkdfRk5fUFJPQ0VTU19SQVdfQ0hVTkssICAgICAgICAgInByb2Nlc3NfcmF3X2NodW5rIn0sCisgICAge01OR19GTl9SRUFEX0dSQVBISUMsICAgICAgICAgICAgICAicmVhZF9ncmFwaGljIn0sCisgICAge01OR19GTl9EUk9QX0NIVU5LUywgICAgICAgICAgICAgICAiZHJvcF9jaHVua3MifSwKKyAgICB7TU5HX0ZOX1BST0NFU1NfRVJST1IsICAgICAgICAgICAgICJwcm9jZXNzX2Vycm9yIn0sCisgICAge01OR19GTl9DTEVBUl9DTVMsICAgICAgICAgICAgICAgICAiY2xlYXJfY21zIn0sCisgICAge01OR19GTl9EUk9QX09CSkVDVFMsICAgICAgICAgICAgICAiZHJvcF9vYmplY3RzIn0sCisgICAge01OR19GTl9SRUFEX0NIVU5LLCAgICAgICAgICAgICAgICAicmVhZF9jaHVuayJ9LAorICAgIHtNTkdfRk5fTE9BRF9CS0dETEFZRVIsICAgICAgICAgICAgImxvYWRfYmtnZGxheWVyIn0sCisgICAge01OR19GTl9ORVhUX0ZSQU1FLCAgICAgICAgICAgICAgICAibmV4dF9mcmFtZSJ9LAorICAgIHtNTkdfRk5fTkVYVF9MQVlFUiwgICAgICAgICAgICAgICAgIm5leHRfbGF5ZXIifSwKKyAgICB7TU5HX0ZOX0lOVEVSRlJBTUVfREVMQVksICAgICAgICAgICJpbnRlcmZyYW1lX2RlbGF5In0sCisgICAge01OR19GTl9ESVNQTEFZX0lNQUdFLCAgICAgICAgICAgICAiZGlzcGxheV9pbWFnZSJ9LAorICAgIHtNTkdfRk5fRFJPUF9JTUdPQkpFQ1RTLCAgICAgICAgICAgImRyb3BfaW1nb2JqZWN0cyJ9LAorICAgIHtNTkdfRk5fRFJPUF9BTklPQkpFQ1RTLCAgICAgICAgICAgImRyb3BfYW5pb2JqZWN0cyJ9LAorICAgIHtNTkdfRk5fSU5GTEFURV9CVUZGRVIsICAgICAgICAgICAgImluZmxhdGVfYnVmZmVyIn0sCisgICAge01OR19GTl9ERUZMQVRFX0JVRkZFUiwgICAgICAgICAgICAiZGVmbGF0ZV9idWZmZXIifSwKKyAgICB7TU5HX0ZOX1dSSVRFX1JBV19DSFVOSywgICAgICAgICAgICJ3cml0ZV9yYXdfY2h1bmsifSwKKyAgICB7TU5HX0ZOX1dSSVRFX0dSQVBISUMsICAgICAgICAgICAgICJ3cml0ZV9ncmFwaGljIn0sCisgICAge01OR19GTl9TQVZFX1NUQVRFLCAgICAgICAgICAgICAgICAic2F2ZV9zdGF0ZSJ9LAorICAgIHtNTkdfRk5fUkVTVE9SRV9TVEFURSwgICAgICAgICAgICAgInJlc3RvcmVfc3RhdGUifSwKKyAgICB7TU5HX0ZOX0RST1BfU0FWRURBVEEsICAgICAgICAgICAgICJkcm9wX3NhdmVkYXRhIn0sCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKKyAgICB7TU5HX0ZOX0VYRUNVVEVfREVMVEFfSU1BR0UsICAgICAgICJleGVjdXRlX2RlbHRhX2ltYWdlIn0sCisjZW5kaWYKKyAgICB7TU5HX0ZOX1BST0NFU1NfRElTUExBWSwgICAgICAgICAgICJwcm9jZXNzX2Rpc3BsYXkifSwKKyAgICB7TU5HX0ZOX0NMRUFSX0NBTlZBUywgICAgICAgICAgICAgICJjbGVhcl9jYW52YXMifSwKKyAgICB7TU5HX0ZOX1JFQURfREFUQUJVRkZFUiwgICAgICAgICAgICJyZWFkX2RhdGFidWZmZXIifSwKKyAgICB7TU5HX0ZOX1NUT1JFX0VSUk9SLCAgICAgICAgICAgICAgICJzdG9yZV9lcnJvciJ9LAorICAgIHtNTkdfRk5fRFJPUF9JTlZBTElEX09CSkVDVFMsICAgICAgImRyb3BfaW52YWxpZF9vYmplY3RzIn0sCisgICAge01OR19GTl9SRUxFQVNFX1BVU0hEQVRBLCAgICAgICAgICAicmVsZWFzZV9wdXNoZGF0YSJ9LAorICAgIHtNTkdfRk5fUkVBRF9EQVRBLCAgICAgICAgICAgICAgICAgInJlYWRfZGF0YSJ9LAorICAgIHtNTkdfRk5fUkVBRF9DSFVOS19DUkMsICAgICAgICAgICAgInJlYWRfY2h1bmtfY3JjIn0sCisgICAge01OR19GTl9SRUxFQVNFX1BVU0hDSFVOSywgICAgICAgICAicmVsZWFzZV9wdXNoY2h1bmsifSwKKworICAgIHtNTkdfRk5fRElTUExBWV9SR0I4LCAgICAgICAgICAgICAgImRpc3BsYXlfcmdiOCJ9LAorICAgIHtNTkdfRk5fRElTUExBWV9SR0JBOCwgICAgICAgICAgICAgImRpc3BsYXlfcmdiYTgifSwKKyAgICB7TU5HX0ZOX0RJU1BMQVlfQVJHQjgsICAgICAgICAgICAgICJkaXNwbGF5X2FyZ2I4In0sCisgICAge01OR19GTl9ESVNQTEFZX0JHUjgsICAgICAgICAgICAgICAiZGlzcGxheV9iZ3I4In0sCisgICAge01OR19GTl9ESVNQTEFZX0JHUkE4LCAgICAgICAgICAgICAiZGlzcGxheV9iZ3JhOCJ9LAorICAgIHtNTkdfRk5fRElTUExBWV9BQkdSOCwgICAgICAgICAgICAgImRpc3BsYXlfYWJncjgifSwKKyAgICB7TU5HX0ZOX0RJU1BMQVlfUkdCMTYsICAgICAgICAgICAgICJkaXNwbGF5X3JnYjE2In0sCisgICAge01OR19GTl9ESVNQTEFZX1JHQkExNiwgICAgICAgICAgICAiZGlzcGxheV9yZ2JhMTYifSwKKyAgICB7TU5HX0ZOX0RJU1BMQVlfQVJHQjE2LCAgICAgICAgICAgICJkaXNwbGF5X2FyZ2IxNiJ9LAorICAgIHtNTkdfRk5fRElTUExBWV9CR1IxNiwgICAgICAgICAgICAgImRpc3BsYXlfYmdyMTYifSwKKyAgICB7TU5HX0ZOX0RJU1BMQVlfQkdSQTE2LCAgICAgICAgICAgICJkaXNwbGF5X2JncmExNiJ9LAorICAgIHtNTkdfRk5fRElTUExBWV9BQkdSMTYsICAgICAgICAgICAgImRpc3BsYXlfYWJncjE2In0sCisgICAge01OR19GTl9ESVNQTEFZX0lOREVYOCwgICAgICAgICAgICAiZGlzcGxheV9pbmRleDgifSwKKyAgICB7TU5HX0ZOX0RJU1BMQVlfSU5ERVhBOCwgICAgICAgICAgICJkaXNwbGF5X2luZGV4YTgifSwKKyAgICB7TU5HX0ZOX0RJU1BMQVlfQUlOREVYOCwgICAgICAgICAgICJkaXNwbGF5X2FpbmRleDgifSwKKyAgICB7TU5HX0ZOX0RJU1BMQVlfR1JBWTgsICAgICAgICAgICAgICJkaXNwbGF5X2dyYXk4In0sCisgICAge01OR19GTl9ESVNQTEFZX0dSQVkxNiwgICAgICAgICAgICAiZGlzcGxheV9ncmF5MTYifSwKKyAgICB7TU5HX0ZOX0RJU1BMQVlfR1JBWUE4LCAgICAgICAgICAgICJkaXNwbGF5X2dyYXlhOCJ9LAorICAgIHtNTkdfRk5fRElTUExBWV9HUkFZQTE2LCAgICAgICAgICAgImRpc3BsYXlfZ3JheWExNiJ9LAorICAgIHtNTkdfRk5fRElTUExBWV9BR1JBWTgsICAgICAgICAgICAgImRpc3BsYXlfYWdyYXk4In0sCisgICAge01OR19GTl9ESVNQTEFZX0FHUkFZMTYsICAgICAgICAgICAiZGlzcGxheV9hZ3JheTE2In0sCisgICAge01OR19GTl9ESVNQTEFZX0RYMTUsICAgICAgICAgICAgICAiZGlzcGxheV9keDE1In0sCisgICAge01OR19GTl9ESVNQTEFZX0RYMTYsICAgICAgICAgICAgICAiZGlzcGxheV9keDE2In0sCisgICAge01OR19GTl9ESVNQTEFZX1JHQjhfQTgsICAgICAgICAgICAiZGlzcGxheV9yZ2I4X2E4In0sCisgICAge01OR19GTl9ESVNQTEFZX0JHUkE4UE0sICAgICAgICAgICAiZGlzcGxheV9iZ3JhOF9wbSJ9LAorICAgIHtNTkdfRk5fRElTUExBWV9CR1JYOCwgICAgICAgICAgICAgImRpc3BsYXlfYmdyeDgifSwKKyAgICB7TU5HX0ZOX0RJU1BMQVlfUkdCNTY1LCAgICAgICAgICAgICJkaXNwbGF5X3JnYjU2NSJ9LAorICAgIHtNTkdfRk5fRElTUExBWV9SR0JBNTY1LCAgICAgICAgICAgImRpc3BsYXlfcmdiYTU2NSJ9LAorICAgIHtNTkdfRk5fRElTUExBWV9CR1I1NjUsICAgICAgICAgICAgImRpc3BsYXlfYmdyNTY1In0sCisgICAge01OR19GTl9ESVNQTEFZX0JHUkE1NjUsICAgICAgICAgICAiZGlzcGxheV9iZ3JhNTY1In0sCisgICAge01OR19GTl9ESVNQTEFZX1JHQkE4X1BNLCAgICAgICAgICAiZGlzcGxheV9yZ2JhOF9wbSJ9LAorICAgIHtNTkdfRk5fRElTUExBWV9BUkdCOF9QTSwgICAgICAgICAgImRpc3BsYXlfYXJnYjhfcG0ifSwKKyAgICB7TU5HX0ZOX0RJU1BMQVlfQUJHUjhfUE0sICAgICAgICAgICJkaXNwbGF5X2FiZ3I4X3BtIn0sCisgICAge01OR19GTl9ESVNQTEFZX0JHUjU2NV9BOCwgICAgICAgICAiZGlzcGxheV9iZ3I1NjVfYTgifSwKKworICAgIHtNTkdfRk5fSU5JVF9GVUxMX0NNUywgICAgICAgICAgICAgImluaXRfZnVsbF9jbXMifSwKKyAgICB7TU5HX0ZOX0NPUlJFQ1RfRlVMTF9DTVMsICAgICAgICAgICJjb3JyZWN0X2Z1bGxfY21zIn0sCisgICAge01OR19GTl9JTklUX0dBTU1BX09OTFksICAgICAgICAgICAiaW5pdF9nYW1tYV9vbmx5In0sCisgICAge01OR19GTl9DT1JSRUNUX0dBTU1BX09OTFksICAgICAgICAiY29ycmVjdF9nYW1tYV9vbmx5In0sCisgICAge01OR19GTl9DT1JSRUNUX0FQUF9DTVMsICAgICAgICAgICAiY29ycmVjdF9hcHBfY21zIn0sCisgICAge01OR19GTl9JTklUX0ZVTExfQ01TX09CSiwgICAgICAgICAiaW5pdF9mdWxsX2Ntc19vYmoifSwKKyAgICB7TU5HX0ZOX0lOSVRfR0FNTUFfT05MWV9PQkosICAgICAgICJpbml0X2dhbW1hX29ubHlfb2JqIn0sCisgICAge01OR19GTl9JTklUX0FQUF9DTVMsICAgICAgICAgICAgICAiaW5pdF9hcHBfY21zIn0sCisgICAge01OR19GTl9JTklUX0FQUF9DTVNfT0JKLCAgICAgICAgICAiaW5pdF9hcHBfY21zX29iaiJ9LAorCisgICAge01OR19GTl9QUk9DRVNTX0cxLCAgICAgICAgICAgICAgICAicHJvY2Vzc19nMSJ9LAorICAgIHtNTkdfRk5fUFJPQ0VTU19HMiwgICAgICAgICAgICAgICAgInByb2Nlc3NfZzIifSwKKyAgICB7TU5HX0ZOX1BST0NFU1NfRzQsICAgICAgICAgICAgICAgICJwcm9jZXNzX2c0In0sCisgICAge01OR19GTl9QUk9DRVNTX0c4LCAgICAgICAgICAgICAgICAicHJvY2Vzc19nOCJ9LAorICAgIHtNTkdfRk5fUFJPQ0VTU19HMTYsICAgICAgICAgICAgICAgInByb2Nlc3NfZzE2In0sCisgICAge01OR19GTl9QUk9DRVNTX1JHQjgsICAgICAgICAgICAgICAicHJvY2Vzc19yZ2I4In0sCisgICAge01OR19GTl9QUk9DRVNTX1JHQjE2LCAgICAgICAgICAgICAicHJvY2Vzc19yZ2IxNiJ9LAorICAgIHtNTkdfRk5fUFJPQ0VTU19JRFgxLCAgICAgICAgICAgICAgInByb2Nlc3NfaWR4MSJ9LAorICAgIHtNTkdfRk5fUFJPQ0VTU19JRFgyLCAgICAgICAgICAgICAgInByb2Nlc3NfaWR4MiJ9LAorICAgIHtNTkdfRk5fUFJPQ0VTU19JRFg0LCAgICAgICAgICAgICAgInByb2Nlc3NfaWR4NCJ9LAorICAgIHtNTkdfRk5fUFJPQ0VTU19JRFg4LCAgICAgICAgICAgICAgInByb2Nlc3NfaWR4OCJ9LAorICAgIHtNTkdfRk5fUFJPQ0VTU19HQTgsICAgICAgICAgICAgICAgInByb2Nlc3NfZ2E4In0sCisgICAge01OR19GTl9QUk9DRVNTX0dBMTYsICAgICAgICAgICAgICAicHJvY2Vzc19nYTE2In0sCisgICAge01OR19GTl9QUk9DRVNTX1JHQkE4LCAgICAgICAgICAgICAicHJvY2Vzc19yZ2JhOCJ9LAorICAgIHtNTkdfRk5fUFJPQ0VTU19SR0JBMTYsICAgICAgICAgICAgInByb2Nlc3NfcmdiYTE2In0sCisKKyAgICB7TU5HX0ZOX0lOSVRfRzFfSSwgICAgICAgICAgICAgICAgICJpbml0X2cxX2kifSwKKyAgICB7TU5HX0ZOX0lOSVRfRzJfSSwgICAgICAgICAgICAgICAgICJpbml0X2cyX2kifSwKKyAgICB7TU5HX0ZOX0lOSVRfRzRfSSwgICAgICAgICAgICAgICAgICJpbml0X2c0X2kifSwKKyAgICB7TU5HX0ZOX0lOSVRfRzhfSSwgICAgICAgICAgICAgICAgICJpbml0X2c4X2kifSwKKyAgICB7TU5HX0ZOX0lOSVRfRzE2X0ksICAgICAgICAgICAgICAgICJpbml0X2cxNl9pIn0sCisgICAge01OR19GTl9JTklUX1JHQjhfSSwgICAgICAgICAgICAgICAiaW5pdF9yZ2I4X2kifSwKKyAgICB7TU5HX0ZOX0lOSVRfUkdCMTZfSSwgICAgICAgICAgICAgICJpbml0X3JnYjE2X2kifSwKKyAgICB7TU5HX0ZOX0lOSVRfSURYMV9JLCAgICAgICAgICAgICAgICJpbml0X2lkeDFfaSJ9LAorICAgIHtNTkdfRk5fSU5JVF9JRFgyX0ksICAgICAgICAgICAgICAgImluaXRfaWR4Ml9pIn0sCisgICAge01OR19GTl9JTklUX0lEWDRfSSwgICAgICAgICAgICAgICAiaW5pdF9pZHg0X2kifSwKKyAgICB7TU5HX0ZOX0lOSVRfSURYOF9JLCAgICAgICAgICAgICAgICJpbml0X2lkeDhfaSJ9LAorICAgIHtNTkdfRk5fSU5JVF9HQThfSSwgICAgICAgICAgICAgICAgImluaXRfZ2E4X2kifSwKKyAgICB7TU5HX0ZOX0lOSVRfR0ExNl9JLCAgICAgICAgICAgICAgICJpbml0X2dhMTZfaSJ9LAorICAgIHtNTkdfRk5fSU5JVF9SR0JBOF9JLCAgICAgICAgICAgICAgImluaXRfcmdiYThfaSJ9LAorICAgIHtNTkdfRk5fSU5JVF9SR0JBMTZfSSwgICAgICAgICAgICAgImluaXRfcmdiYTE2X2kifSwKKyNpZm5kZWYgTU5HX09QVElNSVpFX0ZPT1RQUklOVF9JTklUCisgICAge01OR19GTl9JTklUX0cxX05JLCAgICAgICAgICAgICAgICAiaW5pdF9nMV9uaSJ9LAorICAgIHtNTkdfRk5fSU5JVF9HMl9OSSwgICAgICAgICAgICAgICAgImluaXRfZzJfbmkifSwKKyAgICB7TU5HX0ZOX0lOSVRfRzRfTkksICAgICAgICAgICAgICAgICJpbml0X2c0X25pIn0sCisgICAge01OR19GTl9JTklUX0c4X05JLCAgICAgICAgICAgICAgICAiaW5pdF9nOF9uaSJ9LAorICAgIHtNTkdfRk5fSU5JVF9HMTZfTkksICAgICAgICAgICAgICAgImluaXRfZzE2X25pIn0sCisgICAge01OR19GTl9JTklUX1JHQjhfTkksICAgICAgICAgICAgICAiaW5pdF9yZ2I4X25pIn0sCisgICAge01OR19GTl9JTklUX1JHQjE2X05JLCAgICAgICAgICAgICAiaW5pdF9yZ2IxNl9uaSJ9LAorICAgIHtNTkdfRk5fSU5JVF9JRFgxX05JLCAgICAgICAgICAgICAgImluaXRfaWR4MV9uaSJ9LAorICAgIHtNTkdfRk5fSU5JVF9JRFgyX05JLCAgICAgICAgICAgICAgImluaXRfaWR4Ml9uaSJ9LAorICAgIHtNTkdfRk5fSU5JVF9JRFg0X05JLCAgICAgICAgICAgICAgImluaXRfaWR4NF9uaSJ9LAorICAgIHtNTkdfRk5fSU5JVF9JRFg4X05JLCAgICAgICAgICAgICAgImluaXRfaWR4OF9uaSJ9LAorICAgIHtNTkdfRk5fSU5JVF9HQThfTkksICAgICAgICAgICAgICAgImluaXRfZ2E4X25pIn0sCisgICAge01OR19GTl9JTklUX0dBMTZfTkksICAgICAgICAgICAgICAiaW5pdF9nYTE2X25pIn0sCisgICAge01OR19GTl9JTklUX1JHQkE4X05JLCAgICAgICAgICAgICAiaW5pdF9yZ2JhOF9uaSJ9LAorICAgIHtNTkdfRk5fSU5JVF9SR0JBMTZfTkksICAgICAgICAgICAgImluaXRfcmdiYTE2X25pIn0sCisjZW5kaWYKKworICAgIHtNTkdfRk5fSU5JVF9ST1dQUk9DLCAgICAgICAgICAgICAgImluaXRfcm93cHJvYyJ9LAorICAgIHtNTkdfRk5fTkVYVF9ST1csICAgICAgICAgICAgICAgICAgIm5leHRfcm93In0sCisgICAge01OR19GTl9DTEVBTlVQX1JPV1BST0MsICAgICAgICAgICAiY2xlYW51cF9yb3dwcm9jIn0sCisKKyAgICB7TU5HX0ZOX0ZJTFRFUl9BX1JPVywgICAgICAgICAgICAgICJmaWx0ZXJfYV9yb3cifSwKKyAgICB7TU5HX0ZOX0ZJTFRFUl9TVUIsICAgICAgICAgICAgICAgICJmaWx0ZXJfc3ViIn0sCisgICAge01OR19GTl9GSUxURVJfVVAsICAgICAgICAgICAgICAgICAiZmlsdGVyX3VwIn0sCisgICAge01OR19GTl9GSUxURVJfQVZFUkFHRSwgICAgICAgICAgICAiZmlsdGVyX2F2ZXJhZ2UifSwKKyAgICB7TU5HX0ZOX0ZJTFRFUl9QQUVUSCwgICAgICAgICAgICAgICJmaWx0ZXJfcGFldGgifSwKKworICAgIHtNTkdfRk5fSU5JVF9ST1dESUZGRVJJTkcsICAgICAgICAgImluaXRfcm93ZGlmZmVyaW5nIn0sCisgICAge01OR19GTl9ESUZGRVJfRzEsICAgICAgICAgICAgICAgICAiZGlmZmVyX2cxIn0sCisgICAge01OR19GTl9ESUZGRVJfRzIsICAgICAgICAgICAgICAgICAiZGlmZmVyX2cyIn0sCisgICAge01OR19GTl9ESUZGRVJfRzQsICAgICAgICAgICAgICAgICAiZGlmZmVyX2c0In0sCisgICAge01OR19GTl9ESUZGRVJfRzgsICAgICAgICAgICAgICAgICAiZGlmZmVyX2c4In0sCisgICAge01OR19GTl9ESUZGRVJfRzE2LCAgICAgICAgICAgICAgICAiZGlmZmVyX2cxNiJ9LAorICAgIHtNTkdfRk5fRElGRkVSX1JHQjgsICAgICAgICAgICAgICAgImRpZmZlcl9yZ2I4In0sCisgICAge01OR19GTl9ESUZGRVJfUkdCMTYsICAgICAgICAgICAgICAiZGlmZmVyX3JnYjE2In0sCisgICAge01OR19GTl9ESUZGRVJfSURYMSwgICAgICAgICAgICAgICAiZGlmZmVyX2lkeDEifSwKKyAgICB7TU5HX0ZOX0RJRkZFUl9JRFgyLCAgICAgICAgICAgICAgICJkaWZmZXJfaWR4MiJ9LAorICAgIHtNTkdfRk5fRElGRkVSX0lEWDQsICAgICAgICAgICAgICAgImRpZmZlcl9pZHg0In0sCisgICAge01OR19GTl9ESUZGRVJfSURYOCwgICAgICAgICAgICAgICAiZGlmZmVyX2lkeDgifSwKKyAgICB7TU5HX0ZOX0RJRkZFUl9HQTgsICAgICAgICAgICAgICAgICJkaWZmZXJfZ2E4In0sCisgICAge01OR19GTl9ESUZGRVJfR0ExNiwgICAgICAgICAgICAgICAiZGlmZmVyX2dhMTYifSwKKyAgICB7TU5HX0ZOX0RJRkZFUl9SR0JBOCwgICAgICAgICAgICAgICJkaWZmZXJfcmdiYTgifSwKKyAgICB7TU5HX0ZOX0RJRkZFUl9SR0JBMTYsICAgICAgICAgICAgICJkaWZmZXJfcmdiYTE2In0sCisKKyAgICB7TU5HX0ZOX0NSRUFURV9JTUdEQVRBT0JKRUNULCAgICAgICJjcmVhdGVfaW1nZGF0YW9iamVjdCJ9LAorICAgIHtNTkdfRk5fRlJFRV9JTUdEQVRBT0JKRUNULCAgICAgICAgImZyZWVfaW1nZGF0YW9iamVjdCJ9LAorICAgIHtNTkdfRk5fQ0xPTkVfSU1HREFUQU9CSkVDVCwgICAgICAgImNsb25lX2ltZ2RhdGFvYmplY3QifSwKKyAgICB7TU5HX0ZOX0NSRUFURV9JTUdPQkpFQ1QsICAgICAgICAgICJjcmVhdGVfaW1nb2JqZWN0In0sCisgICAge01OR19GTl9GUkVFX0lNR09CSkVDVCwgICAgICAgICAgICAiZnJlZV9pbWdvYmplY3QifSwKKyAgICB7TU5HX0ZOX0ZJTkRfSU1HT0JKRUNULCAgICAgICAgICAgICJmaW5kX2ltZ29iamVjdCJ9LAorICAgIHtNTkdfRk5fQ0xPTkVfSU1HT0JKRUNULCAgICAgICAgICAgImNsb25lX2ltZ29iamVjdCJ9LAorICAgIHtNTkdfRk5fUkVTRVRfT0JKRUNUREVUQUlMUywgICAgICAgInJlc2V0X29iamVjdGRldGFpbHMifSwKKyAgICB7TU5HX0ZOX1JFTlVNX0lNR09CSkVDVCwgICAgICAgICAgICJyZW51bV9pbWdvYmplY3QifSwKKyAgICB7TU5HX0ZOX1BST01PVEVfSU1HT0JKRUNULCAgICAgICAgICJwcm9tb3RlX2ltZ29iamVjdCJ9LAorICAgIHtNTkdfRk5fTUFHTklGWV9JTUdPQkpFQ1QsICAgICAgICAgIm1hZ25pZnlfaW1nb2JqZWN0In0sCisgICAge01OR19GTl9DT0xPUkNPUlJFQ1RfT0JKRUNULCAgICAgICAiY29sb3Jjb3JyZWN0X29iamVjdCJ9LAorCisgICAge01OR19GTl9TVE9SRV9HMSwgICAgICAgICAgICAgICAgICAic3RvcmVfZzEifSwKKyAgICB7TU5HX0ZOX1NUT1JFX0cyLCAgICAgICAgICAgICAgICAgICJzdG9yZV9nMiJ9LAorICAgIHtNTkdfRk5fU1RPUkVfRzQsICAgICAgICAgICAgICAgICAgInN0b3JlX2c0In0sCisgICAge01OR19GTl9TVE9SRV9HOCwgICAgICAgICAgICAgICAgICAic3RvcmVfZzgifSwKKyAgICB7TU5HX0ZOX1NUT1JFX0cxNiwgICAgICAgICAgICAgICAgICJzdG9yZV9nMTYifSwKKyAgICB7TU5HX0ZOX1NUT1JFX1JHQjgsICAgICAgICAgICAgICAgICJzdG9yZV9yZ2I4In0sCisgICAge01OR19GTl9TVE9SRV9SR0IxNiwgICAgICAgICAgICAgICAic3RvcmVfcmdiMTYifSwKKyAgICB7TU5HX0ZOX1NUT1JFX0lEWDEsICAgICAgICAgICAgICAgICJzdG9yZV9pZHgxIn0sCisgICAge01OR19GTl9TVE9SRV9JRFgyLCAgICAgICAgICAgICAgICAic3RvcmVfaWR4MiJ9LAorICAgIHtNTkdfRk5fU1RPUkVfSURYNCwgICAgICAgICAgICAgICAgInN0b3JlX2lkeDQifSwKKyAgICB7TU5HX0ZOX1NUT1JFX0lEWDgsICAgICAgICAgICAgICAgICJzdG9yZV9pZHg4In0sCisgICAge01OR19GTl9TVE9SRV9HQTgsICAgICAgICAgICAgICAgICAic3RvcmVfZ2E4In0sCisgICAge01OR19GTl9TVE9SRV9HQTE2LCAgICAgICAgICAgICAgICAic3RvcmVfZ2ExNiJ9LAorICAgIHtNTkdfRk5fU1RPUkVfUkdCQTgsICAgICAgICAgICAgICAgInN0b3JlX3JnYmE4In0sCisgICAge01OR19GTl9TVE9SRV9SR0JBMTYsICAgICAgICAgICAgICAic3RvcmVfcmdiYTE2In0sCisKKyAgICB7TU5HX0ZOX1JFVFJJRVZFX0c4LCAgICAgICAgICAgICAgICJyZXRyaWV2ZV9nOCJ9LAorICAgIHtNTkdfRk5fUkVUUklFVkVfRzE2LCAgICAgICAgICAgICAgInJldHJpZXZlX2cxNiJ9LAorICAgIHtNTkdfRk5fUkVUUklFVkVfUkdCOCwgICAgICAgICAgICAgInJldHJpZXZlX3JnYjgifSwKKyAgICB7TU5HX0ZOX1JFVFJJRVZFX1JHQjE2LCAgICAgICAgICAgICJyZXRyaWV2ZV9yZ2IxNiJ9LAorICAgIHtNTkdfRk5fUkVUUklFVkVfSURYOCwgICAgICAgICAgICAgInJldHJpZXZlX2lkeDgifSwKKyAgICB7TU5HX0ZOX1JFVFJJRVZFX0dBOCwgICAgICAgICAgICAgICJyZXRyaWV2ZV9nYTgifSwKKyAgICB7TU5HX0ZOX1JFVFJJRVZFX0dBMTYsICAgICAgICAgICAgICJyZXRyaWV2ZV9nYTE2In0sCisgICAge01OR19GTl9SRVRSSUVWRV9SR0JBOCwgICAgICAgICAgICAicmV0cmlldmVfcmdiYTgifSwKKyAgICB7TU5HX0ZOX1JFVFJJRVZFX1JHQkExNiwgICAgICAgICAgICJyZXRyaWV2ZV9yZ2JhMTYifSwKKworI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisgICAge01OR19GTl9ERUxUQV9HMSwgICAgICAgICAgICAgICAgICAiZGVsdGFfZzEifSwKKyAgICB7TU5HX0ZOX0RFTFRBX0cyLCAgICAgICAgICAgICAgICAgICJkZWx0YV9nMiJ9LAorICAgIHtNTkdfRk5fREVMVEFfRzQsICAgICAgICAgICAgICAgICAgImRlbHRhX2c0In0sCisgICAge01OR19GTl9ERUxUQV9HOCwgICAgICAgICAgICAgICAgICAiZGVsdGFfZzgifSwKKyAgICB7TU5HX0ZOX0RFTFRBX0cxNiwgICAgICAgICAgICAgICAgICJkZWx0YV9nMTYifSwKKyAgICB7TU5HX0ZOX0RFTFRBX1JHQjgsICAgICAgICAgICAgICAgICJkZWx0YV9yZ2I4In0sCisgICAge01OR19GTl9ERUxUQV9SR0IxNiwgICAgICAgICAgICAgICAiZGVsdGFfcmdiMTYifSwKKyAgICB7TU5HX0ZOX0RFTFRBX0lEWDEsICAgICAgICAgICAgICAgICJkZWx0YV9pZHgxIn0sCisgICAge01OR19GTl9ERUxUQV9JRFgyLCAgICAgICAgICAgICAgICAiZGVsdGFfaWR4MiJ9LAorICAgIHtNTkdfRk5fREVMVEFfSURYNCwgICAgICAgICAgICAgICAgImRlbHRhX2lkeDQifSwKKyAgICB7TU5HX0ZOX0RFTFRBX0lEWDgsICAgICAgICAgICAgICAgICJkZWx0YV9pZHg4In0sCisgICAge01OR19GTl9ERUxUQV9HQTgsICAgICAgICAgICAgICAgICAiZGVsdGFfZ2E4In0sCisgICAge01OR19GTl9ERUxUQV9HQTE2LCAgICAgICAgICAgICAgICAiZGVsdGFfZ2ExNiJ9LAorICAgIHtNTkdfRk5fREVMVEFfUkdCQTgsICAgICAgICAgICAgICAgImRlbHRhX3JnYmE4In0sCisgICAge01OR19GTl9ERUxUQV9SR0JBMTYsICAgICAgICAgICAgICAiZGVsdGFfcmdiYTE2In0sCisjZW5kaWYKKworICAgIHtNTkdfRk5fQ1JFQVRFX0FOSV9MT09QLCAgICAgICAgICAgImNyZWF0ZV9hbmlfbG9vcCJ9LAorICAgIHtNTkdfRk5fQ1JFQVRFX0FOSV9FTkRMLCAgICAgICAgICAgImNyZWF0ZV9hbmlfZW5kbCJ9LAorICAgIHtNTkdfRk5fQ1JFQVRFX0FOSV9ERUZJLCAgICAgICAgICAgImNyZWF0ZV9hbmlfZGVmaSJ9LAorICAgIHtNTkdfRk5fQ1JFQVRFX0FOSV9CQVNJLCAgICAgICAgICAgImNyZWF0ZV9hbmlfYmFzaSJ9LAorICAgIHtNTkdfRk5fQ1JFQVRFX0FOSV9DTE9OLCAgICAgICAgICAgImNyZWF0ZV9hbmlfY2xvbiJ9LAorI2lmbmRlZiBNTkdfU0tJUENIVU5LX1BBU1QKKyAgICB7TU5HX0ZOX0NSRUFURV9BTklfUEFTVCwgICAgICAgICAgICJjcmVhdGVfYW5pX3Bhc3QifSwKKyNlbmRpZgorICAgIHtNTkdfRk5fQ1JFQVRFX0FOSV9ESVNDLCAgICAgICAgICAgImNyZWF0ZV9hbmlfZGlzYyJ9LAorICAgIHtNTkdfRk5fQ1JFQVRFX0FOSV9CQUNLLCAgICAgICAgICAgImNyZWF0ZV9hbmlfYmFjayJ9LAorICAgIHtNTkdfRk5fQ1JFQVRFX0FOSV9GUkFNLCAgICAgICAgICAgImNyZWF0ZV9hbmlfZnJhbSJ9LAorICAgIHtNTkdfRk5fQ1JFQVRFX0FOSV9NT1ZFLCAgICAgICAgICAgImNyZWF0ZV9hbmlfbW92ZSJ9LAorICAgIHtNTkdfRk5fQ1JFQVRFX0FOSV9DTElQLCAgICAgICAgICAgImNyZWF0ZV9hbmlfY2xpcCJ9LAorICAgIHtNTkdfRk5fQ1JFQVRFX0FOSV9TSE9XLCAgICAgICAgICAgImNyZWF0ZV9hbmlfc2hvdyJ9LAorICAgIHtNTkdfRk5fQ1JFQVRFX0FOSV9URVJNLCAgICAgICAgICAgImNyZWF0ZV9hbmlfdGVybSJ9LAorICAgIHtNTkdfRk5fQ1JFQVRFX0FOSV9TQVZFLCAgICAgICAgICAgImNyZWF0ZV9hbmlfc2F2ZSJ9LAorICAgIHtNTkdfRk5fQ1JFQVRFX0FOSV9TRUVLLCAgICAgICAgICAgImNyZWF0ZV9hbmlfc2VlayJ9LAorICAgIHtNTkdfRk5fQ1JFQVRFX0FOSV9HQU1BLCAgICAgICAgICAgImNyZWF0ZV9hbmlfZ2FtYSJ9LAorICAgIHtNTkdfRk5fQ1JFQVRFX0FOSV9DSFJNLCAgICAgICAgICAgImNyZWF0ZV9hbmlfY2hybSJ9LAorICAgIHtNTkdfRk5fQ1JFQVRFX0FOSV9TUkdCLCAgICAgICAgICAgImNyZWF0ZV9hbmlfc3JnYiJ9LAorICAgIHtNTkdfRk5fQ1JFQVRFX0FOSV9JQ0NQLCAgICAgICAgICAgImNyZWF0ZV9hbmlfaWNjcCJ9LAorICAgIHtNTkdfRk5fQ1JFQVRFX0FOSV9QTFRFLCAgICAgICAgICAgImNyZWF0ZV9hbmlfcGx0ZSJ9LAorICAgIHtNTkdfRk5fQ1JFQVRFX0FOSV9UUk5TLCAgICAgICAgICAgImNyZWF0ZV9hbmlfdHJucyJ9LAorICAgIHtNTkdfRk5fQ1JFQVRFX0FOSV9CS0dELCAgICAgICAgICAgImNyZWF0ZV9hbmlfYmtnZCJ9LAorI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisgICAge01OR19GTl9DUkVBVEVfQU5JX0RIRFIsICAgICAgICAgICAiY3JlYXRlX2FuaV9kaGRyIn0sCisgICAge01OR19GTl9DUkVBVEVfQU5JX1BST00sICAgICAgICAgICAiY3JlYXRlX2FuaV9wcm9tIn0sCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisgICAge01OR19GTl9DUkVBVEVfQU5JX0lQTkcsICAgICAgICAgICAiY3JlYXRlX2FuaV9pcG5nIn0sCisjZW5kaWYKKyAgICB7TU5HX0ZOX0NSRUFURV9BTklfSUpORywgICAgICAgICAgICJjcmVhdGVfYW5pX2lqbmcifSwKKyAgICB7TU5HX0ZOX0NSRUFURV9BTklfUFBMVCwgICAgICAgICAgICJjcmVhdGVfYW5pX3BwbHQifSwKKyNlbmRpZgorICAgIHtNTkdfRk5fQ1JFQVRFX0FOSV9NQUdOLCAgICAgICAgICAgImNyZWF0ZV9hbmlfbWFnbiJ9LAorCisgICAge01OR19GTl9DUkVBVEVfQU5JX0lNQUdFLCAgICAgICAgICAiY3JlYXRlX2FuaV9pbWFnZSJ9LAorICAgIHtNTkdfRk5fQ1JFQVRFX0VWRU5ULCAgICAgICAgICAgICAgImNyZWF0ZV9ldmVudCJ9LAorCisgICAge01OR19GTl9GUkVFX0FOSV9MT09QLCAgICAgICAgICAgICAiZnJlZV9hbmlfbG9vcCJ9LAorICAgIHtNTkdfRk5fRlJFRV9BTklfRU5ETCwgICAgICAgICAgICAgImZyZWVfYW5pX2VuZGwifSwKKyAgICB7TU5HX0ZOX0ZSRUVfQU5JX0RFRkksICAgICAgICAgICAgICJmcmVlX2FuaV9kZWZpIn0sCisgICAge01OR19GTl9GUkVFX0FOSV9CQVNJLCAgICAgICAgICAgICAiZnJlZV9hbmlfYmFzaSJ9LAorICAgIHtNTkdfRk5fRlJFRV9BTklfQ0xPTiwgICAgICAgICAgICAgImZyZWVfYW5pX2Nsb24ifSwKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19QQVNUCisgICAge01OR19GTl9GUkVFX0FOSV9QQVNULCAgICAgICAgICAgICAiZnJlZV9hbmlfcGFzdCJ9LAorI2VuZGlmCisgICAge01OR19GTl9GUkVFX0FOSV9ESVNDLCAgICAgICAgICAgICAiZnJlZV9hbmlfZGlzYyJ9LAorICAgIHtNTkdfRk5fRlJFRV9BTklfQkFDSywgICAgICAgICAgICAgImZyZWVfYW5pX2JhY2sifSwKKyAgICB7TU5HX0ZOX0ZSRUVfQU5JX0ZSQU0sICAgICAgICAgICAgICJmcmVlX2FuaV9mcmFtIn0sCisgICAge01OR19GTl9GUkVFX0FOSV9NT1ZFLCAgICAgICAgICAgICAiZnJlZV9hbmlfbW92ZSJ9LAorICAgIHtNTkdfRk5fRlJFRV9BTklfQ0xJUCwgICAgICAgICAgICAgImZyZWVfYW5pX2NsaXAifSwKKyAgICB7TU5HX0ZOX0ZSRUVfQU5JX1NIT1csICAgICAgICAgICAgICJmcmVlX2FuaV9zaG93In0sCisgICAge01OR19GTl9GUkVFX0FOSV9URVJNLCAgICAgICAgICAgICAiZnJlZV9hbmlfdGVybSJ9LAorICAgIHtNTkdfRk5fRlJFRV9BTklfU0FWRSwgICAgICAgICAgICAgImZyZWVfYW5pX3NhdmUifSwKKyAgICB7TU5HX0ZOX0ZSRUVfQU5JX1NFRUssICAgICAgICAgICAgICJmcmVlX2FuaV9zZWVrIn0sCisgICAge01OR19GTl9GUkVFX0FOSV9HQU1BLCAgICAgICAgICAgICAiZnJlZV9hbmlfZ2FtYSJ9LAorICAgIHtNTkdfRk5fRlJFRV9BTklfQ0hSTSwgICAgICAgICAgICAgImZyZWVfYW5pX2Nocm0ifSwKKyAgICB7TU5HX0ZOX0ZSRUVfQU5JX1NSR0IsICAgICAgICAgICAgICJmcmVlX2FuaV9zcmdiIn0sCisgICAge01OR19GTl9GUkVFX0FOSV9JQ0NQLCAgICAgICAgICAgICAiZnJlZV9hbmlfaWNjcCJ9LAorICAgIHtNTkdfRk5fRlJFRV9BTklfUExURSwgICAgICAgICAgICAgImZyZWVfYW5pX3BsdGUifSwKKyAgICB7TU5HX0ZOX0ZSRUVfQU5JX1RSTlMsICAgICAgICAgICAgICJmcmVlX2FuaV90cm5zIn0sCisgICAge01OR19GTl9GUkVFX0FOSV9CS0dELCAgICAgICAgICAgICAiZnJlZV9hbmlfYmtnZCJ9LAorI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisgICAge01OR19GTl9GUkVFX0FOSV9ESERSLCAgICAgICAgICAgICAiZnJlZV9hbmlfZGhkciJ9LAorICAgIHtNTkdfRk5fRlJFRV9BTklfUFJPTSwgICAgICAgICAgICAgImZyZWVfYW5pX3Byb20ifSwKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgICB7TU5HX0ZOX0ZSRUVfQU5JX0lQTkcsICAgICAgICAgICAgICJmcmVlX2FuaV9pcG5nIn0sCisjZW5kaWYKKyAgICB7TU5HX0ZOX0ZSRUVfQU5JX0lKTkcsICAgICAgICAgICAgICJmcmVlX2FuaV9pam5nIn0sCisgICAge01OR19GTl9GUkVFX0FOSV9QUExULCAgICAgICAgICAgICAiZnJlZV9hbmlfcHBsdCJ9LAorI2VuZGlmCisgICAge01OR19GTl9GUkVFX0FOSV9NQUdOLCAgICAgICAgICAgICAiZnJlZV9hbmlfbWFnbiJ9LAorCisgICAge01OR19GTl9GUkVFX0FOSV9JTUFHRSwgICAgICAgICAgICAiZnJlZV9hbmlfaW1hZ2UifSwKKyAgICB7TU5HX0ZOX0ZSRUVfRVZFTlQsICAgICAgICAgICAgICAgICJmcmVlX2V2ZW50In0sCisKKyAgICB7TU5HX0ZOX1BST0NFU1NfQU5JX0xPT1AsICAgICAgICAgICJwcm9jZXNzX2FuaV9sb29wIn0sCisgICAge01OR19GTl9QUk9DRVNTX0FOSV9FTkRMLCAgICAgICAgICAicHJvY2Vzc19hbmlfZW5kbCJ9LAorICAgIHtNTkdfRk5fUFJPQ0VTU19BTklfREVGSSwgICAgICAgICAgInByb2Nlc3NfYW5pX2RlZmkifSwKKyAgICB7TU5HX0ZOX1BST0NFU1NfQU5JX0JBU0ksICAgICAgICAgICJwcm9jZXNzX2FuaV9iYXNpIn0sCisgICAge01OR19GTl9QUk9DRVNTX0FOSV9DTE9OLCAgICAgICAgICAicHJvY2Vzc19hbmlfY2xvbiJ9LAorI2lmbmRlZiBNTkdfU0tJUENIVU5LX1BBU1QKKyAgICB7TU5HX0ZOX1BST0NFU1NfQU5JX1BBU1QsICAgICAgICAgICJwcm9jZXNzX2FuaV9wYXN0In0sCisjZW5kaWYKKyAgICB7TU5HX0ZOX1BST0NFU1NfQU5JX0RJU0MsICAgICAgICAgICJwcm9jZXNzX2FuaV9kaXNjIn0sCisgICAge01OR19GTl9QUk9DRVNTX0FOSV9CQUNLLCAgICAgICAgICAicHJvY2Vzc19hbmlfYmFjayJ9LAorICAgIHtNTkdfRk5fUFJPQ0VTU19BTklfRlJBTSwgICAgICAgICAgInByb2Nlc3NfYW5pX2ZyYW0ifSwKKyAgICB7TU5HX0ZOX1BST0NFU1NfQU5JX01PVkUsICAgICAgICAgICJwcm9jZXNzX2FuaV9tb3ZlIn0sCisgICAge01OR19GTl9QUk9DRVNTX0FOSV9DTElQLCAgICAgICAgICAicHJvY2Vzc19hbmlfY2xpcCJ9LAorICAgIHtNTkdfRk5fUFJPQ0VTU19BTklfU0hPVywgICAgICAgICAgInByb2Nlc3NfYW5pX3Nob3cifSwKKyAgICB7TU5HX0ZOX1BST0NFU1NfQU5JX1RFUk0sICAgICAgICAgICJwcm9jZXNzX2FuaV90ZXJtIn0sCisgICAge01OR19GTl9QUk9DRVNTX0FOSV9TQVZFLCAgICAgICAgICAicHJvY2Vzc19hbmlfc2F2ZSJ9LAorICAgIHtNTkdfRk5fUFJPQ0VTU19BTklfU0VFSywgICAgICAgICAgInByb2Nlc3NfYW5pX3NlZWsifSwKKyAgICB7TU5HX0ZOX1BST0NFU1NfQU5JX0dBTUEsICAgICAgICAgICJwcm9jZXNzX2FuaV9nYW1hIn0sCisgICAge01OR19GTl9QUk9DRVNTX0FOSV9DSFJNLCAgICAgICAgICAicHJvY2Vzc19hbmlfY2hybSJ9LAorICAgIHtNTkdfRk5fUFJPQ0VTU19BTklfU1JHQiwgICAgICAgICAgInByb2Nlc3NfYW5pX3NyZ2IifSwKKyAgICB7TU5HX0ZOX1BST0NFU1NfQU5JX0lDQ1AsICAgICAgICAgICJwcm9jZXNzX2FuaV9pY2NwIn0sCisgICAge01OR19GTl9QUk9DRVNTX0FOSV9QTFRFLCAgICAgICAgICAicHJvY2Vzc19hbmlfcGx0ZSJ9LAorICAgIHtNTkdfRk5fUFJPQ0VTU19BTklfVFJOUywgICAgICAgICAgInByb2Nlc3NfYW5pX3RybnMifSwKKyAgICB7TU5HX0ZOX1BST0NFU1NfQU5JX0JLR0QsICAgICAgICAgICJwcm9jZXNzX2FuaV9ia2dkIn0sCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKKyAgICB7TU5HX0ZOX1BST0NFU1NfQU5JX0RIRFIsICAgICAgICAgICJwcm9jZXNzX2FuaV9kaGRyIn0sCisgICAge01OR19GTl9QUk9DRVNTX0FOSV9QUk9NLCAgICAgICAgICAicHJvY2Vzc19hbmlfcHJvbSJ9LAorI2lmZGVmIE1OR19JTkNMVURFX0pORworICAgIHtNTkdfRk5fUFJPQ0VTU19BTklfSVBORywgICAgICAgICAgInByb2Nlc3NfYW5pX2lwbmcifSwKKyNlbmRpZgorICAgIHtNTkdfRk5fUFJPQ0VTU19BTklfSUpORywgICAgICAgICAgInByb2Nlc3NfYW5pX2lqbmcifSwKKyAgICB7TU5HX0ZOX1BST0NFU1NfQU5JX1BQTFQsICAgICAgICAgICJwcm9jZXNzX2FuaV9wcGx0In0sCisjZW5kaWYKKyAgICB7TU5HX0ZOX1BST0NFU1NfQU5JX01BR04sICAgICAgICAgICJwcm9jZXNzX2FuaV9tYWduIn0sCisKKyAgICB7TU5HX0ZOX1BST0NFU1NfQU5JX0lNQUdFLCAgICAgICAgICJwcm9jZXNzX2FuaV9pbWFnZSJ9LAorICAgIHtNTkdfRk5fUFJPQ0VTU19FVkVOVCwgICAgICAgICAgICAgInByb2Nlc3NfZXZlbnQifSwKKworICAgIHtNTkdfRk5fUkVTVE9SRV9CQUNLSU1BR0UsICAgICAgICAgInJlc3RvcmVfYmFja2ltYWdlIn0sCisgICAge01OR19GTl9SRVNUT1JFX0JBQ0tDT0xPUiwgICAgICAgICAicmVzdG9yZV9iYWNrY29sb3IifSwKKyAgICB7TU5HX0ZOX1JFU1RPUkVfQkdDT0xPUiwgICAgICAgICAgICJyZXN0b3JlX2JnY29sb3IifSwKKyAgICB7TU5HX0ZOX1JFU1RPUkVfUkdCOCwgICAgICAgICAgICAgICJyZXN0b3JlX3JnYjgifSwKKyAgICB7TU5HX0ZOX1JFU1RPUkVfQkdSOCwgICAgICAgICAgICAgICJyZXN0b3JlX2JncjgifSwKKyAgICB7TU5HX0ZOX1JFU1RPUkVfQktHRCwgICAgICAgICAgICAgICJyZXN0b3JlX2JrZ2QifSwKKyAgICB7TU5HX0ZOX1JFU1RPUkVfQkdSWDgsICAgICAgICAgICAgICJyZXN0b3JlX2Jncng4In0sCisgICAge01OR19GTl9SRVNUT1JFX1JHQjU2NSwgICAgICAgICAgICAicmVzdG9yZV9yZ2I1NjUifSwKKworICAgIHtNTkdfRk5fSU5JVF9JSERSLCAgICAgICAgICAgICAgICAgImluaXRfaWhkciJ9LAorICAgIHtNTkdfRk5fSU5JVF9QTFRFLCAgICAgICAgICAgICAgICAgImluaXRfcGx0ZSJ9LAorICAgIHtNTkdfRk5fSU5JVF9JREFULCAgICAgICAgICAgICAgICAgImluaXRfaWRhdCJ9LAorICAgIHtNTkdfRk5fSU5JVF9JRU5ELCAgICAgICAgICAgICAgICAgImluaXRfaWVuZCJ9LAorICAgIHtNTkdfRk5fSU5JVF9UUk5TLCAgICAgICAgICAgICAgICAgImluaXRfdHJucyJ9LAorICAgIHtNTkdfRk5fSU5JVF9HQU1BLCAgICAgICAgICAgICAgICAgImluaXRfZ2FtYSJ9LAorICAgIHtNTkdfRk5fSU5JVF9DSFJNLCAgICAgICAgICAgICAgICAgImluaXRfY2hybSJ9LAorICAgIHtNTkdfRk5fSU5JVF9TUkdCLCAgICAgICAgICAgICAgICAgImluaXRfc3JnYiJ9LAorICAgIHtNTkdfRk5fSU5JVF9JQ0NQLCAgICAgICAgICAgICAgICAgImluaXRfaWNjcCJ9LAorICAgIHtNTkdfRk5fSU5JVF9URVhULCAgICAgICAgICAgICAgICAgImluaXRfdGV4dCJ9LAorICAgIHtNTkdfRk5fSU5JVF9aVFhULCAgICAgICAgICAgICAgICAgImluaXRfenR4dCJ9LAorICAgIHtNTkdfRk5fSU5JVF9JVFhULCAgICAgICAgICAgICAgICAgImluaXRfaXR4dCJ9LAorICAgIHtNTkdfRk5fSU5JVF9CS0dELCAgICAgICAgICAgICAgICAgImluaXRfYmtnZCJ9LAorICAgIHtNTkdfRk5fSU5JVF9QSFlTLCAgICAgICAgICAgICAgICAgImluaXRfcGh5cyJ9LAorICAgIHtNTkdfRk5fSU5JVF9TQklULCAgICAgICAgICAgICAgICAgImluaXRfc2JpdCJ9LAorICAgIHtNTkdfRk5fSU5JVF9TUExULCAgICAgICAgICAgICAgICAgImluaXRfc3BsdCJ9LAorICAgIHtNTkdfRk5fSU5JVF9ISVNULCAgICAgICAgICAgICAgICAgImluaXRfaGlzdCJ9LAorICAgIHtNTkdfRk5fSU5JVF9USU1FLCAgICAgICAgICAgICAgICAgImluaXRfdGltZSJ9LAorICAgIHtNTkdfRk5fSU5JVF9NSERSLCAgICAgICAgICAgICAgICAgImluaXRfbWhkciJ9LAorICAgIHtNTkdfRk5fSU5JVF9NRU5ELCAgICAgICAgICAgICAgICAgImluaXRfbWVuZCJ9LAorICAgIHtNTkdfRk5fSU5JVF9MT09QLCAgICAgICAgICAgICAgICAgImluaXRfbG9vcCJ9LAorICAgIHtNTkdfRk5fSU5JVF9FTkRMLCAgICAgICAgICAgICAgICAgImluaXRfZW5kbCJ9LAorICAgIHtNTkdfRk5fSU5JVF9ERUZJLCAgICAgICAgICAgICAgICAgImluaXRfZGVmaSJ9LAorICAgIHtNTkdfRk5fSU5JVF9CQVNJLCAgICAgICAgICAgICAgICAgImluaXRfYmFzaSJ9LAorICAgIHtNTkdfRk5fSU5JVF9DTE9OLCAgICAgICAgICAgICAgICAgImluaXRfY2xvbiJ9LAorI2lmbmRlZiBNTkdfU0tJUENIVU5LX1BBU1QKKyAgICB7TU5HX0ZOX0lOSVRfUEFTVCwgICAgICAgICAgICAgICAgICJpbml0X3Bhc3QifSwKKyNlbmRpZgorICAgIHtNTkdfRk5fSU5JVF9ESVNDLCAgICAgICAgICAgICAgICAgImluaXRfZGlzYyJ9LAorICAgIHtNTkdfRk5fSU5JVF9CQUNLLCAgICAgICAgICAgICAgICAgImluaXRfYmFjayJ9LAorICAgIHtNTkdfRk5fSU5JVF9GUkFNLCAgICAgICAgICAgICAgICAgImluaXRfZnJhbSJ9LAorICAgIHtNTkdfRk5fSU5JVF9NT1ZFLCAgICAgICAgICAgICAgICAgImluaXRfbW92ZSJ9LAorICAgIHtNTkdfRk5fSU5JVF9DTElQLCAgICAgICAgICAgICAgICAgImluaXRfY2xpcCJ9LAorICAgIHtNTkdfRk5fSU5JVF9TSE9XLCAgICAgICAgICAgICAgICAgImluaXRfc2hvdyJ9LAorICAgIHtNTkdfRk5fSU5JVF9URVJNLCAgICAgICAgICAgICAgICAgImluaXRfdGVybSJ9LAorICAgIHtNTkdfRk5fSU5JVF9TQVZFLCAgICAgICAgICAgICAgICAgImluaXRfc2F2ZSJ9LAorICAgIHtNTkdfRk5fSU5JVF9TRUVLLCAgICAgICAgICAgICAgICAgImluaXRfc2VlayJ9LAorICAgIHtNTkdfRk5fSU5JVF9FWFBJLCAgICAgICAgICAgICAgICAgImluaXRfZXhwaSJ9LAorICAgIHtNTkdfRk5fSU5JVF9GUFJJLCAgICAgICAgICAgICAgICAgImluaXRfZnByaSJ9LAorICAgIHtNTkdfRk5fSU5JVF9ORUVELCAgICAgICAgICAgICAgICAgImluaXRfbmVlZCJ9LAorICAgIHtNTkdfRk5fSU5JVF9QSFlHLCAgICAgICAgICAgICAgICAgImluaXRfcGh5ZyJ9LAorI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisgICAge01OR19GTl9JTklUX0pIRFIsICAgICAgICAgICAgICAgICAiaW5pdF9qaGRyIn0sCisgICAge01OR19GTl9JTklUX0pEQVQsICAgICAgICAgICAgICAgICAiaW5pdF9qZGF0In0sCisgICAge01OR19GTl9JTklUX0pTRVAsICAgICAgICAgICAgICAgICAiaW5pdF9qc2VwIn0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworICAgIHtNTkdfRk5fSU5JVF9ESERSLCAgICAgICAgICAgICAgICAgImluaXRfZGhkciJ9LAorICAgIHtNTkdfRk5fSU5JVF9QUk9NLCAgICAgICAgICAgICAgICAgImluaXRfcHJvbSJ9LAorI2lmZGVmIE1OR19JTkNMVURFX0pORworICAgIHtNTkdfRk5fSU5JVF9JUE5HLCAgICAgICAgICAgICAgICAgImluaXRfaXBuZyJ9LAorI2VuZGlmCisgICAge01OR19GTl9JTklUX1BQTFQsICAgICAgICAgICAgICAgICAiaW5pdF9wcGx0In0sCisgICAge01OR19GTl9JTklUX0lKTkcsICAgICAgICAgICAgICAgICAiaW5pdF9pam5nIn0sCisgICAge01OR19GTl9JTklUX0RST1AsICAgICAgICAgICAgICAgICAiaW5pdF9kcm9wIn0sCisgICAge01OR19GTl9JTklUX0RCWUssICAgICAgICAgICAgICAgICAiaW5pdF9kYnlrIn0sCisgICAge01OR19GTl9JTklUX09SRFIsICAgICAgICAgICAgICAgICAiaW5pdF9vcmRyIn0sCisjZW5kaWYKKyAgICB7TU5HX0ZOX0lOSVRfVU5LTk9XTiwgICAgICAgICAgICAgICJpbml0X3Vua25vd24ifSwKKyAgICB7TU5HX0ZOX0lOSVRfTUFHTiwgICAgICAgICAgICAgICAgICJpbml0X21hZ24ifSwKKyAgICB7TU5HX0ZOX0lOSVRfSkRBQSwgICAgICAgICAgICAgICAgICJpbml0X2pkYWEifSwKKyAgICB7TU5HX0ZOX0lOSVRfRVZOVCwgICAgICAgICAgICAgICAgICJpbml0X2V2bnQifSwKKyNpZmRlZiBNTkdfSU5DTFVERV9NUE5HX1BST1BPU0FMCisgICAge01OR19GTl9JTklUX01QTkcsICAgICAgICAgICAgICAgICAiaW5pdF9tcG5nIn0sCisjZW5kaWYKKworICAgIHtNTkdfRk5fQVNTSUdOX0lIRFIsICAgICAgICAgICAgICAgImFzc2lnbl9paGRyIn0sCisgICAge01OR19GTl9BU1NJR05fUExURSwgICAgICAgICAgICAgICAiYXNzaWduX3BsdGUifSwKKyAgICB7TU5HX0ZOX0FTU0lHTl9JREFULCAgICAgICAgICAgICAgICJhc3NpZ25faWRhdCJ9LAorICAgIHtNTkdfRk5fQVNTSUdOX0lFTkQsICAgICAgICAgICAgICAgImFzc2lnbl9pZW5kIn0sCisgICAge01OR19GTl9BU1NJR05fVFJOUywgICAgICAgICAgICAgICAiYXNzaWduX3RybnMifSwKKyAgICB7TU5HX0ZOX0FTU0lHTl9HQU1BLCAgICAgICAgICAgICAgICJhc3NpZ25fZ2FtYSJ9LAorICAgIHtNTkdfRk5fQVNTSUdOX0NIUk0sICAgICAgICAgICAgICAgImFzc2lnbl9jaHJtIn0sCisgICAge01OR19GTl9BU1NJR05fU1JHQiwgICAgICAgICAgICAgICAiYXNzaWduX3NyZ2IifSwKKyAgICB7TU5HX0ZOX0FTU0lHTl9JQ0NQLCAgICAgICAgICAgICAgICJhc3NpZ25faWNjcCJ9LAorICAgIHtNTkdfRk5fQVNTSUdOX1RFWFQsICAgICAgICAgICAgICAgImFzc2lnbl90ZXh0In0sCisgICAge01OR19GTl9BU1NJR05fWlRYVCwgICAgICAgICAgICAgICAiYXNzaWduX3p0eHQifSwKKyAgICB7TU5HX0ZOX0FTU0lHTl9JVFhULCAgICAgICAgICAgICAgICJhc3NpZ25faXR4dCJ9LAorICAgIHtNTkdfRk5fQVNTSUdOX0JLR0QsICAgICAgICAgICAgICAgImFzc2lnbl9ia2dkIn0sCisgICAge01OR19GTl9BU1NJR05fUEhZUywgICAgICAgICAgICAgICAiYXNzaWduX3BoeXMifSwKKyAgICB7TU5HX0ZOX0FTU0lHTl9TQklULCAgICAgICAgICAgICAgICJhc3NpZ25fc2JpdCJ9LAorICAgIHtNTkdfRk5fQVNTSUdOX1NQTFQsICAgICAgICAgICAgICAgImFzc2lnbl9zcGx0In0sCisgICAge01OR19GTl9BU1NJR05fSElTVCwgICAgICAgICAgICAgICAiYXNzaWduX2hpc3QifSwKKyAgICB7TU5HX0ZOX0FTU0lHTl9USU1FLCAgICAgICAgICAgICAgICJhc3NpZ25fdGltZSJ9LAorICAgIHtNTkdfRk5fQVNTSUdOX01IRFIsICAgICAgICAgICAgICAgImFzc2lnbl9taGRyIn0sCisgICAge01OR19GTl9BU1NJR05fTUVORCwgICAgICAgICAgICAgICAiYXNzaWduX21lbmQifSwKKyAgICB7TU5HX0ZOX0FTU0lHTl9MT09QLCAgICAgICAgICAgICAgICJhc3NpZ25fbG9vcCJ9LAorICAgIHtNTkdfRk5fQVNTSUdOX0VOREwsICAgICAgICAgICAgICAgImFzc2lnbl9lbmRsIn0sCisgICAge01OR19GTl9BU1NJR05fREVGSSwgICAgICAgICAgICAgICAiYXNzaWduX2RlZmkifSwKKyAgICB7TU5HX0ZOX0FTU0lHTl9CQVNJLCAgICAgICAgICAgICAgICJhc3NpZ25fYmFzaSJ9LAorICAgIHtNTkdfRk5fQVNTSUdOX0NMT04sICAgICAgICAgICAgICAgImFzc2lnbl9jbG9uIn0sCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfUEFTVAorICAgIHtNTkdfRk5fQVNTSUdOX1BBU1QsICAgICAgICAgICAgICAgImFzc2lnbl9wYXN0In0sCisjZW5kaWYKKyAgICB7TU5HX0ZOX0FTU0lHTl9ESVNDLCAgICAgICAgICAgICAgICJhc3NpZ25fZGlzYyJ9LAorICAgIHtNTkdfRk5fQVNTSUdOX0JBQ0ssICAgICAgICAgICAgICAgImFzc2lnbl9iYWNrIn0sCisgICAge01OR19GTl9BU1NJR05fRlJBTSwgICAgICAgICAgICAgICAiYXNzaWduX2ZyYW0ifSwKKyAgICB7TU5HX0ZOX0FTU0lHTl9NT1ZFLCAgICAgICAgICAgICAgICJhc3NpZ25fbW92ZSJ9LAorICAgIHtNTkdfRk5fQVNTSUdOX0NMSVAsICAgICAgICAgICAgICAgImFzc2lnbl9jbGlwIn0sCisgICAge01OR19GTl9BU1NJR05fU0hPVywgICAgICAgICAgICAgICAiYXNzaWduX3Nob3cifSwKKyAgICB7TU5HX0ZOX0FTU0lHTl9URVJNLCAgICAgICAgICAgICAgICJhc3NpZ25fdGVybSJ9LAorICAgIHtNTkdfRk5fQVNTSUdOX1NBVkUsICAgICAgICAgICAgICAgImFzc2lnbl9zYXZlIn0sCisgICAge01OR19GTl9BU1NJR05fU0VFSywgICAgICAgICAgICAgICAiYXNzaWduX3NlZWsifSwKKyAgICB7TU5HX0ZOX0FTU0lHTl9FWFBJLCAgICAgICAgICAgICAgICJhc3NpZ25fZXhwaSJ9LAorICAgIHtNTkdfRk5fQVNTSUdOX0ZQUkksICAgICAgICAgICAgICAgImFzc2lnbl9mcHJpIn0sCisgICAge01OR19GTl9BU1NJR05fTkVFRCwgICAgICAgICAgICAgICAiYXNzaWduX25lZWQifSwKKyAgICB7TU5HX0ZOX0FTU0lHTl9QSFlHLCAgICAgICAgICAgICAgICJhc3NpZ25fcGh5ZyJ9LAorI2lmZGVmIE1OR19JTkNMVURFX0pORworICAgIHtNTkdfRk5fQVNTSUdOX0pIRFIsICAgICAgICAgICAgICAgImFzc2lnbl9qaGRyIn0sCisgICAge01OR19GTl9BU1NJR05fSkRBVCwgICAgICAgICAgICAgICAiYXNzaWduX2pkYXQifSwKKyAgICB7TU5HX0ZOX0FTU0lHTl9KU0VQLCAgICAgICAgICAgICAgICJhc3NpZ25fanNlcCJ9LAorI2VuZGlmCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKKyAgICB7TU5HX0ZOX0FTU0lHTl9ESERSLCAgICAgICAgICAgICAgICJhc3NpZ25fZGhkciJ9LAorICAgIHtNTkdfRk5fQVNTSUdOX1BST00sICAgICAgICAgICAgICAgImFzc2lnbl9wcm9tIn0sCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisgICAge01OR19GTl9BU1NJR05fSVBORywgICAgICAgICAgICAgICAiYXNzaWduX2lwbmcifSwKKyNlbmRpZgorICAgIHtNTkdfRk5fQVNTSUdOX1BQTFQsICAgICAgICAgICAgICAgImFzc2lnbl9wcGx0In0sCisgICAge01OR19GTl9BU1NJR05fSUpORywgICAgICAgICAgICAgICAiYXNzaWduX2lqbmcifSwKKyAgICB7TU5HX0ZOX0FTU0lHTl9EUk9QLCAgICAgICAgICAgICAgICJhc3NpZ25fZHJvcCJ9LAorICAgIHtNTkdfRk5fQVNTSUdOX0RCWUssICAgICAgICAgICAgICAgImFzc2lnbl9kYnlrIn0sCisgICAge01OR19GTl9BU1NJR05fT1JEUiwgICAgICAgICAgICAgICAiYXNzaWduX29yZHIifSwKKyNlbmRpZgorICAgIHtNTkdfRk5fQVNTSUdOX1VOS05PV04sICAgICAgICAgICAgImFzc2lnbl91bmtub3duIn0sCisgICAge01OR19GTl9BU1NJR05fTUFHTiwgICAgICAgICAgICAgICAiYXNzaWduX21hZ24ifSwKKyAgICB7TU5HX0ZOX0FTU0lHTl9KREFBLCAgICAgICAgICAgICAgICJhc3NpZ25famRhYSJ9LAorICAgIHtNTkdfRk5fQVNTSUdOX0VWTlQsICAgICAgICAgICAgICAgImFzc2lnbl9ldm50In0sCisjaWZkZWYgTU5HX0lOQ0xVREVfTVBOR19QUk9QT1NBTAorICAgIHtNTkdfRk5fQVNTSUdOX01QTkcsICAgICAgICAgICAgICAgImFzc2lnbl9tcG5nIn0sCisjZW5kaWYKKworICAgIHtNTkdfRk5fRlJFRV9JSERSLCAgICAgICAgICAgICAgICAgImZyZWVfaWhkciJ9LAorICAgIHtNTkdfRk5fRlJFRV9QTFRFLCAgICAgICAgICAgICAgICAgImZyZWVfcGx0ZSJ9LAorICAgIHtNTkdfRk5fRlJFRV9JREFULCAgICAgICAgICAgICAgICAgImZyZWVfaWRhdCJ9LAorICAgIHtNTkdfRk5fRlJFRV9JRU5ELCAgICAgICAgICAgICAgICAgImZyZWVfaWVuZCJ9LAorICAgIHtNTkdfRk5fRlJFRV9UUk5TLCAgICAgICAgICAgICAgICAgImZyZWVfdHJucyJ9LAorICAgIHtNTkdfRk5fRlJFRV9HQU1BLCAgICAgICAgICAgICAgICAgImZyZWVfZ2FtYSJ9LAorICAgIHtNTkdfRk5fRlJFRV9DSFJNLCAgICAgICAgICAgICAgICAgImZyZWVfY2hybSJ9LAorICAgIHtNTkdfRk5fRlJFRV9TUkdCLCAgICAgICAgICAgICAgICAgImZyZWVfc3JnYiJ9LAorICAgIHtNTkdfRk5fRlJFRV9JQ0NQLCAgICAgICAgICAgICAgICAgImZyZWVfaWNjcCJ9LAorICAgIHtNTkdfRk5fRlJFRV9URVhULCAgICAgICAgICAgICAgICAgImZyZWVfdGV4dCJ9LAorICAgIHtNTkdfRk5fRlJFRV9aVFhULCAgICAgICAgICAgICAgICAgImZyZWVfenR4dCJ9LAorICAgIHtNTkdfRk5fRlJFRV9JVFhULCAgICAgICAgICAgICAgICAgImZyZWVfaXR4dCJ9LAorICAgIHtNTkdfRk5fRlJFRV9CS0dELCAgICAgICAgICAgICAgICAgImZyZWVfYmtnZCJ9LAorICAgIHtNTkdfRk5fRlJFRV9QSFlTLCAgICAgICAgICAgICAgICAgImZyZWVfcGh5cyJ9LAorICAgIHtNTkdfRk5fRlJFRV9TQklULCAgICAgICAgICAgICAgICAgImZyZWVfc2JpdCJ9LAorICAgIHtNTkdfRk5fRlJFRV9TUExULCAgICAgICAgICAgICAgICAgImZyZWVfc3BsdCJ9LAorICAgIHtNTkdfRk5fRlJFRV9ISVNULCAgICAgICAgICAgICAgICAgImZyZWVfaGlzdCJ9LAorICAgIHtNTkdfRk5fRlJFRV9USU1FLCAgICAgICAgICAgICAgICAgImZyZWVfdGltZSJ9LAorICAgIHtNTkdfRk5fRlJFRV9NSERSLCAgICAgICAgICAgICAgICAgImZyZWVfbWhkciJ9LAorICAgIHtNTkdfRk5fRlJFRV9NRU5ELCAgICAgICAgICAgICAgICAgImZyZWVfbWVuZCJ9LAorICAgIHtNTkdfRk5fRlJFRV9MT09QLCAgICAgICAgICAgICAgICAgImZyZWVfbG9vcCJ9LAorICAgIHtNTkdfRk5fRlJFRV9FTkRMLCAgICAgICAgICAgICAgICAgImZyZWVfZW5kbCJ9LAorICAgIHtNTkdfRk5fRlJFRV9ERUZJLCAgICAgICAgICAgICAgICAgImZyZWVfZGVmaSJ9LAorICAgIHtNTkdfRk5fRlJFRV9CQVNJLCAgICAgICAgICAgICAgICAgImZyZWVfYmFzaSJ9LAorICAgIHtNTkdfRk5fRlJFRV9DTE9OLCAgICAgICAgICAgICAgICAgImZyZWVfY2xvbiJ9LAorI2lmbmRlZiBNTkdfU0tJUENIVU5LX1BBU1QKKyAgICB7TU5HX0ZOX0ZSRUVfUEFTVCwgICAgICAgICAgICAgICAgICJmcmVlX3Bhc3QifSwKKyNlbmRpZgorICAgIHtNTkdfRk5fRlJFRV9ESVNDLCAgICAgICAgICAgICAgICAgImZyZWVfZGlzYyJ9LAorICAgIHtNTkdfRk5fRlJFRV9CQUNLLCAgICAgICAgICAgICAgICAgImZyZWVfYmFjayJ9LAorICAgIHtNTkdfRk5fRlJFRV9GUkFNLCAgICAgICAgICAgICAgICAgImZyZWVfZnJhbSJ9LAorICAgIHtNTkdfRk5fRlJFRV9NT1ZFLCAgICAgICAgICAgICAgICAgImZyZWVfbW92ZSJ9LAorICAgIHtNTkdfRk5fRlJFRV9DTElQLCAgICAgICAgICAgICAgICAgImZyZWVfY2xpcCJ9LAorICAgIHtNTkdfRk5fRlJFRV9TSE9XLCAgICAgICAgICAgICAgICAgImZyZWVfc2hvdyJ9LAorICAgIHtNTkdfRk5fRlJFRV9URVJNLCAgICAgICAgICAgICAgICAgImZyZWVfdGVybSJ9LAorICAgIHtNTkdfRk5fRlJFRV9TQVZFLCAgICAgICAgICAgICAgICAgImZyZWVfc2F2ZSJ9LAorICAgIHtNTkdfRk5fRlJFRV9TRUVLLCAgICAgICAgICAgICAgICAgImZyZWVfc2VlayJ9LAorICAgIHtNTkdfRk5fRlJFRV9FWFBJLCAgICAgICAgICAgICAgICAgImZyZWVfZXhwaSJ9LAorICAgIHtNTkdfRk5fRlJFRV9GUFJJLCAgICAgICAgICAgICAgICAgImZyZWVfZnByaSJ9LAorICAgIHtNTkdfRk5fRlJFRV9ORUVELCAgICAgICAgICAgICAgICAgImZyZWVfbmVlZCJ9LAorICAgIHtNTkdfRk5fRlJFRV9QSFlHLCAgICAgICAgICAgICAgICAgImZyZWVfcGh5ZyJ9LAorI2lmZGVmIE1OR19JTkNMVURFX0pORworICAgIHtNTkdfRk5fRlJFRV9KSERSLCAgICAgICAgICAgICAgICAgImZyZWVfamhkciJ9LAorICAgIHtNTkdfRk5fRlJFRV9KREFULCAgICAgICAgICAgICAgICAgImZyZWVfamRhdCJ9LAorICAgIHtNTkdfRk5fRlJFRV9KU0VQLCAgICAgICAgICAgICAgICAgImZyZWVfanNlcCJ9LAorI2VuZGlmCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKKyAgICB7TU5HX0ZOX0ZSRUVfREhEUiwgICAgICAgICAgICAgICAgICJmcmVlX2RoZHIifSwKKyAgICB7TU5HX0ZOX0ZSRUVfUFJPTSwgICAgICAgICAgICAgICAgICJmcmVlX3Byb20ifSwKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgICB7TU5HX0ZOX0ZSRUVfSVBORywgICAgICAgICAgICAgICAgICJmcmVlX2lwbmcifSwKKyNlbmRpZgorICAgIHtNTkdfRk5fRlJFRV9QUExULCAgICAgICAgICAgICAgICAgImZyZWVfcHBsdCJ9LAorICAgIHtNTkdfRk5fRlJFRV9JSk5HLCAgICAgICAgICAgICAgICAgImZyZWVfaWpuZyJ9LAorICAgIHtNTkdfRk5fRlJFRV9EUk9QLCAgICAgICAgICAgICAgICAgImZyZWVfZHJvcCJ9LAorICAgIHtNTkdfRk5fRlJFRV9EQllLLCAgICAgICAgICAgICAgICAgImZyZWVfZGJ5ayJ9LAorICAgIHtNTkdfRk5fRlJFRV9PUkRSLCAgICAgICAgICAgICAgICAgImZyZWVfb3JkciJ9LAorI2VuZGlmCisgICAge01OR19GTl9GUkVFX1VOS05PV04sICAgICAgICAgICAgICAiZnJlZV91bmtub3duIn0sCisgICAge01OR19GTl9GUkVFX01BR04sICAgICAgICAgICAgICAgICAiZnJlZV9tYWduIn0sCisgICAge01OR19GTl9GUkVFX0pEQUEsICAgICAgICAgICAgICAgICAiZnJlZV9qZGFhIn0sCisgICAge01OR19GTl9GUkVFX0VWTlQsICAgICAgICAgICAgICAgICAiZnJlZV9ldm50In0sCisjaWZkZWYgTU5HX0lOQ0xVREVfTVBOR19QUk9QT1NBTAorICAgIHtNTkdfRk5fRlJFRV9NUE5HLCAgICAgICAgICAgICAgICAgImZyZWVfbXBuZyJ9LAorI2VuZGlmCisKKyAgICB7TU5HX0ZOX1JFQURfSUhEUiwgICAgICAgICAgICAgICAgICJyZWFkX2loZHIifSwKKyAgICB7TU5HX0ZOX1JFQURfUExURSwgICAgICAgICAgICAgICAgICJyZWFkX3BsdGUifSwKKyAgICB7TU5HX0ZOX1JFQURfSURBVCwgICAgICAgICAgICAgICAgICJyZWFkX2lkYXQifSwKKyAgICB7TU5HX0ZOX1JFQURfSUVORCwgICAgICAgICAgICAgICAgICJyZWFkX2llbmQifSwKKyAgICB7TU5HX0ZOX1JFQURfVFJOUywgICAgICAgICAgICAgICAgICJyZWFkX3RybnMifSwKKyAgICB7TU5HX0ZOX1JFQURfR0FNQSwgICAgICAgICAgICAgICAgICJyZWFkX2dhbWEifSwKKyAgICB7TU5HX0ZOX1JFQURfQ0hSTSwgICAgICAgICAgICAgICAgICJyZWFkX2Nocm0ifSwKKyAgICB7TU5HX0ZOX1JFQURfU1JHQiwgICAgICAgICAgICAgICAgICJyZWFkX3NyZ2IifSwKKyAgICB7TU5HX0ZOX1JFQURfSUNDUCwgICAgICAgICAgICAgICAgICJyZWFkX2ljY3AifSwKKyAgICB7TU5HX0ZOX1JFQURfVEVYVCwgICAgICAgICAgICAgICAgICJyZWFkX3RleHQifSwKKyAgICB7TU5HX0ZOX1JFQURfWlRYVCwgICAgICAgICAgICAgICAgICJyZWFkX3p0eHQifSwKKyAgICB7TU5HX0ZOX1JFQURfSVRYVCwgICAgICAgICAgICAgICAgICJyZWFkX2l0eHQifSwKKyAgICB7TU5HX0ZOX1JFQURfQktHRCwgICAgICAgICAgICAgICAgICJyZWFkX2JrZ2QifSwKKyAgICB7TU5HX0ZOX1JFQURfUEhZUywgICAgICAgICAgICAgICAgICJyZWFkX3BoeXMifSwKKyAgICB7TU5HX0ZOX1JFQURfU0JJVCwgICAgICAgICAgICAgICAgICJyZWFkX3NiaXQifSwKKyAgICB7TU5HX0ZOX1JFQURfU1BMVCwgICAgICAgICAgICAgICAgICJyZWFkX3NwbHQifSwKKyAgICB7TU5HX0ZOX1JFQURfSElTVCwgICAgICAgICAgICAgICAgICJyZWFkX2hpc3QifSwKKyAgICB7TU5HX0ZOX1JFQURfVElNRSwgICAgICAgICAgICAgICAgICJyZWFkX3RpbWUifSwKKyAgICB7TU5HX0ZOX1JFQURfTUhEUiwgICAgICAgICAgICAgICAgICJyZWFkX21oZHIifSwKKyAgICB7TU5HX0ZOX1JFQURfTUVORCwgICAgICAgICAgICAgICAgICJyZWFkX21lbmQifSwKKyAgICB7TU5HX0ZOX1JFQURfTE9PUCwgICAgICAgICAgICAgICAgICJyZWFkX2xvb3AifSwKKyAgICB7TU5HX0ZOX1JFQURfRU5ETCwgICAgICAgICAgICAgICAgICJyZWFkX2VuZGwifSwKKyAgICB7TU5HX0ZOX1JFQURfREVGSSwgICAgICAgICAgICAgICAgICJyZWFkX2RlZmkifSwKKyAgICB7TU5HX0ZOX1JFQURfQkFTSSwgICAgICAgICAgICAgICAgICJyZWFkX2Jhc2kifSwKKyAgICB7TU5HX0ZOX1JFQURfQ0xPTiwgICAgICAgICAgICAgICAgICJyZWFkX2Nsb24ifSwKKyNpZm5kZWYgTU5HX1NLSVBDSFVOS19QQVNUCisgICAge01OR19GTl9SRUFEX1BBU1QsICAgICAgICAgICAgICAgICAicmVhZF9wYXN0In0sCisjZW5kaWYKKyAgICB7TU5HX0ZOX1JFQURfRElTQywgICAgICAgICAgICAgICAgICJyZWFkX2Rpc2MifSwKKyAgICB7TU5HX0ZOX1JFQURfQkFDSywgICAgICAgICAgICAgICAgICJyZWFkX2JhY2sifSwKKyAgICB7TU5HX0ZOX1JFQURfRlJBTSwgICAgICAgICAgICAgICAgICJyZWFkX2ZyYW0ifSwKKyAgICB7TU5HX0ZOX1JFQURfTU9WRSwgICAgICAgICAgICAgICAgICJyZWFkX21vdmUifSwKKyAgICB7TU5HX0ZOX1JFQURfQ0xJUCwgICAgICAgICAgICAgICAgICJyZWFkX2NsaXAifSwKKyAgICB7TU5HX0ZOX1JFQURfU0hPVywgICAgICAgICAgICAgICAgICJyZWFkX3Nob3cifSwKKyAgICB7TU5HX0ZOX1JFQURfVEVSTSwgICAgICAgICAgICAgICAgICJyZWFkX3Rlcm0ifSwKKyAgICB7TU5HX0ZOX1JFQURfU0FWRSwgICAgICAgICAgICAgICAgICJyZWFkX3NhdmUifSwKKyAgICB7TU5HX0ZOX1JFQURfU0VFSywgICAgICAgICAgICAgICAgICJyZWFkX3NlZWsifSwKKyAgICB7TU5HX0ZOX1JFQURfRVhQSSwgICAgICAgICAgICAgICAgICJyZWFkX2V4cGkifSwKKyAgICB7TU5HX0ZOX1JFQURfRlBSSSwgICAgICAgICAgICAgICAgICJyZWFkX2ZwcmkifSwKKyAgICB7TU5HX0ZOX1JFQURfTkVFRCwgICAgICAgICAgICAgICAgICJyZWFkX25lZWQifSwKKyAgICB7TU5HX0ZOX1JFQURfUEhZRywgICAgICAgICAgICAgICAgICJyZWFkX3BoeWcifSwKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgICB7TU5HX0ZOX1JFQURfSkhEUiwgICAgICAgICAgICAgICAgICJyZWFkX2poZHIifSwKKyAgICB7TU5HX0ZOX1JFQURfSkRBVCwgICAgICAgICAgICAgICAgICJyZWFkX2pkYXQifSwKKyAgICB7TU5HX0ZOX1JFQURfSlNFUCwgICAgICAgICAgICAgICAgICJyZWFkX2pzZXAifSwKKyNlbmRpZgorI2lmbmRlZiBNTkdfTk9fREVMVEFfUE5HCisgICAge01OR19GTl9SRUFEX0RIRFIsICAgICAgICAgICAgICAgICAicmVhZF9kaGRyIn0sCisgICAge01OR19GTl9SRUFEX1BST00sICAgICAgICAgICAgICAgICAicmVhZF9wcm9tIn0sCisgICAge01OR19GTl9SRUFEX0lQTkcsICAgICAgICAgICAgICAgICAicmVhZF9pcG5nIn0sCisgICAge01OR19GTl9SRUFEX1BQTFQsICAgICAgICAgICAgICAgICAicmVhZF9wcGx0In0sCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisgICAge01OR19GTl9SRUFEX0lKTkcsICAgICAgICAgICAgICAgICAicmVhZF9pam5nIn0sCisjZW5kaWYKKyAgICB7TU5HX0ZOX1JFQURfRFJPUCwgICAgICAgICAgICAgICAgICJyZWFkX2Ryb3AifSwKKyAgICB7TU5HX0ZOX1JFQURfREJZSywgICAgICAgICAgICAgICAgICJyZWFkX2RieWsifSwKKyAgICB7TU5HX0ZOX1JFQURfT1JEUiwgICAgICAgICAgICAgICAgICJyZWFkX29yZHIifSwKKyNlbmRpZgorICAgIHtNTkdfRk5fUkVBRF9VTktOT1dOLCAgICAgICAgICAgICAgInJlYWRfdW5rbm93biJ9LAorICAgIHtNTkdfRk5fUkVBRF9NQUdOLCAgICAgICAgICAgICAgICAgInJlYWRfbWFnbiJ9LAorICAgIHtNTkdfRk5fUkVBRF9KREFBLCAgICAgICAgICAgICAgICAgInJlYWRfamRhYSJ9LAorICAgIHtNTkdfRk5fUkVBRF9FVk5ULCAgICAgICAgICAgICAgICAgInJlYWRfZXZudCJ9LAorI2lmZGVmIE1OR19JTkNMVURFX01QTkdfUFJPUE9TQUwKKyAgICB7TU5HX0ZOX1JFQURfTVBORywgICAgICAgICAgICAgICAgICJyZWFkX21wbmcifSwKKyNlbmRpZgorCisgICAge01OR19GTl9XUklURV9JSERSLCAgICAgICAgICAgICAgICAid3JpdGVfaWhkciJ9LAorICAgIHtNTkdfRk5fV1JJVEVfUExURSwgICAgICAgICAgICAgICAgIndyaXRlX3BsdGUifSwKKyAgICB7TU5HX0ZOX1dSSVRFX0lEQVQsICAgICAgICAgICAgICAgICJ3cml0ZV9pZGF0In0sCisgICAge01OR19GTl9XUklURV9JRU5ELCAgICAgICAgICAgICAgICAid3JpdGVfaWVuZCJ9LAorICAgIHtNTkdfRk5fV1JJVEVfVFJOUywgICAgICAgICAgICAgICAgIndyaXRlX3RybnMifSwKKyAgICB7TU5HX0ZOX1dSSVRFX0dBTUEsICAgICAgICAgICAgICAgICJ3cml0ZV9nYW1hIn0sCisgICAge01OR19GTl9XUklURV9DSFJNLCAgICAgICAgICAgICAgICAid3JpdGVfY2hybSJ9LAorICAgIHtNTkdfRk5fV1JJVEVfU1JHQiwgICAgICAgICAgICAgICAgIndyaXRlX3NyZ2IifSwKKyAgICB7TU5HX0ZOX1dSSVRFX0lDQ1AsICAgICAgICAgICAgICAgICJ3cml0ZV9pY2NwIn0sCisgICAge01OR19GTl9XUklURV9URVhULCAgICAgICAgICAgICAgICAid3JpdGVfdGV4dCJ9LAorICAgIHtNTkdfRk5fV1JJVEVfWlRYVCwgICAgICAgICAgICAgICAgIndyaXRlX3p0eHQifSwKKyAgICB7TU5HX0ZOX1dSSVRFX0lUWFQsICAgICAgICAgICAgICAgICJ3cml0ZV9pdHh0In0sCisgICAge01OR19GTl9XUklURV9CS0dELCAgICAgICAgICAgICAgICAid3JpdGVfYmtnZCJ9LAorICAgIHtNTkdfRk5fV1JJVEVfUEhZUywgICAgICAgICAgICAgICAgIndyaXRlX3BoeXMifSwKKyAgICB7TU5HX0ZOX1dSSVRFX1NCSVQsICAgICAgICAgICAgICAgICJ3cml0ZV9zYml0In0sCisgICAge01OR19GTl9XUklURV9TUExULCAgICAgICAgICAgICAgICAid3JpdGVfc3BsdCJ9LAorICAgIHtNTkdfRk5fV1JJVEVfSElTVCwgICAgICAgICAgICAgICAgIndyaXRlX2hpc3QifSwKKyAgICB7TU5HX0ZOX1dSSVRFX1RJTUUsICAgICAgICAgICAgICAgICJ3cml0ZV90aW1lIn0sCisgICAge01OR19GTl9XUklURV9NSERSLCAgICAgICAgICAgICAgICAid3JpdGVfbWhkciJ9LAorICAgIHtNTkdfRk5fV1JJVEVfTUVORCwgICAgICAgICAgICAgICAgIndyaXRlX21lbmQifSwKKyAgICB7TU5HX0ZOX1dSSVRFX0xPT1AsICAgICAgICAgICAgICAgICJ3cml0ZV9sb29wIn0sCisgICAge01OR19GTl9XUklURV9FTkRMLCAgICAgICAgICAgICAgICAid3JpdGVfZW5kbCJ9LAorICAgIHtNTkdfRk5fV1JJVEVfREVGSSwgICAgICAgICAgICAgICAgIndyaXRlX2RlZmkifSwKKyAgICB7TU5HX0ZOX1dSSVRFX0JBU0ksICAgICAgICAgICAgICAgICJ3cml0ZV9iYXNpIn0sCisgICAge01OR19GTl9XUklURV9DTE9OLCAgICAgICAgICAgICAgICAid3JpdGVfY2xvbiJ9LAorI2lmbmRlZiBNTkdfU0tJUENIVU5LX1BBU1QKKyAgICB7TU5HX0ZOX1dSSVRFX1BBU1QsICAgICAgICAgICAgICAgICJ3cml0ZV9wYXN0In0sCisjZW5kaWYKKyAgICB7TU5HX0ZOX1dSSVRFX0RJU0MsICAgICAgICAgICAgICAgICJ3cml0ZV9kaXNjIn0sCisgICAge01OR19GTl9XUklURV9CQUNLLCAgICAgICAgICAgICAgICAid3JpdGVfYmFjayJ9LAorICAgIHtNTkdfRk5fV1JJVEVfRlJBTSwgICAgICAgICAgICAgICAgIndyaXRlX2ZyYW0ifSwKKyAgICB7TU5HX0ZOX1dSSVRFX01PVkUsICAgICAgICAgICAgICAgICJ3cml0ZV9tb3ZlIn0sCisgICAge01OR19GTl9XUklURV9DTElQLCAgICAgICAgICAgICAgICAid3JpdGVfY2xpcCJ9LAorICAgIHtNTkdfRk5fV1JJVEVfU0hPVywgICAgICAgICAgICAgICAgIndyaXRlX3Nob3cifSwKKyAgICB7TU5HX0ZOX1dSSVRFX1RFUk0sICAgICAgICAgICAgICAgICJ3cml0ZV90ZXJtIn0sCisgICAge01OR19GTl9XUklURV9TQVZFLCAgICAgICAgICAgICAgICAid3JpdGVfc2F2ZSJ9LAorICAgIHtNTkdfRk5fV1JJVEVfU0VFSywgICAgICAgICAgICAgICAgIndyaXRlX3NlZWsifSwKKyAgICB7TU5HX0ZOX1dSSVRFX0VYUEksICAgICAgICAgICAgICAgICJ3cml0ZV9leHBpIn0sCisgICAge01OR19GTl9XUklURV9GUFJJLCAgICAgICAgICAgICAgICAid3JpdGVfZnByaSJ9LAorICAgIHtNTkdfRk5fV1JJVEVfTkVFRCwgICAgICAgICAgICAgICAgIndyaXRlX25lZWQifSwKKyAgICB7TU5HX0ZOX1dSSVRFX1BIWUcsICAgICAgICAgICAgICAgICJ3cml0ZV9waHlnIn0sCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisgICAge01OR19GTl9XUklURV9KSERSLCAgICAgICAgICAgICAgICAid3JpdGVfamhkciJ9LAorICAgIHtNTkdfRk5fV1JJVEVfSkRBVCwgICAgICAgICAgICAgICAgIndyaXRlX2pkYXQifSwKKyAgICB7TU5HX0ZOX1dSSVRFX0pTRVAsICAgICAgICAgICAgICAgICJ3cml0ZV9qc2VwIn0sCisjZW5kaWYKKyNpZm5kZWYgTU5HX05PX0RFTFRBX1BORworICAgIHtNTkdfRk5fV1JJVEVfREhEUiwgICAgICAgICAgICAgICAgIndyaXRlX2RoZHIifSwKKyAgICB7TU5HX0ZOX1dSSVRFX1BST00sICAgICAgICAgICAgICAgICJ3cml0ZV9wcm9tIn0sCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisgICAge01OR19GTl9XUklURV9JUE5HLCAgICAgICAgICAgICAgICAid3JpdGVfaXBuZyJ9LAorI2VuZGlmCisgICAge01OR19GTl9XUklURV9QUExULCAgICAgICAgICAgICAgICAid3JpdGVfcHBsdCJ9LAorICAgIHtNTkdfRk5fV1JJVEVfSUpORywgICAgICAgICAgICAgICAgIndyaXRlX2lqbmcifSwKKyAgICB7TU5HX0ZOX1dSSVRFX0RST1AsICAgICAgICAgICAgICAgICJ3cml0ZV9kcm9wIn0sCisgICAge01OR19GTl9XUklURV9EQllLLCAgICAgICAgICAgICAgICAid3JpdGVfZGJ5ayJ9LAorICAgIHtNTkdfRk5fV1JJVEVfT1JEUiwgICAgICAgICAgICAgICAgIndyaXRlX29yZHIifSwKKyNlbmRpZgorICAgIHtNTkdfRk5fV1JJVEVfVU5LTk9XTiwgICAgICAgICAgICAgIndyaXRlX3Vua25vd24ifSwKKyAgICB7TU5HX0ZOX1dSSVRFX01BR04sICAgICAgICAgICAgICAgICJ3cml0ZV9tYWduIn0sCisgICAge01OR19GTl9XUklURV9KREFBLCAgICAgICAgICAgICAgICAid3JpdGVfamRhYSJ9LAorICAgIHtNTkdfRk5fV1JJVEVfRVZOVCwgICAgICAgICAgICAgICAgIndyaXRlX2V2bnQifSwKKyNpZmRlZiBNTkdfSU5DTFVERV9NUE5HX1BST1BPU0FMCisgICAge01OR19GTl9XUklURV9NUE5HLCAgICAgICAgICAgICAgICAid3JpdGVfbXBuZyJ9LAorI2VuZGlmCisKKyAgICB7TU5HX0ZOX1pMSUJfSU5JVElBTElaRSwgICAgICAgICAgICJ6bGliX2luaXRpYWxpemUifSwKKyAgICB7TU5HX0ZOX1pMSUJfQ0xFQU5VUCwgICAgICAgICAgICAgICJ6bGliX2NsZWFudXAifSwKKyAgICB7TU5HX0ZOX1pMSUJfSU5GTEFURUlOSVQsICAgICAgICAgICJ6bGliX2luZmxhdGVpbml0In0sCisgICAge01OR19GTl9aTElCX0lORkxBVEVST1dTLCAgICAgICAgICAiemxpYl9pbmZsYXRlcm93cyJ9LAorICAgIHtNTkdfRk5fWkxJQl9JTkZMQVRFREFUQSwgICAgICAgICAgInpsaWJfaW5mbGF0ZWRhdGEifSwKKyAgICB7TU5HX0ZOX1pMSUJfSU5GTEFURUZSRUUsICAgICAgICAgICJ6bGliX2luZmxhdGVmcmVlIn0sCisgICAge01OR19GTl9aTElCX0RFRkxBVEVJTklULCAgICAgICAgICAiemxpYl9kZWZsYXRlaW5pdCJ9LAorICAgIHtNTkdfRk5fWkxJQl9ERUZMQVRFUk9XUywgICAgICAgICAgInpsaWJfZGVmbGF0ZXJvd3MifSwKKyAgICB7TU5HX0ZOX1pMSUJfREVGTEFURURBVEEsICAgICAgICAgICJ6bGliX2RlZmxhdGVkYXRhIn0sCisgICAge01OR19GTl9aTElCX0RFRkxBVEVGUkVFLCAgICAgICAgICAiemxpYl9kZWZsYXRlZnJlZSJ9LAorCisgICAge01OR19GTl9QUk9DRVNTX0RJU1BMQVlfSUhEUiwgICAgICAicHJvY2Vzc19kaXNwbGF5X2loZHIifSwKKyAgICB7TU5HX0ZOX1BST0NFU1NfRElTUExBWV9QTFRFLCAgICAgICJwcm9jZXNzX2Rpc3BsYXlfcGx0ZSJ9LAorICAgIHtNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX0lEQVQsICAgICAgInByb2Nlc3NfZGlzcGxheV9pZGF0In0sCisgICAge01OR19GTl9QUk9DRVNTX0RJU1BMQVlfSUVORCwgICAgICAicHJvY2Vzc19kaXNwbGF5X2llbmQifSwKKyAgICB7TU5HX0ZOX1BST0NFU1NfRElTUExBWV9UUk5TLCAgICAgICJwcm9jZXNzX2Rpc3BsYXlfdHJucyJ9LAorICAgIHtNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX0dBTUEsICAgICAgInByb2Nlc3NfZGlzcGxheV9nYW1hIn0sCisgICAge01OR19GTl9QUk9DRVNTX0RJU1BMQVlfQ0hSTSwgICAgICAicHJvY2Vzc19kaXNwbGF5X2Nocm0ifSwKKyAgICB7TU5HX0ZOX1BST0NFU1NfRElTUExBWV9TUkdCLCAgICAgICJwcm9jZXNzX2Rpc3BsYXlfc3JnYiJ9LAorICAgIHtNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX0lDQ1AsICAgICAgInByb2Nlc3NfZGlzcGxheV9pY2NwIn0sCisgICAge01OR19GTl9QUk9DRVNTX0RJU1BMQVlfQktHRCwgICAgICAicHJvY2Vzc19kaXNwbGF5X2JrZ2QifSwKKyAgICB7TU5HX0ZOX1BST0NFU1NfRElTUExBWV9QSFlTLCAgICAgICJwcm9jZXNzX2Rpc3BsYXlfcGh5cyJ9LAorICAgIHtNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX1NCSVQsICAgICAgInByb2Nlc3NfZGlzcGxheV9zYml0In0sCisgICAge01OR19GTl9QUk9DRVNTX0RJU1BMQVlfU1BMVCwgICAgICAicHJvY2Vzc19kaXNwbGF5X3NwbHQifSwKKyAgICB7TU5HX0ZOX1BST0NFU1NfRElTUExBWV9ISVNULCAgICAgICJwcm9jZXNzX2Rpc3BsYXlfaGlzdCJ9LAorICAgIHtNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX01IRFIsICAgICAgInByb2Nlc3NfZGlzcGxheV9taGRyIn0sCisgICAge01OR19GTl9QUk9DRVNTX0RJU1BMQVlfTUVORCwgICAgICAicHJvY2Vzc19kaXNwbGF5X21lbmQifSwKKyAgICB7TU5HX0ZOX1BST0NFU1NfRElTUExBWV9MT09QLCAgICAgICJwcm9jZXNzX2Rpc3BsYXlfbG9vcCJ9LAorICAgIHtNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX0VOREwsICAgICAgInByb2Nlc3NfZGlzcGxheV9lbmRsIn0sCisgICAge01OR19GTl9QUk9DRVNTX0RJU1BMQVlfREVGSSwgICAgICAicHJvY2Vzc19kaXNwbGF5X2RlZmkifSwKKyAgICB7TU5HX0ZOX1BST0NFU1NfRElTUExBWV9CQVNJLCAgICAgICJwcm9jZXNzX2Rpc3BsYXlfYmFzaSJ9LAorICAgIHtNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX0NMT04sICAgICAgInByb2Nlc3NfZGlzcGxheV9jbG9uIn0sCisjaWZuZGVmIE1OR19TS0lQQ0hVTktfUEFTVAorICAgIHtNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX1BBU1QsICAgICAgInByb2Nlc3NfZGlzcGxheV9wYXN0In0sCisjZW5kaWYKKyAgICB7TU5HX0ZOX1BST0NFU1NfRElTUExBWV9ESVNDLCAgICAgICJwcm9jZXNzX2Rpc3BsYXlfZGlzYyJ9LAorICAgIHtNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX0JBQ0ssICAgICAgInByb2Nlc3NfZGlzcGxheV9iYWNrIn0sCisgICAge01OR19GTl9QUk9DRVNTX0RJU1BMQVlfRlJBTSwgICAgICAicHJvY2Vzc19kaXNwbGF5X2ZyYW0ifSwKKyAgICB7TU5HX0ZOX1BST0NFU1NfRElTUExBWV9NT1ZFLCAgICAgICJwcm9jZXNzX2Rpc3BsYXlfbW92ZSJ9LAorICAgIHtNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX0NMSVAsICAgICAgInByb2Nlc3NfZGlzcGxheV9jbGlwIn0sCisgICAge01OR19GTl9QUk9DRVNTX0RJU1BMQVlfU0hPVywgICAgICAicHJvY2Vzc19kaXNwbGF5X3Nob3cifSwKKyAgICB7TU5HX0ZOX1BST0NFU1NfRElTUExBWV9URVJNLCAgICAgICJwcm9jZXNzX2Rpc3BsYXlfdGVybSJ9LAorICAgIHtNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX1NBVkUsICAgICAgInByb2Nlc3NfZGlzcGxheV9zYXZlIn0sCisgICAge01OR19GTl9QUk9DRVNTX0RJU1BMQVlfU0VFSywgICAgICAicHJvY2Vzc19kaXNwbGF5X3NlZWsifSwKKyAgICB7TU5HX0ZOX1BST0NFU1NfRElTUExBWV9FWFBJLCAgICAgICJwcm9jZXNzX2Rpc3BsYXlfZXhwaSJ9LAorICAgIHtNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX0ZQUkksICAgICAgInByb2Nlc3NfZGlzcGxheV9mcHJpIn0sCisgICAge01OR19GTl9QUk9DRVNTX0RJU1BMQVlfTkVFRCwgICAgICAicHJvY2Vzc19kaXNwbGF5X25lZWQifSwKKyAgICB7TU5HX0ZOX1BST0NFU1NfRElTUExBWV9QSFlHLCAgICAgICJwcm9jZXNzX2Rpc3BsYXlfcGh5ZyJ9LAorI2lmZGVmIE1OR19JTkNMVURFX0pORworICAgIHtNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX0pIRFIsICAgICAgInByb2Nlc3NfZGlzcGxheV9qaGRyIn0sCisgICAge01OR19GTl9QUk9DRVNTX0RJU1BMQVlfSkRBVCwgICAgICAicHJvY2Vzc19kaXNwbGF5X2pkYXQifSwKKyAgICB7TU5HX0ZOX1BST0NFU1NfRElTUExBWV9KU0VQLCAgICAgICJwcm9jZXNzX2Rpc3BsYXlfanNlcCJ9LAorI2VuZGlmCisjaWZuZGVmIE1OR19OT19ERUxUQV9QTkcKKyAgICB7TU5HX0ZOX1BST0NFU1NfRElTUExBWV9ESERSLCAgICAgICJwcm9jZXNzX2Rpc3BsYXlfZGhkciJ9LAorICAgIHtNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX1BST00sICAgICAgInByb2Nlc3NfZGlzcGxheV9wcm9tIn0sCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisgICAge01OR19GTl9QUk9DRVNTX0RJU1BMQVlfSVBORywgICAgICAicHJvY2Vzc19kaXNwbGF5X2lwbmcifSwKKyNlbmRpZgorICAgIHtNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX1BQTFQsICAgICAgInByb2Nlc3NfZGlzcGxheV9wcGx0In0sCisgICAge01OR19GTl9QUk9DRVNTX0RJU1BMQVlfSUpORywgICAgICAicHJvY2Vzc19kaXNwbGF5X2lqbmcifSwKKyAgICB7TU5HX0ZOX1BST0NFU1NfRElTUExBWV9EUk9QLCAgICAgICJwcm9jZXNzX2Rpc3BsYXlfZHJvcCJ9LAorICAgIHtNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX0RCWUssICAgICAgInByb2Nlc3NfZGlzcGxheV9kYnlrIn0sCisgICAge01OR19GTl9QUk9DRVNTX0RJU1BMQVlfT1JEUiwgICAgICAicHJvY2Vzc19kaXNwbGF5X29yZHIifSwKKyNlbmRpZgorICAgIHtNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX01BR04sICAgICAgInByb2Nlc3NfZGlzcGxheV9tYWduIn0sCisgICAge01OR19GTl9QUk9DRVNTX0RJU1BMQVlfSkRBQSwgICAgICAicHJvY2Vzc19kaXNwbGF5X2pkYWEifSwKKworICAgIHtNTkdfRk5fSlBFR19JTklUSUFMSVpFLCAgICAgICAgICAgImpwZWdfaW5pdGlhbGl6ZSJ9LAorICAgIHtNTkdfRk5fSlBFR19DTEVBTlVQLCAgICAgICAgICAgICAgImpwZWdfY2xlYW51cCJ9LAorICAgIHtNTkdfRk5fSlBFR19ERUNPTVBSRVNTSU5JVCwgICAgICAgImpwZWdfZGVjb21wcmVzc2luaXQifSwKKyAgICB7TU5HX0ZOX0pQRUdfREVDT01QUkVTU0RBVEEsICAgICAgICJqcGVnX2RlY29tcHJlc3NkYXRhIn0sCisgICAge01OR19GTl9KUEVHX0RFQ09NUFJFU1NGUkVFLCAgICAgICAianBlZ19kZWNvbXByZXNzZnJlZSJ9LAorCisgICAge01OR19GTl9TVE9SRV9KUEVHX0c4LCAgICAgICAgICAgICAic3RvcmVfanBlZ19nOCJ9LAorICAgIHtNTkdfRk5fU1RPUkVfSlBFR19SR0I4LCAgICAgICAgICAgInN0b3JlX2pwZWdfcmdiOCJ9LAorICAgIHtNTkdfRk5fU1RPUkVfSlBFR19HMTIsICAgICAgICAgICAgInN0b3JlX2pwZWdfZzEyIn0sCisgICAge01OR19GTl9TVE9SRV9KUEVHX1JHQjEyLCAgICAgICAgICAic3RvcmVfanBlZ19yZ2IxMiJ9LAorICAgIHtNTkdfRk5fU1RPUkVfSlBFR19HQTgsICAgICAgICAgICAgInN0b3JlX2pwZWdfZ2E4In0sCisgICAge01OR19GTl9TVE9SRV9KUEVHX1JHQkE4LCAgICAgICAgICAic3RvcmVfanBlZ19yZ2JhOCJ9LAorICAgIHtNTkdfRk5fU1RPUkVfSlBFR19HQTEyLCAgICAgICAgICAgInN0b3JlX2pwZWdfZ2ExMiJ9LAorICAgIHtNTkdfRk5fU1RPUkVfSlBFR19SR0JBMTIsICAgICAgICAgInN0b3JlX2pwZWdfcmdiYTEyIn0sCisgICAge01OR19GTl9TVE9SRV9KUEVHX0c4X0FMUEhBLCAgICAgICAic3RvcmVfanBlZ19nOF9hbHBoYSJ9LAorICAgIHtNTkdfRk5fU1RPUkVfSlBFR19SR0I4X0FMUEhBLCAgICAgInN0b3JlX2pwZWdfcmdiOF9hbHBoYSJ9LAorCisgICAge01OR19GTl9JTklUX0pQRUdfQTFfTkksICAgICAgICAgICAiaW5pdF9qcGVnX2ExX25pIn0sCisgICAge01OR19GTl9JTklUX0pQRUdfQTJfTkksICAgICAgICAgICAiaW5pdF9qcGVnX2EyX25pIn0sCisgICAge01OR19GTl9JTklUX0pQRUdfQTRfTkksICAgICAgICAgICAiaW5pdF9qcGVnX2E0X25pIn0sCisgICAge01OR19GTl9JTklUX0pQRUdfQThfTkksICAgICAgICAgICAiaW5pdF9qcGVnX2E4X25pIn0sCisgICAge01OR19GTl9JTklUX0pQRUdfQTE2X05JLCAgICAgICAgICAiaW5pdF9qcGVnX2ExNl9uaSJ9LAorCisgICAge01OR19GTl9TVE9SRV9KUEVHX0c4X0ExLCAgICAgICAgICAic3RvcmVfanBlZ19nOF9hMSJ9LAorICAgIHtNTkdfRk5fU1RPUkVfSlBFR19HOF9BMiwgICAgICAgICAgInN0b3JlX2pwZWdfZzhfYTIifSwKKyAgICB7TU5HX0ZOX1NUT1JFX0pQRUdfRzhfQTQsICAgICAgICAgICJzdG9yZV9qcGVnX2c4X2E0In0sCisgICAge01OR19GTl9TVE9SRV9KUEVHX0c4X0E4LCAgICAgICAgICAic3RvcmVfanBlZ19nOF9hOCJ9LAorICAgIHtNTkdfRk5fU1RPUkVfSlBFR19HOF9BMTYsICAgICAgICAgInN0b3JlX2pwZWdfZzhfYTE2In0sCisKKyAgICB7TU5HX0ZOX1NUT1JFX0pQRUdfUkdCOF9BMSwgICAgICAgICJzdG9yZV9qcGVnX3JnYjhfYTEifSwKKyAgICB7TU5HX0ZOX1NUT1JFX0pQRUdfUkdCOF9BMiwgICAgICAgICJzdG9yZV9qcGVnX3JnYjhfYTIifSwKKyAgICB7TU5HX0ZOX1NUT1JFX0pQRUdfUkdCOF9BNCwgICAgICAgICJzdG9yZV9qcGVnX3JnYjhfYTQifSwKKyAgICB7TU5HX0ZOX1NUT1JFX0pQRUdfUkdCOF9BOCwgICAgICAgICJzdG9yZV9qcGVnX3JnYjhfYTgifSwKKyAgICB7TU5HX0ZOX1NUT1JFX0pQRUdfUkdCOF9BMTYsICAgICAgICJzdG9yZV9qcGVnX3JnYjhfYTE2In0sCisKKyAgICB7TU5HX0ZOX1NUT1JFX0pQRUdfRzEyX0ExLCAgICAgICAgICJzdG9yZV9qcGVnX2cxMl9hMSJ9LAorICAgIHtNTkdfRk5fU1RPUkVfSlBFR19HMTJfQTIsICAgICAgICAgInN0b3JlX2pwZWdfZzEyX2EyIn0sCisgICAge01OR19GTl9TVE9SRV9KUEVHX0cxMl9BNCwgICAgICAgICAic3RvcmVfanBlZ19nMTJfYTQifSwKKyAgICB7TU5HX0ZOX1NUT1JFX0pQRUdfRzEyX0E4LCAgICAgICAgICJzdG9yZV9qcGVnX2cxMl9hOCJ9LAorICAgIHtNTkdfRk5fU1RPUkVfSlBFR19HMTJfQTE2LCAgICAgICAgInN0b3JlX2pwZWdfZzEyX2ExNiJ9LAorCisgICAge01OR19GTl9TVE9SRV9KUEVHX1JHQjEyX0ExLCAgICAgICAic3RvcmVfanBlZ19yZ2IxMl9hMSJ9LAorICAgIHtNTkdfRk5fU1RPUkVfSlBFR19SR0IxMl9BMiwgICAgICAgInN0b3JlX2pwZWdfcmdiMTJfYTIifSwKKyAgICB7TU5HX0ZOX1NUT1JFX0pQRUdfUkdCMTJfQTQsICAgICAgICJzdG9yZV9qcGVnX3JnYjEyX2E0In0sCisgICAge01OR19GTl9TVE9SRV9KUEVHX1JHQjEyX0E4LCAgICAgICAic3RvcmVfanBlZ19yZ2IxMl9hOCJ9LAorICAgIHtNTkdfRk5fU1RPUkVfSlBFR19SR0IxMl9BMTYsICAgICAgInN0b3JlX2pwZWdfcmdiMTJfYTE2In0sCisKKyAgICB7TU5HX0ZOX05FWFRfSlBFR19BTFBIQVJPVywgICAgICAgICJuZXh0X2pwZWdfYWxwaGFyb3cifSwKKyAgICB7TU5HX0ZOX05FWFRfSlBFR19ST1csICAgICAgICAgICAgICJuZXh0X2pwZWdfcm93In0sCisgICAge01OR19GTl9ESVNQTEFZX0pQRUdfUk9XUywgICAgICAgICAiZGlzcGxheV9qcGVnX3Jvd3MifSwKKworICAgIHtNTkdfRk5fTUFHTklGWV9HOF9YMSwgICAgICAgICAgICAgIm1hZ25pZnlfZzhfeDEifSwKKyAgICB7TU5HX0ZOX01BR05JRllfRzhfWDIsICAgICAgICAgICAgICJtYWduaWZ5X2c4X3gyIn0sCisgICAge01OR19GTl9NQUdOSUZZX1JHQjhfWDEsICAgICAgICAgICAibWFnbmlmeV9yZ2I4X3gxIn0sCisgICAge01OR19GTl9NQUdOSUZZX1JHQjhfWDIsICAgICAgICAgICAibWFnbmlmeV9yZ2I4X3gyIn0sCisgICAge01OR19GTl9NQUdOSUZZX0dBOF9YMSwgICAgICAgICAgICAibWFnbmlmeV9nYThfeDEifSwKKyAgICB7TU5HX0ZOX01BR05JRllfR0E4X1gyLCAgICAgICAgICAgICJtYWduaWZ5X2dhOF94MiJ9LAorICAgIHtNTkdfRk5fTUFHTklGWV9HQThfWDMsICAgICAgICAgICAgIm1hZ25pZnlfZ2E4X3gzIn0sCisgICAge01OR19GTl9NQUdOSUZZX0dBOF9YNCwgICAgICAgICAgICAibWFnbmlmeV9nYThfeDQifSwKKyAgICB7TU5HX0ZOX01BR05JRllfUkdCQThfWDEsICAgICAgICAgICJtYWduaWZ5X3JnYmE4X3gxIn0sCisgICAge01OR19GTl9NQUdOSUZZX1JHQkE4X1gyLCAgICAgICAgICAibWFnbmlmeV9yZ2JhOF94MiJ9LAorICAgIHtNTkdfRk5fTUFHTklGWV9SR0JBOF9YMywgICAgICAgICAgIm1hZ25pZnlfcmdiYThfeDMifSwKKyAgICB7TU5HX0ZOX01BR05JRllfUkdCQThfWDQsICAgICAgICAgICJtYWduaWZ5X3JnYmE4X3g0In0sCisgICAge01OR19GTl9NQUdOSUZZX0c4X1gzLCAgICAgICAgICAgICAibWFnbmlmeV9nOF94MyJ9LAorICAgIHtNTkdfRk5fTUFHTklGWV9SR0I4X1gzLCAgICAgICAgICAgIm1hZ25pZnlfcmdiOF94MyJ9LAorICAgIHtNTkdfRk5fTUFHTklGWV9HQThfWDUsICAgICAgICAgICAgIm1hZ25pZnlfZ2E4X3g1In0sCisgICAge01OR19GTl9NQUdOSUZZX1JHQkE4X1g1LCAgICAgICAgICAibWFnbmlmeV9yZ2JhOF94NSJ9LAorCisgICAge01OR19GTl9NQUdOSUZZX0c4X1kxLCAgICAgICAgICAgICAibWFnbmlmeV9nOF95MSJ9LAorICAgIHtNTkdfRk5fTUFHTklGWV9HOF9ZMiwgICAgICAgICAgICAgIm1hZ25pZnlfZzhfeTIifSwKKyAgICB7TU5HX0ZOX01BR05JRllfUkdCOF9ZMSwgICAgICAgICAgICJtYWduaWZ5X3JnYjhfeTEifSwKKyAgICB7TU5HX0ZOX01BR05JRllfUkdCOF9ZMiwgICAgICAgICAgICJtYWduaWZ5X3JnYjhfeTIifSwKKyAgICB7TU5HX0ZOX01BR05JRllfR0E4X1kxLCAgICAgICAgICAgICJtYWduaWZ5X2dhOF95MSJ9LAorICAgIHtNTkdfRk5fTUFHTklGWV9HQThfWTIsICAgICAgICAgICAgIm1hZ25pZnlfZ2E4X3kyIn0sCisgICAge01OR19GTl9NQUdOSUZZX0dBOF9ZMywgICAgICAgICAgICAibWFnbmlmeV9nYThfeTMifSwKKyAgICB7TU5HX0ZOX01BR05JRllfR0E4X1k0LCAgICAgICAgICAgICJtYWduaWZ5X2dhOF95NCJ9LAorICAgIHtNTkdfRk5fTUFHTklGWV9SR0JBOF9ZMSwgICAgICAgICAgIm1hZ25pZnlfcmdiYThfeTEifSwKKyAgICB7TU5HX0ZOX01BR05JRllfUkdCQThfWTIsICAgICAgICAgICJtYWduaWZ5X3JnYmE4X3kyIn0sCisgICAge01OR19GTl9NQUdOSUZZX1JHQkE4X1kzLCAgICAgICAgICAibWFnbmlmeV9yZ2JhOF95MyJ9LAorICAgIHtNTkdfRk5fTUFHTklGWV9SR0JBOF9ZNCwgICAgICAgICAgIm1hZ25pZnlfcmdiYThfeTQifSwKKyAgICB7TU5HX0ZOX01BR05JRllfRzhfWTMsICAgICAgICAgICAgICJtYWduaWZ5X2c4X3kzIn0sCisgICAge01OR19GTl9NQUdOSUZZX1JHQjhfWTMsICAgICAgICAgICAibWFnbmlmeV9yZ2I4X3kzIn0sCisgICAge01OR19GTl9NQUdOSUZZX0dBOF9ZNSwgICAgICAgICAgICAibWFnbmlmeV9nYThfeTUifSwKKyAgICB7TU5HX0ZOX01BR05JRllfUkdCQThfWTUsICAgICAgICAgICJtYWduaWZ5X3JnYmE4X3k1In0sCisKKyAgICB7TU5HX0ZOX01BR05JRllfRzhfWDEsICAgICAgICAgICAgICJtYWduaWZ5X2c4X3gxIn0sCisgICAge01OR19GTl9NQUdOSUZZX0c4X1gyLCAgICAgICAgICAgICAibWFnbmlmeV9nOF94MiJ9LAorICAgIHtNTkdfRk5fTUFHTklGWV9SR0I4X1gxLCAgICAgICAgICAgIm1hZ25pZnlfcmdiOF94MSJ9LAorICAgIHtNTkdfRk5fTUFHTklGWV9SR0I4X1gyLCAgICAgICAgICAgIm1hZ25pZnlfcmdiOF94MiJ9LAorICAgIHtNTkdfRk5fTUFHTklGWV9HQThfWDEsICAgICAgICAgICAgIm1hZ25pZnlfZ2E4X3gxIn0sCisgICAge01OR19GTl9NQUdOSUZZX0dBOF9YMiwgICAgICAgICAgICAibWFnbmlmeV9nYThfeDIifSwKKyAgICB7TU5HX0ZOX01BR05JRllfR0E4X1gzLCAgICAgICAgICAgICJtYWduaWZ5X2dhOF94MyJ9LAorICAgIHtNTkdfRk5fTUFHTklGWV9HQThfWDQsICAgICAgICAgICAgIm1hZ25pZnlfZ2E4X3g0In0sCisgICAge01OR19GTl9NQUdOSUZZX1JHQkE4X1gxLCAgICAgICAgICAibWFnbmlmeV9yZ2JhOF94MSJ9LAorICAgIHtNTkdfRk5fTUFHTklGWV9SR0JBOF9YMiwgICAgICAgICAgIm1hZ25pZnlfcmdiYThfeDIifSwKKyAgICB7TU5HX0ZOX01BR05JRllfUkdCQThfWDMsICAgICAgICAgICJtYWduaWZ5X3JnYmE4X3gzIn0sCisgICAge01OR19GTl9NQUdOSUZZX1JHQkE4X1g0LCAgICAgICAgICAibWFnbmlmeV9yZ2JhOF94NCJ9LAorICAgIHtNTkdfRk5fTUFHTklGWV9HOF9YMywgICAgICAgICAgICAgIm1hZ25pZnlfZzhfeDMifSwKKyAgICB7TU5HX0ZOX01BR05JRllfUkdCOF9YMywgICAgICAgICAgICJtYWduaWZ5X3JnYjhfeDMifSwKKyAgICB7TU5HX0ZOX01BR05JRllfR0E4X1g1LCAgICAgICAgICAgICJtYWduaWZ5X2dhOF94NSJ9LAorICAgIHtNTkdfRk5fTUFHTklGWV9SR0JBOF9YNSwgICAgICAgICAgIm1hZ25pZnlfcmdiYThfeDUifSwKKworICAgIHtNTkdfRk5fTUFHTklGWV9HOF9ZMSwgICAgICAgICAgICAgIm1hZ25pZnlfZzhfeTEifSwKKyAgICB7TU5HX0ZOX01BR05JRllfRzhfWTIsICAgICAgICAgICAgICJtYWduaWZ5X2c4X3kyIn0sCisgICAge01OR19GTl9NQUdOSUZZX1JHQjhfWTEsICAgICAgICAgICAibWFnbmlmeV9yZ2I4X3kxIn0sCisgICAge01OR19GTl9NQUdOSUZZX1JHQjhfWTIsICAgICAgICAgICAibWFnbmlmeV9yZ2I4X3kyIn0sCisgICAge01OR19GTl9NQUdOSUZZX0dBOF9ZMSwgICAgICAgICAgICAibWFnbmlmeV9nYThfeTEifSwKKyAgICB7TU5HX0ZOX01BR05JRllfR0E4X1kyLCAgICAgICAgICAgICJtYWduaWZ5X2dhOF95MiJ9LAorICAgIHtNTkdfRk5fTUFHTklGWV9HQThfWTMsICAgICAgICAgICAgIm1hZ25pZnlfZ2E4X3kzIn0sCisgICAge01OR19GTl9NQUdOSUZZX0dBOF9ZNCwgICAgICAgICAgICAibWFnbmlmeV9nYThfeTQifSwKKyAgICB7TU5HX0ZOX01BR05JRllfUkdCQThfWTEsICAgICAgICAgICJtYWduaWZ5X3JnYmE4X3kxIn0sCisgICAge01OR19GTl9NQUdOSUZZX1JHQkE4X1kyLCAgICAgICAgICAibWFnbmlmeV9yZ2JhOF95MiJ9LAorICAgIHtNTkdfRk5fTUFHTklGWV9SR0JBOF9ZMywgICAgICAgICAgIm1hZ25pZnlfcmdiYThfeTMifSwKKyAgICB7TU5HX0ZOX01BR05JRllfUkdCQThfWTQsICAgICAgICAgICJtYWduaWZ5X3JnYmE4X3k0In0sCisgICAge01OR19GTl9NQUdOSUZZX0c4X1kzLCAgICAgICAgICAgICAibWFnbmlmeV9nOF95MyJ9LAorICAgIHtNTkdfRk5fTUFHTklGWV9SR0I4X1kzLCAgICAgICAgICAgIm1hZ25pZnlfcmdiOF95MyJ9LAorICAgIHtNTkdfRk5fTUFHTklGWV9HQThfWTUsICAgICAgICAgICAgIm1hZ25pZnlfZ2E4X3k1In0sCisgICAge01OR19GTl9NQUdOSUZZX1JHQkE4X1k1LCAgICAgICAgICAibWFnbmlmeV9yZ2JhOF95NSJ9LAorCisgICAge01OR19GTl9ERUxUQV9HMV9HMSwgICAgICAgICAgICAgICAiZGVsdGFfZzFfZzEifSwKKyAgICB7TU5HX0ZOX0RFTFRBX0cyX0cyLCAgICAgICAgICAgICAgICJkZWx0YV9nMl9nMiJ9LAorICAgIHtNTkdfRk5fREVMVEFfRzRfRzQsICAgICAgICAgICAgICAgImRlbHRhX2c0X2c0In0sCisgICAge01OR19GTl9ERUxUQV9HOF9HOCwgICAgICAgICAgICAgICAiZGVsdGFfZzhfZzgifSwKKyAgICB7TU5HX0ZOX0RFTFRBX0cxNl9HMTYsICAgICAgICAgICAgICJkZWx0YV9nMTZfZzE2In0sCisgICAge01OR19GTl9ERUxUQV9SR0I4X1JHQjgsICAgICAgICAgICAiZGVsdGFfcmdiOF9yZ2I4In0sCisgICAge01OR19GTl9ERUxUQV9SR0IxNl9SR0IxNiwgICAgICAgICAiZGVsdGFfcmdiMTZfcmdiMTYifSwKKyAgICB7TU5HX0ZOX0RFTFRBX0dBOF9HQTgsICAgICAgICAgICAgICJkZWx0YV9nYThfZ2E4In0sCisgICAge01OR19GTl9ERUxUQV9HQThfRzgsICAgICAgICAgICAgICAiZGVsdGFfZ2E4X2c4In0sCisgICAge01OR19GTl9ERUxUQV9HQThfQTgsICAgICAgICAgICAgICAiZGVsdGFfZ2E4X2E4In0sCisgICAge01OR19GTl9ERUxUQV9HQTE2X0dBMTYsICAgICAgICAgICAiZGVsdGFfZ2ExNl9nYTE2In0sCisgICAge01OR19GTl9ERUxUQV9HQTE2X0cxNiwgICAgICAgICAgICAiZGVsdGFfZ2ExNl9nMTYifSwKKyAgICB7TU5HX0ZOX0RFTFRBX0dBMTZfQTE2LCAgICAgICAgICAgICJkZWx0YV9nYTE2X2ExNiJ9LAorICAgIHtNTkdfRk5fREVMVEFfUkdCQThfUkdCQTgsICAgICAgICAgImRlbHRhX3JnYmE4X3JnYmE4In0sCisgICAge01OR19GTl9ERUxUQV9SR0JBOF9SR0I4LCAgICAgICAgICAiZGVsdGFfcmdiYThfcmdiOCJ9LAorICAgIHtNTkdfRk5fREVMVEFfUkdCQThfQTgsICAgICAgICAgICAgImRlbHRhX3JnYmE4X2E4In0sCisgICAge01OR19GTl9ERUxUQV9SR0JBMTZfUkdCQTE2LCAgICAgICAiZGVsdGFfcmdiYTE2X3JnYmExNiJ9LAorICAgIHtNTkdfRk5fREVMVEFfUkdCQTE2X1JHQjE2LCAgICAgICAgImRlbHRhX3JnYmExNl9yZ2IxNiJ9LAorICAgIHtNTkdfRk5fREVMVEFfUkdCQTE2X0ExNiwgICAgICAgICAgImRlbHRhX3JnYmExNl9hMTYifSwKKworICAgIHtNTkdfRk5fUFJPTU9URV9HOF9HOCwgICAgICAgICAgICAgInByb21vdGVfZzhfZzgifSwKKyAgICB7TU5HX0ZOX1BST01PVEVfRzhfRzE2LCAgICAgICAgICAgICJwcm9tb3RlX2c4X2cxNiJ9LAorICAgIHtNTkdfRk5fUFJPTU9URV9HMTZfRzE2LCAgICAgICAgICAgInByb21vdGVfZzhfZzE2In0sCisgICAge01OR19GTl9QUk9NT1RFX0c4X0dBOCwgICAgICAgICAgICAicHJvbW90ZV9nOF9nYTgifSwKKyAgICB7TU5HX0ZOX1BST01PVEVfRzhfR0ExNiwgICAgICAgICAgICJwcm9tb3RlX2c4X2dhMTYifSwKKyAgICB7TU5HX0ZOX1BST01PVEVfRzE2X0dBMTYsICAgICAgICAgICJwcm9tb3RlX2cxNl9nYTE2In0sCisgICAge01OR19GTl9QUk9NT1RFX0c4X1JHQjgsICAgICAgICAgICAicHJvbW90ZV9nOF9yZ2I4In0sCisgICAge01OR19GTl9QUk9NT1RFX0c4X1JHQjE2LCAgICAgICAgICAicHJvbW90ZV9nOF9yZ2IxNiJ9LAorICAgIHtNTkdfRk5fUFJPTU9URV9HMTZfUkdCMTYsICAgICAgICAgInByb21vdGVfZzE2X3JnYjE2In0sCisgICAge01OR19GTl9QUk9NT1RFX0c4X1JHQkE4LCAgICAgICAgICAicHJvbW90ZV9nOF9yZ2JhOCJ9LAorICAgIHtNTkdfRk5fUFJPTU9URV9HOF9SR0JBMTYsICAgICAgICAgInByb21vdGVfZzhfcmdiYTE2In0sCisgICAge01OR19GTl9QUk9NT1RFX0cxNl9SR0JBMTYsICAgICAgICAicHJvbW90ZV9nMTZfcmdiYTE2In0sCisgICAge01OR19GTl9QUk9NT1RFX0dBOF9HQTE2LCAgICAgICAgICAicHJvbW90ZV9nYThfZ2ExNiJ9LAorICAgIHtNTkdfRk5fUFJPTU9URV9HQThfUkdCQTgsICAgICAgICAgInByb21vdGVfZ2E4X3JnYmE4In0sCisgICAge01OR19GTl9QUk9NT1RFX0dBOF9SR0JBMTYsICAgICAgICAicHJvbW90ZV9nYThfcmdiYTE2In0sCisgICAge01OR19GTl9QUk9NT1RFX0dBMTZfUkdCQTE2LCAgICAgICAicHJvbW90ZV9nYTE2X3JnYmExNiJ9LAorICAgIHtNTkdfRk5fUFJPTU9URV9SR0I4X1JHQjE2LCAgICAgICAgInByb21vdGVfcmdiOF9yZ2IxNiJ9LAorICAgIHtNTkdfRk5fUFJPTU9URV9SR0I4X1JHQkE4LCAgICAgICAgInByb21vdGVfcmdiOF9yZ2JhOCJ9LAorICAgIHtNTkdfRk5fUFJPTU9URV9SR0I4X1JHQkExNiwgICAgICAgInByb21vdGVfcmdiOF9yZ2JhMTYifSwKKyAgICB7TU5HX0ZOX1BST01PVEVfUkdCMTZfUkdCQTE2LCAgICAgICJwcm9tb3RlX3JnYjE2X3JnYmExNiJ9LAorICAgIHtNTkdfRk5fUFJPTU9URV9SR0JBOF9SR0JBMTYsICAgICAgInByb21vdGVfcmdiYThfcmdiYTE2In0sCisgICAge01OR19GTl9QUk9NT1RFX0lEWDhfUkdCOCwgICAgICAgICAicHJvbW90ZV9pZHg4X3JnYjgifSwKKyAgICB7TU5HX0ZOX1BST01PVEVfSURYOF9SR0IxNiwgICAgICAgICJwcm9tb3RlX2lkeDhfcmdiMTYifSwKKyAgICB7TU5HX0ZOX1BST01PVEVfSURYOF9SR0JBOCwgICAgICAgICJwcm9tb3RlX2lkeDhfcmdiYTgifSwKKyAgICB7TU5HX0ZOX1BST01PVEVfSURYOF9SR0JBMTYsICAgICAgICJwcm9tb3RlX2lkeDhfcmdiYTE2In0sCisKKyAgICB7TU5HX0ZOX1NDQUxFX0cxX0cyLCAgICAgICAgICAgICAgICJzY2FsZV9nMV9nMiJ9LAorICAgIHtNTkdfRk5fU0NBTEVfRzFfRzQsICAgICAgICAgICAgICAgInNjYWxlX2cxX2c0In0sCisgICAge01OR19GTl9TQ0FMRV9HMV9HOCwgICAgICAgICAgICAgICAic2NhbGVfZzFfZzgifSwKKyAgICB7TU5HX0ZOX1NDQUxFX0cxX0cxNiwgICAgICAgICAgICAgICJzY2FsZV9nMV9nMTYifSwKKyAgICB7TU5HX0ZOX1NDQUxFX0cyX0c0LCAgICAgICAgICAgICAgICJzY2FsZV9nMl9nNCJ9LAorICAgIHtNTkdfRk5fU0NBTEVfRzJfRzgsICAgICAgICAgICAgICAgInNjYWxlX2cyX2c4In0sCisgICAge01OR19GTl9TQ0FMRV9HMl9HMTYsICAgICAgICAgICAgICAic2NhbGVfZzJfZzE2In0sCisgICAge01OR19GTl9TQ0FMRV9HNF9HOCwgICAgICAgICAgICAgICAic2NhbGVfZzRfZzgifSwKKyAgICB7TU5HX0ZOX1NDQUxFX0c0X0cxNiwgICAgICAgICAgICAgICJzY2FsZV9nNF9nMTYifSwKKyAgICB7TU5HX0ZOX1NDQUxFX0c4X0cxNiwgICAgICAgICAgICAgICJzY2FsZV9nOF9nMTYifSwKKyAgICB7TU5HX0ZOX1NDQUxFX0dBOF9HQTE2LCAgICAgICAgICAgICJzY2FsZV9nYThfZ2ExNiJ9LAorICAgIHtNTkdfRk5fU0NBTEVfUkdCOF9SR0IxNiwgICAgICAgICAgInNjYWxlX3JnYjhfcmdiMTYifSwKKyAgICB7TU5HX0ZOX1NDQUxFX1JHQkE4X1JHQkExNiwgICAgICAgICJzY2FsZV9yZ2JhOF9yZ2JhMTYifSwKKworICAgIHtNTkdfRk5fU0NBTEVfRzJfRzEsICAgICAgICAgICAgICAgInNjYWxlX2cyX2cxIn0sCisgICAge01OR19GTl9TQ0FMRV9HNF9HMSwgICAgICAgICAgICAgICAic2NhbGVfZzRfZzEifSwKKyAgICB7TU5HX0ZOX1NDQUxFX0c4X0cxLCAgICAgICAgICAgICAgICJzY2FsZV9nOF9nMSJ9LAorICAgIHtNTkdfRk5fU0NBTEVfRzE2X0cxLCAgICAgICAgICAgICAgInNjYWxlX2cxNl9nMSJ9LAorICAgIHtNTkdfRk5fU0NBTEVfRzRfRzIsICAgICAgICAgICAgICAgInNjYWxlX2c0X2cyIn0sCisgICAge01OR19GTl9TQ0FMRV9HOF9HMiwgICAgICAgICAgICAgICAic2NhbGVfZzhfZzIifSwKKyAgICB7TU5HX0ZOX1NDQUxFX0cxNl9HMiwgICAgICAgICAgICAgICJzY2FsZV9nMTZfZzIifSwKKyAgICB7TU5HX0ZOX1NDQUxFX0c4X0c0LCAgICAgICAgICAgICAgICJzY2FsZV9nOF9nNCJ9LAorICAgIHtNTkdfRk5fU0NBTEVfRzE2X0c0LCAgICAgICAgICAgICAgInNjYWxlX2cxNl9nNCJ9LAorICAgIHtNTkdfRk5fU0NBTEVfRzE2X0c4LCAgICAgICAgICAgICAgInNjYWxlX2cxNl9nOCJ9LAorICAgIHtNTkdfRk5fU0NBTEVfR0ExNl9HQTgsICAgICAgICAgICAgInNjYWxlX2dhMTZfZ2E4In0sCisgICAge01OR19GTl9TQ0FMRV9SR0IxNl9SR0I4LCAgICAgICAgICAic2NhbGVfcmdiMTZfcmdiOCJ9LAorICAgIHtNTkdfRk5fU0NBTEVfUkdCQTE2X1JHQkE4LCAgICAgICAgInNjYWxlX3JnYmExNl9yZ2JhOCJ9LAorCisgICAge01OR19GTl9DT01QT1NFT1ZFUl9SR0JBOCwgICAgICAgICAiY29tcG9zZW92ZXJfcmdiYTgifSwKKyAgICB7TU5HX0ZOX0NPTVBPU0VPVkVSX1JHQkExNiwgICAgICAgICJjb21wb3Nlb3Zlcl9yZ2JhMTYifSwKKyAgICB7TU5HX0ZOX0NPTVBPU0VVTkRFUl9SR0JBOCwgICAgICAgICJjb21wb3NldW5kZXJfcmdiYTgifSwKKyAgICB7TU5HX0ZOX0NPTVBPU0VVTkRFUl9SR0JBMTYsICAgICAgICJjb21wb3NldW5kZXJfcmdiYTE2In0sCisKKyAgICB7TU5HX0ZOX0ZMSVBfUkdCQTgsICAgICAgICAgICAgICAgICJmbGlwX3JnYmE4In0sCisgICAge01OR19GTl9GTElQX1JHQkExNiwgICAgICAgICAgICAgICAiZmxpcF9yZ2JhMTYifSwKKyAgICB7TU5HX0ZOX1RJTEVfUkdCQTgsICAgICAgICAgICAgICAgICJ0aWxlX3JnYmE4In0sCisgICAge01OR19GTl9USUxFX1JHQkExNiwgICAgICAgICAgICAgICAidGlsZV9yZ2JhMTYifQorCisgIH07CisjZW5kaWYgLyogTU5HX0lOQ0xVREVfVFJBQ0VfU1RJTkdTICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ190cmFjZSAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpRnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaUxvY2F0aW9uKQoreworICBtbmdfcGNoYXIgek5hbWUgPSAwOyAgICAgICAgICAgICAgICAgLyogYnVmZmVycHRyIGZvciB0cmFjZXN0cmluZyAqLworCisgIGlmICgocERhdGEgPT0gMCkgfHwgKHBEYXRhLT5pTWFnaWMgIT0gTU5HX01BR0lDKSkKKyAgICByZXR1cm4gTU5HX0lOVkFMSURIQU5ETEU7ICAgICAgICAgIC8qIG5vIGdvb2QgaWYgdGhlIGhhbmRsZSBpcyBjb3JydXB0ICovCisKKyAgaWYgKHBEYXRhLT5mVHJhY2Vwcm9jKSAgICAgICAgICAgICAgIC8qIHJlcG9ydCBiYWNrIHRvIHVzZXIgPyAqLworICB7CisjaWZkZWYgTU5HX0lOQ0xVREVfVFJBQ0VfU1RSSU5HUworICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYmluYXJ5IHNlYXJjaCB2YXJpYWJsZXMgKi8KKyAgICAgIG1uZ19pbnQzMiAgICAgICAgaVRvcCwgaUxvd2VyLCBpVXBwZXIsIGlNaWRkbGU7CisgICAgICBtbmdfdHJhY2VfZW50cnlwIHBFbnRyeTsgICAgICAgICAvKiBwb2ludGVyIHRvIGZvdW5kIGVudHJ5ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZXRlcm1pbmUgbWF4IGluZGV4IG9mIHRhYmxlICovCisgICAgICBpVG9wID0gKHNpemVvZiAodHJhY2VfdGFibGUpIC8gc2l6ZW9mICh0cmFjZV90YWJsZSBbMF0pKSAtIDE7CisKKyAgICAgIGlMb3dlciAgPSAwOyAgICAgICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpemUgYmluYXJ5IHNlYXJjaCAqLworICAgICAgaU1pZGRsZSA9IGlUb3AgPj4gMTsgICAgICAgICAgICAgLyogc3RhcnQgaW4gdGhlIG1pZGRsZSAqLworICAgICAgaVVwcGVyICA9IGlUb3A7CisgICAgICBwRW50cnkgID0gMDsgICAgICAgICAgICAgICAgICAgICAvKiBubyBnb29kcyB5ZXQhICovCisKKyAgICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZSBiaW5hcnkgc2VhcmNoIGl0c2VsZiAqLworICAgICAgICB7CisgICAgICAgICAgaWYgKHRyYWNlX3RhYmxlIFtpTWlkZGxlXS5pRnVuY3Rpb24gPCBpRnVuY3Rpb24pCisgICAgICAgICAgICBpTG93ZXIgPSBpTWlkZGxlICsgMTsKKyAgICAgICAgICBlbHNlIGlmICh0cmFjZV90YWJsZSBbaU1pZGRsZV0uaUZ1bmN0aW9uID4gaUZ1bmN0aW9uKQorICAgICAgICAgICAgaVVwcGVyID0gaU1pZGRsZSAtIDE7CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHBFbnRyeSA9ICZ0cmFjZV90YWJsZSBbaU1pZGRsZV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9OworCisgICAgICAgICAgaU1pZGRsZSA9IChpTG93ZXIgKyBpVXBwZXIpID4+IDE7CisgICAgICAgIH0KKyAgICAgIHdoaWxlIChpTG93ZXIgPD0gaVVwcGVyKTsKKworICAgICAgaWYgKHBFbnRyeSkgICAgICAgICAgICAgICAgICAgICAgLyogZm91bmQgaXQgPyAqLworICAgICAgICB6TmFtZSA9IHBFbnRyeS0+elRyYWNldGV4dDsKKworICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb2tlLCBub3cgdGVsbCAqLworICAgIGlmICghcERhdGEtPmZUcmFjZXByb2MgKCgobW5nX2hhbmRsZSlwRGF0YSksIGlGdW5jdGlvbiwgaUxvY2F0aW9uLCB6TmFtZSkpCisgICAgICByZXR1cm4gTU5HX0FQUFRSQUNFQUJPUlQ7CisKKyAgfQorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2VuZGlmIC8qIE1OR19JTkNMVURFX1RSQUNFX1BST0NTICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqIGVuZCBvZiBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKwpkaWZmIC0tZ2l0IGEvZmlsZXMvU291cmNlL0xpYk1ORy9saWJtbmdfdHJhY2UuaCBiL2ZpbGVzL1NvdXJjZS9MaWJNTkcvbGlibW5nX3RyYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM3NDlkOQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9MaWJNTkcvbGlibW5nX3RyYWNlLmgKQEAgLTAsMCArMSwxNDc0IEBACisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gbGlibW5nLmggICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogcHJvamVjdCAgIDogbGlibW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGZpbGUgICAgICA6IGxpYm1uZ190cmFjZS5oICAgICAgICAgICAgY29weXJpZ2h0IChjKSAyMDAwLTIwMDcgRy5KdXluICAgKiAqLworLyogKiB2ZXJzaW9uICAgOiAxLjAuMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIHB1cnBvc2UgICA6IFRyYWNlIGZ1bmN0aW9ucyAoZGVmaW5pdGlvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogYXV0aG9yICAgIDogRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBjb21tZW50ICAgOiBEZWZpbml0aW9uIG9mIHRoZSB0cmFjZSBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGNoYW5nZXMgICA6IDAuNS4xIC0gMDUvMDgvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGNodW5rLWFjY2VzcyBmdW5jdGlvbiB0cmFjZS1jb2RlcyAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjaGFuZ2VkIHN0cmljdC1BTlNJIHN0dWZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4xIC0gMDUvMTIvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNoYW5nZWQgdHJhY2UgdG8gbWFjcm8gZm9yIGNhbGxiYWNrIGVycm9yLXJlcG9ydGluZyAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjEgLSAwNS8xMy8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgc2F2ZV9zdGF0ZSAmIHJlc3RvcmVfc3RhdGUgdHJhY2UtY29kZXMgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMSAtIDA1LzE1LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBnZXRpbWdkYXRhICYgcHV0aW1nZGF0YSB0cmFjZS1jb2RlcyAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMiAtIDA1LzIwLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBKTkcgdHJhY2Vjb2RlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4yIC0gMDUvMjMvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHRyYWNlLXRhYmxlIGVudHJ5IGRlZmluaXRpb24gICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjIgLSAwNS8yNC8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgdHJhY2Vjb2RlcyBmb3IgZ2xvYmFsIGFuaW1hdGlvbiBjb2xvci1jaHVua3MgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHRyYWNlY29kZXMgZm9yIGdldC9zZXQgb2YgZGVmYXVsdCBaTElCL0lKRyBwYXJtcyAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCB0cmFjZWNvZGVzIGZvciBnbG9iYWwgUExURSx0Uk5TLGJLR0QgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4yIC0gMDUvMzAvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHRyYWNlY29kZXMgZm9yIGltYWdlLW9iamVjdCBwcm9tb3Rpb24gICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCB0cmFjZWNvZGVzIGZvciBkZWx0YS1pbWFnZSBwcm9jZXNzaW5nICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4yIC0gMDYvMDIvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHRyYWNlY29kZXMgZm9yIGdldGFscGhhbGluZSBjYWxsYmFjayAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjIgLSAwNi8wNS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgdHJhY2Vjb2RlIGZvciBSR0I4X0E4IGNhbnZhc3N0eWxlICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMiAtIDA2LzA2LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCB0cmFjZWNvZGUgZm9yIG1uZ19yZWFkX3Jlc3VtZSBITEFQSSBmdW5jdGlvbiAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMyAtIDA2LzA2LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCB0cmFjZWNvZGVzIGZvciB0cmFjaW5nIEpQRUcgcHJvZ3Jlc3Npb24gICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4zIC0gMDYvMjEvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHRyYWNlY29kZXMgZm9yIGdldC9zZXQgc3BlZWR0eXBlICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCB0cmFjZWNvZGVzIGZvciBnZXQgaW1hZ2VsZXZlbCAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4zIC0gMDYvMjIvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHRyYWNlY29kZSBmb3IgZGVsdGEtaW1hZ2UgcHJvY2Vzc2luZyAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCB0cmFjZWNvZGVzIGZvciBQUExUIGNodW5rIHByb2Nlc3NpbmcgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMSAtIDA3LzA3LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCB0cmFjZWNvZGVzIGZvciBzcGVjaWFsIGRpc3BsYXkgcHJvY2Vzc2luZyAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4xIC0gMDcvMDgvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHRyYWNlY29kZSBmb3IgZ2V0L3NldCBzdXNwZW5zaW9ubW9kZSAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCB0cmFjZWNvZGVzIGZvciBnZXQvc2V0IGRpc3BsYXkgdmFyaWFibGVzICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgdHJhY2Vjb2RlIGZvciByZWFkX2RhdGFidWZmZXIgKEkvTy1zdXNwZW5zaW9uKSAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMSAtIDA3LzE1LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCB0cmFjZWNvZGVzIGZvciBTQVZFL1NFRUsgY2FsbGJhY2tzICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgdHJhY2Vjb2RlcyBmb3IgZ2V0L3NldCBzZWN0aW9uYnJlYWtzICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHRyYWNlY29kZSBmb3Igc3BlY2lhbCBlcnJvciByb3V0aW5lICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjEgLSAwNy8xOS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgdHJhY2Vjb2RlIGZvciB1cGRhdGVtbmdoZWFkZXIgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjIgLSAwNy8zMS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgdHJhY2Vjb2RlcyBmb3Igc3RhdHVzX3h4eHh4IGZ1bmN0aW9ucyAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMiAtIDA4LzA1LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjaGFuZ2VkIGZpbGUtcHJlZml4ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgdHJhY2Vjb2RlIGZvciB1cGRhdGVtbmdzaW1wbGljaXR5ICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjMgLSAwOC8yNi8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgTUFHTiBjaHVuayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMyAtIDA5LzA3LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBzdXBwb3J0IGZvciBuZXcgZmlsdGVyX3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4zIC0gMTAvMTAvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHN1cHBvcnQgZm9yIGFscGhhLWRlcHRoIHByZWRpY3Rpb24gICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjMgLSAxMC8xMS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgSkRBQSBjaHVuayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHN1cHBvcnQgZm9yIG5FRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjMgLSAxMC8xNi8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgZnVuY3Rpb25zIHRvIHJldHJpZXZlIFBORy9KTkcgc3BlY2lmaWMgaGVhZGVyLWluZm8gKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIG9wdGlvbmFsIHN1cHBvcnQgZm9yIGJLR0QgZm9yIFBORyBpbWFnZXMgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjMgLSAxMC8xNy8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgY2FsbGJhY2sgdG8gcHJvY2VzcyBub24tY3JpdGljYWwgdW5rbm93biBjaHVua3MgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHJvdXRpbmUgdG8gZGlzY2FyZCAiaW52YWxpZCIgb2JqZWN0cyAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjMgLSAxMC8xOS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gaW1wbGVtZW50ZWQgZGVsYXllZCBkZWx0YS1wcm9jZXNzaW5nICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMyAtIDEwLzIwLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBnZXQvc2V0IGZvciBiS0dEIHByZWZlcmVuY2Ugc2V0dGluZyAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4zIC0gMTAvMjEvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGdldCBmdW5jdGlvbiBmb3IgaW50ZXJsYWNlL3Byb2dyZXNzaXZlIGRpc3BsYXkgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS40IC0gIDEvMTgvMjAwMSAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkICJuZXciIE1BR04gbWV0aG9kcyAzLCA0ICYgNSAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC4xIC0gMDIvMDgvMjAwMSAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIE1FTkQgcHJvY2Vzc2luZyBjYWxsYmFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjEgLSAwNC8yMS8yMDAxIC0gRy5KdXluIChjb2RlIGJ5IEcuS2VsbHkpICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgQkdSQTggY2FudmFzIHdpdGggcHJlbXVsdGlwbGllZCBhbHBoYSAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuMSAtIDA1LzAyLzIwMDEgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCAiZGVmYXVsdCIgc1JHQiBnZW5lcmF0aW9uIChUaGFua3MgTWFydGkhKSAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuMiAtIDA2LzIzLzIwMDEgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBvcHRpbWl6YXRpb24gb3B0aW9uIGZvciBNTkctdmlkZW8gcGxheWJhY2sgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgcHJvY2Vzc3Rlcm0gY2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuMiAtIDA2LzI1LzIwMDEgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBvcHRpb24gdG8gdHVybiBvZmYgcHJvZ3Jlc3NpdmUgcmVmcmVzaCAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuMyAtIDA4LzA2LzIwMDEgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBnZXQgZnVuY3Rpb24gZm9yIGxhc3QgcHJvY2Vzc2VkIEJBQ0sgY2h1bmsgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDA4LzE1LzIwMDIgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjb21wbGV0ZWQgUFJPTSBzdXBwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY29tcGxldGVkIGRlbHRhLWltYWdlIHN1cHBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDA4LzE5LzIwMDIgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBCNTk3MTM0IC0gbGlibW5nIHBvbGx1dGVzIHRoZSBsaW5rZXIgbmFtZXNwYWNlICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgSExBUEkgZnVuY3Rpb24gdG8gY29weSBjaHVua3MgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDA5LzE0LzIwMDIgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBldmVudCBoYW5kbGluZyBmb3IgZHluYW1pYyBNTkcgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC41IC0gMDkvMjAvMjAwMiAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHN1cHBvcnQgZm9yIFBBU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAwOS8yMi8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgYmdyeDggY2FudmFzIChmaWxsZXIgYnl0ZSkgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDA5LzIzLzIwMDIgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBpbi1tZW1vcnkgY29sb3ItY29ycmVjdGlvbiBvZiBhYnN0cmFjdCBpbWFnZXMgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgY29tcG9zZSBvdmVyL3VuZGVyIHJvdXRpbmVzIGZvciBQQVNUIHByb2Nlc3NpbmcgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGZsaXAgJiB0aWxlIHJvdXRpbmVzIGZvciBQQVNUIHByb2Nlc3NpbmcgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAxMC8wOS8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgdHJhY2UtY29uc3RhbnRzIGZvciBQQVNUIGNodW5rICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDExLzA3LzIwMDIgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBzdXBwb3J0IHRvIGdldCB0b3RhbHMgYWZ0ZXIgbW5nX3JlYWQoKSAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNiAtIDA3LzE0LzIwMDMgLSBHLlJhbmRlcnMtUGVocnNvbiAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBjb25kaXRpb25hbHMgYXJvdW5kIHJhcmVseSB1c2VkIGZlYXR1cmVzICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNyAtIDExLzI3LzIwMDMgLSBSLkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBDQU5WQVNfUkdCNTY1IGFuZCBDQU5WQVNfQkdSNTY1ICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC43IC0gMDEvMjUvMjAwNCAtIEouUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHByZW11bHRpcGxpZWQgYWxwaGEgY2FudmFzJyBmb3IgUkdCQSwgQVJHQiwgQUJHUiAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjcgLSAwMy8xMC8yMDA0IC0gRy5SLVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgY29uZGl0aW9uYWxzIGFyb3VuZCBvcGVuc3RyZWFtL2Nsb3Nlc3RyZWFtICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjggLSAwNC8wMi8yMDA0IC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgQ1JDIGV4aXN0ZW5jZSAmIGNoZWNraW5nIGZsYWdzICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuOCAtIDA0LzExLzIwMDQgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBkYXRhLXB1c2ggbWVjaGFuaXNtcyBmb3Igc3BlY2lhbGl6ZWQgZGVjb2RlcnMgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuOSAtIDEwLzAzLzIwMDQgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBmdW5jdGlvbiB0byByZXRyaWV2ZSBjdXJyZW50IEZSQU0gZGVsYXkgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC45IC0gMTAvMTQvMjAwNCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGJncjU2NV9hOCBjYW52YXMtc3R5bGUgKHRoYW5rcyB0byBKLiBFbHZhbmRlcikgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC4xMCAtIDA0LzA4LzIwMDcgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHN1cHBvcnQgZm9yIG1QTkcgcHJvcG9zYWwgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjEwIC0gMDcvMDYvMjAwNyAtIEcuUi1QIGJ1Z2ZpeCBieSBMdWNhcyBRdWludGFuYSAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmIGRlZmluZWQoX19CT1JMQU5EQ19fKSAmJiBkZWZpbmVkKE1OR19TVFJJQ1RfQU5TSSkKKyNwcmFnbWEgb3B0aW9uIC1BICAgICAgICAgICAgICAgICAgICAgIC8qIGZvcmNlIEFOU0ktQyAqLworI2VuZGlmCisKKyNpZm5kZWYgX2xpYm1uZ190cmFjZV9oXworI2RlZmluZSBfbGlibW5nX3RyYWNlX2hfCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfSU5DTFVERV9UUkFDRV9QUk9DUworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisvKiBUT0RPOiBhZGQgYSB0cmFjZS1tYXNrIHNvIGNlcnRhaW4gZnVuY3Rpb25zIGNhbiBiZSBleGNsdWRlZCAqLworCittbmdfcmV0Y29kZSBtbmdfdHJhY2UgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaUZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlMb2NhdGlvbik7CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNkZWZpbmUgTU5HX1RSQUNFKEQsRixMKSAgeyBtbmdfcmV0Y29kZSBpUiA9IG1uZ190cmFjZSAoRCxGLEwpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlSKSByZXR1cm4gaVI7IH0KKworI2RlZmluZSBNTkdfVFJBQ0VCKEQsRixMKSB7IGlmIChtbmdfdHJhY2UgKEQsRixMKSkgcmV0dXJuIE1OR19GQUxTRTsgfQorCisjZGVmaW5lIE1OR19UUkFDRVgoRCxGLEwpIHsgaWYgKG1uZ190cmFjZSAoRCxGLEwpKSByZXR1cm4gMDsgfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjZGVmaW5lIE1OR19MQ19TVEFSVCAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBNTkdfTENfRU5EICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTU5HX0xDX0lOSVRJQUxJWkUgICAgICAgICAgICAgICAzCisjZGVmaW5lIE1OR19MQ19DTEVBTlVQICAgICAgICAgICAgICAgICAgNAorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjZGVmaW5lIE1OR19MQ19KUEVHX0NSRUFURV9ERUNPTVBSRVNTICAgMTAxCisjZGVmaW5lIE1OR19MQ19KUEVHX1JFQURfSEVBREVSICAgICAgICAgMTAyCisjZGVmaW5lIE1OR19MQ19KUEVHX1NUQVJUX0RFQ09NUFJFU1MgICAgMTAzCisjZGVmaW5lIE1OR19MQ19KUEVHX1NUQVJUX09VVFBVVCAgICAgICAgMTA0CisjZGVmaW5lIE1OR19MQ19KUEVHX1JFQURfU0NBTkxJTkVTICAgICAgMTA1CisjZGVmaW5lIE1OR19MQ19KUEVHX0ZJTklTSF9PVVRQVVQgICAgICAgMTA2CisjZGVmaW5lIE1OR19MQ19KUEVHX0ZJTklTSF9ERUNPTVBSRVNTICAgMTA3CisjZGVmaW5lIE1OR19MQ19KUEVHX0RFU1RST1lfREVDT01QUkVTUyAgMTA4CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNkZWZpbmUgTU5HX0ZOX0lOSVRJQUxJWkUgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1OR19GTl9SRVNFVCAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBNTkdfRk5fQ0xFQU5VUCAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgTU5HX0ZOX1JFQUQgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIE1OR19GTl9XUklURSAgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBNTkdfRk5fQ1JFQVRFICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgTU5HX0ZOX1JFQURESVNQTEFZICAgICAgICAgICAgICA3CisjZGVmaW5lIE1OR19GTl9ESVNQTEFZICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBNTkdfRk5fRElTUExBWV9SRVNVTUUgICAgICAgICAgIDkKKyNkZWZpbmUgTU5HX0ZOX0RJU1BMQVlfRlJFRVpFICAgICAgICAgIDEwCisjZGVmaW5lIE1OR19GTl9ESVNQTEFZX1JFU0VUICAgICAgICAgICAxMQorI2lmbmRlZiBNTkdfTk9fRElTUExBWV9HT19TVVBQT1JURUQKKyNkZWZpbmUgTU5HX0ZOX0RJU1BMQVlfR09GUkFNRSAgICAgICAgIDEyCisjZGVmaW5lIE1OR19GTl9ESVNQTEFZX0dPTEFZRVIgICAgICAgICAxMworI2RlZmluZSBNTkdfRk5fRElTUExBWV9HT1RJTUUgICAgICAgICAgMTQKKyNlbmRpZgorI2RlZmluZSBNTkdfRk5fR0VUTEFTVEVSUk9SICAgICAgICAgICAgMTUKKyNkZWZpbmUgTU5HX0ZOX1JFQURfUkVTVU1FICAgICAgICAgICAgIDE2CisjZGVmaW5lIE1OR19GTl9UUkFQRVZFTlQgICAgICAgICAgICAgICAxNworI2RlZmluZSBNTkdfRk5fUkVBRF9QVVNIREFUQSAgICAgICAgICAgMTgKKyNkZWZpbmUgTU5HX0ZOX1JFQURfUFVTSFNJRyAgICAgICAgICAgIDE5CisjZGVmaW5lIE1OR19GTl9SRUFEX1BVU0hDSFVOSyAgICAgICAgICAyMAorCisjZGVmaW5lIE1OR19GTl9TRVRDQl9NRU1BTExPQyAgICAgICAgIDEwMQorI2RlZmluZSBNTkdfRk5fU0VUQ0JfTUVNRlJFRSAgICAgICAgICAxMDIKKyNkZWZpbmUgTU5HX0ZOX1NFVENCX1JFQUREQVRBICAgICAgICAgMTAzCisjZGVmaW5lIE1OR19GTl9TRVRDQl9XUklURURBVEEgICAgICAgIDEwNAorI2RlZmluZSBNTkdfRk5fU0VUQ0JfRVJST1JQUk9DICAgICAgICAxMDUKKyNkZWZpbmUgTU5HX0ZOX1NFVENCX1RSQUNFUFJPQyAgICAgICAgMTA2CisjZGVmaW5lIE1OR19GTl9TRVRDQl9QUk9DRVNTSEVBREVSICAgIDEwNworI2RlZmluZSBNTkdfRk5fU0VUQ0JfUFJPQ0VTU1RFWFQgICAgICAxMDgKKyNkZWZpbmUgTU5HX0ZOX1NFVENCX0dFVENBTlZBU0xJTkUgICAgMTA5CisjZGVmaW5lIE1OR19GTl9TRVRDQl9HRVRCS0dETElORSAgICAgIDExMAorI2RlZmluZSBNTkdfRk5fU0VUQ0JfUkVGUkVTSCAgICAgICAgICAxMTEKKyNkZWZpbmUgTU5HX0ZOX1NFVENCX0dFVFRJQ0tDT1VOVCAgICAgMTEyCisjZGVmaW5lIE1OR19GTl9TRVRDQl9TRVRUSU1FUiAgICAgICAgIDExMworI2RlZmluZSBNTkdfRk5fU0VUQ0JfUFJPQ0VTU0dBTU1BICAgICAxMTQKKyNkZWZpbmUgTU5HX0ZOX1NFVENCX1BST0NFU1NDSFJPTUEgICAgMTE1CisjZGVmaW5lIE1OR19GTl9TRVRDQl9QUk9DRVNTU1JHQiAgICAgIDExNgorI2RlZmluZSBNTkdfRk5fU0VUQ0JfUFJPQ0VTU0lDQ1AgICAgICAxMTcKKyNkZWZpbmUgTU5HX0ZOX1NFVENCX1BST0NFU1NBUk9XICAgICAgMTE4CisjaWZuZGVmIE1OR19OT19PUEVOX0NMT1NFX1NUUkVBTQorI2RlZmluZSBNTkdfRk5fU0VUQ0JfT1BFTlNUUkVBTSAgICAgICAxMTkKKyNkZWZpbmUgTU5HX0ZOX1NFVENCX0NMT1NFU1RSRUFNICAgICAgMTIwCisjZW5kaWYKKyNkZWZpbmUgTU5HX0ZOX1NFVENCX0dFVEFMUEhBTElORSAgICAgMTIxCisjZGVmaW5lIE1OR19GTl9TRVRDQl9QUk9DRVNTU0FWRSAgICAgIDEyMgorI2RlZmluZSBNTkdfRk5fU0VUQ0JfUFJPQ0VTU1NFRUsgICAgICAxMjMKKyNkZWZpbmUgTU5HX0ZOX1NFVENCX1BST0NFU1NORUVEICAgICAgMTI0CisjZGVmaW5lIE1OR19GTl9TRVRDQl9QUk9DRVNTVU5LTk9XTiAgIDEyNQorI2RlZmluZSBNTkdfRk5fU0VUQ0JfUFJPQ0VTU01FTkQgICAgICAxMjYKKyNkZWZpbmUgTU5HX0ZOX1NFVENCX1BST0NFU1NURVJNICAgICAgMTI3CisjZGVmaW5lIE1OR19GTl9TRVRDQl9SRUxFQVNFREFUQSAgICAgIDEyOAorCisjZGVmaW5lIE1OR19GTl9HRVRDQl9NRU1BTExPQyAgICAgICAgIDIwMQorI2RlZmluZSBNTkdfRk5fR0VUQ0JfTUVNRlJFRSAgICAgICAgICAyMDIKKyNkZWZpbmUgTU5HX0ZOX0dFVENCX1JFQUREQVRBICAgICAgICAgMjAzCisjZGVmaW5lIE1OR19GTl9HRVRDQl9XUklURURBVEEgICAgICAgIDIwNAorI2RlZmluZSBNTkdfRk5fR0VUQ0JfRVJST1JQUk9DICAgICAgICAyMDUKKyNkZWZpbmUgTU5HX0ZOX0dFVENCX1RSQUNFUFJPQyAgICAgICAgMjA2CisjZGVmaW5lIE1OR19GTl9HRVRDQl9QUk9DRVNTSEVBREVSICAgIDIwNworI2RlZmluZSBNTkdfRk5fR0VUQ0JfUFJPQ0VTU1RFWFQgICAgICAyMDgKKyNkZWZpbmUgTU5HX0ZOX0dFVENCX0dFVENBTlZBU0xJTkUgICAgMjA5CisjZGVmaW5lIE1OR19GTl9HRVRDQl9HRVRCS0dETElORSAgICAgIDIxMAorI2RlZmluZSBNTkdfRk5fR0VUQ0JfUkVGUkVTSCAgICAgICAgICAyMTEKKyNkZWZpbmUgTU5HX0ZOX0dFVENCX0dFVFRJQ0tDT1VOVCAgICAgMjEyCisjZGVmaW5lIE1OR19GTl9HRVRDQl9TRVRUSU1FUiAgICAgICAgIDIxMworI2RlZmluZSBNTkdfRk5fR0VUQ0JfUFJPQ0VTU0dBTU1BICAgICAyMTQKKyNkZWZpbmUgTU5HX0ZOX0dFVENCX1BST0NFU1NDSFJPTUEgICAgMjE1CisjZGVmaW5lIE1OR19GTl9HRVRDQl9QUk9DRVNTU1JHQiAgICAgIDIxNgorI2RlZmluZSBNTkdfRk5fR0VUQ0JfUFJPQ0VTU0lDQ1AgICAgICAyMTcKKyNkZWZpbmUgTU5HX0ZOX0dFVENCX1BST0NFU1NBUk9XICAgICAgMjE4CisjaWZuZGVmIE1OR19OT19PUEVOX0NMT1NFX1NUUkVBTQorI2RlZmluZSBNTkdfRk5fR0VUQ0JfT1BFTlNUUkVBTSAgICAgICAyMTkKKyNkZWZpbmUgTU5HX0ZOX0dFVENCX0NMT1NFU1RSRUFNICAgICAgMjIwCisjZW5kaWYKKyNkZWZpbmUgTU5HX0ZOX0dFVENCX0dFVEFMUEhBTElORSAgICAgMjIxCisjZGVmaW5lIE1OR19GTl9HRVRDQl9QUk9DRVNTU0FWRSAgICAgIDIyMgorI2RlZmluZSBNTkdfRk5fR0VUQ0JfUFJPQ0VTU1NFRUsgICAgICAyMjMKKyNkZWZpbmUgTU5HX0ZOX0dFVENCX1BST0NFU1NORUVEICAgICAgMjI0CisjZGVmaW5lIE1OR19GTl9HRVRDQl9QUk9DRVNTVU5LTk9XTiAgIDIyNQorI2RlZmluZSBNTkdfRk5fR0VUQ0JfUFJPQ0VTU01FTkQgICAgICAyMjYKKyNkZWZpbmUgTU5HX0ZOX0dFVENCX1BST0NFU1NURVJNICAgICAgMjI3CisjZGVmaW5lIE1OR19GTl9HRVRDQl9SRUxFQVNFREFUQSAgICAgIDIyOAorCisjZGVmaW5lIE1OR19GTl9TRVRfVVNFUkRBVEEgICAgICAgICAgIDMwMQorI2RlZmluZSBNTkdfRk5fU0VUX0NBTlZBU1NUWUxFICAgICAgICAzMDIKKyNkZWZpbmUgTU5HX0ZOX1NFVF9CS0dEU1RZTEUgICAgICAgICAgMzAzCisjZGVmaW5lIE1OR19GTl9TRVRfQkdDT0xPUiAgICAgICAgICAgIDMwNAorI2RlZmluZSBNTkdfRk5fU0VUX1NUT1JFQ0hVTktTICAgICAgICAzMDUKKyNkZWZpbmUgTU5HX0ZOX1NFVF9WSUVXR0FNTUEgICAgICAgICAgMzA2CisjZGVmaW5lIE1OR19GTl9TRVRfRElTUExBWUdBTU1BICAgICAgIDMwNworI2RlZmluZSBNTkdfRk5fU0VUX0RGTFRJTUdHQU1NQSAgICAgICAzMDgKKyNkZWZpbmUgTU5HX0ZOX1NFVF9TUkdCICAgICAgICAgICAgICAgMzA5CisjZGVmaW5lIE1OR19GTl9TRVRfT1VUUFVUUFJPRklMRSAgICAgIDMxMAorI2RlZmluZSBNTkdfRk5fU0VUX1NSR0JQUk9GSUxFICAgICAgICAzMTEKKyNkZWZpbmUgTU5HX0ZOX1NFVF9NQVhDQU5WQVNXSURUSCAgICAgMzEyCisjZGVmaW5lIE1OR19GTl9TRVRfTUFYQ0FOVkFTSEVJR0hUICAgIDMxMworI2RlZmluZSBNTkdfRk5fU0VUX01BWENBTlZBU1NJWkUgICAgICAzMTQKKyNkZWZpbmUgTU5HX0ZOX1NFVF9aTElCX0xFVkVMICAgICAgICAgMzE1CisjZGVmaW5lIE1OR19GTl9TRVRfWkxJQl9NRVRIT0QgICAgICAgIDMxNgorI2RlZmluZSBNTkdfRk5fU0VUX1pMSUJfV0lORE9XQklUUyAgICAzMTcKKyNkZWZpbmUgTU5HX0ZOX1NFVF9aTElCX01FTUxFVkVMICAgICAgMzE4CisjZGVmaW5lIE1OR19GTl9TRVRfWkxJQl9TVFJBVEVHWSAgICAgIDMxOQorI2RlZmluZSBNTkdfRk5fU0VUX1pMSUJfTUFYSURBVCAgICAgICAzMjAKKyNkZWZpbmUgTU5HX0ZOX1NFVF9KUEVHX0RDVE1FVEhPRCAgICAgMzIxCisjZGVmaW5lIE1OR19GTl9TRVRfSlBFR19RVUFMSVRZICAgICAgIDMyMgorI2RlZmluZSBNTkdfRk5fU0VUX0pQRUdfU01PT1RISU5HICAgICAzMjMKKyNkZWZpbmUgTU5HX0ZOX1NFVF9KUEVHX1BST0dSRVNTSVZFICAgMzI0CisjZGVmaW5lIE1OR19GTl9TRVRfSlBFR19PUFRJTUlaRUQgICAgIDMyNQorI2RlZmluZSBNTkdfRk5fU0VUX0pQRUdfTUFYSkRBVCAgICAgICAzMjYKKyNkZWZpbmUgTU5HX0ZOX1NFVF9TUEVFRCAgICAgICAgICAgICAgMzI3CisjZGVmaW5lIE1OR19GTl9TRVRfU1VTUEVOU0lPTk1PREUgICAgIDMyOAorI2RlZmluZSBNTkdfRk5fU0VUX1NFQ1RJT05CUkVBS1MgICAgICAzMjkKKyNkZWZpbmUgTU5HX0ZOX1NFVF9VU0VCS0dEICAgICAgICAgICAgMzMwCisjZGVmaW5lIE1OR19GTl9TRVRfT1VUUFVUUFJPRklMRTIgICAgIDMzMQorI2RlZmluZSBNTkdfRk5fU0VUX1NSR0JQUk9GSUxFMiAgICAgICAzMzIKKyNkZWZpbmUgTU5HX0ZOX1NFVF9PVVRQVVRTUkdCICAgICAgICAgMzMzCisjZGVmaW5lIE1OR19GTl9TRVRfU1JHQklNUExJQ0lUICAgICAgIDMzNAorI2RlZmluZSBNTkdfRk5fU0VUX0NBQ0hFUExBWUJBQ0sgICAgICAzMzUKKyNkZWZpbmUgTU5HX0ZOX1NFVF9ET1BST0dSRVNTSVZFICAgICAgMzM2CisjZGVmaW5lIE1OR19GTl9TRVRfQ1JDTU9ERSAgICAgICAgICAgIDMzNworCisjZGVmaW5lIE1OR19GTl9HRVRfVVNFUkRBVEEgICAgICAgICAgIDQwMQorI2RlZmluZSBNTkdfRk5fR0VUX1NJR1RZUEUgICAgICAgICAgICA0MDIKKyNkZWZpbmUgTU5HX0ZOX0dFVF9JTUFHRVRZUEUgICAgICAgICAgNDAzCisjZGVmaW5lIE1OR19GTl9HRVRfSU1BR0VXSURUSCAgICAgICAgIDQwNAorI2RlZmluZSBNTkdfRk5fR0VUX0lNQUdFSEVJR0hUICAgICAgICA0MDUKKyNkZWZpbmUgTU5HX0ZOX0dFVF9USUNLUyAgICAgICAgICAgICAgNDA2CisjZGVmaW5lIE1OR19GTl9HRVRfRlJBTUVDT1VOVCAgICAgICAgIDQwNworI2RlZmluZSBNTkdfRk5fR0VUX0xBWUVSQ09VTlQgICAgICAgICA0MDgKKyNkZWZpbmUgTU5HX0ZOX0dFVF9QTEFZVElNRSAgICAgICAgICAgNDA5CisjZGVmaW5lIE1OR19GTl9HRVRfU0lNUExJQ0lUWSAgICAgICAgIDQxMAorI2RlZmluZSBNTkdfRk5fR0VUX0NBTlZBU1NUWUxFICAgICAgICA0MTEKKyNkZWZpbmUgTU5HX0ZOX0dFVF9CS0dEU1RZTEUgICAgICAgICAgNDEyCisjZGVmaW5lIE1OR19GTl9HRVRfQkdDT0xPUiAgICAgICAgICAgIDQxMworI2RlZmluZSBNTkdfRk5fR0VUX1NUT1JFQ0hVTktTICAgICAgICA0MTQKKyNkZWZpbmUgTU5HX0ZOX0dFVF9WSUVXR0FNTUEgICAgICAgICAgNDE1CisjZGVmaW5lIE1OR19GTl9HRVRfRElTUExBWUdBTU1BICAgICAgIDQxNgorI2RlZmluZSBNTkdfRk5fR0VUX0RGTFRJTUdHQU1NQSAgICAgICA0MTcKKyNkZWZpbmUgTU5HX0ZOX0dFVF9TUkdCICAgICAgICAgICAgICAgNDE4CisjZGVmaW5lIE1OR19GTl9HRVRfTUFYQ0FOVkFTV0lEVEggICAgIDQxOQorI2RlZmluZSBNTkdfRk5fR0VUX01BWENBTlZBU0hFSUdIVCAgICA0MjAKKyNkZWZpbmUgTU5HX0ZOX0dFVF9aTElCX0xFVkVMICAgICAgICAgNDIxCisjZGVmaW5lIE1OR19GTl9HRVRfWkxJQl9NRVRIT0QgICAgICAgIDQyMgorI2RlZmluZSBNTkdfRk5fR0VUX1pMSUJfV0lORE9XQklUUyAgICA0MjMKKyNkZWZpbmUgTU5HX0ZOX0dFVF9aTElCX01FTUxFVkVMICAgICAgNDI0CisjZGVmaW5lIE1OR19GTl9HRVRfWkxJQl9TVFJBVEVHWSAgICAgIDQyNQorI2RlZmluZSBNTkdfRk5fR0VUX1pMSUJfTUFYSURBVCAgICAgICA0MjYKKyNkZWZpbmUgTU5HX0ZOX0dFVF9KUEVHX0RDVE1FVEhPRCAgICAgNDI3CisjZGVmaW5lIE1OR19GTl9HRVRfSlBFR19RVUFMSVRZICAgICAgIDQyOAorI2RlZmluZSBNTkdfRk5fR0VUX0pQRUdfU01PT1RISU5HICAgICA0MjkKKyNkZWZpbmUgTU5HX0ZOX0dFVF9KUEVHX1BST0dSRVNTSVZFICAgNDMwCisjZGVmaW5lIE1OR19GTl9HRVRfSlBFR19PUFRJTUlaRUQgICAgIDQzMQorI2RlZmluZSBNTkdfRk5fR0VUX0pQRUdfTUFYSkRBVCAgICAgICA0MzIKKyNkZWZpbmUgTU5HX0ZOX0dFVF9TUEVFRCAgICAgICAgICAgICAgNDMzCisjZGVmaW5lIE1OR19GTl9HRVRfSU1BR0VMRVZFTCAgICAgICAgIDQzNAorI2RlZmluZSBNTkdfRk5fR0VUX1NVU1BFTlNJT05NT0RFICAgICA0MzUKKyNkZWZpbmUgTU5HX0ZOX0dFVF9TVEFSVFRJTUUgICAgICAgICAgNDM2CisjZGVmaW5lIE1OR19GTl9HRVRfUlVOVElNRSAgICAgICAgICAgIDQzNworI2RlZmluZSBNTkdfRk5fR0VUX0NVUlJFTlRGUkFNRSAgICAgICA0MzgKKyNkZWZpbmUgTU5HX0ZOX0dFVF9DVVJSRU5UTEFZRVIgICAgICAgNDM5CisjZGVmaW5lIE1OR19GTl9HRVRfQ1VSUkVOVFBMQVlUSU1FICAgIDQ0MAorI2RlZmluZSBNTkdfRk5fR0VUX1NFQ1RJT05CUkVBS1MgICAgICA0NDEKKyNkZWZpbmUgTU5HX0ZOX0dFVF9BTFBIQURFUFRIICAgICAgICAgNDQyCisjZGVmaW5lIE1OR19GTl9HRVRfQklUREVQVEggICAgICAgICAgIDQ0MworI2RlZmluZSBNTkdfRk5fR0VUX0NPTE9SVFlQRSAgICAgICAgICA0NDQKKyNkZWZpbmUgTU5HX0ZOX0dFVF9DT01QUkVTU0lPTiAgICAgICAgNDQ1CisjZGVmaW5lIE1OR19GTl9HRVRfRklMVEVSICAgICAgICAgICAgIDQ0NgorI2RlZmluZSBNTkdfRk5fR0VUX0lOVEVSTEFDRSAgICAgICAgICA0NDcKKyNkZWZpbmUgTU5HX0ZOX0dFVF9BTFBIQUJJVERFUFRIICAgICAgNDQ4CisjZGVmaW5lIE1OR19GTl9HRVRfQUxQSEFDT01QUkVTU0lPTiAgIDQ0OQorI2RlZmluZSBNTkdfRk5fR0VUX0FMUEhBRklMVEVSICAgICAgICA0NTAKKyNkZWZpbmUgTU5HX0ZOX0dFVF9BTFBIQUlOVEVSTEFDRSAgICAgNDUxCisjZGVmaW5lIE1OR19GTl9HRVRfVVNFQktHRCAgICAgICAgICAgIDQ1MgorI2RlZmluZSBNTkdfRk5fR0VUX1JFRlJFU0hQQVNTICAgICAgICA0NTMKKyNkZWZpbmUgTU5HX0ZOX0dFVF9DQUNIRVBMQVlCQUNLICAgICAgNDU0CisjZGVmaW5lIE1OR19GTl9HRVRfRE9QUk9HUkVTU0lWRSAgICAgIDQ1NQorI2RlZmluZSBNTkdfRk5fR0VUX0xBU1RCQUNLQ0hVTksgICAgICA0NTYKKyNkZWZpbmUgTU5HX0ZOX0dFVF9MQVNUU0VFS05BTUUgICAgICAgNDU3CisjZGVmaW5lIE1OR19GTl9HRVRfVE9UQUxGUkFNRVMgICAgICAgIDQ1OAorI2RlZmluZSBNTkdfRk5fR0VUX1RPVEFMTEFZRVJTICAgICAgICA0NTkKKyNkZWZpbmUgTU5HX0ZOX0dFVF9UT1RBTFBMQVlUSU1FICAgICAgNDYwCisjZGVmaW5lIE1OR19GTl9HRVRfQ1JDTU9ERSAgICAgICAgICAgIDQ2MQorI2RlZmluZSBNTkdfRk5fR0VUX0NVUlJGUkFNREVMQVkgICAgICA0NjIKKworI2RlZmluZSBNTkdfRk5fU1RBVFVTX0VSUk9SICAgICAgICAgICA0ODEKKyNkZWZpbmUgTU5HX0ZOX1NUQVRVU19SRUFESU5HICAgICAgICAgNDgyCisjZGVmaW5lIE1OR19GTl9TVEFUVVNfU1VTUEVOREJSRUFLICAgIDQ4MworI2RlZmluZSBNTkdfRk5fU1RBVFVTX0NSRUFUSU5HICAgICAgICA0ODQKKyNkZWZpbmUgTU5HX0ZOX1NUQVRVU19XUklUSU5HICAgICAgICAgNDg1CisjZGVmaW5lIE1OR19GTl9TVEFUVVNfRElTUExBWUlORyAgICAgIDQ4NgorI2RlZmluZSBNTkdfRk5fU1RBVFVTX1JVTk5JTkcgICAgICAgICA0ODcKKyNkZWZpbmUgTU5HX0ZOX1NUQVRVU19USU1FUkJSRUFLICAgICAgNDg4CisjZGVmaW5lIE1OR19GTl9TVEFUVVNfRFlOQU1JQyAgICAgICAgIDQ4OQorI2RlZmluZSBNTkdfRk5fU1RBVFVTX1JVTk5JTkdFVkVOVCAgICA0OTAKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2RlZmluZSBNTkdfRk5fSVRFUkFURV9DSFVOS1MgICAgICAgICA2MDEKKyNkZWZpbmUgTU5HX0ZOX0NPUFlfQ0hVTksgICAgICAgICAgICAgNjAyCisKKyNkZWZpbmUgTU5HX0ZOX0dFVENIVU5LX0lIRFIgICAgICAgICAgNzAxCisjZGVmaW5lIE1OR19GTl9HRVRDSFVOS19QTFRFICAgICAgICAgIDcwMgorI2RlZmluZSBNTkdfRk5fR0VUQ0hVTktfSURBVCAgICAgICAgICA3MDMKKyNkZWZpbmUgTU5HX0ZOX0dFVENIVU5LX0lFTkQgICAgICAgICAgNzA0CisjZGVmaW5lIE1OR19GTl9HRVRDSFVOS19UUk5TICAgICAgICAgIDcwNQorI2RlZmluZSBNTkdfRk5fR0VUQ0hVTktfR0FNQSAgICAgICAgICA3MDYKKyNkZWZpbmUgTU5HX0ZOX0dFVENIVU5LX0NIUk0gICAgICAgICAgNzA3CisjZGVmaW5lIE1OR19GTl9HRVRDSFVOS19TUkdCICAgICAgICAgIDcwOAorI2RlZmluZSBNTkdfRk5fR0VUQ0hVTktfSUNDUCAgICAgICAgICA3MDkKKyNkZWZpbmUgTU5HX0ZOX0dFVENIVU5LX1RFWFQgICAgICAgICAgNzEwCisjZGVmaW5lIE1OR19GTl9HRVRDSFVOS19aVFhUICAgICAgICAgIDcxMQorI2RlZmluZSBNTkdfRk5fR0VUQ0hVTktfSVRYVCAgICAgICAgICA3MTIKKyNkZWZpbmUgTU5HX0ZOX0dFVENIVU5LX0JLR0QgICAgICAgICAgNzEzCisjZGVmaW5lIE1OR19GTl9HRVRDSFVOS19QSFlTICAgICAgICAgIDcxNAorI2RlZmluZSBNTkdfRk5fR0VUQ0hVTktfU0JJVCAgICAgICAgICA3MTUKKyNkZWZpbmUgTU5HX0ZOX0dFVENIVU5LX1NQTFQgICAgICAgICAgNzE2CisjZGVmaW5lIE1OR19GTl9HRVRDSFVOS19ISVNUICAgICAgICAgIDcxNworI2RlZmluZSBNTkdfRk5fR0VUQ0hVTktfVElNRSAgICAgICAgICA3MTgKKyNkZWZpbmUgTU5HX0ZOX0dFVENIVU5LX01IRFIgICAgICAgICAgNzE5CisjZGVmaW5lIE1OR19GTl9HRVRDSFVOS19NRU5EICAgICAgICAgIDcyMAorI2RlZmluZSBNTkdfRk5fR0VUQ0hVTktfTE9PUCAgICAgICAgICA3MjEKKyNkZWZpbmUgTU5HX0ZOX0dFVENIVU5LX0VOREwgICAgICAgICAgNzIyCisjZGVmaW5lIE1OR19GTl9HRVRDSFVOS19ERUZJICAgICAgICAgIDcyMworI2RlZmluZSBNTkdfRk5fR0VUQ0hVTktfQkFTSSAgICAgICAgICA3MjQKKyNkZWZpbmUgTU5HX0ZOX0dFVENIVU5LX0NMT04gICAgICAgICAgNzI1CisjZGVmaW5lIE1OR19GTl9HRVRDSFVOS19QQVNUICAgICAgICAgIDcyNgorI2RlZmluZSBNTkdfRk5fR0VUQ0hVTktfRElTQyAgICAgICAgICA3MjcKKyNkZWZpbmUgTU5HX0ZOX0dFVENIVU5LX0JBQ0sgICAgICAgICAgNzI4CisjZGVmaW5lIE1OR19GTl9HRVRDSFVOS19GUkFNICAgICAgICAgIDcyOQorI2RlZmluZSBNTkdfRk5fR0VUQ0hVTktfTU9WRSAgICAgICAgICA3MzAKKyNkZWZpbmUgTU5HX0ZOX0dFVENIVU5LX0NMSVAgICAgICAgICAgNzMxCisjZGVmaW5lIE1OR19GTl9HRVRDSFVOS19TSE9XICAgICAgICAgIDczMgorI2RlZmluZSBNTkdfRk5fR0VUQ0hVTktfVEVSTSAgICAgICAgICA3MzMKKyNkZWZpbmUgTU5HX0ZOX0dFVENIVU5LX1NBVkUgICAgICAgICAgNzM0CisjZGVmaW5lIE1OR19GTl9HRVRDSFVOS19TRUVLICAgICAgICAgIDczNQorI2RlZmluZSBNTkdfRk5fR0VUQ0hVTktfRVhQSSAgICAgICAgICA3MzYKKyNkZWZpbmUgTU5HX0ZOX0dFVENIVU5LX0ZQUkkgICAgICAgICAgNzM3CisjZGVmaW5lIE1OR19GTl9HRVRDSFVOS19ORUVEICAgICAgICAgIDczOAorI2RlZmluZSBNTkdfRk5fR0VUQ0hVTktfUEhZRyAgICAgICAgICA3MzkKKyNkZWZpbmUgTU5HX0ZOX0dFVENIVU5LX0pIRFIgICAgICAgICAgNzQwCisjZGVmaW5lIE1OR19GTl9HRVRDSFVOS19KREFUICAgICAgICAgIDc0MQorI2RlZmluZSBNTkdfRk5fR0VUQ0hVTktfSlNFUCAgICAgICAgICA3NDIKKyNkZWZpbmUgTU5HX0ZOX0dFVENIVU5LX0RIRFIgICAgICAgICAgNzQzCisjZGVmaW5lIE1OR19GTl9HRVRDSFVOS19QUk9NICAgICAgICAgIDc0NAorI2RlZmluZSBNTkdfRk5fR0VUQ0hVTktfSVBORyAgICAgICAgICA3NDUKKyNkZWZpbmUgTU5HX0ZOX0dFVENIVU5LX1BQTFQgICAgICAgICAgNzQ2CisjZGVmaW5lIE1OR19GTl9HRVRDSFVOS19JSk5HICAgICAgICAgIDc0NworI2RlZmluZSBNTkdfRk5fR0VUQ0hVTktfRFJPUCAgICAgICAgICA3NDgKKyNkZWZpbmUgTU5HX0ZOX0dFVENIVU5LX0RCWUsgICAgICAgICAgNzQ5CisjZGVmaW5lIE1OR19GTl9HRVRDSFVOS19PUkRSICAgICAgICAgIDc1MAorI2RlZmluZSBNTkdfRk5fR0VUQ0hVTktfVU5LTk9XTiAgICAgICA3NTEKKyNkZWZpbmUgTU5HX0ZOX0dFVENIVU5LX01BR04gICAgICAgICAgNzUyCisjZGVmaW5lIE1OR19GTl9HRVRDSFVOS19KREFBICAgICAgICAgIDc1MworI2RlZmluZSBNTkdfRk5fR0VUQ0hVTktfRVZOVCAgICAgICAgICA3NTQKKyNkZWZpbmUgTU5HX0ZOX0dFVENIVU5LX01QTkcgICAgICAgICAgNzU1CisKKyNkZWZpbmUgTU5HX0ZOX0dFVENIVU5LX1BBU1RfU1JDICAgICAgNzgxCisjZGVmaW5lIE1OR19GTl9HRVRDSFVOS19TQVZFX0VOVFJZICAgIDc4MgorI2RlZmluZSBNTkdfRk5fR0VUQ0hVTktfUFBMVF9FTlRSWSAgICA3ODMKKyNkZWZpbmUgTU5HX0ZOX0dFVENIVU5LX09SRFJfRU5UUlkgICAgNzg0CisjZGVmaW5lIE1OR19GTl9HRVRDSFVOS19FVk5UX0VOVFJZICAgIDc4NQorI2RlZmluZSBNTkdfRk5fR0VUQ0hVTktfTVBOR19GUkFNRSAgICA3ODYKKworI2RlZmluZSBNTkdfRk5fUFVUQ0hVTktfSUhEUiAgICAgICAgICA4MDEKKyNkZWZpbmUgTU5HX0ZOX1BVVENIVU5LX1BMVEUgICAgICAgICAgODAyCisjZGVmaW5lIE1OR19GTl9QVVRDSFVOS19JREFUICAgICAgICAgIDgwMworI2RlZmluZSBNTkdfRk5fUFVUQ0hVTktfSUVORCAgICAgICAgICA4MDQKKyNkZWZpbmUgTU5HX0ZOX1BVVENIVU5LX1RSTlMgICAgICAgICAgODA1CisjZGVmaW5lIE1OR19GTl9QVVRDSFVOS19HQU1BICAgICAgICAgIDgwNgorI2RlZmluZSBNTkdfRk5fUFVUQ0hVTktfQ0hSTSAgICAgICAgICA4MDcKKyNkZWZpbmUgTU5HX0ZOX1BVVENIVU5LX1NSR0IgICAgICAgICAgODA4CisjZGVmaW5lIE1OR19GTl9QVVRDSFVOS19JQ0NQICAgICAgICAgIDgwOQorI2RlZmluZSBNTkdfRk5fUFVUQ0hVTktfVEVYVCAgICAgICAgICA4MTAKKyNkZWZpbmUgTU5HX0ZOX1BVVENIVU5LX1pUWFQgICAgICAgICAgODExCisjZGVmaW5lIE1OR19GTl9QVVRDSFVOS19JVFhUICAgICAgICAgIDgxMgorI2RlZmluZSBNTkdfRk5fUFVUQ0hVTktfQktHRCAgICAgICAgICA4MTMKKyNkZWZpbmUgTU5HX0ZOX1BVVENIVU5LX1BIWVMgICAgICAgICAgODE0CisjZGVmaW5lIE1OR19GTl9QVVRDSFVOS19TQklUICAgICAgICAgIDgxNQorI2RlZmluZSBNTkdfRk5fUFVUQ0hVTktfU1BMVCAgICAgICAgICA4MTYKKyNkZWZpbmUgTU5HX0ZOX1BVVENIVU5LX0hJU1QgICAgICAgICAgODE3CisjZGVmaW5lIE1OR19GTl9QVVRDSFVOS19USU1FICAgICAgICAgIDgxOAorI2RlZmluZSBNTkdfRk5fUFVUQ0hVTktfTUhEUiAgICAgICAgICA4MTkKKyNkZWZpbmUgTU5HX0ZOX1BVVENIVU5LX01FTkQgICAgICAgICAgODIwCisjZGVmaW5lIE1OR19GTl9QVVRDSFVOS19MT09QICAgICAgICAgIDgyMQorI2RlZmluZSBNTkdfRk5fUFVUQ0hVTktfRU5ETCAgICAgICAgICA4MjIKKyNkZWZpbmUgTU5HX0ZOX1BVVENIVU5LX0RFRkkgICAgICAgICAgODIzCisjZGVmaW5lIE1OR19GTl9QVVRDSFVOS19CQVNJICAgICAgICAgIDgyNAorI2RlZmluZSBNTkdfRk5fUFVUQ0hVTktfQ0xPTiAgICAgICAgICA4MjUKKyNkZWZpbmUgTU5HX0ZOX1BVVENIVU5LX1BBU1QgICAgICAgICAgODI2CisjZGVmaW5lIE1OR19GTl9QVVRDSFVOS19ESVNDICAgICAgICAgIDgyNworI2RlZmluZSBNTkdfRk5fUFVUQ0hVTktfQkFDSyAgICAgICAgICA4MjgKKyNkZWZpbmUgTU5HX0ZOX1BVVENIVU5LX0ZSQU0gICAgICAgICAgODI5CisjZGVmaW5lIE1OR19GTl9QVVRDSFVOS19NT1ZFICAgICAgICAgIDgzMAorI2RlZmluZSBNTkdfRk5fUFVUQ0hVTktfQ0xJUCAgICAgICAgICA4MzEKKyNkZWZpbmUgTU5HX0ZOX1BVVENIVU5LX1NIT1cgICAgICAgICAgODMyCisjZGVmaW5lIE1OR19GTl9QVVRDSFVOS19URVJNICAgICAgICAgIDgzMworI2RlZmluZSBNTkdfRk5fUFVUQ0hVTktfU0FWRSAgICAgICAgICA4MzQKKyNkZWZpbmUgTU5HX0ZOX1BVVENIVU5LX1NFRUsgICAgICAgICAgODM1CisjZGVmaW5lIE1OR19GTl9QVVRDSFVOS19FWFBJICAgICAgICAgIDgzNgorI2RlZmluZSBNTkdfRk5fUFVUQ0hVTktfRlBSSSAgICAgICAgICA4MzcKKyNkZWZpbmUgTU5HX0ZOX1BVVENIVU5LX05FRUQgICAgICAgICAgODM4CisjZGVmaW5lIE1OR19GTl9QVVRDSFVOS19QSFlHICAgICAgICAgIDgzOQorI2RlZmluZSBNTkdfRk5fUFVUQ0hVTktfSkhEUiAgICAgICAgICA4NDAKKyNkZWZpbmUgTU5HX0ZOX1BVVENIVU5LX0pEQVQgICAgICAgICAgODQxCisjZGVmaW5lIE1OR19GTl9QVVRDSFVOS19KU0VQICAgICAgICAgIDg0MgorI2RlZmluZSBNTkdfRk5fUFVUQ0hVTktfREhEUiAgICAgICAgICA4NDMKKyNkZWZpbmUgTU5HX0ZOX1BVVENIVU5LX1BST00gICAgICAgICAgODQ0CisjZGVmaW5lIE1OR19GTl9QVVRDSFVOS19JUE5HICAgICAgICAgIDg0NQorI2RlZmluZSBNTkdfRk5fUFVUQ0hVTktfUFBMVCAgICAgICAgICA4NDYKKyNkZWZpbmUgTU5HX0ZOX1BVVENIVU5LX0lKTkcgICAgICAgICAgODQ3CisjZGVmaW5lIE1OR19GTl9QVVRDSFVOS19EUk9QICAgICAgICAgIDg0OAorI2RlZmluZSBNTkdfRk5fUFVUQ0hVTktfREJZSyAgICAgICAgICA4NDkKKyNkZWZpbmUgTU5HX0ZOX1BVVENIVU5LX09SRFIgICAgICAgICAgODUwCisjZGVmaW5lIE1OR19GTl9QVVRDSFVOS19VTktOT1dOICAgICAgIDg1MQorI2RlZmluZSBNTkdfRk5fUFVUQ0hVTktfTUFHTiAgICAgICAgICA4NTIKKyNkZWZpbmUgTU5HX0ZOX1BVVENIVU5LX0pEQUEgICAgICAgICAgODUzCisjZGVmaW5lIE1OR19GTl9QVVRDSFVOS19FVk5UICAgICAgICAgIDg1NAorI2RlZmluZSBNTkdfRk5fUFVUQ0hVTktfTVBORyAgICAgICAgICA4NTUKKworI2RlZmluZSBNTkdfRk5fUFVUQ0hVTktfUEFTVF9TUkMgICAgICA4ODEKKyNkZWZpbmUgTU5HX0ZOX1BVVENIVU5LX1NBVkVfRU5UUlkgICAgODgyCisjZGVmaW5lIE1OR19GTl9QVVRDSFVOS19QUExUX0VOVFJZICAgIDg4MworI2RlZmluZSBNTkdfRk5fUFVUQ0hVTktfT1JEUl9FTlRSWSAgICA4ODQKKyNkZWZpbmUgTU5HX0ZOX1BVVENIVU5LX0VWTlRfRU5UUlkgICAgODg1CisjZGVmaW5lIE1OR19GTl9QVVRDSFVOS19NUE5HX0ZSQU1FICAgIDg4NgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjZGVmaW5lIE1OR19GTl9HRVRJTUdEQVRBX1NFUSAgICAgICAgIDkwMQorI2RlZmluZSBNTkdfRk5fR0VUSU1HREFUQV9DSFVOS1NFUSAgICA5MDIKKyNkZWZpbmUgTU5HX0ZOX0dFVElNR0RBVEFfQ0hVTksgICAgICAgOTAzCisKKyNkZWZpbmUgTU5HX0ZOX1BVVElNR0RBVEFfSUhEUiAgICAgICAgOTUxCisjZGVmaW5lIE1OR19GTl9QVVRJTUdEQVRBX0pIRFIgICAgICAgIDk1MgorI2RlZmluZSBNTkdfRk5fUFVUSU1HREFUQV9CQVNJICAgICAgICA5NTMKKyNkZWZpbmUgTU5HX0ZOX1BVVElNR0RBVEFfREhEUiAgICAgICAgOTU0CisKKyNkZWZpbmUgTU5HX0ZOX1VQREFURU1OR0hFQURFUiAgICAgICAgOTgxCisjZGVmaW5lIE1OR19GTl9VUERBVEVNTkdTSU1QTElDSVRZICAgIDk4MgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjZGVmaW5lIE1OR19GTl9QUk9DRVNTX1JBV19DSFVOSyAgICAgMTAwMQorI2RlZmluZSBNTkdfRk5fUkVBRF9HUkFQSElDICAgICAgICAgIDEwMDIKKyNkZWZpbmUgTU5HX0ZOX0RST1BfQ0hVTktTICAgICAgICAgICAxMDAzCisjZGVmaW5lIE1OR19GTl9QUk9DRVNTX0VSUk9SICAgICAgICAgMTAwNAorI2RlZmluZSBNTkdfRk5fQ0xFQVJfQ01TICAgICAgICAgICAgIDEwMDUKKyNkZWZpbmUgTU5HX0ZOX0RST1BfT0JKRUNUUyAgICAgICAgICAxMDA2CisjZGVmaW5lIE1OR19GTl9SRUFEX0NIVU5LICAgICAgICAgICAgMTAwNworI2RlZmluZSBNTkdfRk5fTE9BRF9CS0dETEFZRVIgICAgICAgIDEwMDgKKyNkZWZpbmUgTU5HX0ZOX05FWFRfRlJBTUUgICAgICAgICAgICAxMDA5CisjZGVmaW5lIE1OR19GTl9ORVhUX0xBWUVSICAgICAgICAgICAgMTAxMAorI2RlZmluZSBNTkdfRk5fSU5URVJGUkFNRV9ERUxBWSAgICAgIDEwMTEKKyNkZWZpbmUgTU5HX0ZOX0RJU1BMQVlfSU1BR0UgICAgICAgICAxMDEyCisjZGVmaW5lIE1OR19GTl9EUk9QX0lNR09CSkVDVFMgICAgICAgMTAxMworI2RlZmluZSBNTkdfRk5fRFJPUF9BTklPQkpFQ1RTICAgICAgIDEwMTQKKyNkZWZpbmUgTU5HX0ZOX0lORkxBVEVfQlVGRkVSICAgICAgICAxMDE1CisjZGVmaW5lIE1OR19GTl9ERUZMQVRFX0JVRkZFUiAgICAgICAgMTAxNgorI2RlZmluZSBNTkdfRk5fV1JJVEVfUkFXX0NIVU5LICAgICAgIDEwMTcKKyNkZWZpbmUgTU5HX0ZOX1dSSVRFX0dSQVBISUMgICAgICAgICAxMDE4CisjZGVmaW5lIE1OR19GTl9TQVZFX1NUQVRFICAgICAgICAgICAgMTAxOQorI2RlZmluZSBNTkdfRk5fUkVTVE9SRV9TVEFURSAgICAgICAgIDEwMjAKKyNkZWZpbmUgTU5HX0ZOX0RST1BfU0FWRURBVEEgICAgICAgICAxMDIxCisjZGVmaW5lIE1OR19GTl9FWEVDVVRFX0RFTFRBX0lNQUdFICAgMTAyMgorI2RlZmluZSBNTkdfRk5fUFJPQ0VTU19ESVNQTEFZICAgICAgIDEwMjMKKyNkZWZpbmUgTU5HX0ZOX0NMRUFSX0NBTlZBUyAgICAgICAgICAxMDI0CisjZGVmaW5lIE1OR19GTl9SRUFEX0RBVEFCVUZGRVIgICAgICAgMTAyNQorI2RlZmluZSBNTkdfRk5fU1RPUkVfRVJST1IgICAgICAgICAgIDEwMjYKKyNkZWZpbmUgTU5HX0ZOX0RST1BfSU5WQUxJRF9PQkpFQ1RTICAxMDI3CisjZGVmaW5lIE1OR19GTl9SRUxFQVNFX1BVU0hEQVRBICAgICAgMTAyOAorI2RlZmluZSBNTkdfRk5fUkVBRF9EQVRBICAgICAgICAgICAgIDEwMjkKKyNkZWZpbmUgTU5HX0ZOX1JFQURfQ0hVTktfQ1JDICAgICAgICAxMDMwCisjZGVmaW5lIE1OR19GTl9SRUxFQVNFX1BVU0hDSFVOSyAgICAgMTAzMQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjZGVmaW5lIE1OR19GTl9ESVNQTEFZX1JHQjggICAgICAgICAgMTEwMQorI2RlZmluZSBNTkdfRk5fRElTUExBWV9SR0JBOCAgICAgICAgIDExMDIKKyNkZWZpbmUgTU5HX0ZOX0RJU1BMQVlfQVJHQjggICAgICAgICAxMTAzCisjZGVmaW5lIE1OR19GTl9ESVNQTEFZX0JHUjggICAgICAgICAgMTEwNAorI2RlZmluZSBNTkdfRk5fRElTUExBWV9CR1JBOCAgICAgICAgIDExMDUKKyNkZWZpbmUgTU5HX0ZOX0RJU1BMQVlfQUJHUjggICAgICAgICAxMTA2CisjZGVmaW5lIE1OR19GTl9ESVNQTEFZX1JHQjE2ICAgICAgICAgMTEwNworI2RlZmluZSBNTkdfRk5fRElTUExBWV9SR0JBMTYgICAgICAgIDExMDgKKyNkZWZpbmUgTU5HX0ZOX0RJU1BMQVlfQVJHQjE2ICAgICAgICAxMTA5CisjZGVmaW5lIE1OR19GTl9ESVNQTEFZX0JHUjE2ICAgICAgICAgMTExMAorI2RlZmluZSBNTkdfRk5fRElTUExBWV9CR1JBMTYgICAgICAgIDExMTEKKyNkZWZpbmUgTU5HX0ZOX0RJU1BMQVlfQUJHUjE2ICAgICAgICAxMTEyCisjZGVmaW5lIE1OR19GTl9ESVNQTEFZX0lOREVYOCAgICAgICAgMTExMworI2RlZmluZSBNTkdfRk5fRElTUExBWV9JTkRFWEE4ICAgICAgIDExMTQKKyNkZWZpbmUgTU5HX0ZOX0RJU1BMQVlfQUlOREVYOCAgICAgICAxMTE1CisjZGVmaW5lIE1OR19GTl9ESVNQTEFZX0dSQVk4ICAgICAgICAgMTExNgorI2RlZmluZSBNTkdfRk5fRElTUExBWV9HUkFZMTYgICAgICAgIDExMTcKKyNkZWZpbmUgTU5HX0ZOX0RJU1BMQVlfR1JBWUE4ICAgICAgICAxMTE4CisjZGVmaW5lIE1OR19GTl9ESVNQTEFZX0dSQVlBMTYgICAgICAgMTExOQorI2RlZmluZSBNTkdfRk5fRElTUExBWV9BR1JBWTggICAgICAgIDExMjAKKyNkZWZpbmUgTU5HX0ZOX0RJU1BMQVlfQUdSQVkxNiAgICAgICAxMTIxCisjZGVmaW5lIE1OR19GTl9ESVNQTEFZX0RYMTUgICAgICAgICAgMTEyMgorI2RlZmluZSBNTkdfRk5fRElTUExBWV9EWDE2ICAgICAgICAgIDExMjMKKyNkZWZpbmUgTU5HX0ZOX0RJU1BMQVlfUkdCOF9BOCAgICAgICAxMTI0CisjZGVmaW5lIE1OR19GTl9ESVNQTEFZX0JHUkE4UE0gICAgICAgMTEyNQorI2RlZmluZSBNTkdfRk5fRElTUExBWV9CR1JYOCAgICAgICAgIDExMjYKKyNkZWZpbmUgTU5HX0ZOX0RJU1BMQVlfUkdCNTY1ICAgICAgICAxMTI3CisjZGVmaW5lIE1OR19GTl9ESVNQTEFZX1JHQkE1NjUgICAgICAgMTEyOAorI2RlZmluZSBNTkdfRk5fRElTUExBWV9CR1I1NjUgICAgICAgIDExMjkKKyNkZWZpbmUgTU5HX0ZOX0RJU1BMQVlfQkdSQTU2NSAgICAgICAxMTMwCisjZGVmaW5lIE1OR19GTl9ESVNQTEFZX1JHQkE4X1BNICAgICAgMTEzMQorI2RlZmluZSBNTkdfRk5fRElTUExBWV9BUkdCOF9QTSAgICAgIDExMzIKKyNkZWZpbmUgTU5HX0ZOX0RJU1BMQVlfQUJHUjhfUE0gICAgICAxMTMzCisjZGVmaW5lIE1OR19GTl9ESVNQTEFZX0JHUjU2NV9BOCAgICAgMTEzNAorI2RlZmluZSBNTkdfRk5fRElTUExBWV9SR0I1NTUgICAgICAgIDExMzUKKyNkZWZpbmUgTU5HX0ZOX0RJU1BMQVlfQkdSNTU1ICAgICAgICAxMTM2CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNkZWZpbmUgTU5HX0ZOX0lOSVRfRlVMTF9DTVMgICAgICAgICAxMjAxCisjZGVmaW5lIE1OR19GTl9DT1JSRUNUX0ZVTExfQ01TICAgICAgMTIwMgorI2RlZmluZSBNTkdfRk5fSU5JVF9HQU1NQV9PTkxZICAgICAgIDEyMDQKKyNkZWZpbmUgTU5HX0ZOX0NPUlJFQ1RfR0FNTUFfT05MWSAgICAxMjA1CisjZGVmaW5lIE1OR19GTl9DT1JSRUNUX0FQUF9DTVMgICAgICAgMTIwNgorI2RlZmluZSBNTkdfRk5fSU5JVF9GVUxMX0NNU19PQkogICAgIDEyMDcKKyNkZWZpbmUgTU5HX0ZOX0lOSVRfR0FNTUFfT05MWV9PQkogICAxMjA4CisjZGVmaW5lIE1OR19GTl9JTklUX0FQUF9DTVMgICAgICAgICAgMTIwOQorI2RlZmluZSBNTkdfRk5fSU5JVF9BUFBfQ01TX09CSiAgICAgIDEyMTAKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2RlZmluZSBNTkdfRk5fUFJPQ0VTU19HMSAgICAgICAgICAgIDEzMDEKKyNkZWZpbmUgTU5HX0ZOX1BST0NFU1NfRzIgICAgICAgICAgICAxMzAyCisjZGVmaW5lIE1OR19GTl9QUk9DRVNTX0c0ICAgICAgICAgICAgMTMwMworI2RlZmluZSBNTkdfRk5fUFJPQ0VTU19HOCAgICAgICAgICAgIDEzMDQKKyNkZWZpbmUgTU5HX0ZOX1BST0NFU1NfRzE2ICAgICAgICAgICAxMzA1CisjZGVmaW5lIE1OR19GTl9QUk9DRVNTX1JHQjggICAgICAgICAgMTMwNgorI2RlZmluZSBNTkdfRk5fUFJPQ0VTU19SR0IxNiAgICAgICAgIDEzMDcKKyNkZWZpbmUgTU5HX0ZOX1BST0NFU1NfSURYMSAgICAgICAgICAxMzA4CisjZGVmaW5lIE1OR19GTl9QUk9DRVNTX0lEWDIgICAgICAgICAgMTMwOQorI2RlZmluZSBNTkdfRk5fUFJPQ0VTU19JRFg0ICAgICAgICAgIDEzMTAKKyNkZWZpbmUgTU5HX0ZOX1BST0NFU1NfSURYOCAgICAgICAgICAxMzExCisjZGVmaW5lIE1OR19GTl9QUk9DRVNTX0dBOCAgICAgICAgICAgMTMxMgorI2RlZmluZSBNTkdfRk5fUFJPQ0VTU19HQTE2ICAgICAgICAgIDEzMTMKKyNkZWZpbmUgTU5HX0ZOX1BST0NFU1NfUkdCQTggICAgICAgICAxMzE0CisjZGVmaW5lIE1OR19GTl9QUk9DRVNTX1JHQkExNiAgICAgICAgMTMxNQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjZGVmaW5lIE1OR19GTl9JTklUX0cxX05JICAgICAgICAgICAgMTQwMQorI2RlZmluZSBNTkdfRk5fSU5JVF9HMV9JICAgICAgICAgICAgIDE0MDIKKyNkZWZpbmUgTU5HX0ZOX0lOSVRfRzJfTkkgICAgICAgICAgICAxNDAzCisjZGVmaW5lIE1OR19GTl9JTklUX0cyX0kgICAgICAgICAgICAgMTQwNAorI2RlZmluZSBNTkdfRk5fSU5JVF9HNF9OSSAgICAgICAgICAgIDE0MDUKKyNkZWZpbmUgTU5HX0ZOX0lOSVRfRzRfSSAgICAgICAgICAgICAxNDA2CisjZGVmaW5lIE1OR19GTl9JTklUX0c4X05JICAgICAgICAgICAgMTQwNworI2RlZmluZSBNTkdfRk5fSU5JVF9HOF9JICAgICAgICAgICAgIDE0MDgKKyNkZWZpbmUgTU5HX0ZOX0lOSVRfRzE2X05JICAgICAgICAgICAxNDA5CisjZGVmaW5lIE1OR19GTl9JTklUX0cxNl9JICAgICAgICAgICAgMTQxMAorI2RlZmluZSBNTkdfRk5fSU5JVF9SR0I4X05JICAgICAgICAgIDE0MTEKKyNkZWZpbmUgTU5HX0ZOX0lOSVRfUkdCOF9JICAgICAgICAgICAxNDEyCisjZGVmaW5lIE1OR19GTl9JTklUX1JHQjE2X05JICAgICAgICAgMTQxMworI2RlZmluZSBNTkdfRk5fSU5JVF9SR0IxNl9JICAgICAgICAgIDE0MTQKKyNkZWZpbmUgTU5HX0ZOX0lOSVRfSURYMV9OSSAgICAgICAgICAxNDE1CisjZGVmaW5lIE1OR19GTl9JTklUX0lEWDFfSSAgICAgICAgICAgMTQxNgorI2RlZmluZSBNTkdfRk5fSU5JVF9JRFgyX05JICAgICAgICAgIDE0MTcKKyNkZWZpbmUgTU5HX0ZOX0lOSVRfSURYMl9JICAgICAgICAgICAxNDE4CisjZGVmaW5lIE1OR19GTl9JTklUX0lEWDRfTkkgICAgICAgICAgMTQxOQorI2RlZmluZSBNTkdfRk5fSU5JVF9JRFg0X0kgICAgICAgICAgIDE0MjAKKyNkZWZpbmUgTU5HX0ZOX0lOSVRfSURYOF9OSSAgICAgICAgICAxNDIxCisjZGVmaW5lIE1OR19GTl9JTklUX0lEWDhfSSAgICAgICAgICAgMTQyMgorI2RlZmluZSBNTkdfRk5fSU5JVF9HQThfTkkgICAgICAgICAgIDE0MjMKKyNkZWZpbmUgTU5HX0ZOX0lOSVRfR0E4X0kgICAgICAgICAgICAxNDI0CisjZGVmaW5lIE1OR19GTl9JTklUX0dBMTZfTkkgICAgICAgICAgMTQyNQorI2RlZmluZSBNTkdfRk5fSU5JVF9HQTE2X0kgICAgICAgICAgIDE0MjYKKyNkZWZpbmUgTU5HX0ZOX0lOSVRfUkdCQThfTkkgICAgICAgICAxNDI3CisjZGVmaW5lIE1OR19GTl9JTklUX1JHQkE4X0kgICAgICAgICAgMTQyOAorI2RlZmluZSBNTkdfRk5fSU5JVF9SR0JBMTZfTkkgICAgICAgIDE0MjkKKyNkZWZpbmUgTU5HX0ZOX0lOSVRfUkdCQTE2X0kgICAgICAgICAxNDMwCisKKyNkZWZpbmUgTU5HX0ZOX0lOSVRfUk9XUFJPQyAgICAgICAgICAxNDk3CisjZGVmaW5lIE1OR19GTl9ORVhUX1JPVyAgICAgICAgICAgICAgMTQ5OAorI2RlZmluZSBNTkdfRk5fQ0xFQU5VUF9ST1dQUk9DICAgICAgIDE0OTkKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2RlZmluZSBNTkdfRk5fRklMVEVSX0FfUk9XICAgICAgICAgIDE1MDEKKyNkZWZpbmUgTU5HX0ZOX0ZJTFRFUl9TVUIgICAgICAgICAgICAxNTAyCisjZGVmaW5lIE1OR19GTl9GSUxURVJfVVAgICAgICAgICAgICAgMTUwMworI2RlZmluZSBNTkdfRk5fRklMVEVSX0FWRVJBR0UgICAgICAgIDE1MDQKKyNkZWZpbmUgTU5HX0ZOX0ZJTFRFUl9QQUVUSCAgICAgICAgICAxNTA1CisKKyNkZWZpbmUgTU5HX0ZOX0lOSVRfUk9XRElGRkVSSU5HICAgICAxNTUxCisjZGVmaW5lIE1OR19GTl9ESUZGRVJfRzEgICAgICAgICAgICAgMTU1MgorI2RlZmluZSBNTkdfRk5fRElGRkVSX0cyICAgICAgICAgICAgIDE1NTMKKyNkZWZpbmUgTU5HX0ZOX0RJRkZFUl9HNCAgICAgICAgICAgICAxNTU0CisjZGVmaW5lIE1OR19GTl9ESUZGRVJfRzggICAgICAgICAgICAgMTU1NQorI2RlZmluZSBNTkdfRk5fRElGRkVSX0cxNiAgICAgICAgICAgIDE1NTYKKyNkZWZpbmUgTU5HX0ZOX0RJRkZFUl9SR0I4ICAgICAgICAgICAxNTU3CisjZGVmaW5lIE1OR19GTl9ESUZGRVJfUkdCMTYgICAgICAgICAgMTU1OAorI2RlZmluZSBNTkdfRk5fRElGRkVSX0lEWDEgICAgICAgICAgIDE1NTkKKyNkZWZpbmUgTU5HX0ZOX0RJRkZFUl9JRFgyICAgICAgICAgICAxNTYwCisjZGVmaW5lIE1OR19GTl9ESUZGRVJfSURYNCAgICAgICAgICAgMTU2MQorI2RlZmluZSBNTkdfRk5fRElGRkVSX0lEWDggICAgICAgICAgIDE1NjIKKyNkZWZpbmUgTU5HX0ZOX0RJRkZFUl9HQTggICAgICAgICAgICAxNTYzCisjZGVmaW5lIE1OR19GTl9ESUZGRVJfR0ExNiAgICAgICAgICAgMTU2NAorI2RlZmluZSBNTkdfRk5fRElGRkVSX1JHQkE4ICAgICAgICAgIDE1NjUKKyNkZWZpbmUgTU5HX0ZOX0RJRkZFUl9SR0JBMTYgICAgICAgICAxNTY2CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNkZWZpbmUgTU5HX0ZOX0NSRUFURV9JTUdEQVRBT0JKRUNUICAxNjAxCisjZGVmaW5lIE1OR19GTl9GUkVFX0lNR0RBVEFPQkpFQ1QgICAgMTYwMgorI2RlZmluZSBNTkdfRk5fQ0xPTkVfSU1HREFUQU9CSkVDVCAgIDE2MDMKKyNkZWZpbmUgTU5HX0ZOX0NSRUFURV9JTUdPQkpFQ1QgICAgICAxNjA0CisjZGVmaW5lIE1OR19GTl9GUkVFX0lNR09CSkVDVCAgICAgICAgMTYwNQorI2RlZmluZSBNTkdfRk5fRklORF9JTUdPQkpFQ1QgICAgICAgIDE2MDYKKyNkZWZpbmUgTU5HX0ZOX0NMT05FX0lNR09CSkVDVCAgICAgICAxNjA3CisjZGVmaW5lIE1OR19GTl9SRVNFVF9PQkpFQ1RERVRBSUxTICAgMTYwOAorI2RlZmluZSBNTkdfRk5fUkVOVU1fSU1HT0JKRUNUICAgICAgIDE2MDkKKyNkZWZpbmUgTU5HX0ZOX1BST01PVEVfSU1HT0JKRUNUICAgICAxNjEwCisjZGVmaW5lIE1OR19GTl9NQUdOSUZZX0lNR09CSkVDVCAgICAgMTYxMQorI2RlZmluZSBNTkdfRk5fQ09MT1JDT1JSRUNUX09CSkVDVCAgIDE2MTIKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2RlZmluZSBNTkdfRk5fU1RPUkVfRzEgICAgICAgICAgICAgIDE3MDEKKyNkZWZpbmUgTU5HX0ZOX1NUT1JFX0cyICAgICAgICAgICAgICAxNzAyCisjZGVmaW5lIE1OR19GTl9TVE9SRV9HNCAgICAgICAgICAgICAgMTcwMworI2RlZmluZSBNTkdfRk5fU1RPUkVfRzggICAgICAgICAgICAgIDE3MDQKKyNkZWZpbmUgTU5HX0ZOX1NUT1JFX0cxNiAgICAgICAgICAgICAxNzA1CisjZGVmaW5lIE1OR19GTl9TVE9SRV9SR0I4ICAgICAgICAgICAgMTcwNgorI2RlZmluZSBNTkdfRk5fU1RPUkVfUkdCMTYgICAgICAgICAgIDE3MDcKKyNkZWZpbmUgTU5HX0ZOX1NUT1JFX0lEWDEgICAgICAgICAgICAxNzA4CisjZGVmaW5lIE1OR19GTl9TVE9SRV9JRFgyICAgICAgICAgICAgMTcwOQorI2RlZmluZSBNTkdfRk5fU1RPUkVfSURYNCAgICAgICAgICAgIDE3MTAKKyNkZWZpbmUgTU5HX0ZOX1NUT1JFX0lEWDggICAgICAgICAgICAxNzExCisjZGVmaW5lIE1OR19GTl9TVE9SRV9HQTggICAgICAgICAgICAgMTcxMgorI2RlZmluZSBNTkdfRk5fU1RPUkVfR0ExNiAgICAgICAgICAgIDE3MTMKKyNkZWZpbmUgTU5HX0ZOX1NUT1JFX1JHQkE4ICAgICAgICAgICAxNzE0CisjZGVmaW5lIE1OR19GTl9TVE9SRV9SR0JBMTYgICAgICAgICAgMTcxNQorCisjZGVmaW5lIE1OR19GTl9SRVRSSUVWRV9HOCAgICAgICAgICAgMTc1MQorI2RlZmluZSBNTkdfRk5fUkVUUklFVkVfRzE2ICAgICAgICAgIDE3NTIKKyNkZWZpbmUgTU5HX0ZOX1JFVFJJRVZFX1JHQjggICAgICAgICAxNzUzCisjZGVmaW5lIE1OR19GTl9SRVRSSUVWRV9SR0IxNiAgICAgICAgMTc1NAorI2RlZmluZSBNTkdfRk5fUkVUUklFVkVfSURYOCAgICAgICAgIDE3NTUKKyNkZWZpbmUgTU5HX0ZOX1JFVFJJRVZFX0dBOCAgICAgICAgICAxNzU2CisjZGVmaW5lIE1OR19GTl9SRVRSSUVWRV9HQTE2ICAgICAgICAgMTc1NworI2RlZmluZSBNTkdfRk5fUkVUUklFVkVfUkdCQTggICAgICAgIDE3NTgKKyNkZWZpbmUgTU5HX0ZOX1JFVFJJRVZFX1JHQkExNiAgICAgICAxNzU5CisKKyNkZWZpbmUgTU5HX0ZOX0RFTFRBX0cxICAgICAgICAgICAgICAxNzcxCisjZGVmaW5lIE1OR19GTl9ERUxUQV9HMiAgICAgICAgICAgICAgMTc3MgorI2RlZmluZSBNTkdfRk5fREVMVEFfRzQgICAgICAgICAgICAgIDE3NzMKKyNkZWZpbmUgTU5HX0ZOX0RFTFRBX0c4ICAgICAgICAgICAgICAxNzc0CisjZGVmaW5lIE1OR19GTl9ERUxUQV9HMTYgICAgICAgICAgICAgMTc3NQorI2RlZmluZSBNTkdfRk5fREVMVEFfUkdCOCAgICAgICAgICAgIDE3NzYKKyNkZWZpbmUgTU5HX0ZOX0RFTFRBX1JHQjE2ICAgICAgICAgICAxNzc3CisjZGVmaW5lIE1OR19GTl9ERUxUQV9JRFgxICAgICAgICAgICAgMTc3OAorI2RlZmluZSBNTkdfRk5fREVMVEFfSURYMiAgICAgICAgICAgIDE3NzkKKyNkZWZpbmUgTU5HX0ZOX0RFTFRBX0lEWDQgICAgICAgICAgICAxNzgwCisjZGVmaW5lIE1OR19GTl9ERUxUQV9JRFg4ICAgICAgICAgICAgMTc4MQorI2RlZmluZSBNTkdfRk5fREVMVEFfR0E4ICAgICAgICAgICAgIDE3ODIKKyNkZWZpbmUgTU5HX0ZOX0RFTFRBX0dBMTYgICAgICAgICAgICAxNzgzCisjZGVmaW5lIE1OR19GTl9ERUxUQV9SR0JBOCAgICAgICAgICAgMTc4NAorI2RlZmluZSBNTkdfRk5fREVMVEFfUkdCQTE2ICAgICAgICAgIDE3ODUKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2RlZmluZSBNTkdfRk5fQ1JFQVRFX0FOSV9MT09QICAgICAgIDE4MDEKKyNkZWZpbmUgTU5HX0ZOX0NSRUFURV9BTklfRU5ETCAgICAgICAxODAyCisjZGVmaW5lIE1OR19GTl9DUkVBVEVfQU5JX0RFRkkgICAgICAgMTgwMworI2RlZmluZSBNTkdfRk5fQ1JFQVRFX0FOSV9CQVNJICAgICAgIDE4MDQKKyNkZWZpbmUgTU5HX0ZOX0NSRUFURV9BTklfQ0xPTiAgICAgICAxODA1CisjZGVmaW5lIE1OR19GTl9DUkVBVEVfQU5JX1BBU1QgICAgICAgMTgwNgorI2RlZmluZSBNTkdfRk5fQ1JFQVRFX0FOSV9ESVNDICAgICAgIDE4MDcKKyNkZWZpbmUgTU5HX0ZOX0NSRUFURV9BTklfQkFDSyAgICAgICAxODA4CisjZGVmaW5lIE1OR19GTl9DUkVBVEVfQU5JX0ZSQU0gICAgICAgMTgwOQorI2RlZmluZSBNTkdfRk5fQ1JFQVRFX0FOSV9NT1ZFICAgICAgIDE4MTAKKyNkZWZpbmUgTU5HX0ZOX0NSRUFURV9BTklfQ0xJUCAgICAgICAxODExCisjZGVmaW5lIE1OR19GTl9DUkVBVEVfQU5JX1NIT1cgICAgICAgMTgxMgorI2RlZmluZSBNTkdfRk5fQ1JFQVRFX0FOSV9URVJNICAgICAgIDE4MTMKKyNkZWZpbmUgTU5HX0ZOX0NSRUFURV9BTklfU0FWRSAgICAgICAxODE0CisjZGVmaW5lIE1OR19GTl9DUkVBVEVfQU5JX1NFRUsgICAgICAgMTgxNQorI2RlZmluZSBNTkdfRk5fQ1JFQVRFX0FOSV9HQU1BICAgICAgIDE4MTYKKyNkZWZpbmUgTU5HX0ZOX0NSRUFURV9BTklfQ0hSTSAgICAgICAxODE3CisjZGVmaW5lIE1OR19GTl9DUkVBVEVfQU5JX1NSR0IgICAgICAgMTgxOAorI2RlZmluZSBNTkdfRk5fQ1JFQVRFX0FOSV9JQ0NQICAgICAgIDE4MTkKKyNkZWZpbmUgTU5HX0ZOX0NSRUFURV9BTklfUExURSAgICAgICAxODIwCisjZGVmaW5lIE1OR19GTl9DUkVBVEVfQU5JX1RSTlMgICAgICAgMTgyMQorI2RlZmluZSBNTkdfRk5fQ1JFQVRFX0FOSV9CS0dEICAgICAgIDE4MjIKKyNkZWZpbmUgTU5HX0ZOX0NSRUFURV9BTklfREhEUiAgICAgICAxODIzCisjZGVmaW5lIE1OR19GTl9DUkVBVEVfQU5JX1BST00gICAgICAgMTgyNAorI2RlZmluZSBNTkdfRk5fQ1JFQVRFX0FOSV9JUE5HICAgICAgIDE4MjUKKyNkZWZpbmUgTU5HX0ZOX0NSRUFURV9BTklfSUpORyAgICAgICAxODI2CisjZGVmaW5lIE1OR19GTl9DUkVBVEVfQU5JX1BQTFQgICAgICAgMTgyNworI2RlZmluZSBNTkdfRk5fQ1JFQVRFX0FOSV9NQUdOICAgICAgIDE4MjgKKworI2RlZmluZSBNTkdfRk5fQ1JFQVRFX0FOSV9JTUFHRSAgICAgIDE4OTEKKyNkZWZpbmUgTU5HX0ZOX0NSRUFURV9FVkVOVCAgICAgICAgICAxODkyCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNkZWZpbmUgTU5HX0ZOX0ZSRUVfQU5JX0xPT1AgICAgICAgICAxOTAxCisjZGVmaW5lIE1OR19GTl9GUkVFX0FOSV9FTkRMICAgICAgICAgMTkwMgorI2RlZmluZSBNTkdfRk5fRlJFRV9BTklfREVGSSAgICAgICAgIDE5MDMKKyNkZWZpbmUgTU5HX0ZOX0ZSRUVfQU5JX0JBU0kgICAgICAgICAxOTA0CisjZGVmaW5lIE1OR19GTl9GUkVFX0FOSV9DTE9OICAgICAgICAgMTkwNQorI2RlZmluZSBNTkdfRk5fRlJFRV9BTklfUEFTVCAgICAgICAgIDE5MDYKKyNkZWZpbmUgTU5HX0ZOX0ZSRUVfQU5JX0RJU0MgICAgICAgICAxOTA3CisjZGVmaW5lIE1OR19GTl9GUkVFX0FOSV9CQUNLICAgICAgICAgMTkwOAorI2RlZmluZSBNTkdfRk5fRlJFRV9BTklfRlJBTSAgICAgICAgIDE5MDkKKyNkZWZpbmUgTU5HX0ZOX0ZSRUVfQU5JX01PVkUgICAgICAgICAxOTEwCisjZGVmaW5lIE1OR19GTl9GUkVFX0FOSV9DTElQICAgICAgICAgMTkxMQorI2RlZmluZSBNTkdfRk5fRlJFRV9BTklfU0hPVyAgICAgICAgIDE5MTIKKyNkZWZpbmUgTU5HX0ZOX0ZSRUVfQU5JX1RFUk0gICAgICAgICAxOTEzCisjZGVmaW5lIE1OR19GTl9GUkVFX0FOSV9TQVZFICAgICAgICAgMTkxNAorI2RlZmluZSBNTkdfRk5fRlJFRV9BTklfU0VFSyAgICAgICAgIDE5MTUKKyNkZWZpbmUgTU5HX0ZOX0ZSRUVfQU5JX0dBTUEgICAgICAgICAxOTE2CisjZGVmaW5lIE1OR19GTl9GUkVFX0FOSV9DSFJNICAgICAgICAgMTkxNworI2RlZmluZSBNTkdfRk5fRlJFRV9BTklfU1JHQiAgICAgICAgIDE5MTgKKyNkZWZpbmUgTU5HX0ZOX0ZSRUVfQU5JX0lDQ1AgICAgICAgICAxOTE5CisjZGVmaW5lIE1OR19GTl9GUkVFX0FOSV9QTFRFICAgICAgICAgMTkyMAorI2RlZmluZSBNTkdfRk5fRlJFRV9BTklfVFJOUyAgICAgICAgIDE5MjEKKyNkZWZpbmUgTU5HX0ZOX0ZSRUVfQU5JX0JLR0QgICAgICAgICAxOTIyCisjZGVmaW5lIE1OR19GTl9GUkVFX0FOSV9ESERSICAgICAgICAgMTkyMworI2RlZmluZSBNTkdfRk5fRlJFRV9BTklfUFJPTSAgICAgICAgIDE5MjQKKyNkZWZpbmUgTU5HX0ZOX0ZSRUVfQU5JX0lQTkcgICAgICAgICAxOTI1CisjZGVmaW5lIE1OR19GTl9GUkVFX0FOSV9JSk5HICAgICAgICAgMTkyNgorI2RlZmluZSBNTkdfRk5fRlJFRV9BTklfUFBMVCAgICAgICAgIDE5MjcKKyNkZWZpbmUgTU5HX0ZOX0ZSRUVfQU5JX01BR04gICAgICAgICAxOTI4CisKKyNkZWZpbmUgTU5HX0ZOX0ZSRUVfQU5JX0lNQUdFICAgICAgICAxOTkxCisjZGVmaW5lIE1OR19GTl9GUkVFX0VWRU5UICAgICAgICAgICAgMTk5MgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjZGVmaW5lIE1OR19GTl9QUk9DRVNTX0FOSV9MT09QICAgICAgMjAwMQorI2RlZmluZSBNTkdfRk5fUFJPQ0VTU19BTklfRU5ETCAgICAgIDIwMDIKKyNkZWZpbmUgTU5HX0ZOX1BST0NFU1NfQU5JX0RFRkkgICAgICAyMDAzCisjZGVmaW5lIE1OR19GTl9QUk9DRVNTX0FOSV9CQVNJICAgICAgMjAwNAorI2RlZmluZSBNTkdfRk5fUFJPQ0VTU19BTklfQ0xPTiAgICAgIDIwMDUKKyNkZWZpbmUgTU5HX0ZOX1BST0NFU1NfQU5JX1BBU1QgICAgICAyMDA2CisjZGVmaW5lIE1OR19GTl9QUk9DRVNTX0FOSV9ESVNDICAgICAgMjAwNworI2RlZmluZSBNTkdfRk5fUFJPQ0VTU19BTklfQkFDSyAgICAgIDIwMDgKKyNkZWZpbmUgTU5HX0ZOX1BST0NFU1NfQU5JX0ZSQU0gICAgICAyMDA5CisjZGVmaW5lIE1OR19GTl9QUk9DRVNTX0FOSV9NT1ZFICAgICAgMjAxMAorI2RlZmluZSBNTkdfRk5fUFJPQ0VTU19BTklfQ0xJUCAgICAgIDIwMTEKKyNkZWZpbmUgTU5HX0ZOX1BST0NFU1NfQU5JX1NIT1cgICAgICAyMDEyCisjZGVmaW5lIE1OR19GTl9QUk9DRVNTX0FOSV9URVJNICAgICAgMjAxMworI2RlZmluZSBNTkdfRk5fUFJPQ0VTU19BTklfU0FWRSAgICAgIDIwMTQKKyNkZWZpbmUgTU5HX0ZOX1BST0NFU1NfQU5JX1NFRUsgICAgICAyMDE1CisjZGVmaW5lIE1OR19GTl9QUk9DRVNTX0FOSV9HQU1BICAgICAgMjAxNgorI2RlZmluZSBNTkdfRk5fUFJPQ0VTU19BTklfQ0hSTSAgICAgIDIwMTcKKyNkZWZpbmUgTU5HX0ZOX1BST0NFU1NfQU5JX1NSR0IgICAgICAyMDE4CisjZGVmaW5lIE1OR19GTl9QUk9DRVNTX0FOSV9JQ0NQICAgICAgMjAxOQorI2RlZmluZSBNTkdfRk5fUFJPQ0VTU19BTklfUExURSAgICAgIDIwMjAKKyNkZWZpbmUgTU5HX0ZOX1BST0NFU1NfQU5JX1RSTlMgICAgICAyMDIxCisjZGVmaW5lIE1OR19GTl9QUk9DRVNTX0FOSV9CS0dEICAgICAgMjAyMgorI2RlZmluZSBNTkdfRk5fUFJPQ0VTU19BTklfREhEUiAgICAgIDIwMjMKKyNkZWZpbmUgTU5HX0ZOX1BST0NFU1NfQU5JX1BST00gICAgICAyMDI0CisjZGVmaW5lIE1OR19GTl9QUk9DRVNTX0FOSV9JUE5HICAgICAgMjAyNQorI2RlZmluZSBNTkdfRk5fUFJPQ0VTU19BTklfSUpORyAgICAgIDIwMjYKKyNkZWZpbmUgTU5HX0ZOX1BST0NFU1NfQU5JX1BQTFQgICAgICAyMDI3CisjZGVmaW5lIE1OR19GTl9QUk9DRVNTX0FOSV9NQUdOICAgICAgMjAyOAorCisjZGVmaW5lIE1OR19GTl9QUk9DRVNTX0FOSV9JTUFHRSAgICAgMjA5MQorI2RlZmluZSBNTkdfRk5fUFJPQ0VTU19FVkVOVCAgICAgICAgIDIwOTIKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2RlZmluZSBNTkdfRk5fUkVTVE9SRV9CQUNLSU1BR0UgICAgIDIxMDEKKyNkZWZpbmUgTU5HX0ZOX1JFU1RPUkVfQkFDS0NPTE9SICAgICAyMTAyCisjZGVmaW5lIE1OR19GTl9SRVNUT1JFX0JHQ09MT1IgICAgICAgMjEwMworI2RlZmluZSBNTkdfRk5fUkVTVE9SRV9SR0I4ICAgICAgICAgIDIxMDQKKyNkZWZpbmUgTU5HX0ZOX1JFU1RPUkVfQkdSOCAgICAgICAgICAyMTA1CisjZGVmaW5lIE1OR19GTl9SRVNUT1JFX0JLR0QgICAgICAgICAgMjEwNgorI2RlZmluZSBNTkdfRk5fUkVTVE9SRV9CR1JYOCAgICAgICAgIDIxMDcKKyNkZWZpbmUgTU5HX0ZOX1JFU1RPUkVfUkdCNTY1ICAgICAgICAyMTA4CisjZGVmaW5lIE1OR19GTl9SRVNUT1JFX0JHUjU2NSAgICAgICAgMjEwOQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjZGVmaW5lIE1OR19GTl9JTklUX0lIRFIgICAgICAgICAgICAgMjIwMQorI2RlZmluZSBNTkdfRk5fSU5JVF9QTFRFICAgICAgICAgICAgIDIyMDIKKyNkZWZpbmUgTU5HX0ZOX0lOSVRfSURBVCAgICAgICAgICAgICAyMjAzCisjZGVmaW5lIE1OR19GTl9JTklUX0lFTkQgICAgICAgICAgICAgMjIwNAorI2RlZmluZSBNTkdfRk5fSU5JVF9UUk5TICAgICAgICAgICAgIDIyMDUKKyNkZWZpbmUgTU5HX0ZOX0lOSVRfR0FNQSAgICAgICAgICAgICAyMjA2CisjZGVmaW5lIE1OR19GTl9JTklUX0NIUk0gICAgICAgICAgICAgMjIwNworI2RlZmluZSBNTkdfRk5fSU5JVF9TUkdCICAgICAgICAgICAgIDIyMDgKKyNkZWZpbmUgTU5HX0ZOX0lOSVRfSUNDUCAgICAgICAgICAgICAyMjA5CisjZGVmaW5lIE1OR19GTl9JTklUX1RFWFQgICAgICAgICAgICAgMjIxMAorI2RlZmluZSBNTkdfRk5fSU5JVF9aVFhUICAgICAgICAgICAgIDIyMTEKKyNkZWZpbmUgTU5HX0ZOX0lOSVRfSVRYVCAgICAgICAgICAgICAyMjEyCisjZGVmaW5lIE1OR19GTl9JTklUX0JLR0QgICAgICAgICAgICAgMjIxMworI2RlZmluZSBNTkdfRk5fSU5JVF9QSFlTICAgICAgICAgICAgIDIyMTQKKyNkZWZpbmUgTU5HX0ZOX0lOSVRfU0JJVCAgICAgICAgICAgICAyMjE1CisjZGVmaW5lIE1OR19GTl9JTklUX1NQTFQgICAgICAgICAgICAgMjIxNgorI2RlZmluZSBNTkdfRk5fSU5JVF9ISVNUICAgICAgICAgICAgIDIyMTcKKyNkZWZpbmUgTU5HX0ZOX0lOSVRfVElNRSAgICAgICAgICAgICAyMjE4CisjZGVmaW5lIE1OR19GTl9JTklUX01IRFIgICAgICAgICAgICAgMjIxOQorI2RlZmluZSBNTkdfRk5fSU5JVF9NRU5EICAgICAgICAgICAgIDIyMjAKKyNkZWZpbmUgTU5HX0ZOX0lOSVRfTE9PUCAgICAgICAgICAgICAyMjIxCisjZGVmaW5lIE1OR19GTl9JTklUX0VOREwgICAgICAgICAgICAgMjIyMgorI2RlZmluZSBNTkdfRk5fSU5JVF9ERUZJICAgICAgICAgICAgIDIyMjMKKyNkZWZpbmUgTU5HX0ZOX0lOSVRfQkFTSSAgICAgICAgICAgICAyMjI0CisjZGVmaW5lIE1OR19GTl9JTklUX0NMT04gICAgICAgICAgICAgMjIyNQorI2RlZmluZSBNTkdfRk5fSU5JVF9QQVNUICAgICAgICAgICAgIDIyMjYKKyNkZWZpbmUgTU5HX0ZOX0lOSVRfRElTQyAgICAgICAgICAgICAyMjI3CisjZGVmaW5lIE1OR19GTl9JTklUX0JBQ0sgICAgICAgICAgICAgMjIyOAorI2RlZmluZSBNTkdfRk5fSU5JVF9GUkFNICAgICAgICAgICAgIDIyMjkKKyNkZWZpbmUgTU5HX0ZOX0lOSVRfTU9WRSAgICAgICAgICAgICAyMjMwCisjZGVmaW5lIE1OR19GTl9JTklUX0NMSVAgICAgICAgICAgICAgMjIzMQorI2RlZmluZSBNTkdfRk5fSU5JVF9TSE9XICAgICAgICAgICAgIDIyMzIKKyNkZWZpbmUgTU5HX0ZOX0lOSVRfVEVSTSAgICAgICAgICAgICAyMjMzCisjZGVmaW5lIE1OR19GTl9JTklUX1NBVkUgICAgICAgICAgICAgMjIzNAorI2RlZmluZSBNTkdfRk5fSU5JVF9TRUVLICAgICAgICAgICAgIDIyMzUKKyNkZWZpbmUgTU5HX0ZOX0lOSVRfRVhQSSAgICAgICAgICAgICAyMjM2CisjZGVmaW5lIE1OR19GTl9JTklUX0ZQUkkgICAgICAgICAgICAgMjIzNworI2RlZmluZSBNTkdfRk5fSU5JVF9ORUVEICAgICAgICAgICAgIDIyMzgKKyNkZWZpbmUgTU5HX0ZOX0lOSVRfUEhZRyAgICAgICAgICAgICAyMjM5CisjZGVmaW5lIE1OR19GTl9JTklUX0pIRFIgICAgICAgICAgICAgMjI0MAorI2RlZmluZSBNTkdfRk5fSU5JVF9KREFUICAgICAgICAgICAgIDIyNDEKKyNkZWZpbmUgTU5HX0ZOX0lOSVRfSlNFUCAgICAgICAgICAgICAyMjQyCisjZGVmaW5lIE1OR19GTl9JTklUX0RIRFIgICAgICAgICAgICAgMjI0MworI2RlZmluZSBNTkdfRk5fSU5JVF9QUk9NICAgICAgICAgICAgIDIyNDQKKyNkZWZpbmUgTU5HX0ZOX0lOSVRfSVBORyAgICAgICAgICAgICAyMjQ1CisjZGVmaW5lIE1OR19GTl9JTklUX1BQTFQgICAgICAgICAgICAgMjI0NgorI2RlZmluZSBNTkdfRk5fSU5JVF9JSk5HICAgICAgICAgICAgIDIyNDcKKyNkZWZpbmUgTU5HX0ZOX0lOSVRfRFJPUCAgICAgICAgICAgICAyMjQ4CisjZGVmaW5lIE1OR19GTl9JTklUX0RCWUsgICAgICAgICAgICAgMjI0OQorI2RlZmluZSBNTkdfRk5fSU5JVF9PUkRSICAgICAgICAgICAgIDIyNTAKKyNkZWZpbmUgTU5HX0ZOX0lOSVRfVU5LTk9XTiAgICAgICAgICAyMjUxCisjZGVmaW5lIE1OR19GTl9JTklUX01BR04gICAgICAgICAgICAgMjI1MgorI2RlZmluZSBNTkdfRk5fSU5JVF9KREFBICAgICAgICAgICAgIDIyNTMKKyNkZWZpbmUgTU5HX0ZOX0lOSVRfRVZOVCAgICAgICAgICAgICAyMjU0CisjZGVmaW5lIE1OR19GTl9JTklUX01QTkcgICAgICAgICAgICAgMjI1NQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjZGVmaW5lIE1OR19GTl9BU1NJR05fSUhEUiAgICAgICAgICAgMjMwMQorI2RlZmluZSBNTkdfRk5fQVNTSUdOX1BMVEUgICAgICAgICAgIDIzMDIKKyNkZWZpbmUgTU5HX0ZOX0FTU0lHTl9JREFUICAgICAgICAgICAyMzAzCisjZGVmaW5lIE1OR19GTl9BU1NJR05fSUVORCAgICAgICAgICAgMjMwNAorI2RlZmluZSBNTkdfRk5fQVNTSUdOX1RSTlMgICAgICAgICAgIDIzMDUKKyNkZWZpbmUgTU5HX0ZOX0FTU0lHTl9HQU1BICAgICAgICAgICAyMzA2CisjZGVmaW5lIE1OR19GTl9BU1NJR05fQ0hSTSAgICAgICAgICAgMjMwNworI2RlZmluZSBNTkdfRk5fQVNTSUdOX1NSR0IgICAgICAgICAgIDIzMDgKKyNkZWZpbmUgTU5HX0ZOX0FTU0lHTl9JQ0NQICAgICAgICAgICAyMzA5CisjZGVmaW5lIE1OR19GTl9BU1NJR05fVEVYVCAgICAgICAgICAgMjMxMAorI2RlZmluZSBNTkdfRk5fQVNTSUdOX1pUWFQgICAgICAgICAgIDIzMTEKKyNkZWZpbmUgTU5HX0ZOX0FTU0lHTl9JVFhUICAgICAgICAgICAyMzEyCisjZGVmaW5lIE1OR19GTl9BU1NJR05fQktHRCAgICAgICAgICAgMjMxMworI2RlZmluZSBNTkdfRk5fQVNTSUdOX1BIWVMgICAgICAgICAgIDIzMTQKKyNkZWZpbmUgTU5HX0ZOX0FTU0lHTl9TQklUICAgICAgICAgICAyMzE1CisjZGVmaW5lIE1OR19GTl9BU1NJR05fU1BMVCAgICAgICAgICAgMjMxNgorI2RlZmluZSBNTkdfRk5fQVNTSUdOX0hJU1QgICAgICAgICAgIDIzMTcKKyNkZWZpbmUgTU5HX0ZOX0FTU0lHTl9USU1FICAgICAgICAgICAyMzE4CisjZGVmaW5lIE1OR19GTl9BU1NJR05fTUhEUiAgICAgICAgICAgMjMxOQorI2RlZmluZSBNTkdfRk5fQVNTSUdOX01FTkQgICAgICAgICAgIDIzMjAKKyNkZWZpbmUgTU5HX0ZOX0FTU0lHTl9MT09QICAgICAgICAgICAyMzIxCisjZGVmaW5lIE1OR19GTl9BU1NJR05fRU5ETCAgICAgICAgICAgMjMyMgorI2RlZmluZSBNTkdfRk5fQVNTSUdOX0RFRkkgICAgICAgICAgIDIzMjMKKyNkZWZpbmUgTU5HX0ZOX0FTU0lHTl9CQVNJICAgICAgICAgICAyMzI0CisjZGVmaW5lIE1OR19GTl9BU1NJR05fQ0xPTiAgICAgICAgICAgMjMyNQorI2RlZmluZSBNTkdfRk5fQVNTSUdOX1BBU1QgICAgICAgICAgIDIzMjYKKyNkZWZpbmUgTU5HX0ZOX0FTU0lHTl9ESVNDICAgICAgICAgICAyMzI3CisjZGVmaW5lIE1OR19GTl9BU1NJR05fQkFDSyAgICAgICAgICAgMjMyOAorI2RlZmluZSBNTkdfRk5fQVNTSUdOX0ZSQU0gICAgICAgICAgIDIzMjkKKyNkZWZpbmUgTU5HX0ZOX0FTU0lHTl9NT1ZFICAgICAgICAgICAyMzMwCisjZGVmaW5lIE1OR19GTl9BU1NJR05fQ0xJUCAgICAgICAgICAgMjMzMQorI2RlZmluZSBNTkdfRk5fQVNTSUdOX1NIT1cgICAgICAgICAgIDIzMzIKKyNkZWZpbmUgTU5HX0ZOX0FTU0lHTl9URVJNICAgICAgICAgICAyMzMzCisjZGVmaW5lIE1OR19GTl9BU1NJR05fU0FWRSAgICAgICAgICAgMjMzNAorI2RlZmluZSBNTkdfRk5fQVNTSUdOX1NFRUsgICAgICAgICAgIDIzMzUKKyNkZWZpbmUgTU5HX0ZOX0FTU0lHTl9FWFBJICAgICAgICAgICAyMzM2CisjZGVmaW5lIE1OR19GTl9BU1NJR05fRlBSSSAgICAgICAgICAgMjMzNworI2RlZmluZSBNTkdfRk5fQVNTSUdOX05FRUQgICAgICAgICAgIDIzMzgKKyNkZWZpbmUgTU5HX0ZOX0FTU0lHTl9QSFlHICAgICAgICAgICAyMzM5CisjZGVmaW5lIE1OR19GTl9BU1NJR05fSkhEUiAgICAgICAgICAgMjM0MAorI2RlZmluZSBNTkdfRk5fQVNTSUdOX0pEQVQgICAgICAgICAgIDIzNDEKKyNkZWZpbmUgTU5HX0ZOX0FTU0lHTl9KU0VQICAgICAgICAgICAyMzQyCisjZGVmaW5lIE1OR19GTl9BU1NJR05fREhEUiAgICAgICAgICAgMjM0MworI2RlZmluZSBNTkdfRk5fQVNTSUdOX1BST00gICAgICAgICAgIDIzNDQKKyNkZWZpbmUgTU5HX0ZOX0FTU0lHTl9JUE5HICAgICAgICAgICAyMzQ1CisjZGVmaW5lIE1OR19GTl9BU1NJR05fUFBMVCAgICAgICAgICAgMjM0NgorI2RlZmluZSBNTkdfRk5fQVNTSUdOX0lKTkcgICAgICAgICAgIDIzNDcKKyNkZWZpbmUgTU5HX0ZOX0FTU0lHTl9EUk9QICAgICAgICAgICAyMzQ4CisjZGVmaW5lIE1OR19GTl9BU1NJR05fREJZSyAgICAgICAgICAgMjM0OQorI2RlZmluZSBNTkdfRk5fQVNTSUdOX09SRFIgICAgICAgICAgIDIzNTAKKyNkZWZpbmUgTU5HX0ZOX0FTU0lHTl9VTktOT1dOICAgICAgICAyMzUxCisjZGVmaW5lIE1OR19GTl9BU1NJR05fTUFHTiAgICAgICAgICAgMjM1MgorI2RlZmluZSBNTkdfRk5fQVNTSUdOX0pEQUEgICAgICAgICAgIDIzNTMKKyNkZWZpbmUgTU5HX0ZOX0FTU0lHTl9FVk5UICAgICAgICAgICAyMzU0CisjZGVmaW5lIE1OR19GTl9BU1NJR05fTVBORyAgICAgICAgICAgMjM1NQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjZGVmaW5lIE1OR19GTl9GUkVFX0lIRFIgICAgICAgICAgICAgMjQwMQorI2RlZmluZSBNTkdfRk5fRlJFRV9QTFRFICAgICAgICAgICAgIDI0MDIKKyNkZWZpbmUgTU5HX0ZOX0ZSRUVfSURBVCAgICAgICAgICAgICAyNDAzCisjZGVmaW5lIE1OR19GTl9GUkVFX0lFTkQgICAgICAgICAgICAgMjQwNAorI2RlZmluZSBNTkdfRk5fRlJFRV9UUk5TICAgICAgICAgICAgIDI0MDUKKyNkZWZpbmUgTU5HX0ZOX0ZSRUVfR0FNQSAgICAgICAgICAgICAyNDA2CisjZGVmaW5lIE1OR19GTl9GUkVFX0NIUk0gICAgICAgICAgICAgMjQwNworI2RlZmluZSBNTkdfRk5fRlJFRV9TUkdCICAgICAgICAgICAgIDI0MDgKKyNkZWZpbmUgTU5HX0ZOX0ZSRUVfSUNDUCAgICAgICAgICAgICAyNDA5CisjZGVmaW5lIE1OR19GTl9GUkVFX1RFWFQgICAgICAgICAgICAgMjQxMAorI2RlZmluZSBNTkdfRk5fRlJFRV9aVFhUICAgICAgICAgICAgIDI0MTEKKyNkZWZpbmUgTU5HX0ZOX0ZSRUVfSVRYVCAgICAgICAgICAgICAyNDEyCisjZGVmaW5lIE1OR19GTl9GUkVFX0JLR0QgICAgICAgICAgICAgMjQxMworI2RlZmluZSBNTkdfRk5fRlJFRV9QSFlTICAgICAgICAgICAgIDI0MTQKKyNkZWZpbmUgTU5HX0ZOX0ZSRUVfU0JJVCAgICAgICAgICAgICAyNDE1CisjZGVmaW5lIE1OR19GTl9GUkVFX1NQTFQgICAgICAgICAgICAgMjQxNgorI2RlZmluZSBNTkdfRk5fRlJFRV9ISVNUICAgICAgICAgICAgIDI0MTcKKyNkZWZpbmUgTU5HX0ZOX0ZSRUVfVElNRSAgICAgICAgICAgICAyNDE4CisjZGVmaW5lIE1OR19GTl9GUkVFX01IRFIgICAgICAgICAgICAgMjQxOQorI2RlZmluZSBNTkdfRk5fRlJFRV9NRU5EICAgICAgICAgICAgIDI0MjAKKyNkZWZpbmUgTU5HX0ZOX0ZSRUVfTE9PUCAgICAgICAgICAgICAyNDIxCisjZGVmaW5lIE1OR19GTl9GUkVFX0VOREwgICAgICAgICAgICAgMjQyMgorI2RlZmluZSBNTkdfRk5fRlJFRV9ERUZJICAgICAgICAgICAgIDI0MjMKKyNkZWZpbmUgTU5HX0ZOX0ZSRUVfQkFTSSAgICAgICAgICAgICAyNDI0CisjZGVmaW5lIE1OR19GTl9GUkVFX0NMT04gICAgICAgICAgICAgMjQyNQorI2RlZmluZSBNTkdfRk5fRlJFRV9QQVNUICAgICAgICAgICAgIDI0MjYKKyNkZWZpbmUgTU5HX0ZOX0ZSRUVfRElTQyAgICAgICAgICAgICAyNDI3CisjZGVmaW5lIE1OR19GTl9GUkVFX0JBQ0sgICAgICAgICAgICAgMjQyOAorI2RlZmluZSBNTkdfRk5fRlJFRV9GUkFNICAgICAgICAgICAgIDI0MjkKKyNkZWZpbmUgTU5HX0ZOX0ZSRUVfTU9WRSAgICAgICAgICAgICAyNDMwCisjZGVmaW5lIE1OR19GTl9GUkVFX0NMSVAgICAgICAgICAgICAgMjQzMQorI2RlZmluZSBNTkdfRk5fRlJFRV9TSE9XICAgICAgICAgICAgIDI0MzIKKyNkZWZpbmUgTU5HX0ZOX0ZSRUVfVEVSTSAgICAgICAgICAgICAyNDMzCisjZGVmaW5lIE1OR19GTl9GUkVFX1NBVkUgICAgICAgICAgICAgMjQzNAorI2RlZmluZSBNTkdfRk5fRlJFRV9TRUVLICAgICAgICAgICAgIDI0MzUKKyNkZWZpbmUgTU5HX0ZOX0ZSRUVfRVhQSSAgICAgICAgICAgICAyNDM2CisjZGVmaW5lIE1OR19GTl9GUkVFX0ZQUkkgICAgICAgICAgICAgMjQzNworI2RlZmluZSBNTkdfRk5fRlJFRV9ORUVEICAgICAgICAgICAgIDI0MzgKKyNkZWZpbmUgTU5HX0ZOX0ZSRUVfUEhZRyAgICAgICAgICAgICAyNDM5CisjZGVmaW5lIE1OR19GTl9GUkVFX0pIRFIgICAgICAgICAgICAgMjQ0MAorI2RlZmluZSBNTkdfRk5fRlJFRV9KREFUICAgICAgICAgICAgIDI0NDEKKyNkZWZpbmUgTU5HX0ZOX0ZSRUVfSlNFUCAgICAgICAgICAgICAyNDQyCisjZGVmaW5lIE1OR19GTl9GUkVFX0RIRFIgICAgICAgICAgICAgMjQ0MworI2RlZmluZSBNTkdfRk5fRlJFRV9QUk9NICAgICAgICAgICAgIDI0NDQKKyNkZWZpbmUgTU5HX0ZOX0ZSRUVfSVBORyAgICAgICAgICAgICAyNDQ1CisjZGVmaW5lIE1OR19GTl9GUkVFX1BQTFQgICAgICAgICAgICAgMjQ0NgorI2RlZmluZSBNTkdfRk5fRlJFRV9JSk5HICAgICAgICAgICAgIDI0NDcKKyNkZWZpbmUgTU5HX0ZOX0ZSRUVfRFJPUCAgICAgICAgICAgICAyNDQ4CisjZGVmaW5lIE1OR19GTl9GUkVFX0RCWUsgICAgICAgICAgICAgMjQ0OQorI2RlZmluZSBNTkdfRk5fRlJFRV9PUkRSICAgICAgICAgICAgIDI0NTAKKyNkZWZpbmUgTU5HX0ZOX0ZSRUVfVU5LTk9XTiAgICAgICAgICAyNDUxCisjZGVmaW5lIE1OR19GTl9GUkVFX01BR04gICAgICAgICAgICAgMjQ1MgorI2RlZmluZSBNTkdfRk5fRlJFRV9KREFBICAgICAgICAgICAgIDI0NTMKKyNkZWZpbmUgTU5HX0ZOX0ZSRUVfRVZOVCAgICAgICAgICAgICAyNDU0CisjZGVmaW5lIE1OR19GTl9GUkVFX01QTkcgICAgICAgICAgICAgMjQ1NQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjZGVmaW5lIE1OR19GTl9SRUFEX0lIRFIgICAgICAgICAgICAgMjYwMQorI2RlZmluZSBNTkdfRk5fUkVBRF9QTFRFICAgICAgICAgICAgIDI2MDIKKyNkZWZpbmUgTU5HX0ZOX1JFQURfSURBVCAgICAgICAgICAgICAyNjAzCisjZGVmaW5lIE1OR19GTl9SRUFEX0lFTkQgICAgICAgICAgICAgMjYwNAorI2RlZmluZSBNTkdfRk5fUkVBRF9UUk5TICAgICAgICAgICAgIDI2MDUKKyNkZWZpbmUgTU5HX0ZOX1JFQURfR0FNQSAgICAgICAgICAgICAyNjA2CisjZGVmaW5lIE1OR19GTl9SRUFEX0NIUk0gICAgICAgICAgICAgMjYwNworI2RlZmluZSBNTkdfRk5fUkVBRF9TUkdCICAgICAgICAgICAgIDI2MDgKKyNkZWZpbmUgTU5HX0ZOX1JFQURfSUNDUCAgICAgICAgICAgICAyNjA5CisjZGVmaW5lIE1OR19GTl9SRUFEX1RFWFQgICAgICAgICAgICAgMjYxMAorI2RlZmluZSBNTkdfRk5fUkVBRF9aVFhUICAgICAgICAgICAgIDI2MTEKKyNkZWZpbmUgTU5HX0ZOX1JFQURfSVRYVCAgICAgICAgICAgICAyNjEyCisjZGVmaW5lIE1OR19GTl9SRUFEX0JLR0QgICAgICAgICAgICAgMjYxMworI2RlZmluZSBNTkdfRk5fUkVBRF9QSFlTICAgICAgICAgICAgIDI2MTQKKyNkZWZpbmUgTU5HX0ZOX1JFQURfU0JJVCAgICAgICAgICAgICAyNjE1CisjZGVmaW5lIE1OR19GTl9SRUFEX1NQTFQgICAgICAgICAgICAgMjYxNgorI2RlZmluZSBNTkdfRk5fUkVBRF9ISVNUICAgICAgICAgICAgIDI2MTcKKyNkZWZpbmUgTU5HX0ZOX1JFQURfVElNRSAgICAgICAgICAgICAyNjE4CisjZGVmaW5lIE1OR19GTl9SRUFEX01IRFIgICAgICAgICAgICAgMjYxOQorI2RlZmluZSBNTkdfRk5fUkVBRF9NRU5EICAgICAgICAgICAgIDI2MjAKKyNkZWZpbmUgTU5HX0ZOX1JFQURfTE9PUCAgICAgICAgICAgICAyNjIxCisjZGVmaW5lIE1OR19GTl9SRUFEX0VOREwgICAgICAgICAgICAgMjYyMgorI2RlZmluZSBNTkdfRk5fUkVBRF9ERUZJICAgICAgICAgICAgIDI2MjMKKyNkZWZpbmUgTU5HX0ZOX1JFQURfQkFTSSAgICAgICAgICAgICAyNjI0CisjZGVmaW5lIE1OR19GTl9SRUFEX0NMT04gICAgICAgICAgICAgMjYyNQorI2RlZmluZSBNTkdfRk5fUkVBRF9QQVNUICAgICAgICAgICAgIDI2MjYKKyNkZWZpbmUgTU5HX0ZOX1JFQURfRElTQyAgICAgICAgICAgICAyNjI3CisjZGVmaW5lIE1OR19GTl9SRUFEX0JBQ0sgICAgICAgICAgICAgMjYyOAorI2RlZmluZSBNTkdfRk5fUkVBRF9GUkFNICAgICAgICAgICAgIDI2MjkKKyNkZWZpbmUgTU5HX0ZOX1JFQURfTU9WRSAgICAgICAgICAgICAyNjMwCisjZGVmaW5lIE1OR19GTl9SRUFEX0NMSVAgICAgICAgICAgICAgMjYzMQorI2RlZmluZSBNTkdfRk5fUkVBRF9TSE9XICAgICAgICAgICAgIDI2MzIKKyNkZWZpbmUgTU5HX0ZOX1JFQURfVEVSTSAgICAgICAgICAgICAyNjMzCisjZGVmaW5lIE1OR19GTl9SRUFEX1NBVkUgICAgICAgICAgICAgMjYzNAorI2RlZmluZSBNTkdfRk5fUkVBRF9TRUVLICAgICAgICAgICAgIDI2MzUKKyNkZWZpbmUgTU5HX0ZOX1JFQURfRVhQSSAgICAgICAgICAgICAyNjM2CisjZGVmaW5lIE1OR19GTl9SRUFEX0ZQUkkgICAgICAgICAgICAgMjYzNworI2RlZmluZSBNTkdfRk5fUkVBRF9ORUVEICAgICAgICAgICAgIDI2MzgKKyNkZWZpbmUgTU5HX0ZOX1JFQURfUEhZRyAgICAgICAgICAgICAyNjM5CisjZGVmaW5lIE1OR19GTl9SRUFEX0pIRFIgICAgICAgICAgICAgMjY0MAorI2RlZmluZSBNTkdfRk5fUkVBRF9KREFUICAgICAgICAgICAgIDI2NDEKKyNkZWZpbmUgTU5HX0ZOX1JFQURfSlNFUCAgICAgICAgICAgICAyNjQyCisjZGVmaW5lIE1OR19GTl9SRUFEX0RIRFIgICAgICAgICAgICAgMjY0MworI2RlZmluZSBNTkdfRk5fUkVBRF9QUk9NICAgICAgICAgICAgIDI2NDQKKyNkZWZpbmUgTU5HX0ZOX1JFQURfSVBORyAgICAgICAgICAgICAyNjQ1CisjZGVmaW5lIE1OR19GTl9SRUFEX1BQTFQgICAgICAgICAgICAgMjY0NgorI2RlZmluZSBNTkdfRk5fUkVBRF9JSk5HICAgICAgICAgICAgIDI2NDcKKyNkZWZpbmUgTU5HX0ZOX1JFQURfRFJPUCAgICAgICAgICAgICAyNjQ4CisjZGVmaW5lIE1OR19GTl9SRUFEX0RCWUsgICAgICAgICAgICAgMjY0OQorI2RlZmluZSBNTkdfRk5fUkVBRF9PUkRSICAgICAgICAgICAgIDI2NTAKKyNkZWZpbmUgTU5HX0ZOX1JFQURfVU5LTk9XTiAgICAgICAgICAyNjUxCisjZGVmaW5lIE1OR19GTl9SRUFEX01BR04gICAgICAgICAgICAgMjY1MgorI2RlZmluZSBNTkdfRk5fUkVBRF9KREFBICAgICAgICAgICAgIDI2NTMKKyNkZWZpbmUgTU5HX0ZOX1JFQURfRVZOVCAgICAgICAgICAgICAyNjU0CisjZGVmaW5lIE1OR19GTl9SRUFEX01QTkcgICAgICAgICAgICAgMjY1NQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjZGVmaW5lIE1OR19GTl9XUklURV9JSERSICAgICAgICAgICAgMjgwMQorI2RlZmluZSBNTkdfRk5fV1JJVEVfUExURSAgICAgICAgICAgIDI4MDIKKyNkZWZpbmUgTU5HX0ZOX1dSSVRFX0lEQVQgICAgICAgICAgICAyODAzCisjZGVmaW5lIE1OR19GTl9XUklURV9JRU5EICAgICAgICAgICAgMjgwNAorI2RlZmluZSBNTkdfRk5fV1JJVEVfVFJOUyAgICAgICAgICAgIDI4MDUKKyNkZWZpbmUgTU5HX0ZOX1dSSVRFX0dBTUEgICAgICAgICAgICAyODA2CisjZGVmaW5lIE1OR19GTl9XUklURV9DSFJNICAgICAgICAgICAgMjgwNworI2RlZmluZSBNTkdfRk5fV1JJVEVfU1JHQiAgICAgICAgICAgIDI4MDgKKyNkZWZpbmUgTU5HX0ZOX1dSSVRFX0lDQ1AgICAgICAgICAgICAyODA5CisjZGVmaW5lIE1OR19GTl9XUklURV9URVhUICAgICAgICAgICAgMjgxMAorI2RlZmluZSBNTkdfRk5fV1JJVEVfWlRYVCAgICAgICAgICAgIDI4MTEKKyNkZWZpbmUgTU5HX0ZOX1dSSVRFX0lUWFQgICAgICAgICAgICAyODEyCisjZGVmaW5lIE1OR19GTl9XUklURV9CS0dEICAgICAgICAgICAgMjgxMworI2RlZmluZSBNTkdfRk5fV1JJVEVfUEhZUyAgICAgICAgICAgIDI4MTQKKyNkZWZpbmUgTU5HX0ZOX1dSSVRFX1NCSVQgICAgICAgICAgICAyODE1CisjZGVmaW5lIE1OR19GTl9XUklURV9TUExUICAgICAgICAgICAgMjgxNgorI2RlZmluZSBNTkdfRk5fV1JJVEVfSElTVCAgICAgICAgICAgIDI4MTcKKyNkZWZpbmUgTU5HX0ZOX1dSSVRFX1RJTUUgICAgICAgICAgICAyODE4CisjZGVmaW5lIE1OR19GTl9XUklURV9NSERSICAgICAgICAgICAgMjgxOQorI2RlZmluZSBNTkdfRk5fV1JJVEVfTUVORCAgICAgICAgICAgIDI4MjAKKyNkZWZpbmUgTU5HX0ZOX1dSSVRFX0xPT1AgICAgICAgICAgICAyODIxCisjZGVmaW5lIE1OR19GTl9XUklURV9FTkRMICAgICAgICAgICAgMjgyMgorI2RlZmluZSBNTkdfRk5fV1JJVEVfREVGSSAgICAgICAgICAgIDI4MjMKKyNkZWZpbmUgTU5HX0ZOX1dSSVRFX0JBU0kgICAgICAgICAgICAyODI0CisjZGVmaW5lIE1OR19GTl9XUklURV9DTE9OICAgICAgICAgICAgMjgyNQorI2RlZmluZSBNTkdfRk5fV1JJVEVfUEFTVCAgICAgICAgICAgIDI4MjYKKyNkZWZpbmUgTU5HX0ZOX1dSSVRFX0RJU0MgICAgICAgICAgICAyODI3CisjZGVmaW5lIE1OR19GTl9XUklURV9CQUNLICAgICAgICAgICAgMjgyOAorI2RlZmluZSBNTkdfRk5fV1JJVEVfRlJBTSAgICAgICAgICAgIDI4MjkKKyNkZWZpbmUgTU5HX0ZOX1dSSVRFX01PVkUgICAgICAgICAgICAyODMwCisjZGVmaW5lIE1OR19GTl9XUklURV9DTElQICAgICAgICAgICAgMjgzMQorI2RlZmluZSBNTkdfRk5fV1JJVEVfU0hPVyAgICAgICAgICAgIDI4MzIKKyNkZWZpbmUgTU5HX0ZOX1dSSVRFX1RFUk0gICAgICAgICAgICAyODMzCisjZGVmaW5lIE1OR19GTl9XUklURV9TQVZFICAgICAgICAgICAgMjgzNAorI2RlZmluZSBNTkdfRk5fV1JJVEVfU0VFSyAgICAgICAgICAgIDI4MzUKKyNkZWZpbmUgTU5HX0ZOX1dSSVRFX0VYUEkgICAgICAgICAgICAyODM2CisjZGVmaW5lIE1OR19GTl9XUklURV9GUFJJICAgICAgICAgICAgMjgzNworI2RlZmluZSBNTkdfRk5fV1JJVEVfTkVFRCAgICAgICAgICAgIDI4MzgKKyNkZWZpbmUgTU5HX0ZOX1dSSVRFX1BIWUcgICAgICAgICAgICAyODM5CisjZGVmaW5lIE1OR19GTl9XUklURV9KSERSICAgICAgICAgICAgMjg0MAorI2RlZmluZSBNTkdfRk5fV1JJVEVfSkRBVCAgICAgICAgICAgIDI4NDEKKyNkZWZpbmUgTU5HX0ZOX1dSSVRFX0pTRVAgICAgICAgICAgICAyODQyCisjZGVmaW5lIE1OR19GTl9XUklURV9ESERSICAgICAgICAgICAgMjg0MworI2RlZmluZSBNTkdfRk5fV1JJVEVfUFJPTSAgICAgICAgICAgIDI4NDQKKyNkZWZpbmUgTU5HX0ZOX1dSSVRFX0lQTkcgICAgICAgICAgICAyODQ1CisjZGVmaW5lIE1OR19GTl9XUklURV9QUExUICAgICAgICAgICAgMjg0NgorI2RlZmluZSBNTkdfRk5fV1JJVEVfSUpORyAgICAgICAgICAgIDI4NDcKKyNkZWZpbmUgTU5HX0ZOX1dSSVRFX0RST1AgICAgICAgICAgICAyODQ4CisjZGVmaW5lIE1OR19GTl9XUklURV9EQllLICAgICAgICAgICAgMjg0OQorI2RlZmluZSBNTkdfRk5fV1JJVEVfT1JEUiAgICAgICAgICAgIDI4NTAKKyNkZWZpbmUgTU5HX0ZOX1dSSVRFX1VOS05PV04gICAgICAgICAyODUxCisjZGVmaW5lIE1OR19GTl9XUklURV9NQUdOICAgICAgICAgICAgMjg1MgorI2RlZmluZSBNTkdfRk5fV1JJVEVfSkRBQSAgICAgICAgICAgIDI4NTMKKyNkZWZpbmUgTU5HX0ZOX1dSSVRFX0VWTlQgICAgICAgICAgICAyODU0CisjZGVmaW5lIE1OR19GTl9XUklURV9NUE5HICAgICAgICAgICAgMjg1NQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjZGVmaW5lIE1OR19GTl9aTElCX0lOSVRJQUxJWkUgICAgICAgMzAwMQorI2RlZmluZSBNTkdfRk5fWkxJQl9DTEVBTlVQICAgICAgICAgIDMwMDIKKyNkZWZpbmUgTU5HX0ZOX1pMSUJfSU5GTEFURUlOSVQgICAgICAzMDAzCisjZGVmaW5lIE1OR19GTl9aTElCX0lORkxBVEVST1dTICAgICAgMzAwNAorI2RlZmluZSBNTkdfRk5fWkxJQl9JTkZMQVRFREFUQSAgICAgIDMwMDUKKyNkZWZpbmUgTU5HX0ZOX1pMSUJfSU5GTEFURUZSRUUgICAgICAzMDA2CisjZGVmaW5lIE1OR19GTl9aTElCX0RFRkxBVEVJTklUICAgICAgMzAwNworI2RlZmluZSBNTkdfRk5fWkxJQl9ERUZMQVRFUk9XUyAgICAgIDMwMDgKKyNkZWZpbmUgTU5HX0ZOX1pMSUJfREVGTEFURURBVEEgICAgICAzMDA5CisjZGVmaW5lIE1OR19GTl9aTElCX0RFRkxBVEVGUkVFICAgICAgMzAxMAorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjZGVmaW5lIE1OR19GTl9QUk9DRVNTX0RJU1BMQVlfSUhEUiAgMzIwMQorI2RlZmluZSBNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX1BMVEUgIDMyMDIKKyNkZWZpbmUgTU5HX0ZOX1BST0NFU1NfRElTUExBWV9JREFUICAzMjAzCisjZGVmaW5lIE1OR19GTl9QUk9DRVNTX0RJU1BMQVlfSUVORCAgMzIwNAorI2RlZmluZSBNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX1RSTlMgIDMyMDUKKyNkZWZpbmUgTU5HX0ZOX1BST0NFU1NfRElTUExBWV9HQU1BICAzMjA2CisjZGVmaW5lIE1OR19GTl9QUk9DRVNTX0RJU1BMQVlfQ0hSTSAgMzIwNworI2RlZmluZSBNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX1NSR0IgIDMyMDgKKyNkZWZpbmUgTU5HX0ZOX1BST0NFU1NfRElTUExBWV9JQ0NQICAzMjA5CisjZGVmaW5lIE1OR19GTl9QUk9DRVNTX0RJU1BMQVlfQktHRCAgMzIxMAorI2RlZmluZSBNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX1BIWVMgIDMyMTEKKyNkZWZpbmUgTU5HX0ZOX1BST0NFU1NfRElTUExBWV9TQklUICAzMjEyCisjZGVmaW5lIE1OR19GTl9QUk9DRVNTX0RJU1BMQVlfU1BMVCAgMzIxMworI2RlZmluZSBNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX0hJU1QgIDMyMTQKKyNkZWZpbmUgTU5HX0ZOX1BST0NFU1NfRElTUExBWV9NSERSICAzMjE1CisjZGVmaW5lIE1OR19GTl9QUk9DRVNTX0RJU1BMQVlfTUVORCAgMzIxNgorI2RlZmluZSBNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX0xPT1AgIDMyMTcKKyNkZWZpbmUgTU5HX0ZOX1BST0NFU1NfRElTUExBWV9FTkRMICAzMjE4CisjZGVmaW5lIE1OR19GTl9QUk9DRVNTX0RJU1BMQVlfREVGSSAgMzIxOQorI2RlZmluZSBNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX0JBU0kgIDMyMjAKKyNkZWZpbmUgTU5HX0ZOX1BST0NFU1NfRElTUExBWV9DTE9OICAzMjIxCisjZGVmaW5lIE1OR19GTl9QUk9DRVNTX0RJU1BMQVlfUEFTVCAgMzIyMgorI2RlZmluZSBNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX0RJU0MgIDMyMjMKKyNkZWZpbmUgTU5HX0ZOX1BST0NFU1NfRElTUExBWV9CQUNLICAzMjI0CisjZGVmaW5lIE1OR19GTl9QUk9DRVNTX0RJU1BMQVlfRlJBTSAgMzIyNQorI2RlZmluZSBNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX01PVkUgIDMyMjYKKyNkZWZpbmUgTU5HX0ZOX1BST0NFU1NfRElTUExBWV9DTElQICAzMjI3CisjZGVmaW5lIE1OR19GTl9QUk9DRVNTX0RJU1BMQVlfU0hPVyAgMzIyOAorI2RlZmluZSBNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX1RFUk0gIDMyMjkKKyNkZWZpbmUgTU5HX0ZOX1BST0NFU1NfRElTUExBWV9TQVZFICAzMjMwCisjZGVmaW5lIE1OR19GTl9QUk9DRVNTX0RJU1BMQVlfU0VFSyAgMzIzMQorI2RlZmluZSBNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX0VYUEkgIDMyMzIKKyNkZWZpbmUgTU5HX0ZOX1BST0NFU1NfRElTUExBWV9GUFJJICAzMjMzCisjZGVmaW5lIE1OR19GTl9QUk9DRVNTX0RJU1BMQVlfTkVFRCAgMzIzNAorI2RlZmluZSBNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX1BIWUcgIDMyMzUKKyNkZWZpbmUgTU5HX0ZOX1BST0NFU1NfRElTUExBWV9KSERSICAzMjM2CisjZGVmaW5lIE1OR19GTl9QUk9DRVNTX0RJU1BMQVlfSkRBVCAgMzIzNworI2RlZmluZSBNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX0pTRVAgIDMyMzgKKyNkZWZpbmUgTU5HX0ZOX1BST0NFU1NfRElTUExBWV9ESERSICAzMjM5CisjZGVmaW5lIE1OR19GTl9QUk9DRVNTX0RJU1BMQVlfUFJPTSAgMzI0MAorI2RlZmluZSBNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX0lQTkcgIDMyNDEKKyNkZWZpbmUgTU5HX0ZOX1BST0NFU1NfRElTUExBWV9QUExUICAzMjQyCisjZGVmaW5lIE1OR19GTl9QUk9DRVNTX0RJU1BMQVlfSUpORyAgMzI0MworI2RlZmluZSBNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX0RST1AgIDMyNDQKKyNkZWZpbmUgTU5HX0ZOX1BST0NFU1NfRElTUExBWV9EQllLICAzMjQ1CisjZGVmaW5lIE1OR19GTl9QUk9DRVNTX0RJU1BMQVlfT1JEUiAgMzI0NgorI2RlZmluZSBNTkdfRk5fUFJPQ0VTU19ESVNQTEFZX01BR04gIDMyNDcKKyNkZWZpbmUgTU5HX0ZOX1BST0NFU1NfRElTUExBWV9KREFBICAzMjQ4CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNkZWZpbmUgTU5HX0ZOX0pQRUdfSU5JVElBTElaRSAgICAgICAzNDAxCisjZGVmaW5lIE1OR19GTl9KUEVHX0NMRUFOVVAgICAgICAgICAgMzQwMgorI2RlZmluZSBNTkdfRk5fSlBFR19ERUNPTVBSRVNTSU5JVCAgIDM0MDMKKyNkZWZpbmUgTU5HX0ZOX0pQRUdfREVDT01QUkVTU0RBVEEgICAzNDA0CisjZGVmaW5lIE1OR19GTl9KUEVHX0RFQ09NUFJFU1NGUkVFICAgMzQwNQorCisjZGVmaW5lIE1OR19GTl9TVE9SRV9KUEVHX0c4ICAgICAgICAgMzUwMQorI2RlZmluZSBNTkdfRk5fU1RPUkVfSlBFR19SR0I4ICAgICAgIDM1MDIKKyNkZWZpbmUgTU5HX0ZOX1NUT1JFX0pQRUdfRzEyICAgICAgICAzNTAzCisjZGVmaW5lIE1OR19GTl9TVE9SRV9KUEVHX1JHQjEyICAgICAgMzUwNAorI2RlZmluZSBNTkdfRk5fU1RPUkVfSlBFR19HQTggICAgICAgIDM1MDUKKyNkZWZpbmUgTU5HX0ZOX1NUT1JFX0pQRUdfUkdCQTggICAgICAzNTA2CisjZGVmaW5lIE1OR19GTl9TVE9SRV9KUEVHX0dBMTIgICAgICAgMzUwNworI2RlZmluZSBNTkdfRk5fU1RPUkVfSlBFR19SR0JBMTIgICAgIDM1MDgKKyNkZWZpbmUgTU5HX0ZOX1NUT1JFX0pQRUdfRzhfQUxQSEEgICAzNTA5CisjZGVmaW5lIE1OR19GTl9TVE9SRV9KUEVHX1JHQjhfQUxQSEEgMzUxMAorCisjZGVmaW5lIE1OR19GTl9JTklUX0pQRUdfQTFfTkkgICAgICAgMzUxMQorI2RlZmluZSBNTkdfRk5fSU5JVF9KUEVHX0EyX05JICAgICAgIDM1MTIKKyNkZWZpbmUgTU5HX0ZOX0lOSVRfSlBFR19BNF9OSSAgICAgICAzNTEzCisjZGVmaW5lIE1OR19GTl9JTklUX0pQRUdfQThfTkkgICAgICAgMzUxNAorI2RlZmluZSBNTkdfRk5fSU5JVF9KUEVHX0ExNl9OSSAgICAgIDM1MTUKKworI2RlZmluZSBNTkdfRk5fU1RPUkVfSlBFR19HOF9BMSAgICAgIDM1MjEKKyNkZWZpbmUgTU5HX0ZOX1NUT1JFX0pQRUdfRzhfQTIgICAgICAzNTIyCisjZGVmaW5lIE1OR19GTl9TVE9SRV9KUEVHX0c4X0E0ICAgICAgMzUyMworI2RlZmluZSBNTkdfRk5fU1RPUkVfSlBFR19HOF9BOCAgICAgIDM1MjQKKyNkZWZpbmUgTU5HX0ZOX1NUT1JFX0pQRUdfRzhfQTE2ICAgICAzNTI1CisKKyNkZWZpbmUgTU5HX0ZOX1NUT1JFX0pQRUdfUkdCOF9BMSAgICAzNTMxCisjZGVmaW5lIE1OR19GTl9TVE9SRV9KUEVHX1JHQjhfQTIgICAgMzUzMgorI2RlZmluZSBNTkdfRk5fU1RPUkVfSlBFR19SR0I4X0E0ICAgIDM1MzMKKyNkZWZpbmUgTU5HX0ZOX1NUT1JFX0pQRUdfUkdCOF9BOCAgICAzNTM0CisjZGVmaW5lIE1OR19GTl9TVE9SRV9KUEVHX1JHQjhfQTE2ICAgMzUzNQorCisjZGVmaW5lIE1OR19GTl9TVE9SRV9KUEVHX0cxMl9BMSAgICAgMzU0MQorI2RlZmluZSBNTkdfRk5fU1RPUkVfSlBFR19HMTJfQTIgICAgIDM1NDIKKyNkZWZpbmUgTU5HX0ZOX1NUT1JFX0pQRUdfRzEyX0E0ICAgICAzNTQzCisjZGVmaW5lIE1OR19GTl9TVE9SRV9KUEVHX0cxMl9BOCAgICAgMzU0NAorI2RlZmluZSBNTkdfRk5fU1RPUkVfSlBFR19HMTJfQTE2ICAgIDM1NDUKKworI2RlZmluZSBNTkdfRk5fU1RPUkVfSlBFR19SR0IxMl9BMSAgIDM1NTEKKyNkZWZpbmUgTU5HX0ZOX1NUT1JFX0pQRUdfUkdCMTJfQTIgICAzNTUyCisjZGVmaW5lIE1OR19GTl9TVE9SRV9KUEVHX1JHQjEyX0E0ICAgMzU1MworI2RlZmluZSBNTkdfRk5fU1RPUkVfSlBFR19SR0IxMl9BOCAgIDM1NTQKKyNkZWZpbmUgTU5HX0ZOX1NUT1JFX0pQRUdfUkdCMTJfQTE2ICAzNTU1CisKKyNkZWZpbmUgTU5HX0ZOX05FWFRfSlBFR19BTFBIQVJPVyAgICAzNTkxCisjZGVmaW5lIE1OR19GTl9ORVhUX0pQRUdfUk9XICAgICAgICAgMzU5MgorI2RlZmluZSBNTkdfRk5fRElTUExBWV9KUEVHX1JPV1MgICAgIDM1OTMKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2RlZmluZSBNTkdfRk5fTUFHTklGWV9HOF9YMSAgICAgICAgIDM3MDEKKyNkZWZpbmUgTU5HX0ZOX01BR05JRllfRzhfWDIgICAgICAgICAzNzAyCisjZGVmaW5lIE1OR19GTl9NQUdOSUZZX1JHQjhfWDEgICAgICAgMzcwMworI2RlZmluZSBNTkdfRk5fTUFHTklGWV9SR0I4X1gyICAgICAgIDM3MDQKKyNkZWZpbmUgTU5HX0ZOX01BR05JRllfR0E4X1gxICAgICAgICAzNzA1CisjZGVmaW5lIE1OR19GTl9NQUdOSUZZX0dBOF9YMiAgICAgICAgMzcwNgorI2RlZmluZSBNTkdfRk5fTUFHTklGWV9HQThfWDMgICAgICAgIDM3MDcKKyNkZWZpbmUgTU5HX0ZOX01BR05JRllfR0E4X1g0ICAgICAgICAzNzA4CisjZGVmaW5lIE1OR19GTl9NQUdOSUZZX1JHQkE4X1gxICAgICAgMzcwOQorI2RlZmluZSBNTkdfRk5fTUFHTklGWV9SR0JBOF9YMiAgICAgIDM3MTAKKyNkZWZpbmUgTU5HX0ZOX01BR05JRllfUkdCQThfWDMgICAgICAzNzExCisjZGVmaW5lIE1OR19GTl9NQUdOSUZZX1JHQkE4X1g0ICAgICAgMzcxMgorI2RlZmluZSBNTkdfRk5fTUFHTklGWV9HOF9YMyAgICAgICAgIDM3MTMKKyNkZWZpbmUgTU5HX0ZOX01BR05JRllfUkdCOF9YMyAgICAgICAzNzE0CisjZGVmaW5lIE1OR19GTl9NQUdOSUZZX0dBOF9YNSAgICAgICAgMzcxNQorI2RlZmluZSBNTkdfRk5fTUFHTklGWV9SR0JBOF9YNSAgICAgIDM3MTYKKworI2RlZmluZSBNTkdfRk5fTUFHTklGWV9HMTZfWDEgICAgICAgIDM3MjUKKyNkZWZpbmUgTU5HX0ZOX01BR05JRllfRzE2X1gyICAgICAgICAzNzI2CisjZGVmaW5lIE1OR19GTl9NQUdOSUZZX1JHQjE2X1gxICAgICAgMzcyNworI2RlZmluZSBNTkdfRk5fTUFHTklGWV9SR0IxNl9YMiAgICAgIDM3MjgKKyNkZWZpbmUgTU5HX0ZOX01BR05JRllfR0ExNl9YMSAgICAgICAzNzI5CisjZGVmaW5lIE1OR19GTl9NQUdOSUZZX0dBMTZfWDIgICAgICAgMzczMAorI2RlZmluZSBNTkdfRk5fTUFHTklGWV9HQTE2X1gzICAgICAgIDM3MzEKKyNkZWZpbmUgTU5HX0ZOX01BR05JRllfR0ExNl9YNCAgICAgICAzNzMyCisjZGVmaW5lIE1OR19GTl9NQUdOSUZZX1JHQkExNl9YMSAgICAgMzczMworI2RlZmluZSBNTkdfRk5fTUFHTklGWV9SR0JBMTZfWDIgICAgIDM3MzQKKyNkZWZpbmUgTU5HX0ZOX01BR05JRllfUkdCQTE2X1gzICAgICAzNzM1CisjZGVmaW5lIE1OR19GTl9NQUdOSUZZX1JHQkExNl9YNCAgICAgMzczNgorI2RlZmluZSBNTkdfRk5fTUFHTklGWV9HMTZfWDMgICAgICAgIDM3MzcKKyNkZWZpbmUgTU5HX0ZOX01BR05JRllfUkdCMTZfWDMgICAgICAzNzM4CisjZGVmaW5lIE1OR19GTl9NQUdOSUZZX0dBMTZfWDUgICAgICAgMzczOQorI2RlZmluZSBNTkdfRk5fTUFHTklGWV9SR0JBMTZfWDUgICAgIDM3NDAKKworI2RlZmluZSBNTkdfRk5fTUFHTklGWV9HOF9ZMSAgICAgICAgIDM3NTEKKyNkZWZpbmUgTU5HX0ZOX01BR05JRllfRzhfWTIgICAgICAgICAzNzUyCisjZGVmaW5lIE1OR19GTl9NQUdOSUZZX1JHQjhfWTEgICAgICAgMzc1MworI2RlZmluZSBNTkdfRk5fTUFHTklGWV9SR0I4X1kyICAgICAgIDM3NTQKKyNkZWZpbmUgTU5HX0ZOX01BR05JRllfR0E4X1kxICAgICAgICAzNzU1CisjZGVmaW5lIE1OR19GTl9NQUdOSUZZX0dBOF9ZMiAgICAgICAgMzc1NgorI2RlZmluZSBNTkdfRk5fTUFHTklGWV9HQThfWTMgICAgICAgIDM3NTcKKyNkZWZpbmUgTU5HX0ZOX01BR05JRllfR0E4X1k0ICAgICAgICAzNzU4CisjZGVmaW5lIE1OR19GTl9NQUdOSUZZX1JHQkE4X1kxICAgICAgMzc1OQorI2RlZmluZSBNTkdfRk5fTUFHTklGWV9SR0JBOF9ZMiAgICAgIDM3NjAKKyNkZWZpbmUgTU5HX0ZOX01BR05JRllfUkdCQThfWTMgICAgICAzNzYxCisjZGVmaW5lIE1OR19GTl9NQUdOSUZZX1JHQkE4X1k0ICAgICAgMzc2MgorI2RlZmluZSBNTkdfRk5fTUFHTklGWV9HOF9ZMyAgICAgICAgIDM3NjMKKyNkZWZpbmUgTU5HX0ZOX01BR05JRllfUkdCOF9ZMyAgICAgICAzNzY0CisjZGVmaW5lIE1OR19GTl9NQUdOSUZZX0dBOF9ZNSAgICAgICAgMzc2NQorI2RlZmluZSBNTkdfRk5fTUFHTklGWV9SR0JBOF9ZNSAgICAgIDM3NjYKKworI2RlZmluZSBNTkdfRk5fTUFHTklGWV9HMTZfWTEgICAgICAgIDM3NzUKKyNkZWZpbmUgTU5HX0ZOX01BR05JRllfRzE2X1kyICAgICAgICAzNzc2CisjZGVmaW5lIE1OR19GTl9NQUdOSUZZX1JHQjE2X1kxICAgICAgMzc3NworI2RlZmluZSBNTkdfRk5fTUFHTklGWV9SR0IxNl9ZMiAgICAgIDM3NzgKKyNkZWZpbmUgTU5HX0ZOX01BR05JRllfR0ExNl9ZMSAgICAgICAzNzc5CisjZGVmaW5lIE1OR19GTl9NQUdOSUZZX0dBMTZfWTIgICAgICAgMzc4MAorI2RlZmluZSBNTkdfRk5fTUFHTklGWV9HQTE2X1kzICAgICAgIDM3ODEKKyNkZWZpbmUgTU5HX0ZOX01BR05JRllfR0ExNl9ZNCAgICAgICAzNzgyCisjZGVmaW5lIE1OR19GTl9NQUdOSUZZX1JHQkExNl9ZMSAgICAgMzc4MworI2RlZmluZSBNTkdfRk5fTUFHTklGWV9SR0JBMTZfWTIgICAgIDM3ODQKKyNkZWZpbmUgTU5HX0ZOX01BR05JRllfUkdCQTE2X1kzICAgICAzNzg1CisjZGVmaW5lIE1OR19GTl9NQUdOSUZZX1JHQkExNl9ZNCAgICAgMzc4NgorI2RlZmluZSBNTkdfRk5fTUFHTklGWV9HMTZfWTMgICAgICAgIDM3ODcKKyNkZWZpbmUgTU5HX0ZOX01BR05JRllfUkdCMTZfWTMgICAgICAzNzg4CisjZGVmaW5lIE1OR19GTl9NQUdOSUZZX0dBMTZfWTUgICAgICAgMzc4OQorI2RlZmluZSBNTkdfRk5fTUFHTklGWV9SR0JBMTZfWTUgICAgIDM3OTAKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2RlZmluZSBNTkdfRk5fREVMVEFfRzFfRzEgICAgICAgICAgIDM4MDEKKyNkZWZpbmUgTU5HX0ZOX0RFTFRBX0cyX0cyICAgICAgICAgICAzODAyCisjZGVmaW5lIE1OR19GTl9ERUxUQV9HNF9HNCAgICAgICAgICAgMzgwMworI2RlZmluZSBNTkdfRk5fREVMVEFfRzhfRzggICAgICAgICAgIDM4MDQKKyNkZWZpbmUgTU5HX0ZOX0RFTFRBX0cxNl9HMTYgICAgICAgICAzODA1CisjZGVmaW5lIE1OR19GTl9ERUxUQV9SR0I4X1JHQjggICAgICAgMzgwNgorI2RlZmluZSBNTkdfRk5fREVMVEFfUkdCMTZfUkdCMTYgICAgIDM4MDcKKyNkZWZpbmUgTU5HX0ZOX0RFTFRBX0dBOF9HQTggICAgICAgICAzODA4CisjZGVmaW5lIE1OR19GTl9ERUxUQV9HQThfRzggICAgICAgICAgMzgwOQorI2RlZmluZSBNTkdfRk5fREVMVEFfR0E4X0E4ICAgICAgICAgIDM4MTAKKyNkZWZpbmUgTU5HX0ZOX0RFTFRBX0dBMTZfR0ExNiAgICAgICAzODExCisjZGVmaW5lIE1OR19GTl9ERUxUQV9HQTE2X0cxNiAgICAgICAgMzgxMgorI2RlZmluZSBNTkdfRk5fREVMVEFfR0ExNl9BMTYgICAgICAgIDM4MTMKKyNkZWZpbmUgTU5HX0ZOX0RFTFRBX1JHQkE4X1JHQkE4ICAgICAzODE0CisjZGVmaW5lIE1OR19GTl9ERUxUQV9SR0JBOF9SR0I4ICAgICAgMzgxNQorI2RlZmluZSBNTkdfRk5fREVMVEFfUkdCQThfQTggICAgICAgIDM4MTYKKyNkZWZpbmUgTU5HX0ZOX0RFTFRBX1JHQkExNl9SR0JBMTYgICAzODE3CisjZGVmaW5lIE1OR19GTl9ERUxUQV9SR0JBMTZfUkdCMTYgICAgMzgxOAorI2RlZmluZSBNTkdfRk5fREVMVEFfUkdCQTE2X0ExNiAgICAgIDM4MTkKKworI2RlZmluZSBNTkdfRk5fUFJPTU9URV9HOF9HOCAgICAgICAgIDM5MDEKKyNkZWZpbmUgTU5HX0ZOX1BST01PVEVfRzhfRzE2ICAgICAgICAzOTAyCisjZGVmaW5lIE1OR19GTl9QUk9NT1RFX0cxNl9HMTYgICAgICAgMzkwMworI2RlZmluZSBNTkdfRk5fUFJPTU9URV9HOF9HQTggICAgICAgIDM5MDQKKyNkZWZpbmUgTU5HX0ZOX1BST01PVEVfRzhfR0ExNiAgICAgICAzOTA1CisjZGVmaW5lIE1OR19GTl9QUk9NT1RFX0cxNl9HQTE2ICAgICAgMzkwNgorI2RlZmluZSBNTkdfRk5fUFJPTU9URV9HOF9SR0I4ICAgICAgIDM5MDcKKyNkZWZpbmUgTU5HX0ZOX1BST01PVEVfRzhfUkdCMTYgICAgICAzOTA4CisjZGVmaW5lIE1OR19GTl9QUk9NT1RFX0cxNl9SR0IxNiAgICAgMzkwOQorI2RlZmluZSBNTkdfRk5fUFJPTU9URV9HOF9SR0JBOCAgICAgIDM5MTAKKyNkZWZpbmUgTU5HX0ZOX1BST01PVEVfRzhfUkdCQTE2ICAgICAzOTExCisjZGVmaW5lIE1OR19GTl9QUk9NT1RFX0cxNl9SR0JBMTYgICAgMzkxMgorI2RlZmluZSBNTkdfRk5fUFJPTU9URV9HQThfR0ExNiAgICAgIDM5MTMKKyNkZWZpbmUgTU5HX0ZOX1BST01PVEVfR0E4X1JHQkE4ICAgICAzOTE0CisjZGVmaW5lIE1OR19GTl9QUk9NT1RFX0dBOF9SR0JBMTYgICAgMzkxNQorI2RlZmluZSBNTkdfRk5fUFJPTU9URV9HQTE2X1JHQkExNiAgIDM5MTYKKyNkZWZpbmUgTU5HX0ZOX1BST01PVEVfUkdCOF9SR0IxNiAgICAzOTE3CisjZGVmaW5lIE1OR19GTl9QUk9NT1RFX1JHQjhfUkdCQTggICAgMzkxOAorI2RlZmluZSBNTkdfRk5fUFJPTU9URV9SR0I4X1JHQkExNiAgIDM5MTkKKyNkZWZpbmUgTU5HX0ZOX1BST01PVEVfUkdCMTZfUkdCQTE2ICAzOTIwCisjZGVmaW5lIE1OR19GTl9QUk9NT1RFX1JHQkE4X1JHQkExNiAgMzkyMQorI2RlZmluZSBNTkdfRk5fUFJPTU9URV9JRFg4X1JHQjggICAgIDM5MjIKKyNkZWZpbmUgTU5HX0ZOX1BST01PVEVfSURYOF9SR0IxNiAgICAzOTIzCisjZGVmaW5lIE1OR19GTl9QUk9NT1RFX0lEWDhfUkdCQTggICAgMzkyNAorI2RlZmluZSBNTkdfRk5fUFJPTU9URV9JRFg4X1JHQkExNiAgIDM5MjUKKworI2RlZmluZSBNTkdfRk5fU0NBTEVfRzFfRzIgICAgICAgICAgIDQwMDEKKyNkZWZpbmUgTU5HX0ZOX1NDQUxFX0cxX0c0ICAgICAgICAgICA0MDAyCisjZGVmaW5lIE1OR19GTl9TQ0FMRV9HMV9HOCAgICAgICAgICAgNDAwMworI2RlZmluZSBNTkdfRk5fU0NBTEVfRzFfRzE2ICAgICAgICAgIDQwMDQKKyNkZWZpbmUgTU5HX0ZOX1NDQUxFX0cyX0c0ICAgICAgICAgICA0MDA1CisjZGVmaW5lIE1OR19GTl9TQ0FMRV9HMl9HOCAgICAgICAgICAgNDAwNgorI2RlZmluZSBNTkdfRk5fU0NBTEVfRzJfRzE2ICAgICAgICAgIDQwMDcKKyNkZWZpbmUgTU5HX0ZOX1NDQUxFX0c0X0c4ICAgICAgICAgICA0MDA4CisjZGVmaW5lIE1OR19GTl9TQ0FMRV9HNF9HMTYgICAgICAgICAgNDAwOQorI2RlZmluZSBNTkdfRk5fU0NBTEVfRzhfRzE2ICAgICAgICAgIDQwMTAKKyNkZWZpbmUgTU5HX0ZOX1NDQUxFX0dBOF9HQTE2ICAgICAgICA0MDExCisjZGVmaW5lIE1OR19GTl9TQ0FMRV9SR0I4X1JHQjE2ICAgICAgNDAxMgorI2RlZmluZSBNTkdfRk5fU0NBTEVfUkdCQThfUkdCQTE2ICAgIDQwMTMKKworI2RlZmluZSBNTkdfRk5fU0NBTEVfRzJfRzEgICAgICAgICAgIDQwMjEKKyNkZWZpbmUgTU5HX0ZOX1NDQUxFX0c0X0cxICAgICAgICAgICA0MDIyCisjZGVmaW5lIE1OR19GTl9TQ0FMRV9HOF9HMSAgICAgICAgICAgNDAyMworI2RlZmluZSBNTkdfRk5fU0NBTEVfRzE2X0cxICAgICAgICAgIDQwMjQKKyNkZWZpbmUgTU5HX0ZOX1NDQUxFX0c0X0cyICAgICAgICAgICA0MDI1CisjZGVmaW5lIE1OR19GTl9TQ0FMRV9HOF9HMiAgICAgICAgICAgNDAyNgorI2RlZmluZSBNTkdfRk5fU0NBTEVfRzE2X0cyICAgICAgICAgIDQwMjcKKyNkZWZpbmUgTU5HX0ZOX1NDQUxFX0c4X0c0ICAgICAgICAgICA0MDI4CisjZGVmaW5lIE1OR19GTl9TQ0FMRV9HMTZfRzQgICAgICAgICAgNDAyOQorI2RlZmluZSBNTkdfRk5fU0NBTEVfRzE2X0c4ICAgICAgICAgIDQwMzAKKyNkZWZpbmUgTU5HX0ZOX1NDQUxFX0dBMTZfR0E4ICAgICAgICA0MDMxCisjZGVmaW5lIE1OR19GTl9TQ0FMRV9SR0IxNl9SR0I4ICAgICAgNDAzMgorI2RlZmluZSBNTkdfRk5fU0NBTEVfUkdCQTE2X1JHQkE4ICAgIDQwMzMKKworI2RlZmluZSBNTkdfRk5fQ09NUE9TRU9WRVJfUkdCQTggICAgIDQ1MDEKKyNkZWZpbmUgTU5HX0ZOX0NPTVBPU0VPVkVSX1JHQkExNiAgICA0NTAyCisjZGVmaW5lIE1OR19GTl9DT01QT1NFVU5ERVJfUkdCQTggICAgNDUwMworI2RlZmluZSBNTkdfRk5fQ09NUE9TRVVOREVSX1JHQkExNiAgIDQ1MDQKKworI2RlZmluZSBNTkdfRk5fRkxJUF9SR0JBOCAgICAgICAgICAgIDQ1MjEKKyNkZWZpbmUgTU5HX0ZOX0ZMSVBfUkdCQTE2ICAgICAgICAgICA0NTIyCisjZGVmaW5lIE1OR19GTl9USUxFX1JHQkE4ICAgICAgICAgICAgNDUyMworI2RlZmluZSBNTkdfRk5fVElMRV9SR0JBMTYgICAgICAgICAgIDQ1MjQKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIFRyYWNlIHN0cmluZy10YWJsZSBlbnRyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpRnVuY3Rpb247CisgICAgICAgICAgICAgICAgIG1uZ19wY2hhciAgelRyYWNldGV4dDsKKyAgICAgICAgICAgICAgIH0gbW5nX3RyYWNlX2VudHJ5OwordHlwZWRlZiBtbmdfdHJhY2VfZW50cnkgY29uc3QgKiBtbmdfdHJhY2VfZW50cnlwOworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjZW5kaWYgLyogTU5HX0lOQ0xVREVfVFJBQ0VfUFJPQ1MgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2VuZGlmIC8qIF9saWJtbmdfdHJhY2VfaF8gKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogZW5kIG9mIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCmRpZmYgLS1naXQgYS9maWxlcy9Tb3VyY2UvTGliTU5HL2xpYm1uZ190eXBlcy5oIGIvZmlsZXMvU291cmNlL0xpYk1ORy9saWJtbmdfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWVlOGY4Ci0tLSAvZGV2L251bGwKKysrIGIvZmlsZXMvU291cmNlL0xpYk1ORy9saWJtbmdfdHlwZXMuaApAQCAtMCwwICsxLDU3NCBAQAorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIGxpYm1uZy5oICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIHByb2plY3QgICA6IGxpYm1uZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBmaWxlICAgICAgOiBsaWJtbmdfdHlwZXMuaCAgICAgICAgICAgIGNvcHlyaWdodCAoYykgMjAwMC0yMDA3IEcuSnV5biAgICogKi8KKy8qICogdmVyc2lvbiAgIDogMS4wLjEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBwdXJwb3NlICAgOiB0eXBlIHNwZWNpZmljYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGF1dGhvciAgICA6IEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogY29tbWVudCAgIDogU3BlY2lmaWNhdGlvbiBvZiB0aGUgdHlwZXMgdXNlZCBieSB0aGUgbGlicmFyeSAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIENyZWF0ZXMgcGxhdGZvcm0taW5kZXBlbmRhbnQgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogY2hhbmdlcyAgIDogMC41LjEgLSAwNS8wNi8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgaXRlcmF0ZWNodW5rIGNhbGxiYWNrIGRlZmluaXRpb24gICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMSAtIDA1LzA4LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBpbXByb3ZlZCBkZWZpbml0aW9ucyBmb3IgRExMIHN1cHBvcnQgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgOC1iaXQgcGFsZXR0ZSBkZWZpbml0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGdlbmVyYWwgYXJyYXkgZGVmaW5pdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBNTkdfTlVMTCBkZWZpbml0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2hhbmdlZCBzdHJpY3QtQU5TSSBzdHVmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMSAtIDA1LzExLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjaGFuZ2VkIG1vc3QgY2FsbGJhY2sgcHJvdG90eXBlcyB0byBhbGxvdyB0aGUgYXBwICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgdG8gcmVwb3J0IGVycm9ycyBkdXJpbmcgY2FsbGJhY2sgcHJvY2Vzc2luZyAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMSAtIDA1LzE2LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBtb3ZlZCBzdGFuZGFyZCBoZWFkZXIgaW5jbHVkZXMgaW50byB0aGlzIGZpbGUgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgKHN0ZGxpYi9tZW0gZm9yIG1lbS1tbmdtdCAmIG1hdGggZm9yIGZwIGdhbW1hLWNhbGMpICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjIgLSAwNS8xOC8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gQjAwMyAtIGZpeGVkIHByb2JsZW0gd2l0aCA8bWVtLmg+IGJlaW5nIHByb3ByaWV0YXJ5ICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgIHRvIEJvcmxhbmQgcGxhdGZvcm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBoZWxwZXIgZGVmaW5pdGlvbnMgZm9yIEpORyAoSUpHLWJhc2VkKSAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgc3VwcG9ydCBmb3IgSUpHU1JDNkIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMiAtIDA1LzI0LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBkZWZhdWx0IElKRyBjb21wcmVzc2lvbiBwYXJhbWV0ZXJzIGFuZCBzdWNoICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4yIC0gMDUvMzEvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIGluY2x1c2lvbiBmb3IgbWVtY3B5IChjb250cmlidXRlZCBieSBUaW0gUm93bGV5KSAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBtbmdfaW50MzJwIChjb250cmlidXRlZCBieSBUaW0gUm93bGV5KSAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4yIC0gMDYvMDIvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIHJlbW92ZWQgU1dBUF9FTkRJQU4gcmVmZXJlbmNlIChjb250cmlidXRlZCBieSBUaW0gUm93bGV5KSogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBnZXRhbHBoYWxpbmUgY2FsbGJhY2sgZm9yIFJHQjhfQTggY2FudmFzc3R5bGUgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMyAtIDA2LzIxLzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBzcGVlZHR5cGUgdG8gZmFjaWxpdGF0ZSB0ZXN0aW5nICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4zIC0gMDYvMjcvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHR5cGVkZWYgZm9yIG1uZ19zaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjaGFuZ2VkIHNpemUgcGFyYW1ldGVyIGZvciBtZW1vcnkgY2FsbGJhY2tzIHRvICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgbW5nX3NpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMyAtIDA2LzI4LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjaGFuZ2VkIGRlZmluaXRpb24gb2YgMzItYml0IGludHMgKDY0LWJpdCBwbGF0Zm9ybXMpICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2hhbmdlZCBkZWZpbml0aW9uIG9mIG1uZ19oYW5kbGUgKDY0LWJpdCBwbGF0Zm9ybXMpICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMyAtIDA2LzI5LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjaGFuZ2VkIGRlZmluaXRpb24gb2YgbW5nX2hhbmRsZSAoYWdhaW4pICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gc3dhcHBlZCByZWZyZXNoIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGluY2x1c2lvbiBvZiBzdGRsaWIuaCBmb3IgYWJzKCkgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4wIC0gMDYvMzAvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNoYW5nZWQgcmVmcmVzaCBwYXJhbWV0ZXJzIHRvICd4LHksd2lkdGgsaGVpZ2h0JyAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjEgLSAwNy8xMC8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgc3VzcGVuZGJ1ZmZlciBjb25zdGFudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMSAtIDA3LzE1LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBjYWxsYmFja3MgZm9yIFNBVkUvU0VFSyBwcm9jZXNzaW5nICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMiAtIDA4LzA1LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjaGFuZ2VkIGZpbGUtcHJlZml4ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMyAtIDA4LzA3LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBCMTExMzAwIC0gZml4dXAgZm9yIGltcHJvdmVkIHBvcnRhYmlsaXR5ICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4zIC0gMDgvMTIvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHdvcmthcm91bmQgZm9yIGZhdWx0eSBQaG90b1Nob3AgaUNDUCBjaHVuayAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjMgLSAwOS8xMS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgZXhwb3J0IG9mIHpsaWIgZnVuY3Rpb25zIGZyb20gd2luZG93cyBkbGwgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpeGVkIGluY2x1c2lvbiBwYXJhbWV0ZXJzIG9uY2UgYWdhaW4gdG8gbWFrZSB0aG9zZSAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICBleHRlcm5hbCBsaWJzIHdvcmsgdG9nZXRoZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gcmUtZml4ZWQgZml4ZWQgaW5jbHVzaW9uIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICh0aGVzZSBmcmVla2luZyBsaWJyYXJpZXMgbWFrZSBtZSBtYWQpICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjMgLSAxMC8xMS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgc3VwcG9ydCBmb3IgbkVFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMyAtIDEwLzE3LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBjYWxsYmFjayB0byBwcm9jZXNzIG5vbi1jcml0aWNhbCB1bmtub3duIGNodW5rcyAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuNCAtIDExLzIwLzIwMDAgLSBSLkdpbGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBmaXhlZCBpbmNsdXNpb24gb2YgbGNtcyBoZWFkZXIgZm9yIG5vbi13aW5kb3dzIHBsYXRmb3JtcyAqICovCisvKiAqICAgICAgICAgICAgIDAuOS40IC0gMTIvMTIvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNoYW5nZWQgY2FsbGJhY2sgY29udmVudGlvbiBmb3IgTVNWQyAoVGhhbmtzIENoYWQpICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjQgLSAxMi8xNi8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgbWl4dXAgb2YgZGF0YS0gJiBmdW5jdGlvbi1wb2ludGVycyAodGhhbmtzIERpbWl0cmkpKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjEgLSAwMi8wOC8yMDAxIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgTUVORCBwcm9jZXNzaW5nIGNhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjIgLSAwNi8yMy8yMDAxIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgcHJvY2Vzc3Rlcm0gY2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjMgLSAwOC8wNi8yMDAxIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2hhbmdlZCBpbmNsdXNpb24gb2YgbGNtcy5oIGZvciBMaW51eCBwbGF0Zm9ybXMgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAwOC8xOS8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gQjU5NzEzNCAtIGxpYm1uZyBwb2xsdXRlcyB0aGUgbGlua2VyIG5hbWVzcGFjZSAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjYgLSAwNC8xMS8yMDAzIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gQjcxOTQyMCAtIGZpeGVkIHNldmVyYWwgTU5HX0FQUF9DTVMgcHJvYmxlbXMgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNiAtIDA2LzE1LzIwMDMgLSBSLkdpbGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBsY21zLmggaW5jbHVzaW9uIGlzIGdlbmVyYWxseSBubyBsb25nZXIgcHJlZml4ZWQgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC42IC0gMDcvMDcvMjAwMyAtIEcuIFItUC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHBuZ19pbWd0eXBlcyBlbnVtZXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC43IC0gMDMvMTAvMjAwNCAtIEcuUi1QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGNvbmRpdGlvbmFscyBhcm91bmQgb3BlbnN0cmVhbS9jbG9zZXN0cmVhbSAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC44IC0gMDQvMTEvMjAwNCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIGRhdGEtcHVzaCBtZWNoYW5pc21zIGZvciBzcGVjaWFsaXplZCBkZWNvZGVycyAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjggLSAwOC8wMS8yMDA0IC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgc3VwcG9ydCBmb3IgMytieXRlIHBpeGVsc2l6ZSBmb3IgSlBFRydzICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjkgLSAxMi8wNS8yMDA0IC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gaW5jbHVzaW9uIG9mIHpsaWIvbGNtcy9pamdzcmM2YiB3aXRoIDw+IGluc3RlYWQgb2YgIiIgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuOSAtIDEyLzA2LzIwMDQgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBjb25kaXRpb25hbCBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuMTAgLSAwNC8wOC8yMDA3IC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBzdXBwb3J0IGZvciBtUE5HIHByb3Bvc2FsICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC4xMCAtIDA0LzEyLzIwMDcgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGFkZGVkIHN1cHBvcnQgZm9yIEFORyBwcm9wb3NhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZuZGVmIF9saWJtbmdfdHlwZXNfaF8KKyNkZWZpbmUgX2xpYm1uZ190eXBlc19oXworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgX19CT1JMQU5EQ19fCisjcHJhZ21hIG9wdGlvbiAtQVQgICAgICAgICAgICAgICAgICAgICAvKiB0dXJuIG9mZiBzdHJpY3QgQU5TSS1DIGZvciB0aGUgbW9tZW50ICovCisjZW5kaWYKKworI2lmbmRlZiBXSU4zMgorI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9fV0lOMzJfXykgfHwgZGVmaW5lZChfV2luZG93cykgfHwgZGVmaW5lZChfV0lORE9XUykKKyNkZWZpbmUgV0lOMzIgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdhdGhlciB0aGVtIGludG8gYSBzaW5nbGUgZGVmaW5lICovCisjZW5kaWYKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogSGVyZSdzIHdoZXJlIHRoZSBleHRlcm5hbCAmIHN0YW5kYXJkIGxpYnMgYXJlIGVtYmVkZGVkICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAoaXQgY2FuIGJlIGEgYml0IG9mIGEgcGFpbiBpbiB0aGUgbG93ZXItYmFjayB0byBnZXQgdGhlbSB0byB3b3JrICAgICAgICogKi8KKy8qICogIHRvZ2V0aGVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIFdJTjMyICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb25seSBpbmNsdWRlIG5lZWRlZCBzdHVmZiAqLworI2lmbmRlZiBXSU4zMl9MRUFOX0FORF9NRUFOCisjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBNTkdfVVNFX0RMTAorI2lmZGVmIE1OR19TS0lQX1pMSUIKKyN1bmRlZiBNTkdfSU5DTFVERV9aTElCCisjZW5kaWYKKyNpZmRlZiBNTkdfU0tJUF9MQ01TCisjdW5kZWYgTU5HX0lOQ0xVREVfTENNUworI2VuZGlmCisjaWZkZWYgTU5HX1NLSVBfSUpHNkIKKyN1bmRlZiBNTkdfSU5DTFVERV9JSkc2QgorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIE1OR19JTkNMVURFX1pMSUIgICAgICAgICAgICAgICAgLyogemxpYiBieSBNYXJrIEFkbGVyICYgSmVhbi1sb3VwIEdhaWxseSAqLworI2luY2x1ZGUgPHpsaWIuaD4KKyNlbmRpZgorCisjaWZkZWYgTU5HX0lOQ0xVREVfTENNUyAgICAgICAgICAgICAgICAvKiBsaXR0bGUgY21zIGJ5IE1hcnRpIE1hcmlhIFNhZ3VlciAqLworI2lmbmRlZiBaTElCX0RMTAorI3VuZGVmIEZBUgorI2VuZGlmCisjaW5jbHVkZSA8bGNtcy5oPgorI2VuZGlmIC8qIE1OR19JTkNMVURFX0xDTVMgKi8KKworI2lmZGVmIE1OR19JTkNMVURFX0lKRzZCICAgICAgICAgICAgICAgLyogSUpHJ3MganBnc3JjNmIgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmZGVmIE1OR19VU0VfU0VUSk1QCisjaW5jbHVkZSA8c2V0am1wLmg+ICAgICAgICAgICAgICAgICAgICAvKiBuZWVkZWQgZm9yIGVycm9yLXJlY292ZXJ5IChibGVyZ2gpICovCisjZWxzZQorI2lmZGVmIFdJTjMyCisjZGVmaW5lIFVTRV9XSU5ET1dTX01FU1NBR0VCT1ggICAgICAgICAvKiBkaXNwbGF5IGEgbWVzc2FnZWJveCB1bmRlciBXaW5kb3plICovCisjZW5kaWYKKyNlbmRpZiAvKiBNTkdfVVNFX1NFVEpNUCAqLworI2lmZGVmIEZBUgorI3VuZGVmIEZBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcG9zc2libHkgZGVmaW5lZCBieSB6bGliIG9yIGxjbXMgKi8KKyNlbmRpZgorI2RlZmluZSBKUEVHX0lOVEVSTkFMX09QVElPTlMgICAgICAgICAgLyogZm9yIFJHQl9QSVhFTFNJWkUgKi8KKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9qcGVnL2pwZWdsaWIuaCIgICAgICAgIC8qIGFsbCB0aGF0IGZvciBKUEVHIHN1cHBvcnQgIDotKSAqLworI2VuZGlmIC8qIE1OR19JTkNMVURFX0lKRzZCICovCisKKyNpZiBkZWZpbmVkKE1OR19JTlRFUk5BTF9NRU1NTkdNVCkgfHwgZGVmaW5lZChNTkdfSU5DTFVERV9GSUxURVJTKQorI2luY2x1ZGUgPHN0ZGxpYi5oPiAgICAgICAgICAgICAgICAgICAgLyogImNhbGxvYyIgJiAiZnJlZSIgJiAiYWJzIiAqLworI2VuZGlmCisKKyNpbmNsdWRlIDxsaW1pdHMuaD4gICAgICAgICAgICAgICAgICAgIC8qIGdldCBwcm9wZXIgaW50ZWdlciB3aWR0aHMgKi8KKworI2lmZGVmIFdJTjMyCisjaWYgZGVmaW5lZCBfX0JPUkxBTkRDX18KKyNpbmNsdWRlIDxtZW0uaD4gICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZmluZXMgIm1lbWNweSIgZm9yIEJDQiAqLworI2Vsc2UKKyNpbmNsdWRlIDxtZW1vcnkuaD4gICAgICAgICAgICAgICAgICAgIC8qIGRlZmluZXMgIm1lbWNweSIgZm9yIG90aGVyIHdpbjMyIHBsYXRmb3JtcyAqLworI2VuZGlmCisjaW5jbHVkZSA8c3RyaW5nLmg+ICAgICAgICAgICAgICAgICAgICAvKiAic3RybmNtcCIgKyAic3RyY21wIiAqLworI2Vsc2UgLyogV0lOMzIgKi8KKyNpZmRlZiBCU0QKKyNpbmNsdWRlIDxzdHJpbmdzLmg+ICAgICAgICAgICAgICAgICAgIC8qIGRlZmluZXMgIm1lbWNweSIsIGV0YyBmb3IgQlNEICg/KSAqLworI2Vsc2UKKyNpbmNsdWRlIDxzdHJpbmcuaD4gICAgICAgICAgICAgICAgICAgIC8qIGRlZmluZXMgIm1lbWNweSIsIGV0YyBmb3IgYWxsIG90aGVycyAoPz8/KSAqLworI2VuZGlmCisjZW5kaWYgLyogV0lOMzIgKi8KKworI2lmIGRlZmluZWQoTU5HX0ZVTExfQ01TKSB8fCBkZWZpbmVkKE1OR19HQU1NQV9PTkxZKSB8fCBkZWZpbmVkKE1OR19BUFBfQ01TKQorI2luY2x1ZGUgPG1hdGguaD4gICAgICAgICAgICAgICAgICAgICAgLyogZnAgZ2FtbWEtY2FsY3VsYXRpb24gKi8KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogUGxhdGZvcm0tZGVwZW5kYW50IHN0dWZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworLyogVE9ETzogdGhpcyBtYXkgcmVxdWlyZSBzb21lIGVsYWJvcmF0aW9uIGZvciBvdGhlciBwbGF0Zm9ybXM7CisgICBvbmx5IHdvcmtzIHdpdGggQkNCIGZvciBub3cgKi8KKworI2lmbmRlZiBNTkdfRExMCisjaWYgZGVmaW5lZChNTkdfQlVJTERfRExMKSB8fCBkZWZpbmVkKE1OR19VU0VfRExMKQorI2RlZmluZSBNTkdfRExMCisjZW5kaWYKKyNlbmRpZgorCisjZGVmaW5lIE1OR19MT0NBTCBzdGF0aWMKKworI2lmIGRlZmluZWQoTU5HX0RMTCkgJiYgZGVmaW5lZChXSU4zMikgLyogc2V0dXAgRExMIGNhbGxpbmcgY29udmVudGlvbnMgKi8gCisjZGVmaW5lIE1OR19ERUNMIF9fc3RkY2FsbAorI2lmIGRlZmluZWQoTU5HX0JVSUxEX0RMTCkKKyNkZWZpbmUgTU5HX0VYVCBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyNlbGlmIGRlZmluZWQoTU5HX1VTRV9ETEwpCisjZGVmaW5lIE1OR19FWFQgX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjZWxzZQorI2RlZmluZSBNTkdfRVhUCisjZW5kaWYKKyNpZmRlZiBNTkdfU1RSSUNUX0FOU0kKKyN1bmRlZiBNTkdfU1RSSUNUX0FOU0kgICAgICAgICAgICAgICAgIC8qIGNhbid0IGRvIHN0cmljdC1BTlNJIHdpdGggdGhpcyBETEwtc3R1ZmYgKi8KKyNlbmRpZgorI2Vsc2UKKyNkZWZpbmUgTU5HX0RFQ0wgICAgICAgICAgICAgICAgICAgICAgIC8qIGR1bW1pZXMgZm9yIG5vbi1ETEwgKi8KKyNkZWZpbmUgTU5HX0VYVAorI2VuZGlmIC8qIE1OR19ETEwgJiYgV0lOMzIgKi8KKworI2lmIGRlZmluZWQoX19CT1JMQU5EQ19fKSAmJiBkZWZpbmVkKE1OR19TVFJJQ1RfQU5TSSkKKyNwcmFnbWEgb3B0aW9uIC1BICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdyBmb3JjZSBBTlNJLUMgZnJvbSBoZXJlIG9uICovCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmIFVTSFJUX01BWCA9PSAweGZmZmZmZmZmVSAgICAgICAgICAgICAgICAgICAgIC8qIGdldCB0aGUgcHJvcGVyIDMyLWJpdCB3aWR0aCAhISEgKi8KK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgICBtbmdfdWludDMyOwordHlwZWRlZiBzaWduZWQgICBzaG9ydCAgIG1uZ19pbnQzMjsKKyNlbGlmIFVJTlRfTUFYID09IDB4ZmZmZmZmZmZVCit0eXBlZGVmIHVuc2lnbmVkIGludCAgICAgbW5nX3VpbnQzMjsKK3R5cGVkZWYgc2lnbmVkICAgaW50ICAgICBtbmdfaW50MzI7CisjZWxpZiBVTE9OR19NQVggPT0gMHhmZmZmZmZmZlUKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgICBtbmdfdWludDMyOwordHlwZWRlZiBzaWduZWQgICBsb25nICAgIG1uZ19pbnQzMjsKKyNlbHNlCisjZXJyb3IgIlNvcnJ5LCBJIGNhbid0IGZpbmQgYW55IDMyLWJpdCBpbnRlZ2VycyBvbiB0aGlzIHBsYXRmb3JtLiIKKyNlbmRpZgorCit0eXBlZGVmIHNpZ25lZCAgIHNob3J0ICAgbW5nX2ludDE2OyAgICAgICAgICAgICAgLyogb3RoZXIgYmFzaWMgaW50ZWdlcnMgKi8KK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgICBtbmdfdWludDE2OwordHlwZWRlZiBzaWduZWQgICBjaGFyICAgIG1uZ19pbnQ4OwordHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgIG1uZ191aW50ODsKKwordHlwZWRlZiBkb3VibGUgICAgICAgICAgIG1uZ19mbG9hdDsgICAgICAgICAgICAgIC8qIGJhc2ljIGZsb2F0ICovCisKK3R5cGVkZWYgc2l6ZV90ICAgICAgICAgICBtbmdfc2l6ZV90OyAgICAgICAgICAgICAvKiBzaXplIGZpZWxkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiAqLworCit0eXBlZGVmIGNoYXIgKiAgICAgICAgICAgbW5nX3BjaGFyOyAgICAgICAgICAgICAgLyogc3RyaW5nICovCit0eXBlZGVmIHZvaWQgKiAgICAgICAgICAgbW5nX3B0cjsgICAgICAgICAgICAgICAgLyogZ2VuZXJpYyBwb2ludGVyICovCit0eXBlZGVmIHZvaWQgICAgICAgICAgICAgKCptbmdfZnB0cikgKHZvaWQpOyAgICAgLyogZ2VuZXJpYyBmdW5jdGlvbiBwb2ludGVyICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBQbGF0Zm9ybS1pbmRlcGVuZGFudCBmcm9tIGhlcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCit0eXBlZGVmIG1uZ191aW50MzIgKiAgICAgbW5nX3VpbnQzMnA7ICAgICAgICAgICAgLyogcG9pbnRlciB0byB1bnNpZ25lZCBsb25ncyAqLwordHlwZWRlZiBtbmdfaW50MzIgKiAgICAgIG1uZ19pbnQzMnA7ICAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gbG9uZ3MgKi8KK3R5cGVkZWYgbW5nX3VpbnQxNiAqICAgICBtbmdfdWludDE2cDsgICAgICAgICAgICAvKiBwb2ludGVyIHRvIHVuc2lnbmVkIHdvcmRzICovCit0eXBlZGVmIG1uZ191aW50OCAqICAgICAgbW5nX3VpbnQ4cDsgICAgICAgICAgICAgLyogcG9pbnRlciB0byB1bnNpZ25lZCBieXRlcyAqLworCit0eXBlZGVmIG1uZ19pbnQ4ICAgICAgICAgbW5nX2Jvb2w7ICAgICAgICAgICAgICAgLyogYm9vbGVhbnMgKi8KKworc3RydWN0IG1uZ19kYXRhX3N0cnVjdDsKK3R5cGVkZWYgc3RydWN0IG1uZ19kYXRhX3N0cnVjdCAqIG1uZ19oYW5kbGU7ICAgICAvKiBnZW5lcmljIGhhbmRsZSAqLworCit0eXBlZGVmIG1uZ19pbnQzMiAgICAgICAgbW5nX3JldGNvZGU7ICAgICAgICAgICAgLyogZ2VuZXJpYyByZXR1cm4gY29kZSAqLwordHlwZWRlZiBtbmdfaW50MzIgICAgICAgIG1uZ19jaHVua2lkOyAgICAgICAgICAgIC8qIDQtYnl0ZSBjaHVua25hbWUgaWRlbnRpZmllciAqLwordHlwZWRlZiBtbmdfcHRyICAgICAgICAgIG1uZ19jaHVua3A7ICAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gYSBjaHVuay1zdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgbW5nX3B0ciAgICAgICAgICBtbmdfb2JqZWN0cDsgICAgICAgICAgICAvKiBwb2ludGVyIHRvIGFuIG9iamVjdC1zdHJ1Y3R1cmUgKi8KKwordHlwZWRlZiBtbmdfY2h1bmtpZCAqICAgIG1uZ19jaHVua2lkcDsgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gY2h1bmtpZCAqLworCit0eXBlZGVmIHN0cnVjdCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogOC1iaXQgcGFsZXR0ZSBlbGVtZW50ICovCisgICAgICAgICAgbW5nX3VpbnQ4IGlSZWQ7CisgICAgICAgICAgbW5nX3VpbnQ4IGlHcmVlbjsKKyAgICAgICAgICBtbmdfdWludDggaUJsdWU7CisgICAgICAgIH0gbW5nX3BhbGV0dGU4ZTsKK3R5cGVkZWYgbW5nX3BhbGV0dGU4ZSAgIG1uZ19wYWxldHRlOFsyNTZdOyAgICAgICAvKiA4LWJpdCBwYWxldHRlICovCit0eXBlZGVmIG1uZ19wYWxldHRlOGUgKiBtbmdfcGFsZXR0ZThlcDsKKwordHlwZWRlZiBtbmdfdWludDggICAgICAgbW5nX3VpbnQ4YXJyWzI1Nl07ICAgICAgIC8qIGdlbmVyaWMgYXJyYXlzICovCit0eXBlZGVmIG1uZ191aW50OCAgICAgICBtbmdfdWludDhhcnI0WzRdOwordHlwZWRlZiBtbmdfdWludDE2ICAgICAgbW5nX3VpbnQxNmFyclsyNTZdOwordHlwZWRlZiBtbmdfdWludDMyICAgICAgbW5nX3VpbnQzMmFycjJbMl07CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNkZWZpbmUgTU5HX0ZBTFNFIDAKKyNkZWZpbmUgTU5HX1RSVUUgIDEKKyNkZWZpbmUgTU5HX05VTEwgIDAKKworI2RlZmluZSBNTkdfU1VTUEVOREJVRkZFUlNJWkUgIDMyNzY4CisjZGVmaW5lIE1OR19TVVNQRU5EUkVRVUVTVFNJWkUgIDEwMjQKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19JTkNMVURFX1pMSUIKKworLyogc2l6ZSBvZiB0ZW1wb3JhcnkgemxpYiBidWZmZXIgZm9yIGRlZmxhdGUgcHJvY2Vzc2luZyAqLworI2RlZmluZSBNTkdfWkxJQl9NQVhCVUYgICAgIDgxOTIKKworLyogZGVmYXVsdCB6bGliIGNvbXByZXNzaW9uIHBhcmFtZXRlcnMgZm9yIGRlZmxhdGVpbml0MiAqLworI2RlZmluZSBNTkdfWkxJQl9MRVZFTCAgICAgIDkgICAgICAgICAgICAgICAgICAgIC8qIGxldmVsICovCisjZGVmaW5lIE1OR19aTElCX01FVEhPRCAgICAgWl9ERUZMQVRFRCAgICAgICAgICAgLyogbWV0aG9kICovCisjZGVmaW5lIE1OR19aTElCX1dJTkRPV0JJVFMgMTUgICAgICAgICAgICAgICAgICAgLyogd2luZG93IHNpemUgKi8KKyNkZWZpbmUgTU5HX1pMSUJfTUVNTEVWRUwgICA5ICAgICAgICAgICAgICAgICAgICAvKiBtZW1vcnkgbGV2ZWwgKi8KKyNkZWZpbmUgTU5HX1pMSUJfU1RSQVRFR1kgICBaX0RFRkFVTFRfU1RSQVRFR1kgICAvKiBzdHJhdGVneSAqLworCisjZGVmaW5lIE1OR19NQVhfSURBVF9TSVpFICAgNDA5NiAgICAgICAgICAgICAgICAgLyogbWF4aW11bSBzaXplIG9mIElEQVQgZGF0YSAqLworCisjZW5kaWYgLyogTU5HX0lOQ0xVREVfWkxJQiAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisKKyNpZmRlZiBNTkdfSU5DTFVERV9JSkc2QiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJSkcgaGVscGVyIGRlZnMgKi8KK3R5cGVkZWYgc3RydWN0IGpwZWdfY29tcHJlc3Nfc3RydWN0ICAgbW5nanBlZ19jb21wOwordHlwZWRlZiBzdHJ1Y3QganBlZ19kZWNvbXByZXNzX3N0cnVjdCBtbmdqcGVnX2RlY29tcDsKK3R5cGVkZWYgc3RydWN0IGpwZWdfZXJyb3JfbWdyICAgICAgICAgbW5nanBlZ19lcnJvcjsKK3R5cGVkZWYgc3RydWN0IGpwZWdfc291cmNlX21nciAgICAgICAgbW5nanBlZ19zb3VyY2U7CisKK3R5cGVkZWYgbW5nanBlZ19jb21wICAgKiBtbmdqcGVnX2NvbXBwOwordHlwZWRlZiBtbmdqcGVnX2RlY29tcCAqIG1uZ2pwZWdfZGVjb21wcDsKK3R5cGVkZWYgbW5nanBlZ19lcnJvciAgKiBtbmdqcGVnX2Vycm9ycDsKK3R5cGVkZWYgbW5nanBlZ19zb3VyY2UgKiBtbmdqcGVnX3NvdXJjZXA7CisKK3R5cGVkZWYgSl9EQ1RfTUVUSE9EICAgICBtbmdqcGVnX2RjdG1ldGhvZDsKKworLyogZGVmYXVsdCBJSkcgcGFyYW1ldGVycyBmb3IgY29tcHJlc3Npb24gKi8KKyNkZWZpbmUgTU5HX0pQRUdfRENUICAgICAgICAgSkRDVF9ERUZBVUxUICAgICAgICAvKiBEQ1QgYWxnb3JpdGhtIChKRENUX0lTTE9XKSAqLworI2RlZmluZSBNTkdfSlBFR19RVUFMSVRZICAgICAxMDAgICAgICAgICAgICAgICAgIC8qIHF1YWxpdHkgMC4uMTAwOyAxMDA9YmVzdCAqLworI2RlZmluZSBNTkdfSlBFR19TTU9PVEhJTkcgICAwICAgICAgICAgICAgICAgICAgIC8qIGRlZmF1bHQgbm8gc21vb3RoaW5nICovCisjZGVmaW5lIE1OR19KUEVHX1BST0dSRVNTSVZFIE1OR19GQUxTRSAgICAgICAgICAgLyogZGVmYXVsdCBpcyBqdXN0IGJhc2VsaW5lICovCisjZGVmaW5lIE1OR19KUEVHX09QVElNSVpFRCAgIE1OR19GQUxTRSAgICAgICAgICAgLyogZGVmYXVsdCBpcyBub3Qgb3B0aW1pemVkICovCisjZW5kaWYgLyogTU5HX0lOQ0xVREVfSUpHNkIgKi8KKworI2RlZmluZSBNTkdfSlBFR19NQVhCVUYgICAgICA2NTUwMCAgICAgICAgICAgICAgIC8qIG1heCBzaXplIG9mIHRlbXAgSlBFRyBidWZmZXIgKi8KKyNkZWZpbmUgTU5HX01BWF9KREFUX1NJWkUgICAgNDA5NiAgICAgICAgICAgICAgICAvKiBtYXhpbXVtIHNpemUgb2YgSkRBVCBkYXRhICovCisKKyNlbmRpZiAvKiBNTkdfSU5DTFVERV9KTkcgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19JTkNMVURFX0xDTVMKK3R5cGVkZWYgY21zSFBST0ZJTEUgICAgICAgICBtbmdfY21zcHJvZjsgICAgICAgICAvKiBsaXR0bGUgQ01TIGhlbHBlciBkZWZzICovCit0eXBlZGVmIGNtc0hUUkFOU0ZPUk0gICAgICAgbW5nX2Ntc3RyYW5zOwordHlwZWRlZiBjbXNDSUV4eVkgICAgICAgICAgIG1uZ19DSUV4eVk7Cit0eXBlZGVmIGNtc0NJRXh5WVRSSVBMRSAgICAgbW5nX0NJRXh5WVRSSVBMRTsKK3R5cGVkZWYgTFBHQU1NQVRBQkxFICAgICAgICBtbmdfZ2FtbWF0YWJwOworI2VuZGlmIC8qIE1OR19JTkNMVURFX0xDTVMgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW51bWVyYXRpb24gb2Yga25vd24gZ3JhcGhpY3MgdHlwZXMgKi8KK2VudW0gbW5nX2ltZ3R5cGVzIHttbmdfaXRfdW5rbm93biwgbW5nX2l0X3BuZywgbW5nX2l0X21uZywgbW5nX2l0X2puZworI2lmZGVmIE1OR19JTkNMVURFX01QTkdfUFJPUE9TQUwKKyAgICAgLG1uZ19pdF9tcG5nCisjZW5kaWYgICAgIAorI2lmZGVmIE1OR19JTkNMVURFX0FOR19QUk9QT1NBTAorICAgICAsbW5nX2l0X2FuZworI2VuZGlmCisgICAgIH07Cit0eXBlZGVmIGVudW0gbW5nX2ltZ3R5cGVzIG1uZ19pbWd0eXBlOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbnVtZXJhdGlvbiBvZiBhbmltYXRpb24gc3BlZWQtdHlwZXMgKi8KK2VudW0gbW5nX3NwZWVkdHlwZXMge21uZ19zdF9ub3JtYWwsIG1uZ19zdF9mYXN0LCBtbmdfc3Rfc2xvdywgbW5nX3N0X3Nsb3dlc3R9OwordHlwZWRlZiBlbnVtIG1uZ19zcGVlZHR5cGVzIG1uZ19zcGVlZHR5cGU7CisKKyNpZmRlZiBNTkdfT1BUSU1JWkVfQ0hVTktSRUFERVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVudW1lcmF0aW9uIG9iamVjdC1jcmVhdGlvbiBpbmRpY2F0b3JzICovCitlbnVtIG1uZ19jcmVhdGVvYmp0eXBlcyB7bW5nX2NyZWF0ZV9ub25lLCBtbmdfY3JlYXRlX2Fsd2F5cywgbW5nX2NyZWF0ZV9pZmdsb2JhbH07Cit0eXBlZGVmIGVudW0gbW5nX2NyZWF0ZW9ianR5cGVzIG1uZ19jcmVhdGVvYmp0eXBlOworI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKy8qIGVudW1lcmF0aW9uIG9mIFBORyBpbWFnZSB0eXBlcyAqLworI2lmZGVmIE1OR19PUFRJTUlaRV9GT09UUFJJTlRfSU5JVAorZW51bSBwbmdfaW1ndHlwZXMKKyAgeworICAgIHBuZ19nMSwKKyAgICBwbmdfZzIsCisgICAgcG5nX2c0LAorICAgIHBuZ19nOCwKKyAgICBwbmdfcmdiOCwKKyAgICBwbmdfaWR4MSwKKyAgICBwbmdfaWR4MiwKKyAgICBwbmdfaWR4NCwKKyAgICBwbmdfaWR4OCwKKyAgICBwbmdfZ2E4LAorICAgIHBuZ19yZ2JhOCwKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgICBwbmdfanBlZ19hMSwKKyAgICBwbmdfanBlZ19hMiwKKyAgICBwbmdfanBlZ19hNCwKKyAgICBwbmdfanBlZ19hOCwKKyNlbmRpZgorI2lmbmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgIHBuZ19nMTYsCisgICAgcG5nX2dhMTYsCisgICAgcG5nX3JnYjE2LAorICAgIHBuZ19yZ2JhMTYsCisjaWZkZWYgTU5HX0lOQ0xVREVfSk5HCisgICAgcG5nX2pwZWdfYTE2LAorI2VuZGlmCisjZW5kaWYKKyAgICBwbmdfbm9uZQorICB9OworICAgIAordHlwZWRlZiBlbnVtIHBuZ19pbWd0eXBlcyBwbmdfaW1ndHlwZTsKKyNlbmRpZgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWVtb3J5IG1hbmFnZW1lbnQgY2FsbGJhY2tzICovCit0eXBlZGVmIG1uZ19wdHIgICAgKE1OR19ERUNMICptbmdfbWVtYWxsb2MpICAgICAgKG1uZ19zaXplX3QgIGlMZW4pOwordHlwZWRlZiB2b2lkICAgICAgIChNTkdfREVDTCAqbW5nX21lbWZyZWUpICAgICAgIChtbmdfcHRyICAgICBpUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfc2l6ZV90ICBpTGVuKTsKKwordHlwZWRlZiB2b2lkICAgICAgIChNTkdfREVDTCAqbW5nX3JlbGVhc2VkYXRhKSAgIChtbmdfcHRyICAgICBwVXNlcmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wdHIgICAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfc2l6ZV90ICBpTGVuZ3RoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSS9PIG1hbmFnZW1lbnQgY2FsbGJhY2tzICovCisjaWZuZGVmIE1OR19OT19PUEVOX0NMT1NFX1NUUkVBTQordHlwZWRlZiBtbmdfYm9vbCAgIChNTkdfREVDTCAqbW5nX29wZW5zdHJlYW0pICAgIChtbmdfaGFuZGxlICBoSGFuZGxlKTsKK3R5cGVkZWYgbW5nX2Jvb2wgICAoTU5HX0RFQ0wgKm1uZ19jbG9zZXN0cmVhbSkgICAobW5nX2hhbmRsZSAgaEhhbmRsZSk7CisjZW5kaWYKK3R5cGVkZWYgbW5nX2Jvb2wgICAoTU5HX0RFQ0wgKm1uZ19yZWFkZGF0YSkgICAgICAobW5nX2hhbmRsZSAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3B0ciAgICAgcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgaUJ1ZmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMnAgcFJlYWQpOwordHlwZWRlZiBtbmdfYm9vbCAgIChNTkdfREVDTCAqbW5nX3dyaXRlZGF0YSkgICAgIChtbmdfaGFuZGxlICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcHRyICAgICBwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICBpQnVmbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMycCBwV3JpdHRlbik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVycm9yICYgdHJhY2UgcHJvY2Vzc2luZyBjYWxsYmFja3MgKi8KK3R5cGVkZWYgbW5nX2Jvb2wgICAoTU5HX0RFQ0wgKm1uZ19lcnJvcnByb2MpICAgICAobW5nX2hhbmRsZSAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDMyICAgaUVycm9yY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2ludDggICAgaVNldmVyaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfY2h1bmtpZCBpQ2h1bmtuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICBpQ2h1bmtzZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgIGlFeHRyYTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbnQzMiAgIGlFeHRyYTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wY2hhciAgIHpFcnJvcnRleHQpOwordHlwZWRlZiBtbmdfYm9vbCAgIChNTkdfREVDTCAqbW5nX3RyYWNlcHJvYykgICAgIChtbmdfaGFuZGxlICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgICBpRnVuY25yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW50MzIgICBpRnVuY3NlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3BjaGFyICAgekZ1bmNuYW1lKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVhZCBwcm9jZXNzaW5nIGNhbGxiYWNrcyAqLwordHlwZWRlZiBtbmdfYm9vbCAgIChNTkdfREVDTCAqbW5nX3Byb2Nlc3NoZWFkZXIpIChtbmdfaGFuZGxlICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICBpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgIGlIZWlnaHQpOwordHlwZWRlZiBtbmdfYm9vbCAgIChNTkdfREVDTCAqbW5nX3Byb2Nlc3N0ZXh0KSAgIChtbmdfaGFuZGxlICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDggICBpVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3BjaGFyICAgektleXdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wY2hhciAgIHpUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcGNoYXIgICB6TGFuZ3VhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wY2hhciAgIHpUcmFuc2xhdGlvbik7Cit0eXBlZGVmIG1uZ19ib29sICAgKE1OR19ERUNMICptbmdfcHJvY2Vzc3NhdmUpICAgKG1uZ19oYW5kbGUgIGhIYW5kbGUpOwordHlwZWRlZiBtbmdfYm9vbCAgIChNTkdfREVDTCAqbW5nX3Byb2Nlc3NzZWVrKSAgIChtbmdfaGFuZGxlICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfcGNoYXIgICB6TmFtZSk7Cit0eXBlZGVmIG1uZ19ib29sICAgKE1OR19ERUNMICptbmdfcHJvY2Vzc25lZWQpICAgKG1uZ19oYW5kbGUgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wY2hhciAgIHpLZXl3b3JkKTsKK3R5cGVkZWYgbW5nX2Jvb2wgICAoTU5HX0RFQ0wgKm1uZ19wcm9jZXNzbWVuZCkgICAobW5nX2hhbmRsZSAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgaUl0ZXJhdGlvbnNkb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICBpSXRlcmF0aW9uc2xlZnQpOwordHlwZWRlZiBtbmdfYm9vbCAgIChNTkdfREVDTCAqbW5nX3Byb2Nlc3N1bmtub3duKSAobW5nX2hhbmRsZSAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19jaHVua2lkIGlDaHVua2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgaVJhd2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wdHIgICAgIHBSYXdkYXRhKTsKK3R5cGVkZWYgbW5nX2Jvb2wgICAoTU5HX0RFQ0wgKm1uZ19wcm9jZXNzdGVybSkgICAobW5nX2hhbmRsZSAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4ICAgaVRlcm1hY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgIGlJdGVyYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICBpRGVsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgIGlJdGVybWF4KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGlzcGxheSBwcm9jZXNzaW5nIGNhbGxiYWNrcyAqLwordHlwZWRlZiBtbmdfcHRyICAgIChNTkdfREVDTCAqbW5nX2dldGNhbnZhc2xpbmUpIChtbmdfaGFuZGxlICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICBpTGluZW5yKTsKK3R5cGVkZWYgbW5nX3B0ciAgICAoTU5HX0RFQ0wgKm1uZ19nZXRia2dkbGluZSkgICAobW5nX2hhbmRsZSAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgaUxpbmVucik7Cit0eXBlZGVmIG1uZ19wdHIgICAgKE1OR19ERUNMICptbmdfZ2V0YWxwaGFsaW5lKSAgKG1uZ19oYW5kbGUgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgIGlMaW5lbnIpOwordHlwZWRlZiBtbmdfYm9vbCAgIChNTkdfREVDTCAqbW5nX3JlZnJlc2gpICAgICAgIChtbmdfaGFuZGxlICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICBpWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgaVksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgIGlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgaUhlaWdodCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRpbWVyIG1hbmFnZW1lbnQgY2FsbGJhY2tzICovCit0eXBlZGVmIG1uZ191aW50MzIgKE1OR19ERUNMICptbmdfZ2V0dGlja2NvdW50KSAgKG1uZ19oYW5kbGUgIGhIYW5kbGUpOwordHlwZWRlZiBtbmdfYm9vbCAgIChNTkdfREVDTCAqbW5nX3NldHRpbWVyKSAgICAgIChtbmdfaGFuZGxlICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICBpTXNlY3MpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb2xvciBtYW5hZ2VtZW50IGNhbGxiYWNrcyAqLwordHlwZWRlZiBtbmdfYm9vbCAgIChNTkdfREVDTCAqbW5nX3Byb2Nlc3NnYW1tYSkgIChtbmdfaGFuZGxlICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICBpR2FtbWEpOwordHlwZWRlZiBtbmdfYm9vbCAgIChNTkdfREVDTCAqbW5nX3Byb2Nlc3NjaHJvbWEpIChtbmdfaGFuZGxlICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICBpV2hpdGVwb2ludHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgIGlXaGl0ZXBvaW50eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgaVJlZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgIGlSZWR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICBpR3JlZW54LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICBpR3JlZW55LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICBpQmx1ZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgIGlCbHVleSk7Cit0eXBlZGVmIG1uZ19ib29sICAgKE1OR19ERUNMICptbmdfcHJvY2Vzc3NyZ2IpICAgKG1uZ19oYW5kbGUgIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OCAgIGlSZW5kZXJpbmdpbnRlbnQpOwordHlwZWRlZiBtbmdfYm9vbCAgIChNTkdfREVDTCAqbW5nX3Byb2Nlc3NpY2NwKSAgIChtbmdfaGFuZGxlICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICBpUHJvZmlsZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19wdHIgICAgIHBQcm9maWxlKTsKK3R5cGVkZWYgbW5nX2Jvb2wgICAoTU5HX0RFQ0wgKm1uZ19wcm9jZXNzYXJvdykgICAobW5nX2hhbmRsZSAgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiAgaVJvd3NhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19ib29sICAgIGJJc1JHQkExNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3B0ciAgICAgcFJvdyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNodW5rIGFjY2VzcyBjYWxsYmFjayhzKSAqLwordHlwZWRlZiBtbmdfYm9vbCAgIChNTkdfREVDTCAqbW5nX2l0ZXJhdGVjaHVuaykgIChtbmdfaGFuZGxlICBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaGFuZGxlICBoQ2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ19jaHVua2lkIGlDaHVua2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyICBpQ2h1bmtzZXEpOworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjZW5kaWYgLyogX2xpYm1uZ190eXBlc19oXyAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiBlbmQgb2YgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9MaWJNTkcvbGlibW5nX3dyaXRlLmMgYi9maWxlcy9Tb3VyY2UvTGliTU5HL2xpYm1uZ193cml0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ZmY1NDQKLS0tIC9kZXYvbnVsbAorKysgYi9maWxlcy9Tb3VyY2UvTGliTU5HL2xpYm1uZ193cml0ZS5jCkBAIC0wLDAgKzEsMTk4IEBACisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gbGlibW5nLmggICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogcHJvamVjdCAgIDogbGlibW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGZpbGUgICAgICA6IGxpYm1uZ193cml0ZS5jICAgICAgICAgICAgY29weXJpZ2h0IChjKSAyMDAwLTIwMDQgRy5KdXluICAgKiAqLworLyogKiB2ZXJzaW9uICAgOiAxLjAuOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIHB1cnBvc2UgICA6IFdyaXRlIG1hbmFnZW1lbnQgKGltcGxlbWVudGF0aW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogYXV0aG9yICAgIDogRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBjb21tZW50ICAgOiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgd3JpdGUgbWFuYWdlbWVudCByb3V0aW5lcyAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGNoYW5nZXMgICA6IDAuNS4xIC0gMDUvMDgvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNoYW5nZWQgc3RyaWN0LUFOU0kgc3R1ZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjEgLSAwNS8xMi8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2hhbmdlZCB0cmFjZSB0byBtYWNybyBmb3IgY2FsbGJhY2sgZXJyb3ItcmVwb3J0aW5nICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMSAtIDA1LzE2LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBtb3ZlZCB0aGUgYWN0dWFsIHdyaXRlX2dyYXBoaWMgZnVuY3Rpb25hbGl0eSBmcm9tICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgbW5nX2hsYXBpIHRvIGl0cyBhcHByb3ByaWF0ZSBmdW5jdGlvbiBoZXJlICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjEgLSAwNy8xOS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgd3JpdGluZyBvZiBzaWduYXR1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjIgLSAwOC8wNS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2hhbmdlZCBmaWxlLXByZWZpeGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAwOC8xOS8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gQjU5NzEzNCAtIGxpYm1uZyBwb2xsdXRlcyB0aGUgbGlua2VyIG5hbWVzcGFjZSAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjggLSAwNy8wNi8yMDA0IC0gRy5SLVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgY29uZGl0aW9uYWxzIGFyb3VuZCBvcGVuc3RyZWFtL2Nsb3Nlc3RyZWFtICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGRlZmVuZCBhZ2FpbnN0IHVzaW5nIHVuZGVmaW5lZCBPcGVuL0Nsb3Nlc3RyZWFtIGZ1bmN0aW9uICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjggLSAwOC8wMi8yMDA0IC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgY29uZGl0aW9uYWwgdG8gYWxsb3cgZWFzaWVyIHdyaXRpbmcgb2YgbGFyZ2UgTU5HJ3MgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjkgLSAwOS8yNS8yMDA0IC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gcmVwbGFjZWQgTU5HX1RXRUFLX0xBUkdFX0ZJTEVTIHdpdGggcGVybWFuZW50IHNvbHV0aW9uICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuOSAtIDEyLzIwLzIwMDQgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjbGVhbmVkIHVwIG1hY3JvLWludm9jYXRpb25zICh0aGFua3MgdG8gRC4gQWlybGllKSAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2luY2x1ZGUgImxpYm1uZy5oIgorI2luY2x1ZGUgImxpYm1uZ19kYXRhLmgiCisjaW5jbHVkZSAibGlibW5nX2Vycm9yLmgiCisjaW5jbHVkZSAibGlibW5nX3RyYWNlLmgiCisjaWZkZWYgX19CT1JMQU5EQ19fCisjcHJhZ21hIGhkcnN0b3AKKyNlbmRpZgorI2luY2x1ZGUgImxpYm1uZ19tZW1vcnkuaCIKKyNpbmNsdWRlICJsaWJtbmdfY2h1bmtzLmgiCisjaW5jbHVkZSAibGlibW5nX2NodW5rX2lvLmgiCisjaW5jbHVkZSAibGlibW5nX3dyaXRlLmgiCisKKyNpZiBkZWZpbmVkKF9fQk9STEFORENfXykgJiYgZGVmaW5lZChNTkdfU1RSSUNUX0FOU0kpCisjcHJhZ21hIG9wdGlvbiAtQSAgICAgICAgICAgICAgICAgICAgICAvKiBmb3JjZSBBTlNJLUMgKi8KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWYgZGVmaW5lZChNTkdfU1VQUE9SVF9SRUFEKSB8fCBkZWZpbmVkKE1OR19TVVBQT1JUX1dSSVRFKQorbW5nX3JldGNvZGUgbW5nX2Ryb3BfY2h1bmtzIChtbmdfZGF0YXAgcERhdGEpCit7CisgIG1uZ19jaHVua3AgICAgICAgcENodW5rOworICBtbmdfY2h1bmtwICAgICAgIHBOZXh0OworICBtbmdfY2xlYW51cGNodW5rIGZDbGVhbnVwOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RST1BfQ0hVTktTLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcENodW5rID0gcERhdGEtPnBGaXJzdGNodW5rOyAgICAgICAgIC8qIGFuZCBnZXQgZmlyc3Qgc3RvcmVkIGNodW5rIChpZiBhbnkpICovCisKKyAgd2hpbGUgKHBDaHVuaykgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vcmUgY2h1bmtzIHRvIGRpc2NhcmQgPyAqLworICB7CisgICAgcE5leHQgPSAoKG1uZ19jaHVua19oZWFkZXJwKXBDaHVuayktPnBOZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2FsbCBhcHByb3ByaWF0ZSBjbGVhbnVwICovCisgICAgZkNsZWFudXAgPSAoKG1uZ19jaHVua19oZWFkZXJwKXBDaHVuayktPmZDbGVhbnVwOworICAgIGZDbGVhbnVwIChwRGF0YSwgcENodW5rKTsKKworICAgIHBDaHVuayA9IHBOZXh0OyAgICAgICAgICAgICAgICAgICAgLyogbmVlZWV4dCAqLworICB9CisKKyAgcERhdGEtPnBGaXJzdGNodW5rID0gTU5HX05VTEw7CisgIHBEYXRhLT5wTGFzdGNodW5rICA9IE1OR19OVUxMOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX0RST1BfQ0hVTktTLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKyNlbmRpZiAvKiBNTkdfU1VQUE9SVF9SRUFEIHx8IE1OR19TVVBQT1JUX1dSSVRFICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfSU5DTFVERV9XUklURV9QUk9DUworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmdfd3JpdGVfZ3JhcGhpYyAobW5nX2RhdGFwIHBEYXRhKQoreworICBtbmdfY2h1bmtwICBwQ2h1bms7CisgIG1uZ19yZXRjb2RlIGlSZXRjb2RlOworICBtbmdfdWludDMyICBpV3JpdHRlbjsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9XUklURV9HUkFQSElDLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgcENodW5rID0gcERhdGEtPnBGaXJzdGNodW5rOyAgICAgICAgIC8qIHdlJ2xsIHN0YXJ0IHdpdGggdGhlIGZpcnN0LCB0aGFuayB5b3UgKi8KKworICBpZiAocENodW5rKSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaXMgdGhlcmUgYW55dGhpbmcgdG8gd3JpdGUgPyAqLworICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3BlbiB0aGUgZmlsZSAqLworICAgIGlmICghcERhdGEtPmJXcml0aW5nKQorICAgIHsKKyNpZm5kZWYgTU5HX05PX09QRU5fQ0xPU0VfU1RSRUFNCisgICAgICBpZiAocERhdGEtPmZPcGVuc3RyZWFtICYmICFwRGF0YS0+Zk9wZW5zdHJlYW0gKChtbmdfaGFuZGxlKXBEYXRhKSkKKyAgICAgICAgTU5HX0VSUk9SIChwRGF0YSwgTU5HX0FQUElPRVJST1IpOworI2VuZGlmCisgICAgICB7CisgICAgICAgIHBEYXRhLT5iV3JpdGluZyAgICAgID0gTU5HX1RSVUU7IC8qIGluZGljYXRlIHdyaXRpbmcgKi8KKyAgICAgICAgcERhdGEtPmlXcml0ZWJ1ZnNpemUgPSAzMjc2ODsgICAgLyogZ2V0IGEgdGVtcG9yYXJ5IHdyaXRlIGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVzZXJ2ZSAxMiBieXRlcyBmb3IgbGVuZ3RoLCBjaHVua25hbWUgJiBjcmMgKi8KKyAgICAgICAgTU5HX0FMTE9DIChwRGF0YSwgcERhdGEtPnBXcml0ZWJ1ZiwgcERhdGEtPmlXcml0ZWJ1ZnNpemUrMTIpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3cml0ZSB0aGUgc2lnbmF0dXJlICovCisgICAgICAgIGlmICgoKG1uZ19jaHVua19oZWFkZXJwKXBDaHVuayktPmlDaHVua25hbWUgPT0gTU5HX1VJTlRfSUhEUikKKyAgICAgICAgICBtbmdfcHV0X3VpbnQzMiAocERhdGEtPnBXcml0ZWJ1ZiwgUE5HX1NJRyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgaWYgKCgobW5nX2NodW5rX2hlYWRlcnApcENodW5rKS0+aUNodW5rbmFtZSA9PSBNTkdfVUlOVF9KSERSKQorICAgICAgICAgIG1uZ19wdXRfdWludDMyIChwRGF0YS0+cFdyaXRlYnVmLCBKTkdfU0lHKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIG1uZ19wdXRfdWludDMyIChwRGF0YS0+cFdyaXRlYnVmLCBNTkdfU0lHKTsKKworICAgICAgICBtbmdfcHV0X3VpbnQzMiAocERhdGEtPnBXcml0ZWJ1Zis0LCBQT1NUX1NJRyk7CisKKyAgICAgICAgaWYgKCFwRGF0YS0+ZldyaXRlZGF0YSAoKG1uZ19oYW5kbGUpcERhdGEsIHBEYXRhLT5wV3JpdGVidWYsIDgsICZpV3JpdHRlbikpCisgICAgICAgIHsKKyAgICAgICAgICBNTkdfRlJFRSAocERhdGEsIHBEYXRhLT5wV3JpdGVidWYsIHBEYXRhLT5pV3JpdGVidWZzaXplKzEyKTsKKyAgICAgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfQVBQSU9FUlJPUik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaVdyaXR0ZW4gIT0gOCkgICAgICAgICAgICAgLyogZGlzayBmdWxsID8gKi8KKyAgICAgICAgeworICAgICAgICAgIE1OR19GUkVFIChwRGF0YSwgcERhdGEtPnBXcml0ZWJ1ZiwgcERhdGEtPmlXcml0ZWJ1ZnNpemUrMTIpOworICAgICAgICAgIE1OR19FUlJPUiAocERhdGEsIE1OR19PVVRQVVRFUlJPUik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICB3aGlsZSAocENodW5rKSAgICAgICAgICAgICAgICAgICAgIC8qIHNvIGxvbmcgYXMgdGhlcmUncyBzb21ldGhpbmcgdG8gd3JpdGUgKi8KKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxldCdzIGNhbGwgaXRzIG91dHB1dCByb3V0aW5lICovCisgICAgICBpUmV0Y29kZSA9ICgobW5nX2NodW5rX2hlYWRlcnApcENodW5rKS0+ZldyaXRlIChwRGF0YSwgcENodW5rKTsKKyAgICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5lZWVleHQgKi8KKyAgICAgIHBDaHVuayA9ICgobW5nX2NodW5rX2hlYWRlcnApcENodW5rKS0+cE5leHQ7CisgICAgfQorCisgICAgaWYgKCFwRGF0YS0+YkNyZWF0aW5nKQorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZnJlZSB0aGUgdGVtcG9yYXJ5IGJ1ZmZlciAqLworICAgICAgTU5HX0ZSRUUgKHBEYXRhLCBwRGF0YS0+cFdyaXRlYnVmLCBwRGF0YS0+aVdyaXRlYnVmc2l6ZSsxMik7CisKKyAgICAgIHBEYXRhLT5iV3JpdGluZyA9IE1OR19GQUxTRTsgICAgIC8qIGRvbmUgd3JpdGluZyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2xvc2UgdGhlIHN0cmVhbSBub3cgKi8KKyNpZm5kZWYgTU5HX05PX09QRU5fQ0xPU0VfU1RSRUFNCisgICAgICBpZiAocERhdGEtPmZDbG9zZXN0cmVhbSAmJiAhcERhdGEtPmZDbG9zZXN0cmVhbSAoKG1uZ19oYW5kbGUpcERhdGEpKQorICAgICAgICBNTkdfRVJST1IgKHBEYXRhLCBNTkdfQVBQSU9FUlJPUik7CisjZW5kaWYKKworICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjbGVhbnVwIHRoZSB3cml0dGVuIGNodW5rcyAqLworICAgICAgaVJldGNvZGUgPSBtbmdfZHJvcF9jaHVua3MgKHBEYXRhKTsKKyAgICAgIGlmIChpUmV0Y29kZSkgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICAgIHJldHVybiBpUmV0Y29kZTsKKyAgICB9CisgIH0KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9XUklURV9HUkFQSElDLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2VuZGlmIC8qIE1OR19JTkNMVURFX1dSSVRFX1BST0NTICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqIGVuZCBvZiBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworCmRpZmYgLS1naXQgYS9maWxlcy9Tb3VyY2UvTGliTU5HL2xpYm1uZ193cml0ZS5oIGIvZmlsZXMvU291cmNlL0xpYk1ORy9saWJtbmdfd3JpdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjA1OGZiCi0tLSAvZGV2L251bGwKKysrIGIvZmlsZXMvU291cmNlL0xpYk1ORy9saWJtbmdfd3JpdGUuaApAQCAtMCwwICsxLDQ5IEBACisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gbGlibW5nLmggICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogcHJvamVjdCAgIDogbGlibW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGZpbGUgICAgICA6IGxpYm1uZ193cml0ZS5oICAgICAgICAgICAgY29weXJpZ2h0IChjKSAyMDAwLTIwMDQgRy5KdXluICAgKiAqLworLyogKiB2ZXJzaW9uICAgOiAxLjAuOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIHB1cnBvc2UgICA6IFdyaXRlIG1hbmFnZW1lbnQgKGRlZmluaXRpb24pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogYXV0aG9yICAgIDogRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBjb21tZW50ICAgOiBEZWZpbml0aW9uIG9mIHRoZSB3cml0ZSBtYW5hZ2VtZW50IHJvdXRpbmVzICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGNoYW5nZXMgICA6IDAuNS4xIC0gMDUvMDgvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNoYW5nZWQgc3RyaWN0LUFOU0kgc3R1ZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4yIC0gMDgvMDUvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNoYW5nZWQgZmlsZS1wcmVmaXhlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC41IC0gMDgvMTkvMjAwMiAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIEI1OTcxMzQgLSBsaWJtbmcgcG9sbHV0ZXMgdGhlIGxpbmtlciBuYW1lc3BhY2UgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDEuMC45IC0gMDkvMjUvMjAwNCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIHJlcGxhY2VkIE1OR19UV0VBS19MQVJHRV9GSUxFUyB3aXRoIHBlcm1hbmVudCBzb2x1dGlvbiAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pICYmIGRlZmluZWQoTU5HX1NUUklDVF9BTlNJKQorI3ByYWdtYSBvcHRpb24gLUEgICAgICAgICAgICAgICAgICAgICAgLyogZm9yY2UgQU5TSS1DICovCisjZW5kaWYKKworI2lmbmRlZiBfbGlibW5nX3dyaXRlX2hfCisjZGVmaW5lIF9saWJtbmdfd3JpdGVfaF8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nX2Ryb3BfY2h1bmtzICAgKG1uZ19kYXRhcCBwRGF0YSk7CisKK21uZ19yZXRjb2RlIG1uZ193cml0ZV9ncmFwaGljIChtbmdfZGF0YXAgcERhdGEpOworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjZW5kaWYgLyogX2xpYm1uZ193cml0ZV9oXyAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiBlbmQgb2YgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCmRpZmYgLS1naXQgYS9maWxlcy9Tb3VyY2UvTGliTU5HL2xpYm1uZ196bGliLmMgYi9maWxlcy9Tb3VyY2UvTGliTU5HL2xpYm1uZ196bGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QxMDJlMQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9MaWJNTkcvbGlibW5nX3psaWIuYwpAQCAtMCwwICsxLDYwNyBAQAorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIGxpYm1uZy5oICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIHByb2plY3QgICA6IGxpYm1uZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBmaWxlICAgICAgOiBsaWJtbmdfemxpYi5jICAgICAgICAgICAgIGNvcHlyaWdodCAoYykgMjAwMC0yMDA0IEcuSnV5biAgICogKi8KKy8qICogdmVyc2lvbiAgIDogMS4wLjkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBwdXJwb3NlICAgOiBaTElCIGxpYnJhcnkgaW50ZXJmYWNlIChpbXBsZW1lbnRhdGlvbikgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGF1dGhvciAgICA6IEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogY29tbWVudCAgIDogaW1wbGVtZW50YXRpb24gb2YgdGhlIFpMSUIgbGlicmFyeSBpbnRlcmZhY2UgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBjaGFuZ2VzICAgOiAwLjUuMSAtIDA1LzA4LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBjaGFuZ2VkIHN0cmljdC1BTlNJIHN0dWZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuNS4xIC0gMDUvMTEvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGZpbGxlZCB0aGUgZGVmbGF0ZWRhdGEgcm91dGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjEgLSAwNS8xMi8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2hhbmdlZCB0cmFjZSB0byBtYWNybyBmb3IgY2FsbGJhY2sgZXJyb3ItcmVwb3J0aW5nICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjIgLSAwNS8yMC8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgZm9yIEpORyBhbHBoYSBoYW5kbGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjUuMiAtIDA1LzI0LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBtb3ZlZCBpbml0IG9mIGRlZmF1bHQgemxpYiBwYXJtcyBmcm9tIGhlcmUgdG8gICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgIm1uZ19obGFwaS5jIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC41LjMgLSAwNi8xNi8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2hhbmdlZCBwcm9ncmVzc2l2ZS1kaXNwbGF5IHByb2Nlc3NpbmcgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjIgLSAwOC8wNS8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gY2hhbmdlZCBmaWxlLXByZWZpeGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMC45LjMgLSAwOC8wOC8yMDAwIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gZml4ZWQgY29tcGlsZXItd2FybmluZ3MgZnJvbSBNb3ppbGxhICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAwLjkuMyAtIDA5LzA3LzIwMDAgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCBzdXBwb3J0IGZvciBuZXcgZmlsdGVyX3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAxLjAuNSAtIDA4LzA3LzIwMDIgLSBHLkp1eW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgLSBhZGRlZCB0ZXN0LW9wdGlvbiBmb3IgUE5HIGZpbHRlciBtZXRob2QgMTkzICg9bm8gZmlsdGVyKSAqICovCisvKiAqICAgICAgICAgICAgIDEuMC41IC0gMDgvMTkvMjAwMiAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIEI1OTcxMzQgLSBsaWJtbmcgcG9sbHV0ZXMgdGhlIGxpbmtlciBuYW1lc3BhY2UgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjUgLSAwOS8xOS8yMDAyIC0gRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgd2FybmluZyBmb3IgdG9vIG11Y2ggSURBVCBkYXRhICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjYgLSAwNy8wNy8yMDAzIC0gRy5SLVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgTU5HX05PXzE2QklUX1NVUFBPUlQgc3VwcG9ydCAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgMS4wLjkgLSAxMC8wOS8yMDA0IC0gRy5SLVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIC0gYWRkZWQgTU5HX05PXzFfMl80QklUX1NVUFBPUlQgc3VwcG9ydCAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpbmNsdWRlICJsaWJtbmcuaCIKKyNpbmNsdWRlICJsaWJtbmdfZGF0YS5oIgorI2luY2x1ZGUgImxpYm1uZ19lcnJvci5oIgorI2luY2x1ZGUgImxpYm1uZ190cmFjZS5oIgorI2lmZGVmIF9fQk9STEFORENfXworI3ByYWdtYSBoZHJzdG9wCisjZW5kaWYKKyNpbmNsdWRlICJsaWJtbmdfbWVtb3J5LmgiCisjaW5jbHVkZSAibGlibW5nX3BpeGVscy5oIgorI2luY2x1ZGUgImxpYm1uZ19maWx0ZXIuaCIKKyNpbmNsdWRlICJsaWJtbmdfemxpYi5oIgorCisjaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pICYmIGRlZmluZWQoTU5HX1NUUklDVF9BTlNJKQorI3ByYWdtYSBvcHRpb24gLUEgICAgICAgICAgICAgICAgICAgICAgLyogZm9yY2UgQU5TSS1DICovCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIE1OR19JTkNMVURFX1pMSUIKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKwordm9pZHBmIG1uZ3psaWJfYWxsb2MgKHZvaWRwZiBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICB1SW50ICAgaUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgIHVJbnQgICBpU2l6ZSkKK3sKKyAgdm9pZHBmIHBQdHI7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRlbXBvcmFyeSBzcGFjZSAqLworCisjaWZkZWYgTU5HX0lOVEVSTkFMX01FTU1OR01UCisgIHBQdHIgPSBjYWxsb2MgKGlDb3VudCwgaVNpemUpOyAgICAgICAvKiBsb2NhbCBhbGxvY2F0aW9uICovCisjZWxzZQorICBpZiAoKChtbmdfZGF0YXApcERhdGEpLT5mTWVtYWxsb2MpICAgLyogY2FsbGJhY2sgZnVuY3Rpb24gc2V0ID8gKi8KKyAgICBwUHRyID0gKChtbmdfZGF0YXApcERhdGEpLT5mTWVtYWxsb2MgKGlDb3VudCAqIGlTaXplKTsKKyAgZWxzZQorICAgIHBQdHIgPSBaX05VTEw7ICAgICAgICAgICAgICAgICAgICAgLyogY2FuJ3QgYWxsb2NhdGUhICovCisjZW5kaWYKKworICByZXR1cm4gcFB0cjsgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIHRoZSByZXN1bHQgKi8KK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKwordm9pZCBtbmd6bGliX2ZyZWUgKHZvaWRwZiBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICB2b2lkcGYgcEFkZHJlc3MpCit7CisjaWZkZWYgTU5HX0lOVEVSTkFMX01FTU1OR01UCisgIGZyZWUgKHBBZGRyZXNzKTsgICAgICAgICAgICAgICAgICAgICAvKiBmcmVlIGxvY2FsbHkgKi8KKyNlbHNlCisgIGlmICgoKG1uZ19kYXRhcClwRGF0YSktPmZNZW1mcmVlKSAgICAvKiBjYWxsYmFjayBzZXQ/ICovCisgICAgKChtbmdfZGF0YXApcERhdGEpLT5mTWVtZnJlZSAocEFkZHJlc3MsIDEpOworI2VuZGlmCit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ3psaWJfaW5pdGlhbGl6ZSAobW5nX2RhdGFwIHBEYXRhKQoreworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9aTElCX0lOSVRJQUxJWkUsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworI2lmZGVmIE1OR19JTlRFUk5BTF9NRU1NTkdNVAorICBwRGF0YS0+c1psaWIuemFsbG9jID0gWl9OVUxMOyAgICAgICAgLyogbGV0IHpsaWIgZmlndXJlIG91dCBtZW1vcnkgbWFuYWdlbWVudCAqLworICBwRGF0YS0+c1psaWIuemZyZWUgID0gWl9OVUxMOworICBwRGF0YS0+c1psaWIub3BhcXVlID0gWl9OVUxMOworI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdXNlIHVzZXItcHJvdmlkZWQgY2FsbGJhY2tzICovCisgIHBEYXRhLT5zWmxpYi56YWxsb2MgPSBtbmd6bGliX2FsbG9jOworICBwRGF0YS0+c1psaWIuemZyZWUgID0gbW5nemxpYl9mcmVlOworICBwRGF0YS0+c1psaWIub3BhcXVlID0gKHZvaWRwZilwRGF0YTsKKyNlbmRpZgorCisgIHBEYXRhLT5iSW5mbGF0aW5nICAgPSBNTkdfRkFMU0U7ICAgICAvKiBub3QgcGVyZm9ybWluZyBhbnkgYWN0aW9uIHlldCAqLworICBwRGF0YS0+YkRlZmxhdGluZyAgID0gTU5HX0ZBTFNFOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1pMSUJfSU5JVElBTElaRSwgTU5HX0xDX0VORCk7CisjZW5kaWYKKworICByZXR1cm4gTU5HX05PRVJST1I7ICAgICAgICAgICAgICAgICAgLyogZG9uZSAqLworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmd6bGliX2NsZWFudXAgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fWkxJQl9DTEVBTlVQLCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisKKyAgaWYgKHBEYXRhLT5iSW5mbGF0aW5nKSAgICAgICAgICAgICAgIC8qIGZvcmNlIHpsaWIgY2xlYW51cCAqLworICAgIG1uZ3psaWJfaW5mbGF0ZWZyZWUgKHBEYXRhKTsKKyAgaWYgKHBEYXRhLT5iRGVmbGF0aW5nKQorICAgIG1uZ3psaWJfZGVmbGF0ZWZyZWUgKHBEYXRhKTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9aTElCX0NMRUFOVVAsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOyAgICAgICAgICAgICAgICAgIC8qIGRvbmUgKi8KK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nemxpYl9pbmZsYXRlaW5pdCAobW5nX2RhdGFwIHBEYXRhKQoreworICBpbnQgaVpyc2x0OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1pMSUJfSU5GTEFURUlOSVQsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpemUgemxpYiBzdHJ1Y3R1cmVzIGFuZCBzdWNoICovCisgIGlacnNsdCA9IGluZmxhdGVJbml0ICgmcERhdGEtPnNabGliKTsKKworICBpZiAoaVpyc2x0ICE9IFpfT0spICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICBNTkdfRVJST1JaIChwRGF0YSwgKG1uZ191aW50MzIpaVpyc2x0KTsKKworICBwRGF0YS0+YkluZmxhdGluZyAgICAgID0gTU5HX1RSVUU7ICAgLyogcmVhbGx5IGluZmxhdGluZyBzb21ldGhpbmcgbm93ICovCisgIHBEYXRhLT5zWmxpYi5uZXh0X291dCAgPSAwOyAgICAgICAgICAvKiBmb3JjZSBKSVQgaW5pdGlhbGl6YXRpb24gKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9aTElCX0lORkxBVEVJTklULCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsgICAgICAgICAgICAgICAgICAvKiBkb25lICovCit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBNTkdfU1VQUE9SVF9ESVNQTEFZCittbmdfcmV0Y29kZSBtbmd6bGliX2luZmxhdGVyb3dzIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpSW5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBJbmRhdGEpCit7CisgIGludCAgICAgICAgIGlacnNsdDsKKyAgbW5nX3JldGNvZGUgaVJzbHQ7CisgIG1uZ19wdHIgICAgIHBTd2FwOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1pMSUJfSU5GTEFURVJPV1MsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBwRGF0YS0+c1psaWIubmV4dF9pbiAgID0gcEluZGF0YTsgICAgLyogbGV0IHpsaWIga25vdyB3aGVyZSB0byBnZXQgc3R1ZmYgKi8KKyAgcERhdGEtPnNabGliLmF2YWlsX2luICA9ICh1SW50KWlJbmxlbjsKKworICBpZiAocERhdGEtPnNabGliLm5leHRfb3V0ID09IDApICAgICAgLyogaW5pdGlhbGl6ZSBvdXRwdXQgdmFyaWFibGVzID8gKi8KKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxldCB6bGliIGtub3cgd2hlcmUgdG8gc3RvcmUgc3R1ZmYgKi8KKyAgICBwRGF0YS0+c1psaWIubmV4dF9vdXQgID0gcERhdGEtPnBXb3Jrcm93OworICAgIHBEYXRhLT5zWmxpYi5hdmFpbF9vdXQgPSAodUludCkocERhdGEtPmlSb3dzaXplICsgcERhdGEtPmlQaXhlbG9mcyk7CisjaWZkZWYgTU5HX05PXzFfMl80QklUX1NVUFBPUlQKKyAgICBpZiAocERhdGEtPmlQTkdkZXB0aCA8IDgpCisgICAgICAgcERhdGEtPnNabGliLmF2YWlsX291dCA9ICh1SW50KSgocERhdGEtPmlQTkdkZXB0aCpwRGF0YS0+aVJvd3NpemUgKyA3KS84CisgICAgICAgICAgICsgcERhdGEtPmlQaXhlbG9mcyk7CisjZW5kaWYKKyNpZmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgIGlmIChwRGF0YS0+aVBOR2RlcHRoID4gOCkKKyAgICAgICBwRGF0YS0+c1psaWIuYXZhaWxfb3V0ID0gKHVJbnQpKDIqcERhdGEtPmlSb3dzaXplICsgcERhdGEtPmlQaXhlbG9mcyk7CisjZW5kaWYKKyAgfQorCisgIGRvCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3cgaW5mbGF0ZSBhIHJvdyAqLworICAgIGlacnNsdCA9IGluZmxhdGUgKCZwRGF0YS0+c1psaWIsIFpfU1lOQ19GTFVTSCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcm9kdWNlZCBhIGZ1bGwgcm93ID8gKi8KKyAgICBpZiAoKChpWnJzbHQgPT0gWl9PSykgfHwgKGlacnNsdCA9PSBaX1NUUkVBTV9FTkQpKSAmJgorICAgICAgICAocERhdGEtPnNabGliLmF2YWlsX291dCA9PSAwKSkKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGltYWdlIG5vdCBjb21wbGV0ZWQgeWV0ID8gKi8KKyAgICAgIGlmIChwRGF0YS0+aVJvdyA8IChtbmdfaW50MzIpcERhdGEtPmlEYXRhaGVpZ2h0KQorICAgICAgeworI2lmZGVmIE1OR19OT18xXzJfNEJJVF9TVVBQT1JUCisgICAgICAgIGlmIChwRGF0YS0+aVBOR2RlcHRoID09IDEpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBJbmZsYXRlIFdvcmtyb3cgdG8gOC1iaXQgKi8KKyAgICAgICAgICBtbmdfaW50MzIgIGlYOworICAgICAgICAgIG1uZ191aW50OHAgcFNyYyA9IHBEYXRhLT5wV29ya3JvdysxOworICAgICAgICAgIG1uZ191aW50OHAgcERlc3QgPSBwU3JjICsgcERhdGEtPmlSb3dzaXplIC0gKHBEYXRhLT5pUm93c2l6ZSs3KS84OworCisgICAgICAgICAgZm9yIChpWCA9ICgocERhdGEtPmlSb3dzaXplKzcpLzgpIDsgaVggPiAwIDsgaVgtLSkKKyAgICAgICAgICAgICAqcERlc3QrKyA9ICpwU3JjKys7CisKKyAgICAgICAgICBwRGVzdCA9IHBEYXRhLT5wV29ya3JvdysxOworICAgICAgICAgIHBTcmMgPSBwRGVzdCArIHBEYXRhLT5pUm93c2l6ZSAtIChwRGF0YS0+aVJvd3NpemUrNykvODsKKyAgICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlSb3dzaXplOyA7KQorICAgICAgICAgIHsKKyAgICAgICAgICAgICpwRGVzdCsrID0gKCgoKnBTcmMpPj43KSYxKTsKKyAgICAgICAgICAgIGlmIChpWC0tIDw9IDApCisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgKnBEZXN0KysgPSAoKCgqcFNyYyk+PjYpJjEpOworICAgICAgICAgICAgaWYgKGlYLS0gPD0gMCkKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAqcERlc3QrKyA9ICgoKCpwU3JjKT4+NSkmMSk7CisgICAgICAgICAgICBpZiAoaVgtLSA8PSAwKQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICpwRGVzdCsrID0gKCgoKnBTcmMpPj40KSYxKTsKKyAgICAgICAgICAgIGlmIChpWC0tIDw9IDApCisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgKnBEZXN0KysgPSAoKCgqcFNyYyk+PjMpJjEpOworICAgICAgICAgICAgaWYgKGlYLS0gPD0gMCkKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAqcERlc3QrKyA9ICgoKCpwU3JjKT4+MikmMSk7CisgICAgICAgICAgICBpZiAoaVgtLSA8PSAwKQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICpwRGVzdCsrID0gKCgoKnBTcmMpPj4xKSYxKTsKKyAgICAgICAgICAgIGlmIChpWC0tIDw9IDApCisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgKnBEZXN0KysgPSAoKCgqcFNyYykgICApJjEpOworICAgICAgICAgICAgaWYgKGlYLS0gPD0gMCkKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBwU3JjKys7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHBEYXRhLT5pUE5HZGVwdGggPT0gMikKKyAgICAgICAgeworICAgICAgICAgIC8qIEluZmxhdGUgV29ya3JvdyB0byA4LWJpdCAqLworICAgICAgICAgIG1uZ19pbnQzMiAgaVg7CisgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjID0gcERhdGEtPnBXb3Jrcm93KzE7CisgICAgICAgICAgbW5nX3VpbnQ4cCBwRGVzdCA9IHBTcmMgKyBwRGF0YS0+aVJvd3NpemUgLSAoMipwRGF0YS0+aVJvd3NpemUrNykvODsKKworICAgICAgICAgIGZvciAoaVggPSAoKDIqcERhdGEtPmlSb3dzaXplKzcpLzgpIDsgaVggPiAwIDsgaVgtLSkKKyAgICAgICAgICAgICAqcERlc3QrKyA9ICpwU3JjKys7CisKKyAgICAgICAgICBwRGVzdCA9IHBEYXRhLT5wV29ya3JvdysxOworICAgICAgICAgIHBTcmMgPSBwRGVzdCArIHBEYXRhLT5pUm93c2l6ZSAtICgyKnBEYXRhLT5pUm93c2l6ZSs3KS84OworICAgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NpemU7IDspCisgICAgICAgICAgeworICAgICAgICAgICAgKnBEZXN0KysgPSAoKCgqcFNyYyk+PjYpJjMpOworICAgICAgICAgICAgaWYgKGlYLS0gPD0gMCkKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAqcERlc3QrKyA9ICgoKCpwU3JjKT4+NCkmMyk7CisgICAgICAgICAgICBpZiAoaVgtLSA8PSAwKQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICpwRGVzdCsrID0gKCgoKnBTcmMpPj4yKSYzKTsKKyAgICAgICAgICAgIGlmIChpWC0tIDw9IDApCisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgKnBEZXN0KysgPSAoKCgqcFNyYykgICApJjMpOworICAgICAgICAgICAgaWYgKGlYLS0gPD0gMCkKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBwU3JjKys7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHBEYXRhLT5pUE5HZGVwdGggPT0gNCkKKyAgICAgICAgeworICAgICAgICAgIC8qIEluZmxhdGUgV29ya3JvdyB0byA4LWJpdCAqLworICAgICAgICAgIG1uZ19pbnQzMiAgaVg7CisgICAgICAgICAgbW5nX3VpbnQ4cCBwU3JjID0gcERhdGEtPnBXb3Jrcm93KzE7CisgICAgICAgICAgbW5nX3VpbnQ4cCBwRGVzdCA9IHBTcmMgKyBwRGF0YS0+aVJvd3NpemUgLSAoNCpwRGF0YS0+aVJvd3NpemUrNykvODsKKworICAgICAgICAgIGZvciAoaVggPSAoKDQqcERhdGEtPmlSb3dzaXplKzcpLzgpIDsgaVggPiAwIDsgaVgtLSkKKyAgICAgICAgICAgICAqcERlc3QrKyA9ICpwU3JjKys7CisKKyAgICAgICAgICBwRGVzdCA9IHBEYXRhLT5wV29ya3JvdysxOworICAgICAgICAgIHBTcmMgPSBwRGVzdCArIHBEYXRhLT5pUm93c2l6ZSAtICg0KnBEYXRhLT5pUm93c2l6ZSs3KS84OworICAgICAgICAgIGZvciAoaVggPSBwRGF0YS0+aVJvd3NpemU7IDspCisgICAgICAgICAgeworICAgICAgICAgICAgKnBEZXN0KysgPSAoKCgqcFNyYyk+PjQpJjB4MGYpOworICAgICAgICAgICAgaWYgKGlYLS0gPD0gMCkKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAqcERlc3QrKyA9ICgoKCpwU3JjKSAgICkmMHgwZik7CisgICAgICAgICAgICBpZiAoaVgtLSA8PSAwKQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHBTcmMrKzsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBEYXRhLT5pUE5HZGVwdGggPCA4ICYmIHBEYXRhLT5pQ29sb3J0eXBlID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAvKiBFeHBhbmQgc2FtcGxlcyB0byA4LWJpdCBieSBMQlIgKi8KKyAgICAgICAgICBtbmdfaW50MzIgIGlYOworICAgICAgICAgIG1uZ191aW50OHAgcFNyYyA9IHBEYXRhLT5wV29ya3JvdysxOworICAgICAgICAgIG1uZ191aW50OCBtdWx0aXBsaWVyW109ezAsMjU1LDg1LDAsMTcsMCwwLDAsMX07CisKKyAgICAgICAgICBmb3IgKGlYID0gcERhdGEtPmlSb3dzaXplOyBpWCA+IDA7IGlYLS0pCisgICAgICAgICAgICAgICpwU3JjKysgKj0gbXVsdGlwbGllcltwRGF0YS0+aVBOR2RlcHRoXTsKKyAgICAgICAgfQorI2VuZGlmCisjaWZkZWYgTU5HX05PXzE2QklUX1NVUFBPUlQKKyAgICAgICAgaWYgKHBEYXRhLT5pUE5HZGVwdGggPiA4KQorICAgICAgICB7CisgICAgICAgICAgLyogUmVkdWNlIFdvcmtyb3cgdG8gOC1iaXQgKi8KKyAgICAgICAgICBtbmdfaW50MzIgIGlYOworICAgICAgICAgIG1uZ191aW50OHAgcFNyYyA9IHBEYXRhLT5wV29ya3JvdysxOworICAgICAgICAgIG1uZ191aW50OHAgcERlc3QgPSBwU3JjOworCisgICAgICAgICAgZm9yIChpWCA9IHBEYXRhLT5pUm93c2l6ZTsgaVggPiAwOyBpWC0tKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICpwRGVzdCA9ICpwU3JjOworICAgICAgICAgICAgcERlc3QrKzsKKyAgICAgICAgICAgIHBTcmMrPTI7CisgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYKKworI2lmZGVmIEZJTFRFUjE5MiAgICAgICAgICAgICAgICAgICAgICAgLyogaGFzIGxldmVsaW5nIGluZm8gPyAqLworICAgICAgICBpZiAocERhdGEtPmlGaWx0ZXJvZnMgPT0gTU5HX0ZJTFRFUl9ESUZGRVJJTkcpCisgICAgICAgICAgaVJzbHQgPSBpbml0X3Jvd2RpZmZlcmluZyAocERhdGEpOworICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgICBpUnNsdCA9IE1OR19OT0VSUk9SOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmlsdGVyIHRoZSByb3cgaWYgbmVjZXNzYXJ5ICovCisgICAgICAgIGlmICgoIWlSc2x0KSAmJiAocERhdGEtPmlGaWx0ZXJvZnMgPCBwRGF0YS0+aVBpeGVsb2ZzICApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoKihwRGF0YS0+cFdvcmtyb3cgKyBwRGF0YS0+aUZpbHRlcm9mcykpICAgICkKKyAgICAgICAgICBpUnNsdCA9IG1uZ19maWx0ZXJfYV9yb3cgKHBEYXRhKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGlSc2x0ID0gTU5HX05PRVJST1I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGRpdGlvbmFsIGxldmVsaW5nL2RpZmZlcmluZyA/ICovCisgICAgICAgIGlmICgoIWlSc2x0KSAmJiAocERhdGEtPmZEaWZmZXJyb3cpKQorICAgICAgICB7CisgICAgICAgICAgaVJzbHQgPSAoKG1uZ19kaWZmZXJyb3cpcERhdGEtPmZEaWZmZXJyb3cpIChwRGF0YSk7CisKKyAgICAgICAgICBwU3dhcCAgICAgICAgICAgPSBwRGF0YS0+cFdvcmtyb3c7CisgICAgICAgICAgcERhdGEtPnBXb3Jrcm93ID0gcERhdGEtPnBQcmV2cm93OworICAgICAgICAgIHBEYXRhLT5wUHJldnJvdyA9IHBTd2FwOyAgICAgLyogbWFrZSBzdXJlIHdlJ3JlIHByb2Nlc3NpbmcgdGhlIHJpZ2h0IGRhdGEgKi8KKyAgICAgICAgfQorCisgICAgICAgIGlmICghaVJzbHQpCisgICAgICAgIHsKKyNpZmRlZiBNTkdfSU5DTFVERV9KTkcKKyAgICAgICAgICBpZiAocERhdGEtPmJIYXNKSERSKSAgICAgICAgIC8qIGlzIEpORyBhbHBoYS1jaGFubmVsID8gKi8KKyAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGp1c3Qgc3RvcmUgaW4gb2JqZWN0ID8gKi8KKyAgICAgICAgICAgIGlmICgoIWlSc2x0KSAmJiAocERhdGEtPmZTdG9yZXJvdykpCisgICAgICAgICAgICAgIGlSc2x0ID0gKChtbmdfc3RvcmVyb3cpcERhdGEtPmZTdG9yZXJvdykgICAgIChwRGF0YSk7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyNlbmRpZiAvKiBNTkdfSU5DTFVERV9KTkcgKi8KKyAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByb2Nlc3MgdGhpcyByb3cgKi8KKyAgICAgICAgICAgIGlmICgoIWlSc2x0KSAmJiAocERhdGEtPmZQcm9jZXNzcm93KSkKKyAgICAgICAgICAgICAgaVJzbHQgPSAoKG1uZ19wcm9jZXNzcm93KXBEYXRhLT5mUHJvY2Vzc3JvdykgKHBEYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlIGluIG9iamVjdCA/ICovCisgICAgICAgICAgICBpZiAoKCFpUnNsdCkgJiYgKHBEYXRhLT5mU3RvcmVyb3cpKQorICAgICAgICAgICAgICBpUnNsdCA9ICgobW5nX3N0b3Jlcm93KXBEYXRhLT5mU3RvcmVyb3cpICAgICAocERhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29sb3IgY29ycmVjdGlvbiA/ICovCisgICAgICAgICAgICBpZiAoKCFpUnNsdCkgJiYgKHBEYXRhLT5mQ29ycmVjdHJvdykpCisgICAgICAgICAgICAgIGlSc2x0ID0gKChtbmdfY29ycmVjdHJvdylwRGF0YS0+ZkNvcnJlY3Ryb3cpIChwRGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzbGFwIG9udG8gY2FudmFzID8gKi8KKyAgICAgICAgICAgIGlmICgoIWlSc2x0KSAmJiAocERhdGEtPmZEaXNwbGF5cm93KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaVJzbHQgPSAoKG1uZ19kaXNwbGF5cm93KXBEYXRhLT5mRGlzcGxheXJvdykgKHBEYXRhKTsKKworICAgICAgICAgICAgICBpZiAoIWlSc2x0KSAgICAgICAgICAgICAgLyogY2hlY2sgcHJvZ3Jlc3NpdmUgZGlzcGxheSByZWZyZXNoICovCisgICAgICAgICAgICAgICAgaVJzbHQgPSBtbmdfZGlzcGxheV9wcm9ncmVzc2l2ZV9jaGVjayAocERhdGEpOworCisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGlSc2x0KSAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICAgICAgTU5HX0VSUk9SIChwRGF0YSwgaVJzbHQpOworCisgICAgICAgIGlmICghcERhdGEtPmZEaWZmZXJyb3cpICAgICAgICAvKiBzd2FwIHJvdy1wb2ludGVycyAqLworICAgICAgICB7CisgICAgICAgICAgcFN3YXAgICAgICAgICAgID0gcERhdGEtPnBXb3Jrcm93OworICAgICAgICAgIHBEYXRhLT5wV29ya3JvdyA9IHBEYXRhLT5wUHJldnJvdzsKKyAgICAgICAgICBwRGF0YS0+cFByZXZyb3cgPSBwU3dhcDsgICAgIC8qIHNvIHByZXYgcG9pbnRzIHRvIHRoZSBwcm9jZXNzZWQgcm93ISAqLworICAgICAgICB9CisKKyAgICAgICAgaVJzbHQgPSBtbmdfbmV4dF9yb3cgKHBEYXRhKTsgIC8qIGFkanVzdCB2YXJpYWJsZXMgZm9yIG5leHQgcm93ICovCisKKyAgICAgICAgaWYgKGlSc2x0KSAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgICAgICAgICAgTU5HX0VSUk9SIChwRGF0YSwgaVJzbHQpOworICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGV0IHpsaWIga25vdyB3aGVyZSB0byBzdG9yZSBuZXh0IG91dHB1dCAqLworICAgICAgcERhdGEtPnNabGliLm5leHRfb3V0ICA9IHBEYXRhLT5wV29ya3JvdzsKKyAgICAgIHBEYXRhLT5zWmxpYi5hdmFpbF9vdXQgPSAodUludCkocERhdGEtPmlSb3dzaXplICsgcERhdGEtPmlQaXhlbG9mcyk7CisjaWZkZWYgTU5HX05PXzFfMl80QklUX1NVUFBPUlQKKyAgICBpZiAocERhdGEtPmlQTkdkZXB0aCA8IDgpCisgICAgICAgcERhdGEtPnNabGliLmF2YWlsX291dCA9ICh1SW50KSgocERhdGEtPmlQTkdkZXB0aCpwRGF0YS0+aVJvd3NpemUgKyA3KS84CisgICAgICAgICAgICsgcERhdGEtPmlQaXhlbG9mcyk7CisjZW5kaWYKKyNpZmRlZiBNTkdfTk9fMTZCSVRfU1VQUE9SVAorICAgICAgaWYgKHBEYXRhLT5pUE5HZGVwdGggPiA4KQorICAgICAgICBwRGF0YS0+c1psaWIuYXZhaWxfb3V0ID0gKHVJbnQpKDIqcERhdGEtPmlSb3dzaXplICsgcERhdGEtPmlQaXhlbG9mcyk7CisjZW5kaWYKKyAgICB9CisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1bnRpbCBzb21lIGVycm9yIG9yIEVPSQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgYWxsIHBpeGVscyByZWNlaXZlZCAqLworICB3aGlsZSAoIChpWnJzbHQgPT0gWl9PSykgJiYgKHBEYXRhLT5zWmxpYi5hdmFpbF9pbiA+IDApICAgICAgJiYKKyAgICAgICAgICAoIChwRGF0YS0+aVJvdyA8IChtbmdfaW50MzIpcERhdGEtPmlEYXRhaGVpZ2h0KSB8fAorICAgICAgICAgICAgKCAocERhdGEtPmlQYXNzID49IDApICYmIChwRGF0YS0+aVBhc3MgPCA3KSApICAgICkgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgIGlmICgoaVpyc2x0ICE9IFpfT0spICYmIChpWnJzbHQgIT0gWl9TVFJFQU1fRU5EKSkKKyAgICBNTkdfRVJST1JaIChwRGF0YSwgKG1uZ191aW50MzIpaVpyc2x0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRvbyBtdWNoIGRhdGEgPyAqLworICBpZiAoKGlacnNsdCA9PSBaX09LKSAmJiAocERhdGEtPnNabGliLmF2YWlsX2luID4gMCkpCisgICAgTU5HX1dBUk5JTkcgKHBEYXRhLCBNTkdfVE9PTVVDSElEQVQpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1pMSUJfSU5GTEFURVJPV1MsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorI2VuZGlmIC8qIE1OR19TVVBQT1JUX0RJU1BMQVkgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nemxpYl9pbmZsYXRlZGF0YSAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaUlubGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwSW5kYXRhKQoreworICBpbnQgaVpyc2x0OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1pMSUJfSU5GTEFURURBVEEsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxldCB6bGliIGtub3cgd2hlcmUgdG8gZ2V0IHN0dWZmICovCisgIHBEYXRhLT5zWmxpYi5uZXh0X2luICAgPSBwSW5kYXRhOworICBwRGF0YS0+c1psaWIuYXZhaWxfaW4gID0gKHVJbnQpaUlubGVuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm93IGluZmxhdGUgdGhlIGRhdGEgaW4gb25lIGdvISAqLworICBpWnJzbHQgPSBpbmZsYXRlICgmcERhdGEtPnNabGliLCBaX0ZJTklTSCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3QgZW5vdWdoIHJvb20gaW4gb3V0cHV0LWJ1ZmZlciA/ICovCisgIGlmICgoaVpyc2x0ID09IFpfQlVGX0VSUk9SKSB8fCAocERhdGEtPnNabGliLmF2YWlsX2luID4gMCkpCisgICAgcmV0dXJuIE1OR19CVUZPVkVSRkxPVzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGVycm9yIGJhaWwgb3V0ICovCisgIGlmICgoaVpyc2x0ICE9IFpfT0spICYmIChpWnJzbHQgIT0gWl9TVFJFQU1fRU5EKSkKKyAgICBNTkdfRVJST1JaIChwRGF0YSwgKG1uZ191aW50MzIpaVpyc2x0KTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9aTElCX0lORkxBVEVEQVRBLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworbW5nX3JldGNvZGUgbW5nemxpYl9pbmZsYXRlZnJlZSAobW5nX2RhdGFwIHBEYXRhKQoreworICBpbnQgaVpyc2x0OworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1pMSUJfSU5GTEFURUZSRUUsIE1OR19MQ19TVEFSVCk7CisjZW5kaWYKKworICBwRGF0YS0+YkluZmxhdGluZyA9IE1OR19GQUxTRTsgICAgICAgLyogc3RvcHBlZCBpdCAqLworCisgIGlacnNsdCA9IGluZmxhdGVFbmQgKCZwRGF0YS0+c1psaWIpOyAvKiBsZXQgemxpYiBjbGVhbnVwIGl0cyBvd24gc3R1ZmYgKi8KKworICBpZiAoaVpyc2x0ICE9IFpfT0spICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICBNTkdfRVJST1JaIChwRGF0YSwgKG1uZ191aW50MzIpaVpyc2x0KTsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9aTElCX0lORkxBVEVGUkVFLCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsgICAgICAgICAgICAgICAgICAvKiBkb25lICovCit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ3psaWJfZGVmbGF0ZWluaXQgKG1uZ19kYXRhcCBwRGF0YSkKK3sKKyAgaW50IGlacnNsdDsKKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9aTElCX0RFRkxBVEVJTklULCBNTkdfTENfU1RBUlQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0aWFsaXplIHpsaWIgc3RydWN0dXJlcyBhbmQgc3VjaCAqLworICBpWnJzbHQgPSBkZWZsYXRlSW5pdDIgKCZwRGF0YS0+c1psaWIsIHBEYXRhLT5pWmxldmVsLCBwRGF0YS0+aVptZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlad2luZG93Yml0cywgcERhdGEtPmlabWVtbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmlac3RyYXRlZ3kpOworCisgIGlmIChpWnJzbHQgIT0gWl9PSykgICAgICAgICAgICAgICAgICAvKiBvbiBlcnJvciBiYWlsIG91dCAqLworICAgIE1OR19FUlJPUlogKHBEYXRhLCAobW5nX3VpbnQzMilpWnJzbHQpOworCisgIHBEYXRhLT5iRGVmbGF0aW5nID0gTU5HX1RSVUU7ICAgICAgICAvKiByZWFsbHkgZGVmbGF0aW5nIHNvbWV0aGluZyBub3cgKi8KKworI2lmZGVmIE1OR19TVVBQT1JUX1RSQUNFCisgIE1OR19UUkFDRSAocERhdGEsIE1OR19GTl9aTElCX0RFRkxBVEVJTklULCBNTkdfTENfRU5EKTsKKyNlbmRpZgorCisgIHJldHVybiBNTkdfTk9FUlJPUjsgICAgICAgICAgICAgICAgICAvKiBkb25lICovCit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ3psaWJfZGVmbGF0ZXJvd3MgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlJbmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcEluZGF0YSkKK3sKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fWkxJQl9ERUZMQVRFUk9XUywgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisKKworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1pMSUJfREVGTEFURVJPV1MsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmd6bGliX2RlZmxhdGVkYXRhIChtbmdfZGF0YXAgIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQzMiBpSW5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDhwIHBJbmRhdGEpCit7CisgIGludCBpWnJzbHQ7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fWkxJQl9ERUZMQVRFREFUQSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIHBEYXRhLT5zWmxpYi5uZXh0X2luICA9IHBJbmRhdGE7ICAgICAvKiBsZXQgemxpYiBrbm93IHdoZXJlIHRvIGdldCBzdHVmZiAqLworICBwRGF0YS0+c1psaWIuYXZhaWxfaW4gPSAodUludClpSW5sZW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3cgZGVmbGF0ZSB0aGUgZGF0YSBpbiBvbmUgZ28hICovCisgIGlacnNsdCA9IGRlZmxhdGUgKCZwRGF0YS0+c1psaWIsIFpfRklOSVNIKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdCBlbm91Z2ggcm9vbSBpbiBvdXRwdXQtYnVmZmVyID8gKi8KKyAgaWYgKChpWnJzbHQgPT0gWl9CVUZfRVJST1IpIHx8IChwRGF0YS0+c1psaWIuYXZhaWxfaW4gPiAwKSkKKyAgICByZXR1cm4gTU5HX0JVRk9WRVJGTE9XOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgaWYgKChpWnJzbHQgIT0gWl9PSykgJiYgKGlacnNsdCAhPSBaX1NUUkVBTV9FTkQpKQorICAgIE1OR19FUlJPUlogKHBEYXRhLCAobW5nX3VpbnQzMilpWnJzbHQpOworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1pMSUJfREVGTEFURURBVEEsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCittbmdfcmV0Y29kZSBtbmd6bGliX2RlZmxhdGVmcmVlIChtbmdfZGF0YXAgcERhdGEpCit7CisgIGludCBpWnJzbHQ7CisKKyNpZmRlZiBNTkdfU1VQUE9SVF9UUkFDRQorICBNTkdfVFJBQ0UgKHBEYXRhLCBNTkdfRk5fWkxJQl9ERUZMQVRFRlJFRSwgTU5HX0xDX1NUQVJUKTsKKyNlbmRpZgorCisgIGlacnNsdCA9IGRlZmxhdGVFbmQgKCZwRGF0YS0+c1psaWIpOyAvKiBsZXQgemxpYiBjbGVhbnVwIGl0cyBvd24gc3R1ZmYgKi8KKworICBpZiAoaVpyc2x0ICE9IFpfT0spICAgICAgICAgICAgICAgICAgLyogb24gZXJyb3IgYmFpbCBvdXQgKi8KKyAgICBNTkdfRVJST1JaIChwRGF0YSwgKG1uZ191aW50MzIpaVpyc2x0KTsKKworICBwRGF0YS0+YkRlZmxhdGluZyA9IE1OR19GQUxTRTsgICAgICAgLyogc3RvcHBlZCBpdCAqLworCisjaWZkZWYgTU5HX1NVUFBPUlRfVFJBQ0UKKyAgTU5HX1RSQUNFIChwRGF0YSwgTU5HX0ZOX1pMSUJfREVGTEFURUZSRUUsIE1OR19MQ19FTkQpOworI2VuZGlmCisKKyAgcmV0dXJuIE1OR19OT0VSUk9SOyAgICAgICAgICAgICAgICAgIC8qIGRvbmUgKi8KK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2VuZGlmIC8qIE1OR19JTkNMVURFX1pMSUIgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogZW5kIG9mIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCmRpZmYgLS1naXQgYS9maWxlcy9Tb3VyY2UvTGliTU5HL2xpYm1uZ196bGliLmggYi9maWxlcy9Tb3VyY2UvTGliTU5HL2xpYm1uZ196bGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZjMzkxOAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9MaWJNTkcvbGlibW5nX3psaWIuaApAQCAtMCwwICsxLDYwIEBACisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gbGlibW5nLmggICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogcHJvamVjdCAgIDogbGlibW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGZpbGUgICAgICA6IGxpYm1uZ196bGliLmggICAgICAgICAgICAgY29weXJpZ2h0IChjKSAyMDAwLTIwMDIgRy5KdXluICAgKiAqLworLyogKiB2ZXJzaW9uICAgOiAxLjAuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIHB1cnBvc2UgICA6IFpMSUIgcGFja2FnZSBpbnRlcmZhY2UgKGRlZmluaXRpb24pICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogYXV0aG9yICAgIDogRy5KdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiBjb21tZW50ICAgOiBEZWZpbml0aW9uIG9mIHRoZSBaTElCIHBhY2thZ2UgaW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqIGNoYW5nZXMgICA6IDAuNS4xIC0gMDUvMDgvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNoYW5nZWQgc3RyaWN0LUFOU0kgc3R1ZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqICAgICAgICAgICAgIDAuOS4yIC0gMDgvMDUvMjAwMCAtIEcuSnV5biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKiAgICAgICAgICAgICAtIGNoYW5nZWQgZmlsZS1wcmVmaXhlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KKy8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pICYmIGRlZmluZWQoTU5HX1NUUklDVF9BTlNJKQorI3ByYWdtYSBvcHRpb24gLUEgICAgICAgICAgICAgICAgICAgICAgLyogZm9yY2UgQU5TSS1DICovCisjZW5kaWYKKworI2lmbmRlZiBfbGlibW5nX3psaWJfaF8KKyNkZWZpbmUgX2xpYm1uZ196bGliX2hfCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK21uZ19yZXRjb2RlIG1uZ3psaWJfaW5pdGlhbGl6ZSAgKG1uZ19kYXRhcCBwRGF0YSk7CittbmdfcmV0Y29kZSBtbmd6bGliX2NsZWFudXAgICAgIChtbmdfZGF0YXAgcERhdGEpOworCittbmdfcmV0Y29kZSBtbmd6bGliX2luZmxhdGVpbml0IChtbmdfZGF0YXAgcERhdGEpOworbW5nX3JldGNvZGUgbW5nemxpYl9pbmZsYXRlcm93cyAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaUlubGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwSW5kYXRhKTsKK21uZ19yZXRjb2RlIG1uZ3psaWJfaW5mbGF0ZWRhdGEgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlJbmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcEluZGF0YSk7CittbmdfcmV0Y29kZSBtbmd6bGliX2luZmxhdGVmcmVlIChtbmdfZGF0YXAgcERhdGEpOworCittbmdfcmV0Y29kZSBtbmd6bGliX2RlZmxhdGVpbml0IChtbmdfZGF0YXAgcERhdGEpOworbW5nX3JldGNvZGUgbW5nemxpYl9kZWZsYXRlcm93cyAobW5nX2RhdGFwICBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50MzIgaUlubGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW5nX3VpbnQ4cCBwSW5kYXRhKTsKK21uZ19yZXRjb2RlIG1uZ3psaWJfZGVmbGF0ZWRhdGEgKG1uZ19kYXRhcCAgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfdWludDMyIGlJbmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1uZ191aW50OHAgcEluZGF0YSk7CittbmdfcmV0Y29kZSBtbmd6bGliX2RlZmxhdGVmcmVlIChtbmdfZGF0YXAgcERhdGEpOworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjZW5kaWYgLyogX2xpYm1uZ196bGliX2hfICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqIGVuZCBvZiBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9NYXBJbnRyb3NwZWN0b3IuaCBiL2ZpbGVzL1NvdXJjZS9NYXBJbnRyb3NwZWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTFiYTY4Ci0tLSAvZGV2L251bGwKKysrIGIvZmlsZXMvU291cmNlL01hcEludHJvc3BlY3Rvci5oCkBAIC0wLDAgKzEsMjEyIEBACisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBTVEwgTWFwSW50cm9zcGVjdG9yIGNsYXNzCisvLworLy8gRGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBieQorLy8gLSBDYXJzdGVuIEtsZWluIChja2xlaW4wNUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQpCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRnJlZUltYWdlIDMKKy8vCisvLyBDT1ZFUkVEIENPREUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkKKy8vIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTCisvLyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy8vIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVECisvLyBDT0RFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UCisvLyBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWQorLy8gU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTAorLy8gUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUgorLy8gVEhJUyBESVNDTEFJTUVSLgorLy8KKy8vIFVzZSBhdCB5b3VyIG93biByaXNrIQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaWZuZGVmIE1BUElOVFJPU1BFQ1RPUl9IXworI2RlZmluZSBNQVBJTlRST1NQRUNUT1JfSF8KKworLy8gd2UgbmVlZCBhdCBsZWFzdCBvbmUgQysrIGhlYWRlciBpbmNsdWRlZCwgCisvLyB0aGF0IGRlZmluZXMgdGhlIEMrKyBTdGFuZGFyZCBMaWJyYXJ5J3MgdmVyc2lvbiBtYWNybywgCisvLyB0aGF0IGlzIHVzZWQgYmVsb3cgdG8gaWRlbnRpZnkgdGhlIGxpYnJhcnkuCisjaW5jbHVkZSA8Y3N0ZGxpYj4KKworLyoqCitDbGFzcyBNYXBJbnRyb3NwZWN0b3IgLSBTVEwgc3RkOjptYXAgSW50cm9zcGVjdG9yCisKK1RoZSBNYXBJbnRyb3NwZWN0b3IgaXMgYSBoZWxwZXIgY2xhc3MgdXNlZCB0byBjYWxjdWxhdGUgb3IgZXN0aW1hdGUgcGFydAorb2YgdGhlIGludGVybmFsIG1lbW9yeSBmb290cHJpbnQgb2YgYSBzdGQ6Om1hcCwgdGhhdCBpcyB0aGUgbWVtb3J5IHVzZWQKK2J5IE4gZW50cmllcywgd2hlcmUgTiBpcyBwcm92aWRlZCBhcyBhbiBhcmd1bWVudC4gVGhpcyBjbGFzcyBpcyB1c2VkIGJ5CitmdW5jdGlvbiBGcmVlSW1hZ2VfR2V0TWVtb3J5U2l6ZSwgd2hpY2ggYWltcyB0byBnZXQgdGhlIHRvdGFsIG1lbW9yeQordXNhZ2UgZm9yIGEgRnJlZUltYWdlIGJpdG1hcC4KKworVGhlIHR5cGUgYXJndW1lbnQgX01hcHR5cGUgbXVzdCB0YWtlIHRoZSB0eXBlIG9mIHRoZSBzdGQ6Om1hcCB0byBiZQoraW50cm9zcGVjdGVkLgorCitUaGlzIGNsYXNzIGFjY291bnRzIGZvciAnaW50ZXJuYWwnIG1lbW9yeSBwZXIgZW50cnkgb25seSwgdGhhdCBpcywgdGhlCitzaXplIHJldHVybmVkIGRvZXMgbmVpdGhlciBpbmNsdWRlIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgc3RkOjptYXAgY2xhc3MKK2l0c2VsZiwgbm9yIGRvZXMgaXQgaW5jbHVkZSB0aGUgc2l6ZSBvZiByZWZlcmVuY2VkIGtleXMgYW5kIHZhbHVlcyAoYWxzbwordGhlIGFjdHVhbCBieXRlcyByZXF1aXJlZCBmb3Igc3RkOjpzdHJpbmcgdHlwZSBrZXlzIG9yIHZhbHVlcyBhcmUgbm90Citjb3VudGVkKS4gRm9yIGV4YW1wbGUsIHRoZSB0b3RhbCBtZW1vcnkgdXNhZ2Ugc2hvdWxkIGJlIHNvbWV0aGluZyBsaWtlOgorCit0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBkb3VibGU+IERCTE1BUAorREJMTUFQIE15TWFwOworCitpbnQgdG90YWxfc2l6ZSA9IHNpemVvZihEQkxNQVApICsgTWFwSW50cm9zcGVjdG9yPERCTE1BUD46OkdldE5vZGVzTWVtb3J5U2l6ZShNeU1hcC5zaXplKCkpCitmb3IgKERCTE1BUDo6aXRlcmF0b3IgaSA9IE15TWFwLT5iZWdpbigpOyBpICE9IE15TWFwLT5lbmQoKTsgaSsrKSB7Cisgc3RkOjpzdHJpbmcga2V5ID0gaS0+Zmlyc3Q7CisgdG90YWxfc2l6ZSArPSBrZXkuY2FwYWNpdHkoKTsKK30KKworU28sIGJhc2ljYWxseSwgdGhpcyBjbGFzcycgdGFzayBpcyB0byBnZXQgdGhlIChjb25zdGFudCkgbnVtYmVyIG9mIGJ5dGVzCitwZXIgZW50cnksIHdoaWNoIGlzIG11bHRpcGxpZWQgYnkgTiAocGFyYW1ldGVyIG5vZGVfY291bnQpIGFuZCByZXR1cm5lZAoraW4gbWV0aG9kIEdldE5vZGVzTWVtb3J5U2l6ZS4gU2luY2UgdGhpcyBoZWF2aWx5IGRlcGVuZHMgb24gdGhlIGFjdHVhbGx5Cit1c2VkIEMrKyBTdGFuZGFyZCBMaWJyYXJ5LCB0aGlzIGNsYXNzIG11c3QgYmUgaW1wbGVtZW50ZWQgc3BlY2lmaWNhbGx5Citmb3IgZWFjaCBDKysgU3RhbmRhcmQgTGlicmFyeS4KKworQXQgY3VycmVudCwgdGhlcmUgaXMgYW4gaW1wbGVtZW50YXRpb24gYXZhaWxhYmxlIGZvciB0aGVzZSBDKysgU3RhbmRhcmQKK0xpYnJhcmllczoKKworLSBNaWNyb3NvZnQgQysrIFN0YW5kYXJkIExpYnJhcnkKKy0gR05VIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IHYzLCBsaWJzdGRjKystdjMKKy0gTExWTSAibGliYysrIiBDKysgU3RhbmRhcmQgTGlicmFyeSAodW50ZXN0ZWQpCistIFVua25vd24gQysrIFN0YW5kYXJkIExpYnJhcnkKKworVm9sdW50ZWVycyBmb3IgdGVzdGluZyBhcyB3ZWxsIGFzIGZvciBwcm92aWRpbmcgc3VwcG9ydCBmb3Igb3RoZXIvbmV3CitsaWJyYXJpZXMgYXJlIHdlbGNvbWUuCisKK1RoZSAnVW5rbm93biBDKysgU3RhbmRhcmQgTGlicmFyeScgY2FzZSBpcyB1c2VkIGlmIG5vIG90aGVyIGtub3duIEMrKworU3RhbmRhcmQgTGlicmFyeSB3YXMgZGV0ZWN0ZWQuIEl0IHVzZXMgYSB0eXBpY2FsIF9Ob2RlIHN0cnVjdHVyZSB0bworZGVjbGFyZSBhbiBlc3RpbWF0ZWQgbWVtb3J5IGNvbnN1bXB0aW9uIGZvciBhIG5vZGUuCisqLworCisjaWYgZGVmaW5lZChfQ1BQTElCX1ZFUikJLy8gTWljcm9zb2Z0IEMrKyBTdGFuZGFyZCBMaWJyYXJ5CisvKioKKyBUaGUgTWljcm9zb2Z0IEMrKyBTdGFuZGFyZCBMaWJyYXJ5IHVzZXMgdGhlIHByb3RlY3RlZCBzdHJ1Y3R1cmUgX05vZGUKKyBvZiBjbGFzcyBzdGQ6Ol9UcmVlX25vZCB0byByZXByZXNlbnQgYSBub2RlLiBUaGlzIGNsYXNzIGlzIHVzZWQgYnkKKyBzdGQ6Ol9UcmVlLCB0aGUgYmFzZSBjbGFzcyBvZiBzdGQ6Om1hcC4gU28sIHNpbmNlIHN0ZDo6bWFwIGlzIGRlcml2ZWQKKyBmcm9tIHN0ZDo6X1RyZWUgKGFuZCBfTm9kZSBpcyBwcm90ZWN0ZWQpLCB3ZSBjYW4gZ2V0IGFjY2VzcyB0byB0aGlzCisgc3RydWN0dXJlIGJ5IGRlcml2aW5nIGZyb20gc3RkOjptYXAuCisKKyBBZGRpdGlvbmFsbHksIHRoZSBNaWNyb3NvZnQgQysrIFN0YW5kYXJkIExpYnJhcnkgdXNlcyBhIHNlcGFyYXRlbHkKKyBhbGxvY2F0ZWQgZW5kIG5vZGUgZm9yIGl0cyBiYWxhbmNlZCByZWQtYmxhY2sgdHJlZSBzbywgYWN0dWFsbHksIHRoZXJlCisgYXJlIHNpemUoKSArIDEgbm9kZXMgcHJlc2VudCBpbiBtZW1vcnkuCisKKyBXaXRoIGFsbCB0aGF0IGluIHBsYWNlLCB0aGUgdG90YWwgbWVtb3J5IGZvciBhbGwgbm9kZXMgaW4gc3RkOjptYXAKKyBpcyBzaW1wbHkgKG5vZGVfY291bnQgKyAxKSAqIHNpemVvZihfTm9kZSkuCisqLwordGVtcGxhdGU8Y2xhc3MgX01hcHR5cGU+CitjbGFzcyBNYXBJbnRyb3NwZWN0b3I6IHByaXZhdGUgX01hcHR5cGUgeworcHVibGljOgorCXN0YXRpYyBzaXplX3QgR2V0Tm9kZXNNZW1vcnlTaXplKHNpemVfdCBub2RlX2NvdW50KSB7CisJCXJldHVybiAobm9kZV9jb3VudCArIDEpICogc2l6ZW9mKF9Ob2RlKTsKKwl9Cit9OworCisjZWxpZiBkZWZpbmVkKF9fR0xJQkNYWF9fKQkvLyBHTlUgU3RhbmRhcmQgQysrIExpYnJhcnkgdjMsIGxpYnN0ZGMrKy12MworLyoqCisgVGhlIEdOVSBTdGFuZGFyZCBDKysgTGlicmFyeSB2MyB1c2VzIHN0cnVjdHVyZSBzdGQ6Ol9SYl90cmVlX25vZGU8X1ZhbD4sCisgd2hpY2ggaXMgcHVibGljbHkgZGVjbGFyZWQgaW4gdGhlIHN0YW5kYXJkIG5hbWVzcGFjZS4gSXRzIHZhbHVlIHR5cGUKKyBfVmFsIGlzIGFjdHVhbGx5IHRoZSBtYXAncyB2YWx1ZV90eXBlIHN0ZDo6bWFwOjp2YWx1ZV90eXBlLgorCisgU28sIHRoZSB0b3RhbCBtZW1vcnkgZm9yIGFsbCBub2RlcyBpbiBzdGQ6Om1hcCBpcyBzaW1wbHkKKyBub2RlX2NvdW50ICogc2l6ZW9mKHN0ZDo6X1JiX3RyZWVfbm9kZTxfVmFsPiksIF9WYWwgYmVpbmcgdGhlIG1hcCdzCisgdmFsdWVfdHlwZS4KKyovCit0ZW1wbGF0ZTxjbGFzcyBfTWFwdHlwZT4KK2NsYXNzIE1hcEludHJvc3BlY3RvciB7Citwcml2YXRlOgorCXR5cGVkZWYgdHlwZW5hbWUgX01hcHR5cGU6OnZhbHVlX3R5cGUgX1ZhbDsKKworcHVibGljOgorCXN0YXRpYyBzaXplX3QgR2V0Tm9kZXNNZW1vcnlTaXplKHNpemVfdCBub2RlX2NvdW50KSB7CisJCXJldHVybiBub2RlX2NvdW50ICogc2l6ZW9mKHN0ZDo6X1JiX3RyZWVfbm9kZTxfVmFsPik7CisJfQorfTsKKworI2VsaWYgZGVmaW5lZChfTElCQ1BQX1ZFUlNJT04pCS8vICJsaWJjKysiIEMrKyBTdGFuZGFyZCBMaWJyYXJ5IChMTFZNKQorLyoKKyBUaGUgImxpYmMrKyIgQysrIFN0YW5kYXJkIExpYnJhcnkgdXNlcyBzdHJ1Y3R1cmUKKyBzdGQ6Ol9fdHJlZV9ub2RlPF9WYWwsIHZvaWQqPiBmb3IgcmVndWxhciBub2RlcyBhbmQgb25lIGluc3RhbmNlIG9mCisgc3RydWN0dXJlIHN0ZDo6X190cmVlX2VuZF9ub2RlPHZvaWQqPiBmb3IgZW5kIG5vZGVzLCB3aGljaCBib3RoIGFyZQorIHB1YmxpY2x5IGRlY2xhcmVkIGluIHRoZSBzdGFuZGFyZCBuYW1lc3BhY2UuIEl0cyB2YWx1ZSB0eXBlIF9WYWwgaXMKKyBhY3R1YWxseSB0aGUgbWFwJ3MgdmFsdWVfdHlwZSBzdGQ6Om1hcDo6dmFsdWVfdHlwZS4KKworIFNvLCB0aGUgdG90YWwgbWVtb3J5IGZvciBhbGwgbm9kZXMgaW4gc3RkOjptYXAgaXMgc2ltcGx5Cisgbm9kZV9jb3VudCAqIHNpemVvZihzdGQ6Ol9fdHJlZV9ub2RlPF9WYWwsIHZvaWQqPikKKyArIHNpemVvZihzdGQ6Ol9fdHJlZV9lbmRfbm9kZTx2b2lkKj4pLgorIAorIFJFTUFSSzogdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBub3QgeWV0IHRlc3RlZCEKKyovCit0ZW1wbGF0ZTxjbGFzcyBfTWFwdHlwZT4KK2NsYXNzIE1hcEludHJvc3BlY3RvciB7Citwcml2YXRlOgorCXR5cGVkZWYgdHlwZW5hbWUgX01hcHR5cGU6OnZhbHVlX3R5cGUgX1ZhbDsKKworcHVibGljOgorCXN0YXRpYyBzaXplX3QgR2V0Tm9kZXNNZW1vcnlTaXplKHNpemVfdCBub2RlX2NvdW50KSB7CisJCXJldHVybiBub2RlX2NvdW50ICogc2l6ZW9mKHN0ZDo6X190cmVlX25vZGU8X1ZhbCwgdm9pZCo+KSArIHNpemVvZihzdGQ6Ol9fdHJlZV9lbmRfbm9kZTx2b2lkKj4pOworCX0KK307CisKKy8vI2VsaWYgZGVmaW5lZChfQUREX1lPVVJfQ1BQX1NURF9MSUJSQVJZX0hFUkVfKQorCisjZWxzZQkJCQkJCQkvLyBVbmtub3duIEMrKyBTdGFuZGFyZCBMaWJyYXJ5CisvKioKKyBJZiB3ZSBkbyBub3Qga25vdyB0aGUgYWN0dWFsIEMrKyBTdGFuZGFyZCBMaWJyYXJ5IGFuZCBzbywgaGF2ZSBubworIGFjY2VzcyB0byBhbnkgaW50ZXJuYWwgdHlwZXMsIHdlIGNhbiBqdXN0IG1ha2Ugc29tZSBhc3N1bXB0aW9ucyBhYm91dAorIHRoZSBpbXBsZW1lbnRhdGlvbiBhbmQgbWVtb3J5IHVzYWdlLgorCisgSG93ZXZlciwgYWxsIGltcGxlbWVudGF0aW9ucyB3aWxsIHByb2JhYmx5IGJlIGJhc2VkIG9uIGEgYmFsYW5jZWQKKyByZWQtYmxhY2sgdHJlZSwgd2lsbCBhbHNvIHN0b3JlIHRoZSBtYXAncyB2YWx1ZV90eXBlIGluIGVhY2ggbm9kZSBhbmQKKyBuZWVkIHNvbWUgZXh0cmEgaW5mb3JtYXRpb24gbGlrZSB0aGUgbm9kZSdzIGNvbG9yLiBGb3IgYSBiaW5hcnkgdHJlZSwKKyBhdCBsZWFzdCB0d28gcG9pbnRlcnMsIG9uZSBmb3IgbGVmdCBhbmQgb25lIGZvciByaWdodCBhcmUgcmVxdWlyZWQuCisgU2luY2UgaXQgaXMgaGFuZHksIG1hbnkgaW1wbGVtZW50YXRpb25zIGFsc28gaGF2ZSBhIHBhcmVudCBwb2ludGVyLgorCisgV2UgbGV0IHRoZSBjb21waWxlciBjYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIGFib3ZlIG1lbnRpb25lZCBpdGVtcyBieQorIHVzaW5nIGEgZmFrZSBzdHJ1Y3R1cmUuIEJ5IHVzaW5nIGEgcmVhbCBzdHJ1Y3R1cmUgKGluIGNvbnRyYXN0IHRvIGp1c3QKKyBhZGRpbmcgbnVtYmVycy9ieXRlcykgd2UnbGwgZ2V0IGNvcnJlY3QgcG9pbnRlciBzaXplcyBhcyB3ZWxsIGFzIGFueQorIHBhZGRpbmcgYXBwbGllZCBmb3IgZnJlZS4KKyovCit0ZW1wbGF0ZTxjbGFzcyBfTWFwdHlwZT4KK2NsYXNzIE1hcEludHJvc3BlY3RvciB7Citwcml2YXRlOgorCS8qIERlZmluZSBzb21lIGhhbmR5IHR5cGVkZWZzIHRvIGJ1aWxkIHVwIHRoZSBzdHJ1Y3R1cmUuICovCisKKwkvKioKKwkgRWFjaCBub2RlIHdpbGwgbGlrZWx5IHN0b3JlIHRoZSB2YWx1ZV90eXBlIG9mIHRoZSBtYXBwaW5nLAorCSB0aGF0IGlzIGEgc3RkOjpwYWlyPF9LZXksIF9WYWx1ZT4uCisJKi8KKwl0eXBlZGVmIHR5cGVuYW1lIF9NYXB0eXBlOjp2YWx1ZV90eXBlIF9WYWw7CisKKwkvKioKKwkgV2Ugd2lsbCBuZWVkIHNvbWUgcG9pbnRlcnMsIHNpbmNlIHN0ZDo6bWFwIGlzIGxpa2VseSBpbXBsZW1lbnRlZAorCSBhcyBhIGJhbGFuY2VkIHJlZC1ibGFjayB0cmVlLgorCSovCisJdHlwZWRlZiB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICBfUHRyOworCisJLyoqCisJIFNwYWNlIGZvciBzb21lIGV4dHJhIGluZm9ybWF0aW9uIChsaWtlIHRoZSBub2RlJ3MgY29sb3IpLgorCSBBbiBpbnQgc2hvdWxkIGJlIHN1ZmZpY2llbnQuCisJKi8KKwl0eXBlZGVmIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgIF9FeHQ7CisKKwkvKiBUaGUgbWVtb3J5IHJlcXVpcmVkIGZvciBlYWNoIG5vZGUgd2lsbCBsaWtlbHkgbG9vayBsaWtlIHRoaXMKKwkgc3RydWN0dXJlLiBXZSB3aWxsIGp1c3QgbXVsdGlwbHkgc2l6ZW9mKF9Ob2RlKSBieSB0aGUgbnVtYmVyCisJIG9mIG5vZGVzIHRvIGdldCB0aGUgdG90YWwgbWVtb3J5IG9mIGFsbCBub2Rlcy4gQnkgdXNpbmcgdGhlCisJIHNpemUgb2YgdGhlIHN0cnVjdHVyZSwgd2Ugd2lsbCBhbHNvIHRha2UgY2FyZSBvZiB0aGUgY29tcGlsZXIncworCSBkZWZhdWx0IHBhZGRpbmcuCisJKi8KKwl0eXBlZGVmIHN0cnVjdCB7CisJCV9QdHIgX3BhcmVudF9ub2RlOworCQlfUHRyIF9sZWZ0X25vZGU7CisJCV9QdHIgX3JpZ2h0X25vZGU7CisJCV9WYWwgX3ZhbHVlOworCQlfRXh0IF9leHRyYV9pbmZvOworCX0gX05vZGU7CisKK3B1YmxpYzoKKwlzdGF0aWMgc2l6ZV90IEdldE5vZGVzTWVtb3J5U2l6ZShzaXplX3Qgbm9kZV9jb3VudCkgeworCQlyZXR1cm4gbm9kZV9jb3VudCAqIHNpemVvZihfTm9kZSk7CisJfQorfTsKKworI2VuZGlmIC8vIFN0YW5kYXJkIEMrKyBMaWJyYXJ5CisKKyNlbmRpZiAvLyBNQVBJTlRST1NQRUNUT1JfSF8KZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9NZXRhZGF0YS9FeGlmLmNwcCBiL2ZpbGVzL1NvdXJjZS9NZXRhZGF0YS9FeGlmLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWM3ZmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZmlsZXMvU291cmNlL01ldGFkYXRhL0V4aWYuY3BwCkBAIC0wLDAgKzEsMTI1MiBAQAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gTWV0YWRhdGEgZnVuY3Rpb25zIGltcGxlbWVudGF0aW9uCisvLyBFeGlmIG1ldGFkYXRhIG1vZGVsCisvLworLy8gRGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBieQorLy8gLSBIZXJ2w6kgRHJvbG9uIChkcm9sb25AaW5mb25pZS5mcikKKy8vIC0gTWloYWlsIE5heWRlbm92IChtbmF5ZGVub3ZAdXNlcnMuc291cmNlZm9yZ2UubmV0KQorLy8KKy8vIEJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgaW1wbGVtZW50YXRpb25zOgorLy8gLSBtZXRhZGF0YS1leHRyYWN0b3IgOiBodHRwOi8vd3d3LmRyZXdub2FrZXMuY29tL2NvZGUvZXhpZi8KKy8vIC0gamhlYWQgOiBodHRwOi8vd3d3LnNlbnRleC5uZXQvfm13YW5kZWwvamhlYWQvCisvLyAtIEltYWdlTWFnaWNrIDogaHR0cDovL3d3dy5pbWFnZW1hZ2ljay5vcmcvCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRnJlZUltYWdlIDMKKy8vCisvLyBDT1ZFUkVEIENPREUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkKKy8vIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTCisvLyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy8vIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVECisvLyBDT0RFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UCisvLyBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWQorLy8gU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTAorLy8gUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUgorLy8gVEhJUyBESVNDTEFJTUVSLgorLy8KKy8vIFVzZSBhdCB5b3VyIG93biByaXNrIQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaWZkZWYgX01TQ19WRVIgCisjcHJhZ21hIHdhcm5pbmcgKGRpc2FibGUgOiA0Nzg2KSAvLyBpZGVudGlmaWVyIHdhcyB0cnVuY2F0ZWQgdG8gJ251bWJlcicgY2hhcmFjdGVycworI2VuZGlmCisKKyNpbmNsdWRlICJGcmVlSW1hZ2UuaCIKKyNpbmNsdWRlICJVdGlsaXRpZXMuaCIKKyNpbmNsdWRlICJGcmVlSW1hZ2VUYWcuaCIKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRXhpZiBKUEVHIHJvdXRpbmVzCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNkZWZpbmUgRVhJRl9OVU1fRk9STUFUUyAgMTIKKworI2RlZmluZSBUQUdfRVhJRl9PRkZTRVQJCQkweDg3NjkJLy8gRXhpZiBJRkQgUG9pbnRlcgorI2RlZmluZSBUQUdfR1BTX09GRlNFVAkJCTB4ODgyNQkvLyBHUFMgSW5mbyBJRkQgUG9pbnRlcgorI2RlZmluZSBUQUdfSU5URVJPUF9PRkZTRVQJCTB4QTAwNQkvLyBJbnRlcm9wZXJhYmlsaXR5IElGRCBQb2ludGVyCisjZGVmaW5lIFRBR19NQUtFUl9OT1RFCQkJMHg5MjdDCS8vIE1ha2VyIG5vdGUKKworLy8gQ0FOT04gY2FtZXJhcyBoYXZlIHNvbWUgZnVubnkgYmVzcG9rZSBmaWVsZHMgdGhhdCBuZWVkIGZ1cnRoZXIgcHJvY2Vzc2luZy4uLgorI2RlZmluZSBUQUdfQ0FOT05fQ0FNRVJBX1NUQVRFXzB4MDEJMHgwMDAxCQkvLyB0YWdzIHVuZGVyIHRhZyAweDAwMSAoQ2FtZXJhU2V0dGluZ3MpCisjZGVmaW5lIFRBR19DQU5PTl9DQU1FUkFfU1RBVEVfMHgwMgkweDAwMDIJCS8vIHRhZ3MgdW5kZXIgdGFnIDB4MDAyIChGb2NhbExlbmd0aCkKKyNkZWZpbmUgVEFHX0NBTk9OX0NBTUVSQV9TVEFURV8weDA0CTB4MDAwNAkJLy8gdGFncyB1bmRlciB0YWcgMHgwMDQgKFNob3RJbmZvKQorI2RlZmluZSBUQUdfQ0FOT05fQ0FNRVJBX1NUQVRFXzB4MTIJMHgwMDEyCQkvLyB0YWdzIHVuZGVyIHRhZyAweDAxMiAoQUZJbmZvKQorI2RlZmluZSBUQUdfQ0FOT05fQ0FNRVJBX1NUQVRFXzB4QTAJMHgwMEEwCQkvLyB0YWdzIHVuZGVyIHRhZyAweDBBMCAoUHJvY2Vzc2luZ0luZm8pCisjZGVmaW5lIFRBR19DQU5PTl9DQU1FUkFfU1RBVEVfMHhFMAkweDAwRTAJCS8vIHRhZ3MgdW5kZXIgdGFnIDB4MEUwIChTZW5zb3JJbmZvKQorCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gUmVpbXBsZW1lbnRhdGlvbiBvZiBzdHJuaWNtcCAoaXQgaXMgbm90IHN1cHBvcnRlZCBvbiBzb21lIHN5c3RlbXMpCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLyoqCitDb21wYXJlIGNoYXJhY3RlcnMgb2YgdHdvIHN0cmluZ3Mgd2l0aG91dCByZWdhcmQgdG8gY2FzZS4KK0BwYXJhbSBzMSBOdWxsLXRlcm1pbmF0ZWQgc3RyaW5nIHRvIGNvbXBhcmUuCitAcGFyYW0gczIgTnVsbC10ZXJtaW5hdGVkIHN0cmluZyB0byBjb21wYXJlLgorQHBhcmFtIGxlbiBOdW1iZXIgb2YgY2hhcmFjdGVycyB0byBjb21wYXJlCitAcmV0dXJuIFJldHVybnMgMCBpZiBzMSBzdWJzdHJpbmcgaWRlbnRpY2FsIHRvIHMyIHN1YnN0cmluZworKi8KK3N0YXRpYyBpbnQgCitGcmVlSW1hZ2Vfc3RybmljbXAoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyLCBzaXplX3QgbGVuKSB7CisJdW5zaWduZWQgY2hhciBjMSwgYzI7CisKKwlpZighczEgfHwgIXMyKSByZXR1cm4gLTE7CisKKwljMSA9IDA7CWMyID0gMDsKKwlpZihsZW4pIHsKKwkJZG8geworCQkJYzEgPSAqczE7IGMyID0gKnMyOworCQkJczErKzsgczIrKzsKKwkJCWlmICghYzEpCisJCQkJYnJlYWs7CisJCQlpZiAoIWMyKQorCQkJCWJyZWFrOworCQkJaWYgKGMxID09IGMyKQorCQkJCWNvbnRpbnVlOworCQkJYzEgPSAoQllURSl0b2xvd2VyKGMxKTsKKwkJCWMyID0gKEJZVEUpdG9sb3dlcihjMik7CisJCQlpZiAoYzEgIT0gYzIpCisJCQkJYnJlYWs7CisJCX0gd2hpbGUgKC0tbGVuKTsKKwl9CisJcmV0dXJuIChpbnQpYzEgLSAoaW50KWMyOworfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgTGl0dGxlIEVuZGlhbiAvIEJpZyBFbmRpYW4gaW8gcm91dGluZXMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHNob3J0IAorUmVhZEludDE2KEJPT0wgbXNiX29yZGVyLCBjb25zdCB2b2lkICpidWZmZXIpIHsKKwlzaG9ydCB2YWx1ZTsKKworCWlmKG1zYl9vcmRlcikgeworCQl2YWx1ZSA9IChzaG9ydCkoKCgoQllURSopIGJ1ZmZlcilbMF0gPDwgOCkgfCAoKEJZVEUqKSBidWZmZXIpWzFdKTsKKwkJcmV0dXJuIHZhbHVlOworICAgIH0KKwl2YWx1ZSA9IChzaG9ydCkoKCgoQllURSopIGJ1ZmZlcilbMV0gPDwgOCkgfCAoKEJZVEUqKSBidWZmZXIpWzBdKTsKKwlyZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyBMT05HIAorUmVhZEludDMyKEJPT0wgbXNiX29yZGVyLCBjb25zdCB2b2lkICpidWZmZXIpIHsKKwlMT05HIHZhbHVlOworCisJaWYobXNiX29yZGVyKSB7CisJCXZhbHVlID0gKExPTkcpKCgoKEJZVEUqKSBidWZmZXIpWzBdIDw8IDI0KSB8ICgoKEJZVEUqKSBidWZmZXIpWzFdIDw8IDE2KSB8ICgoKEJZVEUqKSBidWZmZXIpWzJdIDw8IDgpIHwgKCgoQllURSopIGJ1ZmZlcilbM10pKTsKKwkJcmV0dXJuIHZhbHVlOworICAgIH0KKwl2YWx1ZSA9IChMT05HKSgoKChCWVRFKikgYnVmZmVyKVszXSA8PCAyNCkgfCAoKChCWVRFKikgYnVmZmVyKVsyXSA8PCAxNikgfCAoKChCWVRFKikgYnVmZmVyKVsxXSA8PCA4ICkgfCAoKChCWVRFKikgYnVmZmVyKVswXSkpOworCXJldHVybiB2YWx1ZTsKK30KKworc3RhdGljIFdPUkQgCitSZWFkVWludDE2KEJPT0wgbXNiX29yZGVyLCBjb25zdCB2b2lkICpidWZmZXIpIHsKKwlXT1JEIHZhbHVlOworCQorCWlmKG1zYl9vcmRlcikgeworCQl2YWx1ZSA9IChXT1JEKSAoKCgoQllURSopIGJ1ZmZlcilbMF0gPDwgOCkgfCAoKEJZVEUqKSBidWZmZXIpWzFdKTsKKwkJcmV0dXJuIHZhbHVlOworICAgIH0KKwl2YWx1ZSA9IChXT1JEKSAoKCgoQllURSopIGJ1ZmZlcilbMV0gPDwgOCkgfCAoKEJZVEUqKSBidWZmZXIpWzBdKTsKKwlyZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyBEV09SRCAKK1JlYWRVaW50MzIoQk9PTCBtc2Jfb3JkZXIsIGNvbnN0IHZvaWQgKmJ1ZmZlcikgeworCXJldHVybiAoKERXT1JEKSBSZWFkSW50MzIobXNiX29yZGVyLCBidWZmZXIpICYgMHhGRkZGRkZGRik7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgRXhpZiBKUEVHIG1hcmtlcnMgcm91dGluZXMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoqCitQcm9jZXNzIGEgSUZEIG9mZnNldAorUmV0dXJucyB0aGUgb2Zmc2V0IGFuZCB0aGUgbWV0YWRhdGEgbW9kZWwgZm9yIHRoaXMgdGFnCisqLworc3RhdGljIHZvaWQgCitwcm9jZXNzSUZET2Zmc2V0KEZJVEFHICp0YWcsIGNvbnN0IGNoYXIgKnB2YWwsIEJPT0wgbXNiX29yZGVyLCBEV09SRCAqc3ViZGlyT2Zmc2V0LCBUYWdMaWI6Ok1ETU9ERUwgKm1kX21vZGVsKSB7CisJLy8gZ2V0IHRoZSBJRkQgb2Zmc2V0CisJKnN1YmRpck9mZnNldCA9IFJlYWRVaW50MzIobXNiX29yZGVyLCBwdmFsKTsKKworCS8vIHNlbGVjdCBhIHRhZyBpbmZvIHRhYmxlCisJc3dpdGNoKEZyZWVJbWFnZV9HZXRUYWdJRCh0YWcpKSB7CisJCWNhc2UgVEFHX0VYSUZfT0ZGU0VUOgorCQkJKm1kX21vZGVsID0gVGFnTGliOjpFWElGX0VYSUY7CisJCQlicmVhazsKKwkJY2FzZSBUQUdfR1BTX09GRlNFVDoKKwkJCSptZF9tb2RlbCA9IFRhZ0xpYjo6RVhJRl9HUFM7CisJCQlicmVhazsKKwkJY2FzZSBUQUdfSU5URVJPUF9PRkZTRVQ6CisJCQkqbWRfbW9kZWwgPSBUYWdMaWI6OkVYSUZfSU5URVJPUDsKKwkJCWJyZWFrOworCX0KK30KKworLyoqCitQcm9jZXNzIGEgbWFrZXIgbm90ZSBJRkQgb2Zmc2V0CitSZXR1cm5zIHRoZSBvZmZzZXQgYW5kIHRoZSBtZXRhZGF0YSBtb2RlbCBmb3IgdGhpcyB0YWcKKyovCitzdGF0aWMgdm9pZCAKK3Byb2Nlc3NNYWtlck5vdGUoRklCSVRNQVAgKmRpYiwgY29uc3QgY2hhciAqcHZhbCwgQk9PTCBtc2Jfb3JkZXIsIERXT1JEICpzdWJkaXJPZmZzZXQsIFRhZ0xpYjo6TURNT0RFTCAqbWRfbW9kZWwpIHsKKwlGSVRBRyAqdGFnTWFrZSA9IE5VTEw7CisKKwkqc3ViZGlyT2Zmc2V0ID0gMDsKKwkqbWRfbW9kZWwgPSBUYWdMaWI6OlVOS05PV047CisKKwkvLyBEZXRlcm1pbmUgdGhlIGNhbWVyYSBtb2RlbCBhbmQgbWFrZXJub3RlIGZvcm1hdAorCS8vIFdBUk5JTkc6IG5vdGUgdGhhdCBNYWtlciBtYXkgYmUgTlVMTCBzb21ldGltZXMgc28gY2hlY2sgaXRzIHZhbHVlIGJlZm9yZSB1c2luZyBpdAorCS8vIChOVUxMIHBvaW50ZXIgY2hlY2tpbmcgaXMgZG9uZSBieSBGcmVlSW1hZ2Vfc3RybmljbXApCisJRnJlZUltYWdlX0dldE1ldGFkYXRhKEZJTURfRVhJRl9NQUlOLCBkaWIsICJNYWtlIiwgJnRhZ01ha2UpOworCWNvbnN0IGNoYXIgKk1ha2VyID0gKGNoYXIqKUZyZWVJbWFnZV9HZXRUYWdWYWx1ZSh0YWdNYWtlKTsKKworCWlmKChtZW1jbXAoIk9MWU1QXHgwMFx4MDEiLCBwdmFsLCA3KSA9PSAwKSB8fCAobWVtY21wKCJPTFlNUFx4MDBceDAyIiwgcHZhbCwgNykgPT0gMCkgfHwgKG1lbWNtcCgiRVBTT04iLCBwdmFsLCA1KSA9PSAwKSB8fCAobWVtY21wKCJBR0ZBIiwgcHZhbCwgNCkgPT0gMCkpIHsKKwkJLy8gT2x5bXB1cyBUeXBlIDEgTWFrZXJub3RlCisJCS8vIEVwc29uIGFuZCBBZ2ZhIHVzZSBPbHltcHVzIG1ha2VyIG5vdGUgc3RhbmRhcmQsIAorCQkvLyBzZWU6IGh0dHA6Ly93d3cub3poaWtlci5jb20vZWxlY3Ryb25pY3MvcGptdC9qcGVnX2luZm8vCisJCSptZF9tb2RlbCA9IFRhZ0xpYjo6RVhJRl9NQUtFUk5PVEVfT0xZTVBVU1RZUEUxOworCQkqc3ViZGlyT2Zmc2V0ID0gODsKKwl9IAorCWVsc2UgaWYobWVtY21wKCJPTFlNUFVTXHgwMFx4NDlceDQ5XHgwM1x4MDAiLCBwdmFsLCAxMikgPT0gMCkgeworCQkvLyBPbHltcHVzIFR5cGUgMiBNYWtlcm5vdGUKKwkJLy8gISEhIE5PVCBZRVQgU1VQUE9SVEVEICEhIQorCQkqc3ViZGlyT2Zmc2V0ID0gMDsKKwkJKm1kX21vZGVsID0gVGFnTGliOjpVTktOT1dOOworCX0KKwllbHNlIGlmKG1lbWNtcCgiTmlrb24iLCBwdmFsLCA1KSA9PSAwKSB7CisJCS8qIFRoZXJlIGFyZSB0d28gc2NlbmFyaW9zIGhlcmU6CisJCSAqIFR5cGUgMToKKwkJICogOjAwMDA6IDRFIDY5IDZCIDZGIDZFIDAwIDAxIDAwLTA1IDAwIDAyIDAwIDAyIDAwIDA2IDAwIE5pa29uLi4uLi4uLi4uLi4KKwkJICogOjAwMTA6IDAwIDAwIEVDIDAyIDAwIDAwIDAzIDAwLTAzIDAwIDAxIDAwIDAwIDAwIDA2IDAwIC4uLi4uLi4uLi4uLi4uLi4KKwkJICogVHlwZSAzOgorCQkgKiA6MDAwMDogNEUgNjkgNkIgNkYgNkUgMDAgMDIgMDAtMDAgMDAgNEQgNEQgMDAgMkEgMDAgMDAgTmlrb24uLi4uTU0uKi4uLgorCQkgKiA6MDAxMDogMDAgMDggMDAgMUUgMDAgMDEgMDAgMDctMDAgMDAgMDAgMDQgMzAgMzIgMzAgMzAgLi4uLi4uLi4uLi4uMDIwMAorCQkgKi8KKwkJaWYgKHB2YWxbNl0gPT0gMSkgeworCQkJLy8gTmlrb24gdHlwZSAxIE1ha2Vybm90ZQorCQkJKm1kX21vZGVsID0gVGFnTGliOjpFWElGX01BS0VSTk9URV9OSUtPTlRZUEUxOworCQkJKnN1YmRpck9mZnNldCA9IDg7CisgICAgICAgIH0gZWxzZSBpZiAocHZhbFs2XSA9PSAyKSB7CisgICAgICAgICAgICAvLyBOaWtvbiB0eXBlIDMgTWFrZXJub3RlCisJCQkqbWRfbW9kZWwgPSBUYWdMaWI6OkVYSUZfTUFLRVJOT1RFX05JS09OVFlQRTM7CisJCQkqc3ViZGlyT2Zmc2V0ID0gMTg7CisgICAgICAgIH0gZWxzZSB7CisJCQkvLyBVbnN1cHBvcnRlZCBtYWtlcm5vdGUgZGF0YSBpZ25vcmVkCisJCQkqc3ViZGlyT2Zmc2V0ID0gMDsKKwkJCSptZF9tb2RlbCA9IFRhZ0xpYjo6VU5LTk9XTjsKKwkJfQorCX0gZWxzZSBpZihNYWtlciAmJiAoRnJlZUltYWdlX3N0cm5pY21wKCJOSUtPTiIsIE1ha2VyLCA1KSA9PSAwKSkgeworCQkvLyBOaWtvbiB0eXBlIDIgTWFrZXJub3RlCisJCSptZF9tb2RlbCA9IFRhZ0xpYjo6RVhJRl9NQUtFUk5PVEVfTklLT05UWVBFMjsKKwkJKnN1YmRpck9mZnNldCA9IDA7CisgICAgfSBlbHNlIGlmKE1ha2VyICYmIChGcmVlSW1hZ2Vfc3RybmljbXAoIkNhbm9uIiwgTWFrZXIsIDUpID09IDApKSB7CisgICAgICAgIC8vIENhbm9uIE1ha2Vybm90ZQorCQkqbWRfbW9kZWwgPSBUYWdMaWI6OkVYSUZfTUFLRVJOT1RFX0NBTk9OOworCQkqc3ViZGlyT2Zmc2V0ID0gMDsJCQorICAgIH0gZWxzZSBpZihNYWtlciAmJiAoRnJlZUltYWdlX3N0cm5pY21wKCJDYXNpbyIsIE1ha2VyLCA1KSA9PSAwKSkgeworICAgICAgICAvLyBDYXNpbyBNYWtlcm5vdGUKKwkJaWYobWVtY21wKCJRVkNceDAwXHgwMFx4MDAiLCBwdmFsLCA2KSA9PSAwKSB7CisJCQkvLyBDYXNpbyBUeXBlIDIgTWFrZXJub3RlCisJCQkqbWRfbW9kZWwgPSBUYWdMaWI6OkVYSUZfTUFLRVJOT1RFX0NBU0lPVFlQRTI7CisJCQkqc3ViZGlyT2Zmc2V0ID0gNjsKKwkJfSBlbHNlIHsKKwkJCS8vIENhc2lvIFR5cGUgMSBNYWtlcm5vdGUKKwkJCSptZF9tb2RlbCA9IFRhZ0xpYjo6RVhJRl9NQUtFUk5PVEVfQ0FTSU9UWVBFMTsKKwkJCSpzdWJkaXJPZmZzZXQgPSAwOworCQl9CisJfSBlbHNlIGlmICgobWVtY21wKCJGVUpJRklMTSIsIHB2YWwsIDgpID09IDApIHx8IChNYWtlciAmJiAoRnJlZUltYWdlX3N0cm5pY21wKCJGdWppZmlsbSIsIE1ha2VyLCA4KSA9PSAwKSkpIHsKKyAgICAgICAgLy8gRnVqaWZpbGUgTWFrZXJub3RlCisJCS8vIEZ1amlmaWxtJ3MgTWFrZXJub3RlIGFsd2F5cyB1c2UgbGl0dGxlLWVuZGlhbiBvcmRlciBhbHRvdWdoIHRoZSBFeGlmIHNlY3Rpb24gbWF5YmUgaW4gbGl0dGxlLWVuZGlhbiBvcmRlciBvciBpbiBiaWctZW5kaWFuIG9yZGVyLiAKKwkJLy8gSWYgbXNiX29yZGVyID09IFRSVUUsIHRoZSBNYWtlcm5vdGUgd29uJ3QgYmUgcmVhZDogCisJCS8vIHRoZSB2YWx1ZSBvZiBpZmRTdGFydCB3aWxsIGJlIDB4MGMwMDAwMDAgaW5zdGVhZCBvZiAweDAwMDAwMDBjIGFuZCB0aGUgTWFrZXJOb3RlIHNlY3Rpb24gd2lsbCBiZSBkaXNjYXJkZWQgbGF0ZXIKKwkJLy8gaW4ganBlZ19yZWFkX2V4aWZfZGlyIGJlY2F1c2UgdGhlIElGRCBpcyB0b28gaGlnaAorCQkqbWRfbW9kZWwgPSBUYWdMaWI6OkVYSUZfTUFLRVJOT1RFX0ZVSklGSUxNOworICAgICAgICBEV09SRCBpZmRTdGFydCA9IFJlYWRVaW50MzIobXNiX29yZGVyLCBwdmFsICsgOCk7CisJCSpzdWJkaXJPZmZzZXQgPSBpZmRTdGFydDsKKyAgICB9CisJZWxzZSBpZihtZW1jbXAoIktZT0NFUkFceDIwXHgyMFx4MjBceDIwXHgyMFx4MjBceDIwXHgyMFx4MjBceDIwXHgyMFx4MjBceDAwXHgwMFx4MDAiLCBwdmFsLCAyMikgPT0gMCkgeworCQkqbWRfbW9kZWwgPSBUYWdMaWI6OkVYSUZfTUFLRVJOT1RFX0tZT0NFUkE7CisJCSpzdWJkaXJPZmZzZXQgPSAyMjsKKwl9CisJZWxzZSBpZihNYWtlciAmJiAoRnJlZUltYWdlX3N0cm5pY21wKCJNaW5vbHRhIiwgTWFrZXIsIDcpID09IDApKSB7CisJCS8vIE1pbm9sdGEgbWFrZXIgbm90ZQorCQkqbWRfbW9kZWwgPSBUYWdMaWI6OkVYSUZfTUFLRVJOT1RFX01JTk9MVEE7CisJCSpzdWJkaXJPZmZzZXQgPSAwOworCX0KKwllbHNlIGlmKG1lbWNtcCgiUGFuYXNvbmljXHgwMFx4MDBceDAwIiwgcHZhbCwgMTIpID09IDApIHsKKwkJLy8gUGFuYXNvbmljIG1ha2VyIG5vdGUKKwkJKm1kX21vZGVsID0gVGFnTGliOjpFWElGX01BS0VSTk9URV9QQU5BU09OSUM7CisJCSpzdWJkaXJPZmZzZXQgPSAxMjsKKwl9CisJZWxzZSBpZihNYWtlciAmJiAoRnJlZUltYWdlX3N0cm5pY21wKCJMRUlDQSIsIE1ha2VyLCA1KSA9PSAwKSkgeworCQkvLyBMZWljYSBtYWtlciBub3RlCisJCWlmKG1lbWNtcCgiTEVJQ0FceDAwXHgwMFx4MDAiLCBwdmFsLCA4KSA9PSAwKSB7CisJCQkvLyBub3QgeWV0IHN1cHBvcnRlZCBtYWtlcm5vdGUgZGF0YSBpZ25vcmVkCisJCQkqc3ViZGlyT2Zmc2V0ID0gMDsKKwkJCSptZF9tb2RlbCA9IFRhZ0xpYjo6VU5LTk9XTjsKKwkJfQorCX0KKwllbHNlIGlmKE1ha2VyICYmICgoRnJlZUltYWdlX3N0cm5pY21wKCJQZW50YXgiLCBNYWtlciwgNikgPT0gMCkgfHwgKEZyZWVJbWFnZV9zdHJuaWNtcCgiQXNhaGkiLCBNYWtlciwgNSkgPT0gMCkpKSB7CisJCS8vIFBlbnRheCBtYWtlciBub3RlCisJCWlmKG1lbWNtcCgiQU9DXHgwMCIsIHB2YWwsIDQpID09IDApIHsKKwkJCS8vIFR5cGUgMiBQZW50YXggTWFrZXJub3RlCisJCQkqbWRfbW9kZWwgPSBUYWdMaWI6OkVYSUZfTUFLRVJOT1RFX1BFTlRBWDsKKwkJCSpzdWJkaXJPZmZzZXQgPSA2OworCQl9IGVsc2UgeworCQkJLy8gVHlwZSAxIFBlbnRheCBNYWtlcm5vdGUKKwkJCSptZF9tb2RlbCA9IFRhZ0xpYjo6RVhJRl9NQUtFUk5PVEVfQVNBSEk7CisJCQkqc3ViZGlyT2Zmc2V0ID0gMDsKKwkJfQorCX0JCisJZWxzZSBpZigobWVtY21wKCJTT05ZIENBTVx4MjBceDAwXHgwMFx4MDAiLCBwdmFsLCAxMikgPT0gMCkgfHwgKG1lbWNtcCgiU09OWSBEU0NceDIwXHgwMFx4MDBceDAwIiwgcHZhbCwgMTIpID09IDApKSB7CisJCSptZF9tb2RlbCA9IFRhZ0xpYjo6RVhJRl9NQUtFUk5PVEVfU09OWTsKKwkJKnN1YmRpck9mZnNldCA9IDEyOworCX0KKwllbHNlIGlmKChtZW1jbXAoIlNJR01BXHgwMFx4MDBceDAwIiwgcHZhbCwgOCkgPT0gMCkgfHwgKG1lbWNtcCgiRk9WRU9OXHgwMFx4MDAiLCBwdmFsLCA4KSA9PSAwKSkgeworCQlGSVRBRyAqdGFnTW9kZWwgPSBOVUxMOworCQlGcmVlSW1hZ2VfR2V0TWV0YWRhdGEoRklNRF9FWElGX01BSU4sIGRpYiwgIk1vZGVsIiwgJnRhZ01vZGVsKTsKKwkJY29uc3QgY2hhciAqTW9kZWwgPSAoY2hhciopRnJlZUltYWdlX0dldFRhZ1ZhbHVlKHRhZ01vZGVsKTsKKwkJaWYoTW9kZWwgJiYgKG1lbWNtcCgiU0lHTUEgU0QxXHgwMCIsIE1vZGVsLCAxMCkgPT0gMCkpIHsKKwkJCS8vIFNpZ21hIFNEMSBtYWtlciBub3RlCisJCQkqc3ViZGlyT2Zmc2V0ID0gMTA7CisJCQkqbWRfbW9kZWwgPSBUYWdMaWI6OkVYSUZfTUFLRVJOT1RFX1NJR01BX1NEMTsKKwkJfSBlbHNlIHsKKwkJCS8vIFNpZ21hIC8gRm92ZW9uIG1ha2Vybm90ZQorCQkJKnN1YmRpck9mZnNldCA9IDEwOworCQkJKm1kX21vZGVsID0gVGFnTGliOjpFWElGX01BS0VSTk9URV9TSUdNQV9GT1ZFT047CisJCX0KKwl9Cit9CisKKy8qKgorUHJvY2VzcyBhIENhbm9uIG1ha2VyIG5vdGUgdGFnLiAKK0Egc2luZ2xlIENhbm9uIHRhZyBtYXkgY29udGFpbiBtYW55IG90aGVyIHRhZ3Mgd2l0aGluLgorKi8KK3N0YXRpYyBCT09MIAorcHJvY2Vzc0Nhbm9uTWFrZXJOb3RlVGFnKEZJQklUTUFQICpkaWIsIEZJVEFHICp0YWcpIHsKKwljaGFyIGRlZmF1bHRLZXlbMTZdOworCURXT1JEIHN0YXJ0SW5kZXggPSAwOworCVRhZ0xpYiYgcyA9IFRhZ0xpYjo6aW5zdGFuY2UoKTsKKworCVdPUkQgdGFnX2lkID0gRnJlZUltYWdlX0dldFRhZ0lEKHRhZyk7CisKKwlpbnQgc3ViVGFnVHlwZUJhc2UgPSAwOworCisJc3dpdGNoKHRhZ19pZCkgeworCQljYXNlIFRBR19DQU5PTl9DQU1FUkFfU1RBVEVfMHgwMToKKwkJCXN1YlRhZ1R5cGVCYXNlID0gMHhDMTAwOworCQkJc3RhcnRJbmRleCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBUQUdfQ0FOT05fQ0FNRVJBX1NUQVRFXzB4MDI6CisJCQlzdWJUYWdUeXBlQmFzZSA9IDB4QzIwMDsKKwkJCXN0YXJ0SW5kZXggPSAwOworCQkJYnJlYWs7CisJCWNhc2UgVEFHX0NBTk9OX0NBTUVSQV9TVEFURV8weDA0OgorCQkJc3ViVGFnVHlwZUJhc2UgPSAweEM0MDA7CisJCQlzdGFydEluZGV4ID0gMTsKKwkJCWJyZWFrOworCQljYXNlIFRBR19DQU5PTl9DQU1FUkFfU1RBVEVfMHgxMjoKKwkJCXN1YlRhZ1R5cGVCYXNlID0gMHgxMjAwOworCQkJc3RhcnRJbmRleCA9IDA7CisJCQlicmVhazsKKwkJY2FzZSBUQUdfQ0FOT05fQ0FNRVJBX1NUQVRFXzB4QTA6CisJCQlzdWJUYWdUeXBlQmFzZSA9IDB4Q0EwMDsKKwkJCXN0YXJ0SW5kZXggPSAxOworCQkJYnJlYWs7CisJCWNhc2UgVEFHX0NBTk9OX0NBTUVSQV9TVEFURV8weEUwOgorCQkJc3ViVGFnVHlwZUJhc2UgPSAweENFMDA7CisJCQlzdGFydEluZGV4ID0gMTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCXsKKwkJCS8vIHByb2Nlc3MgYXMgYSBub3JtYWwgdGFnCisKKwkJCS8vIGdldCB0aGUgdGFnIGtleSBhbmQgZGVzY3JpcHRpb24KKwkJCWNvbnN0IGNoYXIgKmtleSA9IHMuZ2V0VGFnRmllbGROYW1lKFRhZ0xpYjo6RVhJRl9NQUtFUk5PVEVfQ0FOT04sIHRhZ19pZCwgZGVmYXVsdEtleSk7CisJCQlGcmVlSW1hZ2VfU2V0VGFnS2V5KHRhZywga2V5KTsKKwkJCWNvbnN0IGNoYXIgKmRlc2NyaXB0aW9uID0gcy5nZXRUYWdEZXNjcmlwdGlvbihUYWdMaWI6OkVYSUZfTUFLRVJOT1RFX0NBTk9OLCB0YWdfaWQpOworCQkJRnJlZUltYWdlX1NldFRhZ0Rlc2NyaXB0aW9uKHRhZywgZGVzY3JpcHRpb24pOworCisJCQkvLyBzdG9yZSB0aGUgdGFnCisJCQlpZihrZXkpIHsKKwkJCQlGcmVlSW1hZ2VfU2V0TWV0YWRhdGEoRklNRF9FWElGX01BS0VSTk9URSwgZGliLCBrZXksIHRhZyk7CisJCQl9CisKKwkJCXJldHVybiBUUlVFOworCQl9CisJCWJyZWFrOworCisJfQorCisJV09SRCAqcHZhbHVlID0gKFdPUkQqKUZyZWVJbWFnZV9HZXRUYWdWYWx1ZSh0YWcpOworCisJLy8gY3JlYXRlIGEgdGFnCisJRklUQUcgKmNhbm9uVGFnID0gRnJlZUltYWdlX0NyZWF0ZVRhZygpOworCWlmKCFjYW5vblRhZykgcmV0dXJuIEZBTFNFOworCisJLy8gd2UgaW50ZW50aW9uYWxseSBza2lwIHRoZSBmaXJzdCBhcnJheSBtZW1iZXIgKGlmIG5lZWRlZCkKKyAgICBmb3IgKERXT1JEIGkgPSBzdGFydEluZGV4OyBpIDwgRnJlZUltYWdlX0dldFRhZ0NvdW50KHRhZyk7IGkrKykgeworCisJCXRhZ19pZCA9IChXT1JEKShzdWJUYWdUeXBlQmFzZSArIGkpOworCisJCUZyZWVJbWFnZV9TZXRUYWdJRChjYW5vblRhZywgdGFnX2lkKTsKKwkJRnJlZUltYWdlX1NldFRhZ1R5cGUoY2Fub25UYWcsIEZJRFRfU0hPUlQpOworCQlGcmVlSW1hZ2VfU2V0VGFnQ291bnQoY2Fub25UYWcsIDEpOworCQlGcmVlSW1hZ2VfU2V0VGFnTGVuZ3RoKGNhbm9uVGFnLCAyKTsKKwkJRnJlZUltYWdlX1NldFRhZ1ZhbHVlKGNhbm9uVGFnLCAmcHZhbHVlW2ldKTsKKworCQkvLyBnZXQgdGhlIHRhZyBrZXkgYW5kIGRlc2NyaXB0aW9uCisJCWNvbnN0IGNoYXIgKmtleSA9IHMuZ2V0VGFnRmllbGROYW1lKFRhZ0xpYjo6RVhJRl9NQUtFUk5PVEVfQ0FOT04sIHRhZ19pZCwgZGVmYXVsdEtleSk7CisJCUZyZWVJbWFnZV9TZXRUYWdLZXkoY2Fub25UYWcsIGtleSk7CisJCWNvbnN0IGNoYXIgKmRlc2NyaXB0aW9uID0gcy5nZXRUYWdEZXNjcmlwdGlvbihUYWdMaWI6OkVYSUZfTUFLRVJOT1RFX0NBTk9OLCB0YWdfaWQpOworCQlGcmVlSW1hZ2VfU2V0VGFnRGVzY3JpcHRpb24oY2Fub25UYWcsIGRlc2NyaXB0aW9uKTsKKworCQkvLyBzdG9yZSB0aGUgdGFnCisJCWlmKGtleSkgeworCQkJRnJlZUltYWdlX1NldE1ldGFkYXRhKEZJTURfRVhJRl9NQUtFUk5PVEUsIGRpYiwga2V5LCBjYW5vblRhZyk7CisJCX0KKwl9CisKKwkvLyBkZWxldGUgdGhlIHRhZworCUZyZWVJbWFnZV9EZWxldGVUYWcoY2Fub25UYWcpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorUHJvY2VzcyBhIHN0YW5kYXJkIEV4aWYgdGFnCisqLworc3RhdGljIHZvaWQgCitwcm9jZXNzRXhpZlRhZyhGSUJJVE1BUCAqZGliLCBGSVRBRyAqdGFnLCBjaGFyICpwdmFsLCBCT09MIG1zYl9vcmRlciwgVGFnTGliOjpNRE1PREVMIG1kX21vZGVsKSB7CisJY2hhciBkZWZhdWx0S2V5WzE2XTsKKwlpbnQgbjsKKwlEV09SRCBpOworCisJLy8gYWxsb2NhdGUgYSBidWZmZXIgdG8gc3RvcmUgdGhlIHRhZyB2YWx1ZQorCUJZVEUgKmV4aWZfdmFsdWUgPSAoQllURSopbWFsbG9jKEZyZWVJbWFnZV9HZXRUYWdMZW5ndGgodGFnKSAqIHNpemVvZihCWVRFKSk7CisJaWYoTlVMTCA9PSBleGlmX3ZhbHVlKSB7CisJCS8vIG91dCBvZiBtZW1vcnkgLi4uCisJCXJldHVybjsKKwl9CisJbWVtc2V0KGV4aWZfdmFsdWUsIDAsIEZyZWVJbWFnZV9HZXRUYWdMZW5ndGgodGFnKSAqIHNpemVvZihCWVRFKSk7CisKKwkvLyBnZXQgdGhlIHRhZyB2YWx1ZQorCXN3aXRjaChGcmVlSW1hZ2VfR2V0VGFnVHlwZSh0YWcpKSB7CisKKwkJY2FzZSBGSURUX1NIT1JUOgorCQl7CisJCQlXT1JEICp2YWx1ZSA9IChXT1JEKikmZXhpZl92YWx1ZVswXTsKKwkJCWZvcihpID0gMDsgaSA8IEZyZWVJbWFnZV9HZXRUYWdDb3VudCh0YWcpOyBpKyspIHsKKwkJCQl2YWx1ZVtpXSA9IFJlYWRVaW50MTYobXNiX29yZGVyLCBwdmFsICsgaSAqIHNpemVvZihXT1JEKSk7CisJCQl9CisJCQlGcmVlSW1hZ2VfU2V0VGFnVmFsdWUodGFnLCB2YWx1ZSk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIEZJRFRfU1NIT1JUOgorCQl7CisJCQlzaG9ydCAqdmFsdWUgPSAoc2hvcnQqKSZleGlmX3ZhbHVlWzBdOworCQkJZm9yKGkgPSAwOyBpIDwgRnJlZUltYWdlX0dldFRhZ0NvdW50KHRhZyk7IGkrKykgeworCQkJCXZhbHVlW2ldID0gUmVhZEludDE2KG1zYl9vcmRlciwgcHZhbCArIGkgKiBzaXplb2Yoc2hvcnQpKTsKKwkJCX0KKwkJCUZyZWVJbWFnZV9TZXRUYWdWYWx1ZSh0YWcsIHZhbHVlKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgRklEVF9MT05HOgorCQl7CisJCQlEV09SRCAqdmFsdWUgPSAoRFdPUkQqKSZleGlmX3ZhbHVlWzBdOworCQkJZm9yKGkgPSAwOyBpIDwgRnJlZUltYWdlX0dldFRhZ0NvdW50KHRhZyk7IGkrKykgeworCQkJCXZhbHVlW2ldID0gUmVhZFVpbnQzMihtc2Jfb3JkZXIsIHB2YWwgKyBpICogc2l6ZW9mKERXT1JEKSk7CisJCQl9CisJCQlGcmVlSW1hZ2VfU2V0VGFnVmFsdWUodGFnLCB2YWx1ZSk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIEZJRFRfU0xPTkc6CisJCXsKKwkJCUxPTkcgKnZhbHVlID0gKExPTkcqKSZleGlmX3ZhbHVlWzBdOworCQkJZm9yKGkgPSAwOyBpIDwgRnJlZUltYWdlX0dldFRhZ0NvdW50KHRhZyk7IGkrKykgeworCQkJCXZhbHVlW2ldID0gUmVhZEludDMyKG1zYl9vcmRlciwgcHZhbCArIGkgKiBzaXplb2YoTE9ORykpOworCQkJfQorCQkJRnJlZUltYWdlX1NldFRhZ1ZhbHVlKHRhZywgdmFsdWUpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBGSURUX1JBVElPTkFMOgorCQl7CisJCQluID0gc2l6ZW9mKERXT1JEKTsKKworCQkJRFdPUkQgKnZhbHVlID0gKERXT1JEKikmZXhpZl92YWx1ZVswXTsJCQkJCQkKKwkJCWZvcihpID0gMDsgaSA8IDIgKiBGcmVlSW1hZ2VfR2V0VGFnQ291bnQodGFnKTsgaSsrKSB7CisJCQkJLy8gcmVhZCBhIHNlcXVlbmNlIG9mIChudW1lcmF0b3IsIGRlbm9taW5hdG9yKQorCQkJCXZhbHVlW2ldID0gUmVhZFVpbnQzMihtc2Jfb3JkZXIsIG4qaSArIChjaGFyKilwdmFsKTsKKwkJCX0KKwkJCUZyZWVJbWFnZV9TZXRUYWdWYWx1ZSh0YWcsIHZhbHVlKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgRklEVF9TUkFUSU9OQUw6CisJCXsKKwkJCW4gPSBzaXplb2YoTE9ORyk7CisKKwkJCUxPTkcgKnZhbHVlID0gKExPTkcqKSZleGlmX3ZhbHVlWzBdOworCQkJZm9yKGkgPSAwOyBpIDwgMiAqIEZyZWVJbWFnZV9HZXRUYWdDb3VudCh0YWcpOyBpKyspIHsKKwkJCQkvLyByZWFkIGEgc2VxdWVuY2Ugb2YgKG51bWVyYXRvciwgZGVub21pbmF0b3IpCisJCQkJdmFsdWVbaV0gPSBSZWFkSW50MzIobXNiX29yZGVyLCBuKmkgKyAoY2hhciopcHZhbCk7CisJCQl9CisJCQlGcmVlSW1hZ2VfU2V0VGFnVmFsdWUodGFnLCB2YWx1ZSk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIEZJRFRfQllURToKKwkJY2FzZSBGSURUX0FTQ0lJOgorCQljYXNlIEZJRFRfU0JZVEU6CisJCWNhc2UgRklEVF9VTkRFRklORUQ6CisJCWNhc2UgRklEVF9GTE9BVDoKKwkJY2FzZSBGSURUX0RPVUJMRToKKwkJZGVmYXVsdDoKKwkJCUZyZWVJbWFnZV9TZXRUYWdWYWx1ZSh0YWcsIHB2YWwpOworCQkJYnJlYWs7CisJfQorCisJaWYobWRfbW9kZWwgPT0gVGFnTGliOjpFWElGX01BS0VSTk9URV9DQU5PTikgeworCQkvLyBBIHNpbmdsZSBDYW5vbiB0YWcgY2FuIGhhdmUgbXVsdGlwbGUgdmFsdWVzIHdpdGhpbgorCQlwcm9jZXNzQ2Fub25NYWtlck5vdGVUYWcoZGliLCB0YWcpOworCX0KKwllbHNlIHsKKwkJVGFnTGliJiBzID0gVGFnTGliOjppbnN0YW5jZSgpOworCisJCVdPUkQgdGFnX2lkID0gRnJlZUltYWdlX0dldFRhZ0lEKHRhZyk7CisKKwkJLy8gZ2V0IHRoZSB0YWcga2V5IGFuZCBkZXNjcmlwdGlvbgorCQljb25zdCBjaGFyICprZXkgPSBzLmdldFRhZ0ZpZWxkTmFtZShtZF9tb2RlbCwgdGFnX2lkLCBkZWZhdWx0S2V5KTsKKwkJRnJlZUltYWdlX1NldFRhZ0tleSh0YWcsIGtleSk7CisJCWNvbnN0IGNoYXIgKmRlc2NyaXB0aW9uID0gcy5nZXRUYWdEZXNjcmlwdGlvbihtZF9tb2RlbCwgdGFnX2lkKTsKKwkJRnJlZUltYWdlX1NldFRhZ0Rlc2NyaXB0aW9uKHRhZywgZGVzY3JpcHRpb24pOworCisJCS8vIHN0b3JlIHRoZSB0YWcKKwkJaWYoa2V5KSB7CisJCQlGcmVlSW1hZ2VfU2V0TWV0YWRhdGEocy5nZXRGcmVlSW1hZ2VNb2RlbChtZF9tb2RlbCksIGRpYiwga2V5LCB0YWcpOworCQl9CisJfQorCQorCisJLy8gZnJlZSB0aGUgdGVtcG9yYXJ5IGJ1ZmZlcgorCWZyZWUoZXhpZl92YWx1ZSk7CisKK30KKworLyoqCitQcm9jZXNzIEV4aWYgZGlyZWN0b3J5CisKK0BwYXJhbSBkaWIgSW5wdXQgRklCSVRNQVAKK0BwYXJhbSB0aWZmcCBQb2ludGVyIHRvIHRoZSBUSUZGIGhlYWRlcgorQHBhcmFtIGR3T2Zmc2V0SWZkMCBPZmZzZXQgdG8gdGhlIDB0aCBJRkQgKGZpcnN0IElGRCkKK0BwYXJhbSBkd0xlbmd0aCBMZW5ndGggb2YgdGhlIEV4aWYgZmlsZQorQHBhcmFtIGR3UHJvZmlsZU9mZnNldCBGaWxlIG9mZnNldCB0byBiZSB1c2VkIHdoZW4gcmVhZGluZyAnb2Zmc2V0L3ZhbHVlJyB0YWdzCitAcGFyYW0gbXNiX29yZGVyIEVuZGlhbm5lc3Mgb3JkZXIgb2YgdGhlIEV4aWYgZmlsZSAoVFJVRSBpZiBiaWctZW5kaWFuLCBGQUxTRSBpZiBsaXR0bGUtZW5kaWFuKQorQHBhcmFtIHN0YXJ0aW5nX21kX21vZGVsIE1ldGFkYXRhIG1vZGVsIG9mIHRoZSBJRkQgKHNob3VsZCBiZSBUYWdMaWI6OkVYSUZfTUFJTiBmb3IgYSBqcGVnKQorQHJldHVybiBSZXR1cm5zIFRSVUUgaWYgc3VjZXNzZnVsLCByZXR1cm5zIEZBTFNFIG90aGVyd2lzZQorKi8KK3N0YXRpYyBCT09MIAoranBlZ19yZWFkX2V4aWZfZGlyKEZJQklUTUFQICpkaWIsIGNvbnN0IEJZVEUgKnRpZmZwLCBEV09SRCBkd09mZnNldElmZDAsIERXT1JEIGR3TGVuZ3RoLCBEV09SRCBkd1Byb2ZpbGVPZmZzZXQsIEJPT0wgbXNiX29yZGVyLCBUYWdMaWI6Ok1ETU9ERUwgc3RhcnRpbmdfbWRfbW9kZWwpIHsKKwlXT1JEIGRlLCBuZGU7CisKKwlzdGQ6OnN0YWNrPFdPUkQ+CQkJZGVzdGFjazsJLy8gZGlyZWN0b3J5IGVudHJpZXMgc3RhY2sKKwlzdGQ6OnN0YWNrPGNvbnN0IEJZVEUqPgkJaWZkc3RhY2s7CS8vIElGRCBzdGFjaworCXN0ZDo6c3RhY2s8VGFnTGliOjpNRE1PREVMPgltb2RlbHN0YWNrOyAvLyBtZXRhZGF0YSBtb2RlbCBzdGFjaworCisJLy8gS2VlcCBhIGxpc3Qgb2YgYWxyZWFkeSB2aXNpdGVkIElGRCB0byBhdm9pZCBzdGFjayBvdmVyZmxvd3MgCisJLy8gd2hlbiByZWN1cnNpdmUvY3ljbGljIGRpcmVjdG9yeSBzdHJ1Y3R1cmVzIGV4aXN0LiAKKwkvLyBUaGlzIGtpbmQgb2YgcmVjdXJzaXZlIEV4aWYgZmlsZSB3YXMgZW5jb3VudGVyZWQgd2l0aCBLb2RhayBpbWFnZXMgY29taW5nIGZyb20gCisJLy8gS09EQUsgUFJPRkVTU0lPTkFMIERDUyBQaG90byBEZXNrIEpQRUcgRXhwb3J0IHYzLjIgVworCXN0ZDo6bWFwPERXT1JELCBpbnQ+IHZpc2l0ZWRJRkQ7CisKKwkvKgorCSJBbiBJbWFnZSBGaWxlIERpcmVjdG9yeSAoSUZEKSBjb25zaXN0cyBvZiBhIDItYnl0ZSBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGRpcmVjdG9yeQorCWVudHJpZXMgKGkuZS4gdGhlIG51bWJlciBvZiBmaWVsZHMpLCBmb2xsb3dlZCBieSBhIHNlcXVlbmNlIG9mIDEyLWJ5dGUgZmllbGQKKwllbnRyaWVzLCBmb2xsb3dlZCBieSBhIDQtYnl0ZSBvZmZzZXQgb2YgdGhlIG5leHQgSUZEIChvciAwIGlmIG5vbmUpLiIKKwlUaGUgIm5leHQgSUZEIiAoMXN0IElGRCkgaXMgdGhlIHRodW1ibmFpbC4KKwkqLworCSNkZWZpbmUgRElSX0VOVFJZX0FERFIoX3N0YXJ0LCBfZW50cnkpIChfc3RhcnQgKyAyICsgKDEyICogX2VudHJ5KSkKKworCS8vIHNldCB0aGUgbWV0YWRhdGEgbW9kZWwgdG8gRXhpZgorCisJVGFnTGliOjpNRE1PREVMIG1kX21vZGVsID0gc3RhcnRpbmdfbWRfbW9kZWw7CisKKwkvLyBzZXQgdGhlIHBvaW50ZXIgdG8gdGhlIGZpcnN0IElGRCAoMHRoIElGRCkgYW5kIGZvbGxvdyBpdCB3ZXJlIGl0IGxlYWRzLgorCisJY29uc3QgQllURSAqaWZkMHRoID0gKEJZVEUqKXRpZmZwICsgKHNpemVfdClkd09mZnNldElmZDA7CisKKwljb25zdCBCWVRFICppZmRwID0gaWZkMHRoOworCisJZGUgPSAwOworCisJZG8geworCQkvLyBpZiB0aGVyZSBpcyBhbnl0aGluZyBvbiB0aGUgc3RhY2sgdGhlbiBwb3AgaXQgb2ZmCisJCWlmKCFkZXN0YWNrLmVtcHR5KCkpIHsKKwkJCWlmZHAJCT0gaWZkc3RhY2sudG9wKCk7CWlmZHN0YWNrLnBvcCgpOworCQkJZGUJCQk9IGRlc3RhY2sudG9wKCk7CWRlc3RhY2sucG9wKCk7CisJCQltZF9tb2RlbAk9IG1vZGVsc3RhY2sudG9wKCk7CW1vZGVsc3RhY2sucG9wKCk7CisJCX0KKworCQkvLyByZW1lbWJlciB0aGF0IHdlJ3ZlIHZpc2l0ZWQgdGhpcyBkaXJlY3RvcnkgYW5kIGVudHJ5IHNvIHRoYXQgd2UgZG9uJ3QgdmlzaXQgaXQgYWdhaW4gbGF0ZXIKKwkJRFdPUkQgdmlzaXRlZCA9IChEV09SRCkoICgoKHNpemVfdClpZmRwICYgMHhGRkZGKSA8PCAxNikgfCAoc2l6ZV90KWRlICk7CisJCWlmKHZpc2l0ZWRJRkQuZmluZCh2aXNpdGVkKSAhPSB2aXNpdGVkSUZELmVuZCgpKSB7CisJCQljb250aW51ZTsKKwkJfSBlbHNlIHsKKwkJCXZpc2l0ZWRJRkRbdmlzaXRlZF0gPSAxOwkvLyBwcm9jZXNzZWQKKwkJfQorCisJCS8vIGRldGVybWluZSBob3cgbWFueSBlbnRyaWVzIHRoZXJlIGFyZSBpbiB0aGUgY3VycmVudCBJRkQKKwkJbmRlID0gUmVhZFVpbnQxNihtc2Jfb3JkZXIsIGlmZHApOworCQlpZiAoKChzaXplX3QpKGlmZHAgLSB0aWZmcCkgKyAxMiAqIG5kZSkgPiAoc2l6ZV90KWR3TGVuZ3RoKSB7CisJCQkvLyBzdXNwaWNpb3VzIElGRCBvZmZzZXQsIGlnbm9yZQorCQkJY29udGludWU7CisJCX0KKworCQlmb3IoOyBkZSA8IG5kZTsgZGUrKykgeworCQkJY2hhciAqcGRlID0gTlVMTDsJLy8gcG9pbnRlciB0byB0aGUgZGlyZWN0b3J5IGVudHJ5CisJCQljaGFyICpwdmFsID0gTlVMTDsJLy8gcG9pbnRlciB0byB0aGUgdGFnIHZhbHVlCisJCQkKKwkJCS8vIGNyZWF0ZSBhIHRhZworCQkJRklUQUcgKnRhZyA9IEZyZWVJbWFnZV9DcmVhdGVUYWcoKTsKKwkJCWlmKCF0YWcpIHJldHVybiBGQUxTRTsKKworCQkJLy8gcG9pbnQgdG8gdGhlIGRpcmVjdG9yeSBlbnRyeQorCQkJcGRlID0gKGNoYXIqKSBESVJfRU5UUllfQUREUihpZmRwLCBkZSk7CisKKwkJCS8vIGdldCB0aGUgdGFnIElECisJCQlXT1JEIHRhZ19pZCA9IFJlYWRVaW50MTYobXNiX29yZGVyLCBwZGUpOworCQkJRnJlZUltYWdlX1NldFRhZ0lEKHRhZywgdGFnX2lkKTsKKworCQkJLy8gZ2V0IHRoZSB0YWcgdHlwZQorCQkJV09SRCB0YWdfdHlwZSA9IChXT1JEKVJlYWRVaW50MTYobXNiX29yZGVyLCBwZGUgKyAyKTsKKyAgICAgICAgICAgIGlmKCh0YWdfdHlwZSAtIDEpID49IEVYSUZfTlVNX0ZPUk1BVFMpIHsKKyAgICAgICAgICAgICAgICAvLyBhIHByb2JsZW0gb2NjdXJlZCA6IGRlbGV0ZSB0aGUgdGFnIChub3QgZnJlZSdkIGFmdGVyKQorCQkJICAgIEZyZWVJbWFnZV9EZWxldGVUYWcodGFnKTsKKwkJCQkvLyBicmVhayBvdXQgb2YgdGhlIGZvciBsb29wCisJCQkJYnJlYWs7CisgICAgICAgICAgICB9CisJCQlGcmVlSW1hZ2VfU2V0VGFnVHlwZSh0YWcsIChGUkVFX0lNQUdFX01EVFlQRSl0YWdfdHlwZSk7CisKKwkJCS8vIGdldCBudW1iZXIgb2YgY29tcG9uZW50cworCQkJRFdPUkQgdGFnX2NvdW50ID0gUmVhZFVpbnQzMihtc2Jfb3JkZXIsIHBkZSArIDQpOworCQkJRnJlZUltYWdlX1NldFRhZ0NvdW50KHRhZywgdGFnX2NvdW50KTsKKyAgICAgICAgICAgIC8vIGNoZWNrIHRoYXQgdGFnIGxlbmd0aCAoc2l6ZSBvZiB0aGUgdGFnIHZhbHVlIGluIGJ5dGVzKSB3aWxsIGZpdCBpbiBhIERXT1JECisgICAgICAgICAgICB1bnNpZ25lZCB0YWdfZGF0YV93aWR0aCA9IEZyZWVJbWFnZV9UYWdEYXRhV2lkdGgoRnJlZUltYWdlX0dldFRhZ1R5cGUodGFnKSk7CisgICAgICAgICAgICBpZiAodGFnX2RhdGFfd2lkdGggIT0gMCAmJiBGcmVlSW1hZ2VfR2V0VGFnQ291bnQodGFnKSA+IH4oRFdPUkQpMCAvIHRhZ19kYXRhX3dpZHRoKSB7CisgICAgICAgICAgICAgICAgRnJlZUltYWdlX0RlbGV0ZVRhZyh0YWcpOworCQkJCSAgICAgICAgLy8gZG9uJ3QgcmlzayBwcm9jZXNzaW5nIHRoaXMgZGlyZWN0b3J5IGZ1cnRoZXIKKwkJCQkgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKwkJCUZyZWVJbWFnZV9TZXRUYWdMZW5ndGgodGFnLCBGcmVlSW1hZ2VfR2V0VGFnQ291bnQodGFnKSAqIHRhZ19kYXRhX3dpZHRoKTsKKworCQkJaWYoRnJlZUltYWdlX0dldFRhZ0xlbmd0aCh0YWcpIDw9IDQpIHsKKwkJCQkvLyA0IGJ5dGVzIG9yIGxlc3MgYW5kIHZhbHVlIGlzIGluIHRoZSBkaXIgZW50cnkgaXRzZWxmCisJCQkJcHZhbCA9IHBkZSArIDg7CisJCQl9IGVsc2UgeworCQkJCS8vIGlmIGl0cyBiaWdnZXIgdGhhbiA0IGJ5dGVzLCB0aGUgZGlyZWN0b3J5IGVudHJ5IGNvbnRhaW5zIGFuIG9mZnNldAkJCQkKKwkJCQlEV09SRCBvZmZzZXRfdmFsdWUgPSBSZWFkVWludDMyKG1zYl9vcmRlciwgcGRlICsgOCk7CisJCQkJLy8gdGhlIG9mZnNldCBjYW4gYmUgcmVsYXRpdmUgdG8gdGlmZnAgb3IgdG8gYW4gZXh0ZXJuYWwgcmVmZXJlbmNlIChzZWUgSlBFRy1YUikKKwkJCQlpZihkd1Byb2ZpbGVPZmZzZXQpIHsKKwkJCQkJb2Zmc2V0X3ZhbHVlIC09IGR3UHJvZmlsZU9mZnNldDsKKwkJCQl9CisJCQkJLy8gZmlyc3QgY2hlY2sgaWYgb2Zmc2V0IGV4Y2VlZHMgYnVmZmVyLCBhdCB0aGlzIHN0YWdlIEZyZWVJbWFnZV9HZXRUYWdMZW5ndGggbWF5IHJldHVybiBpbnZhbGlkIGRhdGEKKwkJCQlpZihvZmZzZXRfdmFsdWUgPiBkd0xlbmd0aCkgeworCQkJCQkvLyBhIHByb2JsZW0gb2NjdXJlZCA6IGRlbGV0ZSB0aGUgdGFnIChub3QgZnJlZSdkIGFmdGVyKQorCQkJCQlGcmVlSW1hZ2VfRGVsZXRlVGFnKHRhZyk7CisJCQkJCS8vIGp1bXAgdG8gbmV4dCBlbnRyeQorCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJLy8gbm93IGNoZWNrIHRoYXQgbGVuZ3RoIGRvZXMgbm90IGV4Y2VlZCB0aGUgYnVmZmVyIHNpemUKKwkJCQlpZihGcmVlSW1hZ2VfR2V0VGFnTGVuZ3RoKHRhZykgPiBkd0xlbmd0aCAtIG9mZnNldF92YWx1ZSl7CisJCQkJCS8vIGEgcHJvYmxlbSBvY2N1cmVkIDogZGVsZXRlIHRoZSB0YWcgKG5vdCBmcmVlJ2QgYWZ0ZXIpCisJCQkJCUZyZWVJbWFnZV9EZWxldGVUYWcodGFnKTsKKwkJCQkJLy8ganVtcCB0byBuZXh0IGVudHJ5CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlwdmFsID0gKGNoYXIqKSh0aWZmcCArIG9mZnNldF92YWx1ZSk7CisJCQl9CisKKwkJCS8vIGNoZWNrIGZvciBhIElGRCBvZmZzZXQKKwkJCUJPT0wgaXNJRkRPZmZzZXQgPSBGQUxTRTsKKwkJCXN3aXRjaChGcmVlSW1hZ2VfR2V0VGFnSUQodGFnKSkgeworCQkJCWNhc2UgVEFHX0VYSUZfT0ZGU0VUOgorCQkJCWNhc2UgVEFHX0dQU19PRkZTRVQ6CisJCQkJY2FzZSBUQUdfSU5URVJPUF9PRkZTRVQ6CisJCQkJY2FzZSBUQUdfTUFLRVJfTk9URToKKwkJCQkJaXNJRkRPZmZzZXQgPSBUUlVFOworCQkJCQlicmVhazsKKwkJCX0KKwkJCWlmKGlzSUZET2Zmc2V0KQl7CisJCQkJRFdPUkQgc3ViX29mZnNldCA9IDA7CisJCQkJVGFnTGliOjpNRE1PREVMIG5leHRfbWRtb2RlbCA9IG1kX21vZGVsOworCQkJCWNvbnN0IEJZVEUgKm5leHRfaWZkID0gaWZkcDsKKwkJCQkKKwkJCQkvLyBnZXQgb2Zmc2V0IGFuZCBtZXRhZGF0YSBtb2RlbAorCQkJCWlmIChGcmVlSW1hZ2VfR2V0VGFnSUQodGFnKSA9PSBUQUdfTUFLRVJfTk9URSkgeworCQkJCQlwcm9jZXNzTWFrZXJOb3RlKGRpYiwgcHZhbCwgbXNiX29yZGVyLCAmc3ViX29mZnNldCwgJm5leHRfbWRtb2RlbCk7CisJCQkJCW5leHRfaWZkID0gKEJZVEUqKXB2YWwgKyBzdWJfb2Zmc2V0OworCQkJCX0gZWxzZSB7CisJCQkJCXByb2Nlc3NJRkRPZmZzZXQodGFnLCBwdmFsLCBtc2Jfb3JkZXIsICZzdWJfb2Zmc2V0LCAmbmV4dF9tZG1vZGVsKTsKKwkJCQkJbmV4dF9pZmQgPSAoQllURSopdGlmZnAgKyBzdWJfb2Zmc2V0OworCQkJCX0KKworCQkJCWlmKChzdWJfb2Zmc2V0IDwgZHdMZW5ndGgpICYmIChuZXh0X21kbW9kZWwgIT0gVGFnTGliOjpVTktOT1dOKSkgeworCQkJCQkvLyBwdXNoIG91ciBjdXJyZW50IGRpcmVjdG9yeSBzdGF0ZSBvbnRvIHRoZSBzdGFjaworCQkJCQlpZmRzdGFjay5wdXNoKGlmZHApOworCQkJCQkvLyBqdW1wIHRvIHRoZSBuZXh0IGVudHJ5CisJCQkJCWRlKys7CisJCQkJCWRlc3RhY2sucHVzaChkZSk7CisKKwkJCQkJLy8gcHVzaCBvdXIgY3VycmVudCBtZXRhZGF0YSBtb2RlbAorCQkJCQltb2RlbHN0YWNrLnB1c2gobWRfbW9kZWwpOworCisJCQkJCS8vIHB1c2ggbmV3IHN0YXRlIG9udG8gb2Ygc3RhY2sgdG8gY2F1c2UgYSBqdW1wCisJCQkJCWlmZHN0YWNrLnB1c2gobmV4dF9pZmQpOworCQkJCQlkZXN0YWNrLnB1c2goMCk7CisKKwkJCQkJLy8gc2VsZWN0IGEgbmV3IG1ldGFkYXRhIG1vZGVsCisJCQkJCW1vZGVsc3RhY2sucHVzaChuZXh0X21kbW9kZWwpOworCQkJCQkKKwkJCQkJLy8gZGVsZXRlIHRoZSB0YWcgYXMgaXQgd29uJ3QgYmUgc3RvcmVkIG5vciBkZWxldGVkIGluIHRoZSBmb3IoKSBsb29wCisJCQkJCUZyZWVJbWFnZV9EZWxldGVUYWcodGFnKTsKKwkJCQkJCisJCQkJCWJyZWFrOyAvLyBicmVhayBvdXQgb2YgdGhlIGZvciBsb29wCisJCQkJfQorCQkJCWVsc2UgeworCQkJCQkvLyB1bnN1cHBvcnRlZCBjYW1lcmEgbW9kZWwsIGNhbm9uIG1ha2VyIHRhZyBvciBzb21ldGhpbmcgdW5rbm93bgorCQkJCQkvLyBwcm9jZXNzIGFzIGEgc3RhbmRhcmQgdGFnCisJCQkJCXByb2Nlc3NFeGlmVGFnKGRpYiwgdGFnLCBwdmFsLCBtc2Jfb3JkZXIsIG1kX21vZGVsKTsKKwkJCQl9CQkJCisKKwkJCX0gZWxzZSB7CisJCQkJLy8gcHJvY2VzcyBhcyBhIHN0YW5kYXJkIHRhZworCQkJCXByb2Nlc3NFeGlmVGFnKGRpYiwgdGFnLCBwdmFsLCBtc2Jfb3JkZXIsIG1kX21vZGVsKTsKKwkJCX0KKwkJCQorCQkJLy8gZGVsZXRlIHRoZSB0YWcKKwkJCUZyZWVJbWFnZV9EZWxldGVUYWcodGFnKTsKKworICAgICAgICB9IC8vIGZvcihuZGUpCisKKwkJLy8gYWRkaXRpb25hbCB0aHVtYm5haWwgZGF0YSBpcyBza2lwcGVkCisKKyAgICB9IHdoaWxlICghZGVzdGFjay5lbXB0eSgpKTsgCisKKwkvLworCS8vIC0tLSBoYW5kbGUgdGh1bWJuYWlsIGRhdGEgLS0tCisJLy8KKworCWNvbnN0IFdPUkQgZW50cmllc0NvdW50MHRoID0gUmVhZFVpbnQxNihtc2Jfb3JkZXIsIGlmZDB0aCk7CisJCisJRFdPUkQgbmV4dF9vZmZzZXQgPSBSZWFkVWludDMyKG1zYl9vcmRlciwgRElSX0VOVFJZX0FERFIoaWZkMHRoLCBlbnRyaWVzQ291bnQwdGgpKTsKKwlpZigobmV4dF9vZmZzZXQgPT0gMCkgfHwgKG5leHRfb2Zmc2V0ID49IGR3TGVuZ3RoKSkgeworCQlyZXR1cm4gVFJVRTsgLy88IG5vIHRodW1ibmFpbAorCX0KKwkKKwljb25zdCBCWVRFKiBjb25zdCBpZmQxc3QgPSAoQllURSopdGlmZnAgKyBuZXh0X29mZnNldDsKKwljb25zdCBXT1JEIGVudHJpZXNDb3VudDFzdCA9IFJlYWRVaW50MTYobXNiX29yZGVyLCBpZmQxc3QpOworCQorCXVuc2lnbmVkIHRoQ29tcHJlc3Npb24gPSAwOworCXVuc2lnbmVkIHRoT2Zmc2V0ID0gMDsgCisJdW5zaWduZWQgdGhTaXplID0gMDsgCisJCisJZm9yKGludCBlID0gMDsgZSA8IGVudHJpZXNDb3VudDFzdDsgZSsrKSB7CisKKwkJLy8gcG9pbnQgdG8gdGhlIGRpcmVjdG9yeSBlbnRyeQorCQljb25zdCBCWVRFKiBiYXNlID0gRElSX0VOVFJZX0FERFIoaWZkMXN0LCBlKTsKKwkJCisJCS8vIGNoZWNrIGZvciBidWZmZXIgb3ZlcmZsb3cKKwkJY29uc3Qgc2l6ZV90IHJlbWFpbmluZyA9IChzaXplX3QpYmFzZSArIDEyIC0gKHNpemVfdCl0aWZmcDsKKwkJaWYocmVtYWluaW5nID49IGR3TGVuZ3RoKSB7CisJCQkvLyBiYWQgSUZEMSBkaXJlY3RvcnksIGlnbm9yZSBpdAorCQkJcmV0dXJuIEZBTFNFOworCQl9CisKKwkJLy8gZ2V0IHRoZSB0YWcgSUQKKwkJV09SRCB0YWcgPSBSZWFkVWludDE2KG1zYl9vcmRlciwgYmFzZSk7CisJCS8vIGdldCB0aGUgdGFnIHR5cGUKKwkJLypXT1JEIHR5cGUgPSAqL1JlYWRVaW50MTYobXNiX29yZGVyLCBiYXNlICsgc2l6ZW9mKFdPUkQpKTsKKwkJLy8gZ2V0IG51bWJlciBvZiBjb21wb25lbnRzCisJCS8qRFdPUkQgY291bnQgPSAqL1JlYWRVaW50MzIobXNiX29yZGVyLCBiYXNlICsgc2l6ZW9mKFdPUkQpICsgc2l6ZW9mKFdPUkQpKTsKKwkJLy8gZ2V0IHRoZSB0YWcgdmFsdWUKKwkJRFdPUkQgb2Zmc2V0ID0gUmVhZFVpbnQzMihtc2Jfb3JkZXIsIGJhc2UgKyBzaXplb2YoV09SRCkgKyBzaXplb2YoV09SRCkgKyBzaXplb2YoRFdPUkQpKTsKKworCQlzd2l0Y2godGFnKSB7CisJCQljYXNlIFRBR19DT01QUkVTU0lPTjoKKwkJCQkvLyBUaWZmIENvbXByZXNzaW9uIFRhZyAoc2hvdWxkIGJlIENPTVBSRVNTSU9OX09KUEVHICg2KSwgYnV0IGlzIG5vdCBhbHdheXMgcmVzcGVjdGVkKQorCQkJCXRoQ29tcHJlc3Npb24gPSBvZmZzZXQ7CisJCQkJYnJlYWs7CisJCQljYXNlIFRBR19KUEVHX0lOVEVSQ0hBTkdFX0ZPUk1BVDoKKwkJCQkvLyBUaWZmIEpQRUdJbnRlcmNoYW5nZUZvcm1hdCBUYWcKKwkJCQl0aE9mZnNldCA9IG9mZnNldDsKKwkJCQlicmVhazsKKwkJCWNhc2UgVEFHX0pQRUdfSU5URVJDSEFOR0VfRk9STUFUX0xFTkdUSDoKKwkJCQkvLyBUaWZmIEpQRUdJbnRlcmNoYW5nZUZvcm1hdExlbmd0aCBUYWcKKwkJCQl0aFNpemUgPSBvZmZzZXQ7CisJCQkJYnJlYWs7CisJCQkvLyAjIyMgWCBhbmQgWSBSZXNvbHV0aW9uIGlnbm9yZWQsIG9yaWVudGF0aW9uIGlnbm9yZWQKKwkJCWNhc2UgVEFHX1hfUkVTT0xVVElPTjoJCS8vIFhSZXNvbHV0aW9uCisJCQljYXNlIFRBR19ZX1JFU09MVVRJT046CQkvLyBZUmVzb2x1dGlvbgorCQkJY2FzZSBUQUdfUkVTT0xVVElPTl9VTklUOgkvLyBSZXNvbHV0aW9uVW5pdAorCQkJY2FzZSBUQUdfT1JJRU5UQVRJT046CQkvLyBPcmllbnRhdGlvbgorCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJfQorCX0KKwkKKwlpZigvKnRoQ29tcHJlc3Npb24gIT0gNiB8fCovIHRoT2Zmc2V0ID09IDAgfHwgdGhTaXplID09IDApIHsKKwkJcmV0dXJuIFRSVUU7CisJfQorCQorCWlmKHRoT2Zmc2V0ICsgdGhTaXplID4gZHdMZW5ndGgpIHsKKwkJcmV0dXJuIFRSVUU7CisJfQorCQorCS8vIGxvYWQgdGhlIHRodW1ibmFpbAorCisJY29uc3QgQllURSAqdGhMb2NhdGlvbiA9IHRpZmZwICsgdGhPZmZzZXQ7CisJCisJRklNRU1PUlkqIGhtZW0gPSBGcmVlSW1hZ2VfT3Blbk1lbW9yeShjb25zdF9jYXN0PEJZVEUqPih0aExvY2F0aW9uKSwgdGhTaXplKTsKKwlGSUJJVE1BUCogdGh1bWJuYWlsID0gRnJlZUltYWdlX0xvYWRGcm9tTWVtb3J5KEZJRl9KUEVHLCBobWVtKTsKKwlGcmVlSW1hZ2VfQ2xvc2VNZW1vcnkoaG1lbSk7CisJCisJLy8gc3RvcmUgdGhlIHRodW1ibmFpbAorCUZyZWVJbWFnZV9TZXRUaHVtYm5haWwoZGliLCB0aHVtYm5haWwpOworCS8vIHRoZW4gZGVsZXRlIGl0CisJRnJlZUltYWdlX1VubG9hZCh0aHVtYm5haWwpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qKgorUmVhZCBhbmQgZGVjb2RlIEpQRUdfQVBQMSBtYXJrZXIgKEV4aWYgcHJvZmlsZSkKK0BwYXJhbSBkaWIgSW5wdXQgRklCSVRNQVAKK0BwYXJhbSBkYXRhIFBvaW50ZXIgdG8gdGhlIEFQUDEgbWFya2VyCitAcGFyYW0gbGVuZ3RoIEFQUDEgbWFya2VyIGxlbmd0aAorQHJldHVybiBSZXR1cm5zIFRSVUUgaWYgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlCisqLworQk9PTCAgCitqcGVnX3JlYWRfZXhpZl9wcm9maWxlKEZJQklUTUFQICpkaWIsIGNvbnN0IEJZVEUgKmRhdGEsIHVuc2lnbmVkIGxlbmd0aCkgeworICAgIC8vIG1hcmtlciBpZGVudGlmeWluZyBzdHJpbmcgZm9yIEV4aWYgPSAiRXhpZlwwXDAiCisgICAgQllURSBleGlmX3NpZ25hdHVyZVs2XSA9IHsgMHg0NSwgMHg3OCwgMHg2OSwgMHg2NiwgMHgwMCwgMHgwMCB9OworCUJZVEUgbHNiX2ZpcnN0WzRdID0geyAweDQ5LCAweDQ5LCAweDJBLCAweDAwIH07CQkvLyBDbGFzc2ljIFRJRkYgc2lnbmF0dXJlIC0gbGl0dGxlLWVuZGlhbiBvcmRlcgorCUJZVEUgbXNiX2ZpcnN0WzRdID0geyAweDRELCAweDRELCAweDAwLCAweDJBIH07CQkvLyBDbGFzc2ljIFRJRkYgc2lnbmF0dXJlIC0gYmlnLWVuZGlhbiBvcmRlcgorCisJLy8gcHJvZmlsZSBzaXplIGlzIHVwIHRvIDMyLWJpdAorCURXT1JEIGR3UHJvZmlsZUxlbmd0aCA9IChEV09SRClsZW5ndGg7CisJQllURSAqcGJQcm9maWxlID0gKEJZVEUqKWRhdGE7CisKKwkvLyB2ZXJpZnkgdGhlIGlkZW50aWZ5aW5nIHN0cmluZworCWlmKG1lbWNtcChleGlmX3NpZ25hdHVyZSwgcGJQcm9maWxlLCBzaXplb2YoZXhpZl9zaWduYXR1cmUpKSA9PSAwKSB7CisJCS8vIFRoaXMgaXMgYW4gRXhpZiBwcm9maWxlCisJCS8vIHNob3VsZCBjb250YWluIGEgVElGRiBoZWFkZXIgd2l0aCB1cCB0byAyIElGRHMgKElGRCBzdGFuZHMgZm9yICdJbWFnZSBGaWxlIERpcmVjdG9yeScpCisJCS8vIDB0aCBJRkQgOiB0aGUgaW1hZ2UgYXR0cmlidXRlcywgMXN0IElGRCA6IG1heSBiZSB1c2VkIGZvciB0aHVtYm5haWwKKworCQlwYlByb2ZpbGUgKz0gc2l6ZW9mKGV4aWZfc2lnbmF0dXJlKTsKKwkJZHdQcm9maWxlTGVuZ3RoIC09IHNpemVvZihleGlmX3NpZ25hdHVyZSk7CisKKwkJLy8gcmVhZCB0aGUgVElGRiBoZWFkZXIgKDggYnl0ZXMpCisKKwkJLy8gY2hlY2sgdGhlIGVuZGlhbmVzcyBvcmRlcgorCQkKKwkJQk9PTCBiQmlnRW5kaWFuID0gVFJVRTsKKworCQlpZihtZW1jbXAocGJQcm9maWxlLCBsc2JfZmlyc3QsIHNpemVvZihsc2JfZmlyc3QpKSA9PSAwKSB7CisJCQkvLyBFeGlmIHNlY3Rpb24gaXMgaW4gbGl0dGxlLWVuZGlhbiBvcmRlcgorCQkJYkJpZ0VuZGlhbiA9IEZBTFNFOworCQl9IGVsc2UgeworCQkJaWYobWVtY21wKHBiUHJvZmlsZSwgbXNiX2ZpcnN0LCBzaXplb2YobXNiX2ZpcnN0KSkgPT0gMCkgeworCQkJCS8vIEV4aWYgc2VjdGlvbiBpcyBpbiBiaWctZW5kaWFuIG9yZGVyCisJCQkJYkJpZ0VuZGlhbiA9IFRSVUU7CisJCQl9IGVsc2UgeworCQkJCS8vIEludmFsaWQgRXhpZiBhbGlnbm1lbnQgbWFya2VyCisJCQkJcmV0dXJuIEZBTFNFOworCQkJfQorCQl9CisKKwkJLy8gdGhpcyBpcyB0aGUgb2Zmc2V0IHRvIHRoZSBmaXJzdCBJRkQgKEltYWdlIEZpbGUgRGlyZWN0b3J5KQorCQlEV09SRCBkd0ZpcnN0T2Zmc2V0ID0gUmVhZFVpbnQzMihiQmlnRW5kaWFuLCBwYlByb2ZpbGUgKyA0KTsKKwkJaWYgKGR3Rmlyc3RPZmZzZXQgPiBkd1Byb2ZpbGVMZW5ndGgpIHsKKwkJCS8vIGJhZCBFeGlmIGRhdGEKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCisJCS8qCisJCU5vdGU6IGFzIEZyZWVJbWFnZSAzLjE0LjAsIHRoaXMgdGVzdCBpcyBubyBsb25nZXIgbmVlZGVkIGZvciBpbWFnZXMgd2l0aCBzaW1pbGFyIHN1c3BpY2lvdXMgb2Zmc2V0CisJCT0+IHRlc3RlZCB3aXRoIFBlbnRheCBPcHRpbyAyMzAsIEZ1amlGaWxtIFNQLTI1MDAgYW5kIENhbm9uIEVPUyAzMDBECisJCWlmIChkd0ZpcnN0T2Zmc2V0IDwgOCB8fCBkd0ZpcnN0T2Zmc2V0ID4gMTYpIHsKKwkJCS8vIFRoaXMgaXMgdXN1YWxseSBzZXQgdG8gOAorCQkJLy8gYnV0IFBFTlRBWCBPcHRpbyAyMzAgaGFzIGl0IHNldCBkaWZmZXJlbnRseSwgYW5kIHVzZXMgaXQgYXMgb2Zmc2V0LiAKKwkJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhGSUZfSlBFRywgIkV4aWY6IFN1c3BpY2lvdXMgb2Zmc2V0IG9mIGZpcnN0IElGRCB2YWx1ZSIpOworCQkJcmV0dXJuIEZBTFNFOworCQl9CisJCSovCisKKwkJLy8gcHJvY2VzcyBFeGlmIGRpcmVjdG9yaWVzLCBzdGFydGluZyB3aXRoIEV4aWYtVElGRiBJRkQKKwkJcmV0dXJuIGpwZWdfcmVhZF9leGlmX2RpcihkaWIsIHBiUHJvZmlsZSwgZHdGaXJzdE9mZnNldCwgZHdQcm9maWxlTGVuZ3RoLCAwLCBiQmlnRW5kaWFuLCBUYWdMaWI6OkVYSUZfTUFJTik7CisJfQorCisJcmV0dXJuIEZBTFNFOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBFeGlmIEpQRUcgaGVscGVyIHJvdXRpbmVzCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8qKgorUmVhZCBKUEVHX0FQUDEgbWFya2VyIChFeGlmIHByb2ZpbGUpCitAcGFyYW0gZGliIElucHV0IEZJQklUTUFQCitAcGFyYW0gZGF0YXB0ciBQb2ludGVyIHRvIHRoZSBBUFAxIG1hcmtlcgorQHBhcmFtIGRhdGFsZW4gQVBQMSBtYXJrZXIgbGVuZ3RoCitAcmV0dXJuIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UKKyovCitCT09MICAKK2pwZWdfcmVhZF9leGlmX3Byb2ZpbGVfcmF3KEZJQklUTUFQICpkaWIsIGNvbnN0IEJZVEUgKnByb2ZpbGUsIHVuc2lnbmVkIGxlbmd0aCkgeworICAgIC8vIG1hcmtlciBpZGVudGlmeWluZyBzdHJpbmcgZm9yIEV4aWYgPSAiRXhpZlwwXDAiCisgICAgQllURSBleGlmX3NpZ25hdHVyZVs2XSA9IHsgMHg0NSwgMHg3OCwgMHg2OSwgMHg2NiwgMHgwMCwgMHgwMCB9OworCisJLy8gdmVyaWZ5IHRoZSBpZGVudGlmeWluZyBzdHJpbmcKKwlpZihtZW1jbXAoZXhpZl9zaWduYXR1cmUsIHByb2ZpbGUsIHNpemVvZihleGlmX3NpZ25hdHVyZSkpICE9IDApIHsKKwkJLy8gbm90IGFuIEV4aWYgcHJvZmlsZQorCQlyZXR1cm4gRkFMU0U7CisJfQorCisJLy8gY3JlYXRlIGEgdGFnCisJRklUQUcgKnRhZyA9IEZyZWVJbWFnZV9DcmVhdGVUYWcoKTsKKwlpZih0YWcpIHsKKwkJRnJlZUltYWdlX1NldFRhZ0tleSh0YWcsIGdfVGFnTGliX0V4aWZSYXdGaWVsZE5hbWUpOworCQlGcmVlSW1hZ2VfU2V0VGFnTGVuZ3RoKHRhZywgKERXT1JEKWxlbmd0aCk7CisJCUZyZWVJbWFnZV9TZXRUYWdDb3VudCh0YWcsIChEV09SRClsZW5ndGgpOworCQlGcmVlSW1hZ2VfU2V0VGFnVHlwZSh0YWcsIEZJRFRfQllURSk7CisJCUZyZWVJbWFnZV9TZXRUYWdWYWx1ZSh0YWcsIHByb2ZpbGUpOworCisJCS8vIHN0b3JlIHRoZSB0YWcKKwkJRnJlZUltYWdlX1NldE1ldGFkYXRhKEZJTURfRVhJRl9SQVcsIGRpYiwgRnJlZUltYWdlX0dldFRhZ0tleSh0YWcpLCB0YWcpOworCisJCS8vIGRlc3Ryb3kgdGhlIHRhZworCQlGcmVlSW1hZ2VfRGVsZXRlVGFnKHRhZyk7CisKKwkJcmV0dXJuIFRSVUU7CisJfQorCisJcmV0dXJuIEZBTFNFOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBFeGlmIEpQRUctWFIgaGVscGVyIHJvdXRpbmVzCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8qKgorUmVhZCBhbmQgZGVjb2RlIEpQRUctWFIgRXhpZiBJRkQKK0BwYXJhbSBkaWIgSW5wdXQgRklCSVRNQVAKK0BwYXJhbSBwcm9maWxlIFBvaW50ZXIgdG8gdGhlIEV4aWYgbWFya2VyCitAcGFyYW0gbGVuZ3RoIEV4aWYgbWFya2VyIGxlbmd0aAorQHBhcmFtIGZpbGVfb2Zmc2V0IFJlZmVyZW5jZSBvZmZzZXQgaW4gdGhlIG9yaWdpbmFsIGZpbGUgb2YgZWFjaCB0YWcgdmFsdWUgd2hvc2UgbGVuZ3RoIGlzID4gNAorQHJldHVybiBSZXR1cm5zIFRSVUUgaWYgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlCisqLworQk9PTCAgCitqcGVneHJfcmVhZF9leGlmX3Byb2ZpbGUoRklCSVRNQVAgKmRpYiwgY29uc3QgQllURSAqcHJvZmlsZSwgdW5zaWduZWQgbGVuZ3RoLCB1bnNpZ25lZCBmaWxlX29mZnNldCkgeworCS8vIGFzc3VtZSBMaXR0bGUgRW5kaWFuIG9yZGVyCisJQk9PTCBiQmlnRW5kaWFuID0gRkFMU0U7CisJCisJLy8gcHJvY2VzcyBFeGlmIHNwZWNpZmljIElGRAorCXJldHVybiBqcGVnX3JlYWRfZXhpZl9kaXIoZGliLCBwcm9maWxlLCAwLCBsZW5ndGgsIGZpbGVfb2Zmc2V0LCBiQmlnRW5kaWFuLCBUYWdMaWI6OkVYSUZfRVhJRik7Cit9CisKKy8qKgorUmVhZCBhbmQgZGVjb2RlIEpQRUctWFIgRXhpZi1HUFMgSUZECitAcGFyYW0gZGliIElucHV0IEZJQklUTUFQCitAcGFyYW0gcHJvZmlsZSBQb2ludGVyIHRvIHRoZSBFeGlmLUdQUyBwcm9maWxlCitAcGFyYW0gbGVuZ3RoIEV4aWYtR1BTIHByb2ZpbGUgbGVuZ3RoCitAcGFyYW0gZmlsZV9vZmZzZXQgUmVmZXJlbmNlIG9mZnNldCBpbiB0aGUgb3JpZ2luYWwgZmlsZSBvZiBlYWNoIHRhZyB2YWx1ZSB3aG9zZSBsZW5ndGggaXMgPiA0CitAcmV0dXJuIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UKKyovCitCT09MICAKK2pwZWd4cl9yZWFkX2V4aWZfZ3BzX3Byb2ZpbGUoRklCSVRNQVAgKmRpYiwgY29uc3QgQllURSAqcHJvZmlsZSwgdW5zaWduZWQgbGVuZ3RoLCB1bnNpZ25lZCBmaWxlX29mZnNldCkgeworCS8vIGFzc3VtZSBMaXR0bGUgRW5kaWFuIG9yZGVyCisJQk9PTCBiQmlnRW5kaWFuID0gRkFMU0U7CisJCisJLy8gcHJvY2VzcyBFeGlmIEdQUyBJRkQKKwlyZXR1cm4ganBlZ19yZWFkX2V4aWZfZGlyKGRpYiwgcHJvZmlsZSwgMCwgbGVuZ3RoLCBmaWxlX29mZnNldCwgYkJpZ0VuZGlhbiwgVGFnTGliOjpFWElGX0dQUyk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEV4aWYgY29tbW9uIGhlbHBlciByb3V0aW5lcworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvKioKK1JvdGF0ZSBhIGRpYiBhY2NvcmRpbmcgdG8gRXhpZiBpbmZvCitAcGFyYW0gZGliIElucHV0IC8gT3V0cHV0IGRpYiB0byByb3RhdGUKK0BzZWUgUGx1Z2luSlBFRy5jcHAKKyovCit2b2lkIAorUm90YXRlRXhpZihGSUJJVE1BUCAqKmRpYikgeworCS8vIGNoZWNrIGZvciBFeGlmIHJvdGF0aW9uCisJaWYoRnJlZUltYWdlX0dldE1ldGFkYXRhQ291bnQoRklNRF9FWElGX01BSU4sICpkaWIpKSB7CisJCUZJQklUTUFQICpyb3RhdGVkID0gTlVMTDsKKwkJLy8gcHJvY2VzcyBFeGlmIHJvdGF0aW9uCisJCUZJVEFHICp0YWcgPSBOVUxMOworCQlGcmVlSW1hZ2VfR2V0TWV0YWRhdGEoRklNRF9FWElGX01BSU4sICpkaWIsICJPcmllbnRhdGlvbiIsICZ0YWcpOworCQlpZigodGFnICE9IE5VTEwpICYmIChGcmVlSW1hZ2VfR2V0VGFnSUQodGFnKSA9PSBUQUdfT1JJRU5UQVRJT04pKSB7CisJCQljb25zdCBXT1JEIG9yaWVudGF0aW9uID0gKigoV09SRCAqKUZyZWVJbWFnZV9HZXRUYWdWYWx1ZSh0YWcpKTsKKwkJCXN3aXRjaCAob3JpZW50YXRpb24pIHsKKwkJCQljYXNlIDE6CQkvLyAidG9wLCBsZWZ0IHNpZGUiID0+IDDCsAorCQkJCQlicmVhazsKKwkJCQljYXNlIDI6CQkvLyAidG9wLCByaWdodCBzaWRlIiA9PiBmbGlwIGxlZnQtcmlnaHQKKwkJCQkJRnJlZUltYWdlX0ZsaXBIb3Jpem9udGFsKCpkaWIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIDM6CQkvLyAiYm90dG9tLCByaWdodCBzaWRlIiA9PiAtMTgwwrAKKwkJCQkJcm90YXRlZCA9IEZyZWVJbWFnZV9Sb3RhdGUoKmRpYiwgMTgwKTsKKwkJCQkJRnJlZUltYWdlX1VubG9hZCgqZGliKTsKKwkJCQkJKmRpYiA9IHJvdGF0ZWQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgNDoJCS8vICJib3R0b20sIGxlZnQgc2lkZSIgPT4gZmxpcCB1cC1kb3duCisJCQkJCUZyZWVJbWFnZV9GbGlwVmVydGljYWwoKmRpYik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgNToJCS8vICJsZWZ0IHNpZGUsIHRvcCIgPT4gKzkwwrAgKyBmbGlwIHVwLWRvd24KKwkJCQkJcm90YXRlZCA9IEZyZWVJbWFnZV9Sb3RhdGUoKmRpYiwgOTApOworCQkJCQlGcmVlSW1hZ2VfVW5sb2FkKCpkaWIpOworCQkJCQkqZGliID0gcm90YXRlZDsKKwkJCQkJRnJlZUltYWdlX0ZsaXBWZXJ0aWNhbCgqZGliKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSA2OgkJLy8gInJpZ2h0IHNpZGUsIHRvcCIgPT4gLTkwwrAKKwkJCQkJcm90YXRlZCA9IEZyZWVJbWFnZV9Sb3RhdGUoKmRpYiwgLTkwKTsKKwkJCQkJRnJlZUltYWdlX1VubG9hZCgqZGliKTsKKwkJCQkJKmRpYiA9IHJvdGF0ZWQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgNzoJCS8vICJyaWdodCBzaWRlLCBib3R0b20iID0+IC05MMKwICsgZmxpcCB1cC1kb3duCisJCQkJCXJvdGF0ZWQgPSBGcmVlSW1hZ2VfUm90YXRlKCpkaWIsIC05MCk7CisJCQkJCUZyZWVJbWFnZV9VbmxvYWQoKmRpYik7CisJCQkJCSpkaWIgPSByb3RhdGVkOworCQkJCQlGcmVlSW1hZ2VfRmxpcFZlcnRpY2FsKCpkaWIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIDg6CQkvLyAibGVmdCBzaWRlLCBib3R0b20iID0+ICs5MMKwCisJCQkJCXJvdGF0ZWQgPSBGcmVlSW1hZ2VfUm90YXRlKCpkaWIsIDkwKTsKKwkJCQkJRnJlZUltYWdlX1VubG9hZCgqZGliKTsKKwkJCQkJKmRpYiA9IHJvdGF0ZWQ7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBFeGlmIFRJRkYgSlBFRy1YUiBoZWxwZXIgcm91dGluZXMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgUHJlZGljYXRlVGFnSURDb21wYXJlIHsKK3B1YmxpYzoKKwlib29sIG9wZXJhdG9yKCkoRklUQUcgKmEsIEZJVEFHICpiKSB7CisJCVdPUkQgdGFnX2lkX2EgPSBGcmVlSW1hZ2VfR2V0VGFnSUQoYSk7CisJCVdPUkQgdGFnX2lkX2IgPSBGcmVlSW1hZ2VfR2V0VGFnSUQoYik7CisJCXJldHVybiAodGFnX2lkX2EgPCB0YWdfaWRfYik7CisJfQorfTsKKworLyoqCitXcml0ZSBhIG1ldGFkYXRhIG1vZGVsIGFzIGEgVElGIElGRCB0byBhIEZJTUVNT1JZIGhhbmRsZS4KK1RoZSBlbnRyaWVzIGluIHRoZSBUSUYgSUZEIGFyZSBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyIGJ5IHRhZyBpZC4JCitUaGUgbGFzdCBlbnRyeSBpcyB3cml0dGVuIGFzIDAgKDQgYnl0ZXMpIHdoaWNoIG1lYW5zIG5vIG1vcmUgSUZEIHRvIGZvbGxvdy4gCitTdXBwb3J0ZWQgbWV0YWRhdGEgbW9kZWxzIGFyZQorPHVsPgorPGxpPkZJTURfRVhJRl9NQUlOCis8bGk+RklNRF9FWElGX0VYSUYKKzxsaT5GSU1EX0VYSUZfR1BTCis8bGk+RklNRF9FWElGX0lOVEVST1AKKzwvdWw+CitUaGUgZW5kIG9mIHRoZSBidWZmZXIgaXMgZmlsbGVkIHdpdGggNCBieXRlcyBlcXVhbCB0byAwIChlbmQgb2YgSUZEIG9mZnNldCkKKworQHBhcmFtIGRpYiBJbnB1dCBGSUJJVE1BUAorQHBhcmFtIG1kX21vZGVsIE1ldGFkYXRhIG1vZGVsIHRvIHdyaXRlCitAcGFyYW0gaG1lbSBNZW1vcnkgaGFuZGxlCitAcmV0dXJuIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UKK0BzZWUgdGlmZl9nZXRfaWZkX3Byb2ZpbGUKKyovCitzdGF0aWMgQk9PTAordGlmZl93cml0ZV9pZmQoRklCSVRNQVAgKmRpYiwgRlJFRV9JTUFHRV9NRE1PREVMIG1kX21vZGVsLCBGSU1FTU9SWSAqaG1lbSkgeworCUZJVEFHICp0YWcgPSBOVUxMOworCUZJTUVUQURBVEEgKm1kaGFuZGxlID0gTlVMTDsKKwlzdGQ6OnZlY3RvcjxGSVRBRyo+IHZUYWdMaXN0OworCVRhZ0xpYjo6TURNT0RFTCBpbnRlcm5hbF9tZF9tb2RlbDsKKworCURXT1JEIGlmZF9vZmZzZXQgPSAwOwkvLyBXT1JELWFsaWduZWQgSUZEIHZhbHVlIG9mZnNldAorCisJY29uc3QgQllURSBlbXB0eV9ieXRlID0gMDsKKworCS8vIHN0YXJ0IG9mIHRoZSBmaWxlCisJY29uc3QgbG9uZyBzdGFydF9vZl9maWxlID0gRnJlZUltYWdlX1RlbGxNZW1vcnkoaG1lbSk7CisKKwkvLyBnZXQgdGhlIG1ldGFkYXRhIGNvdW50CisJdW5zaWduZWQgbWV0YWRhdGFfY291bnQgPSBGcmVlSW1hZ2VfR2V0TWV0YWRhdGFDb3VudChtZF9tb2RlbCwgZGliKTsKKwlpZihtZXRhZGF0YV9jb3VudCA9PSAwKSB7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlUYWdMaWImIHMgPSBUYWdMaWI6Omluc3RhbmNlKCk7CisKKwkvLyBjaGVjayBmb3Igc3VwcG9ydGVkIG1ldGFkYXRhIG1vZGVscworCXN3aXRjaChtZF9tb2RlbCkgeworCQljYXNlIEZJTURfRVhJRl9NQUlOOgorCQkJaW50ZXJuYWxfbWRfbW9kZWwgPSBUYWdMaWI6OkVYSUZfTUFJTjsKKwkJCWJyZWFrOworCQljYXNlIEZJTURfRVhJRl9FWElGOgorCQkJaW50ZXJuYWxfbWRfbW9kZWwgPSBUYWdMaWI6OkVYSUZfRVhJRjsKKwkJCWJyZWFrOworCQljYXNlIEZJTURfRVhJRl9HUFM6CisJCQlpbnRlcm5hbF9tZF9tb2RlbCA9IFRhZ0xpYjo6RVhJRl9HUFM7CisJCQlicmVhazsKKwkJY2FzZSBGSU1EX0VYSUZfSU5URVJPUDoKKwkJCWludGVybmFsX21kX21vZGVsID0gVGFnTGliOjpFWElGX0lOVEVST1A7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBGQUxTRTsKKwl9CisKKwl0cnkgeworCQkvLyAxKSBhY2NvcmRpbmcgdG8gdGhlIFRJRkYgc3BlY2lmaWNhdGlvbnMsIAorCQkvLyB0aGUgZW50cmllcyBpbiBhIFRJRiBJRkQgbXVzdCBiZSBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyIGJ5IHRhZyBpZAorCisJCS8vIHN0b3JlIHRoZSB0YWdzIGludG8gYSB2ZWN0b3IKKwkJdlRhZ0xpc3QucmVzZXJ2ZShtZXRhZGF0YV9jb3VudCk7CisJCW1kaGFuZGxlID0gRnJlZUltYWdlX0ZpbmRGaXJzdE1ldGFkYXRhKG1kX21vZGVsLCBkaWIsICZ0YWcpOworCQlpZihtZGhhbmRsZSkgeworCQkJLy8gcGFyc2UgdGhlIHRhZ3MgYW5kIHN0b3JlIHRoZW0gaW5zaWRlIHZUYWdMaXN0CisJCQlkbyB7CisJCQkJLy8gcmV3cml0ZSB0aGUgdGFnIGlkIHVzaW5nIEZyZWVJbWFnZSBpbnRlcm5hbCBkYXRhYmFzZQorCQkJCS8vIChpbiBjYXNlIHRoZSB0YWcgaWQgaXMgd3Jvbmcgb3IgbWlzc2luZykKKwkJCQljb25zdCBjaGFyICprZXkgPSBGcmVlSW1hZ2VfR2V0VGFnS2V5KHRhZyk7CisJCQkJaW50IHRhZ19pZCA9IHMuZ2V0VGFnSUQoaW50ZXJuYWxfbWRfbW9kZWwsIGtleSk7CisJCQkJaWYodGFnX2lkICE9IC0xKSB7CisJCQkJCS8vIHRoaXMgaXMgYSBrbm93biB0YWcsIHNldCB0aGUgdGFnIElECisJCQkJCUZyZWVJbWFnZV9TZXRUYWdJRCh0YWcsIChXT1JEKXRhZ19pZCk7CisJCQkJCS8vIHJlY29yZCB0aGUgdGFnCisJCQkJCXZUYWdMaXN0LnB1c2hfYmFjayh0YWcpOworCQkJCX0KKwkJCQkvLyBlbHNlIGlnbm9yZSB0aGlzIHRhZworCQkJfSB3aGlsZShGcmVlSW1hZ2VfRmluZE5leHRNZXRhZGF0YShtZGhhbmRsZSwgJnRhZykpOworCisJCQlGcmVlSW1hZ2VfRmluZENsb3NlTWV0YWRhdGEobWRoYW5kbGUpOworCisJCQkvLyBzb3J0IHRoZSB2ZWN0b3IgYnkgdGFnIGlkCisJCQlzdGQ6OnNvcnQodlRhZ0xpc3QuYmVnaW4oKSwgdlRhZ0xpc3QuZW5kKCksIFByZWRpY2F0ZVRhZ0lEQ29tcGFyZSgpKTsKKworCQkJLy8gdXBkYXRlIHRoZSBtZXRhZGF0YV9jb3VudAorCQkJbWV0YWRhdGFfY291bnQgPSAodW5zaWduZWQpdlRhZ0xpc3Quc2l6ZSgpOworCisJCX0gZWxzZSB7CisJCQl0aHJvdygxKTsKKwkJfQorCisJCS8vIDIpIHByZXBhcmUgdGhlIHBsYWNlIGZvciBlYWNoIElGRCBlbnRyaWVzLgorCisJCS8qCisJCUFuIEltYWdlIEZpbGUgRGlyZWN0b3J5IChJRkQpIGNvbnNpc3RzIG9mIGEgMi1ieXRlIGNvdW50IG9mIHRoZSBudW1iZXIgb2YgZGlyZWN0b3J5IGVudHJpZXMgKGkuZS4sIHRoZSBudW1iZXIgb2YgZmllbGRzKSwgCisJCWZvbGxvd2VkIGJ5IGEgc2VxdWVuY2Ugb2YgMTItYnl0ZSBmaWVsZCBlbnRyaWVzLCAKKwkJZm9sbG93ZWQgYnkgYSA0LWJ5dGUgb2Zmc2V0IG9mIHRoZSBuZXh0IElGRCAob3IgMCBpZiBub25lKS4gRG8gbm90IGZvcmdldCB0byB3cml0ZSB0aGUgNCBieXRlcyBvZiAwIGFmdGVyIHRoZSBsYXN0IElGRC4KKwkJKi8KKworCQl7CQkKKwkJCS8vIHByZXBhcmUgcGxhY2UgZm9yIDIgYnl0ZXMgZm9yIG51bWJlciBvZiBlbnRyaWVzICsgMTIgYnl0ZXMgZm9yIGVhY2ggZW50cnkKKwkJCXVuc2lnbmVkIGlmZF9zaXplID0gMiArIDEyICogbWV0YWRhdGFfY291bnQ7CisJCQlGcmVlSW1hZ2VfV3JpdGVNZW1vcnkoJmVtcHR5X2J5dGUsIDEsIGlmZF9zaXplLCBobWVtKTsKKwkJCS8vIHJlY29yZCB0aGUgb2Zmc2V0IHVzZWQgdG8gd3JpdGUgdmFsdWVzID4gNC1ieXRlcworCQkJaWZkX29mZnNldCA9IEZyZWVJbWFnZV9UZWxsTWVtb3J5KGhtZW0pOworCQkJLy8gcmV3aW5kCisJCQlGcmVlSW1hZ2VfU2Vla01lbW9yeShobWVtLCBzdGFydF9vZl9maWxlLCBTRUVLX1NFVCk7CisJCX0KKworCQkvLyAzKSB3cml0ZSBlYWNoIElGRCBlbnRyeSBpbiB0YWcgaWQgYXNjZW5kaW5nIG9yZGVyCisKKwkJLy8gbnVtYmVyIG9mIGRpcmVjdG9yeSBlbnRyaWVzCisJCVdPUkQgbmRlID0gKFdPUkQpbWV0YWRhdGFfY291bnQ7CisJCUZyZWVJbWFnZV9Xcml0ZU1lbW9yeSgmbmRlLCAxLCAyLCBobWVtKTsKKworCQkvLyBmb3IgZWFjaCBlbnRyeSAuLi4KKwkJZm9yKHVuc2lnbmVkIGkgPSAwOyBpIDwgbWV0YWRhdGFfY291bnQ7IGkrKykgeworCQkJRklUQUcgKnRhZyA9IHZUYWdMaXN0W2ldOworCQkJLy8gdGFnIGlkCisJCQlXT1JEIHRhZ19pZCA9IEZyZWVJbWFnZV9HZXRUYWdJRCh0YWcpOworCQkJRnJlZUltYWdlX1dyaXRlTWVtb3J5KCZ0YWdfaWQsIDEsIDIsIGhtZW0pOworCQkJLy8gdGFnIHR5cGUgKGNvbXBsaWFudCB3aXRoIFRJRkYgc3BlY2lmaWNhdGlvbikKKwkJCVdPUkQgdGFnX3R5cGUgPSAoV09SRClGcmVlSW1hZ2VfR2V0VGFnVHlwZSh0YWcpOworCQkJRnJlZUltYWdlX1dyaXRlTWVtb3J5KCZ0YWdfdHlwZSwgMSwgMiwgaG1lbSk7CisJCQkvLyB0YWcgY291bnQKKwkJCURXT1JEIHRhZ19jb3VudCA9IEZyZWVJbWFnZV9HZXRUYWdDb3VudCh0YWcpOworCQkJRnJlZUltYWdlX1dyaXRlTWVtb3J5KCZ0YWdfY291bnQsIDEsIDQsIGhtZW0pOworCQkJLy8gdGFnIHZhbHVlIG9yIG9mZnNldCAocmVzdWx0cyBhcmUgaW4gQllURSdzIHVuaXRzKQorCQkJdW5zaWduZWQgdGFnX2xlbmd0aCA9IEZyZWVJbWFnZV9HZXRUYWdMZW5ndGgodGFnKTsKKwkJCWlmKHRhZ19sZW5ndGggPD0gNCkgeworCQkJCS8vIDQgYnl0ZXMgb3IgbGVzcywgd3JpdGUgdGhlIHZhbHVlIChsZWZ0IGp1c3RpZmllZCkKKwkJCQljb25zdCBCWVRFICp0YWdfdmFsdWUgPSAoQllURSopRnJlZUltYWdlX0dldFRhZ1ZhbHVlKHRhZyk7CisJCQkJRnJlZUltYWdlX1dyaXRlTWVtb3J5KHRhZ192YWx1ZSwgMSwgdGFnX2xlbmd0aCwgaG1lbSk7CisJCQkJZm9yKHVuc2lnbmVkIGsgPSB0YWdfbGVuZ3RoOyBrIDwgNDsgaysrKSB7CisJCQkJCUZyZWVJbWFnZV9Xcml0ZU1lbW9yeSgmZW1wdHlfYnl0ZSwgMSwgMSwgaG1lbSk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkvLyB3cml0ZSBhbiBvZmZzZXQKKwkJCQlGcmVlSW1hZ2VfV3JpdGVNZW1vcnkoJmlmZF9vZmZzZXQsIDEsIDQsIGhtZW0pOworCQkJCS8vIHdyaXRlIHRoZSB2YWx1ZQorCQkJCWxvbmcgY3VycmVudF9wb3NpdGlvbiA9IEZyZWVJbWFnZV9UZWxsTWVtb3J5KGhtZW0pOworCQkJCUZyZWVJbWFnZV9TZWVrTWVtb3J5KGhtZW0sIGlmZF9vZmZzZXQsIFNFRUtfU0VUKTsKKwkJCQlGcmVlSW1hZ2VfV3JpdGVNZW1vcnkoRnJlZUltYWdlX0dldFRhZ1ZhbHVlKHRhZyksIDEsIHRhZ19sZW5ndGgsIGhtZW0pOworCQkJCWlmKHRhZ19sZW5ndGggJiAxKSB7CisJCQkJCS8vIGFsaWduIHRvIHRoZSBuZXh0IFdPUkQgYm91bmRhcnkKKwkJCQkJRnJlZUltYWdlX1dyaXRlTWVtb3J5KCZlbXB0eV9ieXRlLCAxLCAxLCBobWVtKTsKKwkJCQl9CisJCQkJLy8gbmV4dCBvZmZzZXQgdG8gdXNlCisJCQkJaWZkX29mZnNldCA9IEZyZWVJbWFnZV9UZWxsTWVtb3J5KGhtZW0pOworCQkJCS8vIHJld2luZAorCQkJCUZyZWVJbWFnZV9TZWVrTWVtb3J5KGhtZW0sIGN1cnJlbnRfcG9zaXRpb24sIFNFRUtfU0VUKTsKKwkJCX0KKwkJfQorCisJCS8vIGVuZC1vZi1JRkQgb3IgbmV4dCBJRkQgKDAgPT0gbm9uZSkKKwkJRnJlZUltYWdlX1NlZWtNZW1vcnkoaG1lbSwgaWZkX29mZnNldCwgU0VFS19TRVQpOworCQlGcmVlSW1hZ2VfV3JpdGVNZW1vcnkoJmVtcHR5X2J5dGUsIDEsIDQsIGhtZW0pOworCisJCXJldHVybiBUUlVFOworCX0KKwljYXRjaChpbnQpIHsKKwkJcmV0dXJuIEZBTFNFOworCX0KK30KKworLyoqCitXcml0ZSBhIG1ldGFkYXRhIG1vZGVsIGFzIGEgVElGIElGRCwgcmV0dXJucyB0aGUgSUZEIGFzIGEgYnVmZmVyLgorVGhlIGJ1ZmZlciBpcyBhbGxvY2F0ZWQgYnkgdGhlIGZ1bmN0aW9uIGFuZCBtdXN0IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIsIHVzaW5nICdmcmVlJy4KK0BwYXJhbSBkaWIgSW5wdXQgRklCSVRNQVAKK0BwYXJhbSBtZF9tb2RlbCBNZXRhZGF0YSBtb2RlbCB0byB3cml0ZQorQHBhcmFtIHBwYlByb2ZpbGUgUmV0dXJuZWQgYnVmZmVyCitAcGFyYW0gdVByb2ZpbGVMZW5ndGggUmV0dXJuZWQgYnVmZmVyIHNpemUKK0ByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZQorQHNlZSB0aWZmX3dyaXRlX2lmZAorKi8KK0JPT0wKK3RpZmZfZ2V0X2lmZF9wcm9maWxlKEZJQklUTUFQICpkaWIsIEZSRUVfSU1BR0VfTURNT0RFTCBtZF9tb2RlbCwgQllURSAqKnBwYlByb2ZpbGUsIHVuc2lnbmVkICp1UHJvZmlsZUxlbmd0aCkgeworCUZJTUVNT1JZICpobWVtID0gTlVMTDsKKworCXRyeSB7CisJCS8vIG9wZW4gYSBtZW1vcnkgc3RyZWFtCisJCWhtZW0gPSBGcmVlSW1hZ2VfT3Blbk1lbW9yeShOVUxMLCAwKTsKKwkJaWYoIWhtZW0pIHsKKwkJCXRocm93KDEpOworCQl9CisKKwkJLy8gd3JpdGUgdGhlIG1ldGFkYXRhIG1vZGVsIGFzIGEgVElGIElGRAorCQlCT09MIGJSZXN1bHQgPSB0aWZmX3dyaXRlX2lmZChkaWIsIG1kX21vZGVsLCBobWVtKTsKKworCQlpZihiUmVzdWx0KSB7CisJCQlCWVRFICpkYXRhID0gTlVMTDsKKwkJCURXT1JEIHNpemVfaW5fYnl0ZXMgPSAwOworCisJCQkvLyBnZXQgYSBwb2ludGVyIHRvIHRoZSBzdHJlYW0gYnVmZmVyCisJCQlGcmVlSW1hZ2VfQWNxdWlyZU1lbW9yeShobWVtLCAmZGF0YSwgJnNpemVfaW5fYnl0ZXMpOworCQkJCisJCQkvLyAocmUtKWFsbG9jYXRlIG91dHB1dCBidWZmZXIKKwkJCUJZVEUgKnBiUHJvZmlsZSA9ICpwcGJQcm9maWxlOworCQkJcGJQcm9maWxlID0gKEJZVEUqKXJlYWxsb2MocGJQcm9maWxlLCBzaXplX2luX2J5dGVzKTsKKwkJCWlmKCFwYlByb2ZpbGUpIHsKKwkJCQl0aHJvdygxKTsKKwkJCX0gZWxzZSB7CisJCQkJLy8gY29weSBJRkQKKwkJCQltZW1jcHkocGJQcm9maWxlLCBkYXRhLCBzaXplX2luX2J5dGVzKTsKKwkJCQkqcHBiUHJvZmlsZSA9IHBiUHJvZmlsZTsKKwkJCQkqdVByb2ZpbGVMZW5ndGggPSBzaXplX2luX2J5dGVzOworCQkJfQorCQl9CisKKwkJLy8gZnJlZSB0aGUgbWVtb3J5IHN0cmVhbQorCQlGcmVlSW1hZ2VfQ2xvc2VNZW1vcnkoaG1lbSk7CisKKwkJcmV0dXJuIGJSZXN1bHQ7CisKKwl9IGNhdGNoKGludCkgeworCQlGcmVlSW1hZ2VfQ2xvc2VNZW1vcnkoaG1lbSk7CisJCXJldHVybiBGQUxTRTsKKwl9Cit9CmRpZmYgLS1naXQgYS9maWxlcy9Tb3VyY2UvTWV0YWRhdGEvRklSYXRpb25hbC5jcHAgYi9maWxlcy9Tb3VyY2UvTWV0YWRhdGEvRklSYXRpb25hbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU2NTFmMQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9NZXRhZGF0YS9GSVJhdGlvbmFsLmNwcApAQCAtMCwwICsxLDE3OCBAQAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gSGVscGVyIGNsYXNzIGZvciByYXRpb25hbCBudW1iZXJzCisvLworLy8gRGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBieQorLy8gLSBIZXJ26SBEcm9sb24gPGRyb2xvbkBpbmZvbmllLmZyPgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZyZWVJbWFnZSAzCisvLworLy8gQ09WRVJFRCBDT0RFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZCisvLyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUworLy8gVEhBVCBUSEUgQ09WRVJFRCBDT0RFIElTIEZSRUUgT0YgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisvLyBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRAorLy8gQ09ERSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVAorLy8gVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GIEFOWSBORUNFU1NBUlkKKy8vIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwKKy8vIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIKKy8vIFRISVMgRElTQ0xBSU1FUi4KKy8vCisvLyBVc2UgYXQgeW91ciBvd24gcmlzayEKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2luY2x1ZGUgIkZyZWVJbWFnZS5oIgorI2luY2x1ZGUgIlV0aWxpdGllcy5oIgorI2luY2x1ZGUgIkZJUmF0aW9uYWwuaCIKKworI2luY2x1ZGUgPGNtYXRoPgorCisvLy8gSW5pdGlhbGl6ZSBhbmQgbm9ybWFsaXplIGEgcmF0aW9uYWwgbnVtYmVyCit2b2lkIEZJUmF0aW9uYWw6OmluaXRpYWxpemUoTE9ORyBuLCBMT05HIGQpIHsKKwlpZihkKSB7CisJCV9udW1lcmF0b3IgPSBuOworCQlfZGVub21pbmF0b3IgPSBkOworCQkvLyBub3JtYWxpemUgcmF0aW9uYWwKKwkJbm9ybWFsaXplKCk7CisJfSBlbHNlIHsKKwkJX251bWVyYXRvciA9IDA7CisJCV9kZW5vbWluYXRvciA9IDA7CisJfQorfQorCisvLy8gRGVmYXVsdCBjb25zdHJ1Y3RvcgorRklSYXRpb25hbDo6RklSYXRpb25hbCgpIHsKKwlfbnVtZXJhdG9yID0gMDsKKwlfZGVub21pbmF0b3IgPSAwOworfQorCisvLy8gQ29uc3RydWN0b3Igd2l0aCBsb25ncworRklSYXRpb25hbDo6RklSYXRpb25hbChMT05HIG4sIExPTkcgZCkgeworCWluaXRpYWxpemUobiwgZCk7Cit9CisKKy8vLyBDb25zdHJ1Y3RvciB3aXRoIEZJVEFHCitGSVJhdGlvbmFsOjpGSVJhdGlvbmFsKGNvbnN0IEZJVEFHICp0YWcpIHsKKwlzd2l0Y2goRnJlZUltYWdlX0dldFRhZ1R5cGUoKEZJVEFHKil0YWcpKSB7CisJCWNhc2UgRklEVF9SQVRJT05BTDoJCS8vIDY0LWJpdCB1bnNpZ25lZCBmcmFjdGlvbiAKKwkJeworCQkJRFdPUkQgKnB2YWx1ZSA9IChEV09SRCopRnJlZUltYWdlX0dldFRhZ1ZhbHVlKChGSVRBRyopdGFnKTsKKwkJCWluaXRpYWxpemUoKExPTkcpcHZhbHVlWzBdLCAoTE9ORylwdmFsdWVbMV0pOworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIEZJRFRfU1JBVElPTkFMOgkvLyA2NC1iaXQgc2lnbmVkIGZyYWN0aW9uIAorCQl7CisJCQlMT05HICpwdmFsdWUgPSAoTE9ORyopRnJlZUltYWdlX0dldFRhZ1ZhbHVlKChGSVRBRyopdGFnKTsKKwkJCWluaXRpYWxpemUoKExPTkcpcHZhbHVlWzBdLCAoTE9ORylwdmFsdWVbMV0pOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK0ZJUmF0aW9uYWw6OkZJUmF0aW9uYWwoZmxvYXQgdmFsdWUpIHsKKwlpZiAodmFsdWUgPT0gKGZsb2F0KSgoTE9ORyl2YWx1ZSkpIHsKKwkgICBfbnVtZXJhdG9yID0gKExPTkcpdmFsdWU7CisJICAgX2Rlbm9taW5hdG9yID0gMUw7CisJfSBlbHNlIHsKKwkJaW50IGssIGNvdW50OworCQlMT05HIG5bNF07CisKKwkJZmxvYXQgeCA9IGZhYnModmFsdWUpOworCQlpbnQgc2lnbiA9ICh2YWx1ZSA+IDApID8gMSA6IC0xOworCisJCS8vIG1ha2UgYSBjb250aW51ZWQtZnJhY3Rpb24gZXhwYW5zaW9uIG9mIHgKKwkJY291bnQgPSAtMTsKKwkJZm9yKGsgPSAwOyBrIDwgNDsgaysrKSB7CisgICAgICAgICAgICAgICAgICBuW2tdID0gKExPTkcpc3RkOjpmbG9vcih4KTsKKyAgICAgICAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICAgICAgICB4IC09IChmbG9hdCluW2tdOworICAgICAgICAgICAgICAgICAgaWYgKHggPT0gMCkgYnJlYWs7CisgICAgICAgICAgICAgICAgICB4ID0gMSAvIHg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGNvbXB1dGUgdGhlIHJhdGlvbmFsCisJCV9udW1lcmF0b3IgPSAxOworCQlfZGVub21pbmF0b3IgPSBuW2NvdW50XTsKKworCQlmb3IoaW50IGkgPSBjb3VudCAtIDE7IGkgPj0gMDsgaS0tKSB7CisJCQlpZihuW2ldID09IDApIGJyZWFrOworCQkJTE9ORyBfbnVtID0gKG5baV0gKiBfbnVtZXJhdG9yICsgX2Rlbm9taW5hdG9yKTsKKwkJCUxPTkcgX2RlbiA9IF9udW1lcmF0b3I7CisJCQlfbnVtZXJhdG9yID0gX251bTsKKwkJCV9kZW5vbWluYXRvciA9IF9kZW47CisJCX0KKwkJX251bWVyYXRvciAqPSBzaWduOworCX0KK30KKworLy8vIENvcHkgY29uc3RydWN0b3IKK0ZJUmF0aW9uYWw6OkZJUmF0aW9uYWwgKGNvbnN0IEZJUmF0aW9uYWwmIHIpIHsKKwlpbml0aWFsaXplKHIuX251bWVyYXRvciwgci5fZGVub21pbmF0b3IpOworfQorCisvLy8gRGVzdHJ1Y3RvcgorRklSYXRpb25hbDo6fkZJUmF0aW9uYWwoKSB7Cit9CisKKy8vLyBBc3NpZ25lbWVudCBvcGVyYXRvcgorRklSYXRpb25hbCYgRklSYXRpb25hbDo6b3BlcmF0b3I9KEZJUmF0aW9uYWwmIHIpIHsKKwlpZih0aGlzICE9ICZyKSB7CisJCWluaXRpYWxpemUoci5fbnVtZXJhdG9yLCByLl9kZW5vbWluYXRvcik7CisJfQorCXJldHVybiAqdGhpczsKK30KKworLy8vIEdldCB0aGUgbnVtZXJhdG9yCitMT05HIEZJUmF0aW9uYWw6OmdldE51bWVyYXRvcigpIHsKKwlyZXR1cm4gX251bWVyYXRvcjsKK30KKworLy8vIEdldCB0aGUgZGVub21pbmF0b3IKK0xPTkcgRklSYXRpb25hbDo6Z2V0RGVub21pbmF0b3IoKSB7CisJcmV0dXJuIF9kZW5vbWluYXRvcjsKK30KKworLy8vIENhbGN1bGF0ZSBHQ0QKK0xPTkcgRklSYXRpb25hbDo6Z2NkKExPTkcgYSwgTE9ORyBiKSB7CisJTE9ORyB0ZW1wOworCXdoaWxlIChiKSB7CQkvLyBXaGlsZSBub24temVybyB2YWx1ZQorCQl0ZW1wID0gYjsJLy8gU2F2ZSBjdXJyZW50IHZhbHVlCisJCWIgPSBhICUgYjsJLy8gQXNzaWduIHJlbWFpbmRlciBvZiBkaXZpc2lvbgorCQlhID0gdGVtcDsJLy8gQ29weSBvbGQgdmFsdWUKKwl9CisJcmV0dXJuIGE7CQkvLyBSZXR1cm4gR0NEIG9mIG51bWJlcnMKK30KKworLy8vIE5vcm1hbGl6ZSBudW1lcmF0b3IgLyBkZW5vbWluYXRvciAKK3ZvaWQgRklSYXRpb25hbDo6bm9ybWFsaXplKCkgeworCWlmIChfbnVtZXJhdG9yICE9IDEgJiYgX2Rlbm9taW5hdG9yICE9IDEpIHsJLy8gSXMgdGhlcmUgc29tZXRoaW5nIHRvIGRvPworCQkgLy8gQ2FsY3VsYXRlIEdDRAorCQlMT05HIGNvbW1vbiA9IGdjZChfbnVtZXJhdG9yLCBfZGVub21pbmF0b3IpOworCQlpZiAoY29tbW9uICE9IDEpIHsgLy8gSWYgR0NEIGlzIG5vdCBvbmUJCQkKKwkJCV9udW1lcmF0b3IgLz0gY29tbW9uOwkvLyBDYWxjdWxhdGUgbmV3IG51bWVyYXRvcgorCQkJX2Rlbm9taW5hdG9yIC89IGNvbW1vbjsJLy8gQ2FsY3VsYXRlIG5ldyBkZW5vbWluYXRvcgorCQl9CisJfQorCWlmKF9kZW5vbWluYXRvciA8IDApIHsJLy8gSWYgc2lnbiBpcyBpbiBkZW5vbWluYXRvcgorCQlfbnVtZXJhdG9yICo9IC0xOwkvLyBNdWx0aXBseSBudW0gYW5kIGRlbiBieSAtMQorCQlfZGVub21pbmF0b3IgKj0gLTE7CS8vIFRvIGtlZXAgc2lnbiBpbiBudW1lcmF0b3IKKwl9Cit9CisKKy8vLyBDaGVja3MgaWYgdGhpcyByYXRpb25hbCBudW1iZXIgaXMgYW4gSW50ZWdlciwgZWl0aGVyIHBvc2l0aXZlIG9yIG5lZ2F0aXZlCitCT09MIEZJUmF0aW9uYWw6OmlzSW50ZWdlcigpIHsKKwlpZihfZGVub21pbmF0b3IgPT0gMSB8fCAoX2Rlbm9taW5hdG9yICE9IDAgJiYgKF9udW1lcmF0b3IgJSBfZGVub21pbmF0b3IgPT0gMCkpIHx8IChfZGVub21pbmF0b3IgPT0gMCAmJiBfbnVtZXJhdG9yID09IDApKQorCQlyZXR1cm4gVFJVRTsKKwlyZXR1cm4gRkFMU0U7Cit9CisKKy8vLyBDb252ZXJ0IGFzICJudW1lcmF0b3IvZGVub21pbmF0b3IiCitzdGQ6OnN0cmluZyBGSVJhdGlvbmFsOjp0b1N0cmluZygpIHsKKwlzdGQ6Om9zdHJpbmdzdHJlYW0gczsKKwlpZihpc0ludGVnZXIoKSkgeworCQlzIDw8IGludFZhbHVlKCk7CisJfSBlbHNlIHsKKwkJcyA8PCBfbnVtZXJhdG9yIDw8ICIvIiA8PCBfZGVub21pbmF0b3I7CisJfQorCXJldHVybiBzLnN0cigpOworfQorCisKZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9NZXRhZGF0YS9GSVJhdGlvbmFsLmggYi9maWxlcy9Tb3VyY2UvTWV0YWRhdGEvRklSYXRpb25hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkM2VlMTMKLS0tIC9kZXYvbnVsbAorKysgYi9maWxlcy9Tb3VyY2UvTWV0YWRhdGEvRklSYXRpb25hbC5oCkBAIC0wLDAgKzEsMTA4IEBACisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBIZWxwZXIgY2xhc3MgZm9yIHJhdGlvbmFsIG51bWJlcnMKKy8vCisvLyBEZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIGJ5CisvLyAtIEhlcnbpIERyb2xvbiA8ZHJvbG9uQGluZm9uaWUuZnI+CisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRnJlZUltYWdlIDMKKy8vCisvLyBDT1ZFUkVEIENPREUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkKKy8vIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTCisvLyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy8vIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVECisvLyBDT0RFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UCisvLyBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWQorLy8gU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTAorLy8gUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUgorLy8gVEhJUyBESVNDTEFJTUVSLgorLy8KKy8vIFVzZSBhdCB5b3VyIG93biByaXNrIQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaWZuZGVmIEZJUkFUSU9OQUxfSAorI2RlZmluZSBGSVJBVElPTkFMX0gKKworLyoqCitIZWxwZXIgY2xhc3MgdG8gZGVhbCB3aXRoIHJhdGlvbmFsIG51bWJlcnMuIAorTkI6IExPTkcgZGF0YSB0eXBlIGlzIGFzc3VtZWQgdG8gYmUgYSBzaWduZWQgMzItYml0IG51bWJlci4gCisqLworY2xhc3MgRklSYXRpb25hbCB7Citwcml2YXRlOgorCS8vLyBudW1lcmF0b3IKKwlMT05HIF9udW1lcmF0b3I7CisJLy8vIGRlbm9taW5hdG9yCisJTE9ORyBfZGVub21pbmF0b3I7CisKK3B1YmxpYzoKKwkvLy8gRGVmYXVsdCBjb25zdHJ1Y3RvcgorCUZJUmF0aW9uYWwoKTsKKworCS8vLyBDb25zdHJ1Y3RvciB3aXRoIGxvbmdzCisJRklSYXRpb25hbChMT05HIG4sIExPTkcgZCA9IDEpOworCisJLy8vIENvbnN0cnVjdG9yIHdpdGggRklUQUcKKwlGSVJhdGlvbmFsKGNvbnN0IEZJVEFHICp0YWcpOworCisJLy8vIENvbnN0cnVjdG9yIHdpdGggYSBmbG9hdAorCUZJUmF0aW9uYWwoZmxvYXQgdmFsdWUpOworCisJLy8vIENvcHkgY29uc3RydWN0b3IKKwlGSVJhdGlvbmFsIChjb25zdCBGSVJhdGlvbmFsJiByKTsKKworCS8vLyBEZXN0cnVjdG9yCisJfkZJUmF0aW9uYWwoKTsKKworCS8vLyBBc3NpZ25lbWVudCBvcGVyYXRvcgorCUZJUmF0aW9uYWwmIG9wZXJhdG9yPShGSVJhdGlvbmFsJiByKTsKKworCS8vLyBHZXQgdGhlIG51bWVyYXRvcgorCUxPTkcgZ2V0TnVtZXJhdG9yKCk7CisKKwkvLy8gR2V0IHRoZSBkZW5vbWluYXRvcgorCUxPTkcgZ2V0RGVub21pbmF0b3IoKTsKKworCS8vLyBDb252ZXJ0cyByYXRpb25hbCB2YWx1ZSBieSB0cnVuY2F0aW5nIHRvd2FyZHMgemVybworCUxPTkcgdHJ1bmNhdGUoKSB7CisJCS8vIFJldHVybiB0cnVuY2F0ZWQgcmF0aW9uYWwKKwkJcmV0dXJuIF9kZW5vbWluYXRvciA/IChMT05HKSAoX251bWVyYXRvciAvIF9kZW5vbWluYXRvcikgOiAwOworCX0KKworCS8qKkBuYW1lIEltcGxpY2l0IGNvbnZlcnNpb25zICovCisJLy9AewkKKwlzaG9ydCBzaG9ydFZhbHVlKCkgeworCQlyZXR1cm4gKHNob3J0KXRydW5jYXRlKCk7CisJfQorCWludCBpbnRWYWx1ZSgpIHsKKwkJcmV0dXJuIChpbnQpdHJ1bmNhdGUoKTsKKwl9CisJTE9ORyBsb25nVmFsdWUoKSB7CisJCXJldHVybiAoTE9ORyl0cnVuY2F0ZSgpOworCX0KKwlmbG9hdCBmbG9hdFZhbHVlKCkgeworCQlyZXR1cm4gX2Rlbm9taW5hdG9yID8gKChmbG9hdClfbnVtZXJhdG9yKS8oKGZsb2F0KV9kZW5vbWluYXRvcikgOiAwOworCX0KKwlkb3VibGUgZG91YmxlVmFsdWUoKSB7CisJCXJldHVybiBfZGVub21pbmF0b3IgPyAoKGRvdWJsZSlfbnVtZXJhdG9yKS8oKGRvdWJsZSlfZGVub21pbmF0b3IpIDogMDsKKwl9CisJLy9AfQorCisJLy8vIENoZWNrcyBpZiB0aGlzIHJhdGlvbmFsIG51bWJlciBpcyBhbiBpbnRlZ2VyLCBlaXRoZXIgcG9zaXRpdmUgb3IgbmVnYXRpdmUKKwlCT09MIGlzSW50ZWdlcigpOworCisJLy8vIENvbnZlcnQgYXMgIm51bWVyYXRvci9kZW5vbWluYXRvciIKKwlzdGQ6OnN0cmluZyB0b1N0cmluZygpOworCitwcml2YXRlOgorCS8vLyBJbml0aWFsaXplIGFuZCBub3JtYWxpemUgYSByYXRpb25hbCBudW1iZXIKKwl2b2lkIGluaXRpYWxpemUoTE9ORyBuLCBMT05HIGQpOworCisJLy8vIENhbGN1bGF0ZSBHQ0QKKwlMT05HIGdjZChMT05HIGEsIExPTkcgYik7CisJCisJLy8vIE5vcm1hbGl6ZSBudW1lcmF0b3IgLyBkZW5vbWluYXRvciAKKwl2b2lkIG5vcm1hbGl6ZSgpOworCit9OworCisjZW5kaWYgLy8gRklSQVRJT05BTF9ICisKZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9NZXRhZGF0YS9GcmVlSW1hZ2VUYWcuY3BwIGIvZmlsZXMvU291cmNlL01ldGFkYXRhL0ZyZWVJbWFnZVRhZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MxMmE1ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9NZXRhZGF0YS9GcmVlSW1hZ2VUYWcuY3BwCkBAIC0wLDAgKzEsMzUzIEBACisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBUYWcgbWFuaXB1bGF0aW9uIGZ1bmN0aW9ucworLy8KKy8vIERlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gYnkKKy8vIC0gSGVydukgRHJvbG9uIDxkcm9sb25AaW5mb25pZS5mcj4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBGcmVlSW1hZ2UgMworLy8KKy8vIENPVkVSRUQgQ09ERSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWQorLy8gT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMKKy8vIFRIQVQgVEhFIENPVkVSRUQgQ09ERSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLy8gT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQKKy8vIENPREUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkgQ09WRVJFRCBDT0RFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QKKy8vIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZCisvLyBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMCisvLyBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GIEFOWSBDT1ZFUkVEIENPREUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSCisvLyBUSElTIERJU0NMQUlNRVIuCisvLworLy8gVXNlIGF0IHlvdXIgb3duIHJpc2shCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpZmRlZiBfTVNDX1ZFUiAKKyNwcmFnbWEgd2FybmluZyAoZGlzYWJsZSA6IDQ3ODYpIC8vIGlkZW50aWZpZXIgd2FzIHRydW5jYXRlZCB0byAnbnVtYmVyJyBjaGFyYWN0ZXJzCisjZW5kaWYKKworI2luY2x1ZGUgIkZyZWVJbWFnZS5oIgorI2luY2x1ZGUgIlV0aWxpdGllcy5oIgorI2luY2x1ZGUgIkZyZWVJbWFnZVRhZy5oIgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRklUQUcgaGVhZGVyIGRlZmluaXRpb24KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0ZJX1NUUlVDVCAoRklUQUdIRUFERVIpIHsgCisJY2hhciAqa2V5OwkJCS8vIHRhZyBmaWVsZCBuYW1lCisJY2hhciAqZGVzY3JpcHRpb247CS8vIHRhZyBkZXNjcmlwdGlvbgorCVdPUkQgaWQ7CQkJLy8gdGFnIElECisJV09SRCB0eXBlOwkJCS8vIHRhZyBkYXRhIHR5cGUgKHNlZSBGUkVFX0lNQUdFX01EVFlQRSkKKwlEV09SRCBjb3VudDsJCS8vIG51bWJlciBvZiBjb21wb25lbnRzIChpbiAndGFnIGRhdGEgdHlwZXMnIHVuaXRzKQorCURXT1JEIGxlbmd0aDsJCS8vIHZhbHVlIGxlbmd0aCBpbiBieXRlcworCXZvaWQgKnZhbHVlOwkJLy8gdGFnIHZhbHVlCit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRklUQUcgY3JlYXRpb24gLyBkZXN0cnVjdGlvbgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRklUQUcgKiBETExfQ0FMTENPTlYgCitGcmVlSW1hZ2VfQ3JlYXRlVGFnKCkgeworCUZJVEFHICp0YWcgPSAoRklUQUcgKiltYWxsb2Moc2l6ZW9mKEZJVEFHKSk7CisKKwlpZiAodGFnICE9IE5VTEwpIHsKKwkJdW5zaWduZWQgdGFnX3NpemUgPSBzaXplb2YoRklUQUdIRUFERVIpOyAKKwkJdGFnLT5kYXRhID0gKEJZVEUgKiltYWxsb2ModGFnX3NpemUgKiBzaXplb2YoQllURSkpOworCQlpZiAodGFnLT5kYXRhICE9IE5VTEwpIHsKKwkJCW1lbXNldCh0YWctPmRhdGEsIDAsIHRhZ19zaXplKTsKKwkJCXJldHVybiB0YWc7CisJCX0KKwkJZnJlZSh0YWcpOworCX0KKworCXJldHVybiBOVUxMOworfQorCit2b2lkIERMTF9DQUxMQ09OViAKK0ZyZWVJbWFnZV9EZWxldGVUYWcoRklUQUcgKnRhZykgeworCWlmIChOVUxMICE9IHRhZykgewkKKwkJaWYgKE5VTEwgIT0gdGFnLT5kYXRhKSB7CisJCQlGSVRBR0hFQURFUiAqdGFnX2hlYWRlciA9IChGSVRBR0hFQURFUiAqKXRhZy0+ZGF0YTsKKwkJCS8vIGRlbGV0ZSB0YWcgbWVtYmVycworCQkJZnJlZSh0YWdfaGVhZGVyLT5rZXkpOyAKKwkJCWZyZWUodGFnX2hlYWRlci0+ZGVzY3JpcHRpb24pOyAKKwkJCWZyZWUodGFnX2hlYWRlci0+dmFsdWUpOworCQkJLy8gZGVsZXRlIHRoZSB0YWcKKwkJCWZyZWUodGFnLT5kYXRhKTsKKwkJfQorCQkvLyBhbmQgdGhlIHdyYXBwZXIKKwkJZnJlZSh0YWcpOworCX0KK30KKworRklUQUcgKiBETExfQ0FMTENPTlYgCitGcmVlSW1hZ2VfQ2xvbmVUYWcoRklUQUcgKnRhZykgeworCWlmKCF0YWcpIHJldHVybiBOVUxMOworCisJLy8gYWxsb2NhdGUgYSBuZXcgdGFnCisJRklUQUcgKmNsb25lID0gRnJlZUltYWdlX0NyZWF0ZVRhZygpOworCWlmKCFjbG9uZSkgcmV0dXJuIE5VTEw7CisKKwl0cnkgeworCQkvLyBjb3B5IHRoZSB0YWcKKwkJRklUQUdIRUFERVIgKnNyY190YWcgPSAoRklUQUdIRUFERVIgKil0YWctPmRhdGE7CisJCUZJVEFHSEVBREVSICpkc3RfdGFnID0gKEZJVEFHSEVBREVSICopY2xvbmUtPmRhdGE7CisKKwkJLy8gdGFnIElECisJCWRzdF90YWctPmlkID0gc3JjX3RhZy0+aWQ7CisJCS8vIHRhZyBrZXkKKwkJaWYoc3JjX3RhZy0+a2V5KSB7CisJCQlkc3RfdGFnLT5rZXkgPSAoY2hhciopbWFsbG9jKChzdHJsZW4oc3JjX3RhZy0+a2V5KSArIDEpICogc2l6ZW9mKGNoYXIpKTsKKwkJCWlmKCFkc3RfdGFnLT5rZXkpIHsKKwkJCQl0aHJvdyBGSV9NU0dfRVJST1JfTUVNT1JZOworCQkJfQorCQkJc3RyY3B5KGRzdF90YWctPmtleSwgc3JjX3RhZy0+a2V5KTsKKwkJfQorCQkvLyB0YWcgZGVzY3JpcHRpb24KKwkJaWYoc3JjX3RhZy0+ZGVzY3JpcHRpb24pIHsKKwkJCWRzdF90YWctPmRlc2NyaXB0aW9uID0gKGNoYXIqKW1hbGxvYygoc3RybGVuKHNyY190YWctPmRlc2NyaXB0aW9uKSArIDEpICogc2l6ZW9mKGNoYXIpKTsKKwkJCWlmKCFkc3RfdGFnLT5kZXNjcmlwdGlvbikgeworCQkJCXRocm93IEZJX01TR19FUlJPUl9NRU1PUlk7CisJCQl9CisJCQlzdHJjcHkoZHN0X3RhZy0+ZGVzY3JpcHRpb24sIHNyY190YWctPmRlc2NyaXB0aW9uKTsKKwkJfQorCQkvLyB0YWcgZGF0YSB0eXBlCisJCWRzdF90YWctPnR5cGUgPSBzcmNfdGFnLT50eXBlOworCQkvLyB0YWcgY291bnQKKwkJZHN0X3RhZy0+Y291bnQgPSBzcmNfdGFnLT5jb3VudDsKKwkJLy8gdGFnIGxlbmd0aAorCQlkc3RfdGFnLT5sZW5ndGggPSBzcmNfdGFnLT5sZW5ndGg7CisJCS8vIHRhZyB2YWx1ZQorCQlzd2l0Y2goZHN0X3RhZy0+dHlwZSkgeworCQkJY2FzZSBGSURUX0FTQ0lJOgorCQkJCWRzdF90YWctPnZhbHVlID0gKEJZVEUqKW1hbGxvYygoc3JjX3RhZy0+bGVuZ3RoICsgMSkgKiBzaXplb2YoQllURSkpOworCQkJCWlmKCFkc3RfdGFnLT52YWx1ZSkgeworCQkJCQl0aHJvdyBGSV9NU0dfRVJST1JfTUVNT1JZOworCQkJCX0KKwkJCQltZW1jcHkoZHN0X3RhZy0+dmFsdWUsIHNyY190YWctPnZhbHVlLCBzcmNfdGFnLT5sZW5ndGgpOworCQkJCSgoQllURSopZHN0X3RhZy0+dmFsdWUpW3NyY190YWctPmxlbmd0aF0gPSAwOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlkc3RfdGFnLT52YWx1ZSA9IChCWVRFKiltYWxsb2Moc3JjX3RhZy0+bGVuZ3RoICogc2l6ZW9mKEJZVEUpKTsKKwkJCQlpZighZHN0X3RhZy0+dmFsdWUpIHsKKwkJCQkJdGhyb3cgRklfTVNHX0VSUk9SX01FTU9SWTsKKwkJCQl9CisJCQkJbWVtY3B5KGRzdF90YWctPnZhbHVlLCBzcmNfdGFnLT52YWx1ZSwgc3JjX3RhZy0+bGVuZ3RoKTsKKwkJCQlicmVhazsKKwkJfQorCisJCXJldHVybiBjbG9uZTsKKworCX0gY2F0Y2goY29uc3QgY2hhciAqbWVzc2FnZSkgeworCQlGcmVlSW1hZ2VfRGVsZXRlVGFnKGNsb25lKTsKKwkJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKEZJRl9VTktOT1dOLCBtZXNzYWdlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRklUQUcgZ2V0dGVycyAvIHNldHRlcnMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYgCitGcmVlSW1hZ2VfR2V0VGFnS2V5KEZJVEFHICp0YWcpIHsKKwlyZXR1cm4gdGFnID8gKChGSVRBR0hFQURFUiAqKXRhZy0+ZGF0YSktPmtleSA6IDA7Cit9CisKK2NvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYgCitGcmVlSW1hZ2VfR2V0VGFnRGVzY3JpcHRpb24oRklUQUcgKnRhZykgeworCXJldHVybiB0YWcgPyAoKEZJVEFHSEVBREVSICopdGFnLT5kYXRhKS0+ZGVzY3JpcHRpb24gOiAwOworfQorCitXT1JEIERMTF9DQUxMQ09OViAKK0ZyZWVJbWFnZV9HZXRUYWdJRChGSVRBRyAqdGFnKSB7CisJcmV0dXJuIHRhZyA/ICgoRklUQUdIRUFERVIgKil0YWctPmRhdGEpLT5pZCA6IDA7Cit9CisKK0ZSRUVfSU1BR0VfTURUWVBFIERMTF9DQUxMQ09OViAKK0ZyZWVJbWFnZV9HZXRUYWdUeXBlKEZJVEFHICp0YWcpIHsKKwlyZXR1cm4gdGFnID8gKEZSRUVfSU1BR0VfTURUWVBFKSgoKEZJVEFHSEVBREVSICopdGFnLT5kYXRhKS0+dHlwZSkgOiBGSURUX05PVFlQRTsKK30KKworRFdPUkQgRExMX0NBTExDT05WIAorRnJlZUltYWdlX0dldFRhZ0NvdW50KEZJVEFHICp0YWcpIHsKKwlyZXR1cm4gdGFnID8gKChGSVRBR0hFQURFUiAqKXRhZy0+ZGF0YSktPmNvdW50IDogMDsKK30KKworRFdPUkQgRExMX0NBTExDT05WIAorRnJlZUltYWdlX0dldFRhZ0xlbmd0aChGSVRBRyAqdGFnKSB7CisJcmV0dXJuIHRhZyA/ICgoRklUQUdIRUFERVIgKil0YWctPmRhdGEpLT5sZW5ndGggOiAwOworfQorCitjb25zdCB2b2lkICpETExfQ0FMTENPTlYgCitGcmVlSW1hZ2VfR2V0VGFnVmFsdWUoRklUQUcgKnRhZykgeworCXJldHVybiB0YWcgPyAoKEZJVEFHSEVBREVSICopdGFnLT5kYXRhKS0+dmFsdWUgOiAwOworfQorCitCT09MIERMTF9DQUxMQ09OViAKK0ZyZWVJbWFnZV9TZXRUYWdLZXkoRklUQUcgKnRhZywgY29uc3QgY2hhciAqa2V5KSB7CisJaWYodGFnICYmIGtleSkgeworCQlGSVRBR0hFQURFUiAqdGFnX2hlYWRlciA9IChGSVRBR0hFQURFUiAqKXRhZy0+ZGF0YTsKKwkJaWYodGFnX2hlYWRlci0+a2V5KSBmcmVlKHRhZ19oZWFkZXItPmtleSk7CisJCXRhZ19oZWFkZXItPmtleSA9IChjaGFyKiltYWxsb2Moc3RybGVuKGtleSkgKyAxKTsKKwkJc3RyY3B5KHRhZ19oZWFkZXItPmtleSwga2V5KTsKKwkJcmV0dXJuIFRSVUU7CisJfQorCXJldHVybiBGQUxTRTsKK30KKworQk9PTCBETExfQ0FMTENPTlYgCitGcmVlSW1hZ2VfU2V0VGFnRGVzY3JpcHRpb24oRklUQUcgKnRhZywgY29uc3QgY2hhciAqZGVzY3JpcHRpb24pIHsKKwlpZih0YWcgJiYgZGVzY3JpcHRpb24pIHsKKwkJRklUQUdIRUFERVIgKnRhZ19oZWFkZXIgPSAoRklUQUdIRUFERVIgKil0YWctPmRhdGE7CisJCWlmKHRhZ19oZWFkZXItPmRlc2NyaXB0aW9uKSBmcmVlKHRhZ19oZWFkZXItPmRlc2NyaXB0aW9uKTsKKwkJdGFnX2hlYWRlci0+ZGVzY3JpcHRpb24gPSAoY2hhciopbWFsbG9jKHN0cmxlbihkZXNjcmlwdGlvbikgKyAxKTsKKwkJc3RyY3B5KHRhZ19oZWFkZXItPmRlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbik7CisJCXJldHVybiBUUlVFOworCX0KKwlyZXR1cm4gRkFMU0U7Cit9CisKK0JPT0wgRExMX0NBTExDT05WIAorRnJlZUltYWdlX1NldFRhZ0lEKEZJVEFHICp0YWcsIFdPUkQgaWQpIHsKKwlpZih0YWcpIHsKKwkJRklUQUdIRUFERVIgKnRhZ19oZWFkZXIgPSAoRklUQUdIRUFERVIgKil0YWctPmRhdGE7CisJCXRhZ19oZWFkZXItPmlkID0gaWQ7CisJCXJldHVybiBUUlVFOworCX0KKwlyZXR1cm4gRkFMU0U7Cit9CisKK0JPT0wgRExMX0NBTExDT05WIAorRnJlZUltYWdlX1NldFRhZ1R5cGUoRklUQUcgKnRhZywgRlJFRV9JTUFHRV9NRFRZUEUgdHlwZSkgeworCWlmKHRhZykgeworCQlGSVRBR0hFQURFUiAqdGFnX2hlYWRlciA9IChGSVRBR0hFQURFUiAqKXRhZy0+ZGF0YTsKKwkJdGFnX2hlYWRlci0+dHlwZSA9IChXT1JEKXR5cGU7CisJCXJldHVybiBUUlVFOworCX0KKwlyZXR1cm4gRkFMU0U7Cit9CisKK0JPT0wgRExMX0NBTExDT05WIAorRnJlZUltYWdlX1NldFRhZ0NvdW50KEZJVEFHICp0YWcsIERXT1JEIGNvdW50KSB7CisJaWYodGFnKSB7CisJCUZJVEFHSEVBREVSICp0YWdfaGVhZGVyID0gKEZJVEFHSEVBREVSICopdGFnLT5kYXRhOworCQl0YWdfaGVhZGVyLT5jb3VudCA9IGNvdW50OworCQlyZXR1cm4gVFJVRTsKKwl9CisJcmV0dXJuIEZBTFNFOworfQorCitCT09MIERMTF9DQUxMQ09OViAKK0ZyZWVJbWFnZV9TZXRUYWdMZW5ndGgoRklUQUcgKnRhZywgRFdPUkQgbGVuZ3RoKSB7CisJaWYodGFnKSB7CisJCUZJVEFHSEVBREVSICp0YWdfaGVhZGVyID0gKEZJVEFHSEVBREVSICopdGFnLT5kYXRhOworCQl0YWdfaGVhZGVyLT5sZW5ndGggPSBsZW5ndGg7CisJCXJldHVybiBUUlVFOworCX0KKwlyZXR1cm4gRkFMU0U7Cit9CisKK0JPT0wgRExMX0NBTExDT05WIAorRnJlZUltYWdlX1NldFRhZ1ZhbHVlKEZJVEFHICp0YWcsIGNvbnN0IHZvaWQgKnZhbHVlKSB7CisJaWYodGFnICYmIHZhbHVlKSB7CisJCUZJVEFHSEVBREVSICp0YWdfaGVhZGVyID0gKEZJVEFHSEVBREVSICopdGFnLT5kYXRhOworCQkvLyBmaXJzdCwgY2hlY2sgdGhlIHRhZworCQlpZih0YWdfaGVhZGVyLT5jb3VudCAqIEZyZWVJbWFnZV9UYWdEYXRhV2lkdGgoKEZSRUVfSU1BR0VfTURUWVBFKXRhZ19oZWFkZXItPnR5cGUpICE9IHRhZ19oZWFkZXItPmxlbmd0aCkgeworCQkJLy8gaW52YWxpZCBkYXRhIGNvdW50ID8KKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCisJCWlmKHRhZ19oZWFkZXItPnZhbHVlKSB7CisJCQlmcmVlKHRhZ19oZWFkZXItPnZhbHVlKTsKKwkJfQorCisJCXN3aXRjaCh0YWdfaGVhZGVyLT50eXBlKSB7CisJCQljYXNlIEZJRFRfQVNDSUk6CisJCQl7CisJCQkJdGFnX2hlYWRlci0+dmFsdWUgPSAoY2hhciopbWFsbG9jKCh0YWdfaGVhZGVyLT5sZW5ndGggKyAxKSAqIHNpemVvZihjaGFyKSk7CisJCQkJaWYoIXRhZ19oZWFkZXItPnZhbHVlKSB7CisJCQkJCXJldHVybiBGQUxTRTsKKwkJCQl9CisJCQkJY2hhciAqc3JjX2RhdGEgPSAoY2hhciopdmFsdWU7CisJCQkJY2hhciAqZHN0X2RhdGEgPSAoY2hhciopdGFnX2hlYWRlci0+dmFsdWU7CisJCQkJZm9yKERXT1JEIGkgPSAwOyBpIDwgdGFnX2hlYWRlci0+bGVuZ3RoOyBpKyspIHsKKwkJCQkJZHN0X2RhdGFbaV0gPSBzcmNfZGF0YVtpXTsKKwkJCQl9CisJCQkJZHN0X2RhdGFbdGFnX2hlYWRlci0+bGVuZ3RoXSA9ICdcMCc7CisJCQl9CisJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQl0YWdfaGVhZGVyLT52YWx1ZSA9IG1hbGxvYyh0YWdfaGVhZGVyLT5sZW5ndGggKiBzaXplb2YoQllURSkpOworCQkJCWlmKCF0YWdfaGVhZGVyLT52YWx1ZSkgeworCQkJCQlyZXR1cm4gRkFMU0U7CisJCQkJfQorCQkJCW1lbWNweSh0YWdfaGVhZGVyLT52YWx1ZSwgdmFsdWUsIHRhZ19oZWFkZXItPmxlbmd0aCk7CisJCQkJYnJlYWs7CisJCX0KKwkJcmV0dXJuIFRSVUU7CisJfQorCXJldHVybiBGQUxTRTsKK30KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRklUQUcgaW50ZXJuYWwgaGVscGVyIGZ1bmN0aW9ucworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordW5zaWduZWQgCitGcmVlSW1hZ2VfVGFnRGF0YVdpZHRoKEZSRUVfSU1BR0VfTURUWVBFIHR5cGUpIHsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgZm9ybWF0X2J5dGVzW10gPSB7IAorCQkwLCAvLyBGSURUX05PVFlQRQk9IDAsCS8vIHBsYWNlaG9sZGVyIAorCQkxLCAvLyBGSURUX0JZVEUJCT0gMSwJLy8gOC1iaXQgdW5zaWduZWQgaW50ZWdlciAKKwkJMSwgLy8gRklEVF9BU0NJSQk9IDIsCS8vIDgtYml0IGJ5dGVzIHcvIGxhc3QgYnl0ZSBudWxsIAorCQkyLCAvLyBGSURUX1NIT1JUCT0gMywJLy8gMTYtYml0IHVuc2lnbmVkIGludGVnZXIgCisJCTQsIC8vIEZJRFRfTE9ORwkJPSA0LAkvLyAzMi1iaXQgdW5zaWduZWQgaW50ZWdlciAKKwkJOCwgLy8gRklEVF9SQVRJT05BTAk9IDUsCS8vIDY0LWJpdCB1bnNpZ25lZCBmcmFjdGlvbiAKKwkJMSwgLy8gRklEVF9TQllURQk9IDYsCS8vIDgtYml0IHNpZ25lZCBpbnRlZ2VyIAorCQkxLCAvLyBGSURUX1VOREVGSU5FRD0gNywJLy8gOC1iaXQgdW50eXBlZCBkYXRhIAorCQkyLCAvLyBGSURUX1NTSE9SVAk9IDgsCS8vIDE2LWJpdCBzaWduZWQgaW50ZWdlciAKKwkJNCwgLy8gRklEVF9TTE9ORwk9IDksCS8vIDMyLWJpdCBzaWduZWQgaW50ZWdlciAKKwkJOCwgLy8gRklEVF9TUkFUSU9OQUw9IDEwLAkvLyA2NC1iaXQgc2lnbmVkIGZyYWN0aW9uIAorCQk0LCAvLyBGSURUX0ZMT0FUCT0gMTEsCS8vIDMyLWJpdCBJRUVFIGZsb2F0aW5nIHBvaW50IAorCQk4LCAvLyBGSURUX0RPVUJMRQk9IDEyLAkvLyA2NC1iaXQgSUVFRSBmbG9hdGluZyBwb2ludCAKKwkJNCwgLy8gRklEVF9JRkQJCT0gMTMsCS8vIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyIChvZmZzZXQpIAorCQk0LCAvLyBGSURUX1BBTEVUVEUJPSAxNAkvLyAzMi1iaXQgUkdCUVVBRCAKKwkJMCwgLy8gcGxhY2Vob2xkZXIgKDE1KQorCQk4LCAvLyBGSURUX0xPTkc4CT0gMTYsCS8vIDY0LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIAorCQk4LCAvLyBGSURUX1NMT05HOAk9IDE3LAkvLyA2NC1iaXQgc2lnbmVkIGludGVnZXIKKwkJOCAgLy8gRklEVF9JRkQ4CQk9IDE4CS8vIDY0LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIChvZmZzZXQpCisJfTsKKworCSAgcmV0dXJuICh0eXBlIDwgKHNpemVvZihmb3JtYXRfYnl0ZXMpL3NpemVvZihmb3JtYXRfYnl0ZXNbMF0pKSkgPworCQkgIGZvcm1hdF9ieXRlc1t0eXBlXSA6IDA7Cit9CisKK3NpemVfdCAKK0ZyZWVJbWFnZV9HZXRUYWdNZW1vcnlTaXplKEZJVEFHICp0YWcpIHsKKwlzaXplX3Qgc2l6ZSA9IDA7CisJaWYgKHRhZykgeworCQlGSVRBR0hFQURFUiAqdGFnX2hlYWRlciA9IChGSVRBR0hFQURFUiAqKXRhZy0+ZGF0YTsKKwkJc2l6ZSArPSBzaXplb2YoRklUQUcpOworCQlzaXplICs9IHNpemVvZihGSVRBR0hFQURFUik7CisJCWlmICh0YWdfaGVhZGVyLT5rZXkpIHsKKwkJCXNpemUgKz0gc3RybGVuKHRhZ19oZWFkZXItPmtleSkgKyAxOworCQl9CisJCWlmICh0YWdfaGVhZGVyLT5kZXNjcmlwdGlvbikgeworCQkJc2l6ZSArPSBzdHJsZW4odGFnX2hlYWRlci0+ZGVzY3JpcHRpb24pICsgMTsKKwkJfQorCQlpZiAodGFnX2hlYWRlci0+dmFsdWUpIHsKKwkJCXN3aXRjaCAodGFnX2hlYWRlci0+dHlwZSkgeworCQkJCWNhc2UgRklEVF9BU0NJSToKKwkJCQkJLy8gZm9yIEFTQ0lJIHN0cmluZ3MsIHRoZSB2YWx1ZSBvZiB0aGUgY291bnQgcGFydCBvZiBhbiBBU0NJSSB0YWcgZW50cnkgaW5jbHVkZXMgdGhlIE5VTEwuCisJCQkJCS8vIGhvd2V2ZXIsIEZyZWVJbWFnZSBhZGRzIGFub3RoZXIgJ1wwJyB0byBiZSBzdXJlIHRoYXQgdGhpcyBsYXN0IGNoYXJhY3RlciBpcyBwcmVzZW50LgorCQkJCQlzaXplICs9IHRhZ19oZWFkZXItPmxlbmd0aCArIDE7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCXNpemUgKz0gdGFnX2hlYWRlci0+bGVuZ3RoOworCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gc2l6ZTsKK30KZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9NZXRhZGF0YS9GcmVlSW1hZ2VUYWcuaCBiL2ZpbGVzL1NvdXJjZS9NZXRhZGF0YS9GcmVlSW1hZ2VUYWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWI4YmM4Ci0tLSAvZGV2L251bGwKKysrIGIvZmlsZXMvU291cmNlL01ldGFkYXRhL0ZyZWVJbWFnZVRhZy5oCkBAIC0wLDAgKzEsNTAwIEBACisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBUYWcgbWFuaXB1bGF0aW9uIGZ1bmN0aW9ucworLy8KKy8vIERlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gYnkKKy8vIC0gSGVydukgRHJvbG9uIDxkcm9sb25AaW5mb25pZS5mcj4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBGcmVlSW1hZ2UgMworLy8KKy8vIENPVkVSRUQgQ09ERSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWQorLy8gT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMKKy8vIFRIQVQgVEhFIENPVkVSRUQgQ09ERSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLy8gT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQKKy8vIENPREUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkgQ09WRVJFRCBDT0RFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QKKy8vIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZCisvLyBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMCisvLyBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GIEFOWSBDT1ZFUkVEIENPREUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSCisvLyBUSElTIERJU0NMQUlNRVIuCisvLworLy8gVXNlIGF0IHlvdXIgb3duIHJpc2shCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpZm5kZWYgRlJFRUlNQUdFVEFHX0gKKyNkZWZpbmUgRlJFRUlNQUdFVEFHX0gKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRXhpZiBKUEVHIHRhZ3MKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVElGRiBSZXYuIDYuMCBBdHRyaWJ1dGUgSW5mb3JtYXRpb24gVXNlZCBpbiBFeGlmCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFRhZ3MgcmVsYXRpbmcgdG8gaW1hZ2UgZGF0YSBzdHJ1Y3R1cmUKKworI2RlZmluZSBUQUdfSU1BR0VfV0lEVEgJCQkJCTB4MDEwMAorI2RlZmluZSBUQUdfSU1BR0VfSEVJR0hUCQkJCTB4MDEwMQorI2RlZmluZSBUQUdfQklUU19QRVJfU0FNUExFCQkJCTB4MDEwMgorI2RlZmluZSBUQUdfQ09NUFJFU1NJT04JCQkJCTB4MDEwMworI2RlZmluZSBUQUdfUEhPVE9NRVRSSUNfSU5URVJQUkVUQVRJT04JMHgwMTA2CisjZGVmaW5lIFRBR19PUklFTlRBVElPTgkJCQkJMHgwMTEyCisjZGVmaW5lIFRBR19TQU1QTEVTX1BFUl9QSVhFTAkJCTB4MDExNQorI2RlZmluZSBUQUdfUExBTkFSX0NPTkZJR1VSQVRJT04JCTB4MDExQworI2RlZmluZSBUQUdfWUNCQ1JfU1VCU0FNUExJTkcJCQkweDAyMTIKKyNkZWZpbmUgVEFHX1lDQkNSX1BPU0lUSU9OSU5HCQkJMHgwMjEzCisjZGVmaW5lIFRBR19YX1JFU09MVVRJT04JCQkJMHgwMTFBCisjZGVmaW5lIFRBR19ZX1JFU09MVVRJT04JCQkJMHgwMTFCCisjZGVmaW5lIFRBR19SRVNPTFVUSU9OX1VOSVQJCQkJMHgwMTI4CisKKy8vIExpYlRJRiBjb21wcmVzc2lvbiBtb2RlcworCisjZGVmaW5lCSAgICBUQUdfQ09NUFJFU1NJT05fTk9ORQkJMQkvKiBkdW1wIG1vZGUgKi8KKyNkZWZpbmUJICAgIFRBR19DT01QUkVTU0lPTl9DQ0lUVFJMRQkyCS8qIENDSVRUIG1vZGlmaWVkIEh1ZmZtYW4gUkxFICovCisjZGVmaW5lCSAgICBUQUdfQ09NUFJFU1NJT05fQ0NJVFRGQVgzCTMJLyogQ0NJVFQgR3JvdXAgMyBmYXggZW5jb2RpbmcgKi8KKyNkZWZpbmUgICAgIFRBR19DT01QUkVTU0lPTl9DQ0lUVF9UNCAgICAgICAgMyAgICAgICAvKiBDQ0lUVCBULjQgKFRJRkYgNiBuYW1lKSAqLworI2RlZmluZQkgICAgVEFHX0NPTVBSRVNTSU9OX0NDSVRURkFYNAk0CS8qIENDSVRUIEdyb3VwIDQgZmF4IGVuY29kaW5nICovCisjZGVmaW5lICAgICBUQUdfQ09NUFJFU1NJT05fQ0NJVFRfVDYgICAgICAgIDQgICAgICAgLyogQ0NJVFQgVC42IChUSUZGIDYgbmFtZSkgKi8KKyNkZWZpbmUJICAgIFRBR19DT01QUkVTU0lPTl9MWlcJCTUgICAgICAgLyogTGVtcGVsLVppdiAgJiBXZWxjaCAqLworI2RlZmluZQkgICAgVEFHX0NPTVBSRVNTSU9OX09KUEVHCQk2CS8qICE2LjAgSlBFRyAqLworI2RlZmluZQkgICAgVEFHX0NPTVBSRVNTSU9OX0pQRUcJCTcJLyogJUpQRUcgRENUIGNvbXByZXNzaW9uICovCisjZGVmaW5lCSAgICBUQUdfQ09NUFJFU1NJT05fTkVYVAkJMzI3NjYJLyogTmVYVCAyLWJpdCBSTEUgKi8KKyNkZWZpbmUJICAgIFRBR19DT01QUkVTU0lPTl9DQ0lUVFJMRVcJMzI3NzEJLyogIzEgdy8gd29yZCBhbGlnbm1lbnQgKi8KKyNkZWZpbmUJICAgIFRBR19DT01QUkVTU0lPTl9QQUNLQklUUwkzMjc3MwkvKiBNYWNpbnRvc2ggUkxFICovCisjZGVmaW5lCSAgICBUQUdfQ09NUFJFU1NJT05fVEhVTkRFUlNDQU4JMzI4MDkJLyogVGh1bmRlclNjYW4gUkxFICovCisvKiBjb2RlcyAzMjg5NS0zMjg5OCBhcmUgcmVzZXJ2ZWQgZm9yIEFOU0kgSVQ4IFRJRkYvSVQgPGRrZWxseUBhcGFnby5jb20pICovCisjZGVmaW5lCSAgICBUQUdfQ09NUFJFU1NJT05fSVQ4Q1RQQUQJMzI4OTUgICAvKiBJVDggQ1Qgdy9wYWRkaW5nICovCisjZGVmaW5lCSAgICBUQUdfQ09NUFJFU1NJT05fSVQ4TFcJCTMyODk2ICAgLyogSVQ4IExpbmV3b3JrIFJMRSAqLworI2RlZmluZQkgICAgVEFHX0NPTVBSRVNTSU9OX0lUOE1QCQkzMjg5NyAgIC8qIElUOCBNb25vY2hyb21lIHBpY3R1cmUgKi8KKyNkZWZpbmUJICAgIFRBR19DT01QUkVTU0lPTl9JVDhCTAkJMzI4OTggICAvKiBJVDggQmluYXJ5IGxpbmUgYXJ0ICovCisvKiBjb21wcmVzc2lvbiBjb2RlcyAzMjkwOC0zMjkxMSBhcmUgcmVzZXJ2ZWQgZm9yIFBpeGFyICovCisjZGVmaW5lICAgICBUQUdfQ09NUFJFU1NJT05fUElYQVJGSUxNCTMyOTA4ICAgLyogUGl4YXIgY29tcGFuZGVkIDEwYml0IExaVyAqLworI2RlZmluZQkgICAgVEFHX0NPTVBSRVNTSU9OX1BJWEFSTE9HCTMyOTA5ICAgLyogUGl4YXIgY29tcGFuZGVkIDExYml0IFpJUCAqLworI2RlZmluZQkgICAgVEFHX0NPTVBSRVNTSU9OX0RFRkxBVEUJCTMyOTQ2CS8qIERlZmxhdGUgY29tcHJlc3Npb24gKi8KKyNkZWZpbmUgICAgIFRBR19DT01QUkVTU0lPTl9BRE9CRV9ERUZMQVRFICAgOCAgICAgICAvKiBEZWZsYXRlIGNvbXByZXNzaW9uLAorCQkJCQkJICAgYXMgcmVjb2duaXplZCBieSBBZG9iZSAqLworLyogY29tcHJlc3Npb24gY29kZSAzMjk0NyBpcyByZXNlcnZlZCBmb3IgT2NlYW5hIE1hdHJpeCA8ZGV2QG9jZWFuYS5jb20+ICovCisjZGVmaW5lICAgICBUQUdfQ09NUFJFU1NJT05fRENTICAgICAgICAgICAgIDMyOTQ3ICAgLyogS29kYWsgRENTIGVuY29kaW5nICovCisjZGVmaW5lCSAgICBUQUdfQ09NUFJFU1NJT05fSkJJRwkJMzQ2NjEJLyogSVNPIEpCSUcgKi8KKyNkZWZpbmUgICAgIFRBR19DT01QUkVTU0lPTl9TR0lMT0cJCTM0Njc2CS8qIFNHSSBMb2cgTHVtaW5hbmNlIFJMRSAqLworI2RlZmluZSAgICAgVEFHX0NPTVBSRVNTSU9OX1NHSUxPRzI0CTM0Njc3CS8qIFNHSSBMb2cgMjQtYml0IHBhY2tlZCAqLworI2RlZmluZSAgICAgVEFHX0NPTVBSRVNTSU9OX0pQMjAwMCAgICAgICAgICAzNDcxMiAgIC8qIExlYWR0b29scyBKUEVHMjAwMCAqLworI2RlZmluZQkgICAgVEFHX0NPTVBSRVNTSU9OX0xaTUEJCTM0OTI1CS8qIExaTUEyICovCisKKy8vIFRhZ3MgcmVsYXRpbmcgdG8gcmVjb3JkaW5nIG9mZnNldAorCisjZGVmaW5lIFRBR19TVFJJUF9PRkZTRVRTCQkJCQkweDAxMTEKKyNkZWZpbmUgVEFHX1JPV1NfUEVSX1NUUklQCQkJCQkweDAxMTYKKyNkZWZpbmUgVEFHX1NUUklQX0JZVEVfQ09VTlRTCQkJCTB4MDExNworI2RlZmluZSBUQUdfSlBFR19JTlRFUkNIQU5HRV9GT1JNQVQJCQkweDAyMDEKKyNkZWZpbmUgVEFHX0pQRUdfSU5URVJDSEFOR0VfRk9STUFUX0xFTkdUSAkweDAyMDIKKworLy8gVGFncyByZWxhdGluZyB0byBpbWFnZSBkYXRhIGNoYXJhY3RlcmlzdGljcworCisjZGVmaW5lIFRBR19UUkFOU0ZFUl9GVU5DVElPTgkJMHgwMTJECisjZGVmaW5lIFRBR19XSElURV9QT0lOVAkJCQkweDAxM0UKKyNkZWZpbmUgVEFHX1BSSU1BUllfQ0hST01BVElDSVRJRVMJMHgwMTNGCisjZGVmaW5lIFRBR19ZQ0JDUl9DT0VGRklDSUVOVFMJCTB4MDIxMQorI2RlZmluZSBUQUdfUkVGRVJFTkNFX0JMQUNLX1dISVRFCTB4MDIxNAorCisvLyBPdGhlciB0YWdzCisKKyNkZWZpbmUgVEFHX0RBVEVUSU1FIAkJCQkweDAxMzIKKyNkZWZpbmUgVEFHX0lNQUdFX0RFU0NSSVBUSU9OIAkJMHgwMTBFCisjZGVmaW5lIFRBR19NQUtFIAkJCQkJMHgwMTBGCisjZGVmaW5lIFRBR19NT0RFTCAJCQkJCTB4MDExMAorI2RlZmluZSBUQUdfU09GVFdBUkUgCQkJCTB4MDEzMQorI2RlZmluZSBUQUdfQVJUSVNUIAkJCQkJMHgwMTNCCisjZGVmaW5lIFRBR19DT1BZUklHSFQgCQkJCTB4ODI5OAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFeGlmIElGRCBBdHRyaWJ1dGUgSW5mb3JtYXRpb24KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gVGFncyByZWxhdGluZyB0byB2ZXJzaW9uCisKKyNkZWZpbmUgVEFHX0VYSUZfVkVSU0lPTiAJCQkweDkwMDAKKyNkZWZpbmUgVEFHX0ZMQVNIUElYX1ZFUlNJT04gCQkweEEwMDAKKworLy8gVGFnIHJlbGF0aW5nIHRvIGltYWdlIGRhdGEgY2hhcmFjdGVyaXN0aWNzCisKKyNkZWZpbmUgVEFHX0NPTE9SX1NQQUNFIAkJCTB4QTAwMQorCisvLyBUYWdzIHJlbGF0aW5nIHRvIGltYWdlIGNvbmZpZ3VyYXRpb24KKworI2RlZmluZSBUQUdfQ09NUE9ORU5UU19DT05GSUdVUkFUSU9OCTB4OTEwMQorI2RlZmluZSBUQUdfQ09NUFJFU1NFRF9CSVRTX1BFUl9QSVhFTAkweDkxMDIKKyNkZWZpbmUgVEFHX1BJWEVMX1hfRElNRU5TSU9OCQkJMHhBMDAyCisjZGVmaW5lIFRBR19QSVhFTF9ZX0RJTUVOU0lPTgkJCTB4QTAwMworCisvLyBUYWdzIHJlbGF0aW5nIHRvIHVzZXIgaW5mb3JtYXRpb24KKworI2RlZmluZSBUQUdfTUFSS0VSX05PVEUJCTB4OTI3QworI2RlZmluZSBUQUdfVVNFUl9DT01NRU5UCTB4OTI4NgorICAgIAorLy8gVGFnIHJlbGF0aW5nIHRvIHJlbGF0ZWQgZmlsZSBpbmZvcm1hdGlvbgorCisjZGVmaW5lIFRBR19SRUxBVEVEX1NPVU5EX0ZJTEUJCQkweEEwMDQKKworLy8gVGFncyByZWxhdGluZyB0byBkYXRlIGFuZCB0aW1lCisKKyNkZWZpbmUgVEFHX0RBVEVUSU1FX09SSUdJTkFMCQkJMHg5MDAzCisjZGVmaW5lIFRBR19EQVRFVElNRV9ESUdJVElaRUQJCQkweDkwMDQKKyNkZWZpbmUgVEFHX1NVQlNFQ09ORF9USU1FCQkJCTB4OTI5MAorI2RlZmluZSBUQUdfU1VCU0VDT05EX1RJTUVfT1JJR0lOQUwJCTB4OTI5MQorI2RlZmluZSBUQUdfU1VCU0VDT05EX1RJTUVfRElHSVRJWkVECTB4OTI5MgorCisvLyBUYWdzIHJlbGF0aW5nIHRvIHBpY3R1cmUtdGFraW5nIGNvbmRpdGlvbnMKKworI2RlZmluZSBUQUdfRVhQT1NVUkVfVElNRQkJCQkweDgyOUEKKyNkZWZpbmUgVEFHX0ZOVU1CRVIJCQkJCQkweDgyOUQKKyNkZWZpbmUgVEFHX0VYUE9TVVJFX1BST0dSQU0JCQkweDg4MjIKKyNkZWZpbmUgVEFHX1NQRUNUUkFMX1NFTlNJVElWSVRZCQkweDg4MjQKKyNkZWZpbmUgVEFHX0lTT19TUEVFRF9SQVRJTkdTIAkJCTB4ODgyNworI2RlZmluZSBUQUdfT0VDRgkJCQkJCTB4ODgyOAorI2RlZmluZSBUQUdfU0hVVFRFUl9TUEVFRF9WQUxVRSAJCTB4OTIwMQorI2RlZmluZSBUQUdfQVBFUlRVUkVfVkFMVUUgCQkJCTB4OTIwMgorI2RlZmluZSBUQUdfQlJJR0hUTkVTU19WQUxVRQkJCTB4OTIwMworI2RlZmluZSBUQUdfRVhQT1NVUkVfQklBU19WQUxVRSAJCTB4OTIwNAorI2RlZmluZSBUQUdfTUFYX0FQRVJUVVJFX1ZBTFVFIAkJCTB4OTIwNQorI2RlZmluZSBUQUdfU1VCSkVDVF9ESVNUQU5DRQkJCTB4OTIwNgorI2RlZmluZSBUQUdfTUVURVJJTkdfTU9ERQkJCQkweDkyMDcKKyNkZWZpbmUgVEFHX0xJR0hUX1NPVVJDRQkJCQkweDkyMDgKKyNkZWZpbmUgVEFHX0ZMQVNICQkJCQkJMHg5MjA5CisjZGVmaW5lIFRBR19GT0NBTF9MRU5HVEgJCQkJMHg5MjBBCisjZGVmaW5lIFRBR19TVUJKRUNUX0FSRUEJCQkJMHg5MjE0CisjZGVmaW5lIFRBR19GTEFTSF9FTkVSR1kJCQkJMHhBMjBCCisjZGVmaW5lIFRBR19TUEFUSUFMX0ZSRVFfUkVTUE9OU0UgCQkweEEyMEMKKyNkZWZpbmUgVEFHX0ZPQ0FMX1BMQU5FX1hfUkVTCQkJMHhBMjBFCisjZGVmaW5lIFRBR19GT0NBTF9QTEFORV9ZX1JFUwkJCTB4QTIwRgorI2RlZmluZSBUQUdfRk9DQUxfUExBTkVfVU5JVAkJCTB4QTIxMAorI2RlZmluZSBUQUdfU1VCSkVDVF9MT0NBVElPTiAJCQkweEEyMTQKKyNkZWZpbmUgVEFHX0VYUE9TVVJFX0lOREVYCQkJCTB4QTIxNQorI2RlZmluZSBUQUdfU0VOU0lOR19NRVRIT0QJCQkJMHhBMjE3CisjZGVmaW5lIFRBR19GSUxFX1NPVVJDRQkJCQkJMHhBMzAwCisjZGVmaW5lIFRBR19TQ0VORV9UWVBFCQkJCQkweEEzMDEKKyNkZWZpbmUgVEFHX0NGQV9QQVRURVJOCQkJCQkweEEzMDIKKyNkZWZpbmUgVEFHX0NVU1RPTV9SRU5ERVJFRAkJCQkweEE0MDEKKyNkZWZpbmUgVEFHX0VYUE9TVVJFX01PREUJCQkJMHhBNDAyCisjZGVmaW5lIFRBR19XSElURV9CQUxBTkNFCQkJCTB4QTQwMworI2RlZmluZSBUQUdfRElHSVRBTF9aT09NX1JBVElPCQkJMHhBNDA0CisjZGVmaW5lIFRBR19GT0NBTF9MRU5HVEhfSU5fMzVNTV9GSUxNCTB4QTQwNQorI2RlZmluZSBUQUdfU0NFTkVfQ0FQVFVSRV9UWVBFCQkJMHhBNDA2CisjZGVmaW5lIFRBR19HQUlOX0NPTlRST0wJCQkJMHhBNDA3CisjZGVmaW5lIFRBR19DT05UUkFTVAkJCQkJMHhBNDA4CisjZGVmaW5lIFRBR19TQVRVUkFUSU9OCQkJCQkweEE0MDkKKyNkZWZpbmUgVEFHX1NIQVJQTkVTUwkJCQkJMHhBNDBBCisjZGVmaW5lIFRBR19ERVZJQ0VfU0VUVElOR19ERVNDUklQVElPTgkweEE0MEIKKyNkZWZpbmUgVEFHX1NVQkpFQ1RfRElTVEFOQ0VfUkFOR0UJCTB4QTQwQworCisvLyBPdGhlciB0YWdzCisKKyNkZWZpbmUgVEFHX0lNQUdFX1VOSVFVRV9JRAkJCQkweEE0MjAKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gR1BTIEF0dHJpYnV0ZSBJbmZvcm1hdGlvbgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIFRBR19HUFNfVkVSU0lPTl9JRAkJCQkweDAwMDAKKyNkZWZpbmUgVEFHX0dQU19MQVRJVFVERV9SRUYJCQkweDAwMDEKKyNkZWZpbmUgVEFHX0dQU19MQVRJVFVERQkJCQkweDAwMDIKKyNkZWZpbmUgVEFHX0dQU19MT05HSVRVREVfUkVGCQkJMHgwMDAzCisjZGVmaW5lIFRBR19HUFNfTE9OR0lUVURFCQkJCTB4MDAwNAorI2RlZmluZSBUQUdfR1BTX0FMVElUVURFX1JFRgkJCTB4MDAwNQorI2RlZmluZSBUQUdfR1BTX0FMVElUVURFCQkJCTB4MDAwNgorI2RlZmluZSBUQUdfR1BTX1RJTUVfU1RBTVAJCQkJMHgwMDA3CisjZGVmaW5lIFRBR19HUFNfU0FURUxMSVRFUwkJCQkweDAwMDgKKyNkZWZpbmUgVEFHX0dQU19TVEFUVVMJCQkJCTB4MDAwOQorI2RlZmluZSBUQUdfR1BTX01FQVNVUkVfTU9ERQkJCTB4MDAwQQorI2RlZmluZSBUQUdfR1BTX0RPUAkJCQkJCTB4MDAwQgorI2RlZmluZSBUQUdfR1BTX1NQRUVEX1JFRgkJCQkweDAwMEMKKyNkZWZpbmUgVEFHX0dQU19TUEVFRAkJCQkJMHgwMDBECisjZGVmaW5lIFRBR19HUFNfVFJBQ0tfUkVGCQkJCTB4MDAwRQorI2RlZmluZSBUQUdfR1BTX1RSQUNLCQkJCQkweDAwMEYKKyNkZWZpbmUgVEFHX0dQU19JTUdfRElSRUNUSU9OX1JFRgkJMHgwMDEwCisjZGVmaW5lIFRBR19HUFNfSU1HX0RJUkVDVElPTgkJCTB4MDAxMQorI2RlZmluZSBUQUdfR1BTX01BUF9EQVRVTQkJCQkweDAwMTIKKyNkZWZpbmUgVEFHX0dQU19ERVNUX0xBVElUVURFX1JFRgkJMHgwMDEzCisjZGVmaW5lIFRBR19HUFNfREVTVF9MQVRJVFVERQkJCTB4MDAxNAorI2RlZmluZSBUQUdfR1BTX0RFU1RfTE9OR0lUVURFX1JFRgkJMHgwMDE1CisjZGVmaW5lIFRBR19HUFNfREVTVF9MT05HSVRVREUJCQkweDAwMTYKKyNkZWZpbmUgVEFHX0dQU19ERVNUX0JFQVJJTkdfUkVGCQkweDAwMTcKKyNkZWZpbmUgVEFHX0dQU19ERVNUX0JFQVJJTkcJCQkweDAwMTgKKyNkZWZpbmUgVEFHX0dQU19ERVNUX0RJU1RBTkNFX1JFRgkJMHgwMDE5CisjZGVmaW5lIFRBR19HUFNfREVTVF9ESVNUQU5DRQkJCTB4MDAxQQorI2RlZmluZSBUQUdfR1BTX1BST0NFU1NJTkdfTUVUSE9ECQkweDAwMUIKKyNkZWZpbmUgVEFHX0dQU19BUkVBX0lORk9STUFUSU9OCQkweDAwMUMKKyNkZWZpbmUgVEFHX0dQU19EQVRFX1NUQU1QCQkJCTB4MDAxRAorI2RlZmluZSBUQUdfR1BTX0RJRkZFUkVOVElBTAkJCTB4MDAxRQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBJUFRDL05BQSB0YWdzCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNkZWZpbmUgVEFHX1JFQ09SRF9WRVJTSU9OCQkJCQkweDAyMDAKKyNkZWZpbmUgVEFHX0NBUFRJT04JCQkJCQkJMHgwMjc4CisjZGVmaW5lIFRBR19XUklURVIJCQkJCQkJMHgwMjdBCisjZGVmaW5lIFRBR19IRUFETElORQkJCQkJCTB4MDI2OQorI2RlZmluZSBUQUdfU1BFQ0lBTF9JTlNUUlVDVElPTlMJCQkweDAyMjgKKyNkZWZpbmUgVEFHX0JZX0xJTkUJCQkJCQkJMHgwMjUwCisjZGVmaW5lIFRBR19CWV9MSU5FX1RJVExFCQkJCQkweDAyNTUKKyNkZWZpbmUgVEFHX0NSRURJVAkJCQkJCQkweDAyNkUKKyNkZWZpbmUgVEFHX1NPVVJDRQkJCQkJCQkweDAyNzMKKyNkZWZpbmUgVEFHX09CSkVDVF9OQU1FCQkJCQkJMHgwMjA1CisjZGVmaW5lIFRBR19EQVRFX0NSRUFURUQJCQkJCTB4MDIzNworI2RlZmluZSBUQUdfQ0lUWQkJCQkJCQkweDAyNUEKKyNkZWZpbmUgVEFHX1BST1ZJTkNFX09SX1NUQVRFCQkJCTB4MDI1RgorI2RlZmluZSBUQUdfQ09VTlRSWV9PUl9QUklNQVJZX0xPQ0FUSU9OCQkweDAyNjUKKyNkZWZpbmUgVEFHX09SSUdJTkFMX1RSQU5TTUlTU0lPTl9SRUZFUkVOQ0UgMHgwMjY3CisjZGVmaW5lIFRBR19DQVRFR09SWQkJCQkJCTB4MDIwRgorI2RlZmluZSBUQUdfU1VQUExFTUVOVEFMX0NBVEVHT1JJRVMJCQkweDAyMTQKKyNkZWZpbmUgVEFHX1VSR0VOQ1kJCQkJCQkJMHgwMjBBCisjZGVmaW5lIFRBR19LRVlXT1JEUwkJCQkJCTB4MDIxOQorI2RlZmluZSBUQUdfQ09QWVJJR0hUX05PVElDRQkJCQkweDAyNzQKKyNkZWZpbmUgVEFHX1JFTEVBU0VfREFURQkJCQkJMHgwMjFFCisjZGVmaW5lIFRBR19SRUxFQVNFX1RJTUUJCQkJCTB4MDIyMworI2RlZmluZSBUQUdfVElNRV9DUkVBVEVECQkJCQkweDAyM0MKKyNkZWZpbmUgVEFHX09SSUdJTkFUSU5HX1BST0dSQU0JCQkJMHgwMjQxCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEdlb1RJRkYgdGFncworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyB0YWdzIDMzNTUwIGlzIGEgcHJpdmF0ZSB0YWcgcmVnaXN0ZXJlZCB0byBTb2Z0RGVzaywgSW5jCisjZGVmaW5lIFRJRkZUQUdfR0VPUElYRUxTQ0FMRQkJMzM1NTAKKy8vIHRhZ3MgMzM5MjAtMzM5MjEgYXJlIHByaXZhdGUgdGFncyByZWdpc3RlcmVkIHRvIEludGVyZ3JhcGgsIEluYworI2RlZmluZSBUSUZGVEFHX0lOVEVSR1JBUEhfTUFUUklYCTMzOTIwCisjZGVmaW5lIFRJRkZUQUdfR0VPVElFUE9JTlRTCQkzMzkyMgorLy8gdGFncyAzNDI2My0zNDI2NCBhcmUgcHJpdmF0ZSB0YWdzIHJlZ2lzdGVyZWQgdG8gTkFTQS1KUEwgQ2FydG8gR3JvdXAKKyNkZWZpbmUgVElGRlRBR19KUExfQ0FSVE9fSUZECQkzNDI2MworI2RlZmluZSBUSUZGVEFHX0dFT1RSQU5TTUFUUklYCQkzNDI2NCAgICAvKiBOZXcgTWF0cml4IFRhZyByZXBsYWNlcyAzMzkyMCAqLworLy8gdGFncyAzNDczNS0zNDM4IGFyZSBwcml2YXRlIHRhZ3MgcmVnaXN0ZXJlZCB0byBTUE9UIEltYWdlLCBJbmMKKyNkZWZpbmUgVElGRlRBR19HRU9LRVlESVJFQ1RPUlkJCTM0NzM1CisjZGVmaW5lIFRJRkZUQUdfR0VPRE9VQkxFUEFSQU1TCQkzNDczNgorI2RlZmluZSBUSUZGVEFHX0dFT0FTQ0lJUEFSQU1TCQkzNDczNworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBGcmVlSW1hZ2UgQW5pbWF0aW9uIHRhZ3MKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2RlZmluZSBBTklNVEFHX0xPR0lDQUxXSURUSAkweDAwMDEKKyNkZWZpbmUgQU5JTVRBR19MT0dJQ0FMSEVJR0hUCTB4MDAwMgorI2RlZmluZSBBTklNVEFHX0dMT0JBTFBBTEVUVEUJMHgwMDAzCisjZGVmaW5lIEFOSU1UQUdfTE9PUAkJCTB4MDAwNAorI2RlZmluZSBBTklNVEFHX0ZSQU1FTEVGVAkJMHgxMDAxCisjZGVmaW5lIEFOSU1UQUdfRlJBTUVUT1AJCTB4MTAwMgorI2RlZmluZSBBTklNVEFHX05PTE9DQUxQQUxFVFRFCTB4MTAwMworI2RlZmluZSBBTklNVEFHX0lOVEVSTEFDRUQJCTB4MTAwNAorI2RlZmluZSBBTklNVEFHX0ZSQU1FVElNRQkJMHgxMDA1CisjZGVmaW5lIEFOSU1UQUdfRElTUE9TQUxNRVRIT0QJMHgxMDA2CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIZWxwZXIgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCB0aGUgRklUQUcgc3RydWN0dXJlCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKioKK0Rlc2NyaWJlcyB0aGUgdGFnIGZvcm1hdCBkZXNjcmlwdG9yCitHaXZlbiBhIEZSRUVfSU1BR0VfTURUWVBFLCBjYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhpcyB0eXBlIGluIGJ5dGVzIHVuaXQKK0BwYXJhbSB0eXBlIFRhZyBkYXRhIHR5cGUKK0ByZXR1cm4gUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgZGF0YSB0eXBlLCBpbiBieXRlcworQHNlZSBGUkVFX0lNQUdFX01EVFlQRQorKi8KK3Vuc2lnbmVkIEZyZWVJbWFnZV9UYWdEYXRhV2lkdGgoRlJFRV9JTUFHRV9NRFRZUEUgdHlwZSk7CisKKy8qKgorQ2FsY3VsYXRlIHRoZSBtZW1vcnkgc2l6ZSByZXF1aXJlZCBieSBhIHRhZywgaW5jbHVkaW5nIHRoZSBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUKK0BwYXJhbSB0YWcgVGhlIHRhZyB0byBleGFtaW5lCitAcmV0dXJuIFJldHVucyB0aGUgbWVtb3J5IHNpemUgdXNlZCBieSBhIHRhZworKi8KK3NpemVfdCBGcmVlSW1hZ2VfR2V0VGFnTWVtb3J5U2l6ZShGSVRBRyAqdGFnKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoqCisJU3RydWN0dXJlIHRvIGhvbGQgYSB0YWcgaW5mb3JtYXRpb24KKyovCit0eXBlZGVmIHN0cnVjdCB0YWdUYWdJbmZvIHsKKwlXT1JEIHRhZzsJCQkvLyBUYWcgSUQgKHJlcXVpcmVkKQorCWNoYXIgKmZpZWxkbmFtZTsJLy8gRmllbGQgbmFtZSAocmVxdWlyZWQpCisJY2hhciAqZGVzY3JpcHRpb247CS8vIEZpZWxkIGRlc2NyaXB0aW9uIChtYXkgYmUgTlVMTCkKK30gVGFnSW5mbzsKKworCisvKioKK0NsYXNzIHRvIGhvbGQgdGFnIGluZm9ybWF0aW9uIChiYXNlZCBvbiBNZXllcnOSIFNpbmdsZXRvbikuPGJyPgorCitTYW1wbGUgdXNhZ2UgOjxicj4KKzxjb2RlPgorVGFnTGliJiBzID0gVGFnTGliOjppbnN0YW5jZSgpOworVGFnSW5mbyAqdGFnX2luZm8gPSBzLmdldFRhZ0luZm8oRVhJRl9NQUlOLCAweDAxMDApOworPC9jb2RlPgorCitOb3RlIG9uIG11bHRpLXRocmVhZGVkIGFwcGxpY2F0aW9ucyA6IAorCitUaGUgc2luZ2xldG9uIHBhdHRlcm4gbXVzdCBiZSBjYXJlZnVsbHkgY29uc3RydWN0ZWQgaW4gbXVsdGktdGhyZWFkZWQgYXBwbGljYXRpb25zLiAKK0lmIHR3byB0aHJlYWRzIGFyZSB0byBleGVjdXRlIHRoZSBjcmVhdGlvbiBtZXRob2QgYXQgdGhlIHNhbWUgdGltZSB3aGVuIGEgc2luZ2xldG9uIAorZG9lcyBub3QgeWV0IGV4aXN0LCB0aGV5IGJvdGggbXVzdCBjaGVjayBmb3IgYW4gaW5zdGFuY2Ugb2YgdGhlIHNpbmdsZXRvbiBhbmQgdGhlbiAKK29ubHkgb25lIHNob3VsZCBjcmVhdGUgdGhlIG5ldyBvbmUuCitUaGUgY2xhc3NpYyBzb2x1dGlvbiB0byB0aGlzIHByb2JsZW0gaXMgdG8gdXNlIG11dHVhbCBleGNsdXNpb24gb24gdGhlIGNsYXNzIHRoYXQgCitpbmRpY2F0ZXMgdGhhdCB0aGUgb2JqZWN0IGlzIGJlaW5nIGluc3RhbnRpYXRlZC4KK1RoZSBGcmVlSW1hZ2Ugc29sdXRpb24gaXMgdG8gaW5zdGFudGlhdGUgdGhlIHNpbmdsZXRvbiBiZWZvcmUgYW55IG90aGVyIHRocmVhZCBpcyBsYXVuY2hlZCwgCitpLmUuIGluc2lkZSB0aGUgRnJlZUltYWdlX0luaXRpYWxpc2UgZnVuY3Rpb24gKHNlZSBQbHVnaW4uY3BwKS4gCisqLworCitjbGFzcyBUYWdMaWIgeworcHVibGljOgorCisJLyoqCisJaW50ZXJuYWwgdGFnIGluZm8gdGFibGVzIHJlZ2lzdGVyZWQgaW4gVGFnTGliCisJKi8KKwllbnVtIE1ETU9ERUwgeworCQlVTktOT1dOLAorCQlFWElGX01BSU4sIAorCQlFWElGX0VYSUYsIAorCQlFWElGX0dQUywgCisJCUVYSUZfSU5URVJPUCwKKwkJRVhJRl9NQUtFUk5PVEVfQ0FOT04sCisJCUVYSUZfTUFLRVJOT1RFX0NBU0lPVFlQRTEsCisJCUVYSUZfTUFLRVJOT1RFX0NBU0lPVFlQRTIsCisJCUVYSUZfTUFLRVJOT1RFX0ZVSklGSUxNLAorCQlFWElGX01BS0VSTk9URV9LWU9DRVJBLAorCQlFWElGX01BS0VSTk9URV9NSU5PTFRBLAorCQlFWElGX01BS0VSTk9URV9OSUtPTlRZUEUxLAorCQlFWElGX01BS0VSTk9URV9OSUtPTlRZUEUyLAorCQlFWElGX01BS0VSTk9URV9OSUtPTlRZUEUzLAorCQlFWElGX01BS0VSTk9URV9PTFlNUFVTVFlQRTEsCisJCUVYSUZfTUFLRVJOT1RFX1BBTkFTT05JQywKKwkJRVhJRl9NQUtFUk5PVEVfQVNBSEksCisJCUVYSUZfTUFLRVJOT1RFX1BFTlRBWCwKKwkJRVhJRl9NQUtFUk5PVEVfU09OWSwKKwkJRVhJRl9NQUtFUk5PVEVfU0lHTUFfU0QxLAorCQlFWElGX01BS0VSTk9URV9TSUdNQV9GT1ZFT04sCisJCUlQVEMsCisJCUdFT1RJRkYsCisJCUFOSU1BVElPTgorCX07CisKK3ByaXZhdGU6CisKKwl0eXBlZGVmIHN0ZDo6bWFwPFdPUkQsIFRhZ0luZm8qPiBUQUdJTkZPOworCXR5cGVkZWYgc3RkOjptYXA8aW50LCBUQUdJTkZPKj4gIFRBQkxFTUFQOworCisJLy8vIHN0b3JlIGhhc2ggdGFibGVzIGZvciBhbGwga25vd24gdGFnIGluZm8gdGFibGVzCisJVEFCTEVNQVAgX3RhYmxlX21hcDsKKworcHJpdmF0ZToKKwkvKioKKwlDb25zdHJ1Y3RvciAocHJpdmF0ZSk8YnI+CisJVGhpcyBpcyB3aGVyZSB0aGUgdGFnIGluZm8gdGFibGVzIGFyZSBpbml0aWFsaXplZC4KKwlAc2VlIGFkZE1ldGFkYXRhTW9kZWwKKwkqLworCVRhZ0xpYigpOworCisJLy8vIEFzc2lnbmVtZW50IG9wZXJhdG9yIChkaXNhYmxlZCkKKwl2b2lkIG9wZXJhdG9yPShUYWdMaWImKTsKKworCS8vLyBDb3B5IGNvbnN0cnVjdG9yIChkaXNhYmxlZCkKKwlUYWdMaWIoY29uc3QgVGFnTGliJik7CisJCisJLyoqIAorCVVzZWQgaW4gdGhlIGNvbnN0cnVjdG9yIHRvIGluaXRpYWxpemUgdGhlIHRhZyB0YWJsZXMKKwlAcGFyYW0gbWRfbW9kZWwgSW50ZXJuYWwgbWV0YWRhdGEgbW9kZWwKKwlAcGFyYW0gdGFnX3RhYmxlIFRhZyBpbmZvIHRhYmxlCisJQHJldHVybiBSZXR1cm5zIFRSVUUgaWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyBGQUxTRSBvdGhlcndpc2UKKwkqLworCUJPT0wgYWRkTWV0YWRhdGFNb2RlbChNRE1PREVMIG1kX21vZGVsLCBUYWdJbmZvICp0YWdfdGFibGUpOworCitwdWJsaWM6CisJLy8vIERlc3RydWN0b3IKKwl+VGFnTGliKCk7CisKKwkvKioKKwlAcmV0dXJuIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIFRhZ0xpYiBpbnN0YW5jZQorCSovCisJc3RhdGljIFRhZ0xpYiYgaW5zdGFuY2UoKTsKKworCS8qKgorCUdpdmVuIGEgdGFnIElELCByZXR1cm5zIGl0cyBUYWdJbmZvIGRlc2NyaXB0b3IKKwlAcGFyYW0gbWRfbW9kZWwgSW50ZXJuYWwgbWV0YWRhdGEgbW9kZWwKKwlAcGFyYW0gdGFnSUQgdGFnIElECisJQHJldHVybiBSZXR1cm5zIHRoZSBUYWdJbmZvIGRlc2NyaXB0b3IgaWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyBOVUxMIG90aGVyd2lzZQorCSovCisJY29uc3QgVGFnSW5mbyogZ2V0VGFnSW5mbyhNRE1PREVMIG1kX21vZGVsLCBXT1JEIHRhZ0lEKTsKKworCS8qKgorCUdpdmVuIGEgdGFnIElELCByZXR1cm5zIGl0cyB0YWcgZmllbGQgbmFtZS4gCisJV2hlbiB0aGUgdGFnIGlzIHVua25vd24gYW5kIGRlZmF1bHRLZXkgaXMgbm90IE5VTEwsIGEgc3RyaW5nIHN1Y2ggYXMgIlRhZyAweDEyMzQiIGlzIHJldHVybmVkLiAKKwlUaGlzIHN0cmluZyBpcyBjb250YWluZWQgaW4gdGhlIHByb3ZpZGVkIGRlZmF1bHRLZXkgYnVmZmVyIChhc3N1bWVkIHRvIGJlIGFuIGFycmF5IG9mIGF0IGxlYXN0IDE2IGNoYXJzKS4gCisJQHBhcmFtIG1kX21vZGVsIEludGVybmFsIG1ldGFkYXRhIG1vZGVsCisJQHBhcmFtIHRhZ0lEIHRhZyBJRAorCUBwYXJhbSBkZWZhdWx0S2V5IEFzc3VtZWQgdG8gYmUgYW4gYXJyYXkgb2YgMTYgY2hhcnMuIElmIG5vdCBOVUxMLCBidWlsZCBhIGtleSBmb3IgdW5rbm93biB0YWdzCisJQHJldHVybiBSZXR1cm5zIHRoZSB0YWcgZmllbGQgbmFtZSBpZiBzdWNjZXNzZnVsLCByZXR1cm5zIGFuICd1bmtub3duIHRhZycgc3RyaW5nIGNvbnRhaW5lZCBpbiBkZWZhdWx0S2V5IG90aGVyd2lzZQorCSovCisJY29uc3QgY2hhciogZ2V0VGFnRmllbGROYW1lKE1ETU9ERUwgbWRfbW9kZWwsIFdPUkQgdGFnSUQsIGNoYXIgKmRlZmF1bHRLZXkpOworCisJLyoqCisJR2l2ZW4gYSB0YWcgSUQsIHJldHVybnMgaXRzIGRlc2NyaXB0aW9uLiAKKwlXaGVuIHRoZSB0YWcgaGFzIG5vIGRlc2NyaXB0aW9uLCBhIE5VTEwgdmFsdWUgaXMgcmV0dXJuZWQuCisJQHBhcmFtIG1kX21vZGVsIEludGVybmFsIG1ldGFkYXRhIG1vZGVsCisJQHBhcmFtIHRhZ0lEIHRhZyBJRAorCUByZXR1cm4gUmV0dXJucyB0aGUgdGFnIGRlc2NyaXB0aW9uIGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgTlVMTCBvdGhlcndpc2UKKwkqLworCWNvbnN0IGNoYXIqIGdldFRhZ0Rlc2NyaXB0aW9uKE1ETU9ERUwgbWRfbW9kZWwsIFdPUkQgdGFnSUQpOworCisJLyoqCisJR2l2ZW4gYSB0YWcgZmllbGQgbmFtZSwgcmV0dXJucyBpdHMgdGFnIElELiAKKwlXaGVuIHRoZSB0YWcgZG9lc24ndCBleGlzdHMsIGEgdmFsdWUgJy0xJyBpcyByZXR1cm5lZC4KKwlAcGFyYW0gbWRfbW9kZWwgSW50ZXJuYWwgbWV0YWRhdGEgbW9kZWwKKwlAcGFyYW0ga2V5IHRhZyBmaWVsZCBuYW1lCisJQHJldHVybiBSZXR1cm5zIHRoZSB0YWcgSUQgaWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyAtMSBvdGhlcndpc2UKKwkqLworCWludCBnZXRUYWdJRChNRE1PREVMIG1kX21vZGVsLCBjb25zdCBjaGFyICprZXkpOworCisJLyoqCisJUGVyZm9ybSBhIGNvbnZlcnNpb24gYmV0d2VlbiBpbnRlcm5hbCBtZXRhZGF0YSBtb2RlbHMgYW5kIEZyZWVJbWFnZSBwdWJsaWMgbWV0YWRhdGEgbW9kZWxzCisJQHBhcmFtIG1kX21vZGVsIEludGVybmFsIG1ldGFkYXRhIG1vZGVsCisJKi8KKwlGUkVFX0lNQUdFX01ETU9ERUwgZ2V0RnJlZUltYWdlTW9kZWwoTURNT0RFTCBtb2RlbCk7CisKK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb25zdGFudCBzdHJpbmdzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy8gTmFtZSBvZiB0aGUgWE1QIGZpZWxkCitzdGF0aWMgY29uc3QgY2hhciAqZ19UYWdMaWJfWE1QRmllbGROYW1lID0gIlhNTFBhY2tldCI7CisKKy8vLyBOYW1lIG9mIHRoZSBFeGlmIHJhdyBmaWVsZAorc3RhdGljIGNvbnN0IGNoYXIgKmdfVGFnTGliX0V4aWZSYXdGaWVsZE5hbWUgPSAiRXhpZlJhdyI7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNZXRhZGF0YSByb3V0aW5lcworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvLyBKUEVHIC8gSlBFRy1YUiBFeGlmIHByb2ZpbGUgKHNlZSBFeGlmLmNwcCkKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitCT09MIGpwZWdfcmVhZF9leGlmX3Byb2ZpbGUoRklCSVRNQVAgKmRpYiwgY29uc3QgQllURSAqZGF0YXB0ciwgdW5zaWduZWQgZGF0YWxlbik7CitCT09MIGpwZWdfcmVhZF9leGlmX3Byb2ZpbGVfcmF3KEZJQklUTUFQICpkaWIsIGNvbnN0IEJZVEUgKnByb2ZpbGUsIHVuc2lnbmVkIGxlbmd0aCk7CitCT09MIGpwZWd4cl9yZWFkX2V4aWZfcHJvZmlsZShGSUJJVE1BUCAqZGliLCBjb25zdCBCWVRFICpwcm9maWxlLCB1bnNpZ25lZCBsZW5ndGgsIHVuc2lnbmVkIGZpbGVfb2Zmc2V0KTsKK0JPT0wganBlZ3hyX3JlYWRfZXhpZl9ncHNfcHJvZmlsZShGSUJJVE1BUCAqZGliLCBjb25zdCBCWVRFICpwcm9maWxlLCB1bnNpZ25lZCBsZW5ndGgsIHVuc2lnbmVkIGZpbGVfb2Zmc2V0KTsKKworQk9PTCB0aWZmX2dldF9pZmRfcHJvZmlsZShGSUJJVE1BUCAqZGliLCBGUkVFX0lNQUdFX01ETU9ERUwgbWRfbW9kZWwsIEJZVEUgKipwcGJQcm9maWxlLCB1bnNpZ25lZCAqdVByb2ZpbGVMZW5ndGgpOworCisKKy8vIEpQRUcgLyBUSUZGIElQVEMgcHJvZmlsZSAoc2VlIElQVEMuY3BwKQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0JPT0wgcmVhZF9pcHRjX3Byb2ZpbGUoRklCSVRNQVAgKmRpYiwgY29uc3QgQllURSAqZGF0YXB0ciwgdW5zaWduZWQgaW50IGRhdGFsZW4pOworQk9PTCB3cml0ZV9pcHRjX3Byb2ZpbGUoRklCSVRNQVAgKmRpYiwgQllURSAqKnByb2ZpbGUsIHVuc2lnbmVkICpwcm9maWxlX3NpemUpOworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30KKyNlbmRpZgorCisKKyNlbmRpZiAvLyBGUkVFSU1BR0VUQUdfSAorCisKZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9NZXRhZGF0YS9JUFRDLmNwcCBiL2ZpbGVzL1NvdXJjZS9NZXRhZGF0YS9JUFRDLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGU3MThjCi0tLSAvZGV2L251bGwKKysrIGIvZmlsZXMvU291cmNlL01ldGFkYXRhL0lQVEMuY3BwCkBAIC0wLDAgKzEsMzQyIEBACisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBNZXRhZGF0YSBmdW5jdGlvbnMgaW1wbGVtZW50YXRpb24KKy8vCisvLyBEZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIGJ5CisvLyAtIEhlcnbpIERyb2xvbiAoZHJvbG9uQGluZm9uaWUuZnIpCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRnJlZUltYWdlIDMKKy8vCisvLyBDT1ZFUkVEIENPREUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkKKy8vIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTCisvLyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy8vIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVECisvLyBDT0RFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UCisvLyBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWQorLy8gU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTAorLy8gUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUgorLy8gVEhJUyBESVNDTEFJTUVSLgorLy8KKy8vIFVzZSBhdCB5b3VyIG93biByaXNrIQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaWZkZWYgX01TQ19WRVIgCisjcHJhZ21hIHdhcm5pbmcgKGRpc2FibGUgOiA0Nzg2KSAvLyBpZGVudGlmaWVyIHdhcyB0cnVuY2F0ZWQgdG8gJ251bWJlcicgY2hhcmFjdGVycworI2VuZGlmCisKKyNpbmNsdWRlICJGcmVlSW1hZ2UuaCIKKyNpbmNsdWRlICJVdGlsaXRpZXMuaCIKKyNpbmNsdWRlICJGcmVlSW1hZ2VUYWcuaCIKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICBJUFRDIEpQRUcgLyBUSUZGIG1hcmtlcnMgcm91dGluZXMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGNvbnN0IGNoYXIqIElQVENfREVMSU1JVEVSID0gIjsiOwkvLyBrZXl3b3Jkcy9zdXBwbGVtZW50YWwgY2F0ZWdvcnkgZGVsaW1pdGVyCisvKioKKwlSZWFkIGFuZCBkZWNvZGUgSVBUQyBiaW5hcnkgZGF0YQorKi8KK0JPT0wgCityZWFkX2lwdGNfcHJvZmlsZShGSUJJVE1BUCAqZGliLCBjb25zdCBCWVRFICpkYXRhcHRyLCB1bnNpZ25lZCBpbnQgZGF0YWxlbikgeworCWNoYXIgZGVmYXVsdEtleVsxNl07CisJc2l6ZV90IGxlbmd0aCA9IGRhdGFsZW47CisJQllURSAqcHJvZmlsZSA9IChCWVRFKilkYXRhcHRyOworCisJY29uc3QgY2hhciAqSlBFR19BZG9iZUNNX1RhZyA9ICJBZG9iZV9DTSI7CisKKwlzdGQ6OnN0cmluZyBLZXl3b3JkczsKKwlzdGQ6OnN0cmluZyBTdXBwbGVtZW50YWxDYXRlZ29yeTsKKworCVdPUkQgdGFnX2lkOworCisJaWYoIWRhdGFwdHIgfHwgKGRhdGFsZW4gPT0gMCkpIHsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWlmKGRhdGFsZW4gPiA4KSB7CisJCWlmKG1lbWNtcChKUEVHX0Fkb2JlQ01fVGFnLCBkYXRhcHRyLCA4KSA9PSAwKSB7CisJCQkvLyB0aGUgIkFkb2JlX0NNIiBBUFAxMyBzZWdtZW50IHByZXN1bWFibHkgY29udGFpbnMgY29sb3IgbWFuYWdlbWVudCBpbmZvcm1hdGlvbiwgCisJCQkvLyBidXQgdGhlIG1lYW5pbmcgb2YgdGhlIGRhdGEgaXMgY3VycmVudGx5IHVua25vd24uIAorCQkJLy8gSWYgYW55b25lIGhhcyBhbiBpZGVhIGFib3V0IHdoYXQgdGhpcyBtZWFucywgcGxlYXNlIGxldCBtZSBrbm93LgorCQkJcmV0dXJuIEZBTFNFOworCQl9CisJfQorCisKKwkvLyBjcmVhdGUgYSB0YWcKKworCUZJVEFHICp0YWcgPSBGcmVlSW1hZ2VfQ3JlYXRlVGFnKCk7CisKKwlUYWdMaWImIHRhZ19saWIgPSBUYWdMaWI6Omluc3RhbmNlKCk7CisKKyAgICAvLyBmaW5kIHN0YXJ0IG9mIHRoZSBCSU0gcG9ydGlvbiBvZiB0aGUgYmluYXJ5IGRhdGEKKyAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKKwl3aGlsZShvZmZzZXQgPCBsZW5ndGggLSAxKSB7CisJCWlmKChwcm9maWxlW29mZnNldF0gPT0gMHgxQykgJiYgKHByb2ZpbGVbb2Zmc2V0KzFdID09IDB4MDIpKQorCQkJYnJlYWs7CisJCW9mZnNldCsrOworCX0KKworICAgIC8vIGZvciBlYWNoIHRhZworICAgIHdoaWxlIChvZmZzZXQgPCBsZW5ndGgpIHsKKworICAgICAgICAvLyBpZGVudGlmaWVzIHN0YXJ0IG9mIGEgdGFnCisgICAgICAgIGlmIChwcm9maWxlW29mZnNldF0gIT0gMHgxYykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLy8gd2UgbmVlZCBhdCBsZWFzdCBmaXZlIGJ5dGVzIGxlZnQgdG8gcmVhZCBhIHRhZworICAgICAgICBpZiAoKG9mZnNldCArIDUpID49IGxlbmd0aCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBvZmZzZXQrKzsKKworCQlpbnQgZGlyZWN0b3J5VHlwZQk9IHByb2ZpbGVbb2Zmc2V0KytdOworICAgICAgICBpbnQgdGFnVHlwZQkJCT0gcHJvZmlsZVtvZmZzZXQrK107OworICAgICAgICBpbnQgdGFnQnl0ZUNvdW50CT0gKChwcm9maWxlW29mZnNldF0gJiAweEZGKSA8PCA4KSB8IChwcm9maWxlW29mZnNldCArIDFdICYgMHhGRik7CisgICAgICAgIG9mZnNldCArPSAyOworCisgICAgICAgIGlmICgob2Zmc2V0ICsgdGFnQnl0ZUNvdW50KSA+IGxlbmd0aCkgeworICAgICAgICAgICAgLy8gZGF0YSBmb3IgdGFnIGV4dGVuZHMgYmV5b25kIGVuZCBvZiBpcHRjIHNlZ21lbnQKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKwkJaWYodGFnQnl0ZUNvdW50ID09IDApIHsKKwkJCS8vIGdvIHRvIG5leHQgdGFnCisJCQljb250aW51ZTsKKwkJfQorCisJCS8vIHByb2Nlc3MgdGhlIHRhZworCisJCXRhZ19pZCA9IChXT1JEKSh0YWdUeXBlIHwgKGRpcmVjdG9yeVR5cGUgPDwgOCkpOworCisJCUZyZWVJbWFnZV9TZXRUYWdJRCh0YWcsIHRhZ19pZCk7CisJCUZyZWVJbWFnZV9TZXRUYWdMZW5ndGgodGFnLCB0YWdCeXRlQ291bnQpOworCisJCS8vIGFsbG9jYXRlIGEgYnVmZmVyIHRvIHN0b3JlIHRoZSB0YWcgdmFsdWUKKwkJQllURSAqaXB0Y192YWx1ZSA9IChCWVRFKiltYWxsb2MoKHRhZ0J5dGVDb3VudCArIDEpICogc2l6ZW9mKEJZVEUpKTsKKwkJbWVtc2V0KGlwdGNfdmFsdWUsIDAsICh0YWdCeXRlQ291bnQgKyAxKSAqIHNpemVvZihCWVRFKSk7CisKKwkJLy8gZ2V0IHRoZSB0YWcgdmFsdWUKKworCQlzd2l0Y2ggKHRhZ19pZCkgeworCQkJY2FzZSBUQUdfUkVDT1JEX1ZFUlNJT046CisJCQl7CisJCQkJLy8gc2hvcnQKKwkJCQlGcmVlSW1hZ2VfU2V0VGFnVHlwZSh0YWcsIEZJRFRfU1NIT1JUKTsKKwkJCQlGcmVlSW1hZ2VfU2V0VGFnQ291bnQodGFnLCAxKTsKKwkJCQlzaG9ydCAqcHZhbHVlID0gKHNob3J0KikmaXB0Y192YWx1ZVswXTsKKwkJCQkqcHZhbHVlID0gKHNob3J0KSgocHJvZmlsZVtvZmZzZXRdIDw8IDgpIHwgcHJvZmlsZVtvZmZzZXQgKyAxXSk7CisJCQkJRnJlZUltYWdlX1NldFRhZ1ZhbHVlKHRhZywgcHZhbHVlKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJY2FzZSBUQUdfUkVMRUFTRV9EQVRFOgorCQkJY2FzZSBUQUdfREFURV9DUkVBVEVEOgorCQkJCS8vIERhdGUgb2JqZWN0CisJCQljYXNlIFRBR19SRUxFQVNFX1RJTUU6CisJCQljYXNlIFRBR19USU1FX0NSRUFURUQ6CisJCQkJLy8gdGltZQorCQkJZGVmYXVsdDoKKwkJCXsKKwkJCQkvLyBzdHJpbmcKKwkJCQlGcmVlSW1hZ2VfU2V0VGFnVHlwZSh0YWcsIEZJRFRfQVNDSUkpOworCQkJCUZyZWVJbWFnZV9TZXRUYWdDb3VudCh0YWcsIHRhZ0J5dGVDb3VudCk7CisJCQkJZm9yKGludCBpID0gMDsgaSA8IHRhZ0J5dGVDb3VudDsgaSsrKSB7CisJCQkJCWlwdGNfdmFsdWVbaV0gPSBwcm9maWxlW29mZnNldCArIGldOworCQkJCX0KKwkJCQlpcHRjX3ZhbHVlW3RhZ0J5dGVDb3VudF0gPSAnXDAnOworCQkJCUZyZWVJbWFnZV9TZXRUYWdWYWx1ZSh0YWcsIChjaGFyKikmaXB0Y192YWx1ZVswXSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZih0YWdfaWQgPT0gVEFHX1NVUFBMRU1FTlRBTF9DQVRFR09SSUVTKSB7CisJCQkvLyBjb25jYXRlbmF0ZSB0aGUgY2F0ZWdvcmllcworCQkJaWYoU3VwcGxlbWVudGFsQ2F0ZWdvcnkubGVuZ3RoKCkgPT0gMCkgeworCQkJCVN1cHBsZW1lbnRhbENhdGVnb3J5LmFwcGVuZCgoY2hhciopaXB0Y192YWx1ZSk7CisJCQl9IGVsc2UgeworCQkJCVN1cHBsZW1lbnRhbENhdGVnb3J5LmFwcGVuZChJUFRDX0RFTElNSVRFUik7CisJCQkJU3VwcGxlbWVudGFsQ2F0ZWdvcnkuYXBwZW5kKChjaGFyKilpcHRjX3ZhbHVlKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmKHRhZ19pZCA9PSBUQUdfS0VZV09SRFMpIHsKKwkJCS8vIGNvbmNhdGVuYXRlIHRoZSBrZXl3b3JkcworCQkJaWYoS2V5d29yZHMubGVuZ3RoKCkgPT0gMCkgeworCQkJCUtleXdvcmRzLmFwcGVuZCgoY2hhciopaXB0Y192YWx1ZSk7CisJCQl9IGVsc2UgeworCQkJCUtleXdvcmRzLmFwcGVuZChJUFRDX0RFTElNSVRFUik7CisJCQkJS2V5d29yZHMuYXBwZW5kKChjaGFyKilpcHRjX3ZhbHVlKTsKKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCS8vIGdldCB0aGUgdGFnIGtleSBhbmQgZGVzY3JpcHRpb24KKwkJCWNvbnN0IGNoYXIgKmtleSA9IHRhZ19saWIuZ2V0VGFnRmllbGROYW1lKFRhZ0xpYjo6SVBUQywgdGFnX2lkLCBkZWZhdWx0S2V5KTsKKwkJCUZyZWVJbWFnZV9TZXRUYWdLZXkodGFnLCBrZXkpOworCQkJY29uc3QgY2hhciAqZGVzY3JpcHRpb24gPSB0YWdfbGliLmdldFRhZ0Rlc2NyaXB0aW9uKFRhZ0xpYjo6SVBUQywgdGFnX2lkKTsKKwkJCUZyZWVJbWFnZV9TZXRUYWdEZXNjcmlwdGlvbih0YWcsIGRlc2NyaXB0aW9uKTsKKworCQkJLy8gc3RvcmUgdGhlIHRhZworCQkJaWYoa2V5KSB7CisJCQkJRnJlZUltYWdlX1NldE1ldGFkYXRhKEZJTURfSVBUQywgZGliLCBrZXksIHRhZyk7CisJCQl9CisJCX0KKworCQlmcmVlKGlwdGNfdmFsdWUpOworCisgICAgICAgIC8vIG5leHQgdGFnCisJCW9mZnNldCArPSB0YWdCeXRlQ291bnQ7CisKKyAgICB9CisKKwkvLyBzdG9yZSB0aGUgJ2tleXdvcmRzJyB0YWcKKwlpZihLZXl3b3Jkcy5sZW5ndGgoKSkgeworCQlGcmVlSW1hZ2VfU2V0VGFnVHlwZSh0YWcsIEZJRFRfQVNDSUkpOworCQlGcmVlSW1hZ2VfU2V0VGFnSUQodGFnLCBUQUdfS0VZV09SRFMpOworCQlGcmVlSW1hZ2VfU2V0VGFnS2V5KHRhZywgdGFnX2xpYi5nZXRUYWdGaWVsZE5hbWUoVGFnTGliOjpJUFRDLCBUQUdfS0VZV09SRFMsIGRlZmF1bHRLZXkpKTsKKwkJRnJlZUltYWdlX1NldFRhZ0Rlc2NyaXB0aW9uKHRhZywgdGFnX2xpYi5nZXRUYWdEZXNjcmlwdGlvbihUYWdMaWI6OklQVEMsIFRBR19LRVlXT1JEUykpOworCQlGcmVlSW1hZ2VfU2V0VGFnTGVuZ3RoKHRhZywgKERXT1JEKUtleXdvcmRzLmxlbmd0aCgpKTsKKwkJRnJlZUltYWdlX1NldFRhZ0NvdW50KHRhZywgKERXT1JEKUtleXdvcmRzLmxlbmd0aCgpKTsKKwkJRnJlZUltYWdlX1NldFRhZ1ZhbHVlKHRhZywgKGNoYXIqKUtleXdvcmRzLmNfc3RyKCkpOworCQlGcmVlSW1hZ2VfU2V0TWV0YWRhdGEoRklNRF9JUFRDLCBkaWIsIEZyZWVJbWFnZV9HZXRUYWdLZXkodGFnKSwgdGFnKTsKKwl9CisKKwkvLyBzdG9yZSB0aGUgJ3N1cHBsZW1lbnRhbCBjYXRlZ29yeScgdGFnCisJaWYoU3VwcGxlbWVudGFsQ2F0ZWdvcnkubGVuZ3RoKCkpIHsKKwkJRnJlZUltYWdlX1NldFRhZ1R5cGUodGFnLCBGSURUX0FTQ0lJKTsKKwkJRnJlZUltYWdlX1NldFRhZ0lEKHRhZywgVEFHX1NVUFBMRU1FTlRBTF9DQVRFR09SSUVTKTsKKwkJRnJlZUltYWdlX1NldFRhZ0tleSh0YWcsIHRhZ19saWIuZ2V0VGFnRmllbGROYW1lKFRhZ0xpYjo6SVBUQywgVEFHX1NVUFBMRU1FTlRBTF9DQVRFR09SSUVTLCBkZWZhdWx0S2V5KSk7CisJCUZyZWVJbWFnZV9TZXRUYWdEZXNjcmlwdGlvbih0YWcsIHRhZ19saWIuZ2V0VGFnRGVzY3JpcHRpb24oVGFnTGliOjpJUFRDLCBUQUdfU1VQUExFTUVOVEFMX0NBVEVHT1JJRVMpKTsKKwkJRnJlZUltYWdlX1NldFRhZ0xlbmd0aCh0YWcsIChEV09SRClTdXBwbGVtZW50YWxDYXRlZ29yeS5sZW5ndGgoKSk7CisJCUZyZWVJbWFnZV9TZXRUYWdDb3VudCh0YWcsIChEV09SRClTdXBwbGVtZW50YWxDYXRlZ29yeS5sZW5ndGgoKSk7CisJCUZyZWVJbWFnZV9TZXRUYWdWYWx1ZSh0YWcsIChjaGFyKilTdXBwbGVtZW50YWxDYXRlZ29yeS5jX3N0cigpKTsKKwkJRnJlZUltYWdlX1NldE1ldGFkYXRhKEZJTURfSVBUQywgZGliLCBGcmVlSW1hZ2VfR2V0VGFnS2V5KHRhZyksIHRhZyk7CisJfQorCisJLy8gZGVsZXRlIHRoZSB0YWcKKworCUZyZWVJbWFnZV9EZWxldGVUYWcodGFnKTsKKworCXJldHVybiBUUlVFOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgQllURSogCithcHBlbmRfaXB0Y190YWcoQllURSAqcHJvZmlsZSwgdW5zaWduZWQgKnByb2ZpbGVfc2l6ZSwgV09SRCBpZCwgRFdPUkQgbGVuZ3RoLCBjb25zdCB2b2lkICp2YWx1ZSkgeworCUJZVEUgKmJ1ZmZlciA9IE5VTEw7CisKKwkvLyBjYWxjdWxhdGUgdGhlIG5ldyBidWZmZXIgc2l6ZQorCXNpemVfdCBidWZmZXJfc2l6ZSA9ICg1ICsgKnByb2ZpbGVfc2l6ZSArIGxlbmd0aCkgKiBzaXplb2YoQllURSk7CisJYnVmZmVyID0gKEJZVEUqKW1hbGxvYyhidWZmZXJfc2l6ZSk7CisJaWYoIWJ1ZmZlcikKKwkJcmV0dXJuIE5VTEw7CisKKwkvLyBhZGQgdGhlIGhlYWRlcgorCWJ1ZmZlclswXSA9IDB4MUM7CisJYnVmZmVyWzFdID0gMHgwMjsKKwkvLyBhZGQgdGhlIHRhZyB0eXBlCisJYnVmZmVyWzJdID0gKEJZVEUpKGlkICYgMHgwMEZGKTsKKwkvLyBhZGQgdGhlIHRhZyBsZW5ndGgKKwlidWZmZXJbM10gPSAoQllURSkobGVuZ3RoID4+IDgpOworCWJ1ZmZlcls0XSA9IChCWVRFKShsZW5ndGggJiAweEZGKTsKKwkvLyBhZGQgdGhlIHRhZyB2YWx1ZQorCW1lbWNweShidWZmZXIgKyA1LCAoQllURSopdmFsdWUsIGxlbmd0aCk7CisJLy8gYXBwZW5kIHRoZSBwcmV2aW91cyBwcm9maWxlCisJaWYoTlVMTCA9PSBwcm9maWxlKQl7CisJCSpwcm9maWxlX3NpemUgPSAoNSArIGxlbmd0aCk7CisJfQorCWVsc2UgeworCQltZW1jcHkoYnVmZmVyICsgNSArIGxlbmd0aCwgcHJvZmlsZSwgKnByb2ZpbGVfc2l6ZSk7CisJCSpwcm9maWxlX3NpemUgKz0gKDUgKyBsZW5ndGgpOworCQlmcmVlKHByb2ZpbGUpOworCX0KKwkKKwlyZXR1cm4gYnVmZmVyOworfQorCisvKioKK0VuY29kZSBJUFRDIG1ldGFkYXRhIGludG8gYSBiaW5hcnkgYnVmZmVyLiAKK1RoZSBidWZmZXIgaXMgYWxsb2NhdGVkIGJ5IHRoZSBmdW5jdGlvbiBhbmQgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLiAKKyovCitCT09MIAord3JpdGVfaXB0Y19wcm9maWxlKEZJQklUTUFQICpkaWIsIEJZVEUgKipwcm9maWxlLCB1bnNpZ25lZCAqcHJvZmlsZV9zaXplKSB7CisJRklUQUcgKnRhZyA9IE5VTEw7CisJRklNRVRBREFUQSAqbWRoYW5kbGUgPSBOVUxMOworCisJQllURSAqYnVmZmVyID0gTlVMTDsKKwl1bnNpZ25lZCBidWZmZXJfc2l6ZSA9IDA7CisKKwkvLyBwYXJzZSBhbGwgSVBUQyB0YWdzIGFuZCByZWJ1aWxkIGEgSVBUQyBwcm9maWxlCisJbWRoYW5kbGUgPSBGcmVlSW1hZ2VfRmluZEZpcnN0TWV0YWRhdGEoRklNRF9JUFRDLCBkaWIsICZ0YWcpOworCisJaWYobWRoYW5kbGUpIHsKKwkJZG8geworCQkJV09SRCB0YWdfaWQJPSBGcmVlSW1hZ2VfR2V0VGFnSUQodGFnKTsKKworCQkJLy8gYXBwZW5kIHRoZSB0YWcgdG8gdGhlIHByb2ZpbGUKKworCQkJc3dpdGNoKHRhZ19pZCkgeworCQkJCWNhc2UgVEFHX1JFQ09SRF9WRVJTSU9OOgorCQkJCQkvLyBpZ25vcmUgKGFscmVhZHkgaGFuZGxlZCkKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIFRBR19TVVBQTEVNRU5UQUxfQ0FURUdPUklFUzoKKwkJCQljYXNlIFRBR19LRVlXT1JEUzoKKwkJCQkJaWYoRnJlZUltYWdlX0dldFRhZ1R5cGUodGFnKSA9PSBGSURUX0FTQ0lJKSB7CisJCQkJCQlzdGQ6OnN0cmluZyB2YWx1ZSA9IChjb25zdCBjaGFyKilGcmVlSW1hZ2VfR2V0VGFnVmFsdWUodGFnKTsKKworCQkJCQkJLy8gc3BsaXQgdGhlIHRhZyB2YWx1ZQorCQkJCQkJc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG91dHB1dDsKKwkJCQkJCXN0ZDo6c3RyaW5nIGRlbGltaXRlciA9IElQVENfREVMSU1JVEVSOwkJCisJCQkJCQkKKwkJCQkJCXNpemVfdCBvZmZzZXQgPSAwOworCQkJCQkJc2l6ZV90IGRlbGltaXRlckluZGV4ID0gMDsKKworCQkJCQkJZGVsaW1pdGVySW5kZXggPSB2YWx1ZS5maW5kKGRlbGltaXRlciwgb2Zmc2V0KTsKKwkJCQkJCXdoaWxlIChkZWxpbWl0ZXJJbmRleCAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworCQkJCQkJCW91dHB1dC5wdXNoX2JhY2sodmFsdWUuc3Vic3RyKG9mZnNldCwgZGVsaW1pdGVySW5kZXggLSBvZmZzZXQpKTsKKwkJCQkJCQlvZmZzZXQgKz0gZGVsaW1pdGVySW5kZXggLSBvZmZzZXQgKyBkZWxpbWl0ZXIubGVuZ3RoKCk7CisJCQkJCQkJZGVsaW1pdGVySW5kZXggPSB2YWx1ZS5maW5kKGRlbGltaXRlciwgb2Zmc2V0KTsKKwkJCQkJCX0KKwkJCQkJCW91dHB1dC5wdXNoX2JhY2sodmFsdWUuc3Vic3RyKG9mZnNldCkpOworCisJCQkJCQkvLyBhZGQgYXMgbWFueSB0YWdzIGFzIHRoZXJlIGFyZSBjb21tYSBzZXBhcmF0ZWQgc3RyaW5ncworCQkJCQkJZm9yKGludCBpID0gMDsgaSA8IChpbnQpb3V0cHV0LnNpemUoKTsgaSsrKSB7CisJCQkJCQkJc3RkOjpzdHJpbmcmIHRhZ192YWx1ZSA9IG91dHB1dFtpXTsKKwkJCQkJCQlidWZmZXIgPSBhcHBlbmRfaXB0Y190YWcoYnVmZmVyLCAmYnVmZmVyX3NpemUsIHRhZ19pZCwgKERXT1JEKXRhZ192YWx1ZS5sZW5ndGgoKSwgdGFnX3ZhbHVlLmNfc3RyKCkpOworCQkJCQkJfQorCisJCQkJCX0KKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIFRBR19VUkdFTkNZOgorCQkJCQlpZihGcmVlSW1hZ2VfR2V0VGFnVHlwZSh0YWcpID09IEZJRFRfQVNDSUkpIHsKKwkJCQkJCURXT1JEIGxlbmd0aCA9IDE7CS8vIGtlZXAgdGhlIGZpcnN0IG9jdGV0IG9ubHkKKwkJCQkJCWJ1ZmZlciA9IGFwcGVuZF9pcHRjX3RhZyhidWZmZXIsICZidWZmZXJfc2l6ZSwgdGFnX2lkLCBsZW5ndGgsIEZyZWVJbWFnZV9HZXRUYWdWYWx1ZSh0YWcpKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKworCQkJCWRlZmF1bHQ6CisJCQkJCWlmKEZyZWVJbWFnZV9HZXRUYWdUeXBlKHRhZykgPT0gRklEVF9BU0NJSSkgeworCQkJCQkJRFdPUkQgbGVuZ3RoID0gRnJlZUltYWdlX0dldFRhZ0xlbmd0aCh0YWcpOwkKKwkJCQkJCWJ1ZmZlciA9IGFwcGVuZF9pcHRjX3RhZyhidWZmZXIsICZidWZmZXJfc2l6ZSwgdGFnX2lkLCBsZW5ndGgsIEZyZWVJbWFnZV9HZXRUYWdWYWx1ZSh0YWcpKTsKKwkJCQkJfQkJCQkJCisJCQkJCWJyZWFrOworCQkJfQorCisJCX0gd2hpbGUoRnJlZUltYWdlX0ZpbmROZXh0TWV0YWRhdGEobWRoYW5kbGUsICZ0YWcpKTsKKwkJCisJCUZyZWVJbWFnZV9GaW5kQ2xvc2VNZXRhZGF0YShtZGhhbmRsZSk7CisKKwkJLy8gYWRkIHRoZSBEaXJlY3RvcnlWZXJzaW9uIHRhZworCQljb25zdCBzaG9ydCB2ZXJzaW9uID0gMHgwMjAwOworCQlidWZmZXIgPSBhcHBlbmRfaXB0Y190YWcoYnVmZmVyLCAmYnVmZmVyX3NpemUsIFRBR19SRUNPUkRfVkVSU0lPTiwgc2l6ZW9mKHZlcnNpb24pLCAmdmVyc2lvbik7CisJCQorCQkqcHJvZmlsZSA9IGJ1ZmZlcjsKKwkJKnByb2ZpbGVfc2l6ZSA9IGJ1ZmZlcl9zaXplOworCisJCXJldHVybiBUUlVFOworCX0KKworCXJldHVybiBGQUxTRTsKK30KZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9NZXRhZGF0YS9UYWdDb252ZXJzaW9uLmNwcCBiL2ZpbGVzL1NvdXJjZS9NZXRhZGF0YS9UYWdDb252ZXJzaW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDU4MTg2Ci0tLSAvZGV2L251bGwKKysrIGIvZmlsZXMvU291cmNlL01ldGFkYXRhL1RhZ0NvbnZlcnNpb24uY3BwCkBAIC0wLDAgKzEsMTA5NCBAQAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gVGFnIHRvIHN0cmluZyBjb252ZXJzaW9uIGZ1bmN0aW9ucworLy8KKy8vIERlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gYnkKKy8vIC0gSGVydukgRHJvbG9uIDxkcm9sb25AaW5mb25pZS5mcj4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBGcmVlSW1hZ2UgMworLy8KKy8vIENPVkVSRUQgQ09ERSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWQorLy8gT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMKKy8vIFRIQVQgVEhFIENPVkVSRUQgQ09ERSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLy8gT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQKKy8vIENPREUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkgQ09WRVJFRCBDT0RFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QKKy8vIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZCisvLyBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMCisvLyBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GIEFOWSBDT1ZFUkVEIENPREUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSCisvLyBUSElTIERJU0NMQUlNRVIuCisvLworLy8gVXNlIGF0IHlvdXIgb3duIHJpc2shCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpZmRlZiBfTVNDX1ZFUiAKKyNwcmFnbWEgd2FybmluZyAoZGlzYWJsZSA6IDQ3ODYpIC8vIGlkZW50aWZpZXIgd2FzIHRydW5jYXRlZCB0byAnbnVtYmVyJyBjaGFyYWN0ZXJzCisjZW5kaWYKKworI2luY2x1ZGUgIkZyZWVJbWFnZS5oIgorI2luY2x1ZGUgIlV0aWxpdGllcy5oIgorI2luY2x1ZGUgIkZyZWVJbWFnZVRhZy5oIgorI2luY2x1ZGUgIkZJUmF0aW9uYWwuaCIKKworI2RlZmluZSBNQVhfVEVYVF9FWFRFTlQJNTEyCisKKy8qKgorQ29udmVydCBhIHRhZyB0byBhIEMgc3RyaW5nCisqLworc3RhdGljIGNvbnN0IGNoYXIqIAorQ29udmVydEFueVRhZyhGSVRBRyAqdGFnKSB7CisJY2hhciBmb3JtYXRbTUFYX1RFWFRfRVhURU5UXTsKKwlzdGF0aWMgc3RkOjpzdHJpbmcgYnVmZmVyOworCURXT1JEIGk7CisKKwlpZighdGFnKQorCQlyZXR1cm4gTlVMTDsKKworCWJ1ZmZlci5lcmFzZSgpOworCQorCS8vIGNvbnZlcnQgdGhlIHRhZyB2YWx1ZSB0byBhIHN0cmluZyBidWZmZXIKKworCUZSRUVfSU1BR0VfTURUWVBFIHRhZ190eXBlID0gRnJlZUltYWdlX0dldFRhZ1R5cGUodGFnKTsKKwlEV09SRCB0YWdfY291bnQgPSBGcmVlSW1hZ2VfR2V0VGFnQ291bnQodGFnKTsKKworCXN3aXRjaCh0YWdfdHlwZSkgeworCQljYXNlIEZJRFRfQllURToJCS8vIE4geCA4LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIAorCQl7CisJCQlCWVRFICpwdmFsdWUgPSAoQllURSopRnJlZUltYWdlX0dldFRhZ1ZhbHVlKHRhZyk7CisKKwkJCXNwcmludGYoZm9ybWF0LCAiJWxkIiwJKExPTkcpIHB2YWx1ZVswXSk7CisJCQlidWZmZXIgKz0gZm9ybWF0OworCQkJZm9yKGkgPSAxOyBpIDwgdGFnX2NvdW50OyBpKyspIHsKKwkJCQlzcHJpbnRmKGZvcm1hdCwgIiAlbGQiLAkoTE9ORykgcHZhbHVlW2ldKTsKKwkJCQlidWZmZXIgKz0gZm9ybWF0OworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBGSURUX1NIT1JUOgkvLyBOIHggMTYtYml0IHVuc2lnbmVkIGludGVnZXIgCisJCXsKKwkJCXVuc2lnbmVkIHNob3J0ICpwdmFsdWUgPSAodW5zaWduZWQgc2hvcnQgKilGcmVlSW1hZ2VfR2V0VGFnVmFsdWUodGFnKTsKKworCQkJc3ByaW50Zihmb3JtYXQsICIlaHUiLCBwdmFsdWVbMF0pOworCQkJYnVmZmVyICs9IGZvcm1hdDsKKwkJCWZvcihpID0gMTsgaSA8IHRhZ19jb3VudDsgaSsrKSB7CisJCQkJc3ByaW50Zihmb3JtYXQsICIgJWh1IiwJcHZhbHVlW2ldKTsKKwkJCQlidWZmZXIgKz0gZm9ybWF0OworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBGSURUX0xPTkc6CQkvLyBOIHggMzItYml0IHVuc2lnbmVkIGludGVnZXIgCisJCXsKKwkJCURXT1JEICpwdmFsdWUgPSAoRFdPUkQgKilGcmVlSW1hZ2VfR2V0VGFnVmFsdWUodGFnKTsKKworCQkJc3ByaW50Zihmb3JtYXQsICIlbHUiLCBwdmFsdWVbMF0pOworCQkJYnVmZmVyICs9IGZvcm1hdDsKKwkJCWZvcihpID0gMTsgaSA8IHRhZ19jb3VudDsgaSsrKSB7CisJCQkJc3ByaW50Zihmb3JtYXQsICIgJWx1IiwJcHZhbHVlW2ldKTsKKwkJCQlidWZmZXIgKz0gZm9ybWF0OworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBGSURUX1JBVElPTkFMOiAvLyBOIHggNjQtYml0IHVuc2lnbmVkIGZyYWN0aW9uIAorCQl7CisJCQlEV09SRCAqcHZhbHVlID0gKERXT1JEKilGcmVlSW1hZ2VfR2V0VGFnVmFsdWUodGFnKTsKKworCQkJc3ByaW50Zihmb3JtYXQsICIlbGQvJWxkIiwgcHZhbHVlWzBdLCBwdmFsdWVbMV0pOworCQkJYnVmZmVyICs9IGZvcm1hdDsKKwkJCWZvcihpID0gMTsgaSA8IHRhZ19jb3VudDsgaSsrKSB7CisJCQkJc3ByaW50Zihmb3JtYXQsICIgJWxkLyVsZCIsIHB2YWx1ZVsyKmldLCBwdmFsdWVbMippKzFdKTsKKwkJCQlidWZmZXIgKz0gZm9ybWF0OworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBGSURUX1NCWVRFOgkvLyBOIHggOC1iaXQgc2lnbmVkIGludGVnZXIgCisJCXsKKwkJCWNoYXIgKnB2YWx1ZSA9IChjaGFyKilGcmVlSW1hZ2VfR2V0VGFnVmFsdWUodGFnKTsKKworCQkJc3ByaW50Zihmb3JtYXQsICIlbGQiLAkoTE9ORykgcHZhbHVlWzBdKTsKKwkJCWJ1ZmZlciArPSBmb3JtYXQ7CisJCQlmb3IoaSA9IDE7IGkgPCB0YWdfY291bnQ7IGkrKykgeworCQkJCXNwcmludGYoZm9ybWF0LCAiICVsZCIsCShMT05HKSBwdmFsdWVbaV0pOworCQkJCWJ1ZmZlciArPSBmb3JtYXQ7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQljYXNlIEZJRFRfU1NIT1JUOgkvLyBOIHggMTYtYml0IHNpZ25lZCBpbnRlZ2VyIAorCQl7CisJCQlzaG9ydCAqcHZhbHVlID0gKHNob3J0ICopRnJlZUltYWdlX0dldFRhZ1ZhbHVlKHRhZyk7CisKKwkJCXNwcmludGYoZm9ybWF0LCAiJWhkIiwgcHZhbHVlWzBdKTsKKwkJCWJ1ZmZlciArPSBmb3JtYXQ7CisJCQlmb3IoaSA9IDE7IGkgPCB0YWdfY291bnQ7IGkrKykgeworCQkJCXNwcmludGYoZm9ybWF0LCAiICVoZCIsCXB2YWx1ZVtpXSk7CisJCQkJYnVmZmVyICs9IGZvcm1hdDsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWNhc2UgRklEVF9TTE9ORzoJLy8gTiB4IDMyLWJpdCBzaWduZWQgaW50ZWdlciAKKwkJeworCQkJTE9ORyAqcHZhbHVlID0gKExPTkcgKilGcmVlSW1hZ2VfR2V0VGFnVmFsdWUodGFnKTsKKworCQkJc3ByaW50Zihmb3JtYXQsICIlbGQiLCBwdmFsdWVbMF0pOworCQkJYnVmZmVyICs9IGZvcm1hdDsKKwkJCWZvcihpID0gMTsgaSA8IHRhZ19jb3VudDsgaSsrKSB7CisJCQkJc3ByaW50Zihmb3JtYXQsICIgJWxkIiwJcHZhbHVlW2ldKTsKKwkJCQlidWZmZXIgKz0gZm9ybWF0OworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBGSURUX1NSQVRJT05BTDovLyBOIHggNjQtYml0IHNpZ25lZCBmcmFjdGlvbiAKKwkJeworCQkJTE9ORyAqcHZhbHVlID0gKExPTkcqKUZyZWVJbWFnZV9HZXRUYWdWYWx1ZSh0YWcpOworCisJCQlzcHJpbnRmKGZvcm1hdCwgIiVsZC8lbGQiLCBwdmFsdWVbMF0sIHB2YWx1ZVsxXSk7CisJCQlidWZmZXIgKz0gZm9ybWF0OworCQkJZm9yKGkgPSAxOyBpIDwgdGFnX2NvdW50OyBpKyspIHsKKwkJCQlzcHJpbnRmKGZvcm1hdCwgIiAlbGQvJWxkIiwgcHZhbHVlWzIqaV0sIHB2YWx1ZVsyKmkrMV0pOworCQkJCWJ1ZmZlciArPSBmb3JtYXQ7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQljYXNlIEZJRFRfRkxPQVQ6CS8vIE4geCAzMi1iaXQgSUVFRSBmbG9hdGluZyBwb2ludCAKKwkJeworCQkJZmxvYXQgKnB2YWx1ZSA9IChmbG9hdCAqKUZyZWVJbWFnZV9HZXRUYWdWYWx1ZSh0YWcpOworCisJCQlzcHJpbnRmKGZvcm1hdCwgIiVmIiwgKGRvdWJsZSkgcHZhbHVlWzBdKTsKKwkJCWJ1ZmZlciArPSBmb3JtYXQ7CisJCQlmb3IoaSA9IDE7IGkgPCB0YWdfY291bnQ7IGkrKykgeworCQkJCXNwcmludGYoZm9ybWF0LCAiJWYiLCAoZG91YmxlKSBwdmFsdWVbaV0pOworCQkJCWJ1ZmZlciArPSBmb3JtYXQ7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQljYXNlIEZJRFRfRE9VQkxFOgkvLyBOIHggNjQtYml0IElFRUUgZmxvYXRpbmcgcG9pbnQgCisJCXsKKwkJCWRvdWJsZSAqcHZhbHVlID0gKGRvdWJsZSAqKUZyZWVJbWFnZV9HZXRUYWdWYWx1ZSh0YWcpOworCisJCQlzcHJpbnRmKGZvcm1hdCwgIiVmIiwgcHZhbHVlWzBdKTsKKwkJCWJ1ZmZlciArPSBmb3JtYXQ7CisJCQlmb3IoaSA9IDE7IGkgPCB0YWdfY291bnQ7IGkrKykgeworCQkJCXNwcmludGYoZm9ybWF0LCAiJWYiLCBwdmFsdWVbaV0pOworCQkJCWJ1ZmZlciArPSBmb3JtYXQ7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQljYXNlIEZJRFRfSUZEOgkJLy8gTiB4IDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyIChvZmZzZXQpIAorCQl7CisJCQlEV09SRCAqcHZhbHVlID0gKERXT1JEICopRnJlZUltYWdlX0dldFRhZ1ZhbHVlKHRhZyk7CisKKwkJCXNwcmludGYoZm9ybWF0LCAiJVgiLCBwdmFsdWVbMF0pOworCQkJYnVmZmVyICs9IGZvcm1hdDsKKwkJCWZvcihpID0gMTsgaSA8IHRhZ19jb3VudDsgaSsrKSB7CisJCQkJc3ByaW50Zihmb3JtYXQsICIgJVgiLAlwdmFsdWVbaV0pOworCQkJCWJ1ZmZlciArPSBmb3JtYXQ7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQljYXNlIEZJRFRfUEFMRVRURToJLy8gTiB4IDMyLWJpdCBSR0JRVUFEIAorCQl7CisJCQlSR0JRVUFEICpwdmFsdWUgPSAoUkdCUVVBRCAqKUZyZWVJbWFnZV9HZXRUYWdWYWx1ZSh0YWcpOworCisJCQlzcHJpbnRmKGZvcm1hdCwgIiglZCwlZCwlZCwlZCkiLCBwdmFsdWVbMF0ucmdiUmVkLCBwdmFsdWVbMF0ucmdiR3JlZW4sIHB2YWx1ZVswXS5yZ2JCbHVlLCBwdmFsdWVbMF0ucmdiUmVzZXJ2ZWQpOworCQkJYnVmZmVyICs9IGZvcm1hdDsKKwkJCWZvcihpID0gMTsgaSA8IHRhZ19jb3VudDsgaSsrKSB7CisJCQkJc3ByaW50Zihmb3JtYXQsICIgKCVkLCVkLCVkLCVkKSIsIHB2YWx1ZVtpXS5yZ2JSZWQsIHB2YWx1ZVtpXS5yZ2JHcmVlbiwgcHZhbHVlW2ldLnJnYkJsdWUsIHB2YWx1ZVtpXS5yZ2JSZXNlcnZlZCk7CisJCQkJYnVmZmVyICs9IGZvcm1hdDsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCQorCQljYXNlIEZJRFRfTE9ORzg6CS8vIE4geCA2NC1iaXQgdW5zaWduZWQgaW50ZWdlciAKKwkJeworCQkJVUlOVDY0ICpwdmFsdWUgPSAoVUlOVDY0ICopRnJlZUltYWdlX0dldFRhZ1ZhbHVlKHRhZyk7CisKKwkJCXNwcmludGYoZm9ybWF0LCAiJWxkIiwgcHZhbHVlWzBdKTsKKwkJCWJ1ZmZlciArPSBmb3JtYXQ7CisJCQlmb3IoaSA9IDE7IGkgPCB0YWdfY291bnQ7IGkrKykgeworCQkJCXNwcmludGYoZm9ybWF0LCAiJWxkIiwgcHZhbHVlW2ldKTsKKwkJCQlidWZmZXIgKz0gZm9ybWF0OworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQljYXNlIEZJRFRfSUZEODoJCS8vIE4geCA2NC1iaXQgdW5zaWduZWQgaW50ZWdlciAob2Zmc2V0KQorCQl7CisJCQlVSU5UNjQgKnB2YWx1ZSA9IChVSU5UNjQgKilGcmVlSW1hZ2VfR2V0VGFnVmFsdWUodGFnKTsKKworCQkJc3ByaW50Zihmb3JtYXQsICIlWCIsIHB2YWx1ZVswXSk7CisJCQlidWZmZXIgKz0gZm9ybWF0OworCQkJZm9yKGkgPSAxOyBpIDwgdGFnX2NvdW50OyBpKyspIHsKKwkJCQlzcHJpbnRmKGZvcm1hdCwgIiVYIiwgcHZhbHVlW2ldKTsKKwkJCQlidWZmZXIgKz0gZm9ybWF0OworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQljYXNlIEZJRFRfU0xPTkc4OgkvLyBOIHggNjQtYml0IHNpZ25lZCBpbnRlZ2VyCisJCXsKKwkJCUlOVDY0ICpwdmFsdWUgPSAoSU5UNjQgKilGcmVlSW1hZ2VfR2V0VGFnVmFsdWUodGFnKTsKKworCQkJc3ByaW50Zihmb3JtYXQsICIlbGQiLCBwdmFsdWVbMF0pOworCQkJYnVmZmVyICs9IGZvcm1hdDsKKwkJCWZvcihpID0gMTsgaSA8IHRhZ19jb3VudDsgaSsrKSB7CisJCQkJc3ByaW50Zihmb3JtYXQsICIlbGQiLCBwdmFsdWVbaV0pOworCQkJCWJ1ZmZlciArPSBmb3JtYXQ7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgRklEVF9BU0NJSToJLy8gOC1iaXQgYnl0ZXMgdy8gbGFzdCBieXRlIG51bGwgCisJCWNhc2UgRklEVF9VTkRFRklORUQ6Ly8gOC1iaXQgdW50eXBlZCBkYXRhIAorCQlkZWZhdWx0OgorCQl7CisJCQlpbnQgbWF4X3NpemUgPSBNSU4oKGludClGcmVlSW1hZ2VfR2V0VGFnTGVuZ3RoKHRhZyksIChpbnQpTUFYX1RFWFRfRVhURU5UKTsKKwkJCWlmKG1heF9zaXplID09IE1BWF9URVhUX0VYVEVOVCkKKwkJCQltYXhfc2l6ZS0tOworCQkJbWVtY3B5KGZvcm1hdCwgKGNoYXIqKUZyZWVJbWFnZV9HZXRUYWdWYWx1ZSh0YWcpLCBtYXhfc2l6ZSk7CisJCQlmb3JtYXRbbWF4X3NpemVdID0gJ1wwJzsKKwkJCWJ1ZmZlciArPSBmb3JtYXQ7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiBidWZmZXIuY19zdHIoKTsKK30KKworLyoqCitDb252ZXJ0IGEgRXhpZiB0YWcgdG8gYSBDIHN0cmluZworKi8KK3N0YXRpYyBjb25zdCBjaGFyKiAKK0NvbnZlcnRFeGlmVGFnKEZJVEFHICp0YWcpIHsKKwljaGFyIGZvcm1hdFtNQVhfVEVYVF9FWFRFTlRdOworCXN0YXRpYyBzdGQ6OnN0cmluZyBidWZmZXI7CisKKwlpZighdGFnKQorCQlyZXR1cm4gTlVMTDsKKworCWJ1ZmZlci5lcmFzZSgpOworCisJLy8gY29udmVydCB0aGUgdGFnIHZhbHVlIHRvIGEgc3RyaW5nIGJ1ZmZlcgorCisJc3dpdGNoKEZyZWVJbWFnZV9HZXRUYWdJRCh0YWcpKSB7CisJCWNhc2UgVEFHX09SSUVOVEFUSU9OOgorCQl7CisJCQl1bnNpZ25lZCBzaG9ydCBvcmllbnRhdGlvbiA9ICooKHVuc2lnbmVkIHNob3J0ICopRnJlZUltYWdlX0dldFRhZ1ZhbHVlKHRhZykpOworCQkJc3dpdGNoIChvcmllbnRhdGlvbikgeworCQkJCWNhc2UgMToKKwkJCQkJcmV0dXJuICJ0b3AsIGxlZnQgc2lkZSI7CisJCQkJY2FzZSAyOgorCQkJCQlyZXR1cm4gInRvcCwgcmlnaHQgc2lkZSI7CisJCQkJY2FzZSAzOgorCQkJCQlyZXR1cm4gImJvdHRvbSwgcmlnaHQgc2lkZSI7CisJCQkJY2FzZSA0OgorCQkJCQlyZXR1cm4gImJvdHRvbSwgbGVmdCBzaWRlIjsKKwkJCQljYXNlIDU6CisJCQkJCXJldHVybiAibGVmdCBzaWRlLCB0b3AiOworCQkJCWNhc2UgNjoKKwkJCQkJcmV0dXJuICJyaWdodCBzaWRlLCB0b3AiOworCQkJCWNhc2UgNzoKKwkJCQkJcmV0dXJuICJyaWdodCBzaWRlLCBib3R0b20iOworCQkJCWNhc2UgODoKKwkJCQkJcmV0dXJuICJsZWZ0IHNpZGUsIGJvdHRvbSI7CisJCQkJZGVmYXVsdDoKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSBUQUdfUkVGRVJFTkNFX0JMQUNLX1dISVRFOgorCQl7CisJCQlEV09SRCAqcHZhbHVlID0gKERXT1JEKilGcmVlSW1hZ2VfR2V0VGFnVmFsdWUodGFnKTsKKwkJCWlmKEZyZWVJbWFnZV9HZXRUYWdMZW5ndGgodGFnKSA9PSA0OCkgeworCQkJCS8vIHJlZmVyZW5jZSBibGFjayBwb2ludCB2YWx1ZSBhbmQgcmVmZXJlbmNlIHdoaXRlIHBvaW50IHZhbHVlIChSZWZlcmVuY2VCbGFja1doaXRlKQorCQkJCWludCBibGFja1IgPSAwLCB3aGl0ZVIgPSAwLCBibGFja0cgPSAwLCB3aGl0ZUcgPSAwLCBibGFja0IgPSAwLCB3aGl0ZUIgPSAwOworCQkJCWlmKHB2YWx1ZVsxXSkKKwkJCQkJYmxhY2tSID0gKGludCkocHZhbHVlWzBdIC8gcHZhbHVlWzFdKTsKKwkJCQlpZihwdmFsdWVbM10pCisJCQkJCXdoaXRlUiA9IChpbnQpKHB2YWx1ZVsyXSAvIHB2YWx1ZVszXSk7CisJCQkJaWYocHZhbHVlWzVdKQorCQkJCQlibGFja0cgPSAoaW50KShwdmFsdWVbNF0gLyBwdmFsdWVbNV0pOworCQkJCWlmKHB2YWx1ZVs3XSkKKwkJCQkJd2hpdGVHID0gKGludCkocHZhbHVlWzZdIC8gcHZhbHVlWzddKTsKKwkJCQlpZihwdmFsdWVbOV0pCisJCQkJCWJsYWNrQiA9IChpbnQpKHB2YWx1ZVs4XSAvIHB2YWx1ZVs5XSk7CisJCQkJaWYocHZhbHVlWzExXSkKKwkJCQkJd2hpdGVCID0gKGludCkocHZhbHVlWzEwXSAvIHB2YWx1ZVsxMV0pOworCisJCQkJc3ByaW50Zihmb3JtYXQsICJbJWQsJWQsJWRdIFslZCwlZCwlZF0iLCBibGFja1IsIGJsYWNrRywgYmxhY2tCLCB3aGl0ZVIsIHdoaXRlRywgd2hpdGVCKTsKKwkJCQlidWZmZXIgKz0gZm9ybWF0OworCQkJCXJldHVybiBidWZmZXIuY19zdHIoKTsKKwkJCX0KKworCQl9CisJCWJyZWFrOworCisJCWNhc2UgVEFHX0NPTE9SX1NQQUNFOgorCQl7CisJCQl1bnNpZ25lZCBzaG9ydCBjb2xvclNwYWNlID0gKigodW5zaWduZWQgc2hvcnQgKilGcmVlSW1hZ2VfR2V0VGFnVmFsdWUodGFnKSk7CisJCQlpZiAoY29sb3JTcGFjZSA9PSAxKSB7CisJCQkJcmV0dXJuICJzUkdCIjsKKwkJCX0gZWxzZSBpZiAoY29sb3JTcGFjZSA9PSA2NTUzNSkgeworCQkJCXJldHVybiAiVW5kZWZpbmVkIjsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuICJVbmtub3duIjsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCQljYXNlIFRBR19DT01QT05FTlRTX0NPTkZJR1VSQVRJT046CisJCXsKKwkJCWNvbnN0IGNoYXIgKmNvbXBvbmVudFN0cmluZ3NbN10gPSB7IiIsICJZIiwgIkNiIiwgIkNyIiwgIlIiLCAiRyIsICJCIn07CisJCQlCWVRFICpwdmFsdWUgPSAoQllURSopRnJlZUltYWdlX0dldFRhZ1ZhbHVlKHRhZyk7CisJCQlmb3IoRFdPUkQgaSA9IDA7IGkgPCBNSU4oKERXT1JEKTQsIEZyZWVJbWFnZV9HZXRUYWdDb3VudCh0YWcpKTsgaSsrKSB7CisJCQkJaW50IGogPSBwdmFsdWVbaV07CisJCQkJaWYoaiA+IDAgJiYgaiA8IDcpCisJCQkJCWJ1ZmZlciArPSBjb21wb25lbnRTdHJpbmdzW2pdOworCQkJfQorCQkJcmV0dXJuIGJ1ZmZlci5jX3N0cigpOworCQl9CisJCWJyZWFrOworCisJCWNhc2UgVEFHX0NPTVBSRVNTRURfQklUU19QRVJfUElYRUw6CisJCXsKKwkJCUZJUmF0aW9uYWwgcih0YWcpOworCQkJYnVmZmVyID0gci50b1N0cmluZygpOworCQkJaWYoYnVmZmVyID09ICIxIikKKwkJCQlidWZmZXIgKz0gIiBiaXQvcGl4ZWwiOworCQkJZWxzZSAKKwkJCQlidWZmZXIgKz0gIiBiaXRzL3BpeGVsIjsKKwkJCXJldHVybiBidWZmZXIuY19zdHIoKTsKKwkJfQorCQlicmVhazsKKworCQljYXNlIFRBR19YX1JFU09MVVRJT046CisJCWNhc2UgVEFHX1lfUkVTT0xVVElPTjoKKwkJY2FzZSBUQUdfRk9DQUxfUExBTkVfWF9SRVM6CisJCWNhc2UgVEFHX0ZPQ0FMX1BMQU5FX1lfUkVTOgorCQljYXNlIFRBR19CUklHSFRORVNTX1ZBTFVFOgorCQljYXNlIFRBR19FWFBPU1VSRV9CSUFTX1ZBTFVFOgorCQl7CisJCQlGSVJhdGlvbmFsIHIodGFnKTsKKwkJCWJ1ZmZlciA9IHIudG9TdHJpbmcoKTsKKwkJCXJldHVybiBidWZmZXIuY19zdHIoKTsKKwkJfQorCQlicmVhazsKKworCQljYXNlIFRBR19SRVNPTFVUSU9OX1VOSVQ6CisJCWNhc2UgVEFHX0ZPQ0FMX1BMQU5FX1VOSVQ6CisJCXsKKwkJCXVuc2lnbmVkIHNob3J0IHJlc29sdXRpb25Vbml0ID0gKigodW5zaWduZWQgc2hvcnQgKilGcmVlSW1hZ2VfR2V0VGFnVmFsdWUodGFnKSk7CisJCQlzd2l0Y2ggKHJlc29sdXRpb25Vbml0KSB7CisJCQkJY2FzZSAxOgorCQkJCQlyZXR1cm4gIihObyB1bml0KSI7CisJCQkJY2FzZSAyOgorCQkJCQlyZXR1cm4gImluY2hlcyI7CisJCQkJY2FzZSAzOgorCQkJCQlyZXR1cm4gImNtIjsKKwkJCQlkZWZhdWx0OgorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCQljYXNlIFRBR19ZQ0JDUl9QT1NJVElPTklORzoKKwkJeworCQkJdW5zaWduZWQgc2hvcnQgeUNiQ3JQb3NpdGlvbiA9ICooKHVuc2lnbmVkIHNob3J0ICopRnJlZUltYWdlX0dldFRhZ1ZhbHVlKHRhZykpOworCQkJc3dpdGNoICh5Q2JDclBvc2l0aW9uKSB7CisJCQkJY2FzZSAxOgorCQkJCQlyZXR1cm4gIkNlbnRlciBvZiBwaXhlbCBhcnJheSI7CisJCQkJY2FzZSAyOgorCQkJCQlyZXR1cm4gIkRhdHVtIHBvaW50IjsKKwkJCQlkZWZhdWx0OgorCQkJCQlicmVhazsKKwkJCX0KKwkJfSAKKwkJYnJlYWs7CisKKwkJY2FzZSBUQUdfRVhQT1NVUkVfVElNRToKKwkJeworCQkJRklSYXRpb25hbCByKHRhZyk7CisJCQlidWZmZXIgPSByLnRvU3RyaW5nKCk7CisJCQlidWZmZXIgKz0gIiBzZWMiOworCQkJcmV0dXJuIGJ1ZmZlci5jX3N0cigpOworCQl9CisJCWJyZWFrOworCisJCWNhc2UgVEFHX1NIVVRURVJfU1BFRURfVkFMVUU6CisJCXsKKwkJCUZJUmF0aW9uYWwgcih0YWcpOworCQkJTE9ORyBhcGV4VmFsdWUgPSByLmxvbmdWYWx1ZSgpOworCQkJTE9ORyBhcGV4UG93ZXIgPSAxIDw8IGFwZXhWYWx1ZTsKKwkJCXNwcmludGYoZm9ybWF0LCAiMS8lZCBzZWMiLCAoaW50KWFwZXhQb3dlcik7CisJCQlidWZmZXIgKz0gZm9ybWF0OworCQkJcmV0dXJuIGJ1ZmZlci5jX3N0cigpOworCQl9CisJCWJyZWFrOworCisJCWNhc2UgVEFHX0FQRVJUVVJFX1ZBTFVFOgorCQljYXNlIFRBR19NQVhfQVBFUlRVUkVfVkFMVUU6CisJCXsKKwkJCUZJUmF0aW9uYWwgcih0YWcpOworCQkJZG91YmxlIGFwZXJ0dXJlQXBleCA9IHIuZG91YmxlVmFsdWUoKTsKKwkgICAgICAgIGRvdWJsZSByb290VHdvID0gc3FydCgoZG91YmxlKTIpOworCQkJZG91YmxlIGZTdG9wID0gcG93KHJvb3RUd28sIGFwZXJ0dXJlQXBleCk7CisJCQlzcHJpbnRmKGZvcm1hdCwgIkYlLjFmIiwgZlN0b3ApOworCQkJYnVmZmVyICs9IGZvcm1hdDsKKwkJCXJldHVybiBidWZmZXIuY19zdHIoKTsKKwkJfQorCQlicmVhazsKKworCQljYXNlIFRBR19GTlVNQkVSOgorCQl7CisJCQlGSVJhdGlvbmFsIHIodGFnKTsKKwkJCWRvdWJsZSBmbnVtYmVyID0gci5kb3VibGVWYWx1ZSgpOworCQkJc3ByaW50Zihmb3JtYXQsICJGJS4xZiIsIGZudW1iZXIpOworCQkJYnVmZmVyICs9IGZvcm1hdDsKKwkJCXJldHVybiBidWZmZXIuY19zdHIoKTsKKwkJfQorCQlicmVhazsKKworCQljYXNlIFRBR19GT0NBTF9MRU5HVEg6CisJCXsKKwkJCUZJUmF0aW9uYWwgcih0YWcpOworCQkJZG91YmxlIGZvY2FsTGVuZ3RoID0gci5kb3VibGVWYWx1ZSgpOworCQkJc3ByaW50Zihmb3JtYXQsICIlLjFmIG1tIiwgZm9jYWxMZW5ndGgpOworCQkJYnVmZmVyICs9IGZvcm1hdDsKKwkJCXJldHVybiBidWZmZXIuY19zdHIoKTsKKwkJfQorCQlicmVhazsKKworCQljYXNlIFRBR19GT0NBTF9MRU5HVEhfSU5fMzVNTV9GSUxNOgorCQl7CisJCQl1bnNpZ25lZCBzaG9ydCBmb2NhbExlbmd0aCA9ICooKHVuc2lnbmVkIHNob3J0ICopRnJlZUltYWdlX0dldFRhZ1ZhbHVlKHRhZykpOworCQkJc3ByaW50Zihmb3JtYXQsICIlaHUgbW0iLCBmb2NhbExlbmd0aCk7CisJCQlidWZmZXIgKz0gZm9ybWF0OworCQkJcmV0dXJuIGJ1ZmZlci5jX3N0cigpOworCQl9CisJCWJyZWFrOworCisJCWNhc2UgVEFHX0ZMQVNIOgorCQl7CisJCQl1bnNpZ25lZCBzaG9ydCBmbGFzaCA9ICooKHVuc2lnbmVkIHNob3J0ICopRnJlZUltYWdlX0dldFRhZ1ZhbHVlKHRhZykpOworCQkJc3dpdGNoKGZsYXNoKSB7CisJCQkJY2FzZSAweDAwMDA6CisJCQkJCXJldHVybiAiRmxhc2ggZGlkIG5vdCBmaXJlIjsKKwkJCQljYXNlIDB4MDAwMToKKwkJCQkJcmV0dXJuICJGbGFzaCBmaXJlZCI7CisJCQkJY2FzZSAweDAwMDU6CisJCQkJCXJldHVybiAiU3Ryb2JlIHJldHVybiBsaWdodCBub3QgZGV0ZWN0ZWQiOworCQkJCWNhc2UgMHgwMDA3OgorCQkJCQlyZXR1cm4gIlN0cm9iZSByZXR1cm4gbGlnaHQgZGV0ZWN0ZWQiOworCQkJCWNhc2UgMHgwMDA5OgorCQkJCQlyZXR1cm4gIkZsYXNoIGZpcmVkLCBjb21wdWxzb3J5IGZsYXNoIG1vZGUiOworCQkJCWNhc2UgMHgwMDBEOgorCQkJCQlyZXR1cm4gIkZsYXNoIGZpcmVkLCBjb21wdWxzb3J5IGZsYXNoIG1vZGUsIHJldHVybiBsaWdodCBub3QgZGV0ZWN0ZWQiOworCQkJCWNhc2UgMHgwMDBGOgorCQkJCQlyZXR1cm4gIkZsYXNoIGZpcmVkLCBjb21wdWxzb3J5IGZsYXNoIG1vZGUsIHJldHVybiBsaWdodCBkZXRlY3RlZCI7CisJCQkJY2FzZSAweDAwMTA6CisJCQkJCXJldHVybiAiRmxhc2ggZGlkIG5vdCBmaXJlLCBjb21wdWxzb3J5IGZsYXNoIG1vZGUiOworCQkJCWNhc2UgMHgwMDE4OgorCQkJCQlyZXR1cm4gIkZsYXNoIGRpZCBub3QgZmlyZSwgYXV0byBtb2RlIjsKKwkJCQljYXNlIDB4MDAxOToKKwkJCQkJcmV0dXJuICJGbGFzaCBmaXJlZCwgYXV0byBtb2RlIjsKKwkJCQljYXNlIDB4MDAxRDoKKwkJCQkJcmV0dXJuICJGbGFzaCBmaXJlZCwgYXV0byBtb2RlLCByZXR1cm4gbGlnaHQgbm90IGRldGVjdGVkIjsKKwkJCQljYXNlIDB4MDAxRjoKKwkJCQkJcmV0dXJuICJGbGFzaCBmaXJlZCwgYXV0byBtb2RlLCByZXR1cm4gbGlnaHQgZGV0ZWN0ZWQiOworCQkJCWNhc2UgMHgwMDIwOgorCQkJCQlyZXR1cm4gIk5vIGZsYXNoIGZ1bmN0aW9uIjsKKwkJCQljYXNlIDB4MDA0MToKKwkJCQkJcmV0dXJuICJGbGFzaCBmaXJlZCwgcmVkLWV5ZSByZWR1Y3Rpb24gbW9kZSI7CisJCQkJY2FzZSAweDAwNDU6CisJCQkJCXJldHVybiAiRmxhc2ggZmlyZWQsIHJlZC1leWUgcmVkdWN0aW9uIG1vZGUsIHJldHVybiBsaWdodCBub3QgZGV0ZWN0ZWQiOworCQkJCWNhc2UgMHgwMDQ3OgorCQkJCQlyZXR1cm4gIkZsYXNoIGZpcmVkLCByZWQtZXllIHJlZHVjdGlvbiBtb2RlLCByZXR1cm4gbGlnaHQgZGV0ZWN0ZWQiOworCQkJCWNhc2UgMHgwMDQ5OgorCQkJCQlyZXR1cm4gIkZsYXNoIGZpcmVkLCBjb21wdWxzb3J5IGZsYXNoIG1vZGUsIHJlZC1leWUgcmVkdWN0aW9uIG1vZGUiOworCQkJCWNhc2UgMHgwMDREOgorCQkJCQlyZXR1cm4gIkZsYXNoIGZpcmVkLCBjb21wdWxzb3J5IGZsYXNoIG1vZGUsIHJlZC1leWUgcmVkdWN0aW9uIG1vZGUsIHJldHVybiBsaWdodCBub3QgZGV0ZWN0ZWQiOworCQkJCWNhc2UgMHgwMDRGOgorCQkJCQlyZXR1cm4gIkZsYXNoIGZpcmVkLCBjb21wdWxzb3J5IGZsYXNoIG1vZGUsIHJlZC1leWUgcmVkdWN0aW9uIG1vZGUsIHJldHVybiBsaWdodCBkZXRlY3RlZCI7CisJCQkJY2FzZSAweDAwNTk6CisJCQkJCXJldHVybiAiRmxhc2ggZmlyZWQsIGF1dG8gbW9kZSwgcmVkLWV5ZSByZWR1Y3Rpb24gbW9kZSI7CisJCQkJY2FzZSAweDAwNUQ6CisJCQkJCXJldHVybiAiRmxhc2ggZmlyZWQsIGF1dG8gbW9kZSwgcmV0dXJuIGxpZ2h0IG5vdCBkZXRlY3RlZCwgcmVkLWV5ZSByZWR1Y3Rpb24gbW9kZSI7CisJCQkJY2FzZSAweDAwNUY6CisJCQkJCXJldHVybiAiRmxhc2ggZmlyZWQsIGF1dG8gbW9kZSwgcmV0dXJuIGxpZ2h0IGRldGVjdGVkLCByZWQtZXllIHJlZHVjdGlvbiBtb2RlIjsKKwkJCQlkZWZhdWx0OgorCQkJCQlzcHJpbnRmKGZvcm1hdCwgIlVua25vd24gKCVkKSIsIGZsYXNoKTsKKwkJCQkJYnVmZmVyICs9IGZvcm1hdDsKKwkJCQkJcmV0dXJuIGJ1ZmZlci5jX3N0cigpOworCQkJfQorCQl9CisJCWJyZWFrOworCisJCWNhc2UgVEFHX1NDRU5FX1RZUEU6CisJCXsKKwkJCUJZVEUgc2NlbmVUeXBlID0gKigoQllURSopRnJlZUltYWdlX0dldFRhZ1ZhbHVlKHRhZykpOworCQkJaWYgKHNjZW5lVHlwZSA9PSAxKSB7CisJCQkJcmV0dXJuICJEaXJlY3RseSBwaG90b2dyYXBoZWQgaW1hZ2UiOworCQkJfSBlbHNlIHsKKwkJCQlzcHJpbnRmKGZvcm1hdCwgIlVua25vd24gKCVkKSIsIHNjZW5lVHlwZSk7CisJCQkJYnVmZmVyICs9IGZvcm1hdDsKKwkJCQlyZXR1cm4gYnVmZmVyLmNfc3RyKCk7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSBUQUdfU1VCSkVDVF9ESVNUQU5DRToKKwkJeworCQkJRklSYXRpb25hbCByKHRhZyk7CisJCQlpZihyLmdldE51bWVyYXRvcigpID09IDB4RkZGRkZGRkYpIHsKKwkJCQlyZXR1cm4gIkluZmluaXR5IjsKKwkJCX0gZWxzZSBpZihyLmdldE51bWVyYXRvcigpID09IDApIHsKKwkJCQlyZXR1cm4gIkRpc3RhbmNlIHVua25vd24iOworCQkJfSBlbHNlIHsKKwkJCQlkb3VibGUgZGlzdGFuY2UgPSByLmRvdWJsZVZhbHVlKCk7CisJCQkJc3ByaW50Zihmb3JtYXQsICIlLjNmIG1ldGVycyIsIGRpc3RhbmNlKTsKKwkJCQlidWZmZXIgKz0gZm9ybWF0OworCQkJCXJldHVybiBidWZmZXIuY19zdHIoKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKwkJCQorCQljYXNlIFRBR19NRVRFUklOR19NT0RFOgorCQl7CisJCQl1bnNpZ25lZCBzaG9ydCBtZXRlcmluZ01vZGUgPSAqKCh1bnNpZ25lZCBzaG9ydCAqKUZyZWVJbWFnZV9HZXRUYWdWYWx1ZSh0YWcpKTsKKwkJCXN3aXRjaCAobWV0ZXJpbmdNb2RlKSB7CisJCQkJY2FzZSAwOgorCQkJCQlyZXR1cm4gIlVua25vd24iOworCQkJCWNhc2UgMToKKwkJCQkJcmV0dXJuICJBdmVyYWdlIjsKKwkJCQljYXNlIDI6CisJCQkJCXJldHVybiAiQ2VudGVyIHdlaWdodGVkIGF2ZXJhZ2UiOworCQkJCWNhc2UgMzoKKwkJCQkJcmV0dXJuICJTcG90IjsKKwkJCQljYXNlIDQ6CisJCQkJCXJldHVybiAiTXVsdGktc3BvdCI7CisJCQkJY2FzZSA1OgorCQkJCQlyZXR1cm4gIk11bHRpLXNlZ21lbnQiOworCQkJCWNhc2UgNjoKKwkJCQkJcmV0dXJuICJQYXJ0aWFsIjsKKwkJCQljYXNlIDI1NToKKwkJCQkJcmV0dXJuICIoT3RoZXIpIjsKKwkJCQlkZWZhdWx0OgorCQkJCQlyZXR1cm4gIiI7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSBUQUdfTElHSFRfU09VUkNFOgorCQl7CisJCQl1bnNpZ25lZCBzaG9ydCBsaWdodFNvdXJjZSA9ICooKHVuc2lnbmVkIHNob3J0ICopRnJlZUltYWdlX0dldFRhZ1ZhbHVlKHRhZykpOworCQkJc3dpdGNoIChsaWdodFNvdXJjZSkgeworCQkJCWNhc2UgMDoKKwkJCQkJcmV0dXJuICJVbmtub3duIjsKKwkJCQljYXNlIDE6CisJCQkJCXJldHVybiAiRGF5bGlnaHQiOworCQkJCWNhc2UgMjoKKwkJCQkJcmV0dXJuICJGbHVvcmVzY2VudCI7CisJCQkJY2FzZSAzOgorCQkJCQlyZXR1cm4gIlR1bmdzdGVuIChpbmNhbmRlc2NlbnQgbGlnaHQpIjsKKwkJCQljYXNlIDQ6CisJCQkJCXJldHVybiAiRmxhc2giOworCQkJCWNhc2UgOToKKwkJCQkJcmV0dXJuICJGaW5lIHdlYXRoZXIiOworCQkJCWNhc2UgMTA6CisJCQkJCXJldHVybiAiQ2xvdWR5IHdlYXRoZXIiOworCQkJCWNhc2UgMTE6CisJCQkJCXJldHVybiAiU2hhZGUiOworCQkJCWNhc2UgMTI6CisJCQkJCXJldHVybiAiRGF5bGlnaHQgZmx1b3Jlc2NlbnQgKEQgNTcwMCAtIDcxMDBLKSI7CisJCQkJY2FzZSAxMzoKKwkJCQkJcmV0dXJuICJEYXkgd2hpdGUgZmx1b3Jlc2NlbnQgKE4gNDYwMCAtIDU0MDBLKSI7CisJCQkJY2FzZSAxNDoKKwkJCQkJcmV0dXJuICJDb29sIHdoaXRlIGZsdW9yZXNjZW50IChXIDM5MDAgLSA0NTAwSykiOworCQkJCWNhc2UgMTU6CisJCQkJCXJldHVybiAiV2hpdGUgZmx1b3Jlc2NlbnQgKFdXIDMyMDAgLSAzNzAwSykiOworCQkJCWNhc2UgMTc6CisJCQkJCXJldHVybiAiU3RhbmRhcmQgbGlnaHQgQSI7CisJCQkJY2FzZSAxODoKKwkJCQkJcmV0dXJuICJTdGFuZGFyZCBsaWdodCBCIjsKKwkJCQljYXNlIDE5OgorCQkJCQlyZXR1cm4gIlN0YW5kYXJkIGxpZ2h0IEMiOworCQkJCWNhc2UgMjA6CisJCQkJCXJldHVybiAiRDU1IjsKKwkJCQljYXNlIDIxOgorCQkJCQlyZXR1cm4gIkQ2NSI7CisJCQkJY2FzZSAyMjoKKwkJCQkJcmV0dXJuICJENzUiOworCQkJCWNhc2UgMjM6CisJCQkJCXJldHVybiAiRDUwIjsKKwkJCQljYXNlIDI0OgorCQkJCQlyZXR1cm4gIklTTyBzdHVkaW8gdHVuZ3N0ZW4iOworCQkJCWNhc2UgMjU1OgorCQkJCQlyZXR1cm4gIihPdGhlcikiOworCQkJCWRlZmF1bHQ6CisJCQkJCXJldHVybiAiIjsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCQljYXNlIFRBR19TRU5TSU5HX01FVEhPRDoKKwkJeworCQkJdW5zaWduZWQgc2hvcnQgc2Vuc2luZ01ldGhvZCA9ICooKHVuc2lnbmVkIHNob3J0ICopRnJlZUltYWdlX0dldFRhZ1ZhbHVlKHRhZykpOworCisJCQlzd2l0Y2ggKHNlbnNpbmdNZXRob2QpIHsKKwkJCQljYXNlIDE6CisJCQkJCXJldHVybiAiKE5vdCBkZWZpbmVkKSI7CisJCQkJY2FzZSAyOgorCQkJCQlyZXR1cm4gIk9uZS1jaGlwIGNvbG9yIGFyZWEgc2Vuc29yIjsKKwkJCQljYXNlIDM6CisJCQkJCXJldHVybiAiVHdvLWNoaXAgY29sb3IgYXJlYSBzZW5zb3IiOworCQkJCWNhc2UgNDoKKwkJCQkJcmV0dXJuICJUaHJlZS1jaGlwIGNvbG9yIGFyZWEgc2Vuc29yIjsKKwkJCQljYXNlIDU6CisJCQkJCXJldHVybiAiQ29sb3Igc2VxdWVudGlhbCBhcmVhIHNlbnNvciI7CisJCQkJY2FzZSA3OgorCQkJCQlyZXR1cm4gIlRyaWxpbmVhciBzZW5zb3IiOworCQkJCWNhc2UgODoKKwkJCQkJcmV0dXJuICJDb2xvciBzZXF1ZW50aWFsIGxpbmVhciBzZW5zb3IiOworCQkJCWRlZmF1bHQ6CisJCQkJCXJldHVybiAiIjsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCQljYXNlIFRBR19GSUxFX1NPVVJDRToKKwkJeworCQkJQllURSBmaWxlU291cmNlID0gKigoQllURSopRnJlZUltYWdlX0dldFRhZ1ZhbHVlKHRhZykpOworCQkJaWYgKGZpbGVTb3VyY2UgPT0gMykgeworCQkJCXJldHVybiAiRGlnaXRhbCBTdGlsbCBDYW1lcmEgKERTQykiOworCQkJfSBlbHNlIHsKKwkJCQlzcHJpbnRmKGZvcm1hdCwgIlVua25vd24gKCVkKSIsIGZpbGVTb3VyY2UpOworCQkJCWJ1ZmZlciArPSBmb3JtYXQ7CisJCQkJcmV0dXJuIGJ1ZmZlci5jX3N0cigpOworCQkJfQorICAgICAgICB9CisJCWJyZWFrOworCisJCWNhc2UgVEFHX0VYUE9TVVJFX1BST0dSQU06CisJCXsKKwkJCXVuc2lnbmVkIHNob3J0IGV4cG9zdXJlUHJvZ3JhbSA9ICooKHVuc2lnbmVkIHNob3J0ICopRnJlZUltYWdlX0dldFRhZ1ZhbHVlKHRhZykpOworCisJCQlzd2l0Y2ggKGV4cG9zdXJlUHJvZ3JhbSkgeworCQkJCWNhc2UgMToKKwkJCQkJcmV0dXJuICJNYW51YWwgY29udHJvbCI7CisJCQkJY2FzZSAyOgorCQkJCQlyZXR1cm4gIlByb2dyYW0gbm9ybWFsIjsKKwkJCQljYXNlIDM6CisJCQkJCXJldHVybiAiQXBlcnR1cmUgcHJpb3JpdHkiOworCQkJCWNhc2UgNDoKKwkJCQkJcmV0dXJuICJTaHV0dGVyIHByaW9yaXR5IjsKKwkJCQljYXNlIDU6CisJCQkJCXJldHVybiAiUHJvZ3JhbSBjcmVhdGl2ZSAoc2xvdyBwcm9ncmFtKSI7CisJCQkJY2FzZSA2OgorCQkJCQlyZXR1cm4gIlByb2dyYW0gYWN0aW9uIChoaWdoLXNwZWVkIHByb2dyYW0pIjsKKwkJCQljYXNlIDc6CisJCQkJCXJldHVybiAiUG9ydHJhaXQgbW9kZSI7CisJCQkJY2FzZSA4OgorCQkJCQlyZXR1cm4gIkxhbmRzY2FwZSBtb2RlIjsKKwkJCQlkZWZhdWx0OgorCQkJCQlzcHJpbnRmKGZvcm1hdCwgIlVua25vd24gcHJvZ3JhbSAoJWQpIiwgZXhwb3N1cmVQcm9ncmFtKTsKKwkJCQkJYnVmZmVyICs9IGZvcm1hdDsKKwkJCQkJcmV0dXJuIGJ1ZmZlci5jX3N0cigpOworCQkJfQorCQl9CisJCWJyZWFrOworCisJCWNhc2UgVEFHX0NVU1RPTV9SRU5ERVJFRDoKKwkJeworCQkJdW5zaWduZWQgc2hvcnQgY3VzdG9tUmVuZGVyZWQgPSAqKCh1bnNpZ25lZCBzaG9ydCAqKUZyZWVJbWFnZV9HZXRUYWdWYWx1ZSh0YWcpKTsKKworCQkJc3dpdGNoIChjdXN0b21SZW5kZXJlZCkgeworCQkJCWNhc2UgMDoKKwkJCQkJcmV0dXJuICJOb3JtYWwgcHJvY2VzcyI7CisJCQkJY2FzZSAxOgorCQkJCQlyZXR1cm4gIkN1c3RvbSBwcm9jZXNzIjsKKwkJCQlkZWZhdWx0OgorCQkJCQlzcHJpbnRmKGZvcm1hdCwgIlVua25vd24gcmVuZGVyaW5nICglZCkiLCBjdXN0b21SZW5kZXJlZCk7CisJCQkJCWJ1ZmZlciArPSBmb3JtYXQ7CisJCQkJCXJldHVybiBidWZmZXIuY19zdHIoKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCQljYXNlIFRBR19FWFBPU1VSRV9NT0RFOgorCQl7CisJCQl1bnNpZ25lZCBzaG9ydCBleHBvc3VyZU1vZGUgPSAqKCh1bnNpZ25lZCBzaG9ydCAqKUZyZWVJbWFnZV9HZXRUYWdWYWx1ZSh0YWcpKTsKKworCQkJc3dpdGNoIChleHBvc3VyZU1vZGUpIHsKKwkJCQljYXNlIDA6CisJCQkJCXJldHVybiAiQXV0byBleHBvc3VyZSI7CisJCQkJY2FzZSAxOgorCQkJCQlyZXR1cm4gIk1hbnVhbCBleHBvc3VyZSI7CisJCQkJY2FzZSAyOgorCQkJCQlyZXR1cm4gIkF1dG8gYnJhY2tldCI7CisJCQkJZGVmYXVsdDoKKwkJCQkJc3ByaW50Zihmb3JtYXQsICJVbmtub3duIG1vZGUgKCVkKSIsIGV4cG9zdXJlTW9kZSk7CisJCQkJCWJ1ZmZlciArPSBmb3JtYXQ7CisJCQkJCXJldHVybiBidWZmZXIuY19zdHIoKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCQljYXNlIFRBR19XSElURV9CQUxBTkNFOgorCQl7CisJCQl1bnNpZ25lZCBzaG9ydCB3aGl0ZUJhbGFuY2UgPSAqKCh1bnNpZ25lZCBzaG9ydCAqKUZyZWVJbWFnZV9HZXRUYWdWYWx1ZSh0YWcpKTsKKworCQkJc3dpdGNoICh3aGl0ZUJhbGFuY2UpIHsKKwkJCQljYXNlIDA6CisJCQkJCXJldHVybiAiQXV0byB3aGl0ZSBiYWxhbmNlIjsKKwkJCQljYXNlIDE6CisJCQkJCXJldHVybiAiTWFudWFsIHdoaXRlIGJhbGFuY2UiOworCQkJCWRlZmF1bHQ6CisJCQkJCXNwcmludGYoZm9ybWF0LCAiVW5rbm93biAoJWQpIiwgd2hpdGVCYWxhbmNlKTsKKwkJCQkJYnVmZmVyICs9IGZvcm1hdDsKKwkJCQkJcmV0dXJuIGJ1ZmZlci5jX3N0cigpOworCQkJfQorCQl9CisJCWJyZWFrOworCisJCWNhc2UgVEFHX1NDRU5FX0NBUFRVUkVfVFlQRToKKwkJeworCQkJdW5zaWduZWQgc2hvcnQgc2NlbmVUeXBlID0gKigodW5zaWduZWQgc2hvcnQgKilGcmVlSW1hZ2VfR2V0VGFnVmFsdWUodGFnKSk7CisKKwkJCXN3aXRjaCAoc2NlbmVUeXBlKSB7CisJCQkJY2FzZSAwOgorCQkJCQlyZXR1cm4gIlN0YW5kYXJkIjsKKwkJCQljYXNlIDE6CisJCQkJCXJldHVybiAiTGFuZHNjYXBlIjsKKwkJCQljYXNlIDI6CisJCQkJCXJldHVybiAiUG9ydHJhaXQiOworCQkJCWNhc2UgMzoKKwkJCQkJcmV0dXJuICJOaWdodCBzY2VuZSI7CisJCQkJZGVmYXVsdDoKKwkJCQkJc3ByaW50Zihmb3JtYXQsICJVbmtub3duICglZCkiLCBzY2VuZVR5cGUpOworCQkJCQlidWZmZXIgKz0gZm9ybWF0OworCQkJCQlyZXR1cm4gYnVmZmVyLmNfc3RyKCk7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSBUQUdfR0FJTl9DT05UUk9MOgorCQl7CisJCQl1bnNpZ25lZCBzaG9ydCBnYWluQ29udHJvbCA9ICooKHVuc2lnbmVkIHNob3J0ICopRnJlZUltYWdlX0dldFRhZ1ZhbHVlKHRhZykpOworCisJCQlzd2l0Y2ggKGdhaW5Db250cm9sKSB7CisJCQkJY2FzZSAwOgorCQkJCQlyZXR1cm4gIk5vbmUiOworCQkJCWNhc2UgMToKKwkJCQkJcmV0dXJuICJMb3cgZ2FpbiB1cCI7CisJCQkJY2FzZSAyOgorCQkJCQlyZXR1cm4gIkhpZ2ggZ2FpbiB1cCI7CisJCQkJY2FzZSAzOgorCQkJCQlyZXR1cm4gIkxvdyBnYWluIGRvd24iOworCQkJCWNhc2UgNDoKKwkJCQkJcmV0dXJuICJIaWdoIGdhaW4gZG93biI7CisJCQkJZGVmYXVsdDoKKwkJCQkJc3ByaW50Zihmb3JtYXQsICJVbmtub3duICglZCkiLCBnYWluQ29udHJvbCk7CisJCQkJCWJ1ZmZlciArPSBmb3JtYXQ7CisJCQkJCXJldHVybiBidWZmZXIuY19zdHIoKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCQljYXNlIFRBR19DT05UUkFTVDoKKwkJeworCQkJdW5zaWduZWQgc2hvcnQgY29udHJhc3QgPSAqKCh1bnNpZ25lZCBzaG9ydCAqKUZyZWVJbWFnZV9HZXRUYWdWYWx1ZSh0YWcpKTsKKworCQkJc3dpdGNoIChjb250cmFzdCkgeworCQkJCWNhc2UgMDoKKwkJCQkJcmV0dXJuICJOb3JtYWwiOworCQkJCWNhc2UgMToKKwkJCQkJcmV0dXJuICJTb2Z0IjsKKwkJCQljYXNlIDI6CisJCQkJCXJldHVybiAiSGFyZCI7CisJCQkJZGVmYXVsdDoKKwkJCQkJc3ByaW50Zihmb3JtYXQsICJVbmtub3duICglZCkiLCBjb250cmFzdCk7CisJCQkJCWJ1ZmZlciArPSBmb3JtYXQ7CisJCQkJCXJldHVybiBidWZmZXIuY19zdHIoKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCQljYXNlIFRBR19TQVRVUkFUSU9OOgorCQl7CisJCQl1bnNpZ25lZCBzaG9ydCBzYXR1cmF0aW9uID0gKigodW5zaWduZWQgc2hvcnQgKilGcmVlSW1hZ2VfR2V0VGFnVmFsdWUodGFnKSk7CisKKwkJCXN3aXRjaCAoc2F0dXJhdGlvbikgeworCQkJCWNhc2UgMDoKKwkJCQkJcmV0dXJuICJOb3JtYWwiOworCQkJCWNhc2UgMToKKwkJCQkJcmV0dXJuICJMb3cgc2F0dXJhdGlvbiI7CisJCQkJY2FzZSAyOgorCQkJCQlyZXR1cm4gIkhpZ2ggc2F0dXJhdGlvbiI7CisJCQkJZGVmYXVsdDoKKwkJCQkJc3ByaW50Zihmb3JtYXQsICJVbmtub3duICglZCkiLCBzYXR1cmF0aW9uKTsKKwkJCQkJYnVmZmVyICs9IGZvcm1hdDsKKwkJCQkJcmV0dXJuIGJ1ZmZlci5jX3N0cigpOworCQkJfQorCQl9CisJCWJyZWFrOworCisJCWNhc2UgVEFHX1NIQVJQTkVTUzoKKwkJeworCQkJdW5zaWduZWQgc2hvcnQgc2hhcnBuZXNzID0gKigodW5zaWduZWQgc2hvcnQgKilGcmVlSW1hZ2VfR2V0VGFnVmFsdWUodGFnKSk7CisKKwkJCXN3aXRjaCAoc2hhcnBuZXNzKSB7CisJCQkJY2FzZSAwOgorCQkJCQlyZXR1cm4gIk5vcm1hbCI7CisJCQkJY2FzZSAxOgorCQkJCQlyZXR1cm4gIlNvZnQiOworCQkJCWNhc2UgMjoKKwkJCQkJcmV0dXJuICJIYXJkIjsKKwkJCQlkZWZhdWx0OgorCQkJCQlzcHJpbnRmKGZvcm1hdCwgIlVua25vd24gKCVkKSIsIHNoYXJwbmVzcyk7CisJCQkJCWJ1ZmZlciArPSBmb3JtYXQ7CisJCQkJCXJldHVybiBidWZmZXIuY19zdHIoKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCQljYXNlIFRBR19TVUJKRUNUX0RJU1RBTkNFX1JBTkdFOgorCQl7CisJCQl1bnNpZ25lZCBzaG9ydCBkaXN0YW5jZVJhbmdlID0gKigodW5zaWduZWQgc2hvcnQgKilGcmVlSW1hZ2VfR2V0VGFnVmFsdWUodGFnKSk7CisKKwkJCXN3aXRjaCAoZGlzdGFuY2VSYW5nZSkgeworCQkJCWNhc2UgMDoKKwkJCQkJcmV0dXJuICJ1bmtub3duIjsKKwkJCQljYXNlIDE6CisJCQkJCXJldHVybiAiTWFjcm8iOworCQkJCWNhc2UgMjoKKwkJCQkJcmV0dXJuICJDbG9zZSB2aWV3IjsKKwkJCQljYXNlIDM6CisJCQkJCXJldHVybiAiRGlzdGFudCB2aWV3IjsKKwkJCQlkZWZhdWx0OgorCQkJCQlzcHJpbnRmKGZvcm1hdCwgIlVua25vd24gKCVkKSIsIGRpc3RhbmNlUmFuZ2UpOworCQkJCQlidWZmZXIgKz0gZm9ybWF0OworCQkJCQlyZXR1cm4gYnVmZmVyLmNfc3RyKCk7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSBUQUdfSVNPX1NQRUVEX1JBVElOR1M6CisJCXsKKwkJCXVuc2lnbmVkIHNob3J0IGlzb0VxdWl2ID0gKigodW5zaWduZWQgc2hvcnQgKilGcmVlSW1hZ2VfR2V0VGFnVmFsdWUodGFnKSk7CisJCQlpZiAoaXNvRXF1aXYgPCA1MCkgeworCQkJCWlzb0VxdWl2ICo9IDIwMDsKKwkJCX0KKwkJCXNwcmludGYoZm9ybWF0LCAiJWQiLCBpc29FcXVpdik7CisJCQlidWZmZXIgKz0gZm9ybWF0OworCQkJcmV0dXJuIGJ1ZmZlci5jX3N0cigpOworCQl9CisJCWJyZWFrOworCisJCWNhc2UgVEFHX1VTRVJfQ09NTUVOVDoKKwkJeworCQkJLy8gZmlyc3QgOCBieXRlcyBhcmUgdXNlZCB0byBkZWZpbmUgYW4gSUQgY29kZQorCQkJLy8gd2UgYXNzdW1lIHRoaXMgaXMgYW4gQVNDSUkgc3RyaW5nCisJCQljb25zdCBCWVRFICp1c2VyQ29tbWVudCA9IChCWVRFKilGcmVlSW1hZ2VfR2V0VGFnVmFsdWUodGFnKTsKKwkJCWZvcihEV09SRCBpID0gODsgaSA8IEZyZWVJbWFnZV9HZXRUYWdMZW5ndGgodGFnKTsgaSsrKSB7CisJCQkJYnVmZmVyICs9IHVzZXJDb21tZW50W2ldOworCQkJfQorCQkJYnVmZmVyICs9ICdcMCc7CisJCQlyZXR1cm4gYnVmZmVyLmNfc3RyKCk7CisJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSBUQUdfQ09NUFJFU1NJT046CisJCXsKKwkJCVdPUkQgY29tcHJlc3Npb24gPSAqKChXT1JEKilGcmVlSW1hZ2VfR2V0VGFnVmFsdWUodGFnKSk7CisJCQlzd2l0Y2goY29tcHJlc3Npb24pIHsKKwkJCQljYXNlIFRBR19DT01QUkVTU0lPTl9OT05FOgorCQkJCQlzcHJpbnRmKGZvcm1hdCwgImR1bXAgbW9kZSAoJWQpIiwgY29tcHJlc3Npb24pOworCQkJCQlicmVhazsKKwkJCQljYXNlIFRBR19DT01QUkVTU0lPTl9DQ0lUVFJMRToKKwkJCQkJc3ByaW50Zihmb3JtYXQsICJDQ0lUVCBtb2RpZmllZCBIdWZmbWFuIFJMRSAoJWQpIiwgY29tcHJlc3Npb24pOworCQkJCQlicmVhazsKKwkJCQljYXNlIFRBR19DT01QUkVTU0lPTl9DQ0lUVEZBWDM6CisJCQkJCXNwcmludGYoZm9ybWF0LCAiQ0NJVFQgR3JvdXAgMyBmYXggZW5jb2RpbmcgKCVkKSIsIGNvbXByZXNzaW9uKTsKKwkJCQkJYnJlYWs7CisJCQkJLyoKKwkJCQljYXNlIFRBR19DT01QUkVTU0lPTl9DQ0lUVF9UNDoKKwkJCQkJc3ByaW50Zihmb3JtYXQsICJDQ0lUVCBULjQgKFRJRkYgNiBuYW1lKSAoJWQpIiwgY29tcHJlc3Npb24pOworCQkJCQlicmVhazsKKwkJCQkqLworCQkJCWNhc2UgVEFHX0NPTVBSRVNTSU9OX0NDSVRURkFYNDoKKwkJCQkJc3ByaW50Zihmb3JtYXQsICJDQ0lUVCBHcm91cCA0IGZheCBlbmNvZGluZyAoJWQpIiwgY29tcHJlc3Npb24pOworCQkJCQlicmVhazsKKwkJCQkvKgorCQkJCWNhc2UgVEFHX0NPTVBSRVNTSU9OX0NDSVRUX1Q2OgorCQkJCQlzcHJpbnRmKGZvcm1hdCwgIkNDSVRUIFQuNiAoVElGRiA2IG5hbWUpICglZCkiLCBjb21wcmVzc2lvbik7CisJCQkJCWJyZWFrOworCQkJCSovCisJCQkJY2FzZSBUQUdfQ09NUFJFU1NJT05fTFpXOgorCQkJCQlzcHJpbnRmKGZvcm1hdCwgIkxaVyAoJWQpIiwgY29tcHJlc3Npb24pOworCQkJCQlicmVhazsKKwkJCQljYXNlIFRBR19DT01QUkVTU0lPTl9PSlBFRzoKKwkJCQkJc3ByaW50Zihmb3JtYXQsICIhNi4wIEpQRUcgKCVkKSIsIGNvbXByZXNzaW9uKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBUQUdfQ09NUFJFU1NJT05fSlBFRzoKKwkJCQkJc3ByaW50Zihmb3JtYXQsICJKUEVHICglZCkiLCBjb21wcmVzc2lvbik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgVEFHX0NPTVBSRVNTSU9OX05FWFQ6CisJCQkJCXNwcmludGYoZm9ybWF0LCAiTmVYVCAyLWJpdCBSTEUgKCVkKSIsIGNvbXByZXNzaW9uKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBUQUdfQ09NUFJFU1NJT05fQ0NJVFRSTEVXOgorCQkJCQlzcHJpbnRmKGZvcm1hdCwgIkNDSVRUUkxFVyAoJWQpIiwgY29tcHJlc3Npb24pOworCQkJCQlicmVhazsKKwkJCQljYXNlIFRBR19DT01QUkVTU0lPTl9QQUNLQklUUzoKKwkJCQkJc3ByaW50Zihmb3JtYXQsICJQYWNrQml0cyBNYWNpbnRvc2ggUkxFICglZCkiLCBjb21wcmVzc2lvbik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgVEFHX0NPTVBSRVNTSU9OX1RIVU5ERVJTQ0FOOgorCQkJCQlzcHJpbnRmKGZvcm1hdCwgIlRodW5kZXJTY2FuIFJMRSAoJWQpIiwgY29tcHJlc3Npb24pOworCQkJCQlicmVhazsKKwkJCQljYXNlIFRBR19DT01QUkVTU0lPTl9QSVhBUkZJTE06CisJCQkJCXNwcmludGYoZm9ybWF0LCAiUGl4YXIgY29tcGFuZGVkIDEwYml0IExaVyAoJWQpIiwgY29tcHJlc3Npb24pOworCQkJCQlicmVhazsKKwkJCQljYXNlIFRBR19DT01QUkVTU0lPTl9QSVhBUkxPRzoKKwkJCQkJc3ByaW50Zihmb3JtYXQsICJQaXhhciBjb21wYW5kZWQgMTFiaXQgWklQICglZCkiLCBjb21wcmVzc2lvbik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgVEFHX0NPTVBSRVNTSU9OX0RFRkxBVEU6CisJCQkJCXNwcmludGYoZm9ybWF0LCAiRGVmbGF0ZSBjb21wcmVzc2lvbiAoJWQpIiwgY29tcHJlc3Npb24pOworCQkJCQlicmVhazsKKwkJCQljYXNlIFRBR19DT01QUkVTU0lPTl9BRE9CRV9ERUZMQVRFOgorCQkJCQlzcHJpbnRmKGZvcm1hdCwgIkFkb2JlIERlZmxhdGUgY29tcHJlc3Npb24gKCVkKSIsIGNvbXByZXNzaW9uKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBUQUdfQ09NUFJFU1NJT05fRENTOgorCQkJCQlzcHJpbnRmKGZvcm1hdCwgIktvZGFrIERDUyBlbmNvZGluZyAoJWQpIiwgY29tcHJlc3Npb24pOworCQkJCQlicmVhazsKKwkJCQljYXNlIFRBR19DT01QUkVTU0lPTl9KQklHOgorCQkJCQlzcHJpbnRmKGZvcm1hdCwgIklTTyBKQklHICglZCkiLCBjb21wcmVzc2lvbik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgVEFHX0NPTVBSRVNTSU9OX1NHSUxPRzoKKwkJCQkJc3ByaW50Zihmb3JtYXQsICJTR0kgTG9nIEx1bWluYW5jZSBSTEUgKCVkKSIsIGNvbXByZXNzaW9uKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBUQUdfQ09NUFJFU1NJT05fU0dJTE9HMjQ6CisJCQkJCXNwcmludGYoZm9ybWF0LCAiU0dJIExvZyAyNC1iaXQgcGFja2VkICglZCkiLCBjb21wcmVzc2lvbik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgVEFHX0NPTVBSRVNTSU9OX0pQMjAwMDoKKwkJCQkJc3ByaW50Zihmb3JtYXQsICJMZWFkdG9vbHMgSlBFRzIwMDAgKCVkKSIsIGNvbXByZXNzaW9uKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBUQUdfQ09NUFJFU1NJT05fTFpNQToKKwkJCQkJc3ByaW50Zihmb3JtYXQsICJMWk1BMiAoJWQpIiwgY29tcHJlc3Npb24pOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlzcHJpbnRmKGZvcm1hdCwgIlVua25vd24gdHlwZSAoJWQpIiwgY29tcHJlc3Npb24pOworCQkJCQlicmVhazsKKwkJCX0KKworCQkJYnVmZmVyICs9IGZvcm1hdDsKKwkJCXJldHVybiBidWZmZXIuY19zdHIoKTsKKwkJfQorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gQ29udmVydEFueVRhZyh0YWcpOworfQorCisvKioKK0NvbnZlcnQgYSBFeGlmIEdQUyB0YWcgdG8gYSBDIHN0cmluZworKi8KK3N0YXRpYyBjb25zdCBjaGFyKiAKK0NvbnZlcnRFeGlmR1BTVGFnKEZJVEFHICp0YWcpIHsKKwljaGFyIGZvcm1hdFtNQVhfVEVYVF9FWFRFTlRdOworCXN0YXRpYyBzdGQ6OnN0cmluZyBidWZmZXI7CisKKwlpZighdGFnKQorCQlyZXR1cm4gTlVMTDsKKworCWJ1ZmZlci5lcmFzZSgpOworCisJLy8gY29udmVydCB0aGUgdGFnIHZhbHVlIHRvIGEgc3RyaW5nIGJ1ZmZlcgorCisJc3dpdGNoKEZyZWVJbWFnZV9HZXRUYWdJRCh0YWcpKSB7CisJCWNhc2UgVEFHX0dQU19MQVRJVFVERToKKwkJY2FzZSBUQUdfR1BTX0xPTkdJVFVERToKKwkJY2FzZSBUQUdfR1BTX1RJTUVfU1RBTVA6CisJCXsKKwkJCURXT1JEICpwdmFsdWUgPSAoRFdPUkQqKUZyZWVJbWFnZV9HZXRUYWdWYWx1ZSh0YWcpOworCQkJaWYoRnJlZUltYWdlX0dldFRhZ0xlbmd0aCh0YWcpID09IDI0KSB7CisJCQkJLy8gZGQ6bW06c3Mgb3IgaGg6bW06c3MKKwkJCQlpbnQgZGQgPSAwLCBtbSA9IDA7CisJCQkJZG91YmxlIHNzID0gMDsKKworCQkJCS8vIGNvbnZlcnQgdG8gc2Vjb25kcworCQkJCWlmKHB2YWx1ZVsxXSkKKwkJCQkJc3MgKz0gKChkb3VibGUpcHZhbHVlWzBdIC8gKGRvdWJsZSlwdmFsdWVbMV0pICogMzYwMDsKKwkJCQlpZihwdmFsdWVbM10pCisJCQkJCXNzICs9ICgoZG91YmxlKXB2YWx1ZVsyXSAvIChkb3VibGUpcHZhbHVlWzNdKSAqIDYwOworCQkJCWlmKHB2YWx1ZVs1XSkKKwkJCQkJc3MgKz0gKChkb3VibGUpcHZhbHVlWzRdIC8gKGRvdWJsZSlwdmFsdWVbNV0pOworCQkJCQorCQkJCS8vIGNvbnZlcnQgdG8gZGQ6bW06c3Muc3MKKwkJCQlkZCA9IChpbnQpKHNzIC8gMzYwMCk7CisJCQkJbW0gPSAoaW50KShzcyAvIDYwKSAtIGRkICogNjA7CisJCQkJc3MgPSBzcyAtIGRkICogMzYwMCAtIG1tICogNjA7CisKKwkJCQlzcHJpbnRmKGZvcm1hdCwgIiVkOiVkOiUuMmYiLCBkZCwgbW0sIHNzKTsKKwkJCQlidWZmZXIgKz0gZm9ybWF0OworCQkJCXJldHVybiBidWZmZXIuY19zdHIoKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCQljYXNlIFRBR19HUFNfVkVSU0lPTl9JRDoKKwkJY2FzZSBUQUdfR1BTX0xBVElUVURFX1JFRjoKKwkJY2FzZSBUQUdfR1BTX0xPTkdJVFVERV9SRUY6CisJCWNhc2UgVEFHX0dQU19BTFRJVFVERV9SRUY6CisJCWNhc2UgVEFHX0dQU19BTFRJVFVERToKKwkJY2FzZSBUQUdfR1BTX1NBVEVMTElURVM6CisJCWNhc2UgVEFHX0dQU19TVEFUVVM6CisJCWNhc2UgVEFHX0dQU19NRUFTVVJFX01PREU6CisJCWNhc2UgVEFHX0dQU19ET1A6CisJCWNhc2UgVEFHX0dQU19TUEVFRF9SRUY6CisJCWNhc2UgVEFHX0dQU19TUEVFRDoKKwkJY2FzZSBUQUdfR1BTX1RSQUNLX1JFRjoKKwkJY2FzZSBUQUdfR1BTX1RSQUNLOgorCQljYXNlIFRBR19HUFNfSU1HX0RJUkVDVElPTl9SRUY6CisJCWNhc2UgVEFHX0dQU19JTUdfRElSRUNUSU9OOgorCQljYXNlIFRBR19HUFNfTUFQX0RBVFVNOgorCQljYXNlIFRBR19HUFNfREVTVF9MQVRJVFVERV9SRUY6CisJCWNhc2UgVEFHX0dQU19ERVNUX0xBVElUVURFOgorCQljYXNlIFRBR19HUFNfREVTVF9MT05HSVRVREVfUkVGOgorCQljYXNlIFRBR19HUFNfREVTVF9MT05HSVRVREU6CisJCWNhc2UgVEFHX0dQU19ERVNUX0JFQVJJTkdfUkVGOgorCQljYXNlIFRBR19HUFNfREVTVF9CRUFSSU5HOgorCQljYXNlIFRBR19HUFNfREVTVF9ESVNUQU5DRV9SRUY6CisJCWNhc2UgVEFHX0dQU19ERVNUX0RJU1RBTkNFOgorCQljYXNlIFRBR19HUFNfUFJPQ0VTU0lOR19NRVRIT0Q6CisJCWNhc2UgVEFHX0dQU19BUkVBX0lORk9STUFUSU9OOgorCQljYXNlIFRBR19HUFNfREFURV9TVEFNUDoKKwkJY2FzZSBUQUdfR1BTX0RJRkZFUkVOVElBTDoKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBDb252ZXJ0QW55VGFnKHRhZyk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFRhZyB0byBzdHJpbmcgY29udmVyc2lvbiBmdW5jdGlvbgorLy8KKworY29uc3QgY2hhciogRExMX0NBTExDT05WIAorRnJlZUltYWdlX1RhZ1RvU3RyaW5nKEZSRUVfSU1BR0VfTURNT0RFTCBtb2RlbCwgRklUQUcgKnRhZywgY2hhciAqTWFrZSkgeworCXN3aXRjaChtb2RlbCkgeworCQljYXNlIEZJTURfRVhJRl9NQUlOOgorCQljYXNlIEZJTURfRVhJRl9FWElGOgorCQkJcmV0dXJuIENvbnZlcnRFeGlmVGFnKHRhZyk7CisKKwkJY2FzZSBGSU1EX0VYSUZfR1BTOgorCQkJcmV0dXJuIENvbnZlcnRFeGlmR1BTVGFnKHRhZyk7CisKKwkJY2FzZSBGSU1EX0VYSUZfTUFLRVJOT1RFOgorCQkJLy8gV2Ugc2hvdWxkIHVzZSB0aGUgTWFrZSBzdHJpbmcgdG8gc2VsZWN0IGFuIGFwcHJvcHJpYXRlIGNvbnZlcnNpb24gZnVuY3Rpb24KKwkJCS8vIFRPIERPIC4uLgorCQkJYnJlYWs7CisKKwkJY2FzZSBGSU1EX0VYSUZfSU5URVJPUDoKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBDb252ZXJ0QW55VGFnKHRhZyk7Cit9CisKZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9NZXRhZGF0YS9UYWdMaWIuY3BwIGIvZmlsZXMvU291cmNlL01ldGFkYXRhL1RhZ0xpYi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgwYWQ2ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9NZXRhZGF0YS9UYWdMaWIuY3BwCkBAIC0wLDAgKzEsMTYxOCBAQAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gVGFnIGxpYnJhcnkKKy8vCisvLyBEZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIGJ5CisvLyAtIEhlcnbpIERyb2xvbiA8ZHJvbG9uQGluZm9uaWUuZnI+CisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRnJlZUltYWdlIDMKKy8vCisvLyBDT1ZFUkVEIENPREUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkKKy8vIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTCisvLyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy8vIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVECisvLyBDT0RFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UCisvLyBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWQorLy8gU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTAorLy8gUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUgorLy8gVEhJUyBESVNDTEFJTUVSLgorLy8KKy8vIFVzZSBhdCB5b3VyIG93biByaXNrIQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBJbXBsZW1lbnRhdGlvbiBub3RlcyA6IAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVGhlIHRhZyBpbmZvIHRhYmxlcyBkZWNsYXJlZCBpbiB0aGlzIGZpbGUgc2hvdWxkIHByb2JhYmx5IAorLy8gYmUgbG9hZGVkIGZyb20gYW4gWE1MIGZpbGUuIAorLy8gVGhpcyB3b3VsZCBhbGxvdyBpbnRlcm5hdGlvbmFsaXphdGlvbiBmZWF0dXJlcyBhbmQgYWxzbyAKKy8vIG1vcmUgZXh0ZW5zaWJpbGl0eS4gCisvLyBNYXliZSBpbiBhIGZ1dHVyZSByZWxlYXNlID8gCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpZmRlZiBfTVNDX1ZFUiAKKyNwcmFnbWEgd2FybmluZyAoZGlzYWJsZSA6IDQ3ODYpIC8vIGlkZW50aWZpZXIgd2FzIHRydW5jYXRlZCB0byAnbnVtYmVyJyBjaGFyYWN0ZXJzCisjZW5kaWYKKworI2luY2x1ZGUgIkZyZWVJbWFnZS5oIgorI2luY2x1ZGUgIlV0aWxpdGllcy5oIgorI2luY2x1ZGUgIkZyZWVJbWFnZVRhZy5oIgorCisvKioKKyBIT1ctVE8gOiBhZGQgYSBuZXcgVGFnSW5mbyB0YWJsZQorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgMSkgYWRkIGEgdGFibGUgaWRlbnRpZmllciBpbiB0aGUgVGFnTGliIGNsYXNzIGRlZmluaXRpb24gKHNlZSBlbnVtIE1ETU9ERUwpCisgMikgZGVjbGFyZSB0aGUgdGFnIHRhYmxlIGFzIHN0YXRpYyBhbmQgdXNlIGEgMC9OVUxMIHZhbHVlIGFzIGxhc3QgZW50cnkKKyAzKSBpbml0aWFsaXplIHRoZSB0YWJsZSBpbiBUYWdMaWI6OlRhZ0xpYgorIDQpIHByb3ZpZGUgYSBjb252ZXJzaW9uIGluIFRhZ0xpYjo6Z2V0RnJlZUltYWdlTW9kZWwKKyovCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFWElGIHN0YW5kYXJkIHRhZ3MgZGVmaW5pdGlvbgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIFRhZ0luZm8KKyAgZXhpZl9leGlmX3RhZ190YWJsZVtdID0KKyAgeworICAgIHsgIDB4MDEwMCwgKGNoYXIgKikgIkltYWdlV2lkdGgiLCAoY2hhciAqKSAiSW1hZ2Ugd2lkdGgifSwKKyAgICB7ICAweDAxMDEsIChjaGFyICopICJJbWFnZUxlbmd0aCIsIChjaGFyICopICJJbWFnZSBoZWlnaHQifSwKKyAgICB7ICAweDAxMDIsIChjaGFyICopICJCaXRzUGVyU2FtcGxlIiwgKGNoYXIgKikgIk51bWJlciBvZiBiaXRzIHBlciBjb21wb25lbnQifSwKKyAgICB7ICAweDAxMDMsIChjaGFyICopICJDb21wcmVzc2lvbiIsIChjaGFyICopICJDb21wcmVzc2lvbiBzY2hlbWUifSwKKyAgICB7ICAweDAxMDYsIChjaGFyICopICJQaG90b21ldHJpY0ludGVycHJldGF0aW9uIiwgKGNoYXIgKikgIlBpeGVsIGNvbXBvc2l0aW9uIn0sCisgICAgeyAgMHgwMTBBLCAoY2hhciAqKSAiRmlsbE9yZGVyIiwgKGNoYXIqKSBOVUxMfSwKKyAgICB7ICAweDAxMEQsIChjaGFyICopICJEb2N1bWVudE5hbWUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAxMEUsIChjaGFyICopICJJbWFnZURlc2NyaXB0aW9uIiwgKGNoYXIgKikgIkltYWdlIHRpdGxlIn0sCisgICAgeyAgMHgwMTBGLCAoY2hhciAqKSAiTWFrZSIsIChjaGFyICopICJJbWFnZSBpbnB1dCBlcXVpcG1lbnQgbWFudWZhY3R1cmVyIn0sCisgICAgeyAgMHgwMTEwLCAoY2hhciAqKSAiTW9kZWwiLCAoY2hhciAqKSAiSW1hZ2UgaW5wdXQgZXF1aXBtZW50IG1vZGVsIn0sCisgICAgeyAgMHgwMTExLCAoY2hhciAqKSAiU3RyaXBPZmZzZXRzIiwgKGNoYXIgKikgIkltYWdlIGRhdGEgbG9jYXRpb24ifSwKKyAgICB7ICAweDAxMTIsIChjaGFyICopICJPcmllbnRhdGlvbiIsIChjaGFyICopICJPcmllbnRhdGlvbiBvZiBpbWFnZSJ9LAorICAgIHsgIDB4MDExNSwgKGNoYXIgKikgIlNhbXBsZXNQZXJQaXhlbCIsIChjaGFyICopICJOdW1iZXIgb2YgY29tcG9uZW50cyJ9LAorICAgIHsgIDB4MDExNiwgKGNoYXIgKikgIlJvd3NQZXJTdHJpcCIsIChjaGFyICopICJOdW1iZXIgb2Ygcm93cyBwZXIgc3RyaXAifSwKKyAgICB7ICAweDAxMTcsIChjaGFyICopICJTdHJpcEJ5dGVDb3VudHMiLCAoY2hhciAqKSAiQnl0ZXMgcGVyIGNvbXByZXNzZWQgc3RyaXAifSwKKyAgICB7ICAweDAxMUEsIChjaGFyICopICJYUmVzb2x1dGlvbiIsIChjaGFyICopICJJbWFnZSByZXNvbHV0aW9uIGluIHdpZHRoIGRpcmVjdGlvbiJ9LAorICAgIHsgIDB4MDExQiwgKGNoYXIgKikgIllSZXNvbHV0aW9uIiwgKGNoYXIgKikgIkltYWdlIHJlc29sdXRpb24gaW4gaGVpZ2h0IGRpcmVjdGlvbiJ9LAorICAgIHsgIDB4MDExQywgKGNoYXIgKikgIlBsYW5hckNvbmZpZ3VyYXRpb24iLCAoY2hhciAqKSAiSW1hZ2UgZGF0YSBhcnJhbmdlbWVudCJ9LAorCXsgIDB4MDExRCwgKGNoYXIgKikgIlBhZ2VOYW1lIiwgKGNoYXIgKikgIk5hbWUgb2YgdGhlIHBhZ2UifSwKKwl7ICAweDAxMUUsIChjaGFyICopICJYUG9zaXRpb24iLCAoY2hhciAqKSAiWCBwb3NpdGlvbiBvZiB0aGUgaW1hZ2UifSwKKwl7ICAweDAxMUYsIChjaGFyICopICJZUG9zaXRpb24iLCAoY2hhciAqKSAiWSBwb3NpdGlvbiBvZiB0aGUgaW1hZ2UifSwKKyAgICB7ICAweDAxMjgsIChjaGFyICopICJSZXNvbHV0aW9uVW5pdCIsIChjaGFyICopICJVbml0IG9mIFggYW5kIFkgcmVzb2x1dGlvbiJ9LAorCXsgIDB4MDEyOSwgKGNoYXIgKikgIlBhZ2VOdW1iZXIiLCAoY2hhciAqKSAiUGFnZSBudW1iZXIifSwKKyAgICB7ICAweDAxMkQsIChjaGFyICopICJUcmFuc2ZlckZ1bmN0aW9uIiwgKGNoYXIgKikgIlRyYW5zZmVyIGZ1bmN0aW9uIn0sCisgICAgeyAgMHgwMTMxLCAoY2hhciAqKSAiU29mdHdhcmUiLCAoY2hhciAqKSAiU29mdHdhcmUgdXNlZCJ9LAorICAgIHsgIDB4MDEzMiwgKGNoYXIgKikgIkRhdGVUaW1lIiwgKGNoYXIgKikgIkZpbGUgY2hhbmdlIGRhdGUgYW5kIHRpbWUifSwKKyAgICB7ICAweDAxM0IsIChjaGFyICopICJBcnRpc3QiLCAoY2hhciAqKSAiUGVyc29uIHdobyBjcmVhdGVkIHRoZSBpbWFnZSJ9LAorCXsgIDB4MDEzQywgKGNoYXIgKikgIkhvc3RDb21wdXRlciIsIChjaGFyICopICJIb3N0IGNvbXB1dGVyIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGltYWdlIn0sCisgICAgeyAgMHgwMTNFLCAoY2hhciAqKSAiV2hpdGVQb2ludCIsIChjaGFyICopICJXaGl0ZSBwb2ludCBjaHJvbWF0aWNpdHkifSwKKyAgICB7ICAweDAxM0YsIChjaGFyICopICJQcmltYXJ5Q2hyb21hdGljaXRpZXMiLCAoY2hhciAqKSAiQ2hyb21hdGljaXRpZXMgb2YgcHJpbWFyaWVzIn0sCisgICAgeyAgMHgwMTU2LCAoY2hhciAqKSAiVHJhbnNmZXJSYW5nZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDIwMCwgKGNoYXIgKikgIkpQRUdQcm9jIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMjAxLCAoY2hhciAqKSAiSlBFR0ludGVyY2hhbmdlRm9ybWF0IiwgKGNoYXIgKikgIk9mZnNldCB0byBKUEVHIFNPSSJ9LAorICAgIHsgIDB4MDIwMiwgKGNoYXIgKikgIkpQRUdJbnRlcmNoYW5nZUZvcm1hdExlbmd0aCIsIChjaGFyICopICJCeXRlcyBvZiBKUEVHIGRhdGEifSwKKyAgICB7ICAweDAyMTEsIChjaGFyICopICJZQ2JDckNvZWZmaWNpZW50cyIsIChjaGFyICopICJDb2xvciBzcGFjZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggY29lZmZpY2llbnRzIn0sCisgICAgeyAgMHgwMjEyLCAoY2hhciAqKSAiWUNiQ3JTdWJTYW1wbGluZyIsIChjaGFyICopICJTdWJzYW1wbGluZyByYXRpbyBvZiBZIHRvIEMifSwKKyAgICB7ICAweDAyMTMsIChjaGFyICopICJZQ2JDclBvc2l0aW9uaW5nIiwgKGNoYXIgKikgIlkgYW5kIEMgcG9zaXRpb25pbmcifSwKKyAgICB7ICAweDAyMTQsIChjaGFyICopICJSZWZlcmVuY2VCbGFja1doaXRlIiwgKGNoYXIgKikgIlBhaXIgb2YgYmxhY2sgYW5kIHdoaXRlIHJlZmVyZW5jZSB2YWx1ZXMifSwKKyAgICB7ICAweDgyOEQsIChjaGFyICopICJDRkFSZXBlYXRQYXR0ZXJuRGltIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHg4MjhFLCAoY2hhciAqKSAiQ0ZBUGF0dGVybiIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4ODI4RiwgKGNoYXIgKikgIkJhdHRlcnlMZXZlbCIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4ODI5OCwgKGNoYXIgKikgIkNvcHlyaWdodCIsIChjaGFyICopICJDb3B5cmlnaHQgaG9sZGVyIn0sCisgICAgeyAgMHg4MjlBLCAoY2hhciAqKSAiRXhwb3N1cmVUaW1lIiwgKGNoYXIgKikgIkV4cG9zdXJlIHRpbWUifSwKKyAgICB7ICAweDgyOUQsIChjaGFyICopICJGTnVtYmVyIiwgKGNoYXIgKikgIkYgbnVtYmVyIn0sCisgICAgeyAgMHg4M0JCLCAoY2hhciAqKSAiSVBUQy9OQUEiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDg3NzMsIChjaGFyICopICJJbnRlckNvbG9yUHJvZmlsZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4ODgyMiwgKGNoYXIgKikgIkV4cG9zdXJlUHJvZ3JhbSIsIChjaGFyICopICJFeHBvc3VyZSBwcm9ncmFtIn0sCisgICAgeyAgMHg4ODI0LCAoY2hhciAqKSAiU3BlY3RyYWxTZW5zaXRpdml0eSIsIChjaGFyICopICJTcGVjdHJhbCBzZW5zaXRpdml0eSJ9LAorICAgIHsgIDB4ODgyNSwgKGNoYXIgKikgIkdQU0luZm8iLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDg4MjcsIChjaGFyICopICJJU09TcGVlZFJhdGluZ3MiLCAoY2hhciAqKSAiSVNPIHNwZWVkIHJhdGluZyJ9LAorICAgIHsgIDB4ODgyOCwgKGNoYXIgKikgIk9FQ0YiLCAoY2hhciAqKSAiT3B0b2VsZWN0cmljIGNvbnZlcnNpb24gZmFjdG9yIn0sCisgICAgeyAgMHg5MDAwLCAoY2hhciAqKSAiRXhpZlZlcnNpb24iLCAoY2hhciAqKSAiRXhpZiB2ZXJzaW9uIn0sCisgICAgeyAgMHg5MDAzLCAoY2hhciAqKSAiRGF0ZVRpbWVPcmlnaW5hbCIsIChjaGFyICopICJEYXRlIGFuZCB0aW1lIG9mIG9yaWdpbmFsIGRhdGEgZ2VuZXJhdGlvbiJ9LAorICAgIHsgIDB4OTAwNCwgKGNoYXIgKikgIkRhdGVUaW1lRGlnaXRpemVkIiwgKGNoYXIgKikgIkRhdGUgYW5kIHRpbWUgb2YgZGlnaXRhbCBkYXRhIGdlbmVyYXRpb24ifSwKKyAgICB7ICAweDkxMDEsIChjaGFyICopICJDb21wb25lbnRzQ29uZmlndXJhdGlvbiIsIChjaGFyICopICJNZWFuaW5nIG9mIGVhY2ggY29tcG9uZW50In0sCisgICAgeyAgMHg5MTAyLCAoY2hhciAqKSAiQ29tcHJlc3NlZEJpdHNQZXJQaXhlbCIsIChjaGFyICopICJJbWFnZSBjb21wcmVzc2lvbiBtb2RlIn0sCisgICAgeyAgMHg5MjAxLCAoY2hhciAqKSAiU2h1dHRlclNwZWVkVmFsdWUiLCAoY2hhciAqKSAiU2h1dHRlciBzcGVlZCJ9LAorICAgIHsgIDB4OTIwMiwgKGNoYXIgKikgIkFwZXJ0dXJlVmFsdWUiLCAoY2hhciAqKSAiQXBlcnR1cmUifSwKKyAgICB7ICAweDkyMDMsIChjaGFyICopICJCcmlnaHRuZXNzVmFsdWUiLCAoY2hhciAqKSAiQnJpZ2h0bmVzcyJ9LAorICAgIHsgIDB4OTIwNCwgKGNoYXIgKikgIkV4cG9zdXJlQmlhc1ZhbHVlIiwgKGNoYXIgKikgIkV4cG9zdXJlIGJpYXMifSwKKyAgICB7ICAweDkyMDUsIChjaGFyICopICJNYXhBcGVydHVyZVZhbHVlIiwgKGNoYXIgKikgIk1heGltdW0gbGVucyBhcGVydHVyZSJ9LAorICAgIHsgIDB4OTIwNiwgKGNoYXIgKikgIlN1YmplY3REaXN0YW5jZSIsIChjaGFyICopICJTdWJqZWN0IGRpc3RhbmNlIn0sCisgICAgeyAgMHg5MjA3LCAoY2hhciAqKSAiTWV0ZXJpbmdNb2RlIiwgKGNoYXIgKikgIk1ldGVyaW5nIG1vZGUifSwKKyAgICB7ICAweDkyMDgsIChjaGFyICopICJMaWdodFNvdXJjZSIsIChjaGFyICopICJMaWdodCBzb3VyY2UifSwKKyAgICB7ICAweDkyMDksIChjaGFyICopICJGbGFzaCIsIChjaGFyICopICJGbGFzaCJ9LAorICAgIHsgIDB4OTIwQSwgKGNoYXIgKikgIkZvY2FsTGVuZ3RoIiwgKGNoYXIgKikgIkxlbnMgZm9jYWwgbGVuZ3RoIn0sCisJeyAgMHg5MjE0LCAoY2hhciAqKSAiU3ViamVjdEFyZWEiLCAoY2hhciAqKSAiU3ViamVjdCBhcmVhIn0sCisgICAgeyAgMHg5MjdDLCAoY2hhciAqKSAiTWFrZXJOb3RlIiwgKGNoYXIgKikgIk1hbnVmYWN0dXJlciBub3RlcyJ9LAorICAgIHsgIDB4OTI4NiwgKGNoYXIgKikgIlVzZXJDb21tZW50IiwgKGNoYXIgKikgIlVzZXIgY29tbWVudHMifSwKKyAgICB7ICAweDkyOTAsIChjaGFyICopICJTdWJTZWNUaW1lIiwgKGNoYXIgKikgIkRhdGVUaW1lIHN1YnNlY29uZHMifSwKKyAgICB7ICAweDkyOTEsIChjaGFyICopICJTdWJTZWNUaW1lT3JpZ2luYWwiLCAoY2hhciAqKSAiRGF0ZVRpbWVPcmlnaW5hbCBzdWJzZWNvbmRzIn0sCisgICAgeyAgMHg5MjkyLCAoY2hhciAqKSAiU3ViU2VjVGltZURpZ2l0aXplZCIsIChjaGFyICopICJEYXRlVGltZURpZ2l0aXplZCBzdWJzZWNvbmRzIn0sCisgICAgeyAgMHhBMDAwLCAoY2hhciAqKSAiRmxhc2hQaXhWZXJzaW9uIiwgKGNoYXIgKikgIlN1cHBvcnRlZCBGbGFzaHBpeCB2ZXJzaW9uIn0sCisgICAgeyAgMHhBMDAxLCAoY2hhciAqKSAiQ29sb3JTcGFjZSIsIChjaGFyICopICJDb2xvciBzcGFjZSBpbmZvcm1hdGlvbiJ9LAorICAgIHsgIDB4QTAwMiwgKGNoYXIgKikgIlBpeGVsWERpbWVuc2lvbiIsIChjaGFyICopICJWYWxpZCBpbWFnZSB3aWR0aCJ9LAorICAgIHsgIDB4QTAwMywgKGNoYXIgKikgIlBpeGVsWURpbWVuc2lvbiIsIChjaGFyICopICJWYWxpZCBpbWFnZSBoZWlnaHQifSwKKyAgICB7ICAweEEwMDQsIChjaGFyICopICJSZWxhdGVkU291bmRGaWxlIiwgKGNoYXIgKikgIlJlbGF0ZWQgYXVkaW8gZmlsZSJ9LAorICAgIHsgIDB4QTAwNSwgKGNoYXIgKikgIkludGVyb3BlcmFiaWxpdHlPZmZzZXQiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweEEyMEIsIChjaGFyICopICJGbGFzaEVuZXJneSIsIChjaGFyICopICJGbGFzaCBlbmVyZ3kifSwKKyAgICB7ICAweEEyMEMsIChjaGFyICopICJTcGF0aWFsRnJlcXVlbmN5UmVzcG9uc2UiLCAoY2hhciAqKSAiU3BhdGlhbCBmcmVxdWVuY3kgcmVzcG9uc2UifSwKKyAgICB7ICAweEEyMEUsIChjaGFyICopICJGb2NhbFBsYW5lWFJlc29sdXRpb24iLCAoY2hhciAqKSAiRm9jYWwgcGxhbmUgWCByZXNvbHV0aW9uIn0sCisgICAgeyAgMHhBMjBGLCAoY2hhciAqKSAiRm9jYWxQbGFuZVlSZXNvbHV0aW9uIiwgKGNoYXIgKikgIkZvY2FsIHBsYW5lIFkgcmVzb2x1dGlvbiJ9LAorICAgIHsgIDB4QTIxMCwgKGNoYXIgKikgIkZvY2FsUGxhbmVSZXNvbHV0aW9uVW5pdCIsIChjaGFyICopICJGb2NhbCBwbGFuZSByZXNvbHV0aW9uIHVuaXQifSwKKyAgICB7ICAweEEyMTQsIChjaGFyICopICJTdWJqZWN0TG9jYXRpb24iLCAoY2hhciAqKSAiU3ViamVjdCBsb2NhdGlvbiJ9LAorICAgIHsgIDB4QTIxNSwgKGNoYXIgKikgIkV4cG9zdXJlSW5kZXgiLCAoY2hhciAqKSAiRXhwb3N1cmUgaW5kZXgifSwKKyAgICB7ICAweEEyMTcsIChjaGFyICopICJTZW5zaW5nTWV0aG9kIiwgKGNoYXIgKikgIlNlbnNpbmcgbWV0aG9kIn0sCisgICAgeyAgMHhBMzAwLCAoY2hhciAqKSAiRmlsZVNyYyIsIChjaGFyICopICJGaWxlIHNvdXJjZSJ9LAorICAgIHsgIDB4QTMwMSwgKGNoYXIgKikgIlNjZW5lVHlwZSIsIChjaGFyICopICJTY2VuZSB0eXBlIn0sCisgICAgeyAgMHhBMzAyLCAoY2hhciAqKSAiQ0ZBUGF0dGVybiIsIChjaGFyICopICJDRkEgcGF0dGVybiJ9LAorICAgIHsgIDB4QTQwMSwgKGNoYXIgKikgIkN1c3RvbVJlbmRlcmVkIiwgKGNoYXIgKikgIkN1c3RvbSBpbWFnZSBwcm9jZXNzaW5nIn0sCisgICAgeyAgMHhBNDAyLCAoY2hhciAqKSAiRXhwb3N1cmVNb2RlIiwgKGNoYXIgKikgIkV4cG9zdXJlIG1vZGUifSwKKyAgICB7ICAweEE0MDMsIChjaGFyICopICJXaGl0ZUJhbGFuY2UiLCAoY2hhciAqKSAiV2hpdGUgYmFsYW5jZSJ9LAorICAgIHsgIDB4QTQwNCwgKGNoYXIgKikgIkRpZ2l0YWxab29tUmF0aW8iLCAoY2hhciAqKSAiRGlnaXRhbCB6b29tIHJhdGlvIn0sCisgICAgeyAgMHhBNDA1LCAoY2hhciAqKSAiRm9jYWxMZW5ndGhJbjM1bW1GaWxtIiwgKGNoYXIgKikgIkZvY2FsIGxlbmd0aCBpbiAzNSBtbSBmaWxtIn0sCisgICAgeyAgMHhBNDA2LCAoY2hhciAqKSAiU2NlbmVDYXB0dXJlVHlwZSIsIChjaGFyICopICJTY2VuZSBjYXB0dXJlIHR5cGUifSwKKyAgICB7ICAweEE0MDcsIChjaGFyICopICJHYWluQ29udHJvbCIsIChjaGFyICopICJHYWluIGNvbnRyb2wifSwKKyAgICB7ICAweEE0MDgsIChjaGFyICopICJDb250cmFzdCIsIChjaGFyICopICJDb250cmFzdCJ9LAorICAgIHsgIDB4QTQwOSwgKGNoYXIgKikgIlNhdHVyYXRpb24iLCAoY2hhciAqKSAiU2F0dXJhdGlvbiJ9LAorICAgIHsgIDB4QTQwQSwgKGNoYXIgKikgIlNoYXJwbmVzcyIsIChjaGFyICopICJTaGFycG5lc3MifSwKKyAgICB7ICAweEE0MEIsIChjaGFyICopICJEZXZpY2VTZXR0aW5nRGVzY3JpcHRpb24iLCAoY2hhciAqKSAiRGV2aWNlIHNldHRpbmdzIGRlc2NyaXB0aW9uIn0sCisgICAgeyAgMHhBNDBDLCAoY2hhciAqKSAiU3ViamVjdERpc3RhbmNlUmFuZ2UiLCAoY2hhciAqKSAiU3ViamVjdCBkaXN0YW5jZSByYW5nZSJ9LAorICAgIHsgIDB4QTQyMCwgKGNoYXIgKikgIkltYWdlVW5pcXVlSUQiLCAoY2hhciAqKSAiVW5pcXVlIGltYWdlIElEIn0sCisgICAgeyAgMHhBNDMwLCAoY2hhciAqKSAiQ2FtZXJhT3duZXJOYW1lIiwgKGNoYXIgKikgIkNhbWVyYSBvd25lciBuYW1lIn0sCisgICAgeyAgMHhBNDMxLCAoY2hhciAqKSAiQm9keVNlcmlhbE51bWJlciIsIChjaGFyICopICJCb2R5IHNlcmlhbCBudW1iZXIifSwKKyAgICB7ICAweEE0MzIsIChjaGFyICopICJMZW5zU3BlY2lmaWNhdGlvbiIsIChjaGFyICopICJMZW5zIHNwZWNpZmljYXRpb24ifSwKKyAgICB7ICAweEE0MzMsIChjaGFyICopICJMZW5zTWFrZSIsIChjaGFyICopICJMZW5zIG1ha2UifSwKKyAgICB7ICAweEE0MzQsIChjaGFyICopICJMZW5zTW9kZWwiLCAoY2hhciAqKSAiTGVucyBtb2RlbCJ9LAorICAgIHsgIDB4QTQzNSwgKGNoYXIgKikgIkxlbnNTZXJpYWxOdW1iZXIiLCAoY2hhciAqKSAiTGVucyBzZXJpYWwgbnVtYmVyIn0sCisKKwkvLyBUaGVzZSB0YWdzIGFyZSBub3QgcGFydCBvZiB0aGUgRXhpdiB2Mi4zIHNwZWNpZmljYXRpb25zIGJ1dCBhcmUgb2Z0ZW4gbG9hZGVkIGJ5IGFwcGxpY2F0aW9ucyBhcyBFeGlmIGRhdGEKKwl7ICAweDQ3NDYsIChjaGFyICopICJSYXRpbmciLCAoY2hhciAqKSAiUmF0aW5nIHRhZyB1c2VkIGJ5IFdpbmRvd3MifSwKKwl7ICAweDQ3NDksIChjaGFyICopICJSYXRpbmdQZXJjZW50IiwgKGNoYXIgKikgIlJhdGluZyB0YWcgdXNlZCBieSBXaW5kb3dzLCB2YWx1ZSBpbiBwZXJjZW50In0sCisJeyAgMHg5QzlCLCAoY2hhciAqKSAiWFBUaXRsZSIsIChjaGFyICopICJUaXRsZSB0YWcgdXNlZCBieSBXaW5kb3dzLCBlbmNvZGVkIGluIFVDUzIifSwKKwl7ICAweDlDOUMsIChjaGFyICopICJYUENvbW1lbnQiLCAoY2hhciAqKSAiQ29tbWVudCB0YWcgdXNlZCBieSBXaW5kb3dzLCBlbmNvZGVkIGluIFVDUzIifSwKKwl7ICAweDlDOUQsIChjaGFyICopICJYUEF1dGhvciIsIChjaGFyICopICJBdXRob3IgdGFnIHVzZWQgYnkgV2luZG93cywgZW5jb2RlZCBpbiBVQ1MyIn0sCisJeyAgMHg5QzlFLCAoY2hhciAqKSAiWFBLZXl3b3JkcyIsIChjaGFyICopICJLZXl3b3JkcyB0YWcgdXNlZCBieSBXaW5kb3dzLCBlbmNvZGVkIGluIFVDUzIifSwKKwl7ICAweDlDOUYsIChjaGFyICopICJYUFN1YmplY3QiLCAoY2hhciAqKSAiU3ViamVjdCB0YWcgdXNlZCBieSBXaW5kb3dzLCBlbmNvZGVkIGluIFVDUzIifSwKKyAgICB7ICAweDAwMDAsIChjaGFyICopIE5VTEwsIChjaGFyICopIE5VTEx9CisgIH07CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFWElGIEdQUyB0YWdzIGRlZmluaXRpb24KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBUYWdJbmZvCisgIGV4aWZfZ3BzX3RhZ190YWJsZVtdID0KKyAgeworICAgIHsgIDB4MDAwMCwgKGNoYXIgKikgIkdQU1ZlcnNpb25JRCIsIChjaGFyICopICJHUFMgdGFnIHZlcnNpb24ifSwKKwl7ICAweDAwMDEsIChjaGFyICopICJHUFNMYXRpdHVkZVJlZiIsIChjaGFyICopICJOb3J0aCBvciBTb3V0aCBMYXRpdHVkZSJ9LAorICAgIHsgIDB4MDAwMiwgKGNoYXIgKikgIkdQU0xhdGl0dWRlIiwgKGNoYXIgKikgIkxhdGl0dWRlIn0sCisgICAgeyAgMHgwMDAzLCAoY2hhciAqKSAiR1BTTG9uZ2l0dWRlUmVmIiwgKGNoYXIgKikgIkVhc3Qgb3IgV2VzdCBMb25naXR1ZGUifSwKKyAgICB7ICAweDAwMDQsIChjaGFyICopICJHUFNMb25naXR1ZGUiLCAoY2hhciAqKSAiTG9uZ2l0dWRlIn0sCisgICAgeyAgMHgwMDA1LCAoY2hhciAqKSAiR1BTQWx0aXR1ZGVSZWYiLCAoY2hhciAqKSAiQWx0aXR1ZGUgcmVmZXJlbmNlIn0sCisgICAgeyAgMHgwMDA2LCAoY2hhciAqKSAiR1BTQWx0aXR1ZGUiLCAoY2hhciAqKSAiQWx0aXR1ZGUifSwKKyAgICB7ICAweDAwMDcsIChjaGFyICopICJHUFNUaW1lU3RhbXAiLCAoY2hhciAqKSAiR1BTIHRpbWUgKGF0b21pYyBjbG9jaykifSwKKyAgICB7ICAweDAwMDgsIChjaGFyICopICJHUFNTYXRlbGxpdGVzIiwgKGNoYXIgKikgIkdQUyBzYXRlbGxpdGVzIHVzZWQgZm9yIG1lYXN1cmVtZW50In0sCisgICAgeyAgMHgwMDA5LCAoY2hhciAqKSAiR1BTU3RhdHVzIiwgKGNoYXIgKikgIkdQUyByZWNlaXZlciBzdGF0dXMifSwKKyAgICB7ICAweDAwMEEsIChjaGFyICopICJHUFNNZWFzdXJlTW9kZSIsIChjaGFyICopICJHUFMgbWVhc3VyZW1lbnQgbW9kZSJ9LAorICAgIHsgIDB4MDAwQiwgKGNoYXIgKikgIkdQU0RPUCIsIChjaGFyICopICJNZWFzdXJlbWVudCBwcmVjaXNpb24ifSwKKyAgICB7ICAweDAwMEMsIChjaGFyICopICJHUFNTcGVlZFJlZiIsIChjaGFyICopICJTcGVlZCB1bml0In0sCisgICAgeyAgMHgwMDBELCAoY2hhciAqKSAiR1BTU3BlZWQiLCAoY2hhciAqKSAiU3BlZWQgb2YgR1BTIHJlY2VpdmVyIn0sCisgICAgeyAgMHgwMDBFLCAoY2hhciAqKSAiR1BTVHJhY2tSZWYiLCAoY2hhciAqKSAiUmVmZXJlbmNlIGZvciBkaXJlY3Rpb24gb2YgbW92ZW1lbnQifSwKKyAgICB7ICAweDAwMEYsIChjaGFyICopICJHUFNUcmFjayIsIChjaGFyICopICJEaXJlY3Rpb24gb2YgbW92ZW1lbnQifSwKKyAgICB7ICAweDAwMTAsIChjaGFyICopICJHUFNJbWdEaXJlY3Rpb25SZWYiLCAoY2hhciAqKSAiUmVmZXJlbmNlIGZvciBkaXJlY3Rpb24gb2YgaW1hZ2UifSwKKyAgICB7ICAweDAwMTEsIChjaGFyICopICJHUFNJbWdEaXJlY3Rpb24iLCAoY2hhciAqKSAiRGlyZWN0aW9uIG9mIGltYWdlIn0sCisgICAgeyAgMHgwMDEyLCAoY2hhciAqKSAiR1BTTWFwRGF0dW0iLCAoY2hhciAqKSAiR2VvZGV0aWMgc3VydmV5IGRhdGEgdXNlZCJ9LAorICAgIHsgIDB4MDAxMywgKGNoYXIgKikgIkdQU0Rlc3RMYXRpdHVkZVJlZiIsIChjaGFyICopICJSZWZlcmVuY2UgZm9yIGxhdGl0dWRlIG9mIGRlc3RpbmF0aW9uIn0sCisgICAgeyAgMHgwMDE0LCAoY2hhciAqKSAiR1BTRGVzdExhdGl0dWRlIiwgKGNoYXIgKikgIkxhdGl0dWRlIG9mIGRlc3RpbmF0aW9uIn0sCisgICAgeyAgMHgwMDE1LCAoY2hhciAqKSAiR1BTRGVzdExvbmdpdHVkZVJlZiIsIChjaGFyICopICJSZWZlcmVuY2UgZm9yIGxvbmdpdHVkZSBvZiBkZXN0aW5hdGlvbiJ9LAorICAgIHsgIDB4MDAxNiwgKGNoYXIgKikgIkdQU0Rlc3RMb25naXR1ZGUiLCAoY2hhciAqKSAiTG9uZ2l0dWRlIG9mIGRlc3RpbmF0aW9uIn0sCisgICAgeyAgMHgwMDE3LCAoY2hhciAqKSAiR1BTRGVzdEJlYXJpbmdSZWYiLCAoY2hhciAqKSAiUmVmZXJlbmNlIGZvciBiZWFyaW5nIG9mIGRlc3RpbmF0aW9uIn0sCisgICAgeyAgMHgwMDE4LCAoY2hhciAqKSAiR1BTRGVzdEJlYXJpbmciLCAoY2hhciAqKSAiQmVhcmluZyBvZiBkZXN0aW5hdGlvbiJ9LAorICAgIHsgIDB4MDAxOSwgKGNoYXIgKikgIkdQU0Rlc3REaXN0YW5jZVJlZiIsIChjaGFyICopICJSZWZlcmVuY2UgZm9yIGRpc3RhbmNlIHRvIGRlc3RpbmF0aW9uIn0sCisgICAgeyAgMHgwMDFBLCAoY2hhciAqKSAiR1BTRGVzdERpc3RhbmNlIiwgKGNoYXIgKikgIkRpc3RhbmNlIHRvIGRlc3RpbmF0aW9uIn0sCisgICAgeyAgMHgwMDFCLCAoY2hhciAqKSAiR1BTUHJvY2Vzc2luZ01ldGhvZCIsIChjaGFyICopICJOYW1lIG9mIEdQUyBwcm9jZXNzaW5nIG1ldGhvZCJ9LAorICAgIHsgIDB4MDAxQywgKGNoYXIgKikgIkdQU0FyZWFJbmZvcm1hdGlvbiIsIChjaGFyICopICJOYW1lIG9mIEdQUyBhcmVhIn0sCisgICAgeyAgMHgwMDFELCAoY2hhciAqKSAiR1BTRGF0ZVN0YW1wIiwgKGNoYXIgKikgIkdQUyBkYXRlIn0sCisgICAgeyAgMHgwMDFFLCAoY2hhciAqKSAiR1BTRGlmZmVyZW50aWFsIiwgKGNoYXIgKikgIkdQUyBkaWZmZXJlbnRpYWwgY29ycmVjdGlvbiJ9LAorICAgIHsgIDB4MDAwMCwgKGNoYXIgKikgTlVMTCwgKGNoYXIgKikgTlVMTH0KKyAgfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVYSUYgaW50ZXJvcGVyYWJpbGl0eSB0YWdzIGRlZmluaXRpb24KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBUYWdJbmZvCisgIGV4aWZfaW50ZXJvcF90YWdfdGFibGVbXSA9CisgIHsKKyAgICB7ICAweDAwMDEsIChjaGFyICopICJJbnRlcm9wZXJhYmlsaXR5SW5kZXgiLCAoY2hhciAqKSAiSW50ZXJvcGVyYWJpbGl0eSBJZGVudGlmaWNhdGlvbiJ9LAorICAgIHsgIDB4MDAwMiwgKGNoYXIgKikgIkludGVyb3BlcmFiaWxpdHlWZXJzaW9uIiwgKGNoYXIgKikgIkludGVyb3BlcmFiaWxpdHkgdmVyc2lvbiJ9LAorICAgIHsgIDB4MTAwMCwgKGNoYXIgKikgIlJlbGF0ZWRJbWFnZUZpbGVGb3JtYXQiLCAoY2hhciAqKSAiRmlsZSBmb3JtYXQgb2YgaW1hZ2UgZmlsZSJ9LAorICAgIHsgIDB4MTAwMSwgKGNoYXIgKikgIlJlbGF0ZWRJbWFnZVdpZHRoIiwgKGNoYXIgKikgIkltYWdlIHdpZHRoIn0sCisgICAgeyAgMHgxMDAyLCAoY2hhciAqKSAiUmVsYXRlZEltYWdlTGVuZ3RoIiwgKGNoYXIgKikgIkltYWdlIGhlaWdodCJ9LAorICAgIHsgIDB4MDAwMCwgKGNoYXIgKikgTlVMTCwgKGNoYXIgKikgTlVMTH0KKyAgfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVYSUYgbWFrZXIgbm90ZSB0YWdzIGRlZmluaXRpb24KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qKgorQ2Fub24gbWFrZXIgbm90ZQorKi8KK3N0YXRpYyBUYWdJbmZvCisgIGV4aWZfY2Fub25fdGFnX3RhYmxlW10gPQorICB7CisgICAgeyAgMHgwMDAxLCAoY2hhciAqKSAiQ2Fub25DYW1lcmFTZXR0aW5ncyIsIChjaGFyICopICJDYW5vbiBDYW1lcmFTZXR0aW5ncyBUYWdzIn0sCisgICAgeyAgMHgwMDAyLCAoY2hhciAqKSAiQ2Fub25Gb2NhbExlbmd0aCIsIChjaGFyICopICJDYW5vbiBGb2NhbExlbmd0aCBUYWdzIn0sCisgICAgeyAgMHgwMDAzLCAoY2hhciAqKSAiQ2Fub25GbGFzaEluZm8/IiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDA0LCAoY2hhciAqKSAiQ2Fub25TaG90SW5mbyIsIChjaGFyICopICJDYW5vbiBTaG90SW5mbyBUYWdzIn0sCisgICAgeyAgMHgwMDA1LCAoY2hhciAqKSAiQ2Fub25QYW5vcmFtYSIsIChjaGFyICopICJDYW5vbiBQYW5vcmFtYSBUYWdzIn0sCisgICAgeyAgMHgwMDA2LCAoY2hhciAqKSAiQ2Fub25JbWFnZVR5cGUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMDcsIChjaGFyICopICJDYW5vbkZpcm13YXJlVmVyc2lvbiIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAwOCwgKGNoYXIgKikgIkZpbGVOdW1iZXIiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMDksIChjaGFyICopICJPd25lck5hbWUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMEEsIChjaGFyICopICJVbmtub3duRDMwIiwgKGNoYXIgKikgIkNhbm9uIFVua25vd25EMzAgVGFncyJ9LAorICAgIHsgIDB4MDAwQywgKGNoYXIgKikgIlNlcmlhbE51bWJlciIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAwRCwgKGNoYXIgKikgIkNhbm9uQ2FtZXJhSW5mbyIsIChjaGFyICopICJDYW5vbiBDYW1lcmFJbmZvIFRhZ3MifSwKKyAgICB7ICAweDAwMEUsIChjaGFyICopICJDYW5vbkZpbGVMZW5ndGgiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMEYsIChjaGFyICopICJDYW5vbkN1c3RvbUZ1bmN0aW9ucyIsIChjaGFyICopICJDdXN0b20gRnVuY3Rpb25zIn0sCisgICAgeyAgMHgwMDEwLCAoY2hhciAqKSAiQ2Fub25Nb2RlbElEIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDEyLCAoY2hhciAqKSAiQ2Fub25BRkluZm8iLCAoY2hhciAqKSAiQ2Fub24gQUZJbmZvIFRhZ3MifSwKKyAgICB7ICAweDAwMTMsIChjaGFyICopICJUaHVtYm5haWxJbWFnZVZhbGlkQXJlYSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAxNSwgKGNoYXIgKikgIlNlcmlhbE51bWJlckZvcm1hdCIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAxQSwgKGNoYXIgKikgIlN1cGVyTWFjcm8iLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMUMsIChjaGFyICopICJEYXRlU3RhbXBNb2RlIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDFELCAoY2hhciAqKSAiTXlDb2xvcnMiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMUUsIChjaGFyICopICJGaXJtd2FyZVJldmlzaW9uIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDIzLCAoY2hhciAqKSAiQ2F0ZWdvcmllcyIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAyNCwgKGNoYXIgKikgIkZhY2VEZXRlY3QxIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDI1LCAoY2hhciAqKSAiRmFjZURldGVjdDIiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMjYsIChjaGFyICopICJDYW5vbkFGSW5mbzIiLCAoY2hhciAqKSAiQ2Fub24gQUZJbmZvMiBUYWdzIn0sCisgICAgeyAgMHgwMDI4LCAoY2hhciAqKSAiSW1hZ2VVbmlxdWVJRCIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDA4MSwgKGNoYXIgKikgIlJhd0RhdGFPZmZzZXQiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwODMsIChjaGFyICopICJPcmlnaW5hbERlY2lzaW9uRGF0YU9mZnNldCIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDA5MCwgKGNoYXIgKikgIkN1c3RvbUZ1bmN0aW9uczFEIiwgKGNoYXIgKikgIkNhbm9uQ3VzdG9tIEZ1bmN0aW9uczFEIFRhZ3MifSwKKyAgICB7ICAweDAwOTEsIChjaGFyICopICJQZXJzb25hbEZ1bmN0aW9ucyIsIChjaGFyICopICJDYW5vbkN1c3RvbSBQZXJzb25hbEZ1bmNzIFRhZ3MifSwKKyAgICB7ICAweDAwOTIsIChjaGFyICopICJQZXJzb25hbEZ1bmN0aW9uVmFsdWVzIiwgKGNoYXIgKikgIkNhbm9uQ3VzdG9tIFBlcnNvbmFsRnVuY1ZhbHVlcyBUYWdzIn0sCisgICAgeyAgMHgwMDkzLCAoY2hhciAqKSAiQ2Fub25GaWxlSW5mbyIsIChjaGFyICopICJDYW5vbiBGaWxlSW5mbyBUYWdzIn0sCisgICAgeyAgMHgwMDk0LCAoY2hhciAqKSAiQUZQb2ludHNJbkZvY3VzMUQiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwOTUsIChjaGFyICopICJMZW5zTW9kZWwiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwOTYsIChjaGFyICopICJTZXJpYWxJbmZvIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDk3LCAoY2hhciAqKSAiRHVzdFJlbW92YWxEYXRhIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgwMDk4LCAoY2hhciAqKSAiQ3JvcEluZm8iLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwOTksIChjaGFyICopICJDdXN0b21GdW5jdGlvbnMyIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgwMDlBLCAoY2hhciAqKSAiQXNwZWN0SW5mbyIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDBBMCwgKGNoYXIgKikgIlByb2Nlc3NpbmdJbmZvIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMEExLCAoY2hhciAqKSAiVG9uZUN1cnZlVGFibGUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwQTIsIChjaGFyICopICJTaGFycG5lc3NUYWJsZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDBBMywgKGNoYXIgKikgIlNoYXJwbmVzc0ZyZXFUYWJsZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDBBNCwgKGNoYXIgKikgIldoaXRlQmFsYW5jZVRhYmxlIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMEE5LCAoY2hhciAqKSAiQ29sb3JCYWxhbmNlIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMEFBLCAoY2hhciAqKSAiTWVhc3VyZWRDb2xvciIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDBBRSwgKGNoYXIgKikgIkNvbG9yVGVtcGVyYXR1cmUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwQjAsIChjaGFyICopICJDYW5vbkZsYWdzIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMEIxLCAoY2hhciAqKSAiTW9kaWZpZWRJbmZvIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMEIyLCAoY2hhciAqKSAiVG9uZUN1cnZlTWF0Y2hpbmciLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwQjMsIChjaGFyICopICJXaGl0ZUJhbGFuY2VNYXRjaGluZyIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDBCNCwgKGNoYXIgKikgIkNvbG9yU3BhY2UiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwQjYsIChjaGFyICopICJQcmV2aWV3SW1hZ2VJbmZvIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMEQwLCAoY2hhciAqKSAiVlJET2Zmc2V0IiwgKGNoYXIgKikgIk9mZnNldCBvZiBWUkQgJ3JlY2lwZSBkYXRhJyBpZiBpdCBleGlzdHMifSwKKyAgICB7ICAweDAwRTAsIChjaGFyICopICJTZW5zb3JJbmZvIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHg0MDAxLCAoY2hhciAqKSAiQ29sb3JEYXRhIiwgKGNoYXIgKikgIkNhbm9uIENvbG9yRGF0YSBUYWdzIn0sCisgICAgeyAgMHg0MDAyLCAoY2hhciAqKSAiQ1JXUGFyYW0/IiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHg0MDAzLCAoY2hhciAqKSAiQ29sb3JJbmZvIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHg0MDA1LCAoY2hhciAqKSAiRmxhdm9yPyIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4NDAwOCwgKGNoYXIgKikgIkJsYWNrTGV2ZWw/IiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHg0MDEwLCAoY2hhciAqKSAiQ3VzdG9tUGljdHVyZVN0eWxlRmlsZU5hbWUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDQwMTMsIChjaGFyICopICJBRk1pY3JvQWRqIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHg0MDE1LCAoY2hhciAqKSAiVmlnbmV0dGluZ0NvcnIiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDQwMTYsIChjaGFyICopICJWaWduZXR0aW5nQ29ycjIiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDQwMTgsIChjaGFyICopICJMaWdodGluZ09wdCIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4NDAxOSwgKGNoYXIgKikgIkxlbnNJbmZvIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHg0MDIwLCAoY2hhciAqKSAiQW1iaWVuY2VJbmZvIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHg0MDI0LCAoY2hhciAqKSAiRmlsdGVySW5mbyIsIChjaGFyICopIE5VTEx9LAorCisJLy8gVGhlc2UgJ3N1YictdGFnIHZhbHVlcyBoYXZlIGJlZW4gY3JlYXRlZCBmb3IgY29uc2lzdGVuY3kgLS0gdGhleSBkb24ndCBleGlzdCB3aXRoaW4gdGhlIGV4aWYgc2VnbWVudAorCisJLy8gRmllbGRzIHVuZGVyIHRhZyAweDAwMDEgKHdlIGFkZCAweEMxMDAgdG8gbWFrZSB1bmlxdWUgdGFnIGlkKQorICAgIHsgIDB4QzEwMCArIDEsIChjaGFyICopICJDYW1lcmFTZXR0aW5nczpNYWNyb01vZGUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweEMxMDAgKyAyLCAoY2hhciAqKSAiQ2FtZXJhU2V0dGluZ3M6U2VsZlRpbWVyIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHhDMTAwICsgMywgKGNoYXIgKikgIkNhbWVyYVNldHRpbmdzOlF1YWxpdHkiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweEMxMDAgKyA0LCAoY2hhciAqKSAiQ2FtZXJhU2V0dGluZ3M6Q2Fub25GbGFzaE1vZGUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweEMxMDAgKyA1LCAoY2hhciAqKSAiQ2FtZXJhU2V0dGluZ3M6Q29udGludW91c0RyaXZlIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHhDMTAwICsgNiwgKGNoYXIgKikgIkNhbWVyYVNldHRpbmdzOjB4MDAwNiIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4QzEwMCArIDcsIChjaGFyICopICJDYW1lcmFTZXR0aW5nczpGb2N1c01vZGUiLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweEMxMDAgKyA4LCAoY2hhciAqKSAiQ2FtZXJhU2V0dGluZ3M6MHgwMDA4IiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHhDMTAwICsgOSwgKGNoYXIgKikgIkNhbWVyYVNldHRpbmdzOlJlY29yZE1vZGUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweEMxMDAgKyAxMCwgKGNoYXIgKikgIkNhbWVyYVNldHRpbmdzOkNhbm9uSW1hZ2VTaXplIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHhDMTAwICsgMTEsIChjaGFyICopICJDYW1lcmFTZXR0aW5nczpFYXN5TW9kZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4QzEwMCArIDEyLCAoY2hhciAqKSAiQ2FtZXJhU2V0dGluZ3M6RGlnaXRhbFpvb20iLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweEMxMDAgKyAxMywgKGNoYXIgKikgIkNhbWVyYVNldHRpbmdzOkNvbnRyYXN0IiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHhDMTAwICsgMTQsIChjaGFyICopICJDYW1lcmFTZXR0aW5nczpTYXR1cmF0aW9uIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHhDMTAwICsgMTUsIChjaGFyICopICJDYW1lcmFTZXR0aW5nczpTaGFycG5lc3MiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweEMxMDAgKyAxNiwgKGNoYXIgKikgIkNhbWVyYVNldHRpbmdzOkNhbWVyYUlTTyIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4QzEwMCArIDE3LCAoY2hhciAqKSAiQ2FtZXJhU2V0dGluZ3M6TWV0ZXJpbmdNb2RlIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHhDMTAwICsgMTgsIChjaGFyICopICJDYW1lcmFTZXR0aW5nczpGb2N1c1JhbmdlIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHhDMTAwICsgMTksIChjaGFyICopICJDYW1lcmFTZXR0aW5nczpBRlBvaW50IiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHhDMTAwICsgMjAsIChjaGFyICopICJDYW1lcmFTZXR0aW5nczpDYW5vbkV4cG9zdXJlTW9kZSIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4QzEwMCArIDIxLCAoY2hhciAqKSAiQ2FtZXJhU2V0dGluZ3M6MHgwMDE1IiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHhDMTAwICsgMjIsIChjaGFyICopICJDYW1lcmFTZXR0aW5nczpMZW5zVHlwZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4QzEwMCArIDIzLCAoY2hhciAqKSAiQ2FtZXJhU2V0dGluZ3M6TG9uZ0ZvY2FsIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHhDMTAwICsgMjQsIChjaGFyICopICJDYW1lcmFTZXR0aW5nczpTaG9ydEZvY2FsIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHhDMTAwICsgMjUsIChjaGFyICopICJDYW1lcmFTZXR0aW5nczpGb2NhbFVuaXRzIiwgKGNoYXIgKikgIkZvY2FsIFVuaXRzIHBlciBtbSJ9LAorICAgIHsgIDB4QzEwMCArIDI2LCAoY2hhciAqKSAiQ2FtZXJhU2V0dGluZ3M6TWF4QXBlcnR1cmUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweEMxMDAgKyAyNywgKGNoYXIgKikgIkNhbWVyYVNldHRpbmdzOk1pbkFwZXJ0dXJlIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHhDMTAwICsgMjgsIChjaGFyICopICJDYW1lcmFTZXR0aW5nczpGbGFzaEFjdGl2aXR5IiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHhDMTAwICsgMjksIChjaGFyICopICJDYW1lcmFTZXR0aW5nczpGbGFzaEJpdHMiLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweEMxMDAgKyAzMCwgKGNoYXIgKikgIkNhbWVyYVNldHRpbmdzOjB4MDAxRSIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4QzEwMCArIDMxLCAoY2hhciAqKSAiQ2FtZXJhU2V0dGluZ3M6MHgwMDFGIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHhDMTAwICsgMzIsIChjaGFyICopICJDYW1lcmFTZXR0aW5nczpGb2N1c0NvbnRpbnVvdXMiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweEMxMDAgKyAzMywgKGNoYXIgKikgIkNhbWVyYVNldHRpbmdzOkFFU2V0dGluZyIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4QzEwMCArIDM0LCAoY2hhciAqKSAiQ2FtZXJhU2V0dGluZ3M6SW1hZ2VTdGFiaWxpemF0aW9uIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHhDMTAwICsgMzUsIChjaGFyICopICJDYW1lcmFTZXR0aW5nczpEaXNwbGF5QXBlcnR1cmUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweEMxMDAgKyAzNiwgKGNoYXIgKikgIkNhbWVyYVNldHRpbmdzOlpvb21Tb3VyY2VXaWR0aCIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4QzEwMCArIDM3LCAoY2hhciAqKSAiQ2FtZXJhU2V0dGluZ3M6Wm9vbVRhcmdldFdpZHRoIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHhDMTAwICsgMzgsIChjaGFyICopICJDYW1lcmFTZXR0aW5nczoweDAwMjYiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweEMxMDAgKyAzOSwgKGNoYXIgKikgIkNhbWVyYVNldHRpbmdzOlNwb3RNZXRlcmluZ01vZGUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweEMxMDAgKyA0MCwgKGNoYXIgKikgIkNhbWVyYVNldHRpbmdzOlBob3RvRWZmZWN0IiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHhDMTAwICsgNDEsIChjaGFyICopICJDYW1lcmFTZXR0aW5nczpNYW51YWxGbGFzaE91dHB1dCIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4QzEwMCArIDQyLCAoY2hhciAqKSAiQ2FtZXJhU2V0dGluZ3M6Q29sb3JUb25lIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHhDMTAwICsgNDMsIChjaGFyICopICJDYW1lcmFTZXR0aW5nczoweDAwMkIiLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweEMxMDAgKyA0NCwgKGNoYXIgKikgIkNhbWVyYVNldHRpbmdzOjB4MDAyQyIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4QzEwMCArIDQ1LCAoY2hhciAqKSAiQ2FtZXJhU2V0dGluZ3M6MHgwMDJEIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHhDMTAwICsgNDYsIChjaGFyICopICJDYW1lcmFTZXR0aW5nczpTUkFXUXVhbGl0eSIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4QzEwMCArIDQ3LCAoY2hhciAqKSAiQ2FtZXJhU2V0dGluZ3M6MHgwMDJGIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHhDMTAwICsgNDgsIChjaGFyICopICJDYW1lcmFTZXR0aW5nczoweDAwMzAiLCAoY2hhciAqKSBOVUxMfSwKKworCS8vIEZpZWxkcyB1bmRlciB0YWcgMHgwMDAyICh3ZSBhZGQgMHhDMjAwIHRvIG1ha2UgdW5pcXVlIHRhZyBpZCkKKyAgICB7ICAweEMyMDAgKyAwLCAoY2hhciAqKSAiRm9jYWxMZW5ndGg6Rm9jYWxUeXBlIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHhDMjAwICsgMSwgKGNoYXIgKikgIkZvY2FsTGVuZ3RoOkZvY2FsTGVuZ3RoIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHhDMjAwICsgMiwgKGNoYXIgKikgIkZvY2FsTGVuZ3RoOkZvY2FsUGxhbmVYU2l6ZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4QzIwMCArIDMsIChjaGFyICopICJGb2NhbExlbmd0aDpGb2NhbFBsYW5lWVNpemUiLCAoY2hhciAqKSBOVUxMfSwKKwkKKwkvLyBGaWVsZHMgdW5kZXIgdGFnIDB4MDAwNCAod2UgYWRkIDB4QzQwMCB0byBtYWtlIHVuaXF1ZSB0YWcgaWQpCisgICAgeyAgMHhDNDAwICsgMSwgKGNoYXIgKikgIlNob3RJbmZvOkF1dG9JU08iLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweEM0MDAgKyAyLCAoY2hhciAqKSAiU2hvdEluZm86QmFzZUlTTyIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4QzQwMCArIDMsIChjaGFyICopICJTaG90SW5mbzpNZWFzdXJlZEVWIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHhDNDAwICsgNCwgKGNoYXIgKikgIlNob3RJbmZvOlRhcmdldEFwZXJ0dXJlIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHhDNDAwICsgNSwgKGNoYXIgKikgIlNob3RJbmZvOlRhcmdldEV4cG9zdXJlVGltZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4QzQwMCArIDYsIChjaGFyICopICJTaG90SW5mbzpFeHBvc3VyZUNvbXBlbnNhdGlvbiIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4QzQwMCArIDcsIChjaGFyICopICJTaG90SW5mbzpXaGl0ZUJhbGFuY2UiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweEM0MDAgKyA4LCAoY2hhciAqKSAiU2hvdEluZm86U2xvd1NodXR0ZXIiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweEM0MDAgKyA5LCAoY2hhciAqKSAiU2hvdEluZm86U2VxdWVuY2VOdW1iZXIiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweEM0MDAgKyAxMCwgKGNoYXIgKikgIlNob3RJbmZvOk9wdGljYWxab29tQ29kZSIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4QzQwMCArIDExLCAoY2hhciAqKSAiU2hvdEluZm86MHgwMDBCIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHhDNDAwICsgMTIsIChjaGFyICopICJTaG90SW5mbzpDYW1lcmFUZW1wZXJhdHVyZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4QzQwMCArIDEzLCAoY2hhciAqKSAiU2hvdEluZm86Rmxhc2hHdWlkZU51bWJlciIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4QzQwMCArIDE0LCAoY2hhciAqKSAiU2hvdEluZm86QUZQb2ludHNJbkZvY3VzIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHhDNDAwICsgMTUsIChjaGFyICopICJTaG90SW5mbzpGbGFzaEV4cG9zdXJlQ29tcCIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4QzQwMCArIDE2LCAoY2hhciAqKSAiU2hvdEluZm86QXV0b0V4cG9zdXJlQnJhY2tldGluZyIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4QzQwMCArIDE3LCAoY2hhciAqKSAiU2hvdEluZm86QUVCQnJhY2tldFZhbHVlIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHhDNDAwICsgMTgsIChjaGFyICopICJTaG90SW5mbzpDb250cm9sTW9kZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4QzQwMCArIDE5LCAoY2hhciAqKSAiU2hvdEluZm86Rm9jdXNEaXN0YW5jZVVwcGVyIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHhDNDAwICsgMjAsIChjaGFyICopICJTaG90SW5mbzpGb2N1c0Rpc3RhbmNlTG93ZXIiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweEM0MDAgKyAyMSwgKGNoYXIgKikgIlNob3RJbmZvOkZOdW1iZXIiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweEM0MDAgKyAyMiwgKGNoYXIgKikgIlNob3RJbmZvOkV4cG9zdXJlVGltZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4QzQwMCArIDIzLCAoY2hhciAqKSAiU2hvdEluZm86TWVhc3VyZWRFVjIiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweEM0MDAgKyAyNCwgKGNoYXIgKikgIlNob3RJbmZvOkJ1bGJEdXJhdGlvbiIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4QzQwMCArIDI1LCAoY2hhciAqKSAiU2hvdEluZm86MHgwMDE5IiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHhDNDAwICsgMjYsIChjaGFyICopICJTaG90SW5mbzpDYW1lcmFUeXBlIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHhDNDAwICsgMjcsIChjaGFyICopICJTaG90SW5mbzpBdXRvUm90YXRlIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHhDNDAwICsgMjgsIChjaGFyICopICJTaG90SW5mbzpOREZpbHRlciIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4QzQwMCArIDI5LCAoY2hhciAqKSAiU2hvdEluZm86U2VsZlRpbWVyMiIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4QzQwMCArIDMwLCAoY2hhciAqKSAiU2hvdEluZm86MHgwMDFFIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHhDNDAwICsgMzEsIChjaGFyICopICJTaG90SW5mbzoweDAwMUYiLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweEM0MDAgKyAzMiwgKGNoYXIgKikgIlNob3RJbmZvOjB4MDAyMCIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4QzQwMCArIDMzLCAoY2hhciAqKSAiU2hvdEluZm86Rmxhc2hPdXRwdXQiLCAoY2hhciAqKSBOVUxMfSwKKworCS8vIEZpZWxkcyB1bmRlciB0YWcgMHgwMDEyICh3ZSBhZGQgMHgxMjAwIHRvIG1ha2UgdW5pcXVlIHRhZyBpZCkKKyAgICB7ICAweDEyMDAgKyAwLCAoY2hhciAqKSAiQUZJbmZvOk51bUFGUG9pbnRzIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgxMjAwICsgMSwgKGNoYXIgKikgIkFGSW5mbzpWYWxpZEFGUG9pbnRzIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgxMjAwICsgMiwgKGNoYXIgKikgIkFGSW5mbzpDYW5vbkltYWdlV2lkdGgiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDEyMDAgKyAzLCAoY2hhciAqKSAiQUZJbmZvOkNhbm9uSW1hZ2VIZWlnaHQiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDEyMDAgKyA0LCAoY2hhciAqKSAiQUZJbmZvOkFGSW1hZ2VXaWR0aCIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MTIwMCArIDUsIChjaGFyICopICJBRkluZm86QUZJbWFnZUhlaWdodCIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MTIwMCArIDYsIChjaGFyICopICJBRkluZm86QUZBcmVhV2lkdGgiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDEyMDAgKyA3LCAoY2hhciAqKSAiQUZJbmZvOkFGQXJlYUhlaWdodCIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MTIwMCArIDgsIChjaGFyICopICJBRkluZm86QUZBcmVhWFBvc2l0aW9ucyIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MTIwMCArIDksIChjaGFyICopICJBRkluZm86QUZBcmVhWVBvc2l0aW9ucyIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MTIwMCArIDEwLCAoY2hhciAqKSAiQUZJbmZvOkFGUG9pbnRzSW5Gb2N1cyIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MTIwMCArIDExLCAoY2hhciAqKSAiQUZJbmZvOlByaW1hcnlBRlBvaW50PyIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MTIwMCArIDEyLCAoY2hhciAqKSAiQUZJbmZvOlByaW1hcnlBRlBvaW50IiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgxMjAwICsgMTMsIChjaGFyICopICJBRkluZm86MHgwMDBEIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgxMjAwICsgMTQsIChjaGFyICopICJBRkluZm86MHgwMDBFIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgxMjAwICsgMTUsIChjaGFyICopICJBRkluZm86MHgwMDBGIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgxMjAwICsgMTYsIChjaGFyICopICJBRkluZm86MHgwMDEwIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgxMjAwICsgMTcsIChjaGFyICopICJBRkluZm86MHgwMDExIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgxMjAwICsgMTgsIChjaGFyICopICJBRkluZm86MHgwMDEyIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgxMjAwICsgMTksIChjaGFyICopICJBRkluZm86MHgwMDEzIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgxMjAwICsgMjAsIChjaGFyICopICJBRkluZm86MHgwMDE0IiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgxMjAwICsgMjEsIChjaGFyICopICJBRkluZm86MHgwMDE1IiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgxMjAwICsgMjIsIChjaGFyICopICJBRkluZm86MHgwMDE2IiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgxMjAwICsgMjMsIChjaGFyICopICJBRkluZm86MHgwMDE3IiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgxMjAwICsgMjQsIChjaGFyICopICJBRkluZm86MHgwMDE4IiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgxMjAwICsgMjUsIChjaGFyICopICJBRkluZm86MHgwMDE5IiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgxMjAwICsgMjYsIChjaGFyICopICJBRkluZm86MHgwMDFBIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgxMjAwICsgMjcsIChjaGFyICopICJBRkluZm86MHgwMDFCIiwgKGNoYXIgKikgTlVMTH0sCisKKwkvLyBGaWVsZHMgdW5kZXIgdGFnIDB4MDBBMCAod2UgYWRkIDB4Q0EwMCB0byBtYWtlIHVuaXF1ZSB0YWcgaWQpCisgICAgeyAgMHhDQTAwICsgMSwgKGNoYXIgKikgIlByb2Nlc3NpbmdJbmZvOlRvbmVDdXJ2ZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4Q0EwMCArIDIsIChjaGFyICopICJQcm9jZXNzaW5nSW5mbzpTaGFycG5lc3MiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweENBMDAgKyAzLCAoY2hhciAqKSAiUHJvY2Vzc2luZ0luZm86U2hhcnBuZXNzRnJlcXVlbmN5IiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHhDQTAwICsgNCwgKGNoYXIgKikgIlByb2Nlc3NpbmdJbmZvOlNlbnNvclJlZExldmVsIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHhDQTAwICsgNSwgKGNoYXIgKikgIlByb2Nlc3NpbmdJbmZvOlNlbnNvckJsdWVMZXZlbCIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4Q0EwMCArIDYsIChjaGFyICopICJQcm9jZXNzaW5nSW5mbzpXaGl0ZUJhbGFuY2VSZWQiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweENBMDAgKyA3LCAoY2hhciAqKSAiUHJvY2Vzc2luZ0luZm86V2hpdGVCYWxhbmNlQmx1ZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4Q0EwMCArIDgsIChjaGFyICopICJQcm9jZXNzaW5nSW5mbzpXaGl0ZUJhbGFuY2UiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweENBMDAgKyA5LCAoY2hhciAqKSAiUHJvY2Vzc2luZ0luZm86Q29sb3JUZW1wZXJhdHVyZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4Q0EwMCArIDEwLCAoY2hhciAqKSAiUHJvY2Vzc2luZ0luZm86UGljdHVyZVN0eWxlIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHhDQTAwICsgMTEsIChjaGFyICopICJQcm9jZXNzaW5nSW5mbzpEaWdpdGFsR2FpbiIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4Q0EwMCArIDEyLCAoY2hhciAqKSAiUHJvY2Vzc2luZ0luZm86V0JTaGlmdEFCIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHhDQTAwICsgMTMsIChjaGFyICopICJQcm9jZXNzaW5nSW5mbzpXQlNoaWZ0R00iLCAoY2hhciAqKSBOVUxMfSwKKworCS8vIEZpZWxkcyB1bmRlciB0YWcgMHgwMEUwICh3ZSBhZGQgMHhDRTAwIHRvIG1ha2UgdW5pcXVlIHRhZyBpZCkKKyAgICB7ICAweENFMDAgKyAxLCAoY2hhciAqKSAiU2Vuc29ySW5mbzpTZW5zb3JXaWR0aCIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4Q0UwMCArIDIsIChjaGFyICopICJTZW5zb3JJbmZvOlNlbnNvckhlaWdodCIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4Q0UwMCArIDMsIChjaGFyICopICJTZW5zb3JJbmZvOjB4MDAwMyIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4Q0UwMCArIDQsIChjaGFyICopICJTZW5zb3JJbmZvOjB4MDAwNCIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4Q0UwMCArIDUsIChjaGFyICopICJTZW5zb3JJbmZvOlNlbnNvckxlZnRCb3JkZXIiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweENFMDAgKyA2LCAoY2hhciAqKSAiU2Vuc29ySW5mbzpTZW5zb3JUb3BCb3JkZXIiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweENFMDAgKyA3LCAoY2hhciAqKSAiU2Vuc29ySW5mbzpTZW5zb3JSaWdodEJvcmRlciIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4Q0UwMCArIDgsIChjaGFyICopICJTZW5zb3JJbmZvOlNlbnNvckJvdHRvbUJvcmRlciIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4Q0UwMCArIDksIChjaGFyICopICJTZW5zb3JJbmZvOkJsYWNrTWFza0xlZnRCb3JkZXIiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweENFMDAgKyAxMCwgKGNoYXIgKikgIlNlbnNvckluZm86QmxhY2tNYXNrVG9wQm9yZGVyIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHhDRTAwICsgMTEsIChjaGFyICopICJTZW5zb3JJbmZvOkJsYWNrTWFza1JpZ2h0Qm9yZGVyIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHhDRTAwICsgMTIsIChjaGFyICopICJTZW5zb3JJbmZvOkJsYWNrTWFza0JvdHRvbUJvcmRlciIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4Q0UwMCArIDEzLCAoY2hhciAqKSAiU2Vuc29ySW5mbzoweDAwMEQiLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweENFMDAgKyAxNCwgKGNoYXIgKikgIlNlbnNvckluZm86MHgwMDBFIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHhDRTAwICsgMTUsIChjaGFyICopICJTZW5zb3JJbmZvOjB4MDAwRiIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4Q0UwMCArIDE2LCAoY2hhciAqKSAiU2Vuc29ySW5mbzoweDAwMTAiLCAoY2hhciAqKSBOVUxMfSwKKworICAgIHsgIDB4MDAwMCwgKGNoYXIgKikgTlVMTCwgKGNoYXIgKikgTlVMTH0KKyAgfTsKKworLyoqCitDYXNpbyB0eXBlIDEgbWFrZXIgbm90ZQorKi8KK3N0YXRpYyBUYWdJbmZvCisgIGV4aWZfY2FzaW9fdHlwZTFfdGFnX3RhYmxlW10gPQorICB7CisgICAgeyAgMHgwMDAxLCAoY2hhciAqKSAiUmVjb3JkaW5nTW9kZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAwMiwgKGNoYXIgKikgIlF1YWxpdHkiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMDMsIChjaGFyICopICJGb2N1c01vZGUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMDQsIChjaGFyICopICJGbGFzaE1vZGUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMDUsIChjaGFyICopICJGbGFzaEludGVuc2l0eSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAwNiwgKGNoYXIgKikgIk9iamVjdERpc3RhbmNlIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDA3LCAoY2hhciAqKSAiV2hpdGVCYWxhbmNlIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDBBLCAoY2hhciAqKSAiRGlnaXRhbFpvb20iLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMEIsIChjaGFyICopICJTaGFycG5lc3MiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMEMsIChjaGFyICopICJDb250cmFzdCIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAwRCwgKGNoYXIgKikgIlNhdHVyYXRpb24iLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMTQsIChjaGFyICopICJJU08iLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweDAwMTUsIChjaGFyICopICJGaXJtd2FyZURhdGUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMTYsIChjaGFyICopICJFbmhhbmNlbWVudCIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAxNywgKGNoYXIgKikgIkNvbG9yRmlsdGVyIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDE4LCAoY2hhciAqKSAiQUZQb2ludCIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAxOSwgKGNoYXIgKikgIkZsYXNoSW50ZW5zaXR5IiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwRTAwLCAoY2hhciAqKSAiUHJpbnRJTSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAwMCwgKGNoYXIgKikgTlVMTCwgKGNoYXIgKikgTlVMTH0KKyAgfTsKKworLyoqCitDYXNpbyB0eXBlIDIgbWFrZXIgbm90ZQorKi8KK3N0YXRpYyBUYWdJbmZvCisgIGV4aWZfY2FzaW9fdHlwZTJfdGFnX3RhYmxlW10gPQorICB7CisgICAgeyAgMHgwMDAyLCAoY2hhciAqKSAiUHJldmlld0ltYWdlU2l6ZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAwMywgKGNoYXIgKikgIlByZXZpZXdJbWFnZUxlbmd0aCIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAwNCwgKGNoYXIgKikgIlByZXZpZXdJbWFnZVN0YXJ0IiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDA4LCAoY2hhciAqKSAiUXVhbGl0eU1vZGUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMDksIChjaGFyICopICJDYXNpb0ltYWdlU2l6ZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAwRCwgKGNoYXIgKikgIkZvY3VzTW9kZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAxNCwgKGNoYXIgKikgIklTTyIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAxOSwgKGNoYXIgKikgIldoaXRlQmFsYW5jZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAxRCwgKGNoYXIgKikgIkZvY2FsTGVuZ3RoIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDFGLCAoY2hhciAqKSAiU2F0dXJhdGlvbiIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAyMCwgKGNoYXIgKikgIkNvbnRyYXN0IiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDIxLCAoY2hhciAqKSAiU2hhcnBuZXNzIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwRTAwLCAoY2hhciAqKSAiUHJpbnRJTSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MjAwMCwgKGNoYXIgKikgIlByZXZpZXdJbWFnZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MjAwMSwgKGNoYXIgKikgIkZpcm13YXJlRGF0ZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MjAxMSwgKGNoYXIgKikgIldoaXRlQmFsYW5jZUJpYXMiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDIwMTIsIChjaGFyICopICJXaGl0ZUJhbGFuY2UiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDIwMjEsIChjaGFyICopICJBRlBvaW50UG9zaXRpb24iLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDIwMjIsIChjaGFyICopICJPYmplY3REaXN0YW5jZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MjAzNCwgKGNoYXIgKikgIkZsYXNoRGlzdGFuY2UiLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweDIwNzYsIChjaGFyICopICJTcGVjaWFsRWZmZWN0TW9kZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MzAwMCwgKGNoYXIgKikgIlJlY29yZE1vZGUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDMwMDEsIChjaGFyICopICJSZWxlYXNlTW9kZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MzAwMiwgKGNoYXIgKikgIlF1YWxpdHkiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDMwMDMsIChjaGFyICopICJGb2N1c01vZGUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDMwMDYsIChjaGFyICopICJIb21ldG93bkNpdHkiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDMwMDcsIChjaGFyICopICJCZXN0U2hvdE1vZGUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDMwMDgsIChjaGFyICopICJBdXRvSVNPIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgzMDA5LCAoY2hhciAqKSAiQUZNb2RlIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgzMDExLCAoY2hhciAqKSAiU2hhcnBuZXNzIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgzMDEyLCAoY2hhciAqKSAiQ29udHJhc3QiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDMwMTMsIChjaGFyICopICJTYXR1cmF0aW9uIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgzMDE0LCAoY2hhciAqKSAiSVNPIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgzMDE1LCAoY2hhciAqKSAiQ29sb3JNb2RlIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgzMDE2LCAoY2hhciAqKSAiRW5oYW5jZW1lbnQiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDMwMTcsIChjaGFyICopICJDb2xvckZpbHRlciIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4MzAxQiwgKGNoYXIgKikgIkFydE1vZGUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDMwMUMsIChjaGFyICopICJTZXF1ZW5jZU51bWJlciIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MzAxRCwgKGNoYXIgKikgIkJyYWNrZXRTZXF1ZW5jZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MzAyMCwgKGNoYXIgKikgIkltYWdlU3RhYmlsaXphdGlvbiIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MzAyQSwgKGNoYXIgKikgIkxpZ2h0aW5nTW9kZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MzAyQiwgKGNoYXIgKikgIlBvcnRyYWl0UmVmaW5lciIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MzAzMCwgKGNoYXIgKikgIlNwZWNpYWxFZmZlY3RMZXZlbCIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MzAzMSwgKGNoYXIgKikgIlNwZWNpYWxFZmZlY3RTZXR0aW5nIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgzMTAzLCAoY2hhciAqKSAiRHJpdmVNb2RlIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHg0MDAxLCAoY2hhciAqKSAiQ2FwdHVyZUZyYW1lUmF0ZSIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4NDAwMywgKGNoYXIgKikgIlZpZGVvUXVhbGl0eSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAwMCwgKGNoYXIgKikgTlVMTCwgKGNoYXIgKikgTlVMTH0KKyAgfTsKKworLyoqCitGdWppRmlsbSBtYWtlciBub3RlCisqLworc3RhdGljIFRhZ0luZm8KKyAgZXhpZl9mdWppZmlsbV90YWdfdGFibGVbXSA9CisgIHsKKyAgICB7ICAweDAwMDAsIChjaGFyICopICJWZXJzaW9uIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDEwLCAoY2hhciAqKSAiSW50ZXJuYWxTZXJpYWxOdW1iZXIiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDEwMDAsIChjaGFyICopICJRdWFsaXR5IiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgxMDAxLCAoY2hhciAqKSAiU2hhcnBuZXNzIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgxMDAyLCAoY2hhciAqKSAiV2hpdGVCYWxhbmNlIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgxMDAzLCAoY2hhciAqKSAiU2F0dXJhdGlvbiIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MTAwNCwgKGNoYXIgKikgIkNvbnRyYXN0IiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgxMDA1LCAoY2hhciAqKSAiQ29sb3JUZW1wZXJhdHVyZSIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4MTAwQSwgKGNoYXIgKikgIldoaXRlQmFsYW5jZUZpbmVUdW5lIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgxMDBCLCAoY2hhciAqKSAiTm9pc2VSZWR1Y3Rpb24iLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDEwMTAsIChjaGFyICopICJGdWppRmxhc2hNb2RlIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgxMDExLCAoY2hhciAqKSAiRmxhc2hFeHBvc3VyZUNvbXAiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDEwMjAsIChjaGFyICopICJNYWNybyIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MTAyMSwgKGNoYXIgKikgIkZvY3VzTW9kZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MTAyMywgKGNoYXIgKikgIkZvY3VzUGl4ZWwiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDEwMzAsIChjaGFyICopICJTbG93U3luYyIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MTAzMSwgKGNoYXIgKikgIlBpY3R1cmVNb2RlIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgxMDMzLCAoY2hhciAqKSAiRVhSQXV0byIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4MTAzNCwgKGNoYXIgKikgIkVYUk1vZGUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDExMDAsIChjaGFyICopICJBdXRvQnJhY2tldHRpbmciLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDExMDEsIChjaGFyICopICJTZXF1ZW5jZU51bWJlciIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MTIxMCwgKGNoYXIgKikgIkNvbG9yTW9kZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MTMwMCwgKGNoYXIgKikgIkJsdXJXYXJuaW5nIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgxMzAxLCAoY2hhciAqKSAiRm9jdXNXYXJuaW5nIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgxMzAyLCAoY2hhciAqKSAiRXhwb3N1cmVXYXJuaW5nIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgxNDAwLCAoY2hhciAqKSAiRHluYW1pY1JhbmdlIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgxNDAxLCAoY2hhciAqKSAiRmlsbU1vZGUiLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweDE0MDIsIChjaGFyICopICJEeW5hbWljUmFuZ2VTZXR0aW5nIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgxNDAzLCAoY2hhciAqKSAiRGV2ZWxvcG1lbnREeW5hbWljUmFuZ2UiLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweDE0MDQsIChjaGFyICopICJNaW5Gb2NhbExlbmd0aCIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4MTQwNSwgKGNoYXIgKikgIk1heEZvY2FsTGVuZ3RoIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgxNDA2LCAoY2hhciAqKSAiTWF4QXBlcnR1cmVBdE1pbkZvY2FsIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgxNDA3LCAoY2hhciAqKSAiTWF4QXBlcnR1cmVBdE1heEZvY2FsIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHg0MTAwLCAoY2hhciAqKSAiRmFjZXNEZXRlY3RlZCIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4NDEwMywgKGNoYXIgKikgIkZhY2VQb3NpdGlvbnMiLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweDgwMDAsIChjaGFyICopICJGaWxlU291cmNlIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHg4MDAyLCAoY2hhciAqKSAiT3JkZXJOdW1iZXIiLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweDgwMDMsIChjaGFyICopICJGcmFtZU51bWJlciIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4QjIxMSwgKGNoYXIgKikgIlBhcmFsbGF4IiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDAwLCAoY2hhciAqKSBOVUxMLCAoY2hhciAqKSBOVUxMfQorICB9OworCisvKioKK0t5b2NlcmEgbWFrZXIgbm90ZQorKi8KK3N0YXRpYyBUYWdJbmZvCisgIGV4aWZfa3lvY2VyYV90YWdfdGFibGVbXSA9CisgIHsKKyAgICB7ICAweDAwMDEsIChjaGFyICopICJUaHVtYm5haWxJbWFnZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MEUwMCwgKGNoYXIgKikgIlByaW50SU0iLCAoY2hhciAqKSAiUHJpbnQgSW1hZ2UgTWF0Y2hpbmcgSW5mbyJ9LAorICAgIHsgIDB4MDAwMCwgKGNoYXIgKikgTlVMTCwgKGNoYXIgKikgTlVMTH0KKyAgfTsKKworLyoqCitPbHltcHVzIFR5cGUgMSAvIEVwc29uIC8gQWdmYSBtYWtlciBub3RlCisqLworc3RhdGljIFRhZ0luZm8KKyAgZXhpZl9vbHltcHVzX3R5cGUxX3RhZ190YWJsZVtdID0KKyAgeworICAgIHsgIDB4MDAwMCwgKGNoYXIgKikgIk1ha2VyTm90ZVZlcnNpb24iLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMDEsIChjaGFyICopICJNaW5vbHRhQ2FtZXJhU2V0dGluZ3NPbGQiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMDMsIChjaGFyICopICJNaW5vbHRhQ2FtZXJhU2V0dGluZ3MiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwNDAsIChjaGFyICopICJDb21wcmVzc2VkSW1hZ2VTaXplIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDgxLCAoY2hhciAqKSAiUHJldmlld0ltYWdlRGF0YSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDA4OCwgKGNoYXIgKikgIlByZXZpZXdJbWFnZVN0YXJ0IiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDg5LCAoY2hhciAqKSAiUHJldmlld0ltYWdlTGVuZ3RoIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMTAwLCAoY2hhciAqKSAiVGh1bWJuYWlsSW1hZ2UiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAxMDQsIChjaGFyICopICJCb2R5RmlybXdhcmVWZXJzaW9uIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMjAwLCAoY2hhciAqKSAiU3BlY2lhbE1vZGUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAyMDEsIChjaGFyICopICJRdWFsaXR5IiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMjAyLCAoY2hhciAqKSAiTWFjcm8iLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAyMDMsIChjaGFyICopICJCV01vZGUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAyMDQsIChjaGFyICopICJEaWdpdGFsWm9vbSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDIwNSwgKGNoYXIgKikgIkZvY2FsUGxhbmVEaWFnb25hbCIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4MDIwNiwgKGNoYXIgKikgIkxlbnNEaXN0b3J0aW9uUGFyYW1zIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMjA3LCAoY2hhciAqKSAiQ2FtZXJhVHlwZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDIwOCwgKGNoYXIgKikgIlRleHRJbmZvIiwgKGNoYXIgKikgIk9seW1wdXMgVGV4dEluZm8gVGFncyJ9LAorICAgIHsgIDB4MDIwOSwgKGNoYXIgKikgIkNhbWVyYUlEIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMjBCLCAoY2hhciAqKSAiRXBzb25JbWFnZVdpZHRoIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMjBDLCAoY2hhciAqKSAiRXBzb25JbWFnZUhlaWdodCIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDIwRCwgKGNoYXIgKikgIkVwc29uU29mdHdhcmUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAyODAsIChjaGFyICopICJQcmV2aWV3SW1hZ2UiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAzMDAsIChjaGFyICopICJQcmVDYXB0dXJlRnJhbWVzIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgwMzAxLCAoY2hhciAqKSAiV2hpdGVCb2FyZCIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDMwMiwgKGNoYXIgKikgIk9uZVRvdWNoV0IiLCAoY2hhciAqKSBOVUxMfSwgCisJeyAgMHgwMzAzLCAoY2hhciAqKSAiV2hpdGVCYWxhbmNlQnJhY2tldCIsIChjaGFyICopIE5VTEx9LCAKKwl7ICAweDAzMDQsIChjaGFyICopICJXaGl0ZUJhbGFuY2VCaWFzIiwgKGNoYXIgKikgTlVMTH0sIAorCXsgIDB4MDQwMywgKGNoYXIgKikgIlNjZW5lTW9kZSIsIChjaGFyICopIE5VTEx9LCAKKyAgICB7ICAweDA0MDQsIChjaGFyICopICJTZXJpYWxOdW1iZXIiLCAoY2hhciAqKSBOVUxMfSwgCisJeyAgMHgwNDA1LCAoY2hhciAqKSAiRmlybXdhcmUiLCAoY2hhciAqKSBOVUxMfSwgCisgICAgeyAgMHgwRTAwLCAoY2hhciAqKSAiUHJpbnRJTSIsIChjaGFyICopICJQcmludElNIFRhZ3MifSwgCisJeyAgMHgwRjAwLCAoY2hhciAqKSAiRGF0YUR1bXAiLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweDBGMDEsIChjaGFyICopICJEYXRhRHVtcDIiLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweDEwMDAsIChjaGFyICopICJTaHV0dGVyU3BlZWRWYWx1ZSIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4MTAwMSwgKGNoYXIgKikgIklTT1ZhbHVlIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgxMDAyLCAoY2hhciAqKSAiQXBlcnR1cmVWYWx1ZSIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4MTAwMywgKGNoYXIgKikgIkJyaWdodG5lc3NWYWx1ZSIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4MTAwNCwgKGNoYXIgKikgIkZsYXNoTW9kZSIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4MTAwNSwgKGNoYXIgKikgIkZsYXNoRGV2aWNlIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgxMDA2LCAoY2hhciAqKSAiRXhwb3N1cmVDb21wZW5zYXRpb24iLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweDEwMDcsIChjaGFyICopICJTZW5zb3JUZW1wZXJhdHVyZSIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4MTAwOCwgKGNoYXIgKikgIkxlbnNUZW1wZXJhdHVyZSIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4MTAwOSwgKGNoYXIgKikgIkxpZ2h0Q29uZGl0aW9uIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgxMDBBLCAoY2hhciAqKSAiRm9jdXNSYW5nZSIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4MTAwQiwgKGNoYXIgKikgIkZvY3VzTW9kZSIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4MTAwQywgKGNoYXIgKikgIk1hbnVhbEZvY3VzRGlzdGFuY2UiLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweDEwMEQsIChjaGFyICopICJab29tU3RlcENvdW50IiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgxMDBFLCAoY2hhciAqKSAiRm9jdXNTdGVwQ291bnQiLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweDEwMEYsIChjaGFyICopICJTaGFycG5lc3MiLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweDEwMTAsIChjaGFyICopICJGbGFzaENoYXJnZUxldmVsIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgxMDExLCAoY2hhciAqKSAiQ29sb3JNYXRyaXgiLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweDEwMTIsIChjaGFyICopICJCbGFja0xldmVsIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgxMDE1LCAoY2hhciAqKSAiV0JNb2RlIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgxMDE3LCAoY2hhciAqKSAiUmVkQmFsYW5jZSIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4MTAxOCwgKGNoYXIgKikgIkJsdWVCYWxhbmNlIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgxMDE5LCAoY2hhciAqKSAiQ29sb3JNYXRyaXhOdW1iZXIiLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweDEwMUEsIChjaGFyICopICJTZXJpYWxOdW1iZXIiLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweDEwMjMsIChjaGFyICopICJGbGFzaEV4cG9zdXJlQ29tcCIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4MTAyNCwgKGNoYXIgKikgIkludGVybmFsRmxhc2hUYWJsZSIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4MTAyNSwgKGNoYXIgKikgIkV4dGVybmFsRmxhc2hHVmFsdWUiLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweDEwMjYsIChjaGFyICopICJFeHRlcm5hbEZsYXNoQm91bmNlIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgxMDI3LCAoY2hhciAqKSAiRXh0ZXJuYWxGbGFzaFpvb20iLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweDEwMjgsIChjaGFyICopICJFeHRlcm5hbEZsYXNoTW9kZSIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4MTAyOSwgKGNoYXIgKikgIkNvbnRyYXN0IiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgxMDJBLCAoY2hhciAqKSAiU2hhcnBuZXNzRmFjdG9yIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgxMDJCLCAoY2hhciAqKSAiQ29sb3JDb250cm9sIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgxMDJDLCAoY2hhciAqKSAiVmFsaWRCaXRzIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgxMDJELCAoY2hhciAqKSAiQ29yaW5nRmlsdGVyIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgxMDJFLCAoY2hhciAqKSAiT2x5bXB1c0ltYWdlV2lkdGgiLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweDEwMkYsIChjaGFyICopICJPbHltcHVzSW1hZ2VIZWlnaHQiLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweDEwMzAsIChjaGFyICopICJTY2VuZURldGVjdCIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4MTAzMSwgKGNoYXIgKikgIlNjZW5lQXJlYT8iLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweDEwMzMsIChjaGFyICopICJTY2VuZURldGVjdERhdGE/IiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgxMDM0LCAoY2hhciAqKSAiQ29tcHJlc3Npb25SYXRpbyIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4MTAzNSwgKGNoYXIgKikgIlByZXZpZXdJbWFnZVZhbGlkIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgxMDM2LCAoY2hhciAqKSAiUHJldmlld0ltYWdlU3RhcnQiLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweDEwMzcsIChjaGFyICopICJQcmV2aWV3SW1hZ2VMZW5ndGgiLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweDEwMzgsIChjaGFyICopICJBRlJlc3VsdCIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4MTAzOSwgKGNoYXIgKikgIkNDRFNjYW5Nb2RlIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgxMDNBLCAoY2hhciAqKSAiTm9pc2VSZWR1Y3Rpb24iLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweDEwM0IsIChjaGFyICopICJJbmZpbml0eUxlbnNTdGVwIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgxMDNDLCAoY2hhciAqKSAiTmVhckxlbnNTdGVwIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgxMDNELCAoY2hhciAqKSAiTGlnaHRWYWx1ZUNlbnRlciIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4MTAzRSwgKGNoYXIgKikgIkxpZ2h0VmFsdWVQZXJpcGhlcnkiLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweDIwMTAsIChjaGFyICopICJFcXVpcG1lbnQiLCAoY2hhciAqKSAiT2x5bXB1cyBFcXVpcG1lbnQgVGFncyJ9LAorCXsgIDB4MjAyMCwgKGNoYXIgKikgIkNhbWVyYVNldHRpbmdzIiwgKGNoYXIgKikgIk9seW1wdXMgQ2FtZXJhU2V0dGluZ3MgVGFncyJ9LAorCXsgIDB4MjAzMCwgKGNoYXIgKikgIlJhd0RldmVsb3BtZW50IiwgKGNoYXIgKikgIk9seW1wdXMgUmF3RGV2ZWxvcG1lbnQgVGFncyJ9LAorCXsgIDB4MjA0MCwgKGNoYXIgKikgIkltYWdlUHJvY2Vzc2luZyIsIChjaGFyICopICJPbHltcHVzIEltYWdlUHJvY2Vzc2luZyBUYWdzIn0sCisJeyAgMHgyMDUwLCAoY2hhciAqKSAiRm9jdXNJbmZvIiwgKGNoYXIgKikgIk9seW1wdXMgRm9jdXNJbmZvIFRhZ3MifSwKKwl7ICAweDIxMDAsIChjaGFyICopICJPbHltcHVzMjEwMCIsIChjaGFyICopICJPbHltcHVzIEZFIFRhZ3MifSwKKwl7ICAweDIyMDAsIChjaGFyICopICJPbHltcHVzMjIwMCIsIChjaGFyICopICJPbHltcHVzIEZFIFRhZ3MifSwKKwl7ICAweDIzMDAsIChjaGFyICopICJPbHltcHVzMjMwMCIsIChjaGFyICopICJPbHltcHVzIEZFIFRhZ3MifSwKKwl7ICAweDI0MDAsIChjaGFyICopICJPbHltcHVzMjQwMCIsIChjaGFyICopICJPbHltcHVzIEZFIFRhZ3MifSwKKwl7ICAweDI1MDAsIChjaGFyICopICJPbHltcHVzMjUwMCIsIChjaGFyICopICJPbHltcHVzIEZFIFRhZ3MifSwKKwl7ICAweDI2MDAsIChjaGFyICopICJPbHltcHVzMjYwMCIsIChjaGFyICopICJPbHltcHVzIEZFIFRhZ3MifSwKKwl7ICAweDI3MDAsIChjaGFyICopICJPbHltcHVzMjcwMCIsIChjaGFyICopICJPbHltcHVzIEZFIFRhZ3MifSwKKwl7ICAweDI4MDAsIChjaGFyICopICJPbHltcHVzMjgwMCIsIChjaGFyICopICJPbHltcHVzIEZFIFRhZ3MifSwKKwl7ICAweDI5MDAsIChjaGFyICopICJPbHltcHVzMjkwMCIsIChjaGFyICopICJPbHltcHVzIEZFIFRhZ3MifSwKKwl7ICAweDMwMDAsIChjaGFyICopICJSYXdJbmZvIiwgKGNoYXIgKikgIk9seW1wdXMgUmF3SW5mbyBUYWdzIn0sCisJeyAgMHg0MDAwLCAoY2hhciAqKSAiTWFpbkluZm8iLCAoY2hhciAqKSAiT2x5bXB1cyBNYWluSW5mbyBUYWdzIn0sCisgICAgeyAgMHgwMDAwLCAoY2hhciAqKSBOVUxMLCAoY2hhciAqKSBOVUxMfQorICB9OworCisvKioKK01pbm9sdGEgbWFrZXIgbm90ZQorKi8KK3N0YXRpYyBUYWdJbmZvCisgIGV4aWZfbWlub2x0YV90YWdfdGFibGVbXSA9CisgIHsKKyAgICB7ICAweDAwMDAsIChjaGFyICopICJNYWtlck5vdGVWZXJzaW9uIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDAxLCAoY2hhciAqKSAiTWlub2x0YUNhbWVyYVNldHRpbmdzT2xkIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDAzLCAoY2hhciAqKSAiTWlub2x0YUNhbWVyYVNldHRpbmdzIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDA0LCAoY2hhciAqKSAiTWlub2x0YUNhbWVyYVNldHRpbmdzN0QiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMTgsIChjaGFyICopICJJbWFnZVN0YWJpbGl6YXRpb24iLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweDAwNDAsIChjaGFyICopICJDb21wcmVzc2VkSW1hZ2VTaXplIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDgxLCAoY2hhciAqKSAiUHJldmlld0ltYWdlIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDg4LCAoY2hhciAqKSAiUHJldmlld0ltYWdlU3RhcnQiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwODksIChjaGFyICopICJQcmV2aWV3SW1hZ2VMZW5ndGgiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAxMDAsIChjaGFyICopICJTY2VuZU1vZGUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAxMDEsIChjaGFyICopICJDb2xvck1vZGUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAxMDIsIChjaGFyICopICJNaW5vbHRhUXVhbGl0eSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDEwMywgKGNoYXIgKikgIk1pbm9sdGFJbWFnZVNpemUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAxMDQsIChjaGFyICopICJGbGFzaEV4cG9zdXJlQ29tcCIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDEwNSwgKGNoYXIgKikgIlRlbGVjb252ZXJ0ZXIiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAxMDcsIChjaGFyICopICJJbWFnZVN0YWJpbGl6YXRpb24iLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAxMDksIChjaGFyICopICJSYXdBbmRKcGdSZWNvcmRpbmciLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAxMEEsIChjaGFyICopICJab25lTWF0Y2hpbmciLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAxMEIsIChjaGFyICopICJDb2xvclRlbXBlcmF0dXJlIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMTBDLCAoY2hhciAqKSAiTGVuc1R5cGUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAxMTEsIChjaGFyICopICJDb2xvckNvbXBlbnNhdGlvbkZpbHRlciIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDExMiwgKGNoYXIgKikgIldoaXRlQmFsYW5jZUZpbmVUdW5lIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMTEzLCAoY2hhciAqKSAiSW1hZ2VTdGFiaWxpemF0aW9uIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMTE0LCAoY2hhciAqKSAiTWlub2x0YUNhbWVyYVNldHRpbmdzNUQiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAxMTUsIChjaGFyICopICJXaGl0ZUJhbGFuY2UiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDBFMDAsIChjaGFyICopICJQcmludElNIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwRjAwLCAoY2hhciAqKSAiTWlub2x0YUNhbWVyYVNldHRpbmdzMiIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAwMCwgKGNoYXIgKikgTlVMTCwgKGNoYXIgKikgTlVMTH0KKyAgfTsKKworLyoqCitUaGVyZSBhcmUgMyBmb3JtYXRzIG9mIE5pa29uJ3MgTWFrZXJOb3RlLiBNYWtlck5vdGUgb2YgRTcwMC9FODAwL0U5MDAvRTkwMFMvRTkxMC9FOTUwCitzdGFydHMgZnJvbSBBU0NJSSBzdHJpbmcgIk5pa29uIi4gRGF0YSBmb3JtYXQgaXMgdGhlIHNhbWUgYXMgSUZELCBidXQgaXQgc3RhcnRzIGZyb20KK29mZnNldCAweDA4LiBUaGlzIGlzIHRoZSBzYW1lIGFzIE9seW1wdXMgZXhjZXB0IHN0YXJ0IHN0cmluZy4gCisqLworCisvKioKK1RZUEUgMSBpcyBmb3IgRS1TZXJpZXMgY2FtZXJhcyBwcmlvciB0byAobm90IGluY2x1ZGluZykgRTk5MAorKi8KK3N0YXRpYyBUYWdJbmZvCisgIGV4aWZfbmlrb25fdHlwZTFfdGFnX3RhYmxlW10gPQorICB7CisgICAgeyAgMHgwMDAyLCAoY2hhciAqKSAiRmFtaWx5SUQiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMDMsIChjaGFyICopICJRdWFsaXR5IiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDA0LCAoY2hhciAqKSAiQ29sb3JNb2RlIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDA1LCAoY2hhciAqKSAiSW1hZ2VBZGp1c3RtZW50IiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDA2LCAoY2hhciAqKSAiQ0NEU2Vuc2l0aXZpdHkiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMDcsIChjaGFyICopICJXaGl0ZUJhbGFuY2UiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMDgsIChjaGFyICopICJGb2N1cyIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAwQSwgKGNoYXIgKikgIkRpZ2l0YWxab29tIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDBCLCAoY2hhciAqKSAiRmlzaGV5ZUNvbnZlcnRlciIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAwMCwgKGNoYXIgKikgTlVMTCwgKGNoYXIgKikgTlVMTH0KKyAgfTsKKworLyoqCitOaWtvbiB0eXBlIDIgbWFrZXIgbm90ZQorKi8KK3N0YXRpYyBUYWdJbmZvCisgIGV4aWZfbmlrb25fdHlwZTJfdGFnX3RhYmxlW10gPQorICB7CisgICAgeyAgMHgwMDAxLCAoY2hhciAqKSAiTWFrZXJOb3RlVmVyc2lvbiIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAwMiwgKGNoYXIgKikgIklTTyIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAwMywgKGNoYXIgKikgIkNvbG9yTW9kZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAwNCwgKGNoYXIgKikgIlF1YWxpdHkiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMDUsIChjaGFyICopICJXaGl0ZUJhbGFuY2UiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMDYsIChjaGFyICopICJTaGFycG5lc3MiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMDcsIChjaGFyICopICJGb2N1c01vZGUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMDgsIChjaGFyICopICJGbGFzaFNldHRpbmciLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMDksIChjaGFyICopICJGbGFzaFR5cGUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMEIsIChjaGFyICopICJXaGl0ZUJhbGFuY2VGaW5lVHVuZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAwRiwgKGNoYXIgKikgIklTT1NlbGVjdGlvbiIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAxMCwgKGNoYXIgKikgIkRhdGFEdW1wIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDgwLCAoY2hhciAqKSAiSW1hZ2VBZGp1c3RtZW50IiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDgyLCAoY2hhciAqKSAiQXV4aWxpYXJ5TGVucyIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDA4NSwgKGNoYXIgKikgIk1hbnVhbEZvY3VzRGlzdGFuY2UiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwODYsIChjaGFyICopICJEaWdpdGFsWm9vbSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDA4OCwgKGNoYXIgKikgIkFGSW5mbyIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDA4OSwgKGNoYXIgKikgIlNob290aW5nTW9kZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDA4RCwgKGNoYXIgKikgIkNvbG9yTW9kZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDA4RiwgKGNoYXIgKikgIlNjZW5lTW9kZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDA5MiwgKGNoYXIgKikgIkh1ZUFkanVzdG1lbnQiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwOTQsIChjaGFyICopICJTYXR1cmF0aW9uIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDk1LCAoY2hhciAqKSAiTm9pc2VSZWR1Y3Rpb24iLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDBFMDAsIChjaGFyICopICJQcmludElNIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDAwLCAoY2hhciAqKSBOVUxMLCAoY2hhciAqKSBOVUxMfQorICB9OworCisvKioKK1RoZSB0eXBlLTMgZGlyZWN0b3J5IGlzIGZvciBELVNlcmllcyBjYW1lcmFzIHN1Y2ggYXMgdGhlIEQxIGFuZCBEMTAwLgorc2VlIGh0dHA6Ly93d3cudGltZWxlc3N3YW5kZXJpbmdzLm5ldC9lcXVpcG1lbnQvRDEwMC9ORUYuaHRtbAorKi8KK3N0YXRpYyBUYWdJbmZvCisgIGV4aWZfbmlrb25fdHlwZTNfdGFnX3RhYmxlW10gPQorICB7CisgICAgeyAgMHgwMDAxLCAoY2hhciAqKSAiTWFrZXJOb3RlVmVyc2lvbiIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAwMiwgKGNoYXIgKikgIklTTyIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAwMywgKGNoYXIgKikgIkNvbG9yTW9kZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAwNCwgKGNoYXIgKikgIlF1YWxpdHkiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMDUsIChjaGFyICopICJXaGl0ZUJhbGFuY2UiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMDYsIChjaGFyICopICJTaGFycG5lc3MiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMDcsIChjaGFyICopICJGb2N1c01vZGUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMDgsIChjaGFyICopICJGbGFzaFNldHRpbmciLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMDksIChjaGFyICopICJGbGFzaFR5cGUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMEIsIChjaGFyICopICJXaGl0ZUJhbGFuY2VGaW5lVHVuZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAwQywgKGNoYXIgKikgIldCX1JCTGV2ZWxzIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDBELCAoY2hhciAqKSAiUHJvZ3JhbVNoaWZ0IiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDBFLCAoY2hhciAqKSAiRXhwb3N1cmVEaWZmZXJlbmNlIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDBGLCAoY2hhciAqKSAiSVNPU2VsZWN0aW9uIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgwMDEwLCAoY2hhciAqKSAiRGF0YUR1bXAiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMTEsIChjaGFyICopICJQcmV2aWV3SUZEIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDEyLCAoY2hhciAqKSAiRmxhc2hFeHBvc3VyZUNvbXAiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMTMsIChjaGFyICopICJJU09TZXR0aW5nIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgwMDE0LCAoY2hhciAqKSAiQ29sb3JCYWxhbmNlQSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAxNiwgKGNoYXIgKikgIkltYWdlQm91bmRhcnkiLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweDAwMTcsIChjaGFyICopICJGbGFzaEV4cG9zdXJlQ29tcCIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAxOCwgKGNoYXIgKikgIkZsYXNoRXhwb3N1cmVCcmFja2V0VmFsdWUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMTksIChjaGFyICopICJFeHBvc3VyZUJyYWNrZXRWYWx1ZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAxQSwgKGNoYXIgKikgIkltYWdlUHJvY2Vzc2luZyIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAxQiwgKGNoYXIgKikgIkNyb3BIaVNwZWVkIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgwMDFDLCAoY2hhciAqKSAiRXhwb3N1cmVUdW5pbmciLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMUQsIChjaGFyICopICJTZXJpYWxOdW1iZXIiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMUUsIChjaGFyICopICJDb2xvclNwYWNlIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgwMDFGLCAoY2hhciAqKSAiVlJJbmZvIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgwMDIwLCAoY2hhciAqKSAiSW1hZ2VBdXRoZW50aWNhdGlvbiIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4MDAyMiwgKGNoYXIgKikgIkFjdGl2ZUQtTGlnaHRpbmciLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweDAwMjMsIChjaGFyICopICJQaWN0dXJlQ29udHJvbCIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4MDAyNCwgKGNoYXIgKikgIldvcmxkVGltZSIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4MDAyNSwgKGNoYXIgKikgIklTT0luZm8iLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweDAwMkEsIChjaGFyICopICJWaWduZXR0ZUNvbnRyb2wiLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweDAwMkIsIChjaGFyICopICJEaXN0b3J0SW5mbyIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4MDA4MCwgKGNoYXIgKikgIkltYWdlQWRqdXN0bWVudCIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4MDA4MSwgKGNoYXIgKikgIlRvbmVDb21wIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgwMDgyLCAoY2hhciAqKSAiQXV4aWxpYXJ5TGVucyIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4MDA4MywgKGNoYXIgKikgIkxlbnNUeXBlIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDg0LCAoY2hhciAqKSAiTGVucyIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDA4NSwgKGNoYXIgKikgIk1hbnVhbEZvY3VzRGlzdGFuY2UiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwODYsIChjaGFyICopICJEaWdpdGFsWm9vbSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDA4NywgKGNoYXIgKikgIkZsYXNoTW9kZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDA4OCwgKGNoYXIgKikgIkFGSW5mbyIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDA4OSwgKGNoYXIgKikgIlNob290aW5nTW9kZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDA4QiwgKGNoYXIgKikgIkxlbnNGU3RvcHMiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwOEMsIChjaGFyICopICJDb250cmFzdEN1cnZlIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDhELCAoY2hhciAqKSAiQ29sb3JIdWUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwOEYsIChjaGFyICopICJTY2VuZU1vZGUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwOTAsIChjaGFyICopICJMaWdodFNvdXJjZSIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4MDA5MSwgKGNoYXIgKikgIlNob3RJbmZvIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDkyLCAoY2hhciAqKSAiSHVlQWRqdXN0bWVudCIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4MDA5MywgKGNoYXIgKikgIk5FRkNvbXByZXNzaW9uIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDk0LCAoY2hhciAqKSAiU2F0dXJhdGlvbiIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDA5NSwgKGNoYXIgKikgIk5vaXNlUmVkdWN0aW9uIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDk2LCAoY2hhciAqKSAiTGluZWFyaXphdGlvblRhYmxlIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgwMDk3LCAoY2hhciAqKSAiQ29sb3JCYWxhbmNlIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgwMDk4LCAoY2hhciAqKSAiTGVuc0RhdGEiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwOTksIChjaGFyICopICJSYXdJbWFnZUNlbnRlciIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDA5QSwgKGNoYXIgKikgIlNlbnNvclBpeGVsU2l6ZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDA5QywgKGNoYXIgKikgIlNjZW5lQXNzaXN0IiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDlFLCAoY2hhciAqKSAiUmV0b3VjaEhpc3RvcnkiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwQTAsIChjaGFyICopICJTZXJpYWxOdW1iZXIiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwQTIsIChjaGFyICopICJJbWFnZURhdGFTaXplIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMEE1LCAoY2hhciAqKSAiSW1hZ2VDb3VudCIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDBBNiwgKGNoYXIgKikgIkRlbGV0ZWRJbWFnZUNvdW50IiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMEE3LCAoY2hhciAqKSAiU2h1dHRlckNvdW50IiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgwMEE4LCAoY2hhciAqKSAiRmxhc2hJbmZvIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMEE5LCAoY2hhciAqKSAiSW1hZ2VPcHRpbWl6YXRpb24iLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwQUEsIChjaGFyICopICJTYXR1cmF0aW9uIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMEFCLCAoY2hhciAqKSAiVmFyaVByb2dyYW0iLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwQUMsIChjaGFyICopICJJbWFnZVN0YWJpbGl6YXRpb24iLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwQUQsIChjaGFyICopICJBRlJlc3BvbnNlIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMEIwLCAoY2hhciAqKSAiTXVsdGlFeHBvc3VyZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDBCMSwgKGNoYXIgKikgIkhpZ2hJU09Ob2lzZVJlZHVjdGlvbiIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDBCMywgKGNoYXIgKikgIlRvbmluZ0VmZmVjdCIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDBCNiwgKGNoYXIgKikgIlBvd2VyVXBUaW1lIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMEI3LCAoY2hhciAqKSAiQUZJbmZvMiIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDBCOCwgKGNoYXIgKikgIkZpbGVJbmZvIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMEI5LCAoY2hhciAqKSAiQUZUdW5lIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMEJELCAoY2hhciAqKSAiUGljdHVyZUNvbnRyb2wiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDBFMDAsIChjaGFyICopICJQcmludElNIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwRTAxLCAoY2hhciAqKSAiTmlrb25DYXB0dXJlRGF0YSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MEUwOSwgKGNoYXIgKikgIk5pa29uQ2FwdHVyZVZlcnNpb24iLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDBFMEUsIChjaGFyICopICJOaWtvbkNhcHR1cmVPZmZzZXRzIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwRTEwLCAoY2hhciAqKSAiTmlrb25TY2FuSUZEIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwRTFELCAoY2hhciAqKSAiTmlrb25JQ0NQcm9maWxlIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwRTFFLCAoY2hhciAqKSAiTmlrb25DYXB0dXJlT3V0cHV0IiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgwRTIyLCAoY2hhciAqKSAiTkVGQml0RGVwdGgiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMDAsIChjaGFyICopIE5VTEwsIChjaGFyICopIE5VTEx9CisgIH07CisKKy8qKgorUGFuYXNvbmljIC8gTGVpY2EgbWFrZXIgbm90ZQorKi8KK3N0YXRpYyBUYWdJbmZvCisgIGV4aWZfcGFuYXNvbmljX3RhZ190YWJsZVtdID0KKyAgeworICAgIHsgIDB4MDAwMSwgKGNoYXIgKikgIkltYWdlUXVhbGl0eSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAwMiwgKGNoYXIgKikgIkZpcm13YXJlVmVyc2lvbiIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAwMywgKGNoYXIgKikgIldoaXRlQmFsYW5jZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAwNywgKGNoYXIgKikgIkZvY3VzTW9kZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAwRiwgKGNoYXIgKikgIkFGQXJlYU1vZGUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMUEsIChjaGFyICopICJJbWFnZVN0YWJpbGl6YXRpb24iLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMUMsIChjaGFyICopICJNYWNyb01vZGUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMUYsIChjaGFyICopICJTaG9vdGluZ01vZGUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMjAsIChjaGFyICopICJBdWRpbyIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAyMSwgKGNoYXIgKikgIkRhdGFEdW1wIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgwMDIyLCAoY2hhciAqKSAiRWFzeU1vZGUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMjMsIChjaGFyICopICJXaGl0ZUJhbGFuY2VCaWFzIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDI0LCAoY2hhciAqKSAiRmxhc2hCaWFzIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDI1LCAoY2hhciAqKSAiSW50ZXJuYWxTZXJpYWxOdW1iZXIiLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweDAwMjYsIChjaGFyICopICJQYW5hc29uaWNFeGlmVmVyc2lvbiIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAyOCwgKGNoYXIgKikgIkNvbG9yRWZmZWN0IiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgwMDI5LCAoY2hhciAqKSAiVGltZVNpbmNlUG93ZXJPbiIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAyQSwgKGNoYXIgKikgIkJ1cnN0TW9kZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAyQiwgKGNoYXIgKikgIlNlcXVlbmNlTnVtYmVyIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDJDLCAoY2hhciAqKSAiQ29udHJhc3RNb2RlIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDJELCAoY2hhciAqKSAiTm9pc2VSZWR1Y3Rpb24iLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMkUsIChjaGFyICopICJTZWxmVGltZXIiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMzAsIChjaGFyICopICJSb3RhdGlvbiIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4MDAzMSwgKGNoYXIgKikgIkFGQXNzaXN0TGFtcCIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAzMiwgKGNoYXIgKikgIkNvbG9yTW9kZSIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4MDAzMywgKGNoYXIgKikgIkJhYnlBZ2VfMHgwMDMzIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgwMDM0LCAoY2hhciAqKSAiT3B0aWNhbFpvb21Nb2RlIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgwMDM1LCAoY2hhciAqKSAiQ29udmVyc2lvbkxlbnMiLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweDAwMzYsIChjaGFyICopICJUcmF2ZWxEYXkiLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweDAwMzksIChjaGFyICopICJDb250cmFzdCIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4MDAzQSwgKGNoYXIgKikgIldvcmxkVGltZUxvY2F0aW9uIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgwMDNCLCAoY2hhciAqKSAiVGV4dFN0YW1wXzB4MDAzQiIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4MDAzQywgKGNoYXIgKikgIlByb2dyYW1JU08iLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweDAwM0QsIChjaGFyICopICJBZHZhbmNlZFNjZW5lTW9kZSIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4MDAzRSwgKGNoYXIgKikgIlRleHRTdGFtcF8weDAwM0UiLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweDAwM0YsIChjaGFyICopICJGYWNlc0RldGVjdGVkIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgwMDQwLCAoY2hhciAqKSAiU2F0dXJhdGlvbiIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4MDA0MSwgKGNoYXIgKikgIlNoYXJwbmVzcyIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4MDA0MiwgKGNoYXIgKikgIkZpbG1Nb2RlIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgwMDQ2LCAoY2hhciAqKSAiV0JBZGp1c3RBQiIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4MDA0NywgKGNoYXIgKikgIldCQWRqdXN0R00iLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweDAwNEIsIChjaGFyICopICJQYW5hc29uaWNJbWFnZVdpZHRoIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgwMDRDLCAoY2hhciAqKSAiUGFuYXNvbmljSW1hZ2VIZWlnaHQiLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweDAwNEQsIChjaGFyICopICJBRlBvaW50UG9zaXRpb24iLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweDAwNEUsIChjaGFyICopICJGYWNlRGV0SW5mbyIsIChjaGFyICopICJQYW5hc29uaWMgRmFjZURldEluZm8gVGFncyJ9LAorCXsgIDB4MDA1MSwgKGNoYXIgKikgIkxlbnNUeXBlIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgwMDUyLCAoY2hhciAqKSAiTGVuc1NlcmlhbE51bWJlciIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4MDA1MywgKGNoYXIgKikgIkFjY2Vzc29yeVR5cGUiLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweDAwNTksIChjaGFyICopICJUcmFuc2Zvcm0iLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweDAwNUQsIChjaGFyICopICJJbnRlbGxpZ2VudEV4cG9zdXJlIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgwMDYxLCAoY2hhciAqKSAiRmFjZVJlY0luZm8iLCAoY2hhciAqKSAiUGFuYXNvbmljIEZhY2VSZWNJbmZvIFRhZ3MifSwKKwl7ICAweDAwNjIsIChjaGFyICopICJGbGFzaFdhcm5pbmciLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweDAwNjMsIChjaGFyICopICJSZWNvZ25pemVkRmFjZUZsYWdzPyIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4MDA2NSwgKGNoYXIgKikgIlRpdGxlIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgwMDY2LCAoY2hhciAqKSAiQmFieU5hbWUiLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweDAwNjcsIChjaGFyICopICJMb2NhdGlvbiIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4MDA2OSwgKGNoYXIgKikgIkNvdW50cnkiLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweDAwNkIsIChjaGFyICopICJTdGF0ZSIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4MDA2RCwgKGNoYXIgKikgIkNpdHkiLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweDAwNkYsIChjaGFyICopICJMYW5kbWFyayIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4MDA3MCwgKGNoYXIgKikgIkludGVsbGlnZW50UmVzb2x1dGlvbiIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4MDA3OSwgKGNoYXIgKikgIkludGVsbGlnZW50RC1SYW5nZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MEUwMCwgKGNoYXIgKikgIlByaW50SU0iLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweDgwMDAsIChjaGFyICopICJNYWtlck5vdGVWZXJzaW9uIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHg4MDAxLCAoY2hhciAqKSAiU2NlbmVNb2RlIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHg4MDA0LCAoY2hhciAqKSAiV0JSZWRMZXZlbCIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4ODAwNSwgKGNoYXIgKikgIldCR3JlZW5MZXZlbCIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4ODAwNiwgKGNoYXIgKikgIldCQmx1ZUxldmVsIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHg4MDA3LCAoY2hhciAqKSAiRmxhc2hGaXJlZCIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4ODAwOCwgKGNoYXIgKikgIlRleHRTdGFtcF8weDgwMDgiLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweDgwMDksIChjaGFyICopICJUZXh0U3RhbXBfMHg4MDA5IiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHg4MDEwLCAoY2hhciAqKSAiQmFieUFnZV8weDgwMTAiLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweDgwMTIsIChjaGFyICopICJUcmFuc2Zvcm0iLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMDAsIChjaGFyICopIE5VTEwsIChjaGFyICopIE5VTEx9CisgIH07CisKKy8qKgorUGVudGF4IChBc2FoaSkgbWFrZXIgbm90ZSB0eXBlIDEKKyovCitzdGF0aWMgVGFnSW5mbworICBleGlmX2FzYWhpX3RhZ190YWJsZVtdID0KKyAgeworICAgIHsgIDB4MDAwMSwgKGNoYXIgKikgIkNhcHR1cmUgTW9kZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAwMiwgKGNoYXIgKikgIlF1YWxpdHkgTGV2ZWwiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMDMsIChjaGFyICopICJGb2N1cyBNb2RlIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDA0LCAoY2hhciAqKSAiRmxhc2ggTW9kZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAwNywgKGNoYXIgKikgIldoaXRlIEJhbGFuY2UiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMEEsIChjaGFyICopICJEaWdpdGFsIFpvb20iLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMEIsIChjaGFyICopICJTaGFycG5lc3MiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMEMsIChjaGFyICopICJDb250cmFzdCIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAwRCwgKGNoYXIgKikgIlNhdHVyYXRpb24iLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMTQsIChjaGFyICopICJJU08gU3BlZWQiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMTcsIChjaGFyICopICJDb2xvciIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MEUwMCwgKGNoYXIgKikgIlByaW50SU0iLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDEwMDAsIChjaGFyICopICJUaW1lIFpvbmUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDEwMDEsIChjaGFyICopICJEYXlsaWdodCBTYXZpbmdzIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDAwLCAoY2hhciAqKSBOVUxMLCAoY2hhciAqKSBOVUxMfQorICB9OworCisvKioKK1BlbnRheCBtYWtlciBub3RlIHR5cGUgMgorKi8KK3N0YXRpYyBUYWdJbmZvCisgIGV4aWZfcGVudGF4X3RhZ190YWJsZVtdID0KKyAgeworICAgIHsgIDB4MDAwMCwgKGNoYXIgKikgIlBlbnRheFZlcnNpb24iLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMDEsIChjaGFyICopICJQZW50YXhNb2RlIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDAyLCAoY2hhciAqKSAiUHJldmlld0ltYWdlU2l6ZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAwMywgKGNoYXIgKikgIlByZXZpZXdJbWFnZUxlbmd0aCIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAwNCwgKGNoYXIgKikgIlByZXZpZXdJbWFnZVN0YXJ0IiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDA1LCAoY2hhciAqKSAiUGVudGF4TW9kZWxJRCIsIChjaGFyICopICJQZW50YXggUGVudGF4TW9kZWxJRCBWYWx1ZXMifSwKKyAgICB7ICAweDAwMDYsIChjaGFyICopICJEYXRlIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDA3LCAoY2hhciAqKSAiVGltZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAwOCwgKGNoYXIgKikgIlF1YWxpdHkiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMDksIChjaGFyICopICJQZW50YXhJbWFnZVNpemUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMEIsIChjaGFyICopICJQaWN0dXJlTW9kZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAwQywgKGNoYXIgKikgIkZsYXNoTW9kZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAwRCwgKGNoYXIgKikgIkZvY3VzTW9kZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAwRSwgKGNoYXIgKikgIkFGUG9pbnRTZWxlY3RlZCIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAwRiwgKGNoYXIgKikgIkFGUG9pbnRzSW5Gb2N1cyIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAxMCwgKGNoYXIgKikgIkZvY3VzUG9zaXRpb24iLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMTIsIChjaGFyICopICJFeHBvc3VyZVRpbWUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMTMsIChjaGFyICopICJGTnVtYmVyIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDE0LCAoY2hhciAqKSAiSVNPIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgwMDE1LCAoY2hhciAqKSAiTGlnaHRSZWFkaW5nIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDE2LCAoY2hhciAqKSAiRXhwb3N1cmVDb21wZW5zYXRpb24iLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMTcsIChjaGFyICopICJNZXRlcmluZ01vZGUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMTgsIChjaGFyICopICJBdXRvQnJhY2tldGluZyIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAxOSwgKGNoYXIgKikgIldoaXRlQmFsYW5jZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAxQSwgKGNoYXIgKikgIldoaXRlQmFsYW5jZU1vZGUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMUIsIChjaGFyICopICJCbHVlQmFsYW5jZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAxQywgKGNoYXIgKikgIlJlZEJhbGFuY2UiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMUQsIChjaGFyICopICJGb2NhbExlbmd0aCIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAxRSwgKGNoYXIgKikgIkRpZ2l0YWxab29tIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDFGLCAoY2hhciAqKSAiU2F0dXJhdGlvbiIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAyMCwgKGNoYXIgKikgIkNvbnRyYXN0IiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDIxLCAoY2hhciAqKSAiU2hhcnBuZXNzIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDIyLCAoY2hhciAqKSAiV29ybGRUaW1lTG9jYXRpb24iLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMjMsIChjaGFyICopICJIb21ldG93bkNpdHkiLCAoY2hhciAqKSAiUGVudGF4IENpdHkgVmFsdWVzIn0sCisgICAgeyAgMHgwMDI0LCAoY2hhciAqKSAiRGVzdGluYXRpb25DaXR5IiwgKGNoYXIgKikgIlBlbnRheCBDaXR5IFZhbHVlcyJ9LAorICAgIHsgIDB4MDAyNSwgKGNoYXIgKikgIkhvbWV0b3duRFNUIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDI2LCAoY2hhciAqKSAiRGVzdGluYXRpb25EU1QiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMjcsIChjaGFyICopICJEU1BGaXJtd2FyZVZlcnNpb24iLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMjgsIChjaGFyICopICJDUFVGaXJtd2FyZVZlcnNpb24iLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMjksIChjaGFyICopICJGcmFtZU51bWJlciIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAyRCwgKGNoYXIgKikgIkVmZmVjdGl2ZUxWIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDMyLCAoY2hhciAqKSAiSW1hZ2VQcm9jZXNzaW5nIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDMzLCAoY2hhciAqKSAiUGljdHVyZU1vZGUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMzQsIChjaGFyICopICJEcml2ZU1vZGUiLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweDAwMzUsIChjaGFyICopICJTZW5zb3JTaXplIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDM3LCAoY2hhciAqKSAiQ29sb3JTcGFjZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAzOSwgKGNoYXIgKikgIlJhd0ltYWdlU2l6ZSIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4MDAzQywgKGNoYXIgKikgIkFGUG9pbnRzSW5Gb2N1cyIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAzRSwgKGNoYXIgKikgIlByZXZpZXdJbWFnZUJvcmRlcnMiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwM0YsIChjaGFyICopICJMZW5zVHlwZSIsIChjaGFyICopICJQZW50YXggTGVuc1R5cGUgVmFsdWVzIn0sCisgICAgeyAgMHgwMDQwLCAoY2hhciAqKSAiU2Vuc2l0aXZpdHlBZGp1c3QiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwNDEsIChjaGFyICopICJJbWFnZVByb2Nlc3NpbmdDb3VudCIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDA0NywgKGNoYXIgKikgIkNhbWVyYVRlbXBlcmF0dXJlIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDQ4LCAoY2hhciAqKSAiQUVMb2NrIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDQ5LCAoY2hhciAqKSAiTm9pc2VSZWR1Y3Rpb24iLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwNEQsIChjaGFyICopICJGbGFzaEV4cG9zdXJlQ29tcCIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDA0RiwgKGNoYXIgKikgIkltYWdlVG9uZSIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4MDA1MCwgKGNoYXIgKikgIkNvbG9yVGVtcGVyYXR1cmUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwNUMsIChjaGFyICopICJTaGFrZVJlZHVjdGlvbkluZm8iLCAoY2hhciAqKSAiUGVudGF4IFNSSW5mbyBUYWdzIn0sCisgICAgeyAgMHgwMDVELCAoY2hhciAqKSAiU2h1dHRlckNvdW50IiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgwMDYwLCAoY2hhciAqKSAiRmFjZUluZm8iLCAoY2hhciAqKSAiUGVudGF4IEZhY2VJbmZvIFRhZ3MifSwKKwl7ICAweDAwNjcsIChjaGFyICopICJIdWUiLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweDAwNjgsIChjaGFyICopICJBV0JJbmZvIiwgKGNoYXIgKikgIlBlbnRheCBBV0JJbmZvIFRhZ3MifSwKKyAgICB7ICAweDAwNjksIChjaGFyICopICJEeW5hbWljUmFuZ2VFeHBhbnNpb24iLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweDAwNkIsIChjaGFyICopICJUaW1lSW5mbyIsIChjaGFyICopICJQZW50YXggVGltZUluZm8gVGFncyJ9LAorCXsgIDB4MDA2QywgKGNoYXIgKikgIkhpZ2hMb3dLZXlBZGoiLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweDAwNkQsIChjaGFyICopICJDb250cmFzdEhpZ2hsaWdodCIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4MDA2RSwgKGNoYXIgKikgIkNvbnRyYXN0U2hhZG93IiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgwMDZGLCAoY2hhciAqKSAiQ29udHJhc3RIaWdobGlnaHRTaGFkb3dBZGoiLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweDAwNzAsIChjaGFyICopICJGaW5lU2hhcnBuZXNzIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDcxLCAoY2hhciAqKSAiSGlnaElTT05vaXNlUmVkdWN0aW9uIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDcyLCAoY2hhciAqKSAiQUZBZGp1c3RtZW50IiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgwMDczLCAoY2hhciAqKSAiTW9ub2Nocm9tZUZpbHRlckVmZmVjdCIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4MDA3NCwgKGNoYXIgKikgIk1vbm9jaHJvbWVUb25pbmciLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweDAwNzYsIChjaGFyICopICJGYWNlRGV0ZWN0IiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgwMDc3LCAoY2hhciAqKSAiRmFjZURldGVjdEZyYW1lU2l6ZSIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4MDA3OSwgKGNoYXIgKikgIlNoYWRvd0NvbXBlbnNhdGlvbiIsIChjaGFyICopIE5VTEx9LAorCXsgIDB4MDA3QSwgKGNoYXIgKikgIklTT0F1dG9QYXJhbWV0ZXJzIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgwMDdCLCAoY2hhciAqKSAiQ3Jvc3NQcm9jZXNzIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgwMDdELCAoY2hhciAqKSAiTGVuc0NvcnIiLCAoY2hhciAqKSAiUGVudGF4IExlbnNDb3JyIFRhZ3MifSwKKwl7ICAweDAwN0YsIChjaGFyICopICJCbGVhY2hCeXBhc3NUb25pbmciLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAyMDAsIChjaGFyICopICJCbGFja1BvaW50IiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMjAxLCAoY2hhciAqKSAiV2hpdGVQb2ludCIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDIwMywgKGNoYXIgKikgIkNvbG9yTWF0cml4QSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDIwNCwgKGNoYXIgKikgIkNvbG9yTWF0cml4QiIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDIwNSwgKGNoYXIgKikgIkNhbWVyYVNldHRpbmdzIiwgKGNoYXIgKikgIlBlbnRheCBDYW1lcmFTZXR0aW5ncyBUYWdzIn0sCisJeyAgMHgwMjA2LCAoY2hhciAqKSAiQUVJbmZvIiwgKGNoYXIgKikgIlBlbnRheCBBRUluZm8gVGFncyJ9LAorICAgIHsgIDB4MDIwNywgKGNoYXIgKikgIkxlbnNJbmZvIiwgKGNoYXIgKikgIlBlbnRheCBMZW5zSW5mbyBUYWdzIn0sCisgICAgeyAgMHgwMjA4LCAoY2hhciAqKSAiRmxhc2hJbmZvIiwgKGNoYXIgKikgIlBlbnRheCBGbGFzaEluZm8gVGFncyJ9LAorICAgIHsgIDB4MDIwOSwgKGNoYXIgKikgIkFFTWV0ZXJpbmdTZWdtZW50cyIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDIwQSwgKGNoYXIgKikgIkZsYXNoTWV0ZXJpbmdTZWdtZW50cyIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDIwQiwgKGNoYXIgKikgIlNsYXZlRmxhc2hNZXRlcmluZ1NlZ21lbnRzIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMjBELCAoY2hhciAqKSAiV0JfUkdHQkxldmVsc0RheWxpZ2h0IiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMjBFLCAoY2hhciAqKSAiV0JfUkdHQkxldmVsc1NoYWRlIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMjBGLCAoY2hhciAqKSAiV0JfUkdHQkxldmVsc0Nsb3VkeSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDIxMCwgKGNoYXIgKikgIldCX1JHR0JMZXZlbHNUdW5nc3RlbiIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDIxMSwgKGNoYXIgKikgIldCX1JHR0JMZXZlbHNGbHVvcmVzY2VudEQiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAyMTIsIChjaGFyICopICJXQl9SR0dCTGV2ZWxzRmx1b3Jlc2NlbnROIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMjEzLCAoY2hhciAqKSAiV0JfUkdHQkxldmVsc0ZsdW9yZXNjZW50VyIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDIxNCwgKGNoYXIgKikgIldCX1JHR0JMZXZlbHNGbGFzaCIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDIxNSwgKGNoYXIgKikgIkNhbWVyYUluZm8iLCAoY2hhciAqKSAiUGVudGF4IENhbWVyYUluZm8gVGFncyJ9LAorICAgIHsgIDB4MDIxNiwgKGNoYXIgKikgIkJhdHRlcnlJbmZvIiwgKGNoYXIgKikgIlBlbnRheCBCYXR0ZXJ5SW5mbyBUYWdzIn0sCisgICAgeyAgMHgwMjFCLCAoY2hhciAqKSAiU2F0dXJhdGlvbkluZm8iLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAyMUYsIChjaGFyICopICJBRkluZm8iLCAoY2hhciAqKSAiUGVudGF4IEFGSW5mbyBUYWdzIn0sCisgICAgeyAgMHgwMjIyLCAoY2hhciAqKSAiQ29sb3JJbmZvIiwgKGNoYXIgKikgIlBlbnRheCBDb2xvckluZm8gVGFncyJ9LAorICAgIHsgIDB4MDIyNCwgKGNoYXIgKikgIkVWU3RlcEluZm8iLCAoY2hhciAqKSAiUGVudGF4IEVWU3RlcEluZm8gVGFncyJ9LAorCXsgIDB4MDIyNiwgKGNoYXIgKikgIlNob3RJbmZvIiwgKGNoYXIgKikgIlBlbnRheCBTaG90SW5mbyBUYWdzIn0sCisJeyAgMHgwMjI3LCAoY2hhciAqKSAiRmFjZVBvcyIsIChjaGFyICopICJQZW50YXggRmFjZVBvcyBUYWdzIn0sCisJeyAgMHgwMjI4LCAoY2hhciAqKSAiRmFjZVNpemUiLCAoY2hhciAqKSAiUGVudGF4IEZhY2VTaXplIFRhZ3MifSwKKwl7ICAweDAyMjksIChjaGFyICopICJTZXJpYWxOdW1iZXIiLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweDAyMkEsIChjaGFyICopICJGaWx0ZXJJbmZvIiwgKGNoYXIgKikgIlBlbnRheCBGaWx0ZXJJbmZvIFRhZ3MifSwKKwl7ICAweDAyMkIsIChjaGFyICopICJMZXZlbEluZm8iLCAoY2hhciAqKSAiUGVudGF4IExldmVsSW5mbyBUYWdzIn0sCisJeyAgMHgwMjJFLCAoY2hhciAqKSAiQXJ0aXN0IiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgwMjJGLCAoY2hhciAqKSAiQ29weXJpZ2h0IiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgwMjMwLCAoY2hhciAqKSAiRmlybXdhcmVWZXJzaW9uIiwgKGNoYXIgKikgTlVMTH0sCisJeyAgMHgwMjMxLCAoY2hhciAqKSAiQ29udHJhc3REZXRlY3RBRkFyZWEiLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweDAyMzUsIChjaGFyICopICJDcm9zc1Byb2Nlc3NQYXJhbXMiLCAoY2hhciAqKSBOVUxMfSwKKwl7ICAweDAzRkUsIChjaGFyICopICJEYXRhRHVtcCIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDQwMiwgKGNoYXIgKikgIlRvbmVDdXJ2ZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDQwMywgKGNoYXIgKikgIlRvbmVDdXJ2ZXMiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDBFMDAsIChjaGFyICopICJQcmludElNIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgxMDAwLCAoY2hhciAqKSAiSG9tZXRvd25DaXR5Q29kZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MTAwMSwgKGNoYXIgKikgIkRlc3RpbmF0aW9uQ2l0eUNvZGUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDIwMDAsIChjaGFyICopICJQcmV2aWV3SW1hZ2VEYXRhIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDAwLCAoY2hhciAqKSBOVUxMLCAoY2hhciAqKSBOVUxMfQorICB9OworCisvKioKK1NvbnkgbWFrZXIgbm90ZQorKi8KK3N0YXRpYyBUYWdJbmZvCisgIGV4aWZfc29ueV90YWdfdGFibGVbXSA9CisgIHsKKyAgICB7ICAweDAxMDIsIChjaGFyICopICJRdWFsaXR5IiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMTA0LCAoY2hhciAqKSAiRmxhc2hFeHBvc3VyZUNvbXAiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAxMDUsIChjaGFyICopICJUZWxlY29udmVydGVyIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMTEyLCAoY2hhciAqKSAiV2hpdGVCYWxhbmNlRmluZVR1bmUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAxMTQsIChjaGFyICopICJDYW1lcmFTZXR0aW5ncyIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDExNSwgKGNoYXIgKikgIldoaXRlQmFsYW5jZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MEUwMCwgKGNoYXIgKikgIlByaW50SU0iLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDEwMDAsIChjaGFyICopICJNdWx0aUJ1cnN0TW9kZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MTAwMSwgKGNoYXIgKikgIk11bHRpQnVyc3RJbWFnZVdpZHRoIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgxMDAyLCAoY2hhciAqKSAiTXVsdGlCdXJzdEltYWdlSGVpZ2h0IiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgxMDAzLCAoY2hhciAqKSAiUGFub3JhbWEiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDIwMDEsIChjaGFyICopICJQcmV2aWV3SW1hZ2UiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDIwMDQsIChjaGFyICopICJDb250cmFzdCIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MjAwNSwgKGNoYXIgKikgIlNhdHVyYXRpb24iLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDIwMDYsIChjaGFyICopICJTaGFycG5lc3MiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDIwMDcsIChjaGFyICopICJCcmlnaHRuZXNzIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgyMDA4LCAoY2hhciAqKSAiTG9uZ0V4cG9zdXJlTm9pc2VSZWR1Y3Rpb24iLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDIwMDksIChjaGFyICopICJIaWdoSVNPTm9pc2VSZWR1Y3Rpb24iLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDIwMEEsIChjaGFyICopICJIRFIiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDIwMEIsIChjaGFyICopICJNdWx0aUZyYW1lTm9pc2VSZWR1Y3Rpb24iLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDMwMDAsIChjaGFyICopICJTaG90SW5mbyIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4QjAwMCwgKGNoYXIgKikgIkZpbGVGb3JtYXQiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweEIwMDEsIChjaGFyICopICJTb255TW9kZWxJRCIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4QjAyMCwgKGNoYXIgKikgIkNvbG9yUmVwcm9kdWN0aW9uIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHhCMDIxLCAoY2hhciAqKSAiQ29sb3JUZW1wZXJhdHVyZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4QjAyMiwgKGNoYXIgKikgIkNvbG9yQ29tcGVuc2F0aW9uRmlsdGVyIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHhCMDIzLCAoY2hhciAqKSAiU2NlbmVNb2RlIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHhCMDI0LCAoY2hhciAqKSAiWm9uZU1hdGNoaW5nIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHhCMDI1LCAoY2hhciAqKSAiRHluYW1pY1JhbmdlT3B0aW1pemVyIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHhCMDI2LCAoY2hhciAqKSAiSW1hZ2VTdGFiaWxpemF0aW9uIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHhCMDI3LCAoY2hhciAqKSAiTGVuc1R5cGUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweEIwMjgsIChjaGFyICopICJNaW5vbHRhTWFrZXJOb3RlIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHhCMDI5LCAoY2hhciAqKSAiQ29sb3JNb2RlIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHhCMDJCLCAoY2hhciAqKSAiRnVsbEltYWdlU2l6ZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4QjAyQywgKGNoYXIgKikgIlByZXZpZXdJbWFnZVNpemUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweEIwNDAsIChjaGFyICopICJNYWNybyIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4QjA0MSwgKGNoYXIgKikgIkV4cG9zdXJlTW9kZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4QjA0MiwgKGNoYXIgKikgIkZvY3VzTW9kZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4QjA0MywgKGNoYXIgKikgIkFGTW9kZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4QjA0NCwgKGNoYXIgKikgIkFGSWxsdW1pbmF0b3IiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweEIwNDcsIChjaGFyICopICJRdWFsaXR5MiIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4QjA0OCwgKGNoYXIgKikgIkZsYXNoTGV2ZWwiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweEIwNDksIChjaGFyICopICJSZWxlYXNlTW9kZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4QjA0QSwgKGNoYXIgKikgIlNlcXVlbmNlTnVtYmVyIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHhCMDRCLCAoY2hhciAqKSAiQW50aS1CbHVyIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHhCMDRFLCAoY2hhciAqKSAiTG9uZ0V4cG9zdXJlTm9pc2VSZWR1Y3Rpb24iLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweEIwNEYsIChjaGFyICopICJEeW5hbWljUmFuZ2VPcHRpbWl6ZXIiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweEIwNTIsIChjaGFyICopICJJbnRlbGxpZ2VudEF1dG8iLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweEIwNTQsIChjaGFyICopICJXaGl0ZUJhbGFuY2UyIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDAwLCAoY2hhciAqKSBOVUxMLCAoY2hhciAqKSBOVUxMfQorICB9OworCisvKioKK1NpZ21hIFNEMSBtYWtlciBub3RlCisqLworc3RhdGljIFRhZ0luZm8KKyAgZXhpZl9zaWdtYV9zZDFfdGFnX3RhYmxlW10gPQorICB7CisgICAgeyAgMHgwMDAyLCAoY2hhciAqKSAiU2VyaWFsTnVtYmVyIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDAzLCAoY2hhciAqKSAiRHJpdmVNb2RlIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDA0LCAoY2hhciAqKSAiUmVzb2x1dGlvbk1vZGUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMDUsIChjaGFyICopICJBRk1vZGUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMDYsIChjaGFyICopICJGb2N1c1NldHRpbmciLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMDcsIChjaGFyICopICJXaGl0ZUJhbGFuY2UiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMDgsIChjaGFyICopICJFeHBvc3VyZU1vZGUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMDksIChjaGFyICopICJNZXRlcmluZ01vZGUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMEEsIChjaGFyICopICJMZW5zRm9jYWxSYW5nZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAwQiwgKGNoYXIgKikgIkNvbG9yU3BhY2UiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMEMsIChjaGFyICopICJFeHBvc3VyZUNvbXBlbnNhdGlvbiIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAwRCwgKGNoYXIgKikgIkNvbnRyYXN0IiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDBFLCAoY2hhciAqKSAiU2hhZG93IiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDBGLCAoY2hhciAqKSAiSGlnaGxpZ2h0IiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDEwLCAoY2hhciAqKSAiU2F0dXJhdGlvbiIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAxMSwgKGNoYXIgKikgIlNoYXJwbmVzcyIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAxMiwgKGNoYXIgKikgIlgzRmlsbExpZ2h0IiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDE0LCAoY2hhciAqKSAiQ29sb3JBZGp1c3RtZW50IiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDE1LCAoY2hhciAqKSAiQWRqdXN0bWVudE1vZGUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMTYsIChjaGFyICopICJRdWFsaXR5IiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDE3LCAoY2hhciAqKSAiRmlybXdhcmUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMTgsIChjaGFyICopICJTb2Z0d2FyZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAxOSwgKGNoYXIgKikgIkF1dG9CcmFja2V0IiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDFBLCAoY2hhciAqKSAiQ2hyb21pbmFuY2VOb2lzZVJlZHVjdGlvbiIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAxQiwgKGNoYXIgKikgIkx1bWluYW5jZU5vaXNlUmVkdWN0aW9uIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDFDLCAoY2hhciAqKSAiUHJldmlld0ltYWdlU3RhcnQiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMUQsIChjaGFyICopICJQcmV2aWV3SW1hZ2VMZW5ndGgiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMUYsIChjaGFyICopICJNYWtlck5vdGVWZXJzaW9uIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDI2LCAoY2hhciAqKSAiRmlsZUZvcm1hdCIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAyQywgKGNoYXIgKikgIkNvbG9yTW9kZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAzMCwgKGNoYXIgKikgIkNhbGlicmF0aW9uIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDQ4LCAoY2hhciAqKSAiTGVuc0FwZXJ0dXJlUmFuZ2UiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwNDksIChjaGFyICopICJGTnVtYmVyIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDRBLCAoY2hhciAqKSAiRXhwb3N1cmVUaW1lIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDRCLCAoY2hhciAqKSAiRXhwb3N1cmVUaW1lMiIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDA0RCwgKGNoYXIgKikgIkV4cG9zdXJlQ29tcGVuc2F0aW9uX1NEMSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDA1NSwgKGNoYXIgKikgIlNlbnNvclRlbXBlcmF0dXJlIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDU2LCAoY2hhciAqKSAiRmxhc2hFeHBvc3VyZUNvbXAiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwNTcsIChjaGFyICopICJGaXJtd2FyZV9TRDEiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwNTgsIChjaGFyICopICJXaGl0ZUJhbGFuY2UiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMDAsIChjaGFyICopIE5VTEwsIChjaGFyICopIE5VTEx9CisgIH07CisKKy8qKgorU2lnbWEgLyBGb3Zlb24gbWFrZXIgbm90ZSAob3RoZXJzIHRoYW4gU0QxIG1vZGVscykKK05COiBtYW55IHRhZ3MgYXJlIG5vdCBjb25zaXN0ZW50IGJldHdlZW4gZGlmZmVyZW50IG1vZGVscworKi8KK3N0YXRpYyBUYWdJbmZvCisgIGV4aWZfc2lnbWFfZm92ZW9uX3RhZ190YWJsZVtdID0KKyAgeworICAgIHsgIDB4MDAwMiwgKGNoYXIgKikgIlNlcmlhbE51bWJlciIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAwMywgKGNoYXIgKikgIkRyaXZlTW9kZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAwNCwgKGNoYXIgKikgIlJlc29sdXRpb25Nb2RlIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDA1LCAoY2hhciAqKSAiQUZNb2RlIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDA2LCAoY2hhciAqKSAiRm9jdXNTZXR0aW5nIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDA3LCAoY2hhciAqKSAiV2hpdGVCYWxhbmNlIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDA4LCAoY2hhciAqKSAiRXhwb3N1cmVNb2RlIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDA5LCAoY2hhciAqKSAiTWV0ZXJpbmdNb2RlIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDBBLCAoY2hhciAqKSAiTGVuc0ZvY2FsUmFuZ2UiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMEIsIChjaGFyICopICJDb2xvclNwYWNlIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDBDLCAoY2hhciAqKSAiRXhwb3N1cmVDb21wZW5zYXRpb24iLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMEQsIChjaGFyICopICJDb250cmFzdCIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAwRSwgKGNoYXIgKikgIlNoYWRvdyIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAwRiwgKGNoYXIgKikgIkhpZ2hsaWdodCIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAxMCwgKGNoYXIgKikgIlNhdHVyYXRpb24iLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMTEsIChjaGFyICopICJTaGFycG5lc3MiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMTIsIChjaGFyICopICJYM0ZpbGxMaWdodCIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAxNCwgKGNoYXIgKikgIkNvbG9yQWRqdXN0bWVudCIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAxNSwgKGNoYXIgKikgIkFkanVzdG1lbnRNb2RlIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDE2LCAoY2hhciAqKSAiUXVhbGl0eSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAxNywgKGNoYXIgKikgIkZpcm13YXJlIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDE4LCAoY2hhciAqKSAiU29mdHdhcmUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMTksIChjaGFyICopICJBdXRvQnJhY2tldCIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAxQSwgKGNoYXIgKikgIlByZXZpZXdJbWFnZVN0YXJ0IiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDFCLCAoY2hhciAqKSAiUHJldmlld0ltYWdlTGVuZ3RoIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDFDLCAoY2hhciAqKSAiUHJldmlld0ltYWdlU2l6ZSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAxRCwgKGNoYXIgKikgIk1ha2VyTm90ZVZlcnNpb24iLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMUYsIChjaGFyICopICJBRlBvaW50IiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDIyLCAoY2hhciAqKSAiRmlsZUZvcm1hdCIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAyNCwgKGNoYXIgKikgIkNhbGlicmF0aW9uIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDJDLCAoY2hhciAqKSAiQ29sb3JNb2RlIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDMwLCAoY2hhciAqKSAiTGVuc0FwZXJ0dXJlUmFuZ2UiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMzEsIChjaGFyICopICJGTnVtYmVyIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDMyLCAoY2hhciAqKSAiRXhwb3N1cmVUaW1lIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDMzLCAoY2hhciAqKSAiRXhwb3N1cmVUaW1lMiIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAzNCwgKGNoYXIgKikgIkJ1cnN0U2hvdCIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAzNSwgKGNoYXIgKikgIkV4cG9zdXJlQ29tcGVuc2F0aW9uIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDM5LCAoY2hhciAqKSAiU2Vuc29yVGVtcGVyYXR1cmUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwM0EsIChjaGFyICopICJGbGFzaEV4cG9zdXJlQ29tcCIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4MDAzQiwgKGNoYXIgKikgIkZpcm13YXJlIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDNDLCAoY2hhciAqKSAiV2hpdGVCYWxhbmNlIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDNELCAoY2hhciAqKSAiUGljdHVyZU1vZGUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDAwMDAsIChjaGFyICopIE5VTEwsIChjaGFyICopIE5VTEx9CisgIH07CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJUFRDIHRhZ3MgZGVmaW5pdGlvbgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIFRhZ0luZm8KKyAgaXB0Y190YWdfdGFibGVbXSA9CisgIHsKKwkgIC8vIElQVEMtTkFBIElJTSB2ZXJzaW9uIDQKKyAgICB7ICAweDAyMDAgKyAgIDAsIChjaGFyICopICJBcHBsaWNhdGlvblJlY29yZFZlcnNpb24iLCAoY2hhciAqKSAiQXBwbGljYXRpb24gUmVjb3JkIFZlcnNpb24ifSwKKyAgICB7ICAweDAyMDAgKyAgIDMsIChjaGFyICopICJPYmplY3RUeXBlUmVmZXJlbmNlIiwgKGNoYXIgKikgIk9iamVjdCBUeXBlIFJlZmVyZW5jZSJ9LAorICAgIHsgIDB4MDIwMCArICAgNCwgKGNoYXIgKikgIk9iamVjdEF0dHJpYnV0ZVJlZmVyZW5jZSIsIChjaGFyICopICJPYmplY3QgQXR0cmlidXRlIFJlZmVyZW5jZSJ9LAorICAgIHsgIDB4MDIwMCArICAgNSwgKGNoYXIgKikgIk9iamVjdE5hbWUiLCAoY2hhciAqKSAiVGl0bGUifSwKKyAgICB7ICAweDAyMDAgKyAgIDcsIChjaGFyICopICJFZGl0U3RhdHVzIiwgKGNoYXIgKikgIkVkaXQgU3RhdHVzIn0sCisgICAgeyAgMHgwMjAwICsgICA4LCAoY2hhciAqKSAiRWRpdG9yaWFsVXBkYXRlIiwgKGNoYXIgKikgIkVkaXRvcmlhbCBVcGRhdGUifSwKKyAgICB7ICAweDAyMDAgKyAgMTAsIChjaGFyICopICJVcmdlbmN5IiwgKGNoYXIgKikgIlVyZ2VuY3kifSwKKyAgICB7ICAweDAyMDAgKyAgMTIsIChjaGFyICopICJTdWJqZWN0UmVmZXJlbmNlIiwgKGNoYXIgKikgIlN1YmplY3QgUmVmZXJlbmNlIn0sCisgICAgeyAgMHgwMjAwICsgIDE1LCAoY2hhciAqKSAiQ2F0ZWdvcnkiLCAoY2hhciAqKSAiQ2F0ZWdvcnkifSwKKyAgICB7ICAweDAyMDAgKyAgMjAsIChjaGFyICopICJTdXBwbGVtZW50YWxDYXRlZ29yaWVzIiwgKGNoYXIgKikgIlN1cHBsZW1lbnRhbCBDYXRlZ29yaWVzIn0sCisgICAgeyAgMHgwMjAwICsgIDIyLCAoY2hhciAqKSAiRml4dHVyZUlkZW50aWZpZXIiLCAoY2hhciAqKSAiRml4dHVyZSBJZGVudGlmaWVyIn0sCisgICAgeyAgMHgwMjAwICsgIDI1LCAoY2hhciAqKSAiS2V5d29yZHMiLCAoY2hhciAqKSAiS2V5d29yZHMifSwKKyAgICB7ICAweDAyMDAgKyAgMjYsIChjaGFyICopICJDb250ZW50TG9jYXRpb25Db2RlIiwgKGNoYXIgKikgIkNvbnRlbnQgTG9jYXRpb24gQ29kZSJ9LAorICAgIHsgIDB4MDIwMCArICAyNywgKGNoYXIgKikgIkNvbnRlbnRMb2NhdGlvbk5hbWUiLCAoY2hhciAqKSAiQ29udGVudCBMb2NhdGlvbiBOYW1lIn0sCisgICAgeyAgMHgwMjAwICsgIDMwLCAoY2hhciAqKSAiUmVsZWFzZURhdGUiLCAoY2hhciAqKSAiUmVsZWFzZSBEYXRlIn0sCisgICAgeyAgMHgwMjAwICsgIDM1LCAoY2hhciAqKSAiUmVsZWFzZVRpbWUiLCAoY2hhciAqKSAiUmVsZWFzZSBUaW1lIn0sCisgICAgeyAgMHgwMjAwICsgIDM3LCAoY2hhciAqKSAiRXhwaXJhdGlvbkRhdGUiLCAoY2hhciAqKSAiRXhwaXJhdGlvbiBEYXRlIn0sCisgICAgeyAgMHgwMjAwICsgIDM4LCAoY2hhciAqKSAiRXhwaXJhdGlvblRpbWUiLCAoY2hhciAqKSAiRXhwaXJhdGlvbiBUaW1lIn0sCisgICAgeyAgMHgwMjAwICsgIDQwLCAoY2hhciAqKSAiU3BlY2lhbEluc3RydWN0aW9ucyIsIChjaGFyICopICJJbnN0cnVjdGlvbnMifSwKKyAgICB7ICAweDAyMDAgKyAgNDIsIChjaGFyICopICJBY3Rpb25BZHZpc2VkIiwgKGNoYXIgKikgIkFjdGlvbiBBZHZpc2VkIn0sCisgICAgeyAgMHgwMjAwICsgIDQ1LCAoY2hhciAqKSAiUmVmZXJlbmNlU2VydmljZSIsIChjaGFyICopICJSZWZlcmVuY2UgU2VydmljZSJ9LAorICAgIHsgIDB4MDIwMCArICA0NywgKGNoYXIgKikgIlJlZmVyZW5jZURhdGUiLCAoY2hhciAqKSAiUmVmZXJlbmNlIERhdGUifSwKKyAgICB7ICAweDAyMDAgKyAgNTAsIChjaGFyICopICJSZWZlcmVuY2VOdW1iZXIiLCAoY2hhciAqKSAiUmVmZXJlbmNlIE51bWJlciJ9LAorICAgIHsgIDB4MDIwMCArICA1NSwgKGNoYXIgKikgIkRhdGVDcmVhdGVkIiwgKGNoYXIgKikgIkRhdGUgQ3JlYXRlZCJ9LAorICAgIHsgIDB4MDIwMCArICA2MCwgKGNoYXIgKikgIlRpbWVDcmVhdGVkIiwgKGNoYXIgKikgIlRpbWUgQ3JlYXRlZCJ9LAorICAgIHsgIDB4MDIwMCArICA2MiwgKGNoYXIgKikgIkRpZ2l0YWxDcmVhdGlvbkRhdGUiLCAoY2hhciAqKSAiRGlnaXRhbCBDcmVhdGlvbiBEYXRlIn0sCisgICAgeyAgMHgwMjAwICsgIDYzLCAoY2hhciAqKSAiRGlnaXRhbENyZWF0aW9uVGltZSIsIChjaGFyICopICJEaWdpdGFsIENyZWF0aW9uIFRpbWUifSwKKyAgICB7ICAweDAyMDAgKyAgNjUsIChjaGFyICopICJPcmlnaW5hdGluZ1Byb2dyYW0iLCAoY2hhciAqKSAiT3JpZ2luYXRpbmcgUHJvZ3JhbSJ9LAorICAgIHsgIDB4MDIwMCArICA3MCwgKGNoYXIgKikgIlByb2dyYW1WZXJzaW9uIiwgKGNoYXIgKikgIlByb2dyYW0gVmVyc2lvbiJ9LAorICAgIHsgIDB4MDIwMCArICA3NSwgKGNoYXIgKikgIk9iamVjdEN5Y2xlIiwgKGNoYXIgKikgIk9iamVjdCBDeWNsZSJ9LAorICAgIHsgIDB4MDIwMCArICA4MCwgKGNoYXIgKikgIkJ5LWxpbmUiLCAoY2hhciAqKSAiQXV0aG9yIn0sCisgICAgeyAgMHgwMjAwICsgIDg1LCAoY2hhciAqKSAiQnktbGluZVRpdGxlIiwgKGNoYXIgKikgIkF1dGhvcidzIFBvc2l0aW9uIn0sCisgICAgeyAgMHgwMjAwICsgIDkwLCAoY2hhciAqKSAiQ2l0eSIsIChjaGFyICopICJDaXR5In0sCisgICAgeyAgMHgwMjAwICsgIDkyLCAoY2hhciAqKSAiU3ViTG9jYXRpb24iLCAoY2hhciAqKSAiU3ViLUxvY2F0aW9uIn0sCisgICAgeyAgMHgwMjAwICsgIDk1LCAoY2hhciAqKSAiUHJvdmluY2UtU3RhdGUiLCAoY2hhciAqKSAiU3RhdGUvUHJvdmluY2UifSwKKyAgICB7ICAweDAyMDAgKyAxMDAsIChjaGFyICopICJDb3VudHJ5LVByaW1hcnlMb2NhdGlvbkNvZGUiLCAoY2hhciAqKSAiQ291bnRyeSBDb2RlIn0sCisgICAgeyAgMHgwMjAwICsgMTAxLCAoY2hhciAqKSAiQ291bnRyeS1QcmltYXJ5TG9jYXRpb25OYW1lIiwgKGNoYXIgKikgIkNvdW50cnkgTmFtZSJ9LAorICAgIHsgIDB4MDIwMCArIDEwMywgKGNoYXIgKikgIk9yaWdpbmFsVHJhbnNtaXNzaW9uUmVmZXJlbmNlIiwgKGNoYXIgKikgIlRyYW5zbWlzc2lvbiBSZWZlcmVuY2UifSwKKyAgICB7ICAweDAyMDAgKyAxMDUsIChjaGFyICopICJIZWFkbGluZSIsIChjaGFyICopICJIZWFkbGluZSJ9LAorICAgIHsgIDB4MDIwMCArIDExMCwgKGNoYXIgKikgIkNyZWRpdCIsIChjaGFyICopICJDcmVkaXQifSwKKyAgICB7ICAweDAyMDAgKyAxMTUsIChjaGFyICopICJTb3VyY2UiLCAoY2hhciAqKSAiU291cmNlIn0sCisgICAgeyAgMHgwMjAwICsgMTE2LCAoY2hhciAqKSAiQ29weXJpZ2h0Tm90aWNlIiwgKGNoYXIgKikgIkNvcHlyaWdodCBOb3RpY2UifSwKKyAgICB7ICAweDAyMDAgKyAxMTgsIChjaGFyICopICJDb250YWN0IiwgKGNoYXIgKikgIkNvbnRhY3QifSwKKyAgICB7ICAweDAyMDAgKyAxMjAsIChjaGFyICopICJDYXB0aW9uLUFic3RyYWN0IiwgKGNoYXIgKikgIkNhcHRpb24ifSwKKyAgICB7ICAweDAyMDAgKyAxMjIsIChjaGFyICopICJXcml0ZXItRWRpdG9yIiwgKGNoYXIgKikgIkNhcHRpb24gV3JpdGVyIn0sCisgICAgeyAgMHgwMjAwICsgMTI1LCAoY2hhciAqKSAiUmFzdGVyaXplZENhcHRpb24iLCAoY2hhciAqKSAiUmFzdGVyaXplZCBDYXB0aW9uIn0sCisgICAgeyAgMHgwMjAwICsgMTMwLCAoY2hhciAqKSAiSW1hZ2VUeXBlIiwgKGNoYXIgKikgIkltYWdlIFR5cGUifSwKKyAgICB7ICAweDAyMDAgKyAxMzEsIChjaGFyICopICJJbWFnZU9yaWVudGF0aW9uIiwgKGNoYXIgKikgIkltYWdlIE9yaWVudGF0aW9uIn0sCisgICAgeyAgMHgwMjAwICsgMTM1LCAoY2hhciAqKSAiTGFuZ3VhZ2VJZGVudGlmaWVyIiwgKGNoYXIgKikgIkxhbmd1YWdlIElkZW50aWZpZXIifSwKKyAgICB7ICAweDAyMDAgKyAxNTAsIChjaGFyICopICJBdWRpb1R5cGUiLCAoY2hhciAqKSAiQXVkaW8gVHlwZSJ9LAorICAgIHsgIDB4MDIwMCArIDE1MSwgKGNoYXIgKikgIkF1ZGlvU2FtcGxpbmdSYXRlIiwgKGNoYXIgKikgIkF1ZGlvIFNhbXBsaW5nIFJhdGUifSwKKyAgICB7ICAweDAyMDAgKyAxNTIsIChjaGFyICopICJBdWRpb1NhbXBsaW5nUmVzb2x1dGlvbiIsIChjaGFyICopICJBdWRpbyBTYW1wbGluZyBSZXNvbHV0aW9uIn0sCisgICAgeyAgMHgwMjAwICsgMTUzLCAoY2hhciAqKSAiQXVkaW9EdXJhdGlvbiIsIChjaGFyICopICJBdWRpbyBEdXJhdGlvbiJ9LAorICAgIHsgIDB4MDIwMCArIDE1NCwgKGNoYXIgKikgIkF1ZGlvT3V0Y3VlIiwgKGNoYXIgKikgIkF1ZGlvIE91dGN1ZSJ9LAorCQkvLyBNZXRhZGF0YSBzZWVuIGluIG90aGVyIHNvZnR3YXJlcyAoc2VlIGFsc28gaHR0cDovL293bC5waHkucXVlZW5zdS5jYS9+cGhpbC9leGlmdG9vbC9UYWdOYW1lcy9JUFRDLmh0bWwjQXBwbGljYXRpb25SZWNvcmQpCisgICAgeyAgMHgwMjAwICsgMTg0LCAoY2hhciAqKSAiSm9iSUQiLCAoY2hhciAqKSAiSm9iIElEIn0sCisgICAgeyAgMHgwMjAwICsgMTg1LCAoY2hhciAqKSAiTWFzdGVyRG9jdW1lbnRJRCIsIChjaGFyICopICJNYXN0ZXIgRG9jdW1lbnQgSUQifSwKKyAgICB7ICAweDAyMDAgKyAxODYsIChjaGFyICopICJTaG9ydERvY3VtZW50SUQiLCAoY2hhciAqKSAiU2hvcnQgRG9jdW1lbnQgSUQifSwKKyAgICB7ICAweDAyMDAgKyAxODcsIChjaGFyICopICJVbmlxdWVEb2N1bWVudElEIiwgKGNoYXIgKikgIlVuaXF1ZSBEb2N1bWVudCBJRCJ9LAorICAgIHsgIDB4MDIwMCArIDE4OCwgKGNoYXIgKikgIk93bmVySUQiLCAoY2hhciAqKSAiT3duZXIgSUQifSwKKwkJLy8gSVBUQy1OQUEgSUlNIHZlcnNpb24gNAorICAgIHsgIDB4MDIwMCArIDIwMCwgKGNoYXIgKikgIk9iamVjdFByZXZpZXdGaWxlRm9ybWF0IiwgKGNoYXIgKikgIk9iamVjdCBQcmV2aWV3IEZpbGUgRm9ybWF0In0sCisgICAgeyAgMHgwMjAwICsgMjAxLCAoY2hhciAqKSAiT2JqZWN0UHJldmlld0ZpbGVWZXJzaW9uIiwgKGNoYXIgKikgIk9iamVjdCBQcmV2aWV3IEZpbGUgVmVyc2lvbiJ9LAorICAgIHsgIDB4MDIwMCArIDIwMiwgKGNoYXIgKikgIk9iamVjdFByZXZpZXdEYXRhIiwgKGNoYXIgKikgIkF1ZGlvIE91dGN1ZSJ9LAorCQkvLyBNZXRhZGF0YSBzZWVuIGluIG90aGVyIHNvZnR3YXJlcyAoc2VlIGFsc28gaHR0cDovL293bC5waHkucXVlZW5zdS5jYS9+cGhpbC9leGlmdG9vbC9UYWdOYW1lcy9JUFRDLmh0bWwjQXBwbGljYXRpb25SZWNvcmQpCisgICAgeyAgMHgwMjAwICsgMjIxLCAoY2hhciAqKSAiUHJlZnMiLCAoY2hhciAqKSAiUGhvdG9NZWNoYW5pYyBwcmVmZXJlbmNlcyJ9LAorICAgIHsgIDB4MDIwMCArIDIyNSwgKGNoYXIgKikgIkNsYXNzaWZ5U3RhdGUiLCAoY2hhciAqKSAiQ2xhc3NpZnkgU3RhdGUifSwKKyAgICB7ICAweDAyMDAgKyAyMjgsIChjaGFyICopICJTaW1pbGFyaXR5SW5kZXgiLCAoY2hhciAqKSAiU2ltaWxhcml0eSBJbmRleCJ9LAorICAgIHsgIDB4MDIwMCArIDIzMCwgKGNoYXIgKikgIkRvY3VtZW50Tm90ZXMiLCAoY2hhciAqKSAiRG9jdW1lbnQgTm90ZXMifSwKKyAgICB7ICAweDAyMDAgKyAyMzEsIChjaGFyICopICJEb2N1bWVudEhpc3RvcnkiLCAoY2hhciAqKSAiRG9jdW1lbnQgSGlzdG9yeSJ9LAorICAgIHsgIDB4MDIwMCArIDIzMiwgKGNoYXIgKikgIkV4aWZDYW1lcmFJbmZvIiwgKGNoYXIgKikgIkV4aWYgQ2FtZXJhIEluZm8ifSwKKworICAgIHsgIDB4MDAwMCwgKGNoYXIgKikgTlVMTCwgKGNoYXIgKikgTlVMTH0KKyAgfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEdlb1RJRkYgdGFncyBkZWZpbml0aW9uCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgVGFnSW5mbworICBnZW90aWZmX3RhZ190YWJsZVtdID0KKyAgeworICAgIHsgIDB4ODMwRSwgKGNoYXIgKikgIkdlb1BpeGVsU2NhbGUiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDg0ODAsIChjaGFyICopICJJbnRlcmdyYXBoIFRyYW5zZm9ybWF0aW9uTWF0cml4IiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHg4NDgyLCAoY2hhciAqKSAiR2VvVGllUG9pbnRzIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHg4NUQ3LCAoY2hhciAqKSAiSlBMIENhcnRvIElGRCBvZmZzZXQiLCAoY2hhciAqKSBOVUxMfSwKKyAgICB7ICAweDg1RDgsIChjaGFyICopICJHZW9UcmFuc2Zvcm1hdGlvbk1hdHJpeCIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4ODdBRiwgKGNoYXIgKikgIkdlb0tleURpcmVjdG9yeSIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4ODdCMCwgKGNoYXIgKikgIkdlb0RvdWJsZVBhcmFtcyIsIChjaGFyICopIE5VTEx9LAorICAgIHsgIDB4ODdCMSwgKGNoYXIgKikgIkdlb0FTQ0lJUGFyYW1zIiwgKGNoYXIgKikgTlVMTH0sCisgICAgeyAgMHgwMDAwLCAoY2hhciAqKSBOVUxMLCAoY2hhciAqKSBOVUxMfQorICB9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQW5pbWF0aW9uIHRhZ3MgZGVmaW5pdGlvbgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIFRhZ0luZm8KKyAgYW5pbWF0aW9uX3RhZ190YWJsZVtdID0KKyAgeworICAgIHsgIDB4MDAwMSwgKGNoYXIgKikgIkxvZ2ljYWxXaWR0aCIsIChjaGFyICopICJMb2dpY2FsIHdpZHRoIn0sCisgICAgeyAgMHgwMDAyLCAoY2hhciAqKSAiTG9naWNhbEhlaWdodCIsIChjaGFyICopICJMb2dpY2FsIGhlaWdodCJ9LAorICAgIHsgIDB4MDAwMywgKGNoYXIgKikgIkdsb2JhbFBhbGV0dGUiLCAoY2hhciAqKSAiR2xvYmFsIFBhbGV0dGUifSwKKyAgICB7ICAweDAwMDQsIChjaGFyICopICJMb29wIiwgKGNoYXIgKikgImxvb3AifSwKKyAgICB7ICAweDEwMDEsIChjaGFyICopICJGcmFtZUxlZnQiLCAoY2hhciAqKSAiRnJhbWUgbGVmdCJ9LAorICAgIHsgIDB4MTAwMiwgKGNoYXIgKikgIkZyYW1lVG9wIiwgKGNoYXIgKikgIkZyYW1lIHRvcCJ9LAorICAgIHsgIDB4MTAwMywgKGNoYXIgKikgIk5vTG9jYWxQYWxldHRlIiwgKGNoYXIgKikgIk5vIExvY2FsIFBhbGV0dGUifSwKKyAgICB7ICAweDEwMDQsIChjaGFyICopICJJbnRlcmxhY2VkIiwgKGNoYXIgKikgIkludGVybGFjZWQifSwKKyAgICB7ICAweDEwMDUsIChjaGFyICopICJGcmFtZVRpbWUiLCAoY2hhciAqKSAiRnJhbWUgZGlzcGxheSB0aW1lIn0sCisgICAgeyAgMHgxMDA2LCAoY2hhciAqKSAiRGlzcG9zYWxNZXRob2QiLCAoY2hhciAqKSAiRnJhbWUgZGlzcG9zYWwgbWV0aG9kIn0sCisgICAgeyAgMHgwMDAwLCAoY2hhciAqKSBOVUxMLCAoY2hhciAqKSBOVUxMfQorICB9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVGFnTGliIGNsYXNzIGRlZmluaXRpb24KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworLyoqCitUaGlzIGlzIHdoZXJlIHRoZSB0YWcgaW5mbyB0YWJsZXMgYXJlIGluaXRpYWxpemVkCisqLworVGFnTGliOjpUYWdMaWIoKSB7CisJLy8gaW5pdGlhbGl6ZSBhbGwga25vd24gbWV0YWRhdGEgbW9kZWxzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvLyBFeGlmCisJYWRkTWV0YWRhdGFNb2RlbChUYWdMaWI6OkVYSUZfTUFJTiwgZXhpZl9leGlmX3RhZ190YWJsZSk7CisJYWRkTWV0YWRhdGFNb2RlbChUYWdMaWI6OkVYSUZfRVhJRiwgZXhpZl9leGlmX3RhZ190YWJsZSk7CisJYWRkTWV0YWRhdGFNb2RlbChUYWdMaWI6OkVYSUZfR1BTLCBleGlmX2dwc190YWdfdGFibGUpOworCWFkZE1ldGFkYXRhTW9kZWwoVGFnTGliOjpFWElGX0lOVEVST1AsIGV4aWZfaW50ZXJvcF90YWdfdGFibGUpOworCisJLy8gRXhpZiBtYWtlciBub3RlCisJYWRkTWV0YWRhdGFNb2RlbChUYWdMaWI6OkVYSUZfTUFLRVJOT1RFX0NBTk9OLCBleGlmX2Nhbm9uX3RhZ190YWJsZSk7CisJYWRkTWV0YWRhdGFNb2RlbChUYWdMaWI6OkVYSUZfTUFLRVJOT1RFX0NBU0lPVFlQRTEsIGV4aWZfY2FzaW9fdHlwZTFfdGFnX3RhYmxlKTsKKwlhZGRNZXRhZGF0YU1vZGVsKFRhZ0xpYjo6RVhJRl9NQUtFUk5PVEVfQ0FTSU9UWVBFMiwgZXhpZl9jYXNpb190eXBlMl90YWdfdGFibGUpOworCWFkZE1ldGFkYXRhTW9kZWwoVGFnTGliOjpFWElGX01BS0VSTk9URV9GVUpJRklMTSwgZXhpZl9mdWppZmlsbV90YWdfdGFibGUpOworCWFkZE1ldGFkYXRhTW9kZWwoVGFnTGliOjpFWElGX01BS0VSTk9URV9LWU9DRVJBLCBleGlmX2t5b2NlcmFfdGFnX3RhYmxlKTsKKwlhZGRNZXRhZGF0YU1vZGVsKFRhZ0xpYjo6RVhJRl9NQUtFUk5PVEVfTUlOT0xUQSwgZXhpZl9taW5vbHRhX3RhZ190YWJsZSk7CisJYWRkTWV0YWRhdGFNb2RlbChUYWdMaWI6OkVYSUZfTUFLRVJOT1RFX05JS09OVFlQRTEsIGV4aWZfbmlrb25fdHlwZTFfdGFnX3RhYmxlKTsKKwlhZGRNZXRhZGF0YU1vZGVsKFRhZ0xpYjo6RVhJRl9NQUtFUk5PVEVfTklLT05UWVBFMiwgZXhpZl9uaWtvbl90eXBlMl90YWdfdGFibGUpOworCWFkZE1ldGFkYXRhTW9kZWwoVGFnTGliOjpFWElGX01BS0VSTk9URV9OSUtPTlRZUEUzLCBleGlmX25pa29uX3R5cGUzX3RhZ190YWJsZSk7CisJYWRkTWV0YWRhdGFNb2RlbChUYWdMaWI6OkVYSUZfTUFLRVJOT1RFX09MWU1QVVNUWVBFMSwgZXhpZl9vbHltcHVzX3R5cGUxX3RhZ190YWJsZSk7CisJYWRkTWV0YWRhdGFNb2RlbChUYWdMaWI6OkVYSUZfTUFLRVJOT1RFX1BBTkFTT05JQywgZXhpZl9wYW5hc29uaWNfdGFnX3RhYmxlKTsKKwlhZGRNZXRhZGF0YU1vZGVsKFRhZ0xpYjo6RVhJRl9NQUtFUk5PVEVfQVNBSEksIGV4aWZfYXNhaGlfdGFnX3RhYmxlKTsKKwlhZGRNZXRhZGF0YU1vZGVsKFRhZ0xpYjo6RVhJRl9NQUtFUk5PVEVfUEVOVEFYLCBleGlmX3BlbnRheF90YWdfdGFibGUpOworCWFkZE1ldGFkYXRhTW9kZWwoVGFnTGliOjpFWElGX01BS0VSTk9URV9TT05ZLCBleGlmX3NvbnlfdGFnX3RhYmxlKTsKKwlhZGRNZXRhZGF0YU1vZGVsKFRhZ0xpYjo6RVhJRl9NQUtFUk5PVEVfU0lHTUFfU0QxLCBleGlmX3NpZ21hX3NkMV90YWdfdGFibGUpOworCWFkZE1ldGFkYXRhTW9kZWwoVGFnTGliOjpFWElGX01BS0VSTk9URV9TSUdNQV9GT1ZFT04sIGV4aWZfc2lnbWFfZm92ZW9uX3RhZ190YWJsZSk7CisKKwkvLyBJUFRDL05BQQorCWFkZE1ldGFkYXRhTW9kZWwoVGFnTGliOjpJUFRDLCBpcHRjX3RhZ190YWJsZSk7CisKKwkvLyBHZW9USUZGCisJYWRkTWV0YWRhdGFNb2RlbChUYWdMaWI6OkdFT1RJRkYsIGdlb3RpZmZfdGFnX3RhYmxlKTsKKworCS8vIEFuaW1hdGlvbgorCWFkZE1ldGFkYXRhTW9kZWwoVGFnTGliOjpBTklNQVRJT04sIGFuaW1hdGlvbl90YWdfdGFibGUpOworfQorCitCT09MIFRhZ0xpYjo6YWRkTWV0YWRhdGFNb2RlbChNRE1PREVMIG1kX21vZGVsLCBUYWdJbmZvICp0YWdfdGFibGUpIHsKKwkvLyBjaGVjayB0aGF0IHRoZSBtb2RlbCBkb2Vzbid0IGFscmVhZHkgZXhpc3QKKwlpZigoX3RhYmxlX21hcC5maW5kKG1kX21vZGVsKSA9PSBfdGFibGVfbWFwLmVuZCgpKSAmJiAodGFnX3RhYmxlICE9IE5VTEwpKSB7CisKKwkJLy8gYWRkIHRoZSB0YWcgZGVzY3JpcHRpb24gdGFibGUKKwkJVEFHSU5GTyAqaW5mb19tYXAgPSBuZXcoc3RkOjpub3Rocm93KSBUQUdJTkZPKCk7CisJCWlmKCFpbmZvX21hcCkgcmV0dXJuIEZBTFNFOworCisJCWZvcihpbnQgaSA9IDA7IDsgaSsrKSB7CisJCQlpZigodGFnX3RhYmxlW2ldLnRhZyA9PSAwKSAmJiAodGFnX3RhYmxlW2ldLmZpZWxkbmFtZSA9PSBOVUxMKSkKKwkJCQlicmVhazsKKwkJCSgqaW5mb19tYXApW3RhZ190YWJsZVtpXS50YWddID0gJnRhZ190YWJsZVtpXTsKKwkJfQorCisJCS8vIGFkZCB0aGUgbWV0YWRhdGEgbW9kZWwKKwkJX3RhYmxlX21hcFttZF9tb2RlbF0gPSBpbmZvX21hcDsKKworCQlyZXR1cm4gVFJVRTsKKwl9CisKKwlyZXR1cm4gRkFMU0U7Cit9CisKK1RhZ0xpYjo6flRhZ0xpYigpIHsKKwkvLyBkZWxldGUgbWV0YWRhdGEgbW9kZWxzCisJZm9yKFRBQkxFTUFQOjppdGVyYXRvciBpID0gX3RhYmxlX21hcC5iZWdpbigpOyBpICE9IF90YWJsZV9tYXAuZW5kKCk7IGkrKykgeworCQlUQUdJTkZPICppbmZvX21hcCA9ICgqaSkuc2Vjb25kOworCQlkZWxldGUgaW5mb19tYXA7CisJfQorfQorCisKK1RhZ0xpYiYgCitUYWdMaWI6Omluc3RhbmNlKCkgeworCXN0YXRpYyBUYWdMaWIgczsKKwlyZXR1cm4gczsKK30KKworY29uc3QgVGFnSW5mbyogCitUYWdMaWI6OmdldFRhZ0luZm8oTURNT0RFTCBtZF9tb2RlbCwgV09SRCB0YWdJRCkgeworCisJaWYoX3RhYmxlX21hcC5maW5kKG1kX21vZGVsKSAhPSBfdGFibGVfbWFwLmVuZCgpKSB7CisKKwkJVEFHSU5GTyAqaW5mb19tYXAgPSAoVEFHSU5GTyopX3RhYmxlX21hcFttZF9tb2RlbF07CisJCWlmKGluZm9fbWFwLT5maW5kKHRhZ0lEKSAhPSBpbmZvX21hcC0+ZW5kKCkpIHsKKwkJCXJldHVybiAoKmluZm9fbWFwKVt0YWdJRF07CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK2NvbnN0IGNoYXIqIAorVGFnTGliOjpnZXRUYWdGaWVsZE5hbWUoTURNT0RFTCBtZF9tb2RlbCwgV09SRCB0YWdJRCwgY2hhciAqZGVmYXVsdEtleSkgeworCisJY29uc3QgVGFnSW5mbyAqaW5mbyA9IGdldFRhZ0luZm8obWRfbW9kZWwsIHRhZ0lEKTsKKwlpZihOVUxMID09IGluZm8pIHsKKwkJaWYoZGVmYXVsdEtleSAhPSBOVUxMKSB7CisJCQlzcHJpbnRmKGRlZmF1bHRLZXksICJUYWcgMHglMDRYIiwgdGFnSUQpOworCQkJcmV0dXJuICZkZWZhdWx0S2V5WzBdOworCQl9IGVsc2UgeworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisKKwlyZXR1cm4gaW5mby0+ZmllbGRuYW1lOworfQorCitjb25zdCBjaGFyKiAKK1RhZ0xpYjo6Z2V0VGFnRGVzY3JpcHRpb24oTURNT0RFTCBtZF9tb2RlbCwgV09SRCB0YWdJRCkgeworCisJY29uc3QgVGFnSW5mbyAqaW5mbyA9IGdldFRhZ0luZm8obWRfbW9kZWwsIHRhZ0lEKTsKKwlpZihpbmZvKSB7CisJCXJldHVybiBpbmZvLT5kZXNjcmlwdGlvbjsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworaW50IFRhZ0xpYjo6Z2V0VGFnSUQoTURNT0RFTCBtZF9tb2RlbCwgY29uc3QgY2hhciAqa2V5KSB7CisKKwlpZihfdGFibGVfbWFwLmZpbmQobWRfbW9kZWwpICE9IF90YWJsZV9tYXAuZW5kKCkpIHsKKworCQlUQUdJTkZPICppbmZvX21hcCA9IChUQUdJTkZPKilfdGFibGVfbWFwW21kX21vZGVsXTsKKwkJZm9yKFRBR0lORk86Oml0ZXJhdG9yIGkgPSBpbmZvX21hcC0+YmVnaW4oKTsgaSAhPSBpbmZvX21hcC0+ZW5kKCk7IGkrKykgeworCQkJY29uc3QgVGFnSW5mbyAqaW5mbyA9ICgqaSkuc2Vjb25kOworCQkJaWYoaW5mbyAmJiAoc3RyY21wKGluZm8tPmZpZWxkbmFtZSwga2V5KSA9PSAwKSkgeworCQkJCXJldHVybiAoaW50KWluZm8tPnRhZzsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gLTE7Cit9CisKK0ZSRUVfSU1BR0VfTURNT0RFTCAKK1RhZ0xpYjo6Z2V0RnJlZUltYWdlTW9kZWwoTURNT0RFTCBtb2RlbCkgeworCXN3aXRjaChtb2RlbCkgeworCQljYXNlIEVYSUZfTUFJTjoKKwkJCXJldHVybiBGSU1EX0VYSUZfTUFJTjsKKworCQljYXNlIEVYSUZfRVhJRjoKKwkJCXJldHVybiBGSU1EX0VYSUZfRVhJRjsKKworCQljYXNlIEVYSUZfR1BTOiAKKwkJCXJldHVybiBGSU1EX0VYSUZfR1BTOworCisJCWNhc2UgRVhJRl9JTlRFUk9QOgorCQkJcmV0dXJuIEZJTURfRVhJRl9JTlRFUk9QOworCisJCWNhc2UgRVhJRl9NQUtFUk5PVEVfQ0FOT046CisJCWNhc2UgRVhJRl9NQUtFUk5PVEVfQ0FTSU9UWVBFMToKKwkJY2FzZSBFWElGX01BS0VSTk9URV9DQVNJT1RZUEUyOgorCQljYXNlIEVYSUZfTUFLRVJOT1RFX0ZVSklGSUxNOgorCQljYXNlIEVYSUZfTUFLRVJOT1RFX0tZT0NFUkE6CisJCWNhc2UgRVhJRl9NQUtFUk5PVEVfTUlOT0xUQToKKwkJY2FzZSBFWElGX01BS0VSTk9URV9OSUtPTlRZUEUxOgorCQljYXNlIEVYSUZfTUFLRVJOT1RFX05JS09OVFlQRTI6CisJCWNhc2UgRVhJRl9NQUtFUk5PVEVfTklLT05UWVBFMzoKKwkJY2FzZSBFWElGX01BS0VSTk9URV9PTFlNUFVTVFlQRTE6CisJCWNhc2UgRVhJRl9NQUtFUk5PVEVfUEFOQVNPTklDOgorCQljYXNlIEVYSUZfTUFLRVJOT1RFX0FTQUhJOgorCQljYXNlIEVYSUZfTUFLRVJOT1RFX1BFTlRBWDoKKwkJY2FzZSBFWElGX01BS0VSTk9URV9TT05ZOgorCQljYXNlIEVYSUZfTUFLRVJOT1RFX1NJR01BX1NEMToKKwkJY2FzZSBFWElGX01BS0VSTk9URV9TSUdNQV9GT1ZFT046CisJCQlyZXR1cm4gRklNRF9FWElGX01BS0VSTk9URTsKKworCQljYXNlIElQVEM6CisJCQlyZXR1cm4gRklNRF9JUFRDOworCisJCWNhc2UgR0VPVElGRjoKKwkJCXJldHVybiBGSU1EX0dFT1RJRkY7CisKKwkJY2FzZSBBTklNQVRJT046CisJCQlyZXR1cm4gRklNRF9BTklNQVRJT047CisJfQorCisJcmV0dXJuIEZJTURfTk9EQVRBOworfQorCmRpZmYgLS1naXQgYS9maWxlcy9Tb3VyY2UvTWV0YWRhdGEvWFRJRkYuY3BwIGIvZmlsZXMvU291cmNlL01ldGFkYXRhL1hUSUZGLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjc3NDkyCi0tLSAvZGV2L251bGwKKysrIGIvZmlsZXMvU291cmNlL01ldGFkYXRhL1hUSUZGLmNwcApAQCAtMCwwICsxLDc2NiBAQAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gTWV0YWRhdGEgZnVuY3Rpb25zIGltcGxlbWVudGF0aW9uCisvLyBFeHRlbmRlZCBUSUZGIERpcmVjdG9yeSBHRU8gVGFnIFN1cHBvcnQKKy8vCisvLyBEZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIGJ5CisvLyAtIEhlcnbDqSBEcm9sb24gKGRyb2xvbkBpbmZvbmllLmZyKQorLy8gLSBUaG9yc3RlbiBSYWRkZSAoc3VwcG9ydEBJZGVhbFNvZnR3YXJlLmNvbSkKKy8vIC0gQmVyZW5kIEVuZ2VsYnJlY2h0IChzb2Z0d2FyZWNhdmVAdXNlcnMuc291cmNlZm9yZ2UubmV0KQorLy8gLSBNaWhhaWwgTmF5ZGVub3YgKG1uYXlkZW5vdkB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQpCisvLworLy8gQmFzZWQgb24gdGhlIExpYlRJRkYgeHRpZmZpbyBzYW1wbGUgYW5kIG9uIExpYkdlb1RJRkYKKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBGcmVlSW1hZ2UgMworLy8KKy8vIENPVkVSRUQgQ09ERSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWQorLy8gT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMKKy8vIFRIQVQgVEhFIENPVkVSRUQgQ09ERSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLy8gT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQKKy8vIENPREUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkgQ09WRVJFRCBDT0RFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QKKy8vIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZCisvLyBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMCisvLyBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GIEFOWSBDT1ZFUkVEIENPREUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSCisvLyBUSElTIERJU0NMQUlNRVIuCisvLworLy8gVXNlIGF0IHlvdXIgb3duIHJpc2shCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAorCisjaWZkZWYgX01TQ19WRVIKKyNwcmFnbWEgd2FybmluZyAoZGlzYWJsZSA6IDQ3ODYpIC8vIGlkZW50aWZpZXIgd2FzIHRydW5jYXRlZCB0byAnbnVtYmVyJyBjaGFyYWN0ZXJzCisjZW5kaWYKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L3RpZmYvbGlidGlmZi90aWZmaW9wLmgiCisKKyNpbmNsdWRlICJGcmVlSW1hZ2UuaCIKKyNpbmNsdWRlICJVdGlsaXRpZXMuaCIKKyNpbmNsdWRlICJGcmVlSW1hZ2VUYWcuaCIKKyNpbmNsdWRlICJGSVJhdGlvbmFsLmgiCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgRXh0ZW5kZWQgVElGRiBEaXJlY3RvcnkgR0VPIFRhZyBTdXBwb3J0CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qKgorICBUaWZmIGluZm8gc3RydWN0dXJlLgorICBFbnRyeSBmb3JtYXQ6CisgIHsgVEFHTlVNQkVSLCBSZWFkQ291bnQsIFdyaXRlQ291bnQsIERhdGFUeXBlLCBGSUVMRE5VTSwgT2tUb0NoYW5nZSwgUGFzc0RpckNvdW50T25TZXQsIEFzY2lpTmFtZSB9CisKKyAgRm9yIFJlYWRDb3VudCwgV3JpdGVDb3VudCwgLTEgPSB1bmtub3duLgorKi8KK3N0YXRpYyBjb25zdCBUSUZGRmllbGRJbmZvIHh0aWZmRmllbGRJbmZvW10gPSB7CisgIHsgVElGRlRBR19HRU9QSVhFTFNDQUxFLCAtMSwgLTEsIFRJRkZfRE9VQkxFLCBGSUVMRF9DVVNUT00sIFRSVUUsIFRSVUUsIChjaGFyKikiR2VvUGl4ZWxTY2FsZSIgfSwKKyAgeyBUSUZGVEFHX0lOVEVSR1JBUEhfTUFUUklYLCAtMSwgLTEsIFRJRkZfRE9VQkxFLCBGSUVMRF9DVVNUT00sIFRSVUUsIFRSVUUsIChjaGFyKikiSW50ZXJncmFwaCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCIgfSwKKyAgeyBUSUZGVEFHX0dFT1RSQU5TTUFUUklYLCAtMSwgLTEsIFRJRkZfRE9VQkxFLCBGSUVMRF9DVVNUT00sIFRSVUUsIFRSVUUsIChjaGFyKikiR2VvVHJhbnNmb3JtYXRpb25NYXRyaXgiIH0sCisgIHsgVElGRlRBR19HRU9USUVQT0lOVFMsCS0xLCAtMSwgVElGRl9ET1VCTEUsIEZJRUxEX0NVU1RPTSwgVFJVRSwgVFJVRSwgKGNoYXIqKSJHZW9UaWVQb2ludHMiIH0sCisgIHsgVElGRlRBR19HRU9LRVlESVJFQ1RPUlksLTEsLTEsIFRJRkZfU0hPUlQsIEZJRUxEX0NVU1RPTSwgVFJVRSwgVFJVRSwgKGNoYXIqKSJHZW9LZXlEaXJlY3RvcnkiIH0sCisgIHsgVElGRlRBR19HRU9ET1VCTEVQQVJBTVMsIC0xLCAtMSwgVElGRl9ET1VCTEUsCUZJRUxEX0NVU1RPTSwgVFJVRSwgVFJVRSwgKGNoYXIqKSJHZW9Eb3VibGVQYXJhbXMiIH0sCisgIHsgVElGRlRBR19HRU9BU0NJSVBBUkFNUywgLTEsIC0xLCBUSUZGX0FTQ0lJLCBGSUVMRF9DVVNUT00sIFRSVUUsIEZBTFNFLCAoY2hhciopICJHZW9BU0NJSVBhcmFtcyIgfSwKKyAgeyBUSUZGVEFHX0pQTF9DQVJUT19JRkQsIDEsIDEsIFRJRkZfTE9ORywgRklFTERfQ1VTVE9NLCBUUlVFLCBUUlVFLCAoY2hhciopIkpQTCBDYXJ0byBJRkQgb2Zmc2V0IiB9ICAvKiogRG9uJ3QgdXNlIHRoaXMhICoqLworfTsKKworc3RhdGljIHZvaWQKK19YVElGRkxvY2FsRGVmYXVsdERpcmVjdG9yeShUSUZGICp0aWYpIHsKKwlpbnQgdGFnX3NpemUgPSBzaXplb2YoeHRpZmZGaWVsZEluZm8pIC8gc2l6ZW9mKHh0aWZmRmllbGRJbmZvWzBdKTsKKwkvLyBJbnN0YWxsIHRoZSBleHRlbmRlZCBUYWcgZmllbGQgaW5mbworCVRJRkZNZXJnZUZpZWxkSW5mbyh0aWYsIHh0aWZmRmllbGRJbmZvLCB0YWdfc2l6ZSk7Cit9CisKK3N0YXRpYyBUSUZGRXh0ZW5kUHJvYyBfUGFyZW50RXh0ZW5kZXI7CisKKy8qKgorVGhpcyBpcyB0aGUgY2FsbGJhY2sgcHJvY2VkdXJlLCBhbmQgaXMKK2NhbGxlZCBieSB0aGUgRGVmYXVsdERpcmVjdG9yeSBtZXRob2QKK2V2ZXJ5IHRpbWUgYSBuZXcgVElGRiBkaXJlY3RvcnkgaXMgb3BlbmVkLgorKi8KK3N0YXRpYyB2b2lkCitfWFRJRkZEZWZhdWx0RGlyZWN0b3J5KFRJRkYgKnRpZikgeworCS8vIHNldCB1cCBvdXIgb3duIGRlZmF1bHRzCisJX1hUSUZGTG9jYWxEZWZhdWx0RGlyZWN0b3J5KHRpZik7CisKKwkvKgorCVNpbmNlIGFuIFhUSUZGIGNsaWVudCBtb2R1bGUgbWF5IGhhdmUgb3ZlcnJpZGRlbgorCXRoZSBkZWZhdWx0IGRpcmVjdG9yeSBtZXRob2QsIHdlIGNhbGwgaXQgbm93IHRvCisJYWxsb3cgaXQgdG8gc2V0IHVwIHRoZSByZXN0IG9mIGl0cyBvd24gbWV0aG9kcy4KKwkqLworCWlmIChfUGFyZW50RXh0ZW5kZXIpIHsKKwkJKCpfUGFyZW50RXh0ZW5kZXIpKHRpZik7CisJfQorfQorCisvKioKK1hUSUZGIEluaXRpYWxpemVyIC0tIHNldHMgdXAgdGhlIGNhbGxiYWNrIHByb2NlZHVyZSBmb3IgdGhlIFRJRkYgbW9kdWxlLgorQHNlZSBQbHVnaW5USUZGOjpJbml0VElGRgorKi8KK3ZvaWQKK1hUSUZGSW5pdGlhbGl6ZSh2b2lkKSB7CisJc3RhdGljIGludCBmaXJzdF90aW1lID0gMTsKKworCWlmICghIGZpcnN0X3RpbWUpIHsKKwkJcmV0dXJuOyAvKiBCZWVuIHRoZXJlLiBEb25lIHRoYXQuICovCisJfQorCWZpcnN0X3RpbWUgPSAwOworCisJLy8gR3JhYiB0aGUgaW5oZXJpdGVkIG1ldGhvZCBhbmQgaW5zdGFsbAorCV9QYXJlbnRFeHRlbmRlciA9IFRJRkZTZXRUYWdFeHRlbmRlcihfWFRJRkZEZWZhdWx0RGlyZWN0b3J5KTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICBHZW9USUZGIHRhZyByZWFkaW5nIC8gd3JpdGluZworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitCT09MCit0aWZmX3JlYWRfZ2VvdGlmZl9wcm9maWxlKFRJRkYgKnRpZiwgRklCSVRNQVAgKmRpYikgeworCWNoYXIgZGVmYXVsdEtleVsxNl07CisKKwkvLyBmaXJzdCBjaGVjayBmb3IgYSBtYW5kYXRvcnkgdGFnCisJeworCQlzaG9ydCB0YWdfY291bnQgPSAwOworCQl2b2lkKiBkYXRhID0gTlVMTDsKKwkJCisJCWlmKCFUSUZGR2V0RmllbGQodGlmLCBUSUZGVEFHX0dFT0tFWURJUkVDVE9SWSwgJnRhZ19jb3VudCwgJmRhdGEpKSB7CisJCQkvLyBubyBHZW9USUZGIHRhZyBoZXJlCisJCQlyZXR1cm4gVFJVRTsKKwkJfQorCX0KKworCS8vIG5leHQsIHJlYWQgR2VvVElGRiB0YWdzCisKKwljb25zdCBzaXplX3QgdGFnX3NpemUgPSBzaXplb2YoeHRpZmZGaWVsZEluZm8pIC8gc2l6ZW9mKHh0aWZmRmllbGRJbmZvWzBdKTsKKworCVRhZ0xpYiYgdGFnX2xpYiA9IFRhZ0xpYjo6aW5zdGFuY2UoKTsKKworCWZvcihzaXplX3QgaSA9IDA7IGkgPCB0YWdfc2l6ZTsgaSsrKSB7CisKKwkJY29uc3QgVElGRkZpZWxkSW5mbyAqZmllbGRJbmZvID0gJnh0aWZmRmllbGRJbmZvW2ldOworCisJCWlmKGZpZWxkSW5mby0+ZmllbGRfdHlwZSA9PSBUSUZGX0FTQ0lJKSB7CisJCQljaGFyICpwYXJhbXMgPSBOVUxMOworCisJCQlpZihUSUZGR2V0RmllbGQodGlmLCBmaWVsZEluZm8tPmZpZWxkX3RhZywgJnBhcmFtcykpIHsKKwkJCQkvLyBjcmVhdGUgYSB0YWcKKwkJCQlGSVRBRyAqdGFnID0gRnJlZUltYWdlX0NyZWF0ZVRhZygpOworCQkJCWlmKCF0YWcpIHsKKwkJCQkJcmV0dXJuIEZBTFNFOworCQkJCX0KKworCQkJCVdPUkQgdGFnX2lkID0gKFdPUkQpZmllbGRJbmZvLT5maWVsZF90YWc7CisKKwkJCQlGcmVlSW1hZ2VfU2V0VGFnVHlwZSh0YWcsIChGUkVFX0lNQUdFX01EVFlQRSlmaWVsZEluZm8tPmZpZWxkX3R5cGUpOworCQkJCUZyZWVJbWFnZV9TZXRUYWdJRCh0YWcsIHRhZ19pZCk7CisJCQkJRnJlZUltYWdlX1NldFRhZ0tleSh0YWcsIHRhZ19saWIuZ2V0VGFnRmllbGROYW1lKFRhZ0xpYjo6R0VPVElGRiwgdGFnX2lkLCBkZWZhdWx0S2V5KSk7CisJCQkJRnJlZUltYWdlX1NldFRhZ0Rlc2NyaXB0aW9uKHRhZywgdGFnX2xpYi5nZXRUYWdEZXNjcmlwdGlvbihUYWdMaWI6OkdFT1RJRkYsIHRhZ19pZCkpOworCQkJCUZyZWVJbWFnZV9TZXRUYWdMZW5ndGgodGFnLCAoRFdPUkQpc3RybGVuKHBhcmFtcykgKyAxKTsKKwkJCQlGcmVlSW1hZ2VfU2V0VGFnQ291bnQodGFnLCBGcmVlSW1hZ2VfR2V0VGFnTGVuZ3RoKHRhZykpOworCQkJCUZyZWVJbWFnZV9TZXRUYWdWYWx1ZSh0YWcsIHBhcmFtcyk7CisJCQkJRnJlZUltYWdlX1NldE1ldGFkYXRhKEZJTURfR0VPVElGRiwgZGliLCBGcmVlSW1hZ2VfR2V0VGFnS2V5KHRhZyksIHRhZyk7CisKKwkJCQkvLyBkZWxldGUgdGhlIHRhZworCQkJCUZyZWVJbWFnZV9EZWxldGVUYWcodGFnKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXNob3J0IHRhZ19jb3VudCA9IDA7CisJCQl2b2lkKiBkYXRhID0gTlVMTDsKKworCQkJaWYoVElGRkdldEZpZWxkKHRpZiwgZmllbGRJbmZvLT5maWVsZF90YWcsICZ0YWdfY291bnQsICZkYXRhKSkgeworCQkJCS8vIGNyZWF0ZSBhIHRhZworCQkJCUZJVEFHICp0YWcgPSBGcmVlSW1hZ2VfQ3JlYXRlVGFnKCk7CisJCQkJaWYoIXRhZykgeworCQkJCQlyZXR1cm4gRkFMU0U7CisJCQkJfQorCisJCQkJV09SRCB0YWdfaWQgPSAoV09SRClmaWVsZEluZm8tPmZpZWxkX3RhZzsKKwkJCQlGUkVFX0lNQUdFX01EVFlQRSB0YWdfdHlwZSA9IChGUkVFX0lNQUdFX01EVFlQRSlmaWVsZEluZm8tPmZpZWxkX3R5cGU7CisKKwkJCQlGcmVlSW1hZ2VfU2V0VGFnVHlwZSh0YWcsIHRhZ190eXBlKTsKKwkJCQlGcmVlSW1hZ2VfU2V0VGFnSUQodGFnLCB0YWdfaWQpOworCQkJCUZyZWVJbWFnZV9TZXRUYWdLZXkodGFnLCB0YWdfbGliLmdldFRhZ0ZpZWxkTmFtZShUYWdMaWI6OkdFT1RJRkYsIHRhZ19pZCwgZGVmYXVsdEtleSkpOworCQkJCUZyZWVJbWFnZV9TZXRUYWdEZXNjcmlwdGlvbih0YWcsIHRhZ19saWIuZ2V0VGFnRGVzY3JpcHRpb24oVGFnTGliOjpHRU9USUZGLCB0YWdfaWQpKTsKKwkJCQlGcmVlSW1hZ2VfU2V0VGFnTGVuZ3RoKHRhZywgRnJlZUltYWdlX1RhZ0RhdGFXaWR0aCh0YWdfdHlwZSkgKiB0YWdfY291bnQpOworCQkJCUZyZWVJbWFnZV9TZXRUYWdDb3VudCh0YWcsIHRhZ19jb3VudCk7CisJCQkJRnJlZUltYWdlX1NldFRhZ1ZhbHVlKHRhZywgZGF0YSk7CisJCQkJRnJlZUltYWdlX1NldE1ldGFkYXRhKEZJTURfR0VPVElGRiwgZGliLCBGcmVlSW1hZ2VfR2V0VGFnS2V5KHRhZyksIHRhZyk7CisKKwkJCQkvLyBkZWxldGUgdGhlIHRhZworCQkJCUZyZWVJbWFnZV9EZWxldGVUYWcodGFnKTsKKwkJCX0KKwkJfQorCX0gLy8gZm9yKHRhZ19zaXplKQorCisJcmV0dXJuIFRSVUU7Cit9CisKK0JPT0wKK3RpZmZfd3JpdGVfZ2VvdGlmZl9wcm9maWxlKFRJRkYgKnRpZiwgRklCSVRNQVAgKmRpYikgeworCWNoYXIgZGVmYXVsdEtleVsxNl07CisKKwlpZihGcmVlSW1hZ2VfR2V0TWV0YWRhdGFDb3VudChGSU1EX0dFT1RJRkYsIGRpYikgPT0gMCkgeworCQkvLyBubyBHZW9USUZGIHRhZyBoZXJlCisJCXJldHVybiBUUlVFOworCX0KKworCWNvbnN0IHNpemVfdCB0YWdfc2l6ZSA9IHNpemVvZih4dGlmZkZpZWxkSW5mbykgLyBzaXplb2YoeHRpZmZGaWVsZEluZm9bMF0pOworCisJVGFnTGliJiB0YWdfbGliID0gVGFnTGliOjppbnN0YW5jZSgpOworCisJZm9yKHNpemVfdCBpID0gMDsgaSA8IHRhZ19zaXplOyBpKyspIHsKKwkJY29uc3QgVElGRkZpZWxkSW5mbyAqZmllbGRJbmZvID0gJnh0aWZmRmllbGRJbmZvW2ldOworCisJCUZJVEFHICp0YWcgPSBOVUxMOworCQljb25zdCBjaGFyICprZXkgPSB0YWdfbGliLmdldFRhZ0ZpZWxkTmFtZShUYWdMaWI6OkdFT1RJRkYsIChXT1JEKWZpZWxkSW5mby0+ZmllbGRfdGFnLCBkZWZhdWx0S2V5KTsKKworCQlpZihGcmVlSW1hZ2VfR2V0TWV0YWRhdGEoRklNRF9HRU9USUZGLCBkaWIsIGtleSwgJnRhZykpIHsKKwkJCWlmKEZyZWVJbWFnZV9HZXRUYWdUeXBlKHRhZykgPT0gRklEVF9BU0NJSSkgeworCQkJCVRJRkZTZXRGaWVsZCh0aWYsIGZpZWxkSW5mby0+ZmllbGRfdGFnLCBGcmVlSW1hZ2VfR2V0VGFnVmFsdWUodGFnKSk7CisJCQl9IGVsc2UgeworCQkJCVRJRkZTZXRGaWVsZCh0aWYsIGZpZWxkSW5mby0+ZmllbGRfdGFnLCBGcmVlSW1hZ2VfR2V0VGFnQ291bnQodGFnKSwgRnJlZUltYWdlX0dldFRhZ1ZhbHVlKHRhZykpOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgVElGRiBFWElGIHRhZyByZWFkaW5nICYgd3JpdGluZworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKioKK1JlYWQgYSBzaW5nbGUgRXhpZiB0YWcKKworQHBhcmFtIHRpZiBUSUZGIGhhbmRsZQorQHBhcmFtIHRhZ19pZCBUSUZGIFRhZyBJRAorQHBhcmFtIGRpYiBJbWFnZSBiZWluZyByZWFkCitAcGFyYW0gbWRfbW9kZWwgTWV0YWRhdGEgbW9kZWwgd2hlcmUgdG8gc3RvcmUgdGhlIHRhZworQHJldHVybiBSZXR1cm5zIFRSVUUgaWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyBGQUxTRSBvdGhlcndpc2UKKyovCitzdGF0aWMgQk9PTCAKK3RpZmZfcmVhZF9leGlmX3RhZyhUSUZGICp0aWYsIHVpbnQzMiB0YWdfaWQsIEZJQklUTUFQICpkaWIsIFRhZ0xpYjo6TURNT0RFTCBtZF9tb2RlbCkgeworCXVpbnQzMiB2YWx1ZV9jb3VudCA9IDA7CisJaW50IG1lbV9hbGxvYyA9IDA7CisJdm9pZCAqcmF3X2RhdGEgPSBOVUxMOworCisJaWYodGFnX2lkID09IFRJRkZUQUdfRVhJRklGRCkgeworCQkvLyBFeGlmIElGRCBvZmZzZXQgLSBza2lwIHRoaXMgdGFnCisJCS8vIG1kX21vZGVsIHNob3VsZCBiZSBFWElGX01BSU4sIHRoZSBFeGlmIElGRCBpcyBwcm9jZXNzZWQgbGF0ZXIgdXNpbmcgdGhlIEVYSUZfRVhJRiBtZXRhZGF0YSBtb2RlbAorCQlyZXR1cm4gVFJVRTsKKwl9CisJaWYoKHRhZ19pZCA9PSBUSUZGVEFHX0dQU0lGRCkgJiYgKG1kX21vZGVsID09IFRhZ0xpYjo6RVhJRl9NQUlOKSkgeworCQkvLyBFeGlmIEdQUyBJRkQgb2Zmc2V0IC0gc2tpcCB0aGlzIHRhZworCQkvLyBzaG91bGQgYmUgcHJvY2Vzc2VkIGluIGFub3RoZXIgd2F5IC4uLgorCQlyZXR1cm4gVFJVRTsKKwl9CisJCisJVGFnTGliJiB0YWdMaWIgPSBUYWdMaWI6Omluc3RhbmNlKCk7CisKKwkvLyBnZXQgdGhlIHRhZyBrZXkgLSB1c2UgTlVMTCB0byBhdm9pZCByZWFkaW5nIEdlb1RJRkYgdGFncworCWNvbnN0IGNoYXIgKmtleSA9IHRhZ0xpYi5nZXRUYWdGaWVsZE5hbWUobWRfbW9kZWwsIChXT1JEKXRhZ19pZCwgTlVMTCk7CisJaWYoa2V5ID09IE5VTEwpIHsKKwkJcmV0dXJuIFRSVUU7CisJfQorCisJY29uc3QgVElGRkZpZWxkICpmaXAgPSBUSUZGRmllbGRXaXRoVGFnKHRpZiwgdGFnX2lkKTsKKwlpZihmaXAgPT0gTlVMTCkgeworCQlyZXR1cm4gVFJVRTsKKwl9CisKKwlpZihUSUZGRmllbGRQYXNzQ291bnQoZmlwKSkgeyAKKwkJLy8gYSBjb3VudCB2YWx1ZSBpcyByZXF1aXJlZCBmb3IgJ1RJRkZHZXRGaWVsZCcKKworCQlpZiAoVElGRkZpZWxkUmVhZENvdW50KGZpcCkgIT0gVElGRl9WQVJJQUJMRTIpIHsKKwkJCS8vIGEgY291bnQgaXMgcmVxdWlyZWQsIGl0IHdpbGwgYmUgb2YgdHlwZSB1aW50MTYKKwkJCXVpbnQxNiB2YWx1ZV9jb3VudDE2ID0gMDsKKwkJCWlmKFRJRkZHZXRGaWVsZCh0aWYsIHRhZ19pZCwgJnZhbHVlX2NvdW50MTYsICZyYXdfZGF0YSkgIT0gMSkgeworCQkJCS8vIHN0b3AsIGlnbm9yZSBlcnJvcgorCQkJCXJldHVybiBUUlVFOworCQkJfQorCQkJdmFsdWVfY291bnQgPSB2YWx1ZV9jb3VudDE2OworCQl9IGVsc2UgeworCQkJLy8gYSBjb3VudCBpcyByZXF1aXJlZCwgaXQgd2lsbCBiZSBvZiB0eXBlIHVpbnQzMgorCQkJdWludDMyIHZhbHVlX2NvdW50MzIgPSAwOworCQkJaWYoVElGRkdldEZpZWxkKHRpZiwgdGFnX2lkLCAmdmFsdWVfY291bnQzMiwgJnJhd19kYXRhKSAhPSAxKSB7CisJCQkJLy8gc3RvcCwgaWdub3JlIGVycm9yCisJCQkJcmV0dXJuIFRSVUU7CisJCQl9CisJCQl2YWx1ZV9jb3VudCA9IHZhbHVlX2NvdW50MzI7CisJCX0KKworCX0gZWxzZSB7CisJCS8vIGRldGVybWluZSBjb3VudAorCisJCWlmIChUSUZGRmllbGRSZWFkQ291bnQoZmlwKSA9PSBUSUZGX1ZBUklBQkxFIHx8IFRJRkZGaWVsZFJlYWRDb3VudChmaXApID09IFRJRkZfVkFSSUFCTEUyKSB7CisJCQl2YWx1ZV9jb3VudCA9IDE7CisJCX0gZWxzZSBpZiAoVElGRkZpZWxkUmVhZENvdW50KGZpcCkgPT0gVElGRl9TUFApIHsKKwkJCXVpbnQxNiBzcHA7CisJCQlUSUZGR2V0RmllbGREZWZhdWx0ZWQodGlmLCBUSUZGVEFHX1NBTVBMRVNQRVJQSVhFTCwgJnNwcCk7CisJCQl2YWx1ZV9jb3VudCA9IHNwcDsKKwkJfSBlbHNlIHsKKwkJCXZhbHVlX2NvdW50ID0gVElGRkZpZWxkUmVhZENvdW50KGZpcCk7CisJCX0KKworCQkvLyBhY2Nlc3MgZmllbGRzIGFzIHBvaW50ZXJzIHRvIGRhdGEKKwkJLy8gKCMjIyBkZXRlcm1pbmluZyB0aGlzIGlzIE5PVCByb2J1c3QuLi4gYW5kIGhhcmRseSBjYW4gYmUuIEl0IGlzIGltcGxlbWVudGVkIGxvb2tpbmcgdGhlIF9USUZGVkdldEZpZWxkIGNvZGUpCisKKwkJaWYoVElGRkZpZWxkVGFnKGZpcCkgPT0gVElGRlRBR19UUkFOU0ZFUkZVTkNUSU9OKSB7CisJCQkvLyByZWFkaW5nIHRoaXMgdGFnIGNhdXNlIGEgYnVnIHByb2JhYmx5IGxvY2F0ZWQgc29tZXdoZXJlIGluc2lkZSBsaWJ0aWZmCisJCQlyZXR1cm4gVFJVRTsKKwkJfQorCisJCWlmICgoVElGRkZpZWxkRGF0YVR5cGUoZmlwKSA9PSBUSUZGX0FTQ0lJCisJCSAgICAgfHwgVElGRkZpZWxkUmVhZENvdW50KGZpcCkgPT0gVElGRl9WQVJJQUJMRQorCQkgICAgIHx8IFRJRkZGaWVsZFJlYWRDb3VudChmaXApID09IFRJRkZfVkFSSUFCTEUyCisJCSAgICAgfHwgVElGRkZpZWxkUmVhZENvdW50KGZpcCkgPT0gVElGRl9TUFAKKwkJCSB8fCB2YWx1ZV9jb3VudCA+IDEpCisJCQkgCisJCQkgJiYgVElGRkZpZWxkVGFnKGZpcCkgIT0gVElGRlRBR19QQUdFTlVNQkVSCisJCQkgJiYgVElGRkZpZWxkVGFnKGZpcCkgIT0gVElGRlRBR19IQUxGVE9ORUhJTlRTCisJCQkgJiYgVElGRkZpZWxkVGFnKGZpcCkgIT0gVElGRlRBR19ZQ0JDUlNVQlNBTVBMSU5HCisJCQkgJiYgVElGRkZpZWxkVGFnKGZpcCkgIT0gVElGRlRBR19ET1RSQU5HRQorCisJCQkgJiYgVElGRkZpZWxkVGFnKGZpcCkgIT0gVElGRlRBR19CSVRTUEVSU0FNUExFCS8vPC0gdGhlc2UgdHdvIGFyZSB0cmlja3kgLSAKKwkJCSAmJiBUSUZGRmllbGRUYWcoZmlwKSAhPSBUSUZGVEFHX0NPTVBSRVNTSU9OCS8vPC0gdGhleSBhcmUgZGVmaW5lZCBhcyBUSUZGX1ZBUklBQkxFIGJ1dCBpbiByZWFsaXR5IHJldHVybiBhIHNpbmdsZSB2YWx1ZQorCQkJICkgeworCQkJCSBpZihUSUZGR2V0RmllbGQodGlmLCB0YWdfaWQsICZyYXdfZGF0YSkgIT0gMSkgeworCQkJCQkgLy8gc3RvcCwgaWdub3JlIGVycm9yCisJCQkJCSByZXR1cm4gVFJVRTsKKwkJCQkgfQorCQl9IGVsc2UgeworCQkJaW50IHZhbHVlX3NpemUgPSAwOworCisJCQkvLyBhY2Nlc3MgZmllbGRzIGFzIHZhbHVlcworCisJCQkvLyBOb3RlOiAKKwkJCS8vIEZvciBUSUZGX1JBVElPTkFMIHZhbHVlcywgVElGRkRhdGFXaWR0aCgpIHJldHVybnMgOCwgYnV0IExpYlRJRkYgdXNlIGludGVybmFseSA0LWJ5dGUgZmxvYXQgdG8gcmVwcmVzZW50IHJhdGlvbmFscy4KKwkJCXsKKwkJCQlUSUZGRGF0YVR5cGUgdGFnX3R5cGUgPSBUSUZGRmllbGREYXRhVHlwZShmaXApOworCQkJCXN3aXRjaCh0YWdfdHlwZSkgeworCQkJCQljYXNlIFRJRkZfUkFUSU9OQUw6CisJCQkJCWNhc2UgVElGRl9TUkFUSU9OQUw6CisJCQkJCQl2YWx1ZV9zaXplID0gNDsKKwkJCQkJCWJyZWFrOworCQkJCQlkZWZhdWx0OgorCQkJCQkJdmFsdWVfc2l6ZSA9IFRJRkZEYXRhV2lkdGgodGFnX3R5cGUpOworCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQlyYXdfZGF0YSA9IF9USUZGbWFsbG9jKHZhbHVlX3NpemUgKiB2YWx1ZV9jb3VudCk7CisJCQltZW1fYWxsb2MgPSAxOworCQkJaW50IG9rID0gRkFMU0U7CisJCQkKKwkJCS8vICMjIyBpZiB2YWx1ZV9jb3VudCA+IDEsIHRhZyBpcyBQQUdFTlVNQkVSIG9yIEhBTEZUT05FSElOVFMgb3IgWUNCQ1JTVUJTQU1QTElORyBvciBET1RSQU5HRSwgCisJCQkvLyBhbGwgb2ZmIHdoaWNoIGFyZSB2YWx1ZV9jb3VudCA9PSAyIChzZWUgdGlmX2RpcmluZm8uYykKKwkJCXN3aXRjaCh2YWx1ZV9jb3VudCkKKwkJCXsKKwkJCQljYXNlIDE6CisJCQkJCW9rID0gVElGRkdldEZpZWxkKHRpZiwgdGFnX2lkLCByYXdfZGF0YSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMjoKKwkJCQkJb2sgPSBUSUZGR2V0RmllbGQodGlmLCB0YWdfaWQsIHJhd19kYXRhLCAoQllURSopKHJhd19kYXRhKSArIHZhbHVlX3NpemUqMSk7CisJCQkJCWJyZWFrOworLyogIyB3ZSBtaWdodCBuZWVkIG1vcmUgaW4gdGhlIGZ1dHVyZToKKwkJCQljYXNlIDM6CisJCQkJCW9rID0gVElGRkdldEZpZWxkKHRpZiwgdGFnX2lkLCByYXdfZGF0YSwgKEJZVEUqKShyYXdfZGF0YSkgKyB2YWx1ZV9zaXplKjEsIChCWVRFKikocmF3X2RhdGEpICsgdmFsdWVfc2l6ZSoyKTsKKwkJCQkJYnJlYWs7CisqLworCQkJCWRlZmF1bHQ6CisJCQkJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhGSUZfVElGRiwgIlVuaW1wbGVtZW50ZWQgdmFyaWFibGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMgZm9yIFRpZmYgVGFnICVzIiwgVElGRkZpZWxkTmFtZShmaXApKTsKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlpZihvayAhPSAxKSB7CisJCQkJX1RJRkZmcmVlKHJhd19kYXRhKTsKKwkJCQlyZXR1cm4gVFJVRTsKKwkJCX0KKwkJfQorCX0KKworCS8vIGJ1aWxkIEZyZWVJbWFnZSB0YWcgZnJvbSBUaWZmIFRhZyBkYXRhIHdlIGNvbGxlY3RlZAorCisJRklUQUcgKmZpdGFnID0gRnJlZUltYWdlX0NyZWF0ZVRhZygpOworCWlmKCFmaXRhZykgeworCQlpZihtZW1fYWxsb2MpIHsKKwkJCV9USUZGZnJlZShyYXdfZGF0YSk7CisJCX0KKwkJcmV0dXJuIEZBTFNFOworCX0KKworCUZyZWVJbWFnZV9TZXRUYWdJRChmaXRhZywgKFdPUkQpdGFnX2lkKTsKKwlGcmVlSW1hZ2VfU2V0VGFnS2V5KGZpdGFnLCBrZXkpOworCisJc3dpdGNoKFRJRkZGaWVsZERhdGFUeXBlKGZpcCkpIHsKKwkJY2FzZSBUSUZGX0JZVEU6CisJCQlGcmVlSW1hZ2VfU2V0VGFnVHlwZShmaXRhZywgRklEVF9CWVRFKTsKKwkJCUZyZWVJbWFnZV9TZXRUYWdMZW5ndGgoZml0YWcsIFRJRkZEYXRhV2lkdGgoIFRJRkZGaWVsZERhdGFUeXBlKGZpcCkgKSAqIHZhbHVlX2NvdW50KTsKKwkJCUZyZWVJbWFnZV9TZXRUYWdDb3VudChmaXRhZywgdmFsdWVfY291bnQpOworCQkJRnJlZUltYWdlX1NldFRhZ1ZhbHVlKGZpdGFnLCByYXdfZGF0YSk7CisJCQlicmVhazsKKworCQljYXNlIFRJRkZfVU5ERUZJTkVEOgorCQkJRnJlZUltYWdlX1NldFRhZ1R5cGUoZml0YWcsIEZJRFRfVU5ERUZJTkVEKTsKKwkJCUZyZWVJbWFnZV9TZXRUYWdMZW5ndGgoZml0YWcsIFRJRkZEYXRhV2lkdGgoIFRJRkZGaWVsZERhdGFUeXBlKGZpcCkgKSAqIHZhbHVlX2NvdW50KTsKKwkJCUZyZWVJbWFnZV9TZXRUYWdDb3VudChmaXRhZywgdmFsdWVfY291bnQpOworCQkJRnJlZUltYWdlX1NldFRhZ1ZhbHVlKGZpdGFnLCByYXdfZGF0YSk7CisJCQlicmVhazsKKworCQljYXNlIFRJRkZfU0JZVEU6CisJCQlGcmVlSW1hZ2VfU2V0VGFnVHlwZShmaXRhZywgRklEVF9TQllURSk7CisJCQlGcmVlSW1hZ2VfU2V0VGFnTGVuZ3RoKGZpdGFnLCBUSUZGRGF0YVdpZHRoKCBUSUZGRmllbGREYXRhVHlwZShmaXApICkgKiB2YWx1ZV9jb3VudCk7CisJCQlGcmVlSW1hZ2VfU2V0VGFnQ291bnQoZml0YWcsIHZhbHVlX2NvdW50KTsKKwkJCUZyZWVJbWFnZV9TZXRUYWdWYWx1ZShmaXRhZywgcmF3X2RhdGEpOworCQkJYnJlYWs7CisKKwkJY2FzZSBUSUZGX1NIT1JUOgorCQkJRnJlZUltYWdlX1NldFRhZ1R5cGUoZml0YWcsIEZJRFRfU0hPUlQpOworCQkJRnJlZUltYWdlX1NldFRhZ0xlbmd0aChmaXRhZywgVElGRkRhdGFXaWR0aCggVElGRkZpZWxkRGF0YVR5cGUoZmlwKSApICogdmFsdWVfY291bnQpOworCQkJRnJlZUltYWdlX1NldFRhZ0NvdW50KGZpdGFnLCB2YWx1ZV9jb3VudCk7CisJCQlGcmVlSW1hZ2VfU2V0VGFnVmFsdWUoZml0YWcsIHJhd19kYXRhKTsKKwkJCWJyZWFrOworCisJCWNhc2UgVElGRl9TU0hPUlQ6CisJCQlGcmVlSW1hZ2VfU2V0VGFnVHlwZShmaXRhZywgRklEVF9TU0hPUlQpOworCQkJRnJlZUltYWdlX1NldFRhZ0xlbmd0aChmaXRhZywgVElGRkRhdGFXaWR0aCggVElGRkZpZWxkRGF0YVR5cGUoZmlwKSApICogdmFsdWVfY291bnQpOworCQkJRnJlZUltYWdlX1NldFRhZ0NvdW50KGZpdGFnLCB2YWx1ZV9jb3VudCk7CisJCQlGcmVlSW1hZ2VfU2V0VGFnVmFsdWUoZml0YWcsIHJhd19kYXRhKTsKKwkJCWJyZWFrOworCisJCWNhc2UgVElGRl9MT05HOgorCQkJRnJlZUltYWdlX1NldFRhZ1R5cGUoZml0YWcsIEZJRFRfTE9ORyk7CisJCQlGcmVlSW1hZ2VfU2V0VGFnTGVuZ3RoKGZpdGFnLCBUSUZGRGF0YVdpZHRoKCBUSUZGRmllbGREYXRhVHlwZShmaXApICkgKiB2YWx1ZV9jb3VudCk7CisJCQlGcmVlSW1hZ2VfU2V0VGFnQ291bnQoZml0YWcsIHZhbHVlX2NvdW50KTsKKwkJCUZyZWVJbWFnZV9TZXRUYWdWYWx1ZShmaXRhZywgcmF3X2RhdGEpOworCQkJYnJlYWs7CisKKwkJY2FzZSBUSUZGX0lGRDoKKwkJCUZyZWVJbWFnZV9TZXRUYWdUeXBlKGZpdGFnLCBGSURUX0lGRCk7CisJCQlGcmVlSW1hZ2VfU2V0VGFnTGVuZ3RoKGZpdGFnLCBUSUZGRGF0YVdpZHRoKCBUSUZGRmllbGREYXRhVHlwZShmaXApICkgKiB2YWx1ZV9jb3VudCk7CisJCQlGcmVlSW1hZ2VfU2V0VGFnQ291bnQoZml0YWcsIHZhbHVlX2NvdW50KTsKKwkJCUZyZWVJbWFnZV9TZXRUYWdWYWx1ZShmaXRhZywgcmF3X2RhdGEpOworCQkJYnJlYWs7CisKKwkJY2FzZSBUSUZGX1NMT05HOgorCQkJRnJlZUltYWdlX1NldFRhZ1R5cGUoZml0YWcsIEZJRFRfU0xPTkcpOworCQkJRnJlZUltYWdlX1NldFRhZ0xlbmd0aChmaXRhZywgVElGRkRhdGFXaWR0aCggVElGRkZpZWxkRGF0YVR5cGUoZmlwKSApICogdmFsdWVfY291bnQpOworCQkJRnJlZUltYWdlX1NldFRhZ0NvdW50KGZpdGFnLCB2YWx1ZV9jb3VudCk7CisJCQlGcmVlSW1hZ2VfU2V0VGFnVmFsdWUoZml0YWcsIHJhd19kYXRhKTsKKwkJCWJyZWFrOworCisJCWNhc2UgVElGRl9SQVRJT05BTDogeworCQkJLy8gTGliVElGRiBjb252ZXJ0cyByYXRpb25hbCB0byBmbG9hdHMgOiByZWNvbnZlcnQgZmxvYXRzIHRvIHJhdGlvbmFscworCQkJRFdPUkQgKnJ2YWx1ZSA9IChEV09SRCopbWFsbG9jKDIgKiB2YWx1ZV9jb3VudCAqIHNpemVvZihEV09SRCkpOworCQkJZm9yKHVpbnQzMiBpID0gMDsgaSA8IHZhbHVlX2NvdW50OyBpKyspIHsKKwkJCQlmbG9hdCAqZnYgPSAoZmxvYXQqKXJhd19kYXRhOworCQkJCUZJUmF0aW9uYWwgcmF0aW9uYWwoZnZbaV0pOworCQkJCXJ2YWx1ZVsyKmldID0gcmF0aW9uYWwuZ2V0TnVtZXJhdG9yKCk7CisJCQkJcnZhbHVlWzIqaSsxXSA9IHJhdGlvbmFsLmdldERlbm9taW5hdG9yKCk7CisJCQl9CisJCQlGcmVlSW1hZ2VfU2V0VGFnVHlwZShmaXRhZywgRklEVF9SQVRJT05BTCk7CisJCQlGcmVlSW1hZ2VfU2V0VGFnTGVuZ3RoKGZpdGFnLCBUSUZGRGF0YVdpZHRoKCBUSUZGRmllbGREYXRhVHlwZShmaXApICkgKiB2YWx1ZV9jb3VudCk7CisJCQlGcmVlSW1hZ2VfU2V0VGFnQ291bnQoZml0YWcsIHZhbHVlX2NvdW50KTsKKwkJCUZyZWVJbWFnZV9TZXRUYWdWYWx1ZShmaXRhZywgcnZhbHVlKTsKKwkJCWZyZWUocnZhbHVlKTsKKwkJfQorCQlicmVhazsKKworCQljYXNlIFRJRkZfU1JBVElPTkFMOiB7CisJCQkvLyBMaWJUSUZGIGNvbnZlcnRzIHJhdGlvbmFsIHRvIGZsb2F0cyA6IHJlY29udmVydCBmbG9hdHMgdG8gcmF0aW9uYWxzCisJCQlMT05HICpydmFsdWUgPSAoTE9ORyopbWFsbG9jKDIgKiB2YWx1ZV9jb3VudCAqIHNpemVvZihMT05HKSk7CisJCQlmb3IodWludDMyIGkgPSAwOyBpIDwgdmFsdWVfY291bnQ7IGkrKykgeworCQkJCWZsb2F0ICpmdiA9IChmbG9hdCopcmF3X2RhdGE7CisJCQkJRklSYXRpb25hbCByYXRpb25hbChmdltpXSk7CisJCQkJcnZhbHVlWzIqaV0gPSByYXRpb25hbC5nZXROdW1lcmF0b3IoKTsKKwkJCQlydmFsdWVbMippKzFdID0gcmF0aW9uYWwuZ2V0RGVub21pbmF0b3IoKTsKKwkJCX0KKwkJCUZyZWVJbWFnZV9TZXRUYWdUeXBlKGZpdGFnLCBGSURUX1JBVElPTkFMKTsKKwkJCUZyZWVJbWFnZV9TZXRUYWdMZW5ndGgoZml0YWcsIFRJRkZEYXRhV2lkdGgoIFRJRkZGaWVsZERhdGFUeXBlKGZpcCkgKSAqIHZhbHVlX2NvdW50KTsKKwkJCUZyZWVJbWFnZV9TZXRUYWdDb3VudChmaXRhZywgdmFsdWVfY291bnQpOworCQkJRnJlZUltYWdlX1NldFRhZ1ZhbHVlKGZpdGFnLCBydmFsdWUpOworCQkJZnJlZShydmFsdWUpOworCQl9CisJCWJyZWFrOworCisJCWNhc2UgVElGRl9GTE9BVDoKKwkJCUZyZWVJbWFnZV9TZXRUYWdUeXBlKGZpdGFnLCBGSURUX0ZMT0FUKTsKKwkJCUZyZWVJbWFnZV9TZXRUYWdMZW5ndGgoZml0YWcsIFRJRkZEYXRhV2lkdGgoIFRJRkZGaWVsZERhdGFUeXBlKGZpcCkgKSAqIHZhbHVlX2NvdW50KTsKKwkJCUZyZWVJbWFnZV9TZXRUYWdDb3VudChmaXRhZywgdmFsdWVfY291bnQpOworCQkJRnJlZUltYWdlX1NldFRhZ1ZhbHVlKGZpdGFnLCByYXdfZGF0YSk7CisJCQlicmVhazsKKworCQljYXNlIFRJRkZfRE9VQkxFOgorCQkJRnJlZUltYWdlX1NldFRhZ1R5cGUoZml0YWcsIEZJRFRfRE9VQkxFKTsKKwkJCUZyZWVJbWFnZV9TZXRUYWdMZW5ndGgoZml0YWcsIFRJRkZEYXRhV2lkdGgoIFRJRkZGaWVsZERhdGFUeXBlKGZpcCkgKSAqIHZhbHVlX2NvdW50KTsKKwkJCUZyZWVJbWFnZV9TZXRUYWdDb3VudChmaXRhZywgdmFsdWVfY291bnQpOworCQkJRnJlZUltYWdlX1NldFRhZ1ZhbHVlKGZpdGFnLCByYXdfZGF0YSk7CisJCQlicmVhazsKKworCQljYXNlIFRJRkZfTE9ORzg6CS8vIEJpZ1RJRkYgNjQtYml0IHVuc2lnbmVkIGludGVnZXIgCisJCQlGcmVlSW1hZ2VfU2V0VGFnVHlwZShmaXRhZywgRklEVF9MT05HOCk7CisJCQlGcmVlSW1hZ2VfU2V0VGFnTGVuZ3RoKGZpdGFnLCBUSUZGRGF0YVdpZHRoKCBUSUZGRmllbGREYXRhVHlwZShmaXApICkgKiB2YWx1ZV9jb3VudCk7CisJCQlGcmVlSW1hZ2VfU2V0VGFnQ291bnQoZml0YWcsIHZhbHVlX2NvdW50KTsKKwkJCUZyZWVJbWFnZV9TZXRUYWdWYWx1ZShmaXRhZywgcmF3X2RhdGEpOworCQkJYnJlYWs7CisKKwkJY2FzZSBUSUZGX0lGRDg6CQkvLyBCaWdUSUZGIDY0LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIChvZmZzZXQpIAorCQkJRnJlZUltYWdlX1NldFRhZ1R5cGUoZml0YWcsIEZJRFRfSUZEOCk7CisJCQlGcmVlSW1hZ2VfU2V0VGFnTGVuZ3RoKGZpdGFnLCBUSUZGRGF0YVdpZHRoKCBUSUZGRmllbGREYXRhVHlwZShmaXApICkgKiB2YWx1ZV9jb3VudCk7CisJCQlGcmVlSW1hZ2VfU2V0VGFnQ291bnQoZml0YWcsIHZhbHVlX2NvdW50KTsKKwkJCUZyZWVJbWFnZV9TZXRUYWdWYWx1ZShmaXRhZywgcmF3X2RhdGEpOworCQkJYnJlYWs7CisKKwkJY2FzZSBUSUZGX1NMT05HODoJCS8vIEJpZ1RJRkYgNjQtYml0IHNpZ25lZCBpbnRlZ2VyIAorCQkJRnJlZUltYWdlX1NldFRhZ1R5cGUoZml0YWcsIEZJRFRfU0xPTkc4KTsKKwkJCUZyZWVJbWFnZV9TZXRUYWdMZW5ndGgoZml0YWcsIFRJRkZEYXRhV2lkdGgoIFRJRkZGaWVsZERhdGFUeXBlKGZpcCkgKSAqIHZhbHVlX2NvdW50KTsKKwkJCUZyZWVJbWFnZV9TZXRUYWdDb3VudChmaXRhZywgdmFsdWVfY291bnQpOworCQkJRnJlZUltYWdlX1NldFRhZ1ZhbHVlKGZpdGFnLCByYXdfZGF0YSk7CisJCQlicmVhazsKKworCQljYXNlIFRJRkZfQVNDSUk6CisJCWRlZmF1bHQ6IHsKKwkJCXNpemVfdCBsZW5ndGggPSAwOworCQkJaWYoIW1lbV9hbGxvYyAmJiAoVElGRkZpZWxkRGF0YVR5cGUoZmlwKSA9PSBUSUZGX0FTQ0lJKSAmJiAoVElGRkZpZWxkUmVhZENvdW50KGZpcCkgPT0gVElGRl9WQVJJQUJMRSkpIHsKKwkJCQkvLyB3aGVuIG1ldGFkYXRhIHRhZyBpcyBvZiB0eXBlIEFTQ0lJIGFuZCBpdCdzIHZhbHVlIGlzIG9mIHZhcmlhYmxlIHNpemUgKFRJRkZfVkFSSUFCTEUpLAorCQkJCS8vIHRpZmZfcmVhZF9leGlmX3RhZyBmdW5jdGlvbiBnaXZlcyBsZW5ndGggb2YgMSBzbyBhbGwgc3RyaW5ncyBhcmUgdHJ1bmNhdGVkIC4uLgorCQkJCS8vIC4uLiB0cnkgdG8gYXZvaWQgdGhpcyBieSB1c2luZyBhbiBleHBsaWNpdCBjYWxjdWxhdGlvbiBmb3IgJ2xlbmd0aCcKKwkJCQlsZW5ndGggPSBzdHJsZW4oKGNoYXIqKXJhd19kYXRhKSArIDE7CisJCQl9CisJCQllbHNlIHsKKwkJCQkvLyByZW1lbWJlciB0aGF0IHJhd19kYXRhID0gX1RJRkZtYWxsb2ModmFsdWVfc2l6ZSAqIHZhbHVlX2NvdW50KTsKKwkJCQljb25zdCBpbnQgdmFsdWVfc2l6ZSA9IFRJRkZEYXRhV2lkdGgoIFRJRkZGaWVsZERhdGFUeXBlKGZpcCkgKTsKKwkJCQlsZW5ndGggPSB2YWx1ZV9zaXplICogdmFsdWVfY291bnQ7CisJCQl9CisJCQlGcmVlSW1hZ2VfU2V0VGFnVHlwZShmaXRhZywgRklEVF9BU0NJSSk7CisJCQlGcmVlSW1hZ2VfU2V0VGFnTGVuZ3RoKGZpdGFnLCAoRFdPUkQpbGVuZ3RoKTsKKwkJCUZyZWVJbWFnZV9TZXRUYWdDb3VudChmaXRhZywgKERXT1JEKWxlbmd0aCk7CisJCQlGcmVlSW1hZ2VfU2V0VGFnVmFsdWUoZml0YWcsIHJhd19kYXRhKTsKKwkJfQorCQlicmVhazsKKwl9CisKKwljb25zdCBjaGFyICpkZXNjcmlwdGlvbiA9IHRhZ0xpYi5nZXRUYWdEZXNjcmlwdGlvbihtZF9tb2RlbCwgKFdPUkQpdGFnX2lkKTsKKwlpZihkZXNjcmlwdGlvbikgeworCQlGcmVlSW1hZ2VfU2V0VGFnRGVzY3JpcHRpb24oZml0YWcsIGRlc2NyaXB0aW9uKTsKKwl9CisJLy8gc3RvcmUgdGhlIHRhZworCUZyZWVJbWFnZV9TZXRNZXRhZGF0YSh0YWdMaWIuZ2V0RnJlZUltYWdlTW9kZWwobWRfbW9kZWwpLCBkaWIsIEZyZWVJbWFnZV9HZXRUYWdLZXkoZml0YWcpLCBmaXRhZyk7CisKKwkvLyBkZXN0cm95IHRoZSB0YWcKKwlGcmVlSW1hZ2VfRGVsZXRlVGFnKGZpdGFnKTsKKworCWlmKG1lbV9hbGxvYykgeworCQlfVElGRmZyZWUocmF3X2RhdGEpOworCX0KKwlyZXR1cm4gVFJVRTsKK30KKworLyoqCitSZWFkIGFsbCBrbm93biBleGlmIHRhZ3MKKworQHBhcmFtIHRpZiBUSUZGIGhhbmRsZQorQHBhcmFtIG1kX21vZGVsIE1ldGFkYXRhIG1vZGVsIHdoZXJlIHRvIHN0b3JlIHRoZSB0YWdzCitAcGFyYW0gZGliIEltYWdlIGJlaW5nIHJlYWQKK0ByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgRkFMU0Ugb3RoZXJ3aXNlCisqLworQk9PTCAKK3RpZmZfcmVhZF9leGlmX3RhZ3MoVElGRiAqdGlmLCBUYWdMaWI6Ok1ETU9ERUwgbWRfbW9kZWwsIEZJQklUTUFQICpkaWIpIHsKKworCVRhZ0xpYiYgdGFnTGliID0gVGFnTGliOjppbnN0YW5jZSgpOworCisJY29uc3QgaW50IGNvdW50ID0gVElGRkdldFRhZ0xpc3RDb3VudCh0aWYpOworCWZvcihpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCXVpbnQzMiB0YWdfaWQgPSBUSUZGR2V0VGFnTGlzdEVudHJ5KHRpZiwgaSk7CisJCS8vIHJlYWQgdGhlIHRhZworCQlpZiAoIXRpZmZfcmVhZF9leGlmX3RhZyh0aWYsIHRhZ19pZCwgZGliLCBtZF9tb2RlbCkpCisJCQlyZXR1cm4gRkFMU0U7CisJfQorCisJLy8gd2Ugd2FudCB0byBrbm93IHZhbHVlcyBvZiBzdGFuZGFyZCB0YWdzIHRvbyEhCisKKwkvLyBsb29wIG92ZXIgYWxsIENvcmUgRGlyZWN0b3J5IFRhZ3MKKwkvLyAjIyMgdXNlcyBwcml2YXRlIGRhdGEsIGJ1dCB0aGVyZSBpcyBubyBvdGhlciB3YXkKKwlpZihtZF9tb2RlbCA9PSBUYWdMaWI6OkVYSUZfTUFJTikgeworCQljb25zdCBUSUZGRGlyZWN0b3J5ICp0ZCA9ICZ0aWYtPnRpZl9kaXI7CisKKwkJdWludDMyIGxhc3RUYWcgPSAwOwkvLzwtIHVzZWQgdG8gcHJldmVudCByZWFkaW5nIHNvbWUgdGFncyB0d2ljZSAoYXMgc3RvcmVkIGluIHRpZl9maWVsZGluZm8pCisKKwkJZm9yIChpbnQgZmkgPSAwLCBuZmkgPSAoaW50KXRpZi0+dGlmX25maWVsZHM7IG5maSA+IDA7IG5maS0tLCBmaSsrKSB7CisJCQljb25zdCBUSUZGRmllbGQgKmZsZCA9IHRpZi0+dGlmX2ZpZWxkc1tmaV07CisKKwkJCWNvbnN0IHVpbnQzMiB0YWdfaWQgPSBUSUZGRmllbGRUYWcoZmxkKTsKKworCQkJaWYodGFnX2lkID09IGxhc3RUYWcpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLy8gdGVzdCBpZiB0YWcgdmFsdWUgaXMgc2V0CisJCQkvLyAobGlmdGVkIGRpcmVjdGx5IGZyb20gTGliVGlmZiBfVElGRldyaXRlRGlyZWN0b3J5KQorCisJCQlpZiggZmxkLT5maWVsZF9iaXQgPT0gRklFTERfQ1VTVE9NICkgeworCQkJCWludCBpc19zZXQgPSBGQUxTRTsKKworCQkJCWZvcihpbnQgY2kgPSAwOyBjaSA8IHRkLT50ZF9jdXN0b21WYWx1ZUNvdW50OyBjaSsrICkgeworCQkJCQlpc19zZXQgfD0gKHRkLT50ZF9jdXN0b21WYWx1ZXNbY2ldLmluZm8gPT0gZmxkKTsKKwkJCQl9CisKKwkJCQlpZiggIWlzX3NldCApIHsKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQl9IGVsc2UgaWYoIVRJRkZGaWVsZFNldCh0aWYsIGZsZC0+ZmllbGRfYml0KSkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvLyBwcm9jZXNzICphbGwqIG90aGVyIHRhZ3MgKHNvbWUgd2lsbCBiZSBpZ25vcmVkKQorCisJCQl0aWZmX3JlYWRfZXhpZl90YWcodGlmLCB0YWdfaWQsIGRpYiwgbWRfbW9kZWwpOworCisJCQlsYXN0VGFnID0gdGFnX2lkOworCQl9CisKKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworCisvKioKK1NraXAgdGFncyB0aGF0IGFyZSBhbHJlYWR5IGhhbmRsZWQgYnkgdGhlIExpYlRJRkYgd3JpdGluZyBwcm9jZXNzCisqLworc3RhdGljIEJPT0wgCitza2lwX3dyaXRlX2ZpZWxkKFRJRkYqIHRpZiwgdWludDMyIHRhZykgeworCXN3aXRjaCAodGFnKSB7CisJCWNhc2UgVElGRlRBR19TVUJGSUxFVFlQRToKKwkJY2FzZSBUSUZGVEFHX09TVUJGSUxFVFlQRToKKwkJY2FzZSBUSUZGVEFHX0lNQUdFV0lEVEg6CisJCWNhc2UgVElGRlRBR19JTUFHRUxFTkdUSDoKKwkJY2FzZSBUSUZGVEFHX0JJVFNQRVJTQU1QTEU6CisJCWNhc2UgVElGRlRBR19DT01QUkVTU0lPTjoKKwkJY2FzZSBUSUZGVEFHX1BIT1RPTUVUUklDOgorCQljYXNlIFRJRkZUQUdfVEhSRVNISE9MRElORzoKKwkJY2FzZSBUSUZGVEFHX0NFTExXSURUSDoKKwkJY2FzZSBUSUZGVEFHX0NFTExMRU5HVEg6CisJCWNhc2UgVElGRlRBR19GSUxMT1JERVI6CisJCWNhc2UgVElGRlRBR19TVFJJUE9GRlNFVFM6CisJCWNhc2UgVElGRlRBR19PUklFTlRBVElPTjoKKwkJY2FzZSBUSUZGVEFHX1NBTVBMRVNQRVJQSVhFTDoKKwkJY2FzZSBUSUZGVEFHX1JPV1NQRVJTVFJJUDoKKwkJY2FzZSBUSUZGVEFHX1NUUklQQllURUNPVU5UUzoKKwkJY2FzZSBUSUZGVEFHX01JTlNBTVBMRVZBTFVFOgorCQljYXNlIFRJRkZUQUdfTUFYU0FNUExFVkFMVUU6CisJCWNhc2UgVElGRlRBR19YUkVTT0xVVElPTjoKKwkJY2FzZSBUSUZGVEFHX1lSRVNPTFVUSU9OOgorCQljYXNlIFRJRkZUQUdfUExBTkFSQ09ORklHOgorCQljYXNlIFRJRkZUQUdfRlJFRU9GRlNFVFM6CisJCWNhc2UgVElGRlRBR19GUkVFQllURUNPVU5UUzoKKwkJY2FzZSBUSUZGVEFHX0dSQVlSRVNQT05TRVVOSVQ6CisJCWNhc2UgVElGRlRBR19HUkFZUkVTUE9OU0VDVVJWRToKKwkJY2FzZSBUSUZGVEFHX0dST1VQM09QVElPTlM6CisJCWNhc2UgVElGRlRBR19HUk9VUDRPUFRJT05TOgorCQljYXNlIFRJRkZUQUdfUkVTT0xVVElPTlVOSVQ6CisJCWNhc2UgVElGRlRBR19QQUdFTlVNQkVSOgorCQljYXNlIFRJRkZUQUdfQ09MT1JSRVNQT05TRVVOSVQ6CisJCWNhc2UgVElGRlRBR19QUkVESUNUT1I6CisJCWNhc2UgVElGRlRBR19DT0xPUk1BUDoKKwkJY2FzZSBUSUZGVEFHX0hBTEZUT05FSElOVFM6CisJCWNhc2UgVElGRlRBR19USUxFV0lEVEg6CisJCWNhc2UgVElGRlRBR19USUxFTEVOR1RIOgorCQljYXNlIFRJRkZUQUdfVElMRU9GRlNFVFM6CisJCWNhc2UgVElGRlRBR19USUxFQllURUNPVU5UUzoKKwkJY2FzZSBUSUZGVEFHX0VYVFJBU0FNUExFUzoKKwkJY2FzZSBUSUZGVEFHX1NBTVBMRUZPUk1BVDoKKwkJY2FzZSBUSUZGVEFHX1NNSU5TQU1QTEVWQUxVRToKKwkJY2FzZSBUSUZGVEFHX1NNQVhTQU1QTEVWQUxVRToKKwkJCS8vIHNraXAgYWx3YXlzLCB2YWx1ZXMgaGF2ZSBiZWVuIHNldCBpbiBTYXZlT25lVElGRigpCisJCQlyZXR1cm4gVFJVRTsKKwkJCWJyZWFrOworCQkKKwkJY2FzZSBUSUZGVEFHX1JJQ0hUSUZGSVBUQzoKKwkJCS8vIHNraXAgYWx3YXlzLCBJUFRDIG1ldGFkYXRhIG1vZGVsIGlzIHNldCBpbiB0aWZmX3dyaXRlX2lwdGNfcHJvZmlsZSgpCisJCQlyZXR1cm4gVFJVRTsKKwkJCWJyZWFrOworCisJCWNhc2UgVElGRlRBR19ZQ0JDUkNPRUZGSUNJRU5UUzoKKwkJY2FzZSBUSUZGVEFHX1JFRkVSRU5DRUJMQUNLV0hJVEU6CisJCWNhc2UgVElGRlRBR19ZQ0JDUlNVQlNBTVBMSU5HOgorCQkJLy8gc2tpcCBhcyB0aGV5IGNhbm5vdCBiZSBmaWxsZWQgeWV0CisJCQlyZXR1cm4gVFJVRTsKKwkJCWJyZWFrOworCQkJCisJCWNhc2UgVElGRlRBR19QQUdFTkFNRToKKwkJeworCQkJY2hhciAqdmFsdWUgPSBOVUxMOworCQkJVElGRkdldEZpZWxkKHRpZiwgVElGRlRBR19QQUdFTkFNRSwgJnZhbHVlKTsKKwkJCS8vIG9ubHkgc2tpcCBpZiBubyB2YWx1ZSBoYXMgYmVlbiBzZXQKKwkJCWlmKHZhbHVlID09IE5VTEwpIHsKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiBUUlVFOworCQkJfQorCQl9CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gRkFMU0U7CisJCQlicmVhazsKKwl9Cit9CisKKy8qKgorV3JpdGUgYWxsIGtub3duIGV4aWYgdGFncworCitAcGFyYW0gdGlmIFRJRkYgaGFuZGxlCitAcGFyYW0gbWRfbW9kZWwgTWV0YWRhdGEgbW9kZWwgZnJvbSB3aGVyZSB0byBsb2FkIHRoZSB0YWdzCitAcGFyYW0gZGliIEltYWdlIGJlaW5nIHdyaXR0ZW4KK0ByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgRkFMU0Ugb3RoZXJ3aXNlCisqLworQk9PTCAKK3RpZmZfd3JpdGVfZXhpZl90YWdzKFRJRkYgKnRpZiwgVGFnTGliOjpNRE1PREVMIG1kX21vZGVsLCBGSUJJVE1BUCAqZGliKSB7CisJY2hhciBkZWZhdWx0S2V5WzE2XTsKKwkKKwkvLyBvbmx5IEVYSUZfTUFJTiBzbyBmYXIKKwlpZihtZF9tb2RlbCAhPSBUYWdMaWI6OkVYSUZfTUFJTikgeworCQlyZXR1cm4gRkFMU0U7CisJfQorCQorCWlmKEZyZWVJbWFnZV9HZXRNZXRhZGF0YUNvdW50KEZJTURfRVhJRl9NQUlOLCBkaWIpID09IDApIHsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwkKKwlUYWdMaWImIHRhZ19saWIgPSBUYWdMaWI6Omluc3RhbmNlKCk7CisJCisJZm9yIChpbnQgZmkgPSAwLCBuZmkgPSAoaW50KXRpZi0+dGlmX25maWVsZHM7IG5maSA+IDA7IG5maS0tLCBmaSsrKSB7CisJCWNvbnN0IFRJRkZGaWVsZCAqZmxkID0gdGlmLT50aWZfZmllbGRzW2ZpXTsKKwkJCisJCWNvbnN0IHVpbnQzMiB0YWdfaWQgPSBUSUZGRmllbGRUYWcoZmxkKTsKKworCQlpZihza2lwX3dyaXRlX2ZpZWxkKHRpZiwgdGFnX2lkKSkgeworCQkJLy8gc2tpcCB0YWdzIHRoYXQgYXJlIGFscmVhZHkgaGFuZGxlZCBieSB0aGUgTGliVElGRiB3cml0aW5nIHByb2Nlc3MKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJRklUQUcgKnRhZyA9IE5VTEw7CisJCS8vIGdldCB0aGUgdGFnIGtleQorCQljb25zdCBjaGFyICprZXkgPSB0YWdfbGliLmdldFRhZ0ZpZWxkTmFtZShUYWdMaWI6OkVYSUZfTUFJTiwgKFdPUkQpdGFnX2lkLCBkZWZhdWx0S2V5KTsKKworCQlpZihGcmVlSW1hZ2VfR2V0TWV0YWRhdGEoRklNRF9FWElGX01BSU4sIGRpYiwga2V5LCAmdGFnKSkgeworCQkJRlJFRV9JTUFHRV9NRFRZUEUgdGFnX3R5cGUgPSBGcmVlSW1hZ2VfR2V0VGFnVHlwZSh0YWcpOworCQkJVElGRkRhdGFUeXBlIHRpZl90YWdfdHlwZSA9IFRJRkZGaWVsZERhdGFUeXBlKGZsZCk7CisJCQkKKwkJCS8vIGNoZWNrIGZvciBpZGVudGljYWwgZm9ybWF0cworCisJCQkvLyAoZW51bSB2YWx1ZSBhcmUgdGhlIHNhbWVzIGJldHdlZW4gRlJFRV9JTUFHRV9NRFRZUEUgYW5kIFRJRkZEYXRhVHlwZSB0eXBlcykKKwkJCWlmKChpbnQpdGlmX3RhZ190eXBlICE9IChpbnQpdGFnX3R5cGUpIHsKKwkJCQkvLyBza2lwIHRhZyBvciBfVElGRm1lbWNweSB3aWxsIGZhaWwKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCS8vIHR5cGUgb2Ygc3RvcmFnZSBtYXkgZGlmZmVyIChlLmcuIHJhdGlvbm5hbCBhcnJheSB2cyBmbG9hdCBhcnJheSB0eXBlKQorCQkJaWYoKHVuc2lnbmVkKV9USUZGRGF0YVNpemUodGlmX3RhZ190eXBlKSAhPSBGcmVlSW1hZ2VfVGFnRGF0YVdpZHRoKHRhZ190eXBlKSkgeworCQkJCS8vIHNraXAgdGFnIG9yIF9USUZGbWVtY3B5IHdpbGwgZmFpbAorCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpZih0YWdfdHlwZSA9PSBGSURUX0FTQ0lJKSB7CisJCQkJVElGRlNldEZpZWxkKHRpZiwgdGFnX2lkLCBGcmVlSW1hZ2VfR2V0VGFnVmFsdWUodGFnKSk7CisJCQl9IGVsc2UgeworCQkJCVRJRkZTZXRGaWVsZCh0aWYsIHRhZ19pZCwgRnJlZUltYWdlX0dldFRhZ0NvdW50KHRhZyksIEZyZWVJbWFnZV9HZXRUYWdWYWx1ZSh0YWcpKTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBUUlVFOworfQpkaWZmIC0tZ2l0IGEvZmlsZXMvU291cmNlL1BsdWdpbi5oIGIvZmlsZXMvU291cmNlL1BsdWdpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NjhiZWMKLS0tIC9kZXYvbnVsbAorKysgYi9maWxlcy9Tb3VyY2UvUGx1Z2luLmgKQEAgLTAsMCArMSwxNDMgQEAKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEZyZWVJbWFnZSBQbHVnaW4gSW50ZXJmYWNlCisvLworLy8gRGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBieQorLy8gLSBGbG9yaXMgdmFuIGRlbiBCZXJnIChmbHZkYmVyZ0B3eHMubmwpCisvLyAtIFJ1aSBMb3BlcyAocnVpZ2xvcGVzQHlhaG9vLmNvbSkKKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBGcmVlSW1hZ2UgMworLy8KKy8vIENPVkVSRUQgQ09ERSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWQorLy8gT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMKKy8vIFRIQVQgVEhFIENPVkVSRUQgQ09ERSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLy8gT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQKKy8vIENPREUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkgQ09WRVJFRCBDT0RFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QKKy8vIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZCisvLyBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMCisvLyBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GIEFOWSBDT1ZFUkVEIENPREUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSCisvLyBUSElTIERJU0NMQUlNRVIuCisvLworLy8gVXNlIGF0IHlvdXIgb3duIHJpc2shCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpZmRlZiBfTVNDX1ZFUiAKKyNwcmFnbWEgd2FybmluZyAoZGlzYWJsZSA6IDQ3ODYpIC8vIGlkZW50aWZpZXIgd2FzIHRydW5jYXRlZCB0byAnbnVtYmVyJyBjaGFyYWN0ZXJzCisjZW5kaWYgCisKKyNpZm5kZWYgUExVR0lOX0gKKyNkZWZpbmUgUExVR0lOX0gKKworI2luY2x1ZGUgIkZyZWVJbWFnZS5oIgorI2luY2x1ZGUgIlV0aWxpdGllcy5oIgorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3N0cnVjdCBQbHVnaW47CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIFBsdWdpbiBOb2RlCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworRklfU1RSVUNUIChQbHVnaW5Ob2RlKSB7CisJLyoqIEZSRUVfSU1BR0VfRk9STUFUIGF0dGFjaGVkIHRvIHRoaXMgcGx1Z2luICovCisJaW50IG1faWQ7CisJLyoqIEhhbmRsZSB0byBhIHVzZXIgcGx1Z2luIERMTCAoTlVMTCBmb3Igc3RhbmRhcmQgcGx1Z2lucykgKi8KKwl2b2lkICptX2luc3RhbmNlOworCS8qKiBUaGUgYWN0dWFsIHBsdWdpbiwgaG9sZGluZyB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgKi8KKwlQbHVnaW4gKm1fcGx1Z2luOworCS8qKiBFbmFibGUvRGlzYWJsZSBzd2l0Y2ggKi8KKwlCT09MIG1fZW5hYmxlZDsKKworCS8qKiBVbmlxdWUgZm9ybWF0IHN0cmluZyBmb3IgdGhlIHBsdWdpbiAqLworCWNvbnN0IGNoYXIgKm1fZm9ybWF0OworCS8qKiBEZXNjcmlwdGlvbiBzdHJpbmcgZm9yIHRoZSBwbHVnaW4gKi8KKwljb25zdCBjaGFyICptX2Rlc2NyaXB0aW9uOworCS8qKiBDb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBmaWxlIGV4dGVuc2lvbnMgaW5kaWNhdGluZyB3aGF0IGZpbGVzIHRoaXMgcGx1Z2luIGNhbiBvcGVuICovCisJY29uc3QgY2hhciAqbV9leHRlbnNpb247CisJLyoqIG9wdGlvbmFsIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBoZWxwCXNvZnR3YXJlIGlkZW50aWZ5aW5nIGEgYml0bWFwIHR5cGUgKi8KKwljb25zdCBjaGFyICptX3JlZ2V4cHI7Cit9OworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBJbnRlcm5hbCBQbHVnaW4gTGlzdAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIFBsdWdpbkxpc3QgeworcHVibGljIDoKKwlQbHVnaW5MaXN0KCk7CisJflBsdWdpbkxpc3QoKTsKKworCUZSRUVfSU1BR0VfRk9STUFUIEFkZE5vZGUoRklfSW5pdFByb2MgcHJvYywgdm9pZCAqaW5zdGFuY2UgPSBOVUxMLCBjb25zdCBjaGFyICpmb3JtYXQgPSAwLCBjb25zdCBjaGFyICpkZXNjcmlwdGlvbiA9IDAsIGNvbnN0IGNoYXIgKmV4dGVuc2lvbiA9IDAsIGNvbnN0IGNoYXIgKnJlZ2V4cHIgPSAwKTsKKwlQbHVnaW5Ob2RlICpGaW5kTm9kZUZyb21Gb3JtYXQoY29uc3QgY2hhciAqZm9ybWF0KTsKKwlQbHVnaW5Ob2RlICpGaW5kTm9kZUZyb21NaW1lKGNvbnN0IGNoYXIgKm1pbWUpOworCVBsdWdpbk5vZGUgKkZpbmROb2RlRnJvbUZJRihpbnQgbm9kZV9pZCk7CisKKwlpbnQgU2l6ZSgpIGNvbnN0OworCUJPT0wgSXNFbXB0eSgpIGNvbnN0OworCitwcml2YXRlIDoKKwlzdGQ6Om1hcDxpbnQsIFBsdWdpbk5vZGUgKj4gbV9wbHVnaW5fbWFwOworCWludCBtX25vZGVfY291bnQ7Cit9OworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgIFBsdWdpbiBJbml0aWFsaXNhdGlvbiBDYWxsYmFjaworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit2b2lkIERMTF9DQUxMQ09OViBGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZShpbnQgZmlmLCBjb25zdCBjaGFyICptZXNzYWdlLCAuLi4pOworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFJlaW1wbGVtZW50YXRpb24gb2Ygc3RyaWNtcCAoaXQgaXMgbm90IHN1cHBvcnRlZCBvbiBzb21lIHN5c3RlbXMpCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworaW50IEZyZWVJbWFnZV9zdHJpY21wKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMik7CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICAgSW50ZXJuYWwgZnVuY3Rpb25zCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2V4dGVybiAiQyIgeworCUJPT0wgRExMX0NBTExDT05WIEZyZWVJbWFnZV9WYWxpZGF0ZShGUkVFX0lNQUdFX0ZPUk1BVCBmaWYsIEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSk7CisgICAgdm9pZCAqIERMTF9DQUxMQ09OViBGcmVlSW1hZ2VfT3BlbihQbHVnaW5Ob2RlICpub2RlLCBGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIEJPT0wgb3Blbl9mb3JfcmVhZGluZyk7CisgICAgdm9pZCBETExfQ0FMTENPTlYgRnJlZUltYWdlX0Nsb3NlKFBsdWdpbk5vZGUgKm5vZGUsIEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSwgdm9pZCAqZGF0YSk7IC8vIHBsdWdpbi5jcHAKKyAgICBQbHVnaW5MaXN0ICogRExMX0NBTExDT05WIEZyZWVJbWFnZV9HZXRQbHVnaW5MaXN0KCk7IC8vIHBsdWdpbi5jcHAKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gICBJbnRlcm5hbCBwbHVnaW5zCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3ZvaWQgRExMX0NBTExDT05WIEluaXRCTVAoUGx1Z2luICpwbHVnaW4sIGludCBmb3JtYXRfaWQpOwordm9pZCBETExfQ0FMTENPTlYgSW5pdENVVChQbHVnaW4gKnBsdWdpbiwgaW50IGZvcm1hdF9pZCk7Cit2b2lkIERMTF9DQUxMQ09OViBJbml0SUNPKFBsdWdpbiAqcGx1Z2luLCBpbnQgZm9ybWF0X2lkKTsKK3ZvaWQgRExMX0NBTExDT05WIEluaXRJRkYoUGx1Z2luICpwbHVnaW4sIGludCBmb3JtYXRfaWQpOwordm9pZCBETExfQ0FMTENPTlYgSW5pdEpQRUcoUGx1Z2luICpwbHVnaW4sIGludCBmb3JtYXRfaWQpOwordm9pZCBETExfQ0FMTENPTlYgSW5pdEtPQUxBKFBsdWdpbiAqcGx1Z2luLCBpbnQgZm9ybWF0X2lkKTsKK3ZvaWQgRExMX0NBTExDT05WIEluaXRMQk0oUGx1Z2luICpwbHVnaW4sIGludCBmb3JtYXRfaWQpOwordm9pZCBETExfQ0FMTENPTlYgSW5pdE1ORyhQbHVnaW4gKnBsdWdpbiwgaW50IGZvcm1hdF9pZCk7Cit2b2lkIERMTF9DQUxMQ09OViBJbml0UENEKFBsdWdpbiAqcGx1Z2luLCBpbnQgZm9ybWF0X2lkKTsKK3ZvaWQgRExMX0NBTExDT05WIEluaXRQQ1goUGx1Z2luICpwbHVnaW4sIGludCBmb3JtYXRfaWQpOwordm9pZCBETExfQ0FMTENPTlYgSW5pdFBORyhQbHVnaW4gKnBsdWdpbiwgaW50IGZvcm1hdF9pZCk7Cit2b2lkIERMTF9DQUxMQ09OViBJbml0UE5NKFBsdWdpbiAqcGx1Z2luLCBpbnQgZm9ybWF0X2lkKTsKK3ZvaWQgRExMX0NBTExDT05WIEluaXRQU0QoUGx1Z2luICpwbHVnaW4sIGludCBmb3JtYXRfaWQpOwordm9pZCBETExfQ0FMTENPTlYgSW5pdFJBUyhQbHVnaW4gKnBsdWdpbiwgaW50IGZvcm1hdF9pZCk7Cit2b2lkIERMTF9DQUxMQ09OViBJbml0VEFSR0EoUGx1Z2luICpwbHVnaW4sIGludCBmb3JtYXRfaWQpOwordm9pZCBETExfQ0FMTENPTlYgSW5pdFRJRkYoUGx1Z2luICpwbHVnaW4sIGludCBmb3JtYXRfaWQpOwordm9pZCBETExfQ0FMTENPTlYgSW5pdFdCTVAoUGx1Z2luICpwbHVnaW4sIGludCBmb3JtYXRfaWQpOwordm9pZCBETExfQ0FMTENPTlYgSW5pdFhCTShQbHVnaW4gKnBsdWdpbiwgaW50IGZvcm1hdF9pZCk7Cit2b2lkIERMTF9DQUxMQ09OViBJbml0WFBNKFBsdWdpbiAqcGx1Z2luLCBpbnQgZm9ybWF0X2lkKTsKK3ZvaWQgRExMX0NBTExDT05WIEluaXRERFMoUGx1Z2luICpwbHVnaW4sIGludCBmb3JtYXRfaWQpOwordm9pZCBETExfQ0FMTENPTlYgSW5pdEdJRihQbHVnaW4gKnBsdWdpbiwgaW50IGZvcm1hdF9pZCk7Cit2b2lkIERMTF9DQUxMQ09OViBJbml0SERSKFBsdWdpbiAqcGx1Z2luLCBpbnQgZm9ybWF0X2lkKTsKK3ZvaWQgRExMX0NBTExDT05WIEluaXRHMyhQbHVnaW4gKnBsdWdpbiwgaW50IGZvcm1hdF9pZCk7Cit2b2lkIERMTF9DQUxMQ09OViBJbml0U0dJKFBsdWdpbiAqcGx1Z2luLCBpbnQgZm9ybWF0X2lkKTsKK3ZvaWQgRExMX0NBTExDT05WIEluaXRFWFIoUGx1Z2luICpwbHVnaW4sIGludCBmb3JtYXRfaWQpOwordm9pZCBETExfQ0FMTENPTlYgSW5pdEoySyhQbHVnaW4gKnBsdWdpbiwgaW50IGZvcm1hdF9pZCk7Cit2b2lkIERMTF9DQUxMQ09OViBJbml0SlAyKFBsdWdpbiAqcGx1Z2luLCBpbnQgZm9ybWF0X2lkKTsKK3ZvaWQgRExMX0NBTExDT05WIEluaXRQRk0oUGx1Z2luICpwbHVnaW4sIGludCBmb3JtYXRfaWQpOwordm9pZCBETExfQ0FMTENPTlYgSW5pdFBJQ1QoUGx1Z2luICpwbHVnaW4sIGludCBmb3JtYXRfaWQpOwordm9pZCBETExfQ0FMTENPTlYgSW5pdFJBVyhQbHVnaW4gKnBsdWdpbiwgaW50IGZvcm1hdF9pZCk7Cit2b2lkIERMTF9DQUxMQ09OViBJbml0Sk5HKFBsdWdpbiAqcGx1Z2luLCBpbnQgZm9ybWF0X2lkKTsKK3ZvaWQgRExMX0NBTExDT05WIEluaXRXRUJQKFBsdWdpbiAqcGx1Z2luLCBpbnQgZm9ybWF0X2lkKTsKKworI2VuZGlmIC8vIVBMVUdJTl9ICmRpZmYgLS1naXQgYS9maWxlcy9Tb3VyY2UvUXVhbnRpemVycy5oIGIvZmlsZXMvU291cmNlL1F1YW50aXplcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGIxMmQzCi0tLSAvZGV2L251bGwKKysrIGIvZmlsZXMvU291cmNlL1F1YW50aXplcnMuaApAQCAtMCwwICsxLDM1NCBAQAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gUXVhbnRpemVyIG9iamVjdHMgYW5kIGZ1bmN0aW9ucworLy8KKy8vIERlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gYnk6CisvLyAtIEhlcnbpIERyb2xvbiA8ZHJvbG9uQGluZm9uaWUuZnI+CisvLyAtIENhcnN0ZW4gS2xlaW4gKGNrbGVpbjA1QHVzZXJzLnNvdXJjZWZvcmdlLm5ldCkKKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBGcmVlSW1hZ2UgMworLy8KKy8vIENPVkVSRUQgQ09ERSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWQorLy8gT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMKKy8vIFRIQVQgVEhFIENPVkVSRUQgQ09ERSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLy8gT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQKKy8vIENPREUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkgQ09WRVJFRCBDT0RFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QKKy8vIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZCisvLyBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMCisvLyBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GIEFOWSBDT1ZFUkVEIENPREUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSCisvLyBUSElTIERJU0NMQUlNRVIuCisvLworLy8gVXNlIGF0IHlvdXIgb3duIHJpc2shCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjaW5jbHVkZSAiRnJlZUltYWdlLmgiCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCisgIFhpYW9saW4gV3UgY29sb3IgcXVhbnRpemF0aW9uIGFsZ29yaXRobQorKi8KK2NsYXNzIFd1UXVhbnRpemVyCit7CitwdWJsaWM6CisKK3R5cGVkZWYgc3RydWN0IHRhZ0JveCB7CisgICAgaW50IHIwOwkJCSAvLyBtaW4gdmFsdWUsIGV4Y2x1c2l2ZQorICAgIGludCByMTsJCQkgLy8gbWF4IHZhbHVlLCBpbmNsdXNpdmUKKyAgICBpbnQgZzA7ICAKKyAgICBpbnQgZzE7ICAKKyAgICBpbnQgYjA7ICAKKyAgICBpbnQgYjE7CisgICAgaW50IHZvbDsKK30gQm94OworCitwcm90ZWN0ZWQ6CisgICAgZmxvYXQgKmdtMjsKKwlMT05HICp3dCwgKm1yLCAqbWcsICptYjsKKwlXT1JEICpRYWRkOworCisJLy8gRElCIGRhdGEKKwl1bnNpZ25lZCB3aWR0aCwgaGVpZ2h0OworCXVuc2lnbmVkIHBpdGNoOworCUZJQklUTUFQICptX2RpYjsKKworcHJvdGVjdGVkOgorICAgIHZvaWQgSGlzdDNEKExPTkcgKnZ3dCwgTE9ORyAqdm1yLCBMT05HICp2bWcsIExPTkcgKnZtYiwgZmxvYXQgKm0yLCBpbnQgUmVzZXJ2ZVNpemUsIFJHQlFVQUQgKlJlc2VydmVQYWxldHRlKTsKKwl2b2lkIE0zRChMT05HICp2d3QsIExPTkcgKnZtciwgTE9ORyAqdm1nLCBMT05HICp2bWIsIGZsb2F0ICptMik7CisJTE9ORyBWb2woQm94ICpjdWJlLCBMT05HICptbXQpOworCUxPTkcgQm90dG9tKEJveCAqY3ViZSwgQllURSBkaXIsIExPTkcgKm1tdCk7CisJTE9ORyBUb3AoQm94ICpjdWJlLCBCWVRFIGRpciwgaW50IHBvcywgTE9ORyAqbW10KTsKKwlmbG9hdCBWYXIoQm94ICpjdWJlKTsKKwlmbG9hdCBNYXhpbWl6ZShCb3ggKmN1YmUsIEJZVEUgZGlyLCBpbnQgZmlyc3QsIGludCBsYXN0ICwgaW50ICpjdXQsCisJCQkJICAgTE9ORyB3aG9sZV9yLCBMT05HIHdob2xlX2csIExPTkcgd2hvbGVfYiwgTE9ORyB3aG9sZV93KTsKKwlib29sIEN1dChCb3ggKnNldDEsIEJveCAqc2V0Mik7CisJdm9pZCBNYXJrKEJveCAqY3ViZSwgaW50IGxhYmVsLCBCWVRFICp0YWcpOworCitwdWJsaWM6CisJLy8gQ29uc3RydWN0b3IgLSBJbnB1dCBwYXJhbWV0ZXI6IERJQiAyNC1iaXQgdG8gYmUgcXVhbnRpemVkCisgICAgV3VRdWFudGl6ZXIoRklCSVRNQVAgKmRpYik7CisJLy8gRGVzdHJ1Y3RvcgorCX5XdVF1YW50aXplcigpOworCS8vIFF1YW50aXplciAtIFJldHVybiB2YWx1ZTogcXVhbnRpemVkIDgtYml0IChjb2xvciBwYWxldHRlKSBESUIKKwlGSUJJVE1BUCogUXVhbnRpemUoaW50IFBhbGV0dGVTaXplLCBpbnQgUmVzZXJ2ZVNpemUsIFJHQlFVQUQgKlJlc2VydmVQYWxldHRlKTsKK307CisKKworLyoqCisgIE5FVVFVQU5UIE5ldXJhbC1OZXQgcXVhbnRpemF0aW9uIGFsZ29yaXRobSBieSBBbnRob255IERla2tlcgorKi8KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29uc3RhbnQgZGVmaW5pdGlvbnMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoqIG51bWJlciBvZiBjb2xvdXJzIHVzZWQ6IAorCWZvciAyNTYgY29sb3VycywgZml4ZWQgYXJyYXlzIG5lZWQgOGtiLCBwbHVzIHNwYWNlIGZvciB0aGUgaW1hZ2UKKyovCisvL3N0YXRpYyBjb25zdCBpbnQgbmV0c2l6ZSA9IDI1NjsKKworLyoqQG5hbWUgbmV0d29yayBkZWZpbml0aW9ucyAqLworLy9AeworLy9zdGF0aWMgY29uc3QgaW50IG1heG5ldHBvcyA9IChuZXRzaXplIC0gMSk7CisvLy8gYmlhcyBmb3IgY29sb3VyIHZhbHVlcworc3RhdGljIGNvbnN0IGludCBuZXRiaWFzc2hpZnQgPSA0OworLy8vIG5vLiBvZiBsZWFybmluZyBjeWNsZXMKK3N0YXRpYyBjb25zdCBpbnQgbmN5Y2xlcyA9IDEwMDsKKy8vQH0KKworLyoqQG5hbWUgZGVmcyBmb3IgZnJlcSBhbmQgYmlhcyAqLworLy9AeworLy8vIGJpYXMgZm9yIGZyYWN0aW9ucworc3RhdGljIGNvbnN0IGludCBpbnRiaWFzc2hpZnQgPSAxNjsKK3N0YXRpYyBjb25zdCBpbnQgaW50YmlhcyA9ICgoKGludCkxKSA8PCBpbnRiaWFzc2hpZnQpOworLy8vIGdhbW1hID0gMTAyNAorc3RhdGljIGNvbnN0IGludCBnYW1tYXNoaWZ0ID0gMTA7CisvLyBzdGF0aWMgY29uc3QgaW50IGdhbW1hID0gKCgoaW50KTEpIDw8IGdhbW1hc2hpZnQpOworLy8vIGJldGEgPSAxIC8gMTAyNAorc3RhdGljIGNvbnN0IGludCBiZXRhc2hpZnQgPSAxMDsKK3N0YXRpYyBjb25zdCBpbnQgYmV0YSA9IChpbnRiaWFzID4+IGJldGFzaGlmdCk7CitzdGF0aWMgY29uc3QgaW50IGJldGFnYW1tYSA9IChpbnRiaWFzIDw8IChnYW1tYXNoaWZ0LWJldGFzaGlmdCkpOworLy9AfQorCisvKipAbmFtZSBkZWZzIGZvciBkZWNyZWFzaW5nIHJhZGl1cyBmYWN0b3IgKi8KKy8vQHsKKy8vLyBmb3IgMjU2IGNvbHMsIHJhZGl1cyBzdGFydHMKKy8vc3RhdGljIGNvbnN0IGludCBpbml0cmFkID0gKG5ldHNpemUgPj4gMyk7CisvLy8gYXQgMzIuMCBiaWFzZWQgYnkgNiBiaXRzCitzdGF0aWMgY29uc3QgaW50IHJhZGl1c2JpYXNzaGlmdCA9IDY7CitzdGF0aWMgY29uc3QgaW50IHJhZGl1c2JpYXMgPSAoKChpbnQpMSkgPDwgcmFkaXVzYmlhc3NoaWZ0KTsKKy8vLyBhbmQgZGVjcmVhc2VzIGJ5IGEgCisvL3N0YXRpYyBjb25zdCBpbnQgaW5pdHJhZGl1cwk9IChpbml0cmFkICogcmFkaXVzYmlhcyk7CisvLyBmYWN0b3Igb2YgMS8zMCBlYWNoIGN5Y2xlCitzdGF0aWMgY29uc3QgaW50IHJhZGl1c2RlYyA9IDMwOworLy9AfQorCisvKipAbmFtZSBkZWZzIGZvciBkZWNyZWFzaW5nIGFscGhhIGZhY3RvciAqLworLy9AeworLy8vIGFscGhhIHN0YXJ0cyBhdCAxLjAKK3N0YXRpYyBjb25zdCBpbnQgYWxwaGFiaWFzc2hpZnQgPSAxMDsKK3N0YXRpYyBjb25zdCBpbnQgaW5pdGFscGhhID0gKCgoaW50KTEpIDw8IGFscGhhYmlhc3NoaWZ0KTsKKy8vQH0KKworLyoqQG5hbWUgcmFkYmlhcyBhbmQgYWxwaGFyYWRiaWFzIHVzZWQgZm9yIHJhZHBvd2VyIGNhbGN1bGF0aW9uICovCisvL0B7CitzdGF0aWMgY29uc3QgaW50IHJhZGJpYXNzaGlmdCA9IDg7CitzdGF0aWMgY29uc3QgaW50IHJhZGJpYXMgPSAoKChpbnQpMSkgPDwgcmFkYmlhc3NoaWZ0KTsKK3N0YXRpYyBjb25zdCBpbnQgYWxwaGFyYWRic2hpZnQgPSAoYWxwaGFiaWFzc2hpZnQrcmFkYmlhc3NoaWZ0KTsKK3N0YXRpYyBjb25zdCBpbnQgYWxwaGFyYWRiaWFzID0gKCgoaW50KTEpIDw8IGFscGhhcmFkYnNoaWZ0KTsJCisvL0B9CisKK2NsYXNzIE5OUXVhbnRpemVyCit7Citwcm90ZWN0ZWQ6CisJLyoqQG5hbWUgaW1hZ2UgcGFyYW1ldGVycyAqLworCS8vQHsKKwkvLy8gcG9pbnRlciB0byBpbnB1dCBkaWIKKwlGSUJJVE1BUCAqZGliX3B0cjsKKwkvLy8gaW1hZ2Ugd2lkdGgKKwlpbnQgaW1nX3dpZHRoOworCS8vLyBpbWFnZSBoZWlnaHQKKwlpbnQgaW1nX2hlaWdodDsKKwkvLy8gaW1hZ2UgbGluZSBsZW5ndGgKKwlpbnQgaW1nX2xpbmU7CisJLy9AfQorCisJLyoqQG5hbWUgbmV0d29yayBwYXJhbWV0ZXJzICovCisJLy9AeworCisJaW50IG5ldHNpemUsIG1heG5ldHBvcywgaW5pdHJhZCwgaW5pdHJhZGl1czsKKworCS8vLyBCR1JjCisJdHlwZWRlZiBpbnQgcGl4ZWxbNF07CisJLy8vIHRoZSBuZXR3b3JrIGl0c2VsZgorCXBpeGVsICpuZXR3b3JrOworCisJLy8vIGZvciBuZXR3b3JrIGxvb2t1cCAtIHJlYWxseSAyNTYKKwlpbnQgbmV0aW5kZXhbMjU2XTsKKworCS8vLyBiaWFzIGFycmF5IGZvciBsZWFybmluZworCWludCAqYmlhczsKKwkvLy8gZnJlcSBhcnJheSBmb3IgbGVhcm5pbmcKKwlpbnQgKmZyZXE7CisJLy8vIHJhZHBvd2VyIGZvciBwcmVjb21wdXRhdGlvbgorCWludCAqcmFkcG93ZXI7CisJLy9AfQorCitwcm90ZWN0ZWQ6CisJLy8vIEluaXRpYWxpc2UgbmV0d29yayBpbiByYW5nZSAoMCwwLDApIHRvICgyNTUsMjU1LDI1NSkgYW5kIHNldCBwYXJhbWV0ZXJzCisJdm9pZCBpbml0bmV0KCk7CQorCisJLy8vIFVuYmlhcyBuZXR3b3JrIHRvIGdpdmUgYnl0ZSB2YWx1ZXMgMC4uMjU1IGFuZCByZWNvcmQgcG9zaXRpb24gaSB0byBwcmVwYXJlIGZvciBzb3J0CisJdm9pZCB1bmJpYXNuZXQoKTsKKworCS8vLyBJbnNlcnRpb24gc29ydCBvZiBuZXR3b3JrIGFuZCBidWlsZGluZyBvZiBuZXRpbmRleFswLi4yNTVdICh0byBkbyBhZnRlciB1bmJpYXMpCisJdm9pZCBpbnhidWlsZCgpOworCisJLy8vIFNlYXJjaCBmb3IgQkdSIHZhbHVlcyAwLi4yNTUgKGFmdGVyIG5ldCBpcyB1bmJpYXNlZCkgYW5kIHJldHVybiBjb2xvdXIgaW5kZXgKKwlpbnQgaW54c2VhcmNoKGludCBiLCBpbnQgZywgaW50IHIpOworCisJLy8vIFNlYXJjaCBmb3IgYmlhc2VkIEJHUiB2YWx1ZXMKKwlpbnQgY29udGVzdChpbnQgYiwgaW50IGcsIGludCByKTsKKwkKKwkvLy8gTW92ZSBuZXVyb24gaSB0b3dhcmRzIGJpYXNlZCAoYixnLHIpIGJ5IGZhY3RvciBhbHBoYQorCXZvaWQgYWx0ZXJzaW5nbGUoaW50IGFscGhhLCBpbnQgaSwgaW50IGIsIGludCBnLCBpbnQgcik7CisKKwkvLy8gTW92ZSBhZGphY2VudCBuZXVyb25zIGJ5IHByZWNvbXB1dGVkIGFscGhhKigxLSgoaS1qKV4yL1tyXV4yKSkgaW4gcmFkcG93ZXJbfGktanxdCisJdm9pZCBhbHRlcm5laWdoKGludCByYWQsIGludCBpLCBpbnQgYiwgaW50IGcsIGludCByKTsKKworCS8qKiBNYWluIExlYXJuaW5nIExvb3AKKwlAcGFyYW0gc2FtcGxpbmdfZmFjdG9yIHNhbXBsaW5nIGZhY3RvciBpbiBbMS4uMzBdCisJKi8KKwl2b2lkIGxlYXJuKGludCBzYW1wbGluZ19mYWN0b3IpOworCisJLy8vIEdldCBhIHBpeGVsIHNhbXBsZSBhdCBwb3NpdGlvbiBwb3MuIEhhbmRsZSA0LWJ5dGUgYm91bmRhcnkgYWxpZ25tZW50LgorCXZvaWQgZ2V0U2FtcGxlKGxvbmcgcG9zLCBpbnQgKmIsIGludCAqZywgaW50ICpyKTsKKworCitwdWJsaWM6CisJLy8vIENvbnN0cnVjdG9yCisJTk5RdWFudGl6ZXIoaW50IFBhbGV0dGVTaXplKTsKKworCS8vLyBEZXN0cnVjdG9yCisJfk5OUXVhbnRpemVyKCk7CisKKwkvKiogUXVhbnRpemVyCisJQHBhcmFtIGRpYiBpbnB1dCAyNC1iaXQgZGliIHRvIGJlIHF1YW50aXplZAorCUBwYXJhbSBzYW1wbGluZyBhIHNhbXBsaW5nIGZhY3RvciBpbiByYW5nZSAxLi4zMC4gCisJMSA9PiBzbG93ZXIgKGJ1dCBiZXR0ZXIpLCAzMCA9PiBmYXN0ZXIuIERlZmF1bHQgdmFsdWUgaXMgMQorCUByZXR1cm4gcmV0dXJucyB0aGUgcXVhbnRpemVkIDgtYml0IChjb2xvciBwYWxldHRlKSBESUIKKwkqLworCUZJQklUTUFQKiBRdWFudGl6ZShGSUJJVE1BUCAqZGliLCBpbnQgUmVzZXJ2ZVNpemUsIFJHQlFVQUQgKlJlc2VydmVQYWxldHRlLCBpbnQgc2FtcGxpbmcgPSAxKTsKKworfTsKKworLyoqCisgKiBMRlBRVUFOVCAtIExvc3NsZXNzIEZhc3QgUHNldWRvLVF1YW50aXphdGlvbiBBbGdvcml0aG0KKyAqCisgKiBUaGUgTG9zc2xlc3MgRmFzdCBQc2V1ZG8tUXVhbnRpemF0aW9uIGFsZ29yaXRobSBpcyBubyByZWFsIHF1YW50aXphdGlvbgorICogYWxnb3JpdGhtLCBzaW5jZSBpdCBtYWtlcyBubyBhdHRlbXB0IHRvIGNyZWF0ZSBhIHBhbGV0dGUsIHRoYXQgaXMgc3VpdGFibGUKKyAqIGZvciBhbGwgY29sb3JzIG9mIHRoZSAyNC1iaXQgc291cmNlIGltYWdlLiBIb3dldmVyLCBpdCBwcm92aWRlcyB2ZXJ5IGZhc3QKKyAqIGNvbnZlcnNpb25zIGZyb20gMjQtYml0IHRvIDgtYml0IGltYWdlcywgaWYgdGhlIG51bWJlciBvZiBkaXN0aW5jdCBjb2xvcnMKKyAqIGluIHRoZSBzb3VyY2UgaW1hZ2UgaXMgbm90IGdyZWF0ZXIgdGhhbiB0aGUgZGVzaXJlZCBwYWxldHRlIHNpemUuIElmIHRoZQorICogbnVtYmVyIG9mIGNvbG9ycyBpbiB0aGUgc291cmNlIGltYWdlIGlzIGV4Y2VlZGVkLCB0aGUgUXVhbnRpemUgbWV0aG9kIG9mCisgKiB0aGlzIGltcGxlbWVudGF0aW9uIHN0b3BzIHRoZSBwcm9jZXNzIGFuZCByZXR1cm5zIE5VTEwuCisgKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIGEgdmVyeSBmYXN0IGhhc2ggbWFwIGltcGxlbWVudGF0aW9uIHRvIGNvbGxlY3QKKyAqIHRoZSBzb3VyY2UgaW1hZ2UncyBjb2xvcnMuIEl0IHR1cm5lZCBvdXQgdGhhdCBhIGN1c3RvbWl6ZWQgaW1wbGVtZW50YXRpb24KKyAqIG9mIGEgaGFzaCB0YWJsZSB3aXRoIG9wZW4gYWRkcmVzc2luZyAodXNpbmcgbGluZWFyIHByb2JpbmcpIHByb3ZpZGVzIHRoZQorICogYmVzdCBwZXJmb3JtYW5jZS4gVGhlIGhhc2ggdGFibGUgaGFzIDUxMiBlbnRyaWVzLCB3aGljaCBwcmV2ZW50cyB0aGUgbG9hZAorICogZmFjdG9yIHRvIGV4Y2VlZCAwLjUgYXMgd2UgaGF2ZSAyNTYgZW50cmllcyBhdCBtb3N0LiBFYWNoIGVudHJ5IGNvbnN1bWVzCisgKiA2NCBiaXRzLCBzbyB0aGUgd2hvbGUgaGFzaCB0YWJsZSB0YWtlcyA0S0Igb2YgbWVtb3J5LgorICoKKyAqIEZvciBsYXJnZSBpbWFnZXMsIHRoZSBMRlBRdWFudGl6ZXIgaXMgdHlwaWNhbGx5IHVwIHRvIHRocmVlIHRpbWVzIGZhc3RlcgorICogdGhhbiB0aGUgV3VRdWFudGl6ZXIuCisgKi8KK2NsYXNzIExGUFF1YW50aXplciB7CitwdWJsaWM6CisJLyoqIENvbnN0cnVjdG9yICovCisJTEZQUXVhbnRpemVyKHVuc2lnbmVkIFBhbGV0dGVTaXplKTsKKworCS8qKiBEZXN0cnVjdG9yICovCisJfkxGUFF1YW50aXplcigpOworCisJLyoqCisJICogUXVhbnRpemVyCisJICogQHBhcmFtIGRpYiBpbnB1dCAyNC1iaXQgb3IgMzItYml0IGJpdG1hcCB0byBiZSBxdWFudGl6ZWQKKwkgKiBAcmV0dXJuIHJldHVybnMgdGhlIHBzZXVkby1xdWFudGl6ZWQgOC1iaXQgYml0bWFwCisJICovCisJRklCSVRNQVAqIFF1YW50aXplKEZJQklUTUFQICpkaWIsIGludCBSZXNlcnZlU2l6ZSwgUkdCUVVBRCAqUmVzZXJ2ZVBhbGV0dGUpOworCitwcm90ZWN0ZWQ6CisJLyoqIFRoZSBtYXhpbXVtIHNpemUgb2YgYSBwYWxldHRlLiAqLworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBNQVhfU0laRSA9IDI1NjsKKworCS8qKgorCSAqIFRoZSBzaXplIG9mIHRoZSBoYXNoIHRhYmxlLiBNdXN0IGJlIGEgcG93ZXIgb2YgMi4gQnkgc2l6aW5nIGl0CisJICogTUFYX1NJWkUgKiAyLCB3ZSBlbnN1cmUgdGhlIGxvYWQgZmFjdG9yIG5vdCB0byBleGNlZWQgMC41IGF0IGFueQorCSAqIHRpbWUsIHNpbmNlIHdlIHdpbGwgaGF2ZSBNQVhfU0laRSBlbnRyaWVzIGF0IG1vc3QuCisJICovCisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIE1BUF9TSVpFID0gTUFYX1NJWkUgKiAyOworCisJLyoqCisJICogV2l0aCBvcGVuIGFkZHJlc3Npbmcgd2UgbmVlZCBhIHNwZWNpYWwgdmFsdWUgZm9yIGVtcHR5IGJ1Y2tldHMuCisJICogQm90aCBlbnRyeS5jb2xvciBhbmQgZW50cnkuaW5kZXggYXJlIDB4RkZGRkZGRkYgZm9yIGFuIGVtcHR5CisJICogZW50cnkuCisJICovCisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIEVNUFRZX0JVQ0tFVCA9IDB4RkZGRkZGRkY7CisKKwkvKioKKwkgKiBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGEgc2luZ2xlIGVudHJ5IGluIHRoZSBoYXNoIHRhYmxlLiBXZSB1c2UKKwkgKiBjb2xvciBhcyB0aGUgZW50cnkncyBrZXkuCisJICovCisJdHlwZWRlZiBzdHJ1Y3QgTWFwRW50cnkgeworCQl1bnNpZ25lZCBjb2xvcjsKKwkJdW5zaWduZWQgaW5kZXg7CisJfSBNYXBFbnRyeTsKKworCS8qKiBUaGUgaGFzaCB0YWJsZS4gKi8KKwlNYXBFbnRyeSAqbV9tYXA7CisKKwkvKioKKwkgKiBUaGUgY3VycmVudCBzaXplIG9mIHRoZSBuZXdseSBjcmVhdGVkIHBhbGV0dGUuIFNpbmNlIHRoZSBwcm92aWRlZAorCSAqIHJlc2VydmUgcGFsZXR0ZSBjb3VsZCBjb250YWluIGR1cGxpY2F0ZXMsIHRoaXMgaXMgbm90IG5lY2Vzc2FyaWx5CisJICogdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBoYXNoIHRhYmxlLiBJbml0aWFsaXplZCB0byB6ZXJvLgorCSAqLworCXVuc2lnbmVkIG1fc2l6ZTsKKworCS8qKgorCSAqIFRoZSBkZXNpcmVkIG1heGltdW0gbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIG5ld2x5IGNyZWF0ZWQgcGFsZXR0ZS4KKwkgKiBJZiBtX3NpemUgZXhjZWVkcyB0aGlzIHZhbHVlLCB0aGUgcGFsZXR0ZSBpcyBmdWxsIGFuZCB0aGUKKwkgKiBxdWFudGl6YXRpb24gcHJvY2VzcyBpcyBzdG9wcGVkLiBJbml0aWFsaXplZCB0byB0aGUgZGVzaXJlZAorCSAqIHBhbGV0dGUgc2l6ZS4KKwkgKi8KKwl1bnNpZ25lZCBtX2xpbWl0OworCisJLyoqCisJICogIFRoZSBwYWxldHRlIGluZGV4IHVzZWQgZm9yIHRoZSBuZXh0IGNvbG9yIGFkZGVkLiBJbml0aWFsaXplZCB0bworCSAqICB6ZXJvICh0aGUgcmVzZXJ2ZSBwYWxldHRlIGlzIHB1dCB0byB0aGUgZW5kIG9mIHRoZSBwYWxldHRlKS4KKwkgKi8KKwl1bnNpZ25lZCBtX2luZGV4OworCisJLyoqCisJICogRW5zdXJlcyB0aGF0IGhhc2ggY29kZXMgdGhhdCBkaWZmZXIgb25seSBieSBjb25zdGFudCBtdWx0aXBsZXMKKwkgKiBhdCBlYWNoIGJpdCBwb3NpdGlvbiBoYXZlIGEgYm91bmRlZCBudW1iZXIgb2YgY29sbGlzaW9ucy4KKwkgKiBAcGFyYW0gaCB0aGUgaW5pdGlhbCAoYWthIHJhdykgaGFzaCBjb2RlCisJICogQHJldHVybiB0aGUgbW9kaWZpZWQgaGFzaCBjb2RlCisJICovCisJc3RhdGljIGlubGluZSB1bnNpZ25lZCBoYXNoKHVuc2lnbmVkIGgpIHsKKwkJaCBePSAoaCA+PiAyMCkgXiAoaCA+PiAxMik7CisJCXJldHVybiBoIF4gKGggPj4gNykgXiAoaCA+PiA0KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBwYWxldHRlIGluZGV4IG9mIHRoZSBzcGVjaWZpZWQgY29sb3IuIFRyaWVzIHRvIHB1dCB0aGUKKwkgKiBjb2xvciBpbnRvIHRoZSBtYXAsIGlmIGl0J3Mgbm90IGFscmVhZHkgcHJlc2VudCBpbiB0aGUgbWFwLiBJbiB0aGF0CisJICogY2FzZSwgYSBuZXcgaW5kZXggaXMgdXNlZCBmb3IgdGhlIGNvbG9yLiBSZXR1cm5zIC0xLCBpZiBhZGRpbmcgdGhlCisJICogY29sb3Igd291bGQgZXhjZWVkIHRoZSBkZXNpcmVkIG1heGltdW0gbnVtYmVyIG9mIGNvbG9ycyBpbiB0aGUKKwkgKiBwYWxldHRlLgorCSAqIEBwYXJhbSBjb2xvciB0aGUgY29sb3IgdG8gZ2V0IHRoZSBpbmRleCBmcm9tCisJICogQHJldHVybiB0aGUgcGFsZXR0ZSBpbmRleCBvZiB0aGUgc3BlY2lmaWVkIGNvbG9yIG9yIC0xLCBpZiB0aGVyZQorCSAqIGlzIG5vIHNwYWNlIGxlZnQgaW4gdGhlIHBhbGV0dGUKKwkgKi8KKwlpbnQgR2V0SW5kZXhGb3JDb2xvcih1bnNpZ25lZCBjb2xvcik7CisKKwkvKioKKwkgKiBBZGRzIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGVudHJpZXMgb2YgdGhlIHNwZWNpZmllZCByZXNlcnZlCisJICogcGFsZXR0ZSB0byB0aGUgbmV3bHkgY3JlYXRlZCBwYWxldHRlLgorCSAqIEBwYXJhbSAqcGFsZXR0ZSBhIHBvaW50ZXIgdG8gdGhlIHJlc2VydmUgcGFsZXR0ZSB0byBjb3B5IGZyb20KKwkgKiBAcGFyYW0gc2l6ZSB0aGUgbnVtYmVyIG9mIGVudHJpZXMgdG8gY29weQorCSAqLworCXZvaWQgQWRkUmVzZXJ2ZVBhbGV0dGUoY29uc3Qgdm9pZCAqcGFsZXR0ZSwgdW5zaWduZWQgc2l6ZSk7CisKKwkvKioKKwkgKiBDb3BpZXMgdGhlIG5ld2x5IGNyZWF0ZWQgcGFsZXR0ZSBpbnRvIHRoZSBzcGVjaWZpZWQgZGVzdGluYXRpb24KKwkgKiBwYWxldHR0ZS4gQWx0aG91Z2ggdW51c2VkIHBhbGV0dGUgZW50cmllcyBhcmUgbm90IG92ZXJ3cml0dGVuIGluCisJICogdGhlIGRlc3RpbmF0aW9uIHBhbGV0dGUsIGl0IGlzIGFzc3VtZWQgdG8gaGF2ZSBzcGFjZSBmb3IgYXQKKwkgKiBsZWFzdCAyNTYgZW50cmllcy4KKwkgKiBAcGFyYW0gcGFsZXR0ZSBhIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIHBhbGV0dGUKKwkgKi8KKwl2b2lkIFdyaXRlUGFsZXR0ZSh2b2lkICpwYWxldHRlKTsKKworfTsKZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9Ub25lTWFwcGluZy5oIGIvZmlsZXMvU291cmNlL1RvbmVNYXBwaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUxOTkzMwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1NvdXJjZS9Ub25lTWFwcGluZy5oCkBAIC0wLDAgKzEsNDQgQEAKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEhpZ2ggRHluYW1pYyBSYW5nZSBiaXRtYXAgY29udmVyc2lvbiByb3V0aW5lcworLy8KKy8vIERlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gYnkKKy8vIC0gSGVydukgRHJvbG9uIChkcm9sb25AaW5mb25pZS5mcikKKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBGcmVlSW1hZ2UgMworLy8KKy8vIENPVkVSRUQgQ09ERSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWQorLy8gT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMKKy8vIFRIQVQgVEhFIENPVkVSRUQgQ09ERSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLy8gT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQKKy8vIENPREUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkgQ09WRVJFRCBDT0RFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QKKy8vIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZCisvLyBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMCisvLyBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GIEFOWSBDT1ZFUkVEIENPREUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSCisvLyBUSElTIERJU0NMQUlNRVIuCisvLworLy8gVXNlIGF0IHlvdXIgb3duIHJpc2shCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpZm5kZWYgVE9ORV9NQVBQSU5HX0gKKyNkZWZpbmUgVE9ORV9NQVBQSU5HX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitCT09MIENvbnZlcnRJblBsYWNlUkdCRlRvWXh5KEZJQklUTUFQICpkaWIpOworQk9PTCBDb252ZXJ0SW5QbGFjZVl4eVRvUkdCRihGSUJJVE1BUCAqZGliKTsKK0ZJQklUTUFQKiBDb252ZXJ0UkdCRlRvWShGSUJJVE1BUCAqc3JjKTsKKworQk9PTCBMdW1pbmFuY2VGcm9tWXh5KEZJQklUTUFQICpkaWIsIGZsb2F0ICptYXhMdW0sIGZsb2F0ICptaW5MdW0sIGZsb2F0ICp3b3JsZEx1bSk7CitCT09MIEx1bWluYW5jZUZyb21ZKEZJQklUTUFQICpkaWIsIGZsb2F0ICptYXhMdW0sIGZsb2F0ICptaW5MdW0sIGZsb2F0ICpMYXYsIGZsb2F0ICpMbGF2KTsKKwordm9pZCBOb3JtYWxpemVZKEZJQklUTUFQICpZLCBmbG9hdCBtaW5QcmN0LCBmbG9hdCBtYXhQcmN0KTsKKworRklCSVRNQVAqIENsYW1wQ29udmVydFJHQkZUbzI0KEZJQklUTUFQICpzcmMpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLy8gVE9ORV9NQVBQSU5HX0gKZGlmZiAtLWdpdCBhL2ZpbGVzL1NvdXJjZS9VdGlsaXRpZXMuaCBiL2ZpbGVzL1NvdXJjZS9VdGlsaXRpZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yzk3MmI1Ci0tLSAvZGV2L251bGwKKysrIGIvZmlsZXMvU291cmNlL1V0aWxpdGllcy5oCkBAIC0wLDAgKzEsNTE4IEBACisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBVdGlsaXR5IGZ1bmN0aW9ucworLy8KKy8vIERlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gYnkKKy8vIC0gRmxvcmlzIHZhbiBkZW4gQmVyZyAoZmx2ZGJlcmdAd3hzLm5sKQorLy8gLSBIZXJ2w6kgRHJvbG9uIDxkcm9sb25AaW5mb25pZS5mcj4KKy8vIC0gUnlhbiBSdWJsZXkgKHJ5YW5AbG9zdHJlYWxpdHkub3JnKQorLy8gLSBNaWhhaWwgTmF5ZGVub3YgKG1uYXlkZW5vdkB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQpCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRnJlZUltYWdlIDMKKy8vCisvLyBDT1ZFUkVEIENPREUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkKKy8vIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTCisvLyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy8vIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVECisvLyBDT0RFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UCisvLyBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWQorLy8gU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTAorLy8gUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUgorLy8gVEhJUyBESVNDTEFJTUVSLgorLy8KKy8vIFVzZSBhdCB5b3VyIG93biByaXNrIQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaWZuZGVmIFVUSUxJVElFU19ICisjZGVmaW5lIFVUSUxJVElFU19ICisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICAgU3RhbmRhcmQgaW5jbHVkZXMgdXNlZCBieSB0aGUgbGlicmFyeQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2lmICFkZWZpbmVkKF9fbmF0aXZlX2NsaWVudF9fKQorI2luY2x1ZGUgPG1lbW9yeS5oPgorI2VuZGlmICAvLyAhZGVmaW5lZChfX25hdGl2ZV9jbGllbnRfXykKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmbG9hdC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RhY2s+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPG1lbW9yeT4KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gICBCaXRtYXAgcGFsZXR0ZSBhbmQgcGl4ZWxzIGFsaWdubWVudAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjZGVmaW5lIEZJQklUTUFQX0FMSUdOTUVOVAkxNgkvLyBXZSB3aWxsIHVzZSBhIDE2IGJ5dGVzIGFsaWdubWVudCBib3VuZGFyeQorCisvLyBNZW1vcnkgYWxsb2NhdGlvbiBvbiBhIHNwZWNpZmllZCBhbGlnbm1lbnQgYm91bmRhcnkKKy8vIGRlZmluZWQgaW4gQml0bWFwQWNjZXNzLmNwcAorCit2b2lkKiBGcmVlSW1hZ2VfQWxpZ25lZF9NYWxsb2Moc2l6ZV90IGFtb3VudCwgc2l6ZV90IGFsaWdubWVudCk7Cit2b2lkIEZyZWVJbWFnZV9BbGlnbmVkX0ZyZWUodm9pZCogbWVtKTsKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioKK0FsbG9jYXRlIGEgRklCSVRNQVAgd2l0aCBwb3NzaWJseSBubyBwaXhlbCBkYXRhIAorKGkuZS4gb25seSBoZWFkZXIgZGF0YSBhbmQgc29tZSBvciBhbGwgbWV0YWRhdGEpCitAcGFyYW0gaGVhZGVyX29ubHkgSWYgVFJVRSwgYWxsb2NhdGUgYSAnaGVhZGVyIG9ubHknIEZJQklUTUFQLCBvdGhlcndpc2UgYWxsb2NhdGUgYSBmdWxsIEZJQklUTUFQCitAcGFyYW0gdHlwZSBJbWFnZSB0eXBlCitAcGFyYW0gd2lkdGggSW1hZ2Ugd2lkdGgKK0BwYXJhbSBoZWlnaHQgSW1hZ2UgaGVpZ2h0CitAcGFyYW0gYnBwIE51bWJlciBvZiBiaXRzIHBlciBwaXhlbAorQHBhcmFtIHJlZF9tYXNrIEltYWdlIHJlZCBtYXNrIAorQHBhcmFtIGdyZWVuX21hc2sgSW1hZ2UgZ3JlZW4gbWFzaworQHBhcmFtIGJsdWVfbWFzayBJbWFnZSBibHVlIG1hc2sKK0ByZXR1cm4gUmV0dXJucyB0aGUgYWxsb2NhdGVkIEZJQklUTUFQCitAc2VlIEZyZWVJbWFnZV9BbGxvY2F0ZVQKKyovCitETExfQVBJIEZJQklUTUFQICogRExMX0NBTExDT05WIEZyZWVJbWFnZV9BbGxvY2F0ZUhlYWRlclQoQk9PTCBoZWFkZXJfb25seSwgRlJFRV9JTUFHRV9UWVBFIHR5cGUsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCBGSV9ERUZBVUxUKDgpLCB1bnNpZ25lZCByZWRfbWFzayBGSV9ERUZBVUxUKDApLCB1bnNpZ25lZCBncmVlbl9tYXNrIEZJX0RFRkFVTFQoMCksIHVuc2lnbmVkIGJsdWVfbWFzayBGSV9ERUZBVUxUKDApKTsKKworLyoqCitBbGxvY2F0ZSBhIEZJQklUTUFQIG9mIHR5cGUgRklUX0JJVE1BUCwgd2l0aCBwb3NzaWJseSBubyBwaXhlbCBkYXRhIAorKGkuZS4gb25seSBoZWFkZXIgZGF0YSBhbmQgc29tZSBvciBhbGwgbWV0YWRhdGEpCitAcGFyYW0gaGVhZGVyX29ubHkgSWYgVFJVRSwgYWxsb2NhdGUgYSAnaGVhZGVyIG9ubHknIEZJQklUTUFQLCBvdGhlcndpc2UgYWxsb2NhdGUgYSBmdWxsIEZJQklUTUFQCitAcGFyYW0gd2lkdGggSW1hZ2Ugd2lkdGgKK0BwYXJhbSBoZWlnaHQgSW1hZ2UgaGVpZ2h0CitAcGFyYW0gYnBwIE51bWJlciBvZiBiaXRzIHBlciBwaXhlbAorQHBhcmFtIHJlZF9tYXNrIEltYWdlIHJlZCBtYXNrIAorQHBhcmFtIGdyZWVuX21hc2sgSW1hZ2UgZ3JlZW4gbWFzaworQHBhcmFtIGJsdWVfbWFzayBJbWFnZSBibHVlIG1hc2sKK0ByZXR1cm4gUmV0dXJucyB0aGUgYWxsb2NhdGVkIEZJQklUTUFQCitAc2VlIEZyZWVJbWFnZV9BbGxvY2F0ZQorKi8KK0RMTF9BUEkgRklCSVRNQVAgKiBETExfQ0FMTENPTlYgRnJlZUltYWdlX0FsbG9jYXRlSGVhZGVyKEJPT0wgaGVhZGVyX29ubHksIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgdW5zaWduZWQgcmVkX21hc2sgRklfREVGQVVMVCgwKSwgdW5zaWduZWQgZ3JlZW5fbWFzayBGSV9ERUZBVUxUKDApLCB1bnNpZ25lZCBibHVlX21hc2sgRklfREVGQVVMVCgwKSk7CisKKy8qKgorQWxsb2NhdGUgYSBGSUJJVE1BUCB3aXRoIG5vIHBpeGVsIGRhdGEgYW5kIHdyYXAgYSB1c2VyIHByb3ZpZGVkIHBpeGVsIGJ1ZmZlcgorQHBhcmFtIGV4dF9iaXRzIFBvaW50ZXIgdG8gZXh0ZXJuYWwgdXNlcidzIHBpeGVsIGJ1ZmZlcgorQHBhcmFtIGV4dF9waXRjaCBQb2ludGVyIHRvIGV4dGVybmFsIHVzZXIncyBwaXhlbCBidWZmZXIgcGl0Y2gKK0BwYXJhbSB0eXBlIEltYWdlIHR5cGUKK0BwYXJhbSB3aWR0aCBJbWFnZSB3aWR0aAorQHBhcmFtIGhlaWdodCBJbWFnZSBoZWlnaHQKK0BwYXJhbSBicHAgTnVtYmVyIG9mIGJpdHMgcGVyIHBpeGVsCitAcGFyYW0gcmVkX21hc2sgSW1hZ2UgcmVkIG1hc2sgCitAcGFyYW0gZ3JlZW5fbWFzayBJbWFnZSBncmVlbiBtYXNrCitAcGFyYW0gYmx1ZV9tYXNrIEltYWdlIGJsdWUgbWFzaworQHJldHVybiBSZXR1cm5zIHRoZSBhbGxvY2F0ZWQgRklCSVRNQVAKK0BzZWUgRnJlZUltYWdlX0NvbnZlcnRGcm9tUmF3Qml0c0V4CisqLworRExMX0FQSSBGSUJJVE1BUCAqIERMTF9DQUxMQ09OViBGcmVlSW1hZ2VfQWxsb2NhdGVIZWFkZXJGb3JCaXRzKEJZVEUgKmV4dF9iaXRzLCB1bnNpZ25lZCBleHRfcGl0Y2gsIEZSRUVfSU1BR0VfVFlQRSB0eXBlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIHVuc2lnbmVkIHJlZF9tYXNrLCB1bnNpZ25lZCBncmVlbl9tYXNrLCB1bnNpZ25lZCBibHVlX21hc2spOworCisvKioKK0hlbHBlciBmb3IgMTYtYml0IEZJVF9CSVRNQVAKK0BzZWUgRnJlZUltYWdlX0dldFJHQk1hc2tzCisqLworRExMX0FQSSBCT09MIERMTF9DQUxMQ09OViBGcmVlSW1hZ2VfSGFzUkdCTWFza3MoRklCSVRNQVAgKmRpYik7CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmCisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gICBGaWxlIEkvTyBzdHJ1Y3RzCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIHRoZXNlIHN0cnVjdHMgYXJlIGZvciBmaWxlIEkvTyBhbmQgc2hvdWxkIG5vdCBiZSBjb25mdXNlZCB3aXRoIHNpbWlsYXIKKy8vIHN0cnVjdHMgaW4gRnJlZUltYWdlLmggd2hpY2ggYXJlIGZvciBpbi1tZW1vcnkgYml0bWFwIGhhbmRsaW5nCisKKyNpZmRlZiBfV0lOMzIKKyNwcmFnbWEgcGFjayhwdXNoLCAxKQorI2Vsc2UKKyNwcmFnbWEgcGFjaygxKQorI2VuZGlmIC8vIF9XSU4zMgorCit0eXBlZGVmIHN0cnVjdCB0YWdGSUxFX1JHQkEgeworICB1bnNpZ25lZCBjaGFyIHIsZyxiLGE7Cit9IEZJTEVfUkdCQTsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnRklMRV9CR1JBIHsKKyAgdW5zaWduZWQgY2hhciBiLGcscixhOworfSBGSUxFX0JHUkE7CisKK3R5cGVkZWYgc3RydWN0IHRhZ0ZJTEVfUkdCIHsKKyAgdW5zaWduZWQgY2hhciByLGcsYjsKK30gRklMRV9SR0I7CisKK3R5cGVkZWYgc3RydWN0IHRhZ0ZJTEVfQkdSIHsKKyAgdW5zaWduZWQgY2hhciBiLGcscjsKK30gRklMRV9CR1I7CisKKyNpZmRlZiBfV0lOMzIKKyNwcmFnbWEgcGFjayhwb3ApCisjZWxzZQorI3ByYWdtYSBwYWNrKCkKKyNlbmRpZiAvLyBfV0lOMzIKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gICBUZW1wbGF0ZSB1dGlsaXR5IGZ1bmN0aW9ucworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLy8gTWF4IGZ1bmN0aW9uCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gVCBNQVgoY29uc3QgVCAmYSwgY29uc3QgVCAmYikgeworCXJldHVybiAoYSA+IGIpID8gYTogYjsKK30KKworLy8vIE1pbiBmdW5jdGlvbgordGVtcGxhdGUgPGNsYXNzIFQ+IFQgTUlOKGNvbnN0IFQgJmEsIGNvbnN0IFQgJmIpIHsKKwlyZXR1cm4gKGEgPCBiKSA/IGE6IGI7Cit9CisKKy8vLyBJTlBMQUNFU1dBUCBhZG9wdGVkIGZyb20gY29kZWd1cnUuY29tIAordGVtcGxhdGUgPGNsYXNzIFQ+IHZvaWQgSU5QTEFDRVNXQVAoVCYgYSwgVCYgYikgeworCWEgXj0gYjsgYiBePSBhOyBhIF49IGI7Cit9CisKKy8vLyBDbGFtcCBmdW5jdGlvbgordGVtcGxhdGUgPGNsYXNzIFQ+IFQgQ0xBTVAoY29uc3QgVCAmdmFsdWUsIGNvbnN0IFQgJm1pbl92YWx1ZSwgY29uc3QgVCAmbWF4X3ZhbHVlKSB7CisJcmV0dXJuICgodmFsdWUgPCBtaW5fdmFsdWUpID8gbWluX3ZhbHVlIDogKHZhbHVlID4gbWF4X3ZhbHVlKSA/IG1heF92YWx1ZSA6IHZhbHVlKTsKK30KKworLyoqIFRoaXMgcHJvY2VkdXJlIGNvbXB1dGVzIG1pbmltdW0gbWluIGFuZCBtYXhpbXVtIG1heAorIG9mIG4gbnVtYmVycyB1c2luZyBvbmx5ICgzbi8yKSAtIDIgY29tcGFyaXNvbnMuCisgbWluID0gTFtpMV0gYW5kIG1heCA9IExbaTJdLgorIHJlZjogQWhvIEEuVi4sIEhvcGNyb2Z0IEouRS4sIFVsbG1hbiBKLkQuLCAKKyBUaGUgZGVzaWduIGFuZCBhbmFseXNpcyBvZiBjb21wdXRlciBhbGdvcml0aG1zLCAKKyBBZGRpc29uLVdlc2xleSwgUmVhZGluZywgMTk3NC4KKyovCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gdm9pZCAKK01BWE1JTihjb25zdCBUKiBMLCBsb25nIG4sIFQmIG1heCwgVCYgbWluKSB7CisJbG9uZyBpMSwgaTIsIGksIGo7CisJVCB4MSwgeDI7CisJbG9uZyBrMSwgazI7CisKKwlpMSA9IDA7IGkyID0gMDsgbWluID0gTFswXTsgbWF4ID0gTFswXTsgaiA9IDA7CisJaWYoKG4gJSAyKSAhPSAwKSAgaiA9IDE7CisJZm9yKGkgPSBqOyBpIDwgbjsgaSs9IDIpIHsKKwkJazEgPSBpOyBrMiA9IGkrMTsKKwkJeDEgPSBMW2sxXTsgeDIgPSBMW2syXTsKKwkJaWYoeDEgPiB4MikJeworCQkJazEgPSBrMjsgIGsyID0gaTsKKwkJCXgxID0geDI7ICB4MiA9IExbazJdOworCQl9CisJCWlmKHgxIDwgbWluKSB7CisJCQltaW4gPSB4MTsgIGkxID0gazE7CisJCX0KKwkJaWYoeDIgPiBtYXgpIHsKKwkJCW1heCA9IHgyOyAgaTIgPSBrMjsKKwkJfQorCX0KK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gICBVdGlsaXR5IGZ1bmN0aW9ucworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaWZuZGVmIF9XSU4zMgoraW5saW5lIGNoYXIqCitpMmEodW5zaWduZWQgaSwgY2hhciAqYSwgdW5zaWduZWQgcikgeworCWlmIChpL3IgPiAwKSBhID0gaTJhKGkvcixhLHIpOworCSphID0gIjAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiJbaSVyXTsKKwlyZXR1cm4gYSsxOworfQorCisvKiogCisgVHJhbnNmb3JtcyBpbnRlZ2VyIGkgaW50byBhbiBhc2NpaSBzdHJpbmcgYW5kIHN0b3JlcyB0aGUgcmVzdWx0IGluIGE7IAorIHN0cmluZyBpcyBlbmNvZGVkIGluIHRoZSBiYXNlIGluZGljYXRlZCBieSByLgorIEBwYXJhbSBpIE51bWJlciB0byBiZSBjb252ZXJ0ZWQKKyBAcGFyYW0gYSBTdHJpbmcgcmVzdWx0CisgQHBhcmFtIHIgQmFzZSBvZiB2YWx1ZTsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgMiAtIDM2CisgQHJldHVybiBSZXR1cm5zIGEKKyovCitpbmxpbmUgY2hhciAqCitfaXRvYShpbnQgaSwgY2hhciAqYSwgaW50IHIpIHsKKwlyID0gKChyIDwgMikgfHwgKHIgPiAzNikpID8gMTAgOiByOworCWlmKGkgPCAwKSB7CisJCSphID0gJy0nOworCQkqaTJhKC1pLCBhKzEsIHIpID0gMDsKKwl9CisJZWxzZSAqaTJhKGksIGEsIHIpID0gMDsKKwlyZXR1cm4gYTsKK30KKworI2VuZGlmIC8vICFfV0lOMzIKKworaW5saW5lIHVuc2lnbmVkIGNoYXIKK0hJTklCQkxFICh1bnNpZ25lZCBjaGFyIGJ5dGUpIHsKKwlyZXR1cm4gYnl0ZSAmIDB4RjA7Cit9CisKK2lubGluZSB1bnNpZ25lZCBjaGFyCitMT1dOSUJCTEUgKHVuc2lnbmVkIGNoYXIgYnl0ZSkgeworCXJldHVybiBieXRlICYgMHgwRjsKK30KKworaW5saW5lIGludAorQ2FsY3VsYXRlVXNlZEJpdHMoaW50IGJpdHMpIHsKKwlpbnQgYml0X2NvdW50ID0gMDsKKwl1bnNpZ25lZCBiaXQgPSAxOworCisJZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IDMyOyBpKyspIHsKKwkJaWYgKChiaXRzICYgYml0KSA9PSBiaXQpIHsKKwkJCWJpdF9jb3VudCsrOworCQl9CisKKwkJYml0IDw8PSAxOworCX0KKworCXJldHVybiBiaXRfY291bnQ7Cit9CisKK2lubGluZSB1bnNpZ25lZAorQ2FsY3VsYXRlTGluZSh1bnNpZ25lZCB3aWR0aCwgdW5zaWduZWQgYml0ZGVwdGgpIHsKKwlyZXR1cm4gKHVuc2lnbmVkKSggKCh1bnNpZ25lZCBsb25nIGxvbmcpd2lkdGggKiBiaXRkZXB0aCArIDcpIC8gOCApOworfQorCitpbmxpbmUgdW5zaWduZWQKK0NhbGN1bGF0ZVBpdGNoKHVuc2lnbmVkIGxpbmUpIHsKKwlyZXR1cm4gbGluZSArIDMgJiB+MzsKK30KKworaW5saW5lIHVuc2lnbmVkCitDYWxjdWxhdGVVc2VkUGFsZXR0ZUVudHJpZXModW5zaWduZWQgYml0X2NvdW50KSB7CisJaWYgKChiaXRfY291bnQgPj0gMSkgJiYgKGJpdF9jb3VudCA8PSA4KSkKKwkJcmV0dXJuIDEgPDwgYml0X2NvdW50OworCisJcmV0dXJuIDA7Cit9CisKK2lubGluZSB1bnNpZ25lZCBjaGFyICoKK0NhbGN1bGF0ZVNjYW5MaW5lKHVuc2lnbmVkIGNoYXIgKmJpdHMsIHVuc2lnbmVkIHBpdGNoLCBpbnQgc2NhbmxpbmUpIHsKKwlyZXR1cm4gYml0cyA/IChiaXRzICsgKChzaXplX3QpcGl0Y2ggKiBzY2FubGluZSkpIDogTlVMTDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKioKK0Zhc3QgZ2VuZXJpYyBhc3NpZ24gKGZhc3RlciB0aGFuIGZvciBsb29wKQorQHBhcmFtIGRzdCBEZXN0aW5hdGlvbiBwaXhlbAorQHBhcmFtIHNyYyBTb3VyY2UgcGl4ZWwKK0BwYXJhbSBieXRlc3BlcnBpeGVsICMgb2YgYnl0ZXMgcGVyIHBpeGVsCisqLworaW5saW5lIHZvaWQgCitBc3NpZ25QaXhlbChCWVRFKiBkc3QsIGNvbnN0IEJZVEUqIHNyYywgdW5zaWduZWQgYnl0ZXNwZXJwaXhlbCkgeworCXN3aXRjaCAoYnl0ZXNwZXJwaXhlbCkgeworCQljYXNlIDE6CS8vIEZJVF9CSVRNQVAgKDgtYml0KQorCQkJKmRzdCA9ICpzcmM7CisJCQlicmVhazsKKworCQljYXNlIDI6IC8vIEZJVF9VSU5UMTYgLyBGSVRfSU5UMTYgLyAxNi1iaXQKKwkJCSoocmVpbnRlcnByZXRfY2FzdDxXT1JEKj4oZHN0KSkgPSAqKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgV09SRCo+IChzcmMpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgMzogLy8gRklUX0JJVE1BUCAoMjQtYml0KQorCQkJKihyZWludGVycHJldF9jYXN0PFdPUkQqPihkc3QpKSA9ICoocmVpbnRlcnByZXRfY2FzdDxjb25zdCBXT1JEKj4gKHNyYykpOworCQkJZHN0WzJdID0gc3JjWzJdOworCQkJYnJlYWs7CisKKwkJY2FzZSA0OiAvLyBGSVRfQklUTUFQICgzMi1iaXQpIC8gRklUX1VJTlQzMiAvIEZJVF9JTlQzMiAvIEZJVF9GTE9BVAorCQkJKihyZWludGVycHJldF9jYXN0PERXT1JEKj4oZHN0KSkgPSAqKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRFdPUkQqPiAoc3JjKSk7CisJCQlicmVhazsKKworCQljYXNlIDY6IC8vIEZJVF9SR0IxNiAoMyB4IDE2LWJpdCkKKwkJCSoocmVpbnRlcnByZXRfY2FzdDxEV09SRCo+KGRzdCkpID0gKihyZWludGVycHJldF9jYXN0PGNvbnN0IERXT1JEKj4gKHNyYykpOworCQkJKihyZWludGVycHJldF9jYXN0PFdPUkQqPihkc3QgKyA0KSkgPSAqKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgV09SRCo+IChzcmMgKyA0KSk7CQorCQkJYnJlYWs7CisKKwkJLy8gdGhlIHJlc3QgY2FuIGJlIHNwZWVkZWQgdXAgd2l0aCBpbnQ2NAorCQkJCisJCWNhc2UgODogLy8gRklUX1JHQkExNiAoNCB4IDE2LWJpdCkKKwkJCSoocmVpbnRlcnByZXRfY2FzdDxEV09SRCo+KGRzdCkpID0gKihyZWludGVycHJldF9jYXN0PGNvbnN0IERXT1JEKj4gKHNyYykpOworCQkJKihyZWludGVycHJldF9jYXN0PERXT1JEKj4oZHN0ICsgNCkpID0gKihyZWludGVycHJldF9jYXN0PGNvbnN0IERXT1JEKj4gKHNyYyArIDQpKTsJCisJCQlicmVhazsKKwkJCisJCWNhc2UgMTI6IC8vIEZJVF9SR0JGICgzIHggMzItYml0IElFRUUgZmxvYXRpbmcgcG9pbnQpCisJCQkqKHJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQqPihkc3QpKSA9ICoocmVpbnRlcnByZXRfY2FzdDxjb25zdCBmbG9hdCo+IChzcmMpKTsKKwkJCSoocmVpbnRlcnByZXRfY2FzdDxmbG9hdCo+KGRzdCArIDQpKSA9ICoocmVpbnRlcnByZXRfY2FzdDxjb25zdCBmbG9hdCo+IChzcmMgKyA0KSk7CisJCQkqKHJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQqPihkc3QgKyA4KSkgPSAqKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXQqPiAoc3JjICsgOCkpOworCQkJYnJlYWs7CisJCQorCQljYXNlIDE2OiAvLyBGSVRfUkdCQUYgKDQgeCAzMi1iaXQgSUVFRSBmbG9hdGluZyBwb2ludCkKKwkJCSoocmVpbnRlcnByZXRfY2FzdDxmbG9hdCo+KGRzdCkpID0gKihyZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0Kj4gKHNyYykpOworCQkJKihyZWludGVycHJldF9jYXN0PGZsb2F0Kj4oZHN0ICsgNCkpID0gKihyZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0Kj4gKHNyYyArIDQpKTsKKwkJCSoocmVpbnRlcnByZXRfY2FzdDxmbG9hdCo+KGRzdCArIDgpKSA9ICoocmVpbnRlcnByZXRfY2FzdDxjb25zdCBmbG9hdCo+IChzcmMgKyA4KSk7CisJCQkqKHJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQqPihkc3QgKyAxMikpID0gKihyZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0Kj4gKHNyYyArIDEyKSk7CisJCQlicmVhazsKKwkJCQorCQlkZWZhdWx0OgorCQkJYXNzZXJ0KEZBTFNFKTsKKwl9Cit9CisKKy8qKgorU3dhcCByZWQgYW5kIGJsdWUgY2hhbm5lbHMgaW4gYSAyNC0gb3IgMzItYml0IGRpYi4gCitAcmV0dXJuIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsLCByZXR1cm5zIEZBTFNFIG90aGVyd2lzZQorQHNlZSBTZWUgZGVmaW5pdGlvbiBpbiBDb252ZXJzaW9uLmNwcAorKi8KK0JPT0wgU3dhcFJlZEJsdWUzMihGSUJJVE1BUCogZGliKTsKKworLyoqCitJbnBsYWNlIGNvbnZlcnQgQ01ZSyB0byBSR0JBLig4LSBhbmQgMTYtYml0KS4gCitBbHBoYSBpcyBmaWxsZWQgd2l0aCB0aGUgZmlyc3QgZXh0cmEgY2hhbm5lbCBpZiBhbnkgb3Igd2hpdGUgb3RoZXJ3aXNlLgorQHJldHVybiBSZXR1cm5zIFRSVUUgaWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyBGQUxTRSBvdGhlcndpc2UKK0BzZWUgU2VlIGRlZmluaXRpb24gaW4gQ29udmVyc2lvbi5jcHAKKyovCitCT09MIENvbnZlcnRDTVlLdG9SR0JBKEZJQklUTUFQKiBkaWIpOworCisvKioKK0lucGxhY2UgY29udmVydCBDSUVMYWIgdG8gUkdCQSAoOC0gYW5kIDE2LWJpdCkuCitAcmV0dXJuIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsLCByZXR1cm5zIEZBTFNFIG90aGVyd2lzZQorQHNlZSBTZWUgZGVmaW5pdGlvbiBpbiBDb252ZXJzaW9uLmNwcAorKi8KK0JPT0wgQ29udmVydExBQnRvUkdCKEZJQklUTUFQKiBkaWIpOworCisvKioKK1JHQkEgdG8gUkdCIGNvbnZlcnNpb24KK0BzZWUgU2VlIGRlZmluaXRpb24gaW4gQ29udmVyc2lvbi5jcHAKKyovCitGSUJJVE1BUCogUmVtb3ZlQWxwaGFDaGFubmVsKEZJQklUTUFQKiBkaWIpOworCisvKioKK1JvdGF0ZSBhIGRpYiBhY2NvcmRpbmcgdG8gRXhpZiBpbmZvCitAcGFyYW0gZGliIElucHV0IC8gT3V0cHV0IGRpYiB0byByb3RhdGUKK0BzZWUgRXhpZi5jcHAsIFBsdWdpbkpQRUcuY3BwCisqLwordm9pZCBSb3RhdGVFeGlmKEZJQklUTUFQICoqZGliKTsKKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgIEJpZyBFbmRpYW4gLyBMaXR0bGUgRW5kaWFuIHV0aWxpdHkgZnVuY3Rpb25zCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2lubGluZSBXT1JEIAorX19Td2FwVUludDE2KFdPUkQgYXJnKSB7IAorI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIF9NU0NfVkVSID49IDEzMTAgCisJcmV0dXJuIF9ieXRlc3dhcF91c2hvcnQoYXJnKTsgCisjZWxpZiBkZWZpbmVkKF9faTM4Nl9fKSAmJiBkZWZpbmVkKF9fR05VQ19fKSAKKwlfX2FzbV9fKCJ4Y2hnYiAlYjAsICVoMCIgOiAiK3EiIChhcmcpKTsgCisJcmV0dXJuIGFyZzsgCisjZWxpZiBkZWZpbmVkKF9fcHBjX18pICYmIGRlZmluZWQoX19HTlVDX18pIAorCVdPUkQgcmVzdWx0OyAKKwlfX2FzbV9fKCJsaGJyeCAlMCwwLCUxIiA6ICI9ciIgKHJlc3VsdCkgOiAiciIgKCZhcmcpLCAibSIgKGFyZykpOyAKKwlyZXR1cm4gcmVzdWx0OyAKKyNlbHNlIAorCS8vIHN3YXAgYnl0ZXMgCisJV09SRCByZXN1bHQ7CisJcmVzdWx0ID0gKChhcmcgPDwgOCkgJiAweEZGMDApIHwgKChhcmcgPj4gOCkgJiAweDAwRkYpOyAKKwlyZXR1cm4gcmVzdWx0OyAKKyNlbmRpZiAKK30gCisgCitpbmxpbmUgRFdPUkQgCitfX1N3YXBVSW50MzIoRFdPUkQgYXJnKSB7IAorI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIF9NU0NfVkVSID49IDEzMTAgCisJcmV0dXJuIF9ieXRlc3dhcF91bG9uZyhhcmcpOyAKKyNlbGlmIGRlZmluZWQoX19pMzg2X18pICYmIGRlZmluZWQoX19HTlVDX18pIAorCV9fYXNtX18oImJzd2FwICUwIiA6ICIrciIgKGFyZykpOyAKKwlyZXR1cm4gYXJnOyAKKyNlbGlmIGRlZmluZWQoX19wcGNfXykgJiYgZGVmaW5lZChfX0dOVUNfXykgCisJRFdPUkQgcmVzdWx0OyAKKwlfX2FzbV9fKCJsd2JyeCAlMCwwLCUxIiA6ICI9ciIgKHJlc3VsdCkgOiAiciIgKCZhcmcpLCAibSIgKGFyZykpOyAKKwlyZXR1cm4gcmVzdWx0OyAKKyNlbHNlIAorCS8vIHN3YXAgd29yZHMgdGhlbiBieXRlcworCURXT1JEIHJlc3VsdDsgCisJcmVzdWx0ID0gKChhcmcgJiAweDAwMDAwMEZGKSA8PCAyNCkgfCAoKGFyZyAmIDB4MDAwMEZGMDApIDw8IDgpIHwgKChhcmcgPj4gOCkgJiAweDAwMDBGRjAwKSB8ICgoYXJnID4+IDI0KSAmIDB4MDAwMDAwRkYpOyAKKwlyZXR1cm4gcmVzdWx0OyAKKyNlbmRpZiAKK30gCisgCisvKioKK2ZvciBsYXRlciB1c2UgLi4uCitpbmxpbmUgdWludDY0X3QgCitTd2FwSW50NjQodWludDY0X3QgYXJnKSB7IAorI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIF9NU0NfVkVSID49IDEzMTAgCisJcmV0dXJuIF9ieXRlc3dhcF91aW50NjQoYXJnKTsgCisjZWxzZSAKKwl1bmlvbiBTd2FwIHsgCisJCXVpbnQ2NF90IHN2OyAKKwkJdWludDMyX3QgdWxbMl07IAorCX0gdG1wLCByZXN1bHQ7IAorCXRtcC5zdiA9IGFyZzsgCisJcmVzdWx0LnVsWzBdID0gU3dhcEludDMyKHRtcC51bFsxXSk7ICAKKwlyZXN1bHQudWxbMV0gPSBTd2FwSW50MzIodG1wLnVsWzBdKTsgCisJcmV0dXJuIHJlc3VsdC5zdjsgCisjZW5kaWYgCit9IAorKi8KKworaW5saW5lIHZvaWQKK1N3YXBTaG9ydChXT1JEICpzcCkgeworCSpzcCA9IF9fU3dhcFVJbnQxNigqc3ApOworfQorCitpbmxpbmUgdm9pZAorU3dhcExvbmcoRFdPUkQgKmxwKSB7CisJKmxwID0gX19Td2FwVUludDMyKCpscCk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICAgR3JleXNjYWxlIGFuZCBjb2xvciBjb252ZXJzaW9uCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8qKgorRXh0cmFjdCB0aGUgbHVtaW5hbmNlIGNoYW5uZWwgTCBmcm9tIGEgUkdCRiBpbWFnZS4gCitMdW1pbmFuY2UgaXMgY2FsY3VsYXRlZCBmcm9tIHRoZSBzUkdCIG1vZGVsIHVzaW5nIGEgRDY1IHdoaXRlIHBvaW50LCB1c2luZyB0aGUgUmVjLjcwOSBmb3JtdWxhIDogCitMID0gKCAwLjIxMjYgKiByICkgKyAoIDAuNzE1MiAqIGcgKSArICggMC4wNzIyICogYiApCitSZWZlcmVuY2UgOiAKK0EgU3RhbmRhcmQgRGVmYXVsdCBDb2xvciBTcGFjZSBmb3IgdGhlIEludGVybmV0IC0gc1JHQi4gCitbb25saW5lXSBodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9Db2xvci9zUkdCCisqLworI2RlZmluZSBMVU1BX1JFQzcwOShyLCBnLCBiKQkoMC4yMTI2RiAqIHIgKyAwLjcxNTJGICogZyArIDAuMDcyMkYgKiBiKQorCisjZGVmaW5lIEdSRVkociwgZywgYikgKEJZVEUpKExVTUFfUkVDNzA5KHIsIGcsIGIpICsgMC41RikKKy8qCisjZGVmaW5lIEdSRVkociwgZywgYikgKEJZVEUpKCgoV09SRClyICogNzcgKyAoV09SRClnICogMTUwICsgKFdPUkQpYiAqIDI5KSA+PiA4KQkvLyAuMjk5UiArIC41ODdHICsgLjExNEIKKyovCisvKgorI2RlZmluZSBHUkVZKHIsIGcsIGIpIChCWVRFKSgoKFdPUkQpciAqIDE2OSArIChXT1JEKWcgKiAyNTYgKyAoV09SRCliICogODcpID4+IDkpCS8vIC4zM1IgKyAwLjVHICsgLjE3QgorKi8KKworI2RlZmluZSBSR0I1NjUoYiwgZywgcikgKCgoKGIpID4+IDMpIDw8IEZJMTZfNTY1X0JMVUVfU0hJRlQpIHwgKCgoZykgPj4gMikgPDwgRkkxNl81NjVfR1JFRU5fU0hJRlQpIHwgKCgocikgPj4gMykgPDwgRkkxNl81NjVfUkVEX1NISUZUKSkKKyNkZWZpbmUgUkdCNTU1KGIsIGcsIHIpICgoKChiKSA+PiAzKSA8PCBGSTE2XzU1NV9CTFVFX1NISUZUKSB8ICgoKGcpID4+IDMpIDw8IEZJMTZfNTU1X0dSRUVOX1NISUZUKSB8ICgoKHIpID4+IDMpIDw8IEZJMTZfNTU1X1JFRF9TSElGVCkpCisKKyNkZWZpbmUgSVNfRk9STUFUX1JHQjU2NShkaWIpICgoRnJlZUltYWdlX0dldFJlZE1hc2soZGliKSA9PSBGSTE2XzU2NV9SRURfTUFTSykgJiYgKEZyZWVJbWFnZV9HZXRHcmVlbk1hc2soZGliKSA9PSBGSTE2XzU2NV9HUkVFTl9NQVNLKSAmJiAoRnJlZUltYWdlX0dldEJsdWVNYXNrKGRpYikgPT0gRkkxNl81NjVfQkxVRV9NQVNLKSkKKyNkZWZpbmUgUkdCUVVBRF9UT19XT1JEKGRpYiwgY29sb3IpIChJU19GT1JNQVRfUkdCNTY1KGRpYikgPyBSR0I1NjUoKGNvbG9yKS0+cmdiQmx1ZSwgKGNvbG9yKS0+cmdiR3JlZW4sIChjb2xvciktPnJnYlJlZCkgOiBSR0I1NTUoKGNvbG9yKS0+cmdiQmx1ZSwgKGNvbG9yKS0+cmdiR3JlZW4sIChjb2xvciktPnJnYlJlZCkpCisKKyNkZWZpbmUgQ1JFQVRFX0dSRVlTQ0FMRV9QQUxFVFRFKHBhbGV0dGUsIGVudHJpZXMpIFwKKwlmb3IgKHVuc2lnbmVkIGkgPSAwLCB2ID0gMDsgaSA8IGVudHJpZXM7IGkrKywgdiArPSAweDAwRkZGRkZGIC8gKGVudHJpZXMgLSAxKSkgeyBcCisJCSgodW5zaWduZWQgKilwYWxldHRlKVtpXSA9IHY7IFwKKwl9CisKKyNkZWZpbmUgQ1JFQVRFX0dSRVlTQ0FMRV9QQUxFVFRFX1JFVkVSU0UocGFsZXR0ZSwgZW50cmllcykgXAorCWZvciAodW5zaWduZWQgaSA9IDAsIHYgPSAweDAwRkZGRkZGOyBpIDwgZW50cmllczsgaSsrLCB2IC09ICgweDAwRkZGRkZGIC8gKGVudHJpZXMgLSAxKSkpIHsgXAorCQkoKHVuc2lnbmVkICopcGFsZXR0ZSlbaV0gPSB2OyBcCisJfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgIEdlbmVyaWMgZXJyb3IgbWVzc2FnZXMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3RhdGljIGNvbnN0IGNoYXIgKkZJX01TR19FUlJPUl9NRU1PUlkgPSAiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIjsKK3N0YXRpYyBjb25zdCBjaGFyICpGSV9NU0dfRVJST1JfRElCX01FTU9SWSA9ICJESUIgYWxsb2NhdGlvbiBmYWlsZWQsIG1heWJlIGNhdXNlZCBieSBhbiBpbnZhbGlkIGltYWdlIHNpemUgb3IgYnkgYSBsYWNrIG9mIG1lbW9yeSI7CitzdGF0aWMgY29uc3QgY2hhciAqRklfTVNHX0VSUk9SX1BBUlNJTkcgPSAiUGFyc2luZyBlcnJvciI7CitzdGF0aWMgY29uc3QgY2hhciAqRklfTVNHX0VSUk9SX01BR0lDX05VTUJFUiA9ICJJbnZhbGlkIG1hZ2ljIG51bWJlciI7CitzdGF0aWMgY29uc3QgY2hhciAqRklfTVNHX0VSUk9SX1VOU1VQUE9SVEVEX0ZPUk1BVCA9ICJVbnN1cHBvcnRlZCBmb3JtYXQiOworc3RhdGljIGNvbnN0IGNoYXIgKkZJX01TR19FUlJPUl9VTlNVUFBPUlRFRF9DT01QUkVTU0lPTiA9ICJVbnN1cHBvcnRlZCBjb21wcmVzc2lvbiB0eXBlIjsKK3N0YXRpYyBjb25zdCBjaGFyICpGSV9NU0dfV0FSTklOR19JTlZBTElEX1RIVU1CTkFJTCA9ICJXYXJuaW5nOiBhdHRhY2hlZCB0aHVtYm5haWwgY2Fubm90IGJlIHdyaXR0ZW4gdG8gb3V0cHV0IGZpbGUgKGludmFsaWQgZm9ybWF0KSAtIFRodW1ibmFpbCBzYXZpbmcgYWJvcnRlZCI7CisKKyNlbmRpZiAvLyBVVElMSVRJRVNfSApkaWZmIC0tZ2l0IGEvZmlsZXMvV3JhcHBlci9GcmVlSW1hZ2VQbHVzL0ZyZWVJbWFnZVBsdXMuaCBiL2ZpbGVzL1dyYXBwZXIvRnJlZUltYWdlUGx1cy9GcmVlSW1hZ2VQbHVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcxMDEwZgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1dyYXBwZXIvRnJlZUltYWdlUGx1cy9GcmVlSW1hZ2VQbHVzLmgKQEAgLTAsMCArMSwxNzEzIEBACisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBGcmVlSW1hZ2VQbHVzIDMKKy8vCisvLyBEZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIGJ5CisvLyAtIEhlcnbpIERyb2xvbiAoZHJvbG9uQGluZm9uaWUuZnIpCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRnJlZUltYWdlIDMKKy8vCisvLyBDT1ZFUkVEIENPREUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkKKy8vIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTCisvLyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy8vIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVECisvLyBDT0RFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UCisvLyBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWQorLy8gU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTAorLy8gUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUgorLy8gVEhJUyBESVNDTEFJTUVSLgorLy8KKy8vIFVzZSBhdCB5b3VyIG93biByaXNrIQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaWZuZGVmIEZSRUVJTUFHRVBMVVNfSAorI2RlZmluZSBGUkVFSU1BR0VQTFVTX0gKKworI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbmRpZiAvLyBfV0lOMzIKKyNpbmNsdWRlICJGcmVlSW1hZ2UuaCIKKworCisvLyBDb21waWxlciBvcHRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgZGVmaW5lZChGUkVFSU1BR0VfTElCKQorCSNkZWZpbmUgRklQX0FQSQorCSNkZWZpbmUgRklQX0NBTExDT05WCisjZWxzZQorCSNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfX1dJTjMyX18pCisJCSNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgorCQkjZGVmaW5lIEZJUF9DQUxMQ09OViBfX3N0ZGNhbGwKKwkJLy8gVGhlIGZvbGxvd2luZyBpZmRlZiBibG9jayBpcyB0aGUgc3RhbmRhcmQgd2F5IG9mIGNyZWF0aW5nIG1hY3JvcyB3aGljaCBtYWtlIGV4cG9ydGluZyAKKwkJLy8gZnJvbSBhIERMTCBzaW1wbGVyLiBBbGwgZmlsZXMgd2l0aGluIHRoaXMgRExMIGFyZSBjb21waWxlZCB3aXRoIHRoZSBGSVBfRVhQT1JUUworCQkvLyBzeW1ib2wgZGVmaW5lZCBvbiB0aGUgY29tbWFuZCBsaW5lLiB0aGlzIHN5bWJvbCBzaG91bGQgbm90IGJlIGRlZmluZWQgb24gYW55IHByb2plY3QKKwkJLy8gdGhhdCB1c2VzIHRoaXMgRExMLiBUaGlzIHdheSBhbnkgb3RoZXIgcHJvamVjdCB3aG9zZSBzb3VyY2UgZmlsZXMgaW5jbHVkZSB0aGlzIGZpbGUgc2VlIAorCQkvLyBGSVBfQVBJIGZ1bmN0aW9ucyBhcyBiZWluZyBpbXBvcnRlZCBmcm9tIGEgRExMLCB3aGVyYXMgdGhpcyBETEwgc2VlcyBzeW1ib2xzCisJCS8vIGRlZmluZWQgd2l0aCB0aGlzIG1hY3JvIGFzIGJlaW5nIGV4cG9ydGVkLgorCQkjaWZkZWYgRklQX0VYUE9SVFMKKwkJCSNkZWZpbmUgRklQX0FQSSBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKwkJI2Vsc2UKKwkJCSNkZWZpbmUgRklQX0FQSSBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKwkJI2VuZGlmIC8vIEZJUF9FWFBPUlRTCisJI2Vsc2UKKwkJLy8gdHJ5IHRoZSBnY2MgdmlzaWJpbGl0eSBzdXBwb3J0IChzZWUgaHR0cDovL2djYy5nbnUub3JnL3dpa2kvVmlzaWJpbGl0eSkKKwkJI2lmIGRlZmluZWQoX19HTlVDX18pICYmICgoX19HTlVDX18gPj0gNCkgfHwgKF9fR05VQ19fID09IDMgJiYgX19HTlVDX01JTk9SX18gPj0gNCkpCisJCQkjaWZuZGVmIEdDQ19IQVNDTEFTU1ZJU0lCSUxJVFkKKwkJCQkjZGVmaW5lIEdDQ19IQVNDTEFTU1ZJU0lCSUxJVFkKKwkJCSNlbmRpZgorCQkjZW5kaWYJCisJCSNkZWZpbmUgRklQX0NBTExDT05WCisJCSNpZiBkZWZpbmVkKEdDQ19IQVNDTEFTU1ZJU0lCSUxJVFkpCisJCQkjZGVmaW5lIEZJUF9BUEkgX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpCisJCSNlbHNlCisJCQkjZGVmaW5lIEZJUF9BUEkKKwkJI2VuZGlmCisJI2VuZGlmIC8vIFdJTjMyIC8gIVdJTjMyCisjZW5kaWYgLy8gRlJFRUlNQUdFX0xJQgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoqIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGFsbCBvYmplY3RzIHVzZWQgYnkgdGhlIGxpYnJhcnkuCisJQHZlcnNpb24gRnJlZUltYWdlIDMKKwlAYXV0aG9yIEhlcnbpIERyb2xvbgorKi8KKworY2xhc3MgRklQX0FQSSBmaXBPYmplY3QKK3sKK3B1YmxpYzoKKwkvLy8gRGVzdHJ1Y3RvcgorCXZpcnR1YWwgfmZpcE9iamVjdCgpe307CisJCisJLyoqQG5hbWUgSW5mb3JtYXRpb24gZnVuY3Rpb25zICovCisJLy9AeworCS8vLyBSZXR1cm5zIFRSVUUgaWYgdGhlIG9iamVjdCBpcyBhbGxvY2F0ZWQsIEZBTFNFIG90aGVyd2lzZQorCXZpcnR1YWwgQk9PTCBpc1ZhbGlkKCkgY29uc3QgPSAwOworCS8vQH0KK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgZmlwTWVtb3J5SU87CitjbGFzcyBmaXBNdWx0aVBhZ2U7CitjbGFzcyBmaXBUYWc7CisKKy8qKiBBIGNsYXNzIHVzZWQgdG8gbWFuYWdlIGFsbCBwaG90byByZWxhdGVkIGltYWdlcyBhbmQgYWxsIGltYWdlIHR5cGVzIHVzZWQgYnkgdGhlIGxpYnJhcnkuCisKKwlmaXBJbWFnZSBlbmNhcHN1bGF0ZXMgdGhlIEZJQklUTUFQIGZvcm1hdC4gSXQgcmVsaWVzIG9uIHRoZSBGcmVlSW1hZ2UgbGlicmFyeSwgZXNwZWNpYWxseSBmb3IgCisJbG9hZGluZyAvIHNhdmluZyBpbWFnZXMgYW5kIGZvciBiaXQgZGVwdGggY29udmVyc2lvbi4KKwlAdmVyc2lvbiBGcmVlSW1hZ2UgMworCUBhdXRob3IgSGVydukgRHJvbG9uCisqLworCitjbGFzcyBGSVBfQVBJIGZpcEltYWdlIDogcHVibGljIGZpcE9iamVjdAoreworcHJvdGVjdGVkOgorCS8vLyBESUIgZGF0YQorCUZJQklUTUFQICpfZGliOworCS8vLyBPcmlnaW5hbCAob3IgbGFzdCBzYXZlZCkgZmlmIGZvcm1hdCBpZiBhdmFpbGFibGUsIEZJRl9VTktOT1dOIG90aGVyd2lzZQorCUZSRUVfSU1BR0VfRk9STUFUIF9maWY7CisJLy8vIFRSVUUgd2hlbmV2ZXIgdGhlIGRpc3BsYXkgbmVlZCB0byBiZSByZWZyZXNoZWQKKwltdXRhYmxlIEJPT0wgX2JIYXNDaGFuZ2VkOworCitwdWJsaWM6CisJZnJpZW5kIGNsYXNzIGZpcE11bHRpUGFnZTsKKworcHVibGljOgorCisJLyoqQG5hbWUgQ3JlYXRpb24gJiBEZXN0cnVjdGlvbiAqLworCS8vQHsJCisJLyoqCisJQ29uc3RydWN0b3IKKwlAc2VlIEZyZWVJbWFnZV9BbGxvY2F0ZVQKKwkqLworCWZpcEltYWdlKEZSRUVfSU1BR0VfVFlQRSBpbWFnZV90eXBlID0gRklUX0JJVE1BUCwgdW5zaWduZWQgd2lkdGggPSAwLCB1bnNpZ25lZCBoZWlnaHQgPSAwLCB1bnNpZ25lZCBicHAgPSAwKTsKKwkvLy8gRGVzdHJ1Y3RvcgorCXZpcnR1YWwgfmZpcEltYWdlKCk7CisJLyoqCisJSW1hZ2UgYWxsb2NhdG9yCisJQHNlZSBGcmVlSW1hZ2VfQWxsb2NhdGVUCisJKi8KKwlCT09MIHNldFNpemUoRlJFRV9JTUFHRV9UWVBFIGltYWdlX3R5cGUsIHVuc2lnbmVkIHdpZHRoLCB1bnNpZ25lZCBoZWlnaHQsIHVuc2lnbmVkIGJwcCwgdW5zaWduZWQgcmVkX21hc2sgPSAwLCB1bnNpZ25lZCBncmVlbl9tYXNrID0gMCwgdW5zaWduZWQgYmx1ZV9tYXNrID0gMCk7CisJLy8vIERlc3Ryb3kgaW1hZ2UgZGF0YQorCXZpcnR1YWwgdm9pZCBjbGVhcigpOworCS8vQH0KKworCS8qKkBuYW1lIENvcHlpbmcgKi8KKwkvL0B7CQorCS8qKgorCUNvcHkgY29uc3RydWN0b3IKKwlAc2VlIEZyZWVJbWFnZV9DbG9uZQorCSovCisJZmlwSW1hZ2UoY29uc3QgZmlwSW1hZ2UmIHNyYyk7CisJLyoqCisJQ29weSBjb25zdHJ1Y3RvcgorCUBzZWUgRnJlZUltYWdlX0Nsb25lCisJKi8KKwlmaXBJbWFnZSYgb3BlcmF0b3I9KGNvbnN0IGZpcEltYWdlJiBzcmMpOworCS8qKgorCTxiPkFzc2lnbmVtZW50IG9wZXJhdG9yPC9iPjxicj4KKwlDb3B5IHRoZSBpbnB1dCBwb2ludGVyIGFuZCBtYW5hZ2UgaXRzIGRlc3RydWN0aW9uCisJQHNlZSBvcGVyYXRvciBGSUJJVE1BUCooKQorCSovCisJZmlwSW1hZ2UmIG9wZXJhdG9yPShGSUJJVE1BUCAqZGliKTsKKworCisJLyoqCisJQGJyaWVmIENvcHkgYSBzdWIgcGFydCBvZiB0aGUgY3VycmVudCBpbWFnZSBhbmQgcmV0dXJucyBpdCBhcyBhIGZpcEltYWdlIG9iamVjdC4KKwkKKwlUaGlzIG1ldGhvZCB3b3JrcyB3aXRoIGFueSBiaXRtYXAgdHlwZS4KKwlAcGFyYW0gZHN0IE91dHB1dCBzdWJpbWFnZQorCUBwYXJhbSBsZWZ0IFNwZWNpZmllcyB0aGUgbGVmdCBwb3NpdGlvbiBvZiB0aGUgY3JvcHBlZCByZWN0YW5nbGUuIAorCUBwYXJhbSB0b3AgU3BlY2lmaWVzIHRoZSB0b3AgcG9zaXRpb24gb2YgdGhlIGNyb3BwZWQgcmVjdGFuZ2xlLiAKKwlAcGFyYW0gcmlnaHQgU3BlY2lmaWVzIHRoZSByaWdodCBwb3NpdGlvbiBvZiB0aGUgY3JvcHBlZCByZWN0YW5nbGUuIAorCUBwYXJhbSBib3R0b20gU3BlY2lmaWVzIHRoZSBib3R0b20gcG9zaXRpb24gb2YgdGhlIGNyb3BwZWQgcmVjdGFuZ2xlLiAKKwlAcmV0dXJuIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UuCisJQHNlZSBGcmVlSW1hZ2VfQ29weQorCSovCisJQk9PTCBjb3B5U3ViSW1hZ2UoZmlwSW1hZ2UmIGRzdCwgaW50IGxlZnQsIGludCB0b3AsIGludCByaWdodCwgaW50IGJvdHRvbSkgY29uc3Q7CisKKwkvKioKKwlAYnJpZWYgQWxwaGEgYmxlbmQgb3IgY29tYmluZSBhIHN1YiBwYXJ0IGltYWdlIHdpdGggdGhlIGN1cnJlbnQgaW1hZ2UuCisKKyAgICBUaGUgYml0IGRlcHRoIG9mIGRzdCBiaXRtYXAgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGJpdCBkZXB0aCBvZiBzcmMuIAorCVVwcGVyIHByb21vdGlvbiBvZiBzcmMgaXMgZG9uZSBpbnRlcm5hbGx5LiBTdXBwb3J0ZWQgYml0IGRlcHRoIGVxdWFscyB0byA0LCA4LCAxNiwgMjQgb3IgMzIuCisJQHBhcmFtIHNyYyBTb3VyY2Ugc3ViaW1hZ2UKKwlAcGFyYW0gbGVmdCBTcGVjaWZpZXMgdGhlIGxlZnQgcG9zaXRpb24gb2YgdGhlIHN1YiBpbWFnZS4gCisJQHBhcmFtIHRvcCBTcGVjaWZpZXMgdGhlIHRvcCBwb3NpdGlvbiBvZiB0aGUgc3ViIGltYWdlLiAKKwlAcGFyYW0gYWxwaGEgQWxwaGEgYmxlbmQgZmFjdG9yLiBUaGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBpbWFnZXMgYXJlIGFscGhhIGJsZW5kZWQgaWYgCisJYWxwaGEgPSAwLi4yNTUuIElmIGFscGhhID4gMjU1LCB0aGVuIHRoZSBzb3VyY2UgaW1hZ2UgaXMgY29tYmluZWQgdG8gdGhlIGRlc3RpbmF0aW9uIGltYWdlLgorCUByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZS4KKwlAc2VlIEZyZWVJbWFnZV9QYXN0ZQorCSovCisJQk9PTCBwYXN0ZVN1YkltYWdlKGZpcEltYWdlJiBzcmMsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgYWxwaGEgPSAyNTYpOworCisJLyoqCisJQGJyaWVmIENyb3AgYSBzdWIgcGFydCBvZiB0aGUgY3VycmVudCBpbWFnZSBhbmQgdXBkYXRlIGl0IGFjY29yZGluZ2x5LgorCQorCVRoaXMgbWV0aG9kIHdvcmtzIHdpdGggYW55IGJpdG1hcCB0eXBlLgorCUBwYXJhbSBsZWZ0IFNwZWNpZmllcyB0aGUgbGVmdCBwb3NpdGlvbiBvZiB0aGUgY3JvcHBlZCByZWN0YW5nbGUuIAorCUBwYXJhbSB0b3AgU3BlY2lmaWVzIHRoZSB0b3AgcG9zaXRpb24gb2YgdGhlIGNyb3BwZWQgcmVjdGFuZ2xlLiAKKwlAcGFyYW0gcmlnaHQgU3BlY2lmaWVzIHRoZSByaWdodCBwb3NpdGlvbiBvZiB0aGUgY3JvcHBlZCByZWN0YW5nbGUuIAorCUBwYXJhbSBib3R0b20gU3BlY2lmaWVzIHRoZSBib3R0b20gcG9zaXRpb24gb2YgdGhlIGNyb3BwZWQgcmVjdGFuZ2xlLiAKKwlAcmV0dXJuIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UuCisJKi8KKwlCT09MIGNyb3AoaW50IGxlZnQsIGludCB0b3AsIGludCByaWdodCwgaW50IGJvdHRvbSk7CisKKwkvL0B9CisKKwkvKiogQG5hbWUgRmlsZSB0eXBlIGlkZW50aWZpY2F0aW9uCisJICovCisJLy9AewkKKwkvKioKKwlAYnJpZWYgSWRlbnRpZmllcyBhbiBpbWFnZSBmcm9tIGRpc2ssIGdpdmVuIGl0cyBmaWxlIG5hbWUKKwlAcGFyYW0gbHBzelBhdGhOYW1lIFBhdGggYW5kIGZpbGUgbmFtZSBvZiB0aGUgaW1hZ2UgdG8gaWRlbnRpZnkuCisJQHJldHVybiBSZXR1cm5zIHRoZSBmb3VuZCBGcmVlSW1hZ2UgZm9ybWF0IGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgRklGX1VOS05PV04gb3RoZXJ3aXNlLgorCUBzZWUgRnJlZUltYWdlX0dldEZpbGVUeXBlLCBGcmVlSW1hZ2VfR2V0RklGRnJvbUZpbGVuYW1lLCBGcmVlSW1hZ2UgZG9jdW1lbnRhdGlvbgorCSovCisJc3RhdGljIEZSRUVfSU1BR0VfRk9STUFUIGlkZW50aWZ5RklGKGNvbnN0IGNoYXIqIGxwc3pQYXRoTmFtZSk7CisKKwkvKioKKwlVTklDT0RFIHZlcnNpb24gb2YgaWRlbnRpZnlGSUYgKHRoaXMgZnVuY3Rpb24gb25seSB3b3JrcyB1bmRlciBXSU4zMiBhbmQgZG9lcyBub3RoaW5nIG9uIG90aGVyIE9TKQorCUBzZWUgRnJlZUltYWdlX0dldEZpbGVUeXBlVSwgRnJlZUltYWdlX0dldEZJRkZyb21GaWxlbmFtZVUsIEZyZWVJbWFnZSBkb2N1bWVudGF0aW9uCisJKi8KKwlzdGF0aWMgRlJFRV9JTUFHRV9GT1JNQVQgaWRlbnRpZnlGSUZVKGNvbnN0IHdjaGFyX3QqIGxwc3pQYXRoTmFtZSk7CisKKwkvKioKKwlAYnJpZWYgSWRlbnRpZmllcyBhbiBpbWFnZSB1c2luZyB0aGUgc3BlY2lmaWVkIEZyZWVJbWFnZUlPIHN0cnVjdCBhbmQgZmlfaGFuZGxlLgorCUBwYXJhbSBpbyBGcmVlSW1hZ2VJTyBzdHJ1Y3R1cmUKKwlAcGFyYW0gaGFuZGxlIEZyZWVJbWFnZSBmaV9oYW5kbGUKKwlAcmV0dXJuIFJldHVybnMgdGhlIGZvdW5kIEZyZWVJbWFnZSBmb3JtYXQgaWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyBGSUZfVU5LTk9XTiBvdGhlcndpc2UuCisJQHNlZSBGcmVlSW1hZ2VfR2V0RmlsZVR5cGVGcm9tSGFuZGxlLCBGcmVlSW1hZ2UgZG9jdW1lbnRhdGlvbgorCSovCisJc3RhdGljIEZSRUVfSU1BR0VfRk9STUFUIGlkZW50aWZ5RklGRnJvbUhhbmRsZShGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUpOworCisJLyoqCisJQGJyaWVmIElkZW50aWZpZXMgYW4gaW1hZ2UgdXNpbmcgdGhlIHNwZWNpZmllZCBtZW1vcnkgc3RyZWFtLgorCUBwYXJhbSBobWVtIEZyZWVJbWFnZSBtZW1vcnkgc3RyZWFtCisJQHJldHVybiBSZXR1cm5zIHRoZSBmb3VuZCBGcmVlSW1hZ2UgZm9ybWF0IGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgRklGX1VOS05PV04gb3RoZXJ3aXNlLgorCUBzZWUgRnJlZUltYWdlX0dldEZpbGVUeXBlRnJvbU1lbW9yeSwgRnJlZUltYWdlIGRvY3VtZW50YXRpb24KKwkqLworCXN0YXRpYyBGUkVFX0lNQUdFX0ZPUk1BVCBpZGVudGlmeUZJRkZyb21NZW1vcnkoRklNRU1PUlkgKmhtZW0pOworCisJLy9AfQorCisKKwkvKiogQG5hbWUgTG9hZGluZyAmIFNhdmluZworCSAqIExvYWRpbmcgYW5kIHNhdmluZyBpcyBoYW5kbGVkIGJ5IHRoZSBGcmVlSW1hZ2UgbGlicmFyeS4KKwkgKi8KKwkvL0B7CQorCS8qKgorCUBicmllZiBMb2FkcyBhbiBpbWFnZSBmcm9tIGRpc2ssIGdpdmVuIGl0cyBmaWxlIG5hbWUgYW5kIGFuIG9wdGlvbmFsIGZsYWcuCisJQHBhcmFtIGxwc3pQYXRoTmFtZSBQYXRoIGFuZCBmaWxlIG5hbWUgb2YgdGhlIGltYWdlIHRvIGxvYWQuCisJQHBhcmFtIGZsYWcgVGhlIHNpZ25pZmljYXRpb24gb2YgdGhpcyBmbGFnIGRlcGVuZHMgb24gdGhlIGltYWdlIHRvIGJlIHJlYWQuCisJQHJldHVybiBSZXR1cm5zIFRSVUUgaWYgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlLgorCUBzZWUgRnJlZUltYWdlX0xvYWQsIEZyZWVJbWFnZSBkb2N1bWVudGF0aW9uCisJKi8KKwlCT09MIGxvYWQoY29uc3QgY2hhciogbHBzelBhdGhOYW1lLCBpbnQgZmxhZyA9IDApOworCisJLyoqCisJVU5JQ09ERSB2ZXJzaW9uIG9mIGxvYWQgKHRoaXMgZnVuY3Rpb24gb25seSB3b3JrcyB1bmRlciBXSU4zMiBhbmQgZG9lcyBub3RoaW5nIG9uIG90aGVyIE9TKQorCUBzZWUgbG9hZAorCSovCisJQk9PTCBsb2FkVShjb25zdCB3Y2hhcl90KiBscHN6UGF0aE5hbWUsIGludCBmbGFnID0gMCk7CisKKwkvKioKKwlAYnJpZWYgTG9hZHMgYW4gaW1hZ2UgdXNpbmcgdGhlIHNwZWNpZmllZCBGcmVlSW1hZ2VJTyBzdHJ1Y3QgYW5kIGZpX2hhbmRsZSwgYW5kIGFuIG9wdGlvbmFsIGZsYWcuCisJQHBhcmFtIGlvIEZyZWVJbWFnZUlPIHN0cnVjdHVyZQorCUBwYXJhbSBoYW5kbGUgRnJlZUltYWdlIGZpX2hhbmRsZQorCUBwYXJhbSBmbGFnIFRoZSBzaWduaWZpY2F0aW9uIG9mIHRoaXMgZmxhZyBkZXBlbmRzIG9uIHRoZSBpbWFnZSB0byBiZSByZWFkLgorCUByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZS4KKwlAc2VlIEZyZWVJbWFnZV9Mb2FkRnJvbUhhbmRsZSwgRnJlZUltYWdlIGRvY3VtZW50YXRpb24KKwkqLworCUJPT0wgbG9hZEZyb21IYW5kbGUoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBpbnQgZmxhZyA9IDApOworCisJLyoqCisJQGJyaWVmIExvYWRzIGFuIGltYWdlIHVzaW5nIHRoZSBzcGVjaWZpZWQgbWVtb3J5IHN0cmVhbSBhbmQgYW4gb3B0aW9uYWwgZmxhZy4KKwlAcGFyYW0gbWVtSU8gRnJlZUltYWdlIG1lbW9yeSBzdHJlYW0KKwlAcGFyYW0gZmxhZyBUaGUgc2lnbmlmaWNhdGlvbiBvZiB0aGlzIGZsYWcgZGVwZW5kcyBvbiB0aGUgaW1hZ2UgdG8gYmUgcmVhZC4KKwlAcmV0dXJuIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UuCisJQHNlZSBGcmVlSW1hZ2VfTG9hZEZyb21NZW1vcnksIEZyZWVJbWFnZSBkb2N1bWVudGF0aW9uCisJKi8KKwlCT09MIGxvYWRGcm9tTWVtb3J5KGZpcE1lbW9yeUlPJiBtZW1JTywgaW50IGZsYWcgPSAwKTsKKworCS8qKgorCUBicmllZiBTYXZlcyBhbiBpbWFnZSB0byBkaXNrLCBnaXZlbiBpdHMgZmlsZSBuYW1lIGFuZCBhbiBvcHRpb25hbCBmbGFnLgorCUBwYXJhbSBscHN6UGF0aE5hbWUgUGF0aCBhbmQgZmlsZSBuYW1lIG9mIHRoZSBpbWFnZSB0byBzYXZlLgorCUBwYXJhbSBmbGFnIFRoZSBzaWduaWZpY2F0aW9uIG9mIHRoaXMgZmxhZyBkZXBlbmRzIG9uIHRoZSBpbWFnZSB0byBiZSBzYXZlZC4KKwlAcmV0dXJuIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UuCisJQHNlZSBGcmVlSW1hZ2VfU2F2ZSwgRnJlZUltYWdlIGRvY3VtZW50YXRpb24KKwkqLworCUJPT0wgc2F2ZShjb25zdCBjaGFyKiBscHN6UGF0aE5hbWUsIGludCBmbGFnID0gMCkgY29uc3Q7CisKKwkvKioKKwlVTklDT0RFIHZlcnNpb24gb2Ygc2F2ZSAodGhpcyBmdW5jdGlvbiBvbmx5IHdvcmtzIHVuZGVyIFdJTjMyIGFuZCBkb2VzIG5vdGhpbmcgb24gb3RoZXIgT1MpCisJQHNlZSBzYXZlCisJKi8KKwlCT09MIHNhdmVVKGNvbnN0IHdjaGFyX3QqIGxwc3pQYXRoTmFtZSwgaW50IGZsYWcgPSAwKSBjb25zdDsKKworCS8qKgorCUBicmllZiBTYXZlcyBhbiBpbWFnZSB1c2luZyB0aGUgc3BlY2lmaWVkIEZyZWVJbWFnZUlPIHN0cnVjdCBhbmQgZmlfaGFuZGxlLCBhbmQgYW4gb3B0aW9uYWwgZmxhZy4KKwlAcGFyYW0gZmlmIEZvcm1hdCBpZGVudGlmaWVyIChGcmVlSW1hZ2UgZm9ybWF0KQorCUBwYXJhbSBpbyBGcmVlSW1hZ2VJTyBzdHJ1Y3R1cmUKKwlAcGFyYW0gaGFuZGxlIEZyZWVJbWFnZSBmaV9oYW5kbGUKKwlAcGFyYW0gZmxhZyBUaGUgc2lnbmlmaWNhdGlvbiBvZiB0aGlzIGZsYWcgZGVwZW5kcyBvbiB0aGUgaW1hZ2UgdG8gYmUgc2F2ZWQuCisJQHJldHVybiBSZXR1cm5zIFRSVUUgaWYgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlLgorCUBzZWUgRnJlZUltYWdlX1NhdmVUb0hhbmRsZSwgRnJlZUltYWdlIGRvY3VtZW50YXRpb24KKwkqLworCUJPT0wgc2F2ZVRvSGFuZGxlKEZSRUVfSU1BR0VfRk9STUFUIGZpZiwgRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBpbnQgZmxhZyA9IDApIGNvbnN0OworCisJLyoqCisJQGJyaWVmIFNhdmVzIGFuIGltYWdlIHVzaW5nIHRoZSBzcGVjaWZpZWQgbWVtb3J5IHN0cmVhbSBhbmQgYW4gb3B0aW9uYWwgZmxhZy4KKwlAcGFyYW0gZmlmIEZvcm1hdCBpZGVudGlmaWVyIChGcmVlSW1hZ2UgZm9ybWF0KQorCUBwYXJhbSBtZW1JTyBGcmVlSW1hZ2UgbWVtb3J5IHN0cmVhbQorCUBwYXJhbSBmbGFnIFRoZSBzaWduaWZpY2F0aW9uIG9mIHRoaXMgZmxhZyBkZXBlbmRzIG9uIHRoZSBpbWFnZSB0byBiZSBzYXZlZC4KKwlAcmV0dXJuIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UuCisJQHNlZSBGcmVlSW1hZ2VfU2F2ZVRvTWVtb3J5LCBGcmVlSW1hZ2UgZG9jdW1lbnRhdGlvbgorCSovCisJQk9PTCBzYXZlVG9NZW1vcnkoRlJFRV9JTUFHRV9GT1JNQVQgZmlmLCBmaXBNZW1vcnlJTyYgbWVtSU8sIGludCBmbGFnID0gMCkgY29uc3Q7CisKKwkvL0B9CisKKwkvKioJQG5hbWUgSW5mb3JtYXRpb24gZnVuY3Rpb25zCisJICogIEFjY2Vzc29ycyB0byB0aGUgRElCIEJJVE1BUElORk8gc3RydWN0dXJlLgorCSAqLworCS8vQHsJCisKKwkvKioKKwlSZXR1cm5zIHRoZSBkYXRhIHR5cGUgb2YgdGhlIGltYWdlCisJQHNlZSBGcmVlSW1hZ2VfR2V0SW1hZ2VUeXBlCisJKi8KKwlGUkVFX0lNQUdFX1RZUEUgZ2V0SW1hZ2VUeXBlKCkgY29uc3Q7CisKKwkvKioKKwlSZXR1cm5zIHRoZSBpbWFnZSB3aWR0aCBpbiBwaXhlbHMKKwlAc2VlIEZyZWVJbWFnZV9HZXRXaWR0aAorCSovCisJdW5zaWduZWQgZ2V0V2lkdGgoKSBjb25zdDsKKwkKKwkvKioKKwlSZXR1cm5zIHRoZSBpbWFnZSBoZWlnaHQgaW4gcGl4ZWxzCisJQHNlZSBGcmVlSW1hZ2VfR2V0SGVpZ2h0CisJKi8KKwl1bnNpZ25lZCBnZXRIZWlnaHQoKSBjb25zdDsKKwkKKwkvKioKKwlSZXR1cm5zIHRoZSB3aWR0aCBvZiB0aGUgYml0bWFwIGluIGJ5dGVzIHJvdW5kZWQgdG8gdGhlIG5lYXJlc3QgRFdPUkQuCisJQHNlZSBGcmVlSW1hZ2VfR2V0UGl0Y2gKKwkqLworCXVuc2lnbmVkIGdldFNjYW5XaWR0aCgpIGNvbnN0OworCisJLyoqCisJUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIEZJQklUTUFQIGRhdGEuIFVzZWQgZm9yIGRpcmVjdCBhY2Nlc3MgZnJvbSBGUkVFSU1BR0UgZnVuY3Rpb25zIAorCW9yIGZyb20geW91ciBvd24gbG93IGxldmVsIEMgZnVuY3Rpb25zLjxicj4KKwk8Yj5TYW1wbGUgdXNlPC9iPiA6IDxicj4KKwk8cHJlPgorCWZpcEltYWdlIHNyYywgZHN0OworCXNyYy5sb2FkKCJ0ZXN0LnBuZyIpOworCWRzdCA9IEZyZWVJbWFnZV9Db252ZXJ0VG84Qml0cyhzcmMpOworCUZyZWVJbWFnZV9TYXZlKEZJRl9USUZGLCBkc3QsICJ0ZXN0LnRpZiIsIDApOworCTwvcHJlPgorCUBzZWUgb3BlcmF0b3I9KEZJQklUTUFQICpkaWIpCisJKi8KKwlvcGVyYXRvciBGSUJJVE1BUCooKSB7IAorCQlyZXR1cm4gX2RpYjsgCisJfQorCisJLy8vIFJldHVybnMgVFJVRSBpZiB0aGUgaW1hZ2UgaXMgYWxsb2NhdGVkLCBGQUxTRSBvdGhlcndpc2UKKwlCT09MIGlzVmFsaWQoKSBjb25zdDsKKworCS8qKgorCVJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBiaXRtYXAncyBCSVRNQVBJTkZPIGhlYWRlci4gCisJQHNlZSBGcmVlSW1hZ2VfR2V0SW5mbworCSovCisJQklUTUFQSU5GTyogZ2V0SW5mbygpIGNvbnN0OworCisJLyoqCisJUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGJpdG1hcCdzIEJJVE1BUElORk9IRUFERVIuIAorCUBzZWUgRnJlZUltYWdlX0dldEluZm9IZWFkZXIKKwkqLworICAgIEJJVE1BUElORk9IRUFERVIqIGdldEluZm9IZWFkZXIoKSBjb25zdDsKKworCS8qKgorCVJldHVybnMgdGhlIHNpemUgb2YgdGhlIGJpdG1hcCBpbiBieXRlcy4gCisJVGhlIHNpemUgb2YgdGhlIGJpdG1hcCBpcyB0aGUgQklUTUFQSU5GT0hFQURFUiArIHRoZSBzaXplIG9mIHRoZSBwYWxldHRlICsgdGhlIHNpemUgb2YgdGhlIGJpdG1hcCBkYXRhLiAKKwlAc2VlIEZyZWVJbWFnZV9HZXRESUJTaXplCisJKi8KKwl1bnNpZ25lZCBnZXRJbWFnZVNpemUoKSBjb25zdDsKKworCS8qKgorCVJldHVybnMgdGhlIG1lbW9yeSBmb290cHJpbnQgb2YgYSBiaXRtYXAsIGluIGJ5dGVzLiAKKwlAc2VlIEZyZWVJbWFnZV9HZXRNZW1vcnlTaXplCisJKi8KKwl1bnNpZ25lZCBnZXRJbWFnZU1lbW9yeVNpemUoKSBjb25zdDsKKwkKKwkvKioKKwlSZXR1cm5zIHRoZSBiaXRkZXB0aCBvZiB0aGUgYml0bWFwLiA8YnI+CisJV2hlbiB0aGUgaW1hZ2UgdHlwZSBpcyBGSVRfQklUTUFQLCB2YWxpZCBiaXRkZXB0aCBjYW4gYmUgMSwgNCwgOCwgMTYsIDI0IG9yIDMyLgorCUBzZWUgRnJlZUltYWdlX0dldEJQUCwgZ2V0SW1hZ2VUeXBlCisJKi8KKwl1bnNpZ25lZCBnZXRCaXRzUGVyUGl4ZWwoKSBjb25zdDsKKworCS8qKgorCVJldHVybnMgdGhlIHdpZHRoIG9mIHRoZSBiaXRtYXAgaW4gYnl0ZXMuPGJyPgorCTxiPlRoaXMgaXMgbm90IHRoZSBzaXplIG9mIHRoZSBzY2FubGluZTwvYj4uCisJQHNlZSBGcmVlSW1hZ2VfR2V0TGluZSwgZ2V0U2NhbldpZHRoCisJKi8KKwl1bnNpZ25lZCBnZXRMaW5lKCkgY29uc3Q7CisKKwkvKioKKwlSZXR1cm5zIHRoZSBiaXRtYXAgcmVzb2x1dGlvbiBhbG9uZyB0aGUgWCBheGlzLCBpbiBwaXhlbHMgLyBjbQorCUBzZWUgRnJlZUltYWdlX0dldERvdHNQZXJNZXRlclgKKwkqLworCWRvdWJsZSBnZXRIb3Jpem9udGFsUmVzb2x1dGlvbigpIGNvbnN0OworCQorCS8qKgorCVJldHVybnMgdGhlIGJpdG1hcCByZXNvbHV0aW9uIGFsb25nIHRoZSBZIGF4aXMsIGluIHBpeGVscyAvIGNtCisJQHNlZSBGcmVlSW1hZ2VfR2V0RG90c1Blck1ldGVyWQorCSovCisJZG91YmxlIGdldFZlcnRpY2FsUmVzb2x1dGlvbigpIGNvbnN0OworCisJLyoqCisJc2V0IHRoZSBiaXRtYXAgcmVzb2x1dGlvbiBhbG9uZyB0aGUgWCBheGlzLCBpbiBwaXhlbHMgLyBjbQorCUBzZWUgRnJlZUltYWdlX0dldEluZm9IZWFkZXIKKwkqLworCXZvaWQgc2V0SG9yaXpvbnRhbFJlc29sdXRpb24oZG91YmxlIHZhbHVlKTsKKwkKKwkvKioKKwlzZXQgdGhlIGJpdG1hcCByZXNvbHV0aW9uIGFsb25nIHRoZSBZIGF4aXMsIGluIHBpeGVscyAvIGNtCisJQHNlZSBGcmVlSW1hZ2VfR2V0SW5mb0hlYWRlcgorCSovCisJdm9pZCBzZXRWZXJ0aWNhbFJlc29sdXRpb24oZG91YmxlIHZhbHVlKTsKKworCS8vQH0KKworCS8qKkBuYW1lIFBhbGV0dGUgb3BlcmF0aW9ucyAqLworCS8vQHsKKwkvKioKKwlSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgYml0bWFwJ3MgcGFsZXR0ZS4gSWYgdGhlIGJpdG1hcCBkb2Vzbid0IGhhdmUgYSBwYWxldHRlLCBnZXRQYWxldHRlIHJldHVybnMgTlVMTC4gCisJQHNlZSBGcmVlSW1hZ2VfR2V0UGFsZXR0ZQorCSovCisJUkdCUVVBRCogZ2V0UGFsZXR0ZSgpIGNvbnN0OworCQorCS8qKgorCVJldHVybnMgdGhlIHBhbGV0dGUgc2l6ZSBpbiA8Yj5ieXRlczwvYj4uCisJQHNlZSBGcmVlSW1hZ2VfR2V0Q29sb3JzVXNlZAorCSovCisJdW5zaWduZWQgZ2V0UGFsZXR0ZVNpemUoKSBjb25zdDsKKworCS8qKgorCVJldHJpZXZlcyB0aGUgbnVtYmVyIG9mIGNvbG91cnMgdXNlZCBpbiB0aGUgYml0bWFwLiBJZiB0aGUgYml0bWFwIGlzIG5vbi1wYWxsZXRpc2VkLCAwIGlzIHJldHVybmVkLiAKKwlAc2VlIEZyZWVJbWFnZV9HZXRDb2xvcnNVc2VkCisJKi8KKwl1bnNpZ25lZCBnZXRDb2xvcnNVc2VkKCkgY29uc3Q7CisKKwkvKiogCisJSW52ZXN0aWdhdGVzIHRoZSBjb2xvdXIgdHlwZSBvZiB0aGUgYml0bWFwLgorCUBzZWUgRnJlZUltYWdlX0dldENvbG9yVHlwZSwgRlJFRV9JTUFHRV9DT0xPUl9UWVBFCisJKi8KKwlGUkVFX0lNQUdFX0NPTE9SX1RZUEUgZ2V0Q29sb3JUeXBlKCkgY29uc3Q7CisKKwkvKioKKwlSZXR1cm5zIFRSVUUgaWYgdGhlIGJpdG1hcCBpcyBhIDgtYml0IGJpdG1hcCB3aXRoIGEgZ3JleXNjYWxlIHBhbGV0dGUsIEZBTFNFIG90aGVyd2lzZQorCUBzZWUgRnJlZUltYWdlX0dldEJQUCwgRnJlZUltYWdlX0dldENvbG9yVHlwZQorCSovCisJQk9PTCBpc0dyYXlzY2FsZSgpIGNvbnN0OworCS8vQH0KKworCS8qKkBuYW1lIFRodW1ibmFpbCBhY2Nlc3MgKi8KKwkvL0B7CisKKwkvKioKKwlSZXRyaWV2ZXMgYSBjb3B5IHRoZSB0aHVtYm5haWwgcG9zc2libHkgYXR0YWNoZWQgdG8gdGhlIGJpdG1hcAorCUByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHRoZSB0aHVtYm5haWwgaXMgcHJlc2VudCBpbiB0aGUgYml0bWFwIGFuZCBzdWNjZXNzZnVseSByZXRyaWV2ZWQsIHJldHVybnMgRkFMU0Ugb3RoZXJ3aXNlCisJQHNlZSBGcmVlSW1hZ2VfR2V0VGh1bWJuYWlsCisJKi8KKwlCT09MIGdldFRodW1ibmFpbChmaXBJbWFnZSYgaW1hZ2UpIGNvbnN0OworCisJLyoqCisJQXR0YWNoIGEgdGh1bWJuYWlsIHRvIHRoZSBiaXRtYXAKKwlAcmV0dXJuIFJldHVybnMgVFJVRSBpZiB0aGUgdGh1bWJuYWlsIHdhcyBzdWNjZXNzZnVseSBzZXQsIHJldHVybnMgRkFMU0Ugb3RoZXJ3aXNlCisJQHNlZSBGcmVlSW1hZ2VfU2V0VGh1bWJuYWlsCisJKi8KKwlCT09MIHNldFRodW1ibmFpbChjb25zdCBmaXBJbWFnZSYgaW1hZ2UpOworCisJLyoqCisJQ2hlY2sgaWYgdGhlIGltYWdlIGhhcyBhbiBlbWJlZGRlZCB0aHVtYm5haWwKKwlAcmV0dXJuIFJldHVybnMgVFJVRSBpZiBhIHRodW1ibmFpbCBpcyBwcmVzZW50IGluIHRoZSBiaXRtYXAsIHJldHVybnMgRkFMU0Ugb3RoZXJ3aXNlCisJQHNlZSBGcmVlSW1hZ2VfR2V0VGh1bWJuYWlsCisJKi8KKwlCT09MIGhhc1RodW1ibmFpbCgpIGNvbnN0OworCisJLyoqCisJQ2xlYXIgdGhlIHRodW1ibmFpbCBwb3NzaWJseSBhdHRhY2hlZCB0byB0aGUgYml0bWFwCisJQHJldHVybiBSZXR1cm5zIFRSVUUgaWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyBGQUxTZSBvdGhlcndpc2UKKwlAc2VlIEZyZWVJbWFnZV9TZXRUaHVtYm5haWwKKwkqLworCUJPT0wgY2xlYXJUaHVtYm5haWwoKTsKKworCS8vQH0KKworCS8qKkBuYW1lIFBpeGVsIGFjY2VzcyAqLworCS8vQHsJCisKKwkvKiogQGJyaWVmIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBiaXRtYXAgYml0cy4KKworCUl0IGlzIHVwIHRvIHlvdSB0byBpbnRlcnByZXQgdGhlc2UgYnl0ZXMgY29ycmVjdGx5LCAKKwlhY2NvcmRpbmcgdG8gdGhlIHJlc3VsdHMgb2YgRnJlZUltYWdlX0dldEJQUCBhbmQgCisJR2V0UmVkTWFzaywgRnJlZUltYWdlX0dldEdyZWVuTWFzayBhbmQgRnJlZUltYWdlX0dldEJsdWVNYXNrLjxicj4KKwlVc2UgdGhpcyBmdW5jdGlvbiB3aXRoIGdldFNjYW5XaWR0aCB0byBpdGVyYXRlcyB0aHJvdWdoIHRoZSBwaXhlbHMuIAorCUBzZWUgRnJlZUltYWdlX0dldEJpdHMKKwkqLworCUJZVEUqIGFjY2Vzc1BpeGVscygpIGNvbnN0OworCisJLyoqIEBicmllZiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGdpdmVuIHNjYW5saW5lIGluIHRoZSBiaXRtYXCScyBkYXRhLWJpdHMuCisJCVRoaXMgcG9pbnRlciBjYW4gYmUgY2FzdCBhY2NvcmRpbmcgdG8gdGhlIHJlc3VsdCByZXR1cm5lZCBieSBnZXRJbWFnZVR5cGUuPGJyPgorCQlVc2UgdGhpcyBmdW5jdGlvbiB3aXRoIGdldFNjYW5XaWR0aCB0byBpdGVyYXRlcyB0aHJvdWdoIHRoZSBwaXhlbHMuIAorCQlAc2VlIEZyZWVJbWFnZV9HZXRTY2FuTGluZSwgRnJlZUltYWdlIGRvY3VtZW50YXRpb24KKwkqLworCUJZVEUqIGdldFNjYW5MaW5lKHVuc2lnbmVkIHNjYW5saW5lKSBjb25zdDsKKworCS8qKiAKKwlHZXQgdGhlIHBpeGVsIGluZGV4IG9mIGEgMS0sIDQtIG9yIDgtYml0IHBhbGV0dGl6ZWQgaW1hZ2UgYXQgcG9zaXRpb24gKHgsIHkpLCBpbmNsdWRpbmcgcmFuZ2UgY2hlY2sgKHNsb3cgYWNjZXNzKS4gCisJQHBhcmFtIHggUGl4ZWwgcG9zaXRpb24gaW4gaG9yaXpvbnRhbCBkaXJlY3Rpb24KKwlAcGFyYW0geSBQaXhlbCBwb3NpdGlvbiBpbiB2ZXJ0aWNhbCBkaXJlY3Rpb24KKwlAcGFyYW0gdmFsdWUgUGl4ZWwgaW5kZXggKHJldHVybmVkIHZhbHVlKQorCUByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZS4gCisJQHNlZSBGcmVlSW1hZ2VfR2V0UGl4ZWxJbmRleAorCSovCisJQk9PTCBnZXRQaXhlbEluZGV4KHVuc2lnbmVkIHgsIHVuc2lnbmVkIHksIEJZVEUgKnZhbHVlKSBjb25zdDsKKworCS8qKiAKKwlHZXQgdGhlIHBpeGVsIGNvbG9yIG9mIGEgMTYtLCAyNC0gb3IgMzItYml0IGltYWdlIGF0IHBvc2l0aW9uICh4LCB5KSwgaW5jbHVkaW5nIHJhbmdlIGNoZWNrIChzbG93IGFjY2VzcykuIAorCUBwYXJhbSB4IFBpeGVsIHBvc2l0aW9uIGluIGhvcml6b250YWwgZGlyZWN0aW9uCisJQHBhcmFtIHkgUGl4ZWwgcG9zaXRpb24gaW4gdmVydGljYWwgZGlyZWN0aW9uCisJQHBhcmFtIHZhbHVlIFBpeGVsIGNvbG9yIChyZXR1cm5lZCB2YWx1ZSkKKwlAcmV0dXJuIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UuIAorCUBzZWUgRnJlZUltYWdlX0dldFBpeGVsQ29sb3IKKwkqLworCUJPT0wgZ2V0UGl4ZWxDb2xvcih1bnNpZ25lZCB4LCB1bnNpZ25lZCB5LCBSR0JRVUFEICp2YWx1ZSkgY29uc3Q7CisKKwkvKiogCisJU2V0IHRoZSBwaXhlbCBpbmRleCBvZiBhIDEtLCA0LSBvciA4LWJpdCBwYWxldHRpemVkIGltYWdlIGF0IHBvc2l0aW9uICh4LCB5KSwgaW5jbHVkaW5nIHJhbmdlIGNoZWNrIChzbG93IGFjY2VzcykuIAorCUBwYXJhbSB4IFBpeGVsIHBvc2l0aW9uIGluIGhvcml6b250YWwgZGlyZWN0aW9uCisJQHBhcmFtIHkgUGl4ZWwgcG9zaXRpb24gaW4gdmVydGljYWwgZGlyZWN0aW9uCisJQHBhcmFtIHZhbHVlIFBpeGVsIGluZGV4CisJQHJldHVybiBSZXR1cm5zIFRSVUUgaWYgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlLiAKKwlAc2VlIEZyZWVJbWFnZV9TZXRQaXhlbEluZGV4CisJKi8KKwlCT09MIHNldFBpeGVsSW5kZXgodW5zaWduZWQgeCwgdW5zaWduZWQgeSwgQllURSAqdmFsdWUpOworCisJLyoqIAorCVNldCB0aGUgcGl4ZWwgY29sb3Igb2YgYSAxNi0sIDI0LSBvciAzMi1iaXQgaW1hZ2UgYXQgcG9zaXRpb24gKHgsIHkpLCBpbmNsdWRpbmcgcmFuZ2UgY2hlY2sgKHNsb3cgYWNjZXNzKS4gCisJQHBhcmFtIHggUGl4ZWwgcG9zaXRpb24gaW4gaG9yaXpvbnRhbCBkaXJlY3Rpb24KKwlAcGFyYW0geSBQaXhlbCBwb3NpdGlvbiBpbiB2ZXJ0aWNhbCBkaXJlY3Rpb24KKwlAcGFyYW0gdmFsdWUgUGl4ZWwgY29sb3IKKwlAcmV0dXJuIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UuIAorCUBzZWUgRnJlZUltYWdlX1NldFBpeGVsQ29sb3IKKwkqLworCUJPT0wgc2V0UGl4ZWxDb2xvcih1bnNpZ25lZCB4LCB1bnNpZ25lZCB5LCBSR0JRVUFEICp2YWx1ZSk7CisKKwkvL0B9CisKKwkvKioJQG5hbWUgQ29udmVyc2lvbiByb3V0aW5lcworCSAqICBCaXRtYXBzIGFyZSBhbHdheXMgbG9hZGVkIGluIHRoZWlyIGRlZmF1bHQgYml0IGRlcHRoLiBJZiB5b3Ugd2FudCB0aGUgYml0bWFwIHRvIGJlIHN0b3JlZCBpbiBhbm90aGVyIGJpdCBkZXB0aCwgdGhlIGNsYXNzIHByb3ZpZGVzIHNldmVyYWwgY29udmVyc2lvbiBmdW5jdGlvbnMuCisJICovCisJLy9AewkKKwkvKiogCisJQ29udmVydHMgYW4gaW1hZ2UgdG8gYSB0eXBlIHN1cHBvcnRlZCBieSBGcmVlSW1hZ2UuCisJQHBhcmFtIGltYWdlX3R5cGUgTmV3IGltYWdlIHR5cGUKKwlAcGFyYW0gc2NhbGVfbGluZWFyIFRSVUUgaWYgaW1hZ2UgcGl4ZWxzIG11c3QgYmUgc2NhbGVkIGxpbmVhcmx5IHdoZW4gY29udmVydGluZyB0byBhIHN0YW5kYXJkIGJpdG1hcAorCUByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZS4gCisJQHNlZSBGcmVlSW1hZ2VfQ29udmVydFRvVHlwZSwgRnJlZUltYWdlX0NvbnZlcnRUb1N0YW5kYXJkVHlwZQorCSovCisJQk9PTCBjb252ZXJ0VG9UeXBlKEZSRUVfSU1BR0VfVFlQRSBpbWFnZV90eXBlLCBCT09MIHNjYWxlX2xpbmVhciA9IFRSVUUpOworCisJLyoqIAorCUNvbnZlcnRzIHRoZSBiaXRtYXAgdG8gMSBiaXQgdXNpbmcgYSB0aHJlc2hvbGQgVC4KKwlAcGFyYW0gVCBUaHJlc2hvbGQgdmFsdWUgaW4gWzAuLjI1NV0KKwlAcmV0dXJuIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UuIAorCUBzZWUgRnJlZUltYWdlX1RocmVzaG9sZAorCSovCisJQk9PTCB0aHJlc2hvbGQoQllURSBUKTsKKwkKKwkvKiogCisJQ29udmVydHMgYSA4LWJpdCBpbWFnZSB0byBhIG1vbm9jaHJvbWUgMS1iaXQgaW1hZ2UgdXNpbmcgYSBkaXRoZXJpbmcgYWxnb3JpdGhtLgorCUBwYXJhbSBhbGdvcml0aG0gRGl0aGVyaW5nIGFsZ29yaXRobSB0byB1c2UuCisJQHJldHVybiBSZXR1cm5zIFRSVUUgaWYgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlLiAKKwlAc2VlIEZyZWVJbWFnZV9EaXRoZXIsIEZSRUVfSU1BR0VfRElUSEVSCisJKi8KKwlCT09MIGRpdGhlcihGUkVFX0lNQUdFX0RJVEhFUiBhbGdvcml0aG0pOworCisJLyoqIAorCUNvbnZlcnRzIHRoZSBiaXRtYXAgdG8gNCBiaXRzLiBVbmxlc3MgdGhlIGJpdG1hcCBpcyBhIDEtYml0IHBhbGV0dGl6ZWQgYml0bWFwLCBjb2xvdXIgdmFsdWVzIGFyZSBjb252ZXJ0ZWQgdG8gZ3JleXNjYWxlLgorCUByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZS4gCisJQHNlZSBGcmVlSW1hZ2VfQ29udmVydFRvNEJpdHMKKwkqLworCUJPT0wgY29udmVydFRvNEJpdHMoKTsKKworCS8qKiAKKwlDb252ZXJ0cyB0aGUgYml0bWFwIHRvIDggYml0cy4gSWYgdGhlIGJpdG1hcCBpcyAyNCBvciAzMi1iaXQgUkdCLCB0aGUgY29sb3VyIHZhbHVlcyBhcmUgY29udmVydGVkIHRvIGdyZXlzY2FsZS4KKwlAcmV0dXJuIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UuIAorCUBzZWUgRnJlZUltYWdlX0NvbnZlcnRUbzhCaXRzCisJKi8KKwlCT09MIGNvbnZlcnRUbzhCaXRzKCk7CisKKwkvKiogCisJQ29udmVydHMgdGhlIGJpdG1hcCB0byA4IGJpdHMuPGJyPiAKKwlGb3IgcGFsbGV0aXplZCBiaXRtYXBzLCB0aGUgY29sb3IgbWFwIGlzIGNvbnZlcnRlZCB0byBhIGdyZXlzY2FsZSByYW1wLgorCUBzZWUgRnJlZUltYWdlX0NvbnZlcnRUb0dyZXlzY2FsZQorCUByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZS4gCisJKi8KKwlCT09MIGNvbnZlcnRUb0dyYXlzY2FsZSgpOworCQorCS8qKiAKKwlRdWFudGl6ZXMgYSBmdWxsIGNvbG91ciAyNC1iaXQgYml0bWFwIHRvIGEgcGFsbGV0aXNlZCA4LWJpdCBiaXRtYXAuPGJyPgorCVRoZSBxdWFudGl6ZSBwYXJhbWV0ZXIgc3BlY2lmaWVzIHdoaWNoIGNvbG91ciByZWR1Y3Rpb24gYWxnb3JpdGhtIHNob3VsZCBiZSB1c2VkLgorCUBwYXJhbSBhbGdvcml0aG0gQ29sb3IgcXVhbnRpemF0aW9uIGFsZ29yaXRobSB0byB1c2UuCisJQHJldHVybiBSZXR1cm5zIFRSVUUgaWYgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlLiAKKwlAc2VlIEZyZWVJbWFnZV9Db2xvclF1YW50aXplLCBGUkVFX0lNQUdFX1FVQU5USVpFCisJKi8KKwlCT09MIGNvbG9yUXVhbnRpemUoRlJFRV9JTUFHRV9RVUFOVElaRSBhbGdvcml0aG0pOworCisJLyoqIAorCUNvbnZlcnRzIHRoZSBiaXRtYXAgdG8gMTYgYml0cy4gVGhlIHJlc3VsdGluZyBiaXRtYXAgaGFzIGEgbGF5b3V0IG9mIDUgYml0cyByZWQsIDUgYml0cyBncmVlbiwgNSBiaXRzIGJsdWUgYW5kIDEgdW51c2VkIGJpdC4gCisJQHJldHVybiBSZXR1cm5zIFRSVUUgaWYgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlLiAKKwlAc2VlIEZyZWVJbWFnZV9Db252ZXJ0VG8xNkJpdHM1NTUKKwkqLworCUJPT0wgY29udmVydFRvMTZCaXRzNTU1KCk7CisJCisJLyoqIAorCUNvbnZlcnRzIHRoZSBiaXRtYXAgdG8gMTYgYml0cy4gVGhlIHJlc3VsdGluZyBiaXRtYXAgaGFzIGEgbGF5b3V0IG9mIDUgYml0cyByZWQsIDYgYml0cyBncmVlbiBhbmQgNSBiaXRzIGJsdWUuIAorCUByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZS4gCisJQHNlZSBGcmVlSW1hZ2VfQ29udmVydFRvMTZCaXRzNTY1CisJKi8KKwlCT09MIGNvbnZlcnRUbzE2Qml0czU2NSgpOworCQorCS8qKiAKKwlDb252ZXJ0cyB0aGUgYml0bWFwIHRvIDI0IGJpdHMuIAorCUByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZS4gCisJQHNlZSBGcmVlSW1hZ2VfQ29udmVydFRvMjRCaXRzCisJKi8KKwlCT09MIGNvbnZlcnRUbzI0Qml0cygpOworCQorCS8qKiAKKwlDb252ZXJ0cyB0aGUgYml0bWFwIHRvIDMyIGJpdHMuIAorCUByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZS4gCisJQHNlZSBGcmVlSW1hZ2VfQ29udmVydFRvMzJCaXRzCisJKi8KKwlCT09MIGNvbnZlcnRUbzMyQml0cygpOworCisJLyoqIAorCUNvbnZlcnRzIHRoZSBiaXRtYXAgdG8gYSAzMi1iaXQgZmxvYXQgaW1hZ2UuIAorCUByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZS4gCisJQHNlZSBGcmVlSW1hZ2VfQ29udmVydFRvRmxvYXQKKwkqLworCUJPT0wgY29udmVydFRvRmxvYXQoKTsKKworCS8qKiAKKwlDb252ZXJ0cyB0aGUgYml0bWFwIHRvIGEgOTYtYml0IFJHQkYgaW1hZ2UuIAorCUByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZS4gCisJQHNlZSBGcmVlSW1hZ2VfQ29udmVydFRvUkdCRgorCSovCisJQk9PTCBjb252ZXJ0VG9SR0JGKCk7CisKKwkvKiogCisJQ29udmVydHMgdGhlIGJpdG1hcCB0byBhIDEyOC1iaXQgUkdCQUYgaW1hZ2UuIAorCUByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZS4gCisJQHNlZSBGcmVlSW1hZ2VfQ29udmVydFRvUkdCQUYKKwkqLworCUJPT0wgY29udmVydFRvUkdCQUYoKTsKKworCS8qKiAKKwlDb252ZXJ0cyB0aGUgYml0bWFwIHRvIGEgMTYtYml0IHVuc2lnbmVkIHNob3J0IGltYWdlLiAKKwlAcmV0dXJuIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UuIAorCUBzZWUgRnJlZUltYWdlX0NvbnZlcnRUb1VJTlQxNgorCSovCisJQk9PTCBjb252ZXJ0VG9VSU5UMTYoKTsKKworCS8qKiAKKwlDb252ZXJ0cyB0aGUgYml0bWFwIHRvIGEgNDgtYml0IFJHQjE2IGltYWdlLiAKKwlAcmV0dXJuIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UuIAorCUBzZWUgRnJlZUltYWdlX0NvbnZlcnRUb1JHQjE2CisJKi8KKwlCT09MIGNvbnZlcnRUb1JHQjE2KCk7CisKKwkvKiogCisJQ29udmVydHMgdGhlIGJpdG1hcCB0byBhIDY0LWJpdCBSR0JBMTYgaW1hZ2UuIAorCUByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZS4gCisJQHNlZSBGcmVlSW1hZ2VfQ29udmVydFRvUkdCQTE2CisJKi8KKwlCT09MIGNvbnZlcnRUb1JHQkExNigpOworCisJLyoqCisJQ29udmVydHMgYSBIaWdoIER5bmFtaWMgUmFuZ2UgaW1hZ2UgKDQ4LWJpdCBSR0Igb3IgOTYtYml0IFJHQiBGbG9hdCkgdG8gYSAyNC1iaXQgUkdCIGltYWdlLiAKKwlAcGFyYW0gdG1vIFRvbmUgbWFwcGluZyBvcGVyYXRvcgorCUBwYXJhbSBmaXJzdF9wYXJhbSBGaXJzdCB0b25lIG1hcHBpbmcgYWxnb3JpdGhtIHBhcmFtZXRlciAoYWxnb3JpdGhtIGRlcGVuZGFudCkKKwlAcGFyYW0gc2Vjb25kX3BhcmFtIFNlY29uZCB0b25lIG1hcHBpbmcgYWxnb3JpdGhtIHBhcmFtZXRlciAoYWxnb3JpdGhtIGRlcGVuZGFudCkKKwlAcGFyYW0gdGhpcmRfcGFyYW0gVGhpcmQgdG9uZSBtYXBwaW5nIGFsZ29yaXRobSBwYXJhbWV0ZXIgKGFsZ29yaXRobSBkZXBlbmRhbnQpCisJQHBhcmFtIGZvdXJ0aF9wYXJhbSBGb3VydGggdG9uZSBtYXBwaW5nIGFsZ29yaXRobSBwYXJhbWV0ZXIgKGFsZ29yaXRobSBkZXBlbmRhbnQpCisJQHJldHVybiBSZXR1cm5zIFRSVUUgaWYgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlLiAKKwlAc2VlIEZyZWVJbWFnZV9Ub25lTWFwcGluZywgRnJlZUltYWdlX1Rtb1JlaW5oYXJkMDVFeAorCSovCisJQk9PTCB0b25lTWFwcGluZyhGUkVFX0lNQUdFX1RNTyB0bW8sIGRvdWJsZSBmaXJzdF9wYXJhbSA9IDAsIGRvdWJsZSBzZWNvbmRfcGFyYW0gPSAwLCBkb3VibGUgdGhpcmRfcGFyYW0gPSAxLCBkb3VibGUgZm91cnRoX3BhcmFtID0gMCk7CisKKwkvL0B9CisKKwkvKioJQG5hbWUgVHJhbnNwYXJlbmN5IHN1cHBvcnQ6IGJhY2tncm91bmQgY29sb3VyIGFuZCBhbHBoYSBjaGFubmVsICovCisJLy9AeworCisJLyoqCisJUmV0dXJucyBUUlVFIGlmIHRoZSBpbWFnZSBpcyB0cmFuc3BhcmVudCwgcmV0dXJucyBGQUxTRSBvdGhlcndpc2UKKwlAc2VlIEZyZWVJbWFnZV9Jc1RyYW5zcGFyZW50CisJKi8KKwlCT09MIGlzVHJhbnNwYXJlbnQoKSBjb25zdDsKKworCS8qKgorCTgtYml0IHRyYW5zcGFyZW5jeSA6IGdldCB0aGUgbnVtYmVyIG9mIHRyYW5zcGFyZW50IGNvbG9ycy4KKwlAcmV0dXJuIFJldHVybnMgdGhlIG51bWJlciBvZiB0cmFuc3BhcmVudCBjb2xvcnMgaW4gYSBwYWxsZXRpc2VkIGJpdG1hcC4KKwlAc2VlIEZyZWVJbWFnZV9HZXRUcmFuc3BhcmVuY3lDb3VudAorCSovCisJdW5zaWduZWQgZ2V0VHJhbnNwYXJlbmN5Q291bnQoKSBjb25zdDsKKworCS8qKgorCTgtYml0IHRyYW5zcGFyZW5jeSA6IGdldCB0aGUgYml0bWFwknMgdHJhbnNwYXJlbmN5IHRhYmxlLgorCUByZXR1cm4gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGJpdG1hcJJzIHRyYW5zcGFyZW5jeSB0YWJsZS4KKwlAc2VlIEZyZWVJbWFnZV9HZXRUcmFuc3BhcmVuY3lUYWJsZQorCSovCisJQllURSogZ2V0VHJhbnNwYXJlbmN5VGFibGUoKSBjb25zdDsKKworCS8qKiAKKwk4LWJpdCB0cmFuc3BhcmVuY3kgOiBzZXQgdGhlIGJpdG1hcJJzIHRyYW5zcGFyZW5jeSB0YWJsZS4KKwlAc2VlIEZyZWVJbWFnZV9TZXRUcmFuc3BhcmVuY3lUYWJsZQorCSovCisJdm9pZCBzZXRUcmFuc3BhcmVuY3lUYWJsZShCWVRFICp0YWJsZSwgaW50IGNvdW50KTsKKworCS8qKgorCVJldHVybnMgVFJVRSB3aGVuIHRoZSBpbWFnZSBoYXMgYSBmaWxlIGJhY2tncm91bmQgY29sb3IsIEZBTFNFIG90aGVyd2lzZS4KKwlAc2VlIEZyZWVJbWFnZV9IYXNCYWNrZ3JvdW5kQ29sb3IKKwkqLworCUJPT0wgaGFzRmlsZUJrQ29sb3IoKSBjb25zdDsKKworCS8qKgorCUBicmllZiBSZXRyaWV2ZXMgdGhlIGZpbGUgYmFja2dyb3VuZCBjb2xvciBvZiBhbiBpbWFnZS4gCisJCisJRm9yIDgtYml0IGltYWdlcywgdGhlIGNvbG9yIGluZGV4IAorCWluIHRoZSBwYWxldHRlIGlzIHJldHVybmVkIGluIHRoZSByZ2JSZXNlcnZlZCBtZW1iZXIgb2YgdGhlIGJrY29sb3IgcGFyYW1ldGVyLgorCUByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZS4gCisJQHNlZSBGcmVlSW1hZ2VfR2V0QmFja2dyb3VuZENvbG9yCisJKi8KKwlCT09MIGdldEZpbGVCa0NvbG9yKFJHQlFVQUQgKmJrY29sb3IpIGNvbnN0OworCisJLyoqCisJQGJyaWVmIFNldCB0aGUgZmlsZSBiYWNrZ3JvdW5kIGNvbG9yIG9mIGFuIGltYWdlLiAKKwkKKwlXaGVuIHNhdmluZyBhbiBpbWFnZSB0byBQTkcsIHRoaXMgYmFja2dyb3VuZCBjb2xvciBpcyB0cmFuc3BhcmVudGx5IHNhdmVkIHRvIHRoZSBQTkcgZmlsZS4gCisJV2hlbiB0aGUgYmtjb2xvciBwYXJhbWV0ZXIgaXMgTlVMTCwgdGhlIGJhY2tncm91bmQgY29sb3IgaXMgcmVtb3ZlZCBmcm9tIHRoZSBpbWFnZS4KKwlAcmV0dXJuIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UuIAorCUBzZWUgRnJlZUltYWdlX1NldEJhY2tncm91bmRDb2xvcgorCSovCisJQk9PTCBzZXRGaWxlQmtDb2xvcihSR0JRVUFEICpia2NvbG9yKTsKKwkvL0B9CisKKwkvKipAbmFtZSBDaGFubmVsIHByb2Nlc3Npbmcgc3VwcG9ydCAqLworCS8vQHsJCisJLyoqIEBicmllZiBSZXRyaWV2ZXMgdGhlIHJlZCwgZ3JlZW4sIGJsdWUgb3IgYWxwaGEgY2hhbm5lbCBvZiBhIDI0LSBvciAzMi1iaXQgQkdSW0FdIGltYWdlLiAKKwlAcGFyYW0gaW1hZ2UgT3V0cHV0IGltYWdlIHRvIGJlIGV4dHJhY3RlZAorCUBwYXJhbSBjaGFubmVsIENvbG9yIGNoYW5uZWwgdG8gZXh0cmFjdAorCUByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZS4KKwlAc2VlIEZyZWVJbWFnZV9HZXRDaGFubmVsLCBGUkVFX0lNQUdFX0NPTE9SX0NIQU5ORUwKKwkqLworCUJPT0wgZ2V0Q2hhbm5lbChmaXBJbWFnZSYgaW1hZ2UsIEZSRUVfSU1BR0VfQ09MT1JfQ0hBTk5FTCBjaGFubmVsKSBjb25zdDsKKworCS8qKgorCUBicmllZiBJbnNlcnQgYSA4LWJpdCBkaWIgaW50byBhIDI0LSBvciAzMi1iaXQgaW1hZ2UuIAorCUBwYXJhbSBpbWFnZSBJbnB1dCA4LWJpdCBpbWFnZSB0byBpbnNlcnQKKwlAcGFyYW0gY2hhbm5lbCBDb2xvciBjaGFubmVsIHRvIHJlcGxhY2UKKwlAcmV0dXJuIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UuCisJQHNlZSBGcmVlSW1hZ2VfU2V0Q2hhbm5lbCwgRlJFRV9JTUFHRV9DT0xPUl9DSEFOTkVMCisJKi8KKwlCT09MIHNldENoYW5uZWwoZmlwSW1hZ2UmIGltYWdlLCBGUkVFX0lNQUdFX0NPTE9SX0NIQU5ORUwgY2hhbm5lbCk7CisKKwkvKiogQGJyaWVmIFNwbGl0IGEgMjQtYml0IFJHQiBpbWFnZSBpbnRvIDMgZ3JleXNjYWxlIGltYWdlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSByZWQsIGdyZWVuIGFuZCBibHVlIGNoYW5uZWxzLgorCUBwYXJhbSBSZWRDaGFubmVsIE91dHB1dCByZWQgY2hhbm5lbC4KKwlAcGFyYW0gR3JlZW5DaGFubmVsIE91dHB1dCBncmVlbiBjaGFubmVsLgorCUBwYXJhbSBCbHVlQ2hhbm5lbCBPdXRwdXQgYmx1ZSBjaGFubmVsLgorCUByZXR1cm4gUmV0dXJucyBGQUxTRSBpZiB0aGUgZGliIGlzbid0IGEgdmFsaWQgaW1hZ2UsIGlmIGl0J3Mgbm90IGEgMjQtYml0IGltYWdlIG9yIGlmIAorCW9uZSBvZiB0aGUgb3V0cHV0IGNoYW5uZWwgY2FuJ3QgYmUgYWxsb2NhdGVkLiBSZXR1cm5zIFRSVUUgb3RoZXJ3aXNlLgorCUBzZWUgRnJlZUltYWdlX0dldENoYW5uZWwKKwkqLworCUJPT0wgc3BsaXRDaGFubmVscyhmaXBJbWFnZSYgUmVkQ2hhbm5lbCwgZmlwSW1hZ2UmIEdyZWVuQ2hhbm5lbCwgZmlwSW1hZ2UmIEJsdWVDaGFubmVsKTsKKworCS8qKiBAYnJpZWYgQnVpbGRzIGEgMjQtYml0IFJHQiBpbWFnZSBnaXZlbiBpdHMgcmVkLCBncmVlbiBhbmQgYmx1ZSBjaGFubmVsLgorCUBwYXJhbSByZWQgSW5wdXQgcmVkIGNoYW5uZWwuCisJQHBhcmFtIGdyZWVuIElucHV0IGdyZWVuIGNoYW5uZWwuCisJQHBhcmFtIGJsdWUgSW5wdXQgYmx1ZSBjaGFubmVsLgorCUByZXR1cm4gUmV0dXJucyBGQUxTRSBpZiB0aGUgZGliIGNhbid0IGJlIGFsbG9jYXRlZCwgaWYgdGhlIGlucHV0IGNoYW5uZWxzIGFyZSBub3QgOC1iaXQgaW1hZ2VzLiBSZXR1cm5zIFRSVUUgb3RoZXJ3aXNlLgorCUBzZWUgRnJlZUltYWdlX1NldENoYW5uZWwKKwkqLworCUJPT0wgY29tYmluZUNoYW5uZWxzKGZpcEltYWdlJiByZWQsIGZpcEltYWdlJiBncmVlbiwgZmlwSW1hZ2UmIGJsdWUpOworCS8vQH0KKworCS8qKkBuYW1lIFJvdGF0aW9uIGFuZCBmbGlwcGluZyAqLworCS8vQHsJCisJLyoqIAorCUltYWdlIHRyYW5zbGF0aW9uIGFuZCByb3RhdGlvbiB1c2luZyBCLVNwbGluZXMuCisJQHBhcmFtIGFuZ2xlIEltYWdlIHJvdGF0aW9uIGFuZ2xlLCBpbiBkZWdyZWUKKwlAcGFyYW0geF9zaGlmdCBJbWFnZSBob3Jpem9udGFsIHNoaWZ0CisJQHBhcmFtIHlfc2hpZnQgSW1hZ2UgdmVydGljYWwgc2hpZnQKKwlAcGFyYW0geF9vcmlnaW4gT3JpZ2luIG9mIHRoZSB4LWF4aXMKKwlAcGFyYW0geV9vcmlnaW4gT3JpZ2luIG9mIHRoZSB5LWF4aXMKKwlAcGFyYW0gdXNlX21hc2sgV2hldGhlciBvciBub3QgdG8gbWFzayB0aGUgaW1hZ2UuIEltYWdlIG1pcnJvcmluZyBpcyBhcHBsaWVkIHdoZW4gdXNlX21hc2sgaXMgc2V0IHRvIEZBTFNFCisJQHJldHVybiBSZXR1cm5zIHRoZSB0cmFuc2xhdGVkICYgcm90YXRlZCBkaWIgaWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyBOVUxMIG90aGVyd2lzZQorCUBzZWUgRnJlZUltYWdlX1JvdGF0ZUV4CisJKi8KKwlCT09MIHJvdGF0ZUV4KGRvdWJsZSBhbmdsZSwgZG91YmxlIHhfc2hpZnQsIGRvdWJsZSB5X3NoaWZ0LCBkb3VibGUgeF9vcmlnaW4sIGRvdWJsZSB5X29yaWdpbiwgQk9PTCB1c2VfbWFzayk7CisKKwkvKiogCisJSW1hZ2Ugcm90YXRpb24gYnkgbWVhbnMgb2YgdGhyZWUgc2hlYXJzLgorCUBwYXJhbSBhbmdsZSBJbWFnZSByb3RhdGlvbiBhbmdsZSwgaW4gZGVncmVlCisJQHBhcmFtIGJrY29sb3IgQmFja2dyb3VuZCBjb2xvciAoaW1hZ2UgdHlwZSBkZXBlbmRlbnQpLCBkZWZhdWx0IHRvIGJsYWNrIGJhY2tncm91bmQKKwlAcmV0dXJuIFJldHVybnMgcm90YXRlZCBkaWIgaWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyBOVUxMIG90aGVyd2lzZQorCUBzZWUgRnJlZUltYWdlX1JvdGF0ZQorCSovCisJQk9PTCByb3RhdGUoZG91YmxlIGFuZ2xlLCBjb25zdCB2b2lkICpia2NvbG9yID0gTlVMTCk7CisKKwkvKioKKwlGbGlwIHRoZSBpbWFnZSBob3Jpem9udGFsbHkgYWxvbmcgdGhlIHZlcnRpY2FsIGF4aXMKKwlAc2VlIEZyZWVJbWFnZV9GbGlwSG9yaXpvbnRhbAorCSovCisJQk9PTCBmbGlwSG9yaXpvbnRhbCgpOworCisJLyoqCisJRmxpcCB0aGUgaW1hZ2UgdmVydGljYWxseSBhbG9uZyB0aGUgaG9yaXpvbnRhbCBheGlzCisJQHNlZSBGcmVlSW1hZ2VfRmxpcFZlcnRpY2FsCisJKi8KKwlCT09MIGZsaXBWZXJ0aWNhbCgpOworCS8vQH0KKworCS8qKkBuYW1lIENvbG9yIG1hbmlwdWxhdGlvbiByb3V0aW5lcyAqLworCS8vQHsJCisJLyoqIAorCUludmVydHMgZWFjaCBwaXhlbCBkYXRhLgorCUByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZS4KKwlAc2VlIEZyZWVJbWFnZV9JbnZlcnQKKwkqLworCUJPT0wgaW52ZXJ0KCk7CisJCisJLyoqIEBicmllZiBQZXJmb21zIGFuIGhpc3RvZ3JhbSB0cmFuc2Zvcm1hdGlvbiBvbiBhIDgsIDI0IG9yIDMyLWJpdCBpbWFnZSAKKwlhY2NvcmRpbmcgdG8gdGhlIHZhbHVlcyBvZiBhIGxvb2t1cCB0YWJsZSAoTFVUKS4KKworCVRoZSB0cmFuc2Zvcm1hdGlvbiBpcyBkb25lIGFzIGZvbGxvd3MuPGJyPgorCUltYWdlIDgtYml0IDogaWYgdGhlIGltYWdlIGhhcyBhIGNvbG9yIHBhbGV0dGUsIHRoZSBMVVQgaXMgYXBwbGllZCB0byB0aGlzIHBhbGV0dGUsIAorCW90aGVyd2lzZSwgaXQgaXMgYXBwbGllZCB0byB0aGUgZ3JleSB2YWx1ZXMuPGJyPgorCUltYWdlIDI0LWJpdCAmIDMyLWJpdCA6IGlmIGNoYW5uZWwgPT0gSVBMX0NDX1JHQiwgdGhlIHNhbWUgTFVUIGlzIGFwcGxpZWQgdG8gZWFjaCBjb2xvcgorCXBsYW5lIChSLEcsIGFuZCBCKS4gT3RoZXJ3aXNlLCB0aGUgTFVUIGlzIGFwcGxpZWQgdG8gdGhlIHNwZWNpZmllZCBjaGFubmVsIG9ubHkuCisJQHBhcmFtIExVVCBMb29rdXAgdGFibGUuIDxiPlRoZSBzaXplIG9mICdMVVQnIGlzIGFzc3VtZWQgdG8gYmUgMjU2LjwvYj4KKwlAcGFyYW0gY2hhbm5lbCBUaGUgY29sb3IgY2hhbm5lbCB0byBiZSBwcm9jZXNzZWQgKG9ubHkgdXNlZCB3aXRoIDI0ICYgMzItYml0IERJQikuCisJQHJldHVybiBSZXR1cm5zIFRSVUUgaWYgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlCisJQHNlZSBGcmVlSW1hZ2VfQWRqdXN0Q3VydmUsIEZSRUVfSU1BR0VfQ09MT1JfQ0hBTk5FTAorCSovCisJQk9PTCBhZGp1c3RDdXJ2ZShCWVRFICpMVVQsIEZSRUVfSU1BR0VfQ09MT1JfQ0hBTk5FTCBjaGFubmVsKTsKKworCS8qKiBAYnJpZWYgUGVyZm9ybXMgZ2FtbWEgY29ycmVjdGlvbiBvbiBhIDgsIDI0IG9yIDMyLWJpdCBpbWFnZS4KKwlAcGFyYW0gZ2FtbWEgR2FtbWEgdmFsdWUgdG8gdXNlLiBBIHZhbHVlIG9mIDEuMCBsZWF2ZXMgdGhlIGltYWdlIGFsb25lLCAKKwlsZXNzIHRoYW4gb25lIGRhcmtlbnMgaXQsIGFuZCBncmVhdGVyIHRoYW4gb25lIGxpZ2h0ZW5zIGl0LgorCUByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZQorCUBzZWUgRnJlZUltYWdlX0FkanVzdEdhbW1hLCBhZGp1c3RDdXJ2ZQorCSovCisJQk9PTCBhZGp1c3RHYW1tYShkb3VibGUgZ2FtbWEpOworCisJLyoqIEBicmllZiBBZGp1c3RzIHRoZSBicmlnaHRuZXNzIG9mIGEgOCwgMjQgb3IgMzItYml0IGltYWdlIGJ5IGEgY2VydGFpbiBhbW91bnQuCisJQHBhcmFtIHBlcmNlbnRhZ2UgV2hlcmUgLTEwMCA8PSBwZXJjZW50YWdlIDw9IDEwMDxicj4KKwlBIHZhbHVlIDAgbWVhbnMgbm8gY2hhbmdlLCBsZXNzIHRoYW4gMCB3aWxsIG1ha2UgdGhlIGltYWdlIGRhcmtlciAKKwlhbmQgZ3JlYXRlciB0aGFuIDAgd2lsbCBtYWtlIHRoZSBpbWFnZSBicmlnaHRlci4KKwlAcmV0dXJuIFJldHVybnMgVFJVRSBpZiB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNmdWwsIEZBTFNFIG90aGVyd2lzZQorCUBzZWUgRnJlZUltYWdlX0FkanVzdEJyaWdodG5lc3MsIGFkanVzdEN1cnZlCisJKi8KKwlCT09MIGFkanVzdEJyaWdodG5lc3MoZG91YmxlIHBlcmNlbnRhZ2UpOworCisJLyoqIEBicmllZiBBZGp1c3RzIHRoZSBjb250cmFzdCBvZiBhIDgsIDI0IG9yIDMyLWJpdCBpbWFnZSBieSBhIGNlcnRhaW4gYW1vdW50LgorCUBwYXJhbSBwZXJjZW50YWdlIFdoZXJlIC0xMDAgPD0gcGVyY2VudGFnZSA8PSAxMDA8YnI+CisJQSB2YWx1ZSAwIG1lYW5zIG5vIGNoYW5nZSwgbGVzcyB0aGFuIDAgd2lsbCBkZWNyZWFzZSB0aGUgY29udHJhc3QgCisJYW5kIGdyZWF0ZXIgdGhhbiAwIHdpbGwgaW5jcmVhc2UgdGhlIGNvbnRyYXN0IG9mIHRoZSBpbWFnZS4KKwlAcmV0dXJuIFJldHVybnMgVFJVRSBpZiB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNmdWxsLCBGQUxTRSBvdGhlcndpc2UKKwlAc2VlIEZyZWVJbWFnZV9BZGp1c3RDb250cmFzdCwgYWRqdXN0Q3VydmUKKwkqLworCUJPT0wgYWRqdXN0Q29udHJhc3QoZG91YmxlIHBlcmNlbnRhZ2UpOworCisJLyoqCisJQWRqdXN0cyBhbiBpbWFnZSdzIGJyaWdodG5lc3MsIGNvbnRyYXN0IGFuZCBnYW1tYSB3aXRoaW4gYSBzaW5nbGUgb3BlcmF0aW9uLiAKKwlJZiBtb3JlIHRoYW4gb25lIG9mIHRoZXNlIGltYWdlIGRpc3BsYXkgcHJvcGVydGllcyBuZWVkIHRvIGJlIGFkanVzdGVkLCAKKwl1c2luZyB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBwcmVmZXJyZWQgb3ZlciBjYWxsaW5nIGVhY2ggYWRqdXN0bWVudCBmdW5jdGlvbiBzZXBhcmF0ZWx5LiAKKwlUaGF0J3MgcGFydGljdWxhcmx5IHRydWUgZm9yIGh1Z2UgaW1hZ2VzIG9yIGlmIHBlcmZvcm1hbmNlIGlzIGFuIGlzc3VlLiAKKwlAc2VlIGFkanVzdEJyaWdodG5lc3MKKwlAc2VlIGFkanVzdENvbnRyYXN0CisJQHNlZSBhZGp1c3RHYW1tYQorCUBzZWUgRnJlZUltYWdlX0FkanVzdENvbG9ycworCSovCisJQk9PTCBhZGp1c3RCcmlnaHRuZXNzQ29udHJhc3RHYW1tYShkb3VibGUgYnJpZ2h0bmVzcywgZG91YmxlIGNvbnRyYXN0LCBkb3VibGUgZ2FtbWEpOworCisJLyoqIEBicmllZiBDb21wdXRlcyBpbWFnZSBoaXN0b2dyYW0KKwkKKwlGb3IgMjQtYml0IGFuZCAzMi1iaXQgaW1hZ2VzLCBoaXN0b2dyYW0gY2FuIGJlIGNvbXB1dGVkIGZyb20gcmVkLCBncmVlbiwgYmx1ZSBhbmQgCisJYmxhY2sgY2hhbm5lbHMuIEZvciA4LWJpdCBpbWFnZXMsIGhpc3RvZ3JhbSBpcyBjb21wdXRlZCBmcm9tIHRoZSBibGFjayBjaGFubmVsLiBPdGhlciAKKwliaXQgZGVwdGggaXMgbm90IHN1cHBvcnRlZC4KKwlAcGFyYW0gaGlzdG8gcG9pbnRlciB0byBhbiBoaXN0b2dyYW0gYXJyYXkuIDxiPlNpemUgb2YgdGhpcyBhcnJheSBpcyBhc3N1bWVkIHRvIGJlIDI1NjwvYj4uCisJQHBhcmFtIGNoYW5uZWwgQ29sb3IgY2hhbm5lbCB0byB1c2UKKwlAcmV0dXJuIFJldHVybnMgVFJVRSBpZiB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNmdWxsLCBGQUxTRSBvdGhlcndpc2UKKwlAc2VlIEZyZWVJbWFnZV9HZXRIaXN0b2dyYW0KKwkqLworCUJPT0wgZ2V0SGlzdG9ncmFtKERXT1JEICpoaXN0bywgRlJFRV9JTUFHRV9DT0xPUl9DSEFOTkVMIGNoYW5uZWwgPSBGSUNDX0JMQUNLKSBjb25zdDsKKwkvL0B9CisKKwkvKipAbmFtZSBVcHNhbXBsaW5nIC8gZG93bnNhbXBsaW5nICovCisJLy9AewkKKworCS8qKiBAYnJpZWYgUmVzY2FsZSB0aGUgaW1hZ2UgdG8gYSBuZXcgd2lkdGggLyBoZWlnaHQuCisKKwlAcGFyYW0gbmV3X3dpZHRoIE5ldyBpbWFnZSB3aWR0aAorCUBwYXJhbSBuZXdfaGVpZ2h0IE5ldyBpbWFnZSBoZWlnaHQKKwlAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIgcGFyYW1ldGVyIHNwZWNpZmllcyB3aGljaCByZXNhbXBsaW5nIGZpbHRlciBzaG91bGQgYmUgdXNlZC4KKwlAcmV0dXJuIFJldHVybnMgVFJVRSBpZiB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UKKwlAc2VlIEZyZWVJbWFnZV9SZXNjYWxlLCBGUkVFX0lNQUdFX0ZJTFRFUgorCSovCisJQk9PTCByZXNjYWxlKHVuc2lnbmVkIG5ld193aWR0aCwgdW5zaWduZWQgbmV3X2hlaWdodCwgRlJFRV9JTUFHRV9GSUxURVIgZmlsdGVyKTsKKworCS8qKiBAYnJpZWYgQ3JlYXRlcyBhIHRodW1ibmFpbCBpbWFnZSBrZWVwaW5nIGFzcGVjdCByYXRpbworCisJQHBhcmFtIG1heF9zaXplIE1heGltdW0gd2lkdGggb3IgaGVpZ2h0IGluIHBpeGVsIHVuaXRzCisJQHBhcmFtIGNvbnZlcnQgV2hlbiBzZXQgdG8gVFJVRSwgY29udmVydHMgdGhlIGltYWdlIHRvIGEgc3RhbmRhcmQgdHlwZQorCUByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZQorCUBzZWUgRnJlZUltYWdlX01ha2VUaHVtYm5haWwKKwkqLworCUJPT0wgbWFrZVRodW1ibmFpbCh1bnNpZ25lZCBtYXhfc2l6ZSwgQk9PTCBjb252ZXJ0ID0gVFJVRSk7CisJLy9AfQorCisJLyoqQG5hbWUgSW1hZ2Ugc3RhdHVzICovCisJLy9AewkKKwkvKioKKwlTZXQgdGhlIGltYWdlIHN0YXR1cyBhcyAnbW9kaWZpZWQnLjxicj4KKwlXaGVuIHVzaW5nIHRoZSBmaXBXaW5JbWFnZSBjbGFzcywgdGhlIGltYWdlIHN0YXR1cyBpcyB1c2VkIHRvIHJlZnJlc2ggdGhlIGRpc3BsYXkuIAorCUl0IGlzIGNoYW5nZWQgdG8gRkFMU0Ugd2hlbmV2ZXIgdGhlIGRpc3BsYXkgaGFzIGp1c3QgYmVlbiByZWZyZXNoZWQuIAorCUBwYXJhbSBiU3RhdHVzIFRSVUUgaWYgdGhlIGltYWdlIHNob3VsZCBiZSBtYXJrZWQgYXMgbW9kaWZpZWQsIEZBTFNFIG90aGVyd2lzZQorCUBzZWUgaXNNb2RpZmllZAorCSovCisJdm9pZCBzZXRNb2RpZmllZChCT09MIGJTdGF0dXMgPSBUUlVFKSB7CisJCV9iSGFzQ2hhbmdlZCA9IGJTdGF0dXM7CisJfQorCisJLyoqCisJR2V0IHRoZSBpbWFnZSBzdGF0dXMKKwlAcmV0dXJuIFJldHVybnMgVFJVRSBpZiB0aGUgaW1hZ2UgaXMgbWFya2VkIGFzIG1vZGlmaWVkLCBGQUxTRSBvdGhlcndpc2UKKwlAc2VlIHNldE1vZGlmaWVkCisJKi8KKwlCT09MIGlzTW9kaWZpZWQoKSB7CisJCXJldHVybiBfYkhhc0NoYW5nZWQ7CisJfQorCS8vQH0KKworCS8qKkBuYW1lIE1ldGFkYXRhICovCisJLy9AewkKKwkvKioKKwlSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGFncyBjb250YWluZWQgaW4gdGhlIDxpPm1vZGVsPC9pPiBtZXRhZGF0YSBtb2RlbCAKKwlhdHRhY2hlZCB0byB0aGUgZGliCisJQHBhcmFtIG1vZGVsIE1ldGFkYXRhIG1vZGVsIHRvIGxvb2sgZm9yCisJKi8KKwl1bnNpZ25lZCBnZXRNZXRhZGF0YUNvdW50KEZSRUVfSU1BR0VfTURNT0RFTCBtb2RlbCkgY29uc3Q7CisJLyoqCisJUmV0cmlldmUgYSBtZXRhZGF0YSBhdHRhY2hlZCB0byB0aGUgZGliCisJQHBhcmFtIG1vZGVsIE1ldGFkYXRhIG1vZGVsIHRvIGxvb2sgZm9yCisJQHBhcmFtIGtleSBNZXRhZGF0YSBmaWVsZCBuYW1lIAorCUBwYXJhbSB0YWcgUmV0dXJuZWQgdGFnCisJQHJldHVybiBSZXR1cm5zIFRSVUUgaWYgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2VzZnVsbCwgRkFMU0Ugb3RoZXJ3aXNlCisJQHNlZSBGcmVlSW1hZ2VfR2V0TWV0YWRhdGEKKwkqLworCUJPT0wgZ2V0TWV0YWRhdGEoRlJFRV9JTUFHRV9NRE1PREVMIG1vZGVsLCBjb25zdCBjaGFyICprZXksIGZpcFRhZyYgdGFnKSBjb25zdDsKKwkvKioKKwlBdHRhY2ggYSBuZXcgRnJlZUltYWdlIHRhZyB0byB0aGUgZGliLjxicj4KKwk8Yj5TYW1wbGUgdXNlPC9iPiA6IDxicj4KKwk8cHJlPgorCWZpcEltYWdlIGltYWdlOworCS8vIC4uLgorCWZpcFRhZyB0YWc7CisJdGFnLnNldEtleVZhbHVlKCJDYXB0aW9uL0Fic3RyYWN0IiwgIm15IGNhcHRpb24iKTsKKwlpbWFnZS5zZXRNZXRhZGF0YShGSU1EX0lQVEMsIHRhZy5nZXRLZXkoKSwgdGFnKTsKKwl0YWcuc2V0S2V5VmFsdWUoIktleXdvcmRzIiwgIkZyZWVJbWFnZTtMaWJyYXJ5O0ltYWdlcztDb21wcmVzc2lvbiIpOworCWltYWdlLnNldE1ldGFkYXRhKEZJTURfSVBUQywgdGFnLmdldEtleSgpLCB0YWcpOworCTwvcHJlPgorCisJQHBhcmFtIG1vZGVsIE1ldGFkYXRhIG1vZGVsIHVzZWQgdG8gc3RvcmUgdGhlIHRhZworCUBwYXJhbSBrZXkgVGFnIGZpZWxkIG5hbWUgCisJQHBhcmFtIHRhZyBUYWcgdG8gYmUgYXR0YWNoZWQKKwlAcmV0dXJuIFJldHVybnMgVFJVRSBpZiB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNmdWxsLCBGQUxTRSBvdGhlcndpc2UKKwlAc2VlIEZyZWVJbWFnZV9TZXRNZXRhZGF0YQorCSovCisJQk9PTCBzZXRNZXRhZGF0YShGUkVFX0lNQUdFX01ETU9ERUwgbW9kZWwsIGNvbnN0IGNoYXIgKmtleSwgZmlwVGFnJiB0YWcpOworCS8vQH0KKworCisgIHByb3RlY3RlZDoKKwkvKipAbmFtZSBJbnRlcm5hbCB1c2UgKi8KKwkvL0B7CisJICBCT09MIHJlcGxhY2UoRklCSVRNQVAgKm5ld19kaWIpOworCS8vQH0KKworfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKiogQSBjbGFzcyBkZXNpZ25lZCBmb3IgTVMgV2luZG93cyAoVE0pIHBsYXRmb3Jtcy4KKworICAgIGZpcFdpbkltYWdlIHByb3ZpZGVzIG1ldGhvZHMgdXNlZCB0byA6CisJPHVsPgorCTxsaT5EaXNwbGF5IGEgRElCIG9uIHRoZSBzY3JlZW4KKwk8bGk+Q29weSAvIFBhc3RlIGEgRElCIHRvL2Zyb20gV2luZG93cyBkZXZpY2VzIChIQU5ETEUsIEhCSVRNQVAsIENsaXBib2FyZCkKKwk8bGk+Q2FwdHVyZSBhIHdpbmRvdyAoSFdORCkgYW5kIGNvbnZlcnQgaXQgdG8gYW4gaW1hZ2UKKwk8L3VsPgorCUB2ZXJzaW9uIEZyZWVJbWFnZSAzCisJQGF1dGhvciBIZXJ26SBEcm9sb24KKyovCisjaWZkZWYgX1dJTjMyCisKK2NsYXNzIEZJUF9BUEkgZmlwV2luSW1hZ2UgOiBwdWJsaWMgZmlwSW1hZ2UKK3sKK3B1YmxpYzoKKwkvKipAbmFtZSBDcmVhdGlvbiAmIERlc3RydWN0aW9uICovCisJLy9AewkKKwkvLy8gQ29uc3RydWN0b3IKKwlmaXBXaW5JbWFnZShGUkVFX0lNQUdFX1RZUEUgaW1hZ2VfdHlwZSA9IEZJVF9CSVRNQVAsIHVuc2lnbmVkIHdpZHRoID0gMCwgdW5zaWduZWQgaGVpZ2h0ID0gMCwgdW5zaWduZWQgYnBwID0gMCk7CisKKwkvLy8gRGVzdHJ1Y3RvcgorCXZpcnR1YWwgfmZpcFdpbkltYWdlKCk7CisKKwkvLy8gRGVzdHJveSBpbWFnZSBkYXRhCisJdmlydHVhbCB2b2lkIGNsZWFyKCk7CisKKwkvLy8gUmV0dXJucyBUUlVFIGlmIHRoZSBpbWFnZSBpcyBhbGxvY2F0ZWQsIEZBTFNFIG90aGVyd2lzZQorCUJPT0wgaXNWYWxpZCgpIGNvbnN0OworCS8vQH0KKworCS8qKkBuYW1lIENvcHlpbmcgKi8KKwkvL0B7CQorCisJLyoqCisJQ29weSBjb25zdHJ1Y3Rvci4gCisJRGVsZXRlIGludGVybmFsIF9kaXNwbGF5X2RpYiBkYXRhIGFuZCBjb3B5IHRoZSBiYXNlIGNsYXNzIGltYWdlIGRhdGEuIAorCVRvbmUgbWFwcGluZyBwYXJhbWV0ZXJzIGFyZSBsZWZ0IHVuY2hhbmdlZC4gCisJQHNlZSBGcmVlSW1hZ2VfQ2xvbmUKKwkqLworCWZpcFdpbkltYWdlJiBvcGVyYXRvcj0oY29uc3QgZmlwSW1hZ2UmIHNyYyk7CisKKwkvKioKKwlDb3B5IGNvbnN0cnVjdG9yCisJRGVsZXRlIGludGVybmFsIF9kaXNwbGF5X2RpYiBkYXRhIGFuZCBjb3B5IHRvbmUgbWFwcGluZyBwYXJhbWV0ZXJzLiAKKwlDb3B5IGFsc28gdGhlIGJhc2UgY2xhc3MgaW1hZ2UgZGF0YS4gCisJQHNlZSBGcmVlSW1hZ2VfQ2xvbmUKKwkqLworCWZpcFdpbkltYWdlJiBvcGVyYXRvcj0oY29uc3QgZmlwV2luSW1hZ2UmIHNyYyk7CisKKwkvKiogQ2xvbmUgZnVuY3Rpb24gdXNlZCBmb3IgY2xpcGJvYXJkIGNvcHkuPGJyPgorCUNvbnZlcnQgdGhlIEZJQklUTUFQIGltYWdlIHRvIGEgRElCLCAKKwlhbmQgdHJhbnNmZXIgdGhlIERJQiBpbiBhIGdsb2JhbCBiaXRtYXAgaGFuZGxlLjxicj4KKwlGb3Igbm9uIHN0YW5kYXJkIGJpdG1hcHMsIHRoZSBCSVRNQVBJTkZPSEVBREVSLT5iaUNvbXByZXNzaW9uIGZpZWxkIGlzIHNldCB0byAweEZGICsgRnJlZUltYWdlX0dldEltYWdlVHlwZShfZGliKSwgCisJaW4gb3JkZXIgdG8gcmVjb2duaXplIHRoZSBiaXRtYXAgYXMgbm9uIHN0YW5kYXJkLiAKKwkqLworCUhBTkRMRSBjb3B5VG9IYW5kbGUoKSBjb25zdDsKKworCS8qKiBDb3B5IGNvbnN0cnVjdG9yIHVzZWQgZm9yIGNsaXBib2FyZCBwYXN0ZS48YnI+CisJQ29udmVydHMgYSBnbG9iYWwgb2JqZWN0IHRvIGEgRklCSVRNQVAuIFRoZSBjbGlwYm9hcmQgZm9ybWF0IG11c3QgYmUgQ0ZfRElCLjxicj4KKwlXaGVuIHRoZSBCSVRNQVBJTkZPSEVBREVSLT5iaUNvbXByZXNzaW9uIGZpZWxkIGlzIHNldCB0byAweEZGICsgW29uZSBvZiB0aGUgcHJlZGVmaW5lZCBGUkVFX0lNQUdFX1RZUEVdLCAKKwl0aGUgYml0bWFwIGlzIHJlY29nbml6ZWQgYXMgbm9uIHN0YW5kYXJkIGFuZCBjb3JyZWN0bHkgY29waWVkLiAKKwlAcmV0dXJuIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsLCByZXR1cm5zIEZBTFNFIG90aGVyd2lzZQorCSovCisJQk9PTCBjb3B5RnJvbUhhbmRsZShIQU5ETEUgaE1lbSk7CisKKwkvKiogQ29weSBjb25zdHJ1Y3Rvci48YnI+CisJQ29udmVydHMgYSBIQklUTUFQIG9iamVjdCB0byBhIEZJQklUTUFQLgorCUByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgRkFMU0Ugb3RoZXJ3aXNlCisJKi8KKwlCT09MIGNvcHlGcm9tQml0bWFwKEhCSVRNQVAgaGJtcCk7CisJLy9AfQorCisJLyoqQG5hbWUgQ2xpcGJvYXJkIG9wZXJhdGlvbnMgKi8KKwkvL0B7CQorCS8qKgorCUNsaXBib2FyZCBjb3B5LgorCUBwYXJhbSBoV25kTmV3T3duZXIgSGFuZGxlIHRvIHRoZSB3aW5kb3cgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcGVuIGNsaXBib2FyZC4gCisJSW4gTUZDLCB5b3UgY2FuIHVzZSBBZnhHZXRBcHAoKS0+bV9wTWFpblduZC0+R2V0U2FmZUh3bmQoKS4KKwlAcmV0dXJuIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsLCByZXR1cm5zIEZBTFNFIG90aGVyd2lzZQorCSovCisJQk9PTCBjb3B5VG9DbGlwYm9hcmQoSFdORCBoV25kTmV3T3duZXIpIGNvbnN0OworCisJLyoqCisJUmV0cmlldmVzIGRhdGEgZnJvbSB0aGUgY2xpcGJvYXJkLiBUaGUgY2xpcGJvYXJkIGZvcm1hdCBtdXN0IGJlIENGX0RJQi4KKwlAcmV0dXJuIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsLCByZXR1cm5zIEZBTFNFIG90aGVyd2lzZQorCSovCisJQk9PTCBwYXN0ZUZyb21DbGlwYm9hcmQoKTsKKwkvL0B9CisKKwkvKipAbmFtZSBTY3JlZW4gY2FwdHVyZSAqLworCS8vQHsJCisJLyoqIENhcHR1cmUgYSB3aW5kb3cgYW5kIGNvbnZlcnQgaXQgdG8gYW4gaW1hZ2UKKwlAcGFyYW0gaFduZEFwcGxpY2F0aW9uV2luZG93IEhhbmRsZSB0byB0aGUgYXBwbGljYXRpb24gbWFpbiB3aW5kb3cKKwlAcGFyYW0gaFduZFNlbGVjdGVkV2luZG93IEhhbmRsZSB0byB0aGUgd2luZG93IHRvIGJlIGNhcHR1cmVkCisJQHJldHVybiBSZXR1cm5zIFRSVUUgaWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyBGQUxTRSBvdGhlcndpc2UKKwkqLworCUJPT0wgY2FwdHVyZVdpbmRvdyhIV05EIGhXbmRBcHBsaWNhdGlvbldpbmRvdywgSFdORCBoV25kU2VsZWN0ZWRXaW5kb3cpOworCS8vQH0KKworCisJLyoqQG5hbWUgUGFpbnRpbmcgb3BlcmF0aW9ucyAqLworCS8vQHsJCisKKwkvKiogQGJyaWVmIERyYXcgKHN0cmV0Y2gpIHRoZSBpbWFnZSBvbiBhIEhEQywgdXNpbmcgU3RyZXRjaERJQml0cy4KKworICAgIFdoZW4gdGhlIGltYWdlIGlzIHRyYW5zcGFyZW50IG9yIGhhcyBhIGZpbGUgYmFja2dyb3VuZCwgdGhpcyBmdW5jdGlvbiBjb21wb3NpdGUgCisJdGhlIGZvcmVncm91bmQgaW1hZ2UgYWdhaW5zdCBhIGNoZWNrZXJib2FyZCBiYWNrZ3JvdW5kIGltYWdlLgorCUBwYXJhbSBoREMgSGFuZGxlIHRvIHRoZSBkZXZpY2UgY29udGV4dAorCUBwYXJhbSByY0Rlc3QgRGVzdGluYXRpb24gcmVjdGFuZ2xlCisJQHNlZSBGcmVlSW1hZ2VfQ29tcG9zaXRlCisJKi8KKwl2b2lkIGRyYXcoSERDIGhEQywgUkVDVCYgcmNEZXN0KSBjb25zdCB7CisJCWRyYXdFeChoREMsIHJjRGVzdCwgRkFMU0UsIE5VTEwsIE5VTEwpOworCX0KKworCS8qKiBAYnJpZWYgRHJhdyAoc3RyZXRjaCkgdGhlIGltYWdlIG9uIGEgSERDLCB1c2luZyBTdHJldGNoRElCaXRzLgorCisgICAgV2hlbiB0aGUgaW1hZ2UgaXMgdHJhbnNwYXJlbnQgb3IgaGFzIGEgZmlsZSBiYWNrZ3JvdW5kLCB0aGlzIGZ1bmN0aW9uIGNhbiBjb21wb3NpdGUgCisJdGhlIGZvcmVncm91bmQgaW1hZ2UgYWdhaW5zdCBhIGNoZWNrZXJib2FyZCBiYWNrZ3JvdW5kIGltYWdlLCBhZ2FpbnN0IGEgc2luZ2xlIGJhY2tncm91bmQgY29sb3Igb3IgCisJYWdhaW5zdCBhIHVzZXIgYmFja2dyb3VuZCBpbWFnZS48YnI+CisJV2hlbiB0aGUgaW1hZ2UgaXMgYSBIaWdoIER5bmFtaWMgUmFuZ2UgaW1hZ2UgKDQ4LWJpdCBvciBSR0IgZmxvYXQpLCB0aGlzIGZ1bmN0aW9uIHdpbGwgYXBwbHkgYSAKKwl0b25lIG1hcHBpbmcgb3BlcmF0b3IgYmVmb3JlIGRyYXdpbmcgdGhlIGltYWdlLjxicj4KKwlUaGUgb3JpZ2luYWwgaW1hZ2UgKGxvY2F0ZWQgaW4gdGhlIGZpcEltYWdlIGNsYXNzKSB3aWxsIG5vdCBiZSBhZmZlY3RlZCBieSBhbnkgb2YgdGhlIG9wZXJhdGlvbnMgCisJdGhhdCBjb3VsZCBiZSBkb25lIGluIG9yZGVyIHRvIGRpc3BsYXkgaXQuIAorCUBwYXJhbSBoREMgSGFuZGxlIHRvIHRoZSBkZXZpY2UgY29udGV4dAorCUBwYXJhbSByY0Rlc3QgRGVzdGluYXRpb24gcmVjdGFuZ2xlCisJQHBhcmFtIHVzZUZpbGVCa2cgV2hlbiBzZXQgdG8gVFJVRSwgdGhlIGZ1bmN0aW9uIHVzZXMgdGhlIGZpbGUgY29sb3IgYmFja2dyb3VuZCBpZiB0aGVyZSBpcyBvbmUKKwlAcGFyYW0gYXBwQmtDb2xvciBXaGVuIGEgY29sb3IgaXMgZ2l2ZW4sIHRoZSBmdW5jdGlvbiB1c2VzIGl0IGFzIHRoZSBiYWNrZ3JvdW5kIGNvbG9yCisJQHBhcmFtIGJnIFdoZW4gYSBGSUJJVE1BUCBpcyBnaXZlbiwgdGhlIGZ1bmN0aW9uIHVzZXMgaXQgYXMgdGhlIGJhY2tncm91bmQgaW1hZ2UKKwlAc2VlIEZyZWVJbWFnZV9Db21wb3NpdGUKKwlAc2VlIHNldFRvbmVNYXBwaW5nT3BlcmF0b3IKKwkqLworCXZvaWQgZHJhd0V4KEhEQyBoREMsIFJFQ1QmIHJjRGVzdCwgQk9PTCB1c2VGaWxlQmtnID0gRkFMU0UsIFJHQlFVQUQgKmFwcEJrQ29sb3IgPSBOVUxMLCBGSUJJVE1BUCAqYmcgPSBOVUxMKSBjb25zdDsKKworCS8qKgorCVNlbGVjdCBhIHRvbmUgbWFwcGluZyBhbGdvcml0aG0gdXNlZCBmb3IgZHJhd2luZyBhbmQgc2V0IHRoZSBpbWFnZSBhcyBtb2RpZmllZCAKKwlzbyB0aGF0IHRoZSBkaXNwbGF5IHdpbGwgYmUgcmVmcmVzaGVkLgorCUBwYXJhbSB0bW8gVG9uZSBtYXBwaW5nIG9wZXJhdG9yCisJQHBhcmFtIGZpcnN0X3BhcmFtIEZpcnN0IHRvbmUgbWFwcGluZyBhbGdvcml0aG0gcGFyYW1ldGVyCisJQHBhcmFtIHNlY29uZF9wYXJhbSBTZWNvbmQgdG9uZSBtYXBwaW5nIGFsZ29yaXRobSBwYXJhbWV0ZXIKKwlAcGFyYW0gdGhpcmRfcGFyYW0gVGhpcmQgdG9uZSBtYXBwaW5nIGFsZ29yaXRobSBwYXJhbWV0ZXIKKwlAcGFyYW0gZm91cnRoX3BhcmFtIEZvdXJ0aCB0b25lIG1hcHBpbmcgYWxnb3JpdGhtIHBhcmFtZXRlcgorCUBzZWUgRnJlZUltYWdlX1RvbmVNYXBwaW5nCisJKi8KKwl2b2lkIHNldFRvbmVNYXBwaW5nT3BlcmF0b3IoRlJFRV9JTUFHRV9UTU8gdG1vLCBkb3VibGUgZmlyc3RfcGFyYW0gPSAwLCBkb3VibGUgc2Vjb25kX3BhcmFtID0gMCwgZG91YmxlIHRoaXJkX3BhcmFtID0gMSwgZG91YmxlIGZvdXJ0aF9wYXJhbSA9IDApOworCisJLyoqCisJR2V0IHRoZSB0b25lIG1hcHBpbmcgYWxnb3JpdGhtIHVzZWQgZm9yIGRyYXdpbmcsIHdpdGggaXRzIHBhcmFtZXRlcnMuCisJQHBhcmFtIHRtbyBUb25lIG1hcHBpbmcgb3BlcmF0b3IKKwlAcGFyYW0gZmlyc3RfcGFyYW0gRmlyc3QgdG9uZSBtYXBwaW5nIGFsZ29yaXRobSBwYXJhbWV0ZXIKKwlAcGFyYW0gc2Vjb25kX3BhcmFtIFNlY29uZCB0b25lIG1hcHBpbmcgYWxnb3JpdGhtIHBhcmFtZXRlcgorCUBwYXJhbSB0aGlyZF9wYXJhbSBUaGlyZCB0b25lIG1hcHBpbmcgYWxnb3JpdGhtIHBhcmFtZXRlcgorCUBwYXJhbSBmb3VydGhfcGFyYW0gRm91cnRoIHRvbmUgbWFwcGluZyBhbGdvcml0aG0gcGFyYW1ldGVyCisJQHNlZSBGcmVlSW1hZ2VfVG9uZU1hcHBpbmcKKwkqLworCXZvaWQgZ2V0VG9uZU1hcHBpbmdPcGVyYXRvcihGUkVFX0lNQUdFX1RNTyAqdG1vLCBkb3VibGUgKmZpcnN0X3BhcmFtLCBkb3VibGUgKnNlY29uZF9wYXJhbSwgZG91YmxlICp0aGlyZF9wYXJhbSwgZG91YmxlICpmb3VydGhfcGFyYW0pIGNvbnN0OworCisJLy9AfQorCitwcm90ZWN0ZWQ6CisJLy8vIERJQiB1c2VkIGZvciBkaXNwbGF5ICh0aGlzIGFsbG93IHRvIGRpc3BsYXkgbm9uLXN0YW5kYXJkIGJpdG1hcHMpCisJbXV0YWJsZSBGSUJJVE1BUCAqX2Rpc3BsYXlfZGliOworCS8vLyByZW1lbWJlciB0byBkZWxldGUgX2Rpc3BsYXlfZGliCisJbXV0YWJsZSBCT09MIF9iRGVsZXRlTWU7CisJLy8vIHRvbmUgbWFwcGluZyBvcGVyYXRvcgorCUZSRUVfSU1BR0VfVE1PIF90bW87CisJLy8vIGZpcnN0IHRvbmUgbWFwcGluZyBhbGdvcml0aG0gcGFyYW1ldGVyCisJZG91YmxlIF90bW9fcGFyYW1fMTsKKwkvLy8gc2Vjb25kIHRvbmUgbWFwcGluZyBhbGdvcml0aG0gcGFyYW1ldGVyCisJZG91YmxlIF90bW9fcGFyYW1fMjsKKwkvLy8gdGhpcmQgdG9uZSBtYXBwaW5nIGFsZ29yaXRobSBwYXJhbWV0ZXIKKwlkb3VibGUgX3Rtb19wYXJhbV8zOworCS8vLyBmb3VydGggdG9uZSBtYXBwaW5nIGFsZ29yaXRobSBwYXJhbWV0ZXIKKwlkb3VibGUgX3Rtb19wYXJhbV80OworfTsKKworI2VuZGlmIC8vIF9XSU4zMgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qKiBNZW1vcnkgaGFuZGxlCisJCisJZmlwTWVtb3J5SU8gaXMgYSBjbGFzcyB0aGF0IGFsbG93cyB5b3UgdG8gbG9hZCAvIHNhdmUgaW1hZ2VzIGZyb20gLyB0byBhIG1lbW9yeSBzdHJlYW0uCisJQHZlcnNpb24gRnJlZUltYWdlIDMKKwlAYXV0aG9yIEhlcnbpIERyb2xvbgorKi8KK2NsYXNzIEZJUF9BUEkgZmlwTWVtb3J5SU8gOiBwdWJsaWMgZmlwT2JqZWN0Cit7Citwcm90ZWN0ZWQ6CisJLy8vIFBvaW50ZXIgdG8gYSBtZW1vcnkgc3RyZWFtCisJRklNRU1PUlkgKl9obWVtOworCitwdWJsaWMgOgorCS8qKiBDb25zdHJ1Y3Rvci4KKwlXcmFwIGEgbWVtb3J5IGJ1ZmZlciBjb250YWluaW5nIGltYWdlIGRhdGEuPGJyPgorCVRoZSBtZW1vcnkgYnVmZmVyIGlzIHJlYWQgb25seSBhbmQgaGFzIHRvIGJlIGZyZWVkIGJ5IHRoZSB1c2VyIAorCXdoZW4gbm8gbG9uZ2VyIGluIHVzZS48YnI+CisJV2hlbiBkZWZhdWx0IGFyZ3VtZW50cyBhcmUgdXNlZCwgb3BlbiBhIG1lbW9yeSBmaWxlIGFzIHJlYWQvd3JpdGUuIAorCUBwYXJhbSBkYXRhIFBvaW50ZXIgdG8gdGhlIG1lbW9yeSBidWZmZXIKKwlAcGFyYW0gc2l6ZV9pbl9ieXRlcyBCdWZmZXIgc2l6ZSBpbiBieXRlcworCUBzZWUgRnJlZUltYWdlX09wZW5NZW1vcnkKKwkqLworICAgIGZpcE1lbW9yeUlPKEJZVEUgKmRhdGEgPSBOVUxMLCBEV09SRCBzaXplX2luX2J5dGVzID0gMCk7CisKKwkvKiogRGVzdHJ1Y3Rvci4KKwlGcmVlIGFueSBhbGxvY2F0ZWQgbWVtb3J5CisJQHNlZSBGcmVlSW1hZ2VfQ2xvc2VNZW1vcnkKKwkqLworCXZpcnR1YWwgfmZpcE1lbW9yeUlPKCk7CisKKwkvKiogRGVzdHJ1Y3Rvci4KKwlGcmVlIGFueSBhbGxvY2F0ZWQgbWVtb3J5IGFuZCBpbnZhbGlkYXRlIHRoZSBzdHJlYW0KKwlAc2VlIEZyZWVJbWFnZV9DbG9zZU1lbW9yeQorCSovCisJdm9pZCBjbG9zZSgpOworCisJLyoqIFJldHVybnMgVFJVRSBpZiB0aGUgaW50ZXJuYWwgbWVtb3J5IGJ1ZmZlciBpcyBhIHZhbGlkIGJ1ZmZlciwgcmV0dXJucyBGQUxTRSBvdGhlcndpc2UKKwkqLworCUJPT0wgaXNWYWxpZCgpIGNvbnN0OworCisJLyoqIFJldHVybnMgdGhlIGJ1ZmZlciBpbWFnZSBmb3JtYXQKKwlAc2VlIEZyZWVJbWFnZV9HZXRGaWxlVHlwZUZyb21NZW1vcnkKKwkqLworCUZSRUVfSU1BR0VfRk9STUFUIGdldEZpbGVUeXBlKCkgY29uc3Q7CisKKwkvKioKKwlSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgRklNRU1PUlkgZGF0YS4gVXNlZCBmb3IgZGlyZWN0IGFjY2VzcyBmcm9tIEZSRUVJTUFHRSBmdW5jdGlvbnMgCisJb3IgZnJvbSB5b3VyIG93biBsb3cgbGV2ZWwgQyBmdW5jdGlvbnMuCisJKi8KKwlvcGVyYXRvciBGSU1FTU9SWSooKSB7IAorCQlyZXR1cm4gX2htZW07IAorCX0KKworCS8qKkBuYW1lIE1lbW9yeSBJTyByb3V0aW5lcyAqLworCS8vQHsJCisJLyoqCisJTG9hZHMgYSBkaWIgZnJvbSBhIG1lbW9yeSBzdHJlYW0KKwlAcGFyYW0gZmlmIEZvcm1hdCBpZGVudGlmaWVyIChGcmVlSW1hZ2UgZm9ybWF0KQorCUBwYXJhbSBmbGFncyBUaGUgc2lnbmlmaWNhdGlvbiBvZiB0aGlzIGZsYWcgZGVwZW5kcyBvbiB0aGUgaW1hZ2UgdG8gYmUgbG9hZGVkLgorCUByZXR1cm4gUmV0dXJucyB0aGUgbG9hZGVkIGRpYiBpZiBzdWNjZXNzZnVsLCByZXR1cm5zIE5VTEwgb3RoZXJ3aXNlCisJQHNlZSBGcmVlSW1hZ2VfTG9hZEZyb21NZW1vcnkKKwkqLworCUZJQklUTUFQKiBsb2FkKEZSRUVfSU1BR0VfRk9STUFUIGZpZiwgaW50IGZsYWdzID0gMCkgY29uc3Q7CisJLyoqCisJTG9hZHMgYSBtdWx0aS1wYWdlIGJpdG1hcCBmcm9tIGEgbWVtb3J5IHN0cmVhbQorCUBwYXJhbSBmaWYgRm9ybWF0IGlkZW50aWZpZXIgKEZyZWVJbWFnZSBmb3JtYXQpCisJQHBhcmFtIGZsYWdzIFRoZSBzaWduaWZpY2F0aW9uIG9mIHRoaXMgZmxhZyBkZXBlbmRzIG9uIHRoZSBtdWx0aS1wYWdlIHRvIGJlIGxvYWRlZC4KKwlAcmV0dXJuIFJldHVybnMgdGhlIGxvYWRlZCBtdWx0aS1wYWdlIGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgTlVMTCBvdGhlcndpc2UKKwlAc2VlIEZyZWVJbWFnZV9Mb2FkTXVsdGlCaXRtYXBGcm9tTWVtb3J5CisJKi8KKwlGSU1VTFRJQklUTUFQKiBsb2FkTXVsdGlQYWdlKEZSRUVfSU1BR0VfRk9STUFUIGZpZiwgaW50IGZsYWdzID0gMCkgY29uc3Q7CisJLyoqCisJU2F2ZXMgYSBkaWIgdG8gYSBtZW1vcnkgc3RyZWFtCisJQHBhcmFtIGZpZiBGb3JtYXQgaWRlbnRpZmllciAoRnJlZUltYWdlIGZvcm1hdCkKKwlAcGFyYW0gZGliIEltYWdlIHRvIGJlIHNhdmVkCisJQHBhcmFtIGZsYWdzIFRoZSBzaWduaWZpY2F0aW9uIG9mIHRoaXMgZmxhZyBkZXBlbmRzIG9uIHRoZSBpbWFnZSB0byBiZSBzYXZlZC4KKwlAcmV0dXJuIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsLCByZXR1cm5zIEZBTFNFIG90aGVyd2lzZQorCUBzZWUgRnJlZUltYWdlX1NhdmVUb01lbW9yeQorCSovCisJQk9PTCBzYXZlKEZSRUVfSU1BR0VfRk9STUFUIGZpZiwgRklCSVRNQVAgKmRpYiwgaW50IGZsYWdzID0gMCk7CisJLyoqCisJU2F2ZXMgYSBtdWx0aS1wYWdlIGJpdG1hcCB0byBhIG1lbW9yeSBzdHJlYW0KKwlAcGFyYW0gZmlmIEZvcm1hdCBpZGVudGlmaWVyIChGcmVlSW1hZ2UgZm9ybWF0KQorCUBwYXJhbSBiaXRtYXAgTXVsdGktcGFnZSBpbWFnZSB0byBiZSBzYXZlZAorCUBwYXJhbSBmbGFncyBUaGUgc2lnbmlmaWNhdGlvbiBvZiB0aGlzIGZsYWcgZGVwZW5kcyBvbiB0aGUgaW1hZ2UgdG8gYmUgc2F2ZWQuCisJQHJldHVybiBSZXR1cm5zIFRSVUUgaWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyBGQUxTRSBvdGhlcndpc2UKKwlAc2VlIEZyZWVJbWFnZV9TYXZlTXVsdGlCaXRtYXBUb01lbW9yeQorCSovCisJQk9PTCBzYXZlTXVsdGlQYWdlKEZSRUVfSU1BR0VfRk9STUFUIGZpZiwgRklNVUxUSUJJVE1BUCAqYml0bWFwLCBpbnQgZmxhZ3MgPSAwKTsKKwkvKioKKwlSZWFkcyBkYXRhIGZyb20gYSBtZW1vcnkgc3RyZWFtCisJQHBhcmFtIGJ1ZmZlciBTdG9yYWdlIGxvY2F0aW9uIGZvciBkYXRhCisJQHBhcmFtIHNpemUgSXRlbSBzaXplIGluIGJ5dGVzCisJQHBhcmFtIGNvdW50IE1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIHRvIGJlIHJlYWQKKwlAcmV0dXJuIFJldHVybnMgdGhlIG51bWJlciBvZiBmdWxsIGl0ZW1zIGFjdHVhbGx5IHJlYWQsIHdoaWNoIG1heSBiZSBsZXNzIHRoYW4gY291bnQgaWYgYW4gZXJyb3Igb2NjdXJzCisJQHNlZSBGcmVlSW1hZ2VfUmVhZE1lbW9yeQorCSovCisJdW5zaWduZWQgcmVhZCh2b2lkICpidWZmZXIsIHVuc2lnbmVkIHNpemUsIHVuc2lnbmVkIGNvdW50KSBjb25zdDsKKwkvKioKKwlXcml0ZXMgZGF0YSB0byBhIG1lbW9yeSBzdHJlYW0KKwlAcGFyYW0gYnVmZmVyIFBvaW50ZXIgdG8gZGF0YSB0byBiZSB3cml0dGVuCisJQHBhcmFtIHNpemUgSXRlbSBzaXplIGluIGJ5dGVzCisJQHBhcmFtIGNvdW50IE1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIHRvIGJlIHdyaXR0ZW4KKwlAcmV0dXJuIFJldHVybnMgdGhlIG51bWJlciBvZiBmdWxsIGl0ZW1zIGFjdHVhbGx5IHdyaXR0ZW4sIHdoaWNoIG1heSBiZSBsZXNzIHRoYW4gY291bnQgaWYgYW4gZXJyb3Igb2NjdXJzCisJQHNlZSBGcmVlSW1hZ2VfV3JpdGVNZW1vcnkKKwkqLworCXVuc2lnbmVkIHdyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgc2l6ZSwgdW5zaWduZWQgY291bnQpOworCS8qKgorCUdldHMgdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgYSBtZW1vcnkgcG9pbnRlcgorCUBzZWUgRnJlZUltYWdlX1RlbGxNZW1vcnkKKwkqLworCWxvbmcgdGVsbCgpIGNvbnN0OworCS8qKgorCU1vdmVzIHRoZSBtZW1vcnkgcG9pbnRlciB0byBhIHNwZWNpZmllZCBsb2NhdGlvbgorCUBzZWUgRnJlZUltYWdlX1NlZWtNZW1vcnkKKwkqLworCUJPT0wgc2Vlayhsb25nIG9mZnNldCwgaW50IG9yaWdpbik7CisJLyoqCisJUHJvdmlkZXMgYSBkaXJlY3QgYnVmZmVyIGFjY2VzcyB0byBhIG1lbW9yeSBzdHJlYW0KKwlAcGFyYW0gZGF0YSBQb2ludGVyIHRvIHRoZSBtZW1vcnkgYnVmZmVyIChyZXR1cm5lZCB2YWx1ZSkKKwlAcGFyYW0gc2l6ZV9pbl9ieXRlcyBCdWZmZXIgc2l6ZSBpbiBieXRlcyAocmV0dXJuZWQgdmFsdWUpCisJQHNlZSBGcmVlSW1hZ2VfQWNxdWlyZU1lbW9yeQorCSovCisJQk9PTCBhY3F1aXJlKEJZVEUgKipkYXRhLCBEV09SRCAqc2l6ZV9pbl9ieXRlcyk7CisJLy9AfQorCitwcml2YXRlOgorCS8vLyBEaXNhYmxlIGNvcHkKKwlmaXBNZW1vcnlJTyhjb25zdCBmaXBNZW1vcnlJTyYgc3JjKTsKKwkvLy8gRGlzYWJsZSBjb3B5CisJZmlwTWVtb3J5SU8mIG9wZXJhdG9yPShjb25zdCBmaXBNZW1vcnlJTyYgc3JjKTsKKworfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKiogTXVsdGktcGFnZSBmaWxlIHN0cmVhbQorCisJZmlwTXVsdGlQYWdlIGVuY2Fwc3VsYXRlcyB0aGUgbXVsdGktcGFnZSBBUEkuIEl0IHN1cHBvcnRzIHJlYWRpbmcvd3JpdGluZyAKKwltdWx0aS1wYWdlIFRJRkYsIElDTyBhbmQgR0lGIGZpbGVzLiAKKyovCitjbGFzcyBGSVBfQVBJIGZpcE11bHRpUGFnZSA6IHB1YmxpYyBmaXBPYmplY3QgCit7Citwcm90ZWN0ZWQ6CisJLy8vIFBvaW50ZXIgdG8gYSBtdWx0aS1wYWdlIGZpbGUgc3RyZWFtCisJRklNVUxUSUJJVE1BUCAqX21wYWdlOworCS8vLyBUUlVFIHdoZW4gdXNpbmcgYSBtZW1vcnkgY2FjaGUsIEZBTFNFIG90aGVyd2lzZQorCUJPT0wgX2JNZW1vcnlDYWNoZTsKKworcHVibGljOgorCS8qKgorCUNvbnN0cnVjdG9yCisJQHBhcmFtIGtlZXBfY2FjaGVfaW5fbWVtb3J5IFdoZW4gaXQgaXMgVFJVRSwgYWxsIGdhdGhlcmVkIGJpdG1hcCBkYXRhIGluIHRoZSBwYWdlIG1hbmlwdWxhdGlvbiBwcm9jZXNzIGlzIGtlcHQgaW4gbWVtb3J5LCBvdGhlcndpc2UgaXQgaXMgbGF6aWx5IGZsdXNoZWQgdG8gYSB0ZW1wb3JhcnkgZmlsZSBvbiB0aGUgaGFyZCBkaXNrIGluIDY0IEtiIGJsb2Nrcy4KKwkqLworCWZpcE11bHRpUGFnZShCT09MIGtlZXBfY2FjaGVfaW5fbWVtb3J5ID0gRkFMU0UpOworCisJLyoqCisJRGVzdHJ1Y3RvcgorCUNsb3NlIHRoZSBmaWxlIHN0cmVhbSBpZiBub3QgYWxyZWFkeSBkb25lLiAKKwkqLworCXZpcnR1YWwgfmZpcE11bHRpUGFnZSgpOworCisJLy8vIFJldHVybnMgVFJVRSBpZiB0aGUgbXVsdGktcGFnZSBzdHJlYW0gaXMgb3BlbmVkCisJQk9PTCBpc1ZhbGlkKCkgY29uc3Q7CisKKwkvKioKKwlSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgRklNVUxUSUJJVE1BUCBkYXRhLiBVc2VkIGZvciBkaXJlY3QgYWNjZXNzIGZyb20gRlJFRUlNQUdFIGZ1bmN0aW9ucyAKKwlvciBmcm9tIHlvdXIgb3duIGxvdyBsZXZlbCBDIGZ1bmN0aW9ucy4KKwkqLworCW9wZXJhdG9yIEZJTVVMVElCSVRNQVAqKCkgeyAKKwkJcmV0dXJuIF9tcGFnZTsgCisJfQorCisJLyoqCisJT3BlbiBhIG11bHRpLXBhZ2UgZmlsZSBzdHJlYW0KKwlAcGFyYW0gbHBzelBhdGhOYW1lIE5hbWUgb2YgdGhlIG11bHRpLXBhZ2UgYml0bWFwIGZpbGUKKwlAcGFyYW0gY3JlYXRlX25ldyBXaGVuIFRSVUUsIGl0IG1lYW5zIHRoYXQgYSBuZXcgYml0bWFwIHdpbGwgYmUgY3JlYXRlZCByYXRoZXIgdGhhbiBhbiBleGlzdGluZyBvbmUgYmVpbmcgb3BlbmVkCisJQHBhcmFtIHJlYWRfb25seSBXaGVuIFRSVUUgdGhlIGJpdG1hcCBpcyBvcGVuZWQgcmVhZC1vbmx5CisJQHBhcmFtIGZsYWdzIExvYWQgZmxhZ3MuIFRoZSBzaWduaWZpY2F0aW9uIG9mIHRoaXMgZmxhZyBkZXBlbmRzIG9uIHRoZSBpbWFnZSB0byBiZSBsb2FkZWQuCisJQHJldHVybiBSZXR1cm5zIFRSVUUgaWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyBGQUxTRSBvdGhlcndpc2UKKwlAc2VlIEZyZWVJbWFnZV9PcGVuTXVsdGlCaXRtYXAKKwkqLworCUJPT0wgb3Blbihjb25zdCBjaGFyKiBscHN6UGF0aE5hbWUsIEJPT0wgY3JlYXRlX25ldywgQk9PTCByZWFkX29ubHksIGludCBmbGFncyA9IDApOworCisJLyoqCisJT3BlbiBhIG11bHRpLXBhZ2UgbWVtb3J5IHN0cmVhbSBhcyByZWFkL3dyaXRlLiAKKwlAcGFyYW0gbWVtSU8gTWVtb3J5IHN0cmVhbS4gVGhlIG1lbW9yeSBzdHJlYW0gTVVTVCBCRSBhIHdyYXBwZWQgdXNlciBidWZmZXIuIAorCUBwYXJhbSBmbGFncyBMb2FkIGZsYWdzLiBUaGUgc2lnbmlmaWNhdGlvbiBvZiB0aGlzIGZsYWcgZGVwZW5kcyBvbiB0aGUgaW1hZ2UgdG8gYmUgbG9hZGVkLgorCUByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgRkFMU0Ugb3RoZXJ3aXNlCisJQHNlZSBGcmVlSW1hZ2VfTG9hZE11bHRpQml0bWFwRnJvbU1lbW9yeQorCSovCisJQk9PTCBvcGVuKGZpcE1lbW9yeUlPJiBtZW1JTywgaW50IGZsYWdzID0gMCk7CisKKwkvKioKKwlPcGVuIGEgbXVsdGktcGFnZSBpbWFnZSBhcyByZWFkL3dyaXRlLCB1c2luZyB0aGUgc3BlY2lmaWVkIEZyZWVJbWFnZUlPIHN0cnVjdCBhbmQgZmlfaGFuZGxlLCBhbmQgYW4gb3B0aW9uYWwgZmxhZy4KKwlAcGFyYW0gaW8gRnJlZUltYWdlSU8gc3RydWN0dXJlCisJQHBhcmFtIGhhbmRsZSBGcmVlSW1hZ2UgZmlfaGFuZGxlCisJQHBhcmFtIGZsYWcgVGhlIHNpZ25pZmljYXRpb24gb2YgdGhpcyBmbGFnIGRlcGVuZHMgb24gdGhlIGltYWdlIHRvIGJlIHJlYWQuCisJQHJldHVybiBSZXR1cm5zIFRSVUUgaWYgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlLgorCUBzZWUgRnJlZUltYWdlX09wZW5NdWx0aUJpdG1hcEZyb21IYW5kbGUKKwkqLworCUJPT0wgb3BlbihGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIGludCBmbGFncyA9IDApOworCisJLyoqCisJQ2xvc2UgYSBmaWxlIHN0cmVhbQorCUBwYXJhbSBmbGFncyBTYXZlIGZsYWdzLiBUaGUgc2lnbmlmaWNhdGlvbiBvZiB0aGlzIGZsYWcgZGVwZW5kcyBvbiB0aGUgaW1hZ2UgdG8gYmUgc2F2ZWQuCisJQHJldHVybiBSZXR1cm5zIFRSVUUgaWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyBGQUxTRSBvdGhlcndpc2UKKwlAc2VlIEZyZWVJbWFnZV9DbG9zZU11bHRpQml0bWFwCisJKi8KKwlCT09MIGNsb3NlKGludCBmbGFncyA9IDApOworCisJLyoqCisJU2F2ZXMgYSBtdWx0aS1wYWdlIGltYWdlIHVzaW5nIHRoZSBzcGVjaWZpZWQgRnJlZUltYWdlSU8gc3RydWN0IGFuZCBmaV9oYW5kbGUsIGFuZCBhbiBvcHRpb25hbCBmbGFnLgorCUBwYXJhbSBmaWYgRm9ybWF0IGlkZW50aWZpZXIgKEZyZWVJbWFnZSBmb3JtYXQpCisJQHBhcmFtIGlvIEZyZWVJbWFnZUlPIHN0cnVjdHVyZQorCUBwYXJhbSBoYW5kbGUgRnJlZUltYWdlIGZpX2hhbmRsZQorCUBwYXJhbSBmbGFnIFRoZSBzaWduaWZpY2F0aW9uIG9mIHRoaXMgZmxhZyBkZXBlbmRzIG9uIHRoZSBtdWx0aS1wYWdlIGltYWdlIHRvIGJlIHNhdmVkLgorCUByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZS4KKwlAc2VlIEZyZWVJbWFnZV9TYXZlTXVsdGlCaXRtYXBUb0hhbmRsZSwgRnJlZUltYWdlIGRvY3VtZW50YXRpb24KKwkqLworCUJPT0wgc2F2ZVRvSGFuZGxlKEZSRUVfSU1BR0VfRk9STUFUIGZpZiwgRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBpbnQgZmxhZ3MgPSAwKSBjb25zdDsKKworCS8qKgorCVNhdmVzIGEgbXVsdGktcGFnZSBpbWFnZSB1c2luZyB0aGUgc3BlY2lmaWVkIG1lbW9yeSBzdHJlYW0gYW5kIGFuIG9wdGlvbmFsIGZsYWcuCisJQHBhcmFtIGZpZiBGb3JtYXQgaWRlbnRpZmllciAoRnJlZUltYWdlIGZvcm1hdCkKKwlAcGFyYW0gbWVtSU8gRnJlZUltYWdlIG1lbW9yeSBzdHJlYW0KKwlAcGFyYW0gZmxhZyBUaGUgc2lnbmlmaWNhdGlvbiBvZiB0aGlzIGZsYWcgZGVwZW5kcyBvbiB0aGUgaW1hZ2UgdG8gYmUgc2F2ZWQuCisJQHJldHVybiBSZXR1cm5zIFRSVUUgaWYgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlLgorCUBzZWUgRnJlZUltYWdlX1NhdmVNdWx0aUJpdG1hcFRvTWVtb3J5LCBGcmVlSW1hZ2UgZG9jdW1lbnRhdGlvbgorCSovCisJQk9PTCBzYXZlVG9NZW1vcnkoRlJFRV9JTUFHRV9GT1JNQVQgZmlmLCBmaXBNZW1vcnlJTyYgbWVtSU8sIGludCBmbGFncyA9IDApIGNvbnN0OworCisJLyoqCisJUmV0dXJucyB0aGUgbnVtYmVyIG9mIHBhZ2VzIGN1cnJlbnRseSBhdmFpbGFibGUgaW4gdGhlIG11bHRpLXBhZ2VkIGJpdG1hcAorCUBzZWUgRnJlZUltYWdlX0dldFBhZ2VDb3VudAorCSovCisJaW50IGdldFBhZ2VDb3VudCgpIGNvbnN0OworCisJLyoqCisJQXBwZW5kcyBhIG5ldyBwYWdlIHRvIHRoZSBlbmQgb2YgdGhlIGJpdG1hcAorCUBwYXJhbSBpbWFnZSBJbWFnZSB0byBhcHBlbmQKKwlAc2VlIEZyZWVJbWFnZV9BcHBlbmRQYWdlCisJKi8KKwl2b2lkIGFwcGVuZFBhZ2UoZmlwSW1hZ2UmIGltYWdlKTsKKworCS8qKgorCUluc2VydHMgYSBuZXcgcGFnZSBiZWZvcmUgdGhlIGdpdmVuIHBvc2l0aW9uIGluIHRoZSBiaXRtYXAKKwlAcGFyYW0gcGFnZSBQYWdlIG51bWJlci4gUGFnZSBoYXMgdG8gYmUgYSBudW1iZXIgc21hbGxlciB0aGFuIHRoZSBjdXJyZW50IG51bWJlciBvZiBwYWdlcyBhdmFpbGFibGUgaW4gdGhlIGJpdG1hcC4KKwlAcGFyYW0gaW1hZ2UgSW1hZ2UgdG8gaW5zZXJ0CisJQHNlZSBGcmVlSW1hZ2VfSW5zZXJ0UGFnZQorCSovCisJdm9pZCBpbnNlcnRQYWdlKGludCBwYWdlLCBmaXBJbWFnZSYgaW1hZ2UpOworCisJLyoqCisJRGVsZXRlcyB0aGUgcGFnZSBvbiB0aGUgZ2l2ZW4gcG9zaXRpb24KKwlAcGFyYW0gcGFnZSBQYWdlIG51bWJlcgorCUBzZWUgRnJlZUltYWdlX0RlbGV0ZVBhZ2UKKwkqLworCXZvaWQgZGVsZXRlUGFnZShpbnQgcGFnZSk7CisKKwkvKioKKwlNb3ZlcyB0aGUgc291cmNlIHBhZ2UgdG8gdGhlIHBvc2l0aW9uIG9mIHRoZSB0YXJnZXQgcGFnZS4gCisJQHBhcmFtIHRhcmdldCBUYXJnZXQgcGFnZSBwb3NpdGlvbgorCUBwYXJhbSBzb3VyY2UgU291cmNlIHBhZ2UgcG9zaXRpb24KKwlAcmV0dXJuIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsLCByZXR1cm5zIEZBTFNFIG90aGVyd2lzZQorCUBzZWUgRnJlZUltYWdlX01vdmVQYWdlCisJKi8KKwlCT09MIG1vdmVQYWdlKGludCB0YXJnZXQsIGludCBzb3VyY2UpOworCisJLyoqCisJTG9ja3MgYSBwYWdlIGluIG1lbW9yeSBmb3IgZWRpdGluZy4gWW91IG11c3QgY2FsbCB1bmxvY2tQYWdlIHRvIGZyZWUgdGhlIHBhZ2U8YnI+CisJPGI+VXNhZ2UgOiA8L2I+PGJyPgorCTxwcmU+CisJZmlwTXVsdGlQYWdlIG1wYWdlOworCS8vIC4uLgorCWZpcEltYWdlIGltYWdlOwkJLy8gWW91IG11c3QgZGVjbGFyZSB0aGlzIGJlZm9yZQorCWltYWdlID0gbXBhZ2UubG9ja1BhZ2UoMik7CisJaWYoaW1hZ2UuaXNWYWxpZCgpKSB7CisJICAvLyAuLi4KKwkgIG1wYWdlLnVubG9ja1BhZ2UoaW1hZ2UsIFRSVUUpOworCX0KKwk8L3ByZT4KKwlAcGFyYW0gcGFnZSBQYWdlIG51bWJlcgorCUByZXR1cm4gUmV0dXJucyB0aGUgcGFnZSBpZiBzdWNjZXNzZnVsLCByZXR1cm5zIE5VTEwgb3RoZXJ3aXNlCisJQHNlZSBGcmVlSW1hZ2VfTG9ja1BhZ2UKKwkqLworCUZJQklUTUFQKiBsb2NrUGFnZShpbnQgcGFnZSk7CisKKwkvKioKKwlVbmxvY2tzIGEgcHJldmlvdXNseSBsb2NrZWQgcGFnZSBhbmQgZ2l2ZXMgaXQgYmFjayB0byB0aGUgbXVsdGktcGFnZSBlbmdpbmUKKwlAcGFyYW0gaW1hZ2UgUGFnZSB0byB1bmxvY2sKKwlAcGFyYW0gY2hhbmdlZCBXaGVuIFRSVUUsIHRoZSBwYWdlIGlzIG1hcmtlZCBjaGFuZ2VkIGFuZCB0aGUgbmV3IHBhZ2UgZGF0YSBpcyBhcHBsaWVkIGluIHRoZSBtdWx0aS1wYWdlIGJpdG1hcC4KKwlAc2VlIEZyZWVJbWFnZV9VbmxvY2tQYWdlCisJKi8KKwl2b2lkIHVubG9ja1BhZ2UoZmlwSW1hZ2UmIGltYWdlLCBCT09MIGNoYW5nZWQpOworCisJLyoqCisJUmV0dXJucyBhbiBhcnJheSBvZiBwYWdlLW51bWJlcnMgdGhhdCBhcmUgY3VycmVudGx5IGxvY2tlZCBpbiBtZW1vcnkuIAorCVdoZW4gdGhlIHBhZ2VzIHBhcmFtZXRlciBpcyBOVUxMLCB0aGUgc2l6ZSBvZiB0aGUgYXJyYXkgaXMgcmV0dXJuZWQgaW4gdGhlIGNvdW50IHZhcmlhYmxlLiAKKwlZb3UgY2FuIHRoZW4gYWxsb2NhdGUgdGhlIGFycmF5IG9mIHRoZSBkZXNpcmVkIHNpemUgYW5kIGNhbGwgCisJZ2V0TG9ja2VkUGFnZU51bWJlcnMgYWdhaW4gdG8gcG9wdWxhdGUgdGhlIGFycmF5LgorCUByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgRkFMU0Ugb3RoZXJ3aXNlCisJQHNlZSBGcmVlSW1hZ2VfR2V0TG9ja2VkUGFnZU51bWJlcnMKKwkqLworCUJPT0wgZ2V0TG9ja2VkUGFnZU51bWJlcnMoaW50ICpwYWdlcywgaW50ICpjb3VudCkgY29uc3Q7Cit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qKgorRnJlZUltYWdlIFRhZworCitGcmVlSW1hZ2UgdXNlcyB0aGlzIHN0cnVjdHVyZSB0byBzdG9yZSBtZXRhZGF0YSBpbmZvcm1hdGlvbi4gCisqLworY2xhc3MgRklQX0FQSSBmaXBUYWcgOiBwdWJsaWMgZmlwT2JqZWN0Cit7Citwcm90ZWN0ZWQ6CisJLy8vIFBvaW50ZXIgdG8gYSBGcmVlSW1hZ2UgdGFnCisJRklUQUcgKl90YWc7CisKK3B1YmxpYzoKKwkvKipAbmFtZSBDcmVhdGlvbiAmIERlc3RydWN0aW9uICovCisJLy9AewkKKwkvKioKKwlDb25zdHJ1Y3RvcgorCUBzZWUgRnJlZUltYWdlX0NyZWF0ZVRhZworCSovCisJZmlwVGFnKCk7CisJLyoqIAorCURlc3RydWN0b3IKKwlAc2VlIEZyZWVJbWFnZV9EZWxldGVUYWcKKwkqLworCXZpcnR1YWwgfmZpcFRhZygpOworCS8qKgorCUNvbnN0cnVjdCBhIEZJRFRfQVNDSUkgdGFnIChBU0NJSSBzdHJpbmcpLjxicj4KKwlUaGlzIG1ldGhvZCBpcyB1c2VmdWwgdG8gc3RvcmUgY29tbWVudHMgb3IgSVBUQyB0YWdzLiAKKwlAcGFyYW0gbmFtZSBGaWVsZCBuYW1lCisJQHBhcmFtIHZhbHVlIEZpZWxkIHZhbHVlCisJQHJldHVybiBSZXR1cm5zIFRSVUUgaWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyBGQUxTRSBvdGhlcndpc2UKKwlAc2VlIEZyZWVJbWFnZV9DcmVhdGVUYWcKKwkqLworCUJPT0wgc2V0S2V5VmFsdWUoY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICp2YWx1ZSk7CisKKwkvL0B9CisKKwkvKipAbmFtZSBDb3B5aW5nICovCisJLy9AewkKKwkvKioKKwlDb3B5IGNvbnN0cnVjdG9yCisJQHNlZSBGcmVlSW1hZ2VfQ2xvbmVUYWcKKwkqLworCWZpcFRhZyhjb25zdCBmaXBUYWcmIHRhZyk7CisJLyoqCisJQ29weSBjb25zdHJ1Y3RvcgorCUBzZWUgRnJlZUltYWdlX0Nsb25lVGFnCisJKi8KKwlmaXBUYWcmIG9wZXJhdG9yPShjb25zdCBmaXBUYWcmIHRhZyk7CisJLyoqCisJPGI+QXNzaWduZW1lbnQgb3BlcmF0b3I8L2I+PGJyPgorCUNvcHkgdGhlIGlucHV0IHBvaW50ZXIgYW5kIG1hbmFnZSBpdHMgZGVzdHJ1Y3Rpb24KKwlAc2VlIG9wZXJhdG9yIEZJVEFHKigpCisJKi8KKwlmaXBUYWcmIG9wZXJhdG9yPShGSVRBRyAqdGFnKTsKKwkvL0B9CisKKwkvKioKKwlSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgRklUQUcgZGF0YS4gVXNlZCBmb3IgZGlyZWN0IGFjY2VzcyBmcm9tIEZSRUVJTUFHRSBmdW5jdGlvbnMgCisJb3IgZnJvbSB5b3VyIG93biBsb3cgbGV2ZWwgQyBmdW5jdGlvbnMuCisJQHNlZSBvcGVyYXRvcj0oRklUQUcgKnRhZykKKwkqLworCW9wZXJhdG9yIEZJVEFHKigpIHsgCisJCXJldHVybiBfdGFnOyAKKwl9CisKKwkvLy8gUmV0dXJucyBUUlVFIGlmIHRoZSB0YWcgaXMgYWxsb2NhdGVkLCBGQUxTRSBvdGhlcndpc2UKKwlCT09MIGlzVmFsaWQoKSBjb25zdDsKKworCS8qKkBuYW1lIFRhZyBhY2Nlc3NvcnMgKi8KKwkvL0B7CQorCS8qKgorCVJldHVybnMgdGhlIHRhZyBmaWVsZCBuYW1lICh1bmlxdWUgaW5zaWRlIGEgbWV0YWRhdGEgbW9kZWwpLgorCUBzZWUgRnJlZUltYWdlX0dldFRhZ0tleQorCSovCisJY29uc3QgY2hhciAqZ2V0S2V5KCkgY29uc3Q7CisJLyoqCisJUmV0dXJucyB0aGUgdGFnIGRlc2NyaXB0aW9uIGlmIGF2YWlsYWJsZSwgcmV0dXJucyBOVUxMIG90aGVyd2lzZQorCUBzZWUgRnJlZUltYWdlX0dldFRhZ0Rlc2NyaXB0aW9uCisJKi8KKwljb25zdCBjaGFyICpnZXREZXNjcmlwdGlvbigpIGNvbnN0OworCS8qKgorCVJldHVybnMgdGhlIHRhZyBJRCBpZiBhdmFpbGFibGUsIHJldHVybnMgMCBvdGhlcndpc2UKKwlAc2VlIEZyZWVJbWFnZV9HZXRUYWdJRAorCSovCisJV09SRCBnZXRJRCgpIGNvbnN0OworCS8qKgorCVJldHVybnMgdGhlIHRhZyBkYXRhIHR5cGUgCisJQHNlZSBGcmVlSW1hZ2VfR2V0VGFnVHlwZQorCSovCisJRlJFRV9JTUFHRV9NRFRZUEUgZ2V0VHlwZSgpIGNvbnN0OworCS8qKgorCVJldHVybnMgdGhlIG51bWJlciBvZiBjb21wb25lbnRzIGluIHRoZSB0YWcgKGluIHRhZyB0eXBlIHVuaXRzKQorCUBzZWUgRnJlZUltYWdlX0dldFRhZ0NvdW50CisJKi8KKwlEV09SRCBnZXRDb3VudCgpIGNvbnN0OworCS8qKgorCVJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgdGFnIHZhbHVlIGluIGJ5dGVzCisJQHNlZSBGcmVlSW1hZ2VfR2V0VGFnTGVuZ3RoCisJKi8KKwlEV09SRCBnZXRMZW5ndGgoKSBjb25zdDsKKwkvKioKKwlSZXR1cm5zIHRoZSB0YWcgdmFsdWUKKwlAc2VlIEZyZWVJbWFnZV9HZXRUYWdWYWx1ZQorCSovCisJY29uc3Qgdm9pZCAqZ2V0VmFsdWUoKSBjb25zdDsKKwkvKioKKwlTZXQgdGhlIHRhZyBmaWVsZCBuYW1lIAorCUByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgRkFMU0Ugb3RoZXJ3aXNlCisJQHNlZSBGcmVlSW1hZ2VfU2V0VGFnS2V5CisJKi8KKwlCT09MIHNldEtleShjb25zdCBjaGFyICprZXkpOworCS8qKgorCVNldCB0aGUgKHVzdWFsbHkgb3B0aW9uYWwpIHRhZyBkZXNjcmlwdGlvbgorCUByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgRkFMU0Ugb3RoZXJ3aXNlCisJQHNlZSBGcmVlSW1hZ2VfU2V0VGFnRGVzY3JpcHRpb24KKwkqLworCUJPT0wgc2V0RGVzY3JpcHRpb24oY29uc3QgY2hhciAqZGVzY3JpcHRpb24pOworCS8qKgorCVNldCB0aGUgKHVzdWFsbHkgb3B0aW9uYWwpIHRhZCBJRAorCUByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgRkFMU0Ugb3RoZXJ3aXNlCisJQHNlZSBGcmVlSW1hZ2VfU2V0VGFnSUQKKwkqLworCUJPT0wgc2V0SUQoV09SRCBpZCk7CisJLyoqCisJU2V0IHRoZSB0YWcgZGF0YSB0eXBlIAorCUByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgRkFMU0Ugb3RoZXJ3aXNlCisJQHNlZSBGcmVlSW1hZ2VfU2V0VGFnVHlwZQorCSovCisJQk9PTCBzZXRUeXBlKEZSRUVfSU1BR0VfTURUWVBFIHR5cGUpOworCS8qKgorCVNldCB0aGUgbnVtYmVyIG9mIGRhdGEgaW4gdGhlIHRhZyAKKwlAcmV0dXJuIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsLCByZXR1cm5zIEZBTFNFIG90aGVyd2lzZQorCUBzZWUgRnJlZUltYWdlX1NldFRhZ0NvdW50CisJKi8KKwlCT09MIHNldENvdW50KERXT1JEIGNvdW50KTsKKwkvKioKKwlTZXQgdGhlIGxlbmd0aCBvZiB0aGUgdGFnIHZhbHVlLCBpbiBieXRlcyAKKwlAcmV0dXJuIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsLCByZXR1cm5zIEZBTFNFIG90aGVyd2lzZQorCUBzZWUgRnJlZUltYWdlX1NldFRhZ0xlbmd0aAorCSovCisJQk9PTCBzZXRMZW5ndGgoRFdPUkQgbGVuZ3RoKTsKKwkvKioKKwlTZXQgdGhlIHRhZyB2YWx1ZSAKKwlAcmV0dXJuIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsLCByZXR1cm5zIEZBTFNFIG90aGVyd2lzZQorCUBzZWUgRnJlZUltYWdlX1NldFRhZ1ZhbHVlCisJKi8KKwlCT09MIHNldFZhbHVlKGNvbnN0IHZvaWQgKnZhbHVlKTsKKworCS8vQH0KKworCS8qKgorCUNvbnZlcnRzIGEgRnJlZUltYWdlIHRhZyBzdHJ1Y3R1cmUgdG8gYSBzdHJpbmcgdGhhdCByZXByZXNlbnRzIHRoZSBpbnRlcnByZXRlZCB0YWcgdmFsdWUKKwlAcGFyYW0gbW9kZWwgTWV0YWRhdGEgbW9kZWwgc3BlY2lmaWNhdGlvbiAobWV0YWRhdGEgbW9kZWwgZnJvbSB3aGljaCB0aGUgdGFnIHdhcyBleHRyYWN0ZWQpCisJQHBhcmFtIE1ha2UgQ2FtZXJhIG1vZGVsIChub3QgdXNlZCB5ZXQpCisJKi8KKwljb25zdCBjaGFyKiB0b1N0cmluZyhGUkVFX0lNQUdFX01ETU9ERUwgbW9kZWwsIGNoYXIgKk1ha2UgPSBOVUxMKSBjb25zdDsKKworfTsKKworLyoqCitNZXRhZGF0YSBpdGVyYXRvcgorCis8Yj5Vc2FnZSA6IDwvYj48YnI+Cis8cHJlPgorZmlwSW1hZ2UgaW1hZ2U7CisvLyAuLi4KK2ZpcFRhZyB0YWc7CitmaXBNZXRhZGF0YUZpbmQgZmluZGVyOworaWYoIGZpbmRlci5maW5kRmlyc3RNZXRhZGF0YShGSU1EX0VYSUZfTUFJTiwgaW1hZ2UsIHRhZykgKSB7CisgIGRvIHsKKyAgICAvLyBwcm9jZXNzIHRoZSB0YWcKKwljb3V0IDw8IHRhZy5nZXRLZXkoKSA8PCAiXG4iOworCisgIH0gd2hpbGUoIGZpbmRlci5maW5kTmV4dE1ldGFkYXRhKHRhZykgKTsKK30KKy8vIHRoZSBjbGFzcyBjYW4gYmUgY2FsbGVkIGFnYWluIHdpdGggYW5vdGhlciBtZXRhZGF0YSBtb2RlbAoraWYoIGZpbmRlci5maW5kRmlyc3RNZXRhZGF0YShGSU1EX0VYSUZfRVhJRiwgaW1hZ2UsIHRhZykgKSB7CisgIGRvIHsKKyAgICAvLyBwcm9jZXNzIHRoZSB0YWcKKwljb3V0IDw8IHRhZy5nZXRLZXkoKSA8PCAiXG4iOworCisgIH0gd2hpbGUoIGZpbmRlci5maW5kTmV4dE1ldGFkYXRhKHRhZykgKTsKK30KKzwvcHJlPgorKi8KK2NsYXNzIEZJUF9BUEkgZmlwTWV0YWRhdGFGaW5kIDogcHVibGljIGZpcE9iamVjdAoreworcHJvdGVjdGVkOgorCS8vLyBQb2ludGVyIHRvIGEgc2VhcmNoIGhhbmRsZQorCUZJTUVUQURBVEEgKl9tZGhhbmRsZTsKKworcHVibGljOgorCS8vLyBSZXR1cm5zIFRSVUUgaWYgdGhlIHNlYXJjaCBoYW5kbGUgaXMgYWxsb2NhdGVkLCBGQUxTRSBvdGhlcndpc2UKKwlCT09MIGlzVmFsaWQoKSBjb25zdDsKKworCS8vLyBDb25zdHJ1Y3RvcgorCWZpcE1ldGFkYXRhRmluZCgpOworCS8qKgorCURlc3RydWN0b3IKKwlAc2VlIEZyZWVJbWFnZV9GaW5kQ2xvc2VNZXRhZGF0YQorCSovCisJdmlydHVhbCB+ZmlwTWV0YWRhdGFGaW5kKCk7CisJLyoqCisJUHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZpcnN0IGluc3RhbmNlIG9mIGEgdGFnIHRoYXQgbWF0Y2hlcyAKKwl0aGUgbWV0YWRhdGEgbW9kZWwgc3BlY2lmaWVkIGluIHRoZSA8aT5tb2RlbDwvaT4gYXJndW1lbnQuIAorCUBwYXJhbSBtb2RlbCBNZXRhZGF0YSBtb2RlbAorCUBwYXJhbSBpbWFnZSBJbnB1dCBpbWFnZQorCUBwYXJhbSB0YWcgUmV0dXJuZWQgdGFnCisJQHJldHVybiBSZXR1cm5zIFRSVUUgaWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyBGQUxTRSBvdGhlcndpc2UKKwlAc2VlIEZyZWVJbWFnZV9GaW5kRmlyc3RNZXRhZGF0YQorCSovCisJQk9PTCBmaW5kRmlyc3RNZXRhZGF0YShGUkVFX0lNQUdFX01ETU9ERUwgbW9kZWwsIGZpcEltYWdlJiBpbWFnZSwgZmlwVGFnJiB0YWcpOworCS8qKgorCUZpbmQgdGhlIG5leHQgdGFnLCBpZiBhbnksIHRoYXQgbWF0Y2hlcyB0aGUgbWV0YWRhdGEgbW9kZWwgYXJndW1lbnQgCisJaW4gYSBwcmV2aW91cyBjYWxsIHRvIGZpbmRGaXJzdE1ldGFkYXRhCisJQHBhcmFtIHRhZyBSZXR1cm5lZCB0YWcKKwlAcmV0dXJuIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsLCByZXR1cm5zIEZBTFNFIG90aGVyd2lzZSwgaW5kaWNhdGluZyB0aGF0IG5vIG1vcmUgbWF0Y2hpbmcgdGFncyBjb3VsZCBiZSBmb3VuZAorCUBzZWUgRnJlZUltYWdlX0ZpbmROZXh0TWV0YWRhdGEKKwkqLworCUJPT0wgZmluZE5leHRNZXRhZGF0YShmaXBUYWcmIHRhZyk7CisKK307CisKKyNlbmRpZgkvLyBGUkVFSU1BR0VQTFVTX0gKZGlmZiAtLWdpdCBhL2ZpbGVzL1dyYXBwZXIvRnJlZUltYWdlUGx1cy9zcmMvRnJlZUltYWdlUGx1cy5jcHAgYi9maWxlcy9XcmFwcGVyL0ZyZWVJbWFnZVBsdXMvc3JjL0ZyZWVJbWFnZVBsdXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmYjhmZTkKLS0tIC9kZXYvbnVsbAorKysgYi9maWxlcy9XcmFwcGVyL0ZyZWVJbWFnZVBsdXMvc3JjL0ZyZWVJbWFnZVBsdXMuY3BwCkBAIC0wLDAgKzEsNDYgQEAKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEZyZWVJbWFnZVBsdXMuY3BwIDogRGVmaW5lcyB0aGUgZW50cnkgcG9pbnQgZm9yIHRoZSBETEwgYXBwbGljYXRpb24uCisvLworLy8gRGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBieQorLy8gLSBIZXJ26SBEcm9sb24gKGRyb2xvbkBpbmZvbmllLmZyKQorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZyZWVJbWFnZSAzCisvLworLy8gQ09WRVJFRCBDT0RFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZCisvLyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUworLy8gVEhBVCBUSEUgQ09WRVJFRCBDT0RFIElTIEZSRUUgT0YgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisvLyBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRAorLy8gQ09ERSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVAorLy8gVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GIEFOWSBORUNFU1NBUlkKKy8vIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwKKy8vIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIKKy8vIFRISVMgRElTQ0xBSU1FUi4KKy8vCisvLyBVc2UgYXQgeW91ciBvd24gcmlzayEKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbmRpZiAvLyBfV0lOMzIKKworI2luY2x1ZGUgIkZyZWVJbWFnZVBsdXMuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZmRlZiBfV0lOMzIKKworQk9PTCBBUElFTlRSWSBEbGxNYWluKCBIQU5ETEUgaE1vZHVsZSwgRFdPUkQgIHVsX3JlYXNvbl9mb3JfY2FsbCwgTFBWT0lEIGxwUmVzZXJ2ZWQpCit7CisgICAgc3dpdGNoICh1bF9yZWFzb25fZm9yX2NhbGwpCisJeworCQljYXNlIERMTF9QUk9DRVNTX0FUVEFDSDoKKwkJY2FzZSBETExfVEhSRUFEX0FUVEFDSDoKKwkJY2FzZSBETExfVEhSRUFEX0RFVEFDSDoKKwkJY2FzZSBETExfUFJPQ0VTU19ERVRBQ0g6CisJCQlicmVhazsKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworI2VuZGlmIC8vIF9XSU4zMgpkaWZmIC0tZ2l0IGEvZmlsZXMvV3JhcHBlci9GcmVlSW1hZ2VQbHVzL3NyYy9maXBJbWFnZS5jcHAgYi9maWxlcy9XcmFwcGVyL0ZyZWVJbWFnZVBsdXMvc3JjL2ZpcEltYWdlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2U1Njg4Ci0tLSAvZGV2L251bGwKKysrIGIvZmlsZXMvV3JhcHBlci9GcmVlSW1hZ2VQbHVzL3NyYy9maXBJbWFnZS5jcHAKQEAgLTAsMCArMSw5NzQgQEAKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIGZpcEltYWdlIGNsYXNzIGltcGxlbWVudGF0aW9uCisvLworLy8gRGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBieQorLy8gLSBIZXJ26SBEcm9sb24gKGRyb2xvbkBpbmZvbmllLmZyKQorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZyZWVJbWFnZSAzCisvLworLy8gQ09WRVJFRCBDT0RFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZCisvLyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUworLy8gVEhBVCBUSEUgQ09WRVJFRCBDT0RFIElTIEZSRUUgT0YgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisvLyBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRAorLy8gQ09ERSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVAorLy8gVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GIEFOWSBORUNFU1NBUlkKKy8vIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwKKy8vIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIKKy8vIFRISVMgRElTQ0xBSU1FUi4KKy8vCisvLyBVc2UgYXQgeW91ciBvd24gcmlzayEKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2luY2x1ZGUgIkZyZWVJbWFnZVBsdXMuaCIKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgIAorLy8gUHJvdGVjdGVkIGZ1bmN0aW9ucworCitCT09MIGZpcEltYWdlOjpyZXBsYWNlKEZJQklUTUFQICpuZXdfZGliKSB7CisJaWYobmV3X2RpYiA9PSBOVUxMKSAKKwkJcmV0dXJuIEZBTFNFOworCWlmKF9kaWIpCisJCUZyZWVJbWFnZV9VbmxvYWQoX2RpYik7CisJX2RpYiA9IG5ld19kaWI7CisJX2JIYXNDaGFuZ2VkID0gVFJVRTsKKwlyZXR1cm4gVFJVRTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ3JlYXRpb24gJiBEZXN0cnVjdGlvbgorCitmaXBJbWFnZTo6ZmlwSW1hZ2UoRlJFRV9JTUFHRV9UWVBFIGltYWdlX3R5cGUsIHVuc2lnbmVkIHdpZHRoLCB1bnNpZ25lZCBoZWlnaHQsIHVuc2lnbmVkIGJwcCkgeworCV9kaWIgPSBOVUxMOworCV9iSGFzQ2hhbmdlZCA9IEZBTFNFOworCWlmKHdpZHRoICYmIGhlaWdodCAmJiBicHApCisJCXNldFNpemUoaW1hZ2VfdHlwZSwgd2lkdGgsIGhlaWdodCwgYnBwKTsKK30KKworZmlwSW1hZ2U6On5maXBJbWFnZSgpIHsKKwlpZihfZGliKSB7CisJCUZyZWVJbWFnZV9VbmxvYWQoX2RpYik7CisJCV9kaWIgPSBOVUxMOworCX0KK30KKworQk9PTCBmaXBJbWFnZTo6c2V0U2l6ZShGUkVFX0lNQUdFX1RZUEUgaW1hZ2VfdHlwZSwgdW5zaWduZWQgd2lkdGgsIHVuc2lnbmVkIGhlaWdodCwgdW5zaWduZWQgYnBwLCB1bnNpZ25lZCByZWRfbWFzaywgdW5zaWduZWQgZ3JlZW5fbWFzaywgdW5zaWduZWQgYmx1ZV9tYXNrKSB7CisJaWYoX2RpYikgeworCQlGcmVlSW1hZ2VfVW5sb2FkKF9kaWIpOworCX0KKwlpZigoX2RpYiA9IEZyZWVJbWFnZV9BbGxvY2F0ZVQoaW1hZ2VfdHlwZSwgd2lkdGgsIGhlaWdodCwgYnBwLCByZWRfbWFzaywgZ3JlZW5fbWFzaywgYmx1ZV9tYXNrKSkgPT0gTlVMTCkKKwkJcmV0dXJuIEZBTFNFOworCisJaWYoaW1hZ2VfdHlwZSA9PSBGSVRfQklUTUFQKSB7CisJCS8vIENyZWF0ZSBwYWxldHRlIGlmIG5lZWRlZAorCQlzd2l0Y2goYnBwKQl7CisJCQljYXNlIDE6CisJCQljYXNlIDQ6CisJCQljYXNlIDg6CisJCQkJUkdCUVVBRCAqcGFsID0gRnJlZUltYWdlX0dldFBhbGV0dGUoX2RpYik7CisJCQkJZm9yKHVuc2lnbmVkIGkgPSAwOyBpIDwgRnJlZUltYWdlX0dldENvbG9yc1VzZWQoX2RpYik7IGkrKykgeworCQkJCQlwYWxbaV0ucmdiUmVkID0gaTsKKwkJCQkJcGFsW2ldLnJnYkdyZWVuID0gaTsKKwkJCQkJcGFsW2ldLnJnYkJsdWUgPSBpOworCQkJCX0KKwkJCQlicmVhazsKKwkJfQorCX0KKworCV9iSGFzQ2hhbmdlZCA9IFRSVUU7CisKKwlyZXR1cm4gVFJVRTsKK30KKwordm9pZCBmaXBJbWFnZTo6Y2xlYXIoKSB7CisJaWYoX2RpYikgeworCQlGcmVlSW1hZ2VfVW5sb2FkKF9kaWIpOworCQlfZGliID0gTlVMTDsKKwl9CisJX2JIYXNDaGFuZ2VkID0gVFJVRTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ29weWluZworCitmaXBJbWFnZTo6ZmlwSW1hZ2UoY29uc3QgZmlwSW1hZ2UmIEltYWdlKSB7CisJX2RpYiA9IE5VTEw7CisJX2ZpZiA9IEZJRl9VTktOT1dOOworCUZJQklUTUFQICpjbG9uZSA9IEZyZWVJbWFnZV9DbG9uZSgoRklCSVRNQVAqKUltYWdlLl9kaWIpOworCXJlcGxhY2UoY2xvbmUpOworfQorCitmaXBJbWFnZSYgZmlwSW1hZ2U6Om9wZXJhdG9yPShjb25zdCBmaXBJbWFnZSYgSW1hZ2UpIHsKKwlpZih0aGlzICE9ICZJbWFnZSkgeworCQlGSUJJVE1BUCAqY2xvbmUgPSBGcmVlSW1hZ2VfQ2xvbmUoKEZJQklUTUFQKilJbWFnZS5fZGliKTsKKwkJcmVwbGFjZShjbG9uZSk7CisJfQorCXJldHVybiAqdGhpczsKK30KKworZmlwSW1hZ2UmIGZpcEltYWdlOjpvcGVyYXRvcj0oRklCSVRNQVAgKmRpYikgeworCWlmKF9kaWIgIT0gZGliKSB7CisJCXJlcGxhY2UoZGliKTsKKwl9CisJcmV0dXJuICp0aGlzOworfQorCitCT09MIGZpcEltYWdlOjpjb3B5U3ViSW1hZ2UoZmlwSW1hZ2UmIGRzdCwgaW50IGxlZnQsIGludCB0b3AsIGludCByaWdodCwgaW50IGJvdHRvbSkgY29uc3QgeworCWlmKF9kaWIpIHsKKwkJZHN0ID0gRnJlZUltYWdlX0NvcHkoX2RpYiwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKKwkJcmV0dXJuIGRzdC5pc1ZhbGlkKCk7CisJfQorCXJldHVybiBGQUxTRTsKK30KKworQk9PTCBmaXBJbWFnZTo6cGFzdGVTdWJJbWFnZShmaXBJbWFnZSYgc3JjLCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IGFscGhhKSB7CisJaWYoX2RpYikgeworCQlCT09MIGJSZXN1bHQgPSBGcmVlSW1hZ2VfUGFzdGUoX2RpYiwgc3JjLl9kaWIsIGxlZnQsIHRvcCwgYWxwaGEpOworCQlfYkhhc0NoYW5nZWQgPSBUUlVFOworCQlyZXR1cm4gYlJlc3VsdDsKKwl9CisJcmV0dXJuIEZBTFNFOworfQorCitCT09MIGZpcEltYWdlOjpjcm9wKGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgcmlnaHQsIGludCBib3R0b20pIHsKKwlpZihfZGliKSB7CisJCUZJQklUTUFQICpkc3QgPSBGcmVlSW1hZ2VfQ29weShfZGliLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOworCQlyZXR1cm4gcmVwbGFjZShkc3QpOworCX0KKwlyZXR1cm4gRkFMU0U7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gSW5mb3JtYXRpb24gZnVuY3Rpb25zCisKK0ZSRUVfSU1BR0VfVFlQRSBmaXBJbWFnZTo6Z2V0SW1hZ2VUeXBlKCkgY29uc3QgeworCXJldHVybiBGcmVlSW1hZ2VfR2V0SW1hZ2VUeXBlKF9kaWIpOworfQorCit1bnNpZ25lZCBmaXBJbWFnZTo6Z2V0V2lkdGgoKSBjb25zdCB7CisJcmV0dXJuIEZyZWVJbWFnZV9HZXRXaWR0aChfZGliKTsgCit9CisKK3Vuc2lnbmVkIGZpcEltYWdlOjpnZXRIZWlnaHQoKSBjb25zdCB7CisJcmV0dXJuIEZyZWVJbWFnZV9HZXRIZWlnaHQoX2RpYik7IAorfQorCit1bnNpZ25lZCBmaXBJbWFnZTo6Z2V0U2NhbldpZHRoKCkgY29uc3QgeworCXJldHVybiBGcmVlSW1hZ2VfR2V0UGl0Y2goX2RpYik7Cit9CisKK0JPT0wgZmlwSW1hZ2U6OmlzVmFsaWQoKSBjb25zdCB7CisJcmV0dXJuIChfZGliICE9IE5VTEwpID8gVFJVRTpGQUxTRTsKK30KKworQklUTUFQSU5GTyogZmlwSW1hZ2U6OmdldEluZm8oKSBjb25zdCB7CisJcmV0dXJuIEZyZWVJbWFnZV9HZXRJbmZvKF9kaWIpOworfQorCitCSVRNQVBJTkZPSEVBREVSKiBmaXBJbWFnZTo6Z2V0SW5mb0hlYWRlcigpIGNvbnN0IHsKKwlyZXR1cm4gRnJlZUltYWdlX0dldEluZm9IZWFkZXIoX2RpYik7Cit9CisKK3Vuc2lnbmVkIGZpcEltYWdlOjpnZXRJbWFnZVNpemUoKSBjb25zdCB7CisJcmV0dXJuIEZyZWVJbWFnZV9HZXRESUJTaXplKF9kaWIpOworfQorCit1bnNpZ25lZCBmaXBJbWFnZTo6Z2V0SW1hZ2VNZW1vcnlTaXplKCkgY29uc3QgeworCXJldHVybiBGcmVlSW1hZ2VfR2V0TWVtb3J5U2l6ZShfZGliKTsKK30KKwordW5zaWduZWQgZmlwSW1hZ2U6OmdldEJpdHNQZXJQaXhlbCgpIGNvbnN0IHsKKwlyZXR1cm4gRnJlZUltYWdlX0dldEJQUChfZGliKTsKK30KKwordW5zaWduZWQgZmlwSW1hZ2U6OmdldExpbmUoKSBjb25zdCB7CisJcmV0dXJuIEZyZWVJbWFnZV9HZXRMaW5lKF9kaWIpOworfQorCitkb3VibGUgZmlwSW1hZ2U6OmdldEhvcml6b250YWxSZXNvbHV0aW9uKCkgY29uc3QgeworCXJldHVybiAoRnJlZUltYWdlX0dldERvdHNQZXJNZXRlclgoX2RpYikgLyAoZG91YmxlKTEwMCk7IAorfQorCitkb3VibGUgZmlwSW1hZ2U6OmdldFZlcnRpY2FsUmVzb2x1dGlvbigpIGNvbnN0IHsKKwlyZXR1cm4gKEZyZWVJbWFnZV9HZXREb3RzUGVyTWV0ZXJZKF9kaWIpIC8gKGRvdWJsZSkxMDApOworfQorCit2b2lkIGZpcEltYWdlOjpzZXRIb3Jpem9udGFsUmVzb2x1dGlvbihkb3VibGUgdmFsdWUpIHsKKwlGcmVlSW1hZ2VfU2V0RG90c1Blck1ldGVyWChfZGliLCAodW5zaWduZWQpKHZhbHVlICogMTAwICsgMC41KSk7Cit9CisKK3ZvaWQgZmlwSW1hZ2U6OnNldFZlcnRpY2FsUmVzb2x1dGlvbihkb3VibGUgdmFsdWUpIHsKKwlGcmVlSW1hZ2VfU2V0RG90c1Blck1ldGVyWShfZGliLCAodW5zaWduZWQpKHZhbHVlICogMTAwICsgMC41KSk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gUGFsZXR0ZSBvcGVyYXRpb25zCisKK1JHQlFVQUQqIGZpcEltYWdlOjpnZXRQYWxldHRlKCkgY29uc3QgeworCXJldHVybiBGcmVlSW1hZ2VfR2V0UGFsZXR0ZShfZGliKTsKK30KKwordW5zaWduZWQgZmlwSW1hZ2U6OmdldFBhbGV0dGVTaXplKCkgY29uc3QgeworCXJldHVybiBGcmVlSW1hZ2VfR2V0Q29sb3JzVXNlZChfZGliKSAqIHNpemVvZihSR0JRVUFEKTsKK30KKwordW5zaWduZWQgZmlwSW1hZ2U6OmdldENvbG9yc1VzZWQoKSBjb25zdCB7CisJcmV0dXJuIEZyZWVJbWFnZV9HZXRDb2xvcnNVc2VkKF9kaWIpOworfQorCitGUkVFX0lNQUdFX0NPTE9SX1RZUEUgZmlwSW1hZ2U6OmdldENvbG9yVHlwZSgpIGNvbnN0IHsgCisJcmV0dXJuIEZyZWVJbWFnZV9HZXRDb2xvclR5cGUoX2RpYik7Cit9CisKK0JPT0wgZmlwSW1hZ2U6OmlzR3JheXNjYWxlKCkgY29uc3QgeworCXJldHVybiAoKEZyZWVJbWFnZV9HZXRCUFAoX2RpYikgPT0gOCkgJiYgKEZyZWVJbWFnZV9HZXRDb2xvclR5cGUoX2RpYikgIT0gRklDX1BBTEVUVEUpKTsgCit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFRodW1ibmFpbCBhY2Nlc3MKKworQk9PTCBmaXBJbWFnZTo6Z2V0VGh1bWJuYWlsKGZpcEltYWdlJiBpbWFnZSkgY29uc3QgeworCWltYWdlID0gRnJlZUltYWdlX0Nsb25lKCBGcmVlSW1hZ2VfR2V0VGh1bWJuYWlsKF9kaWIpICk7CisJcmV0dXJuIGltYWdlLmlzVmFsaWQoKTsKK30KKworQk9PTCBmaXBJbWFnZTo6c2V0VGh1bWJuYWlsKGNvbnN0IGZpcEltYWdlJiBpbWFnZSkgeworCXJldHVybiBGcmVlSW1hZ2VfU2V0VGh1bWJuYWlsKF9kaWIsIChGSUJJVE1BUCopaW1hZ2UuX2RpYik7Cit9CisKK0JPT0wgZmlwSW1hZ2U6Omhhc1RodW1ibmFpbCgpIGNvbnN0IHsKKwlyZXR1cm4gKEZyZWVJbWFnZV9HZXRUaHVtYm5haWwoX2RpYikgIT0gTlVMTCk7Cit9CisKK0JPT0wgZmlwSW1hZ2U6OmNsZWFyVGh1bWJuYWlsKCkgeworCXJldHVybiBGcmVlSW1hZ2VfU2V0VGh1bWJuYWlsKF9kaWIsIE5VTEwpOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFBpeGVsIGFjY2VzcworCitCWVRFKiBmaXBJbWFnZTo6YWNjZXNzUGl4ZWxzKCkgY29uc3QgeworCXJldHVybiBGcmVlSW1hZ2VfR2V0Qml0cyhfZGliKTsgCit9CisKK0JZVEUqIGZpcEltYWdlOjpnZXRTY2FuTGluZSh1bnNpZ25lZCBzY2FubGluZSkgY29uc3QgeworCWlmKHNjYW5saW5lIDwgRnJlZUltYWdlX0dldEhlaWdodChfZGliKSkgeworCQlyZXR1cm4gRnJlZUltYWdlX0dldFNjYW5MaW5lKF9kaWIsIHNjYW5saW5lKTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK0JPT0wgZmlwSW1hZ2U6OmdldFBpeGVsSW5kZXgodW5zaWduZWQgeCwgdW5zaWduZWQgeSwgQllURSAqdmFsdWUpIGNvbnN0IHsKKwlyZXR1cm4gRnJlZUltYWdlX0dldFBpeGVsSW5kZXgoX2RpYiwgeCwgeSwgdmFsdWUpOworfQorCitCT09MIGZpcEltYWdlOjpnZXRQaXhlbENvbG9yKHVuc2lnbmVkIHgsIHVuc2lnbmVkIHksIFJHQlFVQUQgKnZhbHVlKSBjb25zdCB7CisJcmV0dXJuIEZyZWVJbWFnZV9HZXRQaXhlbENvbG9yKF9kaWIsIHgsIHksIHZhbHVlKTsKK30KKworQk9PTCBmaXBJbWFnZTo6c2V0UGl4ZWxJbmRleCh1bnNpZ25lZCB4LCB1bnNpZ25lZCB5LCBCWVRFICp2YWx1ZSkgeworCV9iSGFzQ2hhbmdlZCA9IFRSVUU7CisJcmV0dXJuIEZyZWVJbWFnZV9TZXRQaXhlbEluZGV4KF9kaWIsIHgsIHksIHZhbHVlKTsKK30KKworQk9PTCBmaXBJbWFnZTo6c2V0UGl4ZWxDb2xvcih1bnNpZ25lZCB4LCB1bnNpZ25lZCB5LCBSR0JRVUFEICp2YWx1ZSkgeworCV9iSGFzQ2hhbmdlZCA9IFRSVUU7CisJcmV0dXJuIEZyZWVJbWFnZV9TZXRQaXhlbENvbG9yKF9kaWIsIHgsIHksIHZhbHVlKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRmlsZSB0eXBlIGlkZW50aWZpY2F0aW9uCisKK0ZSRUVfSU1BR0VfRk9STUFUIGZpcEltYWdlOjppZGVudGlmeUZJRihjb25zdCBjaGFyKiBscHN6UGF0aE5hbWUpIHsKKwlGUkVFX0lNQUdFX0ZPUk1BVCBmaWYgPSBGSUZfVU5LTk9XTjsKKworCS8vIGNoZWNrIHRoZSBmaWxlIHNpZ25hdHVyZSBhbmQgZ2V0IGl0cyBmb3JtYXQKKwkvLyAodGhlIHNlY29uZCBhcmd1bWVudCBpcyBjdXJyZW50bHkgbm90IHVzZWQgYnkgRnJlZUltYWdlKQorCWZpZiA9IEZyZWVJbWFnZV9HZXRGaWxlVHlwZShscHN6UGF0aE5hbWUsIDApOworCWlmKGZpZiA9PSBGSUZfVU5LTk9XTikgeworCQkvLyBubyBzaWduYXR1cmUgPworCQkvLyB0cnkgdG8gZ3Vlc3MgdGhlIGZpbGUgZm9ybWF0IGZyb20gdGhlIGZpbGUgZXh0ZW5zaW9uCisJCWZpZiA9IEZyZWVJbWFnZV9HZXRGSUZGcm9tRmlsZW5hbWUobHBzelBhdGhOYW1lKTsKKwl9CisKKwlyZXR1cm4gZmlmOworfQorCitGUkVFX0lNQUdFX0ZPUk1BVCBmaXBJbWFnZTo6aWRlbnRpZnlGSUZVKGNvbnN0IHdjaGFyX3QqIGxwc3pQYXRoTmFtZSkgeworCUZSRUVfSU1BR0VfRk9STUFUIGZpZiA9IEZJRl9VTktOT1dOOworCisJLy8gY2hlY2sgdGhlIGZpbGUgc2lnbmF0dXJlIGFuZCBnZXQgaXRzIGZvcm1hdAorCS8vICh0aGUgc2Vjb25kIGFyZ3VtZW50IGlzIGN1cnJlbnRseSBub3QgdXNlZCBieSBGcmVlSW1hZ2UpCisJZmlmID0gRnJlZUltYWdlX0dldEZpbGVUeXBlVShscHN6UGF0aE5hbWUsIDApOworCWlmKGZpZiA9PSBGSUZfVU5LTk9XTikgeworCQkvLyBubyBzaWduYXR1cmUgPworCQkvLyB0cnkgdG8gZ3Vlc3MgdGhlIGZpbGUgZm9ybWF0IGZyb20gdGhlIGZpbGUgZXh0ZW5zaW9uCisJCWZpZiA9IEZyZWVJbWFnZV9HZXRGSUZGcm9tRmlsZW5hbWVVKGxwc3pQYXRoTmFtZSk7CisJfQorCisJcmV0dXJuIGZpZjsKK30KKworRlJFRV9JTUFHRV9GT1JNQVQgZmlwSW1hZ2U6OmlkZW50aWZ5RklGRnJvbUhhbmRsZShGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUpIHsKKwlpZihpbyAmJiBoYW5kbGUpIHsKKwkJLy8gY2hlY2sgdGhlIGZpbGUgc2lnbmF0dXJlIGFuZCBnZXQgaXRzIGZvcm1hdAorCQlyZXR1cm4gRnJlZUltYWdlX0dldEZpbGVUeXBlRnJvbUhhbmRsZShpbywgaGFuZGxlLCAxNik7CisJfQorCXJldHVybiBGSUZfVU5LTk9XTjsKK30KKworRlJFRV9JTUFHRV9GT1JNQVQgZmlwSW1hZ2U6OmlkZW50aWZ5RklGRnJvbU1lbW9yeShGSU1FTU9SWSAqaG1lbSkgeworCWlmKGhtZW0gIT0gTlVMTCkgeworCQlyZXR1cm4gRnJlZUltYWdlX0dldEZpbGVUeXBlRnJvbU1lbW9yeShobWVtLCAwKTsKKwl9CisJcmV0dXJuIEZJRl9VTktOT1dOOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIExvYWRpbmcgJiBTYXZpbmcKKworQk9PTCBmaXBJbWFnZTo6bG9hZChjb25zdCBjaGFyKiBscHN6UGF0aE5hbWUsIGludCBmbGFnKSB7CisJRlJFRV9JTUFHRV9GT1JNQVQgZmlmID0gRklGX1VOS05PV047CisKKwkvLyBjaGVjayB0aGUgZmlsZSBzaWduYXR1cmUgYW5kIGdldCBpdHMgZm9ybWF0CisJLy8gKHRoZSBzZWNvbmQgYXJndW1lbnQgaXMgY3VycmVudGx5IG5vdCB1c2VkIGJ5IEZyZWVJbWFnZSkKKwlmaWYgPSBGcmVlSW1hZ2VfR2V0RmlsZVR5cGUobHBzelBhdGhOYW1lLCAwKTsKKwlpZihmaWYgPT0gRklGX1VOS05PV04pIHsKKwkJLy8gbm8gc2lnbmF0dXJlID8KKwkJLy8gdHJ5IHRvIGd1ZXNzIHRoZSBmaWxlIGZvcm1hdCBmcm9tIHRoZSBmaWxlIGV4dGVuc2lvbgorCQlmaWYgPSBGcmVlSW1hZ2VfR2V0RklGRnJvbUZpbGVuYW1lKGxwc3pQYXRoTmFtZSk7CisJfQorCS8vIGNoZWNrIHRoYXQgdGhlIHBsdWdpbiBoYXMgcmVhZGluZyBjYXBhYmlsaXRpZXMgLi4uCisJaWYoKGZpZiAhPSBGSUZfVU5LTk9XTikgJiYgRnJlZUltYWdlX0ZJRlN1cHBvcnRzUmVhZGluZyhmaWYpKSB7CisJCS8vIEZyZWUgdGhlIHByZXZpb3VzIGRpYgorCQlpZihfZGliKSB7CisJCQlGcmVlSW1hZ2VfVW5sb2FkKF9kaWIpOwkJCQorCQl9CisJCS8vIExvYWQgdGhlIGZpbGUKKwkJX2RpYiA9IEZyZWVJbWFnZV9Mb2FkKGZpZiwgbHBzelBhdGhOYW1lLCBmbGFnKTsKKwkJX2JIYXNDaGFuZ2VkID0gVFJVRTsKKwkJaWYoX2RpYiA9PSBOVUxMKQorCQkJcmV0dXJuIEZBTFNFOworCQlyZXR1cm4gVFJVRTsKKwl9CisJcmV0dXJuIEZBTFNFOworfQorCitCT09MIGZpcEltYWdlOjpsb2FkVShjb25zdCB3Y2hhcl90KiBscHN6UGF0aE5hbWUsIGludCBmbGFnKSB7CisJRlJFRV9JTUFHRV9GT1JNQVQgZmlmID0gRklGX1VOS05PV047CisKKwkvLyBjaGVjayB0aGUgZmlsZSBzaWduYXR1cmUgYW5kIGdldCBpdHMgZm9ybWF0CisJLy8gKHRoZSBzZWNvbmQgYXJndW1lbnQgaXMgY3VycmVudGx5IG5vdCB1c2VkIGJ5IEZyZWVJbWFnZSkKKwlmaWYgPSBGcmVlSW1hZ2VfR2V0RmlsZVR5cGVVKGxwc3pQYXRoTmFtZSwgMCk7CisJaWYoZmlmID09IEZJRl9VTktOT1dOKSB7CisJCS8vIG5vIHNpZ25hdHVyZSA/CisJCS8vIHRyeSB0byBndWVzcyB0aGUgZmlsZSBmb3JtYXQgZnJvbSB0aGUgZmlsZSBleHRlbnNpb24KKwkJZmlmID0gRnJlZUltYWdlX0dldEZJRkZyb21GaWxlbmFtZVUobHBzelBhdGhOYW1lKTsKKwl9CisJLy8gY2hlY2sgdGhhdCB0aGUgcGx1Z2luIGhhcyByZWFkaW5nIGNhcGFiaWxpdGllcyAuLi4KKwlpZigoZmlmICE9IEZJRl9VTktOT1dOKSAmJiBGcmVlSW1hZ2VfRklGU3VwcG9ydHNSZWFkaW5nKGZpZikpIHsKKwkJLy8gRnJlZSB0aGUgcHJldmlvdXMgZGliCisJCWlmKF9kaWIpIHsKKwkJCUZyZWVJbWFnZV9VbmxvYWQoX2RpYik7CQkJCisJCX0KKwkJLy8gTG9hZCB0aGUgZmlsZQorCQlfZGliID0gRnJlZUltYWdlX0xvYWRVKGZpZiwgbHBzelBhdGhOYW1lLCBmbGFnKTsKKwkJX2JIYXNDaGFuZ2VkID0gVFJVRTsKKwkJaWYoX2RpYiA9PSBOVUxMKQorCQkJcmV0dXJuIEZBTFNFOworCQlyZXR1cm4gVFJVRTsKKwl9CisJcmV0dXJuIEZBTFNFOworfQorCitCT09MIGZpcEltYWdlOjpsb2FkRnJvbUhhbmRsZShGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIGludCBmbGFnKSB7CisJRlJFRV9JTUFHRV9GT1JNQVQgZmlmID0gRklGX1VOS05PV047CisKKwkvLyBjaGVjayB0aGUgZmlsZSBzaWduYXR1cmUgYW5kIGdldCBpdHMgZm9ybWF0CisJZmlmID0gRnJlZUltYWdlX0dldEZpbGVUeXBlRnJvbUhhbmRsZShpbywgaGFuZGxlLCAxNik7CisJaWYoKGZpZiAhPSBGSUZfVU5LTk9XTikgJiYgRnJlZUltYWdlX0ZJRlN1cHBvcnRzUmVhZGluZyhmaWYpKSB7CisJCS8vIEZyZWUgdGhlIHByZXZpb3VzIGRpYgorCQlpZihfZGliKSB7CisJCQlGcmVlSW1hZ2VfVW5sb2FkKF9kaWIpOwkJCQorCQl9CisJCS8vIExvYWQgdGhlIGZpbGUKKwkJX2RpYiA9IEZyZWVJbWFnZV9Mb2FkRnJvbUhhbmRsZShmaWYsIGlvLCBoYW5kbGUsIGZsYWcpOworCQlfYkhhc0NoYW5nZWQgPSBUUlVFOworCQlpZihfZGliID09IE5VTEwpCisJCQlyZXR1cm4gRkFMU0U7CisJCXJldHVybiBUUlVFOworCX0KKwlyZXR1cm4gRkFMU0U7Cit9CisKK0JPT0wgZmlwSW1hZ2U6OmxvYWRGcm9tTWVtb3J5KGZpcE1lbW9yeUlPJiBtZW1JTywgaW50IGZsYWcpIHsKKwlGUkVFX0lNQUdFX0ZPUk1BVCBmaWYgPSBGSUZfVU5LTk9XTjsKKworCS8vIGNoZWNrIHRoZSBmaWxlIHNpZ25hdHVyZSBhbmQgZ2V0IGl0cyBmb3JtYXQKKwlmaWYgPSBtZW1JTy5nZXRGaWxlVHlwZSgpOworCWlmKChmaWYgIT0gRklGX1VOS05PV04pICYmIEZyZWVJbWFnZV9GSUZTdXBwb3J0c1JlYWRpbmcoZmlmKSkgeworCQkvLyBGcmVlIHRoZSBwcmV2aW91cyBkaWIKKwkJaWYoX2RpYikgeworCQkJRnJlZUltYWdlX1VubG9hZChfZGliKTsJCQkKKwkJfQorCQkvLyBMb2FkIHRoZSBmaWxlCisJCV9kaWIgPSBtZW1JTy5sb2FkKGZpZiwgZmxhZyk7CisJCV9iSGFzQ2hhbmdlZCA9IFRSVUU7CisJCWlmKF9kaWIgPT0gTlVMTCkKKwkJCXJldHVybiBGQUxTRTsKKwkJcmV0dXJuIFRSVUU7CisJfQorCXJldHVybiBGQUxTRTsKK30KKworQk9PTCBmaXBJbWFnZTo6c2F2ZShjb25zdCBjaGFyKiBscHN6UGF0aE5hbWUsIGludCBmbGFnKSBjb25zdCB7CisJRlJFRV9JTUFHRV9GT1JNQVQgZmlmID0gRklGX1VOS05PV047CisJQk9PTCBiU3VjY2VzcyA9IEZBTFNFOworCisJLy8gVHJ5IHRvIGd1ZXNzIHRoZSBmaWxlIGZvcm1hdCBmcm9tIHRoZSBmaWxlIGV4dGVuc2lvbgorCWZpZiA9IEZyZWVJbWFnZV9HZXRGSUZGcm9tRmlsZW5hbWUobHBzelBhdGhOYW1lKTsKKwlpZihmaWYgIT0gRklGX1VOS05PV04gKSB7CisJCS8vIENoZWNrIHRoYXQgdGhlIGRpYiBjYW4gYmUgc2F2ZWQgaW4gdGhpcyBmb3JtYXQKKwkJQk9PTCBiQ2FuU2F2ZTsKKworCQlGUkVFX0lNQUdFX1RZUEUgaW1hZ2VfdHlwZSA9IEZyZWVJbWFnZV9HZXRJbWFnZVR5cGUoX2RpYik7CisJCWlmKGltYWdlX3R5cGUgPT0gRklUX0JJVE1BUCkgeworCQkJLy8gc3RhbmRhcmQgYml0bWFwIHR5cGUKKwkJCVdPUkQgYnBwID0gRnJlZUltYWdlX0dldEJQUChfZGliKTsKKwkJCWJDYW5TYXZlID0gKEZyZWVJbWFnZV9GSUZTdXBwb3J0c1dyaXRpbmcoZmlmKSAmJiBGcmVlSW1hZ2VfRklGU3VwcG9ydHNFeHBvcnRCUFAoZmlmLCBicHApKTsKKwkJfSBlbHNlIHsKKwkJCS8vIHNwZWNpYWwgYml0bWFwIHR5cGUKKwkJCWJDYW5TYXZlID0gRnJlZUltYWdlX0ZJRlN1cHBvcnRzRXhwb3J0VHlwZShmaWYsIGltYWdlX3R5cGUpOworCQl9CisKKwkJaWYoYkNhblNhdmUpIHsKKwkJCWJTdWNjZXNzID0gRnJlZUltYWdlX1NhdmUoZmlmLCBfZGliLCBscHN6UGF0aE5hbWUsIGZsYWcpOworCQkJcmV0dXJuIGJTdWNjZXNzOworCQl9CisJfQorCXJldHVybiBiU3VjY2VzczsKK30KKworQk9PTCBmaXBJbWFnZTo6c2F2ZVUoY29uc3Qgd2NoYXJfdCogbHBzelBhdGhOYW1lLCBpbnQgZmxhZykgY29uc3QgeworCUZSRUVfSU1BR0VfRk9STUFUIGZpZiA9IEZJRl9VTktOT1dOOworCUJPT0wgYlN1Y2Nlc3MgPSBGQUxTRTsKKworCS8vIFRyeSB0byBndWVzcyB0aGUgZmlsZSBmb3JtYXQgZnJvbSB0aGUgZmlsZSBleHRlbnNpb24KKwlmaWYgPSBGcmVlSW1hZ2VfR2V0RklGRnJvbUZpbGVuYW1lVShscHN6UGF0aE5hbWUpOworCWlmKGZpZiAhPSBGSUZfVU5LTk9XTiApIHsKKwkJLy8gQ2hlY2sgdGhhdCB0aGUgZGliIGNhbiBiZSBzYXZlZCBpbiB0aGlzIGZvcm1hdAorCQlCT09MIGJDYW5TYXZlOworCisJCUZSRUVfSU1BR0VfVFlQRSBpbWFnZV90eXBlID0gRnJlZUltYWdlX0dldEltYWdlVHlwZShfZGliKTsKKwkJaWYoaW1hZ2VfdHlwZSA9PSBGSVRfQklUTUFQKSB7CisJCQkvLyBzdGFuZGFyZCBiaXRtYXAgdHlwZQorCQkJV09SRCBicHAgPSBGcmVlSW1hZ2VfR2V0QlBQKF9kaWIpOworCQkJYkNhblNhdmUgPSAoRnJlZUltYWdlX0ZJRlN1cHBvcnRzV3JpdGluZyhmaWYpICYmIEZyZWVJbWFnZV9GSUZTdXBwb3J0c0V4cG9ydEJQUChmaWYsIGJwcCkpOworCQl9IGVsc2UgeworCQkJLy8gc3BlY2lhbCBiaXRtYXAgdHlwZQorCQkJYkNhblNhdmUgPSBGcmVlSW1hZ2VfRklGU3VwcG9ydHNFeHBvcnRUeXBlKGZpZiwgaW1hZ2VfdHlwZSk7CisJCX0KKworCQlpZihiQ2FuU2F2ZSkgeworCQkJYlN1Y2Nlc3MgPSBGcmVlSW1hZ2VfU2F2ZVUoZmlmLCBfZGliLCBscHN6UGF0aE5hbWUsIGZsYWcpOworCQkJcmV0dXJuIGJTdWNjZXNzOworCQl9CisJfQorCXJldHVybiBiU3VjY2VzczsKK30KKworQk9PTCBmaXBJbWFnZTo6c2F2ZVRvSGFuZGxlKEZSRUVfSU1BR0VfRk9STUFUIGZpZiwgRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBpbnQgZmxhZykgY29uc3QgeworCUJPT0wgYlN1Y2Nlc3MgPSBGQUxTRTsKKworCWlmKGZpZiAhPSBGSUZfVU5LTk9XTiApIHsKKwkJLy8gQ2hlY2sgdGhhdCB0aGUgZGliIGNhbiBiZSBzYXZlZCBpbiB0aGlzIGZvcm1hdAorCQlCT09MIGJDYW5TYXZlOworCisJCUZSRUVfSU1BR0VfVFlQRSBpbWFnZV90eXBlID0gRnJlZUltYWdlX0dldEltYWdlVHlwZShfZGliKTsKKwkJaWYoaW1hZ2VfdHlwZSA9PSBGSVRfQklUTUFQKSB7CisJCQkvLyBzdGFuZGFyZCBiaXRtYXAgdHlwZQorCQkJV09SRCBicHAgPSBGcmVlSW1hZ2VfR2V0QlBQKF9kaWIpOworCQkJYkNhblNhdmUgPSAoRnJlZUltYWdlX0ZJRlN1cHBvcnRzV3JpdGluZyhmaWYpICYmIEZyZWVJbWFnZV9GSUZTdXBwb3J0c0V4cG9ydEJQUChmaWYsIGJwcCkpOworCQl9IGVsc2UgeworCQkJLy8gc3BlY2lhbCBiaXRtYXAgdHlwZQorCQkJYkNhblNhdmUgPSBGcmVlSW1hZ2VfRklGU3VwcG9ydHNFeHBvcnRUeXBlKGZpZiwgaW1hZ2VfdHlwZSk7CisJCX0KKworCQlpZihiQ2FuU2F2ZSkgeworCQkJYlN1Y2Nlc3MgPSBGcmVlSW1hZ2VfU2F2ZVRvSGFuZGxlKGZpZiwgX2RpYiwgaW8sIGhhbmRsZSwgZmxhZyk7CisJCQlyZXR1cm4gYlN1Y2Nlc3M7CisJCX0KKwl9CisJcmV0dXJuIGJTdWNjZXNzOworfQorCitCT09MIGZpcEltYWdlOjpzYXZlVG9NZW1vcnkoRlJFRV9JTUFHRV9GT1JNQVQgZmlmLCBmaXBNZW1vcnlJTyYgbWVtSU8sIGludCBmbGFnKSBjb25zdCB7CisJQk9PTCBiU3VjY2VzcyA9IEZBTFNFOworCisJaWYoZmlmICE9IEZJRl9VTktOT1dOICkgeworCQkvLyBDaGVjayB0aGF0IHRoZSBkaWIgY2FuIGJlIHNhdmVkIGluIHRoaXMgZm9ybWF0CisJCUJPT0wgYkNhblNhdmU7CisKKwkJRlJFRV9JTUFHRV9UWVBFIGltYWdlX3R5cGUgPSBGcmVlSW1hZ2VfR2V0SW1hZ2VUeXBlKF9kaWIpOworCQlpZihpbWFnZV90eXBlID09IEZJVF9CSVRNQVApIHsKKwkJCS8vIHN0YW5kYXJkIGJpdG1hcCB0eXBlCisJCQlXT1JEIGJwcCA9IEZyZWVJbWFnZV9HZXRCUFAoX2RpYik7CisJCQliQ2FuU2F2ZSA9IChGcmVlSW1hZ2VfRklGU3VwcG9ydHNXcml0aW5nKGZpZikgJiYgRnJlZUltYWdlX0ZJRlN1cHBvcnRzRXhwb3J0QlBQKGZpZiwgYnBwKSk7CisJCX0gZWxzZSB7CisJCQkvLyBzcGVjaWFsIGJpdG1hcCB0eXBlCisJCQliQ2FuU2F2ZSA9IEZyZWVJbWFnZV9GSUZTdXBwb3J0c0V4cG9ydFR5cGUoZmlmLCBpbWFnZV90eXBlKTsKKwkJfQorCisJCWlmKGJDYW5TYXZlKSB7CisJCQliU3VjY2VzcyA9IG1lbUlPLnNhdmUoZmlmLCBfZGliLCBmbGFnKTsKKwkJCXJldHVybiBiU3VjY2VzczsKKwkJfQorCX0KKwlyZXR1cm4gYlN1Y2Nlc3M7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gICAKKy8vIENvbnZlcnNpb24gcm91dGluZXMKKworQk9PTCBmaXBJbWFnZTo6Y29udmVydFRvVHlwZShGUkVFX0lNQUdFX1RZUEUgaW1hZ2VfdHlwZSwgQk9PTCBzY2FsZV9saW5lYXIpIHsKKwlpZihfZGliKSB7CisJCUZJQklUTUFQICpkaWIgPSBGcmVlSW1hZ2VfQ29udmVydFRvVHlwZShfZGliLCBpbWFnZV90eXBlLCBzY2FsZV9saW5lYXIpOworCQlyZXR1cm4gcmVwbGFjZShkaWIpOworCX0KKwlyZXR1cm4gRkFMU0U7Cit9CisKK0JPT0wgZmlwSW1hZ2U6OnRocmVzaG9sZChCWVRFIFQpIHsKKwlpZihfZGliKSB7CisJCUZJQklUTUFQICpkaWIxID0gRnJlZUltYWdlX1RocmVzaG9sZChfZGliLCBUKTsKKwkJcmV0dXJuIHJlcGxhY2UoZGliMSk7CisJfQorCXJldHVybiBGQUxTRTsKK30KKworQk9PTCBmaXBJbWFnZTo6Y29udmVydFRvNEJpdHMoKSB7CisJaWYoX2RpYikgeworCQlGSUJJVE1BUCAqZGliNCA9IEZyZWVJbWFnZV9Db252ZXJ0VG80Qml0cyhfZGliKTsKKwkJcmV0dXJuIHJlcGxhY2UoZGliNCk7CisJfQorCXJldHVybiBGQUxTRTsKK30KKworQk9PTCBmaXBJbWFnZTo6Y29udmVydFRvOEJpdHMoKSB7CisJaWYoX2RpYikgeworCQlGSUJJVE1BUCAqZGliOCA9IEZyZWVJbWFnZV9Db252ZXJ0VG84Qml0cyhfZGliKTsKKwkJcmV0dXJuIHJlcGxhY2UoZGliOCk7CisJfQorCXJldHVybiBGQUxTRTsKK30KKworQk9PTCBmaXBJbWFnZTo6Y29udmVydFRvMTZCaXRzNTU1KCkgeworCWlmKF9kaWIpIHsKKwkJRklCSVRNQVAgKmRpYjE2XzU1NSA9IEZyZWVJbWFnZV9Db252ZXJ0VG8xNkJpdHM1NTUoX2RpYik7CisJCXJldHVybiByZXBsYWNlKGRpYjE2XzU1NSk7CisJfQorCXJldHVybiBGQUxTRTsKK30KKworQk9PTCBmaXBJbWFnZTo6Y29udmVydFRvMTZCaXRzNTY1KCkgeworCWlmKF9kaWIpIHsKKwkJRklCSVRNQVAgKmRpYjE2XzU2NSA9IEZyZWVJbWFnZV9Db252ZXJ0VG8xNkJpdHM1NjUoX2RpYik7CisJCXJldHVybiByZXBsYWNlKGRpYjE2XzU2NSk7CisJfQorCXJldHVybiBGQUxTRTsKK30KKworQk9PTCBmaXBJbWFnZTo6Y29udmVydFRvMjRCaXRzKCkgeworCWlmKF9kaWIpIHsKKwkJRklCSVRNQVAgKmRpYlJHQiA9IEZyZWVJbWFnZV9Db252ZXJ0VG8yNEJpdHMoX2RpYik7CisJCXJldHVybiByZXBsYWNlKGRpYlJHQik7CisJfQorCXJldHVybiBGQUxTRTsKK30KKworQk9PTCBmaXBJbWFnZTo6Y29udmVydFRvMzJCaXRzKCkgeworCWlmKF9kaWIpIHsKKwkJRklCSVRNQVAgKmRpYjMyID0gRnJlZUltYWdlX0NvbnZlcnRUbzMyQml0cyhfZGliKTsKKwkJcmV0dXJuIHJlcGxhY2UoZGliMzIpOworCX0KKwlyZXR1cm4gRkFMU0U7Cit9CisKK0JPT0wgZmlwSW1hZ2U6OmNvbnZlcnRUb0dyYXlzY2FsZSgpIHsKKwlpZihfZGliKSB7CisJCUZJQklUTUFQICpkaWI4ID0gRnJlZUltYWdlX0NvbnZlcnRUb0dyZXlzY2FsZShfZGliKTsKKwkJcmV0dXJuIHJlcGxhY2UoZGliOCk7CisJfQorCXJldHVybiBGQUxTRTsKK30KKworQk9PTCBmaXBJbWFnZTo6Y29sb3JRdWFudGl6ZShGUkVFX0lNQUdFX1FVQU5USVpFIGFsZ29yaXRobSkgeworCWlmKF9kaWIpIHsKKwkJRklCSVRNQVAgKmRpYjggPSBGcmVlSW1hZ2VfQ29sb3JRdWFudGl6ZShfZGliLCBhbGdvcml0aG0pOworCQlyZXR1cm4gcmVwbGFjZShkaWI4KTsKKwl9CisJcmV0dXJuIEZBTFNFOworfQorCitCT09MIGZpcEltYWdlOjpkaXRoZXIoRlJFRV9JTUFHRV9ESVRIRVIgYWxnb3JpdGhtKSB7CisJaWYoX2RpYikgeworCQlGSUJJVE1BUCAqZGliID0gRnJlZUltYWdlX0RpdGhlcihfZGliLCBhbGdvcml0aG0pOworCQlyZXR1cm4gcmVwbGFjZShkaWIpOworCX0KKwlyZXR1cm4gRkFMU0U7Cit9CisKK0JPT0wgZmlwSW1hZ2U6OmNvbnZlcnRUb0Zsb2F0KCkgeworCWlmKF9kaWIpIHsKKwkJRklCSVRNQVAgKmRpYiA9IEZyZWVJbWFnZV9Db252ZXJ0VG9GbG9hdChfZGliKTsKKwkJcmV0dXJuIHJlcGxhY2UoZGliKTsKKwl9CisJcmV0dXJuIEZBTFNFOworfQorCitCT09MIGZpcEltYWdlOjpjb252ZXJ0VG9SR0JGKCkgeworCWlmKF9kaWIpIHsKKwkJRklCSVRNQVAgKmRpYiA9IEZyZWVJbWFnZV9Db252ZXJ0VG9SR0JGKF9kaWIpOworCQlyZXR1cm4gcmVwbGFjZShkaWIpOworCX0KKwlyZXR1cm4gRkFMU0U7Cit9CisKK0JPT0wgZmlwSW1hZ2U6OmNvbnZlcnRUb1JHQkFGKCkgeworCWlmKF9kaWIpIHsKKwkJRklCSVRNQVAgKmRpYiA9IEZyZWVJbWFnZV9Db252ZXJ0VG9SR0JBRihfZGliKTsKKwkJcmV0dXJuIHJlcGxhY2UoZGliKTsKKwl9CisJcmV0dXJuIEZBTFNFOworfQorCitCT09MIGZpcEltYWdlOjpjb252ZXJ0VG9VSU5UMTYoKSB7CisJaWYoX2RpYikgeworCQlGSUJJVE1BUCAqZGliID0gRnJlZUltYWdlX0NvbnZlcnRUb1VJTlQxNihfZGliKTsKKwkJcmV0dXJuIHJlcGxhY2UoZGliKTsKKwl9CisJcmV0dXJuIEZBTFNFOworfQorCitCT09MIGZpcEltYWdlOjpjb252ZXJ0VG9SR0IxNigpIHsKKwlpZihfZGliKSB7CisJCUZJQklUTUFQICpkaWIgPSBGcmVlSW1hZ2VfQ29udmVydFRvUkdCMTYoX2RpYik7CisJCXJldHVybiByZXBsYWNlKGRpYik7CisJfQorCXJldHVybiBGQUxTRTsKK30KKworQk9PTCBmaXBJbWFnZTo6Y29udmVydFRvUkdCQTE2KCkgeworCWlmKF9kaWIpIHsKKwkJRklCSVRNQVAgKmRpYiA9IEZyZWVJbWFnZV9Db252ZXJ0VG9SR0JBMTYoX2RpYik7CisJCXJldHVybiByZXBsYWNlKGRpYik7CisJfQorCXJldHVybiBGQUxTRTsKK30KKworQk9PTCBmaXBJbWFnZTo6dG9uZU1hcHBpbmcoRlJFRV9JTUFHRV9UTU8gdG1vLCBkb3VibGUgZmlyc3RfcGFyYW0sIGRvdWJsZSBzZWNvbmRfcGFyYW0sIGRvdWJsZSB0aGlyZF9wYXJhbSwgZG91YmxlIGZvdXJ0aF9wYXJhbSkgeworCWlmKF9kaWIpIHsKKwkJRklCSVRNQVAgKmRzdCA9IE5VTEw7CisJCS8vIEFwcGx5IGEgdG9uZSBtYXBwaW5nIGFsZ29yaXRobSBhbmQgY29udmVydCB0byAyNC1iaXQgCisJCXN3aXRjaCh0bW8pIHsKKwkJCWNhc2UgRklUTU9fUkVJTkhBUkQwNToKKwkJCQlkc3QgPSBGcmVlSW1hZ2VfVG1vUmVpbmhhcmQwNUV4KF9kaWIsIGZpcnN0X3BhcmFtLCBzZWNvbmRfcGFyYW0sIHRoaXJkX3BhcmFtLCBmb3VydGhfcGFyYW0pOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlkc3QgPSBGcmVlSW1hZ2VfVG9uZU1hcHBpbmcoX2RpYiwgdG1vLCBmaXJzdF9wYXJhbSwgc2Vjb25kX3BhcmFtKTsKKwkJCQlicmVhazsKKwkJfQorCisJCXJldHVybiByZXBsYWNlKGRzdCk7CisJfQorCXJldHVybiBGQUxTRTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgIAorLy8gVHJhbnNwYXJlbmN5IHN1cHBvcnQ6IGJhY2tncm91bmQgY29sb3VyIGFuZCBhbHBoYSBjaGFubmVsCisKK0JPT0wgZmlwSW1hZ2U6OmlzVHJhbnNwYXJlbnQoKSBjb25zdCB7CisJcmV0dXJuIEZyZWVJbWFnZV9Jc1RyYW5zcGFyZW50KF9kaWIpOworfQorCit1bnNpZ25lZCBmaXBJbWFnZTo6Z2V0VHJhbnNwYXJlbmN5Q291bnQoKSBjb25zdCB7CisJcmV0dXJuIEZyZWVJbWFnZV9HZXRUcmFuc3BhcmVuY3lDb3VudChfZGliKTsKK30KKworQllURSogZmlwSW1hZ2U6OmdldFRyYW5zcGFyZW5jeVRhYmxlKCkgY29uc3QgeworCXJldHVybiBGcmVlSW1hZ2VfR2V0VHJhbnNwYXJlbmN5VGFibGUoX2RpYik7Cit9CisKK3ZvaWQgZmlwSW1hZ2U6OnNldFRyYW5zcGFyZW5jeVRhYmxlKEJZVEUgKnRhYmxlLCBpbnQgY291bnQpIHsKKwlGcmVlSW1hZ2VfU2V0VHJhbnNwYXJlbmN5VGFibGUoX2RpYiwgdGFibGUsIGNvdW50KTsKKwlfYkhhc0NoYW5nZWQgPSBUUlVFOworfQorCitCT09MIGZpcEltYWdlOjpoYXNGaWxlQmtDb2xvcigpIGNvbnN0IHsKKwlyZXR1cm4gRnJlZUltYWdlX0hhc0JhY2tncm91bmRDb2xvcihfZGliKTsKK30KKworQk9PTCBmaXBJbWFnZTo6Z2V0RmlsZUJrQ29sb3IoUkdCUVVBRCAqYmtjb2xvcikgY29uc3QgeworCXJldHVybiBGcmVlSW1hZ2VfR2V0QmFja2dyb3VuZENvbG9yKF9kaWIsIGJrY29sb3IpOworfQorCitCT09MIGZpcEltYWdlOjpzZXRGaWxlQmtDb2xvcihSR0JRVUFEICpia2NvbG9yKSB7CisJX2JIYXNDaGFuZ2VkID0gVFJVRTsKKwlyZXR1cm4gRnJlZUltYWdlX1NldEJhY2tncm91bmRDb2xvcihfZGliLCBia2NvbG9yKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgIAorLy8gQ2hhbm5lbCBwcm9jZXNzaW5nIHN1cHBvcnQKKworQk9PTCBmaXBJbWFnZTo6Z2V0Q2hhbm5lbChmaXBJbWFnZSYgaW1hZ2UsIEZSRUVfSU1BR0VfQ09MT1JfQ0hBTk5FTCBjaGFubmVsKSBjb25zdCB7CisJaWYoX2RpYikgeworCQlpbWFnZSA9IEZyZWVJbWFnZV9HZXRDaGFubmVsKF9kaWIsIGNoYW5uZWwpOworCQlyZXR1cm4gaW1hZ2UuaXNWYWxpZCgpOworCX0KKwlyZXR1cm4gRkFMU0U7Cit9CisKK0JPT0wgZmlwSW1hZ2U6OnNldENoYW5uZWwoZmlwSW1hZ2UmIGltYWdlLCBGUkVFX0lNQUdFX0NPTE9SX0NIQU5ORUwgY2hhbm5lbCkgeworCWlmKF9kaWIpIHsKKwkJX2JIYXNDaGFuZ2VkID0gVFJVRTsKKwkJcmV0dXJuIEZyZWVJbWFnZV9TZXRDaGFubmVsKF9kaWIsIGltYWdlLl9kaWIsIGNoYW5uZWwpOworCX0KKwlyZXR1cm4gRkFMU0U7Cit9CisKK0JPT0wgZmlwSW1hZ2U6OnNwbGl0Q2hhbm5lbHMoZmlwSW1hZ2UmIFJlZENoYW5uZWwsIGZpcEltYWdlJiBHcmVlbkNoYW5uZWwsIGZpcEltYWdlJiBCbHVlQ2hhbm5lbCkgeworCWlmKF9kaWIpIHsKKwkJUmVkQ2hhbm5lbCA9IEZyZWVJbWFnZV9HZXRDaGFubmVsKF9kaWIsIEZJQ0NfUkVEKTsKKwkJR3JlZW5DaGFubmVsID0gRnJlZUltYWdlX0dldENoYW5uZWwoX2RpYiwgRklDQ19HUkVFTik7CisJCUJsdWVDaGFubmVsID0gRnJlZUltYWdlX0dldENoYW5uZWwoX2RpYiwgRklDQ19CTFVFKTsKKworCQlyZXR1cm4gKFJlZENoYW5uZWwuaXNWYWxpZCgpICYmIEdyZWVuQ2hhbm5lbC5pc1ZhbGlkKCkgJiYgQmx1ZUNoYW5uZWwuaXNWYWxpZCgpKTsKKwl9CisJcmV0dXJuIEZBTFNFOworfQorCitCT09MIGZpcEltYWdlOjpjb21iaW5lQ2hhbm5lbHMoZmlwSW1hZ2UmIHJlZCwgZmlwSW1hZ2UmIGdyZWVuLCBmaXBJbWFnZSYgYmx1ZSkgeworCWlmKCFfZGliKSB7CisJCWludCB3aWR0aCA9IHJlZC5nZXRXaWR0aCgpOworCQlpbnQgaGVpZ2h0ID0gcmVkLmdldEhlaWdodCgpOworCQlfZGliID0gRnJlZUltYWdlX0FsbG9jYXRlKHdpZHRoLCBoZWlnaHQsIDI0LCBGSV9SR0JBX1JFRF9NQVNLLCBGSV9SR0JBX0dSRUVOX01BU0ssIEZJX1JHQkFfQkxVRV9NQVNLKTsKKwl9CisKKwlpZihfZGliKSB7CisJCUJPT0wgYlJlc3VsdCA9IFRSVUU7CisJCWJSZXN1bHQgJj0gRnJlZUltYWdlX1NldENoYW5uZWwoX2RpYiwgcmVkLl9kaWIsIEZJQ0NfUkVEKTsKKwkJYlJlc3VsdCAmPSBGcmVlSW1hZ2VfU2V0Q2hhbm5lbChfZGliLCBncmVlbi5fZGliLCBGSUNDX0dSRUVOKTsKKwkJYlJlc3VsdCAmPSBGcmVlSW1hZ2VfU2V0Q2hhbm5lbChfZGliLCBibHVlLl9kaWIsIEZJQ0NfQkxVRSk7CisKKwkJX2JIYXNDaGFuZ2VkID0gVFJVRTsKKworCQlyZXR1cm4gYlJlc3VsdDsKKwl9CisJcmV0dXJuIEZBTFNFOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICAgCisvLyBSb3RhdGlvbiBhbmQgZmxpcHBpbmcKKworQk9PTCBmaXBJbWFnZTo6cm90YXRlRXgoZG91YmxlIGFuZ2xlLCBkb3VibGUgeF9zaGlmdCwgZG91YmxlIHlfc2hpZnQsIGRvdWJsZSB4X29yaWdpbiwgZG91YmxlIHlfb3JpZ2luLCBCT09MIHVzZV9tYXNrKSB7CisJaWYoX2RpYikgeworCQlpZihGcmVlSW1hZ2VfR2V0QlBQKF9kaWIpID49IDgpIHsKKwkJCUZJQklUTUFQICpyb3RhdGVkID0gRnJlZUltYWdlX1JvdGF0ZUV4KF9kaWIsIGFuZ2xlLCB4X3NoaWZ0LCB5X3NoaWZ0LCB4X29yaWdpbiwgeV9vcmlnaW4sIHVzZV9tYXNrKTsKKwkJCXJldHVybiByZXBsYWNlKHJvdGF0ZWQpOworCQl9CisJfQorCXJldHVybiBGQUxTRTsKK30KKworQk9PTCBmaXBJbWFnZTo6cm90YXRlKGRvdWJsZSBhbmdsZSwgY29uc3Qgdm9pZCAqYmtjb2xvcikgeworCWlmKF9kaWIpIHsKKwkJc3dpdGNoKEZyZWVJbWFnZV9HZXRJbWFnZVR5cGUoX2RpYikpIHsKKwkJCWNhc2UgRklUX0JJVE1BUDoKKwkJCQlzd2l0Y2goRnJlZUltYWdlX0dldEJQUChfZGliKSkgeworCQkJCQljYXNlIDE6CisJCQkJCWNhc2UgODoKKwkJCQkJY2FzZSAyNDoKKwkJCQkJY2FzZSAzMjoKKwkJCQkJCWJyZWFrOworCQkJCQlkZWZhdWx0OgorCQkJCQkJcmV0dXJuIEZBTFNFOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJY2FzZSBGSVRfVUlOVDE2OgorCQkJY2FzZSBGSVRfUkdCMTY6CisJCQljYXNlIEZJVF9SR0JBMTY6CisJCQljYXNlIEZJVF9GTE9BVDoKKwkJCWNhc2UgRklUX1JHQkY6CisJCQljYXNlIEZJVF9SR0JBRjoKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIEZBTFNFOworCQkJCWJyZWFrOworCQl9CisKKwkJRklCSVRNQVAgKnJvdGF0ZWQgPSBGcmVlSW1hZ2VfUm90YXRlKF9kaWIsIGFuZ2xlLCBia2NvbG9yKTsKKwkJcmV0dXJuIHJlcGxhY2Uocm90YXRlZCk7CisKKwl9CisJcmV0dXJuIEZBTFNFOworfQorCitCT09MIGZpcEltYWdlOjpmbGlwVmVydGljYWwoKSB7CisJaWYoX2RpYikgeworCQlfYkhhc0NoYW5nZWQgPSBUUlVFOworCisJCXJldHVybiBGcmVlSW1hZ2VfRmxpcFZlcnRpY2FsKF9kaWIpOworCX0KKwlyZXR1cm4gRkFMU0U7Cit9CisKK0JPT0wgZmlwSW1hZ2U6OmZsaXBIb3Jpem9udGFsKCkgeworCWlmKF9kaWIpIHsKKwkJX2JIYXNDaGFuZ2VkID0gVFJVRTsKKworCQlyZXR1cm4gRnJlZUltYWdlX0ZsaXBIb3Jpem9udGFsKF9kaWIpOworCX0KKwlyZXR1cm4gRkFMU0U7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gICAKKy8vIENvbG9yIG1hbmlwdWxhdGlvbiByb3V0aW5lcworCitCT09MIGZpcEltYWdlOjppbnZlcnQoKSB7CisJaWYoX2RpYikgeworCQlfYkhhc0NoYW5nZWQgPSBUUlVFOworCisJCXJldHVybiBGcmVlSW1hZ2VfSW52ZXJ0KF9kaWIpOworCX0KKwlyZXR1cm4gRkFMU0U7Cit9CisKK0JPT0wgZmlwSW1hZ2U6OmFkanVzdEN1cnZlKEJZVEUgKkxVVCwgRlJFRV9JTUFHRV9DT0xPUl9DSEFOTkVMIGNoYW5uZWwpIHsKKwlpZihfZGliKSB7CisJCV9iSGFzQ2hhbmdlZCA9IFRSVUU7CisKKwkJcmV0dXJuIEZyZWVJbWFnZV9BZGp1c3RDdXJ2ZShfZGliLCBMVVQsIGNoYW5uZWwpOworCX0KKwlyZXR1cm4gRkFMU0U7Cit9CisKK0JPT0wgZmlwSW1hZ2U6OmFkanVzdEdhbW1hKGRvdWJsZSBnYW1tYSkgeworCWlmKF9kaWIpIHsKKwkJX2JIYXNDaGFuZ2VkID0gVFJVRTsKKworCQlyZXR1cm4gRnJlZUltYWdlX0FkanVzdEdhbW1hKF9kaWIsIGdhbW1hKTsKKwl9CisJcmV0dXJuIEZBTFNFOworfQorCitCT09MIGZpcEltYWdlOjphZGp1c3RCcmlnaHRuZXNzKGRvdWJsZSBwZXJjZW50YWdlKSB7CisJaWYoX2RpYikgeworCQlfYkhhc0NoYW5nZWQgPSBUUlVFOworCisJCXJldHVybiBGcmVlSW1hZ2VfQWRqdXN0QnJpZ2h0bmVzcyhfZGliLCBwZXJjZW50YWdlKTsKKwl9CisJcmV0dXJuIEZBTFNFOworfQorCitCT09MIGZpcEltYWdlOjphZGp1c3RDb250cmFzdChkb3VibGUgcGVyY2VudGFnZSkgeworCWlmKF9kaWIpIHsKKwkJX2JIYXNDaGFuZ2VkID0gVFJVRTsKKworCQlyZXR1cm4gRnJlZUltYWdlX0FkanVzdENvbnRyYXN0KF9kaWIsIHBlcmNlbnRhZ2UpOworCX0KKwlyZXR1cm4gRkFMU0U7Cit9CisKK0JPT0wgZmlwSW1hZ2U6OmFkanVzdEJyaWdodG5lc3NDb250cmFzdEdhbW1hKGRvdWJsZSBicmlnaHRuZXNzLCBkb3VibGUgY29udHJhc3QsIGRvdWJsZSBnYW1tYSkgeworCWlmKF9kaWIpIHsKKwkJX2JIYXNDaGFuZ2VkID0gVFJVRTsKKworCQlyZXR1cm4gRnJlZUltYWdlX0FkanVzdENvbG9ycyhfZGliLCBicmlnaHRuZXNzLCBjb250cmFzdCwgZ2FtbWEsIEZBTFNFKTsKKwl9CisJcmV0dXJuIEZBTFNFOworfQorCitCT09MIGZpcEltYWdlOjpnZXRIaXN0b2dyYW0oRFdPUkQgKmhpc3RvLCBGUkVFX0lNQUdFX0NPTE9SX0NIQU5ORUwgY2hhbm5lbCkgY29uc3QgeworCWlmKF9kaWIpIHsKKwkJcmV0dXJuIEZyZWVJbWFnZV9HZXRIaXN0b2dyYW0oX2RpYiwgaGlzdG8sIGNoYW5uZWwpOworCX0KKwlyZXR1cm4gRkFMU0U7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFVwc2FtcGxpbmcgLyBkb3duc2FtcGxpbmcgcm91dGluZQorCitCT09MIGZpcEltYWdlOjpyZXNjYWxlKHVuc2lnbmVkIG5ld193aWR0aCwgdW5zaWduZWQgbmV3X2hlaWdodCwgRlJFRV9JTUFHRV9GSUxURVIgZmlsdGVyKSB7CisJaWYoX2RpYikgeworCQlzd2l0Y2goRnJlZUltYWdlX0dldEltYWdlVHlwZShfZGliKSkgeworCQkJY2FzZSBGSVRfQklUTUFQOgorCQkJY2FzZSBGSVRfVUlOVDE2OgorCQkJY2FzZSBGSVRfUkdCMTY6CisJCQljYXNlIEZJVF9SR0JBMTY6CisJCQljYXNlIEZJVF9GTE9BVDoKKwkJCWNhc2UgRklUX1JHQkY6CisJCQljYXNlIEZJVF9SR0JBRjoKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIEZBTFNFOworCQkJCWJyZWFrOworCQl9CisKKwkJLy8gUGVyZm9ybSB1cHNhbXBsaW5nIC8gZG93bnNhbXBsaW5nCisJCUZJQklUTUFQICpkc3QgPSBGcmVlSW1hZ2VfUmVzY2FsZShfZGliLCBuZXdfd2lkdGgsIG5ld19oZWlnaHQsIGZpbHRlcik7CisJCXJldHVybiByZXBsYWNlKGRzdCk7CisJfQorCXJldHVybiBGQUxTRTsKK30KKworQk9PTCBmaXBJbWFnZTo6bWFrZVRodW1ibmFpbCh1bnNpZ25lZCBtYXhfc2l6ZSwgQk9PTCBjb252ZXJ0KSB7CisJaWYoX2RpYikgeworCQlzd2l0Y2goRnJlZUltYWdlX0dldEltYWdlVHlwZShfZGliKSkgeworCQkJY2FzZSBGSVRfQklUTUFQOgorCQkJY2FzZSBGSVRfVUlOVDE2OgorCQkJY2FzZSBGSVRfUkdCMTY6CisJCQljYXNlIEZJVF9SR0JBMTY6CisJCQljYXNlIEZJVF9GTE9BVDoKKwkJCWNhc2UgRklUX1JHQkY6CisJCQljYXNlIEZJVF9SR0JBRjoKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIEZBTFNFOworCQkJCWJyZWFrOworCQl9CisKKwkJLy8gUGVyZm9ybSBkb3duc2FtcGxpbmcKKwkJRklCSVRNQVAgKmRzdCA9IEZyZWVJbWFnZV9NYWtlVGh1bWJuYWlsKF9kaWIsIG1heF9zaXplLCBjb252ZXJ0KTsKKwkJcmV0dXJuIHJlcGxhY2UoZHN0KTsKKwl9CisJcmV0dXJuIEZBTFNFOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBNZXRhZGF0YQorCit1bnNpZ25lZCBmaXBJbWFnZTo6Z2V0TWV0YWRhdGFDb3VudChGUkVFX0lNQUdFX01ETU9ERUwgbW9kZWwpIGNvbnN0IHsKKwlyZXR1cm4gRnJlZUltYWdlX0dldE1ldGFkYXRhQ291bnQobW9kZWwsIF9kaWIpOworfQorCitCT09MIGZpcEltYWdlOjpnZXRNZXRhZGF0YShGUkVFX0lNQUdFX01ETU9ERUwgbW9kZWwsIGNvbnN0IGNoYXIgKmtleSwgZmlwVGFnJiB0YWcpIGNvbnN0IHsKKwlGSVRBRyAqc2VhcmNoZWRUYWcgPSBOVUxMOworCUZyZWVJbWFnZV9HZXRNZXRhZGF0YShtb2RlbCwgX2RpYiwga2V5LCAmc2VhcmNoZWRUYWcpOworCWlmKHNlYXJjaGVkVGFnICE9IE5VTEwpIHsKKwkJdGFnID0gRnJlZUltYWdlX0Nsb25lVGFnKHNlYXJjaGVkVGFnKTsKKwkJcmV0dXJuIFRSVUU7CisJfSBlbHNlIHsKKwkJLy8gY2xlYXIgdGhlIHRhZworCQl0YWcgPSAoRklUQUcqKU5VTEw7CisJfQorCXJldHVybiBGQUxTRTsKK30KKworQk9PTCBmaXBJbWFnZTo6c2V0TWV0YWRhdGEoRlJFRV9JTUFHRV9NRE1PREVMIG1vZGVsLCBjb25zdCBjaGFyICprZXksIGZpcFRhZyYgdGFnKSB7CisJcmV0dXJuIEZyZWVJbWFnZV9TZXRNZXRhZGF0YShtb2RlbCwgX2RpYiwga2V5LCB0YWcpOworfQorCmRpZmYgLS1naXQgYS9maWxlcy9XcmFwcGVyL0ZyZWVJbWFnZVBsdXMvc3JjL2ZpcE1lbW9yeUlPLmNwcCBiL2ZpbGVzL1dyYXBwZXIvRnJlZUltYWdlUGx1cy9zcmMvZmlwTWVtb3J5SU8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhOGZlODAKLS0tIC9kZXYvbnVsbAorKysgYi9maWxlcy9XcmFwcGVyL0ZyZWVJbWFnZVBsdXMvc3JjL2ZpcE1lbW9yeUlPLmNwcApAQCAtMCwwICsxLDk1IEBACisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBmaXBNZW1vcnlJTyBjbGFzcyBpbXBsZW1lbnRhdGlvbgorLy8KKy8vIERlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gYnkKKy8vIC0gSGVydukgRHJvbG9uIChkcm9sb25AaW5mb25pZS5mcikKKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBGcmVlSW1hZ2UgMworLy8KKy8vIENPVkVSRUQgQ09ERSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWQorLy8gT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMKKy8vIFRIQVQgVEhFIENPVkVSRUQgQ09ERSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLy8gT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQKKy8vIENPREUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkgQ09WRVJFRCBDT0RFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QKKy8vIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZCisvLyBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMCisvLyBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GIEFOWSBDT1ZFUkVEIENPREUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSCisvLyBUSElTIERJU0NMQUlNRVIuCisvLworLy8gVXNlIGF0IHlvdXIgb3duIHJpc2shCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpbmNsdWRlICJGcmVlSW1hZ2VQbHVzLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCitmaXBNZW1vcnlJTzo6ZmlwTWVtb3J5SU8oQllURSAqZGF0YSwgRFdPUkQgc2l6ZV9pbl9ieXRlcykgeworCV9obWVtID0gRnJlZUltYWdlX09wZW5NZW1vcnkoZGF0YSwgc2l6ZV9pbl9ieXRlcyk7Cit9CisKK2ZpcE1lbW9yeUlPOjp+ZmlwTWVtb3J5SU8oKSB7IAorCWlmKF9obWVtICE9IE5VTEwpIHsKKwkJRnJlZUltYWdlX0Nsb3NlTWVtb3J5KF9obWVtKTsKKwl9Cit9CisKK3ZvaWQgZmlwTWVtb3J5SU86OmNsb3NlKCkgeyAKKwlpZihfaG1lbSAhPSBOVUxMKSB7CisJCUZyZWVJbWFnZV9DbG9zZU1lbW9yeShfaG1lbSk7CisJCV9obWVtID0gTlVMTDsKKwl9Cit9CisKK0JPT0wgZmlwTWVtb3J5SU86OmlzVmFsaWQoKSBjb25zdCB7CisJcmV0dXJuIChfaG1lbSAhPSBOVUxMKTsKK30KKworRlJFRV9JTUFHRV9GT1JNQVQgZmlwTWVtb3J5SU86OmdldEZpbGVUeXBlKCkgY29uc3QgeworCWlmKF9obWVtICE9IE5VTEwpIHsKKwkJcmV0dXJuIEZyZWVJbWFnZV9HZXRGaWxlVHlwZUZyb21NZW1vcnkoX2htZW0sIDApOworCX0KKworCXJldHVybiBGSUZfVU5LTk9XTjsKK30KKworRklCSVRNQVAqIGZpcE1lbW9yeUlPOjpsb2FkKEZSRUVfSU1BR0VfRk9STUFUIGZpZiwgaW50IGZsYWdzKSBjb25zdCB7CisJcmV0dXJuIEZyZWVJbWFnZV9Mb2FkRnJvbU1lbW9yeShmaWYsIF9obWVtLCBmbGFncyk7Cit9CisKK0ZJTVVMVElCSVRNQVAqIGZpcE1lbW9yeUlPOjpsb2FkTXVsdGlQYWdlKEZSRUVfSU1BR0VfRk9STUFUIGZpZiwgaW50IGZsYWdzKSBjb25zdCB7CisJcmV0dXJuIEZyZWVJbWFnZV9Mb2FkTXVsdGlCaXRtYXBGcm9tTWVtb3J5KGZpZiwgX2htZW0sIGZsYWdzKTsKK30KKworQk9PTCBmaXBNZW1vcnlJTzo6c2F2ZShGUkVFX0lNQUdFX0ZPUk1BVCBmaWYsIEZJQklUTUFQICpkaWIsIGludCBmbGFncykgeworCXJldHVybiBGcmVlSW1hZ2VfU2F2ZVRvTWVtb3J5KGZpZiwgZGliLCBfaG1lbSwgZmxhZ3MpOworfQorCitCT09MIGZpcE1lbW9yeUlPOjpzYXZlTXVsdGlQYWdlKEZSRUVfSU1BR0VfRk9STUFUIGZpZiwgRklNVUxUSUJJVE1BUCAqYml0bWFwLCBpbnQgZmxhZ3MpIHsKKwlyZXR1cm4gRnJlZUltYWdlX1NhdmVNdWx0aUJpdG1hcFRvTWVtb3J5KGZpZiwgYml0bWFwLCBfaG1lbSwgZmxhZ3MpOworfQorCit1bnNpZ25lZCBmaXBNZW1vcnlJTzo6cmVhZCh2b2lkICpidWZmZXIsIHVuc2lnbmVkIHNpemUsIHVuc2lnbmVkIGNvdW50KSBjb25zdCB7CisJcmV0dXJuIEZyZWVJbWFnZV9SZWFkTWVtb3J5KGJ1ZmZlciwgc2l6ZSwgY291bnQsIF9obWVtKTsKK30KKwordW5zaWduZWQgZmlwTWVtb3J5SU86OndyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgc2l6ZSwgdW5zaWduZWQgY291bnQpIHsKKwlyZXR1cm4gRnJlZUltYWdlX1dyaXRlTWVtb3J5KGJ1ZmZlciwgc2l6ZSwgY291bnQsIF9obWVtKTsKK30KKworbG9uZyBmaXBNZW1vcnlJTzo6dGVsbCgpIGNvbnN0IHsKKwlyZXR1cm4gRnJlZUltYWdlX1RlbGxNZW1vcnkoX2htZW0pOworfQorCitCT09MIGZpcE1lbW9yeUlPOjpzZWVrKGxvbmcgb2Zmc2V0LCBpbnQgb3JpZ2luKSB7CisJcmV0dXJuIEZyZWVJbWFnZV9TZWVrTWVtb3J5KF9obWVtLCBvZmZzZXQsIG9yaWdpbik7Cit9CisKK0JPT0wgZmlwTWVtb3J5SU86OmFjcXVpcmUoQllURSAqKmRhdGEsIERXT1JEICpzaXplX2luX2J5dGVzKSB7CisJcmV0dXJuIEZyZWVJbWFnZV9BY3F1aXJlTWVtb3J5KF9obWVtLCBkYXRhLCBzaXplX2luX2J5dGVzKTsKK30KKworCmRpZmYgLS1naXQgYS9maWxlcy9XcmFwcGVyL0ZyZWVJbWFnZVBsdXMvc3JjL2ZpcE1ldGFkYXRhRmluZC5jcHAgYi9maWxlcy9XcmFwcGVyL0ZyZWVJbWFnZVBsdXMvc3JjL2ZpcE1ldGFkYXRhRmluZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdkMDFmNgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1dyYXBwZXIvRnJlZUltYWdlUGx1cy9zcmMvZmlwTWV0YWRhdGFGaW5kLmNwcApAQCAtMCwwICsxLDU0IEBACisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBmaXBNZXRhZGF0YUZpbmQgY2xhc3MgaW1wbGVtZW50YXRpb24KKy8vCisvLyBEZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIGJ5CisvLyAtIEhlcnbpIERyb2xvbiAoZHJvbG9uQGluZm9uaWUuZnIpCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRnJlZUltYWdlIDMKKy8vCisvLyBDT1ZFUkVEIENPREUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkKKy8vIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTCisvLyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy8vIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVECisvLyBDT0RFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UCisvLyBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWQorLy8gU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTAorLy8gUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUgorLy8gVEhJUyBESVNDTEFJTUVSLgorLy8KKy8vIFVzZSBhdCB5b3VyIG93biByaXNrIQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaW5jbHVkZSAiRnJlZUltYWdlUGx1cy5oIgorCitCT09MIGZpcE1ldGFkYXRhRmluZDo6aXNWYWxpZCgpIGNvbnN0IHsKKwlyZXR1cm4gKF9tZGhhbmRsZSAhPSBOVUxMKSA/IFRSVUUgOiBGQUxTRTsKK30KKworZmlwTWV0YWRhdGFGaW5kOjpmaXBNZXRhZGF0YUZpbmQoKSA6IF9tZGhhbmRsZShOVUxMKSB7Cit9CisKK2ZpcE1ldGFkYXRhRmluZDo6fmZpcE1ldGFkYXRhRmluZCgpIHsKKwlGcmVlSW1hZ2VfRmluZENsb3NlTWV0YWRhdGEoX21kaGFuZGxlKTsKK30KKworQk9PTCBmaXBNZXRhZGF0YUZpbmQ6OmZpbmRGaXJzdE1ldGFkYXRhKEZSRUVfSU1BR0VfTURNT0RFTCBtb2RlbCwgZmlwSW1hZ2UmIGltYWdlLCBmaXBUYWcmIHRhZykgeworCUZJVEFHICpmaXJzdFRhZyA9IE5VTEw7CisJaWYoX21kaGFuZGxlKSBGcmVlSW1hZ2VfRmluZENsb3NlTWV0YWRhdGEoX21kaGFuZGxlKTsKKwlfbWRoYW5kbGUgPSBGcmVlSW1hZ2VfRmluZEZpcnN0TWV0YWRhdGEobW9kZWwsIGltYWdlLCAmZmlyc3RUYWcpOworCWlmKF9tZGhhbmRsZSkgeworCQl0YWcgPSBGcmVlSW1hZ2VfQ2xvbmVUYWcoZmlyc3RUYWcpOworCQlyZXR1cm4gVFJVRTsKKwl9CisJcmV0dXJuIEZBTFNFOworfSAKKworQk9PTCBmaXBNZXRhZGF0YUZpbmQ6OmZpbmROZXh0TWV0YWRhdGEoZmlwVGFnJiB0YWcpIHsKKwlGSVRBRyAqbmV4dFRhZyA9IE5VTEw7CisJaWYoIEZyZWVJbWFnZV9GaW5kTmV4dE1ldGFkYXRhKF9tZGhhbmRsZSwgJm5leHRUYWcpICkgeworCQl0YWcgPSBGcmVlSW1hZ2VfQ2xvbmVUYWcobmV4dFRhZyk7CisJCXJldHVybiBUUlVFOworCX0KKwlyZXR1cm4gRkFMU0U7Cit9CisKZGlmZiAtLWdpdCBhL2ZpbGVzL1dyYXBwZXIvRnJlZUltYWdlUGx1cy9zcmMvZmlwTXVsdGlQYWdlLmNwcCBiL2ZpbGVzL1dyYXBwZXIvRnJlZUltYWdlUGx1cy9zcmMvZmlwTXVsdGlQYWdlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzMzMTk2Ci0tLSAvZGV2L251bGwKKysrIGIvZmlsZXMvV3JhcHBlci9GcmVlSW1hZ2VQbHVzL3NyYy9maXBNdWx0aVBhZ2UuY3BwCkBAIC0wLDAgKzEsMTQwIEBACisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBmaXBNdWx0aVBhZ2UgY2xhc3MgaW1wbGVtZW50YXRpb24KKy8vCisvLyBEZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIGJ5CisvLyAtIEhlcnbpIERyb2xvbiAoZHJvbG9uQGluZm9uaWUuZnIpCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRnJlZUltYWdlIDMKKy8vCisvLyBDT1ZFUkVEIENPREUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkKKy8vIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTCisvLyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy8vIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVECisvLyBDT0RFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UCisvLyBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWQorLy8gU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTAorLy8gUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUgorLy8gVEhJUyBESVNDTEFJTUVSLgorLy8KKy8vIFVzZSBhdCB5b3VyIG93biByaXNrIQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaW5jbHVkZSAiRnJlZUltYWdlUGx1cy5oIgorCitmaXBNdWx0aVBhZ2U6OmZpcE11bHRpUGFnZShCT09MIGtlZXBfY2FjaGVfaW5fbWVtb3J5KSA6IF9tcGFnZShOVUxMKSwgX2JNZW1vcnlDYWNoZShrZWVwX2NhY2hlX2luX21lbW9yeSkgeworfQorCitmaXBNdWx0aVBhZ2U6On5maXBNdWx0aVBhZ2UoKSB7CisJaWYoX21wYWdlKSB7CisJCS8vIGNsb3NlIHRoZSBzdHJlYW0KKwkJY2xvc2UoMCk7CisJfQorfQorCitCT09MIGZpcE11bHRpUGFnZTo6aXNWYWxpZCgpIGNvbnN0IHsKKwlyZXR1cm4gKE5VTEwgIT0gX21wYWdlKSA/IFRSVUUgOiBGQUxTRTsKK30KKworQk9PTCBmaXBNdWx0aVBhZ2U6Om9wZW4oY29uc3QgY2hhciogbHBzelBhdGhOYW1lLCBCT09MIGNyZWF0ZV9uZXcsIEJPT0wgcmVhZF9vbmx5LCBpbnQgZmxhZ3MpIHsKKwkvLyB0cnkgdG8gZ3Vlc3MgdGhlIGZpbGUgZm9ybWF0IGZyb20gdGhlIGZpbGVuYW1lCisJRlJFRV9JTUFHRV9GT1JNQVQgZmlmID0gRnJlZUltYWdlX0dldEZJRkZyb21GaWxlbmFtZShscHN6UGF0aE5hbWUpOworCisJLy8gb3BlbiB0aGUgc3RyZWFtCisJX21wYWdlID0gRnJlZUltYWdlX09wZW5NdWx0aUJpdG1hcChmaWYsIGxwc3pQYXRoTmFtZSwgY3JlYXRlX25ldywgcmVhZF9vbmx5LCBfYk1lbW9yeUNhY2hlLCBmbGFncyk7CisKKwlyZXR1cm4gKE5VTEwgIT0gX21wYWdlICkgPyBUUlVFIDogRkFMU0U7Cit9CisKK0JPT0wgZmlwTXVsdGlQYWdlOjpvcGVuKGZpcE1lbW9yeUlPJiBtZW1JTywgaW50IGZsYWdzKSB7CisJLy8gdHJ5IHRvIGd1ZXNzIHRoZSBmaWxlIGZvcm1hdCBmcm9tIHRoZSBtZW1vcnkgaGFuZGxlCisJRlJFRV9JTUFHRV9GT1JNQVQgZmlmID0gbWVtSU8uZ2V0RmlsZVR5cGUoKTsKKworCS8vIG9wZW4gdGhlIHN0cmVhbQorCV9tcGFnZSA9IG1lbUlPLmxvYWRNdWx0aVBhZ2UoZmlmLCBmbGFncyk7CisKKwlyZXR1cm4gKE5VTEwgIT0gX21wYWdlICkgPyBUUlVFIDogRkFMU0U7Cit9CisKK0JPT0wgZmlwTXVsdGlQYWdlOjpvcGVuKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSwgaW50IGZsYWdzKSB7CisJLy8gdHJ5IHRvIGd1ZXNzIHRoZSBmaWxlIGZvcm1hdCBmcm9tIHRoZSBoYW5kbGUKKwlGUkVFX0lNQUdFX0ZPUk1BVCBmaWYgPSBGcmVlSW1hZ2VfR2V0RmlsZVR5cGVGcm9tSGFuZGxlKGlvLCBoYW5kbGUsIDApOworCisJLy8gb3BlbiB0aGUgc3RyZWFtCisJX21wYWdlID0gRnJlZUltYWdlX09wZW5NdWx0aUJpdG1hcEZyb21IYW5kbGUoZmlmLCBpbywgaGFuZGxlLCBmbGFncyk7CisKKwlyZXR1cm4gKE5VTEwgIT0gX21wYWdlICkgPyBUUlVFIDogRkFMU0U7Cit9CisKK0JPT0wgZmlwTXVsdGlQYWdlOjpjbG9zZShpbnQgZmxhZ3MpIHsKKwlCT09MIGJTdWNjZXNzID0gRkFMU0U7CisJaWYoX21wYWdlKSB7CisJCS8vIGNsb3NlIHRoZSBzdHJlYW0KKwkJYlN1Y2Nlc3MgPSBGcmVlSW1hZ2VfQ2xvc2VNdWx0aUJpdG1hcChfbXBhZ2UsIGZsYWdzKTsKKwkJX21wYWdlID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gYlN1Y2Nlc3M7Cit9CisKK0JPT0wgZmlwTXVsdGlQYWdlOjpzYXZlVG9IYW5kbGUoRlJFRV9JTUFHRV9GT1JNQVQgZmlmLCBGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIGludCBmbGFncykgY29uc3QgeworCUJPT0wgYlN1Y2Nlc3MgPSBGQUxTRTsKKwlpZihfbXBhZ2UpIHsKKwkJYlN1Y2Nlc3MgPSBGcmVlSW1hZ2VfU2F2ZU11bHRpQml0bWFwVG9IYW5kbGUoZmlmLCBfbXBhZ2UsIGlvLCBoYW5kbGUsIGZsYWdzKTsKKwl9CisKKwlyZXR1cm4gYlN1Y2Nlc3M7Cit9CisKK0JPT0wgZmlwTXVsdGlQYWdlOjpzYXZlVG9NZW1vcnkoRlJFRV9JTUFHRV9GT1JNQVQgZmlmLCBmaXBNZW1vcnlJTyYgbWVtSU8sIGludCBmbGFncykgY29uc3QgeworCUJPT0wgYlN1Y2Nlc3MgPSBGQUxTRTsKKwlpZihfbXBhZ2UpIHsKKwkJYlN1Y2Nlc3MgPSBtZW1JTy5zYXZlTXVsdGlQYWdlKGZpZiwgX21wYWdlLCBmbGFncyk7CisJfQorCisJcmV0dXJuIGJTdWNjZXNzOworfQorCitpbnQgZmlwTXVsdGlQYWdlOjpnZXRQYWdlQ291bnQoKSBjb25zdCB7CisJcmV0dXJuIF9tcGFnZSA/IEZyZWVJbWFnZV9HZXRQYWdlQ291bnQoX21wYWdlKSA6IDA7Cit9CisKK3ZvaWQgZmlwTXVsdGlQYWdlOjphcHBlbmRQYWdlKGZpcEltYWdlJiBpbWFnZSkgeworCWlmKF9tcGFnZSkgeworCQlGcmVlSW1hZ2VfQXBwZW5kUGFnZShfbXBhZ2UsIGltYWdlKTsKKwl9Cit9CisKK3ZvaWQgZmlwTXVsdGlQYWdlOjppbnNlcnRQYWdlKGludCBwYWdlLCBmaXBJbWFnZSYgaW1hZ2UpIHsKKwlpZihfbXBhZ2UpIHsKKwkJRnJlZUltYWdlX0luc2VydFBhZ2UoX21wYWdlLCBwYWdlLCBpbWFnZSk7CisJfQorfQorCit2b2lkIGZpcE11bHRpUGFnZTo6ZGVsZXRlUGFnZShpbnQgcGFnZSkgeworCWlmKF9tcGFnZSkgeworCQlGcmVlSW1hZ2VfRGVsZXRlUGFnZShfbXBhZ2UsIHBhZ2UpOworCX0KK30KKworQk9PTCBmaXBNdWx0aVBhZ2U6Om1vdmVQYWdlKGludCB0YXJnZXQsIGludCBzb3VyY2UpIHsKKwlyZXR1cm4gX21wYWdlID8gRnJlZUltYWdlX01vdmVQYWdlKF9tcGFnZSwgdGFyZ2V0LCBzb3VyY2UpIDogRkFMU0U7Cit9CisKK0ZJQklUTUFQKiBmaXBNdWx0aVBhZ2U6OmxvY2tQYWdlKGludCBwYWdlKSB7CisJcmV0dXJuIF9tcGFnZSA/IEZyZWVJbWFnZV9Mb2NrUGFnZShfbXBhZ2UsIHBhZ2UpIDogTlVMTDsKK30KKwordm9pZCBmaXBNdWx0aVBhZ2U6OnVubG9ja1BhZ2UoZmlwSW1hZ2UmIGltYWdlLCBCT09MIGNoYW5nZWQpIHsKKwlpZihfbXBhZ2UpIHsKKwkJRnJlZUltYWdlX1VubG9ja1BhZ2UoX21wYWdlLCBpbWFnZSwgY2hhbmdlZCk7CisJCS8vIGNsZWFyIHRoZSBpbWFnZSBzbyB0aGF0IGl0IGJlY29tZXMgaW52YWxpZC4KKwkJLy8gdGhpcyBpcyBwb3NzaWJsZSBiZWNhdXNlIG9mIHRoZSBmcmllbmQgZGVjbGFyYXRpb24KKwkJaW1hZ2UuX2RpYiA9IE5VTEw7CisJCWltYWdlLl9iSGFzQ2hhbmdlZCA9IEZBTFNFOworCX0KK30KKworQk9PTCBmaXBNdWx0aVBhZ2U6OmdldExvY2tlZFBhZ2VOdW1iZXJzKGludCAqcGFnZXMsIGludCAqY291bnQpIGNvbnN0IHsKKwlyZXR1cm4gX21wYWdlID8gRnJlZUltYWdlX0dldExvY2tlZFBhZ2VOdW1iZXJzKF9tcGFnZSwgcGFnZXMsIGNvdW50KSA6IEZBTFNFOworfQorCmRpZmYgLS1naXQgYS9maWxlcy9XcmFwcGVyL0ZyZWVJbWFnZVBsdXMvc3JjL2ZpcFRhZy5jcHAgYi9maWxlcy9XcmFwcGVyL0ZyZWVJbWFnZVBsdXMvc3JjL2ZpcFRhZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAwYTA5NQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL1dyYXBwZXIvRnJlZUltYWdlUGx1cy9zcmMvZmlwVGFnLmNwcApAQCAtMCwwICsxLDEzNCBAQAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gZmlwVGFnIGNsYXNzIGltcGxlbWVudGF0aW9uCisvLworLy8gRGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBieQorLy8gLSBIZXJ26SBEcm9sb24gKGRyb2xvbkBpbmZvbmllLmZyKQorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZyZWVJbWFnZSAzCisvLworLy8gQ09WRVJFRCBDT0RFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZCisvLyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUworLy8gVEhBVCBUSEUgQ09WRVJFRCBDT0RFIElTIEZSRUUgT0YgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisvLyBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRAorLy8gQ09ERSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVAorLy8gVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GIEFOWSBORUNFU1NBUlkKKy8vIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwKKy8vIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIKKy8vIFRISVMgRElTQ0xBSU1FUi4KKy8vCisvLyBVc2UgYXQgeW91ciBvd24gcmlzayEKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgIkZyZWVJbWFnZVBsdXMuaCIKKworZmlwVGFnOjpmaXBUYWcoKSB7CisJX3RhZyA9IEZyZWVJbWFnZV9DcmVhdGVUYWcoKTsKK30KKworZmlwVGFnOjp+ZmlwVGFnKCkgeworCUZyZWVJbWFnZV9EZWxldGVUYWcoX3RhZyk7Cit9CisKK0JPT0wgZmlwVGFnOjpzZXRLZXlWYWx1ZShjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKnZhbHVlKSB7CisJaWYoX3RhZykgeworCQlGcmVlSW1hZ2VfRGVsZXRlVGFnKF90YWcpOworCQlfdGFnID0gTlVMTDsKKwl9CisJLy8gY3JlYXRlIGEgdGFnCisJX3RhZyA9IEZyZWVJbWFnZV9DcmVhdGVUYWcoKTsKKwlpZihfdGFnKSB7CisJCUJPT0wgYlN1Y2Nlc3MgPSBUUlVFOworCQkvLyBmaWxsIHRoZSB0YWcKKwkJRFdPUkQgdGFnX2xlbmd0aCA9IChEV09SRCkoc3RybGVuKHZhbHVlKSArIDEpOworCQliU3VjY2VzcyAmPSBGcmVlSW1hZ2VfU2V0VGFnS2V5KF90YWcsIGtleSk7CisJCWJTdWNjZXNzICY9IEZyZWVJbWFnZV9TZXRUYWdMZW5ndGgoX3RhZywgdGFnX2xlbmd0aCk7CisJCWJTdWNjZXNzICY9IEZyZWVJbWFnZV9TZXRUYWdDb3VudChfdGFnLCB0YWdfbGVuZ3RoKTsKKwkJYlN1Y2Nlc3MgJj0gRnJlZUltYWdlX1NldFRhZ1R5cGUoX3RhZywgRklEVF9BU0NJSSk7CisJCWJTdWNjZXNzICY9IEZyZWVJbWFnZV9TZXRUYWdWYWx1ZShfdGFnLCB2YWx1ZSk7CisJCXJldHVybiBiU3VjY2VzczsKKwl9CisJcmV0dXJuIEZBTFNFOworfQorCitmaXBUYWc6OmZpcFRhZyhjb25zdCBmaXBUYWcmIHRhZykgeworCV90YWcgPSBGcmVlSW1hZ2VfQ2xvbmVUYWcodGFnLl90YWcpOworfQorCitmaXBUYWcmIGZpcFRhZzo6b3BlcmF0b3I9KGNvbnN0IGZpcFRhZyYgdGFnKSB7CisJaWYodGhpcyAhPSAmdGFnKSB7CisJCWlmKF90YWcpIEZyZWVJbWFnZV9EZWxldGVUYWcoX3RhZyk7CisJCV90YWcgPSBGcmVlSW1hZ2VfQ2xvbmVUYWcodGFnLl90YWcpOworCX0KKwlyZXR1cm4gKnRoaXM7Cit9CisKK2ZpcFRhZyYgZmlwVGFnOjpvcGVyYXRvcj0oRklUQUcgKnRhZykgeworCWlmKF90YWcpIEZyZWVJbWFnZV9EZWxldGVUYWcoX3RhZyk7CisJX3RhZyA9IHRhZzsKKwlyZXR1cm4gKnRoaXM7Cit9CisKK0JPT0wgZmlwVGFnOjppc1ZhbGlkKCkgY29uc3QgeworCXJldHVybiAoX3RhZyAhPSBOVUxMKSA/IFRSVUUgOiBGQUxTRTsKK30KKworY29uc3QgY2hhciogZmlwVGFnOjpnZXRLZXkoKSBjb25zdCB7CisJcmV0dXJuIEZyZWVJbWFnZV9HZXRUYWdLZXkoX3RhZyk7Cit9CisKK2NvbnN0IGNoYXIqIGZpcFRhZzo6Z2V0RGVzY3JpcHRpb24oKSBjb25zdCB7CisJcmV0dXJuIEZyZWVJbWFnZV9HZXRUYWdEZXNjcmlwdGlvbihfdGFnKTsKK30KKworV09SRCBmaXBUYWc6OmdldElEKCkgY29uc3QgeworCXJldHVybiBGcmVlSW1hZ2VfR2V0VGFnSUQoX3RhZyk7Cit9CisKK0ZSRUVfSU1BR0VfTURUWVBFIGZpcFRhZzo6Z2V0VHlwZSgpIGNvbnN0IHsKKwlyZXR1cm4gRnJlZUltYWdlX0dldFRhZ1R5cGUoX3RhZyk7Cit9CisKK0RXT1JEIGZpcFRhZzo6Z2V0Q291bnQoKSBjb25zdCB7CisJcmV0dXJuIEZyZWVJbWFnZV9HZXRUYWdDb3VudChfdGFnKTsKK30KKworRFdPUkQgZmlwVGFnOjpnZXRMZW5ndGgoKSBjb25zdCB7CisJcmV0dXJuIEZyZWVJbWFnZV9HZXRUYWdMZW5ndGgoX3RhZyk7Cit9CisKK2NvbnN0IHZvaWQqIGZpcFRhZzo6Z2V0VmFsdWUoKSBjb25zdCB7CisJcmV0dXJuIEZyZWVJbWFnZV9HZXRUYWdWYWx1ZShfdGFnKTsKK30KKworQk9PTCBmaXBUYWc6OnNldEtleShjb25zdCBjaGFyICprZXkpIHsKKwlyZXR1cm4gRnJlZUltYWdlX1NldFRhZ0tleShfdGFnLCBrZXkpOworfQorCitCT09MIGZpcFRhZzo6c2V0RGVzY3JpcHRpb24oY29uc3QgY2hhciAqZGVzY3JpcHRpb24pIHsKKwlyZXR1cm4gRnJlZUltYWdlX1NldFRhZ0Rlc2NyaXB0aW9uKF90YWcsIGRlc2NyaXB0aW9uKTsKK30KKworQk9PTCBmaXBUYWc6OnNldElEKFdPUkQgaWQpIHsKKwlyZXR1cm4gRnJlZUltYWdlX1NldFRhZ0lEKF90YWcsIGlkKTsKK30KKworQk9PTCBmaXBUYWc6OnNldFR5cGUoRlJFRV9JTUFHRV9NRFRZUEUgdHlwZSkgeworCXJldHVybiBGcmVlSW1hZ2VfU2V0VGFnVHlwZShfdGFnLCB0eXBlKTsKK30KKworQk9PTCBmaXBUYWc6OnNldENvdW50KERXT1JEIGNvdW50KSB7CisJcmV0dXJuIEZyZWVJbWFnZV9TZXRUYWdDb3VudChfdGFnLCBjb3VudCk7Cit9CisKK0JPT0wgZmlwVGFnOjpzZXRMZW5ndGgoRFdPUkQgbGVuZ3RoKSB7CisJcmV0dXJuIEZyZWVJbWFnZV9TZXRUYWdMZW5ndGgoX3RhZywgbGVuZ3RoKTsKK30KKworQk9PTCBmaXBUYWc6OnNldFZhbHVlKGNvbnN0IHZvaWQgKnZhbHVlKSB7CisJcmV0dXJuIEZyZWVJbWFnZV9TZXRUYWdWYWx1ZShfdGFnLCB2YWx1ZSk7Cit9CisKK2NvbnN0IGNoYXIqIGZpcFRhZzo6dG9TdHJpbmcoRlJFRV9JTUFHRV9NRE1PREVMIG1vZGVsLCBjaGFyICpNYWtlKSBjb25zdCB7CisJcmV0dXJuIEZyZWVJbWFnZV9UYWdUb1N0cmluZyhtb2RlbCwgX3RhZywgTWFrZSk7Cit9CmRpZmYgLS1naXQgYS9maWxlcy9XcmFwcGVyL0ZyZWVJbWFnZVBsdXMvc3JjL2ZpcFdpbkltYWdlLmNwcCBiL2ZpbGVzL1dyYXBwZXIvRnJlZUltYWdlUGx1cy9zcmMvZmlwV2luSW1hZ2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MmI2NTUKLS0tIC9kZXYvbnVsbAorKysgYi9maWxlcy9XcmFwcGVyL0ZyZWVJbWFnZVBsdXMvc3JjL2ZpcFdpbkltYWdlLmNwcApAQCAtMCwwICsxLDQ4OCBAQAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gZmlwV2luSW1hZ2UgY2xhc3MgaW1wbGVtZW50YXRpb24KKy8vCisvLyBEZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIGJ5CisvLyAtIEhlcnbpIERyb2xvbiAoZHJvbG9uQGluZm9uaWUuZnIpCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRnJlZUltYWdlIDMKKy8vCisvLyBDT1ZFUkVEIENPREUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkKKy8vIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTCisvLyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy8vIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVECisvLyBDT0RFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UCisvLyBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWQorLy8gU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTAorLy8gUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUgorLy8gVEhJUyBESVNDTEFJTUVSLgorLy8KKy8vIFVzZSBhdCB5b3VyIG93biByaXNrIQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaW5jbHVkZSAiRnJlZUltYWdlUGx1cy5oIgorCisjaWZkZWYgX1dJTjMyCisKKy8vIG1hcmtlciB1c2VkIGZvciBjbGlwYm9hcmQgY29weSAvIHBhc3RlCisKK3N0YXRpYyBpbmxpbmUgdm9pZCAKK1NFVF9GUkVFSU1BR0VfTUFSS0VSKEJJVE1BUElORk9IRUFERVIgKmJtaWgsIEZJQklUTUFQICpkaWIpIHsKKwkvLyBXaW5kb3dzIGNvbnN0YW50cyBnb2VzIGZyb20gMEwgdG8gNUwKKwkvLyBBZGQgMHhGRiB0byBhdm9pZCBjb25mbGljdHMKKwlibWloLT5iaUNvbXByZXNzaW9uID0gMHhGRiArIEZyZWVJbWFnZV9HZXRJbWFnZVR5cGUoZGliKTsKK30KKworc3RhdGljIGlubGluZSBGUkVFX0lNQUdFX1RZUEUgCitHRVRfRlJFRUlNQUdFX01BUktFUihCSVRNQVBJTkZPSEVBREVSICpibWloKSB7CisJcmV0dXJuIChGUkVFX0lNQUdFX1RZUEUpKGJtaWgtPmJpQ29tcHJlc3Npb24gLSAweEZGKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ29uc3RydWN0aW9uIC8gRGVzdHJ1Y3Rpb24KKworZmlwV2luSW1hZ2U6OmZpcFdpbkltYWdlKEZSRUVfSU1BR0VfVFlQRSBpbWFnZV90eXBlLCB1bnNpZ25lZCB3aWR0aCwgdW5zaWduZWQgaGVpZ2h0LCB1bnNpZ25lZCBicHApIDogZmlwSW1hZ2UoaW1hZ2VfdHlwZSwgd2lkdGgsIGhlaWdodCwgYnBwKSB7CisJX2Rpc3BsYXlfZGliID0gTlVMTDsKKwlfYkRlbGV0ZU1lID0gRkFMU0U7CisJLy8gZGVmYXVsdCB0b25lIG1hcHBpbmcgb3BlcmF0b3IKKwlfdG1vID0gRklUTU9fRFJBR08wMzsKKwlfdG1vX3BhcmFtXzEgPSAwOworCV90bW9fcGFyYW1fMiA9IDA7CisJX3Rtb19wYXJhbV8zID0gMTsKKwlfdG1vX3BhcmFtXzQgPSAwOworfQorCitmaXBXaW5JbWFnZTo6fmZpcFdpbkltYWdlKCkgeyAKKwlpZihfYkRlbGV0ZU1lKSB7CisJCUZyZWVJbWFnZV9VbmxvYWQoX2Rpc3BsYXlfZGliKTsKKwl9Cit9CisKK3ZvaWQgZmlwV2luSW1hZ2U6OmNsZWFyKCkgeworCS8vIGRlbGV0ZSBfZGlzcGxheV9kaWIKKwlpZihfYkRlbGV0ZU1lKSB7CisJCUZyZWVJbWFnZV9VbmxvYWQoX2Rpc3BsYXlfZGliKTsKKwl9CisJX2Rpc3BsYXlfZGliID0gTlVMTDsKKwlfYkRlbGV0ZU1lID0gRkFMU0U7CisJLy8gZGVsZXRlIGJhc2UgY2xhc3MgZGF0YQorCWZpcEltYWdlOjpjbGVhcigpOworfQorCitCT09MIGZpcFdpbkltYWdlOjppc1ZhbGlkKCkgY29uc3QgeworCXJldHVybiBmaXBJbWFnZTo6aXNWYWxpZCgpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDb3B5aW5nCisKK2ZpcFdpbkltYWdlJiBmaXBXaW5JbWFnZTo6b3BlcmF0b3I9KGNvbnN0IGZpcEltYWdlJiBJbWFnZSkgeworCS8vIGRlbGV0ZSBfZGlzcGxheV9kaWIKKwlpZihfYkRlbGV0ZU1lKSB7CisJCUZyZWVJbWFnZV9VbmxvYWQoX2Rpc3BsYXlfZGliKTsKKwl9CisJX2Rpc3BsYXlfZGliID0gTlVMTDsKKwlfYkRlbGV0ZU1lID0gRkFMU0U7CisJLy8gY2xvbmUgdGhlIGJhc2UgY2xhc3MKKwlmaXBJbWFnZTo6b3BlcmF0b3I9KEltYWdlKTsKKworCXJldHVybiAqdGhpczsKK30KKworZmlwV2luSW1hZ2UmIGZpcFdpbkltYWdlOjpvcGVyYXRvcj0oY29uc3QgZmlwV2luSW1hZ2UmIEltYWdlKSB7CisJaWYodGhpcyAhPSAmSW1hZ2UpIHsKKwkJLy8gZGVsZXRlIF9kaXNwbGF5X2RpYgorCQlpZihfYkRlbGV0ZU1lKSB7CisJCQlGcmVlSW1hZ2VfVW5sb2FkKF9kaXNwbGF5X2RpYik7CisJCX0KKwkJX2Rpc3BsYXlfZGliID0gTlVMTDsKKwkJX2JEZWxldGVNZSA9IEZBTFNFOworCQkvLyBjb3B5IHRtbyBkYXRhCisJCV90bW8gPSBJbWFnZS5fdG1vOworCQlfdG1vX3BhcmFtXzEgPSBJbWFnZS5fdG1vX3BhcmFtXzE7CisJCV90bW9fcGFyYW1fMiA9IEltYWdlLl90bW9fcGFyYW1fMjsKKwkJX3Rtb19wYXJhbV8zID0gSW1hZ2UuX3Rtb19wYXJhbV8zOworCQlfdG1vX3BhcmFtXzQgPSBJbWFnZS5fdG1vX3BhcmFtXzQ7CisKKwkJLy8gY2xvbmUgdGhlIGJhc2UgY2xhc3MKKwkJZmlwSW1hZ2U6Om9wZXJhdG9yPShJbWFnZSk7CisJfQorCXJldHVybiAqdGhpczsKK30KKworSEFORExFIGZpcFdpbkltYWdlOjpjb3B5VG9IYW5kbGUoKSBjb25zdCB7CisJSEFORExFIGhNZW0gPSBOVUxMOworCisJaWYoX2RpYikgeworCisJCS8vIEdldCBlcXVpdmFsZW50IERJQiBzaXplCisJCWxvbmcgZGliX3NpemUgPSBzaXplb2YoQklUTUFQSU5GT0hFQURFUik7CisJCWRpYl9zaXplICs9IEZyZWVJbWFnZV9HZXRDb2xvcnNVc2VkKF9kaWIpICogc2l6ZW9mKFJHQlFVQUQpOworCQlkaWJfc2l6ZSArPSBGcmVlSW1hZ2VfR2V0UGl0Y2goX2RpYikgKiBGcmVlSW1hZ2VfR2V0SGVpZ2h0KF9kaWIpOworCisJCS8vIEFsbG9jYXRlIGEgRElCCisJCWhNZW0gPSBHbG9iYWxBbGxvYyhHSE5ELCBkaWJfc2l6ZSk7CisJCUJZVEUgKmRpYiA9IChCWVRFKilHbG9iYWxMb2NrKGhNZW0pOworCisJCW1lbXNldChkaWIsIDAsIGRpYl9zaXplKTsKKworCQlCWVRFICpwX2RpYiA9IChCWVRFKilkaWI7CisKKwkJLy8gQ29weSB0aGUgQklUTUFQSU5GT0hFQURFUgorCisJCUJJVE1BUElORk9IRUFERVIgKmJpaCA9IEZyZWVJbWFnZV9HZXRJbmZvSGVhZGVyKF9kaWIpOworCQltZW1jcHkocF9kaWIsIGJpaCwgc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpKTsKKwkJaWYoRnJlZUltYWdlX0dldEltYWdlVHlwZShfZGliKSAhPSBGSVRfQklUTUFQKSB7CisJCQkvLyB0aGlzIGhhY2sgaXMgdXNlZCB0byBzdG9yZSB0aGUgYml0bWFwIHR5cGUgaW4gdGhlIGJpQ29tcHJlc3Npb24gbWVtYmVyIG9mIHRoZSBCSVRNQVBJTkZPSEVBREVSCisJCQlTRVRfRlJFRUlNQUdFX01BUktFUigoQklUTUFQSU5GT0hFQURFUiopcF9kaWIsIF9kaWIpOworCQl9CisJCXBfZGliICs9IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKTsKKworCQkvLyBDb3B5IHRoZSBwYWxldHRlCisKKwkJUkdCUVVBRCAqcGFsID0gRnJlZUltYWdlX0dldFBhbGV0dGUoX2RpYik7CisJCW1lbWNweShwX2RpYiwgcGFsLCBGcmVlSW1hZ2VfR2V0Q29sb3JzVXNlZChfZGliKSAqIHNpemVvZihSR0JRVUFEKSk7CisJCXBfZGliICs9IEZyZWVJbWFnZV9HZXRDb2xvcnNVc2VkKF9kaWIpICogc2l6ZW9mKFJHQlFVQUQpOworCisJCS8vIENvcHkgdGhlIGJpdG1hcAorCisJCUJZVEUgKmJpdHMgPSBGcmVlSW1hZ2VfR2V0Qml0cyhfZGliKTsKKwkJbWVtY3B5KHBfZGliLCBiaXRzLCBGcmVlSW1hZ2VfR2V0UGl0Y2goX2RpYikgKiBGcmVlSW1hZ2VfR2V0SGVpZ2h0KF9kaWIpKTsKKworCQlHbG9iYWxVbmxvY2soaE1lbSk7CisJfQorCisJcmV0dXJuIGhNZW07Cit9CisKK0JPT0wgZmlwV2luSW1hZ2U6OmNvcHlGcm9tSGFuZGxlKEhBTkRMRSBoTWVtKSB7CisJQllURSAqbHBWb2lkID0gTlVMTDsKKwlCSVRNQVBJTkZPSEVBREVSICpwSGVhZCA9IE5VTEw7CisJUkdCUVVBRCAqcFBhbGV0dGUgPSBOVUxMOworCUJZVEUgKmJpdHMgPSBOVUxMOworCURXT1JEIGJpdGZpZWxkc1szXSA9IHswLCAwLCAwfTsKKworCS8vIEdldCBhIHBvaW50ZXIgdG8gdGhlIGJpdG1hcAorCWxwVm9pZCA9IChCWVRFICopR2xvYmFsTG9jayhoTWVtKTsKKworCS8vIEdldCBhIHBvaW50ZXIgdG8gdGhlIGJpdG1hcCBoZWFkZXIKKwlwSGVhZCA9IChCSVRNQVBJTkZPSEVBREVSICopbHBWb2lkOworCisJLy8gR2V0IGEgcG9pbnRlciB0byB0aGUgcGFsZXR0ZQorCWlmKHBIZWFkLT5iaUJpdENvdW50IDwgMTYpCisJCXBQYWxldHRlID0gKFJHQlFVQUQgKikoKChCWVRFICopcEhlYWQpICsgc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpKTsKKworCS8vIEdldCBhIHBvaW50ZXIgdG8gdGhlIHBpeGVscworCWJpdHMgPSAoKEJZVEUqKXBIZWFkICsgc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpICsgc2l6ZW9mKFJHQlFVQUQpICogcEhlYWQtPmJpQ2xyVXNlZCk7CisKKwlpZihwSGVhZC0+YmlDb21wcmVzc2lvbiA9PSBCSV9CSVRGSUVMRFMpIHsKKwkJLy8gVGFrZSBpbnRvIGFjY291bnQgdGhlIGNvbG9yIG1hc2tzIHRoYXQgc3BlY2lmeSB0aGUgcmVkLCBncmVlbiwgYW5kIGJsdWUgY29tcG9uZW50cyAoMTYtIGFuZCAzMi1iaXQpCisJCXVuc2lnbmVkIG1hc2tfc2l6ZSA9IDMgKiBzaXplb2YoRFdPUkQpOworCQltZW1jcHkoJmJpdGZpZWxkc1swXSwgYml0cywgbWFza19zaXplKTsKKwkJYml0cyArPSBtYXNrX3NpemU7CisJfSAKKworCWlmKGxwVm9pZCkgeworCisJCS8vIEFsbG9jYXRlIGEgbmV3IEZJQklUTUFQCisKKwkJRlJFRV9JTUFHRV9UWVBFIGltYWdlX3R5cGUgPSBGSVRfQklUTUFQOworCQkvLyBVc2UgYSBoYWNrIHRvIGRlY2lkZSBpZiB0aGUgY2xpcGJvYXJkIGNvbnRhaW5zIG5vbiBzdGFuZGFyZCBiaXRtYXBzIC4uLgorCQlzd2l0Y2goR0VUX0ZSRUVJTUFHRV9NQVJLRVIocEhlYWQpKSB7CisJCQljYXNlIEZJVF9VSU5UMTY6CisJCQljYXNlIEZJVF9JTlQxNjoKKwkJCWNhc2UgRklUX1VJTlQzMjoKKwkJCWNhc2UgRklUX0lOVDMyOgorCQkJY2FzZSBGSVRfRkxPQVQ6CisJCQljYXNlIEZJVF9ET1VCTEU6CisJCQljYXNlIEZJVF9DT01QTEVYOgorCQkJY2FzZSBGSVRfUkdCMTY6CisJCQljYXNlIEZJVF9SR0JBMTY6CisJCQljYXNlIEZJVF9SR0JGOgorCQkJY2FzZSBGSVRfUkdCQUY6CisJCQkJaW1hZ2VfdHlwZSA9IEdFVF9GUkVFSU1BR0VfTUFSS0VSKHBIZWFkKTsKKwkJCQlicmVhazsKKwkJfQorCQlpZighc2V0U2l6ZShpbWFnZV90eXBlLCAoV09SRClwSGVhZC0+YmlXaWR0aCwgKFdPUkQpcEhlYWQtPmJpSGVpZ2h0LCBwSGVhZC0+YmlCaXRDb3VudCwgYml0ZmllbGRzWzJdLCBiaXRmaWVsZHNbMV0sIGJpdGZpZWxkc1swXSkpIHsKKwkJCUdsb2JhbFVubG9jayhscFZvaWQpOworCQkJcmV0dXJuIEZBTFNFOworCQl9CisKKwkJLy8gQ29weSB0aGUgYml0bWFwIGhlYWRlcgorCQltZW1jcHkoRnJlZUltYWdlX0dldEluZm9IZWFkZXIoX2RpYiksIHBIZWFkLCBzaXplb2YoQklUTUFQSU5GT0hFQURFUikpOworCisKKwkJLy8gQ29weSB0aGUgcGFsZXR0ZQorCQltZW1jcHkoRnJlZUltYWdlX0dldFBhbGV0dGUoX2RpYiksIHBQYWxldHRlLCBwSGVhZC0+YmlDbHJVc2VkICogc2l6ZW9mKFJHQlFVQUQpKTsKKworCQkvLyBDb3B5IHRoZSBiaXRtYXAKKwkJbWVtY3B5KEZyZWVJbWFnZV9HZXRCaXRzKF9kaWIpLCBiaXRzLCBGcmVlSW1hZ2VfR2V0UGl0Y2goX2RpYikgKiBGcmVlSW1hZ2VfR2V0SGVpZ2h0KF9kaWIpKTsKKworCQlHbG9iYWxVbmxvY2sobHBWb2lkKTsKKworCQlyZXR1cm4gVFJVRTsKKwl9CisKKwlyZXR1cm4gRkFMU0U7Cit9CisKK0JPT0wgZmlwV2luSW1hZ2U6OmNvcHlGcm9tQml0bWFwKEhCSVRNQVAgaGJtcCkgeworCWlmKGhibXApIHsgCisJCWludCBTdWNjZXNzOworICAgICAgICBCSVRNQVAgYm07CisJCS8vIEdldCBpbmZvcm1hdGlvbnMgYWJvdXQgdGhlIGJpdG1hcAorICAgICAgICBHZXRPYmplY3QoaGJtcCwgc2l6ZW9mKEJJVE1BUCksIChMUFNUUikgJmJtKTsKKwkJLy8gQ3JlYXRlIHRoZSBpbWFnZQorICAgICAgICBzZXRTaXplKEZJVF9CSVRNQVAsIChXT1JEKWJtLmJtV2lkdGgsIChXT1JEKWJtLmJtSGVpZ2h0LCAoV09SRClibS5ibUJpdHNQaXhlbCk7CisKKwkJLy8gVGhlIEdldERJQml0cyBmdW5jdGlvbiBjbGVhcnMgdGhlIGJpQ2xyVXNlZCBhbmQgYmlDbHJJbXBvcnRhbnQgQklUTUFQSU5GTyBtZW1iZXJzIChkb250J3Qga25vdyB3aHkpIAorCQkvLyBTbyB3ZSBzYXZlIHRoZXNlIGluZm9zIGJlbG93LiBUaGlzIGlzIG5lZWRlZCBmb3IgcGFsZXR0aXplZCBpbWFnZXMgb25seS4gCisJCWludCBuQ29sb3JzID0gRnJlZUltYWdlX0dldENvbG9yc1VzZWQoX2RpYik7CisKKwkJLy8gQ3JlYXRlIGEgZGV2aWNlIGNvbnRleHQgZm9yIHRoZSBiaXRtYXAKKyAgICAgICAgSERDIGRjID0gR2V0REMoTlVMTCk7CisJCS8vIENvcHkgdGhlIHBpeGVscworCQlTdWNjZXNzID0gR2V0RElCaXRzKGRjLAkJCQkJCQkJLy8gaGFuZGxlIHRvIERDCisJCQkJCQkJCWhibXAsCQkJCQkJLy8gaGFuZGxlIHRvIGJpdG1hcAorCQkJCQkJCQkwLAkJCQkJCQkvLyBmaXJzdCBzY2FuIGxpbmUgdG8gc2V0CisJCQkJCQkJCUZyZWVJbWFnZV9HZXRIZWlnaHQoX2RpYiksCS8vIG51bWJlciBvZiBzY2FuIGxpbmVzIHRvIGNvcHkKKwkJCQkJCQkJRnJlZUltYWdlX0dldEJpdHMoX2RpYiksCS8vIGFycmF5IGZvciBiaXRtYXAgYml0cworCQkJCQkJCQlGcmVlSW1hZ2VfR2V0SW5mbyhfZGliKSwJLy8gYml0bWFwIGRhdGEgYnVmZmVyCisJCQkJCQkJCURJQl9SR0JfQ09MT1JTCQkJCS8vIFJHQiAKKwkJCQkJCQkJKTsKKwkJaWYoU3VjY2VzcyA9PSAwKSB7CisJCQlGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2MoRklGX1VOS05PV04sICJFcnJvciA6IEdldERJQml0cyBmYWlsZWQiKTsKKwkJCVJlbGVhc2VEQyhOVUxMLCBkYyk7CisJCQlyZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgUmVsZWFzZURDKE5VTEwsIGRjKTsKKworCQkvLyByZXN0b3JlIEJJVE1BUElORk8gbWVtYmVycworCQkKKwkJRnJlZUltYWdlX0dldEluZm9IZWFkZXIoX2RpYiktPmJpQ2xyVXNlZCA9IG5Db2xvcnM7CisJCUZyZWVJbWFnZV9HZXRJbmZvSGVhZGVyKF9kaWIpLT5iaUNsckltcG9ydGFudCA9IG5Db2xvcnM7CisKKwkJcmV0dXJuIFRSVUU7CisgICAgfQorCisJcmV0dXJuIEZBTFNFOworfQorCitCT09MIGZpcFdpbkltYWdlOjpjb3B5VG9DbGlwYm9hcmQoSFdORCBoV25kTmV3T3duZXIpIGNvbnN0IHsKKwlIQU5ETEUgaERJQiA9IGNvcHlUb0hhbmRsZSgpOworCisJaWYoT3BlbkNsaXBib2FyZChoV25kTmV3T3duZXIpKSB7CisJCWlmKEVtcHR5Q2xpcGJvYXJkKCkpIHsKKwkJCWlmKFNldENsaXBib2FyZERhdGEoQ0ZfRElCLCBoRElCKSA9PSBOVUxMKSB7CisJCQkJTWVzc2FnZUJveChoV25kTmV3T3duZXIsICJVbmFibGUgdG8gc2V0IENsaXBib2FyZCBkYXRhIiwgIkZyZWVJbWFnZSIsIE1CX0lDT05FUlJPUik7CisJCQkJQ2xvc2VDbGlwYm9hcmQoKTsKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQl9CisJCX0KKwl9CisJQ2xvc2VDbGlwYm9hcmQoKTsKKworCXJldHVybiBUUlVFOworfQorCitCT09MIGZpcFdpbkltYWdlOjpwYXN0ZUZyb21DbGlwYm9hcmQoKSB7CisJaWYoIUlzQ2xpcGJvYXJkRm9ybWF0QXZhaWxhYmxlKENGX0RJQikpCisJCXJldHVybiBGQUxTRTsKKworCWlmKE9wZW5DbGlwYm9hcmQoTlVMTCkpIHsKKwkJSEFORExFIGhESUIgPSBHZXRDbGlwYm9hcmREYXRhKENGX0RJQik7CisJCWNvcHlGcm9tSGFuZGxlKGhESUIpOworCQlDbG9zZUNsaXBib2FyZCgpOworCQlyZXR1cm4gVFJVRTsKKwl9CisJQ2xvc2VDbGlwYm9hcmQoKTsKKworCXJldHVybiBGQUxTRTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gU2NyZWVuIGNhcHR1cmUKKworQk9PTCBmaXBXaW5JbWFnZTo6Y2FwdHVyZVdpbmRvdyhIV05EIGhXbmRBcHBsaWNhdGlvbldpbmRvdywgSFdORCBoV25kU2VsZWN0ZWRXaW5kb3cpIHsKKwlpbnQgeFNjcmVlbiwgeVNjcmVlbiwgeHNoaWZ0LCB5c2hpZnQ7CisJUkVDVCByOworCisJLy8gR2V0IHdpbmRvdyBzaXplCisJR2V0V2luZG93UmVjdChoV25kU2VsZWN0ZWRXaW5kb3csICZyKTsKKworCS8vIENoZWNrIGlmIHRoZSB3aW5kb3cgaXMgb3V0IG9mIHRoZSBzY3JlZW4gb3IgbWF4aW1peGVkCisJeHNoaWZ0ID0gMDsKKwl5c2hpZnQgPSAwOworCXhTY3JlZW4gPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYU0NSRUVOKTsKKwl5U2NyZWVuID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWVNDUkVFTik7CisJaWYoci5yaWdodCA+IHhTY3JlZW4pCisJCSAgIHIucmlnaHQgPSB4U2NyZWVuOworCWlmKHIuYm90dG9tID4geVNjcmVlbikKKwkJICAgci5ib3R0b20gPSB5U2NyZWVuOworCWlmKHIubGVmdCA8IDApIHsKKwkJICAgeHNoaWZ0ID0gLXIubGVmdDsKKwkJICAgci5sZWZ0ID0gMDsKKwl9CisJaWYoci50b3AgPCAwKXsKKwkJICAgeXNoaWZ0ID0gLXIudG9wOworCQkgICByLnRvcCA9IDA7CisJfQorCQorCWludCB3aWR0aCAgPSByLnJpZ2h0ICAtIHIubGVmdDsKKwlpbnQgaGVpZ2h0ID0gci5ib3R0b20gLSByLnRvcDsKKworCWlmKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDApCisJCXJldHVybiBGQUxTRTsKKworCS8vIEhpZGUgdGhlIGFwcGxpY2F0aW9uIHdpbmRvdy4gCisJU2hvd1dpbmRvdyhoV25kQXBwbGljYXRpb25XaW5kb3csIFNXX0hJREUpOyAKKwkvLyBCcmluZyB0aGUgd2luZG93IGF0IHRoZSB0b3AgbW9zdCBsZXZlbAorCVNldFdpbmRvd1BvcyhoV25kU2VsZWN0ZWRXaW5kb3csIEhXTkRfVE9QTU9TVCwgMCwgMCwgMCwgMCwgU1dQX05PTU9WRXxTV1BfTk9TSVpFKTsKKwkvLyBHaXZlIGVub3VnaCB0aW1lIHRvIHJlZnJlc2ggdGhlIHdpbmRvdworCVNsZWVwKDUwMCk7CisKKwkvLyBQcmVwYXJlIHRoZSBEQ3MKKwlIREMgZHN0REMgPSBHZXREQyhOVUxMKTsKKyAgICBIREMgc3JjREMgPSBHZXRXaW5kb3dEQyhoV25kU2VsZWN0ZWRXaW5kb3cpOyAvLyBmdWxsIHdpbmRvdyAoR2V0REMoaFduZFNlbGVjdGVkV2luZG93KSA9IGNsaWVudGFyZWEpCisJSERDIG1lbURDID0gQ3JlYXRlQ29tcGF0aWJsZURDKGRzdERDKTsKKwkKKwkvLyBDb3B5IHRoZSBzY3JlZW4gdG8gdGhlIGJpdG1hcAorCUhCSVRNQVAgYm0gPSBDcmVhdGVDb21wYXRpYmxlQml0bWFwKGRzdERDLCB3aWR0aCwgaGVpZ2h0KTsKKwlIQklUTUFQIG9sZGJtID0gKEhCSVRNQVApU2VsZWN0T2JqZWN0KG1lbURDLCBibSk7CisJQml0Qmx0KG1lbURDLCAwLCAwLCB3aWR0aCwgaGVpZ2h0LCBzcmNEQywgeHNoaWZ0LCB5c2hpZnQsIFNSQ0NPUFkpOworCisJLy8gUmVkcmF3IHRoZSBhcHBsaWNhdGlvbiB3aW5kb3cuIAorCVNob3dXaW5kb3coaFduZEFwcGxpY2F0aW9uV2luZG93LCBTV19TSE9XKTsgCisKKwkvLyBSZXN0b3JlIHRoZSBwb3NpdGlvbgorCVNldFdpbmRvd1BvcyhoV25kU2VsZWN0ZWRXaW5kb3csIEhXTkRfTk9UT1BNT1NULCAwLCAwLCAwLCAwLCBTV1BfTk9NT1ZFfFNXUF9OT1NJWkUpOworCVNldFdpbmRvd1BvcyhoV25kQXBwbGljYXRpb25XaW5kb3csIEhXTkRfVE9QLCAwLCAwLCAwLCAwLCBTV1BfTk9NT1ZFfFNXUF9OT1NJWkUpOworCQorCS8vIENvbnZlcnQgdGhlIEhCSVRNQVAgdG8gYSBGSUJJVE1BUAorCWNvcHlGcm9tQml0bWFwKGJtKTsKKworCS8vIEZyZWUgb2JqZWN0cworCURlbGV0ZU9iamVjdChTZWxlY3RPYmplY3QobWVtREMsIG9sZGJtKSk7CisJRGVsZXRlREMobWVtREMpOworCisJLy8gQ29udmVydCAzMi1iaXQgaW1hZ2VzIHRvIDI0LWJpdAorCWlmKGdldEJpdHNQZXJQaXhlbCgpID09IDMyKSB7CisJCWNvbnZlcnRUbzI0Qml0cygpOworCX0KKworCXJldHVybiBUUlVFOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFBhaW50aW5nIG9wZXJhdGlvbnMKKwordm9pZCBmaXBXaW5JbWFnZTo6ZHJhd0V4KEhEQyBoREMsIFJFQ1QmIHJjRGVzdCwgQk9PTCB1c2VGaWxlQmtnLCBSR0JRVUFEICphcHBCa0NvbG9yLCBGSUJJVE1BUCAqYmcpIGNvbnN0IHsKKwkvLyBDb252ZXJ0IHRvIGEgc3RhbmRhcmQgYml0bWFwIGlmIG5lZWRlZAorCWlmKF9iSGFzQ2hhbmdlZCkgeworCQlpZihfYkRlbGV0ZU1lKSB7CisJCQlGcmVlSW1hZ2VfVW5sb2FkKF9kaXNwbGF5X2RpYik7CisJCQlfZGlzcGxheV9kaWIgPSBOVUxMOworCQkJX2JEZWxldGVNZSA9IEZBTFNFOworCQl9CisKKwkJRlJFRV9JTUFHRV9UWVBFIGltYWdlX3R5cGUgPSBnZXRJbWFnZVR5cGUoKTsKKwkJaWYoaW1hZ2VfdHlwZSA9PSBGSVRfQklUTUFQKSB7CisJCQlCT09MIGJIYXNCYWNrZ3JvdW5kID0gRnJlZUltYWdlX0hhc0JhY2tncm91bmRDb2xvcihfZGliKTsKKwkJCUJPT0wgYklzVHJhbnNwYXJlbnQgPSBGcmVlSW1hZ2VfSXNUcmFuc3BhcmVudChfZGliKTsKKworCQkJaWYoIWJJc1RyYW5zcGFyZW50ICYmICghYkhhc0JhY2tncm91bmQgfHwgIXVzZUZpbGVCa2cpKSB7CisJCQkJLy8gQ29weSBwb2ludGVyCisJCQkJX2Rpc3BsYXlfZGliID0gX2RpYjsKKwkJCX0KKwkJCWVsc2UgeworCQkJCS8vIENyZWF0ZSB0aGUgdHJhbnNwYXJlbnQgLyBhbHBoYSBibGVuZGVkIGltYWdlCisJCQkJX2Rpc3BsYXlfZGliID0gRnJlZUltYWdlX0NvbXBvc2l0ZShfZGliLCB1c2VGaWxlQmtnLCBhcHBCa0NvbG9yLCBiZyk7CisJCQkJaWYoX2Rpc3BsYXlfZGliKSB7CisJCQkJCS8vIFJlbWVtYmVyIHRvIGRlbGV0ZSBfZGlzcGxheV9kaWIKKwkJCQkJX2JEZWxldGVNZSA9IFRSVUU7CisJCQkJfSBlbHNlIHsKKwkJCQkJLy8gU29tZXRoaW5nIGZhaWxlZDogY29weSBwb2ludGVycworCQkJCQlfZGlzcGxheV9kaWIgPSBfZGliOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8vIENvbnZlcnQgdG8gYSBzdGFuZGFyZCBkaWIgZm9yIGRpc3BsYXkKKworCQkJaWYoaW1hZ2VfdHlwZSA9PSBGSVRfQ09NUExFWCkgeworCQkJCS8vIENvbnZlcnQgdG8gdHlwZSBGSVRfRE9VQkxFCisJCQkJRklCSVRNQVAgKmRpYl9kb3VibGUgPSBGcmVlSW1hZ2VfR2V0Q29tcGxleENoYW5uZWwoX2RpYiwgRklDQ19NQUcpOworCQkJCS8vIENvbnZlcnQgdG8gYSBzdGFuZGFyZCBiaXRtYXAgKGxpbmVhciBzY2FsaW5nKQorCQkJCV9kaXNwbGF5X2RpYiA9IEZyZWVJbWFnZV9Db252ZXJ0VG9TdGFuZGFyZFR5cGUoZGliX2RvdWJsZSwgVFJVRSk7CisJCQkJLy8gRnJlZSBpbWFnZSBvZiB0eXBlIEZJVF9ET1VCTEUKKwkJCQlGcmVlSW1hZ2VfVW5sb2FkKGRpYl9kb3VibGUpOworCQkJfSBlbHNlIGlmKChpbWFnZV90eXBlID09IEZJVF9SR0JGKSB8fCAoaW1hZ2VfdHlwZSA9PSBGSVRfUkdCQUYpIHx8IChpbWFnZV90eXBlID09IEZJVF9SR0IxNikpIHsKKwkJCQkvLyBBcHBseSBhIHRvbmUgbWFwcGluZyBhbGdvcml0aG0gYW5kIGNvbnZlcnQgdG8gMjQtYml0IAorCQkJCXN3aXRjaChfdG1vKSB7CisJCQkJCWNhc2UgRklUTU9fUkVJTkhBUkQwNToKKwkJCQkJCV9kaXNwbGF5X2RpYiA9IEZyZWVJbWFnZV9UbW9SZWluaGFyZDA1RXgoX2RpYiwgX3Rtb19wYXJhbV8xLCBfdG1vX3BhcmFtXzIsIF90bW9fcGFyYW1fMywgX3Rtb19wYXJhbV80KTsKKwkJCQkJCWJyZWFrOworCQkJCQlkZWZhdWx0OgorCQkJCQkJX2Rpc3BsYXlfZGliID0gRnJlZUltYWdlX1RvbmVNYXBwaW5nKF9kaWIsIF90bW8sIF90bW9fcGFyYW1fMSwgX3Rtb19wYXJhbV8yKTsKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0gZWxzZSBpZihpbWFnZV90eXBlID09IEZJVF9SR0JBMTYpIHsKKwkJCQkvLyBDb252ZXJ0IHRvIDMyLWJpdAorCQkJCUZJQklUTUFQICpkaWIzMiA9IEZyZWVJbWFnZV9Db252ZXJ0VG8zMkJpdHMoX2RpYik7CisJCQkJaWYoZGliMzIpIHsKKwkJCQkJLy8gQ3JlYXRlIHRoZSB0cmFuc3BhcmVudCAvIGFscGhhIGJsZW5kZWQgaW1hZ2UKKwkJCQkJX2Rpc3BsYXlfZGliID0gRnJlZUltYWdlX0NvbXBvc2l0ZShkaWIzMiwgdXNlRmlsZUJrZywgYXBwQmtDb2xvciwgYmcpOworCQkJCQlGcmVlSW1hZ2VfVW5sb2FkKGRpYjMyKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8vIE90aGVyIGNhc2VzOiBjb252ZXJ0IHRvIGEgc3RhbmRhcmQgYml0bWFwIChsaW5lYXIgc2NhbGluZykKKwkJCQlfZGlzcGxheV9kaWIgPSBGcmVlSW1hZ2VfQ29udmVydFRvU3RhbmRhcmRUeXBlKF9kaWIsIFRSVUUpOworCQkJfQorCQkJLy8gUmVtZW1iZXIgdG8gZGVsZXRlIF9kaXNwbGF5X2RpYgorCQkJX2JEZWxldGVNZSA9IFRSVUU7CisJCX0KKworCQlfYkhhc0NoYW5nZWQgPSBGQUxTRTsKKwl9CisKKwkvLyBEcmF3IHRoZSBkaWIKKwlTZXRTdHJldGNoQmx0TW9kZShoREMsIENPTE9ST05DT0xPUik7CQorCVN0cmV0Y2hESUJpdHMoaERDLCByY0Rlc3QubGVmdCwgcmNEZXN0LnRvcCwgCisJCXJjRGVzdC5yaWdodC1yY0Rlc3QubGVmdCwgcmNEZXN0LmJvdHRvbS1yY0Rlc3QudG9wLCAKKwkJMCwgMCwgRnJlZUltYWdlX0dldFdpZHRoKF9kaXNwbGF5X2RpYiksIEZyZWVJbWFnZV9HZXRIZWlnaHQoX2Rpc3BsYXlfZGliKSwKKwkJRnJlZUltYWdlX0dldEJpdHMoX2Rpc3BsYXlfZGliKSwgRnJlZUltYWdlX0dldEluZm8oX2Rpc3BsYXlfZGliKSwgRElCX1JHQl9DT0xPUlMsIFNSQ0NPUFkpOworCit9CisKK3ZvaWQgZmlwV2luSW1hZ2U6OnNldFRvbmVNYXBwaW5nT3BlcmF0b3IoRlJFRV9JTUFHRV9UTU8gdG1vLCBkb3VibGUgZmlyc3RfcGFyYW0sIGRvdWJsZSBzZWNvbmRfcGFyYW0sIGRvdWJsZSB0aGlyZF9wYXJhbSwgZG91YmxlIGZvdXJ0aF9wYXJhbSkgeworCS8vIGF2b2lkIGNvc3RseSBvcGVyYXRpb25zIGlmIHBvc3NpYmxlIC4uLgorCWlmKChfdG1vICE9IHRtbykgfHwgKF90bW9fcGFyYW1fMSAhPSBmaXJzdF9wYXJhbSkgfHwgKF90bW9fcGFyYW1fMiAhPSBzZWNvbmRfcGFyYW0pIHx8IChfdG1vX3BhcmFtXzMgIT0gdGhpcmRfcGFyYW0pIHx8IChfdG1vX3BhcmFtXzQgIT0gZm91cnRoX3BhcmFtKSkgeworCQlfdG1vID0gdG1vOworCQlfdG1vX3BhcmFtXzEgPSBmaXJzdF9wYXJhbTsKKwkJX3Rtb19wYXJhbV8yID0gc2Vjb25kX3BhcmFtOworCQlfdG1vX3BhcmFtXzMgPSB0aGlyZF9wYXJhbTsKKwkJX3Rtb19wYXJhbV80ID0gZm91cnRoX3BhcmFtOworCisJCUZSRUVfSU1BR0VfVFlQRSBpbWFnZV90eXBlID0gZ2V0SW1hZ2VUeXBlKCk7CisJCXN3aXRjaChpbWFnZV90eXBlKSB7CisJCQljYXNlIEZJVF9SR0JGOgorCQkJY2FzZSBGSVRfUkdCQUY6CisJCQljYXNlIEZJVF9SR0IxNjoKKwkJCWNhc2UgRklUX1JHQkExNjoKKwkJCQlfYkhhc0NoYW5nZWQgPSBUUlVFOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJfQorCX0KK30KKwordm9pZCBmaXBXaW5JbWFnZTo6Z2V0VG9uZU1hcHBpbmdPcGVyYXRvcihGUkVFX0lNQUdFX1RNTyAqdG1vLCBkb3VibGUgKmZpcnN0X3BhcmFtLCBkb3VibGUgKnNlY29uZF9wYXJhbSwgZG91YmxlICp0aGlyZF9wYXJhbSwgZG91YmxlICpmb3VydGhfcGFyYW0pIGNvbnN0IHsKKwkqdG1vID0gX3RtbzsKKwkqZmlyc3RfcGFyYW0gPSBfdG1vX3BhcmFtXzE7CisJKnNlY29uZF9wYXJhbSA9IF90bW9fcGFyYW1fMjsKKwkqdGhpcmRfcGFyYW0gPSBfdG1vX3BhcmFtXzM7CisJKmZvdXJ0aF9wYXJhbSA9IF90bW9fcGFyYW1fNDsKK30KKworCisjZW5kaWYgLy8gX1dJTjMyCg==